54 subroutine ecmwf_ngw_emc(mpi_id, master, KLON, KLEV, kdt, PTSTEP, DX, &
55 tau_ngw, PTM11, PUM11, PVM11, qm1, PAPM11, PAPHM11, PGEO11, zmeti1, prslk1, &
56 xlatd, sinlat, coslat, &
57 PTENU, PTENV, pdtdt, dked, zngw)
61 use machine,
only : kind_phys
64 use cires_ugwpv1_module,
only : psrc => knob_ugwp_palaunch
66 use cires_ugwpv1_module,
only : maxdudt, maxdtdt, max_eps, dked_min, dked_max
70 use ugwp_common ,
only : rgrav, grav, cpd, rd, rv, rcpdl, grav2cpd, &
71 omega2, rcpd, rcpd2, pi, pi2, fv, &
72 rad_to_deg, deg_to_rad, &
73 rdi, gor, grcp, gocp, &
74 bnv2min, bnv2max, dw2min, velmin, gr2, &
75 hpscale, rhp, rh4, grav2, rgrav2, mkzmin, mkz2min
91 use ugwp_wmsdis_init,
only : v_kxw, rv_kxw, v_kxw2, tamp_mpa, tau_min, ucrit, &
112 integer,
intent(in) :: KLEV
113 integer,
intent(in) :: KLON
114 integer,
intent(in) :: mpi_id, master, kdt
116 real(kind=kind_phys) ,
intent(in) :: ptstep
117 real(kind=kind_phys) ,
intent(in) :: dx(klon)
119 real(kind=kind_phys) ,
intent(in) :: tau_ngw(klon)
121 real(kind=kind_phys) ,
intent(in) :: pvm11(klon,klev)
122 real(kind=kind_phys) ,
intent(in) :: pum11(klon,klev)
123 real(kind=kind_phys) ,
intent(in) :: qm1(klon,klev)
124 real(kind=kind_phys) ,
intent(in) :: ptm11(klon,klev)
125 real(kind=kind_phys) ,
intent(in) :: papm11(klon,klev)
126 real(kind=kind_phys) ,
intent(in) :: paphm11(klon,klev+1)
127 real(kind=kind_phys) ,
intent(in) :: pgeo11(klon,klev)
129 real(kind=kind_phys) :: pvm1(klon,klev)
130 real(kind=kind_phys) :: pum1(klon,klev)
131 real(kind=kind_phys) :: qm(klon,klev)
132 real(kind=kind_phys) :: ptm1(klon,klev)
133 real(kind=kind_phys) :: papm1(klon,klev)
134 real(kind=kind_phys) :: paphm1(klon,klev+1)
135 real(kind=kind_phys) :: pgeo1(klon,klev)
144 real(kind=kind_phys) ,
intent(in) :: prslk1(klon,klev)
145 real(kind=kind_phys) :: prslk(klon,klev)
148 real(kind=kind_phys) ,
intent(in) :: zmeti1(klon,klev+1)
149 real(kind=kind_phys) :: zmeti(klon,klev+1)
150 real(kind=kind_phys) ,
intent(in) :: xlatd(klon)
151 real(kind=kind_phys) ,
intent(in) :: sinlat(klon)
152 real(kind=kind_phys) ,
intent(in) :: coslat(klon)
156 real(kind=kind_phys) ,
intent(out) :: ptenu(klon,klev)
157 real(kind=kind_phys) ,
intent(out) :: ptenv(klon,klev)
158 real(kind=kind_phys) ,
intent(out) :: pdtdt(klon,klev)
161 real(kind=kind_phys) :: pfluxu(klon,klev+1)
162 real(kind=kind_phys) :: pfluxv(klon,klev+1)
164 real(kind=kind_phys) ,
intent(out) :: dked(klon,klev)
166 real(kind=kind_phys) ,
intent(out) :: zngw(klon)
169 INTEGER,
PARAMETER :: IAZIDIM=4
170 INTEGER,
PARAMETER :: INCDIM=20
172 REAL(kind=kind_phys),
PARAMETER :: ra=6370.e3
173 REAL(kind=kind_phys),
PARAMETER :: gptwo=2.0
175 REAL(kind=kind_phys) :: zuhm1(klon,klev)
176 REAL(kind=kind_phys) :: zvhm1(klon,klev)
178 REAL(kind=kind_phys) :: zbvfhm1(klon,klev)
179 REAL(kind=kind_phys) :: zrhohm1(klon,klev)
180 REAL(kind=kind_phys) :: zx(incdim)
181 REAL(kind=kind_phys) :: zci(incdim)
182 REAL(kind=kind_phys) :: zdci(incdim)
183 REAL(kind=kind_phys) :: zui(klon,klev,iazidim)
184 REAL(kind=kind_phys) :: zul(klon,iazidim)
185 REAL(kind=kind_phys) :: zbvfl(klon)
186 REAL(kind=kind_phys) :: zcosang(iazidim)
187 REAL(kind=kind_phys) :: zsinang(iazidim)
188 REAL(kind=kind_phys) :: zfct(klon,klev)
189 REAL(kind=kind_phys) :: zfnorm(klon)
190 REAL(kind=kind_phys) :: zci_min(klon,iazidim)
191 REAL(kind=kind_phys) :: zthm1(klon,klev)
192 REAL(kind=kind_phys) :: zflux(klon,incdim,iazidim)
193 REAL(kind=kind_phys) :: zpu(klon,klev,iazidim)
194 REAL(kind=kind_phys) :: zdfl(klon,klev,iazidim)
195 REAL(kind=kind_phys) :: zact(klon,incdim,iazidim)
196 REAL(kind=kind_phys) :: zacc(klon,incdim,iazidim)
197 REAL(kind=kind_phys) :: zcrt(klon,klev,iazidim)
200 INTEGER :: INC, JK, JL, IAZI
203 REAL(KIND=kind_phys) :: zradtodeg, zgelatdeg
204 REAL(KIND=kind_phys) :: zcimin, zcimax
205 REAL(KIND=kind_phys) :: zgam, zpexp, zxmax, zxmin, zxran
206 REAL(KIND=kind_phys) :: zdx
208 REAL(KIND=kind_phys) :: zx1, zx2, zdxa, zdxb, zdxs
209 REAL(KIND=kind_phys) :: zang, zaz_fct, znorm, zang1, ztx
210 REAL(KIND=kind_phys) :: zu, zcin, zcpeak
211 REAL(KIND=kind_phys) :: zcin4, zbvfl4, zcin2, zbvfl2, zcin3, zbvfl3, zcinc
212 REAL(KIND=kind_phys) :: zatmp, zfluxs, zdep, zfluxsq, zulm, zdft, ze1, ze2
213 REAL(KIND=kind_phys) :: zms_l,zms, z0p5, z0p0, z50s
214 REAL(KIND=kind_phys) :: zgauss(klon), zfluxlaun(klon), zcngl(klon)
215 REAL(KIND=kind_phys) :: zcons1,zcons2,zdelp,zrgpts
219 REAL(KIND=kind_phys) :: gssec
220 REAL(KIND=kind_phys) :: zgaussb,zfluxglob
226 REAL(KIND=kind_phys) :: gcoeff, ggaussa
229 REAL(KIND=kind_phys) :: gcstar
232 LOGICAL :: LGACALC, LGSATL, LOZPR
234 integer :: NGAUSS, NSLOPE
252 zgaussb=0.5_kind_phys
277 zradtodeg=57.29577951_kind_phys
284 zfluxglob=3.60e-3_kind_phys
297 ptenu(:,:)=0.0_kind_phys
298 ptenv(:,:)=0.0_kind_phys
299 pdtdt(:,:)=0.0_kind_phys
300 dked(:,:)=0.0_kind_phys
304 pfluxu(jl,jk)=0.0_kind_phys
305 pfluxv(jl,jk)=0.0_kind_phys
313 zpu(jl,jk,iazi)=0.0_kind_phys
314 zcrt(jl,jk,iazi)=0.0_kind_phys
315 zdfl(jl,jk,iazi)=0.0_kind_phys
324 if (papm11(klon,jk) .LT. psrc)
exit
326 ilaunch = max(jk-1,3)
329 zngw(jl) = pgeo11(jl, ilaunch)
332 ilaunch = klev + 1 - ilaunch
339 ptm1(jl,:)=transfer(ptm11(jl,klev:1:-1),ptm11(jl,:))
340 pum1(jl,:)=transfer(pum11(jl,klev:1:-1),pum11(jl,:))
341 pvm1(jl,:)=transfer(pvm11(jl,klev:1:-1),pvm11(jl,:))
342 qm(jl,:)=transfer(qm1(jl,klev:1:-1),qm1(jl,:))
343 papm1(jl,:)=transfer(papm11(jl,klev:1:-1),papm11(jl,:))
344 pgeo1(jl,:)=transfer(pgeo11(jl,klev:1:-1),pgeo11(jl,:))
345 prslk(jl,:)=transfer(prslk1(jl,klev:1:-1),prslk1(jl,:))
347 dked(jl,:)=transfer(dked(jl,klev:1:-1),dked(jl,:))
348 ptenu(jl,:)=transfer(ptenu(jl,klev:1:-1),ptenu(jl,:))
349 ptenv(jl,:)=transfer(ptenv(jl,klev:1:-1),ptenv(jl,:))
350 pdtdt(jl,:)=transfer(pdtdt(jl,klev:1:-1),pdtdt(jl,:))
353 paphm1(jl,:)=transfer(paphm11(jl,klev+1:1:-1),paphm11(jl,:))
354 zmeti(jl,:)=transfer(zmeti1(jl,klev+1:1:-1),zmeti1(jl,:))
367 zcimin=0.50_kind_phys
368 zcimax=100.0_kind_phys
371 zpexp=gptwo/2.0_kind_phys
377 zci_min(jl,iazi)=zcimin
387 zthm1(jl,jk) =0.5_kind_phys*(ptm1(jl,jk-1)+ptm1(jl,jk))
388 zuhm1(jl,jk) =0.5_kind_phys*(pum1(jl,jk-1)+pum1(jl,jk))
389 zvhm1(jl,jk) =0.5_kind_phys*(pvm1(jl,jk-1)+pvm1(jl,jk))
395 zthm1(jl,jk)=ptm1(jl,jk)
396 zuhm1(jl,jk)=pum1(jl,jk)
397 zvhm1(jl,jk)=pvm1(jl,jk)
407 zcons1=1.0_kind_phys/rd
414 zdelp=(pgeo1(jl,jk)-pgeo1(jl,jk-1))*grav
415 zrhohm1(jl,jk)=paphm1(jl,jk)*zcons1/zthm1(jl,jk)
416 zbvfhm1(jl,jk)=zcons2/zthm1(jl,jk)*&
417 & (1.0_kind_phys+cpd*(ptm1(jl,jk)-ptm1(jl,jk-1))/zdelp)
419 zbvfhm1(jl,jk)=max(zbvfhm1(jl,jk),gssec)
420 zbvfhm1(jl,jk)=sqrt(zbvfhm1(jl,jk))
428 zaz_fct=1.0_kind_phys
439 zcosang(iazi)=cos(zang1)
440 zsinang(iazi)=sin(zang1)
441 znorm=znorm+abs(zcosang(iazi))
443 zaz_fct=2._kind_phys*zaz_fct/znorm
454 zxmax=1.0_kind_phys/zcimin
455 zxmin=1.0_kind_phys/zcimax
458 zdx=zxran/real(incdim-1)
459 IF(lgacalc) zgam=(zxmax-zxmin)/log(zxmax/zxmin)
463 zx1=zxran/(exp(zxran/zgam)-1.0_kind_phys)
470 ztx=real(inc-1)*zdx+zxmin
471 zx(inc)=zx1*exp((ztx-zxmin)/zgam)+zx2
472 zci(inc)=1.0_kind_phys/zx(inc)
473 zdci(inc)=zci(inc)**2*(zx1/zgam)*exp((ztx-zxmin)/zgam)*zdx
482 zul(jl,iazi)=zcosang(iazi)*zuhm1(jl,ilaunch)&
483 & +zsinang(iazi)*zvhm1(jl,ilaunch)
487 zbvfl(jl)=zbvfhm1(jl,ilaunch)
493 zu=zcosang(iazi)*zuhm1(jl,jk)+zsinang(iazi)*zvhm1(jl,jk)
494 zui(jl,jk,iazi)=zu-zul(jl,iazi)
503 zfct(jl,jk)=zrhohm1(jl,jk)/zbvfhm1(jl,jk)
540 zflux(jl,inc,1)=zfct(jl,ilaunch)*zbvfl4*min(zcin/zcin4,&
543 zflux(jl,inc,1)=zfct(jl,ilaunch)*zbvfl4*zcin/(zbvfl4+zcin4)
545 zact(jl,inc,1)=1.0_kind_phys
549 ELSEIF(nslope==2)
THEN
558 zflux(jl,inc,1)=zfct(jl,ilaunch)*zbvfl4*min&
559 & (zcpeak/zcin4,zcin/zbvfl4)
561 zflux(jl,inc,1)=zfct(jl,ilaunch)*zbvfl4*zcin*zcpeak/(zbvfl4&
562 & *zcpeak+zcin4*zcin)
564 zact(jl,inc,1)=1.0_kind_phys
568 ELSEIF(nslope==-1)
THEN
575 zflux(jl,inc,1)=zfct(jl,ilaunch)*zbvfl2*zcin/(zbvfl2+zcin2)
576 zact(jl,inc,1)=1.0_kind_phys
580 ELSEIF(nslope==0)
THEN
587 zflux(jl,inc,1)=zfct(jl,ilaunch)*zbvfl3*zcin/(zbvfl3+zcin3)
588 zact(jl,inc,1)=1.0_kind_phys
589 zacc(jl,inc,1)=1.0_kind_phys
604 zpu(jl,ilaunch,1)=zpu(jl,ilaunch,1)+zflux(jl,inc,1)*zcinc
615 zdxa=1.0_kind_phys/29.e3_kind_phys
616 zdxb=1.0_kind_phys/3.5e3_kind_phys
626 zdxs=1.0_kind_phys-min(1.0_kind_phys,atan((max(1.0_kind_phys&
627 & /dx(jl),zdxa)-zdxa)/(zdxb-zdxa)))
628 zfluxlaun(jl)=zfluxglob*zdxs
629 zfnorm(jl)=zfluxlaun(jl)/zpu(jl,ilaunch,1)
643 zgelatdeg=xlatd(jl)-z50s
644 zgauss(jl)=zgaussb*exp((-zgelatdeg*zgelatdeg)&
658 zgauss(jl)=0.08_kind_phys*exp((-zgelatdeg*zgelatdeg)&
659 & /(2*ggaussa*ggaussa))+zgauss(jl)
661 zgelatdeg=xlatd(jl)-50.0_kind_phys
662 zgauss(jl)= 0.1_kind_phys*exp((-zgelatdeg*zgelatdeg)&
663 & /(2*10.*10.))+zgauss(jl)
666 zfluxlaun(jl)=(1.0_kind_phys+zgauss(jl))*zfluxlaun(jl)
670 zfnorm(jl)=zfluxlaun(jl)/zpu(jl,ilaunch,1)
674 ELSEIF (ngauss==2)
THEN
679 zgauss(jl)=zgaussb*exp((-zgelatdeg*zgelatdeg)&
680 & /(2*ggaussa*ggaussa))
681 zfluxlaun(jl)=(1.0_kind_phys+zgauss(jl))*zfluxlaun(jl)
682 zfnorm(jl)=zfluxlaun(jl)/zpu(jl,ilaunch,1)
687 ELSEIF (ngauss==4)
THEN
693 zgelatdeg=xlatd(jl)-z50s
694 zgauss(jl)=zgaussb*exp((-zgelatdeg*zgelatdeg)/(2*ggaussa*ggaussa))
695 zfluxlaun(jl)=(1.0_kind_phys+zgauss(jl))*zfluxlaun(jl)
696 zfnorm(jl)=zfluxlaun(jl)/zpu(jl,ilaunch,1)
704 zpu(jl,ilaunch,iazi)=zfluxlaun(jl)
712 zfct(jl,jk)=zfnorm(jl)*zfct(jl,jk)
720 zflux(jl,inc,1)=zfnorm(jl)*zflux(jl,inc,1)
735 zflux(jl,inc,iazi)=zflux(jl,inc,1)
736 zact(jl,inc,iazi)=1.0_kind_phys
737 zacc(jl,inc,iazi)=1.0_kind_phys
761 zci_min(jl,iazi)=max(zci_min(jl,iazi),zui(jl,jk,iazi))
771 zatmp=z0p5+sign(z0p5,zcin-zci_min(jl,iazi))
772 zacc(jl,inc,iazi)=zact(jl,inc,iazi)-zatmp
773 zact(jl,inc,iazi)=zatmp
783 zdfl(jl,jk,iazi)=zdfl(jl,jk,iazi)+&
784 & zacc(jl,inc,iazi)*zflux(jl,inc,iazi)*zcinc
791 IF(zdfl(jl,jk,iazi)>0.0_kind_phys)
THEN
792 zatmp=zcrt(jl,jk,iazi)
794 zatmp=zatmp+zci(inc)*&
795 & zacc(jl,inc,iazi)*zflux(jl,inc,iazi)*zdci(inc)
797 zcrt(jl,jk,iazi)=zatmp/zdfl(jl,jk,iazi)
799 zcrt(jl,jk,iazi)=zcrt(jl,jk+1,iazi)
806 IF(gptwo==3.0_kind_phys)
THEN
809 zcinc=1.0_kind_phys/zcin
811 ze1=zcin-zui(jl,jk,iazi)
812 ze2=gcstar*zfct(jl,jk)*ze1
813 zfluxsq=ze2*ze2*ze1*zcinc
815 zdep=zact(jl,inc,iazi)*(zflux(jl,inc,iazi)**2-zfluxsq)
816 IF(zdep>0.0_kind_phys)
THEN
817 zflux(jl,inc,iazi)=sqrt(zfluxsq)
821 ELSEIF(gptwo==2.0_kind_phys)
THEN
824 zcinc=1.0_kind_phys/zcin
826 zfluxs=gcstar*zfct(jl,jk)*&
827 & (zcin-zui(jl,jk,iazi))**2*zcinc
829 zdep=zact(jl,inc,iazi)*(zflux(jl,inc,iazi)-zfluxs)
830 IF(zdep>0.0_kind_phys)
THEN
831 zflux(jl,inc,iazi)=zfluxs
843 zpu(jl,jk,iazi)=zpu(jl,jk,iazi)+&
844 & zact(jl,inc,iazi)*zflux(jl,inc,iazi)*zcinc
864 zrgpts=1.0_kind_phys/(grav*ptstep)
867 zcngl(jl)=0.0_kind_phys
871 zulm=zcosang(iazi)*pum1(jl,jk)+zsinang(iazi)*&
872 & pvm1(jl,jk)-zul(jl,iazi)
873 zdfl(jl,jk-1,iazi)=zdfl(jl,jk-1,iazi)+zcngl(jl)
874 zdft=min(zdfl(jl,jk-1,iazi),2.0_kind_phys*(papm1(jl,jk-1)-&
875 & papm1(jl,jk))*(zcrt(jl,jk-1,iazi)-zulm)*zrgpts)
878 zcngl(jl)=(zdfl(jl,jk-1,iazi)-zdft)
879 zpu(jl,jk,iazi)=zpu(jl,jk,iazi)-zcngl(jl)
891 pfluxu(jl,jk)=pfluxu(jl,jk)+zpu(jl,jk,iazi)*zaz_fct*zcosang(iazi)
892 pfluxv(jl,jk)=pfluxv(jl,jk)+zpu(jl,jk,iazi)*zaz_fct*zsinang(iazi)
906 zdelp= grav/(paphm1(jl,jk+1)-paphm1(jl,jk))
907 ze1=(pfluxu(jl,jk+1)-pfluxu(jl,jk))*zdelp
908 ze2=(pfluxv(jl,jk+1)-pfluxv(jl,jk))*zdelp
910 if (abs(ze1) >= maxdudt )
then
911 ze1 = sign(maxdudt, ze1)
913 if (abs(ze2) >= maxdudt )
then
914 ze2 = sign(maxdudt, ze2)
921 ze2=-(pum1(jl,jk)*ptenu(jl,jk)+pvm1(jl,jk)*ptenv(jl,jk))/cpd
922 if (abs(ze2) >= max_eps) pdtdt(jl,jk) = sign(max_eps, ze2)
931 dked(jl,:)=transfer(dked(jl,klev:1:-1),dked(jl,:))
932 ptenu(jl,:)=transfer(ptenu(jl,klev:1:-1),ptenu(jl,:))
933 ptenv(jl,:)=transfer(ptenv(jl,klev:1:-1),ptenv(jl,:))
934 pdtdt(jl,:)=transfer(pdtdt(jl,klev:1:-1),pdtdt(jl,:))