Peano
Loading...
Searching...
No Matches
exahype2::fd Namespace Reference

Namespaces

namespace  internal
 

Typedefs

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.
 

Functions

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)
 

Variables

constexpr int PickAllEntriesFromOutputVector = -1
 

Typedef Documentation

◆ Flux

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 ) > exahype2::fd::Flux

Definition at line 30 of file Functors.h.

◆ MaxEigenvalue

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 ) > exahype2::fd::MaxEigenvalue

The max eigenvalue is used if and only if you have adaptive time stepping.

Definition at line 54 of file Functors.h.

◆ NonconservativeProduct

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 ) > exahype2::fd::NonconservativeProduct

Definition at line 41 of file Functors.h.

◆ Source

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 ) > exahype2::fd::Source

Definition at line 20 of file Functors.h.

Function Documentation

◆ addLopsidedAdvection()

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
QWithHaloInput of the Runge-Kutta stage with its halo, i.e. (numberOfGridCellsPerPatchPerAxis+2*haloSize)^d grid cells with unknowns+auxiliaryVariables entries each.
rightHandSideRight-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.
patchSizeSize of the patch, i.e. of the mesh cell.
velocityIndices of the Dimensions entries of Q which hold the velocity components. They may also refer to auxiliary variables.
quantitiesIndices of the unknowns which are advected. Each index has to be smaller than unknowns.
numberOfQuantitiesNumber of entries of quantities.

◆ getGridCellCentre() [1/2]

static tarch::la::Vector< 2, double > exahype2::fd::getGridCellCentre ( const tarch::la::Vector< 2, double > &  x,
const tarch::la::Vector< 2, double > &  h,
int  numberOfGridCellsPerPatchPerAxis,
const tarch::la::Vector< 2, int > &  index 
)
static

In ExaHyPE's Finite Volume setup, a cell hosts a patch of Finite Volumes.

When we iterate over these volumes, we typically have to know the centre of the volume.

I use this routine in a lot of the loops that have to be vectorised. Therefore, it is absolutely essential that the compiler can inline them. Inlining works properly with most compilers if and only if the definition is available in the header. This is the reason why this implementation ended up here and not in the cpp file.

Parameters
xCentre of the cell
hSize of the cell
indexIndex of Finite Volume (in lexicographic ordering)

Definition at line 77 of file PatchUtils.h.

◆ getGridCellCentre() [2/2]

static tarch::la::Vector< 3, double > exahype2::fd::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

Definition at line 89 of file PatchUtils.h.

◆ getGridCellSize() [1/2]

static tarch::la::Vector< 2, double > exahype2::fd::getGridCellSize ( const tarch::la::Vector< 2, double > &  h,
int  numberOfGridCellsPerPatchPerAxis 
)
static
See also
exahype2::fv::getVolumeSize()

Definition at line 22 of file PatchUtils.h.

◆ getGridCellSize() [2/2]

static tarch::la::Vector< 3, double > exahype2::fd::getGridCellSize ( const tarch::la::Vector< 3, double > &  h,
int  numberOfGridCellsPerPatchPerAxis 
)
static

Definition at line 32 of file PatchUtils.h.

◆ getGridFaceCentre() [1/2]

static tarch::la::Vector< 2, double > exahype2::fd::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

Definition at line 101 of file PatchUtils.h.

◆ getGridFaceCentre() [2/2]

static tarch::la::Vector< 3, double > exahype2::fd::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 
)
static

Definition at line 115 of file PatchUtils.h.

◆ getGridFaceSize() [1/2]

static tarch::la::Vector< 2, double > exahype2::fd::getGridFaceSize ( const tarch::la::Vector< 2, double > &  h,
int  numberOfGridCellsPerPatchPerAxis 
)
static

Definition at line 42 of file PatchUtils.h.

◆ getGridFaceSize() [2/2]

static tarch::la::Vector< 3, double > exahype2::fd::getGridFaceSize ( const tarch::la::Vector< 3, double > &  h,
int  numberOfGridCellsPerPatchPerAxis 
)
static

Definition at line 52 of file PatchUtils.h.

◆ plotGridCell()

std::string exahype2::fd::plotGridCell ( const double *__restrict__  Q,
int  unknowns 
)

Helper routine that I need in the log statements.

Applies to AoS data only.

Returns
Data of one volume as tuple.

◆ plotPatch()

std::string exahype2::fd::plotPatch ( const double *__restrict__  Q,
int  unknowns,
int  auxiliaryVariables,
int  numberOfGridCellsPerPatchPerAxis,
int  haloSize,
bool  prettyPrint = false 
)

Plot patch.

Usually used for debugging.

Assumes all data are held as AoS.

◆ plotPatchOverlap()

std::string exahype2::fd::plotPatchOverlap ( const double *__restrict__  Q,
int  unknowns,
int  auxiliaryVariables,
int  numberOfGridCellsPerPatchPerAxis,
int  haloSize,
int  normal,
bool  prettyPrint = false 
)

◆ reduceMaxEigenvalue_patchwise_functors()

void exahype2::fd::reduceMaxEigenvalue_patchwise_functors ( ::exahype2::CellData< double, double > &  patchData,
int  numberOfGridCellsPerPatchPerAxis,
int  overlap,
int  unknowns,
int  auxiliaryVariables,
MaxEigenvalue  maxEigenvalue 
)

◆ validatePatch()

void exahype2::fd::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.

In ExaHyPE, we primarily work with split approaches. That is, diagonal halo entries are never initialised properly: We can copy over the face-connected data, but we lack information through the diagonals. This routine takes this into account when it validates the entries.

Assumes all data are held as AoS.

Parameters
locationString that tells system from where this routine got called
minValuesIs either a nullptr or it points to a double array with exactly unknowns+auxiliaryVariables entries

Variable Documentation

◆ PickAllEntriesFromOutputVector

constexpr int exahype2::fd::PickAllEntriesFromOutputVector = -1
constexpr

Definition at line 17 of file LoopBody.h.