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

#include <WriteSLAC.hpp>

+ Inheritance diagram for moab::WriteSLAC:
+ Collaboration diagram for moab::WriteSLAC:

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

 WriteSLAC (Interface *impl)
 Constructor. More...
 
virtual ~WriteSLAC ()
 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, WriteSLAC::NeumannSetData &sideset_data)
 
void reset_matset (std::vector< MaterialSetData > &matset_info)
 
ErrorCode get_neuset_elems (EntityHandle neuset, int current_sense, Range &forward_elems, Range &reverse_elems)
 
ErrorCode gather_interior_exterior (MeshInfo &mesh_info, std::vector< MaterialSetData > &matset_data, std::vector< NeumannSetData > &neuset_data)
 

Private Attributes

InterfacembImpl
 interface instance More...
 
WriteUtilIfacemWriteIface
 
std::string fileName
 file name More...
 
int ncFile
 
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 mMatSetIdTag
 
Tag mEntityMark
 

Detailed Description

Definition at line 50 of file WriteSLAC.hpp.

Constructor & Destructor Documentation

◆ WriteSLAC()

moab::WriteSLAC::WriteSLAC ( Interface impl)

Constructor.

get and cache predefined tag handles

Definition at line 73 of file WriteSLAC.cpp.

73  : mbImpl( impl ), ncFile( 0 )
74 {
75  assert( impl != NULL );
76 
77  impl->query_interface( mWriteIface );
78 
79  // Initialize in case tag_get_handle fails below
80  //! get and cache predefined tag handles
81  int negone = -1;
83  &negone );
84 
86  &negone );
87 
89  &negone );
90 
91  mGlobalIdTag = impl->globalId_tag();
92 
93  int dum_val = -1;
94  impl->tag_get_handle( "__matSetIdTag", 1, MB_TYPE_INTEGER, mMatSetIdTag, MB_TAG_DENSE | MB_TAG_CREAT, &dum_val );
95 
96  impl->tag_get_handle( "WriteSLAC element mark", 1, MB_TYPE_BIT, mEntityMark, MB_TAG_CREAT );
97 }

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

Referenced by factory().

◆ ~WriteSLAC()

moab::WriteSLAC::~WriteSLAC ( )
virtual

Member Function Documentation

◆ factory()

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

Definition at line 68 of file WriteSLAC.cpp.

69 {
70  return new WriteSLAC( iface );
71 }

References iface, and WriteSLAC().

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

◆ gather_interior_exterior()

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

Definition at line 562 of file WriteSLAC.cpp.

565 {
566  // Need to assign a tag with the matset id
567  Tag matset_id_tag;
568  unsigned int i;
569  int dum = -1;
570  ErrorCode result =
571  mbImpl->tag_get_handle( "__matset_id", 4, MB_TYPE_INTEGER, matset_id_tag, MB_TAG_DENSE | MB_TAG_CREAT, &dum );
572  if( MB_SUCCESS != result ) return result;
573 
574  Range::iterator rit;
575  mesh_info.num_int_hexes = mesh_info.num_int_tets = 0;
576 
577  for( i = 0; i < matset_data.size(); i++ )
578  {
579  WriteSLAC::MaterialSetData matset = matset_data[i];
580  if( matset.moab_type == MBHEX )
581  mesh_info.num_int_hexes += matset.elements->size();
582  else if( matset.moab_type == MBTET )
583  mesh_info.num_int_tets += matset.elements->size();
584  else
585  {
586  std::cout << "WriteSLAC doesn't support elements of type " << CN::EntityTypeName( matset.moab_type )
587  << std::endl;
588  continue;
589  }
590 
591  for( rit = matset.elements->begin(); rit != matset.elements->end(); ++rit )
592  {
593  result = mbImpl->tag_set_data( mMatSetIdTag, &( *rit ), 1, &( matset.id ) );
594  if( MB_SUCCESS != result ) return result;
595  }
596  }
597 
598  // Now go through the neumann sets, pulling out the hexes with faces on the
599  // boundary
600  std::vector< EntityHandle >::iterator vit;
601  for( i = 0; i < neuset_data.size(); i++ )
602  {
603  WriteSLAC::NeumannSetData neuset = neuset_data[i];
604  for( vit = neuset.elements.begin(); vit != neuset.elements.end(); ++vit )
605  {
606  if( TYPE_FROM_HANDLE( *vit ) == MBHEX )
607  mesh_info.bdy_hexes.insert( *vit );
608  else if( TYPE_FROM_HANDLE( *vit ) == MBTET )
609  mesh_info.bdy_tets.insert( *vit );
610  }
611  }
612 
613  // Now we have the number of bdy hexes and tets, we know how many interior ones
614  // there are too
615  mesh_info.num_int_hexes -= mesh_info.bdy_hexes.size();
616  mesh_info.num_int_tets -= mesh_info.bdy_tets.size();
617 
618  return MB_SUCCESS;
619 }

