Go to the documentation of this file. 1
15
16 #include "SweptElementData.hpp"
17 #include "SweptVertexData.hpp"
18 #include "moab/Interface.hpp"
19 #include "moab/ReadUtilIface.hpp"
20 #include "moab/CN.hpp"
21 #include "Internals.hpp"
22 #include <cassert>
23
24 namespace moab
25 {
26
27 EntityID SweptElementData::calc_num_entities( EntityHandle start_handle, int irange, int jrange, int krange )
28 {
29 size_t result = 1;
30 auto dim = CN::Dimension( TYPE_FROM_HANDLE( start_handle ) );
31 switch( dim )
32 {
33 case 3:
34 result *= krange;
35
36 case 2:
37 result *= jrange;
38
39 case 1:
40 result *= irange;
41 break;
42 default:
43 result = 0;
44 assert( false );
45 break;
46 }
47 return result;
48 }
49
50 SweptElementData::SweptElementData( EntityHandle shandle,
51 const int imin,
52 const int jmin,
53 const int kmin,
54 const int imax,
55 const int jmax,
56 const int kmax,
57 const int* )
58 : SequenceData( 0, shandle, shandle + calc_num_entities( shandle, imax - imin, jmax - jmin, kmax - kmin ) - 1 )
59 {
60
61 assert( imax >= imin && jmax >= jmin && kmax >= kmin );
62
63 elementParams[0] = HomCoord( imin, jmin, kmin );
64 elementParams[1] = HomCoord( imax, jmax, kmax );
65 elementParams[2] = HomCoord( 1, 1, 1 );
66
67
68 dIJK[0] = elementParams[1][0] - elementParams[0][0] + 1;
69 dIJK[1] = elementParams[1][1] - elementParams[0][1] + 1;
70 dIJK[2] = elementParams[1][2] - elementParams[0][2] + 1;
71 dIJKm1[0] = dIJK[0] - 1;
72 dIJKm1[1] = dIJK[1] - 1;
73 dIJKm1[2] = dIJK[2] - 1;
74 }
75
76 SweptElementData::~SweptElementData() {}
77
78 bool SweptElementData::boundary_complete() const
79 {
80
81
82
83 int p;
84 std::vector< VertexDataRef > minlist, maxlist;
85
86
87
88 for( std::vector< VertexDataRef >::const_iterator vseq = vertexSeqRefs.begin(); vseq != vertexSeqRefs.end();
89 ++vseq )
90 {
91
92 bool mincorner = true;
93
94 for( p = 0; p < 3; p++ )
95 {
96
97
98 for( std::vector< VertexDataRef >::const_iterator othervseq = vertexSeqRefs.begin();
99 othervseq != vertexSeqRefs.end(); ++othervseq )
100 {
101 if( othervseq == vseq ) continue;
102
103 if( ( *othervseq ).contains( ( *vseq ).minmax[0] - HomCoord::unitv[p] ) )
104 {
105
106 mincorner = false;
107 break;
108 }
109 }
110 if( !mincorner ) break;
111 }
112
113 bool maxcorner = true;
114
115 for( p = 0; p < 3; p++ )
116 {
117
118
119 for( std::vector< VertexDataRef >::const_iterator othervseq = vertexSeqRefs.begin();
120 othervseq != vertexSeqRefs.end(); ++othervseq )
121 {
122 if( othervseq == vseq ) continue;
123
124 if( ( *othervseq ).contains( ( *vseq ).minmax[1] + HomCoord::unitv[p] ) )
125 {
126
127 maxcorner = false;
128 break;
129 }
130 }
131 if( !maxcorner ) break;
132 }
133
134
135 if( mincorner ) minlist.push_back( *vseq );
136
137 if( maxcorner ) maxlist.push_back( *vseq );
138 }
139
140
141
142
143 if( minlist.size() == 1 && maxlist.size() == 1 && minlist[0].minmax[0] == elementParams[0] &&
144 maxlist[0].minmax[1] == elementParams[1] )
145
146 return true;
147
148
149 return false;
150 }
151
152 SequenceData* SweptElementData::subset( EntityHandle ,
153 EntityHandle ,
154 const int* ,
155 const int* ) const
156 {
157 return 0;
158 }
159
160 unsigned long SweptElementData::get_memory_use() const
161 {
162 return sizeof( *this ) + vertexSeqRefs.capacity() * sizeof( VertexDataRef );
163 }
164
165 }