Peano
|
Namespaces | |
namespace | fd4 |
namespace | internal |
namespace | tests |
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< double(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &gridCellX, const tarch::la::Vector< Dimensions, double > &gridCellH, double t, double dt, int normal) | MaxEigenvalue) |
The max eigenvalue is used if and only if you have adaptive time stepping. | |
Functions | |
void | applyBoundaryConditions (std::function< void(const double *__restrict__ Qinside, double *__restrict__ Qoutside, const tarch::la::Vector< Dimensions, double > &faceCentre, const tarch::la::Vector< Dimensions, double > &volumeH, double t, double dt, int normal) > boundaryCondition, const tarch::la::Vector< Dimensions, double > &faceCentre, const tarch::la::Vector< Dimensions, double > &patchSize, double t, double dt, int numberOfGridCellsPerPatchPerAxis, int overlap, int unknownsPlusAuxiliaryVariables, int faceNumber, double *__restrict__ Q) |
Apply (generic) boundary conditions. | |
void | applySommerfeldConditions (std::function< double(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &faceCentre, const tarch::la::Vector< Dimensions, double > &gridCellH, double t, double dt, int normal) > maxEigenvalue, std::function< void(double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &faceCentre, const tarch::la::Vector< Dimensions, double > &gridCellH) > farFieldSolution, const tarch::la::Vector< Dimensions, double > &faceCentre, const tarch::la::Vector< Dimensions, double > &patchSize, double t, double dt, int numberOfGridCellsPerPatchPerAxis, int overlap, int numberOfUnknowns, int numberOfAuxiliaryVariables, int faceNumber, const tarch::la::Vector< Dimensions, double > &systemOrigin, double *__restrict__ Qold, double *__restrict__ Qnew) |
void | applySommerfeldConditions (std::function< double(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &faceCentre, const tarch::la::Vector< Dimensions, double > &gridCellH, double t, double dt, int normal) > maxEigenvalue, const tarch::la::Vector< Dimensions, double > &faceCentre, const tarch::la::Vector< Dimensions, double > &patchSize, double t, double dt, int numberOfGridCellsPerPatchPerAxis, int overlap, int numberOfUnknowns, int numberOfAuxiliaryVariables, int faceNumber, const tarch::la::Vector< Dimensions, double > &systemOrigin, double *__restrict__ Qold, double *__restrict__ Qnew) |
Wrapper around the other applySommerfeldConditions() function. | |
void | reduceMaxEigenvalue_patchwise_functors (::exahype2::CellData< double, double > &patchData, int numberOfGridCellsPerPatchPerAxis, int overlap, int unknowns, int auxiliaryVariables, MaxEigenvalue maxEigenvalue) |
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 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.
typedef std::function< double( const double * __restrict__ Q, const tarch::la::Vector<Dimensions,double>& gridCellX, const tarch::la::Vector<Dimensions,double>& gridCellH, double t, double dt, int normal ) exahype2::fd::MaxEigenvalue) |
The max eigenvalue is used if and only if you have adaptive time stepping.
Definition at line 53 of file Functors.h.
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.
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.
void exahype2::fd::applyBoundaryConditions | ( | std::function< void(const double *__restrict__ Qinside, double *__restrict__ Qoutside, const tarch::la::Vector< Dimensions, double > &faceCentre, const tarch::la::Vector< Dimensions, double > &volumeH, double t, double dt, int normal) > | boundaryCondition, |
const tarch::la::Vector< Dimensions, double > & | faceCentre, | ||
const tarch::la::Vector< Dimensions, double > & | patchSize, | ||
double | t, | ||
double | dt, | ||
int | numberOfGridCellsPerPatchPerAxis, | ||
int | overlap, | ||
int | unknownsPlusAuxiliaryVariables, | ||
int | faceNumber, | ||
double *__restrict__ | Q ) |
Apply (generic) boundary conditions.
This implementation runs over the boundary and applies the generic (point-wise) boundary conditions via a call-back to the user implementation.
unknownsPlusAuxiliaryVariables | Number of unknowns plus the number of auxiliary variables. The boundary treatment routine does not distinguish how the two types of quantities are handled, so it is reasonable to only pass in the sum. |
faceNumber | Is usually taken from marker.getSelectedFaceNumber() and is thus a number between 0 and 2d-1. |
Definition at line 13 of file BoundaryConditions.cpp.
References _log, dfore, getGridCellSize(), logDebug, logTraceInWith4Arguments, logTraceOut, and tarch::la::multiplyComponents().
void exahype2::fd::applySommerfeldConditions | ( | std::function< double(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &faceCentre, const tarch::la::Vector< Dimensions, double > &gridCellH, double t, double dt, int normal) > | maxEigenvalue, |
const tarch::la::Vector< Dimensions, double > & | faceCentre, | ||
const tarch::la::Vector< Dimensions, double > & | patchSize, | ||
double | t, | ||
double | dt, | ||
int | numberOfGridCellsPerPatchPerAxis, | ||
int | overlap, | ||
int | numberOfUnknowns, | ||
int | numberOfAuxiliaryVariables, | ||
int | faceNumber, | ||
const tarch::la::Vector< Dimensions, double > & | systemOrigin, | ||
double *__restrict__ | Qold, | ||
double *__restrict__ | Qnew ) |
Wrapper around the other applySommerfeldConditions() function.
In this variant, the far-field solution is zero, so the solution is kind of trivialised there.
Definition at line 197 of file BoundaryConditions.cpp.
References applySommerfeldConditions().
void exahype2::fd::applySommerfeldConditions | ( | std::function< double(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &faceCentre, const tarch::la::Vector< Dimensions, double > &gridCellH, double t, double dt, int normal) > | maxEigenvalue, |
std::function< void(double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &faceCentre, const tarch::la::Vector< Dimensions, double > &gridCellH) > | farFieldSolution, | ||
const tarch::la::Vector< Dimensions, double > & | faceCentre, | ||
const tarch::la::Vector< Dimensions, double > & | patchSize, | ||
double | t, | ||
double | dt, | ||
int | numberOfGridCellsPerPatchPerAxis, | ||
int | overlap, | ||
int | numberOfUnknowns, | ||
int | numberOfAuxiliaryVariables, | ||
int | faceNumber, | ||
const tarch::la::Vector< Dimensions, double > & | systemOrigin, | ||
double *__restrict__ | Qold, | ||
double *__restrict__ | Qnew ) |
Apply Sommerfeld boundary conditions Sommerfeld boundary conditions don't need a callback for the actual boundary data, but they need the max flux. If you employ Sommerfeld conditions, you can ignore the generic boundary condition function of your solver. It will still remain there, but you can leave it empty (or add an assertion in there, as it should never be called). ## Usage The typical user switches to Sommerfeld conditions by exchanging the boundary kernel call: <pre>
self._action_set_handle_boundary.TemplateHandleBoundary_KernelCalls = """ ::exahype2::fd::applySommerfeldConditions( [&]( const double * <strong>restrict</strong> Q, const tarch::la::Vector<Dimensions,double>& faceCentre, const tarch::la::Vector<Dimensions,double>& gridCellH, double t, double dt, int normal ) -> double { return repositories::{{SOLVER_INSTANCE}}.maxEigenvalue( Q, faceCentre, gridCellH, t, dt, normal ); }, [&]( double * <strong>restrict</strong> Q, const tarch::la::Vector<Dimensions,double>& faceCentre, const tarch::la::Vector<Dimensions,double>& gridCellH ) -> void { repositories::{{SOLVER_INSTANCE}}.initialCondition( Q, faceCentre, gridCellH, true ); }, marker.x(), marker.h(), {{FACE_METADATA_ACCESSOR}}.getOldTimeStamp(marker.getSelectedFaceNumber()<Dimensions ? 1 : 0), repositories::{{SOLVER_INSTANCE}}.getMinTimeStepSize(), {{NUMBER_OF_GRID_CELLS_PER_PATCH_PER_AXIS}}, {{OVERLAP}}, {{NUMBER_OF_UNKNOWNS}}, {{NUMBER_OF_AUXILIARY_VARIABLES}}, marker.getSelectedFaceNumber(), {0.0, 0.0, 0.0}, fineGridFace{{UNKNOWN_IDENTIFIER}}Old.value, fineGridFace{{UNKNOWN_IDENTIFIER}}New.value, {...} //approximate background solution at infinity ); </pre> """
farFieldSolution |
Definition at line 84 of file BoundaryConditions.cpp.
References _log, dfore, tarch::la::equals(), tarch::freeMemory(), getGridCellSize(), tarch::Heap, logDebug, logTraceInWith4Arguments, logTraceOut, tarch::la::multiplyComponents(), and tarch::la::norm2().
Referenced by applySommerfeldConditions(), and exahype2::fd::tests::SommerfeldBCTest::flatsolutiontest().
|
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.
x | Centre of the cell |
h | Size of the cell |
index | Index of Finite Volume (in lexicographic ordering) |
Definition at line 77 of file PatchUtils.h.
Referenced by exahype2::fd::internal::reduceMaxEigenvalue_LoopBody().
|
static |
Definition at line 89 of file PatchUtils.h.
|
static |
Definition at line 22 of file PatchUtils.h.
Referenced by applyBoundaryConditions(), applySommerfeldConditions(), and exahype2::fd::internal::reduceMaxEigenvalue_LoopBody().
|
static |
Definition at line 32 of file PatchUtils.h.
|
static |
Definition at line 101 of file PatchUtils.h.
|
static |
Definition at line 115 of file PatchUtils.h.
|
static |
Definition at line 42 of file PatchUtils.h.
|
static |
Definition at line 52 of file PatchUtils.h.
Helper routine that I need in the log statements.
Applies to AoS data only.
Definition at line 31 of file PatchUtils.cpp.
References exahype2::fv::plotVolume().
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.
Definition at line 39 of file PatchUtils.cpp.
References exahype2::fv::plotPatch().
std::string exahype2::fd::plotPatchOverlap | ( | const double *__restrict__ | Q, |
int | unknowns, | ||
int | auxiliaryVariables, | ||
int | numberOfGridCellsPerPatchPerAxis, | ||
int | haloSize, | ||
int | normal, | ||
bool | prettyPrint = false ) |
Definition at line 58 of file PatchUtils.cpp.
References exahype2::fv::plotPatchOverlap().
void exahype2::fd::reduceMaxEigenvalue_patchwise_functors | ( | ::exahype2::CellData< double, double > & | patchData, |
int | numberOfGridCellsPerPatchPerAxis, | ||
int | overlap, | ||
int | unknowns, | ||
int | auxiliaryVariables, | ||
MaxEigenvalue | maxEigenvalue ) |
Definition at line 5 of file LoopBody.cpp.
References exahype2::CellData< inType, outType >::cellCentre, exahype2::CellData< inType, outType >::cellSize, dfor, exahype2::CellData< inType, outType >::dt, exahype2::CellData< inType, outType >::maxEigenvalue, exahype2::CellData< inType, outType >::numberOfCells, exahype2::CellData< inType, outType >::QOut, exahype2::fd::internal::reduceMaxEigenvalue_LoopBody(), and exahype2::CellData< inType, outType >::t.
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.
location | String that tells system from where this routine got called |
minValues | Is either a nullptr or it points to a double array with exactly unknowns+auxiliaryVariables entries |
Definition at line 79 of file PatchUtils.cpp.
References exahype2::fv::validatePatch().
|
constexpr |
Definition at line 17 of file LoopBody.h.