Ice Sheet System Model  4.18
Code documentation
Functions
Trianglex.cpp File Reference
#include "./Trianglex.h"
#include "../../shared/shared.h"
#include "../../toolkits/toolkits.h"

Go to the source code of this file.

Functions

void Trianglex (int **pindex, IssmPDouble **px, IssmPDouble **py, int **psegments, int **psegmentmarkerlist, int *pnels, int *pnods, int *pnsegs, Contours *domain, Contours *rifts, double area)
 

Function Documentation

◆ Trianglex()

void Trianglex ( int **  pindex,
IssmPDouble **  px,
IssmPDouble **  py,
int **  psegments,
int **  psegmentmarkerlist,
int *  pnels,
int *  pnods,
int *  pnsegs,
Contours domain,
Contours rifts,
double  area 
)

Definition at line 19 of file Trianglex.cpp.

19  {
20 
21 #if !defined(_HAVE_TRIANGLE_)
22  _error_("triangle has not been installed");
23 #else
24  /*indexing: */
25  int i,j;
26 
27  /*output: */
28  int *index = NULL;
29  double *x = NULL;
30  double *y = NULL;
31  int *segments = NULL;
32  int *segmentmarkerlist = NULL;
33 
34  /*intermediary: */
35  int counter,counter2,backcounter;
36  Contour<IssmPDouble> *contour = NULL;
37 
38  /* Triangle structures needed to call Triangle library routines: */
39  struct triangulateio in,out;
40  char options[256];
41 
42  /*Create initial triangulation to call triangulate(). First number of points:*/
43  in.numberofpoints=0;
44  for (i=0;i<domain->Size();i++){
45  contour=(Contour<IssmPDouble>*)domain->GetObjectByOffset(i);
46  in.numberofpoints+=contour->nods-1;
47  }
48  for (i=0;i<rifts->Size();i++){
49  contour=(Contour<IssmPDouble>*)rifts->GetObjectByOffset(i);
50  in.numberofpoints+=contour->nods;
51  }
52 
53  /*number of point attributes: */
54  in.numberofpointattributes=1;
55 
56  /*fill in the point list: */
57  in.pointlist = xNew<REAL>(in.numberofpoints*2);
58 
59  counter=0;
60  for (i=0;i<domain->Size();i++){
61  contour=(Contour<IssmPDouble>*)domain->GetObjectByOffset(i);
62  for (j=0;j<contour->nods-1;j++){
63  in.pointlist[2*counter+0]=contour->x[j];
64  in.pointlist[2*counter+1]=contour->y[j];
65  counter++;
66  }
67  }
68  for (i=0;i<rifts->Size();i++){
69  contour=(Contour<IssmPDouble>*)rifts->GetObjectByOffset(i);
70  for (j=0;j<contour->nods;j++){
71  in.pointlist[2*counter+0]=contour->x[j];
72  in.pointlist[2*counter+1]=contour->y[j];
73  counter++;
74  }
75  }
76 
77  /*fill in the point attribute list: */
78  in.pointattributelist = xNew<REAL>(in.numberofpoints*in.numberofpointattributes);
79  for (i=0;i<in.numberofpoints;i++) in.pointattributelist[i] = 0.0;
80 
81  /*fill in the point marker list: */
82  in.pointmarkerlist = xNew<int>(in.numberofpoints);
83  for(i=0;i<in.numberofpoints;i++) in.pointmarkerlist[i] = 0;
84 
85  /*Build segments. First figure out number of segments: holes and closed outlines have as many segments as vertices: */
86  in.numberofsegments=0;
87  for (i=0;i<domain->Size();i++){
88  contour=(Contour<IssmPDouble>*)domain->GetObjectByOffset(i);
89  in.numberofsegments+=contour->nods-1;
90  }
91  for(i=0;i<rifts->Size();i++){
92  contour=(Contour<IssmPDouble>*)rifts->GetObjectByOffset(i);
93  /*for rifts, we have one less segment as we have vertices*/
94  in.numberofsegments+=contour->nods-1;
95  }
96 
97  in.segmentlist = xNew<int>(in.numberofsegments*2);
98  in.segmentmarkerlist = xNewZeroInit<int>(in.numberofsegments);
99  counter=0;
100  backcounter=0;
101  for (i=0;i<domain->Size();i++){
102  contour=(Contour<IssmPDouble>*)domain->GetObjectByOffset(i);
103  for (j=0;j<contour->nods-2;j++){
104  in.segmentlist[2*counter+0]=counter;
105  in.segmentlist[2*counter+1]=counter+1;
106  in.segmentmarkerlist[counter]=0;
107  counter++;
108  }
109  /*Close this profile: */
110  in.segmentlist[2*counter+0]=counter;
111  in.segmentlist[2*counter+1]=backcounter;
112  in.segmentmarkerlist[counter]=0;
113  counter++;
114  backcounter=counter;
115  }
116  counter2=counter;
117  for (i=0;i<rifts->Size();i++){
118  contour=(Contour<IssmPDouble>*)rifts->GetObjectByOffset(i);
119  for (j=0;j<(contour->nods-1);j++){
120  in.segmentlist[2*counter2+0]=counter;
121  in.segmentlist[2*counter2+1]=counter+1;
122  in.segmentmarkerlist[counter2]=2+i;
123  counter2++;
124  counter++;
125  }
126  counter++;
127  }
128 
129  /*Build regions: */
130  in.numberofregions = 0;
131 
132  /*Build holes: */
133  in.numberofholes = domain->Size()-1; /*everything is a hole, but for the first profile.*/
134  if(in.numberofholes){
135  in.holelist = xNew<REAL>(in.numberofholes*2);
136  for (i=0;i<domain->Size()-1;i++){
137  contour=(Contour<IssmPDouble>*)domain->GetObjectByOffset(i+1);
138  GridInsideHole(&in.holelist[2*i+0],&in.holelist[2*i+1],contour->nods-1,contour->x,contour->y);
139  }
140  }
141 
142  /* Make necessary initializations so that Triangle can return a triangulation in `out': */
143  out.pointlist = (REAL*)NULL;
144  out.pointattributelist = (REAL*)NULL;
145  out.pointmarkerlist = (int *)NULL;
146  out.trianglelist = (int *)NULL;
147  out.triangleattributelist = (REAL*)NULL;
148  out.neighborlist = (int *)NULL;
149  out.segmentlist = (int *)NULL;
150  out.segmentmarkerlist = (int *)NULL;
151  out.edgelist = (int *)NULL;
152  out.edgemarkerlist = (int *)NULL;
153 
154  /* Triangulate the points:. Switches are chosen to read and write a */
155  /* PSLG (p), preserve the convex hull (c), number everything from */
156  /* zero (z), assign a regional attribute to each element (A), and */
157  /* produce an edge list (e), a Voronoi diagram (v), and a triangle */
158  /* neighbor list (n). */
159  sprintf(options,"%s%lf","pQzDq30ia",area); /*replace V by Q to quiet down the logging*/
160  triangulate(options, &in, &out, NULL);
161  /*report(&out, 0, 1, 1, 1, 1, 0);*/
162 
163  /*Allocate index, x and y: */
164  index=xNew<int>(3*out.numberoftriangles);
165  x=xNew<double>(out.numberofpoints);
166  y=xNew<double>(out.numberofpoints);
167  segments=xNew<int>(3*out.numberofsegments);
168  segmentmarkerlist=xNew<int>(out.numberofsegments);
169 
170  for (i = 0; i< out.numberoftriangles; i++) {
171  for (j = 0; j < out.numberofcorners; j++) {
172  index[3*i+j]=(int)out.trianglelist[i*out.numberofcorners+j]+1;
173  }
174  }
175  for (i = 0; i< out.numberofpoints; i++){
176  x[i]=(double)out.pointlist[i*2+0];
177  y[i]=(double)out.pointlist[i*2+1];
178  }
179  for (i = 0; i<out.numberofsegments;i++){
180  segments[3*i+0]=(int)out.segmentlist[i*2+0]+1;
181  segments[3*i+1]=(int)out.segmentlist[i*2+1]+1;
182  segmentmarkerlist[i]=(int)out.segmentmarkerlist[i];
183  }
184 
185  /*Associate elements with segments: */
186  AssociateSegmentToElement(&segments,out.numberofsegments,index,out.numberoftriangles);
187 
188  /*Order segments so that their normals point outside the domain: */
189  OrderSegments(&segments,out.numberofsegments, index,out.numberoftriangles);
190 
191  /*Output : */
192  *pindex=index;
193  *px=x;
194  *py=y;
195  *psegments=segments;
196  *psegmentmarkerlist=segmentmarkerlist;
197  *pnels=out.numberoftriangles;
198  *pnods=out.numberofpoints;
199  *pnsegs=out.numberofsegments;
200 #endif
201 }
DataSet::Size
int Size()
Definition: DataSet.cpp:399
GridInsideHole
int GridInsideHole(double *px0, double *py0, int n, double *x, double *y)
Definition: GridInsideHole.cpp:14
AssociateSegmentToElement
int AssociateSegmentToElement(int **psegments, int nseg, int *index, int nel)
Definition: AssociateSegmentToElement.cpp:7
Contour
Definition: Contour.h:15
OrderSegments
int OrderSegments(int **psegments, int nseg, int *index, int nel)
Definition: OrderSegments.cpp:7
Contour::nods
int nods
Definition: Contour.h:20
Contour::y
doubletype * y
Definition: Contour.h:22
_error_
#define _error_(StreamArgs)
Definition: exceptions.h:49
DataSet::GetObjectByOffset
Object * GetObjectByOffset(int offset)
Definition: DataSet.cpp:334
Contour::x
doubletype * x
Definition: Contour.h:21