Branch data Line data Source code
1 : : #ifndef FBENGINE_HPP_
2 : : #define FBENGINE_HPP_
3 : : #include <stdlib.h>
4 : :
5 : : #include <vector>
6 : : #include <map>
7 : :
8 : : #include "moab/Types.hpp"
9 : : #include "moab/Interface.hpp"
10 : : #include "moab/Range.hpp"
11 : : #include "moab/CartVect.hpp"
12 : :
13 : : namespace moab
14 : : {
15 : : class GeomTopoTool;
16 : :
17 : : // some forward declarations
18 : : class SmoothFace;
19 : : class SmoothCurve;
20 : :
21 : : /*
22 : : * Facet Based engine class for mesh-based geometry
23 : : */
24 : : class FBEngine
25 : : {
26 : : public:
27 : : FBEngine( Interface* impl, GeomTopoTool* geomTopoTool = NULL, const bool smooth = false );
28 : :
29 : : ~FBEngine();
30 : :
31 : : ErrorCode Init();
32 : :
33 : : ErrorCode getRootSet( EntityHandle* root_set );
34 : :
35 : : ErrorCode getNumEntSets( EntityHandle set, int num_hops, int* all_sets );
36 : :
37 : : ErrorCode createEntSet( int isList, EntityHandle* pSet );
38 : :
39 : : ErrorCode addEntSet( EntityHandle entity_set_to_add, EntityHandle entity_set_handle );
40 : :
41 : : ErrorCode getEntities( EntityHandle root_set, int ent_type, Range& gentities );
42 : :
43 : : ErrorCode addEntArrToSet( Range entities, EntityHandle set );
44 : :
45 : : ErrorCode getNumOfType( EntityHandle set, int ent_type, int* pNum );
46 : :
47 : : ErrorCode getEntType( EntityHandle gent, int* type );
48 : :
49 : : ErrorCode getEntBoundBox( EntityHandle this_gent, double* x0, double* y0, double* z0, double* x1, double* y1,
50 : : double* z1 );
51 : : ErrorCode getEntClosestPt( EntityHandle this_gent, double x, double y, double z, double* x1, double* y1,
52 : : double* y3 );
53 : :
54 : : ErrorCode getVtxCoord( EntityHandle this_gent, double* x0, double* y0, double* z0 );
55 : :
56 : : ErrorCode gsubtract( EntityHandle entity_set_1, EntityHandle entity_set_2, EntityHandle result_entity_set );
57 : :
58 : : ErrorCode getEntNrmlXYZ( EntityHandle entity_handle, double x, double y, double z, double* nrml_i, double* nrml_j,
59 : : double* nrml_k );
60 : :
61 : : ErrorCode getPntRayIntsct( double x, double y, double z, double dir_x, double dir_y, double dir_z,
62 : : std::vector< EntityHandle >& intersect_entity_handles,
63 : : /* int storage_order,*/
64 : : std::vector< double >& intersect_coords, std::vector< double >& param_coords );
65 : :
66 : : // some new methods, that are needed
67 : :
68 : : ErrorCode createTag( const char* tag_name, int tag_num_type_values, int tag_type, Tag& tag_handle_out );
69 : :
70 : 5 : Interface* moab_instance()
71 : : {
72 : 5 : return _mbImpl;
73 : : }
74 : :
75 : : ErrorCode getArrData( const moab::EntityHandle* entity_handles, int entity_handles_size, Tag tag_handle,
76 : : void* tag_values_out );
77 : :
78 : : ErrorCode setArrData( const EntityHandle* entity_handles, int entity_handles_size, Tag tag_handle,
79 : : const void* tag_values );
80 : :
81 : : ErrorCode getEntAdj( EntityHandle handle, int type_requested, Range& adjEnts );
82 : :
83 : : ErrorCode getEgFcSense( EntityHandle mbedge, EntityHandle mbface, int& sense );
84 : :
85 : : ErrorCode measure( const EntityHandle* moab_entities, int entities_size, double* measures );
86 : :
87 : : // to do
88 : : ErrorCode getEntNrmlSense( EntityHandle face, EntityHandle region, int& sense );
89 : :
90 : : ErrorCode getEgEvalXYZ( EntityHandle edge, double x, double y, double z, double& on_x, double& on_y, double& on_z,
91 : : double& tngt_i, double& tngt_j, double& tngt_k, double& cvtr_i, double& cvtr_j,
92 : : double& cvtr_k );
93 : : ErrorCode getFcEvalXYZ( EntityHandle face, double x, double y, double z, double& on_x, double& on_y, double& on_z,
94 : : double& nrml_i, double& nrml_j, double& nrml_k, double& cvtr1_i, double& cvtr1_j,
95 : : double& cvtr1_k, double& cvtr2_i, double& cvtr2_j, double& cvtr2_k );
96 : :
97 : : ErrorCode getEgVtxSense( EntityHandle edge, EntityHandle vtx1, EntityHandle vtx2, int& sense );
98 : :
99 : : ErrorCode getEntURange( EntityHandle edge, double& u_min, double& u_max );
100 : :
101 : : ErrorCode getEntUtoXYZ( EntityHandle edge, double u, double& x, double& y, double& z );
102 : :
103 : : ErrorCode getEntTgntU( EntityHandle edge, double u, double& i, double& j, double& k );
104 : :
105 : : ErrorCode isEntAdj( EntityHandle entity1, EntityHandle entity2, bool& adjacent_out );
106 : :
107 : : ErrorCode split_surface_with_direction( EntityHandle face, std::vector< double >& xyz, double* direction,
108 : : int closed, double min_dot, EntityHandle& oNewFace );
109 : : // these new points will be on edges or triangles, if in interior of triangles
110 : : ErrorCode split_surface( EntityHandle face, std::vector< EntityHandle >& chainedEdges,
111 : : std::vector< EntityHandle >& splittingNodes, EntityHandle& newFace );
112 : :
113 : : ErrorCode split_edge_at_point( EntityHandle edge, CartVect& point, EntityHandle& new_edge );
114 : :
115 : : ErrorCode split_edge_at_mesh_node( EntityHandle edge, EntityHandle node, EntityHandle& new_edge );
116 : :
117 : : ErrorCode split_bedge_at_new_mesh_node( EntityHandle b_edge, EntityHandle atNode, EntityHandle brokenEdge,
118 : : EntityHandle& new_edge );
119 : : // helper for cleaning the stuff
120 : : // will be called if the topology is modified
121 : : void clean();
122 : :
123 : : void delete_smooth_tags();
124 : :
125 : : // access to the geom topo tool
126 : : // be careful what you do with it
127 : 19 : GeomTopoTool* get_gtt()
128 : : {
129 : 19 : return this->_my_geomTopoTool;
130 : : }
131 : :
132 : : ErrorCode create_volume_with_direction( EntityHandle newFace1, EntityHandle newFace2, double* direction,
133 : : EntityHandle& volume );
134 : :
135 : : // get nodes from edge in order
136 : : ErrorCode get_nodes_from_edge( EntityHandle gedge, std::vector< EntityHandle >& nodes );
137 : :
138 : : ErrorCode weave_lateral_face_from_edges( EntityHandle bEdge, EntityHandle tEdge, double* direction,
139 : : EntityHandle& newLatFace );
140 : :
141 : : // chain "chain"-able edges
142 : : // this could be useful if there are too many points / edges in the splitting
143 : : // polyline
144 : : // 2 edges are "chain"-able if
145 : : /*
146 : : * 1. they have the same adjacent faces
147 : : * 2. their orientation is such as the end of one is the start of the other
148 : : * 3. at meeting point, their tangents make an angle smaller then something
149 : : * (cos(angle) > cos (max_angle) = min_dot)
150 : : */
151 : : ErrorCode chain_edges( double min_dot );
152 : :
153 : : // 2 edges will be chained, along with modification of the topology
154 : : ErrorCode chain_two_edges( EntityHandle edge, EntityHandle next_edge );
155 : :
156 : : ErrorCode get_vert_edges( EntityHandle edge, EntityHandle& v1, EntityHandle& v2 );
157 : :
158 : 2 : void set_smooth()
159 : : {
160 : 2 : _smooth = true;
161 : 2 : }
162 : :
163 : : private:
164 : : ErrorCode initializeSmoothing();
165 : :
166 : : ErrorCode getAdjacentEntities( const EntityHandle from, const int to_dim, Range& adj_ents );
167 : :
168 : : ErrorCode compute_intersection_points( EntityHandle& face, EntityHandle from, EntityHandle to, CartVect& Dir,
169 : : std::vector< CartVect >& points, std::vector< EntityHandle >& entities,
170 : : std::vector< EntityHandle >& triangles );
171 : :
172 : : ErrorCode BreakTriangle( EntityHandle tri, EntityHandle e1, EntityHandle e3, EntityHandle n1, EntityHandle n2,
173 : : EntityHandle n3 ); // nodesAlongPolyline are on entities!
174 : :
175 : : ErrorCode BreakTriangle2( EntityHandle tri, EntityHandle e1, EntityHandle e2, EntityHandle n1,
176 : : EntityHandle n2 ); // nodesAlongPolyline are on entities!
177 : :
178 : : void print_debug_triangle( EntityHandle triangle );
179 : :
180 : : ErrorCode create_new_gedge( std::vector< EntityHandle >& nodesAlongPolyline, EntityHandle& new_geo_edge );
181 : :
182 : : // used for splitting surfaces
183 : : ErrorCode separate( EntityHandle face, std::vector< EntityHandle >& chainedEdges, Range& first, Range& second );
184 : :
185 : : ErrorCode smooth_new_intx_points( EntityHandle face, std::vector< EntityHandle >& chainedEdges );
186 : :
187 : : // having a node, split boundary along that node
188 : : ErrorCode split_boundary( EntityHandle face, EntityHandle atNode );
189 : :
190 : : // see if the node is already part of a vertex set, do not create another one
191 : : bool find_vertex_set_for_node( EntityHandle iNode, EntityHandle& oVertexSet );
192 : :
193 : : // if the splitting edge is not a loop, the original boundary edges will belong to
194 : : // either original face, or new face
195 : : // only the new geo edge (splitting) will be part of both, with the
196 : : // orientation already decided
197 : : //
198 : : ErrorCode redistribute_boundary_edges_to_faces( EntityHandle face, EntityHandle newFace,
199 : : std::vector< EntityHandle >& chainedEdges );
200 : :
201 : : // used as a way to isolate the faces after splitting
202 : : ErrorCode set_neumann_tags( EntityHandle face, EntityHandle newFace );
203 : :
204 : : // split the quads if needed; it will create a new gtt, which will
205 : : // contain triangles instead of quads
206 : : ErrorCode split_quads();
207 : :
208 : : ErrorCode boundary_nodes_on_face( EntityHandle face, std::vector< EntityHandle >& boundary_nodes );
209 : :
210 : : ErrorCode boundary_mesh_edges_on_face( EntityHandle face, Range& boundary_mesh_edges );
211 : :
212 : : // used for splitting an edge
213 : : ErrorCode split_internal_edge( EntityHandle& edge, EntityHandle& newVertex );
214 : : // triangle split
215 : : ErrorCode divide_triangle( EntityHandle triangle, EntityHandle& newVertex );
216 : : Interface* _mbImpl;
217 : :
218 : : // this will be used during volume creation
219 : : ErrorCode set_default_neumann_tags();
220 : :
221 : : ErrorCode chain_able_edge( EntityHandle edge, double min_dot, EntityHandle& next_edge, bool& chainable );
222 : :
223 : : GeomTopoTool* _my_geomTopoTool;
224 : : bool _t_created;
225 : : bool _smooth;
226 : : bool _initialized;
227 : : // these are initial ranges, that should not change during geometry gimmicks
228 : : // those that are added are changing gtt ranges, but they are not yet "smoothed"
229 : : // when new geometry is created, these ranges are not yet updated
230 : : Range _my_gsets[5];
231 : : // these are used only for smooth evaluations
232 : : // these smooth faces and edges will be initialized after reading the file
233 : : // the maps keep the link between EH in moab (geom sets) and
234 : : // their corresponding smooth counterparts
235 : : std::map< EntityHandle, SmoothFace* > _faces;
236 : : std::map< EntityHandle, SmoothCurve* > _edges;
237 : : SmoothFace** _smthFace;
238 : : SmoothCurve** _smthCurve;
239 : :
240 : : Range _piercedTriangles; // triangles to delete
241 : : Range _newTriangles;
242 : : Range _piercedEdges; // edges to delete
243 : : std::map< EntityHandle, EntityHandle > _brokenEdges; // this is a map between splitting nodes and edges that
244 : : // are broken on the boundary, by the polyline; the edges will be deleted in the end
245 : : // new edges?
246 : : };
247 : :
248 : : } // namespace moab
249 : : #endif /* FBENGINE_HPP_ */
|