References moab::WriteSLAC::MeshInfo::bdy_hexes, moab::WriteSLAC::MeshInfo::bdy_tets, moab::Range::begin(), moab::dum, moab::WriteSLAC::MaterialSetData::elements, moab::WriteSLAC::NeumannSetData::elements, moab::Range::end(), moab::CN::EntityTypeName(), ErrorCode, moab::WriteSLAC::MaterialSetData::id, moab::Range::insert(), MB_SUCCESS, MB_TAG_CREAT, MB_TAG_DENSE, MB_TYPE_INTEGER, MBHEX, mbImpl, MBTET, mMatSetIdTag, moab::WriteSLAC::MaterialSetData::moab_type, moab::WriteSLAC::MeshInfo::num_int_hexes, moab::WriteSLAC::MeshInfo::num_int_tets, moab::Range::size(), moab::Interface::tag_get_handle(), moab::Interface::tag_set_data(), and moab::TYPE_FROM_HANDLE().

Referenced by gather_mesh_information().

◆ gather_mesh_information()

ErrorCode moab::WriteSLAC::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 210 of file WriteSLAC.cpp.

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

References moab::Range::begin(), moab::CN::Dimension(), moab::WriteSLAC::MaterialSetData::element_type, moab::WriteSLAC::MaterialSetData::elements, moab::WriteSLAC::NeumannSetData::elements, moab::Range::end(), ErrorCode, moab::EXOII_MAX_ELEM_TYPE, gather_interior_exterior(), 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::WriteSLAC::MaterialSetData::id, moab::WriteSLAC::DirichletSetData::id, moab::WriteSLAC::NeumannSetData::id, MB_CHK_SET_ERR, MB_SET_ERR, MB_SUCCESS, MB_TAG_CREAT, MB_TYPE_BIT, MBEDGE, mbImpl, MBMAXTYPE, MBQUAD, MBTRI, MBVERTEX, mDirichletSetTag, mEntityMark, moab::WriteSLAC::NeumannSetData::mesh_set_handle, mMaterialSetTag, mNeumannSetTag, moab::WriteSLAC::MaterialSetData::moab_type, mWriteIface, moab::WriteSLAC::DirichletSetData::nodes, moab::WriteSLAC::MeshInfo::nodes, moab::WriteSLAC::MeshInfo::num_dim, moab::WriteSLAC::MeshInfo::num_elements, moab::WriteSLAC::MeshInfo::num_matsets, moab::WriteSLAC::MeshInfo::num_nodes, moab::WriteSLAC::MaterialSetData::number_attributes, moab::WriteSLAC::MaterialSetData::number_elements, moab::WriteSLAC::NeumannSetData::number_elements, moab::WriteSLAC::DirichletSetData::number_nodes, moab::WriteSLAC::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::WriteSLAC::get_neuset_elems ( EntityHandle  neuset,
int  current_sense,
Range forward_elems,
Range reverse_elems 
)
private

Definition at line 954 of file WriteSLAC.cpp.

958 {
959  Range ss_elems, ss_meshsets;
960 
961  // Get the sense tag; don't need to check return, might be an error if the tag
962  // hasn't been created yet
963  Tag sense_tag = 0;
964  mbImpl->tag_get_handle( "SENSE", 1, MB_TYPE_INTEGER, sense_tag );
965 
966  // Get the entities in this set
967  ErrorCode result = mbImpl->get_entities_by_handle( neuset, ss_elems, true );
968  if( MB_FAILURE == result ) return result;
969 
970  // Now remove the meshsets into the ss_meshsets; first find the first meshset,
971  Range::iterator range_iter = ss_elems.begin();
972  while( TYPE_FROM_HANDLE( *range_iter ) != MBENTITYSET && range_iter != ss_elems.end() )
973  ++range_iter;
974 
975  // Then, if there are some, copy them into ss_meshsets and erase from ss_elems
976  if( range_iter != ss_elems.end() )
977  {
978  std::copy( range_iter, ss_elems.end(), range_inserter( ss_meshsets ) );
979  ss_elems.erase( range_iter, ss_elems.end() );
980  }
981 
982  // OK, for the elements, check the sense of this set and copy into the right range
983  // (if the sense is 0, copy into both ranges)
984 
985  // Need to step forward on list until we reach the right dimension
986  Range::iterator dum_it = ss_elems.end();
987  --dum_it;
988  int target_dim = CN::Dimension( TYPE_FROM_HANDLE( *dum_it ) );
989  dum_it = ss_elems.begin();
990  while( target_dim != CN::Dimension( TYPE_FROM_HANDLE( *dum_it ) ) && dum_it != ss_elems.end() )
991  ++dum_it;
992 
993  if( current_sense == 1 || current_sense == 0 ) std::copy( dum_it, ss_elems.end(), range_inserter( forward_elems ) );
994  if( current_sense == -1 || current_sense == 0 )
995  std::copy( dum_it, ss_elems.end(), range_inserter( reverse_elems ) );
996 
997  // Now loop over the contained meshsets, getting the sense of those and calling this
998  // function recursively
999  for( range_iter = ss_meshsets.begin(); range_iter != ss_meshsets.end(); ++range_iter )
1000  {
1001  // First get the sense; if it's not there, by convention it's forward
1002  int this_sense;
1003  if( 0 == sense_tag || MB_FAILURE == mbImpl->tag_get_data( sense_tag, &( *range_iter ), 1, &this_sense ) )
1004  this_sense = 1;
1005 
1006  // Now get all the entities on this meshset, with the proper (possibly reversed) sense
1007  get_neuset_elems( *range_iter, this_sense * current_sense, forward_elems, reverse_elems );
1008  }
1009 
1010  return result;
1011 }

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::WriteSLAC::get_valid_sides ( Range elems,
const int  sense,
WriteSLAC::NeumannSetData sideset_data 
)
private

