Branch data Line data Source code
1 : : //-----------------------------------C++-------------------------------------//
2 : : // File: algs/SCDMesh.hpp
3 : : // Author: Stuart R. Slattery
4 : : // Wednesday February 2 16:15:8 2011
5 : : // Brief: SCDMesh class definition
6 : : //---------------------------------------------------------------------------//
7 : :
8 : : #ifndef MESHKIT_SCDMESH_HPP
9 : : #define MESHKIT_SCDMESH_HPP
10 : :
11 : : #include <vector>
12 : :
13 : : #include "meshkit/Types.hpp"
14 : : #include "meshkit/Error.hpp"
15 : : #include "meshkit/MeshScheme.hpp"
16 : : #include "meshkit/ModelEnt.hpp"
17 : : #include "meshkit/iGeom.hpp"
18 : :
19 : : #include "moab/Core.hpp"
20 : : #include "moab/Range.hpp"
21 : : #include "moab/Interface.hpp"
22 : : #include "moab/ScdInterface.hpp"
23 : : #include "moab/GeomTopoTool.hpp"
24 : :
25 : : namespace MeshKit
26 : : {
27 : :
28 : : //===========================================================================//
29 : : /**
30 : : * \class SCDMesh
31 : : * \brief Generate a structured Cartesian grid over a geometry
32 : : *
33 : : * SCDMesh generates a structured Cartesian grid with either a lightweight
34 : : * representation using ScdInterface in MOAB or a full representation
35 : : * of all the entities.
36 : : */
37 : : //===========================================================================//
38 : :
39 : :
40 : : class SCDMesh : public MeshScheme
41 : : {
42 : : public:
43 : :
44 : : // 2 different interface types
45 : : // full - full element and vertex representation in moab
46 : : // scd - minimal structured mesh represenation using ScdInterface in MOAB
47 : : enum InterfaceSchemeType { full, scd};
48 : :
49 : : // 2 different grid scheme types
50 : : // cfMesh - provide a coarse number of i, j, k cells and a number of fine
51 : : // sub-cells in a given coarse division
52 : : // vtxMesh - provide an exact list of the vertex coordinates to be used
53 : : // in each direction
54 : : enum GridSchemeType { cfMesh, vtxMesh};
55 : :
56 : : // 2 different axis scheme types
57 : : // cartesian - i, j, k directions are parallel to the x, y, z axes
58 : : // oriented - i, j, k directions oriented with the primary geometric axes
59 : : enum AxisSchemeType { cartesian, oriented};
60 : :
61 : : // Set how the geometry volumes will be meshed
62 : : // all - A single structured grid is created for all geometric volumes specified
63 : : // individual - Every geometric volume specified gets its own structured grid
64 : : enum GeomSchemeType { all, individual};
65 : :
66 : : private:
67 : :
68 : : // enum types defining the mesh generation
69 : : InterfaceSchemeType interfaceType;
70 : : GridSchemeType gridType;
71 : : AxisSchemeType axisType;
72 : : GeomSchemeType geomType;
73 : :
74 : : // MOAB ScdInterface instance - generated when InterfaceSchemeType set to scd
75 : : moab::ScdInterface *scdIface;
76 : :
77 : : // number of coarse divisions in each direction
78 : : unsigned int coarse_i;
79 : : unsigned int coarse_j;
80 : : unsigned int coarse_k;
81 : :
82 : : // array of fine divisions in each division
83 : : std::vector<int> fine_i;
84 : : std::vector<int> fine_j;
85 : : std::vector<int> fine_k;
86 : :
87 : : // vertex arrays in each direction
88 : : std::vector<double> i_arr;
89 : : std::vector<double> j_arr;
90 : : std::vector<double> k_arr;
91 : :
92 : : // error codes
93 : : iGeom::Error gerr;
94 : : moab::ErrorCode rval;
95 : :
96 : : // bounding box min, max coordiantes
97 : : double minCoord[3], maxCoord[3];
98 : :
99 : : // number of ijk vertices
100 : : int num_i;
101 : : int num_j;
102 : : int num_k;
103 : : int num_verts;
104 : :
105 : : // box size increasement ratio, default is 0.0
106 : : double boxIncrease;
107 : :
108 : : // vertex coordinates
109 : : std::vector<double> full_coords;
110 : :
111 : : // created vertex and hex ranges
112 : : moab::Range vtx_range;
113 : : moab::Range hex_range;
114 : :
115 : : moab::Tag bb_tag;
116 : :
117 : : bool useMeshGeom;
118 : :
119 : : public:
120 : :
121 : : //! Bare Constructor
122 : : SCDMesh(MKCore *mkcore, const MEntVector &me_vec);
123 : :
124 : : //! Destructor
125 : : virtual ~SCDMesh();
126 : :
127 : : /*!
128 : : * \brief Setup
129 : : */
130 : : virtual void setup_this();
131 : :
132 : : //! Generates the SCD Mesh
133 : : virtual void execute_this();
134 : :
135 : : /**\brief Get class name */
136 : 912 : static const char* name()
137 : 912 : { return "SCDMesh"; }
138 : :
139 : : /**\brief Function returning whether this scheme can mesh entities of
140 : : * the specified dimension.
141 : : * \param dim entity dimension
142 : : */
143 : 160 : static bool can_mesh(iBase_EntityType dim)
144 : 160 : { return iBase_REGION == dim; }
145 : :
146 : : /** \brief Function returning whether this scheme can mesh the specified entity
147 : : *
148 : : * Used by MeshOpFactory to find scheme for an entity.
149 : : * \param ent ModelEnt being queried
150 : : * \return If true, this scheme can mesh the specified ModelEnt
151 : : */
152 : 0 : static bool can_mesh(ModelEnt* ent)
153 : 0 : { return canmesh_region(ent); }
154 : :
155 : : /**\brief Get list of mesh entity types that can be generated.
156 : : * \return array terminated with \c moab::MBMAXTYPE
157 : : */
158 : : static const moab::EntityType* output_types();
159 : :
160 : : /** \brief Return the mesh entity types operated on by this scheme
161 : : * \return array terminated with \c moab::MBMAXTYPE
162 : : */
163 : 0 : virtual const moab::EntityType* mesh_types_arr() const
164 : 0 : { return output_types(); }
165 : :
166 : : /*!
167 : : * \brief Set the interface type to be used
168 : : * \param scheme The type of grid scheme to be used
169 : : */
170 : : void set_interface_scheme(InterfaceSchemeType scheme);
171 : :
172 : : /*!
173 : : * \brief Get the interface type
174 : : * \return Interface scheme type
175 : : */
176 : : InterfaceSchemeType get_interface_scheme() const;
177 : :
178 : : /*!
179 : : * \brief Set the grid generation scheme to be used
180 : : * \param scheme The type of grid scheme to be used
181 : : */
182 : : void set_grid_scheme(GridSchemeType scheme);
183 : :
184 : : /*!
185 : : * \brief Get the grid scheme assigned to the mesh
186 : : * \return Grid scheme type
187 : : */
188 : : GridSchemeType get_grid_scheme() const;
189 : :
190 : : /*!
191 : : * \brief Set the axis type to be used
192 : : * \param scheme The type of axis scheme to use
193 : : */
194 : : void set_axis_scheme(AxisSchemeType scheme);
195 : :
196 : : /*!
197 : : * \brief Get the axis scheme assigned ot the mesh
198 : : * \return Axis scheme type
199 : : */
200 : : AxisSchemeType get_axis_scheme() const;
201 : :
202 : : /*!
203 : : * \brief Set how the geometric volumes will be meshed
204 : : * \param scheme The type of volume meshing scheme to use
205 : : */
206 : : void set_geometry_scheme(GeomSchemeType scheme);
207 : :
208 : : /*!
209 : : * \brief Get the volume meshing scheme assigned ot the mesh
210 : : * \return volume meshing scheme type
211 : : */
212 : : GeomSchemeType get_geometry_scheme() const;
213 : :
214 : : /*!
215 : : * \brief Set the i direction number of coarse grid divisions for the cfmesh case
216 : : * \param coarse_i_ Number of equally sized coarse divisions in the i direction
217 : : */
218 : : void set_coarse_i_grid(int coarse_i_);
219 : :
220 : : /*!
221 : : * \brief Set the j direction number of coarse grid divisions for the cfmesh case
222 : : * \param coarse_j_ Number of equally sized coarse divisions in the j direction
223 : : */
224 : : void set_coarse_j_grid(int coarse_j_);
225 : :
226 : : /*!
227 : : * \brief Set the k direction number of coarse grid divisions for the cfmesh case
228 : : * \param coarse_k_ Number of equally sized coarse divisions in the k direction
229 : : */
230 : : void set_coarse_k_grid(int coarse_k_);
231 : :
232 : : /*!
233 : : * \brief Set the i direction fine grid divisions
234 : : * \param fine_i_ Vector of integers defining the number of equally sized fine divisions in each coarse divisions in the i direction
235 : : */
236 : : void set_fine_i_grid(std::vector<int> fine_i_);
237 : :
238 : : /*!
239 : : * \brief Set the j direction fine grid divisions
240 : : * \param fine_i_ Vector of integers defining the number of equally sized fine divisions in each coarse divisions in the j direction
241 : : */
242 : : void set_fine_j_grid(std::vector<int> fine_j_);
243 : :
244 : : /*!
245 : : * \brief Set the k direction fine grid divisions
246 : : * \param fine_i_ Vector of integers defining the number of equally sized fine divisions in each coarse divisions in the k direction
247 : : */
248 : : void set_fine_k_grid(std::vector<int> fine_k_);
249 : :
250 : : /*!
251 : : * \brief Get the geometry encompasing box dimensions
252 : : */
253 : : void get_box_dimension(double* min, double* max);
254 : :
255 : : /*!
256 : : * \brief Set the geometry encompasing box size increase ratio
257 : : */
258 : : void set_box_increase_ratio(double box_increase = .03);
259 : :
260 : : /*!
261 : : * \brief Set if mesh based geometry is used
262 : : */
263 : : void use_mesh_geometry(bool use);
264 : :
265 : : /*!
266 : : * \brief Set if mesh based geometry is used
267 : : */
268 : : void set_cart_box_min_max(double* min, double* max, double box_increase);
269 : :
270 : :
271 : : private:
272 : :
273 : : //! set the Cartesian bounding box dimensions over the entire geometry
274 : : void set_cart_box_all();
275 : :
276 : : //! set the Cartesian bounding box dimensions over an individual model entity
277 : : void set_cart_box_individual(ModelEnt *this_me);
278 : :
279 : : //! create cartesian bounding box
280 : : void create_cart_edges();
281 : :
282 : : //! create mesh vertex coordinates
283 : : void create_vertex_coords();
284 : :
285 : : //! create full mesh representation
286 : : void create_full_mesh(moab::Range& me_range);
287 : :
288 : : //! create lightweight ScdInterface representation
289 : : void create_light_mesh(moab::Range& me_range);
290 : :
291 : : }; // end class SCDMesh
292 : :
293 : :
294 : : /* Inline Functions */
295 : :
296 : 12 : inline SCDMesh::~SCDMesh()
297 : : {
298 [ - + ]: 8 : }
299 : :
300 : 4 : inline void SCDMesh::set_interface_scheme(SCDMesh::InterfaceSchemeType scheme)
301 : : {
302 : 4 : interfaceType = scheme;
303 : 4 : }
304 : :
305 : : inline SCDMesh::InterfaceSchemeType SCDMesh::get_interface_scheme() const
306 : : {
307 : : return interfaceType;
308 : : }
309 : :
310 : 4 : inline void SCDMesh::set_grid_scheme(SCDMesh::GridSchemeType scheme)
311 : : {
312 : 4 : gridType = scheme;
313 : 4 : }
314 : :
315 : : inline SCDMesh::GridSchemeType SCDMesh::get_grid_scheme() const
316 : : {
317 : : return gridType;
318 : : }
319 : :
320 : 4 : inline void SCDMesh::set_axis_scheme(SCDMesh::AxisSchemeType scheme)
321 : : {
322 : 4 : axisType = scheme;
323 : 4 : }
324 : :
325 : : inline SCDMesh::AxisSchemeType SCDMesh::get_axis_scheme() const
326 : : {
327 : : return axisType;
328 : : }
329 : :
330 : 4 : inline void SCDMesh::set_geometry_scheme(SCDMesh::GeomSchemeType scheme)
331 : : {
332 : 4 : geomType = scheme;
333 : 4 : }
334 : :
335 : : inline SCDMesh::GeomSchemeType SCDMesh::get_geometry_scheme() const
336 : : {
337 : : return geomType;
338 : : }
339 : :
340 : 4 : inline void SCDMesh::set_coarse_i_grid(int coarse_i_)
341 : : {
342 : 4 : coarse_i = coarse_i_;
343 : 4 : }
344 : :
345 : 4 : inline void SCDMesh::set_coarse_j_grid(int coarse_j_)
346 : : {
347 : 4 : coarse_j = coarse_j_;
348 : 4 : }
349 : :
350 : 4 : inline void SCDMesh::set_coarse_k_grid(int coarse_k_)
351 : : {
352 : 4 : coarse_k = coarse_k_;
353 : 4 : }
354 : :
355 : 4 : inline void SCDMesh::set_fine_i_grid(std::vector<int> fine_i_)
356 : : {
357 : 4 : fine_i = fine_i_;
358 : 4 : }
359 : :
360 : 4 : inline void SCDMesh::set_fine_j_grid(std::vector<int> fine_j_)
361 : : {
362 : 4 : fine_j = fine_j_;
363 : 4 : }
364 : :
365 : 4 : inline void SCDMesh::set_fine_k_grid(std::vector<int> fine_k_)
366 : : {
367 : 4 : fine_k = fine_k_;
368 : 4 : }
369 : :
370 : 1 : inline void SCDMesh::get_box_dimension(double* min, double* max)
371 : : {
372 [ + + ]: 4 : for (int i = 0; i < 3; i++) {
373 : 3 : min[i] = minCoord[i];
374 : 3 : max[i] = maxCoord[i];
375 : : }
376 : 1 : }
377 : :
378 : 1 : inline void SCDMesh::set_box_increase_ratio(double box_increase)
379 : : {
380 : 1 : boxIncrease = box_increase;
381 : 1 : }
382 : :
383 : 0 : inline void SCDMesh::use_mesh_geometry(bool use)
384 : : {
385 : 0 : useMeshGeom = use;
386 : 0 : }
387 : :
388 : : } // end namespace MeshKit
389 : :
390 : : #endif // end if __SCDMESH_HPP
391 : :
392 : : //---------------------------------------------------------------------------//
393 : : // end algs/SCDMesh.hpp
394 : : //---------------------------------------------------------------------------//
|