Changeset 18235


Ignore:
Timestamp:
07/11/14 11:00:33 (11 years ago)
Author:
seroussi
Message:

NEW: trying to implement augmentation lambda

Location:
issm/trunk-jpl/src/c/analyses
Files:
2 edited

Legend:

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

    r18227 r18235  
    28812881        int         i,dim,epssize;
    28822882        IssmDouble  r,rl,Jdet,viscosity,DU,DUl;
     2883        IssmDouble      normal[3];
    28832884        IssmDouble *xyz_list = NULL;
    28842885        IssmDouble *xyz_list_base = NULL;
     
    29592960                element->FindParam(&rl,AugmentedLagrangianRlambdaEnum);
    29602961                element->GetVerticesCoordinatesBase(&xyz_list_base);
     2962                element->NormalBase(&normal[0],xyz_list_base);
     2963
     2964                int         lsize;
     2965                IssmDouble* Dlambda = xNewZeroInit<IssmDouble>(dim*dim);
     2966                IssmDouble* C       = xNewZeroInit<IssmDouble>(dim*lnumdof);
     2967                IssmDouble* Cprime  = xNewZeroInit<IssmDouble>(dim*numdof);
    29612968
    29622969                delete gauss;
     
    29662973
    29672974                        element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
    2968                         this->GetCFS(C,element,dim,xyz_list_base,gauss);
    2969                         this->GetCFSprime(Cprime,element,dim,xyz_list_base,gauss);
    2970                         DUl = gauss->weight*Jdet*sqrt(rl);
    2971                         TripleMultiply(C,1,lnumdof,1,
    2972                                                 &DU,1,1,0,
    2973                                                 Cprime,1,numdof,0,
     2975                        this->GetCFS(C,element,dim,xyz_list,gauss);
     2976                        this->GetCFSprime(Cprime,element,dim,xyz_list,gauss);
     2977                        for(i=0;i<dim;i++)   Dlambda[i*epssize+i] = gauss->weight*Jdet*sqrt(normal[i]*normal[i])*sqrt(rl);
     2978                        TripleMultiply(C,dim,lnumdof,1,
     2979                                                Dlambda,dim,dim,0,
     2980                                                Cprime,dim,numdof,0,
    29742981                                                CtCUzawa,1);
    29752982                }
     2983                /*Delete base part*/
     2984                xDelete<IssmDouble>(xyz_list_base);
     2985                xDelete<IssmDouble>(Dlambda);
     2986                xDelete<IssmDouble>(C);
     2987                xDelete<IssmDouble>(Cprime);
    29762988        }
    29772989
     
    37333745        int         i,dim;
    37343746        IssmDouble  Jdet,r,pressure;
    3735         IssmDouble *xyz_list = NULL;
    3736         Gauss*      gauss    = NULL;
     3747        IssmDouble  bed_normal[3];
     3748        IssmDouble *xyz_list      = NULL;
     3749        IssmDouble *xyz_list_base = NULL;
     3750        Gauss*      gauss         = NULL;
    37373751
    37383752        /*Get problem dimension*/
     
    37573771        /*Get d and tau*/
    37583772        Input* pressure_input=element->GetInput(PressureEnum); _assert_(pressure_input);
     3773        Input* sigmann_input =element->GetInput(SigmaNNEnum);  _assert_(sigmann_input);
    37593774
    37603775        gauss=element->NewGauss(5);
     
    37733788                        }
    37743789                }
     3790        }
     3791
     3792        if(element->IsOnBase()){
     3793
     3794                IssmDouble   sigmann;
     3795                IssmDouble*  vbasis = xNew<IssmDouble>(numnodes);
     3796
     3797                element->GetVerticesCoordinatesBase(&xyz_list_base);
     3798                element->NormalBase(&bed_normal[0],xyz_list_base);
     3799
     3800                delete gauss;
     3801                Gauss* gauss=element->NewGaussBase(5);
     3802                for(int ig=gauss->begin();ig<gauss->end();ig++){
     3803                        gauss->GaussPoint(ig);
     3804
     3805                        element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
     3806                        element->NodalFunctionsVelocity(vbasis,gauss);
     3807                        sigmann_input->GetInputValue(&sigmann, gauss);
     3808
     3809                        for(i=0;i<numnodes;i++){
     3810                                pe->values[i*dim+0] += - sigmann*bed_normal[0]*gauss->weight*Jdet*vbasis[i];
     3811                                pe->values[i*dim+1] += - sigmann*bed_normal[1]*gauss->weight*Jdet*vbasis[i];
     3812                                if(dim==3){
     3813                                        pe->values[i*dim+2]+= - sigmann*bed_normal[2]*gauss->weight*Jdet*vbasis[i];
     3814                                }
     3815                        }
     3816                }
     3817                xDelete<IssmDouble>(xyz_list_base);
     3818                xDelete<IssmDouble>(vbasis);
    37753819        }
    37763820
     
    44104454}/*}}}*/
    44114455void StressbalanceAnalysis::GetCFS(IssmDouble* C,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
    4412         /*Compute C  matrix. C=[Cp1 Cp2 ...] where Cpi=phi_pi.
     4456        /*Compute C  matrix. C=[Cp1 Cp2 ...] where:
     4457         *     Cpi=[phi phi].
    44134458         */
    44144459
     
    44214466        /*Get nodal functions derivatives*/
    44224467        IssmDouble* basis =xNew<IssmDouble>(lnumnodes);
    4423         element->NodalFunctionsP1(basis,gauss);
     4468        element->NodalFunctions(basis,gauss);
    44244469
    44254470        /*Build B: */
    44264471        for(int i=0;i<lnumnodes;i++){
    4427                 C[i] = basis[i];
     4472                C[i*lnumnodes+0] = basis[i];
     4473                C[i*lnumnodes+1] = basis[i];
    44284474        }
    44294475
     
    44324478}/*}}}*/
    44334479void StressbalanceAnalysis::GetCFSprime(IssmDouble* Cprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
    4434         /*      Compute C'  matrix. C'=[C1' C2' C3']
    4435          *                      Ci' = [  dphi/dx   dphi/dy ]
     4480        /*      Compute C'  matrix. C'=[C1' C2' ...]
     4481         *                      Ci' = [  phi  0  ]
     4482         *                            [   0  phi ]
    44364483         *
    44374484         *      In 3d
    4438          *         Ci=[ dh/dx   dh/dy    dh/dz  ]
     4485         *                      Ci' = [  phi  0   0  ]
     4486         *                            [   0  phi  0  ]
     4487         *                            [   0   0  phi ]
    44394488         *      where phi is the finiteelement function for node i.
    44404489         */
    44414490
    44424491        /*Fetch number of nodes for this finite element*/
    4443         int lnumnodes = element->GetNumberOfNodes();
    4444 
    4445         /*Get nodal functions derivatives*/
    4446         IssmDouble* dbasis=xNew<IssmDouble>(dim*lnumnodes);
    4447         element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
    4448 
    4449         /*Build C_prime: */
    4450         if(dim==2){
    4451                 for(int i=0;i<lnumnodes;i++){
    4452                         Cprime[dim*i+0] = dbasis[0*lnumnodes+i];
    4453                         Cprime[dim*i+1] = dbasis[1*lnumnodes+i];
     4492        int vnumnodes = element->GetNumberOfNodes();
     4493        int vnumdof   = vnumnodes*dim;
     4494
     4495        IssmDouble* vbasis=xNew<IssmDouble>(vnumnodes);
     4496        element->NodalFunctionsVelocity(vbasis,gauss);
     4497
     4498        /*Build B: */
     4499        if(dim==3){
     4500                for(int i=0;i<vnumnodes;i++){
     4501                        Cprime[vnumdof*0+3*i+0] = vbasis[i];
     4502                        Cprime[vnumdof*0+3*i+1] = 0.;
     4503                        Cprime[vnumdof*0+3*i+2] = 0.;
     4504
     4505                        Cprime[vnumdof*1+3*i+0] = 0.;
     4506                        Cprime[vnumdof*1+3*i+1] = vbasis[i];
     4507                        Cprime[vnumdof*1+3*i+2] = 0.;
     4508
     4509                        Cprime[vnumdof*2+3*i+0] = 0.;
     4510                        Cprime[vnumdof*2+3*i+1] = 0.;
     4511                        Cprime[vnumdof*2+3*i+2] = vbasis[i];
    44544512                }
    44554513        }
    44564514        else{
    4457                 for(int i=0;i<lnumnodes;i++){
    4458                         Cprime[dim*i+0] = dbasis[0*lnumnodes+i];
    4459                         Cprime[dim*i+1] = dbasis[1*lnumnodes+i];
    4460                         Cprime[dim*i+2] = dbasis[2*lnumnodes+i];
    4461                 }
    4462         }
    4463 
    4464         /*Clean up*/
    4465         xDelete<IssmDouble>(dbasis);
     4515                for(int i=0;i<vnumnodes;i++){
     4516                        Cprime[vnumdof*0+2*i+0] = vbasis[i];
     4517                        Cprime[vnumdof*0+2*i+1] = 0.;
     4518
     4519                        Cprime[vnumdof*1+2*i+0] = 0.;
     4520                        Cprime[vnumdof*1+2*i+1] = vbasis[i];
     4521                }
     4522        }
     4523
     4524        /*Clean-up*/
     4525        xDelete<IssmDouble>(vbasis);
    44664526}/*}}}*/
    44674527void StressbalanceAnalysis::GetSolutionFromInputsFS(Vector<IssmDouble>* solution,Element* element){/*{{{*/
  • issm/trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp

    r18208 r18235  
    1212
    1313        parameters->AddObject(iomodel->CopyConstantObject(AugmentedLagrangianRhopEnum));
     14        parameters->AddObject(iomodel->CopyConstantObject(AugmentedLagrangianRholambdaEnum));
    1415}/*}}}*/
    1516void UzawaPressureAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
     
    167168void UzawaPressureAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
    168169
     170        int        dim;
    169171        int        *doflist   = NULL;
     172        IssmDouble rholambda,un;
     173        IssmDouble bed_normal[3];
    170174
    171175        /*Fetch number of nodes and dof for this finite element*/
    172         int numnodes = element->GetNumberOfNodes();
     176        int numnodes       = element->GetNumberOfNodes();
     177        int numnodessigma  = element->NumberofNodes(P2Enum);
     178        element->FindParam(&dim,DomainDimensionEnum);
    173179
    174180        /*Fetch dof list and allocate solution vector*/
    175181        element->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
    176182        IssmDouble* values    = xNew<IssmDouble>(numnodes);
    177         IssmDouble* pressure = xNew<IssmDouble>(numnodes);
     183        IssmDouble* pressure  = xNew<IssmDouble>(numnodes);
     184        Input* vx_input=    element->GetInput(VxEnum);       _assert_(vx_input);
     185        Input* vy_input=    element->GetInput(VyEnum);       _assert_(vy_input);
     186        Input* vz_input     = NULL;
     187        if(dim==3){vz_input =element->GetInput(VzEnum);      _assert_(vz_input);}
     188        Input* sigmann_input=element->GetInput(SigmaNNEnum); _assert_(vy_input);
    178189        element->GetInputListOnNodes(&pressure[0],PressureEnum);
    179190
     191        /*Update pressure enum first*/
    180192        for(int i=0;i<numnodes;i++){
    181193                values[i]   = pressure[i] + solution[doflist[i]];
    182194        }
    183 
    184195        element->AddInput(PressureEnum,values,element->GetElementType());
    185196
     197        /*Now compute sigmann if on base*/
     198        element->GetInputListOnNodes(&sigmann[0],SigmaNNEnum);
     199
     200        if(element->IsOnBase()){
     201
     202                element->NormalBase(&bed_normal[0],xyz_list_tria);
     203                element->FindParam(&rholambda,AugmentedLagrangianRholambdaEnum);
     204
     205                Gauss* gauss = element->NewGauss();
     206                for(int i=0;i<numnodessigma;i++){
     207                        gauss->GaussNode(P2Enum,i);
     208
     209                        vx_input->GetInputValue(&vx, gauss);
     210                        vy_input->GetInputValue(&vy, gauss);
     211                        un=bed_normal[0]*vx[i] + bed_normal[1]*vy[i];
     212                        if(dim==3){
     213                           vz_input->GetInputValue(&vz, gauss);
     214                                un = un + bed_normal[2]*vz[i];
     215                        }
     216                        values[i] = sigmann[i] + rholambda*un;
     217                }
     218        }
     219        element->AddInput(SigmaNNEnum,values,P2Enum));
     220
    186221        /*Free ressources:*/
     222        delete gauss;
    187223        xDelete<IssmDouble>(values);
     224        xDelete<IssmDouble>(sigmann);
    188225        xDelete<IssmDouble>(pressure);
    189226        xDelete<int>(doflist);
Note: See TracChangeset for help on using the changeset viewer.