Branch data Line data Source code
1 : : #include "VGDefines.h"
2 : : #include "SubEntitySet.hpp"
3 : : #include "PartitionEntity.hpp"
4 : : #include "CoEdgeSM.hpp"
5 : : #include "DLIList.hpp"
6 : : #include "CubitSimpleAttrib.hpp"
7 : : #include "TDUniqueId.hpp"
8 : : #include "CubitVector.hpp"
9 : : #include "PartitionEngine.hpp"
10 : : #include "GeometryEntity.hpp"
11 : : #include "PartitionBody.hpp"
12 : : #include "PartitionSurface.hpp"
13 : : #include "CubitMessage.hpp"
14 : : #include <typeinfo>
15 : :
16 : :
17 : : const char* const PARTITION_DATA_ATTRIB_NAME = "PARTITION_ATTRIB";
18 : : const char* const PARTITION_GEOM_ATTRIB_NAME = "PARTITION_GEOM";
19 : : const char* const PARTITION_UID_ATTRIB_NAME = "PARTITION_UID";
20 : :
21 : 16418 : void SubEntitySet::strip_attributes( TopologyBridge* bridge )
22 : : {
23 [ + - ]: 16418 : DLIList<CubitSimpleAttrib> list;
24 : :
25 [ + - ][ + - ]: 16418 : bridge->get_simple_attribute( PARTITION_DATA_ATTRIB_NAME, list );
[ + - ]
26 [ + - ][ - + ]: 16418 : while ( list.size() )
27 : : {
28 [ # # ]: 0 : CubitSimpleAttrib csa = list.pop();
29 [ # # ]: 0 : bridge->remove_simple_attribute_virt( csa );
30 [ # # ]: 0 : }
31 : :
32 [ + - ][ + - ]: 16418 : bridge->get_simple_attribute( PARTITION_GEOM_ATTRIB_NAME, list );
[ + - ]
33 [ + - ][ - + ]: 16418 : while ( list.size() )
34 : : {
35 [ # # ]: 0 : CubitSimpleAttrib csa = list.pop();
36 [ # # ]: 0 : bridge->remove_simple_attribute_virt( csa );
37 [ # # ]: 0 : }
38 : :
39 [ + - ][ + - ]: 16418 : bridge->get_simple_attribute( PARTITION_UID_ATTRIB_NAME, list );
[ + - ]
40 [ + - ][ - + ]: 16418 : while ( list.size() )
41 : : {
42 [ # # ]: 0 : CubitSimpleAttrib csa = list.pop();
43 [ # # ]: 0 : bridge->remove_simple_attribute_virt( csa );
44 [ # # ][ + - ]: 16418 : }
45 : 16418 : }
46 : :
47 : :
48 : 0 : SubEntitySet::SubEntitySet( TopologyBridge* real_entity,
49 : : PartitionEntity* first_part )
50 : : : bodyNext(0), bodyPtr(0), subEntityHead(0), lowerOrderHead(0), lastId(0),
51 : 0 : layerNumber(SUBCOMP_PARTITION_LAYER), uniqueId(0)
52 : : {
53 : : // if( real_entity->owner() )
54 : : // real_entity->owner()->swap_bridge( real_entity,
55 : : // dynamic_cast<TopologyBridge*>(first_part) );
56 : :
57 : : // real_entity->owner( this );
58 : 0 : myEntity = real_entity;
59 [ # # ]: 0 : assert(!!myEntity);
60 : :
61 : : // Scan for existing partition geometry stored
62 : : // in attributes on the real entity. We need
63 : : // to start new Ids after any existing ones
64 : : // to avoid conflicts as the stored entities
65 : : // are restored.
66 [ # # ]: 0 : DLIList<CubitSimpleAttrib> csa_list;
67 : :
68 [ # # ][ # # ]: 0 : real_entity->get_simple_attribute( PARTITION_GEOM_ATTRIB_NAME, csa_list );
[ # # ]
69 [ # # ][ # # ]: 0 : while( csa_list.size() )
70 : : {
71 [ # # ]: 0 : CubitSimpleAttrib csa = csa_list.pop();
72 [ # # ][ # # ]: 0 : if( csa.character_type() == PARTITION_GEOM_ATTRIB_NAME )
[ # # ][ # # ]
[ # # ][ # # ]
73 : : {
74 [ # # ][ # # ]: 0 : int id = csa.int_data_list()[0];
75 [ # # ]: 0 : if( id > lastId )
76 : 0 : lastId = id;
77 : : }
78 [ # # ]: 0 : }
79 : :
80 [ # # ][ # # ]: 0 : real_entity->get_simple_attribute( PARTITION_UID_ATTRIB_NAME, csa_list );
[ # # ]
81 [ # # ][ # # ]: 0 : if ( csa_list.size() )
82 : : {
83 [ # # ][ # # ]: 0 : assert(csa_list.size() == 1);
84 [ # # ]: 0 : CubitSimpleAttrib csa = csa_list.pop();
85 : : //real_entity->remove_simple_attribute_virt(csa);
86 [ # # ][ # # ]: 0 : assert(csa.int_data_list().size() == 1);
[ # # ]
87 [ # # ][ # # ]: 0 : uniqueId = csa.int_data_list()[0];
88 [ # # ][ # # ]: 0 : PartitionEngine::instance().add_to_id_map( this, uniqueId );
[ # # ]
89 : : }
90 : :
91 : : // add first partition into the SubEntitySet's linked list
92 [ # # ]: 0 : add_partition( first_part, 0 );
93 : :
94 [ # # ]: 0 : csa_list.clean_out();
95 [ # # ][ # # ]: 0 : real_entity->get_simple_attribute( PARTITION_DATA_ATTRIB_NAME, csa_list );
[ # # ]
96 [ # # ][ # # ]: 0 : while ( csa_list.size() )
97 : : {
98 [ # # ]: 0 : CubitSimpleAttrib csa = csa_list.pop();
99 [ # # ]: 0 : real_entity->remove_simple_attribute_virt(csa);
100 [ # # ]: 0 : wrap_attribute(csa, first_part->entitySetId );
101 [ # # ]: 0 : real_entity->append_simple_attribute_virt(csa);
102 [ # # ][ # # ]: 0 : }
103 : 0 : }
104 : :
105 : 0 : void SubEntitySet::unwrap_attributes()
106 : : {
107 [ # # ]: 0 : DLIList<CubitSimpleAttrib> csa_list;
108 [ # # ]: 0 : if ( myEntity)
109 [ # # ][ # # ]: 0 : myEntity->get_simple_attribute( PARTITION_DATA_ATTRIB_NAME, csa_list );
[ # # ]
110 [ # # ][ # # ]: 0 : while( csa_list.size() )
111 : : {
112 [ # # ]: 0 : CubitSimpleAttrib csa = csa_list.pop();
113 [ # # ]: 0 : myEntity->remove_simple_attribute_virt(csa);
114 [ # # ]: 0 : unwrap_attribute(csa);
115 [ # # ]: 0 : myEntity->append_simple_attribute_virt(csa);
116 [ # # ][ # # ]: 0 : }
117 : 0 : }
118 : :
119 : :
120 : 0 : int SubEntitySet::get_unique_id()
121 : : {
122 [ # # ]: 0 : if( uniqueId == 0 )
123 : : {
124 [ # # ]: 0 : uniqueId = TDUniqueId::generate_unique_id();
125 [ # # ][ # # ]: 0 : CubitSimpleAttrib attrib( PARTITION_UID_ATTRIB_NAME, 0, 0, &uniqueId );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
126 [ # # ]: 0 : myEntity->append_simple_attribute_virt( attrib );
127 [ # # ][ # # ]: 0 : PartitionEngine::instance().add_to_id_map( this, uniqueId );
[ # # ]
128 : : }
129 : 0 : return uniqueId;
130 : : }
131 : :
132 : 0 : SubEntitySet::~SubEntitySet()
133 : : {
134 [ # # ]: 0 : if( uniqueId )
135 [ # # ][ # # ]: 0 : PartitionEngine::instance().remove_from_id_map(this,uniqueId);
136 [ # # ][ # # ]: 0 : assert( subEntityHead == 0 && lowerOrderHead == 0 );
137 [ # # ]: 0 : if( myEntity ) {
138 [ # # ]: 0 : strip_attributes(myEntity);
139 [ # # ][ # # ]: 0 : if( myEntity->owner() == this )
140 [ # # ]: 0 : myEntity->owner(0);
141 : : }
142 : :
143 [ # # ]: 0 : if( bodyPtr )
144 : : {
145 : : // keep copy because calling bodyPtr->remove
146 : : // means that bodyPtr will become NULL
147 : 0 : PartitionBody* body = bodyPtr;
148 [ # # ]: 0 : body->remove(*this);
149 : :
150 [ # # ]: 0 : assert(body->entitySet != this);
151 [ # # ][ # # ]: 0 : if( !body->has_children() )
152 : : {
153 [ # # ]: 0 : BodySM* real_body = body->real_body();
154 [ # # ][ # # ]: 0 : body->sub_entity_set().remove_bridge(real_body);
155 [ # # ][ # # ]: 0 : if( body->owner() )
156 [ # # ][ # # ]: 0 : body->owner()->swap_bridge( body, real_body, false );
157 [ # # ][ # # ]: 0 : delete body;
158 : : }
159 : : }
160 [ # # ]: 0 : }
161 : :
162 : 0 : void SubEntitySet::add_lower_order( PartitionEntity* partition )
163 : : {
164 [ # # ]: 0 : assert( partition->entitySet == 0 &&
165 [ # # ]: 0 : partition->entitySetNext == 0 );
166 : 0 : partition->entitySet = this;
167 : 0 : partition->entitySetNext = lowerOrderHead;
168 : 0 : lowerOrderHead = partition;
169 : 0 : partition->entitySetId = ++lastId;
170 : 0 : }
171 : :
172 : 0 : void SubEntitySet::add_lower_order( PartitionEntity* partition,
173 : : const CubitSimpleAttrib& attrib,
174 : : int dimension,
175 : : DLIList<CubitVector*>& points,
176 : : DLIList<int>& facets,
177 : : DLIList<int>& children,
178 : : DLIList<int>& point_owners )
179 : : {
180 [ # # ]: 0 : assert( partition->entitySet == 0 &&
181 [ # # ]: 0 : partition->entitySetNext == 0 );
182 : :
183 : : int id, dim;
184 : : CubitStatus result = read_geometry( id, dim, points, facets, children,
185 [ # # ]: 0 : point_owners, attrib );
186 [ # # ][ # # ]: 0 : assert( result && dimension == dim );
187 [ # # ][ # # ]: 0 : if (CUBIT_SUCCESS != result || dimension != dim) {
188 [ # # ][ # # ]: 0 : PRINT_ERROR("SubEntitySet::read_geometry failed or returned a mismatched dimension.\n");
[ # # ][ # # ]
189 : 0 : return;
190 : : }
191 : :
192 : 0 : partition->entitySet = this;
193 : 0 : partition->entitySetNext = lowerOrderHead;
194 : 0 : lowerOrderHead = partition;
195 : :
196 : 0 : partition->entitySetId = id;
197 : : }
198 : : /*
199 : : void SubEntitySet::fix_duplicate_id( int id )
200 : : {
201 : : for( int i = 0; i < 2; i++ )
202 : : {
203 : : PartitionEntit* list = i ? subEntityHead : lowerOrderHead;
204 : : for( ; list; list = list->entitySetNext )
205 : : {
206 : : if( list->entitySetId == id )
207 : : list->entitySetId = ++lastId;
208 : : }
209 : : }
210 : : }
211 : : */
212 : 0 : void SubEntitySet::add_partition( PartitionEntity* partition,
213 : : PartitionEntity* after )
214 : : {
215 [ # # ][ # # ]: 0 : assert( partition->entitySet == 0 && partition->entitySetNext == 0 );
216 : 0 : partition->entitySet = this;
217 : :
218 [ # # ]: 0 : if( after )
219 : : {
220 [ # # ]: 0 : assert( after->entitySet == this );
221 : 0 : partition->entitySetNext = after->entitySetNext;
222 : 0 : after->entitySetNext = partition;
223 : : }
224 : : else
225 : : {
226 : 0 : partition->entitySetNext = subEntityHead;
227 : 0 : subEntityHead = partition;
228 : : }
229 : 0 : partition->entitySetId = ++lastId;
230 : 0 : }
231 : :
232 : :
233 : 0 : void SubEntitySet::remove( PartitionEntity* partition )
234 : : {
235 [ # # ]: 0 : assert( partition->entitySet == this );
236 : 0 : partition->entitySet = 0;
237 : :
238 [ # # ]: 0 : if( lowerOrderHead == partition )
239 : : {
240 : 0 : lowerOrderHead = partition->entitySetNext;
241 : : }
242 [ # # ]: 0 : else if( subEntityHead == partition )
243 : : {
244 : 0 : subEntityHead = partition->entitySetNext;
245 : : }
246 : : else
247 : : {
248 : 0 : PartitionEntity* curr = subEntityHead;
249 [ # # ][ # # ]: 0 : while( curr && curr->entitySetNext != partition )
250 : 0 : curr = curr->entitySetNext;
251 [ # # ]: 0 : if( curr == 0 )
252 : : {
253 : 0 : curr = lowerOrderHead;
254 [ # # ][ # # ]: 0 : while( curr && curr->entitySetNext != partition )
255 : 0 : curr = curr->entitySetNext;
256 : : }
257 : :
258 [ # # ][ # # ]: 0 : assert( curr && curr->entitySetNext == partition );
259 : 0 : curr->entitySetNext = partition->entitySetNext;
260 : : }
261 : :
262 : 0 : partition->entitySetNext = 0;
263 : :
264 [ # # ][ # # ]: 0 : if( !subEntityHead && !lowerOrderHead )
265 : : {
266 [ # # ]: 0 : delete this;
267 : : }
268 : :
269 : 0 : partition->entitySetId = 0;
270 : 0 : }
271 : :
272 : 0 : CubitStatus SubEntitySet::bridge_destroyed( TopologyBridge* bridge )
273 : : {
274 [ # # ][ # # ]: 0 : if( myEntity && myEntity == bridge )
275 : : {
276 [ # # ]: 0 : if( myEntity->owner() == this )
277 : 0 : myEntity->owner(0);
278 : 0 : myEntity = 0;
279 : 0 : return CUBIT_SUCCESS;
280 : : }
281 : 0 : return CUBIT_FAILURE;
282 : : }
283 : :
284 : 0 : CubitStatus SubEntitySet::remove_bridge( TopologyBridge* bridge )
285 : : {
286 [ # # ][ # # ]: 0 : if (myEntity && myEntity == bridge)
287 : : {
288 : 0 : strip_attributes(myEntity);
289 : 0 : return bridge_destroyed(myEntity);
290 : : }
291 : 0 : return CUBIT_FAILURE;
292 : : }
293 : :
294 : 0 : CubitStatus SubEntitySet::swap_bridge( TopologyBridge* remove,
295 : : TopologyBridge* add,
296 : : bool reversed )
297 : : {
298 [ # # ]: 0 : if( remove_bridge( remove ) )
299 : : {
300 [ # # ]: 0 : if( add->owner() )
301 : : {
302 : 0 : add->owner()->remove_bridge( add );
303 : : }
304 : 0 : add->owner(this);
305 : 0 : myEntity = add;
306 [ # # ]: 0 : if (reversed)
307 : 0 : notify_reversed(add);
308 : 0 : return CUBIT_SUCCESS;
309 : : }
310 : 0 : return CUBIT_FAILURE;
311 : : }
312 : :
313 : 0 : void SubEntitySet::get_owners( DLIList<TopologyBridge*>& owner_list ) const
314 : : {
315 [ # # ]: 0 : for( PartitionEntity* ent = subEntityHead; ent; ent = ent->entitySetNext )
316 [ # # ][ # # ]: 0 : owner_list.append( dynamic_cast<TopologyBridge*>(ent) );
317 : :
318 [ # # ]: 0 : CoEdgeSM* coedge = dynamic_cast<CoEdgeSM*>(get_entity());
319 [ # # ][ # # ]: 0 : if( coedge && coedge->sense() == CUBIT_REVERSED )
[ # # ]
320 : 0 : owner_list.reverse();
321 : 0 : }
322 : :
323 : :
324 : 0 : bool SubEntitySet::has_multiple_sub_entities() const
325 [ # # ][ # # ]: 0 : { return subEntityHead && subEntityHead->entitySetNext; }
326 : :
327 : 0 : void SubEntitySet::print_debug_info( const char* prefix ) const
328 : : {
329 [ # # ]: 0 : if( !prefix ) prefix = "";
330 : :
331 [ # # ][ # # ]: 0 : PRINT_INFO("%sSubEntitySet for %s %p\n", prefix,
[ # # ]
332 : : myEntity ? fix_type_name(typeid(*myEntity).name()) : "TopologyBridge",
333 [ # # ]: 0 : (void*)myEntity );
334 : :
335 [ # # ][ # # ]: 0 : PRINT_INFO("%s SubEntities:\n", prefix );
336 : 0 : PartitionEntity* ent = subEntityHead;
337 : :
338 [ # # ]: 0 : while( ent )
339 : : {
340 [ # # ]: 0 : PartitionSurface *partition_surf = dynamic_cast<PartitionSurface*>(ent);
341 [ # # ]: 0 : if( partition_surf )
342 [ # # ][ # # ]: 0 : PRINT_INFO("%p is a partition surface\n", (void*)partition_surf);
343 : :
344 [ # # ][ # # ]: 0 : PRINT_INFO("%s %s %d (%p)\n", prefix,
345 [ # # ]: 0 : fix_type_name(typeid(*ent).name()), ent->entitySetId, (void*)ent);
346 : 0 : ent = ent->entitySetNext;
347 : : }
348 : :
349 [ # # ][ # # ]: 0 : PRINT_INFO("%s Lower-order entities:\n", prefix );
350 : 0 : ent = lowerOrderHead;
351 [ # # ]: 0 : while( ent )
352 : : {
353 [ # # ][ # # ]: 0 : PRINT_INFO("%s %s %d (%p)\n", prefix,
354 [ # # ]: 0 : fix_type_name(typeid(*ent).name()), ent->entitySetId, (void*)ent);
355 : 0 : ent = ent->entitySetNext;
356 : : }
357 : :
358 [ # # ][ # # ]: 0 : PRINT_INFO("%s Body: %p\n", prefix, (void*)bodyPtr);
359 : 0 : }
360 : :
361 : 0 : bool SubEntitySet::is_attribute( const CubitSimpleAttrib& csa, int id ) const
362 : : {
363 [ # # ]: 0 : if( csa.string_data_list().size() < 1 )
364 : 0 : return false;
365 : :
366 [ # # ][ # # ]: 0 : if( csa.character_type() != PARTITION_DATA_ATTRIB_NAME )
[ # # ][ # # ]
367 : 0 : return false;
368 : :
369 [ # # ]: 0 : assert( csa.int_data_list().size() );
370 [ # # ][ # # ]: 0 : if( id && csa.int_data_list()[0] != id )
[ # # ]
371 : 0 : return false;
372 : :
373 : 0 : return true;
374 : : }
375 : :
376 : 0 : CubitStatus SubEntitySet::wrap_attribute( CubitSimpleAttrib& csa, int id ) const
377 : : {
378 [ # # ]: 0 : if( is_attribute( csa ) )
379 : 0 : return CUBIT_FAILURE;
380 : :
381 [ # # ][ # # ]: 0 : csa.string_data_list().insert(csa.string_data_list().begin(), CubitString(PARTITION_DATA_ATTRIB_NAME) );
[ # # ][ # # ]
382 : 0 : csa.int_data_list().insert(csa.int_data_list().begin(), id );
383 : 0 : return CUBIT_SUCCESS;
384 : : }
385 : :
386 : 0 : int SubEntitySet::unwrap_attribute( CubitSimpleAttrib& csa ) const
387 : : {
388 [ # # ]: 0 : if( ! is_attribute( csa ) )
389 : 0 : return 0;
390 : :
391 : 0 : csa.string_data_list().erase(csa.string_data_list().begin());
392 : 0 : int id = csa.int_data_list()[0];
393 : 0 : csa.int_data_list().erase(csa.int_data_list().begin());
394 : :
395 : 0 : return id;
396 : : }
397 : :
398 : 0 : void SubEntitySet::add_attribute( PartitionEntity* entity, const CubitSimpleAttrib& csa )
399 : : {
400 [ # # ]: 0 : assert( entity->entitySet == this );
401 : :
402 [ # # ]: 0 : if( !myEntity )
403 : 0 : return;
404 : :
405 [ # # ]: 0 : CubitSimpleAttrib copy = csa;
406 [ # # ][ # # ]: 0 : if( wrap_attribute( copy, entity->entitySetId ) )
407 : : {
408 [ # # ]: 0 : myEntity->append_simple_attribute_virt( copy );
409 [ # # ]: 0 : }
410 : : }
411 : :
412 : 0 : void SubEntitySet::rem_attribute( PartitionEntity* entity, const CubitSimpleAttrib& csa )
413 : : {
414 [ # # ]: 0 : assert( entity->entitySet == this );
415 : :
416 [ # # ]: 0 : if( !myEntity )
417 : 0 : return;
418 : :
419 [ # # ]: 0 : CubitSimpleAttrib copy = csa;
420 [ # # ][ # # ]: 0 : if( wrap_attribute( copy, entity->entitySetId ) )
421 : : {
422 [ # # ]: 0 : myEntity->remove_simple_attribute_virt( copy );
423 [ # # ]: 0 : }
424 : : }
425 : :
426 : 0 : void SubEntitySet::get_attributes( PartitionEntity* entity,
427 : : DLIList<CubitSimpleAttrib>& list )
428 : : {
429 [ # # ]: 0 : assert( entity->entitySet == this );
430 [ # # ][ # # ]: 0 : assert( !list.size() );
431 [ # # ]: 0 : list.clean_out();
432 : :
433 [ # # ]: 0 : if( !myEntity )
434 : 0 : return;
435 : :
436 [ # # ]: 0 : DLIList<CubitSimpleAttrib> tmp;
437 [ # # ][ # # ]: 0 : myEntity->get_simple_attribute( PARTITION_DATA_ATTRIB_NAME, tmp );
[ # # ]
438 [ # # ][ # # ]: 0 : for(int i=0; i<tmp.size(); i++)
439 : : {
440 [ # # ]: 0 : CubitSimpleAttrib& csa = tmp[i];
441 [ # # ][ # # ]: 0 : if( is_attribute( csa, entity->entitySetId ) )
442 : : {
443 [ # # ]: 0 : unwrap_attribute( csa );
444 [ # # ]: 0 : list.append(csa);
445 : : }
446 [ # # ]: 0 : }
447 : : }
448 : 0 : void SubEntitySet::get_attributes( PartitionEntity* entity, const char* name,
449 : : DLIList<CubitSimpleAttrib>& list )
450 : : {
451 [ # # ]: 0 : list.clean_out();
452 : :
453 [ # # ]: 0 : DLIList<CubitSimpleAttrib> tmp;
454 [ # # ]: 0 : get_attributes(entity,tmp);
455 : :
456 [ # # ][ # # ]: 0 : for ( int i=0; i<tmp.size(); i++)
457 : : {
458 [ # # ][ # # ]: 0 : if(tmp[i].character_type() == name)
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
459 : : {
460 [ # # ][ # # ]: 0 : list.append(tmp[i]);
461 : : }
462 [ # # ]: 0 : }
463 : 0 : }
464 : :
465 : 0 : void SubEntitySet::rem_all_attrib( PartitionEntity* entity )
466 : : {
467 [ # # ]: 0 : assert( entity->entitySet == this );
468 : :
469 [ # # ]: 0 : if( !myEntity )
470 : 0 : return;
471 : :
472 [ # # ]: 0 : DLIList<CubitSimpleAttrib> dead_list;
473 [ # # ][ # # ]: 0 : myEntity->get_simple_attribute( PARTITION_DATA_ATTRIB_NAME, dead_list );
[ # # ]
474 [ # # ][ # # ]: 0 : for( int i = dead_list.size(); i--; )
475 : : {
476 [ # # ]: 0 : const CubitSimpleAttrib& csa = dead_list.get_and_step();
477 [ # # ][ # # ]: 0 : if( is_attribute( csa, entity->entitySetId ) )
478 [ # # ]: 0 : myEntity->remove_simple_attribute_virt( csa );
479 [ # # ]: 0 : }
480 : : }
481 : :
482 : 0 : int SubEntitySet::get_id( PartitionEntity* entity ) const
483 : : {
484 [ # # ]: 0 : if( entity->entitySet != this )
485 : 0 : return 0;
486 : 0 : return entity->entitySetId;
487 : : }
488 : :
489 : 0 : PartitionEntity* SubEntitySet::entity_from_id( int id ) const
490 : : {
491 : : PartitionEntity* ent;
492 [ # # ]: 0 : for( ent = subEntityHead; ent; ent = ent->entitySetNext )
493 [ # # ]: 0 : if( ent->entitySetId == id )
494 : 0 : return ent;
495 [ # # ]: 0 : for( ent = lowerOrderHead; ent; ent = ent->entitySetNext )
496 [ # # ]: 0 : if( ent->entitySetId == id )
497 : 0 : return ent;
498 : 0 : return 0;
499 : : }
500 : :
501 : 0 : void SubEntitySet::get_sub_entities( DLIList<PartitionEntity*>& list ) const
502 : : {
503 [ # # ]: 0 : for( PartitionEntity* ent = subEntityHead; ent; ent = ent->entitySetNext )
504 [ # # ]: 0 : list.append(ent);
505 : 0 : }
506 : :
507 : :
508 : 0 : void SubEntitySet::get_lower_order( DLIList<PartitionEntity*>& list ) const
509 : : {
510 [ # # ]: 0 : for( PartitionEntity* ent = lowerOrderHead; ent; ent = ent->entitySetNext )
511 [ # # ]: 0 : list.append(ent);
512 : 0 : }
513 : :
514 : 0 : void SubEntitySet::set_id( PartitionEntity* entity, int id )
515 : : {
516 [ # # ]: 0 : if( entity->entitySet != this )
517 : 0 : assert(0);
518 : : else
519 : : {
520 : 0 : entity->entitySetId = id;
521 [ # # ]: 0 : if( id > lastId )
522 : 0 : lastId = id;
523 : : }
524 : 0 : }
525 : :
526 : 0 : void SubEntitySet::renumerate( int lowest_value, bool higher_only )
527 : : {
528 : 0 : lastId = lowest_value - 1;
529 : :
530 : : PartitionEntity* ent;
531 [ # # ]: 0 : for( ent = subEntityHead; ent; ent = ent->entitySetNext )
532 [ # # ][ # # ]: 0 : if( !higher_only || ent->entitySetId >= lowest_value )
533 : 0 : ent->entitySetId = ++lastId;
534 [ # # ]: 0 : for( ent = lowerOrderHead; ent; ent = ent->entitySetNext )
535 [ # # ][ # # ]: 0 : if( !higher_only || ent->entitySetId >= lowest_value )
536 : 0 : ent->entitySetId = ++lastId;
537 : 0 : }
538 : :
539 : 0 : void SubEntitySet::notify_reversed( TopologyBridge* bridge )
540 : : {
541 [ # # ][ # # ]: 0 : assert( !bridge || bridge == myEntity );
542 : :
543 : : // reverse list order (only really necessary for curves)
544 : 0 : PartitionEntity* entity = subEntityHead;
545 : 0 : subEntityHead = 0;
546 [ # # ]: 0 : while( entity )
547 : : {
548 : 0 : PartitionEntity* next = entity->entitySetNext;
549 : 0 : entity->entitySetNext = subEntityHead;
550 : 0 : subEntityHead = entity;
551 : 0 : entity = next;
552 : : }
553 : :
554 : : // reverse the sense of all subentities
555 [ # # ]: 0 : for( entity = subEntityHead; entity; entity = entity->entitySetNext )
556 : 0 : entity->reverse_sense();
557 : 0 : }
558 : :
559 : :
560 : 0 : CubitStatus SubEntitySet::save_geometry( int id, int dimension,
561 : : DLIList<CubitVector*>* point_list,
562 : : DLIList<int>* point_connectivity,
563 : : DLIList<int>* topo_connectivity,
564 : : DLIList<int>* point_owners,
565 : : CubitSimpleAttrib& attrib )
566 : : {
567 : : int i;
568 : :
569 [ # # ][ # # ]: 0 : attrib.int_data_list().clear();
570 [ # # ][ # # ]: 0 : attrib.double_data_list().clear();
571 : :
572 [ # # ][ # # ]: 0 : attrib.int_data_list().push_back( id);
573 [ # # ][ # # ]: 0 : attrib.int_data_list().push_back( dimension);
574 [ # # ][ # # ]: 0 : int point_list_size = point_list ? point_list->size() : 0;
575 [ # # ][ # # ]: 0 : attrib.int_data_list().push_back( point_list_size);
576 [ # # ][ # # ]: 0 : int point_conn_size = point_connectivity ? point_connectivity->size() : 0;
577 [ # # ][ # # ]: 0 : attrib.int_data_list().push_back( point_conn_size);
578 [ # # ][ # # ]: 0 : int topo_conn_size = topo_connectivity ? topo_connectivity->size() : 0;
579 [ # # ][ # # ]: 0 : attrib.int_data_list().push_back( topo_conn_size);
580 : :
581 [ # # ]: 0 : if( point_list )
582 : : {
583 [ # # ]: 0 : point_list->reset();
584 [ # # ][ # # ]: 0 : for( i = point_list->size(); i--; )
585 : : {
586 [ # # ]: 0 : CubitVector* p = point_list->get_and_step();
587 [ # # ][ # # ]: 0 : attrib.double_data_list().push_back(p->x());
[ # # ]
588 [ # # ][ # # ]: 0 : attrib.double_data_list().push_back(p->y());
[ # # ]
589 [ # # ][ # # ]: 0 : attrib.double_data_list().push_back(p->z());
[ # # ]
590 : 0 : delete p;
591 : : }
592 [ # # ]: 0 : point_list->clean_out();
593 : : }
594 : :
595 [ # # ]: 0 : if( point_connectivity )
596 : : {
597 [ # # ]: 0 : point_connectivity->reset();
598 [ # # ][ # # ]: 0 : for( i = point_connectivity->size(); i--; )
599 [ # # ][ # # ]: 0 : attrib.int_data_list().push_back(point_connectivity->get_and_step());
[ # # ]
600 : : }
601 : :
602 [ # # ]: 0 : if( topo_connectivity )
603 : : {
604 [ # # ]: 0 : topo_connectivity->reset();
605 [ # # ][ # # ]: 0 : for( i = topo_connectivity->size(); i--; )
606 [ # # ][ # # ]: 0 : attrib.int_data_list().push_back(topo_connectivity->get_and_step());
[ # # ]
607 : : }
608 : :
609 [ # # ]: 0 : if ( point_owners )
610 : : {
611 [ # # ]: 0 : point_owners->reset();
612 [ # # ][ # # ]: 0 : for ( i = point_owners->size(); i--; )
613 [ # # ][ # # ]: 0 : attrib.int_data_list().push_back(point_owners->get_and_step());
[ # # ]
614 : : }
615 : :
616 [ # # ]: 0 : myEntity->append_simple_attribute_virt( attrib );
617 : :
618 : 0 : return CUBIT_SUCCESS;
619 : : }
620 : :
621 : :
622 : 0 : CubitStatus SubEntitySet::read_geometry( int& id, int& dimension,
623 : : DLIList<CubitVector*>& point_list,
624 : : DLIList<int>& point_connectivity,
625 : : DLIList<int>& topo_connectivity,
626 : : DLIList<int>& point_owners,
627 : : const CubitSimpleAttrib& attrib )
628 : : {
629 : : int i;
630 : :
631 : : // read metadata
632 : 0 : int ioffset = 0;
633 : 0 : int doffset = 0;
634 : 0 : id = attrib.int_data_list()[ioffset++];
635 : 0 : dimension = attrib.int_data_list()[ioffset++];
636 : 0 : int point_count = attrib.int_data_list()[ioffset++];
637 : 0 : int conn_count = attrib.int_data_list()[ioffset++];
638 : 0 : int topo_count = attrib.int_data_list()[ioffset++];
639 [ # # ]: 0 : int owner_count = conn_count ? 2 * point_count : 0;
640 : :
641 : : // consistancy checks
642 [ # # ][ # # ]: 0 : if( id < 0 || dimension < 0 || dimension > 3 ||
[ # # ][ # # ]
643 [ # # ][ # # ]: 0 : point_count < 0 || conn_count < 0 || topo_count < 0 )
644 : : {
645 [ # # ]: 0 : PRINT_ERROR("Invalid %s attribute read. Corrupted file?\n"
646 : : "\tId = %d\n\tDimension = %d\n\tPoint Count = %d\n"
647 : : "\tPoint Connectivity Count = %d\n"
648 : : "\tTopology Connectivity Count = %d\n",
649 : : attrib.string_data_list()[0].c_str(),
650 [ # # ]: 0 : id, dimension, point_count, conn_count, topo_count );
651 : 0 : return CUBIT_FAILURE;
652 : : }
653 : :
654 [ # # # # ]: 0 : if( (size_t)(conn_count + topo_count + owner_count + 5) != attrib.int_data_list().size() ||
[ # # ]
655 : 0 : attrib.int_data_list().size() < 5 )
656 : : {
657 [ # # ]: 0 : PRINT_ERROR("Invalid %s attribute read. Corrupted file?\n"
658 : : "\tInsufficient/Excess integer data:\n"
659 : : "\tAvailable integer data: %d\n"
660 : : "\tMetadata : 5\n"
661 : : "\tPoint Connectivity : %d\n"
662 : : "\tTopology Connectivity : %d\n"
663 : : "\tFacet Point Assoc. : %d\n"
664 : : "\tTotal Expected Ints : %d\n",
665 : : attrib.string_data_list()[0].c_str(),
666 : : (int) attrib.int_data_list().size(),
667 : : conn_count, topo_count, owner_count,
668 [ # # ]: 0 : conn_count + topo_count + owner_count + 5 );
669 : 0 : return CUBIT_FAILURE;
670 : : }
671 : :
672 [ # # ]: 0 : if( (size_t)(point_count * 3) != attrib.double_data_list().size() )
673 : : {
674 [ # # ]: 0 : PRINT_ERROR("Invalid %s attribute read. Corrupted file?\n"
675 : : "\tInsufficient/Excess real data: %d for %d points.\n",
676 : : attrib.string_data_list()[0].c_str(),
677 [ # # ]: 0 : (int) attrib.double_data_list().size(), point_count );
678 : 0 : return CUBIT_FAILURE;
679 : : }
680 : :
681 : : // read point coordinates
682 [ # # ]: 0 : for( i = 0; i < point_count; i++ )
683 : : {
684 : 0 : double x = attrib.double_data_list()[doffset++];
685 : 0 : double y = attrib.double_data_list()[doffset++];
686 : 0 : double z = attrib.double_data_list()[doffset++];
687 [ # # ][ # # ]: 0 : point_list.append( new CubitVector(x,y,z) );
688 : : }
689 : :
690 : : // read point connectivity (facets)
691 [ # # ]: 0 : for( i = 0; i < conn_count; i++ )
692 : 0 : point_connectivity.append( attrib.int_data_list()[ioffset++] );
693 : :
694 : : // read topology connectivity (children)
695 [ # # ]: 0 : for( i = 0; i < topo_count; i++ )
696 : 0 : topo_connectivity.append( attrib.int_data_list()[ioffset++] );
697 : :
698 : : // read facet point owners
699 [ # # ]: 0 : for( i = 0; i < owner_count; i++ )
700 : 0 : point_owners.append( attrib.int_data_list()[ioffset++] );
701 : :
702 : 0 : return CUBIT_SUCCESS;
703 : : }
704 : :
705 : :
706 : 0 : int SubEntitySet::get_geom_dimension( const CubitSimpleAttrib& attrib )
707 : : {
708 [ # # ]: 0 : assert(attrib.int_data_list().size() > 1);
709 : 0 : return attrib.int_data_list()[1];
710 : : }
711 : :
712 : 0 : int SubEntitySet::get_geom_id( const CubitSimpleAttrib& attrib )
713 : : {
714 [ # # ]: 0 : assert(attrib.int_data_list().size() > 1);
715 : 0 : return attrib.int_data_list()[0];
716 : : }
717 : :
718 : 0 : int SubEntitySet::get_segment_count( const CubitSimpleAttrib& attrib )
719 : : {
720 [ # # ]: 0 : assert(attrib.int_data_list().size() > 2);
721 : :
722 : 0 : int point_count = attrib.int_data_list()[2];
723 [ # # ]: 0 : if ( point_count == 0 )
724 : 0 : return 0;
725 : :
726 [ # # ]: 0 : assert( point_count > 1 );
727 : 0 : return point_count - 1;
728 : : }
729 : :
730 : 0 : CubitStatus SubEntitySet::save_geometry()
731 : : {
732 [ # # ]: 0 : if( !lowerOrderHead )
733 : 0 : return CUBIT_SUCCESS;
734 : :
735 [ # # ]: 0 : DLIList<CubitSimpleAttrib> old_list;
736 [ # # ][ # # ]: 0 : myEntity->get_simple_attribute(PARTITION_GEOM_ATTRIB_NAME, old_list);
[ # # ]
737 [ # # ][ # # ]: 0 : while (old_list.size())
738 : : {
739 [ # # ]: 0 : CubitSimpleAttrib old_attrib = old_list.pop();
740 [ # # ]: 0 : myEntity->remove_simple_attribute_virt(old_attrib);
741 [ # # ]: 0 : }
742 : :
743 [ # # ][ # # ]: 0 : CubitSimpleAttrib attrib(PARTITION_GEOM_ATTRIB_NAME);
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
744 : :
745 : 0 : CubitStatus result = CUBIT_SUCCESS;
746 [ # # ]: 0 : for( int i = 0; i < 2; i++ )
747 : : {
748 [ # # ]: 0 : PartitionEntity* list_node = i ? subEntityHead : lowerOrderHead;
749 [ # # ]: 0 : for( ; list_node; list_node = list_node->entitySetNext )
750 [ # # ][ # # ]: 0 : if(dynamic_cast<GeometryEntity*>(list_node) && !list_node->save(attrib))
[ # # ][ # # ]
[ # # ]
751 : 0 : result = CUBIT_FAILURE;
752 : : }
753 : :
754 [ # # ]: 0 : return result;
755 : : }
756 : :
757 : :
758 : 0 : void SubEntitySet::strip_attributes()
759 : : {
760 : 0 : strip_attributes( myEntity );
761 : 0 : }
762 : :
763 : :
|