Mesh Oriented datABase  (version 5.6.0)
An array-based unstructured mesh library
moab::WriteTemplate Class Reference

#include <WriteTemplate.hpp>

+ Inheritance diagram for moab::WriteTemplate:
+ Collaboration diagram for moab::WriteTemplate:

Classes

struct  DirichletSetData
 struct used to hold data for each nodeset to be output; used by initialize_file to initialize the file header for increased speed More...
 
struct  MaterialSetData
 struct used to hold data for each block to be output; used by initialize_file to initialize the file header for increased speed More...
 
class  MeshInfo
 contains the general information about a mesh More...
 
struct  NeumannSetData
 struct used to hold data for each sideset to be output; used by initialize_file to initialize the file header for increased speed More...
 

Public Member Functions

 WriteTemplate (Interface *impl)
 Constructor. More...
 
virtual ~WriteTemplate ()
 Destructor. More...
 
ErrorCode write_file (const char *file_name, const bool overwrite, const FileOptions &opts, const EntityHandle *output_list, const int num_sets, const std::vector< std::string > &qa_list, const Tag *tag_list=NULL, int num_tags=0, int export_dimension=3)
 writes out a file More...
 
- Public Member Functions inherited from moab::WriterIface
virtual ~WriterIface ()
 

Static Public Member Functions

static WriterIfacefactory (Interface *)
 

Protected Member Functions

ErrorCode open_file (const char *filename)
 number of dimensions in this file More...
 

Private Member Functions

ErrorCode gather_mesh_information (MeshInfo &mesh_info, std::vector< MaterialSetData > &matset_info, std::vector< NeumannSetData > &neuset_info, std::vector< DirichletSetData > &dirset_info, std::vector< EntityHandle > &matsets, std::vector< EntityHandle > &neusets, std::vector< EntityHandle > &dirsets)
 
ErrorCode initialize_file (MeshInfo &mesh_info)
 
ErrorCode write_nodes (const int num_nodes, const Range &nodes, const int dimension)
 
ErrorCode write_matsets (MeshInfo &mesh_info, std::vector< MaterialSetData > &matset_data, std::vector< NeumannSetData > &neuset_data)
 
ErrorCode get_valid_sides (Range &elems, const int sense, WriteTemplate::NeumannSetData &neuset_data)
 
void reset_matset (std::vector< MaterialSetData > &matset_info)
 
ErrorCode get_neuset_elems (EntityHandle neuset, int current_sense, Range &forward_elems, Range &reverse_elems)
 

Private Attributes

InterfacembImpl
 interface instance More...
 
WriteUtilIfacemWriteIface
 
std::string fileName
 file name More...
 
Tag mMaterialSetTag
 Cached tags for reading. Note that all these tags are defined when the core is initialized. More...
 
Tag mDirichletSetTag
 
Tag mNeumannSetTag
 
Tag mGlobalIdTag
 
Tag mEntityMark
 

Detailed Description

Definition at line 50 of file WriteTemplate.hpp.

Constructor & Destructor Documentation

◆ WriteTemplate()

moab::WriteTemplate::WriteTemplate ( Interface impl)

Constructor.

Get and cache predefined tag handles

Definition at line 52 of file WriteTemplate.cpp.

52  : mbImpl( impl )
53 {
54  assert( impl != NULL );
55 
56  impl->query_interface( mWriteIface );
57 
58  // Initialize in case tag_get_handle fails below
59  //! Get and cache predefined tag handles
60  int negone = -1;
62  &negone );
63 
65  &negone );
66 
68  &negone );
69 
70  mGlobalIdTag = impl->globalId_tag();
71 
72  impl->tag_get_handle( "WriteTemplate element mark", 1, MB_TYPE_BIT, mEntityMark, MB_TAG_CREAT );
73 }

References DIRICHLET_SET_TAG_NAME, moab::Interface::globalId_tag(), MATERIAL_SET_TAG_NAME, MB_TAG_CREAT, MB_TAG_SPARSE, MB_TYPE_BIT, MB_TYPE_INTEGER, mDirichletSetTag, mEntityMark, mGlobalIdTag, mMaterialSetTag, mNeumannSetTag, mWriteIface, NEUMANN_SET_TAG_NAME, moab::Interface::query_interface(), and moab::Interface::tag_get_handle().

Referenced by factory().

◆ ~WriteTemplate()

moab::WriteTemplate::~WriteTemplate ( )
virtual

Member Function Documentation

◆ factory()

WriterIface * moab::WriteTemplate::factory ( Interface iface)
static

