13 std::vector<size_t> numX(numDim,10);
15 for(
int iDim = 0;iDim < numDim;iDim++){
16 numPoints *= numX[iDim];
21 std::vector<size_t> flatInterval;
22 opInterval.
Flatten(flatInterval);
24 for(
int iDim = 0;iDim < numDim;iDim++){
25 flatInterval[2*iDim]++;
26 flatInterval[2*iDim+1]++;
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];
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;
60 Y3[iPoint] = y*iPoint;
63 Y3LenNeg[iPoint] = Y3[iPoint]*Y3[iPoint] +
66 Y3LenNeg[iPoint] = -1.0*std::sqrt(Y3LenNeg[iPoint]);
67 Y3Len[iPoint] = -1.0*Y3LenNeg[iPoint];
69 X3Len[iPoint] = X3[iPoint]*X3[iPoint] +
72 X3Len[iPoint] = std::sqrt(X3Len[iPoint]);
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);
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]) +
104 (X3[xyzIndex+2*numPoints]*Y3[xyzIndex+2*numPoints]))
109 serialUnitResults.
UpdateResult(
"Operators:ZXDOTY",zxdoty);
116 std::vector<double> testLen(numPoints,0);
120 if(testLen != X3Len){
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]
129 serialUnitResults.
UpdateResult(
"Operators:VECLEN",veclen);
132 bool assignyabsx =
true;
135 &Y3LenNeg[0],&testLen[0]);
138 serialUnitResults.
UpdateResult(
"Operators:ASSIGNMENTYABSX",assignyabsx);
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]))
162 &
a,&W[0],&X[0],&Y[0],&Z[0]);
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]))
175 serialUnitResults.
UpdateResult(
"Operators:ZAWPXY",zawpxy);
181 &V[0],&W[0],&X[0],&Y[0],&Z[0]);
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]))
194 serialUnitResults.
UpdateResult(
"Operators:ZVWPXY",zvwpxy);
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);
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]) -
217 inMatrix[iPoint+6*numPoints]*
218 (inMatrix[iPoint+numPoints]*inMatrix[iPoint+5*numPoints] -
219 inMatrix[iPoint+2*numPoints]*inMatrix[iPoint+4*numPoints]))
222 serialUnitResults.
UpdateResult(
"Operators:Determinant3x3",det3);
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);
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){
243 serialUnitResults.
UpdateResult(
"Operators:Determinant2x2",det2);
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]))
256 serialUnitResults.
UpdateResult(
"Operators:MetricSum4",metricsum);
260 (&numDim,&
numPoints,&numX[0],&flatInterval[0],&
a,&X[0],&Y[0]);
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])
274 serialUnitResults.
UpdateResult(
"Operators:YAXPY",yaxpy);
281 (&numDim,&
numPoints,&numX[0],&flatInterval[0],&W[0],&X[0],&Yprime[0]);
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])
294 serialUnitResults.
UpdateResult(
"Operators:YWXPY",ywxpy);
300 (&numDim,&
numPoints,&numX[0],&flatInterval[0],&
a,&b,&X[0],&Y[0],&Z[0]);
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])
313 serialUnitResults.
UpdateResult(
"Operators:ZAXPBY",zaxpby);
319 (&numDim,&
numPoints,&numX[0],&flatInterval[0],&
a,&b,&X[0],&Yprime[0]);
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])
332 serialUnitResults.
UpdateResult(
"Operators:YAXPBY",yaxpby);
336 FC_MODULE(
operators,
zaxpy,
OPERATORS,ZAXPY)(&numDim,&
numPoints,&numX[0],&flatInterval[0],&
a,&X[0],&Y[0],&Z[0]);
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])
349 serialUnitResults.
UpdateResult(
"Operators:ZAXPY",zaxpy);
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])
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])
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])
402 FC_MODULE(
operators,
zwxpy,
OPERATORS,ZWXPY)(&numDim,&
numPoints,&numX[0],&flatInterval[0],&W[0],&X[0],&Y[0],&Z[0]);
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])
415 serialUnitResults.
UpdateResult(
"Operators:ZWXPY",zwxpy);
419 FC_MODULE(
operators,
zwmxpy,
OPERATORS,ZWMXPY)(&numDim,&
numPoints,&numX[0],&flatInterval[0],&W[0],&X[0],&Y[0],&Z[0]);
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])){
429 std::cout <<
"Z[" << xyzIndex <<
"] = " << Z[xyzIndex] << std::endl;
434 serialUnitResults.
UpdateResult(
"Operators:ZWMXPY",zwmxpy);
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])
451 serialUnitResults.
UpdateResult(
"Operators:ASSIGNMENTYX",yx);
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;
469 serialUnitResults.
UpdateResult(
"Operators:ASSIGNMENTXA",xa);
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])
487 serialUnitResults.
UpdateResult(
"Operators:XAYM1",xaym1);
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);
503 std::vector<double> vDiv(numPoints,0.0);
507 &gridMetric0[0],&gradV[0],&vDiv[0]);
508 for(
size_t iPoint = 0;iPoint <
numPoints;iPoint++){
509 double expected = gridMetric0[0]*gradV[iPoint] +
511 expected *= gridJacobian0[0];
512 if(vDiv[iPoint] != expected){
516 serialUnitResults.
UpdateResult(
"Operators:MetricOps:Dilatation:Uniform",graddiv);
518 vDiv.resize(numPoints,0.0);
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];
533 &gridMetric1[0],&gradV[0],&vDiv[0]);
535 for(
size_t iPoint = 0;iPoint <
numPoints;iPoint++){
536 double expected = gridMetric1[iPoint]*gradV[iPoint] +
539 expected *= gridJacobian1[iPoint];
540 if(vDiv[iPoint] != expected){
544 serialUnitResults.
UpdateResult(
"Operators:MetricOps:Dilatation:Rectilinear",graddiv);
546 vDiv.resize(numPoints,0.0);
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];
561 &gridMetric2[0],&gradV[0],&vDiv[0]);
563 for(
size_t iPoint = 0;iPoint <
numPoints;iPoint++){
564 double expecteddudx = gridMetric2[iPoint]*gradV[iPoint] +
573 double expected = expecteddudx + expecteddvdy + expecteddwdz;
574 expected *= gridJacobian2[iPoint];
575 if(vDiv[iPoint] != expected){
579 serialUnitResults.
UpdateResult(
"Operators:MetricOps:Dilatation:Curvilinear",graddiv);
592 for(
size_t iPoint = 0;iPoint <
numPoints;iPoint++)
593 if(alphaWeight[iPoint] != gridMetric0[alphaDir-1])
596 serialUnitResults.
UpdateResult(
"Operators:MetricOps:AlphaWeight:Uniform",alphawt);
604 for(
size_t iPoint = 0;iPoint <
numPoints;iPoint++)
605 if(alphaWeight[iPoint] != gridMetric1[(alphaDir-1)*numPoints+iPoint])
608 serialUnitResults.
UpdateResult(
"Operators:MetricOps:AlphaWeight:Rectilinear",alphawt);
613 std::vector<double> metricLen(numPoints,0.0);
616 &numDim,&gridMetric2[(
alphaDir-1)*numDim*numPoints],&metricLen[0]);
620 if(alphaWeight != metricLen)
623 serialUnitResults.
UpdateResult(
"Operators:MetricOps:AlphaWeight:Curvilinear",alphawt);
632 return (n == 1 || n == 0) ? 1 :
factorial(n - 1) * n;
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;
655 for(
int numDim = 1;numDim <= 3;numDim++){
657 std::cout <<
"Testing hole detection in " << numDim <<
" dimensions." 659 int dimId = numDim-1;
665 size_t *numPointsDim = &bufferSizes[0];
667 for(
int iDim = 0;iDim < numDim;iDim++){
670 numPointsBuffer *= numPointsDim[iDim];
671 opInterval[2*iDim] = 0;
672 opInterval[2*iDim+1] = numPointsDim[iDim]-1;
676 std::vector<size_t>
gridSizes(bufferSizes);
677 std::vector<int> gridMask;
686 for(
int boundaryDepth = 1;boundaryDepth <= 5;boundaryDepth++){
690 gridMask.resize(numPointsBuffer,0);
691 int *iMask = &gridMask[0];
693 std::cout <<
"Testing with boundaryDepth = " << boundaryDepth << std::endl;
698 std::vector<int> stencilConnectivity(numDim*numPointsBuffer,0);
699 int *
stencilID = &stencilConnectivity[0];
702 boundaryDepth,stencilID,
false);
704 std::vector<int> expectedStencilConn(stencilConnectivity);
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;
713 if(!(iPoint%numPoints)) std::cout << std::endl;
714 std::cout << stencilID[pointOffset+iPoint] <<
" ";
716 std::cout << std::endl;
720 std::cout <<
"Calling DetectHoles on unholy grid." << std::endl;
723 boundaryDepth,holeMask,iMask,stencilID)){
724 test1Pass[dimId] =
false;
725 std::cout <<
"DetectHoles failed to run." << std::endl;
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++){
735 std::cout <<
"Dimension-" << iDim+1 <<
":";
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] <<
" ";
742 std::cout << std::endl;
746 std::cout <<
"Unholy test passed." << std::endl;
749 test1Result = test1Result && test1Pass[dimId];
755 expectedStencilConn.resize(0);
756 expectedStencilConn.resize(numDim*numPointsBuffer,1);
758 for(
int iDim = 0;iDim < numDim;iDim++){
761 if(leftBoundaryInterval[iDim].first == 0) {
762 leftBoundaryInterval[iDim].second = 0;
766 partitionBufferInterval,
768 if(boundaryOpInterval.
NNodes() > 0) {
771 mask::SetMask(bufferSizes,boundaryOpInterval,holeMask,iMask);
774 std::vector<size_t> nodeList;
776 for(
int iPoint = 0;iPoint < nodeList.size();iPoint++)
777 expectedConn[nodeList[iPoint]] = numStencils;
778 for(
int iBoundary = 0;iBoundary < boundaryDepth;iBoundary++){
780 boundaryOpInterval[iDim].first++;
781 boundaryOpInterval[iDim].second++;
783 for(
int iPoint = 0;iPoint < nodeList.size();iPoint++)
784 expectedConn[nodeList[iPoint]] = 2 + iBoundary;
789 if(rightBoundaryInterval[iDim].second == (gridSizes[iDim]-1)){
790 rightBoundaryInterval[iDim].first = gridSizes[iDim]-1;
793 partitionBufferInterval,
795 if(boundaryOpInterval.
NNodes() > 0) {
797 mask::SetMask(bufferSizes,boundaryOpInterval,holeMask,iMask);
800 std::vector<size_t> nodeList;
802 for(
int iPoint = 0;iPoint < nodeList.size();iPoint++)
803 expectedConn[nodeList[iPoint]] = numStencils;
804 for(
int iBoundary = 0;iBoundary < boundaryDepth;iBoundary++){
806 boundaryOpInterval[iDim].second--;
807 boundaryOpInterval[iDim].first--;
809 for(
int iPoint = 0;iPoint < nodeList.size();iPoint++)
810 expectedConn[nodeList[iPoint]] = 2 + boundaryDepth + iBoundary;
815 if(numDim == 1 || numDim == 2 || numDim == 3){
816 std::cout <<
"Setting holy border Mask: " << std::endl;
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;
828 std::cout << std::endl;
829 std::cout <<
"Expected Conn: " << std::endl;
830 for(
int iDim = 0;iDim < numDim;iDim++){
832 std::cout <<
"Dimension-" << iDim+1 <<
":";
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] <<
" ";
839 std::cout << std::endl;
844 boundaryDepth,holeMask,iMask,stencilID);
846 if(numStencils > numPoints){
848 test3Pass[dimId] =
false;
850 std::cout <<
"DetectHoles detected too much holiness." << std::endl;
854 test2Pass[dimId] =
false;
855 std::cout <<
"DetectHoles found spurious holiness." << std::endl;
857 if(stencilConnectivity != expectedStencilConn){
858 test2Pass[dimId] =
false;
859 std::cout <<
"Test failed." << std::endl;
861 std::cout <<
"Holy border test passed." << std::endl;
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++){
867 std::cout <<
"Dimension-" << iDim+1 <<
":";
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] <<
" ";
874 std::cout << std::endl;
880 test2Result = test2Result && test2Pass[dimId];
881 test3Result = test3Result && test3Pass[dimId];
886 gridMask.resize(numPointsBuffer,0);
887 iMask = &gridMask[0];
890 stencilConnectivity.resize(0);
891 stencilConnectivity.resize(numDim*numPointsBuffer,0);
893 boundaryDepth,stencilID,
false);
894 expectedStencilConn = stencilConnectivity;
898 expectedStencilConn.resize(0);
899 expectedStencilConn.resize(numDim*numPointsBuffer,1);
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;
912 holeBoundaryZone[iDim].first = holeInterval[iDim].first - boundaryDepth;
916 partitionInterval.
Overlap(holeInterval,myHoleInterval);
918 if(myHoleInterval.
NNodes() > 0){
921 partitionBufferInterval,
926 if(numDim == 1 || numDim == 2 || numDim == 3){
927 std::cout <<
"Setting central holy border Mask: " << std::endl;
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] <<
" ";
934 std::cout << std::endl;
938 boundaryDepth,holeMask,iMask,stencilID);
941 std::cout <<
"Too holy." << std::endl;
942 if(boundaryDepth < 3)
943 test4Pass[dimId] =
false;
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++){
949 std::cout <<
"Dimension-" << iDim+1 <<
":";
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] <<
" ";
956 std::cout << std::endl;
960 test4Result = test4Result && test4Pass[dimId];
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);
978 bool operatorInitialization12 =
true;
981 operatorInitialization12 =
false;
985 operatorInitialization12 =
false;
992 operatorInitialization12 =
false;
996 for(
int iStencil = 0;iStencil < order12Operator.
numStencils;iStencil++){
997 if(order12Operator.
stencilStarts[iStencil] != start) operatorInitialization12 =
false;
1008 operatorInitialization12 =
false;
1018 operatorInitialization12 =
false;
1021 serialUnitResults.
UpdateResult(
"Operators:SBP:Initialize12",operatorInitialization12);
1026 bool op24InitWorks =
true;
1028 op24InitWorks =
false;
1030 op24InitWorks =
false;
1042 op24InitWorks =
false;
1044 serialUnitResults.
UpdateResult(
"Operators:SBP:Initialize24",op24InitWorks);
1049 bool op36InitWorks =
true;
1059 double weightSum = 0.0;
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;
1069 serialUnitResults.
UpdateResult(
"Operators:SBP:Initialize36",op36InitWorks);
1077 for(
int iStencil = 0;iStencil < sbp12.
numStencils;iStencil++)
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;
1085 std::vector<bool>::iterator trIt = testResults.begin();
1086 bool testResult =
true;
1087 while(trIt != testResults.end()) {
1088 testResult = testResult&&(*trIt);
1093 serialUnitResults.
UpdateResult(
"Operators:SBP12:ApplyOperator:1D",testResult);
1096 serialUnitResults.
UpdateResult(
"Operators:SBP12:ApplyOperator:2D",testResult);
1099 serialUnitResults.
UpdateResult(
"Operators:SBP12:ApplyOperator:3D",testResult);
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]);
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]);
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]);
1140 for(
int iStencil = 0;iStencil < sbp24.
numStencils;iStencil++)
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;
1151 std::vector<bool>::iterator trIt = testResults.begin();
1152 bool testResult =
true;
1153 while(trIt != testResults.end()) {
1154 testResult = testResult&&(*trIt);
1159 serialUnitResults.
UpdateResult(
"Operators:SBP24:ApplyOperator:1D",testResult);
1162 serialUnitResults.
UpdateResult(
"Operators:SBP24:ApplyOperator:2D",testResult);
1165 serialUnitResults.
UpdateResult(
"Operators:SBP24:ApplyOperator:3D",testResult);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
1246 for(
int iStencil = 0;iStencil < sbp36.
numStencils;iStencil++)
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;
1255 std::vector<bool>::iterator trIt = testResults.begin();
1256 bool testResult =
true;
1257 while(trIt != testResults.end()) {
1258 testResult = testResult&&(*trIt);
1264 serialUnitResults.
UpdateResult(
"Operators:SBP36:ApplyOperator:1D",testResult);
1267 serialUnitResults.
UpdateResult(
"Operators:SBP36:ApplyOperator:2D",testResult);
1270 serialUnitResults.
UpdateResult(
"Operators:SBP36:ApplyOperator:3D",testResult);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
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]);
1377 size_t *numX =
new size_t [numDim];
1378 double *dX =
new double [numDim];
1380 for(
int iDim = 0;iDim < numDim;iDim++){
1383 dX[iDim] = 1.0/(numX[iDim]-1);
1384 numPoints *= numX[iDim];
1385 opInterval[2*iDim] = 1;
1386 opInterval[2*iDim+1] = numX[iDim];
1389 double *dU =
new double [numDim*
numPoints];
1390 double *exactDU =
new double [numDim*
numPoints];
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];
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;
1413 for(
int iStencil = 0;iStencil <
numStencils;iStencil++)
1415 int boundaryDepth = 1;
1419 bool createStencilConn =
true;
1429 size_t *dualStencilConn =
new size_t [numDim*
numPoints];
1430 size_t *numPointsStencil =
new size_t [numDim*
numStencils];
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++] <<
" ";
1444 std::cout << std::endl;
1448 size_t blobOffset = 0;
1449 bool applySingleStencilTest =
true;
1450 for(
int iDim = 0;iDim < numDim;iDim++){
1453 for(
int iStencil = 0;iStencil <
numStencils;iStencil++){
1454 size_t numPointsApply = numPointsStencil[iDim*numStencils+iStencil];
1459 size_t *blobPoints = &dualStencilConn[blobOffset];
1460 blobOffset += numPointsApply;
1462 &numPointsApply,blobPoints,&stencilSize,
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;
1477 serialUnitResults.
UpdateResult(
"Operators:ApplySingleStencil",applySingleStencilTest);
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];
1486 for(
int iDim = 1;iDim < numDim;iDim++){
1487 exactDU[iDim*numPoints+iPoint] = 0.0;
1488 dU[iDim*numPoints+iPoint] = 0.0;
1498 bool applyOperatorBlobs =
true;
1499 for(
int iDim = 0;iDim < numDim;iDim++){
1501 size_t *numPointsDimStencil = &numPointsStencil[iDim*
numStencils];
1502 size_t *stencilPoints = &dualStencilConn[iDim*
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;
1517 serialUnitResults.
UpdateResult(
"Operators:ApplyOperatorBlobs",applyOperatorBlobs);
1518 serialUnitResults.
UpdateResult(
"Operators:CreateStencilConnectivity",createStencilConn);
1519 serialUnitResults.
UpdateResult(
"Operators:InvertStencilConnectivity",invertStencilConn);
1521 delete [] dualStencilConn;
1522 delete [] numPointsStencil;
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
subroutine assignmentyx(numDim, numPoints, bufferSize, bufferInterval, X, Y)
ASSIGNMENTYX point-wise operator performing Y = X.
subroutine ywxpy(numDim, numPoints, bufferSize, bufferInterval, W, X, Y)
YWXPY point-wise operator performing Y = WX + Y, where all are vectors.
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
void Flatten(ContainerType &output) const
int * stencilSizes
The number of weights for each stencil.
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
subroutine assignmentyabsx(numDim, numPoints, bufferSize, bufferInterval, X, Y)
ASSIGNMENTYABSX point-wise operator performing X = scalar a.
subroutine zaxpy(N1, N2, N3, localInterval, a, X, Y, Z)
void size_t int size_t int * opDir
subroutine determinant3x3(numPoints, bufferSize, bufferInterval, inMatrix, matrixDeterminant)
Computes determinant of 3x3 matrix.
void const size_t const size_t const size_t const int const double const int * alphaDir
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
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.
int * stencilOffsets
The offsets wrt the grid point at which the stencil is being applied.
void const size_t const size_t const size_t const int const int * gridType
subroutine zwxpy(numDim, numPoints, bufferSize, bufferInterval, W, X, Y, Z)
ZWXPY point-wise operator performing Z = WX + Y, where all are vectors.
static const int holeMask
void size_t size_t double * inMatrix
void const size_t const size_t const size_t * opInterval
subroutine yxy(numDim, numPoints, bufferSize, bufferInterval, X, Y)
YXY point-wise operator performing Y = XY (all vectors)
int BruteTest1(base &inOperator, int interiorOrder, int numDim, int numComponents, int numTrials, std::vector< bool > &testResults)
Brute-force accuracy test for SBP operators.
subroutine veclen(numDim, numPoints, bufferSize, bufferInterval, numComp, V, lenV)
VECLEN point-wise operator returning the length of a numComp-dimensional vector.
subroutine assignmentxa(numDim, numPoints, bufferSize, bufferInterval, a, X)
ASSIGNMENTXA point-wise operator performing X = scalar a.
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...
void const size_t const size_t const size_t const double const double * x
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's accordingly.
void TestOperatorSBP36(ix::test::results &serialUnitResults)
void TestOperatorSBP12(ix::test::results &serialUnitResults)
Encapsulating class for collections of test results.
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)
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)
subroutine zxdoty(numDim, numPoints, bufferSize, bufferInterval, numComponents, X, Y, Z)
ZXDOTY numComponents-vector inner product Z = X * Y.
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
subroutine zawpxy(numDim, numPoints, bufferSize, bufferInterval, a, W, X, Y, Z)
ZAWPXY point-wise operator performing Z = aW + XY.
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.
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
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 ...
Encapsulation for a collection of operator stencils.
subroutine alphaweight(numDim, numPointsBuffer, bufferSizes, opInterval, gridType, gridMetric, alphaDir, alphaW)
int numValues
The total number of weights for all stencils (reqd for Fortran)
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.
void Overlap(const sizeextent &inextent, sizeextent &outextent) const
subroutine zwmxpy(numDim, numPoints, bufferSize, bufferInterval, W, X, Y, Z)
ZWMXPY point-wise operator performing Z = W(X+Y) where all are vectors.
subroutine yax(numDim, numPoints, bufferSize, bufferInterval, a, X, Y)
YAX point-wise operator performing Y = aX (scalar a)
void const size_t const size_t * bufferSizes
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.
subroutine zxy(numDim, numPoints, bufferSize, bufferInterval, X, Y, Z)
ZXY point-wise operator performing Z = XY (all vectors)
void TestOperators(ix::test::results &serialUnitResults)
subroutine zvwpxy(numDim, numPoints, bufferSize, bufferInterval, V, W, X, Y, Z)
ZVWPXY point-wise operator performing Z = VW + XY.
double * stencilWeights
The stencil weights.
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)
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.
subroutine yaxpy(N1, N2, N3, localInterval, a, X, Y)
subroutine yaxm1(numDim, numPoints, bufferSize, bufferInterval, a, X, Y)
YAXM1 point-wise operator performing Y = a/X (scalar a)
Simple Block Structured Mesh object.
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)
int boundaryDepth
Boundary depth is the number of biased boundary stencils for one boundary.
subroutine zaxpby(numDim, numPoints, bufferSize, bufferInterval, a, b, X, Y, Z)
ZAXPBY point-wise operator performing Z = aX + bY (scalar a,b)
subroutine xax(numDim, numPoints, bufferSize, bufferInterval, a, X)
XAX point-wise operator performing X = aX (scalar a)
void TestOperatorSBP24(ix::test::results &serialUnitResults)
void SetMask(const std::vector< size_t > &opIndices, int maskBits, int *inMask)
void InitSimple(const ContainerType &inSize)
void const size_t * numPointsBuffer
void FC_MODULE(euler, flux1d, EULER, FLUX1D)(const int *numDim