#include <SweptElementData.hpp>
Classes | |
class | VertexDataRef |
structure to hold references to bounding vertex blocks More... | |
Public Member Functions | |
SweptElementData (EntityHandle start_handle, const int imin, const int jmin, const int kmin, const int imax, const int jmax, const int kmax, const int *Cq) | |
constructor More... | |
virtual | ~SweptElementData () |
EntityHandle | get_vertex (const HomCoord &coords) const |
get handle of vertex at homogeneous coords More... | |
EntityHandle | get_vertex (int i, int j, int k) const |
EntityHandle | get_element (const int i, const int j, const int k) const |
get handle of element at i, j, k More... | |
const HomCoord & | min_params () const |
get min params for this element More... | |
const HomCoord & | max_params () const |
get max params for this element More... | |
void | param_extents (int &di, int &dj, int &dk) const |
get the number of vertices in each direction, inclusive More... | |
ErrorCode | get_params (const EntityHandle ehandle, int &i, int &j, int &k) const |
given a handle, get the corresponding parameters More... | |
int | i_min () const |
convenience functions for parameter extents More... | |
int | j_min () const |
int | k_min () const |
int | i_max () const |
int | j_max () const |
int | k_max () const |
bool | boundary_complete () const |
test the bounding vertex sequences and determine whether they fully define the vertices covering this element block's parameter space More... | |
bool | contains (const HomCoord &coords) const |
test whether this sequence contains these parameters More... | |
ErrorCode | get_params_connectivity (const int i, const int j, const int k, std::vector< EntityHandle > &connectivity) const |
get connectivity of an entity given entity's parameters More... | |
ErrorCode | add_vsequence (SweptVertexData *vseq, const HomCoord &p1, const HomCoord &q1, const HomCoord &p2, const HomCoord &q2, const HomCoord &p3, const HomCoord &q3, bool bb_input=false, const HomCoord &bb_min=HomCoord::unitv[0], const HomCoord &bb_max=HomCoord::unitv[0]) |
add a vertex seq ref to this element sequence; if bb_input is true, bounding box (in eseq-local coords) of vseq being added is input in bb_min and bb_max (allows partial sharing of vseq rather than the whole vseq); if it's false, the whole vseq is referenced and the eseq-local coordinates is computed from the transformed bounding box of the vseq More... | |
SequenceData * | subset (EntityHandle start, EntityHandle end, const int *sequence_data_sizes, const int *tag_data_sizes) const |
unsigned long | get_memory_use () const |
![]() | |
SequenceData (int num_sequence_arrays, EntityHandle start, EntityHandle end) | |
virtual | ~SequenceData () |
EntityHandle | start_handle () const |
EntityHandle | end_handle () const |
EntityID | size () const |
void * | get_sequence_data (int array_num) |
void const * | get_sequence_data (int array_num) const |
AdjacencyDataType * | get_adjacency_data () |
AdjacencyDataType const * | get_adjacency_data () const |
void * | get_tag_data (unsigned tag_num) |
void const * | get_tag_data (unsigned tag_num) const |
void * | create_sequence_data (int array_num, int bytes_per_ent, const void *initial_val=0) |
Allocate array of sequence-specific data. More... | |
void * | create_custom_data (int array_num, size_t total_bytes) |
Allocate array of sequence-specific data. More... | |
AdjacencyDataType * | allocate_adjacency_data () |
Allocate array for storing adjacency data. More... | |
void * | allocate_tag_array (int index, int bytes_per_ent, const void *default_value=0) |
Allocate array of dense tag data. More... | |
SequenceData * | subset (EntityHandle start, EntityHandle end, const int *sequence_data_sizes) const |
Create new SequenceData that is a copy of a subset of this one. More... | |
void | move_tag_data (SequenceData *destination, const int *tag_sizes, int num_tag_sizes) |
Move tag data for a subset of this sequences to specified sequence. More... | |
void | release_tag_data (const int *tag_sizes, int num_tag_sizes) |
Free all tag data arrays. More... | |
void | release_tag_data (int index, int tag_size) |
Free specified tag data array. More... | |
Static Public Member Functions | |
static EntityID | calc_num_entities (EntityHandle start_handle, int irange, int jrange, int krange) |
Private Member Functions | |
SweptElementData () | |
bare constructor, so compiler doesn't create one for me More... | |
Private Attributes | |
HomCoord | elementParams [3] |
parameter min/max/stride, in homogeneous coords ijkh More... | |
int | dIJK [3] |
difference between max and min params plus one (i.e. # VERTICES in each parametric direction) More... | |
int | dIJKm1 [3] |
difference between max and min params (i.e. # ELEMENTS in each parametric direction) More... | |
std::vector< VertexDataRef > | vertexSeqRefs |
list of bounding vertex blocks More... | |
Additional Inherited Members | |
![]() | |
typedef std::vector< EntityHandle > * | AdjacencyDataType |
![]() | |
TypeSequenceManager::SequenceDataPtr | seqManData |
SequenceManager data. More... | |
![]() | |
SequenceData (const SequenceData *subset_from, EntityHandle start, EntityHandle end, const int *sequence_data_sizes) | |
Definition at line 43 of file SweptElementData.hpp.
|
private |
bare constructor, so compiler doesn't create one for me
moab::SweptElementData::SweptElementData | ( | EntityHandle | start_handle, |
const int | imin, | ||
const int | jmin, | ||
const int | kmin, | ||
const int | imax, | ||
const int | jmax, | ||
const int | kmax, | ||
const int * | Cq | ||
) |
constructor
Definition at line 50 of file SweptElementData.cpp.
58 : SequenceData( 0, shandle, shandle + calc_num_entities( shandle, imax - imin, jmax - jmin, kmax - kmin ) - 1 )
59 {
60 // need to have meaningful parameters
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 // assign and compute parameter stuff
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 }
References dIJK, dIJKm1, and elementParams.
|
virtual |
Definition at line 76 of file SweptElementData.cpp.
76 {}
|
inline |
add a vertex seq ref to this element sequence; if bb_input is true, bounding box (in eseq-local coords) of vseq being added is input in bb_min and bb_max (allows partial sharing of vseq rather than the whole vseq); if it's false, the whole vseq is referenced and the eseq-local coordinates is computed from the transformed bounding box of the vseq
Definition at line 266 of file SweptElementData.hpp.
276 {
277 // compute the transform given the vseq-local parameters and the mapping to
278 // this element sequence's parameters passed in minmax
279 HomXform M;
280 M.three_pt_xform( p1, q1, p2, q2, p3, q3 );
281
282 // min and max in element seq's parameter system may not be same as those in
283 // vseq's system, so need to take min/max
284
285 HomCoord minmax[2];
286 if( bb_input )
287 {
288 minmax[0] = bb_min;
289 minmax[1] = bb_max;
290 }
291 else
292 {
293 minmax[0] = vseq->min_params() * M;
294 minmax[1] = vseq->max_params() * M;
295 }
296
297 // check against other vseq's to make sure they don't overlap
298 for( std::vector< VertexDataRef >::const_iterator vsit = vertexSeqRefs.begin(); vsit != vertexSeqRefs.end();
299 ++vsit )
300 if( ( *vsit ).contains( minmax[0] ) || ( *vsit ).contains( minmax[1] ) ) return MB_FAILURE;
301
302 HomCoord tmp_min( std::min( minmax[0].i(), minmax[1].i() ), std::min( minmax[0].j(), minmax[1].j() ),
303 std::min( minmax[0].k(), minmax[1].k() ) );
304 HomCoord tmp_max( std::max( minmax[0].i(), minmax[1].i() ), std::max( minmax[0].j(), minmax[1].j() ),
305 std::max( minmax[0].k(), minmax[1].k() ) );
306
307 // set up a new vertex sequence reference
308 VertexDataRef tmp_seq_ref( tmp_min, tmp_max, M, vseq );
309
310 // add to the list
311 vertexSeqRefs.push_back( tmp_seq_ref );
312
313 return MB_SUCCESS;
314 }
References moab::SweptVertexData::max_params(), MB_SUCCESS, moab::SweptVertexData::min_params(), moab::HomXform::three_pt_xform(), and vertexSeqRefs.
bool moab::SweptElementData::boundary_complete | ( | ) | const |
test the bounding vertex sequences and determine whether they fully define the vertices covering this element block's parameter space
Definition at line 78 of file SweptElementData.cpp.
79 {
80 // test the bounding vertex sequences to see if they fully define the
81 // vertex parameter space for this rectangular block of elements
82
83 int p;
84 std::vector< VertexDataRef > minlist, maxlist;
85
86 // pseudo code:
87 // for each vertex sequence v:
88 for( std::vector< VertexDataRef >::const_iterator vseq = vertexSeqRefs.begin(); vseq != vertexSeqRefs.end();
89 ++vseq )
90 {
91 // test min corner mincorner:
92 bool mincorner = true;
93 // for each p = (i-1,j,k), (i,j-1,k), (i,j,k-1):
94 for( p = 0; p < 3; p++ )
95 {
96
97 // for each vsequence v' != v:
98 for( std::vector< VertexDataRef >::const_iterator othervseq = vertexSeqRefs.begin();
99 othervseq != vertexSeqRefs.end(); ++othervseq )
100 {
101 if( othervseq == vseq ) continue;
102 // if v.min-p contained in v'
103 if( ( *othervseq ).contains( ( *vseq ).minmax[0] - HomCoord::unitv[p] ) )
104 {
105 // mincorner = false
106 mincorner = false;
107 break;
108 }
109 }
110 if( !mincorner ) break;
111 }
112
113 bool maxcorner = true;
114 // for each p = (i-1,j,k), (i,j-1,k), (i,j,k-1):
115 for( p = 0; p < 3; p++ )
116 {
117
118 // for each vsequence v' != v:
119 for( std::vector< VertexDataRef >::const_iterator othervseq = vertexSeqRefs.begin();
120 othervseq != vertexSeqRefs.end(); ++othervseq )
121 {
122 if( othervseq == vseq ) continue;
123 // if v.max+p contained in v'
124 if( ( *othervseq ).contains( ( *vseq ).minmax[1] + HomCoord::unitv[p] ) )
125 {
126 // maxcorner = false
127 maxcorner = false;
128 break;
129 }
130 }
131 if( !maxcorner ) break;
132 }
133
134 // if mincorner add to min corner list minlist
135 if( mincorner ) minlist.push_back( *vseq );
136 // if maxcorner add to max corner list maxlist
137 if( maxcorner ) maxlist.push_back( *vseq );
138 }
139
140 //
141 // if minlist.size = 1 & maxlist.size = 1 & minlist[0] = esequence.min &
142 // maxlist[0] = esequence.max+(1,1,1)
143 if( minlist.size() == 1 && maxlist.size() == 1 && minlist[0].minmax[0] == elementParams[0] &&
144 maxlist[0].minmax[1] == elementParams[1] )
145 // complete
146 return true;
147 // else
148
149 return false;
150 }
References elementParams, moab::HomCoord::unitv, and vertexSeqRefs.
Referenced by get_vertex().
|
static |
Definition at line 27 of file SweptElementData.cpp.
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 // fall through
36 case 2:
37 result *= jrange;
38 // fall through
39 case 1:
40 result *= irange;
41 break;
42 default:
43 result = 0;
44 assert( false );
45 break;
46 }
47 return result;
48 }
References dim, moab::CN::Dimension(), moab::SequenceData::start_handle(), and moab::TYPE_FROM_HANDLE().
|
inline |
test whether this sequence contains these parameters
Definition at line 225 of file SweptElementData.hpp.
226 {
227 // upper bound is < instead of <= because element params max is one less
228 // than vertex params max
229 return ( temp >= elementParams[0] && temp < elementParams[1] );
230 }
References elementParams.
Referenced by get_params_connectivity().
|
inline |
get handle of element at i, j, k
Definition at line 180 of file SweptElementData.hpp.
181 {
182 return start_handle() + ( i - i_min() ) + ( j - j_min() ) * dIJKm1[0] + ( k - k_min() ) * dIJKm1[0] * dIJKm1[1];
183 }
References dIJKm1, i_min(), j_min(), k_min(), and moab::SequenceData::start_handle().
unsigned long moab::SweptElementData::get_memory_use | ( | ) | const |
Definition at line 160 of file SweptElementData.cpp.
161 {
162 return sizeof( *this ) + vertexSeqRefs.capacity() * sizeof( VertexDataRef );
163 }
References vertexSeqRefs.
|
inline |
given a handle, get the corresponding parameters
Definition at line 203 of file SweptElementData.hpp.
204 {
205 if( TYPE_FROM_HANDLE( ehandle ) != TYPE_FROM_HANDLE( start_handle() ) ) return MB_FAILURE;
206
207 int hdiff = ehandle - start_handle();
208
209 // use double ?: test below because on some platforms, both sides of the : are
210 // evaluated, and if dIJKm1[1] is zero, that'll generate a divide-by-zero
211 k = ( dIJKm1[1] > 0 ? hdiff / ( dIJKm1[1] > 0 ? dIJKm1[0] * dIJKm1[1] : 1 ) : 0 );
212 j = ( hdiff - ( k * dIJKm1[0] * dIJKm1[1] ) ) / dIJKm1[0];
213 i = hdiff % dIJKm1[0];
214
215 k += elementParams[0].k();
216 j += elementParams[0].j();
217 i += elementParams[0].i();
218
219 return ( ehandle >= start_handle() && ehandle < start_handle() + size() && i >= i_min() && i <= i_max() &&
220 j >= j_min() && j <= j_max() && k >= k_min() && k <= k_max() )
221 ? MB_SUCCESS
222 : MB_FAILURE;
223 }
References dIJKm1, elementParams, moab::HomCoord::i(), i_max(), i_min(), moab::HomCoord::j(), j_max(), j_min(), moab::HomCoord::k(), k_max(), k_min(), MB_SUCCESS, moab::SequenceData::size(), moab::SequenceData::start_handle(), and moab::TYPE_FROM_HANDLE().
|
inline |
get connectivity of an entity given entity's parameters
Definition at line 316 of file SweptElementData.hpp.
320 {
321 if( contains( HomCoord( i, j, k ) ) == false ) return MB_FAILURE;
322
323 connectivity.push_back( get_vertex( i, j, k ) );
324 connectivity.push_back( get_vertex( i + 1, j, k ) );
325 if( CN::Dimension( TYPE_FROM_HANDLE( start_handle() ) ) < 2 ) return MB_SUCCESS;
326 connectivity.push_back( get_vertex( i + 1, j + 1, k ) );
327 connectivity.push_back( get_vertex( i, j + 1, k ) );
328 if( CN::Dimension( TYPE_FROM_HANDLE( start_handle() ) ) < 3 ) return MB_SUCCESS;
329 connectivity.push_back( get_vertex( i, j, k + 1 ) );
330 connectivity.push_back( get_vertex( i + 1, j, k + 1 ) );
331 connectivity.push_back( get_vertex( i + 1, j + 1, k + 1 ) );
332 connectivity.push_back( get_vertex( i, j + 1, k + 1 ) );
333 return MB_SUCCESS;
334 }
References contains(), moab::CN::Dimension(), get_vertex(), MB_SUCCESS, moab::SequenceData::start_handle(), and moab::TYPE_FROM_HANDLE().
|
inline |
get handle of vertex at homogeneous coords
Definition at line 247 of file SweptElementData.hpp.
248 {
249 assert( boundary_complete() );
250 for( std::vector< VertexDataRef >::const_iterator it = vertexSeqRefs.begin(); it != vertexSeqRefs.end(); ++it )
251 {
252 if( ( *it ).minmax[0] <= coords && ( *it ).minmax[1] >= coords )
253 {
254 // first get the vertex block-local parameters
255 HomCoord local_coords = coords / ( *it ).xform;
256
257 // now get the vertex handle for those coords
258 return ( *it ).srcSeq->get_vertex( local_coords );
259 }
260 }
261
262 // got here, it's an error
263 return 0;
264 }
References boundary_complete(), and vertexSeqRefs.
Referenced by get_params_connectivity(), and get_vertex().
|
inline |
Definition at line 95 of file SweptElementData.hpp.
96 {
97 return get_vertex( HomCoord( i, j, k ) );
98 }
References get_vertex().
|
inline |
Definition at line 128 of file SweptElementData.hpp.
129 {
130 return ( elementParams[1].hom_coord() )[0];
131 }
References elementParams.
Referenced by get_params().
|
inline |
convenience functions for parameter extents
Definition at line 116 of file SweptElementData.hpp.
117 {
118 return ( elementParams[0].hom_coord() )[0];
119 }
References elementParams.
Referenced by get_element(), and get_params().
|
inline |
Definition at line 132 of file SweptElementData.hpp.
133 {
134 return ( elementParams[1].hom_coord() )[1];
135 }
References elementParams.
Referenced by get_params().
|
inline |
Definition at line 120 of file SweptElementData.hpp.
121 {
122 return ( elementParams[0].hom_coord() )[1];
123 }
References elementParams.
Referenced by get_element(), and get_params().
|
inline |
Definition at line 136 of file SweptElementData.hpp.
137 {
138 return ( elementParams[1].hom_coord() )[2];
139 }
References elementParams.
Referenced by get_params().
|
inline |
Definition at line 124 of file SweptElementData.hpp.
125 {
126 return ( elementParams[0].hom_coord() )[2];
127 }
References elementParams.
Referenced by get_element(), and get_params().
|
inline |
get max params for this element
Definition at line 190 of file SweptElementData.hpp.
191 {
192 return elementParams[1];
193 }
References elementParams.
|
inline |
get min params for this element
Definition at line 185 of file SweptElementData.hpp.
186 {
187 return elementParams[0];
188 }
References elementParams.
|
inline |
get the number of vertices in each direction, inclusive
Definition at line 196 of file SweptElementData.hpp.
197 { 198 di = dIJK[0]; 199 dj = dIJK[1]; 200 dk = dIJK[2]; 201 }
References dIJK.
SequenceData * moab::SweptElementData::subset | ( | EntityHandle | start, |
EntityHandle | end, | ||
const int * | sequence_data_sizes, | ||
const int * | tag_data_sizes | ||
) | const |
Definition at line 152 of file SweptElementData.cpp.
156 {
157 return 0;
158 }
|
private |
difference between max and min params plus one (i.e. # VERTICES in each parametric direction)
Definition at line 68 of file SweptElementData.hpp.
Referenced by param_extents(), and SweptElementData().
|
private |
difference between max and min params (i.e. # ELEMENTS in each parametric direction)
Definition at line 72 of file SweptElementData.hpp.
Referenced by get_element(), get_params(), and SweptElementData().
|
private |
parameter min/max/stride, in homogeneous coords ijkh
Definition at line 64 of file SweptElementData.hpp.
Referenced by boundary_complete(), contains(), get_params(), i_max(), i_min(), j_max(), j_min(), k_max(), k_min(), max_params(), min_params(), and SweptElementData().
|
private |
list of bounding vertex blocks
Definition at line 78 of file SweptElementData.hpp.
Referenced by add_vsequence(), boundary_complete(), get_memory_use(), and get_vertex().