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 [[maybe_unused]] int coll_phys_offset) override
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 [[maybe_unused]] int coll_phys_offset) override
147 {
148 if (factors == m_factors)
149 {
150 return;
151 }
152
154
155 // Set scaling factor for the PhysInterp1DScaled function
156 [[maybe_unused]] auto x = factors.find(StdRegions::eFactorConst);
157 ASSERTL1(
158 x != factors.end(),
159 "Constant factor not defined: " +
160 std::string(
162 }
163
164protected:
166 StdRegions::FactorMap m_factors; // Initially, PhysInterp1DScaled was taking
167 // as input a single scaling factor
168 // This single scaling factor will be expressed into a matrix where each
169 // element has the same value so that matrix - vector multiplication
170 // optimization by BLAS is implemented
171
172private:
174 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
176 : Operator(pCollExp, pGeomData, factors), PhysInterp1DScaled_Helper()
177 {
178 }
179};
180
181/**
182 * @brief PhysInterp1DScaled operator using matrix free operators.
183 */
184
185class PhysInterp1DScaled_MatrixFree final : virtual public Operator,
188{
189public:
191
193 {
194 }
195
197 Array<OneD, NekDouble> &output0,
198 [[maybe_unused]] Array<OneD, NekDouble> &output1,
199 [[maybe_unused]] Array<OneD, NekDouble> &output2,
200 [[maybe_unused]] Array<OneD, NekDouble> &wsp) final
201 {
202 if (m_isPadded)
203 {
204 // copy into padded vector
205 Vmath::Vcopy(m_nIn, input, 1, m_input, 1);
206 // call op
207 (*m_oper)(m_input, m_output);
208 // copy out of padded vector
209 Vmath::Vcopy(m_nOut, m_output, 1, output0, 1);
210 }
211 else
212 {
213 (*m_oper)(input, output0);
214 }
215 }
216
217 void operator()([[maybe_unused]] int dir,
218 [[maybe_unused]] const Array<OneD, const NekDouble> &input,
219 [[maybe_unused]] Array<OneD, NekDouble> &output,
220 [[maybe_unused]] Array<OneD, NekDouble> &wsp) final
221 {
223 "BwdTrans_MatrixFree: Not valid for this operator.");
224 }
225
227 [[maybe_unused]] int coll_phys_offset) override
228 {
229 ASSERTL0(false, "Not valid for this operator.");
230 }
231
232private:
233 std::shared_ptr<MatrixFree::PhysInterp1DScaled> m_oper;
234
236 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
238 : Operator(pCollExp, pGeomData, factors),
239 MatrixFreeOneInOneOut(pCollExp[0]->GetStdExp()->GetNcoeffs(),
240 pCollExp[0]->GetStdExp()->GetTotPoints(),
241 pCollExp.size()),
243 {
244 // Basis vector.
245 const auto dim = pCollExp[0]->GetStdExp()->GetShapeDimension();
246 std::vector<LibUtilities::BasisSharedPtr> basis(dim);
247 for (auto i = 0; i < dim; ++i)
248 {
249 basis[i] = pCollExp[0]->GetBasis(i);
250 }
251
252 // Get shape type
253 auto shapeType = pCollExp[0]->GetStdExp()->DetShapeType();
254
255 // Generate operator string and create operator.
256 std::string op_string = "PhysInterp1DScaled";
257 op_string += MatrixFree::GetOpstring(shapeType, false);
259 op_string, basis, m_nElmtPad);
260
261 m_oper =
262 std::dynamic_pointer_cast<MatrixFree::PhysInterp1DScaled>(oper);
263 ASSERTL0(m_oper, "Failed to cast pointer.");
264 }
265};
266
267/**
268 * @brief PhysInterp1DScaled operator using default StdRegions operator
269 */
270
271class PhysInterp1DScaled_IterPerExp final : virtual public Operator,
273{
274public:
276
278 {
279 }
280
283 [[maybe_unused]] Array<OneD, NekDouble> &output1,
284 [[maybe_unused]] Array<OneD, NekDouble> &output2,
285 [[maybe_unused]] Array<OneD, NekDouble> &wsp) override
286 {
287 const int nCoeffs = m_stdExp->GetNcoeffs();
288 const int nPhys = m_stdExp->GetTotPoints();
290
291 for (int i = 0; i < m_numElmt; ++i)
292 {
293 m_stdExp->BwdTrans(input + i * nCoeffs, tmp = output + i * nPhys);
294 }
295 }
296
297 void operator()([[maybe_unused]] int dir,
298 [[maybe_unused]] const Array<OneD, const NekDouble> &input,
299 [[maybe_unused]] Array<OneD, NekDouble> &output,
300 [[maybe_unused]] Array<OneD, NekDouble> &wsp) final
301 {
302 ASSERTL0(false, "Not valid for this operator.");
303 }
304
306 [[maybe_unused]] int coll_phys_offset) override
307 {
309 }
310
311protected:
312 StdRegions::FactorMap m_factors; // Initially, PhysInterp1DScaled was taking
313 // as input a single scaling factor
314 // This single scaling factor will be expressed into a matrix where each
315 // element has the same value so that matrix - vector multiplication
316 // optimization by BLAS is implemented
317
318private:
320 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
322 : Operator(pCollExp, pGeomData, factors), PhysInterp1DScaled_Helper()
323 {
324 }
325};
326
327/**
328 * @brief PhysInterp1DScaled operator using LocalRegions implementation.
329 */
330class PhysInterp1DScaled_NoCollection final : virtual public Operator,
332{
333public:
335
337 {
338 }
339
342 [[maybe_unused]] Array<OneD, NekDouble> &output1,
343 [[maybe_unused]] Array<OneD, NekDouble> &output2,
344 [[maybe_unused]] Array<OneD, NekDouble> &wsp) override
345 {
346 int cnt{0};
347 int cnt1{0};
349 int dim{m_expList[0]->GetShapeDimension()}; // same as m_expType
350 switch (dim)
351 {
352 case 1:
353 {
355 // the number of points before and after interpolation are the
356 // same for each element inside a single collection
357 int pt0 = m_expList[0]->GetNumPoints(0);
358 int npt0 = (int)pt0 * scale;
359 for (int i = 0; i < m_numElmt; ++i)
360 {
361 // current points key
362 LibUtilities::PointsKey PointsKey0(
363 pt0, m_expList[i]->GetPointsType(0));
364 // get new points key
365 LibUtilities::PointsKey newPointsKey0(
366 npt0, m_expList[i]->GetPointsType(0));
367 // Interpolate points;
368 I0 = LibUtilities::PointsManager()[PointsKey0]->GetI(
369 newPointsKey0);
370
371 Blas::Dgemv('N', npt0, pt0, 1.0, I0->GetPtr().get(), npt0,
372 &input[cnt], 1, 0.0, &output[cnt1], 1);
373 cnt += pt0;
374 cnt1 += npt0;
375 }
376 }
377 break;
378 case 2:
379 {
380 DNekMatSharedPtr I0, I1;
381 // the number of points before and after interpolation are
382 // the same for each element inside a single collection
383 int pt0 = m_expList[0]->GetNumPoints(0);
384 int pt1 = m_expList[0]->GetNumPoints(1);
385 int npt0 = (int)pt0 * scale;
386 int npt1 = (int)pt1 * scale;
387 // workspace declaration
388 Array<OneD, NekDouble> wsp(npt1 * pt0); // fnp0*tnp1
389
390 for (int i = 0; i < m_numElmt; ++i)
391 {
392 // current points key
393 LibUtilities::PointsKey PointsKey0(
394 pt0, m_expList[i]->GetPointsType(0));
395 LibUtilities::PointsKey PointsKey1(
396 pt1, m_expList[i]->GetPointsType(1));
397 // get new points key
398 LibUtilities::PointsKey newPointsKey0(
399 npt0, m_expList[i]->GetPointsType(0));
400 LibUtilities::PointsKey newPointsKey1(
401 npt1, m_expList[i]->GetPointsType(1));
402
403 // Interpolate points;
404 I0 = LibUtilities::PointsManager()[PointsKey0]->GetI(
405 newPointsKey0);
406 I1 = LibUtilities::PointsManager()[PointsKey1]->GetI(
407 newPointsKey1);
408
409 Blas::Dgemm('N', 'T', pt0, npt1, pt1, 1.0, &input[cnt], pt0,
410 I1->GetPtr().get(), npt1, 0.0, wsp.get(), pt0);
411
412 Blas::Dgemm('N', 'N', npt0, npt1, pt0, 1.0,
413 I0->GetPtr().get(), npt0, wsp.get(), pt0, 0.0,
414 &output[cnt1], npt0);
415
416 cnt += pt0 * pt1;
417 cnt1 += npt0 * npt1;
418 }
419 }
420 break;
421 case 3:
422 {
423 DNekMatSharedPtr I0, I1, I2;
424
425 int pt0 = m_expList[0]->GetNumPoints(0);
426 int pt1 = m_expList[0]->GetNumPoints(1);
427 int pt2 = m_expList[0]->GetNumPoints(2);
428 int npt0 = (int)pt0 * scale;
429 int npt1 = (int)pt1 * scale;
430 int npt2 = (int)pt2 * scale;
431 Array<OneD, NekDouble> wsp1(npt0 * npt1 * pt2);
432 Array<OneD, NekDouble> wsp2(npt0 * pt1 * pt2);
433
434 for (int i = 0; i < m_numElmt; ++i)
435 {
436 // current points key
437 LibUtilities::PointsKey PointsKey0(
438 pt0, m_expList[i]->GetPointsType(0));
439 LibUtilities::PointsKey PointsKey1(
440 pt1, m_expList[i]->GetPointsType(1));
441 LibUtilities::PointsKey PointsKey2(
442 pt2, m_expList[i]->GetPointsType(2));
443 // get new points key
444 LibUtilities::PointsKey newPointsKey0(
445 npt0, m_expList[i]->GetPointsType(0));
446 LibUtilities::PointsKey newPointsKey1(
447 npt1, m_expList[i]->GetPointsType(1));
448 LibUtilities::PointsKey newPointsKey2(
449 npt2, m_expList[i]->GetPointsType(2));
450
451 I0 = LibUtilities::PointsManager()[PointsKey0]->GetI(
452 newPointsKey0);
453 I1 = LibUtilities::PointsManager()[PointsKey1]->GetI(
454 newPointsKey1);
455 I2 = LibUtilities::PointsManager()[PointsKey2]->GetI(
456 newPointsKey2);
457
458 // Interpolate points
459 Blas::Dgemm('N', 'N', npt0, pt1 * pt2, pt0, 1.0,
460 I0->GetPtr().get(), npt0, &input[cnt], pt0, 0.0,
461 wsp2.get(), npt0);
462
463 for (int j = 0; j < pt2; j++)
464 {
465 Blas::Dgemm('N', 'T', npt0, npt1, pt1, 1.0,
466 wsp2.get() + j * npt0 * pt1, npt0,
467 I1->GetPtr().get(), npt1, 0.0,
468 wsp1.get() + j * npt0 * npt1, npt0);
469 }
470
471 Blas::Dgemm('N', 'T', npt0 * npt1, npt2, pt2, 1.0,
472 wsp1.get(), npt0 * npt1, I2->GetPtr().get(),
473 npt2, 0.0, &output[cnt1], npt0 * npt1);
474
475 cnt += pt0 * pt1 * pt2;
476 cnt1 += npt0 * npt1 * npt2;
477 }
478 }
479 break;
480 default:
481 {
482 NEKERROR(ErrorUtil::efatal, "This expansion is not set for the "
483 "PhysInterp1DScaled operator.");
484 }
485 break;
486 }
487 }
488 void operator()([[maybe_unused]] int dir,
489 [[maybe_unused]] const Array<OneD, const NekDouble> &input,
490 [[maybe_unused]] Array<OneD, NekDouble> &output,
491 [[maybe_unused]] Array<OneD, NekDouble> &wsp) final
492 {
493 ASSERTL0(false, "Not valid for this operator.");
494 }
495
497 [[maybe_unused]] int coll_phys_offset) override
498 {
501 }
502
503protected:
504 vector<StdRegions::StdExpansionSharedPtr> m_expList;
505 StdRegions::FactorMap m_factors; // Initially, PhysInterp1DScaled was taking
506 // as input a single scaling factor
507 // This single scaling factor will be expressed into a matrix where each
508 // element has the same value so that matrix - vector multiplication
509 // optimization by BLAS is implemented
510
511private:
513 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
515 : Operator(pCollExp, pGeomData, factors), PhysInterp1DScaled_Helper()
516 {
517 m_expList = pCollExp;
519 }
520};
521
522/// Factory initialisation for the PhysInterp1DScaled_NoCollection operators
523OperatorKey PhysInterp1DScaled_NoCollection::m_typeArr[] = {
526 PhysInterp1DScaled_NoCollection::create,
527 "PhysInterp1DScaled_NoCollection_Seg"),
530 PhysInterp1DScaled_NoCollection::create,
531 "PhysInterp1DScaled_NoCollection_Tri"),
534 PhysInterp1DScaled_NoCollection::create,
535 "PhysInterp1DScaled_NoCollection_NodalTri"),
538 PhysInterp1DScaled_NoCollection::create,
539 "PhysInterp1DScaled_NoCollection_Quad"),
542 PhysInterp1DScaled_NoCollection::create,
543 "PhysInterp1DScaled_NoCollection_Tet"),
546 PhysInterp1DScaled_NoCollection::create,
547 "PhysInterp1DScaled_NoCollection_NodalTet"),
550 PhysInterp1DScaled_NoCollection::create,
551 "PhysInterp1DScaled_NoCollection_Pyr"),
554 PhysInterp1DScaled_NoCollection::create,
555 "PhysInterp1DScaled_NoCollection_Prism"),
558 PhysInterp1DScaled_NoCollection::create,
559 "PhysInterp1DScaled_NoCollection_NodalPrism"),
562 PhysInterp1DScaled_NoCollection::create,
563 "PhysInterp1DScaled_NoCollection_Hex"),
564};
565
566} // 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:133
StdRegions::StdExpansionSharedPtr m_stdExp
Definition: Operator.h:188
unsigned int m_numElmt
number of elements that the operator is applied on
Definition: Operator.h:190
unsigned int m_outputSize
number of modes or quadrature points that are taken as output from an operator
Definition: Operator.h:198
unsigned int m_inputSize
number of modes or quadrature points that are passed as input to an operator
Definition: Operator.h:195
PhysInterp1DScaled help class to calculate the size of the collection that is given as an input and a...
void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
PhysInterp1DScaled operator using default StdRegions operator.
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 CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
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)
void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
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
PhysInterp1DScaled operator using LocalRegions implementation.
PhysInterp1DScaled_NoCollection(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of 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.
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
void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
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.
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
Definition: NekFactory.hpp:197
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
Definition: NekFactory.hpp:143
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:115
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:385
ConstFactorMap FactorMap
Definition: StdRegions.hpp:406
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