v0.15.0
Loading...
Searching...
No Matches
RefElementMultiIndices.hpp
Go to the documentation of this file.
1/** \file RefElementMultiIndices.hpp
2 * \brief Multi-index contains, data structures for mofem finite elements and
3 * other low-level functions
4 */
5
6
7#ifndef __REF_ELEMENT_MULTIINDICES_HPP__
8#define __REF_ELEMENT_MULTIINDICES_HPP__
9
10namespace MoFEM {
11
12/**
13 * \brief keeps data about abstract refined finite element
14 * \ingroup fe_multi_indices
15 */
16struct RefElement : public interface_RefEntity<RefEntity> {
17
19
20 RefElement(const boost::shared_ptr<RefEntity> &ref_ents_ptr);
21 virtual ~RefElement() = default;
22
23 virtual const BitRefEdges &getBitRefEdges() const { return DummyBitRefEdges; }
24
25 virtual int getBitRefEdgesUlong() const { return 0; }
26
30
31 virtual const boost::shared_ptr<SideNumber> &
32 getSideNumberPtr(const EntityHandle ent) const {
33 NOT_USED(ent);
34 return nullSideNumber;
35 };
36
37 /**
38 * \brief Get pointer to RefEntity
39 */
40 inline boost::shared_ptr<RefEntity> &getRefEntityPtr() const {
41 return this->sPtr;
42 }
43
44 friend std::ostream &operator<<(std::ostream &os, const RefElement &e);
45
46 protected:
47
50 static const boost::shared_ptr<SideNumber> nullSideNumber;
51};
52
53/**
54 * \brief keeps data about abstract MESHSET finite element
55 * \ingroup fe_multi_indices
56 */
58 RefElement_MESHSET(const boost::shared_ptr<RefEntity> &ref_ents_ptr);
59 virtual ~RefElement_MESHSET() = default;
60 const boost::shared_ptr<SideNumber> &
61 getSideNumberPtr(const EntityHandle ent) const;
62};
63/**
64 * \brief keeps data about abstract PRISM finite element
65 * \ingroup fe_multi_indices
66 */
69 RefElement_PRISM(const boost::shared_ptr<RefEntity> &ref_ents_ptr);
70 virtual ~RefElement_PRISM() = default;
71
72 const boost::shared_ptr<SideNumber> &
73 getSideNumberPtr(const EntityHandle ent) const;
74 const BitRefEdges &getBitRefEdges() const { return *tag_BitRefEdges; }
75 int getBitRefEdgesUlong() const { return getBitRefEdges().to_ulong(); }
76};
77
78/**
79 * \brief keeps data about abstract TET finite element
80 * \ingroup fe_multi_indices
81 */
84 RefElementVolume(const boost::shared_ptr<RefEntity> &ref_ents_ptr);
85 virtual ~RefElementVolume() = default;
86
87 const boost::shared_ptr<SideNumber> &
88 getSideNumberPtr(const EntityHandle ent) const;
92 const BitRefEdges &getBitRefEdges() const { return *tag_BitRefEdges; }
93 int getBitRefEdgesUlong() const { return getBitRefEdges().to_ulong(); }
94};
95
96/**
97 * \brief keeps data about abstract TRI finite element
98 * \ingroup fe_multi_indices
99 */
100struct RefElementFace : public RefElement {
101 RefElementFace(const boost::shared_ptr<RefEntity> &ref_ents_ptr);
102 virtual ~RefElementFace() = default;
103 const boost::shared_ptr<SideNumber> &
104 getSideNumberPtr(const EntityHandle ent) const;
105 friend std::ostream &operator<<(std::ostream &os, const RefElementFace &e);
106};
107
108/**
109 * \brief keeps data about abstract EDGE finite element
110 * \ingroup fe_multi_indices
111 */
113 RefElement_EDGE(const boost::shared_ptr<RefEntity> &ref_ents_ptr);
114 virtual ~RefElement_EDGE() = default;
115 const boost::shared_ptr<SideNumber> &
116 getSideNumberPtr(const EntityHandle ent) const;
117 friend std::ostream &operator<<(std::ostream &os, const RefElement_EDGE &e);
118};
119
120/**
121 * \brief keeps data about abstract VERTEX finite element
122 * \ingroup fe_multi_indices
123 */
125 RefElement_VERTEX(const boost::shared_ptr<RefEntity> &ref_ents_ptr);
126 virtual ~RefElement_VERTEX() = default;
127 const boost::shared_ptr<SideNumber> &
128 getSideNumberPtr(const EntityHandle ent) const;
129 friend std::ostream &operator<<(std::ostream &os, const RefElement_VERTEX &e);
130};
131
132/**
133 * \brief intrface to RefElement
134 * \ingroup fe_multi_indices
135 */
136template <typename T> struct interface_RefElement : interface_RefEntity<T> {
137
140
141 interface_RefElement(const boost::shared_ptr<T> &sptr)
142 : interface_RefEntity<T>(sptr) {}
143 virtual ~interface_RefElement() = default;
144
145 inline int getBitRefEdgesUlong() const {
146 return this->sPtr->getBitRefEdgesUlong();
147 }
148
150 return this->sPtr->getSideNumberTable();
151 }
152
153 inline const boost::shared_ptr<SideNumber> &
155 return this->sPtr->getSideNumberPtr(ent);
156 }
157
158 inline boost::shared_ptr<RefEntity> &getRefEntityPtr() const {
159 return this->sPtr->getRefEntityPtr();
160 }
161
162 inline boost::shared_ptr<T> &getRefElement() const { return this->sPtr; }
163};
164
165/**
166 * \typedef RefElement_multiIndex
167 * type multiIndex container for RefElement
168 * \ingroup fe_multi_indices
169 *
170 * \param hashed_unique Ent_mi_tag
171 * \param ordered_non_unique Meshset_mi_tag
172 * \param ordered_non_unique Ent_Ent_mi_tag
173 * \param ordered_non_unique Composite_ParentEnt_And_BitsOfRefinedEdges_mi_tag
174 */
175typedef multi_index_container<
176 boost::shared_ptr<RefElement>,
177 // ptrWrapperRefElement,
178 indexed_by<ordered_unique<
179 tag<Ent_mi_tag>, const_mem_fun<RefElement::interface_type_RefEntity,
182
183
184
185} // namespace MoFEM
186
187#endif // __REF_ELEMENT_MULTIINDICES_HPP__
188
189/**
190 * \defgroup fe_multi_indices Finite elements structures and multi-indices
191 * \ingroup mofem
192 **/
#define NOT_USED(x)
multi_index_container< boost::shared_ptr< SideNumber >, indexed_by< ordered_unique< member< SideNumber, EntityHandle, &SideNumber::ent > >, ordered_non_unique< composite_key< SideNumber, const_mem_fun< SideNumber, EntityType, &SideNumber::getEntType >, member< SideNumber, signed char, &SideNumber::side_number > > > > > SideNumber_multiIndex
SideNumber_multiIndex for SideNumber.
multi_index_container< boost::shared_ptr< RefElement >, indexed_by< ordered_unique< tag< Ent_mi_tag >, const_mem_fun< RefElement::interface_type_RefEntity, EntityHandle, &RefElement::getEnt > > > > RefElement_multiIndex
std::bitset< BITREFEDGES_SIZE > BitRefEdges
Definition Types.hpp:34
implementation of Data Operators for Forces and Sources
Definition Common.hpp:10
keeps data about abstract TRI finite element
RefElementFace(const boost::shared_ptr< RefEntity > &ref_ents_ptr)
virtual ~RefElementFace()=default
friend std::ostream & operator<<(std::ostream &os, const RefElementFace &e)
keeps data about abstract TET finite element
RefElementVolume(const boost::shared_ptr< RefEntity > &ref_ents_ptr)
const BitRefEdges & getBitRefEdges() const
SideNumber_multiIndex & getSideNumberTable() const
virtual ~RefElementVolume()=default
keeps data about abstract EDGE finite element
friend std::ostream & operator<<(std::ostream &os, const RefElement_EDGE &e)
virtual ~RefElement_EDGE()=default
RefElement_EDGE(const boost::shared_ptr< RefEntity > &ref_ents_ptr)
keeps data about abstract MESHSET finite element
virtual ~RefElement_MESHSET()=default
RefElement_MESHSET(const boost::shared_ptr< RefEntity > &ref_ents_ptr)
keeps data about abstract PRISM finite element
const BitRefEdges & getBitRefEdges() const
RefElement_PRISM(const boost::shared_ptr< RefEntity > &ref_ents_ptr)
virtual ~RefElement_PRISM()=default
keeps data about abstract VERTEX finite element
virtual ~RefElement_VERTEX()=default
RefElement_VERTEX(const boost::shared_ptr< RefEntity > &ref_ents_ptr)
friend std::ostream & operator<<(std::ostream &os, const RefElement_VERTEX &e)
keeps data about abstract refined finite element
friend std::ostream & operator<<(std::ostream &os, const RefElement &e)
virtual const BitRefEdges & getBitRefEdges() const
virtual const boost::shared_ptr< SideNumber > & getSideNumberPtr(const EntityHandle ent) const
SideNumber_multiIndex sideNumberTable
RefElement(const boost::shared_ptr< RefEntity > &ref_ents_ptr)
static BitRefEdges DummyBitRefEdges
interface_RefEntity< RefEntity > interface_type_RefEntity
boost::shared_ptr< RefEntity > & getRefEntityPtr() const
Get pointer to RefEntity.
static const boost::shared_ptr< SideNumber > nullSideNumber
SideNumber_multiIndex & getSideNumberTable() const
virtual ~RefElement()=default
virtual int getBitRefEdgesUlong() const
interface_RefElement(const boost::shared_ptr< T > &sptr)
const boost::shared_ptr< SideNumber > & getSideNumberPtr(const EntityHandle ent) const
boost::shared_ptr< RefEntity > & getRefEntityPtr() const
interface_RefElement< T > interface_type_RefElement
interface_RefEntity< T > interface_type_RefEntity
SideNumber_multiIndex & getSideNumberTable() const
boost::shared_ptr< T > & getRefElement() const
virtual ~interface_RefElement()=default
boost::shared_ptr< SideNumber > getSideNumberPtr() const