Branch data Line data Source code
1 : : /**
2 : : * MOAB, a Mesh-Oriented datABase, is a software component for creating,
3 : : * storing and accessing finite element mesh data.
4 : : *
5 : : * Copyright 2004 Sandia Corporation. Under the terms of Contract
6 : : * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
7 : : * retains certain rights in this software.
8 : : *
9 : : * This library is free software; you can redistribute it and/or
10 : : * modify it under the terms of the GNU Lesser General Public
11 : : * License as published by the Free Software Foundation; either
12 : : * version 2.1 of the License, or (at your option) any later version.
13 : : *
14 : : */
15 : :
16 : : #include "moab/HalfFacetRep.hpp"
17 : : #include "Internals.hpp"
18 : : #include <iostream>
19 : : #include <assert.h>
20 : : #include <vector>
21 : : #include <map>
22 : : #include "MBTagConventions.hpp"
23 : : #include "moab/ScdInterface.hpp"
24 : : #ifdef MOAB_HAVE_MPI
25 : : #include "moab/ParallelComm.hpp"
26 : : #endif
27 : :
28 : : namespace moab
29 : : {
30 : :
31 : 724658 : inline EntityHandle CREATE_HALFFACET( const unsigned lid, const EntityID id )
32 : : {
33 [ + - ][ - + ]: 724658 : assert( id <= MB_END_ID && lid < 6 );
34 : 724658 : return ( ( (HFacet)lid ) << MB_ID_WIDTH ) | id;
35 : : }
36 : 19750212 : inline EntityID FID_FROM_HALFFACET( HFacet handle )
37 : : {
38 : 19750212 : return ( handle & MB_ID_MASK );
39 : : }
40 : 15612030 : inline int LID_FROM_HALFFACET( HFacet handle )
41 : : {
42 : 15612030 : return static_cast< int >( handle >> MB_ID_WIDTH );
43 : : }
44 : :
45 : 39 : HalfFacetRep::HalfFacetRep( Core* impl, ParallelComm* comm, moab::EntityHandle rset, bool filter_ghosts )
46 [ + - ][ + - ]: 39 : : thismeshtype( CURVE ), mb( impl ), pcomm( comm ), _rset( rset ), _filterghost( filter_ghosts )
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
47 : : {
48 [ - + ]: 39 : assert( NULL != impl );
49 : 39 : mInitAHFmaps = false;
50 : 39 : chk_mixed = false;
51 : 39 : is_mixed = false;
52 : 39 : }
53 : :
54 : 78 : HalfFacetRep::~HalfFacetRep() {}
55 : :
56 : 87 : MESHTYPE HalfFacetRep::get_mesh_type( int nverts, int nedges, int nfaces, int ncells )
57 : : {
58 : 87 : MESHTYPE mesh_type = CURVE;
59 : :
60 [ + - ][ + + ]: 87 : if( nverts && nedges && ( !nfaces ) && ( !ncells ) )
[ + + ][ + - ]
61 : 17 : mesh_type = CURVE;
62 [ + - ][ + + ]: 70 : else if( nverts && !nedges && nfaces && !ncells )
[ + + ][ + - ]
63 : 47 : mesh_type = SURFACE;
64 [ + - ][ + + ]: 23 : else if( nverts && nedges && nfaces && !ncells )
[ + - ][ - + ]
65 : 0 : mesh_type = SURFACE_MIXED;
66 [ + - ][ + + ]: 23 : else if( nverts && !nedges && !nfaces && ncells )
[ + - ][ + - ]
67 : 22 : mesh_type = VOLUME;
68 [ + - ][ + - ]: 1 : else if( nverts && nedges && !nfaces && ncells )
[ - + ][ # # ]
69 : 0 : mesh_type = VOLUME_MIXED_1;
70 [ + - ][ - + ]: 1 : else if( nverts && !nedges && nfaces && ncells )
[ # # ][ # # ]
71 : 0 : mesh_type = VOLUME_MIXED_2;
72 [ + - ][ + - ]: 1 : else if( nverts && nedges && nfaces && ncells )
[ + - ][ + - ]
73 : 1 : mesh_type = VOLUME_MIXED;
74 : :
75 : 87 : return mesh_type;
76 : : }
77 : :
78 : : const HalfFacetRep::adj_matrix HalfFacetRep::adjMatrix[7] = {
79 : : // Stores the adjacency matrix for each mesh type.
80 : : // CURVE
81 : : { { { 0, 1, 0, 0 }, { 1, 1, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } } },
82 : :
83 : : // SURFACE
84 : : { { { 0, 0, 1, 0 }, { 0, 0, 0, 0 }, { 1, 0, 1, 0 }, { 0, 0, 0, 0 } } },
85 : :
86 : : // SURFACE_MIXED
87 : : { { { 0, 1, 1, 0 }, { 1, 1, 1, 0 }, { 1, 1, 1, 0 }, { 0, 0, 0, 0 } } },
88 : :
89 : : // VOLUME
90 : : { { { 0, 0, 0, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 1, 0, 0, 1 } } },
91 : :
92 : : // VOLUME_MIXED_1
93 : : { { { 0, 1, 0, 1 }, { 1, 1, 0, 1 }, { 0, 0, 0, 0 }, { 1, 1, 0, 1 } } },
94 : :
95 : : // VOLUME_MIXED_2
96 : : { { { 0, 0, 1, 1 }, { 0, 0, 0, 0 }, { 1, 0, 1, 1 }, { 1, 0, 1, 1 } } },
97 : :
98 : : // VOLUME_MIXED
99 : : { { { 0, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } } }
100 : : };
101 : :
102 : 105164 : int HalfFacetRep::get_index_for_meshtype( MESHTYPE mesh_type )
103 : : {
104 : 105164 : int index = 0;
105 [ + + - + : 105164 : switch( mesh_type )
- - - - ]
106 : : {
107 : : case CURVE:
108 : 3986 : index = 0;
109 : 3986 : break;
110 : : case SURFACE:
111 : 34058 : index = 1;
112 : 34058 : break;
113 : : case SURFACE_MIXED:
114 : 0 : index = 2;
115 : 0 : break;
116 : : case VOLUME:
117 : 67120 : index = 3;
118 : 67120 : break;
119 : : case VOLUME_MIXED_1:
120 : 0 : index = 4;
121 : 0 : break;
122 : : case VOLUME_MIXED_2:
123 : 0 : index = 5;
124 : 0 : break;
125 : : case VOLUME_MIXED:
126 : 0 : index = 6;
127 : 0 : break;
128 : : }
129 : 105164 : return index;
130 : : }
131 : :
132 : 17 : bool HalfFacetRep::check_mixed_entity_type()
133 : : {
134 [ + - ]: 17 : if( !chk_mixed )
135 : : {
136 : 17 : chk_mixed = true;
137 : :
138 : : ErrorCode error;
139 [ + - ][ + - ]: 34 : Range felems, celems;
[ + - ]
140 : :
141 [ + - ][ - + ]: 17 : error = mb->get_entities_by_dimension( this->_rset, 2, felems );MB_CHK_ERR( error );
[ # # ][ # # ]
142 : :
143 [ + - ][ + + ]: 17 : if( felems.size() )
144 : : {
145 [ + - ][ + - ]: 16 : Range tris, quad, poly;
[ + - ][ + - ]
[ + - ]
146 [ + - ][ + - ]: 8 : tris = felems.subset_by_type( MBTRI );
147 [ + - ][ + - ]: 8 : quad = felems.subset_by_type( MBQUAD );
148 [ + - ][ + - ]: 8 : poly = felems.subset_by_type( MBPOLYGON );
149 [ + - ][ + + ]: 8 : if( ( tris.size() && quad.size() ) || ( tris.size() && poly.size() ) || ( quad.size() && poly.size() ) )
[ + - ][ + - ]
[ + - ][ + + ]
[ + - ][ + - ]
[ + - ][ + + ]
[ + - ][ - + ]
[ - + ]
150 : 0 : is_mixed = true;
151 [ + - ][ - + ]: 8 : if( poly.size() ) is_mixed = true;
152 : :
153 [ - + ][ + - ]: 16 : if( is_mixed ) return is_mixed;
154 : : }
155 : :
156 [ + - ][ - + ]: 17 : error = mb->get_entities_by_dimension( this->_rset, 3, celems );MB_CHK_ERR( error );
[ # # ][ # # ]
157 [ + - ][ + + ]: 17 : if( celems.size() )
158 : : {
159 [ + - ][ + - ]: 12 : Range tet, pyr, prism, hex, polyhed;
[ + - ][ + - ]
[ + - ]
160 [ + - ][ + - ]: 6 : tet = celems.subset_by_type( MBTET );
161 [ + - ][ + - ]: 6 : pyr = celems.subset_by_type( MBPYRAMID );
162 [ + - ][ + - ]: 6 : prism = celems.subset_by_type( MBPRISM );
163 [ + - ][ + - ]: 6 : hex = celems.subset_by_type( MBHEX );
164 [ + - ][ + - ]: 6 : polyhed = celems.subset_by_type( MBPOLYHEDRON );
165 [ + - ][ + - ]: 24 : if( ( tet.size() && pyr.size() ) || ( tet.size() && prism.size() ) || ( tet.size() && hex.size() ) ||
[ + - ][ + - ]
[ + + ][ + - ]
[ + - ][ + - ]
[ + + ][ + - ]
[ + - ][ + + ]
[ - + ]
166 [ + - ][ + - ]: 18 : ( tet.size() && polyhed.size() ) || ( pyr.size() && prism.size() ) || ( pyr.size() && hex.size() ) ||
[ + - ][ + - ]
[ - + ][ # # ]
[ # # ][ + - ]
[ - + ][ # # ]
[ # # ][ - + ]
167 [ + - ][ # # ]: 18 : ( pyr.size() && polyhed.size() ) || ( prism.size() && hex.size() ) ||
[ # # ][ + - ]
[ - + ][ # # ]
[ # # ][ - + ]
168 [ + + ][ + - ]: 18 : ( prism.size() && polyhed.size() ) || ( hex.size() && polyhed.size() ) )
[ # # ][ # # ]
[ + - ][ + + ]
[ + - ][ - + ]
169 : 0 : is_mixed = true;
170 : :
171 [ + - ][ - + ]: 12 : if( polyhed.size() ) is_mixed = true;
172 : : }
173 : :
174 : 17 : ScdInterface* scdi = NULL;
175 [ + - ][ - + ]: 17 : error = mb->query_interface( scdi );MB_CHK_ERR( error );
[ # # ][ # # ]
176 [ + - ]: 17 : if( scdi )
177 : : {
178 [ + - ]: 17 : Range boxes;
179 [ + - ][ - + ]: 17 : error = scdi->find_boxes( boxes );MB_CHK_ERR( error );
[ # # ][ # # ]
180 : :
181 [ + - ][ - + ]: 17 : if( !boxes.empty() ) is_mixed = true;
[ + - ][ + - ]
182 : 17 : }
183 : : }
184 : 17 : return is_mixed;
185 : : }
186 : :
187 : : /*******************************************************
188 : : * initialize *
189 : : ******************************************************/
190 : :
191 : 39 : ErrorCode HalfFacetRep::initialize()
192 : : {
193 : : ErrorCode error;
194 : :
195 [ + - ]: 39 : if( !mInitAHFmaps )
196 : : {
197 : 39 : mInitAHFmaps = true;
198 : : #ifdef MOAB_HAVE_MPI
199 [ + + ][ + + ]: 39 : if( pcomm && _filterghost )
200 : : {
201 [ + - ][ + - ]: 6 : moab::Range _averts, _aedgs, _afacs, _acels;
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ]
202 [ + - ][ - + ]: 3 : error = mb->get_entities_by_dimension( this->_rset, 0, _averts, true );MB_CHK_ERR( error );
[ # # ][ # # ]
203 [ + - ][ - + ]: 3 : error = mb->get_entities_by_dimension( this->_rset, 1, _aedgs, true );MB_CHK_ERR( error );
[ # # ][ # # ]
204 [ + - ][ - + ]: 3 : error = mb->get_entities_by_dimension( this->_rset, 2, _afacs, true );MB_CHK_ERR( error );
[ # # ][ # # ]
205 [ + - ][ - + ]: 3 : error = mb->get_entities_by_dimension( this->_rset, 3, _acels, true );MB_CHK_ERR( error );
[ # # ][ # # ]
206 : :
207 : : // filter based on parallel status
208 [ + - ][ - + ]: 3 : error = pcomm->filter_pstatus( _averts, PSTATUS_GHOST, PSTATUS_NOT, -1, &_verts );MB_CHK_ERR( error );
[ # # ][ # # ]
209 [ + - ][ - + ]: 3 : error = pcomm->filter_pstatus( _aedgs, PSTATUS_GHOST, PSTATUS_NOT, -1, &_edges );MB_CHK_ERR( error );
[ # # ][ # # ]
210 [ + - ][ - + ]: 3 : error = pcomm->filter_pstatus( _afacs, PSTATUS_GHOST, PSTATUS_NOT, -1, &_faces );MB_CHK_ERR( error );
[ # # ][ # # ]
211 [ + - ][ - + ]: 6 : error = pcomm->filter_pstatus( _acels, PSTATUS_GHOST, PSTATUS_NOT, -1, &_cells );MB_CHK_ERR( error );
[ # # ][ # # ]
[ + - ]
212 : : }
213 : : else
214 : : {
215 [ - + ][ # # ]: 36 : error = mb->get_entities_by_dimension( this->_rset, 0, _verts, true );MB_CHK_ERR( error );
216 [ - + ][ # # ]: 36 : error = mb->get_entities_by_dimension( this->_rset, 1, _edges, true );MB_CHK_ERR( error );
217 [ - + ][ # # ]: 36 : error = mb->get_entities_by_dimension( this->_rset, 2, _faces, true );MB_CHK_ERR( error );
218 [ - + ][ # # ]: 36 : error = mb->get_entities_by_dimension( this->_rset, 3, _cells, true );MB_CHK_ERR( error );
219 : : }
220 : : #else
221 : : error = mb->get_entities_by_dimension( this->_rset, 0, _verts, true );MB_CHK_ERR( error );
222 : : error = mb->get_entities_by_dimension( this->_rset, 1, _edges, true );MB_CHK_ERR( error );
223 : : error = mb->get_entities_by_dimension( this->_rset, 2, _faces, true );MB_CHK_ERR( error );
224 : : error = mb->get_entities_by_dimension( this->_rset, 3, _cells, true );MB_CHK_ERR( error );
225 : :
226 : : #endif
227 : :
228 : 39 : int nverts = _verts.size();
229 : 39 : int nedges = _edges.size();
230 : 39 : int nfaces = _faces.size();
231 : 39 : int ncells = _cells.size();
232 : :
233 : 39 : MESHTYPE mesh_type = get_mesh_type( nverts, nedges, nfaces, ncells );
234 : 39 : thismeshtype = mesh_type;
235 : :
236 : : // Initialize mesh type specific maps
237 [ + + ]: 39 : if( thismeshtype == CURVE )
238 : : {
239 [ - + ][ # # ]: 7 : error = init_curve();MB_CHK_ERR( error );
240 : : }
241 [ + + ]: 32 : else if( thismeshtype == SURFACE )
242 : : {
243 [ - + ][ # # ]: 25 : error = init_surface();MB_CHK_ERR( error );
244 : : }
245 [ - + ]: 7 : else if( thismeshtype == SURFACE_MIXED )
246 : : {
247 [ # # ][ # # ]: 0 : error = init_curve();MB_CHK_ERR( error );
248 [ # # ][ # # ]: 0 : error = init_surface();MB_CHK_ERR( error );
249 : : }
250 [ + + ]: 7 : else if( thismeshtype == VOLUME )
251 : : {
252 [ - + ][ # # ]: 6 : error = init_volume();MB_CHK_ERR( error );
253 : : }
254 [ - + ]: 1 : else if( thismeshtype == VOLUME_MIXED_1 )
255 : : {
256 [ # # ][ # # ]: 0 : error = init_curve();MB_CHK_ERR( error );
257 [ # # ][ # # ]: 0 : error = init_volume();MB_CHK_ERR( error );
258 : : }
259 [ - + ]: 1 : else if( thismeshtype == VOLUME_MIXED_2 )
260 : : {
261 [ # # ][ # # ]: 0 : error = init_surface();MB_CHK_ERR( error );
262 [ # # ][ # # ]: 0 : error = init_volume();MB_CHK_ERR( error );
263 : : }
264 [ + - ]: 1 : else if( thismeshtype == VOLUME_MIXED )
265 : : {
266 [ - + ][ # # ]: 1 : error = init_curve();MB_CHK_ERR( error );
267 [ - + ][ # # ]: 1 : error = init_surface();MB_CHK_ERR( error );
268 [ - + ][ # # ]: 39 : error = init_volume();MB_CHK_ERR( error );
269 : : }
270 : : }
271 : 39 : return MB_SUCCESS;
272 : : }
273 : :
274 : 1 : ErrorCode HalfFacetRep::deinitialize()
275 : : {
276 : 1 : return MB_SUCCESS;
277 : : }
278 : :
279 : 8 : ErrorCode HalfFacetRep::init_curve()
280 : : {
281 : : ErrorCode error;
282 : :
283 [ + - ][ + - ]: 8 : int nv = ID_FROM_HANDLE( *( _verts.end() - 1 ) );
[ + - ]
284 [ + - ][ + - ]: 8 : int ne = ID_FROM_HANDLE( *( _edges.end() - 1 ) );
[ + - ]
285 : :
286 [ + - ]: 8 : v2hv.resize( nv, 0 );
287 [ + - ]: 8 : sibhvs.resize( ne * 2, 0 );
288 : :
289 [ - + ][ # # ]: 8 : error = determine_sibling_halfverts( _verts, _edges );MB_CHK_ERR( error );
290 [ - + ][ # # ]: 8 : error = determine_incident_halfverts( _edges );MB_CHK_ERR( error );
291 : :
292 : 8 : return MB_SUCCESS;
293 : : }
294 : :
295 : 26 : ErrorCode HalfFacetRep::init_surface()
296 : : {
297 : : ErrorCode error;
298 [ + - ][ + - ]: 26 : EntityType ftype = mb->type_from_handle( *_faces.begin() );
299 : 26 : int nepf = lConnMap2D[ftype - 2].num_verts_in_face;
300 : :
301 [ + - ][ + - ]: 26 : int nv = ID_FROM_HANDLE( *( _verts.end() - 1 ) );
[ + - ]
302 [ + - ][ + - ]: 26 : int nf = ID_FROM_HANDLE( *( _faces.end() - 1 ) );
[ + - ]
303 : :
304 [ + - ]: 26 : v2he.resize( nv, 0 );
305 [ + - ]: 26 : sibhes.resize( nf * nepf, 0 );
306 : :
307 : : // Construct ahf maps
308 [ - + ][ # # ]: 26 : error = determine_sibling_halfedges( _faces );MB_CHK_ERR( error );
309 [ - + ][ # # ]: 26 : error = determine_incident_halfedges( _faces );MB_CHK_ERR( error );
310 : :
311 : : // Initialize queues for storing face and local id's during local search
312 [ + + ]: 5226 : for( int i = 0; i < MAXSIZE; i++ )
313 : : {
314 : 5200 : queue_fid[i] = 0;
315 : 5200 : queue_lid[i] = 0;
316 : 5200 : trackfaces[i] = 0;
317 : : }
318 : :
319 : 26 : return MB_SUCCESS;
320 : : }
321 : :
322 : 7 : ErrorCode HalfFacetRep::init_volume()
323 : : {
324 : : ErrorCode error;
325 : :
326 : : // Initialize std::map between cell-types and their index in lConnMap3D
327 [ + - ]: 7 : cell_index[MBTET] = 0;
328 [ + - ]: 7 : cell_index[MBPYRAMID] = 1;
329 [ + - ]: 7 : cell_index[MBPRISM] = 2;
330 [ + - ]: 7 : cell_index[MBHEX] = 3;
331 : :
332 [ + - ][ + - ]: 7 : int index = get_index_in_lmap( *_cells.begin() );
333 : 7 : int nfpc = lConnMap3D[index].num_faces_in_cell;
334 [ + - ][ + - ]: 7 : int nv = ID_FROM_HANDLE( *( _verts.end() - 1 ) );
[ + - ]
335 [ + - ][ + - ]: 7 : int nc = ID_FROM_HANDLE( *( _cells.end() - 1 ) );
[ + - ]
336 : : ;
337 : :
338 [ + - ]: 7 : v2hf.resize( nv, 0 );
339 [ + - ]: 7 : sibhfs.resize( nc * nfpc, 0 );
340 : :
341 : : // Construct the maps
342 [ - + ][ # # ]: 7 : error = determine_sibling_halffaces( _cells );MB_CHK_ERR( error );
343 [ - + ][ # # ]: 7 : error = determine_incident_halffaces( _cells );MB_CHK_ERR( error );
344 : :
345 : : // Initialize queues for storing face and local id's during local search
346 [ + + ]: 1407 : for( int i = 0; i < MAXSIZE; i++ )
347 : : {
348 : 1400 : Stkcells[i] = 0;
349 : 1400 : cellq[i] = 0;
350 : 1400 : trackcells[i] = 0;
351 : : }
352 : :
353 : 7 : return MB_SUCCESS;
354 : : }
355 : :
356 : : //////////////////////////////////////////////////
357 : 0 : ErrorCode HalfFacetRep::print_tags( int dim )
358 : : {
359 [ # # ]: 0 : if( dim == 1 )
360 : : {
361 [ # # ]: 0 : EntityHandle start_edge = *_edges.begin();
362 : 0 : std::cout << "start_edge = " << start_edge << std::endl;
363 : 0 : std::cout << "<SIBHVS_EID,SIBHVS_LVID>" << std::endl;
364 : :
365 [ # # ][ # # ]: 0 : for( Range::iterator i = _edges.begin(); i != _edges.end(); ++i )
[ # # ][ # # ]
[ # # ]
366 : : {
367 : : EntityHandle eid[2];
368 : : int lvid[2];
369 [ # # ][ # # ]: 0 : int eidx = ID_FROM_HANDLE( *i ) - 1;
370 [ # # ]: 0 : HFacet hf1 = sibhvs[2 * eidx];
371 [ # # ]: 0 : HFacet hf2 = sibhvs[2 * eidx + 1];
372 [ # # ]: 0 : eid[0] = fid_from_halfacet( hf1, MBEDGE );
373 [ # # ]: 0 : eid[1] = fid_from_halfacet( hf2, MBEDGE );
374 [ # # ]: 0 : lvid[0] = lid_from_halffacet( hf1 );
375 [ # # ]: 0 : lvid[1] = lid_from_halffacet( hf2 );
376 [ # # ][ # # ]: 0 : std::cout << "Entity = " << *i << " :: <" << eid[0] << "," << lvid[0] << ">"
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
377 [ # # ]: 0 : << " "
378 [ # # ][ # # ]: 0 : << "<" << eid[1] << "," << lvid[1] << ">" << std::endl;
[ # # ][ # # ]
[ # # ][ # # ]
379 : : }
380 : :
381 : 0 : std::cout << "<V2HV_EID, V2HV_LVID>" << std::endl;
382 : :
383 [ # # ][ # # ]: 0 : for( Range::iterator i = _verts.begin(); i != _verts.end(); ++i )
[ # # ][ # # ]
[ # # ]
384 : : {
385 [ # # ][ # # ]: 0 : int vidx = ID_FROM_HANDLE( *i ) - 1;
386 [ # # ]: 0 : HFacet hf = v2hv[vidx];
387 [ # # ]: 0 : EntityHandle eid = fid_from_halfacet( hf, MBEDGE );
388 [ # # ]: 0 : int lvid = lid_from_halffacet( hf );
389 [ # # ][ # # ]: 0 : std::cout << "Vertex = " << *i << " :: <" << eid << "," << lvid << ">" << std::endl;
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
390 : : }
391 : : }
392 [ # # ]: 0 : else if( dim == 2 )
393 : : {
394 [ # # ][ # # ]: 0 : EntityType ftype = mb->type_from_handle( *_faces.begin() );
395 : 0 : int nepf = lConnMap2D[ftype - 2].num_verts_in_face;
396 [ # # ]: 0 : EntityHandle start_face = *_faces.begin();
397 : 0 : std::cout << "start_face = " << start_face << std::endl;
398 : 0 : std::cout << "<SIBHES_FID,SIBHES_LEID>" << std::endl;
399 : :
400 [ # # ][ # # ]: 0 : for( Range::iterator i = _faces.begin(); i != _faces.end(); ++i )
[ # # ][ # # ]
[ # # ]
401 : : {
402 [ # # ][ # # ]: 0 : int fidx = ID_FROM_HANDLE( *i ) - 1;
403 [ # # ][ # # ]: 0 : std::cout << "Entity = " << *i;
[ # # ]
404 [ # # ]: 0 : for( int j = 0; j < nepf; j++ )
405 : : {
406 [ # # ]: 0 : HFacet hf = sibhes[nepf * fidx + j];
407 [ # # ]: 0 : EntityHandle sib = fid_from_halfacet( hf, ftype );
408 [ # # ]: 0 : int lid = lid_from_halffacet( hf );
409 [ # # ][ # # ]: 0 : std::cout << " :: <" << sib << "," << lid << ">"
[ # # ][ # # ]
[ # # ]
410 [ # # ]: 0 : << " ";
411 : : }
412 [ # # ]: 0 : std::cout << std::endl;
413 : : }
414 : :
415 : 0 : std::cout << "<V2HE_FID, V2HE_LEID>" << std::endl;
416 : :
417 [ # # ][ # # ]: 0 : for( Range::iterator i = _verts.begin(); i != _verts.end(); ++i )
[ # # ][ # # ]
[ # # ]
418 : : {
419 [ # # ][ # # ]: 0 : int vidx = ID_FROM_HANDLE( *i ) - 1;
420 [ # # ]: 0 : HFacet hf = v2he[vidx];
421 [ # # ]: 0 : EntityHandle fid = fid_from_halfacet( hf, ftype );
422 [ # # ]: 0 : int lid = lid_from_halffacet( hf );
423 [ # # ][ # # ]: 0 : std::cout << "Vertex = " << *i << " :: <" << fid << "," << lid << ">" << std::endl;
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
424 : : }
425 : : }
426 [ # # ]: 0 : else if( dim == 3 )
427 : : {
428 [ # # ][ # # ]: 0 : EntityType ctype = mb->type_from_handle( *_cells.begin() );
429 : :
430 [ # # ][ # # ]: 0 : int index = get_index_in_lmap( *_cells.begin() );
431 : 0 : int nfpc = lConnMap3D[index].num_faces_in_cell;
432 [ # # ]: 0 : EntityHandle start_cell = *_cells.begin();
433 : 0 : std::cout << "start_cell = " << start_cell << std::endl;
434 : 0 : std::cout << "<SIBHES_CID,SIBHES_LFID>" << std::endl;
435 : :
436 [ # # ][ # # ]: 0 : for( Range::iterator i = _cells.begin(); i != _cells.end(); ++i )
[ # # ][ # # ]
[ # # ]
437 : : {
438 [ # # ][ # # ]: 0 : int cidx = ID_FROM_HANDLE( *i ) - 1;
439 [ # # ][ # # ]: 0 : std::cout << "Entity = " << *i;
[ # # ]
440 [ # # ]: 0 : for( int j = 0; j < nfpc; j++ )
441 : : {
442 [ # # ]: 0 : HFacet hf = sibhfs[nfpc * cidx + j];
443 [ # # ]: 0 : EntityHandle sib = fid_from_halfacet( hf, ctype );
444 [ # # ]: 0 : int lid = lid_from_halffacet( hf );
445 [ # # ][ # # ]: 0 : std::cout << " :: <" << sib << "," << lid << ">"
[ # # ][ # # ]
[ # # ]
446 [ # # ]: 0 : << " ";
447 : : }
448 [ # # ]: 0 : std::cout << std::endl;
449 : : }
450 : :
451 : 0 : std::cout << "<V2HF_CID, V2HF_LFID>" << std::endl;
452 : : EntityHandle cid;
453 : : int lid;
454 : :
455 [ # # ][ # # ]: 0 : for( Range::iterator i = _verts.begin(); i != _verts.end(); ++i )
[ # # ][ # # ]
[ # # ]
456 : : {
457 [ # # ][ # # ]: 0 : int vidx = ID_FROM_HANDLE( *i ) - 1;
458 [ # # ]: 0 : HFacet hf = v2hf[vidx];
459 : :
460 [ # # ][ # # ]: 0 : if( hf == 0 && ( v2hfs.find( *i ) != v2hfs.end() ) )
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # #
# # # # ]
461 : : {
462 : : std::pair< std::multimap< EntityHandle, HFacet >::iterator,
463 : : std::multimap< EntityHandle, HFacet >::iterator >
464 [ # # ]: 0 : it_hfs;
465 [ # # ][ # # ]: 0 : it_hfs = v2hfs.equal_range( *i );
466 : :
467 [ # # ][ # # ]: 0 : for( std::multimap< EntityHandle, HFacet >::iterator it = it_hfs.first; it != it_hfs.second; ++it )
[ # # ]
468 : : {
469 [ # # ][ # # ]: 0 : cid = fid_from_halfacet( it->second, ctype );
470 [ # # ]: 0 : lid = lid_from_halffacet( hf );
471 : :
472 [ # # ][ # # ]: 0 : std::cout << "Vertex = " << *i << " :: <" << cid << "," << lid << ">" << std::endl;
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
473 : : }
474 : : }
475 : : else
476 : : {
477 [ # # ]: 0 : cid = fid_from_halfacet( hf, ctype );
478 [ # # ]: 0 : lid = lid_from_halffacet( hf );
479 [ # # ][ # # ]: 0 : std::cout << "Vertex = " << *i << " :: <" << cid << "," << lid << ">" << std::endl;
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
480 : : }
481 : : }
482 : : }
483 : 0 : return MB_SUCCESS;
484 : : }
485 : :
486 : : /**********************************************************
487 : : * User interface for adjacency functions *
488 : : ********************************************************/
489 : :
490 : 105164 : ErrorCode HalfFacetRep::get_adjacencies( const EntityHandle source_entity, const unsigned int target_dimension,
491 : : std::vector< EntityHandle >& target_entities )
492 : : {
493 : :
494 : : ErrorCode error;
495 : :
496 : 105164 : unsigned int source_dimension = mb->dimension_from_handle( source_entity );
497 [ - + ][ # # ]: 105164 : assert( ( source_dimension <= target_dimension ) || ( source_dimension > target_dimension ) );
498 : :
499 [ - + ]: 105164 : if( mInitAHFmaps == false )
500 : : {
501 [ # # ][ # # ]: 0 : error = initialize();MB_CHK_ERR( error );
502 : : }
503 : :
504 : 105164 : int mindex = get_index_for_meshtype( thismeshtype );
505 : 105164 : int adj_possible = adjMatrix[mindex].val[source_dimension][target_dimension];
506 : :
507 [ + - ]: 105164 : if( adj_possible )
508 : : {
509 [ + + ]: 105164 : if( source_dimension < target_dimension )
510 : : {
511 [ - + ][ # # ]: 45954 : error = get_up_adjacencies( source_entity, target_dimension, target_entities );MB_CHK_ERR( error );
512 : : }
513 [ + - ]: 59210 : else if( source_dimension == target_dimension )
514 : : {
515 [ - + ][ # # ]: 59210 : error = get_neighbor_adjacencies( source_entity, target_entities );MB_CHK_ERR( error );
516 : : }
517 : : else
518 : : {
519 [ # # ][ # # ]: 0 : error = get_down_adjacencies( source_entity, target_dimension, target_entities );MB_CHK_ERR( error );
520 : : }
521 : : }
522 : : else
523 : 0 : return MB_SUCCESS;
524 : :
525 : 105164 : return MB_SUCCESS;
526 : : }
527 : :
528 : 1146195 : ErrorCode HalfFacetRep::get_up_adjacencies( EntityHandle ent, int out_dim, std::vector< EntityHandle >& adjents,
529 : : std::vector< int >* lids )
530 : : {
531 : : ErrorCode error;
532 : 1146195 : int in_dim = mb->dimension_from_handle( ent );
533 [ + - ][ + - ]: 1146195 : assert( ( in_dim >= 0 && in_dim <= 2 ) && ( out_dim > in_dim ) );
[ - + ]
534 : :
535 [ + + ]: 1146195 : if( in_dim == 0 )
536 : : {
537 [ + + ]: 1145727 : if( out_dim == 1 )
538 : : {
539 [ - + ][ # # ]: 4088 : error = get_up_adjacencies_1d( ent, adjents, lids );MB_CHK_ERR( error );
540 : : }
541 [ + + ]: 1141639 : else if( out_dim == 2 )
542 : : {
543 [ - + ][ # # ]: 1114124 : error = get_up_adjacencies_vert_2d( ent, adjents );MB_CHK_ERR( error );
544 : : }
545 [ + - ]: 27515 : else if( out_dim == 3 )
546 : : {
547 [ - + ][ # # ]: 27515 : error = get_up_adjacencies_vert_3d( ent, adjents );MB_CHK_ERR( error );
548 : : }
549 : : }
550 : :
551 [ + + ][ + + ]: 638 : else if( ( in_dim == 1 ) && ( out_dim == 2 ) )
552 : : {
553 [ - + ][ # # ]: 170 : error = get_up_adjacencies_2d( ent, adjents, lids );MB_CHK_ERR( error );
554 : : }
555 [ + + ][ + - ]: 468 : else if( ( in_dim == 1 ) && ( out_dim == 3 ) )
556 : : {
557 [ - + ][ # # ]: 170 : error = get_up_adjacencies_edg_3d( ent, adjents, lids );MB_CHK_ERR( error );
558 : : }
559 [ + - ][ + - ]: 128 : else if( ( in_dim == 2 ) && ( out_dim == 3 ) )
560 : : {
561 [ - + ][ # # ]: 128 : error = get_up_adjacencies_face_3d( ent, adjents, lids );MB_CHK_ERR( error );
562 : : }
563 : 1146195 : return MB_SUCCESS;
564 : : }
565 : :
566 : 59540 : ErrorCode HalfFacetRep::get_neighbor_adjacencies( EntityHandle ent, std::vector< EntityHandle >& adjents )
567 : : {
568 : : ErrorCode error;
569 : 59540 : int in_dim = mb->dimension_from_handle( ent );
570 [ + - ][ - + ]: 59540 : assert( in_dim >= 1 && in_dim <= 3 );
571 : :
572 [ + + ]: 59540 : if( in_dim == 1 )
573 : : {
574 [ - + ][ # # ]: 2160 : error = get_neighbor_adjacencies_1d( ent, adjents );MB_CHK_ERR( error );
575 : : }
576 : :
577 [ + + ]: 57380 : else if( in_dim == 2 )
578 : : {
579 [ - + ][ # # ]: 17668 : error = get_neighbor_adjacencies_2d( ent, adjents );MB_CHK_ERR( error );
580 : : }
581 [ + - ]: 39712 : else if( in_dim == 3 )
582 : : {
583 [ - + ][ # # ]: 39712 : error = get_neighbor_adjacencies_3d( ent, adjents );MB_CHK_ERR( error );
584 : : }
585 : 59540 : return MB_SUCCESS;
586 : : }
587 : :
588 : 192 : ErrorCode HalfFacetRep::get_down_adjacencies( EntityHandle ent, int out_dim, std::vector< EntityHandle >& adjents )
589 : : {
590 : : ErrorCode error;
591 : 192 : int in_dim = mb->dimension_from_handle( ent );
592 [ + - ][ + - ]: 192 : assert( ( in_dim >= 2 && in_dim <= 3 ) && ( out_dim < in_dim ) );
[ - + ]
593 : :
594 [ + + ][ + - ]: 320 : if( ( in_dim == 2 ) && ( out_dim == 1 ) )
595 : : {
596 [ - + ][ # # ]: 128 : error = get_down_adjacencies_2d( ent, adjents );MB_CHK_ERR( error );
597 : : }
598 [ + - ][ + + ]: 96 : else if( ( in_dim == 3 ) && ( out_dim == 1 ) )
599 : : {
600 [ - + ][ # # ]: 32 : error = get_down_adjacencies_edg_3d( ent, adjents );MB_CHK_ERR( error );
601 : : }
602 [ + - ][ + - ]: 32 : else if( ( in_dim == 3 ) && ( out_dim == 2 ) )
603 : : {
604 [ - + ][ # # ]: 32 : error = get_down_adjacencies_face_3d( ent, adjents );MB_CHK_ERR( error );
605 : : }
606 : 192 : return MB_SUCCESS;
607 : : }
608 : :
609 : 48 : ErrorCode HalfFacetRep::count_subentities( Range& edges, Range& faces, Range& cells, int* nedges, int* nfaces )
610 : : {
611 : : ErrorCode error;
612 [ + + ][ + - ]: 48 : if( edges.size() && !faces.size() && !cells.size() )
[ + - ][ + + ]
613 : : {
614 : 10 : nedges[0] = edges.size();
615 : 10 : nfaces[0] = 0;
616 : : }
617 [ + + ][ + - ]: 38 : else if( faces.size() && !cells.size() )
[ + + ]
618 : : {
619 : 22 : nedges[0] = find_total_edges_2d( faces );
620 : 22 : nfaces[0] = 0;
621 : : }
622 [ + - ]: 16 : else if( cells.size() )
623 : : {
624 [ + - ][ - + ]: 16 : error = find_total_edges_faces_3d( cells, nedges, nfaces );MB_CHK_ERR( error );
[ # # ]
625 : : }
626 : 48 : return MB_SUCCESS;
627 : : }
628 : :
629 : : /********************************************************
630 : : * 1D: sibhvs, v2hv, incident and neighborhood queries *
631 : : *********************************************************/
632 : 8 : ErrorCode HalfFacetRep::determine_sibling_halfverts( Range& verts, Range& edges )
633 : : {
634 : : ErrorCode error;
635 : :
636 : : // Step 1: Create an index list storing the starting position for each vertex
637 [ + - ]: 8 : int nv = verts.size();
638 [ + - ]: 8 : std::vector< int > is_index( nv + 1 );
639 [ + + ]: 145 : for( int i = 0; i < nv + 1; i++ )
640 [ + - ]: 137 : is_index[i] = 0;
641 : :
642 [ + - ][ + - ]: 230 : for( Range::iterator eid = edges.begin(); eid != edges.end(); ++eid )
[ + - ][ + - ]
[ + + ]
643 : : {
644 : : const EntityHandle* conn;
645 : 222 : int num_conn = 0;
646 [ + - ][ + - ]: 222 : error = mb->get_connectivity( *eid, conn, num_conn, true );MB_CHK_ERR( error );
[ - + ][ # # ]
[ # # ]
647 : :
648 [ + - ]: 222 : int index = verts.index( conn[0] );
649 [ + - ]: 222 : is_index[index + 1] += 1;
650 [ + - ]: 222 : index = verts.index( conn[1] );
651 [ + - ]: 222 : is_index[index + 1] += 1;
652 : : }
653 [ + - ]: 8 : is_index[0] = 0;
654 : :
655 [ + + ]: 137 : for( int i = 0; i < nv; i++ )
656 [ + - ][ + - ]: 129 : is_index[i + 1] = is_index[i] + is_index[i + 1];
[ + - ]
657 : :
658 : : // Step 2: Define two arrays v2hv_eid, v2hv_lvid storing every half-facet on a vertex
659 [ + - ][ + - ]: 16 : std::vector< EntityHandle > v2hv_map_eid( 2 * edges.size() );
660 [ + - ][ + - ]: 16 : std::vector< int > v2hv_map_lvid( 2 * edges.size() );
661 : :
662 [ + - ][ + - ]: 230 : for( Range::iterator eid = edges.begin(); eid != edges.end(); ++eid )
[ + - ][ + - ]
[ + + ]
663 : : {
664 : : const EntityHandle* conn;
665 : 222 : int num_conn = 0;
666 [ + - ][ + - ]: 222 : error = mb->get_connectivity( *eid, conn, num_conn, true );MB_CHK_ERR( error );
[ - + ][ # # ]
[ # # ]
667 : :
668 [ + + ]: 666 : for( int j = 0; j < 2; j++ )
669 : : {
670 [ + - ]: 444 : int v = verts.index( conn[j] );
671 [ + - ][ + - ]: 444 : v2hv_map_eid[is_index[v]] = *eid;
[ + - ]
672 [ + - ][ + - ]: 444 : v2hv_map_lvid[is_index[v]] = j;
673 [ + - ]: 444 : is_index[v] += 1;
674 : : }
675 : : }
676 : :
677 [ + + ]: 129 : for( int i = nv - 2; i >= 0; i-- )
678 [ + - ][ + - ]: 121 : is_index[i + 1] = is_index[i];
679 [ + - ]: 8 : is_index[0] = 0;
680 : :
681 : : // Step 3: Fill up sibling half-verts map
682 [ + - ][ + - ]: 137 : for( Range::iterator vid = verts.begin(); vid != verts.end(); ++vid )
[ + - ][ + - ]
[ + + ]
683 : : {
684 [ + - ][ + - ]: 129 : int v = verts.index( *vid );
685 [ + - ]: 129 : int last = is_index[v + 1] - 1;
686 [ + - ][ + + ]: 129 : if( last > is_index[v] )
687 : : {
688 [ + - ]: 123 : EntityHandle prev_eid = v2hv_map_eid[last];
689 [ + - ]: 123 : int prev_lvid = v2hv_map_lvid[last];
690 : :
691 [ + - ][ + + ]: 561 : for( int i = is_index[v]; i <= last; i++ )
692 : : {
693 [ + - ]: 438 : EntityHandle cur_eid = v2hv_map_eid[i];
694 [ + - ]: 438 : int cur_lvid = v2hv_map_lvid[i];
695 : :
696 [ + - ]: 438 : int pidx = ID_FROM_HANDLE( prev_eid ) - 1;
697 [ + - ][ + - ]: 438 : sibhvs[2 * pidx + prev_lvid] = create_halffacet( cur_eid, cur_lvid );
698 : :
699 : 438 : prev_eid = cur_eid;
700 : 438 : prev_lvid = cur_lvid;
701 : : }
702 : : }
703 : : }
704 : :
705 : 16 : return MB_SUCCESS;
706 : : }
707 : :
708 : : ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
709 : 8 : ErrorCode HalfFacetRep::determine_incident_halfverts( Range& edges )
710 : : {
711 : : ErrorCode error;
712 : :
713 [ + - ][ + - ]: 230 : for( Range::iterator e_it = edges.begin(); e_it != edges.end(); ++e_it )
[ + - ][ + - ]
[ + + ]
714 : : {
715 [ + - ]: 222 : EntityHandle cur_eid = *e_it;
716 : : const EntityHandle* conn;
717 : 222 : int num_conn = 0;
718 [ + - ][ + - ]: 222 : error = mb->get_connectivity( *e_it, conn, num_conn, true );MB_CHK_ERR( error );
[ - + ][ # # ]
[ # # ]
719 : :
720 [ + + ]: 666 : for( int i = 0; i < 2; ++i )
721 : : {
722 : 444 : EntityHandle v = conn[i];
723 [ + - ]: 444 : int vidx = ID_FROM_HANDLE( v ) - 1;
724 : :
725 [ + - ]: 444 : HFacet hf = v2hv[vidx];
726 [ + - ]: 444 : EntityHandle eid = fid_from_halfacet( hf, MBEDGE );
727 [ + + ][ + - ]: 444 : if( eid == 0 ) { v2hv[vidx] = create_halffacet( cur_eid, i ); }
[ + - ]
728 : : }
729 : : }
730 : :
731 : 8 : return MB_SUCCESS;
732 : : }
733 : : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
734 : 4472 : ErrorCode HalfFacetRep::get_up_adjacencies_1d( EntityHandle vid, std::vector< EntityHandle >& adjents,
735 : : std::vector< int >* lvids )
736 : : {
737 : 4472 : adjents.clear();
738 [ + - ]: 4472 : adjents.reserve( 20 );
739 : :
740 [ - + ][ # # ]: 4472 : if( lvids != NULL ) lvids->reserve( 20 );
741 : :
742 [ + - ]: 4472 : int vidx = ID_FROM_HANDLE( vid ) - 1;
743 [ + - ]: 4472 : HFacet hf = v2hv[vidx];
744 : :
745 [ + - ]: 4472 : EntityHandle start_eid = fid_from_halfacet( hf, MBEDGE );
746 [ + - ]: 4472 : int start_lid = lid_from_halffacet( hf );
747 : :
748 : 4472 : EntityHandle eid = start_eid;
749 : 4472 : int lid = start_lid;
750 : :
751 [ + - ]: 4472 : if( eid != 0 )
752 : : {
753 [ + - ]: 4472 : adjents.push_back( eid );
754 [ - + ][ # # ]: 4472 : if( lvids != NULL ) lvids->push_back( lid );
755 : :
756 [ + - ]: 14706 : while( eid != 0 )
757 : : {
758 [ + - ]: 10234 : int eidx = ID_FROM_HANDLE( eid ) - 1;
759 [ + - ]: 10234 : HFacet shf = sibhvs[2 * eidx + lid];
760 [ + - ]: 10234 : eid = fid_from_halfacet( shf, MBEDGE );
761 [ + - ]: 10234 : lid = lid_from_halffacet( shf );
762 : :
763 [ + + ][ + + ]: 10234 : if( ( !eid ) || ( eid == start_eid ) ) break;
764 : :
765 [ + - ]: 5762 : adjents.push_back( eid );
766 [ - + ][ # # ]: 5762 : if( lvids != NULL ) lvids->push_back( lid );
767 : : }
768 : : }
769 : :
770 : 4472 : return MB_SUCCESS;
771 : : }
772 : : //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
773 : 2160 : ErrorCode HalfFacetRep::get_neighbor_adjacencies_1d( EntityHandle eid, std::vector< EntityHandle >& adjents )
774 : : {
775 : 2160 : adjents.clear();
776 [ + - ]: 2160 : adjents.reserve( 20 );
777 : :
778 : : EntityHandle sibhv_eid;
779 : : int sibhv_lid;
780 [ + - ]: 2160 : int eidx = ID_FROM_HANDLE( eid ) - 1;
781 : :
782 [ + + ]: 6480 : for( int lid = 0; lid < 2; ++lid )
783 : : {
784 [ + - ]: 4320 : HFacet shf = sibhvs[2 * eidx + lid];
785 [ + - ]: 4320 : sibhv_eid = fid_from_halfacet( shf, MBEDGE );
786 [ + - ]: 4320 : sibhv_lid = lid_from_halffacet( shf );
787 : :
788 [ + + ]: 4320 : if( sibhv_eid != 0 )
789 : : {
790 [ + - ]: 4302 : adjents.push_back( sibhv_eid );
791 : :
792 [ + - ]: 4302 : eidx = ID_FROM_HANDLE( sibhv_eid ) - 1;
793 [ + - ]: 4302 : HFacet nhf = sibhvs[2 * eidx + sibhv_lid];
794 [ + - ]: 4302 : EntityHandle hv_eid = fid_from_halfacet( nhf, MBEDGE );
795 [ + - ]: 4302 : int hv_lid = lid_from_halffacet( nhf );
796 : :
797 [ + - ]: 9542 : while( hv_eid != 0 )
798 : : {
799 [ + + ][ + - ]: 5240 : if( hv_eid != eid ) adjents.push_back( hv_eid );
800 : :
801 [ + - ]: 5240 : eidx = ID_FROM_HANDLE( hv_eid ) - 1;
802 [ + - ]: 5240 : HFacet hf = sibhvs[2 * eidx + hv_lid];
803 [ + - ]: 5240 : EntityHandle edge = fid_from_halfacet( hf, MBEDGE );
804 [ + + ]: 5240 : if( edge == sibhv_eid ) break;
805 : :
806 : 938 : hv_eid = edge;
807 [ + - ]: 938 : hv_lid = lid_from_halffacet( hf );
808 : : }
809 : : }
810 : : }
811 : :
812 : 2160 : return MB_SUCCESS;
813 : : }
814 : :
815 : : /*******************************************************
816 : : * 2D: sibhes, v2he, incident and neighborhood queries *
817 : : ********************************************************/
818 : : const HalfFacetRep::LocalMaps2D HalfFacetRep::lConnMap2D[2] = {
819 : : // Triangle
820 : : { 3, { 1, 2, 0 }, { 2, 0, 1 } },
821 : : // Quad
822 : : { 4, { 1, 2, 3, 0 }, { 3, 0, 1, 2 } }
823 : : };
824 : :
825 : : ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
826 : 26 : ErrorCode HalfFacetRep::determine_sibling_halfedges( Range& faces )
827 : : {
828 : : ErrorCode error;
829 [ + - ][ + - ]: 26 : EntityHandle start_face = *faces.begin();
830 [ + - ]: 26 : EntityType ftype = mb->type_from_handle( start_face );
831 [ + - ]: 26 : int nfaces = faces.size();
832 : 26 : int nepf = lConnMap2D[ftype - 2].num_verts_in_face;
833 : :
834 : : // Step 1: Create an index list storing the starting position for each vertex
835 [ + - ]: 26 : int nv = _verts.size();
836 [ + - ]: 26 : std::vector< int > is_index( nv + 1 );
837 [ + + ]: 8168 : for( int i = 0; i < nv + 1; i++ )
838 [ + - ]: 8142 : is_index[i] = 0;
839 : :
840 : : int index;
841 : :
842 [ + - ][ + - ]: 13298 : for( Range::iterator fid = faces.begin(); fid != faces.end(); ++fid )
[ + - ][ + - ]
[ + + ]
843 : : {
844 : : const EntityHandle* conn;
845 [ + - ][ + - ]: 13272 : error = mb->get_connectivity( *fid, conn, nepf, true );MB_CHK_ERR( error );
[ - + ][ # # ]
[ # # ]
846 : :
847 [ + + ]: 55923 : for( int i = 0; i < nepf; i++ )
848 : : {
849 [ + - ]: 42651 : index = _verts.index( conn[i] );
850 [ + - ]: 42651 : is_index[index + 1] += 1;
851 : : }
852 : : }
853 [ + - ]: 26 : is_index[0] = 0;
854 : :
855 [ + + ]: 8142 : for( int i = 0; i < nv; i++ )
856 [ + - ][ + - ]: 8116 : is_index[i + 1] = is_index[i] + is_index[i + 1];
[ + - ]
857 : :
858 : : // Step 2: Define two arrays v2hv_eid, v2hv_lvid storing every half-facet on a vertex
859 [ + - ]: 52 : std::vector< EntityHandle > v2nv( nepf * nfaces );
860 [ + - ]: 52 : std::vector< EntityHandle > v2he_map_fid( nepf * nfaces );
861 [ + - ]: 52 : std::vector< int > v2he_map_leid( nepf * nfaces );
862 : :
863 [ + - ][ + - ]: 13298 : for( Range::iterator fid = faces.begin(); fid != faces.end(); ++fid )
[ + - ][ + - ]
[ + + ]
864 : : {
865 : : const EntityHandle* conn;
866 [ + - ][ + - ]: 13272 : error = mb->get_connectivity( *fid, conn, nepf, true );MB_CHK_ERR( error );
[ - + ][ # # ]
[ # # ]
867 : :
868 [ + + ]: 55923 : for( int j = 0; j < nepf; j++ )
869 : : {
870 [ + - ]: 42651 : int v = _verts.index( conn[j] );
871 : 42651 : int nidx = lConnMap2D[ftype - 2].next[j];
872 [ + - ][ + - ]: 42651 : v2nv[is_index[v]] = conn[nidx];
873 [ + - ][ + - ]: 42651 : v2he_map_fid[is_index[v]] = *fid;
[ + - ]
874 [ + - ][ + - ]: 42651 : v2he_map_leid[is_index[v]] = j;
875 [ + - ]: 42651 : is_index[v] += 1;
876 : : }
877 : : }
878 : :
879 [ + + ]: 8116 : for( int i = nv - 2; i >= 0; i-- )
880 [ + - ][ + - ]: 8090 : is_index[i + 1] = is_index[i];
881 [ + - ]: 26 : is_index[0] = 0;
882 : :
883 : : // Step 3: Fill up sibling half-verts map
884 [ + - ][ + - ]: 13298 : for( Range::iterator fid = faces.begin(); fid != faces.end(); ++fid )
[ + - ][ + - ]
[ + + ]
885 : : {
886 : : const EntityHandle* conn;
887 [ + - ][ + - ]: 13272 : error = mb->get_connectivity( *fid, conn, nepf, true );MB_CHK_ERR( error );
[ - + ][ # # ]
[ # # ]
888 : :
889 [ + - ][ + - ]: 13272 : int fidx = ID_FROM_HANDLE( *fid ) - 1;
890 [ + + ]: 55923 : for( int k = 0; k < nepf; k++ )
891 : : {
892 [ + - ]: 42651 : HFacet hf = sibhes[nepf * fidx + k];
893 [ + - ]: 42651 : EntityHandle sibfid = fid_from_halfacet( hf, ftype );
894 : :
895 [ + + ]: 42651 : if( sibfid != 0 ) continue;
896 : :
897 : 21319 : int nidx = lConnMap2D[ftype - 2].next[k];
898 [ + - ]: 21319 : int v = _verts.index( conn[k] );
899 [ + - ]: 21319 : int vn = _verts.index( conn[nidx] );
900 : :
901 [ + - ]: 21319 : EntityHandle first_fid = *fid;
902 : 21319 : int first_leid = k;
903 : :
904 [ + - ]: 21319 : EntityHandle prev_fid = *fid;
905 : 21319 : int prev_leid = k;
906 : :
907 [ + - ][ + - ]: 137712 : for( index = is_index[vn]; index <= is_index[vn + 1] - 1; index++ )
[ + + ]
908 : : {
909 [ + - ][ + + ]: 116393 : if( v2nv[index] == conn[k] )
910 : : {
911 [ + - ]: 21252 : EntityHandle cur_fid = v2he_map_fid[index];
912 [ + - ]: 21252 : int cur_leid = v2he_map_leid[index];
913 : :
914 [ + - ]: 21252 : int pidx = ID_FROM_HANDLE( prev_fid ) - 1;
915 [ + - ][ + - ]: 21252 : sibhes[nepf * pidx + prev_leid] = create_halffacet( cur_fid, cur_leid );
916 : :
917 : 21252 : prev_fid = cur_fid;
918 : 21252 : prev_leid = cur_leid;
919 : : }
920 : : }
921 : :
922 [ + - ][ + - ]: 137794 : for( index = is_index[v]; index <= is_index[v + 1] - 1; index++ )
[ + + ]
923 : : {
924 [ + - ][ + + ]: 116475 : if( ( v2nv[index] == conn[nidx] ) && ( v2he_map_fid[index] != *fid ) )
[ + - ][ + - ]
[ + + ][ + + ]
925 : : {
926 : :
927 [ + - ]: 80 : EntityHandle cur_fid = v2he_map_fid[index];
928 [ + - ]: 80 : int cur_leid = v2he_map_leid[index];
929 : :
930 [ + - ]: 80 : int pidx = ID_FROM_HANDLE( prev_fid ) - 1;
931 [ + - ][ + - ]: 80 : sibhes[nepf * pidx + prev_leid] = create_halffacet( cur_fid, cur_leid );
932 : :
933 : 80 : prev_fid = cur_fid;
934 : 80 : prev_leid = cur_leid;
935 : : }
936 : : }
937 : :
938 [ + + ]: 21319 : if( prev_fid != first_fid )
939 : : {
940 : :
941 [ + - ]: 21152 : int pidx = ID_FROM_HANDLE( prev_fid ) - 1;
942 [ + - ][ + - ]: 21152 : sibhes[nepf * pidx + prev_leid] = create_halffacet( first_fid, first_leid );
943 : : }
944 : : }
945 : : }
946 : :
947 : 52 : return MB_SUCCESS;
948 : : }
949 : : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
950 : 26 : ErrorCode HalfFacetRep::determine_incident_halfedges( Range& faces )
951 : : {
952 : : ErrorCode error;
953 [ + - ][ + - ]: 26 : EntityType ftype = mb->type_from_handle( *faces.begin() );
[ + - ]
954 : 26 : int nepf = lConnMap2D[ftype - 2].num_verts_in_face;
955 : :
956 [ + - ][ + - ]: 26 : std::vector< char > markEdges( nepf * faces.size(), 0 );
957 : :
958 [ + - ][ + - ]: 13298 : for( Range::iterator it = faces.begin(); it != faces.end(); ++it )
[ + - ][ + - ]
[ + + ]
959 : : {
960 [ + - ]: 13272 : EntityHandle fid = *it;
961 : : const EntityHandle* conn;
962 [ + - ][ - + ]: 13272 : error = mb->get_connectivity( fid, conn, nepf, true );MB_CHK_ERR( error );
[ # # ][ # # ]
963 : :
964 [ + + ]: 55923 : for( int i = 0; i < nepf; ++i )
965 : : {
966 : 42651 : EntityHandle v = conn[i];
967 [ + - ]: 42651 : int vidx = ID_FROM_HANDLE( v ) - 1;
968 [ + - ]: 42651 : HFacet hf = v2he[vidx];
969 : :
970 [ + + ][ - + ]: 42651 : if( hf == 0 && ( v2hes.empty() || ( v2hes.find( v ) == v2hes.end() ) ) )
[ # # ][ # # ]
[ # # ][ - + ]
[ - + ][ + +
# # # # ]
971 : : {
972 : : // This is the first time a half-facet is assigned to a vertex.
973 : 8116 : HFacet nwhf = 0;
974 [ + - ][ - + ]: 8116 : error = mark_halfedges( v, fid, i, faces, markEdges, nwhf );MB_CHK_ERR( error );
[ # # ][ # # ]
975 : :
976 [ + + ][ + - ]: 8116 : if( nwhf == 0 ) nwhf = create_halffacet( fid, i );
977 : :
978 [ + - ]: 8116 : v2he[vidx] = nwhf;
979 : : }
980 [ + - ][ + - ]: 34535 : else if( hf != 0 && !markEdges[nepf * faces.index( fid ) + i] )
[ + - ][ - + ]
[ - + ]
981 : : {
982 : : // This is the first time a non-manifold vertex is encountered. Copy the existing he
983 : : // in v2he[v] to the multimap.
984 [ # # ][ # # ]: 0 : v2hes.insert( std::pair< EntityHandle, HFacet >( v, hf ) );
985 : 0 : HFacet nwhf = 0;
986 [ # # ][ # # ]: 0 : error = mark_halfedges( v, fid, i, faces, markEdges, nwhf );MB_CHK_ERR( error );
[ # # ][ # # ]
987 : :
988 [ # # ][ # # ]: 0 : if( nwhf == 0 ) nwhf = create_halffacet( fid, i );
989 : :
990 [ # # ][ # # ]: 0 : v2hes.insert( std::pair< EntityHandle, HFacet >( v, nwhf ) );
991 [ # # ]: 0 : v2he[vidx] = 0;
992 : : }
993 [ - + ][ # # ]: 34535 : else if( hf == 0 && ( !v2hes.empty() ) && ( v2hes.find( v ) != v2hes.end() ) &&
[ # # ][ # # ]
[ # # ][ # # ]
[ - + ][ - + ]
[ - + # #
# # ]
994 [ # # ][ # # ]: 0 : !markEdges[nepf * faces.index( fid ) + i] )
995 : : {
996 : : // This is check if reached if the vertex is non-manifold and has encountered a
997 : : // half-facet to a new component.
998 : 0 : HFacet nwhf = 0;
999 [ # # ][ # # ]: 0 : error = mark_halfedges( v, fid, i, faces, markEdges, nwhf );MB_CHK_ERR( error );
[ # # ][ # # ]
1000 : :
1001 [ # # ][ # # ]: 0 : if( nwhf == 0 ) nwhf = create_halffacet( fid, i );
1002 : :
1003 [ # # ][ # # ]: 0 : v2hes.insert( std::pair< EntityHandle, HFacet >( v, nwhf ) );
1004 : : }
1005 : : }
1006 : : }
1007 : :
1008 : : // error = print_tags(2);
1009 : :
1010 : 26 : return MB_SUCCESS;
1011 : : }
1012 : :
1013 : : ///////////////////////////////////////////////////////////////////
1014 : 8116 : ErrorCode HalfFacetRep::mark_halfedges( EntityHandle vid, EntityHandle he_fid, int he_lid, Range& faces,
1015 : : std::vector< char >& markHEdgs, HFacet& bnd_hf )
1016 : : {
1017 : : ErrorCode error;
1018 [ + - ]: 8116 : EntityType ftype = mb->type_from_handle( he_fid );
1019 : 8116 : int nepf = lConnMap2D[ftype - 2].num_verts_in_face;
1020 : :
1021 : 8116 : int qsize = 0, count = -1;
1022 : 8116 : int num_qvals = 0;
1023 : :
1024 [ + - ][ - + ]: 8116 : error = gather_halfedges( vid, he_fid, he_lid, &qsize, &count );MB_CHK_ERR( error );
[ # # ][ # # ]
1025 : :
1026 [ + + ]: 67457 : while( num_qvals < qsize )
1027 : : {
1028 : 59341 : EntityHandle curfid = queue_fid[num_qvals];
1029 : 59341 : int curlid = queue_lid[num_qvals];
1030 : 59341 : num_qvals += 1;
1031 : :
1032 [ + - ]: 59341 : int fidx = ID_FROM_HANDLE( curfid ) - 1;
1033 : :
1034 : : const EntityHandle* conn;
1035 [ + - ][ - + ]: 59341 : error = mb->get_connectivity( curfid, conn, nepf, true );MB_CHK_ERR( error );
[ # # ][ # # ]
1036 : :
1037 [ + - ][ + - ]: 59341 : if( !markHEdgs[nepf * faces.index( curfid ) + curlid] && ( conn[curlid] == vid ) )
[ + + ][ + + ]
[ + + ]
1038 : : {
1039 [ + - ][ + - ]: 21604 : markHEdgs[nepf * faces.index( curfid ) + curlid] = 1;
1040 [ + - ]: 21604 : HFacet hf = sibhes[nepf * fidx + curlid];
1041 [ + - ]: 21604 : EntityHandle sibfid = fid_from_halfacet( hf, ftype );
1042 [ + + ][ + - ]: 21604 : if( sibfid == 0 ) bnd_hf = create_halffacet( curfid, curlid );
1043 : : }
1044 : :
1045 : 59341 : EntityHandle he2_fid = 0;
1046 : 59341 : int he2_lid = 0;
1047 [ + - ][ - + ]: 59341 : error = another_halfedge( vid, curfid, curlid, &he2_fid, &he2_lid );MB_CHK_ERR( error );
[ # # ][ # # ]
1048 : :
1049 [ + - ][ + - ]: 59341 : if( !markHEdgs[nepf * faces.index( curfid ) + he2_lid] && ( conn[he2_lid] == vid ) )
[ + + ][ + + ]
[ + + ]
1050 : : {
1051 [ + - ][ + - ]: 21047 : markHEdgs[nepf * faces.index( curfid ) + he2_lid] = 1;
1052 [ + - ]: 21047 : HFacet hf = sibhes[nepf * fidx + he2_lid];
1053 [ + - ]: 21047 : EntityHandle sibfid = fid_from_halfacet( hf, ftype );
1054 [ + + ][ + - ]: 21047 : if( sibfid == 0 ) bnd_hf = create_halffacet( he2_fid, he2_lid );
1055 : : }
1056 : :
1057 [ + - ]: 59341 : bool val = find_match_in_array( he2_fid, trackfaces, count );
1058 : :
1059 [ + + ]: 59341 : if( val ) continue;
1060 : :
1061 : 34535 : count += 1;
1062 : 34535 : trackfaces[count] = he2_fid;
1063 : :
1064 [ + - ][ - + ]: 34535 : error = get_up_adjacencies_2d( he2_fid, he2_lid, &qsize, &count );MB_CHK_ERR( error );
[ # # ][ # # ]
1065 : : }
1066 : :
1067 : : // Change the visited faces to false, also empty the queue
1068 [ + + ]: 75573 : for( int i = 0; i <= qsize; i++ )
1069 : : {
1070 : 67457 : queue_fid[i] = 0;
1071 : 67457 : queue_lid[i] = 0;
1072 : : }
1073 : :
1074 [ + + ]: 50767 : for( int i = 0; i <= count; i++ )
1075 : 42651 : trackfaces[i] = 0;
1076 : 8116 : return MB_SUCCESS;
1077 : : }
1078 : :
1079 : : ///////////////////////////////////////////////////////////////////
1080 : 1114188 : ErrorCode HalfFacetRep::get_up_adjacencies_vert_2d( EntityHandle vid, std::vector< EntityHandle >& adjents )
1081 : : {
1082 : : ErrorCode error;
1083 [ + - ][ + - ]: 1114188 : EntityType ftype = mb->type_from_handle( *_faces.begin() );
[ + - ]
1084 : :
1085 [ + - ]: 1114188 : int vidx = ID_FROM_HANDLE( vid ) - 1;
1086 [ + - ]: 1114188 : HFacet hf = v2he[vidx];
1087 : :
1088 [ + - ]: 1114188 : std::vector< EntityHandle > start_fids;
1089 [ + - ]: 2228376 : std::vector< int > start_lids;
1090 : :
1091 [ - + ][ # # ]: 1114188 : if( hf == 0 && ( v2hes.find( vid ) != v2hes.end() ) )
[ # # ][ # # ]
[ - + ][ - + ]
[ - + # #
# # ]
1092 : : {
1093 : : std::pair< std::multimap< EntityHandle, HFacet >::iterator, std::multimap< EntityHandle, HFacet >::iterator >
1094 [ # # ]: 0 : it_hes;
1095 [ # # ]: 0 : it_hes = v2hes.equal_range( vid );
1096 : :
1097 [ # # ][ # # ]: 0 : for( std::multimap< EntityHandle, HFacet >::iterator it = it_hes.first; it != it_hes.second; ++it )
[ # # ]
1098 : : {
1099 [ # # ][ # # ]: 0 : start_fids.push_back( fid_from_halfacet( it->second, ftype ) );
[ # # ]
1100 [ # # ][ # # ]: 0 : start_lids.push_back( lid_from_halffacet( it->second ) );
[ # # ]
1101 : : }
1102 : : }
1103 [ + - ]: 1114188 : else if( hf != 0 )
1104 : : {
1105 [ + - ][ + - ]: 1114188 : start_fids.push_back( fid_from_halfacet( hf, ftype ) );
1106 [ + - ][ + - ]: 1114188 : start_lids.push_back( lid_from_halffacet( hf ) );
1107 : : }
1108 : :
1109 [ - + ]: 1114188 : if( start_fids.empty() ) return MB_SUCCESS;
1110 : :
1111 : 1114188 : int qsize = 0, count = -1;
1112 : 1114188 : int num_qvals = 0;
1113 : :
1114 [ + - ]: 1114188 : adjents.reserve( (int)start_fids.size() );
1115 : :
1116 [ + + ]: 2228376 : for( int i = 0; i < (int)start_fids.size(); i++ )
1117 : : {
1118 [ + - ][ + - ]: 1114188 : adjents.push_back( start_fids[i] );
1119 [ + - ][ + - ]: 1114188 : error = gather_halfedges( vid, start_fids[i], start_lids[i], &qsize, &count );MB_CHK_ERR( error );
[ + - ][ - + ]
[ # # ][ # # ]
1120 : : }
1121 : :
1122 [ + + ]: 9179057 : while( num_qvals < qsize )
1123 : : {
1124 : 8064869 : EntityHandle curfid = queue_fid[num_qvals];
1125 : 8064869 : int curlid = queue_lid[num_qvals];
1126 : 8064869 : num_qvals += 1;
1127 : :
1128 : 8064869 : EntityHandle he2_fid = 0;
1129 : 8064869 : int he2_lid = 0;
1130 [ + - ][ - + ]: 8064869 : error = another_halfedge( vid, curfid, curlid, &he2_fid, &he2_lid );MB_CHK_ERR( error );
[ # # ][ # # ]
1131 : :
1132 [ + - ]: 8064869 : bool val = find_match_in_array( he2_fid, trackfaces, count );
1133 : :
1134 [ + + ]: 8064869 : if( val ) continue;
1135 : :
1136 : 4720774 : count += 1;
1137 : 4720774 : trackfaces[count] = he2_fid;
1138 : :
1139 [ + - ][ - + ]: 4720774 : error = get_up_adjacencies_2d( he2_fid, he2_lid, &qsize, &count );MB_CHK_ERR( error );
[ # # ][ # # ]
1140 : :
1141 [ + - ]: 4720774 : adjents.push_back( he2_fid );
1142 : : }
1143 : :
1144 : : // Change the visited faces to false, also empty the queue
1145 [ + + ]: 10293245 : for( int i = 0; i <= qsize; i++ )
1146 : : {
1147 : 9179057 : queue_fid[i] = 0;
1148 : 9179057 : queue_lid[i] = 0;
1149 : : }
1150 : :
1151 [ + + ]: 6949150 : for( int i = 0; i <= count; i++ )
1152 : 5834962 : trackfaces[i] = 0;
1153 : :
1154 : 2228376 : return MB_SUCCESS;
1155 : : }
1156 : :
1157 : : //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1158 : 170 : ErrorCode HalfFacetRep::get_up_adjacencies_2d( EntityHandle eid, std::vector< EntityHandle >& adjents,
1159 : : std::vector< int >* leids )
1160 : : {
1161 : :
1162 : : // Given an explicit edge eid, find the incident faces.
1163 : : ErrorCode error;
1164 : 170 : EntityHandle he_fid = 0;
1165 : 170 : int he_lid = 0;
1166 : :
1167 : : // Step 1: Given an explicit edge, find a corresponding half-edge from the surface mesh.
1168 [ + - ]: 170 : bool found = find_matching_halfedge( eid, &he_fid, &he_lid );
1169 : :
1170 : : // Step 2: If there is a corresponding half-edge, collect all sibling half-edges and store the
1171 : : // incident faces.
1172 [ + - ]: 170 : if( found )
1173 : : {
1174 [ + - ][ - + ]: 170 : error = get_up_adjacencies_2d( he_fid, he_lid, true, adjents, leids );MB_CHK_ERR( error );
[ # # ][ # # ]
1175 : : }
1176 : :
1177 : 170 : return MB_SUCCESS;
1178 : : }
1179 : :
1180 : : /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1181 : 87058 : ErrorCode HalfFacetRep::get_up_adjacencies_2d( EntityHandle fid, int leid, bool add_inent,
1182 : : std::vector< EntityHandle >& adj_ents, std::vector< int >* adj_leids,
1183 : : std::vector< int >* adj_orients )
1184 : : {
1185 : : // Given an implicit half-edge <fid, leid>, find the incident half-edges.
1186 : : ErrorCode error;
1187 : :
1188 [ + - ]: 87058 : EntityType ftype = mb->type_from_handle( fid );
1189 : 87058 : int nepf = lConnMap2D[ftype - 2].num_verts_in_face;
1190 : :
1191 [ - + ]: 87058 : if( !fid ) return MB_FAILURE;
1192 [ + - ]: 87058 : adj_ents.reserve( 20 );
1193 : :
1194 : 87058 : bool local_id = false;
1195 : 87058 : bool orient = false;
1196 [ + + ]: 87058 : if( adj_leids != NULL )
1197 : : {
1198 : 25926 : local_id = true;
1199 [ + - ]: 25926 : adj_leids->reserve( 20 );
1200 : : }
1201 [ + + ]: 87058 : if( adj_orients != NULL )
1202 : : {
1203 : 17179 : orient = true;
1204 [ + - ]: 17179 : adj_orients->reserve( 20 );
1205 : : }
1206 : :
1207 [ + + ]: 87058 : if( add_inent )
1208 : : {
1209 [ + - ]: 170 : adj_ents.push_back( fid );
1210 [ - + ][ # # ]: 170 : if( local_id ) adj_leids->push_back( leid );
1211 : : }
1212 : :
1213 : 87058 : EntityHandle fedge[2] = { 0, 0 };
1214 : :
1215 [ + + ]: 87058 : if( orient )
1216 : : {
1217 : : // get connectivity and match their directions
1218 : : const EntityHandle* fid_conn;
1219 [ + - ][ - + ]: 17179 : error = mb->get_connectivity( fid, fid_conn, nepf, true );MB_CHK_ERR( error );
[ # # ][ # # ]
1220 : :
1221 : 17179 : int nidx = lConnMap2D[ftype - 2].next[leid];
1222 : 17179 : fedge[0] = fid_conn[leid];
1223 : 17179 : fedge[1] = fid_conn[nidx];
1224 : : }
1225 : :
1226 [ + - ]: 87058 : int fidx = ID_FROM_HANDLE( fid ) - 1;
1227 [ + - ]: 87058 : HFacet hf = sibhes[nepf * fidx + leid];
1228 [ + - ]: 87058 : EntityHandle curfid = fid_from_halfacet( hf, ftype );
1229 [ + - ]: 87058 : int curlid = lid_from_halffacet( hf );
1230 : :
1231 [ + + ][ + + ]: 174022 : while( ( curfid != fid ) && ( curfid != 0 ) )
1232 : : { // Should not go into the loop when no sibling exists
1233 [ + - ]: 86964 : adj_ents.push_back( curfid );
1234 : :
1235 [ + + ][ + - ]: 86964 : if( local_id ) adj_leids->push_back( curlid );
1236 : :
1237 [ + + ]: 86964 : if( orient )
1238 : : {
1239 : : // get connectivity and match their directions
1240 : : const EntityHandle* conn;
1241 [ + - ][ - + ]: 17026 : error = mb->get_connectivity( curfid, conn, nepf, true );MB_CHK_ERR( error );
[ # # ][ # # ]
1242 : :
1243 : 17026 : int nidx = lConnMap2D[ftype - 2].next[curlid];
1244 : :
1245 [ + + ][ + - ]: 17026 : if( ( fedge[0] == conn[curlid] ) && ( fedge[1] == conn[nidx] ) )
1246 [ + - ]: 144 : adj_orients->push_back( 1 );
1247 [ + - ][ + - ]: 16882 : else if( ( fedge[1] == conn[curlid] ) && ( fedge[0] == conn[nidx] ) )
1248 [ + - ]: 17026 : adj_orients->push_back( 0 );
1249 : : }
1250 : :
1251 [ + - ]: 86964 : int cidx = ID_FROM_HANDLE( curfid ) - 1;
1252 [ + - ]: 86964 : hf = sibhes[nepf * cidx + curlid];
1253 [ + - ]: 86964 : curfid = fid_from_halfacet( hf, ftype );
1254 [ + - ]: 86964 : curlid = lid_from_halffacet( hf );
1255 : : }
1256 : :
1257 : 87058 : return MB_SUCCESS;
1258 : : }
1259 : :
1260 : : /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1261 : 7001062 : ErrorCode HalfFacetRep::get_up_adjacencies_2d( EntityHandle fid, int lid, int* qsize, int* count )
1262 : : {
1263 : 7001062 : EntityType ftype = mb->type_from_handle( fid );
1264 : 7001062 : int nepf = lConnMap2D[ftype - 2].num_verts_in_face;
1265 : :
1266 : 7001062 : int fidx = ID_FROM_HANDLE( fid ) - 1;
1267 : 7001062 : HFacet hf = sibhes[nepf * fidx + lid];
1268 : 7001062 : EntityHandle curfid = fid_from_halfacet( hf, ftype );
1269 : 7001062 : int curlid = lid_from_halffacet( hf );
1270 : :
1271 [ + + ]: 7001062 : if( curfid == 0 )
1272 : : {
1273 : 22842 : int index = 0;
1274 [ + - ]: 22842 : bool found_ent = find_match_in_array( fid, queue_fid, qsize[0] - 1, true, &index );
1275 : :
1276 [ + - ][ + - ]: 22842 : if( ( !found_ent ) || ( ( found_ent ) && ( queue_lid[index] != lid ) ) )
[ + + ]
1277 : : {
1278 : 11495 : queue_fid[qsize[0]] = fid;
1279 : 11495 : queue_lid[qsize[0]] = lid;
1280 : 22842 : qsize[0] += 1;
1281 : : }
1282 : : }
1283 : :
1284 [ + + ][ + + ]: 13983988 : while( ( curfid != fid ) && ( curfid != 0 ) )
1285 : : {
1286 : 6982926 : bool val = find_match_in_array( curfid, trackfaces, count[0] );
1287 : :
1288 [ + + ]: 6982926 : if( !val )
1289 : : {
1290 : 5870182 : queue_fid[qsize[0]] = curfid;
1291 : 5870182 : queue_lid[qsize[0]] = curlid;
1292 : 5870182 : qsize[0] += 1;
1293 : : }
1294 : :
1295 : 6982926 : int cidx = ID_FROM_HANDLE( curfid ) - 1;
1296 : 6982926 : hf = sibhes[nepf * cidx + curlid];
1297 : 6982926 : curfid = fid_from_halfacet( hf, ftype );
1298 : 6982926 : curlid = lid_from_halffacet( hf );
1299 : : }
1300 : :
1301 : 7001062 : return MB_SUCCESS;
1302 : : }
1303 : :
1304 : : /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1305 : 170 : bool HalfFacetRep::find_matching_halfedge( EntityHandle eid, EntityHandle* hefid, int* helid )
1306 : : {
1307 : : ErrorCode error;
1308 [ + - ][ + - ]: 170 : EntityType ftype = mb->type_from_handle( *_faces.begin() );
[ + - ]
1309 : :
1310 : : const EntityHandle* conn;
1311 : 170 : int num_conn = 0;
1312 [ + - ][ - + ]: 170 : error = mb->get_connectivity( eid, conn, num_conn, true );MB_CHK_ERR( error );
[ # # ][ # # ]
1313 : :
1314 : 170 : EntityHandle vid = conn[0];
1315 [ + - ]: 170 : int vidx = ID_FROM_HANDLE( conn[0] ) - 1;
1316 [ + - ]: 170 : HFacet hf = v2he[vidx];
1317 : :
1318 [ - + ]: 170 : if( hf == 0 )
1319 : : {
1320 [ # # ]: 0 : vidx = ID_FROM_HANDLE( conn[1] ) - 1;
1321 [ # # ]: 0 : hf = v2he[vidx];
1322 : :
1323 [ # # ]: 0 : if( hf == 0 ) // The edge is either a dangling edge or attached to two non-manifold
1324 : : // vertices
1325 : 0 : return MB_SUCCESS;
1326 : :
1327 : 0 : vid = conn[1];
1328 : : }
1329 : :
1330 [ + - ]: 170 : EntityHandle fid = fid_from_halfacet( hf, ftype );
1331 [ + - ]: 170 : int lid = lid_from_halffacet( hf );
1332 : :
1333 : 170 : bool found = false;
1334 : 170 : int qsize = 0, count = -1;
1335 : :
1336 [ + - ][ - + ]: 170 : error = gather_halfedges( vid, fid, lid, &qsize, &count );MB_CHK_ERR( error );
[ # # ][ # # ]
1337 : :
1338 [ + - ][ - + ]: 170 : found = collect_and_compare( vid, conn, &qsize, &count, hefid, helid );MB_CHK_ERR( error );
[ # # ][ # # ]
1339 : :
1340 : : // Change the visited faces to false
1341 [ + + ]: 2585 : for( int i = 0; i < qsize; i++ )
1342 : : {
1343 : 2415 : queue_fid[i] = 0;
1344 : 2415 : queue_lid[i] = 0;
1345 : : }
1346 : :
1347 [ + + ]: 1145 : for( int i = 0; i <= count; i++ )
1348 : 975 : trackfaces[i] = 0;
1349 : :
1350 : 170 : return found;
1351 : : }
1352 : : /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1353 : 1122474 : ErrorCode HalfFacetRep::gather_halfedges( EntityHandle vid, EntityHandle he_fid, int he_lid, int* qsize, int* count )
1354 : : {
1355 : : ErrorCode error;
1356 : 1122474 : EntityHandle he2_fid = 0;
1357 : 1122474 : int he2_lid = 0;
1358 : :
1359 [ + - ][ - + ]: 1122474 : error = another_halfedge( vid, he_fid, he_lid, &he2_fid, &he2_lid );MB_CHK_ERR( error );
[ # # ][ # # ]
1360 : :
1361 : 1122474 : queue_fid[*qsize] = he_fid;
1362 : 1122474 : queue_lid[*qsize] = he_lid;
1363 : 1122474 : *qsize += 1;
1364 : :
1365 : 1122474 : queue_fid[*qsize] = he2_fid;
1366 : 1122474 : queue_lid[*qsize] = he2_lid;
1367 : 1122474 : *qsize += 1;
1368 : :
1369 : 1122474 : *count += 1;
1370 : 1122474 : trackfaces[*count] = he_fid;
1371 : :
1372 [ + - ][ - + ]: 1122474 : error = get_up_adjacencies_2d( he_fid, he_lid, qsize, count );MB_CHK_ERR( error );
[ # # ][ # # ]
1373 [ + - ][ - + ]: 1122474 : error = get_up_adjacencies_2d( he2_fid, he2_lid, qsize, count );MB_CHK_ERR( error );
[ # # ][ # # ]
1374 : :
1375 : 1122474 : return MB_SUCCESS;
1376 : : }
1377 : :
1378 : : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1379 : 9247489 : ErrorCode HalfFacetRep::another_halfedge( EntityHandle vid, EntityHandle he_fid, int he_lid, EntityHandle* he2_fid,
1380 : : int* he2_lid )
1381 : : {
1382 : : ErrorCode error;
1383 [ + - ]: 9247489 : EntityType ftype = mb->type_from_handle( he_fid );
1384 : 9247489 : int nepf = lConnMap2D[ftype - 2].num_verts_in_face;
1385 : :
1386 : : const EntityHandle* conn;
1387 [ + - ][ - + ]: 9247489 : error = mb->get_connectivity( he_fid, conn, nepf, true );MB_CHK_ERR( error );
[ # # ][ # # ]
1388 : :
1389 : 9247489 : *he2_fid = he_fid;
1390 [ + + ]: 9247489 : if( conn[he_lid] == vid )
1391 : 5162599 : *he2_lid = lConnMap2D[ftype - 2].prev[he_lid];
1392 : : else
1393 : 4084890 : *he2_lid = lConnMap2D[ftype - 2].next[he_lid];
1394 : :
1395 : 9247489 : return MB_SUCCESS;
1396 : : }
1397 : :
1398 : : /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1399 : 170 : bool HalfFacetRep::collect_and_compare( const EntityHandle vid, const EntityHandle* edg_vert, int* qsize, int* count,
1400 : : EntityHandle* he_fid, int* he_lid )
1401 : : {
1402 : : ErrorCode error;
1403 [ + - ][ + - ]: 170 : EntityType ftype = mb->type_from_handle( *_faces.begin() );
[ + - ]
1404 : 170 : int nepf = lConnMap2D[ftype - 2].num_verts_in_face;
1405 : :
1406 : 170 : bool found = false;
1407 : 170 : int num_qvals = 0, counter = 0;
1408 : :
1409 [ + - ][ + - ]: 1454 : while( num_qvals < *qsize && counter < MAXSIZE )
1410 : : {
1411 : 1454 : EntityHandle curfid = queue_fid[num_qvals];
1412 : 1454 : int curlid = queue_lid[num_qvals];
1413 : 1454 : num_qvals += 1;
1414 : :
1415 : : const EntityHandle* conn;
1416 [ + - ][ - + ]: 1454 : error = mb->get_connectivity( curfid, conn, nepf, true );MB_CHK_ERR( error );
[ # # ][ # # ]
1417 : :
1418 : 1454 : int id = lConnMap2D[ftype - 2].next[curlid];
1419 [ + + ][ + + ]: 1454 : if( ( ( conn[curlid] == edg_vert[0] ) && ( conn[id] == edg_vert[1] ) ) ||
[ + + ]
1420 [ + - ]: 82 : ( ( conn[curlid] == edg_vert[1] ) && ( conn[id] == edg_vert[0] ) ) )
1421 : : {
1422 : 170 : *he_fid = curfid;
1423 : 170 : *he_lid = curlid;
1424 : 170 : found = true;
1425 : 170 : break;
1426 : : }
1427 : :
1428 [ + - ]: 1284 : bool val = find_match_in_array( curfid, trackfaces, count[0] );
1429 : :
1430 [ + + ]: 1284 : if( val ) continue;
1431 : :
1432 : 805 : count[0] += 1;
1433 : 805 : trackfaces[*count] = curfid;
1434 : :
1435 : : EntityHandle he2_fid;
1436 : : int he2_lid;
1437 [ + - ][ - + ]: 805 : error = another_halfedge( vid, curfid, curlid, &he2_fid, &he2_lid );MB_CHK_ERR( error );
[ # # ][ # # ]
1438 [ + - ][ - + ]: 805 : error = get_up_adjacencies_2d( he2_fid, he2_lid, qsize, count );MB_CHK_ERR( error );
[ # # ][ # # ]
1439 : :
1440 : 805 : counter += 1;
1441 : : }
1442 : 170 : return found;
1443 : : }
1444 : :
1445 : : ///////////////////////////////////////////////////////////////////////////////////////////////////
1446 : 17668 : ErrorCode HalfFacetRep::get_neighbor_adjacencies_2d( EntityHandle fid, std::vector< EntityHandle >& adjents )
1447 : : {
1448 : : ErrorCode error;
1449 : :
1450 [ + - ]: 17668 : if( fid != 0 )
1451 : : {
1452 : 17668 : EntityType ftype = mb->type_from_handle( fid );
1453 : 17668 : int nepf = lConnMap2D[ftype - 2].num_verts_in_face;
1454 : :
1455 [ + + ]: 78630 : for( int lid = 0; lid < nepf; ++lid )
1456 : : {
1457 [ - + ][ # # ]: 60962 : error = get_up_adjacencies_2d( fid, lid, false, adjents );MB_CHK_ERR( error );
1458 : : }
1459 : : }
1460 : :
1461 : 17668 : return MB_SUCCESS;
1462 : : }
1463 : :
1464 : : /////////////////////////////////////////////////////////////////////////////////////////////////
1465 : 128 : ErrorCode HalfFacetRep::get_down_adjacencies_2d( EntityHandle fid, std::vector< EntityHandle >& adjents )
1466 : : {
1467 : : // Returns explicit edges, if any, of the face
1468 : : ErrorCode error;
1469 [ + - ]: 128 : adjents.reserve( 10 );
1470 [ + - ]: 128 : EntityType ftype = mb->type_from_handle( fid );
1471 : 128 : int nepf = lConnMap2D[ftype - 2].num_verts_in_face;
1472 : :
1473 : : const EntityHandle* conn;
1474 [ + - ][ - + ]: 128 : error = mb->get_connectivity( fid, conn, nepf, true );MB_CHK_ERR( error );
[ # # ][ # # ]
1475 : :
1476 [ + - ]: 128 : std::vector< EntityHandle > temp;
1477 : :
1478 : : // Loop over 2 vertices
1479 [ + + ]: 384 : for( int i = 0; i < 2; i++ )
1480 : : {
1481 : : // Choose the two adjacent vertices for a triangle, and two opposite vertices for a quad
1482 : : int l;
1483 [ - + ]: 256 : if( ftype == MBTRI )
1484 : 0 : l = i;
1485 : : else
1486 : 256 : l = 2 * i;
1487 : :
1488 : : // Get the current, next and prev vertices
1489 : 256 : int nidx = lConnMap2D[ftype - 2].next[l];
1490 : 256 : int pidx = lConnMap2D[ftype - 2].prev[l];
1491 : 256 : EntityHandle v = conn[l];
1492 : 256 : EntityHandle vnext = conn[nidx];
1493 : 256 : EntityHandle vprev = conn[pidx];
1494 : :
1495 : : // Get incident edges on v
1496 [ + - ][ - + ]: 256 : error = get_up_adjacencies_1d( v, temp );MB_CHK_ERR( error );
[ # # ][ # # ]
1497 : :
1498 : : // Loop over the incident edges and check if its end vertices match those in the face
1499 [ + + ]: 1496 : for( int k = 0; k < (int)temp.size(); k++ )
1500 : : {
1501 : : const EntityHandle* econn;
1502 : 1240 : int num_conn = 0;
1503 [ + - ][ + - ]: 1240 : error = mb->get_connectivity( temp[k], econn, num_conn, true );MB_CHK_ERR( error );
[ - + ][ # # ]
[ # # ]
1504 : :
1505 [ + + ][ + + ]: 1240 : if( ( econn[0] == v && econn[1] == vnext ) || ( econn[0] == v && econn[1] == vprev ) ||
[ + + ][ + + ]
[ + + ]
1506 [ - + ][ + + ]: 994 : ( econn[0] == vnext && econn[1] == v ) || ( econn[0] == vprev && econn[1] == v ) )
[ + - ]
1507 : : {
1508 : 512 : bool found = false;
1509 [ + + ]: 1280 : for( int j = 0; j < (int)adjents.size(); j++ )
1510 : : {
1511 [ + - ][ + - ]: 768 : if( adjents[j] == temp[k] )
[ - + ]
1512 : : {
1513 : 0 : found = true;
1514 : 0 : break;
1515 : : }
1516 : : }
1517 [ + - ][ + - ]: 512 : if( !found ) adjents.push_back( temp[k] );
[ + - ]
1518 : : }
1519 : : }
1520 : : }
1521 : :
1522 : 128 : return MB_SUCCESS;
1523 : : }
1524 : :
1525 : : ////////////////////////////////////////////////////////////////////////////////////////////////
1526 : 22 : int HalfFacetRep::find_total_edges_2d( Range& faces )
1527 : : {
1528 : : ErrorCode error;
1529 [ + - ][ + - ]: 22 : EntityType ftype = mb->type_from_handle( *faces.begin() );
[ + - ]
1530 : 22 : int nepf = lConnMap2D[ftype - 2].num_verts_in_face;
1531 [ + - ]: 22 : int nfaces = faces.size();
1532 : :
1533 : 22 : int total_edges = nepf * nfaces;
1534 : :
1535 [ + - ]: 22 : std::vector< int > trackF( total_edges, 0 );
1536 [ + - ]: 44 : std::vector< EntityHandle > adj_fids;
1537 [ + - ]: 44 : std::vector< int > adj_lids;
1538 : :
1539 [ + - ][ + - ]: 5566 : for( Range::iterator f = faces.begin(); f != faces.end(); ++f )
[ + - ][ + - ]
[ + + ]
1540 : : {
1541 [ + + ]: 22723 : for( int l = 0; l < nepf; l++ )
1542 : : {
1543 : :
1544 : 17179 : adj_fids.clear();
1545 : 17179 : adj_lids.clear();
1546 : :
1547 [ + - ][ + - ]: 17179 : int id = nepf * ( faces.index( *f ) ) + l;
1548 [ + - ][ + + ]: 17179 : if( !trackF[id] )
1549 : : {
1550 [ + - ][ + - ]: 8747 : error = get_up_adjacencies_2d( *f, l, false, adj_fids, &adj_lids );MB_CHK_ERR( error );
[ - + ][ # # ]
[ # # ]
1551 : :
1552 : 8747 : total_edges -= adj_fids.size();
1553 : :
1554 [ + + ]: 17179 : for( int i = 0; i < (int)adj_fids.size(); i++ )
1555 [ + - ][ + - ]: 8432 : trackF[nepf * ( faces.index( adj_fids[i] ) ) + adj_lids[i]] = 1;
[ + - ][ + - ]
1556 : : };
1557 : : };
1558 : : };
1559 : :
1560 : 44 : return total_edges;
1561 : : }
1562 : :
1563 : 0 : ErrorCode HalfFacetRep::get_face_edges( EntityHandle fid, std::vector< EntityHandle >& edges )
1564 : : {
1565 : : ErrorCode error;
1566 : 0 : edges.clear();
1567 : :
1568 [ # # ]: 0 : EntityType ftype = mb->type_from_handle( fid );
1569 : 0 : int nepf = lConnMap2D[ftype - 2].num_verts_in_face;
1570 : :
1571 [ # # ]: 0 : std::vector< EntityHandle > conn;
1572 [ # # ][ # # ]: 0 : error = mb->get_connectivity( &fid, 1, conn );MB_CHK_ERR( error );
[ # # ][ # # ]
1573 : :
1574 [ # # ]: 0 : for( int i = 0; i < nepf; i++ )
1575 : : {
1576 [ # # ]: 0 : EntityHandle v0 = conn[i];
1577 [ # # ]: 0 : EntityHandle v1 = conn[lConnMap2D[ftype - 2].next[i]];
1578 : :
1579 [ # # ][ # # ]: 0 : std::vector< EntityHandle > e0, e1, ecom;
[ # # ][ # # ]
[ # # ]
1580 [ # # ][ # # ]: 0 : error = get_up_adjacencies_1d( v0, e0 );MB_CHK_ERR( error );
[ # # ][ # # ]
1581 [ # # ][ # # ]: 0 : error = get_up_adjacencies_1d( v1, e1 );MB_CHK_ERR( error );
[ # # ][ # # ]
1582 : :
1583 [ # # ]: 0 : std::sort( e0.begin(), e0.end() );
1584 [ # # ]: 0 : std::sort( e1.begin(), e1.end() );
1585 [ # # ][ # # ]: 0 : std::set_intersection( e0.begin(), e0.end(), e1.begin(), e1.end(), std::back_inserter( ecom ) );
1586 [ # # ][ # # ]: 0 : assert( ecom.size() == 1 || ecom.size() == 0 );
1587 [ # # ]: 0 : if( ecom.size() == 0 )
1588 [ # # ]: 0 : edges.push_back( 0 );
1589 : : else
1590 [ # # ][ # # ]: 0 : edges.push_back( ecom[0] );
[ # # ]
1591 : 0 : }
1592 : :
1593 : 0 : return MB_SUCCESS;
1594 : : }
1595 : :
1596 : : /*******************************************************
1597 : : * 3D: sibhfs, v2hf, incident and neighborhood queries *
1598 : : ********************************************************/
1599 : :
1600 : 607591 : int HalfFacetRep::get_index_in_lmap( EntityHandle cid )
1601 : : {
1602 [ + - ]: 607591 : EntityType type = mb->type_from_handle( cid );
1603 [ + - ][ + - ]: 607591 : int index = cell_index.find( type )->second;
1604 : 607591 : return index;
1605 : : }
1606 : :
1607 : : const HalfFacetRep::LocalMaps3D HalfFacetRep::lConnMap3D[4] = {
1608 : : // Tet
1609 : : { 4,
1610 : : 6,
1611 : : 4,
1612 : : { 3, 3, 3, 3 },
1613 : : { { 0, 1, 3 }, { 1, 2, 3 }, { 2, 0, 3 }, { 0, 2, 1 } },
1614 : : { 3, 3, 3, 3 },
1615 : : { { 0, 2, 3 }, { 0, 1, 3 }, { 1, 2, 3 }, { 0, 1, 2 } },
1616 : : { { 0, 1 }, { 1, 2 }, { 2, 0 }, { 0, 3 }, { 1, 3 }, { 2, 3 } },
1617 : : { { 3, 0 }, { 3, 1 }, { 3, 2 }, { 0, 2 }, { 0, 1 }, { 1, 2 } },
1618 : : { { 0, 4, 3 }, { 1, 5, 4 }, { 2, 3, 5 }, { 2, 1, 0 } },
1619 : : { { -1, 0, 2, 3 }, { 0, -1, 1, 4 }, { 2, 1, -1, 5 }, { 3, 4, 5, -1 } },
1620 : : { 3, 0, 1, 2 },
1621 : : { 0, 1 },
1622 : : { { 3, 1, 2, 3 }, { 2, 2, 3 }, { 1, 3 } } },
1623 : :
1624 : : // Pyramid: Note: In MOAB pyramid follows the CGNS convention. Look up src/MBCNArrays.hpp
1625 : : { 5,
1626 : : 8,
1627 : : 5,
1628 : : { 4, 3, 3, 3, 3 },
1629 : : { { 0, 3, 2, 1 }, { 0, 1, 4 }, { 1, 2, 4 }, { 2, 3, 4 }, { 3, 0, 4 } },
1630 : : { 3, 3, 3, 3, 4 },
1631 : : { { 0, 1, 4 }, { 0, 1, 2 }, { 0, 2, 3 }, { 0, 3, 4 }, { 1, 2, 3, 4 } },
1632 : : { { 0, 1 }, { 1, 2 }, { 2, 3 }, { 3, 0 }, { 0, 4 }, { 1, 4 }, { 2, 4 }, { 3, 4 } },
1633 : : { { 0, 1 }, { 0, 2 }, { 0, 3 }, { 0, 4 }, { 1, 4 }, { 1, 2 }, { 2, 3 }, { 3, 4 } },
1634 : : { { 3, 2, 1, 0 }, { 0, 5, 4 }, { 1, 6, 5 }, { 2, 7, 6 }, { 3, 4, 7 } },
1635 : : { { -1, 0, -1, 3, 4 }, { 0, -1, 1, -1, 5 }, { -1, 1, -1, 2, 6 }, { 3, -1, 2, -1, 7 }, { 4, 5, 6, 7, -1 } },
1636 : : { 3, 4, 2, 0 },
1637 : : { 0, 4 },
1638 : : { { 4, 0, 1, 2, 3 }, { 2, 1, 3 }, { 2, 1, 3 } } },
1639 : :
1640 : : // Prism
1641 : : { 6,
1642 : : 9,
1643 : : 5,
1644 : : { 4, 4, 4, 3, 3 },
1645 : : { { 0, 1, 4, 3 }, { 1, 2, 5, 4 }, { 0, 3, 5, 2 }, { 0, 2, 1 }, { 3, 4, 5 } },
1646 : : { 3, 3, 3, 3, 3, 3 },
1647 : : { { 0, 2, 3 }, { 0, 1, 3 }, { 1, 2, 3 }, { 0, 2, 4 }, { 0, 1, 4 }, { 1, 4, 2 } },
1648 : : { { 0, 1 }, { 1, 2 }, { 2, 0 }, { 0, 3 }, { 1, 4 }, { 2, 5 }, { 3, 4 }, { 4, 5 }, { 5, 3 } },
1649 : : { { 0, 3 }, { 1, 3 }, { 2, 3 }, { 0, 2 }, { 0, 1 }, { 1, 2 }, { 0, 4 }, { 1, 4 }, { 2, 4 } },
1650 : : { { 0, 4, 6, 3 }, { 1, 5, 7, 4 }, { 2, 3, 8, 5 }, { 2, 1, 0 }, { 6, 7, 8 } },
1651 : : { { -1, 0, 2, 3, -1, -1 },
1652 : : { 0, -1, 1, -1, 4, -1 },
1653 : : { 2, 1, -1, -1, -1, 5 },
1654 : : { 3, -1, -1, -1, 6, 8 },
1655 : : { -1, 4, -1, 6, -1, 7 },
1656 : : { -1, -1, 5, 8, 7, -1 } },
1657 : : { 4, 0, 5, 4, 1 },
1658 : : { 0, 5 },
1659 : : { { 3, 1, 2, 3 }, { 3, 2, 4, 3 }, { 2, 3, 1 }, { 1, 2 } } },
1660 : :
1661 : : // Hex
1662 : : { 8,
1663 : : 12,
1664 : : 6,
1665 : : { 4, 4, 4, 4, 4, 4 },
1666 : : { { 0, 1, 5, 4 }, { 1, 2, 6, 5 }, { 2, 3, 7, 6 }, { 3, 0, 4, 7 }, { 0, 3, 2, 1 }, { 4, 5, 6, 7 } },
1667 : : { 3, 3, 3, 3, 3, 3, 3, 3 },
1668 : : { { 0, 3, 4 }, { 0, 1, 4 }, { 1, 2, 4 }, { 2, 3, 4 }, { 0, 3, 5 }, { 0, 1, 5 }, { 1, 2, 5 }, { 2, 3, 5 } },
1669 : : { { 0, 1 },
1670 : : { 1, 2 },
1671 : : { 2, 3 },
1672 : : { 3, 0 },
1673 : : { 0, 4 },
1674 : : { 1, 5 },
1675 : : { 2, 6 },
1676 : : { 3, 7 },
1677 : : { 4, 5 },
1678 : : { 5, 6 },
1679 : : { 6, 7 },
1680 : : { 7, 4 } },
1681 : : { { 0, 4 },
1682 : : { 1, 4 },
1683 : : { 2, 4 },
1684 : : { 3, 4 },
1685 : : { 0, 3 },
1686 : : { 0, 1 },
1687 : : { 1, 2 },
1688 : : { 2, 3 },
1689 : : { 0, 5 },
1690 : : { 1, 5 },
1691 : : { 2, 5 },
1692 : : { 3, 5 } },
1693 : : { { 0, 5, 8, 4 }, { 1, 6, 9, 5 }, { 2, 7, 10, 6 }, { 3, 4, 11, 7 }, { 3, 2, 1, 0 }, { 8, 9, 10, 11 } },
1694 : : { { -1, 0, -1, 3, 4, -1, -1, -1 },
1695 : : { 0, -1, 1, -1, -1, 5, -1, -1 },
1696 : : { -1, 1, -1, 2, -1, -1, 6, -1 },
1697 : : { 3, -1, 2, -1, -1, -1, -1, 7 },
1698 : : { 4, -1, -1, -1, -1, 8, -1, 11 },
1699 : : { -1, 5, -1, -1, 8, -1, 9, -1 },
1700 : : { -1, -1, 6, -1, -1, 9, -1, 10 },
1701 : : { -1, -1, -1, 7, 11, -1, 10, -1 } },
1702 : : { 4, 0, 2, 5, 7 },
1703 : : { 0, 6 },
1704 : : { { 3, 1, 3, 4 }, { 3, 1, 3, 6 }, { 3, 1, 4, 6 }, { 3, 3, 6, 4 } } }
1705 : : };
1706 : :
1707 : : //////////////////////////////////////////////////////////////////////////////////
1708 : 7 : ErrorCode HalfFacetRep::determine_sibling_halffaces( Range& cells )
1709 : : {
1710 : : ErrorCode error;
1711 [ + - ][ + - ]: 7 : EntityHandle start_cell = *cells.begin();
1712 [ + - ]: 7 : EntityType ctype = mb->type_from_handle( start_cell );
1713 [ + - ]: 7 : int index = get_index_in_lmap( start_cell );
1714 : 7 : int nvpc = lConnMap3D[index].num_verts_in_cell;
1715 : 7 : int nfpc = lConnMap3D[index].num_faces_in_cell;
1716 : :
1717 : : // Step 1: Create an index list storing the starting position for each vertex
1718 [ + - ]: 7 : int nv = _verts.size();
1719 [ + - ]: 7 : std::vector< int > is_index( nv + 1 );
1720 [ + + ]: 149 : for( int i = 0; i < nv + 1; i++ )
1721 [ + - ]: 142 : is_index[i] = 0;
1722 : :
1723 : : int vindex;
1724 : :
1725 [ + - ][ + - ]: 57 : for( Range::iterator cid = cells.begin(); cid != cells.end(); ++cid )
[ + - ][ + - ]
[ + + ]
1726 : : {
1727 : : const EntityHandle* conn;
1728 [ + - ][ + - ]: 50 : error = mb->get_connectivity( *cid, conn, nvpc, true );MB_CHK_ERR( error );
[ - + ][ # # ]
[ # # ]
1729 : :
1730 [ + + ]: 332 : for( int i = 0; i < nfpc; ++i )
1731 : : {
1732 : 282 : int nvF = lConnMap3D[index].hf2v_num[i];
1733 : 282 : EntityHandle v = 0;
1734 [ + + ]: 1374 : for( int k = 0; k < nvF; k++ )
1735 : : {
1736 : 1092 : int id = lConnMap3D[index].hf2v[i][k];
1737 [ + + ]: 1092 : if( v <= conn[id] ) v = conn[id];
1738 : : }
1739 [ + - ]: 282 : vindex = _verts.index( v );
1740 [ + - ]: 282 : is_index[vindex + 1] += 1;
1741 : : }
1742 : : }
1743 [ + - ]: 7 : is_index[0] = 0;
1744 : :
1745 [ + + ]: 142 : for( int i = 0; i < nv; i++ )
1746 [ + - ][ + - ]: 135 : is_index[i + 1] = is_index[i] + is_index[i + 1];
[ + - ]
1747 : :
1748 : : // Step 2: Define four arrays v2hv_eid, v2hv_lvid storing every half-facet on a vertex
1749 [ + - ][ + - ]: 14 : std::vector< EntityHandle > v2oe_v1( is_index[nv] );
1750 [ + - ][ + - ]: 14 : std::vector< EntityHandle > v2oe_v2( is_index[nv] );
1751 [ + - ][ + - ]: 14 : std::vector< EntityHandle > v2hf_map_cid( is_index[nv] );
1752 [ + - ][ + - ]: 14 : std::vector< int > v2hf_map_lfid( is_index[nv] );
1753 : :
1754 [ + - ][ + - ]: 57 : for( Range::iterator cid = cells.begin(); cid != cells.end(); ++cid )
[ + - ][ + - ]
[ + + ]
1755 : : {
1756 : : const EntityHandle* conn;
1757 [ + - ][ + - ]: 50 : error = mb->get_connectivity( *cid, conn, nvpc, true );MB_CHK_ERR( error );
[ - + ][ # # ]
[ # # ]
1758 : :
1759 [ + + ]: 332 : for( int i = 0; i < nfpc; i++ )
1760 : : {
1761 : 282 : int nvF = lConnMap3D[index].hf2v_num[i];
1762 [ + - ]: 282 : std::vector< EntityHandle > vs( nvF );
1763 : 282 : EntityHandle vmax = 0;
1764 : 282 : int lv = -1;
1765 [ + + ]: 1374 : for( int k = 0; k < nvF; k++ )
1766 : : {
1767 : 1092 : int id = lConnMap3D[index].hf2v[i][k];
1768 [ + - ]: 1092 : vs[k] = conn[id];
1769 [ + + ]: 1092 : if( vmax <= conn[id] )
1770 : : {
1771 : 789 : vmax = conn[id];
1772 : 789 : lv = k;
1773 : : }
1774 : : }
1775 : :
1776 : 282 : int nidx = lConnMap2D[nvF - 3].next[lv];
1777 : 282 : int pidx = lConnMap2D[nvF - 3].prev[lv];
1778 : :
1779 [ + - ]: 282 : int v = _verts.index( vmax );
1780 [ + - ][ + - ]: 282 : v2oe_v1[is_index[v]] = vs[nidx];
[ + - ]
1781 [ + - ][ + - ]: 282 : v2oe_v2[is_index[v]] = vs[pidx];
[ + - ]
1782 [ + - ][ + - ]: 282 : v2hf_map_cid[is_index[v]] = *cid;
[ + - ]
1783 [ + - ][ + - ]: 282 : v2hf_map_lfid[is_index[v]] = i;
1784 [ + - ]: 282 : is_index[v] += 1;
1785 : 282 : }
1786 : : }
1787 : :
1788 [ + + ]: 135 : for( int i = nv - 2; i >= 0; i-- )
1789 [ + - ][ + - ]: 128 : is_index[i + 1] = is_index[i];
1790 [ + - ]: 7 : is_index[0] = 0;
1791 : :
1792 : : // Step 3: Fill up sibling half-verts map
1793 [ + - ][ + - ]: 57 : for( Range::iterator cid = cells.begin(); cid != cells.end(); ++cid )
[ + - ][ + - ]
[ + + ]
1794 : : {
1795 : : const EntityHandle* conn;
1796 [ + - ][ + - ]: 50 : error = mb->get_connectivity( *cid, conn, nvpc, true );MB_CHK_ERR( error );
[ - + ][ # # ]
[ # # ]
1797 : :
1798 [ + - ][ + - ]: 50 : int cidx = ID_FROM_HANDLE( *cid ) - 1;
1799 [ + + ]: 332 : for( int i = 0; i < nfpc; i++ )
1800 : : {
1801 [ + - ]: 282 : HFacet hf = sibhfs[nfpc * cidx + i];
1802 [ + - ]: 282 : EntityHandle sibcid = fid_from_halfacet( hf, ctype );
1803 : :
1804 [ + + ]: 282 : if( sibcid != 0 ) continue;
1805 : :
1806 : 202 : int nvF = lConnMap3D[index].hf2v_num[i];
1807 [ + - ]: 202 : std::vector< EntityHandle > vs( nvF );
1808 : 202 : EntityHandle vmax = 0;
1809 : 202 : int lv = -1;
1810 [ + + ]: 982 : for( int k = 0; k < nvF; k++ )
1811 : : {
1812 : 780 : int id = lConnMap3D[index].hf2v[i][k];
1813 [ + - ]: 780 : vs[k] = conn[id];
1814 [ + + ]: 780 : if( vmax <= conn[id] )
1815 : : {
1816 : 561 : vmax = conn[id];
1817 : 561 : lv = k;
1818 : : }
1819 : : }
1820 [ - + ][ # # ]: 202 : if( lv < 0 ) MB_SET_ERR( MB_FAILURE, "did not find local vertex " );
[ # # ][ # # ]
[ # # ][ # # ]
1821 : 202 : int nidx = lConnMap2D[nvF - 3].next[lv];
1822 : 202 : int pidx = lConnMap2D[nvF - 3].prev[lv];
1823 : :
1824 [ + - ]: 202 : int v = _verts.index( vmax );
1825 [ + - ]: 202 : EntityHandle v1 = vs[pidx];
1826 [ + - ]: 202 : EntityHandle v2 = vs[nidx];
1827 : :
1828 [ + - ][ + - ]: 1010 : for( int ind = is_index[v]; ind <= is_index[v + 1] - 1; ind++ )
[ + + ][ + - ]
1829 : : {
1830 [ + - ][ + + ]: 808 : if( ( v2oe_v1[ind] == v1 ) && ( v2oe_v2[ind] == v2 ) )
[ + - ][ + + ]
[ + + ]
1831 : : {
1832 : : // Map to opposite hf
1833 [ + - ]: 80 : EntityHandle cur_cid = v2hf_map_cid[ind];
1834 [ + - ]: 80 : int cur_lfid = v2hf_map_lfid[ind];
1835 : :
1836 [ + - ][ + - ]: 80 : sibhfs[nfpc * cidx + i] = create_halffacet( cur_cid, cur_lfid );
1837 : :
1838 [ + - ]: 80 : int scidx = ID_FROM_HANDLE( cur_cid ) - 1;
1839 [ + - ][ + - ]: 80 : sibhfs[nfpc * scidx + cur_lfid] = create_halffacet( *cid, i );
[ + - ]
1840 : : }
1841 : : }
1842 : 202 : }
1843 : : }
1844 : :
1845 : 14 : return MB_SUCCESS;
1846 : : }
1847 : :
1848 : 7 : ErrorCode HalfFacetRep::determine_incident_halffaces( Range& cells )
1849 : : {
1850 : : ErrorCode error;
1851 [ + - ][ + - ]: 7 : int index = get_index_in_lmap( *cells.begin() );
[ + - ]
1852 : 7 : int nvpc = lConnMap3D[index].num_verts_in_cell;
1853 : :
1854 [ + - ]: 7 : std::multimap< EntityHandle, EntityHandle > comps;
1855 : : HFacet nwhf;
1856 : :
1857 [ + - ][ + - ]: 57 : for( Range::iterator cid = cells.begin(); cid != cells.end(); ++cid )
[ + - ][ + - ]
[ + + ]
1858 : : {
1859 [ + - ]: 50 : EntityHandle cell = *cid;
1860 : : const EntityHandle* conn;
1861 [ + - ][ + - ]: 50 : error = mb->get_connectivity( *cid, conn, nvpc, true );MB_CHK_ERR( error );
[ - + ][ # # ]
[ # # ]
1862 : :
1863 [ + + ]: 414 : for( int i = 0; i < nvpc; ++i )
1864 : : {
1865 : 364 : EntityHandle v = conn[i];
1866 [ + - ]: 364 : int vidx = ID_FROM_HANDLE( v ) - 1;
1867 [ + - ]: 364 : HFacet hf = v2hf[vidx];
1868 : :
1869 [ + - ]: 364 : bool found = find_cell_in_component( v, cell, comps );
1870 : :
1871 [ + + ][ + - ]: 364 : if( hf == 0 && !found && ( v2hfs.empty() || ( v2hfs.find( v ) == v2hfs.end() ) ) )
[ - + ][ # # ]
[ # # ][ # # ]
[ - + ][ - + ]
[ + + # #
# # ]
1872 : : {
1873 : 135 : nwhf = 0;
1874 [ + - ][ - + ]: 135 : error = add_cells_of_single_component( v, cell, lConnMap3D[index].v2hf[i][0], comps, nwhf );MB_CHK_ERR( error );
[ # # ][ # # ]
1875 : :
1876 [ + - ]: 135 : v2hf[vidx] = nwhf;
1877 : : }
1878 [ + - ][ - + ]: 229 : else if( hf != 0 && !found )
1879 : : {
1880 : 0 : nwhf = 0;
1881 [ # # ][ # # ]: 0 : error = add_cells_of_single_component( v, cell, lConnMap3D[index].v2hf[i][0], comps, nwhf );MB_CHK_ERR( error );
[ # # ][ # # ]
1882 : :
1883 [ # # ][ # # ]: 0 : v2hfs.insert( std::pair< EntityHandle, HFacet >( v, hf ) );
1884 [ # # ][ # # ]: 0 : v2hfs.insert( std::pair< EntityHandle, HFacet >( v, nwhf ) );
1885 [ # # ]: 0 : v2hf[vidx] = 0;
1886 : : }
1887 [ - + ][ # # ]: 229 : else if( hf == 0 && !found && ( !v2hfs.empty() ) && ( v2hfs.find( v ) != v2hfs.end() ) )
[ # # ][ # # ]
[ # # ][ # # ]
[ - + ][ - + ]
[ - + # #
# # ]
1888 : : {
1889 : 0 : nwhf = 0;
1890 [ # # ][ # # ]: 0 : error = add_cells_of_single_component( v, cell, lConnMap3D[index].v2hf[i][0], comps, nwhf );MB_CHK_ERR( error );
[ # # ][ # # ]
1891 [ # # ][ # # ]: 0 : v2hfs.insert( std::pair< EntityHandle, HFacet >( v, nwhf ) );
1892 : : }
1893 : : }
1894 : : }
1895 : :
1896 : : // error = print_tags(3);
1897 : :
1898 : 7 : return MB_SUCCESS;
1899 : : }
1900 : :
1901 : 0 : ErrorCode HalfFacetRep::determine_border_vertices( Range& cells, Tag isborder )
1902 : : {
1903 : : ErrorCode error;
1904 [ # # ][ # # ]: 0 : EntityHandle start_cell = *cells.begin();
1905 [ # # ][ # # ]: 0 : EntityType ctype = mb->type_from_handle( *cells.begin() );
[ # # ]
1906 [ # # ]: 0 : int index = get_index_in_lmap( start_cell );
1907 : 0 : int nvpc = lConnMap3D[index].num_verts_in_cell;
1908 : 0 : int nfpc = lConnMap3D[index].num_faces_in_cell;
1909 : :
1910 : 0 : int val = 1;
1911 : :
1912 [ # # ][ # # ]: 0 : for( Range::iterator t = cells.begin(); t != cells.end(); ++t )
[ # # ][ # # ]
[ # # ]
1913 : : {
1914 : :
1915 : : const EntityHandle* conn;
1916 [ # # ][ # # ]: 0 : error = mb->get_connectivity( *t, conn, nvpc, true );MB_CHK_ERR( error );
[ # # ][ # # ]
[ # # ]
1917 : :
1918 [ # # ][ # # ]: 0 : int cidx = ID_FROM_HANDLE( *t ) - 1;
1919 [ # # ]: 0 : for( int i = 0; i < nfpc; ++i )
1920 : : {
1921 [ # # ]: 0 : HFacet hf = sibhfs[nfpc * cidx + i];
1922 [ # # ]: 0 : EntityHandle sib_cid = fid_from_halfacet( hf, ctype );
1923 : :
1924 [ # # ]: 0 : if( sib_cid == 0 )
1925 : : {
1926 : 0 : int nvF = lConnMap3D[index].hf2v_num[i];
1927 : :
1928 [ # # ]: 0 : for( int j = 0; j < nvF; ++j )
1929 : : {
1930 : 0 : int ind = lConnMap3D[index].hf2v[i][j];
1931 [ # # ][ # # ]: 0 : error = mb->tag_set_data( isborder, &conn[ind], 1, &val );MB_CHK_ERR( error );
[ # # ][ # # ]
1932 : : }
1933 : : }
1934 : : }
1935 : : }
1936 : :
1937 : 0 : return MB_SUCCESS;
1938 : : }
1939 : :
1940 : : /////////////////////////////////////////////////////////////////////////
1941 : 135 : ErrorCode HalfFacetRep::add_cells_of_single_component( EntityHandle vid, EntityHandle curcid, int curlid,
1942 : : std::multimap< EntityHandle, EntityHandle >& comps, HFacet& hf )
1943 : : {
1944 : : ErrorCode error;
1945 [ + - ]: 135 : EntityType ctype = mb->type_from_handle( curcid );
1946 [ + - ]: 135 : int index = get_index_in_lmap( curcid );
1947 : 135 : int nvpc = lConnMap3D[index].num_verts_in_cell;
1948 : 135 : int nfpc = lConnMap3D[index].num_faces_in_cell;
1949 : :
1950 : 135 : int Stksize = 0, count = -1;
1951 : 135 : Stkcells[0] = curcid;
1952 : :
1953 [ + - ]: 135 : hf = create_halffacet( curcid, curlid );
1954 : :
1955 : : EntityHandle cur_cid;
1956 [ + + ]: 582 : while( Stksize >= 0 )
1957 : : {
1958 : 447 : cur_cid = Stkcells[Stksize];
1959 : 447 : Stksize -= 1;
1960 : :
1961 [ + - ]: 447 : bool found = find_match_in_array( cur_cid, trackcells, count );
1962 [ + + ]: 447 : if( !found )
1963 : : {
1964 : 364 : count += 1;
1965 : 364 : trackcells[count] = cur_cid;
1966 : :
1967 : : // Add the current cell
1968 [ + - ][ + - ]: 364 : comps.insert( std::pair< EntityHandle, EntityHandle >( vid, cur_cid ) );
1969 : : }
1970 : :
1971 : : // Connectivity of the cell
1972 : : const EntityHandle* conn;
1973 [ + - ][ - + ]: 447 : error = mb->get_connectivity( cur_cid, conn, nvpc, true );MB_CHK_ERR( error );
[ # # ][ # # ]
1974 : :
1975 : : // Local id of vid in the cell and the half-faces incident on it
1976 : 447 : int lv = -1;
1977 [ + - ]: 2012 : for( int i = 0; i < nvpc; ++i )
1978 : : {
1979 [ + + ]: 2012 : if( conn[i] == vid )
1980 : : {
1981 : 447 : lv = i;
1982 : 447 : break;
1983 : : }
1984 : : }
1985 [ - + ][ # # ]: 447 : if( lv < 0 ) MB_SET_ERR( MB_FAILURE, "did not find local vertex " );
[ # # ][ # # ]
[ # # ][ # # ]
1986 : 447 : int nhf_thisv = lConnMap3D[index].v2hf_num[lv];
1987 [ + - ]: 447 : int cidx = ID_FROM_HANDLE( cur_cid ) - 1;
1988 : :
1989 : : // Add new cells into the stack
1990 : : EntityHandle ngb;
1991 : : HFacet hf_ngb;
1992 [ + + ]: 1788 : for( int i = 0; i < nhf_thisv; ++i )
1993 : : {
1994 : 1341 : int ind = lConnMap3D[index].v2hf[lv][i];
1995 [ + - ]: 1341 : hf_ngb = sibhfs[nfpc * cidx + ind];
1996 [ + - ]: 1341 : ngb = fid_from_halfacet( hf_ngb, ctype );
1997 : :
1998 [ + + ]: 1341 : if( ngb )
1999 : : {
2000 [ + - ]: 835 : bool found_ent = find_match_in_array( ngb, trackcells, count );
2001 : :
2002 [ + + ]: 835 : if( !found_ent )
2003 : : {
2004 : 312 : Stksize += 1;
2005 : 835 : Stkcells[Stksize] = ngb;
2006 : : }
2007 : : }
2008 : : else
2009 [ + - ]: 506 : hf = create_halffacet( cur_cid, ind );
2010 : : }
2011 : : }
2012 : :
2013 : : // Change the visited faces to false
2014 [ - + ]: 135 : for( int i = 0; i < Stksize; i++ )
2015 : 0 : Stkcells[i] = 0;
2016 : :
2017 [ + + ]: 499 : for( int i = 0; i <= count; i++ )
2018 : 364 : trackcells[i] = 0;
2019 : :
2020 : 135 : return MB_SUCCESS;
2021 : : }
2022 : :
2023 : 364 : bool HalfFacetRep::find_cell_in_component( EntityHandle vid, EntityHandle cell,
2024 : : std::multimap< EntityHandle, EntityHandle >& comps )
2025 : : {
2026 : 364 : bool found = false;
2027 : :
2028 [ + + ]: 364 : if( comps.empty() ) return found;
2029 : :
2030 : : std::pair< std::multimap< EntityHandle, EntityHandle >::iterator,
2031 : : std::multimap< EntityHandle, EntityHandle >::iterator >
2032 [ + - ]: 357 : rit;
2033 : :
2034 [ + - ]: 357 : rit = comps.equal_range( vid );
2035 : :
2036 [ + - ][ + - ]: 889 : for( std::multimap< EntityHandle, EntityHandle >::iterator it = rit.first; it != rit.second; ++it )
[ + + ]
2037 : : {
2038 [ + - ][ + + ]: 761 : if( it->second == cell )
2039 : : {
2040 : 229 : found = true;
2041 : 229 : break;
2042 : : }
2043 : : }
2044 : :
2045 : 364 : return found;
2046 : : }
2047 : :
2048 : : ////////////////////////////////////////////////////////////////////////
2049 : 27515 : ErrorCode HalfFacetRep::get_up_adjacencies_vert_3d( EntityHandle vid, std::vector< EntityHandle >& adjents )
2050 : : {
2051 : : ErrorCode error;
2052 [ + - ]: 27515 : adjents.reserve( 20 );
2053 [ + - ][ + - ]: 27515 : EntityType ctype = mb->type_from_handle( *_cells.begin() );
[ + - ]
2054 : :
2055 : : // Obtain a half-face/s incident on v
2056 [ + - ]: 27515 : int vidx = ID_FROM_HANDLE( vid ) - 1;
2057 [ + - ]: 27515 : HFacet hf = v2hf[vidx];
2058 : :
2059 [ + - ]: 27515 : std::vector< EntityHandle > start_cells;
2060 [ - + ][ # # ]: 27515 : if( hf == 0 && ( v2hfs.find( vid ) != v2hfs.end() ) ) // Vertex is non-manifold
[ # # ][ # # ]
[ - + ][ - + ]
[ - + # #
# # ]
2061 : : {
2062 : : std::pair< std::multimap< EntityHandle, HFacet >::iterator, std::multimap< EntityHandle, HFacet >::iterator >
2063 [ # # ]: 0 : it_hes;
2064 [ # # ]: 0 : it_hes = v2hfs.equal_range( vid );
2065 : :
2066 [ # # ][ # # ]: 0 : for( std::multimap< EntityHandle, HFacet >::iterator it = it_hes.first; it != it_hes.second; ++it )
[ # # ]
2067 : : {
2068 [ # # ][ # # ]: 0 : start_cells.push_back( fid_from_halfacet( it->second, ctype ) );
[ # # ]
2069 : : }
2070 : : }
2071 [ + - ]: 27515 : else if( hf != 0 )
2072 [ + - ][ + - ]: 27515 : start_cells.push_back( fid_from_halfacet( hf, ctype ) );
2073 : :
2074 [ - + ]: 27515 : if( start_cells.empty() ) return MB_SUCCESS;
2075 : :
2076 [ + - ][ + - ]: 27515 : int index = get_index_in_lmap( start_cells[0] );
2077 : 27515 : int nvpc = lConnMap3D[index].num_verts_in_cell;
2078 : 27515 : int nfpc = lConnMap3D[index].num_faces_in_cell;
2079 : :
2080 [ + + ]: 55030 : for( int i = 0; i < (int)start_cells.size(); i++ )
2081 [ + - ]: 27515 : cellq[i] = start_cells[i];
2082 : :
2083 : 27515 : int qsize = start_cells.size();
2084 : : EntityHandle cur_cid;
2085 : 27515 : int num_qvals = 0;
2086 : :
2087 [ + + ]: 265851 : while( num_qvals < qsize )
2088 : : {
2089 : 238336 : cur_cid = cellq[num_qvals];
2090 : 238336 : num_qvals += 1;
2091 : :
2092 : : // Add the current cell to output adj vector
2093 [ + - ]: 238336 : adjents.push_back( cur_cid );
2094 : :
2095 : : // Connectivity of the cell
2096 : : const EntityHandle* conn;
2097 [ + - ][ - + ]: 238336 : error = mb->get_connectivity( cur_cid, conn, nvpc, true );MB_CHK_ERR( error );
[ # # ][ # # ]
2098 : :
2099 : : // Local id of vid in the cell and the half-faces incident on it
2100 : 238336 : int lv = -1;
2101 [ + - ]: 913792 : for( int i = 0; i < nvpc; ++i )
2102 : : {
2103 [ + + ]: 913792 : if( conn[i] == vid )
2104 : : {
2105 : 238336 : lv = i;
2106 : 238336 : break;
2107 : : }
2108 : : };
2109 [ - + ][ # # ]: 238336 : if( lv < 0 ) MB_SET_ERR( MB_FAILURE, "did not find local vertex " );
[ # # ][ # # ]
[ # # ][ # # ]
2110 : : // Number of local half-faces incident on the current vertex
2111 : 238336 : int nhf_thisv = lConnMap3D[index].v2hf_num[lv];
2112 [ + - ]: 238336 : int cidx = ID_FROM_HANDLE( cur_cid ) - 1;
2113 : :
2114 : : // Add new cells into the stack
2115 : : EntityHandle ngb;
2116 [ + + ]: 953344 : for( int i = 0; i < nhf_thisv; ++i )
2117 : : {
2118 : 715008 : int ind = lConnMap3D[index].v2hf[lv][i];
2119 [ + - ]: 715008 : hf = sibhfs[nfpc * cidx + ind];
2120 [ + - ]: 715008 : ngb = fid_from_halfacet( hf, ctype );
2121 : :
2122 [ + + ]: 715008 : if( ngb )
2123 : : {
2124 [ + - ]: 679872 : bool found_ent = find_match_in_array( ngb, cellq, qsize - 1 );
2125 : :
2126 [ + + ]: 679872 : if( !found_ent )
2127 : : {
2128 : 210821 : cellq[qsize] = ngb;
2129 : 679872 : qsize += 1;
2130 : : }
2131 : : }
2132 : : }
2133 : : }
2134 : :
2135 : : // Change the visited faces to false
2136 [ + + ]: 265851 : for( int i = 0; i < qsize; i++ )
2137 : 238336 : cellq[i] = 0;
2138 : :
2139 : 27515 : return MB_SUCCESS;
2140 : : }
2141 : :
2142 : 170 : ErrorCode HalfFacetRep::get_up_adjacencies_edg_3d( EntityHandle eid, std::vector< EntityHandle >& adjents,
2143 : : std::vector< int >* leids )
2144 : : {
2145 : : ErrorCode error;
2146 [ + - ][ + - ]: 170 : EntityType ctype = mb->type_from_handle( *_cells.begin() );
[ + - ]
2147 [ + - ][ + - ]: 170 : EntityHandle start_cell = *_cells.begin();
2148 [ + - ]: 170 : int index = get_index_in_lmap( start_cell );
2149 : 170 : int nvpc = lConnMap3D[index].num_verts_in_cell;
2150 : 170 : int nfpc = lConnMap3D[index].num_faces_in_cell;
2151 : :
2152 [ + - ]: 170 : adjents.reserve( 20 );
2153 [ - + ][ # # ]: 170 : if( leids != NULL ) leids->reserve( 20 );
2154 : :
2155 : : // Find the edge vertices
2156 : : const EntityHandle* econn;
2157 : 170 : int num_conn = 0;
2158 [ + - ][ - + ]: 170 : error = mb->get_connectivity( eid, econn, num_conn, true );MB_CHK_ERR( error );
[ # # ][ # # ]
2159 : :
2160 : 170 : EntityHandle v_start = econn[0], v_end = econn[1];
2161 [ + - ]: 170 : int v1idx = ID_FROM_HANDLE( v_start ) - 1;
2162 [ + - ]: 170 : int v2idx = ID_FROM_HANDLE( v_end ) - 1;
2163 : :
2164 : : // Find an half-facets incident to each end vertex of the edge
2165 [ + - ]: 170 : std::vector< EntityHandle > start_cells;
2166 [ + - ]: 170 : HFacet hf1 = v2hf[v1idx];
2167 [ + - ]: 170 : HFacet hf2 = v2hf[v2idx];
2168 : :
2169 [ - + ][ # # ]: 170 : if( hf1 == 0 && !v2hfs.empty() )
[ - + ]
2170 : : {
2171 : : std::pair< std::multimap< EntityHandle, HFacet >::iterator, std::multimap< EntityHandle, HFacet >::iterator >
2172 [ # # ]: 0 : it_hes;
2173 [ # # ]: 0 : it_hes = v2hfs.equal_range( v_start );
2174 : :
2175 [ # # ][ # # ]: 0 : for( std::multimap< EntityHandle, HFacet >::iterator it = it_hes.first; it != it_hes.second; ++it )
[ # # ]
2176 : : {
2177 [ # # ][ # # ]: 0 : start_cells.push_back( fid_from_halfacet( it->second, ctype ) );
[ # # ]
2178 : : }
2179 : : }
2180 [ + - ]: 170 : else if( hf1 != 0 )
2181 : : {
2182 [ + - ][ + - ]: 170 : start_cells.push_back( fid_from_halfacet( hf1, ctype ) );
2183 : : }
2184 : :
2185 [ - + ][ # # ]: 170 : if( hf2 == 0 && !v2hfs.empty() )
[ - + ]
2186 : : {
2187 : : std::pair< std::multimap< EntityHandle, HFacet >::iterator, std::multimap< EntityHandle, HFacet >::iterator >
2188 [ # # ]: 0 : it_hes;
2189 [ # # ]: 0 : it_hes = v2hfs.equal_range( v_end );
2190 : :
2191 [ # # ][ # # ]: 0 : for( std::multimap< EntityHandle, HFacet >::iterator it = it_hes.first; it != it_hes.second; ++it )
[ # # ]
2192 : : {
2193 [ # # ][ # # ]: 0 : start_cells.push_back( fid_from_halfacet( it->second, ctype ) );
[ # # ]
2194 : : }
2195 : : }
2196 [ + - ]: 170 : else if( hf2 != 0 )
2197 : : {
2198 [ + - ][ + - ]: 170 : start_cells.push_back( fid_from_halfacet( hf2, ctype ) );
2199 : : }
2200 : :
2201 [ - + ]: 170 : if( start_cells.empty() ) return MB_SUCCESS;
2202 : :
2203 [ + - ]: 170 : std::sort( start_cells.begin(), start_cells.end() );
2204 [ + - ]: 170 : std::vector< EntityHandle >::iterator last = std::unique( start_cells.begin(), start_cells.end() );
2205 [ + - ]: 170 : start_cells.erase( last, start_cells.end() );
2206 : :
2207 [ + + ]: 488 : for( int i = 0; i < (int)start_cells.size(); i++ )
2208 [ + - ]: 318 : cellq[i] = start_cells[i];
2209 : :
2210 : 170 : int qsize = start_cells.size();
2211 : 170 : int num_qvals = 0;
2212 : :
2213 [ + + ]: 998 : while( num_qvals < qsize )
2214 : : {
2215 : 828 : EntityHandle cell_id = cellq[num_qvals];
2216 : 828 : num_qvals += 1;
2217 : :
2218 : : const EntityHandle* conn;
2219 [ + - ][ - + ]: 828 : error = mb->get_connectivity( cell_id, conn, nvpc, true );MB_CHK_ERR( error );
[ # # ][ # # ]
2220 : :
2221 : 828 : int lv0 = -1, lv1 = -1, lv = -1;
2222 : :
2223 : : // locate v_origin in poped out tet, check if v_end is in
2224 [ + + ]: 7452 : for( int i = 0; i < nvpc; i++ )
2225 : : {
2226 [ + + ]: 6624 : if( v_start == conn[i] )
2227 : : {
2228 : 596 : lv0 = i;
2229 : 596 : lv = lv0;
2230 : : }
2231 [ + + ]: 6028 : else if( v_end == conn[i] )
2232 : : {
2233 : 616 : lv1 = i;
2234 : 616 : lv = lv1;
2235 : : }
2236 : : }
2237 : :
2238 [ + + ][ + + ]: 828 : if( ( lv0 >= 0 ) && ( lv1 >= 0 ) )
2239 : : {
2240 [ + - ]: 384 : adjents.push_back( cell_id );
2241 [ - + ][ # # ]: 384 : if( leids != NULL ) leids->push_back( lConnMap3D[index].lookup_leids[lv0][lv1] );
2242 : : }
2243 : :
2244 : : // push back new found unchecked incident tets of v_start
2245 [ + - ]: 828 : int cidx = ID_FROM_HANDLE( cell_id ) - 1;
2246 [ - + ][ # # ]: 828 : if( lv < 0 ) MB_SET_ERR( MB_FAILURE, "did not find local vertex " );
[ # # ][ # # ]
[ # # ][ # # ]
2247 : 828 : int nhf_thisv = lConnMap3D[index].v2hf_num[lv];
2248 : :
2249 [ + + ]: 3312 : for( int i = 0; i < nhf_thisv; i++ )
2250 : : {
2251 : 2484 : int ind = lConnMap3D[index].v2hf[lv][i];
2252 [ + - ]: 2484 : HFacet hf = sibhfs[nfpc * cidx + ind];
2253 [ + - ]: 2484 : EntityHandle ngb = fid_from_halfacet( hf, ctype );
2254 : :
2255 [ + + ]: 2484 : if( ngb )
2256 : : {
2257 [ + - ]: 1842 : bool found_ent = find_match_in_array( ngb, &cellq[0], qsize - 1 );
2258 : :
2259 [ + + ]: 1842 : if( !found_ent )
2260 : : {
2261 : 510 : cellq[qsize] = ngb;
2262 : 1842 : qsize += 1;
2263 : : }
2264 : : }
2265 : : }
2266 : : }
2267 : :
2268 [ + + ]: 998 : for( int i = 0; i < qsize; i++ )
2269 : 828 : cellq[i] = 0;
2270 : :
2271 : 170 : return MB_SUCCESS;
2272 : : }
2273 : :
2274 : 55039 : ErrorCode HalfFacetRep::get_up_adjacencies_edg_3d( EntityHandle cid, int leid, std::vector< EntityHandle >& adjents,
2275 : : std::vector< int >* leids, std::vector< int >* adj_orients )
2276 : : {
2277 : : ErrorCode error;
2278 [ + - ]: 55039 : EntityType ctype = mb->type_from_handle( cid );
2279 [ + - ]: 55039 : int index = get_index_in_lmap( cid );
2280 : 55039 : int nvpc = lConnMap3D[index].num_verts_in_cell;
2281 : 55039 : int nfpc = lConnMap3D[index].num_faces_in_cell;
2282 : 55039 : adjents.clear();
2283 [ + - ]: 55039 : adjents.reserve( 20 );
2284 : :
2285 [ + - ]: 55039 : if( leids != NULL )
2286 : : {
2287 : 55039 : leids->clear();
2288 [ + - ]: 55039 : leids->reserve( 20 );
2289 : : }
2290 [ + + ]: 55039 : if( adj_orients != NULL )
2291 : : {
2292 : 42930 : adj_orients->clear();
2293 [ + - ]: 42930 : adj_orients->reserve( 20 );
2294 : : }
2295 : :
2296 : : const EntityHandle* econn;
2297 [ + - ][ - + ]: 55039 : error = mb->get_connectivity( cid, econn, nvpc, true );MB_CHK_ERR( error );
[ # # ][ # # ]
2298 : :
2299 : : // Get the end vertices of the edge <cid,leid>
2300 : 55039 : int id = lConnMap3D[index].e2v[leid][0];
2301 : 55039 : EntityHandle v_start = econn[id];
2302 : 55039 : id = lConnMap3D[index].e2v[leid][1];
2303 : 55039 : EntityHandle v_end = econn[id];
2304 : :
2305 [ + - ]: 55039 : int v1idx = ID_FROM_HANDLE( v_start ) - 1;
2306 [ + - ]: 55039 : int v2idx = ID_FROM_HANDLE( v_end ) - 1;
2307 : :
2308 : : // Find an half-facets incident to each end vertex of the edge
2309 [ + - ]: 55039 : std::vector< EntityHandle > start_cells;
2310 [ + - ]: 55039 : HFacet hf1 = v2hf[v1idx];
2311 [ + - ]: 55039 : HFacet hf2 = v2hf[v2idx];
2312 : :
2313 [ - + ][ # # ]: 55039 : if( hf1 == 0 && !v2hfs.empty() )
[ - + ]
2314 : : {
2315 : : std::pair< std::multimap< EntityHandle, HFacet >::iterator, std::multimap< EntityHandle, HFacet >::iterator >
2316 [ # # ]: 0 : it_hes;
2317 [ # # ]: 0 : it_hes = v2hfs.equal_range( v_start );
2318 : :
2319 [ # # ][ # # ]: 0 : for( std::multimap< EntityHandle, HFacet >::iterator it = it_hes.first; it != it_hes.second; ++it )
[ # # ]
2320 : : {
2321 [ # # ][ # # ]: 0 : start_cells.push_back( fid_from_halfacet( it->second, ctype ) );
[ # # ]
2322 : : }
2323 : : }
2324 [ + - ]: 55039 : else if( hf1 != 0 )
2325 : : {
2326 [ + - ][ + - ]: 55039 : start_cells.push_back( fid_from_halfacet( hf1, ctype ) );
2327 : : }
2328 : :
2329 [ - + ][ # # ]: 55039 : if( hf2 == 0 && !v2hfs.empty() )
[ - + ]
2330 : : {
2331 : : std::pair< std::multimap< EntityHandle, HFacet >::iterator, std::multimap< EntityHandle, HFacet >::iterator >
2332 [ # # ]: 0 : it_hes;
2333 [ # # ]: 0 : it_hes = v2hfs.equal_range( v_end );
2334 : :
2335 [ # # ][ # # ]: 0 : for( std::multimap< EntityHandle, HFacet >::iterator it = it_hes.first; it != it_hes.second; ++it )
[ # # ]
2336 : : {
2337 [ # # ][ # # ]: 0 : start_cells.push_back( fid_from_halfacet( it->second, ctype ) );
[ # # ]
2338 : : }
2339 : : }
2340 [ + - ]: 55039 : else if( hf2 != 0 )
2341 : : {
2342 [ + - ][ + - ]: 55039 : start_cells.push_back( fid_from_halfacet( hf2, ctype ) );
2343 : : }
2344 : :
2345 [ - + ]: 55039 : if( start_cells.empty() ) return MB_SUCCESS;
2346 : :
2347 [ + - ]: 55039 : std::sort( start_cells.begin(), start_cells.end() );
2348 [ + - ]: 55039 : std::vector< EntityHandle >::iterator last = std::unique( start_cells.begin(), start_cells.end() );
2349 [ + - ]: 55039 : start_cells.erase( last, start_cells.end() );
2350 : :
2351 [ + + ]: 154269 : for( int i = 0; i < (int)start_cells.size(); i++ )
2352 [ + - ]: 99230 : cellq[i] = start_cells[i];
2353 : :
2354 : 55039 : int qsize = start_cells.size();
2355 : 55039 : int num_qvals = 0;
2356 : :
2357 [ + + ]: 923209 : while( num_qvals < qsize )
2358 : : {
2359 : 868170 : EntityHandle cell_id = cellq[num_qvals];
2360 : 868170 : num_qvals += 1;
2361 : :
2362 : : const EntityHandle* conn;
2363 [ + - ][ - + ]: 868170 : error = mb->get_connectivity( cell_id, conn, nvpc, true );MB_CHK_ERR( error );
[ # # ][ # # ]
2364 : :
2365 : 868170 : int lv0 = -1, lv1 = -1, lv = -1;
2366 : :
2367 : : // locate v_origin in poped out tet, check if v_end is in
2368 [ + + ]: 5616434 : for( int i = 0; i < nvpc; i++ )
2369 : : {
2370 [ + + ]: 4748264 : if( v_start == conn[i] )
2371 : : {
2372 : 509974 : lv0 = i;
2373 : 509974 : lv = lv0;
2374 : : }
2375 [ + + ]: 4238290 : else if( v_end == conn[i] )
2376 : : {
2377 : 572086 : lv1 = i;
2378 : 572086 : lv = lv1;
2379 : : }
2380 : : }
2381 : :
2382 [ + + ][ + + ]: 868170 : if( ( lv0 >= 0 ) && ( lv1 >= 0 ) )
2383 : : {
2384 [ + - ]: 213890 : adjents.push_back( cell_id );
2385 [ + - ][ + - ]: 213890 : if( leids != NULL ) leids->push_back( lConnMap3D[index].lookup_leids[lv0][lv1] );
2386 : :
2387 [ + + ]: 213890 : if( adj_orients != NULL )
2388 : : {
2389 : 170960 : int cur_leid = lConnMap3D[index].lookup_leids[lv0][lv1];
2390 : 170960 : int id1 = lConnMap3D[index].e2v[cur_leid][0];
2391 : 170960 : int id2 = lConnMap3D[index].e2v[cur_leid][1];
2392 [ + + ][ + - ]: 170960 : if( ( v_start == conn[id1] ) && ( v_end == conn[id2] ) )
2393 [ + - ]: 114658 : adj_orients->push_back( 1 );
2394 [ + - ][ + - ]: 56302 : else if( ( v_start == conn[id2] ) && ( v_end == conn[id1] ) )
2395 [ + - ]: 213890 : adj_orients->push_back( 0 );
2396 : : }
2397 : : }
2398 [ - + ][ # # ]: 868170 : if( lv < 0 ) MB_SET_ERR( MB_FAILURE, "did not find local vertex " );
[ # # ][ # # ]
[ # # ][ # # ]
2399 : : // push back new found unchecked incident tets of v_start
2400 [ + - ]: 868170 : int cidx = ID_FROM_HANDLE( cell_id ) - 1;
2401 : 868170 : int nhf_thisv = lConnMap3D[index].v2hf_num[lv];
2402 : :
2403 [ + + ]: 3472680 : for( int i = 0; i < nhf_thisv; i++ )
2404 : : {
2405 : 2604510 : int ind = lConnMap3D[index].v2hf[lv][i];
2406 [ + - ]: 2604510 : HFacet hf = sibhfs[nfpc * cidx + ind];
2407 [ + - ]: 2604510 : EntityHandle ngb = fid_from_halfacet( hf, ctype );
2408 : :
2409 [ + + ]: 2604510 : if( ngb )
2410 : : {
2411 [ + - ]: 2492050 : bool found_ent = find_match_in_array( ngb, &cellq[0], qsize - 1 );
2412 : :
2413 [ + + ]: 2492050 : if( !found_ent )
2414 : : {
2415 : 768940 : cellq[qsize] = ngb;
2416 : 2492050 : qsize += 1;
2417 : : }
2418 : : }
2419 : : }
2420 : : }
2421 : :
2422 [ + + ]: 923209 : for( int i = 0; i < qsize; i++ )
2423 : 868170 : cellq[i] = 0;
2424 : :
2425 : 55039 : return MB_SUCCESS;
2426 : : }
2427 : :
2428 : 0 : ErrorCode HalfFacetRep::get_up_adjacencies_edg_3d_comp( EntityHandle cid, int leid,
2429 : : std::vector< EntityHandle >& adjents, std::vector< int >* leids,
2430 : : std::vector< int >* adj_orients )
2431 : : {
2432 : : ErrorCode error;
2433 [ # # ]: 0 : EntityType ctype = mb->type_from_handle( cid );
2434 [ # # ]: 0 : int index = get_index_in_lmap( cid );
2435 : 0 : int nvpc = lConnMap3D[index].num_verts_in_cell;
2436 : 0 : int nfpc = lConnMap3D[index].num_faces_in_cell;
2437 : 0 : adjents.clear();
2438 [ # # ]: 0 : adjents.reserve( 20 );
2439 : :
2440 [ # # ]: 0 : if( leids != NULL )
2441 : : {
2442 : 0 : leids->clear();
2443 [ # # ]: 0 : leids->reserve( 20 );
2444 : : }
2445 [ # # ]: 0 : if( adj_orients != NULL )
2446 : : {
2447 : 0 : adj_orients->clear();
2448 [ # # ]: 0 : adj_orients->reserve( 20 );
2449 : : }
2450 : :
2451 : : const EntityHandle* econn;
2452 [ # # ][ # # ]: 0 : error = mb->get_connectivity( cid, econn, nvpc );MB_CHK_ERR( error );
[ # # ][ # # ]
2453 : :
2454 : : // Get the end vertices of the edge <cid,leid>
2455 : 0 : int id = lConnMap3D[index].e2v[leid][0];
2456 : 0 : EntityHandle v_start = econn[id];
2457 : 0 : id = lConnMap3D[index].e2v[leid][1];
2458 : 0 : EntityHandle v_end = econn[id];
2459 : :
2460 [ # # ]: 0 : int v1idx = ID_FROM_HANDLE( v_start ) - 1;
2461 [ # # ]: 0 : int v2idx = ID_FROM_HANDLE( v_end ) - 1;
2462 : :
2463 : : // Find an half-facets incident to each end vertex of the edge
2464 [ # # ]: 0 : std::vector< EntityHandle > start_cells;
2465 [ # # ]: 0 : HFacet hf1 = v2hf[v1idx];
2466 [ # # ]: 0 : HFacet hf2 = v2hf[v2idx];
2467 : :
2468 [ # # ][ # # ]: 0 : if( ( hf1 == 0 ) && ( v2hfs.find( v_start ) != v2hfs.end() ) && ( hf2 == 0 ) &&
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # # #
# # ]
2469 [ # # ][ # # ]: 0 : ( v2hfs.find( v_end ) != v2hfs.end() ) )
[ # # ][ # # ]
[ # # # # ]
2470 : : {
2471 : : std::pair< std::multimap< EntityHandle, HFacet >::iterator, std::multimap< EntityHandle, HFacet >::iterator >
2472 [ # # ]: 0 : it_hes;
2473 [ # # ]: 0 : it_hes = v2hfs.equal_range( v_start );
2474 : :
2475 [ # # ][ # # ]: 0 : for( std::multimap< EntityHandle, HFacet >::iterator it = it_hes.first; it != it_hes.second; ++it )
[ # # ]
2476 : : {
2477 [ # # ][ # # ]: 0 : start_cells.push_back( fid_from_halfacet( it->second, ctype ) );
[ # # ]
2478 : : }
2479 : : }
2480 : : else
2481 : 0 : return MB_SUCCESS;
2482 : :
2483 [ # # ]: 0 : if( start_cells.empty() ) return MB_SUCCESS;
2484 : :
2485 : : // std::sort(start_cells.begin(), start_cells.end());
2486 : : // std::vector<EntityHandle>::iterator last = std::unique(start_cells.begin(),
2487 : : // start_cells.end()); start_cells.erase(last, start_cells.end());
2488 : :
2489 [ # # ]: 0 : for( int c = 0; c < (int)start_cells.size(); c++ )
2490 : : {
2491 [ # # ]: 0 : cellq[0] = start_cells[c];
2492 : :
2493 : 0 : int qsize = 1;
2494 : 0 : int num_qvals = 0;
2495 : :
2496 [ # # ]: 0 : while( num_qvals < qsize )
2497 : : {
2498 : 0 : EntityHandle cell_id = cellq[num_qvals];
2499 : 0 : num_qvals += 1;
2500 : :
2501 : : const EntityHandle* conn;
2502 [ # # ][ # # ]: 0 : error = mb->get_connectivity( cell_id, conn, nvpc );MB_CHK_ERR( error );
[ # # ][ # # ]
2503 : :
2504 : 0 : int lv0 = -1, lv1 = -1, lv = -1;
2505 : :
2506 : : // locate v_origin in poped out tet, check if v_end is in
2507 [ # # ]: 0 : for( int i = 0; i < nvpc; i++ )
2508 : : {
2509 [ # # ]: 0 : if( v_start == conn[i] )
2510 : : {
2511 : 0 : lv0 = i;
2512 : 0 : lv = lv0;
2513 : : }
2514 [ # # ]: 0 : else if( v_end == conn[i] )
2515 : : {
2516 : 0 : lv1 = i;
2517 : 0 : lv = lv1;
2518 : : }
2519 : : }
2520 : :
2521 [ # # ][ # # ]: 0 : if( ( lv0 >= 0 ) && ( lv1 >= 0 ) )
2522 : : {
2523 [ # # ]: 0 : adjents.push_back( cell_id );
2524 [ # # ][ # # ]: 0 : if( leids != NULL ) leids->push_back( lConnMap3D[index].lookup_leids[lv0][lv1] );
2525 : :
2526 [ # # ]: 0 : if( adj_orients != NULL )
2527 : : {
2528 : 0 : int cur_leid = lConnMap3D[index].lookup_leids[lv0][lv1];
2529 : 0 : int id1 = lConnMap3D[index].e2v[cur_leid][0];
2530 : 0 : int id2 = lConnMap3D[index].e2v[cur_leid][1];
2531 [ # # ][ # # ]: 0 : if( ( v_start == conn[id1] ) && ( v_end == conn[id2] ) )
2532 [ # # ]: 0 : adj_orients->push_back( 1 );
2533 [ # # ][ # # ]: 0 : else if( ( v_start == conn[id2] ) && ( v_end == conn[id1] ) )
2534 [ # # ]: 0 : adj_orients->push_back( 0 );
2535 : : }
2536 : :
2537 [ # # ]: 0 : for( int i = 0; i < qsize; i++ )
2538 : 0 : cellq[i] = 0;
2539 : :
2540 : 0 : break;
2541 : : }
2542 : :
2543 : : // push back new found unchecked incident tets of v_start
2544 [ # # ]: 0 : int cidx = ID_FROM_HANDLE( cell_id ) - 1;
2545 : 0 : int nhf_thisv = lConnMap3D[index].v2hf_num[lv];
2546 : :
2547 [ # # ]: 0 : for( int i = 0; i < nhf_thisv; i++ )
2548 : : {
2549 : 0 : int ind = lConnMap3D[index].v2hf[lv][i];
2550 [ # # ]: 0 : HFacet hf = sibhfs[nfpc * cidx + ind];
2551 [ # # ]: 0 : EntityHandle ngb = fid_from_halfacet( hf, ctype );
2552 : :
2553 [ # # ]: 0 : if( ngb )
2554 : : {
2555 [ # # ]: 0 : bool found_ent = find_match_in_array( ngb, &cellq[0], qsize - 1 );
2556 : :
2557 [ # # ]: 0 : if( !found_ent )
2558 : : {
2559 : 0 : cellq[qsize] = ngb;
2560 : 0 : qsize += 1;
2561 : : }
2562 : : }
2563 : : }
2564 : : }
2565 : :
2566 [ # # ]: 0 : for( int i = 0; i < qsize; i++ )
2567 : 0 : cellq[i] = 0;
2568 : : }
2569 : :
2570 : 0 : return MB_SUCCESS;
2571 : : }
2572 : :
2573 : 128 : ErrorCode HalfFacetRep::get_up_adjacencies_face_3d( EntityHandle fid, std::vector< EntityHandle >& adjents,
2574 : : std::vector< int >* lfids )
2575 : : {
2576 : : ErrorCode error;
2577 : :
2578 : 128 : EntityHandle cid = 0;
2579 : 128 : int lid = 0;
2580 [ + - ]: 128 : bool found = find_matching_halfface( fid, &cid, &lid );
2581 : :
2582 [ + - ]: 128 : if( found )
2583 : : {
2584 [ + - ][ - + ]: 128 : error = get_up_adjacencies_face_3d( cid, lid, adjents, lfids );MB_CHK_ERR( error );
[ # # ][ # # ]
2585 : : }
2586 : :
2587 : 128 : return MB_SUCCESS;
2588 : : }
2589 : :
2590 : 27628 : ErrorCode HalfFacetRep::get_up_adjacencies_face_3d( EntityHandle cid, int lfid, std::vector< EntityHandle >& adjents,
2591 : : std::vector< int >* lfids )
2592 : : {
2593 : :
2594 [ + - ][ + - ]: 27628 : EntityHandle start_cell = *_cells.begin();
2595 [ + - ]: 27628 : EntityType ctype = mb->type_from_handle( start_cell );
2596 [ + - ]: 27628 : int index = get_index_in_lmap( start_cell );
2597 : 27628 : int nfpc = lConnMap3D[index].num_faces_in_cell;
2598 : :
2599 [ + - ]: 27628 : adjents.reserve( 4 );
2600 [ + - ]: 27628 : adjents.push_back( cid );
2601 : :
2602 [ + + ]: 27628 : if( lfids != NULL )
2603 : : {
2604 [ + - ]: 27500 : lfids->reserve( 4 );
2605 [ + - ]: 27500 : lfids->push_back( lfid );
2606 : : }
2607 : :
2608 [ + - ]: 27628 : int cidx = ID_FROM_HANDLE( cid ) - 1;
2609 [ + - ]: 27628 : HFacet hf = sibhfs[nfpc * cidx + lfid];
2610 [ + - ]: 27628 : EntityHandle sibcid = fid_from_halfacet( hf, ctype );
2611 [ + - ]: 27628 : int siblid = lid_from_halffacet( hf );
2612 : :
2613 [ + + ]: 27628 : if( sibcid != 0 )
2614 : : {
2615 [ + - ]: 23836 : adjents.push_back( sibcid );
2616 [ + + ][ + - ]: 23836 : if( lfids != NULL ) lfids->push_back( siblid );
2617 : : }
2618 : :
2619 : 27628 : return MB_SUCCESS;
2620 : : }
2621 : :
2622 : 0 : bool HalfFacetRep::find_matching_implicit_edge_in_cell( EntityHandle eid, std::vector< EntityHandle >& cid,
2623 : : std::vector< int >& leid )
2624 : : {
2625 : : ErrorCode error;
2626 [ # # ][ # # ]: 0 : EntityType ctype = mb->type_from_handle( *_cells.begin() );
[ # # ]
2627 [ # # ][ # # ]: 0 : EntityHandle start_cell = *_cells.begin();
2628 [ # # ]: 0 : int index = get_index_in_lmap( start_cell );
2629 : 0 : int nvpc = lConnMap3D[index].num_verts_in_cell;
2630 : 0 : int nfpc = lConnMap3D[index].num_faces_in_cell;
2631 : :
2632 : : // Find the edge vertices
2633 : : const EntityHandle* econn;
2634 : 0 : int num_conn = 0;
2635 [ # # ][ # # ]: 0 : error = mb->get_connectivity( eid, econn, num_conn, true );MB_CHK_ERR( error );
[ # # ][ # # ]
2636 : :
2637 : 0 : EntityHandle v_start = econn[0], v_end = econn[1];
2638 [ # # ]: 0 : int v1idx = ID_FROM_HANDLE( v_start ) - 1;
2639 [ # # ]: 0 : int v2idx = ID_FROM_HANDLE( v_end ) - 1;
2640 : :
2641 : : // Find an incident cell to v_start
2642 [ # # ]: 0 : std::vector< EntityHandle > start_cells;
2643 [ # # ]: 0 : HFacet hf1 = v2hf[v1idx];
2644 [ # # ]: 0 : HFacet hf2 = v2hf[v2idx];
2645 : :
2646 : 0 : int ncomps1 = 0, ncomps2 = 0, ncomp;
2647 [ # # ][ # # ]: 0 : if( hf1 == 0 && !v2hfs.empty() )
[ # # ]
2648 : : {
2649 : : std::pair< std::multimap< EntityHandle, HFacet >::iterator, std::multimap< EntityHandle, HFacet >::iterator >
2650 [ # # ]: 0 : it_hes;
2651 [ # # ]: 0 : it_hes = v2hfs.equal_range( v_start );
2652 : :
2653 [ # # ][ # # ]: 0 : for( std::multimap< EntityHandle, HFacet >::iterator it = it_hes.first; it != it_hes.second; ++it )
[ # # ]
2654 : : {
2655 [ # # ][ # # ]: 0 : start_cells.push_back( fid_from_halfacet( it->second, ctype ) );
[ # # ]
2656 : 0 : ncomps1 += 1;
2657 : : }
2658 : : }
2659 [ # # ]: 0 : else if( hf1 != 0 )
2660 : : {
2661 [ # # ][ # # ]: 0 : start_cells.push_back( fid_from_halfacet( hf1, ctype ) );
2662 : 0 : ncomps1 += 1;
2663 : : }
2664 : :
2665 [ # # ][ # # ]: 0 : if( hf2 == 0 && !v2hfs.empty() )
[ # # ]
2666 : : {
2667 : : std::pair< std::multimap< EntityHandle, HFacet >::iterator, std::multimap< EntityHandle, HFacet >::iterator >
2668 [ # # ]: 0 : it_hes;
2669 [ # # ]: 0 : it_hes = v2hfs.equal_range( v_end );
2670 : :
2671 [ # # ][ # # ]: 0 : for( std::multimap< EntityHandle, HFacet >::iterator it = it_hes.first; it != it_hes.second; ++it )
[ # # ]
2672 : : {
2673 [ # # ][ # # ]: 0 : start_cells.push_back( fid_from_halfacet( it->second, ctype ) );
[ # # ]
2674 : 0 : ncomps2 += 1;
2675 : : }
2676 : : }
2677 [ # # ]: 0 : else if( hf2 != 0 )
2678 : : {
2679 [ # # ][ # # ]: 0 : start_cells.push_back( fid_from_halfacet( hf2, ctype ) );
2680 : 0 : ncomps2 += 1;
2681 : : }
2682 : :
2683 [ # # ]: 0 : ncomp = std::min( ncomps1, ncomps2 );
2684 : :
2685 : 0 : bool found = false;
2686 [ # # ]: 0 : if( start_cells.empty() ) return found;
2687 : :
2688 [ # # ]: 0 : for( int i = 0; i < (int)start_cells.size(); i++ )
2689 [ # # ]: 0 : cellq[i] = start_cells[i];
2690 : :
2691 : 0 : int qsize = start_cells.size();
2692 : 0 : int num_qvals = 0;
2693 : :
2694 [ # # ]: 0 : while( num_qvals < qsize )
2695 : : {
2696 : 0 : EntityHandle cell_id = cellq[num_qvals];
2697 : 0 : num_qvals += 1;
2698 : :
2699 : : const EntityHandle* conn;
2700 [ # # ][ # # ]: 0 : error = mb->get_connectivity( cell_id, conn, nvpc, true );MB_CHK_ERR( error );
[ # # ][ # # ]
2701 : :
2702 : 0 : int lv0 = -1, lv1 = -1, lv = -1;
2703 : :
2704 : : // locate v_origin in poped out tet, check if v_end is in
2705 [ # # ]: 0 : for( int i = 0; i < nvpc; i++ )
2706 : : {
2707 [ # # ]: 0 : if( v_start == conn[i] )
2708 : : {
2709 : 0 : lv0 = i;
2710 : 0 : lv = lv0;
2711 : : }
2712 [ # # ]: 0 : else if( v_end == conn[i] )
2713 : : {
2714 : 0 : lv1 = i;
2715 : 0 : lv = lv1;
2716 : : }
2717 : : }
2718 : :
2719 [ # # ][ # # ]: 0 : if( ( lv0 >= 0 ) && ( lv1 >= 0 ) )
2720 : : {
2721 : 0 : found = true;
2722 [ # # ]: 0 : cid.push_back( cell_id );
2723 [ # # ]: 0 : leid.push_back( lConnMap3D[index].lookup_leids[lv0][lv1] );
2724 : :
2725 [ # # ]: 0 : if( (int)cid.size() == ncomp ) break;
2726 : : }
2727 : :
2728 : : // push back new found unchecked incident tets of v_start
2729 [ # # ]: 0 : int cidx = ID_FROM_HANDLE( cell_id ) - 1;
2730 : 0 : int nhf_thisv = lConnMap3D[index].v2hf_num[lv];
2731 [ # # ][ # # ]: 0 : if( lv < 0 ) MB_SET_ERR( MB_FAILURE, "did not find local vertex " );
[ # # ][ # # ]
[ # # ][ # # ]
2732 [ # # ]: 0 : for( int i = 0; i < nhf_thisv; i++ )
2733 : : {
2734 : 0 : int ind = lConnMap3D[index].v2hf[lv][i];
2735 [ # # ]: 0 : HFacet hf = sibhfs[nfpc * cidx + ind];
2736 [ # # ]: 0 : EntityHandle ngb = fid_from_halfacet( hf, ctype );
2737 : :
2738 [ # # ]: 0 : if( ngb )
2739 : : {
2740 [ # # ]: 0 : bool found_ent = find_match_in_array( ngb, &cellq[0], qsize - 1 );
2741 : :
2742 [ # # ]: 0 : if( !found_ent )
2743 : : {
2744 : 0 : cellq[qsize] = ngb;
2745 : 0 : qsize += 1;
2746 : : }
2747 : : }
2748 : : }
2749 : : }
2750 : :
2751 [ # # ]: 0 : for( int i = 0; i < qsize; i++ )
2752 : 0 : cellq[i] = 0;
2753 : :
2754 : 0 : return found;
2755 : : }
2756 : :
2757 : 128 : bool HalfFacetRep::find_matching_halfface( EntityHandle fid, EntityHandle* cid, int* lid )
2758 : : {
2759 : : ErrorCode error;
2760 [ + - ][ + - ]: 128 : EntityHandle start_cell = *_cells.begin();
2761 [ + - ]: 128 : EntityType ctype = mb->type_from_handle( start_cell );
2762 [ + - ]: 128 : int index = get_index_in_lmap( start_cell );
2763 : 128 : int nvpc = lConnMap3D[index].num_verts_in_cell;
2764 : 128 : int nfpc = lConnMap3D[index].num_faces_in_cell;
2765 [ + - ]: 128 : EntityType ftype = mb->type_from_handle( fid );
2766 : 128 : int nvF = lConnMap2D[ftype - 2].num_verts_in_face;
2767 : :
2768 : : const EntityHandle* fid_verts;
2769 [ + - ][ - + ]: 128 : error = mb->get_connectivity( fid, fid_verts, nvF, true );MB_CHK_ERR( error );
[ # # ][ # # ]
2770 : :
2771 [ + - ]: 128 : std::vector< EntityHandle > start_cells;
2772 : 128 : int vidx, locfv0 = -1;
2773 : 128 : HFacet hf = 0;
2774 : :
2775 [ + - ]: 128 : for( int i = 0; i < nvF; i++ )
2776 : : {
2777 [ + - ]: 128 : vidx = ID_FROM_HANDLE( fid_verts[i] ) - 1;
2778 [ + - ]: 128 : hf = v2hf[vidx];
2779 [ + - ]: 128 : if( hf != 0 )
2780 : : {
2781 [ + - ][ + - ]: 128 : start_cells.push_back( fid_from_halfacet( hf, ctype ) );
2782 : 128 : locfv0 = i;
2783 : 128 : break;
2784 : : }
2785 [ # # ][ # # ]: 0 : else if( hf == 0 && v2hfs.find( fid_verts[i] ) != v2hfs.end() )
[ # # ][ # # ]
[ # # ][ # # ]
[ # # # #
# # ]
2786 : : {
2787 : : std::pair< std::multimap< EntityHandle, HFacet >::iterator,
2788 : : std::multimap< EntityHandle, HFacet >::iterator >
2789 [ # # ]: 0 : it_hfs;
2790 [ # # ]: 0 : it_hfs = v2hfs.equal_range( fid_verts[i] );
2791 : :
2792 [ # # ][ # # ]: 0 : for( std::multimap< EntityHandle, HFacet >::iterator it = it_hfs.first; it != it_hfs.second; ++it )
[ # # ]
2793 : : {
2794 [ # # ][ # # ]: 0 : start_cells.push_back( fid_from_halfacet( it->second, ctype ) );
[ # # ]
2795 : : }
2796 : 0 : locfv0 = i;
2797 : 0 : break;
2798 : : }
2799 : : }
2800 : :
2801 [ - + ]: 128 : if( start_cells.empty() ) return false;
2802 : :
2803 : : EntityHandle cur_cid;
2804 : 128 : bool found = false;
2805 : :
2806 : 128 : int Stksize = 0, count = -1;
2807 : :
2808 [ + + ]: 256 : for( int i = 0; i < (int)start_cells.size(); i++ )
2809 [ + - ]: 128 : Stkcells[i] = start_cells[i];
2810 : :
2811 : 128 : Stksize = start_cells.size() - 1;
2812 : :
2813 [ + - ]: 270 : while( Stksize >= 0 )
2814 : : {
2815 : 270 : cur_cid = Stkcells[Stksize];
2816 : 270 : Stksize -= 1;
2817 : 270 : count += 1;
2818 : 270 : trackcells[count] = cur_cid;
2819 : :
2820 : : const EntityHandle* conn;
2821 [ + - ][ - + ]: 270 : error = mb->get_connectivity( cur_cid, conn, nvpc, true );MB_CHK_ERR( error );
[ # # ][ # # ]
2822 : :
2823 : 270 : int lv[4] = { -1, -1, -1, -1 };
2824 : 270 : int cnt = 0;
2825 [ + + ]: 2430 : for( int i = 0; i < nvpc; i++ )
2826 : : {
2827 [ + + ]: 10800 : for( int j = 0; j < nvF; j++ )
2828 [ + + ]: 8640 : if( conn[i] == fid_verts[j] )
2829 : : {
2830 : 751 : lv[j] = i;
2831 : 751 : cnt += 1;
2832 : : }
2833 : : }
2834 [ + + ]: 270 : if( cnt == nvF ) // All face verts are part of the cell
2835 : : {
2836 : 128 : found = true;
2837 : 128 : int nhf_thisv = lConnMap3D[index].v2hf_num[lv[locfv0]];
2838 : 128 : int lfid = -1;
2839 [ + - ]: 276 : for( int i = 0; i < nhf_thisv; ++i )
2840 : : {
2841 : 276 : lfid = lConnMap3D[index].v2hf[lv[locfv0]][i];
2842 : 276 : int lcnt = 0;
2843 [ + + ]: 1380 : for( int j = 0; j < nvF; ++j )
2844 : : {
2845 [ + + ]: 5520 : for( int k = 0; k < nvF; ++k )
2846 : : {
2847 [ + + ]: 4416 : if( lv[k] == lConnMap3D[index].hf2v[lfid][j] ) lcnt += 1;
2848 : : }
2849 : : }
2850 [ + + ]: 276 : if( lcnt == nvF ) break;
2851 : : }
2852 : 128 : cid[0] = cur_cid;
2853 : 128 : lid[0] = lfid;
2854 : :
2855 : 128 : break;
2856 : : }
2857 : : else
2858 : : {
2859 : : // Add other cells that are incident on fid_verts[0]
2860 [ + - ][ - + ]: 142 : if( locfv0 < 0 || lv[locfv0] < 0 ) MB_SET_ERR( MB_FAILURE, "did not find local vertex " );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
2861 : 142 : int nhf_thisv = lConnMap3D[index].v2hf_num[lv[locfv0]];
2862 [ + - ]: 142 : int cidx = ID_FROM_HANDLE( cur_cid ) - 1;
2863 : :
2864 : : // Add new cells into the stack
2865 : : EntityHandle ngb;
2866 [ + + ]: 568 : for( int i = 0; i < nhf_thisv; ++i )
2867 : : {
2868 : 426 : int ind = lConnMap3D[index].v2hf[lv[locfv0]][i];
2869 [ + - ]: 426 : hf = sibhfs[nfpc * cidx + ind];
2870 [ + - ]: 426 : ngb = fid_from_halfacet( hf, ctype );
2871 : :
2872 [ + + ]: 426 : if( ngb )
2873 : : {
2874 : :
2875 [ + - ]: 343 : bool found_ent = find_match_in_array( ngb, trackcells, count );
2876 : :
2877 [ + + ]: 343 : if( !found_ent )
2878 : : {
2879 : 271 : Stksize += 1;
2880 : 343 : Stkcells[Stksize] = ngb;
2881 : : }
2882 : : }
2883 : : }
2884 : : }
2885 : : }
2886 : :
2887 : : // Change the visited faces to false
2888 [ + + ]: 182 : for( int i = 0; i < Stksize; i++ )
2889 : 54 : Stkcells[i] = 0;
2890 : :
2891 [ + + ]: 398 : for( int i = 0; i <= count; i++ )
2892 : 270 : trackcells[i] = 0;
2893 : :
2894 : 128 : return found;
2895 : : }
2896 : :
2897 : : ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2898 : 39712 : ErrorCode HalfFacetRep::get_neighbor_adjacencies_3d( EntityHandle cid, std::vector< EntityHandle >& adjents )
2899 : : {
2900 : 39712 : adjents.reserve( 20 );
2901 : 39712 : EntityType ctype = mb->type_from_handle( cid );
2902 : 39712 : int index = get_index_in_lmap( cid );
2903 : 39712 : int nfpc = lConnMap3D[index].num_faces_in_cell;
2904 : 39712 : int cidx = ID_FROM_HANDLE( cid ) - 1;
2905 : :
2906 [ + - ]: 39712 : if( cid != 0 )
2907 : : {
2908 [ + + ]: 238304 : for( int lfid = 0; lfid < nfpc; ++lfid )
2909 : : {
2910 [ + - ]: 198592 : HFacet hf = sibhfs[nfpc * cidx + lfid];
2911 [ + - ]: 198592 : EntityHandle sibcid = fid_from_halfacet( hf, ctype );
2912 [ + + ][ + - ]: 198592 : if( sibcid != 0 ) adjents.push_back( sibcid );
2913 : : }
2914 : : }
2915 : :
2916 : 39712 : return MB_SUCCESS;
2917 : : }
2918 : :
2919 : : /////////////////////////////////////////////////////////////////////////////////////////////////
2920 : 32 : ErrorCode HalfFacetRep::get_down_adjacencies_edg_3d( EntityHandle cid, std::vector< EntityHandle >& adjents )
2921 : : {
2922 : : // TODO: Try intersection without using std templates
2923 : : // Returns explicit edges, if any, of the face
2924 : : ErrorCode error;
2925 [ + - ]: 32 : adjents.reserve( 20 );
2926 [ + - ]: 32 : int index = get_index_in_lmap( cid );
2927 : 32 : int nvpc = lConnMap3D[index].num_verts_in_cell;
2928 : :
2929 : : const EntityHandle* conn;
2930 [ + - ][ - + ]: 32 : error = mb->get_connectivity( cid, conn, nvpc, true );MB_CHK_ERR( error );
[ # # ][ # # ]
2931 : :
2932 : : // Gather all the incident edges on each vertex of the face
2933 : 32 : int ns = lConnMap3D[index].search_everts[0];
2934 [ + - ]: 32 : std::vector< EntityHandle > temp;
2935 [ + + ]: 160 : for( int i = 0; i < ns; i++ )
2936 : : {
2937 : 128 : temp.clear();
2938 : 128 : int lv0 = lConnMap3D[index].search_everts[i + 1];
2939 [ + - ][ - + ]: 128 : error = get_up_adjacencies_1d( conn[lv0], temp );MB_CHK_ERR( error );
[ # # ][ # # ]
2940 : :
2941 : 128 : int nle = lConnMap3D[index].v2le[i][0];
2942 : 128 : int count = 0;
2943 [ + - ]: 554 : for( int j = 0; j < (int)temp.size(); j++ )
2944 : : {
2945 : : const EntityHandle* econn;
2946 : 554 : int nvpe = 0;
2947 [ + - ][ + - ]: 554 : error = mb->get_connectivity( temp[j], econn, nvpe, true );MB_CHK_ERR( error );
[ - + ][ # # ]
[ # # ]
2948 : :
2949 [ + + ]: 2216 : for( int k = 0; k < nle; k++ )
2950 : : {
2951 : 1662 : int lv1 = lConnMap3D[index].v2le[i][k + 1];
2952 [ + + ][ + + ]: 1662 : if( ( ( econn[0] == conn[lv0] ) && ( econn[1] == conn[lv1] ) ) ||
[ + + ]
2953 [ + + ]: 912 : ( ( econn[1] == conn[lv0] ) && ( econn[0] == conn[lv1] ) ) )
2954 : : {
2955 [ + - ][ + - ]: 384 : adjents.push_back( temp[j] );
2956 : 384 : count += 1;
2957 : : }
2958 : : }
2959 [ + + ]: 554 : if( count == nle ) break;
2960 : : }
2961 : : }
2962 : 32 : return MB_SUCCESS;
2963 : : }
2964 : :
2965 : 32 : ErrorCode HalfFacetRep::get_down_adjacencies_face_3d( EntityHandle cid, std::vector< EntityHandle >& adjents )
2966 : : {
2967 : : // Returns explicit face, if any of the cell
2968 : : ErrorCode error;
2969 [ + - ]: 32 : adjents.reserve( 10 );
2970 [ + - ]: 32 : int index = get_index_in_lmap( cid );
2971 : 32 : int nvpc = lConnMap3D[index].num_verts_in_cell;
2972 : 32 : int nfpc = lConnMap3D[index].num_faces_in_cell;
2973 : :
2974 : : // Get the connectivity of the input cell
2975 : : const EntityHandle* conn;
2976 [ + - ][ - + ]: 32 : error = mb->get_connectivity( cid, conn, nvpc, true );MB_CHK_ERR( error );
[ # # ][ # # ]
2977 : :
2978 : : // Collect all the half-faces of the cell
2979 : : EntityHandle half_faces[6][4];
2980 [ + + ]: 224 : for( int i = 0; i < nfpc; i++ )
2981 : : {
2982 : 192 : int nvf = lConnMap3D[index].hf2v_num[i];
2983 [ + + ]: 960 : for( int j = 0; j < nvf; j++ )
2984 : : {
2985 : 768 : int ind = lConnMap3D[index].hf2v[i][j];
2986 : 768 : half_faces[i][j] = conn[ind];
2987 : : }
2988 : : }
2989 : :
2990 : : // Add two vertices for which the upward adjacencies are computed
2991 : : int search_verts[2];
2992 : 32 : search_verts[0] = lConnMap3D[index].search_fverts[0];
2993 : 32 : search_verts[1] = lConnMap3D[index].search_fverts[1];
2994 : :
2995 [ + - ]: 32 : std::vector< EntityHandle > temp;
2996 [ + - ]: 32 : temp.reserve( 20 );
2997 [ + + ]: 96 : for( int i = 0; i < 2; i++ )
2998 : : {
2999 : : // Get the incident faces on the local vertex
3000 : 64 : int lv = search_verts[i];
3001 : 64 : temp.clear();
3002 [ + - ][ - + ]: 64 : error = get_up_adjacencies_vert_2d( conn[lv], temp );MB_CHK_ERR( error );
[ # # ][ # # ]
3003 : :
3004 [ - + ]: 64 : if( temp.size() == 0 ) continue;
3005 : :
3006 : : // Get the half-faces incident on the local vertex and match it with the obtained faces
3007 : 64 : int nhfthisv = lConnMap3D[index].v2hf_num[lv];
3008 [ + + ]: 596 : for( int k = 0; k < (int)temp.size(); k++ )
3009 : : {
3010 : : const EntityHandle* fid_verts;
3011 : 532 : int fsize = 0;
3012 [ + - ][ + - ]: 532 : error = mb->get_connectivity( temp[k], fid_verts, fsize, true );MB_CHK_ERR( error );
[ - + ][ # # ]
[ # # ]
3013 : :
3014 [ + + ]: 2128 : for( int j = 0; j < nhfthisv; j++ )
3015 : : {
3016 : : // Collect all the vertices of this half-face
3017 : 1596 : int idx = lConnMap3D[index].v2hf[lv][j];
3018 : 1596 : int nvF = lConnMap3D[index].hf2v_num[idx];
3019 : :
3020 [ - + ]: 1596 : if( fsize != nvF ) continue;
3021 : :
3022 : : int direct, offset;
3023 [ + - ]: 1596 : bool they_match = CN::ConnectivityMatch( &half_faces[idx][0], &fid_verts[0], nvF, direct, offset );
3024 : :
3025 [ + + ]: 1596 : if( they_match )
3026 : : {
3027 : 192 : bool found = false;
3028 [ + + ]: 672 : for( int p = 0; p < (int)adjents.size(); p++ )
3029 : : {
3030 [ + - ][ + - ]: 480 : if( adjents[p] == temp[k] )
[ - + ]
3031 : : {
3032 : 0 : found = true;
3033 : 0 : break;
3034 : : }
3035 : : }
3036 [ + - ][ + - ]: 1596 : if( !found ) adjents.push_back( temp[k] );
[ + - ]
3037 : : }
3038 : : }
3039 : : }
3040 : : }
3041 : :
3042 : 32 : return MB_SUCCESS;
3043 : : }
3044 : : ////////////////////////////////////////////////////////////////////////////////
3045 : 16 : ErrorCode HalfFacetRep::find_total_edges_faces_3d( Range cells, int* nedges, int* nfaces )
3046 : : {
3047 : : ErrorCode error;
3048 [ + - ][ + - ]: 16 : int index = get_index_in_lmap( *cells.begin() );
[ + - ]
3049 : 16 : int nepc = lConnMap3D[index].num_edges_in_cell;
3050 : 16 : int nfpc = lConnMap3D[index].num_faces_in_cell;
3051 [ + - ]: 16 : int ncells = cells.size();
3052 : 16 : int total_edges = nepc * ncells;
3053 : 16 : int total_faces = nfpc * ncells;
3054 : :
3055 [ + - ]: 16 : std::vector< int > trackE( total_edges, 0 );
3056 [ + - ]: 32 : std::vector< int > trackF( total_faces, 0 );
3057 : :
3058 [ + - ][ + - ]: 32 : std::vector< EntityHandle > inc_cids, sib_cids;
3059 [ + - ][ + - ]: 32 : std::vector< int > inc_leids, sib_lfids;
3060 : :
3061 [ + - ][ + - ]: 4786 : for( Range::iterator it = cells.begin(); it != cells.end(); ++it )
[ + - ][ + - ]
[ + + ]
3062 : : {
3063 : : // Count edges
3064 [ + + ]: 47700 : for( int i = 0; i < nepc; i++ )
3065 : : {
3066 : 42930 : inc_cids.clear();
3067 : 42930 : inc_leids.clear();
3068 : :
3069 [ + - ][ + - ]: 42930 : int id = nepc * ( cells.index( *it ) ) + i;
3070 [ + - ][ + + ]: 42930 : if( !trackE[id] )
3071 : : {
3072 [ + - ][ + - ]: 12109 : error = get_up_adjacencies_edg_3d( *it, i, inc_cids, &inc_leids );MB_CHK_ERR( error );
[ - + ][ # # ]
[ # # ]
3073 : :
3074 : 12109 : total_edges -= inc_cids.size() - 1;
3075 [ + + ]: 55039 : for( int j = 0; j < (int)inc_cids.size(); j++ )
3076 [ + - ][ + - ]: 42930 : trackE[nepc * ( cells.index( inc_cids[j] ) ) + inc_leids[j]] = 1;
[ + - ][ + - ]
3077 : : }
3078 : : }
3079 : :
3080 : : // Count faces
3081 [ + + ]: 28620 : for( int i = 0; i < nfpc; i++ )
3082 : : {
3083 : 23850 : sib_cids.clear();
3084 : 23850 : sib_lfids.clear();
3085 : :
3086 [ + - ][ + - ]: 23850 : int id = nfpc * ( cells.index( *it ) ) + i;
3087 [ + - ][ + + ]: 23850 : if( !trackF[id] )
3088 : : {
3089 [ + - ][ + - ]: 13030 : error = get_up_adjacencies_face_3d( *it, i, sib_cids, &sib_lfids );MB_CHK_ERR( error );
[ - + ][ # # ]
[ # # ]
3090 : :
3091 [ + + ]: 13030 : if( sib_cids.size() == 1 ) continue;
3092 : :
3093 : 10820 : total_faces -= sib_cids.size() - 1;
3094 [ + - ][ + - ]: 10820 : trackF[nfpc * ( cells.index( sib_cids[1] ) ) + sib_lfids[1]] = 1;
[ + - ][ + - ]
3095 : : }
3096 : : }
3097 : : }
3098 : :
3099 : 16 : nedges[0] = total_edges;
3100 : 16 : nfaces[0] = total_faces;
3101 : :
3102 : 32 : return MB_SUCCESS;
3103 : : }
3104 : :
3105 : 18306651 : bool HalfFacetRep::find_match_in_array( EntityHandle ent, EntityHandle* ent_list, int count, bool get_index,
3106 : : int* index )
3107 : : {
3108 : 18306651 : bool found = false;
3109 [ + + ]: 89251768 : for( int i = 0; i <= count; i++ )
3110 : : {
3111 [ + + ]: 77644254 : if( ent == ent_list[i] )
3112 : : {
3113 : 6699137 : found = true;
3114 [ + + ]: 6699137 : if( get_index ) *index = i;
3115 : 6699137 : break;
3116 : : }
3117 : : }
3118 : :
3119 : 18306651 : return found;
3120 : : }
3121 : :
3122 : 0 : ErrorCode HalfFacetRep::get_half_facet_in_comp( EntityHandle cid, int leid, std::vector< EntityHandle >& ents,
3123 : : std::vector< int >& lids, std::vector< int >& lfids )
3124 : : {
3125 : : ErrorCode error;
3126 : 0 : ents.clear();
3127 : 0 : lids.clear();
3128 [ # # ]: 0 : EntityType ctype = mb->type_from_handle( cid );
3129 [ # # ][ # # ]: 0 : int index = get_index_in_lmap( *_cells.begin() );
[ # # ]
3130 : 0 : int nfpc = lConnMap3D[index].num_faces_in_cell;
3131 : 0 : int nvpc = lConnMap3D[index].num_verts_in_cell;
3132 : :
3133 : : // Get all incident cells
3134 [ # # ]: 0 : std::vector< EntityHandle > adjents;
3135 [ # # ]: 0 : std::vector< int > adjlids;
3136 [ # # ][ # # ]: 0 : error = get_up_adjacencies_edg_3d( cid, leid, adjents, &adjlids );MB_CHK_ERR( error );
[ # # ][ # # ]
3137 : :
3138 : : // Get the end vertices of the edge <cid,leid>
3139 : : const EntityHandle* econn;
3140 [ # # ][ # # ]: 0 : error = mb->get_connectivity( cid, econn, nvpc, true );MB_CHK_ERR( error );
[ # # ][ # # ]
3141 : 0 : int id = lConnMap3D[index].e2v[leid][0];
3142 : 0 : EntityHandle vstart = econn[id];
3143 : 0 : id = lConnMap3D[index].e2v[leid][1];
3144 : 0 : EntityHandle vend = econn[id];
3145 : :
3146 [ # # ]: 0 : std::vector< int > mark( adjents.size(), 0 );
3147 : 0 : int count = 0;
3148 : :
3149 [ # # ]: 0 : for( int k = 0; k < (int)adjents.size(); k++ )
3150 : : {
3151 : :
3152 [ # # ][ # # ]: 0 : if( mark[k] != 0 ) continue;
3153 : :
3154 : 0 : count += 1;
3155 [ # # ]: 0 : mark[k] = count;
3156 : :
3157 : : // Loop over each half-face incident on this local edge
3158 [ # # ]: 0 : for( int i = 0; i < 2; i++ )
3159 : : {
3160 [ # # ]: 0 : EntityHandle cur_cell = adjents[k];
3161 [ # # ]: 0 : int cur_leid = adjlids[k];
3162 : :
3163 : 0 : int lface = i;
3164 : :
3165 : : while( true )
3166 : : {
3167 [ # # ]: 0 : int cidx = ID_FROM_HANDLE( cur_cell ) - 1;
3168 : 0 : int lfid = lConnMap3D[index].e2hf[cur_leid][lface];
3169 : :
3170 [ # # ]: 0 : HFacet hf = sibhfs[nfpc * cidx + lfid];
3171 [ # # ]: 0 : cur_cell = fid_from_halfacet( hf, ctype );
3172 [ # # ]: 0 : lfid = lid_from_halffacet( hf );
3173 : :
3174 : : // Check if loop reached starting cell or a boundary
3175 [ # # ][ # # ]: 0 : if( ( cur_cell == adjents[k] ) || ( cur_cell == 0 ) ) break;
[ # # ][ # # ]
3176 : :
3177 : : const EntityHandle* sib_conn;
3178 [ # # ][ # # ]: 0 : error = mb->get_connectivity( cur_cell, sib_conn, nvpc, true );MB_CHK_ERR( error );
[ # # ][ # # ]
3179 : :
3180 : : // Find the local edge id wrt to sibhf
3181 : 0 : int nv_curF = lConnMap3D[index].hf2v_num[lfid];
3182 : 0 : int lv0 = -1, lv1 = -1, idx = -1;
3183 [ # # ]: 0 : for( int j = 0; j < nv_curF; j++ )
3184 : : {
3185 : 0 : idx = lConnMap3D[index].hf2v[lfid][j];
3186 [ # # ]: 0 : if( vstart == sib_conn[idx] ) lv0 = idx;
3187 [ # # ]: 0 : if( vend == sib_conn[idx] ) lv1 = idx;
3188 : : }
3189 : :
3190 [ # # ][ # # ]: 0 : assert( ( lv0 >= 0 ) && ( lv1 >= 0 ) );
3191 : 0 : cur_leid = lConnMap3D[index].lookup_leids[lv0][lv1];
3192 : :
3193 : 0 : int chk_lfid = lConnMap3D[index].e2hf[cur_leid][0];
3194 : :
3195 [ # # ]: 0 : if( lfid == chk_lfid )
3196 : 0 : lface = 1;
3197 : : else
3198 : 0 : lface = 0;
3199 : :
3200 [ # # ][ # # ]: 0 : int ind = std::find( adjents.begin(), adjents.end(), cur_cell ) - adjents.begin();
3201 [ # # ]: 0 : mark[ind] = count;
3202 : : }
3203 : :
3204 : : // Loop back
3205 [ # # ]: 0 : if( cur_cell != 0 ) break;
3206 : 0 : }
3207 : : }
3208 : :
3209 : : // Loop over again to find cells on the boundary
3210 [ # # ]: 0 : for( int c = 0; c < count; c++ )
3211 : : {
3212 [ # # ]: 0 : for( int i = 0; i < (int)adjents.size(); i++ )
3213 : : {
3214 [ # # ][ # # ]: 0 : if( mark[i] == c + 1 )
3215 : : {
3216 [ # # ][ # # ]: 0 : int cidx = ID_FROM_HANDLE( adjents[i] ) - 1;
3217 [ # # ]: 0 : for( int j = 0; j < nfpc; j++ )
3218 : : {
3219 [ # # ]: 0 : HFacet hf = sibhfs[nfpc * cidx + j];
3220 [ # # ]: 0 : EntityHandle cell = fid_from_halfacet( hf, ctype );
3221 [ # # ]: 0 : if( cell == 0 )
3222 : : {
3223 [ # # ][ # # ]: 0 : ents.push_back( adjents[i] );
3224 [ # # ][ # # ]: 0 : lids.push_back( adjlids[i] );
3225 [ # # ]: 0 : lfids.push_back( j );
3226 : 0 : break;
3227 : : }
3228 : : }
3229 : : }
3230 : : }
3231 : : }
3232 : :
3233 : 0 : return MB_SUCCESS;
3234 : : }
3235 : :
3236 : : ///////////////////////////////////////////////////////////////////////////////////////////
3237 : 48 : ErrorCode HalfFacetRep::resize_hf_maps( EntityHandle start_vert, int nverts, EntityHandle start_edge, int nedges,
3238 : : EntityHandle start_face, int nfaces, EntityHandle start_cell, int ncells )
3239 : : {
3240 : 48 : int nwsz = 0, insz = 0;
3241 [ + + ]: 48 : if( nedges )
3242 : : {
3243 [ + - ][ + - ]: 10 : if( ID_FROM_HANDLE( ( *( _edges.end() - 1 ) + 1 ) ) != ID_FROM_HANDLE( start_edge ) )
[ + - ][ + - ]
[ - + ]
3244 [ # # ][ # # ]: 0 : nwsz = ( ID_FROM_HANDLE( start_edge ) - ID_FROM_HANDLE( *_edges.end() ) + nedges ) * 2;
3245 : : else
3246 : 10 : nwsz = nedges * 2;
3247 : 10 : insz = sibhvs.size();
3248 [ + - ]: 10 : sibhvs.resize( insz + nwsz, 0 );
3249 : :
3250 [ - + ]: 10 : if( v2hv.empty() )
3251 : : {
3252 [ # # ]: 0 : if( ( !v2he.empty() ) )
3253 : 0 : insz = v2he.size();
3254 [ # # ]: 0 : else if( ( !v2hf.empty() ) )
3255 : 0 : insz = v2hf.size();
3256 : : else
3257 [ # # ][ # # ]: 0 : MB_SET_ERR( MB_FAILURE, "Trying to resize ahf maps for a mesh with no edges, faces and cells" );
[ # # ][ # # ]
[ # # ]
3258 : : }
3259 : : else
3260 : 10 : insz = v2hv.size();
3261 : :
3262 [ + - ][ + - ]: 10 : if( ID_FROM_HANDLE( *( _verts.end() - 1 ) + 1 ) != ID_FROM_HANDLE( start_vert ) )
[ + - ][ + - ]
[ - + ]
3263 [ # # ][ # # ]: 0 : nwsz = ID_FROM_HANDLE( start_vert ) - ID_FROM_HANDLE( *_verts.end() ) + nverts;
3264 : : else
3265 : 10 : nwsz = nverts;
3266 [ + - ]: 10 : v2hv.resize( insz + nwsz, 0 );
3267 : : }
3268 : :
3269 [ + + ]: 48 : if( nfaces )
3270 : : {
3271 [ + - ][ + - ]: 22 : EntityType ftype = mb->type_from_handle( *_faces.begin() );
3272 : 22 : int nepf = lConnMap2D[ftype - 2].num_verts_in_face;
3273 : :
3274 [ + - ][ + - ]: 22 : if( ID_FROM_HANDLE( ( *( _faces.end() - 1 ) + 1 ) ) != ID_FROM_HANDLE( start_face ) )
[ + - ][ + - ]
[ - + ]
3275 [ # # ][ # # ]: 0 : nwsz = ( ID_FROM_HANDLE( start_face ) - ID_FROM_HANDLE( *_faces.end() ) + nfaces ) * nepf;
3276 : : else
3277 : 22 : nwsz = nfaces * nepf;
3278 : 22 : insz = sibhes.size();
3279 [ + - ]: 22 : sibhes.resize( insz + nwsz, 0 );
3280 : :
3281 [ + - ][ + - ]: 22 : if( ID_FROM_HANDLE( *( _verts.end() - 1 ) + 1 ) != ID_FROM_HANDLE( start_vert ) )
[ + - ][ + - ]
[ - + ]
3282 [ # # ][ # # ]: 0 : nwsz = ID_FROM_HANDLE( start_vert ) - ID_FROM_HANDLE( *_verts.end() ) + nverts;
3283 : : else
3284 : 22 : nwsz = nverts;
3285 : 22 : insz = v2he.size();
3286 [ + - ]: 22 : v2he.resize( insz + nwsz, 0 );
3287 : : }
3288 : :
3289 [ + + ]: 48 : if( ncells )
3290 : : {
3291 [ + - ][ + - ]: 16 : int index = get_index_in_lmap( *_cells.begin() );
3292 : 16 : int nfpc = lConnMap3D[index].num_faces_in_cell;
3293 : :
3294 [ + - ][ + - ]: 16 : if( ID_FROM_HANDLE( ( *( _cells.end() - 1 ) + 1 ) ) != ID_FROM_HANDLE( start_cell ) )
[ + - ][ + - ]
[ - + ]
3295 [ # # ][ # # ]: 0 : nwsz = ( ID_FROM_HANDLE( start_cell ) - ID_FROM_HANDLE( *_cells.end() ) + ncells ) * nfpc;
3296 : : else
3297 : 16 : nwsz = ncells * nfpc;
3298 : 16 : insz = sibhfs.size();
3299 [ + - ]: 16 : sibhfs.resize( insz + nwsz, 0 );
3300 : :
3301 [ + - ][ + - ]: 16 : if( ID_FROM_HANDLE( *( _verts.end() - 1 ) + 1 ) != ID_FROM_HANDLE( start_vert ) )
[ + - ][ + - ]
[ - + ]
3302 [ # # ][ # # ]: 0 : nwsz = ID_FROM_HANDLE( start_vert ) - ID_FROM_HANDLE( *_verts.end() ) + nverts;
3303 : : else
3304 : 16 : nwsz = nverts;
3305 : 16 : insz = v2hf.size();
3306 [ + - ]: 16 : v2hf.resize( insz + nwsz, 0 );
3307 : : }
3308 : :
3309 : 48 : return MB_SUCCESS;
3310 : : }
3311 : :
3312 : 0 : bool HalfFacetRep::check_nonmanifold_vertices( EntityType type, EntityHandle vid )
3313 : : {
3314 : 0 : bool status = false;
3315 [ # # ][ # # ]: 0 : if( type == MBTRI || type == MBQUAD )
3316 : : {
3317 : 0 : HFacet hf = v2he[ID_FROM_HANDLE( vid ) - 1];
3318 [ # # ][ # # ]: 0 : if( hf == 0 && ( v2hes.find( vid ) != v2hes.end() ) ) status = true;
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
[ # # # # ]
3319 : : }
3320 [ # # ][ # # ]: 0 : else if( type == MBTET || type == MBHEX )
3321 : : {
3322 : 0 : HFacet hf = v2hf[ID_FROM_HANDLE( vid ) - 1];
3323 [ # # ][ # # ]: 0 : if( hf == 0 && ( v2hfs.find( vid ) != v2hfs.end() ) ) status = true;
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
[ # # # # ]
3324 : : }
3325 : : else
3326 [ # # ][ # # ]: 0 : MB_SET_ERR( MB_FAILURE, "Requesting non-manifold vertex checks for either (1) 1D mesh or "
[ # # ][ # # ]
[ # # ]
3327 : : "(2) not-implemented entity types" );
3328 : :
3329 : 0 : return status;
3330 : : }
3331 : :
3332 : 89543 : ErrorCode HalfFacetRep::get_sibling_map( EntityType type, EntityHandle ent, EntityHandle* sib_entids, int* sib_lids,
3333 : : int num_halffacets )
3334 : : {
3335 : :
3336 [ + + ]: 89543 : if( type == MBEDGE )
3337 : : {
3338 [ - + ][ # # ]: 4537 : if( num_halffacets != 2 ) MB_SET_ERR( MB_FAILURE, "Incorrect number of halfvertices." );
[ # # ][ # # ]
[ # # ][ # # ]
3339 : :
3340 : 4537 : int eidx = ID_FROM_HANDLE( ent ) - 1;
3341 [ + + ]: 13611 : for( int i = 0; i < 2; i++ )
3342 : : {
3343 : 9074 : HFacet hf = sibhvs[2 * eidx + i];
3344 : 9074 : sib_entids[i] = fid_from_halfacet( hf, MBEDGE );
3345 : 9074 : sib_lids[i] = lid_from_halffacet( hf );
3346 : : }
3347 : : }
3348 [ + + ][ + + ]: 85006 : else if( type == MBTRI || type == MBQUAD )
3349 : : {
3350 : 40556 : int nepf = lConnMap2D[type - 2].num_verts_in_face;
3351 : :
3352 [ - + ][ # # ]: 40556 : if( num_halffacets != nepf ) MB_SET_ERR( MB_FAILURE, "Incorrect number of halfedges." );
[ # # ][ # # ]
[ # # ][ # # ]
3353 : :
3354 : 40556 : int fidx = ID_FROM_HANDLE( ent ) - 1;
3355 [ + + ]: 170601 : for( int i = 0; i < nepf; i++ )
3356 : : {
3357 : 130045 : HFacet hf = sibhes[nepf * fidx + i];
3358 : 130045 : sib_entids[i] = fid_from_halfacet( hf, type );
3359 : 130045 : sib_lids[i] = lid_from_halffacet( hf );
3360 : 40556 : }
3361 : : }
3362 : : else
3363 : : {
3364 [ + - ][ + - ]: 44450 : int idx = get_index_in_lmap( *_cells.begin() );
3365 : 44450 : int nfpc = lConnMap3D[idx].num_faces_in_cell;
3366 : :
3367 [ - + ][ # # ]: 44450 : if( num_halffacets != nfpc ) MB_SET_ERR( MB_FAILURE, "Incorrect number of halffaces." );
[ # # ][ # # ]
[ # # ][ # # ]
3368 : :
3369 : 44450 : int cidx = ID_FROM_HANDLE( ent ) - 1;
3370 [ + + ]: 266700 : for( int i = 0; i < nfpc; i++ )
3371 : : {
3372 : 222250 : HFacet hf = sibhfs[nfpc * cidx + i];
3373 : 222250 : sib_entids[i] = fid_from_halfacet( hf, type );
3374 : 222250 : sib_lids[i] = lid_from_halffacet( hf );
3375 : : }
3376 : : }
3377 : 89543 : return MB_SUCCESS;
3378 : : }
3379 : :
3380 : 127222 : ErrorCode HalfFacetRep::get_sibling_map( EntityType type, EntityHandle ent, int lid, EntityHandle& sib_entid,
3381 : : int& sib_lid )
3382 : : {
3383 : :
3384 [ - + ]: 127222 : if( type == MBEDGE )
3385 : : {
3386 : 0 : int eidx = ID_FROM_HANDLE( ent ) - 1;
3387 : 0 : HFacet hf = sibhvs[2 * eidx + lid];
3388 : 0 : sib_entid = fid_from_halfacet( hf, MBEDGE );
3389 : 0 : sib_lid = lid_from_halffacet( hf );
3390 : : }
3391 [ + + ][ + + ]: 127222 : else if( type == MBTRI || type == MBQUAD )
3392 : : {
3393 : 39342 : int nepf = lConnMap2D[type - 2].num_verts_in_face;
3394 : 39342 : int fidx = ID_FROM_HANDLE( ent ) - 1;
3395 : 39342 : HFacet hf = sibhes[nepf * fidx + lid];
3396 : 39342 : sib_entid = fid_from_halfacet( hf, type );
3397 : 39342 : sib_lid = lid_from_halffacet( hf );
3398 : : }
3399 : : else
3400 : : {
3401 [ + - ][ + - ]: 87880 : int idx = get_index_in_lmap( *_cells.begin() );
3402 : 87880 : int nfpc = lConnMap3D[idx].num_faces_in_cell;
3403 : 87880 : int cidx = ID_FROM_HANDLE( ent ) - 1;
3404 : 87880 : HFacet hf = sibhfs[nfpc * cidx + lid];
3405 : 87880 : sib_entid = fid_from_halfacet( hf, type );
3406 : 87880 : sib_lid = lid_from_halffacet( hf );
3407 : : }
3408 : 127222 : return MB_SUCCESS;
3409 : : }
3410 : :
3411 : 78374 : ErrorCode HalfFacetRep::set_sibling_map( EntityType type, EntityHandle ent, EntityHandle* set_entids, int* set_lids,
3412 : : int num_halffacets )
3413 : : {
3414 : :
3415 [ + + ]: 78374 : if( type == MBEDGE )
3416 : : {
3417 [ - + ][ # # ]: 3682 : if( num_halffacets != 2 ) MB_SET_ERR( MB_FAILURE, "Incorrect number of halfvertices" );
[ # # ][ # # ]
[ # # ][ # # ]
3418 : :
3419 : 3682 : int eidx = ID_FROM_HANDLE( ent ) - 1;
3420 [ + + ]: 11046 : for( int i = 0; i < 2; i++ )
3421 : : {
3422 : 7364 : sibhvs[2 * eidx + i] = create_halffacet( set_entids[i], set_lids[i] );
3423 : : }
3424 : : }
3425 [ + + ][ + + ]: 74692 : else if( type == MBTRI || type == MBQUAD )
3426 : : {
3427 : 35012 : int nepf = lConnMap2D[type - 2].num_verts_in_face;
3428 [ - + ][ # # ]: 35012 : if( num_halffacets != nepf ) MB_SET_ERR( MB_FAILURE, "Incorrect number of halfedges." );
[ # # ][ # # ]
[ # # ][ # # ]
3429 : :
3430 : 35012 : int fidx = ID_FROM_HANDLE( ent ) - 1;
3431 [ + + ]: 147878 : for( int i = 0; i < nepf; i++ )
3432 : : {
3433 : 112866 : sibhes[nepf * fidx + i] = create_halffacet( set_entids[i], set_lids[i] );
3434 : 35012 : }
3435 : : }
3436 : : else
3437 : : {
3438 [ + - ][ + - ]: 39680 : int idx = get_index_in_lmap( *_cells.begin() );
3439 : 39680 : int nfpc = lConnMap3D[idx].num_faces_in_cell;
3440 [ - + ][ # # ]: 39680 : if( num_halffacets != nfpc ) MB_SET_ERR( MB_FAILURE, "Incorrect number of halffaces." );
[ # # ][ # # ]
[ # # ][ # # ]
3441 : :
3442 : 39680 : int cidx = ID_FROM_HANDLE( ent ) - 1;
3443 [ + + ]: 238080 : for( int i = 0; i < nfpc; i++ )
3444 : : {
3445 : 198400 : sibhfs[nfpc * cidx + i] = create_halffacet( set_entids[i], set_lids[i] );
3446 : : }
3447 : : }
3448 : :
3449 : 78374 : return MB_SUCCESS;
3450 : : }
3451 : :
3452 : 302630 : ErrorCode HalfFacetRep::set_sibling_map( EntityType type, EntityHandle ent, int lid, EntityHandle& set_entid,
3453 : : int& set_lid )
3454 : : {
3455 : :
3456 [ + + ]: 302630 : if( type == MBEDGE )
3457 : : {
3458 : 2270 : int eidx = ID_FROM_HANDLE( ent ) - 1;
3459 : 2270 : sibhvs[2 * eidx + lid] = create_halffacet( set_entid, set_lid );
3460 : : }
3461 [ + + ][ + + ]: 300360 : else if( type == MBTRI || type == MBQUAD )
3462 : : {
3463 : 111480 : int nepf = lConnMap2D[type - 2].num_verts_in_face;
3464 : 111480 : int fidx = ID_FROM_HANDLE( ent ) - 1;
3465 : 111480 : sibhes[nepf * fidx + lid] = create_halffacet( set_entid, set_lid );
3466 : : }
3467 : : else
3468 : : {
3469 [ + - ][ + - ]: 188880 : int idx = get_index_in_lmap( *_cells.begin() );
3470 : 188880 : int nfpc = lConnMap3D[idx].num_faces_in_cell;
3471 : 188880 : int cidx = ID_FROM_HANDLE( ent ) - 1;
3472 : 188880 : sibhfs[nfpc * cidx + lid] = create_halffacet( set_entid, set_lid );
3473 : : }
3474 : :
3475 : 302630 : return MB_SUCCESS;
3476 : : }
3477 : :
3478 : 186607 : ErrorCode HalfFacetRep::get_incident_map( EntityType type, EntityHandle vid, std::vector< EntityHandle >& inci_entid,
3479 : : std::vector< int >& inci_lid )
3480 : : {
3481 : 186607 : inci_entid.clear();
3482 : 186607 : inci_lid.clear();
3483 : :
3484 [ + + ]: 186607 : if( type == MBEDGE )
3485 : : {
3486 : 1996 : HFacet hf = v2hv[ID_FROM_HANDLE( vid ) - 1];
3487 [ + - ]: 1996 : inci_entid.push_back( fid_from_halfacet( hf, type ) );
3488 [ + - ]: 1996 : inci_lid.push_back( lid_from_halffacet( hf ) );
3489 : : }
3490 [ + + ][ + + ]: 184611 : else if( type == MBTRI || type == MBQUAD )
3491 : : {
3492 : 33381 : HFacet hf = v2he[ID_FROM_HANDLE( vid ) - 1];
3493 [ + + ][ + - ]: 33381 : if( hf == 0 && ( v2hes.find( vid ) != v2hes.end() ) )
[ + - ][ - + ]
[ + + ][ + + ]
[ - + # #
# # ]
3494 : : {
3495 : : std::pair< std::multimap< EntityHandle, HFacet >::iterator,
3496 : : std::multimap< EntityHandle, HFacet >::iterator >
3497 [ # # ]: 0 : it_hes;
3498 [ # # ]: 0 : it_hes = v2hes.equal_range( vid );
3499 : :
3500 [ # # ][ # # ]: 0 : for( std::multimap< EntityHandle, HFacet >::iterator it = it_hes.first; it != it_hes.second; ++it )
[ # # ]
3501 : : {
3502 [ # # ][ # # ]: 0 : inci_entid.push_back( fid_from_halfacet( it->second, type ) );
[ # # ]
3503 [ # # ][ # # ]: 0 : inci_lid.push_back( lid_from_halffacet( it->second ) );
[ # # ]
3504 : : }
3505 : : }
3506 [ + + ]: 33381 : else if( hf != 0 )
3507 : : {
3508 [ + - ]: 14622 : inci_entid.push_back( fid_from_halfacet( hf, type ) );
3509 [ + - ]: 14622 : inci_lid.push_back( lid_from_halffacet( hf ) );
3510 : : }
3511 [ + - ][ + - ]: 18759 : else if( hf == 0 && ( v2hes.find( vid ) == v2hes.end() ) )
[ + - ][ + - ]
[ + - ][ + - ]
[ + - # #
# # ]
3512 : : {
3513 [ + - ]: 18759 : inci_entid.push_back( fid_from_halfacet( hf, type ) );
3514 [ + - ]: 18759 : inci_lid.push_back( lid_from_halffacet( hf ) );
3515 : 33381 : }
3516 : : }
3517 : : else
3518 : : {
3519 : 151230 : HFacet hf = v2hf[ID_FROM_HANDLE( vid ) - 1];
3520 [ + + ][ + - ]: 151230 : if( hf == 0 && ( v2hfs.find( vid ) != v2hfs.end() ) )
[ + - ][ - + ]
[ + + ][ + + ]
[ - + # #
# # ]
3521 : : {
3522 : : std::pair< std::multimap< EntityHandle, HFacet >::iterator,
3523 : : std::multimap< EntityHandle, HFacet >::iterator >
3524 [ # # ]: 0 : it_hes;
3525 [ # # ]: 0 : it_hes = v2hfs.equal_range( vid );
3526 : :
3527 [ # # ][ # # ]: 0 : for( std::multimap< EntityHandle, HFacet >::iterator it = it_hes.first; it != it_hes.second; ++it )
[ # # ]
3528 : : {
3529 [ # # ][ # # ]: 0 : inci_entid.push_back( fid_from_halfacet( it->second, type ) );
[ # # ]
3530 [ # # ][ # # ]: 0 : inci_lid.push_back( lid_from_halffacet( it->second ) );
[ # # ]
3531 : : }
3532 : : }
3533 [ + + ]: 151230 : else if( hf != 0 )
3534 : : {
3535 [ + - ]: 127655 : inci_entid.push_back( fid_from_halfacet( hf, type ) );
3536 [ + - ]: 127655 : inci_lid.push_back( lid_from_halffacet( hf ) );
3537 : : }
3538 [ + - ][ + - ]: 23575 : else if( hf == 0 && ( v2hfs.find( vid ) == v2hfs.end() ) )
[ + - ][ + - ]
[ + - ][ + - ]
[ + - # #
# # ]
3539 : : {
3540 [ + - ]: 23575 : inci_entid.push_back( fid_from_halfacet( hf, type ) );
3541 [ + - ]: 23575 : inci_lid.push_back( lid_from_halffacet( hf ) );
3542 : : }
3543 : : }
3544 : :
3545 : 186607 : return MB_SUCCESS;
3546 : : }
3547 : :
3548 : 51426 : ErrorCode HalfFacetRep::set_incident_map( EntityType type, EntityHandle vid, std::vector< EntityHandle >& set_entid,
3549 : : std::vector< int >& set_lid )
3550 : : {
3551 [ + + ]: 51426 : if( type == MBEDGE ) { v2hv[ID_FROM_HANDLE( vid ) - 1] = create_halffacet( set_entid[0], set_lid[0] ); }
3552 [ + + ][ + + ]: 49430 : else if( type == MBTRI || type == MBQUAD )
3553 : : {
3554 [ + - ]: 21990 : if( set_entid.size() == 1 )
3555 : 21990 : v2he[ID_FROM_HANDLE( vid ) - 1] = create_halffacet( set_entid[0], set_lid[0] );
3556 : : else
3557 : : {
3558 : 0 : HFacet hf = 0;
3559 [ # # ]: 0 : for( int i = 0; i < (int)set_entid.size(); i++ )
3560 : : {
3561 [ # # ][ # # ]: 0 : hf = create_halffacet( set_entid[i], set_lid[i] );
[ # # ]
3562 [ # # ][ # # ]: 0 : v2hes.insert( std::pair< EntityHandle, HFacet >( vid, hf ) );
3563 : : }
3564 : 21990 : }
3565 : : }
3566 : : else
3567 : : {
3568 [ + - ]: 27440 : if( set_entid.size() == 1 )
3569 : 27440 : v2hf[ID_FROM_HANDLE( vid ) - 1] = create_halffacet( set_entid[0], set_lid[0] );
3570 : : else
3571 : : {
3572 [ # # ][ # # ]: 0 : HFacet hf = v2hf[ID_FROM_HANDLE( vid ) - 1];
3573 [ # # ][ # # ]: 0 : if( hf != 0 ) { v2hf[ID_FROM_HANDLE( vid ) - 1] = 0; }
[ # # ]
3574 [ # # ]: 0 : for( int i = 0; i < (int)set_entid.size(); i++ )
3575 : : {
3576 [ # # ][ # # ]: 0 : hf = create_halffacet( set_entid[i], set_lid[i] );
[ # # ]
3577 [ # # ][ # # ]: 0 : v2hfs.insert( std::pair< EntityHandle, HFacet >( vid, hf ) );
3578 : : }
3579 : : }
3580 : : }
3581 : :
3582 : 51426 : return MB_SUCCESS;
3583 : : }
3584 : :
3585 : 17 : ErrorCode HalfFacetRep::get_entity_ranges( Range& verts, Range& edges, Range& faces, Range& cells )
3586 : : {
3587 : 17 : verts = _verts;
3588 : 17 : edges = _edges;
3589 : 17 : faces = _faces;
3590 : 17 : cells = _cells;
3591 : 17 : return MB_SUCCESS;
3592 : : }
3593 : :
3594 : 48 : ErrorCode HalfFacetRep::update_entity_ranges( EntityHandle fileset )
3595 : : {
3596 : : ErrorCode error;
3597 : :
3598 [ - + ][ # # ]: 48 : error = mb->get_entities_by_dimension( fileset, 0, _verts, true );MB_CHK_ERR( error );
3599 : :
3600 [ - + ][ # # ]: 48 : error = mb->get_entities_by_dimension( fileset, 1, _edges, true );MB_CHK_ERR( error );
3601 : :
3602 [ - + ][ # # ]: 48 : error = mb->get_entities_by_dimension( fileset, 2, _faces, true );MB_CHK_ERR( error );
3603 : :
3604 [ - + ][ # # ]: 48 : error = mb->get_entities_by_dimension( fileset, 3, _cells, true );MB_CHK_ERR( error );
3605 : :
3606 : 48 : return MB_SUCCESS;
3607 : : }
3608 : :
3609 : 0 : void HalfFacetRep::get_memory_use( unsigned long long& entity_total, unsigned long long& memory_total )
3610 : : {
3611 : 0 : entity_total = memory_total = 0;
3612 : : // 1D
3613 [ # # ]: 0 : if( !v2hv.empty() ) entity_total += v2hv.capacity() * sizeof( HFacet ) + sizeof( v2hv );
3614 [ # # ]: 0 : if( !sibhvs.empty() ) entity_total += sibhvs.capacity() * sizeof( HFacet ) + sizeof( sibhvs );
3615 : :
3616 : : // 2D
3617 [ # # ]: 0 : if( !v2he.empty() ) entity_total += v2he.capacity() * sizeof( HFacet ) + sizeof( v2he );
3618 [ # # ]: 0 : if( !sibhes.empty() ) entity_total += sibhes.capacity() * sizeof( HFacet ) + sizeof( sibhes );
3619 : :
3620 : : // 3D
3621 [ # # ]: 0 : if( !v2hf.empty() ) entity_total += v2hf.capacity() * sizeof( HFacet ) + sizeof( v2hf );
3622 [ # # ]: 0 : if( !sibhfs.empty() ) entity_total += sibhfs.capacity() * sizeof( HFacet ) + sizeof( sibhfs );
3623 : :
3624 : 0 : memory_total = entity_total;
3625 : 0 : }
3626 : :
3627 : 724658 : HFacet HalfFacetRep::create_halffacet( EntityHandle handle, int lid )
3628 : : {
3629 : 724658 : EntityID fid = ID_FROM_HANDLE( handle );
3630 : 724658 : return CREATE_HALFFACET( lid, fid );
3631 : : }
3632 : :
3633 : 19750212 : EntityHandle HalfFacetRep::fid_from_halfacet( const HFacet facet, EntityType type )
3634 : : {
3635 [ + - ]: 19750212 : EntityID id = FID_FROM_HALFFACET( facet );
3636 : 19750212 : EntityHandle handle = 0;
3637 [ + + ]: 19750212 : if( id == 0 ) return handle;
3638 : :
3639 [ + - ][ - + ]: 19182554 : ErrorCode error = mb->handle_from_id( type, id, handle );MB_CHK_ERR( error );
[ # # ][ # # ]
3640 : 19750212 : return handle;
3641 : : }
3642 : :
3643 : 15999460 : int HalfFacetRep::lid_from_halffacet( const HFacet facet )
3644 : : {
3645 [ + + ]: 15999460 : if( facet == 0 )
3646 : 387430 : return 0;
3647 : : else
3648 : 15612030 : return LID_FROM_HALFFACET( facet );
3649 : : }
3650 : :
3651 [ + - ][ + - ]: 16 : } // namespace moab
|