v0.14.0
Public Member Functions | Public Attributes | List of all members
MoFEM::RefElement_PRISM Struct Reference

keeps data about abstract PRISM finite element More...

#include <src/multi_indices/RefElementMultiIndices.hpp>

Inheritance diagram for MoFEM::RefElement_PRISM:
[legend]
Collaboration diagram for MoFEM::RefElement_PRISM:
[legend]

Public Member Functions

 RefElement_PRISM (const boost::shared_ptr< RefEntity > &ref_ents_ptr)
 
virtual ~RefElement_PRISM ()=default
 
const boost::shared_ptr< SideNumber > & getSideNumberPtr (const EntityHandle ent) const
 
const BitRefEdgesgetBitRefEdges () const
 
int getBitRefEdgesUlong () const
 
- Public Member Functions inherited from MoFEM::RefElement
 RefElement (const boost::shared_ptr< RefEntity > &ref_ents_ptr)
 
virtual ~RefElement ()=default
 
SideNumber_multiIndexgetSideNumberTable () const
 
boost::shared_ptr< RefEntity > & getRefEntityPtr () const
 Get pointer to RefEntity. More...
 
- Public Member Functions inherited from MoFEM::interface_RefEntity< RefEntity >
 interface_RefEntity (const boost::shared_ptr< RefEntity > &sptr)
 
 interface_RefEntity (const interface_RefEntity< RefEntity > &interface)
 
virtual ~interface_RefEntity ()=default
 
int getSideNumber () const
 
boost::shared_ptr< SideNumbergetSideNumberPtr () const
 Get the Side number. More...
 
const boost::shared_ptr< BasicEntityDatagetBasicDataPtr () const
 Get pointer to basic data struture. More...
 
EntityHandle getEnt () const
 Get the entity handle. More...
 
EntityType getParentEntType () const
 Get patent entity. More...
 
EntityHandle getParentEnt () const
 
BitRefLevelgetBitRefLevelPtr () const
 Get pointer to bit ref level tag. More...
 
const BitRefLevelgetBitRefLevel () const
 
unsigned long int getBitRefLevelULong () const
 Get entity ref bit refinement as ulong. More...
 
EntityType getEntType () const
 Get entity type. More...
 
int getEntDimension () const
 Get the Ent Dimension. More...
 
const char * getEntTypeName () const
 Get the Ent Type Name. More...
 
EntityID getEntId () const
 get entity id More...
 
EntityHandle getOwnerEnt () const
 
EntityHandlegetOwnerEnt ()
 
int getOwnerProc () const
 
int getPartProc () const
 
int * getPartProcPtr () const
 Get pointer to partition tag. More...
 
unsigned char getPStatus () const
 
int * getSharingProcsPtr () const
 get shared processors More...
 
EntityHandlegetSharingHandlersPtr () const
 get sharid entity handlers More...
 
boost::shared_ptr< RefEntity > & getRefEntityPtr () const
 

Public Attributes

BitRefEdgestag_BitRefEdges
 
- Public Attributes inherited from MoFEM::RefElement
SideNumber_multiIndex side_number_table
 
- Public Attributes inherited from MoFEM::interface_RefEntity< RefEntity >
boost::shared_ptr< RefEntitysPtr
 

Additional Inherited Members

- Public Types inherited from MoFEM::RefElement
typedef interface_RefEntity< RefEntityinterface_type_RefEntity
 
- Static Public Attributes inherited from MoFEM::RefElement
static BitRefEdges DummyBitRefEdges = BitRefEdges(0)
 
static const boost::shared_ptr< SideNumbernullSideNumber
 

Detailed Description

keeps data about abstract PRISM finite element

Definition at line 66 of file RefElementMultiIndices.hpp.

Constructor & Destructor Documentation

◆ RefElement_PRISM()

MoFEM::RefElement_PRISM::RefElement_PRISM ( const boost::shared_ptr< RefEntity > &  ref_ents_ptr)

Definition at line 44 of file RefElementMultiIndices.cpp.

