source:
issm/oecreview/Archive/16554-17801/ISSM-16908-16909.diff@
17802
Last change on this file since 17802 was 17802, checked in by , 11 years ago | |
---|---|
File size: 4.0 KB |
-
../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
3089 3089 return Ke; 3090 3090 }/*}}}*/ 3091 3091 ElementMatrix* StressbalanceAnalysis::CreateKMatrixCouplingSSAHOFriction(Element* element){/*{{{*/ 3092 return NULL;3093 3092 3093 if(element->IsFloating() || !element->IsOnBed()) return NULL; 3094 3095 /*Constants*/ 3096 int numnodes = element->GetNumberOfNodes(); 3097 int numdof = 2*numnodes; 3098 int numdoftotal = 4*numnodes; 3099 3100 /*Intermediaries */ 3101 int i,j; 3102 IssmDouble Jdet2d,alpha2; 3103 IssmDouble *xyz_list_tria=NULL; 3104 IssmDouble* L = xNewZeroInit<IssmDouble>(2*numdof); 3105 IssmDouble DL[2][2] ={{ 0,0 },{0,0}}; //for basal drag 3106 IssmDouble DL_scalar; 3107 IssmDouble* Ke_gg = xNewZeroInit<IssmDouble>(numdof*numdof); 3108 Node *node_list[2*numnodes]; 3109 int* cs_list= xNew<int>(2*numnodes); 3110 3111 /*Initialize Element matrix and return if necessary*/ 3112 ElementMatrix* Ke1=element->NewElementMatrix(SSAApproximationEnum); 3113 ElementMatrix* Ke2=element->NewElementMatrix(HOApproximationEnum); 3114 ElementMatrix* Ke=new ElementMatrix(Ke1,Ke2); 3115 delete Ke1; delete Ke2; 3116 3117 /*Prepare node list*/ 3118 for(i=0;i<numnodes;i++){ 3119 node_list[i+0*numnodes] = element->GetNode(i); 3120 node_list[i+1*numnodes] = element->GetNode(i); 3121 cs_list[i+0*numnodes] = XYEnum; 3122 cs_list[i+1*numnodes] = XYEnum; 3123 } 3124 3125 /*retrieve inputs :*/ 3126 element->GetVerticesCoordinatesBase(&xyz_list_tria); 3127 Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input); 3128 Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input); 3129 Input* vz_input=element->GetInput(VzEnum); _assert_(vz_input); 3130 3131 /*build friction object, used later on: */ 3132 Friction* friction=new Friction(element,2); 3133 3134 /* Start looping on the number of gaussian points: */ 3135 Gauss* gauss=element->NewGaussBase(2); 3136 for(int ig=gauss->begin();ig<gauss->end();ig++){ 3137 3138 gauss->GaussPoint(ig); 3139 3140 /*Friction: */ 3141 friction->GetAlpha2(&alpha2,gauss,vx_input,vy_input,vz_input); 3142 element->JacobianDeterminantBase(&Jdet2d, xyz_list_tria,gauss); 3143 this->GetBHOFriction(L,element,xyz_list_tria,gauss); 3144 3145 DL_scalar=alpha2*gauss->weight*Jdet2d; 3146 for (i=0;i<2;i++) DL[i][i]=DL_scalar; 3147 3148 /* Do the triple producte tL*D*L: */ 3149 TripleMultiply( L,2,numdof,1, 3150 &DL[0][0],2,2,0, 3151 L,2,numdof,0, 3152 Ke_gg,1); 3153 } 3154 3155 for(i=0;i<numdof;i++) for(j=0;j<numdof;j++) Ke->values[i*numdoftotal+(numdof+j)]+=Ke_gg[i*numdof+j]; 3156 for(i=0;i<numdof;i++) for(j=0;j<numdof;j++) Ke->values[(i+numdof)*numdoftotal+j]+=Ke_gg[i*numdof+j]; 3157 3158 /*Transform Coordinate System*/ 3159 element->TransformStiffnessMatrixCoord(Ke,node_list,2*numnodes,cs_list); 3160 3161 /*Clean up and return*/ 3162 delete gauss; 3163 delete friction; 3164 xDelete<int>(cs_list); 3165 xDelete<IssmDouble>(xyz_list_tria); 3166 xDelete<IssmDouble>(Ke_gg); 3167 return Ke; 3094 3168 }/*}}}*/ 3095 3169 ElementMatrix* StressbalanceAnalysis::CreateKMatrixCouplingSSAHOViscous(Element* element){/*{{{*/ 3096 3170 … … 3109 3183 IssmDouble D[3][3]={0.0}; // material matrix, simple scalar matrix. 3110 3184 IssmDouble D_scalar; 3111 3185 IssmDouble* Ke_gg = xNewZeroInit<IssmDouble>(numdofp*numdofm); 3112 IssmDouble* Ke_gg_gaussian = xNew<IssmDouble>(numdofp*numdofm);3113 3186 Node *node_list[2*numnodes]; 3114 3187 int* cs_list= xNew<int>(2*numnodes); 3115 3188 … … 3160 3233 TripleMultiply( B,3,numdofp,1, 3161 3234 &D[0][0],3,3,0, 3162 3235 Bprime,3,numdofm,0, 3163 Ke_gg_gaussian,0); 3164 3165 for( i=0; i<numdofp; i++) for(j=0;j<numdofm; j++) Ke_gg[i*numdofm+j]+=Ke_gg_gaussian[i*numdofm+j]; 3236 Ke_gg,1); 3166 3237 } 3167 3238 for(i=0;i<numdofp;i++) for(j=0;j<numdofm;j++) Ke->values[(i+2*numdofm)*numdoftotal+j]+=Ke_gg[i*numdofm+j]; 3168 3239 for(i=0;i<numdofm;i++) for(j=0;j<numdofp;j++) Ke->values[i*numdoftotal+(j+2*numdofm)]+=Ke_gg[j*numdofm+i]; … … 3176 3247 delete gauss; 3177 3248 delete gauss_tria; 3178 3249 xDelete<IssmDouble>(Ke_gg); 3179 xDelete<IssmDouble>( Ke_gg_gaussian);3250 xDelete<IssmDouble>(xyz_list); 3180 3251 xDelete<int>(cs_list); 3181 3252 return Ke; 3182 3253
Note:
See TracBrowser
for help on using the repository browser.