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();
249 int totpoints =
m_f->m_exp[0]->GetTotPoints();
251 if (
m_f->m_numHomogeneousDir > 0)
253 int nPlanes =
m_f->m_exp[0]->GetZIDs().num_elements();
264 totpoints +=
m_f->m_exp[0]->GetPlane(0)->GetTotPoints();
266 nBases +=
m_f->m_numHomogeneousDir;
292 else if (m_coordim == 2)
304 for (
int i = 0; i <
m_f->m_variables.size(); ++i)
308 m_f->m_exp[i]->UpdatePhys(), 1,
315 for (
int i = 0; i <
m_f->m_variables.size(); ++i)
324 int points_on_plane =
m_f->m_exp[0]->GetPlane(0)->GetTotPoints();
325 const int offset = totpoints-points_on_plane;
339 for (
int i = 0; i <
m_f->m_variables.size(); ++i)
351 boost::ignore_unused(vm);
354 "OutputTecplot can't write using only FieldData.");
358 po::variables_map &vm)
360 boost::ignore_unused(vm);
362 int nprocs =
m_f->m_comm->GetSize();
363 string returnstr(filename);
368 int rank =
m_f->m_comm->GetRank();
369 int dot = filename.find_last_of(
'.');
370 string ext = filename.substr(dot, filename.length() - dot);
371 string procId =
"_P" + boost::lexical_cast<std::string>(rank);
372 string start = filename.substr(0, dot);
373 returnstr = start + procId + ext;
375 return fs::path(returnstr);
379 po::variables_map &vm)
387 std::string coordVars[] = {
"x",
"y",
"z" };
388 vector<string> variables =
m_f->m_variables;
389 variables.insert(variables.begin(), coordVars, coordVars +
m_coordim);
391 int nprocs =
m_f->m_comm->GetSize();
392 int rank =
m_f->m_comm->GetRank();
396 string filename =
m_config[
"outfile"].as<
string>();
402 outfile.open(outFile.c_str(),
m_binary ? ios::binary : ios::out);
417 for (
int i = 0; i <
m_conn.size(); ++i)
453 std::vector<std::string> &var)
455 outfile <<
"Variables = " << var[0];
457 for (
int i = 1; i < var.size(); ++i)
459 outfile <<
", " << var[i];
462 outfile << std::endl << std::endl;
472 std::vector<std::string> &var)
480 outfile <<
"#!TDV112";
489 std::string
title =
"";
495 for (
int i = 0; i < var.size(); ++i)
510 bool useDoubles =
m_config[
"double"].as<
bool>();
514 int precision = std::numeric_limits<double>::max_digits10;
515 outfile << std::setprecision(precision);
529 outfile <<
"Zone, N=" << nPoints <<
", E=" 531 << TecplotZoneTypeMap[
m_zoneType] << std::endl;
537 for (
int j = 0; j <
m_fields.num_elements(); ++j)
539 for (
int i = 0; i <
m_fields[j].num_elements(); ++i)
541 if ((!(i % 1000)) && i)
543 outfile << std::endl;
548 for (
int n = 1; n <
m_f->m_comm->GetSize(); ++n)
553 m_f->m_comm->Recv(n, tmp);
557 if ((!(i % 1000)) && i)
559 outfile << std::endl;
561 outfile << tmp[i] <<
" ";
565 outfile << std::endl;
572 for (
int i = 0; i <
m_fields.num_elements(); ++i)
582 for (
int j = 0; j <
m_fields.num_elements(); ++j)
584 for (
int i = 0; i <
m_fields[j].num_elements(); ++i)
586 if ((!(i % 1000)) && i)
588 outfile << std::endl;
592 outfile << std::endl;
600 std::string dirs[] = {
"I",
"J",
"K" };
604 outfile <<
", " << dirs[i] <<
"=" <<
m_numPoints[i];
606 outfile <<
", F=POINT" << std::endl;
612 for (
int i = 0; i <
m_fields[0].num_elements(); ++i)
614 for (
int j = 0; j <
m_fields.num_elements(); ++j)
616 outfile << setw(12) <<
m_fields[j][i] <<
" ";
618 outfile << std::endl;
621 for (
int n = 1; n <
m_f->m_comm->GetSize(); ++n)
625 m_f->m_comm->Recv(n, tmp);
626 for (
int j = 0; j <
m_fields.num_elements(); ++j)
628 outfile << setw(12) << tmp[j] <<
" ";
630 outfile << std::endl;
637 for (
int i = 0; i <
m_fields[0].num_elements(); ++i)
639 for (
int j = 0; j <
m_fields.num_elements(); ++j)
643 m_f->m_comm->Send(0, tmp);
650 for (
int i = 0; i <
m_fields[0].num_elements(); ++i)
652 for (
int j = 0; j <
m_fields.num_elements(); ++j)
654 outfile << setw(12) <<
m_fields[j][i] <<
" ";
656 outfile << std::endl;
673 bool useDoubles =
m_config[
"double"].as<
bool>();
683 int nPts = data.num_elements();
684 vector<float> tmp(data.num_elements());
685 std::copy(&data[0], &data[0] + nPts, &tmp[0]);
702 bool useDoubles =
m_config[
"double"].as<
bool>();
710 int rank =
m_f->m_comm->GetRank();
711 string zonename =
"ZONE " + boost::lexical_cast<
string>(rank);
763 for (
int j = 0; j <
m_fields.num_elements(); ++j)
775 for (
int i = 0; i <
m_fields.num_elements(); ++i)
787 for (
int i = 0; i <
m_fields.num_elements(); ++i)
796 for (
int i = 0; i <
m_fields.num_elements(); ++i)
798 WriteDoubleOrFloat(outfile,
m_fields[i]);
800 for (
int n = 1; n <
m_f->m_comm->GetSize(); ++n)
803 m_f->m_comm->Recv(n, tmp);
804 WriteDoubleOrFloat(outfile, tmp);
810 for (
int i = 0; i <
m_fields.num_elements(); ++i)
817 for (
int i = 0; i <
m_fields.num_elements(); ++i)
819 WriteDoubleOrFloat(outfile,
m_fields[i]);
843 for (
int i = 0, cnt = 0; i <
m_conn.size(); ++i)
845 if(
m_conn[i].num_elements())
849 cnt +=
m_conn[i].num_elements();
852 m_f->m_comm->Send(0, conn);
858 for (
int i = 0; i <
m_conn.size(); ++i)
860 const int nConn =
m_conn[i].num_elements();
861 for (
int j = 0; j < nConn; ++j,++cnt)
863 outfile <<
m_conn[i][j] + 1 <<
" ";
866 outfile << std::endl;
876 for (
int n = 1; n <
m_f->m_comm->GetSize(); ++n)
881 m_f->m_comm->Recv(n, conn);
882 for (
int j = 0; j < conn.num_elements(); ++j)
884 outfile << conn[j] + offset + 1 <<
" ";
885 if ((!(j % 1000)) && j)
887 outfile << std::endl;
903 for (
int i = 0, cnt = 0; i <
m_conn.size(); ++i)
907 cnt +=
m_conn[i].num_elements();
909 m_f->m_comm->Send(0, conn);
913 for (
int i = 0; i <
m_conn.size(); ++i)
922 for (
int n = 1; n <
m_f->m_comm->GetSize(); ++n)
925 m_f->m_comm->Recv(n, conn);
927 for (
int j = 0; j < conn.num_elements(); ++j)
948 if (
m_f->m_exp[0]->GetExp(0)->GetNumBases() == 1)
950 for (
int i = 0; i <
m_f->m_exp[0]->GetNumElmts(); ++i)
952 returnval += (
m_f->m_exp[0]->GetExp(i)->GetNumPoints(0) - 1);
955 else if (
m_f->m_exp[0]->GetExp(0)->GetNumBases() == 2)
957 for (
int i = 0; i <
m_f->m_exp[0]->GetNumElmts(); ++i)
959 returnval += (
m_f->m_exp[0]->GetExp(i)->GetNumPoints(0) - 1) *
960 (
m_f->m_exp[0]->GetExp(i)->GetNumPoints(1) - 1);
965 for (
int i = 0; i <
m_f->m_exp[0]->GetNumElmts(); ++i)
967 returnval += (
m_f->m_exp[0]->GetExp(i)->GetNumPoints(0) - 1) *
968 (
m_f->m_exp[0]->GetExp(i)->GetNumPoints(1) - 1) *
969 (
m_f->m_exp[0]->GetExp(i)->GetNumPoints(2) - 1);
984 int nbase =
m_f->m_exp[0]->GetExp(0)->GetNumBases();
987 m_conn.resize(
m_f->m_exp[0]->GetNumElmts());
989 for (i = 0; i <
m_f->m_exp[0]->GetNumElmts(); ++i)
991 cnt =
m_f->m_exp[0]->GetPhys_Offset(i);
996 int np0 =
m_f->m_exp[0]->GetExp(i)->GetNumPoints(0);
1001 nPlanes =
m_f->m_exp[0]->GetZIDs().num_elements();
1005 int totPoints =
m_f->m_exp[0]->GetPlane(0)->GetTotPoints();
1008 for (
int n = 1; n < nPlanes; ++n)
1010 for (k = 1; k < np0; ++k)
1012 conn[cnt2++] = cnt + (n - 1) * totPoints + k;
1013 conn[cnt2++] = cnt + (n - 1) * totPoints + k - 1;
1014 conn[cnt2++] = cnt + n * totPoints + k - 1;
1015 conn[cnt2++] = cnt + n * totPoints + k;
1026 for (k = 1; k < np0; ++k)
1028 conn[cnt2++] = cnt + k;
1029 conn[cnt2++] = cnt + k - 1;
1035 else if (nbase == 2)
1037 int np0 =
m_f->m_exp[0]->GetExp(i)->GetNumPoints(0);
1038 int np1 =
m_f->m_exp[0]->GetExp(i)->GetNumPoints(1);
1039 int totPoints =
m_f->m_exp[0]->GetTotPoints();
1045 nPlanes =
m_f->m_exp[0]->GetZIDs().num_elements();
1052 totPoints =
m_f->m_exp[0]->GetPlane(0)->GetTotPoints();
1055 conn(8 * (np1 - 1) * (np0 - 1) * (nPlanes - 1));
1057 for (
int n = 1; n < nPlanes; ++n)
1059 for (j = 1; j < np1; ++j)
1061 for (k = 1; k < np0; ++k)
1063 conn[cnt2++] = cnt + (n - 1) * totPoints +
1064 (j - 1) * np0 + k - 1;
1065 conn[cnt2++] = cnt + (n - 1) * totPoints +
1067 conn[cnt2++] = cnt + (n - 1) * totPoints +
1069 conn[cnt2++] = cnt + (n - 1) * totPoints +
1071 conn[cnt2++] = cnt + n * totPoints +
1072 (j - 1) * np0 + k - 1;
1073 conn[cnt2++] = cnt + n * totPoints +
1075 conn[cnt2++] = cnt + n * totPoints +
1077 conn[cnt2++] = cnt + n * totPoints +
1089 for (j = 1; j < np1; ++j)
1091 for (k = 1; k < np0; ++k)
1093 conn[cnt2++] = cnt + (j - 1) * np0 + k - 1;
1094 conn[cnt2++] = cnt + (j - 1) * np0 + k;
1095 conn[cnt2++] = cnt + j * np0 + k;
1096 conn[cnt2++] = cnt + j * np0 + k - 1;
1102 else if (nbase == 3)
1104 int np0 =
m_f->m_exp[0]->GetExp(i)->GetNumPoints(0);
1105 int np1 =
m_f->m_exp[0]->GetExp(i)->GetNumPoints(1);
1106 int np2 =
m_f->m_exp[0]->GetExp(i)->GetNumPoints(2);
1111 for (j = 1; j < np2; ++j)
1113 for (k = 1; k < np1; ++k)
1115 for (l = 1; l < np0; ++l)
1118 cnt + (j - 1) * np0 * np1 + (k - 1) * np0 + l - 1;
1120 cnt + (j - 1) * np0 * np1 + (k - 1) * np0 + l;
1122 cnt + (j - 1) * np0 * np1 + k * np0 + l;
1124 cnt + (j - 1) * np0 * np1 + k * np0 + l - 1;
1126 cnt + j * np0 * np1 + (k - 1) * np0 + l - 1;
1128 cnt + j * np0 * np1 + (k - 1) * np0 + l;
1130 cnt + j * np0 * np1 + k * np0 + l;
1132 cnt + j * np0 * np1 + k * np0 + l - 1;
1141 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 Sadd(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Add vector y = alpha + x.
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.