48 namespace SpatialDomains
 
   51 Geometry3D::Geometry3D()
 
   55 Geometry3D::Geometry3D(
const int coordim) : 
Geometry(coordim)
 
   58              "Coordinate dimension should be at least 3 for a 3D geometry.");
 
   81     const int MaxIterations = 51;
 
   96     NekDouble derx_1, derx_2, derx_3, dery_1, dery_2, dery_3, derz_1, derz_2,
 
  100     NekDouble init0 = Lcoords[0], init1 = Lcoords[1], init2 = Lcoords[2];
 
  113     m_xmap->PhysDeriv(ptsx, DxD1, DxD2, DxD3);
 
  114     m_xmap->PhysDeriv(ptsy, DyD1, DyD2, DyD3);
 
  115     m_xmap->PhysDeriv(ptsz, DzD1, DzD2, DzD3);
 
  123     while (cnt++ < MaxIterations)
 
  126         m_xmap->LocCoordToLocCollapsed(Lcoords, eta);
 
  127         I[0] = 
m_xmap->GetBasis(0)->GetI(eta);
 
  128         I[1] = 
m_xmap->GetBasis(1)->GetI(eta + 1);
 
  129         I[2] = 
m_xmap->GetBasis(2)->GetI(eta + 2);
 
  132         xmap = 
m_xmap->PhysEvaluate(I, ptsx);
 
  133         ymap = 
m_xmap->PhysEvaluate(I, ptsy);
 
  134         zmap = 
m_xmap->PhysEvaluate(I, ptsz);
 
  136         F1 = coords[0] - xmap;
 
  137         F2 = coords[1] - ymap;
 
  138         F3 = coords[2] - zmap;
 
  140         if (F1 * F1 + F2 * F2 + F3 * F3 < ScaledTol)
 
  142             resid = 
sqrt(F1 * F1 + F2 * F2 + F3 * F3);
 
  147         derx_1 = 
m_xmap->PhysEvaluate(I, DxD1);
 
  148         derx_2 = 
m_xmap->PhysEvaluate(I, DxD2);
 
  149         derx_3 = 
m_xmap->PhysEvaluate(I, DxD3);
 
  150         dery_1 = 
m_xmap->PhysEvaluate(I, DyD1);
 
  151         dery_2 = 
m_xmap->PhysEvaluate(I, DyD2);
 
  152         dery_3 = 
m_xmap->PhysEvaluate(I, DyD3);
 
  153         derz_1 = 
m_xmap->PhysEvaluate(I, DzD1);
 
  154         derz_2 = 
m_xmap->PhysEvaluate(I, DzD2);
 
  155         derz_3 = 
m_xmap->PhysEvaluate(I, DzD3);
 
  157         jac = derx_1 * (dery_2 * derz_3 - dery_3 * derz_2) -
 
  158               derx_2 * (dery_1 * derz_3 - dery_3 * derz_1) +
 
  159               derx_3 * (dery_1 * derz_2 - dery_2 * derz_1);
 
  165             ((dery_2 * derz_3 - dery_3 * derz_2) * (coords[0] - xmap) -
 
  166              (derx_2 * derz_3 - derx_3 * derz_2) * (coords[1] - ymap) +
 
  167              (derx_2 * dery_3 - derx_3 * dery_2) * (coords[2] - zmap)) /
 
  172             ((dery_1 * derz_3 - dery_3 * derz_1) * (coords[0] - xmap) -
 
  173              (derx_1 * derz_3 - derx_3 * derz_1) * (coords[1] - ymap) +
 
  174              (derx_1 * dery_3 - derx_3 * dery_1) * (coords[2] - zmap)) /
 
  179             ((dery_1 * derz_2 - dery_2 * derz_1) * (coords[0] - xmap) -
 
  180              (derx_1 * derz_2 - derx_2 * derz_1) * (coords[1] - ymap) +
 
  181              (derx_1 * dery_2 - derx_2 * dery_1) * (coords[2] - zmap)) /
 
  184         if( !(std::isfinite(Lcoords[0]) && std::isfinite(Lcoords[1]) &&
 
  185               std::isfinite(Lcoords[2])) )
 
  188             std::ostringstream ss;
 
  189             ss << 