Definition at line 428 of file WriteSLAC.cpp.

429 {
430  // This is where we see if underlying element of side set element is included in output
431 
432  unsigned char element_marked = 0;
433  ErrorCode result;
434  for( Range::iterator iter = elems.begin(); iter != elems.end(); ++iter )
435  {
436  // Should insert here if "side" is a quad/tri on a quad/tri mesh
437  result = mbImpl->tag_get_data( mEntityMark, &( *iter ), 1, &element_marked );MB_CHK_SET_ERR( result, "Couldn't get mark data" );
438 
439  if( 0x1 == element_marked )
440  {
441  neuset_data.elements.push_back( *iter );
442 
443  // TJT TODO: the sense should really be # edges + 1or2
444  neuset_data.side_numbers.push_back( ( sense == 1 ? 1 : 2 ) );
445  }
446  else
447  { // Then "side" is probably a quad/tri on a hex/tet mesh
448  std::vector< EntityHandle > parents;
449  int dimension = CN::Dimension( TYPE_FROM_HANDLE( *iter ) );
450 
451  // Get the adjacent parent element of "side"
452  if( mbImpl->get_adjacencies( &( *iter ), 1, dimension + 1, false, parents ) != MB_SUCCESS )
453  {
454  MB_SET_ERR( MB_FAILURE, "Couldn't get adjacencies for neuset" );
455  }
456 
457  if( !parents.empty() )
458  {
459  // Make sure the adjacent parent element will be output
460  for( unsigned int k = 0; k < parents.size(); k++ )
461  {
462  result = mbImpl->tag_get_data( mEntityMark, &( parents[k] ), 1, &element_marked );MB_CHK_SET_ERR( result, "Couldn't get mark data" );
463 
464  int side_no, this_sense, this_offset;
465  if( 0x1 == element_marked &&
466  mbImpl->side_number( parents[k], *iter, side_no, this_sense, this_offset ) == MB_SUCCESS &&
467  this_sense == sense )
468  {
469  neuset_data.elements.push_back( parents[k] );
470  neuset_data.side_numbers.push_back( side_no + 1 );
471  break;
472  }
473  }
474  }
475  else
476  {
477  MB_SET_ERR( MB_FAILURE, "No parent element exists for element in neuset " << neuset_data.id );
478  }
479  }
480  }
481 
482  return MB_SUCCESS;
483 }

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

Referenced by gather_mesh_information().

◆ initialize_file()

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

Definition at line 825 of file WriteSLAC.cpp.

