Nektar++
Public Member Functions | Static Public Member Functions | Static Public Attributes | Protected Member Functions | Protected Attributes | List of all members
Nektar::SubSteppingExtrapolate Class Reference

#include <SubSteppingExtrapolate.h>

Inheritance diagram for Nektar::SubSteppingExtrapolate:
[legend]

Public Member Functions

 SubSteppingExtrapolate (const LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields, MultiRegions::ExpListSharedPtr pPressure, const Array< OneD, int > pVel, const SolverUtils::AdvectionSharedPtr advObject)
 
virtual ~SubSteppingExtrapolate ()
 
- Public Member Functions inherited from Nektar::Extrapolate
 Extrapolate (const LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields, MultiRegions::ExpListSharedPtr pPressure, const Array< OneD, int > pVel, const SolverUtils::AdvectionSharedPtr advObject)
 
virtual ~Extrapolate ()
 
void GenerateHOPBCMap (const LibUtilities::SessionReaderSharedPtr &pSsession)
 
void UpdateRobinPrimCoeff (void)
 
void SubSteppingTimeIntegration (const LibUtilities::TimeIntegrationSchemeSharedPtr &IntegrationScheme)
 
void SubStepSaveFields (const int nstep)
 
void SubStepSetPressureBCs (const Array< OneD, const Array< OneD, NekDouble >> &inarray, const NekDouble Aii_DT, NekDouble kinvis)
 
void SubStepAdvance (const int nstep, NekDouble time)
 
void MountHOPBCs (int HBCdata, NekDouble kinvis, Array< OneD, NekDouble > &Q, Array< OneD, const NekDouble > &Advection)
 
void EvaluatePressureBCs (const Array< OneD, const Array< OneD, NekDouble >> &fields, const Array< OneD, const Array< OneD, NekDouble >> &N, NekDouble kinvis)
 
void SetForcing (const std::vector< SolverUtils::ForcingSharedPtr > &forcing)
 
void AddDuDt (void)
 
void AddVelBC (void)
 
void ExtrapolatePressureHBCs (void)
 
void CopyPressureHBCsToPbndExp (void)
 
Array< OneD, NekDoubleGetMaxStdVelocity (const Array< OneD, Array< OneD, NekDouble >> inarray)
 
void CorrectPressureBCs (const Array< OneD, NekDouble > &pressure)
 
void IProductNormVelocityOnHBC (const Array< OneD, const Array< OneD, NekDouble >> &Vel, Array< OneD, NekDouble > &IprodVn)
 
void IProductNormVelocityBCOnHBC (Array< OneD, NekDouble > &IprodVn)
 
std::string GetSubStepName (void)
 
void ExtrapolateArray (Array< OneD, Array< OneD, NekDouble >> &array)
 
void EvaluateBDFArray (Array< OneD, Array< OneD, NekDouble >> &array)
 
void ExtrapolateArray (Array< OneD, Array< OneD, NekDouble >> &oldarrays, Array< OneD, NekDouble > &newarray, Array< OneD, NekDouble > &outarray)
 
void AddNormVelOnOBC (const int nbcoeffs, const int nreg, Array< OneD, Array< OneD, NekDouble >> &u)
 
void AddPressureToOutflowBCs (NekDouble kinvis)
 

Static Public Member Functions

static ExtrapolateSharedPtr create (const LibUtilities::SessionReaderSharedPtr &pSession, Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, MultiRegions::ExpListSharedPtr &pPressure, const Array< OneD, int > &pVel, const SolverUtils::AdvectionSharedPtr &advObject)
 Creates an instance of this class. More...
 

Static Public Attributes

static std::string className
 Name of class. More...
 

Protected Member Functions

virtual void v_EvaluatePressureBCs (const Array< OneD, const Array< OneD, NekDouble >> &fields, const Array< OneD, const Array< OneD, NekDouble >> &N, NekDouble kinvis) override
 
virtual void v_SubSteppingTimeIntegration (const LibUtilities::TimeIntegrationSchemeSharedPtr &IntegrationScheme) override
 
virtual void v_SubStepSaveFields (int nstep) override
 
virtual void v_SubStepSetPressureBCs (const Array< OneD, const Array< OneD, NekDouble >> &inarray, NekDouble Aii_Dt, NekDouble kinvis) override
 
virtual void v_SubStepAdvance (int nstep, NekDouble time) override
 
virtual void v_MountHOPBCs (int HBCdata, NekDouble kinvis, Array< OneD, NekDouble > &Q, Array< OneD, const NekDouble > &Advection) override
 
virtual std::string v_GetSubStepName (void) override
 
void SubStepAdvection (const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble time)
 
void SubStepProjection (const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble time)
 
void SubStepExtrapolateField (NekDouble toff, Array< OneD, Array< OneD, NekDouble >> &ExtVel)
 
void AddAdvectionPenaltyFlux (const Array< OneD, const Array< OneD, NekDouble >> &velfield, const Array< OneD, const Array< OneD, NekDouble >> &physfield, Array< OneD, Array< OneD, NekDouble >> &outarray)
 
NekDouble GetSubstepTimeStep ()
 
