|
Sierra Toolkit Version of the Day
|
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