36#include "QuadraticMeshHelper.hpp"
38#define SEEK_TO_CONTENT(methNameDirect, methNameIncrement, index) \
40 if (rMeshReader.IsFileFormatBinary()) { \
41 rMeshReader.methNameDirect(index - 1u); \
43 for (unsigned i=0; i<index-1u; ++i) { \
44 rMeshReader.methNameIncrement(); \
47template<
unsigned ELEMENT_DIM,
unsigned SPACE_DIM>
49 unsigned boundaryElementIndex)
51 SEEK_TO_CONTENT(GetFaceData, GetNextFaceData, boundaryElementIndex);
66 std::set<unsigned> owned_element_indices;
71 owned_element_indices.insert(iter->GetIndex());
81 std::vector<unsigned> nodes = iter->NodeIndices;
82 assert(nodes.size()==(DIM+1)*(DIM+2)/2);
87 for (
unsigned j=DIM+1; j<(DIM+1)*(DIM+2)/2; j++)
89 unsigned node_index = nodes[j];
90 if (!r_node_perm.empty())
92 node_index = r_node_perm[node_index];
103template<
unsigned DIM>
122 AddNodesToBoundaryElements(pMesh, pMeshReader);
127template<
unsigned DIM>
133 bool boundary_element_file_has_containing_element_info =
false;
142 if (boundary_element_file_has_containing_element_info)
144 pMeshReader->
Reset();
150 unsigned next_face_on_file = 0u;
158 std::set<unsigned> boundary_element_node_indices;
159 for (
unsigned i=0; i<DIM; i++)
161 boundary_element_node_indices.insert( (*iter)->GetNodeGlobalIndex(i) );
164 bool found_this_boundary_element =
false;
170 Node<DIM>* p_representative_node = (*iter)->GetNode(0);
175 unsigned elem_index = *element_iter;
178 if (boundary_element_file_has_containing_element_info)
180 unsigned face_index = (*iter)->
GetIndex();
187 while (face_index >= next_face_on_file);
193 for (
unsigned face=0; face<DIM+1; face++)
196 std::set<unsigned> node_indices;
197 for (
unsigned local_node_index=0; local_node_index<DIM+1; local_node_index++)
199 if (local_node_index != face)
205 assert(node_indices.size()==DIM);
208 if (node_indices == boundary_element_node_indices)
212 found_this_boundary_element =
true;
218 if (boundary_element_file_has_containing_element_info && !found_this_boundary_element)
222 EXCEPTION(
"Boundary element " << (*iter)->GetIndex()
223 <<
"wasn't found in the containing element given for it "
228 if (found_this_boundary_element)
234 if (!found_this_boundary_element)
237 EXCEPTION(
"Unable to find a face of an element which matches one of the boundary elements");
244template<
unsigned DIM>
248 unsigned expected_num_nodes = DIM*(DIM+1)/2;
253 assert((*iter)->GetNumNodes() == expected_num_nodes);
258template<
unsigned DIM>
272 pBoundaryElement->
AddNode(pNode);
275template<
unsigned DIM>
279 unsigned internalNode)
282 assert(internalNode >= DIM+1);
283 assert(internalNode < (DIM+1)*(DIM+2)/2);
285 AddNodeToBoundaryElement(pMesh, pBoundaryElement, p_internal_node);
288template<
unsigned DIM>
292 unsigned nodeIndexOppositeToFace)
297 assert(nodeIndexOppositeToFace<3);
299 AddNodeToBoundaryElement(pMesh, pBoundaryElement, pElement, nodeIndexOppositeToFace+3);
311 if (nodeIndexOppositeToFace==0)
314 HelperMethod1(b_elem_n0, b_elem_n1, pElement, 1, 2, 3, offset, reverse);
315 HelperMethod2(pMesh, pBoundaryElement, pElement, 9, 8, 5, offset, reverse);
317 else if (nodeIndexOppositeToFace==1)
320 HelperMethod1(b_elem_n0, b_elem_n1, pElement, 2, 0, 3, offset, reverse);
321 HelperMethod2(pMesh, pBoundaryElement, pElement, 7, 9, 6, offset, reverse);
323 else if (nodeIndexOppositeToFace==2)
326 HelperMethod1(b_elem_n0, b_elem_n1, pElement, 0, 1, 3, offset, reverse);
327 HelperMethod2(pMesh, pBoundaryElement, pElement, 8, 7, 4, offset, reverse);
331 assert(nodeIndexOppositeToFace==3);
333 HelperMethod1(b_elem_n0, b_elem_n1, pElement, 0, 1, 2, offset, reverse);
334 HelperMethod2(pMesh, pBoundaryElement, pElement, 5, 6, 4, offset, reverse);
344template<
unsigned DIM>
347 unsigned node0,
unsigned node1,
unsigned node2,
396template<
unsigned DIM>
400 unsigned internalNode0,
unsigned internalNode1,
unsigned internalNode2,
406 unsigned temp = internalNode0;
407 internalNode0 = internalNode1;
408 internalNode1 = internalNode2;
409 internalNode2 = temp;
411 else if (offset == 2)
413 unsigned temp = internalNode0;
414 internalNode0 = internalNode2;
415 internalNode2 = internalNode1;
416 internalNode1 = temp;
421 unsigned temp = internalNode1;
422 internalNode1 = internalNode2;
423 internalNode2 = temp;
426 AddNodeToBoundaryElement(pMesh, pBoundaryElement, pElement, internalNode0);
427 AddNodeToBoundaryElement(pMesh, pBoundaryElement, pElement, internalNode1);
428 AddNodeToBoundaryElement(pMesh, pBoundaryElement, pElement, internalNode2);
#define EXCEPTION(message)
Node< SPACE_DIM > * GetNode(unsigned localIndex) const
unsigned GetNumNodes() const
unsigned GetNodeGlobalIndex(unsigned localIndex) const
void AddNode(Node< SPACE_DIM > *pNode)
unsigned GetIndex() const
ElementIterator GetElementIteratorBegin()
virtual bool GetReadContainingElementOfBoundaryElement()
virtual unsigned GetOrderOfBoundaryElements()
virtual ElementData GetNextFaceData()=0
ElementIterator GetElementIteratorEnd()
virtual Node< SPACE_DIM > * GetNodeOrHaloNode(unsigned index) const
std::vector< Node< SPACE_DIM > * > mBoundaryNodes
const std::vector< unsigned > & rGetNodePermutation() const
virtual unsigned GetNumLocalBoundaryElements() const
ElementIterator GetElementIteratorBegin(bool skipDeletedElements=true)
virtual unsigned GetNumLocalElements() const
ElementIterator GetElementIteratorEnd()
Element< ELEMENT_DIM, SPACE_DIM > * GetElement(unsigned index) const
BoundaryElementIterator GetBoundaryElementIteratorBegin() const
BoundaryElementIterator GetBoundaryElementIteratorEnd() const
ContainingElementIterator ContainingElementsEnd() const
void AddElement(unsigned index)
ContainingElementIterator ContainingElementsBegin() const
bool IsBoundaryNode() const
unsigned GetIndex() const
void SetAsBoundaryNode(bool value=true)
static void AddExtraBoundaryNodes(AbstractTetrahedralMesh< DIM, DIM > *pMesh, BoundaryElement< DIM-1, DIM > *pBoundaryElement, Element< DIM, DIM > *pElement, unsigned nodeIndexOppositeToFace)
static void AddNodeToBoundaryElement(AbstractTetrahedralMesh< DIM, DIM > *pMesh, BoundaryElement< DIM-1, DIM > *pBoundaryElement, Element< DIM, DIM > *pElement, unsigned internalNode)
static void HelperMethod2(AbstractTetrahedralMesh< DIM, DIM > *pMesh, BoundaryElement< DIM-1, DIM > *pBoundaryElement, Element< DIM, DIM > *pElement, unsigned internalNode0, unsigned internalNode1, unsigned internalNode2, unsigned offset, bool reverse)
static void CheckBoundaryElements(AbstractTetrahedralMesh< DIM, DIM > *pMesh)
static void AddNodesToBoundaryElements(AbstractTetrahedralMesh< DIM, DIM > *pMesh, AbstractMeshReader< DIM, DIM > *pMeshReader)
static void HelperMethod1(unsigned boundaryElemNode0, unsigned boundaryElemNode1, Element< DIM, DIM > *pElement, unsigned node0, unsigned node1, unsigned node2, unsigned &rOffset, bool &rReverse)
static void AddInternalNodesToBoundaryElements(AbstractTetrahedralMesh< DIM, DIM > *pMesh, AbstractMeshReader< DIM, DIM > *pMeshReader)
static void AddInternalNodesToElements(AbstractTetrahedralMesh< DIM, DIM > *pMesh, AbstractMeshReader< DIM, DIM > *pMeshReader)
unsigned ContainingElement