Newer
Older
* Copyright (c) 2012, OpenGeoSys Community (http://www.opengeosys.org)
* Distributed under a Modified BSD License.
* See accompanying file LICENSE.txt or
* http://www.opengeosys.com/LICENSE.txt
*/
#ifndef ELEMENT_H_
#define ELEMENT_H_
#include <vector>
#include "MshEnums.h"
#include "Mesh.h"
namespace MeshLib {
class Node;
/**
* Virtual base class for mesh elements.
*/
class Element
{
Karsten Rink
committed
/* friend classes */
Karsten Rink
committed
friend class Mesh;//void Mesh::setElementInformationForNodes();
Karsten Rink
committed
/// Compute the minimum and maximum squared edge length for this element
virtual void computeSqrEdgeLengthRange(double &min, double &max) const;
Karsten Rink
committed
/**
* \brief Tries to add an element e as neighbour to this element.
Karsten Rink
committed
* If the elements really are neighbours, the element is added to the
* neighbour-list and true is returned. Otherwise false is returned.
Karsten Rink
committed
*/
bool addNeighbor(Element* e);
/// Returns the length, area or volume of a 1D, 2D or 3D element
virtual double getContent() const = 0;
/**
* Get node with local index i where i should be at most the number
* of nodes of the element
* @param i local index of node, at most the number of nodes of the
* element that you can obtain with Element::getNNodes()
* @return a pointer to the appropriate (and constant, i.e. not
* modifiable by the user) instance of class Node or a NULL pointer
* @sa Element::getNodeIndex()
*/
Karsten Rink
committed
const Node* getNode(unsigned i) const;
/**
* (Re)Sets the node of the element.
* @param idx the index of the pointer to a node within the element
* @param node a pointer to a node
*/
void setNode(unsigned idx, Node* node);
Node* const* getNodes() const { return _nodes; };
Karsten Rink
committed
virtual unsigned getDimension() const = 0;
Karsten Rink
committed
/// Returns the i-th edge of the element.
Karsten Rink
committed
const Element* getEdge(unsigned i) const;
Karsten Rink
committed
/// Returns the i-th face of the element.
Karsten Rink
committed
virtual const Element* getFace(unsigned i) const = 0;
/// Get the number of edges for this element.
Karsten Rink
committed
virtual unsigned getNEdges() const = 0;
Karsten Rink
committed
/// Get the number of nodes for face i.
virtual unsigned getNFaceNodes(unsigned i) const = 0;
/// Get the number of faces for this element.
Karsten Rink
committed
virtual unsigned getNFaces() const = 0;
/// Get the specified neighbor.
Karsten Rink
committed
const Element* getNeighbor(unsigned i) const;
/// Get the number of neighbors for this element.
Karsten Rink
committed
virtual unsigned getNNeighbors() const = 0;
Karsten Rink
committed
virtual unsigned getNNodes() const = 0;
Karsten Rink
committed
/// Returns the position of the given node in the node array of this element.
virtual unsigned getNodeIDinElement(const MeshLib::Node* node) const;
/**
* Get the global index for the Node with local index i.
* The index i should be at most the number of nodes of the element.
* @param i local index of Node, at most the number of nodes of the
* element that you can obtain with Element::getNNodes()
* @return the global index or std::numeric_limits<unsigned>::max()
* @sa Element::getNode()
*/
Karsten Rink
committed
unsigned getNodeIndex(unsigned i) const;
/// Get the type of the mesh element (as a MshElemType-enum).
virtual MshElemType::type getType() const = 0;
Karsten Rink
committed
unsigned getValue() const { return _value; };
Karsten Rink
committed
/// Returns true if elem is a neighbour of this element and false otherwise.
bool hasNeighbor(Element* elem) const;
virtual ~Element();
Karsten Rink
committed
/// Returns true if these two indeces form an edge and false otherwise
virtual bool isEdge(unsigned i, unsigned j) const = 0;
/**
* Method clone is a pure virtual method in the abstract base class Element.
* It has to be implemented in the derived classes (for instance in class Hex).
* @return an exact copy of the object
*/
virtual Element* clone() const = 0;
* This method should be called after at least two nodes of an element
* are collapsed. The node collapsing can/have to lead to an edge collapse.
* This method tries to create a new element of an appropriate type. The
* value of the attribute _value is carried over. In contrast to this the
* neighbor information is not carried over.
* @return an element of a different element type (MshElemType) or NULL
*/
virtual Element* reviseElement() const = 0;
Karsten Rink
committed
* Computes the length / area / volumen of this element. This is automatically
* done at initalisation time but can be repeated by calling this function at any time.
*/
virtual double computeVolume() = 0;
/// Constructor for a generic mesh element without an array of mesh nodes.
Element(unsigned value = 0);
Karsten Rink
committed
/// Return a specific edge node.
Karsten Rink
committed
virtual Node* getEdgeNode(unsigned edge_id, unsigned node_id) const = 0;
Karsten Rink
committed
Karsten Rink
committed
/// Returns the ID of a face given an array of nodes.
virtual unsigned identifyFace(Node* nodes[3]) const = 0;
Karsten Rink
committed
Karsten Rink
committed
unsigned _value;
private:
}; /* class */
} /* namespace */
#endif /* ELEMENT_H_ */