35#include <boost/algorithm/string.hpp> 
   49        "Linear shallow water equation in primitive variables.");
 
   68        ASSERTL0(
false, 
"Implicit SWE not set up.");
 
   89            m_session->LoadSolverInfo(
"AdvectionType", advName, 
"WeakDG");
 
   95            m_session->LoadSolverInfo(
"UpwindType", riemName, 
"NoSolver");
 
   98                ASSERTL0(
false, 
"LinearHLL only valid for constant depth");
 
  110            int nTracePointsTot = 
m_fields[0]->GetTrace()->GetTotPoints();
 
  127            ASSERTL0(
false, 
"Unsupported projection type.");
 
  155            m_fields[0]->IProductWRTBase(tmp, mod);
 
  156            m_fields[0]->MultiplyByElmtInvMass(mod, mod);
 
  158            Vmath::Vadd(nq, tmp, 1, outarray[1], 1, outarray[1], 1);
 
  163            m_fields[0]->IProductWRTBase(tmp, mod);
 
  164            m_fields[0]->MultiplyByElmtInvMass(mod, mod);
 
  166            Vmath::Vadd(nq, tmp, 1, outarray[2], 1, outarray[2], 1);
 
  174            Vmath::Vadd(nq, tmp, 1, outarray[1], 1, outarray[1], 1);
 
  179            Vmath::Vadd(nq, tmp, 1, outarray[2], 1, outarray[2], 1);
 
  183            ASSERTL0(
false, 
"Unknown projection scheme for the NonlinearSWE");
 
  194    int nvariables = inarray.size();
 
  214            for (i = 0; i < nvariables; ++i)
 
  241            for (i = 0; i < nvariables; ++i)
 
  244                for (j = 0; j < ndim; ++j)
 
  259            for (i = 0; i < nvariables; ++i)
 
  262                                       fluxvector[i][0], tmp);
 
  264                                       fluxvector[i][1], tmp1);
 
  282            ASSERTL0(
false, 
"Unknown projection scheme for the NonlinearSWE");
 
  292    int nvariables = inarray.size();
 
  300            if (inarray != outarray)
 
  304                for (i = 0; i < nvariables; ++i)
 
  319            for (i = 0; i < nvariables; ++i)
 
  321                m_fields[i]->FwdTrans(inarray[i], coeffs);
 
  322                m_fields[i]->BwdTrans(coeffs, outarray[i]);
 
  327            ASSERTL0(
false, 
"Unknown projection scheme");
 
  344    for (
int i = 0; i < nvariables; ++i)
 
  347        m_fields[i]->ExtractTracePhys(inarray[i], Fwd[i]);
 
  351    for (
int n = 0; n < 
m_fields[0]->GetBndConditions().size(); ++n)
 
  353        if (
m_fields[0]->GetBndConditions()[n]->GetBoundaryConditionType() ==
 
  360        if (boost::iequals(
m_fields[0]->GetBndConditions()[n]->GetUserDefined(),
 
  367        if (
m_fields[0]->GetBndConditions()[n]->IsTimeDependent())
 
  369            for (
int i = 0; i < nvariables; ++i)
 
  372                m_fields[i]->EvaluateBoundaryConditions(time, varName);
 
  375        cnt += 
m_fields[0]->GetBndCondExpansions()[n]->GetExpSize();
 
  388    int nvariables = physarray.size();
 
  392    int e, id1, id2, npts;
 
  398                   ->GetBndCondExpansions()[bcRegion]
 
  401        id1 = 
m_fields[0]->GetBndCondExpansions()[bcRegion]->GetPhys_Offset(e);
 
  402        id2 = 
m_fields[0]->GetTrace()->GetPhys_Offset(
 
  403            m_fields[0]->GetTraceMap()->GetBndCondIDToGlobalTraceID(cnt + e));
 
  412                         &tmp[0], 1, &tmp[0], 1);
 
  422                         &Fwd[1 + i][id2], 1, &Fwd[1 + i][id2], 1);
 
  426        for (i = 0; i < nvariables; ++i)
 
  430                               ->GetBndCondExpansions()[bcRegion]
 
  431                               ->UpdatePhys())[id1],
 
  443    int nvariables = physarray.size();
 
  447    int e, id1, id2, npts;
 
  453                   ->GetBndCondExpansions()[bcRegion]
 
  456        id1 = 
