5 s ,
pplay,pplev,pphi,zlev
9 s ,r_aspect,l_mix,w2di,tho)
38 #include "dimensions.h"
45 INTEGER ngrid,
nlay,w2di
47 real ptimestep,l_mix,r_aspect
48 REAL pt(ngrid,
nlay),pdtadj(ngrid,
nlay)
50 REAL pv(ngrid,
nlay),pdvadj(ngrid,
nlay)
62 INTEGER ig,
k,
l,lmaxa(klon),lmix(klon)
65 INTEGER lmax(klon),lmin(klon),lentr(klon)
67 real zmix(klon), fracazmix(klon)
81 real zsortie(klon,
klev)
87 real wa_moy(klon,
klev+1)
89 real fracc(klon,
klev+1)
96 integer isplit,nsplit,ialt
103 real rho(klon,
klev),rhobarz(klon,
klev+1),masse(klon,
klev)
104 real zpspsk(klon,
klev)
107 real wmax(klon),wmaxa(klon)
111 real fracd(klon,
klev+1)
112 real xxx(klon,
klev+1)
113 real larg_cons(klon,
klev+1)
114 real larg_detr(klon,
klev+1)
116 real pu_therm(klon,
klev),pv_therm(klon,
klev)
117 real fm(klon,
klev+1),entr(klon,
klev)
118 real fmc(klon,
klev+1)
121 real f_star(klon,
klev+1),entr_star(klon,
klev)
122 real entr_star_tot(klon),entr_star2(klon)
126 real f(klon), f0(klon)
138 character (len=20) :: modname=
'calcul_sec'
139 character (len=80) :: abort_message
157 IF(ngrid.NE.klon)
THEN
159 print*,
'STOP dans convadj'
160 print*,
'ngrid =',ngrid
172 zpspsk(ig,
l)=(
pplay(ig,
l)/pplev(ig,1))**rkappa
173 zh(ig,
l)=pt(ig,
l)/zpspsk(ig,
l)
177 ztv(ig,
l)=zh(ig,
l)*(1.+0.61*zo(ig,
l))
205 zlev(ig,
l)=0.5*(pphi(ig,
l)+pphi(ig,
l-1))/rg
225 rho(ig,
l)=
pplay(ig,
l)/(zpspsk(ig,
l)*rd*zh(ig,
l))
231 rhobarz(ig,
l)=0.5*(rho(ig,
l)+rho(ig,
l-1))
327 zalim(ig)=zalim(ig)+zlev(ig,
k)*max(0.,(
ztv(ig,
k)-
ztv(ig,
k+1))
328 s /(zlev(ig,
k+1)-zlev(ig,
k)))
330 norme(ig)=norme(ig)+max(0.,(
ztv(ig,
k)-
ztv(ig,
k+1))
331 s /(zlev(ig,
k+1)-zlev(ig,
k)))
336 if (norme(ig).gt.1.e-10)
then
337 zalim(ig)=max(10.*zalim(ig)/norme(ig),zlev(ig,2))
344 if ((zalim(ig).gt.zlev(ig,
k)).and.(zalim(ig).le.zlev(ig,
k+1)))
355 s
l.ge.lmin(ig).and.
l.lt.lentr(ig))
then
356 entr_star(ig,
l)=max((
ztv(ig,
l)-
ztv(ig,
l+1)),0.)
358 s *sqrt(zlev(ig,
l+1))
370 s
l.ge.lmin(ig).and.
l.le.lalim(ig)
371 s .and.zalim(ig).gt.1.e-10)
then
382 if (lmin(ig).gt.5)
then
394 entr_star_tot(ig)=entr_star_tot(ig)+entr_star(ig,
k)
399 if (entr_star_tot(ig).gt.1.e-10)
then
403 entr_star(ig,
l)=entr_star(ig,
l)/entr_star_tot(ig)
441 s .and.entr_star(ig,
l).gt.1.e-10
442 s .and.
zw2(ig,
l).lt.1e-10)
then
443 f_star(ig,
l+1)=entr_star(ig,
l)
446 s *(zlev(ig,
l+1)-zlev(ig,
l))
447 s *0.4*pphi(ig,
l)/(pphi(ig,
l+1)-pphi(ig,
l))
449 else if ((
zw2(ig,
l).ge.1e-10).and.
450 s(f_star(ig,
l)+entr_star(ig,
l).gt.1.e-10))
then
451 f_star(ig,
l+1)=f_star(ig,
l)+entr_star(ig,
l)
452 ztva(ig,
l)=(f_star(ig,
l)*ztva(ig,
l-1)+entr_star(ig,
l)
453 s *
ztv(ig,
l))/f_star(ig,
l+1)
454 zw2(ig,
l+1)=
zw2(ig,
l)*(f_star(ig,
l)/f_star(ig,
l+1))**2+
456 s *(zlev(ig,
l+1)-zlev(ig,
l))
459 if (
zw2(ig,
l+1).lt.0.)
then
461 if (abs(
zw2(ig,
l+1)-
zw2(ig,
l)).lt.1e-10)
then
469 if (
zw2(ig,
l+1).lt.0.)
then
472 wa_moy(ig,
l+1)=sqrt(
zw2(ig,
l+1))
474 if (wa_moy(ig,
l+1).gt.wmaxa(ig))
then
477 wmaxa(ig)=wa_moy(ig,
l+1)
489 do l=
nlay,lentr(ig)+1,-1
491 if (
zw2(ig,
l).le.1.e-10)
then
498 if (lmin(ig).gt.5)
then
513 if (
l.le.lmax(ig))
then
514 if (
zw2(ig,
l).lt.0.)
then
518 wmax(ig)=max(wmax(ig),
zw2(ig,
l))
528 zlevinter(ig)=zlev(ig,1)
532 zlevinter(ig)=(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))*
533 s linter(ig)+zlev(ig,lmax(ig))-lmax(ig)*(zlev(ig,lmax(ig)+1)
534 s -zlev(ig,lmax(ig)))
535 zmax(ig)=max(
zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig)))
550 if (entr_star_tot(ig).LT.1.e-10)
then
553 do k=lmin(ig),lentr(ig)
555 entr_star2(ig)=entr_star2(ig)+entr_star(ig,
k)**2
556 s /(rho(ig,
k)*(zlev(ig,
k+1)-zlev(ig,
k)))
559 f(ig)=wmax(ig)/(max(500.,
zmax(ig))*r_aspect
564 f(ig)=
f(ig)+(f0(ig)-
f(ig))*exp(-ptimestep/
zmax(ig)
577 entr(ig,
k)=
f(ig)*entr_star(ig,
k)
596 fmc(ig,
l+1)=fmc(ig,
l)+entr(ig,
l)
616 if (
l.le.lmaxa(ig))
then
617 zw=max(wa_moy(ig,
l),1.e-10)
618 larg_cons(ig,
l)=
zmax(ig)*r_aspect
619 s *fmc(ig,
l)/(rhobarz(ig,
l)*zw)
626 if (
l.le.lmaxa(ig))
then
629 if ((l_mix*zlev(ig,
l)).lt.0.)
then
634 if (
zw2(ig,
l).gt.1.e-10)
then
635 larg_detr(ig,
l)=sqrt((l_mix/
zw2(ig,
l))*zlev(ig,
l))
637 larg_detr(ig,
l)=sqrt(l_mix*zlev(ig,
l))
661 if (lmix(ig).gt.1.)
then
663 if (((
zw2(ig,lmix(ig)-1)-
zw2(ig,lmix(ig)))
664 s *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1)))
665 s -(
zw2(ig,lmix(ig))-
zw2(ig,lmix(ig)+1))
666 s *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))).gt.1e-10)
669 zmix(ig)=((
zw2(ig,lmix(ig)-1)-
zw2(ig,lmix(ig)))
670 s *((zlev(ig,lmix(ig)))**2-(zlev(ig,lmix(ig)+1))**2)
671 s -(
zw2(ig,lmix(ig))-
zw2(ig,lmix(ig)+1))
672 s *((zlev(ig,lmix(ig)-1))**2-(zlev(ig,lmix(ig)))**2))
673 s /(2.*((
zw2(ig,lmix(ig)-1)-
zw2(ig,lmix(ig)))
674 s *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1)))
675 s -(
zw2(ig,lmix(ig))-
zw2(ig,lmix(ig)+1))
676 s *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))))
678 zmix(ig)=zlev(ig,lmix(ig))
694 if (
zmix(ig).ge.zlev(ig,
l).and.
695 s
zmix(ig).lt.zlev(ig,
l+1))
then
703 if(larg_cons(ig,
l).gt.1.)
then
705 fraca(ig,
l)=(larg_cons(ig,
l)-larg_detr(ig,
l))
706 s /(r_aspect*
zmax(ig))
711 fracc(ig,
l)=larg_cons(ig,
l)/(r_aspect*
zmax(ig))
722 fracazmix(ig)=(
fraca(ig,lmix(ig)+1)-
fraca(ig,lmix(ig)))/
723 s(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))*
zmix(ig)
724 s +
fraca(ig,lmix(ig))-zlev(ig,lmix(ig))*(
fraca(ig,lmix(ig)+1)
725 s -
fraca(ig,lmix(ig)))/(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))
730 if(larg_cons(ig,
l).gt.1.)
then
731 if (
l.gt.lmix(ig))
then
733 if (
zmax(ig)-
zmix(ig).lt.1.e-10)
then
735 xxx(ig,
l)=(lmaxa(ig)+1.-
l)/(lmaxa(ig)+1.-lmix(ig))
741 else if (idetr.eq.1)
then
742 fraca(ig,
l)=fracazmix(ig)*xxx(ig,
l)
743 else if (idetr.eq.2)
then
744 fraca(ig,
l)=fracazmix(ig)*(1.-(1.-xxx(ig,
l))**2)
746 fraca(ig,
l)=fracazmix(ig)*xxx(ig,
l)**2
752 fracc(ig,
l)=larg_cons(ig,
l)/(r_aspect*
zmax(ig))
774 fm(ig,
l)=
fraca(ig,
l)*wa_moy(ig,
l)*rhobarz(ig,
l)
776 if (entr(ig,
l-1).lt.1e-10.and.fm(ig,
l).gt.fm(ig,
l-1)
777 s .and.
l.gt.lmix(ig))
then
785 if(fracd(ig,
l).lt.0.1)
then
786 abort_message =
'fracd trop petit'
791 wd(ig,
l)=fm(ig,
l)/(fracd(ig,
l)*rhobarz(ig,
l))
799 masse(ig,
l)=(pplev(ig,
l)-pplev(ig,
l+1))/rg
813 if(fm(ig,
l+1)*ptimestep.gt.masse(ig,
l)
814 s .and.fm(ig,
l+1)*ptimestep.gt.masse(ig,
l+1))
then
824 if(entr(ig,
l)*ptimestep.gt.masse(ig,
l))
then
834 if(.not.fm(ig,
l).ge.0..or..not.fm(ig,
l).le.10.)
then
838 if(.not.masse(ig,
l).ge.1.e-10
839 s .or..not.masse(ig,
l).le.1.e4)
then
849 if(.not.entr(ig,
l).ge.0..or..not.entr(ig,
l).le.10.)
then
861 detr(ig,
l)=fm(ig,
l)+entr(ig,
l)-fm(ig,
l+1)
862 if (
detr(ig,
l).lt.0.)
then
864 fm(ig,
l+1)=fm(ig,
l)+entr(ig,
l)
872 fm0=fm0+ptimestep*(fm-fm0)/tho
873 entr0=entr0+ptimestep*(entr-entr0)/tho
904 zf=0.5*(fracc(ig,
l)+fracc(ig,
l+1))
907 wth2(ig,
l)=zf2*(0.5*(wa_moy(ig,
l)+wa_moy(ig,
l+1)))**2
917 pdtadj(ig,
l)=zdhadj(ig,
l)*zpspsk(ig,
l)
943 zla(ig,
l)=(1.-fracd(ig,
l))*
zmax(ig)
944 zld(ig,
l)=fracd(ig,
l)*
zmax(ig)
945 if(1.-fracd(ig,
l).gt.1.e-10)
946 s zwa(ig,
l)=wd(ig,
l)*fracd(ig,
l)/(1.-fracd(ig,
l))
970 CALL writeg1d(1,
nlay,wd,
'wd ',
'wd ')
971 CALL writeg1d(1,
nlay,zwa,
'wa ',
'wa ')
972 CALL writeg1d(1,
nlay,fracd,
'fracd ',
'fracd ')
973 CALL writeg1d(1,
nlay,
fraca,
'fraca ',
'fraca ')
974 CALL writeg1d(1,
nlay,wa_moy,
'wam ',
'wam ')
975 CALL writeg1d(1,
nlay,zla,
'la ',
'la ')
976 CALL writeg1d(1,
nlay,zld,
'ld ',
'ld ')
977 CALL writeg1d(1,
nlay,pt,
'pt ',
'pt ')
978 CALL writeg1d(1,
nlay,zh,
'zh ',
'zh ')
979 CALL writeg1d(1,
nlay,
zha,
'zha ',
'zha ')
980 CALL writeg1d(1,
nlay,zu,
'zu ',
'zu ')
981 CALL writeg1d(1,
nlay,
zv,
'zv ',
'zv ')
982 CALL writeg1d(1,
nlay,zo,
'zo ',
'zo ')
983 CALL writeg1d(1,
nlay,wh,
'wh ',
'wh ')
984 CALL writeg1d(1,
nlay,wu,
'wu ',
'wu ')
985 CALL writeg1d(1,
nlay,wv,
'wv ',
'wv ')
986 CALL writeg1d(1,
nlay,wo,
'w15uo ',
'wXo ')
987 CALL writeg1d(1,
nlay,zdhadj,
'zdhadj ',
'zdhadj ')
988 CALL writeg1d(1,
nlay,
pduadj,
'pduadj ',
'pduadj ')
989 CALL writeg1d(1,
nlay,pdvadj,
'pdvadj ',
'pdvadj ')
990 CALL writeg1d(1,
nlay,
pdoadj,
'pdoadj ',
'pdoadj ')
991 CALL writeg1d(1,
nlay,entr ,
'entr ',
'entr ')
992 CALL writeg1d(1,
nlay,
detr ,
'detr ',
'detr ')
993 CALL writeg1d(1,
nlay,fm ,
'fm ',
'fm ')
995 CALL writeg1d(1,
nlay,pdtadj,
'pdtadj ',
'pdtadj ')
996 CALL writeg1d(1,
nlay,
pplay,
'pplay ',
'pplay ')
997 CALL writeg1d(1,
nlay,pplev,
'pplev ',
'pplev ')
1001 call dt2f(pplev,
pplay,pt,pdtadj,wh)
1002 CALL writeg1d(1,
nlay,wh,
'wh2 ',
'wh2 ')
1054 zsortie1d(:)=lmax(:)
1055 call
wrgradsfi(1,1,zsortie1d,
'lmax ',
'lmax ')
1056 call
wrgradsfi(1,1,wmax,
'wmax ',
'wmax ')
1057 zsortie1d(:)=lmix(:)
1058 call
wrgradsfi(1,1,zsortie1d,
'lmix ',
'lmix ')
1059 zsortie1d(:)=lentr(:)
1060 call
wrgradsfi(1,1,zsortie1d,
'lentr ',
'lentr ')
1065 write(str2,
'(i2.2)')
k
1069 zsortie(ig,
l)=wa(ig,
k,
l)
1075 zsortie(ig,
l)=larg_part(ig,
k,
l)
1097 s ,
pplay,pplev,pphi,zlev,rhobarz,f0,zpspsk
1098 s ,
alim_star,zh,zo,lentr,lmin,nu_min,nu_max,r_aspect
1104 #include "dimensions.h"
1110 real pphi(ngrid,
nlay)
1111 real zlev(klon,
klev+1)
1121 real rhobarz(klon,
klev+1)
1124 real zpspsk(klon,
klev)
1128 real f_star(klon,
klev+1)
1130 real entr_star(klon,
klev)
1135 real zlevinter(klon)
1136 real wa_moy(klon,
klev+1)
1139 REAL ztva(klon,
klev)
1143 REAL,
SAVE,
ALLOCATABLE :: zmax0_sec(:)
1145 logical,
save :: first = .true.
1149 allocate(zmax0_sec(klon))
1155 ztv(ig,
l)=zh(ig,
l)/zpspsk(ig,
l)
1163 s .and.
zw2(ig,
l).lt.1e-10)
then
1167 s *(zlev(ig,
l+1)-zlev(ig,
l))
1168 s *0.4*pphi(ig,
l)/(pphi(ig,
l+1)-pphi(ig,
l))
1169 else if ((
zw2(ig,
l).ge.1e-10).and.
1173 nu(ig,
l)=(nu_min+nu_max)/2.
1174 s *(1.-(nu_max-nu_min)/(nu_max+nu_min)
1175 s *tanh((((ztva(ig,
l-1)-
ztv(ig,
l))/
ztv(ig,
l))/0.0005)))
1179 s /(r_aspect*zmax0_sec(ig))*
1181 s(sqrt(nu(ig,
l)*zlev(ig,
l+1)
1183 s -sqrt(nu(ig,
l)*zlev(ig,
l)
1184 s /sqrt(
zw2(ig,
l))))
1190 if ((
l.lt.lentr(ig)))
then
1199 if ((f_star(ig,
l+1)+
detr_star(ig,
l)).gt.1.e-10)
then
1201 ztva(ig,
l)=(f_star(ig,
l)*ztva(ig,
l-1)+(entr_star(ig,
l)
1206 s 2.*rg*(ztva(ig,
l)-
ztv(ig,
l))/
ztv(ig,
l)
1207 s *(zlev(ig,
l+1)-zlev(ig,
l))
1211 if (
zw2(ig,
l+1).lt.0.)
then
1217 wa_moy(ig,
l+1)=sqrt(
zw2(ig,
l+1))
1219 if (wa_moy(ig,
l+1).gt.wmaxa(ig))
then
1222 wmaxa(ig)=wa_moy(ig,
l+1)
1233 do l=
nlay,lentr(ig)+1,-1
1234 if (
zw2(ig,
l).le.1.e-10)
then
1241 if (lmin(ig).gt.1)
then
1255 if (
l.le.lmax(ig))
then
1256 if (
zw2(ig,
l).lt.0.)
then
1260 wmax(ig)=max(wmax(ig),
zw2(ig,
l))
1270 zlevinter(ig)=zlev(ig,1)
1274 zlevinter(ig)=(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))*
1275 s linter(ig)+zlev(ig,lmax(ig))-lmax(ig)*(zlev(ig,lmax(ig)+1)
1276 s -zlev(ig,lmax(ig)))
1279 zmax(ig)=max(
zmax(ig),zlevinter(ig)-zlev(ig,1))
1280 zmax0_sec(ig)=
zmax(ig)