bool in_closure( const Entity & e_from , const Entity & e ) { PairIterRelation rel = e_from.relations(); bool not_in_closure = & e_from != & e ; for ( ; not_in_closure && rel ; ++rel ) { if ( rel->forward() ) { not_in_closure = ! in_closure( * rel->entity() , e ); } } return ! not_in_closure ; }
void closure( const Entity & e_from , std::vector<Entity*> & eset ) { PairIterRelation rel = e_from.relations(); for ( ; rel ; ++rel ) { if ( rel->forward() ) { Entity * const e = rel->entity(); std::vector<Entity*>::iterator i = eset.begin(); std::vector<Entity*>::iterator j = eset.end(); i = std::lower_bound( i , j , e , LessEntityPointer() ); if ( i == j || e != *i ) { eset.push_back( e ); closure( *e , eset ); } } } }
void BulkData::internal_propagate_relocation( Entity & entity ) { PairIterRelation rel = entity.relations(); for ( ; rel ; ++rel ) { if ( rel->forward() ) { Entity & e_to = * rel->entity(); set_field_relations( entity, e_to, rel->identifier(), rel->kind() ); } else { Entity & e_from = * rel->entity(); set_field_relations( e_from, entity, rel->identifier(), rel->kind() ); } } }
void BulkData::internal_propagate_part_changes( Entity & entity , const PartSet & removed ) { const EntityType etype = entity.entity_type(); Part * const owns_part = & m_mesh_meta_data.locally_owned_part(); Part * const uses_part = & m_mesh_meta_data.locally_used_part(); PairIterRelation rel = entity.relations(); for ( ; rel ; ++rel ) { const unsigned rel_ident = rel->identifier(); const unsigned rel_kind = rel->kind(); if ( rel->forward() ) { Entity & e_to = * rel->entity(); PartSet to_del ; PartSet to_add ; if ( ! removed.empty() ) { const EntityType t_to = e_to.entity_type(); // Deduce parts for 'e_to' from all upward relations. // Any non-parallel part that I removed that is not deduced for // 'e_to' must be removed from 'e_to' deduce_part_relations( e_to , to_add ); to_del.reserve( removed.size() ); for ( PartSet::const_iterator j = removed.begin() ; j != removed.end() ; ++j ) { Part * const p = *j ; if ( p != owns_part && p != uses_part && ! contain( to_add , *p ) ) { to_del.push_back( p ); // What if removing a part with a part-relation ? const std::vector<PartRelation> & part_rel = m_mesh_meta_data.get_part_relations(); for ( std::vector<PartRelation>::const_iterator k = part_rel.begin() ; k != part_rel.end() ; ++k ) { const PartRelation & stencil = *k ; if ( p == stencil.m_root && 0 <= (*stencil.m_function)(etype,t_to,rel_ident,rel_kind) && ! contain( to_add , * stencil.m_target ) ) { } } } } } else { deduce_part_relations( entity , e_to , rel_ident , rel_kind , to_add ); } internal_change_entity_parts( e_to , to_add , to_del ); set_field_relations( entity, e_to, rel_ident , rel_kind ); } else { Entity & e_from = * rel->entity(); set_field_relations( e_from, entity, rel_ident, rel_kind ); } } }