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 
39 #include <SolverUtils/MMFSystem.h>
40 
41 namespace Nektar
42 {
43 
45 {
46  eTestPlane,
52  SIZE_TestType ///< Length of enum list
53 };
54 
55 const char *const TestTypeMap[] = {
56  "TestPlane", "TestSteadyZonal",
57  "TestUnsteadyZonal", "TestIsolatedMountain",
58  "TestUnstableJet", "TestRossbyWave",
59 };
60 
62 {
63 public:
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 
84 protected:
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
98  NekDouble m_uthetamax, m_theta0, m_theta1, m_en, m_hbar; // eTestUnstableJet
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
119  const SpatialDomains::MeshGraphSharedPtr& pGraph);
120 
121  /// Compute the RHS
122  void DoOdeRhs(const Array<OneD, const Array<OneD, NekDouble>> &inarray,
123  Array<OneD, Array<OneD, NekDouble>> &outarray,
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,
169  Array<OneD, Array<OneD, NekDouble>> &physout);
170 
172  const Array<OneD, const Array<OneD, NekDouble>> &physin,
173  Array<OneD, Array<OneD, NekDouble>> &physout);
174 
177 
178  void WeakDGSWEDirDeriv(const Array<OneD, Array<OneD, NekDouble>> &InField,
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 
222  void AddCoriolis(Array<OneD, Array<OneD, NekDouble>> &physarray,
223  Array<OneD, Array<OneD, NekDouble>> &outarray);
224 
226  Array<OneD, Array<OneD, NekDouble>> &outarray);
227 
228  void AddRotation(Array<OneD, Array<OneD, NekDouble>> &physarray,
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();
251 
252  virtual void v_DoSolve();
253 
254  virtual void v_DoInitialise();
255 
256  /// Print Summary
258 
259  virtual void v_SetInitialConditions(const NekDouble initialtime,
260  bool dumpInitialConditions,
261  const int domain);
262 
263  virtual void v_EvaluateExactSolution(unsigned int field,
264  Array<OneD, NekDouble> &outfield,
265  const NekDouble time);
266 
267  virtual NekDouble v_L2Error(unsigned int field,
268  const Array<OneD, NekDouble> &exactsoln,
269  bool Normalised);
270 
271  virtual NekDouble v_LinfError(unsigned int field,
272  const Array<OneD, NekDouble> &exactsoln);
273 
274 private:
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 }
284 
285 #endif
void ComputeVorticity(const Array< OneD, const NekDouble > &u, const Array< OneD, const NekDouble > &v, Array< OneD, NekDouble > &Vorticity)
Definition: MMFSWE.cpp:2209
void AddCoriolis(Array< OneD, Array< OneD, NekDouble >> &physarray, Array< OneD, Array< OneD, NekDouble >> &outarray)
Definition: MMFSWE.cpp:1199
void UnstableJetFlow(unsigned int field, const NekDouble time, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:2480
virtual void v_EvaluateExactSolution(unsigned int field, Array< OneD, NekDouble > &outfield, const NekDouble time)
Definition: MMFSWE.cpp:3227
int m_PurturbedJet
Definition: MMFSWE.h:276
NekDouble m_k2
Definition: MMFSWE.h:96
NekDouble ComputeUnstableJetuphi(const NekDouble theta)
Definition: MMFSWE.cpp:2748
MMFSWE(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
Session reader.
Definition: MMFSWE.cpp:52
Array< OneD, NekDouble > m_vellc
Definition: MMFSWE.h:111
NekDouble m_alpha
Definition: MMFSWE.h:95
bool m_primitive
Indicates if variables are primitive or conservative.
Definition: MMFSWE.h:104
void AddElevationEffect(Array< OneD, Array< OneD, NekDouble >> &physarray, Array< OneD, Array< OneD, NekDouble >> &outarray)
Definition: MMFSWE.cpp:1244
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
NekDouble m_en
Definition: MMFSWE.h:98
void RossbyWave(unsigned int field, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:2591
void ComputeNablaCdotVelocity(Array< OneD, NekDouble > &vellc)
Definition: MMFSWE.cpp:2230
NekDouble m_Energy0
Definition: MMFSWE.h:101
void GetSWEFluxVector(const int i, const Array< OneD, const Array< OneD, NekDouble >> &physfield, Array< OneD, Array< OneD, NekDouble >> &flux)
Definition: MMFSWE.cpp:580
void AddDivForGradient(Array< OneD, Array< OneD, NekDouble >> &physarray, Array< OneD, Array< OneD, NekDouble >> &outarray)
Definition: MMFSWE.cpp:550
void WeakDGSWEDirDeriv(const Array< OneD, Array< OneD, NekDouble >> &InField, Array< OneD, Array< OneD, NekDouble >> &OutField)
Definition: MMFSWE.cpp:480
void EvaluateStandardCoriolis(Array< OneD, NekDouble > &outarray)
Definition: MMFSWE.cpp:1757
static std::string className
Name of class.
Definition: MMFSWE.h:77
virtual void v_GenerateSummary(SolverUtils::SummaryList &s)
Print Summary.
Definition: MMFSWE.cpp:3274
NekDouble m_theta0
Definition: MMFSWE.h:98
void PrimitiveToConservative()
Definition: MMFSWE.cpp:2928
void IsolatedMountainFlow(unsigned int field, const NekDouble time, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:2391
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:1161
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:424
NekDouble m_Hvar
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:1320
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:958
NekDouble m_Vorticity0
Definition: MMFSWE.h:101
void Checkpoint_Output_Cartesian(std::string outname)
Definition: MMFSWE.cpp:2766
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:892
void TestVorticityComputation()
Definition: MMFSWE.cpp:2945
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:846
NekDouble ComputeEnstrophy(const Array< OneD, const NekDouble > &eta, const Array< OneD, const NekDouble > &u, const Array< OneD, const NekDouble > &v)
Definition: MMFSWE.cpp:2178
void NumericalSWEFlux(Array< OneD, Array< OneD, NekDouble >> &physfield, Array< OneD, Array< OneD, NekDouble >> &numfluxFwd, Array< OneD, Array< OneD, NekDouble >> &numfluxBwd)
Definition: MMFSWE.cpp:675
NekDouble m_uthetamax
Definition: MMFSWE.h:98
NekDouble ComputeMass(const Array< OneD, const NekDouble > &eta)
Definition: MMFSWE.cpp:2139
void EvaluateWaterDepth(void)
Definition: MMFSWE.cpp:1555
void UnsteadyZonalFlow(unsigned int field, const NekDouble time, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:2290
Array< OneD, Array< OneD, NekDouble > > m_veldotMF
Definition: MMFSWE.h:110
virtual NekDouble v_LinfError(unsigned int field, const Array< OneD, NekDouble > &exactsoln)
Virtual function for the L_inf error computation between fields and a given exact solution.
Definition: MMFSWE.cpp:3136
virtual void v_DoInitialise()
Sets up initial conditions.
Definition: MMFSWE.cpp:1538
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:2149
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:1012
NekDouble ComputeUnstableJetEta(const NekDouble theta)
Definition: MMFSWE.cpp:2736
virtual void v_DoSolve()
Solves an unsteady problem.
Definition: MMFSWE.cpp:249
NekDouble m_Mass0
Definition: MMFSWE.h:101
void EvaluateCoriolis(void)
Definition: MMFSWE.cpp:1695
void EvaluateCoriolisForZonalFlow(Array< OneD, NekDouble > &outarray)
Definition: MMFSWE.cpp:1725
virtual NekDouble v_L2Error(unsigned int field, const Array< OneD, NekDouble > &exactsoln, bool Normalised)
Virtual function for the L_2 error computation between fields and a given exact solution.
Definition: MMFSWE.cpp:3038
Array< OneD, NekDouble > m_traceVn
Definition: MMFSWE.h:108
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_SetInitialConditions(const NekDouble initialtime, bool dumpInitialConditions, const int domain)
Definition: MMFSWE.cpp:1784
void WallBoundary2D(int bcRegion, int cnt, Array< OneD, Array< OneD, NekDouble >> &physarray)
Definition: MMFSWE.cpp:1425
void SetBoundaryConditions(Array< OneD, Array< OneD, NekDouble >> &inarray, NekDouble time)
Definition: MMFSWE.cpp:1375
NekDouble m_angfreq
Definition: MMFSWE.h:99
void TestSWE2Dproblem(const NekDouble time, unsigned int field, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:1983
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
void AddRotation(Array< OneD, Array< OneD, NekDouble >> &physarray, Array< OneD, Array< OneD, NekDouble >> &outarray)
Definition: MMFSWE.cpp:1273
Array< OneD, Array< OneD, NekDouble > > m_Derivdepth
Definition: MMFSWE.h:87
NekDouble m_u0
Definition: MMFSWE.h:95
void ConservativeToPrimitive()
Definition: MMFSWE.cpp:2911
NekDouble m_Enstrophy0
Definition: MMFSWE.h:101
void SteadyZonalFlow(unsigned int field, Array< OneD, NekDouble > &outfield)
Definition: MMFSWE.cpp:2048
virtual void v_InitObject()
Initialise the object.
Definition: MMFSWE.cpp:62
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:1087
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
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:1356
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:141
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
The above copyright notice and this permission notice shall be included.
Definition: CoupledSolver.h:1
@ 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