Ice Sheet System Model  4.18
Code documentation
Functions
CreateEdges.cpp File Reference

: create edges from 2d mesh More...

#include "../../classes/classes.h"
#include "../../shared/shared.h"
#include "./ModelProcessorx.h"

Go to the source code of this file.

Functions

void CreateEdges (IoModel *iomodel)
 
void EdgeOnBoundaryFlags (bool **pflags, IoModel *iomodel)
 

Detailed Description

: create edges from 2d mesh

Definition in file CreateEdges.cpp.

Function Documentation

◆ CreateEdges()

void CreateEdges ( IoModel iomodel)

Definition at line 9 of file CreateEdges.cpp.

9  {/*{{{*/
10 
11  /*If edges are already present, exit*/
12  if(iomodel->edges) return;
13 
14  /*Check Iomodel properties*/
15  if(iomodel->numberofvertices<3) _error_("not enough elements in mesh");
16  _assert_(iomodel->elements);
17 
18  /*Intermediaries*/
19  int i,j,v1,v2,v3;
20  int elementnbe,elementnbv;
21  int *elementedges = NULL;
22  int *elementedges_markers = NULL;
23 
24  /*Mesh dependent variables*/
25  switch(iomodel->meshelementtype){
26  case TriaEnum:
27  elementnbv = 3;
28  elementnbe = 3;
29  elementedges = xNew<int>(elementnbe*2);
30  elementedges_markers = xNew<int>(elementnbe);
31  elementedges[2*0+0] = 1; elementedges[2*0+1] = 2; elementedges_markers[0] = -1;
32  elementedges[2*1+0] = 2; elementedges[2*1+1] = 0; elementedges_markers[1] = -1;
33  elementedges[2*2+0] = 0; elementedges[2*2+1] = 1; elementedges_markers[2] = -1;
34  break;
35  case TetraEnum:
36  elementnbv = 4;
37  elementnbe = 6;
38  elementedges = xNew<int>(elementnbe*2);
39  elementedges_markers = xNew<int>(elementnbe);
40  elementedges[2*0+0] = 1; elementedges[2*0+1] = 2; elementedges_markers[0] = -1;
41  elementedges[2*1+0] = 0; elementedges[2*1+1] = 2; elementedges_markers[1] = -1;
42  elementedges[2*2+0] = 0; elementedges[2*2+1] = 1; elementedges_markers[2] = -1;
43  elementedges[2*3+0] = 1; elementedges[2*3+1] = 3; elementedges_markers[3] = -1;
44  elementedges[2*4+0] = 2; elementedges[2*4+1] = 3; elementedges_markers[4] = -1;
45  elementedges[2*5+0] = 0; elementedges[2*5+1] = 3; elementedges_markers[5] = -1;
46  break;
47  case PentaEnum:
48  elementnbv = 6;
49  elementnbe = 9;
50  elementedges = xNew<int>(elementnbe*2);
51  elementedges_markers = xNew<int>(elementnbe);
52  elementedges[2*0+0] = 0; elementedges[2*0+1] = 3; elementedges_markers[0] = 2;
53  elementedges[2*1+0] = 1; elementedges[2*1+1] = 4; elementedges_markers[1] = 2;
54  elementedges[2*2+0] = 2; elementedges[2*2+1] = 5; elementedges_markers[2] = 2;
55  elementedges[2*3+0] = 1; elementedges[2*3+1] = 2; elementedges_markers[3] = 1;
56  elementedges[2*4+0] = 2; elementedges[2*4+1] = 0; elementedges_markers[4] = 1;
57  elementedges[2*5+0] = 0; elementedges[2*5+1] = 1; elementedges_markers[5] = 1;
58  elementedges[2*6+0] = 4; elementedges[2*6+1] = 5; elementedges_markers[6] = 1;
59  elementedges[2*7+0] = 5; elementedges[2*7+1] = 3; elementedges_markers[7] = 1;
60  elementedges[2*8+0] = 3; elementedges[2*8+1] = 4; elementedges_markers[8] = 1;
61  break;
62  default:
63  _error_("mesh dimension not supported yet");
64  }
65 
66  /*Maximum number of edges*/
67  int maxnbe = elementnbe*iomodel->numberofelements;
68 
69  /*Initialize intermediaries*/
70  int *edgestemp = xNew<int>(maxnbe*3); /*format: [vertex1 vertex2 marker]*/
71  int *vedgestemp = xNew<int>(maxnbe*2); /*format: [vertex1 vertex2] */
72  int *hedgestemp = xNew<int>(maxnbe*2); /*format: [vertex1 vertex2] */
73  int *element_edge_connectivity = xNew<int>(iomodel->numberofelements*elementnbe); /*format: [edge1 edge2 ... edgen] */
74  int *element_vedge_connectivity = NULL;
75  int *element_hedge_connectivity = NULL;
76  if(iomodel->meshelementtype==PentaEnum){
77  element_vedge_connectivity = xNew<int>(iomodel->numberofelements*3); /*format: [edge1 edge2 ... edgen] */
78  element_hedge_connectivity = xNew<int>(iomodel->numberofelements*6); /*format: [edge1 edge2 ... edgen] */
79  }
80 
81  /*Initialize chain*/
82  int* head_minv = xNew<int>(iomodel->numberofvertices);
83  int* next_edge = xNew<int>(maxnbe);
84  for(i=0;i<iomodel->numberofvertices;i++) head_minv[i]=-1;
85 
86  /*Initialize number of edges*/
87  int nbe = 0;
88 
89  for(i=0;i<iomodel->numberofelements;i++){
90  for(j=0;j<elementnbe;j++){
91 
92  /*Get the two indices of the edge number j of the ith element*/
93  v1 = iomodel->elements[i*elementnbv+elementedges[2*j+0]]-1; _assert_(v1>=0 & v1<iomodel->numberofvertices);
94  v2 = iomodel->elements[i*elementnbv+elementedges[2*j+1]]-1; _assert_(v2>=0 & v2<iomodel->numberofvertices);
95 
96  /*v1 and v2 must be sorted*/
97  if(v2<v1){
98  v3=v2; v2=v1; v1=v3;
99  }
100 
101  /*This edge a priori has not been processed yet*/
102  bool exist = false;
103 
104  /*Go through all processed edges connected to v1 and check whether we have seen this edge yet*/
105  for(int e=head_minv[v1]; e!=-1; e=next_edge[e]){
106  if(edgestemp[e*3+1]==v2+1){
107  exist = true;
108  element_edge_connectivity[i*elementnbe+j]=e;
109  break;
110  }
111  }
112 
113  /*If this edge is new, add it to the lists*/
114  if(!exist){
115  _assert_(nbe<maxnbe);
116 
117  /*Update edges*/
118  edgestemp[nbe*3+0] = v1+1;
119  edgestemp[nbe*3+1] = v2+1;
120  edgestemp[nbe*3+2] = elementedges_markers[j];
121 
122  /*Update Connectivity*/
123  element_edge_connectivity[i*elementnbe+j]=nbe;
124 
125  /*Update chain*/
126  next_edge[nbe] = head_minv[v1];
127  head_minv[v1] = nbe;
128 
129  /*Increase number of edges*/
130  nbe++;
131  }
132  }
133  }
134 
135  /*vertical/horizontal edges*/
136  int nbve = 0;
137  int nbhe = 0;
138  if(iomodel->meshelementtype==PentaEnum){
139  for(i=0;i<iomodel->numberofvertices;i++) head_minv[i]=-1;
140  for(i=0;i<iomodel->numberofelements;i++){
141  for(j=0;j<3;j++){
142  v1 = iomodel->elements[i*elementnbv+elementedges[2*j+0]]-1; _assert_(v1>=0 & v1<iomodel->numberofvertices);
143  v2 = iomodel->elements[i*elementnbv+elementedges[2*j+1]]-1; _assert_(v2>=0 & v2<iomodel->numberofvertices);
144  if(v2<v1){ v3=v2; v2=v1; v1=v3;}
145  bool exist = false;
146  for(int e=head_minv[v1]; e!=-1; e=next_edge[e]){
147  if(vedgestemp[e*2+1]==v2+1){
148  exist = true;
149  element_vedge_connectivity[i*3+j]=e;
150  break;
151  }
152  }
153  if(!exist){
154  vedgestemp[nbve*2+0] = v1+1;
155  vedgestemp[nbve*2+1] = v2+1;
156  element_vedge_connectivity[i*3+j]=nbve;
157  next_edge[nbve] = head_minv[v1];
158  head_minv[v1] = nbve;
159  nbve++;
160  }
161  }
162  }
163  for(i=0;i<iomodel->numberofvertices;i++) head_minv[i]=-1;
164  for(i=0;i<iomodel->numberofelements;i++){
165  for(j=3;j<9;j++){
166  v1 = iomodel->elements[i*elementnbv+elementedges[2*j+0]]-1; _assert_(v1>=0 & v1<iomodel->numberofvertices);
167  v2 = iomodel->elements[i*elementnbv+elementedges[2*j+1]]-1; _assert_(v2>=0 & v2<iomodel->numberofvertices);
168  if(v2<v1){ v3=v2; v2=v1; v1=v3;}
169  bool exist = false;
170  for(int e=head_minv[v1]; e!=-1; e=next_edge[e]){
171  if(hedgestemp[e*2+1]==v2+1){
172  exist = true;
173  element_hedge_connectivity[i*6+(j-3)]=e;
174  break;
175  }
176  }
177  if(!exist){
178  hedgestemp[nbhe*2+0] = v1+1;
179  hedgestemp[nbhe*2+1] = v2+1;
180  element_hedge_connectivity[i*6+(j-3)]=nbhe;
181  next_edge[nbhe] = head_minv[v1];
182  head_minv[v1] = nbhe;
183  nbhe++;
184  }
185  }
186  }
187  }
188 
189  /*Clean up*/
190  xDelete<int>(head_minv);
191  xDelete<int>(next_edge);
192  xDelete<int>(elementedges);
193  xDelete<int>(elementedges_markers);
194 
195  /*Create final edges*/
196  int* edges = xNew<int>(nbe*3);
197  for(int i=0;i<3*nbe;i++) edges[i] = edgestemp[i];
198  xDelete<int>(edgestemp);
199  int* vedges = xNew<int>(nbve*2);
200  for(int i=0;i<2*nbve;i++) vedges[i] = vedgestemp[i];
201  xDelete<int>(vedgestemp);
202  int* hedges = xNew<int>(nbhe*2);
203  for(int i=0;i<2*nbhe;i++) hedges[i] = hedgestemp[i];
204  xDelete<int>(hedgestemp);
205 
206  /*Assign output pointers*/
207  iomodel->edges = edges;
208  iomodel->verticaledges = vedges;
209  iomodel->horizontaledges = hedges;
210  iomodel->elementtoedgeconnectivity = element_edge_connectivity;
211  iomodel->elementtoverticaledgeconnectivity = element_vedge_connectivity;
212  iomodel->elementtohorizontaledgeconnectivity = element_hedge_connectivity;
213  iomodel->numberofedges = nbe;
214  iomodel->numberofverticaledges = nbve;
215  iomodel->numberofhorizontaledges = nbhe;
216 }/*}}}*/

