Nektar++
MMFSWE.h
Go to the documentation of this file.
1///////////////////////////////////////////////////////////////////////////////
2//
3// File: MMFSWE.h
4//
5// For more information, please see: http://www.nektar.info
6//
7// The MIT License
8//
9// Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
10// Department of Aeronautics, Imperial College London (UK), and Scientific
11// Computing and Imaging Institute, University of Utah (USA).
12//
13// Permission is hereby granted, free of charge, to any person obtaining a
14// copy of this software and associated documentation files (the "Software"),
15// to deal in the Software without restriction, including without limitation
16// the rights to use, copy, modify, merge, publish, distribute, sublicense,
17// and/or sell copies of the Software, and to permit persons to whom the
18// Software is furnished to do so, subject to the following conditions:
19//
20// The above copyright notice and this permission notice shall be included
21// in all copies or substantial portions of the Software.
22//
23// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
29// DEALINGS IN THE SOFTWARE.
30//
31// Description: MMF advection solve routines
32//
33///////////////////////////////////////////////////////////////////////////////
34
35#ifndef NEKTAR_SOLVERS_ADRSOLVER_EQUATIONSYSTEMS_MMFSWE_H
36#define NEKTAR_SOLVERS_ADRSOLVER_EQUATIONSYSTEMS_MMFSWE_H
37
40
41namespace Nektar
42{
43
45{
52 SIZE_TestType ///< Length of enum list
53};
54
55const char *const TestTypeMap[] = {
56 "TestPlane", "TestSteadyZonal",
57 "TestUnsteadyZonal", "TestIsolatedMountain",
58 "TestUnstableJet", "TestRossbyWave",
59};
60
62{
63public:
64 friend class MemoryManager<MMFSWE>;
65
66 /// Creates an instance of this class
70 {
73 p->InitObject();
74 return p;
75 }
76 /// Name of class
77 static std::string className;
78
80
81 /// Destructor
82 virtual ~MMFSWE();
83
84protected:
85 /// Still water depth
88
89 /// Coriolis force
91
93
94 NekDouble m_g; // Gravity
95 NekDouble m_alpha, m_u0, m_Omega, m_H0, m_Hvar; // TestSteadyZonal
96 NekDouble m_k2; // eTestUnsteadyZonal
97 NekDouble m_hs0; // eTestIsolatedMountain
99 NekDouble m_angfreq, m_K; // eTestRossbyWave
100
102
103 /// Indicates if variables are primitive or conservative
105
106 /// Advection velocity
109
112
113 // Plane (used only for Discontinous projection
114 // with 3DHomogenoeus1D expansion)
116
117 /// Session reader
120
121 /// Compute the RHS
122 void DoOdeRhs(const Array<OneD, const Array<OneD, NekDouble>> &inarray,
124 const NekDouble time);
125
126 /// Compute the projection
127 void DoOdeProjection(
128 const Array<OneD, const Array<OneD, NekDouble>> &inarray,
129 Array<OneD, Array<OneD, NekDouble>> &outarray, const NekDouble time);
130
131 void SteadyZonalFlow(unsigned int field, Array<OneD, NekDouble> &outfield);
132
133 void UnsteadyZonalFlow(unsigned int field, const NekDouble time,
134 Array<OneD, NekDouble> &outfield);
135
136 void IsolatedMountainFlow(unsigned int field, const NekDouble time,
137 Array<OneD, NekDouble> &outfield);
138
139 void UnstableJetFlow(unsigned int field, const NekDouble time,
140 Array<OneD, NekDouble> &outfield);
141
142 void RossbyWave(unsigned int field, Array<OneD, NekDouble> &outfield);
143
145
147
149
153
157
160 Array<OneD, NekDouble> &Vorticity);
161
162 /// Get the normal velocity
164
166
168 const Array<OneD, const Array<OneD, NekDouble>> &physin,
170
172 const Array<OneD, const Array<OneD, NekDouble>> &physin,
174
177
179 Array<OneD, Array<OneD, NekDouble>> &OutField);
180
182 Array<OneD, Array<OneD, NekDouble>> &outarray);
183
185 Array<OneD, Array<OneD, NekDouble>> &numfluxFwd,
186 Array<OneD, Array<OneD, NekDouble>> &numfluxBwd);
187
188 void GetSWEFluxVector(
189 const int i, const Array<OneD, const Array<OneD, NekDouble>> &physfield,
191
192 void RiemannSolverHLLC(const int index, NekDouble hL, NekDouble uL,
193 NekDouble vL, NekDouble hR, NekDouble uR,
194 NekDouble vR, Array<OneD, NekDouble> &numfluxF,
195 Array<OneD, NekDouble> &numfluxB);
196
198 NekDouble hR, NekDouble uR, NekDouble vR,
199 NekDouble hstar, NekDouble &hflux, NekDouble &huflux,
200 NekDouble &hvflux);
201
202 void AverageFlux(const int index, NekDouble hL, NekDouble uL, NekDouble vL,
203 NekDouble hR, NekDouble uR, NekDouble vR,
204 Array<OneD, NekDouble> &numfluxF,
205 Array<OneD, NekDouble> &numfluxB);
206
207 void LaxFriedrichFlux(const int index, NekDouble hL, NekDouble uL,
208 NekDouble vL, NekDouble hR, NekDouble uR,
209 NekDouble vR, Array<OneD, NekDouble> &numfluxF,
210 Array<OneD, NekDouble> &numfluxB);
211
212 void RusanovFlux(const int index, NekDouble hL, NekDouble uL, NekDouble vL,
213 NekDouble hR, NekDouble uR, NekDouble vR,
214 Array<OneD, NekDouble> &numfluxF,
215 Array<OneD, NekDouble> &numfluxB);
216
217 void ComputeMagAndDot(const int index, NekDouble &MageF1, NekDouble &MageF2,
218 NekDouble &MageB1, NekDouble &MageB2,
219 NekDouble &eF1_cdot_eB1, NekDouble &eF1_cdot_eB2,
220 NekDouble &eF2_cdot_eB1, NekDouble &eF2_cdot_eB2);
221
223 Array<OneD, Array<OneD, NekDouble>> &outarray);
224
226 Array<OneD, Array<OneD, NekDouble>> &outarray);
227
229 Array<OneD, Array<OneD, NekDouble>> &outarray);
230
232 const int indm, const int indk,
233 const Array<OneD, const Array<OneD, NekDouble>> &physarray,
234 Array<OneD, NekDouble> &outarray);
235
237
238 void EvaluateWaterDepth(void);
239
240 void EvaluateCoriolis(void);
243
245 NekDouble time);
246 void WallBoundary2D(int bcRegion, int cnt,
247 Array<OneD, Array<OneD, NekDouble>> &physarray);
248
249 /// Initialise the object
250 virtual void v_InitObject(bool DeclareFields = true) override;
251
252 virtual void v_DoSolve() override;
253
254 virtual void v_DoInitialise(bool dumpInitialConditions = false) override;
255
256 /// Print Summary
257 virtual void v_GenerateSummary(SolverUtils::SummaryList &s) override;
258
259 virtual void v_SetInitialConditions(const NekDouble initialtime = 0.0,
260 bool dumpInitialConditions = true,
261 const int domain = 0) override;
262
263 virtual void v_EvaluateExactSolution(unsigned int field,
264 Array<OneD, NekDouble> &outfield,
265 const NekDouble time) override;
266
267 virtual NekDouble v_L2Error(unsigned int field,
268 const Array<OneD, NekDouble> &exactsoln,
269 bool Normalised) override;
270
271 virtual NekDouble v_LinfError(
272 unsigned int field, const Array<OneD, NekDouble> &exactsoln) override;
273
274private:
277
278 void TestSWE2Dproblem(const NekDouble time, unsigned int field,
279 Array<OneD, NekDouble> &outfield);
280
281 void Checkpoint_Output_Cartesian(std::string outname);
282};
283} // namespace Nektar
284
285#endif
void ComputeVorticity(const Array< OneD, const NekDouble > &u, const Array< OneD, const NekDouble > &v, Array< OneD, NekDouble > &Vorticity)
Definition: MMFSWE.cpp:2211
void AddDivForGradient(Array< OneD, Array< OneD, NekDouble > > &physarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Definition: MMFSWE.cpp:552
void AddCoriolis(Array< OneD, Array< OneD, NekDouble > > &physarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Definition: MMFSWE.cpp:1201
void UnstableJetFlow(unsigned int field, const NekDouble time, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:2482
virtual void v_InitObject(bool DeclareFields=true) override
Initialise the object.
Definition: MMFSWE.cpp:62
int m_PurturbedJet
Definition: MMFSWE.h:276
NekDouble m_k2
Definition: MMFSWE.h:96
NekDouble ComputeUnstableJetuphi(const NekDouble theta)
Definition: MMFSWE.cpp:2749
MMFSWE(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
Session reader.
Definition: MMFSWE.cpp:52
Array< OneD, NekDouble > m_vellc
Definition: MMFSWE.h:111
virtual void v_SetInitialConditions(const NekDouble initialtime=0.0, bool dumpInitialConditions=true, const int domain=0) override
Definition: MMFSWE.cpp:1786
NekDouble m_alpha
Definition: MMFSWE.h:95
bool m_primitive
Indicates if variables are primitive or conservative.
Definition: MMFSWE.h:104
static SolverUtils::EquationSystemSharedPtr create(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
Creates an instance of this class.
Definition: MMFSWE.h:67
virtual ~MMFSWE()
Destructor.
Definition: MMFSWE.cpp:245
void WeakDGSWEDirDeriv(const Array< OneD, Array< OneD, NekDouble > > &InField, Array< OneD, Array< OneD, NekDouble > > &OutField)
Definition: MMFSWE.cpp:482
NekDouble m_en
Definition: MMFSWE.h:98
void RossbyWave(unsigned int field, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:2592
void ComputeNablaCdotVelocity(Array< OneD, NekDouble > &vellc)
Definition: MMFSWE.cpp:2232
virtual NekDouble v_L2Error(unsigned int field, const Array< OneD, NekDouble > &exactsoln, bool Normalised) override
Virtual function for the L_2 error computation between fields and a given exact solution.
Definition: MMFSWE.cpp:3039
NekDouble m_Energy0
Definition: MMFSWE.h:101
void EvaluateStandardCoriolis(Array< OneD, NekDouble > &outarray)
Definition: MMFSWE.cpp:1759
static std::string className
Name of class.
Definition: MMFSWE.h:77
void GetSWEFluxVector(const int i, const Array< OneD, const Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, NekDouble > > &flux)
Definition: MMFSWE.cpp:582
NekDouble m_theta0
Definition: MMFSWE.h:98
void PrimitiveToConservative()
Definition: MMFSWE.cpp:2929
virtual void v_EvaluateExactSolution(unsigned int field, Array< OneD, NekDouble > &outfield, const NekDouble time) override
Definition: MMFSWE.cpp:3228
void SetBoundaryConditions(Array< OneD, Array< OneD, NekDouble > > &inarray, NekDouble time)
Definition: MMFSWE.cpp:1377
void IsolatedMountainFlow(unsigned int field, const NekDouble time, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:2393
NekDouble m_hbar
Definition: MMFSWE.h:98
NekDouble m_K
Definition: MMFSWE.h:99
Array< OneD, NekDouble > m_coriolis
Coriolis force.
Definition: MMFSWE.h:90
void ComputeMagAndDot(const int index, NekDouble &MageF1, NekDouble &MageF2, NekDouble &MageB1, NekDouble &MageB2, NekDouble &eF1_cdot_eB1, NekDouble &eF1_cdot_eB2, NekDouble &eF2_cdot_eB1, NekDouble &eF2_cdot_eB2)
Definition: MMFSWE.cpp:1163
NekDouble m_Hvar
Definition: MMFSWE.h:95
void AddRotation(Array< OneD, Array< OneD, NekDouble > > &physarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Definition: MMFSWE.cpp:1275
TestType m_TestType
Definition: MMFSWE.h:79
void AverageFlux(const int index, NekDouble hL, NekDouble uL, NekDouble vL, NekDouble hR, NekDouble uR, NekDouble vR, Array< OneD, NekDouble > &numfluxF, Array< OneD, NekDouble > &numfluxB)
Definition: MMFSWE.cpp:960
NekDouble m_Vorticity0
Definition: MMFSWE.h:101
void AddElevationEffect(Array< OneD, Array< OneD, NekDouble > > &physarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Definition: MMFSWE.cpp:1246
void Checkpoint_Output_Cartesian(std::string outname)
Definition: MMFSWE.cpp:2767
void Computehhuhvflux(NekDouble hL, NekDouble uL, NekDouble vL, NekDouble hR, NekDouble uR, NekDouble vR, NekDouble hstar, NekDouble &hflux, NekDouble &huflux, NekDouble &hvflux)
Definition: MMFSWE.cpp:894
virtual NekDouble v_LinfError(unsigned int field, const Array< OneD, NekDouble > &exactsoln) override
Virtual function for the L_inf error computation between fields and a given exact solution.
Definition: MMFSWE.cpp:3137
void DoOdeRhs(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
Compute the RHS.
Definition: MMFSWE.cpp:426
void TestVorticityComputation()
Definition: MMFSWE.cpp:2946
void NumericalSWEFlux(Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, NekDouble > > &numfluxFwd, Array< OneD, Array< OneD, NekDouble > > &numfluxBwd)
Definition: MMFSWE.cpp:677
void DoOdeProjection(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
Compute the projection.
Definition: MMFSWE.cpp:1358
void RiemannSolverHLLC(const int index, NekDouble hL, NekDouble uL, NekDouble vL, NekDouble hR, NekDouble uR, NekDouble vR, Array< OneD, NekDouble > &numfluxF, Array< OneD, NekDouble > &numfluxB)
Definition: MMFSWE.cpp:848
NekDouble ComputeEnstrophy(const Array< OneD, const NekDouble > &eta, const Array< OneD, const NekDouble > &u, const Array< OneD, const NekDouble > &v)
Definition: MMFSWE.cpp:2180
virtual void v_GenerateSummary(SolverUtils::SummaryList &s) override
Print Summary.
Definition: MMFSWE.cpp:3275
NekDouble m_uthetamax
Definition: MMFSWE.h:98
NekDouble ComputeMass(const Array< OneD, const NekDouble > &eta)
Definition: MMFSWE.cpp:2141
void EvaluateWaterDepth(void)
Definition: MMFSWE.cpp:1557
void UnsteadyZonalFlow(unsigned int field, const NekDouble time, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:2292
Array< OneD, Array< OneD, NekDouble > > m_veldotMF
Definition: MMFSWE.h:110
void GetNormalVelocity(Array< OneD, NekDouble > &traceVn)
Get the normal velocity.
NekDouble ComputeEnergy(const Array< OneD, const NekDouble > &eta, const Array< OneD, const NekDouble > &u, const Array< OneD, const NekDouble > &v)
Definition: MMFSWE.cpp:2151
void LaxFriedrichFlux(const int index, NekDouble hL, NekDouble uL, NekDouble vL, NekDouble hR, NekDouble uR, NekDouble vR, Array< OneD, NekDouble > &numfluxF, Array< OneD, NekDouble > &numfluxB)
Definition: MMFSWE.cpp:1014
NekDouble ComputeUnstableJetEta(const NekDouble theta)
Definition: MMFSWE.cpp:2737
NekDouble m_Mass0
Definition: MMFSWE.h:101
void EvaluateCoriolis(void)
Definition: MMFSWE.cpp:1697
void EvaluateCoriolisForZonalFlow(Array< OneD, NekDouble > &outarray)
Definition: MMFSWE.cpp:1727
Array< OneD, NekDouble > m_traceVn
Definition: MMFSWE.h:108
virtual void v_DoInitialise(bool dumpInitialConditions=false) override
Sets up initial conditions.
Definition: MMFSWE.cpp:1540
NekDouble m_theta1
Definition: MMFSWE.h:98
int m_AddRotation
Definition: MMFSWE.h:92
Array< OneD, Array< OneD, NekDouble > > m_velocity
Advection velocity.
Definition: MMFSWE.h:107
int m_planeNumber
Definition: MMFSWE.h:115
virtual void v_DoSolve() override
Solves an unsteady problem.
Definition: MMFSWE.cpp:249
NekDouble m_angfreq
Definition: MMFSWE.h:99
void Compute_demdt_cdot_ek(const int indm, const int indk, const Array< OneD, const Array< OneD, NekDouble > > &physarray, Array< OneD, NekDouble > &outarray)
Definition: MMFSWE.cpp:1322
void WallBoundary2D(int bcRegion, int cnt, Array< OneD, Array< OneD, NekDouble > > &physarray)
Definition: MMFSWE.cpp:1427
void TestSWE2Dproblem(const NekDouble time, unsigned int field, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:1985
NekDouble m_Omega
Definition: MMFSWE.h:95
int m_RossbyDisturbance
Definition: MMFSWE.h:275
NekDouble m_H0
Definition: MMFSWE.h:95
int m_AddCoriolis
Definition: MMFSWE.h:92
Array< OneD, Array< OneD, NekDouble > > m_Derivdepth
Definition: MMFSWE.h:87
NekDouble m_u0
Definition: MMFSWE.h:95
void ConservativeToPrimitive()
Definition: MMFSWE.cpp:2912
NekDouble m_Enstrophy0
Definition: MMFSWE.h:101
void SteadyZonalFlow(unsigned int field, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:2050
void RusanovFlux(const int index, NekDouble hL, NekDouble uL, NekDouble vL, NekDouble hR, NekDouble uR, NekDouble vR, Array< OneD, NekDouble > &numfluxF, Array< OneD, NekDouble > &numfluxB)
Definition: MMFSWE.cpp:1089
Array< OneD, NekDouble > m_depth
Still water depth.
Definition: MMFSWE.h:86
NekDouble m_g
Definition: MMFSWE.h:94
NekDouble m_hs0
Definition: MMFSWE.h:97
General purpose memory allocation routines with the ability to allocate from thread specific memory p...
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
A base class for PDEs which include an advection component.
Definition: MMFSystem.h:146
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::vector< std::pair< std::string, std::string > > SummaryList
Definition: Misc.h:48
std::shared_ptr< EquationSystem > EquationSystemSharedPtr
A shared pointer to an EquationSystem object.
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
Definition: MeshGraph.h:176
The above copyright notice and this permission notice shall be included.
Definition: CoupledSolver.h:2
@ eTestUnstableJet
Definition: MMFSWE.h:50
@ eTestSteadyZonal
Definition: MMFSWE.h:47
@ eTestPlane
Definition: MMFDiffusion.h:48
@ eTestUnsteadyZonal
Definition: MMFSWE.h:48
@ SIZE_TestType
Length of enum list.
Definition: MMFDiffusion.h:55
@ eTestIsolatedMountain
Definition: MMFSWE.h:49
@ eTestRossbyWave
Definition: MMFSWE.h:51
const char *const TestTypeMap[]
Definition: MMFDiffusion.h:58
double NekDouble