Go to the documentation of this file.00001 #include <PCU.h>
00002 #include "phInput.h"
00003 #include <fstream>
00004 #include <map>
00005 #include <set>
00006 #include "ph.h"
00007 #include <pcu_util.h>
00008
00012 namespace ph {
00013
00014 static void setDefaults(Input& in)
00015 {
00016 in.timeStepNumber = 0;
00017 in.ensa_dof = 0;
00018 in.ensa_melas_dof = 0;
00019 in.outMeshFileName = "";
00020 in.adaptFlag = 0;
00021 in.rRead = 0;
00022 in.rStart = 0;
00023 in.preAdaptBalanceMethod = "parma";
00024 in.midAdaptBalanceMethod = "zoltan";
00025 in.postAdaptBalanceMethod = "zoltan";
00026 in.prePhastaBalanceMethod = "parma-gap";
00027 in.adaptStrategy = -1;
00028 in.adaptErrorThreshold = 1e-6;
00029 in.adaptErrorFieldName = "errors";
00030 in.adaptErrorFieldIndex = 5;
00031 in.periodic = 0;
00032 in.prCD = -1;
00033 in.timing = 0;
00034 in.internalBCNodes = 0;
00035 in.writeDebugFiles = 0;
00036 in.splitFactor = 1;
00037 in.partitionMethod = "rib";
00038 in.localPtn = 1;
00039 in.solutionMigration = 1;
00040 in.useAttachedFields = 0;
00041 in.isReorder = 0;
00042 in.openfile_read = 0;
00043 in.tetrahedronize = 0;
00044 in.recursiveUR = 1;
00045 in.displacementMigration = 0;
00046 in.dwalMigration = 0;
00047 in.buildMapping = 0;
00048 in.elementsPerMigration = 1000*1000;
00049 in.threaded = 1;
00050 in.initBubbles = 0;
00051 in.formElementGraph = 0;
00052 in.restartFileName = "restart";
00053 in.phastaIO = 1;
00054 in.snap = 0;
00055 in.transferParametric = 0;
00056 in.splitAllLayerEdges = 0;
00057 in.filterMatches = 0;
00058 in.axisymmetry = 0;
00059 in.parmaLoops = 3;
00060 in.parmaVerbosity = 1;
00061 in.writeGeomBCFiles = 0;
00062 in.ramdisk = 0;
00063 in.meshqCrtn = 0.027;
00064 in.elementImbalance = 1.03;
00065 in.vertexImbalance = 1.05;
00066 in.rs = 0;
00067 in.formEdges = 0;
00068 in.simmetrixMesh = 0;
00069 in.maxAdaptIterations = 3;
00070 in.adaptShrinkLimit = 10000;
00071 in.validQuality = 1.0e-10;
00072 in.printIOtime = 0;
00073 in.mesh2geom = 0;
00074 }
00075
00076 Input::Input()
00077 {
00078 setDefaults(*this);
00079 }
00080
00081 typedef std::map<std::string, std::string*> StringMap;
00082 typedef std::map<std::string, int*> IntMap;
00083 typedef std::map<std::string, double*> DblMap;
00084
00085 static void formMaps(Input& in, StringMap& stringMap, IntMap& intMap, DblMap& dblMap)
00086 {
00087 intMap["timeStepNumber"] = &in.timeStepNumber;
00088 intMap["ensa_dof"] = &in.ensa_dof;
00089 intMap["ensa_melas_dof"] = &in.ensa_melas_dof;
00090 stringMap["restartFileName"] = &in.restartFileName;
00091 stringMap["attributeFileName"] = &in.attributeFileName;
00092 stringMap["meshFileName"] = &in.meshFileName;
00093 stringMap["outMeshFileName"] = &in.outMeshFileName;
00094 stringMap["modelFileName"] = &in.modelFileName;
00095 stringMap["outputFormat"] = &in.outputFormat;
00096 stringMap["partitionMethod"] = &in.partitionMethod;
00097 stringMap["preAdaptBalanceMethod"] = &in.preAdaptBalanceMethod;
00098 stringMap["midAdaptBalanceMethod"] = &in.midAdaptBalanceMethod;
00099 stringMap["postAdaptBalanceMethod"] = &in.postAdaptBalanceMethod;
00100 stringMap["prePhastaBalanceMethod"] = &in.prePhastaBalanceMethod;
00101 intMap["adaptFlag"] = &in.adaptFlag;
00102 intMap["rRead"] = &in.rRead;
00103 intMap["rStart"] = &in.rStart;
00104 intMap["AdaptStrategy"] = &in.adaptStrategy;
00105 intMap["RecursiveUR"] = &in.recursiveUR;
00106 intMap["Periodic"] = &in.periodic;
00107 intMap["prCD"] = &in.prCD;
00108 intMap["timing"] = &in.timing;
00109 intMap["internalBCNodes"] = &in.internalBCNodes;
00110 intMap["WRITEASC"] = &in.writeDebugFiles;
00111 intMap["phastaIO"] = &in.phastaIO;
00112 intMap["splitFactor"] = &in.splitFactor;
00113 intMap["SolutionMigration"] = &in.solutionMigration;
00114 intMap["UseAttachedFields"] = &in.useAttachedFields;
00115 intMap["DisplacementMigration"] = &in.displacementMigration;
00116 intMap["isReorder"] = &in.isReorder;
00117 intMap["Tetrahedronize"] = &in.tetrahedronize;
00118 intMap["LocalPtn"] = &in.localPtn;
00119 intMap["dwalMigration"] = &in.dwalMigration;
00120 intMap["buildMapping"] = &in.buildMapping;
00121 intMap["elementsPerMigration"] = &in.elementsPerMigration;
00122 intMap["threaded"] = &in.threaded;
00123 intMap["initBubbles"] = &in.initBubbles;
00124 intMap["formElementGraph"] = &in.formElementGraph;
00125 intMap["snap"] = &in.snap;
00126 intMap["transferParametric"] = &in.transferParametric;
00127 intMap["splitAllLayerEdges"] = &in.splitAllLayerEdges;
00128 intMap["filterMatches"] = &in.filterMatches;
00129 intMap["axisymmetry"] = &in.axisymmetry;
00130 intMap["parmaLoops"] = &in.parmaLoops;
00131 intMap["parmaVerbosity"] = &in.parmaVerbosity;
00132 intMap["writeGeomBCFiles"] = &in.writeGeomBCFiles;
00133 intMap["ramdisk"] = &in.ramdisk;
00134 dblMap["validQuality"] = &in.validQuality;
00135 dblMap["meshqCrtn"] = &in.meshqCrtn;
00136 dblMap["elementImbalance"] = &in.elementImbalance;
00137 dblMap["vertexImbalance"] = &in.vertexImbalance;
00138 dblMap["adaptShrinkLimit"] = &in.adaptShrinkLimit;
00139 intMap["formEdges"] = &in.formEdges;
00140 intMap["simmetrixMesh"] = &in.simmetrixMesh;
00141 intMap["maxAdaptIterations"] = &in.maxAdaptIterations;
00142 intMap["printIOtime"] = &in.printIOtime;
00143 intMap["mesh2geom"] = &in.mesh2geom;
00144 }
00145
00146 template <class T>
00147 static bool tryReading(std::string const& name,
00148 std::ifstream& f,
00149 std::map<std::string, T*>& map)
00150 {
00151 typename std::map<std::string, T*>::iterator it = map.find(name);
00152 if (it == map.end())
00153 return false;
00154 f >> *(it->second);
00155 return true;
00156 }
00157
00158 typedef std::set<std::string> stringset;
00159
00160 static void makeDeprecated(stringset& old)
00161 {
00162 old.insert("globalP");
00163 old.insert("numSplit");
00164 old.insert("ParmaPtn");
00165 old.insert("RecursivePtn");
00166 old.insert("RecursivePtnStep");
00167 old.insert("writePhastaFiles");
00168 }
00169
00170 static bool deprecated(stringset& old, std::string const& name)
00171 {
00172 if( old.count(name) ) {
00173 if( !PCU_Comm_Self() )
00174 fprintf(stderr, "WARNING deprecated input \"%s\" ... "
00175 "carefully check stderr and stdout for unexpected behavior\n",
00176 name.c_str());
00177 return true;
00178 } else {
00179 return false;
00180 }
00181 }
00182
00183 static void readInputFile(
00184 const char* filename,
00185 StringMap& stringMap,
00186 IntMap& intMap,
00187 DblMap& dblMap)
00188 {
00189 stringset old;
00190 makeDeprecated(old);
00191 std::ifstream f(filename);
00192 if (!f)
00193 fail("could not open \"%s\"", filename);
00194 std::string name;
00195 while (f >> name) {
00196 if (name[0] == '#' || deprecated(old,name)) {
00197 std::getline(f, name, '\n');
00198 continue;
00199 }
00200 if (tryReading(name, f, stringMap))
00201 continue;
00202 if (tryReading(name, f, intMap))
00203 continue;
00204 if (tryReading(name, f, dblMap))
00205 continue;
00206 fail("unknown variable \"%s\" in %s\n", name.c_str(), filename);
00207 }
00208 }
00209
00210 static void validate(Input& in)
00211 {
00212 PCU_ALWAYS_ASSERT(in.elementImbalance > 1.0 && in.elementImbalance <= 2.0);
00213 PCU_ALWAYS_ASSERT(in.vertexImbalance > 1.0 && in.vertexImbalance <= 2.0);
00214 PCU_ALWAYS_ASSERT( ! (in.buildMapping && in.adaptFlag));
00215 }
00216
00217 void Input::load(const char* filename)
00218 {
00219 setDefaults(*this);
00220 StringMap stringMap;
00221 IntMap intMap;
00222 DblMap dblMap;
00223 formMaps(*this, stringMap, intMap, dblMap);
00224 readInputFile(filename, stringMap, intMap, dblMap);
00225 validate(*this);
00226 }
00227
00228
00229
00230
00231 int countNaturalBCs(Input& in)
00232 {
00233 return in.ensa_dof + 1;
00234 }
00235
00236 int countEssentialBCs(Input& in)
00237 {
00238 if(!in.ensa_melas_dof)
00239 return in.ensa_dof + 7;
00240 else
00241 return 3+2+4+7+8;
00242 }
00243
00244 int countScalarBCs(Input& in)
00245 {
00246 return in.ensa_dof - 5;
00247 }
00248
00249 }