source: LMDZ6/branches/Amaury_dev/libf/phylmd/tlift.F90 @ 5136

Last change on this file since 5136 was 5105, checked in by abarral, 2 months ago

Replace 1DUTILS.h by module lmdz_1dutils.f90
Replace 1DConv.h by module lmdz_old_1dconv.f90 (it's only used by old_* files)
Convert *.F to *.f90
Fix gradsdef.h formatting
Remove unnecessary "RETURN" at the end of functions/subroutines

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