Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
b212c7e
hypo HLLC works
ChrisZYJ Oct 13, 2025
d18cf7e
HLLC ADC works
ChrisZYJ Nov 13, 2025
bb1c88f
HLLD works
ChrisZYJ Nov 17, 2025
bae9d1b
HLLD ADC works
ChrisZYJ Nov 17, 2025
0004a17
fix critical HLLD index bug
ChrisZYJ Mar 7, 2026
b921abf
complete refactor and backwards compatibility
ChrisZYJ Mar 7, 2026
cb2b1fb
HLLD KdivU; HLL u_interface NC
ChrisZYJ Mar 8, 2026
aaad026
fix non-hypo HLLC bug
ChrisZYJ Mar 10, 2026
8359c71
2D Axisym works
ChrisZYJ Mar 10, 2026
1a3b845
2DA oracle -> main; fix OpenACC
ChrisZYJ Mar 11, 2026
fd8f89e
3D works
ChrisZYJ Mar 11, 2026
f30889d
fix 3D
ChrisZYJ Mar 11, 2026
03d68a5
fix 3D; HLLC+ADC for all
ChrisZYJ Mar 11, 2026
ea63315
fix 2DA HLLD
ChrisZYJ Mar 14, 2026
1d4a08d
in progress: major bug fix; HLL method 2
ChrisZYJ Mar 18, 2026
556a035
in progress: major bug fix
ChrisZYJ Mar 19, 2026
9828375
in progress: major bug fix
ChrisZYJ Mar 20, 2026
9731acf
in progress: major bug fix
ChrisZYJ Mar 20, 2026
9ca2ce8
major bug fix likely done
ChrisZYJ Mar 20, 2026
4107872
format
ChrisZYJ Mar 20, 2026
606970e
tests
ChrisZYJ Mar 20, 2026
6248e68
fix HLLM2 2DA hypo noKdivu; golden HLLM1 hypo; golden HLLM2 nonhypo
ChrisZYJ Mar 21, 2026
db5f9d4
hll_alpha_interface to hll_u_interface
ChrisZYJ Mar 21, 2026
839caac
merge upstream; all conflicts resolved
ChrisZYJ Mar 22, 2026
969bcfa
fix compile; pass old tests
ChrisZYJ Mar 22, 2026
ffd97d7
formatting and checker
ChrisZYJ Mar 22, 2026
e1a199b
new hypo use riemann instead with golden generated using pre-merge; p…
ChrisZYJ Mar 30, 2026
7525593
formatting
ChrisZYJ Mar 30, 2026
838f06a
gpu fix
ChrisZYJ Apr 1, 2026
74fcc3d
fix GPU compile
ChrisZYJ Apr 4, 2026
fc056a7
GPU all tests passed
ChrisZYJ Apr 4, 2026
982599f
format
ChrisZYJ Apr 4, 2026
a27705a
remove wrongly tracked case folder
ChrisZYJ Apr 4, 2026
91235a4
docs and checkers
ChrisZYJ Apr 14, 2026
0ab41c4
clearer flags and comments
ChrisZYJ Apr 16, 2026
a721550
minor bugs and HLLC fallback
ChrisZYJ Apr 16, 2026
cbd11eb
fix AMD
ChrisZYJ Apr 16, 2026
38e9d2d
all tests passed on Frontier
ChrisZYJ Apr 17, 2026
8ecb5ff
merge upstream
ChrisZYJ Apr 17, 2026
5b5cd68
revert unnecessary diff against upstream
ChrisZYJ Apr 17, 2026
4d1cd8a
revert variable_conversion robustness fix; minor clean up
ChrisZYJ Apr 17, 2026
f62c45e
minor changes
ChrisZYJ Apr 17, 2026
362ecaf
relax hypo 2D-Axisym HLLC tol
ChrisZYJ Apr 21, 2026
c32a52b
Merge branch 'master' into hypo_HLLC_new
ChrisZYJ Apr 21, 2026
0d2d33f
fix HLLC ADC parity, precision, docs, examples
ChrisZYJ Apr 21, 2026
31925f5
update examples
ChrisZYJ Apr 26, 2026
1f681f2
MUSCL
ChrisZYJ Apr 28, 2026
5452db0
Merge MUSCL_fix branch + upstream master (4 commits)
ChrisZYJ Apr 28, 2026
063121f
remove clamp
ChrisZYJ May 5, 2026
9306592
Merge master into hypo_hlld (resolve muscl_eps f_is_default)
ChrisZYJ May 6, 2026
886ca57
comments; formatting; made concise
ChrisZYJ May 6, 2026
0f01a60
dev notes
ChrisZYJ May 6, 2026
0ff4dd5
Merge master into hypo_hlld (MTHINC, hypo simplify, tau_Re fix, pertu…
ChrisZYJ May 8, 2026
7f08352
format
ChrisZYJ May 8, 2026
f85530d
lint
ChrisZYJ May 9, 2026
bc69bba
format
ChrisZYJ May 9, 2026
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
19 changes: 16 additions & 3 deletions docs/documentation/case.md
Original file line number Diff line number Diff line change
Expand Up @@ -450,7 +450,8 @@ See @ref equations "Equations" for the mathematical models these parameters cont
| `flux_lim` | Integer | Flux limiter for post-process: [1] minmod; [2] MUSCL; [3] OSPRE; [4] SUPERBEE |
| `ic_eps` | Real | Interface compression threshold (default: 1e-4) |
| `ic_beta` | Real | Interface compression sharpness parameter (default: 1.6) |
| `riemann_solver` | Integer | Riemann solver algorithm: [1] HLL*; [2] HLLC; [3] Exact*; [4] HLLD (only for MHD) |
| `riemann_solver` | Integer | Riemann solver algorithm: [1] HLL*; [2] HLLC; [3] Exact*; [4] HLLD (MHD or hypoelasticity) |
| `hll_u_interface` | Logical | HLL Method 2 (u-interface) for volume fraction advection (default F) |
| `low_Mach` | Integer | Low Mach number correction for HLLC Riemann solver: [0] None; [1] Pressure (\cite Chen22); [2] Velocity (\cite Thornber08) |
| `avg_state` | Integer | Averaged state evaluation method: [1] Roe average*; [2] Arithmetic mean |
| `wave_speeds` | Integer | Wave-speed estimation: [1] Direct (\cite Batten97); [2] Pressure-velocity* (\cite Toro09) |
Expand All @@ -472,6 +473,9 @@ See @ref equations "Equations" for the mathematical models these parameters cont
| `viscous` | Logical | Activate viscosity |
| `hypoelasticity` | Logical | Activate hypoelasticity* |
| `pre_stress` | Logical | Enable pre-stress initialization for hypoelasticity |
| `riemann_hypo_ADC` | Logical | Enable hypo anti-diffusion correction for HLLC/HLLD (default F) |
| `ADC_kappa` | Real | ADC sensor scaling parameter (default 1.0) |
| `hypo_hll_interface_rhs` | Logical | HLL uses interface-consistent hypo RHS (default F) |
| `igr` | Logical | Enable solution via information geometric regularization (IGR) \cite Cao24 |
| `igr_order` | Integer | Order of reconstruction for IGR [3,5] |
| `alf_factor` | Real | Alpha factor for IGR entropic pressure (default 10) |
Expand Down Expand Up @@ -551,7 +555,11 @@ Setting `muscl_eps = 0` gives textbook limiter behavior where limiters activate

- `riemann_solver` specifies the choice of the Riemann solver that is used in simulation by an integer from 1 through 4.
`riemann_solver = 1`, `2`, and `3` correspond to HLL, HLLC, and Exact Riemann solver, respectively (\cite Toro09).
`riemann_solver = 4` is only for MHD simulations. It resolves 5 of the full seven-wave structure of the MHD equations (\cite Miyoshi05).
`riemann_solver = 4` is the HLLD solver for MHD or hypoelasticity simulations. For MHD it resolves 5 of the full seven-wave structure of the MHD equations (\cite Miyoshi05).

- `hll_u_interface`: Selects between two HLL discretizations of volume fraction advection (`riemann_solver = 1`):
- **Default** (``'F'``): \f$\partial_t \alpha_k + u\,\partial_x \alpha_k = 0\f$
- **u-interface** (``'T'``, consistent with HLLC): \f$\partial_t \alpha_k + \partial_x(\alpha_k\, u) = \alpha_k\,\partial_x u\f$

- `low_Mach` specifies the choice of the low Mach number correction scheme for the HLLC Riemann solver. `low_Mach = 0` is default value and does not apply any correction scheme. `low_Mach = 1` and `2` apply the anti-dissipation pressure correction method (\cite Chen22) and the improved velocity reconstruction method (\cite Thornber08). This feature requires `model_eqns = 2` or `3`. `low_Mach = 1` works for `riemann_solver = 1` and `2`, but `low_Mach = 2` only works for `riemann_solver = 2`.

Expand All @@ -571,7 +579,12 @@ This option requires `weno_Re_flux` to be true because cell boundary values are

- `viscous` activates viscosity when set to ``'T'``. Requires `Re(1)` and `Re(2)` to be set.

- `hypoelasticity` activates elastic stress calculations for fluid-solid interactions. Requires `G` to be set in the fluid material's parameters.
- `hypoelasticity` activates elastic stress calculations for fluid-solid interactions. Requires `G` to be set in `fluid_pp`. Compatible with HLL (`riemann_solver = 1`), HLLC (`riemann_solver = 2`), and HLLD (`riemann_solver = 4`). The Riemann solver choice determines how the elastic stress source term \f$\mathbf{S}^e\f$ is discretized:
- **HLL**: finite-difference velocity gradient (default), or interface-consistent velocity gradient when ``hypo_hll_interface_rhs = 'T'`` (matches HLLC).
- **HLLC**: interface-consistent velocity gradient from the Riemann solution.
- **HLLD**: dual-pass approach resolving the elastic wave structure. Requires 2D+ and exactly 2 fluid components.

- `riemann_hypo_ADC`: Enables anti-diffusion correction (ADC) for hypoelastic HLLC or HLLD. Blends HLLC/HLLD fluxes toward HLL based on a local sensor, improving robustness and reducing interfacial overshoots in strong supersonic hypoelastic problems. `ADC_kappa` (default 1.0) scales the ADC sensor; larger values blend more toward HLL (more diffusive and robust).

#### Boundary Condition Patches {#boundary-condition-patches}

Expand Down
21 changes: 19 additions & 2 deletions docs/documentation/equations.md
Original file line number Diff line number Diff line change
Expand Up @@ -875,16 +875,33 @@ Four-state solver resolving the contact discontinuity. Star-state satisfies:

Iterative exact Riemann solver.

#### HLLD (`riemann_solver = 4`, MHD only)
#### HLLD (`riemann_solver = 4`, MHD or hypoelasticity)

Seven-state solver for ideal MHD resolving fast magnetosonic, Alfven, and contact waves (\cite Miyoshi05). The Riemann fan is divided by outer wave speeds \f$S_L\f$, \f$S_R\f$, Alfven speeds \f$S_L^*\f$, \f$S_R^*\f$, and a middle contact \f$S_M\f$:
**MHD HLLD.** Seven-state solver for ideal MHD resolving fast magnetosonic, Alfven, and contact waves (\cite Miyoshi05). The Riemann fan is divided by outer wave speeds \f$S_L\f$, \f$S_R\f$, Alfven speeds \f$S_L^*\f$, \f$S_R^*\f$, and a middle contact \f$S_M\f$:

\f[S_M = \frac{(S_R - u_R)\rho_R u_R - (S_L - u_L)\rho_L u_L - p_{T,R} + p_{T,L}}{(S_R - u_R)\rho_R - (S_L - u_L)\rho_L}\f]

\f[S_L^* = S_M - \frac{|B_x|}{\sqrt{\rho_L^*}}, \qquad S_R^* = S_M + \frac{|B_x|}{\sqrt{\rho_R^*}}\f]

where \f$p_T = p + |\mathbf{B}|^2/2\f$ is the total (thermal + magnetic) pressure. Continuity of normal velocity and total pressure is enforced across the Riemann fan.

**Hypoelastic HLLD.** Shares the five-wave Riemann fan structure with MHD HLLD, but differs substantially in formulation. Elastic shear waves play the role of Alfven waves, with total pressure \f$p_T = p - \tau_{nn}\f$ and shear wave impedance \f$C = \hat{\rho}(\hat{G} + \hat{\tau}_{nn})\f$. However, the non-conservative nature of the multi-component elastic stress equations — particularly at material interfaces where \f$G\f$ is discontinuous — requires a dedicated treatment distinct from the MHD solver.

The solver uses an **anchored dual-pass** formulation. Each Riemann solve at interface \f$j{+}1/2\f$ requires cell-centered quantities for the non-conservative products; these are taken as cell-centered values from the cell that the flux will update, rather than from the reconstructed interface states:

\f[\mathbf{F}_{j+1/2}^{\text{left}} = \text{HLLD}\!\left(\mathbf{q}_{j+1/2}^L,\;\mathbf{q}_{j+1/2}^R;\;\mathbf{q}_{\text{cell},\,j}\right), \qquad \mathbf{F}_{j-1/2}^{\text{right}} = \text{HLLD}\!\left(\mathbf{q}_{j-1/2}^L,\;\mathbf{q}_{j-1/2}^R;\;\mathbf{q}_{\text{cell},\,j}\right)\f]

\f[\frac{d\mathbf{U}_j}{dt} = \frac{1}{\Delta x}\!\left(\mathbf{F}_{j-1/2}^{\text{right}} - \mathbf{F}_{j+1/2}^{\text{left}}\right)\f]

This formulation enables HLLD to be used with the non-conservative terms that affect the eigenstructure of the quasi-linear Jacobian. Volume fraction advection is built into the HLLD flux rather than treated as a separate non-conservative step.

#### Developer Notes on Non-Conservative Term Implementation

For details on how the Riemann solvers discretize non-conservative terms (volume fraction advection, Kapila \f$K\,\nabla\!\cdot\!\mathbf{u}\f$, and hypoelastic velocity gradients) and hand off interface quantities to the RHS, see the notes in `misc/dev_notes/`:

- `HLL_HLLC_non_conservative_terms_derivations.md` — Mathematical derivation of HLL Method 1 (alpha-interface), Method 2 (u-interface), and HLLC transport traces, including the \f$S_M\zeta_K\f$ star-branch construction and ADC blending.
- `Riemann_and_RHS_source_terms_explanations.md` — Code dataflow: which arrays carry what between m_riemann_solvers and m_rhs, overloading of flux_src, the three NC advection modes (adv_src_alpha_iface, adv_src_vel_iface, adv_src_none), and the nc_iface_vel second export channel.

### 15.3 Time Integration

**Source:** `src/simulation/m_time_steppers.fpp`
Expand Down
110 changes: 110 additions & 0 deletions examples/2D_axisym_hypo_hlld/case.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
#!/usr/bin/env python3
import json

# 2D axisymmetric hypoelastic case with HLLD solver.
# Epoxy sphere in water hit by focused acoustic pulse.
# Water: gamma=4.4, pi_inf=6.0e8, G=0
# Epoxy: gamma=4.4, pi_inf=2.4e9, rho=1180, G=1.5e9

gamma_w, pi_inf_w, rho_w = 4.4, 6.0e8, 1000.0
gamma_e, pi_inf_e, rho_e = 4.4, 2.4e9, 1180.0

config = {
"run_time_info": "T",
# Computational Domain
"x_domain%beg": 0.0,
"x_domain%end": 1.0,
"y_domain%beg": 0.0,
"y_domain%end": 1.0,
"cyl_coord": "T",
"m": 99,
"n": 99,
"p": 0,
"dt": 1.5e-6,
"t_step_start": 0,
"t_step_stop": 400,
"t_step_save": 100,
# Simulation Algorithm
"num_patches": 2,
"model_eqns": 2,
"alt_soundspeed": "F",
"num_fluids": 2,
"mpp_lim": "F",
"mixture_err": "F",
"time_stepper": 3,
"weno_order": 5,
"weno_eps": 1.0e-16,
"mapped_weno": "T",
"null_weights": "F",
"mp_weno": "F",
"riemann_solver": 4,
"wave_speeds": 1,
"avg_state": 2,
"bc_x%beg": -6,
"bc_x%end": -6,
"bc_y%beg": -2,
"bc_y%end": -6,
# Output
"format": 1,
"precision": 2,
"prim_vars_wrt": "T",
"rho_wrt": "T",
"parallel_io": "T",
# Hypoelasticity
"hypoelasticity": "T",
"fd_order": 4,
# Patch 1: Water background
"patch_icpp(1)%geometry": 3,
"patch_icpp(1)%x_centroid": 0.5,
"patch_icpp(1)%y_centroid": 0.5,
"patch_icpp(1)%length_x": 1.0,
"patch_icpp(1)%length_y": 1.0,
"patch_icpp(1)%vel(1)": 0.0,
"patch_icpp(1)%vel(2)": 0.0,
"patch_icpp(1)%pres": 1e05,
"patch_icpp(1)%tau_e(1)": 0.0,
"patch_icpp(1)%alpha_rho(1)": rho_w * (1.0 - 1e-8),
"patch_icpp(1)%alpha(1)": 1.0 - 1e-8,
"patch_icpp(1)%alpha_rho(2)": rho_e * 1e-8,
"patch_icpp(1)%alpha(2)": 1e-8,
# Patch 2: Epoxy square (cylinder in axisym)
"patch_icpp(2)%alter_patch(1)": "T",
"patch_icpp(2)%geometry": 3,
"patch_icpp(2)%x_centroid": 0.6,
"patch_icpp(2)%y_centroid": 0.2,
"patch_icpp(2)%length_x": 0.2,
"patch_icpp(2)%length_y": 0.2,
"patch_icpp(2)%smoothen": "T",
"patch_icpp(2)%smooth_patch_id": 1,
"patch_icpp(2)%smooth_coeff": 2.0,
"patch_icpp(2)%vel(1)": 0.0,
"patch_icpp(2)%vel(2)": 0.0,
"patch_icpp(2)%pres": 1e05,
"patch_icpp(2)%tau_e(1)": 0.0,
"patch_icpp(2)%alpha_rho(1)": rho_w * 1e-8,
"patch_icpp(2)%alpha(1)": 1e-8,
"patch_icpp(2)%alpha_rho(2)": rho_e * (1.0 - 1e-8),
"patch_icpp(2)%alpha(2)": 1.0 - 1e-8,
# Acoustic source (axisymmetric focused)
"acoustic_source": "T",
"num_source": 1,
"acoustic(1)%support": 6,
"acoustic(1)%loc(1)": 0.1,
"acoustic(1)%loc(2)": 0.0,
"acoustic(1)%pulse": 2,
"acoustic(1)%npulse": 1,
"acoustic(1)%mag": 1.0,
"acoustic(1)%foc_length": 0.8,
"acoustic(1)%aperture": 0.8,
"acoustic(1)%gauss_sigma_time": 4e-5,
"acoustic(1)%delay": 2e-4,
# Fluids Physical Parameters
"fluid_pp(1)%gamma": 1.0 / (gamma_w - 1.0),
"fluid_pp(1)%pi_inf": gamma_w * pi_inf_w / (gamma_w - 1.0),
"fluid_pp(1)%G": 0.0,
"fluid_pp(2)%gamma": 1.0 / (gamma_e - 1.0),
"fluid_pp(2)%pi_inf": gamma_e * pi_inf_e / (gamma_e - 1.0),
"fluid_pp(2)%G": 1.5e9,
}

print(json.dumps(config, indent=4))
110 changes: 110 additions & 0 deletions examples/2D_hypo_hlld/case.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
#!/usr/bin/env python3
import json

# 2D hypoelastic case with HLLD solver.
# Epoxy circle in water hit by focused acoustic pulse.
# Water: gamma=4.4, pi_inf=6.0e8, G=0
# Epoxy: gamma=4.4, pi_inf=2.4e9, rho=1180, G=1.5e9

gamma_w, pi_inf_w, rho_w = 4.4, 6.0e8, 1000.0
gamma_e, pi_inf_e, rho_e = 4.4, 2.4e9, 1180.0

config = {
"run_time_info": "T",
# Computational Domain
"x_domain%beg": 0.0,
"x_domain%end": 1.0,
"y_domain%beg": 0.0,
"y_domain%end": 1.0,
"m": 99,
"n": 99,
"p": 0,
"dt": 1.5e-6,
"t_step_start": 0,
"t_step_stop": 400,
"t_step_save": 100,
# Simulation Algorithm
"num_patches": 2,
"model_eqns": 2,
"alt_soundspeed": "F",
"num_fluids": 2,
"mpp_lim": "F",
"mixture_err": "F",
"time_stepper": 3,
"weno_order": 5,
"weno_eps": 1.0e-16,
"mapped_weno": "T",
"null_weights": "F",
"mp_weno": "F",
"riemann_solver": 4,
"wave_speeds": 1,
"avg_state": 2,
"bc_x%beg": -6,
"bc_x%end": -6,
"bc_y%beg": -6,
"bc_y%end": -6,
# Output
"format": 1,
"precision": 2,
"prim_vars_wrt": "T",
"rho_wrt": "T",
"parallel_io": "T",
# Hypoelasticity
"hypoelasticity": "T",
"fd_order": 4,
# Patch 1: Water background
"patch_icpp(1)%geometry": 3,
"patch_icpp(1)%x_centroid": 0.5,
"patch_icpp(1)%y_centroid": 0.5,
"patch_icpp(1)%length_x": 1.0,
"patch_icpp(1)%length_y": 1.0,
"patch_icpp(1)%vel(1)": 0.0,
"patch_icpp(1)%vel(2)": 0.0,
"patch_icpp(1)%pres": 1e05,
"patch_icpp(1)%tau_e(1)": 0.0,
"patch_icpp(1)%alpha_rho(1)": rho_w * (1.0 - 1e-8),
"patch_icpp(1)%alpha(1)": 1.0 - 1e-8,
"patch_icpp(1)%alpha_rho(2)": rho_e * 1e-8,
"patch_icpp(1)%alpha(2)": 1e-8,
# Patch 2: Epoxy square
"patch_icpp(2)%alter_patch(1)": "T",
"patch_icpp(2)%geometry": 3,
"patch_icpp(2)%x_centroid": 0.6,
"patch_icpp(2)%y_centroid": 0.5,
"patch_icpp(2)%length_x": 0.2,
"patch_icpp(2)%length_y": 0.2,
"patch_icpp(2)%smoothen": "T",
"patch_icpp(2)%smooth_patch_id": 1,
"patch_icpp(2)%smooth_coeff": 2.0,
"patch_icpp(2)%vel(1)": 0.0,
"patch_icpp(2)%vel(2)": 0.0,
"patch_icpp(2)%pres": 1e05,
"patch_icpp(2)%tau_e(1)": 0.0,
"patch_icpp(2)%alpha_rho(1)": rho_w * 1e-8,
"patch_icpp(2)%alpha(1)": 1e-8,
"patch_icpp(2)%alpha_rho(2)": rho_e * (1.0 - 1e-8),
"patch_icpp(2)%alpha(2)": 1.0 - 1e-8,
# Acoustic source (2D focused arc)
"acoustic_source": "T",
"num_source": 1,
"acoustic(1)%support": 5,
"acoustic(1)%loc(1)": 0.1,
"acoustic(1)%loc(2)": 0.5,
"acoustic(1)%pulse": 2,
"acoustic(1)%npulse": 1,
"acoustic(1)%dir": 1.0,
"acoustic(1)%mag": 1.0,
"acoustic(1)%foc_length": 0.4,
"acoustic(1)%aperture": 0.75,
"acoustic(1)%gauss_sigma_time": 4e-5,
"acoustic(1)%delay": 2e-4,
# Fluids Physical Parameters
"fluid_pp(1)%gamma": 1.0 / (gamma_w - 1.0),
"fluid_pp(1)%pi_inf": gamma_w * pi_inf_w / (gamma_w - 1.0),
"fluid_pp(1)%G": 0.0,
"fluid_pp(2)%gamma": 1.0 / (gamma_e - 1.0),
"fluid_pp(2)%pi_inf": gamma_e * pi_inf_e / (gamma_e - 1.0),
"fluid_pp(2)%G": 1.5e9,
}

print(json.dumps(config, indent=4))
Loading
Loading