Ice Sheet System Model  4.18
Code documentation
Macros | Functions
CreateNodes.cpp File Reference
#include "../../toolkits/toolkits.h"
#include "../../classes/classes.h"
#include "../../shared/shared.h"
#include "../MeshPartitionx/MeshPartitionx.h"
#include "./ModelProcessorx.h"

Go to the source code of this file.

Macros

#define MAXCONNECTIVITY   5
 

Functions

bool IsNodeInRank (int *nodes_ranks, int *nodes_proc_count, int nid, int rank)
 
int NodeMasterRank (int *nodes_ranks, int nid)
 
void AddNodeToRank (int *nodes_ranks, int *nodes_proc_count, int nid, int rank)
 
void CreateNodes (Nodes *nodes, IoModel *iomodel, int analysis, int finite_element, bool isamr, int approximation, int *approximations)
 

Macro Definition Documentation

◆ MAXCONNECTIVITY

#define MAXCONNECTIVITY   5

Definition at line 11 of file CreateNodes.cpp.

Function Documentation

◆ IsNodeInRank()

bool IsNodeInRank ( int *  nodes_ranks,
int *  nodes_proc_count,
int  nid,
int  rank 
)

Definition at line 13 of file CreateNodes.cpp.

13  {/*{{{*/
14 
15  /*See if node is already in partition*/
16  for(int k=0;k<nodes_proc_count[nid];k++){
17  if(nodes_ranks[MAXCONNECTIVITY*nid+k] == rank) return true;
18  }
19 
20  return false;
21 }/*}}}*/

◆ NodeMasterRank()

int NodeMasterRank ( int *  nodes_ranks,
int  nid 
)

Definition at line 22 of file CreateNodes.cpp.

22  {/*{{{*/
23  return nodes_ranks[MAXCONNECTIVITY*nid+0];
24 }/*}}}*/

◆ AddNodeToRank()

void AddNodeToRank ( int *  nodes_ranks,
int *  nodes_proc_count,
int  nid,
int  rank 
)

Definition at line 25 of file CreateNodes.cpp.

25  {/*{{{*/
26 
27  /*See if node is already in partition, return if this is the case*/
28  if(IsNodeInRank(nodes_ranks,nodes_proc_count,nid,rank)) return;
29 
30  /*This rank has not been marked for this node just yet so go ahead and add it*/
31  if(nodes_proc_count[nid]==MAXCONNECTIVITY) _error_("This node is connected to more than "<<MAXCONNECTIVITY<<" partition. Either reduce the number of processors, or increase MAXCONNECTIVITY");
32  nodes_ranks[MAXCONNECTIVITY*nid+nodes_proc_count[nid]] = rank;
33  nodes_proc_count[nid]++;
34 }/*}}}*/

◆ CreateNodes()

void CreateNodes ( Nodes nodes,
IoModel iomodel,
int  analysis,
int  finite_element,
bool  isamr,
int  approximation,
int *  approximations 
)

Definition at line 36 of file CreateNodes.cpp.

