LCOV - code coverage report
Current view: top level - geom/Cholla - ChollaCurve.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 215 505 42.6 %
Date: 2020-06-30 00:58:45 Functions: 11 29 37.9 %
Branches: 265 1010 26.2 %

           Branch data     Line data    Source code
       1                 :            : //- Class:       ChollaCurve
       2                 :            : //- Description: Temporary class for constructing the facet-based geometry
       3                 :            : //-
       4                 :            : //- Owner:       Steven J. Owen
       5                 :            : //- Checked by:
       6                 :            : //- Version:
       7                 :            : 
       8                 :            : #include "CubitVector.hpp"
       9                 :            : #include "ChollaCurve.hpp"
      10                 :            : #include "ChollaSurface.hpp"
      11                 :            : #include "ChollaPoint.hpp"
      12                 :            : #include "TDGeomFacet.hpp"
      13                 :            : #include "CastTo.hpp"
      14                 :            : #include "CubitFacet.hpp"
      15                 :            : #include "CubitFacetData.hpp"
      16                 :            : #include "CubitFacetEdge.hpp"
      17                 :            : #include "CubitFacetEdgeData.hpp"
      18                 :            : #include "ChollaDebug.hpp"
      19                 :            : #include "GfxDebug.hpp"
      20                 :            : #include "CurveFacetEvalTool.hpp"
      21                 :            : #include "ChollaEngine.hpp"
      22                 :            : #include "ChollaVolume.hpp"
      23                 :            : #include "CubitMessage.hpp"
      24                 :            : 
      25                 :            : 
      26                 :            : //===============================================================================
      27                 :            : //Function:  ChollaCurve (PUBLIC) (constructor)
      28                 :            : //===============================================================================
      29 [ +  - ][ +  - ]:       3168 : ChollaCurve::ChollaCurve( int block_id )
                 [ +  - ]
      30                 :            : {
      31                 :            :   static int count = 1;
      32                 :       1584 :   id = count++;
      33                 :       1584 :   myCurve = NULL;
      34                 :       1584 :   myEvalTool = NULL;
      35                 :       1584 :   startPoint = NULL;
      36                 :       1584 :   endPoint = NULL;
      37                 :       1584 :   blockID = block_id;
      38                 :       1584 :   myLength = MYLENGTH_UNINITIALIZED;
      39                 :       1584 :   myMergePartner = NULL;
      40                 :       1584 : }
      41                 :            : 
      42                 :            : //===============================================================================
      43                 :            : //Function:  ~ChollaCurve (PUBLIC) (destructor)
      44                 :            : //===============================================================================
      45 [ +  - ][ +  - ]:       4752 : ChollaCurve::~ChollaCurve()
                 [ +  - ]
      46                 :            : {
      47         [ -  + ]:       3168 : }
      48                 :            : 
      49                 :            : //===============================================================================
      50                 :            : //Function:  remove_td_associativity (PUBLIC)
      51                 :            : //===============================================================================
      52                 :         55 : void ChollaCurve::remove_td_associativity( ChollaSurface *fsm_ptr )
      53                 :            : {
      54                 :            :   int i;
      55                 :            :   TDGeomFacet *td;
      56                 :            :   FacetEntity *edge_ptr;
      57         [ +  + ]:        187 :   for(i=0; i<curveEdgeList.size(); i++)
      58                 :            :   {
      59                 :        132 :     edge_ptr = curveEdgeList.get_and_step();
      60                 :        132 :     td = TDGeomFacet::get_geom_facet( edge_ptr );
      61         [ +  - ]:        132 :     if (td)
      62                 :            :     {
      63                 :        132 :       td->remove_cholla_curve( this );
      64                 :        132 :       td->remove_cholla_surf( fsm_ptr );
      65                 :            :     }
      66                 :            :   }
      67                 :         55 : }
      68                 :            : 
      69                 :            : 
      70                 :            : //=============================================================================
      71                 :            : //Function:  get_ends (PUBLIC)
      72                 :            : //Description: returns the end locations of the curve.  Determines their
      73                 :            : //             location if not yet defined
      74                 :            : //Author: sjowen
      75                 :            : //Date: 12/4/00
      76                 :            : //=============================================================================
      77                 :          0 : CubitStatus ChollaCurve::get_ends( CubitVector &start, CubitVector &end )
      78                 :            : {
      79 [ #  # ][ #  # ]:          0 :   if (startPoint && endPoint)
      80                 :            :   {
      81         [ #  # ]:          0 :     start = startPoint->coordinates();
      82         [ #  # ]:          0 :     end = endPoint->coordinates();
      83                 :            :   }
      84                 :            :   else
      85                 :            :   {
      86                 :          0 :     CubitStatus stat = determine_ends();
      87         [ #  # ]:          0 :     if (stat == CUBIT_FAILURE)
      88                 :          0 :       return stat;
      89         [ #  # ]:          0 :     start = startPoint->coordinates();
      90         [ #  # ]:          0 :     end = endPoint->coordinates();
      91                 :            :   }
      92                 :          0 :   return CUBIT_SUCCESS;
      93                 :            : }
      94                 :            : 
      95                 :            : //=============================================================================
      96                 :            : //Function:  get_ends (PUBLIC)
      97                 :            : //Description: returns the end nodes of the curve.  Determines the
      98                 :            : //             nodes if not yet defined
      99                 :            : //Author: sjowen
     100                 :            : //Date: 12/4/00
     101                 :            : //=============================================================================
     102                 :       4026 : CubitStatus ChollaCurve::get_ends( CubitPoint *&start_ptr, CubitPoint *&end_ptr )
     103                 :            : {  
     104 [ +  - ][ +  - ]:       4026 :   if (startPoint && endPoint )
     105                 :            :   {
     106                 :       4026 :     start_ptr = startPoint;
     107                 :       4026 :     end_ptr = endPoint;
     108                 :            :   } 
     109                 :            :   else
     110                 :            :   {
     111                 :          0 :     CubitStatus stat = determine_ends();
     112         [ #  # ]:          0 :     if (stat == CUBIT_FAILURE)
     113                 :          0 :       return stat;
     114                 :          0 :     start_ptr = startPoint;
     115                 :          0 :     end_ptr = endPoint;
     116                 :            :   }
     117                 :       4026 :   return CUBIT_SUCCESS;
     118                 :            : }
     119                 :            : 
     120                 :            : //=============================================================================
     121                 :            : //Function:  split_curve (PRIVATE)
     122                 :            : //Description: split this curve into multiple ChollaCurve where there are
     123                 :            : //             discontinuous strings of edges.  Define start and end nodes
     124                 :            : //             for each curve while we are at it
     125                 :            : //Author: sjowen
     126                 :            : //Date: 12/4/00
     127                 :            : //=============================================================================
     128                 :        594 : CubitStatus ChollaCurve::split_curve(
     129                 :            :   DLIList<ChollaCurve*> &facet_curve_list)
     130                 :            : {
     131         [ +  - ]:        594 :   DLIList<ChollaCurve*> new_curve_list;
     132                 :            : 
     133                 :            :   // Go through the curveEdgeList and pull edges off one by one as we
     134                 :            :   // determine which curve it belongs to.  Continue until we have depleted
     135                 :            :   // the list
     136                 :            : 
     137                 :        594 :   int periodic = 0;
     138         [ +  - ]:        594 :   int start_size = curveEdgeList.size();
     139                 :        594 :   int icount = 0;
     140                 :            : 
     141         [ +  - ]:        594 :   curveEdgeList.reset();
     142 [ +  - ][ +  + ]:       1474 :   while( curveEdgeList.size() > 0)
     143                 :            :   {
     144                 :            : 
     145                 :            :     // First, find an edge that has a start point on it
     146                 :            : 
     147         [ +  - ]:        880 :     CubitFacetEdge *start_edge_ptr = (CubitFacetEdge *)curveEdgeList.get_and_step();
     148         [ +  - ]:        880 :     CubitPoint *point0_ptr = start_edge_ptr->point(0);
     149         [ +  - ]:        880 :     CubitPoint *point1_ptr = start_edge_ptr->point(1);
     150                 :        880 :     CubitPoint *start_point = NULL;
     151         [ +  + ]:        880 :     if (periodic)
     152                 :            :     {
     153                 :         66 :       start_point = startPoint;
     154                 :            :     }
     155                 :            :     else
     156                 :            :     {
     157 [ +  - ][ +  + ]:        814 :       if (next_edge( point0_ptr, start_edge_ptr ) == NULL)
     158                 :        528 :         start_point = point0_ptr;
     159 [ +  - ][ -  + ]:        286 :       else if(next_edge( point1_ptr, start_edge_ptr ) == NULL)
     160                 :          0 :         start_point = point1_ptr;
     161                 :            :     }
     162 [ +  + ][ -  + ]:        880 :     if (start_point != NULL || periodic)
     163                 :            :     {
     164                 :            : 
     165                 :            :       // create a new curve to hold the edge info
     166                 :            : 
     167         [ +  - ]:        594 :       TDGeomFacet *td_gm_edge = TDGeomFacet::get_geom_facet(start_edge_ptr);
     168 [ +  - ][ +  - ]:        594 :       int block_id = (td_gm_edge == NULL) ? -1 : td_gm_edge->get_block_id();
     169 [ +  - ][ +  - ]:        594 :       ChollaCurve *fcm_ptr = new ChollaCurve( block_id );
     170         [ +  - ]:        594 :       new_curve_list.append( fcm_ptr );
     171                 :            :       
     172                 :            :       // assign the edges to the new curve in the correct order and orientation
     173                 :            :       
     174         [ +  - ]:        594 :       CubitStatus rv = fcm_ptr->build_curve_from_edges( start_point,  periodic, start_size, start_edge_ptr, this );
     175         [ -  + ]:        594 :       if (rv != CUBIT_SUCCESS)
     176                 :          0 :         return rv;
     177                 :            :       
     178                 :            :       // remove the edges in the new curve from this curve
     179                 :            :       
     180                 :            :       int ii;
     181 [ +  - ][ +  - ]:        594 :       DLIList<FacetEntity *> flist = fcm_ptr->get_facet_list();
     182 [ +  - ][ +  - ]:       1188 :       DLIList<CubitFacetEdge *> elist;
     183                 :            :       CubitFacetEdge *edge_ptr;
     184 [ +  - ][ +  - ]:       1342 :       CAST_LIST( flist, elist, CubitFacetEdge );
         [ +  - ][ -  + ]
         [ +  - ][ +  - ]
                 [ +  + ]
     185 [ +  - ][ +  + ]:       1342 :       for ( ii = elist.size(); ii > 0; ii-- ) 
     186                 :            :       {
     187         [ +  - ]:        748 :         edge_ptr = elist.get_and_step();
     188         [ +  - ]:        748 :         curveEdgeList.remove( edge_ptr );
     189                 :            :       }
     190         [ +  - ]:        594 :       start_size = curveEdgeList.size();
     191                 :        594 :       icount = 0;
     192         [ +  - ]:        594 :       periodic = 0;
     193                 :            :     }
     194                 :            : 
     195                 :            :     // if we have gone through all of the edges without finding an end,
     196                 :            :     // then we have a periodic curve.  Choose an arbirary node to act as
     197                 :            :     // the beginning and end
     198                 :            : 
     199 [ +  - ][ +  + ]:        880 :     if (curveEdgeList.size() > 0)
     200                 :            :     {
     201                 :        286 :       icount++;
     202         [ +  + ]:        286 :       if (icount > start_size)
     203                 :            :       {
     204         [ +  - ]:         66 :         curveEdgeList.reset();
     205         [ +  - ]:         66 :         CubitFacetEdge *edge = (CubitFacetEdge *)curveEdgeList.get();
     206         [ +  - ]:         66 :         CubitPoint *point_ptr = edge->point(0);
     207                 :         66 :         startPoint = point_ptr;
     208                 :         66 :         endPoint = point_ptr;
     209                 :        286 :         periodic = 1;
     210                 :            :       }
     211                 :            :     }
     212                 :            :   }
     213                 :            : 
     214                 :            :   // add the new curves to the global curve list
     215                 :            : 
     216                 :            :   int ii, jj;
     217 [ +  - ][ +  + ]:       1188 :   for (ii=new_curve_list.size(); ii>0; ii--)
     218                 :            :   {
     219         [ +  - ]:        594 :     ChollaCurve *fcm_ptr = new_curve_list.get_and_step();
     220                 :            : 
     221         [ +  - ]:        594 :     facet_curve_list.append( fcm_ptr );
     222                 :            : 
     223                 :            :     // update the surface info
     224                 :            : 
     225 [ +  - ][ +  + ]:       1716 :     for (jj=surfaceList.size(); jj>0; jj--)
     226                 :            :     {
     227         [ +  - ]:       1122 :       ChollaSurface *fsm_ptr = surfaceList.get_and_step();
     228         [ +  - ]:       1122 :       fcm_ptr->add_surface( fsm_ptr );
     229         [ +  - ]:       1122 :       fsm_ptr->remove_curve( this );
     230         [ +  - ]:       1122 :       fsm_ptr->add_curve( fcm_ptr );
     231                 :            :     }
     232                 :            : 
     233                 :            :     // update the geometric curve pointer
     234                 :            : 
     235         [ +  - ]:        594 :     fcm_ptr->assign_geometric_curve( NULL );
     236                 :            : 
     237                 :            :     // update the curve pointers in the edge tool data
     238                 :            : 
     239 [ +  - ][ +  - ]:        594 :     DLIList<FacetEntity*> facet_list = fcm_ptr->get_facet_list();
     240 [ +  - ][ +  + ]:       1342 :     for (jj=facet_list.size(); jj > 0; jj--)
     241                 :            :     {
     242         [ +  - ]:        748 :       FacetEntity *edge_ptr = facet_list.get_and_step();
     243         [ +  - ]:        748 :       TDGeomFacet *td_gm_edge = TDGeomFacet::get_geom_facet(edge_ptr);
     244         [ +  - ]:        748 :       td_gm_edge->remove_cholla_curve( this );
     245         [ +  - ]:        748 :       td_gm_edge->add_cholla_curve( fcm_ptr );
     246                 :            :     }
     247         [ +  - ]:        594 :   }
     248                 :            : 
     249         [ +  - ]:        594 :   return CUBIT_SUCCESS;
     250                 :            : }
     251                 :            : 
     252                 :            : //=============================================================================
     253                 :            : //Function: build_curve_from_edges 
     254                 :            : //Description: insert the ordered and oriented edges into this cholla curve
     255                 :            : //Notes:  traverses starting at start_point and gathers facet edges until it 
     256                 :            : //        runs into another curve.
     257                 :            : //        start_point is an existing CubitPoint at either end of the curve
     258                 :            : //        max_edges is the maximum number of edges on this curve.  should be 
     259                 :            : //        known beforehand (used for error checking).
     260                 :            : //
     261                 :            : // ***this function used to be part of split_curve. ***
     262                 :            : //Author: sjowen
     263                 :            : //Return: 
     264                 :            : //Date: 09/07/2009
     265                 :            : //=============================================================================
     266                 :        594 : CubitStatus ChollaCurve::build_curve_from_edges( CubitPoint *start_point,
     267                 :            :                                                 int periodic,
     268                 :            :                                                 int max_edges,
     269                 :            :                                                 CubitFacetEdge *start_edge_ptr,
     270                 :            :                                                 ChollaCurve *parent_curve )
     271                 :            : {
     272                 :            :   
     273                 :            :   // find the first edge.  Match the chollacurve owner with this curve
     274                 :            :   // do this only if the start_edge_ptr was not passed in
     275                 :            :   
     276         [ +  - ]:        594 :   DLIList<CubitFacetEdge *> point_edge_list;
     277         [ +  - ]:        594 :   start_point->edges(point_edge_list);
     278                 :            :   CubitFacetEdge *edge_ptr;
     279         [ -  + ]:        594 :   if (start_edge_ptr == NULL)
     280                 :            :   {
     281 [ #  # ][ #  # ]:          0 :     for (int ii=0; ii<point_edge_list.size() && !start_edge_ptr; ii++)
         [ #  # ][ #  # ]
     282                 :            :     {
     283         [ #  # ]:          0 :       edge_ptr = point_edge_list.get_and_step();
     284         [ #  # ]:          0 :       TDGeomFacet *td_geom = TDGeomFacet::get_geom_facet( edge_ptr );
     285                 :            :       
     286                 :            :       // assumes that the TDGeomFacet info has already been set up for the edges
     287         [ #  # ]:          0 :       assert(td_geom != NULL);
     288                 :            :       
     289         [ #  # ]:          0 :       DLIList<ChollaCurve *> cholla_curves;
     290         [ #  # ]:          0 :       td_geom->get_cholla_curves(cholla_curves);
     291                 :            :       
     292                 :            :       // currently should be only one-to-one relationship
     293                 :            :       // could also be edge on surface in which case no curves associated
     294 [ #  # ][ #  # ]:          0 :       assert(cholla_curves.size() <= 1);
     295 [ #  # ][ #  # ]:          0 :       if (cholla_curves.size())
     296                 :            :       {
     297 [ #  # ][ #  # ]:          0 :         if (cholla_curves.get() == this)
     298                 :          0 :           start_edge_ptr = edge_ptr;
     299                 :            :       }
     300         [ #  # ]:          0 :     }
     301         [ #  # ]:          0 :     assert(start_edge_ptr != NULL);  // didn't find an edge that marched this chollacurve
     302                 :            :   }
     303                 :            :   
     304                 :            :   // create a new curve to hold the edge info
     305                 :            :   
     306         [ +  - ]:        594 :   this->set_start( start_point );
     307         [ +  - ]:        594 :   start_point->set_as_feature();
     308                 :            :   
     309         [ +  - ]:        594 :   this->add_facet( start_edge_ptr );
     310                 :        594 :   int iedgecount = 0;
     311                 :        594 :   edge_ptr = start_edge_ptr;
     312                 :        594 :   CubitPoint *point0_ptr = start_point, *point1_ptr;
     313                 :        594 :   CubitPoint *end_point = NULL;
     314         [ +  + ]:       1342 :   while(!end_point)
     315                 :            :   {
     316         [ +  - ]:        748 :     point1_ptr = edge_ptr->other_point( point0_ptr );
     317 [ +  - ][ +  + ]:        748 :     if ((edge_ptr = parent_curve->next_edge( point1_ptr, edge_ptr )) == NULL)
     318                 :            :     {
     319                 :        594 :       end_point = point1_ptr;
     320                 :            :     }
     321                 :            :     else
     322                 :            :     {
     323                 :        154 :       iedgecount++;
     324         [ -  + ]:        154 :       if (iedgecount > max_edges)
     325                 :            :       {
     326 [ #  # ][ #  # ]:          0 :         PRINT_ERROR("ChollaCurve has start, but no end\n");
         [ #  # ][ #  # ]
     327                 :          0 :         return CUBIT_FAILURE;
     328                 :            :       }
     329                 :            :       
     330         [ +  - ]:        154 :       this->add_facet( edge_ptr );
     331 [ +  - ][ -  + ]:        154 :       if (periodic && point1_ptr == start_point)
     332                 :          0 :         end_point = start_point;
     333                 :        154 :       point0_ptr = point1_ptr;
     334                 :            :     }
     335                 :            :   }
     336         [ +  - ]:        594 :   this->set_end( end_point );
     337         [ +  - ]:        594 :   end_point->set_as_feature();
     338                 :            :   
     339                 :            :   // make sure all the edges are oriented correctly
     340                 :            :   
     341                 :            :   int i;
     342 [ +  - ][ +  - ]:       1188 :   DLIList<FacetEntity *> flist = this->get_facet_list();
                 [ +  - ]
     343         [ +  - ]:        594 :   flist.reset();
     344 [ +  - ][ +  - ]:       1188 :   DLIList<CubitFacetEdge *> elist;
     345 [ +  - ][ +  - ]:       1342 :   CAST_LIST( flist, elist, CubitFacetEdge );
         [ +  - ][ -  + ]
         [ +  - ][ +  - ]
                 [ +  + ]
     346         [ +  - ]:        594 :   elist.reset();
     347                 :        594 :   CubitPoint *cur_pt = start_point, *tmp_pt;
     348 [ +  - ][ +  + ]:       1342 :   for ( i = elist.size(); i > 0; i-- ) 
     349                 :            :   {
     350         [ +  - ]:        748 :     edge_ptr = elist.get_and_step();
     351         [ +  - ]:        748 :     point0_ptr = edge_ptr->point(0);
     352         [ +  - ]:        748 :     point1_ptr = edge_ptr->point(1);
     353         [ -  + ]:        748 :     if (point0_ptr != cur_pt)
     354                 :            :     {
     355         [ #  # ]:          0 :       assert( cur_pt == point1_ptr );
     356         [ #  # ]:          0 :       edge_ptr->flip();
     357                 :          0 :       tmp_pt = point0_ptr;
     358                 :          0 :       point0_ptr = point1_ptr;
     359                 :          0 :       point1_ptr = tmp_pt;
     360 [ #  # ][ #  # ]:          0 :       assert( point0_ptr == edge_ptr->point(0) &&
                 [ #  # ]
     361         [ #  # ]:          0 :              point1_ptr == edge_ptr->point(1) );
     362                 :            :     }
     363                 :        748 :     cur_pt = point1_ptr;
     364                 :            :   }
     365                 :            :   
     366                 :        594 :   int mydebug = 0;
     367         [ -  + ]:        594 :   if (mydebug)
     368                 :            :   {
     369                 :            :     int i;
     370 [ #  # ][ #  # ]:          0 :     DLIList<FacetEntity *> flist = this->get_facet_list();
     371         [ #  # ]:          0 :     flist.reset();
     372 [ #  # ][ #  # ]:          0 :     DLIList<CubitFacetEdge *> elist;
     373 [ #  # ][ #  # ]:          0 :     CAST_LIST( flist, elist, CubitFacetEdge );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     374         [ #  # ]:          0 :     elist.reset();
     375 [ #  # ][ #  # ]:          0 :     for ( i = elist.size(); i > 0; i-- ) {  
     376         [ #  # ]:          0 :       CubitFacetEdge *edge = elist.get_and_step();
     377 [ #  # ][ #  # ]:          0 :       CubitVector pt0_v = edge->point(0)->coordinates();
     378 [ #  # ][ #  # ]:          0 :       CubitVector pt1_v = edge->point(1)->coordinates();
     379         [ #  # ]:          0 :       GfxDebug::draw_point(pt0_v, CUBIT_GREEN_INDEX );
     380         [ #  # ]:          0 :       GfxDebug::draw_point(pt1_v, CUBIT_RED_INDEX );
     381         [ #  # ]:          0 :       GfxDebug::draw_line( pt0_v, pt1_v, CUBIT_YELLOW_INDEX );
     382         [ #  # ]:          0 :       GfxDebug::flush();
     383                 :          0 :       int view = 0;
     384         [ #  # ]:          0 :       if (view)
     385         [ #  # ]:          0 :         dview();
     386         [ #  # ]:          0 :     }
     387                 :            :   }
     388         [ +  - ]:        594 :   return CUBIT_SUCCESS;
     389                 :            : }
     390                 :            : 
     391                 :        594 : CubitStatus ChollaCurve::order_edges()
     392                 :            : {
     393                 :            :   int i;
     394                 :        594 :   bool periodic = false;
     395         [ -  + ]:        594 :   if (NULL == startPoint)
     396                 :            :   {
     397 [ #  # ][ #  # ]:          0 :     DLIList<ChollaPoint *>  cholla_points = get_points();
     398         [ #  # ]:          0 :     periodic = (cholla_points.size() == 1);
     399                 :            : 
     400         [ #  # ]:          0 :     ChollaPoint *chpt = cholla_points.get();
     401 [ #  # ][ #  # ]:          0 :     CubitPoint *start_point = dynamic_cast<CubitPoint *> (chpt->get_facets());
     402                 :            : 
     403         [ #  # ]:          0 :     this->set_start( start_point );
     404         [ #  # ]:          0 :     if (NULL == start_point)
     405                 :          0 :       return CUBIT_FAILURE;
     406         [ #  # ]:          0 :     start_point->set_as_feature();
     407                 :            : 
     408         [ #  # ]:          0 :     if (periodic)
     409                 :            :     {
     410         [ #  # ]:          0 :       this->set_end(start_point);
     411                 :            :     }
     412                 :            :     else
     413                 :            :     {
     414         [ #  # ]:          0 :       chpt = cholla_points.step_and_get();
     415 [ #  # ][ #  # ]:          0 :       CubitPoint *end_point = dynamic_cast<CubitPoint *> (chpt->get_facets());
     416         [ #  # ]:          0 :       if (NULL == end_point)
     417                 :          0 :         return CUBIT_FAILURE;
     418         [ #  # ]:          0 :       this->set_end(end_point);
     419 [ #  # ][ #  # ]:          0 :       end_point->set_as_feature();
                 [ #  # ]
     420                 :          0 :     }
     421                 :            :   }
     422                 :            : 
     423         [ -  + ]:        594 :   assert(startPoint);  
     424         [ -  + ]:        594 :   assert(endPoint);
     425                 :            : 
     426 [ +  - ][ +  + ]:        594 :   if (curveEdgeList.size() > 1)
     427                 :            :   {    
     428         [ +  - ]:         66 :     DLIList<CubitFacetEdge*> edges_ordered;
     429 [ +  - ][ +  - ]:        286 :     CAST_LIST(curveEdgeList, edges_ordered, CubitFacetEdge);
         [ +  - ][ -  + ]
         [ +  - ][ +  - ]
                 [ +  + ]
     430                 :            :     
     431         [ +  - ]:         66 :     CubitStatus stat = CubitFacetEdge::order_edge_list(edges_ordered, startPoint, endPoint);
     432                 :            : 
     433         [ -  + ]:         66 :     if (CUBIT_FAILURE == stat)
     434                 :          0 :       return CUBIT_FAILURE;
     435                 :            : 
     436                 :            :     // store the edges in the correct order
     437         [ +  - ]:         66 :     clean_out_edges();    
     438                 :            : 
     439         [ +  - ]:         66 :     edges_ordered.reset();
     440 [ +  - ][ +  + ]:        286 :     for (i=0; i< edges_ordered.size(); i++)
         [ +  - ][ +  - ]
     441                 :            :     {      
     442 [ +  - ][ +  - ]:        220 :       this->add_facet(edges_ordered.get_and_step());     
     443                 :         66 :     }    
     444                 :            :   }
     445                 :            : 
     446                 :            :   
     447                 :            :   // make sure all the edges are oriented correctly
     448 [ +  - ][ +  - ]:        594 :   DLIList<FacetEntity *> flist = this->get_facet_list();
     449         [ +  - ]:        594 :   flist.reset();
     450 [ +  - ][ +  - ]:       1188 :   DLIList<CubitFacetEdge *> elist;
     451 [ +  - ][ +  - ]:       1342 :   CAST_LIST( flist, elist, CubitFacetEdge );
         [ +  - ][ -  + ]
         [ +  - ][ +  - ]
                 [ +  + ]
     452         [ +  - ]:        594 :   elist.reset();
     453                 :        594 :   CubitPoint *cur_pt = startPoint, *tmp_pt;
     454 [ +  - ][ +  + ]:       1342 :   for ( i = elist.size(); i > 0; i-- ) 
     455                 :            :   {
     456         [ +  - ]:        748 :     CubitFacetEdge *edge_ptr = elist.get_and_step();
     457         [ +  - ]:        748 :     CubitPoint *point0_ptr = edge_ptr->point(0);
     458         [ +  - ]:        748 :     CubitPoint *point1_ptr = edge_ptr->point(1);
     459         [ +  + ]:        748 :     if (point0_ptr != cur_pt)
     460                 :            :     {
     461         [ -  + ]:         44 :       assert( cur_pt == point1_ptr );
     462         [ +  - ]:         44 :       edge_ptr->flip();
     463                 :         44 :       tmp_pt = point0_ptr;
     464                 :         44 :       point0_ptr = point1_ptr;
     465                 :         44 :       point1_ptr = tmp_pt;
     466 [ +  - ][ +  - ]:         88 :       assert( point0_ptr == edge_ptr->point(0) &&
                 [ -  + ]
     467         [ +  - ]:         44 :              point1_ptr == edge_ptr->point(1) );
     468                 :            :     }
     469                 :        748 :     cur_pt = point1_ptr;
     470                 :            :   }
     471                 :            :   
     472                 :        594 :   int mydebug = 0;
     473         [ -  + ]:        594 :   if (mydebug)
     474                 :            :   {
     475                 :            :     int i;
     476 [ #  # ][ #  # ]:          0 :     DLIList<FacetEntity *> flist = this->get_facet_list();
     477         [ #  # ]:          0 :     flist.reset();
     478 [ #  # ][ #  # ]:          0 :     DLIList<CubitFacetEdge *> elist;
     479 [ #  # ][ #  # ]:          0 :     CAST_LIST( flist, elist, CubitFacetEdge );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     480         [ #  # ]:          0 :     elist.reset();
     481 [ #  # ][ #  # ]:          0 :     for ( i = elist.size(); i > 0; i-- ) {  
     482         [ #  # ]:          0 :       CubitFacetEdge *edge = elist.get_and_step();
     483 [ #  # ][ #  # ]:          0 :       CubitVector pt0_v = edge->point(0)->coordinates();
     484 [ #  # ][ #  # ]:          0 :       CubitVector pt1_v = edge->point(1)->coordinates();
     485         [ #  # ]:          0 :       GfxDebug::draw_point(pt0_v, CUBIT_GREEN_INDEX );
     486         [ #  # ]:          0 :       GfxDebug::draw_point(pt1_v, CUBIT_RED_INDEX );
     487         [ #  # ]:          0 :       GfxDebug::draw_line( pt0_v, pt1_v, CUBIT_YELLOW_INDEX );
     488         [ #  # ]:          0 :       GfxDebug::flush();
     489                 :          0 :       int view = 0;
     490         [ #  # ]:          0 :       if (view)
     491         [ #  # ]:          0 :         dview();
     492         [ #  # ]:          0 :     }
     493                 :            :   }
     494         [ +  - ]:        594 :   return CUBIT_SUCCESS;
     495                 :            : }
     496                 :            : 
     497                 :            : //=============================================================================
     498                 :            : //Function: length
     499                 :            : //Description: 
     500                 :            : //Author: sjowen
     501                 :            : //Date: 04/21/2009
     502                 :            : //============================================================================
     503                 :          0 : double ChollaCurve::length()
     504                 :            : {
     505         [ #  # ]:          0 :   if (myLength > MYLENGTH_UNINITIALIZED)
     506                 :          0 :     return myLength;
     507                 :            :   
     508                 :            :   CubitFacetEdge *edge;
     509                 :            :   FacetEntity *fent;
     510                 :          0 :   myLength = 0.0;
     511         [ #  # ]:          0 :   for (int iedge=0; iedge<curveEdgeList.size(); iedge++)
     512                 :            :   {
     513                 :          0 :     fent = curveEdgeList.get_and_step();
     514         [ #  # ]:          0 :     edge = dynamic_cast<CubitFacetEdge *> (fent);
     515                 :          0 :     myLength += edge->length();
     516                 :            :   }
     517                 :            :   
     518                 :          0 :   return myLength;
     519                 :            : }
     520                 :            : 
     521                 :            : //=============================================================================
     522                 :            : //Function: find adjacent edges at a point that lie on the curve 
     523                 :            : //Description: determine the next edge from a given edge - return NULL if at the end
     524                 :            : //Author: william roshan quadros
     525                 :            : //Return: returns false if no adj_edges can be found
     526                 :            : //Date: 04/21/2009
     527                 :            : //=============================================================================
     528                 :          0 : bool ChollaCurve::adj_facet_edges( CubitPoint *node_ptr, CubitFacetEdge *&adj_edge1, CubitFacetEdge *&adj_edge2 )
     529                 :            : {
     530                 :            :   // initialize adj_edge1 and adj_edge2
     531                 :          0 :   adj_edge1 = adj_edge2 = NULL;
     532                 :            : 
     533         [ #  # ]:          0 :   DLIList<CubitFacetEdge*> node_edge_list;
     534         [ #  # ]:          0 :   node_ptr->edges( node_edge_list );
     535                 :            : 
     536 [ #  # ][ #  # ]:          0 :   DLIList<CubitFacetEdge*> curve_edge_list; 
     537 [ #  # ][ #  # ]:          0 :   CAST_LIST(curveEdgeList, curve_edge_list, CubitFacetEdge);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     538                 :            : 
     539         [ #  # ]:          0 :   curve_edge_list.intersect(node_edge_list);
     540 [ #  # ][ #  # ]:          0 :   assert(curve_edge_list.size() < 3);
     541                 :            : 
     542 [ #  # ][ #  # ]:          0 :   if (0 == curve_edge_list.size())
     543                 :          0 :     return false;
     544                 :            : 
     545         [ #  # ]:          0 :   curve_edge_list.reset();
     546         [ #  # ]:          0 :   adj_edge1 = curve_edge_list.get();
     547                 :            : 
     548 [ #  # ][ #  # ]:          0 :   if (curve_edge_list.size() > 1)
     549         [ #  # ]:          0 :     adj_edge2 = curve_edge_list.next();
     550                 :            : 
     551         [ #  # ]:          0 :   return true;
     552                 :            : }
     553                 :            : 
     554                 :            : //=============================================================================
     555                 :            : //Function:  next_edge (PRIVATE)
     556                 :            : //Description: determine the next edge from a given edge - return NULL if at
     557                 :            : //             the end
     558                 :            : //Author: sjowen
     559                 :            : //Date: 12/4/00
     560                 :            : //=============================================================================
     561                 :       2904 : CubitFacetEdge *ChollaCurve::next_edge( CubitPoint *node_ptr,
     562                 :            :                                         CubitFacetEdge *edge_ptr )
     563                 :            : {
     564                 :            :   // check if this node has its hit flag set - we are at a feature break.
     565                 :            : 
     566         [ +  - ]:       2904 :   TDGeomFacet *td_gm_node = TDGeomFacet::get_geom_facet(node_ptr);
     567 [ +  - ][ +  + ]:       2904 :   if (td_gm_node->get_hit_flag() == 1 || node_ptr->is_feature())
         [ +  - ][ +  + ]
                 [ +  + ]
     568                 :       1826 :     return NULL;
     569                 :            : 
     570                 :            :   int jj, kk;
     571                 :            : 
     572                 :            :   // find the next edge
     573                 :            : 
     574                 :       1078 :   CubitFacetEdge *next_edge_on_curve = NULL;
     575         [ +  - ]:       1078 :   DLIList<CubitFacetEdge*> edge_list;
     576         [ +  - ]:       1078 :   node_ptr->edges( edge_list );
     577                 :       1078 :   int num_adj_curves = 1;  // keep track of the number of curves at this node
     578 [ +  - ][ +  + ]:       3993 :   for (jj=0; jj<edge_list.size(); jj++)
     579                 :            :   {
     580         [ +  - ]:       3267 :     CubitFacetEdge *node_edge_ptr = edge_list.get_and_step();
     581         [ +  + ]:       3267 :     if (node_edge_ptr != edge_ptr)
     582                 :            :     {
     583         [ +  - ]:       2299 :       TDGeomFacet *td_gm_edge = TDGeomFacet::get_geom_facet(node_edge_ptr);
     584         [ +  + ]:       2299 :       if (td_gm_edge != NULL)
     585                 :            :       {
     586         [ +  - ]:       1430 :         DLIList<ChollaCurve*> fcurve_list;
     587         [ +  - ]:       1430 :         td_gm_edge->get_cholla_curves( fcurve_list );
     588 [ +  - ][ +  - ]:       1430 :         if (fcurve_list.size() > 0)
     589                 :            :         {
     590                 :            : 
     591                 :            :           // if 3 or more curves meet at this node, then force the curve to terminate here
     592                 :            : 
     593                 :       1430 :           num_adj_curves++;
     594         [ +  + ]:       1430 :           if (num_adj_curves >= 3)
     595                 :            :           {
     596                 :        352 :             return NULL;
     597                 :            :           }
     598                 :            : 
     599                 :            :           // otherwise try to match the curve to the edge to find the next edge
     600                 :            : 
     601 [ +  - ][ +  + ]:       2508 :           for (kk=0; kk<fcurve_list.size(); kk++)
         [ +  - ][ +  + ]
     602                 :            :           {
     603         [ +  - ]:       1078 :             ChollaCurve *fcm_ptr = fcurve_list.get_and_step();
     604         [ +  + ]:       1078 :             if (fcm_ptr == this)
     605                 :            :             {
     606                 :        726 :               next_edge_on_curve = node_edge_ptr;
     607                 :            :             }
     608                 :            :           }
     609                 :       2299 :         }
     610                 :            :       }
     611                 :            :     }
     612                 :            :   }
     613         [ +  - ]:       2904 :   return next_edge_on_curve;
     614                 :            : }
     615                 :            : 
     616                 :            : 
     617                 :            : //=============================================================================
     618                 :            : //Function:  determine_ends (PRIVATE)
     619                 :            : //Description: determine the end nodes of the curve
     620                 :            : //             Assumes that there is one continuous string of edges
     621                 :            : //             (may need to call split_curve first)
     622                 :            : //Author: sjowen
     623                 :            : //Date: 12/4/00
     624                 :            : //=============================================================================
     625                 :          0 : CubitStatus ChollaCurve::determine_ends( )
     626                 :            : {
     627                 :            :   int ii, jj, kk, inode;
     628                 :            :   CubitFacetEdge *edge_ptr;
     629                 :            :   CubitPoint *node0_ptr, *node1_ptr, *node_ptr;
     630                 :          0 :   startPoint = endPoint = NULL;
     631                 :          0 :   int done = 0;
     632 [ #  # ][ #  # ]:          0 :   for(ii=0; ii<curveEdgeList.size() && !done; ii++)
                 [ #  # ]
     633                 :            :   {
     634                 :          0 :     edge_ptr = (CubitFacetEdge *)curveEdgeList.get_and_step();
     635                 :          0 :     node0_ptr = edge_ptr->point(0);
     636                 :          0 :     node1_ptr = edge_ptr->point(1);
     637 [ #  # ][ #  # ]:          0 :     for (inode=0; inode<2 && !done; inode++)
     638                 :            :     {
     639         [ #  # ]:          0 :       node_ptr = (inode==0) ? node0_ptr : node1_ptr;
     640         [ #  # ]:          0 :       DLIList<CubitFacetEdge*> edge_list;
     641         [ #  # ]:          0 :       node_ptr->edges( edge_list );
     642 [ #  # ][ #  # ]:          0 :       for (jj=0; jj<edge_list.size() && !done; jj++)
         [ #  # ][ #  # ]
     643                 :            :       {
     644         [ #  # ]:          0 :         CubitFacetEdge *node_edge_ptr = edge_list.get_and_step();
     645         [ #  # ]:          0 :         if (node_edge_ptr != edge_ptr)
     646                 :            :         {
     647         [ #  # ]:          0 :           TDGeomFacet *td_gm_edge = TDGeomFacet::get_geom_facet(node_edge_ptr);
     648         [ #  # ]:          0 :           if (td_gm_edge != NULL)
     649                 :            :           {
     650                 :          0 :             int found = 0;
     651         [ #  # ]:          0 :             DLIList<ChollaCurve*> fcurve_list;
     652         [ #  # ]:          0 :             td_gm_edge->get_cholla_curves( fcurve_list );
     653 [ #  # ][ #  # ]:          0 :             for (kk=0; kk<fcurve_list.size() && !found; kk++)
         [ #  # ][ #  # ]
     654                 :            :             {
     655         [ #  # ]:          0 :               ChollaCurve *fcm_ptr = fcurve_list.get_and_step();
     656         [ #  # ]:          0 :               if (fcm_ptr == this)
     657                 :          0 :                 found = 1;
     658                 :            :             }
     659         [ #  # ]:          0 :             if (!found)
     660                 :            :             {
     661         [ #  # ]:          0 :               if (startPoint == NULL)
     662                 :            :               {
     663                 :          0 :                 startPoint = node_ptr;
     664                 :            :               }
     665                 :            :               else
     666                 :            :               {
     667                 :          0 :                 endPoint = node_ptr;
     668                 :          0 :                 done = 1;
     669                 :            :               }
     670         [ #  # ]:          0 :             }
     671                 :            :           }
     672                 :            :         }
     673                 :            :       }
     674         [ #  # ]:          0 :     }
     675                 :            : 
     676                 :            :   }
     677                 :            : 
     678                 :            :   // check for periodic condition - just choose an arbitrary node to serve as
     679                 :            :   // both start and end of the curve
     680                 :            : 
     681 [ #  # ][ #  # ]:          0 :   if (startPoint == NULL && endPoint == NULL)
     682                 :            :   {
     683                 :          0 :     curveEdgeList.reset();
     684                 :          0 :     edge_ptr = (CubitFacetEdge *)curveEdgeList.get();
     685                 :          0 :     node_ptr = edge_ptr->point(0);
     686                 :          0 :     startPoint = node_ptr;
     687                 :          0 :     endPoint = node_ptr;
     688                 :            :   }
     689 [ #  # ][ #  # ]:          0 :   else if ( ( startPoint == NULL && endPoint != NULL ) ||
                 [ #  # ]
     690         [ #  # ]:          0 :            ( startPoint != NULL && endPoint == NULL ) )
     691                 :            :   {
     692 [ #  # ][ #  # ]:          0 :     PRINT_ERROR("Could not determine start and end of curve in ChollaCurve\n");
     693                 :          0 :     return CUBIT_FAILURE;
     694                 :            :   }
     695                 :          0 :   return CUBIT_SUCCESS;
     696                 :            : }
     697                 :            : 
     698                 :            : 
     699                 :          0 : CubitStatus ChollaCurve::build_curve_facet_eval_tool( void )
     700                 :            : { 
     701                 :            :   //debug this function as point list is not valid
     702                 :            : 
     703 [ #  # ][ #  # ]:          0 :   if( this->get_eval_tool() )
     704                 :            :   {
     705                 :          0 :     assert(false); //WARNING: Curve facet eval tool already exist!
     706                 :            :   }
     707                 :            : 
     708 [ #  # ][ #  # ]:          0 :   CurveFacetEvalTool *curv_eval_tool_ptr = new CurveFacetEvalTool();
     709                 :            : 
     710                 :            :   // Step 1: Initialize facet_edge_list and point_list
     711                 :            :   CubitStatus stat;
     712         [ #  # ]:          0 :   DLIList<CubitPoint *> point_list;
     713                 :            :   int i;
     714                 :            :   // insert start point of every facet_edge
     715         [ #  # ]:          0 :   curveEdgeList.reset();
     716 [ #  # ][ #  # ]:          0 :   for( i = 0; i < curveEdgeList.size(); i++ )
     717                 :            :   {
     718 [ #  # ][ #  # ]:          0 :     point_list.append( CAST_TO( curveEdgeList.get_and_step(), CubitFacetEdge )->point(0) );
         [ #  # ][ #  # ]
     719                 :            :   }
     720                 :            :   // insert end point of last facet_edge
     721 [ #  # ][ #  # ]:          0 :   curveEdgeList.step( curveEdgeList.size() - 1 );
     722 [ #  # ][ #  # ]:          0 :   point_list.append( CAST_TO( curveEdgeList.get(), CubitFacetEdge )->point(1) );
         [ #  # ][ #  # ]
     723                 :            : 
     724 [ #  # ][ #  # ]:          0 :   DLIList<CubitFacetEdge *> edge_list;
     725 [ #  # ][ #  # ]:          0 :   CAST_LIST( curveEdgeList, edge_list, CubitFacetEdge );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     726         [ #  # ]:          0 :   stat = curv_eval_tool_ptr->initialize( edge_list, point_list );
     727         [ #  # ]:          0 :   if( stat != CUBIT_SUCCESS )
     728                 :            :   {
     729                 :          0 :     return stat;
     730                 :            :   }
     731                 :            :   
     732                 :            :  /*
     733                 :            :  // Step 2: find sense of curve_facet_eval_tool  /// this is done internally in next Step in initialize()
     734                 :            :   if( this->startPoint )
     735                 :            :   {
     736                 :            :     stat = curv_eval_tool_ptr->find_curv_sense( this->startPoint );
     737                 :            :     if( stat != CUBIT_SUCCESS )
     738                 :            :     {
     739                 :            :       return stat;
     740                 :            :     }  
     741                 :            :   }
     742                 :            : */
     743                 :            :   // Step 2: Initialize adj_surface_facet_eval_tool with orientation_wrt_surface
     744 [ #  # ][ #  # ]:          0 :   if( surfaceList.size() )
     745                 :            :   {
     746                 :            :     CubitSense orientation_wrt_surface;
     747 [ #  # ][ #  # ]:          0 :     if( CUBIT_SUCCESS == ChollaEngine::determine_curve_orientation( surfaceList.get(), this, orientation_wrt_surface ) )
                 [ #  # ]
     748                 :            :     {
     749 [ #  # ][ #  # ]:          0 :       if( this->startPoint && this->endPoint )
     750                 :            :       {
     751         [ #  # ]:          0 :         stat = curv_eval_tool_ptr->initialize( surfaceList.get()->get_eval_tool(),
     752                 :            :                       this->startPoint,
     753                 :            :                       this->endPoint,
     754 [ #  # ][ #  # ]:          0 :                       orientation_wrt_surface);
     755                 :            :       }
     756                 :            :     }
     757                 :            :     else
     758                 :            :     {
     759                 :          0 :       assert(false);
     760                 :            :     }
     761                 :            : 
     762         [ #  # ]:          0 :     if( stat != CUBIT_SUCCESS )
     763                 :            :     {
     764                 :          0 :       assert( false );
     765                 :            :       return stat;
     766                 :            :     }      
     767                 :            :   }
     768                 :            :   else
     769                 :            :   {
     770                 :          0 :     assert(false); //WARNING: No adjacent cholla surface available
     771                 :            :   }
     772                 :            : 
     773                 :            :   // Step 4: assign the new curv_eval_tool to cholla_curve
     774         [ #  # ]:          0 :  assign_eval_tool( curv_eval_tool_ptr );
     775                 :            : 
     776         [ #  # ]:          0 :   return stat;
     777                 :            : }
     778                 :            : 
     779                 :            : //=============================================================================
     780                 :            : //Function:  feature_angle (PRIVATE)
     781                 :            : //Description: compute angles at nodes on the curve to see if we need to split
     782                 :            : //             the curve.  Mark the node tooldata hitflag if the node will
     783                 :            : //             break the curve (this is refernced in next_edge)
     784                 :            : //Author: sjowen
     785                 :            : //Date: 12/4/00
     786                 :            : //=============================================================================
     787                 :        528 : CubitStatus ChollaCurve::feature_angle(
     788                 :            :   double min_dot )
     789                 :            : {
     790                 :            :   // first compute all of the edge vector and store with the edge tooldata
     791                 :            : 
     792                 :            :   int ii, jj;
     793                 :            :   FacetEntity *facet_ptr;
     794                 :            :   CubitFacetEdge *edge_ptr;
     795                 :            :   CubitPoint *start_node;
     796                 :            :   CubitPoint *end_node;
     797         [ +  - ]:        528 :   CubitVector tangent;
     798                 :            :   TDGeomFacet *td_gm;
     799 [ +  - ][ +  + ]:       1056 :   for (ii=0; ii<curveEdgeList.size(); ii++)
     800                 :            :   {
     801                 :            : 
     802                 :            :     // compute the tangent vector of the edge and store it with its tooldata
     803                 :            : 
     804         [ +  - ]:        528 :     facet_ptr = curveEdgeList.get_and_step();
     805         [ -  + ]:        528 :     edge_ptr = CAST_TO( facet_ptr, CubitFacetEdge );
     806         [ +  - ]:        528 :     start_node = edge_ptr->point(0);
     807         [ +  - ]:        528 :     end_node = edge_ptr->point(1);
     808 [ +  - ][ +  - ]:        528 :     tangent = end_node->coordinates() - start_node->coordinates();
         [ +  - ][ +  - ]
     809         [ +  - ]:        528 :     tangent.normalize();
     810         [ +  - ]:        528 :     td_gm = TDGeomFacet::get_geom_facet( edge_ptr );
     811         [ +  - ]:        528 :     td_gm->set_normal( tangent );
     812                 :            : 
     813                 :            :     // initialize the nodes tooldata hit flags - set them all to -1
     814                 :            : 
     815         [ +  - ]:        528 :     td_gm = TDGeomFacet::get_geom_facet(start_node);
     816         [ +  - ]:        528 :     td_gm->set_hit_flag(-1);
     817         [ +  - ]:        528 :     td_gm = TDGeomFacet::get_geom_facet(end_node);
     818         [ +  - ]:        528 :     td_gm->set_hit_flag(-1);
     819                 :            :   }
     820                 :            : 
     821                 :            :   // now go through them again and compute the dot product between edges
     822                 :            : 
     823         [ +  - ]:        528 :   CubitVector tang0;
     824         [ +  - ]:        528 :   CubitVector tang1;
     825                 :            :   double dot;
     826                 :            :   CubitPoint *node_ptr;
     827                 :            :   CubitFacetEdge *next_edge_ptr;
     828                 :            :   TDGeomFacet *td_gm_node;
     829                 :            : 
     830 [ +  - ][ +  + ]:       1056 :   for (ii=0; ii<curveEdgeList.size(); ii++)
     831                 :            :   {
     832         [ +  - ]:        528 :     facet_ptr = curveEdgeList.get_and_step();
     833         [ -  + ]:        528 :     edge_ptr = CAST_TO( facet_ptr, CubitFacetEdge );
     834         [ +  - ]:        528 :     start_node = edge_ptr->point(0);
     835         [ +  - ]:        528 :     end_node = edge_ptr->point(1);
     836         [ +  + ]:       1584 :     for (jj=0; jj<2; jj++)
     837                 :            :     {
     838         [ +  + ]:       1056 :       node_ptr = (jj==0) ? start_node : end_node;
     839         [ +  - ]:       1056 :       td_gm_node = TDGeomFacet::get_geom_facet( node_ptr );
     840 [ +  - ][ +  - ]:       1056 :       if (td_gm_node->get_hit_flag() == -1)
     841                 :            :       {
     842         [ +  - ]:       1056 :         next_edge_ptr = next_edge( node_ptr, edge_ptr );
     843         [ +  - ]:       1056 :         if (next_edge_ptr == NULL)
     844                 :            :         {
     845         [ +  - ]:       1056 :           td_gm_node->set_hit_flag( 1 );
     846         [ +  - ]:       1056 :           node_ptr->set_as_feature();
     847                 :            :         }
     848                 :            :         else
     849                 :            :         {
     850         [ #  # ]:          0 :           td_gm = TDGeomFacet::get_geom_facet( edge_ptr );
     851 [ #  # ][ #  # ]:          0 :           tang0 = td_gm->get_normal();
     852         [ #  # ]:          0 :           td_gm = TDGeomFacet::get_geom_facet( next_edge_ptr );
     853 [ #  # ][ #  # ]:          0 :           tang1 = td_gm->get_normal();
     854                 :            : 
     855                 :            :           // change the sign of the tangent vectors if the
     856                 :            :           // sense of the edges are not the same
     857                 :            : 
     858         [ #  # ]:          0 :           if (node_ptr == start_node)
     859                 :            :           {
     860 [ #  # ][ #  # ]:          0 :             if (node_ptr != next_edge_ptr->point(1))
     861 [ #  # ][ #  # ]:          0 :               tang0 = -tang0;
     862                 :            :           }
     863                 :            :           else
     864                 :            :           {
     865 [ #  # ][ #  # ]:          0 :             if (node_ptr != next_edge_ptr->point(0))
     866 [ #  # ][ #  # ]:          0 :               tang0 = -tang0;
     867                 :            :           }
     868                 :            : 
     869                 :            :           // compute the dot product between tangemt vectors
     870                 :            : 
     871         [ #  # ]:          0 :           dot = tang0 % tang1;
     872                 :            : 
     873                 :            :           // set the hit flag if there needs to be a feature break here
     874                 :            : 
     875         [ #  # ]:          0 :           if (dot <= min_dot)
     876                 :            :           {
     877         [ #  # ]:          0 :             td_gm_node->set_hit_flag( 1 );
     878         [ #  # ]:          0 :             node_ptr->set_as_feature();
     879                 :            :           }
     880                 :            :           else
     881                 :            :           {
     882         [ #  # ]:       1056 :             td_gm_node->set_hit_flag( 0 );
     883                 :            :           }
     884                 :            :         }
     885                 :            :       }
     886                 :            :     }
     887                 :            :   }
     888                 :        528 :   return CUBIT_SUCCESS;
     889                 :            : }
     890                 :            : 
     891                 :            : static int icolor = 0;
     892                 :          0 : void ChollaCurve::debug_draw()
     893                 :            : {
     894                 :          0 :   icolor++;
     895                 :          0 :   icolor = icolor%15;
     896                 :          0 :   dcolor(icolor);
     897                 :          0 :   dldraw(curveEdgeList);
     898                 :          0 : }
     899                 :            : 
     900                 :          0 : void ChollaCurve::print()
     901                 :            : {
     902                 :          0 :   FILE *fp = fopen("debug.curve", "a");
     903                 :          0 :   fprintf(fp,"*** Curve %d ***\n", id);
     904         [ #  # ]:          0 :   for (int ii=0; ii<curveEdgeList.size(); ii++)
     905                 :            :   {
     906                 :          0 :     FacetEntity *fe_ptr = curveEdgeList.get_and_step();
     907         [ #  # ]:          0 :     CubitFacetEdge *cfe_ptr = CAST_TO(fe_ptr, CubitFacetEdge );
     908                 :          0 :     CubitPoint *cp0_ptr = cfe_ptr->point(0);
     909                 :          0 :     CubitPoint *cp1_ptr = cfe_ptr->point(1);
     910                 :          0 :     fprintf(fp,"  Edge (%d)\n", cfe_ptr->id() );
     911                 :            :     fprintf(fp,"     Point (%d)  %8.4f  %8.4f  %8.4f\n",
     912                 :          0 :       cp0_ptr->id(), cp0_ptr->x(), cp0_ptr->y(), cp0_ptr->z());
     913                 :            :     fprintf(fp,"     Point (%d)  %8.4f  %8.4f  %8.4f\n",
     914                 :          0 :       cp1_ptr->id(), cp1_ptr->x(), cp1_ptr->y(), cp1_ptr->z());
     915                 :            :   }
     916                 :          0 :   fclose(fp);
     917                 :          0 : }
     918                 :            : 
     919                 :            : 
     920                 :            :   //  disassociate from cholla points
     921                 :          0 : CubitStatus ChollaCurve::disassociate_from_points( void )
     922                 :            : {  
     923                 :            : 
     924                 :            :   /*
     925                 :            :   if( startPoint )
     926                 :            :   {
     927                 :            :     startPoint->remove_curve( this );
     928                 :            :     startPoint = NULL;
     929                 :            :   }
     930                 :            :   if( endPoint )
     931                 :            :   {
     932                 :            :     endPoint->remove_curve( this );
     933                 :            :     endPoint = NULL;
     934                 :            :   }
     935                 :            :   */
     936                 :            : 
     937                 :            :   int i; 
     938         [ #  # ]:          0 :   for( i = 0; i < pointList.size(); i++ )
     939                 :            :   {
     940                 :          0 :     pointList.get_and_step()->remove_curve( this );
     941                 :            :   }
     942                 :          0 :   pointList.clean_out();
     943                 :            : 
     944                 :          0 :   return CUBIT_SUCCESS;
     945                 :            : }
     946                 :            :   
     947                 :            :   // disassociate from cholla surface
     948                 :          0 : CubitStatus ChollaCurve::disassociate_from_surfaces( void)
     949                 :            : {
     950                 :            :   int i;
     951         [ #  # ]:          0 :   for( i = 0; i < surfaceList.size(); i++ )
     952                 :            :   {
     953                 :          0 :     surfaceList.get_and_step()->remove_curve( this );
     954                 :            :   }
     955                 :          0 :   surfaceList.clean_out();
     956                 :          0 :   return CUBIT_SUCCESS;
     957                 :            : }
     958                 :            : 
     959                 :            : 
     960                 :          0 : CubitStatus ChollaCurve::replace_facet( FacetEntity *remove_edge, FacetEntity *replace_edge )
     961                 :            : {
     962                 :          0 :   curveEdgeList.move_to( remove_edge );
     963                 :          0 :   curveEdgeList.insert( replace_edge );
     964                 :          0 :   curveEdgeList.remove( remove_edge );
     965                 :          0 :   myLength = MYLENGTH_UNINITIALIZED;
     966                 :          0 :   return CUBIT_SUCCESS;
     967                 :            : }
     968                 :            : 
     969                 :          0 : CubitStatus ChollaCurve::insert_facet( FacetEntity *old_edge, FacetEntity *new_edge )
     970                 :            : {
     971                 :          0 :   curveEdgeList.move_to( old_edge );
     972                 :          0 :   curveEdgeList.insert( new_edge );
     973                 :            :     
     974                 :          0 :   return CUBIT_SUCCESS;
     975                 :            : }
     976                 :            : 
     977                 :          0 : CubitStatus ChollaCurve::is_contain( FacetEntity *edge )
     978                 :            : {
     979         [ #  # ]:          0 :   if( curveEdgeList.is_in_list( edge ) )
     980                 :          0 :     return CUBIT_SUCCESS;
     981                 :            :   else
     982                 :          0 :     return CUBIT_FAILURE;
     983                 :            : }
     984                 :            : 
     985                 :            : 
     986                 :            : //=============================================================================
     987                 :            : //Function:  is_in_volume (PUBLIC)
     988                 :            : //Description:  return whether this curve is contained within the specified volume
     989                 :            : //Author: sjowen
     990                 :            : //Date: 9/11/2009
     991                 :            : //=============================================================================
     992                 :          0 : CubitBoolean ChollaCurve::is_in_volume( ChollaVolume *chvol_ptr )
     993                 :            : {
     994         [ #  # ]:          0 :   for (int ii=0; ii<surfaceList.size(); ii++)
     995                 :            :   {
     996         [ #  # ]:          0 :     ChollaSurface *chsurf_ptr = surfaceList.get_and_step();
     997         [ #  # ]:          0 :     DLIList<ChollaVolume *> chvol_list;
     998         [ #  # ]:          0 :     chsurf_ptr->get_volumes(chvol_list);
     999 [ #  # ][ #  # ]:          0 :     for (int jj=0; jj<chvol_list.size(); jj++)
         [ #  # ][ #  # ]
    1000                 :            :     {
    1001         [ #  # ]:          0 :       ChollaVolume *mychvol_ptr = chvol_list.get_and_step();
    1002         [ #  # ]:          0 :       if (mychvol_ptr == chvol_ptr)
    1003                 :          0 :         return CUBIT_TRUE;
    1004                 :            :     }
    1005                 :          0 :   }
    1006                 :          0 :   return CUBIT_FALSE;
    1007                 :            : }
    1008                 :            : 
    1009                 :            : //=============================================================================
    1010                 :            : //Function:  is_in_surface (PUBLIC)
    1011                 :            : //Description:  return whether this curve is contained within the specified surface
    1012                 :            : //Author: sjowen
    1013                 :            : //Date: 9/18/2009
    1014                 :            : //=============================================================================
    1015                 :          0 : CubitBoolean ChollaCurve::is_in_surface( ChollaSurface *chsurf_ptr )
    1016                 :            : {
    1017         [ #  # ]:          0 :   for (int ii=0; ii<surfaceList.size(); ii++)
    1018                 :            :   {
    1019                 :          0 :     ChollaSurface *mysurf_ptr = surfaceList.get_and_step();
    1020         [ #  # ]:          0 :     if (mysurf_ptr == chsurf_ptr)
    1021                 :            :     {
    1022                 :          0 :       return CUBIT_TRUE;
    1023                 :            :     }
    1024                 :            :   }
    1025                 :          0 :   return CUBIT_FALSE;
    1026                 :            : }
    1027                 :            : 
    1028                 :            : 
    1029                 :            : //=============================================================================
    1030                 :            : //Function:  get_facet_points (PUBLIC)
    1031                 :            : //Description:  return the list of facet points on this chollacurve
    1032                 :            : //Notes: inclusive = true will return end points as well, otherwise only
    1033                 :            : //       interior points will be returned
    1034                 :            : //Author: sjowen
    1035                 :            : //Date: 9/11/2009
    1036                 :            : //=============================================================================
    1037                 :          0 : void ChollaCurve::get_facet_points( DLIList<CubitPoint *> &point_list, CubitBoolean inclusive)
    1038                 :            : {
    1039                 :            :   FacetEntity *fe_ptr;
    1040                 :            :   CubitFacetEdge *edge_ptr;
    1041                 :            :   CubitPoint *pts[2];
    1042 [ #  # ][ #  # ]:          0 :   for (int ii=0; ii<curveEdgeList.size(); ii++)
    1043                 :            :   {
    1044         [ #  # ]:          0 :     fe_ptr = curveEdgeList.get_and_step();
    1045         [ #  # ]:          0 :     edge_ptr = dynamic_cast<CubitFacetEdge *> (fe_ptr);
    1046         [ #  # ]:          0 :     assert(edge_ptr != NULL);
    1047         [ #  # ]:          0 :     for (int jj=0; jj<2; jj++)
    1048                 :            :     {
    1049         [ #  # ]:          0 :       pts[jj] = edge_ptr->point(jj);
    1050         [ #  # ]:          0 :       if (inclusive)
    1051                 :            :       {
    1052         [ #  # ]:          0 :         point_list.append(pts[jj]);
    1053                 :            :       }
    1054                 :            :       else
    1055                 :            :       {
    1056 [ #  # ][ #  # ]:          0 :         if (pts[jj] != startPoint && pts[jj] != endPoint)
    1057                 :            :         {
    1058         [ #  # ]:          0 :           point_list.append(pts[jj]);
    1059                 :            :         }
    1060                 :            :       }
    1061                 :            :     }
    1062                 :            :   }
    1063         [ #  # ]:          0 :   point_list.uniquify_ordered();
    1064                 :          0 : }
    1065                 :            : 
    1066                 :            : //=============================================================================
    1067                 :            : //Function:  has_point (PUBLIC)
    1068                 :            : //Description:  return whether the curve contains the gicen point
    1069                 :            : //Notes: 
    1070                 :            : //=============================================================================
    1071                 :          0 : CubitBoolean ChollaCurve::has_point( ChollaPoint *chpt )
    1072                 :            : {
    1073         [ #  # ]:          0 :   for(int ii=0; ii<pointList.size(); ii++)
    1074                 :            :   {
    1075                 :          0 :     ChollaPoint *pt = pointList.get_and_step();
    1076         [ #  # ]:          0 :     if (pt == chpt)
    1077                 :          0 :       return CUBIT_TRUE;
    1078                 :            :   }
    1079                 :          0 :   return CUBIT_FALSE;
    1080                 :            : }
    1081                 :            : 
    1082                 :            : //=============================================================================
    1083                 :            : //Function:  verify_points (PUBLIC)
    1084                 :            : //Description:  verify that all points on this curve have this curve as an adjacency
    1085                 :            : //Notes: 
    1086                 :            : //=============================================================================
    1087                 :          0 : CubitStatus ChollaCurve::verify_points()
    1088                 :            : {
    1089         [ #  # ]:          0 :   for(int ii=0; ii<pointList.size(); ii++)
    1090                 :            :   {
    1091                 :          0 :     ChollaPoint *pt = pointList.get_and_step();
    1092         [ #  # ]:          0 :     if (!pt->is_in_curve(this))
    1093                 :          0 :       return CUBIT_FAILURE;
    1094                 :            :   }
    1095                 :          0 :   return CUBIT_SUCCESS;
    1096                 :            : }
    1097                 :            : 
    1098                 :          0 : int ChollaCurve::num_volumes()
    1099                 :            : {
    1100                 :            : 
    1101         [ #  # ]:          0 :   DLIList<ChollaVolume *> chvol_list;
    1102 [ #  # ][ #  # ]:          0 :   for (int i=0; i<surfaceList.size(); i++)
    1103                 :            :   {
    1104         [ #  # ]:          0 :     ChollaSurface *chsurf_ptr = surfaceList.get_and_step();  
    1105         [ #  # ]:          0 :     DLIList<ChollaVolume*> tmp_vols;
    1106         [ #  # ]:          0 :     chsurf_ptr->get_volumes(tmp_vols);
    1107         [ #  # ]:          0 :     chvol_list += tmp_vols;
    1108         [ #  # ]:          0 :   }
    1109                 :            : 
    1110         [ #  # ]:          0 :   chvol_list.uniquify_unordered();
    1111 [ #  # ][ #  # ]:          0 :   return chvol_list.size();
    1112 [ +  - ][ +  - ]:       6540 : }
    1113                 :            : 
    1114                 :            : //EOF
    1115                 :            : 

Generated by: LCOV version 1.11