PlasCom2  1.0
XPACC Multi-physics simluation application
PC2IO.C
Go to the documentation of this file.
1 #include "PC2IO.H"
2 
3 
4 namespace plascom2 {
5  namespace io {
6  namespace hdf5 {
7 
8  // Serial utility for reading a grid or state from PlasCom2 or PlasComCM legacy HDF5
9  int ReadSingle(const pcpp::io::simfileinfo &fileInfo,
10  plascom2::grid_t &inGrid,
11  plascom2::state_t &inState,
12  std::ostream &infoStream)
13  {
14 
15  const std::string &fileName(fileInfo.fileName);
16 
17 
18  if(!fileInfo.formatBits.test(pcpp::io::ISLEGACY)){
19 
20  const std::vector<size_t> &gridSizes(fileInfo.geometryGridSizes[0][0]);
21  size_t numNodes = 1;
22  std::vector<size_t>::const_iterator gsIt = gridSizes.begin();
23  while(gsIt != gridSizes.end())
24  numNodes *= *gsIt++;
25 
26  inGrid.SetGridSizes(gridSizes);
27  inGrid.Finalize(true);
28 
29  inState.SetMetaData(fileInfo.domainStateDictionaries[0]);
30  inState.Create(numNodes,0);
31 
32  // std::ostringstream stateReportStream;
33 
34  std::string gridName = fileInfo.domainGridNames[0][0];
35  std::string gridPath = fileInfo.domainGridPaths[0][0];
36  std::string domainName = fileInfo.domainNames[0];
37  std::string domainGroupName = std::string("/PlasCom2/Simulation/")+domainName;
38  std::string pathToGridData = domainGroupName+std::string("/")+gridName;
39  std::string geometryName = gridPath.substr(0,gridPath.find(":"));
40  std::string geometryGridName = gridPath.substr(gridPath.find(":")+1);
41  std::string geometryPath = std::string("/PlasCom2/Geometry/")+geometryName+
42  std::string("/")+geometryGridName;
43 
44  pcpp::io::hdf5::base h5File(fileName);
45 
46  if(pcpp::io::hdf5::ReadGrid(inGrid,geometryPath,h5File)){
47  infoStream << "Error: Could not read grid at data path: "
48  << geometryPath << "." << std::endl;
49  return(1);
50  }
51  if(pcpp::io::hdf5::ReadStateAttributes(inState,'s',"/PlasCom2/Simulation",h5File)){
52  infoStream << "Error: Reading simulation-global attributes failed." << std::endl;
53  return(1);
54  }
55  if(pcpp::io::hdf5::ReadStateAttributes(inState,'d',domainGroupName,h5File)){
56  infoStream << "Error: Reading domain-global attributes failed." << std::endl;
57  return(1);
58  }
59 
60  const pcpp::IndexIntervalType &partInterval(inGrid.PartitionInterval());
61  const pcpp::IndexIntervalType &partitionBufferInterval(inGrid.PartitionBufferInterval());
62  const std::vector<size_t> &partitionSizes(partInterval.Sizes());
63  const std::vector<size_t> &partitionStarts(partInterval.Starts());
64  const std::vector<size_t> &partitionBufferStarts(partitionBufferInterval.Starts());
65  const std::vector<size_t> &bufferSizes(inGrid.BufferSizes());
66 
67  if(pcpp::io::hdf5::ReadStateNodeData(inState,gridSizes,partitionSizes,partitionStarts,
68  bufferSizes,partitionBufferStarts,pathToGridData,h5File)){
69  infoStream << "Error: Failed to read nodal state data attributes at path: "
70  << pathToGridData << "." << std::endl;
71  return(1);
72  }
73 
74  h5File.Close();
75 
76  } else { // Process a legacy file
77 
78  const std::vector<size_t> &gridSizes(fileInfo.gridSizes[0]);
79  size_t numNodes = 1;
80  std::vector<size_t>::const_iterator gsIt = gridSizes.begin();
81  while(gsIt != gridSizes.end())
82  numNodes *= *gsIt++;
83 
84  inGrid.SetGridSizes(gridSizes);
85  inGrid.Finalize(true);
86 
87  inState.SetMetaData(fileInfo.simulationStateDictionary);
88  inState.Create(numNodes,0);
89 
90  std::string geometryPath(fileInfo.gridNames[0]);
91 
92  pcpp::io::hdf5::base h5File(fileName);
93 
94  if(fileInfo.formatBits.test(pcpp::io::HASGRID)){
95  if(pcpp::io::hdf5::ReadGrid(inGrid,geometryPath,h5File,false)){
96  infoStream << "Error: Could not read grid at data path: "
97  << geometryPath << "." << std::endl;
98  return(1);
99  }
100  }
101 
102  if(fileInfo.formatBits.test(pcpp::io::HASSTATE)){
103  const pcpp::IndexIntervalType &partInterval(inGrid.PartitionInterval());
104  const pcpp::IndexIntervalType &partitionBufferInterval(inGrid.PartitionBufferInterval());
105  const std::vector<size_t> &partitionSizes(partInterval.Sizes());
106  const std::vector<size_t> &partitionStarts(partInterval.Starts());
107  const std::vector<size_t> &partitionBufferStarts(partitionBufferInterval.Starts());
108  const std::vector<size_t> &bufferSizes(inGrid.BufferSizes());
109 
110  if(pcpp::io::hdf5::ReadStateNodeData(inState,gridSizes,partitionSizes,partitionStarts,
111  bufferSizes,partitionBufferStarts,geometryPath,h5File)){
112  infoStream << "Error: Failed to read nodal state data attributes at path: "
113  << geometryPath << "." << std::endl;
114  return(1);
115  }
116  }
117 
118  }
119 
120  return(0);
121 
122  }
123 
125  int ReadSingle(const pcpp::io::simfileinfo &fileInfo, int gridIndex,
126  plascom2::grid_t &inGrid,
127  plascom2::state_t &inState,
128  std::ostream &infoStream)
129  {
130 
131  const std::string &fileName(fileInfo.fileName);
132  pcpp::io::hdf5::base h5File(fileName);
133 
134 
135  if(!fileInfo.formatBits.test(pcpp::io::ISLEGACY)){
136 
137  const std::vector<size_t> &gridSizes(fileInfo.geometryGridSizes[0][gridIndex]);
138  size_t numNodes = 1;
139  std::vector<size_t>::const_iterator gsIt = gridSizes.begin();
140  while(gsIt != gridSizes.end())
141  numNodes *= *gsIt++;
142 
143  inGrid.SetGridSizes(gridSizes);
144  inGrid.Finalize(true);
145 
146  inState.SetMetaData(fileInfo.domainStateDictionaries[0]);
147  inState.Create(numNodes,0);
148 
149  // std::ostringstream stateReportStream;
150 
151  std::string gridName = fileInfo.domainGridNames[0][gridIndex];
152  std::string gridPath = fileInfo.domainGridPaths[0][gridIndex];
153  std::string domainName = fileInfo.domainNames[0];
154  std::string domainGroupName = std::string("/PlasCom2/Simulation/")+domainName;
155  std::string pathToGridData = domainGroupName+std::string("/")+gridName;
156  std::string geometryName = gridPath.substr(0,gridPath.find(":"));
157  std::string geometryGridName = gridPath.substr(gridPath.find(":")+1);
158  std::string geometryPath = std::string("/PlasCom2/Geometry/")+geometryName+
159  std::string("/")+geometryGridName;
160 
161  if(pcpp::io::hdf5::ReadGrid(inGrid,geometryPath,h5File)){
162  infoStream << "Error: Could not read grid at data path: "
163  << geometryPath << "." << std::endl;
164  return(1);
165  }
166 
167  if(pcpp::io::hdf5::ReadStateAttributes(inState,'s',"/PlasCom2/Simulation",h5File)){
168  infoStream << "Error: Reading simulation-global attributes failed." << std::endl;
169  return(1);
170  }
171  if(pcpp::io::hdf5::ReadStateAttributes(inState,'d',domainGroupName,h5File)){
172  infoStream << "Error: Reading domain-global attributes failed." << std::endl;
173  return(1);
174  }
175 
176  const pcpp::IndexIntervalType &partInterval(inGrid.PartitionInterval());
177  const pcpp::IndexIntervalType &partitionBufferInterval(inGrid.PartitionBufferInterval());
178  const std::vector<size_t> &partitionSizes(partInterval.Sizes());
179  const std::vector<size_t> &partitionStarts(partInterval.Starts());
180  const std::vector<size_t> &partitionBufferStarts(partitionBufferInterval.Starts());
181  const std::vector<size_t> &bufferSizes(inGrid.BufferSizes());
182 
183  if(pcpp::io::hdf5::ReadStateNodeData(inState,gridSizes,partitionSizes,partitionStarts,
184  bufferSizes,partitionBufferStarts,pathToGridData,h5File)){
185  infoStream << "Error: Failed to read nodal state data attributes at path: "
186  << pathToGridData << "." << std::endl;
187  return(1);
188  }
189 
190  h5File.Close();
191 
192  } else { // Process a legacy file
193 
194  const std::vector<size_t> &gridSizes(fileInfo.gridSizes[0]);
195  size_t numNodes = 1;
196  std::vector<size_t>::const_iterator gsIt = gridSizes.begin();
197  while(gsIt != gridSizes.end())
198  numNodes *= *gsIt++;
199 
200  inGrid.SetGridSizes(gridSizes);
201  inGrid.Finalize(true);
202 
203  inState.SetMetaData(fileInfo.simulationStateDictionary);
204  inState.Create(numNodes,0);
205 
206 
207  std::string geometryPath(fileInfo.gridNames[gridIndex]);
208 
209  if(fileInfo.formatBits.test(pcpp::io::HASGRID)){
210  if(pcpp::io::hdf5::ReadGrid(inGrid,geometryPath,h5File,false)){
211  infoStream << "Error: Could not read grid at data path: "
212  << geometryPath << "." << std::endl;
213  return(1);
214  }
215  }
216 
217  if(fileInfo.formatBits.test(pcpp::io::HASSTATE)){
218  const pcpp::IndexIntervalType &partInterval(inGrid.PartitionInterval());
219  const pcpp::IndexIntervalType &partitionBufferInterval(inGrid.PartitionBufferInterval());
220  const std::vector<size_t> &partitionSizes(partInterval.Sizes());
221  const std::vector<size_t> &partitionStarts(partInterval.Starts());
222  const std::vector<size_t> &partitionBufferStarts(partitionBufferInterval.Starts());
223  const std::vector<size_t> &bufferSizes(inGrid.BufferSizes());
224 
225  if(pcpp::io::hdf5::ReadStateNodeData(inState,gridSizes,partitionSizes,partitionStarts,
226  bufferSizes,partitionBufferStarts,geometryPath,h5File)){
227  infoStream << "Error: Failed to read nodal state data attributes at path: "
228  << geometryPath << "." << std::endl;
229  return(1);
230  }
231  }
232 
233  }
234 
235  return(0);
236 
237  }
238 
239  // Collective call, everyone in the grid communicator must call
240  int ReadSingleState(const std::string &fileName,
241  plascom2::grid_t &inGrid,
242  plascom2::state_t &inState,
243  std::ostream &infoStream)
244  {
245 
246  fixtures::CommunicatorType &gridComm(inGrid.Communicator());
247 
248  int myRank = gridComm.Rank();
249 
250  pcpp::io::simfileinfo fileInfo;
251  if(myRank == 0){
252  // populate file info
253  }
254 
255  if(!fileInfo.formatBits.test(pcpp::io::ISLEGACY)){
256 
257  const std::vector<size_t> &gridSizes(fileInfo.geometryGridSizes[0][0]);
258  size_t numNodes = 1;
259  std::vector<size_t>::const_iterator gsIt = gridSizes.begin();
260  while(gsIt != gridSizes.end())
261  numNodes *= *gsIt++;
262 
263  inGrid.SetGridSizes(gridSizes);
264  inGrid.Finalize(true);
265 
266  inState.SetMetaData(fileInfo.domainStateDictionaries[0]);
267  inState.Create(numNodes,0);
268 
269  // std::ostringstream stateReportStream;
270 
271  std::string gridName = fileInfo.domainGridNames[0][0];
272  std::string gridPath = fileInfo.domainGridPaths[0][0];
273  std::string domainName = fileInfo.domainNames[0];
274  std::string domainGroupName = std::string("/PlasCom2/Simulation/")+domainName;
275  std::string pathToGridData = domainGroupName+std::string("/")+gridName;
276  std::string geometryName = gridPath.substr(0,gridPath.find(":"));
277  std::string geometryGridName = gridPath.substr(gridPath.find(":")+1);
278  std::string geometryPath = std::string("/PlasCom2/Geometry/")+geometryName+
279  std::string("/")+geometryGridName;
280 
281  pcpp::io::hdf5::base h5File(fileName);
282 
283  if(pcpp::io::hdf5::ReadGrid(inGrid,geometryPath,h5File)){
284  infoStream << "Error: Could not read grid at data path: "
285  << geometryPath << "." << std::endl;
286  return(1);
287  }
288  if(pcpp::io::hdf5::ReadStateAttributes(inState,'s',"/PlasCom2/Simulation",h5File)){
289  infoStream << "Error: Reading simulation-global attributes failed." << std::endl;
290  return(1);
291  }
292  if(pcpp::io::hdf5::ReadStateAttributes(inState,'d',domainGroupName,h5File)){
293  infoStream << "Error: Reading domain-global attributes failed." << std::endl;
294  return(1);
295  }
296 
297  const pcpp::IndexIntervalType &partInterval(inGrid.PartitionInterval());
298  const pcpp::IndexIntervalType &partitionBufferInterval(inGrid.PartitionBufferInterval());
299  const std::vector<size_t> &partitionSizes(partInterval.Sizes());
300  const std::vector<size_t> &partitionStarts(partInterval.Starts());
301  const std::vector<size_t> &partitionBufferStarts(partitionBufferInterval.Starts());
302  const std::vector<size_t> &bufferSizes(inGrid.BufferSizes());
303 
304  if(pcpp::io::hdf5::ReadStateNodeData(inState,gridSizes,partitionSizes,partitionStarts,
305  bufferSizes,partitionBufferStarts,pathToGridData,h5File)){
306  infoStream << "Error: Failed to read nodal state data attributes at path: "
307  << pathToGridData << "." << std::endl;
308  return(1);
309  }
310 
311  h5File.Close();
312 
313  } else { // Process a legacy file
314 
315  const std::vector<size_t> &gridSizes(fileInfo.gridSizes[0]);
316  size_t numNodes = 1;
317  std::vector<size_t>::const_iterator gsIt = gridSizes.begin();
318  while(gsIt != gridSizes.end())
319  numNodes *= *gsIt++;
320 
321  inGrid.SetGridSizes(gridSizes);
322  inGrid.Finalize(true);
323 
324  inState.SetMetaData(fileInfo.simulationStateDictionary);
325  inState.Create(numNodes,0);
326 
327  // double *refRe = inState.template GetFieldBuffer("refRe");
328  // double *refPr = inState.template GetFieldBuffer("refPr");
329  // double *refSc = inState.template GetFieldBuffer("refSc");
330 
331  // *refSc = fileInfo.legacyHeader[0];
332  // *refPr = fileInfo.legacyHeader[1];
333  // *refRe = fileInfo.legacyHeader[2];
334 
335  std::string geometryPath(fileInfo.gridNames[0]);
336 
337  pcpp::io::hdf5::base h5File(fileName);
338 
339  if(fileInfo.formatBits.test(pcpp::io::HASGRID)){
340  if(pcpp::io::hdf5::ReadGrid(inGrid,geometryPath,h5File,false)){
341  infoStream << "Error: Could not read grid at data path: "
342  << geometryPath << "." << std::endl;
343  return(1);
344  }
345  }
346 
347  if(fileInfo.formatBits.test(pcpp::io::HASSTATE)){
348  const pcpp::IndexIntervalType &partInterval(inGrid.PartitionInterval());
349  const pcpp::IndexIntervalType &partitionBufferInterval(inGrid.PartitionBufferInterval());
350  const std::vector<size_t> &partitionSizes(partInterval.Sizes());
351  const std::vector<size_t> &partitionStarts(partInterval.Starts());
352  const std::vector<size_t> &partitionBufferStarts(partitionBufferInterval.Starts());
353  const std::vector<size_t> &bufferSizes(inGrid.BufferSizes());
354 
355  if(pcpp::io::hdf5::ReadStateNodeData(inState,gridSizes,partitionSizes,partitionStarts,
356  bufferSizes,partitionBufferStarts,geometryPath,h5File)){
357  infoStream << "Error: Failed to read nodal state data attributes at path: "
358  << geometryPath << "." << std::endl;
359  return(1);
360  }
361  }
362 
363  }
364 
365  return(0);
366 
367  }
368 
369  }
370  }
371 }
std::vector< pcpp::field::metadataset > domainStateDictionaries
Definition: PCPPIO.H:74
int ReadSingle(const pcpp::io::simfileinfo &fileInfo, plascom2::grid_t &inGrid, plascom2::state_t &inState, std::ostream &infoStream)
Definition: PC2IO.C:9
int ReadSingleState(const std::string &fileName, plascom2::grid_t &inGrid, plascom2::state_t &inState, std::ostream &infoStream)
Definition: PC2IO.C:240
pcpp::IndexIntervalType & PartitionInterval()
Definition: Grid.H:500
void const size_t const size_t * gridSizes
Definition: EulerKernels.H:10
Definition: PC2IO.H:10
std::vector< std::vector< std::string > > domainGridPaths
Path to grid data (including file name, geometry and grid names)
Definition: PCPPIO.H:67
virtual size_t Create(size_t number_of_nodes=0, size_t number_of_cells=0)
void SetGridSizes(const std::vector< size_t > &inSize)
Definition: Grid.H:452
std::bitset< NUMFORMATBITS > formatBits
Definition: PCPPIO.H:42
const std::vector< size_t > & BufferSizes() const
Definition: Grid.H:459
pcpp::IndexIntervalType & PartitionBufferInterval()
Definition: Grid.H:519
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
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
pcpp::field::metadataset simulationStateDictionary
Definition: PCPPIO.H:72
void const size_t const size_t * bufferSizes
Definition: MetricKernels.H:19
std::vector< std::vector< std::string > > domainGridNames
Domain-specific grid names for which there is data.
Definition: PCPPIO.H:65
void SetMetaData(const MetaDataSetType &dataDictionary)
int ReadGrid(hid_t parentGroupID, const configuration &hdfConfig, const std::string &gridName, GridType &gridData, fixtures::CommunicatorType &inComm, std::ostream &messageStream)
Definition: PCPPHDF5.H:927
Simple Block Structured Mesh object.
Definition: IndexUtil.H:21
fixtures::CommunicatorType & Communicator() const
Definition: Grid.H:350
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
std::vector< std::vector< std::vector< size_t > > > geometryGridSizes
Sizes for each geometry grid.
Definition: PCPPIO.H:60
int Finalize(bool allocateCoordinateData=false)
Definition: Grid.C:2318
std::vector< std::string > domainNames
Definition: PCPPIO.H:63