Changeset 16875
- Timestamp:
- 11/21/13 19:51:14 (12 years ago)
- Location:
- issm/trunk-jpl/src/c/analyses
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp
r16865 r16875 96 96 /*Finite Element Analysis*/ 97 97 ElementMatrix* DamageEvolutionAnalysis::CreateKMatrix(Element* element){/*{{{*/ 98 _error_("not implemented yet");99 }/*}}}*/100 ElementVector* DamageEvolutionAnalysis::CreatePVector(Element* element){/*{{{*/101 98 102 99 /*Intermediaries*/ … … 118 115 119 116 /*Intermediaries */ 117 int stabilization; 118 IssmDouble Jdet,dt,D_scalar; 119 IssmDouble vel,vx,vy,dvxdx,dvydy,dvx[2],dvy[2]; 120 IssmDouble *xyz_list = NULL; 121 122 /*Fetch number of nodes and dof for this finite element*/ 123 int numnodes = basalelement->GetNumberOfNodes(); 124 125 /*Initialize Element vector*/ 126 ElementMatrix* Ke = basalelement->NewElementMatrix(NoneApproximationEnum); 127 IssmDouble* basis = xNew<IssmDouble>(numnodes); 128 IssmDouble* B = xNew<IssmDouble>(2*numnodes); 129 IssmDouble* Bprime = xNew<IssmDouble>(2*numnodes); 130 IssmDouble D[2][2]={0.}; 131 132 /*Retrieve all inputs and parameters*/ 133 basalelement->GetVerticesCoordinates(&xyz_list); 134 basalelement->FindParam(&dt,TimesteppingTimeStepEnum); 135 basalelement->FindParam(&stabilization,DamageStabilizationEnum); 136 Input* vxaverage_input=NULL; 137 Input* vyaverage_input=NULL; 138 if(meshtype==Mesh2DhorizontalEnum){ 139 vxaverage_input=basalelement->GetInput(VxEnum); _assert_(vxaverage_input); 140 vyaverage_input=basalelement->GetInput(VyEnum); _assert_(vyaverage_input); 141 } 142 else{ 143 vxaverage_input=basalelement->GetInput(VxAverageEnum); _assert_(vxaverage_input); 144 vyaverage_input=basalelement->GetInput(VyAverageEnum); _assert_(vyaverage_input); 145 } 146 IssmDouble h=basalelement->CharacteristicLength(); 147 148 /* Start looping on the number of gaussian points: */ 149 Gauss* gauss=basalelement->NewGauss(2); 150 for(int ig=gauss->begin();ig<gauss->end();ig++){ 151 gauss->GaussPoint(ig); 152 153 basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss); 154 basalelement->NodalFunctions(basis,gauss); 155 D_scalar=gauss->weight*Jdet; 156 157 vxaverage_input->GetInputValue(&vx,gauss); 158 vyaverage_input->GetInputValue(&vy,gauss); 159 vxaverage_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss); 160 vyaverage_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss); 161 162 TripleMultiply(basis,1,numnodes,1, 163 &D_scalar,1,1,0, 164 basis,1,numnodes,0, 165 &Ke->values[0],1); 166 167 GetB(B,element,xyz_list,gauss); 168 GetBprime(Bprime,element,xyz_list,gauss); 169 170 dvxdx=dvx[0]; 171 dvydy=dvy[1]; 172 D_scalar=dt*gauss->weight*Jdet; 173 174 D[0][0]=D_scalar*dvxdx; 175 D[1][1]=D_scalar*dvydy; 176 TripleMultiply(B,2,numnodes,1, 177 &D[0][0],2,2,0, 178 B,2,numnodes,0, 179 &Ke->values[0],1); 180 181 D[0][0]=D_scalar*vx; 182 D[1][1]=D_scalar*vy; 183 TripleMultiply(B,2,numnodes,1, 184 &D[0][0],2,2,0, 185 Bprime,2,numnodes,0, 186 &Ke->values[0],1); 187 188 if(stabilization==2){ 189 /*Streamline upwinding*/ 190 vel=sqrt(vx*vx+vy*vy)+1.e-8; 191 D[0][0]=h/(2*vel)*vx*vx; 192 D[1][0]=h/(2*vel)*vy*vx; 193 D[0][1]=h/(2*vel)*vx*vy; 194 D[1][1]=h/(2*vel)*vy*vy; 195 } 196 else if(stabilization==1){ 197 /*SSA*/ 198 vxaverage_input->GetInputAverage(&vx); 199 vyaverage_input->GetInputAverage(&vy); 200 D[0][0]=h/2.0*fabs(vx); 201 D[0][1]=0.; 202 D[1][0]=0.; 203 D[1][1]=h/2.0*fabs(vy); 204 } 205 if(stabilization==1 || stabilization==2){ 206 D[0][0]=D_scalar*D[0][0]; 207 D[1][0]=D_scalar*D[1][0]; 208 D[0][1]=D_scalar*D[0][1]; 209 D[1][1]=D_scalar*D[1][1]; 210 TripleMultiply(Bprime,2,numnodes,1, 211 &D[0][0],2,2,0, 212 Bprime,2,numnodes,0, 213 &Ke->values[0],1); 214 } 215 216 } 217 218 /*Clean up and return*/ 219 xDelete<IssmDouble>(xyz_list); 220 xDelete<IssmDouble>(basis); 221 xDelete<IssmDouble>(B); 222 xDelete<IssmDouble>(Bprime); 223 delete gauss; 224 if(meshtype!=Mesh2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 225 return Ke; 226 }/*}}}*/ 227 ElementVector* DamageEvolutionAnalysis::CreatePVector(Element* element){/*{{{*/ 228 229 /*Intermediaries*/ 230 int meshtype; 231 Element* basalelement; 232 233 /*Get basal element*/ 234 element->FindParam(&meshtype,MeshTypeEnum); 235 switch(meshtype){ 236 case Mesh2DhorizontalEnum: 237 basalelement = element; 238 break; 239 case Mesh3DEnum: 240 if(!element->IsOnBed()) return NULL; 241 basalelement = element->SpawnBasalElement(); 242 break; 243 default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet"); 244 } 245 246 /*Intermediaries */ 120 247 IssmDouble Jdet,dt; 121 248 IssmDouble f,damage; … … 156 283 delete gauss; 157 284 return pe; 285 }/*}}}*/ 286 void DamageEvolutionAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/ 287 /*Compute B matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 288 * For node i, Bi can be expressed in the actual coordinate system 289 * by: 290 * Bi=[ N ] 291 * [ N ] 292 * where N is the finiteelement function for node i. 293 * 294 * We assume B_prog has been allocated already, of size: 2x(NDOF1*numnodes) 295 */ 296 297 /*Fetch number of nodes for this finite element*/ 298 int numnodes = element->GetNumberOfNodes(); 299 300 /*Get nodal functions*/ 301 IssmDouble* basis=xNew<IssmDouble>(numnodes); 302 element->NodalFunctions(basis,gauss); 303 304 /*Build B: */ 305 for(int i=0;i<numnodes;i++){ 306 B[numnodes*0+i] = basis[i]; 307 B[numnodes*1+i] = basis[i]; 308 } 309 310 /*Clean-up*/ 311 xDelete<IssmDouble>(basis); 312 }/*}}}*/ 313 void DamageEvolutionAnalysis::GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/ 314 /*Compute B' matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2. 315 * For node i, Bi' can be expressed in the actual coordinate system 316 * by: 317 * Bi_prime=[ dN/dx ] 318 * [ dN/dy ] 319 * where N is the finiteelement function for node i. 320 * 321 * We assume B' has been allocated already, of size: 3x(NDOF2*numnodes) 322 */ 323 324 /*Fetch number of nodes for this finite element*/ 325 int numnodes = element->GetNumberOfNodes(); 326 327 /*Get nodal functions derivatives*/ 328 IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes); 329 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 330 331 /*Build B': */ 332 for(int i=0;i<numnodes;i++){ 333 Bprime[numnodes*0+i] = dbasis[0*numnodes+i]; 334 Bprime[numnodes*1+i] = dbasis[1*numnodes+i]; 335 } 336 337 /*Clean-up*/ 338 xDelete<IssmDouble>(dbasis); 339 158 340 }/*}}}*/ 159 341 void DamageEvolutionAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/ -
issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.h
r16848 r16875 23 23 ElementMatrix* CreateKMatrix(Element* element); 24 24 ElementVector* CreatePVector(Element* element); 25 void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss); 26 void GetBprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss); 25 27 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 26 28 void InputUpdateFromSolution(IssmDouble* solution,Element* element);
Note:
See TracChangeset
for help on using the changeset viewer.