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 
36 
38 
39 namespace Nektar
40 {
41  using namespace LibUtilities;
42 
43  /**
44  * Registers the class with the Factory.
45  */
47  "SubStepping",
49  "SubStepping");
50 
55  const Array<OneD, int> pVel,
56  const SolverUtils::AdvectionSharedPtr advObject)
57  : Extrapolate(pSession,pFields,pPressure,pVel,advObject)
58  {
59  m_session->LoadParameter("IO_InfoSteps", m_infosteps, 0);
60  m_session->LoadParameter("SubStepCFL", m_cflSafetyFactor, 0.5);
61  m_session->LoadParameter("MinSubSteps", m_minsubsteps,1);
62  m_session->LoadParameter("MaxSubSteps", m_maxsubsteps,100);
63 
64  int dim = m_fields[0]->GetCoordim(0);
66 
67  int nTracePts = m_fields[0]->GetTrace()->GetNpoints();
68  for(int i = 0; i < dim; ++i)
69  {
70  m_traceNormals[i] = Array<OneD, NekDouble> (nTracePts);
71  }
72  m_fields[0]->GetTrace()->GetNormals(m_traceNormals);
73 
74  }
75 
77  {
78  }
79 
81  {
82  ASSERTL0(false,"This method should not be called by Substepping routine");
83  }
84 
86  const LibUtilities::TimeIntegrationSchemeSharedPtr & IntegrationScheme )
87  {
88  m_intScheme = IntegrationScheme;
89 
90  unsigned int 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 =
108  m_session->GetSolverInfo( "SubStepIntScheme" );
109  vSubStepIntSchemeVariant = "";
110  vSubStepIntSchemeOrder = order;
111  }
112 
115  vSubStepIntScheme,
116  vSubStepIntSchemeVariant,
117  vSubStepIntSchemeOrder,
118  std::vector<NekDouble>() );
119 
120  int nvel = m_velocity.size();
121  int ndim = order+1;
122 
123  // Fields for linear/quadratic interpolation
125  int ntotpts = m_fields[0]->GetTotPoints();
126  m_previousVelFields[0] = Array<OneD, NekDouble>(ndim*nvel*ntotpts);
127 
128  for( int i = 1; i < ndim*nvel; ++i )
129  {
130  m_previousVelFields[i] = m_previousVelFields[i-1] + ntotpts;
131  }
132  }
133  else
134  {
135  ASSERTL0(0,"Integration method not suitable: Options include BackwardEuler or BDFImplicitOrder{1,2}");
136  }
137 
138  m_intSteps = IntegrationScheme->GetNumIntegrationPhases();
139 
140  // set explicit time-integration class operators
143  }
144 
145  /**
146  * Explicit Advection terms used by SubStepAdvance time integration
147  */
149  const Array<OneD, const Array<OneD, NekDouble> > &inarray,
150  Array<OneD, Array<OneD, NekDouble> > &outarray,
151  const NekDouble time)
152  {
153  int i;
154  int nVariables = inarray.size();
155  int nQuadraturePts = inarray[0].size();
156 
157  /// Get the number of coefficients
158  int ncoeffs = m_fields[0]->GetNcoeffs();
159 
160  /// Define an auxiliary variable to compute the RHS
161  Array<OneD, Array<OneD, NekDouble> > WeakAdv(nVariables);
162  WeakAdv[0] = Array<OneD, NekDouble> (ncoeffs*nVariables);
163  for(i = 1; i < nVariables; ++i)
164  {
165  WeakAdv[i] = WeakAdv[i-1] + ncoeffs;
166  }
167 
169 
170  Velfields[0] = Array<OneD, NekDouble> (nQuadraturePts*m_velocity.size());
171 
172  for(i = 1; i < m_velocity.size(); ++i)
173  {
174  Velfields[i] = Velfields[i-1] + nQuadraturePts;
175  }
176 
177  SubStepExtrapolateField(fmod(time,m_timestep), Velfields);
178 
179  for (auto &x : m_forcing)
180  {
181  x->PreApply(m_fields, Velfields, Velfields, time);
182  }
183  m_advObject->Advect(m_velocity.size(), m_fields, Velfields, inarray, 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  }
211 
212  /**
213  * Projection used by SubStepAdvance time integration
214  */
216  const Array<OneD, const Array<OneD, NekDouble> > &inarray,
217  Array<OneD, Array<OneD, NekDouble> > &outarray,
218  const NekDouble time)
219  {
220  ASSERTL1(inarray.size() == outarray.size(),"Inarray and outarray of different sizes ");
221 
222  for(int i = 0; i < inarray.size(); ++i)
223  {
224  Vmath::Vcopy(inarray[i].size(),inarray[i],1,outarray[i],1);
225  }
226  }
227 
228 
229  /**
230  *
231  */
233  const Array<OneD, const Array<OneD, NekDouble> > &inarray,
234  const NekDouble Aii_Dt,
235  NekDouble kinvis)
236  {
237  //int nConvectiveFields =m_fields.size()-1;
238  Array<OneD, Array<OneD, NekDouble> > nullvelfields;
239 
240  m_pressureCalls++;
241 
242  // Calculate non-linear and viscous BCs at current level and
243  // put in m_pressureHBCs[0]
244  CalcNeumannPressureBCs(inarray,nullvelfields,kinvis);
245 
246  // Extrapolate to m_pressureHBCs to n+1
248 
249  // Add (phi,Du/Dt) term to m_presureHBC
250  AddDuDt();
251 
252  // Copy m_pressureHBCs to m_PbndExp
254 
255  // Evaluate High order outflow conditiosn if required.
256  CalcOutflowBCs(inarray, kinvis);
257  }
258 
259 
260  /**
261  *
262  */
264  {
265  int i,n;
266  int nvel = m_velocity.size();
267  int npts = m_fields[0]->GetTotPoints();
268 
269  // rotate fields
270  int nblocks = m_previousVelFields.size()/nvel;
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] = m_previousVelFields[(i-1)*nvel+n];
281  }
282 
283  m_previousVelFields[n] = save;
284  }
285 
286  // Put previous field
287  for(i = 0; i < nvel; ++i)
288  {
289  m_fields[m_velocity[i]]->BwdTrans(m_fields[m_velocity[i]]->GetCoeffs(),
290  m_fields[m_velocity[i]]->UpdatePhys());
291  Vmath::Vcopy(npts,m_fields[m_velocity[i]]->GetPhys(),1,
292  m_previousVelFields[i],1);
293  }
294 
295  if(nstep == 0)// initialise all levels with first field
296  {
297  for(n = 0; n < nvel; ++n)
298  {
299  for(i = 1; i < nblocks; ++i)
300  {
301  Vmath::Vcopy(npts,m_fields[m_velocity[n]]->GetPhys(),1,
302  m_previousVelFields[i*nvel+n],1);
303 
304  }
305  }
306  }
307  }
308 
309  /**
310  *
311  */
313  int nstep,
314  NekDouble time )
315  {
316  int n;
317  int nsubsteps;
318 
319  NekDouble dt;
320 
322 
323  static int ncalls = 1;
324  int nint = std::min(ncalls++, m_intSteps);
325 
326  //this needs to change
327  m_comm = m_fields[0]->GetComm()->GetRowComm();
328 
329  // Get the proper time step with CFL control
330  dt = GetSubstepTimeStep();
331 
332  nsubsteps = (m_timestep > dt)? ((int)(m_timestep/dt)+1):1;
333  nsubsteps = std::max(m_minsubsteps, nsubsteps);
334 
335  ASSERTL0(nsubsteps < m_maxsubsteps,"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 (int 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
357  InitializeScheme(dt, fields, time, m_subStepIntegrationOps);
358 
359  for(n = 0; n < nsubsteps; ++n)
360  {
361  fields = m_subStepIntegrationScheme->
362  TimeIntegrate(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  }
372 
373 
374  /**
375  *
376  */
378  {
379  int n_element = m_fields[0]->GetExpSize();
380 
381  const Array<OneD, int> ExpOrder=m_fields[0]->EvalBasisNumModesMaxPerExp();
382 
383  const NekDouble cLambda = 0.2; // Spencer book pag. 317
384 
385  Array<OneD, NekDouble> tstep (n_element, 0.0);
386  Array<OneD, NekDouble> stdVelocity(n_element, 0.0);
388 
389  for(int i = 0; i < m_velocity.size(); ++i)
390  {
391  velfields[i] = m_fields[m_velocity[i]]->UpdatePhys();
392  }
393  stdVelocity = GetMaxStdVelocity(velfields);
394 
395  for(int el = 0; el < n_element; ++el)
396  {
397  tstep[el] = m_cflSafetyFactor /
398  (stdVelocity[el] * cLambda *
399  (ExpOrder[el]-1) * (ExpOrder[el]-1));
400  }
401 
402  NekDouble TimeStep = Vmath::Vmin(n_element, tstep, 1);
403  m_comm->AllReduce(TimeStep,LibUtilities::ReduceMin);
404 
405  return TimeStep;
406  }
407 
408 
409 
410 
412  const Array<OneD, const Array<OneD, NekDouble> > &velfield,
413  const Array<OneD, const Array<OneD, NekDouble> > &physfield,
414  Array<OneD, Array<OneD, NekDouble> > &Outarray)
415  {
416  ASSERTL1(
417  physfield.size() == Outarray.size(),
418  "Physfield and outarray are of different dimensions");
419 
420  int i;
421 
422  /// Number of trace points
423  int nTracePts = m_fields[0]->GetTrace()->GetNpoints();
424 
425  /// Number of spatial dimensions
426  int nDimensions = m_bnd_dim;
427 
428  /// Forward state array
429  Array<OneD, NekDouble> Fwd(3*nTracePts);
430 
431  /// Backward state array
432  Array<OneD, NekDouble> Bwd = Fwd + nTracePts;
433 
434  /// upwind numerical flux state array
435  Array<OneD, NekDouble> numflux = Bwd + nTracePts;
436 
437  /// Normal velocity array
438  Array<OneD, NekDouble> Vn (nTracePts, 0.0);
439 
440  // Extract velocity field along the trace space and multiply by trace normals
441  for(i = 0; i < nDimensions; ++i)
442  {
443  m_fields[0]->ExtractTracePhys(velfield[i], Fwd);
444  Vmath::Vvtvp(nTracePts, m_traceNormals[i], 1, Fwd, 1, Vn, 1, Vn, 1);
445  }
446 
447  for(i = 0; i < physfield.size(); ++i)
448  {
449  /// Extract forwards/backwards trace spaces
450  /// Note: Needs to have correct i value to get boundary conditions
451  m_fields[i]->GetFwdBwdTracePhys(physfield[i], Fwd, Bwd);
452 
453  /// Upwind between elements
454  m_fields[0]->GetTrace()->Upwind(Vn, Fwd, Bwd, numflux);
455 
456  /// Construct difference between numflux and Fwd,Bwd
457  Vmath::Vsub(nTracePts, numflux, 1, Fwd, 1, Fwd, 1);
458  Vmath::Vsub(nTracePts, numflux, 1, Bwd, 1, Bwd, 1);
459 
460  /// Calculate the numerical fluxes multipling Fwd, Bwd and
461  /// numflux by the normal advection velocity
462  Vmath::Vmul(nTracePts, Fwd, 1, Vn, 1, Fwd, 1);
463  Vmath::Vmul(nTracePts, Bwd, 1, Vn, 1, Bwd, 1);
464 
465  m_fields[0]->AddFwdBwdTraceIntegral(Fwd,Bwd,Outarray[i]);
466  }
467  }
468 
469  /**
470  * Extrapolate field using equally time spaced field un,un-1,un-2, (at
471  * dt intervals) to time n+t at order Ord
472  */
474  NekDouble toff,
475  Array< OneD, Array<OneD, NekDouble> > &ExtVel)
476  {
477  int npts = m_fields[0]->GetTotPoints();
478  int nvel = m_velocity.size();
479  int i,j;
481 
482  int ord = m_intSteps;
483 
484  // calculate Lagrange interpolants
485  Vmath::Fill(4,1.0,l,1);
486 
487  for(i = 0; i <= ord; ++i)
488  {
489  for(j = 0; j <= ord; ++j)
490  {
491  if(i != j)
492  {
493  l[i] *= (j*m_timestep+toff);
494  l[i] /= (j*m_timestep-i*m_timestep);
495  }
496  }
497  }
498 
499  for(i = 0; i < nvel; ++i)
500  {
501  Vmath::Smul(npts,l[0],m_previousVelFields[i],1,ExtVel[i],1);
502 
503  for(j = 1; j <= ord; ++j)
504  {
505  Blas::Daxpy(npts,l[j],m_previousVelFields[j*nvel+i],1,
506  ExtVel[i],1);
507  }
508  }
509  }
510 
511  /**
512  *
513  */
515  int HBCdata,
516  NekDouble kinvis,
519  {
520  Vmath::Smul(HBCdata,-kinvis,Q,1,Q,1);
521  }
522 
524  {
525  return m_subStepIntegrationScheme->GetName();
526  }
527 
528 }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
Definition: ErrorUtil.hpp:250
Array< OneD, Array< OneD, NekDouble > > m_pressureHBCs
Storage for current and previous levels of high order pressure boundary conditions.
Definition: Extrapolate.h:259
int m_bnd_dim
bounday dimensionality
Definition: Extrapolate.h:236
void CopyPressureHBCsToPbndExp(void)
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Velocity fields.
Definition: Extrapolate.h:217
Array< OneD, Array< OneD, NekDouble > > m_iprodnormvel
Storage for current and previous levels of the inner product of normal velocity.
Definition: Extrapolate.h:262
Array< OneD, NekDouble > GetMaxStdVelocity(const Array< OneD, Array< OneD, NekDouble > > inarray)
int m_intSteps
Maximum points used in pressure BC evaluation.
Definition: Extrapolate.h:254
void CalcNeumannPressureBCs(const Array< OneD, const Array< OneD, NekDouble > > &fields, const Array< OneD, const Array< OneD, NekDouble > > &N, NekDouble kinvis)
Definition: Extrapolate.h:186
void IProductNormVelocityOnHBC(const Array< OneD, const Array< OneD, NekDouble > > &Vel, Array< OneD, NekDouble > &IprodVn)
NekDouble m_timestep
Definition: Extrapolate.h:256
void ExtrapolateArray(Array< OneD, Array< OneD, NekDouble > > &array)
std::vector< SolverUtils::ForcingSharedPtr > m_forcing
Definition: Extrapolate.h:228
SolverUtils::AdvectionSharedPtr m_advObject
Definition: Extrapolate.h:226
Array< OneD, int > m_velocity
int which identifies which components of m_fields contains the velocity (u,v,w);
Definition: Extrapolate.h:224
Array< OneD, Array< OneD, NekDouble > > m_traceNormals
Definition: Extrapolate.h:264
int m_pressureCalls
number of times the high-order pressure BCs have been called
Definition: Extrapolate.h:245
LibUtilities::SessionReaderSharedPtr m_session
Definition: Extrapolate.h:209
void CalcOutflowBCs(const Array< OneD, const Array< OneD, NekDouble > > &fields, NekDouble kinvis)
LibUtilities::CommSharedPtr m_comm
Definition: Extrapolate.h:211
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
Definition: NekFactory.hpp:200
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
Definition: NekFactory.hpp:145
void DefineProjection(FuncPointerT func, ObjectPointerT obj)
void DefineOdeRhs(FuncPointerT func, ObjectPointerT obj)
An abstract base class encapsulating the concept of advection of a vector field.
Definition: Advection.h:73
virtual void v_SubStepAdvance(int nstep, NekDouble time)
LibUtilities::TimeIntegrationSchemeOperators m_subStepIntegrationOps
virtual void v_SubStepSetPressureBCs(const Array< OneD, const Array< OneD, NekDouble > > &inarray, NekDouble Aii_Dt, NekDouble kinvis)
virtual std::string v_GetSubStepName(void)
LibUtilities::TimeIntegrationSchemeSharedPtr m_subStepIntegrationScheme
void SubStepExtrapolateField(NekDouble toff, Array< OneD, Array< OneD, NekDouble > > &ExtVel)
static std::string className
Name of class.
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.
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)
LibUtilities::TimeIntegrationSchemeSharedPtr m_intScheme
virtual void v_SubSteppingTimeIntegration(const LibUtilities::TimeIntegrationSchemeSharedPtr &IntegrationScheme)
void AddAdvectionPenaltyFlux(const Array< OneD, const Array< OneD, NekDouble > > &velfield, const Array< OneD, const Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, NekDouble > > &outarray)
virtual void v_SubStepSaveFields(int nstep)
SubSteppingExtrapolate(const LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields, MultiRegions::ExpListSharedPtr pPressure, const Array< OneD, int > pVel, const SolverUtils::AdvectionSharedPtr advObject)
virtual void v_MountHOPBCs(int HBCdata, NekDouble kinvis, Array< OneD, NekDouble > &Q, Array< OneD, const NekDouble > &Advection)
virtual void v_EvaluatePressureBCs(const Array< OneD, const Array< OneD, NekDouble > > &fields, const Array< OneD, const Array< OneD, NekDouble > > &N, NekDouble kinvis)
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:167
TimeIntegrationSchemeFactory & GetTimeIntegrationSchemeFactory()
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< TimeIntegrationScheme > TimeIntegrationSchemeSharedPtr
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:291
The above copyright notice and this permission notice shall be included.
Definition: CoupledSolver.h:1
ExtrapolateFactory & GetExtrapolateFactory()
Definition: Extrapolate.cpp:49
double NekDouble
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:192
void Neg(int n, T *x, const int incx)
Negate x = -x.
Definition: Vmath.cpp:461
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:992
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:513
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:225
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
Definition: Vmath.cpp:45
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1199
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:372