35 #include <boost/core/ignore_unused.hpp>
80 const int nConvectiveFields,
92 boost::ignore_unused(advVel, time);
93 size_t nCoeffs = fields[0]->GetNcoeffs();
96 for (
int i = 0; i < nConvectiveFields; ++i)
102 nConvectiveFields, fields, advVel, inarray, tmp, time,
109 for (
int i = 0; i < nConvectiveFields; ++i)
111 fields[i]->BwdTrans(tmp[i], outarray[i]);
120 const int nConvectiveFields,
131 size_t nPointsTot = fields[0]->GetTotPoints();
132 size_t nCoeffs = fields[0]->GetNcoeffs();
133 size_t nTracePointsTot = fields[0]->GetTrace()->GetTotPoints();
136 fluxvector(nConvectiveFields);
138 for (
int i = 0; i < nConvectiveFields; ++i)
158 for (
int i = 0; i < nConvectiveFields; ++i)
160 Vmath::Fill(outarray[i].size(), 0.0, outarray[i], 1);
161 fields[i]->IProductWRTDerivBase(fluxvector[i], outarray[i]);
167 numflux{size_t(nConvectiveFields)};
169 for (
int i = 0; i < nConvectiveFields; ++i)
175 numflux, time, pFwd, pBwd);
178 for(
int i = 0; i < nConvectiveFields; ++i)
183 fields[i]->AddTraceIntegral (numflux[i], outarray[i]);
188 fields[i]->MultiplyByElmtInvMass(outarray[i], outarray[i]);
198 const int nConvectiveFields,
207 boost::ignore_unused(advVel, time);
208 int nTracePointsTot = fields[0]->GetTrace()->GetTotPoints();
211 "Riemann solver must be provided for AdvectionWeakDG.");
220 for (
int i = 0; i < nConvectiveFields; ++i)
224 fields[i]->GetFwdBwdTracePhys(inarray[i], Fwd[i], Bwd[i]);
229 for (
int i = 0; i < nConvectiveFields; ++i)
246 const int &nConvectiveFields,
251 std::shared_ptr<LocalRegions::ExpansionVector> pexp = explist->GetExp();
252 int nTotElmt = (*pexp).size();
253 int nElmtPnt,nElmtCoef;
265 for(
int nelmt = 0; nelmt < nTotElmt; nelmt++)
267 nElmtCoef = (*pexp)[nelmt]->GetNcoeffs();
268 nElmtPnt = (*pexp)[nelmt]->GetTotPoints();
269 elmtpnts[nelmt] = nElmtPnt;
270 elmtcoef[nelmt] = nElmtCoef;
276 for(
int nelmt = 0; nelmt < nTotElmt; nelmt++)
278 nElmtCoef = elmtcoef[nelmt];
283 for(
int m = 0; m < nConvectiveFields; m++)
285 for(
int n = 0; n < nConvectiveFields; n++)
287 for(
int nelmt = 0; nelmt < nTotElmt; nelmt++)
289 (*mtxPerVarCoeff[nelmt]) = 0.0;
290 (*mtxPerVar[nelmt]) = 0.0;
293 explist->GetMatIpwrtDeriveBase(ElmtJacArray[m][n],
296 explist->AddRightIPTBaseMatrix(mtxPerVar,mtxPerVarCoeff);
298 for(
int nelmt = 0; nelmt < nTotElmt; nelmt++)
300 nElmtCoef = elmtcoef[nelmt];
301 nElmtPnt = elmtpnts[nelmt];
302 int ntotDofs = nElmtCoef*nElmtCoef;
304 if(Elmt_dataSingle.size()<ntotDofs)
309 tmpGmtx = gmtxarray[m][n]->GetBlock(nelmt,nelmt);
310 ElmtMat = mtxPerVarCoeff[nelmt];
312 GMat_data = tmpGmtx->GetPtr();
313 Elmt_data = ElmtMat->GetPtr();
315 for(
int i=0;i<ntotDofs;i++)
317 Elmt_dataSingle[i] =
NekSingle( Elmt_data[i] );
320 Vmath::Vadd(ntotDofs,GMat_data,1,Elmt_dataSingle,1,GMat_data,1);
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
void AccumulateRegion(std::string, int iolevel=0)
Accumulate elapsed time for a region.
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_InitObject(LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields)
Initialises the advection object.
RiemannSolverSharedPtr m_riemann
Riemann solver for DG-type schemes.
virtual void v_Advect(const int nConvective, 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)
Compute the advection term at each time-step using the Discontinuous Galerkin approach (DG).
virtual void v_InitObject(LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields)
Initialise AdvectionWeakDG objects and store them before starting the time-stepping.
virtual 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 > &VolumeFlux, const NekDouble &time)
virtual void v_AddVolumJacToMat(const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const int &nConvectiveFields, const TensorOfArray5D< NekDouble > &ElmtJacArray, Array< OneD, Array< OneD, SNekBlkMatSharedPtr >> &gmtxarray)
virtual void v_AdvectCoeffs(const int nConvective, 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)
static AdvectionSharedPtr create(std::string advType)
virtual void v_AdvectTraceFlux(const int nConvective, 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 >> &TraceFlux, const NekDouble &time, const Array< OneD, Array< OneD, NekDouble >> &pFwd=NullNekDoubleArrayOfArray, const Array< OneD, Array< OneD, NekDouble >> &pBwd=NullNekDoubleArrayOfArray)
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< SNekMat > SNekMatSharedPtr
static Array< OneD, Array< OneD, NekDouble > > NullNekDoubleArrayOfArray
std::shared_ptr< DNekMat > DNekMatSharedPtr
void Neg(int n, T *x, const int incx)
Negate x = -x.
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 Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.