MOAB: Mesh Oriented datABase  (version 5.4.1)
dump_geom_sets.cxx File Reference
#include <stdio.h>
#include <stdlib.h>
#include <hdf5.h>
#include <vector>
#include <map>
#include <string>
+ Include dependency graph for dump_geom_sets.cxx:

Go to the source code of this file.

Functions

hid_t open_file (const char *name)
long read_scalar_attrib (hid_t file, const char *table, const char *attrib)
void read_data (hid_t file, const char *name, int expected_cols, std::vector< long > &data)
void create_map (const std::vector< long > &ents, const std::vector< long > &vals, std::map< long, long > &map, const char *name)
std::string ent_from_handle (const std::map< long, long > &dimmap, const std::map< long, long > &idmap, long handle)
std::string ent_list_from_handles (const std::map< long, long > &dimmap, const std::map< long, long > &idmap, const std::vector< long > &vect, long start, long stop)
int main (int argc, char *argv[])

Function Documentation

void create_map ( const std::vector< long > &  ents,
const std::vector< long > &  vals,
std::map< long, long > &  map,
const char *  name 
)

Definition at line 98 of file dump_geom_sets.cxx.

Referenced by main().

{
  if (ents.size() != vals.size()) {
    fprintf(stderr, "Invalid data for tag \"%s\": mismatched table lengths.\n", name );
    exit (1);
  }
  
  std::vector<long>::const_iterator e_iter = ents.begin(), v_iter = vals.begin();
  for (; e_iter != ents.end(); ++e_iter, ++v_iter)
    map[*e_iter] = *v_iter;
} 
std::string ent_from_handle ( const std::map< long, long > &  dimmap,
const std::map< long, long > &  idmap,
long  handle 
)

Definition at line 116 of file dump_geom_sets.cxx.

References buffer.

Referenced by ent_list_from_handles(), and main().

{
  std::string result;
  std::map<long,long>::const_iterator d_iter, i_iter;
  d_iter = dimmap.find( handle );
  i_iter =  idmap.find( handle );
  if (d_iter == dimmap.end() || i_iter == idmap.end()) 
    return result;

  switch (d_iter->second) {
    case 0: result += "v"; break;
    case 1: result += "c"; break;
    case 2: result += "s"; break;
    case 3: result += "V"; break;
    default:
      fprintf(stderr,"Invalid value in GEOM_DIMENSION tag data.\n");
      exit (1);
  }
  
  char buffer[128];
  sprintf(buffer, "%ld", i_iter->second );
  result += buffer;
  return result;
}
std::string ent_list_from_handles ( const std::map< long, long > &  dimmap,
const std::map< long, long > &  idmap,
const std::vector< long > &  vect,
long  start,
long  stop 
)

Definition at line 146 of file dump_geom_sets.cxx.

References ent_from_handle().

Referenced by main().

{
  std::string result;
  if (start >= (long)vect.size() || stop >= (long)vect.size() || stop < start) {
    fprintf(stderr, "Invalid set data.  Corrupt file?\n");
    exit(2);
  }
  std::vector<long>::const_iterator iter = vect.begin() + start+1,
                                     end = vect.begin() + stop+1;
  
  for (; iter != end; ++iter)
  {
    std::string tmp = ent_from_handle( dimmap, idmap, *iter );
    if (!tmp.empty()) {
      result += tmp;
      result += " ";
    }
    else
      result += "? ";
  }
  return result;
}
int main ( int  argc,
char *  argv[] 
)

Definition at line 173 of file dump_geom_sets.cxx.

References children, create_map(), ent_from_handle(), ent_list_from_handles(), open_file(), read_data(), and read_scalar_attrib().

