195 & IM,KM,A,B,C,ten_q,U1,V1,T1,Q1,KPBL, &
196 & PRSI,DEL,PRSL,PRSLK,PHII, PHIL,DELTIM,KDT, &
197 & HPRIME,OC,OA4,CLX4,THETA,SIGMA,GAMMA,ELVMAX, &
198 & DUSFC,DVSFC,dtaux2d_ms,dtauy2d_ms,dtaux2d_bl, &
199 & dtauy2d_bl,dusfc_ms,dvsfc_ms,dusfc_bl,dvsfc_bl, &
200 & G, CP, RD, RV, IMX, &
201 & nmtvr, cdmbgwd, me, lprnt, ipr, rdxzb, ldiag_ugwp, &
296 USE machine ,
ONLY : kind_phys
300 integer,
intent(in) :: im, km, imx, kdt, ipr, me
301 integer,
intent(in) :: KPBL(:)
302 real(kind=kind_phys),
intent(in) :: &
303 & deltim, g, cp, rd, rv, cdmbgwd(:)
304 real(kind=kind_phys),
intent(out) :: &
305 & a(:,:), b(:,:), c(:,:)
306 real(kind=kind_phys),
intent(out) :: ten_q(:,:,:)
307 real(kind=kind_phys),
intent(in) :: &
308 & u1(:,:), v1(:,:), t1(:,:), &
309 & q1(:,:), prsi(:,:), del(:,:), &
310 & prsl(:,:), prslk(:,:), phil(:,:), &
312 real(kind=kind_phys),
intent(in) :: &
313 & oc(:), oa4(:,:), clx4(:,:), hprime(:)
314 real(kind=kind_phys),
intent(inout) :: elvmax(:)
315 real(kind=kind_phys),
intent(in) :: &
316 & theta(:), sigma(:), gamma(:)
317 real(kind=kind_phys),
intent(inout) :: dusfc(:), dvsfc(:), &
319 real(kind=kind_phys),
intent(inout),
optional :: dtaux2d_ms(:,:), &
320 & dtauy2d_ms(:,:), dtaux2d_bl(:,:), &
322 real(kind=kind_phys),
intent(inout),
optional :: dusfc_ms(:), &
323 & dvsfc_ms(:), dusfc_bl(:), dvsfc_bl(:)
324 integer,
intent(in) :: nmtvr
325 logical,
intent(in) :: lprnt
326 logical,
intent(in) :: ldiag_ugwp
327 character(len=*),
intent(out) :: errmsg
328 integer,
intent(out) :: errflg
332 real(kind=kind_phys) wk(im)
333 real(kind=kind_phys) bnv2lm(im,km),pe(im),ek(im),zbk(im),up(im)
334 real(kind=kind_phys) db(im,km),ang(im,km),uds(im,km)
335 real(kind=kind_phys) zlen, rtrm, phiang, cdmb, dbim, zr, cdmbo4
336 real(kind=kind_phys) eng0, eng1
340 real(kind=kind_phys) pi, dw2min, rimin, ric, bnv2min, efmin
341 &, efmax,hpmax,hpmin, rad_to_deg, deg_to_rad
342 parameter(pi=3.1415926535897931)
343 parameter(rad_to_deg=180.0/pi, deg_to_rad=pi/180.0)
344 parameter(dw2min=1., rimin=-100., ric=0.25, bnv2min=1.0e-5)
346 parameter(efmin=0.0, efmax=10.0, hpmax=2400.0, hpmin=1.0)
348 real(kind=kind_phys) frc, ce, ceofrc, frmax, cg, gmax
349 &, veleps, factop, rlolev, rdi
351 parameter(frc=1.0, ce=0.8, ceofrc=ce/frc, frmax=100., cg=0.5)
352 parameter(gmax=1.0, veleps=1.0, factop=0.5)
354 parameter(rlolev=50000.0)
358 real(kind=kind_phys) dpmin,hminmt,hncrit,minwnd,sigfac
361 parameter(hncrit=8000.)
364 parameter(sigfac=4.0)
365 parameter(hminmt=50.)
366 parameter(minwnd=0.1)
372 parameter(dpmin=5000.0)
375 real(kind=kind_phys) fdir
377 parameter(mdir=8, fdir=mdir/(pi+pi))
379 data nwdir/6,7,5,8,2,3,1,4/
386 real(kind=kind_phys) taub(im), xn(im), yn(im), ubar(im) &
387 &, vbar(im), ulow(im), oa(im), clx(im) &
388 &, roll(im), uloi(im) &
389 &, dtfac(im), xlinv(im), delks(im)
392 real(kind=kind_phys) bnv2(im,km), taup(im,km+1), ri_n(im,km) &
393 &, taud(im,km), ro(im,km), vtk(im,km) &
394 &, vtj(im,km), scor(im), velco(im,km-1) &
395 &, bnv2bar(im), cdsigohp(im)
398 integer kref(IM), kint(im), iwk(im), ipt(im)
402 integer idxzb(im), ktrial, klevm1
404 real(kind=kind_phys) gor, gocp, fv, gr2, bnv, fr &
405 &, brvf, cleff, tem, tem1, tem2, temc, temv&
406 &, wdir, ti, rdz, dw2, shr2, bvf2 &
407 &, rdelks, efact, coefm, gfobnv, onebg &
408 &, scork, rscor, hd, fro, rim, sira &
409 &, dtaux, dtauy, pkp1log, pklog &
410 &, cosang, sinang, cos2a, sin2a, oneocpdt
412 integer kmm1, kmm2, lcap, lcapp1, kbps, kbpsp1,kbpsm1 &
413 &, kmps, idir, nwd, i, j, k, klcap, kp1, kmpbl, npt, npr, kmll
429 cdmb = 4.0 * 192.0/float(imx)
430 if (cdmbgwd(1) >= 0.0) cdmb = cdmb * cdmbgwd(1)
449 oneocpdt = 1.0 / (cp*deltim)
459 IF ( nmtvr == 14)
then
464 IF (elvmax(i) > hminmt .and. hprime(i) > hpmin)
then
504 elvmax(j) = min(elvmax(j) + sigfac * hprime(j), hncrit)
505 cdsigohp(i) = cdmbo4 * sigma(j) / hprime(j)
513 pkp1log = phil(j,k+1) * onebg
514 pklog = phil(j,k) * onebg
517 if (elvmax(j) <= pkp1log .and. elvmax(j) >= pklog)
THEN
521 wk(i) = g * elvmax(j) / (phil(j,k+1) - phil(j,k))
522 iwklm(i) = max(iwklm(i), k+1)
528 vtj(i,k) = t1(j,k) * (1.0+fv*q1(j,k))
529 vtk(i,k) = vtj(i,k) / prslk(j,k)
530 ro(i,k) = rdi * prsl(j,k) / vtj(i,k)
553 rdz = g / (phil(j,kp1) - phil(j,k))
556 bnv2lm(i,k) = (g+g) * rdz * (vtk(i,kp1) - vtk(i,k))
557 & / (vtk(i,kp1) + vtk(i,k))
558 bnv2lm(i,k) = max( bnv2lm(i,k), bnv2min )
565 delks(i) = 1.0 / (prsi(j,1) - prsi(j,iwklm(i)))
572 bnv2bar(i) = (prsi(j,1)-prsl(j,1)) * delks(i) * bnv2lm(i,1)
597 rdelks = del(j,k) * delks(i)
598 ubar(i) = ubar(i) + rdelks * u1(j,k)
599 vbar(i) = vbar(i) + rdelks * v1(j,k)
600 roll(i) = roll(i) + rdelks * ro(i,k)
601 if (k < iwklm(i)-1)
then
602 rdelks = (prsl(j,k)-prsl(j,k+1)) * delks(i)
604 rdelks = (prsl(j,k)-prsi(j,k+1)) * delks(i)
606 bnv2bar(i) = bnv2bar(i) + bnv2lm(i,k) * rdelks
618 DO k = iwklm(i), 1, -1
619 phiang = atan2(v1(j,k),u1(j,k))*rad_to_deg
620 ang(i,k) = ( theta(j) - phiang )
621 if ( ang(i,k) > 90. ) ang(i,k) = ang(i,k) - 180.
622 if ( ang(i,k) < -90. ) ang(i,k) = ang(i,k) + 180.
623 ang(i,k) = ang(i,k) * deg_to_rad
633 & max(sqrt(u1(j,k)*u1(j,k) + v1(j,k)*v1(j,k)), minwnd)
635 IF (idxzb(i) == 0 )
then
636 pe(i) = pe(i) + bnv2lm(i,k) * (g*elvmax(j) - phil(j,k))
637 & * (phii(j,k+1) - phii(j,k))
643 up(i) = uds(i,k) * cos(ang(i,k))
644 ek(i) = 0.5 * up(i) * up(i)
647 IF (pe(i) >= ek(i))
THEN
649 rdxzb(j) = real(k,kind=kind_phys)
683 & - sqrt(ubar(i)*ubar(i) + vbar(i)*vbar(i))/bnv2bar(i)
698 IF (idxzb(i) > 0)
then
699 DO k = idxzb(i), 1, -1
700 IF (phil(j,idxzb(i)) > phil(j,k))
then
709 zlen = sqrt( (phil(j,idxzb(i)) - phil(j,k))
710 & / (phil(j,k ) + g*hprime(j)) )
722 cosang = cos(ang(i,k))
723 sinang = sin(ang(i,k))
724 cos2a = cosang * cosang
725 sin2a = sinang * sinang
726 tem = cos2a + gamma(j)*sin2a
729 if (abs(tem) > 1.e-06)
then
730 rtrm = (gamma(j)*cos2a + sin2a) / tem
731 elseif (tem > 0.0)
then
732 rtrm = (gamma(j)*cos2a + sin2a) * 1.0e6
734 rtrm = - (gamma(j)*cos2a + sin2a) * 1.0e6
736 zr = max( 2.0 - rtrm, 0. )
749 db(i,k) = cdsigohp(i) * zr * ro(i,k) * zlen
750 & * max(cosang, gamma(j)*sinang) * uds(i,k)
768 ELSEIF ( nmtvr /= 14)
then
773 IF ( hprime(i) > hpmin )
then
776 if (ipr == i) npr = npt
803 cleff = 0.5e-5 / sqrt(float(imx)/192.0)
809 if (cdmbgwd(2) >= 0.0) cleff = cleff * cdmbgwd(2)
814 vtj(i,k) = t1(j,k) * (1.0+fv*q1(j,k))
815 vtk(i,k) = vtj(i,k) / prslk(j,k)
816 ro(i,k) = rdi * prsl(j,k) / vtj(i,k)
824 ti = 2.0 / (t1(j,k)+t1(j,kp1))
825 tem = ti / (prsl(j,k)-prsl(j,kp1))
826 rdz = g / (phil(j,kp1) - phil(j,k))
827 tem1 = u1(j,k) - u1(j,kp1)
828 tem2 = v1(j,k) - v1(j,kp1)
829 dw2 = tem1*tem1 + tem2*tem2
830 shr2 = max(dw2,dw2min) * rdz * rdz
831 bvf2 = g*(gocp+rdz*(vtj(i,kp1)-vtj(i,k))) * ti
832 ri_n(i,k) = max(bvf2/shr2,rimin)
836 bnv2(i,k) = (g+g) * rdz * (vtk(i,kp1)-vtk(i,k))
837 & / (vtk(i,kp1)+vtk(i,k))
838 bnv2(i,k) = max( bnv2(i,k), bnv2min )
864 tem = (prsi(j,1) - prsi(j,k))
865 if (tem < dpmin) iwk(i) = k
875 kref(i) = max(iwk(i), kpbl(j)+1 )
876 delks(i) = 1.0 / (prsi(j,1) - prsi(j,kref(i)))
881 kbps = max(kbps, kref(i))
882 kmps = min(kmps, kref(i))
884 bnv2bar(i) = (prsi(j,1)-prsl(j,1)) * delks(i) * bnv2(i,1)
891 IF (k < kref(i))
THEN
893 rdelks = del(j,k) * delks(i)
894 ubar(i) = ubar(i) + rdelks * u1(j,k)
895 vbar(i) = vbar(i) + rdelks * v1(j,k)
897 roll(i) = roll(i) + rdelks * ro(i,k)
898 if (k < kref(i)-1)
then
899 rdelks = (prsl(j,k)-prsl(j,k+1)) * delks(i)
901 rdelks = (prsl(j,k)-prsi(j,k+1)) * delks(i)
903 bnv2bar(i) = bnv2bar(i) + bnv2(i,k) * rdelks
918 wdir = atan2(ubar(i),vbar(i)) + pi
919 idir = mod(nint(fdir*wdir),mdir) + 1
921 oa(i) = (1-2*int( (nwd-1)/4 )) * oa4(j,mod(nwd-1,4)+1)
922 clx(i) = clx4(j,mod(nwd-1,4)+1)
948 ulow(i) = max(sqrt(ubar(i)*ubar(i) + vbar(i)*vbar(i)), 1.0)
949 uloi(i) = 1.0 / ulow(i)
956 velco(i,k) = 0.5 * ((u1(j,k)+u1(j,kp1))*ubar(i)
957 & + (v1(j,k)+v1(j,kp1))*vbar(i))
958 velco(i,k) = velco(i,k) * uloi(i)
991 bnv = sqrt( bnv2bar(i) )
992 fr = bnv * uloi(i) * min(hprime(j),hpmax)
994 xn(i) = ubar(i) * uloi(i)
995 yn(i) = vbar(i) * uloi(i)
1040 efact = (oa(i) + 2.) ** (ceofrc*fr)
1041 efact = min( max(efact,efmin), efmax )
1043 coefm = (1. + clx(i)) ** (oa(i)+1.)
1045 xlinv(i) = coefm * cleff
1047 tem = fr * fr * oc(j)
1048 gfobnv = gmax * tem / ((tem + cg)*bnv)
1050 taub(i) = xlinv(i) * roll(i) * ulow(i) * ulow(i)
1051 & * ulow(i) * gfobnv * efact
1056 k = max(1, kref(i)-1)
1057 tem = max(velco(i,k)*velco(i,k), 0.1)
1058 scor(i) = bnv2(i,k) / tem
1066 IF (k <= kref(i)) taup(i,k) = taub(i)
1080 IF (k >= kref(i))
THEN
1081 icrilv(i) = icrilv(i) .OR. ( ri_n(i,k) < ric)
1082 & .OR. (velco(i,k) <= 0.0)
1099 IF (k >= kref(i))
THEN
1100 IF (.NOT.icrilv(i) .AND. taup(i,k) > 0.0 )
THEN
1101 temv = 1.0 / max(velco(i,k), 0.01)
1103 IF (oa(i) > 0. .AND. kp1 < kint(i))
THEN
1104 scork = bnv2(i,k) * temv * temv
1105 rscor = min(1.0, scork / scor(i))
1123 brvf = sqrt(bnv2(i,k))
1125 tem1 = xlinv(i)*(ro(i,kp1)+ro(i,k))*brvf*0.5
1126 & * max(velco(i,k),0.01)
1127 hd = sqrt(taup(i,k) / tem1)
1128 fro = brvf * hd * temv
1141 tem2 = sqrt(ri_n(i,k))
1142 tem = 1. + tem2 * fro
1143 rim = ri_n(i,k) * (1.-fro) / (tem * tem)
1164 IF (rim <= ric .AND.
1166 & (oa(i) <= 0. .OR. kp1 >= kint(i) ))
THEN
1167 temc = 2.0 + 1.0 / tem2
1168 hd = velco(i,k) * (2.*sqrt(temc)-temc) / brvf
1169 taup(i,kp1) = tem1 * hd * hd
1171 taup(i,kp1) = taup(i,k) * rscor
1173 taup(i,kp1) = min(taup(i,kp1), taup(i,k))
1184 DO klcap = lcapp1, km+1
1186 sira = prsi(ipt(i),klcap) / prsi(ipt(i),lcap)
1187 taup(i,klcap) = sira * taup(i,lcap)
1196 taud(i,k) = g * (taup(i,k+1) - taup(i,k)) / del(ipt(i),k)
1205 taud(i,klcap) = taud(i,klcap) * factop
1215 IF (k > kref(i) .and. prsi(ipt(i),k) >= rlolev)
THEN
1216 IF(taud(i,k) /= 0.)
THEN
1217 tem = deltim * taud(i,k)
1218 dtfac(i) = min(dtfac(i),abs(velco(i,k)/tem))
1237 taud(i,k) = taud(i,k) * dtfac(i)
1238 dtaux = taud(i,k) * xn(i)
1239 dtauy = taud(i,k) * yn(i)
1240 eng0 = 0.5*(u1(j,k)*u1(j,k)+v1(j,k)*v1(j,k))
1242 if (k < idxzb(i))
then
1244 dbim = db(i,k) / (1.+db(i,k)*deltim)
1245 a(j,k) = - dbim * v1(j,k)
1246 b(j,k) = - dbim * u1(j,k)
1247 eng1 = eng0*(1.0-dbim*deltim)*(1.0-dbim*deltim)
1253 tem1 = dbim * del(j,k)
1254 dusfc(j) = dusfc(j) + onebg * tem1 * u1(j,k)
1255 dvsfc(j) = dvsfc(j) + onebg * tem1 * v1(j,k)
1257 if (ldiag_ugwp)
then
1258 dtaux2d_bl(j,k) = - dbim * u1(j,k)
1259 dtauy2d_bl(j,k) = - dbim * v1(j,k)
1260 dusfc_bl(j) = dusfc_bl(j) + dtaux2d_bl(j,k) * del(j,k)
1261 dvsfc_bl(j) = dvsfc_bl(j) + dtauy2d_bl(j,k) * del(j,k)
1267 tem1 = u1(j,k) + dtaux*deltim
1268 tem2 = v1(j,k) + dtauy*deltim
1269 eng1 = 0.5 * (tem1*tem1+tem2*tem2)
1270 dusfc(j) = dusfc(j) - onebg * dtaux * del(j,k)
1271 dvsfc(j) = dvsfc(j) - onebg * dtauy * del(j,k)
1273 if (ldiag_ugwp)
then
1274 dtaux2d_ms(j,k) = dtaux
1275 dtauy2d_ms(j,k) = dtauy
1276 dusfc_ms(j) = dusfc_ms(j) + dtaux * del(j,k)
1277 dvsfc_ms(j) = dvsfc_ms(j) + dtauy * del(j,k)
1280 c(j,k) = max(eng0-eng1,0.) * oneocpdt
1290 if (ldiag_ugwp)
then
1294 dusfc_ms(j) = - onebg * dusfc_ms(j)
1295 dvsfc_ms(j) = - onebg * dvsfc_ms(j)
1296 dusfc_bl(j) = - onebg * dusfc_bl(j)
1297 dvsfc_bl(j) = - onebg * dvsfc_bl(j)