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

#include <ReadSms.hpp>

+ Inheritance diagram for moab::ReadSms:
+ Collaboration diagram for moab::ReadSms:

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...
 
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...
 
 ReadSms (Interface *impl=NULL)
 Constructor. More...
 
virtual ~ReadSms ()
 Destructor. More...
 
- Public Member Functions inherited from moab::ReaderIface
virtual ~ReaderIface ()
 

Static Public Member Functions

static ReaderIfacefactory (Interface *)
 factory method More...
 

Private Member Functions

ErrorCode add_entities (EntityHandle start, EntityHandle count, const Tag *file_id_tag)
 
ErrorCode load_file_impl (FILE *file, const Tag *file_id_tag)
 
ErrorCode get_set (std::vector< EntityHandle > *sets, int set_type, int set_id, Tag set_tag, EntityHandle &this_set, const Tag *file_id_tag)
 
ErrorCode read_parallel_info (FILE *file_ptr)
 

Private Attributes

ReadUtilIfacereadMeshIface
 
InterfacemdbImpl
 interface instance More...
 
Tag globalId
 
Tag paramCoords
 
Tag geomDimension
 
int setId
 

Detailed Description

Definition at line 15 of file ReadSms.hpp.

Constructor & Destructor Documentation

◆ ReadSms()

ReadSms::ReadSms ( Interface impl = NULL)

Constructor.

Definition at line 56 of file ReadSms.cpp.

56  : mdbImpl( impl ), globalId( 0 ), paramCoords( 0 ), geomDimension( 0 ), setId( 0 )
57 {
59 }

References mdbImpl, moab::Interface::query_interface(), and readMeshIface.

Referenced by factory().

◆ ~ReadSms()

ReadSms::~ReadSms ( )
virtual

Destructor.

Definition at line 61 of file ReadSms.cpp.

62 {
63  if( readMeshIface )
64  {
66  readMeshIface = 0;
67  }
68 }

References mdbImpl, readMeshIface, and moab::Interface::release_interface().

Member Function Documentation

◆ add_entities()

ErrorCode ReadSms::add_entities ( EntityHandle  start,
EntityHandle  count,
const Tag file_id_tag 
)
private

Definition at line 483 of file ReadSms.cpp.

484 {
485  if( !count || !file_id_tag ) return MB_FAILURE;
486 
487  Range range;
488  range.insert( start, start + count - 1 );
489  return readMeshIface->assign_ids( *file_id_tag, range, 1 );
490 }

References moab::ReadUtilIface::assign_ids(), moab::Range::insert(), and readMeshIface.

Referenced by load_file_impl().

◆ factory()

ReaderIface * ReadSms::factory ( Interface iface)
static

factory method

Definition at line 51 of file ReadSms.cpp.

52 {
53  return new ReadSms( iface );
54 }

References iface, and ReadSms().

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

◆ get_set()

ErrorCode ReadSms::get_set ( std::vector< EntityHandle > *  sets,
int  set_type,
int  set_id,
Tag  set_tag,
EntityHandle this_set,
const Tag file_id_tag 
)
private

Definition at line 401 of file ReadSms.cpp.

407 {
408  ErrorCode result = MB_SUCCESS;
409 
410  if( set_dim < 0 || set_dim > 3 ) return MB_FILE_WRITE_ERROR;
411 
412  if( (int)sets[set_dim].size() <= set_id || !sets[set_dim][set_id] )
413  {
414  if( (int)sets[set_dim].size() <= set_id ) sets[set_dim].resize( set_id + 1, 0 );
415 
416  if( !sets[set_dim][set_id] )
417  {
418  result = mdbImpl->create_meshset( MESHSET_SET, sets[set_dim][set_id] );
419  if( MB_SUCCESS != result ) return result;
420  result = mdbImpl->tag_set_data( globalId, &sets[set_dim][set_id], 1, &set_id );
421  if( MB_SUCCESS != result ) return result;
422  result = mdbImpl->tag_set_data( dim_tag, &sets[set_dim][set_id], 1, &set_dim );
423  if( MB_SUCCESS != result ) return result;
424 
425  if( file_id_tag )
426  {
427  result = mdbImpl->tag_set_data( *file_id_tag, &sets[set_dim][set_id], 1, &setId );
428  ++setId;
429  }
430  }
431  }
432 
433  this_set = sets[set_dim][set_id];
434 
435  return result;
436 }