◆ EdgeOnBoundaryFlags()

void EdgeOnBoundaryFlags ( bool **  pflags,
IoModel iomodel 
)

Definition at line 217 of file CreateEdges.cpp.

217  {/*{{{*/
218 
219  /*Intermediaries*/
220  bool isv1,isv2;
221  int facenbv,v1,v2;
222  int id_edge,id_element;
223  int elementnbe;
224 
225  /*Mesh dependent variables*/
226  switch(iomodel->meshelementtype){
227  case TriaEnum: elementnbe = 3; break;
228  case TetraEnum: elementnbe = 6; break;
229  case PentaEnum: elementnbe = 9; break;
230  default: _error_("mesh dimension not supported yet");
231  }
232 
233  /*Get edges and allocate output*/
234  if(!iomodel->edges) CreateEdges(iomodel);
235  bool* flags = xNewZeroInit<bool>(iomodel->numberofedges);
236 
237  if(iomodel->domaindim==2){
238 
239  /*Count how many times an edge is found in elementtoedgeconnectivity*/
240  int* counter = xNewZeroInit<int>(iomodel->numberofedges);
241  for(int i=0;i<iomodel->numberofelements;i++){
242  for(int j=0;j<elementnbe;j++){
243  counter[iomodel->elementtoedgeconnectivity[elementnbe*i+j]] += 1;
244  }
245  }
246 
247  /*Now, loop over the egdes, whenever it is not connected to a second element, the edge is on boundary*/
248  for(int i=0;i<iomodel->numberofedges;i++){
249  if(counter[i]==1) flags[i]=true;
250  }
251 
252  /*Clean up*/
253  xDelete<int>(counter);
254  }
255  else if(iomodel->domaindim==3){
256 
257  /*Get faces*/
258  if(!iomodel->faces) CreateFaces(iomodel);
259 
260  /*Now, loop over the faces, whenever it is not connected to a second element, all edges are on boundary*/
261  for(int id_face=0;id_face<iomodel->numberoffaces;id_face++){
262 
263  if(iomodel->faces[id_face*iomodel->facescols+1]==-1){
264 
265  /*The face is connected to the element e only*/
266  id_element = iomodel->faces[id_face*iomodel->facescols+0]-1;
267  facenbv = iomodel->faces[id_face*iomodel->facescols+3];
268 
269  /*Get all edges for this element*/
270  for(int edge = 0; edge<elementnbe; edge++){
271 
272  id_edge = iomodel->elementtoedgeconnectivity[elementnbe*id_element+edge];
273  v1 = iomodel->edges[id_edge*3+0];
274  v2 = iomodel->edges[id_edge*3+1];
275 
276  /*Test if v1 is in the face*/
277  isv1=false;
278  for(int i=0;i<facenbv;i++){
279  if(iomodel->faces[id_face*iomodel->facescols+4+i] == v1){
280  isv1 = true; break;
281  }
282  }
283  if(!isv1) continue;
284 
285  /*test if v2 is in the face*/
286  isv2=false;
287  for(int i=0;i<facenbv;i++){
288  if(iomodel->faces[id_face*iomodel->facescols+4+i] == v2){
289  isv2 = true; break;
290  }
291  }
292 
293  /*If v1 and v2 are found, this edge is on boundary*/
294  if(isv2) flags[id_edge] = true;
295  }
296  }
297  }
298  }
299  else{
300  _error_("dimension not supported");
301  }
302 
303  /*Clean up and return*/
304  *pflags = flags;
305 }/*}}}*/
_assert_
#define _assert_(ignore)
Definition: exceptions.h:37
TetraEnum
@ TetraEnum
Definition: EnumDefinitions.h:1300
CreateEdges
void CreateEdges(IoModel *iomodel)
Definition: CreateEdges.cpp:9
IoModel::elementtohorizontaledgeconnectivity
int * elementtohorizontaledgeconnectivity
Definition: IoModel.h:85
IoModel::numberoffaces
int numberoffaces
Definition: IoModel.h:97
IoModel::numberofvertices
int numberofvertices
Definition: IoModel.h:99
IoModel::numberofelements
int numberofelements
Definition: IoModel.h:96
IoModel::facescols
int facescols
Definition: IoModel.h:90
IoModel::elementtoverticaledgeconnectivity
int * elementtoverticaledgeconnectivity
Definition: IoModel.h:84
IoModel::verticaledges
int * verticaledges
Definition: IoModel.h:81
IoModel::elementtoedgeconnectivity
int * elementtoedgeconnectivity
Definition: IoModel.h:83
IoModel::horizontaledges
int * horizontaledges
Definition: IoModel.h:82
IoModel::numberofhorizontaledges
int numberofhorizontaledges
Definition: IoModel.h:95
IoModel::domaindim
int domaindim
Definition: IoModel.h:77
_error_
#define _error_(StreamArgs)
Definition: exceptions.h:49
IoModel::faces
int * faces
Definition: IoModel.h:88
IoModel::numberofverticaledges
int numberofverticaledges
Definition: IoModel.h:94
PentaEnum
@ PentaEnum
Definition: EnumDefinitions.h:1231
IoModel::elements
int * elements
Definition: IoModel.h:79
IoModel::edges
int * edges
Definition: IoModel.h:80
IoModel::meshelementtype
int meshelementtype
Definition: IoModel.h:91
CreateFaces
void CreateFaces(IoModel *iomodel)
Definition: CreateFaces.cpp:9
TriaEnum
@ TriaEnum
Definition: EnumDefinitions.h:1318
IoModel::numberofedges
int numberofedges
Definition: IoModel.h:93