9 #include <stk_mesh/base/Trace.hpp> 11 #include <stk_mesh/baseImpl/FieldRepository.hpp> 13 #include <stk_util/util/string_case_compare.hpp> 25 std::string print_field_type(
const DataTraits & arg_traits ,
27 const shards::ArrayDimTag *
const * arg_tags )
29 std::ostringstream oss;
31 oss << arg_traits.name ;
32 for (
unsigned i = 0 ; i < arg_rank ; ++i ) {
33 oss <<
"," << arg_tags[i]->name();
44 void verify_field_type(
const char * arg_method ,
45 const FieldBase & arg_field ,
46 const DataTraits & arg_traits ,
48 const shards::ArrayDimTag *
const * arg_dim_tags ,
49 unsigned arg_num_states )
52 const bool ok_traits = arg_traits.is_void
53 || & arg_traits == & arg_field.data_traits();
55 const bool ok_number_states =
56 ! arg_num_states || arg_num_states == arg_field.number_of_states();
58 bool ok_dimension = ! arg_rank || arg_rank == arg_field.rank() ||
59 arg_rank + 1 == arg_field.rank() ||
60 arg_rank - 1 == arg_field.rank() ;
62 const unsigned check_rank = arg_rank < arg_field.rank() ?
63 arg_rank : arg_field.rank() ;
65 for (
unsigned i = 0 ; i < check_rank && ok_dimension ; ++i ) {
66 ok_dimension = arg_dim_tags[i] == arg_field.dimension_tags()[i] ;
69 ThrowErrorMsgIf( ! ok_traits || ! ok_number_states || ! ok_dimension,
70 arg_method <<
" FAILED: Existing field = " <<
71 print_field_type( arg_field.data_traits() ,
73 arg_field.dimension_tags() ) <<
74 "[ name = \"" << arg_field.name() <<
75 "\" , #states = " << arg_field.number_of_states() <<
" ]" <<
76 " Expected field info = " <<
77 print_field_type( arg_traits , arg_rank , arg_dim_tags ) <<
78 "[ #states = " << arg_num_states <<
" ]");
85 FieldBase * FieldRepository::get_field(
86 const char * arg_method ,
87 const std::string & arg_name ,
88 const DataTraits & arg_traits ,
90 const shards::ArrayDimTag *
const * arg_dim_tags ,
91 unsigned arg_num_states )
const 93 FieldBase * f = NULL ;
95 for ( std::vector<FieldBase*>::const_iterator
96 j = m_fields.begin() ;
97 j != m_fields.end() && NULL == f ; ++j ) {
102 verify_field_type( arg_method , *f , arg_traits ,
103 arg_rank , arg_dim_tags , arg_num_states );
109 FieldBase * FieldRepository::declare_field(
110 const std::string & arg_name ,
111 const DataTraits & arg_traits ,
113 const shards::ArrayDimTag *
const * arg_dim_tags ,
114 unsigned arg_num_states ,
115 MetaData * arg_meta_data )
117 TraceIf(
"stk_classic::mesh::impl::FieldRepository::declare_field", LOG_FIELD);
119 static const char* reserved_state_suffix[6] = {
130 for (
unsigned i = 0 ; i < 6 ; ++i ) {
131 const int len_name = arg_name.size();
132 const int len_suffix = std::strlen( reserved_state_suffix[i] );
133 const int offset = len_name - len_suffix ;
135 const char *
const name_suffix = arg_name.c_str() + offset ;
136 ThrowErrorMsgIf(
equal_case( name_suffix , reserved_state_suffix[i] ),
137 "For name = \"" << name_suffix <<
138 "\" CANNOT HAVE THE RESERVED STATE SUFFIX \"" <<
139 reserved_state_suffix[i] <<
"\"" );
145 FieldBase * f[ MaximumFieldStates ] ;
148 "FieldRepository::declare_field" ,
156 if ( NULL != f[0] ) {
157 for (
unsigned i = 1 ; i < arg_num_states ; ++i ) {
158 f[i] = f[0]->m_impl.field_state(static_cast<FieldState>(i));
164 std::string field_names[ MaximumFieldStates ];
166 field_names[0] = arg_name ;
168 if ( 2 == arg_num_states ) {
169 field_names[1] = arg_name ;
170 field_names[1].append( reserved_state_suffix[0] );
173 for (
unsigned i = 1 ; i < arg_num_states ; ++i ) {
174 field_names[i] = arg_name ;
175 field_names[i].append( reserved_state_suffix[i] );
179 for (
unsigned i = 0 ; i < arg_num_states ; ++i ) {
181 f[i] =
new FieldBase(
192 m_fields.push_back( f[i] );
195 for (
unsigned i = 0 ; i < arg_num_states ; ++i ) {
196 f[i]->m_impl.set_field_states( f );
203 void FieldRepository::verify_and_clean_restrictions(
204 const char * arg_method ,
205 const Part& superset,
const Part& subset,
208 TraceIf(
"stk_classic::mesh::impl::FieldRepository::verify_and_clean_restrictions", LOG_FIELD);
210 for ( FieldVector::iterator f = m_fields.begin() ; f != m_fields.end() ; ++f ) {
211 (*f)->m_impl.verify_and_clean_restrictions( arg_method, superset, subset, arg_all_parts );
215 FieldRepository::~FieldRepository() {
217 FieldVector::iterator j = m_fields.begin();
218 for ( ; j != m_fields.end() ; ++j ) {
delete *j ; }
const stk_classic::mesh::FieldBase * get_field(const FieldIdMap &field_id_map, int field_id)
bool equal_case(const char *lhs, const char *rhs)
Case-insensitive equality compare.
std::vector< Part *> PartVector
Collections of parts are frequently maintained as a vector of Part pointers.
FieldState
Enumeration of states for multi-state fields.