Skip to content

Commit 9a4636c

Browse files
committed
refactored second_projection.euler_forward_non_advective
I am still allocating on the fly but this is a performance hit I am willing to take for now
1 parent 71a13a4 commit 9a4636c

File tree

1 file changed

+51
-50
lines changed

1 file changed

+51
-50
lines changed

src/pybella/flow_solver/physics/low_mach/second_projection.py

Lines changed: 51 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -25,78 +25,79 @@ def __call__(self, rk=None):
2525
self.rk = rk
2626

2727

28-
def euler_forward_non_advective(
29-
mem, ud, dt, writer=None, label=None, debug=False
30-
):
28+
def euler_forward_non_advective(mem, ud, dt, writer=None, label=None, debug=False):
29+
# Unpack frequently used variables
30+
th, sol, mpv, node, elem = mem.th, mem.sol, mem.mpv, mem.node, mem.elem
31+
ndim = elem.ndim
32+
3133
nonhydro = ud.nonhydrostasy
32-
g = ud.gravity_strength[1]
33-
Msq = ud.Msq
34-
Ginv = mem.th.Gammainv
35-
corr_h1 = ud.coriolis_strength[0]
36-
corr_v = ud.coriolis_strength[1]
37-
corr_h2 = ud.coriolis_strength[2]
38-
u0 = ud.u_wind_speed
39-
v0 = ud.v_wind_speed
40-
w0 = ud.w_wind_speed
41-
42-
p2n = mem.mpv.p2_nodes
34+
g, Msq = ud.gravity_strength[1], ud.Msq
35+
Ginv = th.Gammainv
36+
corr_h1, corr_v, corr_h2 = ud.coriolis_strength
37+
u0, v0, w0 = ud.u_wind_speed, ud.v_wind_speed, ud.w_wind_speed
38+
39+
# Reusable derived quantities
40+
rho, rhoY, rhoX = sol.rho, sol.rhoY, sol.rhoX
41+
rhou, rhov, rhow = sol.rhou, sol.rhov, sol.rhow
42+
43+
# Pressure and derivatives
44+
p2n = mpv.p2_nodes
4345
dp2n = np.zeros_like(p2n)
44-
ndim = mem.elem.ndim
4546

46-
# new allocations on the first call and cached view on subsequent calls
47-
S0c = mem.mpv.HydroState.get_S0c(mem.elem)
48-
dSdy = mem.mpv.HydroState_n.get_dSdy(mem.elem, mem.node)
47+
S0c = mpv.HydroState.get_S0c(elem)
48+
dSdy = mpv.HydroState_n.get_dSdy(elem, node)
4949

50-
mem.mpv.rhs[...] = divergence_nodes(mem.mpv.rhs, mem.elem, mem.node, mem.sol, ud)
50+
# Compute divergence
51+
mpv.rhs[...] = divergence_nodes(mpv.rhs, elem, node, sol, ud)
5152
if not hasattr(ud, "ATMOSPHERIC_EXTENSION"):
52-
bdry.scale_wall_node_values(mem.mpv.rhs, mem.node, ud, 2.0)
53-
div = mem.mpv.rhs
53+
bdry.scale_wall_node_values(mpv.rhs, node, ud, 2.0)
5454

5555
if debug:
56-
writer.populate(str(label), "rhs", div)
56+
writer.populate(str(label), "rhs", mpv.rhs)
5757

58+
# Compute compressibility kernel
5859
kernel = operators.get_averaging_kernel(ndim, width=2)
59-
dpidP = (
60-
(mem.th.gm1 / ud.Msq)
61-
* operators.apply_convolution_kernel(
62-
mem.sol.rhoY ** (mem.th.gamm - 2.0),
63-
kernel=kernel,
64-
normalize=True,
65-
use_numba=True
66-
)
67-
)
60+
dpidP = (th.gm1 / Msq) * operators.apply_convolution_kernel(
61+
rhoY ** (th.gamm - 2.0),
62+
kernel=kernel,
63+
normalize=True,
64+
use_numba=True
65+
)
6866

69-
rhoYovG = Ginv * mem.sol.rhoY
70-
dbuoy = mem.sol.rhoY * (mem.sol.rhoX / mem.sol.rho)
71-
dpdx, dpdy, dpdz = operators.compute_gradient_nodes(p2n, mem.elem.ndim, mem.node.dxyz)
67+
rhoYovG = Ginv * rhoY
68+
dbuoy = rhoY * (rhoX / rho)
7269

73-
drhou = mem.sol.rhou - u0 * mem.sol.rho
74-
drhov = mem.sol.rhov - v0 * mem.sol.rho
75-
drhow = mem.sol.rhow - w0 * mem.sol.rho
76-
v = mem.sol.rhov / mem.sol.rho
70+
# Pressure gradients
71+
dpdx, dpdy, dpdz = operators.compute_gradient_nodes(p2n, ndim, node.dxyz)
7772

78-
mem.sol.rhou[...] = mem.sol.rhou - dt * (rhoYovG * dpdx - corr_h2 * drhov + corr_v * drhow)
73+
# Wind perturbations
74+
drhou = rhou - u0 * rho
75+
drhov = rhov - v0 * rho
76+
drhow = rhow - w0 * rho
77+
v = rhov / rho
7978

80-
mem.sol.rhov[...] = mem.sol.rhov - dt * (
79+
# Momentum update (u, v, w)
80+
rhou -= dt * (rhoYovG * dpdx - corr_h2 * drhov + corr_v * drhow)
81+
rhov -= dt * (
8182
rhoYovG * dpdy
8283
+ (g / Msq) * dbuoy * nonhydro
8384
- corr_h1 * drhow
8485
+ corr_h2 * drhou
8586
) * (1 - ud.is_ArakawaKonor)
8687

87-
mem.sol.rhow[...] = mem.sol.rhow - dt * (rhoYovG * dpdz - corr_v * drhou + corr_h1 * drhov) * (
88-
ndim == 3
89-
)
88+
if ndim == 3:
89+
rhow -= dt * (rhoYovG * dpdz - corr_v * drhou + corr_h1 * drhov)
9090

91-
mem.sol.rhoX[...] = (mem.sol.rho * (mem.sol.rho / mem.sol.rhoY - S0c)) - dt * (v * dSdy) * mem.sol.rho
91+
# Scalar update (rhoX)
92+
sol.rhoX[...] = (rho * (rho / rhoY - S0c)) - dt * (v * dSdy) * rho
9293

93-
dp2n[mem.node.i1] -= dt * dpidP * div
94+
# Compressibility correction to p2
95+
dp2n[node.i1] -= dt * dpidP * mpv.rhs
96+
mpv.p2_nodes += ud.compressibility * dp2n
9497

95-
weight = ud.compressibility
96-
mem.mpv.p2_nodes += weight * dp2n
97-
98-
bdry.set_ghostnodes_p2(mem.mpv.p2_nodes, mem.node, ud)
99-
bdry.set_explicit_boundary_data(mem.sol, mem.elem, ud, mem.th, mem.mpv)
98+
# Boundary conditions
99+
bdry.set_ghostnodes_p2(mpv.p2_nodes, node, ud)
100+
bdry.set_explicit_boundary_data(sol, elem, ud, th, mpv)
100101

101102

102103
def euler_backward_non_advective_expl_part(mem, ud, dt):

0 commit comments

Comments
 (0)