826 {
827  // Perform the initializations
828 
829  int coord_size = -1, ncoords = -1;
830  // Initialization to avoid warnings on Linux
831  int hexinterior = -1, hexinteriorsize, hexexterior = -1, hexexteriorsize = -1;
832  int tetinterior = -1, tetinteriorsize, tetexterior = -1, tetexteriorsize = -1;
833 
834  if( nc_def_dim( ncFile, "coord_size", (size_t)mesh_info.num_dim, &coord_size ) != NC_NOERR )
835  {
836  MB_SET_ERR( MB_FAILURE, "WriteSLAC: failed to define number of dimensions" );
837  }
838 
839  if( nc_def_dim( ncFile, "ncoords", (size_t)mesh_info.num_nodes, &ncoords ) != NC_NOERR )
840  {
841  MB_SET_ERR( MB_FAILURE, "WriteSLAC: failed to define number of nodes" );
842  }
843 
844  if( 0 != mesh_info.num_int_hexes &&
845  nc_def_dim( ncFile, "hexinterior", (size_t)mesh_info.num_int_hexes, &hexinterior ) != NC_NOERR )
846  {
847  MB_SET_ERR( MB_FAILURE, "WriteSLAC: failed to define number of interior hex elements" );
848  }
849 
850  if( nc_def_dim( ncFile, "hexinteriorsize", (size_t)9, &hexinteriorsize ) != NC_NOERR )
851  {
852  MB_SET_ERR( MB_FAILURE, "WriteSLAC: failed to define interior hex element size" );
853  }
854 
855  if( 0 != mesh_info.bdy_hexes.size() &&
856  nc_def_dim( ncFile, "hexexterior", (size_t)mesh_info.bdy_hexes.size(), &hexexterior ) != NC_NOERR )
857  {
858  MB_SET_ERR( MB_FAILURE, "WriteSLAC: failed to define number of exterior hex elements" );
859  }
860 
861  if( nc_def_dim( ncFile, "hexexteriorsize", (size_t)15, &hexexteriorsize ) != NC_NOERR )
862  {
863  MB_SET_ERR( MB_FAILURE, "WriteSLAC: failed to define exterior hex element size" );
864  }
865 
866  if( 0 != mesh_info.num_int_tets &&
867  nc_def_dim( ncFile, "tetinterior", (size_t)mesh_info.num_int_tets, &tetinterior ) != NC_NOERR )
868  {
869  MB_SET_ERR( MB_FAILURE, "WriteSLAC: failed to define number of interior tet elements" );
870  }
871 
872  if( nc_def_dim( ncFile, "tetinteriorsize", (size_t)5, &tetinteriorsize ) != NC_NOERR )
873  {
874  MB_SET_ERR( MB_FAILURE, "WriteSLAC: failed to define interior tet element size" );
875  }
876 
877  if( 0 != mesh_info.bdy_tets.size() &&
878  nc_def_dim( ncFile, "tetexterior", (size_t)mesh_info.bdy_tets.size(), &tetexterior ) != NC_NOERR )
879  {
880  MB_SET_ERR( MB_FAILURE, "WriteSLAC: failed to define number of exterior tet elements" );
881  }
882 
883  if( nc_def_dim( ncFile, "tetexteriorsize", (size_t)9, &tetexteriorsize ) != NC_NOERR )
884  {
885  MB_SET_ERR( MB_FAILURE, "WriteSLAC: failed to define exterior tet element size" );
886  }
887 
888  /* ...and some variables */
889 
890  int dims[2];
891  dims[0] = hexinterior;
892  dims[1] = hexinteriorsize;
893  int dum_var;
894  if( 0 != mesh_info.num_int_hexes &&
895  NC_NOERR != nc_def_var( ncFile, "hexahedron_interior", NC_LONG, 2, dims, &dum_var ) )
896  {
897  MB_SET_ERR( MB_FAILURE, "WriteSLAC: failed to create connectivity array for interior hexes" );
898  }
899 
900  dims[0] = hexexterior;
901  dims[1] = hexexteriorsize;
902  if( 0 != mesh_info.bdy_hexes.size() &&
903  NC_NOERR != nc_def_var( ncFile, "hexahedron_exterior", NC_LONG, 2, dims, &dum_var ) )
904  {
905  MB_SET_ERR( MB_FAILURE, "WriteSLAC: failed to create connectivity array for exterior hexes" );
906  }
907 
908  dims[0] = tetinterior;
909  dims[1] = tetinteriorsize;
910  if( 0 != mesh_info.num_int_tets &&
911  NC_NOERR != nc_def_var( ncFile, "tetrahedron_exterior", NC_LONG, 2, dims, &dum_var ) )
912  {
913  MB_SET_ERR( MB_FAILURE, "WriteSLAC: failed to create connectivity array for interior tets" );
914  }
915 
916  dims[0] = tetexterior;
917  dims[1] = tetexteriorsize;
918  if( 0 != mesh_info.bdy_tets.size() &&
919  NC_NOERR != nc_def_var( ncFile, "tetrahedron_exterior", NC_LONG, 2, dims, &dum_var ) )
920  {
921  MB_SET_ERR( MB_FAILURE, "WriteSLAC: failed to create connectivity array for exterior tets" );
922  }
923 
924  /* Node coordinate arrays: */
925 
926  dims[0] = ncoords;
927  dims[1] = coord_size;
928  if( NC_NOERR != nc_def_var( ncFile, "coords", NC_DOUBLE, 2, dims, &dum_var ) )
929  {
930  MB_SET_ERR( MB_FAILURE, "WriteSLAC: failed to define node coordinate array" );
931  }
932 
933  return MB_SUCCESS;
934 }

References moab::WriteSLAC::MeshInfo::bdy_hexes, moab::WriteSLAC::MeshInfo::bdy_tets, MB_SET_ERR, MB_SUCCESS, ncFile, moab::WriteSLAC::MeshInfo::num_dim, moab::WriteSLAC::MeshInfo::num_int_hexes, moab::WriteSLAC::MeshInfo::num_int_tets, moab::WriteSLAC::MeshInfo::num_nodes, and moab::Range::size().

Referenced by write_file().

◆ open_file()

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

