14 bool evaluateNonconservativeProduct,
16 bool evaluatePointSources
34 for (
int currentCell=0; currentCell<cellData.
numberOfCells; currentCell++) {
35 const double* __restrict__ cellQin = cellData.
QIn[currentCell];
36 double* __restrict__ cellQout = cellData.
QOut[currentCell];
39 const double t = cellData.
t[currentCell];
40 const double dt = cellData.
dt[currentCell];
42 const int nodesPerAxis = order+1;
43 const int strideQ=unknowns+auxiliaryVariables;
46 dfor( dof, order+1 ) {
47 double fluxValues[unknowns];
48 double sourceValues[unknowns];
49 double gradientValues[(unknowns+auxiliaryVariables)];
50 double ncpValues[unknowns];
52 for(
int var=0; var<unknowns; var++){
53 cellQout[enumeratorOut(currentCell,dof,var)] = 0.0;
58 for(
int dim=0; dim<Dimensions; dim++)
59 for(
int i=0; i<nodesPerAxis; i++){
62 contributingNodeIndex[dim] = i;
66 contributingNodeIndex,
68 Solver::QuadraturePoints1d);
71 &cellQin[enumeratorIn(currentCell, contributingNodeIndex, 0)],
77 Solver::Offloadable::Yes
81 double coeff = Solver::StiffnessOperator1d[i+dof(dim)*nodesPerAxis];
82 for (
int dd=0; dd<Dimensions; dd++) {
83 coeff *= (dd==dim) ? 1.0 : Solver::MassMatrixDiagonal1d[ dof(dd) ] * h(dd);
86 for(
int var=0; var<unknowns; var++){
87 cellQout[enumeratorOut(currentCell, dof, var)] += coeff * fluxValues[var];
99 Solver::QuadraturePoints1d);
103 &cellQin[enumeratorIn(currentCell, dof, 0)],
108 Solver::Offloadable::Yes
112 double coeff = Solver::MassMatrixDiagonal1d[ dof(0) ] * Solver::MassMatrixDiagonal1d[ dof(1) ] *
tarch::la::volume(h);
114 double coeff = Solver::MassMatrixDiagonal1d[ dof(0) ] * Solver::MassMatrixDiagonal1d[ dof(1) ] * Solver::MassMatrixDiagonal1d[ dof(2) ] *
tarch::la::volume(h);
117 for(
int var=0; var<unknowns; var++){
118 cellQout[enumeratorOut(currentCell, dof, var)] += coeff * sourceValues[var];
124 if (evaluateNonconservativeProduct) {
131 Solver::QuadraturePoints1d);
134 for (
int dd=0; dd<Dimensions; dd++) {
135 coeff *= Solver::MassMatrixDiagonal1d[ dof(dd) ] * h(dd);
138 for(
int dim=0; dim<Dimensions; dim++) {
140 std::fill(gradientValues, &gradientValues[strideQ-1], 0.0);
142 const int invDx = 1 / h(dim);
145 for(
int node=0; node<nodesPerAxis; node++){
147 contributingNodeIndex[dim] = node;
148 const double coeffDerivative = invDx * Solver::DerivativeOperator1d[node + nodesPerAxis*dof(dim)];
150 for(
int var=0; var<strideQ; var++){
151 gradientValues[var] += coeffDerivative * cellQin[enumeratorIn(currentCell, contributingNodeIndex, var)];
152 assertion(gradientValues[var]==gradientValues[var]);
157 Solver::nonconservativeProduct(
158 &cellQin[enumeratorIn(currentCell, dof, 0)],
165 Solver::Offloadable::Yes
168 for(
int var=0; var<unknowns; var++){
169 assertion(ncpValues[var]==ncpValues[var]);
170 cellQout[enumeratorOut(currentCell, dof, var)] -= coeff * ncpValues[var];
tarch::la::Vector< Dimensions, double > getQuadraturePoint(const tarch::la::Vector< Dimensions, double > &cellCentre, const tarch::la::Vector< Dimensions, double > &cellSize, const tarch::la::Vector< Dimensions, int > &index, int polynomialOrder, const T *__restrict__ quadraturePoints)
Construct location of a quadrature point.