Esempio n. 1
0
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() );
    }
  }
}
Esempio n. 2
0
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 );
    }
  }
}