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

#include <ReadRTT.hpp>

+ Inheritance diagram for moab::ReadRTT:
+ Collaboration diagram for moab::ReadRTT:

Classes

struct  boundary
 
struct  cell
 
struct  facet
 
struct  headerData
 
struct  node
 
struct  side
 
struct  tet
 

Public Member Functions

ErrorCode load_file (const char *file_name, const EntityHandle *file_set, const FileOptions &opts, const SubsetList *subset_list=0, const Tag *file_id_tag=0)
 Load mesh from a file. More...
 
 ReadRTT (Interface *impl=NULL)
 
virtual ~ReadRTT ()
 
ErrorCode read_tag_values (const char *file_name, const char *tag_name, const FileOptions &opts, std::vector< int > &tag_values_out, const SubsetList *subset_list=0)
 Read tag values from a file. More...
 
- Public Member Functions inherited from moab::ReaderIface
virtual ~ReaderIface ()
 

Static Public Member Functions

static ReaderIfacefactory (Interface *)
 

Private Member Functions

ErrorCode generate_topology (std::vector< side > side_data, std::vector< cell > cell_data, std::map< int, EntityHandle > &surface_map)
 
void generate_parent_child_links (int num_ents[4], std::vector< EntityHandle > entity_map[4], std::vector< side > side_data, std::vector< cell > cell_data)
 
void set_surface_senses (int num_ents[4], std::vector< EntityHandle > entity_map[4], std::vector< side > side_data, std::vector< cell > cell_data)
 
ErrorCode setup_group_data (std::vector< EntityHandle > entity_map[4])
 
EntityHandle create_group (std::string group_name, int id)
 
ErrorCode build_moab (std::vector< node > node_data, std::vector< facet > facet_data, std::vector< tet > tet_data, std::map< int, EntityHandle > surface_map)
 
ErrorCode read_header (const char *filename)
 
ErrorCode read_sides (const char *filename, std::vector< side > &side_data)
 
ErrorCode read_cells (const char *filename, std::vector< cell > &cell_data)
 
ErrorCode read_nodes (const char *filename, std::vector< node > &node_data)
 
ErrorCode read_facets (const char *filename, std::vector< facet > &facet_data)
 
ErrorCode read_tets (const char *filename, std::vector< tet > &tet_data)
 
ErrorCode get_header_data (std::ifstream &input_file)
 
cell get_cell_data (std::string celldata)
 
side get_side_data (std::string sidedata)
 
node get_node_data (std::string nodedata)
 
facet get_facet_data (std::string facetdata)
 
tet get_tet_data (std::string tetdata)
 
std::vector< std::string > split_string (std::string string_to_split, char split_char)
 
boundary split_name (std::string atilla_cellname)
 
int count_sides (std::vector< side > side_data, std::vector< int > &surface_numbers)
 

Private Attributes

headerData header_data
 
ReadUtilIfacereadMeshIface
 
InterfaceMBI
 
GeomTopoToolmyGeomTool
 
Tag geom_tag
 
Tag id_tag
 
Tag name_tag
 
Tag category_tag
 
Tag faceting_tol_tag
 

Detailed Description

Definition at line 112 of file ReadRTT.hpp.

Constructor & Destructor Documentation

◆ ReadRTT()

ReadRTT::ReadRTT ( Interface impl = NULL)

Definition at line 56 of file ReadRTT.cpp.

57  : MBI( impl ), geom_tag( 0 ), id_tag( 0 ), name_tag( 0 ), category_tag( 0 ), faceting_tol_tag( 0 )
58 {
59  assert( NULL != impl );
60  myGeomTool = new GeomTopoTool( impl );
62  assert( NULL != readMeshIface );
63 
64  // this section copied from ReadCGM initalisation
65  int negone = -1;
66  double zero = 0.;
67  ErrorCode rval;
69  &negone );
70  assert( !rval );
71  id_tag = MBI->globalId_tag();
73  assert( !rval );
76  assert( !rval );
77  rval =
79  assert( !rval );
80 #ifdef NDEBUG
81  if( !rval )
82  {
83  }; // Line to avoid compiler warning about variable set but not used
84 #endif
85 }

References category_tag, CATEGORY_TAG_NAME, CATEGORY_TAG_SIZE, ErrorCode, faceting_tol_tag, GEOM_DIMENSION_TAG_NAME, geom_tag, moab::Interface::globalId_tag(), id_tag, MB_TAG_CREAT, MB_TAG_SPARSE, MB_TYPE_DOUBLE, MB_TYPE_INTEGER, MB_TYPE_OPAQUE, MBI, myGeomTool, name_tag, NAME_TAG_NAME, NAME_TAG_SIZE, moab::Interface::query_interface(), readMeshIface, and moab::Interface::tag_get_handle().

Referenced by factory().

◆ ~ReadRTT()

ReadRTT::~ReadRTT ( )
virtual

Definition at line 88 of file ReadRTT.cpp.

89 {
90  if( readMeshIface )
91  {
93  readMeshIface = 0;
94  }
95 
96  delete myGeomTool;
97 }

References MBI, myGeomTool, readMeshIface, and moab::Interface::release_interface().

Member Function Documentation

◆ build_moab()

ErrorCode ReadRTT::build_moab ( std::vector< node node_data,
std::vector< facet facet_data,
std::vector< tet tet_data,
std::map< int, EntityHandle surface_map 
)
private

Builds the full MOAB representation of the data, making vertices from coordinates, triangles from vertices and tets from the same vertices. Tags appropriate to each dataset collection are applied, triangles are tagged with the surface id and side id they belong to, as well as tagging the surface with the same data. Tets are similarly tagged only with the Material number

Parameters
node_datathe node data
facet_data,thetriangles in the problem
tet_data,thetets in the problem
surface_map,themap of surface meshset and id numbers
Returns
moab::ErrorCode

Definition at line 248 of file ReadRTT.cpp.

