35 #include <boost/asio/ip/host_name.hpp> 36 #include <boost/format.hpp> 53 #ifndef NEKTAR_VERSION 54 #define NEKTAR_VERSION "Unknown" 57 namespace berrc = boost::system::errc;
58 namespace ip = boost::asio::ip;
62 namespace LibUtilities
66 "io-format",
"i",
"Default input/output format (e.g. Xml, Hdf5)");
100 int size = comm->GetSize();
101 bool root = comm->TreatAsRankZero();
103 if (size == 1 || root)
105 std::string datafilename;
108 if (fs::is_directory(filename))
110 fs::path p0file(
"P0000000.fld");
111 fs::path fullpath = filename / p0file;
116 datafilename = filename;
122 const unsigned char magic[8] = {
123 0x89, 0x48, 0x44, 0x46, 0x0d, 0x0a, 0x1a, 0x0a};
125 std::ifstream datafile(datafilename.c_str(), std::ios_base::binary);
126 ASSERTL0(datafile.good(),
"Unable to open file: " + filename);
129 for (
unsigned i = 0; i < 8 && datafile.good(); ++i)
131 int byte = datafile.get();
132 if (byte != magic[i])
142 int code = (int)ioType;
143 comm->Bcast(code, 0);
152 else if (ioType ==
eHDF5)
179 std::string iofmt(
"Xml");
180 if (session->DefinesSolverInfo(
"IOFormat"))
182 iofmt = session->GetSolverInfo(
"IOFormat");
185 if (session->DefinesCmdLineArgument(
"io-format"))
187 iofmt = session->GetCmdLineArgument<std::string>(
"io-format");
193 session->GetSharedFilesystem());
209 const std::string &filename)
211 const std::string iofmt =
216 session->GetSharedFilesystem());
230 void Write(
const std::string &outFile,
231 std::vector<FieldDefinitionsSharedPtr> &fielddefs,
232 std::vector<std::vector<NekDouble> > &fielddata,
236 #ifdef NEKTAR_USE_MPI 239 MPI_Initialized(&init);
248 MPI_Comm_size(MPI_COMM_WORLD, &size);
250 "This static function is not available in parallel. Please" 251 "instantiate a FieldIO object for parallel use.");
256 f->Write(outFile, fielddefs, fielddata, fieldinfomap, backup);
275 const std::string &infilename,
276 std::vector<FieldDefinitionsSharedPtr> &fielddefs,
277 std::vector<std::vector<NekDouble> > &fielddata,
281 #ifdef NEKTAR_USE_MPI 284 MPI_Initialized(&init);
293 MPI_Comm_size(MPI_COMM_WORLD, &size);
295 "This static function is not available in parallel. Please" 296 "instantiate a FieldIO object for parallel use.");
302 f->Import(infilename, fielddefs, fielddata, fieldinfomap, ElementIDs);
338 auto now = std::chrono::system_clock::now();
339 auto now_t = std::chrono::system_clock::to_time_t(now);
340 auto now_tm = *std::localtime(&now_t);
342 strftime(buffer,
sizeof(buffer),
"%d-%b-%Y %H:%M:%S", &now_tm);
343 ProvenanceMap[
"Timestamp"] =
buffer;
346 boost::system::error_code ec;
347 ProvenanceMap[
"Hostname"] = ip::host_name(ec);
360 for (
auto &infoit : ProvenanceMap)
362 provTag->SetAttr(infoit.first, infoit.second);
369 for (
auto &infoit : fieldmetadatamap)
371 infoTag->SetAttr(infoit.first, infoit.second);
393 ASSERTL0(!outname.empty(),
"Empty path given to SetUpOutput()");
395 int nprocs =
m_comm->GetSize();
396 bool root =
m_comm->TreatAsRankZero();
400 fs::path specPath(outname), fulloutname;
407 fs::path bakPath = specPath;
409 while (fs::exists(bakPath))
411 bakPath = specPath.parent_path();
412 bakPath += specPath.stem();
413 bakPath += fs::path(
".bak" + std::to_string(cnt++));
414 bakPath += specPath.extension();
416 std::cout <<
"renaming " << specPath <<
" -> " << bakPath << std::endl;
419 fs::rename(specPath, bakPath);
421 catch (fs::filesystem_error &e)
423 ASSERTL0(e.code().value() == berrc::no_such_file_or_directory,
424 "Filesystem error: " + std::string(e.what()));
434 while (exists && perRank)
436 exists = fs::exists(specPath);
443 fulloutname = specPath;
452 fs::path poutfile(pad.str());
453 fulloutname = specPath / poutfile;
457 if (
m_comm->RemoveExistingFiles() && !backup)
466 fs::remove_all(fulloutname);
468 catch (fs::filesystem_error &e)
470 ASSERTL0(e.code().value() == berrc::no_such_file_or_directory,
471 "Filesystem error: " + std::string(e.what()));
482 fs::remove_all(specPath);
484 catch (fs::filesystem_error &e)
486 ASSERTL0(e.code().value() == berrc::no_such_file_or_directory,
487 "Filesystem error: " + std::string(e.what()));
495 while (exists && perRank)
497 exists = fs::exists(specPath);
504 std::cout <<
"Writing: " << specPath;
520 fs::create_directory(specPath);
523 catch (fs::filesystem_error &e)
526 "Filesystem error: " + std::string(e.what()));
535 created = fs::is_directory(specPath);
541 fulloutname = specPath;
557 if (fielddefs->m_elementIDs.size() == 0)
562 unsigned int numbasis = 0;
565 switch (fielddefs->m_shapeType)
569 if (fielddefs->m_numHomogeneousDir)
571 numbasis += fielddefs->m_numHomogeneousDir;
577 if (fielddefs->m_numHomogeneousDir)
599 ASSERTL0(fielddefs->m_basis.size() == numbasis,
600 "Length of basis vector is incorrect");
602 if (fielddefs->m_uniOrder ==
true)
604 unsigned int cnt = 0;
606 switch (fielddefs->m_shapeType)
610 int l = fielddefs->m_numModes[cnt++];
611 if (fielddefs->m_numHomogeneousDir == 1)
613 datasize += l * fielddefs->m_homogeneousZIDs.size();
616 else if (fielddefs->m_numHomogeneousDir == 2)
618 datasize += l * fielddefs->m_homogeneousYIDs.size();
629 int l = fielddefs->m_numModes[cnt++];
630 int m = fielddefs->m_numModes[cnt++];
632 if (fielddefs->m_numHomogeneousDir == 1)
635 fielddefs->m_homogeneousZIDs.size();
645 int l = fielddefs->m_numModes[cnt++];
646 int m = fielddefs->m_numModes[cnt++];
647 if (fielddefs->m_numHomogeneousDir == 1)
649 datasize += l * m * fielddefs->m_homogeneousZIDs.size();
659 int l = fielddefs->m_numModes[cnt++];
660 int m = fielddefs->m_numModes[cnt++];
661 int n = fielddefs->m_numModes[cnt++];
667 int l = fielddefs->m_numModes[cnt++];
668 int m = fielddefs->m_numModes[cnt++];
669 int n = fielddefs->m_numModes[cnt++];
675 int l = fielddefs->m_numModes[cnt++];
676 int m = fielddefs->m_numModes[cnt++];
677 int n = fielddefs->m_numModes[cnt++];
683 int l = fielddefs->m_numModes[cnt++];
684 int m = fielddefs->m_numModes[cnt++];
685 int n = fielddefs->m_numModes[cnt++];
686 datasize += l * m * n;
694 datasize *= fielddefs->m_elementIDs.size();
698 unsigned int cnt = 0;
700 for (i = 0; i < fielddefs->m_elementIDs.size(); ++i)
702 switch (fielddefs->m_shapeType)
706 int l = fielddefs->m_numModes[cnt++];
707 if (fielddefs->m_numHomogeneousDir == 1)
709 datasize += l * fielddefs->m_homogeneousZIDs.size();
712 else if (fielddefs->m_numHomogeneousDir == 2)
714 datasize += l * fielddefs->m_homogeneousYIDs.size();
725 int l = fielddefs->m_numModes[cnt++];
726 int m = fielddefs->m_numModes[cnt++];
727 if (fielddefs->m_numHomogeneousDir == 1)
730 fielddefs->m_homogeneousZIDs.size();
741 int l = fielddefs->m_numModes[cnt++];
742 int m = fielddefs->m_numModes[cnt++];
743 if (fielddefs->m_numHomogeneousDir == 1)
745 datasize += l * m * fielddefs->m_homogeneousZIDs.size();
756 int l = fielddefs->m_numModes[cnt++];
757 int m = fielddefs->m_numModes[cnt++];
758 int n = fielddefs->m_numModes[cnt++];
764 int l = fielddefs->m_numModes[cnt++];
765 int m = fielddefs->m_numModes[cnt++];
766 int n = fielddefs->m_numModes[cnt++];
772 int l = fielddefs->m_numModes[cnt++];
773 int m = fielddefs->m_numModes[cnt++];
774 int n = fielddefs->m_numModes[cnt++];
780 int l = fielddefs->m_numModes[cnt++];
781 int m = fielddefs->m_numModes[cnt++];
782 int n = fielddefs->m_numModes[cnt++];
783 datasize += l * m * n;
793 return (
int)datasize;
#define ASSERTL0(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mod...
int getNumberOfCoefficients(int Na, int Nb, int Nc)
static std::string RegisterCmdLineArgument(const std::string &pName, const std::string &pShortName, const std::string &pDescription)
Registers a command-line argument with the session reader.
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
int getNumberOfCoefficients(int Na, int Nb, int Nc)
FieldIOFactory & GetFieldIOFactory()
Returns the FieldIO factory.
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.
std::map< std::string, std::string > FieldMetaDataMap
CommFactory & GetCommFactory()
int CheckFieldDefinition(const FieldDefinitionsSharedPtr &fielddefs)
Check field definitions for correctness and return storage size.
std::shared_ptr< TagWriter > TagWriterSharedPtr
bool m_sharedFilesystem
Boolean dictating whether we are on a shared filesystem.
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
const std::string kGitSha1
FieldIOType
Enumerator for auto-detection of FieldIO types.
static const std::string GetFileType(const std::string &filename, CommSharedPtr comm)
Determine file type of given input file.
#define LIB_UTILITIES_EXPORT
int getNumberOfCoefficients(int Na, int Nb)
std::string PortablePath(const boost::filesystem::path &path)
create portable path on different platforms for boost::filesystem path
const std::string kGitBranch
std::string SetUpOutput(const std::string outname, bool perRank, bool backup=false)
Set up the filesystem ready for output.
LibUtilities::CommSharedPtr m_comm
Communicator to use when writing parallel format.
int getNumberOfCoefficients(int Na, int Nb, int Nc)
static std::shared_ptr< FieldIO > CreateDefault(const LibUtilities::SessionReaderSharedPtr session)
Returns an object for the default FieldIO method.
virtual std::string GetFileEnding() const
Helper function that determines default file extension.
static std::shared_ptr< FieldIO > CreateForFile(const LibUtilities::SessionReaderSharedPtr session, const std::string &filename)
Construct a FieldIO object for a given input filename.
std::shared_ptr< FieldDefinitions > FieldDefinitionsSharedPtr
std::shared_ptr< FieldIO > FieldIOSharedPtr
static FieldMetaDataMap NullFieldMetaDataMap
static void AddInfoTag(TagWriterSharedPtr root, const FieldMetaDataMap &fieldmetadatamap)
Add provenance information to the field metadata map.
std::shared_ptr< SessionReader > SessionReaderSharedPtr
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.
Provides a generic Factory class.
FieldIO(LibUtilities::CommSharedPtr pComm, bool sharedFilesystem)
Constructor for FieldIO base class.