|
| typedef std::function< void(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &gridCellX, const tarch::la::Vector< Dimensions, double > &gridCellH, double t, double dt, double *__restrict__ AlgeSrc) > | Source |
| |
| typedef std::function< void(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &faceCentre, const tarch::la::Vector< Dimensions, double > &gridCellH, double t, double dt, int normal, double *__restrict__ F) > | Flux |
| |
| typedef std::function< void(const double *__restrict__ Q, const double *__restrict__ deltaQ, const tarch::la::Vector< Dimensions, double > &gridCellX, const tarch::la::Vector< Dimensions, double > &gridCellH, double t, double dt, int normal, double *__restrict__ DiffSrc) > | NonconservativeProduct |
| |
| typedef std::function< void(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &gridCellX, const tarch::la::Vector< Dimensions, double > &gridCellH, double t, double dt, int normal, double *__restrict__ maxEigen) > | MaxEigenvalue |
| | The max eigenvalue is used if and only if you have adaptive time stepping.
|
| |
|
| void | reduceMaxEigenvalue_patchwise_functors (::exahype2::CellData< double, double > &patchData, int numberOfGridCellsPerPatchPerAxis, int overlap, int unknowns, int auxiliaryVariables, MaxEigenvalue maxEigenvalue) |
| |
| void | addLopsidedAdvection (const double *__restrict__ QWithHalo, double *__restrict__ rightHandSide, const tarch::la::Vector< Dimensions, double > &patchSize, int numberOfGridCellsPerPatchPerAxis, int haloSize, int unknowns, int auxiliaryVariables, const int *velocity, const int *quantities, int numberOfQuantities) |
| | Add advection terms discretised through lopsided stencils to the right-hand side of a patch.
|
| |
| static tarch::la::Vector< 2, double > | getGridCellSize (const tarch::la::Vector< 2, double > &h, int numberOfGridCellsPerPatchPerAxis) |
| |
| static tarch::la::Vector< 3, double > | getGridCellSize (const tarch::la::Vector< 3, double > &h, int numberOfGridCellsPerPatchPerAxis) |
| |
| static tarch::la::Vector< 2, double > | getGridFaceSize (const tarch::la::Vector< 2, double > &h, int numberOfGridCellsPerPatchPerAxis) |
| |
| static tarch::la::Vector< 3, double > | getGridFaceSize (const tarch::la::Vector< 3, double > &h, int numberOfGridCellsPerPatchPerAxis) |
| |
| static tarch::la::Vector< 2, double > | getGridCellCentre (const tarch::la::Vector< 2, double > &x, const tarch::la::Vector< 2, double > &h, int numberOfGridCellsPerPatchPerAxis, const tarch::la::Vector< 2, int > &index) |
| | In ExaHyPE's Finite Volume setup, a cell hosts a patch of Finite Volumes.
|
| |
| static tarch::la::Vector< 3, double > | getGridCellCentre (const tarch::la::Vector< 3, double > &x, const tarch::la::Vector< 3, double > &h, int numberOfGridCellsPerPatchPerAxis, const tarch::la::Vector< 3, int > &index) |
| |
| static tarch::la::Vector< 2, double > | getGridFaceCentre (const tarch::la::Vector< 2, double > &x, const tarch::la::Vector< 2, double > &h, int numberOfGridCellsPerPatchPerAxis, int overlap, int normal, const tarch::la::Vector< 2, int > &index) |
| |
| static tarch::la::Vector< 3, double > | getGridFaceCentre (const tarch::la::Vector< 3, double > &x, const tarch::la::Vector< 3, double > &h, int numberOfGridCellsPerPatchPerAxis, int overlap, int normal, const tarch::la::Vector< 3, int > &index) |
| |
| std::string | plotGridCell (const double *__restrict__ Q, int unknowns) |
| | Helper routine that I need in the log statements.
|
| |
| void | validatePatch (const double *__restrict__ Q, int unknowns, int auxiliaryVariables, int numberOfGridCellsPerPatchPerAxis, int haloSize, const std::string &location="", bool triggerNonCriticalAssertion=true, double *minValues=nullptr, double *maxValues=nullptr) |
| | Just runs over the patch and ensures that no entry is non or infinite.
|
| |
| std::string | plotPatch (const double *__restrict__ Q, int unknowns, int auxiliaryVariables, int numberOfGridCellsPerPatchPerAxis, int haloSize, bool prettyPrint=false) |
| | Plot patch.
|
| |
| std::string | plotPatchOverlap (const double *__restrict__ Q, int unknowns, int auxiliaryVariables, int numberOfGridCellsPerPatchPerAxis, int haloSize, int normal, bool prettyPrint=false) |
| |
| void exahype2::fd::addLopsidedAdvection |
( |
const double *__restrict__ |
QWithHalo, |
|
|
double *__restrict__ |
rightHandSide, |
|
|
const tarch::la::Vector< Dimensions, double > & |
patchSize, |
|
|
int |
numberOfGridCellsPerPatchPerAxis, |
|
|
int |
haloSize, |
|
|
int |
unknowns, |
|
|
int |
auxiliaryVariables, |
|
|
const int * |
velocity, |
|
|
const int * |
quantities, |
|
|
int |
numberOfQuantities |
|
) |
| |
Add advection terms discretised through lopsided stencils to the right-hand side of a patch.
Many PDEs carry advection terms
\( \partial _t Q_q = \ldots + \sum _d v_d \partial _d Q_q \)
with a velocity v which is part of the solution itself, such as the shift in the Einstein equations. Central differences treat these terms like any other derivative. Numerical relativity codes discretise them with lopsided (upwind-biased) fourth-order stencils instead,
\( \partial _d Q_i \approx \frac{-3 Q_{i-1} - 10 Q_i + 18 Q_{i+1} - 6 Q_{i+2} + Q_{i+3}}{12 \Delta x_d} \)
for \( v_d > 0 \), and the mirrored stencil for \( v_d \leq 0 \). For a positive velocity, the solution travels towards smaller coordinates, i.e. its information comes from the right, and the stencil reaches further into this direction. The stencils are fourth-order accurate.
The routine adds \( v_d \partial _d Q_q \) for each axis d and each selected quantity q to the right-hand side of each grid cell of a patch. The PDE terms of the solver must hence not contain these advection terms themselves. The velocity is taken from the grid cell itself.
exahype2.api.rkfd4.CentralDifferencesWithRungeKutta invokes this routine after its right-hand side kernel within each Runge-Kutta stage, if the user selects the kernel CentralDifferencesWithLopsidedAdvection.
Both arrays are stored lexicographically in AoS format, i.e. all entries of one grid cell are stored together, and the first axis runs fastest. The stencils reach three grid cells into the halo, i.e. haloSize has to be at least three.
- Parameters
-
| QWithHalo | Input of the Runge-Kutta stage with its halo, i.e. (numberOfGridCellsPerPatchPerAxis+2*haloSize)^d grid cells with unknowns+auxiliaryVariables entries each. |
| rightHandSide | Right-hand side of the stage without halo, i.e. numberOfGridCellsPerPatchPerAxis^d grid cells with unknowns entries each. The routine adds the advection terms to it. |
| patchSize | Size of the patch, i.e. of the mesh cell. |
| velocity | Indices of the Dimensions entries of Q which hold the velocity components. They may also refer to auxiliary variables. |
| quantities | Indices of the unknowns which are advected. Each index has to be smaller than unknowns. |
| numberOfQuantities | Number of entries of quantities. |