4 SUBROUTINE thermcell_main(itap,ngrid,nlay,ptimestep &
5 & ,
pplay,pplev,pphi,debut &
8 & ,fm0,entr0,detr0,
zqta,zqla,lmax &
9 & ,ratqscth,ratqsdiff,zqsatth &
10 & ,ale_bl,alp_bl,lalim_conv,wght_th &
14 & ,pbl_tke,pctsrf,omega,
airephy &
15 & ,zlcl,fraca0,w0,w_conv,therm_tke_max0,env_tke_max0 &
16 & ,n2,s2,ale_bl_stat &
17 & ,therm_tke_max,env_tke_max &
18 & ,alp_bl_det,alp_bl_fluct_m,alp_bl_fluct_tke &
19 & ,alp_bl_conv,alp_bl_stat &
63 #include "dimensions.h"
68 #include "thermcell.h"
70 #include "indicesol.h"
81 REAL pt(ngrid,
nlay),pdtadj(ngrid,
nlay)
83 REAL pv(ngrid,
nlay),pdvadj(ngrid,
nlay)
93 integer,
save :: dvdq=1,dqimpl=-1
99 integer,
save :: igout=1
101 integer,
save :: lunout1=6
103 integer,
save :: lev_out=10
106 REAL susqr2pi, reuler
108 INTEGER ig,
k,
l,
ll,ierr
110 INTEGER lmax(klon),lmin(klon),lalim(klon)
112 INTEGER lmix_bis(klon)
132 real zsortie(klon,
klev)
149 real ratqscth(klon,
klev)
152 real ratqsdiff(klon,
klev)
156 real zpspsk(klon,
klev)
172 real zqsatth(klon,
klev)
174 real f_star(klon,
klev+1),entr_star(klon,
klev)
176 real alim_star_tot(klon)
178 real alim_star_clos(klon,
klev)
179 real f(klon), f0(klon)
189 real pbl_tke(klon,
klev+1,nbsrf)
190 real pctsrf(klon,nbsrf)
191 real omega(klon,
klev)
194 real zlcl(klon),fraca0(klon),w0(klon),w_conv(klon)
195 real therm_tke_max0(klon),env_tke_max0(klon)
196 real n2(klon),s2(klon)
197 real ale_bl_stat(klon)
198 real therm_tke_max(klon,
klev),env_tke_max(klon,
klev)
199 real alp_bl_det(klon),alp_bl_fluct_m(klon),alp_bl_fluct_tke(klon),alp_bl_conv(klon),alp_bl_stat(klon)
223 real pbl_tke_max(klon,
klev)
224 real pbl_tke_max0(klon)
237 real alp_int(klon),dp_int(klon),zdp
241 real wght_th(klon,
klev)
242 integer lalim_conv(klon)
249 character (len=20) :: modname=
'thermcell_main'
250 character (len=80) :: abort_message
279 #undef wrgrads_thermcell
280 #ifdef wrgrads_thermcell
286 &
rlatd(igout),-90.,90.,1.,llm,
pplay(igout,:),1., &
287 & ptimestep,str10,
'therm ')
294 fm=0. ; entr=0. ;
detr=0.
307 if (
prt_level.ge.1) print*,
'thermcell_main V4'
310 IF(ngrid.NE.klon)
THEN
312 print*,
'STOP dans convadj'
313 print*,
'ngrid =',ngrid
319 f0(ig)=max(f0(ig),1.e-2)
320 zmax0(ig)=max(zmax0(ig),40.)
326 print*,
'th_main ig f0',ig,f0(ig)
334 & pplev,zo,zh,zl,
ztv,zthl,zu,
zv,zpspsk,
zqsat,lev_out)
336 if (
prt_level.ge.1) print*,
'thermcell_main apres thermcell_env'
361 zlev(:,
l)=0.5*(pphi(:,
l)+pphi(:,
l-1))/rg
378 rho(:,:)=
pplay(:,:)/(zpspsk(:,:)*rd*
ztv(:,:))
381 &
'WARNING thermcell_main rhobarz(:,1)=rho(:,1)'
382 rhobarz(:,1)=rho(:,1)
385 rhobarz(:,
l)=0.5*(rho(:,
l)+rho(:,
l-1))
390 masse(:,
l)=(pplev(:,
l)-pplev(:,
l+1))/rg
393 if (
prt_level.ge.1) print*,
'thermcell_main apres initialisation'
466 if (
prt_level.ge.1) print*,
'avant thermcell_plume ',lev_out
475 CALL thermcell_plume(itap,ngrid,
nlay,ptimestep,
ztv,zthl,po,zl,rhobarz,&
476 & zlev,pplev,pphi,zpspsk,
alim_star,alim_star_tot, &
477 & lalim,f0,
detr_star,entr_star,f_star,csc,ztva, &
478 & ztla,zqla,
zqta,
zha,
zw2,zw_est,ztva_est,zqsatth,lmix,lmix_bis,linter &
479 & ,lev_out,lunout1,igout)
483 CALL thermcellv1_plume(itap,ngrid,
nlay,ptimestep,
ztv,zthl,po,zl,rhobarz,&
484 & zlev,pplev,pphi,zpspsk,
alim_star,alim_star_tot, &
485 & lalim,f0,
detr_star,entr_star,f_star,csc,ztva, &
486 & ztla,zqla,
zqta,
zha,
zw2,zw_est,ztva_est,zqsatth,lmix,lmix_bis,linter &
487 & ,lev_out,lunout1,igout)
491 if (
prt_level.ge.1) print*,
'apres thermcell_plume ',lev_out
493 call test_ltherm(ngrid,
nlay,pplev,
pplay,lalim,seuil,
ztv,po,ztva,zqla,f_star,
zw2,
'thermcell_plum lalim ')
494 call test_ltherm(ngrid,
nlay,pplev,
pplay,lmix ,seuil,
ztv,po,ztva,zqla,f_star,
zw2,
'thermcell_plum lmix ')
496 if (
prt_level.ge.1) print*,
'thermcell_main apres thermcell_plume'
498 write(lunout1,*)
'Dans thermcell_main 2'
499 write(lunout1,*)
'lmin ',lmin(igout)
500 write(lunout1,*)
'lalim ',lalim(igout)
501 write(lunout1,*)
' ig l alim_star entr_star detr_star f_star '
502 write(lunout1,
'(i6,i4,4e15.5)') (igout,
l,
alim_star(igout,
l),entr_star(igout,
l),
detr_star(igout,
l) &
503 & ,f_star(igout,
l+1),
l=1,nint(linter(igout))+5)
511 & zlev,lmax,
zmax,zmax0,
zmix,wmax,lev_out)
516 wmax_tmp(:)=max(wmax_tmp(:),
zw2(:,
l))
522 call test_ltherm(ngrid,
nlay,pplev,
pplay,lalim,seuil,
ztv,po,ztva,zqla,f_star,
zw2,
'thermcell_heig lalim ')
523 call test_ltherm(ngrid,
nlay,pplev,
pplay,lmin ,seuil,
ztv,po,ztva,zqla,f_star,
zw2,
'thermcell_heig lmin ')
524 call test_ltherm(ngrid,
nlay,pplev,
pplay,lmix ,seuil,
ztv,po,ztva,zqla,f_star,
zw2,
'thermcell_heig lmix ')
525 call test_ltherm(ngrid,
nlay,pplev,
pplay,lmax ,seuil,
ztv,po,ztva,zqla,f_star,
zw2,
'thermcell_heig lmax ')
527 if (
prt_level.ge.1) print*,
'thermcell_main apres thermcell_height'
536 & lalim,lmin,zmax_sec,wmax_sec,lev_out)
541 if (
prt_level.ge.1) print*,
'thermcell_main apres thermcell_dry'
543 write(lunout1,*)
'Dans thermcell_main 1b'
544 write(lunout1,*)
'lmin ',lmin(igout)
545 write(lunout1,*)
'lalim ',lalim(igout)
546 write(lunout1,*)
' ig l alim_star entr_star detr_star f_star '
547 write(lunout1,
'(i6,i4,e15.5)') (igout,
l,
alim_star(igout,
l) &
548 & ,
l=1,lalim(igout)+4)
557 alim_star_clos(:,:)=entr_star(:,:)+
alim_star(:,:)
561 & zlev,lalim,alim_star_clos,f_star,zmax_sec,wmax_sec,
f,lev_out)
570 if(
prt_level.ge.1)print*,
'thermcell_closure apres thermcell_closure'
574 f0=(1.-lambda)*
f+lambda*f0
580 if (.not. (f0(1).ge.0.) )
then
581 abort_message = .not..ge.
' (f0(1)0.)'
592 &
detr,zqla,lev_out,lunout1,igout)
595 if (
prt_level.ge.1) print*,
'thermcell_main apres thermcell_flux'
596 call test_ltherm(ngrid,
nlay,pplev,
pplay,lalim,seuil,
ztv,po,ztva,zqla,f_star,
zw2,
'thermcell_flux lalim ')
597 call test_ltherm(ngrid,
nlay,pplev,
pplay,lmax ,seuil,
ztv,po,ztva,zqla,f_star,
zw2,
'thermcell_flux lmax ')
607 fm0=(1.-lambda)*fm+lambda*fm0
608 entr0=(1.-lambda)*entr+lambda*entr0
609 detr0=(1.-lambda)*
detr+lambda*detr0
634 if (
zw2(ig,
l).gt.1.e-10)
then
663 & ,
zv,pdvadj,
zva,lev_out)
674 if (
prt_level.ge.1) print*,
'14 OK convect8'
681 if (
prt_level.ge.1) print*,
'14a OK convect8'
690 chi=zh(ig,1)/(1669.0-122.0*zo(ig,1)/
zqsat(ig,1)-zh(ig,1))
691 pcon(ig)=
pplay(ig,1)*(zo(ig,1)/
zqsat(ig,1))**chi
696 if ((pcon(ig).le.
pplay(ig,
k)) &
697 & .and.(pcon(ig).gt.
pplay(ig,
k+1)))
then
698 zcon2(ig)=
zlay(ig,
k)-(pcon(ig)-
pplay(ig,
k))/(rg*rho(ig,
k))/100.
711 abort_message =
'thermcellV0_main: les thermiques vont trop haut '
715 if (
prt_level.ge.1) print*,
'14b OK convect8'
718 if (zqla(ig,
k).gt.1e-10)
then
724 if (
prt_level.ge.1) print*,
'14c OK convect8'
736 if (
prt_level.ge.1) print*,
'14d OK convect8'
738 &
'WARNING thermcell_main wth2=0. si zw2 > 1.e-10'
745 if(
zw2(ig,
l).gt.1.e-10)
then
746 wth2(ig,
l)=zf2*(
zw2(ig,
l))**2
752 q2(ig,
l)=zf2*(
zqta(ig,
l)*1000.-po(ig,
l)*1000.)**2
754 ratqscth(ig,
l)=sqrt(max(q2(ig,
l),1.e-6)/(po(ig,
l)*1000.))
772 if ( (pcon(ig) .gt.
pplay(ig,
klev-1)) .and. (pcon(ig) .lt.
pplay(ig,1)) ) ok_lcl(ig)=.true.
779 if ((
pplay(ig,
l) .ge. pcon(ig)) .and. (
pplay(ig,
l+1) .le. pcon(ig)))
then
781 interp(ig)=(pcon(ig)-
pplay(ig,klcl(ig)))/(
pplay(ig,klcl(ig)+1)-
pplay(ig,klcl(ig)))
797 zmax(ig)=pphi(ig,lmax(ig))/rg
799 rhobarz0(ig)=rhobarz(ig,klcl(ig))+(rhobarz(ig,klcl(ig)+1) &
800 & -rhobarz(ig,klcl(ig)))*interp(ig)
801 zlcl(ig)=(pplev(ig,1)-pcon(ig))/(rhobarz0(ig)*rg)
802 zlcl(ig)=min(zlcl(ig),
zmax(ig))
824 pbl_tke_max(ig,
l)=pctsrf(ig,
nsrf)*pbl_tke(ig,
l,
nsrf)+pbl_tke_max(ig,
l)
832 therm_tke_max(ig,
l)=pbl_tke_max(ig,
l)
833 env_tke_max(ig,
l)=pbl_tke_max(ig,
l)
838 call thermcell_tke_transport(ngrid,
nlay,ptimestep,fm0,entr0, &
839 & rg,pplev,therm_tke_max)
845 pbl_tke_max(ig,
l)=
fraca(ig,
l)*therm_tke_max(ig,
l)+(1.-
fraca(ig,
l))*env_tke_max(ig,
l)
846 env_tke_max(ig,
l)=(pbl_tke_max(ig,
l)-
fraca(ig,
l)*therm_tke_max(ig,
l))/(1.-
fraca(ig,
l))
847 w_ls(ig,
l)=-1.*omega(ig,
l)/(rg*rhobarz(ig,
l))
854 fraca0(ig)=
fraca(ig,klcl(ig))+(
fraca(ig,klcl(ig)+1) &
855 & -
fraca(ig,klcl(ig)))*interp(ig)
856 w0(ig)=
zw2(ig,klcl(ig))+(
zw2(ig,klcl(ig)+1) &
857 & -
zw2(ig,klcl(ig)))*interp(ig)
858 w_conv(ig)=w_ls(ig,klcl(ig))+(w_ls(ig,klcl(ig)+1) &
859 & -w_ls(ig,klcl(ig)))*interp(ig)
860 therm_tke_max0(ig)=therm_tke_max(ig,klcl(ig)) &
861 & +(therm_tke_max(ig,klcl(ig)+1)-therm_tke_max(ig,klcl(ig)))*interp(ig)
862 env_tke_max0(ig)=env_tke_max(ig,klcl(ig))+(env_tke_max(ig,klcl(ig)+1) &
863 & -env_tke_max(ig,klcl(ig)))*interp(ig)
864 pbl_tke_max0(ig)=pbl_tke_max(ig,klcl(ig))+(pbl_tke_max(ig,klcl(ig)+1) &
865 & -pbl_tke_max(ig,klcl(ig)))*interp(ig)
866 if (therm_tke_max0(ig).ge.20.) therm_tke_max0(ig)=20.
867 if (env_tke_max0(ig).ge.20.) env_tke_max0(ig)=20.
868 if (pbl_tke_max0(ig).ge.20.) pbl_tke_max0(ig)=20.
892 zmax_moy(ig)=zlcl(ig)+zmax_moy_coef*(
zmax(ig)-zlcl(ig))
893 depth(ig)=zmax_moy(ig)-zlcl(ig)
894 hmin(ig)=hmincoef*zlcl(ig)
895 if (depth(ig).ge.10.)
then
896 s2(ig)=(hcoef*depth(ig)+hmin(ig))**2
897 n2(ig)=(1.-eps1)*fraca0(ig)*
airephy(ig)/s2(ig)
902 s_max(ig)=s2(ig)*log(max(n2(ig),1.))
923 susqr2pi=su*sqrt(2.*rpi)
926 if ( (depth(ig).ge.10.) .and. (s_max(ig).gt.susqr2pi*reuler) )
then
927 w_max(ig)=w0(ig)*(1.+sqrt(2.*log(s_max(ig)/susqr2pi)-log(2.*log(s_max(ig)/susqr2pi))))
928 ale_bl_stat(ig)=0.5*w_max(ig)**2
940 IF (iflag_clos_bl.ge.1)
THEN
944 alp_bl_det(ig)=0.5*coef_m*rhobarz0(ig)*(w0(ig)**3)*fraca0(ig)*(1.-2.*fraca0(ig))/((1.-fraca0(ig))**2)
945 alp_bl_fluct_m(ig)=1.5*rhobarz0(ig)*fraca0(ig)*(w_conv(ig)+coef_m*w0(ig))* &
947 alp_bl_fluct_tke(ig)=3.*coef_m*rhobarz0(ig)*w0(ig)*fraca0(ig)*(therm_tke_max0(ig)-env_tke_max0(ig)) &
948 & +3.*rhobarz0(ig)*w_conv(ig)*pbl_tke_max0(ig)
949 if (iflag_clos_bl.ge.2)
then
950 alp_bl_conv(ig)=1.5*coef_m*rhobarz0(ig)*fraca0(ig)*(fraca0(ig)/(1.-fraca0(ig)))*w_conv(ig)* &
955 alp_bl_stat(ig)=alp_bl_det(ig)+alp_bl_fluct_m(ig)+alp_bl_fluct_tke(ig)+alp_bl_conv(ig)
960 if (fraca0(ig).gt.0.98) alp_bl_stat(ig)=2.
970 print*,
'14f OK convect8 ig,l,zha zh zpspsk ',ig,
l,
zha(ig,
l),zh(ig,
l),zpspsk(ig,
l)
971 print*,
'14g OK convect8 ig,l,po',ig,
l,po(ig,
l)
982 alp_bl(ig)=max(alp_bl(ig),0.5*rhobarz(ig,
l)*
wth3(ig,
l) )
983 ale_bl(ig)=max(ale_bl(ig),0.5*
zw2(ig,
l)**2)
993 lalim_conv(:)=lalim(:)
997 if (
k<=lalim_conv(ig)) fm_tot(ig)=fm_tot(ig)+fm(ig,
k)
1005 if (
k<=lalim_conv(ig).and.
alim_star(ig,
k)>1.e-10)
then
1033 if(
l.LE.lmax(ig))
THEN
1035 alp_int(ig)=alp_int(ig)+0.5*rhobarz(ig,
l)*
wth3(ig,
l)*zdp
1036 dp_int(ig)=dp_int(ig)+zdp
1044 if (dp_int(ig)>0.)
then
1045 alp_bl(ig)=alp_int(ig)/dp_int(ig)
1052 alp_bl(:)=alp_bl_k*alp_bl(:)
1058 if (
prt_level.ge.1) print*,
'14e OK convect8'
1065 if (
l<=lalim(ig))
then
1071 if (
prt_level.ge.1) print*,
'14f OK convect8'
1075 if (
l<=lalim(ig))
then
1083 if (
prt_level.ge.1) print*,
'14g OK convect8'
1086 ratqsdiff(ig,
l)=sqrt(vardiff)/(po(ig,
l)*1000.)
1095 #ifdef wrgrads_thermcell
1096 if (
prt_level.ge.1) print*,
'thermcell_main sorties 3D'
1097 #include "thermcell_out3d.h"
1102 if (
prt_level.ge.1) print*,
'thermcell_main FIN OK'
1109 subroutine test_ltherm(klon,klev,pplev,pplay,long,seuil,ztv,po,ztva,zqla,f_star,zw2,comment)
1111 #include "iniprint.h"
1117 real ztva(klon,
klev)
1118 real zqla(klon,
klev)
1119 real f_star(klon,
klev)
1123 character*21 comment
1126 print*,
'WARNING !!! TEST ',comment
1134 print*,
'WARNING ',comment,
' au point ',
i,
' K= ',long(
i)
1135 print*,
' K P(MB) THV(K) Qenv(g/kg)THVA QLA(g/kg) F* W2'
1137 write(6,
'(i3,7f10.3)')
k,
pplay(
i,
k),
ztv(
i,
k),1000*po(
i,
k),ztva(
i,
k),1000*zqla(
i,
k),f_star(
i,
k),
zw2(
i,
k)
1149 subroutine thermcell_tke_transport(ngrid,nlay,ptimestep,fm0,entr0, &
1150 & rg,pplev,therm_tke_max)
1153 #include "iniprint.h"
1165 real masse0(ngrid,
nlay),fm0(ngrid,
nlay+1),pplev(ngrid,
nlay+1)
1166 real entr0(ngrid,
nlay),rg
1167 real therm_tke_max(ngrid,
nlay)
1168 real detr0(ngrid,
nlay)
1171 real masse(ngrid,
nlay),fm(ngrid,
nlay+1)
1172 real entr(ngrid,
nlay)
1187 if (
prt_level.ge.1) print*,
'Q2 THERMCEL_DQ 0'
1191 detr0(:,
k)=fm0(:,
k)-fm0(:,
k+1)+entr0(:,
k)
1192 masse0(:,
k)=(pplev(:,
k)-pplev(:,
k+1))/rg
1197 masse(:,1)=0.5*masse0(:,1)
1198 entr(:,1)=0.5*entr0(:,1)
1199 detr(:,1)=0.5*detr0(:,1)
1202 masse(:,
k+1)=0.5*(masse0(:,
k)+masse0(:,
k+1))
1203 entr(:,
k+1)=0.5*(entr0(:,
k)+entr0(:,
k+1))
1204 detr(:,
k+1)=0.5*(detr0(:,
k)+detr0(:,
k+1))
1205 fm(:,
k+1)=fm(:,
k)+entr(:,
k)-
detr(:,
k)
1219 q(:,:)=therm_tke_max(:,:)
1229 if ((fm(ig,
k+1)+
detr(ig,
k))*ptimestep.gt. &
1230 & 1.e-5*masse(ig,
k))
then
1231 qa(ig,
k)=(fm(ig,
k)*qa(ig,
k-1)+entr(ig,
k)*
q(ig,
k)) &
1232 & /(fm(ig,
k+1)+
detr(ig,
k))
1236 if (qa(ig,
k).lt.0.)
then
1239 if (
q(ig,
k).lt.0.)
then
1249 wqd(ig,
k)=fm(ig,
k)*
q(ig,
k)
1250 if (wqd(ig,
k).lt.0.)
then
1264 & -wqd(ig,
k)+wqd(ig,
k+1)) &
1265 & *ptimestep/masse(ig,
k)
1271 therm_tke_max(:,:)=
q(:,:)