Nektar++
Public Member Functions | Protected Member Functions | List of all members
Nektar::LibUtilities::PtsIO Class Reference

#include <PtsIO.h>

Inheritance diagram for Nektar::LibUtilities::PtsIO:
[legend]

Public Member Functions

 PtsIO (LibUtilities::CommSharedPtr pComm, bool sharedFilesystem=false)
 
virtual ~PtsIO ()
 
void Import (const std::string &inFile, PtsFieldSharedPtr &ptsField, FieldMetaDataMap &fieldmetadatamap=NullFieldMetaDataMap, DomainRangeShPtr &Range=NullDomainRangeShPtr)
 Import a pts field from file. More...
 
void Write (const std::string &outFile, const PtsFieldSharedPtr &ptsField, const bool backup=false)
 Save a pts field to a file. More...
 
void ImportFieldData (const std::string inFile, PtsFieldSharedPtr &ptsField, DomainRangeShPtr &Range=NullDomainRangeShPtr)
 
- Public Member Functions inherited from Nektar::LibUtilities::FieldIOXml
 FieldIOXml (LibUtilities::CommSharedPtr pComm, bool sharedFilesystem)
 Default constructor. More...
 
virtual ~FieldIOXml ()
 
void ImportFieldDefs (DataSourceSharedPtr dataSource, std::vector< FieldDefinitionsSharedPtr > &fielddefs, bool expChild)
 Import field definitions from the target file. More...
 
void ImportFieldData (DataSourceSharedPtr dataSource, const std::vector< FieldDefinitionsSharedPtr > &fielddefs, std::vector< std::vector< NekDouble > > &fielddata)
 Import field data from a target file. More...
 
void WriteMultiFldFileIDs (const std::string &outfile, const std::vector< std::string > fileNames, std::vector< std::vector< unsigned int > > &elementList, const FieldMetaDataMap &fieldinfomap=NullFieldMetaDataMap)
 Write out a file containing element ID to partition mapping. More...
 
void SetUpFieldMetaData (const std::string &outname, const std::vector< FieldDefinitionsSharedPtr > &fielddefs, const FieldMetaDataMap &fieldmetadatamap)
 Set up field meta data map. More...
 
void ImportMultiFldFileIDs (const std::string &inFile, std::vector< std::string > &fileNames, std::vector< std::vector< unsigned int > > &elementList, FieldMetaDataMap &fieldmetadatamap)
 Read file containing element ID to partition mapping. More...
 
void v_Import (const std::string &infilename, std::vector< FieldDefinitionsSharedPtr > &fielddefs, std::vector< std::vector< NekDouble > > &fielddata=NullVectorNekDoubleVector, FieldMetaDataMap &fieldinfomap=NullFieldMetaDataMap, const Array< OneD, int > &ElementIDs=NullInt1DArray)
 Import an XML format file. More...
 
virtual const std::string & GetClassName () const
 Returns the class name. More...
 
- Public Member Functions inherited from Nektar::LibUtilities::FieldIO
 FieldIO (LibUtilities::CommSharedPtr pComm, bool sharedFilesystem)
 Constructor for FieldIO base class. More...
 
virtual ~FieldIO ()
 
void Write (const std::string &outFile, std::vector< FieldDefinitionsSharedPtr > &fielddefs, std::vector< std::vector< NekDouble > > &fielddata, const FieldMetaDataMap &fieldinfomap=NullFieldMetaDataMap, const bool backup=false)
 Write out the field information to the file outFile. More...
 
void Import (const std::string &infilename, std::vector< FieldDefinitionsSharedPtr > &fielddefs, std::vector< std::vector< NekDouble > > &fielddata=NullVectorNekDoubleVector, FieldMetaDataMap &fieldinfomap=NullFieldMetaDataMap, const Array< OneD, int > &ElementIDs=NullInt1DArray)
 Read field information from the file infilename. More...
 
DataSourceSharedPtr ImportFieldMetaData (const std::string &filename, FieldMetaDataMap &fieldmetadatamap)
 Import the metadata from a field file. More...
 

Protected Member Functions

virtual void v_ImportFieldData (const std::string inFile, PtsFieldSharedPtr &ptsField, DomainRangeShPtr &Range=NullDomainRangeShPtr)
 
void SetUpFieldMetaData (const std::string outname)
 
virtual std::string GetFileEnding () const
 Helper function that determines default file extension. More...
 