number of dimensions in this file

open a file for writing

Definition at line 936 of file WriteSLAC.cpp.

937 {
938  // Not a valid filname
939  if( strlen( (const char*)filename ) == 0 )
940  {
941  MB_SET_ERR( MB_FAILURE, "Output filename not specified" );
942  }
943 
944  int fail = nc_create( filename, NC_CLOBBER, &ncFile );
945  // File couldn't be opened
946  if( NC_NOERR != fail )
947  {
948  MB_SET_ERR( MB_FAILURE, "Cannot open " << filename );
949  }
950 
951  return MB_SUCCESS;
952 }

References moab::fail(), MB_SET_ERR, MB_SUCCESS, and ncFile.

◆ reset_matset()

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

Definition at line 105 of file WriteSLAC.cpp.

106 {
107  std::vector< WriteSLAC::MaterialSetData >::iterator iter;
108 
109  for( iter = matset_info.begin(); iter != matset_info.end(); ++iter )
110  delete( *iter ).elements;
111 }

Referenced by write_file().

◆ write_file()

ErrorCode moab::WriteSLAC::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 113 of file WriteSLAC.cpp.

122 {
123  assert( 0 != mMaterialSetTag && 0 != mNeumannSetTag && 0 != mDirichletSetTag );
124 
125  // Check the file name
126  if( NULL == strstr( file_name, ".ncdf" ) ) return MB_FAILURE;
127 
128  std::vector< EntityHandle > matsets, dirsets, neusets, entities;
129 
130  fileName = file_name;
131 
132  // Separate into material sets, dirichlet sets, neumann sets
133 
134  if( num_sets == 0 )
135  {
136  // Default to all defined sets
137  Range this_range;
138  mbImpl->get_entities_by_type_and_tag( 0, MBENTITYSET, &mMaterialSetTag, NULL, 1, this_range );
139  std::copy( this_range.begin(), this_range.end(), std::back_inserter( matsets ) );
140  this_range.clear();
141  mbImpl->get_entities_by_type_and_tag( 0, MBENTITYSET, &mDirichletSetTag, NULL, 1, this_range );
142  std::copy( this_range.begin(), this_range.end(), std::back_inserter( dirsets ) );
143  this_range.clear();
144  mbImpl->get_entities_by_type_and_tag( 0, MBENTITYSET, &mNeumannSetTag, NULL, 1, this_range );
145  std::copy( this_range.begin(), this_range.end(), std::back_inserter( neusets ) );
146  }
147  else
148  {
149  int dummy;
150  for( const EntityHandle* iter = ent_handles; iter < ent_handles + num_sets; ++iter )
151  {
152  if( MB_SUCCESS == mbImpl->tag_get_data( mMaterialSetTag, &( *iter ), 1, &dummy ) )
153  matsets.push_back( *iter );
154  else if( MB_SUCCESS == mbImpl->tag_get_data( mDirichletSetTag, &( *iter ), 1, &dummy ) )
155  dirsets.push_back( *iter );
156  else if( MB_SUCCESS == mbImpl->tag_get_data( mNeumannSetTag, &( *iter ), 1, &dummy ) )
157  neusets.push_back( *iter );
158  }
159  }
160 
161  // If there is nothing to write just return.
162  if( matsets.empty() && dirsets.empty() && neusets.empty() ) return MB_FILE_WRITE_ERROR;
163 
164  std::vector< WriteSLAC::MaterialSetData > matset_info;
165  std::vector< WriteSLAC::DirichletSetData > dirset_info;
166  std::vector< WriteSLAC::NeumannSetData > neuset_info;
167 
168  MeshInfo mesh_info;
169 
170  matset_info.clear();
171  if( gather_mesh_information( mesh_info, matset_info, neuset_info, dirset_info, matsets, neusets, dirsets ) !=
172  MB_SUCCESS )
173  {
174  reset_matset( matset_info );
175  return MB_FAILURE;
176  }
177 
178  // Try to open the file after gather mesh info succeeds
179  int fail = nc_create( file_name, overwrite ? NC_CLOBBER : NC_NOCLOBBER, &ncFile );
180  if( NC_NOERR != fail )
181  {
182  reset_matset( matset_info );
183  return MB_FAILURE;
184  }
185 
186  if( initialize_file( mesh_info ) != MB_SUCCESS )
187  {
188  reset_matset( matset_info );
189  return MB_FAILURE;
190  }
191 
192  if( write_nodes( mesh_info.num_nodes, mesh_info.nodes, mesh_info.num_dim ) != MB_SUCCESS )
193  {
194  reset_matset( matset_info );
195  return MB_FAILURE;
196  }
197 
198  if( write_matsets( mesh_info, matset_info, neuset_info ) )
199  {
200  reset_matset( matset_info );
201  return MB_FAILURE;
202  }
203 
204  fail = nc_close( ncFile );
205  if( NC_NOERR != fail ) return MB_FAILURE;
206 
207  return MB_SUCCESS;
208 }

