PlasCom2  1.0
XPACC Multi-physics simluation application
PC2Util.C
Go to the documentation of this file.
1 #include <set>
2 
3 #include "PC2Util.H"
4 #include "NavierStokesBC.H"
6 
7 
8 using namespace simulation::domain::boundary;
9 
10 namespace plascom2 {
11  namespace util {
12 
13  inline int SymmetricElementID(int numDim,int i,int j)
14  {
15  int elementId = i*j;
16  if(elementId <= numDim)
17  return(elementId);
18  int testId = elementId/numDim;
19  if(testId < 2)
20  return(elementId);
21  if(testId == 2)
22  return(elementId - 1);
23  return(elementId - numDim);
24  }
25 
30  int PC2Compare(const std::string &redFileName,const std::string &blueFileName,
31  double errTolerance,std::ostream &outStream)
32  {
33 
34  std::ostringstream errStream;
35  pcpp::io::simfileinfo redFileInfo;
36  pcpp::io::simfileinfo blueFileInfo;
38  pcpp::CommunicatorType* commPtr = NULL;
39 
40 #ifdef ENABLE_HDF5
41  if(pcpp::io::hdf5::FileInfo(redFileName,redFileInfo,errStream)){
42  std::cerr << "ERROR: FileInfo failed for " << redFileName
43  << ".\nHDF5 messages:"
44  << errStream.str() << std::endl;
45  return(-1);
46  }
47  if(pcpp::io::hdf5::FileInfo(blueFileName,blueFileInfo,errStream)){
48  std::cerr << "ERROR: FileInfo failed for " << blueFileName
49  << ".\nHDF5 messages:"
50  << errStream.str() << std::endl;
51  return(-1);
52  }
53 #else
54  return(-1);
55 #endif
56 
57  std::ostringstream infoStream;
58  infoStream << "--------- File1 (Red) -----------" << std::endl;
59  pcpp::report::SimFileInfo(infoStream,redFileInfo);
60  infoStream << "--------- File2 (Blue) -----------" << std::endl;
61  pcpp::report::SimFileInfo(infoStream,blueFileInfo);
62  outStream << infoStream.str() << std::endl;
63 
64  std::ostringstream processingStream;
65  if(!pcpp::io::Compatible(redFileInfo,blueFileInfo,processingStream)){
66  processingStream << "Error: Files are not compatible or cannot be processed." << std::endl;
67  std::cerr << processingStream.str() << std::endl;
68  return(-1);
69  }
70 
71  int numGrids = redFileInfo.numGrids;
72  for(int iGrid = 0;iGrid < numGrids;iGrid++){
73 
74  plascom2::grid_t redGrid;
75  plascom2::state_t redFileState;
76  if(plascom2::io::hdf5::ReadSingle(redFileInfo,iGrid,redGrid,redFileState,processingStream)){
77  processingStream << "Error: Could not get state and grid from " << redFileInfo.fileName
78  << std::endl;
79  std::cerr << processingStream.str() << std::endl;
80  return(-1);
81  }
82 
83  // Debugging
84  // std::ostringstream stateReportStream;
85  // redFileState.Report(stateReportStream);
86  // outStream << "Red State Report: " << std::endl
87  // << stateReportStream.str() << std::endl;
88  // pcpp::io::RenewStream(stateReportStream);
89 
90  plascom2::grid_t blueGrid;
91  plascom2::state_t blueFileState;
92  if(plascom2::io::hdf5::ReadSingle(blueFileInfo,iGrid,blueGrid,blueFileState,processingStream)){
93  processingStream << "Error: Could not get state and grid from " << blueFileInfo.fileName
94  << std::endl;
95  std::cerr << processingStream.str() << std::endl;
96  return(-1);
97  }
98 
99  bool anyTest = false;
100  bool gridTestPassed = true;
101 
102 
103  std::vector<double> gridDiffNormData(4,0.0);
104  int numDim = 1;
105  size_t numPoints = 1;
106  size_t numPoints2 = 1;
107  numDim = redFileInfo.gridNumDimensions[0];
108  const std::vector<double> &coordinateData1(redGrid.CoordinateData());
109  const std::vector<double> &coordinateData2(blueGrid.CoordinateData());
110  numPoints = coordinateData1.size()/numDim;
111  numPoints2 = coordinateData2.size()/numDim;
112  // outStream << "Number of Points: " << numPoints << std::endl;
113  if(numPoints != numPoints2){
114  outStream << "Incompatible grid sizes: Red(" << numPoints
115  << ") != Blue(" << numPoints2 << ")"
116  << std::endl;
117  return(-1);
118  }
119 
120  if(redFileInfo.formatBits.test(pcpp::io::HASGRID) &&
121  blueFileInfo.formatBits.test(pcpp::io::HASGRID)){
122 
123  // Debugging
124  // blueFileState.Report(stateReportStream);
125  // outStream << "Blue State Report: " << std::endl
126  // << stateReportStream.str() << std::endl;
127  // pcpp::io::RenewStream(stateReportStream);
128 
129  std::vector<double> &normData(gridDiffNormData);
130 
131  anyTest = true;
132 
133  std::vector<double> gridDiff(numPoints*numDim,0);
134  std::vector<double>::iterator gridDiffIt = gridDiff.begin();
135  std::vector<double>::const_iterator redGridIt = coordinateData1.begin();
136  std::vector<double>::const_iterator blueGridIt = coordinateData2.begin();
137  while(gridDiffIt != gridDiff.end())
138  *gridDiffIt++ = *redGridIt++ - *blueGridIt++;
139 
140  size_t maxErrLocation = 0;
141  outStream << "# (Red Grid - Blue Grid):" << std::endl;
142  outStream << "# Coordinate 1-Norm 2-Norm inf-Norm Sum" << std::endl;
143  for(int iDim = 0;iDim < numDim;iDim++){
144  pcpp::util::ErrorMetrics(numDim,numPoints,&gridDiff[iDim*numPoints],&normData[0],maxErrLocation);
145  outStream << iDim+1 << " " << normData[1] << " " << normData[2]
146  << " " << normData[0] << " " << normData[3] << std::endl;
147  if(normData[0] > errTolerance)
148  gridTestPassed = false;
149 
150  }
151  } else {
152  outStream << "One or more grids not present, grid test skipped." << std::endl;
153  }
154 
155 
156  bool stateTestPassed = true;
157 
158  if(redFileInfo.formatBits.test(pcpp::io::HASSTATE) &&
159  blueFileInfo.formatBits.test(pcpp::io::HASSTATE)){
160 
161  anyTest = true;
162 
163  std::vector<std::string> stateFields;
164 
165  stateFields.push_back("rho");
166  stateFields.push_back("rhoV");
167  stateFields.push_back("rhoE");
168  stateFields.push_back("scalarVars");
169 
170  plascom2::state_t &redState(redFileState);
171  plascom2::state_t &blueState(blueFileState);
172 
173  std::vector<double> redNormData(4,0.0);
174  std::vector<double> blueNormData(4,0.0);
175  std::vector<double> diffNormData(4,0.0);
176 
177  if(redFileInfo.formatBits.test(pcpp::io::ISLEGACY)){
178  simulation::state::ConvertLegacyState(numDim,numPoints,redState);
179  }
180  if(blueFileInfo.formatBits.test(pcpp::io::ISLEGACY)){
181  simulation::state::ConvertLegacyState(numDim,numPoints,blueState);
182  }
183 
184  int numFields1 = redState.SetStateFields(stateFields);
185  int numFields2 = blueState.SetStateFields(stateFields);
186 
187  std::ostringstream stateReportStream;
188  redState.Report(stateReportStream);
189  outStream << "Red State Report: " << std::endl
190  << stateReportStream.str() << std::endl;
191  pcpp::io::RenewStream(stateReportStream);
192 
193  blueState.Report(stateReportStream);
194  outStream << "Blue State Report: " << std::endl
195  << stateReportStream.str() << std::endl;
196  pcpp::io::RenewStream(stateReportStream);
197 
198  std::ostringstream stateValidationStream;
199  if(euler::util::ValidateState(redState,blueState,stateValidationStream)){
200  outStream << "Red state invalid: " << std::endl
201  << stateValidationStream.str()
202  << std::endl;
203  return(-1);
204  }
205  if(euler::util::ValidateState(blueState,redState,stateValidationStream)){
206  outStream << "Blue state invalid: " << std::endl
207  << stateValidationStream.str()
208  << std::endl;
209  return(-1);
210  }
211 
212  {
213 
214  double *rhoErr = redState.template GetFieldBuffer<double>("rho");
215  double *rhoVErr = redState.template GetFieldBuffer<double>("rhoV");
216  double *rhoEErr = redState.template GetFieldBuffer<double>("rhoE");
217 
218  int numScalars = 0;
219  int scalarHandle = redState.GetDataIndex("scalarVars");
220  double *scalarVarsErr = NULL;
221  if(scalarHandle >= 0){
222  scalarVarsErr = redState.template GetFieldBuffer<double>("scalarVars");
223  numScalars = redState.Meta()[scalarHandle].ncomp;
224  }
225  //double *scalarPtr = scalarData.Data<double>();
226  //pcpp::field::dataset::DataBufferType &scalarData(inState.Field(scalarHandle));
227 
228  size_t maxErrLocation = 0;
229 
230  outStream << "# Red State Metrics:" << std::endl;
231  outStream << "# Field 1-Norm 2-Norm inf-Norm Sum" << std::endl;
232  pcpp::util::ErrorMetrics(numDim,numPoints,rhoErr,&redNormData[0],maxErrLocation);
233  outStream << "rho " << redNormData[1] << " " << redNormData[2]
234  << " " << redNormData[0] << " " << redNormData[3] << std::endl;
235  for(int iDim = 0;iDim < numDim;iDim++){
236  pcpp::util::ErrorMetrics(numDim,numPoints,&rhoVErr[iDim*numPoints],&redNormData[0],maxErrLocation);
237  outStream << "rhoV-" << iDim+1 << " " << redNormData[1] << " " << redNormData[2]
238  << " " << redNormData[0] << " " << redNormData[3] << std::endl;
239  }
240  pcpp::util::ErrorMetrics(numDim,numPoints,rhoEErr,&redNormData[0],maxErrLocation);
241  outStream << "rhoE " << redNormData[1] << " " << redNormData[2]
242  << " " << redNormData[0] << " " << redNormData[3] << std::endl;
243  for(int iScalar = 0;iScalar < numScalars;iScalar++){
244  pcpp::util::ErrorMetrics(numScalars,numPoints,&scalarVarsErr[iScalar*numPoints],
245  &redNormData[0],maxErrLocation);
246  outStream << "scalarVars-" << iScalar+1 << " " << redNormData[1]
247  << " " << redNormData[2] << " " << redNormData[0]
248  << " " << redNormData[3] << std::endl;
249  }
250 
251  rhoErr = blueState.template GetFieldBuffer<double>("rho");
252  rhoVErr = blueState.template GetFieldBuffer<double>("rhoV");
253  rhoEErr = blueState.template GetFieldBuffer<double>("rhoE");
254  numScalars = 0;
255  scalarHandle = blueState.GetDataIndex("scalarVars");
256  scalarVarsErr = NULL;
257  if(scalarHandle >= 0){
258  scalarVarsErr = blueState.template GetFieldBuffer<double>("scalarVars");
259  numScalars = blueState.Meta()[scalarHandle].ncomp;
260  }
261 
262  outStream << std::endl << std::endl
263  << "# Blue State Metrics:" << std::endl;
264  outStream << "# Field 1-Norm 2-Norm inf-Norm Sum" << std::endl;
265  pcpp::util::ErrorMetrics(numDim,numPoints,rhoErr,&blueNormData[0],maxErrLocation);
266  outStream << "rho " << blueNormData[1] << " " << blueNormData[2]
267  << " " << blueNormData[0] << " " << blueNormData[3] << std::endl;
268  for(int iDim = 0;iDim < numDim;iDim++){
269  pcpp::util::ErrorMetrics(numDim,numPoints,&rhoVErr[iDim*numPoints],
270  &blueNormData[0],maxErrLocation);
271  outStream << "rhoV-" << iDim+1 << " " << blueNormData[1] << " " << blueNormData[2]
272  << " " << blueNormData[0] << " " << blueNormData[3] << std::endl;
273  }
274 
275  pcpp::util::ErrorMetrics(numDim,numPoints,rhoEErr,&blueNormData[0],maxErrLocation);
276  outStream << "rhoE " << blueNormData[1] << " " << blueNormData[2]
277  << " " << blueNormData[0] << " " << blueNormData[3] << std::endl;
278  for(int iScalar = 0;iScalar < numScalars;iScalar++){
279  pcpp::util::ErrorMetrics(numScalars,numPoints,&scalarVarsErr[iScalar*numPoints],
280  &blueNormData[0],maxErrLocation);
281  outStream << "scalarVars-" << iScalar+1 << " " << blueNormData[1]
282  << " " << blueNormData[2] << " " << blueNormData[0]
283  << " " << blueNormData[3] << std::endl;
284  }
285  }
286 
287  plascom2::state_t diffState(redState);
288  diffState -= blueState;
289 
290 
291  double *rhoErr = diffState.template GetFieldBuffer<double>("rho");
292  double *rhoVErr = diffState.template GetFieldBuffer<double>("rhoV");
293  double *rhoEErr = diffState.template GetFieldBuffer<double>("rhoE");
294  int numScalars = 0;
295  int scalarHandle = diffState.GetDataIndex("scalarVars");
296  double *scalarVarsErr = NULL;
297  if(scalarHandle >= 0){
298  scalarVarsErr = diffState.template GetFieldBuffer<double>("scalarVars");
299  numScalars = diffState.Meta()[scalarHandle].ncomp;
300  }
301 
302  size_t maxErrLocation = 0;
303 
304  outStream << std::endl;
305  outStream << "# (Red - Blue) State Metrics (Absolute): " << std::endl;
306  outStream << "# Field 1-Norm 2-Norm inf-Norm Sum" << std::endl;
307  pcpp::util::ErrorMetrics(numDim,numPoints,rhoErr,&diffNormData[0],maxErrLocation);
308  outStream << "rho " << diffNormData[1] << " " << diffNormData[2]
309  << " " << diffNormData[0] << " " << diffNormData[3] << std::endl;
310  if(std::abs(blueNormData[0]) > 0.0){
311  if(std::abs(diffNormData[0])/std::abs(blueNormData[0]) > errTolerance ||
312  std::isnan(diffNormData[0]) || std::isinf(diffNormData[0])) stateTestPassed = false;
313  } else {
314  if(std::abs(diffNormData[0]) > errTolerance ||
315  std::isnan(diffNormData[0]) || std::isinf(diffNormData[0])) stateTestPassed = false;
316  }
317 
318  for(int iDim = 0;iDim < numDim;iDim++){
319  pcpp::util::ErrorMetrics(numDim,numPoints,&rhoVErr[iDim*numPoints],
320  &diffNormData[0],maxErrLocation);
321  outStream << "rhoV-" << iDim+1 << " " << diffNormData[1] << " " << diffNormData[2]
322  << " " << diffNormData[0] << " " << diffNormData[3] << std::endl;
323 
324  if(std::abs(blueNormData[0]) > 0.0){
325  if(std::abs(diffNormData[0])/std::abs(blueNormData[0]) > errTolerance ||
326  std::isnan(diffNormData[0]) || std::isinf(diffNormData[0])) stateTestPassed = false;
327  } else {
328  if(std::abs(diffNormData[0]) > errTolerance ||
329  std::isnan(diffNormData[0]) || std::isinf(diffNormData[0])) stateTestPassed = false;
330  }
331  }
332 
333 
334  pcpp::util::ErrorMetrics(numDim,numPoints,rhoEErr,&diffNormData[0],maxErrLocation);
335  outStream << "rhoE " << diffNormData[1] << " " << diffNormData[2]
336  << " " << diffNormData[0] << " " << diffNormData[3] << std::endl;
337 
338  if(std::abs(blueNormData[0]) > 0.0){
339  if(std::abs(diffNormData[0])/std::abs(blueNormData[0]) > errTolerance ||
340  std::isnan(diffNormData[0]) || std::isinf(diffNormData[0])) stateTestPassed = false;
341  } else {
342  if(std::abs(diffNormData[0]) > errTolerance ||
343  std::isnan(diffNormData[0]) || std::isinf(diffNormData[0])) stateTestPassed = false;
344  }
345 
346  for(int iScalar = 0;iScalar < numScalars;iScalar++){
347  pcpp::util::ErrorMetrics(numScalars,numPoints,&scalarVarsErr[iScalar*numPoints],
348  &diffNormData[0],maxErrLocation);
349  outStream << "scalarVars-" << iScalar+1 << " " << diffNormData[1]
350  << " " << diffNormData[2] << " " << diffNormData[0]
351  << " " << diffNormData[3] << std::endl;
352 
353  if(std::abs(blueNormData[0]) > 0.0){
354  if(std::abs(diffNormData[0])/std::abs(blueNormData[0]) > errTolerance ||
355  std::isnan(diffNormData[0]) || std::isinf(diffNormData[0])) stateTestPassed = false;
356  } else {
357  if(std::abs(diffNormData[0]) > errTolerance ||
358  std::isnan(diffNormData[0]) || std::isinf(diffNormData[0])) stateTestPassed = false;
359  }
360  }
361 
362  } else {
363  outStream << "One or more states not present, state test skipped." << std::endl;
364  }
365 
366  if(!stateTestPassed)
367  outStream << "Two states were not equivalent within tolerance." << std::endl;
368  if(!gridTestPassed)
369  outStream << "Two grids were not equivalent within tolerance." << std::endl;
370 
371  if(!stateTestPassed || !gridTestPassed || !anyTest)
372  return(1);
373  }
374 
375  return(0);
376  };
377 
378  bool operator==(const legacybc &lhs,const legacybc &rhs)
379  {
380  if(lhs.gridID != rhs.gridID ||
381  lhs.bcType != rhs.bcType ||
382  lhs.bcDir != rhs.bcDir)
383  return(false);
384  for(int iVal = 0;iVal < 6;iVal++)
385  if(lhs.bcInterval[iVal] != rhs.bcInterval[iVal])
386  return(false);
387  return(true);
388  };
389  bool operator!=(const legacybc &lhs,const legacybc &rhs)
390  {
391  return(!(lhs==rhs));
392  };
393  std::ostream &operator<<(std::ostream &outStream,const legacybc &bcData)
394  {
395  outStream << bcData.gridID << " " << bcData.bcType << " " << bcData.bcDir
396  << " " << bcData.bcInterval[0] << " " << bcData.bcInterval[1]
397  << " " << bcData.bcInterval[2] << " " << bcData.bcInterval[3]
398  << " " << bcData.bcInterval[4] << " " << bcData.bcInterval[5];
399  return(outStream);
400  };
401 
402  std::istream &operator>>(std::istream &inStream,legacybc &bcData)
403  {
404  inStream >> bcData.gridID >> bcData.bcType >> bcData.bcDir
405  >> bcData.bcInterval[0] >> bcData.bcInterval[1]
406  >> bcData.bcInterval[2] >> bcData.bcInterval[3]
407  >> bcData.bcInterval[4] >> bcData.bcInterval[5];
408  return(inStream);
409  };
410 
411  int ReadLegacyBCDat(const std::string &bcFileName,std::vector<legacybc> &bcDat,
412  fixtures::CommunicatorType &inCommunicator,std::ostream &messageStream)
413  {
414  int myRank = inCommunicator.Rank();
415  int returnStatus = 0;
416  std::string bcString;
417  if(myRank == 0){
418  std::ifstream Inf;
419  std::ostringstream Ostr;
420  Inf.open(bcFileName.c_str());
421  if(!Inf){
422  messageStream << "Error: Could not open legacy BC data file ("
423  << bcFileName << "). Aborting read." << std::endl;
424  inCommunicator.SetErr(1);
425  } else {
426  std::string bcLine;
427  while(std::getline(Inf,bcLine)){
428  std::string::size_type x = bcLine.find("#");
429  if(x == 0)
430  continue;
431  if(x != std::string::npos){
432  bcLine = bcLine.substr(0,x);
433  }
434  if(bcLine.empty())
435  continue;
436  std::istringstream Istr(bcLine);
437  legacybc myBc;
438  Istr >> myBc;
439  Ostr << myBc << std::endl;
440  }
441  bcString = Ostr.str();
442  }
443  }
444  if(inCommunicator.Check())
445  returnStatus = 1;
446  if(!returnStatus){
447  inCommunicator.BroadCast(bcString);
448  std::string bcLine;
449  std::istringstream Istr(bcString);
450  while(std::getline(Istr,bcLine)){
451  legacybc myBC;
452  std::istringstream bcInStr(bcLine);
453  bcInStr >> myBC;
454  bcDat.push_back(myBC);
455  }
456  }
457  return(returnStatus);
458  }
459 
460  // # shock capturing
461  // # SHOCK_CAPTURE = TRUE : Updated Kawai & Lele (See Kawai, Shankar, Lele, JCP, 2010)
462  // SHOCK_CAPTURE = FALSE
463  // SHOCK_CAPTURE_HyperCmu = 0.002
464  // SHOCK_CAPTURE_HyperCbeta = 1.75
465  // SHOCK_CAPTURE_HyperCKappa = 0.01
466  // SHOCK_CAPTURE_CLIP = .FALSE.
467  // # sponge zone
468  // SPONGE_AMP = 10.
469  // SPONGE_POW = 2
470 
472  fixtures::CommunicatorType &inCommunicator,
473  std::ostream &messageStream)
474  {
475  int myRank = inCommunicator.Rank();
476 
477 
479 
480  inConfig.SetParameter("PlasCom2:RunMode","PC2");
481  inConfig.SetParameter("Domain:Names","PlasComCM");
482 
483  const std::string geomName("cmgeom");
484  inConfig.SetParameter("Geometry:Names",geomName);
485 
486  double bcWallTemp = 298.0;
487  double tempRef = 298.0;
488  if(inConfig.IsSet("TEMPERATURE_REFERENCE"))
489  tempRef = inConfig.GetValue<double>("TEMPERATURE_REFERENCE");
490  if(inConfig.IsSet("BCIC_WALL_TEMP"))
491  bcWallTemp = inConfig.GetValue<double>("BCIC_WALL_TEMP");
492  else
493  bcWallTemp = tempRef;
494 
495  inConfig.ResetKey("NSTEPMAX","PlasCom2:NumSteps");
496  inConfig.ResetKey("NRESTART","PlasCom2:NumStepsIO");
497  inConfig.ResetKey("NOUTPUT","PlasCom2:NumStepsStatus");
498  // inConfig.SetParameter("PlasCom2:NumSteps","100");
499  // inConfig.SetParameter("PlasCom2:NumStepsStatus","1");
500  // inConfig.SetParameter("PlasCom2:NumStepsIO","100");
501 
502  inConfig.ResetKey("SPACEORDER","PlasComCM:SpatialOrder");
503  inConfig.ResetKey("LENGTH_REFERENCE","PlasComCM:Param:refLength");
504  inConfig.ResetKey("TEMPERATURE_REFERENCE","PlasComCM:Param:refTemperature");
505  inConfig.ResetKey("DENSITY_REFERENCE","PlasComCM:Param:refRho");
506  inConfig.ResetKey("PRESSURE_REFERENCE","PlasComCM:Param:refPressure");
507  inConfig.ResetKey("GAMMA_REFERENCE","PlasComCM:Param:gamma");
508  inConfig.ResetKey("REYNOLDS_NUMBER","PlasComCM:Param:refRe");
509  inConfig.ResetKey("PRANDTL_NUMBER","PlasComCM:Param:refPr");
510  inConfig.ResetKey("TIMESTEP","PlasComCM:Param:inputDT");
511 
512  // artificial dissipation setup
513  bool artDiss = false;
514  if(inConfig.IsSet("SAT_ARTIFICIAL_DISSIPATION"))
515  artDiss = inConfig.GetFlagValue("SAT_ARTIFICIAL_DISSIPATION");
516  double adSigma = 0.0;
517  double adDil = 0.0;
518  double adDilCutOff = 0.0;
519  if(artDiss){
520  adSigma = 30.0;
521  adDil = 30.0;
522  adDilCutOff = -1.5;
523  if(inConfig.IsSet("AMOUNT_SAT_ARTIFICIAL_DISSIPATION"))
524  adSigma = inConfig.GetValue<double>("AMOUNT_SAT_ARTIFICIAL_DISSIPATION");
525  if(inConfig.IsSet("AMOUNT_SAT_ARTIFICIAL_DISSIPATION_FOR_DILATATION"))
526  adDil = inConfig.GetValue<double>("AMOUNT_SAT_ARTIFICIAL_DISSIPATION_FOR_DILATATION");
527  if(inConfig.IsSet("SAT_ARTIFICIAL_DISSIPATION_DIL_CUTOFF"))
528  adDilCutOff = inConfig.GetValue<double>("SAT_ARTIFICIAL_DISSIPATION_DIL_CUTOFF");
529  }
530  inConfig.SetParameter("PlasComCM:Param:sigmaDissipation",adSigma);
531  inConfig.SetParameter("PlasComCM:Param:sigmaDilatation",adDil);
532  inConfig.SetParameter("PlasComCM:Param:dilatationCutoff",adDilCutOff);
533 
534  int numDim = inConfig.GetValue<int>("ND");
535  int numStepsStatus = inConfig.GetValue<int>("PlasCom2:NumStepsIO");
536  if(numStepsStatus >= 100)
537  numStepsStatus /= 5;
538  else
539  numStepsStatus = 10;
540  inConfig.SetParameter<int>("PlasCom2:NumStepsStatus",numStepsStatus);
541  int numScalars = 0;
542  if(inConfig.IsSet("NUMBER_OF_SCALARS"))
543  numScalars = inConfig.GetValue<int>("NUMBER_OF_SCALARS");
544  if(numScalars < 0) numScalars = 0;
545 
546  inConfig.SetParameter<double>("PlasComCM:Param:power",0.666);
547  inConfig.SetParameter<double>("PlasComCM:Param:beta",1.0);
548  inConfig.SetParameter<double>("PlasComCM:Param:bulkViscFac",0.6);
549  inConfig.SetParameter<int>("PlasComCM:Param:Flags",1);
550  inConfig.SetParameter<int>("PlasComCM:Param:nonDimensional",2);
551  std::string bcFileName(inConfig.GetValue("BC_FNAME"));
552  if(bcFileName.empty())
553  bcFileName = "bc.dat";
554 
555  std::vector<legacybc> bcData;
556  std::map<int,int> legacyBCToPC2;
557  legacyBCToPC2[21] = bc::navierstokes::SAT_SLIP_ADIABATIC;
558  legacyBCToPC2[22] = bc::navierstokes::SAT_NOSLIP_ISOTHERMAL;
559  legacyBCToPC2[24] = bc::navierstokes::SAT_FARFIELD;
560  legacyBCToPC2[99] = bc::navierstokes::SPONGE;
561 
562  messageStream << "Reading legacy boundary conditions from " << bcFileName
563  << "." << std::endl;
564 
565  if(ReadLegacyBCDat(bcFileName,bcData,inCommunicator,messageStream)){
566  messageStream << "Read of legacy bc data failed." << std::endl;
567  return(1);
568  }
569  int numBC = bcData.size();
570  std::vector<std::string> gridNames;
571 
572  std::multimap<int,int> gridIdToLegacyBCIndex;
573  std::multimap<int,std::string> bcToRegion;
574  std::set<int> gridIds;
575  for(int iBCLine = 0;iBCLine < numBC;iBCLine++){
576  legacybc &legacyBC(bcData[iBCLine]);
577  gridIdToLegacyBCIndex.insert(std::make_pair(legacyBC.gridID,iBCLine));
578  gridIds.insert(legacyBC.gridID);
579  }
580 
581  std::ostringstream gridNamesStream;
582  std::ostringstream geomGridNamesStream;
583  int numLegacyGrids = gridIds.size();
584  messageStream << "Found configuration for " << numLegacyGrids
585  << " legacy grids." << std::endl;
586  for(int iGrid = 0;iGrid < numLegacyGrids;iGrid++){
587  int gridId = iGrid+1;
588  std::ostringstream nameStream;
589  nameStream << "Group"
590  << (gridId >= 100 ? "" :
591  gridId >= 10 ? "0" :
592  "00") << gridId;
593  const std::string gridName(nameStream.str());
594  pcpp::io::RenewStream(nameStream);
595  gridNames.push_back(gridName);
596  gridNamesStream << gridName << " ";
597  nameStream << geomName << ":" << gridName;
598  const std::string geomGridName(nameStream.str());
599  geomGridNamesStream << geomGridName << " ";
600  pcpp::io::RenewStream(nameStream);
601 
602  // get the legacy BCs for this grid
603  std::pair<std::multimap<int,int>::iterator,
604  std::multimap<int,int>::iterator> gridBCs =
605  gridIdToLegacyBCIndex.equal_range(gridId);
606  int regionId = 1;
607 
608  // loop over bc lines for this grid
609  while(gridBCs.first != gridBCs.second){
610  int bcIndex = gridBCs.first->second;
611  legacybc &legacyBC(bcData[bcIndex]);
612  gridBCs.first++;
613 
614  messageStream << "legacyBC("<< bcIndex << "):" << std::endl
615  << "GridID: " << legacyBC.gridID << std::endl
616  << "BCType: " << legacyBC.bcType << std::endl
617  << "BCDir: " << legacyBC.bcDir << std::endl
618  << "BCInterval: (";
619  for(int iDim = 0;iDim < numDim;iDim++){
620  if(iDim > 0) messageStream << "x";
621  messageStream << "[" << legacyBC.bcInterval[iDim*2] << ":"
622  << legacyBC.bcInterval[iDim*2+1] << "]";
623  }
624 
625 
626 
627  std::ostringstream regionNameStream;
628  regionNameStream << "Region" << regionId++;
629  const std::string regionName(regionNameStream.str());
630  pcpp::io::RenewStream(regionNameStream);
631  nameStream << regionName << " ";
632  regionNameStream << geomName << ":" << gridName
633  << ":" << regionName;
634  std::string regionPath(regionNameStream.str());
635 
636  int pc2BCID = legacyBCToPC2[legacyBC.bcType];
637  bcToRegion.insert(std::make_pair(pc2BCID,regionPath));
638  std::ostringstream regionConfigStream;
639  regionConfigStream << legacyBC.bcDir << " ";
640  for(int iDir = 0;iDir < 6;iDir++)
641  regionConfigStream << legacyBC.bcInterval[iDir] << " ";
642  inConfig.SetParameter(regionPath,regionConfigStream.str());
643 
644  } // loop over grid-specific bc lines
645  inConfig.SetParameter(geomGridName+":RegionNames",nameStream.str());
646  pcpp::io::RenewStream(nameStream);
647 
648  } // Loop over grids
649 
650 
651  std::string geomGridParam(geomName+std::string(":GridNames"));
652  inConfig.SetParameter(geomGridParam,gridNamesStream.str());
653  inConfig.SetParameter("PlasComCM:GridNames",geomGridNamesStream.str());
654 
655  std::string gridFileName;
656  pcpp::io::simfileinfo gridFileInfo;
657  if(inConfig.IsSet("GRID_FNAME")){
658  gridFileName = inConfig.GetValue("GRID_FNAME");
659  if(myRank == 0 && ix::sys::FILEEXISTS(gridFileName)){
660  std::ostringstream errStream;
661  if(pcpp::io::hdf5::FileInfo(gridFileName,gridFileInfo,errStream)){
662  messageStream << "ERROR: FileInfo failed for grid file ("
663  << gridFileName << "). HDF5 messages:" << std::endl
664  << errStream.str() << std::endl;
665  inCommunicator.SetErr(1);
666  }
667  }
668  if(inCommunicator.Check())
669  return(1);
670  inCommunicator.StreamBroadCast(gridFileInfo);
671  }
672 
673  for(int iGrid = 0;iGrid < numLegacyGrids;iGrid++){
674  const std::string &gridName(gridNames[iGrid]);
675  std::string gridParam(geomName+":"+gridName);
676  std::ostringstream paramNameStream;
677  paramNameStream << gridParam << ":Dimension";
678  inConfig.SetParameter(paramNameStream.str(),numDim);
679  pcpp::io::RenewStream(paramNameStream);
680  if(!gridFileName.empty()){
681  paramNameStream << gridParam << ":GridFile";
682  inConfig.SetParameter(paramNameStream.str(),gridFileName);
683  pcpp::io::RenewStream(paramNameStream);
684  }
685  if(gridFileInfo.numGrids > 0){
686  paramNameStream << gridParam << ":NumPoints";
687  const std::vector<size_t> &gridSize(gridFileInfo.gridSizes[iGrid]);
688  std::ostringstream gridSizeStream;
689  for(int iDim = 0;iDim < numDim;iDim++)
690  gridSizeStream << gridSize[iDim] << " ";
691  inConfig.SetParameter(paramNameStream.str(),gridSizeStream.str());
692  pcpp::io::RenewStream(paramNameStream);
693  }
694  paramNameStream << gridParam << ":GenerateGrid";
695  inConfig.SetParameter(paramNameStream.str(),"NO");
696  pcpp::io::RenewStream(paramNameStream);
697  }
698 
699 
700  // bc configuration setup
701  double satSigma1 = 1.0;
702  if(inConfig.IsSet("AMOUNT_SAT_SIGMAI1"))
703  satSigma1 = inConfig.GetValue<double>("AMOUNT_SAT_SIGMAI1");
704  double satSigma2 = 1.0;
705  if(inConfig.IsSet("AMOUNT_SAT_SIGMAI2"))
706  satSigma2 = inConfig.GetValue<double>("AMOUNT_SAT_SIGMAI2");
707 
708  double farfieldSigma1 = .5;
709  double farfieldSigma2 = 1.0;
710  if(inConfig.IsSet("AMOUNT_SAT_SIGMAI1_FARFIELD"))
711  farfieldSigma1 = inConfig.GetValue<double>("AMOUNT_SAT_SIGMAI1_FARFIELD");
712  if(inConfig.IsSet("AMOUNT_SAT_SIGMAI2_FARFIELD"))
713  farfieldSigma2 = inConfig.GetValue<double>("AMOUNT_SAT_SIGMAI2_FARFIELD");
714 
715  double spongeAmp = 5.0;
716  double spongePower = 2.0;
717  if(inConfig.IsSet("SPONGE_AMP"))
718  spongeAmp = inConfig.GetValue<double>("SPONGE_AMP");
719  if(inConfig.IsSet("SPONGE_POW"))
720  spongePower = inConfig.GetValue<double>("SPONGE_POW");
721 
722  std::ostringstream satSigmaStream;
723  satSigmaStream << satSigma1 << " " << satSigma2;
724  const std::string satSigma(satSigmaStream.str());
725 
726  std::ostringstream ffSigmaStream;
727  ffSigmaStream << farfieldSigma1 << " " << farfieldSigma2
728  << " 0.0";
729  const std::string ffSigma(ffSigmaStream.str());
730 
731  std::ostringstream noSlipStream;
732  noSlipStream << satSigma1 << " " << satSigma2 << " "
733  << bcWallTemp << " 0.0";
734  const std::string noSlipSetting(noSlipStream.str());
735 
736  std::ostringstream spongeStream;
737  spongeStream << spongeAmp << " " << spongePower;
738  const std::string spongeSetting(spongeStream.str());
739 
740  std::ostringstream bcNamesStream;
741  std::multimap<int,std::string>::iterator bc2RegionsIt = bcToRegion.begin();
742  while(bc2RegionsIt != bcToRegion.end()){
743  int currentBC = bc2RegionsIt->first;
744  int bcId = currentBC;
745  std::ostringstream bcRegionStream;
746  while(bcId == currentBC){
747  bcRegionStream << bc2RegionsIt++->second << " ";
748  bcId = bc2RegionsIt->first;
749  }
750  const std::string bcRegion(bcRegionStream.str());
751 
752  if(currentBC == bc::navierstokes::SAT_SLIP_ADIABATIC){
753  bcNamesStream << "SlipWall ";
754  inConfig.SetParameter("PlasComCM:SlipWall:BCType","SAT_SLIP_ADIABATIC");
755  inConfig.SetParameter("PlasComCM:SlipWall:Param:Fields","Numbers Flags");
756  inConfig.SetParameter("PlasComCM:SlipWall:Field:Numbers:Meta","2 s 8");
757  inConfig.SetParameter("PlasComCM:SlipWall:Field:Flags:Meta","1 s 4");
758  inConfig.SetParameter("PlasComCM:SlipWall:Field:Numbers",satSigma);
759  inConfig.SetParameter("PlasComCM:SlipWall:Param:Flags","0");
760  inConfig.SetParameter("PlasComCM:SlipWall:RegionNames",bcRegion);
761  } else if (currentBC == bc::navierstokes::SAT_FARFIELD){
762  bcNamesStream << "Farfield ";
763  inConfig.SetParameter("PlasComCM:Farfield:BCType","SAT_FARFIELD");
764  inConfig.SetParameter("PlasComCM:Farfield:Param:Fields","Numbers Flags");
765  inConfig.SetParameter("PlasComCM:Farfield:Field:Numbers:Meta","3 s 8");
766  inConfig.SetParameter("PlasComCM:Farfield:Field:Flags:Meta","1 s 4");
767  inConfig.SetParameter("PlasComCM:Farfield:Param:Numbers",ffSigma);
768  inConfig.SetParameter("PlasComCM:Farfield:Param:Flags","0");
769  inConfig.SetParameter("PlasComCM:Farfield:RegionNames",bcRegion);
770  } else if (currentBC == bc::navierstokes::SAT_NOSLIP_ISOTHERMAL){
771  bcNamesStream << "NoSlip ";
772  inConfig.SetParameter("PlasComCM:NoSlip:BCType","SAT_NOSLIP_ISOTHERMAL");
773  inConfig.SetParameter("PlasComCM:NoSlip:Param:Fields","Numbers Flags");
774  inConfig.SetParameter("PlasComCM:NoSlip:Field:Numbers:Meta","4 s 8");
775  inConfig.SetParameter("PlasComCM:NoSlip:Field:Flags:Meta","1 s 4");
776  inConfig.SetParameter("PlasComCM:NoSlip:Param:Numbers",noSlipSetting);
777  inConfig.SetParameter("PlasComCM:NoSlip:Param:Flags","0");
778  inConfig.SetParameter("PlasComCM:NoSlip:RegionNames",bcRegion);
779  } else if(currentBC == bc::navierstokes::SPONGE){
780  bcNamesStream << "Sponge ";
781  inConfig.SetParameter("PlasComCM:Sponge:BCType","SPONGE");
782  inConfig.SetParameter("PlasComCM:Sponge:Param:Fields","Numbers Flags");
783  inConfig.SetParameter("PlasComCM:Sponge:Field:Numbers:Meta","2 s 8");
784  inConfig.SetParameter("PlasComCM:Sponge:Field:Flags:Meta","1 s 4");
785  inConfig.SetParameter("PlasComCM:Sponge:Param:Numbers",spongeSetting);
786  inConfig.SetParameter("PlasComCM:Sponge:Param:Flags","0");
787  inConfig.SetParameter("PlasComCM:Sponge:RegionNames",bcRegion);
788  }
789  pcpp::io::RenewStream(bcRegionStream);
790  }
791  inConfig.SetParameter("PlasComCM:BCNames",bcNamesStream.str());
792 
793 
794  // This generates the required data dictionary to run a NavierStokes simulation
795  bool writeDV = inConfig.GetFlagValue("WRITE_DV");
796  bool writeMetrics = inConfig.GetFlagValue("WRITE_MET");
797 
798 
799  navierstokes::CreateDictionaryConfiguration(numDim,3,numScalars,writeDV,true,true,writeMetrics,"PlasComCM",inConfig);
800 
801 
802  return(0);
803  }
804 
806  const std::string &gridName,
808  std::ostream &messageStream)
809  {
810  messageStream << "Configuring Grid Inforomation for [" << gridName << "]" << std::endl;
811  std::vector<size_t> gridSizes(inConfig.GetValueVector<size_t>(ConfigKey(gridName,"NumPoints")));
812  int numDim = gridSizes.size();
813  gridInfo.gridSizes = gridSizes;
815  std::string defaultGridTypeName("Uniform-rectangular");
816  if(inConfig.IsSet(ConfigKey(gridName,"Type"))){
817  std::string typeName(inConfig.GetValue(ConfigKey(gridName,"Type")));
818  if(typeName == "Uniform") typeName = defaultGridTypeName;
819  int gType = simulation::grid::ResolveTopoName(typeName);
820  if(gType >= 0 && gType < simulation::grid::NUMTOPOTYPE)
821  gridType = gType;
822  else
823  messageStream << "Warning: Invalid grid type specified (" << typeName
824  << "). Defaulting to grid type (" << defaultGridTypeName
825  << ")." << std::endl;
826  }
827  std::string typeName(simulation::grid::ResolveTopoType(gridType));
828  messageStream << "Grid (" << gridName << ") Type: " << typeName << std::endl;
829  gridInfo.gridType = gridType;
830  if(inConfig.IsSet(ConfigKey(gridName,"PhysicalExtent"))){
831  std::vector<double> physicalExtent(inConfig.GetValueVector<double>(ConfigKey(gridName,"PhysicalExtent")));
832  gridInfo.physicalExtent = physicalExtent;
833  }
834  if(inConfig.IsSet(ConfigKey(gridName,"DecompDirs"))){
835  std::vector<int> decompDirs(inConfig.GetValueVector<int>(ConfigKey(gridName,"DecompDirs")));
836  gridInfo.decompDirs = decompDirs;
837  }
838  if(inConfig.IsSet(ConfigKey(gridName,"DecompSizes"))){
839  std::vector<int> decompSizes(inConfig.GetValueVector<int>(ConfigKey(gridName,"DecompSizes")));
840  gridInfo.decompSizes = decompSizes;
841  }
842  if(inConfig.IsSet(ConfigKey(gridName,"ThreadDecompDirs"))){
843  std::vector<int> threadDecompDirs(inConfig.GetValueVector<int>(ConfigKey(gridName,"ThreadDecompDirs")));
844  gridInfo.threadDecompDirs = threadDecompDirs;
845  }
846  if(inConfig.IsSet(ConfigKey(gridName,"PeriodicDirs"))){
847  std::vector<int> periodicDirs(inConfig.GetValueVector<int>(ConfigKey(gridName,"PeriodicDirs")));
848  gridInfo.periodicDirs = periodicDirs;
849  }
850  if(inConfig.IsSet(ConfigKey(gridName,"PeriodicLengths"))){
851  std::vector<double> periodicLengths(inConfig.GetValueVector<double>(ConfigKey(gridName,"PeriodicLengths")));
852  gridInfo.periodicLengths = periodicLengths;
853  }
854  if(inConfig.IsSet(ConfigKey(gridName,"FileName"))){
855  gridInfo.fileName = inConfig.GetValue(ConfigKey(gridName,"FileName"));
856  }
857  return(0);
858  };
859 
860 
861 
862 
863  }
864 }
std::vector< int > decompDirs
Definition: Geometry.H:17
void SimFileInfo(std::ostream &outStream, const pcpp::io::simfileinfo &simFileInfo)
Definition: PCPPReport.C:6
int ReadSingle(const pcpp::io::simfileinfo &fileInfo, plascom2::grid_t &inGrid, plascom2::state_t &inState, std::ostream &infoStream)
Definition: PC2IO.C:9
void CreateDictionaryConfiguration(int numDim, int gridType, int numScalars, bool withDV, bool withAuxData, bool withLegacyData, bool withGridMetrics, const std::string &configPrefix, fixtures::ConfigurationType &inConfig)
int GetDataIndex(const std::string &name) const
void const size_t * numPoints
Definition: EulerKernels.H:10
bool operator==(const legacybc &lhs, const legacybc &rhs)
Definition: PC2Util.C:378
int ValidateState(const DatasetType &inState, const DatasetType &inParam, std::ostream &outStream)
Definition: EulerUtil.H:442
int SetStateFields(const std::vector< int > &inFieldIndices)
Definition: State.H:310
bool Compatible(const pcpp::io::simfileinfo &fileInfo1, const pcpp::io::simfileinfo &fileInfo2, std::ostream &infoStream)
Definition: PCPPIO.C:13
int ReadLegacyBCDat(const std::string &bcFileName, std::vector< legacybc > &bcDat, fixtures::CommunicatorType &inCommunicator, std::ostream &messageStream)
Definition: PC2Util.C:411
virtual void SetParameter(const std::string &key, const std::string &value)
Definition: Parameters.H:77
std::ostream & operator<<(std::ostream &outStream, const legacybc &bcDat)
Definition: PC2Util.C:393
void ConvertLegacyState(int numDim, size_t numPoints, StateType &inState)
Definition: State.H:711
void const size_t const size_t * gridSizes
Definition: EulerKernels.H:10
int FileInfo(const std::string &hdfFileName, pcpp::io::simfileinfo &fileInfo, std::ostream &messageStream)
Definition: PCPPHDF5.C:621
int PC2Compare(const std::string &redFileName, const std::string &blueFileName, double errTolerance, std::ostream &outStream)
Read two HDF5 files and compare the state data therein.
Definition: PC2Util.C:30
void RenewStream(std::ostringstream &outStream)
bool operator!=(const legacybc &lhs, const legacybc &rhs)
Definition: PC2Util.C:389
std::vector< int > periodicDirs
Definition: Geometry.H:15
std::istream & operator>>(std::istream &inStream, legacybc &bcDat)
Definition: PC2Util.C:402
void const size_t const size_t const size_t const int const int * gridType
Definition: EulerKernels.H:10
Definition: PC2IO.H:10
int SetErr(int errin)
Definition: COMM.H:110
std::vector< size_t > gridSizes
Definition: Geometry.H:12
std::vector< int > gridNumDimensions
Definition: PCPPIO.H:51
std::bitset< NUMFORMATBITS > formatBits
Definition: PCPPIO.H:42
void const size_t const size_t const size_t const double const double * x
std::vector< int > threadDecompDirs
Definition: Geometry.H:19
metadataset & Meta()
int SymmetricElementID(int numDim, int i, int j)
Definition: PC2Util.C:13
int ErrorMetrics(int numDim, size_t numPoints, double *dataBuffer, double *normData, size_t &maxErrLocation)
Definition: PCPPUtil.C:23
virtual void Report(std::ostream &outStream)
Definition: State.H:145
int Check(comm::Ops op=comm::MAXOP)
Definition: COMM.C:355
std::string fileName
Definition: PCPPIO.H:41
std::vector< std::vector< size_t > > gridSizes
Definition: PCPPIO.H:52
bool FILEEXISTS(const std::string &fname)
Definition: UnixUtils.C:189
Main encapsulation of MPI.
Definition: COMM.H:62
int ResolveTopoName(const std::string &inName)
Definition: Grid.C:135
bool GetFlagValue(const std::string &key) const
Definition: Parameters.H:35
std::vector< double > physicalExtent
Definition: Geometry.H:13
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
int ConvertLegacyConfiguration(fixtures::ConfigurationType &inConfig, fixtures::CommunicatorType &inCommunicator, std::ostream &messageStream)
Definition: PC2Util.C:471
int ResetKey(const std::string &origKey, const std::string &newKey)
Definition: Parameters.H:123
void const size_t const size_t const size_t const int * numScalars
Definition: EulerKernels.H:17
std::string ConfigKey(const std::string &configName, const std::string &keyName)
Definition: PCPPUtil.C:191
std::vector< double > & CoordinateData()
Definition: Grid.H:503
int ConfigureGridInfo(const fixtures::ConfigurationType &inConfig, const std::string &gridName, simulation::geometry::gridinfo &gridInfo, std::ostream &messageStream)
Definition: PC2Util.C:805
std::vector< int > decompSizes
Definition: Geometry.H:18
std::string ResolveTopoType(int inType)
Definition: Grid.C:144
Simple key-value pair.
int StreamBroadCast(DataType &inData, int root_rank=0)
Definition: COMM.H:225
bool IsSet(const std::string &Key) const
Definition: Parameters.C:115
int BroadCast(std::string &sval, int root_rank=0)
Definition: COMM.C:437
std::vector< double > periodicLengths
Definition: Geometry.H:16