35 #include <boost/core/ignore_unused.hpp>
72 const int nConvectiveFields,
80 v_Advect(nConvectiveFields, pFields, pAdvVel, pInarray, pOutarray, pTime,
84 template <
typename DataType,
typename TypeNekBlkMatSharedPtr>
86 const int nConvectiveFields,
const int nSpaceDim,
94 std::shared_ptr<LocalRegions::ExpansionVector> traceExp =
96 int ntotTrac = (*traceExp).size();
97 int nTracePnts = tracelist->GetTotPoints();
98 int nTracPnt, nTracCoef;
108 for (
int nelmt = 0; nelmt < ntotTrac; nelmt++)
110 nTracCoef = (*traceExp)[nelmt]->GetNcoeffs();
111 nTracPnt = (*traceExp)[nelmt]->GetTotPoints();
118 std::shared_ptr<LocalRegions::ExpansionVector> fieldExp =
119 pFields[0]->GetExp();
120 int nTotElmt = (*fieldExp).size();
121 int nElmtPnt, nElmtCoef;
128 for (
int nelmt = 0; nelmt < nTotElmt; nelmt++)
130 nElmtCoef = (*fieldExp)[nelmt]->GetNcoeffs();
131 nElmtPnt = (*fieldExp)[nelmt]->GetTotPoints();
136 nElmtCoef, nElmtCoef, 0.0);
139 bool TracePntJacGradflag =
true;
142 for (
int i = 0; i < 2; i++)
147 if (0 == TracePntJacGrad.size())
149 TracePntJacGradflag =
false;
152 for (
int m = 0; m < nConvectiveFields; m++)
154 for (
int n = 0; n < nConvectiveFields; n++)
157 for (
int nelmt = 0; nelmt < nTotElmt; nelmt++)
159 (*ElmtJacCoef[nelmt]) = 0.0;
160 (*ElmtJacQuad[nelmt]) = 0.0;
163 if (TracePntJacGradflag)
166 for (
int ndir = 0; ndir < nSpaceDim; ndir++)
169 for (
int nelmt = 0; nelmt < nTotElmt; nelmt++)
171 (*ElmtJacQuad[nelmt]) = 0.0;
173 int ngrad = n * nSpaceDim + ndir;
176 TracePntJacGradSign, TraceJacFwd,
178 pFields[0]->AddTraceJacToElmtJac(TraceJacFwd, TraceJacBwd,
181 pFields[0]->AddRightIPTPhysDerivBase(ndir, ElmtJacQuad,
184 for (
int nelmt = 0; nelmt < nTotElmt; nelmt++)
186 nElmtCoef = (*fieldExp)[nelmt]->GetNcoeffs();
187 if (SymmMatData.size() < nElmtCoef)
192 MatData1 = ElmtJacCoef[nelmt]->GetPtr();
193 for (
int i = 0; i < nElmtCoef; i++)
196 &SymmMatData[i], nElmtCoef);
198 Vmath::Vadd(nElmtCoef * nElmtCoef, SymmMatData, 1, MatData1,
204 TraceJacConsSign, TraceJacFwd, TraceJacBwd);
206 pFields[0]->AddTraceJacToElmtJac(TraceJacFwd, TraceJacBwd,
209 pFields[0]->AddRightIPTBaseMatrix(ElmtJacQuad, ElmtJacCoef);
212 for (
int nelmt = 0; nelmt < nTotElmt; nelmt++)
214 tmp2Add = ElmtJacCoef[nelmt];
215 MatData0 = gmtxarray[m][n]->GetBlock(nelmt, nelmt)->GetPtr();
216 MatData1 = tmp2Add->GetPtr();
217 for (
int i = 0; i < MatData0.
size(); i++)
219 MatData0[i] += DataType(MatData1[i]);
227 const int nConvectiveFields,
const int nSpaceDim,
234 const int nConvectiveFields,
const int nSpaceDim,
242 template <
typename DataType,
typename TypeNekBlkMatSharedPtr>
251 std::shared_ptr<LocalRegions::ExpansionVector> traceExp =
253 int ntotTrac = (*traceExp).size();
254 int nTracPnt, noffset, pntoffset;
260 for (
int nelmt = 0; nelmt < ntotTrac; nelmt++)
262 nTracPnt = (*traceExp)[nelmt]->GetTotPoints();
263 tracepnts[nelmt] = nTracPnt;
271 for (
int nelmt = 0; nelmt < ntotTrac; nelmt++)
273 nTracPnt = tracepnts[nelmt];
274 noffset = tracelist->GetPhys_Offset(nelmt);
275 for (
int npnt = 0; npnt < nTracPnt; npnt++)
277 pntoffset = noffset + npnt;
278 ftmp = (*PntJac[0]->GetBlock(pntoffset, pntoffset))(m, n);
279 JacFwd[nelmt][npnt] =
NekDouble(PntJacSign[0][pntoffset] * ftmp);
281 btmp = (*PntJac[1]->GetBlock(pntoffset, pntoffset))(m, n);
282 JacBwd[nelmt][npnt] =
NekDouble(PntJacSign[1][pntoffset] * btmp);
285 tracelist->GetDiagMatIpwrtBase(JacFwd, TraceJacFwd);
286 tracelist->GetDiagMatIpwrtBase(JacBwd, TraceJacBwd);
290 const int nConvectiveFields,
296 boost::ignore_unused(nConvectiveFields, pFields, pAdvVel, pInarray,
298 ASSERTL0(
false,
"Not defined for AdvectVolumeFlux.");
305 const int nConvectiveFields,
313 boost::ignore_unused(nConvectiveFields, pFields, pAdvVel, pInarray,
314 pTraceFlux, pTime, pFwd, pBwd);
315 ASSERTL0(
false,
"Not defined for AdvectTraceFlux.");
332 const int nConvectiveFields,
340 v_AdvectCoeffs(nConvectiveFields, pFields, pAdvVel, pInarray, pOutarray,
359 if (pSession->DefinesSolverInfo(
"HOMOGENEOUS"))
361 std::string HomoStr = pSession->GetSolverInfo(
"HOMOGENEOUS");
362 if (HomoStr ==
"HOMOGENEOUS1D" || HomoStr ==
"Homogeneous1D" ||
363 HomoStr ==
"1D" || HomoStr ==
"Homo1D" ||
364 HomoStr ==
"HOMOGENEOUS2D" || HomoStr ==
"Homogeneous2D" ||
365 HomoStr ==
"2D" || HomoStr ==
"Homo2D")
372 "Only 1D homogeneous dimension supported.");
384 boost::ignore_unused(inarray, fields);
386 "A baseflow is not appropriate for this advection type.");
390 const int nConvectiveFields,
398 boost::ignore_unused(nConvectiveFields, fields, advVel, inarray, outarray,
400 ASSERTL0(
false,
"v_AdvectCoeffs not defined");
405 const int &nConvectiveFields,
409 boost::ignore_unused(pFields, nConvectiveFields, ElmtJacArray, gmtxarray);
410 ASSERTL0(
false,
"v_AddVolumJacToMat NOT SPECIFIED");
#define ASSERTL0(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
#define SOLVER_UTILS_EXPORT
size_type size() const
Returns the array's size.
Provides a generic Factory class.
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
void CalcJacobTraceInteg(const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const int m, const int n, const Array< OneD, const TypeNekBlkMatSharedPtr > &PntJac, const Array< OneD, const Array< OneD, DataType >> &PntJacSign, Array< OneD, DNekMatSharedPtr > &TraceJacFwd, Array< OneD, DNekMatSharedPtr > &TraceJacBwd)
SOLVER_UTILS_EXPORT void Advect(const int nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &advVel, const Array< OneD, Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble &time, const Array< OneD, Array< OneD, NekDouble >> &pFwd=NullNekDoubleArrayOfArray, const Array< OneD, Array< OneD, NekDouble >> &pBwd=NullNekDoubleArrayOfArray)
Interface function to advect the vector field.
int m_spaceDim
Storage for space dimension. Used for homogeneous extension.
virtual SOLVER_UTILS_EXPORT void v_AddVolumJacToMat(const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const int &nConvectiveFields, const TensorOfArray5D< NekDouble > &ElmtJacArray, Array< OneD, Array< OneD, SNekBlkMatSharedPtr >> &gmtxarray)
virtual SOLVER_UTILS_EXPORT void v_AdvectCoeffs(const int nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &advVel, const Array< OneD, Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble &time, const Array< OneD, Array< OneD, NekDouble >> &pFwd=NullNekDoubleArrayOfArray, const Array< OneD, Array< OneD, NekDouble >> &pBwd=NullNekDoubleArrayOfArray)
virtual SOLVER_UTILS_EXPORT void v_AdvectTraceFlux(const int nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &advVel, const Array< OneD, Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &pTraceFlux, const NekDouble &time, const Array< OneD, Array< OneD, NekDouble >> &pFwd=NullNekDoubleArrayOfArray, const Array< OneD, Array< OneD, NekDouble >> &pBwd=NullNekDoubleArrayOfArray)
Advects Trace Flux.
virtual SOLVER_UTILS_EXPORT void v_Advect(const int nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &advVel, const Array< OneD, Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble &time, const Array< OneD, Array< OneD, NekDouble >> &pFwd=NullNekDoubleArrayOfArray, const Array< OneD, Array< OneD, NekDouble >> &pBwd=NullNekDoubleArrayOfArray)=0
Advects a vector field.
virtual SOLVER_UTILS_EXPORT void v_InitObject(LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields)
Initialises the advection object.
SOLVER_UTILS_EXPORT void AdvectCoeffs(const int nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &advVel, const Array< OneD, Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble &time, const Array< OneD, Array< OneD, NekDouble >> &pFwd=NullNekDoubleArrayOfArray, const Array< OneD, Array< OneD, NekDouble >> &pBwd=NullNekDoubleArrayOfArray)
Similar with Advection::Advect(): calculate the advection flux The difference is in the outarray: it ...
SOLVER_UTILS_EXPORT void InitObject(LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields)
Interface function to initialise the advection object.
virtual SOLVER_UTILS_EXPORT void v_SetBaseFlow(const Array< OneD, Array< OneD, NekDouble >> &inarray, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields)
Overrides the base flow used during linearised advection.
SOLVER_UTILS_EXPORT void AddTraceJacToMat(const int nConvectiveFields, const int nSpaceDim, const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const Array< OneD, TypeNekBlkMatSharedPtr > &TracePntJacCons, Array< OneD, Array< OneD, TypeNekBlkMatSharedPtr >> &gmtxarray, const Array< OneD, TypeNekBlkMatSharedPtr > &TracePntJacGrad, const Array< OneD, Array< OneD, DataType >> &TracePntJacGradSign)
virtual SOLVER_UTILS_EXPORT void v_AdvectVolumeFlux(const int nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &advVel, const Array< OneD, Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &pVolumeFlux, const NekDouble &time)
Advects Volume Flux.
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
AdvectionFactory & GetAdvectionFactory()
Gets the factory for initialising advection objects.
The above copyright notice and this permission notice shall be included.
std::shared_ptr< DNekMat > DNekMatSharedPtr
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 Vcopy(int n, const T *x, const int incx, T *y, const int incy)