PlasCom2  1.0
XPACC Multi-physics simluation application
TestOperators.C
Go to the documentation of this file.
1 #include "Testing.H"
2 #include "Simulation.H"
3 #include "OperatorKernels.H"
4 #include "MetricKernels.H"
5 #include "Stencil.H"
6 
7 
8 
9 void TestOperators(ix::test::results &serialUnitResults)
10 {
11  int numDim = 3;
12 
13  std::vector<size_t> numX(numDim,10);
14  size_t numPoints = 1;
15  for(int iDim = 0;iDim < numDim;iDim++){
16  numPoints *= numX[iDim];
17  }
18 
20  opInterval.InitSimple(numX);
21  std::vector<size_t> flatInterval;
22  opInterval.Flatten(flatInterval);
23  // Forticate the interval
24  for(int iDim = 0;iDim < numDim;iDim++){
25  flatInterval[2*iDim]++;
26  flatInterval[2*iDim+1]++;
27  }
28  size_t iStart = opInterval[0].first;
29  size_t iEnd = opInterval[0].second;
30  size_t jStart = opInterval[1].first;
31  size_t jEnd = opInterval[1].second;
32  size_t kStart = opInterval[2].first;
33  size_t kEnd = opInterval[2].second;
34  size_t numPlane = numX[0]*numX[1];
35 
36  double a = 1.5;
37  double x = 2.0;
38  double y = 1.0;
39  double z = 0.0;
40  double b = 2.0;
41  double w = 3.0;
42  double v = 4.0;
43 
44  std::vector<double> W0(numPoints,w);
45  std::vector<double> X0(numPoints,x);
46  std::vector<double> Y0(numPoints,y);
47  std::vector<double> Z0(numPoints,z);
48  std::vector<double> X3(3*numPoints,0);
49  std::vector<double> Y3(3*numPoints,0);
50  std::vector<double> X3Len(numPoints,0);
51  std::vector<double> Y3LenNeg(numPoints,0);
52  std::vector<double> Y3Len(numPoints,0);
53  for(size_t iPoint = 0;iPoint < numPoints;iPoint++){
54  X0[iPoint] = x*iPoint;
55  Y0[iPoint] = y*iPoint;
56  W0[iPoint] = w*iPoint;
57  X3[iPoint] = x*iPoint;
58  X3[iPoint+numPoints] = 2*x*iPoint;
59  X3[iPoint+2*numPoints] = 3*x*iPoint;
60  Y3[iPoint] = y*iPoint;
61  Y3[iPoint+numPoints] = 2*y*iPoint;
62  Y3[iPoint+2*numPoints] = 3*y*iPoint;
63  Y3LenNeg[iPoint] = Y3[iPoint]*Y3[iPoint] +
64  Y3[iPoint+numPoints]*Y3[iPoint+numPoints] +
65  Y3[iPoint+2*numPoints]*Y3[iPoint+2*numPoints];
66  Y3LenNeg[iPoint] = -1.0*std::sqrt(Y3LenNeg[iPoint]);
67  Y3Len[iPoint] = -1.0*Y3LenNeg[iPoint];
68 
69  X3Len[iPoint] = X3[iPoint]*X3[iPoint] +
70  X3[iPoint+numPoints]*X3[iPoint+numPoints] +
71  X3[iPoint+2*numPoints]*X3[iPoint+2*numPoints];
72  X3Len[iPoint] = std::sqrt(X3Len[iPoint]);
73  }
74 
75  std::vector<double> Yprime(Y0);
76  std::vector<double> V(numPoints,v);
77  std::vector<double> W(numPoints,w);
78  std::vector<double> X(numPoints,x);
79  std::vector<double> Y(numPoints,y);
80  std::vector<double> Z(numPoints,z);
81  std::vector<double> A(numPoints,a);
82  std::vector<double> B(numPoints,b);
83 
84  Y = Y0;
85  X = X0;
86 
87  size_t *bufferSize = &numX[0];
88  size_t *bufferInterval = &flatInterval[0];
89  int *numComponents = &numDim;
90 
91  // Test Z = X (dot) Y
94  numComponents,&X3[0],&Y3[0],&Z[0]);
95  bool zxdoty = true;
96  for(size_t iZ = kStart;iZ <= kEnd;iZ++){
97  size_t zIndex = iZ*numPlane;
98  for(size_t iY = jStart;iY <= jEnd;iY++){
99  size_t yzIndex = zIndex + iY*numX[0];
100  for(size_t iX = iStart;iX <= iEnd;iX++){
101  size_t xyzIndex = yzIndex + iX;
102  if(Z[xyzIndex] != (X3[xyzIndex]*Y3[xyzIndex]) +
103  (X3[xyzIndex+numPoints]*Y3[xyzIndex+numPoints]) +
104  (X3[xyzIndex+2*numPoints]*Y3[xyzIndex+2*numPoints]))
105  zxdoty = false;
106  }
107  }
108  }
109  serialUnitResults.UpdateResult("Operators:ZXDOTY",zxdoty);
110 
111 
112  Z = Z0;
113 
114  // veclen = SQRT(V[0]**2 + .... V[n]**2)
115  bool veclen = true;
116  std::vector<double> testLen(numPoints,0);
117  FC_MODULE(operators,veclen,OPERATORS,VECLEN)
119  numComponents,&X3[0],&testLen[0]);
120  if(testLen != X3Len){
121  veclen = false;
122  for(size_t iPoint = 0;iPoint < numPoints;iPoint++){
123  if(testLen[iPoint] != X3Len[iPoint])
124  std::cout << "VecLenTest (Value,Expected)[" << iPoint << "] = ("
125  << testLen[iPoint] << "," << X3Len[iPoint]
126  << ")" << std::endl;
127  }
128  }
129  serialUnitResults.UpdateResult("Operators:VECLEN",veclen);
130 
131  // Y = ABS(X)
132  bool assignyabsx = true;
135  &Y3LenNeg[0],&testLen[0]);
136  if(testLen != Y3Len)
137  assignyabsx = false;
138  serialUnitResults.UpdateResult("Operators:ASSIGNMENTYABSX",assignyabsx);
139 
140  // Y = XY
143  &X[0], &Y[0]);
144  bool yxy = true;
145  for(size_t iZ = kStart;iZ <= kEnd;iZ++){
146  size_t zIndex = iZ*numPlane;
147  for(size_t iY = jStart;iY <= jEnd;iY++){
148  size_t yzIndex = zIndex + iY*numX[0];
149  for(size_t iX = iStart;iX <= iEnd;iX++){
150  size_t xyzIndex = yzIndex + iX;
151  if(Y[xyzIndex] != (X[xyzIndex]*Y0[xyzIndex]))
152  yxy = false;
153  }
154  }
155  }
156  serialUnitResults.UpdateResult("Operators:YXY",yxy);
157  Y = Y0;
158 
159  // Z = aW+XY
162  &a,&W[0],&X[0],&Y[0],&Z[0]);
163  bool zawpxy = true;
164  for(size_t iZ = kStart;iZ <= kEnd;iZ++){
165  size_t zIndex = iZ*numPlane;
166  for(size_t iY = jStart;iY <= jEnd;iY++){
167  size_t yzIndex = zIndex + iY*numX[0];
168  for(size_t iX = iStart;iX <= iEnd;iX++){
169  size_t xyzIndex = yzIndex + iX;
170  if(Z[xyzIndex] != (a*W[xyzIndex] + X[xyzIndex]*Y[xyzIndex]))
171  zawpxy = false;
172  }
173  }
174  }
175  serialUnitResults.UpdateResult("Operators:ZAWPXY",zawpxy);
176  Z = Z0;
177 
178  // Z = VW + XY
181  &V[0],&W[0],&X[0],&Y[0],&Z[0]);
182  bool zvwpxy = true;
183  for(size_t iZ = kStart;iZ <= kEnd;iZ++){
184  size_t zIndex = iZ*numPlane;
185  for(size_t iY = jStart;iY <= jEnd;iY++){
186  size_t yzIndex = zIndex + iY*numX[0];
187  for(size_t iX = iStart;iX <= iEnd;iX++){
188  size_t xyzIndex = yzIndex + iX;
189  if(Z[xyzIndex] != (V[xyzIndex]*W[xyzIndex] + X[xyzIndex]*Y[xyzIndex]))
190  zvwpxy = false;
191  }
192  }
193  }
194  serialUnitResults.UpdateResult("Operators:ZVWPXY",zvwpxy);
195  Z = Z0;
196 
197  std::vector<double> inMatrix(9*numPoints,0);
198  for(size_t iPoint = 0;iPoint < numPoints;iPoint++){
199  for(int iComp = 0;iComp < 9;iComp++){
200  inMatrix[iPoint+iComp*numPoints] = (iComp+1)*9*(iPoint+1);
201  }
202  }
203  std::vector<double> matrixDeterminant(numPoints,0);
204 
205  bool det3 = true;
206  // Test 3x3 determinant (i.e. at each point)
209  &inMatrix[0],&matrixDeterminant[0]);
210  for(size_t iPoint = 0;iPoint < numPoints;iPoint++){
211  if(matrixDeterminant[iPoint] != inMatrix[iPoint]*
212  (inMatrix[iPoint+4*numPoints]*inMatrix[iPoint+8*numPoints] -
213  inMatrix[iPoint+5*numPoints]*inMatrix[iPoint+7*numPoints]) -
214  inMatrix[iPoint+3*numPoints]*
215  (inMatrix[iPoint+numPoints]*inMatrix[iPoint+8*numPoints] -
216  inMatrix[iPoint+2*numPoints]*inMatrix[iPoint+7*numPoints]) +
217  inMatrix[iPoint+6*numPoints]*
218  (inMatrix[iPoint+numPoints]*inMatrix[iPoint+5*numPoints] -
219  inMatrix[iPoint+2*numPoints]*inMatrix[iPoint+4*numPoints]))
220  det3 = false;
221  }
222  serialUnitResults.UpdateResult("Operators:Determinant3x3",det3);
223 
224  size_t numPoints2 = bufferSize[0]*bufferSize[1];
225  std::vector<double> inMatrix2(4*numPoints2,0);
226  for(size_t iPoint = 0;iPoint < numPoints2;iPoint++){
227  for(int iComp = 0;iComp < 4;iComp++){
228  inMatrix2[iPoint+iComp*numPoints2] = (iComp+1)*4*(iPoint+1);
229  }
230  }
231  bool det2 = true;
232  // Test 2x2 determinant (i.e. at each point)
234  (&numPoints2,bufferSize,bufferInterval,
235  &inMatrix2[0],&matrixDeterminant[0]);
236  for(size_t iPoint = 0;iPoint < numPoints2;iPoint++){
237  double expected = (inMatrix2[iPoint]*inMatrix2[iPoint+3*numPoints2]) -
238  (inMatrix2[iPoint+numPoints2]*inMatrix2[iPoint+2*numPoints2]);
239  if(matrixDeterminant[iPoint] != expected){
240  det2 = false;
241  }
242  }
243  serialUnitResults.UpdateResult("Operators:Determinant2x2",det2);
244 
245 
246  // Test buf1*buf4 - buf2*buf3 + buf7*(buf5 - buf6)
247  bool metricsum = true;
250  &A[0],&B[0],&V[0],&W[0],&X[0],&Y[0],&Yprime[0],&matrixDeterminant[0]);
251  for(size_t iPoint = 0;iPoint < numPoints;iPoint++){
252  if(matrixDeterminant[iPoint] != A[iPoint]*W[iPoint] -
253  B[iPoint]*V[iPoint] + Yprime[iPoint]*(X[iPoint]-Y[iPoint]))
254  metricsum = false;
255  }
256  serialUnitResults.UpdateResult("Operators:MetricSum4",metricsum);
257 
258  // Test YAXPY (Y = aX + Y) [scalar a]
260  (&numDim,&numPoints,&numX[0],&flatInterval[0],&a,&X[0],&Y[0]);
261 
262  bool yaxpy = true;
263  for(size_t iZ = kStart;iZ <= kEnd;iZ++){
264  size_t zIndex = iZ*numPlane;
265  for(size_t iY = jStart;iY <= jEnd;iY++){
266  size_t yzIndex = zIndex + iY*numX[0];
267  for(size_t iX = iStart;iX <= iEnd;iX++){
268  size_t xyzIndex = yzIndex + iX;
269  if(Y[xyzIndex] != a*X[xyzIndex]+Y0[xyzIndex])
270  yaxpy = false;
271  }
272  }
273  }
274  serialUnitResults.UpdateResult("Operators:YAXPY",yaxpy);
275 
276  Y = Y0;
277  Yprime = Y0;
278 
279  // Test Y = W*X + Y
281  (&numDim,&numPoints,&numX[0],&flatInterval[0],&W[0],&X[0],&Yprime[0]);
282  bool ywxpy = true;
283  for(size_t iZ = kStart;iZ <= kEnd;iZ++){
284  size_t zIndex = iZ*numPlane;
285  for(size_t iY = jStart;iY <= jEnd;iY++){
286  size_t yzIndex = zIndex + iY*numX[0];
287  for(size_t iX = iStart;iX <= iEnd;iX++){
288  size_t xyzIndex = yzIndex + iX;
289  if(Yprime[xyzIndex] != W[xyzIndex]*X[xyzIndex]+Y0[xyzIndex])
290  ywxpy = false;
291  }
292  }
293  }
294  serialUnitResults.UpdateResult("Operators:YWXPY",ywxpy);
295 
296  Yprime = Y0;
297 
298  // Test Z = aX + bY [scalar a,b]
300  (&numDim,&numPoints,&numX[0],&flatInterval[0],&a,&b,&X[0],&Y[0],&Z[0]);
301  bool zaxpby = true;
302  for(size_t iZ = kStart;iZ <= kEnd;iZ++){
303  size_t zIndex = iZ*numPlane;
304  for(size_t iY = jStart;iY <= jEnd;iY++){
305  size_t yzIndex = zIndex + iY*numX[0];
306  for(size_t iX = iStart;iX <= iEnd;iX++){
307  size_t xyzIndex = yzIndex + iX;
308  if(Z[xyzIndex] != a*X[xyzIndex]+b*Y[xyzIndex])
309  zaxpby = false;
310  }
311  }
312  }
313  serialUnitResults.UpdateResult("Operators:ZAXPBY",zaxpby);
314  Z = Z0;
315  Yprime = Y0;
316 
317  // Test Y = aX + bY [scalar a,b]
319  (&numDim,&numPoints,&numX[0],&flatInterval[0],&a,&b,&X[0],&Yprime[0]);
320  bool yaxpby = true;
321  for(size_t iZ = kStart;iZ <= kEnd;iZ++){
322  size_t zIndex = iZ*numPlane;
323  for(size_t iY = jStart;iY <= jEnd;iY++){
324  size_t yzIndex = zIndex + iY*numX[0];
325  for(size_t iX = iStart;iX <= iEnd;iX++){
326  size_t xyzIndex = yzIndex + iX;
327  if(Yprime[xyzIndex] != a*X[xyzIndex]+b*Y0[xyzIndex])
328  yaxpby = false;
329  }
330  }
331  }
332  serialUnitResults.UpdateResult("Operators:YAXPBY",yaxpby);
333  Yprime = Y0;
334 
335  // Test ZAXPY (Z = aX + Y) [scalar a]
336  FC_MODULE(operators,zaxpy,OPERATORS,ZAXPY)(&numDim,&numPoints,&numX[0],&flatInterval[0],&a,&X[0],&Y[0],&Z[0]);
337  bool zaxpy = true;
338  for(size_t iZ = kStart;iZ <= kEnd;iZ++){
339  size_t zIndex = iZ*numPlane;
340  for(size_t iY = jStart;iY <= jEnd;iY++){
341  size_t yzIndex = zIndex + iY*numX[0];
342  for(size_t iX = iStart;iX <= iEnd;iX++){
343  size_t xyzIndex = yzIndex + iX;
344  if(Z[xyzIndex] != a*X[xyzIndex]+Y[xyzIndex])
345  zaxpy = false;
346  }
347  }
348  }
349  serialUnitResults.UpdateResult("Operators:ZAXPY",zaxpy);
350 
351  // Test YAX (Y = a*X) [scalar a]
352  FC_MODULE(operators,yax,OPERATORS,YAX)(&numDim,&numPoints,&numX[0],&flatInterval[0],&a,&X[0],&Y[0]);
353  bool yax = true;
354  for(size_t iZ = kStart;iZ <= kEnd;iZ++){
355  size_t zIndex = iZ*numPlane;
356  for(size_t iY = jStart;iY <= jEnd;iY++){
357  size_t yzIndex = zIndex + iY*numX[0];
358  for(size_t iX = iStart;iX <= iEnd;iX++){
359  size_t xyzIndex = yzIndex + iX;
360  if(Y[xyzIndex] != a*X[xyzIndex])
361  yax = false;
362  }
363  }
364  }
365  serialUnitResults.UpdateResult("Operators:YAX",yax);
366  Y = Y0;
367 
368  // Test XAX (X = a*X) [scalar a]
369  FC_MODULE(operators,xax,OPERATORS,XAX)(&numDim,&numPoints,&numX[0],&flatInterval[0],&a,&X[0]);
370  bool xax = true;
371  for(size_t iZ = kStart;iZ <= kEnd;iZ++){
372  size_t zIndex = iZ*numPlane;
373  for(size_t iY = jStart;iY <= jEnd;iY++){
374  size_t yzIndex = zIndex + iY*numX[0];
375  for(size_t iX = iStart;iX <= iEnd;iX++){
376  size_t xyzIndex = yzIndex + iX;
377  if(X[xyzIndex] != a*X0[xyzIndex])
378  xax = false;
379  }
380  }
381  }
382  serialUnitResults.UpdateResult("Operators:XAX",xax);
383  X = X0;
384 
385  // Test ZXY (Z = X*Y)
386  FC_MODULE(operators,zxy,OPERATORS,ZXY)(&numDim,&numPoints,&numX[0],&flatInterval[0],&X[0],&Y[0],&Z[0]);
387  bool zxy = true;
388  for(size_t iZ = kStart;iZ <= kEnd;iZ++){
389  size_t zIndex = iZ*numPlane;
390  for(size_t iY = jStart;iY <= jEnd;iY++){
391  size_t yzIndex = zIndex + iY*numX[0];
392  for(size_t iX = iStart;iX <= iEnd;iX++){
393  size_t xyzIndex = yzIndex + iX;
394  if(Z[xyzIndex] != X[xyzIndex]*Y[xyzIndex])
395  zxy = false;
396  }
397  }
398  }
399  serialUnitResults.UpdateResult("Operators:ZXY",zxy);
400 
401  // Test ZWXPY (Z = W*X+Y)
402  FC_MODULE(operators,zwxpy,OPERATORS,ZWXPY)(&numDim,&numPoints,&numX[0],&flatInterval[0],&W[0],&X[0],&Y[0],&Z[0]);
403  bool zwxpy = true;
404  for(size_t iZ = kStart;iZ <= kEnd;iZ++){
405  size_t zIndex = iZ*numPlane;
406  for(size_t iY = jStart;iY <= jEnd;iY++){
407  size_t yzIndex = zIndex + iY*numX[0];
408  for(size_t iX = iStart;iX <= iEnd;iX++){
409  size_t xyzIndex = yzIndex + iX;
410  if(Z[xyzIndex] != W[xyzIndex]*X[xyzIndex]+Y[xyzIndex])
411  zwxpy = false;
412  }
413  }
414  }
415  serialUnitResults.UpdateResult("Operators:ZWXPY",zwxpy);
416 
417 
418  // Test ZWMXPY (Z = W*(X+Y))
419  FC_MODULE(operators,zwmxpy,OPERATORS,ZWMXPY)(&numDim,&numPoints,&numX[0],&flatInterval[0],&W[0],&X[0],&Y[0],&Z[0]);
420  bool zwmxpy = true;
421  for(size_t iZ = kStart;iZ <= kEnd;iZ++){
422  size_t zIndex = iZ*numPlane;
423  for(size_t iY = jStart;iY <= jEnd;iY++){
424  size_t yzIndex = zIndex + iY*numX[0];
425  for(size_t iX = iStart;iX <= iEnd;iX++){
426  size_t xyzIndex = yzIndex + iX;
427  if(Z[xyzIndex] != W[xyzIndex]*(X[xyzIndex]+Y[xyzIndex])){
428  zwmxpy = false;
429  std::cout << "Z[" << xyzIndex << "] = " << Z[xyzIndex] << std::endl;
430  }
431  }
432  }
433  }
434  serialUnitResults.UpdateResult("Operators:ZWMXPY",zwmxpy);
435 
436 
437  // Test ASSIGNMENTYX (Y = X) [note the order of arguments to this operator, the output var is *always* last]
438  FC_MODULE(operators,assignmentyx,OPERATORS,ASSIGNMENTYX)(&numDim,&numPoints,&numX[0],&flatInterval[0],&X[0],&Y[0]);
439  bool yx = true;
440  for(size_t iZ = kStart;iZ <= kEnd;iZ++){
441  size_t zIndex = iZ*numPlane;
442  for(size_t iY = jStart;iY <= jEnd;iY++){
443  size_t yzIndex = zIndex + iY*numX[0];
444  for(size_t iX = iStart;iX <= iEnd;iX++){
445  size_t xyzIndex = yzIndex + iX;
446  if(Y[xyzIndex] != X[xyzIndex])
447  yx = false;
448  }
449  }
450  }
451  serialUnitResults.UpdateResult("Operators:ASSIGNMENTYX",yx);
452 
453 
454  // Test ASSIGNMENTXA (X = a) [scalar assignment]
455  X = X0;
456  FC_MODULE(operators,assignmentxa,OPERATORS,ASSIGNMENTXA)(&numDim,&numPoints,&numX[0],&flatInterval[0],&a,&X[0]);
457  bool xa = true;
458  for(size_t iZ = kStart;iZ <= kEnd;iZ++){
459  size_t zIndex = iZ*numPlane;
460  for(size_t iY = jStart;iY <= jEnd;iY++){
461  size_t yzIndex = zIndex + iY*numX[0];
462  for(size_t iX = iStart;iX <= iEnd;iX++){
463  size_t xyzIndex = yzIndex + iX;
464  if(X[xyzIndex] != a)
465  xa = false;
466  }
467  }
468  }
469  serialUnitResults.UpdateResult("Operators:ASSIGNMENTXA",xa);
470 
471  X = X0;
472 
473  // Test YAXM1 (Y = a/X) [vec recip]
474  FC_MODULE(operators,yaxm1,OPERATORS,YAXM1)(&numDim,&numPoints,&numX[0],&flatInterval[0],&a,&X[0],&Y[0]);
475  bool xaym1 = true;
476  for(size_t iZ = kStart;iZ <= kEnd;iZ++){
477  size_t zIndex = iZ*numPlane;
478  for(size_t iY = jStart;iY <= jEnd;iY++){
479  size_t yzIndex = zIndex + iY*numX[0];
480  for(size_t iX = iStart;iX <= iEnd;iX++){
481  size_t xyzIndex = yzIndex + iX;
482  if(Y[xyzIndex] != a/X[xyzIndex])
483  xaym1 = false;
484  }
485  }
486  }
487  serialUnitResults.UpdateResult("Operators:XAYM1",xaym1);
488 
489 
490  // Test Dilatation for all the different sorts of grid metrics
491  bool graddiv = true;
492  int gridType = simulation::grid::UNIRECT; // Uniform Rectangular
493  std::vector<double> gridMetric0(3,1.0);
494  gridMetric0[1] = 2.0;
495  gridMetric0[2] = 4.0;
496  std::vector<double> gridJacobian0(1,1.0/8.0);
497  std::vector<double> gradV(9*numPoints,1.0);
498  for(size_t iPoint = 0;iPoint < numPoints;iPoint++){
499  for(int iComp = 0;iComp < 9;iComp++){
500  gradV[iPoint + iComp*numPoints] = std::pow(2.0,static_cast<double>(iComp))*(iPoint+1);
501  }
502  }
503  std::vector<double> vDiv(numPoints,0.0);
504 
505  FC_MODULE(metricops,ijkgradtoxyzdiv,METRICOPS,IJKGRADTOXYZDIV)
506  (&numDim,&numPoints,&numX[0],&flatInterval[0],&gridType,&gridJacobian0[0],
507  &gridMetric0[0],&gradV[0],&vDiv[0]);
508  for(size_t iPoint = 0;iPoint < numPoints;iPoint++){
509  double expected = gridMetric0[0]*gradV[iPoint] +
510  gridMetric0[1]*gradV[iPoint+4*numPoints] + gridMetric0[2]*gradV[iPoint+8*numPoints];
511  expected *= gridJacobian0[0];
512  if(vDiv[iPoint] != expected){
513  graddiv = false;
514  }
515  }
516  serialUnitResults.UpdateResult("Operators:MetricOps:Dilatation:Uniform",graddiv);
517  vDiv.resize(0);
518  vDiv.resize(numPoints,0.0);
519 
520  graddiv = true;
521  gridType++; // Rectilinear
522  std::vector<double> gridMetric1(3*numPoints,1.0);
523  std::vector<double> gridJacobian1(numPoints,1.0);
524  for(size_t iPoint = 0;iPoint < numPoints;iPoint++){
525  for(int iComp = 0;iComp < 3;iComp++){
526  gridMetric1[iPoint+iComp*numPoints] = std::pow(2.0,static_cast<double>(iComp))*(iPoint+1);
527  gridJacobian1[iPoint] *= 1.0/gridMetric1[iPoint+iComp*numPoints];
528  }
529  }
530 
531  FC_MODULE(metricops,ijkgradtoxyzdiv,METRICOPS,IJKGRADTOXYZDIV)
532  (&numDim,&numPoints,&numX[0],&flatInterval[0],&gridType,&gridJacobian1[0],
533  &gridMetric1[0],&gradV[0],&vDiv[0]);
534 
535  for(size_t iPoint = 0;iPoint < numPoints;iPoint++){
536  double expected = gridMetric1[iPoint]*gradV[iPoint] +
537  gridMetric1[iPoint+numPoints]*gradV[iPoint+4*numPoints] +
538  gridMetric1[iPoint+2*numPoints]*gradV[iPoint+8*numPoints];
539  expected *= gridJacobian1[iPoint];
540  if(vDiv[iPoint] != expected){
541  graddiv = false;
542  }
543  }
544  serialUnitResults.UpdateResult("Operators:MetricOps:Dilatation:Rectilinear",graddiv);
545  vDiv.resize(0);
546  vDiv.resize(numPoints,0.0);
547 
548  gridType++; // Curvilinear
549  graddiv = true;
550  std::vector<double> gridMetric2(9*numPoints,1.0);
551  std::vector<double> gridJacobian2(numPoints,1.0);
552  for(size_t iPoint = 0;iPoint < numPoints;iPoint++){
553  for(int iComp = 0;iComp < 9;iComp++){
554  gridMetric2[iPoint+iComp*numPoints] = std::pow(2.0,static_cast<double>(iComp))*(iPoint+1);
555  gridJacobian2[iPoint] *= 1.0/gridMetric2[iPoint+iComp*numPoints];
556  }
557  }
558 
559  FC_MODULE(metricops,ijkgradtoxyzdiv,METRICOPS,IJKGRADTOXYZDIV)
560  (&numDim,&numPoints,&numX[0],&flatInterval[0],&gridType,&gridJacobian2[0],
561  &gridMetric2[0],&gradV[0],&vDiv[0]);
562 
563  for(size_t iPoint = 0;iPoint < numPoints;iPoint++){
564  double expecteddudx = gridMetric2[iPoint]*gradV[iPoint] +
565  gridMetric2[iPoint+3*numPoints]*gradV[iPoint+numPoints] +
566  gridMetric2[iPoint+6*numPoints]*gradV[iPoint+2*numPoints];
567  double expecteddvdy = gridMetric2[iPoint+numPoints]*gradV[iPoint+3*numPoints] +
568  gridMetric2[iPoint+4*numPoints]*gradV[iPoint+4*numPoints] +
569  gridMetric2[iPoint+7*numPoints]*gradV[iPoint+5*numPoints];
570  double expecteddwdz = gridMetric2[iPoint+2*numPoints]*gradV[iPoint+6*numPoints] +
571  gridMetric2[iPoint+5*numPoints]*gradV[iPoint+7*numPoints] +
572  gridMetric2[iPoint+8*numPoints]*gradV[iPoint+8*numPoints];
573  double expected = expecteddudx + expecteddvdy + expecteddwdz;
574  expected *= gridJacobian2[iPoint];
575  if(vDiv[iPoint] != expected){
576  graddiv = false;
577  }
578  }
579  serialUnitResults.UpdateResult("Operators:MetricOps:Dilatation:Curvilinear",graddiv);
580 
581  gridType = simulation::grid::UNIRECT;
582  // std::vector<double> gridMetric0(3,1.0);
583  // gridMetric0[1] = 2.0;
584  // gridMetric0[2] = 4.0;
585  // std::vector<double> gridJacobian0(1,1.0/8.0);
586  bool alphawt = true;
587  std::vector<double> alphaWeight(numPoints,0.0);
588  for(int alphaDir = 1;alphaDir <= 3;alphaDir++){
589  FC_MODULE(metricops,alphaweight,METRICOPS,ALPHAWEIGHT)
590  (&numDim,&numPoints,&numX[0],&flatInterval[0],&gridType,&gridMetric0[0],
591  &alphaDir,&alphaWeight[0]);
592  for(size_t iPoint = 0;iPoint < numPoints;iPoint++)
593  if(alphaWeight[iPoint] != gridMetric0[alphaDir-1])
594  alphawt = false;
595  }
596  serialUnitResults.UpdateResult("Operators:MetricOps:AlphaWeight:Uniform",alphawt);
597 
598  gridType++;
599  alphawt = true;
600  for(int alphaDir = 1;alphaDir <= 3;alphaDir++){
601  FC_MODULE(metricops,alphaweight,METRICOPS,ALPHAWEIGHT)
602  (&numDim,&numPoints,&numX[0],&flatInterval[0],&gridType,&gridMetric1[0],
603  &alphaDir,&alphaWeight[0]);
604  for(size_t iPoint = 0;iPoint < numPoints;iPoint++)
605  if(alphaWeight[iPoint] != gridMetric1[(alphaDir-1)*numPoints+iPoint])
606  alphawt = false;
607  }
608  serialUnitResults.UpdateResult("Operators:MetricOps:AlphaWeight:Rectilinear",alphawt);
609 
610  gridType++;
611  alphawt = true;
612  for(int alphaDir = 1;alphaDir <= 3;alphaDir++){
613  std::vector<double> metricLen(numPoints,0.0);
614  FC_MODULE(operators,veclen,OPERATORS,VECLEN)
616  &numDim,&gridMetric2[(alphaDir-1)*numDim*numPoints],&metricLen[0]);
617  FC_MODULE(metricops,alphaweight,METRICOPS,ALPHAWEIGHT)
618  (&numDim,&numPoints,&numX[0],&flatInterval[0],&gridType,&gridMetric2[0],
619  &alphaDir,&alphaWeight[0]);
620  if(alphaWeight != metricLen)
621  alphawt = false;
622  }
623  serialUnitResults.UpdateResult("Operators:MetricOps:AlphaWeight:Curvilinear",alphawt);
624 
625 
626 
627 
628 }
629 
630 size_t factorial(size_t n)
631 {
632  return (n == 1 || n == 0) ? 1 : factorial(n - 1) * n;
633 }
634 //void TestApplySingleStencil(ix::test::results &serialUnitResults);
635 
636 // int SBPOperatorTest1(plascom2::stencilset &inOperator,int interiorOrder,int numDim,
637 // int numComponents,int numTrials,std::vector<bool> &testResults);
639 void TestHoleDetection(ix::test::results &serialUnitResults)
640 {
641  plascom2::operators::sbp::base order12Operator;
642  plascom2::operators::sbp::Initialize(order12Operator,2);
643 
644 
645  // Create a test geometry
646  std::vector<bool> test1Pass(3,true);
647  bool test1Result = true;
648  std::vector<bool> test2Pass(3,true);
649  bool test2Result = true;
650  std::vector<bool> test3Pass(3,true);
651  bool test3Result = true;
652  std::vector<bool> test4Pass(3,true);
653  bool test4Result = true;
654 
655  for(int numDim = 1;numDim <= 3;numDim++){
656 
657  std::cout << "Testing hole detection in " << numDim << " dimensions."
658  << std::endl;
659  int dimId = numDim-1;
660 
661  size_t numPoints = 10;
662  size_t numPointsBuffer = 1;
663 
664  std::vector<size_t> bufferSizes(numDim,0);
665  size_t *numPointsDim = &bufferSizes[0];
666  size_t *opInterval = new size_t [2*numDim];
667  for(int iDim = 0;iDim < numDim;iDim++){
668 
669  numPointsDim[iDim] = numPoints;
670  numPointsBuffer *= numPointsDim[iDim];
671  opInterval[2*iDim] = 0;
672  opInterval[2*iDim+1] = numPointsDim[iDim]-1;
673 
674  }
675 
676  std::vector<size_t> gridSizes(bufferSizes);
677  std::vector<int> gridMask;
678 
679  pcpp::IndexIntervalType partitionInterval(opInterval,numDim);
680  pcpp::IndexIntervalType partitionBufferInterval(opInterval,numDim);
682  bufferInterval.InitSimple(bufferSizes);
683 
684  int holeMask = 1;
685 
686  for(int boundaryDepth = 1;boundaryDepth <= 5;boundaryDepth++){
687 
688  // Reset the mask for each test
689  gridMask.resize(0);
690  gridMask.resize(numPointsBuffer,0);
691  int *iMask = &gridMask[0];
692 
693  std::cout << "Testing with boundaryDepth = " << boundaryDepth << std::endl;
694 
695  int numStencils = 2*(boundaryDepth+1);
696 
697  // Create stencil connectivity
698  std::vector<int> stencilConnectivity(numDim*numPointsBuffer,0);
699  int *stencilID = &stencilConnectivity[0];
700 
701  plascom2::operators::sbp::CreateStencilConnectivity(numDim,numPointsDim,opInterval,
702  boundaryDepth,stencilID,false);
703 
704  std::vector<int> expectedStencilConn(stencilConnectivity);
705 
706  // Output to make sure stencil connectivity is as it should be
707  if(numDim == 1 || numDim == 2){
708  std::cout << "Default/initial stencil connectivity:" << std::endl;
709  for(int iDim = 0;iDim < numDim;iDim++){
710  std::cout << "Dimension-" << iDim+1;
711  size_t pointOffset = iDim*numPointsBuffer;
712  for(size_t iPoint = 0;iPoint < numPointsBuffer;iPoint++){
713  if(!(iPoint%numPoints)) std::cout << std::endl;
714  std::cout << stencilID[pointOffset+iPoint] << " ";
715  }
716  std::cout << std::endl;
717  }
718  }
719 
720  std::cout << "Calling DetectHoles on unholy grid." << std::endl;
721 
722  if(plascom2::operators::sbp::DetectHoles(numDim,numPointsDim,opInterval,
723  boundaryDepth,holeMask,iMask,stencilID)){
724  test1Pass[dimId] = false;
725  std::cout << "DetectHoles failed to run." << std::endl;
726  }
727 
728  if(stencilConnectivity != expectedStencilConn){
729  test1Pass[dimId] = false;
730  std::cout << "DetectHoles produced wrong result." << std::endl;
731  if(numDim == 1 || numDim == 2 || numDim == 3){
732  std::cout << "Conn after hole detection: " << std::endl;
733  for(int iDim = 0;iDim < numDim;iDim++){
734  int *expectedConn = &stencilConnectivity[iDim*numPointsBuffer];
735  std::cout << "Dimension-" << iDim+1 << ":";
736  for(size_t iPoint = 0;iPoint < numPointsBuffer;iPoint++){
737  if(!(iPoint%(numPoints*numPoints))) {
738  std::cout << std::endl << " --------------- " << std::endl;
739  } else if(!(iPoint%numPoints)) std::cout << std::endl;
740  std::cout << expectedConn[iPoint] << " ";
741  }
742  std::cout << std::endl;
743  }
744  }
745  } else {
746  std::cout << "Unholy test passed." << std::endl;
747  }
748 
749  test1Result = test1Result && test1Pass[dimId];
750 
751  // Now add a "hole" on the edge of the domain
752  // [X000000X] in each dimension (X=hole)
753  // Select each domain surface and add a hole
754  // Left boundary i = 0, for all of the rest
755  expectedStencilConn.resize(0);
756  expectedStencilConn.resize(numDim*numPointsBuffer,1);
757 
758  for(int iDim = 0;iDim < numDim;iDim++){
759  int *expectedConn = &expectedStencilConn[iDim*numPointsBuffer];
760  pcpp::IndexIntervalType leftBoundaryInterval(partitionInterval);
761  if(leftBoundaryInterval[iDim].first == 0) { // then I have a left boundary
762  leftBoundaryInterval[iDim].second = 0;
763  // set hole bits in mask
764  pcpp::IndexIntervalType boundaryOpInterval;
765  leftBoundaryInterval.RelativeTranslation(partitionInterval,
766  partitionBufferInterval,
767  boundaryOpInterval);
768  if(boundaryOpInterval.NNodes() > 0) {
769 
770  // Set up left boundary
771  mask::SetMask(bufferSizes,boundaryOpInterval,holeMask,iMask);
772 
773  // Set up expected stencilConn
774  std::vector<size_t> nodeList;
775  bufferInterval.GetFlatIndices(boundaryOpInterval,nodeList);
776  for(int iPoint = 0;iPoint < nodeList.size();iPoint++)
777  expectedConn[nodeList[iPoint]] = numStencils;
778  for(int iBoundary = 0;iBoundary < boundaryDepth;iBoundary++){
779  nodeList.resize(0);
780  boundaryOpInterval[iDim].first++;
781  boundaryOpInterval[iDim].second++;
782  bufferInterval.GetFlatIndices(boundaryOpInterval,nodeList);
783  for(int iPoint = 0;iPoint < nodeList.size();iPoint++)
784  expectedConn[nodeList[iPoint]] = 2 + iBoundary;
785  }
786  }
787  }
788  pcpp::IndexIntervalType rightBoundaryInterval(partitionInterval);
789  if(rightBoundaryInterval[iDim].second == (gridSizes[iDim]-1)){
790  rightBoundaryInterval[iDim].first = gridSizes[iDim]-1;
791  pcpp::IndexIntervalType boundaryOpInterval;
792  rightBoundaryInterval.RelativeTranslation(partitionInterval,
793  partitionBufferInterval,
794  boundaryOpInterval);
795  if(boundaryOpInterval.NNodes() > 0) {
796 
797  mask::SetMask(bufferSizes,boundaryOpInterval,holeMask,iMask);
798 
799  // Set up expected stencilConn
800  std::vector<size_t> nodeList;
801  bufferInterval.GetFlatIndices(boundaryOpInterval,nodeList);
802  for(int iPoint = 0;iPoint < nodeList.size();iPoint++)
803  expectedConn[nodeList[iPoint]] = numStencils;
804  for(int iBoundary = 0;iBoundary < boundaryDepth;iBoundary++){
805  nodeList.resize(0);
806  boundaryOpInterval[iDim].second--;
807  boundaryOpInterval[iDim].first--;
808  bufferInterval.GetFlatIndices(boundaryOpInterval,nodeList);
809  for(int iPoint = 0;iPoint < nodeList.size();iPoint++)
810  expectedConn[nodeList[iPoint]] = 2 + boundaryDepth + iBoundary;
811  }
812  }
813  }
814  }
815  if(numDim == 1 || numDim == 2 || numDim == 3){
816  std::cout << "Setting holy border Mask: " << std::endl;
817  for(size_t iPoint = 0;iPoint < numPointsBuffer;iPoint++){
818  if(!(iPoint%(numPoints*numPoints))) {
819  std::cout << std::endl << "-----------" << std::endl;
820  } else if(!(iPoint%numPoints)) std::cout << std::endl;
821  std::cout << iMask[iPoint] << " ";
822  if(iMask[iPoint]&holeMask){
823  for(int iDim = 0;iDim < numDim;iDim++){
824  expectedStencilConn[iDim*numPointsBuffer+iPoint] = numStencils;
825  }
826  }
827  }
828  std::cout << std::endl;
829  std::cout << "Expected Conn: " << std::endl;
830  for(int iDim = 0;iDim < numDim;iDim++){
831  int *expectedConn = &expectedStencilConn[iDim*numPointsBuffer];
832  std::cout << "Dimension-" << iDim+1 << ":";
833  for(size_t iPoint = 0;iPoint < numPointsBuffer;iPoint++){
834  if(!(iPoint%(numPoints*numPoints))) {
835  std::cout << std::endl << "-----------" << std::endl;
836  } else if(!(iPoint%numPoints)) std::cout << std::endl;
837  std::cout << expectedConn[iPoint] << " ";
838  }
839  std::cout << std::endl;
840  }
841  }
842 
843  int returnCode = plascom2::operators::sbp::DetectHoles(numDim,numPointsDim,opInterval,
844  boundaryDepth,holeMask,iMask,stencilID);
845 
846  if(numStencils > numPoints){ // detect holes should fail
847  if(returnCode == 0){
848  test3Pass[dimId] = false;
849  } else {
850  std::cout << "DetectHoles detected too much holiness." << std::endl;
851  }
852  } else {
853  if(returnCode > 0){
854  test2Pass[dimId] = false;
855  std::cout << "DetectHoles found spurious holiness." << std::endl;
856  } else {
857  if(stencilConnectivity != expectedStencilConn){
858  test2Pass[dimId] = false;
859  std::cout << "Test failed." << std::endl;
860  } else {
861  std::cout << "Holy border test passed." << std::endl;
862  }
863  if(numDim == 1 || numDim == 2 || numDim == 3){
864  std::cout << "Conn after hole detection: " << std::endl;
865  for(int iDim = 0;iDim < numDim;iDim++){
866  int *expectedConn = &stencilConnectivity[iDim*numPointsBuffer];
867  std::cout << "Dimension-" << iDim+1 << ":";
868  for(size_t iPoint = 0;iPoint < numPointsBuffer;iPoint++){
869  if(!(iPoint%(numPoints*numPoints))) {
870  std::cout << std::endl << " --------------- " << std::endl;
871  } else if(!(iPoint%numPoints)) std::cout << std::endl;
872  std::cout << expectedConn[iPoint] << " ";
873  }
874  std::cout << std::endl;
875  }
876  }
877  }
878  }
879 
880  test2Result = test2Result && test2Pass[dimId];
881  test3Result = test3Result && test3Pass[dimId];
882 
883  // Do a convex hole in the middle of the mesh
884  // Reset the mask for each test
885  gridMask.resize(0);
886  gridMask.resize(numPointsBuffer,0);
887  iMask = &gridMask[0];
888 
889  // Create stencil connectivity
890  stencilConnectivity.resize(0);
891  stencilConnectivity.resize(numDim*numPointsBuffer,0);
892  plascom2::operators::sbp::CreateStencilConnectivity(numDim,numPointsDim,opInterval,
893  boundaryDepth,stencilID,false);
894  expectedStencilConn = stencilConnectivity;
895 
896  // Now add a "hole" in the middle of the domain
897  // [000XXX000] in each dimension (X=hole)
898  expectedStencilConn.resize(0);
899  expectedStencilConn.resize(numDim*numPointsBuffer,1);
900 
901  pcpp::IndexIntervalType holeInterval;
902  holeInterval.InitSimple(gridSizes);
903  pcpp::IndexIntervalType holeBoundaryZone(holeInterval);
904 
905  for(int iDim = 0;iDim < numDim;iDim++){
906  size_t middleIndex = gridSizes[iDim]/2;
907  holeInterval[iDim].first = middleIndex-1;
908  holeInterval[iDim].second = middleIndex;
909  if(boundaryDepth > holeInterval[iDim].first)
910  holeBoundaryZone[iDim].first = 0;
911  else
912  holeBoundaryZone[iDim].first = holeInterval[iDim].first - boundaryDepth;
913  }
914 
915  pcpp::IndexIntervalType myHoleInterval;
916  partitionInterval.Overlap(holeInterval,myHoleInterval);
917 
918  if(myHoleInterval.NNodes() > 0){
919  pcpp::IndexIntervalType holeOpInterval;
920  myHoleInterval.RelativeTranslation(partitionInterval,
921  partitionBufferInterval,
922  holeOpInterval);
923  mask::SetMask(bufferSizes,holeOpInterval,holeMask,iMask);
924  }
925 
926  if(numDim == 1 || numDim == 2 || numDim == 3){
927  std::cout << "Setting central holy border Mask: " << std::endl;
928  for(size_t iPoint = 0;iPoint < numPointsBuffer;iPoint++){
929  if(!(iPoint%(numPoints*numPoints))) {
930  std::cout << std::endl << "-----------" << std::endl;
931  } else if(!(iPoint%numPoints)) std::cout << std::endl;
932  std::cout << iMask[iPoint] << " ";
933  }
934  std::cout << std::endl;
935  }
936 
937  returnCode = plascom2::operators::sbp::DetectHoles(numDim,numPointsDim,opInterval,
938  boundaryDepth,holeMask,iMask,stencilID);
939 
940  if(returnCode != 0){
941  std::cout << "Too holy." << std::endl;
942  if(boundaryDepth < 3)
943  test4Pass[dimId] = false;
944  } else {
945  if(numDim == 1 || numDim == 2 || numDim == 3){
946  std::cout << "Conn after hole detection: " << std::endl;
947  for(int iDim = 0;iDim < numDim;iDim++){
948  int *expectedConn = &stencilConnectivity[iDim*numPointsBuffer];
949  std::cout << "Dimension-" << iDim+1 << ":";
950  for(size_t iPoint = 0;iPoint < numPointsBuffer;iPoint++){
951  if(!(iPoint%(numPoints*numPoints))) {
952  std::cout << std::endl << " --------------- " << std::endl;
953  } else if(!(iPoint%numPoints)) std::cout << std::endl;
954  std::cout << expectedConn[iPoint] << " ";
955  }
956  std::cout << std::endl;
957  }
958  }
959  }
960  test4Result = test4Result && test4Pass[dimId];
961  // ======= middle hole ====
962  }
963 
964  delete[] opInterval;
965  }
966  serialUnitResults.UpdateResult("Operators:DetectHoliness:UnHoly",test1Result);
967  serialUnitResults.UpdateResult("Operators:DetectHoliness:HolyBoundaries",test2Result);
968  serialUnitResults.UpdateResult("Operators:DetectHoliness:TooHoly",test3Result);
969  serialUnitResults.UpdateResult("Operators:DetectHoliness:HolyCenter",test4Result);
970 }
971 
972 void TestSBPInitialize(ix::test::results &serialUnitResults)
973 {
974  // Operator
975  plascom2::operators::sbp::base order12Operator;
976  plascom2::operators::sbp::Initialize(order12Operator,2);
977 
978  bool operatorInitialization12 = true;
979 
980  if(order12Operator.numStencils != 4) {
981  operatorInitialization12 = false;
982  }
983 
984  if(order12Operator.numValues != 7) {
985  operatorInitialization12 = false;
986  }
987 
988  if(order12Operator.stencilSizes[0] != 2 ||
989  order12Operator.stencilSizes[1] != 2 ||
990  order12Operator.stencilSizes[2] != 2 ||
991  order12Operator.stencilSizes[3] != 1) {
992  operatorInitialization12 = false;
993  }
994 
995  int start = 0;
996  for(int iStencil = 0;iStencil < order12Operator.numStencils;iStencil++){
997  if(order12Operator.stencilStarts[iStencil] != start) operatorInitialization12 = false;
998  start += order12Operator.stencilSizes[iStencil];
999  }
1000 
1001  if(order12Operator.stencilWeights[0] != -0.5 ||
1002  order12Operator.stencilWeights[1] != 0.5 ||
1003  order12Operator.stencilWeights[2] != -1.0 ||
1004  order12Operator.stencilWeights[3] != 1.0 ||
1005  order12Operator.stencilWeights[4] != -1.0 ||
1006  order12Operator.stencilWeights[5] != 1.0 ||
1007  order12Operator.stencilWeights[6] != 0.0) {
1008  operatorInitialization12 = false;
1009  }
1010 
1011  if(order12Operator.stencilOffsets[0] != -1 ||
1012  order12Operator.stencilOffsets[1] != 1 ||
1013  order12Operator.stencilOffsets[2] != 0 ||
1014  order12Operator.stencilOffsets[3] != 1 ||
1015  order12Operator.stencilOffsets[4] != -1 ||
1016  order12Operator.stencilOffsets[5] != 0 ||
1017  order12Operator.stencilOffsets[6] != 0) {
1018  operatorInitialization12 = false;
1019  }
1020 
1021  serialUnitResults.UpdateResult("Operators:SBP:Initialize12",operatorInitialization12);
1022 
1025 
1026  bool op24InitWorks = true;
1027  if(op24.numStencils != 10)
1028  op24InitWorks = false;
1029  if(op24.numValues != 33)
1030  op24InitWorks = false;
1031 
1032  if(op24.stencilSizes[0] != 4 ||
1033  op24.stencilSizes[1] != 4 ||
1034  op24.stencilSizes[2] != 2 ||
1035  op24.stencilSizes[3] != 4 ||
1036  op24.stencilSizes[4] != 4 ||
1037  op24.stencilSizes[5] != 4 ||
1038  op24.stencilSizes[6] != 2 ||
1039  op24.stencilSizes[7] != 4 ||
1040  op24.stencilSizes[8] != 4 ||
1041  op24.stencilSizes[9] != 1)
1042  op24InitWorks = false;
1043 
1044  serialUnitResults.UpdateResult("Operators:SBP:Initialize24",op24InitWorks);
1045 
1048 
1049  bool op36InitWorks = true;
1050 
1051  op36InitWorks &= (op36.numStencils == 2 + 2*op36.boundaryDepth);
1052 
1053  for (int i=0; i<op36.boundaryDepth; i++) {
1054  op36InitWorks &= (op36.stencilSizes[i+1] == op36.stencilSizes[i+1+op36.boundaryDepth]);
1055  }
1056 
1057  // tests if the right and left boundary conditions are mirrored
1058  int offsetSum = 0;
1059  double weightSum = 0.0;
1060  for (int i=op36.stencilStarts[1]; i<op36.stencilStarts[op36.numStencils-1]; i++) {
1061  offsetSum += op36.stencilOffsets[i];
1062  weightSum += op36.stencilWeights[i];
1063  }
1064  op36InitWorks &= (offsetSum == 0);
1065  if (!op36InitWorks) std::cout << "sbp36 offsetSum " << offsetSum << std::endl;
1066  op36InitWorks &= (std::abs(weightSum) < 1e-14);
1067  if (!op36InitWorks) std::cout << "sbp36 weightSum " << weightSum << std::endl;
1068 
1069  serialUnitResults.UpdateResult("Operators:SBP:Initialize36",op36InitWorks);
1070 }
1071 
1072 void TestOperatorSBP12(ix::test::results &serialUnitResults)
1073 {
1076  // Forticate the stencil starts
1077  for(int iStencil = 0;iStencil < sbp12.numStencils;iStencil++)
1078  sbp12.stencilStarts[iStencil]++;
1079 
1080  std::vector<bool> testResults;
1081  for(int iDim = 0;iDim < 3;iDim++){
1082  std::cout << "Brute force ApplyOperator SBP12 in " << iDim+1
1083  << " dimensions." << std::endl;
1084  plascom2::operators::sbp::BruteTest1(sbp12,2,iDim+1,1,4,testResults);
1085  std::vector<bool>::iterator trIt = testResults.begin();
1086  bool testResult = true;
1087  while(trIt != testResults.end()) {
1088  testResult = testResult&&(*trIt);
1089  trIt++;
1090  }
1091  switch(iDim){
1092  case 0:
1093  serialUnitResults.UpdateResult("Operators:SBP12:ApplyOperator:1D",testResult);
1094  break;
1095  case 1:
1096  serialUnitResults.UpdateResult("Operators:SBP12:ApplyOperator:2D",testResult);
1097  break;
1098  case 2:
1099  serialUnitResults.UpdateResult("Operators:SBP12:ApplyOperator:3D",testResult);
1100  break;
1101  default: // never get here
1102  break;
1103  }
1104  }
1105 
1106 
1107  serialUnitResults.UpdateResult("Operators:SBP12:Brute:InteriorXAccurate",testResults[0]);
1108  serialUnitResults.UpdateResult("Operators:SBP12:Brute:InteriorXOrder2",testResults[1]);
1109  serialUnitResults.UpdateResult("Operators:SBP12:Brute:InteriorYAccurate",testResults[2]);
1110  serialUnitResults.UpdateResult("Operators:SBP12:Brute:InteriorYOrder2",testResults[3]);
1111  serialUnitResults.UpdateResult("Operators:SBP12:Brute:InteriorZAccurate",testResults[4]);
1112  serialUnitResults.UpdateResult("Operators:SBP12:Brute:InteriorZOrder2",testResults[5]);
1113 
1114  serialUnitResults.UpdateResult("Operators:SBP12:Brute:LeftBoundaryXAccurate",testResults[6]);
1115  serialUnitResults.UpdateResult("Operators:SBP12:Brute:LeftBoundaryXOrder1",testResults[7]);
1116  serialUnitResults.UpdateResult("Operators:SBP12:Brute:LeftBoundaryYAccurate",testResults[8]);
1117  serialUnitResults.UpdateResult("Operators:SBP12:Brute:LeftBoundaryYOrder1",testResults[9]);
1118  serialUnitResults.UpdateResult("Operators:SBP12:Brute:LeftBoundaryZAccurate",testResults[10]);
1119  serialUnitResults.UpdateResult("Operators:SBP12:Brute:LeftBoundaryZOrder1",testResults[11]);
1120 
1121  serialUnitResults.UpdateResult("Operators:SBP12:Brute:RightBoundaryXAccurate",testResults[12]);
1122  serialUnitResults.UpdateResult("Operators:SBP12:Brute:RightBoundaryXOrder1",testResults[13]);
1123  serialUnitResults.UpdateResult("Operators:SBP12:Brute:RightBoundaryYAccurate",testResults[14]);
1124  serialUnitResults.UpdateResult("Operators:SBP12:Brute:RightBoundaryYOrder1",testResults[15]);
1125  serialUnitResults.UpdateResult("Operators:SBP12:Brute:RightBoundaryZAccurate",testResults[16]);
1126  serialUnitResults.UpdateResult("Operators:SBP12:Brute:RightBoundaryZOrder1",testResults[17]);
1127 
1128 // std::cout << "New test results:" << std::endl;
1129 // pcpp::io::DumpContents(std::cout,testResults);
1130 // std::cout << std::endl;
1131 
1132 }
1133 
1134 void TestOperatorSBP24(ix::test::results &serialUnitResults)
1135 {
1138 
1139  // Forticate the stencil starts
1140  for(int iStencil = 0;iStencil < sbp24.numStencils;iStencil++)
1141  sbp24.stencilStarts[iStencil]++;
1142 
1143  // std::vector<bool> testResults;
1144  // plascom2::operators::sbp::BruteTest1(sbp24,4,3,1,4,testResults);
1145 
1146  std::vector<bool> testResults;
1147  for(int iDim = 0;iDim < 3;iDim++){
1148  std::cout << "Brute force ApplyOperator SBP24 in " << iDim+1
1149  << " dimensions." << std::endl;
1150  plascom2::operators::sbp::BruteTest1(sbp24,4,iDim+1,1,4,testResults);
1151  std::vector<bool>::iterator trIt = testResults.begin();
1152  bool testResult = true;
1153  while(trIt != testResults.end()) {
1154  testResult = testResult&&(*trIt);
1155  trIt++;
1156  }
1157  switch(iDim){
1158  case 0:
1159  serialUnitResults.UpdateResult("Operators:SBP24:ApplyOperator:1D",testResult);
1160  break;
1161  case 1:
1162  serialUnitResults.UpdateResult("Operators:SBP24:ApplyOperator:2D",testResult);
1163  break;
1164  case 2:
1165  serialUnitResults.UpdateResult("Operators:SBP24:ApplyOperator:3D",testResult);
1166  break;
1167  default: // never get here
1168  break;
1169  }
1170  }
1171 
1172  serialUnitResults.UpdateResult("Operators:SBP24:Brute:InteriorXAccurate",testResults[0]);
1173  serialUnitResults.UpdateResult("Operators:SBP24:Brute:InteriorXOrder4",testResults[1]);
1174  serialUnitResults.UpdateResult("Operators:SBP24:Brute:InteriorYAccurate",testResults[2]);
1175  serialUnitResults.UpdateResult("Operators:SBP24:Brute:InteriorYOrder4",testResults[3]);
1176  serialUnitResults.UpdateResult("Operators:SBP24:Brute:InteriorZAccurate",testResults[4]);
1177  serialUnitResults.UpdateResult("Operators:SBP24:Brute:InteriorZOrder4",testResults[5]);
1178 
1179  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBoundaryXAccurate",testResults[6]);
1180  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBoundaryXOrder2",testResults[7]);
1181  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBoundaryYAccurate",testResults[8]);
1182  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBoundaryYOrder2",testResults[9]);
1183  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBoundaryZAccurate",testResults[10]);
1184  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBoundaryZOrder2",testResults[11]);
1185 
1186  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBias1XAccurate",testResults[12]);
1187  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBias1XOrder2",testResults[13]);
1188  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBias1YAccurate",testResults[14]);
1189  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBias1YOrder2",testResults[15]);
1190  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBias1ZAccurate",testResults[16]);
1191  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBias1ZOrder2",testResults[17]);
1192 
1193  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBias2XAccurate",testResults[18]);
1194  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBias2XOrder2",testResults[19]);
1195  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBias2YAccurate",testResults[20]);
1196  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBias2YOrder2",testResults[21]);
1197  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBias2ZAccurate",testResults[22]);
1198  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBias2ZOrder2",testResults[23]);
1199 
1200  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBias3XAccurate",testResults[24]);
1201  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBias3XOrder2",testResults[25]);
1202  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBias3YAccurate",testResults[26]);
1203  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBias3YOrder2",testResults[27]);
1204  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBias3ZAccurate",testResults[28]);
1205  serialUnitResults.UpdateResult("Operators:SBP24:Brute:LeftBias3ZOrder2",testResults[29]);
1206 
1207  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBoundaryXAccurate",testResults[30]);
1208  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBoundaryXOrder2",testResults[31]);
1209  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBoundaryYAccurate",testResults[32]);
1210  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBoundaryYOrder2",testResults[33]);
1211  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBoundaryZAccurate",testResults[34]);
1212  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBoundaryZOrder2",testResults[35]);
1213 
1214  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBias1XAccurate",testResults[36]);
1215  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBias1XOrder2",testResults[37]);
1216  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBias1YAccurate",testResults[38]);
1217  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBias1YOrder2",testResults[39]);
1218  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBias1ZAccurate",testResults[40]);
1219  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBias1ZOrder2",testResults[41]);
1220 
1221  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBias2XAccurate",testResults[42]);
1222  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBias2XOrder2",testResults[43]);
1223  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBias2YAccurate",testResults[44]);
1224  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBias2YOrder2",testResults[45]);
1225  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBias2ZAccurate",testResults[46]);
1226  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBias2ZOrder2",testResults[47]);
1227 
1228  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBias3XAccurate",testResults[48]);
1229  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBias3XOrder2",testResults[49]);
1230  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBias3YAccurate",testResults[50]);
1231  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBias3YOrder2",testResults[51]);
1232  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBias3ZAccurate",testResults[52]);
1233  serialUnitResults.UpdateResult("Operators:SBP24:Brute:RightBias3ZOrder2",testResults[53]);
1234 
1235 // std::cout << "New test results:" << std::endl;
1236 // pcpp::io::DumpContents(std::cout,testResults);
1237 // std::cout << std::endl;
1238 }
1239 
1240 void TestOperatorSBP36(ix::test::results &serialUnitResults)
1241 {
1244 
1245  // Forticate the stencil starts
1246  for(int iStencil = 0;iStencil < sbp36.numStencils;iStencil++)
1247  sbp36.stencilStarts[iStencil]++;
1248 
1249  std::vector<bool> testResults;
1250  for(int iDim = 0;iDim < 3;iDim++){
1251  std::cout << "Brute force ApplyOperator SBP36 in " << iDim+1
1252  << " dimensions." << std::endl;
1253  plascom2::operators::sbp::BruteTest1(sbp36,6,iDim+1,1,4,testResults);
1254 
1255  std::vector<bool>::iterator trIt = testResults.begin();
1256  bool testResult = true;
1257  while(trIt != testResults.end()) {
1258  testResult = testResult&&(*trIt);
1259  trIt++;
1260  }
1261 
1262  switch(iDim){
1263  case 0:
1264  serialUnitResults.UpdateResult("Operators:SBP36:ApplyOperator:1D",testResult);
1265  break;
1266  case 1:
1267  serialUnitResults.UpdateResult("Operators:SBP36:ApplyOperator:2D",testResult);
1268  break;
1269  case 2:
1270  serialUnitResults.UpdateResult("Operators:SBP36:ApplyOperator:3D",testResult);
1271  break;
1272  default: // never get here
1273  break;
1274  }
1275  }
1276 
1277  serialUnitResults.UpdateResult("Operators:SBP36:Brute:InteriorXAccurate",testResults[0]);
1278  serialUnitResults.UpdateResult("Operators:SBP36:Brute:InteriorXOrder6",testResults[1]);
1279  serialUnitResults.UpdateResult("Operators:SBP36:Brute:InteriorYAccurate",testResults[2]);
1280  serialUnitResults.UpdateResult("Operators:SBP36:Brute:InteriorYOrder6",testResults[3]);
1281  serialUnitResults.UpdateResult("Operators:SBP36:Brute:InteriorZAccurate",testResults[4]);
1282  serialUnitResults.UpdateResult("Operators:SBP36:Brute:InteriorZOrder6",testResults[5]);
1283 
1284  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBoundaryXAccurate",testResults[6]);
1285  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBoundaryXOrder3",testResults[7]);
1286  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBoundaryYAccurate",testResults[8]);
1287  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBoundaryYOrder3",testResults[9]);
1288  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBoundaryZAccurate",testResults[10]);
1289  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBoundaryZOrder3",testResults[11]);
1290 
1291  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias1XAccurate",testResults[12]);
1292  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias1XOrder3",testResults[13]);
1293  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias1YAccurate",testResults[14]);
1294  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias1YOrder3",testResults[15]);
1295  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias1ZAccurate",testResults[16]);
1296  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias1ZOrder3",testResults[17]);
1297 
1298  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias2XAccurate",testResults[18]);
1299  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias2XOrder3",testResults[19]);
1300  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias2YAccurate",testResults[20]);
1301  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias2YOrder3",testResults[21]);
1302  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias2ZAccurate",testResults[22]);
1303  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias2ZOrder3",testResults[23]);
1304 
1305  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias3XAccurate",testResults[24]);
1306  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias3XOrder3",testResults[25]);
1307  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias3YAccurate",testResults[26]);
1308  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias3YOrder3",testResults[27]);
1309  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias3ZAccurate",testResults[28]);
1310  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias3ZOrder3",testResults[29]);
1311 
1312  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias4XAccurate",testResults[30]);
1313  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias4XOrder3",testResults[31]);
1314  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias4YAccurate",testResults[32]);
1315  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias4YOrder3",testResults[33]);
1316  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias4ZAccurate",testResults[34]);
1317  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias4ZOrder3",testResults[35]);
1318 
1319  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias5XAccurate",testResults[36]);
1320  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias5XOrder3",testResults[37]);
1321  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias5YAccurate",testResults[38]);
1322  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias5YOrder3",testResults[39]);
1323  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias5ZAccurate",testResults[40]);
1324  serialUnitResults.UpdateResult("Operators:SBP36:Brute:LeftBias5ZOrder3",testResults[41]);
1325 
1326  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBoundaryXAccurate",testResults[42]);
1327  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBoundaryXOrder3",testResults[43]);
1328  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBoundaryYAccurate",testResults[44]);
1329  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBoundaryYOrder3",testResults[45]);
1330  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBoundaryZAccurate",testResults[46]);
1331  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBoundaryZOrder3",testResults[47]);
1332 
1333  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias1XAccurate",testResults[48]);
1334  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias1XOrder3",testResults[49]);
1335  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias1YAccurate",testResults[50]);
1336  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias1YOrder3",testResults[51]);
1337  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias1ZAccurate",testResults[52]);
1338  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias1ZOrder3",testResults[53]);
1339 
1340  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias2XAccurate",testResults[54]);
1341  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias2XOrder3",testResults[55]);
1342  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias2YAccurate",testResults[56]);
1343  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias2YOrder3",testResults[57]);
1344  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias2ZAccurate",testResults[58]);
1345  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias2ZOrder3",testResults[59]);
1346 
1347  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias3XAccurate",testResults[60]);
1348  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias3XOrder3",testResults[61]);
1349  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias3YAccurate",testResults[62]);
1350  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias3YOrder3",testResults[63]);
1351  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias3ZAccurate",testResults[64]);
1352  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias3ZOrder3",testResults[65]);
1353 
1354  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias4XAccurate",testResults[66]);
1355  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias4XOrder3",testResults[67]);
1356  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias4YAccurate",testResults[68]);
1357  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias4YOrder3",testResults[69]);
1358  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias4ZAccurate",testResults[70]);
1359  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias4ZOrder3",testResults[71]);
1360 
1361  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias5XAccurate",testResults[72]);
1362  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias5XOrder3",testResults[73]);
1363  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias5YAccurate",testResults[74]);
1364  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias5YOrder3",testResults[75]);
1365  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias5ZAccurate",testResults[76]);
1366  serialUnitResults.UpdateResult("Operators:SBP36:Brute:RightBias5ZOrder3",testResults[77]);
1367 
1368 }
1369 
1370 
1372 {
1373 
1374  // Create a test geometry
1375  int numDim = 3;
1376  size_t numPoints = 1;
1377  size_t *numX = new size_t [numDim];
1378  double *dX = new double [numDim];
1379  size_t *opInterval = new size_t [2*numDim];
1380  for(int iDim = 0;iDim < numDim;iDim++){
1381  // numX[iDim] = 10 * (std::pow(2,static_cast<double>(numDim-iDim)));
1382  numX[iDim] = 3;
1383  dX[iDim] = 1.0/(numX[iDim]-1);
1384  numPoints *= numX[iDim];
1385  opInterval[2*iDim] = 1;
1386  opInterval[2*iDim+1] = numX[iDim];
1387  }
1388  double *U = new double [numPoints];
1389  double *dU = new double [numDim*numPoints];
1390  double *exactDU = new double [numDim*numPoints];
1391  int *stencilID = new int [numDim*numPoints];
1392 
1393  // Initialize U with some field
1394  for(size_t iPoint = 0;iPoint < numPoints;iPoint++){
1395  size_t xPos = iPoint%numX[0];
1396  U[iPoint] = xPos*dX[0];
1397  exactDU[iPoint] = dX[0];
1398  dU[iPoint] = 0.0;
1399  stencilID[iPoint] = 0;
1400  for(int iDim = 1;iDim < numDim;iDim++){
1401  exactDU[iDim*numPoints+iPoint] = 0.0;
1402  dU[iDim*numPoints+iPoint] = 0.0;
1403  stencilID[iPoint+iDim*numPoints] = 0;
1404  }
1405  }
1406 
1407  // Create an SBP operator/stencilset
1410 
1411  int numStencils = sbp12.numStencils;
1412  // Forticate the stencil starts
1413  for(int iStencil = 0;iStencil < numStencils;iStencil++)
1414  sbp12.stencilStarts[iStencil]++;
1415  int boundaryDepth = 1;
1416 
1417  // Create stencil connectivity
1418  plascom2::operators::sbp::CreateStencilConnectivity(numDim,numX,opInterval,boundaryDepth,stencilID,true);
1419  bool createStencilConn = true;
1420  // for(int iDim = 0;iDim < numDim;iDim++){
1421  // std::cout << "Stencil Connectivity for dimension " << iDim+1 << "(" << numX[iDim] << "):" << std::endl;
1422  // for(int iPoint = 0;iPoint < numPoints;iPoint++)
1423  // std::cout << stencilID[iDim*numPoints+iPoint] << " ";
1424  // std::cout << std::endl;
1425  // }
1426 
1427  // Invert the connectivity
1428  // plascom2::operators::InvertStencilConnectivity(numDim,opInterval,stencilID,dualStencilConn,true);
1429  size_t *dualStencilConn = new size_t [numDim*numPoints]; // [DIM1[stencil1Points,stencil2Points....stencil(numStencils)Points]...]
1430  size_t *numPointsStencil = new size_t [numDim*numStencils]; // [DIM1[numPoints1,numPoints2....numPoints(numStencils)]...]
1431 
1432  plascom2::operators::sbp::InvertStencilConnectivity(numDim,numX,opInterval,numStencils,stencilID,
1433  dualStencilConn,numPointsStencil,true);
1434  size_t stencilPoint = 0;
1435  bool invertStencilConn = true;
1436  for(int iDim = 0;iDim < numDim;iDim++){
1437  std::cout << "Dual stencil conn for dimension " << iDim+1 << "(" << numX[iDim] << ")" << std::endl;
1438  for(int iStencil = 0;iStencil < numStencils;iStencil++){
1439  size_t numPointsThisStencil = numPointsStencil[iDim*numStencils+iStencil];
1440  std::cout << "Stencil[" << iStencil+1 << "] Points(" << numPointsThisStencil << "): ";
1441  for(size_t iPoint = 0;iPoint < numPointsThisStencil;iPoint++)
1442  std::cout << dualStencilConn[stencilPoint++] << " ";
1443  }
1444  std::cout << std::endl;
1445  }
1446 
1447  int numComponents = 1;
1448  size_t blobOffset = 0;
1449  bool applySingleStencilTest = true;
1450  for(int iDim = 0;iDim < numDim;iDim++){
1451  int opDir = iDim+1;
1452  double *dUPtr = &dU[iDim*numPoints];
1453  for(int iStencil = 0;iStencil < numStencils;iStencil++){
1454  size_t numPointsApply = numPointsStencil[iDim*numStencils+iStencil];
1455  int stencilSize = sbp12.stencilSizes[iStencil];
1456  int stencilStart = sbp12.stencilStarts[iStencil] - 1;
1457  double *stencilWeights = &sbp12.stencilWeights[stencilStart];
1458  int *stencilOffsets = &sbp12.stencilOffsets[stencilStart];
1459  size_t *blobPoints = &dualStencilConn[blobOffset];
1460  blobOffset += numPointsApply;
1461  FC_MODULE(operators,applysinglestencil,OPERATORS,APPLYSINGLESTENCIL)(&numDim,numX,&numComponents,&numPoints,&opDir,
1462  &numPointsApply,blobPoints,&stencilSize,
1463  stencilWeights,stencilOffsets,U,dUPtr);
1464 
1465 
1466  }
1467  double *exactdU = &exactDU[iDim*numPoints];
1468  for(size_t iPoint = 0;iPoint < numPoints;iPoint++){
1469  if(std::abs(dUPtr[iPoint]-exactdU[iPoint]) > 1e-15) {
1470  applySingleStencilTest = false;
1471  std::cout << "DU[" << iDim << "][" << iPoint << "] = (" << dUPtr[iPoint]
1472  << "," << exactdU[iPoint] << ")" << std::endl;
1473  }
1474  }
1475  }
1476 
1477  serialUnitResults.UpdateResult("Operators:ApplySingleStencil",applySingleStencilTest);
1478 
1479 
1480  // Initialize U with some field
1481  for(size_t iPoint = 0;iPoint < numPoints;iPoint++){
1482  size_t xPos = iPoint%numX[0];
1483  U[iPoint] = xPos*dX[0];
1484  exactDU[iPoint] = dX[0];
1485  dU[iPoint] = 0.0;
1486  for(int iDim = 1;iDim < numDim;iDim++){
1487  exactDU[iDim*numPoints+iPoint] = 0.0;
1488  dU[iDim*numPoints+iPoint] = 0.0;
1489  }
1490  }
1491 
1492  int *stencilSizes = sbp12.stencilSizes;
1493  int *stencilStarts = sbp12.stencilStarts;
1494  int numStencilValues = sbp12.numValues;
1495  double *stencilWeights = sbp12.stencilWeights;
1496  int *stencilOffsets = sbp12.stencilOffsets;
1497 
1498  bool applyOperatorBlobs = true;
1499  for(int iDim = 0;iDim < numDim;iDim++){
1500  int opDir = iDim+1;
1501  size_t *numPointsDimStencil = &numPointsStencil[iDim*numStencils];
1502  size_t *stencilPoints = &dualStencilConn[iDim*numPoints];
1503  double *dUPtr = &dU[iDim*numPoints];
1505  stencilSizes,stencilStarts,&numStencilValues,stencilWeights,
1506  stencilOffsets,numPointsDimStencil,&numPoints,
1507  stencilPoints,U,dUPtr);
1508  double *exactdU = &exactDU[iDim*numPoints];
1509  for(size_t iPoint = 0;iPoint < numPoints;iPoint++){
1510  if(std::abs(dUPtr[iPoint]-exactdU[iPoint]) > 1e-12) {
1511  applyOperatorBlobs = false;
1512  std::cout << "DU[" << iDim << "][" << iPoint << "] = (" << dUPtr[iPoint]
1513  << "," << exactdU[iPoint] << ")" << std::endl;
1514  }
1515  }
1516  }
1517  serialUnitResults.UpdateResult("Operators:ApplyOperatorBlobs",applyOperatorBlobs);
1518  serialUnitResults.UpdateResult("Operators:CreateStencilConnectivity",createStencilConn);
1519  serialUnitResults.UpdateResult("Operators:InvertStencilConnectivity",invertStencilConn);
1520 
1521  delete [] dualStencilConn;
1522  delete [] numPointsStencil;
1523  delete [] stencilID;
1524  delete [] numX;
1525  delete [] dX;
1526  delete [] U;
1527  delete [] dU;
1528  delete [] exactDU;
1529  delete [] opInterval;
1530 
1531 }
void const size_t const size_t const size_t const double * w
int InvertStencilConnectivity(int numDim, size_t *dimSizes, size_t *opInterval, int numStencils, int *stencilID, size_t *dualStencilConn, size_t *numPointsStencil, bool fortranInterval=false)
Inverts stencil connectivity to populate the so-called dual stencil connectivity
Definition: Stencil.C:1739
subroutine assignmentyx(numDim, numPoints, bufferSize, bufferInterval, X, Y)
ASSIGNMENTYX point-wise operator performing Y = X.
Definition: Operators.f90:1170
subroutine ywxpy(numDim, numPoints, bufferSize, bufferInterval, W, X, Y)
YWXPY point-wise operator performing Y = WX + Y, where all are vectors.
Definition: Operators.f90:835
void size_t int size_t int size_t int int int int double int int double double *void size_t int size_t int int int int int double int size_t size_t size_t double double *void size_t int size_t int size_t size_t int double int double double *void size_t size_t * bufferSize
void size_t int size_t int size_t int int * stencilSizes
void GetFlatIndices(const sizeextent &extent, ContainerType &indices) const
Definition: IndexUtil.H:302
void Flatten(ContainerType &output) const
Definition: IndexUtil.H:274
int * stencilSizes
The number of weights for each stencil.
Definition: Stencil.H:102
void size_t int size_t int size_t int int int int double int int double double *void size_t int size_t int int int int int double int size_t size_t size_t double double *void size_t int size_t int size_t size_t int double int double double *void size_t size_t size_t double double * X
void const size_t * numPoints
Definition: EulerKernels.H:10
subroutine assignmentyabsx(numDim, numPoints, bufferSize, bufferInterval, X, Y)
ASSIGNMENTYABSX point-wise operator performing X = scalar a.
Definition: Operators.f90:1275
subroutine zaxpy(N1, N2, N3, localInterval, a, X, Y, Z)
Definition: RKUtil.f90:79
void size_t int size_t int * opDir
subroutine determinant3x3(numPoints, bufferSize, bufferInterval, inMatrix, matrixDeterminant)
Computes determinant of 3x3 matrix.
Definition: Operators.f90:1449
void const size_t const size_t const size_t const int const double const int * alphaDir
Definition: MetricKernels.H:24
void TestHoleDetection(ix::test::results &serialUnitResults)
Tests boundary stencil setting around holes.
void size_t int size_t int size_t int int int * stencilStarts
void const size_t const size_t * gridSizes
Definition: EulerKernels.H:10
void const size_t const size_t const size_t const double const double double * y
int * stencilStarts
The starting index into the stencilWeight and stencilOffset arrays for each stencil.
Definition: Stencil.H:104
int * stencilOffsets
The offsets wrt the grid point at which the stencil is being applied.
Definition: Stencil.H:106
void const size_t const size_t const size_t const int const int * gridType
Definition: EulerKernels.H:10
subroutine zwxpy(numDim, numPoints, bufferSize, bufferInterval, W, X, Y, Z)
ZWXPY point-wise operator performing Z = WX + Y, where all are vectors.
Definition: Operators.f90:782
static const int holeMask
Definition: EulerRHS.H:28
void size_t size_t double * inMatrix
void const size_t const size_t const size_t * opInterval
Definition: EulerKernels.H:10
subroutine yxy(numDim, numPoints, bufferSize, bufferInterval, X, Y)
YXY point-wise operator performing Y = XY (all vectors)
Definition: Operators.f90:731
int BruteTest1(base &inOperator, int interiorOrder, int numDim, int numComponents, int numTrials, std::vector< bool > &testResults)
Brute-force accuracy test for SBP operators.
Definition: Stencil.C:625
subroutine veclen(numDim, numPoints, bufferSize, bufferInterval, numComp, V, lenV)
VECLEN point-wise operator returning the length of a numComp-dimensional vector.
Definition: Operators.f90:1328
subroutine assignmentxa(numDim, numPoints, bufferSize, bufferInterval, a, X)
ASSIGNMENTXA point-wise operator performing X = scalar a.
Definition: Operators.f90:1222
subroutine applyoperatorblobs(numDim, dimSizes, numComponents, numPointsBuffer, opDir, numStencils, stencilSizes, stencilStarts, numStencilValues, stencilWeights, stencilOffsets, numPointsStencil, numPointsApply, stencilPoints, U, dU)
applyoperatorblobs applies an operator by applying each stencil in turn to all the points to which it...
Definition: Operators.f90:312
void const size_t const size_t const size_t const double const double * x
size_t NNodes() const
Definition: IndexUtil.H:254
void size_t size_t double double * matrixDeterminant
int DetectHoles(int numDim, size_t *dimSizes, size_t *opInterval, int boundaryDepth, int holeBit, int *inMask, int *stencilID)
Detect unstructured holes and set up boundary stencil id&#39;s accordingly.
Definition: Stencil.C:1454
void TestOperatorSBP36(ix::test::results &serialUnitResults)
void TestOperatorSBP12(ix::test::results &serialUnitResults)
Encapsulating class for collections of test results.
Definition: Testing.H:18
void size_t int size_t int size_t int int int int double int * stencilOffsets
subroutine ijkgradtoxyzdiv(numDim, numPoints, gridSizes, opInterval, gridType, gridJacobian, gridMetric, gradVBuffer, divBuffer)
Definition: MetricOps.f90:129
void size_t size_t size_t double double * W
subroutine yaxpby(numDim, numPoints, bufferSize, bufferInterval, a, b, X, Y)
YAXPBY point-wise operator performing Y = aX + bY (scalar a,b)
Definition: Operators.f90:577
subroutine zxdoty(numDim, numPoints, bufferSize, bufferInterval, numComponents, X, Y, Z)
ZXDOTY numComponents-vector inner product Z = X * Y.
Definition: Operators.f90:1050
void size_t int size_t int size_t int int int int double int int * stencilID
void const size_t const size_t const size_t const int const double const int double * alphaWeight
Definition: MetricKernels.H:24
subroutine zawpxy(numDim, numPoints, bufferSize, bufferInterval, a, W, X, Y, Z)
ZAWPXY point-wise operator performing Z = aW + XY.
Definition: Operators.f90:887
int CreateStencilConnectivity(int numDim, size_t *dimSizes, size_t *opInterval, int boundaryDepth, int *stencilID, bool fortranInterval=false)
Creates simple stencil connectivity assuming all domain boundaries are physical boundaries.
Definition: Stencil.C:840
void size_t int size_t int size_t int int int int double int int double double *void size_t int size_t int int int int int double int size_t size_t size_t double double *void size_t int size_t int size_t size_t int double int double double *void size_t size_t size_t double * a
Testing constructs for unit testing.
sizeextent RelativeTranslation(const sizeextent &inOrigin, const sizeextent &inDestination) const
Definition: IndexUtil.H:535
subroutine applysinglestencil(numDim, dimSizes, numComponents, numPointsBuffer, opDir, numPointsApply, applyPoints, stencilSize, stencilWeights, stencilOffsets, U, dU)
applysinglestencil applies an operator by applying a given stencil to the specified points ...
Definition: Operators.f90:382
Encapsulation for a collection of operator stencils.
Definition: Stencil.H:26
subroutine alphaweight(numDim, numPointsBuffer, bufferSizes, opInterval, gridType, gridMetric, alphaDir, alphaW)
Definition: MetricOps.f90:14
int numValues
The total number of weights for all stencils (reqd for Fortran)
Definition: Stencil.H:98
void size_t size_t size_t double double double double *void size_t size_t size_t double double double double double *void size_t size_t size_t double double double double *void size_t size_t size_t double double double *void const size_t const size_t const size_t const int const double const double double * Z
subroutine determinant2x2(numPoints, bufferSize, bufferInterval, inMatrix, matrixDeterminant)
Computes determinant of 2x2 matrix.
Definition: Operators.f90:1501
void Overlap(const sizeextent &inextent, sizeextent &outextent) const
Definition: IndexUtil.H:324
subroutine zwmxpy(numDim, numPoints, bufferSize, bufferInterval, W, X, Y, Z)
ZWMXPY point-wise operator performing Z = W(X+Y) where all are vectors.
Definition: Operators.f90:997
subroutine yax(numDim, numPoints, bufferSize, bufferInterval, a, X, Y)
YAX point-wise operator performing Y = aX (scalar a)
Definition: Operators.f90:628
void const size_t const size_t * bufferSizes
Definition: MetricKernels.H:19
void const size_t const size_t const size_t const int const double * V
void size_t int size_t int size_t int int int int double int int double double *void size_t int size_t int int int int int double int size_t size_t size_t double double *void size_t int size_t int size_t size_t int double int double double *void size_t size_t size_t double double double * Y
void size_t int size_t int size_t int int int int double int int double double *void size_t int size_t int int int int int double int size_t size_t size_t double double *void size_t int size_t int size_t size_t int double int double double *void size_t size_t size_t * bufferInterval
void UpdateResult(const std::string &name, const ValueType &result)
Updates an existing test result.
Definition: Testing.H:55
subroutine zxy(numDim, numPoints, bufferSize, bufferInterval, X, Y, Z)
ZXY point-wise operator performing Z = XY (all vectors)
Definition: Operators.f90:679
void TestOperators(ix::test::results &serialUnitResults)
Definition: TestOperators.C:9
subroutine zvwpxy(numDim, numPoints, bufferSize, bufferInterval, V, W, X, Y, Z)
ZVWPXY point-wise operator performing Z = VW + XY.
Definition: Operators.f90:941
double * stencilWeights
The stencil weights.
Definition: Stencil.H:108
void size_t int size_t int size_t int int int int double * stencilWeights
void size_t int size_t int size_t int * numStencils
int numStencils
The number of stencils (e.g. interior + boundary)
Definition: Stencil.H:93
size_t factorial(size_t n)
void TestApplyOperatorBlobs(ix::test::results &serialUnitResults)
int Initialize(base &stencilSet, int interiorOrder)
Initialize the sbp::base stencilset with the SBP operator of given order.
Definition: Stencil.C:360
subroutine yaxpy(N1, N2, N3, localInterval, a, X, Y)
Definition: RKUtil.f90:113
subroutine yaxm1(numDim, numPoints, bufferSize, bufferInterval, a, X, Y)
YAXM1 point-wise operator performing Y = a/X (scalar a)
Definition: Operators.f90:1396
Simple Block Structured Mesh object.
Definition: IndexUtil.H:21
void TestSBPInitialize(ix::test::results &serialUnitResults)
void size_t int * numComponents
subroutine metricsum4(numDim, numPoints, bufferSize, bufferInterval, buf1, buf2, buf3, buf4, buf5, buf6, buf7, metricSum)
Computes buf1*buf4 - buf2*buf3 + buf7*(buf5 - buf6)
Definition: Operators.f90:1536
int boundaryDepth
Boundary depth is the number of biased boundary stencils for one boundary.
Definition: Stencil.H:114
subroutine zaxpby(numDim, numPoints, bufferSize, bufferInterval, a, b, X, Y, Z)
ZAXPBY point-wise operator performing Z = aX + bY (scalar a,b)
Definition: Operators.f90:526
subroutine xax(numDim, numPoints, bufferSize, bufferInterval, a, X)
XAX point-wise operator performing X = aX (scalar a)
Definition: Operators.f90:1119
void TestOperatorSBP24(ix::test::results &serialUnitResults)
void SetMask(const std::vector< size_t > &opIndices, int maskBits, int *inMask)
Definition: Stencil.C:1847
void InitSimple(const ContainerType &inSize)
Definition: IndexUtil.H:169
void const size_t * numPointsBuffer
Definition: MetricKernels.H:19
void FC_MODULE(euler, flux1d, EULER, FLUX1D)(const int *numDim