- Protected Member Functions inherited from Nektar::LibUtilities::FieldIO
int CheckFieldDefinition (const FieldDefinitionsSharedPtr &fielddefs)
 Check field definitions for correctness and return storage size. More...
 
std::string SetUpOutput (const std::string outname, bool perRank, bool backup=false)
 Set up the filesystem ready for output. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from Nektar::LibUtilities::FieldIOXml
static FieldIOSharedPtr create (LibUtilities::CommSharedPtr pComm, bool sharedFilesystem)
 Creates an instance of this class. More...
 
- Static Public Member Functions inherited from Nektar::LibUtilities::FieldIO
static const std::string GetFileType (const std::string &filename, CommSharedPtr comm)
 Determine file type of given input file. More...
 
static std::shared_ptr< FieldIOCreateDefault (const LibUtilities::SessionReaderSharedPtr session)
 Returns an object for the default FieldIO method. More...
 
static std::shared_ptr< FieldIOCreateForFile (const LibUtilities::SessionReaderSharedPtr session, const std::string &filename)
 Construct a FieldIO object for a given input filename. More...
 
static void AddInfoTag (TagWriterSharedPtr root, const FieldMetaDataMap &fieldmetadatamap)
 Add provenance information to the field metadata map. More...
 
- Static Public Attributes inherited from Nektar::LibUtilities::FieldIOXml
static std::string className
 Name of class. More...
 
- Protected Attributes inherited from Nektar::LibUtilities::FieldIO
LibUtilities::CommSharedPtr m_comm
 Communicator to use when writing parallel format. More...
 
bool m_sharedFilesystem
 Boolean dictating whether we are on a shared filesystem. More...
 

Detailed Description

Definition at line 62 of file PtsIO.h.

Constructor & Destructor Documentation

◆ PtsIO()

Nektar::LibUtilities::PtsIO::PtsIO ( LibUtilities::CommSharedPtr  pComm,
bool  sharedFilesystem = false 
)

Definition at line 60 of file PtsIO.cpp.

61  : FieldIOXml(pComm, sharedFilesystem)
62 {
63 }
FieldIOXml(LibUtilities::CommSharedPtr pComm, bool sharedFilesystem)
Default constructor.
Definition: FieldIOXml.cpp:62

◆ ~PtsIO()

virtual Nektar::LibUtilities::PtsIO::~PtsIO ( )
inlinevirtual

Definition at line 68 of file PtsIO.h.

69  {
70  }

Member Function Documentation

◆ GetFileEnding()

virtual std::string Nektar::LibUtilities::PtsIO::GetFileEnding ( ) const
inlineprotectedvirtual

Helper function that determines default file extension.

Reimplemented from Nektar::LibUtilities::FieldIO.

Reimplemented in Nektar::LibUtilities::CsvIO.

Definition at line 95 of file PtsIO.h.

96  {
97  return "pts";
98  };

Referenced by Import(), and SetUpFieldMetaData().

◆ Import()

void Nektar::LibUtilities::PtsIO::Import ( const std::string &  inFile,
PtsFieldSharedPtr ptsField,
FieldMetaDataMap fieldmetadatamap = NullFieldMetaDataMap,
DomainRangeShPtr Range = NullDomainRangeShPtr 
)

Import a pts field from file.

Parameters
inFilefilename of the file to read
ptsFieldthe resulting pts field.

Definition at line 71 of file PtsIO.cpp.

