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
144 void GenerateBndElmtExpansion(void);
145
146protected:
148 const Array<OneD, const Array<OneD, NekDouble>> &inarray,
149 const Array<OneD, const Array<OneD, NekDouble>> &N,
150 NekDouble kinvis) = 0;
151
154 &IntegrationScheme) = 0;
155
156 virtual void v_SubStepSaveFields(int nstep) = 0;
157
159 const Array<OneD, const Array<OneD, NekDouble>> &inarray,
160 NekDouble Aii_DT, NekDouble kinvis) = 0;
161
162 virtual void v_SubStepAdvance(int nstep, NekDouble time) = 0;
163
164 virtual void v_MountHOPBCs(int HBCdata, NekDouble kinvis,
167
168 virtual std::string v_GetSubStepName(void);
169
170 virtual void v_AccelerationBDF(Array<OneD, Array<OneD, NekDouble>> &array);
171
173 const Array<OneD, const Array<OneD, NekDouble>> &fields,
174 const Array<OneD, const Array<OneD, NekDouble>> &N, NekDouble kinvis)
175 {
176 v_CalcNeumannPressureBCs(fields, N, kinvis);
177 }
178
179 virtual void v_CalcNeumannPressureBCs(
180 const Array<OneD, const Array<OneD, NekDouble>> &fields,
181 const Array<OneD, const Array<OneD, NekDouble>> &N, NekDouble kinvis);
182
184
185 virtual void v_AddNormVelOnOBC(const int nbcoeffs, const int nreg,
187
188 void CalcOutflowBCs(const Array<OneD, const Array<OneD, NekDouble>> &fields,
189 NekDouble kinvis);
190
192
194
196
197 /// Array of type of high order BCs for splitting shemes
199
200 /// Velocity fields
202
203 /// Pointer to field holding pressure field
205
206 /// int which identifies which components of m_fields contains the
207 /// velocity (u,v,w);
209
211
212 std::vector<SolverUtils::ForcingSharedPtr> m_forcing;
213
215
216 /// Curl-curl dimensionality
218
219 /// bounday dimensionality
221
222 /// pressure boundary conditions container
224
225 /// pressure boundary conditions expansion container
227
228 /// Boundary expansions on each domain boundary
230
231 /// number of times the high-order pressure BCs have been called
233
234 // Number of degrees of freedom (coefficients) for HOPbc
236
237 // Number of HOPbcs
239
240 /// Maximum points used in pressure BC evaluation
242
244
245 /// Storage for current and previous levels of high order pressure boundary
246 /// conditions.
248
249 /// Storage for current and previous levels of the inner product of normal
250 /// velocity
252
254
255 // Velocity correction scheme coefficient required for extrapolation.
259
260 // data related to high order outflow.
262
263private:
264 static std::string def;
265};
266
268{
269 HighOrderOutflow(const int numHOpts, const int outHBCnumber,
270 const int curldim,
272 : m_numOutHBCPts(numHOpts), m_outHBCnumber(outHBCnumber)
273 {
276 outHBCnumber);
277
280 outHBCnumber);
281
282 m_UBndExp =
284
285 pSession->LoadParameter("OutflowBC_theta", m_obcTheta, 1.0);
286 pSession->LoadParameter("OutflowBC_alpha1", m_obcAlpha1, 0.0);
287 pSession->LoadParameter("OutflowBC_alpha2", m_obcAlpha2, 0.0);
288
289 pSession->LoadParameter("U0_HighOrderBC", m_U0, 1.0);
290 pSession->LoadParameter("Delta_HighOrderBC", m_delta, 1 / 20.0);
291 }
292
293 virtual ~HighOrderOutflow(){};
294
295 /// Number of quadrature points for Outflow HOBC
297
298 /// Number of Outflow HOBCs
300
301 /// Parameters for outflow boundary condition
307 std::string m_defVelPrimCoeff[3];
308
309 /// Storage for current and previous velocity fields along the outflow
311
312 /// Storage for current and previous velocities along the outflow boundary
315
316 /// Velocity boundary condition expansions on high order boundaries.
318
319 /// primitive coefficient for pressure when using convetive like OBCs
321
322 /// primitive coefficient for velocities when using convetive like OBCs
324};
325
326/**
327 * Evaluate Pressure Boundary Conditions for Standard Extrapolation
328 */
330 const Array<OneD, const Array<OneD, NekDouble>> &inarray,
331 const Array<OneD, const Array<OneD, NekDouble>> &N, NekDouble kinvis)
332{
333 v_EvaluatePressureBCs(inarray, N, kinvis);
334}
335
336/**
337 *
338 */
340 const LibUtilities::TimeIntegrationSchemeSharedPtr &IntegrationScheme)
341{
342 v_SubSteppingTimeIntegration(IntegrationScheme);
343}
344
345/**
346 *
347 */
348inline void Extrapolate::SubStepSaveFields(int nstep)
349{
350 v_SubStepSaveFields(nstep);
351}
352
353/**
354 *
355 */
357 const std::vector<SolverUtils::ForcingSharedPtr> &forcing)
358{
359 m_forcing = forcing;
360}
361
362/**
363 *
364 */
366 const Array<OneD, const Array<OneD, NekDouble>> &inarray, NekDouble Aii_DT,
367 NekDouble kinvis)
368{
369 v_SubStepSetPressureBCs(inarray, Aii_DT, kinvis);
370}
371
372/**
373 *
374 */
375inline void Extrapolate::SubStepAdvance(int nstep, NekDouble time)
376{
377 v_SubStepAdvance(nstep, time);
378}
379
380/**
381 *
382 */
383inline void Extrapolate::MountHOPBCs(int HBCdata, NekDouble kinvis,
386{
387 v_MountHOPBCs(HBCdata, kinvis, Q, Advection);
388}
389
390/**
391 *
392 */
393inline std::string Extrapolate::GetSubStepName(void)
394{
395 return v_GetSubStepName();
396}
397
398/**
399 *
400 */
403{
405}
406
407/**
408 *
409 */
410inline void Extrapolate::AddNormVelOnOBC(const int nbcoeffs, const int nreg,
412{
413 v_AddNormVelOnOBC(nbcoeffs, nreg, u);
414}
415} // namespace Nektar
416
417#endif
std::string GetSubStepName(void)
Definition: Extrapolate.h:393
Array< OneD, Array< OneD, NekDouble > > m_pressureHBCs
Storage for current and previous levels of high order pressure boundary conditions.
Definition: Extrapolate.h:247
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:220
Array< OneD, Array< OneD, NekDouble > > m_previousVelFields
Definition: Extrapolate.h:214
void SubStepAdvance(const int nstep, NekDouble time)
Definition: Extrapolate.h:375
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:217
MultiRegions::ExpListSharedPtr m_pressure
Pointer to field holding pressure field.
Definition: Extrapolate.h:204
static std::string def
Definition: Extrapolate.h:264
static NekDouble StifflyStable_Betaq_Coeffs[3][3]
Definition: Extrapolate.h:256
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:348
void IProductNormVelocityBCOnHBC(Array< OneD, NekDouble > &IprodVn)
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Velocity fields.
Definition: Extrapolate.h:201
void EvaluatePressureBCs(const Array< OneD, const Array< OneD, NekDouble > > &fields, const Array< OneD, const Array< OneD, NekDouble > > &N, NekDouble kinvis)
Definition: Extrapolate.h:329
void SubSteppingTimeIntegration(const LibUtilities::TimeIntegrationSchemeSharedPtr &IntegrationScheme)
Definition: Extrapolate.h:339
Array< OneD, Array< OneD, NekDouble > > m_iprodnormvel
Storage for current and previous levels of the inner product of normal velocity.
Definition: Extrapolate.h:251
Array< OneD, NekDouble > GetMaxStdVelocity(const Array< OneD, Array< OneD, NekDouble > > inarray)
int m_intSteps
Maximum points used in pressure BC evaluation.
Definition: Extrapolate.h:241
void CalcNeumannPressureBCs(const Array< OneD, const Array< OneD, NekDouble > > &fields, const Array< OneD, const Array< OneD, NekDouble > > &N, NekDouble kinvis)
Definition: Extrapolate.h:172
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:198
HighOrderOutflowSharedPtr m_houtflow
Definition: Extrapolate.h:261
NekDouble m_timestep
Definition: Extrapolate.h:243
virtual void v_SubSteppingTimeIntegration(const LibUtilities::TimeIntegrationSchemeSharedPtr &IntegrationScheme)=0
Array< OneD, MultiRegions::ExpListSharedPtr > m_PBndExp
pressure boundary conditions expansion container
Definition: Extrapolate.h:226
void SubStepSetPressureBCs(const Array< OneD, const Array< OneD, NekDouble > > &inarray, const NekDouble Aii_DT, NekDouble kinvis)
Definition: Extrapolate.h:365
void ExtrapolateArray(Array< OneD, Array< OneD, NekDouble > > &array)
void GenerateBndElmtExpansion(void)
std::vector< SolverUtils::ForcingSharedPtr > m_forcing
Definition: Extrapolate.h:212
void MountHOPBCs(int HBCdata, NekDouble kinvis, Array< OneD, NekDouble > &Q, Array< OneD, const NekDouble > &Advection)
Definition: Extrapolate.h:383
void CorrectPressureBCs(const Array< OneD, NekDouble > &pressure)
Definition: Extrapolate.h:401
SolverUtils::AdvectionSharedPtr m_advObject
Definition: Extrapolate.h:210
Array< OneD, int > m_velocity
int which identifies which components of m_fields contains the velocity (u,v,w);
Definition: Extrapolate.h:208
static NekDouble StifflyStable_Alpha_Coeffs[3][3]
Definition: Extrapolate.h:257
void AddNormVelOnOBC(const int nbcoeffs, const int nreg, Array< OneD, Array< OneD, NekDouble > > &u)
Definition: Extrapolate.h:410
Array< OneD, MultiRegions::ExpListSharedPtr > m_bndElmtExps
Boundary expansions on each domain boundary.
Definition: Extrapolate.h:229
void RollOver(Array< OneD, Array< OneD, NekDouble > > &input)
Array< OneD, const SpatialDomains::BoundaryConditionShPtr > m_PBndConds
pressure boundary conditions container
Definition: Extrapolate.h:223
Array< OneD, Array< OneD, NekDouble > > m_traceNormals
Definition: Extrapolate.h:253
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:232
LibUtilities::SessionReaderSharedPtr m_session
Definition: Extrapolate.h:193
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:195
void SetForcing(const std::vector< SolverUtils::ForcingSharedPtr > &forcing)
Definition: Extrapolate.h:356
static NekDouble StifflyStable_Gamma0_Coeffs[3]
Definition: Extrapolate.h:258
virtual ~Extrapolate()
Definition: Extrapolate.cpp:66
virtual std::string v_GetSubStepName(void)
Provides a generic Factory class.
Definition: NekFactory.hpp:104
An abstract base class encapsulating the concept of advection of a vector field.
Definition: Advection.h:81
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< TimeIntegrationScheme > TimeIntegrationSchemeSharedPtr
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
Definition: Comm.h:55
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:54
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:310
Array< OneD, Array< OneD, NekDouble > > m_velocityPrimCoeff
primitive coefficient for velocities when using convetive like OBCs
Definition: Extrapolate.h:323
std::string m_defVelPrimCoeff[3]
Definition: Extrapolate.h:307
int m_outHBCnumber
Number of Outflow HOBCs.
Definition: Extrapolate.h:299
Array< OneD, NekDouble > m_pressurePrimCoeff
primitive coefficient for pressure when using convetive like OBCs
Definition: Extrapolate.h:320
NekDouble m_obcTheta
Parameters for outflow boundary condition.
Definition: Extrapolate.h:302
Array< OneD, Array< OneD, MultiRegions::ExpListSharedPtr > > m_UBndExp
Velocity boundary condition expansions on high order boundaries.
Definition: Extrapolate.h:317
Array< OneD, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > > m_outflowVelBnd
Storage for current and previous velocities along the outflow boundary.
Definition: Extrapolate.h:314
HighOrderOutflow(const int numHOpts, const int outHBCnumber, const int curldim, const LibUtilities::SessionReaderSharedPtr &pSession)
Definition: Extrapolate.h:269
int m_numOutHBCPts
Number of quadrature points for Outflow HOBC.
Definition: Extrapolate.h:296