Nektar++
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Public Member Functions | Static Public Attributes | Protected Member Functions | Private Member Functions | List of all members
Nektar::SpatialDomains::PyrGeom Class Reference

#include <PyrGeom.h>

Inheritance diagram for Nektar::SpatialDomains::PyrGeom:
Inheritance graph
[legend]
Collaboration diagram for Nektar::SpatialDomains::PyrGeom:
Collaboration graph
[legend]

Public Member Functions

 PyrGeom ()
 PyrGeom (const Geometry2DSharedPtr faces[])
 ~PyrGeom ()
- Public Member Functions inherited from Nektar::LibUtilities::GraphVertexObject
 GraphVertexObject ()
 GraphVertexObject (const GraphVertexID id)
int getid ()
void setid (const GraphVertexID id)
virtual ~GraphVertexObject ()
- Public Member Functions inherited from Nektar::SpatialDomains::Geometry3D
 Geometry3D ()
 Geometry3D (const int coordim)
virtual ~Geometry3D ()
int GetEid (int i) const
 Return the ID of edge i in this element.
const Geometry1DSharedPtr GetEdge (int i) const
Geometry2DSharedPtr GetFace (int i)
 Return face i in this element.
StdRegions::Orientation GetFaceOrient (const int i) const
 Return the orientation of face i in this element.
int GetDir (const int faceidx, const int facedir) const
 Returns the element coordinate direction corresponding to a given face coordinate direction.
- Public Member Functions inherited from Nektar::SpatialDomains::Geometry
 Geometry ()
 Geometry (int coordim)
virtual ~Geometry ()
bool IsElmtConnected (int gvo_id, int locid) const
void AddElmtConnected (int gvo_id, int locid)
int NumElmtConnected () const
int GetCoordim () const
void SetCoordim (int coordim)
GeomFactorsSharedPtr GetGeomFactors ()
GeomFactorsSharedPtr GetRefGeomFactors (const Array< OneD, const LibUtilities::BasisSharedPtr > &tbasis)
GeomFactorsSharedPtr GetMetricInfo ()
LibUtilities::ShapeType GetShapeType (void)
int GetGlobalID (void)
void SetGlobalID (int globalid)
int GetVid (int i) const
int GetFid (int i) const
int GetNumVerts () const
PointGeomSharedPtr GetVertex (int i) const
StdRegions::Orientation GetEorient (const int i) const
StdRegions::Orientation GetPorient (const int i) const
int GetNumEdges () const
int GetNumFaces () const
int GetShapeDim () const
StdRegions::StdExpansionSharedPtr GetXmap () const
const Array< OneD, const
NekDouble > & 
GetCoeffs (const int i) const
bool ContainsPoint (const Array< OneD, const NekDouble > &gloCoord, NekDouble tol=0.0)
bool ContainsPoint (const Array< OneD, const NekDouble > &gloCoord, Array< OneD, NekDouble > &locCoord, NekDouble tol)
bool ContainsPoint (const Array< OneD, const NekDouble > &gloCoord, Array< OneD, NekDouble > &locCoord, NekDouble tol, NekDouble &resid)
int GetVertexEdgeMap (int i, int j) const
int GetVertexFaceMap (int i, int j) const
 return the id of the $j^{th}$ face attached to the $ i^{th}$ vertex
int GetEdgeFaceMap (int i, int j) const
void FillGeom ()
 Put all quadrature information into face/edge structure and backward transform.
NekDouble GetLocCoords (const Array< OneD, const NekDouble > &coords, Array< OneD, NekDouble > &Lcoords)
NekDouble 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 SetOwnData ()
const LibUtilities::BasisSharedPtr GetBasis (const int i)
 Return the j-th basis of the i-th co-ordinate dimension.
const LibUtilities::PointsKeyVector GetPointsKeys ()

Static Public Attributes

static const int kNverts = 5
static const int kNedges = 8
static const int kNqfaces = 1
static const int kNtfaces = 4
static const int kNfaces = kNqfaces + kNtfaces
static const std::string XMLElementType

Protected Member Functions

virtual void v_GenGeomFactors ()
virtual NekDouble v_GetLocCoords (const Array< OneD, const NekDouble > &coords, Array< OneD, NekDouble > &Lcoords)
virtual int v_GetNumVerts () const
virtual int v_GetNumEdges () const
virtual int v_GetDir (const int faceidx, const int facedir) const
- Protected Member Functions inherited from Nektar::SpatialDomains::Geometry3D
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 &resid)
virtual void v_FillGeom ()
 Put all quadrature information into face/edge structure and backward transform.
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.
virtual int v_GetShapeDim () const
 Return the dimension of this element.
virtual int v_GetVid (int i) const
 Return the vertex ID of vertex i.
