Skip to content

Commit da6d838

Browse files
authored
Merge pull request #112 from jjuyeonkim/wam_dev
[WIP] Additional pkz+rdg_var mods
2 parents ac7ebb4 + fa1e57e commit da6d838

File tree

7 files changed

+44
-19
lines changed

7 files changed

+44
-19
lines changed

pyfv3/initialization/init_utils.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -223,18 +223,19 @@ def initialize_log_pressure_interfaces(pe, ptop):
223223
return peln
224224

225225

226-
def initialize_pkz_dry(delp, pt, delz):
226+
def initialize_pkz_dry(delp, pt, delz, rdg_var):
227+
# TODO: Is WAM-related variable rdg necessary here?
227228
return np.exp(
228229
constants.KAPPA
229-
* np.log(constants.RDG * delp[:, :, :-1] * pt[:, :, :-1] / delz[:, :, :-1])
230+
* np.log(rdg_var * delp[:, :, :-1] * pt[:, :, :-1] / delz[:, :, :-1])
230231
)
231232

232233

233-
def initialize_pkz_moist(delp, pt, qvapor, delz):
234+
def initialize_pkz_moist(delp, pt, qvapor, delz, rdg_var):
234235
return np.exp(
235236
constants.KAPPA
236237
* np.log(
237-
constants.RDG
238+
rdg_var[:, :, :-1] # TODO: Is WAM-related variable rdg necessary here?
238239
* delp[:, :, :-1]
239240
* pt[:, :, :-1]
240241
* (1.0 + constants.ZVIR * qvapor[:, :, :-1])
@@ -282,6 +283,7 @@ def p_var(
282283
ptop,
283284
moist_phys,
284285
make_nh,
286+
rdg_var,
285287
):
286288
"""
287289
Computes auxiliary pressure variables for a hydrostatic state.
@@ -297,9 +299,9 @@ def p_var(
297299
if make_nh:
298300
delz[:, :, :-1] = initialize_delz(pt, peln)
299301
if moist_phys:
300-
pkz[:, :, :-1] = initialize_pkz_moist(delp, pt, qvapor, delz)
302+
pkz[:, :, :-1] = initialize_pkz_moist(delp, pt, qvapor, delz, rdg_var)
301303
else:
302-
pkz[:, :, :-1] = initialize_pkz_dry(delp, pt, delz)
304+
pkz[:, :, :-1] = initialize_pkz_dry(delp, pt, delz, rdg_var)
303305

304306

305307
def setup_pressure_fields(

pyfv3/initialization/test_cases/initialize_baroclinic.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,8 @@ def init_baroclinic_state(
304304
numpy_state.delz[:] = 1.0e25
305305
numpy_state.phis[:] = 1.0e25
306306
numpy_state.ps[:] = SURFACE_PRESSURE
307+
numpy_state.grav_var[:] = constants.GRAV
308+
numpy_state.rdg_var[:] = -1 / numpy_state.grav_var
307309
eta = np.zeros(nz)
308310
eta_v = np.zeros(nz)
309311
islice, jslice, slice_3d, slice_2d = init_utils.compute_slices(nx, ny)
@@ -365,6 +367,7 @@ def init_baroclinic_state(
365367
ptop=grid_data.ptop,
366368
moist_phys=moist_phys,
367369
make_nh=(not hydrostatic),
370+
rdg_var=numpy_state.rdg_var[slice_3d],
368371
)
369372
state = DycoreState.init_from_numpy_arrays(
370373
numpy_state.__dict__,

pyfv3/stencils/dyn_core.py

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import pyfv3.stencils.pe_halo as pe_halo
1111
import pyfv3.stencils.ray_fast as ray_fast
1212
import pyfv3.stencils.temperature_adjust as temperature_adjust
13+
import pyfv3.stencils.rdg_adjust as rdg_adjust
1314
import pyfv3.stencils.updatedzc as updatedzc
1415
import pyfv3.stencils.updatedzd as updatedzd
1516
from ndsl import (
@@ -101,17 +102,6 @@ def average_gravity(grav_var: FloatField, grav_var_h: FloatField):
101102
grav_var[0, 0, 0] = 0.5*(grav_var_h[0, 0, 0] + grav_var_h[0, 0, 1])
102103

103104

104-
def neg_rdgas_div_gravity(rdg: FloatField, grav_var: FloatField):
105-
"""
106-
# JK TODO: Is there a better name than this?
107-
Args:
108-
rdg (out): negative radiative gas divided by variable gravity
109-
grav_var (in): variable gravity
110-
"""
111-
with computation(FORWARD), interval(...):
112-
rdg = - constants.RDGAS / grav_var
113-
114-
115105
def gz_from_surface_height_and_thicknesses(
116106
zs: FloatFieldIJ, delz: FloatField, gz: FloatField
117107
):
@@ -682,7 +672,7 @@ def __init__(
682672
domain=grid_indexing.domain_full(),
683673
)
684674
self._neg_rdgas_div_gravity = stencil_factory.from_origin_domain(
685-
neg_rdgas_div_gravity,
675+
rdg_adjust.neg_rdgas_div_gravity,
686676
origin=grid_indexing.origin_full(),
687677
domain=grid_indexing.domain_full(),
688678
)
@@ -1068,4 +1058,5 @@ def __call__(
10681058
self._heat_source,
10691059
state.pt,
10701060
delt_time_factor,
1061+
state.rdg_var
10711062
)

pyfv3/stencils/fv_dynamics.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from pyfv3.stencils.dyn_core import AcousticDynamics
2626
from pyfv3.stencils.neg_adj3 import AdjustNegativeTracerMixingRatio
2727
from pyfv3.stencils.remapping import LagrangianToEulerian
28+
import pyfv3.stencils.rdg_adjust as rdg_adjust
2829

2930

3031
def pt_to_potential_density_pt(
@@ -316,6 +317,11 @@ def __init__(
316317
origin=grid_indexing.origin_full(),
317318
domain=grid_indexing.domain_full(add=(0,0,1)),
318319
)
320+
self._adjust_rdg = stencil_factory.from_origin_domain(
321+
rdg_adjust.neg_rdgas_div_gravity,
322+
origin=grid_indexing.origin_full(),
323+
domain=grid_indexing.domain_full(),
324+
)
319325
self.acoustic_dynamics = AcousticDynamics(
320326
comm=comm,
321327
stencil_factory=stencil_factory,
@@ -544,6 +550,8 @@ def compute_preamble(self, state: DycoreState, is_root_rank: bool):
544550
if self.config.enable_wam:
545551
self._adjust_gravity(state.grav_var, state.grav_var_h, state.phis, state.delz)
546552

553+
self._adjust_rdg(state.rdg_var, state.grav_var)
554+
547555
if self._conserve_total_energy > 0:
548556
raise NotImplementedError(
549557
"Dynamical Core (fv_dynamics): compute total energy is not implemented"

pyfv3/stencils/rdg_adjust.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import ndsl.constants as constants
2+
from ndsl.dsl.gt4py import FORWARD, computation, interval
3+
from ndsl.dsl.typing import FloatField
4+
5+
6+
def neg_rdgas_div_gravity(rdg: FloatField, grav_var: FloatField):
7+
"""
8+
# JK TODO: Is there a better name than this?
9+
Adjust rdg to be the negative RDGAS divided by the variable gravity
10+
for Whole Atmosphere Modeling
11+
12+
Args:
13+
rdg (out): negative radiative gas divided by variable gravity
14+
grav_var (in): variable gravity
15+
"""
16+
with computation(FORWARD), interval(...):
17+
rdg = - constants.RDGAS / grav_var

pyfv3/stencils/temperature_adjust.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ def apply_diffusive_heating(
1111
heat_source: FloatField,
1212
pt: FloatField,
1313
delt_time_factor: Float,
14+
rdg_var: FloatField,
1415
):
1516
"""
1617
Adjust air temperature from heating due to vorticity damping.
@@ -25,9 +26,11 @@ def apply_diffusive_heating(
2526
energy conservation
2627
pt (inout): Air potential temperature
2728
delta_time_factor (in): scaled time step
29+
rdg_var (in): negative rdgas divided by variable gravity
2830
"""
2931
with computation(PARALLEL), interval(...):
30-
pkz = exp(cappa / (1.0 - cappa) * log(constants.RDG * delp / delz * pt))
32+
# JK TODO: Double-check rdg_var here instead of constants.RDG
33+
pkz = exp(cappa / (1.0 - cappa) * log(rdg_var * delp / delz * pt))
3134
dtmp = heat_source / (constants.CV_AIR * delp)
3235
with computation(PARALLEL):
3336
with interval(0, 1):

tests/main/test_wam.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
from pyfv3.initialization import init_utils
2828
from pyfv3.initialization.analytic_init import AnalyticCase
2929
from pyfv3.stencils.dyn_core import AcousticDynamics
30+
from pyfv3.stencils.rdg_adjust import neg_rdgas_div_gravity
3031
from pyfv3.stencils.fv_dynamics import adjust_gravity, init_gravity, init_gravity_h
3132
from pyfv3.stencils.dyn_core import average_gravity, compute_geopotential
3233

0 commit comments

Comments
 (0)