6#if defined(GPUOffloadingOMP)
7#pragma omp declare target
9template <
class QInEnumeratorType,
class QOutEnumeratorType>
11 const double* __restrict__ QIn,
12 const QInEnumeratorType& QInEnumerator,
16 double* __restrict__ QOut,
17 const QOutEnumeratorType& QOutEnumerator
19 QOut[ QOutEnumerator(patchIndex,volumeIndex,unknown) ] = QIn[QInEnumerator(patchIndex,volumeIndex,unknown)];
21#if defined(GPUOffloadingOMP)
22#pragma omp end declare target
25template <
class QInEnumeratorType,
class QInterEnumeratorType>
27 const double* __restrict__ QIn,
28 const QInEnumeratorType QInEnumerator,
38 double* __restrict__ timederivative,
39 QInterEnumeratorType QInterEnumerator
41 double QInGathered[QInEnumerator._unknowns+QInEnumerator._numberOfAuxiliaryVariables];
42 double temp[QInEnumerator._unknowns], shiftQ[QInEnumerator._unknowns];
43 double gradientQ[QInEnumerator._unknowns*3];
47 #if defined(SharedOMP)
50 for (
int unknown=0; unknown<QInEnumerator._unknowns+QInEnumerator._numberOfAuxiliaryVariables; unknown++) {
51 QInGathered[unknown] = QIn[ QInEnumerator(patchIndex,
volumeIndex,unknown) ];
63 for (
int unknown=0; unknown<QInEnumerator._unknowns; unknown++) {
64 timederivative[QInterEnumerator(patchIndex,
volumeIndex,unknown)] =
temp[ unknown ];
68 for (
int unknown=0; unknown<QInEnumerator._unknowns; unknown++) {
69 gradientQ[QInEnumerator._unknowns*0+unknown]=QInGathered[ QInEnumerator._unknowns*1+unknown ];
70 gradientQ[QInEnumerator._unknowns*1+unknown]=QInGathered[ QInEnumerator._unknowns*2+unknown ];
71 gradientQ[QInEnumerator._unknowns*2+unknown]=QInGathered[ QInEnumerator._unknowns*3+unknown ];
73 for (
int normal=0; normal<3; normal++){
75 QInGathered, gradientQ+QInEnumerator._unknowns*normal,
83 for (
int unknown=0; unknown<QInEnumerator._unknowns; unknown++) {
84 timederivative[QInterEnumerator(patchIndex,
volumeIndex,unknown)] -=
temp[ unknown ];
89 for (
int normal=0; normal<3; normal++){
91 for (
int unknown=0; unknown<QInEnumerator._unknowns; unknown++) {
92 shiftQ[unknown]=QInGathered[unknown]-0.5*gradientQ[QInEnumerator._unknowns*normal+unknown]*
::exahype2::fv::getVolumeSize( patchSize, QInEnumerator._numberOfDoFsPerAxisInCell )(normal);
100 for (
int unknown=0; unknown<QInEnumerator._unknowns; unknown++) {
104 for (
int unknown=0; unknown<QInEnumerator._unknowns; unknown++) {
105 shiftQ[unknown]=QInGathered[unknown]+0.5*gradientQ[QInEnumerator._unknowns*normal+unknown]*
::exahype2::fv::getVolumeSize( patchSize, QInEnumerator._numberOfDoFsPerAxisInCell )(normal);
113 for (
int unknown=0; unknown<QInEnumerator._unknowns; unknown++) {
121template <
class QInEnumeratorType,
class QInterEnumeratorType>
123 const double* __restrict__ QIn,
124 const QInEnumeratorType QInEnumerator,
131 double* __restrict__ timederivative,
132 double* __restrict__ QfaceXneg,
133 double* __restrict__ QfaceXpos,
134 double* __restrict__ QfaceYneg,
135 double* __restrict__ QfaceYpos,
136 double* __restrict__ QfaceZneg,
137 double* __restrict__ QfaceZpos,
138 QInterEnumeratorType QInterEnumerator
140 double QInGathered[QInEnumerator._unknowns+QInEnumerator._numberOfAuxiliaryVariables];
147 #if defined(SharedOMP)
150 for (
int unknown=0; unknown<QInEnumerator._unknowns+QInEnumerator._numberOfAuxiliaryVariables; unknown++) {
151 QInGathered[unknown] = QIn[ QInEnumerator(patchIndex,
volumeIndex,unknown) ];
153 for (
int unknown=0; unknown<QInEnumerator._unknowns; unknown++) {
155 QfaceXneg[QInterEnumerator(patchIndex,
volumeIndex,unknown)]=QInGathered[unknown]
156 +0.5*dt*timederivative[ QInterEnumerator(patchIndex,
volumeIndex,unknown) ]
157 -0.5*VolumeSize(0)*QInGathered[ QInEnumerator._unknowns*1+unknown ];
158 QfaceYneg[QInterEnumerator(patchIndex,
volumeIndex,unknown)]=QInGathered[unknown]
159 +0.5*dt*timederivative[ QInterEnumerator(patchIndex,
volumeIndex,unknown) ]
160 -0.5*VolumeSize(1)*QInGathered[ QInEnumerator._unknowns*2+unknown ];
161 QfaceZneg[QInterEnumerator(patchIndex,
volumeIndex,unknown)]=QInGathered[unknown]
162 +0.5*dt*timederivative[ QInterEnumerator(patchIndex,
volumeIndex,unknown) ]
163 -0.5*VolumeSize(2)*QInGathered[ QInEnumerator._unknowns*3+unknown ];
165 QfaceXpos[QInterEnumerator(patchIndex,
volumeIndex,unknown)]=QInGathered[unknown]
166 +0.5*dt*timederivative[ QInterEnumerator(patchIndex,
volumeIndex,unknown) ]
167 +0.5*VolumeSize(0)*QInGathered[ QInEnumerator._unknowns*1+unknown ];
168 QfaceYpos[QInterEnumerator(patchIndex,
volumeIndex,unknown)]=QInGathered[unknown]
169 +0.5*dt*timederivative[ QInterEnumerator(patchIndex,
volumeIndex,unknown) ]
170 +0.5*VolumeSize(0)*QInGathered[ QInEnumerator._unknowns*2+unknown ];
171 QfaceZpos[QInterEnumerator(patchIndex,
volumeIndex,unknown)]=QInGathered[unknown]
172 +0.5*dt*timederivative[ QInterEnumerator(patchIndex,
volumeIndex,unknown) ]
173 +0.5*VolumeSize(0)*QInGathered[ QInEnumerator._unknowns*3+unknown ];
178template <
class QInEnumeratorType,
class QMaxEigenvalueEnumeratorType>
180 const double* __restrict__ QIn,
181 QInEnumeratorType QInEnumerator,
190 double* __restrict__ QMaxEigenvalue,
191 QMaxEigenvalueEnumeratorType QMaxEigenvalueEnumerator
193 double QInGathered[QInEnumerator._unknowns+QInEnumerator._numberOfAuxiliaryVariables];
196 #if defined(SharedOMP)
199 for (
int unknown=0; unknown<QInEnumerator._unknowns+QInEnumerator._numberOfAuxiliaryVariables; unknown++) {
200 QInGathered[unknown] = QIn[ QInEnumerator(patchIndex,volumeIndex,unknown) ];
204 QMaxEigenvalue[ QMaxEigenvalueEnumerator(patchIndex,volumeIndex,0) ] =
215#if defined(GPUOffloadingOMP)
216#pragma omp declare target
218template <
typename QInEnumeratorType,
typename QInterEnumeratorType,
typename QMaxEigenvalueEnumeratorType,
typename QOutEnumeratorType>
220 const double* __restrict__ QIn,
221 const QInEnumeratorType QInEnumerator,
222 const double* __restrict__ tempMaxEigenvalueX,
223 const double* __restrict__ tempMaxEigenvalueY,
224 const double* __restrict__ tempMaxEigenvalueZ,
225 const QMaxEigenvalueEnumeratorType & eigenvalueEnumerator,
232 double* __restrict__ QOut,
233 const QOutEnumeratorType & QOutEnumerator,
234 double* __restrict__ QfaceXneg,
235 double* __restrict__ QfaceXpos,
236 double* __restrict__ QfaceYneg,
237 double* __restrict__ QfaceYpos,
238 double* __restrict__ QfaceZneg,
239 double* __restrict__ QfaceZpos,
240 QInterEnumeratorType QInterEnumerator
242 auto updateAlongOneDirection = [=](
const double* __restrict__ tempMaxEigenvalue,
const double* __restrict__ QfaceNLeft,
const double* __restrict__ QfaceNRight,
int normal) {
245 leftVolume(normal)--;
246 rightVolume(normal)++;
248 double leftVolumeValue = tempMaxEigenvalue[eigenvalueEnumerator(patchIndex, leftVolume, 0)];
249 double centerVolumeValue = tempMaxEigenvalue[eigenvalueEnumerator(patchIndex, volumeIndex, 0)];
250 double rightVolumeValue = tempMaxEigenvalue[eigenvalueEnumerator(patchIndex, rightVolume, 0)];
252 const double lambdaLeft = tempMaxEigenvalue[eigenvalueEnumerator(patchIndex, leftVolume,0)] > tempMaxEigenvalue[eigenvalueEnumerator(patchIndex, volumeIndex,0)]
253 ? tempMaxEigenvalue[eigenvalueEnumerator(patchIndex, leftVolume,0)]
254 : tempMaxEigenvalue[eigenvalueEnumerator(patchIndex, volumeIndex,0)];
255 const double lambdaRight = tempMaxEigenvalue[eigenvalueEnumerator(patchIndex, rightVolume,0)] > tempMaxEigenvalue[eigenvalueEnumerator(patchIndex, volumeIndex,0)]
256 ? tempMaxEigenvalue[eigenvalueEnumerator(patchIndex, rightVolume,0)]
257 : tempMaxEigenvalue[eigenvalueEnumerator(patchIndex, volumeIndex,0)];
258 double fluxLeft = - lambdaLeft * (QfaceNLeft[QInterEnumerator(patchIndex, volumeIndex,unknown)] - QfaceNRight[QInterEnumerator(patchIndex, leftVolume,unknown)]);
259 double fluxRight = - lambdaRight * (QfaceNLeft[QInterEnumerator(patchIndex, rightVolume,unknown)] - QfaceNRight[QInterEnumerator(patchIndex, volumeIndex,unknown)]);
261 QOut[ QOutEnumerator(patchIndex, volumeIndex,unknown) ] += dt / patchSize(normal) * QOutEnumerator._numberOfDoFsPerAxisInCell * (fluxLeft - fluxRight)*0.5;
263 updateAlongOneDirection(tempMaxEigenvalueX, QfaceXneg, QfaceXpos, 0);
264 updateAlongOneDirection(tempMaxEigenvalueY, QfaceYneg, QfaceYpos, 1);
265 if (Dimensions==3) updateAlongOneDirection(tempMaxEigenvalueZ, QfaceZneg, QfaceZpos, 2);
267#if defined(GPUOffloadingOMP)
268#pragma omp end declare target
271template <
class QInEnumeratorType,
class QInterEnumeratorType,
class QFluxEnumeratorType>
273 double* __restrict__ QfaceNLeft,
274 double* __restrict__ QfaceNRight,
275 QInterEnumeratorType QInterEnumerator,
276 QInEnumeratorType QInEnumerator,
285 double* __restrict__ QFluxL,
286 double* __restrict__ QFluxR,
287 QFluxEnumeratorType QFluxEnumerator
289 double QLeft[QInEnumerator._unknowns], QRight[QInEnumerator._unknowns];
290 double tempFlux[QInEnumerator._unknowns];
292 for (
int unknown=0; unknown<QInEnumerator._unknowns; unknown++) {
293 QLeft[unknown] = QfaceNLeft[ QInterEnumerator(patchIndex,volumeIndex,unknown) ];
294 QRight[unknown] = QfaceNRight[ QInterEnumerator(patchIndex,volumeIndex,unknown) ];
306 for (
int unknown=0; unknown<QInEnumerator._unknowns; unknown++) {
307 QFluxL[ QFluxEnumerator(patchIndex,volumeIndex,unknown) ] = tempFlux[unknown];
319 for (
int unknown=0; unknown<QInEnumerator._unknowns; unknown++) {
320 QFluxR[ QFluxEnumerator(patchIndex,volumeIndex,unknown) ] = tempFlux[unknown];
324template <
typename QFluxEnumeratorType,
typename QOutEnumeratorType>
326 const double* __restrict__ tempFluxXL,
327 const double* __restrict__ tempFluxYL,
328 const double* __restrict__ tempFluxZL,
329 const double* __restrict__ tempFluxXR,
330 const double* __restrict__ tempFluxYR,
331 const double* __restrict__ tempFluxZR,
332 const QFluxEnumeratorType fluxEnumerator,
339 double* __restrict__ QOut,
340 const QOutEnumeratorType& QOutEnumerator
342 auto updateAlongOneDirection = [=](
const double* __restrict__ tempFluxNL,
const double* __restrict__ tempFluxNR,
int normal) {
345 leftVolume(normal)--;
346 rightVolume(normal)++;
348 double fluxLeft = 0.5 * tempFluxNR[fluxEnumerator(patchIndex, leftVolume,unknown)]
349 + 0.5 * tempFluxNL[fluxEnumerator(patchIndex, volumeIndex,unknown)];
350 double fluxRight = 0.5 * tempFluxNR[fluxEnumerator(patchIndex, volumeIndex,unknown)]
351 + 0.5 * tempFluxNL[fluxEnumerator(patchIndex, rightVolume,unknown)];
352 if ( std::isnan(fluxLeft - fluxRight) )
353 {std::cout<<
"fluxLeft: "<<std::to_string(fluxLeft)<<
" fluxRight: "<<std::to_string(fluxRight)<<
" flux result: "<<
dt / patchSize(normal) * QOutEnumerator._numberOfDoFsPerAxisInCell*(fluxLeft - fluxRight)<<std::endl;}
356 QOut[ QOutEnumerator(patchIndex, volumeIndex,unknown) ] +=
dt / patchSize(normal) * QOutEnumerator._numberOfDoFsPerAxisInCell
357 *(fluxLeft - fluxRight);
359 updateAlongOneDirection(tempFluxXL, tempFluxXR, 0);
360 updateAlongOneDirection(tempFluxYL, tempFluxYR, 1);
361 if (Dimensions==3) updateAlongOneDirection(tempFluxZL, tempFluxZR, 2);
365template <
class QInEnumeratorType,
class QInterEnumeratorType,
class QNCPFaceEnumeratorType>
367 double* __restrict__ QfaceNLeft,
368 double* __restrict__ QfaceNRight,
369 QInterEnumeratorType QInterEnumerator,
370 QInEnumeratorType QInEnumerator,
379 double* __restrict__ QD,
380 const QNCPFaceEnumeratorType QNcpEnumerator
382 double QAverage[QInEnumerator._unknowns];
383 double DeltaQ[QInEnumerator._unknowns];
384 double QFluxGathered[QInEnumerator._unknowns];
388 rightAdjacentVolume(normal)++;
391 for (
int unknown=0; unknown<QInEnumerator._unknowns; unknown++) {
392 QAverage[unknown] = 0.5 * QfaceNRight[ QInterEnumerator(patchIndex,leftAdjacentVolume,unknown) ]
393 + 0.5 * QfaceNLeft[ QInterEnumerator(patchIndex,rightAdjacentVolume,unknown) ];
394 DeltaQ[unknown] = QfaceNLeft[ QInterEnumerator(patchIndex,rightAdjacentVolume,unknown) ]
395 - QfaceNRight[ QInterEnumerator(patchIndex,leftAdjacentVolume,unknown) ];
408 for (
int unknown=0; unknown<QInEnumerator._unknowns; unknown++) {
409 QD[ QNcpEnumerator(patchIndex,volumeIndex,unknown) ] = QFluxGathered[unknown];
413template <
typename QNCPFaceEnumeratorType,
typename QOutEnumeratorType>
415 const double* __restrict__ QDX,
416 const double* __restrict__ QDY,
417 const double* __restrict__ QDZ,
418 const QNCPFaceEnumeratorType ncpEnumerator,
425 double* __restrict__ QOut,
426 const QOutEnumeratorType& QOutEnumerator
428 auto updateAlongOneCoordinateDirection = [=](
const double* __restrict__ QD,
int normal) {
433 double fluxLeft = QD[ncpEnumerator(patchIndex, leftFace, unknown)];
434 double fluxRight = QD[ncpEnumerator(patchIndex, rightFace, unknown)];
437 QOut[ QOutEnumerator(patchIndex, volumeIndex,unknown) ] +=
dt / patchSize(normal) * QOutEnumerator._numberOfDoFsPerAxisInCell *
438 (fluxLeft + fluxRight)*(-0.5);
440 updateAlongOneCoordinateDirection( QDX, 0 );
441 updateAlongOneCoordinateDirection( QDY, 1 );
442 if (Dimensions==3) updateAlongOneCoordinateDirection( QDZ, 2 );
447template <
class QInEnumeratorType,
class QInterEnumeratorType,
class QOutEnumeratorType>
449 const double* __restrict__ QIn,
450 const QInterEnumeratorType QInterEnumerator,
451 const QInEnumeratorType QInEnumerator,
460 double* timeDerivative,
461 double* __restrict__ QOut,
462 const QOutEnumeratorType& QOutEnumerator,
466 double QInGathered[QInEnumerator._unknowns+QInEnumerator._numberOfAuxiliaryVariables];
467 double QSourceGathered[QInEnumerator._unknowns];
468 double QNCPGathered[QInEnumerator._unknowns];
469 double gradientQ[QInEnumerator._unknowns*3];
472 for (
int unknown=0; unknown<QInEnumerator._unknowns+QInEnumerator._numberOfAuxiliaryVariables; unknown++) {
473 QInGathered[unknown] = QIn[ QInEnumerator(patchIndex,
volumeIndex,unknown) ];
475 for (
int unknown=0; unknown<QInEnumerator._unknowns; unknown++) {
476 gradientQ[QInEnumerator._unknowns*0+unknown]=QInGathered[ QInEnumerator._unknowns*1+unknown ];
477 gradientQ[QInEnumerator._unknowns*1+unknown]=QInGathered[ QInEnumerator._unknowns*2+unknown ];
478 gradientQ[QInEnumerator._unknowns*2+unknown]=QInGathered[ QInEnumerator._unknowns*3+unknown ];
480 for (
int unknown=0; unknown<QInEnumerator._unknowns; unknown++) {
481 QInGathered[unknown] += 0.5*dt*timeDerivative[ QInterEnumerator(patchIndex,
volumeIndex,unknown) ];
495 for (
int unknown=0; unknown<QInEnumerator._unknowns; unknown++) {
496 QOut[ QOutEnumerator(patchIndex,
volumeIndex,unknown) ] += dt * QSourceGathered[unknown];
502 for (
int normal=0; normal<3; normal++){
504 QInGathered, gradientQ+QInEnumerator._unknowns*normal,
512 for (
int unknown=0; unknown<QInEnumerator._unknowns; unknown++) {
513 QOut[ QOutEnumerator(patchIndex,
volumeIndex,unknown) ] -= dt * QNCPGathered[unknown];
520template <
class QInEnumeratorType>
522 const double* __restrict__ QIn,
523 QInEnumeratorType QInEnumerator,
532 double QInGathered[QInEnumerator._unknowns+QInEnumerator._numberOfAuxiliaryVariables];
535 #if defined(SharedOMP)
538 for (
int unknown=0; unknown<QInEnumerator._unknowns+QInEnumerator._numberOfAuxiliaryVariables; unknown++) {
539 QInGathered[unknown] = QIn[ QInEnumerator(patchIndex,volumeIndex,unknown) ];
543 for (
int normal=0; normal<Dimensions; normal++) {
static void updateSolutionWithEigenvalueDamping_LoopBody(const double *__restrict__ QIn, const QInEnumeratorType QInEnumerator, const double *__restrict__ tempMaxEigenvalueX, const double *__restrict__ tempMaxEigenvalueY, const double *__restrict__ tempMaxEigenvalueZ, const QMaxEigenvalueEnumeratorType &eigenvalueEnumerator, const tarch::la::Vector< Dimensions, double > &patchCentre, const tarch::la::Vector< Dimensions, double > &patchSize, int patchIndex, const tarch::la::Vector< Dimensions, int > &volumeIndex, int unknown, double dt, double *__restrict__ QOut, const QOutEnumeratorType &QOutEnumerator, double *__restrict__ QfaceXneg, double *__restrict__ QfaceXpos, double *__restrict__ QfaceYneg, double *__restrict__ QfaceYpos, double *__restrict__ QfaceZneg, double *__restrict__ QfaceZpos, QInterEnumeratorType QInterEnumerator) InlineMethod
void computeQonFace_LoopBody(const double *__restrict__ QIn, const QInEnumeratorType QInEnumerator, const tarch::la::Vector< Dimensions, double > &patchCentre, const tarch::la::Vector< Dimensions, double > &patchSize, int patchIndex, const tarch::la::Vector< Dimensions, int > &volumeIndex, double t, double dt, double *__restrict__ timederivative, double *__restrict__ QfaceXneg, double *__restrict__ QfaceXpos, double *__restrict__ QfaceYneg, double *__restrict__ QfaceYpos, double *__restrict__ QfaceZneg, double *__restrict__ QfaceZpos, QInterEnumeratorType QInterEnumerator) InlineMethod
static void updateSolutionWithDTerm_LoopBody(const double *__restrict__ QDX, const double *__restrict__ QDY, const double *__restrict__ QDZ, const QNCPFaceEnumeratorType ncpEnumerator, const tarch::la::Vector< Dimensions, double > &patchCentre, const tarch::la::Vector< Dimensions, double > &patchSize, int patchIndex, const tarch::la::Vector< Dimensions, int > &volumeIndex, int unknown, double dt, double *__restrict__ QOut, const QOutEnumeratorType &QOutEnumerator) InlineMethod
static void copySolution_LoopBody(const double *__restrict__ QIn, const QInEnumeratorType &QInEnumerator, int patchIndex, const tarch::la::Vector< Dimensions, int > &volumeIndex, int unknown, double *__restrict__ QOut, const QOutEnumeratorType &QOutEnumerator) InlineMethod
static void computeFlux_LoopBody(double *__restrict__ QfaceNLeft, double *__restrict__ QfaceNRight, QInterEnumeratorType QInterEnumerator, QInEnumeratorType QInEnumerator, exahype2::fv::musclhancock::Flux flux, const tarch::la::Vector< Dimensions, double > &patchCentre, const tarch::la::Vector< Dimensions, double > &patchSize, int patchIndex, const tarch::la::Vector< Dimensions, int > &volumeIndex, double t, double dt, int normal, double *__restrict__ QFluxL, double *__restrict__ QFluxR, QFluxEnumeratorType QFluxEnumerator) InlineMethod
void computeTimeDerivative_LoopBody(const double *__restrict__ QIn, const QInEnumeratorType QInEnumerator, exahype2::fv::musclhancock::Flux flux, exahype2::fv::musclhancock::NonconservativeProduct ncp, exahype2::fv::musclhancock::Source source, const tarch::la::Vector< Dimensions, double > &patchCentre, const tarch::la::Vector< Dimensions, double > &patchSize, int patchIndex, const tarch::la::Vector< Dimensions, int > &volumeIndex, double t, double dt, double *__restrict__ timederivative, QInterEnumeratorType QInterEnumerator) InlineMethod
void updateSolutionwithNCPandSource_LoopBody(const double *__restrict__ QIn, const QInterEnumeratorType QInterEnumerator, const QInEnumeratorType QInEnumerator, exahype2::fv::musclhancock::NonconservativeProduct ncp, exahype2::fv::musclhancock::Source source, const tarch::la::Vector< Dimensions, double > &patchCentre, const tarch::la::Vector< Dimensions, double > &patchSize, int patchIndex, const tarch::la::Vector< Dimensions, int > &volumeIndex, double t, double dt, double *timeDerivative, double *__restrict__ QOut, const QOutEnumeratorType &QOutEnumerator, bool evalNCP, bool evalSRC) InlineMethod
static void computeDTerm_LoopBody(double *__restrict__ QfaceNLeft, double *__restrict__ QfaceNRight, QInterEnumeratorType QInterEnumerator, QInEnumeratorType QInEnumerator, exahype2::fv::musclhancock::NonconservativeProduct ncp, const tarch::la::Vector< Dimensions, double > &patchCentre, const tarch::la::Vector< Dimensions, double > &patchSize, int patchIndex, const tarch::la::Vector< Dimensions, int > &volumeIndex, double t, double dt, int normal, double *__restrict__ QD, const QNCPFaceEnumeratorType QNcpEnumerator) InlineMethod
static void updateSolutionWithFlux_LoopBody(const double *__restrict__ tempFluxXL, const double *__restrict__ tempFluxYL, const double *__restrict__ tempFluxZL, const double *__restrict__ tempFluxXR, const double *__restrict__ tempFluxYR, const double *__restrict__ tempFluxZR, const QFluxEnumeratorType fluxEnumerator, const tarch::la::Vector< Dimensions, double > &patchCentre, const tarch::la::Vector< Dimensions, double > &patchSize, int patchIndex, const tarch::la::Vector< Dimensions, int > &volumeIndex, int unknown, double dt, double *__restrict__ QOut, const QOutEnumeratorType &QOutEnumerator) InlineMethod
static void computeMaxEigenvalue_LoopBody(const double *__restrict__ QIn, QInEnumeratorType QInEnumerator, exahype2::fv::musclhancock::MaxEigenvalue maxEigenvalue, const tarch::la::Vector< Dimensions, double > &patchCentre, const tarch::la::Vector< Dimensions, double > &patchSize, int patchIndex, const tarch::la::Vector< Dimensions, int > &volumeIndex, double t, double dt, int normal, double *__restrict__ QMaxEigenvalue, QMaxEigenvalueEnumeratorType QMaxEigenvalueEnumerator) InlineMethod
static double reduceMaxEigenvalue_LoopBody(const double *__restrict__ QIn, QInEnumeratorType QInEnumerator, exahype2::fv::musclhancock::MaxEigenvalue maxEigenvalue, const tarch::la::Vector< Dimensions, double > &patchCentre, const tarch::la::Vector< Dimensions, double > &patchSize, int patchIndex, const tarch::la::Vector< Dimensions, int > &volumeIndex, double t, double dt) InlineMethod
std::function< void(const double *__restrict__ Q, const double *__restrict__ deltaQ, const tarch::la::Vector< Dimensions, double > &faceCentre, const tarch::la::Vector< Dimensions, double > &volumeH, double t, double dt, int normal, double *__restrict__ BTimesDeltaQ) NonconservativeProduct)
std::function< void(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &volumeX, const tarch::la::Vector< Dimensions, double > &volumeH, double t, double dt, double *__restrict__ S) Source)
std::function< void(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &faceCentre, const tarch::la::Vector< Dimensions, double > &volumeH, double t, double dt, int normal, double *__restrict__ F) Flux)
std::function< double(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &faceCentre, const tarch::la::Vector< Dimensions, double > &volumeH, double t, double dt, int normal) MaxEigenvalue)
static tarch::la::Vector< 2, double > getVolumeCentre(const tarch::la::Vector< 2, double > &x, const tarch::la::Vector< 2, double > &h, int numberOfVolumesPerAxisInPatch, 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< 2, double > getVolumeSize(const tarch::la::Vector< 2, double > &h, int numberOfVolumesPerAxisInPatch)
We need this routine within vectorised and GPUised code.
auto volumeIndex(Args... args)