Nektar++
Loading...
Searching...
No Matches
TriGeom.cpp
Go to the documentation of this file.
1////////////////////////////////////////////////////////////////////////////////
2//
3// File: TriGeom.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
40
44
46{
47
53
58
59TriGeom::TriGeom(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
82
83 m_coordim = edges[0]->GetVertex(0)->GetCoordim();
84 if (m_coordim <= 1)
85 {
86 NEKERROR(ErrorUtil::efatal, "Cannot call function with dim == 1");
87 }
88}
89
91{
92 // From Geometry
94
95 // From TriFaceComponent
97
98 // From TriGeom
99 m_verts = in.m_verts;
100 m_edges = in.m_edges;
101 for (int i = 0; i < kNedges; i++)
102 {
103 m_eorient[i] = in.m_eorient[i];
104 }
105}
106
108{
109 int nc = 1, d0 = m_manifold[0], d1 = m_manifold[1];
110 if (0 == m_edgeNormal.size())
111 {
114 x[0] = Array<OneD, NekDouble>(3);
115 x[1] = Array<OneD, NekDouble>(3);
116 m_verts[0]->GetCoords(x[0]);
117 int i0 = 1, i1 = 0, direction = 1;
118 for (size_t i = 0; i < m_verts.size(); ++i)
119 {
120 i0 ^= 1;
121 i1 ^= 1;
122 m_verts[(i + 1) % m_verts.size()]->GetCoords(x[i1]);
123 if (m_edges[i]->GetXmap()->GetBasis(0)->GetNumModes() > 2)
124 {
125 continue;
126 }
128 m_edgeNormal[i][0] = x[i0][d1] - x[i1][d1];
129 m_edgeNormal[i][1] = x[i1][d0] - x[i0][d0];
130 }
131 if (m_coordim == 3)
132 {
133 for (size_t i = 0; i < m_verts.size(); ++i)
134 {
135 if (m_edgeNormal[i].size() == 2)
136 {
137 m_verts[i]->GetCoords(x[0]);
138 m_verts[(i + 2) % m_verts.size()]->GetCoords(x[1]);
139 if (m_edgeNormal[i][0] * (x[1][d0] - x[0][d0]) <
140 m_edgeNormal[i][1] * (x[0][d1] - x[1][d1]))
141 {
142 direction = -1;
143 }
144 break;
145 }
146 }
147 }
148 if (direction == -1)
149 {
150 for (size_t i = 0; i < m_verts.size(); ++i)
151 {
152 if (m_edgeNormal[i].size() == 2)
153 {
154 m_edgeNormal[i][0] = -m_edgeNormal[i][0];
155 m_edgeNormal[i][1] = -m_edgeNormal[i][1];
156 }
157 }
158 }
159 }
160
161 Array<OneD, NekDouble> vertex(3);
162 for (size_t i = 0; i < m_verts.size(); ++i)
163 {
164 int i1 = (i + 1) % m_verts.size();
165 if (m_verts[i]->GetGlobalID() < m_verts[i1]->GetGlobalID())
166 {
167 m_verts[i]->GetCoords(vertex);
168 }
169 else
170 {
171 m_verts[i1]->GetCoords(vertex);
172 }
173 if (m_edgeNormal[i].size() == 0)
174 {
175 nc = 0; // not sure
176 continue;
177 }
178 if (m_edgeNormal[i][0] * (gloCoord[d0] - vertex[d0]) <
179 m_edgeNormal[i][1] * (vertex[d1] - gloCoord[d1]))
180 {
181 return -1; // outside
182 }
183 }
184 // 3D manifold needs to check the distance
185 if (m_coordim == 3)
186 {
187 nc = 0;
188 }
189 // nc: 1 (side element), 0 (maybe inside), -1 (outside)
190 return nc;
191}
192
194 const Array<OneD, const NekDouble> &Lcoord)
195{
196 if (m_state != ePtsFilled)
197 {
198 NEKERROR(ErrorUtil::ewarning, "Geometry is not in physical space");
199 }
200
201 Array<OneD, NekDouble> tmp(m_xmap->GetTotPoints());
202 m_xmap->BwdTrans(m_coeffs[i], tmp);
203
204 return m_xmap->PhysEvaluate(Lcoord, tmp);
205}
206
208 const TriGeom &face2,
209 bool doRot, int dir,
210 NekDouble angle,
211 NekDouble tol)
212{
213 return GetFaceOrientation(face1.m_verts, face2.m_verts, doRot, dir, angle,
214 tol);
215}
216
218 std::array<PointGeom *, 3> face1, std::array<PointGeom *, 3> face2,
219 bool doRot, int dir, NekDouble angle, NekDouble tol)
220{
221 int i, j, vmap[3] = {-1, -1, -1};
222
223 if (doRot)
224 {
225 PointGeom rotPt;
226
227 for (i = 0; i < 3; ++i)
228 {
229 rotPt.Rotate((*face1[i]), dir, angle);
230 for (j = 0; j < 3; ++j)
231 {
232 if (rotPt.dist(*face2[j]) < tol)
233 {
234 vmap[j] = i;
235 break;
236 }
237 }
238 }
239 }
240 else
241 {
242
243 NekDouble x, y, z, x1, y1, z1, cx = 0.0, cy = 0.0, cz = 0.0;
244
245 // For periodic faces, we calculate the vector between the centre
246 // points of the two faces. (For connected faces this will be
247 // zero). We can then use this to determine alignment later in the
248 // algorithm.
249 for (i = 0; i < 3; ++i)
250 {
251 cx += (*face2[i])(0) - (*face1[i])(0);
252 cy += (*face2[i])(1) - (*face1[i])(1);
253 cz += (*face2[i])(2) - (*face1[i])(2);
254 }
255 cx /= 3;
256 cy /= 3;
257 cz /= 3;
258
259 // Now construct a mapping which takes us from the vertices of one
260 // face to the other. That is, vertex j of face2 corresponds to
261 // vertex vmap[j] of face1.
262 for (i = 0; i < 3; ++i)
263 {
264 x = (*face1[i])(0);
265 y = (*face1[i])(1);
266 z = (*face1[i])(2);
267 for (j = 0; j < 3; ++j)
268 {
269 x1 = (*face2[j])(0) - cx;
270 y1 = (*face2[j])(1) - cy;
271 z1 = (*face2[j])(2) - cz;
272 if (sqrt((x1 - x) * (x1 - x) + (y1 - y) * (y1 - y) +
273 (z1 - z) * (z1 - z)) < 1e-8)
274 {
275 vmap[j] = i;
276 break;
277 }
278 }
279 }
280 }
281
282 if (vmap[1] == (vmap[0] + 1) % 3)
283 {
284 switch (vmap[0])
285 {
286 case 0:
288 break;
289 case 1:
291 break;
292 case 2:
294 break;
295 }
296 }
297 else
298 {
299 switch (vmap[0])
300 {
301 case 0:
303 break;
304 case 1:
306 break;
307 case 2:
309 break;
310 }
311 }
312 NEKERROR(ErrorUtil::efatal, "Unable to determine triangle orientation");
314}
315
317{
318 if (!m_setupState)
319 {
321 }
323
324 GeomType Gtype = eRegular;
325
326 // check to see if expansions are linear
327 if (m_xmap->GetBasisNumModes(0) != 2 || m_xmap->GetBasisNumModes(1) != 2)
328 {
329 Gtype = eDeformed;
330 }
331
333 m_manifold[0] = 0;
334 m_manifold[1] = 1;
335 if (m_coordim == 3)
336 {
337 PointGeom e01, e21, norm;
338 e01.Sub(*m_verts[0], *m_verts[1]);
339 e21.Sub(*m_verts[2], *m_verts[1]);
340 norm.Mult(e01, e21);
341 int tmpi = 0;
342 double tmp = std::fabs(norm[0]);
343 if (tmp < fabs(norm[1]))
344 {
345 tmp = fabs(norm[1]);
346 tmpi = 1;
347 }
348 if (tmp < fabs(norm[2]))
349 {
350 tmpi = 2;
351 }
352 m_manifold[0] = (tmpi + 1) % 3;
353 m_manifold[1] = (tmpi + 2) % 3;
354 m_manifold[2] = (tmpi + 3) % 3;
355 }
356 if (Gtype == eRegular)
357 {
359 for (int i = 0; i < m_verts.size(); ++i)
360 {
361 verts[i] = Array<OneD, NekDouble>(3);
362 m_verts[i]->GetCoords(verts[i]);
363 }
364 // a00 + a01 xi1 + a02 xi2
365 // a10 + a11 xi1 + a12 xi2
367 for (int i = 0; i < 2; ++i)
368 {
369 unsigned int d = m_manifold[i];
371 NekDouble A = verts[0][d];
372 NekDouble B = verts[1][d];
373 NekDouble C = verts[2][d];
374 m_isoParameter[i][0] = 0.5 * (B + C); // 1
375 m_isoParameter[i][1] = 0.5 * (-A + B); // xi1
376 m_isoParameter[i][2] = 0.5 * (-A + C); // xi2
377 }
378 }
379
380 if (Gtype == eRegular)
381 {
383 }
384
385 return Gtype;
386}
387
396
397/**
398 * Note verts and edges are listed according to anticlockwise
399 * convention but points in _coeffs have to be in array format from
400 * left to right.
401 */
403{
404 // check to see if geometry structure is already filled
405 if (m_state == ePtsFilled)
406 {
407 return;
408 }
409
410 int i, j, k;
411 int nEdgeCoeffs = m_xmap->GetTraceNcoeffs(0);
412
413 if (m_curve)
414 {
416 2, m_curve->m_ptype)]
417 ->GetPointsDim();
418
419 // Deal with 2D points type separately
420 // (e.g. electrostatic or Fekete points) to 1D tensor
421 // product.
422 if (pdim == 2)
423 {
424 int N = m_curve->m_points.size();
425 int nEdgePts =
426 (-1 + (int)sqrt(static_cast<NekDouble>(8 * N + 1))) / 2;
427
428 ASSERTL0(nEdgePts * (nEdgePts + 1) / 2 == N,
429 "NUMPOINTS should be a triangle number for"
430 " triangle curved face " +
431 std::to_string(m_globalID));
432
433 // Sanity check 1: are curved vertices consistent with
434 // triangle vertices?
435 for (i = 0; i < 3; ++i)
436 {
437 NekDouble dist = m_verts[i]->dist(*(m_curve->m_points[i]));
439 {
440 std::stringstream ss;
441 ss << "Curved vertex " << i << " of triangle " << m_globalID
442 << " is separated from expansion vertex by"
443 << " more than " << NekConstants::kVertexTheSameDouble
444 << " (dist = " << dist << ")";
445 NEKERROR(ErrorUtil::ewarning, ss.str().c_str());
446 }
447 }
448
449 // Sanity check 2: are curved edges from the face curvature
450 // consistent with curved edges?
451 for (i = 0; i < kNedges; ++i)
452 {
453 Curve *edgeCurve = m_edges[i]->GetCurve();
454
455 ASSERTL0(edgeCurve->m_points.size() == nEdgePts,
456 "Number of edge points does not correspond "
457 "to number of face points in triangle " +
458 std::to_string(m_globalID));
459
460 const int offset = 3 + i * (nEdgePts - 2);
461 NekDouble maxDist = 0.0;
462
463 // Account for different ordering of nodal coordinates
464 // vs. Cartesian ordering of element.
466
467 if (i == 2)
468 {
469 orient = orient == StdRegions::eForwards
472 }
473
474 if (orient == StdRegions::eForwards)
475 {
476 for (j = 0; j < nEdgePts - 2; ++j)
477 {
478 NekDouble dist = m_curve->m_points[offset + j]->dist(
479 *(edgeCurve->m_points[j + 1]));
480 maxDist = dist > maxDist ? dist : maxDist;
481 }
482 }
483 else
484 {
485 for (j = 0; j < nEdgePts - 2; ++j)
486 {
487 NekDouble dist = m_curve->m_points[offset + j]->dist(
488 *(edgeCurve->m_points[nEdgePts - 2 - j]));
489 maxDist = dist > maxDist ? dist : maxDist;
490 }
491 }
492
494 {
495 std::stringstream ss;
496 ss << "Curved edge " << i << " of triangle " << m_globalID
497 << " has a point separated from edge interior"
498 << " points by more than "
500 << " (maxdist = " << maxDist << ")";
501 NEKERROR(ErrorUtil::ewarning, ss.str().c_str());
502 }
503 }
504
508 nEdgePts, LibUtilities::eGaussRadauMAlpha1Beta0);
510 P0);
512 P1);
514 std::max(nEdgePts * nEdgePts, m_xmap->GetTotPoints()));
515 Array<OneD, NekDouble> tmp(nEdgePts * nEdgePts);
516
517 for (i = 0; i < m_coordim; ++i)
518 {
519 // Create a StdNodalTriExp.
523
524 for (j = 0; j < N; ++j)
525 {
526 phys[j] = (m_curve->m_points[j]->GetPtr())[i];
527 }
528
529 t->BwdTrans(phys, tmp);
530
531 // Interpolate points to standard region.
533 P0, P1, tmp, m_xmap->GetBasis(0)->GetPointsKey(),
534 m_xmap->GetBasis(1)->GetPointsKey(), phys);
535
536 // Forwards transform to get coefficient space.
537 m_xmap->FwdTrans(phys, m_coeffs[i]);
538 }
539 }
540 else if (pdim == 1)
541 {
542 int npts = m_curve->m_points.size();
543 int nEdgePts = (int)sqrt(static_cast<NekDouble>(npts));
544 Array<OneD, NekDouble> tmp(npts);
545 Array<OneD, NekDouble> phys(m_xmap->GetTotPoints());
546 LibUtilities::PointsKey curveKey(nEdgePts, m_curve->m_ptype);
547
548 // Sanity checks:
549 // - Curved faces should have square number of points;
550 // - Each edge should have sqrt(npts) points.
551 ASSERTL0(nEdgePts * nEdgePts == npts,
552 "NUMPOINTS should be a square number for"
553 " triangle " +
554 std::to_string(m_globalID));
555
556 for (i = 0; i < kNedges; ++i)
557 {
558 ASSERTL0(m_edges[i]->GetXmap()->GetNcoeffs() == nEdgePts,
559 "Number of edge points does not correspond to "
560 "number of face points in triangle " +
561 std::to_string(m_globalID));
562 }
563
564 for (i = 0; i < m_coordim; ++i)
565 {
566 for (j = 0; j < npts; ++j)
567 {
568 tmp[j] = (m_curve->m_points[j]->GetPtr())[i];
569 }
570
571 // Interpolate curve points to standard triangle
572 // points.
573 LibUtilities::Interp2D(curveKey, curveKey, tmp,
574 m_xmap->GetBasis(0)->GetPointsKey(),
575 m_xmap->GetBasis(1)->GetPointsKey(),
576 phys);
577
578 // Forwards transform to get coefficient space.
579 m_xmap->FwdTrans(phys, m_coeffs[i]);
580 }
581 }
582 else
583 {
584 NEKERROR(ErrorUtil::efatal, "Only 1D/2D points distributions "
585 "supported.");
586 }
587 }
588
589 Array<OneD, unsigned int> mapArray(nEdgeCoeffs);
590 Array<OneD, int> signArray(nEdgeCoeffs);
591
592 for (i = 0; i < kNedges; i++)
593 {
594 m_edges[i]->FillGeom();
595 m_xmap->GetTraceToElementMap(i, mapArray, signArray, m_eorient[i]);
596
597 nEdgeCoeffs = m_edges[i]->GetXmap()->GetNcoeffs();
598
599 for (j = 0; j < m_coordim; j++)
600 {
601 for (k = 0; k < nEdgeCoeffs; k++)
602 {
603 m_coeffs[j][mapArray[k]] =
604 signArray[k] * m_edges[i]->GetCoeffs(j)[k];
605 }
606 }
607 }
608
610}
611
612int TriGeom::v_GetDir(const int i, [[maybe_unused]] const int j) const
613{
614 return i == 0 ? 0 : 1;
615}
616
617void TriGeom::v_Reset(CurveMap &curvedEdges, CurveMap &curvedFaces)
618{
619 Geometry::v_Reset(curvedEdges, curvedFaces);
620 CurveMap::iterator it = curvedFaces.find(m_globalID);
621
622 if (it != curvedFaces.end())
623 {
624 m_curve = it->second.get();
625 }
626
627 for (int i = 0; i < 3; ++i)
628 {
629 m_edges[i]->Reset(curvedEdges, curvedFaces);
630 }
631
632 SetUpXmap();
633 SetUpCoeffs(m_xmap->GetNcoeffs());
634}
635
637{
638 if (!m_setupState)
639 {
640 for (int i = 0; i < 3; ++i)
641 {
642 m_edges[i]->Setup();
643 }
644 SetUpXmap();
645 SetUpCoeffs(m_xmap->GetNcoeffs());
646
647 // check to see if expansions are linear
648 m_straightEdge = 1;
649 if (m_xmap->GetBasisNumModes(0) != 2 ||
650 m_xmap->GetBasisNumModes(1) != 2)
651 {
652 m_straightEdge = 0;
653 }
654
655 m_setupState = true;
656 }
657}
658
660{
661 int order0 = m_edges[0]->GetXmap()->GetBasis(0)->GetNumModes();
662 int order1 = std::max(
663 order0, std::max(m_edges[1]->GetXmap()->GetBasis(0)->GetNumModes(),
664 m_edges[2]->GetXmap()->GetBasis(0)->GetNumModes()));
665
666 std::array<LibUtilities::BasisKey, 2> basis = {
669 LibUtilities::PointsKey(order0 + 1,
674 LibUtilities::eGaussRadauMAlpha1Beta0))};
675
676 m_xmap = GetStdTriFactory().CreateInstance(basis);
677}
678
679} // 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::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
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
static StdRegions::Orientation GetEdgeOrientation(const SegGeom &edge1, const SegGeom &edge2)
Get the orientation of edge1.
Definition SegGeom.cpp:211
static const int kNedges
Definition TriGeom.h:57
std::array< PointGeom *, kNverts > m_verts
Definition TriGeom.h:119
int v_GetDir(const int faceidx, const int facedir) const override
Returns the element coordinate direction corresponding to a given face coordinate direction.
Definition TriGeom.cpp:612
static StdRegions::Orientation GetFaceOrientation(const TriGeom &face1, const TriGeom &face2, bool doRot, int dir, NekDouble angle, NekDouble tol)
Get the orientation of face1.
Definition TriGeom.cpp:207
int v_AllLeftCheck(const Array< OneD, const NekDouble > &gloCoord) override
Definition TriGeom.cpp:107
std::array< SegGeom *, kNedges > m_edges
Definition TriGeom.h:120
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 TriGeom.cpp:193
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 TriGeom.cpp:617
GeomFactorsUniquePtr v_GenGeomFactors(LibUtilities::PointsKeyVector &keyTgt) override
Used by Expansion to generate associated GeomFactors.
Definition TriGeom.cpp:388
GeomType v_CalcGeomType() override
Definition TriGeom.cpp:316
std::array< StdRegions::Orientation, kNedges > m_eorient
Definition TriGeom.h:121
A simple factory for Xmap objects that is based on the element type, the basis and quadrature selecti...
PointsManagerT & PointsManager(void)
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
@ eGaussLobattoLegendre
1D Gauss-Lobatto-Legendre quadrature points
Definition PointsType.h:51
@ eModified_B
Principle Modified Functions .
Definition BasisType.h:49
@ eOrtho_A
Principle Orthogonal Functions .
Definition BasisType.h:42
@ eOrtho_B
Principle Orthogonal Functions .
Definition BasisType.h:44
@ eModified_A
Principle Modified Functions .
Definition BasisType.h:48
static const NekDouble kVertexTheSameDouble
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::StdTriExp, 2 > & GetStdTriFactory()
Definition TriGeom.cpp:48
@ ePtsFilled
Geometric information has been generated.
std::shared_ptr< StdNodalTriExp > StdNodalTriExpSharedPtr
std::vector< double > z(NPUPPER)
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