Changeset 22988


Ignore:
Timestamp:
07/20/18 14:27:12 (7 years ago)
Author:
Mathieu Morlighem
Message:

BUG: reverted change for FemModel and Tria

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

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/Elements/Tria.cpp

    r22987 r22988  
    33013301}
    33023302/*}}}*/
    3303 void       Tria::ResetLevelsetFromSegmentlist(IssmDouble* distances){/*{{{*/
    3304 
     3303void       Tria::ResetLevelsetFromSegmentlist(IssmDouble* segments,int numsegments){/*{{{*/
     3304
     3305        /*Intermediaries*/
     3306        IssmDouble d,xn,yn;
    33053307
    33063308        /*Get current levelset and vertex coordinates*/
    33073309        IssmDouble ls[NUMVERTICES];
     3310        IssmDouble  xyz_list[NUMVERTICES][3];
     3311        ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
    33083312        GetInputListOnVertices(&ls[0],MaskIceLevelsetEnum);
    33093313
    33103314        /*Get distance from list of segments and reset ls*/
    33113315        for(int j=0;j<NUMVERTICES;j++){
     3316                IssmDouble dmin = 1.e+50;
     3317                for(int i=0;i<numsegments;i++){
     3318                        IssmDouble x = xyz_list[j][0];
     3319                        IssmDouble y = xyz_list[j][1];
     3320                        IssmDouble l2 = (segments[4*i+2]-segments[4*i+0])*(segments[4*i+2]-segments[4*i+0]) + (segments[4*i+3]-segments[4*i+1])*(segments[4*i+3]-segments[4*i+1]);
     3321
     3322                        /*Segment has a length of 0*/
     3323                        if(l2==0.){
     3324                                d = (x-segments[4*i+0])*(x-segments[4*i+0])+(y-segments[4*i+1])*(y-segments[4*i+1]);
     3325                                if(d<dmin) dmin = d;
     3326                                continue;
     3327                        }
     3328
     3329                        /*Consider the line extending the segment, parameterized as v + t (w - v).
     3330                         *We find projection of point p onto the line.
     3331                         *It falls where t = [(p-v) . (w-v)] / |w-v|^2*/
     3332                        IssmDouble t = ((x-segments[4*i+0])*(segments[4*i+2]-segments[4*i+0]) + (y-segments[4*i+1])*(segments[4*i+3]-segments[4*i+1]))/l2;
     3333                        if(t < 0.0){
     3334                                // Beyond the 'v' end of the segment
     3335                                d = (x-segments[4*i+0])*(x-segments[4*i+0])+(y-segments[4*i+1])*(y-segments[4*i+1]);
     3336                        }
     3337                        else if (t > 1.0){
     3338                                // Beyond the 'w' end of the segment
     3339                                d = (x-segments[4*i+2])*(x-segments[4*i+2])+(y-segments[4*i+3])*(y-segments[4*i+3]);
     3340                        }
     3341                        else{
     3342                                // Projection falls on the segment
     3343                                xn = segments[4*i+0] + t * (segments[4*i+2] - segments[4*i+0]);
     3344                                yn = segments[4*i+1] + t * (segments[4*i+3] - segments[4*i+1]);
     3345                                d = (x-xn)*(x-xn)+(y-yn)*(y-yn);
     3346                        }
     3347
     3348                        if(d<dmin) dmin = d;
     3349                }
     3350
     3351                /*Update signed distance*/
     3352                dmin = sqrt(dmin);
    33123353                if(dmin>10000) dmin=10000;
    33133354                if(ls[j]>0){
    3314                         ls[j] = distances[this->vertices->Pid()];
     3355                        ls[j] = dmin;
    33153356                }
    33163357                else{
    3317                         ls[j] = - distances[this->vertices->Pid()];
     3358                        ls[j] = - dmin;
    33183359                }
    33193360        }
  • issm/trunk-jpl/src/c/classes/FemModel.cpp

    r22987 r22988  
    10501050
    10511051        /*3: Add distance input to all elements*/
    1052         IssmDouble* distances = xNew<IssmDouble>(vertices->Size());
    1053         IssmDouble  d,xn,yn;
    1054         for(int i=0;i<vertices->Size();i++){
    1055                 Vertex* vertex=dynamic_cast<Vertex*>(this->vertices->GetObjectByOffset(i));
    1056                 IssmDouble dmin = 1.e+50;
    1057 
    1058                 for(int i=0;i<numseg;i++){
    1059                         IssmDouble x = vertex->x;
    1060                         IssmDouble y = vertex->y;
    1061                         IssmDouble l2 = (allsegmentlist[4*i+2]-allsegmentlist[4*i+0])*(allsegmentlist[4*i+2]-allsegmentlist[4*i+0]) + (allsegmentlist[4*i+3]-allsegmentlist[4*i+1])*(allsegmentlist[4*i+3]-allsegmentlist[4*i+1]);
    1062 
    1063                         /*Segment has a length of 0*/
    1064                         if(l2==0.){
    1065                                 d = (x-allsegmentlist[4*i+0])*(x-allsegmentlist[4*i+0])+(y-allsegmentlist[4*i+1])*(y-allsegmentlist[4*i+1]);
    1066                                 if(d<dmin) dmin = d;
    1067                                 continue;
    1068                         }
    1069 
    1070                         /*Consider the line extending the segment, parameterized as v + t (w - v).
    1071                          *We find projection of point p onto the line.
    1072                          *It falls where t = [(p-v) . (w-v)] / |w-v|^2*/
    1073                         IssmDouble t = ((x-allsegmentlist[4*i+0])*(allsegmentlist[4*i+2]-allsegmentlist[4*i+0]) + (y-allsegmentlist[4*i+1])*(allsegmentlist[4*i+3]-allsegmentlist[4*i+1]))/l2;
    1074                         if(t < 0.0){
    1075                                 // Beyond the 'v' end of the segment
    1076                                 d = (x-allsegmentlist[4*i+0])*(x-allsegmentlist[4*i+0])+(y-allsegmentlist[4*i+1])*(y-allsegmentlist[4*i+1]);
    1077                         }
    1078                         else if (t > 1.0){
    1079                                 // Beyond the 'w' end of the segment
    1080                                 d = (x-allsegmentlist[4*i+2])*(x-allsegmentlist[4*i+2])+(y-allsegmentlist[4*i+3])*(y-allsegmentlist[4*i+3]);
    1081                         }
    1082                         else{
    1083                                 // Projection falls on the segment
    1084                                 xn = allsegmentlist[4*i+0] + t * (allsegmentlist[4*i+2] - allsegmentlist[4*i+0]);
    1085                                 yn = allsegmentlist[4*i+1] + t * (allsegmentlist[4*i+3] - allsegmentlist[4*i+1]);
    1086                                 d = (x-xn)*(x-xn)+(y-yn)*(y-yn);
    1087                         }
    1088 
    1089                         if(d<dmin) dmin = d;
    1090                 }
    1091 
    1092                 /*Update signed distance*/
    1093                 distances[vertex->pid] = sqrt(dmin);
    1094         }
    1095 
    1096         //element->CreateDistanceInputFromSegmentlist(allsegmentlist,numseg,distanceenum);
    1097         InputUpdateFromVectorx(this,distances,distanceenum,VertexPIdEnum);
    1098         printf("-------------- file: FemModel.cpp line: %i\n",__LINE__);
     1052        for(int i=0;i<elements->Size();i++){
     1053                Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
     1054                if(!element->IsOnBase()) continue;
     1055                element->CreateDistanceInputFromSegmentlist(allsegmentlist,numseg,distanceenum);
     1056        }
     1057
     1058        /*Extrude if necessary*/
     1059        int elementtype;
     1060        this->parameters->FindParam(&elementtype,MeshElementtypeEnum);
     1061        if(elementtype==PentaEnum){
     1062                InputExtrudex(this,distanceenum,-1);
     1063        }
     1064        else if(elementtype==TriaEnum){
     1065                /*no need to extrude*/
     1066        }
     1067        else{
     1068                _error_("not implemented yet");
     1069        }
    10991070
    11001071        /*Clean up and return*/
    1101         xDelete<IssmDouble>(distances);
    11021072        xDelete<IssmDouble>(allsegmentlist);
    11031073}/*}}}*/
Note: See TracChangeset for help on using the changeset viewer.