Definition at line 47 of file WriteTemplate.cpp.

48 {
49  return new WriteTemplate( iface );
50 }

References iface, and WriteTemplate().

Referenced by moab::ReaderWriterSet::ReaderWriterSet().

◆ gather_mesh_information()

ErrorCode moab::WriteTemplate::gather_mesh_information ( MeshInfo mesh_info,
std::vector< MaterialSetData > &  matset_info,
std::vector< NeumannSetData > &  neuset_info,
std::vector< DirichletSetData > &  dirset_info,
std::vector< EntityHandle > &  matsets,
std::vector< EntityHandle > &  neusets,
std::vector< EntityHandle > &  dirsets 
)
private

Definition at line 182 of file WriteTemplate.cpp.

189 {
190  std::vector< EntityHandle >::iterator vector_iter, end_vector_iter;
191 
192  mesh_info.num_nodes = 0;
193  mesh_info.num_elements = 0;
194  mesh_info.num_matsets = 0;
195 
196  int id = 0;
197 
198  vector_iter = matsets.begin();
199  end_vector_iter = matsets.end();
200 
201  mesh_info.num_matsets = matsets.size();
202 
203  std::vector< EntityHandle > parent_meshsets;
204 
205  // Clean out the bits for the element mark
207  mbImpl->tag_get_handle( "WriteTemplate element mark", 1, MB_TYPE_BIT, mEntityMark, MB_TAG_CREAT );
208 
209  int highest_dimension_of_element_matsets = 0;
210 
211  for( vector_iter = matsets.begin(); vector_iter != matsets.end(); ++vector_iter )
212  {
213  WriteTemplate::MaterialSetData matset_data;
214  matset_data.elements = new Range;
215 
216  // For the purpose of qa records, get the parents of these matsets
217  if( mbImpl->get_parent_meshsets( *vector_iter, parent_meshsets ) != MB_SUCCESS ) return MB_FAILURE;
218 
219  // Get all Entity Handles in the mesh set
220  Range dummy_range;
221  mbImpl->get_entities_by_handle( *vector_iter, dummy_range, true );
222 
223  // Find the dimension of the last entity in this range
224  Range::iterator entity_iter = dummy_range.end();
225  --entity_iter;
226  int this_dim = CN::Dimension( TYPE_FROM_HANDLE( *entity_iter ) );
227  entity_iter = dummy_range.begin();
228  while( entity_iter != dummy_range.end() && CN::Dimension( TYPE_FROM_HANDLE( *entity_iter ) ) != this_dim )
229  ++entity_iter;
230 
231  if( entity_iter != dummy_range.end() )
232  std::copy( entity_iter, dummy_range.end(), range_inserter( *( matset_data.elements ) ) );
233 
234  assert( matset_data.elements->begin() == matset_data.elements->end() ||
235  CN::Dimension( TYPE_FROM_HANDLE( *( matset_data.elements->begin() ) ) ) == this_dim );
236 
237  // Get the matset's id
238  if( mbImpl->tag_get_data( mMaterialSetTag, &( *vector_iter ), 1, &id ) != MB_SUCCESS )
239  {
240  MB_SET_ERR( MB_FAILURE, "Couldn't get matset id from a tag for an element matset" );
241  }
242 
243  matset_data.id = id;
244  matset_data.number_attributes = 0;
245 
246  // Iterate through all the elements in the meshset
247  Range::iterator elem_range_iter, end_elem_range_iter;
248  elem_range_iter = matset_data.elements->begin();
249  end_elem_range_iter = matset_data.elements->end();
250 
251  // Get the entity type for this matset, verifying that it's the same for all elements
252  // THIS ASSUMES HANDLES SORT BY TYPE!!!
253  EntityType entity_type = TYPE_FROM_HANDLE( *elem_range_iter );
254  --end_elem_range_iter;
255  if( entity_type != TYPE_FROM_HANDLE( *( end_elem_range_iter++ ) ) )
256  {
257  MB_SET_ERR( MB_FAILURE, "Entities in matset " << id << " not of common type" );
258  }
259 
260  int dimension = CN::Dimension( entity_type );
261 
262  if( dimension > highest_dimension_of_element_matsets ) highest_dimension_of_element_matsets = dimension;
263 
264  matset_data.moab_type = mbImpl->type_from_handle( *( matset_data.elements->begin() ) );
265  if( MBMAXTYPE == matset_data.moab_type ) return MB_FAILURE;
266 
267  std::vector< EntityHandle > tmp_conn;
268  mbImpl->get_connectivity( &( *( matset_data.elements->begin() ) ), 1, tmp_conn );
269  matset_data.element_type =
270  ExoIIUtil::get_element_type_from_num_verts( tmp_conn.size(), entity_type, dimension );
271 
272  if( matset_data.element_type == EXOII_MAX_ELEM_TYPE )
273  {
274  MB_SET_ERR( MB_FAILURE, "Element type in matset " << id << " didn't get set correctly" );
275  }
276 
277  matset_data.number_nodes_per_element = ExoIIUtil::VerticesPerElement[matset_data.element_type];
278 
279  // Number of nodes for this matset
280  matset_data.number_elements = matset_data.elements->size();
281 
282  // Total number of elements
283  mesh_info.num_elements += matset_data.number_elements;
284 
285  // Get the nodes for the elements
286  mWriteIface->gather_nodes_from_elements( *matset_data.elements, mEntityMark, mesh_info.nodes );
287 
288  if( !neusets.empty() )
289  {
290  // If there are neusets, keep track of which elements are being written out
291  for( Range::iterator iter = matset_data.elements->begin(); iter != matset_data.elements->end(); ++iter )
292  {
293  unsigned char bit = 0x1;
294  mbImpl->tag_set_data( mEntityMark, &( *iter ), 1, &bit );
295  }
296  }
297 
298  matset_info.push_back( matset_data );
299  }
300 
301  // If user hasn't entered dimension, we figure it out
302  if( mesh_info.num_dim == 0 )
303  {
304  // Never want 1 or zero dimensions
305  if( highest_dimension_of_element_matsets < 2 )
306  mesh_info.num_dim = 3;
307  else
308  mesh_info.num_dim = highest_dimension_of_element_matsets;
309  }
310 
311  Range::iterator range_iter, end_range_iter;
312  range_iter = mesh_info.nodes.begin();
313  end_range_iter = mesh_info.nodes.end();
314 
315  mesh_info.num_nodes = mesh_info.nodes.size();
316 
317  //------dirsets--------
318 
319  vector_iter = dirsets.begin();
320  end_vector_iter = dirsets.end();
321 
322  for( ; vector_iter != end_vector_iter; ++vector_iter )
323  {
324  WriteTemplate::DirichletSetData dirset_data;
325  dirset_data.id = 0;
326  dirset_data.number_nodes = 0;
327 
328  // Get the dirset's id
329  if( mbImpl->tag_get_data( mDirichletSetTag, &( *vector_iter ), 1, &id ) != MB_SUCCESS )
330  {
331  MB_SET_ERR( MB_FAILURE, "Couldn't get id tag for dirset " << id );
332  }
333 
334  dirset_data.id = id;
335 
336  std::vector< EntityHandle > node_vector;
337  // Get the nodes of the dirset that are in mesh_info.nodes
338  if( mbImpl->get_entities_by_handle( *vector_iter, node_vector, true ) != MB_SUCCESS )
339  {
340  MB_SET_ERR( MB_FAILURE, "Couldn't get nodes in dirset " << id );
341  }
342 
343  std::vector< EntityHandle >::iterator iter, end_iter;
344  iter = node_vector.begin();
345  end_iter = node_vector.end();
346 
347  unsigned char node_marked = 0;
348  ErrorCode result;
349  for( ; iter != end_iter; ++iter )
350  {
351  if( TYPE_FROM_HANDLE( *iter ) != MBVERTEX ) continue;
352  result = mbImpl->tag_get_data( mEntityMark, &( *iter ), 1, &node_marked );
353  MB_CHK_SET_ERR( result, "Couldn't get mark data" );
354 
355  if( 0x1 == node_marked ) dirset_data.nodes.push_back( *iter );
356  }
357 
358  dirset_data.number_nodes = dirset_data.nodes.size();
359  dirset_info.push_back( dirset_data );
360  }
361 
362  //------neusets--------
363  vector_iter = neusets.begin();
364  end_vector_iter = neusets.end();
365 
366  for( ; vector_iter != end_vector_iter; ++vector_iter )
367  {
368  WriteTemplate::NeumannSetData neuset_data;
369 
370  // Get the neuset's id
371  if( mbImpl->tag_get_data( mNeumannSetTag, &( *vector_iter ), 1, &id ) != MB_SUCCESS ) return MB_FAILURE;
372 
373  neuset_data.id = id;
374  neuset_data.mesh_set_handle = *vector_iter;
375 
376  // Get the sides in two lists, one forward the other reverse; starts with forward sense
377  // by convention
378  Range forward_elems, reverse_elems;
379  if( get_neuset_elems( *vector_iter, 0, forward_elems, reverse_elems ) == MB_FAILURE ) return MB_FAILURE;
380 
381  ErrorCode result = get_valid_sides( forward_elems, 1, neuset_data );
382  MB_CHK_SET_ERR( result, "Couldn't get valid sides data" );
383  result = get_valid_sides( reverse_elems, -1, neuset_data );
384  MB_CHK_SET_ERR( result, "Couldn't get valid sides data" );
385 
386  neuset_data.number_elements = neuset_data.elements.size();
387  neuset_info.push_back( neuset_data );
388  }
389 
390  return MB_SUCCESS;
391 }