References moab::Interface::create_meshset(), ErrorCode, globalId, MB_FILE_WRITE_ERROR, MB_SUCCESS, mdbImpl, MESHSET_SET, setId, size, and moab::Interface::tag_set_data().

Referenced by load_file_impl().

◆ load_file()

ErrorCode ReadSms::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 79 of file ReadSms.cpp.

84 {
85  if( subset_list )
86  {
87  MB_SET_ERR( MB_UNSUPPORTED_OPERATION, "Reading subset of files not supported for Sms" );
88  }
89 
90  setId = 1;
91 
92  // Open file
93  FILE* file_ptr = fopen( filename, "r" );
94  if( !file_ptr )
95  {
96  MB_SET_ERR( MB_FILE_DOES_NOT_EXIST, filename << ": " << strerror( errno ) );
97  }
98 
99  const ErrorCode result = load_file_impl( file_ptr, file_id_tag );
100  fclose( file_ptr );
101 
102  return result;
103 }

References ErrorCode, load_file_impl(), MB_FILE_DOES_NOT_EXIST, MB_SET_ERR, MB_UNSUPPORTED_OPERATION, and setId.

◆ load_file_impl()

ErrorCode ReadSms::load_file_impl ( FILE *  file,
const Tag file_id_tag 
)
private

Definition at line 105 of file ReadSms.cpp.