75 {
76  std::string infile = inFile;
77 
78  fs::path pinfilename(infile);
79 
80  // check to see that infile is a directory
81  if (fs::is_directory(pinfilename))
82  {
83  fs::path infofile("Info.xml");
84  fs::path fullpath = pinfilename / infofile;
85  infile = PortablePath(fullpath);
86 
87  std::vector<std::string> filenames;
88  std::vector<std::vector<unsigned int> > elementIDs_OnPartitions;
89 
91  infile, filenames, elementIDs_OnPartitions, fieldmetadatamap);
92 
93  // Load metadata
94  ImportFieldMetaData(infile, fieldmetadatamap);
95 
96  if (filenames.size() == m_comm->GetSize())
97  {
98  // only load the file that matches this rank
99  filenames.clear();
100  boost::format pad("P%1$07d.%2$s");
101  pad % m_comm->GetRank() % GetFileEnding();
102  filenames.push_back(pad.str());
103  }
104 
105  for (int i = 0; i < filenames.size(); ++i)
106  {
107  fs::path pfilename(filenames[i]);
108  fullpath = pinfilename / pfilename;
109  string fname = PortablePath(fullpath);
110 
111  if (i == 0)
112  {
113  ImportFieldData(fname, ptsField, Range);
114  }
115  else
116  {
118  ImportFieldData(fname, newPtsField, Range);
119  Array<OneD, Array<OneD, NekDouble> > pts;
120  newPtsField->GetPts(pts);
121  ptsField->AddPoints(pts);
122  }
123 
124  }
125  }
126  else
127  {
128  ImportFieldData(infile, ptsField, Range);
129  }
130 }
DataSourceSharedPtr ImportFieldMetaData(const std::string &filename, FieldMetaDataMap &fieldmetadatamap)
Import the metadata from a field file.
Definition: FieldIO.h:355
LibUtilities::CommSharedPtr m_comm
Communicator to use when writing parallel format.
Definition: FieldIO.h:266
void ImportMultiFldFileIDs(const std::string &inFile, std::vector< std::string > &fileNames, std::vector< std::vector< unsigned int > > &elementList, FieldMetaDataMap &fieldmetadatamap)
Read file containing element ID to partition mapping.
Definition: FieldIOXml.cpp:428
void ImportFieldData(const std::string inFile, PtsFieldSharedPtr &ptsField, DomainRangeShPtr &Range=NullDomainRangeShPtr)
Definition: PtsIO.cpp:214
virtual std::string GetFileEnding() const
Helper function that determines default file extension.
Definition: PtsIO.h:95
std::string PortablePath(const boost::filesystem::path &path)
create portable path on different platforms for boost::filesystem path
Definition: FileSystem.cpp:41
std::shared_ptr< PtsField > PtsFieldSharedPtr
Definition: PtsField.h:182

References CellMLToNektar.pycml::format, GetFileEnding(), ImportFieldData(), Nektar::LibUtilities::FieldIO::ImportFieldMetaData(), Nektar::LibUtilities::FieldIOXml::ImportMultiFldFileIDs(), Nektar::LibUtilities::FieldIO::m_comm, and Nektar::LibUtilities::PortablePath().

Referenced by Nektar::SolverUtils::SessionFunction::EvaluatePts().

◆ ImportFieldData()

void Nektar::LibUtilities::PtsIO::ImportFieldData ( const std::string  inFile,
PtsFieldSharedPtr ptsField,
DomainRangeShPtr Range = NullDomainRangeShPtr 
)

Definition at line 214 of file PtsIO.cpp.

215 {
216  v_ImportFieldData(inFile, ptsField, Range);
217 }
virtual void v_ImportFieldData(const std::string inFile, PtsFieldSharedPtr &ptsField, DomainRangeShPtr &Range=NullDomainRangeShPtr)
Definition: PtsIO.cpp:220

References v_ImportFieldData().

Referenced by Import().

◆ SetUpFieldMetaData()

void Nektar::LibUtilities::PtsIO::SetUpFieldMetaData ( const std::string  outname)
protected

Definition at line 311 of file PtsIO.cpp.

312 {
313  ASSERTL0(!outname.empty(), "Empty path given to SetUpFieldMetaData()");
314 
315  int nprocs = m_comm->GetSize();
316  int rank = m_comm->GetRank();
317 
318  fs::path specPath(outname);
319 
320  // Collate per-process element lists on root process to generate
321  // the info file.
322  if (rank == 0)
323  {
324  // Set up output names
325  std::vector<std::string> filenames;
326  std::vector<std::vector<unsigned int> > ElementIDs;
327  for (int i = 0; i < nprocs; ++i)
328  {
329  boost::format pad("P%1$07d.%2$s");
330  pad % i % GetFileEnding();
331  filenames.push_back(pad.str());
332 
333  std::vector<unsigned int> tmp;
334  tmp.push_back(0);
335  ElementIDs.push_back(tmp);
336  }
337 
338  // Write the Info.xml file
339  string infofile =
340  LibUtilities::PortablePath(specPath / fs::path("Info.xml"));
341 
342  cout << "Writing: " << specPath << endl;
343 
344  const FieldMetaDataMap fieldmetadatamap;
345  WriteMultiFldFileIDs(infofile, filenames, ElementIDs, fieldmetadatamap);
346  }
347 }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
void WriteMultiFldFileIDs(const std::string &outfile, const std::vector< std::string > fileNames, std::vector< std::vector< unsigned int > > &elementList, const FieldMetaDataMap &fieldinfomap=NullFieldMetaDataMap)
Write out a file containing element ID to partition mapping.
Definition: FieldIOXml.cpp:380
std::map< std::string, std::string > FieldMetaDataMap
Definition: FieldIO.h:52

