PlasCom2  1.0
XPACC Multi-physics simluation application
PCPPIO.C
Go to the documentation of this file.
1 #include <string>
2 #include <map>
3 #include <vector>
4 #include <iomanip>
5 
6 #include "PCPPIO.H"
7 
8 namespace pcpp {
9 
10  namespace io {
11 
12 
13  bool Compatible(const pcpp::io::simfileinfo& fileInfo1,
14  const pcpp::io::simfileinfo& fileInfo2,
15  std::ostream& infoStream)
16  {
17 
18  if(fileInfo1.gridSizes != fileInfo2.gridSizes){
19  infoStream << "Grids in two files do not have the same size." << std::endl;
20  return(false);
21  }
22  if(fileInfo1.formatBits.test(pcpp::io::HASGRID) != fileInfo2.formatBits.test(pcpp::io::HASGRID))
23  infoStream << "Warning: grid presence is not consistent between files." << std::endl;
24  if(fileInfo1.formatBits.test(pcpp::io::HASSTATE) != fileInfo2.formatBits.test(pcpp::io::HASSTATE))
25  infoStream << "Warning: state presence is not consistent between files." << std::endl;
26 
27  return(true);
28  };
29 
30  std::string StepStamp(size_t inStep)
31  {
32  std::ostringstream Ostr;
33  Ostr << std::setfill('0') << std::setw(9) << inStep;
34  return(Ostr.str());
35  };
36 
37 // void Everybody(const std::string &outString,std::ostream &outStream,
38 // pcpp::CommunicatorType &comm){
39 
40 // int myRank = comm.Rank();
41 // int numProc = comm.Size();
42 
43 // for(int iRank = 0;iRank < numProc;iRank++){
44 // if(iRank == myRank){
45 // outStream << outString << std::endl;
46 // }
47 // comm.Barrier();
48 // }
49 // };
50 
51  void Everyone(const std::string &outString,std::ostream &outStream,
53 
54  int myRank = comm.Rank();
55  int numProc = comm.Size();
56 
57  for(int iRank = 0;iRank < numProc;iRank++){
58  if(iRank == myRank){
59  outStream << outString << std::endl;
60  }
61  comm.Barrier();
62  }
63  };
64 
66  std::vector<std::string> hdfFileExtensions;
67  hdfFileExtensions.push_back("h5");
68  hdfFileExtensions.push_back("hdf5");
69  hdfFileExtensions.push_back("he5");
70  hdfFileExtensions.push_back("hdf");
71  fileTypeExtensions["HDF"] = hdfFileExtensions;
72  };
73 
74  bool FileType(const std::string &inFileName,const std::string &fileType)
75  {
76  if(pcpp::io::fileTypeExtensions.empty()){
78  }
79  std::string::size_type lastDot = inFileName.find_last_of(".");
80  if(lastDot == std::string::npos)
81  return(false);
82  std::string fileExtension(inFileName.substr(lastDot+1));
83  std::vector<std::string> &fileTypeExtensions(pcpp::io::fileTypeExtensions[fileType]);
84  std::vector<std::string>::iterator extensionsIt = fileTypeExtensions.begin();
85  while(extensionsIt != fileTypeExtensions.end()){
86  if(fileExtension == *extensionsIt++)
87  return(true);
88  }
89  return(false);
90  };
91 
92 
93  bool operator==(const simfileinfo &lhs,const simfileinfo &rhs)
94  {
95 
96  if(lhs.numGrids != rhs.numGrids ||
97  lhs.numAuxVars != rhs.numAuxVars ||
98  lhs.numGeometries != rhs.numGeometries ||
99  lhs.numDomains != rhs.numDomains ||
100  lhs.simStep != rhs.simStep ||
101  lhs.fileName != rhs.fileName ||
102  lhs.formatBits != rhs.formatBits ||
103  lhs.gridNames != rhs.gridNames)
104  return(false);
105 
106  if(lhs.gridNumDimensions != rhs.gridNumDimensions)
107  return(false);
108 
109 
110  int numGrids = lhs.gridSizes.size();
111  if(rhs.gridSizes.size() != numGrids)
112  return(false);
113 
114  for(int iGrid = 0;iGrid < numGrids;iGrid++){
115  if(lhs.gridSizes[iGrid] != rhs.gridSizes[iGrid])
116  return(false);
117  }
118 
119  int numGeom = lhs.geometryNames.size();
120  if(rhs.geometryNames.size() != numGeom)
121  return(false);
122  if(lhs.geometryNames != rhs.geometryNames)
123  return(false);
124  for(int iGeom = 0;iGeom < numGeom;iGeom++){
125  int numGeomGrids = lhs.geometryGridNames[iGeom].size();
126  if(rhs.geometryGridNames[iGeom].size() != numGeomGrids)
127  return(false);
128  if(rhs.geometryGridNames[iGeom] != lhs.geometryGridNames[iGeom])
129  return(false);
130  const std::vector<std::vector<size_t> > &lgridSizes(lhs.geometryGridSizes[iGeom]);
131  const std::vector<std::vector<size_t> > &rgridSizes(rhs.geometryGridSizes[iGeom]);
132  if(lgridSizes.size() != rgridSizes.size())
133  return(false);
134  for(int iGeomGrid = 0;iGeomGrid < numGeomGrids;iGeomGrid++)
135  if(lgridSizes[iGeomGrid] != rgridSizes[iGeomGrid])
136  return(false);
137  }
138 
140  return(false);
142  return(false);
143 
144  int numDomains = lhs.domainNames.size();
145  if(rhs.domainNames.size() != numDomains)
146  return(false);
147  for(int iDomain = 0;iDomain < numDomains;iDomain++){
148  if(rhs.domainNames[iDomain] != lhs.domainNames[iDomain])
149  return(false);
150  if(rhs.domainParamDictionaries[iDomain] != lhs.domainParamDictionaries[iDomain])
151  return(false);
152  int numDomainGrids = lhs.domainGridNames[iDomain].size();
153  if(rhs.domainGridNames[iDomain].size() != numDomainGrids)
154  return(false);
155  for(int iGrid = 0;iGrid < numDomainGrids;iGrid++){
156  if(lhs.domainGridNames[iDomain][iGrid] != rhs.domainGridNames[iDomain][iGrid])
157  return(false);
158  }
159  }
160  return(true);
161  };
162 
163  std::istream &operator>>(std::istream &inStream,simfileinfo &fileInfo)
164  {
165  inStream >> fileInfo.fileName >> fileInfo.formatBits;
166 
167  if(fileInfo.fileName == "[NULL]")
168  fileInfo.fileName.erase();
169 
170  int numGrids = 0;
171  inStream >> numGrids;
172  fileInfo.numGrids = numGrids;
173 
174  int numGeometries = 0;
175  inStream >> numGeometries;
176  fileInfo.numGeometries = numGeometries;
177 
178  int numDomains = 0;
179  inStream >> numDomains;
180  fileInfo.numDomains = numDomains;
181 
182  if(numGrids <= 0)
183  return(inStream);
184 
185  int numAuxVars = 0;
186  inStream >> numAuxVars;
187  fileInfo.numAuxVars = numAuxVars;
188 
189  int simStep = 0;
190  inStream >> simStep;
191  fileInfo.simStep = simStep;
192 
193  double simTime = 0;
194  inStream >> simTime;
195  fileInfo.simTime = simTime;
196 
197  int numLegacyHeader = 0;
198  inStream >> numLegacyHeader;
199  fileInfo.legacyHeader.resize(numLegacyHeader);
200  for(int iLeg = 0;iLeg < numLegacyHeader;iLeg++)
201  inStream >> fileInfo.legacyHeader[iLeg];
202 
203  int paramDictSize = 0;
204  int stateDictSize = 0;
205 
206  inStream >> paramDictSize;
207  if(paramDictSize > 0){
208  inStream >> fileInfo.simulationParamDictionary;
209  }
210 
211  inStream >> stateDictSize;
212  if(stateDictSize > 0)
213  inStream >> fileInfo.simulationStateDictionary;
214 
215  std::vector<std::string> &gridNames(fileInfo.gridNames);
216  std::vector<int> &gridNumDimensions(fileInfo.gridNumDimensions);
217  std::vector<std::string> &geometryNames(fileInfo.geometryNames);
218  std::vector<std::vector<std::string> > &geometryGridNames(fileInfo.geometryGridNames);
219  std::vector<std::vector<std::vector<size_t> > > &geometryGridSizes(fileInfo.geometryGridSizes);
220 
221 
222  gridNames.resize(numGrids);
223  gridNumDimensions.resize(numGrids);
224  fileInfo.gridSizes.resize(0);
225 
226  for(int iGrid = 0;iGrid < numGrids;iGrid++){
227  int geomIndex = 0;
228  inStream >> gridNames[iGrid];
229  int numDim = 0;
230  inStream >> numDim;
231  gridNumDimensions[iGrid] = numDim;
232  std::vector<size_t> mySize;
233  if(numDim > 0){
234  mySize.resize(numDim,0);
235  for(int iDim = 0;iDim < numDim;iDim++){
236  inStream >> mySize[iDim];
237  }
238  fileInfo.gridSizes.push_back(mySize);
239  }
240 
241  std::string &gridName(gridNames[iGrid]);
242  if(gridName == "[NULL]"){
243  gridName.erase();
244  }
245  }
246 
247  if(geometryNames.size() != numGeometries)
248  geometryNames.resize(numGeometries);
249  if(geometryGridNames.size() != numGeometries)
250  geometryGridNames.resize(numGeometries);
251  if(geometryGridSizes.size() != numGeometries)
252  geometryGridSizes.resize(numGeometries);
253 
254  for(int iGeom = 0;iGeom < numGeometries;iGeom++){
255  inStream >> geometryNames[iGeom];
256  if(geometryNames[iGeom] == "[NULL]")
257  geometryNames[iGeom].erase();
258  int numGeomGrid = 0;
259  inStream >> numGeomGrid;
260  std::vector<std::string> &geomGridNames(geometryGridNames[iGeom]);
261  std::vector<std::vector<size_t> > &geomGridSizes(geometryGridSizes[iGeom]);
262  geomGridNames.resize(numGeomGrid);
263  geomGridSizes.resize(numGeomGrid);
264  for(int iGeomGrid = 0;iGeomGrid < numGeomGrid;iGeomGrid++){
265  int geomGridDimension = 0;
266  std::string geomGridName;
267  std::vector<size_t> &geomGridSize(geomGridSizes[iGeomGrid]);
268  inStream >> geomGridName >> geomGridDimension;
269  if(geomGridName != "[NULL]")
270  geomGridNames[iGeomGrid] = geomGridName;
271  for(int iDim = 0;iDim < geomGridDimension;iDim++){
272  int dimSize = 0;
273  inStream >> dimSize;
274  geomGridSize.push_back(dimSize);
275  }
276  }
277  }
278 
279  std::vector<std::string> &domainNames(fileInfo.domainNames);
280  numDomains = 0;
281  inStream >> numDomains;
282  if(numDomains >= 0){
283  domainNames.resize(numDomains);
284  for(int iDomain = 0;iDomain < numDomains;iDomain++)
285  inStream >> domainNames[iDomain];
286  }
287 
288 
289  std::vector<std::vector<std::string> > &domainGridNames(fileInfo.domainGridNames);
290  int numDomainGridNames = 0;
291  inStream >> numDomainGridNames;
292  if(numDomainGridNames >= 0){
293  domainGridNames.resize(numDomainGridNames);
294  for(int iDomain = 0;iDomain < numDomainGridNames;iDomain++){
295  std::vector<std::string> &domGridNames(domainGridNames[iDomain]);
296  int numGridNames = 0;
297  inStream >> numGridNames;
298  if(numGridNames > 0){
299  domGridNames.resize(numGridNames);
300  for(int iName = 0;iName < numGridNames;iName++)
301  inStream >> domGridNames[iName];
302  }
303  }
304  }
305 
306  std::vector<std::vector<std::string> > &domainGridPaths(fileInfo.domainGridPaths);
307  int numDomainGridPaths = 0;
308  inStream >> numDomainGridPaths;
309  if(numDomainGridPaths >= 0){
310  domainGridPaths.resize(numDomainGridPaths);
311  for(int iDomain = 0;iDomain < numDomainGridPaths;iDomain++){
312  std::vector<std::string> &domGridPaths(domainGridPaths[iDomain]);
313  int numGridPaths = 0;
314  inStream >> numGridPaths;
315  if(numGridPaths > 0){
316  domGridPaths.resize(numGridPaths);
317  for(int iPath = 0;iPath < numGridPaths;iPath++)
318  inStream >> domGridPaths[iPath];
319  }
320  }
321  }
322 
323  std::vector<pcpp::field::metadataset> &domainParamDictionaries(fileInfo.domainParamDictionaries);
324  int numDomainParamDict = 0;
325  inStream >> numDomainParamDict;
326  if(numDomainParamDict >= 0){
327  domainParamDictionaries.resize(numDomainParamDict);
328  for(int iDict = 0;iDict < numDomainParamDict;iDict++){
329  pcpp::field::metadataset &paramDict(domainParamDictionaries[iDict]);
330  int dictionarySize = 0;
331  inStream >> dictionarySize;
332  if(dictionarySize > 0){
333  inStream >> paramDict;
334  }
335  }
336  }
337 
338  std::vector<pcpp::field::metadataset> &domainStateDictionaries(fileInfo.domainStateDictionaries);
339  int numDomainStateDict = 0;
340  inStream >> numDomainStateDict;
341  if(numDomainStateDict >= 0){
342  domainStateDictionaries.resize(numDomainStateDict);
343  for(int iDict = 0;iDict < numDomainStateDict;iDict++){
344  pcpp::field::metadataset &stateDict(domainStateDictionaries[iDict]);
345  int dictionarySize = 0;
346  inStream >> dictionarySize;
347  if(dictionarySize > 0){
348  inStream >> stateDict;
349  }
350  }
351  }
352 
353  return(inStream);
354  };
355 
356 
357 
358  std::ostream &operator<<(std::ostream &outStream,const simfileinfo &fileInfo)
359  {
360 
361  std::string fileName(fileInfo.fileName);
362  if(fileName.empty())
363  fileName = "[NULL]";
364 
365  outStream << fileName << " ";
366 
367  const std::bitset<NUMFORMATBITS> &formatBits(fileInfo.formatBits);
368  outStream << formatBits << " ";
369 
370  int numGrids = fileInfo.numGrids;
371  outStream << numGrids << " ";
372 // if(numGrids == 0){
373 // return(outStream);
374 // }
375 
376  int numGeometries = fileInfo.numGeometries;
377  outStream << numGeometries << " ";
378 
379  int numDomains = fileInfo.numDomains;
380  outStream << numDomains << " ";
381 
382  int numAuxVar = fileInfo.numAuxVars;
383  outStream << numAuxVar << " ";
384 
385  int simStep = fileInfo.simStep;
386  outStream << simStep << " ";
387 
388  double simTime = fileInfo.simTime;
389  outStream << simTime << " ";
390 
391  int numLegacyHeader = fileInfo.legacyHeader.size();
392  outStream << numLegacyHeader << " ";
393  for(int iLeg = 0;iLeg < numLegacyHeader;iLeg++)
394  outStream << fileInfo.legacyHeader[iLeg] << " ";
395 
396  int paramDictSize = fileInfo.simulationParamDictionary.size();
397  outStream << paramDictSize << " ";
398  if(paramDictSize > 0){
399  outStream << std::endl << fileInfo.simulationParamDictionary << std::endl;
400  }
401  int stateDictSize = fileInfo.simulationStateDictionary.size();
402  outStream << stateDictSize << " ";
403  if(stateDictSize > 0){
404  outStream << std::endl << fileInfo.simulationStateDictionary << std::endl;
405  }
406 
407  std::vector<std::string> gridNames(fileInfo.gridNames);
408  if(gridNames.size() != numGrids){
409  gridNames.resize(numGrids,"[NULL]");
410  }
411 
412  std::vector<int> gridNumDim(fileInfo.gridNumDimensions);
413  if(gridNumDim.size() != numGrids){
414  gridNumDim.resize(numGrids,0);
415  }
416 
417  std::vector<std::vector<size_t> > gridSizes(fileInfo.gridSizes);
418  if(gridSizes.size() != numGrids){
419  std::vector<size_t> gSize(3,0);
420  gridSizes.resize(numGrids,gSize);
421  }
422 
423  for(int iGrid = 0;iGrid < numGrids;iGrid++){
424  outStream << gridNames[iGrid] << " "
425  << gridNumDim[iGrid] << " ";
426  std::vector<size_t> &gridSize(gridSizes[iGrid]);
427  for(int iDim = 0;iDim < gridNumDim[iGrid];iDim++){
428  outStream << gridSize[iDim] << " ";
429  }
430  }
431 
432  std::vector<std::string> geometryNames(fileInfo.geometryNames);
433  std::vector<std::vector<std::string> > geometryGridNames(fileInfo.geometryGridNames);
434  std::vector<std::vector<std::vector<size_t> > > geometryGridSizes(fileInfo.geometryGridSizes);
435 
436  if(geometryNames.size() != numGeometries)
437  geometryNames.resize(numGeometries,"[NULL]");
438  if(geometryGridNames.size() != numGeometries)
439  geometryGridNames.resize(numGeometries);
440  if(geometryGridSizes.size() != numGeometries)
441  geometryGridSizes.resize(numGeometries);
442 
443  for(int iGeom = 0;iGeom < numGeometries;iGeom++){
444  outStream << geometryNames[iGeom] << " ";
445  int numGeomGrid = geometryGridNames[iGeom].size();
446  outStream << numGeomGrid << " ";
447  std::vector<std::string> &geomGridNames(geometryGridNames[iGeom]);
448  if(geomGridNames.size() != numGeomGrid)
449  geomGridNames.resize(numGeomGrid,"[NULL]");
450  std::vector<std::vector<size_t> > &geomGridSizes(geometryGridSizes[iGeom]);
451  if(geomGridSizes.size() != numGeomGrid)
452  geomGridSizes.resize(numGeomGrid);
453  for(int iGeomGrid = 0;iGeomGrid < numGeomGrid;iGeomGrid++){
454  int geomGridDimension = geomGridSizes[iGeomGrid].size();
455  outStream << geomGridNames[iGeomGrid] << " " << geomGridDimension << " ";
456  for(int iDim = 0;iDim < geomGridDimension;iDim++)
457  outStream << geomGridSizes[iGeomGrid][iDim] << " ";
458  }
459  }
460 
461  const std::vector<std::string> &domainNames(fileInfo.domainNames);
462  numDomains = domainNames.size();
463  outStream << numDomains << " ";
464  if(numDomains > 0){
465  std::vector<std::string>::const_iterator dnIt = domainNames.begin();
466  while(dnIt != domainNames.end()){
467  outStream << *dnIt++ << " ";
468  }
469  }
470 
471  const std::vector<std::vector<std::string> > &domainGridNames(fileInfo.domainGridNames);
472  int numDomainGridNames = domainGridNames.size();
473  outStream << numDomainGridNames << " ";
474  if(numDomainGridNames > 0){
475  for(int iDomain = 0;iDomain < numDomainGridNames;iDomain++){
476  const std::vector<std::string> &domGridNames(domainGridNames[iDomain]);
477  int numGridNames = domGridNames.size();
478  outStream << numGridNames << " ";
479  if(numGridNames > 0){
480  std::vector<std::string>::const_iterator dnIt = domGridNames.begin();
481  while(dnIt != domGridNames.end()){
482  outStream << *dnIt++ << " ";
483  }
484  }
485  }
486  }
487 
488  const std::vector<std::vector<std::string> > &domainGridPaths(fileInfo.domainGridPaths);
489  int numDomainGridPaths = domainGridPaths.size();
490  outStream << numDomainGridPaths << " ";
491  if(numDomainGridPaths > 0){
492  for(int iDomain = 0;iDomain < numDomainGridPaths;iDomain++){
493  const std::vector<std::string> &domGridPaths(domainGridPaths[iDomain]);
494  int numGridPaths = domGridPaths.size();
495  outStream << numGridPaths << " ";
496  if(numGridPaths > 0){
497  std::vector<std::string>::const_iterator dnIt = domGridPaths.begin();
498  while(dnIt != domGridPaths.end()){
499  outStream << *dnIt++ << " ";
500  }
501  }
502  }
503  }
504 
505  const std::vector<pcpp::field::metadataset> &domainParamDictionaries(fileInfo.domainParamDictionaries);
506  int numDomainParamDict = domainParamDictionaries.size();
507  outStream << numDomainParamDict << " ";
508  if(numDomainParamDict > 0){
509  for(int iDict = 0;iDict < numDomainParamDict;iDict++){
510  const pcpp::field::metadataset &paramDict(domainParamDictionaries[iDict]);
511  int dictionarySize = paramDict.size();
512  outStream << dictionarySize << " ";
513  if(dictionarySize > 0){
514  outStream << std::endl << paramDict;
515  }
516  }
517  }
518 
519  const std::vector<pcpp::field::metadataset> &domainStateDictionaries(fileInfo.domainStateDictionaries);
520  int numDomainStateDict = domainStateDictionaries.size();
521  outStream << numDomainStateDict << " ";
522  if(numDomainStateDict > 0){
523  for(int iDict = 0;iDict < numDomainStateDict;iDict++){
524  const pcpp::field::metadataset &stateDict(domainStateDictionaries[iDict]);
525  int dictionarySize = stateDict.size();
526  outStream << dictionarySize << " ";
527  if(dictionarySize > 0){
528  outStream << std::endl << stateDict;
529  }
530  }
531  }
532 
533  return(outStream);
534  };
535 
536 
537 // struct simfileinfo {
538 
539 
540 // // Detailed geometry description
541 
542 // std::vector<std::string> domainNames;
543 // std::vector<std::vector<std::string> > domainGridNames;
544 // std::vector<std::vector<std::string> > domainGridPaths;
545 // std::vector<pcpp::field::metadataset> domainParamDictionaries;
546 // std::vector<pcpp::field::metadataset> domainStateDictionaries;
547 
548 // };
549 
550 
551 
552 
553  }
554 }
std::vector< pcpp::field::metadataset > domainStateDictionaries
Definition: PCPPIO.H:74
std::ostream & operator<<(std::ostream &, const simfileinfo &)
Definition: PCPPIO.C:358
std::string StepStamp(size_t inStep)
Definition: PCPPIO.C:30
bool operator==(const pcpp::io::simfileinfo &, const pcpp::io::simfileinfo &)
Definition: PCPPIO.C:93
bool Compatible(const pcpp::io::simfileinfo &fileInfo1, const pcpp::io::simfileinfo &fileInfo2, std::ostream &infoStream)
Definition: PCPPIO.C:13
std::istream & operator>>(std::istream &, simfileinfo &)
Definition: PCPPIO.C:163
std::vector< std::vector< std::string > > geometryGridNames
Grid names for each geometry.
Definition: PCPPIO.H:58
pcpp::field::metadataset simulationParamDictionary
Dictionaries summarizing the attribute and datatsets in the file.
Definition: PCPPIO.H:71
void const size_t const size_t * gridSizes
Definition: EulerKernels.H:10
std::vector< std::vector< std::string > > domainGridPaths
Path to grid data (including file name, geometry and grid names)
Definition: PCPPIO.H:67
std::vector< int > gridNumDimensions
Definition: PCPPIO.H:51
std::bitset< NUMFORMATBITS > formatBits
Definition: PCPPIO.H:42
void Everyone(const std::string &outString, std::ostream &outStream, fixtures::CommunicatorType &comm)
Definition: PCPPIO.C:51
std::string fileName
Definition: PCPPIO.H:41
std::vector< std::vector< size_t > > gridSizes
Definition: PCPPIO.H:52
Main encapsulation of MPI.
Definition: COMM.H:62
void InitializeFileTypes()
Definition: PCPPIO.C:65
bool FileType(const std::string &inFileName, const std::string &fileType)
Definition: PCPPIO.C:74
pcpp::field::metadataset simulationStateDictionary
Definition: PCPPIO.H:72
std::vector< double > legacyHeader
Time Re Pr from PlasComCM.
Definition: PCPPIO.H:46
std::vector< std::vector< std::string > > domainGridNames
Domain-specific grid names for which there is data.
Definition: PCPPIO.H:65
std::vector< std::string > geometryNames
Names of all geometries in file.
Definition: PCPPIO.H:56
std::vector< std::string > gridNames
Full grid names (geometryName:gridName)
Definition: PCPPIO.H:50
std::vector< std::vector< std::vector< size_t > > > geometryGridSizes
Sizes for each geometry grid.
Definition: PCPPIO.H:60
static std::map< std::string, std::vector< std::string > > fileTypeExtensions
Definition: PCPPIO.H:20
std::vector< pcpp::field::metadataset > domainParamDictionaries
Definition: PCPPIO.H:73
std::vector< std::string > domainNames
Definition: PCPPIO.H:63