PlasCom2  1.0
XPACC Multi-physics simluation application
TestHDF5.C
Go to the documentation of this file.
1 
2 #include "Testing.H"
3 #include "Simulation.H"
4 #include "Stencil.H"
5 #include "PCPPCommUtil.H"
6 #include "PCPPIO.H"
7 #include "PCPPReport.H"
8 #include "PCPPIntervalUtils.H"
9 #include "EulerRHS.H"
10 #include "TestFixtures.H"
11 #include "EulerTestFixtures.H"
12 #include "PC2Util.H"
13 #include "Report.H"
14 
17 
18 void TestHDF5LegacyFileInfo(ix::test::results &parallelUnitResults,
19  pcpp::CommunicatorType &testComm)
20 {
21  int myRank = testComm.Rank();
22  pcpp::io::simfileinfo simFileInfo;
23  std::ostringstream messageStream;
24 
25  std::string testFileName2D("HDF5Examples/MultipleGrids2D.h5");
26  std::string testFileName3D_1("HDF5Examples/SingleGrid3D.h5");
27  std::string testFileName3D_2("HDF5Examples/MultipleGrids3D.h5");
28 
29  std::vector<size_t> expectedSizes1(2,61);
30  std::vector<std::vector<size_t> > expectedSizes(2,expectedSizes1);
31  expectedSizes[1][0] = 121;
32  expectedSizes[1][1] = 40;
33 
34  std::bitset<pcpp::io::NUMFORMATBITS> expectedFormatBits;
35  expectedFormatBits.reset();
36  expectedFormatBits.set(pcpp::io::ISLEGACY);
37  expectedFormatBits.set(pcpp::io::HASIBLANK);
38  expectedFormatBits.set(pcpp::io::HASSTATE);
39  expectedFormatBits.set(pcpp::io::HASTARGDATA);
40  expectedFormatBits.set(pcpp::io::HASGRID);
41 
42  bool serialgetfileinfo2 = true;
43  if(myRank == 0){
44  if(pcpp::io::hdf5::FileInfo(testFileName2D,simFileInfo,messageStream)){
45  std::cout << "pcpp::io::hdf5::FileInfo failed: " << messageStream.str()
46  << std::endl;
47  testComm.SetExit(1);
48  }
49  pcpp::report::SimFileInfo(std::cout,simFileInfo);
50  if(simFileInfo.formatBits != expectedFormatBits){
51  serialgetfileinfo2 = false;
52  testComm.SetExit(1);
53  }
54  }
55  if(testComm.Check()){
56  std::cout << "TestHDF5LegacyFileInfo::Failed!! Skipping tests." << std::endl;
57  return;
58  }
59 
60  testComm.StreamBroadCast(simFileInfo);
61 
62  bool parallelgetfileinfo2 = true;
63  if(simFileInfo.numGrids != 2 || (simFileInfo.formatBits != expectedFormatBits)){
64  std::cout << "TestHDF5LegacyFileInfo:Error: file info wrong." << std::endl;
65  parallelgetfileinfo2 = false;
66  } else {
67 
68  for(int iGrid = 0;iGrid < simFileInfo.numGrids;iGrid++){
69  std::string &gridName(simFileInfo.gridNames[iGrid]);
70  std::ostringstream expectedGridName;
71  expectedGridName << "Group00" << iGrid+1;
72 
73  if(gridName != expectedGridName.str()){
74  parallelgetfileinfo2 = false;
75  }
76 
77  if(simFileInfo.gridNumDimensions[iGrid] != 2){
78  parallelgetfileinfo2 = false;
79  }
80 
81  std::vector<size_t> &gridSizes(simFileInfo.gridSizes[iGrid]);
82  // fixtures::IndexIntervalType &gridInterval(simFileInfo.gridSizes[iGrid]);
83  if(gridSizes != expectedSizes[iGrid]){
84  parallelgetfileinfo2 = false;
85  }
86 
87  if(myRank == 0){
88  if(!parallelgetfileinfo2)
89  serialgetfileinfo2 = false;
90  }
91  }
92  if(myRank == 0)
93  pcpp::report::SimFileInfo(std::cout,simFileInfo);
94  }
95 
96  serialgetfileinfo2 = CheckResult(serialgetfileinfo2,testComm);
97  parallelgetfileinfo2 = CheckResult(parallelgetfileinfo2,testComm);
98 
99  parallelUnitResults.UpdateResult("HDF5:Serial2DFileInfo",serialgetfileinfo2);
100  parallelUnitResults.UpdateResult("HDF5:Parallel2DFileInfo",parallelgetfileinfo2);
101 
102  std::vector<size_t> expectedSizes3D1(3,21);
103  // std::vector<fixtures::IndexIntervalType> expectedIntervals3(2);
104  // expectedIntervals3[0].InitSimple(expectedSizes3);
105  // expectedIntervals2[1].InitSimple(expectedSizes2);
106 
107  bool serialgetfileinfo3 = true;
108  bool parallelgetfileinfo3 = true;
109  if(myRank == 0){
110  if(pcpp::io::hdf5::FileInfo(testFileName3D_1,simFileInfo,messageStream)){
111  std::cout << "pcpp::io::hdf5::FileInfo failed: " << messageStream.str()
112  << std::endl;
113  serialgetfileinfo3 = false;
114  testComm.SetExit(1);
115  }
116  pcpp::report::SimFileInfo(std::cout,simFileInfo);
117  if(simFileInfo.formatBits != expectedFormatBits){
118  serialgetfileinfo2 = false;
119  testComm.SetExit(1);
120  }
121  }
122  if(testComm.Check())
123  return;
124  testComm.StreamBroadCast(simFileInfo);
125 
126  if(simFileInfo.numGrids != 1 || (simFileInfo.formatBits != expectedFormatBits)){
127  parallelgetfileinfo3 = false;
128  } else {
129 
130  std::string &gridName(simFileInfo.gridNames[0]);
131  std::string expectedGridName("Group001");
132 
133  if(gridName != expectedGridName){
134  parallelgetfileinfo3 = false;
135  }
136  int numgDim = 3;
137  if(simFileInfo.gridNumDimensions[0] != numgDim){
138  parallelgetfileinfo3 = false;
139  }
140 
141  // fixtures::IndexIntervalType &gridInterval(simFileInfo.gridSizes[0]);
142  for(int iDim = 0;iDim < numgDim;iDim++){
143  if(simFileInfo.gridSizes[0][iDim] != expectedSizes3D1[iDim]){
144  parallelgetfileinfo3 = false;
145  }
146  }
147 
148  if(myRank == 0){
149  if(!parallelgetfileinfo3)
150  serialgetfileinfo3 = false;
151  }
152  }
153 
154  serialgetfileinfo3 = CheckResult(serialgetfileinfo3,testComm);
155  parallelgetfileinfo3 = CheckResult(parallelgetfileinfo3,testComm);
156 
157  parallelUnitResults.UpdateResult("HDF5:Serial3DFileInfo",serialgetfileinfo3);
158  parallelUnitResults.UpdateResult("HDF5:Parallel3DFileInfo",parallelgetfileinfo3);
159 
160 
161  std::vector<size_t> expectedSizes3D2(3,20);
162  expectedSizes3D2[0] = 41;
163 
164  bool serialgetfileinfo32 = true;
165  bool parallelgetfileinfo32 = true;
166  if(pcpp::io::hdf5::FileInfo(testFileName3D_2,simFileInfo,testComm,messageStream))
167  return;
168 
169  // if(myRank == 0){
170  // if(pcpp::io::hdf5::FileInfo(testFileName3D_2,simFileInfo,messageStream)){
171  // std::cout << "pcpp::io::hdf5::FileInfo failed: " << messageStream.str()
172  // << std::endl;
173  // serialgetfileinfo32 = false;
174  // testComm.SetExit(1);
175  // }
176  // pcpp::report::SimFileInfo(std::cout,simFileInfo);
177  // if(simFileInfo.formatBits != expectedFormatBits){
178  // serialgetfileinfo2 = false;
179  // testComm.SetExit(1);
180  // }
181  // }
182  // if(testComm.Check())
183  // return;
184  // testComm.StreamBroadCast(simFileInfo);
185 
186  if(simFileInfo.numGrids != 2 || (simFileInfo.formatBits != expectedFormatBits)){
187  parallelgetfileinfo32 = false;
188  } else {
189 
190  for(int iGrid = 0;iGrid < simFileInfo.numGrids;iGrid++){
191  std::string &gridName(simFileInfo.gridNames[iGrid]);
192  std::ostringstream expectedGridName;
193  expectedGridName << "Group00" << iGrid+1;
194 
195  if(gridName != expectedGridName.str()){
196  parallelgetfileinfo32 = false;
197  }
198 
199  if(simFileInfo.gridNumDimensions[iGrid] != 3){
200  parallelgetfileinfo32 = false;
201  }
202 
203  // fixtures::IndexIntervalType &gridInterval(simFileInfo.gridSizes[iGrid]);
204  if(simFileInfo.gridSizes[iGrid] != expectedSizes3D2){
205  parallelgetfileinfo32 = false;
206  }
207 
208  if(myRank == 0){
209  if(!parallelgetfileinfo32)
210  serialgetfileinfo32 = false;
211  }
212  }
213  }
214 
215  serialgetfileinfo32 = CheckResult(serialgetfileinfo32,testComm);
216  parallelgetfileinfo32 = CheckResult(parallelgetfileinfo32,testComm);
217 
218  parallelUnitResults.UpdateResult("HDF5:Multi3DFileInfo",serialgetfileinfo32);
219  parallelUnitResults.UpdateResult("HDF5:ParMulti3DFileInfo",parallelgetfileinfo32);
220 
221 };
222 
224 {
225 
226  std::ostringstream messageStream;
227  std::string testFileName2D("HDF5Examples/MultipleGrids2D.h5");
228 
229  pcpp::CommunicatorType myCartComm;
231  cartInfo.cartDecompDirections.resize(2,1);
232  cartInfo.numDimensions = 2;
233  pcpp::comm::SetupCartesianTopology(testComm,cartInfo,myCartComm,messageStream);
234 
235  pcpp::report::CartesianSetup(messageStream,cartInfo);
236  pcpp::io::Everyone(messageStream.str(),std::cout,testComm);
237  pcpp::io::RenewStream(messageStream);
238 
239  std::vector<int> &cartCoords(myCartComm.CartCoordinates());
240  std::vector<int> &cartDims(myCartComm.CartDimensions());
241  std::vector<int> cartNeighbors;
242  myCartComm.CartNeighbors(cartNeighbors);
243 
244 
245  int myRank = testComm.Rank();
246  int nProc = testComm.Size();
247 
248  fixtures::ConfigurationType testConfig;
250  pcpp::io::hdf5::configuration hdf5Config;
251 
252  pcpp::io::simfileinfo simFileInfo;
253  if(myRank == 0){
254  if(pcpp::io::hdf5::FileInfo(testFileName2D,simFileInfo,messageStream)){
255  std::cout << "pcpp::io::hdf5::FileInfo failed: " << messageStream.str()
256  << std::endl;
257  testComm.SetExit(1);
258  }
259  }
260  if(testComm.Check()){
261  std::cout << "TestHDF5Read2DBSGrid:ERROR!! FileInfo failed. Skipping tests."
262  << std::endl;
263  return;
264  }
265  testComm.StreamBroadCast(simFileInfo);
266 
267 
268  hdf5Config.collectiveMode = 1;
269  int numGrids = simFileInfo.numGrids;
270  for(int iGrid = 0;iGrid < simFileInfo.numGrids;iGrid++){
271 
272  std::string &gridName(simFileInfo.gridNames[iGrid]);
273 
274  grid_t testGrid;
275  testGrid.SetGridSizes(simFileInfo.gridSizes[iGrid]);
276  pcpp::IndexIntervalType globalExtent;
277  pcpp::IndexIntervalType &partitionExtent(testGrid.PartitionInterval());
278 
279  globalExtent.InitSimple(simFileInfo.gridSizes[iGrid]);
280  messageStream << "TestHDF5Read2DBSGrid:Global size: ";
281  globalExtent.PrettyPrint(messageStream);
282  messageStream << std::endl;
283  pcpp::io::Everyone(messageStream.str(),std::cout,testComm);
284  pcpp::io::RenewStream(messageStream);
285 
286  std::cout << "TestHDF5Read2DBSGrid:Partitioning " << std::endl;
287  if(pcpp::util::PartitionCartesianExtent(globalExtent,cartDims,cartCoords,partitionExtent,messageStream)){
288  std::cout << "TestHDF5Read2DBSGrid: Partitioning failed for grid "
289  << iGrid << ". Skipping tests." << std::endl;
290  return;
291  }
292 
293  messageStream << "Partition interval: ";
294  partitionExtent.PrettyPrint(messageStream);
295  messageStream << std::endl;
296 
297  pcpp::io::Everyone(messageStream.str(),std::cout,testComm);
298  pcpp::io::RenewStream(messageStream);
299 
300  testComm.Barrier();
301  testGrid.Finalize();
302  testGrid.AllocateCoordinateData();
303 
304  if(pcpp::io::hdf5::ParallelReadBlockStructuredGrid<grid_t>(gridName,"/",testGrid,hdf5Config,testFileName2D,
305  testComm,messageStream)){
306  std::cout << "pcpp::io::hdf5::ParallelReadBlockStructuredGrid failed: "
307  << messageStream.str() << std::endl;
308  testComm.SetExit(1);
309  } else {
310  pcpp::io::Everyone(messageStream.str(),std::cout,testComm);
311  pcpp::io::RenewStream(messageStream);
312  }
313  }
314  bool result = true;
315  if(testComm.Check())
316  result = false;
317 
318  parallelUnitResults.UpdateResult("HDF5:Basic:testran",result);
319 
320 }
321 
322 void TestPCPPHDF5Read(ix::test::results &parallelUnitResults,pcpp::CommunicatorType &testComm)
323 {
324 
325  std::cout << "TestPCPPHDF5Read Start!" << std::endl;
326 
327  std::ostringstream messageStream;
328  std::string testFileName2D("HDF5Examples/MultipleGrids2D.h5");
329  pcpp::io::hdf5::base hdf5File;
330 
331  int myRank = testComm.Rank();
332 
333 
334  bool serialOpen = true;
335  bool serialOpenGroup = true;
336  bool serialOpenGroupFail = false;
337  bool globalExistence = true;
338  bool scopeExistence = true;
339  bool readAttribute = true;
340  bool attExists = true;
341  bool readAttributeVec = true;
342  bool readLegacyHeader = true;
343  bool legacyHeaderExists = true;
344  bool dataDims = true;
345  bool attDims = true;
346 
347  if(myRank == 0){
348 
349  if(hdf5File.Open(testFileName2D,true)){
350  serialOpen = false;
351  }
352  if(!hdf5File.Exists("Group001"))
353  scopeExistence = false;
354  if(!hdf5File.Exists("/Group001"))
355  globalExistence = false;
356  if(!hdf5File.Exists("Group002/X"))
357  scopeExistence = false;
358  if(!hdf5File.Exists("/Group002/X"))
359  globalExistence = false;
360 
361  hdf5File.AttributeExists("Group001/HEADER");
362  hdf5File.AttributeExists("/Group001/HEADER");
363  hdf5File.AttributeExists("Group001/useIB");
364  hdf5File.AttributeExists("Group001/numberOfAuxVars");
365  hdf5File.AttributeExists("Group002/gridSize");
366 
367  std::vector<size_t> groupHeaderDims(hdf5File.AttributeDimensions("/Group001/HEADER"));
368  if(groupHeaderDims.size() != 1)
369  attDims = false;
370  else if (groupHeaderDims[0] != 4)
371  attDims = false;
372 
373  std::vector<size_t> coordinateDimensions1(hdf5File.DataDimensions("/Group001/X"));
374  std::vector<size_t> coordinateDimensions2(hdf5File.DataDimensions("/Group002/X"));
375  if(coordinateDimensions1.size() != 2 ||
376  coordinateDimensions2.size() != 2){
377  dataDims = false;
378  } else {
379  if(coordinateDimensions1[0] != 61 ||
380  coordinateDimensions1[1] != 61){
381  dataDims = false;
382  }
383  if(coordinateDimensions2[0] != 40 ||
384  coordinateDimensions2[1] != 121){
385  dataDims = false;
386  }
387  }
388 
389  // std::cout << "### Before number of Grids attribute exists" << std::endl;
390 
391 
392  int numberOfGrids = 0;
393  if(!hdf5File.AttributeExists("numberOfGrids"))
394  attExists = false;
395  if(hdf5File.ReadAttribute("numberOfGrids",&numberOfGrids))
396  readAttribute = false;
397  if(numberOfGrids != 2)
398  readAttribute = false;
399 
400  double time = -1.0;
401  double headerSpace[] = {-1,-1,-1,-1};
402  //if(!hdf5File.AttributeExists("/HEADER"))
403  if(!hdf5File.AttributeExists("HEADER")){
404  legacyHeaderExists = false;
405  }
406 
407  if (!readLegacyHeader) {
408  std::cout << "Failed to correctly read the legacy PlasComCM HEADER" << std::endl;
409  std::cout << "This test is written to always fail. It is currently broken on Vulcan" << std::endl;
410  }
411 
412  // This should pass on all platforms, but it doesn't for some reason on Vulcan
413  // H5ARead fails to read the time from the HEADER attribute, causing
414  // All of the HDF5 tests to fail.
415  if(legacyHeaderExists){
416  if(hdf5File.ReadAttribute("HEADER",headerSpace))
417  readAttribute = false;
418  time = headerSpace[0];
419  if(time != 0.0)
420  readAttribute = false;
421  } else {
422  readAttribute = false;
423  }
424 
425  std::vector<double> gridHeader(4,-1);
426  hdf5File.OpenGroup("Group001");
427  if(!hdf5File.AttributeExists("HEADER"))
428  attExists = false;
429  if(attExists){
430  if(hdf5File.ReadAttribute("HEADER",&gridHeader[0]))
431  readAttribute = false;
432  if(gridHeader[0] != 0 ||
433  gridHeader[1] != 0 ||
434  gridHeader[2] != 0 ||
435  gridHeader[3] != 0){
436  readAttribute = false;
437  }
438  }
439  hdf5File.CloseGroup();
440 
441  // open non-existent group
442  if(hdf5File.OpenGroup("nope")){
443  serialOpenGroupFail = true;
444  }
445 
446  if(!serialOpenGroupFail)
447  serialOpenGroup = false;
448 
449  // test for root group existence
450  // if(!hdf5File.Exists("/")){
451  // globalExistence = false;
452  // }
453 
454  // test for non-existent group
455  if(hdf5File.Exists("Configuration")){
456  globalExistence = false;
457  }
458 
459  if(hdf5File.OpenGroup("Group001"))
460  serialOpenGroup = false;
461 
462  if(!hdf5File.Exists("X")){
463  scopeExistence = false;
464  }
465 
466  // Should not resolve Group002 in relative path
467  if(hdf5File.Exists("Group002")){
468  scopeExistence = false;
469  }
470 
471  // *Should* resolve /Group002 absolute path
472  if(!hdf5File.Exists("/Group002")){
473  globalExistence = false;
474  }
475 
476  // Same relative/absolute path distinction for attribute
477  if(hdf5File.AttributeExists("numberOfGrids"))
478  attExists = false;
479 
480  if(!hdf5File.AttributeExists("/numberOfGrids"))
481  attExists = false;
482 
483  std::cout << "ReadAttribute using C-style array." << std::endl;
484  std::vector<size_t> gridSize(3,0);
485  if(hdf5File.ReadAttribute("/Group001/gridSize",&gridSize[0]))
486  readAttribute = false;
487  if(gridSize[0] != 61 ||
488  gridSize[1] != 61)
489  readAttribute = false;
490 
491  std::cout << "ReadAttribute using STL Vector." << std::endl;
492  std::vector<size_t> testSizeVec;
493  if(hdf5File.ReadAttribute("/Group001/gridSize",testSizeVec))
494  readAttributeVec = false;
495  if(testSizeVec.size() != 2){
496  readAttributeVec = false;
497  } else if(testSizeVec[0] != 61 ||
498  testSizeVec[1] != 61){
499  readAttributeVec = false;
500  }
501 
502  std::cout << "Closing HDF5 file." << std::endl;
503  hdf5File.Close();
504  }
505 
506 
507  bool parallelOpen = true;
508  if(hdf5File.Open(testFileName2D,testComm,true)){
509  testComm.SetExit(1);
510  }
511  if(testComm.Check())
512  parallelOpen = false;
513  pcpp::io::Everyone(messageStream.str(),std::cout,testComm);
514  pcpp::io::RenewStream(messageStream);
515 
516  parallelUnitResults.UpdateResult("HDF5:Object:SerialOpen",serialOpen);
517  parallelUnitResults.UpdateResult("HDF5:Object:SerialOpenGroup",serialOpenGroup);
518  parallelUnitResults.UpdateResult("HDF5:Object:ParallelOpen",parallelOpen);
519  parallelUnitResults.UpdateResult("HDF5:Object:GlobalExistence",globalExistence);
520  parallelUnitResults.UpdateResult("HDF5:Object:ScopeExistence",scopeExistence);
521  parallelUnitResults.UpdateResult("HDF5:Object:AttributeExists",attExists);
522  parallelUnitResults.UpdateResult("HDF5:Object:DataDimensions",dataDims);
523  parallelUnitResults.UpdateResult("HDF5:Object:AttributeDimensions",attDims);
524  parallelUnitResults.UpdateResult("HDF5:Object:ReadAttribute",readAttribute);
525  parallelUnitResults.UpdateResult("HDF5:Object:ReadAttVector",readAttributeVec);
526  parallelUnitResults.UpdateResult("HDF5:Object:LegacyHeaderExists",legacyHeaderExists);
527  parallelUnitResults.UpdateResult("HDF5:Object:ReadLegacyHeader",readLegacyHeader);
528 
529 };
530 
531 
532 void TestPCPPHDF5Write(ix::test::results &parallelUnitResults,pcpp::CommunicatorType &testComm)
533 {
534 
535  int myRank = testComm.Rank();
536 
537  bool groupCreate = true;
538  bool attCreate = true;
539  bool dataCreate = true;
540  bool stringAttRead = true;
541  bool readDataSetVec = true;
542  bool dataDims = true;
543  bool configIO = true;
544 
545  std::string testFunctionName("TestPCPPHDF5Write");
546  pcpp::ConfigType testConfig;
547  std::ostringstream configStream;
548 
549  if(pcpp::util::ProcessConfigurationFile("Config/Examples/misc/advect1d.config",testConfig,testComm,std::cout)){
550  configIO = false;
551  std::cout << testFunctionName
552  << ":Error:Failed to process configuration file Config/Examples/misc/advect1d.config." << std::endl;
553  } else {
554  configStream << testConfig;
555  }
556 
557  if(myRank == 0){
558 
559  if(ix::sys::FILEEXISTS("tmptest.h5"))
560  ix::sys::Remove("tmptest.h5");
561 
562  pcpp::io::hdf5::base testFile("tmptest.h5");
563  testFile.CreateGroup("/Geometry");
564  testFile.CreateGroup("/Domains");
565  testFile.CreateGroup("/Geometry/Grids");
566  testFile.CreateGroup("/Configuration");
567 
568  std::string configString(configStream.str());
569  if(!configString.empty())
570  testFile.CreateAttribute("/Configuration/Parameters",configString);
571 
572  int numGrids = 2;
573  std::vector<size_t> attSize2(1,1);
574  testFile.CreateAttribute("/Geometry/Grids/numGrids",attSize2,&numGrids);
575  std::string gridNames("Grid001 Grid002");
576  testFile.CreateAttribute("/Geometry/Grids/gridNames",gridNames);
577  testFile.CreateGroup("/Geometry/Grids/Grid001");
578  testFile.CreateGroup("/Geometry/Grids/Grid002");
579 
580  int numDim = 2;
581  std::vector<size_t> gridSize(2,2);
582  gridSize[0] = 3;
583  std::vector<size_t> sizeAtt(1,2);
584  testFile.CreateAttribute("/Geometry/Grids/Grid001/numDim",attSize2,&numDim);
585  testFile.CreateAttribute("/Geometry/Grids/Grid002/numDim",attSize2,&numDim);
586  testFile.CreateAttribute("/Geometry/Grids/Grid001/gridSize",sizeAtt,&gridSize[0]);
587  testFile.CreateAttribute("/Geometry/Grids/Grid002/gridSize",sizeAtt,gridSize);
588 
589  int numGridPoints = 1;
590  for(int iDim = 0;iDim < numDim;iDim++)
591  numGridPoints *= gridSize[iDim];
592  std::vector<double> grid1(numGridPoints,0);
593  std::vector<double> grid2(numGridPoints,0);
594  for(int iPoint = 0;iPoint < numGridPoints;iPoint++){
595  grid1[iPoint] = iPoint;
596  grid2[iPoint] = numGridPoints + iPoint;
597  }
598 
599  testFile.CreateDataSet("/Geometry/Grids/Grid001/X",gridSize,grid1);
600  testFile.CreateDataSet("/Geometry/Grids/Grid001/Y",gridSize,grid1);
601  testFile.CreateDataSet("/Geometry/Grids/Grid002/X",gridSize,grid2);
602  testFile.CreateDataSet("/Geometry/Grids/Grid002/Y",gridSize,grid1);
603 
604  testFile.Close();
605 
606  testFile.Open("tmptest.h5",true);
607 
608  if(!testFile.Exists("/Geometry") ||
609  !testFile.Exists("/Configuration") ||
610  !testFile.Exists("/Geometry/Grids") ||
611  !testFile.Exists("/Geometry/Grids/Grid001") ||
612  !testFile.Exists("/Geometry/Grids/Grid002") ||
613  !testFile.Exists("/Domains"))
614  groupCreate = false;
615 
616  if(!testFile.AttributeExists("/Geometry/Grids/numGrids") ||
617  !testFile.AttributeExists("/Geometry/Grids/gridNames") ||
618  !testFile.AttributeExists("/Geometry/Grids/Grid001/numDim") ||
619  !testFile.AttributeExists("/Geometry/Grids/Grid002/numDim") ||
620  !testFile.AttributeExists("/Geometry/Grids/Grid001/gridSize") ||
621  !testFile.AttributeExists("/Geometry/Grids/Grid002/gridSize"))
622  attCreate = false;
623 
624  if(!testFile.Exists("/Geometry/Grids/Grid001/X") ||
625  !testFile.Exists("/Geometry/Grids/Grid002/X") ||
626  !testFile.Exists("/Geometry/Grids/Grid001/Y") ||
627  !testFile.Exists("/Geometry/Grids/Grid002/Y"))
628  dataCreate = false;
629 
630  std::string gridNamesAtt;
631  testFile.ReadAttribute("/Geometry/Grids/gridNames",gridNamesAtt);
632  if(gridNamesAtt != "Grid001 Grid002"){
633  std::cout << "Read GridNames = (" << gridNamesAtt
634  << ")" << std::endl;
635  stringAttRead = false;
636  }
637 
638  pcpp::ConfigType testConfig2;
639  std::string configString2;
640  testFile.ReadAttribute("/Configuration/Parameters",configString2);
641  std::istringstream configStream(configString2);
642  configStream >> testConfig2;
643  if(testConfig2 != testConfig){
644  std::cout << "======= CONFIGURATION 1 ========" << std::endl
645  << testConfig << std::endl
646  << "======= CONFIGURATION 2 ========" << std::endl
647  << testConfig2 << std::endl;
648  configIO = false;
649  }
650 
651  std::vector<size_t> grid1Size(testFile.DataDimensions("/Geometry/Grids/Grid001/X"));
652  if(grid1Size.size() != 2)
653  dataDims = false;
654  else {
655  if(grid1Size[0] != 3 ||
656  grid1Size[1] != 2){
657  dataDims = false;
658  std::cout << "SIZE PROBLEM: " << grid1Size[0]
659  << "," << grid1Size[1] << std::endl;
660  }
661  }
662  std::vector<double> grid1XData;
663  if(testFile.ReadDataSet("/Geometry/Grids/Grid001/X",grid1XData))
664  std::cout << "ERROR!!!" << std::endl;
665  if(grid1XData.size() != numGridPoints)
666  readDataSetVec = false;
667  for(int iPoint = 0;iPoint < numGridPoints;iPoint++)
668  if(grid1XData[iPoint] != iPoint)
669  readDataSetVec = false;
670  testFile.Close();
671  }
672 
673  parallelUnitResults.UpdateResult("HDF5:Object:CreateGroup",groupCreate);
674  parallelUnitResults.UpdateResult("HDF5:Object:CreateAttribute",attCreate);
675  parallelUnitResults.UpdateResult("HDF5:Object:CreateData",dataCreate);
676  parallelUnitResults.UpdateResult("HDF5:Object:ReadStringAttribute",stringAttRead);
677  parallelUnitResults.UpdateResult("HDF5:Object:ReadDataVector",readDataSetVec);
678  parallelUnitResults.UpdateResult("HDF5:Object:DataDims",dataDims);
679  parallelUnitResults.UpdateResult("HDF5:Object:ConfigIO",configIO);
680 
681 };
682 
683 void TestHDF5HyperSlab(ix::test::results &parallelUnitResults,pcpp::CommunicatorType &testComm)
684 {
685  int myRank = testComm.Rank();
686  std::ostringstream messageStream;
687 
688  int numDim = 3;
689  std::vector<size_t> dataSize(numDim,0);
690  dataSize[0] = 8;
691  dataSize[1] = 4;
692  dataSize[2] = 2;
693 
694  // REVERSAL DUE TO HDF5 AUTOMATIC DATA ORDERING
695  // and CONVENTION OF PlasCom2
696  // HDF5 assumes that data is arranged with Z being
697  // the stride-1 direction. PlasCom2 stores data
698  // in contiguous linear buffers with X being the
699  // stride-1 direction.
700  std::vector<size_t> rdataSize(dataSize);
701  std::reverse(rdataSize.begin(),rdataSize.end());
702 
703  size_t numGlobalPoints = 1;
704 
705  if(myRank == 0){
706  if(ix::sys::FILEEXISTS("tmptest2.h5"))
707  ix::sys::Remove("tmptest2.h5");
708  pcpp::io::hdf5::base testFile("tmptest2.h5");
709  for(int iDim = 0;iDim < numDim;iDim++)
710  numGlobalPoints *= dataSize[iDim];
711  std::vector<double> myData(numGlobalPoints,0);
712  size_t iPoint = 0;
713  for(size_t iZ = 0;iZ < dataSize[2];iZ++){
714  for(size_t iY = 0;iY < dataSize[1];iY++){
715  for(size_t iX = 0;iX < dataSize[0];iX++){
716  myData[iPoint++] = iX+iY*100+iZ*1000;
717  }
718  }
719  }
720  testFile.CreateDataSet("/myData",rdataSize,myData);
721  testFile.Close();
722  }
723 
724  testComm.Barrier();
725 
726  pcpp::CommunicatorType myCartComm;
728  pcpp::comm::SetupCartesianTopology(testComm,cartInfo,myCartComm,messageStream);
729 
730  pcpp::report::CartesianSetup(messageStream,cartInfo);
731  pcpp::io::Everyone(messageStream.str(),std::cout,testComm);
732  pcpp::io::RenewStream(messageStream);
733 
734  std::vector<int> &cartCoords(myCartComm.CartCoordinates());
735  std::vector<int> &cartDims(myCartComm.CartDimensions());
736  std::vector<int> cartNeighbors;
737  myCartComm.CartNeighbors(cartNeighbors);
738 
739  pcpp::IndexIntervalType globalExtent;
740  globalExtent.InitSimple(dataSize);
741  pcpp::IndexIntervalType partitionExtent;
742 
743  if(myRank == 0){
744  std::cout << "Global interval: ";
745  globalExtent.PrettyPrint(std::cout);
746  std::cout << std::endl;
747  }
748 
749  if(pcpp::util::PartitionCartesianExtent(globalExtent,cartDims,cartCoords,partitionExtent,messageStream)){
750  std::cout << "TestHDF5HyperSlab:ERROR: Partitioning failed." << std::endl;
751  return;
752  }
753 
754  messageStream << "Partition interval: ";
755  partitionExtent.PrettyPrint(messageStream);
756  messageStream << std::endl;
757 
758  pcpp::io::Everyone(messageStream.str(),std::cout,testComm);
759  pcpp::io::RenewStream(messageStream);
760 
761  int numLocalPoints = partitionExtent.NNodes();
762  std::vector<size_t> localStart(partitionExtent.Starts());
763  std::vector<size_t> rlocalStart(localStart);
764  std::reverse(rlocalStart.begin(),rlocalStart.end());
765  std::vector<size_t> localSize(partitionExtent.Sizes());
766  std::vector<size_t> rlocalSize(localSize);
767  std::reverse(rlocalSize.begin(),rlocalSize.end());
768  std::vector<double> myData;
769 
770  pcpp::io::hdf5::base testFile("tmptest2.h5",testComm);
771  testFile.ReadHyperSlab("/myData",rlocalStart,rlocalSize,myData);
772 
773  bool readHyperSlab = true;
774  if(myData.size() != numLocalPoints){
775  readHyperSlab = false;
776  } else {
777  size_t iLocal = 0;
778  for(size_t iZ = partitionExtent[2].first;iZ <= partitionExtent[2].second;iZ++){
779  for(size_t iY = partitionExtent[1].first;iY <= partitionExtent[1].second;iY++){
780  for(size_t iX = partitionExtent[0].first;iX <= partitionExtent[0].second;iX++){
781  double expectedValue = iX + 100*iY + 1000*iZ;
782  if(myData[iLocal] != expectedValue){
783  messageStream << myRank << "(local,[ix,iy,iz]) = (actual,expected) : ("
784  << iLocal << ",[" << iX << "," << iY << "," << iZ << "]) = ("
785  << myData[iLocal] << "," << expectedValue << ")" << std::endl;
786  readHyperSlab = false;
787  }
788  iLocal++;
789  }
790  }
791  }
792  }
793  testFile.Close();
794  bool writeHyperSlab = false;
795  if(readHyperSlab){
796  writeHyperSlab = true;
797  if(myRank == 0){
798  ix::sys::Remove("tmptest2.h5");
799  }
800  testComm.Barrier();
801  testFile.Create("tmptest2.h5",testComm);
802  for(size_t iLocal = 0;iLocal < numLocalPoints;iLocal++){
803  myData[iLocal] = -1.0*myData[iLocal];
804  }
805  testFile.WriteHyperSlab("/myData",rdataSize,rlocalStart,rlocalSize,myData);
806  testFile.Close();
807  testFile.Open("tmptest2.h5",testComm);
808  myData.resize(0);
809  testFile.ReadHyperSlab("/myData",rlocalStart,rlocalSize,myData);
810  testFile.Close();
811  size_t iLocal = 0;
812  for(size_t iZ = partitionExtent[2].first;iZ <= partitionExtent[2].second;iZ++){
813  for(size_t iY = partitionExtent[1].first;iY <= partitionExtent[1].second;iY++){
814  for(size_t iX = partitionExtent[0].first;iX <= partitionExtent[0].second;iX++){
815  double expectedValue = -1.0*(iX + 100*iY + 1000*iZ);
816  if(myData[iLocal] != expectedValue){
817  messageStream << myRank << "(local,[ix,iy,iz]) = (actual,expected) : ("
818  << iLocal << ",[" << iX << "," << iY << "," << iZ << "]) = ("
819  << myData[iLocal] << "," << expectedValue << ")" << std::endl;
820  writeHyperSlab = false;
821  }
822  iLocal++;
823  }
824  }
825  }
826  ix::sys::Remove("tmptest2.h5");
827  }
828 
829  pcpp::io::Everyone(messageStream.str(),std::cout,testComm);
830  pcpp::io::RenewStream(messageStream);
831 
832  parallelUnitResults.UpdateResult("HDF5:Object:ReadHyperSlab",readHyperSlab);
833  parallelUnitResults.UpdateResult("HDF5:Object:WriteHyperSlab",writeHyperSlab);
834 
835  if(myRank == 0){
836  if(ix::sys::FILEEXISTS("tmptest2.h5"))
837  ix::sys::Remove("tmptest2.h5");
838  }
839 };
840 
841 
842 void TestHDF5GridIO(ix::test::results &parallelUnitResults,pcpp::CommunicatorType &testComm)
843 {
844 
847 
848  int myRank = testComm.Rank();
849  int numProc = testComm.Size();
850 
851  std::ostringstream messageStream;
852 
853  pbsgrid_t euler3dGrid;
854  state_t simulationState;
855 
856  double t = 0.0;
857  double gamma = 1.4;
858  double sigma = 0.0;
859  double cfl = 1.0;
860 
861  // references to some grid-specific data structures
863  std::vector<int> &decompDirs(cartInfo.cartDecompDirections);
864  std::vector<int> &periodicDirs(cartInfo.isPeriodic);
865  std::vector<double> &realGridExtent(euler3dGrid.PhysicalExtent());
866  std::vector<size_t> &numGlobalNodes(euler3dGrid.GridSizes());
867  // pcpp::IndexIntervalType &globalExtent(euler3dGrid.);
868 
869  realGridExtent.resize(6,0.0);
870  realGridExtent[1] = 1.0;
871  realGridExtent[3] = 1.0;
872  realGridExtent[5] = 1.0;
873 
874  numGlobalNodes.resize(3);
875  numGlobalNodes[0] = 16;
876  numGlobalNodes[1] = 8;
877  numGlobalNodes[2] = 4;
878 
879  decompDirs.resize(3,1);
880  // decompDirs[0] = 1;
881 
882  periodicDirs.resize(3,1);
883  euler3dGrid.ParallelSetup(testComm,cartInfo,3,messageStream);
884 
885  // Grab the local coordinates and global dimension of the Cartesian topo
886  pcpp::CommunicatorType &gridComm(euler3dGrid.Communicator());
887  std::vector<int> &cartCoords(gridComm.CartCoordinates());
888  std::vector<int> &cartDims(gridComm.CartDimensions());
889  pcpp::IndexIntervalType &partitionExtent(euler3dGrid.PartitionInterval());
890 
891  // Grab the +/- neighbors in each Cartesian direction
892  std::vector<int> cartNeighbors;
893  gridComm.CartNeighbors(cartNeighbors);
894 
895  // Generate a report of the Cartesian setup and put it to stdout
896  pcpp::report::CartesianSetup(messageStream,cartInfo);
897  pcpp::io::Everyone(messageStream.str(),std::cout,testComm);
898  pcpp::io::RenewStream(messageStream);
899 
900  // dx[0] = (realGridExtent[1] - realGridExtent[0])/static_cast<double>(numGlobalNodes[0]-1);
901 
902  // Basic setup for the grid and record some local information
903  std::vector<double> dX(3,0.0);
904  dX[0] = (realGridExtent[1] - realGridExtent[0])/(static_cast<double>(numGlobalNodes[0]-1));
905  dX[1] = (realGridExtent[3] - realGridExtent[2])/(static_cast<double>(numGlobalNodes[1]-1));
906  dX[2] = (realGridExtent[5] - realGridExtent[4])/(static_cast<double>(numGlobalNodes[2]-1));
907  euler3dGrid.SetGridSpacings(dX);
908 
909  pcpp::IndexIntervalType globalExtent;
910  globalExtent.InitSimple(numGlobalNodes);
911 
912  size_t totalGlobalNodes = numGlobalNodes[0]*numGlobalNodes[1]*numGlobalNodes[2];
913  size_t totalGlobalCells = (numGlobalNodes[0]-1)*(numGlobalNodes[1]-1)*(numGlobalNodes[2]-1);
914 
915  double dx = dX[0];
916  double dy = dX[1];
917  double dz = dX[2];
918  double dt = cfl*dx;
919  dt = std::min(dt,cfl*dy);
920  dt = std::min(dt,cfl*dz);
921  // eulerDomain.numGrids = 1;
922 
923 
924 
925  messageStream << "Global size: ";
926  globalExtent.PrettyPrint(messageStream);
927  messageStream << std::endl
928  << "Partition interval: ";
929  partitionExtent.PrettyPrint(messageStream);
930  messageStream << std::endl;
931  pcpp::io::Everyone(messageStream.str(),std::cout,testComm);
932  pcpp::io::RenewStream(messageStream);
933 
934  size_t numX = partitionExtent.NNodes(0);
935  size_t numY = partitionExtent.NNodes(1);
936  size_t numZ = partitionExtent.NNodes(2);
937  size_t nNodes = partitionExtent.NNodes();
938  size_t nCells = (numX-1)*(numY-1)*(numZ-1);
939  size_t xyPlane = numX*numY;
940 
941  const std::vector<size_t> &numPartitionNodes(euler3dGrid.PartitionSizes());
942  // =====================
943 
944  // Hand the grid to the domain
945  // eulerDomain.Grids().resize(1,&euler3dGrid);
946 
947  // This input state is just so that
948  // the domain object can read the meta
949  // data and sizes. The domain object
950  // allocates its own version of this state.
951  simulationState.AddField("rho",'n',1,8,"mass");
952  simulationState.AddField("rhoV",'n',3,8,"momentum");
953  simulationState.AddField("rhoE",'n',1,8,"energy");
954  simulationState.AddField("pressure",'n',1,8,"pressure");
955  simulationState.AddField("temperature",'n',1,8,"temperature");
956  simulationState.AddField("simTime",'s',1,8,"s");
957  simulationState.AddField("inputDT",'s',1,8,"s");
958  simulationState.AddField("inputCFL",'s',1,8,"");
959  simulationState.AddField("gamma",'s',1,8,"");
960  simulationState.AddField("refSigma",'s',1,8,"");
961 
962 
963  // Specify which fields will advance (i.e. other than time)
964  std::vector<int> stateFieldIndices(3,0);
965  stateFieldIndices[1] = 1;
966  stateFieldIndices[2] = 2;
967  simulationState.SetStateFields(stateFieldIndices);
968  simulationState.Create(nNodes,0);
969 
970 
971 
972  // === Set up the initial state ===
973  size_t iNode = 0;
974  std::vector<double> rhoVector;
975  std::vector<double> rhoVVector;
976  std::vector<double> rhoEVector;
977  std::vector<double> tVector;
978  std::vector<double> pVector;
979  rhoVector.reserve(nNodes);
980  rhoVVector.reserve(3*nNodes);
981  rhoEVector.reserve(nNodes);
982  tVector.reserve(nNodes);
983  pVector.reserve(nNodes);
984  double *rhoBuffer = &rhoVector[0];
985  double *rhoVBuffer = &rhoVVector[0];
986  double *rhoEBuffer = &rhoEVector[0];
987  double *temperatureBuffer = &tVector[0];
988  double *pressureBuffer = &pVector[0];
989 
990  // Link the domain's state storage with local storage
991  simulationState.SetFieldBuffer("rho",rhoBuffer);
992  simulationState.SetFieldBuffer("rhoV",rhoVBuffer);
993  simulationState.SetFieldBuffer("rhoE",rhoEBuffer);
994  simulationState.SetFieldBuffer("temperature",temperatureBuffer);
995  simulationState.SetFieldBuffer("pressure",pressureBuffer);
996  simulationState.SetFieldBuffer("simTime",&t);
997  simulationState.SetFieldBuffer("inputDT",&dt);
998  simulationState.SetFieldBuffer("gamma",&gamma);
999  simulationState.SetFieldBuffer("refSigma",&sigma);
1000  simulationState.SetFieldBuffer("inputCFL",&cfl);
1001 
1002  // Report the problem setup to stdout
1003  messageStream << "Problem setup: " << std::endl
1004  << "-------------------------------" << std::endl;
1005  if(myRank == 0){
1006  messageStream << "Sigma: " << sigma << std::endl
1007  << "CFL: " << cfl << std::endl
1008  << "DX: " << dx << std::endl
1009  << "DY: " << dy << std::endl
1010  << "DZ: " << dz << std::endl
1011  << "DT: " << dt << std::endl
1012  << "Domain: [" << realGridExtent[0] << ","
1013  << realGridExtent[1] << "] x [" << realGridExtent[2]
1014  << "," << realGridExtent[3] << "] x [" << realGridExtent[4]
1015  << "," << realGridExtent[5] << "]" << std::endl
1016  << "Grid Points: (" << numGlobalNodes[0]
1017  << "," << numGlobalNodes[1] << "," << numGlobalNodes[2]
1018  << ")" << std::endl;
1019  }
1020  messageStream << "Partition Interval: ";
1021  euler3dGrid.PartitionInterval().PrettyPrint(messageStream);
1022  messageStream << std::endl
1023  << "-------------------------------" << std::endl << std::endl;
1024  pcpp::io::Everyone(messageStream.str(),std::cout,testComm);
1025  pcpp::io::RenewStream(messageStream);
1026 
1027  if(ix::sys::FILEEXISTS("gridtest.h5"))
1028  ix::sys::Remove("gridtest.h5");
1029  pcpp::io::hdf5::base gridFile("gridtest.h5",gridComm);
1030  gridFile.CreateGroup("/Global");
1031  gridFile.CreateGroup("/PlasCom2");
1032  gridFile.CreateGroup("/PlasCom2/Configuration");
1033  gridFile.CreateGroup("/PlasCom2/Geometry");
1034  gridFile.CreateGroup("/PlasCom2/Geometry/Grids");
1035 
1036  bool writeGridTest = true;
1037  int numGrids = 2;
1038  std::vector<size_t> attSize2(1,1);
1039  int numGeometries = 1;
1040  std::string geometryNames("Grids");
1041  gridFile.CreateAttribute("/PlasCom2/Geometry/numGeometries",attSize2,&numGeometries);
1042  gridFile.CreateAttribute("/PlasCom2/Geometry/geometryNames",geometryNames);
1043  gridFile.CreateAttribute("/PlasCom2/Geometry/Grids/numGrids",attSize2,&numGrids);
1044  std::string gridNames("Grid001 Grid002");
1045  gridFile.CreateAttribute("/PlasCom2/Geometry/Grids/gridNames",gridNames);
1046  std::vector<std::string> expectedGridNames(2,"Grids:Grid001");
1047  expectedGridNames[1] = "Grids:Grid002";
1048 
1049  pcpp::IndexIntervalType preDimension;
1050  preDimension.InitSimple(numGlobalNodes);
1051  std::cout << "Pre-Generation Dimension: ";
1052  preDimension.PrettyPrint(std::cout);
1053  std::cout << std::endl;
1054 
1055  // euler3dGrid.InitDone();
1056 
1057  // euler3dGrid.GenerateCoordinateData();
1058  euler3dGrid.GenerateCoordinates(std::cout);
1059  std::vector<double> expectedCoordinates(euler3dGrid.CoordinateData());
1060 
1061  // std::cout << "EXPECTED COORDS: " << std::endl;
1062  // pcpp::io::DumpContents(std::cout,expectedCoordinates,",");
1063  // std::cout << std::endl;
1064 
1065  preDimension.InitSimple(numGlobalNodes);
1066  std::cout << "Post-Generation Dimension: ";
1067  preDimension.PrettyPrint(std::cout);
1068  std::cout << std::endl;
1069 
1070  pcpp::io::hdf5::WriteGrid(euler3dGrid,"Grid001","/PlasCom2/Geometry/Grids",gridFile);
1071  pcpp::io::hdf5::WriteGrid(euler3dGrid,"Grid002","/PlasCom2/Geometry/Grids",gridFile);
1072 
1073  gridFile.Close();
1074 
1075  // return;
1076 
1077  pcpp::io::simfileinfo simFileInfo;
1078  if(myRank == 0){
1079  if(pcpp::io::hdf5::FileInfo("gridtest.h5",simFileInfo,messageStream)){
1080  std::cout << "pcpp::io::hdf5::FileInfo failed: " << messageStream.str()
1081  << std::endl;
1082  testComm.SetExit(1);
1083  }
1084  pcpp::report::SimFileInfo(messageStream,simFileInfo);
1085  }
1086  if(testComm.Check()){
1087  std::cout << "TestHDF5GridIO:ERROR!! FileInfo failed. Skipping tests." << std::endl;
1088  return;
1089  }
1090 
1091  if(myRank == 0){
1092  std::ostringstream infoStreamOut;
1093  infoStreamOut << simFileInfo;
1094  messageStream << "SIMFILEINFO PACKED:" << std::endl
1095  << "(" << infoStreamOut.str() << ")" << std::endl;
1096  std::istringstream infoStreamIn(infoStreamOut.str());
1097  pcpp::io::simfileinfo info2;
1098  infoStreamIn >> info2;
1099  messageStream << "SIMFILEINFO UnPACKED:" << std::endl
1100  << "(" << info2 << ")" << std::endl;
1101  }
1102 
1103 
1104  pcpp::io::Everyone(messageStream.str(),std::cout,testComm);
1105  pcpp::io::RenewStream(messageStream);
1106 
1107  testComm.StreamBroadCast(simFileInfo);
1108 
1109  if(myRank != 0){
1110  messageStream << "REmote Unpacked:" << std::endl
1111  << "(" << simFileInfo << ")" << std::endl;
1112  }
1113 
1114  pcpp::report::SimFileInfo(messageStream,simFileInfo);
1115  pcpp::io::Everyone(messageStream.str(),std::cout,testComm);
1116  pcpp::io::RenewStream(messageStream);
1117 
1118  pcpp::IndexIntervalType expectedDimension;
1119  expectedDimension.InitSimple(numGlobalNodes);
1120  messageStream << "Input Grid Dimension: ";
1121  expectedDimension.PrettyPrint(std::cout);
1122  messageStream << std::endl;
1123  pcpp::io::Everyone(messageStream.str(),std::cout,testComm);
1124  pcpp::io::RenewStream(messageStream);
1125 
1126  if(simFileInfo.numGrids != 2){
1127  messageStream << "Unexpected number of grids: " << simFileInfo.numGrids
1128  << " != 2" << std::endl;
1129  writeGridTest = false;
1130  }
1131  if(simFileInfo.gridNames != expectedGridNames){
1132  messageStream << "Unpexected grid names: (";
1133  pcpp::io::DumpContents(messageStream,simFileInfo.gridNames,",");
1134  messageStream << ") != (";
1135  pcpp::io::DumpContents(messageStream,expectedGridNames,",");
1136  messageStream << ")" << std::endl;
1137  writeGridTest = false;
1138  }
1139  for(int iGrid = 0;iGrid < simFileInfo.numGrids;iGrid++){
1140  if(simFileInfo.gridNumDimensions[iGrid] != 3){
1141  messageStream << "Unexpected grid numDim for grid " << iGrid
1142  << ": " << simFileInfo.gridNumDimensions[iGrid]
1143  << " != 3" << std::endl;
1144  writeGridTest = false;
1145  }
1146  if(simFileInfo.gridSizes[iGrid] != numGlobalNodes){
1147  messageStream << "Unpexected grid size for grid " << iGrid
1148  << ": (";
1149  pcpp::io::DumpContents(messageStream,simFileInfo.gridSizes[iGrid],",");
1150  messageStream << ") != (";
1151  pcpp::io::DumpContents(messageStream,numGlobalNodes,",");
1152  messageStream << ")" << std::endl;
1153  writeGridTest = false;
1154  }
1155  }
1156  pcpp::io::Everyone(messageStream.str(),std::cout,testComm);
1157  pcpp::io::RenewStream(messageStream);
1158 
1159  writeGridTest = CheckResult(writeGridTest,testComm);
1160  parallelUnitResults.UpdateResult("HDF5:Interface:WriteGrid",writeGridTest);
1161 
1162  // Re-open read-only
1163 
1164 
1165  bool readGridTest = true;
1166 
1167  // reset coordinate data to zero
1168  std::vector<double> &modifyCoordinateData(euler3dGrid.CoordinateData());
1169  std::vector<double>::iterator cdIt = modifyCoordinateData.begin();
1170  while(cdIt != modifyCoordinateData.end())
1171  *cdIt++ = 0;
1172 
1173  gridFile.Open("gridtest.h5",gridComm,true);
1174  if(pcpp::io::hdf5::ReadGrid(euler3dGrid,"/PlasCom2/Geometry/Grids/Grid001",gridFile)){
1175  std::cout << "Reading grid from gridtest.h5 failed!" << std::endl;
1176  readGridTest = false;
1177  }
1178  gridFile.Close();
1179 
1180  std::vector<double> &readCoordinates(euler3dGrid.CoordinateData());
1181  if(readCoordinates != expectedCoordinates){
1182  readGridTest = false;
1183  messageStream << "READ UNEXPECTED COORDS: " << std::endl;
1184  pcpp::io::DumpContents(messageStream,readCoordinates,",");
1185  messageStream << std::endl
1186  << "--------WHICH IS NOT EQUAL TO EXPECTED:";
1187  pcpp::io::DumpContents(messageStream,expectedCoordinates,",");
1188  messageStream << std::endl;
1189  }
1190  pcpp::io::Everyone(messageStream.str(),std::cout,testComm);
1191  pcpp::io::RenewStream(messageStream);
1192 
1193  readGridTest = CheckResult(readGridTest,testComm);
1194  parallelUnitResults.UpdateResult("HDF5:Interface:ReadGrid",readGridTest);
1195 
1196  if(myRank == 0){
1197  if(ix::sys::FILEEXISTS("gridtest.h5"))
1198  ix::sys::Remove("gridtest.h5");
1199  }
1200 
1201 };
1202 
1203 
1204 void TestHDF5PBSGridIO(ix::test::results &parallelUnitResults,pcpp::CommunicatorType &testComm)
1205 {
1206  std::ostringstream messageStream;
1207 
1208  fixtures::ConfigurationType testConfig;
1209 
1216 
1217 
1218  global_t myGlobal;
1219  myGlobal.Init("TestPBSIO",testComm);
1220  myGlobal.SetVerbLevel(3);
1221  myGlobal.Profiling(true);
1222 
1223  int numProc = testComm.Size();
1224  int myRank = testComm.Rank();
1225 
1226  // grid_t testGrid;
1227  pbsgrid_t pbsGrid;
1228  // halo_t testHalo;
1229  // comm_t &gridComm(testGrid.Communicator());
1230  int numDim = 3;
1231  std::vector<size_t> gridSize(numDim,0);
1232  std::vector<double> dX(numDim,0);
1233 
1234  size_t numGlobalNodes = 1;
1235  size_t numGlobalCells = 1;
1236  for(int iDim = 0;iDim < numDim;iDim++){
1237  // 100x50x25
1238  gridSize[iDim] = static_cast<size_t>(std::pow(2.0,(numDim-iDim-1)%numDim)*25);
1239  dX[iDim] = 1.0/static_cast<double>(gridSize[iDim]-1);
1240  numGlobalNodes *= gridSize[iDim];
1241  numGlobalCells *= (gridSize[iDim]-1);
1242  }
1243  // gridSize[0] = 4;
1244  // gridSize[1] = 4;
1245  // gridSize[2] = 2;
1246  // numGlobalNodes = 32;
1247  // numGlobalCells = 9;
1248  pbsGrid.SetGridSizes(gridSize);
1249  pcpp::ParallelTopologyInfoType pbsCartInfo;
1250  pbsCartInfo.numDimensions = numDim;
1251  pbsCartInfo.isPeriodic.resize(numDim,1);
1252 
1253  operator_t sbpOperator;
1254  plascom2::operators::sbp::Initialize(sbpOperator,4);
1255  int boundaryDepth = (sbpOperator.numStencils-1)/2;
1256 
1257  pbsGrid.ParallelSetup(testComm,pbsCartInfo,boundaryDepth,messageStream);
1258 
1259  std::vector<int> haloDepths(2*numDim,boundaryDepth);
1260  std::vector<int> boundaryDepths(2*numDim,boundaryDepth);
1261 
1262  comm_t &pbsGridComm(pbsGrid.Communicator());
1263  // Grab the local coordinates and global dimension of the Cartesian topo
1264  std::vector<int> &cartCoords(pbsGridComm.CartCoordinates());
1265  std::vector<int> &cartDims(pbsGridComm.CartDimensions());
1266  // Grab the +/- neighbors in each Cartesian direction
1267  std::vector<int> cartNeighbors;
1268  pbsGridComm.CartNeighbors(cartNeighbors);
1269 
1271  cartInfo.numDimensions = numDim;
1272 
1273  // Generate a report of the Cartesian setup and put it to stdout
1274  pcpp::report::CartesianSetup(messageStream,pbsCartInfo);
1275  myGlobal.StdOut(messageStream.str(),2);
1276  pcpp::io::RenewStream(messageStream);
1277 
1278  interval_t globalInterval;
1279  globalInterval.InitSimple(gridSize);
1280 
1281  // interval_t &partitionInterval(pbsGrid.PartitionInterval());
1282  interval_t &pbsPartInterval(pbsGrid.PartitionInterval());
1283  const std::vector<size_t> &bufferSizes(pbsGrid.BufferSizes());
1284  const pcpp::IndexIntervalType &localPartitionInterval(pbsGrid.PartitionBufferInterval());
1285 
1286  size_t numPointsBuffer = pbsGrid.BufferSize();
1287 
1289  bufferInterval.InitSimple(bufferSizes);
1290 
1291 
1292  // Create simple message buffers - assuming the grid coordinates will
1293  // be used to test
1294  int numComponents = numDim;
1295 
1296  pbsGrid.AllocateCoordinateData();
1297  std::vector<double> &gridCoordinates(pbsGrid.CoordinateData());
1298 
1299  size_t partStartX = pbsPartInterval[0].first;
1300  size_t partEndX = pbsPartInterval[0].second;
1301  size_t partStartY = pbsPartInterval[1].first;
1302  size_t partEndY = pbsPartInterval[1].second;
1303  size_t partStartZ = pbsPartInterval[2].first;
1304  size_t partEndZ = pbsPartInterval[2].second;
1305  size_t bufferStartX = localPartitionInterval[0].first;
1306  size_t bufferEndX = localPartitionInterval[0].second;
1307  size_t bufferStartY = localPartitionInterval[1].first;
1308  size_t bufferEndY = localPartitionInterval[1].second;
1309  size_t bufferStartZ = localPartitionInterval[2].first;
1310  size_t bufferEndZ = localPartitionInterval[2].second;
1311  size_t buffPlane = bufferSizes[0]*bufferSizes[1];
1312  size_t buffRow = bufferSizes[0];
1313  size_t iPartZ,iPartY,iPartX,iBufX, iBufY, iBufZ;
1314  for(iPartZ = partStartZ, iBufZ = bufferStartZ;
1315  iPartZ <= partEndZ;iPartZ++,iBufZ++){
1316  size_t bufZ = iBufZ*buffPlane;
1317  for(iPartY = partStartY, iBufY = bufferStartY;
1318  iPartY <= partEndY;iPartY++,iBufY++){
1319  size_t bufYZ = bufZ + iBufY*buffRow;
1320  for(iPartX = partStartX, iBufX = bufferStartX;
1321  iPartX <= partEndX;iPartX++,iBufX++){
1322  size_t bufIndex = bufYZ + iBufX;
1323  gridCoordinates[bufIndex] = iPartX;
1324  gridCoordinates[bufIndex+numPointsBuffer] = iPartY;
1325  gridCoordinates[bufIndex+2*numPointsBuffer] = iPartZ;
1326  }
1327  }
1328  }
1329  pbsGrid.ExchangeCoordinates();
1330  // testHalo.PackMessageBuffers(xyzMessageId,0,3,&gridCoordinates[0]);
1331 
1332  // Send Test w/Recv Buffer check
1333  // testHalo.SendMessage(0,cartNeighbors,pbsGridComm);
1334  // testHalo.ReceiveMessage(0,cartNeighbors,pbsGridComm);
1335  // testHalo.UnPackMessageBuffers(0,0,3,&gridCoordinates[0]);
1336 
1337  if(myRank == 0){
1338  if(ix::sys::FILEEXISTS("pbsgridtest.h5"))
1339  ix::sys::Remove("pbsgridtest.h5");
1340  }
1341  testComm.Barrier();
1342 
1343  pcpp::io::hdf5::base gridFile("pbsgridtest.h5",pbsGridComm);
1344 
1345  gridFile.CreateGroup("/Global");
1346  gridFile.CreateGroup("/PlasCom2");
1347  gridFile.CreateGroup("/PlasCom2/Configuration");
1348  gridFile.CreateGroup("/PlasCom2/Geometry");
1349  gridFile.CreateGroup("/PlasCom2/Geometry/Grids");
1350 
1351  bool writeGridTest = true;
1352  std::vector<size_t> attSize2(1,1);
1353 
1354  int numGeometries = 1;
1355  std::string geometryNames("Grids");
1356  gridFile.CreateAttribute("/PlasCom2/Geometry/numGeometries",attSize2,&numGeometries);
1357  gridFile.CreateAttribute("/PlasCom2/Geometry/geometryNames",geometryNames);
1358 
1359  int numGrids = 1;
1360  gridFile.CreateAttribute("/PlasCom2/Geometry/Grids/numGrids",attSize2,&numGrids);
1361  std::string gridNames("pbsgrid");
1362  gridFile.CreateAttribute("/PlasCom2/Geometry/Grids/gridNames",gridNames);
1363  std::string expectedGridNames("Grids:pbsgrid");
1364 
1365  std::vector<double> expectedCoordinates(pbsGrid.CoordinateData());
1366 
1367  pcpp::io::hdf5::WriteGrid(pbsGrid,"pbsgrid","/PlasCom2/Geometry/Grids",gridFile);
1368 
1369  gridFile.Close();
1370 
1371  pcpp::io::simfileinfo simFileInfo;
1372  if(myRank == 0){
1373  if(pcpp::io::hdf5::FileInfo("pbsgridtest.h5",simFileInfo,messageStream)){
1374  std::cout << "pcpp::io::hdf5::FileInfo failed: " << messageStream.str()
1375  << std::endl;
1376  testComm.SetExit(1);
1377  }
1378  pcpp::report::SimFileInfo(std::cout,simFileInfo);
1379  }
1380  if(testComm.Check()){
1381  std::cout << "TestPBSGridIO:ERROR!! FileInfo failed. Skipping tests." << std::endl;
1382  return;
1383  }
1384  testComm.StreamBroadCast(simFileInfo);
1385 
1386  pcpp::IndexIntervalType expectedDimension;
1387  expectedDimension.InitSimple(gridSize);
1388  std::cout << "Input Grid Dimension: ";
1389  expectedDimension.PrettyPrint(std::cout);
1390  std::cout << std::endl;
1391 
1392 
1393  if(simFileInfo.numGrids != 1)
1394  writeGridTest = false;
1395  if(simFileInfo.gridNames[0] != expectedGridNames)
1396  writeGridTest = false;
1397  for(int iGrid = 0;iGrid < simFileInfo.numGrids;iGrid++){
1398  if(simFileInfo.gridNumDimensions[iGrid] != 3)
1399  writeGridTest = false;
1400  if(simFileInfo.gridSizes[iGrid] != gridSize)
1401  writeGridTest = false;
1402  }
1403 
1404  writeGridTest = CheckResult(writeGridTest,testComm);
1405  parallelUnitResults.UpdateResult("HDF5:Interface:WritePBSGrid",writeGridTest);
1406 
1407 
1408  bool readGridTest = true;
1409 
1410  // reset coordinate data to zero
1411  std::vector<double> &modifyCoordinateData(pbsGrid.CoordinateData());
1412  std::vector<double>::iterator cdIt = modifyCoordinateData.begin();
1413  while(cdIt != modifyCoordinateData.end())
1414  *cdIt++ = 0;
1415 
1416  // Re-open read-only
1417  gridFile.Open("pbsgridtest.h5",pbsGridComm,true);
1418  int returnCode = pcpp::io::hdf5::ReadGrid(pbsGrid,"/PlasCom2/Geometry/Grids/pbsgrid",gridFile);
1419  if(returnCode > 0){
1420  std::cout << "Grid Reading failed for pbsgrid(" << returnCode
1421  << ")." << std::endl;
1422  readGridTest = false;
1423  }
1424  gridFile.Close();
1425  pbsGrid.ExchangeCoordinates();
1426 
1427  // Send Test w/Recv Buffer check
1428  // testHalo.PackMessageBuffers(xyzMessageId,0,3,&gridCoordinates[0]);
1429  // testHalo.SendMessage(xyzMessageId,cartNeighbors,pbsGridComm);
1430  // testHalo.ReceiveMessage(xyzMessageId,cartNeighbors,pbsGridComm);
1431  // testHalo.UnPackMessageBuffers(xyzMessageId,0,3,&gridCoordinates[0]);
1432 
1433  // std::vector<double> &readCoordinates(euler3dGrid.CoordinateData());
1434  if(gridCoordinates != expectedCoordinates)
1435  readGridTest = false;
1436 
1437  readGridTest = CheckResult(readGridTest,testComm);
1438  parallelUnitResults.UpdateResult("HDF5:Interface:ReadPBSGrid",readGridTest);
1439 
1440  state_t simulationState;
1441  state_t testState;
1442  // This input state is just so that
1443  // the domain object can read the meta
1444  // data and sizes. The domain object
1445  // allocates its own version of this state.
1446  simulationState.AddField("meshScalar",'m',1,8,"unit2");
1447  simulationState.AddField("meshVector0",'m',3,8,"");
1448  simulationState.AddField("meshVector1",'m',3,8,"unit1");
1449  simulationState.AddField("nodeScalar",'n',1,8,"unit2");
1450  simulationState.AddField("nodeVector0",'n',3,8,"");
1451  simulationState.AddField("nodeVector1",'n',3,8,"unit1");
1452  simulationState.AddField("nodeFlag",'n',1,4,"");
1453  simulationState.AddField("simVector0",'s',10,8,"");
1454  simulationState.AddField("simVector1",'s',2,8,"unit1");
1455  simulationState.AddField("simScalar",'s',1,8,"unit2");
1456  simulationState.AddField("simBytes",'s',10,1,"bytes");
1457  simulationState.AddField("simInts",'s',5,4,"ints");
1458 
1459 
1460  // Specify which fields will advance in time
1461  simulationState.SetStateFields("nodeScalar nodeVector0 nodeVector1");
1462  size_t numBufferNodes = pbsGrid.BufferSize();
1463  simulationState.Create(numBufferNodes,0);
1464 
1465  std::vector<size_t> partitionSizes(pbsPartInterval.Sizes());
1466  std::vector<size_t> partitionStarts(pbsPartInterval.Starts());
1467  std::vector<size_t> partitionBufferStarts(localPartitionInterval.Starts());
1468 
1469  testState = simulationState;
1470 
1471 
1472  // === Set up the initial state ===
1473  size_t iNode = 1024;
1474  double meshScalar = 12.0;
1475  double simScalar = 15.0;
1476  std::vector<double> meshVector0(3,24.0);
1477  std::vector<double> meshVector1(3,1.0);
1478  std::vector<double> nodeScalar(numBufferNodes,0.0);
1479  std::vector<double> nodeVector0(3*numBufferNodes,0.0);
1480  std::vector<double> nodeVector1(3*numBufferNodes,0.0);
1481  std::vector<int> nodeFlag(numBufferNodes,0);
1482  std::vector<double> simVector0(10,10.0);
1483  std::vector<double> simVector1(2,1.0);
1484  std::vector<char> simBytes(10,'b');
1485  std::vector<int> simInts(5,13);
1486 
1487 
1488  for(size_t iZ = 0;iZ < partitionSizes[2];iZ++){
1489  size_t nodeZ = iZ + partitionStarts[2];
1490  size_t bufferZ = iZ + partitionBufferStarts[2];
1491  for(size_t iY = 0;iY < partitionSizes[1];iY++){
1492  size_t nodeY = iY + partitionStarts[1];
1493  size_t bufferY = iY + partitionBufferStarts[1];
1494  for(size_t iX = 0;iX < partitionSizes[0];iX++){
1495  size_t nodeX = iX + partitionStarts[0];
1496  size_t bufferX = iX + partitionBufferStarts[0];
1497  size_t bufferIndex = bufferZ*(bufferSizes[0]*bufferSizes[1]) +
1498  bufferY*bufferSizes[0] + bufferX;
1499  nodeScalar[bufferIndex] = 27.0;
1500  nodeVector0[bufferIndex] = 2.0;
1501  nodeVector0[bufferIndex+numPointsBuffer] = 4.0;
1502  nodeVector0[bufferIndex+2*numPointsBuffer] = 8.0;
1503  nodeVector1[bufferIndex] = (myRank+1);
1504  nodeVector1[bufferIndex+numPointsBuffer] = (myRank+1)*2.0;
1505  nodeVector1[bufferIndex+2*numPointsBuffer] = (myRank+1)*4.0;
1506  nodeFlag[bufferIndex] = myRank;
1507  }
1508  }
1509  }
1510  numComponents = 7;
1511 
1512  halo_t &testHalo(pbsGrid.Halo());
1513  int nodeDataMessageId = testHalo.CreateMessageBuffers(numComponents);
1514 
1515  testHalo.PackMessageBuffers(nodeDataMessageId,0,1,&nodeScalar[0]);
1516  testHalo.PackMessageBuffers(nodeDataMessageId,1,3,&nodeVector0[0]);
1517  testHalo.PackMessageBuffers(nodeDataMessageId,4,3,&nodeVector1[0]);
1518 
1519  testHalo.SendMessage(nodeDataMessageId,cartNeighbors,pbsGridComm);
1520  testHalo.ReceiveMessage(nodeDataMessageId,cartNeighbors,pbsGridComm);
1521  testHalo.UnPackMessageBuffers(nodeDataMessageId,0,1,&nodeScalar[0]);
1522  testHalo.UnPackMessageBuffers(nodeDataMessageId,1,3,&nodeVector0[0]);
1523  testHalo.UnPackMessageBuffers(nodeDataMessageId,4,3,&nodeVector1[0]);
1524 
1525  // testing data
1526  size_t tiNode = 0;
1527  double tmeshScalar = 0.0;
1528  double tsimScalar = 0.0;
1529  std::vector<double> tmeshVector0(3,0.0);
1530  std::vector<double> tmeshVector1(3,0.0);
1531  std::vector<double> tnodeScalar(numBufferNodes,0.0);
1532  std::vector<double> tnodeVector0(3*numBufferNodes,0.0);
1533  std::vector<double> tnodeVector1(3*numBufferNodes,0.0);
1534  std::vector<int> tnodeFlag(numBufferNodes,0);
1535  std::vector<double> tsimVector0(10,0);
1536  std::vector<double> tsimVector1(2,0);
1537  std::vector<char> tsimBytes(10,0);
1538  std::vector<int> tsimInts(5,0);
1539 
1540  // Link the domain's state storage with local storage
1541  simulationState.SetFieldBuffer("meshScalar",&meshScalar);
1542  simulationState.SetFieldBuffer("simScalar",&simScalar);
1543  simulationState.SetFieldBuffer("meshVector0",&meshVector0[0]);
1544  simulationState.SetFieldBuffer("meshVector1",&meshVector1[0]);
1545  simulationState.SetFieldBuffer("nodeScalar",&nodeScalar[0]);
1546  simulationState.SetFieldBuffer("nodeVector0",&nodeVector0[0]);
1547  simulationState.SetFieldBuffer("nodeVector1",&nodeVector1[0]);
1548  simulationState.SetFieldBuffer("nodeFlag",&nodeFlag[0]);
1549  simulationState.SetFieldBuffer("simVector0",&simVector0[0]);
1550  simulationState.SetFieldBuffer("simVector1",&simVector1[0]);
1551  simulationState.SetFieldBuffer("simInts",&simInts[0]);
1552  simulationState.SetFieldBuffer("simBytes",&simBytes[0]);
1553 
1554  testState.SetFieldBuffer("meshScalar",&tmeshScalar);
1555  testState.SetFieldBuffer("simScalar",&tsimScalar);
1556  testState.SetFieldBuffer("meshVector0",&tmeshVector0[0]);
1557  testState.SetFieldBuffer("meshVector1",&tmeshVector1[0]);
1558  testState.SetFieldBuffer("nodeScalar",&tnodeScalar[0]);
1559  testState.SetFieldBuffer("nodeVector0",&tnodeVector0[0]);
1560  testState.SetFieldBuffer("nodeVector1",&tnodeVector1[0]);
1561  testState.SetFieldBuffer("nodeFlag",&tnodeFlag[0]);
1562  testState.SetFieldBuffer("simVector0",&tsimVector0[0]);
1563  testState.SetFieldBuffer("simVector1",&tsimVector1[0]);
1564  testState.SetFieldBuffer("simInts",&tsimInts[0]);
1565  testState.SetFieldBuffer("simBytes",&tsimBytes[0]);
1566 
1567  std::ostringstream stateMetaDataStream;
1568  pcpp::field::metadataset &stateMetaData(simulationState.Meta());
1569  stateMetaData.WriteToStream(stateMetaDataStream);
1570  std::string stateMetaDataString(stateMetaDataStream.str());
1571 
1572  if(ix::sys::FILEEXISTS("statemetadata.h5"))
1573  ix::sys::Remove("statemetadata.h5");
1574  pcpp::io::hdf5::base metaFile("statemetadata.h5",pbsGridComm);
1575  if(!stateMetaDataString.empty())
1576  metaFile.CreateAttribute("StateMetaData",stateMetaDataString);
1577  metaFile.Close();
1578 
1579  state_t inputState;
1580  metaFile.Open("statemetadata.h5",pbsGridComm,true);
1581  std::string inputMetaDataString;
1582  metaFile.ReadAttribute("StateMetaData",inputMetaDataString);
1583  std::istringstream stateMetaDataInStream(inputMetaDataString);
1584  pcpp::field::metadataset &inputMetaData(inputState.Meta());
1585  inputMetaData.ReadFromStream(stateMetaDataInStream);
1586  metaFile.Close();
1587 
1588  bool metaDataIO = true;
1589  std::ostringstream inputMetaDataOutStream;
1590  inputMetaData.WriteToStream(inputMetaDataOutStream);
1591  std::string inputMetaString(inputMetaDataOutStream.str());
1592  if(inputMetaData != stateMetaData){
1593  std::cout << "MetaData: " << inputMetaString << std::endl;
1594  metaDataIO = false;
1595  }
1596  metaDataIO = CheckResult(metaDataIO,testComm);
1597  parallelUnitResults.UpdateResult("HDF5:Interface:StateMetaDataIO",metaDataIO);
1598 
1599  if(ix::sys::FILEEXISTS("statedata.h5"))
1600  ix::sys::Remove("statedata.h5");
1601  pcpp::io::hdf5::base stateFile("statedata.h5",pbsGridComm);
1602  stateFile.CreateGroup("/StateData");
1603  stateFile.CreateGroup("/MeshData");
1604  pcpp::io::hdf5::WriteStateAttributes(simulationState,'s',"/StateData",stateFile);
1605  pcpp::io::hdf5::WriteStateAttributes(simulationState,'m',"/MeshData",stateFile);
1606  stateFile.Close();
1607 
1608  stateFile.Open("statedata.h5",pbsGridComm);
1609  pcpp::io::hdf5::ReadStateAttributes(testState,'s',"/StateData",stateFile);
1610  pcpp::io::hdf5::ReadStateAttributes(testState,'m',"/MeshData",stateFile);
1611  stateFile.Close();
1612 
1613  bool stateAttributeIO = true;
1614  if(tsimVector0 != simVector0)
1615  stateAttributeIO = false;
1616  if(tsimVector1 != simVector1)
1617  stateAttributeIO = false;
1618  if(tsimScalar != simScalar)
1619  stateAttributeIO = false;
1620  if(tsimBytes != simBytes)
1621  stateAttributeIO = false;
1622  if(tsimInts != simInts)
1623  stateAttributeIO = false;
1624  if(tmeshScalar != meshScalar)
1625  stateAttributeIO = false;
1626  if(tmeshVector0 != meshVector0)
1627  stateAttributeIO = false;
1628  if(tmeshVector1 != meshVector1)
1629  stateAttributeIO = false;
1630 
1631  stateAttributeIO = CheckResult(stateAttributeIO,testComm);
1632  parallelUnitResults.UpdateResult("HDF5:Interface:StateAttributeIO",stateAttributeIO);
1633 
1634 
1635  if(ix::sys::FILEEXISTS("statenodedata.h5"))
1636  ix::sys::Remove("statenodedata.h5");
1637  pcpp::io::hdf5::base nodeFile("statenodedata.h5",pbsGridComm);
1638  nodeFile.CreateGroup("/MeshData");
1639 
1640  pcpp::io::hdf5::WriteStateNodeData(simulationState,gridSize,partitionSizes,partitionStarts,
1641  bufferSizes,partitionBufferStarts,"/MeshData",nodeFile);
1642  nodeFile.Close();
1643 
1644 
1645  nodeFile.Open("statenodedata.h5",pbsGridComm);
1646  pcpp::io::hdf5::ReadStateNodeData(testState,gridSize,partitionSizes,partitionStarts,
1647  bufferSizes,partitionBufferStarts,"/MeshData",nodeFile);
1648  nodeFile.Close();
1649 
1650  testHalo.PackMessageBuffers(nodeDataMessageId,0,1,&tnodeScalar[0]);
1651  testHalo.PackMessageBuffers(nodeDataMessageId,1,3,&tnodeVector0[0]);
1652  testHalo.PackMessageBuffers(nodeDataMessageId,4,3,&tnodeVector1[0]);
1653 
1654  testHalo.SendMessage(nodeDataMessageId,cartNeighbors,pbsGridComm);
1655  testHalo.ReceiveMessage(nodeDataMessageId,cartNeighbors,pbsGridComm);
1656  testHalo.UnPackMessageBuffers(nodeDataMessageId,0,1,&tnodeScalar[0]);
1657  testHalo.UnPackMessageBuffers(nodeDataMessageId,1,3,&tnodeVector0[0]);
1658  testHalo.UnPackMessageBuffers(nodeDataMessageId,4,3,&tnodeVector1[0]);
1659 
1660  bool stateNodeDataIO = true;
1661  if(tnodeScalar != nodeScalar)
1662  stateNodeDataIO = false;
1663  if(tnodeVector0 != nodeVector0)
1664  stateNodeDataIO = false;
1665  if(tnodeVector1 != nodeVector1)
1666  stateNodeDataIO = false;
1667  if(tnodeFlag != nodeFlag)
1668  stateNodeDataIO = false;
1669 
1670 
1671  stateNodeDataIO = CheckResult(stateNodeDataIO,testComm);
1672  parallelUnitResults.UpdateResult("HDF5:Interface:StateNodeDataIO",stateNodeDataIO);
1673 
1674  if(myRank == 0){
1675  if(ix::sys::FILEEXISTS("pbsgridtest.h5"))
1676  ix::sys::Remove("pbsgridtest.h5");
1677  if(ix::sys::FILEEXISTS("statenodedata.h5"))
1678  ix::sys::Remove("statenodedata.h5");
1679  }
1680  myGlobal.Finalize();
1681 }
1682 
1684 {
1685 
1686  std::ostringstream messageStream;
1687  bool pc2OutputTest = true;
1688 
1695  typedef fixtures::ConfigurationType config_t;
1696 
1699 
1700  config_t testConfig;
1701  config_t domainConfig;
1702  config_t geomConfig;
1703 
1704  global_t myGlobal;
1705 
1706  myGlobal.Init("TestPC2Output",testComm);
1707  myGlobal.SetVerbLevel(3);
1708  myGlobal.Profiling(true);
1709 
1710  int numProc = testComm.Size();
1711  int myRank = testComm.Rank();
1712 
1713 
1714  std::ostringstream configMessageStream;
1715  if(pcpp::util::ProcessConfigurationFile("Config/Examples/misc/plascom2.test.config",testConfig,testComm,configMessageStream)){
1716  pc2OutputTest = false;
1717  }
1718  pc2OutputTest = CheckResult(pc2OutputTest,testComm);
1719  if(!pc2OutputTest){
1720  std::cout << "TestPlasCom2Output:ERROR!! ProcessConfigurationFile failed. Skipping tests."
1721  << std::endl;
1722  parallelUnitResults.UpdateResult("HDF5:Output",pc2OutputTest);
1723  if(myRank == 0){
1724  std::cout << "Failed processing Config/Examples/misc/plascom2.test.config: "
1725  << std::endl
1726  << configMessageStream.str() << std::endl << "Skipping remaining tests." << std::endl;
1727  }
1728  return;
1729  }
1730  // for(int iRank = 0;iRank < numProc;iRank++){
1731  // if(iRank == myRank){
1732  // std::cout << " ======= Rank " << myRank << " =========" << std::endl
1733  // << configMessageStream.str() << std::endl;
1734  // }
1735  // testComm.Barrier();
1736  // }
1737 
1738  std::vector<std::string> domainNames = testConfig.GetValueVector<std::string>("Domain:Names");
1739  std::vector<std::string> geometryNames = testConfig.GetValueVector<std::string>("Geometry:Names");
1740 
1741  int numDomains = domainNames.size();
1742  int numGeometries = geometryNames.size();
1743 
1744  for(int iDomain = 0;iDomain < numDomains;iDomain++){
1745  std::string &domainName(domainNames[iDomain]);
1746  domainConfig = pcpp::util::GetSubConfig(domainName,testConfig);
1747  if(myRank == 0){
1748  std::cout << "SubConfig(" << domainName << "):" << std::endl;
1749  std::cout << domainConfig << std::endl;
1750  }
1751  }
1752  int numDomainGrids = 1;
1753 
1754  std::string domainName(domainNames[0]);
1755  std::string domainGridName(domainConfig.GetValue<std::string>("GridNames"));
1756 
1757  for(int iGeom = 0;iGeom < numGeometries;iGeom++){
1758  std::string &geometryName(geometryNames[iGeom]);
1759  geomConfig = pcpp::util::GetSubConfig(geometryName,testConfig);
1760  if(myRank == 0){
1761  std::cout << "SubConfig(" << geometryName << "):" << std::endl;
1762  std::cout << geomConfig << std::endl;
1763  }
1764  }
1765  if(geometryNames.empty()){
1766  geometryNames.push_back("test-geometry");
1767  }
1768  std::string geometryName(geometryNames[0]);
1769  std::vector<std::string> gridNames = geomConfig.GetValueVector<std::string>("GridNames");
1770  if(gridNames.empty()){
1771  pc2OutputTest = false;
1772  }
1773  pc2OutputTest = CheckResult(pc2OutputTest,testComm);
1774  if(!pc2OutputTest){
1775  std::cout << "TestPlasCom2Output:ERROR!! Get gridnames fails. Skipping tests."
1776  << std::endl;
1777  parallelUnitResults.UpdateResult("HDF5:Output",pc2OutputTest);
1778  if(myRank == 0)
1779  std::cout << "Failed reading grid names, exiting" << std::endl;
1780  return;
1781  }
1782 
1783  std::string gridName(gridNames[0]);
1784  config_t gridConfig(pcpp::util::GetSubConfig(gridName,geomConfig));
1785 
1786  int numDim = gridConfig.GetValue<double>("Dimension");
1787  std::vector<double> physicalExtent(gridConfig.GetValueVector<double>("PhysicalExtent"));
1788  if(myRank == 0) {
1789  std::cout << "Grid Physical Extent:(";
1790  pcpp::io::DumpContents(std::cout,physicalExtent,",");
1791  std::cout << ")" << std::endl;
1792  }
1793 
1794  std::vector<size_t> gridSizes(gridConfig.GetValueVector<size_t>("NumPoints"));
1795 
1796  // std::vector<double> dX(numDim,0);
1797  // size_t numGlobalNodes = 1;
1798  // size_t numGlobalCells = 1;
1799  // for(int iDim = 0;iDim < numDim;iDim++){
1800  // dX[iDim] = (physicalExtent[iDim*2+1] - physicalExtent[iDim*2])/static_cast<double>(gridSizes[iDim] - 1);
1801  // numGlobalNodes *= gridSizes[iDim];
1802  // numGlobalCells *= (gridSizes[iDim]-1);
1803  // }
1804 
1805  grid_t testGrid;
1806  testGrid.SetGridSizes(gridSizes);
1808 
1809  int operatorOrder = domainConfig.GetValue<int>("SpatialOrder");
1810  operator_t sbpOperator;
1811  plascom2::operators::sbp::Initialize(sbpOperator,operatorOrder);
1812  int boundaryDepth = (sbpOperator.numStencils-1)/2;
1813  std::vector<int> haloDepths(2*numDim,boundaryDepth);
1814 
1815 
1816  // Set up parallel Cartesian topology
1818  cartInfo.numDimensions = numDim;
1819  cartInfo.isPeriodic = domainConfig.GetValueVector<int>("PeriodicDirs");
1820  testGrid.ParallelSetup(testComm,cartInfo,boundaryDepth,messageStream);
1821 
1822  comm_t &gridComm(testGrid.Communicator());
1823 
1824  // Grab the local coordinates and global dimension of the Cartesian topo
1825  std::vector<int> &cartCoords(gridComm.CartCoordinates());
1826  std::vector<int> &cartDims(gridComm.CartDimensions());
1827 
1828  // Grab the +/- neighbors in each Cartesian direction
1829  std::vector<int> cartNeighbors;
1830  gridComm.CartNeighbors(cartNeighbors);
1831 
1832  // Generate a report of the Cartesian setup and put it to stdout
1833  pcpp::report::CartesianSetup(messageStream,cartInfo);
1834  myGlobal.StdOut(messageStream.str(),2);
1835  pcpp::io::RenewStream(messageStream);
1836 
1837  interval_t globalInterval;
1838  globalInterval.InitSimple(gridSizes);
1839 
1840  interval_t &partInterval(testGrid.PartitionInterval());
1841 
1842  std::ostringstream gridStream;
1843  testGrid.GenerateCoordinates(gridStream);
1844 
1845 
1846  const std::vector<size_t> &bufferSizes(testGrid.BufferSizes());
1847  const pcpp::IndexIntervalType &partitionBufferInterval(testGrid.PartitionBufferInterval());
1848 
1849  size_t numPointsBuffer = testGrid.BufferSize();
1850 
1851  // Set up the HALO data structure
1852  halo_t &testHalo(testGrid.Halo());
1853 
1854 
1855  const std::vector<pcpp::IndexIntervalType> &remoteHaloBufferExtents(testHalo.RemoteHaloBufferExtents());
1856  const std::vector<pcpp::IndexIntervalType> &localHaloBufferExtents(testHalo.LocalHaloBufferExtents());
1857 
1859  bufferInterval.InitSimple(bufferSizes);
1860 
1861 // const std::vector<std::vector<size_t> > &recvIndices(testHalo.RecvIndices());
1862 
1863  // Create simple message buffers - assuming the grid coordinates will
1864  // be used to test
1865  // int numComponents = numDim+2;
1866  // int xyzMessageId = testHalo.CreateMessageBuffers(numComponents);
1867 
1868  // testGrid.AllocateCoordinateData();
1869  std::vector<double> &gridCoordinates(testGrid.CoordinateData());
1870  std::vector<double> &dX(testGrid.DX());
1871 
1872 
1873  state_t simState;
1874  state_t paramState;
1875 
1876  if(testfixtures::euler::SetupEulerState(testGrid,simState,paramState,0)){
1877  pc2OutputTest = false;
1878  }
1879  pc2OutputTest = CheckResult(pc2OutputTest,testComm);
1880  if(!pc2OutputTest){
1881  std::cout << "TestPlasCom2Output:ERROR!! SetupEulerState failed. Skipping tests."
1882  << std::endl;
1883  parallelUnitResults.UpdateResult("HDF5:Output",pc2OutputTest);
1884  if(myRank == 0)
1885  std::cout << "Failed Euler state setup, exiting" << std::endl;
1886  return;
1887  }
1888 
1889  double t = 0.0;
1890  double gamma = 1.4;
1891  double dt = .001;
1892  double cfl = 1.0;
1893  double Re = 0.0;
1894  int flags = 1;
1895 
1896  // Add some fields that are not usual
1897  paramState.AddField("dX",'s',3,8,"space");
1898  paramState.Create(numPointsBuffer,0);
1899 
1900  paramState.SetFieldBuffer("gamma",&gamma);
1901  paramState.SetFieldBuffer("inputDT",&dt);
1902  paramState.SetFieldBuffer("inputCFL",&cfl);
1903  paramState.SetFieldBuffer("Flags",&flags);
1904  paramState.SetFieldBuffer("refRe",&Re);
1905  paramState.SetFieldBuffer("dX",&dX[0]);
1906 
1907  std::vector<double> rho(numPointsBuffer,1.0);
1908  std::vector<double> rhoV(3*numPointsBuffer,0.0);
1909  std::vector<double> rhoE(3*numPointsBuffer,1.0/(gamma-1.0));
1910 
1911  std::vector<double> dRho(numPointsBuffer,1.0);
1912  std::vector<double> dRhoV(3*numPointsBuffer,0.0);
1913  std::vector<double> dRhoE(3*numPointsBuffer,1.0/(gamma-1.0));
1914 
1915  std::vector<double> T(numPointsBuffer,0.0);
1916  std::vector<double> p(numPointsBuffer,0.0);
1917  std::vector<double> V(3*numPointsBuffer,0.0);
1918 
1919  std::vector<double> rhom1(numPointsBuffer,0.0);
1920 
1921 
1922  simState.SetFieldBuffer("simTime",&t);
1923  simState.SetFieldBuffer("rho",&rho[0]);
1924  simState.SetFieldBuffer("rhoV",&rhoV[0]);
1925  simState.SetFieldBuffer("rhoE",&rhoE[0]);
1926 
1927  simState.SetFieldBuffer("pressure",&p[0]);
1928  simState.SetFieldBuffer("temperature",&T[0]);
1929  simState.SetFieldBuffer("velocity",&V[0]);
1930  simState.SetFieldBuffer("rhom1",&rhom1[0]);
1931 
1932  state_t rhsState(simState);
1933 
1934  rhsState.SetFieldBuffer("rho",&dRho[0]);
1935  rhsState.SetFieldBuffer("rhoV",&dRhoV[0]);
1936  rhsState.SetFieldBuffer("rhoE",&dRhoE[0]);
1937 
1938  // set up the domain - don't care about this in testing
1939  // domain_t eulerDomain;
1940  // eulerDomain.numGrids = 1;
1941  // eulerDomain.Grids().resize(1,&simGrid);
1942  // eulerDomain.States().resize(1,&simState);
1943 
1944  // -- Set up the RHS --
1945  rhs_t eulerRHS;
1946 
1947  if(eulerRHS.Initialize(testGrid,simState,paramState,sbpOperator)){
1948  pc2OutputTest = false;
1949  }
1950 
1951  pc2OutputTest = CheckResult(pc2OutputTest,testComm);
1952  if(!pc2OutputTest){
1953  std::cout << "TestPlasCom2Output:ERROR!! Failed EulerRHS::Initialize failed. Skipping tests."
1954  << std::endl;
1955  parallelUnitResults.UpdateResult("HDF5:Output",pc2OutputTest);
1956  if(myRank == 0)
1957  std::cout << "Failed Euler initialization, exiting" << std::endl;
1958  return;
1959  }
1960  if(eulerRHS.SetupRHS(testGrid,simState,rhsState)){
1961  pc2OutputTest = false;
1962  }
1963  pc2OutputTest = CheckResult(pc2OutputTest,testComm);
1964  if(!pc2OutputTest){
1965  std::cout << "TestPlasCom2Output:ERROR!! Failed EulerRHS::SetupRHS failed. Skipping tests."
1966  << std::endl;
1967  parallelUnitResults.UpdateResult("HDF5:Output",pc2OutputTest);
1968  if(myRank == 0)
1969  std::cout << "Failed Euler RHS setup, exiting" << std::endl;
1970  return;
1971  }
1972  std::cout << "TestPlasCom2Output: Getting Euler RHS" << std::endl;
1973  if(eulerRHS.RHS(0)){
1974  pc2OutputTest = false;
1975  }
1976  std::cout << "TestPlasCom2Output: Euler RHS returned." << std::endl;
1977  pc2OutputTest = CheckResult(pc2OutputTest,testComm);
1978  if(!pc2OutputTest){
1979  std::cout << "TestPlasCom2Output:ERROR!! Failed EulerRHS::RHS failed. Skipping tests."
1980  << std::endl;
1981  parallelUnitResults.UpdateResult("HDF5:Output",pc2OutputTest);
1982  if(myRank == 0)
1983  std::cout << "Failed Euler RHS setup 2, exiting" << std::endl;
1984  return;
1985  }
1986 
1987  // Begin PlasCom2 output
1988  if(myRank == 0){
1989  if(ix::sys::FILEEXISTS("plascom2_output.h5"))
1990  ix::sys::Remove("plascom2_output.h5");
1991  }
1992  testComm.Barrier();
1993 
1994  pcpp::io::hdf5::base pc2File("plascom2_output.h5",gridComm);
1995  pc2File.CreateGroup("/PlasCom2");
1996 
1997  pc2File.CreateGroup("/PlasCom2/Configuration");
1998  std::ostringstream configStream;
1999  configStream << testConfig;
2000  std::string configString(configStream.str());
2001 
2002  if(!configString.empty()){
2003  // if(testComm.Rank() == 0){
2004  // std::cout << "writing config string: ((((" << std::endl
2005  // << configString << std::endl << "))))" << std::endl;
2006  // std::cout << "COnfig size: " << configString.size() << std::endl;
2007  // }
2008  pc2File.CreateAttribute("/PlasCom2/Configuration/Parameters",configString);
2009  }
2010 
2011  pc2File.CreateGroup("/PlasCom2/Geometry");
2012  std::vector<size_t> attSize(1,1);
2013  pc2File.CreateAttribute("/PlasCom2/Geometry/numGeometries",attSize,&numGeometries);
2014  pc2File.CreateAttribute("/PlasCom2/Geometry/geometryNames",geometryName);
2015  std::string geomGroupName(std::string("/PlasCom2/Geometry/")+geometryName);
2016  pc2File.CreateGroup(geomGroupName);
2017  int numGrids = 1;
2018  pc2File.CreateAttribute(geomGroupName+"/numGrids",attSize,&numGrids);
2019  pc2File.CreateAttribute(geomGroupName+"/gridNames",gridName);
2020  std::vector<double> expectedCoordinates(testGrid.CoordinateData());
2021  pcpp::io::hdf5::WriteGrid(testGrid,gridName,geomGroupName,pc2File);
2022 
2023  pc2File.CreateGroup("/PlasCom2/Simulation");
2024  pc2File.CreateAttribute("/PlasCom2/Simulation/numDomains",attSize,&numDomains);
2025  pc2File.CreateAttribute("/PlasCom2/Simulation/domainNames",domainName);
2026  pcpp::io::hdf5::WriteStateAttributes(simState,'s',"/PlasCom2/Simulation",pc2File);
2027  pcpp::io::hdf5::WriteStateAttributes(paramState,'s',"/PlasCom2/Simulation",pc2File);
2028  std::string domainGroupName(std::string("/PlasCom2/Simulation/")+domainName);
2029  pc2File.CreateGroup(domainGroupName);
2030  pc2File.CreateGroup(domainGroupName+"/Configuration");
2031  std::ostringstream domainConfigStream;
2032  domainConfigStream << domainConfig;
2033  std::string domainConfigString(domainConfigStream.str());
2034  if(!domainConfigString.empty())
2035  pc2File.CreateAttribute(domainGroupName+"/Configuration/Parameters",domainConfigString);
2036  pc2File.CreateAttribute(domainGroupName+"/numGrids",attSize,&numDomainGrids);
2037  pc2File.CreateAttribute(domainGroupName+"/gridNames",domainGridName);
2038  pcpp::io::hdf5::WriteStateAttributes(simState,'d',domainGroupName,pc2File);
2039  pcpp::io::hdf5::WriteStateAttributes(paramState,'d',domainGroupName,pc2File);
2040  std::string gridGroupName(domainGroupName+"/"+domainGridName);
2041  pc2File.CreateGroup(gridGroupName);
2042  std::vector<size_t> partitionSizes(partInterval.Sizes());
2043  std::vector<size_t> partitionStarts(partInterval.Starts());
2044  std::vector<size_t> partitionBufferStarts(partitionBufferInterval.Starts());
2045  pcpp::io::hdf5::WriteStateNodeData(simState,gridSizes,partitionSizes,partitionStarts,
2046  bufferSizes,partitionBufferStarts,gridGroupName,pc2File);
2047  pc2File.Close();
2048 
2049 
2050 
2051  pc2OutputTest = CheckResult(pc2OutputTest,testComm);
2052  if(!pc2OutputTest){
2053  if(myRank == 0)
2054  std::cout << "Failed PlasCom2 output, exiting" << std::endl;
2055  }
2056  parallelUnitResults.UpdateResult("HDF5:Output",pc2OutputTest);
2057 
2058  if(myRank == 0){
2059  if(ix::sys::FILEEXISTS("plascom2_output.h5"))
2060  ix::sys::Remove("plascom2_output.h5");
2061  }
2062 
2063  return;
2064 }
2065 
2066 void TestPlasCom2Input(ix::test::results &parallelUnitResults,pcpp::CommunicatorType &testComm)
2067 {
2068 
2075  typedef fixtures::ConfigurationType config_t;
2078 
2079  std::string functionName("TestPlasCom2Input");
2080 
2081  global_t myGlobal;
2082  myGlobal.Init(functionName,testComm);
2083  myGlobal.SetVerbLevel(3);
2084  myGlobal.Profiling(true);
2085 
2086  int myRank = testComm.Rank();
2087 
2088  myGlobal.StdOut(std::string("TestFunction: ")+functionName+std::string("\n"));
2089 
2090  std::string originalDirectory(ix::sys::CWD());
2091 
2092  ix::sys::ChDir("InviscidTests/AcousticPulseFarfield2D/PlasCom2/");
2093 
2094  testComm.Barrier();
2095 
2096  bool processConfigurationRestart = true;
2097 
2098  std::ostringstream messageStream;
2099  std::string configFileName("curvilinear.config");
2100  pcpp::ConfigType referenceConfig;
2101 
2102  if(ProcessConfigurationFile(configFileName,referenceConfig,testComm,messageStream)){
2103  myGlobal.StdOut(std::string("Failed to process reference configuration from curvilinear.config.\nMessages:")+
2104  messageStream.str()+std::string("\n"));
2105  processConfigurationRestart = false;
2106  }
2107 
2108  if(myRank == 0){
2109 
2110  if(ix::sys::FILEEXISTS("tmptest.h5"))
2111  ix::sys::Remove("tmptest.h5");
2112 
2113  pcpp::io::hdf5::base testFile("tmptest.h5");
2114  testFile.CreateGroup("/PlasCom2");
2115  testFile.CreateGroup("/PlasCom2/Geometry");
2116  testFile.CreateGroup("/PlasCom2/Domains");
2117  testFile.CreateGroup("/PlasCom2/Geometry/Grids");
2118  testFile.CreateGroup("/PlasCom2/Configuration");
2119  std::ostringstream configStream;
2120  configStream << referenceConfig;
2121  std::string configString(configStream.str());
2122  if(!configString.empty())
2123  testFile.CreateAttribute("/PlasCom2/Configuration/Parameters",configString);
2124  testFile.Close();
2125  }
2126 
2127  testComm.Barrier();
2128 
2129  pcpp::ConfigType pc2Config;
2130  std::string testingFileName("tmptest.h5");
2131  if(!ix::sys::FILEEXISTS(testingFileName)){
2132  myGlobal.StdOut(std::string("Could not find testing file (")+testingFileName+
2133  std::string(").\n"));
2134  processConfigurationRestart = false;
2135  }
2136  if(pcpp::util::ProcessConfigurationRestart(testingFileName,pc2Config,testComm,messageStream)){
2137  myGlobal.StdOut(std::string("Failed to process restart file (")+testingFileName+
2138  std::string(").\nMessages:\n")+messageStream.str()+std::string("\n"));
2139  processConfigurationRestart = false;
2140  }
2141  pcpp::io::RenewStream(messageStream);
2142 
2143  if(processConfigurationRestart){
2144  if(pc2Config != referenceConfig){
2145  myGlobal.StdOut("Configuration did not match reference configuration. Test failed.\n");
2146  processConfigurationRestart = false;
2147  std::ostringstream Ostr;
2148  Ostr << pc2Config << std::endl;
2149  myGlobal.StdOut(Ostr.str());
2150  }
2151  }
2152 
2153  parallelUnitResults.UpdateResult("HDF5:Restart:Configuration",processConfigurationRestart);
2154 
2155  testComm.Barrier();
2156 
2157  bool fileInfoStreamTest = true;
2158  pcpp::io::simfileinfo restartFileInfo;
2159  std::string restartFileName("accepted/PlasCom2_000001000.h5");
2160  int statusCode = 0;
2161 
2162  if(myRank == 0){
2163  std::ostringstream errStream;
2164  if(pcpp::io::hdf5::FileInfo(restartFileName,restartFileInfo,errStream)){
2165  messageStream << "ERROR: FileInfo failed for " << restartFileName
2166  << ".\nHDF5 messages:"
2167  << errStream.str() << std::endl;
2168  myGlobal.StdOut(messageStream.str());
2169  pcpp::io::RenewStream(messageStream);
2170  testComm.SetErr(1);
2171  } else {
2172  std::ostringstream infoOut;
2173  infoOut << "Original info for " << restartFileName << ": " << std::endl;
2174  pcpp::report::SimFileInfo(infoOut,restartFileInfo);
2175  infoOut << "RAW stream output for info:" << std::endl;
2176  std::ostringstream infoStream;
2177  infoStream << restartFileInfo;
2178  infoOut << infoStream.str() << std::endl
2179  << "------------------" << std::endl;
2180  myGlobal.StdOut(infoOut.str());
2181  std::istringstream infoInStream(infoStream.str());
2182  pcpp::io::simfileinfo testInfo;
2183  infoInStream >> testInfo;
2184  std::ostringstream testStream;
2185  testStream << testInfo;
2186  if(!(testInfo == restartFileInfo)){
2187  testComm.SetErr(1);
2188  myGlobal.StdOut("File info object failed stream tests.\n");
2189  } else {
2190  myGlobal.StdOut("RAW stream output for test:\n");
2191  myGlobal.StdOut(testStream.str()+std::string("\n"));
2192  myGlobal.StdOut("=========\n");
2193  }
2194  }
2195  }
2196 
2197  if(testComm.Check()){
2198  statusCode = 1;
2199  fileInfoStreamTest = false;
2200  testComm.SetErr(0);
2201  }
2202 
2203  parallelUnitResults.UpdateResult("HDF5:Restart:FileInfoStream",fileInfoStreamTest);
2204 
2205  bool fileInfoBroadcastTest = true;
2206  pcpp::io::simfileinfo myFileInfo;
2207 
2208  if(fileInfoStreamTest){
2209  if(!ix::sys::FILEEXISTS(restartFileName)){
2210  myGlobal.ErrOut(std::string("Could not find required restart file: ")+restartFileName+
2211  std::string("\n"));
2212 
2213  fileInfoBroadcastTest = false;
2214  } else {
2215  std::ostringstream errStream;
2216  testComm.StreamBroadCast(restartFileInfo);
2217 
2218  int errCode = pcpp::io::hdf5::FileInfo(restartFileName,myFileInfo,testComm,errStream);
2219 
2220  if(errCode > 0){
2221  std::cout << "FileInfo failed on rank " << myRank << std::endl;
2222  } else {
2223  if(!(restartFileInfo == myFileInfo)){
2224  std::cout << "My file info and broadcasted one do not match." << std::endl;
2225  testComm.SetErr(1);
2226  } else {
2227  std::cout << "info broadcast succeeded on rank " << myRank << std::endl;
2228  }
2229  if(testComm.Check())
2230  fileInfoBroadcastTest = false;
2231  }
2232  }
2233 
2234  if(!fileInfoBroadcastTest){
2235  std::string testResultString;
2236  if(myRank == 1){
2237  std::ostringstream infoOut;
2238  infoOut << "Original: " << std::endl;
2239  pcpp::report::SimFileInfo(infoOut,myFileInfo);
2240  infoOut << std::endl << "Broadcast version: " << std::endl;
2241  pcpp::report::SimFileInfo(infoOut,restartFileInfo);
2242  infoOut << std::endl;
2243  infoOut << "Original RAW stream output:" << std::endl
2244  << "--------" << std::endl
2245  << myFileInfo << std::endl
2246  << "+++++++" << std::endl
2247  << "BC RAW stream output: " << std::endl
2248  << "------" << std::endl
2249  << restartFileInfo << std::endl
2250  << "=======" << std::endl;
2251  testResultString = infoOut.str();
2252  }
2253  testComm.BroadCast(testResultString,1);
2254  myGlobal.StdOut(testResultString);
2255  }
2256  } else {
2257  myGlobal.StdOut("File info broadcast test is skipped due to earlier errors.\n");
2258  fileInfoBroadcastTest = false;
2259  }
2260 
2261  parallelUnitResults.UpdateResult("HDF5:Restart:FileInfoBroadCast",fileInfoBroadcastTest);
2262 
2263  testComm.Barrier();
2264 
2265  ix::sys::ChDir(originalDirectory);
2266 
2267  bool readLegacyBCDat = true;
2268  const std::string bcFileName("PlasComCM/inputs/legacy.bc.dat");
2269  std::vector<plascom2::util::legacybc> bcData;
2270  if(plascom2::util::ReadLegacyBCDat(bcFileName,bcData,testComm,messageStream)){
2271  messageStream << "Read of legacy bc data failed." << std::endl;
2272  myGlobal.StdOut(messageStream.str());
2273  pcpp::io::RenewStream(messageStream);
2274  readLegacyBCDat = false;
2275  }
2276 
2277  std::ostringstream expectedBCDat;
2278 
2279  expectedBCDat
2280  << "1 21 1 1 1 1 -1 1 -1" << std::endl
2281  << "1 22 -1 -1 -1 1 -1 1 -1" << std::endl
2282  << "1 24 2 1 -1 1 1 1 -1" << std::endl
2283  << "1 24 -2 1 -1 -1 -1 1 -1" << std::endl
2284  << "1 24 3 1 -1 1 -1 1 1" << std::endl
2285  << "1 24 -3 1 -1 1 -1 -1 -1" << std::endl
2286  << "2 21 1 1 1 1 -1 1 -1" << std::endl
2287  << "2 22 -1 -1 -1 1 -1 1 -1" << std::endl
2288  << "2 24 2 1 -1 1 1 1 -1" << std::endl
2289  << "2 24 -2 1 -1 -1 -1 1 -1" << std::endl
2290  << "2 24 3 1 -1 1 -1 1 1" << std::endl
2291  << "2 24 -3 1 -1 1 -1 -1 -1" << std::endl
2292  << "2 99 3 1 -1 1 -1 1 20" << std::endl
2293  << "2 99 -3 1 -1 1 -1 -20 -1" << std::endl;
2294 
2295  std::istringstream expectedBCStream(expectedBCDat.str());
2296  plascom2::util::legacybc myBcDat;
2297  std::vector<plascom2::util::legacybc> expectedBCData;
2298  while(expectedBCStream >> myBcDat)
2299  expectedBCData.push_back(myBcDat);
2300  if(bcData != expectedBCData)
2301  readLegacyBCDat = false;
2302 
2303  parallelUnitResults.UpdateResult("HDF5:Restart:ReadLegacyBCDat",readLegacyBCDat);
2304 
2305  ix::sys::ChDir("PlasComCM/examples/FlowPastCylinder");
2306 
2307  bool processLegacyConfigurationFile = true;
2308  std::string legacyConfigFileName("flowpastcylinder.inp");
2309  pcpp::ConfigType legacyConfig;
2310  if(pcpp::util::ProcessConfigurationFile(legacyConfigFileName,legacyConfig,testComm,messageStream)){
2311  myGlobal.StdOut(std::string("Failed to process legacy configuration from ")+
2312  legacyConfigFileName+std::string(".\nMessages:")+
2313  messageStream.str()+std::string("\n"));
2314  pcpp::io::RenewStream(messageStream);
2315  processLegacyConfigurationFile = false;
2316  }
2317  myGlobal.StdOut(messageStream.str());
2318  pcpp::io::RenewStream(messageStream);
2319  if(plascom2::util::ConvertLegacyConfiguration(legacyConfig,testComm,messageStream)){
2320  myGlobal.StdOut(std::string("Failed to convert legacy configuration from ")+
2321  legacyConfigFileName+std::string(".\nMessages:")+
2322  messageStream.str()+std::string("\n"));
2323  pcpp::io::RenewStream(messageStream);
2324  processLegacyConfigurationFile = false;
2325  }
2326  messageStream << legacyConfig << std::endl;
2327  myGlobal.StdOut(messageStream.str());
2328  pcpp::io::RenewStream(messageStream);
2329 
2330  parallelUnitResults.UpdateResult("HDF5:Restart:ProcessLegacyConfig",processLegacyConfigurationFile);
2331 
2332  ix::sys::ChDir(originalDirectory);
2333 
2334  bool fetchGridData = true;
2335  restartFileName.assign("HDF5Examples/example_pc2_singlegrid.h5");
2336  pcpp::ConfigType exampleConfig;
2337  if(pcpp::util::ProcessConfigurationRestart(restartFileName,exampleConfig,testComm,messageStream)){
2338  myGlobal.ErrOut(messageStream.str()+std::string("\n"));
2339  myGlobal.ErrOut(std::string("Processing configuration from restart file (")+
2340  restartFileName+std::string(") failed.\n"));
2341  testComm.SetErr(1);
2342  }
2343  if(testComm.Check())
2344  return;
2345 
2346  {
2347  bool parallelFileInfo = true;
2348  pcpp::io::simfileinfo singleGridFileInfo;
2349  if(pcpp::io::hdf5::FileInfo(restartFileName,singleGridFileInfo,testComm,messageStream))
2350  return;
2351 
2352  if(singleGridFileInfo.numGrids != 1)
2353  parallelFileInfo = false;
2354  const std::string &gridName(singleGridFileInfo.gridNames[0]);
2355  if(gridName != "box:grid3")
2356  parallelFileInfo = false;
2357  std::vector<size_t> expectedGridSizes(2,101);
2358  if(singleGridFileInfo.gridSizes[0] != expectedGridSizes)
2359  parallelFileInfo = false;
2360 
2361  parallelFileInfo = CheckResult(parallelFileInfo,testComm);
2362 
2363  parallelUnitResults.UpdateResult("HDF5:Restart:ParallelFileInfo",parallelFileInfo);
2364 
2365  grid_t testGrid;
2366  int haloDepth = 2;
2367  std::vector<size_t> gridSizes(exampleConfig.GetValueVector<size_t>("box:grid3:NumPoints"));
2368  int numDim = gridSizes.size();
2369 
2370  // Make a non-periodic cartesian grid & topology
2372  cartInfo.numDimensions = 2;
2373  cartInfo.isPeriodic.resize(numDim,0);
2374 
2375 
2376  // Set grid sizes
2377  size_t numGlobalNodes = 1;
2378  size_t numGlobalCells = 1;
2379  for(int iDim = 0;iDim < numDim;iDim++){
2380  numGlobalNodes *= gridSizes[iDim];
2381  numGlobalCells *= (gridSizes[iDim]-1);
2382  }
2383  testGrid.SetGridSizes(gridSizes);
2384 
2385  messageStream << "Setting up grid with sizes: (";
2386  pcpp::io::DumpContents(messageStream,gridSizes,",");
2387  messageStream << ")" << std::endl;
2388  myGlobal.StdOut(messageStream.str());
2389  pcpp::io::RenewStream(messageStream);
2390 
2391 
2392  // This call does everything to set up the grid and required halos
2393  messageStream << "====== Grid Parallel Setup ========= " << std::endl;
2394  if(testGrid.ParallelSetup(testComm,cartInfo,haloDepth,messageStream)){
2395  myGlobal.ErrOut("Grid::ParallelSetup failed with messages:\n");
2396  myGlobal.ErrOut(messageStream.str());
2397  pcpp::io::RenewStream(messageStream);
2398  // sectionResult = false;
2399  }
2400  messageStream << "==================================== " << std::endl;
2401 
2402  // Generate a report of the Cartesian grid and topo setup
2403  messageStream << "------- Grid & Topo Report --------- " << std::endl;
2404  pcpp::report::CartesianSetup(messageStream,cartInfo);
2405  messageStream << simulation::report::Grid(testGrid) << std::endl
2406  << "------------------------------------ " << std::endl;
2407  myGlobal.StdOut(messageStream.str());
2408  pcpp::io::RenewStream(messageStream);
2409 
2410 
2411  if(pcpp::io::hdf5::FetchGridData(testGrid,gridName,restartFileName,messageStream)){
2412  myGlobal.ErrOut(std::string("Fetch grid data failed:\n")+messageStream.str()+std::string("\n"));
2413  testComm.SetErr(1);
2414  } else {
2415  myGlobal.StdOut(std::string("Read grid data for (")+gridName+
2416  std::string(") from ")+restartFileName+std::string(".\n"),2);
2417  myGlobal.StdOut(messageStream.str(),2);
2418  pcpp::io::RenewStream(messageStream);
2419  }
2420  if(testComm.Check())
2421  fetchGridData = false;
2422 
2423  parallelUnitResults.UpdateResult("HDF5:Restart:FetchSingleGrid:PC2",fetchGridData);
2424  }
2425 
2426  {
2427 
2428  bool fetchMultipleGridData = true;
2429  restartFileName.assign("HDF5Examples/example_pc2_multiplegrids.h5");
2430  pcpp::ConfigType exampleConfig;
2431  if(pcpp::util::ProcessConfigurationRestart(restartFileName,exampleConfig,
2432  testComm,messageStream)){
2433  myGlobal.ErrOut(messageStream.str()+std::string("\n"));
2434  myGlobal.ErrOut(std::string("Processing configuration from restart file (")+
2435  restartFileName+std::string(") failed.\n"));
2436  testComm.SetErr(1);
2437  }
2438  if(testComm.Check())
2439  return;
2440 
2441  bool parallelFileInfo = true;
2442  pcpp::io::simfileinfo multipleGridFileInfo;
2443  if(pcpp::io::hdf5::FileInfo(restartFileName,multipleGridFileInfo,testComm,messageStream))
2444  return;
2445 
2446  int numGrids = multipleGridFileInfo.numGrids;
2447  if(numGrids != 2) {
2448  parallelFileInfo = false;
2449  } else {
2450  const std::vector<std::string> &gridNames(multipleGridFileInfo.gridNames);
2451  if(gridNames[0] != "box:grid3" ||
2452  gridNames[1] != "box:grid4")
2453  parallelFileInfo = false;
2454  }
2455 
2456  const std::vector<std::string> &gridNames(multipleGridFileInfo.gridNames);
2457  std::vector<size_t> expectedGridSizes(2,101);
2458 
2459  for(int iGrid = 0;iGrid < numGrids;iGrid++)
2460  if(multipleGridFileInfo.gridSizes[iGrid] != expectedGridSizes)
2461  parallelFileInfo = false;
2462 
2463  parallelFileInfo = CheckResult(parallelFileInfo,testComm);
2464 
2465  parallelUnitResults.UpdateResult("HDF5:Restart:MultipleGridFileInfo",parallelFileInfo);
2466 
2467  for(int iGrid = 0;iGrid < numGrids;iGrid++){
2468  grid_t testGrid;
2469  int haloDepth = 2;
2470  const std::string &gridName(gridNames[iGrid]);
2471  std::ostringstream Ostr;
2472  Ostr << gridName << ":NumPoints";
2473  std::vector<size_t> gridSizes(exampleConfig.GetValueVector<size_t>(Ostr.str()));
2474  int numDim = gridSizes.size();
2475 
2476  // Make a non-periodic cartesian grid & topology
2478  cartInfo.numDimensions = 2;
2479  cartInfo.isPeriodic.resize(numDim,0);
2480 
2481 
2482  // Set grid sizes
2483  size_t numGlobalNodes = 1;
2484  size_t numGlobalCells = 1;
2485  for(int iDim = 0;iDim < numDim;iDim++){
2486  numGlobalNodes *= gridSizes[iDim];
2487  numGlobalCells *= (gridSizes[iDim]-1);
2488  }
2489  testGrid.SetGridSizes(gridSizes);
2490 
2491  messageStream << "Setting up grid with sizes: (";
2492  pcpp::io::DumpContents(messageStream,gridSizes,",");
2493  messageStream << ")" << std::endl;
2494  myGlobal.StdOut(messageStream.str());
2495  pcpp::io::RenewStream(messageStream);
2496 
2497 
2498  // This call does everything to set up the grid and required halos
2499  messageStream << "====== Grid Parallel Setup ========= " << std::endl;
2500  if(testGrid.ParallelSetup(testComm,cartInfo,haloDepth,messageStream)){
2501  myGlobal.ErrOut("Grid::ParallelSetup failed with messages:\n");
2502  myGlobal.ErrOut(messageStream.str());
2503  pcpp::io::RenewStream(messageStream);
2504  // sectionResult = false;
2505  }
2506  messageStream << "==================================== " << std::endl;
2507 
2508  // Generate a report of the Cartesian grid and topo setup
2509  messageStream << "------- Grid & Topo Report --------- " << std::endl;
2510  pcpp::report::CartesianSetup(messageStream,cartInfo);
2511  messageStream << simulation::report::Grid(testGrid) << std::endl
2512  << "------------------------------------ " << std::endl;
2513  myGlobal.StdOut(messageStream.str());
2514  pcpp::io::RenewStream(messageStream);
2515 
2516 
2517  if(pcpp::io::hdf5::FetchGridData(testGrid,gridName,restartFileName,messageStream)){
2518  myGlobal.ErrOut(std::string("Fetch grid data failed:\n")+messageStream.str()+std::string("\n"));
2519  testComm.SetErr(1);
2520  } else {
2521  myGlobal.StdOut(std::string("Read grid data for (")+gridName+
2522  std::string(") from ")+restartFileName+std::string(".\n"),2);
2523  myGlobal.StdOut(messageStream.str(),2);
2524  pcpp::io::RenewStream(messageStream);
2525  }
2526  if(testComm.Check())
2527  fetchMultipleGridData = false;
2528  }
2529  parallelUnitResults.UpdateResult("HDF5:Restart:FetchMultipleGrids:PC2",fetchMultipleGridData);
2530 
2531  }
2532  ix::sys::ChDir(originalDirectory);
2533  return;
2534 };
2535 
std::vector< int > cartDecompDirections
Definition: PCPPCommUtil.H:22
simulation::state::base state_t
Definition: PlasCom2.H:17
void SimFileInfo(std::ostream &outStream, const pcpp::io::simfileinfo &simFileInfo)
Definition: PCPPReport.C:6
int Remove(const std::string &fname)
Definition: UnixUtils.C:141
virtual int ErrOut(const std::string &outstr)
Definition: Global.H:456
int ReadAttribute(const std::string &inName, int *inBuf)
Definition: PCPPHDF5.C:1029
int SetStateFields(const std::vector< int > &inFieldIndices)
Definition: State.H:310
const std::vector< size_t > & PartitionSizes() const
Definition: Grid.H:487
int CartNeighbors(std::vector< int > &neighborRanks)
Definition: COMM.C:173
int ReadLegacyBCDat(const std::string &bcFileName, std::vector< legacybc > &bcDat, fixtures::CommunicatorType &inCommunicator, std::ostream &messageStream)
Definition: PC2Util.C:411
std::vector< size_t > DataDimensions(const std::string &inName)
Definition: PCPPHDF5.C:1135
void const size_t const size_t const size_t const int const int const double const double const double * rhoVBuffer
Definition: EulerKernels.H:10
plascom2::operators::sbp::base operator_t
virtual bool Profiling()
Get profiling state.
Definition: Global.H:229
int ProcessConfigurationFile(const std::string &configFileName, pcpp::ConfigType &plascomConfig, pcpp::CommunicatorType &globalCommunicator, std::ostream &messageStream)
Populate a configuration object from file in parallel.
Definition: PCPPUtil.C:326
const std::vector< double > & DX() const
Definition: Grid.H:538
pcpp::IndexIntervalType & PartitionInterval()
Definition: Grid.H:500
int GenerateCoordinates(std::ostream &)
Definition: Grid.C:1628
void const size_t const size_t * gridSizes
Definition: EulerKernels.H:10
int FileInfo(const std::string &hdfFileName, pcpp::io::simfileinfo &fileInfo, std::ostream &messageStream)
Definition: PCPPHDF5.C:621
void RenewStream(std::ostringstream &outStream)
bool CheckResult(bool &localResult, pcpp::CommunicatorType &testComm)
Definition: PCPPCommUtil.C:176
int ChDir(const std::string &path)
Definition: UnixUtils.C:297
bool Exists(const std::string &linkName)
Definition: PCPPHDF5.C:872
void TestPlasCom2Input(ix::test::results &parallelUnitResults, pcpp::CommunicatorType &testComm)
Definition: TestHDF5.C:2066
int WriteStateAttributes(const StateType &inState, const char attributeLocation, const std::string &filePath, base &hdfFile)
Writes state data matching attributeLocation into HDF5 attributes at filePath.
Definition: PCPPHDF5.H:1411
void TestHDF5LegacyFileInfo(ix::test::results &parallelUnitResults, pcpp::CommunicatorType &testComm)
Definition: TestHDF5.C:18
pcpp::CommunicatorType comm_t
int SetErr(int errin)
Definition: COMM.H:110
void CartesianSetup(std::ostream &outStream, const std::vector< int > &cartCoords, const std::vector< int > &cartDims)
Definition: PCPPReport.C:199
virtual size_t Create(size_t number_of_nodes=0, size_t number_of_cells=0)
int ProcessConfigurationRestart(const std::string &restartFileName, pcpp::ConfigType &inConfig, pcpp::CommunicatorType &configCommunicator, std::ostream &messageStream)
Populate a configuration object from an HDF5 restart file.
Definition: PCPPUtil.C:396
int FetchGridData(GridType &inGrid, const std::string &gridName, const std::string &gridFileName, std::ostream &messageStream)
Definition: PCPPHDF5.H:1746
pcpp::IndexIntervalType interval_t
int SetupEulerState(const GridType &inGrid, StateType &inState, StateType &inParams, int numScalars, bool withFluxes=false)
void SetGridSizes(const std::vector< size_t > &inSize)
Definition: Grid.H:452
int Create(const std::string &inFileName, fixtures::CommunicatorType &inComm, bool force=false)
Definition: PCPPHDF5.H:261
pcpp::ParallelGlobalType global_t
Definition: TestHDF5.C:16
std::vector< int > gridNumDimensions
Definition: PCPPIO.H:51
virtual int Init(const std::string &name, CommunicatorType &incomm)
Definition: Global.H:578
std::bitset< NUMFORMATBITS > formatBits
Definition: PCPPIO.H:42
int WriteHyperSlab(const std::string &inName, const std::vector< size_t > &globalSize, const std::vector< size_t > &localStart, const std::vector< size_t > &localSize, std::vector< double > &inDataVec)
Definition: PCPPHDF5.C:1253
int WriteGrid(const GridType &inGrid, const std::string &gridName, const std::string &parentPath, base &hdfFile)
Definition: PCPPHDF5.H:1131
const std::vector< size_t > & BufferSizes() const
Definition: Grid.H:459
size_t NNodes() const
Definition: IndexUtil.H:254
void TestPCPPHDF5Write(ix::test::results &parallelUnitResults, pcpp::CommunicatorType &testComm)
Definition: TestHDF5.C:532
int OpenGroup(const std::string &groupName)
Definition: PCPPHDF5.C:831
Encapsulating class for collections of test results.
Definition: Testing.H:18
bool AttributeExists(const std::string &inName)
Definition: PCPPHDF5.C:852
simulation::domain::base< grid_t, state_t > domain_t
Definition: PlasCom2.H:19
metadataset & Meta()
void const size_t const size_t const size_t const int const int const double const double const double const double * rhoEBuffer
Definition: EulerKernels.H:10
std::vector< int > isPeriodic
Definition: PCPPCommUtil.H:24
std::vector< size_t > Starts() const
Definition: IndexUtil.H:199
void TestHDF5PBSGridIO(ix::test::results &parallelUnitResults, pcpp::CommunicatorType &testComm)
Definition: TestHDF5.C:1204
void Everyone(const std::string &outString, std::ostream &outStream, fixtures::CommunicatorType &comm)
Definition: PCPPIO.C:51
int ReadHyperSlab(hid_t dataID, hid_t dataSpace, hid_t hyperSlab, hid_t xferProperties, double *dataBuffer)
Definition: PCPPHDF5.H:432
pcpp::IndexIntervalType & PartitionBufferInterval()
Definition: Grid.H:519
const std::vector< size_t > & GridSizes() const
Definition: Grid.H:469
void const size_t const size_t const size_t const int const int const double const double const double const double const double const double * pressureBuffer
Definition: EulerKernels.H:10
int Check(comm::Ops op=comm::MAXOP)
Definition: COMM.C:355
void SetGridSpacings(const std::vector< double > &inSpacing)
Definition: Grid.H:540
virtual int StdOut(const std::string &outstr, unsigned char inlev=1)
Definition: Global.H:439
std::vector< std::vector< size_t > > gridSizes
Definition: PCPPIO.H:52
int CreateGroup(const std::string &inName)
Definition: PCPPHDF5.C:2353
bool FILEEXISTS(const std::string &fname)
Definition: UnixUtils.C:189
Main encapsulation of MPI.
Definition: COMM.H:62
int ReadStateAttributes(StateType &inState, const char attributeLocation, const std::string &filePath, base &hdfFile)
Reads state data matching attributeLocation into HDF5 attributes at filePath.
Definition: PCPPHDF5.H:1466
void TestHDF5HyperSlab(ix::test::results &parallelUnitResults, pcpp::CommunicatorType &testComm)
Definition: TestHDF5.C:683
std::string Grid(const GridType &inGrid)
Definition: Report.H:14
Testing constructs for unit testing.
void TestHDF5Read2DBlockStructuredGrid(ix::test::results &parallelUnitResults, pcpp::CommunicatorType &testComm)
Definition: TestHDF5.C:223
Encapsulation for a collection of operator stencils.
Definition: Stencil.H:26
std::vector< std::string > GetValueVector(const std::string &key) const
Definition: Parameters.C:36
int ConvertLegacyConfiguration(fixtures::ConfigurationType &inConfig, fixtures::CommunicatorType &inCommunicator, std::ostream &messageStream)
Definition: PC2Util.C:471
int PartitionCartesianExtent(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 DumpContents(std::ostream &Ostr, const ContainerType &c, std::string del="\)
Dump container contents.
Definition: AppTools.H:117
int ParallelSetup(fixtures::CommunicatorType &inComm, pcpp::ParallelTopologyInfoType &cartInfo, int haloDepth, std::ostream &messageStream)
Perform cartesian communicator initialization for a grid.
Definition: Grid.C:22
void WriteToStream(std::ostream &OutStr)
void const size_t const size_t * bufferSizes
Definition: MetricKernels.H:19
const std::string CWD()
Definition: UnixUtils.C:291
void TestPCPPHDF5Read(ix::test::results &parallelUnitResults, pcpp::CommunicatorType &testComm)
Definition: TestHDF5.C:322
int CreateDataSet(const std::string &inName, const std::vector< size_t > &spaceDimensions, size_t sizeInBytes=8)
Definition: PCPPHDF5.C:2380
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 * bufferInterval
void UpdateResult(const std::string &name, const ValueType &result)
Updates an existing test result.
Definition: Testing.H:55
const std::vector< double > & PhysicalExtent() const
Definition: Grid.H:533
std::vector< double > & CoordinateData()
Definition: Grid.H:503
void TestHDF5GridIO(ix::test::results &parallelUnitResults, pcpp::CommunicatorType &testComm)
Definition: TestHDF5.C:842
std::ostream & PrettyPrint(std::ostream &outStream) const
Definition: IndexUtil.C:6
int SetupCartesianTopology(pcpp::CommunicatorType &parallelCommunicator, pcpp::ParallelTopologyInfoType &topologyInfo, pcpp::CommunicatorType &topoCommunicator, std::ostream &messageStream)
Sets up a communicator with Cartesian topology.
Definition: PCPPCommUtil.C:48
int numStencils
The number of stencils (e.g. interior + boundary)
Definition: Stencil.H:93
int SetExit(int errin)
Definition: COMM.H:109
virtual int Finalize()
Finalizes the global object, and it&#39;s profiler object.
Definition: Global.H:622
std::vector< size_t > Sizes() const
Definition: IndexUtil.H:217
void SetVerbLevel(unsigned char l)
Definition: Global.H:393
simulation::grid::parallel_blockstructured pbsgrid_t
int ReadGrid(hid_t parentGroupID, const configuration &hdfConfig, const std::string &gridName, GridType &gridData, fixtures::CommunicatorType &inComm, std::ostream &messageStream)
Definition: PCPPHDF5.H:927
int Initialize(base &stencilSet, int interiorOrder)
Initialize the sbp::base stencilset with the SBP operator of given order.
Definition: Stencil.C:360
std::vector< size_t > AttributeDimensions(const std::string &inName)
Definition: PCPPHDF5.C:1170
void const size_t const size_t const size_t const int const int const double const double * rhoBuffer
Definition: EulerKernels.H:10
simulation::grid::halo halo_t
Definition: PlasCom2.H:18
pcpp::ConfigType GetSubConfig(const std::string &configName, const pcpp::ConfigType &plascomConfig)
Definition: PCPPUtil.C:90
Simple Block Structured Mesh object.
Definition: IndexUtil.H:21
void AddField(const std::string &name, char loc, unsigned int ncomp, unsigned int dsize, const std::string &unit)
fixtures::CommunicatorType & Communicator() const
Definition: Grid.H:350
void ReadFromStream(std::istream &InStr)
void size_t int * numComponents
simulation::grid::parallel_blockstructured grid_t
Definition: PlasCom2.H:16
int ReadStateNodeData(StateType &inState, const std::vector< size_t > &gridSizes, const std::vector< size_t > &partitionSizes, const std::vector< size_t > &partitionStarts, const std::vector< size_t > &bufferSizes, const std::vector< size_t > &partitionBufferStarts, const std::string &filePath, base &hdfFile, bool reverseRead=true)
Definition: PCPPHDF5.H:1629
std::vector< std::string > gridNames
Full grid names (geometryName:gridName)
Definition: PCPPIO.H:50
int Open(const std::string &inFileName, fixtures::CommunicatorType &inComm, bool readOnly=false)
Definition: PCPPHDF5.H:275
void SetFieldBuffer(const std::string &name, void *buf)
int StreamBroadCast(DataType &inData, int root_rank=0)
Definition: COMM.H:225
void TestPlasCom2Output(ix::test::results &parallelUnitResults, pcpp::CommunicatorType &testComm)
Definition: TestHDF5.C:1683
int Finalize(bool allocateCoordinateData=false)
Definition: Grid.C:2318
std::vector< int > & CartDimensions()
Definition: COMM.H:118
void InitSimple(const ContainerType &inSize)
Definition: IndexUtil.H:169
void const size_t * numPointsBuffer
Definition: MetricKernels.H:19
int CreateAttribute(const std::string &inName, const std::vector< size_t > &spaceDimensions, size_t sizeInBytes=8)
Definition: PCPPHDF5.C:2482
int BroadCast(std::string &sval, int root_rank=0)
Definition: COMM.C:437
std::vector< int > & CartCoordinates()
Definition: COMM.H:117
int WriteStateNodeData(const StateType &inState, const std::vector< size_t > &gridSizes, const std::vector< size_t > &partitionSizes, const std::vector< size_t > &partitionStarts, const std::vector< size_t > &bufferSizes, const std::vector< size_t > &partitionBufferStarts, const std::string &filePath, base &hdfFile)
Definition: PCPPHDF5.H:1516
int ReadDataSet(const std::string &inName, int *inBuf)
Definition: PCPPHDF5.C:965