"nan or inf found in NewtonIterationForLocCoord in element " 
  194         if (fabs(Lcoords[0]) > LcoordDiv || fabs(Lcoords[1]) > LcoordDiv ||
 
  195             fabs(Lcoords[0]) > LcoordDiv)
 
  201     m_xmap->LocCoordToLocCollapsed(Lcoords, eta);
 
  204         I[0] = 
m_xmap->GetBasis(0)->GetI(eta);
 
  205         I[1] = 
m_xmap->GetBasis(1)->GetI(eta + 1);
 
  206         I[2] = 
m_xmap->GetBasis(2)->GetI(eta + 2);
 
  208         xmap = 
m_xmap->PhysEvaluate(I, ptsx);
 
  209         ymap = 
m_xmap->PhysEvaluate(I, ptsy);
 
  210         zmap = 
m_xmap->PhysEvaluate(I, ptsz);
 
  211         F1 = coords[0] - xmap;
 
  212         F2 = coords[1] - ymap;
 
  213         F3 = coords[2] - zmap;
 
  214         dist = 
sqrt(F1 * F1 + F2 * F2 + F3 * F3);
 
  221     if (cnt >= MaxIterations)
 
  224         m_xmap->LocCoordToLocCollapsed(Lcoords, collCoords);
 
  227         if ((collCoords[0] >= -1.0 && collCoords[0] <= 1.0) &&
 
  228             (collCoords[1] >= -1.0 && collCoords[1] <= 1.0) &&
 
  229             (collCoords[2] >= -1.0 && collCoords[2] <= 1.0))
 
  231             std::ostringstream ss;
 
  233             ss << 
"Reached MaxIterations (" << MaxIterations
 
  234                << 
") in Newton iteration ";
 
  235             ss << 
"Init value (" << setprecision(4) << init0 << 
"," << init1
 
  236                << 
"," << init2 << 
") ";
 
  237             ss << 
"Fin  value (" << Lcoords[0] << 
"," << Lcoords[1] << 
"," 
  238                << Lcoords[2] << 
") ";
 
  239             ss << 
"Resid = " << resid << 
" Tolerance = " << 
sqrt(ScaledTol);
 
  241             WARNINGL1(cnt < MaxIterations, ss.str());
 
  272             ASSERTL0(
false, 
"unrecognized 3D element type");
 
  286         cp1020.
Mult(e10, e20);
 
  287         cp2030.
Mult(e20, e30);
 
  288         cp3010.
Mult(e30, e10);
 
  292         Lcoords[0] = er0.
dot(cp2030) * iV - 1.0;
 
  293         Lcoords[1] = er0.
dot(cp3010) * iV - 1.0;
 
  294         Lcoords[2] = er0.
dot(cp1020) * iV - 1.0;
 
  298         m_xmap->LocCoordToLocCollapsed(Lcoords, eta);
 
  302             m_xmap->LocCollapsedToLocCoord(eta, xi);
 
  303             xi[0] = (xi[0] + 1.) * 0.5; 
 
  304             xi[1] = (xi[1] + 1.) * 0.5;
 
  305             xi[2] = (xi[2] + 1.) * 0.5;
 
  308                 NekDouble tmp = xi[0]*e10[i] + xi[1]*e20[i]
 
  309                             + xi[2]*e30[i] - er0[i];
 
  319         int npts = 
m_xmap->GetTotPoints();
 
  342         int qa = za.size(), qb = zb.size();
 
  345         eta[2] = zc[min_i / (qa * qb)];
 
  346         min_i = min_i % (qa * qb);
 
  347         eta[1] = zb[min_i / qa];
 
  348         eta[0] = za[min_i % qa];
 
  349         m_xmap->LocCollapsedToLocCoord(eta, Lcoords);
 
  378         int nFaceCoeffs = 
m_faces[i]->GetXmap()->GetNcoeffs();
 
  385             m_xmap->GetTraceToElementMap(
 
  395             m_xmap->GetTraceToElementMap(
 
  409             for (k = 0; k < nFaceCoeffs; k++)
 
  432     return m_xmap->PhysEvaluate(Lcoord, tmp);
 
  467              "Edge ID must be between 0 and " +
 
  468                  boost::lexical_cast<string>(
m_edges.size() - 1));
 
  474     ASSERTL2((i >= 0) && (i <= 5), 
"Edge id must be between 0 and 4");
 
  481              "Edge ID must be between 0 and " +
 
  482                  boost::lexical_cast<string>(
m_edges.size() - 1));
 
  489              "Face ID must be between 0 and " +
 
  490                  boost::lexical_cast<string>(
m_faces.size() - 1));
 
