|
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 #ifndef stk_mesh_baseImpl_FieldBaseImpl_hpp 00009 #define stk_mesh_baseImpl_FieldBaseImpl_hpp 00010 00011 #include <vector> 00012 #include <Shards_Array.hpp> 00013 #include <stk_mesh/base/DataTraits.hpp> 00014 00015 #include <stk_mesh/base/FieldState.hpp> 00016 #include <stk_mesh/base/FieldRestriction.hpp> 00017 00018 #include <stk_util/util/CSet.hpp> 00019 00020 namespace stk { 00021 namespace mesh { 00022 00023 class FieldBase; 00024 class MetaData; 00025 00026 namespace impl { 00027 00028 00029 00030 00031 class FieldBaseImpl { 00032 public: 00033 00034 MetaData & meta_data() const { 00035 return *m_meta_data ; 00036 } 00037 00038 unsigned ordinal() const { 00039 return m_ordinal ; 00040 } 00041 00042 const std::string & name() const { 00043 return m_name ; 00044 } 00045 00046 template<class Type> 00047 bool type_is() const { 00048 return m_data_traits.type_info == typeid(Type) ; 00049 } 00050 00051 const DataTraits & data_traits() const { 00052 return m_data_traits ; 00053 } 00054 00055 unsigned number_of_states() const { 00056 return m_num_states ; 00057 } 00058 00059 FieldState state() const { 00060 return m_this_state ; 00061 } 00062 00063 unsigned rank() const { 00064 return m_rank ; 00065 } 00066 00067 const shards::ArrayDimTag * const * dimension_tags() const { 00068 return m_dim_tags ; 00069 } 00070 00071 //not inline 00072 unsigned max_size( unsigned entity_rank) const ; 00073 00074 template<class A> 00075 const A * attribute() const { 00076 return m_attribute.template get<A>(); 00077 } 00078 00079 template<class A> 00080 const A * declare_attribute_no_delete(const A * a) { 00081 return m_attribute.template insert_no_delete<A>(a); 00082 } 00083 00084 template<class A> 00085 const A * declare_attribute_with_delete(const A * a) { 00086 return m_attribute.template insert_with_delete<A>(a); 00087 } 00088 00089 const FieldRestriction & restriction( unsigned entity_rank , const Part & part) const ; 00090 00091 const FieldRestrictionVector &restrictions() const ; 00092 00093 FieldBase * field_state( unsigned i) const { 00094 return m_field_states[i]; 00095 } 00096 00097 void insert_restriction( const char * arg_method , 00098 EntityRank arg_entity_rank , 00099 const Part & arg_part , 00100 const unsigned * arg_stride ); 00101 00102 void verify_and_clean_restrictions( const char * arg_method , 00103 const PartVector & arg_all_parts ); 00104 00105 00106 00107 void set_field_states( FieldBase ** field_states) { 00108 for (unsigned i = 0; i < m_num_states; ++i) { 00109 m_field_states[i] = field_states[i]; 00110 } 00111 } 00112 00113 FieldBaseImpl( 00114 MetaData * arg_mesh_meta_data , 00115 unsigned arg_ordinal , 00116 const std::string & arg_name , 00117 const DataTraits & arg_traits , 00118 unsigned arg_rank, 00119 const shards::ArrayDimTag * const * arg_dim_tags, 00120 unsigned arg_number_of_states , 00121 FieldState arg_this_state 00122 ); 00123 00124 ~FieldBaseImpl() {} 00125 00126 private: 00127 00128 FieldRestrictionVector & restrictions(); 00129 00130 const std::string m_name ; 00131 CSet m_attribute ; 00132 const DataTraits & m_data_traits ; 00133 MetaData * const m_meta_data ; 00134 const unsigned m_ordinal ; 00135 const unsigned m_num_states ; 00136 const FieldState m_this_state ; 00137 unsigned m_rank ; 00138 FieldRestrictionVector m_dim_map ; 00139 FieldBase * m_field_states[ MaximumFieldStates ]; 00140 const shards::ArrayDimTag * m_dim_tags[ MaximumFieldDimension ]; 00141 00142 //disallow copy and default constructors 00143 FieldBaseImpl(); 00144 FieldBaseImpl( const FieldBase & ); 00145 FieldBaseImpl & operator = ( const FieldBaseImpl & ); 00146 }; 00147 00148 00150 std::ostream & operator << ( std::ostream & , const FieldBaseImpl & ); 00151 00153 std::ostream & print( std::ostream & , 00154 const char * const , const FieldBase & ); 00155 00156 00157 } // namespace impl 00158 } // namespace mesh 00159 } // namespace stk 00160 00161 00162 #endif // stk_mesh_baseImpl_FieldBaseIml_hpp