References ASSERTL0, CellMLToNektar.pycml::format, GetFileEnding(), Nektar::LibUtilities::FieldIO::m_comm, Nektar::LibUtilities::PortablePath(), and Nektar::LibUtilities::FieldIOXml::WriteMultiFldFileIDs().

Referenced by Nektar::LibUtilities::CsvIO::Write(), and Write().

◆ v_ImportFieldData()

void Nektar::LibUtilities::PtsIO::v_ImportFieldData ( const std::string  inFile,
PtsFieldSharedPtr ptsField,
DomainRangeShPtr Range = NullDomainRangeShPtr 
)
protectedvirtual

Reimplemented in Nektar::LibUtilities::CsvIO.

Definition at line 220 of file PtsIO.cpp.

221 {
222  boost::ignore_unused(Range);
223  TiXmlDocument docInput(inFile);
224  bool loadOkay1 = docInput.LoadFile();
225 
226  std::stringstream errstr;
227  errstr << "Unable to load file: " << inFile << std::endl;
228  errstr << "Reason: " << docInput.ErrorDesc() << std::endl;
229  errstr << "Position: Line " << docInput.ErrorRow() << ", Column "
230  << docInput.ErrorCol() << std::endl;
231  ASSERTL0(loadOkay1, errstr.str());
232 
233  TiXmlElement *nektar = docInput.FirstChildElement("NEKTAR");
234  TiXmlElement *points = nektar->FirstChildElement("POINTS");
235  int dim;
236  int err = points->QueryIntAttribute("DIM", &dim);
237 
238  ASSERTL0(err == TIXML_SUCCESS, "Unable to read attribute DIM.");
239 
240  std::string fields = points->Attribute("FIELDS");
241 
242  vector<string> fieldNames;
243  if (!fields.empty())
244  {
245  bool valid =
246  ParseUtils::GenerateVector(fields, fieldNames);
247  ASSERTL0(
248  valid,
249  "Unable to process list of field variable in FIELDS attribute: " +
250  fields);
251  }
252 
253  map<PtsInfo,int> ptsInfo = NullPtsInfoMap;
254 
255  const char *ptinfo = points->Attribute("PTSINFO");
256  if(ptinfo&&boost::iequals(ptinfo,"EquiSpaced"))
257  {
258  ptsInfo[eIsEquiSpacedData] = 1;
259  }
260 
261  int np;
262  err = points->QueryIntAttribute("PTSPERELMTEDGE",&np);
263  if(err == TIXML_SUCCESS)
264  {
265  ptsInfo[ePtsPerElmtEdge] = np;
266  }
267 
268  size_t nfields = fieldNames.size();
269  size_t totvars = dim + nfields;
270 
271  TiXmlNode *pointsBody = points->FirstChild();
272 
273  std::istringstream pointsDataStrm(pointsBody->ToText()->Value());
274 
275  vector<NekDouble> ptsSerial;
276  Array<OneD, Array<OneD, NekDouble> > pts(totvars);
277 
278  try
279  {
280  NekDouble ptsStream;
281  while (!pointsDataStrm.fail())
282  {
283  pointsDataStrm >> ptsStream;
284 
285  ptsSerial.push_back(ptsStream);
286  }
287  }
288  catch (...)
289  {
290  NEKERROR(ErrorUtil::efatal, "Unable to read Points data.");
291  }
292 
293  size_t npts = ptsSerial.size() / totvars;
294 
295  for (size_t i = 0; i < totvars; ++i)
296  {
297  pts[i] = Array<OneD, NekDouble>(npts);
298  }
299 
300  for (size_t i = 0; i < npts; ++i)
301  {
302  for (size_t j = 0; j < totvars; ++j)
303  {
304  pts[j][i] = ptsSerial[i * totvars + j];
305  }
306  }
307 
308  ptsField = MemoryManager<PtsField>::AllocateSharedPtr(dim, fieldNames, pts, ptsInfo);
309 }
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
Definition: ErrorUtil.hpp:209
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
static bool GenerateVector(const std::string &str, std::vector< T > &out)
Takes a comma-separated string and converts it to entries in a vector.
Definition: ParseUtils.cpp:135
static std::map< PtsInfo, int > NullPtsInfoMap
Definition: PtsField.h:70
double NekDouble

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), ASSERTL0, Nektar::ErrorUtil::efatal, Nektar::LibUtilities::eIsEquiSpacedData, Nektar::LibUtilities::ePtsPerElmtEdge, Nektar::ParseUtils::GenerateVector(), NEKERROR, and Nektar::LibUtilities::NullPtsInfoMap.

