Nektar++
PhysInterp1DScaled.cpp
Go to the documentation of this file.
1///////////////////////////////////////////////////////////////////////////////
2//
3// File: PhysInterp1DScaled.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: PhysInterp1DScaled operator implementations
32//
33///////////////////////////////////////////////////////////////////////////////
34
40#include <MatrixFreeOps/Operator.hpp>
41
42using namespace std;
43
44namespace Nektar::Collections
45{
46
54
55/**
56 * @brief PhysInterp1DScaled help class to calculate the size of the collection
57 * that is given as an input and as an output to the PhysInterp1DScaled
58 * Operator. The size evaluation takes into account that both the input and the
59 * output array belong to the physical space and that the output array can have
60 * either a larger, or a smaller size than the input array
61 */
62class PhysInterp1DScaled_Helper : virtual public Operator
63{
64public:
66
67 {
68 if (factors == m_factors)
69 {
70 return;
71 }
73
74 // Set scaling factor for the PhysInterp1DScaled function
75 [[maybe_unused]] auto x = factors.find(StdRegions::eFactorConst);
77 x != factors.end(),
78 "Constant factor not defined: " +
79 std::string(
81 }
82
83protected:
85 {
86 NekDouble scale; // declaration of the scaling factor to be used for the
87 // output size
89 {
91 }
92 else
93 {
94 scale = 1.5;
95 }
96
97 // expect input to be number of elements by the number of quad points
98 m_inputSize = m_numElmt * m_stdExp->GetTotPoints();
99 // expect input to be number of elements by the number of quad points
100 int shape_dimension = m_stdExp->GetShapeDimension();
101 m_outputSize = m_numElmt; // initializing m_outputSize
102 for (int i = 0; i < shape_dimension; ++i)
103 {
104 m_outputSize *= (int)(m_stdExp->GetNumPoints(i) * scale);
105 }
106 }
108 m_factors; // map for storing the scaling factor of the operator
109};
110
111/**
112 * @brief PhysInterp1DScaled operator using standard matrix approach. Currently,
113 * it is an identical copy of the BwdTrans operator.
114 */
115
116class PhysInterp1DScaled_StdMat final : virtual public Operator,
118{
119public:
122 {
123 }
124
127 [[maybe_unused]] Array<OneD, NekDouble> &output1,
128 [[maybe_unused]] Array<OneD, NekDouble> &output2,
129 [[maybe_unused]] Array<OneD, NekDouble> &wsp) override
130 {
131 Blas::Dgemm('N', 'N', m_mat->GetRows(), m_numElmt, m_mat->GetColumns(),
132 1.0, m_mat->GetRawPtr(), m_mat->GetRows(), input.get(),
133 m_stdExp->GetNcoeffs(), 0.0, output.get(),
134 m_stdExp->GetTotPoints());
135 }
136
137 void operator()([[maybe_unused]] int dir,
138 [[maybe_unused]] const Array<OneD, const NekDouble> &input,
139 [[maybe_unused]] Array<OneD, NekDouble> &output,
140 [[maybe_unused]] Array<OneD, NekDouble> &wsp) final
141 {
142 ASSERTL0(false, "Not valid for this operator.");
143 }
144
146 {
147 if (factors == m_factors)
148 {
149 return;
150 }
151
153
154 // Set scaling factor for the PhysInterp1DScaled function
155 [[maybe_unused]] auto x = factors.find(StdRegions::eFactorConst);
156 ASSERTL1(
157 x != factors.end(),
158 "Constant factor not defined: " +
159 std::string(
161 }
162
163protected:
165 StdRegions::FactorMap m_factors; // Initially, PhysInterp1DScaled was taking
166 // as input a single scaling factor
167 // This single scaling factor will be expressed into a matrix where each
168 // element has the same value so that matrix - vector multiplication
169 // optimization by BLAS is implemented
170
171private:
173 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
175 : Operator(pCollExp, pGeomData, factors), PhysInterp1DScaled_Helper()
176 {
177 }
178};
179
180/**
181 * @brief PhysInterp1DScaled operator using matrix free operators.
182 */
183
184class PhysInterp1DScaled_MatrixFree final : virtual public Operator,
187{
188public:
190
192 {
193 }
194
196 Array<OneD, NekDouble> &output0,
197 [[maybe_unused]] Array<OneD, NekDouble> &output1,
198 [[maybe_unused]] Array<OneD, NekDouble> &output2,
199 [[maybe_unused]] Array<OneD, NekDouble> &wsp) final
200 {
201 if (m_isPadded)
202 {
203 // copy into padded vector
204 Vmath::Vcopy(m_nIn, input, 1, m_input, 1);
205 // call op
206 (*m_oper)(m_input, m_output);
207 // copy out of padded vector
208 Vmath::Vcopy(m_nOut, m_output, 1, output0, 1);
209 }
210 else
211 {
212 (*m_oper)(input, output0);
213 }
214 }
215
216 void operator()([[maybe_unused]] int dir,
217 [[maybe_unused]] const Array<OneD, const NekDouble> &input,
218 [[maybe_unused]] Array<OneD, NekDouble> &output,
219 [[maybe_unused]] Array<OneD, NekDouble> &wsp) final
220 {
222 "BwdTrans_MatrixFree: Not valid for this operator.");
223 }
224
225 void UpdateFactors([[maybe_unused]] StdRegions::FactorMap factors) override
226 {
227 ASSERTL0(false, "Not valid for this operator.");
228 }
229
230private:
231 std::shared_ptr<MatrixFree::PhysInterp1DScaled> m_oper;
232
234 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
236 : Operator(pCollExp, pGeomData, factors),
237 MatrixFreeOneInOneOut(pCollExp[0]->GetStdExp()->GetNcoeffs(),
238 pCollExp[0]->GetStdExp()->GetTotPoints(),
239 pCollExp.size()),
241 {
242 // Basis vector.
243 const auto dim = pCollExp[0]->GetStdExp()->GetShapeDimension();
244 std::vector<LibUtilities::BasisSharedPtr> basis(dim);
245 for (auto i = 0; i < dim; ++i)
246 {
247 basis[i] = pCollExp[0]->GetBasis(i);
248 }
249
250 // Get shape type
251 auto shapeType = pCollExp[0]->GetStdExp()->DetShapeType();
252
253 // Generate operator string and create operator.
254 std::string op_string = "PhysInterp1DScaled";
255 op_string += MatrixFree::GetOpstring(shapeType, false);
257 op_string, basis, m_nElmtPad);
258
259 m_oper =
260 std::dynamic_pointer_cast<MatrixFree::PhysInterp1DScaled>(oper);
261 ASSERTL0(m_oper, "Failed to cast pointer.");
262 }
263};
264
265/**
266 * @brief PhysInterp1DScaled operator using default StdRegions operator
267 */
268
269class PhysInterp1DScaled_IterPerExp final : virtual public Operator,
271{
272public:
274
276 {
277 }
278
281 [[maybe_unused]] Array<OneD, NekDouble> &output1,
282 [[maybe_unused]] Array<OneD, NekDouble> &output2,
283 [[maybe_unused]] Array<OneD, NekDouble> &wsp) override
284 {
285 const int nCoeffs = m_stdExp->GetNcoeffs();
286 const int nPhys = m_stdExp->GetTotPoints();
288
289 for (int i = 0; i < m_numElmt; ++i)
290 {
291 m_stdExp->BwdTrans(input + i * nCoeffs, tmp = output + i * nPhys);
292 }
293 }
294
295 void operator()([[maybe_unused]] int dir,
296 [[maybe_unused]] const Array<OneD, const NekDouble> &input,
297 [[maybe_unused]] Array<OneD, NekDouble> &output,
298 [[maybe_unused]] Array<OneD, NekDouble> &wsp) final
299 {
300 ASSERTL0(false, "Not valid for this operator.");
301 }
302
303 void UpdateFactors([[maybe_unused]] StdRegions::FactorMap factors) override
304 {
306 }
307
308protected:
309 StdRegions::FactorMap m_factors; // Initially, PhysInterp1DScaled was taking
310 // as input a single scaling factor
311 // This single scaling factor will be expressed into a matrix where each
312 // element has the same value so that matrix - vector multiplication
313 // optimization by BLAS is implemented
314
315private:
317 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
319 : Operator(pCollExp, pGeomData, factors), PhysInterp1DScaled_Helper()
320 {
321 }
322};
323
324/**
325 * @brief PhysInterp1DScaled operator using LocalRegions implementation.
326 */
327class PhysInterp1DScaled_NoCollection final : virtual public Operator,
329{
330public:
332
334 {
335 }
336
339 [[maybe_unused]] Array<OneD, NekDouble> &output1,
340 [[maybe_unused]] Array<OneD, NekDouble> &output2,
341 [[maybe_unused]] Array<OneD, NekDouble> &wsp) override
342 {
343 int cnt{0};
344 int cnt1{0};
346 int dim{m_expList[0]->GetShapeDimension()}; // same as m_expType
347 switch (dim)
348 {
349 case 1:
350 {
352 // the number of points before and after interpolation are the
353 // same for each element inside a single collection
354 int pt0 = m_expList[0]->GetNumPoints(0);
355 int npt0 = (int)pt0 * scale;
356 for (int i = 0; i < m_numElmt; ++i)
357 {
358 // current points key
359 LibUtilities::PointsKey PointsKey0(
360 pt0, m_expList[i]->GetPointsType(0));
361 // get new points key
362 LibUtilities::PointsKey newPointsKey0(
363 npt0, m_expList[i]->GetPointsType(0));
364 // Interpolate points;
365 I0 = LibUtilities::PointsManager()[PointsKey0]->GetI(
366 newPointsKey0);
367
368 Blas::Dgemv('N', npt0, pt0, 1.0, I0->GetPtr().get(), npt0,
369 &input[cnt], 1, 0.0, &output[cnt1], 1);
370 cnt += pt0;
371 cnt1 += npt0;
372 }
373 }
374 break;
375 case 2:
376 {
377 DNekMatSharedPtr I0, I1;
378 // the number of points before and after interpolation are
379 // the same for each element inside a single collection
380 int pt0 = m_expList[0]->GetNumPoints(0);
381 int pt1 = m_expList[0]->GetNumPoints(1);
382 int npt0 = (int)pt0 * scale;
383 int npt1 = (int)pt1 * scale;
384 // workspace declaration
385 Array<OneD, NekDouble> wsp(npt1 * pt0); // fnp0*tnp1
386
387 for (int i = 0; i < m_numElmt; ++i)
388 {
389 // current points key
390 LibUtilities::PointsKey PointsKey0(
391 pt0, m_expList[i]->GetPointsType(0));
392 LibUtilities::PointsKey PointsKey1(
393 pt1, m_expList[i]->GetPointsType(1));
394 // get new points key
395 LibUtilities::PointsKey newPointsKey0(
396 npt0, m_expList[i]->GetPointsType(0));
397 LibUtilities::PointsKey newPointsKey1(
398 npt1, m_expList[i]->GetPointsType(1));
399
400 // Interpolate points;
401 I0 = LibUtilities::PointsManager()[PointsKey0]->GetI(
402 newPointsKey0);
403 I1 = LibUtilities::PointsManager()[PointsKey1]->GetI(
404 newPointsKey1);
405
406 Blas::Dgemm('N', 'T', pt0, npt1, pt1, 1.0, &input[cnt], pt0,
407 I1->GetPtr().get(), npt1, 0.0, wsp.get(), pt0);
408
409 Blas::Dgemm('N', 'N', npt0, npt1, pt0, 1.0,
410 I0->GetPtr().get(), npt0, wsp.get(), pt0, 0.0,
411 &output[cnt1], npt0);
412
413 cnt += pt0 * pt1;
414 cnt1 += npt0 * npt1;
415 }
416 }
417 break;
418 case 3:
419 {
420 DNekMatSharedPtr I0, I1, I2;
421
422 int pt0 = m_expList[0]->GetNumPoints(0);
423 int pt1 = m_expList[0]->GetNumPoints(1);
424 int pt2 = m_expList[0]->GetNumPoints(2);
425 int npt0 = (int)pt0 * scale;
426 int npt1 = (int)pt1 * scale;
427 int npt2 = (int)pt2 * scale;
428 Array<OneD, NekDouble> wsp1(npt0 * npt1 * pt2);
429 Array<OneD, NekDouble> wsp2(npt0 * pt1 * pt2);
430
431 for (int i = 0; i < m_numElmt; ++i)
432 {
433 // current points key
434 LibUtilities::PointsKey PointsKey0(
435 pt0, m_expList[i]->GetPointsType(0));
436 LibUtilities::PointsKey PointsKey1(
437 pt1, m_expList[i]->GetPointsType(1));
438 LibUtilities::PointsKey PointsKey2(
439 pt2, m_expList[i]->GetPointsType(2));
440 // get new points key
441 LibUtilities::PointsKey newPointsKey0(
442 npt0, m_expList[i]->GetPointsType(0));
443 LibUtilities::PointsKey newPointsKey1(
444 npt1, m_expList[i]->GetPointsType(1));
445 LibUtilities::PointsKey newPointsKey2(
446 npt2, m_expList[i]->GetPointsType(2));
447
448 I0 = LibUtilities::PointsManager()[PointsKey0]->GetI(
449 newPointsKey0);
450 I1 = LibUtilities::PointsManager()[PointsKey1]->GetI(
451 newPointsKey1);
452 I2 = LibUtilities::PointsManager()[PointsKey2]->GetI(
453 newPointsKey2);
454
455 // Interpolate points
456 Blas::Dgemm('N', 'N', npt0, pt1 * pt2, pt0, 1.0,
457 I0->GetPtr().get(), npt0, &input[cnt], pt0, 0.0,
458 wsp2.get(), npt0);
459
460 for (int j = 0; j < pt2; j++)
461 {
462 Blas::Dgemm('N', 'T', npt0, npt1, pt1, 1.0,
463 wsp2.get() + j * npt0 * pt1, npt0,
464 I1->GetPtr().get(), npt1, 0.0,
465 wsp1.get() + j * npt0 * npt1, npt0);
466 }
467
468 Blas::Dgemm('N', 'T', npt0 * npt1, npt2, pt2, 1.0,
469 wsp1.get(), npt0 * npt1, I2->GetPtr().get(),
470 npt2, 0.0, &output[cnt1], npt0 * npt1);
471
472 cnt += pt0 * pt1 * pt2;
473 cnt1 += npt0 * npt1 * npt2;
474 }
475 }
476 break;
477 default:
478 {
479 NEKERROR(ErrorUtil::efatal, "This expansion is not set for the "
480 "PhysInterp1DScaled operator.");
481 }
482 break;
483 }
484 }
485 void operator()([[maybe_unused]] int dir,
486 [[maybe_unused]] const Array<OneD, const NekDouble> &input,
487 [[maybe_unused]] Array<OneD, NekDouble> &output,
488 [[maybe_unused]] Array<OneD, NekDouble> &wsp) final
489 {
490 ASSERTL0(false, "Not valid for this operator.");
491 }
492
493 void UpdateFactors([[maybe_unused]] StdRegions::FactorMap factors) override
494 {
497 }
498
499protected:
500 vector<StdRegions::StdExpansionSharedPtr> m_expList;
501 StdRegions::FactorMap m_factors; // Initially, PhysInterp1DScaled was taking
502 // as input a single scaling factor
503 // This single scaling factor will be expressed into a matrix where each
504 // element has the same value so that matrix - vector multiplication
505 // optimization by BLAS is implemented
506
507private:
509 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
511 : Operator(pCollExp, pGeomData, factors), PhysInterp1DScaled_Helper()
512 {
513 m_expList = pCollExp;
515 }
516};
517
518/// Factory initialisation for the PhysInterp1DScaled_NoCollection operators
519OperatorKey PhysInterp1DScaled_NoCollection::m_typeArr[] = {
522 PhysInterp1DScaled_NoCollection::create,
523 "PhysInterp1DScaled_NoCollection_Seg"),
526 PhysInterp1DScaled_NoCollection::create,
527 "PhysInterp1DScaled_NoCollection_Tri"),
530 PhysInterp1DScaled_NoCollection::create,
531 "PhysInterp1DScaled_NoCollection_NodalTri"),
534 PhysInterp1DScaled_NoCollection::create,
535 "PhysInterp1DScaled_NoCollection_Quad"),
538 PhysInterp1DScaled_NoCollection::create,
539 "PhysInterp1DScaled_NoCollection_Tet"),
542 PhysInterp1DScaled_NoCollection::create,
543 "PhysInterp1DScaled_NoCollection_NodalTet"),
546 PhysInterp1DScaled_NoCollection::create,
547 "PhysInterp1DScaled_NoCollection_Pyr"),
550 PhysInterp1DScaled_NoCollection::create,
551 "PhysInterp1DScaled_NoCollection_Prism"),
554 PhysInterp1DScaled_NoCollection::create,
555 "PhysInterp1DScaled_NoCollection_NodalPrism"),
558 PhysInterp1DScaled_NoCollection::create,
559 "PhysInterp1DScaled_NoCollection_Hex"),
560};
561
562} // namespace Nektar::Collections
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:208
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
Definition: ErrorUtil.hpp:202
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
Definition: ErrorUtil.hpp:242
#define OPERATOR_CREATE(cname)
Definition: Operator.h:43
unsigned int m_nElmtPad
size after padding
Array< OneD, NekDouble > m_input
padded input/output vectors
Base class for operators on a collection of elements.
Definition: Operator.h:138
StdRegions::StdExpansionSharedPtr m_stdExp
Definition: Operator.h:217
unsigned int m_numElmt
number of elements that the operator is applied on
Definition: Operator.h:219
unsigned int m_outputSize
number of modes or quadrature points that are taken as output from an operator
Definition: Operator.h:227
unsigned int m_inputSize
number of modes or quadrature points that are passed as input to an operator
Definition: Operator.h:224
PhysInterp1DScaled help class to calculate the size of the collection that is given as an input and a...
void UpdateFactors(StdRegions::FactorMap factors) override
Update the supplied factor map.
PhysInterp1DScaled operator using default StdRegions operator.
void UpdateFactors(StdRegions::FactorMap factors) override
Update the supplied factor map.
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) override
Perform operation.
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
PhysInterp1DScaled_IterPerExp(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
PhysInterp1DScaled operator using matrix free operators.
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output0, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
PhysInterp1DScaled_MatrixFree(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
std::shared_ptr< MatrixFree::PhysInterp1DScaled > m_oper
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
void UpdateFactors(StdRegions::FactorMap factors) override
Update the supplied factor map.
PhysInterp1DScaled operator using LocalRegions implementation.
PhysInterp1DScaled_NoCollection(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) override
Perform operation.
void UpdateFactors(StdRegions::FactorMap factors) override
Update the supplied factor map.
vector< StdRegions::StdExpansionSharedPtr > m_expList
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
PhysInterp1DScaled operator using standard matrix approach. Currently, it is an identical copy of the...
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
PhysInterp1DScaled_StdMat(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) override
Perform operation.
void UpdateFactors(StdRegions::FactorMap factors) override
Update the supplied factor map.
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
Defines a specification for a set of points.
Definition: Points.h:50
static void Dgemv(const char &trans, const int &m, const int &n, const double &alpha, const double *a, const int &lda, const double *x, const int &incx, const double &beta, double *y, const int &incy)
BLAS level 2: Matrix vector multiply y = alpha A x plus beta y where A[m x n].
Definition: Blas.hpp:211
static void Dgemm(const char &transa, const char &transb, const int &m, const int &n, const int &k, const double &alpha, const double *a, const int &lda, const double *b, const int &ldb, const double &beta, double *c, const int &ldc)
BLAS level 3: Matrix-matrix multiply C = A x B where op(A)[m x k], op(B)[k x n], C[m x n] DGEMM perfo...
Definition: Blas.hpp:383
std::tuple< LibUtilities::ShapeType, OperatorType, ImplementationType, ExpansionIsNodal > OperatorKey
Key for describing an Operator.
Definition: Operator.h:120
std::shared_ptr< CoalescedGeomData > CoalescedGeomDataSharedPtr
OperatorFactory & GetOperatorFactory()
Returns the singleton Operator factory object.
Definition: Operator.cpp:44
PointsManagerT & PointsManager(void)
const char *const ConstFactorTypeMap[]
Definition: StdRegions.hpp:413
ConstFactorMap FactorMap
Definition: StdRegions.hpp:434
StdRegions::ConstFactorMap factors
std::shared_ptr< DNekMat > DNekMatSharedPtr
Definition: NekTypeDefs.hpp:75
double NekDouble
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.hpp:825
STL namespace.