- Protected Member Functions inherited from Nektar::Extrapolate
virtual void v_AccelerationBDF (Array< OneD, Array< OneD, NekDouble >> &array)
 
void CalcNeumannPressureBCs (const Array< OneD, const Array< OneD, NekDouble >> &fields, const Array< OneD, const Array< OneD, NekDouble >> &N, NekDouble kinvis)
 
virtual void v_CalcNeumannPressureBCs (const Array< OneD, const Array< OneD, NekDouble >> &fields, const Array< OneD, const Array< OneD, NekDouble >> &N, NekDouble kinvis)
 
virtual void v_CorrectPressureBCs (const Array< OneD, NekDouble > &pressure)
 
virtual void v_AddNormVelOnOBC (const int nbcoeffs, const int nreg, Array< OneD, Array< OneD, NekDouble >> &u)
 
void CalcOutflowBCs (const Array< OneD, const Array< OneD, NekDouble >> &fields, NekDouble kinvis)
 
void RollOver (Array< OneD, Array< OneD, NekDouble >> &input)
 

Protected Attributes

LibUtilities::TimeIntegrationSchemeSharedPtr m_intScheme
 
LibUtilities::TimeIntegrationSchemeSharedPtr m_subStepIntegrationScheme
 
LibUtilities::TimeIntegrationSchemeOperators m_subStepIntegrationOps
 
Array< OneD, Array< OneD, NekDouble > > m_previousVelFields
 
NekDouble m_cflSafetyFactor
 
int m_infosteps
 
int m_minsubsteps
 
int m_maxsubsteps
 
- Protected Attributes inherited from Nektar::Extrapolate
LibUtilities::SessionReaderSharedPtr m_session
 
LibUtilities::CommSharedPtr m_comm
 
Array< OneD, HBCTypem_hbcType
 Array of type of high order BCs for splitting shemes. More...
 
Array< OneD, MultiRegions::ExpListSharedPtrm_fields
 Velocity fields. More...
 
MultiRegions::ExpListSharedPtr m_pressure
 Pointer to field holding pressure field. More...
 
Array< OneD, int > m_velocity
 int which identifies which components of m_fields contains the velocity (u,v,w); More...
 
SolverUtils::AdvectionSharedPtr m_advObject
 
std::vector< SolverUtils::ForcingSharedPtrm_forcing
 
Array< OneD, Array< OneD, NekDouble > > m_previousVelFields
 
int m_curl_dim
 Curl-curl dimensionality. More...
 
int m_bnd_dim
 bounday dimensionality More...
 
Array< OneD, const SpatialDomains::BoundaryConditionShPtrm_PBndConds
 pressure boundary conditions container More...
 
Array< OneD, MultiRegions::ExpListSharedPtrm_PBndExp
 pressure boundary conditions expansion container More...
 
int m_pressureCalls
 number of times the high-order pressure BCs have been called More...
 
int m_numHBCDof
 
int m_HBCnumber
 
int m_intSteps
 Maximum points used in pressure BC evaluation. More...
 
NekDouble m_timestep
 
Array< OneD, Array< OneD, NekDouble > > m_pressureHBCs
 Storage for current and previous levels of high order pressure boundary conditions. More...
 
Array< OneD, Array< OneD, NekDouble > > m_iprodnormvel
 Storage for current and previous levels of the inner product of normal velocity. More...
 
Array< OneD, Array< OneD, NekDouble > > m_traceNormals
 
HighOrderOutflowSharedPtr m_houtflow
 

Additional Inherited Members

- Static Protected Attributes inherited from Nektar::Extrapolate
static NekDouble StifflyStable_Betaq_Coeffs [3][3]
 
static NekDouble StifflyStable_Alpha_Coeffs [3][3]
 
static NekDouble StifflyStable_Gamma0_Coeffs [3] = {1.0, 1.5, 11.0 / 6.0}
 

Detailed Description

Definition at line 57 of file SubSteppingExtrapolate.h.

Constructor & Destructor Documentation

◆ SubSteppingExtrapolate()

Nektar::SubSteppingExtrapolate::SubSteppingExtrapolate ( const LibUtilities::SessionReaderSharedPtr  pSession,
Array< OneD, MultiRegions::ExpListSharedPtr pFields,
MultiRegions::ExpListSharedPtr  pPressure,
const Array< OneD, int >  pVel,
const SolverUtils::AdvectionSharedPtr  advObject 
)

Definition at line 50 of file SubSteppingExtrapolate.cpp.

55  : Extrapolate(pSession, pFields, pPressure, pVel, advObject)
56 {
57  m_session->LoadParameter("IO_InfoSteps", m_infosteps, 0);
58  m_session->LoadParameter("SubStepCFL", m_cflSafetyFactor, 0.5);
59  m_session->LoadParameter("MinSubSteps", m_minsubsteps, 1);
60  m_session->LoadParameter("MaxSubSteps", m_maxsubsteps, 100);
61 
62  size_t dim = m_fields[0]->GetCoordim(0);
63  m_traceNormals = Array<OneD, Array<OneD, NekDouble>>(dim);
64 
65  size_t nTracePts = m_fields[0]->GetTrace()->GetNpoints();
66  for (size_t i = 0; i < dim; ++i)
67  {
68  m_traceNormals[i] = Array<OneD, NekDouble>(nTracePts);
69  }
70  m_fields[0]->GetTrace()->GetNormals(m_traceNormals);
71 }
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
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Velocity fields.
Definition: Extrapolate.h:198
Array< OneD, Array< OneD, NekDouble > > m_traceNormals
Definition: Extrapolate.h:247
LibUtilities::SessionReaderSharedPtr m_session
Definition: Extrapolate.h:190

