Branch data Line data Source code
1 : : #ifndef MESHKIT_PostBL_HPP
2 : : #define MESHKIT_PostBL_HPP
3 : :
4 : : #include <cassert>
5 : : #include <string>
6 : : #include <vector>
7 : : #include <set>
8 : : #include <math.h>
9 : : #include <iomanip>
10 : :
11 : : #include "meshkit/Types.hpp"
12 : : #include "meshkit/Error.hpp"
13 : : #include "meshkit/MeshScheme.hpp"
14 : : #include "meshkit/ModelEnt.hpp"
15 : : #include "meshkit/MKCore.hpp"
16 : : #include "meshkit/SizingFunction.hpp"
17 : : #include "meshkit/RegisterMeshOp.hpp"
18 : :
19 : : #include "meshkit/LocalSet.hpp"
20 : : #include "meshkit/LocalTag.hpp"
21 : : #include "meshkit/Matrix.hpp"
22 : :
23 : : #include "meshkit/iMesh.hpp"
24 : : #include "meshkit/iGeom.hpp"
25 : : #include "MBCN.h"
26 : :
27 : : #include "meshkit/SimpleArray.hpp"
28 : : #include "meshkit/parser.hpp"
29 : : #include "meshkit/clock.hpp"
30 : : #include "meshkit/mstream.hpp"
31 : :
32 : : #include "MBiMesh.hpp"
33 : : #include "moab/Interface.hpp"
34 : : #include "moab/Range.hpp"
35 : : #include "moab/CartVect.hpp"
36 : :
37 : :
38 : : #include "moab/Skinner.hpp"
39 : : #include "moab/AdaptiveKDTree.hpp"
40 : : #include "moab/Matrix3.hpp"
41 : : #include "moab/verdict/VerdictWrapper.hpp"
42 : : #include "moab/ReadUtilIface.hpp"
43 : :
44 : :
45 : : /*!
46 : : * \class PostBL
47 : : * \brief Options and Keywords Used in PostBL Algorithm
48 : : *
49 : : * RUNNING: Postmesh Boundary Layer Tool can be run using the test_postbl executable in test/algs directory
50 : : example:- test_postbl <name>.inp, where, <name> is the name of the input file containing the keywords below:
51 : : - bias \verbatim <double> bias b/w different layers of boundary layer is always greater than zero. \endverbatim
52 : : - meshfile \verbatim <string> input mesh file name support by moab reader. \endverbatim
53 : : - surfaces \verbatim <integer> id of the surface on which boundary layer needs to be created. \endverbatim
54 : : - neumannset \verbatim <integer> id of the neumann set on which boundary layer needs to be created. \endverbatim
55 : : - material \verbatim <integer> material id to which the newly created hexes will be assigned, default is 999999. \endverbatim
56 : : - thickness \verbatim <double> boundary layer thickness. \endverbatim
57 : : - debug \verbatim <1 or 0> print all the debug o/p if set to 1. A .log file is always created. \endverbatim
58 : : - outfile \verbatim <string> name of output mesh file, can be any format that is supported by moab. \endverbatim
59 : : - end \verbatim this marks the end of input file for boundary layer generation. \endverbatim
60 : : - Sample keyword file can be found here: data/test_postbl.inp
61 : : */
62 : :
63 : : namespace MeshKit {
64 : :
65 : : #define DEFAULT_TEST_POSTBL "test_postbl.inp"
66 : :
67 : : class MKCore;
68 : :
69 : : class PostBL : public MeshScheme
70 : : {
71 : : public:
72 : : /* \brief Constructor
73 : : *
74 : : * Create a new PostBL instance
75 : : * \param impl the iGeom instance handle for the Geom
76 : : */
77 : : PostBL(MKCore *mk, const MEntVector &me_vec);
78 : :
79 : : /* \brief Destructor
80 : : */
81 : : virtual ~PostBL();
82 : :
83 : : /**\brief Get class name */
84 : : static const char* name();
85 : :
86 : : /**\brief Function returning whether this scheme can mesh entities of t
87 : : * the specified dimension.
88 : : *\param dim entity dimension
89 : : */
90 : : static bool can_mesh(iBase_EntityType dim);
91 : :
92 : : /** \brief Function returning whether this scheme can mesh the specified entity
93 : : *
94 : : * Used by MeshOpFactory to find scheme for an entity.
95 : : * \param me ModelEnt being queried
96 : : * \return If true, this scheme can mesh the specified ModelEnt
97 : : */
98 : : static bool can_mesh(ModelEnt *me);
99 : :
100 : : /**\brief Get list of mesh entity types that can be generated.
101 : : *\return array terminated with \c moab::MBMAXTYPE
102 : : */
103 : : static const moab::EntityType* output_types();
104 : :
105 : : /** \brief Return the mesh entity types operated on by this scheme
106 : : * \return array terminated with \c moab::MBMAXTYPE
107 : : */
108 : : virtual const moab::EntityType* mesh_types_arr() const;
109 : :
110 : : /** \brief Re-implemented here so we can check topological dimension of model_ent
111 : : * \param model_ent ModelEnt being added
112 : : */
113 : : virtual bool add_modelent(ModelEnt *model_ent);
114 : :
115 : : //! Setup is a no-op, but must be provided since it's pure virtual
116 : : virtual void setup_this();
117 : :
118 : : //! execute PostBL graph node
119 : : virtual void execute_this();
120 : :
121 : :
122 : : /** \brief Improved algorithm
123 : : */
124 : : void Algo2 ();
125 : :
126 : : /** \brief Prepare input/output files for reading/writing
127 : : * command line args and testdir for default test case
128 : : * \param TestDir directory where test will be located and command line arguments.
129 : : */
130 : : void PrepareIO (int argc, char *argv[], std::string TestDir);
131 : :
132 : : /** \brief get the normals given connectivity of a quad
133 : : * \param conn connectivity array type EntityHandle
134 : : * \param v return normal vector
135 : : */
136 : : void get_normal_quad (std::vector<moab::EntityHandle>conn, moab::CartVect &v) ;
137 : :
138 : : /** \brief get the normals given connectivity of a quad
139 : : * \param conn connectivity array type moab::EntityHandle
140 : : * \param v return normal vector
141 : : */
142 : : void get_normal_edge (std::vector<moab::EntityHandle>conn, moab::CartVect AB, moab::CartVect &v);
143 : :
144 : : /** \brief compute determinant of jacobian of a hex element
145 : : * \param conn connectivity array
146 : : * \param offset passed when conn array has connectivity of more than one element
147 : : * \param detJ is returned
148 : : */
149 : : void get_det_jacobian (std::vector<moab::EntityHandle> conn, int offset, double &detJ);
150 : :
151 : : /** \brief compute edge length from the vertex specified
152 : : * \param vector of quads/edges
153 : : * \param vertex specified
154 : : * \param o/p edge length
155 : : */
156 : : void find_min_edge_length (moab::Range, moab::EntityHandle, moab::Range, double &e_len);
157 : :
158 : : /** \brief push the bulk mesh after creating the normals
159 : : */
160 : : int push_bulk_mesh(VerdictWrapper vw);
161 : :
162 : : /** \brief compute the normal for each node of the boundary layer specified
163 : : */
164 : : int compute_normals();
165 : :
166 : : /** \brief create boundary layer elements after pushing the bulk mesh
167 : : */
168 : : int create_bl_elements(VerdictWrapper vw);
169 : :
170 : : private:
171 : : //! iGeom Impl for calling geometry creation/manipulation operations
172 : : iGeom *igeom;
173 : :
174 : : //! iMesh Impl for calling mesh creation/manipulation operations
175 : : iMesh *imesh;
176 : :
177 : : //! MOAB Impl for calling mesh creation/manipulation operations
178 : : moab::Interface *mb;
179 : : moab::Tag GDTag, GIDTag, NTag, MTag, STag, FTag, MNTag, MatIDTag, BLNodeIDTag;
180 : : std::vector<moab::EntityHandle> old_hex, new_vert, conn, qconn, tri_conn, tet_conn;
181 : : std::vector<moab::EntityHandle> adj_qconn,
182 : : old_hex_conn, adj_hex_nodes1;
183 : : moab::CartVect surf_normal;
184 : : moab::Range quads, nodes,edges, fixmat_ents;
185 : : double coords_new_quad[3];
186 : : double coords_old_quad[3];
187 : : moab::EntityHandle hex, hex1, hex2;
188 : : moab::Range::iterator mset_it, set_it;
189 : : moab::EntityHandle mthis_set, geom_set;
190 : : moab::Range sets, n_sets, m_sets;
191 : :
192 : :
193 : : // ! parser related
194 : : bool debug, hybrid, check_bl_edge_length;
195 : : // !! file Input
196 : : std::ifstream m_FileInput;
197 : : mstream m_LogFile;
198 : : std::string szInputString;
199 : : std::string szComment;
200 : : int MAXCHARS, m_nLineNumber;
201 : : // all_bl is the vector storing the number of materials a particular boundary layer node is attached to
202 : : std::vector<int> blmaterial_id, all_bl;
203 : :
204 : : // ! variables to parse
205 : : std::string m_InputFile, m_MeshFile, m_OutFile, m_LogName, m_MeshType;
206 : : int m_SurfId, m_NeumannSet, m_Material, m_HConn, hex27;
207 : : double m_Thickness, m_MinEdgeLength;
208 : : int m_Intervals, m_JacCalls, tri_sch, fixmat;
209 : : double m_Bias, m_JLo, m_JHi;
210 : : // ! variable for hex and tet meshes
211 : : int m_Conn, m_BElemNodes;
212 : : int m_GD, m_BLDim;
213 : : std::string m_Card;
214 : : int err;
215 : :
216 : : // ! error handlers
217 : : enum ErrorStates { INVALIDINPUT};
218 : : void IOErrorHandler (ErrorStates) const;
219 : : };
220 : :
221 : 502 : inline const char* PostBL::name()
222 : : {
223 : 502 : return "PostBL";
224 : : }
225 : :
226 : 160 : inline bool PostBL::can_mesh(iBase_EntityType)
227 : : {
228 : 160 : return false;
229 : : }
230 : :
231 : 0 : inline bool PostBL::can_mesh(ModelEnt *)
232 : : {
233 : 0 : return true;
234 : : }
235 : :
236 : 0 : inline const moab::EntityType* PostBL::mesh_types_arr() const
237 : : {
238 : 0 : return output_types();
239 : : }
240 : :
241 : : } // namespace MeshKit
242 : : #endif
|