Rheolef  7.2
an efficient C++ finite element environment
 
Loading...
Searching...
No Matches
<tt>geo_element</tt>

geometrical element of a mesh

Description

This class defines a geometrical element. This element is obtained after the Piola geometrical transformation from a reference_element. The geo_element is mainly an array of indices for its nodes. These indices refer to the node table of the geo class. In addition, this class provides a list of indexes for edges (in 2D and 3D) and faces (in 3D). These indices refer to the edge and face lists, respectively, of the geo class.

Implementation

This documentation has been generated from file fem/geo_element/geo_element.h

class geo_element {
public:
// typedefs:
enum {
_variant_offset = 0, // i.e. type, as triangle(t) or tetra(T), etc
_order_offset = 1, // i.e. k, when Pk curved element
_dis_ie_offset = 2, // internal numbering, depend upon partitionand nproc
_ios_dis_ie_offset = 3, // i/o numbering, independent of parition and nproc
_master_offset = 4, // (d-1)-side has one or two master d-element that contains it
_last_offset = 6 // here starts node indexes, face indexes, etc
};
// Implementation note: _master_offset reserve 2 size_type but is used only for sides,
// i.e. tri or quad in 3d mesh, edge in 2d mesh, or point in 1d
// => waste a lot of place
// it would be better with a polymorphic class
// and the geo class would define an array of smart_pointers on this class
// so, we could define edge with or without the 2 size_type for master elements
// then, hack_array will become obsolete (good thing)
// and reference_element could be also polymorphic, avoiding large swich (variant)
// in all internal loops. This change of implementation will be considered
// in the future.
typedef size_type* iterator;
typedef const size_type* const_iterator;
typedef geo_element_auto<heap_allocator<size_type> > automatic_type;
typedef geo_element_indirect::shift_type shift_type; // for 0..3 face shift
struct parameter_type {
: variant(v), order(o) {}
};
// affectation:
{
reset (K.variant(), K.order()); // resize auto, nothing for hack
std::copy (K._data_begin(), K._data_begin() + _data_size(), _data_begin());
reset (K.variant(), K.order()); // reset order=1 for hack, resize nothing for auto
return *this;
}
virtual ~geo_element() {}
virtual void reset (variant_type variant, size_type order) = 0;
// implicit conversion:
operator reference_element () const { return reference_element(variant()); }
// accessors & modifiers:
size_type order() const { return *(_data_begin() + _order_offset); }
size_type dis_ie() const { return *(_data_begin() + _dis_ie_offset); }
size_type master (bool i) const { return *(_data_begin() + _master_offset + i); }
char name() const { return reference_element::name (variant()); }
void set_master (bool i, size_type dis_ie) const {
const_iterator p = _data_begin() + _master_offset + i; // mutable member fct
*(const_cast<iterator>(p)) = dis_ie;
}
const_iterator begin() const { return _data_begin() + _node_offset (variant(), order()); }
iterator end() { return begin() + size(); }
const_iterator end() const { return begin() + size(); }
size_type& operator[] (size_type loc_inod) { return *(begin() + loc_inod); }
size_type operator[] (size_type loc_inod) const { return *(begin() + loc_inod); }
size_type& node (size_type loc_inod) { return operator[] (loc_inod); }
size_type node (size_type loc_inod) const { return operator[] (loc_inod); }
iterator begin(size_type node_subgeo_dim) { return begin() + first_inod (node_subgeo_dim); }
const_iterator begin(size_type node_subgeo_dim) const { return begin() + first_inod (node_subgeo_dim); }
iterator end (size_type node_subgeo_dim) { return begin() + last_inod (node_subgeo_dim); }
const_iterator end (size_type node_subgeo_dim) const { return begin() + last_inod (node_subgeo_dim); }
const geo_element_indirect& edge_indirect (size_type i) const {
return *(reinterpret_cast<const geo_element_indirect*>(p));
}
const geo_element_indirect& face_indirect (size_type i) const {
return *(reinterpret_cast<const geo_element_indirect*>(p));
}
geo_element_indirect& edge_indirect (size_type i) {
return *(reinterpret_cast<geo_element_indirect*>(p));
}
geo_element_indirect& face_indirect (size_type i) {
return *(reinterpret_cast<geo_element_indirect*>(p));
}
size_type edge (size_type i) const { return (dimension() <= 1) ? dis_ie() : edge_indirect(i).index(); }
size_type face (size_type i) const { return (dimension() <= 2) ? dis_ie() : face_indirect(i).index(); }
size_type n_subgeo (size_type subgeo_dim) const {
return reference_element::n_subgeo (variant(), subgeo_dim); }
return (subgeo_dim == 0) ? operator[](i) : (subgeo_dim == 1) ? edge(i) : (subgeo_dim == 2) ? face(i) : dis_ie(); }
size_type subgeo_n_node (size_type subgeo_dim, size_type loc_isid) const {
return reference_element::subgeo_n_node (variant(), order(), subgeo_dim, loc_isid); }
size_type subgeo_local_node (size_type subgeo_dim, size_type loc_isid, size_type loc_jsidnod) const {
return reference_element::subgeo_local_node (variant(), order(), subgeo_dim, loc_isid, loc_jsidnod); }
size_type subgeo_size (size_type subgeo_dim, size_type loc_isid) const {
return reference_element::subgeo_n_node (variant(), 1, subgeo_dim, loc_isid); }
size_type subgeo_local_vertex(size_type subgeo_dim, size_type i_subgeo, size_type i_subgeo_vertex) const {
return reference_element::subgeo_local_node (variant(), 1, subgeo_dim, i_subgeo, i_subgeo_vertex); }
size_type first_inod (size_type subgeo_dim) const {
return reference_element::first_inod (variant(), order(), subgeo_dim); }
size_type last_inod (size_type subgeo_dim) const {
return reference_element::last_inod (variant(), order(), subgeo_dim); }
size_type n_edge () const { return n_subgeo (1); }
size_type n_face () const { return n_subgeo (2); }
// orientation accessors:
// search S in all sides of K
const geo_element& S,
size_type& loc_isid,
size_type& shift) const;
const geo_element& S,
side_information_type& sid) const;
// compare two sides: S and *this
orientation_type& orient, shift_type& shift) const;
size_type dis_iv0, size_type dis_iv1, size_type dis_iv2,
shift_type& shift) const;
size_type dis_iv0, size_type dis_iv1, size_type dis_iv2, size_type dis_iv3,
shift_type& shift) const;
// i/o;
void put (std::ostream& is) const;
void get (std::istream& os);
field::size_type size_type
Definition branch.cc:430
see the edge page for the full documentation
geo_element_auto< heap_allocator< size_type > > automatic_type
size_type subgeo_n_node(size_type subgeo_dim, size_type loc_isid) const
geo_element_indirect::orientation_type orientation_type
bool get_orientation_and_shift(const geo_element &S, orientation_type &orient, shift_type &shift) const
return orientation and shift between *this element and S
virtual iterator _data_begin()=0
size_type & operator[](size_type loc_inod)
size_type n_node() const
size_type subgeo_local_vertex(size_type subgeo_dim, size_type i_subgeo, size_type i_subgeo_vertex) const
size_type first_inod(size_type subgeo_dim) const
size_type size() const
reference_element::size_type size_type
size_type n_edge() const
void set_ios_dis_ie(size_type ios_dis_ie)
size_t index() const
Definition msh2geo.cc:237
void put(std::ostream &is) const
size_type dimension() const
size_type ios_dis_ie() const
static size_type _face_offset(variant_type variant, size_type order)
void get(std::istream &os)
const size_type * const_iterator
size_type subgeo_size(size_type subgeo_dim, size_type loc_isid) const
const geo_element_indirect & edge_indirect(size_type i) const
orientation_type get_side_orientation(const geo_element &S) const
size_type master(bool i) const
size_type & node(size_type loc_inod)
variant_type variant() const
geo_element & operator=(const geo_element &K)
orientation_type get_edge_orientation(size_type dis_iv0, size_type dis_iv1) const
static size_type _node_offset(variant_type variant, size_type order)
size_type _data_size() const
geo_element_indirect::shift_type shift_type
orientation_type get_side_informations(const geo_element &S, size_type &loc_isid, size_type &shift) const
size_type n_subgeo(size_type subgeo_dim) const
geo_element generic_type
size_type dis_ie() const
void set_master(bool i, size_type dis_ie) const
size_type n_face() const
const geo_element_indirect & face_indirect(size_type i) const
virtual void reset(variant_type variant, size_type order)=0
reference_element::variant_type variant_type
size_type subgeo_local_node(size_type subgeo_dim, size_type loc_isid, size_type loc_jsidnod) const
size_type last_inod(size_type subgeo_dim) const
size_type order() const
size_type subgeo_dis_index(size_type subgeo_dim, size_type i) const
void set_dis_ie(size_type dis_ie)
static size_type _edge_offset(variant_type variant, size_type order)
static size_type subgeo_local_node(variant_type variant, size_type order, size_type subgeo_dim, size_type loc_isid, size_type loc_jsidnod)
static size_type first_inod(variant_type variant, size_type order, size_type subgeo_dim)
static const variant_type max_variant
static size_type last_inod(variant_type variant, size_type order, size_type subgeo_dim)
static size_type subgeo_n_node(variant_type variant, size_type order, size_type subgeo_dim, size_type loc_isid)
std::vector< int >::size_type size_type
static size_type n_node(variant_type variant, size_type order)
size_type n_subgeo(size_type subgeo_dim) const
const size_t face[n_face][4]
Definition sphere.icc:25
};