LCOV - code coverage report
Current view: top level - geom - LocalToleranceTool.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 1 73 1.4 %
Date: 2020-06-30 00:58:45 Functions: 2 9 22.2 %
Branches: 2 202 1.0 %

           Branch data     Line data    Source code
       1                 :            : //-------------------------------------------------------------------------
       2                 :            : // Filename      : LocalToleranceTool.cpp
       3                 :            : //
       4                 :            : // Purpose       : The tool used to calculate local tolerance at RefEntities (Vert, Curve, Surface, Volume)
       5                 :            : //
       6                 :            : // Special Notes :
       7                 :            : //
       8                 :            : // Creator       : William Roshan Quadros
       9                 :            : //
      10                 :            : // Creation Date : 11/16/2010
      11                 :            : //
      12                 :            : //-------------------------------------------------------------------------
      13                 :            : 
      14                 :            : #include <string.h>
      15                 :            : #include <assert.h>
      16                 :            : #include <stdlib.h>
      17                 :            : #include <math.h>
      18                 :            : #include <sstream>
      19                 :            : #include <iostream>
      20                 :            : 
      21                 :            : #include "LocalToleranceTool.hpp"
      22                 :            : 
      23                 :            : #include "CubitDefines.h"
      24                 :            : #include "GeometryDefines.h"
      25                 :            : #include "GeometryQueryTool.hpp"
      26                 :            : #include "MergeTool.hpp"
      27                 :            : 
      28                 :            : #include "RefEntityFactory.hpp"
      29                 :            : #include "BodySM.hpp"
      30                 :            : #include "BasicTopologyEntity.hpp"
      31                 :            : 
      32                 :            : #include "RefEntity.hpp"
      33                 :            : #include "RefVertex.hpp"
      34                 :            : #include "RefEdge.hpp"
      35                 :            : #include "RefFace.hpp"
      36                 :            : #include "RefVolume.hpp"
      37                 :            : 
      38                 :            : 
      39                 :            : // Instance of static members
      40                 :            : LocalToleranceTool* LocalToleranceTool::instance_ = 0;
      41                 :            : 
      42                 :            : //===================================================================================
      43                 :            : // Description: constructor
      44                 :            : // Notes:  
      45                 :            : // Author: roshan
      46                 :            : // Date: 11/16/2010
      47                 :            : //===================================================================================
      48                 :          0 : LocalToleranceTool::LocalToleranceTool()
      49                 :            : {
      50                 :            : 
      51                 :          0 : }
      52                 :            : 
      53                 :            : //===================================================================================
      54                 :            : // Description: destructor
      55                 :            : // Notes:  
      56                 :            : // Author: roshan
      57                 :            : // Date: 11/16/2010
      58                 :            : //===================================================================================
      59                 :          0 : LocalToleranceTool::~LocalToleranceTool()
      60                 :            : {
      61                 :            : 
      62                 :          0 : }
      63                 :            : 
      64                 :            : //-------------------------------------------------------------------------
      65                 :            : // Purpose       : Controls access and creation of the sole instance of this
      66                 :            : //                 class.
      67                 :            : //
      68                 :            : // Special Notes :
      69                 :            : //
      70                 :            : // Creator       : William Roshan Quadros
      71                 :            : //
      72                 :            : // Creation Date : 11/16/2010
      73                 :            : //-------------------------------------------------------------------------
      74                 :            : 
      75                 :          0 : LocalToleranceTool* LocalToleranceTool::instance(void)
      76                 :            : {
      77                 :            :    // Check to see if we have created an instance of the class
      78                 :            :    // If not, proceed to create one.
      79                 :            : 
      80                 :            :   //if (LocalToleranceTool::instance_ == 0)
      81                 :            :   // {
      82                 :            :   //   LocalToleranceTool::instance_ = new LocalToleranceTool() ;
      83                 :            : 
      84                 :            :   //    
      85                 :            :   // }
      86                 :            : 
      87                 :            :    // Return the a pointer to the instance of the class.
      88                 :          0 :   return NULL; //LocalToleranceTool::instance_ ;
      89                 :            : }
      90                 :            : 
      91                 :            : //-------------------------------------------------------------------------
      92                 :            : // Purpose       : Deletes instance variable
      93                 :            : //
      94                 :            : // Special Notes :
      95                 :            : //
      96                 :            : // Creator       : William Roshan Quadros
      97                 :            : //
      98                 :            : // Creation Date : 11/16/2010
      99                 :            : //-------------------------------------------------------------------------
     100                 :          0 : void LocalToleranceTool::delete_instance()
     101                 :            : {
     102         [ #  # ]:          0 :   if( NULL != instance_ )
     103                 :            :   {
     104         [ #  # ]:          0 :     delete instance_;
     105                 :          0 :     instance_ = NULL;
     106                 :            :   }
     107                 :          0 : }
     108                 :            : 
     109                 :            : //-------------------------------------------------------------------------
     110                 :            : // Purpose       : calculates the local tolerances at all ref_entities of input bodies
     111                 :            : //
     112                 :            : // Special Notes :
     113                 :            : //
     114                 :            : // Creator       : William Roshan Quadros
     115                 :            : //
     116                 :            : // Creation Date : 11/16/2010
     117                 :            : //-------------------------------------------------------------------------
     118                 :          0 : bool LocalToleranceTool::calculate_local_tolerances( DLIList<BodySM*> body_sm_list )
     119                 :            : {
     120                 :          0 :   bool rv = true;
     121                 :          0 :   const double default_vert_local_tol = 0.001;
     122                 :          0 :   const double default_edge_local_tol = 0.01;
     123                 :          0 :   const double default_face_local_tol = 0.02;
     124                 :          0 :   const double default_vol_local_tol = 0.03;
     125                 :            :   int i;
     126                 :            : 
     127                 :            :   // get all bodies
     128         [ #  # ]:          0 :   DLIList<Body *> bodies;
     129 [ #  # ][ #  # ]:          0 :   RefEntityFactory::instance()->bodies( bodies );
     130                 :            : 
     131                 :            :   // find all ref_vert in the bodies
     132 [ #  # ][ #  # ]:          0 :   DLIList<RefVertex *> ref_verts;
     133 [ #  # ][ #  # ]:          0 :   GeometryQueryTool::instance()->ref_vertices( ref_verts );
     134                 :            : 
     135                 :            :   // for now set default value in all ref_vert
     136                 :            :   RefVertex *ref_vert;
     137 [ #  # ][ #  # ]:          0 :   for( i = 0; i < ref_verts.size(); i++ )
     138                 :            :   {
     139         [ #  # ]:          0 :     ref_vert = ref_verts.get_and_step();
     140         [ #  # ]:          0 :     ref_vert->local_tolerance( default_vert_local_tol );
     141                 :            :   }
     142                 :            : 
     143                 :            :   // find all ref_edge in the bodies
     144 [ #  # ][ #  # ]:          0 :   DLIList<RefEdge *> ref_edges;
     145 [ #  # ][ #  # ]:          0 :   GeometryQueryTool::instance()->ref_edges( ref_edges );
     146                 :            : 
     147                 :            :   // for now set default value in all ref_edges
     148                 :            :   RefEdge *ref_edge;
     149 [ #  # ][ #  # ]:          0 :   for( i = 0; i < ref_edges.size(); i++ )
     150                 :            :   {
     151         [ #  # ]:          0 :     ref_edge = ref_edges.get_and_step();
     152         [ #  # ]:          0 :     ref_edge->local_tolerance( default_edge_local_tol );
     153                 :            :   }
     154                 :            : 
     155                 :            :   // find all ref_face in the bodies
     156 [ #  # ][ #  # ]:          0 :   DLIList<RefFace *> ref_faces;
     157 [ #  # ][ #  # ]:          0 :   GeometryQueryTool::instance()->ref_faces( ref_faces );
     158                 :            : 
     159                 :            :   // for now set default value in all ref_faces
     160                 :            :   RefFace *ref_face;
     161 [ #  # ][ #  # ]:          0 :   for( i = 0; i < ref_faces.size(); i++ )
     162                 :            :   {
     163         [ #  # ]:          0 :     ref_face = ref_faces.get_and_step();
     164         [ #  # ]:          0 :     ref_face->local_tolerance( default_face_local_tol );
     165                 :            :   }
     166                 :            : 
     167                 :            :   // find all ref_vol in the bodies
     168 [ #  # ][ #  # ]:          0 :   DLIList<RefVolume *> ref_vols;
     169 [ #  # ][ #  # ]:          0 :   GeometryQueryTool::instance()->ref_volumes( ref_vols );
     170                 :            : 
     171                 :            :   // for now set default value in all ref_vols
     172                 :            :   RefVolume *ref_vol;
     173 [ #  # ][ #  # ]:          0 :   for( i = 0; i < ref_vols.size(); i++ )
     174                 :            :   {
     175         [ #  # ]:          0 :     ref_vol = ref_vols.get_and_step();
     176         [ #  # ]:          0 :     ref_vol->local_tolerance( default_vol_local_tol );
     177                 :            :   }
     178                 :            :   
     179         [ #  # ]:          0 :   return rv;
     180                 :            : }
     181                 :            : 
     182                 :            : //-------------------------------------------------------------------------
     183                 :            : // Purpose       : calculates the local tolerances automatically at all the ref_entities of input bodies
     184                 :            : //
     185                 :            : // Special Notes :
     186                 :            : //
     187                 :            : // Creator       : William Roshan Quadros
     188                 :            : //
     189                 :            : // Creation Date : 11/16/2010
     190                 :            : //-------------------------------------------------------------------------
     191                 :          0 : bool LocalToleranceTool::calculate_local_tolerances_automatically( DLIList<BodySM*> body_sm_list )
     192                 :            : {
     193                 :          0 :   bool rv = true;
     194                 :            : 
     195                 :            :   // find mergable surfaces
     196         [ #  # ]:          0 :   double geom_factor = GeometryQueryTool::get_geometry_factor();
     197                 :          0 :   double merge_tolerance = geom_factor*GEOMETRY_RESABS;
     198         [ #  # ]:          0 :   DLIList< DLIList<Surface*>*> lists_of_mergeable_surfaces;
     199 [ #  # ][ #  # ]:          0 :   MergeTool::instance()->find_only_mergeable_surfaces ( body_sm_list, lists_of_mergeable_surfaces, merge_tolerance );
     200                 :            : 
     201                 :            : 
     202                 :            :   /* Pseudocode for future use
     203                 :            :   // Map holding overlapping surface pairs
     204                 :            :   overlapping_surfs_map;
     205                 :            :   // Add all surfs to spatial tree
     206                 :            :   SpatialTree.add(all_surfs);
     207                 :            :   // Create array of all surfs sorted by surface area (smallest to largest)
     208                 :            :   all_surf_array.sort();
     209                 :            :   // Loop through progressively larger merge tolerances
     210                 :            :   for(cur_tol=.00001; cur_tol < .1; cur_tol *= 10.0)
     211                 :            :   {
     212                 :            :     // Each time array size may change because surfs have been removed.
     213                 :            :     int num_surfs = all_surf_array.size(), i;
     214                 :            :     for(i=0; i<num_surfs; i++)
     215                 :            :     {
     216                 :            :       cur_surf = all_surf_array[i];
     217                 :            :       // Get surfs that are close to the current surf.
     218                 :            :       close_surfs = SpatialTree.get_close_surfs(cur_surf);
     219                 :            :       // Keep a running total of overlap area so we know when current surf
     220                 :            :       // is overlapping completely with other surfs.
     221                 :            :       double overlap_area = 0.0;
     222                 :            :       int j;
     223                 :            :       // Loop over all of the close surfs and look for overlaps.
     224                 :            :       for(j=close_surfs.size(); j>0; j--)
     225                 :            :       {
     226                 :            :         cur_close_surf = close_surfs.get_and_step();
     227                 :            :         // If there is already a map entry between these two surfs don't check them again.
     228                 :            :         if(!overlapping_surfs_map.entry_exists(cur_surf, cur_close_surf))
     229                 :            :         {
     230                 :            :           // Measure overlap for these two surfs at current tolerance
     231                 :            :           cur_overlap = measure_overlap(cur_surf, cur_close_surf, cur_tol);
     232                 :            :           if(cur_overlap > 0.0)
     233                 :            :           {
     234                 :            :             // add entry for these two surfs (at the current tol)
     235                 :            :             overlapping_surfs_map.add_entry(cur_surf, cur_close_surf, cur_tol);
     236                 :            :             // Update the overlapping area for cur_surf
     237                 :            :             overlap_area += cur_overlap;
     238                 :            :             // If overlapping area for cur_surf is all of cur_surf then we are done processing it.
     239                 :            :             if(overlap_area == cur_surf.surface_area())
     240                 :            :             {
     241                 :            :               // Remove cur_surf from all_surf_array
     242                 :            :               // Remove cur_surf from SpatialTree (if this helps with efficiency)
     243                 :            :               // jump out of processing of cur_surf
     244                 :            :               j=0;
     245                 :            :             }
     246                 :            :           }
     247                 :            :         }
     248                 :            :       }
     249                 :            :     }
     250                 :            :   }
     251                 :            :   */
     252         [ #  # ]:          0 :   return rv;
     253                 :            : }
     254                 :            : 
     255                 :            : //-------------------------------------------------------------------------
     256                 :            : // Purpose       : debugging function to print local tolerances at all ref_entities of the input bodies
     257                 :            : //
     258                 :            : // Special Notes :
     259                 :            : //
     260                 :            : // Creator       : William Roshan Quadros
     261                 :            : //
     262                 :            : // Creation Date : 11/16/2010
     263                 :            : //-------------------------------------------------------------------------
     264                 :          0 : bool LocalToleranceTool::print_local_tolerances( DLIList<BodySM*> body_sm_list )
     265                 :            : {
     266                 :          0 :   bool rv = true;
     267                 :            :   int i;
     268                 :            : 
     269                 :            :   // get all bodies
     270         [ #  # ]:          0 :   DLIList<Body *> bodies;
     271 [ #  # ][ #  # ]:          0 :   RefEntityFactory::instance()->bodies( bodies );
     272                 :            : 
     273                 :            :   // find all ref_vert in the bodies
     274 [ #  # ][ #  # ]:          0 :   DLIList<RefVertex *> ref_verts;
     275 [ #  # ][ #  # ]:          0 :   GeometryQueryTool::instance()->ref_vertices( ref_verts );
     276                 :            : 
     277                 :            :   // for now set default value in all ref_vert
     278                 :            :   RefVertex *ref_vert;
     279 [ #  # ][ #  # ]:          0 :   for( i = 0; i < ref_verts.size(); i++ )
     280                 :            :   {
     281         [ #  # ]:          0 :     ref_vert = ref_verts.get_and_step();
     282 [ #  # ][ #  # ]:          0 :     PRINT_INFO( " vert id %d, local_tol %f \n", ref_vert->id(), ref_vert->local_tolerance() );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     283                 :            :   }
     284                 :            : 
     285                 :            :   // find all ref_edge in the bodies
     286 [ #  # ][ #  # ]:          0 :   DLIList<RefEdge *> ref_edges;
     287 [ #  # ][ #  # ]:          0 :   GeometryQueryTool::instance()->ref_edges( ref_edges );
     288                 :            : 
     289                 :            :   // for now set default value in all ref_edges
     290                 :            :   RefEdge *ref_edge;
     291 [ #  # ][ #  # ]:          0 :   for( i = 0; i < ref_edges.size(); i++ )
     292                 :            :   {
     293         [ #  # ]:          0 :     ref_edge = ref_edges.get_and_step();
     294 [ #  # ][ #  # ]:          0 :     PRINT_INFO( " edge id %d, local_tol %f \n", ref_edge->id(), ref_edge->local_tolerance() );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     295                 :            :   }
     296                 :            : 
     297                 :            :   // find all ref_face in the bodies
     298 [ #  # ][ #  # ]:          0 :   DLIList<RefFace *> ref_faces;
     299 [ #  # ][ #  # ]:          0 :   GeometryQueryTool::instance()->ref_faces( ref_faces );
     300                 :            : 
     301                 :            :   // for now set default value in all ref_faces
     302                 :            :   RefFace *ref_face;
     303 [ #  # ][ #  # ]:          0 :   for( i = 0; i < ref_faces.size(); i++ )
     304                 :            :   {
     305         [ #  # ]:          0 :     ref_face = ref_faces.get_and_step();
     306 [ #  # ][ #  # ]:          0 :     PRINT_INFO( " face id %d, local_tol %f \n", ref_face->id(), ref_face->local_tolerance() );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     307                 :            :   }
     308                 :            : 
     309                 :            :   // find all ref_vol in the bodies
     310 [ #  # ][ #  # ]:          0 :   DLIList<RefVolume *> ref_vols;
     311 [ #  # ][ #  # ]:          0 :   GeometryQueryTool::instance()->ref_volumes( ref_vols );
     312                 :            : 
     313                 :            :   // for now set default value in all ref_vols
     314                 :            :   RefVolume *ref_vol;
     315 [ #  # ][ #  # ]:          0 :   for( i = 0; i < ref_vols.size(); i++ )
     316                 :            :   {
     317         [ #  # ]:          0 :     ref_vol = ref_vols.get_and_step();
     318 [ #  # ][ #  # ]:          0 :     PRINT_INFO( " vol id %d, local_tol %f \n", ref_vol->id(), ref_vol->local_tolerance() );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     319                 :            :   }
     320                 :            :   
     321         [ #  # ]:          0 :   return rv;
     322 [ +  - ][ +  - ]:       6540 : }
     323                 :            : 

Generated by: LCOV version 1.11