7 s ,r_aspect,l_mix,w2di,tho)
36 #include "dimensions.h"
43 INTEGER ngrid,
nlay,w2di
45 real ptimestep,l_mix,r_aspect
46 REAL pt(ngrid,
nlay),pdtadj(ngrid,
nlay)
48 REAL pv(ngrid,
nlay),pdvadj(ngrid,
nlay)
61 INTEGER ig,
k,
l,lmax(klon,
klev+1),lmaxa(klon),lmix(klon)
74 real zsortie(klon,
klev)
80 real wa_moy(klon,
klev+1)
82 real fracc(klon,
klev+1)
88 integer isplit,nsplit,ialt
95 real rho(klon,
klev),rhobarz(klon,
klev+1),masse(klon,
klev)
96 real zpspsk(klon,
klev)
98 real wmax(klon,
klev),wmaxa(klon)
103 real fracd(klon,
klev+1)
104 real xxx(klon,
klev+1)
105 real larg_cons(klon,
klev+1)
106 real larg_detr(klon,
klev+1)
108 real pu_therm(klon,
klev),pv_therm(klon,
klev)
109 real fm(klon,
klev+1),entr(klon,
klev)
110 real fmc(klon,
klev+1)
112 character (len=2) :: str2
113 character (len=10) :: str10
115 character (len=20) :: modname=
'thermcell2002'
116 character (len=80) :: abort_message
118 LOGICAL vtest(klon),down
133 IF(ngrid.NE.klon)
THEN
135 print*,
'STOP dans convadj'
136 print*,
'ngrid =',ngrid
144 print*,
'0 OK convect8'
148 zpspsk(ig,
l)=(
pplay(ig,
l)/pplev(ig,1))**rkappa
149 zh(ig,
l)=pt(ig,
l)/zpspsk(ig,
l)
153 ztv(ig,
l)=zh(ig,
l)*(1.+0.61*zo(ig,
l))
181 zlev(ig,
l)=0.5*(pphi(ig,
l)+pphi(ig,
l-1))/rg
201 rho(ig,
l)=
pplay(ig,
l)/(zpspsk(ig,
l)*rd*zh(ig,
l))
207 rhobarz(ig,
l)=0.5*(rho(ig,
l)+rho(ig,
l-1))
262 s *(zlev(ig,
k+1)-zlev(ig,
k))
266 wa(ig,
k,
l+1)=wa(ig,
k,
l)+
268 s *(zlev(ig,
l+1)-zlev(ig,
l))
284 if(wa(ig,
k,
l).le.1.e-10) lmax(ig,
k)=
l-1
300 if (
l.le.lmax(ig,
k))
then
301 wa(ig,
k,
l)=sqrt(wa(ig,
k,
l))
302 wmax(ig,
k)=max(wmax(ig,
k),wa(ig,
k,
l))
312 pu_therm(ig,
k)=sqrt(wmax(ig,
k))
313 pv_therm(ig,
k)=sqrt(wmax(ig,
k))
325 zmax(ig)=max(
zmax(ig),zlev(ig,lmax(ig,
k))-zlev(ig,
k))
338 zzz=rho(ig,
k)*wmax(ig,
k)*(zlev(ig,
k+1)-zlev(ig,
k))
339 s /(
zmax(ig)*r_aspect)
341 entr(ig,
k)=entr(ig,
k)+
342 s ptimestep*(zzz-entr(ig,
k))/tho
374 s .and.entr(ig,
l).gt.1.e-10)
then
380 fmc(ig,
l+1)=entr(ig,
l)
387 s *(zlev(ig,
l+1)-zlev(ig,
l))
389 else if (
zw2(ig,
l).ge.1.e-10.and.
390 . fmc(ig,
l)+entr(ig,
l).gt.1.e-10)
then
392 fmc(ig,
l+1)=fmc(ig,
l)+entr(ig,
l)
401 ztva(ig,
l)=(fmc(ig,
l)*ztva(ig,
l-1)+entr(ig,
l)*
ztv(ig,
l))
405 zw2(ig,
l+1)=
zw2(ig,
l)*(fmc(ig,
l)/fmc(ig,
l+1))**2+
407 s *(zlev(ig,
l+1)-zlev(ig,
l))
409 if (
zw2(ig,
l+1).lt.0.)
then
413 wa_moy(ig,
l+1)=sqrt(
zw2(ig,
l+1))
415 if (wa_moy(ig,
l+1).gt.wmaxa(ig))
then
418 wmaxa(ig)=wa_moy(ig,
l+1)
437 if (
l.le.lmaxa(ig))
then
438 zw=max(wa_moy(ig,
l),1.e-10)
439 larg_cons(ig,
l)=
zmax(ig)*r_aspect
440 s *fmc(ig,
l)/(rhobarz(ig,
l)*zw)
447 if (
l.le.lmaxa(ig))
then
450 larg_detr(ig,
l)=sqrt(l_mix*zlev(ig,
l))
472 if(larg_cons(ig,
l).gt.1.)
then
474 fraca(ig,
l)=(larg_cons(ig,
l)-larg_detr(ig,
l))
475 s /(r_aspect*
zmax(ig))
476 if(
l.gt.lmix(ig))
then
477 xxx(ig,
l)=(lmaxa(ig)+1.-
l) / (lmaxa(ig)+1.-lmix(ig))
480 else if (idetr.eq.1)
then
482 else if (idetr.eq.2)
then
492 fracc(ig,
l)=larg_cons(ig,
l)/(r_aspect*
zmax(ig))
517 fm(ig,
l)=
fraca(ig,
l)*wa_moy(ig,
l)*rhobarz(ig,
l)
520 if(fracd(ig,
l).lt.0.1)
then
521 abort_message =
'fracd trop petit'
525 wd(ig,
l)=fm(ig,
l)/(fracd(ig,
l)*rhobarz(ig,
l))
533 masse(ig,
l)=(pplev(ig,
l)-pplev(ig,
l+1))/rg
547 if(fm(ig,
l+1)*ptimestep.gt.masse(ig,
l)
548 s .and.fm(ig,
l+1)*ptimestep.gt.masse(ig,
l+1))
then
558 if(entr(ig,
l)*ptimestep.gt.masse(ig,
l))
then
568 if(.not.fm(ig,
l).ge.0..or..not.fm(ig,
l).le.10.)
then
572 if(.not.masse(ig,
l).ge.1.e-10
573 s .or..not.masse(ig,
l).le.1.e4)
then
583 if(.not.entr(ig,
l).ge.0..or..not.entr(ig,
l).le.10.)
then
593 fm0=fm0+ptimestep*(fm-fm0)/tho
594 entr0=entr0+ptimestep*(entr-entr0)/tho
625 zf=0.5*(fracc(ig,
l)+fracc(ig,
l+1))
628 wth2(ig,
l)=zf2*(0.5*(wa_moy(ig,
l)+wa_moy(ig,
l+1)))**2
638 pdtadj(ig,
l)=zdhadj(ig,
l)*zpspsk(ig,
l)
664 zla(ig,
l)=(1.-fracd(ig,
l))*
zmax(ig)
665 zld(ig,
l)=fracd(ig,
l)*
zmax(ig)
666 if(1.-fracd(ig,
l).gt.1.e-10)
667 s zwa(ig,
l)=wd(ig,
l)*fracd(ig,
l)/(1.-fracd(ig,
l))
673 detr(ig,
l)=fm(ig,
l)+entr(ig,
l)-fm(ig,
l+1)
674 if (
detr(ig,
l).lt.0.)
then
675 entr(ig,
l)=entr(ig,
l)-
detr(ig,
l)
690 CALL writeg1d(1,
nlay,wd,
'wd ',
'wd ')
691 CALL writeg1d(1,
nlay,zwa,
'wa ',
'wa ')
692 CALL writeg1d(1,
nlay,fracd,
'fracd ',
'fracd ')
693 CALL writeg1d(1,
nlay,
fraca,
'fraca ',
'fraca ')
694 CALL writeg1d(1,
nlay,wa_moy,
'wam ',
'wam ')
695 CALL writeg1d(1,
nlay,zla,
'la ',
'la ')
696 CALL writeg1d(1,
nlay,zld,
'ld ',
'ld ')
697 CALL writeg1d(1,
nlay,pt,
'pt ',
'pt ')
698 CALL writeg1d(1,
nlay,zh,
'zh ',
'zh ')
699 CALL writeg1d(1,
nlay,
zha,
'zha ',
'zha ')
700 CALL writeg1d(1,
nlay,zu,
'zu ',
'zu ')
701 CALL writeg1d(1,
nlay,
zv,
'zv ',
'zv ')
702 CALL writeg1d(1,
nlay,zo,
'zo ',
'zo ')
703 CALL writeg1d(1,
nlay,wh,
'wh ',
'wh ')
704 CALL writeg1d(1,
nlay,wu,
'wu ',
'wu ')
705 CALL writeg1d(1,
nlay,wv,
'wv ',
'wv ')
706 CALL writeg1d(1,
nlay,wo,
'w15uo ',
'wXo ')
707 CALL writeg1d(1,
nlay,zdhadj,
'zdhadj ',
'zdhadj ')
708 CALL writeg1d(1,
nlay,
pduadj,
'pduadj ',
'pduadj ')
709 CALL writeg1d(1,
nlay,pdvadj,
'pdvadj ',
'pdvadj ')
710 CALL writeg1d(1,
nlay,
pdoadj,
'pdoadj ',
'pdoadj ')
711 CALL writeg1d(1,
nlay,entr ,
'entr ',
'entr ')
712 CALL writeg1d(1,
nlay,
detr ,
'detr ',
'detr ')
713 CALL writeg1d(1,
nlay,fm ,
'fm ',
'fm ')
715 CALL writeg1d(1,
nlay,pdtadj,
'pdtadj ',
'pdtadj ')
716 CALL writeg1d(1,
nlay,
pplay,
'pplay ',
'pplay ')
717 CALL writeg1d(1,
nlay,pplev,
'pplev ',
'pplev ')
720 call dt2f(pplev,
pplay,pt,pdtadj,wh)
721 CALL writeg1d(1,
nlay,wh,
'wh2 ',
'wh2 ')
727 print*,
'Debut des wrgradsfi'
772 write(str2,
'(i2.2)')
k
776 zsortie(ig,
l)=wa(ig,
k,
l)
782 zsortie(ig,
l)=larg_part(ig,
k,
l)
792 print*,
'Fin des wrgradsfi'
804 s ,
pplay,pplev,pphi,zlev,debut
807 s ,fm0,entr0,zqla,lmax
808 s ,zmax_sec,wmax_sec,zw_sec,lmix_sec
809 s ,ratqscth,ratqsdiff
811 s ,r_aspect,l_mix,w2di,tho)
840 #include "dimensions.h"
849 INTEGER ngrid,
nlay,w2di
851 real ptimestep,l_mix,r_aspect
852 REAL pt(ngrid,
nlay),pdtadj(ngrid,
nlay)
854 REAL pv(ngrid,
nlay),pdvadj(ngrid,
nlay)
857 real pphi(ngrid,
nlay)
867 INTEGER ig,
k,
l,lmaxa(klon),lmix(klon)
870 INTEGER lmax(klon),lmin(klon),lentr(klon)
872 real zmix(klon), fracazmix(klon)
882 real zw_sec(klon,
klev+1)
883 INTEGER lmix_sec(klon)
884 real w_est(klon,
klev+1)
890 REAL,
SAVE,
ALLOCATABLE :: zmax0(:), zmix0(:)
895 REAL zh(klon,
klev),zdhadj(klon,
klev)
902 real zla(klon,
klev+1)
903 real zwa(klon,
klev+1)
904 real zld(klon,
klev+1)
905 real zwd(klon,
klev+1)
906 real zsortie(klon,
klev)
913 real wa_moy(klon,
klev+1)
915 real fracc(klon,
klev+1)
919 real dtheta(klon,
klev)
922 real ratqscth(klon,
klev)
925 real ratqsdiff(klon,
klev)
927 integer isplit,nsplit,ialt
934 real rho(klon,
klev),rhobarz(klon,
klev+1),masse(klon,
klev)
935 real zpspsk(klon,
klev)
938 real wmax(klon),wmaxa(klon)
944 real fracd(klon,
klev+1)
945 real xxx(klon,
klev+1)
946 real larg_cons(klon,
klev+1)
947 real larg_detr(klon,
klev+1)
949 real massetot(klon,
klev)
950 real detr0(klon,
klev)
951 real alim0(klon,
klev)
952 real pu_therm(klon,
klev),pv_therm(klon,
klev)
953 real fm(klon,
klev+1),entr(klon,
klev)
954 real fmc(klon,
klev+1)
956 real zcor,zdelta,zcvm5,qlbef
957 real tbef(klon),qsatbef(klon)
958 real dqsat_dt,
dt,num,denom
965 real zqsatth(klon,
klev)
970 real f_star(klon,
klev+1),entr_star(klon,
klev)
972 real alim_star_tot(klon),alim_star2(klon)
973 real entr_star_tot(klon)
974 real detr_star_tot(klon)
985 REAL,
SAVE,
ALLOCATABLE :: f0(:)
990 logical,
save :: first = .true.
1007 character (len=20) :: modname=
'thermcell_cld'
1008 character (len=80) :: abort_message
1010 LOGICAL vtest(klon),down
1027 allocate(zmix0(klon))
1028 allocate(zmax0(klon))
1035 IF(ngrid.NE.klon)
THEN
1037 print*,
'STOP dans convadj'
1038 print*,
'ngrid =',ngrid
1039 print*,
'klon =',klon
1065 if ((.not.debut).and.(f0(ig).lt.1.e-10))
then
1099 zdelta=max(0.,sign(1.,rtt-tbef(ig)))
1100 qsatbef(ig)= r2es * foeew(tbef(ig),zdelta)/pplev(ig,
ll)
1101 qsatbef(ig)=min(0.5,qsatbef(ig))
1102 zcor=1./(1.-retv*qsatbef(ig))
1103 qsatbef(ig)=qsatbef(ig)*zcor
1104 zsat(ig) = (max(0.,po(ig,
ll)-qsatbef(ig)) .gt. 1.e-10)
1108 if (zsat(ig).and.(1.eq.1))
then
1109 qlbef=max(0.,po(ig,
ll)-qsatbef(ig))
1111 dt = 0.5*rlvcp*qlbef
1114 do while (abs(
dt).gt.ddt0)
1116 tbef(ig)=tbef(ig)+
dt
1117 zdelta=max(0.,sign(1.,rtt-tbef(ig)))
1118 qsatbef(ig)= r2es * foeew(tbef(ig),zdelta)/pplev(ig,
ll)
1119 qsatbef(ig)=min(0.5,qsatbef(ig))
1120 zcor=1./(1.-retv*qsatbef(ig))
1121 qsatbef(ig)=qsatbef(ig)*zcor
1123 qlbef=po(ig,
ll)-qsatbef(ig)
1124 zdelta=max(0.,sign(1.,rtt-tbef(ig)))
1125 zcvm5=r5les*(1.-zdelta) + r5ies*zdelta
1126 zcor=1./(1.-retv*qsatbef(ig))
1127 dqsat_dt=foede(tbef(ig),zdelta,zcvm5,qsatbef(ig),zcor)
1128 num=-tbef(ig)+pt(ig,
ll)+rlvcp*qlbef
1129 denom=1.+rlvcp*dqsat_dt
1130 if (denom.lt.1.e-10)
then
1136 zl(ig,
ll) = max(0.,qlbef)
1138 zh(ig,
ll) = pt(ig,
ll)+rlvcp*zl(ig,
ll)
1139 zo(ig,
ll) = po(ig,
ll)-zl(ig,
ll)
1155 zpspsk(ig,
l)=(
pplay(ig,
l)/100000.)**rkappa
1165 ztv(ig,
l)=zh(ig,
l)/zpspsk(ig,
l)
1170 zthl(ig,
l)=pt(ig,
l)/zpspsk(ig,
l)
1199 zlev(ig,
l)=0.5*(pphi(ig,
l)+pphi(ig,
l-1))/rg
1232 rhobarz(ig,
l)=0.5*(rho(ig,
l)+rho(ig,
l-1))
1247 masse(ig,
l)=(pplev(ig,
l)-pplev(ig,
l+1))/rg
1329 s
l.ge.lmin(ig).and.
l.lt.lentr(ig))
then
1333 s *sqrt(zlev(ig,
l+1))
1352 alim_star_tot(ig)=0.
1353 entr_star_tot(ig)=0.
1354 detr_star_tot(ig)=0.
1358 alim_star_tot(ig)=alim_star_tot(ig)+
alim_star(ig,
k)
1364 if (alim_star_tot(ig).gt.1.e-10)
then
1378 ztva(ig,
k)=
ztv(ig,
k)
1379 ztla(ig,
k)=zthl(ig,
k)
1434 dtheta(ig,
l)=sqrt(10.*0.4*zlev(ig,
l+1)**2*1.
1435 s *((
ztv(ig,
l+1)-
ztv(ig,
l))/(zlev(ig,
l+1)-zlev(ig,
l)))**2)
1443 s .and.
zw2(ig,
l).lt.1e-10)
then
1447 ztla(ig,
l)=zthl(ig,
l)
1456 s *(zlev(ig,
l+1)-zlev(ig,
l))
1457 s *0.4*pphi(ig,
l)/(pphi(ig,
l+1)-pphi(ig,
l))
1458 w_est(ig,
l+1)=
zw2(ig,
l+1)
1461 else if ((
zw2(ig,
l).ge.1e-10).and.
1465 if ((test(ig).eq.1).or.((.not.debut).and.(f0(ig).lt.1.e-10)))
then
1472 if (zqla(ig,
l-1).gt.1.e-10)
then
1476 w_est(ig,
l+1)=
zw2(ig,
l)*
1477 s((f_star(ig,
l))**2)
1479 s 2.*rg*(ztva(ig,
l-1)-
ztv(ig,
l))/
ztv(ig,
l)
1480 s *(zlev(ig,
l+1)-zlev(ig,
l))
1481 if (w_est(ig,
l+1).lt.0.)
then
1482 w_est(ig,
l+1)=
zw2(ig,
l)
1485 if ((w_est(ig,
l+1).gt.w_est(ig,
l)).and.
1486 s(zlev(ig,
l+1).lt.zmax_sec(ig)).and.
1487 s(zqla(ig,
l-1).lt.1.e-10))
then
1489 s *sqrt(w_est(ig,
l+1))*sqrt(nu(ig,
l)*zlev(ig,
l+1))
1490 s -rhobarz(ig,
l)*sqrt(w_est(ig,
l))*sqrt(nu(ig,
l)*zlev(ig,
l)))
1491 s /(r_aspect*zmax_sec(ig)))
1492 else if ((zlev(ig,
l+1).lt.zmax_sec(ig)).and.
1493 s(zqla(ig,
l-1).lt.1.e-10))
then
1495 s /(rhobarz(ig,lmix(ig))*wmaxa(ig))*
1496 s(rhobarz(ig,
l+1)*sqrt(w_est(ig,
l+1))
1497 s *((zmax_sec(ig)-zlev(ig,
l+1))/((zmax_sec(ig)-zlev(ig,lmix(ig)))))
1499 s -rhobarz(ig,
l)*sqrt(w_est(ig,
l))
1500 s *((zmax_sec(ig)-zlev(ig,
l))/((zmax_sec(ig)-zlev(ig,lmix(ig)))))
1504 s *(zlev(ig,
l+1)-zlev(ig,
l))
1523 if ((
l.lt.lentr(ig)))
then
1540 if (f_star(ig,
l+1).gt.1.e-10)
then
1551 ztla(ig,
l)=(f_star(ig,
l)*ztla(ig,
l-1)+
1570 tbef(ig)=ztla(ig,
l)*zpspsk(ig,
l)
1571 zdelta=max(0.,sign(1.,rtt-tbef(ig)))
1572 qsatbef(ig)= r2es * foeew(tbef(ig),zdelta)/pplev(ig,
l)
1573 qsatbef(ig)=min(0.5,qsatbef(ig))
1574 zcor=1./(1.-retv*qsatbef(ig))
1575 qsatbef(ig)=qsatbef(ig)*zcor
1576 zsat(ig) = (max(0.,
zqta(ig,
l)-qsatbef(ig)) .gt. 1.e-10)
1578 if (zsat(ig).and.(1.eq.1))
then
1579 qlbef=max(0.,
zqta(ig,
l)-qsatbef(ig))
1580 dt = 0.5*rlvcp*qlbef
1582 do while (abs(
dt).gt.ddt0)
1584 tbef(ig)=tbef(ig)+
dt
1585 zdelta=max(0.,sign(1.,rtt-tbef(ig)))
1586 qsatbef(ig)= r2es * foeew(tbef(ig),zdelta)/pplev(ig,
l)
1587 qsatbef(ig)=min(0.5,qsatbef(ig))
1588 zcor=1./(1.-retv*qsatbef(ig))
1589 qsatbef(ig)=qsatbef(ig)*zcor
1590 qlbef=
zqta(ig,
l)-qsatbef(ig)
1592 zdelta=max(0.,sign(1.,rtt-tbef(ig)))
1593 zcvm5=r5les*(1.-zdelta) + r5ies*zdelta
1594 zcor=1./(1.-retv*qsatbef(ig))
1595 dqsat_dt=foede(tbef(ig),zdelta,zcvm5,qsatbef(ig),zcor)
1596 num=-tbef(ig)+ztla(ig,
l)*zpspsk(ig,
l)+rlvcp*qlbef
1597 denom=1.+rlvcp*dqsat_dt
1598 if (denom.lt.1.e-10)
then
1604 zqla(ig,
l) = max(0.,
zqta(ig,
l)-qsatbef(ig))
1605 zqla(ig,
l) = max(0.,qlbef)
1613 ztva(ig,
l) = ztla(ig,
l)*zpspsk(ig,
l)+rlvcp*zqla(ig,
l)
1614 ztva(ig,
l) = ztva(ig,
l)/zpspsk(ig,
l)
1616 zha(ig,
l) = ztva(ig,
l)
1621 ztva(ig,
l) = ztva(ig,
l)*(1.+retv*(
zqta(ig,
l)
1622 s -zqla(ig,
l))-zqla(ig,
l))
1633 zqsatth(ig,
l)=qsatbef(ig)
1645 s((f_star(ig,
l))**2)
1648 s 2.*rg*(ztva(ig,
l)-
ztv(ig,
l))/
ztv(ig,
l)
1649 s *(zlev(ig,
l+1)-zlev(ig,
l))
1655 if (
zw2(ig,
l+1).lt.0.)
then
1664 wa_moy(ig,
l+1)=sqrt(
zw2(ig,
l+1))
1667 if (wa_moy(ig,
l+1).gt.wmaxa(ig))
then
1670 wmaxa(ig)=wa_moy(ig,
l+1)
1674 print*,
'fin calcul zw2'
1681 do l=
nlay,lentr(ig)+1,-1
1682 if (
zw2(ig,
l).le.1.e-10)
then
1689 if (lmin(ig).gt.1)
then
1703 if (
l.le.lmax(ig))
then
1704 if (
zw2(ig,
l).lt.0.)
then
1708 wmax(ig)=max(wmax(ig),
zw2(ig,
l))
1718 zlevinter(ig)=zlev(ig,1)
1722 zlevinter(ig)=(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))*
1723 s linter(ig)+zlev(ig,lmax(ig))-lmax(ig)*(zlev(ig,lmax(ig)+1)
1724 s -zlev(ig,lmax(ig)))
1727 zmax(ig)=max(
zmax(ig),zlevinter(ig)-zlev(ig,1))
1729 write(11,*)
'ig,lmax,linter',ig,lmax(ig),linter(ig)
1730 write(12,*)
'ig,zlevinter,zmax',ig,
zmax(ig),zlevinter(ig)
1735 s ,
pplay,pplev,pphi,zlev,rhobarz,f0,zpspsk
1736 s ,alim,zh,zo,lentr,lmin,nu_min,nu_max,r_aspect
1737 s ,zmax_sec2,wmax_sec2)
1739 print*,
'avant fermeture'
1755 entr_star_tot(ig)=entr_star_tot(ig)
1759 detr_star_tot(ig)=detr_star_tot(ig)
1767 if (alim_star_tot(ig).LT.1.e-10)
then
1772 alim_star2(ig)=alim_star2(ig)+
alim_star(ig,
k)**2
1773 s /(rho(ig,
k)*(zlev(ig,
k+1)-zlev(ig,
k)))
1775 if ((zmax_sec(ig).gt.1.e-10).and.(1.eq.1))
then
1776 f(ig)=wmax_sec(ig)/(max(500.,zmax_sec(ig))*r_aspect
1778 f(ig)=
f(ig)+(f0(ig)-
f(ig))*exp((-ptimestep/
1779 s zmax_sec(ig))*wmax_sec(ig))
1781 f(ig)=wmax(ig)/(max(500.,
zmax(ig))*r_aspect*alim_star2(ig))
1782 f(ig)=
f(ig)+(f0(ig)-
f(ig))*exp((-ptimestep/
1783 s
zmax(ig))*wmax(ig))
1788 print*,
'apres fermeture'
1809 if (
detr(ig,
k).lt.0.)
then
1814 entr(ig,
k)=
f(ig)*entr_star(ig,
k)
1815 if (entr(ig,
k).lt.0.)
then
1836 fmc(ig,
l+1)=fmc(ig,
l)+alim(ig,
l)+entr(ig,
l)-
detr(ig,
l)
1840 if (fmc(ig,
l+1).lt.0.)
then
1841 print*,
'fmc1<0',
l+1,lmax(ig),fmc(ig,
l+1)
1842 fmc(ig,
l+1)=fmc(ig,
l)
1843 detr(ig,
l)=alim(ig,
l)+entr(ig,
l)
1863 print*,
'THERMCELL PB ig=',ig,
' l=',
l
1864 abort_message =
'THERMCELL PB'
1869 if ((
zw2(ig,
l+1).gt.1.e-10).and.(
zw2(ig,
l).gt.1.e-10).and.
1870 s(
l.ge.lentr(ig)) )
then
1871 if ( ((fmc(ig,
l+1)/(rhobarz(ig,
l+1)*
zw2(ig,
l+1))).gt.
1872 s(fmc(ig,
l)/(rhobarz(ig,
l)*
zw2(ig,
l)))))
then
1874 fmc(ig,
l+1)=fmc(ig,
l)*rhobarz(ig,
l+1)*
zw2(ig,
l+1)
1875 s /(rhobarz(ig,
l)*
zw2(ig,
l))
1882 if ((fmc(ig,
l+1).gt.fmc(ig,
l)).and.(
l.gt.lentr(ig)))
then
1884 fmc(ig,
l+1)=fmc(ig,
l)
1887 if (
detr(ig,
l).gt.fmc(ig,
l))
then
1889 entr(ig,
l)=fmc(ig,
l+1)-alim(ig,
l)
1891 if (fmc(ig,
l+1).lt.0.)
then
1894 print*,
'fmc2<0',
l+1,lmax(ig)
1906 if (
zw2(ig,
l+1).gt.1.e-10)
then
1907 if ((((fmc(ig,
l+1))/(rhobarz(ig,
l+1)*
zw2(ig,
l+1))).gt.
1910 fmc(ig,
l+1)=rhobarz(ig,
l+1)*
zw2(ig,
l+1)
1915 zmax(ig)=zlev(ig,lmax(ig))
1916 print*,
'alpha>1',
l+1,lmax(ig)
1926 fmc(ig,lmax(ig)+1)=0.
1927 entr(ig,lmax(ig))=0.
1928 detr(ig,lmax(ig))=fmc(ig,lmax(ig))+entr(ig,lmax(ig))
1929 s +alim(ig,lmax(ig))
1935 if (fmc(ig,
l).lt.0.)
then
1936 print*,
'fm1<0!!!',
'ig=',ig,
'l=',
l,
'a=',alim(ig,
l-1),
'e='
1937 s ,entr(ig,
l-1),
'f=',fmc(ig,
l-1),
'd=',
detr(ig,
l-1),
'f+1=',fmc(ig,
l)
1944 if ((abs(fmc(ig,
l+1)-fmc(ig,
l)-alim(ig,
l)-entr(ig,
l)+
detr(ig,
l)))
1950 if (
detr(ig,
l).lt.0.)
then
1951 print*,
'detrdemi<0!!!'
1959 if (lmix(ig).gt.1.)
then
1961 if (((
zw2(ig,lmix(ig)-1)-
zw2(ig,lmix(ig)))
1962 s *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1)))
1963 s -(
zw2(ig,lmix(ig))-
zw2(ig,lmix(ig)+1))
1964 s *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))).gt.1e-10)
1967 zmix(ig)=((
zw2(ig,lmix(ig)-1)-
zw2(ig,lmix(ig)))
1968 s *((zlev(ig,lmix(ig)))**2-(zlev(ig,lmix(ig)+1))**2)
1969 s -(
zw2(ig,lmix(ig))-
zw2(ig,lmix(ig)+1))
1970 s *((zlev(ig,lmix(ig)-1))**2-(zlev(ig,lmix(ig)))**2))
1971 s /(2.*((
zw2(ig,lmix(ig)-1)-
zw2(ig,lmix(ig)))
1972 s *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1)))
1973 s -(
zw2(ig,lmix(ig))-
zw2(ig,lmix(ig)+1))
1974 s *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))))
1976 zmix(ig)=zlev(ig,lmix(ig))
1983 if ((
zmax(ig)-
zmix(ig)).le.0.)
then
1995 if (
zmix(ig).ge.zlev(ig,
l).and.
1996 s
zmix(ig).lt.zlev(ig,
l+1))
then
2005 if (
detr(ig,
l).gt.(fmc(ig,
l)+alim(ig,
l))+entr(ig,
l))
then
2006 print*,
'detr2>fmc2!!!',
'ig=',ig,
'l=',
l,
'd=',
detr(ig,
l),
2007 s
'f=',fmc(ig,
l),
'lmax=',lmax(ig)
2013 print*,
'pb!fm=0 et f_star>0',
l,lmax(ig)
2019 do l=lmax(ig)+1,
klev+1
2042 if (
l.le.lmax(ig).and.(test(ig).eq.1))
then
2043 zw=max(wa_moy(ig,
l),1.e-10)
2044 larg_cons(ig,
l)=
zmax(ig)*r_aspect
2045 s *fmc(ig,
l)/(rhobarz(ig,
l)*zw)
2052 if (
l.le.lmax(ig).and.(test(ig).eq.1))
then
2055 if ((l_mix*zlev(ig,
l)).lt.0.)
then
2056 print*,
'pb l_mix*zlev<0'
2060 if (
zw2(ig,
l).gt.1.e-10)
then
2061 larg_detr(ig,
l)=sqrt((l_mix/
zw2(ig,
l))*zlev(ig,
l))
2063 larg_detr(ig,
l)=sqrt(l_mix*zlev(ig,
l))
2087 if(larg_cons(ig,
l).gt.1..and.(test(ig).eq.1))
then
2089 fraca(ig,
l)=(larg_cons(ig,
l)-larg_detr(ig,
l))
2090 s /(r_aspect*
zmax(ig))
2095 fracc(ig,
l)=larg_cons(ig,
l)/(r_aspect*
zmax(ig))
2106 if (test(ig).eq.1)
then
2107 fracazmix(ig)=(
fraca(ig,lmix(ig)+1)-
fraca(ig,lmix(ig)))/
2108 s(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))*
zmix(ig)
2109 s +
fraca(ig,lmix(ig))-zlev(ig,lmix(ig))*(
fraca(ig,lmix(ig)+1)
2110 s -
fraca(ig,lmix(ig)))/(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))
2116 if(larg_cons(ig,
l).gt.1..and.(test(ig).eq.1))
then
2117 if (
l.gt.lmix(ig))
then
2119 if (
zmax(ig)-
zmix(ig).lt.1.e-10)
then
2121 xxx(ig,
l)=(lmax(ig)+1.-
l)/(lmax(ig)+1.-lmix(ig))
2125 if (idetr.eq.0)
then
2126 fraca(ig,
l)=fracazmix(ig)
2127 else if (idetr.eq.1)
then
2128 fraca(ig,
l)=fracazmix(ig)*xxx(ig,
l)
2129 else if (idetr.eq.2)
then
2130 fraca(ig,
l)=fracazmix(ig)*(1.-(1.-xxx(ig,
l))**2)
2132 fraca(ig,
l)=fracazmix(ig)*xxx(ig,
l)**2
2138 fracc(ig,
l)=larg_cons(ig,
l)/(r_aspect*
zmax(ig))
2144 print*,
'fin calcul fraca'
2160 if (test(ig).eq.1)
then
2161 fm(ig,
l)=
fraca(ig,
l)*wa_moy(ig,
l)*rhobarz(ig,
l)
2163 if (alim(ig,
l-1).lt.1e-10.and.fm(ig,
l).gt.fm(ig,
l-1)
2164 s .and.
l.gt.lmix(ig))
then
2173 if(fracd(ig,
l).lt.0.1.and.(test(ig).eq.1))
then
2174 abort_message =
'fracd trop petit'
2178 wd(ig,
l)=fm(ig,
l)/(fracd(ig,
l)*rhobarz(ig,
l))
2185 if (test(ig).eq.0)
then
2195 masse(ig,
l)=(pplev(ig,
l)-pplev(ig,
l+1))/rg
2199 print*,
'12 OK convect8'
2209 if(fm(ig,
l+1)*ptimestep.gt.masse(ig,
l)
2210 s .and.fm(ig,
l+1)*ptimestep.gt.masse(ig,
l+1))
then
2211 print*,
'WARN!!! FM>M ig=',ig,
' l=',
l,
' FM='
2212 s ,fm(ig,
l+1)*ptimestep
2213 s ,
' M=',masse(ig,
l),masse(ig,
l+1)
2220 if((alim(ig,
l)+entr(ig,
l))*ptimestep.gt.masse(ig,
l))
then
2221 print*,
'WARN!!! E>M ig=',ig,
' l=',
l,
' E=='
2222 s ,(entr(ig,
l)+alim(ig,
l))*ptimestep
2223 s ,
' M=',masse(ig,
l)
2230 if(.not.fm(ig,
l).ge.0..or..not.fm(ig,
l).le.10.)
then
2234 if(.not.masse(ig,
l).ge.1.e-10
2235 s .or..not.masse(ig,
l).le.1.e4)
then
2245 if(.not.alim(ig,
l).ge.0..or..not.alim(ig,
l).le.10.)
then
2258 if (test(ig).eq.1)
then
2259 detr(ig,
l)=fm(ig,
l)+alim(ig,
l)-fm(ig,
l+1)
2260 if (
detr(ig,
l).lt.0.)
then
2262 fm(ig,
l+1)=fm(ig,
l)+alim(ig,
l)
2273 fm0=fm0+ptimestep*(fm-fm0)/tho
2274 entr0=entr0+ptimestep*(alim+entr-entr0)/tho
2349 print*,
'14 OK convect8'
2356 if (
zw2(ig,
l).gt.1.e-10)
then
2366 zla(ig,
l)=(1.-fracd(ig,
l))*
zmax(ig)
2367 zld(ig,
l)=fracd(ig,
l)*
zmax(ig)
2368 if(1.-fracd(ig,
l).gt.1.e-10)
2369 s zwa(ig,
l)=wd(ig,
l)*fracd(ig,
l)/(1.-fracd(ig,
l))
2380 if (zqla(ig,
k).gt.1e-10)
then
2397 wth2(ig,
l)=zf2*(
zw2(ig,
l))**2
2401 q2(ig,
l)=zf2*(
zqta(ig,
l)*1000.-po(ig,
l)*1000.)**2
2404 ratqscth(ig,
l)=sqrt(q2(ig,
l))/(po(ig,
l)*1000.)
2424 s *(
zqta(ig,
l)*1000.-sum)**2
2431 ratqsdiff(ig,
l)=sqrt(sumdiff)/(po(ig,
l)*1000.)
2455 CALL writeg1d(1,
nlay,wd,
'wd ',
'wd ')
2456 CALL writeg1d(1,
nlay,zwa,
'wa ',
'wa ')
2457 CALL writeg1d(1,
nlay,fracd,
'fracd ',
'fracd ')
2458 CALL writeg1d(1,
nlay,
fraca,
'fraca ',
'fraca ')
2459 CALL writeg1d(1,
nlay,wa_moy,
'wam ',
'wam ')
2460 CALL writeg1d(1,
nlay,zla,
'la ',
'la ')
2461 CALL writeg1d(1,
nlay,zld,
'ld ',
'ld ')
2462 CALL writeg1d(1,
nlay,pt,
'pt ',
'pt ')
2463 CALL writeg1d(1,
nlay,zh,
'zh ',
'zh ')
2464 CALL writeg1d(1,
nlay,
zha,
'zha ',
'zha ')
2465 CALL writeg1d(1,
nlay,zu,
'zu ',
'zu ')
2466 CALL writeg1d(1,
nlay,
zv,
'zv ',
'zv ')
2467 CALL writeg1d(1,
nlay,zo,
'zo ',
'zo ')
2468 CALL writeg1d(1,
nlay,wh,
'wh ',
'wh ')
2469 CALL writeg1d(1,
nlay,wu,
'wu ',
'wu ')
2470 CALL writeg1d(1,
nlay,wv,
'wv ',
'wv ')
2471 CALL writeg1d(1,
nlay,wo,
'w15uo ',
'wXo ')
2472 CALL writeg1d(1,
nlay,zdhadj,
'zdhadj ',
'zdhadj ')
2473 CALL writeg1d(1,
nlay,
pduadj,
'pduadj ',
'pduadj ')
2474 CALL writeg1d(1,
nlay,pdvadj,
'pdvadj ',
'pdvadj ')
2475 CALL writeg1d(1,
nlay,
pdoadj,
'pdoadj ',
'pdoadj ')
2476 CALL writeg1d(1,
nlay,entr ,
'entr ',
'entr ')
2477 CALL writeg1d(1,
nlay,
detr ,
'detr ',
'detr ')
2478 CALL writeg1d(1,
nlay,fm ,
'fm ',
'fm ')
2480 CALL writeg1d(1,
nlay,pdtadj,
'pdtadj ',
'pdtadj ')
2481 CALL writeg1d(1,
nlay,
pplay,
'pplay ',
'pplay ')
2482 CALL writeg1d(1,
nlay,pplev,
'pplev ',
'pplev ')
2486 call dt2f(pplev,
pplay,pt,pdtadj,wh)
2487 CALL writeg1d(1,
nlay,wh,
'wh2 ',
'wh2 ')
2493 print*,
'Debut des wrgradsfi'
2564 call
wrgradsfi(1,1,alim_star_tot,
'a_s_t ',
'a_s_t ')
2565 call
wrgradsfi(1,1,alim_star2,
'a_2 ',
'a_2 ')
2567 call
wrgradsfi(1,1,zmax_sec,
'z_sec ',
'z_sec ')
2570 call
wrgradsfi(1,1,nivcon,
'nivcon ',
'nivcon ')
2572 zsortie1d(:)=lmax(:)
2573 call
wrgradsfi(1,1,zsortie1d,
'lmax ',
'lmax ')
2574 call
wrgradsfi(1,1,wmax,
'wmax ',
'wmax ')
2575 call
wrgradsfi(1,1,wmax_sec,
'w_sec ',
'w_sec ')
2576 zsortie1d(:)=lmix(:)
2577 call
wrgradsfi(1,1,zsortie1d,
'lmix ',
'lmix ')
2578 zsortie1d(:)=lentr(:)
2579 call
wrgradsfi(1,1,zsortie1d,
'lentr ',
'lentr ')
2584 write(str2,
'(i2.2)')
k
2588 zsortie(ig,
l)=wa(ig,
k,
l)
2594 zsortie(ig,
l)=larg_part(ig,
k,
l)
2604 print*,
'Fin des wrgradsfi'
2611 print*,
'19 OK convect8'
2620 s ,r_aspect,l_mix,w2di,tho)
2649 #include "dimensions.h"
2658 INTEGER ngrid,
nlay,w2di
2660 real ptimestep,l_mix,r_aspect
2661 REAL pt(ngrid,
nlay),pdtadj(ngrid,
nlay)
2663 REAL pv(ngrid,
nlay),pdvadj(ngrid,
nlay)
2666 real pphi(ngrid,
nlay)
2676 INTEGER ig,
k,
l,lmaxa(klon),lmix(klon)
2677 real zsortie1d(klon)
2679 INTEGER lmax(klon),lmin(klon),lentr(klon)
2681 real zmix(klon), fracazmix(klon)
2686 REAL zh(klon,
klev),zdhadj(klon,
klev)
2691 REAL wh(klon,
klev+1)
2693 real zla(klon,
klev+1)
2694 real zwa(klon,
klev+1)
2695 real zld(klon,
klev+1)
2696 real zwd(klon,
klev+1)
2697 real zsortie(klon,
klev)
2704 real wa_moy(klon,
klev+1)
2706 real fracc(klon,
klev+1)
2712 integer isplit,nsplit,ialt
2719 real rho(klon,
klev),rhobarz(klon,
klev+1),masse(klon,
klev)
2720 real zpspsk(klon,
klev)
2723 real wmax(klon),wmaxa(klon)
2725 real wd(klon,
klev+1)
2727 real fracd(klon,
klev+1)
2728 real xxx(klon,
klev+1)
2729 real larg_cons(klon,
klev+1)
2730 real larg_detr(klon,
klev+1)
2732 real pu_therm(klon,
klev),pv_therm(klon,
klev)
2733 real fm(klon,
klev+1),entr(klon,
klev)
2734 real fmc(klon,
klev+1)
2736 real zcor,zdelta,zcvm5,qlbef
2737 real tbef(klon),qsatbef(klon)
2738 real dqsat_dt,
dt,num,denom
2739 REAL reps,rlvcp,ddt0
2745 real f_star(klon,
klev+1),entr_star(klon,
klev)
2746 real entr_star_tot(klon),entr_star2(klon)
2747 real f(klon), f0(klon)
2748 real zlevinter(klon)
2750 data first /.false./
2759 character (len=20) :: modname=
'thermcell_eau'
2760 character (len=80) :: abort_message
2762 LOGICAL vtest(klon),down
2779 IF(ngrid.NE.klon)
THEN
2781 print*,
'STOP dans convadj'
2782 print*,
'ngrid =',ngrid
2783 print*,
'klon =',klon
2816 zdelta=max(0.,sign(1.,rtt-tbef(ig)))
2817 qsatbef(ig)= r2es * foeew(tbef(ig),zdelta)/pplev(ig,
ll)
2818 qsatbef(ig)=min(0.5,qsatbef(ig))
2819 zcor=1./(1.-retv*qsatbef(ig))
2820 qsatbef(ig)=qsatbef(ig)*zcor
2821 zsat(ig) = (max(0.,po(ig,
ll)-qsatbef(ig)) .gt. 0.00001)
2826 qlbef=max(0.,po(ig,
ll)-qsatbef(ig))
2828 dt = 0.5*rlvcp*qlbef
2830 do while (
dt.gt.ddt0)
2832 tbef(ig)=tbef(ig)+
dt
2833 zdelta=max(0.,sign(1.,rtt-tbef(ig)))
2834 qsatbef(ig)= r2es * foeew(tbef(ig),zdelta)/pplev(ig,
ll)
2835 qsatbef(ig)=min(0.5,qsatbef(ig))
2836 zcor=1./(1.-retv*qsatbef(ig))
2837 qsatbef(ig)=qsatbef(ig)*zcor
2839 qlbef=po(ig,
ll)-qsatbef(ig)
2841 zdelta=max(0.,sign(1.,rtt-tbef(ig)))
2842 zcvm5=r5les*(1.-zdelta) + r5ies*zdelta
2843 zcor=1./(1.-retv*qsatbef(ig))
2844 dqsat_dt=foede(tbef(ig),zdelta,zcvm5,qsatbef(ig),zcor)
2845 num=-tbef(ig)+pt(ig,
ll)+rlvcp*qlbef
2846 denom=1.+rlvcp*dqsat_dt
2850 zl(ig,
ll) = max(0.,qlbef)
2852 zh(ig,
ll) = pt(ig,
ll)+rlvcp*zl(ig,
ll)
2853 zo(ig,
ll) = po(ig,
ll)-zl(ig,
ll)
2863 print*,
'0 OK convect8'
2867 zpspsk(ig,
l)=(
pplay(ig,
l)/pplev(ig,1))**rkappa
2876 ztv(ig,
l)=zh(ig,
l)/zpspsk(ig,
l)
2881 zthl(ig,
l)=pt(ig,
l)/zpspsk(ig,
l)
2910 zlev(ig,
l)=0.5*(pphi(ig,
l)+pphi(ig,
l-1))/rg
2937 rhobarz(ig,
l)=0.5*(rho(ig,
l)+rho(ig,
l-1))
3025 s
l.ge.lmin(ig).and.
l.le.lentr(ig))
then
3026 entr_star(ig,
l)=(
ztv(ig,
l)-
ztv(ig,
l+1))*
3027 s(zlev(ig,
l+1)-zlev(ig,
l))
3033 if (lmin(ig).gt.1)
then
3041 entr_star_tot(ig)=0.
3045 entr_star_tot(ig)=entr_star_tot(ig)+entr_star(ig,
k)
3051 ztva(ig,
k)=
ztv(ig,
k)
3058 ztva(ig,
k)=
ztv(ig,
k)
3059 ztla(ig,
k)=zthl(ig,
k)
3092 s .and.entr_star(ig,
l).gt.1.e-10
3093 s .and.
zw2(ig,
l).lt.1e-10)
then
3095 ztla(ig,
l)=zthl(ig,
l)
3099 f_star(ig,
l+1)=entr_star(ig,
l)
3102 s *(zlev(ig,
l+1)-zlev(ig,
l))
3103 s *0.4*pphi(ig,
l)/(pphi(ig,
l+1)-pphi(ig,
l))
3105 else if ((
zw2(ig,
l).ge.1e-10).and.
3106 s(f_star(ig,
l)+entr_star(ig,
l).gt.1.e-10))
then
3107 f_star(ig,
l+1)=f_star(ig,
l)+entr_star(ig,
l)
3110 ztla(ig,
l)=(f_star(ig,
l)*ztla(ig,
l-1)+entr_star(ig,
l)
3111 s *zthl(ig,
l))/f_star(ig,
l+1)
3113 s *po(ig,
l))/f_star(ig,
l+1)
3119 tbef(ig)=ztla(ig,
l)*zpspsk(ig,
l)
3120 zdelta=max(0.,sign(1.,rtt-tbef(ig)))
3121 qsatbef(ig)= r2es * foeew(tbef(ig),zdelta)/pplev(ig,
l)
3122 qsatbef(ig)=min(0.5,qsatbef(ig))
3123 zcor=1./(1.-retv*qsatbef(ig))
3124 qsatbef(ig)=qsatbef(ig)*zcor
3125 zsat(ig) = (max(0.,
zqta(ig,
l)-qsatbef(ig)) .gt. 0.00001)
3130 qlbef=max(0.,
zqta(ig,
l)-qsatbef(ig))
3131 dt = 0.5*rlvcp*qlbef
3132 do while (
dt.gt.ddt0)
3133 tbef(ig)=tbef(ig)+
dt
3134 zdelta=max(0.,sign(1.,rtt-tbef(ig)))
3135 qsatbef(ig)= r2es * foeew(tbef(ig),zdelta)/pplev(ig,
l)
3136 qsatbef(ig)=min(0.5,qsatbef(ig))
3137 zcor=1./(1.-retv*qsatbef(ig))
3138 qsatbef(ig)=qsatbef(ig)*zcor
3139 qlbef=
zqta(ig,
l)-qsatbef(ig)
3141 zdelta=max(0.,sign(1.,rtt-tbef(ig)))
3142 zcvm5=r5les*(1.-zdelta) + r5ies*zdelta
3143 zcor=1./(1.-retv*qsatbef(ig))
3144 dqsat_dt=foede(tbef(ig),zdelta,zcvm5,qsatbef(ig),zcor)
3145 num=-tbef(ig)+ztla(ig,
l)*zpspsk(ig,
l)+rlvcp*qlbef
3146 denom=1.+rlvcp*dqsat_dt
3149 zqla(ig,
l) = max(0.,
zqta(ig,
l)-qsatbef(ig))
3153 ztva(ig,
l) = ztla(ig,
l)*zpspsk(ig,
l)+rlvcp*zqla(ig,
l)
3154 ztva(ig,
l) = ztva(ig,
l)/zpspsk(ig,
l)
3155 ztva(ig,
l) = ztva(ig,
l)*(1.+retv*(
zqta(ig,
l)
3156 s -zqla(ig,
l))-zqla(ig,
l))
3160 if (
zw2(ig,
l).ge.1.e-10.and.
3161 s f_star(ig,
l)+entr_star(ig,
l).gt.1.e-10)
then
3165 zw2(ig,
l+1)=
zw2(ig,
l)*(f_star(ig,
l)/f_star(ig,
l+1))**2+
3166 s 2.*rg*(ztva(ig,
l)-
ztv(ig,
l))/
ztv(ig,
l)
3167 s *(zlev(ig,
l+1)-zlev(ig,
l))
3170 if (
zw2(ig,
l+1).lt.0.)
then
3176 wa_moy(ig,
l+1)=sqrt(
zw2(ig,
l+1))
3178 if (wa_moy(ig,
l+1).gt.wmaxa(ig))
then
3181 wmaxa(ig)=wa_moy(ig,
l+1)
3191 do l=
nlay,lentr(ig)+1,-1
3192 if (
zw2(ig,
l).le.1.e-10)
then
3199 if (lmin(ig).gt.1)
then
3212 if (
l.le.lmax(ig))
then
3214 wmax(ig)=max(wmax(ig),
zw2(ig,
l))
3224 zlevinter(ig)=zlev(ig,1)
3228 zlevinter(ig)=(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))*
3229 s linter(ig)+zlev(ig,lmax(ig))-lmax(ig)*(zlev(ig,lmax(ig)+1)
3230 s -zlev(ig,lmax(ig)))
3231 zmax(ig)=max(
zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig)))
3239 if (entr_star_tot(ig).LT.1.e-10)
then
3242 do k=lmin(ig),lentr(ig)
3243 entr_star2(ig)=entr_star2(ig)+entr_star(ig,
k)**2
3244 s /(rho(ig,
k)*(zlev(ig,
k+1)-zlev(ig,
k)))
3247 f(ig)=wmax(ig)/(
zmax(ig)*r_aspect*entr_star2(ig))
3248 s *entr_star_tot(ig)
3251 f(ig)=
f(ig)+(f0(ig)-
f(ig))*exp(-ptimestep/
zmax(ig)
3262 entr(ig,
k)=
f(ig)*entr_star(ig,
k)
3268 fmc(ig,
l+1)=fmc(ig,
l)+entr(ig,
l)
3288 if (
l.le.lmaxa(ig))
then
3289 zw=max(wa_moy(ig,
l),1.e-10)
3290 larg_cons(ig,
l)=
zmax(ig)*r_aspect
3291 s *fmc(ig,
l)/(rhobarz(ig,
l)*zw)
3298 if (
l.le.lmaxa(ig))
then
3301 larg_detr(ig,
l)=sqrt(l_mix*zlev(ig,
l))
3323 if (lmix(ig).gt.1.)
then
3324 zmix(ig)=((
zw2(ig,lmix(ig)-1)-
zw2(ig,lmix(ig)))
3325 s *((zlev(ig,lmix(ig)))**2-(zlev(ig,lmix(ig)+1))**2)
3326 s -(
zw2(ig,lmix(ig))-
zw2(ig,lmix(ig)+1))
3327 s *((zlev(ig,lmix(ig)-1))**2-(zlev(ig,lmix(ig)))**2))
3328 s /(2.*((
zw2(ig,lmix(ig)-1)-
zw2(ig,lmix(ig)))
3329 s *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1)))
3330 s -(
zw2(ig,lmix(ig))-
zw2(ig,lmix(ig)+1))
3331 s *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))))
3340 if (
zmix(ig).ge.zlev(ig,
l).and.
3341 s
zmix(ig).lt.zlev(ig,
l+1))
then
3349 if(larg_cons(ig,
l).gt.1.)
then
3351 fraca(ig,
l)=(larg_cons(ig,
l)-larg_detr(ig,
l))
3352 s /(r_aspect*
zmax(ig))
3357 fracc(ig,
l)=larg_cons(ig,
l)/(r_aspect*
zmax(ig))
3368 fracazmix(ig)=(
fraca(ig,lmix(ig)+1)-
fraca(ig,lmix(ig)))/
3369 s(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))*
zmix(ig)
3370 s +
fraca(ig,lmix(ig))-zlev(ig,lmix(ig))*(
fraca(ig,lmix(ig)+1)
3371 s -
fraca(ig,lmix(ig)))/(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))
3376 if(larg_cons(ig,
l).gt.1.)
then
3377 if (
l.gt.lmix(ig))
then
3379 if (idetr.eq.0)
then
3380 fraca(ig,
l)=fracazmix(ig)
3381 else if (idetr.eq.1)
then
3382 fraca(ig,
l)=fracazmix(ig)*xxx(ig,
l)
3383 else if (idetr.eq.2)
then
3384 fraca(ig,
l)=fracazmix(ig)*(1.-(1.-xxx(ig,
l))**2)
3386 fraca(ig,
l)=fracazmix(ig)*xxx(ig,
l)**2
3392 fracc(ig,
l)=larg_cons(ig,
l)/(r_aspect*
zmax(ig))
3413 fm(ig,
l)=
fraca(ig,
l)*wa_moy(ig,
l)*rhobarz(ig,
l)
3415 if (entr(ig,
l-1).lt.1e-10.and.fm(ig,
l).gt.fm(ig,
l-1)
3416 s .and.
l.gt.lmix(ig))
then
3424 if(fracd(ig,
l).lt.0.1)
then
3425 abort_message =
'fracd trop petit'
3429 wd(ig,
l)=fm(ig,
l)/(fracd(ig,
l)*rhobarz(ig,
l))
3437 masse(ig,
l)=(pplev(ig,
l)-pplev(ig,
l+1))/rg
3451 if(fm(ig,
l+1)*ptimestep.gt.masse(ig,
l)
3452 s .and.fm(ig,
l+1)*ptimestep.gt.masse(ig,
l+1))
then
3462 if(entr(ig,
l)*ptimestep.gt.masse(ig,
l))
then
3472 if(.not.fm(ig,
l).ge.0..or..not.fm(ig,
l).le.10.)
then
3476 if(.not.masse(ig,
l).ge.1.e-10
3477 s .or..not.masse(ig,
l).le.1.e4)
then
3487 if(.not.entr(ig,
l).ge.0..or..not.entr(ig,
l).le.10.)
then
3497 fm0=fm0+ptimestep*(fm-fm0)/tho
3498 entr0=entr0+ptimestep*(entr-entr0)/tho
3533 zf=0.5*(fracc(ig,
l)+fracc(ig,
l+1))
3536 wth2(ig,
l)=zf2*(0.5*(wa_moy(ig,
l)+wa_moy(ig,
l+1)))**2
3573 zla(ig,
l)=(1.-fracd(ig,
l))*
zmax(ig)
3574 zld(ig,
l)=fracd(ig,
l)*
zmax(ig)
3575 if(1.-fracd(ig,
l).gt.1.e-10)
3576 s zwa(ig,
l)=wd(ig,
l)*fracd(ig,
l)/(1.-fracd(ig,
l))
3582 detr(ig,
l)=fm(ig,
l)+entr(ig,
l)-fm(ig,
l+1)
3583 if (
detr(ig,
l).lt.0.)
then
3584 entr(ig,
l)=entr(ig,
l)-
detr(ig,
l)
3599 CALL writeg1d(1,
nlay,wd,
'wd ',
'wd ')
3600 CALL writeg1d(1,
nlay,zwa,
'wa ',
'wa ')
3601 CALL writeg1d(1,
nlay,fracd,
'fracd ',
'fracd ')
3602 CALL writeg1d(1,
nlay,
fraca,
'fraca ',
'fraca ')
3603 CALL writeg1d(1,
nlay,wa_moy,
'wam ',
'wam ')
3604 CALL writeg1d(1,
nlay,zla,
'la ',
'la ')
3605 CALL writeg1d(1,
nlay,zld,
'ld ',
'ld ')
3606 CALL writeg1d(1,
nlay,pt,
'pt ',
'pt ')
3607 CALL writeg1d(1,
nlay,zh,
'zh ',
'zh ')
3608 CALL writeg1d(1,
nlay,
zha,
'zha ',
'zha ')
3609 CALL writeg1d(1,
nlay,zu,
'zu ',
'zu ')
3610 CALL writeg1d(1,
nlay,
zv,
'zv ',
'zv ')
3611 CALL writeg1d(1,
nlay,zo,
'zo ',
'zo ')
3612 CALL writeg1d(1,
nlay,wh,
'wh ',
'wh ')
3613 CALL writeg1d(1,
nlay,wu,
'wu ',
'wu ')
3614 CALL writeg1d(1,
nlay,wv,
'wv ',
'wv ')
3615 CALL writeg1d(1,
nlay,wo,
'w15uo ',
'wXo ')
3616 CALL writeg1d(1,
nlay,zdhadj,
'zdhadj ',
'zdhadj ')
3617 CALL writeg1d(1,
nlay,
pduadj,
'pduadj ',
'pduadj ')
3618 CALL writeg1d(1,
nlay,pdvadj,
'pdvadj ',
'pdvadj ')
3619 CALL writeg1d(1,
nlay,
pdoadj,
'pdoadj ',
'pdoadj ')
3620 CALL writeg1d(1,
nlay,entr ,
'entr ',
'entr ')
3621 CALL writeg1d(1,
nlay,
detr ,
'detr ',
'detr ')
3622 CALL writeg1d(1,
nlay,fm ,
'fm ',
'fm ')
3624 CALL writeg1d(1,
nlay,pdtadj,
'pdtadj ',
'pdtadj ')
3625 CALL writeg1d(1,
nlay,
pplay,
'pplay ',
'pplay ')
3626 CALL writeg1d(1,
nlay,pplev,
'pplev ',
'pplev ')
3630 call dt2f(pplev,
pplay,pt,pdtadj,wh)
3631 CALL writeg1d(1,
nlay,wh,
'wh2 ',
'wh2 ')
3637 print*,
'Debut des wrgradsfi'
3692 zsortie1d(:)=lmax(:)
3693 call
wrgradsfi(1,1,zsortie1d,
'lmax ',
'lmax ')
3694 call
wrgradsfi(1,1,wmax,
'wmax ',
'wmax ')
3695 zsortie1d(:)=lmix(:)
3696 call
wrgradsfi(1,1,zsortie1d,
'lmix ',
'lmix ')
3697 zsortie1d(:)=lentr(:)
3698 call
wrgradsfi(1,1,zsortie1d,
'lentr ',
'lentr ')
3703 write(str2,
'(i2.2)')
k
3707 zsortie(ig,
l)=wa(ig,
k,
l)
3713 zsortie(ig,
l)=larg_part(ig,
k,
l)
3723 print*,
'Fin des wrgradsfi'
3740 s ,r_aspect,l_mix,w2di,tho)
3769 #include "dimensions.h"
3776 INTEGER ngrid,
nlay,w2di
3778 real ptimestep,l_mix,r_aspect
3779 REAL pt(ngrid,
nlay),pdtadj(ngrid,
nlay)
3781 REAL pv(ngrid,
nlay),pdvadj(ngrid,
nlay)
3784 real pphi(ngrid,
nlay)
3794 INTEGER ig,
k,
l,lmaxa(klon),lmix(klon)
3795 real zsortie1d(klon)
3797 INTEGER lmax(klon),lmin(klon),lentr(klon)
3799 real zmix(klon), fracazmix(klon)
3804 REAL zh(klon,
klev),zdhadj(klon,
klev)
3807 REAL wh(klon,
klev+1)
3809 real zla(klon,
klev+1)
3810 real zwa(klon,
klev+1)
3811 real zld(klon,
klev+1)
3812 real zwd(klon,
klev+1)
3813 real zsortie(klon,
klev)
3819 real wa_moy(klon,
klev+1)
3821 real fracc(klon,
klev+1)
3827 integer isplit,nsplit,ialt
3834 real rho(klon,
klev),rhobarz(klon,
klev+1),masse(klon,
klev)
3835 real zpspsk(klon,
klev)
3838 real wmax(klon),wmaxa(klon)
3840 real wd(klon,
klev+1)
3842 real fracd(klon,
klev+1)
3843 real xxx(klon,
klev+1)
3844 real larg_cons(klon,
klev+1)
3845 real larg_detr(klon,
klev+1)
3847 real pu_therm(klon,
klev),pv_therm(klon,
klev)
3848 real fm(klon,
klev+1),entr(klon,
klev)
3849 real fmc(klon,
klev+1)
3852 real f_star(klon,
klev+1),entr_star(klon,
klev)
3853 real entr_star_tot(klon),entr_star2(klon)
3854 real f(klon), f0(klon)
3855 real zlevinter(klon)
3857 data first /.false./
3865 character (len=20) :: modname=
'thermcell'
3866 character (len=80) :: abort_message
3868 LOGICAL vtest(klon),down
3883 IF(ngrid.NE.klon)
THEN
3885 print*,
'STOP dans convadj'
3886 print*,
'ngrid =',ngrid
3887 print*,
'klon =',klon
3894 print*,
'0 OK convect8'
3898 zpspsk(ig,
l)=(
pplay(ig,
l)/pplev(ig,1))**rkappa
3899 zh(ig,
l)=pt(ig,
l)/zpspsk(ig,
l)
3903 ztv(ig,
l)=zh(ig,
l)*(1.+0.61*zo(ig,
l))
3907 print*,
'1 OK convect8'
3931 zlev(ig,
l)=0.5*(pphi(ig,
l)+pphi(ig,
l-1))/rg
3951 rho(ig,
l)=
pplay(ig,
l)/(zpspsk(ig,
l)*rd*zh(ig,
l))
3957 rhobarz(ig,
l)=0.5*(rho(ig,
l)+rho(ig,
l-1))
4045 s
l.ge.lmin(ig).and.
l.le.lentr(ig))
then
4046 entr_star(ig,
l)=(
ztv(ig,
l)-
ztv(ig,
l+1))*
4047 s(zlev(ig,
l+1)-zlev(ig,
l))
4053 if (lmin(ig).gt.5)
then
4061 entr_star_tot(ig)=0.
4065 entr_star_tot(ig)=entr_star_tot(ig)+entr_star(ig,
k)
4069 print*,
'fin calcul entr_star'
4072 ztva(ig,
k)=
ztv(ig,
k)
4102 s .and.entr_star(ig,
l).gt.1.e-10
4103 s .and.
zw2(ig,
l).lt.1e-10)
then
4104 f_star(ig,
l+1)=entr_star(ig,
l)
4107 s *(zlev(ig,
l+1)-zlev(ig,
l))
4108 s *0.4*pphi(ig,
l)/(pphi(ig,
l+1)-pphi(ig,
l))
4110 else if ((
zw2(ig,
l).ge.1e-10).and.
4111 s(f_star(ig,
l)+entr_star(ig,
l).gt.1.e-10))
then
4112 f_star(ig,
l+1)=f_star(ig,
l)+entr_star(ig,
l)
4113 ztva(ig,
l)=(f_star(ig,
l)*ztva(ig,
l-1)+entr_star(ig,
l)
4114 s *
ztv(ig,
l))/f_star(ig,
l+1)
4115 zw2(ig,
l+1)=
zw2(ig,
l)*(f_star(ig,
l)/f_star(ig,
l+1))**2+
4116 s 2.*rg*(ztva(ig,
l)-
ztv(ig,
l))/
ztv(ig,
l)
4117 s *(zlev(ig,
l+1)-zlev(ig,
l))
4120 if (
zw2(ig,
l+1).lt.0.)
then
4122 if (abs(
zw2(ig,
l+1)-
zw2(ig,
l)).lt.1e-10)
then
4130 if (
zw2(ig,
l+1).lt.0.)
then
4133 wa_moy(ig,
l+1)=sqrt(
zw2(ig,
l+1))
4135 if (wa_moy(ig,
l+1).gt.wmaxa(ig))
then
4138 wmaxa(ig)=wa_moy(ig,
l+1)
4142 print*,
'fin calcul zw2'
4149 do l=
nlay,lentr(ig)+1,-1
4150 if (
zw2(ig,
l).le.1.e-10)
then
4157 if (lmin(ig).gt.5)
then
4170 if (
l.le.lmax(ig))
then
4171 if (
zw2(ig,
l).lt.0.)
then
4175 wmax(ig)=max(wmax(ig),
zw2(ig,
l))
4185 zlevinter(ig)=zlev(ig,1)
4189 zlevinter(ig)=(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))*
4190 s linter(ig)+zlev(ig,lmax(ig))-lmax(ig)*(zlev(ig,lmax(ig)+1)
4191 s -zlev(ig,lmax(ig)))
4192 zmax(ig)=max(
zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig)))
4195 print*,
'avant fermeture'
4201 if (entr_star_tot(ig).LT.1.e-10)
then
4204 do k=lmin(ig),lentr(ig)
4205 entr_star2(ig)=entr_star2(ig)+entr_star(ig,
k)**2
4206 s /(rho(ig,
k)*(zlev(ig,
k+1)-zlev(ig,
k)))
4209 f(ig)=wmax(ig)/(max(500.,
zmax(ig))*r_aspect
4210 s *entr_star2(ig))*entr_star_tot(ig)
4220 print*,
'apres fermeture'
4225 entr(ig,
k)=
f(ig)*entr_star(ig,
k)
4231 fmc(ig,
l+1)=fmc(ig,
l)+entr(ig,
l)
4251 if (
l.le.lmaxa(ig))
then
4252 zw=max(wa_moy(ig,
l),1.e-10)
4253 larg_cons(ig,
l)=
zmax(ig)*r_aspect
4254 s *fmc(ig,
l)/(rhobarz(ig,
l)*zw)
4261 if (
l.le.lmaxa(ig))
then
4264 if ((l_mix*zlev(ig,
l)).lt.0.)
then
4265 print*,
'pb l_mix*zlev<0'
4267 larg_detr(ig,
l)=sqrt(l_mix*zlev(ig,
l))
4289 if (lmix(ig).gt.1.)
then
4291 if (((
zw2(ig,lmix(ig)-1)-
zw2(ig,lmix(ig)))
4292 s *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1)))
4293 s -(
zw2(ig,lmix(ig))-
zw2(ig,lmix(ig)+1))
4294 s *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))).gt.1e-10)
4297 zmix(ig)=((
zw2(ig,lmix(ig)-1)-
zw2(ig,lmix(ig)))
4298 s *((zlev(ig,lmix(ig)))**2-(zlev(ig,lmix(ig)+1))**2)
4299 s -(
zw2(ig,lmix(ig))-
zw2(ig,lmix(ig)+1))
4300 s *((zlev(ig,lmix(ig)-1))**2-(zlev(ig,lmix(ig)))**2))
4301 s /(2.*((
zw2(ig,lmix(ig)-1)-
zw2(ig,lmix(ig)))
4302 s *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1)))
4303 s -(
zw2(ig,lmix(ig))-
zw2(ig,lmix(ig)+1))
4304 s *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))))
4306 zmix(ig)=zlev(ig,lmix(ig))
4313 if ((
zmax(ig)-
zmix(ig)).lt.0.)
then
4322 if (
zmix(ig).ge.zlev(ig,
l).and.
4323 s
zmix(ig).lt.zlev(ig,
l+1))
then
4331 if(larg_cons(ig,
l).gt.1.)
then
4333 fraca(ig,
l)=(larg_cons(ig,
l)-larg_detr(ig,
l))
4334 s /(r_aspect*
zmax(ig))
4339 fracc(ig,
l)=larg_cons(ig,
l)/(r_aspect*
zmax(ig))
4350 fracazmix(ig)=(
fraca(ig,lmix(ig)+1)-
fraca(ig,lmix(ig)))/
4351 s(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))*
zmix(ig)
4352 s +
fraca(ig,lmix(ig))-zlev(ig,lmix(ig))*(
fraca(ig,lmix(ig)+1)
4353 s -
fraca(ig,lmix(ig)))/(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))
4358 if(larg_cons(ig,
l).gt.1.)
then
4359 if (
l.gt.lmix(ig))
then
4361 if (
zmax(ig)-
zmix(ig).lt.1.e-10)
then
4363 xxx(ig,
l)=(lmaxa(ig)+1.-
l)/(lmaxa(ig)+1.-lmix(ig))
4367 if (idetr.eq.0)
then
4368 fraca(ig,
l)=fracazmix(ig)
4369 else if (idetr.eq.1)
then
4370 fraca(ig,
l)=fracazmix(ig)*xxx(ig,
l)
4371 else if (idetr.eq.2)
then
4372 fraca(ig,
l)=fracazmix(ig)*(1.-(1.-xxx(ig,
l))**2)
4374 fraca(ig,
l)=fracazmix(ig)*xxx(ig,
l)**2
4380 fracc(ig,
l)=larg_cons(ig,
l)/(r_aspect*
zmax(ig))
4386 print*,
'fin calcul fraca'
4402 fm(ig,
l)=
fraca(ig,
l)*wa_moy(ig,
l)*rhobarz(ig,
l)
4404 if (entr(ig,
l-1).lt.1e-10.and.fm(ig,
l).gt.fm(ig,
l-1)
4405 s .and.
l.gt.lmix(ig))
then
4413 if(fracd(ig,
l).lt.0.1)
then
4414 abort_message =
'fracd trop petit'
4418 wd(ig,
l)=fm(ig,
l)/(fracd(ig,
l)*rhobarz(ig,
l))
4426 masse(ig,
l)=(pplev(ig,
l)-pplev(ig,
l+1))/rg
4430 print*,
'12 OK convect8'
4440 if(fm(ig,
l+1)*ptimestep.gt.masse(ig,
l)
4441 s .and.fm(ig,
l+1)*ptimestep.gt.masse(ig,
l+1))
then
4451 if(entr(ig,
l)*ptimestep.gt.masse(ig,
l))
then
4461 if(.not.fm(ig,
l).ge.0..or..not.fm(ig,
l).le.10.)
then
4465 if(.not.masse(ig,
l).ge.1.e-10
4466 s .or..not.masse(ig,
l).le.1.e4)
then
4476 if(.not.entr(ig,
l).ge.0..or..not.entr(ig,
l).le.10.)
then
4488 detr(ig,
l)=fm(ig,
l)+entr(ig,
l)-fm(ig,
l+1)
4489 if (
detr(ig,
l).lt.0.)
then
4490 entr(ig,
l)=entr(ig,
l)-
detr(ig,
l)
4498 fm0=fm0+ptimestep*(fm-fm0)/tho
4499 entr0=entr0+ptimestep*(entr-entr0)/tho
4530 zf=0.5*(fracc(ig,
l)+fracc(ig,
l+1))
4533 wth2(ig,
l)=zf2*(0.5*(wa_moy(ig,
l)+wa_moy(ig,
l+1)))**2
4543 pdtadj(ig,
l)=zdhadj(ig,
l)*zpspsk(ig,
l)
4561 print*,
'14 OK convect8'
4569 zla(ig,
l)=(1.-fracd(ig,
l))*
zmax(ig)
4570 zld(ig,
l)=fracd(ig,
l)*
zmax(ig)
4571 if(1.-fracd(ig,
l).gt.1.e-10)
4572 s zwa(ig,
l)=wd(ig,
l)*fracd(ig,
l)/(1.-fracd(ig,
l))
4596 CALL writeg1d(1,
nlay,wd,
'wd ',
'wd ')
4597 CALL writeg1d(1,
nlay,zwa,
'wa ',
'wa ')
4598 CALL writeg1d(1,
nlay,fracd,
'fracd ',
'fracd ')
4599 CALL writeg1d(1,
nlay,
fraca,
'fraca ',
'fraca ')
4600 CALL writeg1d(1,
nlay,wa_moy,
'wam ',
'wam ')
4601 CALL writeg1d(1,
nlay,zla,
'la ',
'la ')
4602 CALL writeg1d(1,
nlay,zld,
'ld ',
'ld ')
4603 CALL writeg1d(1,
nlay,pt,
'pt ',
'pt ')
4604 CALL writeg1d(1,
nlay,zh,
'zh ',
'zh ')
4605 CALL writeg1d(1,
nlay,
zha,
'zha ',
'zha ')
4606 CALL writeg1d(1,
nlay,zu,
'zu ',
'zu ')
4607 CALL writeg1d(1,
nlay,
zv,
'zv ',
'zv ')
4608 CALL writeg1d(1,
nlay,zo,
'zo ',
'zo ')
4609 CALL writeg1d(1,
nlay,wh,
'wh ',
'wh ')
4610 CALL writeg1d(1,
nlay,wu,
'wu ',
'wu ')
4611 CALL writeg1d(1,
nlay,wv,
'wv ',
'wv ')
4612 CALL writeg1d(1,
nlay,wo,
'w15uo ',
'wXo ')
4613 CALL writeg1d(1,
nlay,zdhadj,
'zdhadj ',
'zdhadj ')
4614 CALL writeg1d(1,
nlay,
pduadj,
'pduadj ',
'pduadj ')
4615 CALL writeg1d(1,
nlay,pdvadj,
'pdvadj ',
'pdvadj ')
4616 CALL writeg1d(1,
nlay,
pdoadj,
'pdoadj ',
'pdoadj ')
4617 CALL writeg1d(1,
nlay,entr ,
'entr ',
'entr ')
4618 CALL writeg1d(1,
nlay,
detr ,
'detr ',
'detr ')
4619 CALL writeg1d(1,
nlay,fm ,
'fm ',
'fm ')
4621 CALL writeg1d(1,
nlay,pdtadj,
'pdtadj ',
'pdtadj ')
4622 CALL writeg1d(1,
nlay,
pplay,
'pplay ',
'pplay ')
4623 CALL writeg1d(1,
nlay,pplev,
'pplev ',
'pplev ')
4627 call dt2f(pplev,
pplay,pt,pdtadj,wh)
4628 CALL writeg1d(1,
nlay,wh,
'wh2 ',
'wh2 ')
4634 print*,
'Debut des wrgradsfi'
4680 zsortie1d(:)=lmax(:)
4681 call
wrgradsfi(1,1,zsortie1d,
'lmax ',
'lmax ')
4682 call
wrgradsfi(1,1,wmax,
'wmax ',
'wmax ')
4683 zsortie1d(:)=lmix(:)
4684 call
wrgradsfi(1,1,zsortie1d,
'lmix ',
'lmix ')
4685 zsortie1d(:)=lentr(:)
4686 call
wrgradsfi(1,1,zsortie1d,
'lentr ',
'lentr ')
4691 write(str2,
'(i2.2)')
k
4695 zsortie(ig,
l)=wa(ig,
k,
l)
4701 zsortie(ig,
l)=larg_part(ig,
k,
l)
4711 print*,
'Fin des wrgradsfi'
4718 print*,
'19 OK convect8'
4735 #include "dimensions.h"
4741 real masse(ngrid,
nlay),fm(ngrid,
nlay+1)
4742 real entr(ngrid,
nlay)
4754 detr(ig,
k)=fm(ig,
k)-fm(ig,
k+1)+entr(ig,
k)
4756 if (
detr(ig,
k).lt.0.)
then
4757 entr(ig,
k)=entr(ig,
k)-
detr(ig,
k)
4762 if (fm(ig,
k+1).lt.0.)
then
4765 if (entr(ig,
k).lt.0.)
then
4778 if ((fm(ig,
k+1)+
detr(ig,
k))*ptimestep.gt.
4779 s 1.e-5*masse(ig,
k))
then
4780 qa(ig,
k)=(fm(ig,
k)*qa(ig,
k-1)+entr(ig,
k)*
q(ig,
k))
4781 s /(fm(ig,
k+1)+
detr(ig,
k))
4785 if (qa(ig,
k).lt.0.)
then
4788 if (
q(ig,
k).lt.0.)
then
4797 wqd(ig,
k)=fm(ig,
k)*
q(ig,
k)
4798 if (wqd(ig,
k).lt.0.)
then
4810 dq(ig,
k)=(
detr(ig,
k)*qa(ig,
k)-entr(ig,
k)*
q(ig,
k)
4811 s -wqd(ig,
k)+wqd(ig,
k+1))
4835 #include "dimensions.h"
4841 real masse(ngrid,
nlay),fm(ngrid,
nlay+1)
4844 real entr(ngrid,
nlay)
4853 real wvd(klon,
klev+1),wud(klon,
klev+1)
4864 detr(ig,
k)=fm(ig,
k)-fm(ig,
k+1)+entr(ig,
k)
4876 if ((fm(ig,
k+1)+
detr(ig,
k))*ptimestep.gt.
4877 s 1.e-5*masse(ig,
k))
then
4886 dua=ua(ig,
k-1)-
u(ig,
k-1)
4887 dva=va(ig,
k-1)-
v(ig,
k-1)
4889 gamma(ig,
k)=gamma0*sqrt(dua**2+dva**2)
4890 ua(ig,
k)=(fm(ig,
k)*ua(ig,
k-1)
4893 va(ig,
k)=(fm(ig,
k)*va(ig,
k-1)
4897 dua=ua(ig,
k)-
u(ig,
k)
4898 dva=va(ig,
k)-
v(ig,
k)
4910 wud(ig,
k)=fm(ig,
k)*
u(ig,
k)
4911 wvd(ig,
k)=fm(ig,
k)*
v(ig,
k)
4925 s -wud(ig,
k)+wud(ig,
k+1))
4929 s -wvd(ig,
k)+wvd(ig,
k+1))
4949 #include "dimensions.h"
4955 real masse(ngrid,
nlay),fm(ngrid,
nlay+1)
4961 real qe(klon,
klev),zf,zf2
4969 detr(ig,
k)=fm(ig,
k)-fm(ig,
k+1)+entr(ig,
k)
4981 if ((fm(ig,
k+1)+
detr(ig,
k))*ptimestep.gt.
4982 s 1.e-5*masse(ig,
k))
then
4985 qa(ig,
k)=(fm(ig,
k)*qa(ig,
k-1)+zf2*entr(ig,
k)*
q(ig,
k))
4986 s /(fm(ig,
k+1)+
detr(ig,
k)+entr(ig,
k)*zf*zf2)
4987 qe(ig,
k)=(
q(ig,
k)-zf*qa(ig,
k))*zf2
4998 wqd(ig,
k)=fm(ig,
k)*qe(ig,
k)
5008 dq(ig,
k)=(
detr(ig,
k)*qa(ig,
k)-entr(ig,
k)*qe(ig,
k)
5009 s -wqd(ig,
k)+wqd(ig,
k+1))
5030 #include "dimensions.h"
5036 real masse(ngrid,
nlay),fm(ngrid,
nlay+1)
5039 real entr(ngrid,
nlay)
5048 real wvd(klon,
klev+1),wud(klon,
klev+1)
5060 detr(ig,
k)=fm(ig,
k)-fm(ig,
k+1)+entr(ig,
k)
5074 if ((fm(ig,
k+1)+
detr(ig,
k))*ptimestep.gt.
5075 s 1.e-5*masse(ig,
k))
then
5089 dua=ua(ig,
k-1)-
u(ig,
k-1)
5090 dva=va(ig,
k-1)-
v(ig,
k-1)
5095 gamma(ig,
k)=gamma0*sqrt(dua**2+dva**2)
5096 ua(ig,
k)=(fm(ig,
k)*ua(ig,
k-1)
5097 s +(zf2*entr(ig,
k)+
gamma(ig,
k))*
u(ig,
k))
5098 s /(fm(ig,
k+1)+
detr(ig,
k)+entr(ig,
k)*zf*zf2
5100 va(ig,
k)=(fm(ig,
k)*va(ig,
k-1)
5101 s +(zf2*entr(ig,
k)+
gamma(ig,
k))*
v(ig,
k))
5102 s /(fm(ig,
k+1)+
detr(ig,
k)+entr(ig,
k)*zf*zf2
5105 dua=ua(ig,
k)-
u(ig,
k)
5106 dva=va(ig,
k)-
v(ig,
k)
5107 ue(ig,
k)=(
u(ig,
k)-zf*ua(ig,
k))*zf2
5108 ve(ig,
k)=(
v(ig,
k)-zf*va(ig,
k))*zf2
5122 wud(ig,
k)=fm(ig,
k)*ue(ig,
k)
5123 wvd(ig,
k)=fm(ig,
k)*ve(ig,
k)
5136 s -(entr(ig,
k)+
gamma(ig,
k))*ue(ig,
k)
5137 s -wud(ig,
k)+wud(ig,
k+1))
5140 s -(entr(ig,
k)+
gamma(ig,
k))*ve(ig,
k)
5141 s -wvd(ig,
k)+wvd(ig,
k+1))
5149 s ,
pplay,pplev,pphi,zlev
5154 s ,r_aspect,l_mix,w2di,tho)
5183 #include "dimensions.h"
5190 INTEGER ngrid,
nlay,w2di
5192 real ptimestep,l_mix,r_aspect
5193 REAL pt(ngrid,
nlay),pdtadj(ngrid,
nlay)
5195 REAL pv(ngrid,
nlay),pdvadj(ngrid,
nlay)
5198 real pphi(ngrid,
nlay)
5208 INTEGER ig,
k,
l,lmaxa(klon),lmix(klon)
5209 real zsortie1d(klon)
5211 INTEGER lmax(klon),lmin(klon),lentr(klon)
5213 real zmix(klon), fracazmix(klon)
5218 REAL zh(klon,
klev),zdhadj(klon,
klev)
5221 REAL wh(klon,
klev+1)
5223 real zla(klon,
klev+1)
5224 real zwa(klon,
klev+1)
5225 real zld(klon,
klev+1)
5226 real zwd(klon,
klev+1)
5227 real zsortie(klon,
klev)
5233 real wa_moy(klon,
klev+1)
5235 real fracc(klon,
klev+1)
5241 integer isplit,nsplit,ialt
5248 real rho(klon,
klev),rhobarz(klon,
klev+1),masse(klon,
klev)
5249 real zpspsk(klon,
klev)
5252 real wmax(klon),wmaxa(klon)
5254 real wd(klon,
klev+1)
5256 real fracd(klon,
klev+1)
5257 real xxx(klon,
klev+1)
5258 real larg_cons(klon,
klev+1)
5259 real larg_detr(klon,
klev+1)
5261 real pu_therm(klon,
klev),pv_therm(klon,
klev)
5262 real fm(klon,
klev+1),entr(klon,
klev)
5263 real fmc(klon,
klev+1)
5266 real f_star(klon,
klev+1),entr_star(klon,
klev)
5267 real entr_star_tot(klon),entr_star2(klon)
5268 real f(klon), f0(klon)
5269 real zlevinter(klon)
5271 data first /.false./
5279 character (len=20) :: modname=
'thermcell_sec'
5280 character (len=80) :: abort_message
5282 LOGICAL vtest(klon),down
5297 IF(ngrid.NE.klon)
THEN
5299 print*,
'STOP dans convadj'
5300 print*,
'ngrid =',ngrid
5301 print*,
'klon =',klon
5312 zpspsk(ig,
l)=(
pplay(ig,
l)/pplev(ig,1))**rkappa
5313 zh(ig,
l)=pt(ig,
l)/zpspsk(ig,
l)
5317 ztv(ig,
l)=zh(ig,
l)*(1.+0.61*zo(ig,
l))
5345 zlev(ig,
l)=0.5*(pphi(ig,
l)+pphi(ig,
l-1))/rg
5365 rho(ig,
l)=
pplay(ig,
l)/(zpspsk(ig,
l)*rd*zh(ig,
l))
5371 rhobarz(ig,
l)=0.5*(rho(ig,
l)+rho(ig,
l-1))
5459 s
l.ge.lmin(ig).and.
l.le.lentr(ig))
then
5460 entr_star(ig,
l)=(
ztv(ig,
l)-
ztv(ig,
l+1))*
5462 s *sqrt(zlev(ig,
l+1))
5468 if (lmin(ig).gt.1)
then
5476 entr_star_tot(ig)=0.
5480 entr_star_tot(ig)=entr_star_tot(ig)+entr_star(ig,
k)
5487 ztva(ig,
k)=
ztv(ig,
k)
5517 s .and.entr_star(ig,
l).gt.1.e-10
5518 s .and.
zw2(ig,
l).lt.1e-10)
then
5519 f_star(ig,
l+1)=entr_star(ig,
l)
5522 s *(zlev(ig,
l+1)-zlev(ig,
l))
5523 s *0.4*pphi(ig,
l)/(pphi(ig,
l+1)-pphi(ig,
l))
5525 else if ((
zw2(ig,
l).ge.1e-10).and.
5526 s(f_star(ig,
l)+entr_star(ig,
l).gt.1.e-10))
then
5527 f_star(ig,
l+1)=f_star(ig,
l)+entr_star(ig,
l)
5528 ztva(ig,
l)=(f_star(ig,
l)*ztva(ig,
l-1)+entr_star(ig,
l)
5529 s *
ztv(ig,
l))/f_star(ig,
l+1)
5530 zw2(ig,
l+1)=
zw2(ig,
l)*(f_star(ig,
l)/f_star(ig,
l+1))**2+
5531 s 2.*rg*(ztva(ig,
l)-
ztv(ig,
l))/
ztv(ig,
l)
5532 s *(zlev(ig,
l+1)-zlev(ig,
l))
5535 if (
zw2(ig,
l+1).lt.0.)
then
5537 if (abs(
zw2(ig,
l+1)-
zw2(ig,
l)).lt.1e-10)
then
5545 if (
zw2(ig,
l+1).lt.0.)
then
5548 wa_moy(ig,
l+1)=sqrt(
zw2(ig,
l+1))
5550 if (wa_moy(ig,
l+1).gt.wmaxa(ig))
then
5553 wmaxa(ig)=wa_moy(ig,
l+1)
5564 do l=
nlay,lentr(ig)+1,-1
5565 if (
zw2(ig,
l).le.1.e-10)
then
5572 if (lmin(ig).gt.1)
then
5585 if (
l.le.lmax(ig))
then
5586 if (
zw2(ig,
l).lt.0.)
then
5590 wmax(ig)=max(wmax(ig),
zw2(ig,
l))
5600 zlevinter(ig)=zlev(ig,1)
5604 zlevinter(ig)=(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))*
5605 s linter(ig)+zlev(ig,lmax(ig))-lmax(ig)*(zlev(ig,lmax(ig)+1)
5606 s -zlev(ig,lmax(ig)))
5607 zmax(ig)=max(
zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig)))
5616 if (entr_star_tot(ig).LT.1.e-10)
then
5619 do k=lmin(ig),lentr(ig)
5620 entr_star2(ig)=entr_star2(ig)+entr_star(ig,
k)**2
5621 s /(rho(ig,
k)*(zlev(ig,
k+1)-zlev(ig,
k)))
5624 f(ig)=wmax(ig)/(max(500.,
zmax(ig))*r_aspect
5625 s *entr_star2(ig))*entr_star_tot(ig)
5640 entr(ig,
k)=
f(ig)*entr_star(ig,
k)
5646 if ((entr(ig,
l)*ptimestep).gt.(0.9*masse(ig,
l)))
then
5647 entr(ig,
l+1)=entr(ig,
l+1)+entr(ig,
l)
5648 s -0.9*masse(ig,
l)/ptimestep
5649 entr(ig,
l)=0.9*masse(ig,
l)/ptimestep
5657 fmc(ig,
l+1)=fmc(ig,
l)+entr(ig,
l)
5677 if (
l.le.lmaxa(ig))
then
5678 zw=max(wa_moy(ig,
l),1.e-10)
5679 larg_cons(ig,
l)=
zmax(ig)*r_aspect
5680 s *fmc(ig,
l)/(rhobarz(ig,
l)*zw)
5687 if (
l.le.lmaxa(ig))
then
5690 if ((l_mix*zlev(ig,
l)).lt.0.)
then
5695 if (
zw2(ig,
l).gt.1.e-10)
then
5696 larg_detr(ig,
l)=sqrt((l_mix/
zw2(ig,
l))*zlev(ig,
l))
5698 larg_detr(ig,
l)=sqrt(l_mix*zlev(ig,
l))
5722 if (lmix(ig).gt.1.)
then
5724 if (((
zw2(ig,lmix(ig)-1)-
zw2(ig,lmix(ig)))
5725 s *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1)))
5726 s -(
zw2(ig,lmix(ig))-
zw2(ig,lmix(ig)+1))
5727 s *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))).gt.1e-10)
5730 zmix(ig)=((
zw2(ig,lmix(ig)-1)-
zw2(ig,lmix(ig)))
5731 s *((zlev(ig,lmix(ig)))**2-(zlev(ig,lmix(ig)+1))**2)
5732 s -(
zw2(ig,lmix(ig))-
zw2(ig,lmix(ig)+1))
5733 s *((zlev(ig,lmix(ig)-1))**2-(zlev(ig,lmix(ig)))**2))
5734 s /(2.*((
zw2(ig,lmix(ig)-1)-
zw2(ig,lmix(ig)))
5735 s *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1)))
5736 s -(
zw2(ig,lmix(ig))-
zw2(ig,lmix(ig)+1))
5737 s *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))))
5739 zmix(ig)=zlev(ig,lmix(ig))
5746 if ((
zmax(ig)-
zmix(ig)).lt.0.)
then
5755 if (
zmix(ig).ge.zlev(ig,
l).and.
5756 s
zmix(ig).lt.zlev(ig,
l+1))
then
5764 if(larg_cons(ig,
l).gt.1.)
then
5766 fraca(ig,
l)=(larg_cons(ig,
l)-larg_detr(ig,
l))
5767 s /(r_aspect*
zmax(ig))
5772 fracc(ig,
l)=larg_cons(ig,
l)/(r_aspect*
zmax(ig))
5783 fracazmix(ig)=(
fraca(ig,lmix(ig)+1)-
fraca(ig,lmix(ig)))/
5784 s(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))*
zmix(ig)
5785 s +
fraca(ig,lmix(ig))-zlev(ig,lmix(ig))*(
fraca(ig,lmix(ig)+1)
5786 s -
fraca(ig,lmix(ig)))/(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))
5791 if(larg_cons(ig,
l).gt.1.)
then
5792 if (
l.gt.lmix(ig))
then
5794 if (
zmax(ig)-
zmix(ig).lt.1.e-10)
then
5796 xxx(ig,
l)=(lmaxa(ig)+1.-
l)/(lmaxa(ig)+1.-lmix(ig))
5800 if (idetr.eq.0)
then
5801 fraca(ig,
l)=fracazmix(ig)
5802 else if (idetr.eq.1)
then
5803 fraca(ig,
l)=fracazmix(ig)*xxx(ig,
l)
5804 else if (idetr.eq.2)
then
5805 fraca(ig,
l)=fracazmix(ig)*(1.-(1.-xxx(ig,
l))**2)
5807 fraca(ig,
l)=fracazmix(ig)*xxx(ig,
l)**2
5813 fracc(ig,
l)=larg_cons(ig,
l)/(r_aspect*
zmax(ig))
5835 fm(ig,
l)=
fraca(ig,
l)*wa_moy(ig,
l)*rhobarz(ig,
l)
5837 if (entr(ig,
l-1).lt.1e-10.and.fm(ig,
l).gt.fm(ig,
l-1)
5838 s .and.
l.gt.lmix(ig))
then
5846 if(fracd(ig,
l).lt.0.1)
then
5847 abort_message =
'fracd trop petit'
5851 wd(ig,
l)=fm(ig,
l)/(fracd(ig,
l)*rhobarz(ig,
l))
5859 masse(ig,
l)=(pplev(ig,
l)-pplev(ig,
l+1))/rg
5873 if(fm(ig,
l+1)*ptimestep.gt.masse(ig,
l)
5874 s .and.fm(ig,
l+1)*ptimestep.gt.masse(ig,
l+1))
then
5884 if(entr(ig,
l)*ptimestep.gt.masse(ig,
l))
then
5894 if(.not.fm(ig,
l).ge.0..or..not.fm(ig,
l).le.10.)
then
5898 if(.not.masse(ig,
l).ge.1.e-10
5899 s .or..not.masse(ig,
l).le.1.e4)
then
5909 if(.not.entr(ig,
l).ge.0..or..not.entr(ig,
l).le.10.)
then
5921 detr(ig,
l)=fm(ig,
l)+entr(ig,
l)-fm(ig,
l+1)
5922 if (
detr(ig,
l).lt.0.)
then
5923 entr(ig,
l)=entr(ig,
l)-
detr(ig,
l)
5931 fm0=fm0+ptimestep*(fm-fm0)/tho
5932 entr0=entr0+ptimestep*(entr-entr0)/tho
5963 zf=0.5*(fracc(ig,
l)+fracc(ig,
l+1))
5966 wth2(ig,
l)=zf2*(0.5*(wa_moy(ig,
l)+wa_moy(ig,
l+1)))**2
5976 pdtadj(ig,
l)=zdhadj(ig,
l)*zpspsk(ig,
l)
6002 zla(ig,
l)=(1.-fracd(ig,
l))*
zmax(ig)
6003 zld(ig,
l)=fracd(ig,
l)*
zmax(ig)
6004 if(1.-fracd(ig,
l).gt.1.e-10)
6005 s zwa(ig,
l)=wd(ig,
l)*fracd(ig,
l)/(1.-fracd(ig,
l))
6029 CALL writeg1d(1,
nlay,wd,
'wd ',
'wd ')
6030 CALL writeg1d(1,
nlay,zwa,
'wa ',
'wa ')
6031 CALL writeg1d(1,
nlay,fracd,
'fracd ',
'fracd ')
6032 CALL writeg1d(1,
nlay,
fraca,
'fraca ',
'fraca ')
6033 CALL writeg1d(1,
nlay,wa_moy,
'wam ',
'wam ')
6034 CALL writeg1d(1,
nlay,zla,
'la ',
'la ')
6035 CALL writeg1d(1,
nlay,zld,
'ld ',
'ld ')
6036 CALL writeg1d(1,
nlay,pt,
'pt ',
'pt ')
6037 CALL writeg1d(1,
nlay,zh,
'zh ',
'zh ')
6038 CALL writeg1d(1,
nlay,
zha,
'zha ',
'zha ')
6039 CALL writeg1d(1,
nlay,zu,
'zu ',
'zu ')
6040 CALL writeg1d(1,
nlay,
zv,
'zv ',
'zv ')
6041 CALL writeg1d(1,
nlay,zo,
'zo ',
'zo ')
6042 CALL writeg1d(1,
nlay,wh,
'wh ',
'wh ')
6043 CALL writeg1d(1,
nlay,wu,
'wu ',
'wu ')
6044 CALL writeg1d(1,
nlay,wv,
'wv ',
'wv ')
6045 CALL writeg1d(1,
nlay,wo,
'w15uo ',
'wXo ')
6046 CALL writeg1d(1,
nlay,zdhadj,
'zdhadj ',
'zdhadj ')
6047 CALL writeg1d(1,
nlay,
pduadj,
'pduadj ',
'pduadj ')
6048 CALL writeg1d(1,
nlay,pdvadj,
'pdvadj ',
'pdvadj ')
6049 CALL writeg1d(1,
nlay,
pdoadj,
'pdoadj ',
'pdoadj ')
6050 CALL writeg1d(1,
nlay,entr ,
'entr ',
'entr ')
6051 CALL writeg1d(1,
nlay,
detr ,
'detr ',
'detr ')
6052 CALL writeg1d(1,
nlay,fm ,
'fm ',
'fm ')
6054 CALL writeg1d(1,
nlay,pdtadj,
'pdtadj ',
'pdtadj ')
6055 CALL writeg1d(1,
nlay,
pplay,
'pplay ',
'pplay ')
6056 CALL writeg1d(1,
nlay,pplev,
'pplev ',
'pplev ')
6060 call dt2f(pplev,
pplay,pt,pdtadj,wh)
6061 CALL writeg1d(1,
nlay,wh,
'wh2 ',
'wh2 ')
6067 print*,
'Debut des wrgradsfi'
6113 zsortie1d(:)=lmax(:)
6114 call
wrgradsfi(1,1,zsortie1d,
'lmax ',
'lmax ')
6115 call
wrgradsfi(1,1,wmax,
'wmax ',
'wmax ')
6116 zsortie1d(:)=lmix(:)
6117 call
wrgradsfi(1,1,zsortie1d,
'lmix ',
'lmix ')
6118 zsortie1d(:)=lentr(:)
6119 call
wrgradsfi(1,1,zsortie1d,
'lentr ',
'lentr ')
6124 write(str2,
'(i2.2)')
k
6128 zsortie(ig,
l)=wa(ig,
k,
l)
6134 zsortie(ig,
l)=larg_part(ig,
k,
l)
6144 print*,
'Fin des wrgradsfi'