Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 /** 00002 * MOAB, a Mesh-Oriented datABase, is a software component for creating, 00003 * storing and accessing finite element mesh data. 00004 * 00005 * Copyright 2004 Sandia Corporation. Under the terms of Contract 00006 * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government 00007 * retains certain rights in this software. 00008 * 00009 * This library is free software; you can redistribute it and/or 00010 * modify it under the terms of the GNU Lesser General Public 00011 * License as published by the Free Software Foundation; either 00012 * version 2.1 of the License, or (at your option) any later version. 00013 * 00014 */ 00015 00016 #ifndef AENTITY_FACTORY_HPP 00017 #define AENTITY_FACTORY_HPP 00018 00019 #ifndef IS_BUILDING_MB 00020 #error "AEntityFactory.hpp isn't supposed to be included into an application" 00021 #endif 00022 00023 #include "moab/Forward.hpp" 00024 #include <vector> 00025 00026 namespace moab 00027 { 00028 00029 typedef std::vector< EntityHandle > AdjacencyVector; 00030 class Core; 00031 00032 //! class AEntityFactory 00033 class AEntityFactory 00034 { 00035 public: 00036 //! require an Interface object in order to access tags on that interface 00037 AEntityFactory( Core* mdb ); 00038 00039 //! destructor 00040 ~AEntityFactory(); 00041 00042 //! add an adjacency from from_ent to to_ent; if both_ways is true, add one 00043 //! in reverse too 00044 //! NOTE: this function is defined even though we may only be implementing 00045 //! vertex-based up-adjacencies 00046 ErrorCode add_adjacency( EntityHandle from_ent, EntityHandle to_ent, const bool both_ways = false ); 00047 00048 //! remove an adjacency from from the base_entity. 00049 ErrorCode remove_adjacency( EntityHandle base_entity, EntityHandle adjacency_to_remove ); 00050 00051 //! remove all adjacencies from from the base_entity. 00052 ErrorCode remove_all_adjacencies( EntityHandle base_entity, const bool delete_adj_list = false ); 00053 00054 /**\brief Get adjacencies for a single source entity. 00055 * 00056 * Get adjacent entities. 00057 * 00058 *\param source_entity The entity for which to retrieve the adjacencies. 00059 *\param target_dimension Retrieve adjacent entities of this dimension. Must 00060 * be in the range [1,3], where 4 is used to indicated entity sets. 00061 *\param target_entities Requested adjacent entities will be appended to this list. 00062 *\param create_if_missing If true, adjacent elements of the specified dimension will 00063 * be created if they do not already exist. If the target dimension 00064 * is less than the dimension of the input entity and greater than zero, 00065 *the elements will be created as required to represent the "sides" of the source element. If 00066 *the target dimension is greater than that of the source entity and less than 3, then sides of 00067 *the specified dimension on that are a) of greater dimension and b) adjacent to the input 00068 *entity will be created. \param create_adjacency_option If create_adjacency_option is >= 0, 00069 *adjacencies from entities of that dimension to each target_entity are created (this function 00070 *uses AEntityFactory::get_element for each element) 00071 */ 00072 ErrorCode get_elements( EntityHandle source_entity, 00073 const unsigned int target_dimension, 00074 std::vector< EntityHandle >& target_entities, 00075 const bool create_if_missing, 00076 const int create_adjacency_option = -1 ); 00077 00078 //! get the vertices for a polyhedron (special implementation because for polyhedra 00079 //! connectivity array stores faces) 00080 ErrorCode get_polyhedron_vertices( const EntityHandle source_entity, std::vector< EntityHandle >& target_entities ); 00081 00082 //! get the meshsets that are in source_entitiy's adjacency vector 00083 ErrorCode get_associated_meshsets( EntityHandle source_entity, std::vector< EntityHandle >& target_entities ); 00084 00085 //! get the element defined by the vertices in vertex_list, of the 00086 //! type target_type, passing back in target_entity; if create_if_missing 00087 //! is true and no entity is found, one is created; if create_adjacency_option 00088 //! is >= 0, adjacencies from entities of that dimension to target_entity 00089 //! are created (only create_adjacency_option=0 is supported right now, 00090 //! so that never creates other ancillary entities); explicitly require 00091 //! the vertex_list_size for consistency, even though we could probably get 00092 //! it from target_type 00093 ErrorCode get_element( const EntityHandle* vertex_list, 00094 const int vertex_list_size, 00095 const EntityType target_type, 00096 EntityHandle& target_entity, 00097 const bool create_if_missing, 00098 const EntityHandle source_entity = 0, 00099 const int create_adjacency_option = -1 ); 00100 00101 /**\brief Get adjacent entities 00102 * 00103 *\param entity The source entity for which to retrieve adjacent entities. 00104 *\param to_dimension The adjacent entities to retrieve, specified by dimension. 00105 *\param create_if_missing Create adjacent entities that do not already exist. 00106 *\param adjacent_entities The resulting adjacent entities are appended to this 00107 * list. 00108 */ 00109 ErrorCode get_adjacencies( const EntityHandle entity, 00110 const unsigned int to_dimension, 00111 bool create_if_missing, 00112 std::vector< EntityHandle >& adjacent_entities ); 00113 00114 //! return const array * for adjacencies 00115 ErrorCode get_adjacencies( EntityHandle entity, const EntityHandle*& adjacent_entities, int& num_entities ) const; 00116 00117 ErrorCode get_adjacencies( EntityHandle entity, 00118 std::vector< EntityHandle >*& adj_vec_ptr_out, 00119 bool create_if_missing = false ); 00120 00121 //! returns the entities in sorted order 00122 ErrorCode get_adjacencies( EntityHandle entity, std::vector< EntityHandle >& adjacent_entities ) const; 00123 00124 //! creates vertex to element adjacency information 00125 ErrorCode create_vert_elem_adjacencies(); 00126 00127 //! returns whether vertex to element adjacencies are being stored 00128 bool vert_elem_adjacencies() const 00129 { 00130 return mVertElemAdj; 00131 } 00132 00133 //! calling code notifying this that an entity is getting deleted 00134 ErrorCode notify_delete_entity( EntityHandle entity ); 00135 00136 //! calling code notifying this that to update connectivity of 'entity' 00137 ErrorCode notify_create_entity( const EntityHandle entity, const EntityHandle* node_array, const int number_nodes ); 00138 00139 //! calling code notifying that an entity changed its connectivity 00140 ErrorCode notify_change_connectivity( EntityHandle entity, 00141 const EntityHandle* old_array, 00142 const EntityHandle* new_array, 00143 int number_nodes ); 00144 00145 //! return true if 2 entities are explicitly adjacent 00146 bool explicitly_adjacent( const EntityHandle ent1, const EntityHandle ent2 ); 00147 00148 //! in preparation for merging two entities, adjust adjacencies so that 00149 //! entity_to_keep will be adjacent to the "right" entities after merge 00150 //! (also checks for potential formation of equivalent entities and 00151 //! creates explicit adjacencies accordingly) 00152 ErrorCode merge_adjust_adjacencies( EntityHandle entity_to_keep, EntityHandle entity_to_remove ); 00153 00154 void get_memory_use( unsigned long long& total_entity_storage, unsigned long long& total_storage ); 00155 ErrorCode get_memory_use( const Range& entities, 00156 unsigned long long& total_entity_storage, 00157 unsigned long long& total_amortized_storage ); 00158 00159 private: 00160 ErrorCode get_adjacency_ptr( EntityHandle, std::vector< EntityHandle >*& ); 00161 ErrorCode get_adjacency_ptr( EntityHandle, const std::vector< EntityHandle >*& ) const; 00162 ErrorCode set_adjacency_ptr( EntityHandle, std::vector< EntityHandle >* ); 00163 00164 ErrorCode get_vertices( EntityHandle h, 00165 const EntityHandle*& vect_out, 00166 int& count_out, 00167 std::vector< EntityHandle >& storage ); 00168 00169 //! private constructor to prevent the construction of a default one 00170 AEntityFactory(); 00171 00172 //! interface associated with this tool 00173 Core* thisMB; 00174 00175 //! whether vertex to element adjacencies are begin done 00176 bool mVertElemAdj; 00177 00178 //! compare vertex_list to the vertices in this_entity, 00179 //! and return true if they contain the same vertices 00180 bool entities_equivalent( const EntityHandle this_entity, 00181 const EntityHandle* vertex_list, 00182 const int vertex_list_size, 00183 const EntityType target_type ); 00184 00185 ErrorCode get_zero_to_n_elements( EntityHandle source_entity, 00186 const unsigned int target_dimension, 00187 std::vector< EntityHandle >& target_entities, 00188 const bool create_if_missing, 00189 const int create_adjacency_option = -1 ); 00190 00191 ErrorCode get_down_adjacency_elements( EntityHandle source_entity, 00192 const unsigned int target_dimension, 00193 std::vector< EntityHandle >& target_entities, 00194 const bool create_if_missing, 00195 const int create_adjacency_option = -1 ); 00196 00197 ErrorCode get_down_adjacency_elements_poly( EntityHandle source_entity, 00198 const unsigned int target_dimension, 00199 std::vector< EntityHandle >& target_entities, 00200 const bool create_if_missing, 00201 const int create_adjacency_option = -1 ); 00202 00203 ErrorCode get_up_adjacency_elements( EntityHandle source_entity, 00204 const unsigned int target_dimension, 00205 std::vector< EntityHandle >& target_entities, 00206 const bool create_if_missing, 00207 const int create_adjacency_option = -1 ); 00208 00209 //! check for equivalent entities that may be formed when merging two entities, and 00210 //! create explicit adjacencies accordingly 00211 ErrorCode check_equiv_entities( EntityHandle entity_to_keep, EntityHandle entity_to_remove ); 00212 00213 //! create explicit adjacencies between this_ent and all adjacent entities of higher 00214 //! dimension 00215 ErrorCode create_explicit_adjs( EntityHandle this_ent ); 00216 }; 00217 00218 } // namespace moab 00219 00220 #endif