References m_cflSafetyFactor, Nektar::Extrapolate::m_fields, m_infosteps, m_maxsubsteps, m_minsubsteps, Nektar::Extrapolate::m_session, and Nektar::Extrapolate::m_traceNormals.

◆ ~SubSteppingExtrapolate()

Nektar::SubSteppingExtrapolate::~SubSteppingExtrapolate ( )
virtual

Definition at line 73 of file SubSteppingExtrapolate.cpp.

74 {
75 }

Member Function Documentation

◆ AddAdvectionPenaltyFlux()

void Nektar::SubSteppingExtrapolate::AddAdvectionPenaltyFlux ( const Array< OneD, const Array< OneD, NekDouble >> &  velfield,
const Array< OneD, const Array< OneD, NekDouble >> &  physfield,
Array< OneD, Array< OneD, NekDouble >> &  outarray 
)
protected

Number of trace points

Number of spatial dimensions

Forward state array

Backward state array

upwind numerical flux state array

Normal velocity array

Extract forwards/backwards trace spaces Note: Needs to have correct i value to get boundary conditions

Upwind between elements

Construct difference between numflux and Fwd,Bwd

Calculate the numerical fluxes multipling Fwd, Bwd and numflux by the normal advection velocity

Definition at line 407 of file SubSteppingExtrapolate.cpp.

411 {
412  ASSERTL1(physfield.size() == Outarray.size(),
413  "Physfield and outarray are of different dimensions");
414 
415  size_t i;
416 
417  /// Number of trace points
418  size_t nTracePts = m_fields[0]->GetTrace()->GetNpoints();
419 
420  /// Number of spatial dimensions
421  size_t nDimensions = m_bnd_dim;
422 
423  /// Forward state array
424  Array<OneD, NekDouble> Fwd(3 * nTracePts);
425 
426  /// Backward state array
427  Array<OneD, NekDouble> Bwd = Fwd + nTracePts;
428 
429  /// upwind numerical flux state array
430  Array<OneD, NekDouble> numflux = Bwd + nTracePts;
431 
432  /// Normal velocity array
433  Array<OneD, NekDouble> Vn(nTracePts, 0.0);
434 
435  // Extract velocity field along the trace space and multiply by trace
436  // normals
437  for (i = 0; i < nDimensions; ++i)
438  {
439  m_fields[0]->ExtractTracePhys(velfield[i], Fwd);
440  Vmath::Vvtvp(nTracePts, m_traceNormals[i], 1, Fwd, 1, Vn, 1, Vn, 1);
441  }
442 
443  for (i = 0; i < physfield.size(); ++i)
444  {
445  /// Extract forwards/backwards trace spaces
446  /// Note: Needs to have correct i value to get boundary conditions
447  m_fields[i]->GetFwdBwdTracePhys(physfield[i], Fwd, Bwd);
448 
449  /// Upwind between elements
450  m_fields[0]->GetTrace()->Upwind(Vn, Fwd, Bwd, numflux);
451 
452  /// Construct difference between numflux and Fwd,Bwd
453  Vmath::Vsub(nTracePts, numflux, 1, Fwd, 1, Fwd, 1);
454  Vmath::Vsub(nTracePts, numflux, 1, Bwd, 1, Bwd, 1);
455 
456  /// Calculate the numerical fluxes multipling Fwd, Bwd and
457  /// numflux by the normal advection velocity
458  Vmath::Vmul(nTracePts, Fwd, 1, Vn, 1, Fwd, 1);
459  Vmath::Vmul(nTracePts, Bwd, 1, Vn, 1, Bwd, 1);
460 
461  m_fields[0]->AddFwdBwdTraceIntegral(Fwd, Bwd, Outarray[i]);
462  }
463 }
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
Definition: ErrorUtil.hpp:249
int m_bnd_dim
bounday dimensionality
Definition: Extrapolate.h:217
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
Definition: Vmath.cpp:209
void Vvtvp(int n, const T *w, const int incw, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
vvtvp (vector times vector plus vector): z = w*x + y
Definition: Vmath.cpp:574
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.
Definition: Vmath.cpp:419

References ASSERTL1, Nektar::Extrapolate::m_bnd_dim, Nektar::Extrapolate::m_fields, Nektar::Extrapolate::m_traceNormals, Vmath::Vmul(), Vmath::Vsub(), and Vmath::Vvtvp().

Referenced by SubStepAdvection().

◆ create()

static ExtrapolateSharedPtr Nektar::SubSteppingExtrapolate::create ( const LibUtilities::SessionReaderSharedPtr pSession,
Array< OneD, MultiRegions::ExpListSharedPtr > &  pFields,
MultiRegions::ExpListSharedPtr pPressure,
const Array< OneD, int > &  pVel,
const SolverUtils::AdvectionSharedPtr advObject 
)
inlinestatic

Creates an instance of this class.

Definition at line 61 of file SubSteppingExtrapolate.h.

66  {
69  pSession, pFields, pPressure, pVel, advObject);
70  return p;
71  }
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
std::shared_ptr< Extrapolate > ExtrapolateSharedPtr
Definition: Extrapolate.h:59

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), and CellMLToNektar.cellml_metadata::p.

