21 std::ostringstream messageStream;
30 bool subregionTest =
true;
32 std::string initString1(
"testRegion 1");
34 subregionTest =
false;
38 subregionTest =
false;
40 subregionTest =
false;
41 if(subRegionInterval[0].first != 0 &&
42 subRegionInterval[0].second != 0)
43 subregionTest =
false;
44 if(subRegionInterval[1] != gridInterval[1])
45 subregionTest =
false;
46 if(subRegionInterval[2] != gridInterval[2])
47 subregionTest =
false;
50 std::string initString0(
"testRegion 0");
52 subregionTest =
false;
56 subregionTest =
false;
58 subregionTest =
false;
59 if(subRegionInterval != gridInterval)
60 subregionTest =
false;
63 std::string initString_1(
"testRegion -1");
65 subregionTest =
false;
69 subregionTest =
false;
71 subregionTest =
false;
72 if(subRegionInterval[0].first != gridInterval[0].second)
73 subregionTest =
false;
74 if(subRegionInterval[0].second != gridInterval[0].second)
75 subregionTest =
false;
76 if(subRegionInterval[1] != gridInterval[1])
77 subregionTest =
false;
78 if(subRegionInterval[2] != gridInterval[2])
79 subregionTest =
false;
83 std::string initString12(
"testRegion 1 1 4");
85 subregionTest =
false;
90 subregionTest =
false;
92 subregionTest =
false;
93 if(subRegionInterval[0].first != 0 &&
94 subRegionInterval[0].second != 3)
95 subregionTest =
false;
96 if(subRegionInterval[1] != gridInterval[1])
97 subregionTest =
false;
98 if(subRegionInterval[2] != gridInterval[2])
99 subregionTest =
false;
102 std::string initString_12(
"testRegion -1 -4 -1");
104 subregionTest =
false;
108 subregionTest =
false;
110 subregionTest =
false;
111 if(subRegionInterval[0].first != (gridInterval[0].second-3))
112 subregionTest =
false;
113 if(subRegionInterval[0].second != gridInterval[0].second)
114 subregionTest =
false;
115 if(subRegionInterval[1] != gridInterval[1])
116 subregionTest =
false;
117 if(subRegionInterval[2] != gridInterval[2])
118 subregionTest =
false;
122 std::string initString13(
"testRegion 1 1 4 10 15");
124 subregionTest =
false;
129 subregionTest =
false;
131 subregionTest =
false;
132 if(subRegionInterval[0].first != 0 &&
133 subRegionInterval[0].second != 3)
134 subregionTest =
false;
135 if(subRegionInterval[1].first != 9)
136 subregionTest =
false;
137 if(subRegionInterval[1].second != 14)
138 subregionTest =
false;
139 if(subRegionInterval[2] != gridInterval[2])
140 subregionTest =
false;
143 std::string initString14(
"testRegion 1 1 4 10 15 20 23");
145 subregionTest =
false;
150 subregionTest =
false;
152 subregionTest =
false;
153 if(subRegionInterval[0].first != 0 &&
154 subRegionInterval[0].second != 3)
155 subregionTest =
false;
156 if(subRegionInterval[1].first != 9)
157 subregionTest =
false;
158 if(subRegionInterval[1].second != 14)
159 subregionTest =
false;
160 if(subRegionInterval[2].first != 19)
161 subregionTest =
false;
162 if(subRegionInterval[2].second != 22)
163 subregionTest =
false;
166 std::string initString_14(
"testRegion -1 -4 -1 1 10 2 20");
168 subregionTest =
false;
173 subregionTest =
false;
175 subregionTest =
false;
176 if(subRegionInterval[0].first != (gridInterval[0].second-3) &&
177 subRegionInterval[0].second != gridInterval[0].second)
178 subregionTest =
false;
179 if(subRegionInterval[1].first != 0)
180 subregionTest =
false;
181 if(subRegionInterval[1].second != 9)
182 subregionTest =
false;
183 if(subRegionInterval[2].first != 1)
184 subregionTest =
false;
185 if(subRegionInterval[2].second != 19)
186 subregionTest =
false;
189 std::string initString_24(
"testRegion -2 1 4 -10 -1 2 20");
191 subregionTest =
false;
196 subregionTest =
false;
198 subregionTest =
false;
199 if(subRegionInterval[0].first != 0 &&
200 subRegionInterval[0].second != 3)
201 subregionTest =
false;
202 if(subRegionInterval[1].first != (gridInterval[1].second - 9))
203 subregionTest =
false;
204 if(subRegionInterval[1].second != gridInterval[1].second)
205 subregionTest =
false;
206 if(subRegionInterval[2].first != 1)
207 subregionTest =
false;
208 if(subRegionInterval[2].second != 19)
209 subregionTest =
false;
212 std::string initString02(
"testRegion 0 1 -1 1 10 1 -1");
214 subregionTest =
false;
216 subregionTest =
false;
217 if(subRegionInterval[0] != gridInterval[0])
218 subregionTest =
false;
219 if(subRegionInterval[1].first != 0 &&
220 subRegionInterval[1].second != 9)
221 subregionTest =
false;
222 if(subRegionInterval[2] != gridInterval[2])
223 subregionTest =
false;
225 serialUnitResults.
UpdateResult(
"Grid:SubRegion:InitSubRegionFromString",subregionTest);
231 std::ostringstream messageStream;
243 myGlobal.
Init(
"TestGrid_CartesianMetric",testComm);
247 std::vector<bool> testResults(2,
true);
248 std::vector<size_t> allSizes(3,0);
255 for(
int numDim = 2;numDim < 4;numDim++){
257 bool sectionResult =
true;
268 size_t numGlobalNodes = 1;
269 size_t numGlobalCells = 1;
271 for(
int iDim = 0;iDim < numDim;iDim++){
272 gridSizes[iDim] = allSizes[iDim];
273 numGlobalNodes *= gridSizes[iDim];
274 numGlobalCells *= (gridSizes[iDim]-1);
278 messageStream <<
"Setting up grid with sizes: (";
280 messageStream <<
")" << std::endl;
281 myGlobal.
StdOut(messageStream.str());
286 messageStream <<
"====== Grid Parallel Setup ========= " << std::endl;
287 if(testGrid.
ParallelSetup(testComm,cartInfo,haloDepth,messageStream)){
288 myGlobal.
ErrOut(
"Grid::ParallelSetup failed with messages:\n");
289 myGlobal.
ErrOut(messageStream.str());
291 sectionResult =
false;
293 sectionResult =
CheckResult(sectionResult,testComm);
295 testResults[numDim-2] =
false;
298 messageStream <<
"==================================== " << std::endl;
301 messageStream <<
"------- Grid & Topo Report --------- " << std::endl;
304 <<
"------------------------------------ " << std::endl;
305 myGlobal.
StdOut(messageStream.str());
309 std::vector<double> physicalGridExtent(2*numDim,0);
310 std::vector<double> dX(numDim,0);
311 double expectedJacobian = 1.0;
312 std::vector<double> expectedMetric(numDim,0);
313 for(
int iDim = 0;iDim < numDim;iDim++){
314 physicalGridExtent[iDim*2+1] = 1.0;
315 dX[iDim] = 1.0/(double(gridSizes[iDim]-1));
316 expectedMetric[iDim] = 1.0/dX[iDim];
317 expectedJacobian *= expectedMetric[iDim];
319 for(
int iDim = 0;iDim < numDim;iDim++){
320 expectedMetric[iDim] *= 1.0/expectedJacobian;
326 myGlobal.
StdOut(
"Coordinate generation failed with messages:\n");
327 myGlobal.
StdOut(messageStream.str());
328 myGlobal.
StdOut(
"\nSkipping rest of this test.\n");
330 sectionResult =
false;
332 sectionResult =
CheckResult(sectionResult,testComm);
334 testResults[numDim-2] =
false;
338 myGlobal.
StdOut(messageStream.str());
342 myGlobal.
StdOut(
"Metrics generation failed with messages:\n");
343 myGlobal.
StdOut(messageStream.str());
344 myGlobal.
StdOut(
"\nSkipping rest of this test.\n");
346 sectionResult =
false;
348 sectionResult =
CheckResult(sectionResult,testComm);
350 testResults[numDim-2] =
false;
354 myGlobal.
StdOut(messageStream.str());
361 messageStream <<
"Grid metric not as expected. (";
363 messageStream <<
") != (";
365 messageStream <<
"). Test failed for " << numDim <<
" dimensions." 367 myGlobal.
StdOut(messageStream.str());
369 sectionResult =
false;
371 sectionResult =
CheckResult(sectionResult,testComm);
373 testResults[numDim-2] =
false;
378 myGlobal.
StdOut(
"Grid Jacobian not of proper size.");
379 sectionResult =
false;
381 sectionResult =
CheckResult(sectionResult,testComm);
383 testResults[numDim-2] =
false;
388 messageStream <<
"Grid Jacobian does not have expected value (" 390 <<
"). Test failed." << std::endl;
391 myGlobal.
StdOut(messageStream.str());
392 sectionResult =
false;
395 messageStream <<
"Grid Jacobian does not have expected value (" 397 <<
"). Test failed." << std::endl;
398 myGlobal.
StdOut(messageStream.str());
399 sectionResult =
false;
402 sectionResult =
CheckResult(sectionResult,testComm);
404 testResults[numDim-2] =
false;
410 parallelUnitResults.
UpdateResult(
"Grid:PBS:CartesianMetric2D",testResults[0]);
411 parallelUnitResults.
UpdateResult(
"Grid:PBS:CartesianMetric3D",testResults[1]);
419 double scale[] = {101,51,21};
420 double dxDXi = 2.0*(ijk[0]+1)/(scale[0]*scale[0]);
421 double dyDEta = 4.0*(ijk[1]+1)/(scale[1]*scale[1]);
424 jacm1 = xyz[0]*xyz[1];
426 double dzDZeta = 6.0*(ijk[2]+1)/(scale[2]*scale[2]);
427 xyz[0] = dyDEta*dzDZeta;
428 xyz[1] = dxDXi*dzDZeta;
429 xyz[2] = dxDXi*dyDEta;
430 jacm1 = xyz[0]*xyz[1]*xyz[2];
438 std::ostringstream messageStream;
450 myGlobal.
Init(
"TestGrid_RectilinearMetric",testComm);
454 std::vector<bool> testResults(2,
true);
455 std::vector<size_t> allSizes(3,0);
456 std::vector<double> scale(3,0);
463 for(
int numDim = 2;numDim < 4;numDim++){
465 bool sectionResults =
true;
468 int interiorSBPOrder = 4;
469 int haloDepth = interiorSBPOrder+1;
478 size_t numGlobalNodes = 1;
479 size_t numGlobalCells = 1;
481 std::vector<double> gridScale(numDim,1.0);
482 for(
int iDim = 0;iDim < numDim;iDim++){
483 gridSizes[iDim] = allSizes[iDim];
484 gridScale[iDim] = double(allSizes[iDim]);
485 numGlobalNodes *= gridSizes[iDim];
486 numGlobalCells *= (gridSizes[iDim]-1);
491 messageStream <<
"Setting up grid with sizes: (";
493 messageStream <<
")" << std::endl;
494 myGlobal.
StdOut(messageStream.str());
499 messageStream <<
"====== Grid Parallel Setup ========= " << std::endl;
500 if(testGrid.
ParallelSetup(testComm,cartInfo,haloDepth,messageStream)){
501 myGlobal.
ErrOut(
"Grid::ParallelSetup failed with messages:\n");
502 myGlobal.
ErrOut(messageStream.str());
504 sectionResults =
false;
506 sectionResults =
CheckResult(sectionResults,testComm);
508 testResults[numDim-2] =
false;
511 messageStream <<
"==================================== " << std::endl;
515 std::vector<size_t> partitionSizes(partitionInterval.Sizes());
516 std::vector<size_t> partitionStarts(partitionInterval.Starts());
517 std::vector<size_t> partitionBufferStarts(partitionBufferInterval.Starts());
520 messageStream <<
"------- Grid & Topo Report --------- " << std::endl;
523 messageStream <<
"------------------------------------ " << std::endl;
524 myGlobal.
StdOut(messageStream.str());
530 std::vector<double> expectedMetric(numDim*numPointsBuffer,0);
531 std::vector<double> expectedJacobian(2*numPointsBuffer,0);
532 std::vector<double> pointMetric(numDim,0);
533 std::vector<size_t> pointIndices(numDim,0);
537 std::ostringstream topoTypeStream;
538 topoTypeStream << numDim <<
"DSMesh";
541 std::vector<size_t> rGridSizes(testGrid.
GridSizes());
542 std::reverse(rGridSizes.begin(),rGridSizes.end());
551 for(
size_t iY = 0;iY < partitionSizes[1];iY++){
552 pointIndices[1] = iY + partitionStarts[1];
553 size_t bufferY = iY + partitionBufferStarts[1];
554 for(
size_t iX = 0;iX < partitionSizes[0];iX++){
555 pointIndices[0] = iX + partitionStarts[0];
556 size_t bufferX = iX + partitionBufferStarts[0];
557 size_t bufferIndex = bufferY*nPlane + bufferX;
560 GenerateRectilinearMetric1<2>(pointIndices,pointMetric,
562 expectedMetric[bufferIndex] = pointMetric[0];
576 std::ofstream xdmfStream;
577 xdmfStream.open(
"rectilinear2d.xdmf");
581 rGridSizes,xdmfStream);
587 }
else if(numDim == 3) {
593 for(
size_t iZ = 0;iZ < partitionSizes[2];iZ++){
594 pointIndices[2] = iZ + partitionStarts[2];
595 size_t bufferZ = iZ + partitionBufferStarts[2];
596 for(
size_t iY = 0;iY < partitionSizes[1];iY++){
597 pointIndices[1] = iY + partitionStarts[1];
598 size_t bufferY = iY + partitionBufferStarts[1];
599 for(
size_t iX = 0;iX < partitionSizes[0];iX++){
600 pointIndices[0] = iX + partitionStarts[0];
601 size_t bufferX = iX + partitionBufferStarts[0];
602 size_t bufferIndex = bufferZ*nPlane + bufferY*bufferSizes[0] + bufferX;
605 GenerateRectilinearMetric1<3>(pointIndices,pointMetric,
607 expectedMetric[bufferIndex] = pointMetric[0];
622 std::ofstream xdmfStream;
623 xdmfStream.open(
"rectilinear3d.xdmf");
627 rGridSizes,xdmfStream);
636 myGlobal.
StdOut(messageStream.str());
640 operator_t sbpOperator;
642 int connBoundaryDepth = (sbpOperator.
numStencils-2)/2;
644 for(
int iStencil = 0;iStencil < sbpOperator.
numStencils;iStencil++)
647 std::vector<int> stencilConnectivity(numDim*numPointsBuffer,0);
649 partitionBufferInterval.Flatten(opInterval);
650 std::vector<size_t>::iterator dOpIt = opInterval.begin();
651 while(dOpIt != opInterval.end()){
657 connBoundaryDepth,&stencilConnectivity[0],
true)){
658 messageStream <<
"CreateStencilConnectivity failed. Aborting the test." << std::endl;
659 myGlobal.
StdOut(messageStream.str());
661 sectionResults =
false;
663 sectionResults =
CheckResult(sectionResults,testComm);
665 testResults[numDim-2] =
false;
672 myGlobal.
StdOut(
"Metrics generation failed with messages:\n");
673 myGlobal.
StdOut(messageStream.str());
674 myGlobal.
StdOut(
"\nSkipping rest of this test.\n");
676 sectionResults =
false;
678 sectionResults =
CheckResult(sectionResults,testComm);
680 testResults[numDim-2] =
false;
684 myGlobal.
StdOut(messageStream.str());
696 double error11 = std::abs(
gridMetric[iPoint] - expectedMetric[iPoint]);
697 double error22 = std::abs(
gridMetric[iPoint2] - expectedMetric[iPoint2]);
700 sectionResults =
false;
701 messageStream <<
"gridMetric11[" << iPoint <<
"] = " 702 <<
gridMetric[iPoint] <<
"," << expectedMetric[iPoint]
706 sectionResults =
false;
707 messageStream <<
"gridMetric22[" << iPoint <<
"] = " 708 <<
gridMetric[iPoint2] <<
"," << expectedMetric[iPoint2]
712 sectionResults =
CheckResult(sectionResults,testComm);
713 }
else if (numDim == 3){
719 double error11 = std::abs(
gridMetric[iPoint] - expectedMetric[iPoint]);
720 double error22 = std::abs(
gridMetric[iPoint2] - expectedMetric[iPoint2]);
721 double error33 = std::abs(
gridMetric[iPoint3] - expectedMetric[iPoint3]);
724 sectionResults =
false;
725 messageStream <<
"gridMetric11[" << iPoint <<
"] = " 726 <<
gridMetric[iPoint] <<
"," << expectedMetric[iPoint]
730 sectionResults =
false;
731 messageStream <<
"gridMetric22[" << iPoint <<
"] = " 732 <<
gridMetric[iPoint2] <<
"," << expectedMetric[iPoint2]
736 sectionResults =
false;
737 messageStream <<
"gridMetric33[" << iPoint <<
"] = " 738 <<
gridMetric[iPoint3] <<
"," << expectedMetric[iPoint3]
742 sectionResults =
CheckResult(sectionResults,testComm);
745 testResults[numDim-2] =
false;
746 messageStream <<
"Test failed in " << numDim <<
" dimensions." << std::endl;
747 myGlobal.
StdOut(messageStream.str());
769 myGlobal.
StdOut(
"2D Test passed.\n");
771 myGlobal.
StdOut(
"3D Test passed.\n");
773 parallelUnitResults.
UpdateResult(
"Grid:PBS:Rectilinear2D",testResults[0]);
774 parallelUnitResults.
UpdateResult(
"Grid:PBS:Rectilinear3D",testResults[1]);
785 std::vector<double> &met,
786 std::vector<double> &jac,
794 double dr = (rmax - r0)/(
double(scale[0]-1));
795 double d0 = (2.0*M_PI)/(
double(scale[1]));
796 double dp = (2.0*M_PI)/(
double(scale[2]));
797 double r = r0 + ijk[0]*dr;
798 double a0 = ijk[1]*d0;
802 double dxDXi = dr*std::cos(a0);
803 double dxDEta = -1.0*d0*r*std::sin(a0);
804 double dyDXi = dr*std::sin(a0);
805 double dyDEta = d0*r*std::cos(a0);
808 met[1] = -1.0*dxDEta;
817 jacm1 = met[0]*met[3] - met[1]*met[2];
819 if(std::abs(jacm1 - r*dr*d0) > 1e-12){
820 std::cout <<
"Warning: Errors detected in expected 2d Jacobian." << std::endl;
822 }
else if (numDim == 3){
824 double phi = ijk[2]*dp;
826 double x = (rt + r*std::cos(a0))*std::sin(phi);
828 double x_xi = dr*std::cos(a0)*std::sin(phi);
829 double x_xi_eta = -1.0*d0*dr*std::sin(a0)*std::sin(phi);
830 double x_xi_zeta = dr*std::cos(a0)*dp*std::cos(phi);
833 double x_eta = -1.0*d0*r*std::sin(a0)*std::sin(phi);
834 double x_eta_xi = -1.0*d0*dr*std::sin(a0)*std::sin(phi);
835 double x_eta_zeta = -1.0*dp*d0*r*std::sin(a0)*std::cos(phi);
838 double x_zeta = (rt + r*std::cos(a0))*dp*std::cos(phi);
839 double x_zeta_xi = dr*std::cos(a0)*dp*std::cos(phi);
840 double x_zeta_eta = -1.0*r*d0*std::sin(a0)*dp*std::cos(phi);
843 double y = (rt + r*std::cos(a0))*std::cos(phi);
845 double y_xi = dr*std::cos(a0)*std::cos(phi);
846 double y_xi_eta = -1.0*dr*d0*std::sin(a0)*std::cos(phi);
847 double y_xi_zeta = -1.0*dr*dp*std::cos(a0)*std::sin(phi);
850 double y_eta = -1.0*d0*r*std::sin(a0)*std::cos(phi);
851 double y_eta_xi = -1.0*d0*dr*std::sin(a0)*std::cos(phi);
852 double y_eta_zeta = d0*dp*r*std::sin(a0)*std::sin(phi);
855 double y_zeta = -1.0*dp*(rt+r*std::cos(a0))*std::sin(phi);
856 double y_zeta_xi = -1.0*dp*dr*std::cos(a0)*std::sin(phi);
857 double y_zeta_eta = dp*r*d0*std::sin(a0)*std::sin(phi);
860 double z = r*std::sin(a0);
862 double z_xi = dr*std::sin(a0);
863 double z_xi_eta = dr*d0*std::cos(a0);
864 double z_xi_zeta = 0.0;
867 double z_eta = d0*r*std::cos(a0);
868 double z_eta_xi = d0*dr*std::cos(a0);
869 double z_eta_zeta = 0.0;
873 double z_zeta_xi = 0.0;
874 double z_zeta_eta = 0.0;
878 met[0] = y_eta_zeta*z + y_eta*z_zeta - y_zeta_eta*z - y_zeta*z_eta;
879 met[1] = z_eta_zeta*x + z_eta*x_zeta - z_zeta_eta*x - z_zeta*x_eta;
880 met[2] = x_eta_zeta*y + x_eta*y_zeta - x_zeta_eta*y - x_zeta*y_eta;
881 met[3] = y_zeta_xi*z + y_zeta*z_xi - y_xi_zeta*z - y_xi*z_zeta;
882 met[4] = z_zeta_xi*x + z_zeta*x_xi - z_xi_zeta*x - z_xi*x_zeta;
883 met[5] = x_zeta_xi*y + x_zeta*y_xi - x_xi_zeta*y - x_xi*y_zeta;
884 met[6] = y_xi_eta*z + y_xi*z_eta - y_eta_xi*z - y_eta*z_xi;
885 met[7] = z_xi_eta*x + z_xi*x_eta - z_eta_xi*x - z_eta*x_xi;
886 met[8] = x_xi_eta*y + x_xi*y_eta - x_eta_xi*y - x_eta*y_xi;
889 x_xi*(z_zeta*y_eta - z_eta*y_zeta) -
890 y_xi*(z_zeta*x_eta - z_eta*x_zeta) +
891 z_xi*(y_zeta*x_eta - y_eta*x_zeta);
893 double expectedJac = r*(rt+r*std::cos(a0))*dr*dp*d0;
895 double jacErr = std::abs(jacm1 - expectedJac)/expectedJac;
898 std::cout <<
"Warning: Errors detected in expected 3d Jacobian (" 899 << jacm1 <<
"," << expectedJac <<
")." << std::endl;
904 std::cout <<
"Warning: Expected Jacobian is negative." << std::endl;
911 std::vector<double> &xyz,
double &jacm1)
915 double I = (ijk[0] + 1)/scale[0];
916 double J = (ijk[1] + 1)/scale[1];
920 double dxDXi = 2.0*I/scale[0];
921 double dxDEta = 1.0/scale[1];
922 double dyDXi = 1.0/scale[0];
923 double dyDEta = 4.0*J/scale[1];
926 xyz[1] = -1.0*dxDEta;
930 jacm1 = xyz[0]*xyz[3] - xyz[1]*xyz[2];
933 std::cout <<
"Warning: Negative Jacobian." << std::endl;
953 std::ostringstream messageStream;
966 myGlobal.
Init(
"TestGrid_CurvilinearMetric",testComm);
970 std::vector<bool> testResults(2,
true);
971 std::vector<size_t> allSizes(3,0);
972 std::vector<double> scale(3,0);
979 for(
int numDim = 2;numDim <= 3;numDim++){
981 bool sectionResults =
true;
984 int interiorSBPOrder = 4;
985 int haloDepth = interiorSBPOrder+1;
996 size_t numGlobalNodes = 1;
997 size_t numGlobalCells = 1;
999 for(
int iDim = 0;iDim < numDim;iDim++){
1000 gridSizes[iDim] = allSizes[iDim];
1001 numGlobalNodes *= gridSizes[iDim];
1002 numGlobalCells *= (gridSizes[iDim]-1);
1007 messageStream <<
"Setting up grid with sizes: (";
1009 messageStream <<
")" << std::endl;
1010 myGlobal.
StdOut(messageStream.str());
1015 messageStream <<
"====== Grid Parallel Setup ========= " << std::endl;
1016 if(testGrid.
ParallelSetup(testComm,cartInfo,haloDepth,messageStream)){
1017 myGlobal.
ErrOut(
"Grid::ParallelSetup failed with messages:\n");
1018 myGlobal.
ErrOut(messageStream.str());
1020 sectionResults =
false;
1022 sectionResults =
CheckResult(sectionResults,testComm);
1023 if(!sectionResults){
1024 testResults[numDim-2] =
false;
1027 messageStream <<
"==================================== " << std::endl;
1030 messageStream <<
"------- Grid & Topo Report --------- " << std::endl;
1033 messageStream <<
"------------------------------------ " << std::endl;
1034 myGlobal.
StdOut(messageStream.str());
1042 std::vector<size_t> partitionSizes(partitionInterval.Sizes());
1043 std::vector<size_t> partitionStarts(partitionInterval.Starts());
1044 std::vector<size_t> partitionBufferStarts(partitionBufferInterval.Starts());
1048 std::vector<size_t> partitionBufferIndices;
1049 bufferInterval.GetFlatIndices(partitionBufferInterval,partitionBufferIndices);
1054 int numMetricComponents = numDim*numDim;
1055 std::vector<double> expectedMetric(numMetricComponents*numPointsBuffer,0);
1056 std::vector<double> metricIdentities;
1057 std::vector<double> expectedJacobian(2*numPointsBuffer,0);
1058 std::vector<double> expectedJacobianMatrix(numMetricComponents*numPointsBuffer,0);
1059 std::vector<double> pointMetric(numMetricComponents,0);
1060 std::vector<double> pointMatrix(numMetricComponents,0);
1061 std::vector<size_t> pointIndices(numDim,0);
1065 testState.
AddField(
"expectedMetric",
'n',numMetricComponents,8,
"");
1066 testState.
AddField(
"metricIdentities",
'n',numDim,8,
"");
1067 testState.
AddField(
"expectedJacobian",
'n',2,8,
"");
1068 testState.
AddField(
"expectedJacobianMatrix",
'n',numMetricComponents,8,
"");
1069 testState.
AddField(
"gridMetric",
'n',numMetricComponents,8,
"");
1070 testState.
AddField(
"metricError",
'n',numMetricComponents,8,
"");
1071 testState.
AddField(
"gridJacobian",
'n',2,8,
"");
1072 testState.
AddField(
"jacobianMatrix",
'n',numMetricComponents,8,
"");
1073 testState.
AddField(
"sconn",
'n',numDim,4,
"");
1074 testState.
AddField(
"xyz",
'n',numDim,8,
"");
1075 testState.
AddField(
"ijk",
'n',numDim,4,
"");
1076 testState.
AddField(
"bufferIndex1",
'n',1,4,
"");
1077 testState.
AddField(
"jacobianError",
'n',2,8,
"");
1078 testState.
AddField(
"jacobianMatrixError",
'n',numMetricComponents,8,
"");
1079 testState.
Create(numPointsBuffer,0);
1082 testState.
SetFieldBuffer(
"expectedJacobian",&expectedJacobian[0]);
1083 testState.
SetFieldBuffer(
"expectedJacobianMatrix",&expectedJacobianMatrix[0]);
1086 int *bufferIndex1 = testState.
GetFieldBuffer<
int>(
"bufferIndex1");
1088 std::ostringstream topoTypeStream;
1089 topoTypeStream << numDim <<
"DSMesh";
1091 std::vector<size_t> rGridSizes(testGrid.
GridSizes());
1092 std::reverse(rGridSizes.begin(),rGridSizes.end());
1095 messageStream <<
"Running " << numDim <<
"-dimensional test." << std::endl;
1096 myGlobal.
StdOut(messageStream.str());
1102 myGlobal.
StdOut(
"Generating 2D grid.\n");
1107 myGlobal.
StdOut(
"Exchanging coordinates.\n");
1112 myGlobal.
StdOut(
"Generating expected grid metrics.\n");
1115 for(
size_t iY = 0;iY < partitionSizes[1];iY++){
1116 pointIndices[1] = iY + partitionStarts[1];
1117 size_t bufferY = iY + partitionBufferStarts[1];
1118 for(
size_t iX = 0;iX < partitionSizes[0];iX++){
1119 pointIndices[0] = iX + partitionStarts[0];
1120 size_t bufferX = iX + partitionBufferStarts[0];
1121 size_t bufferIndex = bufferY*nPlane + bufferX;
1122 ijkFieldPtr[bufferIndex] = pointIndices[0];
1124 bufferIndex1[bufferIndex] = bufferIndex;
1125 for(
int iComp = 0;iComp < numMetricComponents;iComp++){
1126 pointMetric[iComp] = 0;
1128 GenerateCurvilinearMetric1<2>(pointIndices,pointMetric,pointMatrix,
1130 expectedJacobian[bufferIndex] = 1.0/expectedJacobian[bufferIndex+
numPointsBuffer];
1131 for(
int iComp = 0;iComp < numMetricComponents;iComp++){
1132 expectedMetric[bufferIndex+iComp*
numPointsBuffer] = pointMetric[iComp];
1133 expectedJacobianMatrix[bufferIndex+iComp*
numPointsBuffer] = pointMatrix[iComp];
1138 }
else if(numDim == 3) {
1141 myGlobal.
StdOut(
"Generating 3D grid.\n");
1143 testGrid.
GenerateCoordinates(gridgen::CurvilinearGrid1<3,CLSIZE1,CLSIZE2,CLSIZE3>,messageStream);
1146 myGlobal.
StdOut(
"Exchanging coordinates.\n");
1151 myGlobal.
StdOut(
"Generating expected grid metrics.\n");
1154 for(
size_t iZ = 0;iZ < partitionSizes[2];iZ++){
1155 pointIndices[2] = iZ + partitionStarts[2];
1156 size_t bufferZ = iZ + partitionBufferStarts[2];
1157 for(
size_t iY = 0;iY < partitionSizes[1];iY++){
1158 pointIndices[1] = iY + partitionStarts[1];
1159 size_t bufferY = iY + partitionBufferStarts[1];
1160 for(
size_t iX = 0;iX < partitionSizes[0];iX++){
1161 pointIndices[0] = iX + partitionStarts[0];
1162 size_t bufferX = iX + partitionBufferStarts[0];
1163 size_t bufferIndex = bufferZ*nPlane + bufferY*bufferSizes[0] + bufferX;
1164 ijkFieldPtr[bufferIndex] = pointIndices[0];
1167 bufferIndex1[bufferIndex] = bufferIndex;
1168 for(
int iComp = 0;iComp < numMetricComponents;iComp++){
1169 pointMetric[iComp] = 0;
1171 GenerateCurvilinearMetric1<3>(pointIndices,pointMetric,pointMatrix,
1173 expectedJacobian[bufferIndex] = 1.0/expectedJacobian[bufferIndex+
numPointsBuffer];
1174 for(
int iComp = 0;iComp < numMetricComponents;iComp++){
1175 expectedMetric[bufferIndex+iComp*
numPointsBuffer] = pointMetric[iComp];
1176 expectedJacobianMatrix[bufferIndex+iComp*
numPointsBuffer] = pointMatrix[iComp];
1187 myGlobal.
StdOut(messageStream.str());
1190 myGlobal.
StdOut(
"Setting up differential operators for grid.\n");
1193 operator_t sbpOperator;
1195 int connBoundaryDepth = (sbpOperator.
numStencils-2)/2;
1197 for(
int iStencil = 0;iStencil < sbpOperator.
numStencils;iStencil++)
1200 std::vector<int> stencilConnectivity(numDim*numPointsBuffer,0);
1204 partitionBufferInterval.Flatten(opInterval);
1205 std::vector<size_t>::iterator dOpIt = opInterval.begin();
1206 while(dOpIt != opInterval.end()){
1213 &stencilConnectivity[0],
true)){
1214 messageStream <<
"CreateStencilConnectivity failed. Aborting the test." << std::endl;
1215 myGlobal.
StdOut(messageStream.str());
1217 sectionResults =
false;
1219 sectionResults =
CheckResult(sectionResults,testComm);
1220 if(!sectionResults){
1221 testResults[numDim-2] =
false;
1227 myGlobal.
StdOut(
"Computing Jacobian matrix.\n");
1230 myGlobal.
StdOut(
"Jacobian matrix generation failed with messages:\n");
1231 myGlobal.
StdOut(messageStream.str());
1232 myGlobal.
StdOut(
"Skipping the rest of this test.\n");
1234 sectionResults =
false;
1236 sectionResults =
CheckResult(sectionResults,testComm);
1237 if(!sectionResults){
1238 testResults[numDim-2] =
false;
1243 myGlobal.
StdOut(messageStream.str());
1246 myGlobal.
StdOut(
"Computing metrics.\n");
1249 myGlobal.
StdOut(
"Metrics generation failed with messages:\n");
1250 myGlobal.
StdOut(messageStream.str());
1251 myGlobal.
StdOut(
"\nSkipping rest of this test.\n");
1253 sectionResults =
false;
1255 sectionResults =
CheckResult(sectionResults,testComm);
1256 if(!sectionResults){
1257 testResults[numDim-2] =
false;
1261 myGlobal.
StdOut(messageStream.str());
1264 myGlobal.
StdOut(
"Computing metric identities.\n");
1266 myGlobal.
StdOut(
"Compute metric identities failed with messages:\n");
1267 myGlobal.
StdOut(messageStream.str());
1268 myGlobal.
StdOut(
"\nSkipping rest of this test.\n");
1270 sectionResults =
false;
1272 sectionResults =
CheckResult(sectionResults,testComm);
1273 if(!sectionResults){
1274 testResults[numDim-2] =
false;
1278 myGlobal.
StdOut(messageStream.str());
1281 myGlobal.
StdOut(
"Checking Jacobian matrix.\n");
1287 double *jm1MatrixError = testState.
GetFieldBuffer<
double>(
"jacobianMatrixError");
1288 std::vector<size_t>::iterator indexIt = partitionBufferIndices.begin();
1289 while(indexIt != partitionBufferIndices.end()){
1290 size_t iPoint = *indexIt++;
1291 for(
int iComponent = 0;iComponent < numMetricComponents;iComponent++){
1293 jm1MatrixError[iMetricPoint] = std::abs(jm1Matrix[iMetricPoint] -
1294 expectedJacobianMatrix[iMetricPoint]);
1295 if(jm1MatrixError[iMetricPoint] > 1e-7){
1296 sectionResults =
false;
1301 sectionResults =
CheckResult(sectionResults,testComm);
1302 if(!sectionResults){
1303 testResults[numDim-2] =
false;
1304 messageStream << numDim <<
"D Jacobian matrix test failed." << std::endl;
1305 myGlobal.
StdOut(messageStream.str());
1308 sectionResults =
true;
1310 myGlobal.
StdOut(
"Checking Jacobian determinant.\n");
1313 bool jacSection =
true;
1315 myGlobal.
StdOut(
"Grid Jacobian not of proper size.");
1320 testResults[numDim-2] =
false;
1321 messageStream << numDim <<
"D Jacobian size test failed." << std::endl;
1322 myGlobal.
StdOut(messageStream.str());
1327 double *jacobianError = testState.
GetFieldBuffer<
double>(
"jacobianError");
1328 indexIt = partitionBufferIndices.begin();
1329 while(indexIt != partitionBufferIndices.end()){
1330 size_t iPoint = *indexIt++;
1331 for(
int iComponent = 0;iComponent < 2;iComponent++){
1333 jacobianError[iMetricPoint] = std::abs(
gridJacobian[iMetricPoint] -
1334 expectedJacobian[iMetricPoint]);
1335 jacobianError[iMetricPoint] /= expectedJacobian[iMetricPoint];
1336 if(jacobianError[iMetricPoint] > 1e-6){
1343 jacSection =
CheckResult(sectionResults,testComm);
1345 testResults[numDim-2] =
false;
1346 messageStream << numDim <<
"D Jacobian accuracy test failed." << std::endl;
1347 myGlobal.
StdOut(messageStream.str());
1353 myGlobal.
StdOut(
"Checking the metrics.\n");
1357 double *metricError = testState.
GetFieldBuffer<
double>(
"metricError");
1358 std::vector<bool> metricTest(numMetricComponents,
true);
1360 indexIt = partitionBufferIndices.begin();
1361 while(indexIt != partitionBufferIndices.end()){
1362 size_t iPoint = *indexIt++;
1363 for(
int iComponent = 0;iComponent < numMetricComponents;iComponent++){
1365 metricError[iMetricPoint] = std::abs(
gridMetric[iMetricPoint] -
1366 expectedMetric[iMetricPoint]);
1367 if(metricError[iMetricPoint] > 1e-6){
1368 metricTest[iComponent] =
false;
1369 sectionResults =
false;
1373 for(
int iComp = 0;iComp < numMetricComponents;iComp++){
1374 if(!metricTest[iComp]){
1375 messageStream <<
"Metric component " << iComp+1 <<
" failed test." 1377 myGlobal.
StdOut(messageStream.str());
1382 sectionResults =
CheckResult(sectionResults,testComm);
1383 if(!sectionResults){
1384 testResults[numDim-2] =
false;
1385 messageStream << numDim <<
"D metric accuracy test failed." << std::endl;
1386 myGlobal.
StdOut(messageStream.str());
1393 myGlobal.
StdOut(
"Checking the metric identities.\n");
1394 testState.
SetFieldBuffer(
"metricIdentities",&metricIdentities[0]);
1396 std::vector<bool> metricIdentityTest(numDim,
true);
1397 std::vector<double> maxIdentityError(numDim,0.0);
1398 double identityTolerance = 5e-11;
1399 indexIt = partitionBufferIndices.begin();
1400 while(indexIt != partitionBufferIndices.end()){
1401 size_t iPoint = *indexIt++;
1402 for(
int iComponent = 0;iComponent < numDim;iComponent++){
1404 double identityMagnitude = std::abs(metricIdentities[idPoint]);
1405 if(identityMagnitude > identityTolerance){
1406 metricIdentityTest[iComponent] =
false;
1407 sectionResults =
false;
1409 if(identityMagnitude > maxIdentityError[iComponent])
1410 maxIdentityError[iComponent] = identityMagnitude;
1413 for(
int iComp = 0;iComp < numDim;iComp++){
1414 messageStream <<
"Max identity error for component " << iComp+1 <<
" = " 1415 << maxIdentityError[iComp] << std::endl;
1416 if(!metricIdentityTest[iComp]){
1417 messageStream <<
"Metric identity component " << iComp+1 <<
" failed test." 1419 myGlobal.
StdOut(messageStream.str());
1424 sectionResults =
CheckResult(sectionResults,testComm);
1425 if(!sectionResults){
1426 testResults[numDim-2] =
false;
1427 messageStream << numDim <<
"D metric test failed." << std::endl;
1428 myGlobal.
StdOut(messageStream.str());
1432 messageStream << std::endl;
1433 myGlobal.
StdOut(messageStream.str());
1436 myGlobal.
StdOut(
"Writing test results to HDF5 file.\n");
1438 std::ostringstream Ostr;
1439 Ostr <<
"curvilinear" << numDim <<
"d";
1440 const std::string domainName(Ostr.str());
1441 const std::string hdfFileName(domainName+
".h5");
1442 const std::string xdmfFileName(domainName+
".xdmf");
1443 const std::string geometryName(
"curvilinear");
1444 const std::string gridName(
"test1");
1452 gridName,testGrid,testState,paramState,
1453 testConfig,messageStream)){
1455 myGlobal.
StdOut(
"Output to HDF5 failed:\n");
1457 myGlobal.
StdOut(
"Continuing....\n");
1463 myGlobal.
StdOut(
"Tests done.\n");
1464 parallelUnitResults.
UpdateResult(
"Grid:PBS:Curvilinear2D",testResults[0]);
1465 parallelUnitResults.
UpdateResult(
"Grid:PBS:Curvilinear3D",testResults[1]);
1474 std::ostringstream messageStream;
1487 myGlobal.
Init(
"TestGrid_CurvilinearMetricVG",testComm);
1491 std::vector<bool> testResults(2,
true);
1492 std::vector<size_t> allSizes(3,0);
1493 std::vector<double> scale(3,0);
1502 bool sectionResults =
true;
1505 int interiorSBPOrder = 4;
1506 int haloDepth = interiorSBPOrder+1;
1516 size_t numGlobalNodes = 1;
1517 size_t numGlobalCells = 1;
1518 std::vector<size_t>
gridSizes(numDim,0);
1519 for(
int iDim = 0;iDim < numDim;iDim++){
1520 gridSizes[iDim] = allSizes[iDim];
1521 numGlobalNodes *= gridSizes[iDim];
1522 numGlobalCells *= (gridSizes[iDim]-1);
1527 messageStream <<
"Setting up grid with sizes: (";
1529 messageStream <<
")" << std::endl;
1530 myGlobal.
StdOut(messageStream.str());
1535 messageStream <<
"====== Grid Parallel Setup ========= " << std::endl;
1536 if(testGrid.
ParallelSetup(testComm,cartInfo,haloDepth,messageStream)){
1537 myGlobal.
ErrOut(
"Grid::ParallelSetup failed with messages:\n");
1538 myGlobal.
ErrOut(messageStream.str());
1540 sectionResults =
false;
1542 sectionResults =
CheckResult(sectionResults,testComm);
1543 if(!sectionResults){
1544 testResults[numDim-2] =
false;
1546 messageStream <<
"==================================== " << std::endl;
1549 messageStream <<
"------- Grid & Topo Report --------- " << std::endl;
1552 messageStream <<
"------------------------------------ " << std::endl;
1553 myGlobal.
StdOut(messageStream.str());
1561 std::vector<size_t> partitionSizes(partitionInterval.Sizes());
1562 std::vector<size_t> partitionStarts(partitionInterval.Starts());
1563 std::vector<size_t> partitionBufferStarts(partitionBufferInterval.Starts());
1567 std::vector<size_t> partitionBufferIndices;
1568 bufferInterval.GetFlatIndices(partitionBufferInterval,partitionBufferIndices);
1573 int numMetricComponents = numDim*numDim;
1574 std::vector<double> expectedMetric(numMetricComponents*numPointsBuffer,0);
1575 std::vector<double> metricIdentities;
1576 std::vector<double> expectedJacobian(2*numPointsBuffer,0);
1577 std::vector<double> expectedJacobianMatrix(numMetricComponents*numPointsBuffer,0);
1578 std::vector<double> pointMetric(numMetricComponents,0);
1579 std::vector<double> pointMatrix(numMetricComponents,0);
1580 std::vector<size_t> pointIndices(numDim,0);
1584 testState.
AddField(
"expectedMetric",
'n',numMetricComponents,8,
"");
1585 testState.
AddField(
"metricIdentities",
'n',numDim,8,
"");
1586 testState.
AddField(
"expectedJacobian",
'n',2,8,
"");
1587 testState.
AddField(
"expectedJacobianMatrix",
'n',numMetricComponents,8,
"");
1588 testState.
AddField(
"gridMetric",
'n',numMetricComponents,8,
"");
1589 testState.
AddField(
"metricError",
'n',numMetricComponents,8,
"");
1590 testState.
AddField(
"gridJacobian",
'n',2,8,
"");
1591 testState.
AddField(
"jacobianMatrix",
'n',numMetricComponents,8,
"");
1592 testState.
AddField(
"sconn",
'n',numDim,4,
"");
1593 testState.
AddField(
"xyz",
'n',numDim,8,
"");
1594 testState.
AddField(
"ijk",
'n',numDim,4,
"");
1595 testState.
AddField(
"bufferIndex1",
'n',1,4,
"");
1596 testState.
AddField(
"jacobianError",
'n',2,8,
"");
1597 testState.
AddField(
"jacobianMatrixError",
'n',numMetricComponents,8,
"");
1598 testState.
Create(numPointsBuffer,0);
1601 testState.
SetFieldBuffer(
"expectedJacobian",&expectedJacobian[0]);
1602 testState.
SetFieldBuffer(
"expectedJacobianMatrix",&expectedJacobianMatrix[0]);
1605 int *bufferIndex1 = testState.
GetFieldBuffer<
int>(
"bufferIndex1");
1607 std::ostringstream topoTypeStream;
1608 topoTypeStream << numDim <<
"DSMesh";
1610 std::vector<size_t> rGridSizes(testGrid.
GridSizes());
1611 std::reverse(rGridSizes.begin(),rGridSizes.end());
1614 myGlobal.
StdOut(messageStream.str());
1616 myGlobal.
StdOut(
"Generating 3D grid.\n");
1618 double xOmega = 1.0/4.0;
1621 std::vector<double> periodicLengths(numDim,xL);
1624 myGlobal.
StdOut(
"Exchanging coordinates.\n");
1633 myGlobal.
StdOut(messageStream.str());
1636 myGlobal.
StdOut(
"Setting up differential operators for grid.\n");
1639 operator_t sbpOperator;
1641 int connBoundaryDepth = (sbpOperator.
numStencils-2)/2;
1643 for(
int iStencil = 0;iStencil < sbpOperator.
numStencils;iStencil++)
1646 std::vector<int> stencilConnectivity(numDim*numPointsBuffer,0);
1650 partitionBufferInterval.Flatten(opInterval);
1651 std::vector<size_t>::iterator dOpIt = opInterval.begin();
1652 while(dOpIt != opInterval.end()){
1659 &stencilConnectivity[0],
true)){
1660 messageStream <<
"CreateStencilConnectivity failed. Aborting the test." << std::endl;
1661 myGlobal.
StdOut(messageStream.str());
1663 sectionResults =
false;
1665 sectionResults =
CheckResult(sectionResults,testComm);
1666 if(!sectionResults){
1667 testResults[numDim-2] =
false;
1672 myGlobal.
StdOut(
"Computing Jacobian matrix.\n");
1675 myGlobal.
StdOut(
"Jacobian matrix generation failed with messages:\n");
1676 myGlobal.
StdOut(messageStream.str());
1677 myGlobal.
StdOut(
"Skipping the rest of this test.\n");
1679 sectionResults =
false;
1681 sectionResults =
CheckResult(sectionResults,testComm);
1682 if(!sectionResults){
1683 testResults[numDim-2] =
false;
1687 myGlobal.
StdOut(messageStream.str());
1690 myGlobal.
StdOut(
"Computing metrics.\n");
1693 myGlobal.
StdOut(
"Metrics generation failed with messages:\n");
1694 myGlobal.
StdOut(messageStream.str());
1695 myGlobal.
StdOut(
"\nSkipping rest of this test.\n");
1697 sectionResults =
false;
1699 sectionResults =
CheckResult(sectionResults,testComm);
1700 if(!sectionResults){
1701 testResults[numDim-2] =
false;
1704 myGlobal.
StdOut(messageStream.str());
1707 myGlobal.
StdOut(
"Computing metric identities.\n");
1709 myGlobal.
StdOut(
"Compute metric identities failed with messages:\n");
1710 myGlobal.
StdOut(messageStream.str());
1711 myGlobal.
StdOut(
"\nSkipping rest of this test.\n");
1713 sectionResults =
false;
1715 sectionResults =
CheckResult(sectionResults,testComm);
1716 if(!sectionResults){
1717 testResults[numDim-2] =
false;
1720 myGlobal.
StdOut(messageStream.str());
1725 myGlobal.
StdOut(
"Checking the metric identities.\n");
1726 testState.
SetFieldBuffer(
"metricIdentities",&metricIdentities[0]);
1728 std::vector<bool> metricIdentityTest(numDim,
true);
1729 std::vector<double> maxIdentityError(numDim,0.0);
1730 double identityTolerance = 5e-11;
1731 std::vector<size_t>::iterator indexIt = partitionBufferIndices.begin();
1732 while(indexIt != partitionBufferIndices.end()){
1733 size_t iPoint = *indexIt++;
1734 for(
int iComponent = 0;iComponent < numDim;iComponent++){
1736 double identityMagnitude = std::abs(metricIdentities[idPoint]);
1737 if(identityMagnitude > identityTolerance){
1738 metricIdentityTest[iComponent] =
false;
1739 sectionResults =
false;
1741 if(identityMagnitude > maxIdentityError[iComponent])
1742 maxIdentityError[iComponent] = identityMagnitude;
1745 for(
int iComp = 0;iComp < numDim;iComp++){
1746 messageStream <<
"Max identity error for component " << iComp+1 <<
" = " 1747 << maxIdentityError[iComp] << std::endl;
1748 if(!metricIdentityTest[iComp]){
1749 messageStream <<
"Metric identity component " << iComp+1 <<
" failed test." 1751 myGlobal.
StdOut(messageStream.str());
1756 sectionResults =
CheckResult(sectionResults,testComm);
1757 if(!sectionResults){
1758 testResults[numDim-2] =
false;
1759 messageStream << numDim <<
"D metric test failed." << std::endl;
1760 myGlobal.
StdOut(messageStream.str());
1764 messageStream << std::endl;
1765 myGlobal.
StdOut(messageStream.str());
1768 myGlobal.
StdOut(
"Writing test results to HDF5 file.\n");
1770 std::ostringstream Ostr;
1772 const std::string domainName(Ostr.str());
1773 const std::string hdfFileName(domainName+
".h5");
1774 const std::string xdmfFileName(domainName+
".xdmf");
1775 const std::string geometryName(
"vgwavy");
1776 const std::string gridName(
"test1");
1785 gridName,testGrid,testState,paramState,
1786 testConfig,messageStream)){
1788 myGlobal.
StdOut(
"Output to HDF5 failed:\n");
1790 myGlobal.
StdOut(
"Continuing....\n");
1795 myGlobal.
StdOut(
"Tests done.\n");
1796 parallelUnitResults.
UpdateResult(
"Grid:PBS:MetricCancellationVGWavy",testResults[1]);
1803 std::ostringstream messageStream;
1816 myGlobal.
Init(
"TestIntegratedHalo",testComm);
1820 int numProc = testComm.
Size();
1829 std::vector<size_t> gridSize(numDim,0);
1830 std::vector<double> dX(numDim,0);
1832 size_t numGlobalNodes = 1;
1833 size_t numGlobalCells = 1;
1834 for(
int iDim = 0;iDim < numDim;iDim++){
1836 gridSize[iDim] =
static_cast<size_t>(std::pow(2.0,(numDim-iDim-1)%numDim)*25);
1837 dX[iDim] = 1.0/
static_cast<double>(gridSize[iDim]-1);
1838 numGlobalNodes *= gridSize[iDim];
1839 numGlobalCells *= (gridSize[iDim]-1);
1846 operator_t sbpOperator;
1848 int boundaryDepth = (sbpOperator.
numStencils-1)/2;
1849 std::vector<int> haloDepths(2*numDim,boundaryDepth);
1850 std::vector<int> boundaryDepths(2*numDim,boundaryDepth);
1865 std::vector<int> &cartCoords(pbsGridComm.CartCoordinates());
1866 std::vector<int> &cartDims(pbsGridComm.CartDimensions());
1869 std::vector<int> cartNeighbors;
1870 pbsGridComm.CartNeighbors(cartNeighbors);
1874 myGlobal.
StdOut(messageStream.str(),2);
1877 interval_t globalInterval;
1889 myGlobal.
ErrOut(
"Partitioning failed.\n");
1892 std::vector<size_t> extendGrid(2*numDim,0);
1893 std::vector<bool> isPeriodic(numDim,
true);
1894 size_t numPointsPart = pbsPartInterval.NNodes();
1895 for(
int iDim = 0;iDim < numDim; iDim++){
1896 if(isPeriodic[iDim]){
1897 extendGrid[2*iDim] = haloDepths[2*iDim];
1898 extendGrid[2*iDim+1] = haloDepths[2*iDim+1];
1900 if(pbsPartInterval[iDim].first == 0)
1901 extendGrid[2*iDim] = haloDepths[2*iDim];
1902 if(pbsPartInterval[iDim].second == (gridSize[iDim]-1))
1903 extendGrid[2*iDim + 1] = haloDepths[2*iDim+1];
1913 std::vector<size_t>::const_iterator bsIt =
bufferSizes.begin();
1915 numPointsBuffer *= *bsIt++;
1917 bool bufferSizeTest =
true;
1919 bufferSizeTest =
false;
1920 parallelUnitResults.
UpdateResult(
"Grid:PBS:BufferSize",bufferSizeTest);
1922 std::cout <<
"Number of Points in Partition: " << numPointsPart << std::endl;
1923 std::cout <<
"Buffer Size: (";
1925 std::cout <<
")" << std::endl;
1926 bool testResult =
true;
1927 for(
int iDim = 0;iDim < numDim;iDim++){
1928 if(
bufferSizes[iDim] != (pbsPartInterval.NNodes(iDim) + extendGrid[2*iDim] + extendGrid[2*iDim + 1]))
1931 parallelUnitResults.
UpdateResult(
"Grid:PBS:GridSizing",testResult);
1934 halo_t testHalo(globalInterval,pbsPartInterval);
1938 std::vector<bool> haveNeighbors(2*numDim,
true);
1950 int myRank = testComm.
Rank();
1951 int numRemoteHalos = remoteHaloExtents.size();
1952 int numLocalHalos = localHaloExtents.size();
1953 for(
int iProc = 0;iProc < numProc;iProc++){
1954 if(iProc == myRank) {
1955 std::cout <<
"Processor " << iProc <<
" Summary " << std::endl
1956 <<
"+++++++++++++++++++++++++++++++++++" << std::endl;
1957 std::cout <<
"Partition Interval: ";
1958 pbsPartInterval.PrettyPrint(std::cout);
1959 std::cout << std::endl;
1960 std::cout <<
"Number of Remote Halos: " << numRemoteHalos << std::endl;
1961 std::cout <<
"Number of Local Halos: " << numLocalHalos << std::endl;
1962 for(
int iHalo = 0;iHalo < numRemoteHalos;iHalo++){
1963 std::cout <<
"Remote Halo(" << iHalo <<
"):";
1964 remoteHaloExtents[iHalo].PrettyPrint(std::cout);
1965 std::cout << std::endl;
1966 std::cout <<
"Local Halo(" << iHalo <<
"):";
1967 localHaloExtents[iHalo].PrettyPrint(std::cout);
1968 std::cout << std::endl;
1977 bool haloBufferExtentTest =
true;
1978 for(
int iProc = 0;iProc < numProc;iProc++){
1979 if(iProc == myRank) {
1980 std::cout <<
"Processor " << iProc <<
" Buffer Summary " << std::endl
1981 <<
"+++++++++++++++++++++++++++++++++++" << std::endl;
1982 std::cout <<
"Partition Buffer Interval: ";
1983 localPartitionInterval.PrettyPrint(std::cout);
1984 std::cout << std::endl;
1986 for(
int iHalo = 0;iHalo < numRemoteHalos;iHalo++){
1988 int ijkDirection = iHalo/2;
1989 int leftRight = iHalo%2;
1994 std::cout <<
"Remote Halo Buffer(" << iHalo <<
"):";
1996 std::cout << std::endl;
1997 std::cout <<
"Local Halo Buffer(" << iHalo <<
"):";
1998 localHaloBufferExtents[iHalo].PrettyPrint(std::cout);
1999 std::cout << std::endl;
2001 for(
int iDim = 0;iDim < numDim;iDim++){
2002 if(iDim == ijkDirection){
2003 if(leftRight == 0) {
2004 if(remoteHaloBufferExtent[iDim].first != 0)
2005 haloBufferExtentTest =
false;
2006 if(remoteHaloBufferExtent[iDim].second != (extendGrid[iHalo] - 1))
2007 haloBufferExtentTest =
false;
2008 if(localHaloBufferExtent[iDim].first != localPartitionInterval[iDim].first)
2009 haloBufferExtentTest =
false;
2010 if(localHaloBufferExtent[iDim].second != (2*extendGrid[iHalo] - 1))
2011 haloBufferExtentTest =
false;
2013 if(remoteHaloBufferExtent[iDim].second != (
bufferSizes[iDim]-1))
2014 haloBufferExtentTest =
false;
2015 if(remoteHaloBufferExtent[iDim].first != (
bufferSizes[iDim]-extendGrid[iHalo]))
2016 haloBufferExtentTest =
false;
2017 if(localHaloBufferExtent[iDim].second != localPartitionInterval[iDim].second)
2018 haloBufferExtentTest =
false;
2019 if(localHaloBufferExtent[iDim].first != (localPartitionInterval[iDim].second - extendGrid[iHalo] + 1))
2020 haloBufferExtentTest =
false;
2023 if(remoteHaloBufferExtent[iDim] != localPartitionInterval[iDim])
2024 haloBufferExtentTest =
false;
2025 if(localHaloBufferExtent[iDim] != localPartitionInterval[iDim])
2026 haloBufferExtentTest =
false;
2034 haloBufferExtentTest =
CheckResult(haloBufferExtentTest,testComm);
2036 parallelUnitResults.
UpdateResult(
"Grid:PBS:HaloExtents",haloBufferExtentTest);
2039 const std::vector<std::vector<size_t> > &sendIndices(testHalo.
SendIndices());
2040 bool sendIndicesTest =
true;
2044 if(sendIndices.size() != (2*numDim))
2045 sendIndicesTest =
false;
2046 for(
int iDim = 0;iDim < numDim;iDim++){
2049 int leftDir = 2*iDim;
2050 int rightDir = 2*iDim + 1;
2051 size_t numPlane = 1;
2053 for(
int sDim = 1;sDim <= numDim-1;sDim++){
2054 int orthoDim = (iDim+sDim)%numDim;
2055 numPlane *= pbsPartInterval.NNodes(orthoDim);
2058 int leftPointsExpected = numPlane*extendGrid[2*iDim];
2059 int rightPointsExpected = numPlane*extendGrid[2*iDim+1];
2061 const std::vector<size_t> &leftSendIndices(sendIndices[leftDir]);
2062 const std::vector<size_t> &rightSendIndices(sendIndices[rightDir]);
2064 int numPointsSendLeft = leftSendIndices.size();
2065 int numPointsSendRight = leftSendIndices.size();
2067 if(numPointsSendLeft != leftPointsExpected)
2068 sendIndicesTest =
false;
2069 if(numPointsSendRight != rightPointsExpected)
2070 sendIndicesTest =
false;
2072 std::vector<size_t> expectedLeftIndices;
2073 bufferInterval.
GetFlatIndices(localHaloBufferExtents[leftDir],expectedLeftIndices);
2074 if(leftSendIndices != expectedLeftIndices)
2075 sendIndicesTest =
false;
2077 std::vector<size_t> expectedRightIndices;
2078 bufferInterval.
GetFlatIndices(localHaloBufferExtents[rightDir],expectedRightIndices);
2079 if(rightSendIndices != expectedRightIndices)
2080 sendIndicesTest =
false;
2083 sendIndicesTest =
CheckResult(sendIndicesTest,testComm);
2084 parallelUnitResults.
UpdateResult(
"Grid:PBS:HaloSendIndices",sendIndicesTest);
2087 const std::vector<std::vector<size_t> > &recvIndices(testHalo.
RecvIndices());
2088 bool recvIndicesTest =
true;
2090 if(recvIndices.size() != (2*numDim))
2091 recvIndicesTest =
false;
2093 for(
int iDim = 0;iDim < numDim;iDim++){
2096 int leftDir = 2*iDim;
2097 int rightDir = 2*iDim + 1;
2099 size_t numPlane = 1;
2100 for(
int sDim = 1;sDim <= numDim-1;sDim++){
2101 int orthoDim = (iDim+sDim)%numDim;
2102 numPlane *= pbsPartInterval.NNodes(orthoDim);
2105 int leftPointsExpected = numPlane*extendGrid[2*iDim];
2106 int rightPointsExpected = numPlane*extendGrid[2*iDim+1];
2108 const std::vector<size_t> &leftRecvIndices(recvIndices[leftDir]);
2109 const std::vector<size_t> &rightRecvIndices(recvIndices[rightDir]);
2111 int numPointsRecvLeft = leftRecvIndices.size();
2112 int numPointsRecvRight = leftRecvIndices.size();
2114 if(numPointsRecvLeft != leftPointsExpected)
2115 recvIndicesTest =
false;
2116 if(numPointsRecvRight != rightPointsExpected)
2117 recvIndicesTest =
false;
2119 std::vector<size_t> expectedLeftIndices;
2120 bufferInterval.
GetFlatIndices(remoteHaloBufferExtents[leftDir],expectedLeftIndices);
2121 if(leftRecvIndices != expectedLeftIndices)
2122 recvIndicesTest =
false;
2124 std::vector<size_t> expectedRightIndices;
2125 bufferInterval.
GetFlatIndices(remoteHaloBufferExtents[rightDir],expectedRightIndices);
2126 if(rightRecvIndices != expectedRightIndices)
2127 recvIndicesTest =
false;
2130 recvIndicesTest =
CheckResult(recvIndicesTest,testComm);
2131 parallelUnitResults.
UpdateResult(
"Grid:PBS:HaloRecvIndices",recvIndicesTest);
2137 bool createMessageBuffersTest =
true;
2139 createMessageBuffersTest =
false;
2141 if(communicationBuffers.size() != 1)
2142 createMessageBuffersTest =
false;
2145 createMessageBuffersTest =
false;
2147 createMessageBuffersTest =
false;
2149 createMessageBuffersTest =
false;
2151 createMessageBuffersTest =
CheckResult(createMessageBuffersTest,testComm);
2152 parallelUnitResults.
UpdateResult(
"Grid:PBS:CreateMessageBuffers",createMessageBuffersTest);
2154 bool packSendBuffersTest =
true;
2155 std::vector<double> gridCoordinates(numDim*numPointsBuffer,0.0);
2160 size_t partStartX = pbsPartInterval[0].first;
2161 size_t partEndX = pbsPartInterval[0].second;
2162 size_t partStartY = pbsPartInterval[1].first;
2163 size_t partEndY = pbsPartInterval[1].second;
2164 size_t partStartZ = pbsPartInterval[2].first;
2165 size_t partEndZ = pbsPartInterval[2].second;
2166 size_t bufferStartX = localPartitionInterval[0].first;
2167 size_t bufferEndX = localPartitionInterval[0].second;
2168 size_t bufferStartY = localPartitionInterval[1].first;
2169 size_t bufferEndY = localPartitionInterval[1].second;
2170 size_t bufferStartZ = localPartitionInterval[2].first;
2171 size_t bufferEndZ = localPartitionInterval[2].second;
2173 size_t buffRow = bufferSizes[0];
2174 size_t iPartZ,iPartY,iPartX,iBufX, iBufY, iBufZ;
2175 for(iPartZ = partStartZ, iBufZ = bufferStartZ;
2176 iPartZ <= partEndZ;iPartZ++,iBufZ++){
2177 size_t bufZ = iBufZ*buffPlane;
2178 for(iPartY = partStartY, iBufY = bufferStartY;
2179 iPartY <= partEndY;iPartY++,iBufY++){
2180 size_t bufYZ = bufZ + iBufY*buffRow;
2181 for(iPartX = partStartX, iBufX = bufferStartX;
2182 iPartX <= partEndX;iPartX++,iBufX++){
2183 size_t bufIndex = bufYZ + iBufX;
2184 gridCoordinates[bufIndex] = iPartX;
2193 for(
int iDim = 0;iDim < numDim;iDim++){
2195 int leftDir = 2*iDim;
2196 int rightDir = 2*iDim+1;
2198 size_t numPlane = 1;
2199 for(
int sDim = 1;sDim <= numDim-1;sDim++){
2200 int orthoDim = (iDim+sDim)%numDim;
2201 numPlane *= pbsPartInterval.NNodes(orthoDim);
2204 int leftPointsExpected = numPlane*extendGrid[leftDir];
2205 int rightPointsExpected = numPlane*extendGrid[rightDir];
2207 double *leftSendBuffer = messageBuffers.
sendBuffers[leftDir];
2208 double *rightSendBuffer = messageBuffers.
sendBuffers[rightDir];
2210 int numLeftSendPoints = messageBuffers.
numPointsSend[leftDir];
2211 int numRightSendPoints = messageBuffers.
numPointsSend[rightDir];
2213 if(leftPointsExpected != numLeftSendPoints)
2214 packSendBuffersTest =
false;
2215 if(numRightSendPoints != rightPointsExpected)
2216 packSendBuffersTest =
false;
2220 size_t iStart = localHaloExtents[leftDir][0].first;
2221 size_t iEnd = localHaloExtents[leftDir][0].second;
2222 size_t jStart = localHaloExtents[leftDir][1].first;
2223 size_t jEnd = localHaloExtents[leftDir][1].second;
2224 size_t kStart = localHaloExtents[leftDir][2].first;
2225 size_t kEnd = localHaloExtents[leftDir][2].second;
2227 for(
size_t kIndex = kStart;kIndex <= kEnd;kIndex++){
2228 for(
size_t jIndex = jStart;jIndex <= jEnd;jIndex++){
2229 for(
size_t iIndex = iStart;iIndex <= iEnd;iIndex++){
2230 if(leftSendBuffer[iPoint] != iIndex)
2231 packSendBuffersTest =
false;
2232 if(leftSendBuffer[iPoint + numLeftSendPoints] != jIndex)
2233 packSendBuffersTest =
false;
2234 if(leftSendBuffer[iPoint + 2*numLeftSendPoints] != kIndex)
2235 packSendBuffersTest =
false;
2241 iStart = localHaloExtents[rightDir][0].first;
2242 iEnd = localHaloExtents[rightDir][0].second;
2243 jStart = localHaloExtents[rightDir][1].first;
2244 jEnd = localHaloExtents[rightDir][1].second;
2245 kStart = localHaloExtents[rightDir][2].first;
2246 kEnd = localHaloExtents[rightDir][2].second;
2248 for(
size_t kIndex = kStart;kIndex <= kEnd;kIndex++){
2249 for(
size_t jIndex = jStart;jIndex <= jEnd;jIndex++){
2250 for(
size_t iIndex = iStart;iIndex <= iEnd;iIndex++){
2251 if(rightSendBuffer[iPoint] != iIndex)
2252 packSendBuffersTest =
false;
2253 if(rightSendBuffer[iPoint + numRightSendPoints] != jIndex)
2254 packSendBuffersTest =
false;
2255 if(rightSendBuffer[iPoint + 2*numRightSendPoints] != kIndex)
2256 packSendBuffersTest =
false;
2266 testHalo.
SendMessage(0,cartNeighbors,pbsGridComm);
2270 bool recvDataTest =
true;
2271 for(
int iDim = 0;iDim < numDim;iDim++){
2273 int leftDir = 2*iDim;
2274 int rightDir = 2*iDim+1;
2276 size_t numPlane = 1;
2277 for(
int sDim = 1;sDim <= numDim-1;sDim++){
2278 int orthoDim = (iDim+sDim)%numDim;
2279 numPlane *= pbsPartInterval.NNodes(orthoDim);
2282 int leftPointsExpected = numPlane*extendGrid[leftDir];
2283 int rightPointsExpected = numPlane*extendGrid[rightDir];
2285 double *leftRecvBuffer = messageBuffers.
recvBuffers[leftDir];
2286 double *rightRecvBuffer = messageBuffers.
recvBuffers[rightDir];
2288 int numLeftRecvPoints = messageBuffers.
numPointsRecv[leftDir];
2289 int numRightRecvPoints = messageBuffers.
numPointsRecv[rightDir];
2291 if(leftPointsExpected != numLeftRecvPoints)
2292 recvDataTest =
false;
2293 if(numRightRecvPoints != rightPointsExpected)
2294 recvDataTest =
false;
2298 size_t iStart = remoteHaloExtents[leftDir][0].first;
2299 size_t iEnd = remoteHaloExtents[leftDir][0].second;
2300 size_t jStart = remoteHaloExtents[leftDir][1].first;
2301 size_t jEnd = remoteHaloExtents[leftDir][1].second;
2302 size_t kStart = remoteHaloExtents[leftDir][2].first;
2303 size_t kEnd = remoteHaloExtents[leftDir][2].second;
2305 size_t ibStart = remoteHaloBufferExtents[leftDir][0].first;
2306 size_t ibEnd = remoteHaloBufferExtents[leftDir][0].second;
2307 size_t jbStart = remoteHaloBufferExtents[leftDir][1].first;
2308 size_t jbEnd = remoteHaloBufferExtents[leftDir][1].second;
2309 size_t kbStart = remoteHaloBufferExtents[leftDir][2].first;
2310 size_t kbEnd = remoteHaloBufferExtents[leftDir][2].second;
2313 size_t kIndex, kbIndex, jIndex, jbIndex, iIndex,ibIndex;
2314 for(kIndex = kStart,kbIndex = kbStart;kIndex <= kEnd;kIndex++,kbIndex++){
2315 for(jIndex = jStart, jbIndex = jbStart;jIndex <= jEnd;jIndex++,jbIndex++){
2316 for(iIndex = iStart,ibIndex = ibStart;iIndex <= iEnd;iIndex++,ibIndex++){
2320 if(leftRecvBuffer[iPoint] != iIndex)
2321 recvDataTest =
false;
2322 if(leftRecvBuffer[iPoint + numLeftRecvPoints] != jIndex)
2323 recvDataTest =
false;
2324 if(leftRecvBuffer[iPoint + 2*numLeftRecvPoints] != kIndex)
2325 recvDataTest =
false;
2327 if(gridCoordinates[bufferIndex] != iIndex)
2328 recvDataTest =
false;
2329 if(gridCoordinates[bufferIndex + numPointsBuffer] != jIndex)
2330 recvDataTest =
false;
2331 if(gridCoordinates[bufferIndex + 2*numPointsBuffer] != kIndex)
2332 recvDataTest =
false;
2339 iStart = remoteHaloExtents[rightDir][0].first;
2340 iEnd = remoteHaloExtents[rightDir][0].second;
2341 jStart = remoteHaloExtents[rightDir][1].first;
2342 jEnd = remoteHaloExtents[rightDir][1].second;
2343 kStart = remoteHaloExtents[rightDir][2].first;
2344 kEnd = remoteHaloExtents[rightDir][2].second;
2346 ibStart = remoteHaloBufferExtents[rightDir][0].first;
2347 ibEnd = remoteHaloBufferExtents[rightDir][0].second;
2348 jbStart = remoteHaloBufferExtents[rightDir][1].first;
2349 jbEnd = remoteHaloBufferExtents[rightDir][1].second;
2350 kbStart = remoteHaloBufferExtents[rightDir][2].first;
2351 kbEnd = remoteHaloBufferExtents[rightDir][2].second;
2355 for(kIndex = kStart,kbIndex = kbStart;kIndex <= kEnd;kIndex++,kbIndex++){
2356 for(jIndex = jStart, jbIndex = jbStart;jIndex <= jEnd;jIndex++,jbIndex++){
2357 for(iIndex = iStart,ibIndex = ibStart;iIndex <= iEnd;iIndex++,ibIndex++){
2361 if(rightRecvBuffer[iPoint] != iIndex)
2362 recvDataTest =
false;
2363 if(rightRecvBuffer[iPoint + numRightRecvPoints] != jIndex)
2364 recvDataTest =
false;
2365 if(rightRecvBuffer[iPoint + 2*numRightRecvPoints] != kIndex)
2366 recvDataTest =
false;
2368 if(gridCoordinates[bufferIndex] != iIndex)
2369 recvDataTest =
false;
2370 if(gridCoordinates[bufferIndex + numPointsBuffer] != jIndex)
2371 recvDataTest =
false;
2372 if(gridCoordinates[bufferIndex + 2*numPointsBuffer] != kIndex)
2373 recvDataTest =
false;
2382 recvDataTest =
CheckResult(recvDataTest,testComm);
2383 parallelUnitResults.
UpdateResult(
"Grid:PBS:RecvHaloData",recvDataTest);
void const size_t const size_t const size_t const int const int const double * gridMetric
void OpenFileTag(std::ostream &outStream)
std::vector< double > & Jacobian()
const std::vector< pcpp::IndexIntervalType > & LocalHaloBufferExtents() const
void CloseFileTag(std::ostream &outStream)
simulation::state::base state_t
pcpp::IndexIntervalType regionInterval
void GetFlatIndices(const sizeextent &extent, ContainerType &indices) const
std::vector< double > & Metric()
int ExchangeCoordinates()
int CreateSimpleRecvIndices()
std::vector< pcpp::IndexIntervalType > CreateLocalHaloExtents(const pcpp::IndexIntervalType &globalExtent, const pcpp::IndexIntervalType &partitionExtent, std::vector< size_t > &haloSizes)
int Remove(const std::string &fname)
virtual int ErrOut(const std::string &outstr)
int GenerateCurvilinearMetric1(std::vector< size_t > &ijk, std::vector< double > &met, std::vector< double > &jac, double &jacm1)
void TestGrid_CurvilinearVGWavy(ix::test::results ¶llelUnitResults, pcpp::CommunicatorType &testComm)
const std::vector< std::vector< size_t > > & RecvIndices() const
int CreateSimpleSendIndices()
Creates the flat buffer indices for each whole local halo extent.
plascom2::operators::sbp::base operator_t
virtual bool Profiling()
Get profiling state.
int GenerateCurvilinearMetric2(std::vector< size_t > &ijk, std::vector< double > &xyz, double &jacm1)
pcpp::IndexIntervalType & PartitionInterval()
std::vector< messagebuffers > & CommunicationBuffers()
void CloseGridTag(std::ostream &outStream)
int GenerateCoordinates(std::ostream &)
void const size_t const size_t * gridSizes
void RenewStream(std::ostringstream &outStream)
bool CheckResult(bool &localResult, pcpp::CommunicatorType &testComm)
std::vector< double * > recvBuffers
void const size_t const size_t const size_t const double const double double * y
void SetDimensionExtensions(const std::vector< size_t > &inExtensions)
int SendMessage(const int messageId, const std::vector< int > &neighborRanks, fixtures::CommunicatorType &inComm)
int * stencilStarts
The starting index into the stencilWeight and stencilOffset arrays for each stencil.
int UnPackMessageBuffers(const int messageId, const int componentId, const int numComponents, double *targetBuffer)
Unpack generic recv buffers for specified message.
pcpp::CommunicatorType comm_t
void CartesianSetup(std::ostream &outStream, const std::vector< int > &cartCoords, const std::vector< int > &cartDims)
virtual size_t Create(size_t number_of_nodes=0, size_t number_of_cells=0)
void const size_t const size_t const size_t * opInterval
int GenerateRectilinearMetric1(std::vector< size_t > &ijk, std::vector< double > &xyz, double &jacm1)
std::vector< size_t > numPointsSend
pcpp::IndexIntervalType interval_t
void SetGridSizes(const std::vector< size_t > &inSize)
pcpp::ParallelGlobalType global_t
void TestGrid_CartesianMetric(ix::test::results ¶llelUnitResults, pcpp::CommunicatorType &testComm)
virtual int Init(const std::string &name, CommunicatorType &incomm)
int OutputSingle(const std::string &fileName, const GridType &inGrid, const StateType &inState, const ConfigType &simConfig, const ConfigType &gridConfig, const ConfigType &stateConfig)
void const size_t const size_t const size_t const double const double * x
int WriteGrid(const GridType &inGrid, const std::string &gridName, const std::string &parentPath, base &hdfFile)
const std::vector< size_t > & BufferSizes() const
const std::vector< std::vector< size_t > > & SendIndices() const
const std::vector< pcpp::IndexIntervalType > & RemoteHaloBufferExtents() const
void OpenGridTag(const std::string &gridName, const std::string &gridType, double inTime, std::ostream &outStream)
int InitSubRegionFromString(const std::string &inString, const std::vector< size_t > &gridSizes, subregion &inSubRegion)
Encapsulating class for collections of test results.
void SetPeriodicLengths(const std::vector< double > &inLengths)
int CreateMessageBuffers(int numComponents, int componentSize=8)
std::vector< int > isPeriodic
int SetupDifferentialOperator(plascom2::operators::stencilset *inStencilSet, int *inStencilConnectivity)
int ComputeJacobianMatrix(std::ostream &messageStream)
Calculates the regular/naive Jacobian matrix d(xyz)/d(ijk)
pcpp::IndexIntervalType & PartitionBufferInterval()
const std::vector< size_t > & GridSizes() const
int PackMessageBuffers(const int messageId, const int componentId, const int numComponents, const double *sourceBuffer)
Pack generic send buffers for specified message.
void SetLocalPartitionExtent(const pcpp::IndexIntervalType &inExtent)
void TestGrid_SubRegion(ix::test::results &serialUnitResults)
int ComputeMetrics(std::ostream &messageStream)
virtual int StdOut(const std::string &outstr, unsigned char inlev=1)
std::vector< pcpp::IndexIntervalType > CreateRemoteHaloExtents(const pcpp::IndexIntervalType &globalExtent, const pcpp::IndexIntervalType &partitionExtent, std::vector< size_t > &haloSizes)
void SetRemoteHaloExtents(const std::vector< pcpp::IndexIntervalType > haloExtents)
void TestGrid_CurvilinearMetric(ix::test::results ¶llelUnitResults, pcpp::CommunicatorType &testComm)
void SetNeighbors(const std::vector< bool > &inNeighbors)
std::vector< double * > sendBuffers
bool FILEEXISTS(const std::string &fname)
Main encapsulation of MPI.
std::string Grid(const GridType &inGrid)
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.
Testing constructs for unit testing.
Encapsulation for a collection of operator stencils.
BufferDataType * GetFieldBuffer(const std::string &fieldName)
void const size_t const size_t const size_t const int const double * gridJacobian
void TestGrid_PBS_IntegratedHalo(ix::test::results ¶llelUnitResults, pcpp::CommunicatorType &testComm)
int ComputeMetricIdentities(std::vector< double > &identityData, std::ostream &messageStream)
int ParallelSetup(fixtures::CommunicatorType &inComm, pcpp::ParallelTopologyInfoType &cartInfo, int haloDepth, std::ostream &messageStream)
Perform cartesian communicator initialization for a grid.
void SetLocalHaloExtents(const std::vector< pcpp::IndexIntervalType > haloExtents)
int ReceiveMessage(const int messageId, const std::vector< int > &neighborRanks, fixtures::CommunicatorType &inComm)
void const size_t const size_t * bufferSizes
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
int PartitionCartesianInterval(const pcpp::IndexIntervalType &globalExtent, const std::vector< int > &cartDims, const std::vector< int > &cartCoords, pcpp::IndexIntervalType &partExtent, std::ostream &messageStream)
Get local sub-interval of an n-dimensional integer interval.
void UpdateResult(const std::string &name, const ValueType &result)
Updates an existing test result.
std::vector< double > & CoordinateData()
std::ostream & PrettyPrint(std::ostream &outStream) const
int SetupCartesianTopology(pcpp::CommunicatorType ¶llelCommunicator, pcpp::ParallelTopologyInfoType &topologyInfo, pcpp::CommunicatorType &topoCommunicator, std::ostream &messageStream)
Sets up a communicator with Cartesian topology.
int numStencils
The number of stencils (e.g. interior + boundary)
int WriteGridSection(const std::string &topoType, const std::string &geomType, const std::string &fileName, const std::string &gridPath, const std::vector< size_t > &gridSize, std::ostream &outStream)
virtual int Finalize()
Finalizes the global object, and it's profiler object.
void SetVerbLevel(unsigned char l)
simulation::grid::parallel_blockstructured pbsgrid_t
std::vector< double > & JacobianMatrix()
int Initialize(base &stencilSet, int interiorOrder)
Initialize the sbp::base stencilset with the SBP operator of given order.
std::vector< size_t > numPointsRecv
simulation::grid::halo halo_t
Simple Block Structured Mesh object.
void AddField(const std::string &name, char loc, unsigned int ncomp, unsigned int dsize, const std::string &unit)
fixtures::CommunicatorType & Communicator() const
void size_t int * numComponents
void TestGrid_RectilinearMetric(ix::test::results ¶llelUnitResults, pcpp::CommunicatorType &testComm)
void SetFieldBuffer(const std::string &name, void *buf)
void SetPhysicalExtent(const std::vector< double > &inExtent)
int Finalize(bool allocateCoordinateData=false)
void InitSimple(const ContainerType &inSize)
size_t BufferSize() const
void const size_t * numPointsBuffer
void SetLocalBufferSizes(const std::vector< size_t > &inBufferSizes)