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
42
43namespace Nektar
44{
45/**
46 *
47 *
48 **/
50{
51public:
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
69protected:
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
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,
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,
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,
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
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
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
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);
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.
EquationOfStateSharedPtr m_eos
Equation of system for computing temperature.
NavierStokesCFE(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
void CalcViscosity(const Array< OneD, const Array< OneD, NekDouble > > &inaverg, Array< OneD, NekDouble > &mu)
void SpecialBndTreat(Array< OneD, Array< OneD, NekDouble > > &consvar)
For very special treatment. For general boundaries it does nothing But for WallViscous and WallAdiaba...
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 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.
static std::string className
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
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
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.
virtual void v_ExtraFldOutput(std::vector< Array< OneD, NekDouble > > &fieldcoeffs, std::vector< std::string > &variables) override
bool m_is_shockCaptPhys
flag for shock capturing switch on/off an enum could be added for more options
MultiRegions::ContFieldSharedPtr m_C0ProjectExp
virtual bool v_SupportsShockCaptType(const std::string type) const override
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.
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)
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.
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 GetPhysicalAV(const Array< OneD, const Array< OneD, NekDouble > > &physfield)
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)
bool m_is_diffIP
flag to switch between IP and LDG an enum could be added for more options
void Ducros(Array< OneD, NekDouble > &field)
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)
void GetArtificialViscosity(const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, NekDouble > &muav)
void GetViscosityAndThermalCondFromTempKernel(const T &temperature, T &mu, T &thermalCond)
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.
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< ContField > ContFieldSharedPtr
Definition: ContField.h:270
std::shared_ptr< EquationSystem > EquationSystemSharedPtr
A shared pointer to an EquationSystem object.
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
Definition: MeshGraph.h:176
std::vector< double > d(NPUPPER *NPUPPER)
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