{
    // Need a file name to read
  if (argc != 2) {
    printf("Usage: %s <file>\n", argv[0] );
    exit(1);
  }
  
    // Read everything we need from the file
  std::vector<long> set_meta, set_child, set_parent, dim_ents, dim_vals, id_ents, id_vals;
  hid_t file = open_file( argv[1] );
  read_data( file, "/tstt/sets/list", 4, set_meta );
  read_data( file, "/tstt/sets/parents", 1, set_parent );
  read_data( file, "/tstt/sets/children", 1, set_child );
  read_data( file, "/tstt/tags/GEOM_DIMENSION/id_list", 1, dim_ents );
  read_data( file, "/tstt/tags/GEOM_DIMENSION/values", 1, dim_vals );
  read_data( file, "/tstt/tags/GLOBAL_ID/id_list", 1, id_ents );
  read_data( file, "/tstt/tags/GLOBAL_ID/values", 1, id_vals );
  const long startid = read_scalar_attrib( file, "/tstt/sets/list", "start_id" );
  H5Fclose( file );
  
    // Construct handle->dimension and handle->global_id maps.
  std::map<long,long> dimmap, idmap;
  create_map( dim_ents, dim_vals, dimmap, "GEOM_DIMENSION" );
  create_map(  id_ents,  id_vals,  idmap, "GLOBAL_ID" ); 
  
    // For each entity set
  long parent_start = -1l, child_start = -1l;
  printf("handle  ID     Children             Parents\n");
  for (unsigned i = 0; i < set_meta.size(); i += 4)
  {
      // Get name
    long handle = startid + i/4;
    std::string name = ent_from_handle( dimmap, idmap, handle );
    if (name.empty()) // not a geometry set
      continue;
     
      // Get parents and children  
    long  child_end = set_meta[i+1];
    long parent_end = set_meta[i+2];
    std::string children = ent_list_from_handles( dimmap, idmap,  set_child,  child_start,  child_end );
    std::string  parents = ent_list_from_handles( dimmap, idmap, set_parent, parent_start, parent_end );
     child_start =  child_end;
    parent_start = parent_end;
    
      // Print
    printf( "%6ld  %-6s %-20s %-20s\n", handle, name.c_str(), children.c_str(), parents.c_str() );
  }
  
  return 0;
}
hid_t open_file ( const char *  name)

Definition at line 13 of file dump_geom_sets.cxx.

Referenced by main().

{
  hid_t handle = H5Fopen( name, H5F_ACC_RDONLY, H5P_DEFAULT );
  if (handle < 0) {
    fprintf(stderr, "Cannot open file: \"%s\"\n", name );
    exit (1);
  }
  return handle;
}
void read_data ( hid_t  file,
const char *  name,
int  expected_cols,
std::vector< long > &  data 
)

Definition at line 52 of file dump_geom_sets.cxx.

Referenced by main().

{
  hid_t handle = H5Dopen( file, name );
  if (handle < 0) {
    fprintf(stderr, "Invalid file.  Data not found: \"%s\"\n", name );
    exit (1);
  }

  hid_t space = H5Dget_space( handle );
  if (space < 0) {
    fprintf(stderr, "Internal error accessing: \"%s\"\n", name );
    exit (2);
  }
  
  int ndims = H5Sget_simple_extent_ndims( space );
  if (ndims < 0) {
    fprintf(stderr, "Internal error accessing: \"%s\"\n", name );
    exit (2);
  }
  else if (ndims < 1 || ndims > 2) {
    fprintf(stderr, "\"%s\" is an %d-dimension table.  Corrupt file?", name, ndims );
    exit (2);
  }
  
  hsize_t dims[2] = { 0, 1 };
  H5Sget_simple_extent_dims( space, dims, 0 );
  H5Sclose( space );
  
  if (dims[1] != expected_cols) {
    fprintf(stderr, "Error reading \"%s\": expected %d cols, has %d\n", name, expected_cols, (int)dims[1] );
    exit (2);
  }
  
  data.resize( dims[0] * dims[1] );
  herr_t rval = H5Dread( handle, H5T_NATIVE_LONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, &data[0] );
  if (rval < 0) {
    fprintf(stderr, "Error reading data from: \"%s\"\n", name );
    exit (1);
  }
  
  H5Dclose( handle );
}
long read_scalar_attrib ( hid_t  file,
const char *  table,
const char *  attrib 
)

Definition at line 24 of file dump_geom_sets.cxx.

Referenced by main().

{
  hid_t table_id = H5Dopen( file, table );
  if (table_id < 0) {
    fprintf(stderr, "Invalid file.  Data not found: \"%s\"\n", table );
    exit (1);
  }
  
  hid_t attr_id = H5Aopen_name( table_id, attrib );
  H5Dclose( table_id );
  if (attr_id < 0) {
    fprintf(stderr, "Invalid file.  No \"%s\" attrib on \"%s\"\n", attrib, table );
    exit (1);
  }
  
  long value;
  herr_t rval = H5Aread( attr_id, H5T_NATIVE_LONG, &value );
  H5Aclose( attr_id );
  if (rval < 0) {
    fprintf(stderr, "Failed to read \"%s\" attrib on \"%s\"\n", attrib, table );
    exit (2);
  }
  
  return value;
}
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines