5 & ,
pplay,paprs,pphi,weak_inversion &
7 & ,d_u_ajs,d_v_ajs,d_t_ajs,d_q_ajs &
8 & ,fm_therm,entr_therm,detr_therm,zqasc,clwcon0,lmax,ratqscth, &
9 & ratqsdiff,zqsatth,ale_bl,alp_bl,lalim_conv,wght_th, &
12 & ,pbl_tke,pctsrf,omega,
airephy &
13 & ,zlcl_th,fraca0,w0,w_conv,therm_tke_max0,env_tke_max0 &
14 & ,n2,s2,ale_bl_stat &
15 & ,therm_tke_max,env_tke_max &
16 & ,alp_bl_det,alp_bl_fluct_m,alp_bl_fluct_tke &
17 & ,alp_bl_conv,alp_bl_stat &
23 #include "dimensions.h"
25 #include "thermcell.h"
29 #include "indicesol.h"
37 LOGICAL logexpr0, logexpr2(klon,
klev), logexpr1(klon)
42 REAL t_seri(klon,
klev),q_seri(klon,
klev),qmemoire(klon,
klev)
43 REAL weak_inversion(klon)
44 REAL paprs(klon,
klev+1)
47 real zlev(klon,
klev+1)
49 REAL wght_th(klon,
klev)
50 INTEGER lalim_conv(klon)
54 REAL d_t_ajs(klon,
klev), d_q_ajs(klon,
klev)
55 REAL d_u_ajs(klon,
klev),d_v_ajs(klon,
klev)
56 real fm_therm(klon,
klev+1)
57 real entr_therm(klon,
klev),detr_therm(klon,
klev)
61 LOGICAL flag_bidouille_stratocu
62 real fmc_therm(klon,
klev+1),zqasc(klon,
klev)
66 real zpspsk(klon,
klev)
72 real detrc_therm(klon,
klev)
75 real clwcon0(klon,
klev)
77 real zw_sec(klon,
klev+1)
78 integer lmix_sec(klon)
80 real ratqscth(klon,
klev)
81 real ratqsdiff(klon,
klev)
82 real zqsatth(klon,
klev)
90 real zmax0(klon), f0(klon)
93 real pbl_tke(klon,
klev+1,nbsrf)
94 real pctsrf(klon,nbsrf)
97 real zlcl_th(klon),fraca0(klon),w0(klon),w_conv(klon)
98 real therm_tke_max0(klon),env_tke_max0(klon)
99 real n2(klon),s2(klon)
100 real ale_bl_stat(klon)
101 real therm_tke_max(klon,
klev),env_tke_max(klon,
klev)
102 real alp_bl_det(klon),alp_bl_fluct_m(klon),alp_bl_fluct_tke(klon),alp_bl_conv(klon),alp_bl_stat(klon)
109 REAL d_t_the(klon,
klev), d_q_the(klon,
klev)
110 REAL d_u_the(klon,
klev),d_v_the(klon,
klev)
112 real zfm_therm(klon,
klev+1),zdt
113 real zentr_therm(klon,
klev),zdetr_therm(klon,
klev)
117 character (len=20) :: modname=
'calltherm'
118 character (len=80) :: abort_message
121 logical,
save :: first=.true.
139 zfm_therm(:,:)=fm_therm(:,:)
140 zdetr_therm(:,:)=detr_therm(:,:)
141 zentr_therm(:,:)=entr_therm(:,:)
152 print*,
'thermV4 nsplit: ',nsplit_thermals,
' weak_inversion'
162 logexpr2(
i,
k)=.not.q_seri(
i,
k).ge.1.e-15
163 if (logexpr2(
i,
k))
then
172 if(nbptspb.GT.0) print*,
'Number of points with q_seri(i,k)<=0 ',nbptspb
174 zdt=
dtime/
REAL(nsplit_thermals)
175 do isplit=1,nsplit_thermals
179 & ,
pplay,paprs,pphi &
180 & ,
u_seri,v_seri,t_seri,q_seri &
181 & ,d_u_the,d_v_the,d_t_the,d_q_the &
182 & ,zfm_therm,zentr_therm &
183 & ,r_aspect_thermals,30.,w2di_thermals &
187 & ,
pplay,paprs,pphi,zlev &
188 & ,
u_seri,v_seri,t_seri,q_seri &
189 & ,d_u_the,d_v_the,d_t_the,d_q_the &
190 & ,zfm_therm,zentr_therm &
191 & ,r_aspect_thermals,30.,w2di_thermals &
195 & ,
pplay,paprs,pphi &
196 & ,
u_seri,v_seri,t_seri,q_seri &
197 & ,d_u_the,d_v_the,d_t_the,d_q_the &
198 & ,zfm_therm,zentr_therm &
203 & ,
pplay,paprs,pphi &
204 & ,
u_seri,v_seri,t_seri,q_seri &
205 & ,d_u_the,d_v_the,d_t_the,d_q_the &
206 & ,zfm_therm,zentr_therm &
210 abort_message =
'cas non prevu dans calltherm'
222 & ,
pplay,paprs,pphi,zlev &
223 & ,
u_seri,v_seri,t_seri,q_seri &
224 & ,zmax_sec,wmax_sec,zw_sec,lmix_sec &
229 & ,
pplay,paprs,pphi,debut &
230 & ,
u_seri,v_seri,t_seri,q_seri &
231 & ,d_u_the,d_v_the,d_t_the,d_q_the &
232 & ,zfm_therm,zentr_therm,zdetr_therm,zqasc,zqla,lmax &
233 & ,ratqscth,ratqsdiff,zqsatth &
240 CALL thermcell_main(itap,klon,
klev,zdt &
241 & ,
pplay,paprs,pphi,debut &
242 & ,
u_seri,v_seri,t_seri,q_seri &
243 & ,d_u_the,d_v_the,d_t_the,d_q_the &
244 & ,zfm_therm,zentr_therm,zdetr_therm,zqasc,zqla,lmax &
245 & ,ratqscth,ratqsdiff,zqsatth &
248 & ,ale,alp,lalim_conv,wght_th &
252 & ,pbl_tke,pctsrf,omega,
airephy &
253 & ,zlcl_th,fraca0,w0,w_conv,therm_tke_max0,env_tke_max0 &
254 & ,n2,s2,ale_bl_stat &
255 & ,therm_tke_max,env_tke_max &
256 & ,alp_bl_det,alp_bl_fluct_m,alp_bl_fluct_tke &
257 & ,alp_bl_conv,alp_bl_stat &
262 abort_message =
'Cas des thermiques non prevu'
279 zdetr_therm(:,
k)=zentr_therm(:,
k)+zfm_therm(:,
k)-zfm_therm(:,
k+1)
285 logexpr1(
i)=flag_bidouille_stratocu.or.weak_inversion(
i).gt.0.5
286 IF(logexpr1(
i)) fact(
i)=1./
REAL(nsplit_thermals)
291 d_t_the(:,
k)=d_t_the(:,
k)*
dtime*fact(:)
292 d_u_the(:,
k)=d_u_the(:,
k)*
dtime*fact(:)
293 d_v_the(:,
k)=d_v_the(:,
k)*
dtime*fact(:)
294 d_q_the(:,
k)=d_q_the(:,
k)*
dtime*fact(:)
295 fm_therm(:,
k)=fm_therm(:,
k) &
296 & +zfm_therm(:,
k)*fact(:)
297 entr_therm(:,
k)=entr_therm(:,
k) &
298 & +zentr_therm(:,
k)*fact(:)
299 detr_therm(:,
k)=detr_therm(:,
k) &
300 & +zdetr_therm(:,
k)*fact(:)
302 fm_therm(:,
klev+1)=0.
307 d_t_ajs(:,:)=d_t_ajs(:,:)+d_t_the(:,:)
308 d_u_ajs(:,:)=d_u_ajs(:,:)+d_u_the(:,:)
309 d_v_ajs(:,:)=d_v_ajs(:,:)+d_v_the(:,:)
310 d_q_ajs(:,:)=d_q_ajs(:,:)+d_q_the(:,:)
313 t_seri(:,:) = t_seri(:,:) + d_t_the(:,:)
315 v_seri(:,:) = v_seri(:,:) + d_v_the(:,:)
316 qmemoire(:,:)=q_seri(:,:)
317 q_seri(:,:) = q_seri(:,:) + d_q_the(:,:)
321 fm_therm(
i,
klev+1)=0.
322 ale_bl(
i)=ale_bl(
i)+ale(
i)/
REAL(nsplit_thermals)
324 alp_bl(
i)=alp_bl(
i)+alp(
i)/
REAL(nsplit_thermals)
326 if(
prt_level.GE.10) print*,
'calltherm i Alp_bl Alp Ale_bl Ale',
i,alp_bl(
i),alp(
i),ale_bl(
i),ale(
i)
335 logexpr2(
i,
k)=.not.q_seri(
i,
k).ge.0.
336 if (logexpr2(
i,
k))
then
346 IF(nbptspb.GT.0) print*,
'Number of points with q_seri(i,k)<=0 ',nbptspb
351 logexpr2(
i,
k)=t_seri(
i,
k).lt.50..or.t_seri(
i,
k).gt.370.
352 if (logexpr2(
i,
k)) nbptspb=nbptspb+1
361 IF(nbptspb.GT.0) print*,
'Number of points with q_seri(i,k)<=0 ',nbptspb
372 if (entr_therm(
i,
k).gt.0.)
then
373 fmc_therm(
i,
k+1)=fmc_therm(
i,
k)+entr_therm(
i,
k)
375 fmc_therm(
i,
k+1)=fmc_therm(
i,
k)
377 detrc_therm(
i,
k)=(fmc_therm(
i,
k+1)-fm_therm(
i,
k+1)) &
378 & -(fmc_therm(
i,
k)-fm_therm(
i,
k))
389 zqasc(
i,1)=q_seri(
i,1)
391 if (fmc_therm(
i,
k+1).gt.1.e-6)
then
392 zqasc(
i,
k)=(fmc_therm(
i,
k)*zqasc(
i,
k-1) &
393 & +entr_therm(
i,
k)*q_seri(
i,
k))/fmc_therm(
i,
k+1)
408 if (clwcon0(
i,
k).lt.0. .or. &
409 & (fm_therm(
i,
k+1)+detrc_therm(
i,
k)).lt.1.e-6)
then
417 clwcon0(
i,
k)=zqla(
i,
k)
418 if (clwcon0(
i,
k).lt.0. .or. &
419 & (fm_therm(
i,
k+1)+detrc_therm(
i,
k)).lt.1.e-6)
then
431 if (ztla(
i,
k) .lt. 1.e-10)
fraca(
i,
k) =0.