Nektar++
NavierStokesCFE.h
Go to the documentation of this file.
1 ///////////////////////////////////////////////////////////////////////////////
2 //
3 // File: NavierStokesCFE.h
4 //
5 // For more information, please see: http://www.nektar.info
6 //
7 // The MIT License
8 //
9 // Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
10 // Department of Aeronautics, Imperial College London (UK), and Scientific
11 // Computing and Imaging Institute, University of Utah (USA).
12 //
13 // Permission is hereby granted, free of charge, to any person obtaining a
14 // copy of this software and associated documentation files (the "Software"),
15 // to deal in the Software without restriction, including without limitation
16 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
17 // and/or sell copies of the Software, and to permit persons to whom the
18 // Software is furnished to do so, subject to the following conditions:
19 //
20 // The above copyright notice and this permission notice shall be included
21 // in all copies or substantial portions of the Software.
22 //
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
29 // DEALINGS IN THE SOFTWARE.
30 //
31 // Description: NavierStokes equations in conservative variable
32 //
33 ///////////////////////////////////////////////////////////////////////////////
34 
35 #ifndef NEKTAR_SOLVERS_COMPRESSIBLEFLOWSOLVER_EQUATIONSYSTEMS_NAVIERSTOKESCFE_H
36 #define NEKTAR_SOLVERS_COMPRESSIBLEFLOWSOLVER_EQUATIONSYSTEMS_NAVIERSTOKESCFE_H
37 
41 #include <MultiRegions/ContField.h>
42 
43 namespace Nektar
44 {
45 /**
46  *
47  *
48  **/
50 {
51 public:
52  friend class MemoryManager<NavierStokesCFE>;
53 
54  // Creates an instance of this class
58  {
61  p->InitObject();
62  return p;
63  }
64  // Name of class
65  static std::string className;
66 
67  virtual ~NavierStokesCFE();
68 
69 protected:
70  std::string m_ViscosityType;
71  /// flag to switch between constant viscosity and Sutherland
72  /// an enum could be added for more options
73  bool m_is_mu_variable{false};
74  /// flag to switch between IP and LDG
75  /// an enum could be added for more options
76  bool m_is_diffIP{false};
77  /// flag for shock capturing switch on/off
78  /// an enum could be added for more options
79  bool m_is_shockCaptPhys{false};
80 
84 
85  std::string m_physicalSensorType;
86  std::string m_smoothing;
88 
89  /// Equation of system for computing temperature
91 
95 
98 
100  const size_t nDim, const Array<OneD, Array<OneD, NekDouble>> &inarray,
101  const TensorOfArray3D<NekDouble> &qfields,
102  TensorOfArray3D<NekDouble> &outarray,
103  Array<OneD, int> &nonZeroIndex = NullInt1DArray,
104  const Array<OneD, Array<OneD, NekDouble>> &normal =
106 
108  const size_t nSpaceDim,
109  const Array<OneD, Array<OneD, NekDouble>> &inaverg,
110  const Array<OneD, Array<OneD, NekDouble>> &inarray,
111  TensorOfArray3D<NekDouble> &outarray, Array<OneD, int> &nonZeroIndex,
112  const Array<OneD, Array<OneD, NekDouble>> &normals);
113 
115 
117  const Array<OneD, Array<OneD, NekDouble>> &inarray,
118  Array<OneD, NekDouble> &muav);
119 
120  void CalcViscosity(const Array<OneD, const Array<OneD, NekDouble>> &inaverg,
122 
123  void InitObject_Explicit();
124 
125  virtual void v_InitObject(bool DeclareField = true) override;
126 
127  virtual void v_DoDiffusion(
128  const Array<OneD, Array<OneD, NekDouble>> &inarray,
129  Array<OneD, Array<OneD, NekDouble>> &outarray,
130  const Array<OneD, Array<OneD, NekDouble>> &pFwd,
131  const Array<OneD, Array<OneD, NekDouble>> &pBwd) override;
132 
133  virtual void v_GetViscousFluxVector(
134  const Array<OneD, const Array<OneD, NekDouble>> &physfield,
135  TensorOfArray3D<NekDouble> &derivatives,
136  TensorOfArray3D<NekDouble> &viscousTensor);
137 
138  virtual void v_GetViscousFluxVectorDeAlias(
139  const Array<OneD, const Array<OneD, NekDouble>> &physfield,
140  TensorOfArray3D<NekDouble> &derivatives,
141  TensorOfArray3D<NekDouble> &viscousTensor);
142 
144  const Array<OneD, const Array<OneD, NekDouble>> &physfield);
145 
148 
149  virtual void v_GetFluxPenalty(
150  const Array<OneD, const Array<OneD, NekDouble>> &uFwd,
151  const Array<OneD, const Array<OneD, NekDouble>> &uBwd,
152  Array<OneD, Array<OneD, NekDouble>> &penaltyCoeff);
153 
155  const Array<OneD, NekDouble> &temperature, Array<OneD, NekDouble> &mu,
156  Array<OneD, NekDouble> &thermalCond);
157 
158  void GetDivCurlSquared(
160  const Array<OneD, Array<OneD, NekDouble>> &cnsVar,
162  const Array<OneD, Array<OneD, NekDouble>> &cnsVarFwd,
163  const Array<OneD, Array<OneD, NekDouble>> &cnsVarBwd);
164 
167  Array<OneD, NekDouble> &curlSquare);
168 
169  virtual void v_ExtraFldOutput(
170  std::vector<Array<OneD, NekDouble>> &fieldcoeffs,
171  std::vector<std::string> &variables) override;
172 
173  template <class T, typename = typename std::enable_if<
174  std::is_floating_point<T>::value ||
176  inline void GetViscosityAndThermalCondFromTempKernel(const T &temperature,
177  T &mu, T &thermalCond)
178  {
179  GetViscosityFromTempKernel(temperature, mu);
180  NekDouble tRa = m_Cp / m_Prandtl;
181  thermalCond = tRa * mu;
182  }
183 
184  template <class T, typename = typename std::enable_if<
185  std::is_floating_point<T>::value ||
187  inline void GetViscosityFromTempKernel(const T &temperature, T &mu)
188  {
189  // Variable viscosity through the Sutherland's law
190  if (m_is_mu_variable)
191  {
192  mu = m_varConv->GetDynamicViscosity(temperature);
193  }
194  else
195  {
196  mu = m_muRef;
197  }
198  }
199 
200  /**
201  * @brief Calculate diffusion flux using the Jacobian form.
202  *
203  * @param in
204  *
205  * @param out
206  * outarray[nvars] flux
207  */
208  template <class T, typename = typename std::enable_if<
209  std::is_floating_point<T>::value ||
212  const unsigned short nDim, const unsigned short FluxDirection,
213  const unsigned short DerivDirection,
214  // these need to be a pointers because of the custom allocator of vec_t
215  const T *inaverg, const T *injumpp, const T &mu, T *outarray)
216  {
217  // Constants
218  unsigned short nDim_plus_one = nDim + 1;
219  unsigned short FluxDirection_plus_one = FluxDirection + 1;
220  unsigned short DerivDirection_plus_one = DerivDirection + 1;
221 
222  NekDouble gammaoPr = m_gamma / m_Prandtl;
223  NekDouble one_minus_gammaoPr = 1.0 - gammaoPr;
224 
225  constexpr NekDouble OneThird = 1. / 3.;
226  constexpr NekDouble TwoThird = 2. * OneThird;
227  constexpr NekDouble FourThird = 4. * OneThird;
228 
229  if (DerivDirection == FluxDirection)
230  {
231  // rho flux always zero
232  outarray[0] = 0.0; // store 1x
233 
234  // load 1/rho
235  T oneOrho = 1.0 / inaverg[0]; // load 1x
236  // get vel, vel^2, sum of vel^2
237  std::array<T, 3> u = {{0.0, 0.0, 0.0}};
238  std::array<T, 3> u2 = {{0.0, 0.0, 0.0}};
239  T u2sum{};
240  for (unsigned short d = 0; d < nDim; ++d)
241  {
242  u[d] = inaverg[d + 1] * oneOrho; // load 1x
243  u2[d] = u[d] * u[d];
244  u2sum += u2[d];
245  }
246 
247  // get E - sum v^2
248  T E_minus_u2sum = inaverg[nDim_plus_one]; // load 1x
249  E_minus_u2sum *= oneOrho;
250  E_minus_u2sum -= u2sum;
251 
252  // get nu = mu/rho
253  T nu = mu * oneOrho; // load 1x
254 
255  // ^^^^ above is almost the same for both loops
256 
257  T tmp1 = OneThird * u2[FluxDirection] + u2sum;
258  tmp1 += gammaoPr * E_minus_u2sum;
259  tmp1 *= injumpp[0]; // load 1x
260 
261  T tmp2 = gammaoPr * injumpp[nDim_plus_one] - tmp1; // load 1x
262 
263  // local var for energy output
264  T outTmpE = 0.0;
265  for (unsigned short d = 0; d < nDim; ++d)
266  {
267  unsigned short d_plus_one = d + 1;
268  // flux[rhou, rhov, rhow]
269  T outTmpD = injumpp[d_plus_one] - u[d] * injumpp[0];
270  outTmpD *= nu;
271  // flux rhoE
272  T tmp3 = one_minus_gammaoPr * u[d];
273  outTmpE += tmp3 * injumpp[d_plus_one];
274 
275  if (d == FluxDirection)
276  {
277  outTmpD *= FourThird;
278  T tmp4 = OneThird * u[FluxDirection];
279  outTmpE += tmp4 * injumpp[FluxDirection_plus_one];
280  }
281 
282  outarray[d_plus_one] = outTmpD; // store 1x
283  }
284 
285  outTmpE += tmp2;
286  outTmpE *= nu;
287  outarray[nDim_plus_one] = outTmpE; // store 1x
288  }
289  else
290  {
291  // rho flux always zero
292  outarray[0] = 0.0; // store 1x
293 
294  // load 1/rho
295  T oneOrho = 1.0 / inaverg[0]; // load 1x
296  // get vel, vel^2, sum of vel^2
297  std::array<T, 3> u, u2;
298  T u2sum{};
299  for (unsigned short d = 0; d < nDim; ++d)
300  {
301  unsigned short d_plus_one = d + 1;
302  u[d] = inaverg[d_plus_one] * oneOrho; // load 1x
303  u2[d] = u[d] * u[d];
304  u2sum += u2[d];
305  // Not all directions are set
306  // one could work out the one that is not set
307  outarray[d_plus_one] = 0.0; // store 1x
308  }
309 
310  // get E - sum v^2
311  T E_minus_u2sum = inaverg[nDim_plus_one]; // load 1x
312  E_minus_u2sum *= oneOrho;
313  E_minus_u2sum -= u2sum;
314 
315  // get nu = mu/rho
316  T nu = mu * oneOrho; // load 1x
317 
318  // ^^^^ above is almost the same for both loops
319 
320  T tmp1 = u[DerivDirection] * injumpp[0] -
321  injumpp[DerivDirection_plus_one]; // load 2x
322  tmp1 *= TwoThird;
323  outarray[FluxDirection_plus_one] = nu * tmp1; // store 1x
324 
325  tmp1 =
326  injumpp[FluxDirection_plus_one] - u[FluxDirection] * injumpp[0];
327  outarray[DerivDirection_plus_one] = nu * tmp1; // store 1x
328 
329  tmp1 = OneThird * u[FluxDirection] * u[DerivDirection];
330  tmp1 *= injumpp[0];
331 
332  T tmp2 =
333  TwoThird * u[FluxDirection] * injumpp[DerivDirection_plus_one];
334 
335  tmp1 += tmp2;
336 
337  tmp1 = u[DerivDirection] * injumpp[FluxDirection_plus_one] - tmp1;
338  outarray[nDim_plus_one] = nu * tmp1; // store 1x
339  }
340  }
341 
342  /**
343  * @brief Return the flux vector for the IP diffusion problem, based on
344  * conservative variables
345  */
346  template <bool IS_TRACE>
348  const size_t nDim, const Array<OneD, Array<OneD, NekDouble>> &inarray,
349  const TensorOfArray3D<NekDouble> &qfields,
350  TensorOfArray3D<NekDouble> &outarray, Array<OneD, int> &nonZeroIndex,
351  const Array<OneD, Array<OneD, NekDouble>> &normal)
352  {
353  size_t nConvectiveFields = inarray.size();
354  size_t nPts = inarray[0].size();
355  size_t n_nonZero = nConvectiveFields - 1;
356 
357  // max outfield dimensions
358  constexpr unsigned short nOutMax = 3 - 2 * IS_TRACE;
359  constexpr unsigned short nVarMax = 5;
360  constexpr unsigned short nDimMax = 3;
361 
362  // Update viscosity and thermal conductivity
363  // unfortunately the artificial viscosity is difficult to vectorize
364  // with the current implementation
365  Array<OneD, NekDouble> temperature(nPts, 0.0);
366  Array<OneD, NekDouble> mu(nPts, 0.0);
367  Array<OneD, NekDouble> thermalConductivity(nPts, 0.0);
368  m_varConv->GetTemperature(inarray, temperature);
369  GetViscosityAndThermalCondFromTemp(temperature, mu,
370  thermalConductivity);
371 
372  // vector loop
373  using namespace tinysimd;
374  using vec_t = simd<NekDouble>;
375  size_t sizeVec = (nPts / vec_t::width) * vec_t::width;
376  size_t p = 0;
377 
378  for (; p < sizeVec; p += vec_t::width)
379  {
380  // there is a significant penalty to use std::vector
381  alignas(vec_t::alignment) std::array<vec_t, nVarMax> inTmp,
382  qfieldsTmp, outTmp;
383  alignas(vec_t::alignment) std::array<vec_t, nDimMax> normalTmp;
384  alignas(vec_t::alignment) std::array<vec_t, nVarMax * nOutMax>
385  outArrTmp{{}};
386 
387  // rearrenge and load data
388  for (size_t f = 0; f < nConvectiveFields; ++f)
389  {
390  inTmp[f].load(&(inarray[f][p]), is_not_aligned);
391  // zero output vector
392  if (IS_TRACE)
393  {
394  outArrTmp[f] = 0.0;
395  }
396  else
397  {
398  for (size_t d = 0; d < nDim; ++d)
399  {
400  outArrTmp[f + nConvectiveFields * d] = 0.0;
401  }
402  }
403  }
404  if (IS_TRACE)
405  {
406  for (size_t d = 0; d < nDim; ++d)
407  {
408  normalTmp[d].load(&(normal[d][p]), is_not_aligned);
409  }
410  }
411 
412  // get viscosity
413  vec_t muV{};
414  muV.load(&(mu[p]), is_not_aligned);
415 
416  for (size_t nderiv = 0; nderiv < nDim; ++nderiv)
417  {
418  // rearrenge and load data
419  for (size_t f = 0; f < nConvectiveFields; ++f)
420  {
421  qfieldsTmp[f].load(&(qfields[nderiv][f][p]),
423  }
424 
425  for (size_t d = 0; d < nDim; ++d)
426  {
428  nDim, d, nderiv, inTmp.data(), qfieldsTmp.data(), muV,
429  outTmp.data());
430 
431  if (IS_TRACE)
432  {
433  for (size_t f = 0; f < nConvectiveFields; ++f)
434  {
435  outArrTmp[f] += normalTmp[d] * outTmp[f];
436  }
437  }
438  else
439  {
440  for (size_t f = 0; f < nConvectiveFields; ++f)
441  {
442  outArrTmp[f + nConvectiveFields * d] += outTmp[f];
443  }
444  }
445  }
446  }
447 
448  // store data
449  if (IS_TRACE)
450  {
451  for (size_t f = 0; f < nConvectiveFields; ++f)
452  {
453  outArrTmp[f].store(&(outarray[0][f][p]), is_not_aligned);
454  }
455  }
456  else
457  {
458  for (size_t d = 0; d < nDim; ++d)
459  {
460  for (size_t f = 0; f < nConvectiveFields; ++f)
461  {
462  outArrTmp[f + nConvectiveFields * d].store(
463  &(outarray[d][f][p]), is_not_aligned);
464  }
465  }
466  }
467  }
468 
469  // scalar loop
470  for (; p < nPts; ++p)
471  {
472  std::array<NekDouble, nVarMax> inTmp, qfieldsTmp, outTmp;
473  std::array<NekDouble, nDimMax> normalTmp;
474  std::array<NekDouble, nVarMax * nOutMax> outArrTmp{{}};
475  // rearrenge and load data
476  for (size_t f = 0; f < nConvectiveFields; ++f)
477  {
478  inTmp[f] = inarray[f][p];
479  // zero output vector
480  if (IS_TRACE)
481  {
482  outArrTmp[f] = 0.0;
483  }
484  else
485  {
486  for (size_t d = 0; d < nDim; ++d)
487  {
488  outArrTmp[f + nConvectiveFields * d] = 0.0;
489  }
490  }
491  }
492 
493  if (IS_TRACE)
494  {
495  for (size_t d = 0; d < nDim; ++d)
496  {
497  normalTmp[d] = normal[d][p];
498  }
499  }
500 
501  // get viscosity
502  NekDouble muS = mu[p];
503 
504  for (size_t nderiv = 0; nderiv < nDim; ++nderiv)
505  {
506  // rearrenge and load data
507  for (size_t f = 0; f < nConvectiveFields; ++f)
508  {
509  qfieldsTmp[f] = qfields[nderiv][f][p];
510  }
511 
512  for (size_t d = 0; d < nDim; ++d)
513  {
515  nDim, d, nderiv, inTmp.data(), qfieldsTmp.data(), muS,
516  outTmp.data());
517 
518  if (IS_TRACE)
519  {
520  for (size_t f = 0; f < nConvectiveFields; ++f)
521  {
522  outArrTmp[f] += normalTmp[d] * outTmp[f];
523  }
524  }
525  else
526  {
527  for (size_t f = 0; f < nConvectiveFields; ++f)
528  {
529  outArrTmp[f + nConvectiveFields * d] += outTmp[f];
530  }
531  }
532  }
533  }
534 
535  // store data
536  if (IS_TRACE)
537  {
538  for (size_t f = 0; f < nConvectiveFields; ++f)
539  {
540  outarray[0][f][p] = outArrTmp[f];
541  }
542  }
543  else
544  {
545  for (size_t d = 0; d < nDim; ++d)
546  {
547  for (size_t f = 0; f < nConvectiveFields; ++f)
548  {
549  outarray[d][f][p] =
550  outArrTmp[f + nConvectiveFields * d];
551  }
552  }
553  }
554  }
555 
556  // this is always the same, it should be initialized with the IP class
557  nonZeroIndex = Array<OneD, int>{n_nonZero, 0};
558  for (int i = 1; i < n_nonZero + 1; ++i)
559  {
560  nonZeroIndex[n_nonZero - i] = nConvectiveFields - i;
561  }
562  }
563 
564  virtual bool v_SupportsShockCaptType(const std::string type) const override;
565 };
566 
567 } // namespace Nektar
568 #endif
VariableConverterSharedPtr m_varConv
General purpose memory allocation routines with the ability to allocate from thread specific memory p...
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
void CalcViscosity(const Array< OneD, const Array< OneD, NekDouble >> &inaverg, Array< OneD, NekDouble > &mu)
EquationOfStateSharedPtr m_eos
Equation of system for computing temperature.
NavierStokesCFE(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
virtual void v_GetViscousFluxVector(const Array< OneD, const Array< OneD, NekDouble >> &physfield, TensorOfArray3D< NekDouble > &derivatives, TensorOfArray3D< NekDouble > &viscousTensor)
Return the flux vector for the LDG diffusion problem.
void GetDivCurlFromDvelT(const TensorOfArray3D< NekDouble > &pVarDer, Array< OneD, NekDouble > &div, Array< OneD, NekDouble > &curlSquare)
Get divergence and curl from velocity derivative tensor.
static SolverUtils::EquationSystemSharedPtr create(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
virtual void v_InitObject(bool DeclareField=true) override
Initialization object for CompressibleFlowSystem class.
void SpecialBndTreat(Array< OneD, Array< OneD, NekDouble >> &consvar)
For very special treatment. For general boundaries it does nothing But for WallViscous and WallAdiaba...
void GetPhysicalAV(const Array< OneD, const Array< OneD, NekDouble >> &physfield)
void GetDivCurlSquared(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &cnsVar, Array< OneD, NekDouble > &div, Array< OneD, NekDouble > &curlSquare, const Array< OneD, Array< OneD, NekDouble >> &cnsVarFwd, const Array< OneD, Array< OneD, NekDouble >> &cnsVarBwd)
Get divergence and curl squared.
virtual void v_DoDiffusion(const Array< OneD, Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const Array< OneD, Array< OneD, NekDouble >> &pFwd, const Array< OneD, Array< OneD, NekDouble >> &pBwd) override
void GetArtificialViscosity(const Array< OneD, Array< OneD, NekDouble >> &inarray, Array< OneD, NekDouble > &muav)
static std::string className
void GetViscousSymmtrFluxConservVar(const size_t nSpaceDim, const Array< OneD, Array< OneD, NekDouble >> &inaverg, const Array< OneD, Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &outarray, Array< OneD, int > &nonZeroIndex, const Array< OneD, Array< OneD, NekDouble >> &normals)
Calculate and return the Symmetric flux in IP method.
std::string m_physicalSensorType
NekDouble m_thermalConductivityRef
bool m_is_mu_variable
flag to switch between constant viscosity and Sutherland an enum could be added for more options
bool m_is_shockCaptPhys
flag for shock capturing switch on/off an enum could be added for more options
virtual void v_GetViscousFluxVectorDeAlias(const Array< OneD, const Array< OneD, NekDouble >> &physfield, TensorOfArray3D< NekDouble > &derivatives, TensorOfArray3D< NekDouble > &viscousTensor)
Return the flux vector for the LDG diffusion problem.
MultiRegions::ContFieldSharedPtr m_C0ProjectExp
virtual bool v_SupportsShockCaptType(const std::string type) const override
void GetViscosityAndThermalCondFromTemp(const Array< OneD, NekDouble > &temperature, Array< OneD, NekDouble > &mu, Array< OneD, NekDouble > &thermalCond)
Update viscosity todo: add artificial viscosity here.
void C0Smooth(Array< OneD, NekDouble > &field)
bool m_is_diffIP
flag to switch between IP and LDG an enum could be added for more options
virtual void v_ExtraFldOutput(std::vector< Array< OneD, NekDouble >> &fieldcoeffs, std::vector< std::string > &variables) override
void Ducros(Array< OneD, NekDouble > &field)
void GetViscousFluxVectorConservVar(const size_t nDim, const Array< OneD, Array< OneD, NekDouble >> &inarray, const TensorOfArray3D< NekDouble > &qfields, TensorOfArray3D< NekDouble > &outarray, Array< OneD, int > &nonZeroIndex, const Array< OneD, Array< OneD, NekDouble >> &normal)
Return the flux vector for the IP diffusion problem, based on conservative variables.
void GetViscousFluxBilinearFormKernel(const unsigned short nDim, const unsigned short FluxDirection, const unsigned short DerivDirection, const T *inaverg, const T *injumpp, const T &mu, T *outarray)
Calculate diffusion flux using the Jacobian form.
void GetViscosityFromTempKernel(const T &temperature, T &mu)
virtual void v_GetFluxPenalty(const Array< OneD, const Array< OneD, NekDouble >> &uFwd, const Array< OneD, const Array< OneD, NekDouble >> &uBwd, Array< OneD, Array< OneD, NekDouble >> &penaltyCoeff)
Return the penalty vector for the LDGNS diffusion problem.
void GetViscosityAndThermalCondFromTempKernel(const T &temperature, T &mu, T &thermalCond)
void GetViscousFluxVectorConservVar(const size_t nDim, const Array< OneD, Array< OneD, NekDouble >> &inarray, const TensorOfArray3D< NekDouble > &qfields, TensorOfArray3D< NekDouble > &outarray, Array< OneD, int > &nonZeroIndex=NullInt1DArray, const Array< OneD, Array< OneD, NekDouble >> &normal=NullNekDoubleArrayOfArray)
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< ContField > ContFieldSharedPtr
Definition: ContField.h:289
std::shared_ptr< EquationSystem > EquationSystemSharedPtr
A shared pointer to an EquationSystem object.
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
Definition: MeshGraph.h:172
The above copyright notice and this permission notice shall be included.
Definition: CoupledSolver.h:2
static Array< OneD, int > NullInt1DArray
static Array< OneD, Array< OneD, NekDouble > > NullNekDoubleArrayOfArray
std::shared_ptr< EquationOfState > EquationOfStateSharedPtr
A shared pointer to an equation of state object.
tinysimd::simd< NekDouble > vec_t
double NekDouble
static constexpr struct tinysimd::is_not_aligned_t is_not_aligned
typename abi< ScalarType, width >::type simd
Definition: tinysimd.hpp:80