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

Last change on this file since 5692 was 5692, checked in by yann meurdesoif, 3 weeks ago

Convection GPU porting : set convection subroutines into module

Files will be renamed later to *_mod.f90

YM

  • 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: 4.0 KB
RevLine 
[5692]1MODULE cv3_buoy_mod
2  PRIVATE
3
4  PUBLIC cv3_buoy
5
6CONTAINS
7
[1992]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  ! **************************************************************
[879]18
[5304]19USE yomcst2_mod_h
[5346]20   USE lmdz_cv_ini, ONLY : grav,nl
[1992]21  IMPLICIT NONE
[879]22
23
[1992]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)
[879]31
[1992]32  ! output:
33  REAL buoy(nloc, nd)
[1515]34
[1992]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)
[879]41
[1992]42  REAL dgamma
43  REAL buoymin
44  PARAMETER (dgamma=2.E-03) !dgamma gamma
45  PARAMETER (buoymin=2.)
[980]46
[1992]47  LOGICAL fixed_bll
48  SAVE fixed_bll
49  DATA fixed_bll/.TRUE./
50  !$OMP THREADPRIVATE(fixed_bll)
[980]51
[879]52
[1992]53  ! print *,' Ale+cin ',ale(1)+cin(1)
54  ! --------------------------------------------------------------
55  ! Recompute buoyancies
56  ! --------------------------------------------------------------
57  DO k = 1, nl
58    DO il = 1, ncum
59      buoy(il, k) = tvp(il, k) - tv(il, k)
60    END DO
61  END DO
[879]62
[1992]63  ! -------------------------------------------------------------
64  ! -- Compute low level buoyancy ( function of Ale+Cin )
65  ! -------------------------------------------------------------
66  IF (fixed_bll) THEN
[879]67
[1992]68    DO il = 1, ncum
69      bll(il) = 0.5
70    END DO
71  ELSE
[879]72
[1992]73    DO il = 1, ncum
74      IF (ale(il)+cin(il)>0.) THEN
75        gamma(il) = 4.*buoy(il, icb(il))**2 + 8.*dgamma*(ale(il)+cin(il))*tv( &
76          il, icb(il))/grav
77        gamma(il) = max(gamma(il), 1.E-10)
78      END IF
79    END DO
[879]80
[1992]81    DO il = 1, ncum
82      IF (ale(il)+cin(il)>0.) THEN
83        bll(il) = 4.*dgamma*(ale(il)+cin(il))*tv(il, icb(il))/ &
84          (grav*(abs(buoy(il,icb(il))+0.5*sqrt(gamma(il)))))
85      END IF
86    END DO
[980]87
[1992]88    DO il = 1, ncum
89      IF (ale(il)+cin(il)>0.) THEN
90        bll(il) = min(bll(il), buoymin)
91      END IF
92    END DO
[879]93
[1992]94  END IF !(fixed_bll)
[879]95
96
[1992]97  ! -------------------------------------------------------------
98  ! --Get highest buoyancy among levels below LCL-200hPa
99  ! -------------------------------------------------------------
[879]100
[1992]101  DO il = 1, ncum
102    bmx(il) = -1000.
103    kmx(il) = icb(il)
104    ok(il) = .TRUE.
105  END DO
[879]106
[1992]107  DO k = 1, nl
108    DO il = 1, ncum
109      IF (ale(il)+cin(il)>0. .AND. ok(il)) THEN
110        IF (k>icb(il) .AND. k<=inb(il)) THEN
111          ! c         print *,'k,p(il,k),plcl(il)-200. ',
112          ! k,p(il,k),plcl(il)-200.
113          IF (p(il,k)>plcl(il)-200.) THEN
114            IF (buoy(il,k)>bmx(il)) THEN
115              bmx(il) = buoy(il, k)
116              kmx(il) = k
117              IF (bmx(il)>=bll(il)) ok(il) = .FALSE.
118            END IF
119          END IF
120        END IF
121      END IF
122    END DO
123  END DO
[879]124
[1992]125  ! print *,' ==cv3_buoy== bll(1),bmx(1),icb(1),kmx(1) '
126  ! $       ,bll(1),bmx(1),icb(1),kmx(1)
[879]127
[1992]128  ! -------------------------------------------------------------
129  ! --Calculate modified buoyancies
130  ! -------------------------------------------------------------
[879]131
[1992]132  DO il = 1, ncum
133    IF (ale(il)+cin(il)>0.) THEN
134      bll(il) = min(bll(il), bmx(il))
135    END IF
136  END DO
[879]137
[1992]138  DO k = 1, nl
139    DO il = 1, ncum
140      IF (ale(il)+cin(il)>0.) THEN
141        IF (k>=icb(il) .AND. k<=kmx(il)-1) THEN
142          buoy(il, k) = bll(il)
143        END IF
144      END IF
145    END DO
146  END DO
147
[2420]148!CR:Correction of buoy for what comes next
149!keep flag or to modify in all cases?
150  IF (iflag_mix_adiab.eq.1) THEN
151  DO k = 1, nl
152    DO il = 1, ncum
153       IF ((k>=kmx(il)) .AND. (k<=inb(il)) .AND. (buoy(il,k).lt.0.)) THEN
154          buoy(il,k)=buoy(il,k-1)
155       END IF
156    ENDDO
157  ENDDO
158  ENDIF
[1992]159
160  RETURN
161END SUBROUTINE cv3_buoy
[5692]162
163END MODULE cv3_buoy_mod
Note: See TracBrowser for help on using the repository browser.