46  : RefElement(ref_ents_ptr) {
47  Tag th_RefBitEdge;
48  moab::Interface &moab = getRefEntityPtr()->getBasicDataPtr()->moab;
49  rval = moab.tag_get_handle("_RefBitEdge", th_RefBitEdge);
51  rval = moab.tag_get_by_ptr(th_RefBitEdge, &ref_ents_ptr->ent, 1,
52  (const void **)&tag_BitRefEdges);
54  switch (ref_ents_ptr->getEntType()) {
55  case MBPRISM:
56  break;
57  default:
58  THROW_MESSAGE("this work only for PRISMs");
59  }
60  EntityHandle prism = getEnt();
61  int num_nodes;
62  const EntityHandle *conn;
63  rval = moab.get_connectivity(prism, conn, num_nodes, true);
65  assert(num_nodes == 6);
66  for (int nn = 0; nn != 6; ++nn) {
68  .insert(
69  boost::shared_ptr<SideNumber>(new SideNumber(conn[nn], nn, 0, -1)));
70  }
71  // Range face_side3, face_side4;
72  // CHKERR moab.get_adjacencies(conn, 3, 2, true, face_side3);
73  // CHKERR moab.get_adjacencies(&conn[3], 3, 2, true, face_side4);
74  // if (face_side3.size() != 1)
75  // THROW_MESSAGE("prism don't have side face 3");
76  // if (face_side4.size() != 1)
77  // THROW_MESSAGE("prims don't have side face 4");
78  // getSideNumberPtr(*face_side3.begin());
79  // getSideNumberPtr(*face_side4.begin());
80 }

◆ ~RefElement_PRISM()

virtual MoFEM::RefElement_PRISM::~RefElement_PRISM ( )
virtualdefault

Member Function Documentation

◆ getBitRefEdges()

const BitRefEdges& MoFEM::RefElement_PRISM::getBitRefEdges ( ) const
inlinevirtual

Reimplemented from MoFEM::RefElement.

Definition at line 73 of file RefElementMultiIndices.hpp.

73 { return *tag_BitRefEdges; }

◆ getBitRefEdgesUlong()

int MoFEM::RefElement_PRISM::getBitRefEdgesUlong ( ) const
inlinevirtual

Reimplemented from MoFEM::RefElement.

Definition at line 74 of file RefElementMultiIndices.hpp.

74 { return getBitRefEdges().to_ulong(); }

◆ getSideNumberPtr()

const boost::shared_ptr< SideNumber > & MoFEM::RefElement_PRISM::getSideNumberPtr ( const EntityHandle  ent) const
virtual

Reimplemented from MoFEM::RefElement.

Definition at line 82 of file RefElementMultiIndices.cpp.