References moab::Range::begin(), moab::CN::Dimension(), moab::WriteTemplate::MaterialSetData::element_type, moab::WriteTemplate::MaterialSetData::elements, moab::WriteTemplate::NeumannSetData::elements, moab::Range::end(), ErrorCode, moab::EXOII_MAX_ELEM_TYPE, moab::WriteUtilIface::gather_nodes_from_elements(), moab::Interface::get_connectivity(), moab::ExoIIUtil::get_element_type_from_num_verts(), moab::Interface::get_entities_by_handle(), get_neuset_elems(), moab::Interface::get_parent_meshsets(), get_valid_sides(), moab::WriteTemplate::MaterialSetData::id, moab::WriteTemplate::DirichletSetData::id, moab::WriteTemplate::NeumannSetData::id, MB_CHK_SET_ERR, MB_SET_ERR, MB_SUCCESS, MB_TAG_CREAT, MB_TYPE_BIT, mbImpl, MBMAXTYPE, MBVERTEX, mDirichletSetTag, mEntityMark, moab::WriteTemplate::NeumannSetData::mesh_set_handle, mMaterialSetTag, mNeumannSetTag, moab::WriteTemplate::MaterialSetData::moab_type, mWriteIface, moab::WriteTemplate::DirichletSetData::nodes, moab::WriteTemplate::MeshInfo::nodes, moab::WriteTemplate::MeshInfo::num_dim, moab::WriteTemplate::MeshInfo::num_elements, moab::WriteTemplate::MeshInfo::num_matsets, moab::WriteTemplate::MeshInfo::num_nodes, moab::WriteTemplate::MaterialSetData::number_attributes, moab::WriteTemplate::MaterialSetData::number_elements, moab::WriteTemplate::NeumannSetData::number_elements, moab::WriteTemplate::DirichletSetData::number_nodes, moab::WriteTemplate::MaterialSetData::number_nodes_per_element, moab::Range::size(), moab::Interface::tag_delete(), moab::Interface::tag_get_data(), moab::Interface::tag_get_handle(), moab::Interface::tag_set_data(), moab::Interface::type_from_handle(), moab::TYPE_FROM_HANDLE(), and moab::ExoIIUtil::VerticesPerElement.

