Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
228 changes: 24 additions & 204 deletions pyfv3/stencils/delnflux.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@
from ndsl.dsl.stencil import get_stencils_with_varied_bounds
from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ, FloatFieldK
from ndsl.grid import DampingCoefficients
import dace
from ndsl.stencils.corners import (
two_dimensional_corner_copy_x,
two_dimensional_corner_copy_y,
)


def calc_damp(damp_c: Quantity, da_min: Float, nord: Quantity) -> Quantity:
Expand Down Expand Up @@ -120,7 +125,7 @@ def d2_highorder_stencil(
):
with computation(PARALLEL), interval(...):
if nord > current_nord:
d2 = ((fx - fx[1, 0, 0]) + (fy - fy[0, 1, 0])) * rarea
d2 = (fx - fx[1, 0, 0] + fy - fy[0, 1, 0]) * rarea


def d2_damp_interval(
Expand Down Expand Up @@ -182,178 +187,6 @@ def diffusive_damp(
fy = fy + 0.5 * damp * (mass[0, -1, 0] + mass) * fy2


def copy_corners_y_nord(
q_in: FloatField, q_out: FloatField, nord: FloatFieldK, current_nord: int
):
"""
Args:
q_in (in):
q_out (out):
"""
from __externals__ import i_end, i_start, j_end, j_start

with computation(PARALLEL), interval(...):
if nord > current_nord:
with horizontal(
region[i_start - 3, j_start - 3], region[i_start - 3, j_end + 3]
):
q_out = q_in[5, 0, 0]
with horizontal(
region[i_start - 2, j_start - 3], region[i_start - 3, j_end + 2]
):
q_out = q_in[4, 1, 0]
with horizontal(
region[i_start - 1, j_start - 3], region[i_start - 3, j_end + 1]
):
q_out = q_in[3, 2, 0]
with horizontal(
region[i_start - 3, j_start - 2], region[i_start - 2, j_end + 3]
):
q_out = q_in[4, -1, 0]
with horizontal(
region[i_start - 2, j_start - 2], region[i_start - 2, j_end + 2]
):
q_out = q_in[3, 0, 0]
with horizontal(
region[i_start - 1, j_start - 2], region[i_start - 2, j_end + 1]
):
q_out = q_in[2, 1, 0]
with horizontal(
region[i_start - 3, j_start - 1], region[i_start - 1, j_end + 3]
):
q_out = q_in[3, -2, 0]
with horizontal(
region[i_start - 2, j_start - 1], region[i_start - 1, j_end + 2]
):
q_out = q_in[2, -1, 0]
with horizontal(
region[i_start - 1, j_start - 1], region[i_start - 1, j_end + 1]
):
q_out = q_in[1, 0, 0]
with horizontal(
region[i_end + 1, j_start - 3], region[i_end + 3, j_end + 1]
):
q_out = q_in[-3, 2, 0]
with horizontal(
region[i_end + 2, j_start - 3], region[i_end + 3, j_end + 2]
):
q_out = q_in[-4, 1, 0]
with horizontal(
region[i_end + 3, j_start - 3], region[i_end + 3, j_end + 3]
):
q_out = q_in[-5, 0, 0]
with horizontal(
region[i_end + 1, j_start - 2], region[i_end + 2, j_end + 1]
):
q_out = q_in[-2, 1, 0]
with horizontal(
region[i_end + 2, j_start - 2], region[i_end + 2, j_end + 2]
):
q_out = q_in[-3, 0, 0]
with horizontal(
region[i_end + 3, j_start - 2], region[i_end + 2, j_end + 3]
):
q_out = q_in[-4, -1, 0]
with horizontal(
region[i_end + 1, j_start - 1], region[i_end + 1, j_end + 1]
):
q_out = q_in[-1, 0, 0]
with horizontal(
region[i_end + 2, j_start - 1], region[i_end + 1, j_end + 2]
):
q_out = q_in[-2, -1, 0]
with horizontal(
region[i_end + 3, j_start - 1], region[i_end + 1, j_end + 3]
):
q_out = q_in[-3, -2, 0]


def copy_corners_x_nord(
q_in: FloatField, q_out: FloatField, nord: FloatFieldK, current_nord: int
):
"""
Args:
q_in (in):
q_out (out):
"""
from __externals__ import i_end, i_start, j_end, j_start

with computation(PARALLEL), interval(...):
if nord > current_nord:
with horizontal(
region[i_start - 3, j_start - 3], region[i_end + 3, j_start - 3]
):
q_out = q_in[0, 5, 0]
with horizontal(
region[i_start - 2, j_start - 3], region[i_end + 3, j_start - 2]
):
q_out = q_in[-1, 4, 0]
with horizontal(
region[i_start - 1, j_start - 3], region[i_end + 3, j_start - 1]
):
q_out = q_in[-2, 3, 0]
with horizontal(
region[i_start - 3, j_start - 2], region[i_end + 2, j_start - 3]
):
q_out = q_in[1, 4, 0]
with horizontal(
region[i_start - 2, j_start - 2], region[i_end + 2, j_start - 2]
):
q_out = q_in[0, 3, 0]
with horizontal(
region[i_start - 1, j_start - 2], region[i_end + 2, j_start - 1]
):
q_out = q_in[-1, 2, 0]
with horizontal(
region[i_start - 3, j_start - 1], region[i_end + 1, j_start - 3]
):
q_out = q_in[2, 3, 0]
with horizontal(
region[i_start - 2, j_start - 1], region[i_end + 1, j_start - 2]
):
q_out = q_in[1, 2, 0]
with horizontal(
region[i_start - 1, j_start - 1], region[i_end + 1, j_start - 1]
):
q_out = q_in[0, 1, 0]
with horizontal(
region[i_start - 3, j_end + 1], region[i_end + 1, j_end + 3]
):
q_out = q_in[2, -3, 0]
with horizontal(
region[i_start - 2, j_end + 1], region[i_end + 1, j_end + 2]
):
q_out = q_in[1, -2, 0]
with horizontal(
region[i_start - 1, j_end + 1], region[i_end + 1, j_end + 1]
):
q_out = q_in[0, -1, 0]
with horizontal(
region[i_start - 3, j_end + 2], region[i_end + 2, j_end + 3]
):
q_out = q_in[1, -4, 0]
with horizontal(
region[i_start - 2, j_end + 2], region[i_end + 2, j_end + 2]
):
q_out = q_in[0, -3, 0]
with horizontal(
region[i_start - 1, j_end + 2], region[i_end + 2, j_end + 1]
):
q_out = q_in[-1, -2, 0]
with horizontal(
region[i_start - 3, j_end + 3], region[i_end + 3, j_end + 3]
):
q_out = q_in[0, -5, 0]
with horizontal(
region[i_start - 2, j_end + 3], region[i_end + 3, j_end + 2]
):
q_out = q_in[-1, -4, 0]
with horizontal(
region[i_start - 1, j_end + 3], region[i_end + 3, j_end + 1]
):
q_out = q_in[-2, -3, 0]


class DelnFlux:
"""
Fortran name is deln_flux
Expand Down Expand Up @@ -454,9 +287,9 @@ def __call__(
# fx2 and fy2 are local variables containing the diffusive flux, which
# gets added to the base flux below
if d2 is None:
self.delnflux_nosg(q, self._fx2, self._fy2, self._damp, self._d2, mass)
self.delnflux_nosg(q, self._fx2, self._fy2, self._damp, self._d2.data, mass)
else:
self.delnflux_nosg(q, self._fx2, self._fy2, self._damp, d2, mass)
self.delnflux_nosg(q, self._fx2, self._fy2, self._damp, self._d2.data, mass)

if mass is None:
self._add_diffusive_stencil(fx, self._fx2, fy, self._fy2)
Expand All @@ -471,6 +304,18 @@ def __call__(
return fx, fy


def copy_corner_x(nord, d2):
for k in dace.map[nord.data.shape[0]]:
if nord.data[k] > 0:
two_dimensional_corner_copy_x(d2[:, :, k])


def copy_corner_y(nord, d2):
for k in dace.map[nord.data.shape[0]]:
if nord.data[k] > 0:
two_dimensional_corner_copy_y(d2[:, :, k])


class DelnFluxNoSG:
"""
This contains the mechanics of del6_vt and some of deln_flux from
Expand Down Expand Up @@ -599,27 +444,6 @@ def __init__(
origin=fx_origin,
domain=(f1_nx - 1, f1_ny + 1, nk),
)
corner_origin, corner_domain = grid_indexing.get_origin_domain(
dims=[X_DIM, Y_DIM, Z_DIM],
halos=(grid_indexing.n_halo, grid_indexing.n_halo),
)
corner_domain = corner_domain[:2] + (nk,)
corner_axis_offsets = grid_indexing.axis_offsets(corner_origin, corner_domain)

self._copy_corners_x_nord = stencil_factory.from_origin_domain(
copy_corners_x_nord,
externals={**corner_axis_offsets},
origin=corner_origin,
domain=corner_domain,
skip_passes=("UnreachableStmtPruning",),
)
self._copy_corners_y_nord = stencil_factory.from_origin_domain(
copy_corners_y_nord,
externals={**corner_axis_offsets},
origin=corner_origin,
domain=corner_domain,
skip_passes=("UnreachableStmtPruning",),
)

def __call__(self, q, fx2, fy2, damp_c, d2, mass=None):
"""
Expand All @@ -643,11 +467,11 @@ def __call__(self, q, fx2, fy2, damp_c, d2, mass=None):
else:
self._copy_stencil_interval(q_in=q, q_out=d2, nord=self._nord)

self._copy_corners_x_nord(q_in=d2, q_out=d2, nord=self._nord, current_nord=0)
# copy_corner_x(self._nord, d2)

self._fx_calc_stencil(q=d2, del6_v=self._del6_v, fx=fx2, nord=self._nord)

self._copy_corners_y_nord(q_in=d2, q_out=d2, nord=self._nord, current_nord=0)
# copy_corner_y(self._nord, d2)

self._fy_calc_stencil(q=d2, del6_u=self._del6_u, fy=fy2, nord=self._nord)

Expand All @@ -661,17 +485,13 @@ def __call__(self, q, fx2, fy2, damp_c, d2, mass=None):
current_nord=n,
)

self._copy_corners_x_nord(
q_in=d2, q_out=d2, nord=self._nord, current_nord=n
)
# copy_corner_x(self._nord, d2)

self._column_conditional_fx_calculation[n](
q=d2, del6_v=self._del6_v, fx=fx2, nord=self._nord, current_nord=n
)

self._copy_corners_y_nord(
q_in=d2, q_out=d2, nord=self._nord, current_nord=n
)
# copy_corner_y(self._nord, d2)

self._column_conditional_fy_calculation[n](
q=d2, del6_u=self._del6_u, fy=fy2, nord=self._nord, current_nord=n
Expand Down
8 changes: 2 additions & 6 deletions pyfv3/stencils/fvtp2d.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,9 +179,7 @@ def make_quantity():
# self.delnflux = None
self._do_delnflux = False

self._copy_corners_y: corners.CopyCorners = corners.CopyCorners(
"y", stencil_factory
)
self._copy_corners_y: corners.CopyCorners = corners.CopyCorners("y")
self.y_piecewise_parabolic_inner = YPiecewiseParabolic(
stencil_factory=stencil_factory,
dya=grid_data.dya,
Expand All @@ -204,9 +202,7 @@ def make_quantity():
domain=idx.domain_compute(add=(1, 1, 1)),
)

self._copy_corners_x: corners.CopyCorners = corners.CopyCorners(
"x", stencil_factory
)
self._copy_corners_x: corners.CopyCorners = corners.CopyCorners("x")
self.x_piecewise_parabolic_inner = XPiecewiseParabolic(
stencil_factory=stencil_factory,
dxa=grid_data.dxa,
Expand Down