Changeset 26989
- Timestamp:
- 05/05/22 05:52:29 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp
r26478 r26989 226 226 227 227 /*Intermediaries */ 228 bool incomplete_adjoint;229 228 IssmDouble Jdet,mu_prime,n,thickness,mu,effmu; 230 229 IssmDouble *xyz_list = NULL; … … 238 237 IssmDouble vxshear, vyshear; 239 238 240 Element* basalelement; 239 /*Get basal element*/ 240 Element* basalelement = NULL; 241 element->FindParam(&domaintype,DomainTypeEnum); 242 switch(domaintype){ 243 case Domain2DhorizontalEnum: 244 basalelement = element; 245 break; 246 case Domain3DEnum: case Domain2DverticalEnum: 247 _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet"); 248 break; 249 default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet"); 250 } 251 252 /*Initialize Jacobian with regular HO (first part of the Gateau derivative)*/ 253 bool incomplete_adjoint; 254 element->FindParam(&incomplete_adjoint,InversionIncompleteAdjointEnum); 255 StressbalanceAnalysis* analysis = new StressbalanceAnalysis(); 256 ElementMatrix* Ke=analysis->CreateKMatrix(basalelement); 257 delete analysis; 258 if(incomplete_adjoint) return Ke; 259 260 /*Second part of the Gateau derivative if requested*/ 261 262 /*Fetch number of nodes and dof for this finite element*/ 263 int numnodes = basalelement->GetNumberOfNodes(); 264 IssmDouble* dbasis = xNew<IssmDouble>(2*numnodes); // like SSA 265 IssmDouble* basis = xNew<IssmDouble>(numnodes); // like SSA 266 267 /*Retrieve all inputs and parameters*/ 268 element->GetVerticesCoordinates(&xyz_list); 269 Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); //vertically integrated vx 270 Input* vy_input = element->GetInput(VyEnum); _assert_(vy_input); //vertically integrated vy 271 Input* vxbase_input = element->GetInput(VxBaseEnum); _assert_(vxbase_input); 272 Input* vybase_input = element->GetInput(VyBaseEnum); _assert_(vybase_input); 273 Input* vxshear_input = element->GetInput(VxShearEnum); _assert_(vxshear_input); 274 Input* vyshear_input = element->GetInput(VyShearEnum); _assert_(vyshear_input); 275 Input* thickness_input= element->GetInput(ThicknessEnum); _assert_(thickness_input); 276 Input* n_input = element->GetInput(MaterialsRheologyNEnum); _assert_(n_input); 277 278 /* Start looping on the number of gaussian points: */ 279 Gauss* gauss = element->NewGauss(5); 280 Gauss* gauss_base = basalelement->NewGauss(); 281 while(gauss->next()){ 282 gauss->SynchronizeGaussBase(gauss_base); 283 284 element->JacobianDeterminant(&Jdet,xyz_list,gauss_base); 285 basalelement->NodalFunctionsDerivatives(dbasis,xyz_list,gauss_base); 286 basalelement->NodalFunctions(basis, gauss_base); 287 288 thickness_input->GetInputValue(&thickness, gauss); 289 n_input->GetInputValue(&n,gauss); 290 291 vxshear_input->GetInputValue(&vxshear,gauss); 292 vyshear_input->GetInputValue(&vyshear,gauss); 293 294 element->material->ViscosityMLHOAdjoint(&viscosity[0],dim,xyz_list,gauss,vxbase_input,vybase_input,vxshear_input,vyshear_input,thickness_input,n_input); 295 296 effmu = 2.0*(1-n)/2.0/n; 297 298 element->StrainRateHO(&epsilonbase[0],xyz_list,gauss,vxbase_input, vybase_input); 299 element->StrainRateHO(&epsilonshear[0],xyz_list,gauss,vxshear_input, vyshear_input); 300 301 e1b[0] = 2*epsilonbase[0]+epsilonbase[1]; e1b[1] = epsilonbase[2]; 302 e2b[1] = epsilonbase[0]+2*epsilonbase[1]; e2b[0] = epsilonbase[2]; 303 304 e1sh[0] = 2*epsilonshear[0]+epsilonshear[1]; e1sh[1] = epsilonshear[2]; 305 e2sh[1] = epsilonshear[0]+2*epsilonshear[1]; e2sh[0] = epsilonshear[2]; 306 307 for(int i=0;i<numnodes;i++){ 308 for(int j=0;j<numnodes;j++){ 309 eb1i = e1b[0]*dbasis[0*numnodes+i]+e1b[1]*dbasis[1*numnodes+i]; 310 eb1j = e1b[0]*dbasis[0*numnodes+j]+e1b[1]*dbasis[1*numnodes+j]; 311 eb2i = e2b[0]*dbasis[0*numnodes+i]+e2b[1]*dbasis[1*numnodes+i]; 312 eb2j = e2b[0]*dbasis[0*numnodes+j]+e2b[1]*dbasis[1*numnodes+j]; 313 esh1i = e1sh[0]*dbasis[0*numnodes+i]+e1sh[1]*dbasis[1*numnodes+i]; 314 esh1j = e1sh[0]*dbasis[0*numnodes+j]+e1sh[1]*dbasis[1*numnodes+j]; 315 esh2i = e2sh[0]*dbasis[0*numnodes+i]+e2sh[1]*dbasis[1*numnodes+i]; 316 esh2j = e2sh[0]*dbasis[0*numnodes+j]+e2sh[1]*dbasis[1*numnodes+j]; 317 318 Ke->values[4*numnodes*(4*i+0)+4*j+0]+=gauss->weight*Jdet*effmu*(viscosity[0]*eb1j*eb1i+viscosity[1]*(esh1j*eb1i+eb1j*esh1i)+viscosity[2]*esh1j*esh1i); 319 Ke->values[4*numnodes*(4*i+1)+4*j+0]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb1j*eb1i+viscosity[2]*(esh1j*eb1i+eb1j*esh1i)+viscosity[4]*esh1j*esh1i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*eb1j*basis[i]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*esh1j*basis[i]); 320 Ke->values[4*numnodes*(4*i+2)+4*j+0]+=gauss->weight*Jdet*effmu*(viscosity[0]*eb1j*eb2i+viscosity[1]*(esh1j*eb2i+eb1j*esh2i)+viscosity[2]*esh1j*esh2i); 321 Ke->values[4*numnodes*(4*i+3)+4*j+0]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb1j*eb2i+viscosity[2]*(esh1j*eb2i+eb1j*esh2i)+viscosity[4]*esh1j*esh2i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*eb1j*basis[i]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*esh1j*basis[i]); 322 323 Ke->values[4*numnodes*(4*i+0)+4*j+1]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb1j*eb1i+viscosity[2]*(esh1j*eb1i+eb1j*esh1i)+viscosity[4]*esh1j*esh1i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*eb1i*basis[j]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*esh1i*basis[j]); 324 Ke->values[4*numnodes*(4*i+1)+4*j+1]+=gauss->weight*Jdet*effmu*(viscosity[2]*eb1j*eb1i+viscosity[4]*(esh1j*eb1i+eb1j*esh1i)+viscosity[5]*esh1j*esh1i+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*(eb1i*basis[j]+eb1j*basis[i])+viscosity[7]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*(esh1i*basis[j]+esh1j*basis[i])+viscosity[8]*(n+1)*(n+1)*(n+1)*(n+1)/4.0/thickness/thickness/thickness/thickness*vxshear*vxshear*basis[j]*basis[i]); 325 Ke->values[4*numnodes*(4*i+2)+4*j+1]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb1j*eb2i+viscosity[2]*(esh1j*eb2i+eb1j*esh2i)+viscosity[4]*esh1j*esh2i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*eb2i*basis[j]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*esh2i*basis[j]); 326 Ke->values[4*numnodes*(4*i+3)+4*j+1]+=gauss->weight*Jdet*effmu*(viscosity[2]*eb1j*eb2i+viscosity[4]*(esh1j*eb2i+eb1j*esh2i)+viscosity[5]*esh1j*esh2i+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*(vxshear*eb2i*basis[j]+vyshear*eb1j*basis[i])+viscosity[7]*(n+1)*(n+1)/2.0/thickness/thickness*(vxshear*esh2i*basis[j]+vyshear*esh1j*basis[i])+viscosity[8]*(n+1)*(n+1)*(n+1)*(n+1)/4.0/thickness/thickness/thickness/thickness*vxshear*vyshear*basis[j]*basis[i]); 327 328 329 Ke->values[4*numnodes*(4*i+0)+4*j+2]+=gauss->weight*Jdet*effmu*(viscosity[0]*eb2j*eb1i+viscosity[1]*(esh2j*eb1i+eb2j*esh1i)+viscosity[2]*esh2j*esh1i); 330 Ke->values[4*numnodes*(4*i+1)+4*j+2]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb2j*eb1i+viscosity[2]*(esh2j*eb1i+eb2j*esh1i)+viscosity[4]*esh2j*esh1i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*eb2j*basis[i]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*esh2j*basis[i]); 331 Ke->values[4*numnodes*(4*i+2)+4*j+2]+=gauss->weight*Jdet*effmu*(viscosity[0]*eb2j*eb2i+viscosity[1]*(esh2j*eb2i+eb2j*esh2i)+viscosity[2]*esh2j*esh2i); 332 Ke->values[4*numnodes*(4*i+3)+4*j+2]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb2j*eb2i+viscosity[2]*(esh2j*eb2i+eb2j*esh2i)+viscosity[4]*esh2j*esh2i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*eb2j*basis[i]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*esh2j*basis[i]); 333 334 335 Ke->values[4*numnodes*(4*i+0)+4*j+3]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb2j*eb1i+viscosity[2]*(esh2j*eb1i+eb2j*esh1i)+viscosity[4]*esh2j*esh1i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*eb1i*basis[j]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*esh1i*basis[j]); 336 Ke->values[4*numnodes*(4*i+1)+4*j+3]+=gauss->weight*Jdet*effmu*(viscosity[2]*eb2j*eb1i+viscosity[4]*(esh2j*eb1i+eb2j*esh1i)+viscosity[5]*esh2j*esh1i+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*(vyshear*eb1i*basis[j]+vxshear*eb2j*basis[i])+viscosity[7]*(n+1)*(n+1)/2.0/thickness/thickness*(vxshear*esh2j*basis[i]+vyshear*esh1i*basis[j])+viscosity[8]*(n+1)*(n+1)*(n+1)*(n+1)/4.0/thickness/thickness/thickness/thickness*vxshear*vxshear*basis[j]*basis[i]); 337 Ke->values[4*numnodes*(4*i+2)+4*j+3]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb2j*eb2i+viscosity[2]*(esh2j*eb2i+eb2j*esh2i)+viscosity[4]*esh2j*esh2i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*eb2i*basis[j]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*esh2i*basis[j]); 338 Ke->values[4*numnodes*(4*i+3)+4*j+3]+=gauss->weight*Jdet*effmu*(viscosity[2]*eb2j*eb2i+viscosity[4]*(esh2j*eb2i+eb2j*esh2i)+viscosity[5]*esh2j*esh2i+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*(eb2i*basis[j]+eb1j*basis[i])+viscosity[7]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*(esh2i*basis[j]+esh1j*basis[i])+viscosity[8]*(n+1)*(n+1)*(n+1)*(n+1)/4.0/thickness/thickness/thickness/thickness*vyshear*vyshear*basis[j]*basis[i]); 339 } 340 } 341 } 342 343 /*Transform Coordinate System*/ 344 /*element->TransformStiffnessMatrixCoord(Ke,XYEnum);*/ 345 346 /*Clean up and return*/ 347 delete gauss; 348 delete gauss_base; 349 if(basalelement->IsSpawnedElement()){basalelement->DeleteMaterials(); delete basalelement;}; 350 xDelete<IssmDouble>(xyz_list); 351 xDelete<IssmDouble>(dbasis); 352 xDelete<IssmDouble>(basis); 353 return Ke; 354 }/*}}}*/ 355 ElementMatrix* AdjointHorizAnalysis::CreateKMatrixMLHOVerticalIntergrated(Element* element){/*{{{*/ 356 357 /* Check if ice in element */ 358 if(!element->IsIceInElement()) return NULL; 359 360 /*Intermediaries */ 361 IssmDouble Jdet,mu_prime,n,thickness,mu,effmu; 362 IssmDouble *xyz_list = NULL; 363 IssmDouble zeta, epsilon_eff; 364 int domaintype; 365 int dim=2; 366 367 IssmDouble e1phi1i, e1phi1j, e2phi1i, e2phi1j, e1phi2i, e1phi2j, e2phi2i, e2phi2j; 368 IssmDouble epsilon[5];/* epsilon=[exx,eyy,exy,exz,eyz];*/ 369 IssmDouble e1[3],e2[3]; 370 371 Element* basalelement = NULL; 241 372 242 373 /*Get basal element*/ … … 251 382 default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet"); 252 383 } 253 /*Fetch number of nodes and dof for this finite element*/254 int numnodes = basalelement->GetNumberOfNodes();255 IssmDouble* dbasis = xNew<IssmDouble>(2*numnodes); // like SSA256 IssmDouble* basis = xNew<IssmDouble>(numnodes); // like SSA257 384 258 385 /*Initialize Jacobian with regular HO (first part of the Gateau derivative)*/ 386 bool incomplete_adjoint; 259 387 element->FindParam(&incomplete_adjoint,InversionIncompleteAdjointEnum); 260 388 StressbalanceAnalysis* analysis = new StressbalanceAnalysis(); … … 263 391 if(incomplete_adjoint) return Ke; 264 392 265 /*Retrieve all inputs and parameters*/ 266 element->GetVerticesCoordinates(&xyz_list); 267 Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); //vertically integrated vx 268 Input* vy_input = element->GetInput(VyEnum); _assert_(vy_input); //vertically integrated vy 269 Input* vxbase_input = element->GetInput(VxBaseEnum); _assert_(vxbase_input); 270 Input* vybase_input = element->GetInput(VyBaseEnum); _assert_(vybase_input); 271 Input* vxshear_input = element->GetInput(VxShearEnum); _assert_(vxshear_input); 272 Input* vyshear_input = element->GetInput(VyShearEnum); _assert_(vyshear_input); 273 Input* thickness_input= element->GetInput(ThicknessEnum); _assert_(thickness_input); 274 Input* n_input = element->GetInput(MaterialsRheologyNEnum); _assert_(n_input); 275 276 /* Start looping on the number of gaussian points: */ 277 Gauss* gauss = element->NewGauss(5); 278 Gauss* gauss_base = basalelement->NewGauss(); 279 while(gauss->next()){ 280 gauss->SynchronizeGaussBase(gauss_base); 281 282 element->JacobianDeterminant(&Jdet,xyz_list,gauss_base); 283 basalelement->NodalFunctionsDerivatives(dbasis,xyz_list,gauss_base); 284 basalelement->NodalFunctions(basis, gauss_base); 285 286 thickness_input->GetInputValue(&thickness, gauss); 287 n_input->GetInputValue(&n,gauss); 288 289 vxshear_input->GetInputValue(&vxshear,gauss); 290 vyshear_input->GetInputValue(&vyshear,gauss); 291 292 element->material->ViscosityMLHOAdjoint(&viscosity[0],dim,xyz_list,gauss,vxbase_input,vybase_input,vxshear_input,vyshear_input,thickness_input,n_input); 293 294 effmu = 2.0*(1-n)/2.0/n; 295 296 element->StrainRateHO(&epsilonbase[0],xyz_list,gauss,vxbase_input, vybase_input); 297 element->StrainRateHO(&epsilonshear[0],xyz_list,gauss,vxshear_input, vyshear_input); 298 299 e1b[0] = 2*epsilonbase[0]+epsilonbase[1]; e1b[1] = epsilonbase[2]; 300 e2b[1] = epsilonbase[0]+2*epsilonbase[1]; e2b[0] = epsilonbase[2]; 301 302 e1sh[0] = 2*epsilonshear[0]+epsilonshear[1]; e1sh[1] = epsilonshear[2]; 303 e2sh[1] = epsilonshear[0]+2*epsilonshear[1]; e2sh[0] = epsilonshear[2]; 304 305 for(int i=0;i<numnodes;i++){ 306 for(int j=0;j<numnodes;j++){ 307 eb1i = e1b[0]*dbasis[0*numnodes+i]+e1b[1]*dbasis[1*numnodes+i]; 308 eb1j = e1b[0]*dbasis[0*numnodes+j]+e1b[1]*dbasis[1*numnodes+j]; 309 eb2i = e2b[0]*dbasis[0*numnodes+i]+e2b[1]*dbasis[1*numnodes+i]; 310 eb2j = e2b[0]*dbasis[0*numnodes+j]+e2b[1]*dbasis[1*numnodes+j]; 311 esh1i = e1sh[0]*dbasis[0*numnodes+i]+e1sh[1]*dbasis[1*numnodes+i]; 312 esh1j = e1sh[0]*dbasis[0*numnodes+j]+e1sh[1]*dbasis[1*numnodes+j]; 313 esh2i = e2sh[0]*dbasis[0*numnodes+i]+e2sh[1]*dbasis[1*numnodes+i]; 314 esh2j = e2sh[0]*dbasis[0*numnodes+j]+e2sh[1]*dbasis[1*numnodes+j]; 315 316 Ke->values[4*numnodes*(4*i+0)+4*j+0]+=gauss->weight*Jdet*effmu*(viscosity[0]*eb1j*eb1i+viscosity[1]*(esh1j*eb1i+eb1j*esh1i)+viscosity[2]*esh1j*esh1i); 317 Ke->values[4*numnodes*(4*i+1)+4*j+0]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb1j*eb1i+viscosity[2]*(esh1j*eb1i+eb1j*esh1i)+viscosity[4]*esh1j*esh1i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*eb1j*basis[i]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*esh1j*basis[i]); 318 Ke->values[4*numnodes*(4*i+2)+4*j+0]+=gauss->weight*Jdet*effmu*(viscosity[0]*eb1j*eb2i+viscosity[1]*(esh1j*eb2i+eb1j*esh2i)+viscosity[2]*esh1j*esh2i); 319 Ke->values[4*numnodes*(4*i+3)+4*j+0]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb1j*eb2i+viscosity[2]*(esh1j*eb2i+eb1j*esh2i)+viscosity[4]*esh1j*esh2i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*eb1j*basis[i]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*esh1j*basis[i]); 320 321 Ke->values[4*numnodes*(4*i+0)+4*j+1]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb1j*eb1i+viscosity[2]*(esh1j*eb1i+eb1j*esh1i)+viscosity[4]*esh1j*esh1i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*eb1i*basis[j]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*esh1i*basis[j]); 322 Ke->values[4*numnodes*(4*i+1)+4*j+1]+=gauss->weight*Jdet*effmu*(viscosity[2]*eb1j*eb1i+viscosity[4]*(esh1j*eb1i+eb1j*esh1i)+viscosity[5]*esh1j*esh1i+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*(eb1i*basis[j]+eb1j*basis[i])+viscosity[7]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*(esh1i*basis[j]+esh1j*basis[i])+viscosity[8]*(n+1)*(n+1)*(n+1)*(n+1)/4.0/thickness/thickness/thickness/thickness*vxshear*vxshear*basis[j]*basis[i]); 323 Ke->values[4*numnodes*(4*i+2)+4*j+1]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb1j*eb2i+viscosity[2]*(esh1j*eb2i+eb1j*esh2i)+viscosity[4]*esh1j*esh2i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*eb2i*basis[j]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*esh2i*basis[j]); 324 Ke->values[4*numnodes*(4*i+3)+4*j+1]+=gauss->weight*Jdet*effmu*(viscosity[2]*eb1j*eb2i+viscosity[4]*(esh1j*eb2i+eb1j*esh2i)+viscosity[5]*esh1j*esh2i+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*(vxshear*eb2i*basis[j]+vyshear*eb1j*basis[i])+viscosity[7]*(n+1)*(n+1)/2.0/thickness/thickness*(vxshear*esh2i*basis[j]+vyshear*esh1j*basis[i])+viscosity[8]*(n+1)*(n+1)*(n+1)*(n+1)/4.0/thickness/thickness/thickness/thickness*vxshear*vyshear*basis[j]*basis[i]); 325 326 327 Ke->values[4*numnodes*(4*i+0)+4*j+2]+=gauss->weight*Jdet*effmu*(viscosity[0]*eb2j*eb1i+viscosity[1]*(esh2j*eb1i+eb2j*esh1i)+viscosity[2]*esh2j*esh1i); 328 Ke->values[4*numnodes*(4*i+1)+4*j+2]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb2j*eb1i+viscosity[2]*(esh2j*eb1i+eb2j*esh1i)+viscosity[4]*esh2j*esh1i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*eb2j*basis[i]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vxshear*esh2j*basis[i]); 329 Ke->values[4*numnodes*(4*i+2)+4*j+2]+=gauss->weight*Jdet*effmu*(viscosity[0]*eb2j*eb2i+viscosity[1]*(esh2j*eb2i+eb2j*esh2i)+viscosity[2]*esh2j*esh2i); 330 Ke->values[4*numnodes*(4*i+3)+4*j+2]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb2j*eb2i+viscosity[2]*(esh2j*eb2i+eb2j*esh2i)+viscosity[4]*esh2j*esh2i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*eb2j*basis[i]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*esh2j*basis[i]); 331 332 333 Ke->values[4*numnodes*(4*i+0)+4*j+3]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb2j*eb1i+viscosity[2]*(esh2j*eb1i+eb2j*esh1i)+viscosity[4]*esh2j*esh1i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*eb1i*basis[j]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*esh1i*basis[j]); 334 Ke->values[4*numnodes*(4*i+1)+4*j+3]+=gauss->weight*Jdet*effmu*(viscosity[2]*eb2j*eb1i+viscosity[4]*(esh2j*eb1i+eb2j*esh1i)+viscosity[5]*esh2j*esh1i+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*(vyshear*eb1i*basis[j]+vxshear*eb2j*basis[i])+viscosity[7]*(n+1)*(n+1)/2.0/thickness/thickness*(vxshear*esh2j*basis[i]+vyshear*esh1i*basis[j])+viscosity[8]*(n+1)*(n+1)*(n+1)*(n+1)/4.0/thickness/thickness/thickness/thickness*vxshear*vxshear*basis[j]*basis[i]); 335 Ke->values[4*numnodes*(4*i+2)+4*j+3]+=gauss->weight*Jdet*effmu*(viscosity[1]*eb2j*eb2i+viscosity[2]*(esh2j*eb2i+eb2j*esh2i)+viscosity[4]*esh2j*esh2i+viscosity[3]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*eb2i*basis[j]+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*esh2i*basis[j]); 336 Ke->values[4*numnodes*(4*i+3)+4*j+3]+=gauss->weight*Jdet*effmu*(viscosity[2]*eb2j*eb2i+viscosity[4]*(esh2j*eb2i+eb2j*esh2i)+viscosity[5]*esh2j*esh2i+viscosity[6]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*(eb2i*basis[j]+eb1j*basis[i])+viscosity[7]*(n+1)*(n+1)/2.0/thickness/thickness*vyshear*(esh2i*basis[j]+esh1j*basis[i])+viscosity[8]*(n+1)*(n+1)*(n+1)*(n+1)/4.0/thickness/thickness/thickness/thickness*vyshear*vyshear*basis[j]*basis[i]); 337 } 338 } 339 } 340 341 /*Transform Coordinate System*/ 342 /*element->TransformStiffnessMatrixCoord(Ke,XYEnum);*/ 343 344 /*Clean up and return*/ 345 delete gauss; 346 delete gauss_base; 347 if(basalelement->IsSpawnedElement()){basalelement->DeleteMaterials(); delete basalelement;}; 348 xDelete<IssmDouble>(xyz_list); 349 xDelete<IssmDouble>(dbasis); 350 xDelete<IssmDouble>(basis); 351 return Ke; 352 }/*}}}*/ 353 ElementMatrix* AdjointHorizAnalysis::CreateKMatrixMLHOVerticalIntergrated(Element* element){/*{{{*/ 354 355 /* Check if ice in element */ 356 if(!element->IsIceInElement()) return NULL; 357 358 /*Intermediaries */ 359 bool incomplete_adjoint; 360 IssmDouble Jdet,mu_prime,n,thickness,mu,effmu; 361 IssmDouble *xyz_list = NULL; 362 IssmDouble zeta, epsilon_eff; 363 int domaintype; 364 int dim=2; 365 366 IssmDouble e1phi1i, e1phi1j, e2phi1i, e2phi1j, e1phi2i, e1phi2j, e2phi2i, e2phi2j; 367 IssmDouble epsilon[5];/* epsilon=[exx,eyy,exy,exz,eyz];*/ 368 IssmDouble e1[3],e2[3]; 369 370 Element* basalelement; 371 372 /*Get basal element*/ 373 element->FindParam(&domaintype,DomainTypeEnum); 374 switch(domaintype){ 375 case Domain2DhorizontalEnum: 376 basalelement = element; 377 break; 378 case Domain3DEnum: case Domain2DverticalEnum: 379 _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet"); 380 break; 381 default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet"); 382 } 393 /*Second part of the Gateau derivative if requested*/ 394 395 383 396 /*Fetch number of nodes and dof for this finite element*/ 384 397 int numnodes = basalelement->GetNumberOfNodes(); 385 398 IssmDouble* dbasis = xNew<IssmDouble>(2*numnodes); // like SSA 386 399 IssmDouble* basis = xNew<IssmDouble>(numnodes); // like SSA 387 388 /*Initialize Jacobian with regular HO (first part of the Gateau derivative)*/389 element->FindParam(&incomplete_adjoint,InversionIncompleteAdjointEnum);390 StressbalanceAnalysis* analysis = new StressbalanceAnalysis();391 ElementMatrix* Ke=analysis->CreateKMatrix(basalelement);392 delete analysis;393 if(incomplete_adjoint) return Ke;394 400 395 401 /*Retrieve all inputs and parameters*/ … … 3428 3434 /*Fetch dof list and allocate solution vectors*/ 3429 3435 element->GetDofListLocal(&doflist,MLHOApproximationEnum,GsetEnum); 3430 IssmDouble* values = xNew<IssmDouble>(numdof);3431 IssmDouble* lambdax = xNew<IssmDouble>(numnodes);3432 IssmDouble* lambday = xNew<IssmDouble>(numnodes);3433 IssmDouble* lambdabx = xNew<IssmDouble>(numnodes);3434 IssmDouble* lambdaby = xNew<IssmDouble>(numnodes);3436 IssmDouble* values = xNew<IssmDouble>(numdof); 3437 IssmDouble* lambdax = xNew<IssmDouble>(numnodes); 3438 IssmDouble* lambday = xNew<IssmDouble>(numnodes); 3439 IssmDouble* lambdabx = xNew<IssmDouble>(numnodes); 3440 IssmDouble* lambdaby = xNew<IssmDouble>(numnodes); 3435 3441 IssmDouble* lambdashx = xNew<IssmDouble>(numnodes); 3436 3442 IssmDouble* lambdashy = xNew<IssmDouble>(numnodes); 3437 IssmDouble* n 3443 IssmDouble* n = xNew<IssmDouble>(numnodes); 3438 3444 3439 3445 /*Use the dof list to index into the solution vector: */ … … 3485 3491 xDelete<IssmDouble>(lambdashx); 3486 3492 xDelete<IssmDouble>(lambdashy); 3493 xDelete<IssmDouble>(n); 3487 3494 xDelete<int>(doflist); 3488 3495 }/*}}}*/
Note:
See TracChangeset
for help on using the changeset viewer.