65 int main(
int argc,
char *argv[])
67 string fname = std::string(argv[2]);
68 int fdot = fname.find_last_of(
'.');
69 if (fdot != std::string::npos)
71 string ending = fname.substr(fdot);
76 if (ending ==
".chk" || ending ==
".fld")
78 fname = fname.substr(0,fdot);
82 fname = fname +
".txt";
89 int nBndEdgePts, nBndEdges, nBndRegions;
94 "Usage: ExtractSurface3DCFS meshfile fieldFile\n");
96 "Extracts a surface from a 3D fld file"
97 "(only for CompressibleFlowSolver and purely 3D .fld files)\n");
102 = LibUtilities::SessionReader::CreateInstance(3, argv);
104 SpatialDomains::MeshGraph::Read(vSession);
106 std::string m_ViscosityType;
119 int nDimensions = m_spacedim;
123 ASSERTL0(vSession->DefinesParameter(
"Gamma"),
124 "Compressible flow sessions must define a Gamma parameter.");
125 vSession->LoadParameter(
"Gamma", m_gamma, 1.4);
128 ASSERTL0(vSession->DefinesParameter(
"pInf"),
129 "Compressible flow sessions must define a pInf parameter.");
130 vSession->LoadParameter(
"pInf", m_pInf, 101325);
133 ASSERTL0(vSession->DefinesParameter(
"rhoInf"),
134 "Compressible flow sessions must define a rhoInf parameter.");
135 vSession->LoadParameter(
"rhoInf",
m_rhoInf, 1.225);
138 ASSERTL0(vSession->DefinesParameter(
"uInf"),
139 "Compressible flow sessions must define a uInf parameter.");
140 vSession->LoadParameter(
"uInf",
m_uInf, 0.1);
143 if (m_spacedim == 2 || m_spacedim == 3)
145 ASSERTL0(vSession->DefinesParameter(
"vInf"),
146 "Compressible flow sessions must define a vInf parameter"
147 "for 2D/3D problems.");
148 vSession->LoadParameter(
"vInf",
m_vInf, 0.0);
154 ASSERTL0(vSession->DefinesParameter(
"wInf"),
155 "Compressible flow sessions must define a wInf parameter"
157 vSession->LoadParameter(
"wInf", m_wInf, 0.0);
160 vSession->LoadParameter (
"GasConstant", m_gasConstant, 287.058);
161 vSession->LoadParameter (
"Twall",
m_Twall, 300.15);
162 vSession->LoadSolverInfo(
"ViscosityType", m_ViscosityType,
"Constant");
163 vSession->LoadParameter (
"mu",
m_mu, 1.78e-05);
167 string fieldFile(argv[2]);
168 vector<LibUtilities::FieldDefinitionsSharedPtr> fieldDef;
169 vector<vector<NekDouble> > fieldData;
176 vector< vector<LibUtilities::PointsType> > pointsType;
177 for (i = 0; i < fieldDef.size(); ++i)
179 vector<LibUtilities::PointsType> ptype;
180 for (j = 0; j < 3; ++j)
184 pointsType.push_back(ptype);
186 graphShPt->SetExpansionInfo(fieldDef, pointsType);
193 int nfields = fieldDef[0]->m_fields.size();
197 for(i = 0; i < pFields.size(); i++)
200 ::DisContField>::AllocateSharedPtr(vSession, graphShPt,
201 vSession->GetVariable(i));
210 for (i = 1; i < nfields; ++i)
218 if (pFields[0]->GetBndCondExpansions().size())
222 nBndRegions = pFields[0]->GetBndCondExpansions().size();
223 for (b = 0; b < nBndRegions; ++b)
225 nBndEdges = pFields[0]->GetBndCondExpansions()[b]->GetExpSize();
226 for (e = 0; e < nBndEdges; ++e)
228 nBndEdgePts = pFields[0]->
229 GetBndCondExpansions()[b]->GetExp(e)->GetTotPoints();
231 if (pFields[0]->GetBndConditions()[b]->
232 GetUserDefined() ==
"WallViscous" ||
233 pFields[0]->GetBndConditions()[b]->
234 GetUserDefined() ==
"WallAdiabatic" ||
235 pFields[0]->GetBndConditions()[b]->
236 GetUserDefined() ==
"Wall")
238 nSurfacePts += nBndEdgePts;
245 int nSolutionPts = pFields[0]->GetNpoints();
246 int nTracePts = pFields[0]->GetTrace()->GetTotPoints();
247 int nElements = pFields[0]->GetExpSize();
263 pFields[0]->GetCoords(x, y, z);
265 pFields[0]->ExtractTracePhys(x, traceX);
266 pFields[0]->ExtractTracePhys(y, traceY);
267 pFields[0]->ExtractTracePhys(z, traceZ);
277 for (j = 0; j < nfields; ++j)
284 for (i = 0; i < fieldData.size(); ++i)
286 Exp[j]->ExtractDataToCoeffs(fieldDef[i], fieldData[i],
287 fieldDef[i]->m_fields[j],
288 Exp[j]->UpdateCoeffs());
290 Exp[j]->BwdTrans(Exp[j]->GetCoeffs(), Exp[j]->UpdatePhys());
291 Vmath::Vcopy(nSolutionPts, Exp[j]->GetPhys(), 1, uFields[j], 1);
292 pFields[0]->ExtractTracePhys(uFields[j], traceFields[j]);
297 int nfieldsAdded = 34;
301 for (j = 0; j < nfieldsAdded; ++j)
321 for(i = 0; i < nDimensions; ++i)
325 pFields[0]->GetTrace()->GetNormals(m_traceNormals);
335 for(i = 0; i < nDimensions; ++i)
346 &m_traceNormals[0][0], 1,
347 &traceFieldsAdded[0][0], 1);
351 &m_traceNormals[1][0], 1,
352 &traceFieldsAdded[1][0], 1);
356 &m_traceNormals[2][0], 1,
357 &traceFieldsAdded[2][0], 1);
363 &m_traceNormals[0][0], 1,
368 &m_traceNormals[1][0], 1,
372 &m_traceNormals[2][0], 1,
376 for (i = 0; i < m_spacedim; i++)
379 &NormH[0],1, &NormH[0],1);
395 &m_traceBinormals[0][0], 1);
398 &m_traceBinormals[0][0], 1,
399 &traceFieldsAdded[3][0], 1);
420 &m_traceBinormals[1][0], 1);
423 &m_traceBinormals[1][0], 1,
424 &traceFieldsAdded[4][0], 1);
440 &m_traceBinormals[2][0], 1);
443 &m_traceBinormals[2][0], 1,
444 &traceFieldsAdded[5][0], 1);
460 &m_traceTangents[0][0], 1);
463 &m_traceTangents[0][0], 1,
464 &traceFieldsAdded[6][0], 1);
468 &m_traceBinormals[2][0], 1,
469 &m_traceTangents[1][0], 1);
472 &m_traceTangents[1][0], 1,
473 &traceFieldsAdded[7][0], 1);
494 &m_traceTangents[2][0], 1);
497 &m_traceTangents[2][0], 1,
498 &traceFieldsAdded[8][0], 1);
510 for (i = 0; i < m_spacedim; i++)
513 &uFields[i + 1][0], 1,
514 &uFields[i + 1][0], 1,
534 &uFields[nfields - 1][0], 1,
543 pFields[0]->ExtractTracePhys(
pressure, traceFieldsAdded[9]);
557 NekDouble GasConstantInv = 1.0/m_gasConstant;
563 pFields[0]->ExtractTracePhys(temperature, traceFieldsAdded[10]);
572 for (i = 0; i < nDimensions; ++ i)
578 for (i = 0; i < nDimensions; ++ i)
580 for (n = 0; n < nElements; n++)
582 phys_offset = pFields[0]->GetPhys_Offset(n);
584 pFields[i]->GetExp(n)->PhysDeriv(
585 i, temperature + phys_offset,
586 auxArray = Dtemperature[i] + phys_offset);
589 pFields[0]->ExtractTracePhys(Dtemperature[i], traceDtemperature[i]);
592 for(i = 0; i < nDimensions; ++i)
595 &m_traceNormals[i][0], 1,
596 &traceDtemperature[i][0], 1,
600 &traceFieldsAdded[11][0], 1,
602 &traceFieldsAdded[11][0], 1);
616 for (i = 0; i < nDimensions; ++ i)
622 for (i = 0; i < nDimensions; ++ i)
624 for (n = 0; n < nElements; n++)
626 phys_offset = pFields[0]->GetPhys_Offset(n);
628 pFields[i]->GetExp(n)->PhysDeriv(
630 auxArray = Dpressure[i] + phys_offset);
633 pFields[0]->ExtractTracePhys(Dpressure[i], traceDpressure[i]);
637 for(i = 0; i < nDimensions; ++i)
640 &m_traceTangents[i][0], 1,
641 &traceDpressure[i][0], 1,
645 &traceFieldsAdded[12][0], 1,
647 &traceFieldsAdded[12][0], 1);
651 for(i = 0; i < nDimensions; ++i)
654 &m_traceBinormals[i][0], 1,
655 &traceDpressure[i][0], 1,
659 &traceFieldsAdded[13][0], 1,
661 &traceFieldsAdded[13][0], 1);
667 &traceDpressure[0][0], 1,
668 &traceFieldsAdded[14][0], 1);
672 &traceDpressure[1][0], 1,
673 &traceFieldsAdded[15][0], 1);
677 &traceDpressure[2][0], 1,
678 &traceFieldsAdded[16][0], 1);
697 for (i = 0; i < nDimensions; ++ i)
703 Vmath::Vdiv(nSolutionPts, uFields[i+1], 1, uFields[0], 1,
706 for (j = 0; j < nDimensions; ++j)
713 for (i = 0; i < nDimensions; ++i)
715 for (j = 0; j < nDimensions; ++j)
717 for (n = 0; n < nElements; n++)
719 phys_offset = pFields[0]->GetPhys_Offset(n);
721 pFields[i]->GetExp(n)->PhysDeriv(
722 j, velocity[i] + phys_offset,
723 auxArray = Dvelocity[i][j] + phys_offset);
727 pFields[0]->ExtractTracePhys(Dvelocity[i][j], traceDvelocity[i][j]);
732 &traceDvelocity[0][0][0], 1,
733 &traceFieldsAdded[17][0], 1);
735 &traceDvelocity[0][1][0], 1,
736 &traceFieldsAdded[18][0], 1);
738 &traceDvelocity[0][2][0], 1,
739 &traceFieldsAdded[19][0], 1);
741 &traceDvelocity[1][0][0], 1,
742 &traceFieldsAdded[20][0], 1);
744 &traceDvelocity[1][1][0], 1,
745 &traceFieldsAdded[21][0], 1);
747 &traceDvelocity[1][2][0], 1,
748 &traceFieldsAdded[22][0], 1);
750 &traceDvelocity[2][0][0], 1,
751 &traceFieldsAdded[23][0], 1);
753 &traceDvelocity[2][1][0], 1,
754 &traceFieldsAdded[24][0], 1);
756 &traceDvelocity[2][2][0], 1,
757 &traceFieldsAdded[25][0], 1);
778 if (m_ViscosityType ==
"Variable")
784 for (
int i = 0; i < nSolutionPts; ++i)
786 ratio = temperature[i] / T_star;
787 mu[i] = mu_star * ratio *
sqrt(ratio) *
788 (T_star + 110.0) / (temperature[i] + 110.0);
801 Vmath::Smul(nSolutionPts, 2.0, &mu[0], 1, &mu2[0], 1);
805 &Dvelocity[0][0][0], 1, &divVel[0], 1);
807 &Dvelocity[1][1][0], 1, &divVel[0], 1);
810 Vmath::Smul(nSolutionPts, lambda, &divVel[0], 1, &divVel[0], 1);
811 Vmath::Vmul(nSolutionPts, &mu[0], 1, &divVel[0], 1, &divVel[0], 1);
815 for (j = 0; j < m_spacedim; ++j)
820 Vmath::Vmul(nSolutionPts, &mu2[0], 1, &Dvelocity[j][j][0], 1,
823 Vmath::Vadd(nSolutionPts, &temp[j][0], 1, &divVel[0], 1, &Sgg[j][0], 1);
833 &Dvelocity[1][0][0], 1, &Sxy[0], 1);
837 &Dvelocity[2][0][0], 1, &Sxz[0], 1);
841 &Dvelocity[2][1][0], 1, &Syz[0], 1);
844 Vmath::Vmul(nSolutionPts, &mu[0], 1, &Sxy[0], 1, &Sxy[0], 1);
847 Vmath::Vmul(nSolutionPts, &mu[0], 1, &Sxz[0], 1, &Sxz[0], 1);
850 Vmath::Vmul(nSolutionPts, &mu[0], 1, &Syz[0], 1, &Syz[0], 1);
854 pFields[0]->ExtractTracePhys(Sgg[0], traceFieldsAdded[26]);
855 pFields[0]->ExtractTracePhys(Sgg[1], traceFieldsAdded[27]);
856 pFields[0]->ExtractTracePhys(Sgg[2], traceFieldsAdded[28]);
857 pFields[0]->ExtractTracePhys(Sxy, traceFieldsAdded[29]);
858 pFields[0]->ExtractTracePhys(Sxz, traceFieldsAdded[30]);
859 pFields[0]->ExtractTracePhys(Syz, traceFieldsAdded[31]);
865 pFields[0]->ExtractTracePhys(mu, traceFieldsAdded[32]);
876 Vmath::Smul (nSolutionPts, gamma, soundspeed, 1, soundspeed, 1);
877 Vmath::Vsqrt(nSolutionPts, soundspeed, 1, soundspeed, 1);
882 for (
int i = 0; i < m_spacedim; ++i)
890 Vmath::Vdiv(nSolutionPts, mach, 1, uFields[0], 1, mach, 1);
891 Vmath::Vdiv(nSolutionPts, mach, 1, uFields[0], 1, mach, 1);
893 Vmath::Vdiv(nSolutionPts, mach, 1, soundspeed, 1, mach, 1);
895 pFields[0]->ExtractTracePhys(mach, traceFieldsAdded[33]);
902 if (pFields[0]->GetBndCondExpansions().size())
906 nBndRegions = pFields[0]->GetBndCondExpansions().size();
907 for (b = 0; b < nBndRegions; ++b)
909 nBndEdges = pFields[0]->GetBndCondExpansions()[b]->GetExpSize();
910 for (e = 0; e < nBndEdges; ++e)
912 nBndEdgePts = pFields[0]->
913 GetBndCondExpansions()[b]->GetExp(e)->GetTotPoints();
915 id2 = pFields[0]->GetTrace()->
916 GetPhys_Offset(pFields[0]->GetTraceMap()->
917 GetBndCondIDToGlobalTraceID(cnt++));
919 if (pFields[0]->GetBndConditions()[b]->
920 GetUserDefined() ==
"WallViscous" ||
921 pFields[0]->GetBndConditions()[b]->
922 GetUserDefined() ==
"WallAdiabatic" ||
923 pFields[0]->GetBndConditions()[b]->
924 GetUserDefined() ==
"Wall")
943 if (pFields[0]->GetBndCondExpansions().size())
946 for (j = 0; j < nfields; ++j)
948 cout <<
"field " << j << endl;
952 nBndRegions = pFields[j]->GetBndCondExpansions().size();
953 for (b = 0; b < nBndRegions; ++b)
955 nBndEdges = pFields[j]->GetBndCondExpansions()[b]->GetExpSize();
956 for (e = 0; e < nBndEdges; ++e)
958 nBndEdgePts = pFields[j]->
959 GetBndCondExpansions()[b]->GetExp(e)->GetTotPoints();
961 id2 = pFields[j]->GetTrace()->
962 GetPhys_Offset(pFields[j]->GetTraceMap()->
963 GetBndCondIDToGlobalTraceID(cnt++));
965 if (pFields[j]->GetBndConditions()[b]->
966 GetUserDefined() ==
"WallViscous" ||
967 pFields[j]->GetBndConditions()[b]->
968 GetUserDefined() ==
"WallAdiabatic" ||
969 pFields[j]->GetBndConditions()[b]->
970 GetUserDefined() ==
"Wall")
973 &surfaceFields[j][id1], 1);
983 if (pFields[0]->GetBndCondExpansions().size())
985 for (j = 0; j < nfieldsAdded; ++j)
987 cout <<
"field added " << j << endl;
991 nBndRegions = pFields[0]->GetBndCondExpansions().size();
992 for (b = 0; b < nBndRegions; ++b)
994 nBndEdges = pFields[0]->GetBndCondExpansions()[b]->GetExpSize();
995 for (e = 0; e < nBndEdges; ++e)
997 nBndEdgePts = pFields[0]->
998 GetBndCondExpansions()[b]->GetExp(e)->GetTotPoints();
1000 id2 = pFields[0]->GetTrace()->
1001 GetPhys_Offset(pFields[0]->GetTraceMap()->
1002 GetBndCondIDToGlobalTraceID(cnt++));
1004 if (pFields[0]->GetBndConditions()[b]->
1005 GetUserDefined() ==
"WallViscous" ||
1006 pFields[0]->GetBndConditions()[b]->
1007 GetUserDefined() ==
"WallAdiabatic" ||
1008 pFields[0]->GetBndConditions()[b]->
1009 GetUserDefined() ==
"Wall")
1011 Vmath::Vcopy(nBndEdgePts, &traceFieldsAdded[j][id2], 1,
1012 &surfaceFieldsAdded[j][id1], 1);
1027 outfile.open(fname.c_str());
1028 outfile <<
"% x[m] " <<
" \t"
1040 <<
"rho[kg/m^3] " <<
" \t"
1041 <<
"rhou[kg/(m^2 s)] " <<
" \t"
1042 <<
"rhov[kg/(m^2 s)] " <<
" \t"
1043 <<
"rhow[kg/(m^2 s)] " <<
" \t"
1044 <<
"E[Pa] " <<
" \t"
1045 <<
"p[Pa] " <<
" \t"
1047 <<
"dT/dn[k/m] " <<
" \t"
1048 <<
"dp/dT[Pa/m] " <<
" \t"
1049 <<
"dp/dB[Pa/m] " <<
" \t"
1050 <<
"dp/dx[Pa/m] " <<
" \t"
1051 <<
"dp/dy[Pa/m] " <<
" \t"
1052 <<
"dp/dz[Pa/m] " <<
" \t"
1053 <<
"du/dx[s^-1] " <<
" \t"
1054 <<
"du/dy[s^-1] " <<
" \t"
1055 <<
"du/dz[s^-1] " <<
" \t"
1056 <<
"dv/dx[s^-1] " <<
" \t"
1057 <<
"dv/dy[s^-1] " <<
" \t"
1058 <<
"dv/dz[s^-1] " <<
" \t"
1059 <<
"dw/dx[s^-1] " <<
" \t"
1060 <<
"dw/dy[s^-1] " <<
" \t"
1061 <<
"dw/dz[s^-1] " <<
" \t"
1062 <<
"tau_xx[Pa] " <<
" \t"
1063 <<
"tau_yy[Pa] " <<
" \t"
1064 <<
"tau_zz[Pa] " <<
" \t"
1065 <<
"tau_xy[Pa] " <<
" \t"
1066 <<
"tau_xz[Pa] " <<
" \t"
1067 <<
"tau_yz[Pa] " <<
" \t"
1068 <<
"mu[Pa s] " <<
" \t"
1071 for (i = 0; i < nSurfacePts; ++i)
1073 outfile << scientific
1076 << surfaceX[i] <<
" \t "
1077 << surfaceY[i] <<
" \t "
1078 << surfaceZ[i] <<
" \t "
1079 << surfaceFieldsAdded[0][i] <<
" \t "
1080 << surfaceFieldsAdded[1][i] <<
" \t "
1081 << surfaceFieldsAdded[2][i] <<
" \t "
1082 << surfaceFieldsAdded[3][i] <<
" \t "
1083 << surfaceFieldsAdded[4][i] <<
" \t "
1084 << surfaceFieldsAdded[5][i] <<
" \t "
1085 << surfaceFieldsAdded[6][i] <<
" \t "
1086 << surfaceFieldsAdded[7][i] <<
" \t "
1087 << surfaceFieldsAdded[8][i] <<
" \t "
1088 << surfaceFields[0][i] <<
" \t "
1089 << surfaceFields[1][i] <<
" \t "
1090 << surfaceFields[2][i] <<
" \t "
1091 << surfaceFields[3][i] <<
" \t "
1092 << surfaceFields[4][i] <<
" \t "
1093 << surfaceFieldsAdded[9][i] <<
" \t "
1094 << surfaceFieldsAdded[10][i] <<
" \t "
1095 << surfaceFieldsAdded[11][i] <<
" \t "
1096 << surfaceFieldsAdded[12][i] <<
" \t "
1097 << surfaceFieldsAdded[13][i] <<
" \t "
1098 << surfaceFieldsAdded[14][i] <<
" \t "
1099 << surfaceFieldsAdded[15][i] <<
" \t "
1100 << surfaceFieldsAdded[16][i] <<
" \t "
1101 << surfaceFieldsAdded[17][i] <<
" \t "
1102 << surfaceFieldsAdded[18][i] <<
" \t "
1103 << surfaceFieldsAdded[19][i] <<
" \t "
1104 << surfaceFieldsAdded[20][i] <<
" \t "
1105 << surfaceFieldsAdded[21][i] <<
" \t "
1106 << surfaceFieldsAdded[22][i] <<
" \t "
1107 << surfaceFieldsAdded[23][i] <<
" \t "
1108 << surfaceFieldsAdded[24][i] <<
" \t "
1109 << surfaceFieldsAdded[25][i] <<
" \t "
1110 << surfaceFieldsAdded[26][i] <<
" \t "
1111 << surfaceFieldsAdded[27][i] <<
" \t "
1112 << surfaceFieldsAdded[28][i] <<
" \t "
1113 << surfaceFieldsAdded[29][i] <<
" \t "
1114 << surfaceFieldsAdded[30][i] <<
" \t "
1115 << surfaceFieldsAdded[31][i] <<
" \t "
1116 << surfaceFieldsAdded[32][i] <<
" \t "
1117 << surfaceFieldsAdded[33][i] <<
" \t "
1120 outfile << endl << endl;
#define ASSERTL0(condition, msg)
General purpose memory allocation routines with the ability to allocate from thread specific memory p...
void Import(const std::string &infilename, std::vector< FieldDefinitionsSharedPtr > &fielddefs, std::vector< std::vector< NekDouble > > &fielddata, FieldMetaDataMap &fieldinfomap, const Array< OneD, int > &ElementIDs)
This function allows for data to be imported from an FLD file when a session and/or communicator is n...
std::shared_ptr< SessionReader > SessionReaderSharedPtr
@ ePolyEvenlySpaced
1D Evenly-spaced points using Lagrange polynomial
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
The above copyright notice and this permission notice shall be included.
void Vsqrt(int n, const T *x, const int incx, T *y, const int incy)
sqrt y = sqrt(x)
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
void Vvtvp(int n, const T *w, const int incw, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
vvtvp (vector times vector plus vector): z = w*x + y
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
void Vdiv(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x/y.
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.
scalarT< T > sqrt(scalarT< T > in)