Skip to content

Commit bff6371

Browse files
Merge pull request NOAA-EMC#266 from laurenchilutti/cherrypick420
dev/emc: Release FV3 Solver Updates (cherry-pick)
2 parents 9d5bed8 + 5ba14f2 commit bff6371

File tree

5 files changed

+78
-29
lines changed

5 files changed

+78
-29
lines changed

model/dyn_core.F90

+4-2
Original file line numberDiff line numberDiff line change
@@ -632,7 +632,8 @@ subroutine dyn_core(npx, npy, npz, ng, sphum, nq, bdt, n_map, n_split, zvir, cp,
632632
#endif
633633
ptop, phis, omga, ptc, &
634634
q_con, delpc, gz, pkc, ws3, flagstruct%p_fac, &
635-
flagstruct%a_imp, flagstruct%scale_z )
635+
flagstruct%a_imp, flagstruct%scale_z, pfull, &
636+
flagstruct%fast_tau_w_sec, flagstruct%rf_cutoff )
636637
call timing_off('Riem_Solver')
637638

638639
if (gridstruct%nested) then
@@ -1050,7 +1051,8 @@ subroutine dyn_core(npx, npy, npz, ng, sphum, nq, bdt, n_map, n_split, zvir, cp,
10501051
ptop, zs, q_con, w, delz, pt, delp, zh, &
10511052
pe, pkc, pk3, pk, peln, ws, &
10521053
flagstruct%scale_z, flagstruct%p_fac, flagstruct%a_imp, &
1053-
flagstruct%use_logp, remap_step, beta<-0.1)
1054+
flagstruct%use_logp, remap_step, beta<-0.1, &
1055+
flagstruct%fast_tau_w_sec)
10541056
call timing_off('Riem_Solver')
10551057

10561058
call timing_on('COMM_TOTAL')

model/fv_arrays.F90

+3
Original file line numberDiff line numberDiff line change
@@ -698,6 +698,9 @@ module fv_arrays_mod
698698
!< considered; and for non-hydrostatic models values of 10 or less should be
699699
!< considered, with smaller values for higher-resolution.
700700
real :: rf_cutoff = 30.E2 !< Pressure below which no Rayleigh damping is applied if tau > 0.
701+
real :: fast_tau_w_sec = 0.0 !< Time scale (seconds) for Rayleigh damping applied to vertical velocity only.
702+
!< Values of 0.2 are very effective at eliminating spurious vertical motion in
703+
!< the stratosphere. Default is 0.0, which disables this.
701704
logical :: filter_phys = .false.
702705
logical :: dwind_2d = .false. !< Whether to use a simpler & faster algorithm for interpolating
703706
!< the A-grid (cell-centered) wind tendencies computed from the physics

model/fv_control.F90

