41 int element_node_ids[40] = {0};
46 int* epart = iomodel->
epart;
51 switch(finite_element){
97 switch(finite_element){
160 int* nodes_proc_count = xNewZeroInit<int>(numnodes);
163 int* nodes_approx = xNew<int>(numnodes);
165 for(
int i=0;i<numnodes;i++) nodes_approx[i] = approximations[i];
168 for(
int i=0;i<numnodes;i++) nodes_approx[i] = approximation;
177 switch(finite_element){
180 element_node_ids[0]=i;
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;
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;
197 element_node_ids[0]=3*i+0;
198 element_node_ids[1]=3*i+1;
199 element_node_ids[2]=3*i+2;
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;
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;
216 for(
int n=0;n<4;n++) nodes_approx[element_node_ids[n]] =
FSvelocityEnum;
220 for(
int n=4;n<7;n++) nodes_approx[element_node_ids[n]] =
FSpressureEnum;
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;
230 for(
int n=0;n<6;n++) nodes_approx[element_node_ids[n]] =
FSvelocityEnum;
234 for(
int n=6;n<9;n++) nodes_approx[element_node_ids[n]] =
FSpressureEnum;
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;
244 for(
int n=0;n<6;n++) nodes_approx[element_node_ids[n]] =
FSvelocityEnum;
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;
255 for(
int n=0;n<7;n++) nodes_approx[element_node_ids[n]] =
FSvelocityEnum;
259 for(
int n=7;n<10;n++) nodes_approx[element_node_ids[n]] =
FSpressureEnum;
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;
270 for(
int n=0;n<7;n++) nodes_approx[element_node_ids[n]] =
FSvelocityEnum;
277 switch(finite_element){
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;
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;
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;
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;
326 element_node_ids[ 0]=iomodel->
elements[6*i+0]-1;
327 element_node_ids[ 1]=iomodel->
elements[6*i+1]-1;
328 element_node_ids[ 2]=iomodel->
elements[6*i+2]-1;
329 element_node_ids[ 3]=iomodel->
elements[6*i+3]-1;
330 element_node_ids[ 4]=iomodel->
elements[6*i+4]-1;
331 element_node_ids[ 5]=iomodel->
elements[6*i+5]-1;
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;
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;
379 element_numnodes = 30;
380 element_node_ids[ 0]=iomodel->
elements[6*i+0]-1;
381 element_node_ids[ 1]=iomodel->
elements[6*i+1]-1;
382 element_node_ids[ 2]=iomodel->
elements[6*i+2]-1;
383 element_node_ids[ 3]=iomodel->
elements[6*i+3]-1;
384 element_node_ids[ 4]=iomodel->
elements[6*i+4]-1;
385 element_node_ids[ 5]=iomodel->
elements[6*i+5]-1;
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;
420 if(!approximations)
for(
int n=0;n<7;n++) nodes_approx[element_node_ids[n]] =
FSvelocityEnum;
427 if(!approximations)
for(
int n=7;n<13;n++) nodes_approx[element_node_ids[n]] =
FSpressureEnum;
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;
449 for(
int n=0;n<18;n++) nodes_approx[element_node_ids[n]] =
FSvelocityEnum;
456 for(
int n=18;n<24;n++) nodes_approx[element_node_ids[n]] =
FSpressureEnum;
459 element_numnodes = 30+6;
460 element_node_ids[ 0]=iomodel->
elements[6*i+0]-1;
461 element_node_ids[ 1]=iomodel->
elements[6*i+1]-1;
462 element_node_ids[ 2]=iomodel->
elements[6*i+2]-1;
463 element_node_ids[ 3]=iomodel->
elements[6*i+3]-1;
464 element_node_ids[ 4]=iomodel->
elements[6*i+4]-1;
465 element_node_ids[ 5]=iomodel->
elements[6*i+5]-1;
490 for(
int n=0;n<30;n++) nodes_approx[element_node_ids[n]] =
FSvelocityEnum;
497 for(
int n=30;n<36;n++) nodes_approx[element_node_ids[n]] =
FSpressureEnum;
508 for(
int j=0;j<element_numnodes;j++){
509 int nid = element_node_ids[j];
_assert_(nid<numnodes);
521 int e1=iomodel->
faces[4*i+2]-1;
522 int e2=iomodel->
faces[4*i+3]-1;
524 if(epart[e1]!=epart[e2]){
525 int i1=iomodel->
faces[4*i+0];
526 int i2=iomodel->
faces[4*i+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");
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];
554 int e1=iomodel->
faces[4*i+2]-1;
555 int e2=iomodel->
faces[4*i+3]-1;
557 if(epart[e1]!=epart[e2]){
570 int *vertex_pairing = NULL;
571 int numvertex_pairing;
572 iomodel->
FetchData(&vertex_pairing,&numvertex_pairing,NULL,
"md.stressbalance.vertex_pairing");
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;
580 xDelete<int>(vertex_pairing);
583 int *vertex_pairing = NULL;
584 int numvertex_pairing;
585 iomodel->
FetchData(&vertex_pairing,&numvertex_pairing,NULL,
"md.masstransport.vertex_pairing");
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;
593 xDelete<int>(vertex_pairing);
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++;
605 nodes_offsets[i] = -1;
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);
616 for(
int step=0;step<2;step++){
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]);
626 for(
int i=0;i<num_procs;i++){
631 for(
int i=0;i<numnodes;i++){
633 if(nodes_offsets[i] == -1)
continue;
651 for(
int j=1;j<nodes_proc_count[i];j++){
655 common_send_ids[rank][common_send[rank]] = nodes_offsets[i];
665 common_recv_ids[rank][common_recv[rank]] = nodes_offsets[i];
671 xDelete<int>(nodes_proc_count);
674 for(
int i=0;i<numnodes;i++){
675 if(nodes_offsets[i]!=-1){
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);
691 xDelete<int>(nodes_approx);
692 xDelete<int>(nodes_ranks);
693 xDelete<int>(nodes_offsets);