82  {
83 
84  moab::Interface &moab = getRefEntityPtr()->getBasicDataPtr()->moab;
85 
86  SideNumber_multiIndex::iterator miit = side_number_table.find(ent);
87  // this int is in table then return pointer
88  if (miit != side_number_table.end())
89  return *miit;
90 
91  // if ent is a this prism
92  if (sPtr->ent == ent) {
93  miit =
95  .insert(boost::shared_ptr<SideNumber>(new SideNumber(ent, 0, 0, 0)))
96  .first;
97  return *miit;
98  }
99 
100  // if ent is meshset
101  if (type_from_handle(ent) == MBENTITYSET) {
102  miit =
104  .insert(boost::shared_ptr<SideNumber>(new SideNumber(ent, 0, 0, 0)))
105  .first;
106  return *miit;
107  }
108 
109  // use moab to get sense, side and offset
110 
111  int side_number, sense, offset;
112  rval = moab.side_number(sPtr->ent, ent, side_number, sense, offset);
113 
114  // it has to be degenerated prism, get sense from nodes topology
115  if (side_number == -1 || rval != MB_SUCCESS) {
116 
117  if (type_from_handle(ent) == MBVERTEX) {
118  THROW_MESSAGE("Huston we have problem, vertex (specified by ent) is not "
119  "part of prism, that is impossible (top tip: check your "
120  "prisms)");
121  }
122 
123  // get prism connectivity
124  int num_nodes;
125  const EntityHandle *conn;
126  rval = moab.get_connectivity(sPtr->ent, conn, num_nodes, true);
127  MOAB_THROW(rval);
128  assert(num_nodes == 6);
129  // get ent connectivity
130  const EntityHandle *conn_ent;
131  rval = moab.get_connectivity(ent, conn_ent, num_nodes, true);
132  MOAB_THROW(rval);
133 
134  // for(int nn = 0; nn<6;nn++) {
135  // std::cerr << conn[nn] << " ";
136  // };
137  // std::cerr << std::endl;
138  // for(int nn = 0; nn<num_nodes;nn++) {
139  // std::cerr << conn_ent[nn] << " ";
140  // }
141  // std::cerr << std::endl;
142 
143  // bottom face
144  EntityHandle face3[3] = {conn[0], conn[1], conn[2]};
145  // top face
146  EntityHandle face4[3] = {conn[3], conn[4], conn[5]};
147  if (num_nodes == 3) {
148  int sense_p1_map[3][3] = {{0, 1, 2}, {1, 2, 0}, {2, 0, 1}};
149  int sense_m1_map[3][3] = {{0, 2, 1}, {1, 0, 2}, {2, 1, 0}};
150  EntityHandle *conn0_3_ptr = std::find(face3, &face3[3], conn_ent[0]);
151  if (conn0_3_ptr != &face3[3]) {
152  offset = std::distance(face3, conn0_3_ptr);
153  if (face3[sense_p1_map[offset][0]] == conn_ent[0] &&
154  face3[sense_p1_map[offset][1]] == conn_ent[1] &&
155  face3[sense_p1_map[offset][2]] == conn_ent[2]) {
156  miit = const_cast<SideNumber_multiIndex &>(side_number_table)
157  .insert(boost::shared_ptr<SideNumber>(
158  new SideNumber(ent, 3, 1, offset)))
159  .first;
160  return *miit;
161  } else if (face3[sense_m1_map[offset][0]] == conn_ent[0] &&
162  face3[sense_m1_map[offset][1]] == conn_ent[1] &&
163  face3[sense_m1_map[offset][2]] == conn_ent[2]) {
164  miit = const_cast<SideNumber_multiIndex &>(side_number_table)
165  .insert(boost::shared_ptr<SideNumber>(
166  new SideNumber(ent, 3, -1, offset)))
167  .first;
168  return *miit;
169  }
170  }
171  EntityHandle *conn0_4_ptr = std::find(face4, &face4[3], conn_ent[0]);
172  if (conn0_4_ptr != &face4[3]) {
173  offset = std::distance(face4, conn0_4_ptr);
174  if (face4[sense_p1_map[offset][0]] == conn_ent[0] &&
175  face4[sense_p1_map[offset][1]] == conn_ent[1] &&
176  face4[sense_p1_map[offset][2]] == conn_ent[2]) {
177  miit = const_cast<SideNumber_multiIndex &>(side_number_table)
178  .insert(boost::shared_ptr<SideNumber>(
179  new SideNumber(ent, 4, 1, 3 + offset)))
180  .first;
181  return *miit;
182  } else if (face4[sense_m1_map[offset][0]] == conn_ent[0] &&
183  face4[sense_m1_map[offset][1]] == conn_ent[1] &&
184  face4[sense_m1_map[offset][2]] == conn_ent[2]) {
185  miit = const_cast<SideNumber_multiIndex &>(side_number_table)
186  .insert(boost::shared_ptr<SideNumber>(
187  new SideNumber(ent, 4, -1, 3 + offset)))
188  .first;
189  return *miit;
190  } else {
191  std::cerr << conn_ent[0] << " " << conn_ent[1] << " " << conn_ent[2]
192  << std::endl;
193  std::cerr << face3[0] << " " << face3[1] << " " << face3[2]
194  << std::endl;
195  std::cerr << face4[0] << " " << face4[1] << " " << face4[2]
196  << std::endl;
197  std::cerr << offset << std::endl;
198  THROW_MESSAGE("Huston we have problem");
199  }
200  }
201  THROW_MESSAGE("Huston we have problem");
202  }
203 
204  if (num_nodes == 2) {
205  {
206  // Triangle edges
207  EntityHandle edges[6][2] = {
208  {conn[0], conn[1]} /*0*/, {conn[1], conn[2]} /*1*/,
209  {conn[2], conn[0]} /*2*/, {conn[3], conn[4]} /*3+3*/,
210  {conn[4], conn[5]} /*3+4*/, {conn[5], conn[3]} /*3+5*/
211  };
212  for (int ee = 0; ee < 6; ee++) {
213  if (((conn_ent[0] == edges[ee][0]) &&
214  (conn_ent[1] == edges[ee][1])) ||
215  ((conn_ent[0] == edges[ee][1]) &&
216  (conn_ent[1] == edges[ee][0]))) {
217  side_number = ee;
218  if (ee >= 3) {
219  side_number += 3;
220  EntityHandle *conn0_4_ptr =
221  std::find(face4, &face4[3], conn_ent[0]);
222  offset = std::distance(face4, conn0_4_ptr) + 3;
223  } else {
224  EntityHandle *conn0_3_ptr =
225  std::find(face3, &face3[3], conn_ent[0]);
226  offset = std::distance(face3, conn0_3_ptr);
227  }
228  sense = 1;
229  if ((conn_ent[0] == edges[ee][1]) && (conn_ent[1] == edges[ee][0]))
230  sense = -1;
231  miit = const_cast<SideNumber_multiIndex &>(side_number_table)
232  .insert(boost::shared_ptr<SideNumber>(
233  new SideNumber(ent, side_number, sense, offset)))
234  .first;
235  return *miit;
236  }
237  }
238  }
239  // {
240  // // Edges through thickness
241  // EntityHandle edges[3][2] = {
242  // { conn[0], conn[3] }, { conn[1], conn[4] }, { conn[2], conn[5] }
243  // };
244  // for(int ee = 0;ee<3;ee++) {
245  // if(
246  // (( conn_ent[0] == edges[ee][0] )&&( conn_ent[1] == edges[ee][1]
247  // ))||
248  // (( conn_ent[0] == edges[ee][1] )&&( conn_ent[1] == edges[ee][0]
249  // ))
250  // ) {
251  // side_number = 3+ee;
252  // offset = std::distance(conn,find(conn,&conn[6],conn_ent[0]));
253  // sense = 1;
254  // if(( conn_ent[0] == edges[ee][1] )&&( conn_ent[1] == edges[ee][0]
255  // )) sense = -1; miit =
256  // const_cast<SideNumber_multiIndex&>(side_number_table).insert(SideNumber(ent,side_number,sense,offset)).first;
257  // return const_cast<SideNumber*>(&*miit);
258  // }
259  // }
260  // }
261  // for(int nn = 0; nn<6;nn++) {
262  // std::cerr << conn[nn] << " ";
263  // };
264  // std::cerr << std::endl;
265  // std::cerr << conn_ent[0] << " " << conn_ent[1] << std::endl;
266  THROW_MESSAGE("Huston we have problem");
267  }
268  std::ostringstream sss;
269  sss << "this not working: " << ent << " type: " << type_from_handle(ent)
270  << " " << MBEDGE << " " << MBTRI << std::endl;
271  THROW_MESSAGE(sss.str().c_str());
272  }
273  miit = const_cast<SideNumber_multiIndex &>(side_number_table)
274  .insert(boost::shared_ptr<SideNumber>(
275  new SideNumber(ent, side_number, sense, offset)))
276  .first;
277  return *miit;
278  THROW_MESSAGE("not implemented");
279  return nullSideNumber;
280 }