Referenced by ImportFieldData().

◆ Write()

void Nektar::LibUtilities::PtsIO::Write ( const std::string &  outFile,
const PtsFieldSharedPtr ptsField,
const bool  backup = false 
)

Save a pts field to a file.

Parameters
outFilefilename of the file
ptsFieldthe pts field

Definition at line 138 of file PtsIO.cpp.

141 {
142  size_t nTotvars = ptsField->GetNFields() + ptsField->GetDim();
143  size_t np = ptsField->GetNpoints();
144 
145  std::string filename = SetUpOutput(outFile, true, backup);
146  SetUpFieldMetaData(outFile);
147 
148  // until tinyxml gains support for line break, write the xml manually
149  std::ofstream ptsFile;
150  ptsFile.open(filename.c_str());
151 
152  ptsFile << "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" << endl;
153  ptsFile << "<NEKTAR>" << endl;
154  ptsFile << " <POINTS ";
155  ptsFile << "DIM=\"" << ptsField->GetDim() << "\" ";
156  string fn = boost::algorithm::join(ptsField->GetFieldNames(), ",");
157  ptsFile << "FIELDS=\"" << fn << "\" ";
158  ptsFile << ">" << endl;
159 
160  Array<OneD, Array<OneD, NekDouble> > pts;
161  ptsField->GetPts(pts);
162  for (size_t i = 0; i < np; ++i)
163  {
164  ptsFile << " ";
165  ptsFile << pts[0][i];
166  for (size_t j = 1; j < nTotvars; ++j)
167  {
168  ptsFile << " " << pts[j][i];
169  }
170  ptsFile << endl;
171  }
172  ptsFile << " </POINTS>" << endl;
173  ptsFile << "</NEKTAR>" << endl;
174 
175  ptsFile.close();
176 
177  // this is what the above cpart would read if tinyxml
178  // supported line breaks
179  /*
180  // Create the file (partition)
181  TiXmlDocument doc;
182  TiXmlDeclaration *decl = new TiXmlDeclaration("1.0", "utf-8", "");
183  doc.LinkEndChild(decl);
184 
185  TiXmlElement *root = new TiXmlElement("NEKTAR");
186  doc.LinkEndChild(root);
187 
188  TiXmlElement *pointsTag = new TiXmlElement("POINTS");
189  root->LinkEndChild(pointsTag);
190 
191  pointsTag->SetAttribute("DIM", ptsField->GetDim());
192 
193  string fn = boost::algorithm::join(ptsField->GetFieldNames(), ",");
194  pointsTag->SetAttribute("FIELDS", fn);
195 
196  Array <OneD, Array <OneD, NekDouble > > pts;
197  ptsField->GetPts(pts);
198  ostringstream os;
199  for (int i = 0; i < np; ++i)
200  {
201  os << pts[0][i];
202  for (int j = 1; j < nTotvars; ++j)
203  {
204  os << " " << pts[j][i];
205  }
206  os << " ";
207  }
208 
209  pointsTag->LinkEndChild(new TiXmlText(os.str()));
210 
211  doc.SaveFile(filename);
212  */
213 }
std::string SetUpOutput(const std::string outname, bool perRank, bool backup=false)
Set up the filesystem ready for output.
Definition: FieldIO.cpp:410
void SetUpFieldMetaData(const std::string outname)
Definition: PtsIO.cpp:311

References SetUpFieldMetaData(), and Nektar::LibUtilities::FieldIO::SetUpOutput().

Referenced by Nektar::FieldUtils::OutputPts::OutputFromPts(), and Nektar::SolverUtils::CouplingFile::v_Send().