Changeset 17603


Ignore:
Timestamp:
03/31/14 13:33:46 (11 years ago)
Author:
Mathieu Morlighem
Message:

NEW: added convergence test for LA Theta algorithm

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/solutionsequences/solutionsequence_la_theta.cpp

    r17570 r17603  
    1111
    1212        /*intermediary: */
    13         Matrix<IssmDouble>*  Kff = NULL;
    14         Matrix<IssmDouble>*  Kfs = NULL;
    15         Vector<IssmDouble>*  ug  = NULL;
    16         Vector<IssmDouble>*  uf  = NULL;
    17         Vector<IssmDouble>*  pf  = NULL;
    18         Vector<IssmDouble>*  df  = NULL;
    19         Vector<IssmDouble>*  ys  = NULL;
     13        Matrix<IssmDouble>*  Kff    = NULL;
     14        Matrix<IssmDouble>*  Kfs    = NULL;
     15        Vector<IssmDouble>*  ug_old = NULL;
     16        Vector<IssmDouble>*  ug     = NULL;
     17        Vector<IssmDouble>*  uf     = NULL;
     18        Vector<IssmDouble>*  pf     = NULL;
     19        Vector<IssmDouble>*  df     = NULL;
     20        Vector<IssmDouble>*  ys     = NULL;
    2021        int  configuration_type;
    2122
     
    3132
    3233        /*Convergence criterion*/
    33         int count = 0;
    34         femmodel->parameters->SetParam(reCast<IssmDouble>(10.),AugmentedLagrangianREnum);
     34        int        count   = 0;
     35        IssmDouble eps_rel = .001;
     36        femmodel->parameters->SetParam(0.6,AugmentedLagrangianREnum);
     37        GetSolutionFromInputsx(&ug,femmodel);
    3538
    3639        while(true){
     40
     41                /*save pointer to old velocity*/
     42                delete ug_old;ug_old=ug;
    3743
    3844                /*Solve KU=F*/
     
    5157                analysis->InputUpdateFromSolutionFSXTH(femmodel->elements,femmodel->parameters);
    5258
     59                /*Check for convergence*/
     60                Vector<IssmDouble>* dug=ug_old->Duplicate(); ug_old->Copy(dug); dug->AYPX(ug,-1.0);
     61                IssmDouble ndu=dug->Norm(NORM_TWO);   delete dug;
     62                IssmDouble nu =ug_old->Norm(NORM_TWO);
     63                if (xIsNan<IssmDouble>(ndu) || xIsNan<IssmDouble>(nu)) _error_("convergence criterion is NaN!");
     64                if((ndu/nu)<eps_rel){
     65                        if(VerboseConvergence()) _printf0_(setw(50) << left << "   Convergence criterion: norm(du)/norm(u)" << ndu/nu*100 << " < " << eps_rel*100 << " %\n");
     66                        break;
     67                }
     68                else{
     69                        if(VerboseConvergence()) _printf0_(setw(50) << left << "   Convergence criterion: norm(du)/norm(u)" << ndu/nu*100 << " > " << eps_rel*100 << " %\n");
     70                }
     71
    5372                count++;
    54                 if(count>5) break;
     73                if(count>20) break;
    5574        }
    5675
    57         /*Check for convergence*/
    58         //_error_("STOP");
    59 
    6076        delete ug; 
     77        delete ug_old; 
    6178        delete analysis;
    6279}
Note: See TracChangeset for help on using the changeset viewer.