Changeset 17653
- Timestamp:
- 04/04/14 16:24:47 (11 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
r17652 r17653 4320 4320 xDelete<int>(cs_list); 4321 4321 }/*}}}*/ 4322 void StressbalanceAnalysis::InputUpdateFromSolutionFSXTH (Elements* elements,Parameters* parameters){/*{{{*/4322 void StressbalanceAnalysis::InputUpdateFromSolutionFSXTH_d(Elements* elements,Parameters* parameters){/*{{{*/ 4323 4323 4324 4324 /*Intermediaries*/ … … 4330 4330 IssmDouble *xyz_list = NULL; 4331 4331 IssmDouble Jdet,r; 4332 Gauss* gauss = NULL;4333 4332 4334 4333 parameters->FindParam(&r,AugmentedLagrangianREnum); … … 4391 4390 } 4392 4391 4393 gauss=element->NewGauss(5);4392 Gauss* gauss=element->NewGauss(5); 4394 4393 for(int ig=gauss->begin();ig<gauss->end();ig++){ 4395 4394 gauss->GaussPoint(ig); … … 4522 4521 } 4523 4522 4523 /*Clean up*/ 4524 delete gauss; 4525 xDelete<IssmDouble>(xyz_list); 4526 xDelete<IssmDouble>(tbasis); 4527 xDelete<IssmDouble>(Ke); 4528 xDelete<IssmDouble>(pe_xx); xDelete<IssmDouble>(d_xx); 4529 xDelete<IssmDouble>(pe_yy); xDelete<IssmDouble>(d_yy); 4530 xDelete<IssmDouble>(pe_zz); xDelete<IssmDouble>(d_zz); 4531 xDelete<IssmDouble>(pe_xy); xDelete<IssmDouble>(d_xy); 4532 xDelete<IssmDouble>(pe_xz); xDelete<IssmDouble>(d_xz); 4533 xDelete<IssmDouble>(pe_yz); xDelete<IssmDouble>(d_yz); 4534 } 4535 }/*}}}*/ 4536 void StressbalanceAnalysis::InputUpdateFromSolutionFSXTH_tau(Elements* elements,Parameters* parameters){/*{{{*/ 4537 4538 /*Intermediaries*/ 4539 int dim,tausize,meshtype; 4540 IssmDouble epsxx,epsyy,epszz,epsxy,epsxz,epsyz,D_scalar; 4541 IssmDouble d_xx,d_yy,d_zz,d_xy,d_xz,d_yz; 4542 IssmDouble sigmapxx,sigmapyy,sigmapzz,sigmapxy,sigmapxz,sigmapyz; 4543 IssmDouble dvx[3],dvy[3],dvz[3]; 4544 IssmDouble *xyz_list = NULL; 4545 IssmDouble Jdet,r; 4546 4547 parameters->FindParam(&r,AugmentedLagrangianREnum); 4548 parameters->FindParam(&meshtype,MeshTypeEnum); 4549 switch(meshtype){ 4550 case Mesh2DverticalEnum: dim = 2; tausize = 3; break; 4551 case Mesh3DEnum: dim = 3; tausize = 6; break; 4552 case Mesh3DtetrasEnum: dim = 3; tausize = 6; break; 4553 default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet"); 4554 } 4555 4556 for(int i=0;i<elements->Size();i++){ 4557 Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i)); 4558 4559 /*Get inputs and parameters*/ 4560 element->GetVerticesCoordinates(&xyz_list); 4561 Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input); 4562 Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input); 4563 Input* vz_input; 4564 if(dim==3){vz_input=element->GetInput(VzEnum); _assert_(vz_input);} 4565 4566 /*Get previous tau*/ 4567 Input* sigmapxx_input=element->GetInput(DeviatoricStressxxEnum); _assert_(sigmapxx_input); 4568 Input* sigmapyy_input=element->GetInput(DeviatoricStressyyEnum); _assert_(sigmapyy_input); 4569 Input* sigmapxy_input=element->GetInput(DeviatoricStressxyEnum); _assert_(sigmapxy_input); 4570 Input* sigmapzz_input=NULL; Input* sigmapxz_input=NULL; Input* sigmapyz_input=NULL; 4571 if(dim==3){ 4572 sigmapzz_input=element->GetInput(DeviatoricStresszzEnum); _assert_(sigmapzz_input); 4573 sigmapxz_input=element->GetInput(DeviatoricStressxzEnum); _assert_(sigmapxz_input); 4574 sigmapyz_input=element->GetInput(DeviatoricStressyzEnum); _assert_(sigmapyz_input); 4575 } 4576 4577 /*Get NEW d*/ 4578 Input* epsxx_input=element->GetInput(StrainRatexxEnum); _assert_(epsxx_input); 4579 Input* epsyy_input=element->GetInput(StrainRateyyEnum); _assert_(epsyy_input); 4580 Input* epsxy_input=element->GetInput(StrainRatexyEnum); _assert_(epsxy_input); 4581 Input* epszz_input=NULL; Input* epsxz_input=NULL; Input* epsyz_input=NULL; 4582 if(dim==3){ 4583 epszz_input=element->GetInput(StrainRatezzEnum); _assert_(epszz_input); 4584 epsxz_input=element->GetInput(StrainRatexzEnum); _assert_(epsxz_input); 4585 epsyz_input=element->GetInput(StrainRateyzEnum); _assert_(epsyz_input); 4586 } 4587 4588 /*Fetch number of nodes and dof for this finite element*/ 4589 int tnumnodes = element->GetNumberOfVertices(); //Tensors, P1 DG 4590 4524 4591 /*Update tau accordingly*/ 4525 4592 IssmDouble* tau_xx = xNew<IssmDouble>(tnumnodes); … … 4529 4596 IssmDouble* tau_xz = NULL; 4530 4597 IssmDouble* tau_yz = NULL; 4531 delete gauss; 4532 gauss = element->NewGauss(); 4598 Gauss* gauss = element->NewGauss(); 4533 4599 for(int ig=0;ig<tnumnodes;ig++){ 4534 4600 gauss->GaussNode(P1DGEnum,ig); … … 4559 4625 } 4560 4626 4627 /*Get new d*/ 4628 epsxx_input->GetInputValue(&d_xx,gauss); 4629 epsyy_input->GetInputValue(&d_yy,gauss); 4630 epsxy_input->GetInputValue(&d_xy,gauss); 4631 if(dim==3){ 4632 epszz_input->GetInputValue(&d_zz,gauss); 4633 epsxz_input->GetInputValue(&d_xz,gauss); 4634 epsyz_input->GetInputValue(&d_yz,gauss); 4635 } 4636 4561 4637 /*Get d and update tau accordingly*/ 4562 tau_xx[ig] = sigmapxx + r*(epsxx - d_xx [ig]);4563 tau_yy[ig] = sigmapyy + r*(epsyy - d_yy [ig]);4564 tau_xy[ig] = sigmapxy + r*(epsxy - d_xy [ig]);4638 tau_xx[ig] = sigmapxx + r*(epsxx - d_xx); 4639 tau_yy[ig] = sigmapyy + r*(epsyy - d_yy); 4640 tau_xy[ig] = sigmapxy + r*(epsxy - d_xy); 4565 4641 if(dim==3){ 4566 tau_zz[ig] = sigmapzz + r*(epszz - d_zz [ig]);4567 tau_xz[ig] = sigmapxz + r*(epsxz - d_xz [ig]);4568 tau_yz[ig] = sigmapyz + r*(epsyz - d_yz [ig]);4642 tau_zz[ig] = sigmapzz + r*(epszz - d_zz); 4643 tau_xz[ig] = sigmapxz + r*(epsxz - d_xz); 4644 tau_yz[ig] = sigmapyz + r*(epsyz - d_yz); 4569 4645 } 4570 4646 } … … 4583 4659 delete gauss; 4584 4660 xDelete<IssmDouble>(xyz_list); 4585 xDelete<IssmDouble>(tbasis); 4586 xDelete<IssmDouble>(Ke); 4587 xDelete<IssmDouble>(pe_xx); xDelete<IssmDouble>(d_xx); xDelete<IssmDouble>(tau_xx); 4588 xDelete<IssmDouble>(pe_yy); xDelete<IssmDouble>(d_yy); xDelete<IssmDouble>(tau_yy); 4589 xDelete<IssmDouble>(pe_zz); xDelete<IssmDouble>(d_zz); xDelete<IssmDouble>(tau_zz); 4590 xDelete<IssmDouble>(pe_xy); xDelete<IssmDouble>(d_xy); xDelete<IssmDouble>(tau_xy); 4591 xDelete<IssmDouble>(pe_xz); xDelete<IssmDouble>(d_xz); xDelete<IssmDouble>(tau_xz); 4592 xDelete<IssmDouble>(pe_yz); xDelete<IssmDouble>(d_yz); xDelete<IssmDouble>(tau_yz); 4661 xDelete<IssmDouble>(tau_xx); 4662 xDelete<IssmDouble>(tau_yy); 4663 xDelete<IssmDouble>(tau_zz); 4664 xDelete<IssmDouble>(tau_xy); 4665 xDelete<IssmDouble>(tau_xz); 4666 xDelete<IssmDouble>(tau_yz); 4593 4667 } 4594 4668 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
r17541 r17653 81 81 void GetSolutionFromInputsFS(Vector<IssmDouble>* solution,Element* element); 82 82 void InputUpdateFromSolutionFS(IssmDouble* solution,Element* element); 83 void InputUpdateFromSolutionFSXTH(Elements* elements,Parameters* parameters); 83 void InputUpdateFromSolutionFSXTH_d(Elements* elements,Parameters* parameters); 84 void InputUpdateFromSolutionFSXTH_tau(Elements* elements,Parameters* parameters); 84 85 void InitializeXTH(Elements* elements,Parameters* parameters); 85 86 /*Coupling*/ -
issm/trunk-jpl/src/c/solutionsequences/solutionsequence_la_theta.cpp
r17650 r17653 22 22 int configuration_type,max_nonlinear_iterations; 23 23 24 IssmDouble r = .6; 25 IssmDouble theta = 0.; // 0<theta<.5 -> .15<theta<.45 26 24 27 /*Create analysis*/ 25 28 StressbalanceAnalysis* analysis = new StressbalanceAnalysis(); … … 30 33 femmodel->parameters->FindParam(&max_nonlinear_iterations,StressbalanceMaxiterEnum); 31 34 femmodel->parameters->SetParam(.6,AugmentedLagrangianREnum); 35 femmodel->parameters->SetParam(theta,AugmentedLagrangianThetaEnum); 32 36 33 37 /*Update constraints and initialize d and tau if necessary*/ … … 45 49 delete ug_old;ug_old=ug; 46 50 51 /*Calculate d*/ 52 if(theta){ 53 analysis->InputUpdateFromSolutionFSXTH_d(femmodel->elements,femmodel->parameters); 54 } 55 47 56 /*Solve KU=F*/ 48 57 SystemMatricesx(&Kff,&Kfs,&pf,&df,NULL,femmodel); … … 57 66 58 67 /*Update d and tau accordingly*/ 59 analysis->InputUpdateFromSolutionFSXTH(femmodel->elements,femmodel->parameters); 68 analysis->InputUpdateFromSolutionFSXTH_d( femmodel->elements,femmodel->parameters); 69 analysis->InputUpdateFromSolutionFSXTH_tau(femmodel->elements,femmodel->parameters); 60 70 61 71 /*Check for convergence*/
Note:
See TracChangeset
for help on using the changeset viewer.