Changeset 23576
- Timestamp:
- 12/28/18 09:17:00 (6 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
r23561 r23576 545 545 else{ 546 546 /*Coupling: we are going to create P1 Elements only*/ 547 548 Node* node = NULL;549 int lid=0;550 if(!nodes) nodes = new Nodes();551 552 547 iomodel->FetchData(6,"md.mesh.vertexonbase","md.mesh.vertexonsurface","md.flowequation.borderSSA","md.flowequation.borderFS", 553 548 "md.flowequation.vertex_equation","md.stressbalance.referential"); 554 549 if(isFS){ 555 /*P1+ velocity*/550 int* approximations = xNew<int>(2*iomodel->numberofvertices+iomodel->numberofelements); 556 551 for(int i=0;i<iomodel->numberofvertices;i++){ 557 if(iomodel->my_vertices[i]){ 558 approximation=IoCodeToEnumVertexEquation(reCast<int>(iomodel->Data("md.flowequation.vertex_equation")[i])); 559 if(approximation==FSApproximationEnum) approximation=FSvelocityEnum; 560 nodes->AddObject(new Node(i+1,i,lid++,0,i,false,iomodel,StressbalanceAnalysisEnum,approximation)); 561 } 552 approximation = IoCodeToEnumVertexEquation(reCast<int>(iomodel->Data("md.flowequation.vertex_equation")[i])); 553 if(approximation==FSApproximationEnum) approximation=FSvelocityEnum; 554 approximations[i] = approximation; 562 555 } 563 for(int i=0;i<iomodel->numberofelements;i++) {564 if(iomodel->my_elements[i]){565 node = new Node(iomodel->numberofvertices+i+1,iomodel->numberofvertices+i,lid++,0,0,false,iomodel,StressbalanceAnalysisEnum,FSvelocityEnum);566 node->Deactivate();567 nodes->AddObject(node); 568 }569 }570 /*P1 pressure*/571 for(int i=0;i<iomodel->numberofvertices;i++){572 if(iomodel->my_vertices[i]){573 approximation=IoCodeToEnumVertexEquation(reCast<int>(iomodel->Data("md.flowequation.vertex_equation")[i]));574 node = new Node(iomodel->numberofvertices+iomodel->numberofelements+i+1,iomodel->numberofvertices+iomodel->numberofelements+i,lid++,0,i,false,iomodel,StressbalanceAnalysisEnum,FSpressureEnum);556 for(int i=0;i<iomodel->numberofelements;i++) approximations[iomodel->numberofvertices+i] = FSvelocityEnum; 557 for(int i=0;i<iomodel->numberofvertices;i++) approximations[iomodel->numberofvertices+iomodel->numberofelements+i] = FSpressureEnum; 558 ::CreateNodes(nodes,iomodel,StressbalanceAnalysisEnum,MINIcondensedEnum,0,approximations); 559 xDelete<int>(approximations); 560 561 for(int i=0;i<nodes->Size();i++){ 562 Node* node=xDynamicCast<Node*>(nodes->GetObjectByOffset(i)); 563 int sid = node->Sid(); 564 if(sid>=iomodel->numberofvertices+iomodel->numberofelements){ 565 /*Constrain pressure if not FS*/ 566 int id = sid - (iomodel->numberofvertices+iomodel->numberofelements); 567 approximation=IoCodeToEnumVertexEquation(reCast<int>(iomodel->Data("md.flowequation.vertex_equation")[id])); 575 568 if(approximation==HOApproximationEnum || approximation==SSAApproximationEnum){ 576 569 node->Deactivate(); 577 570 } 578 nodes->AddObject(node);579 571 } 580 572 } 581 573 } 582 574 else{ 583 for(int i=0;i<iomodel->numberofvertices;i++){ 584 if(iomodel->my_vertices[i]){ 585 nodes->AddObject(new Node(i+1,i,lid++,0,i,false,iomodel,StressbalanceAnalysisEnum,IoCodeToEnumVertexEquation(reCast<int>(iomodel->Data("md.flowequation.vertex_equation")[i])))); 586 } 587 } 575 int* approximations = xNew<int>(iomodel->numberofvertices); 576 for(int i=0;i<iomodel->numberofvertices;i++) approximations[i] = IoCodeToEnumVertexEquation(reCast<int>(iomodel->Data("md.flowequation.vertex_equation")[i])); 577 ::CreateNodes(nodes,iomodel,StressbalanceAnalysisEnum,P1Enum,0,approximations); 578 xDelete<int>(approximations); 588 579 } 589 580 iomodel->DeleteData(6,"md.mesh.vertexonbase","md.mesh.vertexonsurface","md.flowequation.borderSSA","md.flowequation.borderFS", -
issm/trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.cpp
r23561 r23576 80 80 /*Intermediaries*/ 81 81 bool isSIA; 82 Node* node = NULL;83 82 84 83 /*Fetch parameters: */ … … 95 94 } 96 95 97 for(int i=0;i<iomodel->numberofvertices;i++){ 98 if(iomodel->my_vertices[i]){ 99 100 /*Create new node if is in this processor's partition*/ 101 node = new Node(i+1,i,lid++,0,i,false,iomodel,StressbalanceSIAAnalysisEnum,IoCodeToEnumVertexEquation(reCast<int>(iomodel->Data("md.flowequation.vertex_equation")[i]))); 102 103 /*Deactivate node if not SIA*/ 104 if(IoCodeToEnumVertexEquation(reCast<int>(iomodel->Data("md.flowequation.vertex_equation")[i]))!=SIAApproximationEnum){ 105 node->Deactivate(); 106 } 107 108 /*Add to Nodes dataset*/ 109 nodes->AddObject(node); 110 } 111 } 112 96 ::CreateNodes(nodes,iomodel,StressbalanceSIAAnalysisEnum,P1Enum,SIAApproximationEnum); 97 for(int i=0;i<nodes->Size();i++){ 98 Node* node=xDynamicCast<Node*>(nodes->GetObjectByOffset(i)); 99 int sid = node->Sid(); 100 int approximation=IoCodeToEnumVertexEquation(reCast<int>(iomodel->Data("md.flowequation.vertex_equation")[sid])); 101 if(approximation!=SIAApproximationEnum) node->Deactivate(); 102 } 113 103 iomodel->DeleteData(6,"md.mesh.vertexonbase","md.mesh.vertexonsurface","md.flowequation.borderSSA","md.flowequation.borderFS","md.flowequation.vertex_equation","md.stressbalance.referential"); 114 104 -
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r23532 r23576 2918 2918 penta_node_ids[ 4]=iomodel->elements[6*index+4]; 2919 2919 penta_node_ids[ 5]=iomodel->elements[6*index+5]; 2920 penta_node_ids[ 6]=iomodel->numberofvertices+iomodel->elementto edgeconnectivity[9*index+0]+1;2921 penta_node_ids[ 7]=iomodel->numberofvertices+iomodel->elementto edgeconnectivity[9*index+1]+1;2922 penta_node_ids[ 8]=iomodel->numberofvertices+iomodel->elementto edgeconnectivity[9*index+2]+1;2920 penta_node_ids[ 6]=iomodel->numberofvertices+iomodel->elementtoverticaledgeconnectivity[3*index+0]+1; 2921 penta_node_ids[ 7]=iomodel->numberofvertices+iomodel->elementtoverticaledgeconnectivity[3*index+1]+1; 2922 penta_node_ids[ 8]=iomodel->numberofvertices+iomodel->elementtoverticaledgeconnectivity[3*index+2]+1; 2923 2923 break; 2924 2924 case P1xP3Enum: … … 2931 2931 penta_node_ids[ 4]=iomodel->elements[6*index+4]; 2932 2932 penta_node_ids[ 5]=iomodel->elements[6*index+5]; 2933 penta_node_ids[ 6]=iomodel->numberofvertices+2*iomodel->elementto edgeconnectivity[9*index+0]+1;2934 penta_node_ids[ 7]=iomodel->numberofvertices+2*iomodel->elementto edgeconnectivity[9*index+1]+1;2935 penta_node_ids[ 8]=iomodel->numberofvertices+2*iomodel->elementto edgeconnectivity[9*index+2]+1;2936 penta_node_ids[ 9]=iomodel->numberofvertices+2*iomodel->elementto edgeconnectivity[9*index+0]+2;2937 penta_node_ids[10]=iomodel->numberofvertices+2*iomodel->elementto edgeconnectivity[9*index+1]+2;2938 penta_node_ids[11]=iomodel->numberofvertices+2*iomodel->elementto edgeconnectivity[9*index+2]+2;2933 penta_node_ids[ 6]=iomodel->numberofvertices+2*iomodel->elementtoverticaledgeconnectivity[3*index+0]+1; 2934 penta_node_ids[ 7]=iomodel->numberofvertices+2*iomodel->elementtoverticaledgeconnectivity[3*index+1]+1; 2935 penta_node_ids[ 8]=iomodel->numberofvertices+2*iomodel->elementtoverticaledgeconnectivity[3*index+2]+1; 2936 penta_node_ids[ 9]=iomodel->numberofvertices+2*iomodel->elementtoverticaledgeconnectivity[3*index+0]+2; 2937 penta_node_ids[10]=iomodel->numberofvertices+2*iomodel->elementtoverticaledgeconnectivity[3*index+1]+2; 2938 penta_node_ids[11]=iomodel->numberofvertices+2*iomodel->elementtoverticaledgeconnectivity[3*index+2]+2; 2939 2939 break; 2940 2940 case P2xP1Enum: … … 2947 2947 penta_node_ids[ 4]=iomodel->elements[6*index+4]; 2948 2948 penta_node_ids[ 5]=iomodel->elements[6*index+5]; 2949 penta_node_ids[ 6]=iomodel->numberofvertices+iomodel->elementto edgeconnectivity[9*index+3]+1;2950 penta_node_ids[ 7]=iomodel->numberofvertices+iomodel->elementto edgeconnectivity[9*index+4]+1;2951 penta_node_ids[ 8]=iomodel->numberofvertices+iomodel->elementto edgeconnectivity[9*index+5]+1;2952 penta_node_ids[ 9]=iomodel->numberofvertices+iomodel->elementto edgeconnectivity[9*index+6]+1;2953 penta_node_ids[10]=iomodel->numberofvertices+iomodel->elementto edgeconnectivity[9*index+7]+1;2954 penta_node_ids[11]=iomodel->numberofvertices+iomodel->elementto edgeconnectivity[9*index+8]+1;2949 penta_node_ids[ 6]=iomodel->numberofvertices+iomodel->elementtohorizontaledgeconnectivity[6*index+0]+1; 2950 penta_node_ids[ 7]=iomodel->numberofvertices+iomodel->elementtohorizontaledgeconnectivity[6*index+1]+1; 2951 penta_node_ids[ 8]=iomodel->numberofvertices+iomodel->elementtohorizontaledgeconnectivity[6*index+2]+1; 2952 penta_node_ids[ 9]=iomodel->numberofvertices+iomodel->elementtohorizontaledgeconnectivity[6*index+3]+1; 2953 penta_node_ids[10]=iomodel->numberofvertices+iomodel->elementtohorizontaledgeconnectivity[6*index+4]+1; 2954 penta_node_ids[11]=iomodel->numberofvertices+iomodel->elementtohorizontaledgeconnectivity[6*index+5]+1; 2955 2955 break; 2956 2956 case P1xP4Enum: … … 2963 2963 penta_node_ids[ 4]=iomodel->elements[6*index+4]; /*Vertex 5*/ 2964 2964 penta_node_ids[ 5]=iomodel->elements[6*index+5]; /*Vertex 6*/ 2965 penta_node_ids[ 6]=iomodel->numberofvertices+3*iomodel->elementto edgeconnectivity[9*index+0]+1; /*mid vertical edge 1*/2966 penta_node_ids[ 7]=iomodel->numberofvertices+3*iomodel->elementto edgeconnectivity[9*index+1]+1; /*mid vertical edge 2*/2967 penta_node_ids[ 8]=iomodel->numberofvertices+3*iomodel->elementto edgeconnectivity[9*index+2]+1; /*mid vertical edge 3*/2968 penta_node_ids[ 9]=iomodel->numberofvertices+3*iomodel->elementto edgeconnectivity[9*index+0]+2; /* 1/4 vertical edge 1*/2969 penta_node_ids[10]=iomodel->numberofvertices+3*iomodel->elementto edgeconnectivity[9*index+1]+2; /* 1/4 vertical edge 2*/2970 penta_node_ids[11]=iomodel->numberofvertices+3*iomodel->elementto edgeconnectivity[9*index+2]+2; /* 1/4 vertical edge 3*/2971 penta_node_ids[12]=iomodel->numberofvertices+3*iomodel->elementto edgeconnectivity[9*index+0]+3; /* 3/4 vertical edge 1*/2972 penta_node_ids[13]=iomodel->numberofvertices+3*iomodel->elementto edgeconnectivity[9*index+1]+3; /* 3/4 vertical edge 2*/2973 penta_node_ids[14]=iomodel->numberofvertices+3*iomodel->elementto edgeconnectivity[9*index+2]+3; /* 3/4 vertical edge 3*/2965 penta_node_ids[ 6]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*index+0]+1; /*mid vertical edge 1*/ 2966 penta_node_ids[ 7]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*index+1]+1; /*mid vertical edge 2*/ 2967 penta_node_ids[ 8]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*index+2]+1; /*mid vertical edge 3*/ 2968 penta_node_ids[ 9]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*index+0]+2; /* 1/4 vertical edge 1*/ 2969 penta_node_ids[10]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*index+1]+2; /* 1/4 vertical edge 2*/ 2970 penta_node_ids[11]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*index+2]+2; /* 1/4 vertical edge 3*/ 2971 penta_node_ids[12]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*index+0]+3; /* 3/4 vertical edge 1*/ 2972 penta_node_ids[13]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*index+1]+3; /* 3/4 vertical edge 2*/ 2973 penta_node_ids[14]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*index+2]+3; /* 3/4 vertical edge 3*/ 2974 2974 break; 2975 2975 case P2xP4Enum: … … 2982 2982 penta_node_ids[ 4]=iomodel->elements[6*index+4]; /*Vertex 5*/ 2983 2983 penta_node_ids[ 5]=iomodel->elements[6*index+5]; /*Vertex 6*/ 2984 penta_node_ids[ 6]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+0]+1; /*mid vertical edge 1*/2985 penta_node_ids[ 7]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+1]+1; /*mid vertical edge 2*/2986 penta_node_ids[ 8]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+2]+1; /*mid vertical edge 3*/2987 penta_node_ids[ 9]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+3]+1; /*mid basal edge 1*/2988 penta_node_ids[10]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+4]+1; /*mid basal edge 2*/2989 penta_node_ids[11]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+5]+1; /*mid basal edge 3*/2990 penta_node_ids[12]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+6]+1; /*mid top edge 1*/2991 penta_node_ids[13]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+7]+1; /*mid top edge 2*/2992 penta_node_ids[14]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+8]+1; /*mid top edge 3*/2993 penta_node_ids[15]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+0]+2; /* 1/4 vertical edge 1*/2994 penta_node_ids[16]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+1]+2; /* 1/4 vertical edge 2*/2995 penta_node_ids[17]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+2]+2; /* 1/4 vertical edge 3*/2996 penta_node_ids[18]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+0]+3; /* 3/4 vertical edge 1*/2997 penta_node_ids[19]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+1]+3; /* 3/4 vertical edge 2*/2998 penta_node_ids[20]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+2]+3; /* 3/4 vertical edge 3*/2999 penta_node_ids[21]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->elementtofaceconnectivity[5*index+2]+1; /* 1/4 vertical face 1*/3000 penta_node_ids[22]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->elementtofaceconnectivity[5*index+3]+1; /* 1/4 vertical face 2*/3001 penta_node_ids[23]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->elementtofaceconnectivity[5*index+4]+1; /* 1/4 vertical face 3*/3002 penta_node_ids[24]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->elementtofaceconnectivity[5*index+2]+2; /* 2/4 vertical face 1*/3003 penta_node_ids[25]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->elementtofaceconnectivity[5*index+3]+2; /* 2/4 vertical face 2*/3004 penta_node_ids[26]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->elementtofaceconnectivity[5*index+4]+2; /* 2/4 vertical face 3*/3005 penta_node_ids[27]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->elementtofaceconnectivity[5*index+2]+3; /* 3/4 vertical face 1*/3006 penta_node_ids[28]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->elementtofaceconnectivity[5*index+3]+3; /* 3/4 vertical face 2*/3007 penta_node_ids[29]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->elementtofaceconnectivity[5*index+4]+3; /* 3/4 vertical face 3*/2984 penta_node_ids[ 6]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+0]+1; /*mid vertical edge 1*/ 2985 penta_node_ids[ 7]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+1]+1; /*mid vertical edge 2*/ 2986 penta_node_ids[ 8]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+2]+1; /*mid vertical edge 3*/ 2987 penta_node_ids[ 9]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+3]+1; /*mid basal edge 1*/ 2988 penta_node_ids[10]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+4]+1; /*mid basal edge 2*/ 2989 penta_node_ids[11]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+5]+1; /*mid basal edge 3*/ 2990 penta_node_ids[12]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+6]+1; /*mid top edge 1*/ 2991 penta_node_ids[13]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+7]+1; /*mid top edge 2*/ 2992 penta_node_ids[14]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+8]+1; /*mid top edge 3*/ 2993 penta_node_ids[15]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*index+0]+1; /* 1/4 vertical edge 1*/ 2994 penta_node_ids[16]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*index+1]+1; /* 1/4 vertical edge 2*/ 2995 penta_node_ids[17]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*index+2]+1; /* 1/4 vertical edge 3*/ 2996 penta_node_ids[18]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*index+0]+2; /* 3/4 vertical edge 1*/ 2997 penta_node_ids[19]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*index+1]+2; /* 3/4 vertical edge 2*/ 2998 penta_node_ids[20]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*index+2]+2; /* 3/4 vertical edge 3*/ 2999 penta_node_ids[21]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*index+0]+1; /* 1/4 vertical face 1*/ 3000 penta_node_ids[22]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*index+1]+1; /* 1/4 vertical face 2*/ 3001 penta_node_ids[23]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*index+2]+1; /* 1/4 vertical face 3*/ 3002 penta_node_ids[24]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*index+0]+2; /* 2/4 vertical face 1*/ 3003 penta_node_ids[25]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*index+1]+2; /* 2/4 vertical face 2*/ 3004 penta_node_ids[26]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*index+2]+2; /* 2/4 vertical face 3*/ 3005 penta_node_ids[27]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*index+0]+3; /* 3/4 vertical face 1*/ 3006 penta_node_ids[28]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*index+1]+3; /* 3/4 vertical face 2*/ 3007 penta_node_ids[29]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*index+2]+3; /* 3/4 vertical face 3*/ 3008 3008 break; 3009 3009 case P2Enum: … … 3025 3025 penta_node_ids[13]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+7]+1; 3026 3026 penta_node_ids[14]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+8]+1; 3027 penta_node_ids[15]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementto faceconnectivity[5*index+2]+1;3028 penta_node_ids[16]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementto faceconnectivity[5*index+3]+1;3029 penta_node_ids[17]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementto faceconnectivity[5*index+4]+1;3027 penta_node_ids[15]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementtoverticalfaceconnectivity[3*index+0]+1; 3028 penta_node_ids[16]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementtoverticalfaceconnectivity[3*index+1]+1; 3029 penta_node_ids[17]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementtoverticalfaceconnectivity[3*index+2]+1; 3030 3030 break; 3031 3031 case P2bubbleEnum: case P2bubblecondensedEnum: … … 3105 3105 penta_node_ids[13]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+7]+1; 3106 3106 penta_node_ids[14]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+8]+1; 3107 penta_node_ids[15]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementto faceconnectivity[5*index+2]+1;3108 penta_node_ids[16]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementto faceconnectivity[5*index+3]+1;3109 penta_node_ids[17]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementto faceconnectivity[5*index+4]+1;3110 3111 penta_node_ids[18]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberof faces+iomodel->elements[6*index+0];3112 penta_node_ids[19]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberof faces+iomodel->elements[6*index+1];3113 penta_node_ids[20]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberof faces+iomodel->elements[6*index+2];3114 penta_node_ids[21]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberof faces+iomodel->elements[6*index+3];3115 penta_node_ids[22]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberof faces+iomodel->elements[6*index+4];3116 penta_node_ids[23]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberof faces+iomodel->elements[6*index+5];3107 penta_node_ids[15]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementtoverticalfaceconnectivity[3*index+0]+1; 3108 penta_node_ids[16]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementtoverticalfaceconnectivity[3*index+1]+1; 3109 penta_node_ids[17]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementtoverticalfaceconnectivity[3*index+2]+1; 3110 3111 penta_node_ids[18]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofverticalfaces+iomodel->elements[6*index+0]; 3112 penta_node_ids[19]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofverticalfaces+iomodel->elements[6*index+1]; 3113 penta_node_ids[20]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofverticalfaces+iomodel->elements[6*index+2]; 3114 penta_node_ids[21]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofverticalfaces+iomodel->elements[6*index+3]; 3115 penta_node_ids[22]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofverticalfaces+iomodel->elements[6*index+4]; 3116 penta_node_ids[23]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofverticalfaces+iomodel->elements[6*index+5]; 3117 3117 break; 3118 3118 case LATaylorHoodEnum: … … 3147 3147 penta_node_ids[ 4]=iomodel->elements[6*index+4]; /*Vertex 5*/ 3148 3148 penta_node_ids[ 5]=iomodel->elements[6*index+5]; /*Vertex 6*/ 3149 penta_node_ids[ 6]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+0]+1; /*mid vertical edge 1*/3150 penta_node_ids[ 7]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+1]+1; /*mid vertical edge 2*/3151 penta_node_ids[ 8]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+2]+1; /*mid vertical edge 3*/3152 penta_node_ids[ 9]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+3]+1; /*mid basal edge 1*/3153 penta_node_ids[10]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+4]+1; /*mid basal edge 2*/3154 penta_node_ids[11]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+5]+1; /*mid basal edge 3*/3155 penta_node_ids[12]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+6]+1; /*mid top edge 1*/3156 penta_node_ids[13]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+7]+1; /*mid top edge 2*/3157 penta_node_ids[14]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+8]+1; /*mid top edge 3*/3158 penta_node_ids[15]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+0]+2; /* 1/4 vertical edge 1*/3159 penta_node_ids[16]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+1]+2; /* 1/4 vertical edge 2*/3160 penta_node_ids[17]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+2]+2; /* 1/4 vertical edge 3*/3161 penta_node_ids[18]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+0]+3; /* 2/4 vertical edge 1*/3162 penta_node_ids[19]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+1]+3; /* 2/4 vertical edge 2*/3163 penta_node_ids[20]=iomodel->numberofvertices+ 3*iomodel->elementtoedgeconnectivity[9*index+2]+3; /* 2/4 vertical edge 3*/3164 penta_node_ids[21]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->elementtofaceconnectivity[5*index+2]+1; /* 1/4 vertical face 1*/3165 penta_node_ids[22]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->elementtofaceconnectivity[5*index+3]+1; /* 1/4 vertical face 2*/3166 penta_node_ids[23]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->elementtofaceconnectivity[5*index+4]+1; /* 1/4 vertical face 3*/3167 penta_node_ids[24]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->elementtofaceconnectivity[5*index+2]+2; /* 2/4 vertical face 1*/3168 penta_node_ids[25]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->elementtofaceconnectivity[5*index+3]+2; /* 2/4 vertical face 2*/3169 penta_node_ids[26]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->elementtofaceconnectivity[5*index+4]+2; /* 2/4 vertical face 3*/3170 penta_node_ids[27]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->elementtofaceconnectivity[5*index+2]+3; /* 3/4 vertical face 1*/3171 penta_node_ids[28]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->elementtofaceconnectivity[5*index+3]+3; /* 3/4 vertical face 2*/3172 penta_node_ids[29]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->elementtofaceconnectivity[5*index+4]+3; /* 3/4 vertical face 3*/3173 3174 penta_node_ids[30]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->numberoffaces+iomodel->elements[6*index+0];3175 penta_node_ids[31]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->numberoffaces+iomodel->elements[6*index+1];3176 penta_node_ids[32]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->numberoffaces+iomodel->elements[6*index+2];3177 penta_node_ids[33]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->numberoffaces+iomodel->elements[6*index+3];3178 penta_node_ids[34]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->numberoffaces+iomodel->elements[6*index+4];3179 penta_node_ids[35]=iomodel->numberofvertices+ 3*iomodel->numberofedges+3*iomodel->numberoffaces+iomodel->elements[6*index+5];3149 penta_node_ids[ 6]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+0]+1; /*mid vertical edge 1*/ 3150 penta_node_ids[ 7]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+1]+1; /*mid vertical edge 2*/ 3151 penta_node_ids[ 8]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+2]+1; /*mid vertical edge 3*/ 3152 penta_node_ids[ 9]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+3]+1; /*mid basal edge 1*/ 3153 penta_node_ids[10]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+4]+1; /*mid basal edge 2*/ 3154 penta_node_ids[11]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+5]+1; /*mid basal edge 3*/ 3155 penta_node_ids[12]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+6]+1; /*mid top edge 1*/ 3156 penta_node_ids[13]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+7]+1; /*mid top edge 2*/ 3157 penta_node_ids[14]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+8]+1; /*mid top edge 3*/ 3158 penta_node_ids[15]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*index+0]+1; /* 1/4 vertical edge 1*/ 3159 penta_node_ids[16]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*index+1]+1; /* 1/4 vertical edge 2*/ 3160 penta_node_ids[17]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*index+2]+1; /* 1/4 vertical edge 3*/ 3161 penta_node_ids[18]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*index+0]+2; /* 3/4 vertical edge 1*/ 3162 penta_node_ids[19]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*index+1]+2; /* 3/4 vertical edge 2*/ 3163 penta_node_ids[20]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*index+2]+2; /* 3/4 vertical edge 3*/ 3164 penta_node_ids[21]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*index+0]+1; /* 1/4 vertical face 1*/ 3165 penta_node_ids[22]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*index+1]+1; /* 1/4 vertical face 2*/ 3166 penta_node_ids[23]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*index+2]+1; /* 1/4 vertical face 3*/ 3167 penta_node_ids[24]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*index+0]+2; /* 2/4 vertical face 1*/ 3168 penta_node_ids[25]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*index+1]+2; /* 2/4 vertical face 2*/ 3169 penta_node_ids[26]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*index+2]+2; /* 2/4 vertical face 3*/ 3170 penta_node_ids[27]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*index+0]+3; /* 3/4 vertical face 1*/ 3171 penta_node_ids[28]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*index+1]+3; /* 3/4 vertical face 2*/ 3172 penta_node_ids[29]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*index+2]+3; /* 3/4 vertical face 3*/ 3173 3174 penta_node_ids[30]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->numberofverticalfaces+iomodel->elements[6*index+0]; 3175 penta_node_ids[31]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->numberofverticalfaces+iomodel->elements[6*index+1]; 3176 penta_node_ids[32]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->numberofverticalfaces+iomodel->elements[6*index+2]; 3177 penta_node_ids[33]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->numberofverticalfaces+iomodel->elements[6*index+3]; 3178 penta_node_ids[34]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->numberofverticalfaces+iomodel->elements[6*index+4]; 3179 penta_node_ids[35]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->numberofverticalfaces+iomodel->elements[6*index+5]; 3180 3180 break; 3181 3181 case CrouzeixRaviartEnum: -
issm/trunk-jpl/src/c/classes/FemModel.cpp
r23561 r23576 2707 2707 } 2708 2708 SpcNodesx(new_nodes_list[i],new_constraints_list[i],this->parameters,analysis_type); 2709 new_nodes_list[i]->FlagClones(analysis_type);/*FIXME: should be removed !*/ 2709 2710 NodesDofx(new_nodes_list[i],this->parameters,analysis_type); 2710 2711 } -
issm/trunk-jpl/src/c/modules/IoModelToConstraintsx/IoModelToConstraintsx.cpp
r23532 r23576 113 113 } 114 114 115 int count =0;115 int count =0; 116 116 if(M==iomodel->numberofvertices){ 117 117 switch(finite_element){ … … 127 127 break; 128 128 case P2Enum: 129 for(i=0;i<iomodel->numberofvertices;i++){ 130 if((iomodel->my_vertices[i])){ 131 if (!xIsNan<IssmDouble>(spcdata[i])){ 132 constraints->AddObject(new SpcStatic(count+1,i+1,dof,spcdata[i],analysis_type)); 133 count++; 134 } 135 } 136 } 137 for(i=0;i<iomodel->numberofedges;i++){ 138 if(iomodel->my_edges[i] && boundaryedge[i]){ 139 v1 = iomodel->edges[3*i+0]-1; 140 v2 = iomodel->edges[3*i+1]-1; 141 if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){ 142 constraints->AddObject(new SpcStatic(count+1,iomodel->numberofvertices+i+1, 143 dof,(spcdata[v1]+spcdata[v2])/2.,analysis_type)); 144 count++; 145 } 146 } 147 } 148 if(iomodel->meshelementtype==PentaEnum){ 149 for(i=0;i<iomodel->numberofverticalfaces;i++){ 150 if(iomodel->my_vfaces[i]){ 151 value=0.; 152 for(j=0;j<4;j++) value += spcdata[iomodel->verticalfaces[i*4+j] -1]/4.; 153 if(!xIsNan<IssmDouble>(value)){ 154 constraints->AddObject(new SpcStatic(count+1,iomodel->numberofvertices+iomodel->numberofedges+i+1,dof,value,analysis_type)); 155 count++; 156 } 157 } 158 } 159 } 160 break; 161 case P2bubbleEnum: 129 162 for(i=0;i<iomodel->numberofvertices;i++){ 130 163 if((iomodel->my_vertices[i])){ … … 166 199 } 167 200 } 168 break;169 case P2bubbleEnum:170 for(i=0;i<iomodel->numberofvertices;i++){171 if((iomodel->my_vertices[i])){172 if (!xIsNan<IssmDouble>(spcdata[i])){173 constraints->AddObject(new SpcStatic(count+1,i+1,dof,spcdata[i],analysis_type));174 count++;175 }176 }177 }178 for(i=0;i<iomodel->numberofedges;i++){179 if(iomodel->my_edges[i] && boundaryedge[i]){180 v1 = iomodel->edges[3*i+0]-1;181 v2 = iomodel->edges[3*i+1]-1;182 if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){183 constraints->AddObject(new SpcStatic(count+1,iomodel->numberofvertices+i+1,184 dof,(spcdata[v1]+spcdata[v2])/2.,analysis_type));185 count++;186 }187 }188 }189 if(iomodel->meshelementtype==PentaEnum){190 for(i=0;i<iomodel->numberoffaces;i++){191 if(iomodel->faces[i*iomodel->facescols+2]==2){/*Vertical quads*/192 if(iomodel->my_faces[i]){193 numfacevertices = iomodel->faces[i*iomodel->facescols+3];194 value=0.;195 for(j=0;j<numfacevertices;j++){196 value += spcdata[iomodel->faces[i*iomodel->facescols+4+j] -1];197 }198 value = value/reCast<IssmDouble>(numfacevertices);199 if(!xIsNan<IssmDouble>(value)){200 constraints->AddObject(new SpcStatic(count+1,201 iomodel->numberofvertices+iomodel->numberofedges+i+1,202 dof,value,analysis_type));203 count++;204 }205 }206 }207 }208 }209 201 for(i=0;i<iomodel->numberofelements;i++){ 210 202 if(iomodel->my_elements[i]){ … … 233 225 } 234 226 for(i=0;i<iomodel->numberofedges;i++){ 235 if(iomodel->edges[i*3+2]==2){/*Vertical edges*/ 236 if(iomodel->my_edges[i]){ 237 v1 = iomodel->edges[3*i+0]-1; 238 v2 = iomodel->edges[3*i+1]-1; 239 if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){ 240 constraints->AddObject(new SpcStatic(count+1,iomodel->numberofvertices+3*i+1, 241 dof,1./2.*spcdata[v1]+1./2.*spcdata[v2],analysis_type)); 242 constraints->AddObject(new SpcStatic(count+2,iomodel->numberofvertices+3*i+2, 243 dof,1./2.*spcdata[v1]+1./2.*spcdata[v2],analysis_type)); 244 constraints->AddObject(new SpcStatic(count+3,iomodel->numberofvertices+3*i+3, 245 dof,1./2.*spcdata[v1]+1./2.*spcdata[v2],analysis_type)); 246 count=count+3; 247 } 248 } 249 } 250 if(iomodel->edges[i*3+2]==1){/*Horizontal edges*/ 251 if(iomodel->my_edges[i]){ 252 v1 = iomodel->edges[3*i+0]-1; 253 v2 = iomodel->edges[3*i+1]-1; 254 if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){ 255 constraints->AddObject(new SpcStatic(count+1,iomodel->numberofvertices+3*i+1, 256 dof,1./2.*spcdata[v1]+1./2.*spcdata[v2],analysis_type)); 257 count=count+1; 258 } 259 } 260 } 261 } 262 for(i=0;i<iomodel->numberoffaces;i++){ 263 if(iomodel->faces[i*iomodel->facescols+2]==2){/*Vertical quads*/ 264 if(iomodel->my_faces[i]){ 265 numfacevertices = iomodel->faces[i*iomodel->facescols+3]; 266 value=0.; 267 for(j=0;j<numfacevertices;j++){ 268 value += spcdata[iomodel->faces[i*iomodel->facescols+4+j] -1]; 269 } 270 value = value/reCast<IssmDouble>(numfacevertices); 271 if(!xIsNan<IssmDouble>(value)){ 272 constraints->AddObject(new SpcStatic(count+1, 273 iomodel->numberofvertices+3*iomodel->numberofedges+3*i+1, 274 dof,value,analysis_type)); 275 constraints->AddObject(new SpcStatic(count+2, 276 iomodel->numberofvertices+3*iomodel->numberofedges+3*i+2, 277 dof,value,analysis_type)); 278 constraints->AddObject(new SpcStatic(count+3, 279 iomodel->numberofvertices+3*iomodel->numberofedges+3*i+3, 280 dof,value,analysis_type)); 281 count=count+3; 282 } 227 if(iomodel->my_edges[i]){ 228 v1 = iomodel->edges[3*i+0]-1; 229 v2 = iomodel->edges[3*i+1]-1; 230 if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){ 231 constraints->AddObject(new SpcStatic(count+1,iomodel->numberofvertices+i+1, 232 dof,1./2.*spcdata[v1]+1./2.*spcdata[v2],analysis_type)); 233 count++; 234 } 235 } 236 } 237 for(i=0;i<iomodel->numberofverticaledges;i++){ 238 if(iomodel->my_vedges[i]){ 239 v1 = iomodel->verticaledges[2*i+0]-1; 240 v2 = iomodel->verticaledges[2*i+1]-1; 241 if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){ 242 /*FIXME: should not be 1/2 but 1/4 and 3/4!*/ 243 constraints->AddObject(new SpcStatic(count+1,iomodel->numberofvertices+iomodel->numberofedges+2*i+1, 244 dof,1./2.*spcdata[v1]+1./2.*spcdata[v2],analysis_type)); 245 constraints->AddObject(new SpcStatic(count+2,iomodel->numberofvertices+iomodel->numberofedges+2*i+2, 246 dof,1./2.*spcdata[v1]+1./2.*spcdata[v2],analysis_type)); 247 count=count+2; 248 } 249 } 250 } 251 for(i=0;i<iomodel->numberofverticalfaces;i++){ 252 if(iomodel->my_vfaces[i]){ 253 value=0.; 254 for(j=0;j<4;j++) value += spcdata[iomodel->verticalfaces[i*4+j]-1]/4.; 255 if(!xIsNan<IssmDouble>(value)){ 256 constraints->AddObject(new SpcStatic(count+1, 257 iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*i+1, 258 dof,value,analysis_type)); 259 constraints->AddObject(new SpcStatic(count+2, 260 iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*i+2, 261 dof,value,analysis_type)); 262 constraints->AddObject(new SpcStatic(count+3, 263 iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*i+3, 264 dof,value,analysis_type)); 265 count=count+3; 283 266 } 284 267 } … … 326 309 } 327 310 } 328 for(i=0;i<iomodel->numberofedges;i++){ 329 if(iomodel->edges[i*3+2]==2){ 330 if(iomodel->my_edges[i]){ 331 v1 = iomodel->edges[3*i+0]-1; 332 v2 = iomodel->edges[3*i+1]-1; 333 if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){ 334 constraints->AddObject(new SpcStatic(count+1,iomodel->numberofvertices+i+1, 335 dof,(spcdata[v1]+spcdata[v2])/2.,analysis_type)); 336 count++; 337 } 311 for(i=0;i<iomodel->numberofverticaledges;i++){ 312 if(iomodel->my_vedges[i]){ 313 v1 = iomodel->verticaledges[2*i+0]-1; 314 v2 = iomodel->verticaledges[2*i+1]-1; 315 if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){ 316 constraints->AddObject(new SpcStatic(count+1,iomodel->numberofvertices+i+1,dof,(spcdata[v1]+spcdata[v2])/2.,analysis_type)); 317 count++; 338 318 } 339 319 } … … 349 329 } 350 330 } 351 for(i=0;i<iomodel->numberofedges;i++){ 352 if(iomodel->edges[i*3+2]==2){ 353 if(iomodel->my_edges[i]){ 354 v1 = iomodel->edges[3*i+0]-1; 355 v2 = iomodel->edges[3*i+1]-1; 356 if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){ 357 constraints->AddObject(new SpcStatic(count+1,iomodel->numberofvertices+2*i+1, 358 dof,2./3.*spcdata[v1]+1./3.*spcdata[v2],analysis_type)); 359 constraints->AddObject(new SpcStatic(count+2,iomodel->numberofvertices+2*i+2, 360 dof,1./3.*spcdata[v1]+2./3.*spcdata[v2],analysis_type)); 361 count=count+2; 362 } 331 for(i=0;i<iomodel->numberofverticaledges;i++){ 332 if(iomodel->my_vedges[i]){ 333 v1 = iomodel->verticaledges[2*i+0]-1; 334 v2 = iomodel->verticaledges[2*i+1]-1; 335 if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){ 336 constraints->AddObject(new SpcStatic(count+1,iomodel->numberofvertices+2*i+1, 337 dof,2./3.*spcdata[v1]+1./3.*spcdata[v2],analysis_type)); 338 constraints->AddObject(new SpcStatic(count+2,iomodel->numberofvertices+2*i+2, 339 dof,1./3.*spcdata[v1]+2./3.*spcdata[v2],analysis_type)); 340 count=count+2; 363 341 } 364 342 } … … 374 352 } 375 353 } 376 for(i=0;i<iomodel->numberofedges;i++){ 377 if(iomodel->edges[i*3+2]==2){/*Vertical edges*/ 378 if(iomodel->my_edges[i]){ 379 v1 = iomodel->edges[3*i+0]-1; 380 v2 = iomodel->edges[3*i+1]-1; 381 if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){ 382 constraints->AddObject(new SpcStatic(count+1,iomodel->numberofvertices+3*i+1, 383 dof,1./2.*spcdata[v1]+1./2.*spcdata[v2],analysis_type)); 384 constraints->AddObject(new SpcStatic(count+2,iomodel->numberofvertices+3*i+2, 385 dof,1./2.*spcdata[v1]+1./2.*spcdata[v2],analysis_type)); 386 constraints->AddObject(new SpcStatic(count+3,iomodel->numberofvertices+3*i+3, 387 dof,1./2.*spcdata[v1]+1./2.*spcdata[v2],analysis_type)); 388 count=count+3; 389 } 354 for(i=0;i<iomodel->numberofverticaledges;i++){ 355 if(iomodel->my_vedges[i]){ 356 v1 = iomodel->verticaledges[2*i+0]-1; 357 v2 = iomodel->verticaledges[2*i+1]-1; 358 if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){ 359 constraints->AddObject(new SpcStatic(count+1,iomodel->numberofvertices+3*i+1, 360 dof,1./2.*spcdata[v1]+1./2.*spcdata[v2],analysis_type)); 361 constraints->AddObject(new SpcStatic(count+2,iomodel->numberofvertices+3*i+2, 362 dof,1./2.*spcdata[v1]+1./2.*spcdata[v2],analysis_type)); 363 constraints->AddObject(new SpcStatic(count+3,iomodel->numberofvertices+3*i+3, 364 dof,1./2.*spcdata[v1]+1./2.*spcdata[v2],analysis_type)); 365 count=count+3; 390 366 } 391 367 } … … 401 377 } 402 378 } 403 for(i=0;i<iomodel->numberofedges;i++){ 404 if(iomodel->edges[i*3+2]!=2){ 405 if(iomodel->my_edges[i]){ 406 v1 = iomodel->edges[3*i+0]-1; 407 v2 = iomodel->edges[3*i+1]-1; 408 if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){ 409 constraints->AddObject(new SpcStatic(count+1,iomodel->numberofvertices+i+1, 410 dof,(spcdata[v1]+spcdata[v2])/2.,analysis_type)); 411 count++; 412 } 379 for(i=0;i<iomodel->numberofhorizontaledges;i++){ 380 if(iomodel->my_hedges[i]){ 381 v1 = iomodel->horizontaledges[2*i+0]-1; 382 v2 = iomodel->horizontaledges[2*i+1]-1; 383 if(!xIsNan<IssmDouble>(spcdata[v1]) && !xIsNan<IssmDouble>(spcdata[v2])){ 384 constraints->AddObject(new SpcStatic(count+1,iomodel->numberofvertices+i+1,dof,(spcdata[v1]+spcdata[v2])/2.,analysis_type)); 385 count++; 413 386 } 414 387 } -
issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateNodes.cpp
r23561 r23576 9 9 #include "./ModelProcessorx.h" 10 10 11 void CreateNodes(Nodes* nodes, IoModel* iomodel,int analysis,int finite_element,int approximation ){11 void CreateNodes(Nodes* nodes, IoModel* iomodel,int analysis,int finite_element,int approximation,int* approximations){ 12 12 13 13 /*Intermediaries*/ 14 int i,j,counter,vnodes,lid=0; 15 int numberoffaces,elementnbv; 16 bool *my_nodes = NULL; 17 Node *node = NULL; 18 19 int id0 = 0; 20 switch(finite_element){ 21 case P1Enum: 22 for(i=0;i<iomodel->numberofvertices;i++){ 23 if(iomodel->my_vertices[i]){ 24 nodes->AddObject(new Node(id0+i+1,i,lid++,0,i,false,iomodel,analysis,approximation)); 25 } 26 } 27 break; 28 29 case P1DGEnum: 30 DiscontinuousGalerkinNodesPartitioning(&my_nodes,iomodel->my_elements,iomodel->my_vertices,iomodel); 31 for(i=0;i<iomodel->numberofelements;i++){ 32 for(j=0;j<3;j++){ 33 if(my_nodes[3*i+j]){ 34 nodes->AddObject(new Node(id0+3*i+j+1,id0+3*i+j,lid++,0,iomodel->elements[3*i+j]-1,false,iomodel,analysis,approximation)); 35 36 } 37 } 38 } 39 break; 40 41 case P1bubbleEnum: 42 for(i=0;i<iomodel->numberofvertices;i++){ 43 if(iomodel->my_vertices[i]){ 44 nodes->AddObject(new Node(id0+i+1,i,lid++,0,i,false,iomodel,analysis,approximation)); 45 } 46 } 47 for(i=0;i<iomodel->numberofelements;i++){ 48 if(iomodel->my_elements[i]){ 49 nodes->AddObject(new Node(id0+iomodel->numberofvertices+i+1,iomodel->numberofvertices+i,lid++,0,0,false,iomodel,analysis,approximation)); 50 } 51 } 52 break; 53 54 case P1bubblecondensedEnum: 55 for(i=0;i<iomodel->numberofvertices;i++){ 56 if(iomodel->my_vertices[i]){ 57 nodes->AddObject(new Node(id0+i+1,i,lid++,0,i,false,iomodel,analysis,approximation)); 58 } 59 } 60 for(i=0;i<iomodel->numberofelements;i++){ 61 if(iomodel->my_elements[i]){ 62 node = new Node(id0+iomodel->numberofvertices+i+1,iomodel->numberofvertices+i,lid++,0,0,false,iomodel,analysis,approximation); 63 node->HardDeactivate(); 64 nodes->AddObject(node); 65 } 66 } 67 break; 68 69 case P1xP2Enum: 70 EdgesPartitioning(iomodel); 71 for(i=0;i<iomodel->numberofvertices;i++){ 72 if(iomodel->my_vertices[i]){ 73 nodes->AddObject(new Node(id0+i+1,i,lid++,0,i,false,iomodel,analysis,approximation)); 74 } 75 } 76 77 counter = iomodel->numberofvertices; 78 for(i=0;i<iomodel->numberofedges;i++){ 79 if(iomodel->edges[i*3+2]==2){ 80 if(iomodel->my_edges[i]){ 81 node = new Node(id0+iomodel->numberofvertices+i+1,counter+1,lid++,0,0,false,iomodel,analysis,approximation); 82 nodes->AddObject(node); 83 } 84 counter++; 85 } 86 } 87 break; 88 89 case P1xP3Enum: 90 EdgesPartitioning(iomodel); 91 for(i=0;i<iomodel->numberofvertices;i++){ 92 if(iomodel->my_vertices[i]){ 93 nodes->AddObject(new Node(id0+i+1,i,lid++,0,i,false,iomodel,analysis,approximation)); 94 } 95 } 96 97 counter = iomodel->numberofvertices; 98 for(i=0;i<iomodel->numberofedges;i++){ 99 if(iomodel->edges[i*3+2]==2){ 100 if(iomodel->my_edges[i]){ 101 node = new Node(id0+iomodel->numberofvertices+2*i+1,counter+1,lid++,0,0,false,iomodel,analysis,approximation); 102 nodes->AddObject(node); 103 node = new Node(id0+iomodel->numberofvertices+2*i+2,counter+2,lid++,0,0,false,iomodel,analysis,approximation); 104 nodes->AddObject(node); 105 } 106 counter=counter+2; 107 } 108 } 109 break; 110 case P1xP4Enum: 111 EdgesPartitioning(iomodel); 112 for(i=0;i<iomodel->numberofvertices;i++){ 113 if(iomodel->my_vertices[i]){ 114 nodes->AddObject(new Node(id0+i+1,i,lid++,0,i,false,iomodel,analysis,approximation)); 115 } 116 } 117 counter = iomodel->numberofvertices; 118 for(i=0;i<iomodel->numberofedges;i++){ 119 if(iomodel->edges[i*3+2]==2){/*Vertical edges*/ 120 if(iomodel->my_edges[i]){ 121 node = new Node(id0+iomodel->numberofvertices+3*i+1,counter+1,lid++,0,0,false,iomodel,analysis,approximation); 122 nodes->AddObject(node); 123 node = new Node(id0+iomodel->numberofvertices+3*i+2,counter+2,lid++,0,0,false,iomodel,analysis,approximation); 124 nodes->AddObject(node); 125 node = new Node(id0+iomodel->numberofvertices+3*i+3,counter+3,lid++,0,0,false,iomodel,analysis,approximation); 126 nodes->AddObject(node); 127 } 128 counter=counter+3; 129 } 130 } 131 break; 132 133 case P2xP1Enum: 134 EdgesPartitioning(iomodel); 135 for(i=0;i<iomodel->numberofvertices;i++){ 136 if(iomodel->my_vertices[i]){ 137 nodes->AddObject(new Node(id0+i+1,i,lid++,0,i,false,iomodel,analysis,approximation)); 138 } 139 } 140 141 counter = iomodel->numberofvertices; 142 for(i=0;i<iomodel->numberofedges;i++){ 143 if(iomodel->edges[i*3+2]!=2){ 144 if(iomodel->my_edges[i]){ 145 node = new Node(id0+iomodel->numberofvertices+i+1,counter+1,lid++,0,0,false,iomodel,analysis,approximation); 146 nodes->AddObject(node); 147 } 148 counter++; 149 } 150 } 151 break; 152 153 case P2Enum: 154 EdgesPartitioning(iomodel); 155 for(i=0;i<iomodel->numberofvertices;i++){ 156 if(iomodel->my_vertices[i]){ 157 nodes->AddObject(new Node(id0+i+1,i,lid++,0,i,false,iomodel,analysis,approximation)); 158 } 159 } 160 for(i=0;i<iomodel->numberofedges;i++){ 161 if(iomodel->my_edges[i]){ 162 nodes->AddObject(new Node(id0+iomodel->numberofvertices+i+1,iomodel->numberofvertices+i,lid++,0,0,false,iomodel,analysis,approximation)); 163 } 164 } 165 id0 = id0+iomodel->numberofvertices+iomodel->numberofedges; 166 if(iomodel->meshelementtype==PentaEnum){ 14 int numnodes; 15 const int MAXCONNECTIVITY = 5; 16 int element_numnodes; 17 int element_node_ids[40] = {0}; 18 19 /*Get partitioning variables*/ 20 int my_rank = IssmComm::GetRank(); 21 int num_procs = IssmComm::GetSize(); 22 int* epart = iomodel->epart; 23 24 25 /*Determine how many nodes we have in total*/ 26 /*Define nodes sids for each element*/ 27 if(iomodel->meshelementtype==TriaEnum){ 28 switch(finite_element){ 29 case P1Enum: 30 numnodes = iomodel->numberofvertices; 31 break; 32 case P1DGEnum: 33 numnodes = 3*iomodel->numberofelements; 34 break; 35 case P1bubbleEnum: case P1bubblecondensedEnum: 36 numnodes = iomodel->numberofvertices+iomodel->numberofelements; 37 break; 38 case P2Enum: 39 EdgesPartitioning(iomodel); 40 numnodes = iomodel->numberofvertices+iomodel->numberofedges; 41 break; 42 case MINIEnum: case MINIcondensedEnum: 43 /*P1+ velocity (bubble statically condensed), P1 pressure*/ 44 numnodes = (iomodel->numberofvertices+iomodel->numberofelements) + (iomodel->numberofvertices); 45 break; 46 case TaylorHoodEnum: case XTaylorHoodEnum: 47 /*P2 velocity, P1 pressure*/ 48 EdgesPartitioning(iomodel); 49 numnodes = (iomodel->numberofvertices+iomodel->numberofedges) + (iomodel->numberofvertices); 50 break; 51 case LATaylorHoodEnum: 52 /*P2 velocity*/ 53 EdgesPartitioning(iomodel); 54 numnodes = (iomodel->numberofvertices+iomodel->numberofedges); 55 break; 56 case CrouzeixRaviartEnum: 57 /*P2b velocity, P1 DG pressure*/ 58 EdgesPartitioning(iomodel); 59 numnodes = (iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofelements) + (3*iomodel->numberofelements); 60 break; 61 case LACrouzeixRaviartEnum: 62 /*P2b velocity*/ 63 EdgesPartitioning(iomodel); 64 numnodes = (iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofelements); 65 break; 66 default: 67 _error_("Finite element "<<EnumToStringx(finite_element)<<" not supported yet"); 68 } 69 } 70 else if(iomodel->meshelementtype==PentaEnum){ 71 switch(finite_element){ 72 case P1Enum: 73 numnodes = iomodel->numberofvertices; 74 break; 75 case P1bubbleEnum: case P1bubblecondensedEnum: 76 numnodes = iomodel->numberofvertices+iomodel->numberofelements; 77 break; 78 case P1xP2Enum: 79 EdgesPartitioning(iomodel); 80 numnodes = iomodel->numberofvertices+iomodel->numberofverticaledges; 81 break; 82 case P1xP3Enum: 83 EdgesPartitioning(iomodel); 84 numnodes = iomodel->numberofvertices+2*iomodel->numberofverticaledges; 85 break; 86 case P1xP4Enum: 87 EdgesPartitioning(iomodel); 88 numnodes = iomodel->numberofvertices+3*iomodel->numberofverticaledges; 89 break; 90 case P2xP1Enum: 91 EdgesPartitioning(iomodel); 92 numnodes = iomodel->numberofvertices+iomodel->numberofhorizontaledges; 93 break; 94 case P2Enum: 95 EdgesPartitioning(iomodel); 167 96 FacesPartitioning(iomodel); 168 for(i=0;i<iomodel->numberoffaces;i++){ 169 if(iomodel->faces[i*iomodel->facescols+2]==2){/*Vertical quads*/ 170 if(iomodel->my_faces[i]){ 171 node = new Node(id0+i+1,iomodel->numberofvertices+iomodel->numberofedges+i,lid++,0,0,false,iomodel,analysis,approximation); 172 nodes->AddObject(node); 97 numnodes = iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofverticalfaces; 98 break; 99 case P2xP4Enum: 100 EdgesPartitioning(iomodel); 101 FacesPartitioning(iomodel); 102 numnodes = iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->numberofverticalfaces; 103 break; 104 case MINIEnum: case MINIcondensedEnum: 105 /*P1+ velocity (bubble statically condensed), P1 pressure*/ 106 numnodes = (iomodel->numberofvertices+iomodel->numberofelements) + (iomodel->numberofvertices); 107 break; 108 case TaylorHoodEnum: case XTaylorHoodEnum: 109 /*P2 velocity, P1 pressure*/ 110 EdgesPartitioning(iomodel); 111 FacesPartitioning(iomodel); 112 numnodes = (iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofverticalfaces) + (iomodel->numberofvertices); 113 break; 114 case OneLayerP4zEnum: 115 /*P2xP4 velocity, P1 pressure*/ 116 EdgesPartitioning(iomodel); 117 FacesPartitioning(iomodel); 118 numnodes = (iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->numberofverticalfaces) + (iomodel->numberofvertices); 119 break; 120 default: 121 _error_("Finite element "<<EnumToStringx(finite_element)<<" not supported yet"); 122 } 123 } 124 else{ 125 _error_("mesh elements "<< EnumToStringx(iomodel->meshelementtype) <<" not supported yet"); 126 } 127 128 /*create matrix that keeps track of all ranks that have node i, and initialize as -1 (Common to all CPUs)*/ 129 int* nodes_ranks = xNew<int>(MAXCONNECTIVITY*numnodes); 130 for(int i=0;i<MAXCONNECTIVITY*numnodes;i++) nodes_ranks[i] = -1; 131 132 /*For all nodes, count how many cpus have node i (initialize with 0)*/ 133 int* nodes_proc_count = xNewZeroInit<int>(numnodes); 134 135 /*Create vector of size total numnodes, initialized with -1, that will keep track of local ids*/ 136 int* nodes_lids = xNew<int>(numnodes); 137 for(int i=0;i<numnodes;i++) nodes_lids[i] = -1; 138 139 /*Create vector of approximation per node (used for FS: vel or pressure)*/ 140 int* nodes_approx = xNew<int>(numnodes); 141 if(approximations){ 142 for(int i=0;i<numnodes;i++) nodes_approx[i] = approximations[i]; 143 } 144 else{ 145 for(int i=0;i<numnodes;i++) nodes_approx[i] = approximation; 146 } 147 148 /*Go through all elements and mark all vertices for all partitions*/ 149 int lid = 0; 150 for(int i=0;i<iomodel->numberofelements;i++){ 151 152 /*Define nodes sids for each element*/ 153 if(iomodel->meshelementtype==TriaEnum){ 154 switch(finite_element){ 155 case P1Enum: 156 element_numnodes=3; 157 element_node_ids[0]=iomodel->elements[3*i+0]-1; 158 element_node_ids[1]=iomodel->elements[3*i+1]-1; 159 element_node_ids[2]=iomodel->elements[3*i+2]-1; 160 break; 161 case P1bubbleEnum: case P1bubblecondensedEnum: 162 element_numnodes=4; 163 element_node_ids[0]=iomodel->elements[3*i+0]-1; 164 element_node_ids[1]=iomodel->elements[3*i+1]-1; 165 element_node_ids[2]=iomodel->elements[3*i+2]-1; 166 element_node_ids[3]=iomodel->numberofvertices+i; 167 break; 168 case P1DGEnum: 169 element_numnodes=3; 170 element_node_ids[0]=3*i+0; 171 element_node_ids[1]=3*i+1; 172 element_node_ids[2]=3*i+2; 173 break; 174 case P2Enum: 175 element_numnodes = 6; 176 element_node_ids[0]=iomodel->elements[3*i+0]-1; 177 element_node_ids[1]=iomodel->elements[3*i+1]-1; 178 element_node_ids[2]=iomodel->elements[3*i+2]-1; 179 element_node_ids[3]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+0]; 180 element_node_ids[4]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+1]; 181 element_node_ids[5]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+2]; 182 break; 183 case MINIEnum: case MINIcondensedEnum: 184 element_numnodes = 4+3; 185 element_node_ids[0]=iomodel->elements[3*i+0]-1; 186 element_node_ids[1]=iomodel->elements[3*i+1]-1; 187 element_node_ids[2]=iomodel->elements[3*i+2]-1; 188 element_node_ids[3]=iomodel->numberofvertices+i; 189 for(int n=0;n<4;n++) nodes_approx[element_node_ids[n]] = FSvelocityEnum; 190 element_node_ids[4]=iomodel->numberofvertices+iomodel->numberofelements+iomodel->elements[3*i+0]-1; 191 element_node_ids[5]=iomodel->numberofvertices+iomodel->numberofelements+iomodel->elements[3*i+1]-1; 192 element_node_ids[6]=iomodel->numberofvertices+iomodel->numberofelements+iomodel->elements[3*i+2]-1; 193 for(int n=4;n<7;n++) nodes_approx[element_node_ids[n]] = FSpressureEnum; 194 break; 195 case TaylorHoodEnum: case XTaylorHoodEnum: 196 element_numnodes = 6+3; 197 element_node_ids[0]=iomodel->elements[3*i+0]-1; 198 element_node_ids[1]=iomodel->elements[3*i+1]-1; 199 element_node_ids[2]=iomodel->elements[3*i+2]-1; 200 element_node_ids[3]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+0]; 201 element_node_ids[4]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+1]; 202 element_node_ids[5]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+2]; 203 for(int n=0;n<6;n++) nodes_approx[element_node_ids[n]] = FSvelocityEnum; 204 element_node_ids[6]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elements[3*i+0]-1; 205 element_node_ids[7]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elements[3*i+1]-1; 206 element_node_ids[8]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elements[3*i+2]-1; 207 for(int n=6;n<9;n++) nodes_approx[element_node_ids[n]] = FSpressureEnum; 208 break; 209 case LATaylorHoodEnum: 210 element_numnodes = 6; 211 element_node_ids[0]=iomodel->elements[3*i+0]-1; 212 element_node_ids[1]=iomodel->elements[3*i+1]-1; 213 element_node_ids[2]=iomodel->elements[3*i+2]-1; 214 element_node_ids[3]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+0]; 215 element_node_ids[4]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+1]; 216 element_node_ids[5]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+2]; 217 for(int n=0;n<6;n++) nodes_approx[element_node_ids[n]] = FSvelocityEnum; 218 break; 219 case CrouzeixRaviartEnum: 220 element_numnodes = 7+3; 221 element_node_ids[0]=iomodel->elements[3*i+0]-1; 222 element_node_ids[1]=iomodel->elements[3*i+1]-1; 223 element_node_ids[2]=iomodel->elements[3*i+2]-1; 224 element_node_ids[3]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+0]; 225 element_node_ids[4]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+1]; 226 element_node_ids[5]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+2]; 227 element_node_ids[6]=iomodel->numberofvertices+iomodel->numberofedges+i; 228 for(int n=0;n<7;n++) nodes_approx[element_node_ids[n]] = FSvelocityEnum; 229 element_node_ids[7]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofelements+3*i+0; 230 element_node_ids[8]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofelements+3*i+1; 231 element_node_ids[9]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofelements+3*i+2; 232 for(int n=7;n<10;n++) nodes_approx[element_node_ids[n]] = FSpressureEnum; 233 break; 234 case LACrouzeixRaviartEnum: 235 element_numnodes = 7; 236 element_node_ids[0]=iomodel->elements[3*i+0]-1; 237 element_node_ids[1]=iomodel->elements[3*i+1]-1; 238 element_node_ids[2]=iomodel->elements[3*i+2]-1; 239 element_node_ids[3]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+0]; 240 element_node_ids[4]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+1]; 241 element_node_ids[5]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+2]; 242 element_node_ids[6]=iomodel->numberofvertices+iomodel->numberofedges+i; 243 for(int n=0;n<7;n++) nodes_approx[element_node_ids[n]] = FSvelocityEnum; 244 break; 245 default: 246 _error_("Finite element "<<EnumToStringx(finite_element)<<" not supported yet"); 247 } 248 } 249 else if(iomodel->meshelementtype==PentaEnum){ 250 switch(finite_element){ 251 case P1Enum: 252 element_numnodes=6; 253 element_node_ids[0]=iomodel->elements[6*i+0]-1; 254 element_node_ids[1]=iomodel->elements[6*i+1]-1; 255 element_node_ids[2]=iomodel->elements[6*i+2]-1; 256 element_node_ids[3]=iomodel->elements[6*i+3]-1; 257 element_node_ids[4]=iomodel->elements[6*i+4]-1; 258 element_node_ids[5]=iomodel->elements[6*i+5]-1; 259 break; 260 case P1bubbleEnum: case P1bubblecondensedEnum: 261 element_numnodes=7; 262 element_node_ids[0]=iomodel->elements[6*i+0]-1; 263 element_node_ids[1]=iomodel->elements[6*i+1]-1; 264 element_node_ids[2]=iomodel->elements[6*i+2]-1; 265 element_node_ids[3]=iomodel->elements[6*i+3]-1; 266 element_node_ids[4]=iomodel->elements[6*i+4]-1; 267 element_node_ids[5]=iomodel->elements[6*i+5]-1; 268 element_node_ids[6]=iomodel->numberofvertices+i; 269 break; 270 case P1xP2Enum: 271 element_numnodes=9; 272 element_node_ids[0]=iomodel->elements[6*i+0]-1; 273 element_node_ids[1]=iomodel->elements[6*i+1]-1; 274 element_node_ids[2]=iomodel->elements[6*i+2]-1; 275 element_node_ids[3]=iomodel->elements[6*i+3]-1; 276 element_node_ids[4]=iomodel->elements[6*i+4]-1; 277 element_node_ids[5]=iomodel->elements[6*i+5]-1; 278 element_node_ids[6]=iomodel->numberofvertices+iomodel->elementtoverticaledgeconnectivity[3*i+0]; 279 element_node_ids[7]=iomodel->numberofvertices+iomodel->elementtoverticaledgeconnectivity[3*i+1]; 280 element_node_ids[8]=iomodel->numberofvertices+iomodel->elementtoverticaledgeconnectivity[3*i+2]; 281 break; 282 case P1xP3Enum: 283 element_numnodes=12; 284 element_node_ids[ 0]=iomodel->elements[6*i+0]-1; 285 element_node_ids[ 1]=iomodel->elements[6*i+1]-1; 286 element_node_ids[ 2]=iomodel->elements[6*i+2]-1; 287 element_node_ids[ 3]=iomodel->elements[6*i+3]-1; 288 element_node_ids[ 4]=iomodel->elements[6*i+4]-1; 289 element_node_ids[ 5]=iomodel->elements[6*i+5]-1; 290 element_node_ids[ 6]=iomodel->numberofvertices+2*iomodel->elementtoverticaledgeconnectivity[3*i+0]+0; 291 element_node_ids[ 7]=iomodel->numberofvertices+2*iomodel->elementtoverticaledgeconnectivity[3*i+1]+0; 292 element_node_ids[ 8]=iomodel->numberofvertices+2*iomodel->elementtoverticaledgeconnectivity[3*i+2]+0; 293 element_node_ids[ 9]=iomodel->numberofvertices+2*iomodel->elementtoverticaledgeconnectivity[3*i+0]+1; 294 element_node_ids[10]=iomodel->numberofvertices+2*iomodel->elementtoverticaledgeconnectivity[3*i+1]+1; 295 element_node_ids[11]=iomodel->numberofvertices+2*iomodel->elementtoverticaledgeconnectivity[3*i+2]+1; 296 break; 297 case P1xP4Enum: 298 element_numnodes=15; 299 element_node_ids[ 0]=iomodel->elements[6*i+0]-1; /*Vertex 1*/ 300 element_node_ids[ 1]=iomodel->elements[6*i+1]-1; /*Vertex 2*/ 301 element_node_ids[ 2]=iomodel->elements[6*i+2]-1; /*Vertex 3*/ 302 element_node_ids[ 3]=iomodel->elements[6*i+3]-1; /*Vertex 4*/ 303 element_node_ids[ 4]=iomodel->elements[6*i+4]-1; /*Vertex 5*/ 304 element_node_ids[ 5]=iomodel->elements[6*i+5]-1; /*Vertex 6*/ 305 element_node_ids[ 6]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*i+0]+0; /*mid vertical edge 1*/ 306 element_node_ids[ 7]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*i+1]+0; /*mid vertical edge 2*/ 307 element_node_ids[ 8]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*i+2]+0; /*mid vertical edge 3*/ 308 element_node_ids[ 9]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*i+0]+1; /* 1/4 vertical edge 1*/ 309 element_node_ids[10]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*i+1]+1; /* 1/4 vertical edge 2*/ 310 element_node_ids[11]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*i+2]+1; /* 1/4 vertical edge 3*/ 311 element_node_ids[12]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*i+0]+2; /* 3/4 vertical edge 1*/ 312 element_node_ids[13]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*i+1]+2; /* 3/4 vertical edge 2*/ 313 element_node_ids[14]=iomodel->numberofvertices+3*iomodel->elementtoverticaledgeconnectivity[3*i+2]+2; /* 3/4 vertical edge 3*/ 314 break; 315 case P2xP1Enum: 316 element_numnodes=12; 317 element_node_ids[ 0]=iomodel->elements[6*i+0]-1; 318 element_node_ids[ 1]=iomodel->elements[6*i+1]-1; 319 element_node_ids[ 2]=iomodel->elements[6*i+2]-1; 320 element_node_ids[ 3]=iomodel->elements[6*i+3]-1; 321 element_node_ids[ 4]=iomodel->elements[6*i+4]-1; 322 element_node_ids[ 5]=iomodel->elements[6*i+5]-1; 323 element_node_ids[ 6]=iomodel->numberofvertices+iomodel->elementtohorizontaledgeconnectivity[6*i+0]; 324 element_node_ids[ 7]=iomodel->numberofvertices+iomodel->elementtohorizontaledgeconnectivity[6*i+1]; 325 element_node_ids[ 8]=iomodel->numberofvertices+iomodel->elementtohorizontaledgeconnectivity[6*i+2]; 326 element_node_ids[ 9]=iomodel->numberofvertices+iomodel->elementtohorizontaledgeconnectivity[6*i+3]; 327 element_node_ids[10]=iomodel->numberofvertices+iomodel->elementtohorizontaledgeconnectivity[6*i+4]; 328 element_node_ids[11]=iomodel->numberofvertices+iomodel->elementtohorizontaledgeconnectivity[6*i+5]; 329 break; 330 case P2Enum: 331 element_numnodes = 18; 332 element_node_ids[ 0]=iomodel->elements[6*i+0]-1; 333 element_node_ids[ 1]=iomodel->elements[6*i+1]-1; 334 element_node_ids[ 2]=iomodel->elements[6*i+2]-1; 335 element_node_ids[ 3]=iomodel->elements[6*i+3]-1; 336 element_node_ids[ 4]=iomodel->elements[6*i+4]-1; 337 element_node_ids[ 5]=iomodel->elements[6*i+5]-1; 338 element_node_ids[ 6]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+0]; 339 element_node_ids[ 7]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+1]; 340 element_node_ids[ 8]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+2]; 341 element_node_ids[ 9]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+3]; 342 element_node_ids[10]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+4]; 343 element_node_ids[11]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+5]; 344 element_node_ids[12]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+6]; 345 element_node_ids[13]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+7]; 346 element_node_ids[14]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+8]; 347 element_node_ids[15]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementtoverticalfaceconnectivity[3*i+0]; 348 element_node_ids[16]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementtoverticalfaceconnectivity[3*i+1]; 349 element_node_ids[17]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementtoverticalfaceconnectivity[3*i+2]; 350 break; 351 case P2xP4Enum: 352 element_numnodes = 30; 353 element_node_ids[ 0]=iomodel->elements[6*i+0]-1; /*Vertex 1*/ 354 element_node_ids[ 1]=iomodel->elements[6*i+1]-1; /*Vertex 2*/ 355 element_node_ids[ 2]=iomodel->elements[6*i+2]-1; /*Vertex 3*/ 356 element_node_ids[ 3]=iomodel->elements[6*i+3]-1; /*Vertex 4*/ 357 element_node_ids[ 4]=iomodel->elements[6*i+4]-1; /*Vertex 5*/ 358 element_node_ids[ 5]=iomodel->elements[6*i+5]-1; /*Vertex 6*/ 359 element_node_ids[ 6]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+0]; /*mid vertical edge 1*/ 360 element_node_ids[ 7]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+1]; /*mid vertical edge 2*/ 361 element_node_ids[ 8]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+2]; /*mid vertical edge 3*/ 362 element_node_ids[ 9]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+3]; /*mid basal edge 1*/ 363 element_node_ids[10]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+4]; /*mid basal edge 2*/ 364 element_node_ids[11]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+5]; /*mid basal edge 3*/ 365 element_node_ids[12]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+6]; /*mid top edge 1*/ 366 element_node_ids[13]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+7]; /*mid top edge 2*/ 367 element_node_ids[14]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+8]; /*mid top edge 3*/ 368 element_node_ids[15]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+0]; /* 1/4 vertical edge 1*/ 369 element_node_ids[16]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+1]; /* 1/4 vertical edge 2*/ 370 element_node_ids[17]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+2]; /* 1/4 vertical edge 3*/ 371 element_node_ids[18]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+0]+1; /* 3/4 vertical edge 1*/ 372 element_node_ids[19]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+1]+1; /* 3/4 vertical edge 2*/ 373 element_node_ids[20]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+2]+1; /* 3/4 vertical edge 3*/ 374 element_node_ids[21]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+0]+0; /* 1/4 vertical face 1*/ 375 element_node_ids[22]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+1]+0; /* 1/4 vertical face 2*/ 376 element_node_ids[23]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+2]+0; /* 1/4 vertical face 3*/ 377 element_node_ids[24]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+0]+1; /* 2/4 vertical face 1*/ 378 element_node_ids[25]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+1]+1; /* 2/4 vertical face 2*/ 379 element_node_ids[26]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+2]+1; /* 2/4 vertical face 3*/ 380 element_node_ids[27]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+0]+2; /* 3/4 vertical face 1*/ 381 element_node_ids[28]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+1]+2; /* 3/4 vertical face 2*/ 382 element_node_ids[29]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+2]+2; /* 3/4 vertical face 3*/ 383 break; 384 case MINIEnum: case MINIcondensedEnum: 385 element_numnodes = 7+6; 386 element_node_ids[ 0]=iomodel->elements[6*i+0]-1; 387 element_node_ids[ 1]=iomodel->elements[6*i+1]-1; 388 element_node_ids[ 2]=iomodel->elements[6*i+2]-1; 389 element_node_ids[ 3]=iomodel->elements[6*i+3]-1; 390 element_node_ids[ 4]=iomodel->elements[6*i+4]-1; 391 element_node_ids[ 5]=iomodel->elements[6*i+5]-1; 392 element_node_ids[ 6]=iomodel->numberofvertices+i; 393 if(!approximations) for(int n=0;n<7;n++) nodes_approx[element_node_ids[n]] = FSvelocityEnum; 394 element_node_ids[ 7]=iomodel->numberofvertices+iomodel->numberofelements+iomodel->elements[6*i+0]-1; 395 element_node_ids[ 8]=iomodel->numberofvertices+iomodel->numberofelements+iomodel->elements[6*i+1]-1; 396 element_node_ids[ 9]=iomodel->numberofvertices+iomodel->numberofelements+iomodel->elements[6*i+2]-1; 397 element_node_ids[10]=iomodel->numberofvertices+iomodel->numberofelements+iomodel->elements[6*i+3]-1; 398 element_node_ids[11]=iomodel->numberofvertices+iomodel->numberofelements+iomodel->elements[6*i+4]-1; 399 element_node_ids[12]=iomodel->numberofvertices+iomodel->numberofelements+iomodel->elements[6*i+5]-1; 400 if(!approximations) for(int n=7;n<13;n++) nodes_approx[element_node_ids[n]] = FSpressureEnum; 401 break; 402 case TaylorHoodEnum: case XTaylorHoodEnum: 403 element_numnodes = 18+6; 404 element_node_ids[ 0]=iomodel->elements[6*i+0]-1; 405 element_node_ids[ 1]=iomodel->elements[6*i+1]-1; 406 element_node_ids[ 2]=iomodel->elements[6*i+2]-1; 407 element_node_ids[ 3]=iomodel->elements[6*i+3]-1; 408 element_node_ids[ 4]=iomodel->elements[6*i+4]-1; 409 element_node_ids[ 5]=iomodel->elements[6*i+5]-1; 410 element_node_ids[ 6]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+0]; 411 element_node_ids[ 7]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+1]; 412 element_node_ids[ 8]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+2]; 413 element_node_ids[ 9]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+3]; 414 element_node_ids[10]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+4]; 415 element_node_ids[11]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+5]; 416 element_node_ids[12]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+6]; 417 element_node_ids[13]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+7]; 418 element_node_ids[14]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+8]; 419 element_node_ids[15]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementtoverticalfaceconnectivity[3*i+0]; 420 element_node_ids[16]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementtoverticalfaceconnectivity[3*i+1]; 421 element_node_ids[17]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementtoverticalfaceconnectivity[3*i+2]; 422 for(int n=0;n<18;n++) nodes_approx[element_node_ids[n]] = FSvelocityEnum; 423 element_node_ids[18]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofverticalfaces+iomodel->elements[6*i+0]-1; 424 element_node_ids[19]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofverticalfaces+iomodel->elements[6*i+1]-1; 425 element_node_ids[20]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofverticalfaces+iomodel->elements[6*i+2]-1; 426 element_node_ids[21]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofverticalfaces+iomodel->elements[6*i+3]-1; 427 element_node_ids[22]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofverticalfaces+iomodel->elements[6*i+4]-1; 428 element_node_ids[23]=iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofverticalfaces+iomodel->elements[6*i+5]-1; 429 for(int n=18;n<24;n++) nodes_approx[element_node_ids[n]] = FSpressureEnum; 430 break; 431 case OneLayerP4zEnum: 432 element_numnodes = 30+6; 433 element_node_ids[ 0]=iomodel->elements[6*i+0]-1; /*Vertex 1*/ 434 element_node_ids[ 1]=iomodel->elements[6*i+1]-1; /*Vertex 2*/ 435 element_node_ids[ 2]=iomodel->elements[6*i+2]-1; /*Vertex 3*/ 436 element_node_ids[ 3]=iomodel->elements[6*i+3]-1; /*Vertex 4*/ 437 element_node_ids[ 4]=iomodel->elements[6*i+4]-1; /*Vertex 5*/ 438 element_node_ids[ 5]=iomodel->elements[6*i+5]-1; /*Vertex 6*/ 439 element_node_ids[ 6]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+0]; /*mid vertical edge 1*/ 440 element_node_ids[ 7]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+1]; /*mid vertical edge 2*/ 441 element_node_ids[ 8]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+2]; /*mid vertical edge 3*/ 442 element_node_ids[ 9]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+3]; /*mid basal edge 1*/ 443 element_node_ids[10]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+4]; /*mid basal edge 2*/ 444 element_node_ids[11]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+5]; /*mid basal edge 3*/ 445 element_node_ids[12]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+6]; /*mid top edge 1*/ 446 element_node_ids[13]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+7]; /*mid top edge 2*/ 447 element_node_ids[14]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*i+8]; /*mid top edge 3*/ 448 element_node_ids[15]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+0]; /* 1/4 vertical edge 1*/ 449 element_node_ids[16]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+1]; /* 1/4 vertical edge 2*/ 450 element_node_ids[17]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+2]; /* 1/4 vertical edge 3*/ 451 element_node_ids[18]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+0]+1; /* 3/4 vertical edge 1*/ 452 element_node_ids[19]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+1]+1; /* 3/4 vertical edge 2*/ 453 element_node_ids[20]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->elementtoverticaledgeconnectivity[3*i+2]+1; /* 3/4 vertical edge 3*/ 454 element_node_ids[21]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+0]+0; /* 1/4 vertical face 1*/ 455 element_node_ids[22]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+1]+0; /* 1/4 vertical face 2*/ 456 element_node_ids[23]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+2]+0; /* 1/4 vertical face 3*/ 457 element_node_ids[24]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+0]+1; /* 2/4 vertical face 1*/ 458 element_node_ids[25]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+1]+1; /* 2/4 vertical face 2*/ 459 element_node_ids[26]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+2]+1; /* 2/4 vertical face 3*/ 460 element_node_ids[27]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+0]+2; /* 3/4 vertical face 1*/ 461 element_node_ids[28]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+1]+2; /* 3/4 vertical face 2*/ 462 element_node_ids[29]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+2]+2; /* 3/4 vertical face 3*/ 463 for(int n=0;n<30;n++) nodes_approx[element_node_ids[n]] = FSvelocityEnum; 464 element_node_ids[30]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->numberofverticalfaces+iomodel->elements[6*i+0]-1; 465 element_node_ids[31]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->numberofverticalfaces+iomodel->elements[6*i+1]-1; 466 element_node_ids[32]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->numberofverticalfaces+iomodel->elements[6*i+2]-1; 467 element_node_ids[33]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->numberofverticalfaces+iomodel->elements[6*i+3]-1; 468 element_node_ids[34]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->numberofverticalfaces+iomodel->elements[6*i+4]-1; 469 element_node_ids[35]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->numberofverticalfaces+iomodel->elements[6*i+5]-1; 470 for(int n=30;n<36;n++) nodes_approx[element_node_ids[n]] = FSpressureEnum; 471 break; 472 default: 473 _error_("Finite element "<<EnumToStringx(finite_element)<<" not supported yet"); 474 } 475 } 476 else{ 477 _error_("mesh elements "<< EnumToStringx(iomodel->meshelementtype) <<" not supported yet"); 478 } 479 480 for(int j=0;j<element_numnodes;j++){ 481 int nid = element_node_ids[j]; _assert_(nid<numnodes); 482 483 /*See if it has already been marked*/ 484 bool found = false; 485 for(int k=0;k<nodes_proc_count[nid];k++){ 486 if(nodes_ranks[MAXCONNECTIVITY*nid+k] == epart[i]){ 487 found = true; 488 break; 489 } 490 } 491 492 /*On go below if this vertex has not been seen yet in this partition*/ 493 if(!found){ 494 /*This rank has not been marked for this vertex just yet so go ahead and mark it*/ 495 nodes_ranks[MAXCONNECTIVITY*nid+nodes_proc_count[nid]] = epart[i]; 496 nodes_proc_count[nid]++; 497 498 /*Keep track of local ids!*/ 499 if(epart[i]==my_rank){ 500 nodes_lids[nid] = lid; 501 lid++; 502 } 503 504 /*Make sure we don't go too far in the table*/ 505 if(nodes_proc_count[nid]>MAXCONNECTIVITY) _error_("need to increase MAXCONNECTIVITY (this is hard coded, contact ISSM developer)"); 506 } 507 } 508 } 509 if(finite_element==P1DGEnum){/* Special case for DG...{{{*/ 510 int node_list[4]; 511 if(!iomodel->domaintype==Domain2DhorizontalEnum) _error_("not implemented yet"); 512 CreateEdges(iomodel); 513 CreateFaces(iomodel); 514 for(int i=0;i<iomodel->numberoffaces;i++){ 515 int e1=iomodel->faces[4*i+2]-1; //faces are [node1 node2 elem1 elem2] 516 int e2=iomodel->faces[4*i+3]-1; //faces are [node1 node2 elem1 elem2] 517 if(e2!=-2){ 518 if(epart[e1]!=epart[e2]){ 519 int i1=iomodel->faces[4*i+0]; 520 int i2=iomodel->faces[4*i+1]; 521 int pos=-1; 522 for(int j=0;j<3;j++) if(iomodel->elements[3*e2+j]==i1) pos=j; 523 if( pos==0){ node_list[0] = e2*3+0; node_list[1] = e2*3+2;} 524 else if(pos==1){ node_list[0] = e2*3+1; node_list[1] = e2*3+0;} 525 else if(pos==2){ node_list[0] = e2*3+2; node_list[1] = e2*3+1;} 526 else _error_("not supposed to happen"); 527 pos=-1; 528 for(int j=0;j<3;j++) if(iomodel->elements[3*e1+j]==i1) pos=j; 529 if( pos==0){ node_list[2] = e1*3+0; node_list[3] = e1*3+1;} 530 else if(pos==1){ node_list[2] = e1*3+1; node_list[3] = e1*3+2;} 531 else if(pos==2){ node_list[2] = e1*3+2; node_list[3] = e1*3+0;} 532 else _error_("not supposed to happen"); 533 for(int j=0;j<4;j++){ 534 int nid = node_list[j]; 535 bool found = false; 536 for(int k=0;k<nodes_proc_count[nid];k++){ 537 if(nodes_ranks[MAXCONNECTIVITY*nid+k] == epart[e1]){ 538 found = true; 539 break; 540 } 541 } 542 if(!found){ 543 nodes_ranks[MAXCONNECTIVITY*nid+nodes_proc_count[nid]] = epart[e1]; 544 nodes_proc_count[nid]++; 545 if(epart[e1]==my_rank){ 546 nodes_lids[nid] = lid; 547 lid++; 548 } 549 if(nodes_proc_count[nid]>MAXCONNECTIVITY) _error_("need to increase MAXCONNECTIVITY (this is hard coded, contact ISSM developer)"); 173 550 } 174 551 } 175 else if(iomodel->faces[i*iomodel->facescols+2]==1){/*Triangular base/top*/ 176 /*Nothing*/ 177 } 178 else{ 179 _error_("not supported"); 180 } 181 } 182 } 183 break; 184 case P2bubbleEnum: 185 EdgesPartitioning(iomodel); 186 for(i=0;i<iomodel->numberofvertices;i++){ 187 if(iomodel->my_vertices[i]){ 188 nodes->AddObject(new Node(id0+i+1,i,lid++,0,i,false,iomodel,analysis,approximation)); 189 } 190 } 191 for(i=0;i<iomodel->numberofedges;i++){ 192 if(iomodel->my_edges[i]){ 193 nodes->AddObject(new Node(id0+iomodel->numberofvertices+i+1,iomodel->numberofvertices+i,lid++,0,0,false,iomodel,analysis,approximation)); 194 } 195 } 196 id0 = id0+iomodel->numberofvertices+iomodel->numberofedges; 197 if(iomodel->meshelementtype==PentaEnum){ 198 FacesPartitioning(iomodel); 199 for(i=0;i<iomodel->numberoffaces;i++){ 200 if(iomodel->faces[i*iomodel->facescols+2]==2){/*Vertical quads*/ 201 if(iomodel->my_faces[i]){ 202 node = new Node(id0+i+1,iomodel->numberofvertices+iomodel->numberofedges+i,lid++,0,0,false,iomodel,analysis,approximation); 203 nodes->AddObject(node); 552 for(int j=0;j<4;j++){ 553 int nid = node_list[j]; 554 bool found = false; 555 for(int k=0;k<nodes_proc_count[nid];k++){ 556 if(nodes_ranks[MAXCONNECTIVITY*nid+k] == epart[e2]){ 557 found = true; 558 break; 559 } 560 } 561 if(!found){ 562 nodes_ranks[MAXCONNECTIVITY*nid+nodes_proc_count[nid]] = epart[e2]; 563 nodes_proc_count[nid]++; 564 if(epart[e2]==my_rank){ 565 nodes_lids[nid] = lid; 566 lid++; 567 } 568 if(nodes_proc_count[nid]>MAXCONNECTIVITY) _error_("need to increase MAXCONNECTIVITY (this is hard coded, contact ISSM developer)"); 204 569 } 205 570 } 206 else if(iomodel->faces[i*iomodel->facescols+2]==1){/*Triangular base/top*/ 207 /*Nothing*/ 571 } 572 } 573 } 574 }/*}}}*/ 575 //if(my_rank==0) printarray(nodes_ranks,numnodes,MAXCONNECTIVITY); 576 577 /*Now, Count how many clones we have with other partitions*/ 578 int* common_send = xNew<int>(num_procs); 579 int* common_recv = xNew<int>(num_procs); 580 int** common_send_ids = xNew<int*>(num_procs); 581 int** common_recv_ids = xNew<int*>(num_procs); 582 583 /*First step: allocate, Step 2: populate*/ 584 for(int step=0;step<2;step++){ 585 if(step==1){ 586 /*Allocate send and receive arrays of ids now*/ 587 for(int i=0;i<num_procs;i++){ 588 _assert_(common_send[i]>=0 && common_recv[i]>=0); 589 common_send_ids[i] = xNew<int>(common_send[i]); 590 common_recv_ids[i] = xNew<int>(common_recv[i]); 591 } 592 } 593 /*Re/Initialize counters to 0*/ 594 for(int i=0;i<num_procs;i++){ 595 common_recv[i]=0; 596 common_send[i]=0; 597 } 598 /*Go through table and find clones/masters etc*/ 599 for(int i=0;i<numnodes;i++){ 600 /*If we did not find this vertex in our current partition, go to next vertex*/ 601 if(nodes_lids[i] == -1) continue; 602 /*Find in what column this rank belongs*/ 603 int col = -1; 604 for(int j=0;j<MAXCONNECTIVITY;j++){ 605 if(nodes_ranks[MAXCONNECTIVITY*i+j] == my_rank){ 606 col = j; 607 break; 608 } 609 } 610 _assert_(col!=-1); 611 612 /*If col==0, it is either not on boundary, or a master*/ 613 if(col==0){ 614 /*1. is this vertex on the boundary? Skip if not*/ 615 if(nodes_ranks[MAXCONNECTIVITY*i+col+1]==-1){ 616 continue; 617 } 618 else{ 619 for(int j=1;j<nodes_proc_count[i];j++){ 620 _assert_(nodes_ranks[MAXCONNECTIVITY*i+j]>=0); 621 int rank = nodes_ranks[MAXCONNECTIVITY*i+j]; 622 if(step==1){ 623 common_send_ids[rank][common_send[rank]] = nodes_lids[i]; 624 } 625 common_send[rank]++; 208 626 } 209 else{ 210 _error_("not supported"); 211 } 212 } 213 id0 = id0+iomodel->numberoffaces; 214 } 215 for(i=0;i<iomodel->numberofelements;i++){ 216 if(iomodel->my_elements[i]){ 217 nodes->AddObject(new Node(id0+i+1,id0+i,lid++,0,0,false,iomodel,analysis,approximation)); 218 } 219 } 220 break; 221 case P2xP4Enum: 222 EdgesPartitioning(iomodel); 223 FacesPartitioning(iomodel); 224 for(i=0;i<iomodel->numberofvertices;i++){ 225 if(iomodel->my_vertices[i]){ 226 nodes->AddObject(new Node(id0+i+1,i,lid++,0,i,false,iomodel,analysis,approximation)); 227 } 228 } 229 counter = iomodel->numberofvertices; 230 for(i=0;i<iomodel->numberofedges;i++){ 231 if(iomodel->edges[i*3+2]==2){/*Vertical edges*/ 232 if(iomodel->my_edges[i]){ 233 node = new Node(id0+iomodel->numberofvertices+3*i+1,counter+1,lid++,0,0,false,iomodel,analysis,approximation); 234 nodes->AddObject(node); 235 node = new Node(id0+iomodel->numberofvertices+3*i+2,counter+2,lid++,0,0,false,iomodel,analysis,approximation); 236 nodes->AddObject(node); 237 node = new Node(id0+iomodel->numberofvertices+3*i+3,counter+3,lid++,0,0,false,iomodel,analysis,approximation); 238 nodes->AddObject(node); 239 } 240 counter=counter+3; 241 } 242 else if(iomodel->edges[i*3+2]==1){/*Horizontal edges*/ 243 if(iomodel->my_edges[i]){ 244 node = new Node(id0+iomodel->numberofvertices+3*i+1,counter+1,lid++,0,0,false,iomodel,analysis,approximation); 245 nodes->AddObject(node); 246 } 247 counter=counter+1; 248 } 249 else{ 250 _error_("not supported"); 251 } 252 } 253 id0 = id0+iomodel->numberofvertices+3*iomodel->numberofedges; 254 for(i=0;i<iomodel->numberoffaces;i++){ 255 if(iomodel->faces[i*iomodel->facescols+2]==2){/*Vertical quads*/ 256 if(iomodel->my_faces[i]){ 257 node = new Node(id0+3*i+1,counter+1,lid++,0,0,false,iomodel,analysis,approximation); 258 nodes->AddObject(node); 259 node = new Node(id0+3*i+2,counter+2,lid++,0,0,false,iomodel,analysis,approximation); 260 nodes->AddObject(node); 261 node = new Node(id0+3*i+3,counter+3,lid++,0,0,false,iomodel,analysis,approximation); 262 nodes->AddObject(node); 263 } 264 counter=counter+3; 265 } 266 else if(iomodel->faces[i*iomodel->facescols+2]==1){/*Triangular base/top*/ 267 /*Nothing*/ 268 } 269 else{ 270 _error_("not supported"); 271 } 272 } 273 break; 274 275 /*Stokes elements*/ 276 case P1P1Enum: 277 _assert_(approximation==FSApproximationEnum); 278 /*P1 velocity*/ 279 for(i=0;i<iomodel->numberofvertices;i++){ 280 if(iomodel->my_vertices[i]){ 281 nodes->AddObject(new Node(id0+i+1,i,lid++,0,i,false,iomodel,analysis,FSvelocityEnum)); 282 } 283 } 284 /*P1 pressure*/ 285 vnodes = id0+iomodel->numberofvertices; 286 for(i=0;i<iomodel->numberofvertices;i++){ 287 if(iomodel->my_vertices[i]){ 288 nodes->AddObject(new Node(vnodes+i+1,iomodel->numberofvertices+i,lid++,0,i,false,iomodel,analysis,FSpressureEnum)); 289 } 290 } 291 break; 292 case P1P1GLSEnum: 293 _assert_(approximation==FSApproximationEnum); 294 /*P1 velocity*/ 295 for(i=0;i<iomodel->numberofvertices;i++){ 296 if(iomodel->my_vertices[i]){ 297 nodes->AddObject(new Node(id0+i+1,i,lid++,0,i,false,iomodel,analysis,FSvelocityEnum)); 298 } 299 } 300 /*P1 pressure*/ 301 vnodes = id0+iomodel->numberofvertices; 302 for(i=0;i<iomodel->numberofvertices;i++){ 303 if(iomodel->my_vertices[i]){ 304 nodes->AddObject(new Node(vnodes+i+1,iomodel->numberofvertices+i,lid++,0,i,false,iomodel,analysis,FSpressureEnum)); 305 } 306 } 307 break; 308 case MINIcondensedEnum: 309 _assert_(approximation==FSApproximationEnum); 310 /*P1+ velocity (bubble statically condensed)*/ 311 for(i=0;i<iomodel->numberofvertices;i++){ 312 if(iomodel->my_vertices[i]){ 313 nodes->AddObject(new Node(id0+i+1,i,lid++,0,i,false,iomodel,analysis,FSvelocityEnum)); 314 } 315 } 316 for(i=0;i<iomodel->numberofelements;i++){ 317 if(iomodel->my_elements[i]){ 318 node = new Node(id0+iomodel->numberofvertices+i+1,iomodel->numberofvertices+i,lid++,0,0,false,iomodel,analysis,FSvelocityEnum); 627 } 628 } 629 else{ 630 /*3. It is a slave, record that we need to receive for this cpu*/ 631 int rank = nodes_ranks[MAXCONNECTIVITY*i+0]; 632 if(step==1){ 633 common_recv_ids[rank][common_recv[rank]] = nodes_lids[i]; 634 } 635 common_recv[rank]++; 636 } 637 } 638 } 639 xDelete<int>(nodes_proc_count); 640 641 /*Final step: prepare pids (parallel ids), first count number of masters for each proc*/ 642 int* num_masters = xNewZeroInit<int>(num_procs); 643 for(int i=0;i<numnodes;i++){ 644 num_masters[nodes_ranks[MAXCONNECTIVITY*i+0]]++; 645 } 646 /*Now count offsets for each procs (by taking the sum of masters of procs<my_rank)*/ 647 int* rank_offsets = xNewZeroInit<int>(num_procs); 648 for(int i=0;i<num_procs;i++){ 649 for(int j=i+1;j<num_procs;j++) rank_offsets[i]+=num_masters[j]; 650 } 651 xDelete<int>(num_masters); 652 /*Now create pids*/ 653 int* nodes_pids = xNew<int>(numnodes); 654 int* rank_counters = xNewZeroInit<int>(numnodes); 655 for(int i=0;i<numnodes;i++){ 656 int rank_master = nodes_ranks[MAXCONNECTIVITY*i+0]; 657 nodes_pids[i] = rank_offsets[rank_master]+rank_counters[rank_master]; 658 rank_counters[rank_master]++; 659 } 660 xDelete<int>(rank_counters); 661 xDelete<int>(rank_offsets); 662 663 /*Go ahead and create vertices now that we have all we need*/ 664 for(int i=0;i<numnodes;i++){ 665 if(nodes_lids[i]!=-1){ 666 bool isclone = (nodes_ranks[MAXCONNECTIVITY*i+0]!=my_rank); 667 int io_index = 0; 668 if(i<iomodel->numberofvertices) io_index = i; 669 Node* node=new Node(i+1,i,nodes_lids[i],nodes_pids[i],io_index,isclone,iomodel,analysis,nodes_approx[i]); 670 if(finite_element==MINIcondensedEnum || finite_element==P1bubblecondensedEnum){ 671 /*Bubble function is collapsed, needs to constrain it, maybe this is not the best place to do this, but that's life!*/ 672 if(i>=iomodel->numberofvertices && i<iomodel->numberofvertices+iomodel->numberofelements){ 319 673 node->HardDeactivate(); 320 nodes->AddObject(node); 321 } 322 } 323 /*P1 pressure*/ 324 vnodes = id0+iomodel->numberofvertices+iomodel->numberofelements; 325 for(i=0;i<iomodel->numberofvertices;i++){ 326 if(iomodel->my_vertices[i]){ 327 nodes->AddObject(new Node(vnodes+i+1,iomodel->numberofvertices+iomodel->numberofelements+i,lid++,0,i,false,iomodel,analysis,FSpressureEnum)); 328 } 329 } 330 break; 331 case MINIEnum: 332 _assert_(approximation==FSApproximationEnum); 333 /*P1+ velocity*/ 334 for(i=0;i<iomodel->numberofvertices;i++){ 335 if(iomodel->my_vertices[i]){ 336 nodes->AddObject(new Node(id0+i+1,i,lid++,0,i,false,iomodel,analysis,FSvelocityEnum)); 337 } 338 } 339 for(i=0;i<iomodel->numberofelements;i++){ 340 if(iomodel->my_elements[i]){ 341 nodes->AddObject(new Node(id0+iomodel->numberofvertices+i+1,iomodel->numberofvertices+i,lid++,0,0,false,iomodel,analysis,FSvelocityEnum)); 342 } 343 } 344 /*P1 pressure*/ 345 vnodes = id0+iomodel->numberofvertices+iomodel->numberofelements; 346 for(i=0;i<iomodel->numberofvertices;i++){ 347 if(iomodel->my_vertices[i]){ 348 nodes->AddObject(new Node(vnodes+i+1,iomodel->numberofvertices+iomodel->numberofelements+i,lid++,0,i,false,iomodel,analysis,FSpressureEnum)); 349 } 350 } 351 break; 352 case TaylorHoodEnum: 353 case XTaylorHoodEnum: 354 _assert_(approximation==FSApproximationEnum); 355 /*P2 velocity*/ 356 EdgesPartitioning(iomodel); 357 for(i=0;i<iomodel->numberofvertices;i++){ 358 if(iomodel->my_vertices[i]){ 359 nodes->AddObject(new Node(id0+i+1,i,lid++,0,i,false,iomodel,analysis,FSvelocityEnum)); 360 } 361 } 362 for(i=0;i<iomodel->numberofedges;i++){ 363 if(iomodel->my_edges[i]){ 364 nodes->AddObject(new Node(id0+iomodel->numberofvertices+i+1,iomodel->numberofvertices+i,lid++,0,0,false,iomodel,analysis,FSvelocityEnum)); 365 } 366 } 367 id0 = id0+iomodel->numberofvertices+iomodel->numberofedges; 368 if(iomodel->meshelementtype==PentaEnum){ 369 FacesPartitioning(iomodel); 370 for(i=0;i<iomodel->numberoffaces;i++){ 371 if(iomodel->faces[i*iomodel->facescols+2]==2){/*Vertical quads*/ 372 if(iomodel->my_faces[i]){ 373 node = new Node(id0+i+1,iomodel->numberofvertices+iomodel->numberofedges+i,lid++,0,0,false,iomodel,analysis,FSvelocityEnum); 374 nodes->AddObject(node); 375 } 376 } 377 else if(iomodel->faces[i*iomodel->facescols+2]==1){/*Triangular base/top*/ 378 /*Nothing*/ 379 } 380 else{ 381 _error_("not supported"); 382 } 383 } 384 } 385 386 /*P1 pressure*/ 387 if(iomodel->meshelementtype==PentaEnum){ 388 numberoffaces=iomodel->numberoffaces; 389 } 390 else{ 391 numberoffaces=0; 392 } 393 vnodes = id0+numberoffaces; 394 for(i=0;i<iomodel->numberofvertices;i++){ 395 if(iomodel->my_vertices[i]){ 396 nodes->AddObject(new Node(vnodes+i+1,iomodel->numberofvertices+iomodel->numberofedges+numberoffaces+i,lid++,0,i,false,iomodel,analysis,FSpressureEnum)); 397 } 398 } 399 break; 400 case LATaylorHoodEnum: 401 _assert_(approximation==FSApproximationEnum); 402 /*P2 velocity*/ 403 EdgesPartitioning(iomodel); 404 for(i=0;i<iomodel->numberofvertices;i++){ 405 if(iomodel->my_vertices[i]){ 406 nodes->AddObject(new Node(id0+i+1,i,lid++,0,i,false,iomodel,analysis,FSvelocityEnum)); 407 } 408 } 409 for(i=0;i<iomodel->numberofedges;i++){ 410 if(iomodel->my_edges[i]){ 411 nodes->AddObject(new Node(id0+iomodel->numberofvertices+i+1,iomodel->numberofvertices+i,lid++,0,0,false,iomodel,analysis,FSvelocityEnum)); 412 } 413 } 414 id0 = id0+iomodel->numberofvertices+iomodel->numberofedges; 415 if(iomodel->meshelementtype==PentaEnum){ 416 FacesPartitioning(iomodel); 417 for(i=0;i<iomodel->numberoffaces;i++){ 418 if(iomodel->faces[i*iomodel->facescols+2]==2){/*Vertical quads*/ 419 if(iomodel->my_faces[i]){ 420 node = new Node(id0+i+1,iomodel->numberofvertices+iomodel->numberofedges+i,lid++,0,0,false,iomodel,analysis,FSvelocityEnum); 421 nodes->AddObject(node); 422 } 423 } 424 else if(iomodel->faces[i*iomodel->facescols+2]==1){/*Triangular base/top*/ 425 /*Nothing*/ 426 } 427 else{ 428 _error_("not supported"); 429 } 430 } 431 } 432 433 /*No pressure*/ 434 break; 435 case OneLayerP4zEnum: 436 _assert_(approximation==FSApproximationEnum); 437 EdgesPartitioning(iomodel); 438 FacesPartitioning(iomodel); 439 /*P2xP4 velocity*/ 440 for(i=0;i<iomodel->numberofvertices;i++){ 441 if(iomodel->my_vertices[i]){ 442 nodes->AddObject(new Node(id0+i+1,i,lid++,0,i,false,iomodel,analysis,FSvelocityEnum)); 443 } 444 } 445 counter = iomodel->numberofvertices; 446 for(i=0;i<iomodel->numberofedges;i++){ 447 if(iomodel->edges[i*3+2]==2){/*Vertical edges*/ 448 if(iomodel->my_edges[i]){ 449 node = new Node(id0+iomodel->numberofvertices+3*i+1,counter+1,lid++,0,0,false,iomodel,analysis,FSvelocityEnum); 450 nodes->AddObject(node); 451 node = new Node(id0+iomodel->numberofvertices+3*i+2,counter+2,lid++,0,0,false,iomodel,analysis,FSvelocityEnum); 452 nodes->AddObject(node); 453 node = new Node(id0+iomodel->numberofvertices+3*i+3,counter+3,lid++,0,0,false,iomodel,analysis,FSvelocityEnum); 454 nodes->AddObject(node); 455 } 456 counter=counter+3; 457 } 458 else if(iomodel->edges[i*3+2]==1){/*Horizontal edges*/ 459 if(iomodel->my_edges[i]){ 460 node = new Node(id0+iomodel->numberofvertices+3*i+1,counter+1,lid++,0,0,false,iomodel,analysis,FSvelocityEnum); 461 nodes->AddObject(node); 462 } 463 counter=counter+1; 464 } 465 else{ 466 _error_("not supported"); 467 } 468 } 469 id0 = id0+iomodel->numberofvertices+3*iomodel->numberofedges; 470 for(i=0;i<iomodel->numberoffaces;i++){ 471 if(iomodel->faces[i*iomodel->facescols+2]==2){/*Vertical quads*/ 472 if(iomodel->my_faces[i]){ 473 node = new Node(id0+3*i+1,counter+1,lid++,0,0,false,iomodel,analysis,FSvelocityEnum); 474 nodes->AddObject(node); 475 node = new Node(id0+3*i+2,counter+2,lid++,0,0,false,iomodel,analysis,FSvelocityEnum); 476 nodes->AddObject(node); 477 node = new Node(id0+3*i+3,counter+3,lid++,0,0,false,iomodel,analysis,FSvelocityEnum); 478 nodes->AddObject(node); 479 } 480 counter=counter+3; 481 } 482 else if(iomodel->faces[i*iomodel->facescols+2]==1){/*Triangular base/top*/ 483 /*Nothing*/ 484 } 485 else{ 486 _error_("not supported"); 487 } 488 } 489 490 /*P1 pressure*/ 491 vnodes = id0+3*iomodel->numberoffaces; 492 for(i=0;i<iomodel->numberofvertices;i++){ 493 if(iomodel->my_vertices[i]){ 494 nodes->AddObject(new Node(vnodes+i+1,counter+1,lid++,0,i,false,iomodel,analysis,FSpressureEnum)); 495 } 496 counter++; 497 } 498 break; 499 case CrouzeixRaviartEnum: 500 _assert_(approximation==FSApproximationEnum); 501 /*P2b velocity*/ 502 EdgesPartitioning(iomodel); 503 for(i=0;i<iomodel->numberofvertices;i++){ 504 if(iomodel->my_vertices[i]){ 505 nodes->AddObject(new Node(id0+i+1,i,lid++,0,i,false,iomodel,analysis,FSvelocityEnum)); 506 } 507 } 508 for(i=0;i<iomodel->numberofedges;i++){ 509 if(iomodel->my_edges[i]){ 510 nodes->AddObject(new Node(id0+iomodel->numberofvertices+i+1,iomodel->numberofvertices+i,lid++,0,0,false,iomodel,analysis,FSvelocityEnum)); 511 } 512 } 513 id0 = id0+iomodel->numberofvertices+iomodel->numberofedges; 514 if(iomodel->meshelementtype==PentaEnum){ 515 FacesPartitioning(iomodel); 516 for(i=0;i<iomodel->numberoffaces;i++){ 517 if(iomodel->faces[i*iomodel->facescols+2]==2){/*Vertical quads*/ 518 if(iomodel->my_faces[i]){ 519 node = new Node(id0+i+1,iomodel->numberofvertices+iomodel->numberofedges+i,lid++,0,0,false,iomodel,analysis,FSvelocityEnum); 520 nodes->AddObject(node); 521 } 522 } 523 else if(iomodel->faces[i*iomodel->facescols+2]==1){/*Triangular base/top*/ 524 /*Nothing*/ 525 } 526 else{ 527 _error_("not supported"); 528 } 529 } 530 id0 = id0+iomodel->numberoffaces; 531 } 532 for(i=0;i<iomodel->numberofelements;i++){ 533 if(iomodel->my_elements[i]){ 534 nodes->AddObject(new Node(id0+i+1,id0+i,lid++,0,0,false,iomodel,analysis,FSvelocityEnum)); 535 } 536 } 537 538 /*P1 DG pressure*/ 539 vnodes = id0+iomodel->numberofelements; 540 switch(iomodel->meshelementtype){ 541 case TriaEnum: elementnbv = 3; break; 542 case TetraEnum: elementnbv = 4; break; 543 case PentaEnum: elementnbv = 6; break; 544 default: _error_("mesh dimension not supported yet"); 545 } 546 for(i=0;i<iomodel->numberofelements;i++){ 547 if(iomodel->my_elements[i]){ 548 for(j=0;j<elementnbv;j++){ 549 nodes->AddObject(new Node(vnodes+elementnbv*i+j+1,vnodes+elementnbv*i+j,lid++,0,iomodel->elements[+elementnbv*i+j]-1,false,iomodel,analysis,FSpressureEnum)); 550 551 } 552 } 553 } 554 break; 555 case LACrouzeixRaviartEnum: 556 _assert_(approximation==FSApproximationEnum); 557 /*P2b velocity*/ 558 EdgesPartitioning(iomodel); 559 for(i=0;i<iomodel->numberofvertices;i++){ 560 if(iomodel->my_vertices[i]){ 561 nodes->AddObject(new Node(id0+i+1,i,lid++,0,i,false,iomodel,analysis,FSvelocityEnum)); 562 } 563 } 564 for(i=0;i<iomodel->numberofedges;i++){ 565 if(iomodel->my_edges[i]){ 566 nodes->AddObject(new Node(id0+iomodel->numberofvertices+i+1,iomodel->numberofvertices+i,lid++,0,0,false,iomodel,analysis,FSvelocityEnum)); 567 } 568 } 569 id0 = id0+iomodel->numberofvertices+iomodel->numberofedges; 570 if(iomodel->meshelementtype==PentaEnum){ 571 FacesPartitioning(iomodel); 572 for(i=0;i<iomodel->numberoffaces;i++){ 573 if(iomodel->faces[i*iomodel->facescols+2]==2){/*Vertical quads*/ 574 if(iomodel->my_faces[i]){ 575 node = new Node(id0+i+1,iomodel->numberofvertices+iomodel->numberofedges+i,lid++,0,0,false,iomodel,analysis,FSvelocityEnum); 576 nodes->AddObject(node); 577 } 578 } 579 else if(iomodel->faces[i*iomodel->facescols+2]==1){/*Triangular base/top*/ 580 /*Nothing*/ 581 } 582 else{ 583 _error_("not supported"); 584 } 585 } 586 id0 = id0+iomodel->numberoffaces; 587 } 588 for(i=0;i<iomodel->numberofelements;i++){ 589 if(iomodel->my_elements[i]){ 590 nodes->AddObject(new Node(id0+i+1,id0+i,lid++,0,0,false,iomodel,analysis,FSvelocityEnum)); 591 } 592 } 593 594 /*No pressure*/ 595 break; 596 597 default: 598 _error_("Finite element "<<EnumToStringx(finite_element)<<" not supported yet"); 599 } 600 601 /*Clean up*/ 602 xDelete<bool>(my_nodes); 674 } 675 } 676 nodes->AddObject(node); 677 } 678 } 679 xDelete<int>(nodes_approx); 680 xDelete<int>(nodes_ranks); 681 xDelete<int>(nodes_lids); 682 xDelete<int>(nodes_pids); 683 684 nodes->common_send=common_send; 685 nodes->common_recv=common_recv; 686 nodes->common_send_ids=common_send_ids; 687 nodes->common_recv_ids=common_recv_ids; 603 688 } -
issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h
r23516 r23576 22 22 void UpdateElementsAndMaterialsDakota(Elements* elements,Materials* materials, IoModel* iomodel); 23 23 void UpdateElementsTransient(Elements* elements,Parameters* parameters,IoModel* iomodel); 24 void CreateNodes(Nodes*nodes, IoModel* iomodel,int analysis,int finite_element,int approximation=NoneApproximationEnum );24 void CreateNodes(Nodes*nodes, IoModel* iomodel,int analysis,int finite_element,int approximation=NoneApproximationEnum,int* approximations=NULL); 25 25 26 26 /*partitioning: */ -
issm/trunk-jpl/src/c/modules/NodesDofx/NodesDofx.cpp
r15861 r23576 20 20 /*Ensure that only for each cpu, the partition border nodes only will be taken into account once 21 21 * across the cluster. To do so, we flag all the clone nodes: */ 22 nodes->FlagClones(configuration_type);22 //nodes->FlagClones(configuration_type); /*Not needed anymore!*/ 23 23 24 24 /*Go through all nodes, and build degree of freedom lists. Each node gets a fixed number of dofs. When
Note:
See TracChangeset
for help on using the changeset viewer.