Nektar++
SubSteppingExtrapolate.cpp
Go to the documentation of this file.
1 ///////////////////////////////////////////////////////////////////////////////
2 //
3 // File: SubSteppingExtrapolate.cpp
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 SubSteppingExtrapolate.
32 //
33 ///////////////////////////////////////////////////////////////////////////////
34 
37 
38 using namespace std;
39 
40 namespace Nektar
41 {
42  /**
43  * Registers the class with the Factory.
44  */
45  std::string SubSteppingExtrapolate::className = GetExtrapolateFactory().RegisterCreatorFunction(
46  "SubStepping",
47  SubSteppingExtrapolate::create,
48  "SubStepping");
49 
50  SubSteppingExtrapolate::SubSteppingExtrapolate(
54  const Array<OneD, int> pVel,
55  const SolverUtils::AdvectionSharedPtr advObject)
56  : Extrapolate(pSession,pFields,pPressure,pVel,advObject)
57  {
58  m_session->LoadParameter("IO_InfoSteps", m_infosteps, 0);
59  m_session->LoadParameter("SubStepCFL", m_cflSafetyFactor, 0.5);
60  m_session->LoadParameter("MinSubSteps", m_minsubsteps,1);
61  m_session->LoadParameter("MaxSubSteps", m_maxsubsteps,100);
62 
63  int dim = m_fields[0]->GetCoordim(0);
65 
66  int nTracePts = m_fields[0]->GetTrace()->GetNpoints();
67  for(int i = 0; i < dim; ++i)
68  {
69  m_traceNormals[i] = Array<OneD, NekDouble> (nTracePts);
70  }
71  m_fields[0]->GetTrace()->GetNormals(m_traceNormals);
72 
73  }
74 
76  {
77  }
78 
80  {
81  ASSERTL0(false,"This method should not be called by Substepping routine");
82  }
83 
84 
86  int intMethod,
87  const LibUtilities::TimeIntegrationWrapperSharedPtr &IntegrationScheme)
88  {
89  int i;
90 
91  // Set to 1 for first step and it will then be increased in
92  // time advance routines
93  switch(intMethod)
94  {
97  {
98  std::string vSubStepIntScheme = "ForwardEuler";
99 
100  if(m_session->DefinesSolverInfo("SubStepIntScheme"))
101  {
102  vSubStepIntScheme = m_session->GetSolverInfo("SubStepIntScheme");
103  }
104 
106 
107  int nvel = m_velocity.num_elements();
108 
109  // Fields for linear interpolation
111  int ntotpts = m_fields[0]->GetTotPoints();
112  m_previousVelFields[0] = Array<OneD, NekDouble>(2*nvel*ntotpts);
113  for(i = 1; i < 2*nvel; ++i)
114  {
115  m_previousVelFields[i] = m_previousVelFields[i-1] + ntotpts;
116  }
117 
118  }
119  break;
121  {
122  std::string vSubStepIntScheme = "RungeKutta2_ImprovedEuler";
123 
124  if(m_session->DefinesSolverInfo("SubStepIntScheme"))
125  {
126  vSubStepIntScheme = m_session->GetSolverInfo("SubStepIntScheme");
127  }
128 
130 
131  int nvel = m_velocity.num_elements();
132 
133  // Fields for quadratic interpolation
135 
136  int ntotpts = m_fields[0]->GetTotPoints();
137  m_previousVelFields[0] = Array<OneD, NekDouble>(3*nvel*ntotpts);
138  for(i = 1; i < 3*nvel; ++i)
139  {
140  m_previousVelFields[i] = m_previousVelFields[i-1] + ntotpts;
141  }
142 
143  }
144  break;
145  default:
146  ASSERTL0(0,"Integration method not suitable: Options include BackwardEuler or BDFImplicitOrder1");
147  break;
148  }
149 
150  m_intSteps = IntegrationScheme->GetIntegrationSteps();
151 
152  // set explicit time-integration class operators
155  }
156 
157  /**
158  * Explicit Advection terms used by SubStepAdvance time integration
159  */
161  const Array<OneD, const Array<OneD, NekDouble> > &inarray,
162  Array<OneD, Array<OneD, NekDouble> > &outarray,
163  const NekDouble time)
164  {
165  int i;
166  int nVariables = inarray.num_elements();
167  int nQuadraturePts = inarray[0].num_elements();
168 
169  /// Get the number of coefficients
170  int ncoeffs = m_fields[0]->GetNcoeffs();
171 
172  /// Define an auxiliary variable to compute the RHS
173  Array<OneD, Array<OneD, NekDouble> > WeakAdv(nVariables);
174  WeakAdv[0] = Array<OneD, NekDouble> (ncoeffs*nVariables);
175  for(i = 1; i < nVariables; ++i)
176  {
177  WeakAdv[i] = WeakAdv[i-1] + ncoeffs;
178  }
179 
180  Array<OneD, Array<OneD, NekDouble> > Velfields(m_velocity.num_elements());
181 
182  Velfields[0] = Array<OneD, NekDouble> (nQuadraturePts*m_velocity.num_elements());
183 
184  for(i = 1; i < m_velocity.num_elements(); ++i)
185  {
186  Velfields[i] = Velfields[i-1] + nQuadraturePts;
187  }
188 
189  SubStepExtrapolateField(fmod(time,m_timestep), Velfields);
190 
191  m_advObject->Advect(m_velocity.num_elements(), m_fields, Velfields, inarray, outarray, time);
192 
193  for(i = 0; i < nVariables; ++i)
194  {
195  m_fields[i]->IProductWRTBase(outarray[i],WeakAdv[i]);
196  // negation requried due to sign of DoAdvection term to be consistent
197  Vmath::Neg(ncoeffs, WeakAdv[i], 1);
198  }
199 
200  AddAdvectionPenaltyFlux(Velfields, inarray, WeakAdv);
201 
202  /// Operations to compute the RHS
203  for(i = 0; i < nVariables; ++i)
204  {
205  // Negate the RHS
206  Vmath::Neg(ncoeffs, WeakAdv[i], 1);
207 
208  /// Multiply the flux by the inverse of the mass matrix
209  m_fields[i]->MultiplyByElmtInvMass(WeakAdv[i], WeakAdv[i]);
210 
211  /// Store in outarray the physical values of the RHS
212  m_fields[i]->BwdTrans(WeakAdv[i], outarray[i]);
213  }
214  }
215 
216  /**
217  * Projection used by SubStepAdvance time integration
218  */
220  const Array<OneD, const Array<OneD, NekDouble> > &inarray,
221  Array<OneD, Array<OneD, NekDouble> > &outarray,
222  const NekDouble time)
223  {
224  ASSERTL1(inarray.num_elements() == outarray.num_elements(),"Inarray and outarray of different sizes ");
225 
226  for(int i = 0; i < inarray.num_elements(); ++i)
227  {
228  Vmath::Vcopy(inarray[i].num_elements(),inarray[i],1,outarray[i],1);
229  }
230  }
231 
232 
233  /**
234  *
235  */
237  const Array<OneD, const Array<OneD, NekDouble> > &inarray,
238  const NekDouble Aii_Dt,
239  NekDouble kinvis)
240  {
241  //int nConvectiveFields =m_fields.num_elements()-1;
242  Array<OneD, Array<OneD, NekDouble> > nullvelfields;
243 
244  m_pressureCalls++;
245 
246  // Calculate non-linear and viscous BCs at current level and
247  // put in m_pressureHBCs[0]
248  CalcNeumannPressureBCs(inarray,nullvelfields,kinvis);
249 
250  // Extrapolate to m_pressureHBCs to n+1
252 
253  // Add (phi,Du/Dt) term to m_presureHBC
254  AddDuDt();
255 
256  // Copy m_pressureHBCs to m_PbndExp
258 
259  // Evaluate High order outflow conditiosn if required.
260  CalcOutflowBCs(inarray, kinvis);
261  }
262 
263 
264  /**
265  *
266  */
268  {
269  int i,n;
270  int nvel = m_velocity.num_elements();
271  int npts = m_fields[0]->GetTotPoints();
272 
273  // rotate fields
274  int nblocks = m_previousVelFields.num_elements()/nvel;
276 
277  // rotate storage space
278  for(n = 0; n < nvel; ++n)
279  {
280  save = m_previousVelFields[(nblocks-1)*nvel+n];
281 
282  for(i = nblocks-1; i > 0; --i)
283  {
284  m_previousVelFields[i*nvel+n] = m_previousVelFields[(i-1)*nvel+n];
285  }
286 
287  m_previousVelFields[n] = save;
288  }
289 
290  // Put previous field
291  for(i = 0; i < nvel; ++i)
292  {
293  m_fields[m_velocity[i]]->BwdTrans(m_fields[m_velocity[i]]->GetCoeffs(),
294  m_fields[m_velocity[i]]->UpdatePhys());
295  Vmath::Vcopy(npts,m_fields[m_velocity[i]]->GetPhys(),1,
296  m_previousVelFields[i],1);
297  }
298 
299  if(nstep == 0)// initialise all levels with first field
300  {
301  for(n = 0; n < nvel; ++n)
302  {
303  for(i = 1; i < nblocks; ++i)
304  {
305  Vmath::Vcopy(npts,m_fields[m_velocity[n]]->GetPhys(),1,
306  m_previousVelFields[i*nvel+n],1);
307 
308  }
309  }
310  }
311  }
312 
313  /**
314  *
315  */
317  const LibUtilities::TimeIntegrationSolutionSharedPtr &integrationSoln,
318  int nstep,
319  NekDouble time)
320  {
321  int n;
322  int nsubsteps;
323 
324  NekDouble dt;
325 
327 
328  static int ncalls = 1;
329  int nint = min(ncalls++, m_intSteps);
330 
331  //this needs to change
332  m_comm = m_fields[0]->GetComm()->GetRowComm();
333 
334  // Get the proper time step with CFL control
335  dt = GetSubstepTimeStep();
336 
337  nsubsteps = (m_timestep > dt)? ((int)(m_timestep/dt)+1):1;
338  nsubsteps = max(m_minsubsteps, nsubsteps);
339 
340  ASSERTL0(nsubsteps < m_maxsubsteps,"Number of substeps has exceeded maximum");
341 
342  dt = m_timestep/nsubsteps;
343 
344  if (m_infosteps && !((nstep+1)%m_infosteps) && m_comm->GetRank() == 0)
345  {
346  cout << "Sub-integrating using "<< nsubsteps
347  << " steps over Dt = " << m_timestep
348  << " (SubStep CFL=" << m_cflSafetyFactor << ")"<< endl;
349  }
350 
351  for (int m = 0; m < nint; ++m)
352  {
353  // We need to update the fields held by the m_integrationSoln
354  fields = integrationSoln->UpdateSolutionVector()[m];
355 
356  // Initialise NS solver which is set up to use a GLM method
357  // with calls to EvaluateAdvection_SetPressureBCs and
358  // SolveUnsteadyStokesSystem
360  SubIntegrationSoln = m_subStepIntegrationScheme->
361  InitializeScheme(dt, fields, time, m_subStepIntegrationOps);
362 
363  for(n = 0; n < nsubsteps; ++n)
364  {
365  fields = m_subStepIntegrationScheme->TimeIntegrate(n, dt, SubIntegrationSoln,
367  }
368 
369  // set up HBC m_acceleration field for Pressure BCs
371 
372  // Reset time integrated solution in m_integrationSoln
373  integrationSoln->SetSolVector(m,fields);
374  }
375  }
376 
377 
378  /**
379  *
380  */
382  {
383  int n_element = m_fields[0]->GetExpSize();
384 
385  const Array<OneD, int> ExpOrder=m_fields[0]->EvalBasisNumModesMaxPerExp();
386 
387  const NekDouble cLambda = 0.2; // Spencer book pag. 317
388 
389  Array<OneD, NekDouble> tstep (n_element, 0.0);
390  Array<OneD, NekDouble> stdVelocity(n_element, 0.0);
391  Array<OneD, Array<OneD, NekDouble> > velfields(m_velocity.num_elements());
392 
393  for(int i = 0; i < m_velocity.num_elements(); ++i)
394  {
395  velfields[i] = m_fields[m_velocity[i]]->UpdatePhys();
396  }
397  stdVelocity = GetMaxStdVelocity(velfields);
398 
399  for(int el = 0; el < n_element; ++el)
400  {
401  tstep[el] = m_cflSafetyFactor /
402  (stdVelocity[el] * cLambda *
403  (ExpOrder[el]-1) * (ExpOrder[el]-1));
404  }
405 
406  NekDouble TimeStep = Vmath::Vmin(n_element, tstep, 1);
407  m_comm->AllReduce(TimeStep,LibUtilities::ReduceMin);
408 
409  return TimeStep;
410  }
411 
412 
413 
414 
416  const Array<OneD, const Array<OneD, NekDouble> > &velfield,
417  const Array<OneD, const Array<OneD, NekDouble> > &physfield,
418  Array<OneD, Array<OneD, NekDouble> > &Outarray)
419  {
420  ASSERTL1(
421  physfield.num_elements() == Outarray.num_elements(),
422  "Physfield and outarray are of different dimensions");
423 
424  int i;
425 
426  /// Number of trace points
427  int nTracePts = m_fields[0]->GetTrace()->GetNpoints();
428 
429  /// Number of spatial dimensions
430  int nDimensions = m_bnd_dim;
431 
432  /// Forward state array
433  Array<OneD, NekDouble> Fwd(3*nTracePts);
434 
435  /// Backward state array
436  Array<OneD, NekDouble> Bwd = Fwd + nTracePts;
437 
438  /// upwind numerical flux state array
439  Array<OneD, NekDouble> numflux = Bwd + nTracePts;
440 
441  /// Normal velocity array
442  Array<OneD, NekDouble> Vn (nTracePts, 0.0);
443 
444  // Extract velocity field along the trace space and multiply by trace normals
445  for(i = 0; i < nDimensions; ++i)
446  {
447  m_fields[0]->ExtractTracePhys(velfield[i], Fwd);
448  Vmath::Vvtvp(nTracePts, m_traceNormals[i], 1, Fwd, 1, Vn, 1, Vn, 1);
449  }
450 
451  for(i = 0; i < physfield.num_elements(); ++i)
452  {
453  /// Extract forwards/backwards trace spaces
454  /// Note: Needs to have correct i value to get boundary conditions
455  m_fields[i]->GetFwdBwdTracePhys(physfield[i], Fwd, Bwd);
456 
457  /// Upwind between elements
458  m_fields[0]->GetTrace()->Upwind(Vn, Fwd, Bwd, numflux);
459 
460  /// Construct difference between numflux and Fwd,Bwd
461  Vmath::Vsub(nTracePts, numflux, 1, Fwd, 1, Fwd, 1);
462  Vmath::Vsub(nTracePts, numflux, 1, Bwd, 1, Bwd, 1);
463 
464  /// Calculate the numerical fluxes multipling Fwd, Bwd and
465  /// numflux by the normal advection velocity
466  Vmath::Vmul(nTracePts, Fwd, 1, Vn, 1, Fwd, 1);
467  Vmath::Vmul(nTracePts, Bwd, 1, Vn, 1, Bwd, 1);
468 
469  m_fields[0]->AddFwdBwdTraceIntegral(Fwd,Bwd,Outarray[i]);
470  }
471  }
472 
473  /**
474  * Extrapolate field using equally time spaced field un,un-1,un-2, (at
475  * dt intervals) to time n+t at order Ord
476  */
478  NekDouble toff,
479  Array< OneD, Array<OneD, NekDouble> > &ExtVel)
480  {
481  int npts = m_fields[0]->GetTotPoints();
482  int nvel = m_velocity.num_elements();
483  int i,j;
485 
486  int ord = m_intSteps;
487 
488  // calculate Lagrange interpolants
489  Vmath::Fill(4,1.0,l,1);
490 
491  for(i = 0; i <= ord; ++i)
492  {
493  for(j = 0; j <= ord; ++j)
494  {
495  if(i != j)
496  {
497  l[i] *= (j*m_timestep+toff);
498  l[i] /= (j*m_timestep-i*m_timestep);
499  }
500  }
501  }
502 
503  for(i = 0; i < nvel; ++i)
504  {
505  Vmath::Smul(npts,l[0],m_previousVelFields[i],1,ExtVel[i],1);
506 
507  for(j = 1; j <= ord; ++j)
508  {
509  Blas::Daxpy(npts,l[j],m_previousVelFields[j*nvel+i],1,
510  ExtVel[i],1);
511  }
512  }
513  }
514 
515  /**
516  *
517  */
519  int HBCdata,
520  NekDouble kinvis,
523  {
524  Vmath::Smul(HBCdata,-kinvis,Q,1,Q,1);
525  }
526 
528  {
529  return m_subStepIntegrationScheme->GetIntegrationMethod();
530  }
531 
532 }
virtual void v_EvaluatePressureBCs(const Array< OneD, const Array< OneD, NekDouble > > &fields, const Array< OneD, const Array< OneD, NekDouble > > &N, NekDouble kinvis)
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)
LibUtilities::TimeIntegrationWrapperSharedPtr m_subStepIntegrationScheme
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
void IProductNormVelocityOnHBC(const Array< OneD, const Array< OneD, NekDouble > > &Vel, Array< OneD, NekDouble > &IprodVn)
LibUtilities::SessionReaderSharedPtr m_session
Definition: Extrapolate.h:210
void ExtrapolateArray(Array< OneD, Array< OneD, NekDouble > > &array)
Array< OneD, int > m_velocity
int which identifies which components of m_fields contains the velocity (u,v,w);
Definition: Extrapolate.h:225
BDF multi-step scheme of order 1 (implicit)
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
virtual void v_SubStepSetPressureBCs(const Array< OneD, const Array< OneD, NekDouble > > &inarray, NekDouble Aii_Dt, NekDouble kinvis)
ExtrapolateFactory & GetExtrapolateFactory()
Definition: Extrapolate.cpp:49
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:874
std::shared_ptr< Advection > AdvectionSharedPtr
A shared pointer to an Advection object.
Definition: Advection.h:170
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
Definition: Vmath.cpp:45
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:445
STL namespace.
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 CopyPressureHBCsToPbndExp(void)
LibUtilities::CommSharedPtr m_comm
Definition: Extrapolate.h:212
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Velocity fields.
Definition: Extrapolate.h:218
virtual void v_SubStepSaveFields(int nstep)
Array< OneD, Array< OneD, NekDouble > > m_previousVelFields
virtual void v_SubSteppingTimeIntegration(int intMethod, const LibUtilities::TimeIntegrationWrapperSharedPtr &IntegrationScheme)
void DefineProjection(FuncPointerT func, ObjectPointerT obj)
int m_bnd_dim
bounday dimensionality
Definition: Extrapolate.h:235
std::shared_ptr< TimeIntegrationWrapper > TimeIntegrationWrapperSharedPtr
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
Definition: NekFactory.hpp:144
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
Definition: Vmath.cpp:216
Array< OneD, NekDouble > GetMaxStdVelocity(const Array< OneD, Array< OneD, NekDouble > > inarray)
void DefineOdeRhs(FuncPointerT func, ObjectPointerT obj)
int m_intSteps
Maximum points used in pressure BC evaluation.
Definition: Extrapolate.h:253
void Neg(int n, T *x, const int incx)
Negate x = -x.
Definition: Vmath.cpp:399
virtual void v_SubStepAdvance(const LibUtilities::TimeIntegrationSolutionSharedPtr &integrationSoln, int nstep, NekDouble time)
double NekDouble
TimeIntegrationWrapperFactory & GetTimeIntegrationWrapperFactory()
int m_pressureCalls
number of times the high-order pressure BCs have been called
Definition: Extrapolate.h:244
void SubStepAdvection(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
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:346
virtual void v_MountHOPBCs(int HBCdata, NekDouble kinvis, Array< OneD, NekDouble > &Q, Array< OneD, const NekDouble > &Advection)
BDF multi-step scheme of order 2 (implicit)
Array< OneD, Array< OneD, NekDouble > > m_pressureHBCs
Storage for current and previous levels of high order pressure boundary conditions.
Definition: Extrapolate.h:258
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
Definition: NekFactory.hpp:199
SolverUtils::AdvectionSharedPtr m_advObject
Definition: Extrapolate.h:227
Array< OneD, Array< OneD, NekDouble > > m_traceNormals
Definition: Extrapolate.h:263
virtual LibUtilities::TimeIntegrationMethod v_GetSubStepIntegrationMethod(void)
void CalcOutflowBCs(const Array< OneD, const Array< OneD, NekDouble > > &fields, NekDouble kinvis)
std::shared_ptr< TimeIntegrationSolution > TimeIntegrationSolutionSharedPtr
Array< OneD, Array< OneD, NekDouble > > m_iprodnormvel
Storage for current and previous levels of the inner product of normal velocity.
Definition: Extrapolate.h:261
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:250
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:110
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1064
NekDouble m_timestep
Definition: Extrapolate.h:255
std::shared_ptr< SessionReader > SessionReaderSharedPtr
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:186
An abstract base class encapsulating the concept of advection of a vector field.
Definition: Advection.h:69
void CalcNeumannPressureBCs(const Array< OneD, const Array< OneD, NekDouble > > &fields, const Array< OneD, const Array< OneD, NekDouble > > &N, NekDouble kinvis)
Definition: Extrapolate.h:187
LibUtilities::TimeIntegrationSchemeOperators m_subStepIntegrationOps