Referenced by write_file().

◆ get_neuset_elems()

ErrorCode moab::WriteTemplate::get_neuset_elems ( EntityHandle  neuset,
int  current_sense,
Range forward_elems,
Range reverse_elems 
)
private

Definition at line 602 of file WriteTemplate.cpp.

606 {
607  Range neuset_elems, neuset_meshsets;
608 
609  // Get the sense tag; don't need to check return, might be an error if the tag
610  // hasn't been created yet
611  Tag sense_tag = 0;
612  mbImpl->tag_get_handle( "SENSE", 1, MB_TYPE_INTEGER, sense_tag );
613 
614  // Get the entities in this set
615  ErrorCode result = mbImpl->get_entities_by_handle( neuset, neuset_elems, true );
616  if( MB_FAILURE == result ) return result;
617 
618  // Now remove the meshsets into the neuset_meshsets; first find the first meshset,
619  Range::iterator range_iter = neuset_elems.begin();
620  while( TYPE_FROM_HANDLE( *range_iter ) != MBENTITYSET && range_iter != neuset_elems.end() )
621  ++range_iter;
622 
623  // Then, if there are some, copy them into neuset_meshsets and erase from neuset_elems
624  if( range_iter != neuset_elems.end() )
625  {
626  std::copy( range_iter, neuset_elems.end(), range_inserter( neuset_meshsets ) );
627  neuset_elems.erase( range_iter, neuset_elems.end() );
628  }
629 
630  // OK, for the elements, check the sense of this set and copy into the right range
631  // (if the sense is 0, copy into both ranges)
632 
633  // Need to step forward on list until we reach the right dimension
634  Range::iterator dum_it = neuset_elems.end();
635  --dum_it;
636  int target_dim = CN::Dimension( TYPE_FROM_HANDLE( *dum_it ) );
637  dum_it = neuset_elems.begin();
638  while( target_dim != CN::Dimension( TYPE_FROM_HANDLE( *dum_it ) ) && dum_it != neuset_elems.end() )
639  ++dum_it;
640 
641  if( current_sense == 1 || current_sense == 0 )
642  std::copy( dum_it, neuset_elems.end(), range_inserter( forward_elems ) );
643  if( current_sense == -1 || current_sense == 0 )
644  std::copy( dum_it, neuset_elems.end(), range_inserter( reverse_elems ) );
645 
646  // Now loop over the contained meshsets, getting the sense of those and calling this
647  // function recursively
648  for( range_iter = neuset_meshsets.begin(); range_iter != neuset_meshsets.end(); ++range_iter )
649  {
650  // First get the sense; if it's not there, by convention it's forward
651  int this_sense;
652  if( 0 == sense_tag || MB_FAILURE == mbImpl->tag_get_data( sense_tag, &( *range_iter ), 1, &this_sense ) )
653  this_sense = 1;
654 
655  // Now get all the entities on this meshset, with the proper (possibly reversed) sense
656  get_neuset_elems( *range_iter, this_sense * current_sense, forward_elems, reverse_elems );
657  }
658 
659  return result;
660 }