◆ GetSubstepTimeStep()

NekDouble Nektar::SubSteppingExtrapolate::GetSubstepTimeStep ( )
protected

Definition at line 376 of file SubSteppingExtrapolate.cpp.

377 {
378  size_t n_element = m_fields[0]->GetExpSize();
379 
380  const Array<OneD, int> ExpOrder = m_fields[0]->EvalBasisNumModesMaxPerExp();
381 
382  const NekDouble cLambda = 0.2; // Spencer book pag. 317
383 
384  Array<OneD, NekDouble> tstep(n_element, 0.0);
385  Array<OneD, NekDouble> stdVelocity(n_element, 0.0);
386  Array<OneD, Array<OneD, NekDouble>> velfields(m_velocity.size());
387 
388  for (size_t i = 0; i < m_velocity.size(); ++i)
389  {
390  velfields[i] = m_fields[m_velocity[i]]->UpdatePhys();
391  }
392  stdVelocity = GetMaxStdVelocity(velfields);
393 
394  for (size_t el = 0; el < n_element; ++el)
395  {
396  tstep[el] =
397  m_cflSafetyFactor / (stdVelocity[el] * cLambda *
398  (ExpOrder[el] - 1) * (ExpOrder[el] - 1));
399  }
400 
401  NekDouble TimeStep = Vmath::Vmin(n_element, tstep, 1);
402  m_comm->AllReduce(TimeStep, LibUtilities::ReduceMin);
403 
404  return TimeStep;
405 }
Array< OneD, NekDouble > GetMaxStdVelocity(const Array< OneD, Array< OneD, NekDouble >> inarray)
Array< OneD, int > m_velocity
int which identifies which components of m_fields contains the velocity (u,v,w);
Definition: Extrapolate.h:205
LibUtilities::CommSharedPtr m_comm
Definition: Extrapolate.h:192
double NekDouble
T Vmin(int n, const T *x, const int incx)
Return the minimum element in x - called vmin to avoid conflict with min.
Definition: Vmath.cpp:1050

References Nektar::Extrapolate::GetMaxStdVelocity(), m_cflSafetyFactor, Nektar::Extrapolate::m_comm, Nektar::Extrapolate::m_fields, Nektar::Extrapolate::m_velocity, Nektar::LibUtilities::ReduceMin, and Vmath::Vmin().

Referenced by v_SubStepAdvance().

◆ SubStepAdvection()

void Nektar::SubSteppingExtrapolate::SubStepAdvection ( const Array< OneD, const Array< OneD, NekDouble >> &  inarray,
Array< OneD, Array< OneD, NekDouble >> &  outarray,
const NekDouble  time 
)
protected

Explicit Advection terms used by SubStepAdvance time integration

Get the number of coefficients

Define an auxiliary variable to compute the RHS

Operations to compute the RHS

Multiply the flux by the inverse of the mass matrix

Store in outarray the physical values of the RHS

Definition at line 148 of file SubSteppingExtrapolate.cpp.

151 {
152  size_t i;
153  size_t nVariables = inarray.size();
154  size_t nQuadraturePts = inarray[0].size();
155 
156  /// Get the number of coefficients
157  size_t ncoeffs = m_fields[0]->GetNcoeffs();
158 
159  /// Define an auxiliary variable to compute the RHS
160  Array<OneD, Array<OneD, NekDouble>> WeakAdv(nVariables);
161  WeakAdv[0] = Array<OneD, NekDouble>(ncoeffs * nVariables);
162  for (i = 1; i < nVariables; ++i)
163  {
164  WeakAdv[i] = WeakAdv[i - 1] + ncoeffs;
165  }
166 
167  Array<OneD, Array<OneD, NekDouble>> Velfields(m_velocity.size());
168 
169  Velfields[0] = Array<OneD, NekDouble>(nQuadraturePts * m_velocity.size());
170 
171  for (i = 1; i < m_velocity.size(); ++i)
172  {
173  Velfields[i] = Velfields[i - 1] + nQuadraturePts;
174  }
175 
176  SubStepExtrapolateField(fmod(time, m_timestep), Velfields);
177 
178  for (auto &x : m_forcing)
179  {
180  x->PreApply(m_fields, Velfields, Velfields, time);
181  }
182  m_advObject->Advect(m_velocity.size(), m_fields, Velfields, inarray,
183  outarray, time);
184  for (auto &x : m_forcing)
185  {
186  x->Apply(m_fields, outarray, outarray, time);
187  }
188 
189  for (i = 0; i < nVariables; ++i)
190  {
191  m_fields[i]->IProductWRTBase(outarray[i], WeakAdv[i]);
192  // negation requried due to sign of DoAdvection term to be consistent
193  Vmath::Neg(ncoeffs, WeakAdv[i], 1);
194  }
195 
196  AddAdvectionPenaltyFlux(Velfields, inarray, WeakAdv);
197 
198  /// Operations to compute the RHS
199  for (i = 0; i < nVariables; ++i)
200  {
201  // Negate the RHS
202  Vmath::Neg(ncoeffs, WeakAdv[i], 1);
203 
204  /// Multiply the flux by the inverse of the mass matrix
205  m_fields[i]->MultiplyByElmtInvMass(WeakAdv[i], WeakAdv[i]);
206 
207  /// Store in outarray the physical values of the RHS
208  m_fields[i]->BwdTrans(WeakAdv[i], outarray[i]);
209  }
210 }
NekDouble m_timestep
Definition: Extrapolate.h:237
std::vector< SolverUtils::ForcingSharedPtr > m_forcing
Definition: Extrapolate.h:209
SolverUtils::AdvectionSharedPtr m_advObject
Definition: Extrapolate.h:207
void SubStepExtrapolateField(NekDouble toff, Array< OneD, Array< OneD, NekDouble >> &ExtVel)
void AddAdvectionPenaltyFlux(const Array< OneD, const Array< OneD, NekDouble >> &velfield, const Array< OneD, const Array< OneD, NekDouble >> &physfield, Array< OneD, Array< OneD, NekDouble >> &outarray)
void Neg(int n, T *x, const int incx)
Negate x = -x.
Definition: Vmath.cpp:518

