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)