m_fields[0]->GetBndCondExpansions()[bcRegion]->GetPhys_Offset(e);
 
  457        id2 = 
m_fields[0]->GetTrace()->GetPhys_Offset(
 
  458            m_fields[0]->GetTraceMap()->GetBndCondIDToGlobalTraceID(cnt + e));
 
  476                             &tmp_n[0], 1, &tmp_n[0], 1);
 
  481                             &tmp_t[0], 1, &tmp_t[0], 1);
 
  490                             &Fwd[1][id2], 1, &Fwd[1][id2], 1);
 
  495                             &Fwd[2][id2], 1, &Fwd[2][id2], 1);
 
  500                         "3D not implemented for Shallow Water Equations");
 
  503                ASSERTL0(
false, 
"Illegal expansion dimension");
 
  507        for (i = 0; i < nvariables; ++i)
 
  511                               ->GetBndCondExpansions()[bcRegion]
 
  512                               ->UpdatePhys())[id1],
 
  524    int nq = 
m_fields[0]->GetTotPoints();
 
  549        Vmath::Vadd(nq, flux[i + 1][i], 1, tmp, 1, flux[i + 1][i], 1);
 
  559    if (physin.get() == physout.get())
 
  563        for (
int i = 0; i < 3; ++i)
 
  574        Vmath::Vdiv(nq, tmp[1], 1, tmp[0], 1, physout[1], 1);
 
  577        Vmath::Vdiv(nq, tmp[2], 1, tmp[0], 1, physout[2], 1);
 
  585        Vmath::Vdiv(nq, physin[1], 1, physin[0], 1, physout[1], 1);
 
  588        Vmath::Vdiv(nq, physin[2], 1, physin[0], 1, physout[2], 1);
 
  616    if (physin.get() == physout.get())
 
  620        for (
int i = 0; i < 3; ++i)
 
  631        Vmath::Vmul(nq, physout[0], 1, tmp[1], 1, physout[1], 1);
 
  634        Vmath::Vmul(nq, physout[0], 1, tmp[2], 1, physout[2], 1);
 
  642        Vmath::Vmul(nq, physout[0], 1, physin[1], 1, physout[1], 1);
 
  645        Vmath::Vmul(nq, physout[0], 1, physin[2], 1, physout[2], 1);
 
  677    const int npts = physfield[0].size();
 
  681        Vmath::Vcopy(npts, physfield[1 + i], 1, velocity[i], 1);
 
  688    if (
m_session->DefinesSolverInfo(
"UpwindType"))
 
#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_GenerateSummary(SolverUtils::SummaryList &s) override
Print a summary of time stepping parameters.
void GetVelocityVector(const Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, NekDouble > > &velocity)
Compute the velocity field  given the momentum .
void DoOdeRhs(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
LinearSWE(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
static SolverUtils::EquationSystemSharedPtr create(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
Creates an instance of this class.
const Array< OneD, NekDouble > & GetDepthBwd()
void DoOdeProjection(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
const Array< OneD, NekDouble > & GetDepthFwd()
void SetBoundaryConditions(Array< OneD, Array< OneD, NekDouble > > &physarray, 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_InitObject(bool DeclareFields=true) override
Init object for UnsteadySystem class.
void GetFluxVector(const Array< OneD, const Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &flux)
static std::string className
Name of class.
virtual void v_PrimitiveToConservative() override
Array< OneD, NekDouble > m_dFwd
Still water depth traces.
Array< OneD, NekDouble > m_dBwd
void WallBoundary(int bcRegion, int cnt, Array< OneD, Array< OneD, NekDouble > > &Fwd, Array< OneD, Array< OneD, NekDouble > > &physarray)
Wall boundary condition.
void AddCoriolis(const Array< OneD, const Array< OneD, NekDouble > > &physarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Base class for unsteady solvers.
NekDouble m_g
Acceleration of gravity.
void CopyBoundaryTrace(const Array< OneD, NekDouble > &Fwd, Array< OneD, NekDouble > &Bwd)
SolverUtils::RiemannSolverSharedPtr m_riemannSolver
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.
const Array< OneD, const Array< OneD, NekDouble > > & GetNormals()
const Array< OneD, const Array< OneD, NekDouble > > & GetVecLocs()
void ConservativeToPrimitive()
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 Zero(int n, T *x, const int incx)
Zero vector.
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.