6 int NumberOfAuxiliaryVariables,
7 class QInEnumeratorType,
8 class QOutEnumeratorType>
10 const double* __restrict__ QIn,
11 const QInEnumeratorType& QInEnumerator,
12 const SourceFunctor& sourceFunctor,
13 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
14 const ::tarch::la::Vector<Dimensions, double>& patchSize,
16 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
19 double* __restrict__ QOut,
20 const QOutEnumeratorType& QOutEnumerator
22 double QInGathered[NumberOfUnknowns + NumberOfAuxiliaryVariables]{0.0};
23 double sourceGathered[NumberOfUnknowns]{0.0};
29 for (
int unknown = 0; unknown < NumberOfUnknowns + NumberOfAuxiliaryVariables;
31 QInGathered[unknown] = QIn[QInEnumerator(patchIndex, volumeIndex, unknown)];
39 QInEnumerator._numberOfDoFsPerAxisInCell,
42 getVolumeSize(patchSize, QInEnumerator._numberOfDoFsPerAxisInCell),
52 for (
int unknown = 0; unknown < NumberOfUnknowns; unknown++) {
57 )] = QIn[QInEnumerator(patchIndex, volumeIndex, unknown)]
58 +
dt * sourceGathered[unknown];
60 QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)]
61 == QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)],
65 QOutEnumerator(patchIndex, volumeIndex, unknown)
71 for (
int unknown = NumberOfUnknowns;
72 unknown < NumberOfUnknowns + NumberOfAuxiliaryVariables;
74 QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)] = QIn
75 [QInEnumerator(patchIndex, volumeIndex, unknown)];
77 QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)]
78 == QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)],
82 QOutEnumerator(patchIndex, volumeIndex, unknown)
88template <
int NumberOfUnknowns,
int NumberOfAuxiliaryVariables>
90 const double* __restrict__ QIn,
91 const enumerator::AoSLexicographicEnumerator& QInEnumerator,
92 const SourceFunctor& sourceFunctor,
93 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
94 const ::tarch::la::Vector<Dimensions, double>& patchSize,
96 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
99 double* __restrict__ QOut,
100 const enumerator::AoSLexicographicEnumerator& QOutEnumerator
103 QIn + QInEnumerator(patchIndex, volumeIndex, 0),
107 QInEnumerator._numberOfDoFsPerAxisInCell,
110 getVolumeSize(patchSize, QInEnumerator._numberOfDoFsPerAxisInCell),
113 QOut + QOutEnumerator(patchIndex, volumeIndex, 0)
116#if defined(SharedOMP)
119 for (
int unknown = 0; unknown < NumberOfUnknowns; unknown++) {
124 )] =
dt * QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)]
125 + QIn[QInEnumerator(patchIndex, volumeIndex, unknown)];
127 QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)]
128 == QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)],
132 QOutEnumerator(patchIndex, volumeIndex, unknown)
135#if defined(SharedOMP)
138 for (
int unknown = NumberOfUnknowns;
139 unknown < NumberOfUnknowns + NumberOfAuxiliaryVariables;
141 QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)] = QIn
142 [QInEnumerator(patchIndex, volumeIndex, unknown)];
144 QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)]
145 == QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)],
149 QOutEnumerator(patchIndex, volumeIndex, unknown)
155template <
class SolverType,
class QInEnumeratorType,
class QOutEnumeratorType>
157 const double* __restrict__ QIn,
158 const QInEnumeratorType& QInEnumerator,
159 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
160 const ::tarch::la::Vector<Dimensions, double>& patchSize,
162 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
165 double* __restrict__ QOut,
166 const QOutEnumeratorType& QOutEnumerator
169 [SolverType::NumberOfUnknowns + SolverType::NumberOfAuxiliaryVariables]{
171 double sourceGathered[SolverType::NumberOfUnknowns]{0.0};
174#if defined(SharedOMP)
177 for (
int unknown = 0;
179 < SolverType::NumberOfUnknowns + SolverType::NumberOfAuxiliaryVariables;
181 QInGathered[unknown] = QIn[QInEnumerator(patchIndex, volumeIndex, unknown)];
184 SolverType::sourceTerm(
189 QInEnumerator._numberOfDoFsPerAxisInCell,
192 getVolumeSize(patchSize, QInEnumerator._numberOfDoFsPerAxisInCell),
196 Solver::Offloadable::Yes
200#if defined(SharedOMP)
203 for (
int unknown = 0; unknown < SolverType::NumberOfUnknowns; unknown++) {
208 )] = QIn[QInEnumerator(patchIndex, volumeIndex, unknown)]
209 +
dt * sourceGathered[unknown];
210#if defined(GPUOffloadingOff)
212 QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)]
213 == QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)],
217 QOutEnumerator(patchIndex, volumeIndex, unknown)
222#if defined(SharedOMP)
225 for (
int unknown = SolverType::NumberOfUnknowns;
227 < SolverType::NumberOfUnknowns + SolverType::NumberOfAuxiliaryVariables;
229 QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)] = QIn
230 [QInEnumerator(patchIndex, volumeIndex, unknown)];
231#if defined(GPUOffloadingOff)
233 QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)]
234 == QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)],
238 QOutEnumerator(patchIndex, volumeIndex, unknown)
245template <
class SolverType>
247 const double* __restrict__ QIn,
248 const enumerator::AoSLexicographicEnumerator& QInEnumerator,
249 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
250 const ::tarch::la::Vector<Dimensions, double>& patchSize,
252 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
255 double* __restrict__ QOut,
256 const enumerator::AoSLexicographicEnumerator& QOutEnumerator
258 SolverType::sourceTerm(
259 QIn + QInEnumerator(patchIndex, volumeIndex, 0),
263 QInEnumerator._numberOfDoFsPerAxisInCell,
266 getVolumeSize(patchSize, QInEnumerator._numberOfDoFsPerAxisInCell),
269 QOut + QOutEnumerator(patchIndex, volumeIndex, 0),
270 Solver::Offloadable::Yes
273#if defined(SharedOMP)
276 for (
int unknown = 0; unknown < SolverType::NumberOfUnknowns; unknown++) {
281 )] =
dt * QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)]
282 + QIn[QInEnumerator(patchIndex, volumeIndex, unknown)];
283#if defined(GPUOffloadingOff)
285 QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)]
286 == QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)],
290 QOutEnumerator(patchIndex, volumeIndex, unknown)
294#if defined(SharedOMP)
297 for (
int unknown = SolverType::NumberOfUnknowns;
299 < SolverType::NumberOfUnknowns + SolverType::NumberOfAuxiliaryVariables;
301 QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)] = QIn
302 [QInEnumerator(patchIndex, volumeIndex, unknown)];
303#if defined(GPUOffloadingOff)
305 QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)]
306 == QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)],
310 QOutEnumerator(patchIndex, volumeIndex, unknown)
318 int NumberOfUnknowns,
319 int NumberOfAuxiliaryVariables,
320 class QInEnumeratorType,
321 class EigenvaluesEnumeratorType>
323 const double* __restrict__ QIn,
324 const QInEnumeratorType& QInEnumerator,
325 const EigenvaluesFunctor& eigenvaluesFunctor,
326 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
327 const ::tarch::la::Vector<Dimensions, double>& patchSize,
329 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
333 double* __restrict__ eigenvalues,
334 const EigenvaluesEnumeratorType& eigenvaluesEnumerator
336 double QInGathered[NumberOfUnknowns + NumberOfAuxiliaryVariables]{0.0};
339#if defined(SharedOMP)
342 for (
int unknown = 0; unknown < NumberOfUnknowns + NumberOfAuxiliaryVariables;
344 QInGathered[unknown] = QIn[QInEnumerator(patchIndex, volumeIndex, unknown)];
352 QInEnumerator._numberOfDoFsPerAxisInCell,
355 getVolumeSize(patchSize, QInEnumerator._numberOfDoFsPerAxisInCell),
359 eigenvalues + eigenvaluesEnumerator(patchIndex, volumeIndex, 0)
364template <
int NumberOfUnknowns,
int NumberOfAuxiliaryVariables>
366 const double* __restrict__ QIn,
367 const enumerator::AoSLexicographicEnumerator& QInEnumerator,
368 const EigenvaluesFunctor& eigenvaluesFunctor,
369 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
370 const ::tarch::la::Vector<Dimensions, double>& patchSize,
372 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
376 double* __restrict__ eigenvalues,
377 const enumerator::AoSLexicographicEnumerator& eigenvaluesEnumerator
380 QIn + QInEnumerator(patchIndex, volumeIndex, 0),
384 QInEnumerator._numberOfDoFsPerAxisInCell,
387 getVolumeSize(patchSize, QInEnumerator._numberOfDoFsPerAxisInCell),
391 eigenvalues + eigenvaluesEnumerator(patchIndex, volumeIndex, 0)
398 class QInEnumeratorType,
399 class EigenvaluesEnumeratorType>
401 const double* __restrict__ QIn,
402 const QInEnumeratorType& QInEnumerator,
403 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
404 const ::tarch::la::Vector<Dimensions, double>& patchSize,
406 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
410 double* __restrict__ eigenvalues,
411 const EigenvaluesEnumeratorType& eigenvaluesEnumerator
414 [SolverType::NumberOfUnknowns + SolverType::NumberOfAuxiliaryVariables]{
418#if defined(SharedOMP)
421 for (
int unknown = 0;
423 < SolverType::NumberOfUnknowns + SolverType::NumberOfAuxiliaryVariables;
425 QInGathered[unknown] = QIn[QInEnumerator(patchIndex, volumeIndex, unknown)];
428 SolverType::eigenvalues(
433 QInEnumerator._numberOfDoFsPerAxisInCell,
436 getVolumeSize(patchSize, QInEnumerator._numberOfDoFsPerAxisInCell),
440 eigenvalues + eigenvaluesEnumerator(patchIndex, volumeIndex, 0),
441 Solver::Offloadable::Yes
446template <
class SolverType>
448 const double* __restrict__ QIn,
449 const enumerator::AoSLexicographicEnumerator& QInEnumerator,
450 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
451 const ::tarch::la::Vector<Dimensions, double>& patchSize,
453 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
457 double* __restrict__ eigenvalues,
458 const enumerator::AoSLexicographicEnumerator& eigenvaluesEnumerator
460 SolverType::eigenvalues(
461 QIn + QInEnumerator(patchIndex, volumeIndex, 0),
465 QInEnumerator._numberOfDoFsPerAxisInCell,
468 getVolumeSize(patchSize, QInEnumerator._numberOfDoFsPerAxisInCell),
472 eigenvalues + eigenvaluesEnumerator(patchIndex, volumeIndex, 0),
473 Solver::Offloadable::Yes
479 int NumberOfUnknowns,
480 int NumberOfAuxiliaryVariables,
481 class QInEnumeratorType,
482 class FluxEnumeratorType>
484 const double* __restrict__ QIn,
485 const QInEnumeratorType& QInEnumerator,
486 const FluxFunctor& fluxFunctor,
487 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
488 const ::tarch::la::Vector<Dimensions, double>& patchSize,
490 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
494 double* __restrict__ flux,
495 const FluxEnumeratorType& fluxEnumerator
497 double QInGathered[NumberOfUnknowns + NumberOfAuxiliaryVariables]{0.0};
498 double fluxGathered[NumberOfUnknowns]{0.0};
501#if defined(SharedOMP)
504 for (
int unknown = 0; unknown < NumberOfUnknowns + NumberOfAuxiliaryVariables;
506 QInGathered[unknown] = QIn[QInEnumerator(patchIndex, volumeIndex, unknown)];
514 QInEnumerator._numberOfDoFsPerAxisInCell,
517 getVolumeSize(patchSize, QInEnumerator._numberOfDoFsPerAxisInCell),
525#if defined(SharedOMP)
528 for (
int unknown = 0; unknown < NumberOfUnknowns; unknown++) {
529 flux[fluxEnumerator(patchIndex, volumeIndex, unknown)] = fluxGathered
535template <
int NumberOfUnknowns,
int NumberOfAuxiliaryVariables>
537 const double* __restrict__ QIn,
538 const enumerator::AoSLexicographicEnumerator& QInEnumerator,
539 const FluxFunctor& fluxFunctor,
540 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
541 const ::tarch::la::Vector<Dimensions, double>& patchSize,
543 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
547 double* __restrict__ flux,
548 const enumerator::AoSLexicographicEnumerator& fluxEnumerator
551 QIn + QInEnumerator(patchIndex, volumeIndex, 0),
555 QInEnumerator._numberOfDoFsPerAxisInCell,
558 getVolumeSize(patchSize, QInEnumerator._numberOfDoFsPerAxisInCell),
562 flux + fluxEnumerator(patchIndex, volumeIndex, 0)
567template <
class SolverType,
class QInEnumeratorType,
class FluxEnumeratorType>
569 const double* __restrict__ QIn,
570 const QInEnumeratorType& QInEnumerator,
571 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
572 const ::tarch::la::Vector<Dimensions, double>& patchSize,
574 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
578 double* __restrict__ flux,
579 const FluxEnumeratorType& fluxEnumerator
582 [SolverType::NumberOfUnknowns + SolverType::NumberOfAuxiliaryVariables]{
584 double fluxGathered[SolverType::NumberOfUnknowns]{0.0};
587#if defined(SharedOMP)
590 for (
int unknown = 0;
592 < SolverType::NumberOfUnknowns + SolverType::NumberOfAuxiliaryVariables;
594 QInGathered[unknown] = QIn[QInEnumerator(patchIndex, volumeIndex, unknown)];
602 QInEnumerator._numberOfDoFsPerAxisInCell,
605 getVolumeSize(patchSize, QInEnumerator._numberOfDoFsPerAxisInCell),
610 Solver::Offloadable::Yes
614#if defined(SharedOMP)
617 for (
int unknown = 0; unknown < SolverType::NumberOfUnknowns; unknown++) {
618 flux[fluxEnumerator(patchIndex, volumeIndex, unknown)] = fluxGathered
624template <
class SolverType,
class FluxEnumeratorType>
626 const double* __restrict__ QIn,
627 const enumerator::AoSLexicographicEnumerator& QInEnumerator,
628 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
629 const ::tarch::la::Vector<Dimensions, double>& patchSize,
631 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
635 double* __restrict__ flux,
636 const FluxEnumeratorType& fluxEnumerator
638 double fluxGathered[SolverType::NumberOfUnknowns]{0.0};
641 QIn + QInEnumerator(patchIndex, volumeIndex, 0),
645 QInEnumerator._numberOfDoFsPerAxisInCell,
648 getVolumeSize(patchSize, QInEnumerator._numberOfDoFsPerAxisInCell),
653 Solver::Offloadable::Yes
657#if defined(SharedOMP)
660 for (
int unknown = 0; unknown < SolverType::NumberOfUnknowns; unknown++) {
661 flux[fluxEnumerator(patchIndex, volumeIndex, unknown)] = fluxGathered
667template <
class SolverType>
669 const double* __restrict__ QIn,
670 const enumerator::AoSLexicographicEnumerator& QInEnumerator,
671 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
672 const ::tarch::la::Vector<Dimensions, double>& patchSize,
674 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
678 double* __restrict__ flux,
679 const enumerator::AoSLexicographicEnumerator& fluxEnumerator
682 QIn + QInEnumerator(patchIndex, volumeIndex, 0),
686 QInEnumerator._numberOfDoFsPerAxisInCell,
689 getVolumeSize(patchSize, QInEnumerator._numberOfDoFsPerAxisInCell),
693 flux + fluxEnumerator(patchIndex, volumeIndex, 0),
694 Solver::Offloadable::Yes
700 int NumberOfUnknowns,
701 int NumberOfAuxiliaryVariables,
702 class QInEnumeratorType,
703 class NCPFaceEnumeratorType>
705 const double* __restrict__ QIn,
706 const QInEnumeratorType& QInEnumerator,
707 const NonconservativeProductFunctor& ncpFunctor,
708 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
709 const ::tarch::la::Vector<Dimensions, double>& patchSize,
711 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
715 double* __restrict__ ncp,
716 const NCPFaceEnumeratorType& ncpEnumerator
718 double QAverage[NumberOfUnknowns + NumberOfAuxiliaryVariables]{0.0};
719 double DeltaQ[NumberOfUnknowns + NumberOfAuxiliaryVariables]{0.0};
720 double ncpGathered[NumberOfUnknowns]{0.0};
722 const ::tarch::la::Vector<Dimensions, int> leftAdjacentVolume =
volumeIndex;
724 rightAdjacentVolume(normal)++;
727#if defined(SharedOMP)
730 for (
int unknown = 0; unknown < NumberOfUnknowns + NumberOfAuxiliaryVariables;
733 = 0.5 * QIn[QInEnumerator(patchIndex, leftAdjacentVolume, unknown)]
734 + 0.5 * QIn[QInEnumerator(patchIndex, rightAdjacentVolume, unknown)];
735 DeltaQ[unknown] = QIn[QInEnumerator(patchIndex, rightAdjacentVolume, unknown)]
737 [QInEnumerator(patchIndex, leftAdjacentVolume, unknown)];
746 QInEnumerator._numberOfDoFsPerAxisInCell,
749 getVolumeSize(patchSize, QInEnumerator._numberOfDoFsPerAxisInCell),
757#if defined(SharedOMP)
760 for (
int unknown = 0; unknown < NumberOfUnknowns; unknown++) {
761 ncp[ncpEnumerator(patchIndex, volumeIndex, unknown)] = ncpGathered[unknown];
766template <
class SolverType,
class QInEnumeratorType,
class NCPFaceEnumeratorType>
768 const double* __restrict__ QIn,
769 const QInEnumeratorType& QInEnumerator,
770 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
771 const ::tarch::la::Vector<Dimensions, double>& patchSize,
773 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
777 double* __restrict__ ncp,
778 const NCPFaceEnumeratorType& ncpEnumerator
781 [SolverType::NumberOfUnknowns + SolverType::NumberOfAuxiliaryVariables]{
784 [SolverType::NumberOfUnknowns + SolverType::NumberOfAuxiliaryVariables]{
786 double ncpGathered[SolverType::NumberOfUnknowns]{0.0};
788 const ::tarch::la::Vector<Dimensions, int> leftAdjacentVolume =
volumeIndex;
790 rightAdjacentVolume(normal)++;
793#if defined(SharedOMP)
796 for (
int unknown = 0;
798 < SolverType::NumberOfUnknowns + SolverType::NumberOfAuxiliaryVariables;
801 = 0.5 * QIn[QInEnumerator(patchIndex, leftAdjacentVolume, unknown)]
802 + 0.5 * QIn[QInEnumerator(patchIndex, rightAdjacentVolume, unknown)];
803 DeltaQ[unknown] = QIn[QInEnumerator(patchIndex, rightAdjacentVolume, unknown)]
805 [QInEnumerator(patchIndex, leftAdjacentVolume, unknown)];
808 SolverType::nonconservativeProduct(
814 QInEnumerator._numberOfDoFsPerAxisInCell,
817 getVolumeSize(patchSize, QInEnumerator._numberOfDoFsPerAxisInCell),
822 Solver::Offloadable::Yes
826#if defined(SharedOMP)
829 for (
int unknown = 0; unknown < SolverType::NumberOfUnknowns; unknown++) {
830 ncp[ncpEnumerator(patchIndex, volumeIndex, unknown)] = ncpGathered[unknown];
835template <
class NCPFaceEnumeratorType,
class QOutEnumeratorType>
837 const double* __restrict__ ncpX,
838 const double* __restrict__ ncpY,
839 const double* __restrict__ ncpZ,
840 const NCPFaceEnumeratorType& ncpEnumerator,
841 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
842 const ::tarch::la::Vector<Dimensions, double>& patchSize,
844 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
847 double* __restrict__ QOut,
848 const QOutEnumeratorType& QOutEnumerator
850 auto updateAlongOneCoordinateDirection =
851 [=](
const double* __restrict__
ncp,
int normal) {
853 const ::tarch::la::Vector<Dimensions, int> rightFace =
volumeIndex;
860 const double ncpLeft = +
ncp[ncpEnumerator(patchIndex, leftFace, unknown)];
861 const double ncpRight = -
ncp[ncpEnumerator(
873 )] +=
dt / patchSize(normal) * QOutEnumerator._numberOfDoFsPerAxisInCell
874 * (-ncpLeft + ncpRight) * (0.5);
876#if defined(GPUOffloadingOff)
878 QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)]
879 == QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)],
887 QOutEnumerator(patchIndex, volumeIndex, unknown)
892 updateAlongOneCoordinateDirection(ncpX, 0);
893 updateAlongOneCoordinateDirection(ncpY, 1);
895 updateAlongOneCoordinateDirection(ncpZ, 2);
900template <
class NCPFaceEnumeratorType,
class QOutEnumeratorType>
902 const double* __restrict__ ncp,
903 const NCPFaceEnumeratorType& ncpEnumerator,
904 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
905 const ::tarch::la::Vector<Dimensions, double>& patchSize,
907 const ::tarch::la::Vector<Dimensions, int>& faceIndex,
911 double* __restrict__ QOut,
912 const QOutEnumeratorType& QOutEnumerator
914 const ::tarch::la::Vector<Dimensions, int> leftVolume = faceIndex;
916 rightVolume(normal)++;
918 if (leftVolume(normal) >= 0) {
923 )] -=
dt / patchSize(normal) * QOutEnumerator._numberOfDoFsPerAxisInCell
924 *
ncp[ncpEnumerator(patchIndex, faceIndex, unknown)] * 0.5;
926 if (rightVolume(normal) < QOutEnumerator._numberOfDoFsPerAxisInCell) {
931 )] -=
dt / patchSize(normal) * QOutEnumerator._numberOfDoFsPerAxisInCell
932 *
ncp[ncpEnumerator(patchIndex, faceIndex, unknown)] * 0.5;
937template <
int NumberOfUnknowns,
int NumberOfAuxiliaryVariables>
939 const double* __restrict__ QIn,
940 const enumerator::AoSLexicographicEnumerator& QInEnumerator,
941 const RiemannFunctor& riemannFunctor,
942 const double* __restrict__ flux,
943 const enumerator::AoSLexicographicEnumerator& fluxEnumerator,
944 const double* __restrict__ eigenvalues,
945 const enumerator::AoSLexicographicEnumerator& eigenvaluesEnumerator,
946 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
947 const ::tarch::la::Vector<Dimensions, double>& patchSize,
949 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
953 double* __restrict__ APDQ,
954 double* __restrict__ AMDQ,
955 const enumerator::AoSLexicographicEnumerator& DQEnumerator,
956 double* __restrict__ maxEigenvalue,
957 const enumerator::AoSLexicographicEnumerator& maxEigenvalueEnumerator
962 rightVolume(normal)++;
964 maxEigenvalue[maxEigenvalueEnumerator(patchIndex, leftVolume, 0)] = riemannFunctor(
965 QIn + QInEnumerator(patchIndex, rightVolume, 0),
966 QIn + QInEnumerator(patchIndex, leftVolume, 0),
967 flux + fluxEnumerator(patchIndex, rightVolume, 0),
968 flux + fluxEnumerator(patchIndex, leftVolume, 0),
969 eigenvalues + eigenvaluesEnumerator(patchIndex, rightVolume, 0),
970 eigenvalues + eigenvaluesEnumerator(patchIndex, leftVolume, 0),
974 QInEnumerator._numberOfDoFsPerAxisInCell,
980 QInEnumerator._numberOfDoFsPerAxisInCell,
983 getVolumeSize(patchSize, QInEnumerator._numberOfDoFsPerAxisInCell),
987 APDQ + DQEnumerator(patchIndex, leftVolume, 0),
988 AMDQ + DQEnumerator(patchIndex, leftVolume, 0)
993template <
class SolverType>
995 const double* __restrict__ QIn,
996 const enumerator::AoSLexicographicEnumerator& QInEnumerator,
997 const double* __restrict__ flux,
998 const enumerator::AoSLexicographicEnumerator& fluxEnumerator,
999 const double* __restrict__ eigenvalues,
1000 const enumerator::AoSLexicographicEnumerator& eigenvaluesEnumerator,
1001 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
1002 const ::tarch::la::Vector<Dimensions, double>& patchSize,
1004 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
1008 double* __restrict__ APDQ,
1009 double* __restrict__ AMDQ,
1010 const enumerator::AoSLexicographicEnumerator& DQEnumerator,
1011 double* __restrict__ maxEigenvalue,
1012 const enumerator::AoSLexicographicEnumerator& maxEigenvalueEnumerator
1017 rightVolume(normal)++;
1024 solveRiemannProblem(
1025 QIn + QInEnumerator(patchIndex, rightVolume, 0),
1026 QIn + QInEnumerator(patchIndex, leftVolume, 0),
1027 flux + fluxEnumerator(patchIndex, rightVolume, 0),
1028 flux + fluxEnumerator(patchIndex, leftVolume, 0),
1029 eigenvalues + eigenvaluesEnumerator(patchIndex, rightVolume, 0),
1030 eigenvalues + eigenvaluesEnumerator(patchIndex, leftVolume, 0),
1034 QInEnumerator._numberOfDoFsPerAxisInCell,
1040 QInEnumerator._numberOfDoFsPerAxisInCell,
1043 getVolumeSize(patchSize, QInEnumerator._numberOfDoFsPerAxisInCell),
1047 APDQ + DQEnumerator(patchIndex, leftVolume, 0),
1048 AMDQ + DQEnumerator(patchIndex, leftVolume, 0),
1049 Solver::Offloadable::Yes
1054template <
class RiemannEnumeratorType,
class QOutEnumeratorType>
1056 const double* __restrict__ leftUpdatesX,
1057 const double* __restrict__ rightUpdatesX,
1058 const double* __restrict__ belowUpdatesY,
1059 const double* __restrict__ aboveUpdatesY,
1060 const double* __restrict__ backwardUpdatesZ,
1061 const double* __restrict__ forwardUpdatesZ,
1062 const RiemannEnumeratorType& riemannEnumerator,
1069 double* __restrict__ QOut,
1070 const QOutEnumeratorType& QOutEnumerator
1072 auto updateAlongOneDirection =
1074 const double* __restrict__ leftUpdates,
1075 const double* __restrict__ rightUpdates,
1080 leftVolume(normal)--;
1082 const double fluxPos = rightUpdates
1083 [riemannEnumerator(patchIndex, leftVolume, unknown)];
1084 const double fluxNeg = leftUpdates
1085 [riemannEnumerator(patchIndex, rightVolume, unknown)];
1087 QOut[QOutEnumerator(
1091 )] -=
dt / patchSize(normal) * QOutEnumerator._numberOfDoFsPerAxisInCell
1092 * (fluxNeg - fluxPos);
1095 updateAlongOneDirection(leftUpdatesX, rightUpdatesX, 0);
1096 updateAlongOneDirection(belowUpdatesY, aboveUpdatesY, 1);
1098 updateAlongOneDirection(backwardUpdatesZ, forwardUpdatesZ, 2);
1104 const double* __restrict__ maxEigenvalueX,
1105 const double* __restrict__ maxEigenvalueY,
1106 const double* __restrict__ maxEigenvalueZ,
1111 double result = 0.0;
1114 maxEigenvalueX[maxEigenvalueEnumerator(patchIndex,
volumeIndex, 0)]
1118 maxEigenvalueY[maxEigenvalueEnumerator(patchIndex,
volumeIndex, 0)]
1123 maxEigenvalueZ[maxEigenvalueEnumerator(patchIndex,
volumeIndex, 0)]
#define assertion4(expr, param0, param1, param2, param3)
#define assertion8(expr, param0, param1, param2, param3, param4, param5, param6, param7)
KeywordToAvoidDuplicateSymbolsForInlinedFunctions double maxEigenvalue(const double *const Q, int normal, const double CCZ4e, const double CCZ4ds, const double CCZ4GLMc, const double CCZ4GLMd) InlineMethod
KeywordToAvoidDuplicateSymbolsForInlinedFunctions void copySolutionAndAddSourceTerm(const double *__restrict__ QIn, const QInEnumeratorType &QInEnumerator, const SourceFunctor &sourceFunctor, 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__ QOut, const QOutEnumeratorType &QOutEnumerator) InlineMethod
KeywordToAvoidDuplicateSymbolsForInlinedFunctions GPUCallableInlineMethod void updateSolutionWithNonconservativeFlux(const double *__restrict__ ncpX, const double *__restrict__ ncpY, const double *__restrict__ ncpZ, const NCPFaceEnumeratorType &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
KeywordToAvoidDuplicateSymbolsForInlinedFunctions double reduceMaxEigenvalue(const double *__restrict__ maxEigenvalueX, const double *__restrict__ maxEigenvalueY, const double *__restrict__ maxEigenvalueZ, enumerator::AoSLexicographicEnumerator maxEigenvalueEnumerator, int patchIndex, const tarch::la::Vector< Dimensions, int > &volumeIndex) InlineMethod
KeywordToAvoidDuplicateSymbolsForInlinedFunctions void computeRiemannSolution(const double *__restrict__ QIn, const enumerator::AoSLexicographicEnumerator &QInEnumerator, const RiemannFunctor &riemannFunctor, const double *__restrict__ flux, const enumerator::AoSLexicographicEnumerator &fluxEnumerator, const double *__restrict__ eigenvalues, const enumerator::AoSLexicographicEnumerator &eigenvaluesEnumerator, 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__ APDQ, double *__restrict__ AMDQ, const enumerator::AoSLexicographicEnumerator &DQEnumerator, double *__restrict__ maxEigenvalue, const enumerator::AoSLexicographicEnumerator &maxEigenvalueEnumerator) InlineMethod
KeywordToAvoidDuplicateSymbolsForInlinedFunctions void computeEigenvalues(const double *__restrict__ QIn, const QInEnumeratorType &QInEnumerator, const EigenvaluesFunctor &eigenvaluesFunctor, 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__ eigenvalues, const EigenvaluesEnumeratorType &eigenvaluesEnumerator) InlineMethod
KeywordToAvoidDuplicateSymbolsForInlinedFunctions void updateSolutionWithRiemannSolution(const double *__restrict__ leftUpdatesX, const double *__restrict__ rightUpdatesX, const double *__restrict__ belowUpdatesY, const double *__restrict__ aboveUpdatesY, const double *__restrict__ backwardUpdatesZ, const double *__restrict__ forwardUpdatesZ, const RiemannEnumeratorType &riemannEnumerator, 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
KeywordToAvoidDuplicateSymbolsForInlinedFunctions void computeFlux(const double *__restrict__ QIn, const QInEnumeratorType &QInEnumerator, const FluxFunctor &fluxFunctor, 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__ flux, const FluxEnumeratorType &fluxEnumerator) InlineMethod
KeywordToAvoidDuplicateSymbolsForInlinedFunctions void computeNonconservativeFlux(const double *__restrict__ QIn, const QInEnumeratorType &QInEnumerator, const NonconservativeProductFunctor &ncpFunctor, 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__ ncp, const NCPFaceEnumeratorType &ncpEnumerator) InlineMethod
auto volumeIndex(Args... args)
Array of struct enumerator.