14 const double* __restrict__ InterpolationMatrix1d,
15 const double* __restrict__ coarseGridFaceQ,
16 double* __restrict__ fineGridFaceQ
19 marker.getSelectedFaceNumber(),
27 const int totalNumberOfValues = (order+1) * 2 * unknowns;
28 const int InterpolationMatrixDimensions = (order+1);
30 const int totalNumberOfValues = (order+1) * (order+1) * 2 * unknowns;
31 const int InterpolationMatrixDimensions = (order+1)*(order+1);
33 std::fill_n( fineGridFaceQ, totalNumberOfValues, 0.0 );
35 const int normal = marker.getSelectedFaceNumber()%Dimensions;
36 dfore(fineGridDoF,order+1,normal,0) {
37 dfore(coarseGridDoF,order+1,normal,0) {
38 double tensorProductWeight = 1.0;
39 for (
int d=0; d<Dimensions; d++) {
41 int subMatrix = marker.getRelativePositionWithinFatherCell()(d);
45 int col = fineGridDoF(d);
46 int row = coarseGridDoF(d);
47 int linearisedMatrixIndex = subMatrix * InterpolationMatrixDimensions * InterpolationMatrixDimensions
48 + row * InterpolationMatrixDimensions
51 assertion2(linearisedMatrixIndex<3, linearisedMatrixIndex, InterpolationMatrixDimensions);
52 tensorProductWeight *= InterpolationMatrix1d[linearisedMatrixIndex];
58 for (
int leftRight=0; leftRight<2; leftRight++)
59 for (
int unknown=0; unknown<unknowns; unknown++) {
60 shiftedFineGridDoF(normal) = leftRight;
61 shiftedCoarseGridDoF(normal) = leftRight;
63 fineGridFaceQ[ faceEnumerator(shiftedFineGridDoF,unknown) ] += tensorProductWeight * coarseGridFaceQ[ faceEnumerator(shiftedCoarseGridDoF,unknown) ];
72 int numberOfProjectedQuantities,
74 int auxiliaryVariables,
75 const double* __restrict__ RestrictionMatrix1d,
76 const double* __restrict__ fineGridFaceQ,
77 double* __restrict__ coarseGridFaceQ
79 assertion(numberOfProjectedQuantities>=1);
84 marker.getSelectedFaceNumber(),
86 numberOfProjectedQuantities,
92 [[maybe_unused]]
const int totalNumberOfValues = (order+1) * (numberOfProjectedQuantities*2) * (unknowns+auxiliaryVariables);
93 const int RestrictionMatrixDimensions = (order+1);
95 [[maybe_unused]]
const int totalNumberOfValues = (order+1) * (order+1) * (numberOfProjectedQuantities*2) * (unknowns+auxiliaryVariables);
96 const int RestrictionMatrixDimensions = (order+1)*(order+1);
99 const int normal = marker.getSelectedFaceNumber()%Dimensions;
100 const int leftRightFace = marker.getSelectedFaceNumber() < Dimensions ? 1 : 0;
101 dfore(fineGridDoF,order+1,normal,0) {
102 dfore(coarseGridDoF,order+1,normal,0) {
103 double tensorProductWeight = 1.0;
104 for (
int d=0; d<Dimensions; d++) {
106 int subMatrix = marker.getRelativePositionWithinFatherCell()(d);
110 int row = fineGridDoF(d);
111 int col = coarseGridDoF(d);
112 int linearisedMatrixIndex = subMatrix * RestrictionMatrixDimensions * RestrictionMatrixDimensions
113 + row * RestrictionMatrixDimensions
116 assertion2(linearisedMatrixIndex<3, linearisedMatrixIndex, RestrictionMatrixDimensions);
117 tensorProductWeight *= RestrictionMatrix1d[linearisedMatrixIndex];
123 for (
int leftRight=leftRightFace * numberOfProjectedQuantities; leftRight<(leftRightFace+1)*numberOfProjectedQuantities; leftRight++)
124 for (
int unknown=0; unknown<unknowns+auxiliaryVariables; unknown++) {
125 shiftedFineGridDoF(normal) = leftRight;
126 shiftedCoarseGridDoF(normal) = leftRight;
128 assertion( faceEnumerator(shiftedCoarseGridDoF,unknown)>=0 );
129 assertion( faceEnumerator(shiftedFineGridDoF,unknown)>=0 );
131 coarseGridFaceQ[ faceEnumerator(shiftedCoarseGridDoF,unknown) ] += tensorProductWeight * fineGridFaceQ[ faceEnumerator(shiftedFineGridDoF,unknown) ];
168 [[maybe_unused]]
const double* __restrict__ cellQ,
169 [[maybe_unused]]
int order,
170 [[maybe_unused]]
int unknowns,
171 [[maybe_unused]]
int auxiliaryVariables,
172 [[maybe_unused]]
const double*
const __restrict__ BasisFunctionValuesLeft,
173 [[maybe_unused]]
double*
const __restrict__ faceQLeft,
174 [[maybe_unused]]
double*
const __restrict__ faceQRight,
175 [[maybe_unused]]
double*
const __restrict__ faceQBottom,
176 [[maybe_unused]]
double*
const __restrict__ faceQUp
184 for (
int y=0; y<order+1; y++) {
187 for (
int unknown=0; unknown<unknowns+auxiliaryVariables; unknown++) {
188 faceQLeft [ leftRightFaceEnumerator(left,unknown) ] = 0.0;
189 faceQRight[ leftRightFaceEnumerator(right,unknown) ] = 0.0;
192 for (
int y=0; y<order+1; y++) {
195 for (
int x=0; x<order+1; x++) {
196 for (
int unknown=0; unknown<unknowns+auxiliaryVariables; unknown++) {
197 faceQLeft [ leftRightFaceEnumerator(left,unknown) ] += BasisFunctionValuesLeft[x] * cellQ[ cellEnumerator(0,{x,y},unknown) ];
198 faceQRight[ leftRightFaceEnumerator(right,unknown) ] += BasisFunctionValuesLeft[order-x] * cellQ[ cellEnumerator(0,{x,y},unknown) ];
202 for (
int x=0; x<order+1; x++) {
205 for (
int unknown=0; unknown<unknowns+auxiliaryVariables; unknown++) {
206 faceQBottom [ bottomTopFaceEnumerator(bottom,unknown) ] = 0.0;
207 faceQUp [ bottomTopFaceEnumerator(up,unknown) ] = 0.0;
210 for (
int x=0; x<order+1; x++) {
213 for (
int y=0; y<order+1; y++) {
214 for (
int unknown=0; unknown<unknowns+auxiliaryVariables; unknown++) {
215 faceQBottom [ bottomTopFaceEnumerator(bottom,unknown) ] += BasisFunctionValuesLeft[y] * cellQ[ cellEnumerator(0,{x,y},unknown) ];
216 faceQUp [ bottomTopFaceEnumerator(up,unknown) ] += BasisFunctionValuesLeft[order-y] * cellQ[ cellEnumerator(0,{x,y},unknown) ];
222 [[maybe_unused]]
const double* __restrict__ cellQ,
223 [[maybe_unused]]
int order,
224 [[maybe_unused]]
int unknowns,
225 [[maybe_unused]]
int auxiliaryVariables,
226 [[maybe_unused]]
const double*
const __restrict__ BasisFunctionValuesLeft,
227 [[maybe_unused]]
double*
const __restrict__ faceQLeft,
228 [[maybe_unused]]
double*
const __restrict__ faceQRight,
229 [[maybe_unused]]
double*
const __restrict__ faceQBottom,
230 [[maybe_unused]]
double*
const __restrict__ faceQUp,
231 [[maybe_unused]]
double*
const __restrict__ faceQFront,
232 [[maybe_unused]]
double*
const __restrict__ faceQBack
241 for (
int y=0; y<order+1; y++) {
242 for (
int z=0; z<order+1; z++) {
245 for (
int unknown=0; unknown<unknowns+auxiliaryVariables; unknown++) {
246 faceQLeft [ leftRightFaceEnumerator(left,unknown) ] = 0.0;
247 faceQRight [ leftRightFaceEnumerator(right,unknown) ] = 0.0;
250 for (
int y=0; y<order+1; y++) {
251 for (
int z=0; z<order+1; z++) {
254 for (
int x=0; x<order+1; x++) {
255 for (
int unknown=0; unknown<unknowns+auxiliaryVariables; unknown++) {
256 faceQLeft [ leftRightFaceEnumerator(left,unknown) ] += BasisFunctionValuesLeft[x] * cellQ[ cellEnumerator(0,{x,y,z},unknown) ];
257 faceQRight [ leftRightFaceEnumerator(right,unknown) ] += BasisFunctionValuesLeft[order-x] * cellQ[ cellEnumerator(0,{x,y,z},unknown) ];
261 for (
int x=0; x<order+1; x++) {
262 for (
int z=0; z<order+1; z++) {
265 for (
int unknown=0; unknown<unknowns+auxiliaryVariables; unknown++) {
266 faceQBottom [ bottomTopFaceEnumerator(bottom,unknown) ] = 0.0;
267 faceQUp [ bottomTopFaceEnumerator(up,unknown) ] = 0.0;
270 for (
int x=0; x<order+1; x++) {
271 for (
int z=0; z<order+1; z++) {
274 for (
int y=0; y<order+1; y++) {
275 for (
int unknown=0; unknown<unknowns+auxiliaryVariables; unknown++) {
276 faceQBottom [ bottomTopFaceEnumerator(bottom,unknown) ] += BasisFunctionValuesLeft[y] * cellQ[ cellEnumerator(0,{x,y,z},unknown) ];
277 faceQUp [ bottomTopFaceEnumerator(up,unknown) ] += BasisFunctionValuesLeft[order-y] * cellQ[ cellEnumerator(0,{x,y,z},unknown) ];
281 for (
int x=0; x<order+1; x++) {
282 for (
int y=0; y<order+1; y++) {
285 for (
int unknown=0; unknown<unknowns+auxiliaryVariables; unknown++) {
286 faceQFront [ frontBackFaceEnumerator(front,unknown) ] = 0.0;
287 faceQBack [ frontBackFaceEnumerator(back,unknown) ] = 0.0;
290 for (
int x=0; x<order+1; x++) {
291 for (
int y=0; y<order+1; y++) {
294 for (
int z=0; z<order+1; z++) {
295 for (
int unknown=0; unknown<unknowns+auxiliaryVariables; unknown++) {
296 faceQFront [ frontBackFaceEnumerator(front,unknown) ] += BasisFunctionValuesLeft[z] * cellQ[ cellEnumerator(0,{x,y,z},unknown) ];
297 faceQBack [ frontBackFaceEnumerator(back,unknown) ] += BasisFunctionValuesLeft[order-z] * cellQ[ cellEnumerator(0,{x,y,z},unknown) ];
333 [[maybe_unused]]
const double*
const __restrict__ faceQLeft,
334 [[maybe_unused]]
const double*
const __restrict__ faceQRight,
335 [[maybe_unused]]
const double*
const __restrict__ faceQBottom,
336 [[maybe_unused]]
const double*
const __restrict__ faceQUp,
337 [[maybe_unused]]
int order,
338 [[maybe_unused]]
int unknowns,
339 [[maybe_unused]]
const int auxiliaryVariables,
341 [[maybe_unused]]
const double*
const __restrict__ BasisFunctionValuesLeft,
342 [[maybe_unused]]
const double* __restrict__ MassMatrixDiagonal1d,
343 [[maybe_unused]]
double* __restrict__ cellQ
346 [[maybe_unused]]
const int strideQ = unknowns + auxiliaryVariables;
361 dfor( dof, order+1 ) {
362 const double coeffLeft = MassMatrixDiagonal1d[dof[1]]*BasisFunctionValuesLeft[dof[0]] * cellSize(1);
363 const double coeffRight = MassMatrixDiagonal1d[dof[1]]*BasisFunctionValuesLeft[order-dof[0]] * cellSize(1);
365 const double coeffBottom = MassMatrixDiagonal1d[dof[0]]*BasisFunctionValuesLeft[dof[1]] * cellSize(0);
366 const double coeffUp = MassMatrixDiagonal1d[dof[0]]*BasisFunctionValuesLeft[order-dof[1]] * cellSize(0);
378 for(
int var=0; var<unknowns; var++) {
379 cellQ[ QEnumerator(0,dof,var) ] +=
380 coeffLeft * faceQLeft [leftFaceEnumerator( leftDoF, var)]
381 - coeffRight * faceQRight [rightFaceEnumerator( rightDoF, var)]
382 + coeffBottom * faceQBottom [bottomFaceEnumerator(bottomDoF,var)]
383 - coeffUp * faceQUp [upperFaceEnumerator( upperDoF, var)];
390 [[maybe_unused]]
const double*
const __restrict__ faceQLeft,
391 [[maybe_unused]]
const double*
const __restrict__ faceQRight,
392 [[maybe_unused]]
const double*
const __restrict__ faceQBottom,
393 [[maybe_unused]]
const double*
const __restrict__ faceQUp,
394 [[maybe_unused]]
const double*
const __restrict__ faceQFront,
395 [[maybe_unused]]
const double*
const __restrict__ faceQBack,
396 [[maybe_unused]]
int order,
397 [[maybe_unused]]
int unknowns,
398 [[maybe_unused]]
const int auxiliaryVariables,
400 [[maybe_unused]]
const double*
const __restrict__ BasisFunctionValuesLeft,
401 [[maybe_unused]]
const double* __restrict__ MassMatrixDiagonal1d,
402 [[maybe_unused]]
double* __restrict__ cellQ
420 dfor( dof, order+1 ) {
422 const double coeffLeft = BasisFunctionValuesLeft[dof[0]] * MassMatrixDiagonal1d[dof[1]] * MassMatrixDiagonal1d[dof[2]] * cellSize(1) * cellSize(2);
423 const double coeffRight = BasisFunctionValuesLeft[order-dof[0]] * MassMatrixDiagonal1d[dof[1]] * MassMatrixDiagonal1d[dof[2]] * cellSize(1) * cellSize(2);
425 const double coeffBottom = MassMatrixDiagonal1d[dof[0]] * BasisFunctionValuesLeft[dof[1]] * MassMatrixDiagonal1d[dof[2]] * cellSize(0) * cellSize(2);
426 const double coeffUp = MassMatrixDiagonal1d[dof[0]] * BasisFunctionValuesLeft[order-dof[1]] * MassMatrixDiagonal1d[dof[2]] * cellSize(0) * cellSize(2);
428 const double coeffFront = MassMatrixDiagonal1d[dof[0]] * MassMatrixDiagonal1d[dof[1]] * BasisFunctionValuesLeft[dof[2]] * cellSize(0) * cellSize(1);
429 const double coeffBack = MassMatrixDiagonal1d[dof[0]] * MassMatrixDiagonal1d[dof[1]] * BasisFunctionValuesLeft[order-dof[2]] * cellSize(0) * cellSize(1);
445 for(
int var=0; var<unknowns; var++) {
446 cellQ[ QEnumerator(0,dof,var) ] +=
447 + coeffLeft * faceQLeft [leftFaceEnumerator (leftDoF, var)]
448 - coeffRight * faceQRight [rightFaceEnumerator (rightDoF, var)]
449 + coeffBottom * faceQBottom [bottomFaceEnumerator(bottomDoF,var)]
450 - coeffUp * faceQUp [upperFaceEnumerator (upperDoF, var)]
451 + coeffFront * faceQFront [frontFaceEnumerator (frontDoF, var)]
452 - coeffBack * faceQBack [backFaceEnumerator (backDoF, var)];
void restrictAndAccumulateProjectedFacePolynomial(const peano4::datamanagement::FaceMarker &marker, int order, int numberOfProjectedQuantities, int unknowns, int auxiliaryVariables, const double *__restrict__ RestrictionMatrix1d, const double *__restrict__ fineGridFaceQ, double *__restrict__ coarseGridFaceQ)
Counterpart of interpolateRiemannSolution().
void clearSolutionProjection(int order, int unknowns, int auxiliaryVariables, int numberOfProjectedQuantities, double *__restrict__ faceQ)
Set the whole solution projection on the face from left and right to zero.
void projectVolumetricDataAndGradientOntoFaces(const double *__restrict__ cellQ, int order, int unknowns, int auxiliaryVariables, const double *const __restrict__ BasisFunctionValuesLeft, double *const __restrict__ faceQLeft, double *const __restrict__ faceQRight, double *const __restrict__ faceQBottom, double *const __restrict__ faceQUp)
void projectVolumetricDataOntoFaces(const double *__restrict__ cellQ, int order, int unknowns, int auxiliaryVariables, const double *const __restrict__ BasisFunctionValuesLeft, double *const __restrict__ faceQLeft, double *const __restrict__ faceQRight, double *const __restrict__ faceQBottom, double *const __restrict__ faceQUp)
Take polynomial within cell and project it onto the faces.
void interpolateRiemannSolution(const peano4::datamanagement::FaceMarker &marker, int order, int unknowns, const double *__restrict__ InterpolationMatrix1d, const double *__restrict__ coarseGridFaceQ, double *__restrict__ fineGridFaceQ)
void integrateOverRiemannSolutionsAndAddToVolume_GaussLegendre(const double *const __restrict__ faceQLeft, const double *const __restrict__ faceQRight, const double *const __restrict__ faceQBottom, const double *const __restrict__ faceQUp, int order, int unknowns, const int auxiliaryVariables, const tarch::la::Vector< 2, double > &cellSize, const double *const __restrict__ BasisFunctionValuesLeft, const double *__restrict__ MassMatrixDiagonal1d, double *__restrict__ cellQ)
Given a numerical flux at the various faces, this computes and adds the Riemann integral of this flux...