@@ -1674,10 +1674,9 @@ subroutine drag_suite_psl( &
16741674 real (kind= kind_phys), parameter :: hmt_min = 50 .
16751675 real (kind= kind_phys), parameter :: oc_min = 1.0
16761676 real (kind= kind_phys), parameter :: oc_max = 10.0
1677- ! 7.5 mb -- 33 km ... 0.01 kgm-3 reduce gwd drag above cutoff level
1678- real (kind= kind_phys), parameter :: pcutoff = 7.5e2
1679- ! 0.76 mb -- 50 km ...0.001 kgm-3 --- 0.1 mb 65 km 0.0001 kgm-3
1680- real (kind= kind_phys), parameter :: pcutoff_den = 0.01 !
1677+ real (kind= kind_phys), parameter :: sgmalolev = 0.5 ! max sigma lvl for dtfac
1678+ real (kind= kind_phys), parameter :: plolevmeso = 70.0 ! pres lvl for mesosphere OGWD reduction (Pa)
1679+ real (kind= kind_phys), parameter :: facmeso = 0.5 ! fractional velocity reduction for OGWD
16811680
16821681 integer ,parameter :: kpblmin = 2
16831682
@@ -1691,7 +1690,7 @@ subroutine drag_suite_psl( &
16911690 rcsks,wdir,ti,rdz,tem2,dw2,shr2, &
16921691 bvf2,rdelks,wtkbj,tem,gfobnv,hd,fro, &
16931692 rim,temc,tem1,efact,temv,dtaux,dtauy, &
1694- dtauxb,dtauyb,eng0,eng1
1693+ dtauxb,dtauyb,eng0,eng1,dtfac_meso
16951694 real (kind= kind_phys) :: denfac
16961695!
16971696 logical :: ldrag(im),icrilv(im), &
@@ -1706,7 +1705,7 @@ subroutine drag_suite_psl( &
17061705 rulow(im),bnv(im), &
17071706 oa(im),ol(im),oc(im), &
17081707 oass(im),olss(im), &
1709- roll(im),dtfac(im,km ), &
1708+ roll(im),dtfac(im), &
17101709 brvf(im),xlinv(im), &
17111710 delks(im),delks1(im), &
17121711 bnv2(im,km),usqj(im,km), &
@@ -1861,6 +1860,7 @@ subroutine drag_suite_psl( &
18611860 oass(i) = 0.0
18621861 olss(i) = 0.0
18631862 ulow (i) = 0.0
1863+ dtfac(i) = 1.0
18641864 rstoch(i) = 0.0
18651865 ldrag(i) = .false.
18661866 icrilv(i) = .false.
@@ -1877,7 +1877,6 @@ subroutine drag_suite_psl( &
18771877 taud_bl(i,k) = 0.0
18781878 dtaux2d(i,k) = 0.0
18791879 dtauy2d(i,k) = 0.0
1880- dtfac(i,k) = 1.0
18811880 enddo
18821881 enddo
18831882!
@@ -2536,30 +2535,38 @@ subroutine drag_suite_psl( &
25362535 taud_bl(i,klcap) = taud_bl(i,klcap) * factop
25372536 enddo
25382537!
2539- ! if the gravity wave drag would force a critical line
2540- ! in the lower ksmm1 layers during the next deltim timestep,
2541- ! then only apply drag until that critical line is reached.
2538+ ! if the gravity wave drag + blocking would force a critical line
2539+ ! in the layers below pressure-based 'sigma' level = sgmalolev during the next deltim
2540+ ! timestep, then only apply drag until that critical line is reached, i.e.,
2541+ ! reduce drag to limit resulting wind components to zero
2542+ ! Note: 'sigma' = prsi(k)/prsi(k=1), where prsi(k=1) is the surface pressure
25422543!
25432544 do k = kts,kpblmax-1
2544- if ((taud_ls(i,k)+ taud_bl(i,k)).ne. 0 .) then
2545- dtfac(i,k) = min (dtfac(i,k),abs (velco(i,k) &
2546- / (deltim* rcs* (taud_ls(i,k)+ taud_bl(i,k)))))
2547- endif
2548- enddo
2549- ! apply limiter to mesosphere drag, reduce the drag by density factor 10-3
2550- ! prevent wind reversal...
2551- !
2552- do k = kpblmax,km-1
2553- if ((taud_ls(i,k)+ taud_bl(i,k)).ne. 0 ..and. prsl(i,k).le. pcutoff) then
2554- denfac = min (ro(i,k)/ pcutoff_den,1 .)
2555- dtfac(i,k) = min (dtfac(i,k),denfac* abs (velco(i,k) &
2545+ if (prsi(i,k).ge. sgmalolev* prsi(i,1 )) then
2546+ if ((taud_ls(i,k)+ taud_bl(i,k)).ne. 0 .) &
2547+ dtfac(i) = min (dtfac(i),abs (velco(i,k) &
25562548 / (deltim* rcs* (taud_ls(i,k)+ taud_bl(i,k)))))
2557- endif
2549+ else
2550+ exit
2551+ endif
25582552 enddo
25592553!
25602554 do k = kts,km
2561- taud_ls(i,k) = taud_ls(i,k)* dtfac(i,k)* ls_taper(i) * (1 .- rstoch(i))
2562- taud_bl(i,k) = taud_bl(i,k)* dtfac(i,k)* ls_taper(i) * (1 .- rstoch(i))
2555+
2556+ ! Check if well into mesosphere -- if so, perform similar reduction of
2557+ ! velocity tendency due to mesoscale GWD to prevent sudden reversal of
2558+ ! wind direction (similar to above)
2559+ dtfac_meso = 1.0
2560+ if (prsl(i,k).le. plolevmeso) then
2561+ if (taud_ls(i,k).ne. 0 .) &
2562+ dtfac_meso = min (dtfac_meso,facmeso* abs (velco(i,k) &
2563+ / (deltim* rcs* taud_ls(i,k))))
2564+ end if
2565+
2566+ taud_ls(i,k) = taud_ls(i,k)* dtfac(i)* dtfac_meso* &
2567+ ls_taper(i) * (1 .- rstoch(i))
2568+ taud_bl(i,k) = taud_bl(i,k)* dtfac(i)* ls_taper(i) * (1 .- rstoch(i))
2569+
25632570 dtaux = taud_ls(i,k) * xn(i)
25642571 dtauy = taud_ls(i,k) * yn(i)
25652572 dtauxb = taud_bl(i,k) * xn(i)
0 commit comments