4 SUBROUTINE calcul_sec(ngrid, nlay, ptimestep, pplay, pplev, pphi, zlev, pu, &
5 pv,
pt, po, zmax, wmax, zw2, lmix &
7 , r_aspect, l_mix, w2di, tho)
41 INTEGER ngrid, nlay, w2di
43 REAL ptimestep, l_mix, r_aspect
44 REAL pt(ngrid, nlay), pdtadj(ngrid, nlay)
45 REAL pu(ngrid, nlay), pduadj(ngrid, nlay)
46 REAL pv(ngrid, nlay), pdvadj(ngrid, nlay)
47 REAL po(ngrid, nlay), pdoadj(ngrid, nlay)
48 REAL pplay(ngrid, nlay), pplev(ngrid, nlay+1)
49 REAL pphi(ngrid, nlay)
58 INTEGER ig, k, l, lmaxa(
klon), lmix(
klon)
92 INTEGER isplit, nsplit, ialt
118 REAL entr_star_tot(
klon), entr_star2(
klon)
134 CHARACTER (LEN=20) :: modname =
'calcul_sec'
135 CHARACTER (LEN=80) :: abort_message
153 IF (ngrid/=
klon)
THEN
155 print *,
'STOP dans convadj'
156 print *,
'ngrid =', ngrid
157 print *,
'klon =',
klon
168 zpspsk(ig, l) = (pplay(ig,l)/pplev(ig,1))**rkappa
169 zh(ig, l) = pt(ig, l)/zpspsk(ig, l)
170 zu(ig, l) = pu(ig, l)
171 zv(ig, l) = pv(ig, l)
172 zo(ig, l) = po(ig, l)
173 ztv(ig, l) = zh(ig, l)*(1.+0.61*zo(ig,l))
201 zlev(ig, l) = 0.5*(pphi(ig,l)+pphi(ig,l-1))/
rg
206 zlev(ig, nlay+1) = (2.*pphi(ig,
klev)-pphi(ig,
klev-1))/
rg
210 zlay(ig, l) = pphi(ig, l)/
rg
221 rho(ig, l) = pplay(ig, l)/(zpspsk(ig,l)*rd*zh(ig,l))
227 rhobarz(ig, l) = 0.5*(rho(ig,l)+rho(ig,l-1))
281 entr_star(ig, l) = 0.
291 DO k = nlay - 2, 1, -1
293 IF (ztv(ig,k)>ztv(ig,k+1) .AND. ztv(ig,k+1)<=ztv(ig,k+2))
THEN
309 IF (ztv(ig,l-1)>ztv(ig,l))
THEN
322 zalim(ig) = zalim(ig) + zlev(ig, k)*max(0., (ztv(ig,k)-ztv(ig, &
323 k+1))/(zlev(ig,k+1)-zlev(ig,k)))
325 norme(ig) = norme(ig) + max(0., (ztv(ig,k)-ztv(ig,k+1))/(zlev(ig, &
331 IF (norme(ig)>1.e-10)
THEN
332 zalim(ig) = max(10.*zalim(ig)/norme(ig), zlev(ig,2))
339 IF ((zalim(ig)>zlev(ig,k)) .AND. (zalim(ig)<=zlev(ig,k+1)))
THEN
348 IF (ztv(ig,l)>ztv(ig,l+1) .AND. l>=lmin(ig) .AND. l<lentr(ig))
THEN
349 entr_star(ig, l) = max((ztv(ig,l)-ztv(ig,l+1)), 0.) &
362 IF (ztv(ig,l)>ztv(ig,l+1) .AND. l>=lmin(ig) .AND. l<=lalim(ig) .AND. &
363 zalim(ig)>1.e-10)
THEN
376 entr_star(ig, l) = 0.
382 entr_star_tot(ig) = 0.
386 entr_star_tot(ig) = entr_star_tot(ig) + entr_star(ig, k)
391 IF (entr_star_tot(ig)>1.e-10)
THEN
395 entr_star(ig, l) = entr_star(ig, l)/entr_star_tot(ig)
403 ztva(ig, k) = ztv(ig, k)
415 larg_cons(ig, k) = 0.
416 larg_detr(ig, k) = 0.
432 IF (ztv(ig,l)>ztv(ig,l+1) .AND. entr_star(ig,l)>1.e-10 .AND. &
433 zw2(ig,l)<1e-10)
THEN
434 f_star(ig, l+1) = entr_star(ig, l)
436 zw2(ig, l+1) = 2.*
rg*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig, l+1)* &
437 (zlev(ig,l+1)-zlev(ig,l))*0.4*pphi(ig, l)/(pphi(ig,l+1)-pphi(ig,l))
438 larg_detr(ig, l) = 0.
439 ELSE IF ((zw2(ig,l)>=1e-10) .AND. (f_star(ig,l)+entr_star(ig, &
441 f_star(ig, l+1) = f_star(ig, l) + entr_star(ig, l)
442 ztva(ig, l) = (f_star(ig,l)*ztva(ig,l-1)+entr_star(ig,l)*ztv(ig,l))/ &
444 zw2(ig, l+1) = zw2(ig, l)*(f_star(ig,l)/f_star(ig,l+1))**2 + &
445 2.*
rg*(ztva(ig,l)-ztv(ig,l))/ztv(ig, l)*(zlev(ig,l+1)-zlev(ig,l))
448 IF (zw2(ig,l+1)<0.)
THEN
450 IF (abs(zw2(ig,l+1)-zw2(ig,l))<1e-10)
THEN
453 linter(ig) = (l*(zw2(ig,l+1)-zw2(ig,l))-zw2(ig,l))/(zw2(ig,l+1)-zw2( &
458 IF (zw2(ig,l+1)<0.)
THEN
461 wa_moy(ig, l+1) = sqrt(zw2(ig,l+1))
463 IF (wa_moy(ig,l+1)>wmaxa(ig))
THEN
466 wmaxa(ig) = wa_moy(ig, l+1)
478 DO l = nlay, lentr(ig) + 1, -1
480 IF (zw2(ig,l)<=1.e-10)
THEN
502 IF (l<=lmax(ig))
THEN
503 IF (zw2(ig,l)<0.)
THEN
506 zw2(ig, l) = sqrt(zw2(ig,l))
507 wmax(ig) = max(wmax(ig), zw2(ig,l))
517 zlevinter(ig) = zlev(ig, 1)
521 zlevinter(ig) = (zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))*linter(ig) + &
522 zlev(ig, lmax(ig)) - lmax(ig)*(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))
523 zmax(ig) = max(zmax(ig), zlevinter(ig)-zlev(ig,lmin(ig)))
538 IF (entr_star_tot(ig)<1.e-10)
THEN
541 DO k = lmin(ig), lentr(ig)
543 entr_star2(ig) = entr_star2(ig) + entr_star(ig, k)**2/(rho(ig,k)*( &
544 zlev(ig,k+1)-zlev(ig,k)))
547 f(ig) = wmax(ig)/(max(500.,zmax(ig))*r_aspect*entr_star2(ig))
551 f(ig) = f(ig) + (f0(ig)-f(ig))*exp(-ptimestep/zmax(ig)*wmax(ig))
563 entr(ig, k) = f(ig)*entr_star(ig, k)
581 DO l = 1, lmax(ig) - 1
582 fmc(ig, l+1) = fmc(ig, l) + entr(ig, l)
602 IF (l<=lmaxa(ig))
THEN
603 zw = max(wa_moy(ig,l), 1.e-10)
604 larg_cons(ig, l) = zmax(ig)*r_aspect*fmc(ig, l)/(rhobarz(ig,l)*zw)
611 IF (l<=lmaxa(ig))
THEN
614 IF ((l_mix*zlev(ig,l))<0.)
THEN
619 IF (zw2(ig,l)>1.e-10)
THEN
620 larg_detr(ig, l) = sqrt((l_mix/zw2(ig,l))*zlev(ig,l))
622 larg_detr(ig, l) = sqrt(l_mix*zlev(ig,l))
646 IF (lmix(ig)>1.)
THEN
648 IF (((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))*((zlev(ig,lmix(ig)))- &
649 (zlev(ig,lmix(ig)+1)))-(zw2(ig,lmix(ig))- &
650 zw2(ig,lmix(ig)+1))*((zlev(ig,lmix(ig)-1))- &
651 (zlev(ig,lmix(ig)))))>1e-10)
THEN
653 zmix(ig) = ((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))*((zlev(ig,lmix(ig)) &
654 )**2-(zlev(ig,lmix(ig)+1))**2)-(zw2(ig,lmix(ig))-zw2(ig, &
655 lmix(ig)+1))*((zlev(ig,lmix(ig)-1))**2-(zlev(ig,lmix(ig)))**2))/ &
656 (2.*((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))*((zlev(ig,lmix(ig)))- &
657 (zlev(ig,lmix(ig)+1)))-(zw2(ig,lmix(ig))- &
658 zw2(ig,lmix(ig)+1))*((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))))
660 zmix(ig) = zlev(ig, lmix(ig))
667 IF ((zmax(ig)-zmix(ig))<0.)
THEN
668 zmix(ig) = 0.99*zmax(ig)
676 IF (zmix(ig)>=zlev(ig,l) .AND. zmix(ig)<zlev(ig,l+1))
THEN
684 IF (larg_cons(ig,l)>1.)
THEN
686 fraca(ig, l) = (larg_cons(ig,l)-larg_detr(ig,l))/(r_aspect*zmax(ig))
688 fraca(ig, l) = max(fraca(ig,l), 0.)
689 fraca(ig, l) = min(fraca(ig,l), 0.5)
690 fracd(ig, l) = 1. - fraca(ig, l)
691 fracc(ig, l) = larg_cons(ig, l)/(r_aspect*zmax(ig))
702 fracazmix(ig) = (fraca(ig,lmix(ig)+1)-fraca(ig,lmix(ig)))/ &
703 (zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))*zmix(ig) + &
704 fraca(ig, lmix(ig)) - zlev(ig, lmix(ig))*(fraca(ig,lmix(ig)+1)-fraca(ig &
705 ,lmix(ig)))/(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))
710 IF (larg_cons(ig,l)>1.)
THEN
713 IF (zmax(ig)-zmix(ig)<1.e-10)
THEN
715 xxx(ig, l) = (lmaxa(ig)+1.-l)/(lmaxa(ig)+1.-lmix(ig))
717 xxx(ig, l) = (zmax(ig)-zlev(ig,l))/(zmax(ig)-zmix(ig))
720 fraca(ig, l) = fracazmix(ig)
721 ELSE IF (idetr==1)
THEN
722 fraca(ig, l) = fracazmix(ig)*xxx(ig, l)
723 ELSE IF (idetr==2)
THEN
724 fraca(ig, l) = fracazmix(ig)*(1.-(1.-xxx(ig,l))**2)
726 fraca(ig, l) = fracazmix(ig)*xxx(ig, l)**2
729 fraca(ig, l) = max(fraca(ig,l), 0.)
730 fraca(ig, l) = min(fraca(ig,l), 0.5)
731 fracd(ig, l) = 1. - fraca(ig, l)
732 fracc(ig, l) = larg_cons(ig, l)/(r_aspect*zmax(ig))
754 fm(ig, l) = fraca(ig, l)*wa_moy(ig, l)*rhobarz(ig, l)
756 IF (entr(ig,l-1)<1e-10 .AND. fm(ig,l)>fm(ig,l-1) .AND. l>lmix(ig))
THEN
757 fm(ig, l) = fm(ig, l-1)
764 IF (fracd(ig,l)<0.1)
THEN
765 abort_message =
'fracd trop petit'
770 wd(ig, l) = fm(ig, l)/(fracd(ig,l)*rhobarz(ig,l))
778 masse(ig, l) = (pplev(ig,l)-pplev(ig,l+1))/
rg
792 IF (fm(ig,l+1)*ptimestep>masse(ig,l) .AND. fm(ig,l+1)*ptimestep>masse( &
803 IF (entr(ig,l)*ptimestep>masse(ig,l))
THEN
813 IF (.NOT. fm(ig,l)>=0. .OR. .NOT. fm(ig,l)<=10.)
THEN
817 IF (.NOT. masse(ig,l)>=1.e-10 .OR. .NOT. masse(ig,l)<=1.e4)
THEN
827 IF (.NOT. entr(ig,l)>=0. .OR. .NOT. entr(ig,l)<=10.)
THEN
839 detr(ig, l) = fm(ig, l) + entr(ig, l) - fm(ig, l+1)
840 IF (detr(ig,l)<0.)
THEN
842 fm(ig, l+1) = fm(ig, l) + entr(ig, l)
850 fm0 = fm0 + ptimestep*(fm-fm0)/tho
851 entr0 = entr0 + ptimestep*(entr-entr0)/tho
858 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zh, zdhadj, &
860 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zo, pdoadj, &
863 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zh, &
865 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zo, &
870 CALL dvthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zmax, &
871 zu, zv, pduadj, pdvadj, zua, zva)
873 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zu, pduadj, &
875 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zv, pdvadj, &
881 zf = 0.5*(fracc(ig,l)+fracc(ig,l+1))
883 thetath2(ig, l) = zf2*(zha(ig,l)-zh(ig,l))**2
884 wth2(ig, l) = zf2*(0.5*(wa_moy(ig,l)+wa_moy(ig,l+1)))**2
894 pdtadj(ig, l) = zdhadj(ig, l)*zpspsk(ig, l)
920 zla(ig, l) = (1.-fracd(ig,l))*zmax(ig)
921 zld(ig, l) = fracd(ig, l)*zmax(ig)
922 IF (1.-fracd(ig,l)>1.e-10) zwa(ig, l) = wd(ig, l)*fracd(ig, l)/ &
947 CALL writeg1d(1, nlay, wd,
'wd ',
'wd ')
948 CALL writeg1d(1, nlay, zwa,
'wa ',
'wa ')
949 CALL writeg1d(1, nlay, fracd,
'fracd ',
'fracd ')
950 CALL writeg1d(1, nlay, fraca,
'fraca ',
'fraca ')
951 CALL writeg1d(1, nlay, wa_moy,
'wam ',
'wam ')
952 CALL writeg1d(1, nlay, zla,
'la ',
'la ')
953 CALL writeg1d(1, nlay, zld,
'ld ',
'ld ')
954 CALL writeg1d(1, nlay, pt,
'pt ',
'pt ')
955 CALL writeg1d(1, nlay, zh,
'zh ',
'zh ')
956 CALL writeg1d(1, nlay, zha,
'zha ',
'zha ')
957 CALL writeg1d(1, nlay, zu,
'zu ',
'zu ')
958 CALL writeg1d(1, nlay, zv,
'zv ',
'zv ')
959 CALL writeg1d(1, nlay, zo,
'zo ',
'zo ')
960 CALL writeg1d(1, nlay, wh,
'wh ',
'wh ')
961 CALL writeg1d(1, nlay, wu,
'wu ',
'wu ')
962 CALL writeg1d(1, nlay, wv,
'wv ',
'wv ')
963 CALL writeg1d(1, nlay, wo,
'w15uo ',
'wXo ')
964 CALL writeg1d(1, nlay, zdhadj,
'zdhadj ',
'zdhadj ')
965 CALL writeg1d(1, nlay, pduadj,
'pduadj ',
'pduadj ')
966 CALL writeg1d(1, nlay, pdvadj,
'pdvadj ',
'pdvadj ')
967 CALL writeg1d(1, nlay, pdoadj,
'pdoadj ',
'pdoadj ')
968 CALL writeg1d(1, nlay, entr,
'entr ',
'entr ')
969 CALL writeg1d(1, nlay, detr,
'detr ',
'detr ')
970 CALL writeg1d(1, nlay, fm,
'fm ',
'fm ')
972 CALL writeg1d(1, nlay, pdtadj,
'pdtadj ',
'pdtadj ')
973 CALL writeg1d(1, nlay, pplay,
'pplay ',
'pplay ')
974 CALL writeg1d(1, nlay, pplev,
'pplev ',
'pplev ')
978 CALL dt2f(pplev, pplay, pt, pdtadj, wh)
979 CALL writeg1d(1, nlay, wh,
'wh2 ',
'wh2 ')
991 SUBROUTINE fermeture_seche(ngrid, nlay, pplay, pplev, pphi, zlev, rhobarz, &
992 f0, zpspsk, alim_star, zh, zo, lentr, lmin, nu_min, nu_max, r_aspect, &
1001 REAL pplay(ngrid, nlay), pplev(ngrid, nlay+1)
1002 REAL pphi(ngrid, nlay)
1027 REAL zlevinter(
klon)
1035 REAL,
SAVE,
ALLOCATABLE :: zmax0_sec(:)
1037 LOGICAL,
SAVE :: first = .
true.
1041 ALLOCATE (zmax0_sec(
klon))
1047 ztv(ig, l) = zh(ig, l)/zpspsk(ig, l)
1048 ztv(ig, l) = ztv(ig, l)*(1.+retv*zo(ig,l))
1053 IF (ztv(ig,l)>ztv(ig,l+1) .AND. alim_star(ig,l)>1.e-10 .AND. &
1054 zw2(ig,l)<1e-10)
THEN
1055 f_star(ig, l+1) = alim_star(ig, l)
1057 zw2(ig, l+1) = 2.*
rg*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig, l+1)* &
1058 (zlev(ig,l+1)-zlev(ig,l))*0.4*pphi(ig, l)/(pphi(ig,l+1)-pphi(ig,l))
1059 ELSE IF ((zw2(ig,l)>=1e-10) .AND. (f_star(ig,l)+alim_star(ig, &
1064 nu(ig, l) = (nu_min+nu_max)/2.*(1.-(nu_max-nu_min)/(nu_max+nu_min)* &
1065 tanh((((ztva(ig,l-1)-ztv(ig,l))/ztv(ig,l))/0.0005)))
1067 detr_star(ig, l) = rhobarz(ig, l)*sqrt(zw2(ig,l))/ &
1068 (r_aspect*zmax0_sec(ig))* &
1070 (sqrt(nu(ig,l)*zlev(ig,l+1)/sqrt(zw2(ig,l)))-sqrt(nu(ig,l)*zlev(ig, &
1071 l)/sqrt(zw2(ig,l))))
1072 detr_star(ig, l) = detr_star(ig, l)/f0(ig)
1073 IF ((detr_star(ig,l))>f_star(ig,l))
THEN
1074 detr_star(ig, l) = f_star(ig, l)
1076 entr_star(ig, l) = 0.9*detr_star(ig, l)
1077 IF ((l<lentr(ig)))
THEN
1078 entr_star(ig, l) = 0.
1083 f_star(ig, l+1) = f_star(ig, l) + alim_star(ig, l) + &
1084 entr_star(ig, l) - detr_star(ig, l)
1086 IF ((f_star(ig,l+1)+detr_star(ig,l))>1.e-10)
THEN
1088 ztva(ig, l) = (f_star(ig,l)*ztva(ig,l-1)+(entr_star(ig, &
1089 l)+alim_star(ig,l))*ztv(ig,l))/(f_star(ig,l+1)+detr_star(ig,l))
1090 zw2(ig, l+1) = zw2(ig, l)*(f_star(ig,l)/(f_star(ig, &
1091 l+1)+detr_star(ig,l)))**2 + 2.*
rg*(ztva(ig,l)-ztv(ig,l))/ztv(ig, &
1092 l)*(zlev(ig,l+1)-zlev(ig,l))
1096 IF (zw2(ig,l+1)<0.)
THEN
1097 linter(ig) = (l*(zw2(ig,l+1)-zw2(ig,l))-zw2(ig,l))/(zw2(ig,l+1)-zw2( &
1102 wa_moy(ig, l+1) = sqrt(zw2(ig,l+1))
1104 IF (wa_moy(ig,l+1)>wmaxa(ig))
THEN
1107 wmaxa(ig) = wa_moy(ig, l+1)
1115 lmax(ig) = lentr(ig)
1118 DO l = nlay, lentr(ig) + 1, -1
1119 IF (zw2(ig,l)<=1.e-10)
THEN
1126 IF (lmin(ig)>1)
THEN
1140 IF (l<=lmax(ig))
THEN
1141 IF (zw2(ig,l)<0.)
THEN
1144 zw2(ig, l) = sqrt(zw2(ig,l))
1145 wmax(ig) = max(wmax(ig), zw2(ig,l))
1155 zlevinter(ig) = zlev(ig, 1)
1159 zlevinter(ig) = (zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))*linter(ig) + &
1160 zlev(ig, lmax(ig)) - lmax(ig)*(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))
1163 zmax(ig) = max(zmax(ig), zlevinter(ig)-zlev(ig,1))
1164 zmax0_sec(ig) = zmax(ig)
subroutine scopy(n, sx, incx, sy, incy)
subroutine dvthermcell2(ngrid, nlay, ptimestep, fm, entr, masse, fraca, larga, u, v, du, dv, ua, va)
!$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
subroutine calcul_sec(ngrid, nlay, ptimestep, pplay, pplev, pphi, zlev, pu,pv, pt, po, zmax, wmax, zw2, lmix
!$Header!integer nvarmx parameter(nfmx=10, imx=200, jmx=150, lmx=200, nvarmx=1000) real xd(imx
!$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 dqthermcell(ngrid, nlay, ptimestep, fm, entr, masse, q, dq, qa)
subroutine abort_physic(modname, message, ierr)
INTERFACE SUBROUTINE RRTM_ECRT_140GP pt
subroutine fermeture_seche(ngrid, nlay, pplay, pplev, pphi, zlev, rhobarz, f0, zpspsk, alim_star, zh, zo, lentr, lmin, nu_min, nu_max, r_aspect, zmax, wmax)
subroutine dqthermcell2(ngrid, nlay, ptimestep, fm, entr, masse, frac, q, dq, qa)