17 const double* __restrict__ Qinside,
18 double * __restrict__ Qoutside,
24 ) > boundaryCondition,
29 int numberOfGridCellsPerPatchPerAxis,
31 int unknownsPlusAuxiliaryVariables,
33 double* __restrict__ Q
36 logTraceInWith4Arguments(
"applyBoundaryConditions(...)", faceCentre, patchSize, numberOfGridCellsPerPatchPerAxis, faceNumber);
40 numberOfGridCellsPerPatchPerAxis,
42 unknownsPlusAuxiliaryVariables,
48 faceOffset(faceNumber%Dimensions) += 0.5 * patchSize(faceNumber%Dimensions);
50 dfore(volume,numberOfGridCellsPerPatchPerAxis,faceNumber % Dimensions,0) {
55 x(faceNumber%Dimensions) -= 0.5 * volumeH(faceNumber%Dimensions);
57 for (
int layer=0; layer<overlap; layer++) {
58 if (faceNumber<Dimensions) {
59 insideGridCell(faceNumber % Dimensions) = overlap-layer;
60 outsideGridCell(faceNumber % Dimensions) = overlap-1-layer;
63 insideGridCell(faceNumber % Dimensions) = layer+overlap-1;
64 outsideGridCell(faceNumber % Dimensions) = layer+overlap;
68 "applyBoundaryConditions(...)",
69 faceCentre <<
" x " << faceNumber <<
": " <<
70 insideGridCell <<
"->" << outsideGridCell <<
" (" << enumerator(insideGridCell,0) <<
"->" << enumerator(outsideGridCell,0) <<
"): " <<
71 *(Q + enumerator(insideGridCell,0))
75 Q + enumerator(insideGridCell,0),
76 Q + enumerator(outsideGridCell,0),
77 x, volumeH, t, dt, faceNumber
87 std::function<
double(
88 const double* __restrict__ Q,
96 double* __restrict__ Q,
104 int numberOfGridCellsPerPatchPerAxis,
106 int numberOfUnknowns,
107 int numberOfAuxiliaryVariables,
110 double* __restrict__ Qold,
111 double* __restrict__ Qnew,
112 double CheckpointTimeStamp
115 logTraceInWith4Arguments(
"applySommerfeldConditions(...)", faceCentre, patchSize, numberOfGridCellsPerPatchPerAxis, faceNumber);
116 std::cout<<std::setprecision(8);
120 numberOfGridCellsPerPatchPerAxis,
122 numberOfUnknowns+numberOfAuxiliaryVariables,
130 faceOffset(faceNumber%Dimensions) += 0.5 * patchSize(faceNumber%Dimensions);
133 dfore(volume,numberOfGridCellsPerPatchPerAxis,faceNumber % Dimensions,0) {
144 for (
int layer=0; layer<overlap; layer++) {
145 if (faceNumber<Dimensions) {
146 insideGridCell(faceNumber % Dimensions) = overlap-layer;
147 outsideGridCell(faceNumber % Dimensions) = overlap-1-layer;
150 xOnLayer(faceNumber%Dimensions) = x(faceNumber%Dimensions) - layer * volumeH(faceNumber%Dimensions);
151 xOnLayer(faceNumber%Dimensions) -= volumeH(faceNumber%Dimensions);
155 insideGridCell(faceNumber % Dimensions) = layer+overlap-1;
156 outsideGridCell(faceNumber % Dimensions) = layer+overlap;
159 xOnLayer(faceNumber%Dimensions) = x(faceNumber%Dimensions) + layer * volumeH(faceNumber%Dimensions);
165 for(
int i=0; i<numberOfUnknowns+numberOfAuxiliaryVariables; i++) {
166 (Qold + enumerator(outsideGridCell,0))[i]=(Qold+enumerator(insideGridCell,0))[i];
171 for(
int i=0; i<numberOfUnknowns+numberOfAuxiliaryVariables; i++) {
172 (Qold + enumerator(outsideGridCell,0))[i]=(Qold+enumerator(insideGridCell,0))[i];
177 const double waveSpeed=maxEigenvalue( Qold + enumerator(outsideGridCell,0), faceCentre, volumeH, t, dt, faceNumber % Dimensions);
181 "applySommerfeldConditions(...)",
182 faceCentre <<
" x " << faceNumber <<
": " <<
183 insideGridCell <<
"->" << outsideGridCell <<
" (" << enumerator(insideGridCell,0) <<
"->" << enumerator(outsideGridCell,0) <<
"): " <<
184 *(Qnew + enumerator(insideGridCell,0))
195 double dtInverse=1/dt;
196 double spaceFactor=waveSpeed*rOnLayer/volumeH(faceNumber%Dimensions)/xOnLayer(faceNumber%Dimensions);
202 for(
int i=0; i<numberOfUnknowns; i++) {
203 double numerator=-(waveSpeed/rOnLayer)*((Qold + enumerator(outsideGridCell,0))[i]+(Qold+enumerator(insideGridCell,0))[i]-2*QInf[i])
204 +(+dtInverse-spaceFactor)*(Qold + enumerator(outsideGridCell,0))[i]
205 +(-dtInverse+spaceFactor)*(Qnew + enumerator( insideGridCell,0))[i]
206 +(+dtInverse+spaceFactor)*(Qold + enumerator( insideGridCell,0))[i];
208 (Qnew + enumerator(outsideGridCell,0))[i]=numerator/(dtInverse+spaceFactor);
210 for(
int i=numberOfUnknowns; i<numberOfUnknowns+numberOfAuxiliaryVariables; i++) {
211 (Qnew + enumerator(outsideGridCell,0))[i]=(Qold+enumerator(insideGridCell,0))[i];
void applyBoundaryConditions(std::function< void(const double *__restrict__ Qinside, double *__restrict__ Qoutside, const tarch::la::Vector< Dimensions, double > &faceCentre, const tarch::la::Vector< Dimensions, double > &volumeH, double t, double dt, int normal) > boundaryCondition, const tarch::la::Vector< Dimensions, double > &faceCentre, const tarch::la::Vector< Dimensions, double > &patchSize, double t, double dt, int numberOfGridCellsPerPatchPerAxis, int overlap, int unknownsPlusAuxiliaryVariables, int faceNumber, double *__restrict__ Q)
Apply (generic) boundary conditions.
void applySommerfeldConditions(std::function< double(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &faceCentre, const tarch::la::Vector< Dimensions, double > &gridCellH, double t, double dt, int normal) > maxEigenvalue, std::function< void(double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &faceCentre, const tarch::la::Vector< Dimensions, double > &gridCellH) > farFieldSolution, const tarch::la::Vector< Dimensions, double > &faceCentre, const tarch::la::Vector< Dimensions, double > &patchSize, double t, double dt, int numberOfGridCellsPerPatchPerAxis, int overlap, int numberOfUnknowns, int numberOfAuxiliaryVariables, int faceNumber, const tarch::la::Vector< Dimensions, double > &systemOrigin, double *__restrict__ Qold, double *__restrict__ Qnew, double CheckpointTimeStamp)
bool equals(const Matrix< Rows, Cols, Scalar > &lhs, const Matrix< Rows, Cols, Scalar > &rhs, const Scalar &tolerance=NUMERICAL_ZERO_DIFFERENCE)
Compares to matrices on equality by means of a numerical accuracy.