PlasCom2  1.0
XPACC Multi-physics simluation application
PCPPUtil.C
Go to the documentation of this file.
1 #include "PCPPUtil.H"
2 #include "PCPPHDF5.H"
3 
4 namespace pcpp {
5 
6  namespace util {
7 
8 
10  const char loc)
11  {
12  pcpp::field::metadataset returnMeta;
13  pcpp::field::metadataset::const_iterator mdIt = dataDictionary.begin();
14  while(mdIt != dataDictionary.end()){
15  const pcpp::field::metadata &fieldMetaData(*mdIt++);
16  if(fieldMetaData.loc == loc)
17  returnMeta.push_back(fieldMetaData);
18  }
19  return(returnMeta);
20  };
21 
22 
23  int ErrorMetrics(int numDim,size_t numPoints,double *dataBuffer,
24  double *normData,size_t &maxErrLocation)
25  {
26 
27  normData[0] = -1.0*std::numeric_limits<double>::max();
28  normData[1] = 0.0;
29  normData[2] = 0.0;
30  normData[3] = 0.0;
31  maxErrLocation = 0;
32 
33  double &infNorm(normData[0]);
34  double &oneNorm(normData[1]);
35  double &twoNorm(normData[2]);
36  double &errSum(normData[3]);
37 
38  for(size_t iPoint = 0;iPoint < numPoints;iPoint++){
39  double dataVal = dataBuffer[iPoint];
40  double absVal = std::abs(dataVal);
41  double absVal2 = absVal*absVal;
42  errSum += dataVal;
43  oneNorm += absVal;
44  twoNorm += absVal2;
45  if(absVal > infNorm){
46  infNorm = absVal;
47  maxErrLocation = iPoint;
48  }
49  }
50 
51  twoNorm = std::sqrt(twoNorm);
52 
53  return(0);
54 
55  };
56 
57  std::string GetConfigName(const std::string &configKey,int nameDepth=0){
58 
59  std::string::size_type xLast = std::string::npos;
60  while(nameDepth-- >= 0){
61  std::string::size_type x = configKey.find(":");
62  if(x != std::string::npos)
63  xLast = x;
64  }
65  if(xLast == std::string::npos)
66  return(configKey);
67  return(configKey.substr(0,xLast));
68  }
69 
71  const std::string &configName)
72  {
73  pcpp::ConfigType subConfig;
74  pcpp::ConfigType::const_iterator configIt = inConfig.begin();
75  while(configIt != inConfig.end()){
76  std::string::size_type x = (configIt->Key()).find(configName);
77  if(x != std::string::npos)
78  subConfig.push_back(*configIt);
79  configIt++;
80  }
81  if(!subConfig.empty()){
83  nameParam.first = "ConfigName";
84  nameParam.second = configName;
85  subConfig.push_back(nameParam);
86  }
87  return(subConfig);
88  };
89 
90  pcpp::ConfigType GetSubConfig(const std::string &subConfigName,const pcpp::ConfigType &inConfig)
91  {
92  pcpp::ConfigType returnConfig;
93  const std::string subKey(subConfigName+":");
94  int numChar = subKey.size();
95  pcpp::ConfigType::const_iterator configIt = inConfig.begin();
96  while(configIt != inConfig.end()){
97  pcpp::ConfigType::ParamType configParam(*configIt++);
98  std::string::size_type x = configParam.first.find(subKey);
99  if(x == 0){
100  configParam.first.erase(x,numChar);
101  returnConfig.push_back(configParam);
102  }
103  }
104  if(!returnConfig.empty()){
105  pcpp::ConfigType::ParamType configParam;
106  configParam.first = "ConfigName";
107  configParam.second = subConfigName;
108  returnConfig.push_back(configParam);
109  }
110  return(returnConfig);
111  };
112 
114  std::vector<std::string> &inTokens)
115  {
116  if(inTokens.empty())
117  return;
118  std::vector<std::string>::iterator tokIt = inTokens.begin();
119  std::ostringstream Ostr;
120  while(tokIt != inTokens.end())
121  Ostr << *tokIt++ << " ";
122  std::istringstream Istr(Ostr.str());
123  Istr >> metaData.ncomp >> metaData.loc >> metaData.dsize;
124  if(inTokens.size() == 4)
125  Istr >> metaData.unit;
126  return;
127  };
128 
130  const std::string &dictName,
131  pcpp::field::metadataset &dataDictionary,
132  std::ostream &messageStream)
133  {
134  std::string configName(inConfig.GetValue("ConfigName"));
135  std::string solutionKey;
136  std::string stateFields(dictName+std::string(":Fields"));
137  if(!configName.empty())
138  solutionKey = configName+std::string(":")+stateFields;
139  else
140  solutionKey = stateFields;
141  std::vector<std::string> fieldNames;
142  fieldNames = inConfig.GetValueVector<std::string>(solutionKey);
143  // std::cout << "Number of field names: " << fieldNames.size() << std::endl;
144  if(fieldNames.empty()){
145  messageStream << "ConfigureMeta: Warning: No data fields configured for config("
146  << configName << ")." << std::endl;
147  return(0);
148  }
149  std::string fieldKey;
150  if(!configName.empty()){
151  fieldKey = configName+std::string(":");
152  }
153  fieldKey += std::string("Field:");
154  std::vector<std::string>::iterator fieldIt = fieldNames.begin();
155  while(fieldIt != fieldNames.end()){
156  std::string fieldName(*fieldIt++);
157  // std::cout << fieldName << std::endl;
158  std::string metaKey(fieldKey+fieldName+std::string(":Meta"));
159  // std::cout << "metaKey = " << metaKey << std::endl;
160  if(!inConfig.IsSet(metaKey)){
161  messageStream << "ConfigureMeta: Warning: no metadata for field ("
162  << fieldName << ")." << std::endl;
163  } else {
164  std::vector<std::string> metaTokens(inConfig.GetValueVector<std::string>(metaKey));
165  pcpp::field::metadata fieldMetaData;
166  GetFieldMetaFromTokens(fieldMetaData,metaTokens);
167  if(fieldMetaData.dsize <= 0 || fieldMetaData.dsize > 8){
168  messageStream << "ConfigureMeta:Warning: invalid data size for "
169  << fieldName << ", defaulting to double(8)." << std::endl;
170  fieldMetaData.dsize = 8; // default to double data
171  }
172  if(fieldMetaData.ncomp <= 0){
173  messageStream << "ConfigureMeta:Warning: invalid number of components for "
174  << fieldName << ", defaulting to scalar(1)." << std::endl;
175  fieldMetaData.ncomp = 1; // default to scalar field
176  }
177  fieldMetaData.loc = std::tolower(fieldMetaData.loc);
178  if(fieldMetaData.loc != 'n' && fieldMetaData.loc != 'c' &&
179  fieldMetaData.loc != 'm' && fieldMetaData.loc != 's' &&
180  fieldMetaData.loc != 'g' && fieldMetaData.loc != 'd'){
181  messageStream << "ConfigureMeta:Warning: invalid solution location for "
182  << fieldName << ", defaulting to nodes." << std::endl;
183  fieldMetaData.loc = 'n';
184  }
185  dataDictionary.AddField(fieldName,fieldMetaData);
186  }
187  }
188  return(0);
189  };
190 
191  std::string ConfigKey(const std::string &configName,
192  const std::string &keyName)
193  {
194  if(!configName.empty()){
195  std::ostringstream Ostr;
196  Ostr << configName << ":" << keyName;
197  return(Ostr.str());
198  } else {
199  return(keyName);
200  }
201  };
202 
203  int RecursiveReadConfiguration(const std::string &rootPath,
204  std::istream &inStream,pcpp::ConfigType &plascomConfig,
205  std::ostream &messageStream,const std::string inName)
206  {
207  int returnValue = 0;
208 
209  // Process the parent config
210  inStream >> plascomConfig;
211  if(!inName.empty()){
212  pcpp::ConfigType::iterator configIt = plascomConfig.begin();
213  while(configIt != plascomConfig.end()){
214  pcpp::ParamType &configParam(*configIt++);
215  std::string &paramKey(configParam.Key());
216  paramKey = inName+":"+paramKey;
217  }
218  }
219 
220  // Parse through config and identify any child configurations
221  // that have been specified
222  pcpp::ConfigType childFileConfig;
223  pcpp::ConfigType::iterator configIt = plascomConfig.begin();
224  while(configIt != plascomConfig.end()){
225  pcpp::ParamType &configParam(*configIt++);
226  std::string paramKey(configParam.Key());
227  std::string::size_type x = paramKey.find("ConfigFile");
228  if(x != std::string::npos){
229  messageStream << "Child configuration specified: (" << configParam.Key()
230  << " = " << configParam.Value() << ")" << std::endl;
231  childFileConfig.push_back(configParam);
232  }
233  }
234 
235  // Process all child configs recursively next
236  configIt = childFileConfig.begin();
237  while(configIt != childFileConfig.end()){
238  pcpp::ParamType &configParam(*configIt++);
239  std::string parentParamKey(configParam.Key());
240  bool isSubConfig = (parentParamKey.find("SubConfigFile")
241  != std::string::npos);
242  std::string childConfigFileName(configParam.Value());
243  std::string parentConfigName(GetConfigName(parentParamKey));
244  if(isSubConfig){
245  messageStream << "Found sub-config (parentKey,parentName,fileName) = ("
246  << parentParamKey << "," << parentConfigName << ","
247  << childConfigFileName << ")" << std::endl;
248  }
249  std::ifstream inFile;
250  if(!ix::sys::FILEEXISTS(childConfigFileName))
251  childConfigFileName = rootPath + "/" + childConfigFileName;
252  inFile.open(childConfigFileName.c_str());
253  if(!inFile){
254  returnValue++;
255  messageStream << "Unable to open child config file: "
256  << childConfigFileName << "." << std::endl;
257  } else {
258  std::string recursiveName;
259  if(isSubConfig)
260  recursiveName = parentConfigName;
261  pcpp::ConfigType childConfig;
262  if(RecursiveReadConfiguration(rootPath,inFile,childConfig,messageStream,recursiveName)){
263  returnValue++;
264  messageStream << "Errors in processing child configuration: ("
265  << configParam.Key() << "," << configParam.Value()
266  << ")" << std::endl;
267  } else {
268  if(isSubConfig){
269  pcpp::ConfigType::iterator childConfigIt = childConfig.begin();
270  while(childConfigIt != childConfig.end()){
271  pcpp::ParamType &childParam(*childConfigIt++);
272  std::string &childConfigKey(childParam.Key());
273  std::string childConfigName(GetConfigName(childConfigKey));
274  if(childConfigName != parentConfigName){
275  std::ostringstream Ostr;
276  Ostr << parentConfigName << ":" << childConfigKey;
277  childConfigKey = Ostr.str();
278  }
279  }
280  }
281  plascomConfig.insert(plascomConfig.end(),childConfig.begin(),childConfig.end());
282  }
283  inFile.close();
284  }
285  }
286 
287  // Now allow child params to overwrite parent params
288  configIt = plascomConfig.begin();
289  std::map<std::string,std::string> configMap;
290  while(configIt != plascomConfig.end()){
291  std::string configValue(configMap[configIt->first]);
292  if(!configValue.empty()){
293  messageStream << "Parameter override for (" << configIt->first
294  << "): (" << configValue << ")=>("
295  << configIt->second << ")" << std::endl;
296  }
297  configMap[configIt->first] = configIt->second;
298  configIt++;
299  }
300  plascomConfig.resize(0);
301  std::map<std::string,std::string>::iterator configMapIt = configMap.begin();
302  while(configMapIt != configMap.end()){
303  pcpp::ParamType configParam(configMapIt->first,configMapIt->second);
304  plascomConfig.push_back(configParam);
305  configMapIt++;
306  }
307  return(returnValue);
308  };
309 
310 
326  int ProcessConfigurationFile(const std::string &configFileName,
327  pcpp::ConfigType &plascomConfig,
328  pcpp::CommunicatorType &globalCommunicator,
329  std::ostream &messageStream)
330  {
331  int nParams = 0;
332  int error = 0;
333  int myRank = globalCommunicator.Rank();
334 
335  if(myRank == 0){
336  std::string fileRootPath;
337  std::string::size_type x = configFileName.find_last_of("/");
338  if(x != std::string::npos)
339  fileRootPath = configFileName.substr(0,x);
340  std::ifstream configFile;
341  configFile.open(configFileName.c_str());
342  if(!configFile){
343  messageStream << "Could not open configuration file ("
344  << configFileName << "). Aborting." << std::endl;
345  globalCommunicator.SetExit(1);
346  } else {
347  std::ostringstream Ostr;
348  if(RecursiveReadConfiguration(fileRootPath,configFile,plascomConfig,Ostr)){
349  messageStream << "Errors processing configuration:" << std::endl
350  << Ostr.str() << "Aborting." << std::endl;
351  globalCommunicator.SetExit(1);
352  } else {
353  std::string configMessages(Ostr.str());
354  if(!configMessages.empty()){
355  messageStream << Ostr.str();
356  pcpp::io::RenewStream(Ostr);
357  }
358  configFile.close();
359  nParams = plascomConfig.size();
360  Ostr << "Read " << nParams << " configuration parameters "
361  << "from " << configFileName << "." << std::endl;
362  messageStream << Ostr.str();
363  }
364  }
365  }
366  if(globalCommunicator.Check())
367  error = 1;
368  if(!error){
369  if(myRank != 0){
370  plascomConfig.resize(0);
371  };
372  globalCommunicator.BroadCast(&plascomConfig,0);
373  std::ostringstream Ostr;
374  Ostr << "Configuration Parameters:" << std::endl
375  << plascomConfig << std::endl;
376  messageStream << Ostr.str();
377  }
378  return(error);
379  };
380 
381 
396  int ProcessConfigurationRestart(const std::string &restartFileName,
397  pcpp::ConfigType &inConfig,
398  pcpp::CommunicatorType &configCommunicator,
399  std::ostream &messageStream)
400  {
401  int nParams = inConfig.size();
402  int error = 0;
403  int myRank = configCommunicator.Rank();
404 
405  if(myRank == 0){
406  pcpp::io::hdf5::base hdf5File;
407  if(!ix::sys::FILEEXISTS(restartFileName)){
408  messageStream << "Error: Could not file restart file ("
409  << restartFileName << ")." << std::endl;
410  configCommunicator.SetErr(1);
411  } else {
412  if(hdf5File.Open(restartFileName,true)){
413  messageStream << "Error: Failed to open file ("
414  << restartFileName << ")." << std::endl;
415  configCommunicator.SetErr(1);
416  } else {
417  if(!hdf5File.AttributeExists("/PlasCom2/Configuration/Parameters")){
418  configCommunicator.SetErr(1);
419  } else {
420  std::string configString;
421  hdf5File.ReadAttribute("/PlasCom2/Configuration/Parameters",configString);
422  hdf5File.Close();
423  std::istringstream configStream(configString);
424  inConfig.ReadFromStream(configStream);
425  nParams = inConfig.size() - nParams;
426  messageStream << "Read " << nParams << " parameters from restart file ("
427  << restartFileName << ")." << std::endl;
428  }
429  }
430  }
431  }
432  if(configCommunicator.Check())
433  error = 1;
434  if(!error){
435  if(myRank != 0){
436  inConfig.resize(0);
437  };
438  configCommunicator.BroadCast(&inConfig,0);
439  std::ostringstream Ostr;
440  Ostr << "Configuration Parameters:" << std::endl
441  << inConfig << std::endl;
442  messageStream << Ostr.str();
443  }
444  return(error);
445  };
446  }
447 }
void const size_t * numPoints
Definition: EulerKernels.H:10
int ReadAttribute(const std::string &inName, int *inBuf)
Definition: PCPPHDF5.C:1029
std::string GetConfigName(const std::string &configKey, int nameDepth=0)
Definition: PCPPUtil.C:57
void AddField(const std::string &name, char loc, unsigned int ncomp, unsigned int dsize, const std::string &unit)
void GetFieldMetaFromTokens(pcpp::field::metadata &metaData, std::vector< std::string > &inTokens)
Definition: PCPPUtil.C:113
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
void RenewStream(std::ostringstream &outStream)
pcpp::field::metadataset ExtractDictionary(const pcpp::field::metadataset &dataDictionary, const char loc)
Definition: PCPPUtil.C:9
int SetErr(int errin)
Definition: COMM.H:110
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
void const size_t const size_t const size_t const double const double * x
bool AttributeExists(const std::string &inName)
Definition: PCPPHDF5.C:852
int ErrorMetrics(int numDim, size_t numPoints, double *dataBuffer, double *normData, size_t &maxErrLocation)
Definition: PCPPUtil.C:23
int Check(comm::Ops op=comm::MAXOP)
Definition: COMM.C:355
bool FILEEXISTS(const std::string &fname)
Definition: UnixUtils.C:189
pcpp::ConfigType ExtractConfigParams(const fixtures::ConfigurationType &inConfig, const std::string &configName)
Definition: PCPPUtil.C:70
Main encapsulation of MPI.
Definition: COMM.H:62
std::string GetValue(const std::string &key) const
Definition: Parameters.C:24
std::vector< std::string > GetValueVector(const std::string &key) const
Definition: Parameters.C:36
std::string ConfigKey(const std::string &configName, const std::string &keyName)
Definition: PCPPUtil.C:191
Definition: EulerRHS.H:33
int SetExit(int errin)
Definition: COMM.H:109
int RecursiveReadConfiguration(const std::string &currentPath, std::istream &inStream, pcpp::ConfigType &plascomConfig, std::ostream &messageStream, const std::string="")
Definition: PCPPUtil.C:203
pcpp::ConfigType GetSubConfig(const std::string &configName, const pcpp::ConfigType &plascomConfig)
Definition: PCPPUtil.C:90
int Open(const std::string &inFileName, fixtures::CommunicatorType &inComm, bool readOnly=false)
Definition: PCPPHDF5.H:275
Simple key-value pair.
bool IsSet(const std::string &Key) const
Definition: Parameters.C:115
int BroadCast(std::string &sval, int root_rank=0)
Definition: COMM.C:437
virtual std::istream & ReadFromStream(std::istream &Is)
Definition: Parameters.C:49
int ConfigureDataDictionary(pcpp::ConfigType &inConfig, const std::string &dictName, pcpp::field::metadataset &dataDictionary, std::ostream &messageStream)
Definition: PCPPUtil.C:129