LCOV - code coverage report
Current view: top level - src/moab - FBEngine.hpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 7 7 100.0 %
Date: 2020-12-16 07:07:30 Functions: 3 3 100.0 %
Branches: 0 0 -

           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_ */

Generated by: LCOV version 1.11