53 "Computes wall shear stress field.");
68 int nfields =
m_f->m_variables.size();
69 int expdim =
m_f->m_graph->GetSpaceDimension();
73 if (
m_f->m_exp[0]->GetNumElmts() == 0)
80 ASSERTL0(
false,
"Error: wss for a 1D problem cannot "
100 m_f->m_exp.resize(nshear);
101 for (i = nfields; i < nshear; ++i)
103 m_f->m_exp[nfields + i] =
m_f->AppendExpList(
m_f->m_numHomogeneousDir);
109 m_f->m_exp[0]->GetGraph());
112 map<int, int> BndRegionMap;
114 for (
auto &breg_it : bregions)
116 BndRegionMap[breg_it.first] = cnt++;
120 for (
int b = 0; b <
m_f->m_bndRegionsToWrite.size(); ++b)
122 if (BndRegionMap.count(
m_f->m_bndRegionsToWrite[b]) == 1)
124 int bnd = BndRegionMap[
m_f->m_bndRegionsToWrite[b]];
127 for (i = 0; i < nshear; i++)
129 BndExp[i] =
m_f->m_exp[i]->UpdateBndCondExpansion(bnd);
131 for (i = 0; i < nfields; i++)
133 m_f->m_exp[i]->GetBndElmtExpansion(bnd, BndElmtExp[i]);
137 int nqb = BndExp[0]->GetTotPoints();
138 int nqe = BndElmtExp[0]->GetTotPoints();
143 for (i = 0; i < ngrad; ++i)
148 for (i = 0; i < nstress; ++i)
156 for (i = 0; i < nstress; ++i)
161 for (i = 0; i < nshear; ++i)
179 BndElmtExp[i]->PhysDeriv(velocity[i],
185 BndElmtExp[i]->PhysDeriv(velocity[i],
229 for (j = 0; j < nstress; ++j)
231 m_f->m_exp[0]->ExtractElmtToBndPhys(bnd, stress[j], fstress[j]);
236 m_f->m_exp[0]->GetBoundaryNormals(bnd, normals);
251 fshear[i], 1, fshear[i], 1);
259 fshear[nshear - 1], 1, fshear[nshear - 1], 1);
262 fshear[nshear - 1], 1);
267 fshear[i], 1, fshear[i], 1);
268 BndExp[i]->FwdTrans_IterPerExp(fshear[i],
269 BndExp[i]->UpdateCoeffs());
277 fshear[nshear - 1], 1, fshear[nshear - 1], 1);
279 Vmath::Vsqrt(nqb, fshear[nshear - 1], 1, fshear[nshear - 1], 1);
280 BndExp[nshear - 1]->FwdTrans_IterPerExp(fshear[nshear - 1],
281 BndExp[nshear - 1]->UpdateCoeffs());
287 m_f->m_variables[0] =
"Shear_x";
288 m_f->m_variables[1] =
"Shear_y";
289 m_f->m_variables[2] =
"Shear_mag";
293 m_f->m_variables[0] =
"Shear_x";
294 m_f->m_variables[1] =
"Shear_y";
295 m_f->m_variables[2] =
"Shear_z";
296 m_f->m_variables[3] =
"Shear_mag";
306 int npoints = exp[0]->GetNpoints();
308 if(boost::iequals(
m_f->m_variables[0],
"u"))
311 m_mu =
m_f->m_session->GetParameter(
"Kinvis");
315 else if(boost::iequals(
m_f->m_variables[0],
"rho") &&
316 boost::iequals(
m_f->m_variables[1],
"rhou"))
319 std::string m_ViscosityType;
320 m_f->m_session->LoadParameter (
"mu",
m_mu, 1.78e-05);
321 m_f->m_session->LoadParameter (
"lambda", lambda, -2.0/3.0);
322 m_f->m_session->LoadSolverInfo(
"ViscosityType", m_ViscosityType
325 if (m_ViscosityType ==
"Variable")
330 m_f->m_session->LoadSolverInfo(
"EquationOfState", eosType,
332 m_idealGas = boost::iequals(eosType,
"IdealGas");
334 "Only IdealGas EOS implemented for Variable ViscosityType");
342 m_f->m_session->LoadParameter(
"Gamma", m_gamma, 1.4);
343 m_f->m_session->LoadParameter(
"pInf", m_pInf, 101325);
344 m_f->m_session->LoadParameter(
"rhoInf",
m_rhoInf, 1.225);
345 m_f->m_session->LoadParameter(
"GasConstant", m_gasConstant
349 cv_inv = (m_gamma - 1.0) / m_gasConstant;
359 , exp[i + 1]->GetPhys(), 1, tmp, 1);
361 Vmath::Vdiv(npoints, tmp, 1, exp[0]->GetPhys(), 1, tmp, 1);
365 Vmath::Vsub(npoints, energy, 1, tmp, 1, energy, 1);
368 Vmath::Vdiv(npoints, energy, 1, exp[0]->GetPhys(), 1, energy, 1);
370 Vmath::Smul(npoints, cv_inv, energy, 1, temperature, 1 );
382 for (
int i = 0; i < npoints; ++i)
384 ratio = temperature[i] / T_star;
385 mu[i] = mu_star * ratio *
sqrt(ratio) * (1 + C) / (ratio + C);
396 ASSERTL0(
false,
"Invalid variables for WSS");
404 int npoints = exp[0]->GetNpoints();
405 if(boost::iequals(
m_f->m_variables[0],
"u"))
412 exp[i]->GetPhys(), 1,
416 else if(boost::iequals(
m_f->m_variables[0],
"rho") &&
417 boost::iequals(
m_f->m_variables[1],
"rhou"))
424 exp[i + 1]->GetPhys(), 1,
425 exp[0]->GetPhys(), 1,
432 ASSERTL0(
false,
"Could not identify velocity for WSS");
#define ASSERTL0(condition, msg)
FieldSharedPtr m_f
Field object.
void GetViscosity(const Array< OneD, MultiRegions::ExpListSharedPtr > exp, Array< OneD, NekDouble > &mu, NekDouble &lambda)
virtual void Process(po::variables_map &vm)
Write mesh to output file.
void GetVelocity(const Array< OneD, MultiRegions::ExpListSharedPtr > exp, Array< OneD, Array< OneD, NekDouble > > &vel)
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
const BoundaryRegionCollection & GetBoundaryRegions(void) const
std::shared_ptr< Field > FieldSharedPtr
std::pair< ModuleType, std::string > ModuleKey
ModuleFactory & GetModuleFactory()
std::map< int, BoundaryRegionShPtr > BoundaryRegionCollection
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 Neg(int n, T *x, const int incx)
Negate x = -x.
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 Zero(int n, T *x, const int incx)
Zero vector.
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)