35 #include <boost/algorithm/string.hpp>
46 string NonlinearSWE::className =
48 "NonlinearSWE", NonlinearSWE::create,
49 "Nonlinear shallow water equation in conservative variables.");
68 ASSERTL0(
false,
"Implicit SWE not set up.");
91 m_session->LoadSolverInfo(
"AdvectionType", advName,
"WeakDG");
104 m_session->LoadSolverInfo(
"UpwindType", riemName,
"Average");
141 ASSERTL0(
false,
"Unsupported projection type.");
169 m_fields[0]->IProductWRTBase(tmp, mod);
170 m_fields[0]->MultiplyByElmtInvMass(mod, mod);
172 Vmath::Vadd(nq, tmp, 1, outarray[1], 1, outarray[1], 1);
177 m_fields[0]->IProductWRTBase(tmp, mod);
178 m_fields[0]->MultiplyByElmtInvMass(mod, mod);
180 Vmath::Vadd(nq, tmp, 1, outarray[2], 1, outarray[2], 1);
188 Vmath::Vadd(nq, tmp, 1, outarray[1], 1, outarray[1], 1);
193 Vmath::Vadd(nq, tmp, 1, outarray[2], 1, outarray[2], 1);
197 ASSERTL0(
false,
"Unknown projection scheme for the NonlinearSWE");
222 m_fields[0]->IProductWRTBase(tmp, mod);
223 m_fields[0]->MultiplyByElmtInvMass(mod, mod);
225 Vmath::Vadd(nq, tmp, 1, outarray[i + 1], 1, outarray[i + 1], 1);
236 Vmath::Vadd(nq, tmp, 1, outarray[i + 1], 1, outarray[i + 1], 1);
241 ASSERTL0(
false,
"Unknown projection scheme for the NonlinearSWE");
252 int nvariables = inarray.size();
272 for (i = 0; i < nvariables; ++i)
305 for (i = 0; i < nvariables; ++i)
308 for (j = 0; j < ndim; ++j)
323 for (i = 0; i < nvariables; ++i)
326 fluxvector[i][0], tmp);
328 fluxvector[i][1], tmp1);
352 ASSERTL0(
false,
"Unknown projection scheme for the NonlinearSWE");
362 int nvariables = inarray.size();
372 for (i = 0; i < nvariables; ++i)
386 for (i = 0; i < nvariables; ++i)
388 m_fields[i]->FwdTrans(inarray[i], coeffs);
389 m_fields[i]->BwdTrans(coeffs, outarray[i]);
394 ASSERTL0(
false,
"Unknown projection scheme");
411 for (
int i = 0; i < nvariables; ++i)
414 m_fields[i]->ExtractTracePhys(inarray[i], Fwd[i]);
418 for (
int n = 0; n <
m_fields[0]->GetBndConditions().size(); ++n)
421 if (
m_fields[0]->GetBndConditions()[n]->GetBoundaryConditionType() ==
428 if (boost::iequals(
m_fields[0]->GetBndConditions()[n]->GetUserDefined(),
435 if (
m_fields[0]->GetBndConditions()[n]->IsTimeDependent())
437 for (
int i = 0; i < nvariables; ++i)
440 m_fields[i]->EvaluateBoundaryConditions(time, varName);
443 cnt +=
m_fields[0]->GetBndCondExpansions()[n]->GetExpSize();
456 int nvariables = physarray.size();
460 int e, id1, id2, npts;
466 ->GetBndCondExpansions()[bcRegion]
469 id1 =
m_fields[0]->GetBndCondExpansions()[bcRegion]->GetPhys_Offset(e);
470 id2 =
m_fields[0]->GetTrace()->GetPhys_Offset(
471 m_fields[0]->GetTraceMap()->GetBndCondIDToGlobalTraceID(cnt + e));
480 &tmp[0], 1, &tmp[0], 1);
490 &Fwd[1 + i][id2], 1, &Fwd[1 + i][id2], 1);
494 for (i = 0; i < nvariables; ++i)
498 ->GetBndCondExpansions()[bcRegion]
499 ->UpdatePhys())[id1],
511 int nvariables = physarray.size();
515 int e, id1, id2, npts;
521 ->GetBndCondExpansions()[bcRegion]
524 id1 =
m_fields[0]->GetBndCondExpansions()[bcRegion]->GetPhys_Offset(e);
525 id2 =
m_fields[0]->GetTrace()->GetPhys_Offset(
526 m_fields[0]->GetTraceMap()->GetBndCondIDToGlobalTraceID(cnt + e));
544 &tmp_n[0], 1, &tmp_n[0], 1);
549 &tmp_t[0], 1, &tmp_t[0], 1);
558 &Fwd[1][id2], 1, &Fwd[1][id2], 1);
563 &Fwd[2][id2], 1, &Fwd[2][id2], 1);
568 "3D not implemented for Shallow Water Equations");
571 ASSERTL0(
false,
"Illegal expansion dimension");
575 for (i = 0; i < nvariables; ++i)
579 ->GetBndCondExpansions()[bcRegion]
580 ->UpdatePhys())[id1],
592 int nq =
m_fields[0]->GetTotPoints();
608 Vmath::Vmul(nq, physfield[0], 1, physfield[0], 1, tmp, 1);
616 Vmath::Vmul(nq, velocity[j], 1, physfield[i + 1], 1, flux[i + 1][j],
621 Vmath::Vadd(nq, flux[i + 1][i], 1, tmp, 1, flux[i + 1][i], 1);
631 if (physin.get() == physout.get())
635 for (
int i = 0; i < 3; ++i)
646 Vmath::Vdiv(nq, tmp[1], 1, tmp[0], 1, physout[1], 1);
649 Vmath::Vdiv(nq, tmp[2], 1, tmp[0], 1, physout[2], 1);
657 Vmath::Vdiv(nq, physin[1], 1, physin[0], 1, physout[1], 1);
660 Vmath::Vdiv(nq, physin[2], 1, physin[0], 1, physout[2], 1);
688 if (physin.get() == physout.get())
692 for (
int i = 0; i < 3; ++i)
703 Vmath::Vmul(nq, physout[0], 1, tmp[1], 1, physout[1], 1);
706 Vmath::Vmul(nq, physout[0], 1, tmp[2], 1, physout[2], 1);
714 Vmath::Vmul(nq, physout[0], 1, physin[1], 1, physout[1], 1);
717 Vmath::Vmul(nq, physout[0], 1, physin[2], 1, physout[2], 1);
749 const int npts = physfield[0].size();
753 Vmath::Vdiv(npts, physfield[1 + i], 1, physfield[0], 1, velocity[i], 1);
#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)
virtual void v_PrimitiveToConservative() override
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)
void WallBoundary2D(int bcRegion, int cnt, Array< OneD, Array< OneD, NekDouble >> &Fwd, Array< OneD, Array< OneD, NekDouble >> &physarray)
virtual void v_ConservativeToPrimitive() override
virtual void v_GenerateSummary(SolverUtils::SummaryList &s) override
Print a summary of time stepping parameters.
void SetBoundaryConditions(Array< OneD, Array< OneD, NekDouble >> &physarray, NekDouble time)
void GetFluxVector(const Array< OneD, const Array< OneD, NekDouble >> &physfield, Array< OneD, Array< OneD, Array< OneD, NekDouble >>> &flux)
void AddVariableDepth(const Array< OneD, const Array< OneD, NekDouble >> &physarray, Array< OneD, Array< OneD, NekDouble >> &outarray)
void WallBoundary(int bcRegion, int cnt, Array< OneD, Array< OneD, NekDouble >> &Fwd, Array< OneD, Array< OneD, NekDouble >> &physarray)
Wall boundary condition.
virtual void v_InitObject(bool DeclareFields=true) override
Init object for UnsteadySystem class.
void DoOdeRhs(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble time)
void GetVelocityVector(const Array< OneD, Array< OneD, NekDouble >> &physfield, Array< OneD, Array< OneD, NekDouble >> &velocity)
Compute the velocity field given the momentum .
Base class for unsteady solvers.
NekDouble m_g
Acceleration of gravity.
SolverUtils::RiemannSolverSharedPtr m_riemannSolver
Array< OneD, Array< OneD, NekDouble > > m_bottomSlope
const Array< OneD, NekDouble > & GetDepth()
const Array< OneD, const Array< OneD, NekDouble > > & GetNormals()
SolverUtils::AdvectionSharedPtr m_advection
void PrimitiveToConservative()
bool m_constantDepth
Indicates if constant depth case.
virtual void v_GenerateSummary(SolverUtils::SummaryList &s) override
Print a summary of time stepping parameters.
Array< OneD, NekDouble > m_coriolis
Coriolis force.
Array< OneD, NekDouble > m_depth
Still water depth.
virtual void v_InitObject(bool DeclareFields=true) override
Init object for UnsteadySystem class.
void ConservativeToPrimitive()
const Array< OneD, const Array< OneD, NekDouble > > & GetVecLocs()
int m_spacedim
Spatial dimension (>= expansion dim).
int m_expdim
Expansion dimension.
SOLVER_UTILS_EXPORT int GetTraceTotPoints()
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
SOLVER_UTILS_EXPORT int GetExpSize()
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 GetNpoints()
SOLVER_UTILS_EXPORT int GetNcoeffs()
enum MultiRegions::ProjectionType m_projectionType
Type of projection; e.g continuous or discontinuous.
SOLVER_UTILS_EXPORT void SetBoundaryConditions(NekDouble time)
Evaluates the boundary conditions at the given time.
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
MultiRegions::Direction const DirCartesianMap[]
@ eMixed_CG_Discontinuous
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
The above copyright notice and this permission notice shall be included.
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 Vdiv(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 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.