Directory: | ./ |
---|---|
File: | phys/thermcell_plume_6A.f90 |
Date: | 2022-01-11 19:19:34 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 165 | 361 | 45.7% |
Branches: | 182 | 396 | 46.0% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | ! | ||
2 | ! $Id: thermcell_plume_6A.F90 3451 2019-01-27 11:07:30Z fhourdin $ | ||
3 | ! | ||
4 | 3914853 | SUBROUTINE thermcell_plume_6A(itap,ngrid,klev,ptimestep,ztv,zthl,po,zl,rhobarz, & | |
5 | 480 | & zlev,pplev,pphi,zpspsk,alim_star,alim_star_tot, & | |
6 | 480 | & lalim,f0,detr_star,entr_star,f_star,csc,ztva, & | |
7 | 480 | & ztla,zqla,zqta,zha,zw2,w_est,ztva_est,zqsatth,lmix,lmix_bis,linter & | |
8 | & ,lev_out,lunout1,igout) | ||
9 | ! & ,lev_out,lunout1,igout,zbuoy,zbuoyjam) | ||
10 | !-------------------------------------------------------------------------- | ||
11 | !thermcell_plume: calcule les valeurs de qt, thetal et w dans l ascendance | ||
12 | !-------------------------------------------------------------------------- | ||
13 | USE IOIPSL, ONLY : getin | ||
14 | USE ioipsl_getin_p_mod, ONLY : getin_p | ||
15 | |||
16 | USE print_control_mod, ONLY: prt_level | ||
17 | IMPLICIT NONE | ||
18 | |||
19 | ! | ||
20 | ! $Header$ | ||
21 | ! | ||
22 | ! ATTENTION!!!!: ce fichier include est compatible format fixe/format libre | ||
23 | ! veillez � n'utiliser que des ! pour les commentaires | ||
24 | ! et � bien positionner les & des lignes de continuation | ||
25 | ! (les placer en colonne 6 et en colonne 73) | ||
26 | ! | ||
27 | ! | ||
28 | ! A1.0 Fundamental constants | ||
29 | REAL RPI,RCLUM,RHPLA,RKBOL,RNAVO | ||
30 | ! A1.1 Astronomical constants | ||
31 | REAL RDAY,REA,REPSM,RSIYEA,RSIDAY,ROMEGA | ||
32 | ! A1.1.bis Constantes concernant l'orbite de la Terre: | ||
33 | REAL R_ecc, R_peri, R_incl | ||
34 | ! A1.2 Geoide | ||
35 | REAL RA,RG,R1SA | ||
36 | ! A1.3 Radiation | ||
37 | ! REAL RSIGMA,RI0 | ||
38 | REAL RSIGMA | ||
39 | ! A1.4 Thermodynamic gas phase | ||
40 | REAL RMO3,RMCO2,RMC,RMCH4,RMN2O,RMCFC11,RMCFC12 | ||
41 | REAL R,RMD,RMV,RD,RV,RCPD,RCPV,RCVD,RCVV | ||
42 | REAL RKAPPA,RETV, eps_w | ||
43 | ! A1.5,6 Thermodynamic liquid,solid phases | ||
44 | REAL RCW,RCS | ||
45 | ! A1.7 Thermodynamic transition of phase | ||
46 | REAL RLVTT,RLSTT,RLMLT,RTT,RATM | ||
47 | ! A1.8 Curve of saturation | ||
48 | REAL RESTT,RALPW,RBETW,RGAMW,RALPS,RBETS,RGAMS | ||
49 | REAL RALPD,RBETD,RGAMD | ||
50 | ! | ||
51 | COMMON/YOMCST/RPI ,RCLUM ,RHPLA ,RKBOL ,RNAVO & | ||
52 | & ,RDAY ,REA ,REPSM ,RSIYEA,RSIDAY,ROMEGA & | ||
53 | & ,R_ecc, R_peri, R_incl & | ||
54 | & ,RA ,RG ,R1SA & | ||
55 | & ,RSIGMA & | ||
56 | & ,R ,RMD ,RMV ,RD ,RV ,RCPD & | ||
57 | & ,RMO3 ,RMCO2 ,RMC ,RMCH4 ,RMN2O ,RMCFC11 ,RMCFC12 & | ||
58 | & ,RCPV ,RCVD ,RCVV ,RKAPPA,RETV, eps_w & | ||
59 | & ,RCW ,RCS & | ||
60 | & ,RLVTT ,RLSTT ,RLMLT ,RTT ,RATM & | ||
61 | & ,RESTT ,RALPW ,RBETW ,RGAMW ,RALPS ,RBETS ,RGAMS & | ||
62 | & ,RALPD ,RBETD ,RGAMD | ||
63 | ! ------------------------------------------------------------------ | ||
64 | !$OMP THREADPRIVATE(/YOMCST/) | ||
65 | ! | ||
66 | ! $Id: YOETHF.h 2799 2017-02-24 18:50:33Z jyg $ | ||
67 | ! | ||
68 | ! ATTENTION!!!!: ce fichier include est compatible format fixe/format libre | ||
69 | ! veillez n'utiliser que des ! pour les commentaires | ||
70 | ! et bien positionner les & des lignes de continuation | ||
71 | ! (les placer en colonne 6 et en colonne 73) | ||
72 | ! | ||
73 | !* COMMON *YOETHF* DERIVED CONSTANTS SPECIFIC TO ECMWF THERMODYNAMICS | ||
74 | ! | ||
75 | ! *R__ES* *CONSTANTS USED FOR COMPUTATION OF SATURATION | ||
76 | ! MIXING RATIO OVER LIQUID WATER(*R_LES*) OR | ||
77 | ! ICE(*R_IES*). | ||
78 | ! *RVTMP2* *RVTMP2=RCPV/RCPD-1. | ||
79 | ! *RHOH2O* *DENSITY OF LIQUID WATER. (RATM/100.) | ||
80 | ! | ||
81 | REAL R2ES, R3LES, R3IES, R4LES, R4IES, R5LES, R5IES | ||
82 | REAL RVTMP2, RHOH2O | ||
83 | REAL R5ALVCP,R5ALSCP,RALVDCP,RALSDCP,RALFDCP,RTWAT,RTBER,RTBERCU | ||
84 | REAL RTICE,RTICECU,RTWAT_RTICE_R,RTWAT_RTICECU_R,RKOOP1,RKOOP2 | ||
85 | LOGICAL OK_BAD_ECMWF_THERMO ! If TRUE, then variables set by rrtm/suphec.F90 | ||
86 | ! If FALSE, then variables set by suphel.F90 | ||
87 | COMMON /YOETHF/R2ES, R3LES, R3IES, R4LES, R4IES, R5LES, R5IES, & | ||
88 | & RVTMP2, RHOH2O, & | ||
89 | & R5ALVCP,R5ALSCP,RALVDCP,RALSDCP, & | ||
90 | & RALFDCP,RTWAT,RTBER,RTBERCU, & | ||
91 | & RTICE,RTICECU,RTWAT_RTICE_R,RTWAT_RTICECU_R,RKOOP1,& | ||
92 | & RKOOP2, & | ||
93 | & OK_BAD_ECMWF_THERMO | ||
94 | |||
95 | !$OMP THREADPRIVATE(/YOETHF/) | ||
96 | ! | ||
97 | ! $Header$ | ||
98 | ! | ||
99 | ! | ||
100 | ! ATTENTION!!!!: ce fichier include est compatible format fixe/format libre | ||
101 | ! veillez n'utiliser que des ! pour les commentaires | ||
102 | ! et bien positionner les & des lignes de continuation | ||
103 | ! (les placer en colonne 6 et en colonne 73) | ||
104 | ! | ||
105 | ! ------------------------------------------------------------------ | ||
106 | ! This COMDECK includes the Thermodynamical functions for the cy39 | ||
107 | ! ECMWF Physics package. | ||
108 | ! Consistent with YOMCST Basic physics constants, assuming the | ||
109 | ! partial pressure of water vapour is given by a first order | ||
110 | ! Taylor expansion of Qs(T) w.r.t. to Temperature, using constants | ||
111 | ! in YOETHF | ||
112 | ! ------------------------------------------------------------------ | ||
113 | REAL PTARG, PDELARG, P5ARG, PQSARG, PCOARG | ||
114 | REAL FOEEW, FOEDE, qsats, qsatl, dqsats, dqsatl | ||
115 | LOGICAL thermcep | ||
116 | PARAMETER (thermcep=.TRUE.) | ||
117 | ! | ||
118 | FOEEW ( PTARG,PDELARG ) = EXP ( & | ||
119 | & (R3LES*(1.-PDELARG)+R3IES*PDELARG) * (PTARG-RTT) & | ||
120 | & / (PTARG-(R4LES*(1.-PDELARG)+R4IES*PDELARG)) ) | ||
121 | ! | ||
122 | FOEDE ( PTARG,PDELARG,P5ARG,PQSARG,PCOARG ) = PQSARG*PCOARG*P5ARG & | ||
123 | & / (PTARG-(R4LES*(1.-PDELARG)+R4IES*PDELARG))**2 | ||
124 | ! | ||
125 | qsats(ptarg) = 100.0 * 0.622 * 10.0 & | ||
126 | & ** (2.07023 - 0.00320991 * ptarg & | ||
127 | & - 2484.896 / ptarg + 3.56654 * LOG10(ptarg)) | ||
128 | qsatl(ptarg) = 100.0 * 0.622 * 10.0 & | ||
129 | & ** (23.8319 - 2948.964 / ptarg & | ||
130 | & - 5.028 * LOG10(ptarg) & | ||
131 | & - 29810.16 * EXP( - 0.0699382 * ptarg) & | ||
132 | & + 25.21935 * EXP( - 2999.924 / ptarg)) | ||
133 | ! | ||
134 | dqsats(ptarg,pqsarg) = RLVTT/RCPD*pqsarg * (3.56654/ptarg & | ||
135 | & +2484.896*LOG(10.)/ptarg**2 & | ||
136 | & -0.00320991*LOG(10.)) | ||
137 | dqsatl(ptarg,pqsarg) = RLVTT/RCPD*pqsarg*LOG(10.)* & | ||
138 | & (2948.964/ptarg**2-5.028/LOG(10.)/ptarg & | ||
139 | & +25.21935*2999.924/ptarg**2*EXP(-2999.924/ptarg) & | ||
140 | & +29810.16*0.0699382*EXP(-0.0699382*ptarg)) | ||
141 | integer :: iflag_thermals,nsplit_thermals | ||
142 | |||
143 | !!! nrlmd le 10/04/2012 | ||
144 | integer :: iflag_trig_bl,iflag_clos_bl | ||
145 | integer :: tau_trig_shallow,tau_trig_deep | ||
146 | real :: s_trig | ||
147 | !!! fin nrlmd le 10/04/2012 | ||
148 | |||
149 | real,parameter :: r_aspect_thermals=2.,l_mix_thermals=30. | ||
150 | real :: alp_bl_k | ||
151 | real :: tau_thermals,fact_thermals_ed_dz | ||
152 | integer,parameter :: w2di_thermals=0 | ||
153 | integer :: isplit | ||
154 | |||
155 | integer :: iflag_coupl,iflag_clos,iflag_wake | ||
156 | integer :: iflag_thermals_ed,iflag_thermals_optflux,iflag_thermals_closure | ||
157 | |||
158 | common/ctherm1/iflag_thermals,nsplit_thermals,iflag_thermals_closure | ||
159 | common/ctherm2/tau_thermals,alp_bl_k,fact_thermals_ed_dz | ||
160 | common/ctherm4/iflag_coupl,iflag_clos,iflag_wake | ||
161 | common/ctherm5/iflag_thermals_ed,iflag_thermals_optflux | ||
162 | |||
163 | !!! nrlmd le 10/04/2012 | ||
164 | common/ctherm6/iflag_trig_bl,iflag_clos_bl | ||
165 | common/ctherm7/tau_trig_shallow,tau_trig_deep | ||
166 | common/ctherm8/s_trig | ||
167 | !!! fin nrlmd le 10/04/2012 | ||
168 | |||
169 | !$OMP THREADPRIVATE(/ctherm1/,/ctherm2/,/ctherm4/,/ctherm5/) | ||
170 | !$OMP THREADPRIVATE(/ctherm6/,/ctherm7/,/ctherm8/) | ||
171 | |||
172 | INTEGER itap | ||
173 | INTEGER lunout1,igout | ||
174 | INTEGER ngrid,klev | ||
175 | REAL ptimestep | ||
176 | REAL ztv(ngrid,klev) | ||
177 | REAL zthl(ngrid,klev) | ||
178 | REAL po(ngrid,klev) | ||
179 | REAL zl(ngrid,klev) | ||
180 | REAL rhobarz(ngrid,klev) | ||
181 | REAL zlev(ngrid,klev+1) | ||
182 | REAL pplev(ngrid,klev+1) | ||
183 | REAL pphi(ngrid,klev) | ||
184 | REAL zpspsk(ngrid,klev) | ||
185 | REAL alim_star(ngrid,klev) | ||
186 | REAL f0(ngrid) | ||
187 | INTEGER lalim(ngrid) | ||
188 | integer lev_out ! niveau pour les print | ||
189 | integer nbpb | ||
190 | |||
191 | real alim_star_tot(ngrid) | ||
192 | |||
193 | REAL ztva(ngrid,klev) | ||
194 | REAL ztla(ngrid,klev) | ||
195 | REAL zqla(ngrid,klev) | ||
196 | REAL zqta(ngrid,klev) | ||
197 | REAL zha(ngrid,klev) | ||
198 | |||
199 | REAL detr_star(ngrid,klev) | ||
200 | REAL coefc | ||
201 | REAL entr_star(ngrid,klev) | ||
202 | 960 | REAL detr(ngrid,klev) | |
203 | 960 | REAL entr(ngrid,klev) | |
204 | |||
205 | REAL csc(ngrid,klev) | ||
206 | |||
207 | REAL zw2(ngrid,klev+1) | ||
208 | REAL w_est(ngrid,klev+1) | ||
209 | REAL f_star(ngrid,klev+1) | ||
210 | 960 | REAL wa_moy(ngrid,klev+1) | |
211 | |||
212 | REAL ztva_est(ngrid,klev) | ||
213 | 960 | REAL ztv_est(ngrid,klev) | |
214 | 960 | REAL zqla_est(ngrid,klev) | |
215 | REAL zqsatth(ngrid,klev) | ||
216 | 960 | REAL zta_est(ngrid,klev) | |
217 | 960 | REAL ztemp(ngrid),zqsat(ngrid) | |
218 | REAL zdw2,zdw2bis | ||
219 | REAL zw2modif | ||
220 | REAL zw2fact,zw2factbis | ||
221 | 960 | REAL zeps(ngrid,klev) | |
222 | |||
223 | REAL linter(ngrid) | ||
224 | INTEGER lmix(ngrid) | ||
225 | INTEGER lmix_bis(ngrid) | ||
226 | 960 | REAL wmaxa(ngrid) | |
227 | |||
228 | INTEGER ig,l,k,lt,it,lm | ||
229 | |||
230 | 960 | real zdz,zbuoy(ngrid,klev),zalpha,gamma(ngrid,klev),zdqt(ngrid,klev),zw2m | |
231 | 960 | real zbuoyjam(ngrid,klev),zdqtjam(ngrid,klev) | |
232 | real zbuoybis,zdz2,zdz3,lmel,entrbis,zdzbis | ||
233 | 960 | real d_temp(ngrid) | |
234 | real ztv1,ztv2,factinv,zinv,zlmel | ||
235 | real zlmelup,zlmeldwn,zlt,zltdwn,zltup | ||
236 | real atv1,atv2,btv1,btv2 | ||
237 | real ztv_est1,ztv_est2 | ||
238 | real zcor,zdelta,zcvm5,qlbef | ||
239 | real zbetalpha, coefzlmel | ||
240 | real eps | ||
241 | REAL REPS,RLvCp,DDT0 | ||
242 | PARAMETER (DDT0=.01) | ||
243 | logical Zsat | ||
244 | 960 | LOGICAL active(ngrid),activetmp(ngrid) | |
245 | REAL fact_gamma,fact_gamma2,fact_epsilon2 | ||
246 | |||
247 | REAL, SAVE :: fact_epsilon=0.002 | ||
248 | REAL, SAVE :: betalpha=0.9 | ||
249 | REAL, SAVE :: afact=2./3. | ||
250 | REAL, SAVE :: fact_shell=1. | ||
251 | REAL,SAVE :: detr_min=1.e-5 | ||
252 | REAL,SAVE :: entr_min=1.e-5 | ||
253 | REAL,SAVE :: detr_q_coef=0.012 | ||
254 | REAL,SAVE :: detr_q_power=0.5 | ||
255 | REAL,SAVE :: mix0=0. | ||
256 | INTEGER,SAVE :: thermals_flag_alim=0 | ||
257 | |||
258 | !$OMP THREADPRIVATE(fact_epsilon, betalpha, afact, fact_shell) | ||
259 | !$OMP THREADPRIVATE(detr_min, entr_min, detr_q_coef, detr_q_power) | ||
260 | !$OMP THREADPRIVATE( mix0, thermals_flag_alim) | ||
261 | |||
262 | LOGICAL, SAVE :: first=.true. | ||
263 | !$OMP THREADPRIVATE(first) | ||
264 | |||
265 | |||
266 | REAL c2(ngrid,klev) | ||
267 | |||
268 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 480 times.
|
480 | if (ngrid==1) print*,'THERMCELL PLUME MODIFIE 2014/07/11' |
269 | Zsat=.false. | ||
270 | ! Initialisation | ||
271 | |||
272 | 480 | RLvCp = RLVTT/RCPD | |
273 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 479 times.
|
480 | IF (first) THEN |
274 | |||
275 | 1 | CALL getin_p('thermals_fact_epsilon',fact_epsilon) | |
276 | 1 | CALL getin_p('thermals_betalpha',betalpha) | |
277 | 1 | CALL getin_p('thermals_afact',afact) | |
278 | 1 | CALL getin_p('thermals_fact_shell',fact_shell) | |
279 | 1 | CALL getin_p('thermals_detr_min',detr_min) | |
280 | 1 | CALL getin_p('thermals_entr_min',entr_min) | |
281 | 1 | CALL getin_p('thermals_detr_q_coef',detr_q_coef) | |
282 | 1 | CALL getin_p('thermals_detr_q_power',detr_q_power) | |
283 | 1 | CALL getin_p('thermals_mix0',mix0) | |
284 | 1 | CALL getin_p('thermals_flag_alim',thermals_flag_alim) | |
285 | |||
286 | |||
287 | 1 | first=.false. | |
288 | ENDIF | ||
289 | |||
290 | 480 | zbetalpha=betalpha/(1.+betalpha) | |
291 | |||
292 | |||
293 | ! Initialisations des variables r?elles | ||
294 | if (1==1) then | ||
295 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | ztva(:,:)=ztv(:,:) |
296 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | ztva_est(:,:)=ztva(:,:) |
297 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | ztv_est(:,:)=ztv(:,:) |
298 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | ztla(:,:)=zthl(:,:) |
299 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | zqta(:,:)=po(:,:) |
300 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | zqla(:,:)=0. |
301 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | zha(:,:) = ztva(:,:) |
302 | else | ||
303 | ztva(:,:)=0. | ||
304 | ztv_est(:,:)=0. | ||
305 | ztva_est(:,:)=0. | ||
306 | ztla(:,:)=0. | ||
307 | zqta(:,:)=0. | ||
308 | zha(:,:) =0. | ||
309 | endif | ||
310 | |||
311 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | zqla_est(:,:)=0. |
312 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | zqsatth(:,:)=0. |
313 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | zqla(:,:)=0. |
314 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | detr_star(:,:)=0. |
315 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | entr_star(:,:)=0. |
316 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | alim_star(:,:)=0. |
317 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | alim_star_tot(:)=0. |
318 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | csc(:,:)=0. |
319 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | detr(:,:)=0. |
320 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | entr(:,:)=0. |
321 |
4/4✓ Branch 0 taken 19200 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 19084800 times.
✓ Branch 3 taken 19200 times.
|
19104480 | zw2(:,:)=0. |
322 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | zbuoy(:,:)=0. |
323 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | zbuoyjam(:,:)=0. |
324 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | gamma(:,:)=0. |
325 |
4/4✓ Branch 0 taken 18720 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 18607680 times.
✓ Branch 3 taken 18720 times.
|
18626880 | zeps(:,:)=0. |
326 |
4/4✓ Branch 0 taken 19200 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 19084800 times.
✓ Branch 3 taken 19200 times.
|
19104480 | w_est(:,:)=0. |
327 |
4/4✓ Branch 0 taken 19200 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 19084800 times.
✓ Branch 3 taken 19200 times.
|
19104480 | f_star(:,:)=0. |
328 |
4/4✓ Branch 0 taken 19200 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 19084800 times.
✓ Branch 3 taken 19200 times.
|
19104480 | wa_moy(:,:)=0. |
329 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | linter(:)=1. |
330 | ! linter(:)=1. | ||
331 | ! Initialisation des variables entieres | ||
332 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | lmix(:)=1 |
333 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | lmix_bis(:)=2 |
334 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | wmaxa(:)=0. |
335 | |||
336 | |||
337 | !------------------------------------------------------------------------- | ||
338 | ! On ne considere comme actif que les colonnes dont les deux premieres | ||
339 | ! couches sont instables. | ||
340 | !------------------------------------------------------------------------- | ||
341 | |||
342 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | active(:)=ztv(:,1)>ztv(:,2) |
343 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | d_temp(:)=0. ! Pour activer un contraste de temperature a la base |
344 | ! du panache | ||
345 | ! Cet appel pourrait être fait avant thermcell_plume dans thermcell_main | ||
346 | 480 | CALL thermcell_alim(thermals_flag_alim,ngrid,klev,ztv,d_temp,zlev,alim_star,lalim) | |
347 | |||
348 | !------------------------------------------------------------------------------ | ||
349 | ! Calcul dans la premiere couche | ||
350 | ! On decide dans cette version que le thermique n'est actif que si la premiere | ||
351 | ! couche est instable. | ||
352 | ! Pourrait etre change si on veut que le thermiques puisse se d??clencher | ||
353 | ! dans une couche l>1 | ||
354 | !------------------------------------------------------------------------------ | ||
355 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | do ig=1,ngrid |
356 | ! Le panache va prendre au debut les caracteristiques de l'air contenu | ||
357 | ! dans cette couche. | ||
358 |
2/2✓ Branch 0 taken 248157 times.
✓ Branch 1 taken 228963 times.
|
477600 | if (active(ig)) then |
359 | 248157 | ztla(ig,1)=zthl(ig,1) | |
360 | 248157 | zqta(ig,1)=po(ig,1) | |
361 | 248157 | zqla(ig,1)=zl(ig,1) | |
362 | !cr: attention, prise en compte de f*(1)=1 | ||
363 | 248157 | f_star(ig,2)=alim_star(ig,1) | |
364 | zw2(ig,2)=2.*RG*(ztv(ig,1)-ztv(ig,2))/ztv(ig,2) & | ||
365 | & *(zlev(ig,2)-zlev(ig,1)) & | ||
366 | 248157 | & *0.4*pphi(ig,1)/(pphi(ig,2)-pphi(ig,1)) | |
367 | 248157 | w_est(ig,2)=zw2(ig,2) | |
368 | endif | ||
369 | enddo | ||
370 | ! | ||
371 | |||
372 | !============================================================================== | ||
373 | !boucle de calcul de la vitesse verticale dans le thermique | ||
374 | !============================================================================== | ||
375 |
2/2✓ Branch 0 taken 17760 times.
✓ Branch 1 taken 480 times.
|
18240 | do l=2,klev-1 |
376 | !============================================================================== | ||
377 | |||
378 | |||
379 | ! On decide si le thermique est encore actif ou non | ||
380 | ! AFaire : Il faut sans doute ajouter entr_star a alim_star dans ce test | ||
381 |
2/2✓ Branch 0 taken 17653440 times.
✓ Branch 1 taken 17760 times.
|
17671200 | do ig=1,ngrid |
382 | active(ig)=active(ig) & | ||
383 | & .and. zw2(ig,l)>1.e-10 & | ||
384 |
5/6✓ Branch 0 taken 1552788 times.
✓ Branch 1 taken 16100652 times.
✓ Branch 2 taken 1304631 times.
✓ Branch 3 taken 248157 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1304631 times.
|
34020009 | & .and. f_star(ig,l)+alim_star(ig,l)>1.e-10 |
385 | enddo | ||
386 | |||
387 | |||
388 | |||
389 | !--------------------------------------------------------------------------- | ||
390 | ! calcul des proprietes thermodynamiques et de la vitesse de la couche l | ||
391 | ! sans tenir compte du detrainement et de l'entrainement dans cette | ||
392 | ! couche | ||
393 | ! C'est a dire qu'on suppose | ||
394 | ! ztla(l)=ztla(l-1) et zqta(l)=zqta(l-1) | ||
395 | ! Ici encore, on doit pouvoir ajouter entr_star (qui peut etre calculer | ||
396 | ! avant) a l'alimentation pour avoir un calcul plus propre | ||
397 | !--------------------------------------------------------------------------- | ||
398 | |||
399 |
2/2✓ Branch 0 taken 17653440 times.
✓ Branch 1 taken 17760 times.
|
17671200 | ztemp(:)=zpspsk(:,l)*ztla(:,l-1) |
400 | 17760 | call thermcell_qsat(ngrid,active,pplev(:,l),ztemp,zqta(:,l-1),zqsat(:)) | |
401 |
2/2✓ Branch 0 taken 17653440 times.
✓ Branch 1 taken 17760 times.
|
17671200 | do ig=1,ngrid |
402 | ! print*,'active',active(ig),ig,l | ||
403 |
2/2✓ Branch 0 taken 1304631 times.
✓ Branch 1 taken 16348809 times.
|
17671200 | if(active(ig)) then |
404 | 1304631 | zqla_est(ig,l)=max(0.,zqta(ig,l-1)-zqsat(ig)) | |
405 | 1304631 | ztva_est(ig,l) = ztla(ig,l-1)*zpspsk(ig,l)+RLvCp*zqla_est(ig,l) | |
406 | 1304631 | zta_est(ig,l)=ztva_est(ig,l) | |
407 | 1304631 | ztva_est(ig,l) = ztva_est(ig,l)/zpspsk(ig,l) | |
408 | ztva_est(ig,l) = ztva_est(ig,l)*(1.+RETV*(zqta(ig,l-1) & | ||
409 | 1304631 | & -zqla_est(ig,l))-zqla_est(ig,l)) | |
410 | |||
411 | |||
412 | !Modif AJAM | ||
413 | |||
414 | 1304631 | zbuoy(ig,l)=RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) | |
415 | 1304631 | zdz=zlev(ig,l+1)-zlev(ig,l) | |
416 | 1304631 | lmel=fact_thermals_ed_dz*zlev(ig,l) | |
417 | ! lmel=0.09*zlev(ig,l) | ||
418 | 1304631 | zlmel=zlev(ig,l)+lmel | |
419 | 1304631 | zlmelup=zlmel+(zdz/2) | |
420 | 1304631 | zlmeldwn=zlmel-(zdz/2) | |
421 | |||
422 | lt=l+1 | ||
423 | zlt=zlev(ig,lt) | ||
424 | 1304631 | zdz3=zlev(ig,lt+1)-zlt | |
425 | 1304631 | zltdwn=zlt-zdz3/2 | |
426 | 1304631 | zltup=zlt+zdz3/2 | |
427 | |||
428 | !========================================================================= | ||
429 | ! 3. Calcul de la flotabilite modifie par melange avec l'air au dessus | ||
430 | !========================================================================= | ||
431 | |||
432 | !-------------------------------------------------- | ||
433 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1304631 times.
|
1304631 | if (iflag_thermals_ed.lt.8) then |
434 | !-------------------------------------------------- | ||
435 | !AJ052014: J'ai remplac?? la boucle do par un do while | ||
436 | ! afin de faire moins de calcul dans la boucle | ||
437 | !-------------------------------------------------- | ||
438 | ✗ | do while (zlmelup.gt.zltup) | |
439 | ✗ | lt=lt+1 | |
440 | ✗ | zlt=zlev(ig,lt) | |
441 | ✗ | zdz3=zlev(ig,lt+1)-zlt | |
442 | ✗ | zltdwn=zlt-zdz3/2 | |
443 | ✗ | zltup=zlt+zdz3/2 | |
444 | enddo | ||
445 | !-------------------------------------------------- | ||
446 | !AJ052014: Si iflag_thermals_ed<8 (par ex 6), alors | ||
447 | ! on cherche o?? se trouve l'altitude d'inversion | ||
448 | ! en calculant ztv1 (interpolation de la valeur de | ||
449 | ! theta au niveau lt en utilisant les niveaux lt-1 et | ||
450 | ! lt-2) et ztv2 (interpolation avec les niveaux lt+1 | ||
451 | ! et lt+2). Si theta r??ellement calcul??e au niveau lt | ||
452 | ! comprise entre ztv1 et ztv2, alors il y a inversion | ||
453 | ! et on calcule son altitude zinv en supposant que ztv(lt) | ||
454 | ! est une combinaison lineaire de ztv1 et ztv2. | ||
455 | ! Ensuite, on calcule la flottabilite en comparant | ||
456 | ! la temperature de la couche l a celle de l'air situe | ||
457 | ! l+lmel plus haut, ce qui necessite de savoir quel fraction | ||
458 | ! de cet air est au-dessus ou en-dessous de l'inversion | ||
459 | !-------------------------------------------------- | ||
460 | ✗ | atv1=(ztv(ig,lt-1)-ztv(ig,lt-2))/(zlev(ig,lt-1)-zlev(ig,lt-2)) | |
461 | btv1=(ztv(ig,lt-2)*zlev(ig,lt-1)-ztv(ig,lt-1)*zlev(ig,lt-2)) & | ||
462 | ✗ | & /(zlev(ig,lt-1)-zlev(ig,lt-2)) | |
463 | ✗ | atv2=(ztv(ig,lt+2)-ztv(ig,lt+1))/(zlev(ig,lt+2)-zlev(ig,lt+1)) | |
464 | btv2=(ztv(ig,lt+1)*zlev(ig,lt+2)-ztv(ig,lt+2)*zlev(ig,lt+1)) & | ||
465 | ✗ | & /(zlev(ig,lt+2)-zlev(ig,lt+1)) | |
466 | |||
467 | ✗ | ztv1=atv1*zlt+btv1 | |
468 | ✗ | ztv2=atv2*zlt+btv2 | |
469 | |||
470 | ✗ | if (ztv(ig,lt).gt.ztv1.and.ztv(ig,lt).lt.ztv2) then | |
471 | |||
472 | !-------------------------------------------------- | ||
473 | !AJ052014: D??calage de zinv qui est entre le haut | ||
474 | ! et le bas de la couche lt | ||
475 | !-------------------------------------------------- | ||
476 | ✗ | factinv=(ztv2-ztv(ig,lt))/(ztv2-ztv1) | |
477 | ✗ | zinv=zltdwn+zdz3*factinv | |
478 | |||
479 | |||
480 | ✗ | if (zlmeldwn.ge.zinv) then | |
481 | ✗ | ztv_est(ig,l)=atv2*zlmel+btv2 | |
482 | zbuoyjam(ig,l)=fact_shell*RG*(ztva_est(ig,l)-ztv_est(ig,l))/ztv_est(ig,l) & | ||
483 | ✗ | & +(1.-fact_shell)*zbuoy(ig,l) | |
484 | ✗ | elseif (zlmelup.ge.zinv) then | |
485 | ✗ | ztv_est2=atv2*0.5*(zlmelup+zinv)+btv2 | |
486 | ✗ | ztv_est1=atv1*0.5*(zinv+zlmeldwn)+btv1 | |
487 | ✗ | ztv_est(ig,l)=((zlmelup-zinv)/zdz)*ztv_est2+((zinv-zlmeldwn)/zdz)*ztv_est1 | |
488 | |||
489 | zbuoyjam(ig,l)=fact_shell*RG*(((zlmelup-zinv)/zdz)*(ztva_est(ig,l)- & | ||
490 | & ztv_est2)/ztv_est2+((zinv-zlmeldwn)/zdz)*(ztva_est(ig,l)- & | ||
491 | ✗ | & ztv_est1)/ztv_est1)+(1.-fact_shell)*zbuoy(ig,l) | |
492 | |||
493 | else | ||
494 | ✗ | ztv_est(ig,l)=atv1*zlmel+btv1 | |
495 | zbuoyjam(ig,l)=fact_shell*RG*(ztva_est(ig,l)-ztv_est(ig,l))/ztv_est(ig,l) & | ||
496 | ✗ | & +(1.-fact_shell)*zbuoy(ig,l) | |
497 | endif | ||
498 | |||
499 | else ! if (ztv(ig,lt).gt.ztv1.and.ztv(ig,lt).lt.ztv2) then | ||
500 | |||
501 | ✗ | if (zlmeldwn.gt.zltdwn) then | |
502 | zbuoyjam(ig,l)=fact_shell*RG*((ztva_est(ig,l)- & | ||
503 | ✗ | & ztv(ig,lt))/ztv(ig,lt))+(1.-fact_shell)*zbuoy(ig,l) | |
504 | else | ||
505 | zbuoyjam(ig,l)=fact_shell*RG*(((zlmelup-zltdwn)/zdz)*(ztva_est(ig,l)- & | ||
506 | & ztv(ig,lt))/ztv(ig,lt)+((zltdwn-zlmeldwn)/zdz)*(ztva_est(ig,l)- & | ||
507 | ✗ | & ztv(ig,lt-1))/ztv(ig,lt-1))+(1.-fact_shell)*zbuoy(ig,l) | |
508 | |||
509 | endif | ||
510 | |||
511 | ! zbuoyjam(ig,l)=fact_shell*RG*(((zlmelup-zltdwn)/zdz)*(ztva_est(ig,l)- & | ||
512 | ! & ztv1)/ztv1+((zltdwn-zlmeldwn)/zdz)*(ztva_est(ig,l)- & | ||
513 | ! & ztv(ig,lt-1))/ztv(ig,lt-1))+(1.-fact_shell)*zbuoy(ig,l) | ||
514 | ! zdqt(ig,l)=Max(0.,((lmel+zdz3-zdz2)/zdz3)*(zqta(ig,l-1)- & | ||
515 | ! & po(ig,lt))/po(ig,lt)+((zdz2-lmel)/zdz3)*(zqta(ig,l-1)- & | ||
516 | ! & po(ig,lt-1))/po(ig,lt-1)) | ||
517 | endif ! if (ztv(ig,lt).gt.ztv1.and.ztv(ig,lt).lt.ztv2) then | ||
518 | |||
519 | else ! if (iflag_thermals_ed.lt.8) then | ||
520 | lt=l+1 | ||
521 | zlt=zlev(ig,lt) | ||
522 | zdz2=zlev(ig,lt)-zlev(ig,l) | ||
523 | |||
524 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1304631 times.
|
1304631 | do while (lmel.gt.zdz2) |
525 | ✗ | lt=lt+1 | |
526 | ✗ | zlt=zlev(ig,lt) | |
527 | ✗ | zdz2=zlt-zlev(ig,l) | |
528 | enddo | ||
529 | 1304631 | zdz3=zlev(ig,lt+1)-zlt | |
530 | 1304631 | zltdwn=zlev(ig,lt)-zdz3/2 | |
531 | zlmelup=zlmel+(zdz/2) | ||
532 | 1304631 | coefzlmel=Min(1.,(zlmelup-zltdwn)/zdz) | |
533 | zbuoyjam(ig,l)=1.*RG*(coefzlmel*(ztva_est(ig,l)- & | ||
534 | & ztv(ig,lt))/ztv(ig,lt)+(1.-coefzlmel)*(ztva_est(ig,l)- & | ||
535 | 1304631 | & ztv(ig,lt-1))/ztv(ig,lt-1))+0.*zbuoy(ig,l) | |
536 | endif ! if (iflag_thermals_ed.lt.8) then | ||
537 | |||
538 | !------------------------------------------------ | ||
539 | !AJAM:nouveau calcul de w? | ||
540 | !------------------------------------------------ | ||
541 | zdz=zlev(ig,l+1)-zlev(ig,l) | ||
542 | zdzbis=zlev(ig,l)-zlev(ig,l-1) | ||
543 | zbuoy(ig,l)=RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) | ||
544 | |||
545 | 1304631 | zw2fact=fact_epsilon*2.*zdz/(1.+betalpha) | |
546 | zw2factbis=fact_epsilon*2.*zdzbis/(1.+betalpha) | ||
547 | 1304631 | zdw2=afact*zbuoy(ig,l)/fact_epsilon | |
548 | 1304631 | zdw2bis=afact*zbuoy(ig,l-1)/fact_epsilon | |
549 | ! zdw2bis=0.5*(zdw2+zdw2bis) | ||
550 | lm=Max(1,l-2) | ||
551 | ! zdw2=(afact/fact_epsilon)*((zdz/zdzbis)*zbuoy(ig,l) & | ||
552 | ! & +((zdzbis-zdz)/zdzbis)*zbuoy(ig,l-1)) | ||
553 | ! zdw2bis=(afact/fact_epsilon)*((zdz/zdzbis)*zbuoy(ig,l-1) & | ||
554 | ! & +((zdzbis-zdz)/zdzbis)*zbuoy(ig,l-1)) | ||
555 | ! w_est(ig,l+1)=Max(0.0001,exp(-zw2fact)*(w_est(ig,l)-zdw2)+zdw2) | ||
556 | ! w_est(ig,l+1)=(zdz/zdzbis)*Max(0.0001,exp(-zw2fact)* & | ||
557 | ! & (w_est(ig,l)-zdw2)+zdw2)+(zdzbis-zdz)/zdzbis* & | ||
558 | ! & Max(0.0001,exp(-zw2factbis)*(w_est(ig,l-1)-zdw2bis)+zdw2) | ||
559 | ! w_est(ig,l+1)=Max(0.0001,(1-exp(-zw2fact))*zdw2+w_est(ig,l)*exp(-zw2fact)) | ||
560 | |||
561 | !-------------------------------------------------- | ||
562 | !AJ052014: J'ai remplac? w_est(ig,l) par zw2(ig,l) | ||
563 | !-------------------------------------------------- | ||
564 |
1/2✓ Branch 0 taken 1304631 times.
✗ Branch 1 not taken.
|
1304631 | if (iflag_thermals_ed==8) then |
565 | ! Ancienne version | ||
566 | ! w_est(ig,l+1)=Max(0.0001,(zdz/zdzbis)*(exp(-zw2fact)* & | ||
567 | ! & (w_est(ig,l)-zdw2)+zdw2)+(zdzbis-zdz)/zdzbis* & | ||
568 | ! & (exp(-zw2factbis)*(w_est(ig,l-1)-zdw2bis)+zdw2)) | ||
569 | |||
570 | 1304631 | w_est(ig,l+1)=Max(0.0001,exp(-zw2fact)*(w_est(ig,l)-zdw2)+zdw2) | |
571 | |||
572 | ! Nouvelle version Arnaud | ||
573 | else | ||
574 | ! w_est(ig,l+1)=Max(0.0001,(zdz/zdzbis)*(exp(-zw2fact)* & | ||
575 | ! & (w_est(ig,l)-zdw2)+zdw2)+(zdzbis-zdz)/zdzbis* & | ||
576 | ! & (exp(-zw2factbis)*(w_est(ig,l-1)-zdw2bis)+zdw2)) | ||
577 | |||
578 | ✗ | w_est(ig,l+1)=Max(0.0001,exp(-zw2fact)*(w_est(ig,l)-zdw2bis)+zdw2) | |
579 | |||
580 | ! w_est(ig,l+1)=Max(0.0001,(zdz/(zdzbis+zdz))*(exp(-zw2fact)* & | ||
581 | ! & (w_est(ig,l)-zdw2bis)+zdw2)+(zdzbis/(zdzbis+zdz))* & | ||
582 | ! & (exp(-zw2factbis)*(w_est(ig,l-1)-zdw2bis)+zdw2bis)) | ||
583 | |||
584 | |||
585 | |||
586 | ! w_est(ig,l+1)=Max(0.0001,(w_est(ig,l)+zdw2bis*zw2fact)*exp(-zw2fact)) | ||
587 | |||
588 | ! w_est(ig,l+1)=Max(0.0001,(zdz/zdzbis)*(zw2(ig,l)+zdw2*zw2fact)*exp(-zw2fact)+ & | ||
589 | ! & (zdzbis-zdz)/zdzbis*(zw2(ig,l-1)+zdw2bis*zw2factbis)*exp(-zw2factbis)) | ||
590 | |||
591 | ! w_est(ig,l+1)=Max(0.0001,exp(-zw2factbis)*(w_est(ig,l-1)-zdw2bis)+zdw2) | ||
592 | |||
593 | endif | ||
594 | |||
595 | |||
596 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1304631 times.
|
1304631 | if (iflag_thermals_ed<6) then |
597 | ✗ | zalpha=f0(ig)*f_star(ig,l)/sqrt(w_est(ig,l+1))/rhobarz(ig,l) | |
598 | ! fact_epsilon=0.0005/(zalpha+0.025)**0.5 | ||
599 | ! fact_epsilon=Min(0.003,0.0004/(zalpha)**0.5) | ||
600 | ✗ | fact_epsilon=0.0002/(zalpha+0.1) | |
601 | ✗ | zw2fact=fact_epsilon*2.*zdz/(1.+betalpha) | |
602 | zw2factbis=fact_epsilon*2.*zdzbis/(1.+betalpha) | ||
603 | ✗ | zdw2=afact*zbuoy(ig,l)/fact_epsilon | |
604 | ✗ | zdw2bis=afact*zbuoy(ig,l-1)/fact_epsilon | |
605 | ! w_est(ig,l+1)=Max(0.0001,(zw2(ig,l)+zdw2*zw2fact)*exp(-zw2fact)) | ||
606 | |||
607 | ! w_est(ig,l+1)=Max(0.0001,(zdz/zdzbis)*(exp(-zw2fact)* & | ||
608 | ! & (zw2(ig,l)-zdw2)+zdw2)+(zdzbis-zdz)/zdzbis* & | ||
609 | ! & (exp(-zw2factbis)*(zw2(ig,l-1)-zdw2bis)+zdw2)) | ||
610 | |||
611 | ✗ | w_est(ig,l+1)=Max(0.0001,exp(-zw2fact)*(w_est(ig,l)-zdw2bis)+zdw2) | |
612 | |||
613 | |||
614 | endif | ||
615 | !-------------------------------------------------- | ||
616 | !AJ052014: J'ai comment? ce if plus n?cessaire puisqu' | ||
617 | !on fait max(0.0001,.....) | ||
618 | !-------------------------------------------------- | ||
619 | |||
620 | ! if (w_est(ig,l+1).lt.0.) then | ||
621 | ! w_est(ig,l+1)=zw2(ig,l) | ||
622 | ! w_est(ig,l+1)=0.0001 | ||
623 | ! endif | ||
624 | |||
625 | endif | ||
626 | enddo | ||
627 | |||
628 | |||
629 | !------------------------------------------------- | ||
630 | !calcul des taux d'entrainement et de detrainement | ||
631 | !------------------------------------------------- | ||
632 | |||
633 |
2/2✓ Branch 0 taken 17653440 times.
✓ Branch 1 taken 17760 times.
|
17671200 | do ig=1,ngrid |
634 |
2/2✓ Branch 0 taken 1304631 times.
✓ Branch 1 taken 16348809 times.
|
17671200 | if (active(ig)) then |
635 | |||
636 | ! zw2m=max(0.5*(w_est(ig,l)+w_est(ig,l+1)),0.1) | ||
637 | 1304631 | zw2m=w_est(ig,l+1) | |
638 | ! zw2m=zw2(ig,l) | ||
639 | 1304631 | zdz=zlev(ig,l+1)-zlev(ig,l) | |
640 | 1304631 | zbuoy(ig,l)=RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) | |
641 | ! zbuoybis=zbuoy(ig,l)+RG*0.1/300. | ||
642 | zbuoybis=zbuoy(ig,l) | ||
643 | 1304631 | zalpha=f0(ig)*f_star(ig,l)/sqrt(w_est(ig,l+1))/rhobarz(ig,l) | |
644 | 1304631 | zdqt(ig,l)=max(zqta(ig,l-1)-po(ig,l),0.)/po(ig,l) | |
645 | |||
646 | |||
647 | ! entr_star(ig,l)=f_star(ig,l)*zdz*zbetalpha*MAX(0., & | ||
648 | ! & afact*zbuoybis/zw2m - fact_epsilon ) | ||
649 | |||
650 | ! entr_star(ig,l)=MAX(0.,f_star(ig,l)*zdz*zbetalpha* & | ||
651 | ! & afact*zbuoybis/zw2m - fact_epsilon ) | ||
652 | |||
653 | |||
654 | |||
655 | ! zbuoyjam(ig,l)=RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) | ||
656 | |||
657 | !========================================================================= | ||
658 | ! 4. Calcul de l'entrainement et du detrainement | ||
659 | !========================================================================= | ||
660 | |||
661 | ! entr_star(ig,l)=f_star(ig,l)*zdz*zbetalpha*MAX(0., & | ||
662 | ! & afact*zbuoyjam(ig,l)/zw2m - fact_epsilon ) | ||
663 | ! entrbis=entr_star(ig,l) | ||
664 | |||
665 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1304631 times.
|
1304631 | if (iflag_thermals_ed.lt.6) then |
666 | ✗ | fact_epsilon=0.0002/(zalpha+0.1) | |
667 | endif | ||
668 | |||
669 | |||
670 | |||
671 | detr_star(ig,l)=f_star(ig,l)*zdz & | ||
672 | & *( mix0 * 0.1 / (zalpha+0.001) & | ||
673 | & + MAX(detr_min, -afact*zbetalpha*zbuoyjam(ig,l)/zw2m & | ||
674 | 1304631 | & + detr_q_coef*(zdqt(ig,l)/zw2m)**detr_q_power)) | |
675 | |||
676 | ! detr_star(ig,l)=(zdz/zdzbis)*detr_star(ig,l)+ & | ||
677 | ! & ((zdzbis-zdz)/zdzbis)*detr_star(ig,l-1) | ||
678 | |||
679 | zbuoy(ig,l)=RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) | ||
680 | |||
681 | entr_star(ig,l)=f_star(ig,l)*zdz* ( & | ||
682 | & mix0 * 0.1 / (zalpha+0.001) & | ||
683 | & + zbetalpha*MAX(entr_min, & | ||
684 | 1304631 | & afact*zbuoyjam(ig,l)/zw2m - fact_epsilon)) | |
685 | |||
686 | |||
687 | ! entr_star(ig,l)=f_star(ig,l)*zdz* ( & | ||
688 | ! & mix0 * 0.1 / (zalpha+0.001) & | ||
689 | ! & + MAX(entr_min, & | ||
690 | ! & zbetalpha*afact*zbuoyjam(ig,l)/zw2m - fact_epsilon + & | ||
691 | ! & detr_q_coef*(zdqt(ig,l)/zw2m)**detr_q_power)) | ||
692 | |||
693 | |||
694 | ! entr_star(ig,l)=(zdz/zdzbis)*entr_star(ig,l)+ & | ||
695 | ! & ((zdzbis-zdz)/zdzbis)*entr_star(ig,l-1) | ||
696 | |||
697 | ! entr_star(ig,l)=Max(0.,f_star(ig,l)*zdz*zbetalpha* & | ||
698 | ! & afact*zbuoy(ig,l)/zw2m & | ||
699 | ! & - 1.*fact_epsilon) | ||
700 | |||
701 | |||
702 | ! En dessous de lalim, on prend le max de alim_star et entr_star pour | ||
703 | ! alim_star et 0 sinon | ||
704 |
2/2✓ Branch 0 taken 359864 times.
✓ Branch 1 taken 944767 times.
|
1304631 | if (l.lt.lalim(ig)) then |
705 | 359864 | alim_star(ig,l)=max(alim_star(ig,l),entr_star(ig,l)) | |
706 | 359864 | entr_star(ig,l)=0. | |
707 | endif | ||
708 | ! if (l.lt.lalim(ig).and.alim_star(ig,l)>alim_star(ig,l-1)) then | ||
709 | ! alim_star(ig,l)=entrbis | ||
710 | ! endif | ||
711 | |||
712 | ! print*,'alim0',zlev(ig,l),entr_star(ig,l),detr_star(ig,l),zw2m,zbuoy(ig,l),f_star(ig,l) | ||
713 | ! Calcul du flux montant normalise | ||
714 | f_star(ig,l+1)=f_star(ig,l)+alim_star(ig,l)+entr_star(ig,l) & | ||
715 | 1304631 | & -detr_star(ig,l) | |
716 | |||
717 | endif | ||
718 | enddo | ||
719 | |||
720 | |||
721 | !============================================================================ | ||
722 | ! 5. calcul de la vitesse verticale en melangeant Tl et qt du thermique | ||
723 | !=========================================================================== | ||
724 | |||
725 |
6/6✓ Branch 0 taken 17653440 times.
✓ Branch 1 taken 17760 times.
✓ Branch 2 taken 1304631 times.
✓ Branch 3 taken 16348809 times.
✓ Branch 4 taken 248157 times.
✓ Branch 5 taken 1056474 times.
|
17671200 | activetmp(:)=active(:) .and. f_star(:,l+1)>1.e-10 |
726 |
2/2✓ Branch 0 taken 17653440 times.
✓ Branch 1 taken 17760 times.
|
17671200 | do ig=1,ngrid |
727 |
2/2✓ Branch 0 taken 1056474 times.
✓ Branch 1 taken 16596966 times.
|
17671200 | if (activetmp(ig)) then |
728 | Zsat=.false. | ||
729 | ztla(ig,l)=(f_star(ig,l)*ztla(ig,l-1)+ & | ||
730 | & (alim_star(ig,l)+entr_star(ig,l))*zthl(ig,l)) & | ||
731 | 1056474 | & /(f_star(ig,l+1)+detr_star(ig,l)) | |
732 | zqta(ig,l)=(f_star(ig,l)*zqta(ig,l-1)+ & | ||
733 | & (alim_star(ig,l)+entr_star(ig,l))*po(ig,l)) & | ||
734 | 1056474 | & /(f_star(ig,l+1)+detr_star(ig,l)) | |
735 | |||
736 | endif | ||
737 | enddo | ||
738 | |||
739 |
2/2✓ Branch 0 taken 17653440 times.
✓ Branch 1 taken 17760 times.
|
17671200 | ztemp(:)=zpspsk(:,l)*ztla(:,l) |
740 | 17760 | call thermcell_qsat(ngrid,activetmp,pplev(:,l),ztemp,zqta(:,l),zqsatth(:,l)) | |
741 |
2/2✓ Branch 0 taken 17653440 times.
✓ Branch 1 taken 17760 times.
|
17671200 | do ig=1,ngrid |
742 |
2/2✓ Branch 0 taken 1056474 times.
✓ Branch 1 taken 16596966 times.
|
17671200 | if (activetmp(ig)) then |
743 | ! on ecrit de maniere conservative (sat ou non) | ||
744 | ! T = Tl +Lv/Cp ql | ||
745 | 1056474 | zqla(ig,l)=max(0.,zqta(ig,l)-zqsatth(ig,l)) | |
746 | 1056474 | ztva(ig,l) = ztla(ig,l)*zpspsk(ig,l)+RLvCp*zqla(ig,l) | |
747 | 1056474 | ztva(ig,l) = ztva(ig,l)/zpspsk(ig,l) | |
748 | !on rajoute le calcul de zha pour diagnostiques (temp potentielle) | ||
749 | 1056474 | zha(ig,l) = ztva(ig,l) | |
750 | ztva(ig,l) = ztva(ig,l)*(1.+RETV*(zqta(ig,l) & | ||
751 | 1056474 | & -zqla(ig,l))-zqla(ig,l)) | |
752 | 1056474 | zbuoy(ig,l)=RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l) | |
753 | 1056474 | zdz=zlev(ig,l+1)-zlev(ig,l) | |
754 | 1056474 | zdzbis=zlev(ig,l)-zlev(ig,l-1) | |
755 | 1056474 | zeps(ig,l)=(entr_star(ig,l)+alim_star(ig,l))/(f_star(ig,l)*zdz) | |
756 | !!!!!!! fact_epsilon=0.002 | ||
757 | 1056474 | zw2fact=fact_epsilon*2.*zdz/(1.+betalpha) | |
758 | zw2factbis=fact_epsilon*2.*zdzbis/(1.+betalpha) | ||
759 | 1056474 | zdw2= afact*zbuoy(ig,l)/(fact_epsilon) | |
760 | 1056474 | zdw2bis= afact*zbuoy(ig,l-1)/(fact_epsilon) | |
761 | ! zdw2=(afact/fact_epsilon)*((zdz/zdzbis)*zbuoy(ig,l) & | ||
762 | ! & +((zdzbis-zdz)/zdzbis)*zbuoy(ig,l-1)) | ||
763 | ! lm=Max(1,l-2) | ||
764 | ! zdw2bis=(afact/fact_epsilon)*((zdz/zdzbis)*zbuoy(ig,l-1) & | ||
765 | ! & +((zdzbis-zdz)/zdzbis)*zbuoy(ig,l-1)) | ||
766 | ! zw2(ig,l+1)=Max(0.0001,exp(-zw2fact)*(zw2(ig,l)-zdw2bis)+zdw2) | ||
767 | ! zw2(ig,l+1)=Max(0.0001,(zdz/zdzbis)*(zw2(ig,l)+zdw2*zw2fact)*exp(-zw2fact)+ & | ||
768 | ! & (zdzbis-zdz)/zdzbis*(zw2(ig,l-1)+zdw2bis*zw2factbis)*exp(-zw2factbis)) | ||
769 | ! zw2(ig,l+1)=Max(0.0001,(zw2(ig,l)+zdw2*zw2fact)*exp(-zw2fact)) | ||
770 | ! zw2(ig,l+1)=Max(0.0001,(zdz/zdzbis)*(exp(-zw2fact)* & | ||
771 | ! & (zw2(ig,l)-zdw2)+zdw2)+(zdzbis-zdz)/zdzbis* & | ||
772 | ! & (exp(-zw2factbis)*(zw2(ig,l-1)-zdw2bis)+zdw2)) | ||
773 |
1/2✓ Branch 0 taken 1056474 times.
✗ Branch 1 not taken.
|
1056474 | if (iflag_thermals_ed==8) then |
774 | 1056474 | zw2(ig,l+1)=Max(0.0001,exp(-zw2fact)*(zw2(ig,l)-zdw2)+zdw2) | |
775 | else | ||
776 | ✗ | zw2(ig,l+1)=Max(0.0001,exp(-zw2fact)*(zw2(ig,l)-zdw2bis)+zdw2) | |
777 | endif | ||
778 | ! zw2(ig,l+1)=Max(0.0001,(zdz/(zdz+zdzbis))*(exp(-zw2fact)* & | ||
779 | ! & (zw2(ig,l)-zdw2)+zdw2bis)+(zdzbis/(zdz+zdzbis))* & | ||
780 | ! & (exp(-zw2factbis)*(zw2(ig,l-1)-zdw2bis)+zdw2bis)) | ||
781 | |||
782 | |||
783 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1056474 times.
|
1056474 | if (iflag_thermals_ed.lt.6) then |
784 | ✗ | zalpha=f0(ig)*f_star(ig,l)/sqrt(zw2(ig,l+1))/rhobarz(ig,l) | |
785 | ! fact_epsilon=0.0005/(zalpha+0.025)**0.5 | ||
786 | ! fact_epsilon=Min(0.003,0.0004/(zalpha)**0.5) | ||
787 | ✗ | fact_epsilon=0.0002/(zalpha+0.1)**1 | |
788 | ✗ | zw2fact=fact_epsilon*2.*zdz/(1.+betalpha) | |
789 | zw2factbis=fact_epsilon*2.*zdzbis/(1.+betalpha) | ||
790 | ✗ | zdw2= afact*zbuoy(ig,l)/(fact_epsilon) | |
791 | ✗ | zdw2bis= afact*zbuoy(ig,l-1)/(fact_epsilon) | |
792 | |||
793 | ! zw2(ig,l+1)=Max(0.0001,(zdz/zdzbis)*(exp(-zw2fact)* & | ||
794 | ! & (zw2(ig,l)-zdw2)+zdw2)+(zdzbis-zdz)/zdzbis* & | ||
795 | ! & (exp(-zw2factbis)*(zw2(ig,l-1)-zdw2bis)+zdw2)) | ||
796 | ! zw2(ig,l+1)=Max(0.0001,(zw2(ig,l)+zdw2*zw2fact)*exp(-zw2fact)) | ||
797 | ✗ | zw2(ig,l+1)=Max(0.0001,exp(-zw2fact)*(zw2(ig,l)-zdw2bis)+zdw2) | |
798 | |||
799 | endif | ||
800 | |||
801 | |||
802 | endif | ||
803 | enddo | ||
804 | |||
805 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 17760 times.
|
17760 | if (prt_level.ge.20) print*,'coucou calcul detr 460: ig, l',ig, l |
806 | ! | ||
807 | !=========================================================================== | ||
808 | ! 6. initialisations pour le calcul de la hauteur du thermique, de l'inversion et de la vitesse verticale max | ||
809 | !=========================================================================== | ||
810 | |||
811 | 17760 | nbpb=0 | |
812 |
2/2✓ Branch 0 taken 17653440 times.
✓ Branch 1 taken 17760 times.
|
17671200 | do ig=1,ngrid |
813 |
3/4✓ Branch 0 taken 1056474 times.
✓ Branch 1 taken 16596966 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1056474 times.
|
17653440 | if (zw2(ig,l+1)>0. .and. zw2(ig,l+1).lt.1.e-10) then |
814 | ! stop'On tombe sur le cas particulier de thermcell_dry' | ||
815 | ! print*,'On tombe sur le cas particulier de thermcell_plume' | ||
816 | ✗ | nbpb=nbpb+1 | |
817 | ✗ | zw2(ig,l+1)=0. | |
818 | ✗ | linter(ig)=l+1 | |
819 | endif | ||
820 | |||
821 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 17653440 times.
|
17653440 | if (zw2(ig,l+1).lt.0.) then |
822 | linter(ig)=(l*(zw2(ig,l+1)-zw2(ig,l)) & | ||
823 | ✗ | & -zw2(ig,l))/(zw2(ig,l+1)-zw2(ig,l)) | |
824 | ✗ | zw2(ig,l+1)=0. | |
825 | !+CR:04/05/12:correction calcul linter pour calcul de zmax continu | ||
826 |
2/2✓ Branch 0 taken 248157 times.
✓ Branch 1 taken 17405283 times.
|
17653440 | elseif (f_star(ig,l+1).lt.0.) then |
827 | linter(ig)=(l*(f_star(ig,l+1)-f_star(ig,l)) & | ||
828 | 248157 | & -f_star(ig,l))/(f_star(ig,l+1)-f_star(ig,l)) | |
829 | 248157 | zw2(ig,l+1)=0. | |
830 | !fin CR:04/05/12 | ||
831 | endif | ||
832 | |||
833 | 17653440 | wa_moy(ig,l+1)=sqrt(zw2(ig,l+1)) | |
834 | |||
835 |
2/2✓ Branch 0 taken 1030476 times.
✓ Branch 1 taken 16622964 times.
|
17671200 | if (wa_moy(ig,l+1).gt.wmaxa(ig)) then |
836 | ! lmix est le niveau de la couche ou w (wa_moy) est maximum | ||
837 | !on rajoute le calcul de lmix_bis | ||
838 |
2/2✓ Branch 0 taken 655258 times.
✓ Branch 1 taken 375218 times.
|
1030476 | if (zqla(ig,l).lt.1.e-10) then |
839 | 655258 | lmix_bis(ig)=l+1 | |
840 | endif | ||
841 | 1030476 | lmix(ig)=l+1 | |
842 | 1030476 | wmaxa(ig)=wa_moy(ig,l+1) | |
843 | endif | ||
844 | enddo | ||
845 | |||
846 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 17760 times.
|
18240 | if (nbpb>0) then |
847 | ✗ | print*,'WARNING on tombe ',nbpb,' x sur un pb pour l=',l,' dans thermcell_plume' | |
848 | endif | ||
849 | |||
850 | !========================================================================= | ||
851 | ! FIN DE LA BOUCLE VERTICALE | ||
852 | enddo | ||
853 | !========================================================================= | ||
854 | |||
855 | !on recalcule alim_star_tot | ||
856 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | do ig=1,ngrid |
857 | 477600 | alim_star_tot(ig)=0. | |
858 | enddo | ||
859 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | do ig=1,ngrid |
860 |
2/2✓ Branch 0 taken 609661 times.
✓ Branch 1 taken 477120 times.
|
1087261 | do l=1,lalim(ig)-1 |
861 | 1086781 | alim_star_tot(ig)=alim_star_tot(ig)+alim_star(ig,l) | |
862 | enddo | ||
863 | enddo | ||
864 | |||
865 | |||
866 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 480 times.
|
480 | if (prt_level.ge.20) print*,'coucou calcul detr 470: ig, l', ig, l |
867 | |||
868 | |||
869 | |||
870 | 480 | return | |
871 | end | ||
872 | |||
873 | |||
874 | |||
875 | |||
876 | |||
877 | |||
878 | |||
879 | |||
880 | |||
881 | |||
882 | |||
883 | |||
884 | |||
885 | |||
886 | |||
887 | |||
888 | |||
889 | |||
890 | |||
891 | |||
892 | |||
893 | |||
894 | |||
895 | |||
896 | |||
897 | |||
898 | |||
899 | |||
900 | |||
901 | |||
902 | |||
903 | |||
904 | |||
905 | |||
906 | |||
907 | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
908 | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
909 | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
910 | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
911 | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
912 | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
913 | ✗ | SUBROUTINE thermcell_plume_5B(itap,ngrid,klev,ptimestep,ztv,zthl,po,zl,rhobarz, & | |
914 | ✗ | & zlev,pplev,pphi,zpspsk,alim_star,alim_star_tot, & | |
915 | ✗ | & lalim,f0,detr_star,entr_star,f_star,csc,ztva, & | |
916 | ✗ | & ztla,zqla,zqta,zha,zw2,w_est,ztva_est,zqsatth,lmix,lmix_bis,linter & | |
917 | & ,lev_out,lunout1,igout) | ||
918 | !& ,lev_out,lunout1,igout,zbuoy,zbuoyjam) | ||
919 | |||
920 | !-------------------------------------------------------------------------- | ||
921 | !thermcell_plume: calcule les valeurs de qt, thetal et w dans l ascendance | ||
922 | ! Version conforme a l'article de Rio et al. 2010. | ||
923 | ! Code ecrit par Catherine Rio, Arnaud Jam et Frederic Hourdin | ||
924 | !-------------------------------------------------------------------------- | ||
925 | |||
926 | USE print_control_mod, ONLY: prt_level | ||
927 | IMPLICIT NONE | ||
928 | |||
929 | ! | ||
930 | ! $Header$ | ||
931 | ! | ||
932 | ! ATTENTION!!!!: ce fichier include est compatible format fixe/format libre | ||
933 | ! veillez � n'utiliser que des ! pour les commentaires | ||
934 | ! et � bien positionner les & des lignes de continuation | ||
935 | ! (les placer en colonne 6 et en colonne 73) | ||
936 | ! | ||
937 | ! | ||
938 | ! A1.0 Fundamental constants | ||
939 | REAL RPI,RCLUM,RHPLA,RKBOL,RNAVO | ||
940 | ! A1.1 Astronomical constants | ||
941 | REAL RDAY,REA,REPSM,RSIYEA,RSIDAY,ROMEGA | ||
942 | ! A1.1.bis Constantes concernant l'orbite de la Terre: | ||
943 | REAL R_ecc, R_peri, R_incl | ||
944 | ! A1.2 Geoide | ||
945 | REAL RA,RG,R1SA | ||
946 | ! A1.3 Radiation | ||
947 | ! REAL RSIGMA,RI0 | ||
948 | REAL RSIGMA | ||
949 | ! A1.4 Thermodynamic gas phase | ||
950 | REAL RMO3,RMCO2,RMC,RMCH4,RMN2O,RMCFC11,RMCFC12 | ||
951 | REAL R,RMD,RMV,RD,RV,RCPD,RCPV,RCVD,RCVV | ||
952 | REAL RKAPPA,RETV, eps_w | ||
953 | ! A1.5,6 Thermodynamic liquid,solid phases | ||
954 | REAL RCW,RCS | ||
955 | ! A1.7 Thermodynamic transition of phase | ||
956 | REAL RLVTT,RLSTT,RLMLT,RTT,RATM | ||
957 | ! A1.8 Curve of saturation | ||
958 | REAL RESTT,RALPW,RBETW,RGAMW,RALPS,RBETS,RGAMS | ||
959 | REAL RALPD,RBETD,RGAMD | ||
960 | ! | ||
961 | COMMON/YOMCST/RPI ,RCLUM ,RHPLA ,RKBOL ,RNAVO & | ||
962 | & ,RDAY ,REA ,REPSM ,RSIYEA,RSIDAY,ROMEGA & | ||
963 | & ,R_ecc, R_peri, R_incl & | ||
964 | & ,RA ,RG ,R1SA & | ||
965 | & ,RSIGMA & | ||
966 | & ,R ,RMD ,RMV ,RD ,RV ,RCPD & | ||
967 | & ,RMO3 ,RMCO2 ,RMC ,RMCH4 ,RMN2O ,RMCFC11 ,RMCFC12 & | ||
968 | & ,RCPV ,RCVD ,RCVV ,RKAPPA,RETV, eps_w & | ||
969 | & ,RCW ,RCS & | ||
970 | & ,RLVTT ,RLSTT ,RLMLT ,RTT ,RATM & | ||
971 | & ,RESTT ,RALPW ,RBETW ,RGAMW ,RALPS ,RBETS ,RGAMS & | ||
972 | & ,RALPD ,RBETD ,RGAMD | ||
973 | ! ------------------------------------------------------------------ | ||
974 | !$OMP THREADPRIVATE(/YOMCST/) | ||
975 | ! | ||
976 | ! $Id: YOETHF.h 2799 2017-02-24 18:50:33Z jyg $ | ||
977 | ! | ||
978 | ! ATTENTION!!!!: ce fichier include est compatible format fixe/format libre | ||
979 | ! veillez n'utiliser que des ! pour les commentaires | ||
980 | ! et bien positionner les & des lignes de continuation | ||
981 | ! (les placer en colonne 6 et en colonne 73) | ||
982 | ! | ||
983 | !* COMMON *YOETHF* DERIVED CONSTANTS SPECIFIC TO ECMWF THERMODYNAMICS | ||
984 | ! | ||
985 | ! *R__ES* *CONSTANTS USED FOR COMPUTATION OF SATURATION | ||
986 | ! MIXING RATIO OVER LIQUID WATER(*R_LES*) OR | ||
987 | ! ICE(*R_IES*). | ||
988 | ! *RVTMP2* *RVTMP2=RCPV/RCPD-1. | ||
989 | ! *RHOH2O* *DENSITY OF LIQUID WATER. (RATM/100.) | ||
990 | ! | ||
991 | REAL R2ES, R3LES, R3IES, R4LES, R4IES, R5LES, R5IES | ||
992 | REAL RVTMP2, RHOH2O | ||
993 | REAL R5ALVCP,R5ALSCP,RALVDCP,RALSDCP,RALFDCP,RTWAT,RTBER,RTBERCU | ||
994 | REAL RTICE,RTICECU,RTWAT_RTICE_R,RTWAT_RTICECU_R,RKOOP1,RKOOP2 | ||
995 | LOGICAL OK_BAD_ECMWF_THERMO ! If TRUE, then variables set by rrtm/suphec.F90 | ||
996 | ! If FALSE, then variables set by suphel.F90 | ||
997 | COMMON /YOETHF/R2ES, R3LES, R3IES, R4LES, R4IES, R5LES, R5IES, & | ||
998 | & RVTMP2, RHOH2O, & | ||
999 | & R5ALVCP,R5ALSCP,RALVDCP,RALSDCP, & | ||
1000 | & RALFDCP,RTWAT,RTBER,RTBERCU, & | ||
1001 | & RTICE,RTICECU,RTWAT_RTICE_R,RTWAT_RTICECU_R,RKOOP1,& | ||
1002 | & RKOOP2, & | ||
1003 | & OK_BAD_ECMWF_THERMO | ||
1004 | |||
1005 | !$OMP THREADPRIVATE(/YOETHF/) | ||
1006 | ! | ||
1007 | ! $Header$ | ||
1008 | ! | ||
1009 | ! | ||
1010 | ! ATTENTION!!!!: ce fichier include est compatible format fixe/format libre | ||
1011 | ! veillez n'utiliser que des ! pour les commentaires | ||
1012 | ! et bien positionner les & des lignes de continuation | ||
1013 | ! (les placer en colonne 6 et en colonne 73) | ||
1014 | ! | ||
1015 | ! ------------------------------------------------------------------ | ||
1016 | ! This COMDECK includes the Thermodynamical functions for the cy39 | ||
1017 | ! ECMWF Physics package. | ||
1018 | ! Consistent with YOMCST Basic physics constants, assuming the | ||
1019 | ! partial pressure of water vapour is given by a first order | ||
1020 | ! Taylor expansion of Qs(T) w.r.t. to Temperature, using constants | ||
1021 | ! in YOETHF | ||
1022 | ! ------------------------------------------------------------------ | ||
1023 | REAL PTARG, PDELARG, P5ARG, PQSARG, PCOARG | ||
1024 | REAL FOEEW, FOEDE, qsats, qsatl, dqsats, dqsatl | ||
1025 | LOGICAL thermcep | ||
1026 | PARAMETER (thermcep=.TRUE.) | ||
1027 | ! | ||
1028 | FOEEW ( PTARG,PDELARG ) = EXP ( & | ||
1029 | & (R3LES*(1.-PDELARG)+R3IES*PDELARG) * (PTARG-RTT) & | ||
1030 | & / (PTARG-(R4LES*(1.-PDELARG)+R4IES*PDELARG)) ) | ||
1031 | ! | ||
1032 | FOEDE ( PTARG,PDELARG,P5ARG,PQSARG,PCOARG ) = PQSARG*PCOARG*P5ARG & | ||
1033 | & / (PTARG-(R4LES*(1.-PDELARG)+R4IES*PDELARG))**2 | ||
1034 | ! | ||
1035 | qsats(ptarg) = 100.0 * 0.622 * 10.0 & | ||
1036 | & ** (2.07023 - 0.00320991 * ptarg & | ||
1037 | & - 2484.896 / ptarg + 3.56654 * LOG10(ptarg)) | ||
1038 | qsatl(ptarg) = 100.0 * 0.622 * 10.0 & | ||
1039 | & ** (23.8319 - 2948.964 / ptarg & | ||
1040 | & - 5.028 * LOG10(ptarg) & | ||
1041 | & - 29810.16 * EXP( - 0.0699382 * ptarg) & | ||
1042 | & + 25.21935 * EXP( - 2999.924 / ptarg)) | ||
1043 | ! | ||
1044 | dqsats(ptarg,pqsarg) = RLVTT/RCPD*pqsarg * (3.56654/ptarg & | ||
1045 | & +2484.896*LOG(10.)/ptarg**2 & | ||
1046 | & -0.00320991*LOG(10.)) | ||
1047 | dqsatl(ptarg,pqsarg) = RLVTT/RCPD*pqsarg*LOG(10.)* & | ||
1048 | & (2948.964/ptarg**2-5.028/LOG(10.)/ptarg & | ||
1049 | & +25.21935*2999.924/ptarg**2*EXP(-2999.924/ptarg) & | ||
1050 | & +29810.16*0.0699382*EXP(-0.0699382*ptarg)) | ||
1051 | integer :: iflag_thermals,nsplit_thermals | ||
1052 | |||
1053 | !!! nrlmd le 10/04/2012 | ||
1054 | integer :: iflag_trig_bl,iflag_clos_bl | ||
1055 | integer :: tau_trig_shallow,tau_trig_deep | ||
1056 | real :: s_trig | ||
1057 | !!! fin nrlmd le 10/04/2012 | ||
1058 | |||
1059 | real,parameter :: r_aspect_thermals=2.,l_mix_thermals=30. | ||
1060 | real :: alp_bl_k | ||
1061 | real :: tau_thermals,fact_thermals_ed_dz | ||
1062 | integer,parameter :: w2di_thermals=0 | ||
1063 | integer :: isplit | ||
1064 | |||
1065 | integer :: iflag_coupl,iflag_clos,iflag_wake | ||
1066 | integer :: iflag_thermals_ed,iflag_thermals_optflux,iflag_thermals_closure | ||
1067 | |||
1068 | common/ctherm1/iflag_thermals,nsplit_thermals,iflag_thermals_closure | ||
1069 | common/ctherm2/tau_thermals,alp_bl_k,fact_thermals_ed_dz | ||
1070 | common/ctherm4/iflag_coupl,iflag_clos,iflag_wake | ||
1071 | common/ctherm5/iflag_thermals_ed,iflag_thermals_optflux | ||
1072 | |||
1073 | !!! nrlmd le 10/04/2012 | ||
1074 | common/ctherm6/iflag_trig_bl,iflag_clos_bl | ||
1075 | common/ctherm7/tau_trig_shallow,tau_trig_deep | ||
1076 | common/ctherm8/s_trig | ||
1077 | !!! fin nrlmd le 10/04/2012 | ||
1078 | |||
1079 | !$OMP THREADPRIVATE(/ctherm1/,/ctherm2/,/ctherm4/,/ctherm5/) | ||
1080 | !$OMP THREADPRIVATE(/ctherm6/,/ctherm7/,/ctherm8/) | ||
1081 | |||
1082 | INTEGER itap | ||
1083 | INTEGER lunout1,igout | ||
1084 | INTEGER ngrid,klev | ||
1085 | REAL ptimestep | ||
1086 | REAL ztv(ngrid,klev) | ||
1087 | REAL zthl(ngrid,klev) | ||
1088 | REAL po(ngrid,klev) | ||
1089 | REAL zl(ngrid,klev) | ||
1090 | REAL rhobarz(ngrid,klev) | ||
1091 | REAL zlev(ngrid,klev+1) | ||
1092 | REAL pplev(ngrid,klev+1) | ||
1093 | REAL pphi(ngrid,klev) | ||
1094 | REAL zpspsk(ngrid,klev) | ||
1095 | REAL alim_star(ngrid,klev) | ||
1096 | REAL f0(ngrid) | ||
1097 | INTEGER lalim(ngrid) | ||
1098 | integer lev_out ! niveau pour les print | ||
1099 | integer nbpb | ||
1100 | |||
1101 | real alim_star_tot(ngrid) | ||
1102 | |||
1103 | REAL ztva(ngrid,klev) | ||
1104 | REAL ztla(ngrid,klev) | ||
1105 | REAL zqla(ngrid,klev) | ||
1106 | REAL zqta(ngrid,klev) | ||
1107 | REAL zha(ngrid,klev) | ||
1108 | |||
1109 | REAL detr_star(ngrid,klev) | ||
1110 | REAL coefc | ||
1111 | REAL entr_star(ngrid,klev) | ||
1112 | ✗ | REAL detr(ngrid,klev) | |
1113 | ✗ | REAL entr(ngrid,klev) | |
1114 | |||
1115 | REAL csc(ngrid,klev) | ||
1116 | |||
1117 | REAL zw2(ngrid,klev+1) | ||
1118 | REAL w_est(ngrid,klev+1) | ||
1119 | REAL f_star(ngrid,klev+1) | ||
1120 | ✗ | REAL wa_moy(ngrid,klev+1) | |
1121 | |||
1122 | REAL ztva_est(ngrid,klev) | ||
1123 | ✗ | REAL zqla_est(ngrid,klev) | |
1124 | REAL zqsatth(ngrid,klev) | ||
1125 | ✗ | REAL zta_est(ngrid,klev) | |
1126 | ✗ | REAL zbuoyjam(ngrid,klev) | |
1127 | ✗ | REAL ztemp(ngrid),zqsat(ngrid) | |
1128 | REAL zdw2 | ||
1129 | REAL zw2modif | ||
1130 | REAL zw2fact | ||
1131 | ✗ | REAL zeps(ngrid,klev) | |
1132 | |||
1133 | REAL linter(ngrid) | ||
1134 | INTEGER lmix(ngrid) | ||
1135 | INTEGER lmix_bis(ngrid) | ||
1136 | ✗ | REAL wmaxa(ngrid) | |
1137 | |||
1138 | INTEGER ig,l,k | ||
1139 | |||
1140 | ✗ | real zdz,zbuoy(ngrid,klev),zalpha,gamma(ngrid,klev),zdqt(ngrid,klev),zw2m | |
1141 | real zbuoybis | ||
1142 | real zcor,zdelta,zcvm5,qlbef,zdz2 | ||
1143 | real betalpha,zbetalpha | ||
1144 | real eps, afact | ||
1145 | REAL REPS,RLvCp,DDT0 | ||
1146 | PARAMETER (DDT0=.01) | ||
1147 | logical Zsat | ||
1148 | ✗ | LOGICAL active(ngrid),activetmp(ngrid) | |
1149 | REAL fact_gamma,fact_epsilon,fact_gamma2,fact_epsilon2 | ||
1150 | REAL c2(ngrid,klev) | ||
1151 | Zsat=.false. | ||
1152 | ! Initialisation | ||
1153 | |||
1154 | ✗ | RLvCp = RLVTT/RCPD | |
1155 | fact_epsilon=0.002 | ||
1156 | betalpha=0.9 | ||
1157 | afact=2./3. | ||
1158 | |||
1159 | zbetalpha=betalpha/(1.+betalpha) | ||
1160 | |||
1161 | |||
1162 | ! Initialisations des variables reeles | ||
1163 | if (1==1) then | ||
1164 | ✗ | ztva(:,:)=ztv(:,:) | |
1165 | ✗ | ztva_est(:,:)=ztva(:,:) | |
1166 | ✗ | ztla(:,:)=zthl(:,:) | |
1167 | ✗ | zqta(:,:)=po(:,:) | |
1168 | ✗ | zha(:,:) = ztva(:,:) | |
1169 | else | ||
1170 | ztva(:,:)=0. | ||
1171 | ztva_est(:,:)=0. | ||
1172 | ztla(:,:)=0. | ||
1173 | zqta(:,:)=0. | ||
1174 | zha(:,:) =0. | ||
1175 | endif | ||
1176 | |||
1177 | ✗ | zqla_est(:,:)=0. | |
1178 | ✗ | zqsatth(:,:)=0. | |
1179 | ✗ | zqla(:,:)=0. | |
1180 | ✗ | detr_star(:,:)=0. | |
1181 | ✗ | entr_star(:,:)=0. | |
1182 | ✗ | alim_star(:,:)=0. | |
1183 | ✗ | alim_star_tot(:)=0. | |
1184 | ✗ | csc(:,:)=0. | |
1185 | ✗ | detr(:,:)=0. | |
1186 | ✗ | entr(:,:)=0. | |
1187 | ✗ | zw2(:,:)=0. | |
1188 | ✗ | zbuoy(:,:)=0. | |
1189 | ✗ | zbuoyjam(:,:)=0. | |
1190 | ✗ | gamma(:,:)=0. | |
1191 | ✗ | zeps(:,:)=0. | |
1192 | ✗ | w_est(:,:)=0. | |
1193 | ✗ | f_star(:,:)=0. | |
1194 | ✗ | wa_moy(:,:)=0. | |
1195 | ✗ | linter(:)=1. | |
1196 | ! linter(:)=1. | ||
1197 | ! Initialisation des variables entieres | ||
1198 | ✗ | lmix(:)=1 | |
1199 | ✗ | lmix_bis(:)=2 | |
1200 | ✗ | wmaxa(:)=0. | |
1201 | ✗ | lalim(:)=1 | |
1202 | |||
1203 | |||
1204 | !------------------------------------------------------------------------- | ||
1205 | ! On ne considere comme actif que les colonnes dont les deux premieres | ||
1206 | ! couches sont instables. | ||
1207 | !------------------------------------------------------------------------- | ||
1208 | ✗ | active(:)=ztv(:,1)>ztv(:,2) | |
1209 | |||
1210 | !------------------------------------------------------------------------- | ||
1211 | ! Definition de l'alimentation a l'origine dans thermcell_init | ||
1212 | !------------------------------------------------------------------------- | ||
1213 | ✗ | do l=1,klev-1 | |
1214 | ✗ | do ig=1,ngrid | |
1215 | ✗ | if (ztv(ig,l)> ztv(ig,l+1) .and. ztv(ig,1)>=ztv(ig,l) ) then | |
1216 | alim_star(ig,l)=MAX((ztv(ig,l)-ztv(ig,l+1)),0.) & | ||
1217 | ✗ | & *sqrt(zlev(ig,l+1)) | |
1218 | ✗ | lalim(ig)=l+1 | |
1219 | ✗ | alim_star_tot(ig)=alim_star_tot(ig)+alim_star(ig,l) | |
1220 | endif | ||
1221 | enddo | ||
1222 | enddo | ||
1223 | ✗ | do l=1,klev | |
1224 | ✗ | do ig=1,ngrid | |
1225 | ✗ | if (alim_star_tot(ig) > 1.e-10 ) then | |
1226 | ✗ | alim_star(ig,l)=alim_star(ig,l)/alim_star_tot(ig) | |
1227 | endif | ||
1228 | enddo | ||
1229 | enddo | ||
1230 | ✗ | alim_star_tot(:)=1. | |
1231 | |||
1232 | |||
1233 | |||
1234 | !------------------------------------------------------------------------------ | ||
1235 | ! Calcul dans la premiere couche | ||
1236 | ! On decide dans cette version que le thermique n'est actif que si la premiere | ||
1237 | ! couche est instable. | ||
1238 | ! Pourrait etre change si on veut que le thermiques puisse se d??clencher | ||
1239 | ! dans une couche l>1 | ||
1240 | !------------------------------------------------------------------------------ | ||
1241 | ✗ | do ig=1,ngrid | |
1242 | ! Le panache va prendre au debut les caracteristiques de l'air contenu | ||
1243 | ! dans cette couche. | ||
1244 | ✗ | if (active(ig)) then | |
1245 | ✗ | ztla(ig,1)=zthl(ig,1) | |
1246 | ✗ | zqta(ig,1)=po(ig,1) | |
1247 | ✗ | zqla(ig,1)=zl(ig,1) | |
1248 | !cr: attention, prise en compte de f*(1)=1 | ||
1249 | ✗ | f_star(ig,2)=alim_star(ig,1) | |
1250 | zw2(ig,2)=2.*RG*(ztv(ig,1)-ztv(ig,2))/ztv(ig,2) & | ||
1251 | & *(zlev(ig,2)-zlev(ig,1)) & | ||
1252 | ✗ | & *0.4*pphi(ig,1)/(pphi(ig,2)-pphi(ig,1)) | |
1253 | ✗ | w_est(ig,2)=zw2(ig,2) | |
1254 | endif | ||
1255 | enddo | ||
1256 | ! | ||
1257 | |||
1258 | !============================================================================== | ||
1259 | !boucle de calcul de la vitesse verticale dans le thermique | ||
1260 | !============================================================================== | ||
1261 | ✗ | do l=2,klev-1 | |
1262 | !============================================================================== | ||
1263 | |||
1264 | |||
1265 | ! On decide si le thermique est encore actif ou non | ||
1266 | ! AFaire : Il faut sans doute ajouter entr_star a alim_star dans ce test | ||
1267 | ✗ | do ig=1,ngrid | |
1268 | active(ig)=active(ig) & | ||
1269 | & .and. zw2(ig,l)>1.e-10 & | ||
1270 | ✗ | & .and. f_star(ig,l)+alim_star(ig,l)>1.e-10 | |
1271 | enddo | ||
1272 | |||
1273 | |||
1274 | |||
1275 | !--------------------------------------------------------------------------- | ||
1276 | ! calcul des proprietes thermodynamiques et de la vitesse de la couche l | ||
1277 | ! sans tenir compte du detrainement et de l'entrainement dans cette | ||
1278 | ! couche | ||
1279 | ! C'est a dire qu'on suppose | ||
1280 | ! ztla(l)=ztla(l-1) et zqta(l)=zqta(l-1) | ||
1281 | ! Ici encore, on doit pouvoir ajouter entr_star (qui peut etre calculer | ||
1282 | ! avant) a l'alimentation pour avoir un calcul plus propre | ||
1283 | !--------------------------------------------------------------------------- | ||
1284 | |||
1285 | ✗ | ztemp(:)=zpspsk(:,l)*ztla(:,l-1) | |
1286 | ✗ | call thermcell_qsat(ngrid,active,pplev(:,l),ztemp,zqta(:,l-1),zqsat(:)) | |
1287 | |||
1288 | ✗ | do ig=1,ngrid | |
1289 | ! print*,'active',active(ig),ig,l | ||
1290 | ✗ | if(active(ig)) then | |
1291 | ✗ | zqla_est(ig,l)=max(0.,zqta(ig,l-1)-zqsat(ig)) | |
1292 | ✗ | ztva_est(ig,l) = ztla(ig,l-1)*zpspsk(ig,l)+RLvCp*zqla_est(ig,l) | |
1293 | ✗ | zta_est(ig,l)=ztva_est(ig,l) | |
1294 | ✗ | ztva_est(ig,l) = ztva_est(ig,l)/zpspsk(ig,l) | |
1295 | ztva_est(ig,l) = ztva_est(ig,l)*(1.+RETV*(zqta(ig,l-1) & | ||
1296 | ✗ | & -zqla_est(ig,l))-zqla_est(ig,l)) | |
1297 | |||
1298 | !------------------------------------------------ | ||
1299 | !AJAM:nouveau calcul de w? | ||
1300 | !------------------------------------------------ | ||
1301 | ✗ | zdz=zlev(ig,l+1)-zlev(ig,l) | |
1302 | ✗ | zbuoy(ig,l)=RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) | |
1303 | |||
1304 | ✗ | zw2fact=fact_epsilon*2.*zdz/(1.+betalpha) | |
1305 | ✗ | zdw2=(afact)*zbuoy(ig,l)/(fact_epsilon) | |
1306 | ✗ | w_est(ig,l+1)=Max(0.0001,exp(-zw2fact)*(w_est(ig,l)-zdw2)+zdw2) | |
1307 | |||
1308 | |||
1309 | ✗ | if (w_est(ig,l+1).lt.0.) then | |
1310 | ✗ | w_est(ig,l+1)=zw2(ig,l) | |
1311 | endif | ||
1312 | endif | ||
1313 | enddo | ||
1314 | |||
1315 | |||
1316 | !------------------------------------------------- | ||
1317 | !calcul des taux d'entrainement et de detrainement | ||
1318 | !------------------------------------------------- | ||
1319 | |||
1320 | ✗ | do ig=1,ngrid | |
1321 | ✗ | if (active(ig)) then | |
1322 | |||
1323 | ✗ | zw2m=max(0.5*(w_est(ig,l)+w_est(ig,l+1)),0.1) | |
1324 | zw2m=w_est(ig,l+1) | ||
1325 | ✗ | zdz=zlev(ig,l+1)-zlev(ig,l) | |
1326 | ✗ | zbuoy(ig,l)=RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) | |
1327 | ! zbuoybis=zbuoy(ig,l)+RG*0.1/300. | ||
1328 | zbuoybis=zbuoy(ig,l) | ||
1329 | ✗ | zalpha=f0(ig)*f_star(ig,l)/sqrt(w_est(ig,l+1))/rhobarz(ig,l) | |
1330 | ✗ | zdqt(ig,l)=max(zqta(ig,l-1)-po(ig,l),0.)/po(ig,l) | |
1331 | |||
1332 | |||
1333 | entr_star(ig,l)=f_star(ig,l)*zdz* zbetalpha*MAX(0., & | ||
1334 | ✗ | & afact*zbuoybis/zw2m - fact_epsilon ) | |
1335 | |||
1336 | |||
1337 | detr_star(ig,l)=f_star(ig,l)*zdz & | ||
1338 | & *MAX(1.e-3, -afact*zbetalpha*zbuoy(ig,l)/zw2m & | ||
1339 | ✗ | & + 0.012*(zdqt(ig,l)/zw2m)**0.5 ) | |
1340 | |||
1341 | ! En dessous de lalim, on prend le max de alim_star et entr_star pour | ||
1342 | ! alim_star et 0 sinon | ||
1343 | ✗ | if (l.lt.lalim(ig)) then | |
1344 | ✗ | alim_star(ig,l)=max(alim_star(ig,l),entr_star(ig,l)) | |
1345 | ✗ | entr_star(ig,l)=0. | |
1346 | endif | ||
1347 | |||
1348 | ! Calcul du flux montant normalise | ||
1349 | f_star(ig,l+1)=f_star(ig,l)+alim_star(ig,l)+entr_star(ig,l) & | ||
1350 | ✗ | & -detr_star(ig,l) | |
1351 | |||
1352 | endif | ||
1353 | enddo | ||
1354 | |||
1355 | |||
1356 | !---------------------------------------------------------------------------- | ||
1357 | !calcul de la vitesse verticale en melangeant Tl et qt du thermique | ||
1358 | !--------------------------------------------------------------------------- | ||
1359 | ✗ | activetmp(:)=active(:) .and. f_star(:,l+1)>1.e-10 | |
1360 | ✗ | do ig=1,ngrid | |
1361 | ✗ | if (activetmp(ig)) then | |
1362 | Zsat=.false. | ||
1363 | ztla(ig,l)=(f_star(ig,l)*ztla(ig,l-1)+ & | ||
1364 | & (alim_star(ig,l)+entr_star(ig,l))*zthl(ig,l)) & | ||
1365 | ✗ | & /(f_star(ig,l+1)+detr_star(ig,l)) | |
1366 | zqta(ig,l)=(f_star(ig,l)*zqta(ig,l-1)+ & | ||
1367 | & (alim_star(ig,l)+entr_star(ig,l))*po(ig,l)) & | ||
1368 | ✗ | & /(f_star(ig,l+1)+detr_star(ig,l)) | |
1369 | |||
1370 | endif | ||
1371 | enddo | ||
1372 | |||
1373 | ✗ | ztemp(:)=zpspsk(:,l)*ztla(:,l) | |
1374 | ✗ | call thermcell_qsat(ngrid,activetmp,pplev(:,l),ztemp,zqta(:,l),zqsatth(:,l)) | |
1375 | |||
1376 | ✗ | do ig=1,ngrid | |
1377 | ✗ | if (activetmp(ig)) then | |
1378 | ! on ecrit de maniere conservative (sat ou non) | ||
1379 | ! T = Tl +Lv/Cp ql | ||
1380 | ✗ | zqla(ig,l)=max(0.,zqta(ig,l)-zqsatth(ig,l)) | |
1381 | ✗ | ztva(ig,l) = ztla(ig,l)*zpspsk(ig,l)+RLvCp*zqla(ig,l) | |
1382 | ✗ | ztva(ig,l) = ztva(ig,l)/zpspsk(ig,l) | |
1383 | !on rajoute le calcul de zha pour diagnostiques (temp potentielle) | ||
1384 | ✗ | zha(ig,l) = ztva(ig,l) | |
1385 | ztva(ig,l) = ztva(ig,l)*(1.+RETV*(zqta(ig,l) & | ||
1386 | ✗ | & -zqla(ig,l))-zqla(ig,l)) | |
1387 | ✗ | zbuoy(ig,l)=RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l) | |
1388 | ✗ | zdz=zlev(ig,l+1)-zlev(ig,l) | |
1389 | ✗ | zeps(ig,l)=(entr_star(ig,l)+alim_star(ig,l))/(f_star(ig,l)*zdz) | |
1390 | |||
1391 | ✗ | zw2fact=fact_epsilon*2.*zdz/(1.+betalpha) | |
1392 | ✗ | zdw2=afact*zbuoy(ig,l)/(fact_epsilon) | |
1393 | ✗ | zw2(ig,l+1)=Max(0.0001,exp(-zw2fact)*(zw2(ig,l)-zdw2)+zdw2) | |
1394 | endif | ||
1395 | enddo | ||
1396 | |||
1397 | ✗ | if (prt_level.ge.20) print*,'coucou calcul detr 460: ig, l',ig, l | |
1398 | ! | ||
1399 | !--------------------------------------------------------------------------- | ||
1400 | !initialisations pour le calcul de la hauteur du thermique, de l'inversion et de la vitesse verticale max | ||
1401 | !--------------------------------------------------------------------------- | ||
1402 | |||
1403 | ✗ | nbpb=0 | |
1404 | ✗ | do ig=1,ngrid | |
1405 | ✗ | if (zw2(ig,l+1)>0. .and. zw2(ig,l+1).lt.1.e-10) then | |
1406 | ! stop'On tombe sur le cas particulier de thermcell_dry' | ||
1407 | ! print*,'On tombe sur le cas particulier de thermcell_plume' | ||
1408 | ✗ | nbpb=nbpb+1 | |
1409 | ✗ | zw2(ig,l+1)=0. | |
1410 | ✗ | linter(ig)=l+1 | |
1411 | endif | ||
1412 | |||
1413 | ✗ | if (zw2(ig,l+1).lt.0.) then | |
1414 | linter(ig)=(l*(zw2(ig,l+1)-zw2(ig,l)) & | ||
1415 | ✗ | & -zw2(ig,l))/(zw2(ig,l+1)-zw2(ig,l)) | |
1416 | ✗ | zw2(ig,l+1)=0. | |
1417 | ✗ | elseif (f_star(ig,l+1).lt.0.) then | |
1418 | linter(ig)=(l*(f_star(ig,l+1)-f_star(ig,l)) & | ||
1419 | ✗ | & -f_star(ig,l))/(f_star(ig,l+1)-f_star(ig,l)) | |
1420 | ! print*,"linter plume", linter(ig) | ||
1421 | ✗ | zw2(ig,l+1)=0. | |
1422 | endif | ||
1423 | |||
1424 | ✗ | wa_moy(ig,l+1)=sqrt(zw2(ig,l+1)) | |
1425 | |||
1426 | ✗ | if (wa_moy(ig,l+1).gt.wmaxa(ig)) then | |
1427 | ! lmix est le niveau de la couche ou w (wa_moy) est maximum | ||
1428 | !on rajoute le calcul de lmix_bis | ||
1429 | ✗ | if (zqla(ig,l).lt.1.e-10) then | |
1430 | ✗ | lmix_bis(ig)=l+1 | |
1431 | endif | ||
1432 | ✗ | lmix(ig)=l+1 | |
1433 | ✗ | wmaxa(ig)=wa_moy(ig,l+1) | |
1434 | endif | ||
1435 | enddo | ||
1436 | |||
1437 | ✗ | if (nbpb>0) then | |
1438 | ✗ | print*,'WARNING on tombe ',nbpb,' x sur un pb pour l=',l,' dans thermcell_plume' | |
1439 | endif | ||
1440 | |||
1441 | !========================================================================= | ||
1442 | ! FIN DE LA BOUCLE VERTICALE | ||
1443 | enddo | ||
1444 | !========================================================================= | ||
1445 | |||
1446 | !on recalcule alim_star_tot | ||
1447 | ✗ | do ig=1,ngrid | |
1448 | ✗ | alim_star_tot(ig)=0. | |
1449 | enddo | ||
1450 | ✗ | do ig=1,ngrid | |
1451 | ✗ | do l=1,lalim(ig)-1 | |
1452 | ✗ | alim_star_tot(ig)=alim_star_tot(ig)+alim_star(ig,l) | |
1453 | enddo | ||
1454 | enddo | ||
1455 | |||
1456 | |||
1457 | ✗ | if (prt_level.ge.20) print*,'coucou calcul detr 470: ig, l', ig, l | |
1458 | |||
1459 | |||
1460 | |||
1461 | ✗ | return | |
1462 | end | ||
1463 |