252 {
253 
254  ErrorCode rval; // reusable return value
255  EntityHandle file_set; // the file handle
256  // create the file set
257  rval = MBI->create_meshset( MESHSET_SET, file_set );
258  if( MB_SUCCESS != rval ) return rval;
259 
260  // create the vertices
261  EntityHandle handle;
262  std::vector< node >::iterator it; // iterate over the nodes
263  Range mb_coords; // range of coordinates
264  for( it = node_data.begin(); it != node_data.end(); ++it )
265  {
266  node tmp = *it;
267  double coords[3] = { tmp.x, tmp.y, tmp.z };
268  rval = MBI->create_vertex( coords, handle );
269  if( MB_SUCCESS != rval ) return rval;
270  mb_coords.insert( handle ); // inesert handle into the coordinate range
271  }
272 
273  // add verts to set
274  rval = MBI->add_entities( file_set, mb_coords );
275 
276  // create sense tag
277  Tag side_id_tag, surface_number_tag;
278  // int zero = 0;
279  rval = MBI->tag_get_handle( "SIDEID_TAG", 1, MB_TYPE_INTEGER, side_id_tag, MB_TAG_SPARSE | MB_TAG_CREAT );
280  rval =
281  MBI->tag_get_handle( "SURFACE_NUMBER", 1, MB_TYPE_INTEGER, surface_number_tag, MB_TAG_SPARSE | MB_TAG_CREAT );
282 
283  // create the facets
284  EntityHandle triangle;
285  std::vector< facet >::iterator it_f;
286  // range of triangles
287  Range mb_tris;
288  // loop over the facet data
289  for( it_f = facet_data.begin(); it_f != facet_data.end(); ++it_f )
290  {
291  facet tmp = *it_f;
292  // get the nodes for the triangle
293  EntityHandle tri_nodes[3] = { mb_coords[tmp.connectivity[0] - 1], mb_coords[tmp.connectivity[1] - 1],
294  mb_coords[tmp.connectivity[2] - 1] };
295  // create a triangle element
296  rval = MBI->create_element( MBTRI, tri_nodes, 3, triangle );
297  // tag in side id on the triangle
298  rval = MBI->tag_set_data( side_id_tag, &triangle, 1, &tmp.side_id );
299  // tag the surface number on the triangle
300  rval = MBI->tag_set_data( surface_number_tag, &triangle, 1, &tmp.surface_number );
301  // insert vertices and triangles into the appropriate surface meshset
302  EntityHandle meshset_handle = surface_map[tmp.surface_number];
303  // also set surface tag
304  rval = MBI->tag_set_data( side_id_tag, &meshset_handle, 1, &tmp.side_id );
305  rval = MBI->tag_set_data( surface_number_tag, &meshset_handle, 1, &tmp.surface_number );
306  // add vertices to the mesh
307  rval = MBI->add_entities( meshset_handle, &( *tri_nodes ), 3 );
308  // add triangles to the meshset
309  rval = MBI->add_entities( meshset_handle, &triangle, 1 );
310  // ineter triangles into large run
311  mb_tris.insert( triangle );
312  }
313  // add tris to set to fileset
314  rval = MBI->add_entities( file_set, mb_tris );
315 
316  // create material number tag
317  Tag mat_num_tag;
318  // int zero = 0;
319  rval = MBI->tag_get_handle( "MATERIAL_NUMBER", 1, MB_TYPE_INTEGER, mat_num_tag, MB_TAG_SPARSE | MB_TAG_CREAT );
320 
321  // create the tets
322  EntityHandle tetra; // handle for a specific tet
323  std::vector< tet >::iterator it_t;
324  Range mb_tets;
325  // loop over all tets
326  for( it_t = tet_data.begin(); it_t != tet_data.end(); ++it_t )
327  {
328  tet tmp = *it_t;
329  // get the handles for the tet
330  EntityHandle tet_nodes[4] = { mb_coords[tmp.connectivity[0] - 1], mb_coords[tmp.connectivity[1] - 1],
331  mb_coords[tmp.connectivity[2] - 1], mb_coords[tmp.connectivity[3] - 1] };
332  // create the tet
333  rval = MBI->create_element( MBTET, tet_nodes, 4, tetra );
334  int mat_number = tmp.material_number;
335  // tag the tet with the material number
336  rval = MBI->tag_set_data( mat_num_tag, &tetra, 1, &mat_number );
337  // set the tag data
338  mb_tets.insert( tetra );
339  }
340  // add tris to set
341  rval = MBI->add_entities( file_set, mb_tets );
342 
343  return MB_SUCCESS;
344 }

References moab::Interface::add_entities(), moab::ReadRTT::facet::connectivity, moab::ReadRTT::tet::connectivity, moab::Interface::create_element(), moab::Interface::create_meshset(), moab::Interface::create_vertex(), ErrorCode, moab::Range::insert(), moab::ReadRTT::tet::material_number, MB_SUCCESS, MB_TAG_CREAT, MB_TAG_SPARSE, MB_TYPE_INTEGER, MBI, MBTET, MBTRI, MESHSET_SET, moab::ReadRTT::facet::side_id, moab::ReadRTT::facet::surface_number, moab::Interface::tag_get_handle(), moab::Interface::tag_set_data(), moab::ReadRTT::node::x, moab::ReadRTT::node::y, and moab::ReadRTT::node::z.

Referenced by load_file().

◆ count_sides()

int moab::ReadRTT::count_sides ( std::vector< side side_data,
std::vector< int > &  surface_numbers 
)
private

Count the number of unique surface numbers in the dataset, also get list of surface numbers

Parameters
side_data,collectionof all the side data in the mesh
surface_numbers,collectionof surface numbers

returns the number of surface numbers

◆ create_group()

EntityHandle ReadRTT::create_group ( std::string  group_name,
int  id 
)
private

create a group of a given name, mustkeep track of id

Parameters
group_name,nameof the group
id,integerid number

returns the entity handle of the group

