Branch data Line data Source code
1 : : #ifndef MESHKIT_MERGE_MESH_HPP
2 : : #define MESHKIT_MERGE_MESH_HPP
3 : :
4 : : #include "meshkit/Types.hpp"
5 : : #include "meshkit/Error.hpp"
6 : : #include "meshkit/MeshScheme.hpp"
7 : : #include "meshkit/ModelEnt.hpp"
8 : :
9 : : #include <cassert>
10 : : #include <string.h>
11 : : #include <vector>
12 : : #include <set>
13 : :
14 : : #include "iMesh.h"
15 : :
16 : : #include "meshkit/iMesh.hpp"
17 : : #include "moab/Interface.hpp"
18 : : #include "moab/Range.hpp"
19 : : #include "moab/AdaptiveKDTree.hpp"
20 : :
21 : : namespace MeshKit {
22 : :
23 : : class MKCore;
24 : :
25 : :
26 : : /** \class MergeMesh MergeMesh.hpp "meshkit/MergeMesh.hpp"
27 : : * \brief A simple class for merging meshes
28 : : *
29 : : * INPUT: ModelEnts representing meshes
30 : : * MESH TYPE(S): ALL TYPES
31 : : * OUTPUT: Copied mesh along with the existing mesh
32 : : * DEPENDENCIES: (none)
33 : : * CONSTRAINTS: (none)
34 : : *
35 : : * This class performs the trivial task of merging meshes. There can be
36 : : * multiple instances of this class, and therefore it is pointed to and managed by ....
37 : : *
38 : : * Each instance of this class stores all the ModelEnt's representing the mesh data,
39 : : * and after execution after meshing new entities are created and tag propagation happens.
40 : : */
41 : :
42 : :
43 : : class MergeMesh : public MeshScheme
44 : : {
45 : : public:
46 : : /* \brief Constructor
47 : : *
48 : : * Create a new MergeMesh instance
49 : : * \param impl the iMesh instance handle for the mesh
50 : : */
51 : :
52 : :
53 : : MergeMesh(MKCore *mkcore, const MEntVector &me_vec);
54 : :
55 : : /* \brief Destructor
56 : : */
57 : : virtual ~MergeMesh();
58 : :
59 : :
60 : : /**\brief Get class name */
61 : : static const char* name();
62 : :
63 : : /**\brief Function returning whether this scheme can mesh entities of t
64 : : * the specified dimension.
65 : : *\param dim entity dimension
66 : : */
67 : : static bool can_mesh(iBase_EntityType dim);
68 : :
69 : : /** \brief Function returning whether this scheme can mesh the specified entity
70 : : *
71 : : * Used by MeshOpFactory to find scheme for an entity.
72 : : * \param me ModelEnt being queried
73 : : * \return If true, this scheme can mesh the specified ModelEnt
74 : : */
75 : : static bool can_mesh(ModelEnt *me);
76 : :
77 : : /**\brief Get list of mesh entity types that can be generated.
78 : : *\return array terminated with \c moab::MBMAXTYPE
79 : : */
80 : : static const moab::EntityType* output_types();
81 : :
82 : : /** \brief Return the mesh entity types operated on by this scheme
83 : : * \return array terminated with \c moab::MBMAXTYPE
84 : : */
85 : : virtual const moab::EntityType* mesh_types_arr() const;
86 : :
87 : : /** \brief Re-implemented here so we can check topological dimension of model_ent
88 : : * \param model_ent ModelEnt being added
89 : : */
90 : : virtual bool add_modelent(ModelEnt *model_ent);
91 : :
92 : : //! Setup is a no-op, but must be provided since it's pure virtual
93 : : virtual void setup_this();
94 : :
95 : : //! The only setup/execute function we need, since meshing vertices is trivial
96 : : virtual void execute_this();
97 : :
98 : : /* \brief Return the imesh instance
99 : : */
100 : : iMesh* impl() const {return imeshImpl;}
101 : :
102 : :
103 : :
104 : : /* \brief Merge vertices in elements passed in
105 : : */
106 : : void merge_entities(iBase_EntityHandle *elems,
107 : : int elems_size,
108 : : const double merge_tol,
109 : : const int do_merge = true,
110 : : const int update_sets = false,
111 : : iBase_TagHandle merge_tag = 0);
112 : :
113 : : /* \brief Perform the actual merge between entities
114 : : */
115 : : void perform_merge(iBase_TagHandle merged_to);
116 : : void set_merge_params(double mergeTol = 1e-4, int update_sets = 0,
117 : : int do_merge = 1, iBase_TagHandle mergeTag = NULL);
118 : : private:
119 : :
120 : : iMesh *imeshImpl;
121 : : double mergeTol, mergeTolSq;
122 : : iBase_TagHandle mergeTag;
123 : : int updateSets;
124 : : int doMerge;
125 : :
126 : :
127 : : //- given a kdtree, set tag on vertices in leaf nodes with vertices
128 : : //- to which they should be merged
129 : : moab::ErrorCode find_merged_to(moab::AdaptiveKDTree & tree, moab::EntityHandle &tree_root, moab::Tag merged_to);
130 : :
131 : :
132 : : moab::ErrorCode merge_entities(moab::Range &elems,
133 : : const int do_merge,
134 : : const int update_sets,
135 : : moab::Tag merge_tag);
136 : :
137 : : //- perform the actual merge
138 : : moab::ErrorCode perform_merge(moab::Tag merged_to);
139 : :
140 : : moab::Interface *mbImpl;
141 : :
142 : : //- the tag pointing to the entity to which an entity will be merged
143 : : moab::Tag mbMergeTag;
144 : :
145 : : //- entities which will go away after the merge
146 : : moab::Range deadEnts;
147 : : };
148 : :
149 : 823 : inline const char* MergeMesh::name()
150 : : {
151 : 823 : return "MergeMesh";
152 : : }
153 : :
154 : 160 : inline bool MergeMesh::can_mesh(iBase_EntityType)
155 : : {
156 : 160 : return false;
157 : : }
158 : :
159 : 0 : inline bool MergeMesh::can_mesh(ModelEnt *)
160 : : {
161 : 0 : return true;
162 : : }
163 : :
164 : 0 : inline const moab::EntityType* MergeMesh::mesh_types_arr() const
165 : : {
166 : 0 : return output_types();
167 : : }
168 : :
169 : : } // namespace
170 : :
171 : : #endif
|