References moab::Range::begin(), moab::CN::Dimension(), moab::Range::end(), moab::Range::erase(), ErrorCode, moab::Interface::get_entities_by_handle(), MB_TYPE_INTEGER, MBENTITYSET, mbImpl, moab::Interface::tag_get_data(), moab::Interface::tag_get_handle(), and moab::TYPE_FROM_HANDLE().

Referenced by gather_mesh_information().

◆ get_valid_sides()

ErrorCode moab::WriteTemplate::get_valid_sides ( Range elems,
const int  sense,
WriteTemplate::NeumannSetData neuset_data 
)
private

Definition at line 393 of file WriteTemplate.cpp.

394 {
395  // This is where we see if underlying element of side set element is included in output
396 
397  unsigned char element_marked = 0;
398  ErrorCode result;
399  for( Range::iterator iter = elems.begin(); iter != elems.end(); ++iter )
400  {
401  // Should insert here if "side" is a quad/tri on a quad/tri mesh
402  result = mbImpl->tag_get_data( mEntityMark, &( *iter ), 1, &element_marked );
403  MB_CHK_SET_ERR( result, "Couldn't get mark data" );
404 
405  if( 0x1 == element_marked )
406  {
407  neuset_data.elements.push_back( *iter );
408 
409  // TJT TODO: the sense should really be # edges + 1or2
410  neuset_data.side_numbers.push_back( ( sense == 1 ? 1 : 2 ) );
411  }
412  else
413  { // Then "side" is probably a quad/tri on a hex/tet mesh
414  std::vector< EntityHandle > parents;
415  int dimension = CN::Dimension( TYPE_FROM_HANDLE( *iter ) );
416 
417  // Get the adjacent parent element of "side"
418  if( mbImpl->get_adjacencies( &( *iter ), 1, dimension + 1, false, parents ) != MB_SUCCESS )
419  {
420  MB_SET_ERR( MB_FAILURE, "Couldn't get adjacencies for neuset" );
421  }
422 
423  if( !parents.empty() )
424  {
425  // Make sure the adjacent parent element will be output
426  for( unsigned int k = 0; k < parents.size(); k++ )
427  {
428  result = mbImpl->tag_get_data( mEntityMark, &( parents[k] ), 1, &element_marked );
429  MB_CHK_SET_ERR( result, "Couldn't get mark data" );
430 
431  int side_no, this_sense, this_offset;
432  if( 0x1 == element_marked &&
433  mbImpl->side_number( parents[k], *iter, side_no, this_sense, this_offset ) == MB_SUCCESS &&
434  this_sense == sense )
435  {
436  neuset_data.elements.push_back( parents[k] );
437  neuset_data.side_numbers.push_back( side_no + 1 );
438  break;
439  }
440  }
441  }
442  else
443  {
444  MB_SET_ERR( MB_FAILURE, "No parent element exists for element in neuset " << neuset_data.id );
445  }
446  }
447  }
448 
449  return MB_SUCCESS;
450 }

