32#include "../../../Common/include/option_structure.hpp"
33#include "../../../Common/include/parallelization/vectorization.hpp"
34#include "../../../Common/include/containers/C2DContainer.hpp"
35#include "../../../Common/include/linear_algebra/CSysVector.hpp"
36#include "../../../Common/include/linear_algebra/CSysMatrix.hpp"
46#ifdef CODI_FORWARD_TYPE
61 enum :
size_t {
Align =
alignof(Type) };
64template <
class Scalar_t,
size_t N>
73template <
class Type,
size_t Size>
76template <
class Type,
size_t Rows,
size_t Cols>
92 static constexpr size_t Size = 1;
98 static constexpr size_t Size = N;
106template <
class Double>
111 using Int =
unsigned long;
112 static constexpr bool IsArray =
false;
115template <
class Scalar_t,
size_t N>
118 static constexpr bool IsArray =
true;
124inline constexpr size_t Max(
size_t a,
size_t b) {
return a > b ? a : b; }
168template <
class Double,
size_t nVar_>
186 for (
size_t iVar = 0; iVar <
nVar; ++iVar) {
189 for (
size_t jVar = 0; jVar <
nVar; ++jVar) {
202template <
size_t nDim,
class ForwardIterator,
class T>
203FORCEINLINE auto dot(ForwardIterator iterator,
const T* ptr) ->
typename std::decay<
decltype(*ptr)>::type {
204 typename std::decay<
decltype(*ptr)>::type sum = 0.0;
205 for (
size_t iDim = 0; iDim < nDim; ++iDim) {
206 sum += *(iterator++) * ptr[iDim];
214template <
size_t nDim,
class Double,
class ForwardIterator>
216 return dot<nDim>(iterator, vector.
data());
222template <
size_t nDim,
class Double>
224 return dot<nDim>(a.
data(), b.
data());
230template <
size_t nDim,
class ForwardIterator>
232 typename std::decay<
decltype(*iterator)>::type sum = 0.0;
233 for (
size_t iDim = 0; iDim < nDim; ++iDim) {
234 sum +=
pow(*(iterator++), 2);
242template <
size_t nDim,
class Double>
244 return squaredNorm<nDim>(vector.
data());
250template <
size_t nDim,
class Double>
254 for (
size_t iDim = 0; iDim < nDim; ++iDim) proj(iDim) =
dot(tensor[iDim], unitVector);
256 Double normalProj =
dot(proj, unitVector);
258 for (
size_t iDim = 0; iDim < nDim; ++iDim) proj(iDim) -= normalProj * unitVector(iDim);
266template <
size_t nDim,
class Double>
271#ifndef CODI_REVERSE_TYPE
276template <class Int, class Container, class Double = typename CValueTraits<Int>::Double>
278 return vars.template get<Vector<Double, 1>>(iPoint, iVar)(0);
285template <size_t nVar, class Int, class Container, class Double = typename CValueTraits<Int>::Double>
287 return vars.template get<Vector<Double, nVar>>(iPoint, iVar);
294template <size_t nRows, size_t nCols, class Int, class Container, class Double = typename CValueTraits<Int>::Double>
296 return vars.template get<Matrix<Double, nRows, nCols>>(iPoint, iRow);
305template <
class Container,
class =
void>
306struct Is1D : std::false_type {};
307template <
class Container>
308struct Is1D<Container, std::void_t<decltype(std::declval<const Container&>()(0ul))>> : std::true_type {};
310template <
class Container,
class =
void>
311struct Is3D : std::false_type {};
312template <
class Container>
313struct Is3D<Container, std::void_t<decltype(std::declval<const Container&>()(0ul, 0ul, 0ul))>> : std::true_type {};
316FORCEINLINE unsigned long lane(
unsigned long iPoint,
size_t) {
return iPoint; }
320template <
class T,
size_t N>
333template <class Int, class Container, class Double = typename CValueTraits<Int>::Double>
336 for (
size_t k = 0; k < CValueTraits<Int>::Size; ++k) {
337 if constexpr (Is1D<Container>::value)
338 lane(x, k) = preaccIn(vars(lane(iPoint, k)));
340 lane(x, k) = preaccIn(vars(lane(iPoint, k), iVar));
345template <size_t nVar, class Int, class Container, class Double = typename CValueTraits<Int>::Double>
348 for (
size_t i = 0; i < nVar; ++i) {
349 for (
size_t k = 0; k < CValueTraits<Int>::Size; ++k) {
350 if constexpr (Is3D<Container>::value)
351 lane(x(i), k) = preaccIn(vars(lane(iPoint, k), iVar, i));
353 lane(x(i), k) = preaccIn(vars(lane(iPoint, k), iVar + i));
359template <size_t nRows, size_t nCols, class Int, class Container, class Double = typename CValueTraits<Int>::Double>
362 for (
size_t i = 0; i < nRows; ++i) {
363 for (
size_t j = 0; j < nCols; ++j) {
364 for (
size_t k = 0; k < CValueTraits<Int>::Size; ++k) {
365 lane(x(i, j), k) = preaccIn(vars(lane(iPoint, k), iRow + i, j));
379template <
class Double,
size_t Size>
391template <
class Double,
size_t nVar>
400template <size_t nDim, class Int, class Container, class Double = typename CValueTraits<Int>::Double>
402 return distanceVector<nDim>(iPoint, coords, jPoint, coords);
410template <size_t nDim, class Int, class Container, class Double = typename CValueTraits<Int>::Double>
412 const Container& coords_j) {
413 auto coord_i = gatherVariables<nDim>(iPoint, coords_i);
414 auto coord_j = gatherVariables<nDim>(jPoint, coords_j);
416 for (
size_t iDim = 0; iDim < nDim; ++iDim) {
417 vector_ij(iDim) = coord_j(iDim) - coord_i(iDim);
429template <
class Double>
440 return (1.0 - kappa) * gradProj + kappa * delta;
448template <
size_t nVarGrad,
size_t nDim,
class Double,
class Gradient_t>
457 return dot<nDim>(
rows[iVar], vector_ij);
468template <
size_t nDim,
class Double,
class Gradient_t>
483template <
size_t nVarGrad_,
size_t nDim,
class Double,
class Gradient_t>
485 if constexpr (nVarGrad_ > 1) {
506template <
MusclLimiter limiterKind,
size_t nVarGrad_ = 0,
size_t nDim,
class Double,
class VarType,
class Limiter_t,
512 const size_t nVarGrad = nVarGrad_ > 0 ? nVarGrad_ : (nVarGradRuntime > 0 ? nVarGradRuntime : VarType::nVar);
514 const auto grad_i = gradientReader<nVarGrad_, nDim, Double>(iPoint, gradient, iRow);
515 const auto grad_j = gradientReader<nVarGrad_, nDim, Double>(jPoint, gradient, iRow);
517 for (
size_t iVar = 0; iVar < nVarGrad; ++iVar) {
519 const Double delta_ij =
V.j.all(iVar) -
V.i.all(iVar);
525 Double lim_i = 1.0, lim_j = 1.0;
527 const Double delta_ij_2 =
pow(delta_ij, 2) + 1e-6;
528 lim_i = (delta_ij_2 + proj_i * delta_ij) / (
pow(proj_i, 2) + delta_ij_2);
529 lim_j = (delta_ij_2 + proj_j * delta_ij) / (
pow(proj_j, 2) + delta_ij_2);
536 V.i.all(iVar) += 0.5 * lim_i * proj_i;
537 V.j.all(iVar) -= 0.5 * lim_j * proj_j;
545template <
size_t nVarGrad_ = 0,
size_t nDim,
class Double,
class VarType,
class Limiter_t,
class Gradient_t>
550 size_t nVarGradRuntime = 0) {
551 switch (limiterType) {
553 muscl<MusclLimiter::NONE, nVarGrad_>(iPoint, jPoint, vector_ij, gradient, limiter, iRow,
V, kappa, umusclRamp,
557 muscl<MusclLimiter::EDGE, nVarGrad_>(iPoint, jPoint, vector_ij, gradient, limiter, iRow,
V, kappa, umusclRamp,
561 muscl<MusclLimiter::POINT, nVarGrad_>(iPoint, jPoint, vector_ij, gradient, limiter, iRow,
V, kappa, umusclRamp,
570template <size_t nVar, class Double, class Int = typename CLaneTraits<Double>::Int>
579 matrix.
SetBlocks(iEdge, iPoint, jPoint, jac_i, jac_j, updateMask);
583 vector.
SetBlock(iEdge, flux, updateMask);
586 matrix.
SetBlocks(iEdge, jac_i, jac_j, updateMask);
605template <size_t nVar, class Double, class Int = typename CLaneTraits<Double>::Int>
635template <class Double, class Int = typename CLaneTraits<Double>::Int>
637 if (target) massFlux.
store(&(*target)[iEdge[0]]);
simd::Array< su2double > Double
Define Double and Int SIMD types.
Definition CNumericsSIMD.hpp:36
A templated matrix/vector-like object.
Definition C2DContainer.hpp:374
void SetOffDiagBlocks(unsigned long iEdge, const MatrixType &jac_ij, const MatrixType &jac_ji, OtherType mask=1)
Set the off-diagonal blocks of an edge, the diagonal being assembled elsewhere.
Definition CSysMatrix.hpp:1117
void SetBlocks(simd::Array< I, N > iEdge, simd::Array< I, N > iPoint, simd::Array< I, N > jPoint, const MatTypeSIMD &block_i, const MatTypeSIMD &block_j, simd::Array< F, N > mask=1)
SIMD version, does the update for multiple edges and points.
Definition CSysMatrix.hpp:960
Class for holding and manipulating vectors needed by linear solvers.
Definition CSysVector.hpp:195
void AddBlock(unsigned long iPoint, const VectorType &block, ScalarType alpha=1)
Add "block" to the vector, see SetBlock.
Definition CSysVector.hpp:631
void UpdateBlocks(unsigned long iPoint, unsigned long jPoint, const VectorType &block, ScalarType alpha=1)
Add to iPoint, subtract from jPoint.
Definition CSysVector.hpp:647
void SetBlock(unsigned long iPoint, const VectorType &block, ScalarType alpha=1)
Set "block" to the vector.
Definition CSysVector.hpp:619
Scalar_t * data() noexcept
Definition C2DContainer.hpp:222
A simple SIMD type relying on implicit vectorization, i.e. done by the compiler, explicitly vectorize...
Definition vectorization.hpp:89
void store(Scalar *ptr) const
Definition vectorization.hpp:162
@ Size
Definition vectorization.hpp:95
#define FORCEINLINE
Definition code_config.hpp:44
passivedouble su2double
Definition code_config.hpp:181
FORCEINLINE ARRAY_T sqrt(const ARRAY_T &x)
Definition special_vectorization.hpp:116
FORCEINLINE ARRAY_T pow(const ARRAY_T &a, const ARRAY_T &b)
Definition special_vectorization.hpp:179
bool BeginPassive()
Start a passive region, i.e. stop recording.
Definition ad_structure.hpp:381
void EndPreacc()
Ends a preaccumulation section and computes the local Jacobi matrix of a code section using the varia...
Definition ad_structure.hpp:243
void SetPreaccOut(Ts &&... data)
Sets the scalar outputs of a preaccumulation section.
Definition ad_structure.hpp:222
void SetPreaccIn(Ts &&... data)
Sets the scalar inputs of a preaccumulation section.
Definition ad_structure.hpp:186
void EndPassive(bool wasActive)
End a passive region, i.e. start recording if we were recording before.
Definition ad_structure.hpp:387
Definition vectorization.hpp:42
UpdateType
Ways to update vectors and system matrices. COLORING is the typical i/j update, whereas for REDUCTION...
Definition util.hpp:44
constexpr size_t MaxScalarVar
Backing size of the static arrays of a dynamic model.
Definition util.hpp:159
void stopPreacc(Vector< Double, nVar > &x)
Stop the AD preaccumulation.
Definition util.hpp:392
constexpr size_t Dynamic
Equation count of a model whose value is only known at runtime.
Definition util.hpp:152
constexpr size_t Max(size_t a, size_t b)
Constexpr version of max.
Definition util.hpp:124
void updateEdgeMassFlux(Int iEdge, const Double &massFlux, su2activevector *target)
Store the (scalar) mass flux of an edge, e.g. for "bounded scalar" transport equations.
Definition util.hpp:636
MusclLimiter
How the reconstructed differences are limited.
Definition util.hpp:495
auto squaredNorm(ForwardIterator iterator) -> typename std::decay< decltype(*iterator)>::type
Squared norm.
Definition util.hpp:231
Double umusclProjection(const Double &gradProj, const Double &delta, const CNonDeduced< Double > &kappa)
Blended difference for U-MUSCL reconstruction.
Definition util.hpp:430
void reconstruct(typename CLaneTraits< Double >::Int iPoint, typename CLaneTraits< Double >::Int jPoint, const Vector< Double, nDim > &vector_ij, const Gradient_t &gradient, const Limiter_t &limiter, LIMITER limiterType, size_t iRow, CPair< VarType > &V, const CNonDeduced< Double > &kappa, const CNonDeduced< Double > &umusclRamp, size_t nVarGradRuntime=0)
Reconstruct a slice of nVarGrad variables starting at column iRow, dispatching on the limiter type; s...
Definition util.hpp:546
Double norm(const Vector< Double, nDim > &vector)
Vector norm.
Definition util.hpp:267
auto gradientReader(typename CLaneTraits< Double >::Int iPoint, const Gradient_t &gradient, size_t iRow)
Gradient reader of one point, blocked or row by row according to nVarGrad_.
Definition util.hpp:484
typename CIdentity< T >::type CNonDeduced
Definition util.hpp:147
void updateLinearSystem(Int iEdge, Int iPoint, Int jPoint, bool implicit, UpdateType updateType, Double updateMask, const Vector< Double, nVar > &flux, const Matrix< Double, nVar, nVar > &jac_i, const Matrix< Double, nVar, nVar > &jac_j, CSysVector< su2double > &vector, SparseMatrixType &matrix)
Update the matrix and right-hand-side of a linear system with one conservative flux.
Definition util.hpp:571
void setPreaccOut(Vector< Double, Size > &x, size_t nVar)
Register the leading nVar entries of a static vector as preaccumulation outputs.
Definition util.hpp:380
void muscl(typename CLaneTraits< Double >::Int iPoint, typename CLaneTraits< Double >::Int jPoint, const Vector< Double, nDim > &vector_ij, const Gradient_t &gradient, const Limiter_t &limiter, size_t iRow, CPair< VarType > &V, const CNonDeduced< Double > &kappa, const CNonDeduced< Double > &umusclRamp, size_t nVarGradRuntime)
U-MUSCL reconstruction of nVarGrad variables, from the gradient rows starting at iRow.
Definition util.hpp:508
Vector< Double, nDim > tangentProjection(const Matrix< Double, nDim, nDim > &tensor, const Vector< Double, nDim > &unitVector)
Tangential projection.
Definition util.hpp:251
Vector< Double, nDim > distanceVector(Int iPoint, Int jPoint, const Container &coords)
Distance vector, from point i to point j of one container.
Definition util.hpp:401
auto dot(ForwardIterator iterator, const T *ptr) -> typename std::decay< decltype(*ptr)>::type
Dot product.
Definition util.hpp:203
Double gatherVariables(Int iPoint, const Container &vars, size_t iVar=0)
Gather a single variable, from column iVar (0 by default) of row iPoint of a 2D container,...
Definition util.hpp:277
@ V
Menter k-w SST model with vorticity production terms.
LIMITER
Types of slope limiters.
Definition option_structure.hpp:1038
@ VAN_ALBADA_EDGE
Slope limiter using Van Albada method (edge formulation).
Alignment of the static containers backing a flux value type.
Definition util.hpp:60
@ Align
Definition util.hpp:61
Reads the gradient rows of one point as one block, gathered up front.
Definition util.hpp:449
Matrix< Double, nVarGrad, nDim > rows
Definition util.hpp:451
typename CLaneTraits< Double >::Int Int
Definition util.hpp:450
CGradientBlock(Int iPoint, const Gradient_t &gradient, size_t iRow)
Definition util.hpp:453
Double project(size_t iVar, const Vector< Double, nDim > &vector_ij) const
Definition util.hpp:456
Reads the gradient rows of one point one row at a time.
Definition util.hpp:469
Double project(size_t iVar, const Vector< Double, nDim > &vector_ij) const
Definition util.hpp:475
const size_t iRow
Definition util.hpp:473
typename CLaneTraits< Double >::Int Int
Definition util.hpp:470
const Int iPoint
Definition util.hpp:471
const Gradient_t & gradient
Definition util.hpp:472
Blocks a template parameter from participating in argument deduction.
Definition util.hpp:143
T type
Definition util.hpp:144
unsigned long Int
Definition util.hpp:111
Index type and lane count that go with a flux value type, the converse of CValueTraits,...
Definition util.hpp:107
Simple pair type for i/j variables.
Definition util.hpp:130
T i
Definition util.hpp:131
T j
Definition util.hpp:131
su2double Double
Definition util.hpp:91
The flux value type and lane count that go with an index type.
Definition util.hpp:87
Residual of one edge, accumulated by the convective and the diffusive terms.
Definition util.hpp:169
Vector< Double, Size > flux_j
Definition util.hpp:176
EdgeResidual(size_t nEqn)
Zero the terms of the equations in use, so that both terms can accumulate into them.
Definition util.hpp:185
static constexpr size_t Size
The Matrix<Double,1,1> a static nVar==1 model would otherwise need degenerates to vector-only indexin...
Definition util.hpp:174
Matrix< Double, Size, Size > jac_jj
Definition util.hpp:177
Matrix< Double, Size, Size > jac_ji
Definition util.hpp:177
const size_t nVar
Definition util.hpp:178
Vector< Double, Size > flux_i
Definition util.hpp:176
Matrix< Double, Size, Size > jac_ii
Definition util.hpp:177
Matrix< Double, Size, Size > jac_ij
Definition util.hpp:177