+3-1
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,7 @@ subroutine fv_control_init(Atm, dt_atmos, this_grid, grids_on_this_pe, p_split,
331331
real , pointer :: consv_te
332332
real , pointer :: tau
333333
real , pointer :: tau_w
334+
real , pointer :: fast_tau_w_sec
334335
real , pointer :: rf_cutoff
335336
logical , pointer :: filter_phys
336337
logical , pointer :: dwind_2d
@@ -887,6 +888,7 @@ subroutine set_namelist_pointers(Atm)
887888
consv_te => Atm%flagstruct%consv_te
888889
tau => Atm%flagstruct%tau
889890
tau_w => Atm%flagstruct%tau_w
891+
fast_tau_w_sec => Atm%flagstruct%fast_tau_w_sec
890892
rf_cutoff => Atm%flagstruct%rf_cutoff
891893
filter_phys => Atm%flagstruct%filter_phys
892894
dwind_2d => Atm%flagstruct%dwind_2d
@@ -1055,7 +1057,7 @@ subroutine read_namelist_fv_core_nml(Atm)
10551057
dry_mass, grid_type, do_Held_Suarez, do_reed_physics, reed_cond_only, &
10561058
consv_te, fill, filter_phys, fill_dp, fill_wz, fill_gfs, consv_am, RF_fast, &
10571059
range_warn, dwind_2d, inline_q, z_tracer, reproduce_sum, adiabatic, do_vort_damp, no_dycore, &
1058-
tau, tau_w, tau_h2o, rf_cutoff, nf_omega, hydrostatic, fv_sg_adj, sg_cutoff, breed_vortex_inline, &
1060+
tau, tau_w, fast_tau_w_sec, tau_h2o, rf_cutoff, nf_omega, hydrostatic, fv_sg_adj, sg_cutoff, breed_vortex_inline, &
10591061
na_init, nudge_dz, hybrid_z, Make_NH, n_zs_filter, nord_zs_filter, full_zs_filter, reset_eta, &
10601062
pnats, dnats, dnrts, a2b_ord, remap_t, p_ref, d2_bg_k1, d2_bg_k2, &
10611063
c2l_ord, dx_const, dy_const, umax, deglat, &

model/nh_core.F90

+6-6
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ subroutine Riem_Solver3(ms, dt, is, ie, js, je, km, ng, &
7272
ptop, zs, q_con, w, delz, pt, &
7373
delp, zh, pe, ppe, pk3, pk, peln, &
7474
ws, scale_m, p_fac, a_imp, &
75-
use_logp, last_call, fp_out)
75+
use_logp, last_call, fp_out, fast_tau_w_sec)
7676
!--------------------------------------------
7777
! !OUTPUT PARAMETERS
7878
! Ouput: gz: grav*height at edges
@@ -82,7 +82,7 @@ subroutine Riem_Solver3(ms, dt, is, ie, js, je, km, ng, &
8282
integer, intent(in):: ms, is, ie, js, je, km, ng
8383
integer, intent(in):: isd, ied, jsd, jed
8484
real, intent(in):: dt !< the BIG horizontal Lagrangian time step
85-
real, intent(in):: akap, cp, ptop, p_fac, a_imp, scale_m
85+
real, intent(in):: akap, cp, ptop, p_fac, a_imp, scale_m, fast_tau_w_sec
8686
real, intent(in):: zs(isd:ied,jsd:jed)
8787
logical, intent(in):: last_call, use_logp, fp_out
8888
real, intent(in):: ws(is:ie,js:je)
@@ -116,10 +116,10 @@ subroutine Riem_Solver3(ms, dt, is, ie, js, je, km, ng, &
116116
!$OMP parallel do default(none) shared(is,ie,js,je,km,delp,ptop,peln1,pk3,ptk,akap,rgrav,zh,pt, &
117117
!$OMP w,a_imp,dt,gama,ws,p_fac,scale_m,ms,delz,last_call, &
118118
#ifdef MULTI_GASES
119-
!$OMP peln,pk,fp_out,ppe,use_logp,zs,pe,cappa,q_con,kapad ) &
119+
!$OMP peln,pk,fp_out,ppe,use_logp,zs,pe,cappa,q_con,kapad,fast_tau_w_sec ) &
120120
!$OMP private(cp2, gm2, dm, dz2, pm2, pem, peg, pelng, pe2, peln2, w2,kapad2)
121121
#else
122-
!$OMP peln,pk,fp_out,ppe,use_logp,zs,pe,cappa,q_con ) &
122+
!$OMP peln,pk,fp_out,ppe,use_logp,zs,pe,cappa,q_con,fast_tau_w_sec ) &
123123
!$OMP private(cp2, gm2, dm, dz2, pm2, pem, peg, pelng, pe2, peln2, w2)
124124
#endif
125125
do 2000 j=js, je
@@ -206,15 +206,15 @@ subroutine Riem_Solver3(ms, dt, is, ie, js, je, km, ng, &
206206
kapad2, &
207207
#endif
208208
pe2, dm, &
209-
pm2, pem, w2, dz2, pt(is:ie,j,1:km), ws(is,j), p_fac)
209+
pm2, pem, w2, dz2, pt(is:ie,j,1:km), ws(is,j), p_fac, fast_tau_w_sec)
210210
else
211211
call SIM_solver(dt, is, ie, km, rdgas, gama, gm2, cp2, akap, &
212212
#ifdef MULTI_GASES
213213
kapad2, &
214214
#endif
215215
pe2, dm, &
216216
pm2, pem, w2, dz2, pt(is:ie,j,1:km), ws(is,j), &
217-
a_imp, p_fac, scale_m)
217+
a_imp, p_fac, scale_m, fast_tau_w_sec)
218218
endif
219219

220220

model/nh_utils.F90