virtual PointGeomSharedPtr v_GetVertex (int i) const
 Return vertex i in this element.
virtual const SegGeomSharedPtr v_GetEdge (int i) const
 Return edge i of this element.
virtual StdRegions::Orientation v_GetEorient (const int i) const
 Return the orientation of edge i in this element.
virtual int v_GetEid (int i) const
 Return the ID of edge i in this element.
virtual const Geometry2DSharedPtr v_GetFace (int i) const
 Return face i in this element.
virtual StdRegions::Orientation v_GetFaceOrient (const int i) const
 Return the orientation of face i in this element.
virtual int v_GetFid (int i) const
 Return the ID of face i in this element.
virtual int v_GetEid () const
 Return the ID of this element.
virtual int v_WhichEdge (SegGeomSharedPtr edge)
 Return the local ID of a given edge.
virtual int v_WhichFace (Geometry2DSharedPtr face)
 Return the local ID of a given face.
virtual const
LibUtilities::BasisSharedPtr 
v_GetBasis (const int i)
 Return the j-th basis of the i-th co-ordinate dimension.
virtual void v_AddElmtConnected (int gvo_id, int locid)
virtual bool v_IsElmtConnected (int gvo_id, int locid) const
virtual int v_NumElmtConnected () const
virtual void v_SetOwnData ()
- Protected Member Functions inherited from Nektar::SpatialDomains::Geometry
void GenGeomFactors ()
virtual StdRegions::Orientation v_GetPorient (const int i) const
virtual int v_GetNumFaces () const
virtual
StdRegions::StdExpansionSharedPtr 
v_GetXmap () const
virtual int v_GetCoordim () const
virtual bool v_ContainsPoint (const Array< OneD, const NekDouble > &gloCoord, NekDouble tol=0.0)
virtual bool v_ContainsPoint (const Array< OneD, const NekDouble > &gloCoord, Array< OneD, NekDouble > &locCoord, NekDouble tol)
virtual bool v_ContainsPoint (const Array< OneD, const NekDouble > &gloCoord, Array< OneD, NekDouble > &locCoord, NekDouble tol, NekDouble &resid)
virtual int v_GetVertexEdgeMap (int i, int j) const
virtual int v_GetVertexFaceMap (int i, int j) const
virtual int v_GetEdgeFaceMap (int i, int j) const
void SetUpCoeffs (const int nCoeffs)

Private Member Functions

void SetUpLocalEdges ()
void SetUpLocalVertices ()
void SetUpEdgeOrientation ()
void SetUpFaceOrientation ()

Additional Inherited Members

- Static Protected Member Functions inherited from Nektar::SpatialDomains::Geometry
static GeomFactorsSharedPtr ValidateRegGeomFactor (GeomFactorsSharedPtr geomFactor)
- Protected Attributes inherited from Nektar::LibUtilities::GraphVertexObject
GraphVertexID m_id
- Protected Attributes inherited from Nektar::SpatialDomains::Geometry3D
PointGeomVector m_verts
SegGeomVector m_edges
Geometry2DVector m_faces
std::vector
< StdRegions::Orientation
m_eorient
std::vector
< StdRegions::Orientation
m_forient
std::list< CompToElmtm_elmtmap
bool m_owndata
int m_eid
bool m_ownverts
- Static Protected Attributes inherited from Nektar::SpatialDomains::Geometry
static GeomFactorsVector m_regGeomFactorsManager

Detailed Description

Definition at line 48 of file PyrGeom.h.

Constructor & Destructor Documentation

Nektar::SpatialDomains::PyrGeom::PyrGeom ( )
Nektar::SpatialDomains::PyrGeom::PyrGeom ( const Geometry2DSharedPtr  faces[])

Copy the face shared pointers

Set up orientation vectors with correct amount of elements.

Determine necessary order for standard region.

Definition at line 55 of file PyrGeom.cpp.

References Nektar::LibUtilities::eGaussLobattoLegendre, Nektar::LibUtilities::eGaussRadauMAlpha2Beta0, Nektar::LibUtilities::eModified_A, Nektar::LibUtilities::eModified_C, Nektar::LibUtilities::ePyramid, Nektar::SpatialDomains::Geometry::GetBasis(), Nektar::SpatialDomains::Geometry3D::GetEdge(), Nektar::SpatialDomains::Geometry::GetXmap(), kNedges, kNfaces, Nektar::SpatialDomains::Geometry3D::m_eorient, Nektar::SpatialDomains::Geometry3D::m_faces, Nektar::SpatialDomains::Geometry3D::m_forient, Nektar::SpatialDomains::Geometry::m_shapeType, Nektar::SpatialDomains::Geometry::m_xmap, Nektar::SpatialDomains::Geometry::SetUpCoeffs(), SetUpEdgeOrientation(), SetUpFaceOrientation(), SetUpLocalEdges(), and SetUpLocalVertices().

