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.
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 GetTid (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
StdRegions::Orientation GetForient (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_GetForient (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.