Nektar++
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Public Member Functions | Static Public Member Functions | Static Public Attributes | List of all members
Nektar::Utilities::InputXml Class Reference

#include <InputXml.h>

Inheritance diagram for Nektar::Utilities::InputXml:
Inheritance graph
[legend]
Collaboration diagram for Nektar::Utilities::InputXml:
Collaboration graph
[legend]

Public Member Functions

 InputXml (FieldSharedPtr f)
 Set up InputXml object. More...
 
virtual ~InputXml ()
 
virtual void Process (po::variables_map &vm)
 
virtual std::string GetModuleName ()
 
- Public Member Functions inherited from Nektar::Utilities::InputModule
 InputModule (FieldSharedPtr p_m)
 
void AddFile (string fileType, string fileName)
 
 InputModule (MeshSharedPtr p_m)
 
void OpenStream ()
 Open a file for input. More...
 
- Public Member Functions inherited from Nektar::Utilities::Module
 Module (FieldSharedPtr p_f)
 
void RegisterConfig (string key, string value)
 Register a configuration option with a module. More...
 
void PrintConfig ()
 Print out all configuration options for a module. More...
 
void SetDefaults ()
 Sets default configuration options for those which have not been set. More...
 
bool GetRequireEquiSpaced (void)
 
void SetRequireEquiSpaced (bool pVal)
 
void EvaluateTriFieldAtEquiSpacedPts (LocalRegions::ExpansionSharedPtr &exp, const Array< OneD, const NekDouble > &infield, Array< OneD, NekDouble > &outfield)
 
 Module (MeshSharedPtr p_m)
 
virtual void Process ()=0
 
void RegisterConfig (std::string key, std::string value)
 
void PrintConfig ()
 
void SetDefaults ()
 
MeshSharedPtr GetMesh ()
 
virtual void ProcessVertices ()
 Extract element vertices. More...
 
virtual void ProcessEdges (bool ReprocessEdges=true)
 Extract element edges. More...
 
virtual void ProcessFaces (bool ReprocessFaces=true)
 Extract element faces. More...
 
virtual void ProcessElements ()
 Generate element IDs. More...
 
virtual void ProcessComposites ()
 Generate composites. More...
 
virtual void ClearElementLinks ()
 

Static Public Member Functions

static ModuleSharedPtr create (FieldSharedPtr f)
 Creates an instance of this class. More...
 

Static Public Attributes

static ModuleKey m_className []
 ModuleKey for class. More...
 

Additional Inherited Members

- Protected Member Functions inherited from Nektar::Utilities::InputModule
void PrintSummary ()
 Print summary of elements. More...
 
void PrintSummary ()
 Print summary of elements. More...
 
- Protected Member Functions inherited from Nektar::Utilities::Module
 Module ()
 
void ReorderPrisms (PerMap &perFaces)
 Reorder node IDs so that prisms and tetrahedra are aligned correctly. More...
 
void PrismLines (int prism, PerMap &perFaces, std::set< int > &prismsDone, std::vector< ElementSharedPtr > &line)
 
- Protected Attributes inherited from Nektar::Utilities::InputModule
set< string > m_allowedFiles
 
std::ifstream m_mshFile
 Input stream. More...
 
- Protected Attributes inherited from Nektar::Utilities::Module
FieldSharedPtr m_f
 Field object. More...
 
map< string, ConfigOptionm_config
 List of configuration values. More...
 
bool m_requireEquiSpaced
 
MeshSharedPtr m_mesh
 Mesh object. More...
 
std::map< std::string,
ConfigOption
m_config
 List of configuration values. More...
 

Detailed Description

Input module for Xml files.

Definition at line 49 of file InputXml.h.

Constructor & Destructor Documentation

Nektar::Utilities::InputXml::InputXml ( FieldSharedPtr  f)

Set up InputXml object.

Definition at line 68 of file InputXml.cpp.

References Nektar::Utilities::InputModule::m_allowedFiles.

68  : InputModule(f)
69 {
70  m_allowedFiles.insert("xml");
71  m_allowedFiles.insert("xml.gz");
72  m_allowedFiles.insert("fld"); // these files could be allowed with xml files
73  m_allowedFiles.insert("chk");
74  m_allowedFiles.insert("rst");
75 }
Nektar::Utilities::InputXml::~InputXml ( )
virtual

Definition at line 81 of file InputXml.cpp.

82 {
83 }

Member Function Documentation

static ModuleSharedPtr Nektar::Utilities::InputXml::create ( FieldSharedPtr  f)
inlinestatic

