20 #pragma warning( disable : 4786 )
47 #define INS_ID( stringvar, prefix, id ) sprintf( stringvar, prefix, id )
56 assert( impl != NULL );
85 std::vector< WriteTemplate::MaterialSetData >::iterator iter;
87 for( iter = matset_info.begin(); iter != matset_info.end(); ++iter )
88 delete( *iter ).elements;
96 const std::vector< std::string >& ,
104 if( NULL == strstr( file_name,
".template" ) )
return MB_FAILURE;
106 std::vector< EntityHandle > matsets, dirsets, neusets;
117 std::copy( this_range.
begin(), this_range.
end(), std::back_inserter( matsets ) );
120 std::copy( this_range.
begin(), this_range.
end(), std::back_inserter( dirsets ) );
123 std::copy( this_range.
begin(), this_range.
end(), std::back_inserter( neusets ) );
128 for(
const EntityHandle* iter = ent_handles; iter < ent_handles + num_sets; ++iter )
131 matsets.push_back( *iter );
133 dirsets.push_back( *iter );
135 neusets.push_back( *iter );
142 std::vector< WriteTemplate::MaterialSetData > matset_info;
143 std::vector< WriteTemplate::DirichletSetData > dirset_info;
144 std::vector< WriteTemplate::NeumannSetData > neuset_info;
185 std::vector< WriteTemplate::MaterialSetData >& matset_info,
186 std::vector< WriteTemplate::NeumannSetData >& neuset_info,
187 std::vector< WriteTemplate::DirichletSetData >& dirset_info,
188 std::vector< EntityHandle >& matsets,
189 std::vector< EntityHandle >& neusets,
190 std::vector< EntityHandle >& dirsets )
192 std::vector< EntityHandle >::iterator vector_iter, end_vector_iter;
200 vector_iter = matsets.begin();
201 end_vector_iter = matsets.end();
205 std::vector< EntityHandle > parent_meshsets;
211 int highest_dimension_of_element_matsets = 0;
213 for( vector_iter = matsets.begin(); vector_iter != matsets.end(); ++vector_iter )
229 entity_iter = dummy_range.
begin();
233 if( entity_iter != dummy_range.
end() )
242 MB_SET_ERR( MB_FAILURE,
"Couldn't get matset id from a tag for an element matset" );
256 --end_elem_range_iter;
259 MB_SET_ERR( MB_FAILURE,
"Entities in matset " <<
id <<
" not of common type" );
264 if( dimension > highest_dimension_of_element_matsets ) highest_dimension_of_element_matsets = dimension;
269 std::vector< EntityHandle > tmp_conn;
276 MB_SET_ERR( MB_FAILURE,
"Element type in matset " <<
id <<
" didn't get set correctly" );
290 if( !neusets.empty() )
295 unsigned char bit = 0x1;
300 matset_info.push_back( matset_data );
307 if( highest_dimension_of_element_matsets < 2 )
310 mesh_info.
num_dim = highest_dimension_of_element_matsets;
315 end_range_iter = mesh_info.
nodes.
end();
321 vector_iter = dirsets.begin();
322 end_vector_iter = dirsets.end();
324 for( ; vector_iter != end_vector_iter; ++vector_iter )
333 MB_SET_ERR( MB_FAILURE,
"Couldn't get id tag for dirset " <<
id );
338 std::vector< EntityHandle > node_vector;
342 MB_SET_ERR( MB_FAILURE,
"Couldn't get nodes in dirset " <<
id );
345 std::vector< EntityHandle >::iterator iter, end_iter;
346 iter = node_vector.begin();
347 end_iter = node_vector.end();
350 unsigned char node_marked = 0;
352 for( ; iter != end_iter; ++iter )
357 if( 0x1 == node_marked ) dirset_data.
nodes.push_back( *iter );
362 dirset_info.push_back( dirset_data );
366 vector_iter = neusets.begin();
367 end_vector_iter = neusets.end();
369 for( ; vector_iter != end_vector_iter; ++vector_iter )
381 Range forward_elems, reverse_elems;
382 if(
get_neuset_elems( *vector_iter, 0, forward_elems, reverse_elems ) == MB_FAILURE )
return MB_FAILURE;
388 neuset_info.push_back( neuset_data );
398 unsigned char element_marked = 0;
405 if( 0x1 == element_marked )
407 neuset_data.
elements.push_back( *iter );
410 neuset_data.
side_numbers.push_back( ( sense == 1 ? 1 : 2 ) );
414 std::vector< EntityHandle > parents;
420 MB_SET_ERR( MB_FAILURE,
"Couldn't get adjacencies for neuset" );
423 if( !parents.empty() )
426 for(
unsigned int k = 0; k < parents.size(); k++ )
430 int side_no, this_sense, this_offset;
431 if( 0x1 == element_marked &&
433 this_sense == sense )
435 neuset_data.
elements.push_back( parents[k] );
443 MB_SET_ERR( MB_FAILURE,
"No parent element exists for element in neuset " << neuset_data.
id );
457 bool transform_needed =
true;
460 int num_coords_to_fill = transform_needed ? 3 : dimension;
462 std::vector< double* > coord_arrays( 3 );
463 coord_arrays[0] =
new double[num_nodes];
464 coord_arrays[1] =
new double[num_nodes];
465 coord_arrays[2] = NULL;
467 if( num_coords_to_fill == 3 ) coord_arrays[2] =
new double[num_nodes];
472 delete[] coord_arrays[0];
473 delete[] coord_arrays[1];
474 if( coord_arrays[2] )
delete[] coord_arrays[2];
478 if( transform_needed )
480 double trans_matrix[16];
484 for(
int i = 0; i < num_nodes; i++ )
489 vec2[0] = coord_arrays[0][i];
490 vec2[1] = coord_arrays[1][i];
491 vec2[2] = coord_arrays[2][i];
493 for(
int row = 0; row < 3; row++ )
496 for(
int col = 0; col < 3; col++ )
497 vec1[row] += ( trans_matrix[( row * 4 ) + col] * vec2[col] );
500 coord_arrays[0][i] = vec1[0];
501 coord_arrays[1][i] = vec1[1];
502 coord_arrays[2][i] = vec1[2];
511 delete[] coord_arrays[0];
512 delete[] coord_arrays[1];
513 if( coord_arrays[2] )
delete[] coord_arrays[2];
520 std::vector< WriteTemplate::MaterialSetData >& matset_data,
521 std::vector< WriteTemplate::NeumannSetData >& )
524 std::vector< int > connect;
530 connect.reserve( 31 );
534 for( i = 0; i < matset_data.size(); i++ )
536 matset = matset_data[i];
551 if(
false )
return MB_FAILURE;
562 int coord_size, ncoords;
564 coord_size = mesh_info.
num_dim;
565 std::cout <<
"Coord_size = " << coord_size << std::endl;
569 std::cout <<
"ncoords = " << ncoords << std::endl;
584 if( strlen( (
const char*)filename ) == 0 )
586 MB_SET_ERR( MB_FAILURE,
"Output filename not specified" );
594 MB_SET_ERR( MB_FAILURE,
"Cannot open " << filename );
602 Range& forward_elems,
603 Range& reverse_elems )
605 Range neuset_elems, neuset_meshsets;
614 if( MB_FAILURE == result )
return result;
622 if( range_iter != neuset_elems.
end() )
625 neuset_elems.
erase( range_iter, neuset_elems.
end() );
635 dum_it = neuset_elems.
begin();
639 if( current_sense == 1 || current_sense == 0 )
641 if( current_sense == -1 || current_sense == 0 )
646 for( range_iter = neuset_meshsets.
begin(); range_iter != neuset_meshsets.
end(); ++range_iter )
650 if( 0 == sense_tag || MB_FAILURE ==
mbImpl->
tag_get_data( sense_tag, &( *range_iter ), 1, &this_sense ) )
654 get_neuset_elems( *range_iter, this_sense * current_sense, forward_elems, reverse_elems );