@@ -25,78 +25,79 @@ def __call__(self, rk=None):
25
25
self .rk = rk
26
26
27
27
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
+
31
33
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
43
45
dp2n = np .zeros_like (p2n )
44
- ndim = mem .elem .ndim
45
46
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 )
49
49
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 )
51
52
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 )
54
54
55
55
if debug :
56
- writer .populate (str (label ), "rhs" , div )
56
+ writer .populate (str (label ), "rhs" , mpv . rhs )
57
57
58
+ # Compute compressibility kernel
58
59
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
+ )
68
66
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 )
72
69
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 )
77
72
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
79
78
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 * (
81
82
rhoYovG * dpdy
82
83
+ (g / Msq ) * dbuoy * nonhydro
83
84
- corr_h1 * drhow
84
85
+ corr_h2 * drhou
85
86
) * (1 - ud .is_ArakawaKonor )
86
87
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 )
90
90
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
92
93
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
94
97
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 )
100
101
101
102
102
103
def euler_backward_non_advective_expl_part (mem , ud , dt ):
0 commit comments