Changeset 22988
- Timestamp:
- 07/20/18 14:27:12 (7 years ago)
- 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 3301 3301 } 3302 3302 /*}}}*/ 3303 void Tria::ResetLevelsetFromSegmentlist(IssmDouble* distances){/*{{{*/ 3304 3303 void Tria::ResetLevelsetFromSegmentlist(IssmDouble* segments,int numsegments){/*{{{*/ 3304 3305 /*Intermediaries*/ 3306 IssmDouble d,xn,yn; 3305 3307 3306 3308 /*Get current levelset and vertex coordinates*/ 3307 3309 IssmDouble ls[NUMVERTICES]; 3310 IssmDouble xyz_list[NUMVERTICES][3]; 3311 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES); 3308 3312 GetInputListOnVertices(&ls[0],MaskIceLevelsetEnum); 3309 3313 3310 3314 /*Get distance from list of segments and reset ls*/ 3311 3315 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); 3312 3353 if(dmin>10000) dmin=10000; 3313 3354 if(ls[j]>0){ 3314 ls[j] = d istances[this->vertices->Pid()];3355 ls[j] = dmin; 3315 3356 } 3316 3357 else{ 3317 ls[j] = - d istances[this->vertices->Pid()];3358 ls[j] = - dmin; 3318 3359 } 3319 3360 } -
issm/trunk-jpl/src/c/classes/FemModel.cpp
r22987 r22988 1050 1050 1051 1051 /*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 } 1099 1070 1100 1071 /*Clean up and return*/ 1101 xDelete<IssmDouble>(distances);1102 1072 xDelete<IssmDouble>(allsegmentlist); 1103 1073 }/*}}}*/
Note:
See TracChangeset
for help on using the changeset viewer.