References AddAdvectionPenaltyFlux(), Nektar::Extrapolate::m_advObject, Nektar::Extrapolate::m_fields, Nektar::Extrapolate::m_forcing, Nektar::Extrapolate::m_timestep, Nektar::Extrapolate::m_velocity, Vmath::Neg(), and SubStepExtrapolateField().

Referenced by v_SubSteppingTimeIntegration().

◆ SubStepExtrapolateField()

void Nektar::SubSteppingExtrapolate::SubStepExtrapolateField ( NekDouble  toff,
Array< OneD, Array< OneD, NekDouble >> &  ExtVel 
)
protected

Extrapolate field using equally time spaced field un,un-1,un-2, (at dt intervals) to time n+t at order Ord

Definition at line 469 of file SubSteppingExtrapolate.cpp.

471 {
472  size_t npts = m_fields[0]->GetTotPoints();
473  size_t nvel = m_velocity.size();
474  size_t i, j;
475  Array<OneD, NekDouble> l(4);
476 
477  size_t ord = m_intSteps;
478 
479  // calculate Lagrange interpolants
480  Vmath::Fill(4, 1.0, l, 1);
481 
482  for (i = 0; i <= ord; ++i)
483  {
484  for (j = 0; j <= ord; ++j)
485  {
486  if (i != j)
487  {
488  l[i] *= (j * m_timestep + toff);
489  l[i] /= (j * m_timestep - i * m_timestep);
490  }
491  }
492  }
493 
494  for (i = 0; i < nvel; ++i)
495  {
496  Vmath::Smul(npts, l[0], m_previousVelFields[i], 1, ExtVel[i], 1);
497 
498  for (j = 1; j <= ord; ++j)
499  {
500  Blas::Daxpy(npts, l[j], m_previousVelFields[j * nvel + i], 1,
501  ExtVel[i], 1);
502  }
503  }
504 }
int m_intSteps
Maximum points used in pressure BC evaluation.
Definition: Extrapolate.h:235
Array< OneD, Array< OneD, NekDouble > > m_previousVelFields
static void Daxpy(const int &n, const double &alpha, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: y = alpha x plus y.
Definition: Blas.hpp:154
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
Definition: Vmath.cpp:248
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
Definition: Vmath.cpp:45

References Blas::Daxpy(), Vmath::Fill(), Nektar::Extrapolate::m_fields, Nektar::Extrapolate::m_intSteps, m_previousVelFields, Nektar::Extrapolate::m_timestep, Nektar::Extrapolate::m_velocity, and Vmath::Smul().

Referenced by SubStepAdvection().

◆ SubStepProjection()

void Nektar::SubSteppingExtrapolate::SubStepProjection ( const Array< OneD, const Array< OneD, NekDouble >> &  inarray,
Array< OneD, Array< OneD, NekDouble >> &  outarray,
const NekDouble  time 
)
protected

Projection used by SubStepAdvance time integration

Definition at line 215 of file SubSteppingExtrapolate.cpp.

218 {
219  boost::ignore_unused(time);
220  ASSERTL1(inarray.size() == outarray.size(),
221  "Inarray and outarray of different sizes ");
222 
223  for (size_t i = 0; i < inarray.size(); ++i)
224  {
225  Vmath::Vcopy(inarray[i].size(), inarray[i], 1, outarray[i], 1);
226  }
227 }
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1255

References ASSERTL1, and Vmath::Vcopy().

Referenced by v_SubSteppingTimeIntegration().

◆ v_EvaluatePressureBCs()

void Nektar::SubSteppingExtrapolate::v_EvaluatePressureBCs ( const Array< OneD, const Array< OneD, NekDouble >> &  fields,
const Array< OneD, const Array< OneD, NekDouble >> &  N,
NekDouble  kinvis 
)
overrideprotectedvirtual

Implements Nektar::Extrapolate.

Definition at line 77 of file SubSteppingExtrapolate.cpp.

80 {
81  boost::ignore_unused(fields, N, kinvis);
82  ASSERTL0(false, "This method should not be called by Substepping routine");
83 }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:215

References ASSERTL0.

◆ v_GetSubStepName()

std::string Nektar::SubSteppingExtrapolate::v_GetSubStepName ( void  )
overrideprotectedvirtual

Reimplemented from Nektar::Extrapolate.

Definition at line 518 of file SubSteppingExtrapolate.cpp.

519 {
520  return m_subStepIntegrationScheme->GetName();
521 }
LibUtilities::TimeIntegrationSchemeSharedPtr m_subStepIntegrationScheme

References m_subStepIntegrationScheme.

◆ v_MountHOPBCs()

void Nektar::SubSteppingExtrapolate::v_MountHOPBCs ( int  HBCdata,
NekDouble  kinvis,
Array< OneD, NekDouble > &  Q,
Array< OneD, const NekDouble > &  Advection 
)
overrideprotectedvirtual

Implements Nektar::Extrapolate.

Definition at line 509 of file SubSteppingExtrapolate.cpp.

512 {
513  boost::ignore_unused(Advection);
514 
515  Vmath::Smul(HBCdata, -kinvis, Q, 1, Q, 1);
516 }

References Vmath::Smul().

◆ v_SubStepAdvance()

void Nektar::SubSteppingExtrapolate::v_SubStepAdvance ( int  nstep,
NekDouble  time 
)
overrideprotectedvirtual

Implements Nektar::Extrapolate.

Definition at line 313 of file SubSteppingExtrapolate.cpp.

314 {
315  int n;
316  int nsubsteps;
317 
318  NekDouble dt;
319 
320  Array<OneD, Array<OneD, NekDouble>> fields;
321 
322  static int ncalls = 1;
323  size_t nint = std::min(ncalls++, m_intSteps);
324 
325  // this needs to change
326  m_comm = m_fields[0]->GetComm()->GetRowComm();
327 
328  // Get the proper time step with CFL control
329  dt = GetSubstepTimeStep();
330 
331  nsubsteps = (m_timestep > dt) ? ((int)(m_timestep / dt) + 1) : 1;
332  nsubsteps = std::max(m_minsubsteps, nsubsteps);
333 
334  ASSERTL0(nsubsteps < m_maxsubsteps,
335  "Number of substeps has exceeded maximum");
336 
337  dt = m_timestep / nsubsteps;
338 
339  if (m_infosteps && !((nstep + 1) % m_infosteps) && m_comm->GetRank() == 0)
340  {
341  std::cout << "Sub-integrating using " << nsubsteps
342  << " steps over Dt = " << m_timestep
343  << " (SubStep CFL=" << m_cflSafetyFactor << ")" << std::endl;
344  }
345 
346  const TripleArray &solutionVector = m_intScheme->GetSolutionVector();
347 
348  for (size_t m = 0; m < nint; ++m)
349  {
350  // We need to update the fields held by the m_intScheme
351  fields = solutionVector[m];
352 
353  // Initialise NS solver which is set up to use a GLM method
354  // with calls to EvaluateAdvection_SetPressureBCs and
355  // SolveUnsteadyStokesSystem
356  m_subStepIntegrationScheme->InitializeScheme(dt, fields, time,
358 
359  for (n = 0; n < nsubsteps; ++n)
360  {
361  fields = m_subStepIntegrationScheme->TimeIntegrate(
362  n, dt, m_subStepIntegrationOps);
363  }
364 
365  // set up HBC m_acceleration field for Pressure BCs
367 
368  // Reset time integrated solution in m_intScheme
369  m_intScheme->SetSolutionVector(m, fields);
370  }
371 }
Array< OneD, Array< OneD, NekDouble > > m_iprodnormvel
Storage for current and previous levels of the inner product of normal velocity.
Definition: Extrapolate.h:245
void IProductNormVelocityOnHBC(const Array< OneD, const Array< OneD, NekDouble >> &Vel, Array< OneD, NekDouble > &IprodVn)
LibUtilities::TimeIntegrationSchemeOperators m_subStepIntegrationOps
LibUtilities::TimeIntegrationSchemeSharedPtr m_intScheme
AT< AT< AT< NekDouble > > > TripleArray

References ASSERTL0, GetSubstepTimeStep(), Nektar::Extrapolate::IProductNormVelocityOnHBC(), m_cflSafetyFactor, Nektar::Extrapolate::m_comm, Nektar::Extrapolate::m_fields, m_infosteps, m_intScheme, Nektar::Extrapolate::m_intSteps, Nektar::Extrapolate::m_iprodnormvel, m_maxsubsteps, m_minsubsteps, m_subStepIntegrationOps, m_subStepIntegrationScheme, and Nektar::Extrapolate::m_timestep.

◆ v_SubSteppingTimeIntegration()

void Nektar::SubSteppingExtrapolate::v_SubSteppingTimeIntegration ( const LibUtilities::TimeIntegrationSchemeSharedPtr IntegrationScheme)
overrideprotectedvirtual

Implements Nektar::Extrapolate.

Definition at line 85 of file SubSteppingExtrapolate.cpp.

87 {
88  m_intScheme = IntegrationScheme;
89 
90  size_t order = IntegrationScheme->GetOrder();
91 
92  // Set to 1 for first step and it will then be increased in
93  // time advance routines
94  if ((IntegrationScheme->GetName() == "Euler" &&
95  IntegrationScheme->GetVariant() == "Backward") ||
96 
97  (IntegrationScheme->GetName() == "BDFImplicit" &&
98  (order == 1 || order == 2)))
99  {
100  // Note RK first order SSP is just Forward Euler.
101  std::string vSubStepIntScheme = "RungeKutta";
102  std::string vSubStepIntSchemeVariant = "SSP";
103  int vSubStepIntSchemeOrder = order;
104 
105  if (m_session->DefinesSolverInfo("SubStepIntScheme"))
106  {
107  vSubStepIntScheme = m_session->GetSolverInfo("SubStepIntScheme");
108  vSubStepIntSchemeVariant = "";
109  vSubStepIntSchemeOrder = order;
110  }
111 
114  vSubStepIntScheme, vSubStepIntSchemeVariant,
115  vSubStepIntSchemeOrder, std::vector<NekDouble>());
116 
117  size_t nvel = m_velocity.size();
118  size_t ndim = order + 1;
119 
120  // Fields for linear/quadratic interpolation
121  m_previousVelFields = Array<OneD, Array<OneD, NekDouble>>(ndim * nvel);
122  int ntotpts = m_fields[0]->GetTotPoints();
123  m_previousVelFields[0] = Array<OneD, NekDouble>(ndim * nvel * ntotpts);
124 
125  for (size_t i = 1; i < ndim * nvel; ++i)
126  {
127  m_previousVelFields[i] = m_previousVelFields[i - 1] + ntotpts;
128  }
129  }
130  else
131  {
132  ASSERTL0(0, "Integration method not suitable: Options include "
133  "BackwardEuler or BDFImplicitOrder{1,2}");
134  }
135 
136  m_intSteps = IntegrationScheme->GetNumIntegrationPhases();
137 
138  // set explicit time-integration class operators
143 }
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
Definition: NekFactory.hpp:144
void DefineProjection(FuncPointerT func, ObjectPointerT obj)
void DefineOdeRhs(FuncPointerT func, ObjectPointerT obj)
void SubStepAdvection(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble time)
void SubStepProjection(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble time)
TimeIntegrationSchemeFactory & GetTimeIntegrationSchemeFactory()

References ASSERTL0, Nektar::LibUtilities::NekFactory< tKey, tBase, tParam >::CreateInstance(), Nektar::LibUtilities::TimeIntegrationSchemeOperators::DefineOdeRhs(), Nektar::LibUtilities::TimeIntegrationSchemeOperators::DefineProjection(), Nektar::LibUtilities::GetTimeIntegrationSchemeFactory(), Nektar::Extrapolate::m_fields, m_intScheme, Nektar::Extrapolate::m_intSteps, m_previousVelFields, Nektar::Extrapolate::m_session, m_subStepIntegrationOps, m_subStepIntegrationScheme, Nektar::Extrapolate::m_velocity, SubStepAdvection(), and SubStepProjection().

◆ v_SubStepSaveFields()

void Nektar::SubSteppingExtrapolate::v_SubStepSaveFields ( int  nstep)
overrideprotectedvirtual

Implements Nektar::Extrapolate.

Definition at line 263 of file SubSteppingExtrapolate.cpp.

264 {
265  size_t i, n;
266  size_t nvel = m_velocity.size();
267  size_t npts = m_fields[0]->GetTotPoints();
268 
269  // rotate fields
270  size_t nblocks = m_previousVelFields.size() / nvel;
271  Array<OneD, NekDouble> save;
272 
273  // rotate storage space
274  for (n = 0; n < nvel; ++n)
275  {
276  save = m_previousVelFields[(nblocks - 1) * nvel + n];
277 
278  for (i = nblocks - 1; i > 0; --i)
279  {
280  m_previousVelFields[i * nvel + n] =
281  m_previousVelFields[(i - 1) * nvel + n];
282  }
283 
284  m_previousVelFields[n] = save;
285  }
286 
287  // Put previous field
288  for (i = 0; i < nvel; ++i)
289  {
290  m_fields[m_velocity[i]]->BwdTrans(
291  m_fields[m_velocity[i]]->GetCoeffs(),
292  m_fields[m_velocity[i]]->UpdatePhys());
293  Vmath::Vcopy(npts, m_fields[m_velocity[i]]->GetPhys(), 1,
294  m_previousVelFields[i], 1);
295  }
296 
297  if (nstep == 0) // initialise all levels with first field
298  {
299  for (n = 0; n < nvel; ++n)
300  {
301  for (i = 1; i < nblocks; ++i)
302  {
303  Vmath::Vcopy(npts, m_fields[m_velocity[n]]->GetPhys(), 1,
304  m_previousVelFields[i * nvel + n], 1);
305  }
306  }
307  }
308 }

References Nektar::Extrapolate::m_fields, m_previousVelFields, Nektar::Extrapolate::m_velocity, and Vmath::Vcopy().

◆ v_SubStepSetPressureBCs()

void Nektar::SubSteppingExtrapolate::v_SubStepSetPressureBCs ( const Array< OneD, const Array< OneD, NekDouble >> &  inarray,
NekDouble  Aii_Dt,
NekDouble  kinvis 
)
overrideprotectedvirtual

Implements Nektar::Extrapolate.

Reimplemented in Nektar::SubSteppingExtrapolateWeakPressure.

Definition at line 232 of file SubSteppingExtrapolate.cpp.

235 {
236  boost::ignore_unused(Aii_Dt);
237 
238  // int nConvectiveFields =m_fields.size()-1;
239  Array<OneD, Array<OneD, NekDouble>> nullvelfields;
240 
241  m_pressureCalls++;
242 
243  // Calculate non-linear and viscous BCs at current level and
244  // put in m_pressureHBCs[0]
245  CalcNeumannPressureBCs(inarray, nullvelfields, kinvis);
246 
247  // Extrapolate to m_pressureHBCs to n+1
249 
250  // Add (phi,Du/Dt) term to m_presureHBC
251  AddDuDt();
252 
253  // Copy m_pressureHBCs to m_PbndExp
255 
256  // Evaluate High order outflow conditiosn if required.
257  CalcOutflowBCs(inarray, kinvis);
258 }
Array< OneD, Array< OneD, NekDouble > > m_pressureHBCs
Storage for current and previous levels of high order pressure boundary conditions.
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:170
void CopyPressureHBCsToPbndExp(void)
void ExtrapolateArray(Array< OneD, Array< OneD, NekDouble >> &array)
void CalcOutflowBCs(const Array< OneD, const Array< OneD, NekDouble >> &fields, NekDouble kinvis)
int m_pressureCalls
number of times the high-order pressure BCs have been called
Definition: Extrapolate.h:226

References Nektar::Extrapolate::AddDuDt(), Nektar::Extrapolate::CalcNeumannPressureBCs(), Nektar::Extrapolate::CalcOutflowBCs(), Nektar::Extrapolate::CopyPressureHBCsToPbndExp(), Nektar::Extrapolate::ExtrapolateArray(), Nektar::Extrapolate::m_pressureCalls, and Nektar::Extrapolate::m_pressureHBCs.

Member Data Documentation

◆ className

std::string Nektar::SubSteppingExtrapolate::className
static
Initial value:
=
"SubStepping", SubSteppingExtrapolate::create, "SubStepping")
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
Definition: NekFactory.hpp:198
static ExtrapolateSharedPtr create(const LibUtilities::SessionReaderSharedPtr &pSession, Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, MultiRegions::ExpListSharedPtr &pPressure, const Array< OneD, int > &pVel, const SolverUtils::AdvectionSharedPtr &advObject)
Creates an instance of this class.
ExtrapolateFactory & GetExtrapolateFactory()
Definition: Extrapolate.cpp:48

