Peano
Loading...
Searching...
No Matches
IandRThirdOrderTest.cpp
Go to the documentation of this file.
2
3#include "../Interpolation.h"
4#include "../Restriction.h"
5
7 TestCase("toolbox::blockstructured::tests::IandRThirdOrderTest") {}
8
10 testMethod(compareInterpolateLinearCaseToTensorProduct);
11 testMethod(compareRestrictLinearCaseToTensorProduct);
12}
13
16
17 double normalInterp[] = {
18 0.0000,
19 0.3333333,
20 0.6666667,
21 0.0000,
22 0.0000,
23 0.0000,
24 0.0000,
25 0.0000,
26 1.0000,
27 0.0000,
28 0.0000,
29 0.0000,
30 0.0000,
31 0.0000,
32 0.6666667,
33 0.3333333,
34 0.0000,
35 0.0000};
36
37 double tangentInterp[] = {
38 1.3333333, -0.3333333, 0.0000, 0.0000, 0.0000, 1.0000,
39 0.0000, 0.0000, 0.0000, 0.0000, 0.6666667, 0.3333333,
40 0.0000, 0.0000, 0.0000, 0.3333333, 0.6666667, 0.0000,
41 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000,
42 0.0000, 0.0000, 0.6666667, 0.3333333, 0.0000, 0.0000,
43 0.0000, 0.3333333, 0.6666667, 0.0000, 0.0000, 0.0000,
44 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000,
45 0.6666667, 0.3333333, 0.0000, 0.0000, 0.0000, 0.3333333,
46 0.6666667, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000,
47 0.0000, 0.0000, 0.0000, 0.0000, 0.6666667, 0.3333333,
48 0.0000, 0.0000, 0.0000, 0.3333333, 0.6666667, 0.0000,
49 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000,
50 0.0000, -0.3333333, 1.3333333};
51
52 constexpr int patchSize = 5;
53 constexpr int overlap = 3;
54 constexpr int unknowns = 59;
55 const int faceSize = unknowns * patchSize * patchSize * overlap * 2;
56
57 double coarseData[faceSize];
58 double fineDataTensorProduct[faceSize];
59 double fineDataThirdOrder[faceSize];
60
61 for (int i = 0; i < 3; i++) {
62 for (int j = 0; j < 3; j++) {
63 for (int k = 0; k < 3; k++) {
67 );
68
69 for (int axis = 0; axis < 3; axis++) {
70 peano4::datamanagement::FaceMarker faceMarker1(dummyEvent, axis);
71 peano4::datamanagement::FaceMarker faceMarker2(dummyEvent, axis + 3);
72
73 for (int n = 0; n < unknowns * patchSize * patchSize * overlap * 2;
74 n++)
75 coarseData[n] = (double)(n) / 16.0;
76 for (int n = 0; n < unknowns * patchSize * patchSize * overlap * 2;
77 n++)
78 fineDataTensorProduct[n] = 0;
79 for (int n = 0; n < unknowns * patchSize * patchSize * overlap * 2;
80 n++)
81 fineDataThirdOrder[n] = 0;
82
84 faceMarker1,
85 patchSize,
86 overlap,
87 unknowns,
88 normalInterp,
89 tangentInterp,
90 coarseData,
91 fineDataTensorProduct
92 );
94 faceMarker1,
95 patchSize,
96 overlap,
97 unknowns,
98 coarseData,
99 fineDataThirdOrder
100 );
101
102 for (int n = 0; n < unknowns * patchSize * patchSize * overlap * 2;
103 n++)
105 fineDataTensorProduct[n],
106 fineDataThirdOrder[n],
107 0.01,
109 axis,
110 n
111 );
112
113 for (int n = 0; n < unknowns * patchSize * patchSize * overlap * 2;
114 n++)
115 fineDataTensorProduct[n] = 0;
116 for (int n = 0; n < unknowns * patchSize * patchSize * overlap * 2;
117 n++)
118 fineDataThirdOrder[n] = 0;
119
121 faceMarker2,
122 patchSize,
123 overlap,
124 unknowns,
125 normalInterp,
126 tangentInterp,
127 coarseData,
128 fineDataTensorProduct
129 );
131 faceMarker2,
132 patchSize,
133 overlap,
134 unknowns,
135 coarseData,
136 fineDataThirdOrder
137 );
138
139 for (int n = 0; n < unknowns * patchSize * patchSize * overlap * 2;
140 n++)
142 fineDataTensorProduct[n],
143 fineDataThirdOrder[n],
144 0.01,
146 axis + 3,
147 n
148 );
149 }
150 }
151 }
152 }
153}
154
157
158 const double normalRestrict[] = {
159 0.0000,
160 0.0000,
161 0.0000,
162 0.333333,
163 0.333333,
164 0.333333,
165 0.0000,
166 0.0000,
167 0.0000,
168 0.0000,
169 -2.0000,
170 3.0000,
171 0.0000,
172 0.0000,
173 0.0000,
174 0.0000,
175 -5.0000,
176 6.0000};
177
178 const double tangentRestrict[] = {
179 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,
180 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,
181 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,
182 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,
183 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,
184 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,
185 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,
186 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,
187 0.0000, 1.0000, 0.0000};
188
189 constexpr int patchSize = 5;
190 constexpr int overlap = 3;
191 constexpr int unknowns = 59;
192 const int faceSize = unknowns * patchSize * patchSize * overlap * 2;
193
194 double fineData[faceSize];
195 double coarseDataTensorProduct[faceSize];
196 double coarseDataThirdOrder[faceSize];
197
198 for (int i = 0; i < 3; i++) {
199 for (int j = 0; j < 3; j++) {
200 for (int k = 0; k < 3; k++) {
204 );
205
206 for (int axis = 0; axis < 3; axis++) {
207 peano4::datamanagement::FaceMarker faceMarker1(dummyEvent, axis);
208 peano4::datamanagement::FaceMarker faceMarker2(dummyEvent, axis + 3);
209
210 for (int n = 0; n < unknowns * patchSize * patchSize * overlap * 2;
211 n++)
212 fineData[n] = (double)(n) / 16.0;
213 for (int n = 0; n < unknowns * patchSize * patchSize * overlap * 2;
214 n++)
215 coarseDataTensorProduct[n] = 0;
216 for (int n = 0; n < unknowns * patchSize * patchSize * overlap * 2;
217 n++)
218 coarseDataThirdOrder[n] = 0;
219
221 faceMarker1,
222 patchSize,
223 overlap,
224 unknowns,
225 normalRestrict,
226 tangentRestrict,
227 fineData,
228 coarseDataTensorProduct,
229 true
230 );
232 faceMarker1,
233 patchSize,
234 overlap,
235 unknowns,
236 fineData,
237 coarseDataThirdOrder,
238 true
239 );
240
241 for (int n = 0; n < unknowns * patchSize * patchSize * overlap * 2;
242 n++)
244 coarseDataTensorProduct[n],
245 coarseDataThirdOrder[n],
246 0.001,
248 axis,
249 n
250 );
251
252 for (int n = 0; n < unknowns * patchSize * patchSize * overlap * 2;
253 n++)
254 coarseDataTensorProduct[n] = 0;
255 for (int n = 0; n < unknowns * patchSize * patchSize * overlap * 2;
256 n++)
257 coarseDataThirdOrder[n] = 0;
258
260 faceMarker2,
261 patchSize,
262 overlap,
263 unknowns,
264 normalRestrict,
265 tangentRestrict,
266 fineData,
267 coarseDataTensorProduct,
268 true
269 );
271 faceMarker2,
272 patchSize,
273 overlap,
274 unknowns,
275 fineData,
276 coarseDataThirdOrder,
277 true
278 );
279 for (int n = 0; n < unknowns * patchSize * patchSize * overlap * 2;
280 n++)
282 coarseDataTensorProduct[n],
283 coarseDataThirdOrder[n],
284 0.01,
286 axis + 3,
287 n
288 );
289 }
290 }
291 }
292 }
293}
#define testMethod(name)
Run a test method and check for errors.
Definition TestMacros.h:24
#define validateNumericalEqualsWithEpsWithParams3(actualValue, validValue, eps, param0, param1, param2)
Definition TestMacros.h:473
virtual void run() override
This routine is triggered by the TestCaseCollection.
void compareInterpolateLinearCaseToTensorProduct()
The third order interpolation and restriction scheme is tested by comparing the results to the tensor...
void interpolateHaloLayer_AoS_tensor_product(const peano4::datamanagement::FaceMarker &marker, int numberOfDoFsPerAxisInPatch, int overlap, int unknowns, const double *__restrict__ coarseGridFaceValues, double *__restrict__ fineGridFaceValues)
This is a wrapper around the toolbox routines.
void restrictInnerHalfOfHaloLayer_AoS_third_order(const peano4::datamanagement::FaceMarker &marker, int numberOfDoFsPerAxisInPatch, int overlap, int unknowns, double *fineGridValues, double *coarseGridValues, bool swapInsideOutside=false)
void interpolateHaloLayer_AoS_third_order(const peano4::datamanagement::FaceMarker &marker, int numberOfDoFsPerAxisInPatch, int overlap, int unknowns, const double *__restrict__ coarseGridCellValues, const double *__restrict__ coarseGridFaceValues, double *__restrict__ fineGridFaceValues)
void restrictInnerHalfOfHaloLayer_AoS_tensor_product(const peano4::datamanagement::FaceMarker &marker, int numberOfDoFsPerAxisInPatch, int overlap, int unknowns, double *fineGridValues, double *coarseGridValues, bool swapInsideOutside=false)
Provide information about selected face.
Definition FaceMarker.h:35
tarch::la::Vector< Dimensions-1, int > getRelativePositionWithinFatherFace() const
Return relative position of a subface within its father face.
void setRelativePositionToFather(const tarch::la::Vector< Dimensions, int > &value)
Simple vector class.
Definition Vector.h:150