37 #include <boost/algorithm/string.hpp>
46 string NonlinearSWE::className =
48 "NonlinearSWE", NonlinearSWE::create,
49 "Nonlinear shallow water equation in conservative variables.");
51 NonlinearSWE::NonlinearSWE(
69 ASSERTL0(
false,
"Implicit SWE not set up.");
92 m_session->LoadSolverInfo(
"AdvectionType", advName,
"WeakDG");
104 m_session->LoadSolverInfo(
"UpwindType", riemName,
"Average");
146 ASSERTL0(
false,
"Unsupported projection type.");
176 m_fields[0]->IProductWRTBase(tmp,mod);
177 m_fields[0]->MultiplyByElmtInvMass(mod,mod);
184 m_fields[0]->IProductWRTBase(tmp,mod);
185 m_fields[0]->MultiplyByElmtInvMass(mod,mod);
204 ASSERTL0(
false,
"Unknown projection scheme for the NonlinearSWE");
231 m_fields[0]->IProductWRTBase(tmp,mod);
232 m_fields[0]->MultiplyByElmtInvMass(mod,mod);
234 Vmath::Vadd(nq,tmp,1,outarray[i+1],1,outarray[i+1],1);
245 Vmath::Vadd(nq,tmp,1,outarray[i+1],1,outarray[i+1],1);
250 ASSERTL0(
false,
"Unknown projection scheme for the NonlinearSWE");
263 int nvariables = inarray.size();
285 for(i = 0; i < nvariables; ++i)
318 fluxvector(nvariables);
320 for (i = 0; i < nvariables; ++i)
323 for(j = 0; j < ndim; ++j)
340 for(i = 0; i < nvariables; ++i)
368 ASSERTL0(
false,
"Unknown projection scheme for the NonlinearSWE");
379 int nvariables = inarray.size();
390 for(i = 0; i < nvariables; ++i)
404 for(i = 0; i < nvariables; ++i)
406 m_fields[i]->FwdTrans(inarray[i],coeffs);
407 m_fields[i]->BwdTrans_IterPerExp(coeffs,outarray[i]);
412 ASSERTL0(
false,
"Unknown projection scheme");
431 for (
int i = 0; i < nvariables; ++i)
434 m_fields[i]->ExtractTracePhys(inarray[i], Fwd[i]);
438 for (
int n = 0; n <
m_fields[0]->GetBndConditions().size(); ++n)
441 if (
m_fields[0]->GetBndConditions()[n]->GetBoundaryConditionType()
448 if (boost::iequals(
m_fields[0]->GetBndConditions()[n]->GetUserDefined(),
"Wall"))
454 if (
m_fields[0]->GetBndConditions()[n]->IsTimeDependent())
456 for (
int i = 0; i < nvariables; ++i)
459 m_fields[i]->EvaluateBoundaryConditions(time, varName);
462 cnt +=
m_fields[0]->GetBndCondExpansions()[n]->GetExpSize();
477 int nvariables = physarray.size();
481 int e, id1, id2, npts;
483 for (e = 0; e <
m_fields[0]->GetBndCondExpansions()[bcRegion]
486 npts =
m_fields[0]->GetBndCondExpansions()[bcRegion]->
487 GetExp(e)->GetTotPoints();
488 id1 =
m_fields[0]->GetBndCondExpansions()[bcRegion]->
490 id2 =
m_fields[0]->GetTrace()->GetPhys_Offset(
492 GetBndCondIDToGlobalTraceID(cnt+e));
521 for (i = 0; i < nvariables; ++i)
524 &(
m_fields[i]->GetBndCondExpansions()[bcRegion]->
525 UpdatePhys())[id1], 1);
535 int nvariables = physarray.size();
539 int e, id1, id2, npts;
543 npts =
m_fields[0]->GetBndCondExpansions()[bcRegion]->GetExp(e)->GetNumPoints(0);
544 id1 =
m_fields[0]->GetBndCondExpansions()[bcRegion]->GetPhys_Offset(e) ;
545 id2 =
m_fields[0]->GetTrace()->GetPhys_Offset(
m_fields[0]->GetTraceMap()->GetBndCondIDToGlobalTraceID(cnt+e));
578 ASSERTL0(
false,
"3D not implemented for Shallow Water Equations");
581 ASSERTL0(
false,
"Illegal expansion dimension");
587 for (i = 0; i < nvariables; ++i)
589 Vmath::Vcopy(npts,&Fwd[i][id2], 1,&(
m_fields[i]->GetBndCondExpansions()[bcRegion]->UpdatePhys())[id1],1);
601 int nq =
m_fields[0]->GetTotPoints();
617 Vmath::Vmul(nq, physfield[0], 1, physfield[0], 1, tmp, 1);
630 Vmath::Vadd(nq, flux[i+1][i], 1, tmp, 1, flux[i+1][i], 1);
640 if(physin.get() == physout.get())
644 for (
int i = 0; i < 3; ++i)
666 Vmath::Vdiv(nq,physin[1],1,physin[0],1,physout[1],1);
669 Vmath::Vdiv(nq,physin[2],1,physin[0],1,physout[2],1);
694 if(physin.get() == physout.get())
698 for (
int i = 0; i < 3; ++i)
709 Vmath::Vmul(nq,physout[0],1,tmp[1],1,physout[1],1);
712 Vmath::Vmul(nq,physout[0],1,tmp[2],1,physout[2],1);
721 Vmath::Vmul(nq,physout[0],1,physin[1],1,physout[1],1);
724 Vmath::Vmul(nq,physout[0],1,physin[2],1,physout[2],1);
756 const int npts = physfield[0].size();
760 Vmath::Vdiv(npts, physfield[1+i], 1, physfield[0], 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)
void DoOdeProjection(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
void AddCoriolis(const Array< OneD, const Array< OneD, NekDouble > > &physarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
void DoOdeRhs(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
void AddVariableDepth(const Array< OneD, const Array< OneD, NekDouble > > &physarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
void SetBoundaryConditions(Array< OneD, Array< OneD, NekDouble > > &physarray, NekDouble time)
void WallBoundary(int bcRegion, int cnt, Array< OneD, Array< OneD, NekDouble > > &Fwd, Array< OneD, Array< OneD, NekDouble > > &physarray)
Wall boundary condition.
virtual void v_ConservativeToPrimitive()
virtual void v_PrimitiveToConservative()
void GetFluxVector(const Array< OneD, const Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &flux)
void WallBoundary2D(int bcRegion, int cnt, Array< OneD, Array< OneD, NekDouble > > &Fwd, Array< OneD, Array< OneD, NekDouble > > &physarray)
virtual void v_GenerateSummary(SolverUtils::SummaryList &s)
Print a summary of time stepping parameters.
virtual void v_InitObject()
Init object for UnsteadySystem class.
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.
virtual void v_InitObject()
Init object for UnsteadySystem class.
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)
Print a summary of time stepping parameters.
Array< OneD, NekDouble > m_coriolis
Coriolis force
Array< OneD, NekDouble > m_depth
Still water depth.
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 int GetPhys_Offset(int n)
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 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 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.