LCOV - code coverage report
Current view: top level - geom/virtual - SubEntitySet.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 10 411 2.4 %
Date: 2020-06-30 00:58:45 Functions: 1 37 2.7 %
Branches: 17 802 2.1 %

           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                 :            :   

Generated by: LCOV version 1.11