Nektar++
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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
39
40namespace Nektar
41{
42
44{
51 SIZE_TestType ///< Length of enum list
52};
53
54const char *const TestTypeMap[] = {
55 "TestPlane", "TestSteadyZonal",
56 "TestUnsteadyZonal", "TestIsolatedMountain",
57 "TestUnstableJet", "TestRossbyWave",
58};
59
61{
62public:
63 friend class MemoryManager<MMFSWE>;
64
65 /// Creates an instance of this class
69 {
72 p->InitObject();
73 return p;
74 }
75 /// Name of class
76 static std::string className;
77
78protected:
80
81 /// Still water depth
84
85 /// Coriolis force
87
89
90 NekDouble m_g; // Gravity
91 NekDouble m_alpha, m_u0, m_Omega, m_H0, m_Hvar; // TestSteadyZonal
92 NekDouble m_k2; // eTestUnsteadyZonal
93 NekDouble m_hs0; // eTestIsolatedMountain
95 NekDouble m_angfreq, m_K; // eTestRossbyWave
96
98
99 /// Indicates if variables are primitive or conservative
101
102 /// Advection velocity
106
107 // Plane (used only for Discontinous projection
108 // with 3DHomogenoeus1D expansion)
110
113
114 ~MMFSWE() override = default;
115
116 /// Compute the RHS
117 void DoOdeRhs(const Array<OneD, const Array<OneD, NekDouble>> &inarray,
119 const NekDouble time);
120
121 /// Compute the projection
122 void DoOdeProjection(
123 const Array<OneD, const Array<OneD, NekDouble>> &inarray,
124 Array<OneD, Array<OneD, NekDouble>> &outarray, const NekDouble time);
125
126 void SteadyZonalFlow(unsigned int field, Array<OneD, NekDouble> &outfield);
127
128 void UnsteadyZonalFlow(unsigned int field, const NekDouble time,
129 Array<OneD, NekDouble> &outfield);
130
131 void IsolatedMountainFlow(unsigned int field, const NekDouble time,
132 Array<OneD, NekDouble> &outfield);
133
134 void UnstableJetFlow(unsigned int field, const NekDouble time,
135 Array<OneD, NekDouble> &outfield);
136
137 void RossbyWave(unsigned int field, Array<OneD, NekDouble> &outfield);
138
140
142
144
148
152
155 Array<OneD, NekDouble> &Vorticity);
156
158
160 const Array<OneD, const Array<OneD, NekDouble>> &physin,
162
164 const Array<OneD, const Array<OneD, NekDouble>> &physin,
166
169
171 Array<OneD, Array<OneD, NekDouble>> &OutField);
172
174 Array<OneD, Array<OneD, NekDouble>> &outarray);
175
177 Array<OneD, Array<OneD, NekDouble>> &numfluxFwd,
178 Array<OneD, Array<OneD, NekDouble>> &numfluxBwd);
179
180 void GetSWEFluxVector(
181 const int i, const Array<OneD, const Array<OneD, NekDouble>> &physfield,
183
184 void RiemannSolverHLLC(const int index, NekDouble hL, NekDouble uL,
185 NekDouble vL, NekDouble hR, NekDouble uR,
186 NekDouble vR, Array<OneD, NekDouble> &numfluxF,
187 Array<OneD, NekDouble> &numfluxB);
188
190 NekDouble hR, NekDouble uR, NekDouble vR,
191 NekDouble hstar, NekDouble &hflux, NekDouble &huflux,
192 NekDouble &hvflux);
193
194 void AverageFlux(const int index, NekDouble hL, NekDouble uL, NekDouble vL,
195 NekDouble hR, NekDouble uR, NekDouble vR,
196 Array<OneD, NekDouble> &numfluxF,
197 Array<OneD, NekDouble> &numfluxB);
198
199 void LaxFriedrichFlux(const int index, NekDouble hL, NekDouble uL,
200 NekDouble vL, NekDouble hR, NekDouble uR,
201 NekDouble vR, Array<OneD, NekDouble> &numfluxF,
202 Array<OneD, NekDouble> &numfluxB);
203
204 void RusanovFlux(const int index, NekDouble hL, NekDouble uL, NekDouble vL,
205 NekDouble hR, NekDouble uR, NekDouble vR,
206 Array<OneD, NekDouble> &numfluxF,
207 Array<OneD, NekDouble> &numfluxB);
208
209 void ComputeMagAndDot(const int index, NekDouble &MageF1, NekDouble &MageF2,
210 NekDouble &MageB1, NekDouble &MageB2,
211 NekDouble &eF1_cdot_eB1, NekDouble &eF1_cdot_eB2,
212 NekDouble &eF2_cdot_eB1, NekDouble &eF2_cdot_eB2);
213
215 Array<OneD, Array<OneD, NekDouble>> &outarray);
216
218 Array<OneD, Array<OneD, NekDouble>> &outarray);
219
221 Array<OneD, Array<OneD, NekDouble>> &outarray);
222
224 const int indm, const int indk,
225 const Array<OneD, const Array<OneD, NekDouble>> &physarray,
226 Array<OneD, NekDouble> &outarray);
227
229
230 void EvaluateWaterDepth(void);
231
232 void EvaluateCoriolis(void);
235
237 NekDouble time);
238 void WallBoundary2D(int bcRegion, int cnt,
239 Array<OneD, Array<OneD, NekDouble>> &physarray);
240
241 /// Initialise the object
242 void v_InitObject(bool DeclareFields = true) override;
243
244 void v_DoSolve() override;
245
246 void v_DoInitialise(bool dumpInitialConditions = false) override;
247
248 /// Print Summary
250
251 void v_SetInitialConditions(const NekDouble initialtime = 0.0,
252 bool dumpInitialConditions = true,
253 const int domain = 0) override;
254
255 void v_EvaluateExactSolution(unsigned int field,
256 Array<OneD, NekDouble> &outfield,
257 const NekDouble time) override;
258
259 NekDouble v_L2Error(unsigned int field,
260 const Array<OneD, NekDouble> &exactsoln,
261 bool Normalised) override;
262
263 NekDouble v_LinfError(unsigned int field,
264 const Array<OneD, NekDouble> &exactsoln) override;
265
266private:
269
270 void TestSWE2Dproblem(const NekDouble time, unsigned int field,
271 Array<OneD, NekDouble> &outfield);
272
273 void Checkpoint_Output_Cartesian(std::string outname);
274};
275
276} // namespace Nektar
277
278#endif
void ComputeVorticity(const Array< OneD, const NekDouble > &u, const Array< OneD, const NekDouble > &v, Array< OneD, NekDouble > &Vorticity)
Definition: MMFSWE.cpp:2214
void AddDivForGradient(Array< OneD, Array< OneD, NekDouble > > &physarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Definition: MMFSWE.cpp:543
void AddCoriolis(Array< OneD, Array< OneD, NekDouble > > &physarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Definition: MMFSWE.cpp:1207
void UnstableJetFlow(unsigned int field, const NekDouble time, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:2484
void v_InitObject(bool DeclareFields=true) override
Initialise the object.
Definition: MMFSWE.cpp:62
int m_PurturbedJet
Definition: MMFSWE.h:268
NekDouble m_k2
Definition: MMFSWE.h:92
NekDouble ComputeUnstableJetuphi(const NekDouble theta)
Definition: MMFSWE.cpp:2750
MMFSWE(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
Definition: MMFSWE.cpp:52
Array< OneD, NekDouble > m_vellc
Definition: MMFSWE.h:105
void v_SetInitialConditions(const NekDouble initialtime=0.0, bool dumpInitialConditions=true, const int domain=0) override
Definition: MMFSWE.cpp:1792
NekDouble m_alpha
Definition: MMFSWE.h:91
bool m_primitive
Indicates if variables are primitive or conservative.
Definition: MMFSWE.h:100
static SolverUtils::EquationSystemSharedPtr create(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
Creates an instance of this class.
Definition: MMFSWE.h:66
void WeakDGSWEDirDeriv(const Array< OneD, Array< OneD, NekDouble > > &InField, Array< OneD, Array< OneD, NekDouble > > &OutField)
Definition: MMFSWE.cpp:473
NekDouble m_en
Definition: MMFSWE.h:94
void RossbyWave(unsigned int field, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:2593
void ComputeNablaCdotVelocity(Array< OneD, NekDouble > &vellc)
Definition: MMFSWE.cpp:2235
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:3033
NekDouble m_Energy0
Definition: MMFSWE.h:97
void EvaluateStandardCoriolis(Array< OneD, NekDouble > &outarray)
Definition: MMFSWE.cpp:1765
static std::string className
Name of class.
Definition: MMFSWE.h:76
void GetSWEFluxVector(const int i, const Array< OneD, const Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, NekDouble > > &flux)
Definition: MMFSWE.cpp:573
NekDouble m_theta0
Definition: MMFSWE.h:94
void PrimitiveToConservative()
Definition: MMFSWE.cpp:2930
void v_EvaluateExactSolution(unsigned int field, Array< OneD, NekDouble > &outfield, const NekDouble time) override
Definition: MMFSWE.cpp:3219
void SetBoundaryConditions(Array< OneD, Array< OneD, NekDouble > > &inarray, NekDouble time)
Definition: MMFSWE.cpp:1383
void IsolatedMountainFlow(unsigned int field, const NekDouble time, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:2396
NekDouble m_hbar
Definition: MMFSWE.h:94
NekDouble m_K
Definition: MMFSWE.h:95
Array< OneD, NekDouble > m_coriolis
Coriolis force.
Definition: MMFSWE.h:86
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:1169
NekDouble m_Hvar
Definition: MMFSWE.h:91
void AddRotation(Array< OneD, Array< OneD, NekDouble > > &physarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Definition: MMFSWE.cpp:1281
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:962
NekDouble m_Vorticity0
Definition: MMFSWE.h:97
void AddElevationEffect(Array< OneD, Array< OneD, NekDouble > > &physarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Definition: MMFSWE.cpp:1252
void Checkpoint_Output_Cartesian(std::string outname)
Definition: MMFSWE.cpp:2768
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:884
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:3129
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:419
void TestVorticityComputation()
Definition: MMFSWE.cpp:2947
void NumericalSWEFlux(Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, NekDouble > > &numfluxFwd, Array< OneD, Array< OneD, NekDouble > > &numfluxBwd)
Definition: MMFSWE.cpp:668
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:1364
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:839
NekDouble ComputeEnstrophy(const Array< OneD, const NekDouble > &eta, const Array< OneD, const NekDouble > &u, const Array< OneD, const NekDouble > &v)
Definition: MMFSWE.cpp:2183
void v_GenerateSummary(SolverUtils::SummaryList &s) override
Print Summary.
Definition: MMFSWE.cpp:3266
NekDouble m_uthetamax
Definition: MMFSWE.h:94
NekDouble ComputeMass(const Array< OneD, const NekDouble > &eta)
Definition: MMFSWE.cpp:2144
void EvaluateWaterDepth(void)
Definition: MMFSWE.cpp:1563
void UnsteadyZonalFlow(unsigned int field, const NekDouble time, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:2295
Array< OneD, Array< OneD, NekDouble > > m_veldotMF
Definition: MMFSWE.h:104
NekDouble ComputeEnergy(const Array< OneD, const NekDouble > &eta, const Array< OneD, const NekDouble > &u, const Array< OneD, const NekDouble > &v)
Definition: MMFSWE.cpp:2154
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:1016
NekDouble ComputeUnstableJetEta(const NekDouble theta)
Definition: MMFSWE.cpp:2738
NekDouble m_Mass0
Definition: MMFSWE.h:97
void EvaluateCoriolis(void)
Definition: MMFSWE.cpp:1703
void EvaluateCoriolisForZonalFlow(Array< OneD, NekDouble > &outarray)
Definition: MMFSWE.cpp:1733
void v_DoInitialise(bool dumpInitialConditions=false) override
Sets up initial conditions.
Definition: MMFSWE.cpp:1546
NekDouble m_theta1
Definition: MMFSWE.h:94
~MMFSWE() override=default
int m_AddRotation
Definition: MMFSWE.h:88
Array< OneD, Array< OneD, NekDouble > > m_velocity
Advection velocity.
Definition: MMFSWE.h:103
int m_planeNumber
Definition: MMFSWE.h:109
void v_DoSolve() override
Solves an unsteady problem.
Definition: MMFSWE.cpp:242
NekDouble m_angfreq
Definition: MMFSWE.h:95
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:1328
void WallBoundary2D(int bcRegion, int cnt, Array< OneD, Array< OneD, NekDouble > > &physarray)
Definition: MMFSWE.cpp:1433
void TestSWE2Dproblem(const NekDouble time, unsigned int field, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:1989
NekDouble m_Omega
Definition: MMFSWE.h:91
int m_RossbyDisturbance
Definition: MMFSWE.h:267
NekDouble m_H0
Definition: MMFSWE.h:91
int m_AddCoriolis
Definition: MMFSWE.h:88
Array< OneD, Array< OneD, NekDouble > > m_Derivdepth
Definition: MMFSWE.h:83
NekDouble m_u0
Definition: MMFSWE.h:91
void ConservativeToPrimitive()
Definition: MMFSWE.cpp:2913
NekDouble m_Enstrophy0
Definition: MMFSWE.h:97
void SteadyZonalFlow(unsigned int field, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:2053
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:1091
Array< OneD, NekDouble > m_depth
Still water depth.
Definition: MMFSWE.h:82
NekDouble m_g
Definition: MMFSWE.h:90
NekDouble m_hs0
Definition: MMFSWE.h:93
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:144
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::vector< std::pair< std::string, std::string > > SummaryList
Definition: Misc.h:46
std::shared_ptr< EquationSystem > EquationSystemSharedPtr
A shared pointer to an EquationSystem object.
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
Definition: MeshGraph.h:174
@ eTestUnstableJet
Definition: MMFSWE.h:49
@ eTestSteadyZonal
Definition: MMFSWE.h:46
@ eTestPlane
Definition: MMFDiffusion.h:48
@ eTestUnsteadyZonal
Definition: MMFSWE.h:47
@ SIZE_TestType
Length of enum list.
Definition: MMFDiffusion.h:55
@ eTestIsolatedMountain
Definition: MMFSWE.h:48
@ eTestRossbyWave
Definition: MMFSWE.h:50
const char *const TestTypeMap[]
Definition: MMFDiffusion.h:58
double NekDouble