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 ~MMFSWE() override;
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
110
111 // Plane (used only for Discontinous projection
112 // with 3DHomogenoeus1D expansion)
114
115 /// Session reader
118
119 /// Compute the RHS
120 void DoOdeRhs(const Array<OneD, const Array<OneD, NekDouble>> &inarray,
122 const NekDouble time);
123
124 /// Compute the projection
125 void DoOdeProjection(
126 const Array<OneD, const Array<OneD, NekDouble>> &inarray,
127 Array<OneD, Array<OneD, NekDouble>> &outarray, const NekDouble time);
128
129 void SteadyZonalFlow(unsigned int field, Array<OneD, NekDouble> &outfield);
130
131 void UnsteadyZonalFlow(unsigned int field, const NekDouble time,
132 Array<OneD, NekDouble> &outfield);
133
134 void IsolatedMountainFlow(unsigned int field, const NekDouble time,
135 Array<OneD, NekDouble> &outfield);
136
137 void UnstableJetFlow(unsigned int field, const NekDouble time,
138 Array<OneD, NekDouble> &outfield);
139
140 void RossbyWave(unsigned int field, Array<OneD, NekDouble> &outfield);
141
143
145
147
151
155
158 Array<OneD, NekDouble> &Vorticity);
159
161
163 const Array<OneD, const Array<OneD, NekDouble>> &physin,
165
167 const Array<OneD, const Array<OneD, NekDouble>> &physin,
169
172
174 Array<OneD, Array<OneD, NekDouble>> &OutField);
175
177 Array<OneD, Array<OneD, NekDouble>> &outarray);
178
180 Array<OneD, Array<OneD, NekDouble>> &numfluxFwd,
181 Array<OneD, Array<OneD, NekDouble>> &numfluxBwd);
182
183 void GetSWEFluxVector(
184 const int i, const Array<OneD, const Array<OneD, NekDouble>> &physfield,
186
187 void RiemannSolverHLLC(const int index, NekDouble hL, NekDouble uL,
188 NekDouble vL, NekDouble hR, NekDouble uR,
189 NekDouble vR, Array<OneD, NekDouble> &numfluxF,
190 Array<OneD, NekDouble> &numfluxB);
191
193 NekDouble hR, NekDouble uR, NekDouble vR,
194 NekDouble hstar, NekDouble &hflux, NekDouble &huflux,
195 NekDouble &hvflux);
196
197 void AverageFlux(const int index, NekDouble hL, NekDouble uL, NekDouble vL,
198 NekDouble hR, NekDouble uR, NekDouble vR,
199 Array<OneD, NekDouble> &numfluxF,
200 Array<OneD, NekDouble> &numfluxB);
201
202 void LaxFriedrichFlux(const int index, NekDouble hL, NekDouble uL,
203 NekDouble vL, NekDouble hR, NekDouble uR,
204 NekDouble vR, Array<OneD, NekDouble> &numfluxF,
205 Array<OneD, NekDouble> &numfluxB);
206
207 void RusanovFlux(const int index, NekDouble hL, NekDouble uL, NekDouble vL,
208 NekDouble hR, NekDouble uR, NekDouble vR,
209 Array<OneD, NekDouble> &numfluxF,
210 Array<OneD, NekDouble> &numfluxB);
211
212 void ComputeMagAndDot(const int index, NekDouble &MageF1, NekDouble &MageF2,
213 NekDouble &MageB1, NekDouble &MageB2,
214 NekDouble &eF1_cdot_eB1, NekDouble &eF1_cdot_eB2,
215 NekDouble &eF2_cdot_eB1, NekDouble &eF2_cdot_eB2);
216
218 Array<OneD, Array<OneD, NekDouble>> &outarray);
219
221 Array<OneD, Array<OneD, NekDouble>> &outarray);
222
224 Array<OneD, Array<OneD, NekDouble>> &outarray);
225
227 const int indm, const int indk,
228 const Array<OneD, const Array<OneD, NekDouble>> &physarray,
229 Array<OneD, NekDouble> &outarray);
230
232
233 void EvaluateWaterDepth(void);
234
235 void EvaluateCoriolis(void);
238
240 NekDouble time);
241 void WallBoundary2D(int bcRegion, int cnt,
242 Array<OneD, Array<OneD, NekDouble>> &physarray);
243
244 /// Initialise the object
245 void v_InitObject(bool DeclareFields = true) override;
246
247 void v_DoSolve() override;
248
249 void v_DoInitialise(bool dumpInitialConditions = false) override;
250
251 /// Print Summary
253
254 void v_SetInitialConditions(const NekDouble initialtime = 0.0,
255 bool dumpInitialConditions = true,
256 const int domain = 0) override;
257
258 void v_EvaluateExactSolution(unsigned int field,
259 Array<OneD, NekDouble> &outfield,
260 const NekDouble time) override;
261
262 NekDouble v_L2Error(unsigned int field,
263 const Array<OneD, NekDouble> &exactsoln,
264 bool Normalised) override;
265
266 NekDouble v_LinfError(unsigned int field,
267 const Array<OneD, NekDouble> &exactsoln) override;
268
269private:
272
273 void TestSWE2Dproblem(const NekDouble time, unsigned int field,
274 Array<OneD, NekDouble> &outfield);
275
276 void Checkpoint_Output_Cartesian(std::string outname);
277};
278} // namespace Nektar
279
280#endif
void ComputeVorticity(const Array< OneD, const NekDouble > &u, const Array< OneD, const NekDouble > &v, Array< OneD, NekDouble > &Vorticity)
Definition: MMFSWE.cpp:2220
void AddDivForGradient(Array< OneD, Array< OneD, NekDouble > > &physarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Definition: MMFSWE.cpp:549
void AddCoriolis(Array< OneD, Array< OneD, NekDouble > > &physarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Definition: MMFSWE.cpp:1213
void UnstableJetFlow(unsigned int field, const NekDouble time, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:2490
void v_InitObject(bool DeclareFields=true) override
Initialise the object.
Definition: MMFSWE.cpp:61
int m_PurturbedJet
Definition: MMFSWE.h:271
NekDouble m_k2
Definition: MMFSWE.h:96
NekDouble ComputeUnstableJetuphi(const NekDouble theta)
Definition: MMFSWE.cpp:2756
MMFSWE(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
Session reader.
Definition: MMFSWE.cpp:51
Array< OneD, NekDouble > m_vellc
Definition: MMFSWE.h:109
void v_SetInitialConditions(const NekDouble initialtime=0.0, bool dumpInitialConditions=true, const int domain=0) override
Definition: MMFSWE.cpp:1798
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
void WeakDGSWEDirDeriv(const Array< OneD, Array< OneD, NekDouble > > &InField, Array< OneD, Array< OneD, NekDouble > > &OutField)
Definition: MMFSWE.cpp:479
NekDouble m_en
Definition: MMFSWE.h:98
void RossbyWave(unsigned int field, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:2599
void ComputeNablaCdotVelocity(Array< OneD, NekDouble > &vellc)
Definition: MMFSWE.cpp:2241
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:1771
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:579
NekDouble m_theta0
Definition: MMFSWE.h:98
void PrimitiveToConservative()
Definition: MMFSWE.cpp:2936
void v_EvaluateExactSolution(unsigned int field, Array< OneD, NekDouble > &outfield, const NekDouble time) override
Definition: MMFSWE.cpp:3225
void SetBoundaryConditions(Array< OneD, Array< OneD, NekDouble > > &inarray, NekDouble time)
Definition: MMFSWE.cpp:1389
void IsolatedMountainFlow(unsigned int field, const NekDouble time, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:2402
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:1175
NekDouble m_Hvar
Definition: MMFSWE.h:95
void AddRotation(Array< OneD, Array< OneD, NekDouble > > &physarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Definition: MMFSWE.cpp:1287
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:968
NekDouble m_Vorticity0
Definition: MMFSWE.h:101
void AddElevationEffect(Array< OneD, Array< OneD, NekDouble > > &physarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Definition: MMFSWE.cpp:1258
void Checkpoint_Output_Cartesian(std::string outname)
Definition: MMFSWE.cpp:2774
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:890
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:3135
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:425
void TestVorticityComputation()
Definition: MMFSWE.cpp:2953
void NumericalSWEFlux(Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, NekDouble > > &numfluxFwd, Array< OneD, Array< OneD, NekDouble > > &numfluxBwd)
Definition: MMFSWE.cpp:674
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:1370
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:845
NekDouble ComputeEnstrophy(const Array< OneD, const NekDouble > &eta, const Array< OneD, const NekDouble > &u, const Array< OneD, const NekDouble > &v)
Definition: MMFSWE.cpp:2189
void v_GenerateSummary(SolverUtils::SummaryList &s) override
Print Summary.
Definition: MMFSWE.cpp:3272
~MMFSWE() override
Destructor.
Definition: MMFSWE.cpp:244
NekDouble m_uthetamax
Definition: MMFSWE.h:98
NekDouble ComputeMass(const Array< OneD, const NekDouble > &eta)
Definition: MMFSWE.cpp:2150
void EvaluateWaterDepth(void)
Definition: MMFSWE.cpp:1569
void UnsteadyZonalFlow(unsigned int field, const NekDouble time, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:2301
Array< OneD, Array< OneD, NekDouble > > m_veldotMF
Definition: MMFSWE.h:108
NekDouble ComputeEnergy(const Array< OneD, const NekDouble > &eta, const Array< OneD, const NekDouble > &u, const Array< OneD, const NekDouble > &v)
Definition: MMFSWE.cpp:2160
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:1022
NekDouble ComputeUnstableJetEta(const NekDouble theta)
Definition: MMFSWE.cpp:2744
NekDouble m_Mass0
Definition: MMFSWE.h:101
void EvaluateCoriolis(void)
Definition: MMFSWE.cpp:1709
void EvaluateCoriolisForZonalFlow(Array< OneD, NekDouble > &outarray)
Definition: MMFSWE.cpp:1739
void v_DoInitialise(bool dumpInitialConditions=false) override
Sets up initial conditions.
Definition: MMFSWE.cpp:1552
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:113
void v_DoSolve() override
Solves an unsteady problem.
Definition: MMFSWE.cpp:248
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:1334
void WallBoundary2D(int bcRegion, int cnt, Array< OneD, Array< OneD, NekDouble > > &physarray)
Definition: MMFSWE.cpp:1439
void TestSWE2Dproblem(const NekDouble time, unsigned int field, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:1995
NekDouble m_Omega
Definition: MMFSWE.h:95
int m_RossbyDisturbance
Definition: MMFSWE.h:270
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:2919
NekDouble m_Enstrophy0
Definition: MMFSWE.h:101
void SteadyZonalFlow(unsigned int field, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:2059
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:1097
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: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: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