References moab::Range::begin(), moab::CN::Dimension(), moab::WriteTemplate::NeumannSetData::elements, moab::Range::end(), ErrorCode, moab::Interface::get_adjacencies(), moab::WriteTemplate::NeumannSetData::id, MB_CHK_SET_ERR, MB_SET_ERR, MB_SUCCESS, mbImpl, mEntityMark, moab::Interface::side_number(), moab::WriteTemplate::NeumannSetData::side_numbers, moab::Interface::tag_get_data(), and moab::TYPE_FROM_HANDLE().

Referenced by gather_mesh_information().

◆ initialize_file()

ErrorCode moab::WriteTemplate::initialize_file ( MeshInfo mesh_info)
private

Definition at line 560 of file WriteTemplate.cpp.

561 {
562  // Perform the initializations
563 
564  int coord_size, ncoords;
565 
566  coord_size = mesh_info.num_dim;
567  std::cout << "Coord_size = " << coord_size << std::endl;
568  /* Template - write coord size */
569 
570  ncoords = mesh_info.num_nodes;
571  std::cout << "ncoords = " << ncoords << std::endl;
572  /* Template - write num nodes*/
573 
574  /* Template - write information on the element types & numbers (depends
575  on material and other sets) */
576 
577  /* Node coordinate arrays: */
578  /* Template - initialize variable to hold coordinate arrays */
579 
580  return MB_SUCCESS;
581 }

References MB_SUCCESS, moab::WriteTemplate::MeshInfo::num_dim, and moab::WriteTemplate::MeshInfo::num_nodes.

Referenced by write_file().

◆ open_file()

ErrorCode moab::WriteTemplate::open_file ( const char *  filename)
protected

number of dimensions in this file

open a file for writing

Definition at line 583 of file WriteTemplate.cpp.

584 {
585  // Not a valid filename
586  if( strlen( (const char*)filename ) == 0 )
587  {
588  MB_SET_ERR( MB_FAILURE, "Output filename not specified" );
589  }
590 
591  /* Template - open file & store somewhere */
592 
593  // File couldn't be opened
594  if( /* Template - check for file open error here! */ false )
595  {
596  MB_SET_ERR( MB_FAILURE, "Cannot open " << filename );
597  }
598 
599  return MB_SUCCESS;
600 }

References MB_SET_ERR, and MB_SUCCESS.

◆ reset_matset()

void moab::WriteTemplate::reset_matset ( std::vector< MaterialSetData > &  matset_info)
private

Definition at line 81 of file WriteTemplate.cpp.

82 {
83  std::vector< WriteTemplate::MaterialSetData >::iterator iter;
84 
85  for( iter = matset_info.begin(); iter != matset_info.end(); ++iter )
86  delete( *iter ).elements;
87 }

Referenced by write_file().

◆ write_file()

ErrorCode moab::WriteTemplate::write_file ( const char *  file_name,
const bool  overwrite,
const FileOptions opts,
const EntityHandle output_list,
const int  num_sets,
const std::vector< std::string > &  qa_list,
const Tag tag_list = NULL,
int  num_tags = 0,
int  export_dimension = 3 
)
virtual

writes out a file

Implements moab::WriterIface.

Definition at line 89 of file WriteTemplate.cpp.

