Branch data Line data Source code
1 : : //-----------------------------------C++-------------------------------------//
2 : : // File: src/algs/OneToOneSwept.hpp
3 : : // Wednesday February 11 10:50 2011
4 : : // Brief: OneToOneSwept class definition: generate the all-hexahedral mesh by
5 : : // general sweeping
6 : : //---------------------------------------------------------------------------//
7 : :
8 : :
9 : : #ifndef MESHKIT_ONETOONESWEPT_HPP
10 : : #define MESHKIT_ONETOONESWEPT_HPP
11 : :
12 : : #include <stdlib.h>
13 : : #include <stdio.h>
14 : : #include <assert.h>
15 : : #include <string>
16 : : #include <iostream>
17 : : #include <fstream>
18 : : #include <string.h>
19 : : #include <limits.h>
20 : : #include <math.h>
21 : :
22 : : #include "Global.hpp"
23 : : #include "meshkit/MKCore.hpp"
24 : : #include "meshkit/ModelEnt.hpp"
25 : : #include "meshkit/SizingFunction.hpp"
26 : :
27 : : #include <iMesh.h>
28 : : #include <iGeom.h>
29 : : #include <iRel.h>
30 : : #include <vector>
31 : : #include <set>
32 : : #include <list>
33 : :
34 : : #include "meshkit/MeshScheme.hpp"
35 : :
36 : : using namespace std;
37 : :
38 : : namespace MeshKit {
39 : : //===========================================================================//
40 : : /*!
41 : : * \class OneToOneSwept
42 : : * \brief Generate the all-hexahedral mesh by sweeping
43 : : *
44 : : * OneToOneSwept generates the all-hexahedral mesh by sweeping the source mesh
45 : : * to the target surface
46 : : */
47 : : //===========================================================================//
48 : :
49 : : class OneToOneSwept: public MeshScheme {
50 : : public:
51 : :
52 : : OneToOneSwept(MKCore *mk_core, const MEntVector &me_vec);
53 : : ~OneToOneSwept();
54 : :
55 : : virtual void setup_this();
56 : : virtual void execute_this();
57 : :
58 : : /**\brief Get class name */
59 : 1005 : static const char* name()
60 : : {
61 : 1005 : return "OneToOneSwept";
62 : : }
63 : :
64 : : /**\brief Function returning whether this scheme can mesh entities of t
65 : : * the specified dimension.
66 : : *\param dim entity dimension
67 : : */
68 : 160 : static bool can_mesh(iBase_EntityType dim)
69 : : {
70 : 160 : return iBase_REGION == dim;
71 : : }
72 : :
73 : : /** \brief Function returning whether this scheme can mesh the specified entity
74 : : *
75 : : * Used by MeshOpFactory to find scheme for an entity.
76 : : * \param me ModelEnt being queried
77 : : * \return If true, this scheme can mesh the specified ModelEnt
78 : : */
79 : 0 : static bool can_mesh(ModelEnt *me)
80 : : {
81 : 0 : return canmesh_region(me);
82 : : }
83 : :
84 : : /**\brief Get list of mesh entity types that can be generated.
85 : : *\return array terminated with \c moab::MBMAXTYPE
86 : : */
87 : : static const moab::EntityType* output_types();
88 : :
89 : : /** \brief Return the mesh entity types operated on by this scheme
90 : : * \return array terminated with \c moab::MBMAXTYPE
91 : : */
92 : 0 : virtual const moab::EntityType* mesh_types_arr() const
93 : : {
94 : 0 : return output_types();
95 : : }
96 : :
97 : : //specify the source surface for OneToOneSwept class
98 : : void SetSourceSurface(int index);
99 : :
100 : : //specify the target surface for OneToOneSwept class
101 : : void SetTargetSurface(int index);
102 : :
103 : : private:
104 : : #ifdef HAVE_ARMADILLO
105 : : void SurfMeshHarmonic(iBase_EntityHandle vol, vector<iBase_EntityHandle> &newNodehandle);
106 : : #endif
107 : : //determine whether the source surface is concave or multi-connected
108 : : bool isConcave();
109 : :
110 : : void BuildLateralBoundaryLayers(ModelEnt * me, std::vector<moab::EntityHandle> & layers);
111 : :
112 : : moab::ErrorCode NodeAbove(moab::EntityHandle node1, moab::EntityHandle node2, moab::Range & quadsOnLateralSurfaces,
113 : : moab::EntityHandle & node3, moab::EntityHandle & node4);
114 : :
115 : : moab::ErrorCode FourthNodeInQuad(moab::EntityHandle node1, moab::EntityHandle node2, moab::EntityHandle node3,
116 : : moab::Range & quadsOnLateralSurfaces, moab::EntityHandle & node4);
117 : :
118 : : //function for all-quad meshing on the target surface
119 : : int TargetSurfProjection(std::vector<moab::EntityHandle> & boundLayers);
120 : :
121 : : // to compute node positions in the interior of volume, numLayers-1 times
122 : : // use similar code to TargetSurfProjection, but do not project on surface...
123 : : int ProjectInteriorLayers(std::vector<moab::EntityHandle> & boundLayers, vector<vector<Vertex> > &linkVertexList);
124 : :
125 : : //create the hexahedral elements between the source surface and target surface
126 : : int CreateElements(vector<vector<Vertex> > &linkVertexList);
127 : :
128 : : // input: list of nodes on source, boundary center, list of nodes on target, target center
129 : : // output: 3x3 matrix A such that
130 : : // target= A * ( source - 2*sc + tc) + sc
131 : : void computeTransformationFromSourceToTarget(std::vector<Vector3D> & sNodes, Vector3D & sc,
132 : : std::vector<Vector3D> & tNodes, Vector3D & tc, Matrix3D & transMatrix);
133 : :
134 : : #ifdef HAVE_MESQUITE
135 : : //target surface mesh by Mesquite
136 : : void SurfMeshOptimization();
137 : : #endif
138 : :
139 : : private:
140 : : //private member variable
141 : : iBase_EntityHandle sourceSurface;
142 : : iBase_EntityHandle targetSurface;
143 : : iBase_EntityHandle volume;
144 : : moab::Interface *mb;
145 : : int numLayers;
146 : : int numLoops;
147 : : int sizeBLayer;
148 : : iGeom * igeom_inst;
149 : : int index_src, index_tar;
150 : : iBase_TagHandle geom_id_tag;
151 : :
152 : : std::vector<Vertex> NodeList; //mesh nodes on the source surface
153 : : std::vector<Vertex> TVertexList; //mesh nodes on the target surface
154 : :
155 : : std::vector<Face> FaceList;
156 : : iBase_EntitySetHandle volumeSet;
157 : :
158 : : std::set<moab::EntityHandle> markedMoabEnts;
159 : : };
160 : :
161 : : }
162 : :
163 : : #endif
164 : :
|