LCOV - code coverage report
Current view: top level - geom - RefFace.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 220 613 35.9 %
Date: 2020-06-30 00:58:45 Functions: 28 76 36.8 %
Branches: 291 1438 20.2 %

           Branch data     Line data    Source code
       1                 :            : //-------------------------------------------------------------------------
       2                 :            : // Filename      : RefFace.cpp
       3                 :            : //
       4                 :            : // Purpose       : This file contains the implementation of the class 
       5                 :            : //                 RefFace. 
       6                 :            : //
       7                 :            : // Special Notes :
       8                 :            : //
       9                 :            : // Creator       : 
      10                 :            : //
      11                 :            : // Creation Date : 
      12                 :            : //
      13                 :            : // Owner         : 
      14                 :            : //-------------------------------------------------------------------------
      15                 :            : 
      16                 :            : #include <stdio.h>
      17                 :            : #include <math.h>
      18                 :            : #include "CubitDefines.h"
      19                 :            : #include "CubitVector.hpp"
      20                 :            : 
      21                 :            : #include "Body.hpp"
      22                 :            : #include "RefVolume.hpp"
      23                 :            : #include "RefFace.hpp"
      24                 :            : #include "RefEdge.hpp"
      25                 :            : #include "RefVertex.hpp"
      26                 :            : 
      27                 :            : #include "CubitObserver.hpp"
      28                 :            : #include "RefEntityFactory.hpp"
      29                 :            : #include "GeometryQueryTool.hpp"
      30                 :            : #include "GfxDebug.hpp"
      31                 :            : #include "GeometryDefines.h"
      32                 :            : #include "Loop.hpp"
      33                 :            : 
      34                 :            : #include "CoFace.hpp"
      35                 :            : #include "CoEdge.hpp"
      36                 :            : 
      37                 :            : #include "Surface.hpp"
      38                 :            : 
      39                 :            : // lists
      40                 :            : #include "DLIList.hpp"
      41                 :            : 
      42                 :            : #include "CastTo.hpp"
      43                 :            : #include "CubitString.hpp"
      44                 :            : #include "CubitUtil.hpp"
      45                 :            : //for measuring/cacheing the area of the surface.
      46                 :            : #include "GeomMeasureTool.hpp"
      47                 :            : 
      48                 :            : #include "GeometryUtil.hpp"
      49                 :            : #include "ModelQueryEngine.hpp"
      50                 :            : 
      51                 :            : //static RefEdge* find_edge_to_adjust(DLIList<RefEdge*>& ref_edge_list);
      52                 :            : 
      53                 :            : //-------------------------------------------------------------------------
      54                 :            : // Purpose       : Constructor with a pointer to a Surface 
      55                 :            : //
      56                 :            : // Special Notes :
      57                 :            : //
      58                 :            : // Creator       : Xuechen Liu
      59                 :            : //
      60                 :            : // Creation Date : 07/11/96
      61                 :            : //-------------------------------------------------------------------------
      62         [ +  - ]:      32092 : RefFace::RefFace(Surface* surfacePtr)
      63                 :            : {
      64                 :            :      // Set the GeometryEntity pointer   if (surfacePtr != NULL)
      65         [ +  - ]:      16046 :    if (surfacePtr != NULL)
      66                 :            :    {
      67         [ +  - ]:      16046 :       set_geometry_entity_ptr(surfacePtr) ;
      68                 :            :    }
      69                 :            :    else
      70                 :            :    {
      71 [ #  # ][ #  # ]:          0 :       PRINT_ERROR("In the RefFace(Surface*) constructor\n"
                 [ #  # ]
      72         [ #  # ]:          0 :                   "       Input Surface pointer is NULL\n");
      73                 :          0 :       assert(CUBIT_FALSE);
      74                 :            :    }
      75                 :            :    
      76                 :            :      // Initialize the member data
      77         [ +  - ]:      16046 :    initialize();
      78                 :      16046 : }
      79                 :            : 
      80                 :            : //-------------------------------------------------------------------------
      81                 :            : // Purpose       : The destructor.
      82                 :            : //
      83                 :            : // Special Notes : Note that the GeometryEntity associated with this
      84                 :            : //                 RefEntity is deleted in the destructor of the
      85                 :            : //                 BasicTopologyEntity class.
      86                 :            : //
      87                 :            : // Creator       : Malcolm J. Panthaki
      88                 :            : //
      89                 :            : // Creation Date : 10/22/96
      90                 :            : //-------------------------------------------------------------------------
      91         [ +  - ]:      29760 : RefFace::~RefFace()
      92                 :            : {
      93                 :            :     // Delete the hardpoints associated with this RefFace
      94                 :            :   
      95                 :            :   
      96                 :            : //     // Delete the contents of the SurfVertexList
      97                 :            : //   for ( i = surfVertexList.size(); i > 0; i --)
      98                 :            : //   {
      99                 :            : //     delete surfVertexList.get_and_step();
     100                 :            : //   }
     101                 :            :   
     102                 :            :     // Delete the contents of the HardPointList (these are RefVertices).
     103                 :            :     // Calling the remove() function ensures that the DAG cleaned out 
     104                 :            :     // appropriately.
     105                 :            :   int i;
     106 [ +  - ][ -  + ]:       9920 :   for ( i = hardPointList.size(); i > 0; i --)
     107                 :            :   {
     108 [ #  # ][ #  # ]:          0 :     hardPointList.get_and_step()->remove_from_DAG();
     109                 :            :   }
     110                 :            :   
     111         [ +  - ]:       9920 :   remove_from_observers();      
     112         [ -  + ]:      19840 : }
     113                 :            : 
     114                 :            : 
     115                 :          0 : static void dist_between(RefEdge* edge1, RefEdge* edge2, CubitVector& v1, CubitVector& v2, double& dist)
     116                 :            : {
     117                 :            :   // check compatibility first
     118         [ #  # ]:          0 :   DLIList<TopologyEntity*> entity_list(2);
     119 [ #  # ][ #  # ]:          0 :   DLIList<TopologyBridge*> bridge_list(2);
     120         [ #  # ]:          0 :   entity_list.append(edge1);
     121         [ #  # ]:          0 :   entity_list.append(edge2);
     122 [ #  # ][ #  # ]:          0 :   GeometryQueryEngine* gqe = GeometryQueryTool::instance()->common_query_engine( entity_list, bridge_list );
     123         [ #  # ]:          0 :   if(gqe)
     124 [ #  # ][ #  # ]:          0 :     GeometryQueryTool::instance()->entity_entity_distance(edge1, edge2, v1, v2, dist);
         [ #  # ][ #  # ]
     125                 :            :   else
     126                 :            :   {
     127                 :          0 :     BasicTopologyEntity* bte1 = dynamic_cast<BasicTopologyEntity*>(edge1);
     128                 :          0 :     BasicTopologyEntity* bte2 = dynamic_cast<BasicTopologyEntity*>(edge2);
     129 [ #  # ][ #  # ]:          0 :     if(bte1 && bte2)
     130                 :            :     {
     131 [ #  # ][ #  # ]:          0 :       GeometryEntity *ge1 = dynamic_cast<GeometryEntity*>(bte1->bridge_manager()->topology_bridge());
                 [ #  # ]
     132 [ #  # ][ #  # ]:          0 :       GeometryEntity *ge2 = dynamic_cast<GeometryEntity*>(bte2->bridge_manager()->topology_bridge());
                 [ #  # ]
     133 [ #  # ][ #  # ]:          0 :       GeometryQueryTool::instance()->entity_entity_distance(ge1, ge2, v1, v2, dist);
     134                 :            :     }
     135         [ #  # ]:          0 :   }
     136                 :          0 : }
     137                 :            : 
     138                 :          0 : double RefFace::get_crack_length()
     139                 :            : {
     140                 :            :   // find two loops to check the shortest distance between as that's where Cubit is most
     141                 :            :   // likely to crack surfaces
     142                 :            : 
     143         [ #  # ]:          0 :   DLIList<Loop*> crack_loops;
     144                 :            : 
     145 [ #  # ][ #  # ]:          0 :   DLIList<Loop*> loops;
     146         [ #  # ]:          0 :   this->loops(loops);
     147                 :            : 
     148                 :            :   int i, j;
     149 [ #  # ][ #  # ]:          0 :   for(i=0; i<loops.size(); i++)
     150                 :            :   {
     151         [ #  # ]:          0 :     Loop* l = loops.get_and_step();
     152         [ #  # ]:          0 :     LoopType loop_type = l->loop_type();
     153 [ #  # ][ #  # ]:          0 :     if(loop_type == LOOP_TYPE_U_PERIODIC || loop_type == LOOP_TYPE_V_PERIODIC)
     154         [ #  # ]:          0 :       crack_loops.append(l);
     155                 :            :   }
     156                 :            : 
     157 [ #  # ][ #  # ]:          0 :   if(crack_loops.size() >= 2)
     158                 :            :   {
     159         [ #  # ]:          0 :     Loop* loop1 = crack_loops.get_and_step();
     160         [ #  # ]:          0 :     Loop* loop2 = crack_loops.get_and_step();
     161                 :            : 
     162         [ #  # ]:          0 :     DLIList<RefEdge*> loop1_edges;
     163         [ #  # ]:          0 :     loop1->ref_edges(loop1_edges);
     164 [ #  # ][ #  # ]:          0 :     DLIList<RefEdge*> loop2_edges;
     165         [ #  # ]:          0 :     loop2->ref_edges(loop2_edges);
     166                 :            : 
     167 [ #  # ][ #  # ]:          0 :     CubitVector p1, p2;
     168                 :          0 :     double min_dist = -1.0;
     169                 :            : 
     170 [ #  # ][ #  # ]:          0 :     for(i=0; i<loop1_edges.size(); i++)
     171                 :            :     {
     172         [ #  # ]:          0 :       RefEdge* edge1 = loop1_edges.get_and_step();
     173 [ #  # ][ #  # ]:          0 :       for(j=0; j<loop2_edges.size(); j++)
     174                 :            :       {
     175         [ #  # ]:          0 :         RefEdge* edge2 = loop2_edges.get_and_step();
     176         [ #  # ]:          0 :         if(edge2 != edge1)
     177                 :            :         {
     178 [ #  # ][ #  # ]:          0 :           CubitVector v1, v2;
     179                 :          0 :           double dist = -1;
     180         [ #  # ]:          0 :           dist_between(edge1, edge2, v1, v2, dist);
     181 [ #  # ][ #  # ]:          0 :           if(min_dist < 0 || (dist < min_dist && dist > 0))
                 [ #  # ]
     182                 :            :           {
     183                 :          0 :             min_dist = dist;
     184         [ #  # ]:          0 :             p1 = v1;
     185         [ #  # ]:          0 :             p2 = v2;
     186                 :            :           }
     187                 :            :         }
     188                 :            :       }
     189                 :            :     }
     190                 :            : 
     191                 :            :     // estimate distance along the surface in case of curvature
     192         [ #  # ]:          0 :     if(min_dist > 0)
     193                 :            :     {
     194                 :          0 :       double new_min_dist = 0;
     195                 :            :       double start_uv[2];
     196                 :            :       double end_uv[2];
     197         [ #  # ]:          0 :       this->u_v_from_position(p1, start_uv[0], start_uv[1]);
     198         [ #  # ]:          0 :       this->u_v_from_position(p2, end_uv[0], end_uv[1]);
     199                 :            :       double delta_uv[2];
     200                 :          0 :       delta_uv[0] = (end_uv[0] - start_uv[0]) / 10.0;
     201                 :          0 :       delta_uv[1] = (end_uv[1] - start_uv[1]) / 10.0;
     202                 :            : 
     203         [ #  # ]:          0 :       CubitVector start = p1;
     204         [ #  # ]:          0 :       CubitVector next;
     205         [ #  # ]:          0 :       for(i=0; i<10; i++)
     206                 :            :       {
     207                 :          0 :         start_uv[0] += delta_uv[0];
     208                 :          0 :         start_uv[1] += delta_uv[1];
     209 [ #  # ][ #  # ]:          0 :         next = this->position_from_u_v( start_uv[0], start_uv[1] );
     210         [ #  # ]:          0 :         new_min_dist += start.distance_between(next);
     211         [ #  # ]:          0 :         start = next;
     212                 :            :       }
     213                 :          0 :       min_dist = new_min_dist;
     214                 :            :     }
     215                 :            : 
     216         [ #  # ]:          0 :     if(min_dist < 0)
     217                 :            :     {
     218                 :          0 :       min_dist = 0;
     219                 :            :     }
     220                 :            : 
     221 [ #  # ][ #  # ]:          0 :     PRINT_DEBUG_99("Crack_length is %f\n", min_dist);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     222         [ #  # ]:          0 :     return min_dist;
     223                 :            :   }
     224                 :            : 
     225 [ #  # ][ #  # ]:          0 :   PRINT_DEBUG_99("No valid crack length for surface %i\n", this->id());
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     226         [ #  # ]:          0 :   return 0.0;
     227                 :            : }
     228                 :            : 
     229                 :    3591286 : CubitVector RefFace::normal_at ( const CubitVector& location, 
     230                 :            :                                  RefVolume* volume, 
     231                 :            :                                  double* u_guess, double* v_guess)
     232                 :            : {
     233                 :            :      // The Surface::normal_at function not only returns the normal, but 
     234                 :            :      // also returns the point on the actual surface that is closest to 
     235                 :            :      // the input location.  The normal is actually computed at *this*
     236                 :            :      // (closest) point on the surface, not at the input location.
     237         [ +  - ]:    3591286 :    CubitVector normal;
     238                 :            :    CubitStatus result;
     239         [ +  - ]:    3591286 :    Surface* surface_ptr = get_surface_ptr();
     240                 :            :    
     241 [ -  + ][ #  # ]:    3591286 :   if(!u_guess || !v_guess) // no guess was provided
     242                 :            :   {
     243 [ +  - ][ -  + ]:    3591286 :     if (u_guess || v_guess)
     244                 :            :     {
     245 [ #  # ][ #  # ]:          0 :       PRINT_ERROR("normal_at(): neither or both of u_guess and "
                 [ #  # ]
     246         [ #  # ]:          0 :                   "v_guess must be specified.\n");
     247 [ #  # ][ #  # ]:          0 :       assert(u_guess && v_guess);
     248                 :            :     }
     249         [ +  - ]:    3591286 :     result = surface_ptr->closest_point(location, NULL, &normal);
     250                 :            :   }
     251                 :            :   else
     252                 :            :   {
     253                 :            :     result = surface_ptr->closest_point_uv_guess(location, 
     254                 :            :                                                        *u_guess, *v_guess,
     255         [ #  # ]:          0 :                                                        NULL, &normal );
     256                 :            :   }
     257                 :            : 
     258         [ -  + ]:    3591286 :    if (result == CUBIT_FAILURE)
     259                 :            :    {
     260 [ #  # ][ #  # ]:          0 :       PRINT_ERROR("In RefFace::normal_at\n"
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     261                 :            :                   "       Could not compute the requested normal at "
     262                 :            :                   "location {%f %f %f} on %s (surface %d).\n",
     263                 :            :                   location.x(), location.y(), location.z(),
     264                 :            :                   this->entity_name().c_str(),
     265         [ #  # ]:          0 :                   this->id());
     266                 :            :       //assert ( result == CUBIT_SUCCESS );
     267         [ #  # ]:          0 :       return CubitVector(0.0, 0.0, 0.0);
     268                 :            :    }
     269                 :            :    
     270 [ +  - ][ -  + ]:    3591286 :    if (surface_ptr->bridge_sense() == CUBIT_REVERSED)
     271 [ #  # ][ #  # ]:          0 :      normal = -normal;
     272                 :            :    
     273         [ -  + ]:    3591286 :    if ( volume )
     274                 :            :    {
     275         [ #  # ]:          0 :       CubitSense s = sense( volume );
     276 [ #  # ][ #  # ]:          0 :       if( s != CUBIT_FORWARD && s != CUBIT_REVERSED )
     277                 :            :       {
     278 [ #  # ][ #  # ]:          0 :         if(!(volume->is_sheet()))
     279                 :            :         {
     280 [ #  # ][ #  # ]:          0 :           PRINT_ERROR("Surface %d has bad sense information with respect to volume %d\n"
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     281                 :            :                       "       Probably is a 2-sided surface embedded in volume %d\n"  
     282         [ #  # ]:          0 :                       "       Cannot handle this case.\n", id(), volume->id(), volume->id() );
     283         [ #  # ]:          0 :           return CubitVector(0.0, 0.0, 0.0);
     284                 :            :         }
     285                 :            :       }
     286                 :            :       
     287         [ #  # ]:          0 :       if ( s == CUBIT_REVERSED )
     288 [ #  # ][ #  # ]:          0 :           normal = -normal;
     289                 :            :    }
     290                 :            :    
     291         [ +  - ]:    3591286 :    return normal;
     292                 :            : }
     293                 :            : 
     294                 :          0 : CubitStatus RefFace::uv_derivitives( double u_param,
     295                 :            :                            double v_param,
     296                 :            :                            CubitVector &du,
     297                 :            :                            CubitVector &dv )
     298                 :            : {
     299                 :          0 :   return get_surface_ptr()->uv_derivitives(u_param, v_param, du, dv);
     300                 :            : }
     301                 :            : 
     302                 :          0 : void RefFace::find_closest_point_trimmed(CubitVector from_point,
     303                 :            :                                          CubitVector& point_on_surface)
     304                 :            : {
     305         [ #  # ]:          0 :    get_surface_ptr()->closest_point_trimmed(from_point, point_on_surface);
     306                 :          0 : }
     307                 :            : 
     308                 :          0 : void RefFace::find_closest_points_trimmed(std::vector<CubitVector> &from_points,
     309                 :            :                                           std::vector<CubitVector> &points_on_surface)
     310                 :            : {
     311                 :          0 :    get_surface_ptr()->closest_points_trimmed(from_points, points_on_surface);
     312                 :          0 : }
     313                 :            : 
     314                 :          0 : CubitStatus RefFace::move_to_surface ( CubitVector& location, 
     315                 :            :                                 CubitVector& along_vec )
     316                 :            : {  
     317         [ #  # ]:          0 :   CubitVector closest_location;
     318         [ #  # ]:          0 :   CubitStatus status = get_surface_ptr()->closest_point_along_vector(location, along_vec,                                                        
     319         [ #  # ]:          0 :                                                        closest_location);
     320                 :            : 
     321         [ #  # ]:          0 :   if( CUBIT_SUCCESS == status )
     322         [ #  # ]:          0 :     location.set ( closest_location.x(), 
     323         [ #  # ]:          0 :     closest_location.y(), 
     324 [ #  # ][ #  # ]:          0 :     closest_location.z() );
     325                 :            : 
     326                 :          0 :   return status;
     327                 :            : }
     328                 :            : 
     329                 :       4095 : void RefFace::move_to_surface ( CubitVector& location, 
     330                 :            :                                 double* u_guess, double* v_guess )
     331                 :            : {
     332         [ +  - ]:       4095 :   CubitVector closest_location;
     333                 :            :   CubitStatus result;
     334                 :            : 
     335 [ -  + ][ #  # ]:       4095 :   if(!u_guess || !v_guess) // no guess was provided
     336                 :            :   {
     337 [ +  - ][ -  + ]:       4095 :     if (u_guess || v_guess)
     338                 :            :     {
     339 [ #  # ][ #  # ]:          0 :       PRINT_ERROR("move_to_surface(): neither or both of u_guess and "
                 [ #  # ]
     340         [ #  # ]:          0 :                   "v_guess must be specified.\n");
     341 [ #  # ][ #  # ]:          0 :       assert(u_guess && v_guess);
     342                 :            :     }
     343 [ +  - ][ +  - ]:       4095 :     result = get_surface_ptr()->closest_point(location, &closest_location);
     344                 :            :   }
     345                 :            :   else
     346                 :            :   {
     347         [ #  # ]:          0 :     result = get_surface_ptr()->closest_point_uv_guess(location, 
     348                 :            :                                                        *u_guess, *v_guess,
     349         [ #  # ]:          0 :                                                        &closest_location);
     350                 :            :   }
     351                 :            :   
     352                 :            : 
     353         [ -  + ]:       4095 :   if (result == CUBIT_FAILURE)
     354                 :            :   {
     355 [ #  # ][ #  # ]:          0 :     PRINT_ERROR("In RefFace::move_to_surface\n"
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     356                 :            :                 "       Could not compute the closest point to "
     357                 :            :                 "location {%f %f %f} on %s (surface %d).\n",
     358                 :            :                 location.x(), location.y(), location.z(),
     359                 :            :                 this->entity_name().c_str(),
     360         [ #  # ]:          0 :                 this->id());
     361         [ #  # ]:          0 :     assert ( result == CUBIT_SUCCESS );
     362                 :       4095 :     return;
     363                 :            :   }
     364                 :            : 
     365         [ +  - ]:       4095 :   location.set ( closest_location.x(), 
     366         [ +  - ]:       4095 :                 closest_location.y(), 
     367 [ +  - ][ +  - ]:       8190 :                 closest_location.z() );
     368                 :            : }
     369                 :            : 
     370                 :          0 : CubitPointContainment RefFace::point_containment( const CubitVector &point )
     371                 :            : {
     372                 :          0 :   Surface *surf = get_surface_ptr();
     373                 :          0 :   return surf->point_containment(point);
     374                 :            : }
     375                 :            :   
     376                 :          0 : CubitPointContainment RefFace::point_containment( double u, double v )
     377                 :            : {
     378                 :          0 :   Surface *surf = get_surface_ptr();
     379                 :          0 :   return surf->point_containment(u, v);
     380                 :            : }
     381                 :            : /*
     382                 :            : CubitPointContainment RefFace::point_containment( CubitVector &point, 
     383                 :            :                                                   double u, double v )
     384                 :            : {
     385                 :            :   Surface *surf = get_surface_ptr();
     386                 :            :   return surf->point_containment(point, u, v);
     387                 :            : }
     388                 :            : */
     389                 :          0 : CubitStatus RefFace::get_principal_curvatures( const CubitVector& point,
     390                 :            :                                                double& curvature1,
     391                 :            :                                                double& curvature2,
     392                 :            :                                                RefVolume* ref_volume_ptr )
     393                 :            : {
     394                 :          0 :    Surface* surface_ptr = get_surface_ptr();
     395                 :            :    
     396                 :            :      // Call the relevant function to compute the curvatures
     397                 :            :    CubitStatus status = surface_ptr->
     398                 :          0 :        principal_curvatures( point, curvature1, curvature2 );
     399         [ #  # ]:          0 :    if ( status != CUBIT_SUCCESS )
     400                 :          0 :        return status;
     401                 :            :        
     402         [ #  # ]:          0 :    if (surface_ptr->bridge_sense() == CUBIT_REVERSED) {
     403                 :          0 :      curvature1 = -curvature1;
     404                 :          0 :      curvature2 = -curvature2;
     405                 :            :    }
     406                 :            :        
     407         [ #  # ]:          0 :    if ( ref_volume_ptr ) {
     408                 :          0 :       CubitSense s = sense( ref_volume_ptr );
     409         [ #  # ]:          0 :       if (  s == CUBIT_REVERSED ) {
     410                 :          0 :          curvature1 = -curvature1;
     411                 :          0 :          curvature2 = -curvature2;
     412                 :            :       }
     413                 :            :    }
     414                 :          0 :    return CUBIT_SUCCESS;
     415                 :            : }
     416                 :            : 
     417                 :          0 : int RefFace::genus() 
     418                 :            : {
     419                 :          0 :   int nloops = num_loops();
     420         [ #  # ]:          0 :   if (nloops > 0) return (nloops - 1);
     421                 :            :   else {
     422                 :            :       // need to compute poles
     423                 :          0 :     int num_poles = this->num_poles();
     424                 :          0 :     return -(num_poles+1);
     425                 :            :   }
     426                 :            : }
     427                 :            : 
     428                 :          0 : int RefFace::num_poles() 
     429                 :            : {
     430                 :          0 :   int num_poles = 0;
     431                 :            :   double u_low, u_high, v_low, v_high;
     432         [ #  # ]:          0 :   get_param_range_U(u_low, u_high);
     433         [ #  # ]:          0 :   get_param_range_V(v_low, v_high);
     434 [ #  # ][ #  # ]:          0 :   if (is_singular_in_U(u_low)) num_poles++;
     435 [ #  # ][ #  # ]:          0 :   if (is_singular_in_U(u_high)) num_poles++;
     436 [ #  # ][ #  # ]:          0 :   if (is_singular_in_V(v_low)) num_poles++;
     437 [ #  # ][ #  # ]:          0 :   if (is_singular_in_V(v_high)) num_poles++;
     438                 :          0 :   return num_poles;
     439                 :            : }
     440                 :            : 
     441                 :       2511 : CubitVector RefFace::center_point ()
     442                 :            : {
     443         [ +  - ]:       2511 :    CubitVector center_pt = bounding_box().center();
     444                 :       2511 :    move_to_surface(center_pt);
     445                 :       2511 :    return center_pt;
     446                 :            : }
     447                 :            : 
     448                 :        132 : int RefFace::number_of_Loops ()
     449                 :            : {
     450                 :        132 :    int number_of_loops = 0;
     451                 :            :    
     452                 :            :      // Get the GroupingEntities (Loops) associated with this 
     453                 :            :      // BasicTopologyEntity (RefFace)
     454         [ +  - ]:        132 :    DLIList<GroupingEntity*> loopList;
     455 [ +  - ][ +  - ]:        132 :    if ( this->get_grouping_entity_list(loopList) == CUBIT_SUCCESS)
     456                 :            :    {
     457         [ +  - ]:        132 :       number_of_loops = loopList.size();
     458                 :            :    }
     459                 :            :    
     460                 :            :    else
     461                 :            :    {
     462 [ #  # ][ #  # ]:          0 :       PRINT_ERROR("In RefFace::number_of_Loops\n"
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     463                 :            :                   "       Unknown problem retrieving Loops "
     464                 :            :                   "for %s (surface %d).\n",
     465                 :            :                   entity_name().c_str(),
     466         [ #  # ]:          0 :                   this->id());
     467                 :          0 :       number_of_loops = 0;
     468                 :            :    }
     469                 :            :    
     470         [ +  - ]:        132 :    return number_of_loops;
     471                 :            : }
     472                 :            : 
     473                 :          0 : CubitSense RefFace::sense(RefVolume* volume)
     474                 :            : {
     475                 :          0 :    SenseEntity* co_face = find_sense_entity(volume);
     476         [ #  # ]:          0 :    return co_face ? co_face->get_sense() : CUBIT_UNKNOWN;
     477                 :            : }
     478                 :            : 
     479                 :          0 : CubitSense RefFace::sense( RefFace* face_ptr ) 
     480                 :            : {
     481 [ #  # ][ #  # ]:          0 :         DLIList<RefEdge*> edge_list, other_edge_list;
                 [ #  # ]
     482         [ #  # ]:          0 :         ref_edges( edge_list );
     483         [ #  # ]:          0 :         face_ptr->ref_edges( other_edge_list );
     484         [ #  # ]:          0 :         edge_list.intersect( other_edge_list );
     485                 :            :         
     486                 :          0 :         CubitSense result = CUBIT_UNKNOWN;
     487 [ #  # ][ #  # ]:          0 :         if( edge_list.size() > 0 )
     488                 :            :         {
     489         [ #  # ]:          0 :                 RefEdge* edge = edge_list.get_and_step();
     490 [ #  # ][ #  # ]:          0 :                 if( edge->sense(this) == edge->sense(face_ptr) )
                 [ #  # ]
     491                 :          0 :                         result = CUBIT_REVERSED;
     492                 :          0 :                 else result = CUBIT_FORWARD;
     493                 :            :         }
     494 [ #  # ][ #  # ]:          0 :         for( int i = edge_list.size(); i > 1; i-- )
     495                 :            :         {
     496         [ #  # ]:          0 :                 RefEdge* edge = edge_list.get_and_step();
     497 [ #  # ][ #  # ]:          0 :                 CubitSense temp = (edge->sense(this)==edge->sense(face_ptr)) 
     498                 :          0 :                         ? CUBIT_FORWARD : CUBIT_REVERSED;
     499         [ #  # ]:          0 :                 if( temp != result )
     500                 :            :                 {
     501                 :          0 :                         result = CUBIT_UNKNOWN;
     502                 :          0 :                         break;
     503                 :            :                 }
     504                 :            :         }
     505         [ #  # ]:          0 :         return result;
     506                 :            : }
     507                 :            :                         
     508                 :            : 
     509                 :            : 
     510                 :            : //-------------------------------------------------------------------------
     511                 :            : // Purpose       : Spatially compare two RefFaces.  Compare bounding boxes
     512                 :            : //                 first, then compare each of the ref-edges.  This function
     513                 :            : //                 works strictly off of the ref-entities. 
     514                 :            : //
     515                 :            : // Special Notes : 
     516                 :            : //
     517                 :            : // Creator       : Malcolm J. Panthaki
     518                 :            : //
     519                 :            : // Creation Date : 04/07/97
     520                 :            : //-------------------------------------------------------------------------
     521                 :       5012 : CubitBoolean RefFace::about_spatially_equal( 
     522                 :            :     RefFace* ref_face_ptr_2,
     523                 :            :     double tolerance_factor,
     524                 :            :     CubitBoolean notify_refEntity,
     525                 :            :     CubitBoolean test_bbox,
     526                 :            :     int test_internal )
     527                 :            : {
     528                 :            :      // Get rid of the trivial case...
     529         [ -  + ]:       5012 :    if( this == ref_face_ptr_2)
     530                 :            :    {
     531         [ #  # ]:          0 :       if (notify_refEntity)
     532         [ #  # ]:          0 :         remove_compare_data();
     533                 :          0 :       return CUBIT_TRUE;
     534                 :            :    }
     535                 :            : 
     536                 :       5012 :    const double tolerance = tolerance_factor * GEOMETRY_RESABS;
     537         [ +  - ]:       5012 :    CubitBox box_1 = this->bounding_box();
     538 [ +  - ][ +  - ]:      10024 :    CubitBox box_2 = ref_face_ptr_2->bounding_box();
     539 [ +  - ][ +  + ]:       5012 :    if (!box_1.overlap( tolerance, box_2) )
     540                 :        629 :     return CUBIT_FALSE;
     541                 :            : 
     542                 :            : 
     543         [ +  - ]:       4383 :    GeometryQueryTool* gqt = GeometryQueryTool::instance();
     544 [ +  - ][ +  - ]:       8766 :    DLIList<RefEdge*> ref_edge_list_1, ref_edge_list_2;
         [ +  - ][ +  - ]
     545         [ +  - ]:       4383 :    this->ref_edges( ref_edge_list_1 );
     546         [ +  - ]:       4383 :    ref_face_ptr_2->ref_edges( ref_edge_list_2 );
     547                 :            :       
     548                 :            :         //compare the size of the two lists.
     549 [ +  - ][ +  - ]:       4383 :    if ( ref_edge_list_1.size() != ref_edge_list_2.size() )
                 [ +  + ]
     550                 :       1986 :      return CUBIT_FALSE;
     551                 :            :    
     552         [ +  - ]:       2397 :    if (test_internal == 2) // Do internal test for splines only
     553                 :            :    {
     554         [ +  - ]:       2397 :      const GeometryType this_type = this->geometry_type();
     555         [ +  - ]:       2397 :      const GeometryType othr_type = ref_face_ptr_2->geometry_type();
     556 [ +  - ][ +  - ]:       2397 :      if (this_type != SPLINE_SURFACE_TYPE    &&
     557         [ +  - ]:       2397 :          this_type != BEST_FIT_SURFACE_TYPE  &&
     558         [ +  - ]:       2397 :          this_type != UNDEFINED_SURFACE_TYPE &&
     559         [ +  - ]:       2397 :          othr_type != SPLINE_SURFACE_TYPE    &&
     560         [ +  - ]:       2397 :          othr_type != BEST_FIT_SURFACE_TYPE  &&
     561                 :            :          othr_type != UNDEFINED_SURFACE_TYPE   )
     562                 :       2397 :       test_internal = 0;
     563                 :            :      else
     564                 :       2397 :       test_bbox = CUBIT_FALSE;
     565                 :            :    }
     566                 :            :       
     567                 :            :    
     568                 :            :      //This compare precedure does the following :
     569                 :            :      //   1. Test the bounding boxes of the 2 faces for equality;
     570                 :            :      //      If they are "equal" (within "resabs*tolerance_factor"):
     571                 :            :      //   2. Compare the ref-edges.
     572                 :            :      //   3. Test a point on the two surfaces. 
     573                 :            :      //   4. When notify_refEntity is CUBIT_TRUE, whenever find an
     574                 :            :      //      two ReEntity's are spatially equal, notify the RefEntity.
     575                 :            :      //**** Reorderd by J.Kraftcheck, Sept 22, 2003 ****
     576                 :            :      // - Check mergable curves first.  Then check boxes and finally
     577                 :            :      //   the internal position.
     578                 :            :      
     579 [ +  - ][ +  - ]:       4794 :    DLIList<Loop*> loop_list_1, loop_list_2;
         [ +  - ][ +  - ]
     580 [ +  - ][ +  - ]:       4794 :    DLIList<CoEdge*> loop_1_coedges;
     581         [ +  - ]:       2397 :    this->loops( loop_list_1 );
     582         [ +  - ]:       2397 :    ref_face_ptr_2->loops( loop_list_2 );
     583 [ +  - ][ +  - ]:       2397 :    if( loop_list_1.size() != loop_list_2.size() )
                 [ -  + ]
     584                 :          0 :      return CUBIT_FALSE;
     585                 :            : 
     586         [ +  - ]:       2397 :    CubitSense relative_sense = compare_alignment( ref_face_ptr_2 );
     587                 :            : 
     588                 :            :    // match each loop in loop_list_1 with one in loop_list_2
     589 [ +  - ][ +  + ]:       2511 :    for( int i1 = loop_list_1.size(); i1 > 0; i1-- )
     590                 :            :    {
     591         [ +  - ]:       2397 :      Loop* loop_1 = loop_list_1.get_and_step();
     592         [ +  - ]:       2397 :      loop_1_coedges.clean_out();
     593         [ +  - ]:       2397 :      loop_1->ordered_co_edges( loop_1_coedges );
     594                 :       2397 :      bool loop_match = false;
     595                 :            : 
     596                 :            :      // check every loop in loop_list_2 to see if it matches
     597                 :            :      // the current loop from loop_list_1
     598 [ +  - ][ +  + ]:       4794 :      for( int i2 = loop_list_2.size(); (i2 > 0) && !loop_match; i2-- )
                 [ +  - ]
     599                 :            :      {
     600         [ +  - ]:       2397 :        Loop* loop_2 = loop_list_2.step_and_get();
     601                 :            :        loop_match = loop_2->about_spatially_equal( loop_1_coedges,
     602                 :            :                                                    relative_sense,
     603                 :            :                                                    tolerance_factor,
     604         [ +  - ]:       2397 :                                                    notify_refEntity );
     605                 :            :      }
     606                 :            :                                           
     607                 :            :      // loop from loop_list_1 did not match any loop in loop_list_2
     608         [ +  + ]:       2397 :      if( ! loop_match )
     609                 :       2283 :        return CUBIT_FALSE;
     610                 :            : 
     611                 :            :      // found a match for the current one, so remove it
     612         [ +  - ]:        114 :      loop_list_2.extract();
     613                 :            : 
     614                 :            :    } // for( loop_list_1 )
     615                 :            : 
     616                 :            : 
     617         [ +  - ]:        114 :    if ( test_bbox )
     618                 :            :    {
     619                 :            :        // This test checks to see that the min and max vectors of the
     620                 :            :        // bounding boxes are within 10% of the length of the bbox diagonal.
     621                 :            :        // Note that this assumes the default values of resabs=1e-6 and
     622                 :            :        // tolerance_factor=500
     623                 :            : 
     624                 :            :        // It has already been determined that the RefEdges of the
     625                 :            :        // surfaces are mergeable, so the bounding boxes of the 
     626                 :            :        // RefEdges should be equivalent.  Consider the bounding box
     627                 :            :        // of each RefFace to be the RefFace's box united with the
     628                 :            :        // box of all the curves.  This removes any potential issues
     629                 :            :        // with non-tight bounding boxes for spline curves from 
     630                 :            :        // consideration, while still comparing any extend of the boxes
     631                 :            :        // that is the result of some internal feature of the surfaces.
     632 [ +  - ][ +  - ]:        114 :      if (ref_edge_list_1.size())
     633                 :            :      {
     634                 :            :        int i;
     635                 :            :        // Call 'unmerged_bounding_box' here so that we get the aggregate bounding box
     636                 :            :        // of all of the Topology Bridges of curves that are already merged.  If we don't
     637                 :            :        // do this we may not expand the bounding boxes sufficiently to get correct results.
     638 [ +  - ][ +  - ]:        114 :        CubitBox edge_box = ref_edge_list_1.step_and_get()->unmerged_bounding_box();
     639 [ +  - ][ +  + ]:        436 :        for (i = ref_edge_list_1.size(); i > 1; i--)
     640 [ +  - ][ +  - ]:        322 :         edge_box |= ref_edge_list_1.step_and_get()->unmerged_bounding_box();
         [ +  - ][ +  - ]
     641 [ +  - ][ +  + ]:        550 :        for (i = ref_edge_list_2.size(); i > 0; i--)
     642 [ +  - ][ +  - ]:        436 :         edge_box |= ref_edge_list_2.step_and_get()->unmerged_bounding_box();
         [ +  - ][ +  - ]
     643         [ +  - ]:        114 :        box_1 |= edge_box;
     644 [ +  - ][ +  - ]:        114 :        box_2 |= edge_box;
     645                 :            :      }
     646                 :            : 
     647                 :            :      CubitVector tol_vect(
     648 [ +  - ][ +  - ]:        114 :          CUBIT_MIN(box_1.x_range(), box_2.x_range()),
     649 [ +  - ][ +  - ]:        114 :          CUBIT_MIN(box_1.y_range(), box_2.y_range()),
     650 [ +  - ][ +  - ]:        342 :          CUBIT_MIN(box_1.z_range(), box_2.z_range()) );
         [ -  + ][ #  # ]
         [ +  - ][ -  + ]
         [ #  # ][ +  - ]
         [ -  + ][ #  # ]
         [ +  - ][ +  - ]
     651         [ +  - ]:        114 :      tol_vect *= 200.0 * tolerance;
     652                 :            : 
     653 [ +  - ][ +  + ]:        114 :      if( tol_vect.x() < tolerance ) tol_vect.x(tolerance);
                 [ +  - ]
     654 [ +  - ][ +  + ]:        114 :      if( tol_vect.y() < tolerance ) tol_vect.y(tolerance);
                 [ +  - ]
     655 [ +  - ][ -  + ]:        114 :      if( tol_vect.z() < tolerance ) tol_vect.z(tolerance);
                 [ #  # ]
     656                 :            :      
     657 [ +  - ][ +  - ]:        342 :      if( (fabs(box_1.minimum().x() - box_2.minimum().x()) > tol_vect.x()) ||
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
           [ -  +  #  #  
                   #  # ]
     658 [ +  - ][ +  - ]:        342 :          (fabs(box_1.maximum().x() - box_2.maximum().x()) > tol_vect.x()) ||
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
           [ #  #  #  # ]
     659 [ +  - ][ +  - ]:        342 :          (fabs(box_1.minimum().y() - box_2.minimum().y()) > tol_vect.y()) ||
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
           [ #  #  #  # ]
     660 [ +  - ][ +  - ]:        342 :          (fabs(box_1.maximum().y() - box_2.maximum().y()) > tol_vect.y()) ||
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
           [ #  #  #  # ]
     661 [ +  - ][ +  - ]:        456 :          (fabs(box_1.minimum().z() - box_2.minimum().z()) > tol_vect.z()) ||
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ -  + ][ +  - ]
                 [ +  - ]
           [ #  #  #  # ]
     662 [ +  - ][ +  - ]:        228 :          (fabs(box_1.maximum().z() - box_2.maximum().z()) > tol_vect.z()) )
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
                 [ +  - ]
           [ #  #  #  # ]
     663                 :            :      {
     664                 :        114 :         return CUBIT_FALSE;
     665                 :            :      }
     666                 :            :    }
     667                 :            :     
     668                 :            :    //if both lists of edges are zero, this is the concentric sphere or torus case.
     669                 :            :    //must look for a point on the surface then.
     670 [ +  - ][ -  + ]:        114 :    if ( (ref_edge_list_1.size() == 0 && ref_edge_list_2.size() == 0 ) ||
         [ #  # ][ #  # ]
         [ -  + ][ -  + ]
     671                 :            :          test_internal != 0 )
     672                 :            :    {
     673                 :            :        //test a point in the middle.
     674 [ #  # ][ #  # ]:          0 :      CubitVector center_1, center_2;
     675         [ #  # ]:          0 :      CubitVector temp_1 = this->center_point();
     676 [ #  # ][ #  # ]:          0 :      this->find_closest_point_trimmed( temp_1, center_1);
     677                 :            :        //Okay, now we have the point.  See if this point is on the other 
     678                 :            :        //surface.
     679 [ #  # ][ #  # ]:          0 :      ref_face_ptr_2->find_closest_point_trimmed( center_1, center_2 );
     680 [ #  # ][ #  # ]:          0 :      if ( !gqt->about_spatially_equal(center_1, center_2, tolerance_factor ) )
     681                 :          0 :        return CUBIT_FALSE;
     682                 :            :    }
     683                 :            : 
     684                 :            : 
     685                 :            :      // If we have come this far, we have found matches for
     686                 :            :      // every edge of the FACEs. Now notify the associated RefEntities
     687                 :            :      // that a match was found.
     688         [ +  - ]:        114 :    if (notify_refEntity == CUBIT_TRUE )
     689                 :            :    {
     690 [ +  - ][ +  - ]:        114 :       this->comparison_found(ref_face_ptr_2);
     691                 :            :    }
     692                 :            : 
     693         [ +  - ]:       5126 :    return CUBIT_TRUE;
     694                 :            : 
     695                 :            : }    
     696                 :            : 
     697                 :            : //-NOTE: For this function it is assumed that the second_ref_face
     698                 :            : //- is spacially equivalient to the first one.
     699                 :            : //- This function could explode if this is not followed.
     700                 :            : //- If you don't know about the closness of the two faces, check the
     701                 :            : //- previous compare function first.
     702                 :       2511 : CubitSense RefFace::compare_alignment( RefFace* second_ref_face_ptr )
     703                 :            : {
     704                 :            :      //Get the sense by testing the two RefFace's at their common
     705                 :            :      //center point.
     706         [ +  - ]:       2511 :    CubitVector center_point = this->center_point();
     707 [ +  - ][ +  - ]:       2511 :    CubitVector normal_this, normal_second;
     708 [ +  - ][ +  - ]:       2511 :    normal_this = this->normal_at( center_point );
     709 [ +  - ][ +  - ]:       2511 :    normal_second = second_ref_face_ptr->normal_at( center_point );
     710                 :            :    
     711         [ +  - ]:       2511 :    double dot = normal_this % normal_second;
     712                 :            :    
     713                 :       2511 :    CubitSense sense = CUBIT_FORWARD;
     714         [ +  + ]:       2511 :    if ( dot < 0 )
     715                 :            :    {
     716                 :         86 :       sense = CUBIT_REVERSED;
     717                 :            :    }
     718                 :            : // Moved this warning into merge tool because this function can
     719                 :            : // be used by other code, for which this warning is misleading.
     720                 :            : // j.k. - 10/11/01
     721                 :            : //   else
     722                 :            : //   {
     723                 :            : //      PRINT_WARNING("Merging %s (surface %d) and %s (surface %d) "
     724                 :            : //                    " which have the same sense.\n"
     725                 :            : //                    "This may indicate bad geometry.\n",
     726                 :            : //                    entity_name().c_str(), id(),
     727                 :            : //                    second_ref_face_ptr->entity_name().c_str(),
     728                 :            : //                    second_ref_face_ptr->id() );
     729                 :            : //   }
     730                 :       2511 :    return sense;
     731                 :            : }
     732                 :            : 
     733                 :            : class LoopAngles 
     734                 :            : {
     735                 :            : public:
     736                 :            :    Loop* loopPtr;
     737                 :            :    double angleMetric;
     738                 :            :    
     739                 :          0 :    LoopAngles(Loop *loop_ptr )
     740                 :          0 :     { loopPtr = loop_ptr; }
     741                 :            :    
     742                 :          0 :    double angle_metric() 
     743                 :          0 :     { return angleMetric; }
     744                 :            : };
     745                 :            : 
     746                 :            : 
     747                 :            : #include "SDLList.hpp"
     748 [ -  + ][ -  + ]:        594 : SDLListdeclare(SDLLoopAngles, LoopAngles*, angle_metric, double)
                 [ +  - ]
     749                 :            : 
     750                 :            : // KGM -- These changes break pave-ansys/anc101.jou
     751                 :            : // create a sorting function for DLIList
     752                 :            : //template <> struct DLIListSorter<LoopAngles*>
     753                 :            : //{
     754                 :            : //  bool operator()(LoopAngles* a, LoopAngles* b) { return a->angle_metric() < b->angle_metric(); }
     755                 :            : //};
     756                 :            : 
     757                 :        198 : CubitStatus RefFace::ordered_loops( DLIList<Loop*> &loop_list )
     758                 :            : {
     759                 :            :    CubitStatus status;
     760         [ +  - ]:        198 :    SDLLoopAngles loop_angle_list;
     761                 :            : //   DLIList<LoopAngles*> loop_angle_list;
     762 [ +  - ][ +  - ]:        396 :    DLIList<Loop*> temp_loop_list;
     763                 :            :      //Get all of the loops for this RefFace.
     764         [ +  - ]:        198 :    loops( temp_loop_list );
     765                 :            :    
     766 [ +  - ][ +  - ]:        198 :    if ( temp_loop_list.size() < 2 )
     767                 :            :    {
     768         [ +  - ]:        198 :      loop_list += temp_loop_list;
     769                 :            :    }
     770                 :            :    else
     771                 :            :    {
     772                 :            :      // See if the underlying geometry engine can give us the ordered list
     773                 :            :      // before trying to do it manually.
     774 [ #  # ][ #  # ]:          0 :      GeometryQueryTool::instance()->get_ordered_loops(this, loop_list);
     775 [ #  # ][ #  # ]:          0 :      if(loop_list.size() > 0 && loop_list.size() == temp_loop_list.size())
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     776                 :          0 :          return CUBIT_SUCCESS;
     777                 :            :      else
     778         [ #  # ]:          0 :        loop_list.clean_out();
     779                 :            : 
     780                 :            :      // If we were not able to get the ordered list from the underlying
     781                 :            :      // geometry engine we will do it manually.
     782                 :            : 
     783                 :            :      // Order the list of loops from outside to inside.
     784                 :            :      Loop *loop_ptr;
     785                 :            :      LoopAngles *loop_angles;
     786                 :            :      
     787 [ #  # ][ #  # ]:          0 :      for ( int ii = temp_loop_list.size(); ii > 0; ii-- )
     788                 :            :      {
     789         [ #  # ]:          0 :        loop_ptr = temp_loop_list.get_and_step();
     790 [ #  # ][ #  # ]:          0 :        loop_angles = new LoopAngles( loop_ptr );
     791         [ #  # ]:          0 :        status = loop_ptr->get_angle_metric( loop_angles->angleMetric );
     792         [ #  # ]:          0 :        if ( status == CUBIT_FAILURE )
     793                 :            :        {
     794 [ #  # ][ #  # ]:          0 :          PRINT_ERROR("In RefFace::ordered_loops\n"
                 [ #  # ]
     795                 :            :                      "       Unknown problem computing the angle metric"
     796         [ #  # ]:          0 :                      " of the Loop.\n");
     797                 :          0 :          delete loop_angles;
     798                 :            :          
     799 [ #  # ][ #  # ]:          0 :          while( loop_angle_list.size() != 0 )
     800         [ #  # ]:          0 :            delete loop_angle_list.remove();
     801                 :            :          
     802                 :          0 :          return CUBIT_FAILURE;
     803                 :            :        }
     804         [ #  # ]:          0 :       loop_angle_list.append( loop_angles );
     805                 :            :      }
     806                 :            :      
     807         [ #  # ]:          0 :      loop_angle_list.sort();
     808                 :            : //     std::stable_sort(&loop_angle_list[0], &loop_angle_list[0]+loop_angle_list.size(), DLIListSorter<LoopAngles*>());
     809         [ #  # ]:          0 :      loop_angle_list.reset();
     810 [ #  # ][ #  # ]:          0 :      for ( int jj = 0; jj < loop_angle_list.size(); jj++ )
     811                 :            :      {
     812         [ #  # ]:          0 :        Loop* loop =  loop_angle_list.get_and_step()->loopPtr;
     813         [ #  # ]:          0 :        loop_list.append( loop );
     814                 :          0 :        bool debug = false;
     815         [ #  # ]:          0 :        if (debug)
     816                 :            :        {
     817         [ #  # ]:          0 :          DLIList<RefEdge*> edge_list;
     818         [ #  # ]:          0 :          loop->ordered_ref_edges(edge_list);
     819 [ #  # ][ #  # ]:          0 :          for (int kk = 0; kk < edge_list.size(); kk++)
     820                 :            :          {
     821         [ #  # ]:          0 :            RefEdge *e = edge_list[kk];
     822         [ #  # ]:          0 :            GfxDebug::highlight_ref_edge(e);
     823         [ #  # ]:          0 :            GfxDebug::flush();
     824                 :            :          }
     825 [ #  # ][ #  # ]:          0 :          GfxDebug::clear_highlight();
     826                 :            :        }
     827                 :            :      }
     828                 :            :      
     829                 :            :        //Delete loop_angles
     830 [ #  # ][ #  # ]:          0 :      while( loop_angle_list.size() != 0 )
     831         [ #  # ]:          0 :        delete loop_angle_list.remove();
     832                 :            :    }
     833                 :            :    
     834                 :        198 :    bool debug = false;
     835         [ -  + ]:        198 :    if (debug)
     836                 :            :    {
     837 [ #  # ][ #  # ]:          0 :      PRINT_INFO("Debugging ordered_loops\n");
         [ #  # ][ #  # ]
     838 [ #  # ][ #  # ]:          0 :      for (int i = 0; i < loop_list.size(); i++)
     839                 :            :      {
     840         [ #  # ]:          0 :        DLIList<RefEdge*> edge_list;
     841         [ #  # ]:          0 :        Loop* loop = loop_list[i];
     842         [ #  # ]:          0 :        loop->ordered_ref_edges(edge_list);
     843 [ #  # ][ #  # ]:          0 :        PRINT_INFO("  Edges: ");
         [ #  # ][ #  # ]
     844 [ #  # ][ #  # ]:          0 :        for (int j = 0; j < edge_list.size(); j++)
     845                 :            :        {
     846 [ #  # ][ #  # ]:          0 :          PRINT_INFO("%d ", edge_list[j]->id());
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     847                 :            :        }
     848 [ #  # ][ #  # ]:          0 :        PRINT_INFO("\n");
         [ #  # ][ #  # ]
     849         [ #  # ]:          0 :      }
     850                 :            :    } 
     851         [ +  - ]:        396 :    return CUBIT_SUCCESS;
     852                 :            : }
     853                 :            : 
     854                 :         66 : int RefFace::co_edge_loops ( DLIList<DLIList<CoEdge*> >& co_edge_loops )
     855                 :            : {
     856         [ +  - ]:         66 :    DLIList<DLIList<CoEdge*> > temp_loop_list;
     857 [ +  - ][ +  - ]:        132 :    DLIList<Loop*> loop_list;
     858                 :         66 :    CubitStatus status = CUBIT_FAILURE;
     859                 :            :    Loop *loop_ptr;
     860                 :            :    
     861                 :            :      //Get the ordered loops (outside to inside);
     862         [ +  - ]:         66 :    status = ordered_loops( loop_list );
     863         [ -  + ]:         66 :    if ( status == CUBIT_FAILURE )
     864                 :          0 :        return status;
     865                 :            :    
     866                 :            :      //Now get the co_edges associated with the loops.
     867 [ +  - ][ +  + ]:        132 :    for ( int ii = loop_list.size(); ii > 0; ii-- )
     868                 :            :    {
     869         [ +  - ]:         66 :       loop_ptr = loop_list.get_and_step();
     870                 :            :       
     871                 :            :         // Get the CoEdges on this Loop (the "24" is just a memory allocation
     872                 :            :         // chunking value and doesn't imply that we have a list of size 24!!)
     873         [ +  - ]:         66 :       DLIList<CoEdge*> co_edge_list;
     874                 :            :       
     875                 :            :         //Get the ref_edges with respect to the loop.
     876         [ +  - ]:         66 :       status = loop_ptr->ordered_co_edges( co_edge_list );
     877         [ -  + ]:         66 :       if ( status == CUBIT_FAILURE )
     878                 :            :       {
     879                 :          0 :          return status;
     880                 :            :       }
     881 [ +  - ][ +  - ]:         66 :       temp_loop_list.append( co_edge_list );
                 [ +  - ]
     882                 :         66 :    }
     883         [ +  - ]:         66 :    co_edge_loops += temp_loop_list;
     884                 :            :    
     885         [ +  - ]:        132 :    return CUBIT_SUCCESS;
     886                 :            : }
     887                 :            : 
     888                 :        132 : int RefFace::ref_edge_loops ( DLIList<DLIList<RefEdge*> >& ref_edge_loops )
     889                 :            : {
     890                 :            : // NOTE: all of the ref_edge_list's will need to be deleted by 
     891                 :            : //       the calling function...
     892                 :            : 
     893         [ +  - ]:        132 :    DLIList<RefEdge*> ref_edge_list;
     894 [ +  - ][ +  - ]:        264 :    DLIList<DLIList<RefEdge*> > temp_loop_list;
     895 [ +  - ][ +  - ]:        264 :    DLIList<Loop*> loop_list;
     896                 :        132 :    CubitStatus status = CUBIT_FAILURE;
     897                 :            :    Loop *loop_ptr;
     898                 :            :    
     899                 :            :      //Get the ordered loops (outside to inside);
     900         [ +  - ]:        132 :    status = ordered_loops( loop_list );
     901         [ -  + ]:        132 :    if ( status == CUBIT_FAILURE )
     902                 :          0 :        return status;
     903                 :            :    
     904                 :            :      //Now get the ref-edges associated with the loops.
     905 [ +  - ][ +  + ]:        264 :    for ( int ii = loop_list.size(); ii > 0; ii-- )
     906                 :            :    {
     907         [ +  - ]:        132 :       loop_ptr = loop_list.get_and_step();
     908                 :            :       
     909         [ +  - ]:        132 :       ref_edge_list.clean_out();
     910                 :            :       
     911                 :            :         //Get the ref_edges with respect to the loop.
     912         [ +  - ]:        132 :       status = loop_ptr->ordered_ref_edges( ref_edge_list );
     913         [ -  + ]:        132 :       if ( status == CUBIT_FAILURE )
     914                 :            :       {
     915                 :          0 :          return status;
     916                 :            :       }
     917         [ +  - ]:        132 :       temp_loop_list.append( ref_edge_list );
     918                 :            :    }
     919         [ +  - ]:        132 :    ref_edge_loops += temp_loop_list;
     920                 :            :    
     921         [ +  - ]:        264 :    return CUBIT_SUCCESS;
     922                 :            : }
     923                 :            : 
     924                 :            : 
     925                 :          0 : RefVolume* RefFace::ref_volume()
     926                 :            : {
     927         [ #  # ]:          0 :    DLIList<RefEntity*> entity_list;
     928 [ #  # ][ #  # ]:          0 :    DLIList<RefVolume*> vol_list;
     929                 :            :    RefVolume *vol_ptr;
     930                 :            :    
     931                 :            :      // Get the list of RefVolumes that own this RefFace.
     932         [ #  # ]:          0 :    get_parent_ref_entities( entity_list );
     933 [ #  # ][ #  # ]:          0 :    CAST_LIST( entity_list, vol_list , RefVolume);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     934                 :            :    
     935                 :            :      // Return the first valid RefVolume from the list.
     936         [ #  # ]:          0 :    vol_list.reset();
     937 [ #  # ][ #  # ]:          0 :    for( int i = vol_list.size(); i>0; i-- )
     938                 :            :    {
     939         [ #  # ]:          0 :       vol_ptr = vol_list.get_and_step();
     940         [ #  # ]:          0 :       if( vol_ptr )
     941                 :          0 :           return vol_ptr;
     942                 :            :    }
     943                 :            :    
     944                 :            :      // Print ERROR if no valid RefVolume was found.
     945 [ #  # ][ #  # ]:          0 :    PRINT_ERROR("No RefVolume found for the RefEdge.\n");
         [ #  # ][ #  # ]
     946         [ #  # ]:          0 :    return NULL;
     947                 :            : }
     948                 :            : 
     949                 :            : //NOTE: There could be more than one CoFace that is associated with this
     950                 :            : // volume and ref-faces, (hard-surfaces).
     951                 :          0 : CoFace* RefFace::get_matching_CoFace(RefVolume* ref_volume_ptr)
     952                 :            : {
     953         [ #  # ]:          0 :   return dynamic_cast<CoFace*>(find_sense_entity(ref_volume_ptr));
     954                 :            : }
     955                 :            : 
     956                 :            : 
     957                 :          0 : void RefFace::add_hard_point( RefVertex* ref_vertex_ptr)
     958                 :            : {
     959                 :          0 :    hardPointList.append( ref_vertex_ptr );
     960                 :          0 : }
     961                 :            : 
     962                 :          0 : void RefFace::hard_points(  DLIList<RefVertex*>& new_hard_point_list )
     963                 :            : {
     964                 :          0 :    new_hard_point_list = hardPointList;
     965                 :          0 : }
     966                 :            : 
     967                 :          0 : CubitVector RefFace::position_from_u_v (double u, double v)
     968                 :            : {
     969                 :            :      // Get the Surface this object points to
     970                 :          0 :    Surface* surfacePtr = get_surface_ptr();
     971                 :            :    
     972                 :            :      // Make sure we get a valid Surface
     973         [ #  # ]:          0 :    assert(surfacePtr != NULL) ;
     974                 :            :    
     975                 :            :      // Ask the Surface to do the real work
     976                 :          0 :    return surfacePtr->position_from_u_v(u, v) ;
     977                 :            : }
     978                 :            : 
     979                 :       1232 : CubitStatus RefFace::u_v_from_position (CubitVector const& location,
     980                 :            :                                         double& u, 
     981                 :            :                                         double& v,
     982                 :            :                                         CubitVector* closest_location )
     983                 :            : {
     984                 :            :      //- This function returns the {u, v} coordinates of the point 
     985                 :            :      //- on the Surface closest to the input point (specified in global
     986                 :            :      //- space). The closest_location is also returned.
     987                 :            :    
     988                 :            :      // pass call directly to surface
     989                 :       1232 :    Surface *surface = get_surface_ptr();
     990                 :            :    
     991                 :            :      // check surface ptr
     992         [ -  + ]:       1232 :    assert(surface != NULL);
     993                 :            :    
     994         [ +  - ]:       1232 :    if(is_parametric() == CUBIT_TRUE)
     995                 :            :    {
     996                 :            :       return surface->u_v_from_position (location, u, v,
     997                 :       1232 :                                       closest_location);
     998                 :            :    }
     999                 :            :    else
    1000                 :            :    {
    1001                 :          0 :      return CUBIT_FAILURE;
    1002                 :            :    }
    1003                 :            : }
    1004                 :            : 
    1005                 :            : 
    1006                 :       3068 : CubitBoolean RefFace::is_parametric()
    1007                 :            : {
    1008                 :            :      //- This function determines whether the underlying geometry of the
    1009                 :            :      //- Surface is parametrically defined or not.  Returns CUBIT_TRUE if 
    1010                 :            :      //- it is and CUBIT_FALSE if it is not.
    1011                 :            :    
    1012                 :            :      // pass call directly to surface
    1013                 :       3068 :    Surface *surface = get_surface_ptr();
    1014                 :            :    
    1015                 :            :      // check surface ptr
    1016         [ -  + ]:       3068 :    assert(surface != NULL);
    1017                 :            :    
    1018                 :       3068 :    return surface->is_parametric();
    1019                 :            : }
    1020                 :            : 
    1021                 :        197 : CubitBoolean RefFace::get_param_range_U( double& lower_bound,
    1022                 :            :                                          double& upper_bound )
    1023                 :            : {
    1024                 :            :      //- Returns the lower and upper parametric bounds of the 
    1025                 :            :      //- surface in U, if it is parametric.  Otherwise, it returns
    1026                 :            :      //- CUBIT_FALSE and zeroes for the upper and lower parametric
    1027                 :            :      //- bounds.
    1028                 :            :    
    1029                 :            :      // pass call directly to surface
    1030                 :        197 :    Surface *surface = get_surface_ptr();
    1031                 :            :    
    1032                 :            :      // check surface ptr
    1033         [ -  + ]:        197 :    assert(surface != NULL);
    1034                 :            :    
    1035                 :        197 :    return surface->get_param_range_U(lower_bound, upper_bound);
    1036                 :            : }
    1037                 :            : 
    1038                 :            : 
    1039                 :        197 : CubitBoolean RefFace::get_param_range_V( double& lower_bound,
    1040                 :            :                                          double& upper_bound )
    1041                 :            : {
    1042                 :            :      //- Returns the lower and upper parametric bounds of the 
    1043                 :            :      //- surface in V, if it is parametric.  Otherwise, it returns
    1044                 :            :      //- CUBIT_FALSE and zeroes for the upper and lower parametric
    1045                 :            :      //- bounds.
    1046                 :            :    
    1047                 :            :      // pass call directly to surface
    1048                 :        197 :    Surface *surface = get_surface_ptr();
    1049                 :            :    
    1050                 :            :      // check surface ptr
    1051         [ -  + ]:        197 :    assert(surface != NULL);
    1052                 :            :    
    1053                 :        197 :    return surface->get_param_range_V(lower_bound, upper_bound);
    1054                 :            : }
    1055                 :            : 
    1056                 :          0 : CubitBoolean RefFace::is_periodic()
    1057                 :            : {
    1058                 :            :      //- This function determines whether the underlying geometry of the
    1059                 :            :      //- Surface is periodic or not.  Returns CUBIT_TRUE if it is and 
    1060                 :            :      //- CUBIT_FALSE if it is not.
    1061                 :            :    
    1062                 :            :      // pass call directly to surface
    1063                 :          0 :    Surface *surface = get_surface_ptr();
    1064                 :            :    
    1065                 :            :      // check surface ptr
    1066         [ #  # ]:          0 :    assert(surface != NULL);
    1067                 :            :    
    1068                 :          0 :    return surface->is_periodic();
    1069                 :            : }
    1070                 :            : 
    1071                 :        240 : CubitBoolean RefFace::is_periodic_in_U( double& period )
    1072                 :            : {
    1073                 :            :      //- Determines whether the surface object is 
    1074                 :            :      //- periodic in the U direction or not.  If it is, it
    1075                 :            :      //- returns CUBIT_TRUE and the value of the period. Otherwise,
    1076                 :            :      //- it returns CUBIT_FALSE and a value of 0.0 or the period.
    1077                 :            :    
    1078                 :            :      // pass call directly to surface
    1079                 :        240 :    Surface *surface = get_surface_ptr();
    1080                 :            :    
    1081                 :            :      // check surface ptr
    1082         [ -  + ]:        240 :    assert(surface != NULL);
    1083                 :            :    
    1084                 :        240 :    return surface->is_periodic_in_U(period);
    1085                 :            : }
    1086                 :            : 
    1087                 :        240 : CubitBoolean RefFace::is_periodic_in_V( double& period )
    1088                 :            : {
    1089                 :            :      //- Determines whether the surface object is 
    1090                 :            :      //- periodic in the V direction or not.  If it is, it
    1091                 :            :      //- returns CUBIT_TRUE and the value of the period. Otherwise,
    1092                 :            :      //- it returns CUBIT_FALSE and a value of 0.0 or the period.
    1093                 :            :    
    1094                 :            :      // pass call directly to surface
    1095                 :        240 :    Surface *surface = get_surface_ptr();
    1096                 :            :    
    1097                 :            :      // check surface ptr
    1098         [ -  + ]:        240 :    assert(surface != NULL);
    1099                 :            :    
    1100                 :        240 :    return surface->is_periodic_in_V(period);
    1101                 :            : }
    1102                 :          0 : CubitBoolean RefFace::is_singular_in_U( double u_param )
    1103                 :            : {
    1104                 :            :      //- Determines whether the surface object is 
    1105                 :            :      //- singular in the U direction or not.  
    1106                 :            :      // pass call directly to surface
    1107                 :          0 :    Surface *surface = get_surface_ptr();
    1108                 :            :    
    1109                 :            :      // check surface ptr
    1110         [ #  # ]:          0 :    assert(surface != NULL);
    1111                 :            :    
    1112                 :          0 :    return surface->is_singular_in_U(u_param);
    1113                 :            : }
    1114                 :          0 : CubitBoolean RefFace::is_singular_in_V( double v_param )
    1115                 :            : {
    1116                 :            :      //- Determines whether the surface object is 
    1117                 :            :      //- singular in the V direction or not.  
    1118                 :            :      // pass call directly to surface
    1119                 :          0 :    Surface *surface = get_surface_ptr();
    1120                 :            :    
    1121                 :            :      // check surface ptr
    1122         [ #  # ]:          0 :    assert(surface != NULL);
    1123                 :            :    
    1124                 :          0 :    return surface->is_singular_in_V(v_param);
    1125                 :            : }
    1126                 :            : 
    1127                 :          0 : RefEdge* RefFace::common_ref_edge ( RefFace* input_face_ptr )
    1128                 :            : {
    1129         [ #  # ]:          0 :    DLIList<RefEdge*> this_edge_list;
    1130         [ #  # ]:          0 :    ref_edges ( this_edge_list );
    1131                 :            :    
    1132 [ #  # ][ #  # ]:          0 :    for ( int i = this_edge_list.size(); i > 0; i--)
    1133                 :            :    {
    1134         [ #  # ]:          0 :       RefEdge* edge = this_edge_list.get_and_step();
    1135 [ #  # ][ #  # ]:          0 :       if (edge->find_sense_entity(input_face_ptr))
    1136                 :          0 :         return edge;
    1137                 :            :    }
    1138                 :            :    
    1139         [ #  # ]:          0 :    return NULL;
    1140                 :            : }
    1141                 :            : 
    1142                 :          0 : int RefFace::common_ref_edges ( RefFace* input_face_ptr, DLIList<RefEdge*> &common_edge_list )
    1143                 :            : {
    1144         [ #  # ]:          0 :    DLIList<RefEdge*> this_edge_list;
    1145         [ #  # ]:          0 :    ref_edges ( this_edge_list );
    1146                 :          0 :    int nedges = 0;
    1147                 :            :    
    1148 [ #  # ][ #  # ]:          0 :    for ( int i = this_edge_list.size(); i > 0; i--)
    1149                 :            :    {
    1150         [ #  # ]:          0 :       RefEdge* edge = this_edge_list.get_and_step();
    1151 [ #  # ][ #  # ]:          0 :       if (edge->find_sense_entity(input_face_ptr))
    1152                 :            :       {
    1153         [ #  # ]:          0 :         common_edge_list.append(edge);
    1154                 :          0 :         nedges++;
    1155                 :            :       }
    1156                 :            :    }
    1157                 :            :    
    1158         [ #  # ]:          0 :    return nedges;
    1159                 :            : }
    1160                 :            : 
    1161                 :          0 : RefVolume* RefFace::common_ref_volume ( RefFace* input_face_ptr )
    1162                 :            : {
    1163         [ #  # ]:          0 :    DLIList<RefVolume*> this_volume_list;
    1164 [ #  # ][ #  # ]:          0 :    DLIList<RefVolume*> input_volume_list;
    1165                 :            :    
    1166         [ #  # ]:          0 :    ref_volumes ( this_volume_list );
    1167         [ #  # ]:          0 :    input_face_ptr->ref_volumes ( input_volume_list );
    1168                 :            :    
    1169 [ #  # ][ #  # ]:          0 :    for ( int i = this_volume_list.size(); i > 0; i--)
    1170                 :            :    {
    1171 [ #  # ][ #  # ]:          0 :       if (input_volume_list.move_to (this_volume_list.get()))
                 [ #  # ]
    1172                 :            :       {
    1173         [ #  # ]:          0 :          return this_volume_list.get();
    1174                 :            :       }
    1175                 :            :       
    1176         [ #  # ]:          0 :       this_volume_list.step();
    1177                 :            :    }
    1178                 :            :    
    1179         [ #  # ]:          0 :    return NULL;
    1180                 :            : }
    1181                 :            : 
    1182                 :     747506 : int RefFace::dimension() const
    1183                 :            : {
    1184                 :     747506 :    return 2;
    1185                 :            : }
    1186                 :        720 : double RefFace::area()
    1187                 :            : {
    1188                 :        720 :   return GeomMeasureTool::measure_area(this);
    1189                 :            : }
    1190                 :            : 
    1191                 :        720 : double RefFace::measure()
    1192                 :            : {
    1193                 :        720 :    return this->area();
    1194                 :            : }
    1195                 :            : 
    1196                 :          0 : CubitString RefFace::measure_label()
    1197                 :            : {
    1198                 :          0 :    return "area";
    1199                 :            : }
    1200                 :            : 
    1201                 :            : //-------------------------------------------------------------------------
    1202                 :            : // Purpose       : Return a pointer to the surface associated with a face.
    1203                 :            : //
    1204                 :            : // Special Notes :
    1205                 :            : //
    1206                 :            : // Creator       : Xuechen Liu
    1207                 :            : //
    1208                 :            : // Creation Date : 08/02/96
    1209                 :            : //-------------------------------------------------------------------------
    1210                 :    3801157 : Surface* RefFace::get_surface_ptr() 
    1211                 :            : {
    1212                 :            :   // Just do one cast instead of two -- KGM
    1213                 :    3801157 :   TopologyBridge* bridge = bridge_manager()->topology_bridge();
    1214         [ +  - ]:    3801157 :   return CAST_TO(bridge, Surface);
    1215                 :            :   //return CAST_TO(get_geometry_entity_ptr(), Surface);
    1216                 :            : }
    1217                 :            : 
    1218                 :          0 : const Surface* RefFace::get_surface_ptr() const
    1219                 :            : {
    1220         [ #  # ]:          0 :   return CAST_TO(get_geometry_entity_ptr(), Surface);
    1221                 :            : }
    1222                 :            : 
    1223                 :            : 
    1224                 :            : //-------------------------------------------------------------------------
    1225                 :            : // Purpose       : This function returns CUBIT_TRUE if the underlying 
    1226                 :            : //                 geometry of the face is planar. CUBIT_FALSE otherwise.
    1227                 :            : //
    1228                 :            : // Special Notes :
    1229                 :            : //
    1230                 :            : // Creator       : Raikanta Sahu
    1231                 :            : //
    1232                 :            : // Creation Date : 12/17/96
    1233                 :            : //-------------------------------------------------------------------------
    1234                 :          0 : CubitBoolean RefFace::is_planar() 
    1235                 :            : {
    1236                 :            :      // Cast the generic GeometryEntity pointer to Surface pointer
    1237                 :          0 :    Surface* surfacePtr = this->get_surface_ptr() ;
    1238                 :            :    
    1239                 :            :      // Check if we have a valid Surface. If so, return the result of
    1240                 :            :      // querying the Surface if it is planar.
    1241         [ #  # ]:          0 :    if ( surfacePtr != NULL )
    1242                 :            :    {
    1243                 :            :       GeometryType geo_type;
    1244                 :          0 :       geo_type = surfacePtr->geometry_type();
    1245         [ #  # ]:          0 :       return geo_type == PLANE_SURFACE_TYPE ? CUBIT_TRUE : CUBIT_FALSE;
    1246                 :            :    }
    1247                 :            :    else
    1248                 :            :    {
    1249 [ #  # ][ #  # ]:          0 :       PRINT_WARNING("In RefFace::is_planar\n"
         [ #  # ][ #  # ]
    1250                 :            :                     "         %s (surface %d) is not associated with a valid\n"
    1251                 :            :                     "         underlying geoemtric Surface\n",
    1252         [ #  # ]:          0 :                     entity_name().c_str(), id()) ;
    1253                 :          0 :       return CUBIT_FALSE ;
    1254                 :            :    }
    1255                 :            : }
    1256                 :            : 
    1257                 :            : 
    1258                 :            : //-------------------------------------------------------------------------
    1259                 :            : // Purpose       : This function returns CUBIT_TRUE if the underlying 
    1260                 :            : //                 geometry of the face is cylindrical. CUBIT_FALSE otherwise.
    1261                 :            : //
    1262                 :            : // Special Notes :
    1263                 :            : //
    1264                 :            : // Creator       : KGM
    1265                 :            : //
    1266                 :            : // Creation Date : 03/22/07
    1267                 :            : //-------------------------------------------------------------------------
    1268                 :          0 : CubitBoolean RefFace::is_cylindrical() 
    1269                 :            : {
    1270                 :            :      // Cast the generic GeometryEntity pointer to Surface pointer
    1271                 :          0 :    Surface* surfacePtr = this->get_surface_ptr() ;
    1272                 :            :    
    1273                 :            :      // Check if we have a valid Surface. If so, return the result of
    1274                 :            :      // querying the Surface if it is planar.
    1275         [ #  # ]:          0 :    if ( surfacePtr != NULL )
    1276                 :            :    {
    1277                 :            :       GeometryType geo_type;
    1278                 :          0 :       geo_type = surfacePtr->is_cylindrical();
    1279         [ #  # ]:          0 :       return geo_type == CYLINDER_SURFACE_TYPE ? CUBIT_TRUE : CUBIT_FALSE;
    1280                 :            :    }
    1281                 :            :    else
    1282                 :            :    {
    1283 [ #  # ][ #  # ]:          0 :       PRINT_WARNING("In RefFace::is_cylindrical\n"
         [ #  # ][ #  # ]
    1284                 :            :                     "         %s (surface %d) is not associated with a valid\n"
    1285                 :            :                     "         underlying geoemtric Surface\n",
    1286         [ #  # ]:          0 :                     entity_name().c_str(), id()) ;
    1287                 :          0 :       return CUBIT_FALSE ;
    1288                 :            :    }
    1289                 :            : }
    1290                 :            : 
    1291                 :          0 : CubitStatus RefFace::get_point_normal( CubitVector& origin, CubitVector& normal )
    1292                 :            : {
    1293         [ #  # ]:          0 :    if( is_planar() == CUBIT_FALSE)
    1294                 :          0 :       return CUBIT_FAILURE;
    1295                 :            : 
    1296                 :          0 :    Surface* surface_ptr = get_surface_ptr();
    1297                 :            : 
    1298         [ #  # ]:          0 :    if( surface_ptr != NULL )
    1299                 :            :    {
    1300         [ #  # ]:          0 :       if( surface_ptr->get_point_normal( origin, normal ) == CUBIT_FAILURE )
    1301                 :          0 :          return CUBIT_FAILURE;
    1302                 :            :    }
    1303                 :            :    else 
    1304                 :            :    {
    1305 [ #  # ][ #  # ]:          0 :       PRINT_WARNING("In RefFace::get_point_normal\n"
         [ #  # ][ #  # ]
    1306                 :            :                     "         %s (surface %d) is not associated with a valid\n"
    1307                 :            :                     "         underlying geoemtric Surface\n",
    1308         [ #  # ]:          0 :                     entity_name().c_str(), id()) ;
    1309                 :          0 :       return CUBIT_FAILURE;
    1310                 :            :    }
    1311                 :            :    
    1312         [ #  # ]:          0 :    if (surface_ptr->bridge_sense() == CUBIT_REVERSED)
    1313         [ #  # ]:          0 :      normal = -normal;
    1314                 :            :    
    1315                 :          0 :    return CUBIT_SUCCESS;
    1316                 :            : }
    1317                 :            : 
    1318                 :          0 : int RefFace::validate()
    1319                 :            : {
    1320                 :            :      //- This function determines whether the entity is valid.
    1321                 :            :      //- Several types of checks can be done, 
    1322                 :          0 :    int error = 0;
    1323                 :            :    
    1324                 :            :      // Perform general RefEntity checks (measure > 0)
    1325                 :          0 :    error += RefEntity::validate();
    1326                 :            :    
    1327                 :            :      // Pass through to surface and add in its validation
    1328                 :          0 :    Surface *surface = get_surface_ptr();
    1329                 :            :    
    1330                 :            :      // check surface ptr
    1331         [ #  # ]:          0 :    if (surface != NULL) {
    1332                 :            :         // Check underlying surface
    1333         [ #  # ]:          0 :            DLIList <TopologyEntity*> bad_entities;
    1334 [ #  # ][ #  # ]:          0 :       error += surface->validate(entity_name(), bad_entities);
         [ #  # ][ #  # ]
    1335                 :            :    } else {
    1336 [ #  # ][ #  # ]:          0 :       PRINT_WARNING("\tWARNING: Null underlying surface for %s, (%s %d)\n",
         [ #  # ][ #  # ]
    1337         [ #  # ]:          0 :                     entity_name().c_str(), class_name(), id());
    1338                 :          0 :       error++;
    1339                 :            :    }
    1340                 :          0 :    return error;
    1341                 :            : }
    1342                 :            : 
    1343                 :            : //-------------------------------------------------------------------------
    1344                 :            : // Purpose       : Initializes all member data
    1345                 :            : //
    1346                 :            : // Special Notes :
    1347                 :            : //
    1348                 :            : // Creator       : Malcolm J. Panthaki
    1349                 :            : //
    1350                 :            : // Creation Date : 09/25/96
    1351                 :            : //-------------------------------------------------------------------------
    1352                 :      16046 : void RefFace::initialize()
    1353                 :            : {
    1354                 :            :      // Set the Entity ID for this new RefFace
    1355         [ +  - ]:      16046 :    GeometryEntity* geom_ptr = get_geometry_entity_ptr();
    1356         [ +  - ]:      16046 :    int saved_id = geom_ptr->get_saved_id();
    1357 [ -  + ][ #  # ]:      16046 :    if ( !saved_id || RefEntityFactory::instance()->get_ref_face(saved_id) )
         [ #  # ][ #  # ]
                 [ +  - ]
    1358                 :            :    {
    1359 [ +  - ][ +  - ]:      16046 :      saved_id =  RefEntityFactory::instance()->next_ref_face_id();
    1360         [ +  - ]:      16046 :      geom_ptr->set_saved_id(saved_id);
    1361                 :            :    }
    1362                 :      16046 :    entityId = saved_id;
    1363                 :            :    
    1364                 :            :      // Default graphics attributes
    1365                 :      16046 :    hardPointColor = 1;
    1366                 :            : 
    1367                 :            :      // initialize meshing data
    1368                 :            : 
    1369                 :            :      // initialize the bounding box
    1370         [ +  - ]:      16046 :    CubitBox bound_box = bounding_box();
    1371                 :            :    maxPositionDeviation = 
    1372 [ +  - ][ +  - ]:      16046 :        (bound_box.maximum() - bound_box.minimum()).length()/10.0;
         [ +  - ][ +  - ]
    1373                 :            : 
    1374                 :            :      // read and initialize attributes
    1375         [ +  - ]:      16046 :    auto_read_cubit_attrib();
    1376         [ +  - ]:      16046 :    auto_actuate_cubit_attrib();
    1377                 :            : 
    1378                 :            : #ifdef ALPHA_TREADSWEEP
    1379                 :            :    if(entityId != saved_id)
    1380                 :            :      geom_ptr->set_saved_id(entityId);
    1381                 :            : #endif
    1382                 :            :    
    1383                 :            :      // Assign a default entity name
    1384 [ +  - ][ +  - ]:      16046 :    assign_default_name();   
    1385                 :            :    
    1386                 :      16046 : }
    1387                 :            : 
    1388                 :          0 : void RefFace::reverse_topology() 
    1389                 :            : {
    1390                 :            :    
    1391                 :            :    int i;
    1392                 :            :    
    1393                 :            :      // switch sense going up in dimension 
    1394         [ #  # ]:          0 :    DLIList<CoFace*> co_face_list;
    1395         [ #  # ]:          0 :    co_faces( co_face_list );
    1396 [ #  # ][ #  # ]:          0 :    for ( i = co_face_list.size(); i--; ) {
    1397         [ #  # ]:          0 :       CoFace *co_face = co_face_list.get_and_step();
    1398 [ #  # ][ #  # ]:          0 :       co_face->set_sense( CubitUtil::opposite_sense( co_face->get_sense() ) );    
                 [ #  # ]
    1399                 :            :    }
    1400                 :            :    
    1401                 :            :      // switch sense going down in dimension 
    1402 [ #  # ][ #  # ]:          0 :    DLIList<Loop*> loop_list;
    1403         [ #  # ]:          0 :    loops( loop_list );
    1404 [ #  # ][ #  # ]:          0 :    for ( i = loop_list.size(); i--; )
    1405 [ #  # ][ #  # ]:          0 :        loop_list.get_and_step()->reverse_direction();
                 [ #  # ]
    1406                 :          0 : }
    1407                 :            : 
    1408                 :          0 : void RefFace::reverse_normal()
    1409                 :            : {
    1410                 :          0 :    bridge_manager()->reverse_bridge_senses();
    1411                 :          0 :    reverse_topology();
    1412                 :          0 : }  
    1413                 :            : 
    1414                 :          0 : CubitBoolean RefFace::set_outward_normal( RefVolume *volume )
    1415                 :            : {
    1416                 :          0 :    CubitSense vol_sense = sense( volume );
    1417         [ #  # ]:          0 :    if ( vol_sense == CUBIT_UNKNOWN )
    1418                 :          0 :       return CUBIT_FALSE;
    1419 [ #  # ][ #  # ]:          0 :    assert( vol_sense == CUBIT_FORWARD || vol_sense == CUBIT_REVERSED );
    1420         [ #  # ]:          0 :    if ( vol_sense == CUBIT_REVERSED ) {
    1421                 :          0 :       reverse_normal();
    1422                 :          0 :       return CUBIT_TRUE;
    1423                 :            :    }
    1424                 :            :    // else already right pointing right way.
    1425                 :          0 :    return CUBIT_FALSE;
    1426                 :            : }
    1427                 :            : 
    1428                 :       2877 : CubitStatus RefFace::get_graphics( GMem& facets,
    1429                 :            :                                    unsigned short normal_tolerance,
    1430                 :            :                                    double distance_tolerance,
    1431                 :            :                                    double longest_edge )
    1432                 :            : {
    1433                 :       2877 :   Surface* surf_ptr = get_surface_ptr();
    1434         [ -  + ]:       2877 :   if (!surf_ptr)
    1435                 :            :   {
    1436 [ #  # ][ #  # ]:          0 :     PRINT_ERROR("RefFace %d is invalid -- no attached Surface.\n",id());
    1437                 :          0 :     return CUBIT_FAILURE;
    1438                 :            :   }
    1439                 :            :   
    1440                 :       2877 :   return surf_ptr->get_geometry_query_engine()->
    1441                 :            :     get_graphics(surf_ptr, &facets, 
    1442                 :       2877 :       normal_tolerance, distance_tolerance, longest_edge );
    1443                 :            : }
    1444                 :            : 
    1445                 :          0 : CubitBoolean RefFace::is_closed_in_U()
    1446                 :            : {
    1447                 :          0 :   Surface* surface_ptr = get_surface_ptr();
    1448                 :          0 :   return surface_ptr->is_closed_in_U();
    1449                 :            : }
    1450                 :            : 
    1451                 :          0 : CubitBoolean RefFace::is_closed_in_V()
    1452                 :            : {
    1453                 :          0 :   Surface* surface_ptr = get_surface_ptr();
    1454                 :          0 :   return surface_ptr->is_closed_in_V();
    1455                 :            : }
    1456                 :            : 
    1457                 :          0 : CubitStatus RefFace::evaluate( double u, double v,
    1458                 :            :                               CubitVector *position,
    1459                 :            :                               CubitVector *normal,
    1460                 :            :                               CubitVector *curvature1,
    1461                 :            :                               CubitVector *curvature2 )
    1462                 :            : {
    1463 [ #  # ][ #  # ]:          0 :   if( NULL == position && NULL == normal &&
                 [ #  # ]
    1464         [ #  # ]:          0 :       NULL == curvature1 && NULL == curvature2 )
    1465                 :          0 :       return CUBIT_FAILURE;
    1466                 :            : 
    1467                 :          0 :   Surface* surf_ptr = get_surface_ptr();
    1468         [ #  # ]:          0 :   if (!surf_ptr)
    1469                 :            :   {
    1470 [ #  # ][ #  # ]:          0 :     PRINT_ERROR("RefFace %d is invalid -- no attached Surface.\n",id());
    1471                 :          0 :     return CUBIT_FAILURE;
    1472                 :            :   }
    1473                 :            :   
    1474                 :          0 :   return surf_ptr->evaluate(u, v, position, normal, curvature1, curvature2 );
    1475                 :            : }
    1476                 :            : 
    1477                 :            : 
    1478                 :          0 : CubitStatus RefFace::get_projected_distance_on_surface( CubitVector *pos1,
    1479                 :            :                                                         CubitVector *pos2, 
    1480                 :            :                                                         double &distance )
    1481                 :            : {
    1482         [ #  # ]:          0 :   if( pos1 == pos2 )
    1483                 :          0 :     return CUBIT_FAILURE;
    1484                 :            : 
    1485 [ #  # ][ #  # ]:          0 :   if( NULL == pos1 || NULL == pos2 )
    1486                 :          0 :     return CUBIT_FAILURE;
    1487                 :            : 
    1488                 :          0 :   Surface* surf_ptr = get_surface_ptr();
    1489         [ #  # ]:          0 :   if (!surf_ptr)
    1490                 :            :   {
    1491 [ #  # ][ #  # ]:          0 :     PRINT_ERROR("RefFace %d is invalid -- no attached Surface.\n",id());
    1492                 :          0 :     return CUBIT_FAILURE;
    1493                 :            :   }
    1494                 :            :   
    1495                 :          0 :   return surf_ptr->get_projected_distance_on_surface( pos1, pos2, distance );
    1496                 :            : }
    1497                 :            : 
    1498                 :        114 : void RefFace::get_parent_ref_entities(DLIList<RefEntity*>& entity_list)
    1499                 :            : {
    1500                 :            : 
    1501                 :            :   // First get the type of RefEntity that is a child of "this" one
    1502         [ +  - ]:        114 :   DagType parent_type = get_parent_ref_entity_type();;
    1503                 :            : 
    1504         [ +  - ]:        114 :   DLIList<TopologyEntity*> tempList ;
    1505                 :            : 
    1506                 :            :   CubitStatus result = ModelQueryEngine::instance()->
    1507 [ +  - ][ +  - ]:        114 :       query_model( *this, parent_type, tempList );
    1508         [ -  + ]:        114 :   if (result == CUBIT_FAILURE)
    1509                 :            :   {
    1510 [ #  # ][ #  # ]:          0 :     PRINT_ERROR("In RefEntity::get_parent_ref_entities\n");
         [ #  # ][ #  # ]
    1511 [ #  # ][ #  # ]:          0 :     PRINT_ERROR("       Query failed for unknown reason.\n");
         [ #  # ][ #  # ]
    1512                 :        114 :     return;
    1513                 :            :   }
    1514                 :            : 
    1515         [ +  - ]:        114 :   entity_list.clean_out();
    1516 [ +  - ][ +  + ]:        228 :   for(int i=0; i<tempList.size(); i++)
         [ +  - ][ +  - ]
    1517                 :            :   {
    1518 [ +  - ][ +  - ]:        114 :     entity_list.append(static_cast<ParentType*>(tempList[i]));
                 [ +  - ]
    1519                 :        114 :   }
    1520 [ +  - ][ +  - ]:       6540 : }

Generated by: LCOV version 1.11