References moab::Range::begin(), moab::Range::clear(), moab::Range::end(), entities, moab::fail(), 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, ncFile, moab::WriteSLAC::MeshInfo::nodes, moab::WriteSLAC::MeshInfo::num_dim, moab::WriteSLAC::MeshInfo::num_nodes, reset_matset(), moab::Interface::tag_get_data(), write_matsets(), and write_nodes().

◆ write_matsets()

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

Definition at line 621 of file WriteSLAC.cpp.

624 {
625  unsigned int i;
626  std::vector< int > connect;
627  const EntityHandle* connecth;
628  int num_connecth;
629  ErrorCode result;
630 
631  // First write the interior hexes
632  int hex_conn = -1;
633  std::vector< int > dims;
634  if( mesh_info.bdy_hexes.size() != 0 || mesh_info.num_int_hexes != 0 )
635  {
636  GET_VAR( "hexahedron_interior", hex_conn, dims );
637  if( -1 == hex_conn ) return MB_FAILURE;
638  }
639  connect.reserve( 13 );
640  Range::iterator rit;
641 
642  int elem_num = 0;
643  WriteSLAC::MaterialSetData matset;
644  size_t start[2] = { 0, 0 }, count[2] = { 1, 1 };
645  int fail;
646  for( i = 0; i < matset_data.size(); i++ )
647  {
648  matset = matset_data[i];
649  if( matset.moab_type != MBHEX ) continue;
650 
651  int id = matset.id;
652  connect[0] = id;
653 
654  for( rit = matset.elements->begin(); rit != matset.elements->end(); ++rit )
655  {
656  // Skip if it's on the bdy
657  if( mesh_info.bdy_hexes.find( *rit ) != mesh_info.bdy_hexes.end() ) continue;
658 
659  // Get the connectivity of this element
660  result = mbImpl->get_connectivity( *rit, connecth, num_connecth );
661  if( MB_SUCCESS != result ) return result;
662 
663  // Get the vertex ids
664  result = mbImpl->tag_get_data( mGlobalIdTag, connecth, num_connecth, &connect[1] );
665  if( MB_SUCCESS != result ) return result;
666 
667  // Put the variable at the right position
668  start[0] = elem_num++;
669  count[1] = 9;
670 
671  // Write the data
672  fail = nc_put_vara_int( ncFile, hex_conn, start, count, &connect[0] );
673  if( NC_NOERR != fail ) return MB_FAILURE;
674  }
675  }
676 
677  int tet_conn = -1;
678  if( mesh_info.bdy_tets.size() != 0 || mesh_info.num_int_tets != 0 )
679  {
680  GET_VAR( "tetrahedron_interior", tet_conn, dims );
681  if( -1 == tet_conn ) return MB_FAILURE;
682  }
683 
684  // Now the interior tets
685  elem_num = 0;
686  for( i = 0; i < matset_data.size(); i++ )
687  {
688  matset = matset_data[i];
689  if( matset.moab_type != MBTET ) continue;
690 
691  int id = matset.id;
692  connect[0] = id;
693  elem_num = 0;
694  for( rit = matset.elements->begin(); rit != matset.elements->end(); ++rit )
695  {
696  // Skip if it's on the bdy
697  if( mesh_info.bdy_tets.find( *rit ) != mesh_info.bdy_tets.end() ) continue;
698 
699  // Get the connectivity of this element
700  result = mbImpl->get_connectivity( *rit, connecth, num_connecth );
701  if( MB_SUCCESS != result ) return result;
702 
703  // Get the vertex ids
704  result = mbImpl->tag_get_data( mGlobalIdTag, connecth, num_connecth, &connect[1] );
705  if( MB_SUCCESS != result ) return result;
706 
707  // Put the variable at the right position
708  start[0] = elem_num++;
709  count[1] = 5;
710  fail = nc_put_vara_int( ncFile, tet_conn, start, count, &connect[0] );
711  // Write the data
712  if( NC_NOERR != fail ) return MB_FAILURE;
713  }
714  }
715 
716  // Now the exterior hexes
717  if( mesh_info.bdy_hexes.size() != 0 )
718  {
719  hex_conn = -1;
720  GET_VAR( "hexahedron_exterior", hex_conn, dims );
721  if( -1 == hex_conn ) return MB_FAILURE;
722 
723  connect.reserve( 15 );
724  elem_num = 0;
725 
726  // Write the elements
727  for( rit = mesh_info.bdy_hexes.begin(); rit != mesh_info.bdy_hexes.end(); ++rit )
728  {
729  // Get the material set for this hex
730  result = mbImpl->tag_get_data( mMatSetIdTag, &( *rit ), 1, &connect[0] );
731  if( MB_SUCCESS != result ) return result;
732 
733  // Get the connectivity of this element
734  result = mbImpl->get_connectivity( *rit, connecth, num_connecth );
735  if( MB_SUCCESS != result ) return result;
736 
737  // Get the vertex ids
738  result = mbImpl->tag_get_data( mGlobalIdTag, connecth, num_connecth, &connect[1] );
739  if( MB_SUCCESS != result ) return result;
740 
741  // Preset side numbers
742  for( i = 9; i < 15; i++ )
743  connect[i] = -1;
744 
745  // Now write the side numbers
746  for( i = 0; i < neuset_data.size(); i++ )
747  {
748  std::vector< EntityHandle >::iterator vit =
749  std::find( neuset_data[i].elements.begin(), neuset_data[i].elements.end(), *rit );
750  while( vit != neuset_data[i].elements.end() )
751  {
752  // Have a side - get the side # and put in connect array
753  int side_no = neuset_data[i].side_numbers[vit - neuset_data[i].elements.begin()];
754  connect[9 + side_no] = neuset_data[i].id;
755  ++vit;
756  vit = std::find( vit, neuset_data[i].elements.end(), *rit );
757  }
758  }
759 
760  // Put the variable at the right position
761  start[0] = elem_num++;
762  count[1] = 15;
763  fail = nc_put_vara_int( ncFile, hex_conn, start, count, &connect[0] );
764  // Write the data
765  if( NC_NOERR != fail ) return MB_FAILURE;
766  }
767  }
768 
769  // Now the exterior tets
770  if( mesh_info.bdy_tets.size() != 0 )
771  {
772  tet_conn = -1;
773  GET_VAR( "tetrahedron_exterior", tet_conn, dims );
774  if( -1 == tet_conn ) return MB_FAILURE;
775 
776  connect.reserve( 9 );
777  elem_num = 0;
778 
779  // Write the elements
780  for( rit = mesh_info.bdy_tets.begin(); rit != mesh_info.bdy_tets.end(); ++rit )
781  {
782  // Get the material set for this tet
783  result = mbImpl->tag_get_data( mMatSetIdTag, &( *rit ), 1, &connect[0] );
784  if( MB_SUCCESS != result ) return result;
785 
786  // Get the connectivity of this element
787  result = mbImpl->get_connectivity( *rit, connecth, num_connecth );
788  if( MB_SUCCESS != result ) return result;
789 
790  // Get the vertex ids
791  result = mbImpl->tag_get_data( mGlobalIdTag, connecth, num_connecth, &connect[1] );
792  if( MB_SUCCESS != result ) return result;
793 
794  // Preset side numbers
795  for( i = 5; i < 9; i++ )
796  connect[i] = -1;
797 
798  // Now write the side numbers
799  for( i = 0; i < neuset_data.size(); i++ )
800  {
801  std::vector< EntityHandle >::iterator vit =
802  std::find( neuset_data[i].elements.begin(), neuset_data[i].elements.end(), *rit );
803  while( vit != neuset_data[i].elements.end() )
804  {
805  // Have a side - get the side # and put in connect array
806  int side_no = neuset_data[i].side_numbers[vit - neuset_data[i].elements.begin()];
807  connect[5 + side_no] = neuset_data[i].id;
808  ++vit;
809  vit = std::find( vit, neuset_data[i].elements.end(), *rit );
810  }
811  }
812 
813  // Put the variable at the right position
814  start[0] = elem_num++;
815  count[1] = 9;
816  fail = nc_put_vara_int( ncFile, tet_conn, start, count, &connect[0] );
817  // Write the data
818  if( NC_NOERR != fail ) return MB_FAILURE;
819  }
820  }
821 
822  return MB_SUCCESS;
823 }

