Changeset 22987
- Timestamp:
- 07/20/18 14:24:29 (7 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
r22531 r22987 663 663 } 664 664 }/*}}}*/ 665 void LevelsetAnalysis::SetDistanceToZeroLevelsetElement(Vector<IssmDouble>* vec_signed_dist, Element* element){/*{{{*/666 667 if(!element->IsZeroLevelset(MaskIceLevelsetEnum))668 return;669 670 /* Intermediaries */671 const int dim=3;672 int i,d;673 int numvertices=element->GetNumberOfVertices();674 IssmDouble s0[dim], s1[dim], v[dim];675 IssmDouble dist,lsf_old;676 677 IssmDouble* lsf = xNew<IssmDouble>(numvertices);678 IssmDouble* sign_lsf = xNew<IssmDouble>(numvertices);679 IssmDouble* signed_dist = xNew<IssmDouble>(numvertices);680 IssmDouble* xyz_list = NULL;681 IssmDouble* xyz_list_zero = NULL;682 683 /* retrieve inputs and parameters */684 element->GetVerticesCoordinates(&xyz_list);685 element->GetInputListOnVertices(lsf,MaskIceLevelsetEnum);686 687 /* get sign of levelset function */688 for(i=0;i<numvertices;i++)689 sign_lsf[i]=(lsf[i]>=0.?1.:-1.);690 691 element->ZeroLevelsetCoordinates(&xyz_list_zero, xyz_list, MaskIceLevelsetEnum);692 for(d=0;d<dim;d++){693 s0[d]=xyz_list_zero[0+d];694 s1[d]=xyz_list_zero[3+d];695 }696 697 /* get signed_distance of vertices to zero levelset straight */698 for(i=0;i<numvertices;i++){699 for(d=0;d<dim;d++)700 v[d]=xyz_list[3*i+d];701 dist=GetDistanceToStraight(&v[0],&s0[0],&s1[0]);702 signed_dist[i]=sign_lsf[i]*dist;703 }704 705 /* insert signed_distance into vec_signed_dist, if computed distance is smaller */706 for(i=0;i<numvertices;i++){707 vec_signed_dist->GetValue(&lsf_old, element->vertices[i]->Sid());708 if(xIsNan<IssmDouble>(lsf_old) || fabs(signed_dist[i])<fabs(lsf_old))709 vec_signed_dist->SetValue(element->vertices[i]->Sid(),signed_dist[i],INS_VAL);710 }711 712 xDelete<IssmDouble>(lsf);713 xDelete<IssmDouble>(sign_lsf);714 xDelete<IssmDouble>(signed_dist);715 xDelete<IssmDouble>(xyz_list);716 xDelete<IssmDouble>(xyz_list_zero);717 }/*}}}*/718 665 void LevelsetAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/ 719 666 -
issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.h
r21931 r22987 32 32 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index); 33 33 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 34 void SetDistanceToZeroLevelsetElement(Vector<IssmDouble>* vec_signed_dist, Element* element);35 34 void UpdateConstraints(FemModel* femmodel); 36 35 }; -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r22985 r22987 3301 3301 } 3302 3302 /*}}}*/ 3303 void Tria::ResetLevelsetFromSegmentlist(IssmDouble* segments,int numsegments){/*{{{*/ 3304 3305 /*Intermediaries*/ 3306 IssmDouble d,xn,yn; 3303 void Tria::ResetLevelsetFromSegmentlist(IssmDouble* distances){/*{{{*/ 3304 3307 3305 3308 3306 /*Get current levelset and vertex coordinates*/ 3309 3307 IssmDouble ls[NUMVERTICES]; 3310 IssmDouble xyz_list[NUMVERTICES][3];3311 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);3312 3308 GetInputListOnVertices(&ls[0],MaskIceLevelsetEnum); 3313 3309 3314 3310 /*Get distance from list of segments and reset ls*/ 3315 3311 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 segment3335 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 segment3339 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 segment3343 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);3353 3312 if(dmin>10000) dmin=10000; 3354 3313 if(ls[j]>0){ 3355 ls[j] = d min;3314 ls[j] = distances[this->vertices->Pid()]; 3356 3315 } 3357 3316 else{ 3358 ls[j] = - d min;3317 ls[j] = - distances[this->vertices->Pid()]; 3359 3318 } 3360 3319 } -
issm/trunk-jpl/src/c/classes/FemModel.cpp
r22974 r22987 1050 1050 1051 1051 /*3: Add distance input to all elements*/ 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 } 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__); 1070 1099 1071 1100 /*Clean up and return*/ 1101 xDelete<IssmDouble>(distances); 1072 1102 xDelete<IssmDouble>(allsegmentlist); 1073 1103 }/*}}}*/ -
issm/trunk-jpl/src/c/cores/movingfront_core.cpp
r22262 r22987 85 85 86 86 /*Reset levelset if needed*/ 87 printf("-------------- file: movingfront_core.cpp line: %i\n",__LINE__); 87 88 if(reinit_frequency && (step%reinit_frequency==0)){ 88 89 if(VerboseSolution()) _printf0_(" reinitializing level set\n");
Note:
See TracChangeset
for help on using the changeset viewer.