36  {
37 
38  /*Intermediaries*/
39  int numnodes;
40  int element_numnodes;
41  int element_node_ids[40] = {0};
42 
43  /*Get partitioning variables*/
44  int my_rank = IssmComm::GetRank();
45  int num_procs = IssmComm::GetSize();
46  int* epart = iomodel->epart;
47 
48  /*Determine how many nodes we have in total (which depends on the type of finite element)*/
49  /*{{{*/
50  if(iomodel->meshelementtype==TriaEnum){
51  switch(finite_element){
52  case P0DGEnum:
53  numnodes = iomodel->numberofelements;
54  break;
55  case P1Enum:
56  numnodes = iomodel->numberofvertices;
57  break;
58  case P1DGEnum:
59  numnodes = 3*iomodel->numberofelements;
60  break;
62  numnodes = iomodel->numberofvertices+iomodel->numberofelements;
63  break;
64  case P2Enum:
65  EdgesPartitioning(iomodel);
66  numnodes = iomodel->numberofvertices+iomodel->numberofedges;
67  break;
68  case MINIEnum: case MINIcondensedEnum:
69  /*P1+ velocity (bubble statically condensed), P1 pressure*/
70  numnodes = (iomodel->numberofvertices+iomodel->numberofelements) + (iomodel->numberofvertices);
71  break;
73  /*P2 velocity, P1 pressure*/
74  EdgesPartitioning(iomodel);
75  numnodes = (iomodel->numberofvertices+iomodel->numberofedges) + (iomodel->numberofvertices);
76  break;
77  case LATaylorHoodEnum:
78  /*P2 velocity*/
79  EdgesPartitioning(iomodel);
80  numnodes = (iomodel->numberofvertices+iomodel->numberofedges);
81  break;
83  /*P2b velocity, P1 DG pressure*/
84  EdgesPartitioning(iomodel);
85  numnodes = (iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofelements) + (3*iomodel->numberofelements);
86  break;
88  /*P2b velocity*/
89  EdgesPartitioning(iomodel);
90  numnodes = (iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofelements);
91  break;
92  default:
93  _error_("Finite element "<<EnumToStringx(finite_element)<<" not supported yet");
94  }
95  }
96  else if(iomodel->meshelementtype==PentaEnum){
97  switch(finite_element){
98  case P1Enum:
99  numnodes = iomodel->numberofvertices;
100  break;
102  numnodes = iomodel->numberofvertices+iomodel->numberofelements;
103  break;
104  case P1xP2Enum:
105  EdgesPartitioning(iomodel);
106  numnodes = iomodel->numberofvertices+iomodel->numberofverticaledges;
107  break;
108  case P1xP3Enum:
109  EdgesPartitioning(iomodel);
110  numnodes = iomodel->numberofvertices+2*iomodel->numberofverticaledges;
111  break;
112  case P1xP4Enum:
113  EdgesPartitioning(iomodel);
114  numnodes = iomodel->numberofvertices+3*iomodel->numberofverticaledges;
115  break;
116  case P2xP1Enum:
117  EdgesPartitioning(iomodel);
118  numnodes = iomodel->numberofvertices+iomodel->numberofhorizontaledges;
119  break;
120  case P2Enum:
121  EdgesPartitioning(iomodel);
122  FacesPartitioning(iomodel);
123  numnodes = iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofverticalfaces;
124  break;
125  case P2xP4Enum:
126  EdgesPartitioning(iomodel);
127  FacesPartitioning(iomodel);
128  numnodes = iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->numberofverticalfaces;
129  break;
130  case MINIEnum: case MINIcondensedEnum:
131  /*P1+ velocity (bubble statically condensed), P1 pressure*/
132  numnodes = (iomodel->numberofvertices+iomodel->numberofelements) + (iomodel->numberofvertices);
133  break;
134  case TaylorHoodEnum: case XTaylorHoodEnum:
135  /*P2 velocity, P1 pressure*/
136  EdgesPartitioning(iomodel);
137  FacesPartitioning(iomodel);
138  numnodes = (iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofverticalfaces) + (iomodel->numberofvertices);
139  break;
140  case OneLayerP4zEnum:
141  /*P2xP4 velocity, P1 pressure*/
142  EdgesPartitioning(iomodel);
143  FacesPartitioning(iomodel);
144  numnodes = (iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->numberofverticalfaces) + (iomodel->numberofvertices);
145  break;
146  default:
147  _error_("Finite element "<<EnumToStringx(finite_element)<<" not supported yet");
148  }
149  }
150  else{
151  _error_("mesh elements "<< EnumToStringx(iomodel->meshelementtype) <<" not supported yet");
152  }
153  /*}}}*/
154 
155  /*create matrix that keeps track of all ranks that have node i, and initialize as -1 (Common to all CPUs)*/
156  int* nodes_ranks = xNew<int>(MAXCONNECTIVITY*numnodes);
157  for(int i=0;i<MAXCONNECTIVITY*numnodes;i++) nodes_ranks[i] = -1;
158 
159  /*For all nodes, count how many cpus have node i (initialize with 0)*/
160  int* nodes_proc_count = xNewZeroInit<int>(numnodes);
161 
162  /*Create vector of approximation per node (used for FS: vel or pressure)*/
163  int* nodes_approx = xNew<int>(numnodes);
164  if(approximations){
165  for(int i=0;i<numnodes;i++) nodes_approx[i] = approximations[i];
166  }
167  else{
168  for(int i=0;i<numnodes;i++) nodes_approx[i] = approximation;
169  }
170 
171  /*Go through all elements and mark all vertices for all partitions*/
172  /*{{{*/
173  for(int i=0;i<iomodel->numberofelements;i++){
174 
175  /*Define nodes sids for each element*/
176  if(iomodel->meshelementtype==TriaEnum){
177  switch(finite_element){
178  case P0DGEnum:
179  element_numnodes=1;
180  element_node_ids[0]=i;
181  break;
182  case P1Enum:
183  element_numnodes=3;
184  element_node_ids[0]=iomodel->elements[3*i+0]-1;
185  element_node_ids[1]=iomodel->elements[3*i+1]-1;
186  element_node_ids[2]=iomodel->elements[3*i+2]-1;
187  break;
189  element_numnodes=4;
190  element_node_ids[0]=iomodel->elements[3*i+0]-1;
191  element_node_ids[1]=iomodel->elements[3*i+1]-1;
192  element_node_ids[2]=iomodel->elements[3*i+2]-1;
193  element_node_ids[3]=iomodel->numberofvertices+i;
194  break;
195  case P1DGEnum:
196  element_numnodes=3;
197  element_node_ids[0]=3*i+0;
198  element_node_ids[1]=3*i+1;
199  element_node_ids[2]=3*i+2;
200  break;
201  case P2Enum:
202  element_numnodes = 6;
203  element_node_ids[0]=iomodel->elements[3*i+0]-1;
204  element_node_ids[1]=iomodel->elements[3*i+1]-1;
205  element_node_ids[2]=iomodel->elements[3*i+2]-1;
206  element_node_ids[3]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+0];
207  element_node_ids[4]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+1];
208  element_node_ids[5]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+2];
209  break;
210  case MINIEnum: case MINIcondensedEnum:
211  element_numnodes = 4+3;
212  element_node_ids[0]=iomodel->elements[3*i+0]-1;
213  element_node_ids[1]=iomodel->elements[3*i+1]-1;
214  element_node_ids[2]=iomodel->elements[3*i+2]-1;
215  element_node_ids[3]=iomodel->numberofvertices+i;
216  for(int n=0;n<4;n++) nodes_approx[element_node_ids[n]] = FSvelocityEnum;
217  element_node_ids[4]=iomodel->numberofvertices+iomodel->numberofelements+iomodel->elements[3*i+0]-1;
218  element_node_ids[5]=iomodel->numberofvertices+iomodel->numberofelements+iomodel->elements[3*i+1]-1;
219  element_node_ids[6]=iomodel->numberofvertices+iomodel->numberofelements+iomodel->elements[3*i+2]-1;
220  for(int n=4;n<7;n++) nodes_approx[element_node_ids[n]] = FSpressureEnum;
221  break;
222  case TaylorHoodEnum: case XTaylorHoodEnum:
223  element_numnodes = 6+3;
224  element_node_ids[0]=iomodel->elements[3*i+0]-1;
225  element_node_ids[1]=iomodel->elements[3*i+1]-1;
226  element_node_ids[2]=iomodel->elements[3*i+2]-1;
227  element_node_ids[3]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+0];
228  element_node_ids[4]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+1];
229  element_node_ids[5]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+2];
230  for(int n=0;n<6;n++) nodes_approx[element_node_ids[n]] = FSvelocityEnum;
231  element_node_ids[6]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elements[3*i+0]-1;
232  element_node_ids[7]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elements[3*i+1]-1;
233  element_node_ids[8]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elements[3*i+2]-1;
234  for(int n=6;n<9;n++) nodes_approx[element_node_ids[n]] = FSpressureEnum;
235  break;
236  case LATaylorHoodEnum:
237  element_numnodes = 6;
238  element_node_ids[0]=iomodel->elements[3*i+0]-1;
239  element_node_ids[1]=iomodel->elements[3*i+1]-1;
240  element_node_ids[2]=iomodel->elements[3*i+2]-1;
241  element_node_ids[3]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+0];
242  element_node_ids[4]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+1];
243  element_node_ids[5]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+2];
244  for(int n=0;n<6;n++) nodes_approx[element_node_ids[n]] = FSvelocityEnum;
245  break;
246  case CrouzeixRaviartEnum:
247  element_numnodes = 7+3;
248  element_node_ids[0]=iomodel->elements[3*i+0]-1;
249  element_node_ids[1]=iomodel->elements[3*i+1]-1;
250  element_node_ids[2]=iomodel->elements[3*i+2]-1;
251  element_node_ids[3]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+0];
252  element_node_ids[4]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+1];
253  element_node_ids[5]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+2];
254  element_node_ids[6]=iomodel->numberofvertices+iomodel->numberofedges+i;
255  for(int n=0;n<7;n++) nodes_approx[element_node_ids[n]] = FSvelocityEnum;
256  element_node_ids[7]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofelements+3*i+0;
257  element_node_ids[8]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofelements+3*i+1;
258  element_node_ids[9]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofelements+3*i+2;
259  for(int n=7;n<10;n++) nodes_approx[element_node_ids[n]] = FSpressureEnum;
260  break;
262  element_numnodes = 7;
263  element_node_ids[0]=iomodel->elements[3*i+0]-1;
264  element_node_ids[1]=iomodel->elements[3*i+1]-1;
265  element_node_ids[2]=iomodel->elements[3*i+2]-1;
266  element_node_ids[3]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+0];
267  element_node_ids[4]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+1];
268  element_node_ids[5]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+2];
269  element_node_ids[6]=iomodel->numberofvertices+iomodel->numberofedges+i;
270  for(int n=0;n<7;n++) nodes_approx[element_node_ids[n]] = FSvelocityEnum;
271  break;
272  default:
273  _error_("Finite element "<<EnumToStringx(finite_element)<<" not supported yet");
274  }
275  }
276  else if(iomodel->meshelementtype==PentaEnum){
277  switch(finite_element){
278  case P1Enum:
279  element_numnodes=6;
280  element_node_ids[0]=iomodel->elements[6*i+0]-1;
281  element_node_ids[1]=iomodel->elements[6*i+1]-1;
282  element_node_ids[2]=iomodel->elements[6*i+2]-1;
283  element_node_ids[3]=iomodel->elements[6*i+3]-1;
284  element_node_ids[4]=iomodel->elements[6*i+4]-1;
285  element_node_ids[5]=iomodel->elements[6*i+5]-1;
286  break;
288  element_numnodes=7;
289  element_node_ids[0]=iomodel->elements[6*i+0]-1;
290  element_node_ids[1]=iomodel->elements[6*i+1]-1;
291  element_node_ids[2]=iomodel->elements[6*i+2]-1;
292  element_node_ids[3]=iomodel->elements[6*i+3]-1;
293  element_node_ids[4]=iomodel->elements[6*i+4]-1;
294  element_node_ids[5]=iomodel->elements[6*i+5]-1;
295  element_node_ids[6]=iomodel->numberofvertices+i;
296  break;
297  case P1xP2Enum:
298  element_numnodes=9;
299  element_node_ids[0]=iomodel->elements[6*i+0]-1;
300  element_node_ids[1]=iomodel->elements[6*i+1]-1;
301  element_node_ids[2]=iomodel->elements[6*i+2]-1;
302  element_node_ids[3]=iomodel->elements[6*i+3]-1;
303  element_node_ids[4]=iomodel->elements[6*i+4]-1;
304  element_node_ids[5]=iomodel->elements[6*i+5]-1;
305  element_node_ids[6]=iomodel->numberofvertices+iomodel->elementtoverticaledgeconnectivity[3*i+0];
306  element_node_ids[7]=iomodel->numberofvertices+iomodel->elementtoverticaledgeconnectivity[3*i+1];
307  element_node_ids[8]=iomodel->numberofvertices+iomodel->elementtoverticaledgeconnectivity[3*i+2];
308  break;
309  case P1xP3Enum:
310  element_numnodes=12;
311  element_node_ids[ 0]=iomodel->elements[6*i+0]-1;
312  element_node_ids[ 1]=iomodel->elements[6*i+1]-1;
313  element_node_ids[ 2]=iomodel->elements[6*i+2]-1;
314  element_node_ids[ 3]=iomodel->elements[6*i+3]-1;
315  element_node_ids[ 4]=iomodel->elements[6*i+4]-1;
316  element_node_ids[ 5]=iomodel->elements[6*i+5]-1;
317  element_node_ids[ 6]=iomodel->numberofvertices+2*iomodel->elementtoverticaledgeconnectivity[3*i+0]+0;
318  element_node_ids[ 7]=iomodel->numberofvertices+2*iomodel->elementtoverticaledgeconnectivity[3*i+1]+0;
319  element_node_ids[ 8]=iomodel->numberofvertices+2*iomodel->elementtoverticaledgeconnectivity[3*i+2]+0;
320  element_node_ids[ 9]=iomodel->numberofvertices+2*iomodel->elementtoverticaledgeconnectivity[3*i+0]+1;
321  element_node_ids[10]=iomodel->numberofvertices+2*iomodel->elementtoverticaledgeconnectivity[3*i+1]+1;
322  element_node_ids[11]=iomodel->numberofvertices+2*iomodel->elementtoverticaledgeconnectivity[3*i+2]+1;
323  break;
324  case P1xP4Enum:
325  element_numnodes=15;
326  element_node_ids[ 0]=iomodel->elements[6*i+0]-1; /*Vertex 1*/
327  element_node_ids[ 1]=iomodel->elements[6*i+1]-1; /*Vertex 2*/
328  element_node_ids[ 2]=iomodel->elements[6*i+2]-1; /*Vertex 3*/
329  element_node_ids[ 3]=iomodel->elements[6*i+3]-1; /*Vertex 4*/
330  element_node_ids[ 4]=iomodel->elements[6*i+4]-1; /*Vertex 5*/
331  element_node_ids[ 5]=iomodel->elements[6*i+5]-1; /*Vertex 6*/
332  element_node_ids[ 6]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*i+0]+0; /*mid vertical edge 1*/
333  element_node_ids[ 7]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*i+1]+0; /*mid vertical edge 2*/
334  element_node_ids[ 8]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*i+2]+0; /*mid vertical edge 3*/
335  element_node_ids[ 9]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*i+0]+1; /* 1/4 vertical edge 1*/
336  element_node_ids[10]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*i+1]+1; /* 1/4 vertical edge 2*/
337  element_node_ids[11]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*i+2]+1; /* 1/4 vertical edge 3*/
338  element_node_ids[12]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*i+0]+2; /* 3/4 vertical edge 1*/
339  element_node_ids[13]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*i+1]+2; /* 3/4 vertical edge 2*/
340  element_node_ids[14]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*i+2]+2; /* 3/4 vertical edge 3*/
341  break;
342  case P2xP1Enum:
343  element_numnodes=12;
344  element_node_ids[ 0]=iomodel->elements[6*i+0]-1;
345  element_node_ids[ 1]=iomodel->elements[6*i+1]-1;
346  element_node_ids[ 2]=iomodel->elements[6*i+2]-1;
347  element_node_ids[ 3]=iomodel->elements[6*i+3]-1;
348  element_node_ids[ 4]=iomodel->elements[6*i+4]-1;
349  element_node_ids[ 5]=iomodel->elements[6*i+5]-1;
350  element_node_ids[ 6]=iomodel->numberofvertices+iomodel->elementtohorizontaledgeconnectivity[6*i+0];
351  element_node_ids[ 7]=iomodel->numberofvertices+iomodel->elementtohorizontaledgeconnectivity[6*i+1];
352  element_node_ids[ 8]=iomodel->numberofvertices+iomodel->elementtohorizontaledgeconnectivity[6*i+2];
353  element_node_ids[ 9]=iomodel->numberofvertices+iomodel->elementtohorizontaledgeconnectivity[6*i+3];
354  element_node_ids[10]=iomodel->numberofvertices+iomodel->elementtohorizontaledgeconnectivity[6*i+4];
355  element_node_ids[11]=iomodel->numberofvertices+iomodel->elementtohorizontaledgeconnectivity[6*i+5];
356  break;
357  case P2Enum:
358  element_numnodes = 18;
359  element_node_ids[ 0]=iomodel->elements[6*i+0]-1;
360  element_node_ids[ 1]=iomodel->elements[6*i+1]-1;
361  element_node_ids[ 2]=iomodel->elements[6*i+2]-1;
362  element_node_ids[ 3]=iomodel->elements[6*i+3]-1;
363  element_node_ids[ 4]=iomodel->elements[6*i+4]-1;
364  element_node_ids[ 5]=iomodel->elements[6*i+5]-1;
365  element_node_ids[ 6]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+0];
366  element_node_ids[ 7]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+1];
367  element_node_ids[ 8]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+2];
368  element_node_ids[ 9]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+3];
369  element_node_ids[10]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+4];
370  element_node_ids[11]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+5];
371  element_node_ids[12]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+6];
372  element_node_ids[13]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+7];
373  element_node_ids[14]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+8];
374  element_node_ids[15]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementtoverticalfaceconnectivity[3*i+0];
375  element_node_ids[16]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementtoverticalfaceconnectivity[3*i+1];
376  element_node_ids[17]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementtoverticalfaceconnectivity[3*i+2];
377  break;
378  case P2xP4Enum:
379  element_numnodes = 30;
380  element_node_ids[ 0]=iomodel->elements[6*i+0]-1; /*Vertex 1*/
381  element_node_ids[ 1]=iomodel->elements[6*i+1]-1; /*Vertex 2*/
382  element_node_ids[ 2]=iomodel->elements[6*i+2]-1; /*Vertex 3*/
383  element_node_ids[ 3]=iomodel->elements[6*i+3]-1; /*Vertex 4*/
384  element_node_ids[ 4]=iomodel->elements[6*i+4]-1; /*Vertex 5*/
385  element_node_ids[ 5]=iomodel->elements[6*i+5]-1; /*Vertex 6*/
386  element_node_ids[ 6]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+0]; /*mid vertical edge 1*/
387  element_node_ids[ 7]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+1]; /*mid vertical edge 2*/
388  element_node_ids[ 8]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+2]; /*mid vertical edge 3*/
389  element_node_ids[ 9]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+3]; /*mid basal edge 1*/
390  element_node_ids[10]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+4]; /*mid basal edge 2*/
391  element_node_ids[11]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+5]; /*mid basal edge 3*/
392  element_node_ids[12]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+6]; /*mid top edge 1*/
393  element_node_ids[13]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+7]; /*mid top edge 2*/
394  element_node_ids[14]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+8]; /*mid top edge 3*/
395  element_node_ids[15]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+0]; /* 1/4 vertical edge 1*/
396  element_node_ids[16]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+1]; /* 1/4 vertical edge 2*/
397  element_node_ids[17]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+2]; /* 1/4 vertical edge 3*/
398  element_node_ids[18]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+0]+1; /* 3/4 vertical edge 1*/
399  element_node_ids[19]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+1]+1; /* 3/4 vertical edge 2*/
400  element_node_ids[20]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+2]+1; /* 3/4 vertical edge 3*/
401  element_node_ids[21]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+0]+0; /* 1/4 vertical face 1*/
402  element_node_ids[22]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+1]+0; /* 1/4 vertical face 2*/
403  element_node_ids[23]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+2]+0; /* 1/4 vertical face 3*/
404  element_node_ids[24]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+0]+1; /* 2/4 vertical face 1*/
405  element_node_ids[25]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+1]+1; /* 2/4 vertical face 2*/
406  element_node_ids[26]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+2]+1; /* 2/4 vertical face 3*/
407  element_node_ids[27]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+0]+2; /* 3/4 vertical face 1*/
408  element_node_ids[28]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+1]+2; /* 3/4 vertical face 2*/
409  element_node_ids[29]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+2]+2; /* 3/4 vertical face 3*/
410  break;
411  case MINIEnum: case MINIcondensedEnum:
412  element_numnodes = 7+6;
413  element_node_ids[ 0]=iomodel->elements[6*i+0]-1;
414  element_node_ids[ 1]=iomodel->elements[6*i+1]-1;
415  element_node_ids[ 2]=iomodel->elements[6*i+2]-1;
416  element_node_ids[ 3]=iomodel->elements[6*i+3]-1;
417  element_node_ids[ 4]=iomodel->elements[6*i+4]-1;
418  element_node_ids[ 5]=iomodel->elements[6*i+5]-1;
419  element_node_ids[ 6]=iomodel->numberofvertices+i;
420  if(!approximations) for(int n=0;n<7;n++) nodes_approx[element_node_ids[n]] = FSvelocityEnum;
421  element_node_ids[ 7]=iomodel->numberofvertices+iomodel->numberofelements+iomodel->elements[6*i+0]-1;
422  element_node_ids[ 8]=iomodel->numberofvertices+iomodel->numberofelements+iomodel->elements[6*i+1]-1;
423  element_node_ids[ 9]=iomodel->numberofvertices+iomodel->numberofelements+iomodel->elements[6*i+2]-1;
424  element_node_ids[10]=iomodel->numberofvertices+iomodel->numberofelements+iomodel->elements[6*i+3]-1;
425  element_node_ids[11]=iomodel->numberofvertices+iomodel->numberofelements+iomodel->elements[6*i+4]-1;
426  element_node_ids[12]=iomodel->numberofvertices+iomodel->numberofelements+iomodel->elements[6*i+5]-1;
427  if(!approximations) for(int n=7;n<13;n++) nodes_approx[element_node_ids[n]] = FSpressureEnum;
428  break;
429  case TaylorHoodEnum: case XTaylorHoodEnum:
430  element_numnodes = 18+6;
431  element_node_ids[ 0]=iomodel->elements[6*i+0]-1;
432  element_node_ids[ 1]=iomodel->elements[6*i+1]-1;
433  element_node_ids[ 2]=iomodel->elements[6*i+2]-1;
434  element_node_ids[ 3]=iomodel->elements[6*i+3]-1;
435  element_node_ids[ 4]=iomodel->elements[6*i+4]-1;
436  element_node_ids[ 5]=iomodel->elements[6*i+5]-1;
437  element_node_ids[ 6]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+0];
438  element_node_ids[ 7]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+1];
439  element_node_ids[ 8]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+2];
440  element_node_ids[ 9]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+3];
441  element_node_ids[10]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+4];
442  element_node_ids[11]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+5];
443  element_node_ids[12]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+6];
444  element_node_ids[13]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+7];
445  element_node_ids[14]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+8];
446  element_node_ids[15]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementtoverticalfaceconnectivity[3*i+0];
447  element_node_ids[16]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementtoverticalfaceconnectivity[3*i+1];
448  element_node_ids[17]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementtoverticalfaceconnectivity[3*i+2];
449  for(int n=0;n<18;n++) nodes_approx[element_node_ids[n]] = FSvelocityEnum;
450  element_node_ids[18]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofverticalfaces+iomodel->elements[6*i+0]-1;
451  element_node_ids[19]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofverticalfaces+iomodel->elements[6*i+1]-1;
452  element_node_ids[20]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofverticalfaces+iomodel->elements[6*i+2]-1;
453  element_node_ids[21]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofverticalfaces+iomodel->elements[6*i+3]-1;
454  element_node_ids[22]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofverticalfaces+iomodel->elements[6*i+4]-1;
455  element_node_ids[23]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofverticalfaces+iomodel->elements[6*i+5]-1;
456  for(int n=18;n<24;n++) nodes_approx[element_node_ids[n]] = FSpressureEnum;
457  break;
458  case OneLayerP4zEnum:
459  element_numnodes = 30+6;
460  element_node_ids[ 0]=iomodel->elements[6*i+0]-1; /*Vertex 1*/
461  element_node_ids[ 1]=iomodel->elements[6*i+1]-1; /*Vertex 2*/
462  element_node_ids[ 2]=iomodel->elements[6*i+2]-1; /*Vertex 3*/
463  element_node_ids[ 3]=iomodel->elements[6*i+3]-1; /*Vertex 4*/
464  element_node_ids[ 4]=iomodel->elements[6*i+4]-1; /*Vertex 5*/
465  element_node_ids[ 5]=iomodel->elements[6*i+5]-1; /*Vertex 6*/
466  element_node_ids[ 6]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+0]; /*mid vertical edge 1*/
467  element_node_ids[ 7]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+1]; /*mid vertical edge 2*/
468  element_node_ids[ 8]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+2]; /*mid vertical edge 3*/
469  element_node_ids[ 9]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+3]; /*mid basal edge 1*/
470  element_node_ids[10]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+4]; /*mid basal edge 2*/
471  element_node_ids[11]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+5]; /*mid basal edge 3*/
472  element_node_ids[12]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+6]; /*mid top edge 1*/
473  element_node_ids[13]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+7]; /*mid top edge 2*/
474  element_node_ids[14]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+8]; /*mid top edge 3*/
475  element_node_ids[15]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+0]; /* 1/4 vertical edge 1*/
476  element_node_ids[16]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+1]; /* 1/4 vertical edge 2*/
477  element_node_ids[17]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+2]; /* 1/4 vertical edge 3*/
478  element_node_ids[18]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+0]+1; /* 3/4 vertical edge 1*/
479  element_node_ids[19]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+1]+1; /* 3/4 vertical edge 2*/
480  element_node_ids[20]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+2]+1; /* 3/4 vertical edge 3*/
481  element_node_ids[21]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+0]+0; /* 1/4 vertical face 1*/
482  element_node_ids[22]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+1]+0; /* 1/4 vertical face 2*/
483  element_node_ids[23]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+2]+0; /* 1/4 vertical face 3*/
484  element_node_ids[24]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+0]+1; /* 2/4 vertical face 1*/
485  element_node_ids[25]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+1]+1; /* 2/4 vertical face 2*/
486  element_node_ids[26]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+2]+1; /* 2/4 vertical face 3*/
487  element_node_ids[27]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+0]+2; /* 3/4 vertical face 1*/
488  element_node_ids[28]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+1]+2; /* 3/4 vertical face 2*/
489  element_node_ids[29]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+2]+2; /* 3/4 vertical face 3*/
490  for(int n=0;n<30;n++) nodes_approx[element_node_ids[n]] = FSvelocityEnum;
491  element_node_ids[30]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->numberofverticalfaces+iomodel->elements[6*i+0]-1;
492  element_node_ids[31]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->numberofverticalfaces+iomodel->elements[6*i+1]-1;
493  element_node_ids[32]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->numberofverticalfaces+iomodel->elements[6*i+2]-1;
494  element_node_ids[33]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->numberofverticalfaces+iomodel->elements[6*i+3]-1;
495  element_node_ids[34]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->numberofverticalfaces+iomodel->elements[6*i+4]-1;
496  element_node_ids[35]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->numberofverticalfaces+iomodel->elements[6*i+5]-1;
497  for(int n=30;n<36;n++) nodes_approx[element_node_ids[n]] = FSpressureEnum;
498  break;
499  default:
500  _error_("Finite element "<<EnumToStringx(finite_element)<<" not supported yet");
501  }
502  }
503  else{
504  _error_("mesh elements "<< EnumToStringx(iomodel->meshelementtype) <<" not supported yet");
505  }
506 
507  /*Add rank epart[i] for all nodes belonging to this element*/
508  for(int j=0;j<element_numnodes;j++){
509  int nid = element_node_ids[j]; _assert_(nid<numnodes);
510  AddNodeToRank(nodes_ranks,nodes_proc_count,nid,epart[i]);
511  }
512  }
513  /*}}}*/
514  if((finite_element==P0DGEnum || finite_element==P1DGEnum) && analysis!=UzawaPressureAnalysisEnum){/*Special case for DG...{{{*/
515  if(finite_element==P1DGEnum){
516  int node_list[4];
517  if(iomodel->domaintype!=Domain2DhorizontalEnum) _error_("not implemented yet");
518  CreateEdges(iomodel);
519  CreateFaces(iomodel);
520  for(int i=0;i<iomodel->numberoffaces;i++){
521  int e1=iomodel->faces[4*i+2]-1; //faces are [node1 node2 elem1 elem2]
522  int e2=iomodel->faces[4*i+3]-1; //faces are [node1 node2 elem1 elem2]
523  if(e2!=-2){
524  if(epart[e1]!=epart[e2]){
525  int i1=iomodel->faces[4*i+0];
526  int i2=iomodel->faces[4*i+1];
527  int pos=-1;
528  for(int j=0;j<3;j++) if(iomodel->elements[3*e2+j]==i1) pos=j;
529  if( pos==0){ node_list[0] = e2*3+0; node_list[1] = e2*3+2;}
530  else if(pos==1){ node_list[0] = e2*3+1; node_list[1] = e2*3+0;}
531  else if(pos==2){ node_list[0] = e2*3+2; node_list[1] = e2*3+1;}
532  else _error_("not supposed to happen");
533  pos=-1;
534  for(int j=0;j<3;j++) if(iomodel->elements[3*e1+j]==i1) pos=j;
535  if( pos==0){ node_list[2] = e1*3+0; node_list[3] = e1*3+1;}
536  else if(pos==1){ node_list[2] = e1*3+1; node_list[3] = e1*3+2;}
537  else if(pos==2){ node_list[2] = e1*3+2; node_list[3] = e1*3+0;}
538  else _error_("not supposed to happen");
539  for(int j=0;j<4;j++){
540  int nid = node_list[j];
541  AddNodeToRank(nodes_ranks,nodes_proc_count,nid,epart[e1]);
542  AddNodeToRank(nodes_ranks,nodes_proc_count,nid,epart[e2]);
543  }
544  }
545  }
546  }
547  }
548  else if(finite_element==P0DGEnum){
549  int node_list[2];
550  if(iomodel->domaintype!=Domain2DhorizontalEnum) _error_("not implemented yet");
551  CreateEdges(iomodel);
552  CreateFaces(iomodel);
553  for(int i=0;i<iomodel->numberoffaces;i++){
554  int e1=iomodel->faces[4*i+2]-1; //faces are [node1 node2 elem1 elem2]
555  int e2=iomodel->faces[4*i+3]-1; //faces are [node1 node2 elem1 elem2]
556  if(e2!=-2){
557  if(epart[e1]!=epart[e2]){
558  AddNodeToRank(nodes_ranks,nodes_proc_count,e2,epart[e1]);
559  //AddNodeToRank(nodes_ranks,nodes_proc_count,e1,epart[e2]);
560  }
561  }
562  }
563  }
564  else{
565  _error_("not supported");
566  }
567  }/*}}}*/
568  /*Vertex pairing for stressbalance{{{*/
569  if(!isamr && (analysis==StressbalanceAnalysisEnum || analysis==StressbalanceVerticalAnalysisEnum)){
570  int *vertex_pairing = NULL;
571  int numvertex_pairing;
572  iomodel->FetchData(&vertex_pairing,&numvertex_pairing,NULL,"md.stressbalance.vertex_pairing");
573  _assert_(numvertex_pairing==0 || finite_element==P1Enum);
574  for(int i=0;i<numvertex_pairing;i++){
575  int nid1 = vertex_pairing[2*i+0]-1;
576  int nid2 = vertex_pairing[2*i+1]-1;
577  for(int j=0;j<nodes_proc_count[nid1];j++) AddNodeToRank(nodes_ranks,nodes_proc_count,nid2,nodes_ranks[MAXCONNECTIVITY*nid1+j]);
578  for(int j=0;j<nodes_proc_count[nid2];j++) AddNodeToRank(nodes_ranks,nodes_proc_count,nid1,nodes_ranks[MAXCONNECTIVITY*nid2+j]);
579  }
580  xDelete<int>(vertex_pairing);
581  }
582  if(!isamr && (analysis==MasstransportAnalysisEnum || analysis==FreeSurfaceBaseAnalysisEnum || analysis==FreeSurfaceTopAnalysisEnum)){
583  int *vertex_pairing = NULL;
584  int numvertex_pairing;
585  iomodel->FetchData(&vertex_pairing,&numvertex_pairing,NULL,"md.masstransport.vertex_pairing");
586  _assert_(numvertex_pairing==0 || finite_element==P1Enum);
587  for(int i=0;i<numvertex_pairing;i++){
588  int nid1 = vertex_pairing[2*i+0]-1;
589  int nid2 = vertex_pairing[2*i+1]-1;
590  for(int j=0;j<nodes_proc_count[nid1];j++) AddNodeToRank(nodes_ranks,nodes_proc_count,nid2,nodes_ranks[MAXCONNECTIVITY*nid1+j]);
591  for(int j=0;j<nodes_proc_count[nid2];j++) AddNodeToRank(nodes_ranks,nodes_proc_count,nid1,nodes_ranks[MAXCONNECTIVITY*nid2+j]);
592  }
593  xDelete<int>(vertex_pairing);
594  }
595  /*}}}*/
596 
597  /*Create vector of size total numnodes, initialized with -1, that will keep track of local ids*/
598  int offset = 0;
599  int* nodes_offsets = xNew<int>(numnodes);
600  for(int i=0;i<numnodes;i++){
601  if(IsNodeInRank(nodes_ranks,nodes_proc_count,i,my_rank)){
602  nodes_offsets[i] = offset++;
603  }
604  else{
605  nodes_offsets[i] = -1;
606  }
607  }
608 
609  /*Now, Count how many clones we have with other partitions*/
610  int* common_send = xNew<int>(num_procs);
611  int* common_recv = xNew<int>(num_procs);
612  int** common_send_ids = xNew<int*>(num_procs);
613  int** common_recv_ids = xNew<int*>(num_procs);
614 
615  /*First step: allocate, Step 2: populate*/
616  for(int step=0;step<2;step++){
617  if(step==1){
618  /*Allocate send and receive arrays of ids now*/
619  for(int i=0;i<num_procs;i++){
620  _assert_(common_send[i]>=0 && common_recv[i]>=0);
621  common_send_ids[i] = xNew<int>(common_send[i]);
622  common_recv_ids[i] = xNew<int>(common_recv[i]);
623  }
624  }
625  /*Re/Initialize counters to 0*/
626  for(int i=0;i<num_procs;i++){
627  common_recv[i]=0;
628  common_send[i]=0;
629  }
630  /*Go through table and find clones/masters etc*/
631  for(int i=0;i<numnodes;i++){
632  /*If we did not find this vertex in our current partition, go to next vertex*/
633  if(nodes_offsets[i] == -1) continue;
634  /*Find in what column this rank belongs*/
635  int col = -1;
636  for(int j=0;j<MAXCONNECTIVITY;j++){
637  if(nodes_ranks[MAXCONNECTIVITY*i+j] == my_rank){
638  col = j;
639  break;
640  }
641  }
642  _assert_(col!=-1);
643 
644  /*If col==0, it is either not on boundary, or a master*/
645  if(col==0){
646  /*1. is this vertex on the boundary? Skip if not*/
647  if(nodes_ranks[MAXCONNECTIVITY*i+col+1]==-1){
648  continue;
649  }
650  else{
651  for(int j=1;j<nodes_proc_count[i];j++){
652  _assert_(nodes_ranks[MAXCONNECTIVITY*i+j]>=0);
653  int rank = nodes_ranks[MAXCONNECTIVITY*i+j];
654  if(step==1){
655  common_send_ids[rank][common_send[rank]] = nodes_offsets[i];
656  }
657  common_send[rank]++;
658  }
659  }
660  }
661  else{
662  /*3. It is a slave, record that we need to receive for this cpu*/
663  int rank = nodes_ranks[MAXCONNECTIVITY*i+0];
664  if(step==1){
665  common_recv_ids[rank][common_recv[rank]] = nodes_offsets[i];
666  }
667  common_recv[rank]++;
668  }
669  }
670  }
671  xDelete<int>(nodes_proc_count);
672 
673  /*Go ahead and create vertices now that we have all we need*/
674  for(int i=0;i<numnodes;i++){
675  if(nodes_offsets[i]!=-1){
676  bool isclone = (nodes_ranks[MAXCONNECTIVITY*i+0]!=my_rank);
677  int io_index = 0;
678  if(i<iomodel->numberofvertices) io_index = i;
679  Node* node=new Node(i+1,i,io_index,isclone,iomodel,analysis,nodes_approx[i],isamr);
680  if(finite_element==MINIcondensedEnum || finite_element==P1bubblecondensedEnum){
681  /*Bubble function is collapsed, needs to constrain it, maybe this is not the best place to do this, but that's life!*/
682  if(i>=iomodel->numberofvertices && i<iomodel->numberofvertices+iomodel->numberofelements){
683  node->HardDeactivate();
684  }
685  }
686  nodes->AddObject(node);
687  }
688  }
689 
690  /*Free data: */
691  xDelete<int>(nodes_approx);
692  xDelete<int>(nodes_ranks);
693  xDelete<int>(nodes_offsets);
694 
695  /*Assign communicators*/
696  nodes->common_send=common_send;
697  nodes->common_recv=common_recv;
698  nodes->common_send_ids=common_send_ids;
699  nodes->common_recv_ids=common_recv_ids;
700 
701  /*Finalize Initialization*/
702  nodes->Finalize();
703 }
FreeSurfaceTopAnalysisEnum
@ FreeSurfaceTopAnalysisEnum
Definition: EnumDefinitions.h:1072
CrouzeixRaviartEnum
@ CrouzeixRaviartEnum
Definition: EnumDefinitions.h:1023
_assert_
#define _assert_(ignore)
Definition: exceptions.h:37
CreateEdges
void CreateEdges(IoModel *iomodel)
Definition: CreateEdges.cpp:9
MasstransportAnalysisEnum
@ MasstransportAnalysisEnum
Definition: EnumDefinitions.h:1163
StressbalanceAnalysisEnum
@ StressbalanceAnalysisEnum
Definition: EnumDefinitions.h:1285
IoModel::elementtohorizontaledgeconnectivity
int * elementtohorizontaledgeconnectivity
Definition: IoModel.h:85
DataSet::AddObject
int AddObject(Object *object)
Definition: DataSet.cpp:252
Nodes::common_send
int * common_send
Definition: Nodes.h:28
MINIEnum
@ MINIEnum
Definition: EnumDefinitions.h:1156
AddNodeToRank
void AddNodeToRank(int *nodes_ranks, int *nodes_proc_count, int nid, int rank)
Definition: CreateNodes.cpp:25
IoModel::numberoffaces
int numberoffaces
Definition: IoModel.h:97
P1DGEnum
@ P1DGEnum
Definition: EnumDefinitions.h:1215
EdgesPartitioning
void EdgesPartitioning(IoModel *iomodel)
Definition: EdgesPartitioning.cpp:10
FreeSurfaceBaseAnalysisEnum
@ FreeSurfaceBaseAnalysisEnum
Definition: EnumDefinitions.h:1071
P2xP1Enum
@ P2xP1Enum
Definition: EnumDefinitions.h:1226
Nodes::common_recv_ids
int ** common_recv_ids
Definition: Nodes.h:27
P1bubblecondensedEnum
@ P1bubblecondensedEnum
Definition: EnumDefinitions.h:1219
FSpressureEnum
@ FSpressureEnum
Definition: EnumDefinitions.h:1062
P0DGEnum
@ P0DGEnum
Definition: EnumDefinitions.h:1214
IoModel::numberofvertices
int numberofvertices
Definition: IoModel.h:99
P1Enum
@ P1Enum
Definition: EnumDefinitions.h:662
Domain2DhorizontalEnum
@ Domain2DhorizontalEnum
Definition: EnumDefinitions.h:534
TaylorHoodEnum
@ TaylorHoodEnum
Definition: EnumDefinitions.h:1299
UzawaPressureAnalysisEnum
@ UzawaPressureAnalysisEnum
Definition: EnumDefinitions.h:1320
LATaylorHoodEnum
@ LATaylorHoodEnum
Definition: EnumDefinitions.h:1139
IoModel::numberofelements
int numberofelements
Definition: IoModel.h:96
Nodes::common_send_ids
int ** common_send_ids
Definition: Nodes.h:29
IoModel::elementtoverticaledgeconnectivity
int * elementtoverticaledgeconnectivity
Definition: IoModel.h:84
MAXCONNECTIVITY
#define MAXCONNECTIVITY
Definition: CreateNodes.cpp:11
Node::HardDeactivate
void HardDeactivate(void)
Definition: Node.cpp:788
EnumToStringx
const char * EnumToStringx(int enum_in)
Definition: EnumToStringx.cpp:15
OneLayerP4zEnum
@ OneLayerP4zEnum
Definition: EnumDefinitions.h:1208
IssmComm::GetSize
static int GetSize(void)
Definition: IssmComm.cpp:46
IoModel::elementtoedgeconnectivity
int * elementtoedgeconnectivity
Definition: IoModel.h:83
P2xP4Enum
@ P2xP4Enum
Definition: EnumDefinitions.h:1227
Nodes::common_recv
int * common_recv
Definition: Nodes.h:26
MINIcondensedEnum
@ MINIcondensedEnum
Definition: EnumDefinitions.h:1157
IoModel::FetchData
void FetchData(bool *pboolean, const char *data_name)
Definition: IoModel.cpp:933
IoModel::numberofhorizontaledges
int numberofhorizontaledges
Definition: IoModel.h:95
FSvelocityEnum
@ FSvelocityEnum
Definition: EnumDefinitions.h:1063
P1bubbleEnum
@ P1bubbleEnum
Definition: EnumDefinitions.h:1218
IsNodeInRank
bool IsNodeInRank(int *nodes_ranks, int *nodes_proc_count, int nid, int rank)
Definition: CreateNodes.cpp:13
Nodes::Finalize
void Finalize(void)
Definition: Nodes.cpp:217
IssmComm::GetRank
static int GetRank(void)
Definition: IssmComm.cpp:34
LACrouzeixRaviartEnum
@ LACrouzeixRaviartEnum
Definition: EnumDefinitions.h:1138
Node
Definition: Node.h:23
StressbalanceVerticalAnalysisEnum
@ StressbalanceVerticalAnalysisEnum
Definition: EnumDefinitions.h:1289
_error_
#define _error_(StreamArgs)
Definition: exceptions.h:49
IoModel::faces
int * faces
Definition: IoModel.h:88
IoModel::numberofverticalfaces
int numberofverticalfaces
Definition: IoModel.h:98
IoModel::numberofverticaledges
int numberofverticaledges
Definition: IoModel.h:94
PentaEnum
@ PentaEnum
Definition: EnumDefinitions.h:1231
FacesPartitioning
void FacesPartitioning(IoModel *iomodel)
Definition: FacesPartitioning.cpp:10
P2Enum
@ P2Enum
Definition: EnumDefinitions.h:1223
IoModel::epart
int * epart
Definition: IoModel.h:74
IoModel::elements
int * elements
Definition: IoModel.h:79
IoModel::meshelementtype
int meshelementtype
Definition: IoModel.h:91
CreateFaces
void CreateFaces(IoModel *iomodel)
Definition: CreateFaces.cpp:9
P1xP4Enum
@ P1xP4Enum
Definition: EnumDefinitions.h:1222
IoModel::elementtoverticalfaceconnectivity
int * elementtoverticalfaceconnectivity
Definition: IoModel.h:87
P1xP3Enum
@ P1xP3Enum
Definition: EnumDefinitions.h:1221
IoModel::domaintype
int domaintype
Definition: IoModel.h:78
TriaEnum
@ TriaEnum
Definition: EnumDefinitions.h:1318
XTaylorHoodEnum
@ XTaylorHoodEnum
Definition: EnumDefinitions.h:1329
P1xP2Enum
@ P1xP2Enum
Definition: EnumDefinitions.h:1220
IoModel::numberofedges
int numberofedges
Definition: IoModel.h:93