13 pcpp::field::metadataset::const_iterator mdIt = dataDictionary.begin();
14 while(mdIt != dataDictionary.end()){
16 if(fieldMetaData.
loc == loc)
17 returnMeta.push_back(fieldMetaData);
24 double *normData,
size_t &maxErrLocation)
27 normData[0] = -1.0*std::numeric_limits<double>::max();
33 double &infNorm(normData[0]);
34 double &oneNorm(normData[1]);
35 double &twoNorm(normData[2]);
36 double &errSum(normData[3]);
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;
47 maxErrLocation = iPoint;
51 twoNorm = std::sqrt(twoNorm);
57 std::string
GetConfigName(
const std::string &configKey,
int nameDepth=0){
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)
65 if(xLast == std::string::npos)
67 return(configKey.substr(0,xLast));
71 const std::string &configName)
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);
81 if(!subConfig.empty()){
83 nameParam.first =
"ConfigName";
84 nameParam.second = configName;
85 subConfig.push_back(nameParam);
93 const std::string subKey(subConfigName+
":");
94 int numChar = subKey.size();
95 pcpp::ConfigType::const_iterator configIt = inConfig.begin();
96 while(configIt != inConfig.end()){
98 std::string::size_type
x = configParam.first.find(subKey);
100 configParam.first.erase(x,numChar);
101 returnConfig.push_back(configParam);
104 if(!returnConfig.empty()){
106 configParam.first =
"ConfigName";
107 configParam.second = subConfigName;
108 returnConfig.push_back(configParam);
110 return(returnConfig);
114 std::vector<std::string> &inTokens)
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());
124 if(inTokens.size() == 4)
125 Istr >> metaData.
unit;
130 const std::string &dictName,
132 std::ostream &messageStream)
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;
140 solutionKey = stateFields;
141 std::vector<std::string> fieldNames;
144 if(fieldNames.empty()){
145 messageStream <<
"ConfigureMeta: Warning: No data fields configured for config(" 146 << configName <<
")." << std::endl;
149 std::string fieldKey;
150 if(!configName.empty()){
151 fieldKey = configName+std::string(
":");
153 fieldKey += std::string(
"Field:");
154 std::vector<std::string>::iterator fieldIt = fieldNames.begin();
155 while(fieldIt != fieldNames.end()){
156 std::string fieldName(*fieldIt++);
158 std::string metaKey(fieldKey+fieldName+std::string(
":Meta"));
160 if(!inConfig.
IsSet(metaKey)){
161 messageStream <<
"ConfigureMeta: Warning: no metadata for field (" 162 << fieldName <<
")." << std::endl;
164 std::vector<std::string> metaTokens(inConfig.
GetValueVector<std::string>(metaKey));
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;
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;
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';
185 dataDictionary.
AddField(fieldName,fieldMetaData);
192 const std::string &keyName)
194 if(!configName.empty()){
195 std::ostringstream Ostr;
196 Ostr << configName <<
":" << keyName;
205 std::ostream &messageStream,
const std::string inName)
210 inStream >> plascomConfig;
212 pcpp::ConfigType::iterator configIt = plascomConfig.begin();
213 while(configIt != plascomConfig.end()){
215 std::string ¶mKey(configParam.
Key());
216 paramKey = inName+
":"+paramKey;
223 pcpp::ConfigType::iterator configIt = plascomConfig.begin();
224 while(configIt != plascomConfig.end()){
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);
236 configIt = childFileConfig.begin();
237 while(configIt != childFileConfig.end()){
239 std::string parentParamKey(configParam.
Key());
240 bool isSubConfig = (parentParamKey.find(
"SubConfigFile")
241 != std::string::npos);
242 std::string childConfigFileName(configParam.
Value());
245 messageStream <<
"Found sub-config (parentKey,parentName,fileName) = (" 246 << parentParamKey <<
"," << parentConfigName <<
"," 247 << childConfigFileName <<
")" << std::endl;
249 std::ifstream inFile;
251 childConfigFileName = rootPath +
"/" + childConfigFileName;
252 inFile.open(childConfigFileName.c_str());
255 messageStream <<
"Unable to open child config file: " 256 << childConfigFileName <<
"." << std::endl;
258 std::string recursiveName;
260 recursiveName = parentConfigName;
264 messageStream <<
"Errors in processing child configuration: (" 265 << configParam.
Key() <<
"," << configParam.
Value()
269 pcpp::ConfigType::iterator childConfigIt = childConfig.begin();
270 while(childConfigIt != childConfig.end()){
272 std::string &childConfigKey(childParam.
Key());
274 if(childConfigName != parentConfigName){
275 std::ostringstream Ostr;
276 Ostr << parentConfigName <<
":" << childConfigKey;
277 childConfigKey = Ostr.str();
281 plascomConfig.insert(plascomConfig.end(),childConfig.begin(),childConfig.end());
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;
297 configMap[configIt->first] = configIt->second;
300 plascomConfig.resize(0);
301 std::map<std::string,std::string>::iterator configMapIt = configMap.begin();
302 while(configMapIt != configMap.end()){
304 plascomConfig.push_back(configParam);
329 std::ostream &messageStream)
333 int myRank = globalCommunicator.
Rank();
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());
343 messageStream <<
"Could not open configuration file (" 344 << configFileName <<
"). Aborting." << std::endl;
347 std::ostringstream Ostr;
349 messageStream <<
"Errors processing configuration:" << std::endl
350 << Ostr.str() <<
"Aborting." << std::endl;
353 std::string configMessages(Ostr.str());
354 if(!configMessages.empty()){
355 messageStream << Ostr.str();
359 nParams = plascomConfig.size();
360 Ostr <<
"Read " << nParams <<
" configuration parameters " 361 <<
"from " << configFileName <<
"." << std::endl;
362 messageStream << Ostr.str();
366 if(globalCommunicator.
Check())
370 plascomConfig.resize(0);
372 globalCommunicator.
BroadCast(&plascomConfig,0);
373 std::ostringstream Ostr;
374 Ostr <<
"Configuration Parameters:" << std::endl
375 << plascomConfig << std::endl;
376 messageStream << Ostr.str();
399 std::ostream &messageStream)
401 int nParams = inConfig.size();
403 int myRank = configCommunicator.
Rank();
408 messageStream <<
"Error: Could not file restart file (" 409 << restartFileName <<
")." << std::endl;
410 configCommunicator.
SetErr(1);
412 if(hdf5File.
Open(restartFileName,
true)){
413 messageStream <<
"Error: Failed to open file (" 414 << restartFileName <<
")." << std::endl;
415 configCommunicator.
SetErr(1);
418 configCommunicator.
SetErr(1);
420 std::string configString;
421 hdf5File.
ReadAttribute(
"/PlasCom2/Configuration/Parameters",configString);
423 std::istringstream configStream(configString);
425 nParams = inConfig.size() - nParams;
426 messageStream <<
"Read " << nParams <<
" parameters from restart file (" 427 << restartFileName <<
")." << std::endl;
432 if(configCommunicator.
Check())
438 configCommunicator.
BroadCast(&inConfig,0);
439 std::ostringstream Ostr;
440 Ostr <<
"Configuration Parameters:" << std::endl
441 << inConfig << std::endl;
442 messageStream << Ostr.str();
void const size_t * numPoints
int ReadAttribute(const std::string &inName, int *inBuf)
std::string GetConfigName(const std::string &configKey, int nameDepth=0)
void GetFieldMetaFromTokens(pcpp::field::metadata &metaData, std::vector< std::string > &inTokens)
int ProcessConfigurationFile(const std::string &configFileName, pcpp::ConfigType &plascomConfig, pcpp::CommunicatorType &globalCommunicator, std::ostream &messageStream)
Populate a configuration object from file in parallel.
void RenewStream(std::ostringstream &outStream)
pcpp::field::metadataset ExtractDictionary(const pcpp::field::metadataset &dataDictionary, const char loc)
int ProcessConfigurationRestart(const std::string &restartFileName, pcpp::ConfigType &inConfig, pcpp::CommunicatorType &configCommunicator, std::ostream &messageStream)
Populate a configuration object from an HDF5 restart file.
void const size_t const size_t const size_t const double const double * x
bool AttributeExists(const std::string &inName)
int ErrorMetrics(int numDim, size_t numPoints, double *dataBuffer, double *normData, size_t &maxErrLocation)
int Check(comm::Ops op=comm::MAXOP)
bool FILEEXISTS(const std::string &fname)
pcpp::ConfigType ExtractConfigParams(const fixtures::ConfigurationType &inConfig, const std::string &configName)
Main encapsulation of MPI.
std::string GetValue(const std::string &key) const
std::vector< std::string > GetValueVector(const std::string &key) const
std::string ConfigKey(const std::string &configName, const std::string &keyName)
int RecursiveReadConfiguration(const std::string ¤tPath, std::istream &inStream, pcpp::ConfigType &plascomConfig, std::ostream &messageStream, const std::string="")
pcpp::ConfigType GetSubConfig(const std::string &configName, const pcpp::ConfigType &plascomConfig)
int Open(const std::string &inFileName, fixtures::CommunicatorType &inComm, bool readOnly=false)
bool IsSet(const std::string &Key) const
int BroadCast(std::string &sval, int root_rank=0)
virtual std::istream & ReadFromStream(std::istream &Is)
int ConfigureDataDictionary(pcpp::ConfigType &inConfig, const std::string &dictName, pcpp::field::metadataset &dataDictionary, std::ostream &messageStream)