#define WARNINGL1(condition, msg)
 
#define ASSERTL0(condition, msg)
 
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
 
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed to...
 
virtual int v_GetNumEdges() const
Get the number of edges of this object.
 
virtual PointGeomSharedPtr v_GetVertex(int i) const
 
virtual void v_FillGeom()
Put all quadrature information into face/edge structure and backward transform.
 
std::vector< StdRegions::Orientation > m_forient
 
virtual NekDouble v_GetLocCoords(const Array< OneD, const NekDouble > &coords, Array< OneD, NekDouble > &Lcoords)
Determine the local collapsed coordinates that correspond to a given Cartesian coordinate for this ge...
 
virtual int v_GetNumFaces() const
Get the number of faces of this object.
 
virtual Geometry2DSharedPtr v_GetFace(int i) const
Returns face i of this object.
 
virtual NekDouble v_GetCoord(const int i, const Array< OneD, const NekDouble > &Lcoord)
Given local collapsed coordinate Lcoord return the value of physical coordinate in direction i.
 
void NewtonIterationForLocCoord(const Array< OneD, const NekDouble > &coords, const Array< OneD, const NekDouble > &ptsx, const Array< OneD, const NekDouble > &ptsy, const Array< OneD, const NekDouble > &ptsz, Array< OneD, NekDouble > &Lcoords, NekDouble &dist)
 
virtual Geometry1DSharedPtr v_GetEdge(int i) const
Returns edge i of this object.
 
virtual int v_GetNumVerts() const
Get the number of vertices of this object.
 
virtual StdRegions::Orientation v_GetForient(const int i) const
Returns the orientation of face i with respect to the ordering of faces in the standard element.
 
virtual int v_GetShapeDim() const
Get the object's shape dimension.
 
std::vector< StdRegions::Orientation > m_eorient
 
virtual StdRegions::Orientation v_GetEorient(const int i) const
Returns the orientation of edge i with respect to the ordering of edges in the standard element.
 
Base class for shape geometry information.
 
GeomState m_state
Enumeration to dictate whether coefficients are filled.
 
bool ClampLocCoords(Array< OneD, NekDouble > &locCoord, NekDouble tol)
Clamp local coords to be within standard regions [-1, 1]^dim.
 
int GetGlobalID(void) const
Get the ID of this object.
 
LibUtilities::ShapeType m_shapeType
Type of shape.
 
Array< OneD, Array< OneD, NekDouble > > m_coeffs
Array containing expansion coefficients of m_xmap.
 
GeomFactorsSharedPtr GetMetricInfo()
Get the geometric factors for this object.
 
StdRegions::StdExpansionSharedPtr m_xmap
mapping containing isoparametric transformation.
 
StdRegions::StdExpansionSharedPtr GetXmap() const
Return the mapping object Geometry::m_xmap that represents the coordinate transformation from standar...
 
GeomFactorsSharedPtr m_geomFactors
Geometric factors.
 
int m_coordim
Coordinate dimension of this geometry object.
 
void Sub(PointGeom &a, PointGeom &b)
 
void Mult(PointGeom &a, PointGeom &b)
_this = a x b
 
NekDouble dot(PointGeom &a)
retun the dot product between this and input a
 
@ eRegular
Geometry is straight-sided with constant geometric factors.
 
std::shared_ptr< PointGeom > PointGeomSharedPtr
 
std::shared_ptr< Geometry2D > Geometry2DSharedPtr
 
@ ePtsFilled
Geometric information has been generated.
 
std::shared_ptr< Geometry1D > Geometry1DSharedPtr
 
The above copyright notice and this permission notice shall be included.
 
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.
 
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
 
T Vsum(int n, const T *x, const int incx)
Subtract return sum(x)
 
int Imin(int n, const T *x, const int incx)
Return the index of the minimum element in x.
 
void Sadd(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Add vector y = alpha - x.
 
scalarT< T > sqrt(scalarT< T > in)