Changeset 16907
- Timestamp:
- 11/23/13 19:32:10 (11 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
r16906 r16907 826 826 case FSApproximationEnum: 827 827 return CreateKMatrixFS(element); 828 case SSAHOApproximationEnum: 829 return CreateKMatrixSSAHO(element); 828 830 case NoneApproximationEnum: 829 831 return NULL; … … 847 849 case FSApproximationEnum: 848 850 return CreatePVectorFS(element); 851 case SSAHOApproximationEnum: 852 return CreatePVectorSSAHO(element); 849 853 case NoneApproximationEnum: 850 854 return NULL; … … 3059 3063 3060 3064 /*Coupling (Tiling)*/ 3065 ElementMatrix* StressbalanceAnalysis::CreateKMatrixSSAHO(Element* element){/*{{{*/ 3066 3067 /*compute all stiffness matrices for this element*/ 3068 ElementMatrix* Ke1=CreateKMatrixSSA(element); 3069 ElementMatrix* Ke2=CreateKMatrixHO(element); 3070 ElementMatrix* Ke3=CreateKMatrixCouplingSSAHO(element); 3071 ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2,Ke3); 3072 3073 /*clean-up and return*/ 3074 delete Ke1; 3075 delete Ke2; 3076 delete Ke3; 3077 return Ke; 3078 }/*}}}*/ 3079 ElementMatrix* StressbalanceAnalysis::CreateKMatrixCouplingSSAHO(Element* element){/*{{{*/ 3080 3081 /*compute all stiffness matrices for this element*/ 3082 ElementMatrix* Ke1=CreateKMatrixCouplingSSAHOViscous(element); 3083 ElementMatrix* Ke2=CreateKMatrixCouplingSSAHOFriction(element); 3084 ElementMatrix* Ke=new ElementMatrix(Ke1,Ke2); 3085 3086 /*clean-up and return*/ 3087 delete Ke1; 3088 delete Ke2; 3089 return Ke; 3090 }/*}}}*/ 3091 ElementMatrix* StressbalanceAnalysis::CreateKMatrixCouplingSSAHOFriction(Element* element){/*{{{*/ 3092 return NULL; 3093 3094 }/*}}}*/ 3095 ElementMatrix* StressbalanceAnalysis::CreateKMatrixCouplingSSAHOViscous(Element* element){/*{{{*/ 3096 3097 /*Constants*/ 3098 int numnodes = 2*element->GetNumberOfNodes(); 3099 int numdofm = 1 *numnodes; //*2/2 3100 int numdofp = 2 *numnodes; 3101 int numdoftotal = 2 *2 *numnodes;//2 dof per nodes and 2 sets of nodes for HO and SSA 3102 3103 /*Intermediaries */ 3104 int i,j; 3105 IssmDouble Jdet,viscosity,oldviscosity,newviscosity,viscosity_overshoot; //viscosity 3106 IssmDouble *xyz_list = NULL; 3107 IssmDouble* B = xNew<IssmDouble>(3*numdofp); 3108 IssmDouble* Bprime = xNew<IssmDouble>(3*numdofm); 3109 IssmDouble D[3][3]={0.0}; // material matrix, simple scalar matrix. 3110 IssmDouble D_scalar; 3111 IssmDouble* Ke_gg = xNewZeroInit<IssmDouble>(numdofp*numdofm); 3112 IssmDouble* Ke_gg_gaussian = xNew<IssmDouble>(numdofp*numdofm); 3113 Node *node_list[numnodes]; 3114 int cs_list[numnodes]; 3115 3116 /*Find penta on bed as HO must be coupled to the dofs on the bed: */ 3117 Element* pentabase=element->GetBasalElement(); 3118 Element* basaltria=pentabase->SpawnBasalElement(); 3119 3120 /*prepare node list*/ 3121 for(i=0;i<numnodes;i++){ 3122 node_list[i+0*numnodes] = pentabase->GetNode(i); 3123 node_list[i+1*numnodes] = element ->GetNode(i); 3124 cs_list[i+0*numnodes] = XYEnum; 3125 cs_list[i+1*numnodes] = XYEnum; 3126 } 3127 3128 /*Initialize Element matrix*/ 3129 ElementMatrix* Ke1= pentabase->NewElementMatrix(SSAApproximationEnum); 3130 ElementMatrix* Ke2= element ->NewElementMatrix(HOApproximationEnum); 3131 ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2); 3132 delete Ke1; delete Ke2; 3133 3134 /* Get node coordinates and dof list: */ 3135 element->GetVerticesCoordinates(&xyz_list); 3136 element->FindParam(&viscosity_overshoot,StressbalanceViscosityOvershootEnum); 3137 Input* vx_input =element->GetInput(VxEnum); _assert_(vx_input); 3138 Input* vy_input =element->GetInput(VyEnum); _assert_(vy_input); 3139 Input* vxold_input=element->GetInput(VxPicardEnum); _assert_(vxold_input); 3140 Input* vyold_input=element->GetInput(VyPicardEnum); _assert_(vyold_input); 3141 3142 /* Start looping on the number of gaussian points: */ 3143 Gauss* gauss=element->NewGauss(5); 3144 Gauss* gauss_tria=new GaussTria(); 3145 for(int ig=gauss->begin();ig<gauss->end();ig++){ 3146 3147 gauss->GaussPoint(ig); 3148 gauss->SynchronizeGaussBase(gauss_tria); 3149 3150 element->JacobianDeterminant(&Jdet, xyz_list,gauss); 3151 this->GetBSSAHO(B, element,xyz_list, gauss); 3152 //basaltria->GetBprimeSSA(Bprime, xyz_list, gauss_tria); /FIXME 3153 this->GetBSSAprime(Bprime, basaltria,xyz_list, gauss_tria); 3154 element->ViscosityHO(&viscosity,xyz_list,gauss,vx_input,vy_input); 3155 element->ViscosityHO(&oldviscosity,xyz_list,gauss,vxold_input,vyold_input); 3156 3157 newviscosity=viscosity+viscosity_overshoot*(viscosity-oldviscosity); 3158 D_scalar=2*newviscosity*gauss->weight*Jdet; 3159 for (i=0;i<3;i++) D[i][i]=D_scalar; 3160 3161 TripleMultiply( B,3,numdofp,1, 3162 &D[0][0],3,3,0, 3163 Bprime,3,numdofm,0, 3164 Ke_gg_gaussian,0); 3165 3166 for( i=0; i<numdofp; i++) for(j=0;j<numdofm; j++) Ke_gg[i*numdofp+j]+=Ke_gg_gaussian[i*numdofp+j]; 3167 } 3168 for(i=0;i<numdofp;i++) for(j=0;j<numdofm;j++) Ke->values[(i+2*numdofm)*numdoftotal+j]+=Ke_gg[i*numdofp+j]; 3169 for(i=0;i<numdofm;i++) for(j=0;j<numdofp;j++) Ke->values[i*numdoftotal+(j+2*numdofm)]+=Ke_gg[j*numdofp+i]; 3170 3171 /*Transform Coordinate System*/ 3172 element->TransformStiffnessMatrixCoord(Ke,node_list,numnodes,cs_list); 3173 3174 /*Clean-up and return*/ 3175 basaltria->DeleteMaterials(); delete basaltria; 3176 delete gauss; 3177 delete gauss_tria; 3178 return Ke; 3179 3180 }/*}}}*/ 3181 ElementVector* StressbalanceAnalysis::CreatePVectorSSAHO(Element* element){/*{{{*/ 3182 3183 /*compute all load vectors for this element*/ 3184 ElementVector* pe1=CreatePVectorSSA(element); 3185 ElementVector* pe2=CreatePVectorHO(element); 3186 ElementVector* pe =new ElementVector(pe1,pe2); 3187 3188 /*clean-up and return*/ 3189 delete pe1; 3190 delete pe2; 3191 return pe; 3192 }/*}}}*/ 3193 void StressbalanceAnalysis::GetBSSAHO(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/ 3194 /*Compute B matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 3*NDOF2. 3195 * For node i, Bi can be expressed in the actual coordinate system 3196 * by: 3197 * Bi=[ dh/dx 0 ] 3198 * [ 0 dh/dy ] 3199 * [ 1/2*dh/dy 1/2*dh/dx ] 3200 * where h is the interpolation function for node i. 3201 * 3202 * We assume B has been allocated already, of size: 5x(NDOF2*NUMNODESP1) 3203 */ 3204 3205 int numnodes = element->GetNumberOfNodes(); 3206 IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes); 3207 3208 /*Get dbasis in actual coordinate system: */ 3209 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 3210 3211 /*Build B: */ 3212 for(int i=0;i<numnodes;i++){ 3213 B[2*numnodes*0+2*i+0] = dbasis[0*3+i]; 3214 B[2*numnodes*0+2*i+1] = 0.; 3215 B[2*numnodes*1+2*i+0] = 0.; 3216 B[2*numnodes*1+2*i+1] = dbasis[1*3+i]; 3217 B[2*numnodes*2+2*i+0] = .5*dbasis[1*3+i]; 3218 B[2*numnodes*2+2*i+1] = .5*dbasis[0*3+i]; 3219 } 3220 3221 /*Clean-up*/ 3222 xDelete<IssmDouble>(dbasis); 3223 }/*}}}*/ 3061 3224 void StressbalanceAnalysis::InputUpdateFromSolutionHOFS(IssmDouble* solution,Element* element){/*{{{*/ 3062 3225 -
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
r16892 r16907 71 71 void InputUpdateFromSolutionFS(IssmDouble* solution,Element* element); 72 72 /*Coupling*/ 73 ElementMatrix* CreateKMatrixSSAHO(Element* element); 74 ElementMatrix* CreateKMatrixCouplingSSAHO(Element* element); 75 ElementMatrix* CreateKMatrixCouplingSSAHOFriction(Element* element); 76 ElementMatrix* CreateKMatrixCouplingSSAHOViscous(Element* element); 77 ElementVector* CreatePVectorSSAHO(Element* element); 78 void GetBSSAHO(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss); 73 79 void InputUpdateFromSolutionHOFS(IssmDouble* solution,Element* element); 74 80 void InputUpdateFromSolutionSSAFS(IssmDouble* solution,Element* element); -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r16892 r16907 84 84 virtual void TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int transformenum)=0; 85 85 virtual void TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int* transformenum_list)=0; 86 virtual void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes_list,int numnodes,int* transformenum_list)=0; 86 87 virtual Element* GetBasalElement(void)=0; 87 88 virtual void GetDofList(int** pdoflist,int approximation_enum,int setenum)=0; … … 120 121 virtual void GetInputValue(IssmDouble* pvalue,int enum_type)=0; 121 122 virtual void GetInputValue(IssmDouble* pvalue,Gauss* gauss,int enum_type)=0; 123 virtual Node* GetNode(int node_number)=0; 122 124 virtual void GetVerticesCoordinates(IssmDouble** xyz_list)=0; 123 125 virtual void GetVerticesCoordinatesBase(IssmDouble** xyz_list)=0; -
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r16899 r16907 1326 1326 } 1327 1327 /*}}}*/ 1328 /*FUNCTION Penta::GetNode(int node_number) {{{*/ 1329 Node* Penta::GetNode(int node_number){ 1330 return this->nodes[node_number]; 1331 } 1332 /*}}}*/ 1328 1333 /*FUNCTION Penta::GetMaterialInput(int inputenum) {{{*/ 1329 1334 Input* Penta::GetMaterialInput(int inputenum){ … … 3229 3234 3230 3235 ::TransformStiffnessMatrixCoord(Ke,this->nodes,this->NumberofNodes(),transformenum_list); 3236 3237 } 3238 /*}}}*/ 3239 /*FUNCTION Penta::TransformStiffnessMatrixCoord(ElementMatrix* pe,Node** nodes_list,int numnodesint* transformenum_list){{{*/ 3240 void Penta::TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes_list,int numnodes,int* transformenum_list){ 3241 3242 ::TransformStiffnessMatrixCoord(Ke,nodes_list,numnodes,transformenum_list); 3231 3243 3232 3244 } -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r16892 r16907 244 244 void GetInputValue(IssmDouble* pvalue,Gauss* gauss,int enum_type); 245 245 void GetMaterialInputValue(IssmDouble* pvalue,Node* node,int enumtype); 246 Node* GetNode(int node_number); 246 247 void GetPhi(IssmDouble* phi, IssmDouble* epsilon, IssmDouble viscosity); 247 248 void GetStrainRate3dHO(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss, Input* vx_input, Input* vy_input); … … 295 296 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int transformenum){_error_("not implemented yet");}; 296 297 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int* transformenum_list){_error_("not implemented yet");}; 298 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes_list,int numnodes,int* transformenum_list); 297 299 void ViscosityFS(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input); 298 300 void ViscosityHO(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input); -
issm/trunk-jpl/src/c/classes/Elements/Seg.h
r16892 r16907 155 155 void GetInputValue(IssmDouble* pvalue,Gauss* gauss,int enum_type){_error_("not implemented yet");}; 156 156 void GetMaterialInputValue(IssmDouble* pvalue,Node* node,int enumtype){_error_("not implemented yet");}; 157 Node* GetNode(int node_number){_error_("Not implemented");}; 157 158 IssmDouble GetYcoord(Gauss* gauss){_error_("Not implemented");}; 158 159 IssmDouble GetZcoord(Gauss* gauss){_error_("not implemented yet");}; … … 226 227 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int transformenum){_error_("not implemented yet");}; 227 228 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int* transformenum_list){_error_("not implemented yet");}; 229 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes_list,int numnodes,int* transformenum_list){_error_("not implemented yet");}; 228 230 void UpdateConstraintsExtrudeFromBase(){_error_("not implemented");}; 229 231 void UpdateConstraintsExtrudeFromTop(){_error_("not implemented");}; -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r16892 r16907 286 286 void GetInputValue(IssmDouble* pvalue,Gauss* gauss,int enum_type); 287 287 void GetMaterialInputValue(IssmDouble* pvalue,Node* node,int enumtype); 288 Node* GetNode(int node_number){_error_("not implemented yet");}; 288 289 void InputChangeName(int enum_type,int enum_type_old); 289 290 void InputUpdateFromSolutionOneDof(IssmDouble* solution,int enum_type); … … 326 327 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int transformenum){_error_("not implemented yet");}; 327 328 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int* transformenum_list){_error_("not implemented yet");}; 329 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes_list,int numnodes,int* transformenum_list){_error_("not implemented yet");}; 328 330 void ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){_error_("not implemented yet");}; 329 331 void ViscosityFS(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
Note:
See TracChangeset
for help on using the changeset viewer.