Nektar++
Loading...
Searching...
No Matches
QuadGeom.cpp
Go to the documentation of this file.
1////////////////////////////////////////////////////////////////////////////////
2//
3// File: QuadGeom.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:
32//
33//
34////////////////////////////////////////////////////////////////////////////////
35
38
44
46{
47
53
58
59QuadGeom::QuadGeom(const int id, std::array<SegGeom *, kNedges> edges,
60 Curve *curve)
61 : Geometry2D(edges[0]->GetVertex(0)->GetCoordim(), curve)
62{
63 int j;
64
66 m_globalID = id;
67
68 /// Copy the edge pointers
69 m_edges = edges;
70
71 for (j = 0; j < kNedges; ++j)
72 {
73 m_eorient[j] =
74 SegGeom::GetEdgeOrientation(*edges[j], *edges[(j + 1) % kNedges]);
75 m_verts[j] =
76 edges[j]->GetVertex(m_eorient[j] == StdRegions::eForwards ? 0 : 1);
77 }
78
79 for (j = 2; j < kNedges; ++j)
80 {
84 }
85
86 m_coordim = edges[0]->GetVertex(0)->GetCoordim();
87 if (m_coordim <= 1)
88 {
89 NEKERROR(ErrorUtil::efatal, "Cannot call function with dim == 1");
90 }
91}
92
94{
95 // From Geometry
98
99 // From QuadGeom
100 m_verts = in.m_verts;
101 m_edges = in.m_edges;
102 for (int i = 0; i < kNedges; i++)
103 {
104 m_eorient[i] = in.m_eorient[i];
105 }
106}
107
109{
110 int nc = 1, d0 = m_manifold[0], d1 = m_manifold[1];
111 if (0 == m_edgeNormal.size())
112 {
115 x[0] = Array<OneD, NekDouble>(3);
116 x[1] = Array<OneD, NekDouble>(3);
117 m_verts[0]->GetCoords(x[0]);
118 int i0 = 1, i1 = 0, direction = 1;
119 for (size_t i = 0; i < m_verts.size(); ++i)
120 {
121 i0 ^= 1;
122 i1 ^= 1;
123 m_verts[(i + 1) % m_verts.size()]->GetCoords(x[i1]);
124 if (m_edges[i]->GetXmap()->GetBasis(0)->GetNumModes() > 2)
125 {
126 continue;
127 }
129 m_edgeNormal[i][0] = x[i0][d1] - x[i1][d1];
130 m_edgeNormal[i][1] = x[i1][d0] - x[i0][d0];
131 }
132 if (m_coordim == 3)
133 {
134 for (size_t i = 0; i < m_verts.size(); ++i)
135 {
136 if (m_edgeNormal[i].size() == 2)
137 {
138 m_verts[i]->GetCoords(x[0]);
139 m_verts[(i + 2) % m_verts.size()]->GetCoords(x[1]);
140 if (m_edgeNormal[i][0] * (x[1][d0] - x[0][d0]) <
141 m_edgeNormal[i][1] * (x[0][d1] - x[1][d1]))
142 {
143 direction = -1;
144 }
145 break;
146 }
147 }
148 }
149 if (direction == -1)
150 {
151 for (size_t i = 0; i < m_verts.size(); ++i)
152 {
153 if (m_edgeNormal[i].size() == 2)
154 {
155 m_edgeNormal[i][0] = -m_edgeNormal[i][0];
156 m_edgeNormal[i][1] = -m_edgeNormal[i][1];
157 }
158 }
159 }
160 }
161
162 Array<OneD, NekDouble> vertex(3);
163 for (size_t i = 0; i < m_verts.size(); ++i)
164 {
165 int i1 = (i + 1) % m_verts.size();
166 if (m_verts[i]->GetGlobalID() < m_verts[i1]->GetGlobalID())
167 {
168 m_verts[i]->GetCoords(vertex);
169 }
170 else
171 {
172 m_verts[i1]->GetCoords(vertex);
173 }
174 if (m_edgeNormal[i].size() == 0)
175 {
176 nc = 0; // not sure
177 continue;
178 }
179 if (m_edgeNormal[i][0] * (gloCoord[d0] - vertex[d0]) <
180 m_edgeNormal[i][1] * (vertex[d1] - gloCoord[d1]))
181 {
182 return -1; // outside
183 }
184 }
185 // 3D manifold needs to check the distance
186 if (m_coordim == 3)
187 {
188 nc = 0;
189 }
190 // nc: 1 (side element), 0 (maybe inside), -1 (outside)
191 return nc;
192}
193
195{
196 int order0 = std::max(m_edges[0]->GetXmap()->GetBasis(0)->GetNumModes(),
197 m_edges[2]->GetXmap()->GetBasis(0)->GetNumModes());
198 int order1 = std::max(m_edges[1]->GetXmap()->GetBasis(0)->GetNumModes(),
199 m_edges[3]->GetXmap()->GetBasis(0)->GetNumModes());
200
201 std::array<LibUtilities::BasisKey, 2> basis = {
204 LibUtilities::PointsKey(order0 + 1,
208 LibUtilities::PointsKey(order1 + 1,
210
211 m_xmap = GetStdQuadFactory().CreateInstance(basis);
212}
213
215 const Array<OneD, const NekDouble> &Lcoord)
216{
217 if (m_state != ePtsFilled)
218 {
219 NEKERROR(ErrorUtil::efatal, "Geometry is not in physical space");
220 }
221
222 Array<OneD, NekDouble> tmp(m_xmap->GetTotPoints());
223 m_xmap->BwdTrans(m_coeffs[i], tmp);
224
225 return m_xmap->PhysEvaluate(Lcoord, tmp);
226}
227
229 const QuadGeom &face2,
230 bool doRot, int dir,
231 NekDouble angle,
232 NekDouble tol)
233{
234 return GetFaceOrientation(face1.m_verts, face2.m_verts, doRot, dir, angle,
235 tol);
236}
237
238/**
239 * Calculate the orientation of face2 to face1 (note this is
240 * not face1 to face2!).
241 */
243 std::array<PointGeom *, 4> face1, std::array<PointGeom *, 4> face2,
244 bool doRot, int dir, NekDouble angle, NekDouble tol)
245{
246 int i, j, vmap[4] = {-1, -1, -1, -1};
247
248 if (doRot)
249 {
250 PointGeom rotPt;
251
252 for (i = 0; i < 4; ++i)
253 {
254 rotPt.Rotate((*face1[i]), dir, angle);
255 for (j = 0; j < 4; ++j)
256 {
257 if (rotPt.dist(*face2[j]) < tol)
258 {
259 vmap[j] = i;
260 break;
261 }
262 }
263 }
264 }
265 else
266 {
267
268 NekDouble x, y, z, x1, y1, z1, cx = 0.0, cy = 0.0, cz = 0.0;
269
270 // For periodic faces, we calculate the vector between the centre
271 // points of the two faces. (For connected faces this will be
272 // zero). We can then use this to determine alignment later in the
273 // algorithm.
274 for (i = 0; i < 4; ++i)
275 {
276 cx += (*face2[i])(0) - (*face1[i])(0);
277 cy += (*face2[i])(1) - (*face1[i])(1);
278 cz += (*face2[i])(2) - (*face1[i])(2);
279 }
280 cx /= 4;
281 cy /= 4;
282 cz /= 4;
283
284 // Now construct a mapping which takes us from the vertices of one
285 // face to the other. That is, vertex j of face2 corresponds to
286 // vertex vmap[j] of face1.
287 for (i = 0; i < 4; ++i)
288 {
289 x = (*face1[i])(0);
290 y = (*face1[i])(1);
291 z = (*face1[i])(2);
292 for (j = 0; j < 4; ++j)
293 {
294 x1 = (*face2[j])(0) - cx;
295 y1 = (*face2[j])(1) - cy;
296 z1 = (*face2[j])(2) - cz;
297 if (sqrt((x1 - x) * (x1 - x) + (y1 - y) * (y1 - y) +
298 (z1 - z) * (z1 - z)) < 1e-8)
299 {
300 vmap[j] = i;
301 break;
302 }
303 }
304 }
305 }
306
307 // Use the mapping to determine the eight alignment options between
308 // faces.
309 if (vmap[1] == (vmap[0] + 1) % 4)
310 {
311 switch (vmap[0])
312 {
313 case 0:
315 break;
316 case 1:
318 break;
319 case 2:
321 break;
322 case 3:
324 break;
325 }
326 }
327 else
328 {
329 switch (vmap[0])
330 {
331 case 0:
333 break;
334 case 1:
336 break;
337 case 2:
339 break;
340 case 3:
342 break;
343 }
344 }
345 NEKERROR(ErrorUtil::efatal, "unable to determine face orientation");
347}
348
349/**
350 * Set up GeoFac for this geometry using Coord quadrature distribution
351 */
353{
354 if (!m_setupState)
355 {
357 }
359
360 GeomType Gtype = eRegular;
361
362 // We will first check whether we have a regular or deformed
363 // geometry. We will define regular as those cases where the
364 // Jacobian and the metric terms of the derivative are constants
365 // (i.e. not coordinate dependent)
366
367 // Check to see if expansions are linear
368 // If not linear => deformed geometry
369 if ((m_xmap->GetBasisNumModes(0) != 2) ||
370 (m_xmap->GetBasisNumModes(1) != 2))
371 {
372 Gtype = eDeformed;
373 }
374
375 // For linear expansions, the mapping from standard to local
376 // element is given by the relation:
377 // x_i = 0.25 * [ ( x_i^A + x_i^B + x_i^C + x_i^D) +
378 // (-x_i^A + x_i^B + x_i^C - x_i^D)*xi_1 +
379 // (-x_i^A - x_i^B + x_i^C + x_i^D)*xi_2 +
380 // ( x_i^A - x_i^B + x_i^C - x_i^D)*xi_1*xi_2 ]
381 //
382 // The jacobian of the transformation and the metric terms
383 // dxi_i/dx_j, involve only terms of the form dx_i/dxi_j (both
384 // for coordim == 2 or 3). Inspecting the formula above, it can
385 // be appreciated that the derivatives dx_i/dxi_j will be
386 // constant, if the coefficient of the non-linear term is zero.
387 //
388 // That is why for regular geometry, we require
389 //
390 // x_i^A - x_i^B + x_i^C - x_i^D = 0
391 //
392 // or equivalently
393 //
394 // x_i^A - x_i^B = x_i^D - x_i^C
395 //
396 // This corresponds to quadrilaterals which are paralellograms.
398 m_manifold[0] = 0;
399 m_manifold[1] = 1;
400 if (m_coordim == 3)
401 {
402 PointGeom e01, e21, norm;
403 e01.Sub(*m_verts[0], *m_verts[1]);
404 e21.Sub(*m_verts[3], *m_verts[1]);
405 norm.Mult(e01, e21);
406 int tmpi = 0;
407 double tmp = std::fabs(norm[0]);
408 if (tmp < fabs(norm[1]))
409 {
410 tmp = fabs(norm[1]);
411 tmpi = 1;
412 }
413 if (tmp < fabs(norm[2]))
414 {
415 tmpi = 2;
416 }
417 m_manifold[0] = (tmpi + 1) % 3;
418 m_manifold[1] = (tmpi + 2) % 3;
419 m_manifold[2] = (tmpi + 3) % 3;
420 }
421
422 if (Gtype == eRegular)
423 {
425 for (int i = 0; i < m_verts.size(); ++i)
426 {
427 verts[i] = Array<OneD, NekDouble>(3);
428 m_verts[i]->GetCoords(verts[i]);
429 }
430 // a00 + a01 xi1 + a02 xi2 + a03 xi1 xi2
431 // a10 + a11 xi1 + a12 xi2 + a03 xi1 xi2
433 for (int i = 0; i < 2; i++)
434 {
435 unsigned int d = m_manifold[i];
437 // Karniadakis, Sherwin 2005, Appendix D
438 NekDouble A = verts[0][d];
439 NekDouble B = verts[1][d];
440 NekDouble D = verts[2][d];
441 NekDouble C = verts[3][d];
442 m_isoParameter[i][0] = 0.25 * (A + B + C + D); // 1
443 m_isoParameter[i][1] = 0.25 * (-A + B - C + D); // xi1
444 m_isoParameter[i][2] = 0.25 * (-A - B + C + D); // xi2
445 m_isoParameter[i][3] = 0.25 * (A - B - C + D); // xi1*xi2
446 NekDouble tmp =
447 fabs(m_isoParameter[i][1]) + fabs(m_isoParameter[i][2]);
448 if (fabs(m_isoParameter[i][3]) > tmp * NekConstants::kNekZeroTol)
449 {
450 Gtype = eDeformed;
451 }
452 }
453 }
454
455 if (Gtype == eRegular)
456 {
458 }
459 else if (m_straightEdge)
460 {
462 }
463
464 return Gtype;
465}
466
475
476/**
477 * Note verts and edges are listed according to anticlockwise
478 * convention but points in _coeffs have to be in array format from
479 * left to right.
480 */
482{
483 // check to see if geometry structure is already filled
484 if (m_state != ePtsFilled)
485 {
486 int i, j, k;
487 int nEdgeCoeffs;
488
489 if (m_curve)
490 {
491 int npts = m_curve->m_points.size();
492 int nEdgePts = (int)sqrt(static_cast<NekDouble>(npts));
493 Array<OneD, NekDouble> tmp(npts);
494 Array<OneD, NekDouble> tmp2(m_xmap->GetTotPoints());
495 LibUtilities::PointsKey curveKey(nEdgePts, m_curve->m_ptype);
496
497 // Sanity checks:
498 // - Curved faces should have square number of points;
499 // - Each edge should have sqrt(npts) points.
500 ASSERTL0(nEdgePts * nEdgePts == npts,
501 "NUMPOINTS should be a square number in"
502 " quadrilteral " +
503 std::to_string(m_globalID));
504
505 for (i = 0; i < kNedges; ++i)
506 {
507 ASSERTL0(m_edges[i]->GetXmap()->GetNcoeffs() == nEdgePts,
508 "Number of edge points does not correspond to "
509 "number of face points in quadrilateral " +
510 std::to_string(m_globalID));
511 }
512
513 for (i = 0; i < m_coordim; ++i)
514 {
515 for (j = 0; j < npts; ++j)
516 {
517 tmp[j] = (m_curve->m_points[j]->GetPtr())[i];
518 }
519
520 // Interpolate m_curve points to GLL points
521 LibUtilities::Interp2D(curveKey, curveKey, tmp,
522 m_xmap->GetBasis(0)->GetPointsKey(),
523 m_xmap->GetBasis(1)->GetPointsKey(),
524 tmp2);
525
526 // Forwards transform to get coefficient space.
527 m_xmap->FwdTrans(tmp2, m_coeffs[i]);
528 }
529 }
530
531 // Now fill in edges.
533 Array<OneD, int> signArray;
534
535 for (i = 0; i < kNedges; i++)
536 {
537 m_edges[i]->FillGeom();
538 m_xmap->GetTraceToElementMap(i, mapArray, signArray, m_eorient[i]);
539
540 nEdgeCoeffs = m_edges[i]->GetXmap()->GetNcoeffs();
541
542 for (j = 0; j < m_coordim; j++)
543 {
544 for (k = 0; k < nEdgeCoeffs; k++)
545 {
546 m_coeffs[j][mapArray[k]] =
547 signArray[k] * (m_edges[i]->GetCoeffs(j))[k];
548 }
549 }
550 }
551
553 }
554}
555
557{
558 int i0, i1, j1, j2;
559 if (fabs(m_isoParameter[0][3]) >= fabs(m_isoParameter[1][3]))
560 {
561 i0 = 0;
562 i1 = 1;
563 }
564 else
565 {
566 i1 = 0;
567 i0 = 1;
568 m_straightEdge |= 2;
569 }
570 NekDouble gamma = m_isoParameter[i1][3] / m_isoParameter[i0][3];
571 std::vector<NekDouble> c(3);
572 for (int i = 0; i < 3; ++i)
573 {
574 c[i] = m_isoParameter[i1][i] - gamma * m_isoParameter[i0][i];
575 }
576 if (fabs(c[1]) >= fabs(c[2]))
577 {
578 j1 = 1;
579 j2 = 2;
580 }
581 else
582 {
583 j1 = 2;
584 j2 = 1;
585 m_straightEdge |= 4;
586 }
587 NekDouble beta = c[j2] / c[j1];
588 if (i0 == 1)
589 {
591 }
592 if (j1 == 2)
593 {
594 NekDouble temp = m_isoParameter[0][j1];
595 m_isoParameter[0][j1] = m_isoParameter[0][j2];
596 m_isoParameter[0][j2] = temp;
597 }
598 m_isoParameter[0][2] -= m_isoParameter[0][1] * beta;
599 m_isoParameter[1][0] = c[0];
600 m_isoParameter[1][1] = 1. / c[j1];
601 m_isoParameter[1][2] = beta;
602 m_isoParameter[1][3] = gamma;
603}
604
605int QuadGeom::v_GetDir(const int i, [[maybe_unused]] const int j) const
606{
607 return i % 2;
608}
609
610void QuadGeom::v_Reset(CurveMap &curvedEdges, CurveMap &curvedFaces)
611{
612 Geometry::v_Reset(curvedEdges, curvedFaces);
613 CurveMap::iterator it = curvedFaces.find(m_globalID);
614
615 if (it != curvedFaces.end())
616 {
617 m_curve = it->second.get();
618 }
619
620 for (int i = 0; i < 4; ++i)
621 {
622 m_edges[i]->Reset(curvedEdges, curvedFaces);
623 }
624
625 SetUpXmap();
626 SetUpCoeffs(m_xmap->GetNcoeffs());
627}
628
630{
631 if (!m_setupState)
632 {
633 for (int i = 0; i < 4; ++i)
634 {
635 m_edges[i]->Setup();
636 }
637 SetUpXmap();
638 SetUpCoeffs(m_xmap->GetNcoeffs());
639
640 // Check to see if expansions are linear
641 m_straightEdge = 1;
642 if ((m_xmap->GetBasisNumModes(0) != 2) ||
643 (m_xmap->GetBasisNumModes(1) != 2))
644 {
645 m_straightEdge = 0;
646 }
647
648 m_setupState = true;
649 }
650}
651
652} // namespace Nektar::SpatialDomains
#define ASSERTL0(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
Describes the specification for a Basis.
Definition Basis.h:45
Defines a specification for a set of points.
Definition Points.h:50
static std::unique_ptr< DataType, UniquePtrDeleter > AllocateUniquePtr(const Args &...args)
2D geometry information
Definition Geometry2D.h:50
Array< OneD, Array< OneD, NekDouble > > m_edgeNormal
Definition Geometry2D.h:69
bool m_setupState
Wether or not the setup routines have been run.
Definition Geometry.h:190
GeomState m_state
Enumeration to dictate whether coefficients are filled.
Definition Geometry.h:188
void SetUpCoeffs(const int nCoeffs)
Initialise the Geometry::m_coeffs array.
Definition Geometry.h:694
Array< OneD, Array< OneD, NekDouble > > m_isoParameter
Definition Geometry.h:199
virtual void v_Reset(CurveMap &curvedEdges, CurveMap &curvedFaces)
Reset this geometry object: unset the current state, zero Geometry::m_coeffs and remove allocated Geo...
Definition Geometry.cpp:366
int GetGlobalID(void) const
Get the ID of this object.
Definition Geometry.h:314
std::vector< Array< OneD, NekDouble > > m_coeffs
Array containing expansion coefficients of m_xmap.
Definition Geometry.h:196
LibUtilities::ShapeType m_shapeType
Type of shape.
Definition Geometry.h:192
StdRegions::StdExpansionSharedPtr m_xmap
mapping containing isoparametric transformation.
Definition Geometry.h:186
StdRegions::StdExpansionSharedPtr GetXmap() const
Return the mapping object Geometry::m_xmap that represents the coordinate transformation from standar...
Definition Geometry.h:440
int m_coordim
Coordinate dimension of this geometry object.
Definition Geometry.h:184
void Sub(PointGeom &a, PointGeom &b)
void Mult(PointGeom &a, PointGeom &b)
_this = a x b
void Rotate(PointGeom &a, int dir, NekDouble angle)
_this = rotation of a by angle 'angle' around axis dir
NekDouble dist(PointGeom &a)
return distance between this and input a
std::array< PointGeom *, kNverts > m_verts
Definition QuadGeom.h:120
void v_Reset(CurveMap &curvedEdges, CurveMap &curvedFaces) override
Reset this geometry object: unset the current state, zero Geometry::m_coeffs and remove allocated Geo...
Definition QuadGeom.cpp:610
static StdRegions::Orientation GetFaceOrientation(const QuadGeom &face1, const QuadGeom &face2, bool doRot=false, int dir=0, NekDouble angle=0.0, NekDouble tol=1e-8)
Get the orientation of face1.
Definition QuadGeom.cpp:228
std::array< StdRegions::Orientation, kNedges > m_eorient
Definition QuadGeom.h:122
NekDouble v_GetCoord(const int i, const Array< OneD, const NekDouble > &Lcoord) override
Given local collapsed coordinate Lcoord, return the value of physical coordinate in direction i.
Definition QuadGeom.cpp:214
GeomFactorsUniquePtr v_GenGeomFactors(LibUtilities::PointsKeyVector &keyTgt) override
Used by Expansion to generate associated GeomFactors.
Definition QuadGeom.cpp:467
std::array< SegGeom *, kNedges > m_edges
Definition QuadGeom.h:121
int v_GetDir(const int faceidx, const int facedir) const override
Returns the element coordinate direction corresponding to a given face coordinate direction.
Definition QuadGeom.cpp:605
int v_AllLeftCheck(const Array< OneD, const NekDouble > &gloCoord) override
Definition QuadGeom.cpp:108
GeomType v_CalcGeomType() override
Definition QuadGeom.cpp:352
static StdRegions::Orientation GetEdgeOrientation(const SegGeom &edge1, const SegGeom &edge2)
Get the orientation of edge1.
Definition SegGeom.cpp:211
A simple factory for Xmap objects that is based on the element type, the basis and quadrature selecti...
void Interp2D(const BasisKey &fbasis0, const BasisKey &fbasis1, const Array< OneD, const NekDouble > &from, const BasisKey &tbasis0, const BasisKey &tbasis1, Array< OneD, NekDouble > &to)
this function interpolates a 2D function evaluated at the quadrature points of the 2D basis,...
Definition Interp.cpp:101
std::vector< PointsKey > PointsKeyVector
Definition Points.h:313
@ beta
Gauss Radau pinned at x=-1,.
Definition PointsType.h:59
@ eGaussLobattoLegendre
1D Gauss-Lobatto-Legendre quadrature points
Definition PointsType.h:51
@ eModified_A
Principle Modified Functions .
Definition BasisType.h:48
static const NekDouble kNekZeroTol
unique_ptr_objpool< GeomFactors > GeomFactorsUniquePtr
Definition Geometry.h:62
std::map< int, CurveUniquePtr > CurveMap
Definition Geometry.h:71
GeomType
Indicates the type of element geometry.
@ eRegular
Geometry is straight-sided with constant geometric factors.
@ eDeformed
Geometry is curved or has non-constant factors.
XmapFactory< StdRegions::StdQuadExp, 2 > & GetStdQuadFactory()
Definition QuadGeom.cpp:48
@ ePtsFilled
Geometric information has been generated.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition Vmath.hpp:825
scalarT< T > sqrt(scalarT< T > in)
Definition scalar.hpp:290
LibUtilities::PointsType m_ptype
Points distribution of this curve.
Definition Curve.hpp:57
std::vector< PointGeom * > m_points
Points along the curve.
Definition Curve.hpp:53