GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: phylmd/cv3_buoy.F90 Lines: 35 49 71.4 %
Date: 2023-06-30 12:51:15 Branches: 42 66 63.6 %

Line Branch Exec Source
1
288
SUBROUTINE cv3_buoy(nloc, ncum, nd, icb, inb, pbase, plcl, p, ph, ale, cin, &
2
144
    tv, tvp, buoy)
3
  ! **************************************************************
4
  ! *
5
  ! CV3_BUOY                                                    *
6
  ! Buoyancy corrections to account for ALE             *
7
  ! *
8
  ! written by   : MOREAU Cecile, 07/08/2003, 15.55.48          *
9
  ! modified by :                                               *
10
  ! **************************************************************
11
12
  IMPLICIT NONE
13
14
  include "cvthermo.h"
15
  include "cv3param.h"
16
  include "YOMCST2.h"
17
18
  ! input:
19
  INTEGER ncum, nd, nloc
20
  INTEGER icb(nloc), inb(nloc)
21
  REAL pbase(nloc), plcl(nloc)
22
  REAL p(nloc, nd), ph(nloc, nd+1)
23
  REAL ale(nloc), cin(nloc)
24
  REAL tv(nloc, nd), tvp(nloc, nd)
25
26
  ! output:
27
  REAL buoy(nloc, nd)
28
29
  ! local variables:
30
  INTEGER il, k
31
288
  INTEGER kmx(nloc)
32
288
  REAL bll(nloc), bmx(nloc)
33
288
  REAL gamma(nloc)
34
288
  LOGICAL ok(nloc)
35
36
  REAL dgamma
37
  REAL buoymin
38
  PARAMETER (dgamma=2.E-03) !dgamma gamma
39
  PARAMETER (buoymin=2.)
40
41
  LOGICAL fixed_bll
42
  SAVE fixed_bll
43
  DATA fixed_bll/.TRUE./
44
  !$OMP THREADPRIVATE(fixed_bll)
45
46
47
  ! print *,' Ale+cin ',ale(1)+cin(1)
48
  ! --------------------------------------------------------------
49
  ! Recompute buoyancies
50
  ! --------------------------------------------------------------
51
4032
  DO k = 1, nl
52
1866114
    DO il = 1, ncum
53
1865970
      buoy(il, k) = tvp(il, k) - tv(il, k)
54
    END DO
55
  END DO
56
57
  ! -------------------------------------------------------------
58
  ! -- Compute low level buoyancy ( function of Ale+Cin )
59
  ! -------------------------------------------------------------
60
144
  IF (fixed_bll) THEN
61
62
69110
    DO il = 1, ncum
63
69110
      bll(il) = 0.5
64
    END DO
65
  ELSE
66
67
    DO il = 1, ncum
68
      IF (ale(il)+cin(il)>0.) THEN
69
        gamma(il) = 4.*buoy(il, icb(il))**2 + 8.*dgamma*(ale(il)+cin(il))*tv( &
70
          il, icb(il))/grav
71
        gamma(il) = max(gamma(il), 1.E-10)
72
      END IF
73
    END DO
74
75
    DO il = 1, ncum
76
      IF (ale(il)+cin(il)>0.) THEN
77
        bll(il) = 4.*dgamma*(ale(il)+cin(il))*tv(il, icb(il))/ &
78
          (grav*(abs(buoy(il,icb(il))+0.5*sqrt(gamma(il)))))
79
      END IF
80
    END DO
81
82
    DO il = 1, ncum
83
      IF (ale(il)+cin(il)>0.) THEN
84
        bll(il) = min(bll(il), buoymin)
85
      END IF
86
    END DO
87
88
  END IF !(fixed_bll)
89
90
91
  ! -------------------------------------------------------------
92
  ! --Get highest buoyancy among levels below LCL-200hPa
93
  ! -------------------------------------------------------------
94
95
69110
  DO il = 1, ncum
96
68966
    bmx(il) = -1000.
97
68966
    kmx(il) = icb(il)
98
69110
    ok(il) = .TRUE.
99
  END DO
100
101
4032
  DO k = 1, nl
102
1866114
    DO il = 1, ncum
103

1865970
      IF (ale(il)+cin(il)>0. .AND. ok(il)) THEN
104

131251
        IF (k>icb(il) .AND. k<=inb(il)) THEN
105
          ! c         print *,'k,p(il,k),plcl(il)-200. ',
106
          ! k,p(il,k),plcl(il)-200.
107
36900
          IF (p(il,k)>plcl(il)-200.) THEN
108
35397
            IF (buoy(il,k)>bmx(il)) THEN
109
34914
              bmx(il) = buoy(il, k)
110
34914
              kmx(il) = k
111
34914
              IF (bmx(il)>=bll(il)) ok(il) = .FALSE.
112
            END IF
113
          END IF
114
        END IF
115
      END IF
116
    END DO
117
  END DO
118
119
  ! print *,' ==cv3_buoy== bll(1),bmx(1),icb(1),kmx(1) '
120
  ! $       ,bll(1),bmx(1),icb(1),kmx(1)
121
122
  ! -------------------------------------------------------------
123
  ! --Calculate modified buoyancies
124
  ! -------------------------------------------------------------
125
126
69110
  DO il = 1, ncum
127
69110
    IF (ale(il)+cin(il)>0.) THEN
128
16542
      bll(il) = min(bll(il), bmx(il))
129
    END IF
130
  END DO
131
132
4032
  DO k = 1, nl
133
1866114
    DO il = 1, ncum
134
1865970
      IF (ale(il)+cin(il)>0.) THEN
135

446634
        IF (k>=icb(il) .AND. k<=kmx(il)-1) THEN
136
34974
          buoy(il, k) = bll(il)
137
        END IF
138
      END IF
139
    END DO
140
  END DO
141
142
!CR:Correction of buoy for what comes next
143
!keep flag or to modify in all cases?
144
144
  IF (iflag_mix_adiab.eq.1) THEN
145
  DO k = 1, nl
146
    DO il = 1, ncum
147
       IF ((k>=kmx(il)) .AND. (k<=inb(il)) .AND. (buoy(il,k).lt.0.)) THEN
148
          buoy(il,k)=buoy(il,k-1)
149
       END IF
150
    ENDDO
151
  ENDDO
152
  ENDIF
153
154
144
  RETURN
155
END SUBROUTINE cv3_buoy