6 & ,
u_seri,v_seri,t_seri,q_seri,zqsat,debut &
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, &
10 & zmax0,f0,zw2,fraca,ztv,zpspsk,ztla,zthl &
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 &
40 REAL weak_inversion(
klon)
47 INTEGER lalim_conv(
klon)
58 LOGICAL flag_bidouille_stratocu
75 integer lmix_sec(
klon)
95 real therm_tke_max0(
klon),env_tke_max0(
klon)
97 real ale_bl_stat(
klon)
99 real alp_bl_det(
klon),alp_bl_fluct_m(
klon),alp_bl_fluct_tke(
klon),alp_bl_conv(
klon),alp_bl_stat(
klon)
114 character (len=20) :: modname=
'calltherm'
115 character (len=80) :: abort_message
118 logical,
save :: first=.
true.
136 zfm_therm(:,:)=fm_therm(:,:)
137 zdetr_therm(:,:)=detr_therm(:,:)
138 zentr_therm(:,:)=entr_therm(:,:)
159 logexpr2(i,k)=.not.q_seri(i,k).ge.1.e-15
160 if (logexpr2(i,k))
then
169 if(nbptspb.GT.0) print*,
'Number of points with q_seri(i,k)<=0 ',nbptspb
176 & ,pplay,paprs,pphi &
177 & ,u_seri,v_seri,t_seri,q_seri &
178 & ,d_u_the,d_v_the,d_t_the,d_q_the &
179 & ,zfm_therm,zentr_therm,fraca,zw2 &
180 & ,r_aspect_thermals,30.,w2di_thermals &
184 & ,pplay,paprs,pphi,zlev &
185 & ,u_seri,v_seri,t_seri,q_seri &
186 & ,d_u_the,d_v_the,d_t_the,d_q_the &
187 & ,zfm_therm,zentr_therm &
188 & ,r_aspect_thermals,30.,w2di_thermals &
192 & ,pplay,paprs,pphi &
193 & ,u_seri,v_seri,t_seri,q_seri &
194 & ,d_u_the,d_v_the,d_t_the,d_q_the &
195 & ,zfm_therm,zentr_therm &
200 & ,pplay,paprs,pphi &
201 & ,u_seri,v_seri,t_seri,q_seri &
202 & ,d_u_the,d_v_the,d_t_the,d_q_the &
203 & ,zfm_therm,zentr_therm &
207 abort_message =
'cas non prevu dans calltherm'
219 & ,pplay,paprs,pphi,zlev &
220 & ,u_seri,v_seri,t_seri,q_seri &
221 & ,zmax_sec,wmax_sec,zw_sec,lmix_sec &
226 & ,pplay,paprs,pphi,debut &
227 & ,u_seri,v_seri,t_seri,q_seri &
228 & ,d_u_the,d_v_the,d_t_the,d_q_the &
229 & ,zfm_therm,zentr_therm,zdetr_therm,zqasc,zqla,lmax &
230 & ,ratqscth,ratqsdiff,zqsatth &
233 & ,zmax0,f0,zw2,fraca)
237 CALL thermcell_main(itap,
klon,
klev,zdt &
238 & ,pplay,paprs,pphi,debut &
239 & ,u_seri,v_seri,t_seri,q_seri &
240 & ,d_u_the,d_v_the,d_t_the,d_q_the &
241 & ,zfm_therm,zentr_therm,zdetr_therm,zqasc,zqla,lmax &
242 & ,ratqscth,ratqsdiff,zqsatth &
245 & ,ale,alp,lalim_conv,wght_th &
246 & ,zmax0,f0,zw2,fraca,ztv,zpspsk &
249 & ,pbl_tke,pctsrf,omega,airephy &
250 & ,zlcl_th,fraca0,w0,w_conv,therm_tke_max0,env_tke_max0 &
251 & ,n2,s2,ale_bl_stat &
252 & ,therm_tke_max,env_tke_max &
253 & ,alp_bl_det,alp_bl_fluct_m,alp_bl_fluct_tke &
254 & ,alp_bl_conv,alp_bl_stat &
259 abort_message =
'Cas des thermiques non prevu'
278 zdetr_therm(:,k)=zentr_therm(:,k)+zfm_therm(:,k)-zfm_therm(:,k+1)
282 if (zfm_therm(i,k+1)>0.) lmax(i)=k
289 logexpr1(i)=flag_bidouille_stratocu.or.weak_inversion(i).gt.0.5
295 d_t_the(:,k)=d_t_the(:,k)*dtime*fact(:)
296 d_u_the(:,k)=d_u_the(:,k)*dtime*fact(:)
297 d_v_the(:,k)=d_v_the(:,k)*dtime*fact(:)
298 d_q_the(:,k)=d_q_the(:,k)*dtime*fact(:)
299 fm_therm(:,k)=fm_therm(:,k) &
300 & +zfm_therm(:,k)*fact(:)
301 entr_therm(:,k)=entr_therm(:,k) &
302 & +zentr_therm(:,k)*fact(:)
303 detr_therm(:,k)=detr_therm(:,k) &
304 & +zdetr_therm(:,k)*fact(:)
306 fm_therm(:,
klev+1)=0.
311 d_t_ajs(:,:)=d_t_ajs(:,:)+d_t_the(:,:)
312 d_u_ajs(:,:)=d_u_ajs(:,:)+d_u_the(:,:)
313 d_v_ajs(:,:)=d_v_ajs(:,:)+d_v_the(:,:)
314 d_q_ajs(:,:)=d_q_ajs(:,:)+d_q_the(:,:)
317 t_seri(:,:) = t_seri(:,:) + d_t_the(:,:)
318 u_seri(:,:) = u_seri(:,:) + d_u_the(:,:)
319 v_seri(:,:) = v_seri(:,:) + d_v_the(:,:)
320 qmemoire(:,:)=q_seri(:,:)
321 q_seri(:,:) = q_seri(:,:) + d_q_the(:,:)
325 fm_therm(i,
klev+1)=0.
330 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)
339 logexpr2(i,k)=.not.q_seri(i,k).ge.0.
340 if (logexpr2(i,k))
then
350 IF(nbptspb.GT.0) print*,
'Number of points with q_seri(i,k)<=0 ',nbptspb
355 logexpr2(i,k)=t_seri(i,k).lt.50..or.t_seri(i,k).gt.370.
356 if (logexpr2(i,k)) nbptspb=nbptspb+1
365 IF(nbptspb.GT.0) print*,
'Number of points with q_seri(i,k)<=0 ',nbptspb
376 if (entr_therm(i,k).gt.0.)
then
377 fmc_therm(i,k+1)=fmc_therm(i,k)+entr_therm(i,k)
379 fmc_therm(i,k+1)=fmc_therm(i,k)
381 detrc_therm(i,k)=(fmc_therm(i,k+1)-fm_therm(i,k+1)) &
382 & -(fmc_therm(i,k)-fm_therm(i,k))
393 zqasc(i,1)=q_seri(i,1)
395 if (fmc_therm(i,k+1).gt.1.e-6)
then
396 zqasc(i,k)=(fmc_therm(i,k)*zqasc(i,k-1) &
397 & +entr_therm(i,k)*q_seri(i,k))/fmc_therm(i,k+1)
411 clwcon0(i,k)=zqasc(i,k)-zqsat(i,k)
412 if (clwcon0(i,k).lt.0. .or. &
413 & (fm_therm(i,k+1)+detrc_therm(i,k)).lt.1.e-6)
then
421 clwcon0(i,k)=zqla(i,k)
422 if (clwcon0(i,k).lt.0. .or. &
423 & (fm_therm(i,k+1)+detrc_therm(i,k)).lt.1.e-6)
then
435 if (ztla(i,k) .lt. 1.e-10) fraca(i,k) =0.
subroutine thermcell_eau(ngrid, nlay, ptimestep, pplay, pplev, pphi, pu, pv,pt, po, pduadj, pdvadj, pdtadj, pdoadj, fm0, entr0
subroutine thermcell_sec(ngrid, nlay, ptimestep, pplay, pplev, pphi, zlev,pu, pv, pt, po, pduadj, pdvadj, pdtadj, pdoadj, fm0, entr0
subroutine thermcell(ngrid, nlay, ptimestep, pplay, pplev, pphi, pu, pv, pt,po, pduadj, pdvadj, pdtadj, pdoadj, fm0, entr0
!$Id!c c c Common de passage de la geometrie de la dynamique a la physique real airephy(klon)
subroutine thermcell_2002(ngrid, nlay, ptimestep, iflag_thermals, pplay, pplev, pphi, pu, pv, pt, po, pduadj, pdvadj, pdtadj, pdoadj, fm0, entr0, fraca, wa_moy, r_aspect, l_mix, w2di, tho)
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL pplay
subroutine calcul_sec(ngrid, nlay, ptimestep, pplay, pplev, pphi, zlev, pu,pv, pt, po, zmax, wmax, zw2, lmix
!FH On elimine toutes les clefs physiques dans la dynamique prt_level
subroutine thermcellv0_main(itap, ngrid, nlay, ptimestep, pplay, pplev, pphi, debut, pu, pv, pt, po, pduadj, pdvadj, pdtadj, pdoadj, fm0, entr0, detr0, zqta, zqla, lmax, ratqscth, ratqsdiff, zqsatth, r_aspect, l_mix, tau_thermals, Ale_bl, Alp_bl, lalim_conv, wght_th, zmax0, f0, zw2, fraca)
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL &zphi geo500!IM on interpole a chaque pas de temps le paprs
nsplit_thermals!nrlmd le iflag_clos_bl tau_trig_deep real::s_trig!fin nrlmd le l_mix_thermals
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
nsplit_thermals!nrlmd le iflag_clos_bl tau_trig_deep real::s_trig!fin nrlmd le fact_thermals_ed_dz iflag_wake iflag_thermals_closure common ctherm1 iflag_thermals
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL & u_seri
nsplit_thermals!nrlmd le iflag_clos_bl tau_trig_deep real::s_trig!fin nrlmd le fact_thermals_ed_dz iflag_wake iflag_thermals_closure common ctherm1 iflag_thermals_closure common ctherm2 tau_thermals
nsplit_thermals!nrlmd le iflag_clos_bl tau_trig_deep real::s_trig!fin nrlmd le fact_thermals_ed_dz iflag_wake iflag_thermals_closure common ctherm1 nsplit_thermals
subroutine abort_physic(modname, message, ierr)
subroutine calltherm(dtime, pplay, paprs, pphi, weak_inversion, u_seri, v_seri, t_seri, q_seri, zqsat, debut, d_u_ajs, d_v_ajs, d_t_ajs, d_q_ajs, fm_therm, entr_therm, detr_therm, zqasc, clwcon0, lmax, ratqscth, ratqsdiff, zqsatth, Ale_bl, Alp_bl, lalim_conv, wght_th, zmax0, f0, zw2, fraca, ztv, zpspsk, ztla, zthl, pbl_tke, pctsrf, omega, airephy, zlcl_th, fraca0, w0, w_conv, therm_tke_max0, env_tke_max0, n2, s2, ale_bl_stat, therm_tke_max, env_tke_max, alp_bl_det, alp_bl_fluct_m, alp_bl_fluct_tke, alp_bl_conv, alp_bl_stat, zqla, ztva)
!$Header!gestion des impressions de sorties et de débogage la sortie standard prt_level COMMON comprint lunout