@@ -82,7 +82,7 @@ def __init__(self, nx, C, *,
8282 gamma = 1.4 ,
8383 init_cond = None , grav_func = None ,
8484 params = None ,
85- use_hse_reconstruction = False ,
85+ use_hse_reconstruction = False , hse_as_perturbation = False ,
8686 use_limiting = True , use_flattening = True ):
8787
8888 self .grid = FVGrid (nx , ng = 4 )
@@ -138,6 +138,8 @@ def __init__(self, nx, C, *,
138138 self .U_init = self .U .copy ()
139139
140140 self .use_hse_reconstruction = use_hse_reconstruction
141+ self .hse_as_perturbation = hse_as_perturbation
142+
141143 self .use_flattening = use_flattening
142144 self .use_limiting = use_limiting
143145
@@ -198,7 +200,7 @@ def construct_parabola(self):
198200 for ivar in range (self .v .nvar ):
199201 if ivar == self .v .qp and self .use_hse_reconstruction :
200202 self .q_parabola .append (HSEPPMInterpolant (self .grid , q [:, ivar ], q [:, self .v .qrho ], g ,
201- limit = self .use_limiting , chi_flat = chi ))
203+ limit = self .use_limiting , chi_flat = chi , leave_as_perturbation = self . hse_as_perturbation ))
202204 else :
203205 self .q_parabola .append (PPMInterpolant (self .grid , q [:, ivar ],
204206 limit = self .use_limiting , chi_flat = chi ))
@@ -272,13 +274,23 @@ def interface_states(self):
272274 q_ref_m = Im [i , 0 , :]
273275
274276 # build eigensystem
275- ev , lvec , rvec = eigen (q_ref_m [self .v .qrho ], q_ref_m [self .v .qu ], q_ref_m [self .v .qp ], self .gamma )
277+ if self .use_hse_reconstruction and self .hse_as_perturbation :
278+ # we need to make the reference state a pressure again
279+ ev , lvec , rvec = eigen (q_ref_m [self .v .qrho ],
280+ q_ref_m [self .v .qu ],
281+ self .q_parabola [self .v .qp ].p_hse_m [i ] + q_ref_m [self .v .qp ],
282+ self .gamma )
283+ else :
284+ ev , lvec , rvec = eigen (q_ref_m [self .v .qrho ],
285+ q_ref_m [self .v .qu ],
286+ q_ref_m [self .v .qp ],
287+ self .gamma )
276288
277289 # loop over waves and compute l . (qref - I) for each wave
278290 beta_xm = np .zeros (3 )
279291 for iwave in range (3 ):
280292 dq = q_ref_m - Im [i , iwave , :]
281- if self .grav_func is not None :
293+ if self .grav_func is not None and not self . hse_as_perturbation :
282294 dq [self .v .qu ] -= 0.5 * self .dt * Im_g [i , iwave ]
283295 beta_xm [iwave ] = lvec [iwave , :] @ dq
284296
@@ -289,19 +301,31 @@ def interface_states(self):
289301 if ev [iwave ] <= 0 :
290302 q_right [i , :] -= beta_xm [iwave ] * rvec [iwave , :]
291303
304+ if self .use_hse_reconstruction and self .hse_as_perturbation :
305+ q_right [i , self .v .qp ] += self .q_parabola [self .v .qp ].p_hse_m [i ]
306+
292307 # left state on interface i+1 -- this uses the "p" reconstructuion
293308
294309 # reference state -- fastest wave moving to the right
295310 q_ref_p = Ip [i , 2 , :]
296311
297312 # build eigensystem
298- ev , lvec , rvec = eigen (q_ref_p [self .v .qrho ], q_ref_p [self .v .qu ], q_ref_p [self .v .qp ], self .gamma )
313+ if self .use_hse_reconstruction and self .hse_as_perturbation :
314+ ev , lvec , rvec = eigen (q_ref_p [self .v .qrho ],
315+ q_ref_p [self .v .qu ],
316+ self .q_parabola [self .v .qp ].p_hse_p [i ] + q_ref_p [self .v .qp ],
317+ self .gamma )
318+ else :
319+ ev , lvec , rvec = eigen (q_ref_p [self .v .qrho ],
320+ q_ref_p [self .v .qu ],
321+ q_ref_p [self .v .qp ],
322+ self .gamma )
299323
300324 # loop over waves and compute l . (qref - I) for each wave
301325 beta_xp = np .zeros (3 )
302326 for iwave in range (3 ):
303327 dq = q_ref_p - Ip [i , iwave , :]
304- if self .grav_func is not None :
328+ if self .grav_func is not None and not self . hse_as_perturbation :
305329 dq [self .v .qu ] -= 0.5 * self .dt * Ip_g [i , iwave ]
306330 beta_xp [iwave ] = lvec [iwave , :] @ dq
307331
@@ -312,6 +336,9 @@ def interface_states(self):
312336 if ev [iwave ] >= 0 :
313337 q_left [i + 1 , :] -= beta_xp [iwave ] * rvec [iwave , :]
314338
339+ if self .use_hse_reconstruction and self .hse_as_perturbation :
340+ q_left [i + 1 , self .v .qp ] += self .q_parabola [self .v .qp ].p_hse_p [i ]
341+
315342 # enforce reflection
316343 for n in range (self .v .nvar ):
317344 if self .bcs_left [n ] == "reflect" :
0 commit comments