Creates an instance of this class.

Definition at line 57 of file InputXml.h.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr().

58  {
60  }
static boost::shared_ptr< DataType > AllocateSharedPtr()
Allocate a shared pointer from the memory pool.
virtual std::string Nektar::Utilities::InputXml::GetModuleName ( )
inlinevirtual

Implements Nektar::Utilities::Module.

Definition at line 64 of file InputXml.h.

65  {
66  return "InputXml";
67  }
void Nektar::Utilities::InputXml::Process ( po::variables_map &  vm)
virtual

Implements Nektar::Utilities::Module.

Definition at line 89 of file InputXml.cpp.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), ASSERTL0, Nektar::LibUtilities::SessionReader::CreateInstance(), Nektar::ParseUtils::GenerateUnOrderedVector(), Nektar::Utilities::Module::m_f, Nektar::Utilities::Module::m_requireEquiSpaced, Nektar::SpatialDomains::NullDomainRangeShPtr, Nektar::SpatialDomains::MeshGraph::Read(), Nektar::LibUtilities::ReduceMax, Nektar::LibUtilities::ShapeTypeMap, Nektar::LibUtilities::SIZE_ShapeType, Nektar::Timer::Start(), Nektar::Timer::Stop(), and Nektar::Timer::TimePerTest().