106 {
107  bool warned = false;
108  double dum_params[] = { 0.0, 0.0, 0.0 };
109 
111 
112  ErrorCode result =
114  CHECK( "Failed to create param coords tag." );
115 
116  int negone = -1;
118  MB_TAG_SPARSE | MB_TAG_CREAT, &negone );
119  CHECK( "Failed to create geom dim tag." );
120 
121  int n;
122  char line[256], all_line[1024];
123  int file_type;
124 
125  if( fgets( all_line, sizeof( all_line ), file_ptr ) == NULL )
126  {
127  return MB_FAILURE;
128  }
129  if( sscanf( all_line, "%s %d", line, &file_type ) != 2 )
130  {
131  return MB_FAILURE;
132  }
133 
134  if( 3 == file_type )
135  {
136  result = read_parallel_info( file_ptr );
137  CHECK( "Failed to read parallel info." );
138  }
139 
140  int nregions, nfaces, nedges, nvertices, npoints;
141  n = fscanf( file_ptr, "%d %d %d %d %d", &nregions, &nfaces, &nedges, &nvertices, &npoints );
142  CHECKN( 5 );
143  if( nregions < 0 || nfaces < 0 || nedges < 0 || nvertices < 0 || npoints < 0 ) return MB_FILE_WRITE_ERROR;
144 
145  // Create the vertices
146  std::vector< double* > coord_arrays;
147  EntityHandle vstart = 0;
148  result = readMeshIface->get_node_coords( 3, nvertices, MB_START_ID, vstart, coord_arrays );
149  CHECK( "Failed to get node arrays." );
150 
151  if( file_id_tag )
152  {
153  result = add_entities( vstart, nvertices, file_id_tag );MB_CHK_ERR( result );
154  }
155 
156  EntityHandle this_gent, new_handle;
157  std::vector< EntityHandle > gentities[4];
158  int gent_id, dum_int;
159  int gent_type, num_connections;
160 
161  for( int i = 0; i < nvertices; i++ )
162  {
163  n = fscanf( file_ptr, "%d", &gent_id );
164  CHECKN( 1 );
165  if( !gent_id ) continue;
166 
167  n = fscanf( file_ptr, "%d %d %lf %lf %lf", &gent_type, &num_connections, coord_arrays[0] + i,
168  coord_arrays[1] + i, coord_arrays[2] + i );
169  CHECKN( 5 );
170 
171  result = get_set( gentities, gent_type, gent_id, geomDimension, this_gent, file_id_tag );MB_CHK_ERR( result );
172 
173  new_handle = vstart + i;
174  result = mdbImpl->add_entities( this_gent, &new_handle, 1 );
175  CHECK( "Adding vertex to geom set failed." );
176 
177  switch( gent_type )
178  {
179  case 1:
180  n = fscanf( file_ptr, "%le", dum_params );
181  CHECKN( 1 );
182  result = mdbImpl->tag_set_data( paramCoords, &new_handle, 1, dum_params );
183  CHECK( "Failed to set param coords tag for vertex." );
184  break;
185  case 2:
186  n = fscanf( file_ptr, "%le %le %d", dum_params, dum_params + 1, &dum_int );
187  CHECKN( 3 );
188  dum_params[2] = dum_int;
189  result = mdbImpl->tag_set_data( paramCoords, &new_handle, 1, dum_params );
190  CHECK( "Failed to set param coords tag for vertex." );
191  break;
192  default:
193  break;
194  }
195  } // End of reading vertices
196 
197  // *******************************
198  // Read Edges
199  // *******************************
200 
201  int vert1, vert2, num_pts;
202  std::vector< EntityHandle > everts( 2 );
203  EntityHandle estart, *connect;
204  result = readMeshIface->get_element_connect( nedges, 2, MBEDGE, 1, estart, connect );
205  CHECK( "Failed to create array of edges." );
206 
207  if( file_id_tag )
208  {
209  result = add_entities( estart, nedges, file_id_tag );
210  if( MB_SUCCESS != result ) return result;
211  }
212 
213  for( int i = 0; i < nedges; i++ )
214  {
215  n = fscanf( file_ptr, "%d", &gent_id );
216  CHECKN( 1 );
217  if( !gent_id ) continue;
218 
219  n = fscanf( file_ptr, "%d %d %d %d %d", &gent_type, &vert1, &vert2, &num_connections, &num_pts );
220  CHECKN( 5 );
221  if( vert1 < 1 || vert1 > nvertices ) return MB_FILE_WRITE_ERROR;
222  if( vert2 < 1 || vert2 > nvertices ) return MB_FILE_WRITE_ERROR;
223 
224  connect[0] = vstart + vert1 - 1;
225  connect[1] = vstart + vert2 - 1;
226  if( num_pts > 1 && !warned )
227  {
228  std::cout << "Warning: num_points > 1 not supported; choosing last one." << std::endl;
229  warned = true;
230  }
231 
232  result = get_set( gentities, gent_type, gent_id, geomDimension, this_gent, file_id_tag );
233  CHECK( "Problem getting geom set for edge." );
234 
235  new_handle = estart + i;
236  result = mdbImpl->add_entities( this_gent, &new_handle, 1 );
237  CHECK( "Failed to add edge to geom set." );
238 
239  connect += 2;
240 
241  for( int j = 0; j < num_pts; j++ )
242  {
243  switch( gent_type )
244  {
245  case 1:
246  n = fscanf( file_ptr, "%le", dum_params );
247  CHECKN( 1 );
248  result = mdbImpl->tag_set_data( paramCoords, &new_handle, 1, dum_params );
249  CHECK( "Failed to set param coords tag for edge." );
250  break;
251  case 2:
252  n = fscanf( file_ptr, "%le %le %d", dum_params, dum_params + 1, &dum_int );
253  CHECKN( 3 );
254  dum_params[2] = dum_int;
255  result = mdbImpl->tag_set_data( paramCoords, &new_handle, 1, dum_params );
256  CHECK( "Failed to set param coords tag for edge." );
257  break;
258  default:
259  break;
260  }
261  }
262  } // End of reading edges
263 
264  // *******************************
265  // Read Faces
266  // *******************************
267  std::vector< EntityHandle > bound_ents, bound_verts, new_faces;
268  int bound_id;
269  Range shverts;
270  new_faces.resize( nfaces );
271  int num_bounding;
272 
273  for( int i = 0; i < nfaces; i++ )
274  {
275  n = fscanf( file_ptr, "%d", &gent_id );
276  CHECKN( 1 );
277  if( !gent_id ) continue;
278 
279  n = fscanf( file_ptr, "%d %d", &gent_type, &num_bounding );
280  CHECKN( 2 );
281 
282  result = get_set( gentities, gent_type, gent_id, geomDimension, this_gent, file_id_tag );
283  CHECK( "Problem getting geom set for face." );
284 
285  bound_ents.resize( num_bounding + 1 );
286  bound_verts.resize( num_bounding );
287  for( int j = 0; j < num_bounding; j++ )
288  {
289  n = fscanf( file_ptr, "%d ", &bound_id );
290  CHECKN( 1 );
291  if( 0 > bound_id ) bound_id = abs( bound_id );
292  assert( 0 < bound_id && bound_id <= nedges );
293  if( bound_id < 1 || bound_id > nedges ) return MB_FILE_WRITE_ERROR;
294  bound_ents[j] = estart + abs( bound_id ) - 1;
295  }
296 
297  // Convert edge-based model to vertex-based one
298  for( int j = 0; j < num_bounding; j++ )
299  {
300  if( j == num_bounding - 1 ) bound_ents[j + 1] = bound_ents[0];
301  result = mdbImpl->get_adjacencies( &bound_ents[j], 2, 0, false, shverts );
302  CHECK( "Failed to get vertices bounding edge." );
303  assert( shverts.size() == 1 );
304  bound_verts[j] = *shverts.begin();
305  shverts.clear();
306  }
307 
308  result = mdbImpl->create_element( (EntityType)( MBTRI + num_bounding - 3 ), &bound_verts[0], bound_verts.size(),
309  new_faces[i] );
310  CHECK( "Failed to create edge." );
311 
312  result = mdbImpl->add_entities( this_gent, &new_faces[i], 1 );
313  CHECK( "Failed to add edge to geom set." );
314 
315  int num_read = fscanf( file_ptr, "%d", &num_pts );
316  if( !num_pts || !num_read ) continue;
317 
318  for( int j = 0; j < num_pts; j++ )
319  {
320  switch( gent_type )
321  {
322  case 1:
323  n = fscanf( file_ptr, "%le", dum_params );
324  CHECKN( 1 );
325  result = mdbImpl->tag_set_data( paramCoords, &new_faces[i], 1, dum_params );
326  CHECK( "Failed to set param coords tag for face." );
327  break;
328  case 2:
329  n = fscanf( file_ptr, "%le %le %d", dum_params, dum_params + 1, &dum_int );
330  CHECKN( 3 );
331  dum_params[2] = dum_int;
332  result = mdbImpl->tag_set_data( paramCoords, &new_faces[i], 1, dum_params );
333  CHECK( "Failed to set param coords tag for face." );
334  break;
335  default:
336  break;
337  }
338  }
339  } // End of reading faces
340 
341  if( file_id_tag )
342  {
343  result = readMeshIface->assign_ids( *file_id_tag, &new_faces[0], new_faces.size(), 1 );
344  if( MB_SUCCESS != result ) return result;
345  }
346 
347  // *******************************
348  // Read Regions
349  // *******************************
350  int sense[MAX_SUB_ENTITIES];
351  bound_verts.resize( MAX_SUB_ENTITIES );
352 
353  std::vector< EntityHandle > regions;
354  if( file_id_tag ) regions.resize( nregions );
355  for( int i = 0; i < nregions; i++ )
356  {
357  n = fscanf( file_ptr, "%d", &gent_id );
358  CHECKN( 1 );
359  if( !gent_id ) continue;
360  result = get_set( gentities, 3, gent_id, geomDimension, this_gent, file_id_tag );
361  CHECK( "Couldn't get geom set for region." );
362  n = fscanf( file_ptr, "%d", &num_bounding );
363  CHECKN( 1 );
364  bound_ents.resize( num_bounding );
365  for( int j = 0; j < num_bounding; j++ )
366  {
367  n = fscanf( file_ptr, "%d ", &bound_id );
368  CHECKN( 1 );
369  assert( abs( bound_id ) < (int)new_faces.size() + 1 && bound_id );
370  if( !bound_id || abs( bound_id ) > nfaces ) return MB_FILE_WRITE_ERROR;
371  sense[j] = ( bound_id < 0 ) ? -1 : 1;
372  bound_ents[j] = new_faces[abs( bound_id ) - 1];
373  }
374 
375  EntityType etype;
376  result = readMeshIface->get_ordered_vertices( &bound_ents[0], sense, num_bounding, 3, &bound_verts[0], etype );
377  CHECK( "Failed in get_ordered_vertices." );
378 
379  // Make the element
380  result = mdbImpl->create_element( etype, &bound_verts[0], CN::VerticesPerEntity( etype ), new_handle );
381  CHECK( "Failed to create region." );
382 
383  result = mdbImpl->add_entities( this_gent, &new_handle, 1 );
384  CHECK( "Failed to add region to geom set." );
385 
386  if( file_id_tag ) regions[i] = new_handle;
387 
388  n = fscanf( file_ptr, "%d ", &dum_int );
389  CHECKN( 1 );
390  } // End of reading regions
391 
392  if( file_id_tag )
393  {
394  result = readMeshIface->assign_ids( *file_id_tag, &regions[0], regions.size(), 1 );
395  if( MB_SUCCESS != result ) return result;
396  }
397 
398  return MB_SUCCESS;
399 }