:
Geometry3D(faces[0]->GetEdge(0)->GetVertex(0)->GetCoordim())
{
/// Copy the face shared pointers
m_faces.insert(m_faces.begin(), faces, faces+PyrGeom::kNfaces);
/// Set up orientation vectors with correct amount of elements.
m_eorient.resize(kNedges);
m_forient.resize(kNfaces);
/// Determine necessary order for standard region.
vector<int> tmp;
int order0, points0, order1, points1;
if (m_forient[0] < 9)
{
tmp.push_back(faces[0]->GetXmap()->GetEdgeNcoeffs(0));
tmp.push_back(faces[0]->GetXmap()->GetEdgeNcoeffs(2));
order0 = *max_element(tmp.begin(), tmp.end());
tmp.clear();
tmp.push_back(faces[0]->GetXmap()->GetEdgeNumPoints(0));
tmp.push_back(faces[0]->GetXmap()->GetEdgeNumPoints(2));
points0 = *max_element(tmp.begin(), tmp.end());
}
else
{
tmp.push_back(faces[0]->GetXmap()->GetEdgeNcoeffs(1));
tmp.push_back(faces[0]->GetXmap()->GetEdgeNcoeffs(3));
order0 = *max_element(tmp.begin(), tmp.end());
tmp.clear();
tmp.push_back(faces[0]->GetXmap()->GetEdgeNumPoints(1));
tmp.push_back(faces[0]->GetXmap()->GetEdgeNumPoints(3));
points0 = *max_element(tmp.begin(), tmp.end());
}
if (m_forient[0] < 9)
{
tmp.clear();
tmp.push_back(faces[0]->GetXmap()->GetEdgeNcoeffs(1));
tmp.push_back(faces[0]->GetXmap()->GetEdgeNcoeffs(3));
tmp.push_back(faces[2]->GetXmap()->GetEdgeNcoeffs(2));
order1 = *max_element(tmp.begin(), tmp.end());
tmp.clear();
tmp.push_back(faces[0]->GetXmap()->GetEdgeNumPoints(1));
tmp.push_back(faces[0]->GetXmap()->GetEdgeNumPoints(3));
tmp.push_back(faces[2]->GetXmap()->GetEdgeNumPoints(2));
points1 = *max_element(tmp.begin(), tmp.end());
}
else
{
tmp.clear();
tmp.push_back(faces[0]->GetXmap()->GetEdgeNcoeffs(0));
tmp.push_back(faces[0]->GetXmap()->GetEdgeNcoeffs(2));
tmp.push_back(faces[2]->GetXmap()->GetEdgeNcoeffs(2));
order1 = *max_element(tmp.begin(), tmp.end());
tmp.clear();
tmp.push_back(faces[0]->GetXmap()->GetEdgeNumPoints(0));
tmp.push_back(faces[0]->GetXmap()->GetEdgeNumPoints(2));
tmp.push_back(faces[2]->GetXmap()->GetEdgeNumPoints(2));
points1 = *max_element(tmp.begin(), tmp.end());
}
tmp.clear();
tmp.push_back(order0);
tmp.push_back(order1);
tmp.push_back(faces[1]->GetXmap()->GetEdgeNcoeffs(1));
tmp.push_back(faces[1]->GetXmap()->GetEdgeNcoeffs(2));
tmp.push_back(faces[3]->GetXmap()->GetEdgeNcoeffs(1));
tmp.push_back(faces[3]->GetXmap()->GetEdgeNcoeffs(2));
int order2 = *max_element(tmp.begin(), tmp.end());
tmp.clear();
tmp.push_back(points0);
tmp.push_back(points1);
tmp.push_back(faces[1]->GetXmap()->GetEdgeNumPoints(1));
tmp.push_back(faces[1]->GetXmap()->GetEdgeNumPoints(2));
tmp.push_back(faces[3]->GetXmap()->GetEdgeNumPoints(1));
tmp.push_back(faces[3]->GetXmap()->GetEdgeNumPoints(2));
tmp.push_back(faces[1]->GetEdge(1)->GetBasis(0)->GetNumPoints());
tmp.push_back(faces[1]->GetEdge(2)->GetBasis(0)->GetNumPoints());
tmp.push_back(faces[3]->GetEdge(1)->GetBasis(0)->GetNumPoints());
tmp.push_back(faces[3]->GetEdge(2)->GetBasis(0)->GetNumPoints());
int points2 = *max_element(tmp.begin(), tmp.end());
const LibUtilities::BasisKey A1(
LibUtilities::PointsKey(
const LibUtilities::BasisKey A2(
LibUtilities::PointsKey(
const LibUtilities::BasisKey C(
LibUtilities::PointsKey(
m_xmap = MemoryManager<StdRegions::StdPyrExp>::AllocateSharedPtr(
A1, A2, C);
SetUpCoeffs(m_xmap->GetNcoeffs());
}
Nektar::SpatialDomains::PyrGeom::~PyrGeom ( )

Definition at line 169 of file PyrGeom.cpp.

{
}

Member Function Documentation

void Nektar::SpatialDomains::PyrGeom::SetUpEdgeOrientation ( )
private

Definition at line 475 of file PyrGeom.cpp.

References ASSERTL0, Nektar::StdRegions::eBackwards, Nektar::StdRegions::eForwards, Nektar::SpatialDomains::Geometry::GetVid(), kNedges, Nektar::SpatialDomains::Geometry3D::m_edges, Nektar::SpatialDomains::Geometry3D::m_eorient, and Nektar::SpatialDomains::Geometry3D::m_verts.

Referenced by PyrGeom().

{
// This 2D array holds the local id's of all the vertices for every
// edge. For every edge, they are ordered to what we define as being
// Forwards.
const unsigned int edgeVerts[kNedges][2] =
{ {0,1}, {1,2}, {3,2}, {0,3}, {0,4}, {1,4}, {2,4}, {3,4} };
int i;
for (i = 0; i < kNedges; i++)
{
if (m_edges[i]->GetVid(0) == m_verts[edgeVerts[i][0]]->GetVid())
{
}
else if (m_edges[i]->GetVid(0) == m_verts[edgeVerts[i][1]]->GetVid())
{
}
else
{
ASSERTL0(false,"Could not find matching vertex for the edge");
}
}
}
void Nektar::SpatialDomains::PyrGeom::SetUpFaceOrientation ( )
private

Definition at line 501 of file PyrGeom.cpp.

References ASSERTL0, Nektar::SpatialDomains::Geometry::GetVertex(), Nektar::SpatialDomains::Geometry::GetVid(), Nektar::NekConstants::kNekZeroTol, kNfaces, kNqfaces, kNtfaces, Nektar::SpatialDomains::Geometry::m_coordim, Nektar::SpatialDomains::Geometry3D::m_faces, Nektar::SpatialDomains::Geometry3D::m_forient, and Nektar::SpatialDomains::Geometry3D::m_verts.

Referenced by PyrGeom().

{
int f,i;
// These arrays represent the vector of the A and B coordinate of
// the local elemental coordinate system where A corresponds with
// the coordinate direction xi_i with the lowest index i (for that
// particular face) Coordinate 'B' then corresponds to the other
// local coordinate (i.e. with the highest index)
Array<OneD,NekDouble> elementAaxis(m_coordim);
Array<OneD,NekDouble> elementBaxis(m_coordim);
// These arrays correspond to the local coordinate
// system of the face itself (i.e. the Geometry2D)
// faceAaxis correspond to the xi_0 axis
// faceBaxis correspond to the xi_1 axis
Array<OneD,NekDouble> faceAaxis(m_coordim);
Array<OneD,NekDouble> faceBaxis(m_coordim);
// This is the base vertex of the face (i.e. the Geometry2D) This
// corresponds to thevertex with local ID 0 of the Geometry2D
unsigned int baseVertex;
// The lenght of the vectors above
NekDouble elementAaxis_length;
NekDouble elementBaxis_length;
NekDouble faceAaxis_length;
NekDouble faceBaxis_length;
// This 2D array holds the local id's of all the vertices for every
// face. For every face, they are ordered in such a way that the
// implementation below allows a unified approach for all faces.
const unsigned int faceVerts[kNfaces][4] = {
{0,1,2,3},
{0,1,4,0}, // Last four elements are triangles which only
{1,2,4,0}, // require three vertices.
{3,2,4,0},
{0,3,4,0}
};
NekDouble dotproduct1 = 0.0;
NekDouble dotproduct2 = 0.0;
unsigned int orientation;
// Loop over all the faces to set up the orientation
for(f = 0; f < kNqfaces + kNtfaces; f++)
{
// initialisation
elementAaxis_length = 0.0;
elementBaxis_length = 0.0;
faceAaxis_length = 0.0;
faceBaxis_length = 0.0;
dotproduct1 = 0.0;
dotproduct2 = 0.0;
baseVertex = m_faces[f]->GetVid(0);
// We are going to construct the vectors representing the A and
// B axis of every face. These vectors will be constructed as a
// vector-representation of the edges of the face. However, for
// both coordinate directions, we can represent the vectors by
// two different edges. That's why we need to make sure that we
// pick the edge to which the baseVertex of the
// Geometry2D-representation of the face belongs...
// Compute the length of edges on a base-face
if (f > 0)
{
for(i = 0; i < m_coordim; i++)
{
elementAaxis[i] = (*m_verts[ faceVerts[f][1] ])[i] - (*m_verts[ faceVerts[f][0] ])[i];
elementBaxis[i] = (*m_verts[ faceVerts[f][2] ])[i] - (*m_verts[ faceVerts[f][0] ])[i];
}
}
else
{
if( baseVertex == m_verts[ faceVerts[f][0] ]->GetVid() )
{
for(i = 0; i < m_coordim; i++)
{
elementAaxis[i] = (*m_verts[ faceVerts[f][1] ])[i] - (*m_verts[ faceVerts[f][0] ])[i];
elementBaxis[i] = (*m_verts[ faceVerts[f][3] ])[i] - (*m_verts[ faceVerts[f][0] ])[i];
}
}
else if( baseVertex == m_verts[ faceVerts[f][1] ]->GetVid() )
{
for(i = 0; i < m_coordim; i++)
{
elementAaxis[i] = (*m_verts[ faceVerts[f][1] ])[i] - (*m_verts[ faceVerts[f][0] ])[i];
elementBaxis[i] = (*m_verts[ faceVerts[f][2] ])[i] - (*m_verts[ faceVerts[f][1] ])[i];
}
}
else if( baseVertex == m_verts[ faceVerts[f][2] ]->GetVid() )
{
for(i = 0; i < m_coordim; i++)
{
elementAaxis[i] = (*m_verts[ faceVerts[f][2] ])[i] - (*m_verts[ faceVerts[f][3] ])[i];
elementBaxis[i] = (*m_verts[ faceVerts[f][2] ])[i] - (*m_verts[ faceVerts[f][1] ])[i];
}
}
else if( baseVertex == m_verts[ faceVerts[f][3] ]->GetVid() )
{
for(i = 0; i < m_coordim; i++)
{
elementAaxis[i] = (*m_verts[ faceVerts[f][2] ])[i] - (*m_verts[ faceVerts[f][3] ])[i];
elementBaxis[i] = (*m_verts[ faceVerts[f][3] ])[i] - (*m_verts[ faceVerts[f][0] ])[i];
}
}
else
{
ASSERTL0(false, "Could not find matching vertex for the face");
}
}
// Now, construct the edge-vectors of the local coordinates of
// the Geometry2D-representation of the face
for(i = 0; i < m_coordim; i++)
{
int v = m_faces[f]->GetNumVerts()-1;
faceAaxis[i] = (*m_faces[f]->GetVertex(1))[i] - (*m_faces[f]->GetVertex(0))[i];
faceBaxis[i] = (*m_faces[f]->GetVertex(v))[i] - (*m_faces[f]->GetVertex(0))[i];
elementAaxis_length += pow(elementAaxis[i],2);
elementBaxis_length += pow(elementBaxis[i],2);
faceAaxis_length += pow(faceAaxis[i],2);
faceBaxis_length += pow(faceBaxis[i],2);
}
elementAaxis_length = sqrt(elementAaxis_length);
elementBaxis_length = sqrt(elementBaxis_length);
faceAaxis_length = sqrt(faceAaxis_length);
faceBaxis_length = sqrt(faceBaxis_length);
// Calculate the inner product of both the A-axis
// (i.e. Elemental A axis and face A axis)
for(i = 0 ; i < m_coordim; i++)
{
dotproduct1 += elementAaxis[i]*faceAaxis[i];
}
orientation = 0;
// if the innerproduct is equal to the (absolute value of the ) products of the lengths
// of both vectors, then, the coordinate systems will NOT be transposed
if( fabs(elementAaxis_length*faceAaxis_length - fabs(dotproduct1)) < NekConstants::kNekZeroTol )
{
// if the inner product is negative, both A-axis point
// in reverse direction
if(dotproduct1 < 0.0)
{
orientation += 2;
}
// calculate the inner product of both B-axis
for(i = 0 ; i < m_coordim; i++)
{
dotproduct2 += elementBaxis[i]*faceBaxis[i];
}
// if the inner product is negative, both B-axis point
// in reverse direction
if( dotproduct2 < 0.0 )
{
orientation++;
}
}
// The coordinate systems are transposed
else
{
orientation = 4;
// Calculate the inner product between the elemental A-axis
// and the B-axis of the face (which are now the corresponding axis)
dotproduct1 = 0.0;
for(i = 0 ; i < m_coordim; i++)
{
dotproduct1 += elementAaxis[i]*faceBaxis[i];
}
// check that both these axis are indeed parallel
if (fabs(elementAaxis_length*faceBaxis_length
- fabs(dotproduct1)) > NekConstants::kNekZeroTol)
{
cout << "Warning: Prism axes not parallel" << endl;
}
// if the result is negative, both axis point in reverse
// directions
if(dotproduct1 < 0.0)
{
orientation += 2;
}
// Do the same for the other two corresponding axis
dotproduct2 = 0.0;
for(i = 0 ; i < m_coordim; i++)
{
dotproduct2 += elementBaxis[i]*faceAaxis[i];
}
// check that both these axis are indeed parallel
if (fabs(elementBaxis_length*faceAaxis_length
- fabs(dotproduct2)) > NekConstants::kNekZeroTol)
{
cout << "Warning: Prism axes not parallel" << endl;
}
if( dotproduct2 < 0.0 )
{
orientation++;
}
}
orientation = orientation + 5;
// Fill the m_forient array
m_forient[f] = (StdRegions::Orientation) orientation;
}
}
void Nektar::SpatialDomains::PyrGeom::SetUpLocalEdges ( )
private

Definition at line 297 of file PyrGeom.cpp.

References ASSERTL0, Nektar::SpatialDomains::Geometry3D::GetEdge(), Nektar::SpatialDomains::Geometry3D::GetEid(), Nektar::SpatialDomains::Geometry::GetFid(), Nektar::SpatialDomains::Geometry3D::m_edges, and Nektar::SpatialDomains::Geometry3D::m_faces.

Referenced by PyrGeom().

{
// find edge 0
int i,j;
unsigned int check;
// First set up the 4 bottom edges
int f;
for (f = 1; f < 5; f++)
{
int nEdges = m_faces[f]->GetNumEdges();
check = 0;
for (i = 0; i < 4; i++)
{
for (j = 0; j < nEdges; j++)
{
if (m_faces[0]->GetEid(i) == m_faces[f]->GetEid(j))
{
edge = boost::dynamic_pointer_cast<SegGeom>((m_faces[0])->GetEdge(i));
m_edges.push_back(edge);
check++;
}
}
}
if (check < 1)
{
std::ostringstream errstrm;
errstrm << "Connected faces do not share an edge. Faces ";
errstrm << (m_faces[0])->GetFid() << ", " << (m_faces[f])->GetFid();
ASSERTL0(false, errstrm.str());
}
else if (check > 1)
{
std::ostringstream errstrm;
errstrm << "Connected faces share more than one edge. Faces ";
errstrm << (m_faces[0])->GetFid() << ", " << (m_faces[f])->GetFid();
ASSERTL0(false, errstrm.str());
}
}
// Then, set up the 4 vertical edges
check = 0;
for(i = 0; i < 3; i++) //Set up the vertical edge :face(1) and face(4)
{
for(j = 0; j < 3; j++)
{
if( (m_faces[1])->GetEid(i) == (m_faces[4])->GetEid(j) )
{
edge = boost::dynamic_pointer_cast<SegGeom>((m_faces[1])->GetEdge(i));
m_edges.push_back(edge);
check++;
}
}
}
if( check < 1 )
{
std::ostringstream errstrm;
errstrm << "Connected faces do not share an edge. Faces ";
errstrm << (m_faces[1])->GetFid() << ", " << (m_faces[4])->GetFid();
ASSERTL0(false, errstrm.str());
}
else if( check > 1)
{
std::ostringstream errstrm;
errstrm << "Connected faces share more than one edge. Faces ";
errstrm << (m_faces[1])->GetFid() << ", " << (m_faces[4])->GetFid();
ASSERTL0(false, errstrm.str());
}
// Set up vertical edges: face(1) through face(4)
for (f = 1; f < 4; f++)
{
check = 0;
for(i = 0; i < m_faces[f]->GetNumEdges(); i++)
{
for(j = 0; j < m_faces[f+1]->GetNumEdges(); j++)
{
if( (m_faces[f])->GetEid(i) == (m_faces[f+1])->GetEid(j))
{
edge = boost::dynamic_pointer_cast<SegGeom>((m_faces[f])->GetEdge(i));
m_edges.push_back(edge);
check++;
}
}
}
if( check < 1 )
{
std::ostringstream errstrm;
errstrm << "Connected faces do not share an edge. Faces ";
errstrm << (m_faces[f])->GetFid() << ", " << (m_faces[f+1])->GetFid();
ASSERTL0(false, errstrm.str());
}
else if( check > 1)
{
std::ostringstream errstrm;
errstrm << "Connected faces share more than one edge. Faces ";
errstrm << (m_faces[f])->GetFid() << ", " << (m_faces[f+1])->GetFid();
ASSERTL0(false, errstrm.str());
}
}
}
void Nektar::SpatialDomains::PyrGeom::SetUpLocalVertices ( )
private

Definition at line 403 of file PyrGeom.cpp.

References ASSERTL0, Nektar::SpatialDomains::Geometry::GetVertex(), Nektar::SpatialDomains::Geometry::GetVid(), Nektar::SpatialDomains::Geometry3D::m_edges, and Nektar::SpatialDomains::Geometry3D::m_verts.

Referenced by PyrGeom().

{
// Set up the first 2 vertices (i.e. vertex 0,1)
if (m_edges[0]->GetVid(0) == m_edges[1]->GetVid(0) ||
m_edges[0]->GetVid(0) == m_edges[1]->GetVid(1))
{
m_verts.push_back(m_edges[0]->GetVertex(1));
m_verts.push_back(m_edges[0]->GetVertex(0));
}
else if (m_edges[0]->GetVid(1) == m_edges[1]->GetVid(0) ||
m_edges[0]->GetVid(1) == m_edges[1]->GetVid(1))
{
m_verts.push_back(m_edges[0]->GetVertex(0));
m_verts.push_back(m_edges[0]->GetVertex(1));
}
else
{
std::ostringstream errstrm;
errstrm << "Connected edges do not share a vertex. Edges ";
errstrm << m_edges[0]->GetEid() << ", " << m_edges[1]->GetEid();
ASSERTL0(false, errstrm.str());
}
// set up the other bottom vertices (i.e. vertex 2,3)
for(int i = 1; i < 3; i++)
{
if (m_edges[i]->GetVid(0) == m_verts[i]->GetVid())
{
m_verts.push_back(m_edges[i]->GetVertex(1));
}
else if (m_edges[i]->GetVid(1) == m_verts[i]->GetVid())
{
m_verts.push_back(m_edges[i]->GetVertex(0));
}
else
{
std::ostringstream errstrm;
errstrm << "Connected edges do not share a vertex. Edges ";
errstrm << m_edges[i]->GetEid() << ", " << m_edges[i-1]->GetEid();
ASSERTL0(false, errstrm.str());
}
}
// set up top vertex
if (m_edges[4]->GetVid(0) == m_verts[0]->GetVid())
{
m_verts.push_back(m_edges[4]->GetVertex(1));
}
else
{
m_verts.push_back(m_edges[4]->GetVertex(0));
}
int check = 0;
for (int i = 5; i < 8; ++i)
{
if( (m_edges[i]->GetVid(0) == m_verts[i-4]->GetVid()
&& m_edges[i]->GetVid(1) == m_verts[4]->GetVid())
||(m_edges[i]->GetVid(1) == m_verts[i-4]->GetVid()
&& m_edges[i]->GetVid(0) == m_verts[4]->GetVid()))
{
check++;
}
}
if (check != 3) {
std::ostringstream errstrm;
errstrm << "Connected edges do not share a vertex. Edges ";
errstrm << m_edges[3]->GetEid() << ", " << m_edges[2]->GetEid();
ASSERTL0(false, errstrm.str());
}
}
void Nektar::SpatialDomains::PyrGeom::v_GenGeomFactors ( )
protectedvirtual

Generate the geometry factors for this element.

Reimplemented from Nektar::SpatialDomains::Geometry3D.

Definition at line 174 of file PyrGeom.cpp.

References Nektar::SpatialDomains::eDeformed, Nektar::SpatialDomains::ePtsFilled, Nektar::SpatialDomains::eRegular, Nektar::NekConstants::kNekZeroTol, Nektar::SpatialDomains::Geometry::m_coeffs, Nektar::SpatialDomains::Geometry::m_coordim, Nektar::SpatialDomains::Geometry::m_geomFactors, Nektar::SpatialDomains::Geometry::m_geomFactorsState, Nektar::SpatialDomains::Geometry3D::m_verts, Nektar::SpatialDomains::Geometry::m_xmap, and Nektar::SpatialDomains::Geometry3D::v_FillGeom().

{
{
int i;
GeomType Gtype = eRegular;
// check to see if expansions are linear
for(i = 0; i < m_coordim; ++i)
{
if (m_xmap->GetBasisNumModes(0) != 2 ||
m_xmap->GetBasisNumModes(1) != 2 ||
m_xmap->GetBasisNumModes(2) != 2 )
{
Gtype = eDeformed;
}
}
// check to see if all quadrilateral faces are parallelograms
if(Gtype == eRegular)
{
// Ensure each face is a parallelogram? Check this.
for (i = 0; i < m_coordim; i++)
{
if( fabs( (*m_verts[0])(i) -
(*m_verts[1])(i) +
(*m_verts[2])(i) -
(*m_verts[3])(i) )
{
Gtype = eDeformed;
break;
}
}
}
m_geomFactors = MemoryManager<GeomFactors>::AllocateSharedPtr(
Gtype, m_coordim, m_xmap, m_coeffs);
}
}
int Nektar::SpatialDomains::PyrGeom::v_GetDir ( const int  faceidx,
const int  facedir 
) const
protectedvirtual

Implements Nektar::SpatialDomains::Geometry3D.

Definition at line 281 of file PyrGeom.cpp.

{
if (faceidx == 0)
{
return facedir;
}
else if (faceidx == 1 || faceidx == 3)
{
return 2 * facedir;
}
else
{
return 1 + facedir;
}
}
NekDouble Nektar::SpatialDomains::PyrGeom::v_GetLocCoords ( const Array< OneD, const NekDouble > &  coords,
Array< OneD, NekDouble > &  Lcoords 
)
protectedvirtual

Reimplemented from Nektar::SpatialDomains::Geometry.

Definition at line 218 of file PyrGeom.cpp.

References Nektar::SpatialDomains::PointGeom::dot(), ErrorUtil::efatal, Nektar::SpatialDomains::eRegular, Nektar::SpatialDomains::Geometry::GetMetricInfo(), Nektar::SpatialDomains::Geometry::m_coordim, Nektar::SpatialDomains::Geometry3D::m_verts, Nektar::SpatialDomains::PointGeom::Mult(), NEKERROR, Nektar::SpatialDomains::PointGeom::Sub(), and Nektar::SpatialDomains::Geometry3D::v_FillGeom().

{
NekDouble resid = 0.0;
// calculate local coordinate for coord
if(GetMetricInfo()->GetGtype() == eRegular)
{ // Based on Spen's book, page 99
// Point inside tetrahedron
PointGeom r(m_coordim, 0, coords[0], coords[1], coords[2]);
// Edges
PointGeom er0, e10, e30, e40;
er0.Sub(r,*m_verts[0]);
e10.Sub(*m_verts[1],*m_verts[0]);
e30.Sub(*m_verts[3],*m_verts[0]);
e40.Sub(*m_verts[4],*m_verts[0]);
// Cross products (Normal times area)
PointGeom cp1030, cp3040, cp4010;
cp1030.Mult(e10,e30);
cp3040.Mult(e30,e40);
cp4010.Mult(e40,e10);
// Barycentric coordinates (relative volume)
NekDouble V = e40.dot(cp1030); // Pyramid Volume = {(e40)dot(e10)x(e30)}/4
NekDouble scaleFactor = 2.0/3.0;
NekDouble v1 = er0.dot(cp3040) / V; // volume1 = {(er0)dot(e30)x(e40)}/6
NekDouble v2 = er0.dot(cp4010) / V; // volume2 = {(er0)dot(e40)x(e10)}/6
NekDouble beta = v1 * scaleFactor;
NekDouble gamma = v2 * scaleFactor;
NekDouble delta = er0.dot(cp1030) / V; // volume3 = {(er0)dot(e10)x(e30)}/4
// Make Pyramid bigger
Lcoords[0] = 2.0*beta - 1.0;
Lcoords[1] = 2.0*gamma - 1.0;
Lcoords[2] = 2.0*delta - 1.0;
}
else
{
"inverse mapping must be set up to use this call");
}
return resid;
}
int Nektar::SpatialDomains::PyrGeom::v_GetNumEdges ( ) const
protectedvirtual

Reimplemented from Nektar::SpatialDomains::Geometry.

Definition at line 276 of file PyrGeom.cpp.

{
return 8;
}
int Nektar::SpatialDomains::PyrGeom::v_GetNumVerts ( ) const
protectedvirtual

Reimplemented from Nektar::SpatialDomains::Geometry.

Definition at line 271 of file PyrGeom.cpp.

{
return 5;
}

Member Data Documentation

const int Nektar::SpatialDomains::PyrGeom::kNedges = 8
static

Definition at line 57 of file PyrGeom.h.

Referenced by PyrGeom(), and SetUpEdgeOrientation().

const int Nektar::SpatialDomains::PyrGeom::kNfaces = kNqfaces + kNtfaces
static

Definition at line 60 of file PyrGeom.h.

Referenced by PyrGeom(), Nektar::SpatialDomains::MeshGraph3D::ReadElements(), and SetUpFaceOrientation().

const int Nektar::SpatialDomains::PyrGeom::kNqfaces = 1
static

Definition at line 58 of file PyrGeom.h.

Referenced by Nektar::SpatialDomains::MeshGraph3D::ReadElements(), and SetUpFaceOrientation().

const int Nektar::SpatialDomains::PyrGeom::kNtfaces = 4
static

Definition at line 59 of file PyrGeom.h.

Referenced by Nektar::SpatialDomains::MeshGraph3D::ReadElements(), and SetUpFaceOrientation().

const int Nektar::SpatialDomains::PyrGeom::kNverts = 5
static

Definition at line 56 of file PyrGeom.h.

const std::string Nektar::SpatialDomains::PyrGeom::XMLElementType
static

Definition at line 61 of file PyrGeom.h.