source: issm/trunk/src/c/shared/TriMesh/SplitMeshForRifts.cpp@ 12706

Last change on this file since 12706 was 12706, checked in by Mathieu Morlighem, 13 years ago

merged trunk-jpl and trunk for revision 12703

File size: 3.0 KB
Line 
1/*
2 * SplitMeshForRifts.c:
3 */
4#include "./trimesh.h"
5#include "../Alloc/xNewDelete.h"
6#include "../Alloc/alloc.h"
7
8int SplitMeshForRifts(int* pnel,double** pindex,int* pnods,double** px,double** py,int* pnsegs,double** psegments,double** psegmentmarkerlist){
9
10 /*Some notes on dimensions:
11 index of size nelx3
12 x and y of size nodsx1
13 segments of size nsegsx3*/
14
15 /*Error management: */
16 int noerr=1;
17
18 int i,j,k,l;
19 int node;
20 int el;
21
22 int nriftsegs;
23 int* riftsegments=NULL;
24 int* flags=NULL;
25
26 int NumGridElementListOnOneSideOfRift;
27 int* GridElementListOnOneSideOfRift=NULL;
28
29 /*Input: */
30 int nel;
31 double* index=NULL;
32 int nods;
33 double* x=NULL;
34 double* y=NULL;
35 double* segments=NULL;
36 double* segmentmarkerlist=NULL;
37 int nsegs;
38
39 /*Recover input: */
40 nel=*pnel;
41 index=*pindex;
42 nods=*pnods;
43 x=*px;
44 y=*py;
45 nsegs=*pnsegs;
46 segments=*psegments;
47 segmentmarkerlist=*psegmentmarkerlist;
48
49 /*Establish list of segments that belong to a rift: */
50 /*riftsegments of size nriftsegsx4 (4 for first element on segment,second element,first node and second snode)*/
51 RiftSegmentsFromSegments(&nriftsegs,&riftsegments,nel,index,nsegs,segments);
52
53 /*Go through all nodes of the rift segments, and start splitting the mesh: */
54 flags=xNewZeroInit<int>(nods); //to make sure we don't split the same nodes twice!
55 for (i=0;i<nriftsegs;i++){
56 for (j=0;j<2;j++){
57
58 node=riftsegments[4*i+j+2];
59 if(flags[node-1]){
60 /*This node was already split, skip:*/
61 continue;
62 }
63 else{
64 flags[node-1]=1;
65 }
66
67 if(IsGridOnRift(riftsegments,nriftsegs,node)){
68
69 DetermineGridElementListOnOneSideOfRift(&NumGridElementListOnOneSideOfRift,&GridElementListOnOneSideOfRift,i,nriftsegs,riftsegments,node,index,nel);
70
71 /*Summary: we have for node, a list of elements
72 * (GridElementListOnOneSideOfRift, of size
73 * NumGridElementListOnOneSideOfRift) that all contain node
74 *and that are on the same side of the rift. For all these
75 elements, we clone node into another node, and we swap all
76 instances of node in the triangulation *for those elements, to the
77 new node.*/
78
79 //augment number of nodes
80 nods=nods+1;
81 //create new node
82 x=(double*)xrealloc(x,nods*sizeof(double));
83 y=(double*)xrealloc(y,nods*sizeof(double));
84 x[nods-1]=x[node-1]; //matlab indexing
85 y[nods-1]=y[node-1]; //matlab indexing
86
87 //change elements owning this node
88 for (k=0;k<NumGridElementListOnOneSideOfRift;k++){
89 el=GridElementListOnOneSideOfRift[k];
90 for (l=0;l<3;l++){
91 if (*(index+3*el+l)==node)*(index+3*el+l)=nods; //again, matlab indexing.
92 }
93 }
94 }// if(IsGridOnRift(riftsegments,nriftsegs,node))
95 } //for(j=0;j<2;j++)
96 } //for (i=0;i<nriftsegs;i++)
97
98 /*update segments: they got modified completely by adding new nodes.*/
99 UpdateSegments(&segments,&segmentmarkerlist, &nsegs,index,x,y,riftsegments,nriftsegs,nods,nel);
100
101 /*Assign output pointers: */
102 *pnel=nel;
103 *pindex=index;
104 *pnods=nods;
105 *px=x;
106 *py=y;
107 *pnsegs=nsegs;
108 *psegments=segments;
109 *psegmentmarkerlist=segmentmarkerlist;
110 return noerr;
111}
Note: See TracBrowser for help on using the repository browser.