Changeset 12080
- Timestamp:
- 04/20/12 13:49:38 (13 years ago)
- Location:
- issm/trunk-jpl/src/c/shared/TriMesh
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/shared/TriMesh/SplitMeshForRifts.cpp
r8301 r12080 57 57 for (j=0;j<2;j++){ 58 58 59 node= *(riftsegments+4*i+j+2);59 node=riftsegments[4*i+j+2]; 60 60 if(flags[node-1]){ 61 61 /*This node was already split, skip:*/ … … 94 94 95 95 /*update segments: they got modified completely by adding new nodes.*/ 96 UpdateSegments(&segments,&segmentmarkerlist, &nsegs,index,x,y,riftsegments,nriftsegs );96 UpdateSegments(&segments,&segmentmarkerlist, &nsegs,index,x,y,riftsegments,nriftsegs,nods,nel); 97 97 98 98 /*Assign output pointers: */ -
issm/trunk-jpl/src/c/shared/TriMesh/TriMeshUtils.cpp
r12070 r12080 11 11 12 12 #define RIFTPENALTYPAIRSWIDTH 8 13 /*FUNCTION IsGridOnRift{{{*/ 13 14 int IsGridOnRift(int* riftsegments, int nriftsegs, int node){ 14 15 … … 32 33 return 0; 33 34 } 34 } 35 36 35 }/*}}}*/ 36 /*FUNCTION GridElementsList{{{*/ 37 37 int GridElementsList(int** pGridElements, int* pNumGridElements,int node,double * index,int nel){ 38 38 … … 87 87 *pNumGridElements=NumGridElements; 88 88 return noerr; 89 } 90 91 89 }/*}}}*/ 90 /*FUNCTION IsNeighbor{{{*/ 92 91 int IsNeighbor(int el1,int el2,double* index){ 93 92 /*From a triangulation held in index, figure out if elements 1 and 2 have two nodes in common: */ … … 105 104 return 0; 106 105 } 107 } 108 109 106 }/*}}}*/ 107 /*FUNCTION IsOnRift{{{*/ 110 108 int IsOnRift(int el,int nriftsegs,int* riftsegments){ 111 109 /*From a list of elements segments, figure out if el belongs to it: */ … … 117 115 } 118 116 return 0; 119 } 120 121 122 /****************************************************************************************************************************** 123 RiftSegmentsFromSegments 124 ******************************************************************************************************************************/ 125 117 }/*}}}*/ 118 /*FUNCTION RiftSegmentsFromSegments{{{*/ 126 119 void RiftSegmentsFromSegments(int* pnriftsegs, int** priftsegments, int nel, double* index, int nsegs,double* segments){ 127 120 … … 189 182 *priftsegments=riftsegments; 190 183 *pnriftsegs=nriftsegs; 191 } 192 193 /****************************************************************************************************************************** 194 DetermineGridElementListOnOneSideOfRift 195 ******************************************************************************************************************************/ 196 184 }/*}}}*/ 185 /*FUNCTION DetermineGridElementListOnOneSideOfRift{{{*/ 197 186 int DetermineGridElementListOnOneSideOfRift(int* pNumGridElementListOnOneSideOfRift, int** pGridElementListOnOneSideOfRift, int segmentnumber, int nriftsegs, int* riftsegments, int node,double* index,int nel){ 198 187 … … 257 246 *pGridElementListOnOneSideOfRift=GridElementListOnOneSideOfRift; 258 247 return noerr; 259 } 260 261 /****************************************************************************************************************************** 262 UpdateSegments 263 ******************************************************************************************************************************/ 264 265 int UpdateSegments(double** psegments,double** psegmentmarkerlist, int* pnsegs, double* index, double* x,double* y,int* riftsegments,int nriftsegs){ 248 }/*}}}*/ 249 /*FUNCTION UpdateSegments{{{*/ 250 int UpdateSegments(double** psegments,double** psegmentmarkerlist, int* pnsegs, double* index, double* x,double* y,int* riftsegments,int nriftsegs,int nods,int nel){ 266 251 267 252 int noerr=1; … … 284 269 /*First, update the existing segments to the new nodes :*/ 285 270 for (i=0;i<nriftsegs;i++){ 286 el1= *(riftsegments+4*i+0);287 el2= *(riftsegments+4*i+1);271 el1=riftsegments[4*i+0]; 272 el2=riftsegments[4*i+1]; 288 273 for (j=0;j<nsegs;j++){ 289 if ( *(segments+3*j+2)==(el1+1)){274 if (segments[3*j+2]==(el1+1)){ 290 275 /*segment j is the same as rift segment i.Let's update segments[j][:] using element el1 and the corresponding rift segment. 291 276 *Because riftsegments does not represent a list of rift segments anymore (it got heavily modified in SplitElementsForRifts, … … 293 278 for (k=0;k<3;k++){ 294 279 if ((x[(int)*(index+el1*3+k)-1]==x[(int)*(segments+3*j+0)-1]) && (y[(int)*(index+el1*3+k)-1]==y[(int)*(segments+3*j+0)-1])){ 295 *(segments+3*j+0)=*(index+el1*3+k); 280 *(segments+3*j+0)=*(index+el1*3+k); _assert_(segments[3*j+0]<nods); 296 281 break; 297 282 } … … 299 284 for (k=0;k<3;k++){ 300 285 if ((x[(int)*(index+el1*3+k)-1]==x[(int)*(segments+3*j+1)-1]) && (y[(int)*(index+el1*3+k)-1]==y[(int)*(segments+3*j+1)-1])){ 301 *(segments+3*j+1)=*(index+el1*3+k); 286 *(segments+3*j+1)=*(index+el1*3+k); _assert_(segments[3*j+1]<nods); 302 287 break; 303 288 } … … 308 293 for (k=0;k<3;k++){ 309 294 if ((x[(int)*(index+el2*3+k)-1]==x[(int)*(segments+3*j+0)-1]) && (y[(int)*(index+el2*3+k)-1]==y[(int)*(segments+3*j+0)-1])){ 310 *(segments+3*(nsegs+i)+0)=*(index+el2*3+k); 295 *(segments+3*(nsegs+i)+0)=*(index+el2*3+k); _assert_(segments[3*(nsegs+i)+0]<nods); 311 296 break; 312 297 } … … 314 299 for (k=0;k<3;k++){ 315 300 if ((x[(int)*(index+el2*3+k)-1]==x[(int)*(segments+3*j+1)-1]) && (y[(int)*(index+el2*3+k)-1]==y[(int)*(segments+3*j+1)-1])){ 316 *(segments+3*(nsegs+i)+1)=*(index+el2*3+k); 301 *(segments+3*(nsegs+i)+1)=*(index+el2*3+k); _assert_(segments[3*(nsegs+i)+1]<nods); 317 302 break; 318 303 } … … 324 309 for (k=0;k<3;k++){ 325 310 if ((x[(int)*(index+el2*3+k)-1]==x[(int)*(segments+3*j+0)-1]) && (y[(int)*(index+el2*3+k)-1]==y[(int)*(segments+3*j+0)-1])){ 326 *(segments+3*j+0)=*(index+el2*3+k); 311 *(segments+3*j+0)=*(index+el2*3+k); _assert_(segments[3*j+0]<nods); 327 312 break; 328 313 } … … 330 315 for (k=0;k<3;k++){ 331 316 if ((x[(int)*(index+el2*3+k)-1]==x[(int)*(segments+3*j+1)-1]) && (y[(int)*(index+el2*3+k)-1]==y[(int)*(segments+3*j+1)-1])){ 332 *(segments+3*j+1)=*(index+el2*3+k); 317 *(segments+3*j+1)=*(index+el2*3+k);_assert_(segments[3*j+1]<nods); 333 318 break; 334 319 } … … 339 324 for (k=0;k<3;k++){ 340 325 if ((x[(int)*(index+el1*3+k)-1]==x[(int)*(segments+3*j+0)-1]) && (y[(int)*(index+el1*3+k)-1]==y[(int)*(segments+3*j+0)-1])){ 341 *(segments+3*(nsegs+i)+0)=*(index+el1*3+k); 326 *(segments+3*(nsegs+i)+0)=*(index+el1*3+k);_assert_(segments[3*(nsegs+i)+0]<nods); 342 327 break; 343 328 } … … 345 330 for (k=0;k<3;k++){ 346 331 if ((x[(int)*(index+el1*3+k)-1]==x[(int)*(segments+3*j+1)-1]) && (y[(int)*(index+el1*3+k)-1]==y[(int)*(segments+3*j+1)-1])){ 347 *(segments+3*(nsegs+i)+1)=*(index+el1*3+k); 332 *(segments+3*(nsegs+i)+1)=*(index+el1*3+k);_assert_(segments[3*(nsegs+i)+1]<nods); 348 333 break; 349 334 } … … 360 345 361 346 return noerr; 362 } 363 364 /****************************************************************************************************************************** 365 pnpoly 366 ******************************************************************************************************************************/ 347 }/*}}}*/ 348 /*FUNCTION pnpoly{{{*/ 367 349 int pnpoly(int npol, double *xp, double *yp, double x, double y) { 368 350 int i, j, c = 0; … … 374 356 } 375 357 return c; 376 } 377 378 /****************************************************************************************************************************** 379 IsInPoly 380 ******************************************************************************************************************************/ 381 //void IsInPoly(double* in,double* xc,double* yc,int numnodes,double* x,double* y,int nods){ 382 // 383 // int i; 384 // double x0,y0; 385 // 386 // /*Go through all nodes of the mesh:*/ 387 // for (i=0;i<nods;i++){ 388 // if (in[i]){ 389 // /*this node already is inside one of the contours, continue*/ 390 // continue; 391 // } 392 // /*pick up node: */ 393 // x0=x[i]; 394 // y0=y[i]; 395 // if (pnpoly(numnodes,xc,yc,x0,y0)){ 396 // in[i]=1; 397 // } 398 // } 399 //} 400 401 /****************************************************************************************************************************** 402 FindElement 403 ******************************************************************************************************************************/ 404 358 }/*}}}*/ 359 /*FUNCTION FindElement{{{*/ 405 360 int FindElement(double A,double B,double* index,int nel){ 406 361 … … 414 369 } 415 370 return el; 416 } 417 /****************************************************************************************************************************** 418 SplitRiftSegments 419 ******************************************************************************************************************************/ 420 421 int SplitRiftSegments(double** psegments,double** psegmentmarkerlist, int* pnumsegs, int* pnumrifts,int** priftsnumsegs,double*** priftssegments,int numrifts){ 371 }/*}}}*/ 372 /*FUNCTION SplitRiftSegments{{{*/ 373 int SplitRiftSegments(double** psegments,double** psegmentmarkerlist, int* pnumsegs, int* pnumrifts,int** priftsnumsegs,double*** priftssegments,int numrifts,int nods,int nel){ 422 374 423 375 /*Using segment markers, wring out the rift segments from the segments. Rift markers are … … 461 413 for (i=0;i<numsegs;i++){ 462 414 if (segmentmarkerlist[i]==1){ 463 *(new_segments+3*counter+0)=*(segments+3*i+0);464 *(new_segments+3*counter+1)=*(segments+3*i+1);465 *(new_segments+3*counter+2)=*(segments+3*i+2);415 new_segments[3*counter+0]=segments[3*i+0]; 416 new_segments[3*counter+1]=segments[3*i+1]; 417 new_segments[3*counter+2]=segments[3*i+2]; 466 418 new_segmentmarkers[counter]=segmentmarkerlist[i]; 467 419 counter++; … … 484 436 for (j=0;j<numsegs;j++){ 485 437 if (segmentmarkerlist[j]==(2+i)){ 486 *(riftsegment+3*counter+0)=*(segments+3*j+0);487 *(riftsegment+3*counter+1)=*(segments+3*j+1);488 *(riftsegment+3*counter+2)=*(segments+3*j+2);438 riftsegment[3*counter+0]=segments[3*j+0];_assert_(riftsegment[3*counter+0]<nods); 439 riftsegment[3*counter+1]=segments[3*j+1];_assert_(riftsegment[3*counter+1]<nods); 440 riftsegment[3*counter+2]=segments[3*j+2];_assert_(riftsegment[3*counter+2]<nel); 489 441 counter++; 490 442 } … … 504 456 *priftsnumsegs=riftsnumsegs; 505 457 return noerr; 506 } 507 508 /****************************************************************************************************************************** 509 PairRiftElements 510 ******************************************************************************************************************************/ 511 458 }/*}}}*/ 459 /*FUNCTION PairRiftElements{{{*/ 512 460 int PairRiftElements(int** priftsnumpairs, double*** priftspairs,int numrifts,int* riftsnumsegments, double** riftssegments,double* x,double* y){ 513 461 … … 558 506 559 507 return noerr; 560 } 561 562 563 /****************************************************************************************************************************** 564 RemoveRifts 565 ******************************************************************************************************************************/ 566 567 double dabs(double x){ 568 if (x<0)x=-x; 569 return x; 570 } 508 }/*}}}*/ 509 /*FUNCTION RemoveRifts{{{*/ 571 510 int RemoveRifts(double** pindex,double** px,double** py,int* pnods,double** psegments,int* pnumsegs,int numrifts1,int* rifts1numsegs,double** rifts1segments,double** rifts1pairs,int nel){ 572 511 … … 615 554 if (y[i]<ymin)ymin=y[i]; 616 555 } 617 xmin=xmin- dabs(xmin);618 ymin=ymin- dabs(ymin);556 xmin=xmin-fabs(xmin); 557 ymin=ymin-fabs(ymin); 619 558 620 559 /*Initialize two arrays, one for nodes that are going to be merged, the other with corresponding nodes being merge into: */ … … 751 690 752 691 return noerr; 753 } 754 755 /****************************************************************************************************************************** 756 IsRiftPresent 757 ******************************************************************************************************************************/ 758 692 }/*}}}*/ 693 /*FUNCTION IsRiftPresent{{{*/ 759 694 int IsRiftPresent(int* priftflag,int* pnumrifts, double* segmentmarkerlist,int nsegs){ 760 695 … … 783 718 784 719 return noerr; 785 } 786 787 /****************************************************************************************************************************** 788 OrderRifts 789 ******************************************************************************************************************************/ 790 720 }/*}}}*/ 721 /*FUNCTION OrderRifts{{{*/ 791 722 int OrderRifts(double** priftstips, double** riftssegments,double** riftspairs,int numrifts,int* riftsnumsegments,double* x,double* y,int nods,int nels){ 792 723 … … 944 875 *priftstips=riftstips; 945 876 return noerr; 946 } 947 948 /****************************************************************************************************************************** 949 PenaltyPairs 950 ******************************************************************************************************************************/ 951 877 }/*}}}*/ 878 /*FUNCTION PenaltyPairs{{{*/ 952 879 int PenaltyPairs(double*** priftspenaltypairs,int** priftsnumpenaltypairs,int numrifts,double** riftssegments, 953 880 int* riftsnumsegs,double** riftspairs,double* riftstips,double* x,double* y){ -
issm/trunk-jpl/src/c/shared/TriMesh/trimesh.h
r12070 r12080 6 6 #define _SHARED_TRIMESH_H 7 7 8 9 8 #include <stdio.h> 10 9 #include <math.h> 11 10 12 13 14 11 //#define REAL double //took it out because it may conflict with stdlib.h defines. put back if necessary 15 16 12 int AssociateSegmentToElement(double** psegments,int nseg, double* index,int nel); 17 13 int OrderSegments(double** psegments,int nseg, double* index,int nel); 18 19 14 int GridInsideHole(double* px0,double* py0,int n,double* x,double* y); 20 15 int FindElement(double A,double B,double* index,int nel); 21 22 16 int SplitMeshForRifts(int* pnel,double** pindex,int* pnods,double** px,double** py,int* pnsegs,double** psegments,double** psegmentmarkerlist); 23 24 17 int IsGridOnRift(int* riftsegments, int nriftsegs, int node); 25 18 int GridElementsList(int** pGridElements, int* pNumGridElements,int node,double * index,int nel); … … 28 21 void RiftSegmentsFromSegments(int* pnriftsegs, int** priftsegments, int nel, double* index, int nsegs,double* segments); 29 22 int DetermineGridElementListOnOneSideOfRift(int* pNumGridElementListOnOneSideOfRift, int** pGridElementListOnOneSideOfRift, int segmentnumber, int nriftsegs, int* riftsegments, int node,double* index,int nel); 30 int UpdateSegments(double** psegments,double** psegmentmarkerlist, int* pnsegs, double* index, double* x,double* y,int* riftsegments,int nriftsegs );23 int UpdateSegments(double** psegments,double** psegmentmarkerlist, int* pnsegs, double* index, double* x,double* y,int* riftsegments,int nriftsegs,int nods,int nel); 31 24 int pnpoly(int npol, double *xp, double *yp, double x, double y); 32 25 int FindElement(double A,double B,double* index,int nel); 33 26 int RemoveRifts(double** pindex,double** px,double** py,int* pnods,double** psegments,int* pnumsegs,int numrifts1,int* rifts1numsegs,double** rifts1segments,double** rifts1pairs,int nel); 34 27 int IsRiftPresent(int* priftflag,int* pnumrifts, double* segmentmarkerlist,int nsegs); 35 int SplitRiftSegments(double** psegments,double** psegmentmarkerlist, int* pnumsegs, int* pnumrifts,int** priftsnumsegs,double*** priftssegments,int numrifts );28 int SplitRiftSegments(double** psegments,double** psegmentmarkerlist, int* pnumsegs, int* pnumrifts,int** priftsnumsegs,double*** priftssegments,int numrifts,int nods,int nels); 36 29 int OrderRifts(double** priftstips, double** riftssegments,double** riftspairs,int numrifts,int* riftsnumsegments,double* x,double* y,int nods,int nels); 37 30 int PenaltyPairs(double*** priftspenaltypairs,int** priftsnumpenaltypairs,int numrifts,double** riftssegments, 38 31 int* riftsnumsegments,double** riftspairs,double* riftstips,double* x,double* y); 39 40 32 int RemoveCornersFromRifts(double** pindex,int* pnel,double** px,double** py,int* pnods, double* segments,double* segmentmarkers,int num_seg); 41 33 int PairRiftElements(int** priftsnumpairs, double*** priftspairs,int numrifts,int* riftsnumsegments, double** riftssegments,double* x,double* y); 42 34 43 44 35 #endif /* _SHARED_TRIMESH_H */
Note:
See TracChangeset
for help on using the changeset viewer.