Changeset 16727
- Timestamp:
- 11/12/13 20:38:11 (11 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp ¶
r16721 r16727 297 297 xDelete<IssmDouble>(phi); 298 298 xDelete<int>(doflist); 299 if(meshtype!=Mesh2DhorizontalEnum) delete element;300 }/*}}}*/ 299 if(meshtype!=Mesh2DhorizontalEnum) delete basalelement; 300 }/*}}}*/ -
TabularUnified issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp ¶
r16717 r16727 937 937 InputUpdateFromSolutionFS(solution,element); 938 938 return; 939 case SSAApproximationEnum: case HOApproximationEnum: case SIAApproximationEnum: 940 InputUpdateFromSolutionHoriz(solution,element); 939 case SSAApproximationEnum: 940 InputUpdateFromSolutionSSA(solution,element); 941 return; 942 case HOApproximationEnum: 943 InputUpdateFromSolutionHO(solution,element); 944 return; 945 case SIAApproximationEnum: 946 InputUpdateFromSolutionHO(solution,element); 941 947 return; 942 948 case L1L2ApproximationEnum: 943 InputUpdateFromSolutionH oriz(solution,element);949 InputUpdateFromSolutionHO(solution,element); 944 950 return; 945 951 case SSAHOApproximationEnum: case HOFSApproximationEnum: case SSAFSApproximationEnum: … … 950 956 } 951 957 }/*}}}*/ 952 void StressbalanceAnalysis::InputUpdateFromSolutionHoriz(IssmDouble* solution,Element* element){/*{{{*/ 958 void StressbalanceAnalysis::InputUpdateFromSolutionSSA(IssmDouble* solution,Element* element){/*{{{*/ 959 960 int i,meshtype; 961 IssmDouble rho_ice,g; 962 int* doflist=NULL; 963 IssmDouble* xyz_list=NULL; 964 Element* basalelement=NULL; 965 966 /*Deal with pressure first*/ 967 int numvertices = element->GetNumberOfVertices(); 968 IssmDouble* pressure = xNew<IssmDouble>(numvertices); 969 IssmDouble* thickness = xNew<IssmDouble>(numvertices); 970 IssmDouble* surface = xNew<IssmDouble>(numvertices); 971 972 element->FindParam(&meshtype,MeshTypeEnum); 973 rho_ice =element->GetMaterialParameter(MaterialsRhoIceEnum); 974 g =element->GetMaterialParameter(ConstantsGEnum); 975 switch(meshtype){ 976 case Mesh2DhorizontalEnum: 977 element->GetInputListOnNodes(thickness,ThicknessEnum); 978 for(i=0;i<numvertices;i++) pressure[i]=rho_ice*g*thickness[i]; 979 break; 980 case Mesh3DEnum: 981 element->GetVerticesCoordinates(&xyz_list); 982 element->GetInputListOnNodes(surface,SurfaceEnum); 983 for(i=0;i<numvertices;i++) pressure[i]=rho_ice*g*(surface[i]-xyz_list[i*3+2]); 984 break; 985 default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet"); 986 } 987 element->AddInput(PressureEnum,pressure,P1Enum); 988 xDelete<IssmDouble>(pressure); 989 xDelete<IssmDouble>(thickness); 990 xDelete<IssmDouble>(surface); 991 992 /*Get basal element*/ 993 switch(meshtype){ 994 case Mesh2DhorizontalEnum: 995 basalelement = element; 996 break; 997 case Mesh3DEnum: 998 if(!element->IsOnBed()) return; 999 basalelement=element->SpawnBasalElement(); 1000 break; 1001 default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet"); 1002 } 1003 1004 /*Fetch number of nodes and dof for this finite element*/ 1005 int numnodes = basalelement->GetNumberOfNodes(); 1006 int numdof = numnodes*2; 1007 1008 /*Fetch dof list and allocate solution vectors*/ 1009 basalelement->GetDofList(&doflist,NoneApproximationEnum,GsetEnum); 1010 IssmDouble* values = xNew<IssmDouble>(numdof); 1011 IssmDouble* vx = xNew<IssmDouble>(numnodes); 1012 IssmDouble* vy = xNew<IssmDouble>(numnodes); 1013 IssmDouble* vz = xNew<IssmDouble>(numnodes); 1014 IssmDouble* vel = xNew<IssmDouble>(numnodes); 1015 1016 /*Use the dof list to index into the solution vector: */ 1017 for(i=0;i<numdof;i++) values[i]=solution[doflist[i]]; 1018 1019 /*Transform solution in Cartesian Space*/ 1020 basalelement->TransformSolutionCoord(&values[0],XYEnum); 1021 basalelement->FindParam(&meshtype,MeshTypeEnum); 1022 1023 /*Ok, we have vx and vy in values, fill in vx and vy arrays: */ 1024 for(i=0;i<numnodes;i++){ 1025 vx[i]=values[i*2+0]; 1026 vy[i]=values[i*2+1]; 1027 1028 /*Check solution*/ 1029 if(xIsNan<IssmDouble>(vx[i])) _error_("NaN found in solution vector"); 1030 if(xIsNan<IssmDouble>(vy[i])) _error_("NaN found in solution vector"); 1031 } 1032 1033 /*Get Vz and compute vel*/ 1034 basalelement->GetInputListOnNodes(&vz[0],VzEnum,0.); 1035 for(i=0;i<numnodes;i++) vel[i]=sqrt(vx[i]*vx[i] + vy[i]*vy[i] + vz[i]*vz[i]); 1036 1037 /*Now, we have to move the previous Vx and Vy inputs to old 1038 * status, otherwise, we'll wipe them off: */ 1039 element->InputChangeName(VxEnum,VxPicardEnum); 1040 element->InputChangeName(VyEnum,VyPicardEnum); 1041 1042 /*Add vx and vy as inputs to the tria element: */ 1043 element->AddBasalInput(VxEnum,vx,P1Enum); 1044 element->AddBasalInput(VyEnum,vy,P1Enum); 1045 element->AddBasalInput(VelEnum,vel,P1Enum); 1046 1047 /*Free ressources:*/ 1048 xDelete<IssmDouble>(vel); 1049 xDelete<IssmDouble>(vz); 1050 xDelete<IssmDouble>(vy); 1051 xDelete<IssmDouble>(vx); 1052 xDelete<IssmDouble>(values); 1053 xDelete<IssmDouble>(xyz_list); 1054 xDelete<int>(doflist); 1055 if(meshtype!=Mesh2DhorizontalEnum) delete basalelement; 1056 }/*}}}*/ 1057 void StressbalanceAnalysis::InputUpdateFromSolutionHO(IssmDouble* solution,Element* element){/*{{{*/ 953 1058 954 1059 int i,meshtype; … … 969 1074 IssmDouble* vel = xNew<IssmDouble>(numnodes); 970 1075 IssmDouble* pressure = xNew<IssmDouble>(numnodes); 971 IssmDouble* thickness = xNew<IssmDouble>(numnodes);972 1076 IssmDouble* surface = xNew<IssmDouble>(numnodes); 973 1077 … … 997 1101 rho_ice = element->GetMaterialParameter(MaterialsRhoIceEnum); 998 1102 g = element->GetMaterialParameter(ConstantsGEnum); 999 switch(meshtype){ 1000 case Mesh2DhorizontalEnum: 1001 element->GetInputListOnNodes(&thickness[0],ThicknessEnum); 1002 for(i=0;i<numnodes;i++) pressure[i]=rho_ice*g*thickness[i]; 1003 break; 1004 case Mesh3DEnum: 1005 element->GetVerticesCoordinates(&xyz_list); 1006 element->GetInputListOnNodes(&surface[0],SurfaceEnum); 1007 for(i=0;i<numnodes;i++) pressure[i]=rho_ice*g*(surface[i]-xyz_list[i*3+2]); 1008 break; 1009 default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet"); 1010 } 1103 element->GetVerticesCoordinates(&xyz_list); 1104 element->GetInputListOnNodes(&surface[0],SurfaceEnum); 1105 for(i=0;i<numnodes;i++) pressure[i]=rho_ice*g*(surface[i]-xyz_list[i*3+2]); 1011 1106 1012 1107 /*Now, we have to move the previous Vx and Vy inputs to old … … 1019 1114 element->AddInput(VxEnum,vx,P1Enum); 1020 1115 element->AddInput(VyEnum,vy,P1Enum); 1021 element->Add Input(VelEnum,vel,P1Enum);1022 element->Add Input(PressureEnum,pressure,P1Enum);1116 element->AddBasalInput(VelEnum,vel,P1Enum); 1117 element->AddBasalInput(PressureEnum,pressure,P1Enum); 1023 1118 1024 1119 /*Free ressources:*/ 1025 xDelete<IssmDouble>(thickness);1026 1120 xDelete<IssmDouble>(surface); 1027 1121 xDelete<IssmDouble>(pressure); … … 1033 1127 xDelete<IssmDouble>(xyz_list); 1034 1128 xDelete<int>(doflist); 1035 1036 1129 }/*}}}*/ 1037 1130 void StressbalanceAnalysis::InputUpdateFromSolutionFS(IssmDouble* solution,Element* element){/*{{{*/ -
TabularUnified issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h ¶
r16715 r16727 23 23 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 24 24 void InputUpdateFromSolutionFS(IssmDouble* solution,Element* element); 25 void InputUpdateFromSolutionHoriz(IssmDouble* solution,Element* element); 25 void InputUpdateFromSolutionHO(IssmDouble* solution,Element* element); 26 void InputUpdateFromSolutionSSA(IssmDouble* solution,Element* element); 26 27 }; 27 28 #endif -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Element.h ¶
r16721 r16727 60 60 virtual int GetNumberOfNodesVelocity(void)=0; 61 61 virtual int GetNumberOfNodesPressure(void)=0; 62 virtual int GetNumberOfVertices(void)=0; 62 63 virtual void GetNodesSidList(int* sidlist)=0; 63 64 virtual void GetNodesLidList(int* sidlist)=0; -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Penta.cpp ¶
r16725 r16727 139 139 Penta* penta=NULL; 140 140 141 for(i= 1;i<NUMVERTICES2D;i++){141 for(i=0;i<NUMVERTICES2D;i++){ 142 142 extrudedvalues[i]=values[i]; 143 143 extrudedvalues[i+NUMVERTICES2D]=values[i]; 144 144 } 145 this->inputs->AddInput(new PentaInput(input_enum,&extrudedvalues[0],P1Enum));146 145 penta=this; 147 146 for(;;){ … … 1394 1393 int Penta::GetNumberOfNodesVelocity(void){ 1395 1394 return this->NumberofNodesVelocity(); 1395 } 1396 /*}}}*/ 1397 /*FUNCTION Penta::GetNumberOfVertices;{{{*/ 1398 int Penta::GetNumberOfVertices(void){ 1399 return NUMVERTICES; 1396 1400 } 1397 1401 /*}}}*/ -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Penta.h ¶
r16721 r16727 93 93 int GetNumberOfNodesPressure(void); 94 94 int GetNumberOfNodesVelocity(void); 95 int GetNumberOfVertices(void); 95 96 IssmDouble GetMaterialParameter(int enum_in); 96 97 void GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution,int enum_type); -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Seg.h ¶
r16721 r16727 98 98 int GetNumberOfNodesVelocity(void){_error_("not implemented yet");}; 99 99 int GetNumberOfNodesPressure(void){_error_("not implemented yet");}; 100 int GetNumberOfVertices(void){_error_("not implemented yet");}; 100 101 void GetVerticesCoordinates(IssmDouble** pxyz_list){_error_("not implemented yet");}; 101 102 int Sid(){_error_("not implemented yet");}; -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Tria.cpp ¶
r16725 r16727 1367 1367 int Tria::GetNumberOfNodes(void){ 1368 1368 return this->NumberofNodes(); 1369 } 1370 /*}}}*/ 1371 /*FUNCTION Tria::GetNumberOfVertices;{{{*/ 1372 int Tria::GetNumberOfVertices(void){ 1373 return NUMVERTICES; 1369 1374 } 1370 1375 /*}}}*/ -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Tria.h ¶
r16721 r16727 91 91 int GetNumberOfNodesPressure(void){_error_("not implemented yet");}; 92 92 int GetNumberOfNodesVelocity(void){_error_("not implemented yet");}; 93 int GetNumberOfVertices(void); 93 94 int Sid(); 94 95 bool IsOnBed();
Note:
See TracChangeset
for help on using the changeset viewer.