Member Data Documentation

◆ tag_BitRefEdges

BitRefEdges* MoFEM::RefElement_PRISM::tag_BitRefEdges

Definition at line 67 of file RefElementMultiIndices.hpp.


The documentation for this struct was generated from the following files:
MoFEM::RefElement::RefElement
RefElement(const boost::shared_ptr< RefEntity > &ref_ents_ptr)
Definition: RefElementMultiIndices.cpp:15
MoFEM::RefElement::nullSideNumber
static const boost::shared_ptr< SideNumber > nullSideNumber
Definition: RefElementMultiIndices.hpp:34
EntityHandle
MoFEM::interface_RefEntity< RefEntity >::sPtr
boost::shared_ptr< RefEntity > sPtr
Definition: RefEntsMultiIndices.hpp:711
MoFEM::interface_RefEntity< RefEntity >::getEnt
EntityHandle getEnt() const
Get the entity handle.
Definition: RefEntsMultiIndices.hpp:603
MOAB_THROW
#define MOAB_THROW(err)
Check error code of MoAB function and throw MoFEM exception.
Definition: definitions.h:541
THROW_MESSAGE
#define THROW_MESSAGE(msg)
Throw MoFEM exception.
Definition: definitions.h:561
MoFEM::Interface
DeprecatedCoreInterface Interface
Definition: Interface.hpp:1975
MoFEM::Exceptions::rval
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval
Definition: Exceptions.hpp:74
SideNumber_multiIndex
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.
Definition: RefEntsMultiIndices.hpp:101
MoFEM::RefElement::getRefEntityPtr
boost::shared_ptr< RefEntity > & getRefEntityPtr() const
Get pointer to RefEntity.
Definition: RefElementMultiIndices.hpp:45
MoFEM::type_from_handle
auto type_from_handle(const EntityHandle h)
get type from entity handle
Definition: Templates.hpp:1869
MoFEM::RefElement_PRISM::tag_BitRefEdges
BitRefEdges * tag_BitRefEdges
Definition: RefElementMultiIndices.hpp:67
MoFEM::RefElement_PRISM::getBitRefEdges
const BitRefEdges & getBitRefEdges() const
Definition: RefElementMultiIndices.hpp:73
MoFEM::RefElement::side_number_table
SideNumber_multiIndex side_number_table
Definition: RefElementMultiIndices.hpp:22