References moab::WriteSLAC::MeshInfo::bdy_hexes, moab::WriteSLAC::MeshInfo::bdy_tets, moab::Range::begin(), moab::WriteSLAC::MaterialSetData::elements, moab::Range::end(), ErrorCode, moab::fail(), moab::Range::find(), moab::Interface::get_connectivity(), GET_VAR, moab::WriteSLAC::MaterialSetData::id, MB_SUCCESS, MBHEX, mbImpl, MBTET, mGlobalIdTag, mMatSetIdTag, moab::WriteSLAC::MaterialSetData::moab_type, ncFile, moab::WriteSLAC::MeshInfo::num_int_hexes, moab::WriteSLAC::MeshInfo::num_int_tets, moab::Range::size(), and moab::Interface::tag_get_data().

Referenced by write_file().

◆ write_nodes()

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

Definition at line 485 of file WriteSLAC.cpp.

486 {
487  // See if should transform coordinates
488  ErrorCode result;
489  Tag trans_tag;
490  result = mbImpl->tag_get_handle( MESH_TRANSFORM_TAG_NAME, 16, MB_TYPE_DOUBLE, trans_tag );
491  bool transform_needed = true;
492  if( result == MB_TAG_NOT_FOUND ) transform_needed = false;
493 
494  int num_coords_to_fill = transform_needed ? 3 : dimension;
495 
496  std::vector< double* > coord_arrays( 3 );
497  coord_arrays[0] = new double[num_nodes];
498  coord_arrays[1] = new double[num_nodes];
499  coord_arrays[2] = NULL;
500 
501  if( num_coords_to_fill == 3 ) coord_arrays[2] = new double[num_nodes];
502 
503  result = mWriteIface->get_node_coords( dimension, num_nodes, nodes, mGlobalIdTag, 0, coord_arrays );
504  if( result != MB_SUCCESS )
505  {
506  delete[] coord_arrays[0];
507  delete[] coord_arrays[1];
508  if( coord_arrays[2] ) delete[] coord_arrays[2];
509  return result;
510  }
511 
512  if( transform_needed )
513  {
514  double trans_matrix[16];
515  const EntityHandle mesh = 0;
516  result = mbImpl->tag_get_data( trans_tag, &mesh, 1, trans_matrix );MB_CHK_SET_ERR( result, "Couldn't get transform data" );
517 
518  for( int i = 0; i < num_nodes; i++ )
519  {
520  double vec1[3];
521  double vec2[3];
522 
523  vec2[0] = coord_arrays[0][i];
524  vec2[1] = coord_arrays[1][i];
525  vec2[2] = coord_arrays[2][i];
526 
527  for( int row = 0; row < 3; row++ )
528  {
529  vec1[row] = 0.0;
530  for( int col = 0; col < 3; col++ )
531  vec1[row] += ( trans_matrix[( row * 4 ) + col] * vec2[col] );
532  }
533 
534  coord_arrays[0][i] = vec1[0];
535  coord_arrays[1][i] = vec1[1];
536  coord_arrays[2][i] = vec1[2];
537  }
538  }
539 
540  // Write the nodes
541  int nc_var = -1;
542  std::vector< int > dims;
543  GET_VAR( "coords", nc_var, dims );
544  if( -1 == nc_var ) return MB_FAILURE;
545  size_t start[2] = { 0, 0 }, count[2] = { static_cast< size_t >( num_nodes ), 1 };
546  int fail = nc_put_vara_double( ncFile, nc_var, start, count, coord_arrays[0] );
547  if( NC_NOERR != fail ) return MB_FAILURE;
548  start[1] = 1;
549  fail = nc_put_vara_double( ncFile, nc_var, start, count, coord_arrays[1] );
550  if( NC_NOERR != fail ) return MB_FAILURE;
551  start[1] = 2;
552  fail = nc_put_vara_double( ncFile, nc_var, start, count, coord_arrays[2] );
553  if( NC_NOERR != fail ) return MB_FAILURE;
554 
555  delete[] coord_arrays[0];
556  delete[] coord_arrays[1];
557  if( coord_arrays[2] ) delete[] coord_arrays[2];
558 
559  return MB_SUCCESS;
560 }

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