98 {
99  assert( 0 != mMaterialSetTag && 0 != mNeumannSetTag && 0 != mDirichletSetTag );
100 
101  // Check the file name
102  if( NULL == strstr( file_name, ".template" ) ) return MB_FAILURE;
103 
104  std::vector< EntityHandle > matsets, dirsets, neusets;
105 
106  fileName = file_name;
107 
108  // Separate into material sets, dirichlet sets, neumann sets
109 
110  if( num_sets == 0 )
111  {
112  // Default to all defined sets
113  Range this_range;
114  mbImpl->get_entities_by_type_and_tag( 0, MBENTITYSET, &mMaterialSetTag, NULL, 1, this_range );
115  std::copy( this_range.begin(), this_range.end(), std::back_inserter( matsets ) );
116  this_range.clear();
117  mbImpl->get_entities_by_type_and_tag( 0, MBENTITYSET, &mDirichletSetTag, NULL, 1, this_range );
118  std::copy( this_range.begin(), this_range.end(), std::back_inserter( dirsets ) );
119  this_range.clear();
120  mbImpl->get_entities_by_type_and_tag( 0, MBENTITYSET, &mNeumannSetTag, NULL, 1, this_range );
121  std::copy( this_range.begin(), this_range.end(), std::back_inserter( neusets ) );
122  }
123  else
124  {
125  int dummy;
126  for( const EntityHandle* iter = ent_handles; iter < ent_handles + num_sets; ++iter )
127  {
128  if( MB_SUCCESS == mbImpl->tag_get_data( mMaterialSetTag, &( *iter ), 1, &dummy ) )
129  matsets.push_back( *iter );
130  else if( MB_SUCCESS == mbImpl->tag_get_data( mDirichletSetTag, &( *iter ), 1, &dummy ) )
131  dirsets.push_back( *iter );
132  else if( MB_SUCCESS == mbImpl->tag_get_data( mNeumannSetTag, &( *iter ), 1, &dummy ) )
133  neusets.push_back( *iter );
134  }
135  }
136 
137  // If there is nothing to write just return.
138  if( matsets.empty() && dirsets.empty() && neusets.empty() ) return MB_FILE_WRITE_ERROR;
139 
140  std::vector< WriteTemplate::MaterialSetData > matset_info;
141  std::vector< WriteTemplate::DirichletSetData > dirset_info;
142  std::vector< WriteTemplate::NeumannSetData > neuset_info;
143 
144  MeshInfo mesh_info;
145 
146  matset_info.clear();
147  if( gather_mesh_information( mesh_info, matset_info, neuset_info, dirset_info, matsets, neusets, dirsets ) !=
148  MB_SUCCESS )
149  {
150  reset_matset( matset_info );
151  return MB_FAILURE;
152  }
153 
154  // Try to open the file after gather mesh info succeeds
155  if( /* Test for file open failure */ false )
156  {
157  reset_matset( matset_info );
158  return MB_FAILURE;
159  }
160 
161  if( initialize_file( mesh_info ) != MB_SUCCESS )
162  {
163  reset_matset( matset_info );
164  return MB_FAILURE;
165  }
166 
167  if( write_nodes( mesh_info.num_nodes, mesh_info.nodes, mesh_info.num_dim ) != MB_SUCCESS )
168  {
169  reset_matset( matset_info );
170  return MB_FAILURE;
171  }
172 
173  if( write_matsets( mesh_info, matset_info, neuset_info ) )
174  {
175  reset_matset( matset_info );
176  return MB_FAILURE;
177  }
178 
179  return MB_SUCCESS;
180 }

References moab::Range::begin(), moab::Range::clear(), moab::Range::end(), fileName, gather_mesh_information(), moab::Interface::get_entities_by_type_and_tag(), initialize_file(), MB_FILE_WRITE_ERROR, MB_SUCCESS, MBENTITYSET, mbImpl, mDirichletSetTag, mMaterialSetTag, mNeumannSetTag, moab::WriteTemplate::MeshInfo::nodes, moab::WriteTemplate::MeshInfo::num_dim, moab::WriteTemplate::MeshInfo::num_nodes, reset_matset(), moab::Interface::tag_get_data(), write_matsets(), and write_nodes().

◆ write_matsets()

ErrorCode moab::WriteTemplate::write_matsets ( MeshInfo mesh_info,
std::vector< MaterialSetData > &  matset_data,
std::vector< NeumannSetData > &  neuset_data 
)
private

Definition at line 520 of file WriteTemplate.cpp.

524 {
525  unsigned int i;
526  std::vector< int > connect;
527  const EntityHandle* connecth;
528  int num_connecth;
529  ErrorCode result;
530 
531  // Don't usually have anywhere near 31 nodes per element
532  connect.reserve( 31 );
533  Range::iterator rit;
534 
535  WriteTemplate::MaterialSetData matset;
536  for( i = 0; i < matset_data.size(); i++ )
537  {
538  matset = matset_data[i];
539 
540  for( rit = matset.elements->begin(); rit != matset.elements->end(); ++rit )
541  {
542  // Get the connectivity of this element
543  result = mbImpl->get_connectivity( *rit, connecth, num_connecth );
544  if( MB_SUCCESS != result ) return result;
545 
546  // Get the vertex ids
547  result = mbImpl->tag_get_data( mGlobalIdTag, connecth, num_connecth, &connect[0] );
548  if( MB_SUCCESS != result ) return result;
549 
550  // Write the data
551  /* Template - write element connectivity here */
552 
553  if( /* Template - check for error condition! */ false ) return MB_FAILURE;
554  }
555  }
556 
557  return MB_SUCCESS;
558 }

References moab::Range::begin(), moab::WriteTemplate::MaterialSetData::elements, moab::Range::end(), ErrorCode, moab::Interface::get_connectivity(), MB_SUCCESS, mbImpl, mGlobalIdTag, and moab::Interface::tag_get_data().

Referenced by write_file().

◆ write_nodes()

