SCOREC core
Parallel unstructured mesh tools
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
phInput.cc
Go to the documentation of this file.
1 #include <PCU.h>
2 #include "phInput.h"
3 #include <fstream>
4 #include <map>
5 #include <set>
6 #include "ph.h"
7 #include <pcu_util.h>
8 #include <lionPrint.h>
9 
13 namespace ph {
14 
15 static void setDefaults(Input& in)
16 {
17  in.timeStepNumber = 0;
18  in.ensa_dof = 0;
19  in.ensa_melas_dof = 0;
20  in.outMeshFileName = "";
21  in.adaptFlag = 0;
22  in.rRead = 0;
23  in.rStart = 0;
24  in.preAdaptBalanceMethod = "parma";
25  in.midAdaptBalanceMethod = "zoltan";
26  in.postAdaptBalanceMethod = "zoltan";
27  in.prePhastaBalanceMethod = "parma-gap";
28  in.adaptStrategy = -1;
29  in.adaptErrorThreshold = 1e-6; //used by adaptStrategy=2 (runFromErrorThreshold)
30  in.adaptErrorFieldName = "errors"; //used by adaptStrategy=2 (runFromErrorThreshold)
31  in.adaptErrorFieldIndex = 5; //used by adaptStrategy=2 (runFromErrorThreshold)
32  in.periodic = 0;
33  in.prCD = -1;
34  in.timing = 0;
35  in.internalBCNodes = 0;
36  in.writeDebugFiles = 0;
37  in.splitFactor = 1;
38  in.partitionMethod = "rib";
39  in.localPtn = 1;
40  in.solutionMigration = 1;
41  in.useAttachedFields = 0;
42  in.isReorder = 0;
43  in.openfile_read = 0;
44  in.tetrahedronize = 0;
45  in.recursiveUR = 1;
46  in.displacementMigration = 0; // Do not migrate displacement field by default
47  in.dwalMigration = 0; // Do not migrate dwal field by default
48  in.buildMapping = 0; // Do not build the mapping field by default
49  in.elementsPerMigration = 1000*1000; // 100k elms per round
50  in.threaded = 1;
51  in.initBubbles = 0;
52  in.bubbleFileName = "bubbles.inp";
53  in.formElementGraph = 0;
54  in.restartFileName = "restart";
55  in.phastaIO = 1;
56  in.snap = 0;
57  in.transferParametric = 0;
58  in.splitAllLayerEdges = 0;
59  in.filterMatches = 0;
60  in.axisymmetry = 0;
61  in.parmaLoops = 3; //a magical value
62  in.parmaVerbosity = 1; //fairly quiet
63  in.writeGeomBCFiles = 0; // write additional geombc file for vis in streaming
64  in.writeRestartFiles = 0; // write additional restart file for vis in streaming
65  in.ramdisk = 0;
66  in.meshqCrtn = 0.027;
67  in.elementImbalance = 1.03;
68  in.vertexImbalance = 1.05;
69  in.rs = 0;
70  in.formEdges = 0;
71  in.simmetrixMesh = 0;
72  in.maxAdaptIterations = 3;
73  in.adaptShrinkLimit = 10000;
74  in.validQuality = 1.0e-10;
75  in.printIOtime = 0;
76  in.mesh2geom = 0;
77  in.alphaDist = 1e-6;
78  in.alphaSize = 1e-5;
79  in.betaDist = 2e-6;
80  in.betaSize = 2e-5;
81  in.gammaDist = 3e-6;
82  in.gammaSize = 3e-5;
83  in.nRigidBody = 0;
84  in.nRBParam = 14;
85  in.gradingFactor = 2.0;
86  in.simCooperation = 1;
87  in.writeSimLog = 0;
88  in.simCFLUpperBound = 1.0e16;
89  in.simSizeLowerBound = 0.0;
90  in.simSizeUpperBound = 1.0e16;
91  in.simMaxAdaptMeshElements = 1.0e16;
92 }
93 
94 Input::Input()
95 {
96  setDefaults(*this);
97 }
98 
99 typedef std::map<std::string, std::string*> StringMap;
100 typedef std::map<std::string, int*> IntMap;
101 typedef std::map<std::string, double*> DblMap;
102 
103 static void formMaps(Input& in, StringMap& stringMap, IntMap& intMap, DblMap& dblMap)
104 {
105  intMap["timeStepNumber"] = &in.timeStepNumber;
106  intMap["ensa_dof"] = &in.ensa_dof;
107  intMap["ensa_melas_dof"] = &in.ensa_melas_dof;
108  stringMap["restartFileName"] = &in.restartFileName;
109  stringMap["attributeFileName"] = &in.attributeFileName;
110  stringMap["meshFileName"] = &in.meshFileName;
111  stringMap["outMeshFileName"] = &in.outMeshFileName;
112  stringMap["modelFileName"] = &in.modelFileName;
113  stringMap["outputFormat"] = &in.outputFormat;
114  stringMap["partitionMethod"] = &in.partitionMethod;
115  stringMap["preAdaptBalanceMethod"] = &in.preAdaptBalanceMethod;
116  stringMap["midAdaptBalanceMethod"] = &in.midAdaptBalanceMethod;
117  stringMap["postAdaptBalanceMethod"] = &in.postAdaptBalanceMethod;
118  stringMap["prePhastaBalanceMethod"] = &in.prePhastaBalanceMethod;
119  intMap["adaptFlag"] = &in.adaptFlag;
120  intMap["rRead"] = &in.rRead;
121  intMap["rStart"] = &in.rStart;
122  intMap["AdaptStrategy"] = &in.adaptStrategy;
123  intMap["RecursiveUR"] = &in.recursiveUR;
124  intMap["Periodic"] = &in.periodic;
125  intMap["prCD"] = &in.prCD;
126  intMap["timing"] = &in.timing;
127  intMap["internalBCNodes"] = &in.internalBCNodes;
128  intMap["WRITEASC"] = &in.writeDebugFiles;
129  intMap["phastaIO"] = &in.phastaIO;
130  intMap["splitFactor"] = &in.splitFactor;
131  intMap["SolutionMigration"] = &in.solutionMigration;
132  intMap["UseAttachedFields"] = &in.useAttachedFields;
133  intMap["DisplacementMigration"] = &in.displacementMigration;
134  intMap["isReorder"] = &in.isReorder;
135  intMap["Tetrahedronize"] = &in.tetrahedronize;
136  intMap["LocalPtn"] = &in.localPtn;
137  intMap["dwalMigration"] = &in.dwalMigration;
138  intMap["buildMapping"] = &in.buildMapping;
139  intMap["elementsPerMigration"] = &in.elementsPerMigration;
140  intMap["threaded"] = &in.threaded;
141  intMap["initBubbles"] = &in.initBubbles;
142  stringMap["bubbleFileName"] = &in.bubbleFileName;
143  intMap["formElementGraph"] = &in.formElementGraph;
144  intMap["snap"] = &in.snap;
145  intMap["transferParametric"] = &in.transferParametric;
146  intMap["splitAllLayerEdges"] = &in.splitAllLayerEdges;
147  intMap["filterMatches"] = &in.filterMatches;
148  intMap["axisymmetry"] = &in.axisymmetry;
149  intMap["parmaLoops"] = &in.parmaLoops;
150  intMap["parmaVerbosity"] = &in.parmaVerbosity;
151  intMap["writeGeomBCFiles"] = &in.writeGeomBCFiles;
152  intMap["writeRestartFiles"] = &in.writeRestartFiles;
153  intMap["ramdisk"] = &in.ramdisk;
154  dblMap["validQuality"] = &in.validQuality;
155  dblMap["meshqCrtn"] = &in.meshqCrtn;
156  dblMap["elementImbalance"] = &in.elementImbalance;
157  dblMap["vertexImbalance"] = &in.vertexImbalance;
158  dblMap["adaptShrinkLimit"] = &in.adaptShrinkLimit;
159  intMap["formEdges"] = &in.formEdges;
160  intMap["simmetrixMesh"] = &in.simmetrixMesh;
161  intMap["maxAdaptIterations"] = &in.maxAdaptIterations;
162  intMap["printIOtime"] = &in.printIOtime;
163  intMap["mesh2geom"] = &in.mesh2geom;
164  dblMap["alphaDist"] = &in.alphaDist;
165  dblMap["alphaSize"] = &in.alphaSize;
166  dblMap["betaDist"] = &in.betaDist;
167  dblMap["betaSize"] = &in.betaSize;
168  dblMap["gammaDist"] = &in.gammaDist;
169  dblMap["gammaSize"] = &in.gammaSize;
170  intMap["nRigidBody"] = &in.nRigidBody;
171  intMap["nRBParam"] = &in.nRBParam;
172  dblMap["gradingFactor"] = &in.gradingFactor;
173  intMap["simCooperation"] = &in.simCooperation;
174  intMap["writeSimLog"] = &in.writeSimLog;
175  dblMap["simCFLUpperBound"] = &in.simCFLUpperBound;
176  dblMap["simSizeLowerBound"] = &in.simSizeLowerBound;
177  dblMap["simSizeUpperBound"] = &in.simSizeUpperBound;
178  dblMap["simMaxAdaptMeshElements"] = &in.simMaxAdaptMeshElements;
179 }
180 
181 template <class T>
182 static bool tryReading(std::string const& name,
183  std::ifstream& f,
184  std::map<std::string, T*>& map)
185 {
186  typename std::map<std::string, T*>::iterator it = map.find(name);
187  if (it == map.end())
188  return false;
189  f >> *(it->second);
190  return true;
191 }
192 
193 typedef std::set<std::string> stringset;
194 
195 static void makeDeprecated(stringset& old)
196 {
197  old.insert("globalP");
198  old.insert("numSplit");
199  old.insert("ParmaPtn");
200  old.insert("RecursivePtn");
201  old.insert("RecursivePtnStep");
202  old.insert("writePhastaFiles");
203 }
204 
205 static bool deprecated(stringset& old, std::string const& name)
206 {
207  if( old.count(name) ) {
208  if( !PCU_Comm_Self() )
209  lion_eprint(1, "WARNING deprecated input \"%s\" ... "
210  "carefully check stderr and stdout for unexpected behavior\n",
211  name.c_str());
212  return true;
213  } else {
214  return false;
215  }
216 }
217 
218 static void readInputFile(
219  const char* filename,
220  StringMap& stringMap,
221  IntMap& intMap,
222  DblMap& dblMap)
223 {
224  stringset old;
225  makeDeprecated(old);
226  std::ifstream f(filename);
227  if (!f)
228  fail("could not open \"%s\"", filename);
229  std::string name;
230  while (f >> name) {
231  if (name[0] == '#' || deprecated(old,name)) {
232  std::getline(f, name, '\n');
233  continue;
234  }
235  if (tryReading(name, f, stringMap))
236  continue;
237  if (tryReading(name, f, intMap))
238  continue;
239  if (tryReading(name, f, dblMap))
240  continue;
241  fail("unknown variable \"%s\" in %s\n", name.c_str(), filename);
242  }
243 }
244 
245 static void validate(Input& in)
246 {
247  PCU_ALWAYS_ASSERT(in.elementImbalance > 1.0 && in.elementImbalance <= 2.0);
248  PCU_ALWAYS_ASSERT(in.vertexImbalance > 1.0 && in.vertexImbalance <= 2.0);
249  PCU_ALWAYS_ASSERT( ! (in.buildMapping && in.adaptFlag));
250 }
251 
252 void Input::load(const char* filename)
253 {
254  setDefaults(*this);
255  StringMap stringMap;
256  IntMap intMap;
257  DblMap dblMap;
258  formMaps(*this, stringMap, intMap, dblMap);
259  readInputFile(filename, stringMap, intMap, dblMap);
260  validate(*this);
261 }
262 
263 /* see the comments in phBC.h and
264  phOutput.h for explanations about
265  these count*BCs functions */
266 int countNaturalBCs(Input& in)
267 {
268  return in.ensa_dof + 1;
269 }
270 
271 int countEssentialBCs(Input& in)
272 {
273  if(!in.ensa_melas_dof)
274  return in.ensa_dof + 7;
275  else
276  return 3+2+4+7+8; // (assuming 4 scalars to be ON) and 8 is for ec11 ec12 ec13 em1 ec21 ec22 ec23 em2
277 }
278 
279 int countScalarBCs(Input& in)
280 {
281  return in.ensa_dof - 5;
282 }
283 
284 }
The Chef interface for execution control.
void fail(const char *why) __attribute__((noreturn))
Declare failure of code inside APF.
int PCU_Comm_Self(void)
Returns the communication rank of the calling thread.
Definition: pcu.c:98