source: LMDZ6/trunk/libf/phylmd/tlift.f90 @ 5274

Last change on this file since 5274 was 5274, checked in by abarral, 9 hours ago

Replace yomcst.h by existing module

  • 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: 6.7 KB
Line 
1
2! $Header$
3
4SUBROUTINE tlift(p, t, rr, rs, gz, plcl, icb, nk, tvp, tpk, clw, nd, nl, &
5    dtvpdt1, dtvpdq1)
6  USE yomcst_mod_h, ONLY: RPI, RCLUM, RHPLA, RKBOL, RNAVO                   &
7          , RDAY, REA, REPSM, RSIYEA, RSIDAY, ROMEGA                  &
8          , R_ecc, R_peri, R_incl                                      &
9          , RA, RG, R1SA                                         &
10          , RSIGMA                                                     &
11          , R, RMD, RMV, RD, RV, RCPD                    &
12          , RMO3, RMCO2, RMC, RMCH4, RMN2O, RMCFC11, RMCFC12        &
13          , RCPV, RCVD, RCVV, RKAPPA, RETV, eps_w                    &
14          , RCW, RCS                                                 &
15          , RLVTT, RLSTT, RLMLT, RTT, RATM                           &
16          , RESTT, RALPW, RBETW, RGAMW, RALPS, RBETS, RGAMS            &
17          , RALPD, RBETD, RGAMD
18  IMPLICIT NONE
19  ! Argument NK ajoute (jyg) = Niveau de depart de la
20  ! convection
21  INTEGER icb, nk, nd, nl
22  INTEGER,PARAMETER :: na=60
23  REAL gz(nd), tpk(nd), clw(nd), plcl
24  REAL t(nd), rr(nd), rs(nd), tvp(nd), p(nd)
25  REAL dtvpdt1(nd), dtvpdq1(nd) ! Derivatives of parcel virtual
26  ! temperature wrt T1 and Q1
27
28  REAL clw_new(na), qi(na)
29  REAL dtpdt1(na), dtpdq1(na) ! Derivatives of parcel temperature
30  ! wrt T1 and Q1
31  REAL gravity, cpd, cpv, cl, ci, cpvmcl, clmci, eps, alv0, alf0
32  REAL cpp, cpinv, ah0, alf, tg, s, ahg, tc, denom, alv, es, esi
33  REAL qsat_new, snew
34  INTEGER icbl, i, imin, j, icb1
35
36  LOGICAL ice_conv
37
38  ! ***   ASSIGN VALUES OF THERMODYNAMIC CONSTANTS     ***
39
40  ! sb        CPD=1005.7
41  ! sb      CPV=1870.0
42  ! sb        CL=4190.0
43  ! sb        CPVMCL=2320.0
44  ! sb        RV=461.5
45  ! sb        RD=287.04
46  ! sb        EPS=RD/RV
47  ! sb        ALV0=2.501E6
48  ! cccccccccccccccccccccc
49  ! constantes coherentes avec le modele du Centre Europeen
50  ! sb      RD = 1000.0 * 1.380658E-23 * 6.0221367E+23 / 28.9644
51  ! sb      RV = 1000.0 * 1.380658E-23 * 6.0221367E+23 / 18.0153
52  ! sb      CPD = 3.5 * RD
53  ! sb      CPV = 4.0 * RV
54  ! sb      CL = 4218.0
55  ! sb      CI=2090.0
56  ! sb      CPVMCL=CL-CPV
57  ! sb      CLMCI=CL-CI
58  ! sb      EPS=RD/RV
59  ! sb      ALV0=2.5008E+06
60  ! sb      ALF0=3.34E+05
61
62  ! ccccccccccc
63  ! on utilise les constantes thermo du Centre Europeen: (SB)
64
65  gravity = rg !sb: Pr que gravite ne devienne pas humidite!
66
67  cpd = rcpd
68  cpv = rcpv
69  cl = rcw
70  ci = rcs
71  cpvmcl = cl - cpv
72  clmci = cl - ci
73  eps = rd/rv
74  alv0 = rlvtt
75  alf0 = rlmlt ! (ALF0 = RLSTT-RLVTT)
76
77  ! ccccccccccccccccccccc
78
79  ! ***  CALCULATE CERTAIN PARCEL QUANTITIES, INCLUDING STATIC ENERGY   ***
80
81  icb1 = max(icb, 2)
82  icb1 = min(icb, nl)
83
84  ! jyg1
85  ! C      CPP=CPD*(1.-RR(1))+RR(1)*CPV
86  cpp = cpd*(1.-rr(nk)) + rr(nk)*cpv
87  ! jyg2
88  cpinv = 1./cpp
89  ! jyg1
90  ! ICB may be below condensation level
91  ! CC        DO 100 I=1,ICB1-1
92  ! CC         TPK(I)=T(1)-GZ(I)*CPINV
93  ! CC         TVP(I)=TPK(I)*(1.+RR(1)/EPS)
94  DO i = 1, icb1
95    clw(i) = 0.0
96  END DO
97
98  DO i = nk, icb1
99    tpk(i) = t(nk) - (gz(i)-gz(nk))*cpinv
100    ! jyg1
101    ! CC         TVP(I)=TPK(I)*(1.+RR(NK)/EPS)
102    tvp(i) = tpk(i)*(1.+rr(nk)/eps-rr(nk))
103    ! jyg2
104    dtvpdt1(i) = 1. + rr(nk)/eps - rr(nk)
105    dtvpdq1(i) = tpk(i)*(1./eps-1.)
106
107    ! jyg2
108
109  END DO
110
111
112  ! ***  FIND LIFTED PARCEL TEMPERATURE AND MIXING RATIO    ***
113
114  ! jyg1
115  ! C        AH0=(CPD*(1.-RR(1))+CL*RR(1))*T(1)
116  ! C     $     +RR(1)*(ALV0-CPVMCL*(T(1)-273.15))
117  ah0 = (cpd*(1.-rr(nk))+cl*rr(nk))*t(nk) + rr(nk)*(alv0-cpvmcl*(t(nk)-273.15 &
118    )) + gz(nk)
119  ! jyg2
120
121  ! jyg1
122  imin = icb1
123  ! If ICB is below LCL, start loop at ICB+1
124  IF (plcl<p(icb1)) imin = min(imin+1, nl)
125
126  ! CC        DO 300 I=ICB1,NL
127  DO i = imin, nl
128    ! jyg2
129    alv = alv0 - cpvmcl*(t(i)-273.15)
130    alf = alf0 + clmci*(t(i)-273.15)
131
132    rg = rs(i)
133    tg = t(i)
134    ! S=CPD+ALV*ALV*RG/(RV*T(I)*T(I))
135    ! jyg1
136    ! C        S=CPD*(1.-RR(1))+CL*RR(1)+ALV*ALV*RG/(RV*T(I)*T(I))
137    s = cpd*(1.-rr(nk)) + cl*rr(nk) + alv*alv*rg/(rv*t(i)*t(i))
138    ! jyg2
139    s = 1./s
140
141    DO j = 1, 2
142      ! jyg1
143      ! C         AHG=CPD*TG+(CL-CPD)*RR(1)*TG+ALV*RG+GZ(I)
144      ahg = cpd*tg + (cl-cpd)*rr(nk)*tg + alv*rg + gz(i)
145      ! jyg2
146      tg = tg + s*(ah0-ahg)
147      tc = tg - 273.15
148      denom = 243.5 + tc
149      denom = max(denom, 1.0)
150
151      ! FORMULE DE BOLTON POUR PSAT
152
153      es = 6.112*exp(17.67*tc/denom)
154      rg = eps*es/(p(i)-es*(1.-eps))
155
156
157    END DO
158
159    ! jyg1
160    ! C        TPK(I)=(AH0-GZ(I)-ALV*RG)/(CPD+(CL-CPD)*RR(1))
161    tpk(i) = (ah0-gz(i)-alv*rg)/(cpd+(cl-cpd)*rr(nk))
162    ! jyg2
163    ! TPK(I)=(AH0-GZ(I)-ALV*RG-(CL-CPD)*T(I)*RR(1))/CPD
164
165    ! jyg1
166    ! C        CLW(I)=RR(1)-RG
167    clw(i) = rr(nk) - rg
168    ! jyg2
169    clw(i) = max(0.0, clw(i))
170    ! jyg1
171    ! CC        TVP(I)=TPK(I)*(1.+RG/EPS)
172    tvp(i) = tpk(i)*(1.+rg/eps-rr(nk))
173    ! jyg2
174
175    ! jyg1       Derivatives
176
177    dtpdt1(i) = cpd*s
178    dtpdq1(i) = alv*s
179
180    dtvpdt1(i) = dtpdt1(i)*(1.+rg/eps-rr(nk)+alv*rg/(rd*tpk(i)))
181    dtvpdq1(i) = dtpdq1(i)*(1.+rg/eps-rr(nk)+alv*rg/(rd*tpk(i))) - tpk(i)
182
183    ! jyg2
184
185  END DO
186
187  ice_conv = .FALSE.
188
189  IF (ice_conv) THEN
190
191    ! JAM
192    ! RAJOUT DE LA PROCEDURE ICEFRAC
193
194    ! sb        CALL ICEFRAC(T,CLW,CLW_NEW,QI,ND,NL)
195
196    DO i = icb1, nl
197      IF (t(i)<263.15) THEN
198        tg = tpk(i)
199        tc = tpk(i) - 273.15
200        denom = 243.5 + tc
201        es = 6.112*exp(17.67*tc/denom)
202        alv = alv0 - cpvmcl*(t(i)-273.15)
203        alf = alf0 + clmci*(t(i)-273.15)
204
205        DO j = 1, 4
206          esi = exp(23.33086-(6111.72784/tpk(i))+0.15215*log(tpk(i)))
207          qsat_new = eps*esi/(p(i)-esi*(1.-eps))
208          ! CC        SNEW=
209          ! CPD*(1.-RR(1))+CL*RR(1)+ALV*ALV*QSAT_NEW/(RV*TPK(I)*TPK(I))
210          snew = cpd*(1.-rr(nk)) + cl*rr(nk) + alv*alv*qsat_new/(rv*tpk(i)* &
211            tpk(i))
212
213          snew = 1./snew
214          tpk(i) = tg + (alf*qi(i)+alv*rg*(1.-(esi/es)))*snew
215          ! @$$        PRINT*,'################################'
216          ! @$$        PRINT*,TPK(I)
217          ! @$$        PRINT*,(ALF*QI(I)+ALV*RG*(1.-(ESI/ES)))*SNEW
218        END DO
219        ! CC        CLW(I)=RR(1)-QSAT_NEW
220        clw(i) = rr(nk) - qsat_new
221        clw(i) = max(0.0, clw(i))
222        ! jyg1
223        ! CC        TVP(I)=TPK(I)*(1.+QSAT_NEW/EPS)
224        tvp(i) = tpk(i)*(1.+qsat_new/eps-rr(nk))
225        ! jyg2
226      ELSE
227        CONTINUE
228      END IF
229
230    END DO
231
232  END IF
233
234
235  ! *****************************************************
236  ! * BK :  RAJOUT DE LA TEMPERATURE DES ASCENDANCES
237  ! *   NON DILUES AU  NIVEAU KLEV = ND
238  ! *   POSONS LE ENVIRON EGAL A CELUI DE KLEV-1
239  ! *******************************************************
240
241  tpk(nl+1) = tpk(nl)
242
243  ! ******************************************************
244
245  rg = gravity ! RG redevient la gravite de YOMCST (sb)
246
247
248  RETURN
249END SUBROUTINE tlift
250
251
252
253
254
255
256
257
Note: See TracBrowser for help on using the repository browser.