Definition at line 926 of file ReadRTT.cpp.

927 {
928  ErrorCode rval;
929  // category tags
930  const char geom_categories[][CATEGORY_TAG_SIZE] = { "Vertex\0", "Curve\0", "Surface\0", "Volume\0", "Group\0" };
931 
932  EntityHandle handle;
933  rval = MBI->create_meshset( MESHSET_SET, handle );
934  if( MB_SUCCESS != rval ) return rval;
935 
936  rval = MBI->tag_set_data( name_tag, &handle, 1, group_name.c_str() );
937  if( MB_SUCCESS != rval ) return MB_FAILURE;
938 
939  rval = MBI->tag_set_data( id_tag, &handle, 1, &id );
940  if( MB_SUCCESS != rval ) return MB_FAILURE;
941 
942  rval = MBI->tag_set_data( category_tag, &handle, 1, &geom_categories[4] );
943  if( MB_SUCCESS != rval ) return MB_FAILURE;
944 
945  return handle;
946 }

References category_tag, CATEGORY_TAG_SIZE, moab::Interface::create_meshset(), ErrorCode, id_tag, MB_SUCCESS, MBI, MESHSET_SET, name_tag, and moab::Interface::tag_set_data().

Referenced by setup_group_data().

◆ factory()

ReaderIface * ReadRTT::factory ( Interface iface)
static

Definition at line 50 of file ReadRTT.cpp.

51 {
52  return new ReadRTT( iface );
53 }

References iface, and ReadRTT().

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

◆ generate_parent_child_links()

void ReadRTT::generate_parent_child_links ( int  num_ents[4],
std::vector< EntityHandle entity_map[4],
std::vector< side side_data,
std::vector< cell cell_data 
)
private

Generate parent child links to create DAGMC like structure of surface meshsets being children of parent cell meshsets. By looping over the surfaces (1->N), look in the description of the cells that are shared by that surface, and then make the surface the child of the parent volume. The appropriate sense data will be set later

Parameters
num_ents[4],arraycontaining the number of surfaces, cells, groups etc
entity_map[4],vectorof maps containing data by dimension
side_data,vectorof all the side data in the problem
cell_data,vectorof the cell data in the problem

Definition at line 822 of file ReadRTT.cpp.

826 {
827  ErrorCode rval; // return value
828  // loop over the number of surfaces
829  for( int i = 0; i < num_ents[2]; i++ )
830  {
831  // get the surface handle
832  EntityHandle surf_handle = entity_map[2][i];
833  // there are volumes that share this face
834  for( unsigned int shared = 0; shared <= 1; shared++ )
835  {
836  std::string parent_name = side_data[i].names[shared];
837  // find the @ sign
838  unsigned pos = parent_name.find( "@" );
839  parent_name = parent_name.substr( 0, pos );
840 
841  // loop over tets looking for matching name
842  for( int j = 0; j < num_ents[3]; j++ )
843  {
844  // if match found
845  if( cell_data[j].name.compare( parent_name ) == 0 )
846  {
847  EntityHandle cell_handle = entity_map[3][j];
848  // parent
849  rval = MBI->add_parent_child( cell_handle, surf_handle );
850  if( rval != MB_SUCCESS )
851  {
852  std::cerr << "Failed to add parent child relationship" << std::endl;
853  }
854  }
855  }
856  }
857  }
858  return;
859 }

References moab::Interface::add_parent_child(), ErrorCode, MB_SUCCESS, and MBI.

Referenced by generate_topology().

◆ generate_topology()

ErrorCode ReadRTT::generate_topology ( std::vector< side side_data,
std::vector< cell cell_data,
std::map< int, EntityHandle > &  surface_map 
)
private

