source: LMDZ6/trunk/libf/phylmd/cv3_buoy.f90

Last change on this file was 5766, checked in by rkazeroni, 5 weeks ago

For GPU porting of convection:

  • Add "horizontal" comment to specify possible names of horizontal variables
  • Change data statement initialization (not supported on GPU) to a parameter
  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.9 KB
Line 
1MODULE cv3_buoy_mod
2  PRIVATE
3
4  PUBLIC cv3_buoy
5
6CONTAINS
7
8SUBROUTINE cv3_buoy(nloc, ncum, nd, icb, inb, pbase, plcl, p, ph, ale, cin, &
9    tv, tvp, buoy)
10  ! **************************************************************
11  ! *
12  ! CV3_BUOY                                                    *
13  ! Buoyancy corrections to account for ALE             *
14  ! *
15  ! written by   : MOREAU Cecile, 07/08/2003, 15.55.48          *
16  ! modified by :                                               *
17  ! **************************************************************
18
19USE yomcst2_mod_h
20   USE lmdz_cv_ini, ONLY : grav,nl
21  IMPLICIT NONE
22
23
24  ! input:
25  INTEGER ncum, nd, nloc
26  INTEGER icb(nloc), inb(nloc)
27  REAL pbase(nloc), plcl(nloc)
28  REAL p(nloc, nd), ph(nloc, nd+1)
29  REAL ale(nloc), cin(nloc)
30  REAL tv(nloc, nd), tvp(nloc, nd)
31
32  ! output:
33  REAL buoy(nloc, nd)
34
35  ! local variables:
36  INTEGER il, k
37  INTEGER kmx(nloc)
38  REAL bll(nloc), bmx(nloc)
39  REAL gamma(nloc)
40  LOGICAL ok(nloc)
41
42  REAL dgamma
43  REAL buoymin
44  PARAMETER (dgamma=2.E-03) !dgamma gamma
45  PARAMETER (buoymin=2.)
46
47  LOGICAL, PARAMETER :: fixed_bll = .TRUE.
48
49  ! print *,' Ale+cin ',ale(1)+cin(1)
50  ! --------------------------------------------------------------
51  ! Recompute buoyancies
52  ! --------------------------------------------------------------
53  DO k = 1, nl
54    DO il = 1, ncum
55      buoy(il, k) = tvp(il, k) - tv(il, k)
56    END DO
57  END DO
58
59  ! -------------------------------------------------------------
60  ! -- Compute low level buoyancy ( function of Ale+Cin )
61  ! -------------------------------------------------------------
62  IF (fixed_bll) THEN
63
64    DO il = 1, ncum
65      bll(il) = 0.5
66    END DO
67  ELSE
68
69    DO il = 1, ncum
70      IF (ale(il)+cin(il)>0.) THEN
71        gamma(il) = 4.*buoy(il, icb(il))**2 + 8.*dgamma*(ale(il)+cin(il))*tv( &
72          il, icb(il))/grav
73        gamma(il) = max(gamma(il), 1.E-10)
74      END IF
75    END DO
76
77    DO il = 1, ncum
78      IF (ale(il)+cin(il)>0.) THEN
79        bll(il) = 4.*dgamma*(ale(il)+cin(il))*tv(il, icb(il))/ &
80          (grav*(abs(buoy(il,icb(il))+0.5*sqrt(gamma(il)))))
81      END IF
82    END DO
83
84    DO il = 1, ncum
85      IF (ale(il)+cin(il)>0.) THEN
86        bll(il) = min(bll(il), buoymin)
87      END IF
88    END DO
89
90  END IF !(fixed_bll)
91
92
93  ! -------------------------------------------------------------
94  ! --Get highest buoyancy among levels below LCL-200hPa
95  ! -------------------------------------------------------------
96
97  DO il = 1, ncum
98    bmx(il) = -1000.
99    kmx(il) = icb(il)
100    ok(il) = .TRUE.
101  END DO
102
103  DO k = 1, nl
104    DO il = 1, ncum
105      IF (ale(il)+cin(il)>0. .AND. ok(il)) THEN
106        IF (k>icb(il) .AND. k<=inb(il)) THEN
107          ! c         print *,'k,p(il,k),plcl(il)-200. ',
108          ! k,p(il,k),plcl(il)-200.
109          IF (p(il,k)>plcl(il)-200.) THEN
110            IF (buoy(il,k)>bmx(il)) THEN
111              bmx(il) = buoy(il, k)
112              kmx(il) = k
113              IF (bmx(il)>=bll(il)) ok(il) = .FALSE.
114            END IF
115          END IF
116        END IF
117      END IF
118    END DO
119  END DO
120
121  ! print *,' ==cv3_buoy== bll(1),bmx(1),icb(1),kmx(1) '
122  ! $       ,bll(1),bmx(1),icb(1),kmx(1)
123
124  ! -------------------------------------------------------------
125  ! --Calculate modified buoyancies
126  ! -------------------------------------------------------------
127
128  DO il = 1, ncum
129    IF (ale(il)+cin(il)>0.) THEN
130      bll(il) = min(bll(il), bmx(il))
131    END IF
132  END DO
133
134  DO k = 1, nl
135    DO il = 1, ncum
136      IF (ale(il)+cin(il)>0.) THEN
137        IF (k>=icb(il) .AND. k<=kmx(il)-1) THEN
138          buoy(il, k) = bll(il)
139        END IF
140      END IF
141    END DO
142  END DO
143
144!CR:Correction of buoy for what comes next
145!keep flag or to modify in all cases?
146  IF (iflag_mix_adiab.eq.1) THEN
147  DO k = 1, nl
148    DO il = 1, ncum
149       IF ((k>=kmx(il)) .AND. (k<=inb(il)) .AND. (buoy(il,k).lt.0.)) THEN
150          buoy(il,k)=buoy(il,k-1)
151       END IF
152    ENDDO
153  ENDDO
154  ENDIF
155
156  RETURN
157END SUBROUTINE cv3_buoy
158
159END MODULE cv3_buoy_mod
Note: See TracBrowser for help on using the repository browser.