4 SUBROUTINE cvltr_spl(pdtime, da, phi,phi2,d1a,dam, mpIN,epIN, &
5 sigd,sij,wght_cvfd,clw,elij,epmlmmm,eplamm, &
6 pmflxrin,pmflxsin,ev,te,wdtraina,wdtrainm, &
8 kk,henry,zrho, ccntraa_spla,ccntrenv_spla,coefcoli_spla, &
9 id_prec,id_fine,id_coss, id_codu, id_scdu, &
10 dtrcv,trsptd,dtrsscav,dtrsat,dtruscav,qdi,qpr, &
11 qpa,qmel,qtrdi,dtrcvma,mint, &
12 zmfd1a,zmfphi2,zmfdam)
29 REAL,
INTENT(IN) :: pdtime
30 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: da
31 REAL,
DIMENSION(klon,klev,klev),
INTENT(IN) :: phi
33 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: d1a,dam
34 REAL,
DIMENSION(klon,klev,klev),
INTENT(IN) :: phi2
36 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: mpIN
37 REAL,
DIMENSION(klon,klev+1),
INTENT(IN) :: paprs
39 REAL,
DIMENSION(klon,klev,nbtr),
INTENT(IN) :: tr
40 INTEGER,
INTENT(IN) :: it
41 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: upd
42 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: dnd
44 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: wdtrainA
45 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: wdtrainM
47 REAL,
DIMENSION(klon,klev+1),
INTENT(IN) :: pmflxrIN
49 REAL,
DIMENSION(klon,klev+1),
INTENT(IN) :: pmflxsIN
50 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: ev
51 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: epIN
52 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: te
53 REAL,
DIMENSION(klon,klev,klev),
INTENT(IN) :: sij
54 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: wght_cvfd
55 REAL,
DIMENSION(klon,klev,klev),
INTENT(IN) :: elij
56 REAL,
DIMENSION(klon,klev,klev),
INTENT(IN) :: epmlmMm
57 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: eplaMm
59 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: clw
60 REAL,
DIMENSION(klon),
INTENT(IN) :: sigd
61 INTEGER,
DIMENSION(klon),
INTENT(IN) :: icb,inb
63 REAL,
DIMENSION(klon,klev,nbtr),
INTENT(OUT) :: dtrcv
64 REAL,
DIMENSION(klon,klev,nbtr),
INTENT(OUT) :: dtrcvMA
65 REAL,
DIMENSION(klon,klev,nbtr),
INTENT(OUT) :: trsptd
66 REAL,
DIMENSION(klon,klev,nbtr),
INTENT(OUT) :: dtrSscav
67 REAL,
DIMENSION(klon,klev,nbtr),
INTENT(OUT) :: dtrsat
68 REAL,
DIMENSION(klon,klev,nbtr),
INTENT(OUT) :: dtrUscav
72 REAL,
DIMENSION(klon,klev) :: dxpres
74 REAL,
DIMENSION(klon,nbtr) :: qfeed
76 REAL,
DIMENSION(klon,klev,klev) :: zmd
77 REAL,
DIMENSION(klon,klev,klev) :: za
78 REAL,
DIMENSION(klon,klev,nbtr) :: zmfd,zmfa
79 REAL,
DIMENSION(klon,klev,nbtr) :: zmfp,zmfu
81 REAL,
DIMENSION(klon,klev,nbtr),
INTENT(OUT) :: zmfd1a
82 REAL,
DIMENSION(klon,klev,nbtr),
INTENT(OUT) :: zmfdam
83 REAL,
DIMENSION(klon,klev,nbtr),
INTENT(OUT) :: zmfphi2
86 REAL,
DIMENSION(klon,klev) :: Pa, Pm
87 REAL,
DIMENSION(klon,klev) :: pmflxs,pmflxr
88 REAL,
DIMENSION(klon,klev) :: mp
89 REAL,
DIMENSION(klon,klev) :: ep
90 REAL,
DIMENSION(klon,klev) :: evap
91 REAL,
DIMENSION(klon,klev) :: rho
93 REAL,
DIMENSION(klon,klev) :: kappa
95 REAL,
DIMENSION(klon,klev,nbtr),
INTENT(OUT) :: qTrdi
96 REAL,
DIMENSION(klon,klev,nbtr),
INTENT(OUT) :: qDi
97 REAL,
DIMENSION(klon,klev,nbtr),
INTENT(OUT) :: qPr
98 REAL,
DIMENSION(klon,klev,nbtr),
INTENT(OUT) :: qPa
99 REAL,
DIMENSION(klon,klev,nbtr),
INTENT(OUT) :: qMel
100 REAL,
DIMENSION(klon,klev,nbtr) :: qMeltmp
101 REAL,
DIMENSION(klon,klev,nbtr) :: qpmMint
102 REAL,
DIMENSION(klon,klev),
INTENT(OUT) :: Mint
111 REAL,
PARAMETER :: rdrop=1.e-3
113 REAL,
DIMENSION(klon,klev) :: imp
116 REAL :: ccntrENV_coef
119 LOGICAL,
DIMENSION(klon,klev) :: NO_precip
126 INTEGER :: id_prec,id_fine,id_coss, id_codu, id_scdu
127 REAL,
DIMENSION(nbtr) :: ccntrAA_spla,ccntrENV_spla,coefcoli_spla
128 REAL,
DIMENSION(klon,klev) :: ccntrAA_coef3d
129 REAL,
DIMENSION(klon,klev) :: ccntrENV_coef3d
130 REAL,
DIMENSION(klon,klev) :: coefcoli3d
132 REAL,
DIMENSION(nbtr) :: henry
133 REAL,
DIMENSION(nbtr) :: kk
137 REAL,
PARAMETER :: ph=5.
139 REAL,
DIMENSION(klon,klev) :: zrho
140 REAL,
PARAMETER :: qliq=1.e-3
254 if(ev(i,j).lt.1.e-16)
then
257 evap(i,j)=ev(i,j)*sigd(i)
265 if(epin(i,j).lt.1.e-32)
then
273 if(mpin(i,j).lt.1.e-32)
then
278 if(pmflxsin(i,j).lt.1.e-32)
then
281 pmflxs(i,j)=pmflxsin(i,j)
283 if(pmflxrin(i,j).lt.1.e-32)
then
286 pmflxr(i,j)=pmflxrin(i,j)
288 if(wdtraina(i,j).lt.1.e-32)
then
291 pa(i,j)=wdtraina(i,j)
293 if(wdtrainm(i,j).lt.1.e-32)
then
296 pm(i,j)=wdtrainm(i,j)
304 no_precip(i,j) = (pmflxr(i,j+1)+pmflxs(i,j+1)).lt.1.e-10&
305 .and.pa(i,j).lt.1.e-10.and.pm(i,j).lt.1.e-10
342 IF (it .EQ. id_prec)
THEN
345 henry_t=henry(it)*exp(-kk(it)*(1./298.-1./te(i,k)))
346 k1=1.2e-2*exp(-2010*(1/298.-1/te(i,k)))
347 k2=6.6e-8*exp(-1510*(1/298.-1/te(i,k)))
348 henry_t=henry_t*(1. + k1/10.**(-ph) + k1*k2/(10.**(-ph))**2)
349 f_a=henry_t/101.325*
r*te(i,k)*qliq*zrho(i,k)/
rho_water
351 ccntraa_coef3d(i,k)= f_a/(1.+f_a)
352 ccntrenv_coef3d(i,k)= f_a/(1.+f_a)
360 ccntraa_coef3d(i,j)=ccntraa_spla(it)
361 ccntrenv_coef3d(i,j)=ccntrenv_spla(it)
362 coefcoli3d(i,j)=coefcoli_spla(it)
387 imp(i,j) = coefcoli3d(i,j)*0.75e-3/rdrop *&
388 0.5*(pmflxr(i,j+1)+pmflxs(i,j+1)+pmflxr(i,j)+pmflxs(i,j))
412 zmd(i,k,k)=max(0.,mp(i,k)-mp(i,k+1))
418 if(mp(i,j+1).gt.1.e-10)
then
419 zmd(i,j,k)=zmd(i,j+1,k)*min(1.,mp(i,j)/mp(i,j+1))
427 za(i,j,k)=max(0.,zmd(i,j+1,k)-zmd(i,j,k))
435 if(mp(i,j+1).gt.1.e-10)
then
436 qtrdi(i,j+1,it)=qtrdi(i,j+1,it)+(zmd(i,j+1,k)/mp(i,j+1))*tr(i,k,it)
449 za(i,j,j-1)=za(i,j,j-1)+mp(i,j)
458 zmfd(i,j,it)=zmfd(i,j,it)+za(i,j,k)*(tr(i,k,it)-tr(i,j,it))
470 qfeed(i,it)=qfeed(i,it)+wght_cvfd(i,j)*tr(i,j,it)
479 zmfa(i,j,it)=da(i,j)*(qfeed(i,it)-tr(i,j,it))
487 zmfp(i,j,it)=zmfp(i,j,it)+phi(i,j,k)*(tr(i,k,it)-tr(i,j,it))
494 zmfd1a(i,j,it)=d1a(i,j)*tr(i,1,it)
495 zmfdam(i,j,it)=dam(i,j)*tr(i,1,it)
501 zmfphi2(i,j,it)=zmfphi2(i,j,it)+phi2(i,j,k)*tr(i,k,it)
507 zmfu(i,j,it)=max(0.,upd(i,j+1)+dnd(i,j+1))*(tr(i,j+1,it)-tr(i,j,it))
512 zmfu(i,j,it)=zmfu(i,j,it)+min(0.,upd(i,j)+dnd(i,j))*(tr(i,j,it)-tr(i,j-1,it))
521 dxpres(i,k)=paprs(i,k)-paprs(i,k+1)
529 if(j.ge.icb(i).and.j.le.inb(i))
then
530 if(clw(i,j).gt.1.e-16)
then
532 qpa(i,j,it)=ccntraa_coef3d(i,j)*tr(i,1,it)/clw(i,j)
546 if(k.ge.icb(i).and.k.le.inb(i).and.&
548 if(elij(i,k,j).gt.1.e-16)
then
552 qmeltmp(i,j,it)=((1-ep(i,k))*ccntraa_coef3d(i,k)*tr(i,1,it)&
553 *(1.-sij(i,k,j)) +ccntrenv_coef3d(i,k)&
554 *tr(i,k,it)*sij(i,k,j)) / elij(i,k,j)
558 qpmmint(i,j,it)=qpmmint(i,j,it) + qmeltmp(i,j,it)*epmlmmm(i,j,k)
559 mint(i,j)=mint(i,j) + epmlmmm(i,j,k)
567 if(mint(i,j).gt.1.e-16)
then
568 qmel(i,j,it)=qpmmint(i,j,it)/mint(i,j)
578 if(mp(i,j+1).gt.mp(i,j).and.mp(i,j+1).gt.1.e-10)
then
579 kappa(i,j)=((pmflxr(i,j+1)+pmflxs(i,j+1)+pa(i,j)+pm(i,j))*&
580 (-mp(i,j+1)-imp(i,j)/
rg*dxpres(i,j))&
581 + (imp(i,j)/
rg*dxpres(i,j))*(evap(i,j)/
rg*dxpres(i,j)))
583 elseif(mp(i,j).gt.mp(i,j+1).and.mp(i,j).gt.1.e-10) then
585 kappa(i,j)=((pmflxr(i,j+1)+pmflxs(i,j+1)+pa(i,j)+pm(i,j))*&
586 (-mp(i,2)-imp(i,j)/
rg*dxpres(i,j))&
587 + (imp(i,j)/
rg*dxpres(i,j))*(evap(i,j)/
rg*dxpres(i,j)))
589 kappa(i,j)=((pmflxr(i,j+1)+pmflxs(i,j+1)+pa(i,j)+pm(i,j))*&
590 (-mp(i,j)-imp(i,j)/
rg*dxpres(i,j))&
591 + (imp(i,j)/
rg*dxpres(i,j))*(evap(i,j)/
rg*dxpres(i,j)))
601 if (abs(kappa(i,j)).lt.1.e-25)
then
604 qdi(i,j,it)=qdi(i,j+1,it)
605 elseif(mp(i,j+1).gt.mp(i,j).and.mp(i,j+1).gt.1.e-10)
then
606 qdi(i,j,it)=qdi(i,j+1,it)
607 elseif(mp(i,j).gt.mp(i,j+1).and.mp(i,j).gt.1.e-10) then
608 qdi(i,j,it)=(-mp(i,j+1)*(qdi(i,j+1,it)-tr(i,j,it))-mp(i,j)*tr(i,j,it))/(-mp(i,j))
610 qdi(i,j,it)=tr(i,j,it)
613 if(no_precip(i,j))
then
616 qpr(i,j,it)=((pmflxr(i,j+1)+pmflxs(i,j+1))*qpr(i,j+1,it)+&
617 pa(i,j)*qpa(i,j,it)+pm(i,j)*qmel(i,j,it)&
618 +imp(i,j)/
rg*dxpres(i,j)*qdi(i,j,it))/&
619 (pmflxr(i,j+1)+pmflxs(i,j+1)+pa(i,j)+pm(i,j))
622 kappa(i,j)=1./kappa(i,j)
627 qdi(i,j,it)=tr(i,j,it)
632 if(mp(i,2).gt.1.e-10)
then
633 if(no_precip(i,j))
then
634 qdi(i,j,it)=qdi(i,j+1,it)
637 qdi(i,j,it)=kappa(i,j)*(&
638 (-evap(i,j)/
rg*dxpres(i,j))*((pmflxr(i,j+1)+pmflxs(i,j+1))*qpr(i,j+1,it)+&
639 pa(i,j)*qpa(i,j,it)+pm(i,j)*qmel(i,j,it)) +&
640 (pmflxr(i,j+1)+pmflxs(i,j+1)+pa(i,j)+pm(i,j))*&
641 (-mp(i,j+1)*qdi(i,j+1,it)))
643 qpr(i,j,it)=kappa(i,j)*(&
644 (-mp(i,j+1)-imp(i,j)/
rg*dxpres(i,j))*&
645 ((pmflxr(i,j+1)+pmflxs(i,j+1))*qpr(i,j+1,it)+&
646 pa(i,j)*qpa(i,j,it)+pm(i,j)*qmel(i,j,it))&
647 +(-mp(i,j+1)*qdi(i,j+1,it)) * (imp(i,j)/
rg*dxpres(i,j)))
651 qdi(i,j,it)=tr(i,j,it)
652 if(no_precip(i,j))
then
655 qpr(i,j,it)=((pmflxr(i,j+1)+pmflxs(i,j+1))*qpr(i,j+1,it)+&
656 pa(i,j)*qpa(i,j,it)+pm(i,j)*qmel(i,j,it)&
657 +imp(i,j)/
rg*dxpres(i,j)*tr(i,j,it))/&
658 (pmflxr(i,j+1)+pmflxs(i,j+1)+pa(i,j)+pm(i,j))
666 if(mp(i,j+1).gt.mp(i,j).and.mp(i,j+1).gt.1.e-10)
then
667 if(no_precip(i,j))
then
668 qdi(i,j,it)=qdi(i,j+1,it)
671 qdi(i,j,it)=kappa(i,j)*(&
672 (-evap(i,j)/
rg*dxpres(i,j))*((pmflxr(i,j+1)+pmflxs(i,j+1))*qpr(i,j+1,it)+&
673 pa(i,j)*qpa(i,j,it)+pm(i,j)*qmel(i,j,it)) +&
674 (pmflxr(i,j+1)+pmflxs(i,j+1)+pa(i,j)+pm(i,j))*&
675 (-mp(i,j+1)*qdi(i,j+1,it)))
677 qpr(i,j,it)=kappa(i,j)*(&
678 (-mp(i,j+1)-imp(i,j)/
rg*dxpres(i,j))*&
679 ((pmflxr(i,j+1)+pmflxs(i,j+1))*qpr(i,j+1,it)+&
680 pa(i,j)*qpa(i,j,it)+pm(i,j)*qmel(i,j,it))&
681 +(-mp(i,j+1)*qdi(i,j+1,it)) * (imp(i,j)/
rg*dxpres(i,j)))
684 elseif(mp(i,j).gt.mp(i,j+1).and.mp(i,j).gt.1.e-10)
then
685 if(no_precip(i,j))
then
686 qdi(i,j,it)=(-mp(i,j+1)*(qdi(i,j+1,it)-tr(i,j,it))-mp(i,j)*tr(i,j,it))/(-mp(i,j))
689 qdi(i,j,it)=kappa(i,j)*(&
690 (-evap(i,j)/
rg*dxpres(i,j))*((pmflxr(i,j+1)+pmflxs(i,j+1))*qpr(i,j+1,it)+&
691 pa(i,j)*qpa(i,j,it)+pm(i,j)*qmel(i,j,it)) +&
692 (pmflxr(i,j+1)+pmflxs(i,j+1)+pa(i,j)+pm(i,j))*&
693 (-mp(i,j+1)*(qdi(i,j+1,it)-tr(i,j,it))-mp(i,j)*tr(i,j,it)))
695 qpr(i,j,it)=kappa(i,j)*(&
696 (-mp(i,j)-imp(i,j)/
rg*dxpres(i,j))*&
697 ((pmflxr(i,j+1)+pmflxs(i,j+1))*qpr(i,j+1,it)+&
698 pa(i,j)*qpa(i,j,it)+pm(i,j)*qmel(i,j,it))&
699 +(-mp(i,j+1)*(qdi(i,j+1,it)-tr(i,j,it))-mp(i,j)*tr(i,j,it))*&
700 (imp(i,j)/
rg*dxpres(i,j)))
704 qdi(i,j,it)=tr(i,j,it)
705 if(no_precip(i,j))
then
708 qpr(i,j,it)=((pmflxr(i,j+1)+pmflxs(i,j+1))*qpr(i,j+1,it)+&
709 pa(i,j)*qpa(i,j,it)+pm(i,j)*qmel(i,j,it)&
710 +imp(i,j)/
rg*dxpres(i,j)*tr(i,j,it))/&
711 (pmflxr(i,j+1)+pmflxs(i,j+1)+pa(i,j)+pm(i,j))
743 tdcvma=zmfd(i,k,it)+zmfu(i,k,it)+zmfa(i,k,it)+zmfp(i,k,it)
744 trsptrac=zmfu(i,k,it)+zmfa(i,k,it)+zmfp(i,k,it)
749 scavtrac=-ccntraa_coef3d(i,k)*zmfd1a(i,k,it)&
750 -zmfphi2(i,k,it)*ccntrenv_coef3d(i,k)&
751 -zmfdam(i,k,it)*ccntraa_coef3d(i,k)
753 if(k.le.inb(i).and.k.gt.1)
then
755 if(mp(i,k+1).gt.mp(i,k).and.mp(i,k+1).gt.1.e-10)
then
756 uscavtrac= (-mp(i,k)+mp(i,k+1))*(qdi(i,k,it)-tr(i,k,it))&
757 + mp(i,k)*(tr(i,k-1,it)-tr(i,k,it))
764 elseif(mp(i,k).gt.mp(i,k+1).and.mp(i,k).gt.1.e-10)
then
765 uscavtrac= mp(i,k)*(tr(i,k-1,it)-tr(i,k,it))
771 if(no_precip(i,k))
then
775 uscavtrac=-imp(i,k)*tr(i,k,it)*dxpres(i,k)/
rg+evap(i,k)*qpr(i,k,it)*dxpres(i,k)/
rg
789 if(mp(i,2).gt.1.e-10)
then
790 uscavtrac= (-0.+mp(i,2))*(qdi(i,k,it)-tr(i,k,it))
798 if(no_precip(i,1))
then
801 uscavtrac=-imp(i,k)*tr(i,k,it)*dxpres(i,k)/
rg+evap(i,k)*qpr(i,k,it)*dxpres(i,k)/
rg
811 trsptd(i,k,it)=trsptrac*pdtimerg/dxpres(i,k)
812 dtrsscav(i,k,it)=scavtrac*pdtimerg/dxpres(i,k)
813 dtruscav(i,k,it)=uscavtrac*pdtimerg/dxpres(i,k)
814 dtrsat(i,k,it)=(trsptrac+scavtrac)*pdtimerg/dxpres(i,k)
815 dtrcv(i,k,it)=(trsptrac+scavtrac+uscavtrac)*pdtimerg/dxpres(i,k)
817 dtrcvma(i,k,it)=tdcvma*pdtimerg/dxpres(i,k)
!$Id mode_top_bound COMMON comconstr r
!$Id!INTEGER ih2o2 REAL rho_water
subroutine cvltr_spl(pdtime, da, phi, phi2, d1a, dam, mpIN, epIN, sigd, sij, wght_cvfd, clw, elij, epmlmMm, eplaMm, pmflxrIN, pmflxsIN, ev, te, wdtrainA, wdtrainM, paprs, it, tr, upd, dnd, inb, icb, kk, henry, zrho, ccntrAA_spla, ccntrENV_spla, coefcoli_spla, id_prec, id_fine, id_coss, id_codu, id_scdu, dtrcv, trsptd, dtrSscav, dtrsat, dtrUscav, qDi, qPr, qPa, qMel, qTrdi, dtrcvMA, Mint, zmfd1a, zmfphi2, zmfdam)
!$Id Turb_fcg_gcssold get_uvd it
!$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
character(len=20), dimension(:), allocatable, save tname
!$Id sig2feed!common comconema2 iflag_cvl_sigd common comconema1 epmax
!$Id!Parameters for nlm real sigd