Sierra Toolkit Version of the Day
MetaData.hpp
00001 /*------------------------------------------------------------------------*/
00002 /*                 Copyright 2010 Sandia Corporation.                     */
00003 /*  Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive   */
00004 /*  license for use of this work by or on behalf of the U.S. Government.  */
00005 /*  Export of this program may require a license from the                 */
00006 /*  United States Government.                                             */
00007 /*------------------------------------------------------------------------*/
00008 
00009 
00010 
00011 #ifndef stk_mesh_MetaData_hpp
00012 #define stk_mesh_MetaData_hpp
00013 
00014 //----------------------------------------------------------------------
00015 
00016 #include <iosfwd>
00017 #include <stk_util/util/SameType.hpp>
00018 #include <stk_util/util/StaticAssert.hpp>
00019 #include <stk_util/parallel/Parallel.hpp>
00020 #include <stk_mesh/base/Types.hpp>
00021 #include <stk_mesh/base/Part.hpp>
00022 #include <stk_mesh/base/Field.hpp>
00023 #include <stk_mesh/base/Property.hpp>
00024 #include <stk_mesh/baseImpl/PartRepository.hpp>
00025 
00026 #include <stk_mesh/baseImpl/FieldBaseImpl.hpp>
00027 #include <stk_mesh/baseImpl/FieldRepository.hpp>
00028 
00029 namespace stk {
00030 namespace mesh {
00031 
00037 std::ostream &
00038 print_entity_key( std::ostream & , const MetaData & , const EntityKey & );
00039 
00040 
00041 //----------------------------------------------------------------------
00048 class MetaData {
00049 public:
00050 
00051   //------------------------------------
00059   Part & universal_part() const { return *m_universal_part; }
00060 
00064   Part & locally_owned_part()  const { return *m_owns_part ; }
00065 
00069   Part & globally_shared_part() const { return *m_shares_part ; }
00070 
00072   //------------------------------------
00083 
00084   Part * get_part( const std::string & ,
00085                    const char * required_by = NULL ) const ;
00086 
00088   Part & get_part( unsigned ord ) const ;
00089 
00091   const PartVector & get_parts() const { return m_universal_part->subsets(); }
00092 
00100   Part & declare_part( const std::string & , EntityRank rank );
00101 
00107   Part & declare_part( const std::string & );
00108 
00116   Part & declare_part( const PartVector & );
00117 
00119   void declare_part_subset( Part & superset , Part & subset );
00120 
00130   void declare_part_relation( Part & root_part ,
00131                               relation_stencil_ptr stencil ,
00132                               Part & target_part );
00133 
00140   template<class T>
00141   const T * declare_attribute_with_delete( Part & , const T *);
00142   template<class T>
00143   const T * declare_attribute_no_delete( Part & , const T *);
00144 
00146   //------------------------------------
00153   const std::vector<std::string> & entity_rank_names() const
00154     { return m_entity_rank_names ; }
00155 
00156   std::vector<std::string>::size_type entity_rank_count() const
00157     { return m_entity_rank_names.size(); }
00158 
00159   const std::string & entity_rank_name( unsigned ) const ;
00160 
00162   //------------------------------------
00174   template< class field_type >
00175   field_type * get_field( const std::string & name ) const ;
00176 
00178   const FieldVector & get_fields() const {
00179     return m_field_repo.get_fields() ;
00180   }
00181 
00189   template< class field_type >
00190   field_type & declare_field( const std::string & name ,
00191                               unsigned number_of_states = 1 );
00192 
00198   template<class T>
00199   const T * declare_attribute_with_delete( FieldBase & , const T *);
00200   template<class T>
00201   const T * declare_attribute_no_delete( FieldBase & , const T *);
00202 
00220   template< class PointerFieldType , class ReferencedFieldType >
00221   void declare_field_relation( PointerFieldType & pointer_field ,
00222                                relation_stencil_ptr stencil ,
00223                                ReferencedFieldType & referenced_field );
00224 
00226   const std::vector<FieldRelation> & get_field_relations() const
00227     { return m_field_relations ; }
00228 
00230   //------------------------------------
00231 
00232   template<class T>
00233   const T * get_attribute() const ;
00234 
00239   template<class T>
00240   const T * declare_attribute_with_delete( const T * );
00241 
00242   template<class T>
00243   const T * declare_attribute_no_delete( const T * );
00244 
00245   template<class T>
00246   bool remove_attribute( const T * );
00247 
00248   //------------------------------------
00260   template< typename DataType >
00261   Property<DataType> * get_property( const std::string & name ) const ;
00262 
00264   const std::vector< PropertyBase * > & get_properties() const
00265     { return m_properties ; }
00266 
00273   template< typename DataType >
00274   Property<DataType> & declare_property( const std::string & name ,
00275                                          unsigned size = 1 );
00276 
00278   void put_property( PropertyBase & , Part & );
00279 
00281   //------------------------------------
00287   explicit MetaData( const std::vector<std::string>& entity_rank_names );
00288 
00297   void commit();
00298 
00300   bool is_commit() const { return m_commit ; }
00301 
00305   ~MetaData();
00306 
00308   //------------------------------------
00309 
00313   void assert_committed( const char * ) const ;
00314 
00315   void assert_not_committed( const char * ) const ;
00316 
00317   void assert_same_mesh_meta_data( const char * , const MetaData & ) const ;
00318 
00319   void assert_entity_rank( const char * , unsigned ) const ;
00320 
00322   //------------------------------------
00329   FieldBase * declare_field_base(
00330     const std::string & arg_name,
00331     const DataTraits  & arg_traits ,
00332     unsigned            arg_rank ,
00333     const shards::ArrayDimTag * const * arg_dim_tags ,
00334     unsigned arg_num_states );
00335 
00338   void declare_field_restriction( FieldBase      & arg_field ,
00339                                   unsigned         arg_entity_rank ,
00340                                   const Part     & arg_part ,
00341                                   const unsigned * arg_stride );
00343 private:
00344 
00345   MetaData();                                  
00346   MetaData( const MetaData & );                
00347   MetaData & operator = ( const MetaData & );  
00348 
00349   bool   m_commit ;
00350   impl::PartRepository m_part_repo ;
00351   CSet   m_attributes ;
00352 
00353   Part * m_universal_part ;
00354   Part * m_owns_part ;
00355   Part * m_shares_part ;
00356 
00357 
00358   impl::FieldRepository        m_field_repo ;
00359 
00360   std::vector< FieldRelation > m_field_relations ;
00361   std::vector< PropertyBase* > m_properties ;
00362   std::vector< std::string >   m_entity_rank_names ;
00363 
00364 
00365   Property<void> * get_property_base( const std::string & ,
00366                                       const std::type_info & ,
00367                                       unsigned = 0 ) const ;
00368 
00369   void internal_declare_field_relation( FieldBase & ,
00370                                         relation_stencil_ptr ,
00371                                         FieldBase & );
00372 
00373   void clean_field_restrictions();
00374 };
00375 
00377 void verify_parallel_consistency( const MetaData & , ParallelMachine );
00378 
00387 template< class field_type >
00388 field_type & put_field( field_type & field ,
00389                         EntityRank  entity_rank ,
00390                         const Part & part );
00391 
00395 template< class field_type >
00396 field_type & put_field( field_type & field ,
00397                         EntityRank  entity_rank ,
00398                         const Part & part ,
00399                         unsigned     n1 );
00400 
00401 template< class field_type >
00402 field_type & put_field( field_type & field ,
00403                         EntityRank  entity_rank ,
00404                         const Part & part ,
00405                         unsigned     n1 ,
00406                         unsigned     n2 );
00407 
00408 template< class field_type >
00409 field_type & put_field( field_type & field ,
00410                         EntityRank  entity_rank ,
00411                         const Part & part ,
00412                         unsigned     n1 ,
00413                         unsigned     n2 ,
00414                         unsigned     n3 );
00415 
00416 template< class field_type >
00417 field_type & put_field( field_type & field ,
00418                         EntityRank  entity_rank ,
00419                         const Part & part ,
00420                         unsigned     n1 ,
00421                         unsigned     n2 ,
00422                         unsigned     n3 ,
00423                         unsigned     n4 );
00424 
00425 template< class field_type >
00426 field_type & put_field( field_type & field ,
00427                         EntityRank  entity_rank ,
00428                         const Part & part ,
00429                         unsigned     n1 ,
00430                         unsigned     n2 ,
00431                         unsigned     n3 ,
00432                         unsigned     n4 ,
00433                         unsigned     n5 );
00434 
00435 template< class field_type >
00436 field_type & put_field( field_type & field ,
00437                         EntityRank  entity_rank ,
00438                         const Part & part ,
00439                         unsigned     n1 ,
00440                         unsigned     n2 ,
00441                         unsigned     n3 ,
00442                         unsigned     n4 ,
00443                         unsigned     n5 ,
00444                         unsigned     n6 );
00445 
00446 template< class field_type >
00447 field_type & put_field( field_type & field ,
00448                         EntityRank  entity_rank ,
00449                         const Part & part ,
00450                         unsigned     n1 ,
00451                         unsigned     n2 ,
00452                         unsigned     n3 ,
00453                         unsigned     n4 ,
00454                         unsigned     n5 ,
00455                         unsigned     n6 ,
00456                         unsigned     n7 );
00460 } // namespace mesh
00461 } // namespace stk
00462 
00463 //----------------------------------------------------------------------
00464 //----------------------------------------------------------------------
00465 
00466 #ifndef DOXYGEN_COMPILE
00467 
00468 namespace stk {
00469 namespace mesh {
00470 
00471 inline
00472 Part & MetaData::get_part( unsigned ord ) const
00473 { return * m_universal_part->subsets()[ord] ; }
00474 
00475 template< class field_type >
00476 inline
00477 field_type * MetaData::get_field( const std::string & name ) const
00478 {
00479   typedef FieldTraits< field_type > Traits ;
00480 
00481   const DataTraits & dt = data_traits< typename Traits::data_type >();
00482 
00483   const shards::ArrayDimTag * tags[8] ;
00484 
00485   Traits::assign_tags( tags );
00486 
00487   FieldBase * const field =
00488     m_field_repo.get_field( "stk::mesh::MetaData::get_field" ,
00489                           name , dt , Traits::Rank , tags , 0 );
00490 
00491   return static_cast< field_type * >( field );
00492 }
00493 
00494 template< class field_type >
00495 inline
00496 field_type & MetaData::declare_field( const std::string & name ,
00497                                       unsigned number_of_states )
00498 {
00499   typedef FieldTraits< field_type > Traits ;
00500 
00501   const DataTraits & dt = data_traits< typename Traits::data_type >();
00502 
00503   const shards::ArrayDimTag * tags[8] ;
00504 
00505   Traits::assign_tags( tags );
00506 
00507   return * static_cast< field_type * >(
00508     declare_field_base( name , dt , Traits::Rank , tags , number_of_states ) );
00509 }
00510 
00511 template< class field_type >
00512 inline
00513 field_type & put_field(
00514   field_type & field ,
00515   EntityRank entity_rank ,
00516   const Part & part )
00517 {
00518   typedef FieldTraits< field_type > Traits ;
00519   typedef typename Traits::Helper   Helper ;
00520 
00521   unsigned stride[8] ;
00522 
00523   Helper::assign( stride );
00524 
00525   field.mesh_meta_data().
00526     declare_field_restriction( field, entity_rank, part, stride);
00527 
00528   return field ;
00529 }
00530 
00531 template< class field_type >
00532 inline
00533 field_type & put_field( field_type &field ,
00534                         EntityRank entity_rank ,
00535                         const Part &part ,
00536                         unsigned    n1 )
00537 {
00538   typedef FieldTraits< field_type > Traits ;
00539   typedef typename Traits::Helper   Helper ;
00540 
00541   unsigned stride[8] ;
00542 
00543   Helper::assign( stride , n1 );
00544 
00545   field.mesh_meta_data().
00546     declare_field_restriction( field, entity_rank, part, stride);
00547 
00548   return field ;
00549 }
00550 
00551 template< class field_type >
00552 inline
00553 field_type & put_field( field_type &field ,
00554                         EntityRank entity_rank ,
00555                         const Part &part ,
00556                         unsigned    n1 ,
00557                         unsigned    n2 )
00558 {
00559   typedef FieldTraits< field_type > Traits ;
00560   typedef typename Traits::Helper   Helper ;
00561 
00562   unsigned stride[8] ;
00563 
00564   Helper::assign( stride , n1 , n2 );
00565 
00566   field.mesh_meta_data().
00567     declare_field_restriction( field, entity_rank, part, stride);
00568 
00569   return field ;
00570 }
00571 
00572 template< class field_type >
00573 inline
00574 field_type & put_field( field_type &field ,
00575                         EntityRank entity_rank ,
00576                         const Part &part ,
00577                         unsigned    n1 ,
00578                         unsigned    n2 ,
00579                         unsigned    n3 )
00580 {
00581   typedef FieldTraits< field_type > Traits ;
00582   typedef typename Traits::Helper   Helper ;
00583 
00584   unsigned stride[8] ;
00585 
00586   Helper::assign( stride , n1 , n2 , n3 );
00587 
00588   field.mesh_meta_data().
00589     declare_field_restriction( field, entity_rank, part, stride);
00590 
00591   return field ;
00592 }
00593 
00594 template< class field_type >
00595 inline
00596 field_type & put_field( field_type &field ,
00597                         EntityRank entity_rank ,
00598                         const Part &part ,
00599                         unsigned    n1 ,
00600                         unsigned    n2 ,
00601                         unsigned    n3 ,
00602                         unsigned    n4 )
00603 {
00604   typedef FieldTraits< field_type > Traits ;
00605   typedef typename Traits::Helper   Helper ;
00606 
00607   unsigned stride[8] ;
00608 
00609   Helper::assign( stride , n1 , n2 , n3 , n4 );
00610 
00611   field.mesh_meta_data().
00612     declare_field_restriction( field, entity_rank, part, stride);
00613 
00614   return field ;
00615 }
00616 
00617 template< class field_type >
00618 inline
00619 field_type & put_field( field_type &field ,
00620                         EntityRank entity_rank ,
00621                         const Part &part ,
00622                         unsigned    n1 ,
00623                         unsigned    n2 ,
00624                         unsigned    n3 ,
00625                         unsigned    n4 ,
00626                         unsigned    n5 )
00627 {
00628   typedef FieldTraits< field_type > Traits ;
00629   typedef typename Traits::Helper   Helper ;
00630 
00631   unsigned stride[8] ;
00632 
00633   Helper::assign( stride , n1 , n2 , n3 , n4, n5 );
00634 
00635   field.mesh_meta_data().
00636     declare_field_restriction( field, entity_rank, part, stride);
00637 
00638   return field ;
00639 }
00640 
00641 template< class field_type >
00642 inline
00643 field_type & put_field( field_type &field ,
00644                         EntityRank entity_rank ,
00645                         const Part &part ,
00646                         unsigned    n1 ,
00647                         unsigned    n2 ,
00648                         unsigned    n3 ,
00649                         unsigned    n4 ,
00650                         unsigned    n5 ,
00651                         unsigned    n6 )
00652 {
00653   typedef FieldTraits< field_type > Traits ;
00654   typedef typename Traits::Helper   Helper ;
00655 
00656   unsigned stride[8] ;
00657 
00658   Helper::assign( stride , n1 , n2 , n3 , n4, n5, n6 );
00659 
00660   field.mesh_meta_data().
00661     declare_field_restriction( field, entity_rank, part, stride);
00662 
00663   return field ;
00664 }
00665 
00666 template< class field_type >
00667 inline
00668 field_type & put_field( field_type &field ,
00669                         EntityRank entity_rank ,
00670                         const Part &part ,
00671                         unsigned    n1 ,
00672                         unsigned    n2 ,
00673                         unsigned    n3 ,
00674                         unsigned    n4 ,
00675                         unsigned    n5 ,
00676                         unsigned    n6 ,
00677                         unsigned    n7 )
00678 {
00679   typedef FieldTraits< field_type > Traits ;
00680   typedef typename Traits::Helper   Helper ;
00681 
00682   unsigned stride[8] ;
00683 
00684   Helper::assign( stride , n1 , n2 , n3 , n4, n5, n6, n7 );
00685 
00686   field.mesh_meta_data().
00687     declare_field_restriction( field, entity_rank, part, stride);
00688 
00689   return field ;
00690 }
00691 
00692 template<class T>
00693 inline
00694 const T *
00695 MetaData::declare_attribute_with_delete( const T * a )
00696 {
00697   assert_not_committed( "stk::mesh::MetaData::declare_attribute_with_delete" );
00698   return m_attributes.insert_with_delete( a );
00699 }
00700 
00701 template<class T>
00702 inline
00703 const T *
00704 MetaData::get_attribute() const
00705 { return m_attributes.get<T>(); }
00706 
00707 template<class T>
00708 inline
00709 const T *
00710 MetaData::declare_attribute_no_delete( const T * a )
00711 {
00712   assert_not_committed( "stk::mesh::MetaData::declare_attribute_no_delete" );
00713   return m_attributes.insert_no_delete( a );
00714 }
00715 
00716 template<class T>
00717 inline
00718 bool
00719 MetaData::remove_attribute( const T * a )
00720 {
00721   return m_attributes.remove( a );
00722 }
00723 
00724 template<class T>
00725 inline
00726 const T *
00727 MetaData::declare_attribute_with_delete( Part & p , const T * a )
00728 {
00729   assert_not_committed( "stk::mesh::MetaData::declare_attribute_with_delete" );
00730   return m_part_repo.declare_attribute_with_delete( p, a );
00731 }
00732 
00733 template<class T>
00734 inline
00735 const T *
00736 MetaData::declare_attribute_no_delete( Part & p , const T * a )
00737 {
00738   assert_not_committed( "stk::mesh::MetaData::declare_attribute_no_delete" );
00739   return m_part_repo.declare_attribute_no_delete( p, a );
00740 }
00741 
00742 template<class T>
00743 inline
00744 const T *
00745 MetaData::declare_attribute_with_delete( FieldBase & f , const T * a )
00746 {
00747   assert_not_committed( "stk::mesh::MetaData::declare_attribute_with_delete" );
00748   return m_field_repo.declare_attribute_with_delete(f, a);
00749 }
00750 
00751 template<class T>
00752 inline
00753 const T *
00754 MetaData::declare_attribute_no_delete( FieldBase & f , const T * a )
00755 {
00756   assert_not_committed( "stk::mesh::MetaData::declare_attribute_no_delete" );
00757   return m_field_repo.declare_attribute_no_delete(f, a);
00758 }
00759 
00760 //----------------------------------------------------------------------
00761 
00762 template< class PointerFieldType , class ReferencedFieldType >
00763 inline
00764 void MetaData::declare_field_relation(
00765   PointerFieldType & pointer_field ,
00766   relation_stencil_ptr stencil ,
00767   ReferencedFieldType & referenced_field )
00768 {
00769   typedef typename FieldTraits< PointerFieldType >::data_type pointer_type ;
00770   typedef typename FieldTraits< ReferencedFieldType >::data_type data_type ;
00771 
00772   StaticAssert< SameType< pointer_type , data_type * >::value >::ok();
00773   StaticAssert< FieldTraits< PointerFieldType >::Rank == 1 >::ok();
00774 
00775   internal_declare_field_relation( pointer_field , stencil , referenced_field );
00776 }
00777 
00778 //----------------------------------------------------------------------
00779 
00780 template< typename DataType >
00781 inline
00782 Property<DataType> *
00783 MetaData::get_property( const std::string & name ) const
00784 {
00785   Property<void> * const pv = get_property_base( name, typeid(DataType) );
00786   return pv ? pv->property<DataType>() : (Property<DataType>*) NULL ;
00787 }
00788 
00789 template< typename DataType >
00790 inline
00791 Property<DataType> &
00792 MetaData::declare_property( const std::string & name , unsigned size )
00793 {
00794   Property<void> * pv = get_property_base(name,typeid(DataType),size);
00795   Property<DataType> * prop = NULL ;
00796 
00797   if ( pv != NULL ) {
00798     prop = pv->property<DataType>();
00799   }
00800   else {
00801     if ( 1 == size ) {
00802       pv = prop = new Property<DataType>( *this , m_properties.size() , name );
00803     }
00804     else {
00805       pv = prop = new Property< std::vector<DataType> >(
00806                     *this , m_properties.size() , name , size );
00807     }
00808     m_properties.push_back( pv );
00809   }
00810   return *prop ;
00811 }
00812 
00813 inline
00814 void MetaData::put_property( PropertyBase & prop , Part & part )
00815 {
00816   prop.add_property( part.mesh_meta_data_ordinal() );
00817 }
00818 
00819 } // namespace mesh
00820 } // namespace stk
00821 
00822 #endif /* DOXYGEN_COMPILE */
00823 
00824 //----------------------------------------------------------------------
00825 //----------------------------------------------------------------------
00826 
00827 #endif /* stk_mesh_MetaData_hpp */
00828 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends