40 #include <boost/core/ignore_unused.hpp> 66 OutputTecplot::create,
67 "Writes a Tecplot file.");
68 ModuleKey OutputTecplotBinary::m_className =
71 OutputTecplotBinary::create,
72 "Writes a Tecplot file in binary plt format.");
76 m_oneOutputFile(false)
80 ConfigOption(
true,
"0",
"Write double-precision format data:" 81 "more accurate but more disk space" 92 if(
m_config[
"writemultiplefiles"].as<bool>())
107 template<
typename T>
void WriteStream(std::ostream &outfile, T data)
110 outfile.write(reinterpret_cast<char *>(&tmp),
sizeof(T));
120 template<>
void WriteStream(std::ostream &outfile, std::string data)
123 for (std::string::size_type i = 0; i < data.size(); ++i)
125 char strChar = data[i];
141 outfile.write(reinterpret_cast<char *>(&data[0]),
142 data.num_elements() *
sizeof(T));
151 outfile.write(reinterpret_cast<char *>(&data[0]),
152 data.size() *
sizeof(T));
160 if (fPts->GetNpoints() == 0)
165 int rank =
m_f->m_comm->GetRank();
171 fPts->GetConnectivity(
m_conn);
173 switch (fPts->GetPtsType())
202 for (
int i = 0; i <
m_conn.size(); ++i)
211 for (
int i = 0; i <
m_conn.size(); ++i)
218 ASSERTL0(
false,
"This points type is not supported yet.");
246 int nBases =
m_f->m_exp[0]->GetExp(0)->GetNumBases();
250 if (
m_f->m_numHomogeneousDir > 0)
252 int nPlanes =
m_f->m_exp[0]->GetZIDs().num_elements();
259 nBases +=
m_f->m_numHomogeneousDir;
276 int totpoints =
m_f->m_exp[0]->GetTotPoints();
287 else if (m_coordim == 2)
297 for (
int i = 0; i <
m_f->m_variables.size(); ++i)
307 boost::ignore_unused(vm);
310 "OutputTecplot can't write using only FieldData.");
314 po::variables_map &vm)
316 boost::ignore_unused(vm);
318 int nprocs =
m_f->m_comm->GetSize();
319 string returnstr(filename);
324 int rank =
m_f->m_comm->GetRank();
325 int dot = filename.find_last_of(
'.');
326 string ext = filename.substr(dot, filename.length() - dot);
327 string procId =
"_P" + boost::lexical_cast<std::string>(rank);
328 string start = filename.substr(0, dot);
329 returnstr = start + procId + ext;
331 return fs::path(returnstr);
335 po::variables_map &vm)
343 std::string coordVars[] = {
"x",
"y",
"z" };
344 vector<string> variables =
m_f->m_variables;
345 variables.insert(variables.begin(), coordVars, coordVars +
m_coordim);
347 int nprocs =
m_f->m_comm->GetSize();
348 int rank =
m_f->m_comm->GetRank();
352 string filename =
m_config[
"outfile"].as<
string>();
358 outfile.open(outFile.c_str(),
m_binary ? ios::binary : ios::out);
373 for (
int i = 0; i <
m_conn.size(); ++i)
409 std::vector<std::string> &var)
411 outfile <<
"Variables = " << var[0];
413 for (
int i = 1; i < var.size(); ++i)
415 outfile <<
", " << var[i];
418 outfile << std::endl << std::endl;
428 std::vector<std::string> &var)
436 outfile <<
"#!TDV112";
445 std::string
title =
"";
451 for (
int i = 0; i < var.size(); ++i)
466 bool useDoubles =
m_config[
"double"].as<
bool>();
470 int precision = std::numeric_limits<double>::max_digits10;
471 outfile << std::setprecision(precision);
485 outfile <<
"Zone, N=" << nPoints <<
", E=" 487 << TecplotZoneTypeMap[
m_zoneType] << std::endl;
493 for (
int j = 0; j <
m_fields.num_elements(); ++j)
495 for (
int i = 0; i <
m_fields[j].num_elements(); ++i)
497 if ((!(i % 1000)) && i)
499 outfile << std::endl;
504 for (
int n = 1; n <
m_f->m_comm->GetSize(); ++n)
509 m_f->m_comm->Recv(n, tmp);
513 if ((!(i % 1000)) && i)
515 outfile << std::endl;
517 outfile << tmp[i] <<
" ";
521 outfile << std::endl;
528 for (
int i = 0; i <
m_fields.num_elements(); ++i)
538 for (
int j = 0; j <
m_fields.num_elements(); ++j)
540 for (
int i = 0; i <
m_fields[j].num_elements(); ++i)
542 if ((!(i % 1000)) && i)
544 outfile << std::endl;
548 outfile << std::endl;
556 std::string dirs[] = {
"I",
"J",
"K" };
560 outfile <<
", " << dirs[i] <<
"=" <<
m_numPoints[i];
562 outfile <<
", F=POINT" << std::endl;
568 for (
int i = 0; i <
m_fields[0].num_elements(); ++i)
570 for (
int j = 0; j <
m_fields.num_elements(); ++j)
572 outfile << setw(12) <<
m_fields[j][i] <<
" ";
574 outfile << std::endl;
577 for (
int n = 1; n <
m_f->m_comm->GetSize(); ++n)
581 m_f->m_comm->Recv(n, tmp);
582 for (
int j = 0; j <
m_fields.num_elements(); ++j)
584 outfile << setw(12) << tmp[j] <<
" ";
586 outfile << std::endl;
593 for (
int i = 0; i <
m_fields[0].num_elements(); ++i)
595 for (
int j = 0; j <
m_fields.num_elements(); ++j)
599 m_f->m_comm->Send(0, tmp);
606 for (
int i = 0; i <
m_fields[0].num_elements(); ++i)
608 for (
int j = 0; j <
m_fields.num_elements(); ++j)
610 outfile << setw(12) <<
m_fields[j][i] <<
" ";
612 outfile << std::endl;
629 bool useDoubles =
m_config[
"double"].as<
bool>();
639 int nPts = data.num_elements();
640 vector<float> tmp(data.num_elements());
641 std::copy(&data[0], &data[0] + nPts, &tmp[0]);
658 bool useDoubles =
m_config[
"double"].as<
bool>();
666 int rank =
m_f->m_comm->GetRank();
667 string zonename =
"ZONE " + boost::lexical_cast<
string>(rank);
719 for (
int j = 0; j <
m_fields.num_elements(); ++j)
731 for (
int i = 0; i <
m_fields.num_elements(); ++i)
743 for (
int i = 0; i <
m_fields.num_elements(); ++i)
752 for (
int i = 0; i <
m_fields.num_elements(); ++i)
754 WriteDoubleOrFloat(outfile,
m_fields[i]);
756 for (
int n = 1; n <
m_f->m_comm->GetSize(); ++n)
759 m_f->m_comm->Recv(n, tmp);
760 WriteDoubleOrFloat(outfile, tmp);
766 for (
int i = 0; i <
m_fields.num_elements(); ++i)
773 for (
int i = 0; i <
m_fields.num_elements(); ++i)
775 WriteDoubleOrFloat(outfile,
m_fields[i]);
799 for (
int i = 0, cnt = 0; i <
m_conn.size(); ++i)
801 if(
m_conn[i].num_elements())
805 cnt +=
m_conn[i].num_elements();
808 m_f->m_comm->Send(0, conn);
814 for (
int i = 0; i <
m_conn.size(); ++i)
816 const int nConn =
m_conn[i].num_elements();
817 for (
int j = 0; j < nConn; ++j,++cnt)
819 outfile <<
m_conn[i][j] + 1 <<
" ";
822 outfile << std::endl;
832 for (
int n = 1; n <
m_f->m_comm->GetSize(); ++n)
837 m_f->m_comm->Recv(n, conn);
838 for (
int j = 0; j < conn.num_elements(); ++j)
840 outfile << conn[j] + offset + 1 <<
" ";
841 if ((!(j % 1000)) && j)
843 outfile << std::endl;
859 for (
int i = 0, cnt = 0; i <
m_conn.size(); ++i)
863 cnt +=
m_conn[i].num_elements();
865 m_f->m_comm->Send(0, conn);
869 for (
int i = 0; i <
m_conn.size(); ++i)
878 for (
int n = 1; n <
m_f->m_comm->GetSize(); ++n)
881 m_f->m_comm->Recv(n, conn);
883 for (
int j = 0; j < conn.num_elements(); ++j)
904 if (
m_f->m_exp[0]->GetExp(0)->GetNumBases() == 1)
906 for (
int i = 0; i <
m_f->m_exp[0]->GetNumElmts(); ++i)
908 returnval += (
m_f->m_exp[0]->GetExp(i)->GetNumPoints(0) - 1);
911 else if (
m_f->m_exp[0]->GetExp(0)->GetNumBases() == 2)
913 for (
int i = 0; i <
m_f->m_exp[0]->GetNumElmts(); ++i)
915 returnval += (
m_f->m_exp[0]->GetExp(i)->GetNumPoints(0) - 1) *
916 (
m_f->m_exp[0]->GetExp(i)->GetNumPoints(1) - 1);
921 for (
int i = 0; i <
m_f->m_exp[0]->GetNumElmts(); ++i)
923 returnval += (
m_f->m_exp[0]->GetExp(i)->GetNumPoints(0) - 1) *
924 (
m_f->m_exp[0]->GetExp(i)->GetNumPoints(1) - 1) *
925 (
m_f->m_exp[0]->GetExp(i)->GetNumPoints(2) - 1);
940 int nbase =
m_f->m_exp[0]->GetExp(0)->GetNumBases();
943 m_conn.resize(
m_f->m_exp[0]->GetNumElmts());
945 for (i = 0; i <
m_f->m_exp[0]->GetNumElmts(); ++i)
947 cnt =
m_f->m_exp[0]->GetPhys_Offset(i);
952 int np0 =
m_f->m_exp[0]->GetExp(i)->GetNumPoints(0);
957 nPlanes =
m_f->m_exp[0]->GetZIDs().num_elements();
961 int totPoints =
m_f->m_exp[0]->GetPlane(0)->GetTotPoints();
964 for (
int n = 1; n < nPlanes; ++n)
966 for (k = 1; k < np0; ++k)
968 conn[cnt2++] = cnt + (n - 1) * totPoints + k;
969 conn[cnt2++] = cnt + (n - 1) * totPoints + k - 1;
970 conn[cnt2++] = cnt + n * totPoints + k - 1;
971 conn[cnt2++] = cnt + n * totPoints + k;
982 for (k = 1; k < np0; ++k)
984 conn[cnt2++] = cnt + k;
985 conn[cnt2++] = cnt + k - 1;
993 int np0 =
m_f->m_exp[0]->GetExp(i)->GetNumPoints(0);
994 int np1 =
m_f->m_exp[0]->GetExp(i)->GetNumPoints(1);
995 int totPoints =
m_f->m_exp[0]->GetTotPoints();
1001 nPlanes =
m_f->m_exp[0]->GetZIDs().num_elements();
1006 totPoints =
m_f->m_exp[0]->GetPlane(0)->GetTotPoints();
1010 for (
int n = 1; n < nPlanes; ++n)
1012 for (j = 1; j < np1; ++j)
1014 for (k = 1; k < np0; ++k)
1016 conn[cnt2++] = cnt + (n - 1) * totPoints +
1017 (j - 1) * np0 + k - 1;
1018 conn[cnt2++] = cnt + (n - 1) * totPoints +
1020 conn[cnt2++] = cnt + (n - 1) * totPoints +
1022 conn[cnt2++] = cnt + (n - 1) * totPoints +
1024 conn[cnt2++] = cnt + n * totPoints +
1025 (j - 1) * np0 + k - 1;
1026 conn[cnt2++] = cnt + n * totPoints +
1028 conn[cnt2++] = cnt + n * totPoints +
1030 conn[cnt2++] = cnt + n * totPoints +
1042 for (j = 1; j < np1; ++j)
1044 for (k = 1; k < np0; ++k)
1046 conn[cnt2++] = cnt + (j - 1) * np0 + k - 1;
1047 conn[cnt2++] = cnt + (j - 1) * np0 + k;
1048 conn[cnt2++] = cnt + j * np0 + k;
1049 conn[cnt2++] = cnt + j * np0 + k - 1;
1055 else if (nbase == 3)
1057 int np0 =
m_f->m_exp[0]->GetExp(i)->GetNumPoints(0);
1058 int np1 =
m_f->m_exp[0]->GetExp(i)->GetNumPoints(1);
1059 int np2 =
m_f->m_exp[0]->GetExp(i)->GetNumPoints(2);
1064 for (j = 1; j < np2; ++j)
1066 for (k = 1; k < np1; ++k)
1068 for (l = 1; l < np0; ++l)
1071 cnt + (j - 1) * np0 * np1 + (k - 1) * np0 + l - 1;
1073 cnt + (j - 1) * np0 * np1 + (k - 1) * np0 + l;
1075 cnt + (j - 1) * np0 * np1 + k * np0 + l;
1077 cnt + (j - 1) * np0 * np1 + k * np0 + l - 1;
1079 cnt + j * np0 * np1 + (k - 1) * np0 + l - 1;
1081 cnt + j * np0 * np1 + (k - 1) * np0 + l;
1083 cnt + j * np0 * np1 + k * np0 + l;
1085 cnt + j * np0 * np1 + k * np0 + l - 1;
1094 ASSERTL0(
false,
"Not set up for this dimension");
virtual fs::path GetPath(std::string &filename, po::variables_map &vm)
#define ASSERTL0(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mod...
virtual fs::path GetFullOutName(std::string &filename, po::variables_map &vm)
std::map< std::string, ConfigOption > m_config
List of configuration values.
Represents a command-line configuration option.
TecplotZoneType m_zoneType
Tecplot zone type of output.
T Vmax(int n, const T *x, const int incx)
Return the maximum element in x – called vmax to avoid conflict with max.
T Vmin(int n, const T *x, const int incx)
Return the minimum element in x - called vmin to avoid conflict with min.
Array< OneD, int > m_rankConnSizes
Each rank's connectivity sizes.
Converter from fld to vtk.
virtual void WriteTecplotHeader(std::ofstream &outfile, std::vector< std::string > &var)
Write Tecplot files header in binary format.
bool m_oneOutputFile
True if writing a single output file.
void WriteDoubleOrFloat(std::ofstream &outfile, Array< OneD, NekDouble > &data)
Write either double-precision or single-precision output of field data.
std::shared_ptr< Field > FieldSharedPtr
bool m_writeHeader
True if writing header.
virtual void WriteTecplotConnectivity(std::ofstream &outfile)
Write Tecplot connectivity information (ASCII)
std::shared_ptr< PtsField > PtsFieldSharedPtr
std::pair< ModuleType, std::string > ModuleKey
void CalculateConnectivity()
Calculate connectivity information for each expansion dimension.
virtual void OutputFromData(po::variables_map &vm)
Write from data to output file.
virtual void WriteTecplotHeader(std::ofstream &outfile, std::vector< std::string > &var)
Write Tecplot files header.
Array< OneD, int > m_rankFieldSizes
Each rank's field sizes.
virtual void WriteTecplotZone(std::ofstream &outfile)
virtual void OutputFromExp(po::variables_map &vm)
Write from m_exp to output file.
std::string PortablePath(const boost::filesystem::path &path)
create portable path on different platforms for boost::filesystem path
vector< Array< OneD, int > > m_conn
Connectivty for each block: one per element.
int m_numBlocks
Number of blocks in Tecplot file.
int m_totConn
Total number of connectivity entries.
void WriteTecplotFile(po::variables_map &vm)
std::string TecplotZoneTypeMap[]
virtual void OutputFromPts(po::variables_map &vm)
Write from pts to output file.
int GetNumTecplotBlocks()
Calculate number of Tecplot blocks.
virtual void Process(po::variables_map &vm)
Write fld to output file.
virtual void Process(po::variables_map &vm)
Write fld to output file.
int m_coordim
Coordinate dimension of output.
Array< OneD, Array< OneD, NekDouble > > m_fields
Field data to output.
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
bool m_binary
True if writing binary field output.
T Vsum(int n, const T *x, const int incx)
Subtract return sum(x)
void WriteStream(std::ostream &outfile, T data)
Helper function to write binary data to stream.
virtual void WriteTecplotConnectivity(std::ofstream &outfile)
Write Tecplot connectivity information (ASCII)
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
virtual void WriteTecplotZone(std::ofstream &outfile)
vector< int > m_numPoints
Number of points per block in Tecplot file.
ModuleFactory & GetModuleFactory()
FieldSharedPtr m_f
Field object.