+62-20
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,11 @@ module nh_utils_mod
5454
#else
5555
use constants_mod, only: rdgas, cp_air, grav
5656
#endif
57+
use constants_mod, only: pi_8
5758
use tp_core_mod, only: fv_tp_2d
5859
use sw_core_mod, only: fill_4corners, del6_vt_flux
5960
use fv_arrays_mod, only: fv_grid_bounds_type, fv_grid_type,fv_nest_BC_type_3d
61+
use mpp_mod, only: mpp_pe
6062
#ifdef MULTI_GASES
6163
use multi_gases_mod, only: vicpqd, vicvqd
6264
#endif
@@ -71,6 +73,10 @@ module nh_utils_mod
7173

7274
real, parameter:: r3 = 1./3.
7375

76+
real, allocatable :: rff(:)
77+
logical :: RFw_initialized = .false.
78+
integer :: k_rf = 0
79+
7480
CONTAINS
7581

7682
subroutine update_dz_c(is, ie, js, je, km, ng, dt, dp0, zs, area, ut, vt, gz, ws, &
@@ -346,11 +352,12 @@ subroutine Riem_Solver_c(ms, dt, is, ie, js, je, km, ng, &
346352
kapad, &
347353
#endif
348354
ptop, hs, w3, pt, q_con, &
349-
delp, gz, pef, ws, p_fac, a_imp, scale_m)
355+
delp, gz, pef, ws, p_fac, a_imp, scale_m, &
356+
pfull, fast_tau_w_sec, rf_cutoff)
350357

351358
integer, intent(in):: is, ie, js, je, ng, km
352359
integer, intent(in):: ms
353-
real, intent(in):: dt, akap, cp, ptop, p_fac, a_imp, scale_m
360+
real, intent(in):: dt, akap, cp, ptop, p_fac, a_imp, scale_m, fast_tau_w_sec, rf_cutoff
354361
real, intent(in):: ws(is-ng:ie+ng,js-ng:je+ng)
355362
real, intent(in), dimension(is-ng:ie+ng,js-ng:je+ng,km):: pt, delp
356363
real, intent(in), dimension(is-ng:,js-ng:,1:):: q_con, cappa
@@ -359,6 +366,7 @@ subroutine Riem_Solver_c(ms, dt, is, ie, js, je, km, ng, &
359366
#endif
360367
real, intent(in):: hs(is-ng:ie+ng,js-ng:je+ng)
361368
real, intent(in), dimension(is-ng:ie+ng,js-ng:je+ng,km):: w3
369+
real, intent(in) :: pfull(km)
362370
! OUTPUT PARAMETERS
363371
real, intent(inout), dimension(is-ng:ie+ng,js-ng:je+ng,km+1):: gz
364372
real, intent( out), dimension(is-ng:ie+ng,js-ng:je+ng,km+1):: pef
@@ -369,6 +377,7 @@ subroutine Riem_Solver_c(ms, dt, is, ie, js, je, km, ng, &
369377
real, dimension(is-1:ie+1,km ):: kapad2
370378
#endif
371379
real gama, rgrav
380+
real(kind=8) :: rff_temp
372381
integer i, j, k
373382
integer is1, ie1
374383

@@ -378,12 +387,26 @@ subroutine Riem_Solver_c(ms, dt, is, ie, js, je, km, ng, &
378387
is1 = is - 1
379388
ie1 = ie + 1
380389

390+
!Set up rayleigh damping
391+
if (fast_tau_w_sec > 1.e-5 .and. .not. RFw_initialized) then
392+
allocate(rff(km))
393+
RFw_initialized = .true.
394+
do k=1,km
395+
if (pfull(k) > rf_cutoff) exit
396+
k_rf = k
397+
rff_temp = real(dt/fast_tau_w_sec,kind=8) &
398+
* sin(0.5d0*pi_8*log(real(rf_cutoff/pfull(k),kind=8))/log(real(rf_cutoff/ptop, kind=8)))**2
399+
rff(k) = 1.0d0 / ( 1.0d0+rff_temp )
400+
enddo
401+
endif
402+
403+
381404
!$OMP parallel do default(none) shared(js,je,is1,ie1,km,delp,pef,ptop,gz,rgrav,w3,pt, &
382405
#ifdef MULTI_GASES
383-
!$OMP a_imp,dt,gama,akap,ws,p_fac,scale_m,ms,hs,q_con,cappa,kapad) &
406+
!$OMP a_imp,dt,gama,akap,ws,p_fac,scale_m,ms,hs,q_con,cappa,kapad,fast_tau_w_sec) &
384407
!$OMP private(cp2,gm2, dm, dz2, w2, pm2, pe2, pem, peg, kapad2)
385408
#else
386-
!$OMP a_imp,dt,gama,akap,ws,p_fac,scale_m,ms,hs,q_con,cappa) &
409+
!$OMP a_imp,dt,gama,akap,ws,p_fac,scale_m,ms,hs,q_con,cappa,fast_tau_w_sec) &
387410
!$OMP private(cp2,gm2, dm, dz2, w2, pm2, pe2, pem, peg)
388411
#endif
389412
do 2000 j=js-1, je+1
@@ -455,7 +478,7 @@ subroutine Riem_Solver_c(ms, dt, is, ie, js, je, km, ng, &
455478
kapad2, &
456479
#endif
457480
pe2, &
458-
dm, pm2, pem, w2, dz2, pt(is1:ie1,j,1:km), ws(is1,j), p_fac)
481+
dm, pm2, pem, w2, dz2, pt(is1:ie1,j,1:km), ws(is1,j), p_fac, fast_tau_w_sec)
459482
endif
460483

