Nektar++
Extrapolate.h
Go to the documentation of this file.
1///////////////////////////////////////////////////////////////////////////////
2//
3// File: Extrapolate.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: Abstract base class for Extrapolate.
32//
33///////////////////////////////////////////////////////////////////////////////
34
35#ifndef NEKTAR_SOLVERS_EXTRAPOLATE_H
36#define NEKTAR_SOLVERS_EXTRAPOLATE_H
37
46
47namespace Nektar
48{
49
51{
53 eHBCNeumann, // Standard High Order BC
54 eOBC, // High Order outflow BC (Neumann-Dirichlet) from Dong et al JCP 2014
55 eConvectiveOBC // Convective High Order (Robin type) BC from Dong JCP 2015
56};
57
58// Forward declaration
59class Extrapolate;
60typedef std::shared_ptr<Extrapolate> ExtrapolateSharedPtr;
67
68struct HighOrderOutflow;
69typedef std::shared_ptr<HighOrderOutflow> HighOrderOutflowSharedPtr;
70
72
74{
75public:
79 const Array<OneD, int> pVel,
80 const SolverUtils::AdvectionSharedPtr advObject);
81
82 virtual ~Extrapolate();
83
86
87 void UpdateRobinPrimCoeff(void);
88
90 const LibUtilities::TimeIntegrationSchemeSharedPtr &IntegrationScheme);
91
92 inline void SubStepSaveFields(const int nstep);
93
94 inline void SubStepSetPressureBCs(
95 const Array<OneD, const Array<OneD, NekDouble>> &inarray,
96 const NekDouble Aii_DT, NekDouble kinvis);
97
98 inline void SubStepAdvance(const int nstep, NekDouble time);
99
100 inline void MountHOPBCs(int HBCdata, NekDouble kinvis,
103
104 inline void EvaluatePressureBCs(
105 const Array<OneD, const Array<OneD, NekDouble>> &fields,
106 const Array<OneD, const Array<OneD, NekDouble>> &N, NekDouble kinvis);
107
108 inline void SetForcing(
109 const std::vector<SolverUtils::ForcingSharedPtr> &forcing);
110
111 void AddDuDt(void);
112
113 void AddVelBC(void);
114
116 void CopyPressureHBCsToPbndExp(void);
117
119 const Array<OneD, Array<OneD, NekDouble>> inarray);
120
122
124 const Array<OneD, const Array<OneD, NekDouble>> &Vel,
125 Array<OneD, NekDouble> &IprodVn);
126
128
129 std::string GetSubStepName(void);
130
132
134
136 Array<OneD, NekDouble> &newarray,
137 Array<OneD, NekDouble> &outarray);
138
139 void AddNormVelOnOBC(const int nbcoeffs, const int nreg,
141
143
144protected:
146 const Array<OneD, const Array<OneD, NekDouble>> &inarray,
147 const Array<OneD, const Array<OneD, NekDouble>> &N,
148 NekDouble kinvis) = 0;
149
152 &IntegrationScheme) = 0;
153
154 virtual void v_SubStepSaveFields(int nstep) = 0;
155
157 const Array<OneD, const Array<OneD, NekDouble>> &inarray,
158 NekDouble Aii_DT, NekDouble kinvis) = 0;
159
160 virtual void v_SubStepAdvance(int nstep, NekDouble time) = 0;
161
162 virtual void v_MountHOPBCs(int HBCdata, NekDouble kinvis,
165
166 virtual std::string v_GetSubStepName(void);
167
168 virtual void v_AccelerationBDF(Array<OneD, Array<OneD, NekDouble>> &array);
169
171 const Array<OneD, const Array<OneD, NekDouble>> &fields,
172 const Array<OneD, const Array<OneD, NekDouble>> &N, NekDouble kinvis)
173 {
174 v_CalcNeumannPressureBCs(fields, N, kinvis);
175 }
176
177 virtual void v_CalcNeumannPressureBCs(
178 const Array<OneD, const Array<OneD, NekDouble>> &fields,
179 const Array<OneD, const Array<OneD, NekDouble>> &N, NekDouble kinvis);
180
182
183 virtual void v_AddNormVelOnOBC(const int nbcoeffs, const int nreg,
185
186 void CalcOutflowBCs(const Array<OneD, const Array<OneD, NekDouble>> &fields,
187 NekDouble kinvis);
188
190
192
194
195 /// Array of type of high order BCs for splitting shemes
197
198 /// Velocity fields
200
201 /// Pointer to field holding pressure field
203
204 /// int which identifies which components of m_fields contains the
205 /// velocity (u,v,w);
207
209
210 std::vector<SolverUtils::ForcingSharedPtr> m_forcing;
211
213
214 /// Curl-curl dimensionality
216
217 /// bounday dimensionality
219
220 /// pressure boundary conditions container
222
223 /// pressure boundary conditions expansion container
225
226 /// number of times the high-order pressure BCs have been called
228
229 // Number of degrees of freedom (coefficients) for HOPbc
231
232 // Number of HOPbcs
234
235 /// Maximum points used in pressure BC evaluation
237
239
240 /// Storage for current and previous levels of high order pressure boundary
241 /// conditions.
243
244 /// Storage for current and previous levels of the inner product of normal
245 /// velocity
247
249
250 // Velocity correction scheme coefficient required for extrapolation.
254
255 // data related to high order outflow.
257
258private:
259 static std::string def;
260};
261
263{
264 HighOrderOutflow(const int numHOpts, const int outHBCnumber,
265 const int curldim,
267 : m_numOutHBCPts(numHOpts), m_outHBCnumber(outHBCnumber)
268 {
271 outHBCnumber);
272
275 outHBCnumber);
276
277 m_UBndExp =
279
280 pSession->LoadParameter("OutflowBC_theta", m_obcTheta, 1.0);
281 pSession->LoadParameter("OutflowBC_alpha1", m_obcAlpha1, 0.0);
282 pSession->LoadParameter("OutflowBC_alpha2", m_obcAlpha2, 0.0);
283
284 pSession->LoadParameter("U0_HighOrderBC", m_U0, 1.0);
285 pSession->LoadParameter("Delta_HighOrderBC", m_delta, 1 / 20.0);
286 }
287
288 virtual ~HighOrderOutflow(){};
289
290 /// Number of quadrature points for Outflow HOBC
292
293 /// Number of Outflow HOBCs
295
296 /// Parameters for outflow boundary condition
302 std::string m_defVelPrimCoeff[3];
303
304 /// Storage for current and previous velocity fields along the outflow
306
307 /// Storage for current and previous velocities along the outflow boundary
310
311 /// Velocity boundary condition expansions on high order boundaries.
313
314 /// primitive coefficient for pressure when using convetive like OBCs
316
317 /// primitive coefficient for velocities when using convetive like OBCs
319};
320
321/**
322 * Evaluate Pressure Boundary Conditions for Standard Extrapolation
323 */
325 const Array<OneD, const Array<OneD, NekDouble>> &inarray,
326 const Array<OneD, const Array<OneD, NekDouble>> &N, NekDouble kinvis)
327{
328 v_EvaluatePressureBCs(inarray, N, kinvis);
329}
330
331/**
332 *
333 */
335 const LibUtilities::TimeIntegrationSchemeSharedPtr &IntegrationScheme)
336{
337 v_SubSteppingTimeIntegration(IntegrationScheme);
338}
339
340/**
341 *
342 */
343inline void Extrapolate::SubStepSaveFields(int nstep)
344{
345 v_SubStepSaveFields(nstep);
346}
347
348/**
349 *
350 */
352 const std::vector<SolverUtils::ForcingSharedPtr> &forcing)
353{
354 m_forcing = forcing;
355}
356
357/**
358 *
359 */
361 const Array<OneD, const Array<OneD, NekDouble>> &inarray, NekDouble Aii_DT,
362 NekDouble kinvis)
363{
364 v_SubStepSetPressureBCs(inarray, Aii_DT, kinvis);
365}
366
367/**
368 *
369 */
370inline void Extrapolate::SubStepAdvance(int nstep, NekDouble time)
371{
372 v_SubStepAdvance(nstep, time);
373}
374
375/**
376 *
377 */
378inline void Extrapolate::MountHOPBCs(int HBCdata, NekDouble kinvis,
381{
382 v_MountHOPBCs(HBCdata, kinvis, Q, Advection);
383}
384
385/**
386 *
387 */
388inline std::string Extrapolate::GetSubStepName(void)
389{
390 return v_GetSubStepName();
391}
392
393/**
394 *
395 */
398{
400}
401
402/**
403 *
404 */
405inline void Extrapolate::AddNormVelOnOBC(const int nbcoeffs, const int nreg,
407{
408 v_AddNormVelOnOBC(nbcoeffs, nreg, u);
409}
410} // namespace Nektar
411
412#endif
std::string GetSubStepName(void)
Definition: Extrapolate.h:388
Array< OneD, Array< OneD, NekDouble > > m_pressureHBCs
Storage for current and previous levels of high order pressure boundary conditions.
Definition: Extrapolate.h:242
virtual void v_AddNormVelOnOBC(const int nbcoeffs, const int nreg, Array< OneD, Array< OneD, NekDouble > > &u)
int m_bnd_dim
bounday dimensionality
Definition: Extrapolate.h:218
Array< OneD, Array< OneD, NekDouble > > m_previousVelFields
Definition: Extrapolate.h:212
void SubStepAdvance(const int nstep, NekDouble time)
Definition: Extrapolate.h:370
Extrapolate(const LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields, MultiRegions::ExpListSharedPtr pPressure, const Array< OneD, int > pVel, const SolverUtils::AdvectionSharedPtr advObject)
Definition: Extrapolate.cpp:54
int m_curl_dim
Curl-curl dimensionality.
Definition: Extrapolate.h:215
MultiRegions::ExpListSharedPtr m_pressure
Pointer to field holding pressure field.
Definition: Extrapolate.h:202
static std::string def
Definition: Extrapolate.h:259
static NekDouble StifflyStable_Betaq_Coeffs[3][3]
Definition: Extrapolate.h:251
virtual void v_AccelerationBDF(Array< OneD, Array< OneD, NekDouble > > &array)
virtual void v_CalcNeumannPressureBCs(const Array< OneD, const Array< OneD, NekDouble > > &fields, const Array< OneD, const Array< OneD, NekDouble > > &N, NekDouble kinvis)
void CopyPressureHBCsToPbndExp(void)
virtual void v_CorrectPressureBCs(const Array< OneD, NekDouble > &pressure)
virtual void v_SubStepSaveFields(int nstep)=0
void EvaluateBDFArray(Array< OneD, Array< OneD, NekDouble > > &array)
void SubStepSaveFields(const int nstep)
Definition: Extrapolate.h:343
void IProductNormVelocityBCOnHBC(Array< OneD, NekDouble > &IprodVn)
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Velocity fields.
Definition: Extrapolate.h:199
void EvaluatePressureBCs(const Array< OneD, const Array< OneD, NekDouble > > &fields, const Array< OneD, const Array< OneD, NekDouble > > &N, NekDouble kinvis)
Definition: Extrapolate.h:324
void SubSteppingTimeIntegration(const LibUtilities::TimeIntegrationSchemeSharedPtr &IntegrationScheme)
Definition: Extrapolate.h:334
Array< OneD, Array< OneD, NekDouble > > m_iprodnormvel
Storage for current and previous levels of the inner product of normal velocity.
Definition: Extrapolate.h:246
Array< OneD, NekDouble > GetMaxStdVelocity(const Array< OneD, Array< OneD, NekDouble > > inarray)
int m_intSteps
Maximum points used in pressure BC evaluation.
Definition: Extrapolate.h:236
void CalcNeumannPressureBCs(const Array< OneD, const Array< OneD, NekDouble > > &fields, const Array< OneD, const Array< OneD, NekDouble > > &N, NekDouble kinvis)
Definition: Extrapolate.h:170
virtual void v_MountHOPBCs(int HBCdata, NekDouble kinvis, Array< OneD, NekDouble > &Q, Array< OneD, const NekDouble > &Advection)=0
void ExtrapolatePressureHBCs(void)
void ExtrapolateArray(Array< OneD, Array< OneD, NekDouble > > &oldarrays, Array< OneD, NekDouble > &newarray, Array< OneD, NekDouble > &outarray)
void GenerateHOPBCMap(const LibUtilities::SessionReaderSharedPtr &pSsession)
void IProductNormVelocityOnHBC(const Array< OneD, const Array< OneD, NekDouble > > &Vel, Array< OneD, NekDouble > &IprodVn)
virtual void v_SubStepSetPressureBCs(const Array< OneD, const Array< OneD, NekDouble > > &inarray, NekDouble Aii_DT, NekDouble kinvis)=0
Array< OneD, HBCType > m_hbcType
Array of type of high order BCs for splitting shemes.
Definition: Extrapolate.h:196
HighOrderOutflowSharedPtr m_houtflow
Definition: Extrapolate.h:256
NekDouble m_timestep
Definition: Extrapolate.h:238
virtual void v_SubSteppingTimeIntegration(const LibUtilities::TimeIntegrationSchemeSharedPtr &IntegrationScheme)=0
Array< OneD, MultiRegions::ExpListSharedPtr > m_PBndExp
pressure boundary conditions expansion container
Definition: Extrapolate.h:224
void SubStepSetPressureBCs(const Array< OneD, const Array< OneD, NekDouble > > &inarray, const NekDouble Aii_DT, NekDouble kinvis)
Definition: Extrapolate.h:360
void ExtrapolateArray(Array< OneD, Array< OneD, NekDouble > > &array)
std::vector< SolverUtils::ForcingSharedPtr > m_forcing
Definition: Extrapolate.h:210
void MountHOPBCs(int HBCdata, NekDouble kinvis, Array< OneD, NekDouble > &Q, Array< OneD, const NekDouble > &Advection)
Definition: Extrapolate.h:378
void CorrectPressureBCs(const Array< OneD, NekDouble > &pressure)
Definition: Extrapolate.h:396
SolverUtils::AdvectionSharedPtr m_advObject
Definition: Extrapolate.h:208
Array< OneD, int > m_velocity
int which identifies which components of m_fields contains the velocity (u,v,w);
Definition: Extrapolate.h:206
static NekDouble StifflyStable_Alpha_Coeffs[3][3]
Definition: Extrapolate.h:252
void AddNormVelOnOBC(const int nbcoeffs, const int nreg, Array< OneD, Array< OneD, NekDouble > > &u)
Definition: Extrapolate.h:405
void RollOver(Array< OneD, Array< OneD, NekDouble > > &input)
Array< OneD, const SpatialDomains::BoundaryConditionShPtr > m_PBndConds
pressure boundary conditions container
Definition: Extrapolate.h:221
Array< OneD, Array< OneD, NekDouble > > m_traceNormals
Definition: Extrapolate.h:248
virtual void v_SubStepAdvance(int nstep, NekDouble time)=0
int m_pressureCalls
number of times the high-order pressure BCs have been called
Definition: Extrapolate.h:227
LibUtilities::SessionReaderSharedPtr m_session
Definition: Extrapolate.h:191
void UpdateRobinPrimCoeff(void)
void CalcOutflowBCs(const Array< OneD, const Array< OneD, NekDouble > > &fields, NekDouble kinvis)
void AddPressureToOutflowBCs(NekDouble kinvis)
virtual void v_EvaluatePressureBCs(const Array< OneD, const Array< OneD, NekDouble > > &inarray, const Array< OneD, const Array< OneD, NekDouble > > &N, NekDouble kinvis)=0
LibUtilities::CommSharedPtr m_comm
Definition: Extrapolate.h:193
void SetForcing(const std::vector< SolverUtils::ForcingSharedPtr > &forcing)
Definition: Extrapolate.h:351
static NekDouble StifflyStable_Gamma0_Coeffs[3]
Definition: Extrapolate.h:253
virtual ~Extrapolate()
Definition: Extrapolate.cpp:66
virtual std::string v_GetSubStepName(void)
Provides a generic Factory class.
Definition: NekFactory.hpp:105
An abstract base class encapsulating the concept of advection of a vector field.
Definition: Advection.h:83
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< TimeIntegrationScheme > TimeIntegrationSchemeSharedPtr
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
Definition: Comm.h:57
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
std::shared_ptr< Advection > AdvectionSharedPtr
A shared pointer to an Advection object.
Definition: Advection.h:56
The above copyright notice and this permission notice shall be included.
Definition: CoupledSolver.h:2
std::shared_ptr< HighOrderOutflow > HighOrderOutflowSharedPtr
Definition: Extrapolate.h:69
@ eNOHBC
Definition: Extrapolate.h:52
@ eConvectiveOBC
Definition: Extrapolate.h:55
@ eHBCNeumann
Definition: Extrapolate.h:53
std::shared_ptr< Extrapolate > ExtrapolateSharedPtr
Definition: Extrapolate.h:60
LibUtilities::NekFactory< std::string, Extrapolate, const LibUtilities::SessionReaderSharedPtr &, Array< OneD, MultiRegions::ExpListSharedPtr > &, MultiRegions::ExpListSharedPtr &, const Array< OneD, int > &, const SolverUtils::AdvectionSharedPtr & > ExtrapolateFactory
Definition: Extrapolate.h:66
ExtrapolateFactory & GetExtrapolateFactory()
Definition: Extrapolate.cpp:48
double NekDouble
Array< OneD, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > > m_outflowVel
Storage for current and previous velocity fields along the outflow.
Definition: Extrapolate.h:305
Array< OneD, Array< OneD, NekDouble > > m_velocityPrimCoeff
primitive coefficient for velocities when using convetive like OBCs
Definition: Extrapolate.h:318
std::string m_defVelPrimCoeff[3]
Definition: Extrapolate.h:302
int m_outHBCnumber
Number of Outflow HOBCs.
Definition: Extrapolate.h:294
Array< OneD, NekDouble > m_pressurePrimCoeff
primitive coefficient for pressure when using convetive like OBCs
Definition: Extrapolate.h:315
NekDouble m_obcTheta
Parameters for outflow boundary condition.
Definition: Extrapolate.h:297
Array< OneD, Array< OneD, MultiRegions::ExpListSharedPtr > > m_UBndExp
Velocity boundary condition expansions on high order boundaries.
Definition: Extrapolate.h:312
Array< OneD, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > > m_outflowVelBnd
Storage for current and previous velocities along the outflow boundary.
Definition: Extrapolate.h:309
HighOrderOutflow(const int numHOpts, const int outHBCnumber, const int curldim, const LibUtilities::SessionReaderSharedPtr &pSession)
Definition: Extrapolate.h:264
int m_numOutHBCPts
Number of quadrature points for Outflow HOBC.
Definition: Extrapolate.h:291