28 SUBROUTINE gwdps_v0(IM, km, imx, do_tofd, &
29 Pdvdt, Pdudt, Pdtdt, Pkdis, U1,V1,T1,Q1,KPBL, &
30 PRSI,DEL,PRSL,PRSLK,PHII, PHIL,DTP,KDT, &
31 sgh30, HPRIME,OC,OA4,CLX4,THETA,vSIGMA,vGAMMA,ELVMAXD, &
32 DUSFC, DVSFC, xlatd, sinlat, coslat, sparea, &
33 cdmbgwd, me, master, rdxzb, &
34 zmtb, zogw, tau_mtb, tau_ogw, tau_tofd, &
35 dudt_mtb, dudt_ogw, dudt_tms, errmsg,errflg )
43 USE machine ,
ONLY : kind_phys
45 pi, rad_to_deg, deg_to_rad, pi2, &
46 rdi, gor, grcp, gocp, fv, gr2, &
47 bnv2min, dw2min, velmin, arad
50 hpmax, hpmin, sigfaci => sigfac, &
51 dpmin, minwnd, hminmt, hncrit, &
52 rlolev, gmax, veleps, factop, &
53 frc, ce, ceofrc, frmax, cg, &
55 cdmb, cleff, fcrit_gfs, fcrit_mtb, &
56 n_tofd, ze_tofd, ztop_tofd
65 character(len=8) :: strsolver=
'PSS-1986'
66 real(kind=kind_phys),
parameter :: sigfac = 3
67 real(kind=kind_phys),
parameter :: sigfacs = 0.5
80 real(kind=kind_phys) :: gammin = 0.00999999
81 real(kind=kind_phys),
parameter :: nhilmax = 25.
82 real(kind=kind_phys),
parameter :: sso_min = 3000.
83 logical,
parameter :: do_adjoro = .true.
85 integer,
intent(in) :: im, km, imx, kdt
86 integer,
intent(in) :: me, master
87 logical,
intent(in) :: do_tofd
88 real(kind=kind_phys) :: ztoph,zlowh,ph_blk, dz_blk
89 integer,
intent(in) :: KPBL(IM)
90 real(kind=kind_phys),
intent(in) :: dtp
91 real(kind=kind_phys),
intent(in) :: cdmbgwd(2)
93 real(kind=kind_phys),
intent(in),
dimension(im,km) :: &
94 u1, v1, t1, q1, del, prsl, prslk, phil
96 real(kind=kind_phys),
intent(in),
dimension(im,km+1):: prsi, phii
97 real(kind=kind_phys),
intent(in) :: xlatd(im),sinlat(im), coslat(im)
98 real(kind=kind_phys),
intent(in) :: sparea(im)
100 real(kind=kind_phys),
intent(in) :: oc(im), oa4(im,4), clx4(im,4)
101 real(kind=kind_phys),
intent(in) :: hprime(im), sgh30(im)
102 real(kind=kind_phys),
intent(in) :: elvmaxd(im), theta(im)
103 real(kind=kind_phys),
intent(in) :: vsigma(im), vgamma(im)
104 real(kind=kind_phys) :: sigma(im), gamma(im)
109 real(kind=kind_phys),
dimension(im,km),
intent(out) :: &
110 pdvdt, pdudt, pkdis, pdtdt
112 real(kind=kind_phys),
dimension(im,km),
intent(out) :: &
113 dudt_mtb, dudt_ogw, dudt_tms
115 real(kind=kind_phys),
dimension(im) :: rdxzb, zmtb, zogw, &
116 tau_ogw, tau_mtb, tau_tofd, &
119 character(len=*),
intent(out) :: errmsg
120 integer,
intent(out) :: errflg
126 real(kind=kind_phys),
dimension(im) :: oa, clx
127 real(kind=kind_phys) :: shilmin, sgrmax, sgrmin
128 real(kind=kind_phys) :: belpmin, dsmin, dsmax
133 real(kind=kind_phys),
dimension(im,km) :: ri_n, bnv2, ro
134 real(kind=kind_phys),
dimension(im,km) :: vtk, vtj, velco
138 real(kind=kind_phys),
dimension(im) :: elvmax, wk
139 real(kind=kind_phys),
dimension(im) :: pe, ek, up
140 real(kind=kind_phys),
dimension(im,km) :: db, ang, uds
142 real(kind=kind_phys) :: zlen, dbtmp, r, phiang, dbim, zr
143 real(kind=kind_phys) :: eng0, eng1, cosang2, sinang2
144 real(kind=kind_phys) :: bgam, cgam, gam2, rnom, rdem
151 real(kind=kind_phys) :: unew, vnew, zpbl, sigflt, zsurf
152 real(kind=kind_phys),
dimension(km) :: utofd1, vtofd1
153 real(kind=kind_phys),
dimension(km) :: epstofd1, krf_tofd1
154 real(kind=kind_phys),
dimension(km) :: up1, vp1, zpm
155 real(kind=kind_phys),
dimension(im, km) :: axtms, aytms
159 real(kind=kind_phys) :: xlingfs
160 logical :: icrilv(im)
162 real(kind=kind_phys),
dimension(im) :: xn, yn, ubar, vbar, ulow, &
163 roll, bnv2bar, scor, dtfac, xlinv, delks, delks1
165 real(kind=kind_phys) :: taup(im,km+1), taud(im,km)
166 real(kind=kind_phys) :: taub(im), taulin(im), heff, hsat, hdis
168 integer,
dimension(im) :: kref, idxzb, ipt, kreflm, iwklm, iwk, izlow
172 real(kind=kind_phys) :: bnv, fr, ri_gw
173 real(kind=kind_phys) :: brvf, tem, tem1, tem2, temc, temv
174 real(kind=kind_phys) :: ti, rdz, dw2, shr2, bvf2
175 real(kind=kind_phys) :: rdelks, efact, coefm, gfobnv
176 real(kind=kind_phys) :: scork, rscor, hd, fro, sira
177 real(kind=kind_phys) :: dtaux, dtauy, pkp1log, pklog
178 real(kind=kind_phys) :: grav2, rcpdt, windik, wdir
179 real(kind=kind_phys) :: sigmin, dxres,sigres,hdxres, cdmb4, mtbridge
180 real(kind=kind_phys) :: kxridge, inv_b2eff, zw1, zw2
181 real(kind=kind_phys) :: belps, aelps, nhills, selps
186 integer :: kmm1, kmm2, lcap, lcapp1
187 integer :: npt, kbps, kbpsp1,kbpsm1
188 integer :: kmps, idir, nwd, klcap, kp1, kmpbl, kmll
189 integer :: k_mtb, k_zlow, ktrial, klevm1
197 rcpdt = 1.0 / (cpd*dtp)
202 sgrmax = maxval(sparea) ; sgrmin = minval(sparea)
203 dsmax = sqrt(sgrmax) ; dsmin = sqrt(sgrmin)
205 dxres = pi2*arad/float(imx)
210 gammin = min(sso_min/dxres, 1.)
213 sigmin = 2.*hpmin/dxres
226 sigma(i) = max(vsigma(i), sigmin)
227 gamma(i) = max(vgamma(i), gammin)
246 if ( elvmaxd(i) >= hminmt .and. hprime(i) >= hpmin )
then
249 sigres = max(sigmin, sigma(i))
250 dxres = sqrt(sparea(i))
251 if (2.*hprime(i)/sigres > dxres) sigres=2.*hprime(i)/dxres
252 aelps = min(2.*hprime(i)/sigres, 0.5*dxres)
253 if (gamma(i) > 0.0 ) belps = min(aelps/gamma(i),.5*dxres)
257 if( aelps < sso_min .and. do_adjoro)
then
262 if (belps < sso_min )
then
264 belps = aelps*gamma(i)
266 gamma(i) = min(aelps/belps, 1.0)
268 sigma(i) = 2.*hprime(i)/aelps
269 gamma(i) = min(aelps/belps, 1.0)
272 selps = belps*belps*gamma(i)*4.
273 nhills = min(nhilmax, sparea(i)/selps)
300 kmm1 = km - 1 ; kmm2 = km - 2 ; kmll = kmm1
301 lcap = km ; lcapp1 = lcap + 1
306 elvmax(j) = min(elvmaxd(j)*0. + sigfac * hprime(j), hncrit)
313 ztoph = sigfac * hprime(j)
314 zlowh = sigfacs* hprime(j)
315 pkp1log = phil(j,k+1) * rgrav
316 pklog = phil(j,k) * rgrav
318 if (( ztoph <= pkp1log) .and. (ztoph >= pklog) ) iwklm(i) = max(iwklm(i), k+1 )
320 if (zlowh <= pkp1log .and. zlowh >= pklog) izlow(i) = max(izlow(i),k)
327 vtj(i,k) = t1(j,k) * (1.+fv*q1(j,k))
328 vtk(i,k) = vtj(i,k) / prslk(j,k)
329 ro(i,k) = rdi * prsl(j,k) / vtj(i,k)
339 rdz = grav / (phil(j,k+1) - phil(j,k))
340 tem1 = u1(j,k) - u1(j,k+1)
341 tem2 = v1(j,k) - v1(j,k+1)
342 dw2 = tem1*tem1 + tem2*tem2
343 shr2 = max(dw2,dw2min) * rdz * rdz
348 bvf2 = grav2 * rdz * (vtk(i,k+1)-vtk(i,k)) &
349 / (vtk(i,k+1)+vtk(i,k))
350 bnv2(i,k+1) = max( bvf2, bnv2min )
353 ri_n(i,k+1) = bnv2(i,max(k,2))/shr2
361 bnv2(i,k) = bnv2(i,k+1)
369 if (k_zlow == iwklm(i)) k_zlow = 1
370 delks(i) = 1.0 / (prsi(j,k_zlow) - prsi(j,iwklm(i)))
382 if (k_zlow == iwklm(i)) k_zlow = 1
383 DO k = k_zlow, iwklm(i)-1
385 rdelks = del(j,k) * delks(i)
386 ubar(i) = ubar(i) + rdelks * u1(j,k)
387 vbar(i) = vbar(i) + rdelks * v1(j,k)
388 roll(i) = roll(i) + rdelks * ro(i,k)
389 bnv2bar(i) = bnv2bar(i) + .5*(bnv2(i,k)+bnv2(i,k+1))* rdelks
400 DO k = iwklm(i), 1, -1
401 phiang = atan2(v1(j,k),u1(j,k))*rad_to_deg
402 ang(i,k) = theta(j) - phiang
403 if ( ang(i,k) > 90. ) ang(i,k) = ang(i,k) - 180.
404 if ( ang(i,k) < -90. ) ang(i,k) = ang(i,k) + 180.
405 ang(i,k) = ang(i,k) * deg_to_rad
406 uds(i,k) = max(sqrt(u1(j,k)*u1(j,k) + v1(j,k)*v1(j,k)), velmin)
408 IF (idxzb(i) == 0 )
then
409 dz_blk = ( phii(j,k+1) - phii(j,k) ) *rgrav
410 pe(i) = pe(i) + bnv2(i,k) * ( elvmax(j) - phil(j,k)*rgrav ) * dz_blk
411 up(i) = max(uds(i,k) * cos(ang(i,k)), velmin)
412 ek(i) = 0.5 * up(i) * up(i)
413 ph_blk = ph_blk + dz_blk*sqrt(bnv2(i,k))/up(i)
417 IF ( ph_blk >= fcrit_gfs )
THEN
419 zmtb(j) = phil(j, k) * rgrav
420 rdxzb(j) = real(k, kind=kind_phys)
457 IF ( idxzb(i) > 0 )
then
459 gam2 = gamma(j)*gamma(j)
460 bgam = 1.0 - 0.18*gamma(j) - 0.04*gam2
461 cgam = 0.48*gamma(j) + 0.30*gam2
462 DO k = idxzb(i)-1, 1, -1
466 zlen = sqrt( ( phil(j,idxzb(i)) - phil(j,k) ) / &
467 ( phil(j,k ) + grav * hprime(j) ) )
471 sinang2 = 1.0 - cosang2
472 rdem = cosang2 + gam2 * sinang2
473 rnom = cosang2*gam2 + sinang2
480 rdem = max(rdem, 1.e-6)
482 zr = max( 2. - r, 0. )
483 sigres = max(sigmin, sigma(j))
484 mtbridge = zr * sigres*zlen / hprime(j)
486 cdmb4 = cdmbgwd(1) * 100.0 / sqrt(sqrt(sparea(j)))
488 dbtmp = cdmb4*mtbridge*(bgam * cosang2 + cgam * sinang2)
489 db(i,k)= dbtmp * uds(i,k)
514 tem = (prsi(j,1) - prsi(j,k))
515 if (tem < dpmin) iwk(i) = k
536 k_mtb = max(1, idxzb(i))
538 kref(i) = max(iwk(i), kpbl(j)+1 )
539 kref(i) = max(kref(i), iwklm(i) )
541 if (kref(i) <= idxzb(i)) kref(i) = idxzb(i) + 1
542 kbps = max(kbps, kref(i))
543 kmps = min(kmps, kref(i))
545 delks(i) = 1.0 / (prsi(j,k_mtb) - prsi(j,kref(i)))
557 k_mtb = max(1, idxzb(i))
559 IF (k < kref(i))
THEN
561 rdelks = del(j,k) * delks(i)
562 ubar(i) = ubar(i) + rdelks * u1(j,k)
563 vbar(i) = vbar(i) + rdelks * v1(j,k)
564 roll(i) = roll(i) + rdelks * ro(i,k)
565 bnv2bar(i) = bnv2bar(i) + .5*(bnv2(i,k)+bnv2(i,k+1))* rdelks
573 wdir = atan2(ubar(i),vbar(i)) + pi
574 idir = mod(nint(fdir*wdir),mdir) + 1
576 oa(i) = (1-2*int( (nwd-1)/4 )) * oa4(j,mod(nwd-1,4)+1)
577 clx(i) = clx4(j,mod(nwd-1,4)+1)
583 ulow(i) = max(sqrt(ubar(i)*ubar(i)+vbar(i)*vbar(i)),velmin)
584 xn(i) = ubar(i) / ulow(i)
585 yn(i) = vbar(i) / ulow(i)
591 velco(i,k) = 0.5 * ((u1(j,k)+u1(j,k+1))*xn(i) &
592 + (v1(j,k)+v1(j,k+1))*yn(i))
607 taub(:) = 0. ; taulin(:)= 0.
610 bnv = sqrt( bnv2bar(i) )
611 heff = min(hprime(j),hpmax)
613 if( zmtb(j) > 0.) heff = max(sigfac*heff-zmtb(j), 0.)/sigfac
616 hsat = fcrit_gfs*ulow(i)/bnv
617 heff = min(heff, hsat)
619 fr = min(bnv * heff /ulow(i), frmax)
621 efact = (oa(i) + 2.) ** (ceofrc*fr)
622 efact = min( max(efact,efmin), efmax )
624 coefm = (1. + clx(i)) ** (oa(i)+1.)
627 cleff = cdmbgwd(2) * 0.001 / sqrt(sqrt(sparea(j)))
628 xlinv(i) = coefm * cleff
629 xlingfs = coefm * cleff
631 tem = fr * fr * oc(j)
632 gfobnv = gmax * tem / ((tem + cg)*bnv)
636 sigres = max(sigmin, sigma(j))
637 if (heff/sigres > hdxres) sigres = heff/hdxres
638 inv_b2eff = 0.5*sigres/heff
639 kxridge = 1.0 / sqrt(sparea(j))
641 taulin(i) = 0.5*roll(i)*xlinv(i)*bnv*ulow(i)* heff*heff
643 if ( fr > fcrit_gfs )
then
644 taub(i) = xlinv(i) * roll(i) * ulow(i) * ulow(i) &
645 * ulow(i) * gfobnv * efact
649 taub(i) = xlinv(i) * roll(i) * ulow(i) * ulow(i) &
650 * ulow(i) * gfobnv * efact
657 k = max(1, kref(i)-1)
658 tem = max(velco(i,k)*velco(i,k), dw2min)
659 scor(i) = bnv2(i,k) / tem
663 zogw(j) = phii(j, kref(i)) *rgrav
670 IF (k <= kref(i)) taup(i,k) = taub(i)
674 if (strsolver ==
'PSS-1986')
then
688 IF (k >= kref(i))
THEN
689 icrilv(i) = icrilv(i) .OR. ( ri_n(i,k) < ric) &
690 .OR. (velco(i,k) <= 0.0)
695 IF (k >= kref(i))
THEN
696 IF (.NOT.icrilv(i) .AND. taup(i,k) > 0.0 )
THEN
697 temv = 1.0 / max(velco(i,k), velmin)
699 IF (oa(i) > 0. .AND. kp1 < kref(i))
THEN
700 scork = bnv2(i,k) * temv * temv
701 rscor = min(1.0, scork / scor(i))
707 brvf = sqrt(bnv2(i,k))
710 tem1 = xlinv(i)*(ro(i,kp1)+ro(i,k))*brvf*0.5 &
711 * max(velco(i,k), velmin)
712 hd = sqrt(taup(i,k) / tem1)
713 fro = brvf * hd * temv
718 tem2 = sqrt(ri_n(i,k))
719 tem = 1. + tem2 * fro
720 ri_gw = ri_n(i,k) * (1.0-fro) / (tem * tem)
725 IF (ri_gw <= ric .AND. &
726 (oa(i) <= 0. .OR. kp1 >= kref(i) ))
THEN
727 temc = 2.0 + 1.0 / tem2
728 hd = velco(i,k) * (2.*sqrt(temc)-temc) / brvf
729 taup(i,kp1) = tem1 * hd * hd
731 taup(i,kp1) = taup(i,k) * rscor
733 taup(i,kp1) = min(taup(i,kp1), taup(i,k))
741 taup(1:npt,km+1) = taup(1:npt,km)
747 taud(i,k) = grav*(taup(i,k+1) - taup(i,k))/del(ipt(i),k)
768 IF (k >= kref(i) .and. prsi(ipt(i),k) >= rlolev)
THEN
770 IF(taud(i,k) /= 0.)
THEN
771 tem = dtp * taud(i,k)
772 dtfac(i) = min(dtfac(i),abs(velco(i,k)/tem))
791 call oro_wam_2017(im, km, npt, ipt, kref, kdt, me, master, &
792 dtp, dxres, taub, u1, v1, t1, xn, yn, bnv2, ro, prsi,prsl, &
793 del, sigma, hprime, gamma, theta, &
794 sinlat, xlatd, taup, taud, pkdis)
804 axtms(:,:) = 0.0 ; aytms(:,:) = 0.0
809 zpbl =rgrav*phil( j, kpbl(j) )
811 sigflt = min(sgh30(j), 0.3*hprime(j))
813 zsurf = phii(j,1)*rgrav
815 zpm(k) = phil(j,k)*rgrav
820 call ugwpv0_tofd1d(km, sigflt, elvmaxd(j), zsurf, zpbl, &
821 up1, vp1, zpm, utofd1, vtofd1, epstofd1, krf_tofd1)
824 axtms(j,k) = utofd1(k)
825 aytms(j,k) = vtofd1(k)
829 pdvdt(j,k) = pdvdt(j,k) + aytms(j,k)
830 pdudt(j,k) = pdudt(j,k) + axtms(j,k)
833 tau_tofd(j) = sum( utofd1(1:km)* del(j,1:km))
850 eng0 = 0.5*(u1(j,k)*u1(j,k)+v1(j,k)*v1(j,k))
852 if ( k < idxzb(i) .AND. idxzb(i) /= 0 )
then
856 dbim = db(i,k) / (1.+db(i,k)*dtp)
857 pdvdt(j,k) = - dbim * v1(j,k) +pdvdt(j,k)
858 pdudt(j,k) = - dbim * u1(j,k) +pdudt(j,k)
859 eng1 = eng0*(1.0-dbim*dtp)*(1.-dbim*dtp)
861 dusfc(j) = dusfc(j) - dbim * u1(j,k) * del(j,k)
862 dvsfc(j) = dvsfc(j) - dbim * v1(j,k) * del(j,k)
864 dudt_mtb(j,k) = -dbim * u1(j,k)
865 tau_mtb(j) = tau_mtb(j) + dudt_mtb(j,k)* del(j,k)
871 taud(i,k) = taud(i,k) * dtfac(i)
872 dtaux = taud(i,k) * xn(i)
873 dtauy = taud(i,k) * yn(i)
875 pdvdt(j,k) = dtauy +pdvdt(j,k)
876 pdudt(j,k) = dtaux +pdudt(j,k)
878 unew = u1(j,k) + dtaux*dtp
879 vnew = v1(j,k) + dtauy*dtp
880 eng1 = 0.5*(unew*unew + vnew*vnew)
882 dusfc(j) = dusfc(j) + dtaux * del(j,k)
883 dvsfc(j) = dvsfc(j) + dtauy * del(j,k)
885 dudt_ogw(j,k) = dtaux
886 tau_ogw(j) = tau_ogw(j) +dtaux*del(j,k)
891 pdtdt(j,k) = max(eng0-eng1,0.)*rcpdt
897 dusfc(j) = -rgrav * dusfc(j)
898 dvsfc(j) = -rgrav * dvsfc(j)
899 tau_mtb(j) = -rgrav * tau_mtb(j)
900 tau_ogw(j) = -rgrav * tau_ogw(j)
901 tau_tofd(j) = -rgrav * tau_tofd(j)
914 subroutine fv3_ugwp_solv2_v0(klon, klev, dtime, &
915 tm1 , um1, vm1, qm1, &
916 prsl, prsi, philg, xlatd, sinlat, coslat, &
917 pdudt, pdvdt, pdtdt, dked, tau_ngw, &
928 use machine,
only : kind_phys
931 omega2, rcpd2, pi, pi2, fv, &
932 rad_to_deg, deg_to_rad, &
933 rdi, gor, grcp, gocp, &
934 bnv2min, dw2min, velmin, gr2
937 v_kxw, v_kxw2, tamp_mpa, zfluxglob, &
938 maxdudt, gw_eff, dked_min, &
939 nslope, ilaunch, zmsi, &
940 zci, zdci, zci4, zci3, zci2, &
941 zaz_fct, zcosang, zsinang, &
942 nwav, nazd, zcimin, zcimax
947 integer,
parameter :: kp = kind_phys
948 integer,
intent(in) :: klev
949 integer,
intent(in) :: klon
951 real,
intent(in) :: dtime
952 real,
intent(in) :: vm1(klon,klev)
953 real,
intent(in) :: um1(klon,klev)
954 real,
intent(in) :: qm1(klon,klev)
955 real,
intent(in) :: tm1(klon,klev)
957 real,
intent(in) :: prsl(klon,klev)
958 real,
intent(in) :: philg(klon,klev)
959 real,
intent(in) :: prsi(klon,klev+1)
960 real,
intent(in) :: xlatd(klon)
961 real,
intent(in) :: sinlat(klon)
962 real,
intent(in) :: coslat(klon)
963 real,
intent(in) :: tau_ngw(klon)
965 integer,
intent(in) :: mpi_id, master, kdt
970 real,
intent(out) :: pdudt(klon,klev)
971 real,
intent(out) :: pdvdt(klon,klev)
972 real,
intent(out) :: pdtdt(klon,klev)
973 real,
intent(out) :: dked(klon,klev)
974 real,
parameter :: minvel = 0.5_kp
975 real,
parameter :: epsln = 1.0e-12_kp
976 real,
parameter :: zero = 0.0_kp, one = 1.0_kp, half = 0.5_kp
980 real :: taux(klon,klev+1)
981 real :: tauy(klon,klev+1)
982 real :: phil(klon,klev)
989 real :: zbvfhm1(klon,ilaunch:klev)
990 real :: zbn2(klon,ilaunch:klev)
991 real :: zrhohm1(klon,ilaunch:klev)
992 real :: zuhm1(klon,ilaunch:klev)
993 real :: zvhm1(klon,ilaunch:klev)
994 real :: v_zmet(klon,ilaunch:klev)
995 real :: vueff(klon,ilaunch:klev)
1000 real :: zul(klon,nazd)
1001 real :: zci_min(klon,nazd)
1003 real :: zact(klon, nwav, nazd)
1006 real :: zpu(klon,klev, nazd)
1008 real :: zfct(klon,klev)
1009 real :: zfnorm(klon)
1011 real :: zfluxlaun(klon)
1012 real :: zui(klon, klev,nazd)
1014 real :: zdfdz_v(klon,klev, nazd)
1015 real :: zflux(klon, nwav, nazd)
1017 real :: zflux_z (klon, nwav,klev)
1019 real :: vm_zflx_mode, vc_zflx_mode
1020 real :: kzw2, kzw3, kdsat, cdf2, cdf1, wdop2
1023 real :: zu, zcin, zcpeak, zcin4, zbvfl4
1024 real :: zcin2, zbvfl2, zcin3, zbvfl3, zcinc
1025 real :: zatmp, zfluxs, zdep, zfluxsq, zulm, zdft, ze1, ze2
1028 real :: zdelp,zrgpts
1029 real :: zthstd,zrhostd,zbvfstd
1030 real :: tvc1, tvm1, tem1, tem2, tem3
1031 real :: zhook_handle
1032 real :: delpi(klon,ilaunch:klev)
1036 real,
parameter :: rcpdl = cpd/grav, &
1037 grav2cpd = grav/rcpdl, &
1040 real :: expdis, fdis
1042 real :: v_kzi, v_kzw, v_cdp, v_wdp, sc, tx1
1044 integer :: j, k, inc, jk, jl, iazi
1054 phil(j,k) = philg(j,k) * rgrav
1062 zpu(jl,jk,iazi) = zero
1073 zci_min(jl,iazi) = zcimin
1078 do jk=max(ilaunch,2),klev
1080 tvc1 = tm1(jl,jk) * (one +fv*qm1(jl,jk))
1081 tvm1 = tm1(jl,jk-1) * (one +fv*qm1(jl,jk-1))
1083 zthm1 = 2.0_kp / (tvc1+tvm1)
1084 zuhm1(jl,jk) = half *(um1(jl,jk-1)+um1(jl,jk))
1085 zvhm1(jl,jk) = half *(vm1(jl,jk-1)+vm1(jl,jk))
1087 zrhohm1(jl,jk) = prsi(jl,jk)*rdi*zthm1
1088 zdelp = phil(jl,jk)-phil(jl,jk-1)
1089 v_zmet(jl,jk) = zdelp + zdelp
1090 delpi(jl,jk) = grav / (prsi(jl,jk-1) - prsi(jl,jk))
1092 2.e-5_kp*exp( (phil(jl,jk)+phil(jl,jk-1))*rhp2)+dked_min
1095 zbn2(jl,jk) = grav2cpd*zthm1 &
1096 * (one+rcpdl*(tm1(jl,jk)-tm1(jl,jk-1))/zdelp)
1097 zbn2(jl,jk) = max(min(zbn2(jl,jk), gssec), bv2min)
1098 zbvfhm1(jl,jk) = sqrt(zbn2(jl,jk))
1102 if (ilaunch == 1)
then
1106 zuhm1(jl,jk) = um1(jl,jk)
1107 zvhm1(jl,jk) = vm1(jl,jk)
1108 zbvfhm1(jl,1) = zbvfhm1(jl,2)
1109 v_zmet(jl,1) = v_zmet(jl,2)
1110 vueff(jl,1) = dked_min
1111 zbn2(jl,1) = zbn2(jl,2)
1115 tx1 = omega2 * sinlat(jl) / v_kxw
1116 c2f2(jl) = tx1 * tx1
1117 zbvfl(jl) = zbvfhm1(jl,ilaunch)
1124 zul(jl,iazi) = zcosang(iazi) * zuhm1(jl,ilaunch) &
1125 + zsinang(iazi) * zvhm1(jl,ilaunch)
1129 do jk=ilaunch, klev-1
1132 zu = zcosang(iazi)*zuhm1(jl,jk) &
1133 + zsinang(iazi)*zvhm1(jl,jk)
1134 zui(jl,jk,iazi) = zu - zul(jl,iazi)
1141 do jk=ilaunch, klev-1
1143 zfct(jl,jk) = zrhohm1(jl,jk) / zbvfhm1(jl,jk)
1151 if(nslope == 1)
then
1158 zbvfl4 = zbvfl(jl) * zbvfl(jl)
1159 zbvfl4 = zbvfl4 * zbvfl4
1160 zflux(jl,inc,1) = zfct(jl,ilaunch)*zbvfl4*zcin &
1164 elseif(nslope == 2)
then
1170 zbvfl4 = zbvfl(jl) * zbvfl(jl)
1171 zbvfl4 = zbvfl4 * zbvfl4
1172 zcpeak = zbvfl(jl) * zmsi
1173 zflux(jl,inc,1) = zfct(jl,ilaunch)* &
1174 zbvfl4*zcin*zcpeak/(zbvfl4*zcpeak+zcin4*zcin)
1177 elseif(nslope == -1)
then
1183 zbvfl2 = zbvfl(jl)*zbvfl(jl)
1184 zflux(jl,inc,1) = zfct(jl,ilaunch)*zbvfl2*zcin &
1188 elseif(nslope == 0)
then
1195 zbvfl3 = zbvfl(jl)**3
1196 zflux(jl,inc,1) = zfct(jl,ilaunch)*zbvfl3*zcin &
1209 zpu(jl,ilaunch,1) = zpu(jl,ilaunch,1) + zflux(jl,inc,1)*zcinc
1218 zfluxlaun(jl) = tau_ngw(jl)
1219 zfnorm(jl) = zfluxlaun(jl) / zpu(jl,ilaunch,1)
1224 zpu(jl,ilaunch,iazi) = zfluxlaun(jl)
1230 do jk=ilaunch, klev-1
1232 zfct(jl,jk) = zfnorm(jl)*zfct(jl,jk)
1239 zflux(jl,inc,1) = zfnorm(jl)*zflux(jl,inc,1)
1250 zflux(jl,inc,iazi) = zflux(jl,inc,1)
1263 do jk=ilaunch, klev-1
1267 zci_min(jl,iazi) = max(zci_min(jl,iazi),zui(jl,jk,iazi))
1277 zact(jl,inc,iazi) = minvel &
1278 + sign(minvel,zci(inc)-zci_min(jl,iazi))
1313 if (abs(zcin) > epsln)
then
1324 v_cdp = abs(zcin-zui(jl,jk,iazi))
1326 wdop2 = v_wdp* v_wdp
1327 cdf2 = v_cdp*v_cdp - c2f2(jl)
1328 if (cdf2 > zero)
then
1329 kzw2 = (zbn2(jl,jk)-wdop2)/cdf2 - v_kxw2
1333 if ( kzw2 > zero .and. cdf2 > zero)
then
1341 v_cdp = sqrt( cdf2 )
1342 v_wdp = v_kxw * v_cdp
1343 v_kzi = abs(v_kzw*v_kzw*vueff(jl,jk)/v_wdp*v_kzw)
1344 expdis = exp(-v_kzi*v_zmet(jl,jk))
1354 fdis = expdis * zflux(jl,inc,iazi)
1359 zfluxs = zfct(jl,jk)*v_cdp*v_cdp*zcinc
1364 zdep = zact(jl,inc,iazi)* (fdis-zfluxs)
1365 if(zdep > zero )
then
1367 zflux(jl,inc,iazi) = zfluxs
1368 zflux_z(jl,inc,jk) = zfluxs
1371 zflux(jl,inc,iazi) = fdis
1372 zflux_z(jl,inc,jk) = fdis
1379 zdfdz_v(:,jk,iazi) = zero
1384 vc_zflx_mode = zact(jl,inc,iazi)*zflux(jl,inc,iazi)
1385 zpu(jl,jk,iazi) = zpu(jl,jk,iazi) + vc_zflx_mode*zcinc
1392 if (jk > ilaunch)
then
1395 zdelp = delpi(jl,jk) * abs(zcin-zui(jl,jk,iazi)) *zcinc
1396 vm_zflx_mode = zact(jl,inc,iazi)* zflux_z(jl,inc,jk-1)
1398 if (vc_zflx_mode > vm_zflx_mode) &
1399 vc_zflx_mode = vm_zflx_mode
1400 zdfdz_v( jl,jk,iazi) = zdfdz_v( jl,jk,iazi) + &
1401 (vm_zflx_mode-vc_zflx_mode)*zdelp
1426 tem1 = zaz_fct*zcosang(iazi)
1427 tem2 = zaz_fct*zsinang(iazi)
1428 do jk=ilaunch, klev-1
1430 taux(jl,jk) = taux(jl,jk) + tem1 * zpu(jl,jk,iazi)
1431 tauy(jl,jk) = tauy(jl,jk) + tem2 * zpu(jl,jk,iazi)
1432 pdtdt(jl,jk) = pdtdt(jl,jk) + tem3 * zdfdz_v(jl,jk,iazi)
1445 zdelp = delpi(jl,jk)
1446 ze1 = (taux(jl,jk)-taux(jl,jk-1))*zdelp
1447 ze2 = (tauy(jl,jk)-tauy(jl,jk-1))*zdelp
1448 if (abs(ze1) >= maxdudt )
then
1449 ze1 = sign(maxdudt, ze1)
1451 if (abs(ze2) >= maxdudt )
then
1452 ze2 = sign(maxdudt, ze2)
1459 pdtdt(jl,jk) = (ze1*um1(jl,jk) + ze2*vm1(jl,jk)) * cpdi
1461 dked(jl,jk) = max(dked_min, pdtdt(jl,jk)/zbn2(jl,jk))
1470 pdudt(jl,jk) = gw_eff * pdudt(jl,jk)
1471 pdvdt(jl,jk) = gw_eff * pdvdt(jl,jk)
1472 pdtdt(jl,jk) = gw_eff * pdtdt(jl,jk)
1473 dked(jl,jk) = gw_eff * dked(jl,jk)