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];
143 outfile.write(
reinterpret_cast<char *
>(&data[0]),
144 data.size() *
sizeof(T));
156 outfile.write(
reinterpret_cast<char *
>(&data[0]),
157 data.size() *
sizeof(T));
166 if (fPts->GetNpoints() == 0)
171 int rank =
m_f->m_comm->GetRank();
177 fPts->GetConnectivity(
m_conn);
179 switch (fPts->GetPtsType())
208 for (
int i = 0; i <
m_conn.size(); ++i)
217 for (
int i = 0; i <
m_conn.size(); ++i)
224 ASSERTL0(
false,
"This points type is not supported yet.");
252 int nBases =
m_f->m_exp[0]->GetExp(0)->GetNumBases();
255 int totpoints =
m_f->m_exp[0]->GetTotPoints();
257 if (
m_f->m_numHomogeneousDir > 0)
259 int nPlanes =
m_f->m_exp[0]->GetZIDs().size();
270 totpoints +=
m_f->m_exp[0]->GetPlane(0)->GetTotPoints();
272 nBases +=
m_f->m_numHomogeneousDir;
310 for (
int i = 0; i <
m_f->m_variables.size(); ++i)
314 m_f->m_exp[i]->UpdatePhys(), 1,
321 for (
int i = 0; i <
m_f->m_variables.size(); ++i)
330 int points_on_plane =
m_f->m_exp[0]->GetPlane(0)->GetTotPoints();
331 const int offset = totpoints-points_on_plane;
345 for (
int i = 0; i <
m_f->m_variables.size(); ++i)
357 boost::ignore_unused(vm);
360 "OutputTecplot can't write using only FieldData.");
364 po::variables_map &vm)
366 boost::ignore_unused(vm);
368 int nprocs =
m_f->m_comm->GetSize();
369 string returnstr(filename);
374 int rank =
m_f->m_comm->GetRank();
375 int dot = filename.find_last_of(
'.');
376 string ext = filename.substr(dot, filename.length() - dot);
377 string procId =
"_P" + boost::lexical_cast<std::string>(rank);
378 string start = filename.substr(0, dot);
379 returnstr = start + procId + ext;
381 return fs::path(returnstr);
385 po::variables_map &vm)
393 std::string coordVars[] = {
"x",
"y",
"z" };
394 std::vector<string> variables =
m_f->m_variables;
395 variables.insert(variables.begin(), coordVars, coordVars +
m_coordim);
397 int nprocs =
m_f->m_comm->GetSize();
398 int rank =
m_f->m_comm->GetRank();
402 string filename =
m_config[
"outfile"].as<
string>();
408 outfile.open(outFile.c_str(),
m_binary ? ios::binary : ios::out);
423 for (
int i = 0; i <
m_conn.size(); ++i)
459 std::vector<std::string> &var)
461 outfile <<
"Variables = " << var[0];
463 for (
int i = 1; i < var.size(); ++i)
465 outfile <<
", " << var[i];
468 outfile << std::endl << std::endl;
478 std::vector<std::string> &var)
486 outfile <<
"#!TDV112";
495 std::string
title =
"";
501 for (
int i = 0; i < var.size(); ++i)
516 bool useDoubles =
m_config[
"double"].as<
bool>();
520 int precision = std::numeric_limits<double>::max_digits10;
521 outfile << std::setprecision(precision);
535 outfile <<
"Zone, N=" << nPoints <<
", E="
543 for (
int j = 0; j <
m_fields.size(); ++j)
545 for (
int i = 0; i <
m_fields[j].size(); ++i)
547 if ((!(i % 1000)) && i)
549 outfile << std::endl;
554 for (
int n = 1; n <
m_f->m_comm->GetSize(); ++n)
559 m_f->m_comm->Recv(n, tmp);
563 if ((!(i % 1000)) && i)
565 outfile << std::endl;
567 outfile << tmp[i] <<
" ";
571 outfile << std::endl;
578 for (
int i = 0; i <
m_fields.size(); ++i)
588 for (
int j = 0; j <
m_fields.size(); ++j)
590 for (
int i = 0; i <
m_fields[j].size(); ++i)
592 if ((!(i % 1000)) && i)
594 outfile << std::endl;
598 outfile << std::endl;
606 std::string dirs[] = {
"I",
"J",
"K" };
610 outfile <<
", " << dirs[i] <<
"=" <<
m_numPoints[i];
612 outfile <<
", F=POINT" << std::endl;
618 for (
int i = 0; i <
m_fields[0].size(); ++i)
620 for (
int j = 0; j <
m_fields.size(); ++j)
622 outfile << setw(12) <<
m_fields[j][i] <<
" ";
624 outfile << std::endl;
627 for (
int n = 1; n <
m_f->m_comm->GetSize(); ++n)
631 m_f->m_comm->Recv(n, tmp);
632 for (
int j = 0; j <
m_fields.size(); ++j)
634 outfile << setw(12) << tmp[j] <<
" ";
636 outfile << std::endl;
643 for (
int i = 0; i <
m_fields[0].size(); ++i)
645 for (
int j = 0; j <
m_fields.size(); ++j)
649 m_f->m_comm->Send(0, tmp);
656 for (
int i = 0; i <
m_fields[0].size(); ++i)
658 for (
int j = 0; j <
m_fields.size(); ++j)
660 outfile << setw(12) <<
m_fields[j][i] <<
" ";
662 outfile << std::endl;
679 bool useDoubles =
m_config[
"double"].as<
bool>();
689 int nPts = data.size();
690 std::vector<float> tmp(data.size());
691 std::copy(&data[0], &data[0] + nPts, &tmp[0]);
708 bool useDoubles =
m_config[
"double"].as<
bool>();
716 int rank =
m_f->m_comm->GetRank();
717 string zonename =
"ZONE " + boost::lexical_cast<string>(rank);
769 for (
int j = 0; j <
m_fields.size(); ++j)
781 for (
int i = 0; i <
m_fields.size(); ++i)
793 for (
int i = 0; i <
m_fields.size(); ++i)
802 for (
int i = 0; i <
m_fields.size(); ++i)
806 for (
int n = 1; n <
m_f->m_comm->GetSize(); ++n)
809 m_f->m_comm->Recv(n, tmp);
816 for (
int i = 0; i <
m_fields.size(); ++i)
823 for (
int i = 0; i <
m_fields.size(); ++i)
849 for (
int i = 0, cnt = 0; i <
m_conn.size(); ++i)
858 m_f->m_comm->Send(0, conn);
864 for (
int i = 0; i <
m_conn.size(); ++i)
866 const int nConn =
m_conn[i].size();
867 for (
int j = 0; j < nConn; ++j,++cnt)
869 outfile <<
m_conn[i][j] + 1 <<
" ";
872 outfile << std::endl;
882 for (
int n = 1; n <
m_f->m_comm->GetSize(); ++n)
887 m_f->m_comm->Recv(n, conn);
888 for (
int j = 0; j < conn.size(); ++j)
890 outfile << conn[j] + offset + 1 <<
" ";
891 if ((!(j % 1000)) && j)
893 outfile << std::endl;
909 for (
int i = 0, cnt = 0; i <
m_conn.size(); ++i)
915 m_f->m_comm->Send(0, conn);
919 for (
int i = 0; i <
m_conn.size(); ++i)
928 for (
int n = 1; n <
m_f->m_comm->GetSize(); ++n)
931 m_f->m_comm->Recv(n, conn);
933 for (
int j = 0; j < conn.size(); ++j)
954 if (
m_f->m_exp[0]->GetExp(0)->GetNumBases() == 1)
956 for (
int i = 0; i <
m_f->m_exp[0]->GetNumElmts(); ++i)
958 returnval += (
m_f->m_exp[0]->GetExp(i)->GetNumPoints(0) - 1);
961 else if (
m_f->m_exp[0]->GetExp(0)->GetNumBases() == 2)
963 for (
int i = 0; i <
m_f->m_exp[0]->GetNumElmts(); ++i)
965 returnval += (
m_f->m_exp[0]->GetExp(i)->GetNumPoints(0) - 1) *
966 (
m_f->m_exp[0]->GetExp(i)->GetNumPoints(1) - 1);
971 for (
int i = 0; i <
m_f->m_exp[0]->GetNumElmts(); ++i)
973 returnval += (
m_f->m_exp[0]->GetExp(i)->GetNumPoints(0) - 1) *
974 (
m_f->m_exp[0]->GetExp(i)->GetNumPoints(1) - 1) *
975 (
m_f->m_exp[0]->GetExp(i)->GetNumPoints(2) - 1);
990 int nbase =
m_f->m_exp[0]->GetExp(0)->GetNumBases();
993 m_conn.resize(
m_f->m_exp[0]->GetNumElmts());
995 for (i = 0; i <
m_f->m_exp[0]->GetNumElmts(); ++i)
997 cnt =
m_f->m_exp[0]->GetPhys_Offset(i);
1002 int np0 =
m_f->m_exp[0]->GetExp(i)->GetNumPoints(0);
1007 nPlanes =
m_f->m_exp[0]->GetZIDs().size();
1011 int totPoints =
m_f->m_exp[0]->GetPlane(0)->GetTotPoints();
1014 for (
int n = 1; n < nPlanes; ++n)
1016 for (k = 1; k < np0; ++k)
1018 conn[cnt2++] = cnt + (n - 1) * totPoints + k;
1019 conn[cnt2++] = cnt + (n - 1) * totPoints + k - 1;
1020 conn[cnt2++] = cnt + n * totPoints + k - 1;
1021 conn[cnt2++] = cnt + n * totPoints + k;
1032 for (k = 1; k < np0; ++k)
1034 conn[cnt2++] = cnt + k;
1035 conn[cnt2++] = cnt + k - 1;
1041 else if (nbase == 2)
1043 int np0 =
m_f->m_exp[0]->GetExp(i)->GetNumPoints(0);
1044 int np1 =
m_f->m_exp[0]->GetExp(i)->GetNumPoints(1);
1045 int totPoints =
m_f->m_exp[0]->GetTotPoints();
1051 nPlanes =
m_f->m_exp[0]->GetZIDs().size();
1058 totPoints =
m_f->m_exp[0]->GetPlane(0)->GetTotPoints();
1061 conn(8 * (np1 - 1) * (np0 - 1) * (nPlanes - 1));
1063 for (
int n = 1; n < nPlanes; ++n)
1065 for (j = 1; j < np1; ++j)
1067 for (k = 1; k < np0; ++k)
1069 conn[cnt2++] = cnt + (n - 1) * totPoints +
1070 (j - 1) * np0 + k - 1;
1071 conn[cnt2++] = cnt + (n - 1) * totPoints +
1073 conn[cnt2++] = cnt + (n - 1) * totPoints +
1075 conn[cnt2++] = cnt + (n - 1) * totPoints +
1077 conn[cnt2++] = cnt + n * totPoints +
1078 (j - 1) * np0 + k - 1;
1079 conn[cnt2++] = cnt + n * totPoints +
1081 conn[cnt2++] = cnt + n * totPoints +
1083 conn[cnt2++] = cnt + n * totPoints +
1095 for (j = 1; j < np1; ++j)
1097 for (k = 1; k < np0; ++k)
1099 conn[cnt2++] = cnt + (j - 1) * np0 + k - 1;
1100 conn[cnt2++] = cnt + (j - 1) * np0 + k;
1101 conn[cnt2++] = cnt + j * np0 + k;
1102 conn[cnt2++] = cnt + j * np0 + k - 1;
1108 else if (nbase == 3)
1110 int np0 =
m_f->m_exp[0]->GetExp(i)->GetNumPoints(0);
1111 int np1 =
m_f->m_exp[0]->GetExp(i)->GetNumPoints(1);
1112 int np2 =
m_f->m_exp[0]->GetExp(i)->GetNumPoints(2);
1117 for (j = 1; j < np2; ++j)
1119 for (k = 1; k < np1; ++k)
1121 for (l = 1; l < np0; ++l)
1124 cnt + (j - 1) * np0 * np1 + (k - 1) * np0 + l - 1;
1126 cnt + (j - 1) * np0 * np1 + (k - 1) * np0 + l;
1128 cnt + (j - 1) * np0 * np1 + k * np0 + l;
1130 cnt + (j - 1) * np0 * np1 + k * np0 + l - 1;
1132 cnt + j * np0 * np1 + (k - 1) * np0 + l - 1;
1134 cnt + j * np0 * np1 + (k - 1) * np0 + l;
1136 cnt + j * np0 * np1 + k * np0 + l;
1138 cnt + j * np0 * np1 + k * np0 + l - 1;
1147 ASSERTL0(
false,
"Not set up for this dimension");
#define ASSERTL0(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
FieldSharedPtr m_f
Field object.
std::map< std::string, ConfigOption > m_config
List of configuration values.
Converter from fld to vtk.
virtual void Process(po::variables_map &vm)
Write fld to output file.
void WriteDoubleOrFloat(std::ofstream &outfile, Array< OneD, NekDouble > &data)
Write either double-precision or single-precision output of field data.
virtual void WriteTecplotZone(std::ofstream &outfile)
virtual void WriteTecplotHeader(std::ofstream &outfile, std::vector< std::string > &var)
Write Tecplot files header in binary format.
virtual void WriteTecplotConnectivity(std::ofstream &outfile)
Write Tecplot connectivity information (ASCII)
int m_totConn
Total number of connectivity entries.
std::vector< Array< OneD, int > > m_conn
Connectivty for each block: one per element.
Array< OneD, int > m_rankConnSizes
Each rank's connectivity sizes.
bool m_binary
True if writing binary field output.
bool m_oneOutputFile
True if writing a single output file.
virtual fs::path GetFullOutName(std::string &filename, po::variables_map &vm)
virtual void WriteTecplotZone(std::ofstream &outfile)
void CalculateConnectivity()
Calculate connectivity information for each expansion dimension.
virtual void WriteTecplotConnectivity(std::ofstream &outfile)
Write Tecplot connectivity information (ASCII)
virtual void Process(po::variables_map &vm)
Write fld to output file.
bool m_writeHeader
True if writing header.
virtual void OutputFromExp(po::variables_map &vm)
Write from m_exp to output file.
TecplotZoneType m_zoneType
Tecplot zone type of output.
Array< OneD, int > m_rankFieldSizes
Each rank's field sizes.
std::vector< int > m_numPoints
Number of points per block in Tecplot file.
virtual fs::path GetPath(std::string &filename, po::variables_map &vm)
virtual void WriteTecplotHeader(std::ofstream &outfile, std::vector< std::string > &var)
Write Tecplot files header.
void WriteTecplotFile(po::variables_map &vm)
virtual void OutputFromPts(po::variables_map &vm)
Write from pts to output file.
int m_numBlocks
Number of blocks in Tecplot file.
int m_coordim
Coordinate dimension of output.
int GetNumTecplotBlocks()
Calculate number of Tecplot blocks.
Array< OneD, Array< OneD, NekDouble > > m_fields
Field data to output.
virtual void OutputFromData(po::variables_map &vm)
Write from data to output file.
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
void WriteStream(std::ostream &outfile, T data)
Helper function to write binary data to stream.
std::shared_ptr< Field > FieldSharedPtr
std::pair< ModuleType, std::string > ModuleKey
std::string TecplotZoneTypeMap[]
ModuleFactory & GetModuleFactory()
std::string PortablePath(const boost::filesystem::path &path)
create portable path on different platforms for boost::filesystem path
std::shared_ptr< PtsField > PtsFieldSharedPtr
The above copyright notice and this permission notice shall be included.
T Vmin(int n, const T *x, const int incx)
Return the minimum element in x - called vmin to avoid conflict with min.
T Vsum(int n, const T *x, const int incx)
Subtract return sum(x)
void Sadd(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Add vector y = alpha - x.
T Vmax(int n, const T *x, const int incx)
Return the maximum element in x – called vmax to avoid conflict with max.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Represents a command-line configuration option.