ErrorCode moab::WriteTemplate::write_nodes ( const int  num_nodes,
const Range nodes,
const int  dimension 
)
private

Definition at line 452 of file WriteTemplate.cpp.

453 {
454  // See if should transform coordinates
455  ErrorCode result;
456  Tag trans_tag;
457  result = mbImpl->tag_get_handle( MESH_TRANSFORM_TAG_NAME, 16, MB_TYPE_DOUBLE, trans_tag );
458  bool transform_needed = true;
459  if( result == MB_TAG_NOT_FOUND ) transform_needed = false;
460 
461  int num_coords_to_fill = transform_needed ? 3 : dimension;
462 
463  std::vector< double* > coord_arrays( 3 );
464  coord_arrays[0] = new double[num_nodes];
465  coord_arrays[1] = new double[num_nodes];
466  coord_arrays[2] = NULL;
467 
468  if( num_coords_to_fill == 3 ) coord_arrays[2] = new double[num_nodes];
469 
470  result = mWriteIface->get_node_coords( dimension, num_nodes, nodes, mGlobalIdTag, 0, coord_arrays );
471  if( result != MB_SUCCESS )
472  {
473  delete[] coord_arrays[0];
474  delete[] coord_arrays[1];
475  if( coord_arrays[2] ) delete[] coord_arrays[2];
476  return result;
477  }
478 
479  if( transform_needed )
480  {
481  double trans_matrix[16];
482  const EntityHandle mesh = 0;
483  result = mbImpl->tag_get_data( trans_tag, &mesh, 1, trans_matrix );
484  MB_CHK_SET_ERR( result, "Couldn't get transform data" );
485 
486  for( int i = 0; i < num_nodes; i++ )
487  {
488  double vec1[3];
489  double vec2[3];
490 
491  vec2[0] = coord_arrays[0][i];
492  vec2[1] = coord_arrays[1][i];
493  vec2[2] = coord_arrays[2][i];
494 
495  for( int row = 0; row < 3; row++ )
496  {
497  vec1[row] = 0.0;
498  for( int col = 0; col < 3; col++ )
499  vec1[row] += ( trans_matrix[( row * 4 ) + col] * vec2[col] );
500  }
501 
502  coord_arrays[0][i] = vec1[0];
503  coord_arrays[1][i] = vec1[1];
504  coord_arrays[2][i] = vec1[2];
505  }
506  }
507 
508  // Write the nodes
509 
510  /* Template - write nodes to file here in some way */
511 
512  // Clean up
513  delete[] coord_arrays[0];
514  delete[] coord_arrays[1];
515  if( coord_arrays[2] ) delete[] coord_arrays[2];
516 
517  return MB_SUCCESS;
518 }

References ErrorCode, moab::WriteUtilIface::get_node_coords(), MB_CHK_SET_ERR, MB_SUCCESS, MB_TAG_NOT_FOUND, MB_TYPE_DOUBLE, mbImpl, MESH_TRANSFORM_TAG_NAME, mGlobalIdTag, mWriteIface, moab::Interface::tag_get_data(), and moab::Interface::tag_get_handle().

Referenced by write_file().

Member Data Documentation

◆ fileName

std::string moab::WriteTemplate::fileName
private

file name

Definition at line 138 of file WriteTemplate.hpp.

Referenced by write_file().

◆ mbImpl

Interface* moab::WriteTemplate::mbImpl
private

◆ mDirichletSetTag

Tag moab::WriteTemplate::mDirichletSetTag
private

Definition at line 143 of file WriteTemplate.hpp.

Referenced by gather_mesh_information(), write_file(), and WriteTemplate().

◆ mEntityMark

Tag moab::WriteTemplate::mEntityMark
private

◆ mGlobalIdTag

Tag moab::WriteTemplate::mGlobalIdTag
private

Definition at line 145 of file WriteTemplate.hpp.

Referenced by write_matsets(), write_nodes(), and WriteTemplate().

◆ mMaterialSetTag

Tag moab::WriteTemplate::mMaterialSetTag
private

Cached tags for reading. Note that all these tags are defined when the core is initialized.

Definition at line 142 of file WriteTemplate.hpp.

Referenced by gather_mesh_information(), write_file(), and WriteTemplate().

◆ mNeumannSetTag

Tag moab::WriteTemplate::mNeumannSetTag
private

Definition at line 144 of file WriteTemplate.hpp.

Referenced by gather_mesh_information(), write_file(), and WriteTemplate().

◆ mWriteIface

WriteUtilIface* moab::WriteTemplate::mWriteIface
private

The documentation for this class was generated from the following files: