35 #include <boost/core/ignore_unused.hpp>
75 const int nConvectiveFields,
84 v_Advect(nConvectiveFields, pFields, pAdvVel, pInarray,
85 pOutarray, pTime, pFwd, pBwd);
88 template<
typename DataType,
typename TypeNekBlkMatSharedPtr>
90 const int nConvectiveFields,
99 std::shared_ptr<LocalRegions::ExpansionVector> traceExp
100 = tracelist->GetExp();
101 int ntotTrac = (*traceExp).size();
102 int nTracePnts = tracelist->GetTotPoints();
103 int nTracPnt,nTracCoef;
113 for(
int nelmt = 0; nelmt < ntotTrac; nelmt++)
115 nTracCoef = (*traceExp)[nelmt]->GetNcoeffs();
116 nTracPnt = (*traceExp)[nelmt]->GetTotPoints();
123 std::shared_ptr<LocalRegions::ExpansionVector> fieldExp
124 = pFields[0]->GetExp();
125 int nTotElmt = (*fieldExp).size();
126 int nElmtPnt,nElmtCoef;
133 for(
int nelmt = 0; nelmt < nTotElmt; nelmt++)
135 nElmtCoef = (*fieldExp)[nelmt]->GetNcoeffs();
136 nElmtPnt = (*fieldExp)[nelmt]->GetTotPoints();
144 bool TracePntJacGradflag =
true;
147 for(
int i = 0; i < 2; i++)
152 if(0==TracePntJacGrad.size())
154 TracePntJacGradflag =
false;
157 for(
int m = 0; m < nConvectiveFields; m++)
159 for(
int n = 0; n < nConvectiveFields; n++)
162 for(
int nelmt = 0; nelmt < nTotElmt; nelmt++)
164 (*ElmtJacCoef[nelmt]) = 0.0;
165 (*ElmtJacQuad[nelmt]) = 0.0;
168 if(TracePntJacGradflag)
171 for(
int ndir = 0; ndir < nSpaceDim; ndir++)
174 for(
int nelmt = 0; nelmt < nTotElmt; nelmt++)
176 (*ElmtJacQuad[nelmt]) = 0.0;
178 int ngrad = n*nSpaceDim+ndir;
181 TracePntJacGradSign, TraceJacFwd, TraceJacBwd);
182 pFields[0]->AddTraceJacToElmtJac(TraceJacFwd, TraceJacBwd,
185 pFields[0]->AddRightIPTPhysDerivBase(ndir, ElmtJacQuad,
188 for(
int nelmt = 0; nelmt < nTotElmt; nelmt++)
190 nElmtCoef = (*fieldExp)[nelmt]->GetNcoeffs();
191 if(SymmMatData.size()<nElmtCoef)
196 MatData1 = ElmtJacCoef[nelmt]->GetPtr();
197 for(
int i=0;i<nElmtCoef;i++)
200 &SymmMatData[i], nElmtCoef);
203 MatData1, 1, MatData1, 1);
208 TraceJacConsSign, TraceJacFwd, TraceJacBwd);
210 pFields[0]->AddTraceJacToElmtJac(TraceJacFwd, TraceJacBwd,
213 pFields[0]->AddRightIPTBaseMatrix(ElmtJacQuad, ElmtJacCoef);
216 for(
int nelmt = 0; nelmt < nTotElmt; nelmt++)
218 tmp2Add = ElmtJacCoef[nelmt];
219 MatData0 = gmtxarray[m][n]->GetBlock(nelmt,nelmt)->GetPtr();
220 MatData1 = tmp2Add->GetPtr();
221 for(
int i=0;i<MatData0.
size();i++)
223 MatData0[i] += DataType(MatData1[i]);
231 const int nConvectiveFields,
239 const int nConvectiveFields,
249 template<
typename DataType,
typename TypeNekBlkMatSharedPtr>
260 std::shared_ptr<LocalRegions::ExpansionVector> traceExp =
262 int ntotTrac = (*traceExp).size();
263 int nTracPnt,noffset,pntoffset;
269 for(
int nelmt = 0; nelmt < ntotTrac; nelmt++)
271 nTracPnt = (*traceExp)[nelmt]->GetTotPoints();
272 tracepnts[nelmt] = nTracPnt;
280 for(
int nelmt = 0; nelmt < ntotTrac; nelmt++)
282 nTracPnt = tracepnts[nelmt];
283 noffset = tracelist->GetPhys_Offset(nelmt);
284 for(
int npnt = 0; npnt < nTracPnt; npnt++)
286 pntoffset = noffset+npnt;
287 ftmp = (*PntJac[0]->GetBlock(pntoffset,pntoffset))(m,n);
288 JacFwd[nelmt][npnt] =
NekDouble(PntJacSign[0][pntoffset]*ftmp);
290 btmp = (*PntJac[1]->GetBlock(pntoffset,pntoffset))(m,n);
291 JacBwd[nelmt][npnt] =
NekDouble(PntJacSign[1][pntoffset]*btmp);
294 tracelist->GetDiagMatIpwrtBase(JacFwd,TraceJacFwd);
295 tracelist->GetDiagMatIpwrtBase(JacBwd,TraceJacBwd);
300 const int nConvectiveFields,
307 boost::ignore_unused(nConvectiveFields, pFields, pAdvVel, pInarray,
309 ASSERTL0(
false,
"Not defined for AdvectVolumeFlux.");
316 const int nConvectiveFields,
325 boost::ignore_unused(nConvectiveFields, pFields, pAdvVel, pInarray,
326 pTraceFlux, pTime, pFwd, pBwd);
327 ASSERTL0(
false,
"Not defined for AdvectTraceFlux.");
344 const int nConvectiveFields,
354 pOutarray, pTime, pFwd, pBwd);
372 if (pSession->DefinesSolverInfo(
"HOMOGENEOUS"))
374 std::string HomoStr = pSession->GetSolverInfo(
"HOMOGENEOUS");
375 if (HomoStr ==
"HOMOGENEOUS1D" || HomoStr ==
"Homogeneous1D" ||
376 HomoStr ==
"1D" || HomoStr ==
"Homo1D" ||
377 HomoStr ==
"HOMOGENEOUS2D" || HomoStr ==
"Homogeneous2D" ||
378 HomoStr ==
"2D" || HomoStr ==
"Homo2D")
385 "Only 1D homogeneous dimension supported.");
398 boost::ignore_unused(inarray, fields);
400 "A baseflow is not appropriate for this advection type.");
404 const int nConvectiveFields,
413 boost::ignore_unused(nConvectiveFields, fields, advVel, inarray, outarray,
415 ASSERTL0(
false,
"v_AdvectCoeffs not defined");
420 const int &nConvectiveFields,
424 boost::ignore_unused(pFields,nConvectiveFields,ElmtJacArray,gmtxarray);
425 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.
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_InitObject(LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields)
Initialises the advection object.
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)
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.
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_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.
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.
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.
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 ...
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)