Ice Sheet System Model  4.18
Code documentation
Functions
SplitMeshForRifts.cpp File Reference
#include "./triangle.h"
#include "../MemOps/MemOps.h"

Go to the source code of this file.

Functions

int SplitMeshForRifts (int *pnel, int **pindex, int *pnods, double **px, double **py, int *pnsegs, int **psegments, int **psegmentmarkerlist)
 

Function Documentation

◆ SplitMeshForRifts()

int SplitMeshForRifts ( int *  pnel,
int **  pindex,
int *  pnods,
double **  px,
double **  py,
int *  pnsegs,
int **  psegments,
int **  psegmentmarkerlist 
)

Definition at line 7 of file SplitMeshForRifts.cpp.

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