Changeset 16804
- Timestamp:
- 11/16/13 13:48:18 (11 years ago)
- Location:
- issm/trunk-jpl/src/c/analyses
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
r16803 r16804 812 812 case SSAApproximationEnum: 813 813 return CreatePVectorSSA(element); 814 case HOApproximationEnum: 815 return CreatePVectorHO(element); 814 816 default: 815 817 _error_("Approximation "<<EnumToStringx(approximation)<<" not supported"); 816 818 } 819 }/*}}}*/ 820 ElementVector* StressbalanceAnalysis::CreatePVectorHO(Element* element){/*{{{*/ 821 822 /*compute all load vectors for this element*/ 823 ElementVector* pe1=CreatePVectorHODrivingStress(element); 824 ElementVector* pe2=CreatePVectorHOFront(element); 825 ElementVector* pe =new ElementVector(pe1,pe2); 826 827 /*clean-up and return*/ 828 delete pe1; 829 delete pe2; 830 return pe; 831 }/*}}}*/ 832 ElementVector* StressbalanceAnalysis::CreatePVectorHODrivingStress(Element* element){/*{{{*/ 833 834 /*Intermediaries */ 835 IssmDouble Jdet,slope[3]; 836 IssmDouble* xyz_list = NULL; 837 838 /*Fetch number of nodes and dof for this finite element*/ 839 int numnodes = element->GetNumberOfNodes(); 840 841 /*Initialize Element vector and vectors*/ 842 ElementVector* pe=element->NewElementVector(HOApproximationEnum); 843 IssmDouble* basis = xNew<IssmDouble>(numnodes); 844 845 /*Retrieve all inputs and parameters*/ 846 element->GetVerticesCoordinates(&xyz_list); 847 Input* surface_input = element->GetInput(SurfaceEnum); _assert_(surface_input); 848 IssmDouble rhog = element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum); 849 850 /* Start looping on the number of gaussian points: */ 851 Gauss* gauss=element->NewGauss(3); 852 for(int ig=gauss->begin();ig<gauss->end();ig++){ 853 gauss->GaussPoint(ig); 854 855 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 856 element->NodalFunctions(basis, gauss); 857 surface_input->GetInputDerivativeValue(&slope[0],xyz_list,gauss); 858 859 for(int i=0;i<numnodes;i++){ 860 pe->values[i*2+0]+=-rhog*slope[0]*Jdet*gauss->weight*basis[i]; 861 pe->values[i*2+1]+=-rhog*slope[1]*Jdet*gauss->weight*basis[i]; 862 } 863 } 864 865 /*Transform coordinate system*/ 866 element->TransformLoadVectorCoord(pe,XYEnum); 867 868 /*Clean up and return*/ 869 xDelete<IssmDouble>(basis); 870 xDelete<IssmDouble>(xyz_list); 871 delete gauss; 872 return pe; 873 }/*}}}*/ 874 ElementVector* StressbalanceAnalysis::CreatePVectorHOFront(Element* element){/*{{{*/ 875 876 return NULL; 817 877 }/*}}}*/ 818 878 ElementVector* StressbalanceAnalysis::CreatePVectorSSA(Element* element){/*{{{*/ … … 849 909 850 910 /*Intermediaries */ 851 int i; 852 IssmDouble driving_stress_baseline,thickness; 853 IssmDouble Jdet; 854 IssmDouble slope[2]; 855 IssmDouble* xyz_list = NULL; 911 IssmDouble thickness,Jdet,slope[2]; 912 IssmDouble* xyz_list = NULL; 856 913 857 914 /*Fetch number of nodes and dof for this finite element*/ 858 915 int numnodes = element->GetNumberOfNodes(); 859 IssmDouble* icefrontlevel= xNew<IssmDouble>(numnodes);860 916 861 917 /*Initialize Element vector and vectors*/ … … 865 921 /*Retrieve all inputs and parameters*/ 866 922 element->GetVerticesCoordinates(&xyz_list); 867 Input* thickness_input=element->GetInput(ThicknessEnum); _assert_(thickness_input); 868 Input* surface_input =element->GetInput(SurfaceEnum); _assert_(surface_input); 869 Input* drag_input =element->GetInput(FrictionCoefficientEnum);_assert_(drag_input); 870 element->GetInputListOnVertices(icefrontlevel,BedEnum); 923 Input* thickness_input=element->GetInput(ThicknessEnum); _assert_(thickness_input); 924 Input* surface_input =element->GetInput(SurfaceEnum); _assert_(surface_input); 925 IssmDouble rhog = element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum); 871 926 872 927 /* Start looping on the number of gaussian points: */ … … 881 936 thickness_input->GetInputValue(&thickness,gauss); 882 937 surface_input->GetInputDerivativeValue(&slope[0],xyz_list,gauss); 883 driving_stress_baseline=element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum)*thickness; 884 885 /*Build load vector: */ 886 for(i=0;i<numnodes;i++){ 887 pe->values[i*2+0]+=-driving_stress_baseline*slope[0]*Jdet*gauss->weight*basis[i]; 888 pe->values[i*2+1]+=-driving_stress_baseline*slope[1]*Jdet*gauss->weight*basis[i]; 938 939 for(int i=0;i<numnodes;i++){ 940 pe->values[i*2+0]+=-rhog*thickness*slope[0]*Jdet*gauss->weight*basis[i]; 941 pe->values[i*2+1]+=-rhog*thickness*slope[1]*Jdet*gauss->weight*basis[i]; 889 942 } 890 943 } … … 894 947 895 948 /*Clean up and return*/ 949 xDelete<IssmDouble>(xyz_list); 896 950 xDelete<IssmDouble>(basis); 897 951 delete gauss; -
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
r16799 r16804 23 23 ElementMatrix* CreateKMatrix(Element* element); 24 24 ElementVector* CreatePVector(Element* element); 25 ElementVector* CreatePVectorHO(Element* element); 26 ElementVector* CreatePVectorHODrivingStress(Element* element); 27 ElementVector* CreatePVectorHOFront(Element* element); 25 28 ElementVector* CreatePVectorSSA(Element* element); 26 29 ElementVector* CreatePVectorSSADrivingStress(Element* element); -
issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.cpp
r16803 r16804 115 115 /*Intermediaries*/ 116 116 int approximation; 117 IssmDouble Jdet; 118 IssmDouble dudx,dvdy,dwdz; 117 IssmDouble Jdet,dudx,dvdy,dwdz; 119 118 IssmDouble du[3],dv[3],dw[3]; 120 119 IssmDouble* xyz_list = NULL; … … 167 166 168 167 /*Intermediaries */ 169 int i,j,approximation;168 int approximation; 170 169 IssmDouble *xyz_list = NULL; 171 170 IssmDouble *xyz_list_base = NULL; 172 IssmDouble Jdet; 173 IssmDouble vx,vy,vz,dbdx,dbdy,basalmeltingvalue; 174 IssmDouble slope[3]; 171 IssmDouble Jdet,slope[3]; 172 IssmDouble vx,vy,vz=0.,dbdx,dbdy,basalmeltingvalue; 175 173 176 174 if(!element->IsOnBed()) return NULL; … … 208 206 vzFS_input->GetInputValue(&vz,gauss); 209 207 } 210 else vz=0.;211 212 208 dbdx=slope[0]; 213 209 dbdy=slope[1]; … … 216 212 element->NodalFunctions(basis,gauss); 217 213 218 for(i =0;i<numnodes;i++) pe->values[i]+=-Jdet*gauss->weight*(vx*dbdx+vy*dbdy-vz-basalmeltingvalue)*basis[i];214 for(int i=0;i<numnodes;i++) pe->values[i]+=-Jdet*gauss->weight*(vx*dbdx+vy*dbdy-vz-basalmeltingvalue)*basis[i]; 219 215 } 220 216 … … 225 221 xDelete<IssmDouble>(xyz_list_base); 226 222 return pe; 227 228 223 }/*}}}*/ 229 224 void StressbalanceVerticalAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
Note:
See TracChangeset
for help on using the changeset viewer.