generates the topology of the problem from the already read input data, loops over the 2 and 3 dimension macrodata that exist from the rtt file, sides = dagmc surfaces, cells = dagmc cells, creates a meshset for each surface and tags with the id number, and similarly makes a meshset for dagmc cells and tags with the id number. The surfaces are added to the s surface map, where the key is the surface ID number (1->N) and (cells and surfaces are added to an dimesional entity map stored in the class

Parameters
side_data,vectorof side data
cell_data,vectorof vector of cell data
surface_map,referenceto the surface map of data

Definition at line 175 of file ReadRTT.cpp.

178 {
179 
180  ErrorCode rval;
181  std::vector< EntityHandle > entmap[4];
182  int num_ents[4]; // number of entities in each dimension
183 
184  const char geom_categories[][CATEGORY_TAG_SIZE] = { "Vertex\0", "Curve\0", "Surface\0", "Volume\0", "Group\0" };
185 
186  std::vector< int > surface_numbers; // the surface numbers in the problem
187 
188  // corresponds to number of cad like surfaces and cad like volumes
189  num_ents[2] = side_data.size();
190  num_ents[3] = cell_data.size();
191 
192  // loop over surfaces & volumes
193  for( int dim = 2; dim <= 3; dim++ )
194  {
195  for( int i = 0; i != num_ents[dim]; i++ )
196  {
197  EntityHandle handle;
198  // create a meshset for each entity surface/volume
199  rval = MBI->create_meshset( dim == 1 ? MESHSET_ORDERED : MESHSET_SET, handle );
200  // if failure
201  if( rval != MB_SUCCESS ) return rval;
202 
203  // collect the entity handles into an
204  entmap[dim].push_back( handle );
205 
206  // set the dimension tag
207  rval = MBI->tag_set_data( geom_tag, &handle, 1, &dim );
208  // if fail
209  if( MB_SUCCESS != rval ) return rval;
210  // if we are a surface
211  if( dim == 2 )
212  {
213  // tag the id onto the surface meshset
214  rval = MBI->tag_set_data( id_tag, &handle, 1, &side_data[i].id );
215  // inesert entity into the map
216  surface_map[side_data[i].id] = handle;
217  }
218  else
219  {
220  // otherwise we set the volume tag data, loop is only 2 & 3 dim
221  rval = MBI->tag_set_data( id_tag, &handle, 1, &cell_data[i].id );
222  }
223  // if fail
224  if( MB_SUCCESS != rval ) return rval;
225  // set the category tag
226  rval = MBI->tag_set_data( category_tag, &handle, 1, &geom_categories[dim] );
227  if( MB_SUCCESS != rval ) return rval;
228  }
229  }
230 
231  // generate parent child links
232  // best to loop over the surfaces and assign them to volumes, we can then assign facets to
233  // to each surface
234  generate_parent_child_links( num_ents, entmap, side_data, cell_data );
235 
236  // set the surface senses
237  set_surface_senses( num_ents, entmap, side_data, cell_data );
238 
239  // set the group data
240  rval = setup_group_data( entmap );
241 
242  return MB_SUCCESS;
243 }

References category_tag, CATEGORY_TAG_SIZE, moab::Interface::create_meshset(), dim, ErrorCode, generate_parent_child_links(), geom_tag, id_tag, MB_SUCCESS, MBI, MESHSET_SET, set_surface_senses(), setup_group_data(), and moab::Interface::tag_set_data().

Referenced by load_file().

◆ get_cell_data()

ReadRTT::cell ReadRTT::get_cell_data ( std::string  celldata)
private

Reads a single atomic cell data string and populates a cell struct

Parameters
celldata,astring of read data and
Returns
cell, the propulated cell struct

Definition at line 642 of file ReadRTT.cpp.

643 {
644  cell new_cell;
645  std::vector< std::string > tokens;
646  tokens = ReadRTT::split_string( celldata, ' ' );
647 
648  // set the side id
649  if( tokens.size() != 2 )
650  {
651  MB_SET_ERR_RET_VAL( "Error, too many tokens found from cell_data", new_cell );
652  }
653  // create the new side
654  new_cell.id = std::atoi( tokens[0].c_str() );
655  new_cell.name = tokens[1];
656 
657  return new_cell;
658 }

References moab::ReadRTT::cell::id, MB_SET_ERR_RET_VAL, moab::ReadRTT::cell::name, and split_string().

Referenced by read_cells().

◆ get_facet_data()

ReadRTT::facet ReadRTT::get_facet_data ( std::string  facetdata)
private

Reads a single atomic facet data string and populates a facet struct

Parameters
facetdata,astring of facet data and
Returns
facet, the propulated facet struct

Definition at line 684 of file ReadRTT.cpp.

685 {
686  facet new_facet;
687  std::vector< std::string > tokens;
688  tokens = ReadRTT::split_string( facetdata, ' ' );
689 
690  // set the side id
691  if( tokens.size() != 7 )
692  {
693  MB_SET_ERR_RET_VAL( "Error, too many tokens found from get_facet_data", new_facet );
694  }
695 
696  new_facet.id = std::atoi( tokens[0].c_str() );
697  // branch on the rtt version number
698  if( header_data.version == "v1.0.0" )
699  {
700  new_facet.connectivity[0] = std::atoi( tokens[1].c_str() );
701  new_facet.connectivity[1] = std::atoi( tokens[2].c_str() );
702  new_facet.connectivity[2] = std::atoi( tokens[3].c_str() );
703  new_facet.side_id = std::atoi( tokens[4].c_str() );
704  new_facet.surface_number = std::atoi( tokens[5].c_str() );
705  }
706  else if( header_data.version == "v1.0.1" )
707  {
708  new_facet.connectivity[0] = std::atoi( tokens[2].c_str() );
709  new_facet.connectivity[1] = std::atoi( tokens[3].c_str() );
710  new_facet.connectivity[2] = std::atoi( tokens[4].c_str() );
711  new_facet.side_id = std::atoi( tokens[5].c_str() );
712  new_facet.surface_number = std::atoi( tokens[6].c_str() );
713  }
714  else
715  {
716  MB_SET_ERR_RET_VAL( "Error, version number not understood", new_facet );
717  }
718 
719  return new_facet;
720 }

References moab::ReadRTT::facet::connectivity, header_data, moab::ReadRTT::facet::id, MB_SET_ERR_RET_VAL, moab::ReadRTT::facet::side_id, split_string(), moab::ReadRTT::facet::surface_number, and moab::ReadRTT::headerData::version.

Referenced by read_facets().

◆ get_header_data()

ErrorCode ReadRTT::get_header_data ( std::ifstream &  input_file)
private

Reads the header data into a class member structure

Parameters
input_file,anopen filestream
Returns
void

Definition at line 556 of file ReadRTT.cpp.

557 {
558  std::string line;
559  while( std::getline( input_file, line ) )
560  {
561 
562  // tokenize the line
563  std::istringstream iss( line );
564  std::vector< std::string > split_string;
565  do
566  {
567  std::string sub_string;
568  iss >> sub_string;
569  split_string.push_back( sub_string );
570  } while( iss );
571 
572  // if we find version
573  if( line.find( "version" ) != std::string::npos )
574  {
575  if( split_string[1].find( "v" ) != std::string::npos &&
576  split_string[0].find( "version" ) != std::string::npos )
577  {
579  }
580  }
581 
582  if( line.find( "title" ) != std::string::npos )
583  {
585  }
586  if( line.find( "date" ) != std::string::npos )
587  {
589  }
590  if( line.find( "end_header" ) != std::string::npos )
591  {
592  return MB_SUCCESS;
593  }
594  }
595 
596  // otherwise we never found the end_header keyword
597  return MB_FAILURE;
598 }

References moab::ReadRTT::headerData::date, header_data, input_file, MB_SUCCESS, split_string(), moab::ReadRTT::headerData::title, and moab::ReadRTT::headerData::version.

Referenced by read_header().

◆ get_node_data()

ReadRTT::node ReadRTT::get_node_data ( std::string  nodedata)
private

Reads a single atomic node data string and populates a node struct

Parameters
sidedata,astring of read data and
Returns
node, the propulated node struct

Definition at line 663 of file ReadRTT.cpp.

664 {
665  node new_node;
666  std::vector< std::string > tokens;
667  tokens = ReadRTT::split_string( nodedata, ' ' );
668 
669  // set the side id
670  if( tokens.size() != 5 )
671  {
672  MB_SET_ERR_RET_VAL( "Error, too many tokens found from get_node_data", new_node );
673  }
674  new_node.id = std::atoi( tokens[0].c_str() );
675  new_node.x = std::atof( tokens[1].c_str() );
676  new_node.y = std::atof( tokens[2].c_str() );
677  new_node.z = std::atof( tokens[3].c_str() );
678  return new_node;
679 }

References moab::ReadRTT::node::id, MB_SET_ERR_RET_VAL, split_string(), moab::ReadRTT::node::x, moab::ReadRTT::node::y, and moab::ReadRTT::node::z.

Referenced by read_nodes().

◆ get_side_data()

ReadRTT::side ReadRTT::get_side_data ( std::string  sidedata)
private

Reads a single atomic side data string and populates a side struct

Parameters
sidedata,astring of read data and
Returns
side, the propulated side struct

Definition at line 603 of file ReadRTT.cpp.

604 {
605  side new_side;
606  std::vector< std::string > tokens;
607  tokens = ReadRTT::split_string( sidedata, ' ' );
608 
609  // set the side id
610  if( tokens.size() != 2 )
611  {
612  MB_SET_ERR_RET_VAL( "Error, too many tokens found from side_data", new_side );
613  }
614  // create the new side
615  new_side.id = std::atoi( tokens[0].c_str() );
616 
617  std::vector< std::string > cell_names = ReadRTT::split_string( tokens[1], '/' );
618  // get the boundary
619  boundary new_bnd = ReadRTT::split_name( cell_names[0] );
620  // set the surface sense and name
621  new_side.senses[0] = new_bnd.sense;
622  new_side.names[0] = new_bnd.name;
623  //
624  if( cell_names.size() > 1 )
625  {
626  boundary bnd = ReadRTT::split_name( cell_names[1] );
627  new_side.senses[1] = bnd.sense;
628  new_side.names[1] = bnd.name;
629  }
630  else
631  {
632  new_side.senses[1] = 0;
633  new_side.names[1] = "\0";
634  }
635 
636  return new_side;
637 }

References moab::ReadRTT::side::id, MB_SET_ERR_RET_VAL, moab::ReadRTT::boundary::name, moab::ReadRTT::side::names, moab::ReadRTT::boundary::sense, moab::ReadRTT::side::senses, split_name(), and split_string().

Referenced by read_sides().

◆ get_tet_data()

ReadRTT::tet ReadRTT::get_tet_data ( std::string  tetdata)
private

Reads a single atomic tet data string and populates a tet struct

Parameters
tetdata,astring of tet data and
Returns
tet, the propulated tet struct

Definition at line 725 of file ReadRTT.cpp.

726 {
727  tet new_tet;
728  std::vector< std::string > tokens;
729  tokens = ReadRTT::split_string( tetdata, ' ' );
730 
731  // set the side id
732  if( tokens.size() != 7 )
733  {
734  MB_SET_ERR_RET_VAL( "Error, too many tokens found from get_tet_data", new_tet );
735  }
736  new_tet.id = std::atoi( tokens[0].c_str() );
737  // branch on the version number
738  if( header_data.version == "v1.0.0" )
739  {
740  new_tet.connectivity[0] = std::atoi( tokens[1].c_str() );
741  new_tet.connectivity[1] = std::atoi( tokens[2].c_str() );
742  new_tet.connectivity[2] = std::atoi( tokens[3].c_str() );
743  new_tet.connectivity[3] = std::atoi( tokens[4].c_str() );
744  new_tet.material_number = std::atoi( tokens[5].c_str() );
745  }
746  else if( header_data.version == "v1.0.1" )
747  {
748  new_tet.connectivity[0] = std::atoi( tokens[2].c_str() );
749  new_tet.connectivity[1] = std::atoi( tokens[3].c_str() );
750  new_tet.connectivity[2] = std::atoi( tokens[4].c_str() );
751  new_tet.connectivity[3] = std::atoi( tokens[5].c_str() );
752  new_tet.material_number = std::atoi( tokens[6].c_str() );
753  }
754  else
755  {
756  MB_SET_ERR_RET_VAL( "Error, version number not supported", new_tet );
757  }
758 
759  return new_tet;
760 }

References moab::ReadRTT::tet::connectivity, header_data, moab::ReadRTT::tet::id, moab::ReadRTT::tet::material_number, MB_SET_ERR_RET_VAL, split_string(), and moab::ReadRTT::headerData::version.

Referenced by read_tets().

◆ load_file()

ErrorCode ReadRTT::load_file ( const char *  file_name,
const EntityHandle file_set,
const FileOptions opts,
const SubsetList subset_list = 0,
const Tag file_id_tag = 0 
)
virtual

Load mesh from a file.

Method all readers must provide to import a mesh.

Parameters
file_nameThe file to read.
file_setOptional pointer to entity set representing file. If this is not NULL, reader may optionally tag the pointed-to set with format-specific meta-data.
subset_listAn optional struct pointer specifying the tags identifying entity sets to be read.
file_id_tagIf specified, reader should store for each entity it reads, a unique integer ID for this tag.
Author
Jason Kraftcheck

Implements moab::ReaderIface.

Definition at line 109 of file ReadRTT.cpp.

114 {
115  ErrorCode rval;
116 
117  // at this time there is no support for reading a subset of the file
118  if( subset_list )
119  {
120  std::cout << "Subset reading not supported for RTT meshes" << std::endl;
122  }
123 
124  // test to see if file exists
125  FILE* file = NULL;
126  file = fopen( filename, "r" );
127  if( file == NULL ) return MB_FILE_DOES_NOT_EXIST;
128  // otherwise close the file
129  fclose( file );
130 
131  // read the header
132  rval = ReadRTT::read_header( filename );
133  if( rval != MB_SUCCESS ) return rval;
134 
135  // read the side_flag data
136  std::vector< side > side_data;
137  rval = ReadRTT::read_sides( filename, side_data );
138  if( rval != MB_SUCCESS ) return rval;
139 
140  // read the cell data
141  std::vector< cell > cell_data;
142  rval = ReadRTT::read_cells( filename, cell_data );
143  if( rval != MB_SUCCESS ) return rval;
144 
145  // read the node data
146  std::vector< node > node_data;
147  rval = ReadRTT::read_nodes( filename, node_data );
148  if( rval != MB_SUCCESS ) return rval;
149 
150  // read the facet data
151  std::vector< facet > facet_data;
152  rval = ReadRTT::read_facets( filename, facet_data );
153  if( rval != MB_SUCCESS ) return rval;
154 
155  // read the tetrahedra data
156  std::vector< tet > tet_data;
157  rval = ReadRTT::read_tets( filename, tet_data );
158  if( rval != MB_SUCCESS ) return rval;
159 
160  // make the map of surface number in the rttmesh to the surface meshset
161  std::map< int, EntityHandle > surface_map; // corrsespondance of surface number to entity handle
162  rval = ReadRTT::generate_topology( side_data, cell_data, surface_map );
163  if( rval != MB_SUCCESS ) return rval;
164 
165  // generate the rest of the database, triangles to surface meshsets etc
166  rval = ReadRTT::build_moab( node_data, facet_data, tet_data, surface_map );
167  if( rval != MB_SUCCESS ) return rval;
168 
169  return MB_SUCCESS;
170 }

References build_moab(), ErrorCode, generate_topology(), MB_FILE_DOES_NOT_EXIST, MB_SUCCESS, MB_UNSUPPORTED_OPERATION, read_cells(), read_facets(), read_header(), read_nodes(), read_sides(), and read_tets().

◆ read_cells()

ErrorCode ReadRTT::read_cells ( const char *  filename,
std::vector< cell > &  cell_data 
)
private

Reads the full set of cell data from the file

Parameters
filename,thefile to read all the side data from
celldata, a vector containing all the read cell data
Returns
moab::ErrorCode

Definition at line 414 of file ReadRTT.cpp.

415 {
416  std::string line; // the current line being read
417  std::ifstream input_file( filename ); // filestream for rttfile
418  // file ok?
419  if( !input_file.good() )
420  {
421  std::cout << "Problems reading file = " << filename << std::endl;
422  return MB_FAILURE;
423  }
424  // if it works
425  if( input_file.is_open() )
426  {
427  while( std::getline( input_file, line ) )
428  {
429  if( line.compare( " 1 REGIONS\0" ) == 0 )
430  {
431  // read lines until find end nodes
432  while( std::getline( input_file, line ) )
433  {
434  if( line.compare( "end_cell_flags\0" ) == 0 ) break;
435  cell data = ReadRTT::get_cell_data( line );
436  cell_data.push_back( data );
437  }
438  }
439  }
440  input_file.close();
441  }
442  if( cell_data.size() == 0 ) return MB_FAILURE;
443  return MB_SUCCESS;
444 }

References get_cell_data(), input_file, and MB_SUCCESS.

Referenced by load_file().

◆ read_facets()

ErrorCode ReadRTT::read_facets ( const char *  filename,
std::vector< facet > &  facet_data 
)
private

Reads the full set of facet data from the file

Parameters
filename,thefile to read all the side data from
facetdata, a vector containing all the read facet data
Returns
moab::ErrorCode

Definition at line 485 of file ReadRTT.cpp.

486 {
487  std::string line; // the current line being read
488  std::ifstream input_file( filename ); // filestream for rttfile
489  // file ok?
490  if( !input_file.good() )
491  {
492  std::cout << "Problems reading file = " << filename << std::endl;
493  return MB_FAILURE;
494  }
495 
496  // if it works
497  if( input_file.is_open() )
498  {
499  while( std::getline( input_file, line ) )
500  {
501  if( line.compare( "sides\0" ) == 0 )
502  {
503  // read lines until find end nodes
504  while( std::getline( input_file, line ) )
505  {
506  if( line.compare( "end_sides\0" ) == 0 ) break;
507  facet data = ReadRTT::get_facet_data( line );
508  facet_data.push_back( data );
509  }
510  }
511  }
512  input_file.close();
513  }
514  if( facet_data.size() == 0 ) return MB_FAILURE;
515  return MB_SUCCESS;
516 }

References get_facet_data(), input_file, and MB_SUCCESS.

Referenced by load_file().

◆ read_header()

ErrorCode ReadRTT::read_header ( const char *  filename)
private

reads the full set of header data

Parameters
filename,thefile to read the data from
Returns
moab::Error code

Definition at line 349 of file ReadRTT.cpp.

350 {
351  std::ifstream input_file( filename ); // filename for rtt file
352  // file ok?
353  if( !input_file.good() )
354  {
355  std::cout << "Problems reading file = " << filename << std::endl;
356  return MB_FAILURE;
357  }
358 
359  // if it works
360  std::string line;
361  moab::ErrorCode rval = MB_FAILURE;
362  if( input_file.is_open() )
363  {
364  while( std::getline( input_file, line ) )
365  {
366  if( line.compare( "header" ) == 0 )
367  {
368  rval = get_header_data( input_file );
369  }
370  }
371  input_file.close();
372  }
373  return rval;
374 }

References ErrorCode, get_header_data(), and input_file.

Referenced by load_file().

◆ read_nodes()

ErrorCode ReadRTT::read_nodes ( const char *  filename,
std::vector< node > &  node_data 
)
private

Reads the full set of node data from the file

Parameters
filename,thefile to read all the side data from
nodedata, a vector containing all the read node data
Returns
moab::ErrorCode

Definition at line 449 of file ReadRTT.cpp.

450 {
451  std::string line; // the current line being read
452  std::ifstream input_file( filename ); // filestream for rttfile
453  // file ok?
454  if( !input_file.good() )
455  {
456  std::cout << "Problems reading file = " << filename << std::endl;
457  return MB_FAILURE;
458  }
459 
460  // if it works
461  if( input_file.is_open() )
462  {
463  while( std::getline( input_file, line ) )
464  {
465  if( line.compare( "nodes\0" ) == 0 )
466  {
467  // read lines until find end nodes
468  while( std::getline( input_file, line ) )
469  {
470  if( line.compare( "end_nodes\0" ) == 0 ) break;
471  node data = ReadRTT::get_node_data( line );
472  node_data.push_back( data );
473  }
474  }
475  }
476  input_file.close();
477  }
478  if( node_data.size() == 0 ) return MB_FAILURE;
479  return MB_SUCCESS;
480 }

References get_node_data(), input_file, and MB_SUCCESS.

Referenced by load_file().

◆ read_sides()

ErrorCode ReadRTT::read_sides ( const char *  filename,
std::vector< side > &  side_data 
)
private

Reads the full set of side data from the file

Parameters
filename,thefile to read all the side data from
sidedata, a vector containing all the read side data
Returns
moab::ErrorCode

Definition at line 379 of file ReadRTT.cpp.

380 {
381  std::string line; // the current line being read
382  std::ifstream input_file( filename ); // filestream for rttfile
383  // file ok?
384  if( !input_file.good() )
385  {
386  std::cout << "Problems reading file = " << filename << std::endl;
387  return MB_FAILURE;
388  }
389  // if it works
390  if( input_file.is_open() )
391  {
392  while( std::getline( input_file, line ) )
393  {
394  if( line.compare( " 2 FACES\0" ) == 0 )
395  {
396  // read lines until find end nodes
397  while( std::getline( input_file, line ) )
398  {
399  if( line.compare( "end_side_flags\0" ) == 0 ) break;
400  side data = ReadRTT::get_side_data( line );
401  side_data.push_back( data );
402  }
403  }
404  }
405  input_file.close();
406  }
407  if( side_data.size() == 0 ) return MB_FAILURE;
408  return MB_SUCCESS;
409 }

References get_side_data(), input_file, and MB_SUCCESS.

Referenced by load_file().

◆ read_tag_values()

ErrorCode ReadRTT::read_tag_values ( const char *  file_name,
const char *  tag_name,
const FileOptions opts,
std::vector< int > &  tag_values_out,
const SubsetList subset_list = 0 
)
virtual

Read tag values from a file.

Read the list if all integer tag values from the file for a tag that is a single integer value per entity.

Parameters
file_nameThe file to read.
tag_nameThe tag for which to read values
tag_values_outOutput: The list of tag values.
subset_listAn array of tag name and value sets specifying the subset of the file to read. If multiple tags are specified, the sets that match all tags (intersection) should be read.
subset_list_lengthThe length of the 'subset_list' array.

Implements moab::ReaderIface.

Definition at line 99 of file ReadRTT.cpp.

104 {
105  return MB_NOT_IMPLEMENTED;
106 }

References MB_NOT_IMPLEMENTED.

◆ read_tets()

ErrorCode ReadRTT::read_tets ( const char *  filename,
std::vector< tet > &  tet_data 
)
private

Reads the full set of tet data from the file

Parameters
filename,thefile to read all the side data from
tetdata, a vector containing all the read tet data
Returns
moab::ErrorCode

Definition at line 521 of file ReadRTT.cpp.

522 {
523  std::string line; // the current line being read
524  std::ifstream input_file( filename ); // filestream for rttfile
525  // file ok?
526  if( !input_file.good() )
527  {
528  std::cout << "Problems reading file = " << filename << std::endl;
529  return MB_FAILURE;
530  }
531  // if it works
532  if( input_file.is_open() )
533  {
534  while( std::getline( input_file, line ) )
535  {
536  if( line.compare( "cells\0" ) == 0 )
537  {
538  // read lines until find end nodes
539  while( std::getline( input_file, line ) )
540  {
541  if( line.compare( "end_cells\0" ) == 0 ) break;
542  tet data = ReadRTT::get_tet_data( line );
543  tet_data.push_back( data );
544  }
545  }
546  }
547  input_file.close();
548  }
549  if( tet_data.size() == 0 ) return MB_FAILURE;
550  return MB_SUCCESS;
551 }

References get_tet_data(), input_file, and MB_SUCCESS.

Referenced by load_file().

◆ set_surface_senses()

void ReadRTT::set_surface_senses ( int  num_ents[4],
std::vector< EntityHandle entity_map[4],
std::vector< side side_data,
std::vector< cell cell_data 
)
private

Sets the appropriate surface senses for each surface in the problem. By looping through all the surfaces, we determine from the side_data vector, the volume id's that are shared, then using 1 to mean +ve sense and -1 to mean -ve sense wrt the volume.

Parameters
num_ents[4],arraycontaining the number of surfaces, cells, groups etc
entity_map[4],vectorof maps containing data by dimension
side_data,vectorof all the side data in the problem
cell_data,vectorof the cell data in the problem

Definition at line 864 of file ReadRTT.cpp.

868 {
869 
870  ErrorCode rval; // return value
871  // loop over the number of surfaces
872  for( int i = 0; i < num_ents[2]; i++ )
873  {
874  EntityHandle surf_handle = entity_map[2][i];
875  // there are 2 volumes that share this face
876  for( unsigned int shared = 0; shared <= 1; shared++ )
877  {
878  std::string parent_name = side_data[i].names[shared];
879  unsigned pos = parent_name.find( "@" );
880  parent_name = parent_name.substr( 0, pos );
881  // loop over tets looking for matching name
882  for( int j = 0; j < num_ents[3]; j++ )
883  {
884  // if match found
885  if( cell_data[j].name.compare( parent_name ) == 0 )
886  {
887  EntityHandle cell_handle = entity_map[3][j];
888  // in rtt mesh +represents the inside and -represents outside
889  // in moab reverse is outside and forward is inside
890  if( side_data[i].senses[shared] == 1 )
891  rval = myGeomTool->set_sense( surf_handle, cell_handle, SENSE_FORWARD );
892  else if( side_data[i].senses[shared] == -1 )
893  rval = myGeomTool->set_sense( surf_handle, cell_handle, SENSE_REVERSE );
894  else
895  rval = myGeomTool->set_sense( surf_handle, 0, SENSE_REVERSE );
896 
897  if( rval != MB_SUCCESS )
898  {
899  std::cerr << "Failed to set sense appropriately" << std::endl;
900  }
901  }
902  }
903  }
904  }
905  return;
906 }

References ErrorCode, MB_SUCCESS, myGeomTool, SENSE_REVERSE, and moab::GeomTopoTool::set_sense().

Referenced by generate_topology().

◆ setup_group_data()

ErrorCode ReadRTT::setup_group_data ( std::vector< EntityHandle entity_map[4])
private

creates the group data requried for dagmc, reflecting planes, material assignments etc

Parameters
entity_map,vectorof vector of entitiy handles for each dimension
Returns
moab::ErrorCode

Definition at line 911 of file ReadRTT.cpp.

912 {
913  ErrorCode rval; // error codes
914  EntityHandle handle;
915  handle = create_group( "graveyard_comp", 1 );
916 
917  // add any volume to group graveyard, it is ignored by dag
918  EntityHandle vol_handle = entity_map[3][0];
919  rval = MBI->add_entities( handle, &vol_handle, 1 );
920  return rval;
921 }

References moab::Interface::add_entities(), create_group(), ErrorCode, and MBI.

Referenced by generate_topology().

◆ split_name()

ReadRTT::boundary ReadRTT::split_name ( std::string  atilla_cellname)
private

Splits an Attila cellname and populates a boundary structure

Parameters
attila_cellname,stringcontaining the boundary information
Returns
a boundary object

Definition at line 766 of file ReadRTT.cpp.

767 {
768  boundary new_boundary;
769  // default initialisation
770  new_boundary.sense = 0;
771  new_boundary.name = "\0";
772  // +ve sense
773  if( atilla_cellname.find( "+" ) != std::string::npos )
774  {
775  new_boundary.sense = 1;
776  // look for the @# we do not want it
777  std::size_t found = atilla_cellname.find( "@" );
778  if( found != std::string::npos )
779  new_boundary.name = atilla_cellname.substr( 3, found );
780  else
781  new_boundary.name = atilla_cellname.substr( 3, atilla_cellname.length() );
782  }
783  else if( atilla_cellname.find( "-" ) != std::string::npos )
784  {
785  // negative sense
786  new_boundary.sense = -1;
787  new_boundary.name = atilla_cellname.substr( 3, atilla_cellname.length() );
788  }
789  return new_boundary;
790 }

References moab::ReadRTT::boundary::name, and moab::ReadRTT::boundary::sense.

Referenced by get_side_data().

◆ split_string()

std::vector< std::string > ReadRTT::split_string ( std::string  string_to_split,
char  split_char 
)
private

Splits a string into a vector of substrings delimited by split_char

Parameters
string_to_split,thestring that needs splitting into chunks
split_char,thecharacter to split the string with
Returns
a vector of strings that are delimited by split_char

Definition at line 795 of file ReadRTT.cpp.

796 {
797  std::istringstream ss( string_to_split );
798  std::vector< std::string > tokens;
799  while( !ss.eof() )
800  {
801  std::string x; // here's a nice, empty string
802  std::getline( ss, x, split_char ); // try to read the next field into it
803  tokens.push_back( x );
804  }
805 
806  // remove empty tokens
807  std::vector< std::string >::iterator it;
808  for( it = tokens.begin(); it != tokens.end(); )
809  {
810  std::string string = *it;
811  if( string.compare( "\0" ) == 0 )
812  it = tokens.erase( it );
813  else
814  ++it;
815  }
816  return tokens;
817 }

Referenced by get_cell_data(), get_facet_data(), get_header_data(), get_node_data(), get_side_data(), and get_tet_data().

Member Data Documentation

◆ category_tag

Tag moab::ReadRTT::category_tag
private

Definition at line 448 of file ReadRTT.hpp.

Referenced by create_group(), generate_topology(), and ReadRTT().

◆ faceting_tol_tag

Tag moab::ReadRTT::faceting_tol_tag
private

Definition at line 448 of file ReadRTT.hpp.

Referenced by ReadRTT().

◆ geom_tag

Tag moab::ReadRTT::geom_tag
private

Definition at line 448 of file ReadRTT.hpp.

Referenced by generate_topology(), and ReadRTT().

◆ header_data

headerData moab::ReadRTT::header_data
private

Definition at line 440 of file ReadRTT.hpp.

Referenced by get_facet_data(), get_header_data(), and get_tet_data().

◆ id_tag

Tag moab::ReadRTT::id_tag
private

Definition at line 448 of file ReadRTT.hpp.

Referenced by create_group(), generate_topology(), and ReadRTT().

◆ MBI

Interface* moab::ReadRTT::MBI
private

◆ myGeomTool

GeomTopoTool* moab::ReadRTT::myGeomTool
private

Definition at line 446 of file ReadRTT.hpp.

Referenced by ReadRTT(), set_surface_senses(), and ~ReadRTT().

◆ name_tag

Tag moab::ReadRTT::name_tag
private

Definition at line 448 of file ReadRTT.hpp.

Referenced by create_group(), and ReadRTT().

◆ readMeshIface

ReadUtilIface* moab::ReadRTT::readMeshIface
private

Definition at line 442 of file ReadRTT.hpp.

Referenced by ReadRTT(), and ~ReadRTT().


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