Name of class.

Registers the class with the Factory.

Definition at line 74 of file SubSteppingExtrapolate.h.

◆ m_cflSafetyFactor

NekDouble Nektar::SubSteppingExtrapolate::m_cflSafetyFactor
protected

◆ m_infosteps

int Nektar::SubSteppingExtrapolate::m_infosteps
protected

Definition at line 133 of file SubSteppingExtrapolate.h.

Referenced by SubSteppingExtrapolate(), and v_SubStepAdvance().

◆ m_intScheme

LibUtilities::TimeIntegrationSchemeSharedPtr Nektar::SubSteppingExtrapolate::m_intScheme
protected

Definition at line 126 of file SubSteppingExtrapolate.h.

Referenced by v_SubStepAdvance(), and v_SubSteppingTimeIntegration().

◆ m_maxsubsteps

int Nektar::SubSteppingExtrapolate::m_maxsubsteps
protected

Definition at line 135 of file SubSteppingExtrapolate.h.

Referenced by SubSteppingExtrapolate(), and v_SubStepAdvance().

◆ m_minsubsteps

int Nektar::SubSteppingExtrapolate::m_minsubsteps
protected

Definition at line 134 of file SubSteppingExtrapolate.h.

Referenced by SubSteppingExtrapolate(), and v_SubStepAdvance().

◆ m_previousVelFields

Array<OneD, Array<OneD, NekDouble> > Nektar::SubSteppingExtrapolate::m_previousVelFields
protected

◆ m_subStepIntegrationOps

LibUtilities::TimeIntegrationSchemeOperators Nektar::SubSteppingExtrapolate::m_subStepIntegrationOps
protected

Definition at line 128 of file SubSteppingExtrapolate.h.

Referenced by v_SubStepAdvance(), and v_SubSteppingTimeIntegration().

◆ m_subStepIntegrationScheme

LibUtilities::TimeIntegrationSchemeSharedPtr Nektar::SubSteppingExtrapolate::m_subStepIntegrationScheme
protected