461484
do k=2,km+1
@@ -622,15 +645,15 @@ subroutine Riem_Solver3test(ms, dt, is, ie, js, je, km, ng, &
622645
kapad2, &
623646
#endif
624647
pe2, dm, &
625-
pm2, pem, w2, dz2, pt(is:ie,j,1:km), ws(is,j), p_fac)
648+
pm2, pem, w2, dz2, pt(is:ie,j,1:km), ws(is,j), p_fac, -1.)
626649
else
627650
call SIM_solver(dt, is, ie, km, rdgas, gama, gm2, cp2, akap, &
628651
#ifdef MULTI_GASES
629652
kapad2, &
630653
#endif
631654
pe2, dm, &
632655
pm2, pem, w2, dz2, pt(is:ie,j,1:km), ws(is,j), &
633-
a_imp, p_fac, scale_m)
656+
a_imp, p_fac, scale_m, -1.)
634657
endif
635658

636659
do k=1, km
@@ -1385,9 +1408,9 @@ subroutine SIM1_solver(dt, is, ie, km, rgas, gama, gm2, cp2, kappa, &
13851408
kapad2, &
13861409
#endif
13871410
pe, dm2, &
1388-
pm2, pem, w2, dz2, pt2, ws, p_fac)
1411+
pm2, pem, w2, dz2, pt2, ws, p_fac, fast_tau_w_sec)
13891412
integer, intent(in):: is, ie, km
1390-
real, intent(in):: dt, rgas, gama, kappa, p_fac
1413+
real, intent(in):: dt, rgas, gama, kappa, p_fac, fast_tau_w_sec
13911414
real, intent(in), dimension(is:ie,km):: dm2, pt2, pm2, gm2, cp2
13921415
real, intent(in ):: ws(is:ie)
13931416
real, intent(in ), dimension(is:ie,km+1):: pem
@@ -1464,14 +1487,14 @@ subroutine SIM1_solver(dt, is, ie, km, rgas, gama, gm2, cp2, kappa, &
14641487
do k=2, km
14651488
do i=is, ie
14661489
#ifdef MOIST_CAPPA
1467-
aa(i,k) = t1g*0.5*(gm2(i,k-1)+gm2(i,k))/(dz2(i,k-1)+dz2(i,k)) * (pem(i,k)+pp(i,k))
1490+
aa(i,k) = t1g*0.5*(gm2(i,k-1)+gm2(i,k))/(dz2(i,k-1)+dz2(i,k)) * (pem(i,k))
14681491
#else
14691492
#ifdef MULTI_GASES
14701493
gamax = 1./(1.-kapad2(i,k))
14711494
t1gx = gamax * 2.*dt*dt
1472-
aa(i,k) = t1gx/(dz2(i,k-1)+dz2(i,k)) * (pem(i,k)+pp(i,k))
1495+
aa(i,k) = t1gx/(dz2(i,k-1)+dz2(i,k)) * (pem(i,k))
14731496
#else
1474-
aa(i,k) = t1g/(dz2(i,k-1)+dz2(i,k)) * (pem(i,k)+pp(i,k))
1497+
aa(i,k) = t1g/(dz2(i,k-1)+dz2(i,k)) * (pem(i,k))
14751498
#endif
14761499
#endif
14771500
enddo
@@ -1489,14 +1512,14 @@ subroutine SIM1_solver(dt, is, ie, km, rgas, gama, gm2, cp2, kappa, &
14891512
enddo
14901513
do i=is, ie
14911514
#ifdef MOIST_CAPPA
1492-
p1(i) = t1g*gm2(i,km)/dz2(i,km)*(pem(i,km+1)+pp(i,km+1))
1515+
p1(i) = t1g*gm2(i,km)/dz2(i,km)*(pem(i,km+1))
14931516
#else
14941517
#ifdef MULTI_GASES
14951518
gamax = 1./(1.-kapad2(i,km))
14961519
t1gx = gamax * 2.*dt*dt
1497-
p1(i) = t1gx/dz2(i,km)*(pem(i,km+1)+pp(i,km+1))
1520+
p1(i) = t1gx/dz2(i,km)*(pem(i,km+1))
14981521
#else
1499-
p1(i) = t1g/dz2(i,km)*(pem(i,km+1)+pp(i,km+1))
1522+
p1(i) = t1g/dz2(i,km)*(pem(i,km+1))
15001523
#endif
15011524
#endif
15021525
gam(i,km) = aa(i,km) / bet(i)
@@ -1509,6 +1532,16 @@ subroutine SIM1_solver(dt, is, ie, km, rgas, gama, gm2, cp2, kappa, &
15091532
enddo
15101533
enddo
15111534

1535+
!!! Try Rayleigh damping of w
1536+
if (fast_tau_w_sec > 1.e-5) then
1537+
!currently not damping to heat
1538+
do k=1,k_rf
1539+
do i=is,ie
1540+
w2(i,k) = w2(i,k)*rff(k)
1541+
enddo
1542+
enddo
1543+
endif
1544+
15121545
do i=is, ie
15131546
pe(i,1) = 0.
15141547
enddo
@@ -1549,16 +1582,16 @@ subroutine SIM1_solver(dt, is, ie, km, rgas, gama, gm2, cp2, kappa, &
15491582
enddo
15501583
enddo
15511584

1552-
end subroutine SIM1_solver
1585+
end subroutine SIM1_solver
15531586

15541587
subroutine SIM_solver(dt, is, ie, km, rgas, gama, gm2, cp2, kappa, &
15551588
#ifdef MULTI_GASES
15561589
kapad2, &
15571590
#endif
15581591
pe2, dm2, &
1559-
pm2, pem, w2, dz2, pt2, ws, alpha, p_fac, scale_m)
1592+
pm2, pem, w2, dz2, pt2, ws, alpha, p_fac, scale_m, fast_tau_w_sec)
15601593
integer, intent(in):: is, ie, km
1561-
real, intent(in):: dt, rgas, gama, kappa, p_fac, alpha, scale_m
1594+
real, intent(in):: dt, rgas, gama, kappa, p_fac, alpha, scale_m, fast_tau_w_sec
15621595
real, intent(in), dimension(is:ie,km):: dm2, pt2, pm2, gm2, cp2
15631596
real, intent(in ):: ws(is:ie)
15641597
real, intent(in ), dimension(is:ie,km+1):: pem
@@ -1637,8 +1670,7 @@ subroutine SIM_solver(dt, is, ie, km, rgas, gama, gm2, cp2, kappa, &
16371670

16381671
do k=1, km+1
16391672
do i=is, ie
1640-
! pe2 is Full p
1641-
pe2(i,k) = pem(i,k) + pp(i,k)
1673+
pe2(i,k) = pem(i,k)
16421674
enddo
16431675
enddo
16441676

@@ -1697,6 +1729,16 @@ subroutine SIM_solver(dt, is, ie, km, rgas, gama, gm2, cp2, kappa, &
16971729
enddo
16981730
enddo
16991731

1732+
!!! Try Rayleigh damping of w
1733+
if (fast_tau_w_sec > 1.e-5) then
1734+
!currently not damping to heat
1735+
do k=1,k_rf
1736+
do i=is,ie
1737+
w2(i,k) = w2(i,k)*rff(k)
1738+
enddo
1739+
enddo
1740+
endif
1741+
17001742
do i=is, ie
17011743
pe2(i,1) = 0.
17021744
enddo

0 commit comments

Comments
 (0)