205 subroutine drag_suite_run( &
206 & IM,KM,dvdt,dudt,dtdt,dqdt,U1,V1,T1,Q1,KPBL, &
207 & PRSI,DEL,PRSL,PRSLK,PHII,PHIL,DELTIM,KDT, &
209 & varss,oc1ss,oa4ss,ol4ss, &
210 & THETA,SIGMA,GAMMA,ELVMAX, &
211 & dtaux2d_ms,dtauy2d_ms,dtaux2d_bl,dtauy2d_bl, &
212 & dtaux2d_ss,dtauy2d_ss,dtaux2d_fd,dtauy2d_fd, &
214 & dusfc_ms,dvsfc_ms,dusfc_bl,dvsfc_bl, &
215 & dusfc_ss,dvsfc_ss,dusfc_fd,dvsfc_fd, &
217 & g, cp, rd, rv, fv, pi, imx, cdmbgwd, alpha_fd, &
218 & me, master, lprnt, ipr, rdxzb, dx, gwd_opt, &
219 & do_gsl_drag_ls_bl, do_gsl_drag_ss, do_gsl_drag_tofd, &
220 & flag_for_gwd_generic_tend, &
221 & dtend, dtidx, index_of_process_orographic_gwd, &
222 & index_of_temperature, index_of_x_wind, &
223 & index_of_y_wind, ldiag3d, ldiag_ugwp, ugwp_seq_update, &
224 & spp_wts_gwd, spp_gwd, errmsg, errflg)
318 USE machine ,
ONLY : kind_phys
322 integer,
intent(in) :: im, km, imx, kdt, ipr, me, master
323 integer,
intent(in) :: gwd_opt
324 logical,
intent(in) :: lprnt
325 integer,
intent(in) :: KPBL(:)
326 real(kind=kind_phys),
intent(in) :: deltim, g, cp, rd, rv, &
327 & cdmbgwd(:), alpha_fd
328 real(kind=kind_phys),
intent(inout),
optional :: dtend(:,:,:)
329 logical,
intent(in) :: ldiag3d, flag_for_gwd_generic_tend
330 integer,
intent(in) :: dtidx(:,:), index_of_temperature, &
331 & index_of_process_orographic_gwd, index_of_x_wind, index_of_y_wind
334 integer,
parameter :: ims=1, kms=1, its=1, kts=1
335 real(kind=kind_phys),
intent(in) :: fv, pi
336 real(kind=kind_phys) :: rcl, cdmb
337 real(kind=kind_phys) :: g_inv, rd_inv
339 real(kind=kind_phys),
intent(out) :: &
340 & dudt(:,:),dvdt(:,:), &
341 & dtdt(:,:),dqdt(:,:,:)
342 real(kind=kind_phys),
intent(inout) :: rdxzb(:)
343 real(kind=kind_phys),
intent(in) :: &
346 & phii(:,:),prsl(:,:), &
347 & prslk(:,:),phil(:,:)
348 real(kind=kind_phys),
intent(in) :: prsi(:,:), &
350 real(kind=kind_phys),
intent(in) :: var(:),oc1(:), &
351 & oa4(:,:),ol4(:,:), &
353 real(kind=kind_phys),
intent(in) :: varss(:),oc1ss(:), &
354 & oa4ss(:,:),ol4ss(:,:)
355 real(kind=kind_phys),
intent(in) :: theta(:),sigma(:), &
359 real(kind=kind_phys),
dimension(im,km) :: utendwave,vtendwave,thx,thvx
360 real(kind=kind_phys),
intent(in) :: br1(:), &
363 real(kind=kind_phys),
dimension(im) :: govrth,xland
365 real(kind=kind_phys) :: tauwavex0,tauwavey0, &
366 & xnbv,density,tvcon,hpbl2
367 integer :: kpbl2,kvar
369 real(kind=kind_phys),
dimension(im,km) :: zl
372 real(kind=kind_phys),
dimension(im) :: var_stoch, varss_stoch, &
374 real(kind=kind_phys),
intent(in),
optional :: spp_wts_gwd(:,:)
375 integer,
intent(in) :: spp_gwd
377 real(kind=kind_phys),
dimension(im) :: rstoch
380 real(kind=kind_phys),
intent(inout) :: &
383 real(kind=kind_phys),
intent(inout),
optional :: &
384 & dusfc_ms(:),dvsfc_ms(:), &
385 & dusfc_bl(:),dvsfc_bl(:), &
386 & dusfc_ss(:),dvsfc_ss(:), &
387 & dusfc_fd(:),dvsfc_fd(:)
388 real(kind=kind_phys),
intent(inout),
optional :: &
389 & dtaux2d_ms(:,:),dtauy2d_ms(:,:), &
390 & dtaux2d_bl(:,:),dtauy2d_bl(:,:), &
391 & dtaux2d_ss(:,:),dtauy2d_ss(:,:), &
392 & dtaux2d_fd(:,:),dtauy2d_fd(:,:)
395 real(kind=kind_phys),
dimension(im,km) :: dtaux2d, dtauy2d
401 logical,
intent(in) :: &
407 logical,
intent(in) :: ldiag_ugwp
411 logical,
intent(in) :: ugwp_seq_update
415 real(kind=kind_phys),
dimension(im,km) :: uwnd1, vwnd1
416 real(kind=kind_phys) :: tmp1, tmp2
419 logical,
parameter :: &
420 gwd_opt_ms = .true., &
421 gwd_opt_bl = .true., &
422 gsd_diss_ht_opt = .false.
426 real(kind=kind_phys),
parameter :: dxmin_ss = 1000., &
429 real(kind=kind_phys),
parameter :: dxmin_ms = 3000., &
431 real(kind=kind_phys),
dimension(im) :: ss_taper, ls_taper
434 real(kind=kind_phys),
parameter :: varmax_ss = 50., &
437 real(kind=kind_phys) :: var_temp, var_temp2
440 real(kind=kind_phys),
dimension(im,km) :: utendform,vtendform
441 real(kind=kind_phys) :: a1,a2,wsp
442 real(kind=kind_phys) :: h_efold
443 real(kind=kind_phys),
parameter :: coeff_fd = 6.325e-3
446 real(kind=kind_phys),
parameter :: ric = 0.25
447 real(kind=kind_phys),
parameter :: dw2min = 1.
448 real(kind=kind_phys),
parameter :: rimin = -100.
449 real(kind=kind_phys),
parameter :: bnv2min = 1.0e-5
450 real(kind=kind_phys),
parameter :: efmin = 0.0
451 real(kind=kind_phys),
parameter :: efmax = 10.0
452 real(kind=kind_phys),
parameter :: xl = 4.0e4
453 real(kind=kind_phys),
parameter :: critac = 1.0e-5
454 real(kind=kind_phys),
parameter :: gmax = 1.
455 real(kind=kind_phys),
parameter :: veleps = 1.0
456 real(kind=kind_phys),
parameter :: factop = 0.5
457 real(kind=kind_phys),
parameter :: frc = 1.0
458 real(kind=kind_phys),
parameter :: ce = 0.8
459 real(kind=kind_phys),
parameter :: cg = 0.5
460 real(kind=kind_phys),
parameter :: sgmalolev = 0.5
461 real(kind=kind_phys),
parameter :: plolevmeso = 70.0
462 real(kind=kind_phys),
parameter :: facmeso = 0.5
463 integer,
parameter :: kpblmin = 2
468 integer :: i,j,k,lcap,lcapp1,nwd,idir, &
471 real(kind=kind_phys) :: rcs,csg,fdir,cleff,cleff_ss,cs, &
472 rcsks,wdir,ti,rdz,tem2,dw2,shr2, &
473 bvf2,rdelks,wtkbj,tem,gfobnv,hd,fro, &
474 rim,temc,tem1,efact,temv,dtaux,dtauy, &
475 dtauxb,dtauyb,eng0,eng1,ksmax,dtfac_meso
477 logical :: ldrag(im),icrilv(im), &
481 real(kind=kind_phys) :: onebgrcs
483 real(kind=kind_phys) :: taub(im),taup(im,km+1), &
490 roll(im),dtfac(im), &
491 brvf(im),xlinv(im), &
492 delks(im),delks1(im), &
493 bnv2(im,km),usqj(im,km), &
494 taud_ms(im,km),taud_bl(im,km), &
496 vtk(im,km),vtj(im,km), &
497 zlowtop(im),velco(im,km-1), &
498 coefm(im),coefm_ss(im)
500 integer :: kbl(im),klowtop(im)
501 integer,
parameter :: mdir=8
504 integer,
parameter :: nwdir(8) = (/6,7,5,8,2,3,1,4/)
508 real(kind=kind_phys),
parameter :: frmax = 10.
509 real(kind=kind_phys),
parameter :: olmin = 1.0e-5
510 real(kind=kind_phys),
parameter :: odmin = 0.1
511 real(kind=kind_phys),
parameter :: odmax = 10.
514 real(kind=kind_phys) :: cd
515 real(kind=kind_phys) :: zblk,tautem
516 real(kind=kind_phys) :: pe,ke
517 real(kind=kind_phys) :: delx,dely
518 real(kind=kind_phys) :: dxy4(im,4),dxy4p(im,4)
519 real(kind=kind_phys) :: dxy(im),dxyp(im)
520 real(kind=kind_phys) :: ol4p(4),olp(im),od(im)
521 real(kind=kind_phys) :: taufb(im,km+1)
523 character(len=*),
intent(out) :: errmsg
524 integer,
intent(out) :: errflg
526 integer :: udtend, vdtend, Tdtend
546 if(ldiag3d .and. .not. flag_for_gwd_generic_tend)
then
547 udtend = dtidx(index_of_x_wind,index_of_process_orographic_gwd)
548 vdtend = dtidx(index_of_y_wind,index_of_process_orographic_gwd)
549 tdtend = dtidx(index_of_temperature,index_of_process_orographic_gwd)
571 if (cdmbgwd(1) >= 0.0) cdmb = cdmb * cdmbgwd(1)
584 cleff = 0.5e-5 / sqrt(float(imx)/192.0)
590 if (cdmbgwd(2) >= 0.0) cleff = cleff * cdmbgwd(2)
603 fdir = mdir / (2.0*pi)
604 onebgrcs = 1._kind_phys/g*rcs
607 if (slmsk(i)==1. .or. slmsk(i)==2.)
then
616 if ( dx(i) .ge. dxmax_ms )
then
619 if ( dx(i) .le. dxmin_ms)
then
622 ls_taper(i) = 0.5 * ( sin(pi*(dx(i)-0.5*(dxmax_ms+dxmin_ms))/ &
623 (dxmax_ms-dxmin_ms)) + 1. )
632if ( spp_gwd==1 )
then
634 var_stoch(i) = var(i) + var(i)*0.75*spp_wts_gwd(i,1)
635 varss_stoch(i) = varss(i) + varss(i)*0.75*spp_wts_gwd(i,1)
636 varmax_fd_stoch(i) = varmax_fd + varmax_fd*0.75*spp_wts_gwd(i,1)
640 var_stoch(i) = var(i)
641 varss_stoch(i) = varss(i)
642 varmax_fd_stoch(i) = varmax_fd
653 dxy4(i,3) = sqrt(delx*delx + dely*dely)
654 dxy4(i,4) = dxy4(i,3)
655 dxy4p(i,1) = dxy4(i,2)
656 dxy4p(i,2) = dxy4(i,1)
657 dxy4p(i,3) = dxy4(i,4)
658 dxy4p(i,4) = dxy4(i,3)
709 taufb(1:im,1:km+1) = 0.0
715 vtj(i,k) = t1(i,k) * (1.+fv*q1(i,k))
716 vtk(i,k) = vtj(i,k) / prslk(i,k)
717 ro(i,k) = rd_inv * prsl(i,k) / vtj(i,k)
728 zl(i,k) = phil(i,k)*g_inv
735 zlowtop(i) = 2. * var_stoch(i)
744 if(kloop1(i).and.zl(i,k)-zl(i,1).ge.zlowtop(i))
then
752 kbl(i) = max(kpbl(i), klowtop(i))
753 kbl(i) = max(min(kbl(i),kpblmax),kpblmin)
759 komax(:) = klowtop(:) - 1
762 delks(i) = 1.0 / (prsi(i,1) - prsi(i,kbl(i)))
763 delks1(i) = 1.0 / (prsl(i,1) - prsl(i,kbl(i)))
770 if (k.lt.kbl(i))
then
771 rcsks = rcs * del(i,k) * delks(i)
772 rdelks = del(i,k) * delks(i)
773 ubar(i) = ubar(i) + rcsks * u1(i,k)
774 vbar(i) = vbar(i) + rcsks * v1(i,k)
775 roll(i) = roll(i) + rdelks * ro(i,k)
786 wdir = atan2(ubar(i),vbar(i)) + pi
787 idir = mod(nint(fdir*wdir),mdir) + 1
789 oa(i) = (1-2*int( (nwd-1)/4 )) * oa4(i,mod(nwd-1,4)+1)
790 ol(i) = ol4(i,mod(nwd-1,4)+1)
792 oass(i) = (1-2*int( (nwd-1)/4 )) * oa4ss(i,mod(nwd-1,4)+1)
793 olss(i) = ol4ss(i,mod(nwd-1,4)+1)
803 olp(i) = ol4p(mod(nwd-1,4)+1)
807 od(i) = olp(i)/max(ol(i),olmin)
808 od(i) = min(od(i),odmax)
809 od(i) = max(od(i),odmin)
813 dxy(i) = dxy4(i,mod(nwd-1,4)+1)
814 dxyp(i) = dxy4p(i,mod(nwd-1,4)+1)
820IF ( (do_gsl_drag_ls_bl).and. &
821 (gwd_opt_ms.or.gwd_opt_bl) )
then
827 if ( ls_taper(i).GT.1.e-02 )
then
833 ti = 2.0 / (t1(i,k)+t1(i,k+1))
834 rdz = 1./(zl(i,k+1) - zl(i,k))
835 tem1 = u1(i,k) - u1(i,k+1)
836 tem2 = v1(i,k) - v1(i,k+1)
837 dw2 = rcl*(tem1*tem1 + tem2*tem2)
838 shr2 = max(dw2,dw2min) * rdz * rdz
839 bvf2 = g*(g/cp+rdz*(vtj(i,k+1)-vtj(i,k))) * ti
840 usqj(i,k) = max(bvf2/shr2,rimin)
841 bnv2(i,k) = 2.0*g*rdz*(vtk(i,k+1)-vtk(i,k))/(vtk(i,k+1)+vtk(i,k))
842 bnv2(i,k) = max( bnv2(i,k), bnv2min )
847 ulow(i) = max(sqrt(ubar(i)*ubar(i) + vbar(i)*vbar(i)), 1.0)
848 rulow(i) = 1./ulow(i)
851 velco(i,k) = (0.5*rcs) * ((u1(i,k)+u1(i,k+1)) * ubar(i) &
852 + (v1(i,k)+v1(i,k+1)) * vbar(i))
853 velco(i,k) = velco(i,k) * rulow(i)
854 if ((velco(i,k).lt.veleps) .and. (velco(i,k).gt.0.))
then
861 ldrag(i) = velco(i,1).le.0.
865 do k = kpblmin,kpblmax
866 if (k .lt. kbl(i)) ldrag(i) = ldrag(i).or. velco(i,k).le.0.
872 if (k .lt. kbl(i)) ldrag(i) = ldrag(i).or. bnv2(i,k).lt.0.
880 wtkbj = (prsl(i,1)-prsl(i,2)) * delks1(i)
881 bnv2(i,1) = wtkbj * bnv2(i,1)
882 usqj(i,1) = wtkbj * usqj(i,1)
884 do k = kpblmin,kpblmax
885 if (k .lt. kbl(i))
then
886 rdelks = (prsl(i,k)-prsl(i,k+1)) * delks1(i)
887 bnv2(i,1) = bnv2(i,1) + bnv2(i,k) * rdelks
888 usqj(i,1) = usqj(i,1) + usqj(i,k) * rdelks
892 ldrag(i) = ldrag(i) .or. bnv2(i,1).le.0.0
893 ldrag(i) = ldrag(i) .or. ulow(i).eq.1.0
894 ldrag(i) = ldrag(i) .or. var_stoch(i) .le. 0.0
900 if ( bnv2(i,1).gt.0.0 )
then
901 ldrag(i) = ldrag(i) .or. sqrt(bnv2(i,1))*rulow(i).lt.ksmax
906 do k = kpblmin,kpblmax
907 if (k .lt. kbl(i)) usqj(i,k) = usqj(i,1)
910 if (.not.ldrag(i))
then
911 bnv(i) = sqrt( bnv2(i,1) )
912 fr(i) = bnv(i) * rulow(i) * 2. * var_stoch(i) * od(i)
913 fr(i) = min(fr(i),frmax)
914 xn(i) = ubar(i) * rulow(i)
915 yn(i) = vbar(i) * rulow(i)
923 if (.not. ldrag(i))
then
924 efact = (oa(i) + 2.) ** (ce*fr(i)/frc)
925 efact = min( max(efact,efmin), efmax )
930 coefm(i) = (1. + ol(i)) ** (oa(i)+1.)
932 xlinv(i) = coefm(i) * cleff
933 tem = fr(i) * fr(i) * oc1(i)
934 gfobnv = gmax * tem / ((tem + cg)*bnv(i))
935 if ( gwd_opt_ms )
then
936 taub(i) = xlinv(i) * roll(i) * ulow(i) * ulow(i) &
937 * ulow(i) * gfobnv * efact
959IF ( (do_gsl_drag_ls_bl).and.(gwd_opt_ms) )
THEN
963 if ( ls_taper(i).GT.1.e-02 )
then
968 if (k .le. kbl(i)) taup(i,k) = taub(i)
978 if (k .ge. kbl(i))
then
979 icrilv(i) = icrilv(i) .or. ( usqj(i,k) .lt. ric) &
980 .or. (velco(i,k) .le. 0.0)
981 brvf(i) = max(bnv2(i,k),bnv2min)
982 brvf(i) = sqrt(brvf(i))
985 if (k .ge. kbl(i) .and. (.not. ldrag(i)))
then
986 if (.not.icrilv(i) .and. taup(i,k) .gt. 0.0 )
then
987 temv = 1.0 / velco(i,k)
988 tem1 = coefm(i)/dxy(i)*(ro(i,kp1)+ro(i,k))*brvf(i)* &
990 hd = sqrt(taup(i,k) / tem1)
991 fro = brvf(i) * hd * temv
994 tem2 = sqrt(usqj(i,k))
995 tem = 1. + tem2 * fro
996 rim = usqj(i,k) * (1.-fro) / (tem * tem)
1001 if (rim .le. ric)
then
1002 if ((oa(i) .le. 0.).or.(kp1 .ge. kpblmin ))
then
1003 temc = 2.0 + 1.0 / tem2
1004 hd = velco(i,k) * (2.*sqrt(temc)-temc) / brvf(i)
1005 taup(i,kp1) = tem1 * hd * hd
1008 taup(i,kp1) = taup(i,k)
1015 do klcap = lcapp1,km
1016 taup(i,klcap) = prsi(i,klcap) / prsi(i,lcap) * taup(i,lcap)
1028IF ( do_gsl_drag_ls_bl .and. gwd_opt_bl )
THEN
1032 if ( ls_taper(i).GT.1.e-02 )
then
1034 if (.not.ldrag(i))
then
1040 do k = km, kpblmin, -1
1041 if(kblk.eq.0 .and. k.le.komax(i))
then
1042 pe = pe + bnv2(i,k)*(zl(i,komax(i))-zl(i,k))* &
1044 ke = 0.5*((rcs*u1(i,k))**2.+(rcs*v1(i,k))**2.)
1050 kblk = min(kblk,kbl(i))
1051 zblk = zl(i,kblk)-zl(i,kts)
1052 rdxzb(i) = real(k,kind=kind_phys)
1060 cd = max(2.0-1.0/od(i),0.0)
1062 taufb(i,kts) = cdmb * 0.5 * roll(i) * coefm(i) / &
1063 max(dxmax_ms,dxy(i))**2 * cd * dxyp(i) * &
1064 olp(i) * zblk * ulow(i)**2
1065 tautem = taufb(i,kts)/float(kblk-kts)
1067 taufb(i,k) = taufb(i,k-1) - tautem
1083IF ( (do_gsl_drag_ls_bl) .and. &
1084 (gwd_opt_ms .OR. gwd_opt_bl) )
THEN
1088 if ( ls_taper(i) .GT. 1.e-02 )
then
1098 taup(i,km+1) = taup(i,km)
1100 taud_ms(i,k) = (taup(i,k+1) - taup(i,k)) * csg / del(i,k)
1101 taud_bl(i,k) = (taufb(i,k+1) - taufb(i,k)) * csg / del(i,k)
1111 do k = kts,kpblmax-1
1112 if (prsi(i,k).ge.sgmalolev*prsi(i,1))
then
1113 if ((taud_ms(i,k)+taud_bl(i,k)).ne.0.) &
1114 dtfac(i) = min(dtfac(i),abs(velco(i,k) &
1115 /(deltim*rcs*(taud_ms(i,k)+taud_bl(i,k)))))
1127 if (prsl(i,k).le.plolevmeso)
then
1128 if (taud_ms(i,k).ne.0.) &
1129 dtfac_meso = min(dtfac_meso,facmeso*abs(velco(i,min(k,km-1)) &
1130 /(deltim*rcs*taud_ms(i,k))))
1133 taud_ms(i,k) = taud_ms(i,k)*dtfac(i)*dtfac_meso* &
1134 ls_taper(i) *(1.-rstoch(i))
1135 taud_bl(i,k) = taud_bl(i,k)*dtfac(i)* ls_taper(i) *(1.-rstoch(i))
1137 dtaux = taud_ms(i,k) * xn(i)
1138 dtauy = taud_ms(i,k) * yn(i)
1139 dtauxb = taud_bl(i,k) * xn(i)
1140 dtauyb = taud_bl(i,k) * yn(i)
1143 tmp1 = dtaux + dtauxb
1144 tmp2 = dtauy + dtauyb
1145 dudt(i,k) = tmp1 + dudt(i,k)
1146 dvdt(i,k) = tmp2 + dvdt(i,k)
1152 if ( ugwp_seq_update .and. (do_gsl_drag_ss.or.do_gsl_drag_tofd) )
then
1153 uwnd1(i,k) = uwnd1(i,k) + tmp1*deltim
1154 vwnd1(i,k) = vwnd1(i,k) + tmp2*deltim
1157 if ( gsd_diss_ht_opt )
then
1160 eng0 = 0.5*( (rcs*u1(i,k))**2. + (rcs*v1(i,k))**2. )
1162 eng1 = 0.5*( (rcs*(u1(i,k)+(dtaux+dtauxb)*deltim))**2 + &
1163 (rcs*(v1(i,k)+(dtauy+dtauyb)*deltim))**2 )
1165 dtdt(i,k) = dtdt(i,k) + max((eng0-eng1),0.0)/cp/deltim
1166 if ( tdtend>0 )
then
1167 dtend(i,k,tdtend) = dtend(i,k,tdtend) + max((eng0-eng1),0.0)/cp
1171 dusfc(i) = dusfc(i) - onebgrcs * ( taud_ms(i,k)*xn(i)*del(i,k) + &
1172 taud_bl(i,k)*xn(i)*del(i,k) )
1173 dvsfc(i) = dvsfc(i) - onebgrcs * ( taud_ms(i,k)*yn(i)*del(i,k) + &
1174 taud_bl(i,k)*yn(i)*del(i,k) )
1176 dtend(i,k,udtend) = dtend(i,k,udtend) + (taud_ms(i,k) * &
1177 xn(i) + taud_bl(i,k) * xn(i)) * deltim
1180 dtend(i,k,vdtend) = dtend(i,k,vdtend) + (taud_ms(i,k) * &
1181 yn(i) + taud_bl(i,k) * yn(i)) * deltim
1186 if ( ldiag_ugwp )
then
1188 dtaux2d_ms(i,k) = taud_ms(i,k) * xn(i)
1189 dtauy2d_ms(i,k) = taud_ms(i,k) * yn(i)
1190 dtaux2d_bl(i,k) = taud_bl(i,k) * xn(i)
1191 dtauy2d_bl(i,k) = taud_bl(i,k) * yn(i)
1192 dusfc_ms(i) = dusfc_ms(i) - onebgrcs * dtaux2d_ms(i,k) * del(i,k)
1193 dvsfc_ms(i) = dvsfc_ms(i) - onebgrcs * dtauy2d_ms(i,k) * del(i,k)
1194 dusfc_bl(i) = dusfc_bl(i) - onebgrcs * dtaux2d_bl(i,k) * del(i,k)
1195 dvsfc_bl(i) = dvsfc_bl(i) - onebgrcs * dtauy2d_bl(i,k) * del(i,k)
1216IF ( do_gsl_drag_ss )
THEN
1220 if ( ss_taper(i).GT.1.e-02 )
then
1225 thx(i,k) = t1(i,k)/prslk(i,k)
1229 tvcon = (1.+fv*q1(i,k))
1230 thvx(i,k) = thx(i,k)*tvcon
1237 do k=kts+1,max(kpbl(i),kts+1)
1239 IF (zl(i,k)>300.)
then
1241 IF (k == kpbl(i))
then
1249 if((xland(i)-1.5).le.0. .and. 2.*varss_stoch(i).le.hpbl(i))
then
1250 if(br1(i).gt.0. .and. thvx(i,kpbl2)-thvx(i,kts) > 0.)
then
1257 govrth(i)=g/(0.5*(thvx(i,kpbl2)+thvx(i,kts)))
1259 xnbv=sqrt(govrth(i)*(thvx(i,kpbl2)-thvx(i,kts))/hpbl2)
1263 if (uwnd1(i,kpbl2).eq.0.)
then
1265 elseif (abs(xnbv/uwnd1(i,kpbl2)).gt.xlinv(i))
then
1272 var_temp = varss_stoch(i)
1274 var_temp2 = 0.5*xnbv*xlinv(i)*(2.*var_temp)**2*ro(i,kvar)
1275 tauwavex0=var_temp2*uwnd1(i,kvar)/(1.+var_temp2*deltim)
1276 tauwavex0=tauwavex0*ss_taper(i)
1283 if (vwnd1(i,kpbl2).eq.0.)
then
1285 elseif (abs(xnbv/vwnd1(i,kpbl2)).gt.xlinv(i))
then
1292 var_temp = varss_stoch(i)
1294 var_temp2 = 0.5*xnbv*xlinv(i)*(2.*var_temp)**2*ro(i,kvar)
1295 tauwavey0=var_temp2*vwnd1(i,kvar)/(1.+var_temp2*deltim)
1296 tauwavey0=tauwavey0*ss_taper(i)
1306 utendwave(i,k)=-1.*tauwavex0*2.*max((1.-zl(i,k)/hpbl2),0.)/hpbl2
1307 vtendwave(i,k)=-1.*tauwavey0*2.*max((1.-zl(i,k)/hpbl2),0.)/hpbl2
1316 dudt(i,k) = dudt(i,k) + utendwave(i,k)
1317 dvdt(i,k) = dvdt(i,k) + vtendwave(i,k)
1318 dusfc(i) = dusfc(i) - onebgrcs * utendwave(i,k) * del(i,k)
1319 dvsfc(i) = dvsfc(i) - onebgrcs * vtendwave(i,k) * del(i,k)
1322 dtend(i,kts:km,udtend) = dtend(i,kts:km,udtend) + utendwave(i,kts:km)*deltim
1325 dtend(i,kts:km,vdtend) = dtend(i,kts:km,vdtend) + vtendwave(i,kts:km)*deltim
1327 if ( ldiag_ugwp )
then
1329 dusfc_ss(i) = dusfc_ss(i) + utendwave(i,k) * del(i,k)
1330 dvsfc_ss(i) = dvsfc_ss(i) + vtendwave(i,k) * del(i,k)
1331 dtaux2d_ss(i,k) = utendwave(i,k)
1332 dtauy2d_ss(i,k) = vtendwave(i,k)
1346IF ( do_gsl_drag_tofd )
THEN
1350 if ( ss_taper(i).GT.1.e-02 )
then
1355 IF ((xland(i)-1.5) .le. 0.)
then
1357 var_temp = min(varss_stoch(i),varmax_fd_stoch(i)) + &
1358 max(0.,beta_fd*(varss_stoch(i)-varmax_fd_stoch(i)))
1359 a1=0.00026615161*var_temp**2
1367 wsp=sqrt(uwnd1(i,k)**2 + vwnd1(i,k)**2)
1371 var_temp = alpha_fd*coeff_fd*exp(-(zl(i,k)/h_efold)**1.5)*a2* &
1372 zl(i,k)**(-1.2)*ss_taper(i)
1375 utendform(i,k) = - var_temp*wsp*uwnd1(i,k)/(1. + var_temp*deltim*wsp)
1376 vtendform(i,k) = - var_temp*wsp*vwnd1(i,k)/(1. + var_temp*deltim*wsp)
1382 dudt(i,k) = dudt(i,k) + utendform(i,k)
1383 dvdt(i,k) = dvdt(i,k) + vtendform(i,k)
1384 dusfc(i) = dusfc(i) - onebgrcs * utendform(i,k) * del(i,k)
1385 dvsfc(i) = dvsfc(i) - onebgrcs * vtendform(i,k) * del(i,k)
1388 dtend(i,kts:km,udtend) = dtend(i,kts:km,udtend) + utendform(i,kts:km)*deltim
1391 dtend(i,kts:km,vdtend) = dtend(i,kts:km,vdtend) + vtendform(i,kts:km)*deltim
1393 if ( ldiag_ugwp )
then
1395 dtaux2d_fd(i,k) = utendform(i,k)
1396 dtauy2d_fd(i,k) = vtendform(i,k)
1397 dusfc_fd(i) = dusfc_fd(i) + utendform(i,k) * del(i,k)
1398 dvsfc_fd(i) = dvsfc_fd(i) + vtendform(i,k) * del(i,k)
1410if ( ldiag_ugwp )
then
1412 dusfc_ss(:) = -onebgrcs * dusfc_ss(:)
1413 dvsfc_ss(:) = -onebgrcs * dvsfc_ss(:)
1414 dusfc_fd(:) = -onebgrcs * dusfc_fd(:)
1415 dvsfc_fd(:) = -onebgrcs * dvsfc_fd(:)
1422 subroutine drag_suite_psl( &
1423 & IM,KM,dvdt,dudt,dtdt,U1,V1,T1,Q1,KPBL, &
1424 & PRSI,DEL,PRSL,PRSLK,PHII,PHIL,DELTIM,KDT, &
1425 & var,oc1,oa4,ol4, &
1426 & varss,oc1ss,oa4ss,ol4ss, &
1427 & THETA,SIGMA,GAMMA,ELVMAX, &
1428 & dtaux2d_ls,dtauy2d_ls,dtaux2d_bl,dtauy2d_bl, &
1429 & dtaux2d_ss,dtauy2d_ss,dtaux2d_fd,dtauy2d_fd, &
1431 & dusfc_ls,dvsfc_ls,dusfc_bl,dvsfc_bl, &
1432 & dusfc_ss,dvsfc_ss,dusfc_fd,dvsfc_fd, &
1433 & slmsk,br1,hpbl,vtype, &
1434 & g, cp, rd, rv, fv, pi, imx, cdmbgwd, alpha_fd, &
1435 & me, master, lprnt, ipr, rdxzb, dx, gwd_opt, &
1436 & do_gsl_drag_ls_bl, do_gsl_drag_ss, do_gsl_drag_tofd, &
1437 & psl_gwd_dx_factor, flag_for_gwd_generic_tend, &
1438 & dtend, dtidx, index_of_process_orographic_gwd, &
1439 & index_of_temperature, index_of_x_wind, &
1440 & index_of_y_wind, ldiag3d, ldiag_ugwp, ugwp_seq_update, &
1441 & spp_wts_gwd, spp_gwd, errmsg, errflg)
1536 USE machine ,
ONLY : kind_phys
1540 integer,
intent(in) :: im, km, imx, kdt, ipr, me, master
1541 integer,
intent(in) :: gwd_opt
1542 logical,
intent(in) :: lprnt
1543 integer,
intent(in) :: KPBL(:)
1544 real(kind=kind_phys),
intent(in) :: deltim, g, cp, rd, rv, &
1545 & cdmbgwd(:), alpha_fd
1546 real(kind=kind_phys),
intent(inout),
optional :: dtend(:,:,:)
1547 logical,
intent(in) :: ldiag3d, flag_for_gwd_generic_tend
1548 integer,
intent(in) :: dtidx(:,:), index_of_temperature, &
1549 & index_of_process_orographic_gwd, index_of_x_wind, index_of_y_wind
1552 integer,
parameter :: ims=1, kms=1, its=1, kts=1
1553 real(kind=kind_phys),
intent(in) :: fv, pi
1554 real(kind=kind_phys) :: rcl, cdmb
1555 real(kind=kind_phys) :: g_inv, g_cp, rd_inv
1557 real(kind=kind_phys),
intent(out) :: &
1558 & dudt(:,:),dvdt(:,:), &
1560 real(kind=kind_phys),
intent(out) :: rdxzb(:)
1561 real(kind=kind_phys),
intent(in) :: &
1562 & u1(:,:),v1(:,:), &
1563 & t1(:,:),q1(:,:), &
1564 & phii(:,:),prsl(:,:), &
1565 & prslk(:,:),phil(:,:)
1566 real(kind=kind_phys),
intent(in) :: prsi(:,:), &
1568 real(kind=kind_phys),
intent(in) :: var(:),oc1(:), &
1569 & oa4(:,:),ol4(:,:), &
1571 real(kind=kind_phys),
intent(in) :: varss(:),oc1ss(:), &
1572 & oa4ss(:,:),ol4ss(:,:)
1573 real(kind=kind_phys),
intent(in) :: theta(:),sigma(:), &
1574 & gamma(:),elvmax(:)
1577 real(kind=kind_phys),
dimension(im,km) :: utendwave,vtendwave,thx,thvx
1578 integer,
intent(in) :: vtype(:)
1579 real(kind=kind_phys),
intent(in) :: br1(:), &
1582 real(kind=kind_phys),
dimension(im) :: govrth,xland
1584 real(kind=kind_phys) :: tauwavex0,tauwavey0, &
1585 & xnbv,density,tvcon,hpbl2
1586 integer :: kpbl2,kvar
1588 real(kind=kind_phys),
dimension(im,km) :: zl
1591 real(kind=kind_phys),
dimension(im) :: var_stoch, varss_stoch, &
1592 varmax_ss_stoch, varmax_fd_stoch
1593 real(kind=kind_phys),
intent(in),
optional :: spp_wts_gwd(:,:)
1594 integer,
intent(in) :: spp_gwd
1596 real(kind=kind_phys),
dimension(im) :: rstoch
1599 real(kind=kind_phys),
intent(out) :: &
1600 & dusfc(:), dvsfc(:)
1602 real(kind=kind_phys),
intent(out),
optional :: &
1603 & dusfc_ls(:),dvsfc_ls(:), &
1604 & dusfc_bl(:),dvsfc_bl(:), &
1605 & dusfc_ss(:),dvsfc_ss(:), &
1606 & dusfc_fd(:),dvsfc_fd(:)
1607 real(kind=kind_phys),
intent(out),
optional :: &
1608 & dtaux2d_ls(:,:),dtauy2d_ls(:,:), &
1609 & dtaux2d_bl(:,:),dtauy2d_bl(:,:), &
1610 & dtaux2d_ss(:,:),dtauy2d_ss(:,:), &
1611 & dtaux2d_fd(:,:),dtauy2d_fd(:,:)
1614 real(kind=kind_phys),
dimension(im,km) :: dtaux2d, dtauy2d
1620 logical,
intent(in) :: &
1621 do_gsl_drag_ls_bl, &
1625 logical,
intent(in) :: ldiag_ugwp
1629 logical,
intent(in) :: ugwp_seq_update
1632 integer,
parameter :: &
1639 real(kind=kind_phys),
parameter :: dxmin_ss = 1000., &
1642 real(kind=kind_phys),
parameter :: dxmin_ls = 3000., &
1644 real(kind=kind_phys),
dimension(im) :: ss_taper, ls_taper
1647 real(kind=kind_phys),
parameter :: varmax_ss = 50., &
1651 real(kind=kind_phys) :: var_temp, var_temp2
1654 real(kind=kind_phys),
dimension(im,km) :: utendform,vtendform
1655 real(kind=kind_phys) :: a1,a2,wsp
1656 real(kind=kind_phys) :: h_efold
1657 real(kind=kind_phys),
parameter :: coeff_fd = 6.325e-3
1661 real(kind=kind_phys),
intent(in) :: psl_gwd_dx_factor
1664 real(kind=kind_phys),
parameter :: ric = 0.25
1665 real(kind=kind_phys),
parameter :: dw2min = 1.
1666 real(kind=kind_phys),
parameter :: rimin = -100.
1667 real(kind=kind_phys),
parameter :: bnv2min = 1.0e-5
1668 real(kind=kind_phys),
parameter :: efmin = 0.0
1669 real(kind=kind_phys),
parameter :: efmax = 10.0
1670 real(kind=kind_phys),
parameter :: xl = 4.0e4
1671 real(kind=kind_phys),
parameter :: critac = 1.0e-5
1672 real(kind=kind_phys),
parameter :: gmax = 1.
1673 real(kind=kind_phys),
parameter :: veleps = 1.0
1674 real(kind=kind_phys),
parameter :: factop = 0.5
1675 real(kind=kind_phys),
parameter :: frc = 1.0
1676 real(kind=kind_phys),
parameter :: ce = 0.8
1677 real(kind=kind_phys),
parameter :: cg = 1.0
1679 real(kind=kind_phys),
parameter :: var_min = 10.0
1680 real(kind=kind_phys),
parameter :: hmt_min = 50.
1681 real(kind=kind_phys),
parameter :: oc_min = 1.0
1682 real(kind=kind_phys),
parameter :: oc_max = 10.0
1683 real(kind=kind_phys),
parameter :: sgmalolev = 0.5
1684 real(kind=kind_phys),
parameter :: plolevmeso = 70.0
1685 real(kind=kind_phys),
parameter :: facmeso = 0.5
1687 integer,
parameter :: kpblmin = 2
1692 integer :: i,j,k,lcap,lcapp1,nwd,idir, &
1695 real(kind=kind_phys) :: rcs,csg,fdir,cs, &
1696 rcsks,wdir,ti,rdz,tem2,dw2,shr2, &
1697 bvf2,rdelks,wtkbj,tem,gfobnv,hd,fro, &
1698 rim,temc,tem1,efact,temv,dtaux,dtauy, &
1699 dtauxb,dtauyb,eng0,eng1,dtfac_meso
1701 logical :: ldrag(im),icrilv(im), &
1704 real(kind=kind_phys) :: invgrcs
1706 real(kind=kind_phys) :: taub(im),taup(im,km+1), &
1708 ubar(im),vbar(im), &
1710 rulow(im),bnv(im), &
1711 oa(im),ol(im),oc(im), &
1712 oass(im),olss(im), &
1713 roll(im),dtfac(im), &
1714 brvf(im),xlinv(im), &
1715 delks(im),delks1(im), &
1716 bnv2(im,km),usqj(im,km), &
1717 taud_ls(im,km),taud_bl(im,km), &
1719 vtk(im,km),vtj(im,km), &
1720 zlowtop(im),velco(im,km-1), &
1721 coefm(im),coefm_ss(im)
1722 real(kind=kind_phys) :: cleff(im),cleff_ss(im)
1724 integer :: kbl(im),klowtop(im)
1725 integer,
parameter :: mdir=8
1728 integer,
parameter :: nwdir(8) = (/6,7,5,8,2,3,1,4/)
1732 real(kind=kind_phys),
parameter :: frmax = 10.
1733 real(kind=kind_phys),
parameter :: olmin = 1.e-5
1734 real(kind=kind_phys),
parameter :: odmin = 0.1
1735 real(kind=kind_phys),
parameter :: odmax = 10.
1736 real(kind=kind_phys),
parameter :: cdmin = 0.0
1737 integer :: komax(im),kbmax(im),kblk(im)
1738 real(kind=kind_phys) :: href(im),hmax(im)
1739 real(kind=kind_phys) :: cd
1740 real(kind=kind_phys) :: zblk,tautem
1741 real(kind=kind_phys) :: pe,ke
1742 real(kind=kind_phys) :: delx,dely
1743 real(kind=kind_phys) :: dxy4(im,4),dxy4p(im,4)
1744 real(kind=kind_phys) :: dxy(im),dxyp(im)
1745 real(kind=kind_phys) :: ol4p(4),olp(im),od(im)
1746 real(kind=kind_phys) :: taufb(im,km+1)
1748 character(len=*),
intent(out) :: errmsg
1749 integer,
intent(out) :: errflg
1751 integer :: udtend, vdtend, Tdtend
1770 if(ldiag3d .and. .not. flag_for_gwd_generic_tend)
then
1771 udtend = dtidx(index_of_x_wind,index_of_process_orographic_gwd)
1772 vdtend = dtidx(index_of_y_wind,index_of_process_orographic_gwd)
1773 tdtend = dtidx(index_of_temperature,index_of_process_orographic_gwd)
1784 fdir = mdir / (2.0*pi)
1785 invgrcs = 1._kind_phys/g*rcs
1789 if (slmsk(i)==1. .or. slmsk(i)==2.)
then
1799 if ( dx(i) .ge. dxmax_ls )
then
1802 if ( dx(i) .le. dxmin_ls)
then
1805 ls_taper(i) = 0.5 * ( sin(pi*(dx(i)-0.5*(dxmax_ls+dxmin_ls))/ &
1806 (dxmax_ls-dxmin_ls)) + 1. )
1815 if ( spp_gwd==1 )
then
1817 var_stoch(i) = var(i) + var(i)*0.75*spp_wts_gwd(i,1)
1818 varss_stoch(i) = varss(i) + varss(i)*0.75*spp_wts_gwd(i,1)
1819 varmax_ss_stoch(i) = varmax_ss + varmax_ss*0.75*spp_wts_gwd(i,1)
1820 varmax_fd_stoch(i) = varmax_fd + varmax_fd*0.75*spp_wts_gwd(i,1)
1824 var_stoch(i) = var(i)
1825 varss_stoch(i) = varss(i)
1826 varmax_ss_stoch(i) = varmax_ss
1827 varmax_fd_stoch(i) = varmax_fd
1838 dxy4(i,3) = sqrt(delx*delx + dely*dely)
1839 dxy4(i,4) = dxy4(i,3)
1840 dxy4p(i,1) = dxy4(i,2)
1841 dxy4p(i,2) = dxy4(i,1)
1842 dxy4p(i,3) = dxy4(i,4)
1843 dxy4p(i,4) = dxy4(i,3)
1844 cleff(i) = psl_gwd_dx_factor*(delx+dely)*0.5
1845 cleff_ss(i) = 0.1 * max(dxmax_ss,dxy4(i,3))
1891 if ( ldiag_ugwp )
then
1904 dtaux2d_ls(i,k)= 0.0
1905 dtauy2d_ls(i,k)= 0.0
1906 dtaux2d_bl(i,k)= 0.0
1907 dtauy2d_bl(i,k)= 0.0
1908 dtaux2d_ss(i,k)= 0.0
1909 dtauy2d_ss(i,k)= 0.0
1910 dtaux2d_fd(i,k)= 0.0
1911 dtauy2d_fd(i,k)= 0.0
1925 taufb(1:im,1:km+1) = 0.0
1935 vtj(i,k) = t1(i,k) * (1.+fv*q1(i,k))
1936 vtk(i,k) = vtj(i,k) / prslk(i,k)
1937 ro(i,k) = rd_inv * prsl(i,k) / vtj(i,k)
1948 zl(i,k) = phil(i,k)*g_inv
1955 if(vtype(i)==15)
then
1956 zlowtop(i) = 1.0 * var_stoch(i)
1958 zlowtop(i) = 2.0 * var_stoch(i)
1968 if(flag(i).and.zl(i,k).ge.zlowtop(i))
then
1985 if(flag(i).and.zl(i,k).ge.elvmax(i))
then
2000 if(flag(i).and.zl(i,k).ge.elvmax(i)+zlowtop(i))
then
2010 hmax(i) = max(elvmax(i),zlowtop(i))
2011 href(i) = max(hmax(i),hpbl(i))
2016 kbl(i) = max(komax(i), klowtop(i))
2017 kbl(i) = max(kbl(i), kpbl(i))
2018 kbl(i) = max(min(kbl(i),kpblmax),kpblmin)
2024 delks(i) = 1.0 / (prsi(i,1) - prsi(i,kbl(i)))
2025 delks1(i) = 1.0 / (prsl(i,1) - prsl(i,kbl(i)))
2029 if (k.lt.kbl(i))
then
2030 rcsks = rcs * del(i,k) * delks(i)
2031 rdelks = del(i,k) * delks(i)
2032 ubar(i) = ubar(i) + rcsks * u1(i,k)
2033 vbar(i) = vbar(i) + rcsks * v1(i,k)
2034 roll(i) = roll(i) + rdelks * ro(i,k)
2045 wdir = atan2(ubar(i),vbar(i)) + pi
2046 idir = mod(nint(fdir*wdir),mdir) + 1
2048 oa(i) = (1-2*int( (nwd-1)/4 )) * oa4(i,mod(nwd-1,4)+1)
2049 ol(i) = max(ol4(i,mod(nwd-1,4)+1),olmin)
2050 oc(i) = min(max(oc1(i),oc_min),oc_max)
2055 oass(i) = (1-2*int( (nwd-1)/4 )) * oa4ss(i,mod(nwd-1,4)+1)
2056 olss(i) = ol4ss(i,mod(nwd-1,4)+1)
2066 olp(i) = max(ol4p(mod(nwd-1,4)+1),olmin)
2070 od(i) = olp(i)/ol(i)
2071 od(i) = min(od(i),odmax)
2072 od(i) = max(od(i),odmin)
2076 dxy(i) = dxy4(i,mod(nwd-1,4)+1)
2077 dxyp(i) = dxy4p(i,mod(nwd-1,4)+1)
2082IF ( (do_gsl_drag_ls_bl).and. &
2083 ((gwd_opt_ls .EQ. 1).or.(gwd_opt_bl .EQ. 1)) )
then
2088 if ( ls_taper(i).GT.1.e-02 )
then
2094 ti = 2.0 / (t1(i,k)+t1(i,k+1))
2095 rdz = 1./(zl(i,k+1) - zl(i,k))
2096 tem1 = u1(i,k) - u1(i,k+1)
2097 tem2 = v1(i,k) - v1(i,k+1)
2098 dw2 = rcl*(tem1*tem1 + tem2*tem2)
2099 shr2 = max(dw2,dw2min) * rdz * rdz
2100 bvf2 = g*(g_cp+rdz*(vtj(i,k+1)-vtj(i,k))) * ti
2101 usqj(i,k) = max(bvf2/shr2,rimin)
2102 bnv2(i,k) = 2.0*g*rdz*(vtk(i,k+1)-vtk(i,k))/(vtk(i,k+1)+vtk(i,k))
2103 bnv2(i,k) = max( bnv2(i,k), bnv2min )
2108 ulow(i) = max(sqrt(ubar(i)*ubar(i) + vbar(i)*vbar(i)), 1.0)
2109 rulow(i) = 1./ulow(i)
2112 velco(i,k) = (0.5*rcs) * ((u1(i,k)+u1(i,k+1)) * ubar(i) &
2113 + (v1(i,k)+v1(i,k+1)) * vbar(i))
2114 velco(i,k) = velco(i,k) * rulow(i)
2115 if ((velco(i,k).lt.veleps) .and. (velco(i,k).gt.0.))
then
2122 ldrag(i) = href(i).le.hmt_min
2126 ldrag(i) = ldrag(i).or. velco(i,1).le.0.
2130 do k = kpblmin,kpblmax
2131 if (k .lt. kbl(i)) ldrag(i) = ldrag(i).or. velco(i,k).le.0.
2137 if (k .lt. kbl(i)) ldrag(i) = ldrag(i).or. bnv2(i,k).lt.0.
2145 wtkbj = (prsl(i,1)-prsl(i,2)) * delks1(i)
2146 bnv2(i,1) = wtkbj * bnv2(i,1)
2147 usqj(i,1) = wtkbj * usqj(i,1)
2149 do k = kpblmin,kpblmax
2150 if (k .lt. kbl(i))
then
2151 rdelks = (prsl(i,k)-prsl(i,k+1)) * delks1(i)
2152 bnv2(i,1) = bnv2(i,1) + bnv2(i,k) * rdelks
2153 usqj(i,1) = usqj(i,1) + usqj(i,k) * rdelks
2157 ldrag(i) = ldrag(i) .or. bnv2(i,1).le.0.0
2158 ldrag(i) = ldrag(i) .or. ulow(i).eq.1.0
2159 ldrag(i) = ldrag(i) .or. var_stoch(i) .le. 0.0
2160 ldrag(i) = ldrag(i) .or. xland(i) .gt. 1.5
2164 do k = kpblmin,kpblmax
2165 if (k .lt. kbl(i)) usqj(i,k) = usqj(i,1)
2168 if (.not.ldrag(i))
then
2169 bnv(i) = sqrt( bnv2(i,1) )
2170 fr(i) = bnv(i) * rulow(i) * 2. * var_stoch(i) * od(i)
2171 fr(i) = min(fr(i),frmax)
2172 xn(i) = ubar(i) * rulow(i)
2173 yn(i) = vbar(i) * rulow(i)
2181 if (.not. ldrag(i))
then
2182 efact = (oa(i) + 2.) ** (ce*fr(i)/frc)
2183 efact = min( max(efact,efmin), efmax )
2184 coefm(i) = (1. + ol(i)) ** (oa(i)+1.)
2185 xlinv(i) = coefm(i) / cleff(i)
2186 tem = fr(i) * fr(i) * oc(i)
2187 gfobnv = gmax * tem / ((tem + cg)*bnv(i))
2188 if ( gwd_opt_ls .NE. 0 )
then
2189 taub(i) = xlinv(i) * roll(i) * ulow(i) * ulow(i) &
2190 * ulow(i) * gfobnv * efact
2216IF ( do_gsl_drag_ss )
THEN
2220 if ( ss_taper(i).GT.1.e-02 )
then
2225 thx(i,k) = t1(i,k)/prslk(i,k)
2229 tvcon = (1.+fv*q1(i,k))
2230 thvx(i,k) = thx(i,k)*tvcon
2237 do k=kts+1,max(kpbl(i),kts+1)
2239 IF (zl(i,k)>300.)
then
2241 IF (k == kpbl(i))
then
2249 if((xland(i)-1.5).le.0. .and. 2.*varss_stoch(i).le.hpbl(i))
then
2250 if(br1(i).gt.0. .and. thvx(i,kpbl2)-thvx(i,kts) > 0.)
then
2251 coefm_ss(i) = (1. + olss(i)) ** (oass(i)+1.)
2252 xlinv(i) = coefm_ss(i) / cleff_ss(i)
2254 govrth(i)=g/(0.5*(thvx(i,kpbl2)+thvx(i,kts)))
2256 xnbv=sqrt(govrth(i)*(thvx(i,kpbl2)-thvx(i,kts))/hpbl2)
2259 if(abs(xnbv/u1(i,kpbl2)).gt.xlinv(i))
then
2264 var_temp = varss_stoch(i)
2266 var_temp2 = 0.5*xnbv*xlinv(i)*(2.*var_temp)**2*ro(i,kvar)
2267 tauwavex0=var_temp2*u1(i,kvar)/(1.+var_temp2*deltim)
2268 tauwavex0=tauwavex0*ss_taper(i)
2274 if(abs(xnbv/v1(i,kpbl2)).gt.xlinv(i))
then
2279 var_temp = varss_stoch(i)
2281 var_temp2 = 0.5*xnbv*xlinv(i)*(2.*var_temp)**2*ro(i,kvar)
2282 tauwavey0=var_temp2*v1(i,kvar)/(1.+var_temp2*deltim)
2283 tauwavey0=tauwavey0*ss_taper(i)
2293 utendwave(i,k)=-1.*tauwavex0*2.*max((1.-zl(i,k)/hpbl2),0.)/hpbl2
2294 vtendwave(i,k)=-1.*tauwavey0*2.*max((1.-zl(i,k)/hpbl2),0.)/hpbl2
2303 dudt(i,k) = dudt(i,k) + utendwave(i,k)
2304 dvdt(i,k) = dvdt(i,k) + vtendwave(i,k)
2305 dusfc(i) = dusfc(i) + utendwave(i,k) * del(i,k)
2306 dvsfc(i) = dvsfc(i) + vtendwave(i,k) * del(i,k)
2309 dtend(i,kts:km,udtend) = dtend(i,kts:km,udtend) + utendwave(i,kts:km)*deltim
2312 dtend(i,kts:km,vdtend) = dtend(i,kts:km,vdtend) + vtendwave(i,kts:km)*deltim
2314 if ( ldiag_ugwp )
then
2316 dusfc_ss(i) = dusfc_ss(i) + utendwave(i,k) * del(i,k)
2317 dvsfc_ss(i) = dvsfc_ss(i) + vtendwave(i,k) * del(i,k)
2318 dtaux2d_ss(i,k) = utendwave(i,k)
2319 dtauy2d_ss(i,k) = vtendwave(i,k)
2332IF ( do_gsl_drag_tofd )
THEN
2336 if ( ss_taper(i).GT.1.e-02 )
then
2341 IF ((xland(i)-1.5) .le. 0.)
then
2344 var_temp = varss_stoch(i)
2346 a1=0.00026615161*var_temp**2
2354 wsp=sqrt(u1(i,k)**2 + v1(i,k)**2)
2358 var_temp = alpha_fd*coeff_fd*exp(-(zl(i,k)/h_efold)**1.5)*a2* &
2359 zl(i,k)**(-1.2)*ss_taper(i)
2362 utendform(i,k) = - var_temp*wsp*u1(i,k)/(1. + var_temp*deltim*wsp)
2363 vtendform(i,k) = - var_temp*wsp*v1(i,k)/(1. + var_temp*deltim*wsp)
2369 dudt(i,k) = dudt(i,k) + utendform(i,k)
2370 dvdt(i,k) = dvdt(i,k) + vtendform(i,k)
2371 dusfc(i) = dusfc(i) + utendform(i,k) * del(i,k)
2372 dvsfc(i) = dvsfc(i) + vtendform(i,k) * del(i,k)
2375 dtend(i,kts:km,udtend) = dtend(i,kts:km,udtend) + utendform(i,kts:km)*deltim
2378 dtend(i,kts:km,vdtend) = dtend(i,kts:km,vdtend) + vtendform(i,kts:km)*deltim
2380 if ( ldiag_ugwp )
then
2382 dtaux2d_fd(i,k) = utendform(i,k)
2383 dtauy2d_fd(i,k) = vtendform(i,k)
2384 dusfc_fd(i) = dusfc_fd(i) + utendform(i,k) * del(i,k)
2385 dvsfc_fd(i) = dvsfc_fd(i) + vtendform(i,k) * del(i,k)
2396IF ( (do_gsl_drag_ls_bl).and.(gwd_opt_ls .EQ. 1) )
THEN
2400 if ( ls_taper(i).GT.1.e-02 )
then
2405 if (k .le. kbl(i)) taup(i,k) = taub(i)
2408 do k = kpblmin, km-1
2415 if (k .ge. kbl(i))
then
2416 icrilv(i) = icrilv(i) .or. ( usqj(i,k) .lt. ric) &
2417 .or. (velco(i,k) .le. 0.0)
2418 brvf(i) = max(bnv2(i,k),bnv2min)
2419 brvf(i) = sqrt(brvf(i))
2422 if (k .ge. kbl(i) .and. (.not. ldrag(i)))
then
2423 if (.not.icrilv(i) .and. taup(i,k) .gt. 0.0 )
then
2424 temv = 1.0 / velco(i,k)
2425 tem1 = coefm(i)/dxy(i)*(ro(i,kp1)+ro(i,k))*brvf(i)* &
2427 hd = sqrt(taup(i,k) / tem1)
2428 fro = brvf(i) * hd * temv
2431 tem2 = sqrt(usqj(i,k))
2432 tem = 1. + tem2 * fro
2433 rim = usqj(i,k) * (1.-fro) / (tem * tem)
2438 if (rim .le. ric)
then
2439 temc = 2.0 + 1.0 / tem2
2440 hd = velco(i,k) * (2.*sqrt(temc)-temc) / brvf(i)
2441 taup(i,kp1) = tem1 * hd * hd
2443 taup(i,kp1) = taup(i,k)
2450 do klcap = lcapp1,km
2451 taup(i,klcap) = prsi(i,klcap) / prsi(i,lcap) * taup(i,lcap)
2463IF ( (do_gsl_drag_ls_bl) .and. (gwd_opt_bl .EQ. 1) )
THEN
2470 if ( ls_taper(i).GT.1.e-02 )
then
2472 if (.not.ldrag(i))
then
2478 do k = km, kpblmin, -1
2479 if(flag(i).and. k.le.kbmax(i))
then
2480 pe = pe + bnv2(i,k)*(zl(i,kbmax(i))-zl(i,k))* &
2481 del(i,k)*g_inv/ro(i,k)
2482 ke = 0.5*((rcs*u1(i,k))**2.+(rcs*v1(i,k))**2.)
2486 if(pe.ge.ke.and.zl(i,k).le.hmax(i))
then
2489 rdxzb(i) = real(k,kind=kind_phys)
2494 if(.not.flag(i))
then
2498 cd = max(2.0-1.0/od(i),cdmin)
2499 taufb(i,kts) = 0.5 * roll(i) * coefm(i) / &
2500 max(dxmax_ls,dxy(i))**2 * cd * dxyp(i) * &
2501 olp(i) * zblk * ulow(i)**2
2502 tautem = taufb(i,kts)/float(kblk(i)-kts)
2503 do k = kts+1, kpblmax
2504 if (k .le. kblk(i)) taufb(i,k) = taufb(i,k-1) - tautem
2510 if (k .le. kblk(i)) taup(i,k) = taup(i,kblk(i))
2524IF ( (do_gsl_drag_ls_bl) .and. &
2525 (gwd_opt_ls .EQ. 1 .OR. gwd_opt_bl .EQ. 1) )
THEN
2529 if ( ls_taper(i) .GT. 1.e-02 )
then
2535 taud_ls(i,k) = 1. * (taup(i,k+1) - taup(i,k)) * csg / del(i,k)
2536 taud_bl(i,k) = 1. * (taufb(i,k+1) - taufb(i,k)) * csg / del(i,k)
2542 taud_ls(i,klcap) = taud_ls(i,klcap) * factop
2543 taud_bl(i,klcap) = taud_bl(i,klcap) * factop
2552 do k = kts,kpblmax-1
2553 if (prsi(i,k).ge.sgmalolev*prsi(i,1))
then
2554 if ((taud_ls(i,k)+taud_bl(i,k)).ne.0.) &
2555 dtfac(i) = min(dtfac(i),abs(velco(i,k) &
2556 /(deltim*rcs*(taud_ls(i,k)+taud_bl(i,k)))))
2568 if (prsl(i,k).le.plolevmeso)
then
2569 if (taud_ls(i,k).ne.0.) &
2570 dtfac_meso = min(dtfac_meso,facmeso*abs(velco(i,min(k,km-1)) &
2571 /(deltim*rcs*taud_ls(i,k))))
2574 taud_ls(i,k) = taud_ls(i,k)*dtfac(i)*dtfac_meso* &
2575 ls_taper(i) *(1.-rstoch(i))
2576 taud_bl(i,k) = taud_bl(i,k)*dtfac(i)* ls_taper(i) *(1.-rstoch(i))
2578 dtaux = taud_ls(i,k) * xn(i)
2579 dtauy = taud_ls(i,k) * yn(i)
2580 dtauxb = taud_bl(i,k) * xn(i)
2581 dtauyb = taud_bl(i,k) * yn(i)
2584 dudt(i,k) = dtaux + dtauxb + dudt(i,k)
2585 dvdt(i,k) = dtauy + dtauyb + dvdt(i,k)
2587 if ( gsd_diss_ht_opt .EQ. 1 )
then
2590 eng0 = 0.5*( (rcs*u1(i,k))**2. + (rcs*v1(i,k))**2. )
2592 eng1 = 0.5*( (rcs*(u1(i,k)+(dtaux+dtauxb)*deltim))**2 + &
2593 (rcs*(v1(i,k)+(dtauy+dtauyb)*deltim))**2 )
2595 dtdt(i,k) = dtdt(i,k) + max((eng0-eng1),0.0)/cp/deltim
2596 if ( tdtend>0 )
then
2597 dtend(i,k,tdtend) = dtend(i,k,tdtend) + max((eng0-eng1),0.0)/cp
2601 dusfc(i) = dusfc(i) + taud_ls(i,k)*xn(i)*del(i,k) + &
2602 taud_bl(i,k)*xn(i)*del(i,k)
2603 dvsfc(i) = dvsfc(i) + taud_ls(i,k)*yn(i)*del(i,k) + &
2604 taud_bl(i,k)*yn(i)*del(i,k)
2606 dtend(i,k,udtend) = dtend(i,k,udtend) + (taud_ls(i,k) * &
2607 xn(i) + taud_bl(i,k) * xn(i)) * deltim
2610 dtend(i,k,vdtend) = dtend(i,k,vdtend) + (taud_ls(i,k) * &
2611 yn(i) + taud_bl(i,k) * yn(i)) * deltim
2617 dusfc(i) = -(invgrcs) * dusfc(i)
2618 dvsfc(i) = -(invgrcs) * dvsfc(i)
2620 if ( ldiag_ugwp )
then
2622 dtaux2d_ls(i,k) = taud_ls(i,k) * xn(i)
2623 dtauy2d_ls(i,k) = taud_ls(i,k) * yn(i)
2624 dtaux2d_bl(i,k) = taud_bl(i,k) * xn(i)
2625 dtauy2d_bl(i,k) = taud_bl(i,k) * yn(i)
2626 dusfc_ls(i) = dusfc_ls(i) + dtaux2d_ls(i,k) * del(i,k)
2627 dvsfc_ls(i) = dvsfc_ls(i) + dtauy2d_ls(i,k) * del(i,k)
2628 dusfc_bl(i) = dusfc_bl(i) + dtaux2d_bl(i,k) * del(i,k)
2629 dvsfc_bl(i) = dvsfc_bl(i) + dtauy2d_bl(i,k) * del(i,k)
2639if ( ldiag_ugwp )
then
2642 dusfc_ls(i) = -(invgrcs) * dusfc_ls(i)
2643 dvsfc_ls(i) = -(invgrcs) * dvsfc_ls(i)
2644 dusfc_bl(i) = -(invgrcs) * dusfc_bl(i)
2645 dvsfc_bl(i) = -(invgrcs) * dvsfc_bl(i)
2646 dusfc_ss(i) = -(invgrcs) * dusfc_ss(i)
2647 dvsfc_ss(i) = -(invgrcs) * dvsfc_ss(i)
2648 dusfc_fd(i) = -(invgrcs) * dusfc_fd(i)
2649 dvsfc_fd(i) = -(invgrcs) * dvsfc_fd(i)