References moab::Interface::add_entities(), add_entities(), moab::ReadUtilIface::assign_ids(), moab::Range::begin(), CHECK, CHECKN, moab::Range::clear(), moab::Interface::create_element(), ErrorCode, GEOM_DIMENSION_TAG_NAME, geomDimension, moab::Interface::get_adjacencies(), moab::ReadUtilIface::get_element_connect(), moab::ReadUtilIface::get_node_coords(), moab::ReadUtilIface::get_ordered_vertices(), get_set(), globalId, moab::Interface::globalId_tag(), moab::MAX_SUB_ENTITIES, MB_CHK_ERR, MB_FILE_WRITE_ERROR, MB_START_ID, MB_SUCCESS, MB_TAG_CREAT, MB_TAG_DENSE, MB_TAG_SPARSE, MB_TYPE_DOUBLE, MB_TYPE_INTEGER, MBEDGE, MBTRI, mdbImpl, paramCoords, read_parallel_info(), readMeshIface, moab::Range::size(), moab::Interface::tag_get_handle(), moab::Interface::tag_set_data(), and moab::CN::VerticesPerEntity().

Referenced by load_file().

◆ read_parallel_info()

ErrorCode ReadSms::read_parallel_info ( FILE *  file_ptr)
private

Definition at line 438 of file ReadSms.cpp.

439 {
440  // ErrorCode result;
441 
442  // Read partition info
443  int nparts, part_id, num_ifaces, num_corner_ents;
444  int num_read = fscanf( file_ptr, "%d %d %d %d", &nparts, &part_id, &num_ifaces, &num_corner_ents );
445  if( !num_read ) return MB_FAILURE;
446 
447  // Read interfaces
448  int iface_id, iface_dim, iface_own, num_iface_corners;
449  // EntityHandle this_iface;
450  std::vector< int >* iface_corners = NULL;
451  for( int i = 0; i < num_ifaces; i++ )
452  {
453  num_read = fscanf( file_ptr, "%d %d %d %d", &iface_id, &iface_dim, &iface_own, &num_iface_corners );
454  if( !num_read ) return MB_FAILURE;
455 
456  // result = get_set(sets, iface_dim, iface_id, dim_tag, iface_own, this_iface);
457  // CHECK("Failed to make iface set.");
458 
459  // Read the corner ids and store them on the set for now
460  iface_corners = new std::vector< int >( num_iface_corners );
461  for( int j = 0; j < num_iface_corners; j++ )
462  {
463  num_read = fscanf( file_ptr, "%d", &( *iface_corners )[j] );
464  if( !num_read )
465  {
466  delete iface_corners;
467  return MB_FAILURE;
468  }
469  }
470 
471  // result = tag_set_data(ifaceCornerTag, &this_iface, 1,
472  //&iface_corners);
473  // CHECK("Failed to set iface corner tag.");
474 
475  delete iface_corners;
476  iface_corners = NULL;
477  }
478 
479  // Interface data has been read
480  return MB_SUCCESS;
481 }

References MB_SUCCESS, and nparts.

Referenced by load_file_impl().

◆ read_tag_values()

ErrorCode ReadSms::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 70 of file ReadSms.cpp.

75 {
76  return MB_NOT_IMPLEMENTED;
77 }

References MB_NOT_IMPLEMENTED.

Member Data Documentation

◆ geomDimension

Tag moab::ReadSms::geomDimension
private

Definition at line 59 of file ReadSms.hpp.

Referenced by load_file_impl().

◆ globalId

Tag moab::ReadSms::globalId
private

Definition at line 59 of file ReadSms.hpp.

Referenced by get_set(), and load_file_impl().

◆ mdbImpl

Interface* moab::ReadSms::mdbImpl
private

interface instance

Definition at line 57 of file ReadSms.hpp.

Referenced by get_set(), load_file_impl(), ReadSms(), and ~ReadSms().

◆ paramCoords

Tag moab::ReadSms::paramCoords
private

Definition at line 59 of file ReadSms.hpp.

Referenced by load_file_impl().

◆ readMeshIface

ReadUtilIface* moab::ReadSms::readMeshIface
private

Definition at line 54 of file ReadSms.hpp.

Referenced by add_entities(), load_file_impl(), ReadSms(), and ~ReadSms().

◆ setId

int moab::ReadSms::setId
private

Definition at line 61 of file ReadSms.hpp.

Referenced by get_set(), and load_file().


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