Theseus
Compressible flow solver
Loading...
Searching...
No Matches
LaxFriedrichsFlux.hpp
Go to the documentation of this file.
1// Copyright (c) 2025-2026 Board of Trustees of the University of Illinois
2//
3// This file is part of Theseus.
4//
5// SPDX-License-Identifier: BSD-3-Clause
6#pragma once
7
8#include "mfem.hpp"
10#include "theseus_kernels.hpp"
11
12namespace Theseus
13{
14
15 namespace LaxFriedrichsFlux
16 {
17
18 // This is Riemann solver that computes the numerical flux for 2 point states
19 // Will be ctx.iflux.ComputeVolumeFlux
20 template<typename GasT>
21 MFEM_HOST_DEVICE
22 inline static void ComputeVolumeFluxKernel(const GasT &gas,
23 const mfem::real_t* q1,
24 const mfem::real_t* q2,
25 const mfem::real_t* met1,
26 const mfem::real_t* met2,
27 mfem::real_t* F_tilde)
28 {
29 const int dim = gas.dim();
30 const int neq = gas.num_equations();
31
32 // mean metric row
33 mfem::real_t met[3] = {0,0,0};
34 Kernels::ComputeMeanVec(met1, met2, met, dim);
35 mfem::real_t inv_flux_1[Theseus::MAXEQ][Theseus::MAXDIM];
36 mfem::real_t inv_flux_2[Theseus::MAXEQ][Theseus::MAXDIM];
37 mfem::real_t inv_flux_bar[Theseus::MAXEQ];
38
39 NavierStokesFlux::ComputeInviscidFluxKernel(gas, q1, inv_flux_1);
40 NavierStokesFlux::ComputeInviscidFluxKernel(gas, q2, inv_flux_2);
41 for(int ieq=0;ieq < neq;ieq++){
42 inv_flux_bar[ieq] = 0;
43 for(int idim = 0;idim < dim;idim++){
44 inv_flux_bar[ieq] += 0.5*(inv_flux_1[ieq][idim] + inv_flux_2[ieq][idim])*met[idim];
45 }
46 }
47
48 for(int ieq = 0;ieq < neq;ieq++){
49 F_tilde[ieq] = inv_flux_bar[ieq];
50 }
51
52 }
53
54 template<typename GasModelT>
55 MFEM_HOST_DEVICE inline static void
56 ComputeFaceFluxKernel(const GasModelT &gasModel,
57 const mfem::real_t *state1,
58 const mfem::real_t *state2,
59 const mfem::real_t *nor,
60 mfem::real_t *flux)
61 {
62 const int dim = gasModel.dim();
63 const int neq = gasModel.num_equations();
64
65 mfem::real_t inv_flux_1[Theseus::MAXEQ][Theseus::MAXDIM];
66 mfem::real_t inv_flux_2[Theseus::MAXEQ][Theseus::MAXDIM];
67
68 NavierStokesFlux::ComputeInviscidFluxKernel(gasModel, state1, inv_flux_1);
69 NavierStokesFlux::ComputeInviscidFluxKernel(gasModel, state2, inv_flux_2);
70
71 const mfem::real_t lambda_max =
72 NavierStokesFlux::MaximumNormalWaveSpeed(
73 gasModel, state1, state2, nor);
74
75 for (int ieq = 0; ieq < neq; ++ieq)
76 {
77 mfem::real_t fn1 = 0.0;
78 mfem::real_t fn2 = 0.0;
79
80 for (int d = 0; d < dim; ++d)
81 {
82 fn1 += inv_flux_1[ieq][d] * nor[d];
83 fn2 += inv_flux_2[ieq][d] * nor[d];
84 }
85
86 const mfem::real_t central_flux = 0.5 * (fn1 + fn2);
87 const mfem::real_t jump = state2[ieq] - state1[ieq];
88
89 flux[ieq] = central_flux - 0.5 * lambda_max * jump;
90 }
91 }
92
93 struct InviscidFlux {
94 template<typename GasModelT>
95 MFEM_HOST_DEVICE inline void ComputeVolumeFlux(const GasModelT &gasModel,
96 const mfem::real_t *q1, const mfem::real_t *q2,
97 const mfem::real_t *met1, const mfem::real_t *met2,
98 mfem::real_t *F_tilde) const{
99 ComputeVolumeFluxKernel(gasModel, q1, q2, met1, met2, F_tilde);
100 }
101 template<typename GasModelT>
102 MFEM_HOST_DEVICE inline void ComputeFaceFlux(const GasModelT &gasModel,const mfem::real_t *qminus,
103 const mfem::real_t *qplus, const mfem::real_t *nor,
104 mfem::real_t *flux) const {
105 ComputeFaceFluxKernel(gasModel, qminus, qplus, nor, flux);
106 }
107 };
108 };
109}
MFEM_HOST_DEVICE void ComputeMeanVec(const mfem::real_t *a, const mfem::real_t *b, mfem::real_t *out, int n)
Definition theseus_kernels.hpp:101
Definition AxisymmetricGeometry.hpp:15
constexpr const int MAXDIM
Definition theseus_kernels.hpp:14
constexpr const int MAXEQ
Definition theseus_kernels.hpp:13
Definition LaxFriedrichsFlux.hpp:93
MFEM_HOST_DEVICE void ComputeFaceFlux(const GasModelT &gasModel, const mfem::real_t *qminus, const mfem::real_t *qplus, const mfem::real_t *nor, mfem::real_t *flux) const
Definition LaxFriedrichsFlux.hpp:102
MFEM_HOST_DEVICE void ComputeVolumeFlux(const GasModelT &gasModel, const mfem::real_t *q1, const mfem::real_t *q2, const mfem::real_t *met1, const mfem::real_t *met2, mfem::real_t *F_tilde) const
Definition LaxFriedrichsFlux.hpp:95