48 "Nonlinear Peregrine equations in conservative variables.");
65 if (
m_session->DefinesSolverInfo(
"PROBLEMTYPE"))
68 std::string ProblemTypeStr =
m_session->GetSolverInfo(
"PROBLEMTYPE");
90 ASSERTL0(
false,
"Implicit Peregrine not set up.");
95 if (
m_session->DefinesParameter(
"ConstDepth"))
101 ASSERTL0(
false,
"Constant Depth not specified");
111 "Continuous projection type not supported for Peregrine.");
118 std::string diffName;
119 std::string riemName;
125 m_session->LoadSolverInfo(
"AdvectionType", advName,
"WeakDG");
134 m_session->LoadSolverInfo(
"UpwindType", riemName,
"NoSolver");
157 ASSERTL0(
false,
"Unsupported projection type.");
173 NekDouble initialtime,
bool dumpInitialConditions,
174 [[maybe_unused]]
const int domain)
192 !
m_comm->IsParallelInTime())
196 else if (dumpInitialConditions &&
m_nchk == 0 &&
m_comm->IsParallelInTime())
199 if (!fs::is_directory(newdir))
201 fs::create_directory(newdir);
203 if (
m_comm->GetTimeComm()->GetRank() == 0)
216 int nvariables = inarray.size();
228 for (i = 0; i < 2; ++i)
245 for (i = 0; i < nvariables - 1; ++i)
265 "Variable depth not supported for the Peregrine "
279 m_fields[0]->IProductWRTBase(outarray[1], modarray[0]);
280 m_fields[0]->IProductWRTBase(outarray[2], modarray[1]);
290 m_fields[0]->MultiplyByElmtInvMass(modarray[0], modarray[0]);
291 m_fields[0]->MultiplyByElmtInvMass(modarray[1], modarray[1]);
303 for (i = 0; i < 2; ++i)
341 m_fields[0]->IProductWRTDerivBase(0, physfield[0], coeffsfield[0]);
342 m_fields[0]->IProductWRTDerivBase(1, physfield[1], coeffsfield[1]);
343 Vmath::Vadd(ncoeffs, coeffsfield[0], 1, coeffsfield[1], 1,
352 m_fields[0]->AddTraceIntegral(normflux, coeffsfield[0]);
353 m_fields[0]->MultiplyByElmtInvMass(coeffsfield[0], coeffsfield[0]);
354 m_fields[0]->BwdTrans(coeffsfield[0], physfield[0]);
356 Vmath::Smul(nq, -invgamma, physfield[0], 1, physfield[0], 1);
384 Vmath::Smul(nq, gamma, physfield[0], 1, physfield[0], 1);
389 m_fields[0]->IProductWRTDerivBase(0, physfield[0], coeffsfield[0]);
390 m_fields[0]->IProductWRTDerivBase(1, physfield[0], coeffsfield[1]);
402 m_fields[0]->AddTraceIntegral(normflux, coeffsfield[0]);
405 m_fields[0]->AddTraceIntegral(normflux, coeffsfield[1]);
408 Vmath::Vadd(ncoeffs, f1, 1, coeffsfield[0], 1, modarray[0], 1);
409 Vmath::Vadd(ncoeffs, f2, 1, coeffsfield[1], 1, modarray[1], 1);
411 m_fields[1]->MultiplyByElmtInvMass(modarray[0], modarray[0]);
412 m_fields[2]->MultiplyByElmtInvMass(modarray[1], modarray[1]);
414 m_fields[1]->BwdTrans(modarray[0], outarray[1]);
415 m_fields[2]->BwdTrans(modarray[1], outarray[2]);
424 ASSERTL0(
false,
"Unknown projection scheme for the Peregrine");
427 ASSERTL0(
false,
"Unknown projection scheme for the NonlinearSWE");
449 for (
int i = 0; i < nq; i++)
452 amp * pow((1.0 / cosh(
sqrt(0.75 * (amp / (
d *
d *
d))) *
453 (
A * (x0[i] + x_offset) - C * time))),
457 pow((1.0 / cosh(
sqrt(0.75 * (amp / (
d *
d *
d))) *
458 (
A * (x0[i] + x_offset) - C * time))),
470 for (
int i = 0; i < 4; ++i)
484 for (
int j = 0; j < nq; j++)
486 (
m_fields[3]->UpdatePhys())[j] = fce[j];
513 for (i = 0; i < 2; ++i)
524 m_fields[1]->GetFwdBwdTracePhys(inarray[0], Fwd[0], Bwd[0]);
525 m_fields[2]->GetFwdBwdTracePhys(inarray[1], Fwd[1], Bwd[1]);
530 for (i = 0; i < nTraceNumPoints; ++i)
532 numfluxX[i] = 0.5 * (Fwd[0][i] + Bwd[0][i]);
533 numfluxY[i] = 0.5 * (Fwd[1][i] + Bwd[1][i]);
545 for (
int n = 0; n <
m_fields[0]->GetBndConditions().size(); ++n)
549 if (boost::iequals(
m_fields[0]->GetBndConditions()[n]->GetUserDefined(),
556 if (
m_fields[0]->GetBndConditions()[n]->IsTimeDependent())
558 ASSERTL0(
false,
"time-dependent BC not implemented for Boussinesq");
560 cnt +=
m_fields[0]->GetBndCondExpansions()[n]->GetExpSize();
573 for (
int i = 0; i < nvariables; ++i)
576 m_fields[i]->ExtractTracePhys(inarray[i], Fwd[i]);
581 int e, id1, id2, npts;
583 m_fields[0]->GetBndCondExpansions()[bcRegion];
584 for (e = 0; e < bcexp->GetExpSize(); ++e)
586 npts = bcexp->GetExp(e)->GetTotPoints();
587 id1 = bcexp->GetPhys_Offset(e);
588 id2 =
m_fields[0]->GetTrace()->GetPhys_Offset(
589 m_fields[0]->GetTraceMap()->GetBndCondIDToGlobalTraceID(cnt + e));
595 ASSERTL0(
false,
"1D not yet implemented for Boussinesq");
606 &tmp_n[0], 1, &tmp_n[0], 1);
611 &tmp_t[0], 1, &tmp_t[0], 1);
620 &Fwd[0][id2], 1, &Fwd[0][id2], 1);
625 &Fwd[1][id2], 1, &Fwd[1][id2], 1);
629 ASSERTL0(
false,
"3D not implemented for Boussinesq equations");
632 ASSERTL0(
false,
"Illegal expansion dimension");
636 bcexp =
m_fields[1]->GetBndCondExpansions()[bcRegion];
637 Vmath::Vcopy(npts, &Fwd[0][id2], 1, &(bcexp->UpdatePhys())[id1], 1);
639 bcexp =
m_fields[2]->GetBndCondExpansions()[bcRegion];
640 Vmath::Vcopy(npts, &Fwd[1][id2], 1, &(bcexp->UpdatePhys())[id1], 1);
650 for (
int n = 0; n <
m_fields[0]->GetBndConditions().size(); ++n)
654 if (boost::iequals(
m_fields[0]->GetBndConditions()[n]->GetUserDefined(),
660 if (
m_fields[0]->GetBndConditions()[n]->IsTimeDependent())
665 cnt +=
m_fields[0]->GetBndCondExpansions()[n]->GetExpSize() - 1;
676 m_fields[0]->ExtractTracePhys(inarray,
z);
680 int e, id1, id2, npts;
682 m_fields[0]->GetBndCondExpansions()[bcRegion];
684 for (e = 0; e < bcexp->GetExpSize(); ++e)
686 npts = bcexp->GetExp(e)->GetTotPoints();
687 id1 = bcexp->GetPhys_Offset(e);
688 id2 =
m_fields[0]->GetTrace()->GetPhys_Offset(
689 m_fields[0]->GetTraceMap()->GetBndCondIDToGlobalTraceID(cnt + e));
693 bcexp =
m_fields[1]->GetBndCondExpansions()[bcRegion];
694 Vmath::Vcopy(npts, &
z[id2], 1, &(bcexp->UpdatePhys())[id1], 1);
715 m_fields[1]->GetFwdBwdTracePhys(physfield, Fwd, Bwd);
720 for (i = 0; i < nTraceNumPoints; ++i)
722 outX[i] = 0.5 * (Fwd[i] + Bwd[i]);
723 outY[i] = 0.5 * (Fwd[i] + Bwd[i]);
#define ASSERTL0(condition, msg)
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 DoOdeRhs(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
void v_SetInitialConditions(NekDouble initialtime=0.0, bool dumpInitialConditions=true, const int domain=0) override
Set the initial conditions.
static SolverUtils::EquationSystemSharedPtr create(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
Creates an instance of this class.
void SetBoundaryConditionsForcing(Array< OneD, Array< OneD, NekDouble > > &inarray, NekDouble time)
void WallBoundaryForcing(int bcRegion, int cnt, Array< OneD, Array< OneD, NekDouble > > &inarray)
void v_GenerateSummary(SolverUtils::SummaryList &s) override
Print a summary of time stepping parameters.
ProblemType m_problemType
void LaitoneSolitaryWave(NekDouble amp, NekDouble d, NekDouble time, NekDouble x_offset)
static std::string className
Name of class.
void NumericalFluxForcing(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, NekDouble > &numfluxX, Array< OneD, NekDouble > &numfluxY)
void SetBoundaryConditionsContVariables(Array< OneD, NekDouble > &inarray, NekDouble time)
void WallBoundaryContVariables(int bcRegion, int cnt, Array< OneD, NekDouble > &inarray)
void NumericalFluxConsVariables(Array< OneD, NekDouble > &physfield, Array< OneD, NekDouble > &outX, Array< OneD, NekDouble > &outY)
StdRegions::ConstFactorMap m_factors
problem type selector
void v_InitObject(bool DeclareFields=true) override
Init object for UnsteadySystem class.
NonlinearPeregrine(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
void WCESolve(Array< OneD, NekDouble > &fce, NekDouble lambda)
void v_GenerateSummary(SolverUtils::SummaryList &s) override
Print a summary of time stepping parameters.
void GetFluxVector(const Array< OneD, const Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &flux)
NekDouble m_g
Acceleration of gravity.
SolverUtils::RiemannSolverSharedPtr m_riemannSolver
const Array< OneD, NekDouble > & GetDepth()
void AddCoriolis(const Array< OneD, const Array< OneD, NekDouble > > &physarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
void DoOdeProjection(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
SolverUtils::AdvectionSharedPtr m_advection
bool m_constantDepth
Indicates if constant depth case.
Array< OneD, NekDouble > m_coriolis
Coriolis force.
void v_InitObject(bool DeclareFields=true) override
Init object for UnsteadySystem class.
const Array< OneD, const Array< OneD, NekDouble > > & GetNormals()
const Array< OneD, const Array< OneD, NekDouble > > & GetVecLocs()
int m_expdim
Expansion dimension.
virtual SOLVER_UTILS_EXPORT void v_SetInitialConditions(NekDouble initialtime=0.0, bool dumpInitialConditions=true, const int domain=0)
LibUtilities::CommSharedPtr m_comm
Communicator.
SOLVER_UTILS_EXPORT int GetTraceTotPoints()
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
SOLVER_UTILS_EXPORT void Checkpoint_Output(const int n)
Write checkpoint file of m_fields.
SOLVER_UTILS_EXPORT void WriteFld(const std::string &outname)
Write field data to the given filename.
std::string m_sessionName
Name of the session.
LibUtilities::SessionReaderSharedPtr m_session
The session reader.
Array< OneD, Array< OneD, NekDouble > > m_traceNormals
Array holding trace normals for DG simulations in the forwards direction.
SOLVER_UTILS_EXPORT int GetNcoeffs()
int m_nchk
Number of checkpoints written so far.
enum MultiRegions::ProjectionType m_projectionType
Type of projection; e.g continuous or discontinuous.
int m_checksteps
Number of steps between checkpoints.
SOLVER_UTILS_EXPORT int GetTotPoints()
LibUtilities::TimeIntegrationSchemeOperators m_ode
The time integration scheme operators to use.
bool m_explicitAdvection
Indicates if explicit or implicit treatment of advection is used.
std::shared_ptr< SessionReader > SessionReaderSharedPtr
@ eMixed_CG_Discontinuous
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
AdvectionFactory & GetAdvectionFactory()
Gets the factory for initialising advection objects.
std::vector< std::pair< std::string, std::string > > SummaryList
EquationSystemFactory & GetEquationSystemFactory()
void AddSummaryItem(SummaryList &l, const std::string &name, const std::string &value)
Adds a summary item to the summary info list.
RiemannSolverFactory & GetRiemannSolverFactory()
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
std::vector< double > z(NPUPPER)
std::vector< double > d(NPUPPER *NPUPPER)
static Array< OneD, Array< OneD, NekDouble > > NullNekDoubleArrayOfArray
const char *const ProblemTypeMap[]
@ SIZE_ProblemType
Length of enum list.
@ eSolitaryWave
First order Laitone solitary wave.
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 Neg(int n, T *x, const int incx)
Negate x = -x.
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 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 Vvtvm(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)
vvtvm (vector times vector minus 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 Sadd(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Add vector y = alpha + x.
void Vvtvvtp(int n, const T *v, int incv, const T *w, int incw, const T *x, int incx, const T *y, int incy, T *z, int incz)
vvtvvtp (vector times vector plus vector times vector):
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
scalarT< T > sqrt(scalarT< T > in)