Peano
Loading...
Searching...
No Matches
Average.cpp
Go to the documentation of this file.
1#include "Average.h"
3#include "peano4/utils/Loop.h"
4
5
10 double t,
11 double dt,
12 int order,
13 int unknowns,
14 int auxiliaryVariables,
15 int faceNumber,
16 const double* __restrict__ quadraturePoints,
17 bool useFlux,
18 const double* __restrict__ projectedValues,
19 double* __restrict__ solution
20) {
21 tarch::la::Vector<Dimensions,double> faceOffset = faceCentre - 0.5 * cellSize;
22 faceOffset(faceNumber%Dimensions) += 0.5 * cellSize(faceNumber%Dimensions);
23
24 exahype2::enumerator::FaceAoSLexicographicEnumerator inputEnumerator (faceNumber,order+1,1,unknowns,auxiliaryVariables);
25 exahype2::enumerator::FaceAoSLexicographicEnumerator outputEnumerator(faceNumber,order+1,1,unknowns,0);
26
27 double* averageQ = new double[unknowns+auxiliaryVariables];
28
29 dfore(dof,order+1,faceNumber % Dimensions,0) {
31 for (int d=0; d<Dimensions; d++) {
32 x(d) = faceOffset(d);
33 x(d) += (d==faceNumber % Dimensions) ? 0.0 : quadraturePoints[dof(d)] * cellSize(d);
34 }
35
38
39 leftDoF(faceNumber % Dimensions) = 0;
40 rightDoF(faceNumber % Dimensions) = 1;
41
42 //initialize solution to 0
43 for(int var=0; var<unknowns; var++){
44 solution[ outputEnumerator(leftDoF,var) ] = 0.0;
45 solution[ outputEnumerator(rightDoF,var) ] = 0.0;
46 }
47
48 for(int var=0; var<unknowns+auxiliaryVariables; var++){
49 averageQ[ var ] = 0.5 * projectedValues[ inputEnumerator(rightDoF,var) ]
50 + 0.5 * projectedValues[ inputEnumerator(leftDoF,var) ];
51 }
52
53/*
54 if(useFlux){
55 flux( projectedValues + inputEnumerator( leftDoF, 0 ),
56 x,
57 t,
58 dt,
59 faceNumber%Dimensions, //normal
60 fluxValuesLeft);
61 flux( projectedValues + inputEnumerator (rightDoF, 0),
62 x,
63 t,
64 dt,
65 faceNumber%Dimensions, //normal
66 fluxValuesRight);
67
68 for(int var=0; var<unknowns; var++){
69 solution[ outputEnumerator(leftDoF,var) ] -= 0.5 * (fluxValuesLeft[var]+fluxValuesRight[var]);
70 solution[ outputEnumerator(rightDoF,var) ] += 0.5 * (fluxValuesLeft[var]+fluxValuesRight[var]);
71 }
72 }
73*/
74
75/*
76 if(useNcp){
77 nonConservativeProduct(
78 averageQ,
79 deltaQ,
80 x, //TODO: add positioning
81 t,
82 dt,
83 faceNumber%Dimensions, //normal
84 ncpValues);
85
86 for(int var=0; var<unknowns; var++){
87 // ++ and -- make no difference both yield reflections after a while
88 //solution[ outputEnumerator(leftDoF,var) ] += 0.5 * deltaQ[var] * ncpValues[var];
89 //solution[ outputEnumerator(rightDoF,var) ] += 0.5 * deltaQ[var] * ncpValues[var];
90 solution[ outputEnumerator(leftDoF,var) ] += 0.5 * deltaQ[var] * ncpValues[var];
91 solution[ outputEnumerator(rightDoF,var) ] -= 0.5 * deltaQ[var] * ncpValues[var];
92 }
93 }
94*/
95 }
96
97 delete[] averageQ;
98}
#define dfore(counter, max, dim, value)
This is an exclusive d-dimensional for loop.
Definition Loop.h:942
void solveRiemannProblem_pointwise_in_situ(::exahype2::dg::Flux flux, const tarch::la::Vector< Dimensions, double > &faceCentre, const tarch::la::Vector< Dimensions, double > &cellSize, double t, double dt, int order, int unknowns, int auxiliaryVariables, int faceNumber, const double *__restrict__ quadraturePoints, bool useFlux, const double *__restrict__ projectedValues, double *__restrict__ solution)
Solve Riemann problem on face.
Definition Average.cpp:6
std::function< void(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &x, double t, double dt, int normal, double *__restrict__ F) Flux)
Flux functor.
Definition Functors.h:44
Simple vector class.
Definition Vector.h:150