Changeset 18788


Ignore:
Timestamp:
11/14/14 16:42:44 (10 years ago)
Author:
Eric.Larour
Message:

CHG: improvements to this module, this could seriously impact some of the nightly runs dealing with UQ, so to be checked.

Location:
issm/trunk-jpl/src/c/modules/MeshProfileIntersectionx
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified issm/trunk-jpl/src/c/modules/MeshProfileIntersectionx/MeshProfileIntersectionx.cpp

    r16164 r18788  
    129129                ysegment[0]=yc[i];
    130130                ysegment[1]=yc[i+1];
    131                 ElementSegment(segments_dataset,el, xnodes,ynodes,xsegment,ysegment);
    132         }
    133 }/*}}}*/
    134 void ElementSegment(DataSet* segments_dataset,int el,double* xnodes,double* ynodes,double* xsegment,double* ysegment){/*{{{*/
     131                /*if (el==318 && i==9){
     132                        _printf_("contour: " << i << " " << xsegment[0] << " " << ysegment[0] << " " << xsegment[1] << " " << ysegment[1]
     133                                << " " << xnodes[0] << " " << xnodes[1] << " " << xnodes[2] << " " << ynodes[0] << " " << ynodes[1] << " " <<
     134                                ynodes[2] << "\n");
     135                }*/
     136                ElementSegment(segments_dataset,el, i, xnodes,ynodes,xsegment,ysegment);
     137        }
     138}/*}}}*/
     139void ElementSegment(DataSet* segments_dataset,int el, int contouri, double* xnodes,double* ynodes,double* xsegment,double* ysegment){/*{{{*/
    135140
    136141        /*We have a tria element (xnodes,ynodes) and a segment (xsegment,ysegment). Find whether they intersect.
     
    159164        edge3=SegmentIntersect(&gamma1,&gamma2, xel,yel,xsegment,ysegment);
    160165
    161         /*edge can be either IntersectEnum (one iand only one intersection between the edge and the segment), ColinearEnum (edge and segment are collinear) and SeparateEnum (no intersection): */
     166        /*edge can be either IntersectEnum (one and only one intersection between the edge and the segment), ColinearEnum (edge and segment are collinear) and SeparateEnum (no intersection): */
     167               
     168        /*if (el==318 && contouri==9){
     169                _printf_(edge1 << " " << edge2 << " " << edge3 << " "  << alpha1 << " " << alpha2 << " " << beta1 << " " << beta2 << " " << gamma1 << " " << gamma2 << " " << xsegment[0] << " "  << xsegment[1] << " " << ysegment[0] << " " << ysegment[1] << " " << xnodes[0] << " " << xnodes[1] << " " << xnodes[2] << " " << ynodes[0] << " " << ynodes[1] << " " << ynodes[2]);
     170       
     171        _printf_("Bool" << (edge1==IntersectEnum) || (edge2==IntersectEnum) || (edge3==IntersectEnum));
     172        }*/
    162173
    163174        if(    (edge1==IntersectEnum) && (edge2==IntersectEnum) && (edge3==IntersectEnum)   ){
    164                 /*This case is impossible: */
    165                 _error_("error: a line cannot go through 3 different vertices!");
     175
     176                /*This can only be the case if the segment intersected through one vertex, meaning a pair from alpha1, beta1 or gamma1  is 0:*/
     177                if (alpha1!=0 && alpha1!=1){
     178                        /*The vertex opposite edge 1 was intersected:*/
     179                        xfinal[0]=xsegment[0]+alpha1*(xsegment[1]-xsegment[0]);
     180                        yfinal[0]=ysegment[0]+alpha1*(ysegment[1]-ysegment[0]);
     181                        xfinal[1]=xnodes[2];
     182                        yfinal[1]=ynodes[2];
     183                }
     184                else if (beta1!=0 && beta1!=1){
     185                        /*The vertex opposite edge 2 was intersected:*/
     186                        xfinal[0]=xsegment[0]+beta1*(xsegment[1]-xsegment[0]);
     187                        yfinal[0]=ysegment[0]+beta1*(ysegment[1]-ysegment[0]);
     188                        xfinal[1]=xnodes[0];
     189                        yfinal[1]=ynodes[0];
     190                }
     191                else if (gamma1!=0 && gamma1!=1){
     192                        /*The vertex opposite edge 3 was intersected:*/
     193                        xfinal[0]=xsegment[0]+gamma1*(xsegment[1]-xsegment[0]);
     194                        yfinal[0]=ysegment[0]+gamma1*(ysegment[1]-ysegment[0]);
     195                        xfinal[1]=xnodes[1];
     196                        yfinal[1]=ynodes[1];
     197                }
     198                segments_dataset->AddObject(new  Segment<double>(el+1,xfinal[0],yfinal[0],xfinal[1],yfinal[1]));
     199
     200               
     201                /*This case is impossible: not quite! */
     202                //_printf_(alpha1 << " " << alpha2 << " " << beta1 << " " << beta2 << " " << gamma1 << " " << gamma2 << " " << xsegment[0] << " "  << xsegment[1] << " " << ysegment[0] << " " << ysegment[1] << " " << xnodes[0] << " " << xnodes[1] << " " << xnodes[2] << " " << ynodes[0] << " " << ynodes[1] << " " << ynodes[2]);
     203                /* _error_("error: a line cannot go through 3 different vertices!");*/
    166204        }
    167205        else if(    ((edge1==IntersectEnum) && (edge2==IntersectEnum)) || ((edge2==IntersectEnum) && (edge3==IntersectEnum)) || ((edge3==IntersectEnum) && (edge1==IntersectEnum))   ){
     
    187225        }
    188226        else if(  (edge1==IntersectEnum) || (edge2==IntersectEnum) || (edge3==IntersectEnum)   ){
     227       
     228                /*if (el==318 && contouri==9){
     229                        _printf_("hello" <<  " NodeInElement 0 " << (NodeInElement(xnodes,ynodes,xsegment[0],ysegment[0])) <<  " NodeInElement 1 " << (NodeInElement(xnodes,ynodes,xsegment[1],ysegment[1])));
     230                }*/
    189231
    190232                /*segment intersect only 1 edge. Figure out where the first point in the segment is, inside or outside the element,
     
    196238                        if(edge3==IntersectEnum){coord2=gamma1;}
    197239                }
    198                 else{
     240                else if (NodeInElement(xnodes,ynodes,xsegment[1],ysegment[1])){
    199241                        if(edge1==IntersectEnum){coord1=alpha1;}
    200242                        if(edge2==IntersectEnum){coord1=beta1;}
    201243                        if(edge3==IntersectEnum){coord1=gamma1;}
    202244                        coord2=1.0;
     245                }
     246                else{
     247                        double tolerance=1e-10;
     248                        /*Ok, we have an issue here. Probably one of the segments' end is on a vertex, within a certain tolerance!*/
     249                        if (IsIdenticalNode(xnodes[0],ynodes[0],xsegment[0],ysegment[0],tolerance) ||
     250                                IsIdenticalNode(xnodes[1],ynodes[1],xsegment[0],ysegment[0],tolerance) ||
     251                                IsIdenticalNode(xnodes[2],ynodes[2],xsegment[0],ysegment[0],tolerance)){
     252                               
     253                                /*ok, segments[0] is common to one of our vertices: */
     254                                //if (el==318 && contouri==9){ _printf_("ok1" << "\n"); }
     255                                coord1=0;
     256                                if(edge1==IntersectEnum){coord2=alpha1;}
     257                                if(edge2==IntersectEnum){coord2=beta1;}
     258                                if(edge3==IntersectEnum){coord2=gamma1;}
     259                        }
     260                        else if (IsIdenticalNode(xnodes[0],ynodes[0],xsegment[1],ysegment[1],tolerance) ||
     261                                     IsIdenticalNode(xnodes[1],ynodes[1],xsegment[1],ysegment[1],tolerance) ||
     262                                     IsIdenticalNode(xnodes[2],ynodes[2],xsegment[1],ysegment[1],tolerance)){
     263
     264                                /*ok, segments[1] is common to one of our vertices: */
     265                                //if (el==318 && contouri==9){ _printf_("ok2" << "\n"); }
     266                                if(edge1==IntersectEnum){coord1=alpha1;}
     267                                if(edge2==IntersectEnum){coord1=beta1;}
     268                                if(edge3==IntersectEnum){coord1=gamma1;}
     269                                coord2=1.0;
     270                        }
    203271                }
    204272
     
    344412        return IntersectEnum;
    345413}/*}}}*/
     414bool IsIdenticalNode(double x1, double y1, double x2, double y2, double tolerance){ /*{{{*/
     415
     416        if (sqrt(pow(x1-x2,2.0) + pow(y1-y2,2))<tolerance)return true;
     417        else return false;
     418
     419}/*}}}*/
  • TabularUnified issm/trunk-jpl/src/c/modules/MeshProfileIntersectionx/MeshProfileIntersectionx.h

    r15000 r18788  
    1313void MeshSegmentsIntersection(double** psegments, int* pnumsegs,int* index, double* x, double* y, int nel, int nods, double* xc, double* yc, int numnodes);
    1414void ElementSegmentsIntersection(DataSet* segments_dataset,int el, double* xnodes,double* ynodes,double* xc,double* yc,int numnodes);
    15 void ElementSegment(DataSet* segments_dataset,int el,double* xnodes,double* ynodes,double* xsegment,double* ysegment);
     15void ElementSegment(DataSet* segments_dataset,int el,int contouri, double* xnodes,double* ynodes,double* xsegment,double* ysegment);
    1616int  SegmentIntersect(double* palpha, double* pbeta, double* x1, double* y1, double* x2, double* y2);
    1717bool NodeInElement(double* xnodes, double* ynodes, double x, double y);
     18bool IsIdenticalNode(double x1, double y1, double x2, double y2, double tolerance);
    1819
    1920#endif /* _MESHPROFILEINTERSECTIONX_H */
Note: See TracChangeset for help on using the changeset viewer.