Referenced by write_file().

Member Data Documentation

◆ fileName

std::string moab::WriteSLAC::fileName
private

file name

Definition at line 139 of file WriteSLAC.hpp.

Referenced by write_file().

◆ mbImpl

Interface* moab::WriteSLAC::mbImpl
private

◆ mDirichletSetTag

Tag moab::WriteSLAC::mDirichletSetTag
private

Definition at line 145 of file WriteSLAC.hpp.

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

◆ mEntityMark

Tag moab::WriteSLAC::mEntityMark
private

Definition at line 150 of file WriteSLAC.hpp.

Referenced by gather_mesh_information(), get_valid_sides(), WriteSLAC(), and ~WriteSLAC().

◆ mGlobalIdTag

Tag moab::WriteSLAC::mGlobalIdTag
private

Definition at line 147 of file WriteSLAC.hpp.

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

◆ mMaterialSetTag

Tag moab::WriteSLAC::mMaterialSetTag
private

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

Definition at line 144 of file WriteSLAC.hpp.

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

◆ mMatSetIdTag

Tag moab::WriteSLAC::mMatSetIdTag
private

Definition at line 148 of file WriteSLAC.hpp.

Referenced by gather_interior_exterior(), write_matsets(), and WriteSLAC().

◆ mNeumannSetTag

Tag moab::WriteSLAC::mNeumannSetTag
private

Definition at line 146 of file WriteSLAC.hpp.

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

◆ mWriteIface

WriteUtilIface* moab::WriteSLAC::mWriteIface
private

Definition at line 136 of file WriteSLAC.hpp.

Referenced by gather_mesh_information(), write_nodes(), WriteSLAC(), and ~WriteSLAC().

◆ ncFile

int moab::WriteSLAC::ncFile
private

Definition at line 140 of file WriteSLAC.hpp.

Referenced by initialize_file(), open_file(), write_file(), write_matsets(), and write_nodes().


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