Changeset 17653


Ignore:
Timestamp:
04/04/14 16:24:47 (11 years ago)
Author:
Mathieu Morlighem
Message:

CHG: separating update tau and d

Location:
issm/trunk-jpl/src/c
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp

    r17652 r17653  
    43204320        xDelete<int>(cs_list);
    43214321}/*}}}*/
    4322 void StressbalanceAnalysis::InputUpdateFromSolutionFSXTH(Elements* elements,Parameters* parameters){/*{{{*/
     4322void StressbalanceAnalysis::InputUpdateFromSolutionFSXTH_d(Elements* elements,Parameters* parameters){/*{{{*/
    43234323
    43244324        /*Intermediaries*/
     
    43304330        IssmDouble *xyz_list = NULL;
    43314331        IssmDouble  Jdet,r;
    4332         Gauss*      gauss = NULL;
    43334332
    43344333        parameters->FindParam(&r,AugmentedLagrangianREnum);
     
    43914390                }
    43924391
    4393                 gauss=element->NewGauss(5);
     4392                Gauss* gauss=element->NewGauss(5);
    43944393                for(int ig=gauss->begin();ig<gauss->end();ig++){
    43954394                        gauss->GaussPoint(ig);
     
    45224521                }
    45234522
     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}/*}}}*/
     4536void 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
    45244591                /*Update tau accordingly*/
    45254592                IssmDouble* tau_xx = xNew<IssmDouble>(tnumnodes);
     
    45294596                IssmDouble* tau_xz = NULL;
    45304597                IssmDouble* tau_yz = NULL;
    4531                 delete gauss;
    4532                 gauss = element->NewGauss();
     4598                Gauss* gauss = element->NewGauss();
    45334599                for(int ig=0;ig<tnumnodes;ig++){
    45344600                        gauss->GaussNode(P1DGEnum,ig);
     
    45594625                        }
    45604626
     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
    45614637                        /*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);
    45654641                        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);
    45694645                        }
    45704646                }
     
    45834659                delete gauss;
    45844660                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);
    45934667        }
    45944668}/*}}}*/
  • issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h

    r17541 r17653  
    8181                void GetSolutionFromInputsFS(Vector<IssmDouble>* solution,Element* element);
    8282                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);
    8485                void InitializeXTH(Elements* elements,Parameters* parameters);
    8586                /*Coupling*/
  • issm/trunk-jpl/src/c/solutionsequences/solutionsequence_la_theta.cpp

    r17650 r17653  
    2222        int  configuration_type,max_nonlinear_iterations;
    2323
     24        IssmDouble r     = .6;
     25        IssmDouble theta = 0.; // 0<theta<.5   -> .15<theta<.45
     26
    2427        /*Create analysis*/
    2528        StressbalanceAnalysis* analysis = new StressbalanceAnalysis();
     
    3033        femmodel->parameters->FindParam(&max_nonlinear_iterations,StressbalanceMaxiterEnum);
    3134        femmodel->parameters->SetParam(.6,AugmentedLagrangianREnum);
     35        femmodel->parameters->SetParam(theta,AugmentedLagrangianThetaEnum);
    3236
    3337        /*Update constraints and initialize d and tau if necessary*/
     
    4549                delete ug_old;ug_old=ug;
    4650
     51                /*Calculate d*/
     52                if(theta){
     53                        analysis->InputUpdateFromSolutionFSXTH_d(femmodel->elements,femmodel->parameters);
     54                }
     55
    4756                /*Solve KU=F*/
    4857                SystemMatricesx(&Kff,&Kfs,&pf,&df,NULL,femmodel);
     
    5766
    5867                /*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);
    6070
    6171                /*Check for convergence*/
Note: See TracChangeset for help on using the changeset viewer.