Loading [MathJax]/extensions/tex2jax.js
Mesh Oriented datABase  (version 5.5.1)
An array-based unstructured mesh library
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
moab::ReadVtk Class Reference

#include <ReadVtk.hpp>

+ Inheritance diagram for moab::ReadVtk:
+ Collaboration diagram for moab::ReadVtk:

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

Static Public Member Functions

static ReaderIfacefactory (Interface *)
 

Protected Member Functions

ErrorCode allocate_vertices (long num_vtx, EntityHandle &start_handle_out, double *&x_coord_array_out, double *&y_coord_array_out, double *&z_coord_array_out)
 
ErrorCode read_vertices (FileTokenizer &tokens, long num_verts, EntityHandle &start_handle_out)
 
ErrorCode allocate_elements (long num_elements, int vert_per_element, EntityType type, EntityHandle &start_handle_out, EntityHandle *&conn_array_out, std::vector< Range > &append_to_this)
 
ErrorCode vtk_read_dataset (FileTokenizer &tokens, Range &vertex_list, std::vector< Range > &element_list)
 
ErrorCode vtk_read_structured_points (FileTokenizer &tokens, Range &vertex_list, std::vector< Range > &elem_list)
 
ErrorCode vtk_read_structured_grid (FileTokenizer &tokens, Range &vertex_list, std::vector< Range > &elem_list)
 
ErrorCode vtk_read_rectilinear_grid (FileTokenizer &tokens, Range &vertex_list, std::vector< Range > &elem_list)
 
ErrorCode vtk_read_polydata (FileTokenizer &tokens, Range &vertex_list, std::vector< Range > &elem_list)
 
ErrorCode vtk_read_polygons (FileTokenizer &tokens, EntityHandle first_vtx, std::vector< Range > &elem_list)
 
ErrorCode vtk_read_unstructured_grid (FileTokenizer &tokens, Range &vertex_list, std::vector< Range > &elem_list)
 
ErrorCode vtk_create_structured_elems (const long *dims, EntityHandle first_vtx, std::vector< Range > &elem_list)
 
ErrorCode vtk_read_field (FileTokenizer &tokens)
 
ErrorCode vtk_read_attrib_data (FileTokenizer &tokens, std::vector< Range > &entities)
 
ErrorCode vtk_read_tag_data (FileTokenizer &tokens, int type, size_t per_elem, std::vector< Range > &entities, const char *name)
 
ErrorCode vtk_read_scalar_attrib (FileTokenizer &tokens, std::vector< Range > &entities, const char *name)
 
ErrorCode vtk_read_color_attrib (FileTokenizer &tokens, std::vector< Range > &entities, const char *name)
 
ErrorCode vtk_read_vector_attrib (FileTokenizer &tokens, std::vector< Range > &entities, const char *name)
 
ErrorCode vtk_read_texture_attrib (FileTokenizer &tokens, std::vector< Range > &entities, const char *name)
 
ErrorCode vtk_read_tensor_attrib (FileTokenizer &tokens, std::vector< Range > &entities, const char *name)
 
ErrorCode vtk_read_field_attrib (FileTokenizer &tokens, std::vector< Range > &entities, const char *name)
 
ErrorCode store_file_ids (Tag tag, const Range &vertices, const std::vector< Range > &elements)
 

Private Attributes

ReadUtilIfacereadMeshIface
 
InterfacemdbImpl
 interface instance More...
 
std::string mPartitionTagName
 A field which, if present and having a single integer for storage, should be used to partition the mesh by range. Defaults to MATERIAL_SET_TAG_NAME. More...
 

Detailed Description

Definition at line 30 of file ReadVtk.hpp.

Constructor & Destructor Documentation

◆ ReadVtk()

ReadVtk::ReadVtk ( Interface impl = NULL)

Constructor.

Definition at line 161 of file ReadVtk.cpp.

161  : mdbImpl( impl ), mPartitionTagName( MATERIAL_SET_TAG_NAME ) 162 { 163  mdbImpl->query_interface( readMeshIface ); 164 }

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

Referenced by factory().

◆ ~ReadVtk()

ReadVtk::~ReadVtk ( )
virtual

Destructor.

Definition at line 166 of file ReadVtk.cpp.

167 { 168  if( readMeshIface ) 169  { 170  mdbImpl->release_interface( readMeshIface ); 171  readMeshIface = 0; 172  } 173 }

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

Member Function Documentation

◆ allocate_elements()

ErrorCode ReadVtk::allocate_elements ( long  num_elements,
int  vert_per_element,
EntityType  type,
EntityHandle start_handle_out,
EntityHandle *&  conn_array_out,
std::vector< Range > &  append_to_this 
)
protected

Definition at line 359 of file ReadVtk.cpp.

365 { 366  ErrorCode result; 367  368  start_handle_out = 0; 369  result = readMeshIface->get_element_connect( num_elements, vert_per_element, type, MB_START_ID, start_handle_out, 370  conn_array_out ); 371  if( MB_SUCCESS != result ) return result; 372  373  Range range( start_handle_out, start_handle_out + num_elements - 1 ); 374  append_to_this.push_back( range ); 375  return MB_SUCCESS; 376 }

References ErrorCode, moab::ReadUtilIface::get_element_connect(), MB_START_ID, MB_SUCCESS, and readMeshIface.

Referenced by vtk_create_structured_elems(), and vtk_read_unstructured_grid().

◆ allocate_vertices()

ErrorCode ReadVtk::allocate_vertices ( long  num_vtx,
EntityHandle start_handle_out,
double *&  x_coord_array_out,
double *&  y_coord_array_out,
double *&  z_coord_array_out 
)
protected

Definition at line 320 of file ReadVtk.cpp.

