16 template<
typename Gr
idType,
typename StateType,
typename ConfigType>
18 const std::string &domainName,
19 const std::string &geometryName,
20 const std::string &gridName,
23 StateType ¶mState,
25 std::ostream &outStream,
36 int myRank = gridComm.Rank();
42 std::ostringstream configStream;
43 configStream << simConfig;
44 std::string configString(configStream.str());
45 if(!configString.empty())
46 pc2File.
CreateAttribute(
"/PlasCom2/Configuration/Parameters",configString);
48 int numGeometries = 1;
50 std::vector<size_t> attSize(1,1);
51 pc2File.
CreateAttribute(
"/PlasCom2/Geometry/numGeometries",attSize,&numGeometries);
52 pc2File.
CreateAttribute(
"/PlasCom2/Geometry/geometryNames",geometryName);
53 std::string geomGroupName(std::string(
"/PlasCom2/Geometry/")+geometryName);
59 std::string geomGridGroupName(geomGroupName+
"/"+gridName);
63 pc2File.
CreateAttribute(
"/PlasCom2/Simulation/numDomains",attSize,&numDomains);
65 std::string domainGroupName(std::string(
"/PlasCom2/Simulation/")+domainName);
72 if(!parameterDictionary.empty()){
73 std::ostringstream dictionaryOut;
74 dictionaryOut << parameterDictionary;
75 std::string dictionaryString(dictionaryOut.str());
76 pc2File.
CreateAttribute(
"/PlasCom2/Simulation/paramDictionary",dictionaryString);
79 if(!simulationStateDictionary.empty()){
80 std::ostringstream dictionaryOut;
81 dictionaryOut << simulationStateDictionary;
82 std::string dictionaryString(dictionaryOut.str());
83 pc2File.
CreateAttribute(
"/PlasCom2/Simulation/stateDictionary",dictionaryString);
90 pc2File.
CreateAttribute(
"/PlasCom2/Simulation/stepNumber",attSize,&iStep);
96 int numDomainGrids = 1;
97 std::string domainFullGridName(geometryName+
":"+gridName);
98 std::string domainGridName(
"grid1");
99 pc2File.
CreateAttribute(domainGroupName+
"/numGrids",attSize,&numDomainGrids);
109 domainParameterDictionary.
Append(gridParameterDictionary);
110 domainStateDictionary.Append(gridStateDictionary);
111 domainStateDictionary.Append(nodeStateDictionary);
112 domainStateDictionary.Append(cellStateDictionary);
114 if(!domainParameterDictionary.empty()){
115 std::ostringstream dictionaryOut;
116 dictionaryOut << domainParameterDictionary;
117 std::string dictionaryString(dictionaryOut.str());
118 pc2File.
CreateAttribute(domainGroupName+
"/paramDictionary",dictionaryString);
120 if(!domainStateDictionary.empty()){
121 std::ostringstream dictionaryOut;
122 dictionaryOut << domainStateDictionary;
123 std::string dictionaryString(dictionaryOut.str());
124 pc2File.
CreateAttribute(domainGroupName+
"/stateDictionary",dictionaryString);
129 std::string gridGroupName(domainGroupName+
"/"+domainGridName);
137 std::vector<size_t> partitionSizes(partInterval.Sizes());
138 std::vector<size_t> partitionStarts(partInterval.Starts());
139 std::vector<size_t> partitionBufferStarts(partitionBufferInterval.Starts());
140 std::vector<size_t>
gridSizes(inGrid.GridSizes());
141 std::vector<size_t>
bufferSizes(inGrid.BufferSizes());
144 bufferSizes,partitionBufferStarts,gridGroupName,pc2File);
151 gridGroupName,inGrid,inState);
157 template<
typename DomainType,
typename ConfigType>
158 int WriteSingleDomain(
const std::string &fileName,
159 DomainType &inDomain,
161 std::ostream &outStream)
165 int domainRank = domainCommunicator.
Rank();
170 int numDomainGrids = inDomain.NumberOfGrids();
171 const std::vector<std::string> &domainGridNames(inDomain.GridNames());
172 const std::vector<std::string> &domainGeometryNames(inDomain.GeometryNames());
173 int numGeometries = domainGeometryNames.size();
174 const std::string &domainName(inDomain.Name());
175 std::vector<std::string> uniqueGeometryNames(domainGeometryNames);
176 std::sort(uniqueGeometryNames.begin(),uniqueGeometryNames.end());
177 uniqueGeometryNames.erase(std::unique(uniqueGeometryNames.begin(),uniqueGeometryNames.end()),
178 uniqueGeometryNames.end());
179 int numUniqueGeometries = uniqueGeometryNames.size();
180 std::vector<std::string> uniqueGridNames(domainGridNames);
181 std::sort(uniqueGridNames.begin(),uniqueGridNames.end());
182 uniqueGridNames.erase(std::unique(uniqueGridNames.begin(),uniqueGridNames.end()),
183 uniqueGridNames.end());
184 int numUniqueGrids = uniqueGridNames.size();
185 std::string domainGroupName(std::string(
"/PlasCom2/Simulation/")+domainName);
186 std::vector<size_t> attSize1(1,1);
187 bool writeGeometry =
true;
188 if(simConfig.
IsSet(
"PlasCom2:WriteGeometry"))
189 writeGeometry = simConfig.
GetFlagValue(
"PlasCom2:WriteGeometry");
190 int iStep = inDomain.Step();
203 std::ostringstream configStream;
204 configStream << simConfig;
205 std::string configString(configStream.str());
206 if(!configString.empty())
207 pc2File.
CreateAttribute(
"/PlasCom2/Configuration/Parameters",configString);
212 pc2File.
CreateAttribute(
"/PlasCom2/Geometry/numGeometries",attSize1,&numUniqueGeometries);
213 std::ostringstream geometryNameStream;
214 for(
int iGeom = 0;iGeom < numUniqueGeometries;iGeom++){
215 geometryNameStream << uniqueGeometryNames[iGeom];
216 if(iGeom != (numUniqueGeometries-1))
217 geometryNameStream <<
" ";
220 std::map<std::string,int> numGeometryGrids;
221 std::string allGeometryNames(geometryNameStream.str());
222 pc2File.
CreateAttribute(
"/PlasCom2/Geometry/geometryNames",allGeometryNames);
223 for(
int iGeom = 0;iGeom < numUniqueGeometries;iGeom++){
224 const std::string &geometryName(uniqueGeometryNames[iGeom]);
225 const std::string geomGroupName(std::string(
"/PlasCom2/Geometry/")+geometryName);
227 numGeometryGrids.insert(std::make_pair(geometryName,0));
230 typedef std::multimap<std::string,std::string> namesmap;
231 namesmap geometryGridNames;
232 for(
int iGrid = 0;iGrid < numUniqueGrids;iGrid++){
233 const std::string &domainGridName(uniqueGridNames[iGrid]);
234 std::string::size_type
x = domainGridName.find_last_of(
":");
235 const std::string gridGeometryName(domainGridName.substr(0,x));
236 const std::string gridOnlyName(domainGridName.substr(x+1));
237 const std::string gridPath(std::string(
"/PlasCom2/Geometry/")+
238 gridGeometryName+
"/"+gridOnlyName);
239 numGeometryGrids[gridGeometryName]++;
240 geometryGridNames.insert(std::make_pair(gridGeometryName,gridOnlyName));
243 for(
int iGeom = 0;iGeom < numUniqueGeometries;iGeom++){
244 const std::string &geometryName(uniqueGeometryNames[iGeom]);
245 const std::string geomGroupName(std::string(
"/PlasCom2/Geometry/")+geometryName);
246 int numGeomGrids = numGeometryGrids[geometryName];
247 pc2File.
CreateAttribute(geomGroupName+
"/numGrids",attSize1,&numGeomGrids);
248 std::pair<namesmap::iterator,namesmap::iterator> gridsOfGeometry;
249 gridsOfGeometry = geometryGridNames.equal_range(geometryName);
250 namesmap::iterator gnIt = gridsOfGeometry.first;
251 std::ostringstream allGridNamesStream;
252 while(gnIt != gridsOfGeometry.second){
253 allGridNamesStream << gnIt->second;
255 if(gnIt != gridsOfGeometry.second)
256 allGridNamesStream <<
" ";
258 const std::string allGridNames(allGridNamesStream.str());
264 pc2File.
CreateAttribute(
"/PlasCom2/Simulation/numDomains",attSize1,&numDomains);
265 pc2File.
CreateAttribute(
"/PlasCom2/Simulation/domainNames",domainName);
275 if(!simulationParamDict.empty()){
276 std::ostringstream dictionaryOut;
277 dictionaryOut << simulationParamDict;
278 std::string dictionaryString(dictionaryOut.str());
279 pc2File.
CreateAttribute(
"/PlasCom2/Simulation/paramDictionary",dictionaryString);
282 if(!simulationStateDict.empty()){
283 std::ostringstream dictionaryOut;
284 dictionaryOut << simulationStateDict;
285 std::string dictionaryString(dictionaryOut.str());
286 pc2File.
CreateAttribute(
"/PlasCom2/Simulation/stateDictionary",dictionaryString);
290 std::ostringstream gridNamesStream;
291 std::vector<std::string> gridNames;
292 for(
int iGrid = 1;iGrid <= numDomainGrids;iGrid++){
293 std::ostringstream gridNameStream;
294 gridNameStream <<
"grid" << iGrid;
295 gridNames.push_back(gridNameStream.str());
296 gridNamesStream << gridNames[iGrid-1];
297 if(iGrid != numDomainGrids)
298 gridNamesStream <<
" ";
301 const std::string allGridNames(gridNamesStream.str());
302 pc2File.
CreateAttribute(domainGroupName+
"/numGrids",attSize1,&numDomainGrids);
312 domainParamDict.
Append(meshParamDictionary);
313 domainStateDict.
Append(meshStateDictionary);
314 domainStateDict.
Append(nodeStateDictionary);
315 domainStateDict.
Append(cellStateDictionary);
317 if(!domainParamDict.empty()){
318 std::ostringstream dictionaryOut;
319 dictionaryOut << domainParamDict;
320 std::string dictionaryString(dictionaryOut.str());
321 pc2File.
CreateAttribute(domainGroupName+
"/paramDictionary",dictionaryString);
324 if(!domainStateDict.empty()){
325 std::ostringstream dictionaryOut;
326 dictionaryOut << domainStateDict;
327 std::string dictionaryString(dictionaryOut.str());
328 pc2File.
CreateAttribute(domainGroupName+
"/stateDictionary",dictionaryString);
331 for(
int iGrid = 0;iGrid < numDomainGrids;iGrid++){
332 std::string gridGroupName(domainGroupName+
"/"+gridNames[iGrid]);
333 const std::string &domainFullGridName(domainGridNames[iGrid]);
340 domainCommunicator.Barrier();
342 const std::vector<int> &localGridIndices(inDomain.LocalGridIndices());
344 std::map<std::string,bool> gridHasBeenWritten;
345 for(
int iGrid = 0;iGrid < numDomainGrids;iGrid++)
346 gridHasBeenWritten.insert(std::make_pair(domainGridNames[iGrid],
false));
347 bool simStateWritten =
false;
348 bool domainStateWritten =
false;
349 for(
int iGrid = 0;iGrid < numDomainGrids;iGrid++){
350 const std::string &fullGridName(domainGridNames[iGrid]);
351 typename DomainType::GridType ¤tGrid(inDomain.Grid(iGrid));
352 int numDim = currentGrid.Dimension();
353 const std::vector<size_t> ¤tGridSizes(currentGrid.GridSizes());
354 std::vector<int>::const_iterator localGridIt = std::find(localGridIndices.begin(),
355 localGridIndices.end(),
357 if(localGridIt != localGridIndices.end()){
359 std::string::size_type
x = fullGridName.find_last_of(
":");
360 const std::string geometryName(fullGridName.substr(0,x));
361 const std::string gridName(fullGridName.substr(x+1));
362 const std::string geometryPath(std::string(
"/PlasCom2/Geometry/")+geometryName);
365 if(!gridHasBeenWritten[fullGridName]){
367 gridHasBeenWritten[fullGridName] =
true;
369 std::ostringstream simGridNameStream;
370 simGridNameStream <<
"grid" << iGrid+1;
371 const std::string simGridName(simGridNameStream.str());
372 typename DomainType::StateType &inState(inDomain.State(iGrid));
373 typename DomainType::StateType ¶mState(inDomain.Param(iGrid));
374 if(!simStateWritten){
377 int iStep = inDomain.Step();
379 pc2File.
CreateAttribute(
"/PlasCom2/Simulation/stepNumber",attSize1,&iStep);
381 simStateWritten =
true;
383 if(!domainStateWritten){
386 pc2File.
CreateAttribute(domainGroupName+
"/stepNumber",attSize1,&iStep);
387 domainStateWritten =
true;
390 const std::string simGridGroupName(domainGroupName+
"/"+simGridName);
392 std::vector<size_t> sizeAtt(1,numDim);
393 pc2File.
CreateAttribute(simGridGroupName+
"/gridSize",sizeAtt,¤tGridSizes[0]);
398 std::vector<size_t> partitionSizes(partInterval.Sizes());
399 std::vector<size_t> partitionStarts(partInterval.Starts());
400 std::vector<size_t> partitionBufferStarts(partitionBufferInterval.Starts());
401 std::vector<size_t>
gridSizes(currentGrid.GridSizes());
402 std::vector<size_t>
bufferSizes(currentGrid.BufferSizes());
405 bufferSizes,partitionBufferStarts,simGridGroupName,pc2File)){
406 outStream <<
"ERROR! Failed to write state node data for " << simGridGroupName << std::endl;
411 domainCommunicator.Barrier();
418 domainCommunicator.Barrier();
424 template<
typename Gr
idType,
typename StateType,
typename ConfigType>
425 int InputSingle(
const std::string &fileName,
426 const std::string &domainName,
427 const std::string &geometryName,
428 const std::string &gridName,
431 StateType ¶mState,
433 std::ostream &outStream){
443 int myRank = gridComm.
Rank();
448 std::string configString;
449 pc2File.
ReadAttribute(
"/PlasCom2/Configuration/Parameters",configString);
450 std::istringstream configStream(configString);
451 configStream >> simConfig;
454 std::string geomGroupName(std::string(
"/PlasCom2/Geometry/")+geometryName);
455 std::string geomGridGroupName(geomGroupName+
"/"+gridName);
461 std::string domainGroupName(std::string(
"/PlasCom2/Simulation/")+domainName);
463 std::string domainGridName(gridName);
466 std::string gridGroupName(domainGroupName+
"/"+domainGridName);
470 std::vector<size_t> partitionSizes(partInterval.Sizes());
471 std::vector<size_t> partitionStarts(partInterval.Starts());
472 std::vector<size_t> partitionBufferStarts(partitionBufferInterval.Starts());
473 std::vector<size_t>
gridSizes(inGrid.GridSizes());
474 std::vector<size_t>
bufferSizes(inGrid.BufferSizes());
477 bufferSizes,partitionBufferStarts,gridGroupName,pc2File);
483 template<
typename Gr
idType,
typename StateType,
typename ConfigType>
484 int InputSingle(
const std::string &fileName,
485 const std::string &domainName,
486 const std::string &geometryName,
487 const std::string &gridName,
490 StateType ¶mState,
492 std::ostream &outStream,
503 int myRank = gridComm.
Rank();
508 std::string configString;
509 pc2File.
ReadAttribute(
"/PlasCom2/Configuration/Parameters",configString);
510 std::istringstream configStream(configString);
511 configStream >> simConfig;
514 std::string geomGroupName(std::string(
"/PlasCom2/Geometry/")+geometryName);
515 std::string geomGridGroupName(geomGroupName+
"/"+gridName);
521 pc2File.
ReadAttribute(
"/PlasCom2/Simulation/stepNumber",&iStep);
523 std::string domainGroupName(std::string(
"/PlasCom2/Simulation/")+domainName);
525 std::string domainGridName(gridName);
528 std::string gridGroupName(domainGroupName+
"/"+domainGridName);
532 std::vector<size_t> partitionSizes(partInterval.Sizes());
533 std::vector<size_t> partitionStarts(partInterval.Starts());
534 std::vector<size_t> partitionBufferStarts(partitionBufferInterval.Starts());
535 std::vector<size_t>
gridSizes(inGrid.GridSizes());
536 std::vector<size_t>
bufferSizes(inGrid.BufferSizes());
539 bufferSizes,partitionBufferStarts,gridGroupName,pc2File);
545 template<
typename ConfigType>
546 int FileInfo(
const std::string &fileName,
549 std::ostream &outStream,
561 myRank = commPtr->Rank();
565 pc2File.
Open(fileName,commPtr);
567 pc2File.
Open(fileName);
571 std::string configString;
572 pc2File.
ReadAttribute(
"/PlasCom2/Configuration/Parameters",configString);
573 std::istringstream configStream(configString);
574 configStream >> simConfig;
586 std::ostream &infoStream);
591 std::ostream &infoStream);
597 std::ostream &infoStream);
int ReadSingle(const pcpp::io::simfileinfo &fileInfo, plascom2::grid_t &inGrid, plascom2::state_t &inState, std::ostream &infoStream)
int Remove(const std::string &fname)
int ReadAttribute(const std::string &inName, int *inBuf)
int ReadSingleState(const std::string &fileName, plascom2::grid_t &inGrid, plascom2::state_t &inState, std::ostream &infoStream)
void const size_t const size_t * gridSizes
int FileInfo(const std::string &hdfFileName, pcpp::io::simfileinfo &fileInfo, std::ostream &messageStream)
pcpp::field::metadataset ExtractDictionary(const pcpp::field::metadataset &dataDictionary, const char loc)
int WriteStateAttributes(const StateType &inState, const char attributeLocation, const std::string &filePath, base &hdfFile)
Writes state data matching attributeLocation into HDF5 attributes at filePath.
void SetMessageStream(std::ostream &outStream)
void WriteSimulationFile(const std::string &h5FileName, const std::string &gridName, const std::string &gridPath, const std::string &dataPath, const GridType &inGrid, const StateType &inState)
int OutputSingle(const std::string &fileName, const GridType &inGrid, const StateType &inState, const ConfigType &simConfig, const ConfigType &gridConfig, const ConfigType &stateConfig)
void const size_t const size_t const size_t const double const double * x
int WriteGrid(const GridType &inGrid, const std::string &gridName, const std::string &parentPath, base &hdfFile)
int PlasCom2FileInfo(pcpp::io::hdf5::base &hdf5File, simfileinfo &fileInfo, std::ostream &messageStream)
int CreateGroup(const std::string &inName)
bool FILEEXISTS(const std::string &fname)
Main encapsulation of MPI.
int ReadStateAttributes(StateType &inState, const char attributeLocation, const std::string &filePath, base &hdfFile)
Reads state data matching attributeLocation into HDF5 attributes at filePath.
void WriteDomainFile(const std::string &h5FileName, DomainType &inDomain)
void const size_t const size_t * bufferSizes
int ReadGrid(hid_t parentGroupID, const configuration &hdfConfig, const std::string &gridName, GridType &gridData, fixtures::CommunicatorType &inComm, std::ostream &messageStream)
Simple Block Structured Mesh object.
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)
int Open(const std::string &inFileName, fixtures::CommunicatorType &inComm, bool readOnly=false)
int CreateAttribute(const std::string &inName, const std::vector< size_t > &spaceDimensions, size_t sizeInBytes=8)
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)