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
Core.hpp
Go to the documentation of this file.
1 /** 2  * MOAB, a Mesh-Oriented datABase, is a software component for creating, 3  * storing and accessing finite element mesh data. 4  * 5  * Copyright 2004 Sandia Corporation. Under the terms of Contract 6  * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government 7  * retains certain rights in this software. 8  * 9  * This library is free software; you can redistribute it and/or 10  * modify it under the terms of the GNU Lesser General Public 11  * License as published by the Free Software Foundation; either 12  * version 2.1 of the License, or (at your option) any later version. 13  * 14  */ 15  16 #ifndef MOAB_IMPL_GENERAL_HPP 17 #define MOAB_IMPL_GENERAL_HPP 18  19 #include "moab/Interface.hpp" 20 #include "moab/ReaderIface.hpp" 21 #include <map> 22 #include <list> 23  24 namespace moab 25 { 26  27 class WriteUtil; 28 class ReadUtil; 29 class ScdInterface; 30 class AEntityFactory; 31 class SequenceManager; 32 class Error; 33 class HomCoord; 34 class ReaderWriterSet; 35 class EntitySequence; 36 class FileOptions; 37 class SetIterator; 38  39 #ifdef MOAB_HAVE_AHF 40 class HalfFacetRep; 41 #endif 42  43 /**\class Core 44  * \brief Implementation of MOAB Interface 45  * Implementation of the MOAB Interface class. You shouldn't call functions directly 46  * on an object of type Core (use Interface instead), unless you really have to access 47  * non-API functionality. 48  */ 49 class Core : public Interface 50 { 51  52  public: 53  friend class SetIterator; 54  55  //! constructor 56  Core(); 57  58  //! destructor 59  ~Core(); 60  61  //! Get a pointer to an internal MOAB interface 62  //!\return NULL if not found, iterface pointer otherwise 63  virtual ErrorCode query_interface_type( const std::type_info& interface_type, void*& ptr ); 64  65  //! Release reference to MB interface 66  virtual ErrorCode release_interface_type( const std::type_info& interface_type, void* iface ); 67  68  virtual int QueryInterface( const MBuuid& uuid, UnknownInterface** iface ); 69  70  //! Returns the major.minor version number of the implementation 71  /** 72  \param iface_name If non-NULL, will be filled in with a string, possibly 73  containing implementation-specific information 74  */ 75  virtual float impl_version( std::string* version_string = NULL ); 76  77  //! get the type from a handle, returns type 78  virtual EntityType type_from_handle( const EntityHandle handle ) const; 79  80  //! get the id from a handle, returns id 81  virtual EntityID id_from_handle( const EntityHandle handle ) const; 82  83  //! get a handle from an id and type 84  virtual ErrorCode handle_from_id( const EntityType type, const EntityID id, EntityHandle& handle ) const; 85  86  virtual int dimension_from_handle( const EntityHandle ) const; 87  88  //! load mesh from data in file 89  //! NOTE: if there is mesh already present, the new mesh will be added 90  virtual ErrorCode load_mesh( const char* file_name, 91  const int* active_block_id_list = NULL, 92  const int num_blocks = 0 ); 93  94  /**Load or import a file. */ 95  virtual ErrorCode load_file( const char* file_name, 96  const EntityHandle* file_set = 0, 97  const char* options = 0, 98  const char* set_tag_name = 0, 99  const int* set_tag_vals = 0, 100  int num_set_tag_vals = 0 ); 101  102  /**Load or import a file. */ 103  ErrorCode serial_load_file( const char* file_name, 104  const EntityHandle* file_set, 105  const FileOptions& opts, 106  const ReaderIface::SubsetList* subsets = 0, 107  const Tag* file_id_tag = 0 ); 108  109  ErrorCode serial_read_tag( const char* file_name, 110  const char* tag_name, 111  const FileOptions& opts, 112  std::vector< int >& tag_vals, 113  const ReaderIface::SubsetList* subsets = 0 ); 114  115  virtual ErrorCode write_mesh( const char* file_name, 116  const EntityHandle* output_list = NULL, 117  const int num_sets = 0 ); 118  /** Write or export a file. */ 119  virtual ErrorCode write_file( const char* file_name, 120  const char* file_type = 0, 121  const char* options = 0, 122  const EntityHandle* output_sets = 0, 123  int num_output_sets = 0, 124  const Tag* tag_list = 0, 125  int num_tags = 0 ); 126  127  /** Write or export a file */ 128  virtual ErrorCode write_file( const char* file_name, 129  const char* file_type, 130  const char* options, 131  const Range& output_sets, 132  const Tag* tag_list = 0, 133  int num_tags = 0 ); 134  135  //! deletes all mesh entities from this datastore 136  virtual ErrorCode delete_mesh(); 137  138  //! get overall geometric dimension 139  virtual ErrorCode get_dimension( int& dim ) const; 140  141  //! set overall geometric dimension 142  /** Returns error if setting to 3 dimensions, mesh has been created, and 143  * there are only 2 dimensions on that mesh 144  */ 145  virtual ErrorCode set_dimension( const int dim ); 146  147  //! get blocked vertex coordinates for all vertices 148  /** Blocked = all x, then all y, etc. 149  */ 150  virtual ErrorCode get_vertex_coordinates( std::vector< double >& coords ) const; 151  152  //! get pointers to coordinate data 153  virtual ErrorCode coords_iterate( Range::const_iterator iter, 154  Range::const_iterator end, 155  double*& xcoords_ptr, 156  double*& ycoords_ptr, 157  double*& zcoords_ptr, 158  int& count ); 159  160  //! get the coordinate information for this handle if it is of type Vertex 161  //! otherwise, return an error 162  virtual ErrorCode get_coords( const Range& entities, double* coords ) const; 163  164  virtual ErrorCode get_coords( const EntityHandle* entities, const int num_entities, double* coords ) const; 165  166  virtual ErrorCode get_coords( const EntityHandle entity_handle, 167  const double*& x, 168  const double*& y, 169  const double*& z ) const; 170  171  virtual ErrorCode get_coords( const Range& entities, double* x_coords, double* y_coords, double* z_coords ) const; 172  173  //! set the coordinate information for this handle if it is of type Vertex 174  //! otherwise, return an error 175  virtual ErrorCode set_coords( const EntityHandle* entity_handles, const int num_entities, const double* coords ); 176  177  //! set the coordinate information for this handle if it is of type Vertex 178  //! otherwise, return an error 179  virtual ErrorCode set_coords( Range entity_handles, const double* coords ); 180  181  //! get global connectivity array for specified entity type 182  /** Assumes just vertices, no higher order nodes 183  */ 184  virtual ErrorCode get_connectivity_by_type( const EntityType type, std::vector< EntityHandle >& connect ) const; 185  186  //! get pointer to connectivity data 187  virtual ErrorCode connect_iterate( Range::const_iterator iter, 188  Range::const_iterator end, 189  EntityHandle*& connect, 190  int& verts_per_entity, 191  int& count ); 192  193  //! Gets the connectivity for an element EntityHandle. 194  /** For non-element handles (ie, MeshSets), 195  * returns an error. Connectivity data is copied from the database into the vector 196  * <em>connectivity</em>. The nodes in <em>connectivity</em> are properly ordered. 197  * \param entity_handle EntityHandle to get connectivity of. 198  * \param connectivity Vector in which connectivity of <em>entity_handle</em> is returned. 199  * Should contain MeshVertices. 200  * \param corners_only If true, returns only corner vertices, otherwise returns all of them 201  * (including any higher-order vertices) 202  * 203  * Example: \code 204  * std::vector<EntityHandle> conn; 205  * get_connectivity( entity_handle, conn ); \endcode 206  */ 207  virtual ErrorCode get_connectivity( const EntityHandle* entity_handles, 208  const int num_handles, 209  std::vector< EntityHandle >& connectivity, 210  bool corners_only = false, 211  std::vector< int >* offsets = NULL ) const; 212  213  //! Gets the connectivity for a vector of elements 214  /** Same as vector-based version except range is returned (unordered!) 215  */ 216  virtual ErrorCode get_connectivity( const EntityHandle* entity_handles, 217  const int num_handles, 218  Range& connectivity, 219  bool corners_only = false ) const; 220  221  //! Gets the connectivity for elements 222  /** Same as vector-based version except range is returned (unordered!) 223  */ 224  virtual ErrorCode get_connectivity( const Range& from_entities, 225  Range& adj_entities, 226  bool corners_only = false ) const; 227  228  //! Gets a pointer to constant connectivity data of <em>entity_handle</em> 229  /** Sets <em>number_nodes</em> equal to the number of nodes of the <em> 230  entity_handle </em>. Faster then the other <em>get_connectivity</em> function. 231  The nodes in 'connectivity' are properly ordered. 232  \param entity_handle EntityHandle to get connectivity of. 233  \param connectivity Array in which connectivity of <em>entity_handle</em> is returned. 234  Should contain MBVERTEX's. 235  \param num_nodes Number of MeshVertices in array <em>connectivity</em>. 236  237  Example: \code 238  const EntityHandle* conn; 239  int number_nodes = 0; 240  get_connectivity( entity_handle, conn, number_nodes ); \endcode 241  242  Example2: \code 243  std::vector<EntityHandle> sm_storage; 244  const EntityHandle* conn; 245  int number_nodes; 246  get_connectivity( handle, conn, number_nodes, false, &sm_storage ); 247  if (conn == &sm_storage[0]) 248  std::cout << "Structured mesh element" << std::endl; 249  \endcode 250  */ 251  virtual ErrorCode get_connectivity( const EntityHandle entity_handle, 252  const EntityHandle*& connectivity, 253  int& number_nodes, 254  bool corners_only = false, 255  std::vector< EntityHandle >* storage = 0 ) const; 256  257  //! Sets the connectivity for an EntityHandle. For non-element handles, return an error. 258  /** Connectivity is stored exactly as it is ordered in vector <em>connectivity</em>. 259  \param entity_handle EntityHandle to set connectivity of. 260  \param connect Vector containing new connectivity of <em>entity_handle</em>. 261  \param num_connect Number of vertices in <em>connect</em> 262  263  Example: \code 264  std::vector<EntityHandle> conn(3); 265  conn[0] = node1; 266  conn[1] = node2; 267  conn[2] = node3; 268  set_connectivity( entity_handle, conn, 3 ); \endcode */ 269  virtual ErrorCode set_connectivity( const EntityHandle entity_handle, 270  EntityHandle* connect, 271  const int num_connect ); 272  273  //! get the adjacencies associated with a set of entities 274  /** \param from_entities vector of EntityHandle to get adjacencies of. 275  \param to_dimension Dimension of desired adjacency information. 276  \param adj_entities Vector in which adjacent EntityHandles are returned. 277  \param operation_type enum of INTERSECT or UNION. Defines whether to take 278  the intersection or union of the set of adjacencies recovered for the from_entities. 279  280  The adjacent entities in vector <em>adjacencies</em> are not in any particular 281  order. 282  283  Example: \code 284  // get the set of edges that are adjacent to all entities in the from_entities list 285  std::vector<EntityHandle> from_entities = {hex1, hex2}; 286  std::vector<EntityHandle> adjacencies; 287  get_adjacencies( from_entities, MB_1D_ENTITY, adjacencies ); 288  \endcode */ 289  290  virtual ErrorCode get_adjacencies( const EntityHandle* from_entities, 291  const int num_entities, 292  const int to_dimension, 293  const bool create_if_missing, 294  std::vector< EntityHandle >& adj_entities, 295  const int operation_type = Interface::INTERSECT ); 296  297  virtual ErrorCode get_adjacencies( const EntityHandle* from_entities, 298  const int num_entities, 299  const int to_dimension, 300  const bool create_if_missing, 301  Range& adj_entities, 302  const int operation_type = Interface::INTERSECT ); 303  304  virtual ErrorCode get_adjacencies( const Range& from_entities, 305  const int to_dimension, 306  const bool create_if_missing, 307  Range& adj_entities, 308  const int operation_type = Interface::INTERSECT ); 309  310  /**\brief Get a ptr to adjacency lists 311  * Get a pointer to adjacency lists. These lists are std::vector<EntityHandle>, which are 312  * pointed to by adjs[i]. Adjacencies are not guaranteed to be in order of increasing 313  * dimension. Only a const version of this function is given, because adjacency data is managed 314  * more carefully in MOAB and should be treated as read-only by applications. If adjacencies 315  * have not yet been initialized, adjs_ptr will be NULL (i.e. adjs_ptr == NULL). There may also 316  * be NULL entries for individual entities, i.e. adjs_ptr[i] == NULL. \param iter Iterator to 317  * beginning of entity range desired \param end End iterator for which adjacencies are requested 318  * \param adjs_ptr Pointer to pointer to const std::vector<EntityHandle>; each member of that 319  * array is the vector of adjacencies for this entity \param count Number of entities in the 320  * contiguous chunk starting from *iter 321  */ 322  ErrorCode adjacencies_iterate( Range::const_iterator iter, 323  Range::const_iterator end, 324  const std::vector< EntityHandle >**& adjs_ptr, 325  int& count ); 326  327  /**\brief Get all vertices for input entities 328  * 329  * Special case of get_adjacencies where to_dimension == 0 330  * and operation_type == Interface::UNION. 331  *\Note This is not a variation of get_connectivity because 332  * the behavior is different for polyhedra. 333  */ 334  virtual ErrorCode get_vertices( const Range& from_entities, Range& vertices ); 335  336  //! Adds adjacencies 337  /** \param from_handle entities 338  \param both_ways add the adjacency information to both the 339  to_handle and and the from_from :handle 340  341  Example: \code 342  */ 343  virtual ErrorCode add_adjacencies( const EntityHandle entity_handle, 344  const EntityHandle* adjacencies, 345  const int num_handles, 346  bool both_ways ); 347  348  //! Adds adjacencies; same as vector-based, but with range instead 349  virtual ErrorCode add_adjacencies( const EntityHandle entity_handle, Range& adjacencies, bool both_ways ); 350  351  //! Removes adjacencies 352  /** \param handle EntityHandle to get adjacencies of. 353  354  Example: \code 355  */ 356  virtual ErrorCode remove_adjacencies( const EntityHandle entity_handle, 357  const EntityHandle* adjacencies, 358  const int num_handles ); 359  360  //! Retrieves all entities in the database of given dimension. 361  /** \param dimension Dimension of entities desired. 362  \param entities Range in which entities of dimension <em>dimension</em> are returned. 363  364  Example: \code 365  int dimension = 2; 366  Range entities; 367  get_entities_by_dimension( dimension, entities ); //get 2D EntityHandles in the database 368  \endcode */ 369  virtual ErrorCode get_entities_by_dimension( const EntityHandle meshset, 370  const int dimension, 371  Range& entities, 372  const bool recursive = false ) const; 373  374  virtual ErrorCode get_entities_by_dimension( const EntityHandle meshset, 375  const int dimension, 376  std::vector< EntityHandle >& entities, 377  const bool recursive = false ) const; 378  379  //! Retrieves all entities in the data base of given type. 380  /** \param type EntityType of entities desired (ie, MBHEX, MBEDGE, MBTRI, etc ) 381  \param entities Range in which entities of EntityType <em>type</em> are returned. 382  383  Example: \code 384  EntityType type = MBTET; 385  Range entities; 386  get_entities_by_dimension( type, entities ); //get MBTET type EntityHandles in the database 387  \endcode */ 388  virtual ErrorCode get_entities_by_type( const EntityHandle meshset, 389  const EntityType type, 390  Range& entities, 391  const bool recursive = false ) const; 392  393  //! Retrieves all entities in the data base of given type. 394  /** \param type EntityType of entities desired (ie, MBHEX, MBEDGE, MBTRI, etc ) 395  \param entities Range in which entities of EntityType <em>type</em> are returned. 396  397  Example: \code 398  EntityType type = MBTET; 399  Range entities; 400  get_entities_by_dimension( type, entities ); //get MBTET type EntityHandles in the database 401  \endcode */ 402  virtual ErrorCode get_entities_by_type( const EntityHandle meshset, 403  const EntityType type, 404  std::vector< EntityHandle >& entities, 405  const bool recursive = false ) const; 406  407  virtual ErrorCode get_entities_by_type_and_tag( const EntityHandle meshset, 408  const EntityType type, 409  const Tag* tags, 410  const void* const* values, 411  const int num_tags, 412  Range& entities, 413  const int condition = Interface::INTERSECT, 414  const bool recursive = false ) const; 415  416  //! Retrieves all entities in the data base 417  /** \param entities Range in which entities of EntityType <em>type</em> are returned. 418  419  Example: \code 420  Range entities; 421  get_entities( entities ); //get MBTET type EntityHandles in the database 422  \endcode */ 423  virtual ErrorCode get_entities_by_handle( const EntityHandle meshset, 424  Range& entities, 425  const bool recursive = false ) const; 426  427  //! Retrieves all entities in the data base 428  /** \param entities Range in which entities of EntityType <em>type</em> are returned. 429  430  Example: \code 431  Range entities; 432  get_entities( entities ); //get MBTET type EntityHandles in the database 433  \endcode */ 434  virtual ErrorCode get_entities_by_handle( const EntityHandle meshset, 435  std::vector< EntityHandle >& entities, 436  const bool recursive = false ) const; 437  438  //! Retrieves all entities in the database of given dimension. 439  /** \param dimension Dimension of entities desired. 440  \param entities Range in which entities of dimension <em>dimension</em> are returned. 441  442  Example: \code 443  int dimension = 2; 444  Range entities; 445  get_entities_by_dimension( dimension, entities ); //get 2D EntityHandles in the database 446  \endcode */ 447  virtual ErrorCode get_number_entities_by_dimension( const EntityHandle meshset, 448  const int dimension, 449  int& number, 450  const bool recursive = false ) const; 451  452  //! Retrieves all entities in the data base of given type. 453  /** \param type EntityType of entities desired (ie, MBHEX, MBEDGE, MBTRI, etc ) 454  \param entities Range in which entities of EntityType <em>type</em> are returned. 455  456  Example: \code 457  EntityType type = MBTET; 458  Range entities; 459  get_entities_by_dimension( type, entities ); //get MBTET type EntityHandles in the database 460  \endcode */ 461  virtual ErrorCode get_number_entities_by_type( const EntityHandle meshset, 462  const EntityType type, 463  int& num_entities, 464  const bool recursive = false ) const; 465  466  virtual ErrorCode get_number_entities_by_type_and_tag( const EntityHandle meshset, 467  const EntityType type, 468  const Tag* tag_handles, 469  const void* const* values, 470  const int num_tags, 471  int& num_entities, 472  const int condition = Interface::INTERSECT, 473  const bool recursive = false ) const; 474  475  //! Retrieves all entities in the data base 476  /** \param entities Range in which entities of EntityType <em>type</em> are returned. 477  478  Example: \code 479  Range entities; 480  get_entities( entities ); //get MBTET type EntityHandles in the database 481  \endcode */ 482  virtual ErrorCode get_number_entities_by_handle( const EntityHandle meshset, 483  int& num_entities, 484  const bool recursive = false ) const; 485  486  //! Creates an element based on the type and connectivity. 487  /** If connectivity vector is not correct for EntityType <em>type</em> (ie, a vector with 488  3 vertices is passed in to make an MBQUAD), the function returns MB_FAILURE. 489  \param type Type of element to create. (MBTET, MBTRI, MBKNIFE, etc.) 490  \param connectivity Vector containing connectivity of element to create. 491  \param handle EntityHandle representing the newly created element in the database. 492  493  Example: \code 494  EntityType type = MBQUAD; 495  std::vector<EntityHandle> connectivity(4); 496  quad_conn[0] = vertex0; 497  quad_conn[1] = vertex1; 498  quad_conn[2] = vertex2; 499  quad_conn[3] = vertex3; 500  EntityHandle element_handle; 501  create_element( type, connectivity, element_handle ); \endcode */ 502  virtual ErrorCode create_element( const EntityType type, 503  const EntityHandle* connectivity, 504  const int num_nodes, 505  EntityHandle& element_handle ); 506  507  //! Creates a vertex based on coordinates. 508  /** 509  \param coordinates Array that has 3 doubles in it. 510  \param entity_handle EntityHandle representing the newly created vertex in the database. 511  512  Example: \code 513  double *coordinates = double[3]; 514  coordinates[0] = 1.034; 515  coordinates[1] = 23.23; 516  coordinates[2] = -0.432; 517  EntityHandle entity_handle = 0; 518  create_vertex( coordinates, entity_handle ); \endcode */ 519  virtual ErrorCode create_vertex( const double coords[3], EntityHandle& entity_handle ); 520  521  //! Create a set of vertices with the specified coordinates 522  /** 523  \param coordinates Array that has 3*n doubles in it. 524  \param nverts Number of vertices to create 525  \param entity_handles Range passed back with new vertex handles 526  */ 527  virtual ErrorCode create_vertices( const double* coordinates, const int nverts, Range& entity_handles ); 528  529  //! merges two entities 530  virtual ErrorCode merge_entities( EntityHandle entity_to_keep, 531  EntityHandle entity_to_remove, 532  bool auto_merge, 533  bool delete_removed_entity ); 534  535  //! Removes entities in a vector from the data base. 536  /** If any of the entities are contained in any meshsets, it is removed from those meshsets 537  which were created with MESHSET_TRACK_OWNER option bit set. Tags for <em>entity<\em> are 538  removed as part of this function. 539  \param entities 1d vector of entities to delete 540  \param num_entities Number of entities in 1d vector 541  */ 542  virtual ErrorCode delete_entities( const EntityHandle* entities, const int num_entities ); 543  544  //! Removes entities in a range from the data base. 545  /** If any of the entities are contained in any meshsets, it is removed from those meshsets 546  which were created with MESHSET_TRACK_OWNER option bit set. Tags for <em>entity<\em> are 547  removed as part of this function. 548  \param entities Range of entities to delete 549  */ 550  virtual ErrorCode delete_entities( const Range& range ); 551  552  virtual ErrorCode list_entities( const Range& temp_range ) const; 553  554  virtual ErrorCode list_entities( const EntityHandle* entities, const int num_entities ) const; 555  556  virtual ErrorCode list_entity( const EntityHandle entity ) const; 557  558  typedef unsigned long long type_memstorage; 559  560  //! function object for recieving events from MB of higher order nodes 561  //! added to entities 562  class HONodeAddedRemoved 563  { 564  public: 565  HONodeAddedRemoved() {} 566  virtual ~HONodeAddedRemoved() {} 567  //! node_added called when a node was added to an element's connectivity array 568  //! note: connectivity array of element may be incomplete (corner nodes will exist always) 569  virtual void node_added( EntityHandle node, EntityHandle element ); 570  virtual void node_removed( EntityHandle node ); 571  }; 572  573  virtual ErrorCode convert_entities( const EntityHandle meshset, 574  const bool mid_side, 575  const bool mid_face, 576  const bool mid_volume, 577  Interface::HONodeAddedRemoved* function_object = 0 ); 578  579  //! function to get the side number given two elements; returns 580  //! MB_FAILURE if child not related to parent; does *not* create adjacencies 581  //! between parent and child 582  virtual ErrorCode side_number( const EntityHandle parent, 583  const EntityHandle child, 584  int& sd_number, 585  int& sense, 586  int& offset ) const; 587  588  //! given an entity and the connectivity and type of one of its subfacets, find the 589  //! high order node on that subfacet, if any 590  virtual ErrorCode high_order_node( const EntityHandle parent_handle, 591  const EntityHandle* subfacet_conn, 592  const EntityType subfacet_type, 593  EntityHandle& hon ) const; 594  595  //! given an entity and a target dimension & side number, get that entity 596  virtual ErrorCode side_element( const EntityHandle source_entity, 597  const int dim, 598  const int sd_number, 599  EntityHandle& target_entity ) const; 600  601  //-------------------------Tag Stuff-------------------------------------// 602  603  /**\brief Get a tag handle, possibly creating the tag 604  * 605  * Get a handle used to associate application-defined values 606  * with MOAB entities. If the tag does not already exist then 607  * \c flags should contain exactly one of \c MB_TAG_SPARSE, 608  * \c MB_TAG_DENSE, \c MB_TAG_MESH unless \c type is MB_TYPE_BIT, 609  * which implies \c MB_TAG_BIT storage. 610  * . 611  *\param name The tag name 612  *\param size Tag size as number of values of of data type per entity 613  * (or number of bytes if \c MB_TAG_BYTES is passed in flags). If \c 614  *MB_TAG_VARLEN is specified, this value is taken to be the size of the default value if one is 615  *specified and is otherwise ignored. \param type The type of the data (used for IO) 616  *\param tag_handle Output: the resulting tag handle. 617  *\param flags Bitwise OR of values from \c TagType 618  *\param default_value Optional default value for tag. 619  *\param created Optional returned boolean indicating that the tag 620  * was created. 621  *\return - \c MB_ALREADY_ALLOCATED if tag exists and \c MB_TAG_EXCL is specified, or 622  *default values do not match (and \c MB_TAG_ANY or \c MB_TAG_DFTOK not specified). 623  * - \c MB_TAG_NOT_FOUND if tag does not exist and \c MB_TAG_CREAT is not 624  *specified 625  * - \c MB_INVALID_SIZE if tag value size is not a multiple of the size of the 626  *data type (and \c MB_TAG_ANY not specified). 627  * - \c MB_TYPE_OUT_OF_RANGE invalid or inconsistent parameter 628  * - \c MB_VARIABLE_DATA_LENGTH if \c MB_TAG_VARLEN and \c default_value is non-null and 629  * \c default_value_size is not specified. 630  */ 631  virtual ErrorCode tag_get_handle( const char* name, 632  int size, 633  DataType type, 634  Tag& tag_handle, 635  unsigned flags = 0, 636  const void* default_value = 0, 637  bool* created = 0 ); 638  639  /**\brief same as non-const version, except that TAG_CREAT flag is ignored. */ 640  virtual ErrorCode tag_get_handle( const char* name, 641  int size, 642  DataType type, 643  Tag& tag_handle, 644  unsigned flags = 0, 645  const void* default_value = 0 ) const; 646  647  //! Gets the tag name string of the tag_handle. 648  /** \param tag_handle Tag you want the name of. 649  \param tag_name Name string of <em>tag_handle</em>. 650  651  Example: \code 652  Tag tag_handle = 0; 653  std::string tag_name = "my_special_tag"; 654  tag_get_name( tag_handle, tag_name ); //gets the Tag from the tag's name string 655  \endcode */ 656  virtual ErrorCode tag_get_name( const Tag tag_handle, std::string& tag_name ) const; 657  658  /**\brief Gets the tag handle corresponding to a name 659  * 660  * If a tag of that name does not exist, returns MB_TAG_NOT_FOUND 661  * \param tag_name Name of the desired tag. 662  * \param tag_handle Tag handle corresponding to <em>tag_name</em> 663  */ 664  virtual ErrorCode tag_get_handle( const char* tag_name, Tag& tag_handle ) const; 665  666  //! Get handles for all tags defined on this entity 667  virtual ErrorCode tag_get_tags_on_entity( const EntityHandle entity, std::vector< Tag >& tag_handles ) const; 668  669  //! Get the size of the specified tag in bytes 670  virtual ErrorCode tag_get_bytes( const Tag tag, int& tag_size ) const; 671  672  //! Get the array length of a tag 673  virtual ErrorCode tag_get_length( const Tag tag, int& tag_size ) const; 674  675  //! Get the default value of the specified tag 676  virtual ErrorCode tag_get_default_value( const Tag tag, void* def_val ) const; 677  virtual ErrorCode tag_get_default_value( Tag tag, const void*& ptr, int& size ) const; 678  679  //! get type of tag (sparse, dense, etc.; 0 = dense, 1 = sparse, 2 = bit, 3 = mesh) 680  virtual ErrorCode tag_get_type( const Tag, TagType& tag_type ) const; 681  682  /** \brief Get data type of tag. 683  * 684  * Get the type of the tag data. The tag is data is assumed to 685  * be a vector of this type. If the tag data vetcor contains 686  * more than one value, then the tag size must be a multiple of 687  * the size of this type. 688  * \param tag The tag 689  * \param type The type of the specified tag (output). 690  */ 691  virtual ErrorCode tag_get_data_type( const Tag handle, DataType& type ) const; 692  693  //! get handles for all tags defined 694  virtual ErrorCode tag_get_tags( std::vector< Tag >& tag_handles ) const; 695  696  virtual ErrorCode tag_get_data( const Tag tag_handle, 697  const EntityHandle* entity_handles, 698  const int num_entities, 699  void* tag_data ) const; 700  701  virtual ErrorCode tag_get_data( const Tag tag_handle, const Range& entity_handles, void* tag_data ) const; 702  703  //! Sets the data of a given EntityHandle and Tag. 704  /** If the <em>tag_handle</em> and the entity type of <em>entity_handle</em> are not 705  compatible, data of <em>entity_handle</em> never existed and MB_FAILURE 706  is returned. 707  \param tag_handle Tag indicating what data is to be set. 708  \param entity_handle EntityHandle on which to set tag's data. 709  \param tag_data Data to set the <em>entity_handle</em>'s tag data to. 710  711  Example: \code 712  int tag_data = 1004; 713  tag_set_data( tag_handle, entity_handle, &tag_data ); \endcode */ 714  virtual ErrorCode tag_set_data( Tag tag_handle, 715  const EntityHandle* entity_handles, 716  int num_entities, 717  const void* tag_data ); 718  719  virtual ErrorCode tag_set_data( Tag tag_handle, const Range& entity_handles, const void* tag_data ); 720  721  /**\brief Get pointers to tag data 722  * 723  * For a tag, get the values for a list of passed entity handles. 724  *\note This function may not be used for bit tags. 725  *\param tag_handle The tag 726  *\param entity_handles An array of entity handles for which to retreive tag values. 727  *\param num_entities The length of the 'entity_handles' array. 728  *\param tag_data An array of 'const void*'. Array must be at least 729  * 'num_entitities' long. Array is populated (output) 730  * with pointers to the internal storage for the 731  * tag value corresponding to each entity handle. 732  *\param tag_sizes The length of each tag value. Optional for 733  * fixed-length tags. Required for variable-length tags. 734  */ 735  virtual ErrorCode tag_get_by_ptr( const Tag tag_handle, 736  const EntityHandle* entity_handles, 737  int num_entities, 738  const void** tag_data, 739  int* tag_sizes = 0 ) const; 740  741  /**\brief Get pointers to tag data 742  * 743  * For a tag, get the values for a list of passed entity handles. 744  *\note This function may not be used for bit tags. 745  *\param tag_handle The tag 746  *\param entity_handles The entity handles for which to retreive tag values. 747  *\param tag_data An array of 'const void*'. Array is populated (output) 748  * with pointers to the internal storage for the 749  * tag value corresponding to each entity handle. 750  *\param tag_sizes The length of each tag value. Optional for 751  * fixed-length tags. Required for variable-length tags. 752  */ 753  virtual ErrorCode tag_get_by_ptr( const Tag tag_handle, 754  const Range& entity_handles, 755  const void** tag_data, 756  int* tag_sizes = 0 ) const; 757  758  /**\brief Set tag data given an array of pointers to tag values. 759  * 760  * For a tag, set the values for a list of passed entity handles. 761  *\note This function may not be used for bit tags. 762  *\param tag_handle The tag 763  *\param entity_handles An array of entity handles for which to set tag values. 764  *\param num_entities The length of the 'entity_handles' array. 765  *\param tag_data An array of 'const void*'. Array must be at least 766  * 'num_entitities' long. Array is expected to 767  * contain pointers to tag values for the corresponding 768  * EntityHandle in 'entity_handles'. 769  *\param tag_sizes The length of each tag value. Optional for 770  * fixed-length tags. Required for variable-length tags. 771  */ 772  virtual ErrorCode tag_set_by_ptr( Tag tag_handle, 773  const EntityHandle* entity_handles, 774  int num_entities, 775  void const* const* tag_data, 776  const int* tag_sizes = 0 ); 777  778  /**\brief Set tag data given an array of pointers to tag values. 779  * 780  * For a tag, set the values for a list of passed entity handles. 781  *\note This function may not be used for bit tags. 782  *\param tag_handle The tag 783  *\param entity_handles The entity handles for which to set tag values. 784  *\param tag_data An array of 'const void*'. Array is expected to 785  * contain pointers to tag values for the corresponding 786  * EntityHandle in 'entity_handles'. 787  *\param tag_sizes The length of each tag value. Optional for 788  * fixed-length tags. Required for variable-length tags. 789  */ 790  virtual ErrorCode tag_set_by_ptr( Tag tag_handle, 791  const Range& entity_handles, 792  void const* const* tag_data, 793  const int* tag_sizes = 0 ); 794  795  /**\brief Set tag data given value. 796  * 797  * For a tag, set the values for a list of passed entity handles to 798  * the same, specified value. 799  * 800  *\param tag_handle The tag 801  *\param entity_handles The entity handles for which to set tag values. 802  *\param tag_data A pointer to the tag value. 803  *\param tag_sizes For variable-length tags, the lenght of the 804  * tag value. This argument will be ignored for 805  * fixed-length tags. 806  */ 807  virtual ErrorCode tag_clear_data( Tag tag_handle, 808  const Range& entity_handles, 809  const void* tag_data, 810  int tag_size = 0 ); 811  812  /**\brief Set tag data given value. 813  * 814  * For a tag, set the values for a list of passed entity handles to 815  * the same, specified value. 816  * 817  *\param tag_handle The tag 818  *\param entity_handles The entity handles for which to set tag values. 819  *\param tag_data A pointer to the tag value. 820  *\param tag_sizes For variable-length tags, the lenght of the 821  * tag value. This argument will be ignored for 822  * fixed-length tags. 823  */ 824  virtual ErrorCode tag_clear_data( Tag tag_handle, 825  const EntityHandle* entity_handles, 826  int num_entities, 827  const void* tag_data, 828  int tag_size = 0 ); 829  830  //! Delete the data of a vector of entity handles and sparse tag 831  /** Delete the data of a tag on a vector of entity handles. Only sparse tag data are deleted 832  with this function; dense tags are deleted by deleting the tag itself using tag_delete. 833  \param tag_handle Handle of the (sparse) tag being deleted from entity 834  \param entity_handles 1d vector of entity handles from which the tag is being deleted 835  \param num_handles Number of entity handles in 1d vector 836  */ 837  virtual ErrorCode tag_delete_data( Tag tag_handle, const EntityHandle* entity_handles, int num_entities ); 838  839  //! Delete the data of a range of entity handles and sparse tag 840  /** Delete the data of a tag on a range of entity handles. Only sparse tag data are deleted 841  with this function; dense tags are deleted by deleting the tag itself using tag_delete. 842  \param tag_handle Handle of the (sparse) tag being deleted from entity 843  \param entity_range Range of entities from which the tag is being deleted 844  */ 845  virtual ErrorCode tag_delete_data( Tag tag_handle, const Range& entity_handles ); 846  847  //! Removes the tag from the database and deletes all of its associated data. 848  virtual ErrorCode tag_delete( Tag tag_handle ); 849  850  /**\brief Access tag data via direct pointer into contiguous blocks 851  * 852  * Iteratively obtain direct access to contiguous blocks of tag 853  * storage. This function cannot be used with bit tags because 854  * of the compressed bit storage. This function cannot be used 855  * with variable length tags because it does not provide a mechanism 856  * to determine the length of the value for each entity. This 857  * function may be used with sparse tags, but if it is used, it 858  * will return data for a single entity at a time. 859  * 860  *\param tag_handle The handle of the tag for which to access data 861  *\param iter The first entity for which to return data. 862  *\param end One past the last entity for which data is desired. 863  *\param count The number of entities for which data was returned 864  *\param data_ptr Output: pointer to tag storage. 865  *\param allocate If true, space for this tag will be allocated, if not it wont 866  * 867  *\Note If this function is called for entities for which no tag value 868  * has been set, but for which a default value exists, it will 869  * force the allocation of explicit storage for each such entity 870  * even though MOAB would normally not explicitly store tag values 871  * for such entities. 872  * 873  *\Example: 874  *\code 875  * Range ents; // range to iterate over 876  * Tag tag; // tag for which to access data 877  * int bytes; 878  * ErrorCode err = mb.tag_get_size( tag, bytes ); 879  * if (err) { ... } 880  * 881  * ... 882  * Range::iterator iter = ents.begin(); 883  * while (iter != ents.end()) { 884  * int count; 885  * // get contiguous block of tag dat 886  * void* ptr; 887  * err = mb.tag_iterate( tag, iter, ents.end(), count, ptr ); 888  * if (err) { ... } 889  * // do something with tag data 890  * process_Data( ptr, count ); 891  * // advance to next block of data 892  * iter += count; 893  * } 894  *\endcode 895  */ 896  virtual ErrorCode tag_iterate( Tag tag_handle, 897  Range::const_iterator iter, 898  Range::const_iterator end, 899  int& count, 900  void*& data_ptr, 901  bool allocate = true ); 902  903  //! creates a mesh set 904  virtual ErrorCode create_meshset( const unsigned int options, EntityHandle& ms_handle, int start_id = 0 ); 905  906  //! Empty a vector of mesh set 907  /** Empty a mesh set. 908  \param ms_handles 1d vector of handles of sets being emptied 909  \param num_meshsets Number of entities in 1d vector 910  */ 911  virtual ErrorCode clear_meshset( const EntityHandle* ms_handles, const int num_meshsets ); 912  913  //! Empty a range of mesh set 914  /** Empty a mesh set. 915  \param ms_handles Range of handles of sets being emptied 916  */ 917  virtual ErrorCode clear_meshset( const Range& ms_handles ); 918  919  //! get the options of a mesh set 920  virtual ErrorCode get_meshset_options( const EntityHandle ms_handle, unsigned int& options ) const; 921  922  //! set the options of a mesh set 923  virtual ErrorCode set_meshset_options( const EntityHandle ms_handle, const unsigned int options ); 924  925  //! subtracts meshset2 from meshset1 - modifies meshset1 926  virtual ErrorCode subtract_meshset( EntityHandle meshset1, const EntityHandle meshset2 ); 927  928  //! intersects meshset2 with meshset1 - modifies meshset1 929  virtual ErrorCode intersect_meshset( EntityHandle meshset1, const EntityHandle meshset2 ); 930  931  //! unites meshset2 with meshset1 - modifies meshset1 932  virtual ErrorCode unite_meshset( EntityHandle meshset1, const EntityHandle meshset2 ); 933  934  //! add entities to meshset 935  virtual ErrorCode add_entities( EntityHandle meshset, const Range& entities ); 936  937  //! add entities to meshset 938  virtual ErrorCode add_entities( EntityHandle meshset, const EntityHandle* entities, const int num_entities ); 939  940  //! remove entities from meshset 941  virtual ErrorCode remove_entities( EntityHandle meshset, const Range& entities ); 942  943  //! remove entities from meshset 944  virtual ErrorCode remove_entities( EntityHandle meshset, const EntityHandle* entities, const int num_entities ); 945  946  //! return true if all entities are contained in set 947  virtual bool contains_entities( EntityHandle meshset, 948  const EntityHandle* entities, 949  int num_entities, 950  const int operation_type = Interface::INTERSECT ); 951  952  //! replace entities 953  virtual ErrorCode replace_entities( EntityHandle meshset, 954  const EntityHandle* old_entities, 955  const EntityHandle* new_entities, 956  int num_entities ); 957  958  //------MeshSet Parent/Child functions------ 959  960  //! get parent meshsets 961  virtual ErrorCode get_parent_meshsets( const EntityHandle meshset, 962  std::vector< EntityHandle >& parents, 963  const int num_hops = 1 ) const; 964  965  //! get parent meshsets 966  virtual ErrorCode get_parent_meshsets( const EntityHandle meshset, Range& parents, const int num_hops = 1 ) const; 967  968  //! get child meshsets 969  virtual ErrorCode get_child_meshsets( const EntityHandle meshset, 970  std::vector< EntityHandle >& children, 971  const int num_hops = 1 ) const; 972  973  //! get child meshsets 974  virtual ErrorCode get_child_meshsets( const EntityHandle meshset, Range& children, const int num_hops = 1 ) const; 975  976  //! get contained meshsets 977  virtual ErrorCode get_contained_meshsets( const EntityHandle meshset, 978  std::vector< EntityHandle >& children, 979  const int num_hops = 1 ) const; 980  981  //! get contained meshsets 982  virtual ErrorCode get_contained_meshsets( const EntityHandle meshset, 983  Range& children, 984  const int num_hops = 1 ) const; 985  986  //! gets number of parent meshsets 987  virtual ErrorCode num_parent_meshsets( const EntityHandle meshset, int* number, const int num_hops = 1 ) const; 988  989  //! gets number of child meshsets 990  virtual ErrorCode num_child_meshsets( const EntityHandle meshset, int* number, const int num_hops = 1 ) const; 991  992  //! gets number of contained meshsets 993  virtual ErrorCode num_contained_meshsets( const EntityHandle meshset, int* number, const int num_hops = 1 ) const; 994  995  //! add a parent meshset 996  virtual ErrorCode add_parent_meshset( EntityHandle meshset, const EntityHandle parent_meshset ); 997  998  //! add parent meshsets 999  virtual ErrorCode add_parent_meshsets( EntityHandle meshset, const EntityHandle* parents, int count ); 1000  1001  //! add a child meshset 1002  virtual ErrorCode add_child_meshset( EntityHandle meshset, const EntityHandle child_meshset ); 1003  1004  //! add parent meshsets 1005  virtual ErrorCode add_child_meshsets( EntityHandle meshset, const EntityHandle* children, int count ); 1006  1007  //! adds 'parent' to child's parent list and adds 'child' to parent's child list 1008  virtual ErrorCode add_parent_child( EntityHandle parent, EntityHandle child ); 1009  1010  //! removes 'parent' to child's parent list and removes 'child' to parent's child list 1011  virtual ErrorCode remove_parent_child( EntityHandle parent, EntityHandle child ); 1012  1013  //! remove parent meshset 1014  virtual ErrorCode remove_parent_meshset( EntityHandle meshset, const EntityHandle parent_meshset ); 1015  1016  //! remove child meshset 1017  virtual ErrorCode remove_child_meshset( EntityHandle meshset, const EntityHandle child_meshset ); 1018  1019  // ************************ tag information *************** 1020  1021  //! return various specific tag handles 1022  Tag material_tag(); 1023  Tag neumannBC_tag(); 1024  Tag dirichletBC_tag(); 1025  Tag globalId_tag(); 1026  Tag geom_dimension_tag(); 1027  1028  //! get/set the number of nodes 1029  // int total_num_nodes() const; 1030  // void total_num_nodes(const int val); 1031  1032  //! get/set the number of elements 1033  // int total_num_elements() const; 1034  // void total_num_elements(const int val); 1035  1036  // ************************ structured sequence information *************** 1037  1038  //! return a reference to the sequence manager 1039  SequenceManager* sequence_manager() 1040  { 1041  return sequenceManager; 1042  } 1043  const SequenceManager* sequence_manager() const 1044  { 1045  return sequenceManager; 1046  } 1047  1048  /// create structured sequence 1049  ErrorCode create_scd_sequence( const HomCoord& coord_min, 1050  const HomCoord& coord_max, 1051  EntityType type, 1052  EntityID start_id_hint, 1053  EntityHandle& first_handle_out, 1054  EntitySequence*& sequence_out ); 1055  1056  ErrorCode add_vsequence( EntitySequence* vert_seq, 1057  EntitySequence* elem_seq, 1058  const HomCoord& p1, 1059  const HomCoord& q1, 1060  const HomCoord& p2, 1061  const HomCoord& q2, 1062  const HomCoord& p3, 1063  const HomCoord& q3, 1064  bool bb_input = false, 1065  const HomCoord* bb_min = NULL, 1066  const HomCoord* bb_max = NULL ); 1067  1068  //! return the a_entity_factory pointer 1069  AEntityFactory* a_entity_factory() 1070  { 1071  return aEntityFactory; 1072  } 1073  const AEntityFactory* a_entity_factory() const 1074  { 1075  return aEntityFactory; 1076  } 1077  1078 #ifdef MOAB_HAVE_AHF 1079  HalfFacetRep* a_half_facet_rep() 1080  { 1081  return ahfRep; 1082  } 1083  const HalfFacetRep* a_half_facet_rep() const 1084  { 1085  return ahfRep; 1086  } 1087 #endif 1088  1089  //! return set of registered IO tools 1090  ReaderWriterSet* reader_writer_set() 1091  { 1092  return readerWriterSet; 1093  } 1094  1095  //-----------------MeshSet Interface Functions------------------// 1096  1097  void print( const EntityHandle handle, const char* prefix, bool first_call = true ) const; 1098  1099  ErrorCode print_entity_tags( std::string indent_prefix, const EntityHandle handle, TagType tp ) const; 1100  1101  virtual ErrorCode get_last_error( std::string& info ) const; 1102  1103  virtual std::string get_error_string( const ErrorCode code ) const; 1104  1105  //! check all adjacencies for consistency 1106  ErrorCode check_adjacencies(); 1107  1108  //! check some adjacencies for consistency 1109  ErrorCode check_adjacencies( const EntityHandle* ents, int num_ents ); 1110  1111  //! return whether the input handle is valid or not 1112  bool is_valid( const EntityHandle this_ent ) const; 1113  1114  /** \brief Create an iterator over the set 1115  * Create a new iterator that iterates over entities with the specified type or dimension. 1116  * Only one of ent_type or dim can be set; use dim=-1 or ent_type=MBMAXTYPE for the other. 1117  * Iterators for list-type (ordered) sets are stable over set modification, unless entity 1118  * removed or deleted is the one at the current position of the iterator. If the check_valid 1119  * parameter is passed as true, entities are checked for validity before being passed back by 1120  * get_next_entities function (checking entity validity can have a non-negligible cost). 1121  * 1122  * Iterators returned by this function can be deleted using the normal C++ delete function. 1123  * After creating the iterator through this function, further interactions are through methods 1124  * on the SetIterator class. 1125  * \param meshset The entity set associated with this iterator (use 0 for whole instance) 1126  * \param ent_type Entity type associated with this iterator 1127  * \param ent_dim Dimension associated with this iterator 1128  * \param chunk_size Chunk size of the iterator 1129  * \param check_valid If true, entities are checked for validity before being returned 1130  */ 1131  virtual ErrorCode create_set_iterator( EntityHandle meshset, 1132  EntityType ent_type, 1133  int ent_dim, 1134  int chunk_size, 1135  bool check_valid, 1136  SetIterator*& set_iter ); 1137  1138  /** \brief Remove the set iterator from the instance's list 1139  * \param set_iter Set iterator being removed 1140  */ 1141  ErrorCode remove_set_iterator( SetIterator* set_iter ); 1142  1143  /** \brief Get all set iterators associated with the set passed in 1144  * \param meshset Meshset for which iterators are requested 1145  * \param set_iters Set iterators for the set 1146  */ 1147  ErrorCode get_set_iterators( EntityHandle meshset, std::vector< SetIterator* >& set_iters ); 1148  1149  //-----------------Memory Functions------------------// 1150  1151  /**\brief Calculate amount of memory used to store MOAB data 1152  * 1153  * This function calculates the amount of memory used to store 1154  * MOAB data. 1155  * 1156  * There are two possible values for each catagory of memory use. 1157  * The exact value and the amortized value. The exact value is the 1158  * amount of memory used to store the data for the specified entities. 1159  * The amortized value includes the exact value and an amortized 1160  * estimate of the memory consumed in overhead for storing the values 1161  * (indexing structures, access structures, etc.) 1162  * 1163  * Note: If ent_array is NULL, the total memory used by MOAB for storing 1164  * data will be returned in the address pointed to by 1165  * total_amortized_storage, if total_amortized_storage is not NULL. 1166  * 1167  *\param ent_array Array of entities for which to estimate the memory use. 1168  * If NULL, estimate is done for all entities. 1169  *\param num_ents The length of ent_array. Not used if ent_rray is NULL. 1170  *\param total_(amortized_)storage The sum of the memory entity, adjacency, and all tag storage. 1171  *\param (amortized_)entity_storage The storage for the entity definitions 1172  * (connectivity arrays for elements, coordinates for vertices, 1173  * list storage within sets, etc.) 1174  *\param (amortized_)adjacency_storage The storage for adjacency data. 1175  *\param tag_array An array of tags for which to calculate the memory use. 1176  *\param num_tags The lenght of tag_array 1177  *\param (amortized_)tag_storage If tag_array is not NULL, then one value 1178  * for each tag specifying the memory used for storing that 1179  * tag. If tag_array is NULL and this value is not, the 1180  * location at which to store the total memory used for 1181  * all tags. 1182  */ 1183  void estimated_memory_use( const EntityHandle* ent_array = 0, 1184  unsigned long num_ents = 0, 1185  unsigned long long* total_storage = 0, 1186  unsigned long long* total_amortized_storage = 0, 1187  unsigned long long* entity_storage = 0, 1188  unsigned long long* amortized_entity_storage = 0, 1189  unsigned long long* adjacency_storage = 0, 1190  unsigned long long* amortized_adjacency_storage = 0, 1191  const Tag* tag_array = 0, 1192  unsigned num_tags = 0, 1193  unsigned long long* tag_storage = 0, 1194  unsigned long long* amortized_tag_storage = 0 ); 1195  1196  /**\brief Calculate amount of memory used to store MOAB data 1197  * 1198  * This function calculates the amount of memory used to store 1199  * MOAB data. 1200  * 1201  * There are two possible values for each catagory of memory use. 1202  * The exact value and the amortized value. The exact value is the 1203  * amount of memory used to store the data for the specified entities. 1204  * The amortized value includes the exact value and an amortized 1205  * estimate of the memory consumed in overhead for storing the values 1206  * (indexing structures, access structures, etc.) 1207  * 1208  *\param ents Entities for which to estimate the memory use. 1209  *\param total_(amortized_)storage The sum of the memory entity, adjacency, and all tag storage. 1210  *\param (amortized_)entity_storage The storage for the entity definitions 1211  * (connectivity arrays for elements, coordinates for vertices, 1212  * list storage within sets, etc.) 1213  *\param (amortized_)adjacency_storage The storage for adjacency data. 1214  *\param tag_array An array of tags for which to calculate the memory use. 1215  *\param num_tags The lenght of tag_array 1216  *\param (amortized_)tag_storage If tag_array is not NULL, then one value 1217  * for each tag specifying the memory used for storing that 1218  * tag. If tag_array is NULL and this value is not, the 1219  * location at which to store the total memory used for 1220  * all tags. 1221  */ 1222  void estimated_memory_use( const Range& ents, 1223  unsigned long long* total_storage = 0, 1224  unsigned long long* total_amortized_storage = 0, 1225  unsigned long long* entity_storage = 0, 1226  unsigned long long* amortized_entity_storage = 0, 1227  unsigned long long* adjacency_storage = 0, 1228  unsigned long long* amortized_adjacency_storage = 0, 1229  const Tag* tag_array = 0, 1230  unsigned num_tags = 0, 1231  unsigned long long* tag_storage = 0, 1232  unsigned long long* amortized_tag_storage = 0 ); 1233  1234  void print_database() const; 1235  1236  /** \name Sequence Option controllers */ 1237  1238  /**@{*/ 1239  1240  /** \brief Interface to control memory allocation for sequences 1241  * Provide a factor that controls the size of the sequence that gets allocated. 1242  * This is typically useful in the parallel setting when a-priori, the number of ghost entities 1243  * and the memory required for them within the same sequence as the owned entities are unknown. 1244  * The default factor is 1.0 but this can be appropriately updated at runtime so that we do not 1245  * have broken sequences. 1246  */ 1247  virtual double get_sequence_multiplier() const; 1248  1249  /** \brief Interface to control memory allocation for sequences 1250  * Provide a factor that controls the size of the sequence that gets allocated. 1251  * This is typically useful in the parallel setting when a-priori, the number of ghost entities 1252  * and the memory required for them within the same sequence as the owned entities are unknown. 1253  * The default factor is 1.0 but this can be appropriately updated at runtime so that we do not 1254  * have broken sequences. 1255  * 1256  * \param meshset User specified multiplier (should be greater than 1.0) 1257  */ 1258  virtual void set_sequence_multiplier( double factor ); 1259  1260  /**@}*/ 1261  1262  private: 1263  /**\brief Do not allow copying */ 1264  Core( const Core& copy ); 1265  /**\brief Do not allow copying */ 1266  Core& operator=( const Core& copy ); 1267  1268  void estimated_memory_use_internal( const Range* ents, 1269  unsigned long long* total_storage, 1270  unsigned long long* total_amortized_storage, 1271  unsigned long long* entity_storage, 1272  unsigned long long* amortized_entity_storage, 1273  unsigned long long* adjacency_storage, 1274  unsigned long long* amortized_adjacency_storage, 1275  const Tag* tag_array, 1276  unsigned num_tags, 1277  unsigned long long* tag_storage, 1278  unsigned long long* amortized_tag_storage ); 1279  1280  //! database init and de-init routines 1281  ErrorCode initialize(); 1282  void deinitialize(); 1283  1284  //! return the entity set representing the whole mesh 1285  EntityHandle get_root_set(); 1286  1287  //!\brief Clean up after a file reader returns failure. 1288  //! 1289  //! Delete all entities not contained in initial_entities 1290  //! and all tags not contained in initial_tags. 1291  void clean_up_failed_read( const Range& initial_ents, std::vector< Tag > initial_tags ); 1292  1293  // other interfaces for MB 1294  WriteUtil* mMBWriteUtil; 1295  ReadUtil* mMBReadUtil; 1296  ScdInterface* scdInterface; 1297  1298  //! store the total number of elements defined in this interface 1299  // int totalNumElements; 1300  1301  //! store the total number of nodes defined in this interface 1302  // int totalNumNodes; 1303  1304  //! the overall geometric dimension of this mesh 1305  int geometricDimension; 1306  1307  Tag materialTag; 1308  Tag neumannBCTag; 1309  Tag dirichletBCTag; 1310  Tag geomDimensionTag; 1311  Tag globalIdTag; 1312  1313  //! tag server for this interface 1314  std::list< TagInfo* > tagList; 1315  inline bool valid_tag_handle( const TagInfo* t ) const 1316  { 1317  return std::find( tagList.begin(), tagList.end(), t ) != tagList.end(); 1318  } 1319  1320  SequenceManager* sequenceManager; 1321  1322  AEntityFactory* aEntityFactory; 1323  1324  ReaderWriterSet* readerWriterSet; 1325  1326  Error* mError; 1327  bool mpiFinalize; 1328  int writeMPELog; 1329  bool initErrorHandlerInCore; 1330  1331  //! list of iterators 1332  std::vector< SetIterator* > setIterators; 1333  1334 #ifdef MOAB_HAVE_AHF 1335  HalfFacetRep* ahfRep; 1336  bool mesh_modified; 1337 #endif 1338 }; 1339  1340 } // namespace moab 1341  1342 #endif // MOAB_IMPL_GENERAL_HPP