325 { 326  ErrorCode result; 327  328  // Create vertices 329  std::vector< double* > arrays; 330  start_handle_out = 0; 331  result = readMeshIface->get_node_coords( 3, num_verts, MB_START_ID, start_handle_out, arrays ); 332  if( MB_SUCCESS != result ) return result; 333  334  x_coord_array_out = arrays[0]; 335  y_coord_array_out = arrays[1]; 336  z_coord_array_out = arrays[2]; 337  338  return MB_SUCCESS; 339 }

References ErrorCode, moab::ReadUtilIface::get_node_coords(), MB_START_ID, MB_SUCCESS, and readMeshIface.

Referenced by read_vertices(), vtk_read_rectilinear_grid(), and vtk_read_structured_points().

◆ factory()

ReaderIface * ReadVtk::factory ( Interface iface)
static

Definition at line 156 of file ReadVtk.cpp.

157 { 158  return new ReadVtk( iface ); 159 }

References iface, and ReadVtk().

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

◆ load_file()

ErrorCode ReadVtk::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 a file

Implements moab::ReaderIface.

Definition at line 188 of file ReadVtk.cpp.

193 { 194  ErrorCode result; 195  196  int major, minor; 197  char vendor_string[257]; 198  std::vector< Range > element_list; 199  Range vertices; 200  201  if( subset_list ) 202  { 203  MB_SET_ERR( MB_UNSUPPORTED_OPERATION, "Reading subset of files not supported for VTK" ); 204  } 205  206  // Does the caller want a field to be used for partitioning the entities? 207  // If not, we'll assume any scalar integer field named MATERIAL_SET specifies partitions. 208  std::string partition_tag_name; 209  result = opts.get_option( "PARTITION", partition_tag_name ); 210  if( result == MB_SUCCESS ) mPartitionTagName = partition_tag_name; 211  212  FILE* file = fopen( filename, "r" ); 213  if( !file ) return MB_FILE_DOES_NOT_EXIST; 214  215  // Read file header 216  217  if( !fgets( vendor_string, sizeof( vendor_string ), file ) ) 218  { 219  fclose( file ); 220  return MB_FAILURE; 221  } 222  223  if( !strchr( vendor_string, '\n' ) || 2 != sscanf( vendor_string, "# vtk DataFile Version %d.%d", &major, &minor ) ) 224  { 225  fclose( file ); 226  return MB_FAILURE; 227  } 228  229  if( !fgets( vendor_string, sizeof( vendor_string ), file ) ) 230  { 231  fclose( file ); 232  return MB_FAILURE; 233  } 234  235  // VTK spec says this should not exceed 256 chars. 236  if( !strchr( vendor_string, '\n' ) ) 237  { 238  fclose( file ); 239  MB_SET_ERR( MB_FAILURE, "Vendor string (line 2) exceeds 256 characters" ); 240  } 241  242  // Check file type 243  244  FileTokenizer tokens( file, readMeshIface ); 245  const char* const file_type_names[] = { "ASCII", "BINARY", 0 }; 246  int filetype = tokens.match_token( file_type_names ); 247  switch( filetype ) 248  { 249  case 2: // BINARY 250  MB_SET_ERR( MB_FAILURE, "Cannot read BINARY VTK files" ); 251  default: // ERROR 252  return MB_FAILURE; 253  case 1: // ASCII 254  break; 255  } 256  257  // Read the mesh 258  if( !tokens.match_token( "DATASET" ) ) return MB_FAILURE; 259  result = vtk_read_dataset( tokens, vertices, element_list ); 260  if( MB_SUCCESS != result ) return result; 261  262  if( file_id_tag ) 263  { 264  result = store_file_ids( *file_id_tag, vertices, element_list ); 265  if( MB_SUCCESS != result ) return result; 266  } 267  268  // Count the number of elements read 269  long elem_count = 0; 270  for( std::vector< Range >::iterator it = element_list.begin(); it != element_list.end(); ++it ) 271  elem_count += it->size(); 272  273  // Read attribute data until end of file. 274  const char* const block_type_names[] = { "POINT_DATA", "CELL_DATA", 0 }; 275  std::vector< Range > vertex_list( 1 ); 276  vertex_list[0] = vertices; 277  int blocktype = 0; 278  while( !tokens.eof() ) 279  { 280  // Get POINT_DATA or CELL_DATA 281  int new_block_type = tokens.match_token( block_type_names, false ); 282  if( tokens.eof() ) break; 283  284  if( !new_block_type ) 285  { 286  // If next token was neither POINT_DATA nor CELL_DATA, 287  // then there's another attribute under the current one. 288  if( blocktype ) 289  tokens.unget_token(); 290  else 291  break; 292  } 293  else 294  { 295  blocktype = new_block_type; 296  long count; 297  if( !tokens.get_long_ints( 1, &count ) ) return MB_FAILURE; 298  299  if( blocktype == 1 && (unsigned long)count != vertices.size() ) 300  { 301  MB_SET_ERR( MB_FAILURE, "Count inconsistent with number of vertices at line " << tokens.line_number() ); 302  } 303  else if( blocktype == 2 && count != elem_count ) 304  { 305  MB_SET_ERR( MB_FAILURE, "Count inconsistent with number of elements at line " << tokens.line_number() ); 306  } 307  } 308  309  if( blocktype == 1 ) 310  result = vtk_read_attrib_data( tokens, vertex_list ); 311  else 312  result = vtk_read_attrib_data( tokens, element_list ); 313  314  if( MB_SUCCESS != result ) return result; 315  } 316  317  return MB_SUCCESS; 318 }

References moab::FileTokenizer::eof(), ErrorCode, moab::FileTokenizer::get_long_ints(), moab::FileOptions::get_option(), moab::FileTokenizer::line_number(), moab::major, moab::FileTokenizer::match_token(), MB_FILE_DOES_NOT_EXIST, MB_SET_ERR, MB_SUCCESS, MB_UNSUPPORTED_OPERATION, moab::minor, mPartitionTagName, readMeshIface, moab::Range::size(), store_file_ids(), moab::FileTokenizer::unget_token(), vtk_read_attrib_data(), and vtk_read_dataset().

◆ read_tag_values()

ErrorCode ReadVtk::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 179 of file ReadVtk.cpp.

184 { 185  return MB_NOT_IMPLEMENTED; 186 }

References MB_NOT_IMPLEMENTED.

◆ read_vertices()

ErrorCode ReadVtk::read_vertices ( FileTokenizer tokens,
long  num_verts,
EntityHandle start_handle_out 
)
protected

Definition at line 341 of file ReadVtk.cpp.

342 { 343  ErrorCode result; 344  double *x, *y, *z; 345  346  result = allocate_vertices( num_verts, start_handle_out, x, y, z ); 347  if( MB_SUCCESS != result ) return result; 348  349  // Read vertex coordinates 350  for( long vtx = 0; vtx < num_verts; ++vtx ) 351  { 352  if( !tokens.get_doubles( 1, x++ ) || !tokens.get_doubles( 1, y++ ) || !tokens.get_doubles( 1, z++ ) ) 353  return MB_FAILURE; 354  } 355  356  return MB_SUCCESS; 357 }

References allocate_vertices(), ErrorCode, moab::FileTokenizer::get_doubles(), and MB_SUCCESS.

Referenced by vtk_read_polydata(), vtk_read_structured_grid(), and vtk_read_unstructured_grid().

◆ store_file_ids()

ErrorCode ReadVtk::store_file_ids ( Tag  tag,
const Range vertices,
const std::vector< Range > &  elements 
)
protected

Definition at line 1221 of file ReadVtk.cpp.

1222 { 1223  ErrorCode rval; 1224  1225  rval = readMeshIface->assign_ids( tag, verts ); 1226  if( MB_SUCCESS != rval ) return rval; 1227  1228  int id = 0; 1229  for( size_t i = 0; i < elems.size(); ++i ) 1230  { 1231  rval = readMeshIface->assign_ids( tag, elems[i], id ); 1232  id += elems[i].size(); 1233  } 1234  1235  return MB_SUCCESS; 1236 }

References moab::ReadUtilIface::assign_ids(), ErrorCode, MB_SUCCESS, and readMeshIface.

Referenced by load_file().

◆ vtk_create_structured_elems()

ErrorCode ReadVtk::vtk_create_structured_elems ( const long *  dims,
EntityHandle  first_vtx,
std::vector< Range > &  elem_list 
)
protected

Definition at line 864 of file ReadVtk.cpp.

867 { 868  ErrorCode result; 869  // int non_zero[3] = {0, 0, 0}; // True if dim > 0 for x, y, z respectively 870  long elem_dim = 0; // Element dimension (2->quad, 3->hex) 871  long num_elems = 1; // Total number of elements 872  long vert_per_elem; // Element connectivity length 873  long edims[3] = { 1, 1, 1 }; // Number of elements in each grid direction 874  875  // Populate above data 876  for( int d = 0; d < 3; d++ ) 877  { 878  if( dims[d] > 1 ) 879  { 880  // non_zero[elem_dim] = d; 881  ++elem_dim; 882  edims[d] = dims[d] - 1; 883  num_elems *= edims[d]; 884  } 885  } 886  vert_per_elem = 1 << elem_dim; 887  888  // Get element type from element dimension 889  EntityType type; 890  switch( elem_dim ) 891  { 892  case 1: 893  type = MBEDGE; 894  break; 895  case 2: 896  type = MBQUAD; 897  break; 898  case 3: 899  type = MBHEX; 900  break; 901  default: 902  MB_SET_ERR( MB_FAILURE, "Invalid dimension for structured elements: " << elem_dim ); 903  } 904  905  // Allocate storage for elements 906  EntityHandle start_handle = 0; 907  EntityHandle* conn_array; 908  result = allocate_elements( num_elems, vert_per_elem, type, start_handle, conn_array, elem_list ); 909  if( MB_SUCCESS != result ) return MB_FAILURE; 910  911  EntityHandle* conn_sav = conn_array; 912  913  // Offsets of element vertices in grid relative to corner closest to origin 914  long k = dims[0] * dims[1]; 915  const long corners[8] = { 0, 1, 1 + dims[0], dims[0], k, k + 1, k + 1 + dims[0], k + dims[0] }; 916  917  // Populate element list 918  for( long z = 0; z < edims[2]; ++z ) 919  for( long y = 0; y < edims[1]; ++y ) 920  for( long x = 0; x < edims[0]; ++x ) 921  { 922  const long index = x + y * dims[0] + z * ( dims[0] * dims[1] ); 923  for( long j = 0; j < vert_per_elem; ++j, ++conn_array ) 924  *conn_array = index + corners[j] + first_vtx; 925  } 926  927  // Notify MOAB of the new elements 928  result = readMeshIface->update_adjacencies( start_handle, num_elems, vert_per_elem, conn_sav ); 929  if( MB_SUCCESS != result ) return result; 930  931  return MB_SUCCESS; 932 }

References allocate_elements(), ErrorCode, MB_SET_ERR, MB_SUCCESS, MBEDGE, MBHEX, MBQUAD, readMeshIface, and moab::ReadUtilIface::update_adjacencies().

Referenced by vtk_read_rectilinear_grid(), vtk_read_structured_grid(), and vtk_read_structured_points().

◆ vtk_read_attrib_data()

ErrorCode ReadVtk::vtk_read_attrib_data ( FileTokenizer tokens,
std::vector< Range > &  entities 
)
protected

Definition at line 972 of file ReadVtk.cpp.

973 { 974  const char* const type_names[] = { "SCALARS", "COLOR_SCALARS", "VECTORS", "NORMALS", "TEXTURE_COORDINATES", 975  "TENSORS", "FIELD", 0 }; 976  977  int type = tokens.match_token( type_names ); 978  const char* tmp_name = tokens.get_string(); 979  if( !type || !tmp_name ) return MB_FAILURE; 980  981  std::string name_alloc( tmp_name ); 982  const char* name = name_alloc.c_str(); 983  switch( type ) 984  { 985  case 1: 986  return vtk_read_scalar_attrib( tokens, entities, name ); 987  case 2: 988  return vtk_read_color_attrib( tokens, entities, name ); 989  case 3: 990  return vtk_read_vector_attrib( tokens, entities, name ); 991  case 4: 992  return vtk_read_vector_attrib( tokens, entities, name ); 993  case 5: 994  return vtk_read_texture_attrib( tokens, entities, name ); 995  case 6: 996  return vtk_read_tensor_attrib( tokens, entities, name ); 997  case 7: 998  return vtk_read_field_attrib( tokens, entities, name ); 999  } 1000  1001  return MB_FAILURE; 1002 }

References entities, moab::FileTokenizer::get_string(), moab::FileTokenizer::match_token(), vtk_read_color_attrib(), vtk_read_field_attrib(), vtk_read_scalar_attrib(), vtk_read_tensor_attrib(), vtk_read_texture_attrib(), and vtk_read_vector_attrib().

Referenced by load_file().

◆ vtk_read_color_attrib()

ErrorCode ReadVtk::vtk_read_color_attrib ( FileTokenizer tokens,
std::vector< Range > &  entities,
const char *  name 
)
protected

Definition at line 1154 of file ReadVtk.cpp.

1155 { 1156  long size; 1157  if( !tokens.get_long_ints( 1, &size ) || size < 1 ) return MB_FAILURE; 1158  1159  return vtk_read_tag_data( tokens, 10, size, entities, name ); 1160 }

References entities, moab::FileTokenizer::get_long_ints(), size, and vtk_read_tag_data().

Referenced by vtk_read_attrib_data().

◆ vtk_read_dataset()

ErrorCode ReadVtk::vtk_read_dataset ( FileTokenizer tokens,
Range vertex_list,
std::vector< Range > &  element_list 
)
protected

Definition at line 378 of file ReadVtk.cpp.

379 { 380  const char* const data_type_names[] = { 381  "STRUCTURED_POINTS", "STRUCTURED_GRID", "UNSTRUCTURED_GRID", "POLYDATA", "RECTILINEAR_GRID", "FIELD", 0 }; 382  int datatype = tokens.match_token( data_type_names ); 383  switch( datatype ) 384  { 385  case 1: 386  return vtk_read_structured_points( tokens, vertex_list, element_list ); 387  case 2: 388  return vtk_read_structured_grid( tokens, vertex_list, element_list ); 389  case 3: 390  return vtk_read_unstructured_grid( tokens, vertex_list, element_list ); 391  case 4: 392  return vtk_read_polydata( tokens, vertex_list, element_list ); 393  case 5: 394  return vtk_read_rectilinear_grid( tokens, vertex_list, element_list ); 395  case 6: 396  return vtk_read_field( tokens ); 397  default: 398  return MB_FAILURE; 399  } 400 }

References moab::FileTokenizer::match_token(), vtk_read_field(), vtk_read_polydata(), vtk_read_rectilinear_grid(), vtk_read_structured_grid(), vtk_read_structured_points(), and vtk_read_unstructured_grid().

Referenced by load_file().

◆ vtk_read_field()

ErrorCode ReadVtk::vtk_read_field ( FileTokenizer tokens)
protected

Definition at line 934 of file ReadVtk.cpp.

935 { 936  // This is not supported yet. 937  // Parse the data but throw it away because 938  // Mesquite has no internal representation for it. 939  940  // Could save this in tags, but the only useful thing that 941  // could be done with the data is to write it back out 942  // with the modified mesh. As there's no way to save the 943  // type of a tag in Mesquite, it cannot be written back 944  // out correctly either. 945  // FIXME: Don't know what to do with this data. 946  // For now, read it and throw it out. 947  948  long num_arrays; 949  if( !tokens.get_string() || // Name 950  !tokens.get_long_ints( 1, &num_arrays ) ) 951  return MB_FAILURE; 952  953  for( long i = 0; i < num_arrays; ++i ) 954  { 955  /*const char* name =*/tokens.get_string(); 956  957  long dims[2]; 958  if( !tokens.get_long_ints( 2, dims ) || !tokens.match_token( vtk_type_names ) ) return MB_FAILURE; 959  960  long num_vals = dims[0] * dims[1]; 961  962  for( long j = 0; j < num_vals; j++ ) 963  { 964  double junk; 965  if( !tokens.get_doubles( 1, &junk ) ) return MB_FAILURE; 966  } 967  } 968  969  return MB_SUCCESS; 970 }

References moab::FileTokenizer::get_doubles(), moab::FileTokenizer::get_long_ints(), moab::FileTokenizer::get_string(), moab::FileTokenizer::match_token(), MB_SUCCESS, and moab::vtk_type_names.

Referenced by vtk_read_dataset(), and vtk_read_unstructured_grid().

◆ vtk_read_field_attrib()

ErrorCode ReadVtk::vtk_read_field_attrib ( FileTokenizer tokens,
std::vector< Range > &  entities,
const char *  name 
)
protected

Definition at line 1191 of file ReadVtk.cpp.

1192 { 1193  long num_fields; 1194  if( !tokens.get_long_ints( 1, &num_fields ) ) return MB_FAILURE; 1195  1196  long i; 1197  for( i = 0; i < num_fields; ++i ) 1198  { 1199  const char* tok = tokens.get_string(); 1200  if( !tok ) return MB_FAILURE; 1201  1202  std::string name_alloc( tok ); 1203  1204  long num_comp; 1205  if( !tokens.get_long_ints( 1, &num_comp ) ) return MB_FAILURE; 1206  1207  long num_tuples; 1208  if( !tokens.get_long_ints( 1, &num_tuples ) ) return MB_FAILURE; 1209  1210  int type = tokens.match_token( vtk_type_names ); 1211  if( !type ) return MB_FAILURE; 1212  1213  ErrorCode result = vtk_read_tag_data( tokens, type, num_comp, entities, name_alloc.c_str() );MB_CHK_SET_ERR( result, "Error reading data for field \"" << name_alloc << "\" (" << num_comp << " components, " 1214  << num_tuples << " tuples, type " << type 1215  << ") at line " << tokens.line_number() ); 1216  } 1217  1218  return MB_SUCCESS; 1219 }

References entities, ErrorCode, moab::FileTokenizer::get_long_ints(), moab::FileTokenizer::get_string(), moab::FileTokenizer::line_number(), moab::FileTokenizer::match_token(), MB_CHK_SET_ERR, MB_SUCCESS, vtk_read_tag_data(), and moab::vtk_type_names.

Referenced by vtk_read_attrib_data().

◆ vtk_read_polydata()

ErrorCode ReadVtk::vtk_read_polydata ( FileTokenizer tokens,
Range vertex_list,
std::vector< Range > &  elem_list 
)
protected

Definition at line 540 of file ReadVtk.cpp.

541 { 542  ErrorCode result; 543  long num_verts; 544  const char* const poly_data_names[] = { "VERTICES", "LINES", "POLYGONS", "TRIANGLE_STRIPS", 0 }; 545  546  if( !tokens.match_token( "POINTS" ) || !tokens.get_long_ints( 1, &num_verts ) || 547  !tokens.match_token( vtk_type_names ) || !tokens.get_newline() ) 548  return MB_FAILURE; 549  550  if( num_verts < 1 ) 551  { 552  MB_SET_ERR( MB_FAILURE, "Invalid point count at line " << tokens.line_number() ); 553  } 554  555  // Create vertices and read coordinates 556  EntityHandle start_handle = 0; 557  result = read_vertices( tokens, num_verts, start_handle ); 558  if( MB_SUCCESS != result ) return result; 559  vertex_list.insert( start_handle, start_handle + num_verts - 1 ); 560  561  int poly_type = tokens.match_token( poly_data_names ); 562  switch( poly_type ) 563  { 564  case 0: 565  result = MB_FAILURE; 566  break; 567  case 1: 568  MB_SET_ERR( MB_FAILURE, "Vertex element type at line " << tokens.line_number() ); 569  break; 570  case 2: 571  MB_SET_ERR( MB_FAILURE, "Unsupported type: polylines at line " << tokens.line_number() ); 572  result = MB_FAILURE; 573  break; 574  case 3: 575  result = vtk_read_polygons( tokens, start_handle, elem_list ); 576  break; 577  case 4: 578  MB_SET_ERR( MB_FAILURE, "Unsupported type: triangle strips at line " << tokens.line_number() ); 579  result = MB_FAILURE; 580  break; 581  } 582  583  return result; 584 }

References ErrorCode, moab::FileTokenizer::get_long_ints(), moab::FileTokenizer::get_newline(), moab::Range::insert(), moab::FileTokenizer::line_number(), moab::FileTokenizer::match_token(), MB_SET_ERR, MB_SUCCESS, read_vertices(), vtk_read_polygons(), and moab::vtk_type_names.

Referenced by vtk_read_dataset().

◆ vtk_read_polygons()

ErrorCode ReadVtk::vtk_read_polygons ( FileTokenizer tokens,
EntityHandle  first_vtx,
std::vector< Range > &  elem_list 
)
protected

Definition at line 586 of file ReadVtk.cpp.

587 { 588  ErrorCode result; 589  long size[2]; 590  591  if( !tokens.get_long_ints( 2, size ) || !tokens.get_newline() ) return MB_FAILURE; 592  593  const Range empty; 594  std::vector< EntityHandle > conn_hdl; 595  std::vector< long > conn_idx; 596  EntityHandle first = 0, prev = 0, handle; 597  for( int i = 0; i < size[0]; ++i ) 598  { 599  long count; 600  if( !tokens.get_long_ints( 1, &count ) ) return MB_FAILURE; 601  conn_idx.resize( count ); 602  conn_hdl.resize( count ); 603  if( !tokens.get_long_ints( count, &conn_idx[0] ) ) return MB_FAILURE; 604  605  for( long j = 0; j < count; ++j ) 606  conn_hdl[j] = first_vtx + conn_idx[j]; 607  608  result = mdbImpl->create_element( MBPOLYGON, &conn_hdl[0], count, handle ); 609  if( MB_SUCCESS != result ) return result; 610  611  if( prev + 1 != handle ) 612  { 613  if( first ) 614  { // True except for first iteration (first == 0) 615  if( elem_list.empty() || first < elem_list.back().front() ) // Only need new range if order would get 616  // mixed up, or we just began inserting 617  elem_list.push_back( empty ); 618  elem_list.back().insert( first, prev ); 619  } 620  first = handle; 621  } 622  prev = handle; 623  } 624  if( first ) 625  { // True unless no elements (size[0] == 0) 626  if( elem_list.empty() || first < elem_list.back().front() ) // Only need new range if order would get mixed 627  // up, or we just began inserting 628  elem_list.push_back( empty ); 629  elem_list.back().insert( first, prev ); 630  } 631  632  return MB_SUCCESS; 633 }

References moab::Interface::create_element(), ErrorCode, moab::GeomUtil::first(), moab::FileTokenizer::get_long_ints(), moab::FileTokenizer::get_newline(), MB_SUCCESS, MBPOLYGON, mdbImpl, and size.

Referenced by vtk_read_polydata().

◆ vtk_read_rectilinear_grid()

ErrorCode ReadVtk::vtk_read_rectilinear_grid ( FileTokenizer tokens,
Range vertex_list,
std::vector< Range > &  elem_list 
)
protected

Definition at line 482 of file ReadVtk.cpp.

485 { 486  int i, j, k; 487  long dims[3]; 488  const char* labels[] = { "X_COORDINATES", "Y_COORDINATES", "Z_COORDINATES" }; 489  std::vector< double > coords[3]; 490  ErrorCode result; 491  492  if( !tokens.match_token( "DIMENSIONS" ) || !tokens.get_long_ints( 3, dims ) || !tokens.get_newline() ) 493  return MB_FAILURE; 494  495  if( dims[0] < 1 || dims[1] < 1 || dims[2] < 1 ) 496  { 497  MB_SET_ERR( MB_FAILURE, "Invalid dimension at line " << tokens.line_number() ); 498  } 499  500  for( i = 0; i < 3; i++ ) 501  { 502  long count; 503  if( !tokens.match_token( labels[i] ) || !tokens.get_long_ints( 1, &count ) || 504  !tokens.match_token( vtk_type_names ) ) 505  return MB_FAILURE; 506  507  if( count != dims[i] ) 508  { 509  MB_SET_ERR( MB_FAILURE, "Coordinate count inconsistent with dimensions at line " << tokens.line_number() ); 510  } 511  512  coords[i].resize( count ); 513  if( !tokens.get_doubles( count, &coords[i][0] ) ) return MB_FAILURE; 514  } 515  516  // Create vertices 517  double *x, *y, *z; 518  EntityHandle start_handle = 0; 519  long num_verts = dims[0] * dims[1] * dims[2]; 520  result = allocate_vertices( num_verts, start_handle, x, y, z ); 521  if( MB_SUCCESS != result ) return result; 522  vertex_list.insert( start_handle, start_handle + num_verts - 1 ); 523  524  // Calculate vertex coordinates 525  for( k = 0; k < dims[2]; ++k ) 526  for( j = 0; j < dims[1]; ++j ) 527  for( i = 0; i < dims[0]; ++i ) 528  { 529  *x = coords[0][i]; 530  ++x; 531  *y = coords[1][j]; 532  ++y; 533  *z = coords[2][k]; 534  ++z; 535  } 536  537  return vtk_create_structured_elems( dims, start_handle, elem_list ); 538 }

References allocate_vertices(), ErrorCode, moab::FileTokenizer::get_doubles(), moab::FileTokenizer::get_long_ints(), moab::FileTokenizer::get_newline(), moab::Range::insert(), moab::FileTokenizer::line_number(), moab::FileTokenizer::match_token(), MB_SET_ERR, MB_SUCCESS, vtk_create_structured_elems(), and moab::vtk_type_names.

Referenced by vtk_read_dataset().

◆ vtk_read_scalar_attrib()

ErrorCode ReadVtk::vtk_read_scalar_attrib ( FileTokenizer tokens,
std::vector< Range > &  entities,
const char *  name 
)
protected

Definition at line 1126 of file ReadVtk.cpp.

1127 { 1128  int type = tokens.match_token( vtk_type_names ); 1129  if( !type ) return MB_FAILURE; 1130  1131  long size; 1132  const char* tok = tokens.get_string(); 1133  if( !tok ) return MB_FAILURE; 1134  1135  const char* end = 0; 1136  size = strtol( tok, (char**)&end, 0 ); 1137  if( *end ) 1138  { 1139  size = 1; 1140  tokens.unget_token(); 1141  } 1142  1143  // VTK spec says cannot be greater than 4--do we care? 1144  if( size < 1 ) 1145  { //|| size > 4) 1146  MB_SET_ERR( MB_FAILURE, "Scalar count out of range [1,4] at line " << tokens.line_number() ); 1147  } 1148  1149  if( !tokens.match_token( "LOOKUP_TABLE" ) || !tokens.match_token( "default" ) ) return MB_FAILURE; 1150  1151  return vtk_read_tag_data( tokens, type, size, entities, name ); 1152 }

References entities, moab::FileTokenizer::get_string(), moab::FileTokenizer::line_number(), moab::FileTokenizer::match_token(), MB_SET_ERR, size, moab::FileTokenizer::unget_token(), vtk_read_tag_data(), and moab::vtk_type_names.

Referenced by vtk_read_attrib_data().

◆ vtk_read_structured_grid()

ErrorCode ReadVtk::vtk_read_structured_grid ( FileTokenizer tokens,
Range vertex_list,
std::vector< Range > &  elem_list 
)
protected

Definition at line 449 of file ReadVtk.cpp.

452 { 453  long num_verts, dims[3]; 454  ErrorCode result; 455  456  if( !tokens.match_token( "DIMENSIONS" ) || !tokens.get_long_ints( 3, dims ) || !tokens.get_newline() ) 457  return MB_FAILURE; 458  459  if( dims[0] < 1 || dims[1] < 1 || dims[2] < 1 ) 460  { 461  MB_SET_ERR( MB_FAILURE, "Invalid dimension at line " << tokens.line_number() ); 462  } 463  464  if( !tokens.match_token( "POINTS" ) || !tokens.get_long_ints( 1, &num_verts ) || 465  !tokens.match_token( vtk_type_names ) || !tokens.get_newline() ) 466  return MB_FAILURE; 467  468  if( num_verts != ( dims[0] * dims[1] * dims[2] ) ) 469  { 470  MB_SET_ERR( MB_FAILURE, "Point count not consistent with dimensions at line " << tokens.line_number() ); 471  } 472  473  // Create and read vertices 474  EntityHandle start_handle = 0; 475  result = read_vertices( tokens, num_verts, start_handle ); 476  if( MB_SUCCESS != result ) return result; 477  vertex_list.insert( start_handle, start_handle + num_verts - 1 ); 478  479  return vtk_create_structured_elems( dims, start_handle, elem_list ); 480 }

References ErrorCode, moab::FileTokenizer::get_long_ints(), moab::FileTokenizer::get_newline(), moab::Range::insert(), moab::FileTokenizer::line_number(), moab::FileTokenizer::match_token(), MB_SET_ERR, MB_SUCCESS, read_vertices(), vtk_create_structured_elems(), and moab::vtk_type_names.

Referenced by vtk_read_dataset().

◆ vtk_read_structured_points()

ErrorCode ReadVtk::vtk_read_structured_points ( FileTokenizer tokens,
Range vertex_list,
std::vector< Range > &  elem_list 
)
protected

Definition at line 402 of file ReadVtk.cpp.

405 { 406  long i, j, k; 407  long dims[3]; 408  double origin[3], space[3]; 409  ErrorCode result; 410  411  if( !tokens.match_token( "DIMENSIONS" ) || !tokens.get_long_ints( 3, dims ) || !tokens.get_newline() ) 412  return MB_FAILURE; 413  414  if( dims[0] < 1 || dims[1] < 1 || dims[2] < 1 ) 415  { 416  MB_SET_ERR( MB_FAILURE, "Invalid dimension at line " << tokens.line_number() ); 417  } 418  419  if( !tokens.match_token( "ORIGIN" ) || !tokens.get_doubles( 3, origin ) || !tokens.get_newline() ) 420  return MB_FAILURE; 421  422  const char* const spacing_names[] = { "SPACING", "ASPECT_RATIO", 0 }; 423  if( !tokens.match_token( spacing_names ) || !tokens.get_doubles( 3, space ) || !tokens.get_newline() ) 424  return MB_FAILURE; 425  426  // Create vertices 427  double *x, *y, *z; 428  EntityHandle start_handle = 0; 429  long num_verts = dims[0] * dims[1] * dims[2]; 430  result = allocate_vertices( num_verts, start_handle, x, y, z ); 431  if( MB_SUCCESS != result ) return result; 432  vertex_list.insert( start_handle, start_handle + num_verts - 1 ); 433  434  for( k = 0; k < dims[2]; ++k ) 435  for( j = 0; j < dims[1]; ++j ) 436  for( i = 0; i < dims[0]; ++i ) 437  { 438  *x = origin[0] + i * space[0]; 439  ++x; 440  *y = origin[1] + j * space[1]; 441  ++y; 442  *z = origin[2] + k * space[2]; 443  ++z; 444  } 445  446  return vtk_create_structured_elems( dims, start_handle, elem_list ); 447 }

References allocate_vertices(), ErrorCode, moab::FileTokenizer::get_doubles(), moab::FileTokenizer::get_long_ints(), moab::FileTokenizer::get_newline(), moab::Range::insert(), moab::FileTokenizer::line_number(), moab::FileTokenizer::match_token(), MB_SET_ERR, MB_SUCCESS, and vtk_create_structured_elems().

Referenced by vtk_read_dataset().

◆ vtk_read_tag_data()

ErrorCode ReadVtk::vtk_read_tag_data ( FileTokenizer tokens,
int  type,
size_t  per_elem,
std::vector< Range > &  entities,
const char *  name 
)
protected

Definition at line 1004 of file ReadVtk.cpp.

1009 { 1010  ErrorCode result; 1011  DataType mb_type; 1012  if( type == 1 ) 1013  { 1014  mb_type = MB_TYPE_BIT; 1015  } 1016  else if( type >= 2 && type <= 9 ) 1017  { 1018  mb_type = MB_TYPE_INTEGER; 1019  } 1020  else if( type == 10 || type == 11 ) 1021  { 1022  mb_type = MB_TYPE_DOUBLE; 1023  } 1024  else if( type == 12 ) 1025  { 1026  mb_type = MB_TYPE_INTEGER; 1027  } 1028  else 1029  return MB_FAILURE; 1030  1031 #ifdef MB_VTK_MATERIAL_SETS 1032  size_t size; 1033  if( type == 1 ) 1034  { 1035  size = sizeof( bool ); 1036  } 1037  else if( type >= 2 && type <= 9 ) 1038  { 1039  size = sizeof( int ); 1040  } 1041  else if( type == 10 || type == 11 ) 1042  { 1043  size = sizeof( double ); 1044  } 1045  else /* (type == 12) */ 1046  { 1047  size = 4; // Could be 4 or 8, but we don't know. Hope it's 4 because MOAB doesn't support 1048  // 64-bit ints. 1049  } 1050  Modulator materialMap( this->mdbImpl ); 1051  result = materialMap.initialize( this->mPartitionTagName, mb_type, size, per_elem );MB_CHK_SET_ERR( result, "MaterialMap tag (" << this->mPartitionTagName << ") creation failed." ); 1052  bool isMaterial = size * per_elem <= 4 && // Must have int-sized values (ParallelComm requires it) 1053  !this->mPartitionTagName.empty() && // Must have a non-empty field name... 1054  !strcmp( name, this->mPartitionTagName.c_str() ); // ... that matches our spec. 1055 #endif // MB_VTK_MATERIAL_SETS 1056  1057  // Get/create tag 1058  Tag handle; 1059  result = mdbImpl->tag_get_handle( name, per_elem, mb_type, handle, MB_TAG_DENSE | MB_TAG_CREAT );MB_CHK_SET_ERR( result, "Tag name conflict for attribute \"" << name << "\" at line " << tokens.line_number() ); 1060  1061  std::vector< Range >::iterator iter; 1062  1063  if( type == 1 ) 1064  { 1065  for( iter = entities.begin(); iter != entities.end(); ++iter ) 1066  { 1067  bool* data = new bool[iter->size() * per_elem]; 1068  if( !tokens.get_booleans( per_elem * iter->size(), data ) ) 1069  { 1070  delete[] data; 1071  return MB_FAILURE; 1072  } 1073  1074  bool* data_iter = data; 1075  Range::iterator ent_iter = iter->begin(); 1076  for( ; ent_iter != iter->end(); ++ent_iter ) 1077  { 1078  unsigned char bits = 0; 1079  for( unsigned j = 0; j < per_elem; ++j, ++data_iter ) 1080  bits |= (unsigned char)( *data_iter << j ); 1081 #ifdef MB_VTK_MATERIAL_SETS 1082  if( isMaterial ) materialMap.add_entity( *ent_iter, &bits, 1 ); 1083 #endif // MB_VTK_MATERIAL_SETS 1084  result = mdbImpl->tag_set_data( handle, &*ent_iter, 1, &bits ); 1085  if( MB_SUCCESS != result ) 1086  { 1087  delete[] data; 1088  return result; 1089  } 1090  } 1091  delete[] data; 1092  } 1093  } 1094  else if( ( type >= 2 && type <= 9 ) || type == 12 ) 1095  { 1096  std::vector< int > data; 1097  for( iter = entities.begin(); iter != entities.end(); ++iter ) 1098  { 1099  data.resize( iter->size() * per_elem ); 1100  if( !tokens.get_integers( iter->size() * per_elem, &data[0] ) ) return MB_FAILURE; 1101 #ifdef MB_VTK_MATERIAL_SETS 1102  if( isMaterial ) materialMap.add_entities( *iter, (unsigned char*)&data[0], per_elem * size ); 1103 #endif // MB_VTK_MATERIAL_SETS 1104  result = mdbImpl->tag_set_data( handle, *iter, &data[0] ); 1105  if( MB_SUCCESS != result ) return result; 1106  } 1107  } 1108  else if( type == 10 || type == 11 ) 1109  { 1110  std::vector< double > data; 1111  for( iter = entities.begin(); iter != entities.end(); ++iter ) 1112  { 1113  data.resize( iter->size() * per_elem ); 1114  if( !tokens.get_doubles( iter->size() * per_elem, &data[0] ) ) return MB_FAILURE; 1115 #ifdef MB_VTK_MATERIAL_SETS 1116  if( isMaterial ) materialMap.add_entities( *iter, (unsigned char*)&data[0], per_elem * size ); 1117 #endif // MB_VTK_MATERIAL_SETS 1118  result = mdbImpl->tag_set_data( handle, *iter, &data[0] ); 1119  if( MB_SUCCESS != result ) return result; 1120  } 1121  } 1122  1123  return MB_SUCCESS; 1124 }

References entities, ErrorCode, moab::FileTokenizer::get_booleans(), moab::FileTokenizer::get_doubles(), moab::FileTokenizer::get_integers(), moab::FileTokenizer::line_number(), MB_CHK_SET_ERR, MB_SUCCESS, MB_TAG_CREAT, MB_TAG_DENSE, MB_TYPE_BIT, MB_TYPE_DOUBLE, MB_TYPE_INTEGER, mdbImpl, mPartitionTagName, size, moab::Interface::tag_get_handle(), and moab::Interface::tag_set_data().

Referenced by vtk_read_color_attrib(), vtk_read_field_attrib(), vtk_read_scalar_attrib(), vtk_read_tensor_attrib(), vtk_read_texture_attrib(), and vtk_read_vector_attrib().

◆ vtk_read_tensor_attrib()

ErrorCode ReadVtk::vtk_read_tensor_attrib ( FileTokenizer tokens,
std::vector< Range > &  entities,
const char *  name 
)
protected

Definition at line 1183 of file ReadVtk.cpp.

1184 { 1185  int type = tokens.match_token( vtk_type_names ); 1186  if( !type ) return MB_FAILURE; 1187  1188  return vtk_read_tag_data( tokens, type, 9, entities, name ); 1189 }

References entities, moab::FileTokenizer::match_token(), vtk_read_tag_data(), and moab::vtk_type_names.

Referenced by vtk_read_attrib_data().

◆ vtk_read_texture_attrib()

ErrorCode ReadVtk::vtk_read_texture_attrib ( FileTokenizer tokens,
std::vector< Range > &  entities,
const char *  name 
)
protected

Definition at line 1170 of file ReadVtk.cpp.

1171 { 1172  int type, dim; 1173  if( !tokens.get_integers( 1, &dim ) || !( type = tokens.match_token( vtk_type_names ) ) ) return MB_FAILURE; 1174  1175  if( dim < 1 || dim > 3 ) 1176  { 1177  MB_SET_ERR( MB_FAILURE, "Invalid dimension (" << dim << ") at line " << tokens.line_number() ); 1178  } 1179  1180  return vtk_read_tag_data( tokens, type, dim, entities, name ); 1181 }

References dim, entities, moab::FileTokenizer::get_integers(), moab::FileTokenizer::line_number(), moab::FileTokenizer::match_token(), MB_SET_ERR, vtk_read_tag_data(), and moab::vtk_type_names.

Referenced by vtk_read_attrib_data().

◆ vtk_read_unstructured_grid()

ErrorCode ReadVtk::vtk_read_unstructured_grid ( FileTokenizer tokens,
Range vertex_list,
std::vector< Range > &  elem_list 
)
protected

Definition at line 635 of file ReadVtk.cpp.

638 { 639  ErrorCode result; 640  long i, num_verts, num_elems[2]; 641  EntityHandle tmp_conn_list[27]; 642  643  // Poorly formatted VTK legacy format document seems to 644  // lead many to think that a FIELD block can occur within 645  // an UNSTRUCTURED_GRID dataset rather than as its own data 646  // set. So allow for field data between other blocks of 647  // data. 648  649  const char* pts_str[] = { "FIELD", "POINTS", 0 }; 650  while( 1 == ( i = tokens.match_token( pts_str ) ) ) 651  { 652  result = vtk_read_field( tokens ); 653  if( MB_SUCCESS != result ) return result; 654  } 655  if( i != 2 ) return MB_FAILURE; 656  657  if( !tokens.get_long_ints( 1, &num_verts ) || !tokens.match_token( vtk_type_names ) || !tokens.get_newline() ) 658  return MB_FAILURE; 659  660  if( num_verts < 1 ) 661  { 662  MB_SET_ERR( MB_FAILURE, "Invalid point count at line " << tokens.line_number() ); 663  } 664  665  // Create vertices and read coordinates 666  EntityHandle first_vertex = 0; 667  result = read_vertices( tokens, num_verts, first_vertex ); 668  if( MB_SUCCESS != result ) return result; 669  vertex_list.insert( first_vertex, first_vertex + num_verts - 1 ); 670  671  const char* cell_str[] = { "FIELD", "CELLS", 0 }; 672  while( 1 == ( i = tokens.match_token( cell_str ) ) ) 673  { 674  result = vtk_read_field( tokens ); 675  if( MB_SUCCESS != result ) return result; 676  } 677  if( i != 2 ) return MB_FAILURE; 678  679  if( !tokens.get_long_ints( 2, num_elems ) || !tokens.get_newline() ) return MB_FAILURE; 680  681  // Read element connectivity for all elements 682  std::vector< long > connectivity( num_elems[1] ); 683  if( !tokens.get_long_ints( num_elems[1], &connectivity[0] ) ) return MB_FAILURE; 684  685  if( !tokens.match_token( "CELL_TYPES" ) || !tokens.get_long_ints( 1, &num_elems[1] ) || !tokens.get_newline() ) 686  return MB_FAILURE; 687  688  // Read element types 689  std::vector< long > types( num_elems[0] ); 690  if( !tokens.get_long_ints( num_elems[0], &types[0] ) ) return MB_FAILURE; 691  692  // Create elements in blocks of the same type 693  // It is important to preserve the order in 694  // which the elements were read for later reading 695  // attribute data. 696  long id = 0; 697  std::vector< long >::iterator conn_iter = connectivity.begin(); 698  while( id < num_elems[0] ) 699  { 700  unsigned vtk_type = types[id]; 701  if( vtk_type >= VtkUtil::numVtkElemType ) return MB_FAILURE; 702  703  EntityType type = VtkUtil::vtkElemTypes[vtk_type].mb_type; 704  if( type == MBMAXTYPE ) 705  { 706  MB_SET_ERR( MB_FAILURE, "Unsupported VTK element type: " << VtkUtil::vtkElemTypes[vtk_type].name << " (" 707  << vtk_type << ")" ); 708  } 709  710  int num_vtx = *conn_iter; 711  if( type != MBPOLYGON && type != MBPOLYHEDRON && num_vtx != (int)VtkUtil::vtkElemTypes[vtk_type].num_nodes ) 712  { 713  MB_SET_ERR( MB_FAILURE, "Cell " << id << " is of type '" << VtkUtil::vtkElemTypes[vtk_type].name 714  << "' but has " << num_vtx << " vertices" ); 715  } 716  717  // Find any subsequent elements of the same type 718  // if polyhedra, need to look at the number of faces to put in the same range 719  std::vector< long >::iterator conn_iter2 = conn_iter + num_vtx + 1; 720  long end_id = id + 1; 721  if( MBPOLYHEDRON != type ) 722  { 723  while( end_id < num_elems[0] && (unsigned)types[end_id] == vtk_type && *conn_iter2 == num_vtx ) 724  { 725  ++end_id; 726  conn_iter2 += num_vtx + 1; 727  } 728  } 729  else 730  { 731  // advance only if next is polyhedron too, and if number of faces is the same 732  int num_faces = conn_iter[1]; 733  while( end_id < num_elems[0] && (unsigned)types[end_id] == vtk_type && conn_iter2[1] == num_faces ) 734  { 735  ++end_id; 736  conn_iter2 += num_vtx + 1; 737  } 738  // num_vtx becomes in this case num_faces 739  num_vtx = num_faces; // for polyhedra, this is what we want 740  // trigger vertex adjacency call 741  Range firstFaces; 742  mdbImpl->get_adjacencies( &first_vertex, 1, 2, false, firstFaces ); 743  } 744  745  // Allocate element block 746  long num_elem = end_id - id; 747  EntityHandle start_handle = 0; 748  EntityHandle* conn_array; 749  750  // if type is MBVERTEX, skip, we will not create elements with one vertex 751  if( MBVERTEX == type ) 752  { 753  id += num_elem; 754  conn_iter += 2 * num_elem; // skip 2 * number of 1-vertex elements 755  continue; 756  } 757  758  result = allocate_elements( num_elem, num_vtx, type, start_handle, conn_array, elem_list ); 759  if( MB_SUCCESS != result ) return result; 760  761  EntityHandle* conn_sav = conn_array; 762  763  // Store element connectivity 764  if( type != MBPOLYHEDRON ) 765  { 766  for( ; id < end_id; ++id ) 767  { 768  if( conn_iter == connectivity.end() ) 769  { 770  MB_SET_ERR( MB_FAILURE, "Connectivity data truncated at cell " << id ); 771  } 772  // Make sure connectivity length is correct. 773  if( *conn_iter != num_vtx ) 774  { 775  MB_SET_ERR( MB_FAILURE, "Cell " << id << " is of type '" << VtkUtil::vtkElemTypes[vtk_type].name 776  << "' but has " << num_vtx << " vertices" ); 777  } 778  ++conn_iter; 779  780  for( i = 0; i < num_vtx; ++i, ++conn_iter ) 781  { 782  if( conn_iter == connectivity.end() ) 783  { 784  MB_SET_ERR( MB_FAILURE, "Connectivity data truncated at cell " << id ); 785  } 786  787  conn_array[i] = *conn_iter + first_vertex; 788  } 789  790  const unsigned* order = VtkUtil::vtkElemTypes[vtk_type].node_order; 791  if( order ) 792  { 793  assert( num_vtx * sizeof( EntityHandle ) <= sizeof( tmp_conn_list ) ); 794  memcpy( tmp_conn_list, conn_array, num_vtx * sizeof( EntityHandle ) ); 795  for( int j = 0; j < num_vtx; ++j ) 796  conn_array[order[j]] = tmp_conn_list[j]; 797  } 798  799  conn_array += num_vtx; 800  } 801  } 802  else // type == MBPOLYHEDRON 803  { 804  // in some cases, we may need to create new elements; will it screw the tags? 805  // not if the file was not from moab 806  ErrorCode rv = MB_SUCCESS; 807  for( ; id < end_id; ++id ) 808  { 809  if( conn_iter == connectivity.end() ) 810  { 811  MB_SET_ERR( MB_FAILURE, "Connectivity data truncated at polyhedra cell " << id ); 812  } 813  ++conn_iter; 814  // iterator is now at number of faces 815  // we should check it is indeed num_vtx 816  int num_faces = *conn_iter; 817  if( num_faces != num_vtx ) MB_SET_ERR( MB_FAILURE, "Connectivity data wrong at polyhedra cell " << id ); 818  819  EntityHandle connec[20]; // we bet we will have only 20 vertices at most, in a 820  // face in a polyhedra 821  for( int j = 0; j < num_faces; j++ ) 822  { 823  conn_iter++; 824  int numverticesInFace = (int)*conn_iter; 825  if( numverticesInFace > 20 ) 826  MB_SET_ERR( MB_FAILURE, 827  "too many vertices in face index " << j << " for polyhedra cell " << id ); 828  // need to find the face, but first fill with vertices 829  for( int k = 0; k < numverticesInFace; k++ ) 830  { 831  connec[k] = first_vertex + *( ++conn_iter ); // 832  } 833  Range adjFaces; 834  // find a face with these vertices; if not, we need to create one, on the fly :( 835  rv = mdbImpl->get_adjacencies( connec, numverticesInFace, 2, false, adjFaces );MB_CHK_ERR( rv ); 836  if( adjFaces.size() >= 1 ) 837  { 838  conn_array[j] = adjFaces[0]; // get the first face found 839  } 840  else 841  { 842  // create the face; tri, quad or polygon 843  EntityType etype = MBTRI; 844  if( 4 == numverticesInFace ) etype = MBQUAD; 845  if( 4 < numverticesInFace ) etype = MBPOLYGON; 846  847  rv = mdbImpl->create_element( etype, connec, numverticesInFace, conn_array[j] );MB_CHK_ERR( rv ); 848  } 849  } 850  851  conn_array += num_vtx; // advance for next polyhedra 852  conn_iter++; // advance to the next field 853  } 854  } 855  856  // Notify MOAB of the new elements 857  result = readMeshIface->update_adjacencies( start_handle, num_elem, num_vtx, conn_sav ); 858  if( MB_SUCCESS != result ) return result; 859  } 860  861  return MB_SUCCESS; 862 }

References allocate_elements(), moab::Interface::create_element(), ErrorCode, moab::Interface::get_adjacencies(), moab::FileTokenizer::get_long_ints(), moab::FileTokenizer::get_newline(), moab::Range::insert(), moab::FileTokenizer::line_number(), moab::FileTokenizer::match_token(), MB_CHK_ERR, MB_SET_ERR, MB_SUCCESS, moab::VtkElemType::mb_type, MBMAXTYPE, MBPOLYGON, MBPOLYHEDRON, MBQUAD, MBTRI, MBVERTEX, mdbImpl, moab::VtkElemType::node_order, moab::VtkUtil::numVtkElemType, read_vertices(), readMeshIface, moab::Range::size(), moab::ReadUtilIface::update_adjacencies(), vtk_read_field(), moab::vtk_type_names, and moab::VtkUtil::vtkElemTypes.

Referenced by vtk_read_dataset().

◆ vtk_read_vector_attrib()

ErrorCode ReadVtk::vtk_read_vector_attrib ( FileTokenizer tokens,
std::vector< Range > &  entities,
const char *  name 
)
protected

Definition at line 1162 of file ReadVtk.cpp.

1163 { 1164  int type = tokens.match_token( vtk_type_names ); 1165  if( !type ) return MB_FAILURE; 1166  1167  return vtk_read_tag_data( tokens, type, 3, entities, name ); 1168 }

References entities, moab::FileTokenizer::match_token(), vtk_read_tag_data(), and moab::vtk_type_names.

Referenced by vtk_read_attrib_data().

Member Data Documentation

◆ mdbImpl

Interface* moab::ReadVtk::mdbImpl
private

interface instance

Definition at line 117 of file ReadVtk.hpp.

Referenced by ReadVtk(), vtk_read_polygons(), vtk_read_tag_data(), vtk_read_unstructured_grid(), and ~ReadVtk().

◆ mPartitionTagName

std::string moab::ReadVtk::mPartitionTagName
private

A field which, if present and having a single integer for storage, should be used to partition the mesh by range. Defaults to MATERIAL_SET_TAG_NAME.

Definition at line 121 of file ReadVtk.hpp.

Referenced by load_file(), and vtk_read_tag_data().

◆ readMeshIface


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