90 {
91  Timer timerpart;
92 
93  //check for multiple calls to inputXml due to split xml
94  //files. If so just return
95  int expsize = m_f->m_exp.size();
96  m_f->m_comm->AllReduce(expsize,LibUtilities::ReduceMax);
97 
98  if(expsize != 0)
99  {
100  return;
101  }
102 
103  if(m_f->m_verbose)
104  {
105  if(m_f->m_comm->TreatAsRankZero())
106  {
107  cout << "Processing input xml file" << endl;
108  timerpart.Start();
109  }
110  }
111 
112  // check to see if fld file defined so can use in
113  // expansion defintion if required
114  string fldending;
115  bool fldfilegiven = true;
116 
117  //Determine appropriate field input
118  if(m_f->m_inputfiles.count("fld") != 0)
119  {
120  fldending = "fld";
121  }
122  else if(m_f->m_inputfiles.count("chk") != 0)
123  {
124  fldending = "chk";
125  }
126  else if (m_f->m_inputfiles.count("rst") != 0)
127  {
128  fldending = "rst";
129  }
130  else
131  {
132  fldfilegiven = false;
133  }
134 
135  string xml_ending = "xml";
136  string xml_gz_ending = "xml.gz";
137 
138  std::vector<std::string> files;
139  // load .xml ending
140  for (int i = 0; i < m_f->m_inputfiles[xml_ending].size(); ++i)
141  {
142  files.push_back(m_f->m_inputfiles[xml_ending][i]);
143  }
144 
145  // load any .xml.gz endings
146  for (int j =0; j < m_f->m_inputfiles[xml_gz_ending].size(); ++j)
147  {
148  files.push_back(m_f->m_inputfiles[xml_gz_ending][j]);
149  }
150 
153 
154 
155  // define range to process output
156  if(vm.count("range"))
157  {
158  vector<NekDouble> values;
160  vm["range"].as<string>().c_str(), values),
161  "Failed to interpret range string");
162 
163  ASSERTL0(values.size() > 1,
164  "Do not have minimum values of xmin,xmax");
165  ASSERTL0(values.size() % 2 == 0,
166  "Do not have an even number of range values");
167 
168  int nvalues = values.size()/2;
171 
172  rng->m_doZrange = false;
173  rng->m_doYrange = false;
174  rng->m_checkShape = false;
175 
176  switch(nvalues)
177  {
178  case 3:
179  rng->m_doZrange = true;
180  rng->m_zmin = values[4];
181  rng->m_zmax = values[5];
182  case 2:
183  rng->m_doYrange = true;
184  rng->m_ymin = values[2];
185  rng->m_ymax = values[3];
186  case 1:
187  rng->m_doXrange = true;
188  rng->m_xmin = values[0];
189  rng->m_xmax = values[1];
190  break;
191  default:
192  ASSERTL0(false,"too many values specfied in range");
193  }
194  }
195 
196  // define range to only take a single shape.
197  if(vm.count("onlyshape"))
198  {
200  {
203  rng->m_doXrange = false;
204  rng->m_doYrange = false;
205  rng->m_doZrange = false;
206  }
207 
208  rng->m_checkShape = true;
209 
210  string shapematch =
211  boost::to_upper_copy(vm["onlyshape"].as<string>());
212  int i;
213  for(i = 0; i < LibUtilities::SIZE_ShapeType; ++i)
214  {
215  string shapeval = LibUtilities::ShapeTypeMap[i];
216  boost::to_upper(shapeval);
217  if(shapematch.compare(shapeval) == 0)
218  {
219  rng->m_shapeType = (LibUtilities::ShapeType)i;
220  break;
221  }
222  }
223  ASSERTL0(i != LibUtilities::SIZE_ShapeType,
224  "Failed to find shape type in -onlyshape command line "
225  "argument");
226  }
227 
228  // Set up command lines options that will be passed through to SessionReader
229  vector<string> cmdArgs;
230  cmdArgs.push_back("FieldConvert");
231 
232  if(m_f->m_verbose)
233  {
234  cmdArgs.push_back("--verbose");
235  }
236 
237  if(vm.count("part-only"))
238  {
239  cmdArgs.push_back("--part-only");
240  cmdArgs.push_back(
241  boost::lexical_cast<string>(vm["part-only"].as<int>()));
242  }
243 
244  if(vm.count("part-only-overlapping"))
245  {
246  cmdArgs.push_back("--part-only-overlapping");
247  cmdArgs.push_back(
248  boost::lexical_cast<string>(vm["part-only-overlapping"].as<int>()));
249  }
250 
251  if(vm.count("npz"))
252  {
253  cmdArgs.push_back("--npz");
254  cmdArgs.push_back(
255  boost::lexical_cast<string>(vm["npz"].as<int>()));
256  }
257 
258  int argc = cmdArgs.size();
259  const char **argv = new const char*[argc];
260  for (int i = 0; i < argc; ++i)
261  {
262  argv[i] = cmdArgs[i].c_str();
263  }
264 
266  CreateInstance(argc, (char **) argv, files, m_f->m_comm);
267 
268  // Free up memory.
269  delete [] argv;
270 
271  if(m_f->m_verbose)
272  {
273  if(m_f->m_comm->TreatAsRankZero())
274  {
275  timerpart.Stop();
276  NekDouble cpuTime = timerpart.TimePerTest(1);
277 
278  stringstream ss;
279  ss << cpuTime << "s";
280  cout << "\t InputXml session reader CPU Time: " << setw(8) << left
281  << ss.str() << endl;
282  timerpart.Start();
283  }
284  }
285 
286  m_f->m_graph = SpatialDomains::MeshGraph::Read(m_f->m_session,rng);
288  ::AllocateSharedPtr(m_f->m_session->GetComm());
289 
290  if(m_f->m_verbose)
291  {
292  if(m_f->m_comm->TreatAsRankZero())
293  {
294  timerpart.Stop();
295  NekDouble cpuTime = timerpart.TimePerTest(1);
296 
297  stringstream ss;
298  ss << cpuTime << "s";
299  cout << "\t InputXml mesh graph setup CPU Time: " << setw(8) << left
300  << ss.str() << endl;
301  timerpart.Start();
302  }
303  }
304 
305  // currently load all field (possibly could read data from
306  // expansion list but it is re-arranged in expansion)
307  const SpatialDomains::ExpansionMap &expansions = m_f->m_graph->GetExpansions();
308 
309  // if Range has been speficied it is possible to have a
310  // partition which is empty so ccheck this and return if
311  // no elements present.
312  if(!expansions.size())
313  {
314  return;
315  }
316 
317  m_f->m_exp.resize(1);
318 
319  // load fielddef header if fld file is defined. This gives
320  // precedence to Homogeneous definition in fld file
321  int NumHomogeneousDir = 0;
322  if(fldfilegiven)
323  {
324  // use original expansion to identify which elements are in
325  // this partition/subrange
326 
327  Array<OneD,int> ElementGIDs(expansions.size());
328  SpatialDomains::ExpansionMap::const_iterator expIt;
329 
330  int i = 0;
331  for (expIt = expansions.begin(); expIt != expansions.end(); ++expIt)
332  {
333  ElementGIDs[i++] = expIt->second->m_geomShPtr->GetGlobalID();
334  }
335 
336  m_f->m_fielddef.clear();
337  m_f->m_data.clear();
338 
339  m_f->m_fld->Import(m_f->m_inputfiles[fldending][0],
340  m_f->m_fielddef,
341  m_f->m_data,
342  m_f->m_fieldMetaDataMap,
343  ElementGIDs);
344  NumHomogeneousDir = m_f->m_fielddef[0]->m_numHomogeneousDir;
345 
346  //----------------------------------------------
347  // Set up Expansion information to use mode order from field
348  m_f->m_graph->SetExpansions(m_f->m_fielddef);
349  }
350  else
351  {
352  if(m_f->m_session->DefinesSolverInfo("HOMOGENEOUS"))
353  {
354  std::string HomoStr = m_f->m_session->GetSolverInfo("HOMOGENEOUS");
355 
356  if((HomoStr == "HOMOGENEOUS1D") || (HomoStr == "Homogeneous1D")
357  || (HomoStr == "1D") || (HomoStr == "Homo1D"))
358  {
359  NumHomogeneousDir = 1;
360  }
361  if((HomoStr == "HOMOGENEOUS2D") || (HomoStr == "Homogeneous2D")
362  || (HomoStr == "2D") || (HomoStr == "Homo2D"))
363  {
364  NumHomogeneousDir = 2;
365  }
366  }
367  }
368 
369  // reset expansion defintion to use equispaced points if required.
370  if(m_requireEquiSpaced || vm.count("output-points"))
371  {
372  int nPointsNew = 0;
373 
374  if(vm.count("output-points"))
375  {
376  nPointsNew = vm["output-points"].as<int>();
377  }
378 
379 
380  m_f->m_graph->SetExpansionsToEvenlySpacedPoints(nPointsNew);
381  }
382  else
383  {
384  if(vm.count("output-points"))
385  {
386  int nPointsNew = vm["output-points"].as<int>();
387  m_f->m_graph->SetExpansionsToPointOrder(nPointsNew);
388  }
389  }
390 
391  if(m_f->m_verbose)
392  {
393  if(m_f->m_comm->TreatAsRankZero())
394  {
395  timerpart.Stop();
396  NekDouble cpuTime = timerpart.TimePerTest(1);
397 
398  stringstream ss;
399  ss << cpuTime << "s";
400  cout << "\t InputXml setexpansion CPU Time: " << setw(8) << left
401  << ss.str() << endl;
402  timerpart.Start();
403  }
404  }
405 
406  // Override number of planes with value from cmd line
407  if(NumHomogeneousDir == 1 && vm.count("output-points-hom-z"))
408  {
409  int expdim = m_f->m_graph->GetMeshDimension();
410  m_f->m_fielddef[0]->m_numModes[expdim] = vm["output-points-hom-z"].as<int>();
411  }
412 
413  m_f->m_exp[0] = m_f->SetUpFirstExpList(NumHomogeneousDir,fldfilegiven);
414 
415  if(m_f->m_verbose)
416  {
417  if(m_f->m_comm->TreatAsRankZero())
418  {
419  timerpart.Stop();
420  NekDouble cpuTime = timerpart.TimePerTest(1);
421 
422  stringstream ss1;
423 
424  ss1 << cpuTime << "s";
425  cout << "\t InputXml set first exp CPU Time: " << setw(8) << left
426  << ss1.str() << endl;
427  }
428  }
429 }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:188
static boost::shared_ptr< MeshGraph > Read(const LibUtilities::SessionReaderSharedPtr &pSession, DomainRangeShPtr &rng=NullDomainRangeShPtr)
Definition: MeshGraph.cpp:121
static boost::shared_ptr< DataType > AllocateSharedPtr()
Allocate a shared pointer from the memory pool.
FieldSharedPtr m_f
Field object.
const char *const ShapeTypeMap[]
Definition: ShapeType.hpp:66
static SessionReaderSharedPtr CreateInstance(int argc, char *argv[])
Creates an instance of the SessionReader class.
void Stop()
Definition: Timer.cpp:62
boost::shared_ptr< DomainRange > DomainRangeShPtr
Definition: MeshGraph.h:157
double NekDouble
static DomainRangeShPtr NullDomainRangeShPtr
Definition: MeshGraph.h:158
void Start()
Definition: Timer.cpp:51
static bool GenerateUnOrderedVector(const char *const str, std::vector< NekDouble > &vec)
Definition: ParseUtils.hpp:128
NekDouble TimePerTest(unsigned int n)
Returns amount of seconds per iteration in a test with n iterations.
Definition: Timer.cpp:108
std::map< int, ExpansionShPtr > ExpansionMap
Definition: MeshGraph.h:174

Member Data Documentation

ModuleKey Nektar::Utilities::InputXml::m_className
static
Initial value:

ModuleKey for class.

Definition at line 62 of file InputXml.h.