1 SUBROUTINE cloudth(ngrid,klev,ind2, &
3 & qcloud,ctot,zpspsk,
paprs,ztla,zthl, &
7 USE ioipsl
, ONLY : getin
21 #include "thermcell.h"
23 INTEGER itap,ind1,ind2
24 INTEGER ngrid,klev,klon,l,ig
31 REAL fraca(ngrid,klev+1)
32 REAL zpspsk(ngrid,klev)
33 REAL paprs(ngrid,klev+1)
37 REAL zqsatth(ngrid,klev)
38 REAL zqsatenv(ngrid,klev)
41 REAL sigma1(ngrid,klev)
42 REAL sigma2(ngrid,klev)
44 REAL qlenv(ngrid,klev)
45 REAL qltot(ngrid,klev)
51 REAL qsatmmussig1,qsatmmussig2,sqrt2pi,pi
53 REAL alth,alenv,ath,aenv
54 REAL sth,senv,sigma1s,sigma2s,xth,xenv
55 REAL Tbef,zdelta,qsatbef,zcor
57 REAL ratqs(ngrid,klev)
59 REAL zpdf_sig(ngrid),zpdf_k(ngrid),zpdf_delta(ngrid)
60 REAL zpdf_a(ngrid),zpdf_b(ngrid),zpdf_e1(ngrid),zpdf_e2(ngrid)
61 REAL zqs(ngrid), qcloud(ngrid)
64 REAL,
SAVE :: iflag_cloudth_vert, iflag_cloudth_vert_omp=0
67 LOGICAL,
SAVE :: first=.
true.
79 CALL getin(
'iflag_cloudth_vert',iflag_cloudth_vert_omp)
82 iflag_cloudth_vert=iflag_cloudth_vert_omp
85 IF (iflag_cloudth_vert==1)
THEN
87 & ztv,po,zqta,fraca, &
88 & qcloud,ctot,zpspsk,paprs,ztla,zthl, &
124 if ((ztv(ind1,1).gt.ztv(ind1,2)).and.(fraca(ind1,ind2).gt.1.e-10))
then
126 zqenv(ind1)=(po(ind1)-fraca(ind1,ind2)*zqta(ind1,ind2))/(1.-fraca(ind1,ind2))
130 tbef=zthl(ind1,ind2)*zpspsk(ind1,ind2)
131 zdelta=max(0.,sign(1.,rtt-tbef))
132 qsatbef= r2es * foeew(tbef,zdelta)/paprs(ind1,ind2)
133 qsatbef=min(0.5,qsatbef)
134 zcor=1./(1.-retv*qsatbef)
136 zqsatenv(ind1,ind2)=qsatbef
141 alenv=(0.622*lv*zqsatenv(ind1,ind2))/(rdd*zthl(ind1,ind2)**2)
142 aenv=1./(1.+(alenv*lv/cppd))
143 senv=aenv*(po(ind1)-zqsatenv(ind1,ind2))
148 tbef=ztla(ind1,ind2)*zpspsk(ind1,ind2)
149 zdelta=max(0.,sign(1.,rtt-tbef))
150 qsatbef= r2es * foeew(tbef,zdelta)/paprs(ind1,ind2)
151 qsatbef=min(0.5,qsatbef)
152 zcor=1./(1.-retv*qsatbef)
154 zqsatth(ind1,ind2)=qsatbef
156 alth=(0.622*lv*zqsatth(ind1,ind2))/(rdd*ztla(ind1,ind2)**2)
157 ath=1./(1.+(alth*lv/cppd))
158 sth=ath*(zqta(ind1,ind2)-zqsatth(ind1,ind2))
173 sigma1s=(1.1**0.5)*(fraca(ind1,ind2)**0.6)/(1-fraca(ind1,ind2))*((sth-senv)**2)**0.5+0.002*po(ind1)
174 sigma2s=0.11*((sth-senv)**2)**0.5/(fraca(ind1,ind2)+0.01)**0.4+0.002*zqta(ind1,ind2)
182 xth=sth/(sqrt(2.)*sigma2s)
183 xenv=senv/(sqrt(2.)*sigma1s)
184 cth(ind1,ind2)=0.5*(1.+1.*erf(xth))
185 cenv(ind1,ind2)=0.5*(1.+1.*erf(xenv))
186 ctot(ind1,ind2)=fraca(ind1,ind2)*cth(ind1,ind2)+(1.-1.*fraca(ind1,ind2))*cenv(ind1,ind2)
191 qlth(ind1,ind2)=sigma2s*((exp(-1.*xth**2)/sqrt2pi)+xth*sqrt(2.)*cth(ind1,ind2))
192 qlenv(ind1,ind2)=sigma1s*((exp(-1.*xenv**2)/sqrt2pi)+xenv*sqrt(2.)*cenv(ind1,ind2))
193 qltot(ind1,ind2)=fraca(ind1,ind2)*qlth(ind1,ind2)+(1.-1.*fraca(ind1,ind2))*qlenv(ind1,ind2)
200 if (ctot(ind1,ind2).lt.1.e-10)
then
202 qcloud(ind1)=zqsatenv(ind1,ind2)
206 ctot(ind1,ind2)=ctot(ind1,ind2)
207 qcloud(ind1)=qltot(ind1,ind2)/ctot(ind1,ind2)+zqs(ind1)
219 zdelta=max(0.,sign(1.,rtt-tbef))
220 qsatbef= r2es * foeew(tbef,zdelta)/paprs(ind1,ind2)
221 qsatbef=min(0.5,qsatbef)
222 zcor=1./(1.-retv*qsatbef)
224 zqsatenv(ind1,ind2)=qsatbef
228 zthl(ind1,ind2)=t(ind1,ind2)*(101325/paprs(ind1,ind2))**(rdd/cppd)
229 alenv=(0.622*lv*zqsatenv(ind1,ind2))/(rdd*zthl(ind1,ind2)**2)
230 aenv=1./(1.+(alenv*lv/cppd))
231 senv=aenv*(po(ind1)-zqsatenv(ind1,ind2))
234 sigma1s=ratqs(ind1,ind2)*zqenv(ind1)
237 xenv=senv/(sqrt(2.)*sigma1s)
238 ctot(ind1,ind2)=0.5*(1.+1.*erf(xenv))
239 qltot(ind1,ind2)=sigma1s*((exp(-1.*xenv**2)/sqrt2pi)+xenv*sqrt(2.)*cenv(ind1,ind2))
241 if (ctot(ind1,ind2).lt.1.e-3)
then
243 qcloud(ind1)=zqsatenv(ind1,ind2)
247 ctot(ind1,ind2)=ctot(ind1,ind2)
248 qcloud(ind1)=qltot(ind1,ind2)/ctot(ind1,ind2)+zqsatenv(ind1,ind2)
267 & ztv,po,zqta,fraca, &
268 & qcloud,ctot,zpspsk,
paprs,ztla,zthl, &
285 #include "thermcell.h"
287 INTEGER itap,ind1,ind2
288 INTEGER ngrid,klev,klon,l,ig
293 REAL zqta(ngrid,klev)
295 REAL fraca(ngrid,klev+1)
296 REAL zpspsk(ngrid,klev)
297 REAL paprs(ngrid,klev+1)
298 REAL ztla(ngrid,klev)
299 REAL zthl(ngrid,klev)
301 REAL zqsatth(ngrid,klev)
302 REAL zqsatenv(ngrid,klev)
305 REAL sigma1(ngrid,klev)
306 REAL sigma2(ngrid,klev)
307 REAL qlth(ngrid,klev)
308 REAL qlenv(ngrid,klev)
309 REAL qltot(ngrid,klev)
311 REAL cenv(ngrid,klev)
312 REAL ctot(ngrid,klev)
313 REAL rneb(ngrid,klev)
315 REAL qsatmmussig1,qsatmmussig2,sqrt2pi,pi
316 REAL rdd,cppd,Lv,sqrt2,sqrtpi
317 REAL alth,alenv,ath,aenv
318 REAL sth,senv,sigma1s,sigma2s,xth,xenv
319 REAL xth1,xth2,xenv1,xenv2,deltasth, deltasenv
320 REAL IntJ,IntI1,IntI2,IntI3,coeffqlenv,coeffqlth
321 REAL Tbef,zdelta,qsatbef,zcor
323 REAL ratqs(ngrid,klev)
325 REAL zpdf_sig(ngrid),zpdf_k(ngrid),zpdf_delta(ngrid)
326 REAL zpdf_a(ngrid),zpdf_b(ngrid),zpdf_e1(ngrid),zpdf_e2(ngrid)
327 REAL zqs(ngrid), qcloud(ngrid)
364 if ((ztv(ind1,1).gt.ztv(ind1,2)).and.(fraca(ind1,ind2).gt.1.e-10))
then
366 zqenv(ind1)=(po(ind1)-fraca(ind1,ind2)*zqta(ind1,ind2))/(1.-fraca(ind1,ind2))
370 tbef=zthl(ind1,ind2)*zpspsk(ind1,ind2)
371 zdelta=max(0.,sign(1.,rtt-tbef))
372 qsatbef= r2es * foeew(tbef,zdelta)/paprs(ind1,ind2)
373 qsatbef=min(0.5,qsatbef)
374 zcor=1./(1.-retv*qsatbef)
376 zqsatenv(ind1,ind2)=qsatbef
381 alenv=(0.622*lv*zqsatenv(ind1,ind2))/(rdd*zthl(ind1,ind2)**2)
382 aenv=1./(1.+(alenv*lv/cppd))
383 senv=aenv*(po(ind1)-zqsatenv(ind1,ind2))
388 tbef=ztla(ind1,ind2)*zpspsk(ind1,ind2)
389 zdelta=max(0.,sign(1.,rtt-tbef))
390 qsatbef= r2es * foeew(tbef,zdelta)/paprs(ind1,ind2)
391 qsatbef=min(0.5,qsatbef)
392 zcor=1./(1.-retv*qsatbef)
394 zqsatth(ind1,ind2)=qsatbef
396 alth=(0.622*lv*zqsatth(ind1,ind2))/(rdd*ztla(ind1,ind2)**2)
397 ath=1./(1.+(alth*lv/cppd))
398 sth=ath*(zqta(ind1,ind2)-zqsatth(ind1,ind2))
406 sigma1s=(0.92**0.5)*(fraca(ind1,ind2)**0.5)/(1-fraca(ind1,ind2))*((sth-senv)**2)**0.5+ratqs(ind1,ind2)*po(ind1)
407 sigma2s=0.09*((sth-senv)**2)**0.5/(fraca(ind1,ind2)+0.02)**0.5+0.002*zqta(ind1,ind2)
422 xth=sth/(sqrt(2.)*sigma2s)
423 xenv=senv/(sqrt(2.)*sigma1s)
424 cth(ind1,ind2)=0.5*(1.+1.*erf(xth))
425 cenv(ind1,ind2)=0.5*(1.+1.*erf(xenv))
426 ctot(ind1,ind2)=fraca(ind1,ind2)*cth(ind1,ind2)+(1.-1.*fraca(ind1,ind2))*cenv(ind1,ind2)
431 qlth(ind1,ind2)=sigma2s*((exp(-1.*xth**2)/sqrt2pi)+xth*sqrt(2.)*cth(ind1,ind2))
432 qlenv(ind1,ind2)=sigma1s*((exp(-1.*xenv**2)/sqrt2pi)+xenv*sqrt(2.)*cenv(ind1,ind2))
433 qltot(ind1,ind2)=fraca(ind1,ind2)*qlth(ind1,ind2)+(1.-1.*fraca(ind1,ind2))*qlenv(ind1,ind2)
445 deltasenv=aenv*ratqs(ind1,ind2)*zqsatenv(ind1,ind2)
446 deltasth=ath*ratqs(ind1,ind2)*zqsatth(ind1,ind2)
449 xenv1=(senv-deltasenv)/(sqrt(2.)*sigma1s)
450 xenv2=(senv+deltasenv)/(sqrt(2.)*sigma1s)
451 xth1=(sth-deltasth)/(sqrt(2.)*sigma2s)
452 xth2=(sth+deltasth)/(sqrt(2.)*sigma2s)
453 coeffqlenv=(sigma1s)**2/(2*sqrtpi*deltasenv)
454 coeffqlth=(sigma2s)**2/(2*sqrtpi*deltasth)
456 cth(ind1,ind2)=0.5*(1.+1.*erf(xth2))
457 cenv(ind1,ind2)=0.5*(1.+1.*erf(xenv2))
458 ctot(ind1,ind2)=fraca(ind1,ind2)*cth(ind1,ind2)+(1.-1.*fraca(ind1,ind2))*cenv(ind1,ind2)
460 intj=sigma1s*(exp(-1.*xenv1**2)/sqrt2pi)+0.5*senv*(1+erf(xenv1))
461 inti1=coeffqlenv*0.5*(0.5*sqrtpi*(erf(xenv2)-erf(xenv1))+xenv1*exp(-1.*xenv1**2)-xenv2*exp(-1.*xenv2**2))
462 inti2=coeffqlenv*xenv2*(exp(-1.*xenv2**2)-exp(-1.*xenv1**2))
463 inti3=coeffqlenv*0.5*sqrtpi*xenv2**2*(erf(xenv2)-erf(xenv1))
465 qlenv(ind1,ind2)=intj+inti1+inti2+inti3
470 intj=sigma2s*(exp(-1.*xth1**2)/sqrt2pi)+0.5*sth*(1+erf(xth1))
473 inti1=coeffqlth*0.5*(0.5*sqrtpi*(erf(xth2)-erf(xth1))+xth1*exp(-1.*xth1**2)-xth2*exp(-1.*xth2**2))
474 inti2=coeffqlth*xth2*(exp(-1.*xth2**2)-exp(-1.*xth1**2))
475 inti3=coeffqlth*0.5*sqrtpi*xth2**2*(erf(xth2)-erf(xth1))
476 qlth(ind1,ind2)=intj+inti1+inti2+inti3
479 qltot(ind1,ind2)=fraca(ind1,ind2)*qlth(ind1,ind2)+(1.-1.*fraca(ind1,ind2))*qlenv(ind1,ind2)
482 if (cenv(ind1,ind2).lt.1.e-10.or.cth(ind1,ind2).lt.1.e-10)
then
484 qcloud(ind1)=zqsatenv(ind1,ind2)
488 ctot(ind1,ind2)=ctot(ind1,ind2)
489 qcloud(ind1)=qltot(ind1,ind2)/ctot(ind1,ind2)+zqs(ind1)
504 zdelta=max(0.,sign(1.,rtt-tbef))
505 qsatbef= r2es * foeew(tbef,zdelta)/paprs(ind1,ind2)
506 qsatbef=min(0.5,qsatbef)
507 zcor=1./(1.-retv*qsatbef)
509 zqsatenv(ind1,ind2)=qsatbef
513 zthl(ind1,ind2)=t(ind1,ind2)*(101325/paprs(ind1,ind2))**(rdd/cppd)
514 alenv=(0.622*lv*zqsatenv(ind1,ind2))/(rdd*zthl(ind1,ind2)**2)
515 aenv=1./(1.+(alenv*lv/cppd))
516 senv=aenv*(po(ind1)-zqsatenv(ind1,ind2))
519 sigma1s=ratqs(ind1,ind2)*zqenv(ind1)
522 xenv=senv/(sqrt(2.)*sigma1s)
523 ctot(ind1,ind2)=0.5*(1.+1.*erf(xenv))
524 qltot(ind1,ind2)=sigma1s*((exp(-1.*xenv**2)/sqrt2pi)+xenv*sqrt(2.)*cenv(ind1,ind2))
526 if (ctot(ind1,ind2).lt.1.e-3)
then
528 qcloud(ind1)=zqsatenv(ind1,ind2)
532 ctot(ind1,ind2)=ctot(ind1,ind2)
533 qcloud(ind1)=qltot(ind1,ind2)/ctot(ind1,ind2)+zqsatenv(ind1,ind2)
subroutine cloudth_vert(ngrid, klev, ind2, ztv, po, zqta, fraca, qcloud, ctot, zpspsk, paprs, ztla, zthl, ratqs, zqs, t)
!$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 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
!$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
subroutine cloudth(ngrid, klev, ind2, ztv, po, zqta, fraca, qcloud, ctot, zpspsk, paprs, ztla, zthl, ratqs, zqs, t)