Changeset 18654


Ignore:
Timestamp:
10/17/14 11:57:36 (10 years ago)
Author:
seroussi
Message:

BUG: fixed augmentation for non linear case

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

Legend:

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

    r18561 r18654  
    8181        IssmDouble*    M    = xNew<IssmDouble>(numnodes);
    8282
     83        IssmDouble connectivity;
    8384        /*Retrieve all inputs and parameters*/
    8485        element->GetVerticesCoordinates(&xyz_list);
    85 
    86         Gauss* gauss = element->NewGauss(5);
    87         for(int ig=gauss->begin();ig<gauss->end();ig++){
    88                 gauss->GaussPoint(ig);
    89 
    90                 element->JacobianDeterminant(&Jdet,xyz_list,gauss);
    91                 this->GetM(M,element,gauss);
    92                 D_scalar=gauss->weight*Jdet;
    93                 TripleMultiply(M,1,numnodes,1,
    94                                         &D_scalar,1,1,0,
    95                                         M,1,numnodes,0,
    96                                         &Ke->values[0],1);
     86        int numvertices = element->GetNumberOfVertices();
     87
     88        //Gauss* gauss = element->NewGauss(5);
     89        //for(int ig=gauss->begin();ig<gauss->end();ig++){
     90        //      gauss->GaussPoint(ig);
     91
     92        //      element->JacobianDeterminant(&Jdet,xyz_list,gauss);
     93        //      this->GetM(M,element,gauss);
     94        //      D_scalar=gauss->weight*Jdet;
     95        //      //TripleMultiply(M,1,numnodes,1,
     96        //      //                      &D_scalar,1,1,0,
     97        //      //                      M,1,numnodes,0,
     98        //      //                      &Ke->values[0],1);
     99
     100        //}
     101        for(int iv=0;iv<numvertices;iv++){
     102                connectivity=(IssmDouble)element->VertexConnectivity(iv);
     103                Ke->values[iv*numvertices+iv]=1./connectivity;
    97104        }
    98105
    99106        /*Clean up and return*/
    100         delete gauss;
     107        //delete gauss;
    101108        xDelete<IssmDouble>(xyz_list);
    102109        xDelete<IssmDouble>(M);
     
    202209        IssmDouble* valueslambda  = xNewZeroInit<IssmDouble>(numnodessigma);
    203210        IssmDouble* pressure      = xNew<IssmDouble>(numnodes);
    204         Input* sigmann_input      = element->GetInput(SigmaNNEnum); _assert_(sigmann_input);
    205211        Input* vx_input           = element->GetInput(VxEnum);      _assert_(vx_input);
    206212        Input* vy_input           = element->GetInput(VyEnum);      _assert_(vy_input);
     
    217223        /*Now compute sigmann if on base*/
    218224        if(element->IsOnBase() && 0){
     225                Input* sigmann_input      = element->GetInput(SigmaNNEnum); _assert_(sigmann_input);
    219226                if(dim==3) _error_("not implemented yet");
    220227
  • issm/trunk-jpl/src/c/solutionsequences/solutionsequence_la.cpp

    r18208 r18654  
    3939
    4040        /*Convergence criterion*/
    41         int  count = 0;
    42         Vector<IssmDouble>* vel     = NULL;
    43         Vector<IssmDouble>* vel_old = NULL;
     41        int  count       = 0;
     42        int  count_local = 0;
     43        Vector<IssmDouble>* vel           = NULL;
     44        Vector<IssmDouble>* vel_old       = NULL;
     45        Vector<IssmDouble>* vel_old_local = NULL;
    4446        GetVectorFromInputsx(&vel,femmodel,VxEnum,VertexEnum);
    4547        GetVectorFromInputsx(&pug,femmodel,PressureEnum,VertexEnum);
     
    4951
    5052                /*save pointer to old velocity*/
    51                 delete vel_old;vel_old=vel;
     53                delete vel_old;vel_old=vel->Duplicate(); vel->Copy(vel_old);
    5254                delete pug_old;pug_old=pug;
    5355                pressure_converged=false; vel_converged=false;
    5456
    55                 /*Solve KU=F*/
    56                 femmodel->SetCurrentConfiguration(StressbalanceAnalysisEnum);
    57                 femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
    58                 SystemMatricesx(&Kff,&Kfs,&pf,&df,NULL,femmodel);
    59                 CreateNodalConstraintsx(&ys,femmodel->nodes,configuration_type);
    60                 Reduceloadx(pf, Kfs, ys); delete Kfs;
    61                 Solverx(&uf, Kff, pf, NULL, df, femmodel->parameters);
    62                 delete Kff; delete pf; delete df;
    63                 Mergesolutionfromftogx(&ug, uf,ys,femmodel->nodes,femmodel->parameters);delete uf; delete ys;
     57                while(true){
     58                        count_local++;
     59                        delete vel_old_local;vel_old_local=vel;
     60                        /*Solve KU=F*/
     61                        femmodel->SetCurrentConfiguration(StressbalanceAnalysisEnum);
     62                        femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
     63                        SystemMatricesx(&Kff,&Kfs,&pf,&df,NULL,femmodel);
     64                        CreateNodalConstraintsx(&ys,femmodel->nodes,configuration_type);
     65                        Reduceloadx(pf, Kfs, ys); delete Kfs;
     66                        Solverx(&uf, Kff, pf, NULL, df, femmodel->parameters);
     67                        delete Kff; delete pf; delete df;
     68                        Mergesolutionfromftogx(&ug, uf,ys,femmodel->nodes,femmodel->parameters);delete uf; delete ys;
    6469
    65                 /*Update solution*/
    66                 InputUpdateFromSolutionx(femmodel,ug); delete ug;
    67                 GetVectorFromInputsx(&vel,femmodel,VxEnum,VertexEnum);
     70                        /*Update solution*/
     71                        InputUpdateFromSolutionx(femmodel,ug); delete ug;
     72                        GetVectorFromInputsx(&vel,femmodel,VxEnum,VertexEnum);
     73                        /*Check for convergence*/
     74                        Vector<IssmDouble>* dvel_local=vel_old_local->Duplicate(); vel_old_local->Copy(dvel_local); dvel_local->AYPX(vel,-1.0);
     75                        IssmDouble ndu=dvel_local->Norm(NORM_TWO);   delete dvel_local;
     76                        IssmDouble nu =vel_old_local->Norm(NORM_TWO);
     77                        if (xIsNan<IssmDouble>(ndu) || xIsNan<IssmDouble>(nu)) _error_("convergence criterion is NaN!");
     78                        if((ndu/nu)<eps_rel){
     79                                if(VerboseConvergence()) _printf0_(setw(50) << left << "   Convergence criterion: norm(du)/norm(u)" << ndu/nu*100 << " < " << eps_rel*100 << " %\n");
     80                                break;
     81                        }
     82                        else{
     83                                if(VerboseConvergence()) _printf0_(setw(50) << left << "   Convergence criterion: norm(du)/norm(u)" << ndu/nu*100 << " > " << eps_rel*100 << " %\n");
     84                        }
     85                        if(count_local>=max_nonlinear_iterations){
     86                                _printf0_("   maximum number of nonlinear iterations (" << max_nonlinear_iterations << ") exceeded\n");
     87                                break;
     88                        }
     89                }
     90                count_local=0;
    6891
    6992                femmodel->SetCurrentConfiguration(UzawaPressureAnalysisEnum);
     
    81104
    82105                /*Check for convergence*/
    83                 Vector<IssmDouble>* dvel=vel_old->Duplicate(); vel_old->Copy(dvel); dvel->AYPX(vel,-1.0);
     106                Vector<IssmDouble>* dvel=vel_old_local->Duplicate(); vel_old_local->Copy(dvel); dvel->AYPX(vel,-1.0);
    84107                IssmDouble ndu=dvel->Norm(NORM_TWO);   delete dvel;
    85                 IssmDouble nu =vel_old->Norm(NORM_TWO);
     108                IssmDouble nu =vel_old_local->Norm(NORM_TWO);
    86109                if (xIsNan<IssmDouble>(ndu) || xIsNan<IssmDouble>(nu)) _error_("convergence criterion is NaN!");
    87110                if((ndu/nu)<eps_rel){
     
    119142        delete vel; 
    120143        delete vel_old; 
     144        delete vel_old_local; 
    121145        delete stressanalysis;
    122146        delete pressureanalysis;
Note: See TracChangeset for help on using the changeset viewer.