42using namespace LibUtilities;
56 :
Extrapolate(pSession, pFields, pPressure, pVel, advObject)
63 size_t dim =
m_fields[0]->GetCoordim(0);
66 size_t nTracePts =
m_fields[0]->GetTrace()->GetNpoints();
67 for (
size_t i = 0; i < dim; ++i)
79 ASSERTL0(
false,
"This method should not be called by Substepping routine");
89 size_t order = IntegrationScheme->GetOrder();
93 if ((IntegrationScheme->GetName() ==
"Euler" &&
94 IntegrationScheme->GetVariant() ==
"Backward") ||
96 (IntegrationScheme->GetName() ==
"BDFImplicit" &&
97 (order == 1 || order == 2)))
100 std::string vSubStepIntScheme =
"RungeKutta";
101 std::string vSubStepIntSchemeVariant =
"SSP";
102 int vSubStepIntSchemeOrder = order;
104 if (
m_session->DefinesSolverInfo(
"SubStepIntScheme"))
106 vSubStepIntScheme =
m_session->GetSolverInfo(
"SubStepIntScheme");
107 vSubStepIntSchemeVariant =
"";
108 vSubStepIntSchemeOrder = order;
113 vSubStepIntScheme, vSubStepIntSchemeVariant,
114 vSubStepIntSchemeOrder, std::vector<NekDouble>());
117 size_t ndim = order + 1;
121 int ntotpts =
m_fields[0]->GetTotPoints();
124 for (
size_t i = 1; i < ndim * nvel; ++i)
130 ntotpts =
m_fields[0]->GetTrace()->GetTotPoints();
132 for (
size_t i = 1; i < ndim; ++i)
139 ASSERTL0(0,
"Integration method not suitable: Options include "
140 "BackwardEuler or BDFImplicitOrder{1,2}");
143 m_intSteps = IntegrationScheme->GetNumIntegrationPhases();
152 "SubSteppingExtrapolate:v_SubSteppingTimeIntegration", 10);
164 size_t nVariables = inarray.size();
165 size_t nQuadraturePts = inarray[0].size();
169 size_t ncoeffs =
m_fields[0]->GetNcoeffs();
174 for (i = 1; i < nVariables; ++i)
176 WeakAdv[i] = WeakAdv[i - 1] + ncoeffs;
185 Velfields[i] = Velfields[i - 1] + nQuadraturePts;
194 x->PreApply(
m_fields, Velfields, Velfields, time);
204 x->Apply(
m_fields, outarray, outarray, time);
207 for (i = 0; i < nVariables; ++i)
209 m_fields[i]->IProductWRTBase(outarray[i], WeakAdv[i]);
217 for (i = 0; i < nVariables; ++i)
223 m_fields[i]->MultiplyByElmtInvMass(WeakAdv[i], WeakAdv[i]);
226 m_fields[i]->BwdTrans(WeakAdv[i], outarray[i]);
241 ASSERTL1(inarray.size() == outarray.size(),
242 "Inarray and outarray of different sizes ");
245 for (
size_t i = 0; i < inarray.size(); ++i)
247 Vmath::Vcopy(inarray[i].size(), inarray[i], 1, outarray[i], 1);
296 int nlevels = array.size();
297 int nPts = array[0].size();
310 1, accelerationTerm, 1);
312 for (
int i = 0; i < acc_order; i++)
316 array[i + 1], 1, accelerationTerm, 1, accelerationTerm, 1);
318 array[nlevels - 1] = accelerationTerm;
337 size_t npts =
m_fields[0]->GetTotPoints();
338 size_t ntracepts =
m_fields[0]->GetTrace()->GetTotPoints();
345 for (n = 0; n < nvel; ++n)
349 for (i = nblocks - 1; i > 0; --i)
359 for (i = nblocks - 1; i > 0; --i)
366 for (i = 0; i < nvel; ++i)
390 for (n = 0; n < nvel; ++n)
392 for (i = 1; i < nblocks; ++i)
399 for (i = 1; i < nblocks; ++i)
423 static int ncalls = 1;
436 "Number of substeps has exceeded maximum");
442 std::cout <<
"Sub-integrating using " << nsubsteps
449 for (
size_t m = 0; m < nint; ++m)
452 fields = solutionVector[m];
460 for (n = 0; n < nsubsteps; ++n)
482 size_t n_element =
m_fields[0]->GetExpSize();
492 for (
size_t i = 0; i <
m_velocity.size(); ++i)
498 for (
size_t el = 0; el < n_element; ++el)
502 (ExpOrder[el] - 1) * (ExpOrder[el] - 1));
524 ASSERTL1(physfield.size() == Outarray.size(),
525 "Physfield and outarray are of different dimensions");
532 size_t nTracePts =
m_fields[0]->GetTrace()->GetNpoints();
543 for (i = 0; i < physfield.size(); ++i)
550 std::dynamic_pointer_cast<MultiRegions::DisContField>(
m_fields[0])
551 ->GetFwdBwdTracePhys(physfield[i], Fwd, Bwd,
553 m_fields[i]->GetBndCondExpansions());
556 m_fields[0]->GetTrace()->Upwind(Vn, Fwd, Bwd, numflux);
559 Vmath::Vsub(nTracePts, numflux, 1, Fwd, 1, Fwd, 1);
560 Vmath::Vsub(nTracePts, numflux, 1, Bwd, 1, Bwd, 1);
567 m_fields[0]->AddFwdBwdTraceIntegral(Fwd, Bwd, Outarray[i]);
583 size_t npts =
m_fields[0]->GetTotPoints();
584 size_t ntracepts =
m_fields[0]->GetTrace()->GetTotPoints();
596 for (i = 0; i <= ord; ++i)
598 for (j = 0; j <= ord; ++j)
608 for (i = 0; i < nvel; ++i)
612 for (j = 1; j <= ord; ++j)
620 for (j = 1; j <= ord; ++j)
#define ASSERTL0(condition, msg)
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
void DefineProjection(FuncPointerT func, ObjectPointerT obj)
void DefineOdeRhs(FuncPointerT func, ObjectPointerT obj)
void AccumulateRegion(std::string, int iolevel=0)
Accumulate elapsed time for a region.
An abstract base class encapsulating the concept of advection of a vector field.
static void Daxpy(const int &n, const double &alpha, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: y = alpha x plus y.
TimeIntegrationSchemeFactory & GetTimeIntegrationSchemeFactory()
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< TimeIntegrationScheme > TimeIntegrationSchemeSharedPtr
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
std::shared_ptr< Advection > AdvectionSharedPtr
A shared pointer to an Advection object.
ExtrapolateFactory & GetExtrapolateFactory()
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
void Svtvp(int n, const T alpha, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Svtvp (scalar times vector plus vector): z = alpha*x + y.
void Neg(int n, T *x, const int incx)
Negate x = -x.
T Vmin(int n, const T *x, const int incx)
Return the minimum element in x - called vmin to avoid conflict with min.
void Vvtvp(int n, const T *w, const int incw, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
vvtvp (vector times vector plus vector): z = w*x + y
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.