Changeset 17650


Ignore:
Timestamp:
04/04/14 15:40:43 (11 years ago)
Author:
Mathieu Morlighem
Message:

NEW: done with X-TH LA

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

Legend:

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

    r17647 r17650  
    77#include "../cores/cores.h"
    88
    9 //#define FSANALYTICAL 10
     9//#define FSANALYTICAL 2
    1010
    1111/*Model processing*/
     
    32093209ElementVector* StressbalanceAnalysis::CreatePVectorFS(Element* element){/*{{{*/
    32103210
    3211         int         i,meshtype,dim;
     3211        int         i,meshtype,dim,fe_FS;
    32123212        IssmDouble  x_coord,y_coord,z_coord;
    32133213        IssmDouble  Jdet,forcex,forcey,forcez;
    32143214        IssmDouble *xyz_list = NULL;
    32153215
     3216        element->FindParam(&fe_FS,FlowequationFeFSEnum);
    32163217        element->FindParam(&meshtype,MeshTypeEnum);
    32173218        switch(meshtype){
     
    32713272        xDelete<IssmDouble>(vbasis);
    32723273        xDelete<IssmDouble>(xyz_list);
     3274        if(fe_FS==XTaylorHoodEnum){
     3275                ElementVector* pe2=CreatePVectorFSViscousXTH(element);
     3276                ElementVector* pe3 = new ElementVector(pe,pe2);
     3277                delete pe;
     3278                delete pe2;
     3279                return pe3;
     3280        }
    32733281        return pe;
    32743282}/*}}}*/
     
    35523560        xDelete<IssmDouble>(xyz_list);
    35533561        xDelete<IssmDouble>(Dstar);
    3554 xDelete<IssmDouble>(d);
     3562        xDelete<IssmDouble>(d);
    35553563        xDelete<IssmDouble>(D);
    35563564        xDelete<IssmDouble>(tau);
     
    43824390                                                        +2.*(epsxy_old*epsxy_old + epsxz_old*epsxz_old + epsyz_old*epsyz_old));
    43834391                        }
     4392                        /*Initial guess cannot be 0 otherwise log(0)  - inf*/
     4393                        if(dnorm==0.) dnorm=1.;
    43844394                        NewtonSolveDnorm(&dnorm,coef1,coef2,coef3,n,dnorm);
     4395                        _assert_(dnorm>=0.);
     4396                        _assert_(!xIsNan<IssmDouble>(dnorm));
    43854397
    43864398                        /*Create Ke*/
     
    44144426                        Matrix3x3Solve(&d_yy[0],Ke,pe_yy);
    44154427                        Matrix3x3Solve(&d_xy[0],Ke,pe_xy);
     4428                        for(int i=0;i<3;i++) _assert_(!xIsNan<IssmDouble>(d_xx[i]));
     4429                        for(int i=0;i<3;i++) _assert_(!xIsNan<IssmDouble>(d_yy[i]));
     4430                        for(int i=0;i<3;i++) _assert_(!xIsNan<IssmDouble>(d_xx[i]));
    44164431                        element->AddInput(StrainRatexxEnum,d_xx,P1DGEnum);
    44174432                        element->AddInput(StrainRateyyEnum,d_yy,P1DGEnum);
     
    44204435                else{
    44214436                        _assert_(tnumnodes==4);
    4422                         Matrix3x3Solve(&d_xx[0],Ke,pe_xx);
    4423                         Matrix3x3Solve(&d_yy[0],Ke,pe_yy);
    4424                         Matrix3x3Solve(&d_xy[0],Ke,pe_xy);
    4425                         Matrix3x3Solve(&d_zz[0],Ke,pe_zz);
    4426                         Matrix3x3Solve(&d_xz[0],Ke,pe_xz);
    4427                         Matrix3x3Solve(&d_yz[0],Ke,pe_yz);
     4437                        Matrix4x4Solve(&d_xx[0],Ke,pe_xx);
     4438                        Matrix4x4Solve(&d_yy[0],Ke,pe_yy);
     4439                        Matrix4x4Solve(&d_xy[0],Ke,pe_xy);
     4440                        Matrix4x4Solve(&d_zz[0],Ke,pe_zz);
     4441                        Matrix4x4Solve(&d_xz[0],Ke,pe_xz);
     4442                        Matrix4x4Solve(&d_yz[0],Ke,pe_yz);
    44284443                        element->AddInput(StrainRatexxEnum,d_xx,P1DGEnum);
    44294444                        element->AddInput(StrainRateyyEnum,d_yy,P1DGEnum);
  • issm/trunk-jpl/src/c/shared/Numerics/NewtonSolveDnorm.cpp

    r17629 r17650  
    1515        /*trivial solution*/
    1616        if(c3==0.){
    17                 *pdnorm =0.;
     17                *pdnorm = 0.;
    1818                return 0;
    1919        }
     
    2626
    2727        /*Initial guess*/
     28        _assert_(dnorm>0.);
    2829        IssmDouble y1 = log10(dnorm);
    2930
     
    4142                }
    4243
    43                 if(counter>50) _error_("Could not converge");
     44                if(counter>50) break;
    4445        }
     46
     47        /*Avoid extremely large values that indicate non convergence*/
     48        if(y2>50.) y2 = 50;
    4549
    4650        /*Assign output pointer*/
  • issm/trunk-jpl/src/c/solutionsequences/solutionsequence_la_theta.cpp

    r17619 r17650  
    1919        Vector<IssmDouble>*  df     = NULL;
    2020        Vector<IssmDouble>*  ys     = NULL;
     21        IssmDouble           eps_rel;
    2122        int  configuration_type,max_nonlinear_iterations;
    2223
     
    2627        /*Recover parameters: */
    2728        femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
     29        femmodel->parameters->FindParam(&eps_rel,StressbalanceReltolEnum);
    2830        femmodel->parameters->FindParam(&max_nonlinear_iterations,StressbalanceMaxiterEnum);
     31        femmodel->parameters->SetParam(.6,AugmentedLagrangianREnum);
    2932
    3033        /*Update constraints and initialize d and tau if necessary*/
     
    3336
    3437        /*Convergence criterion*/
    35         int        count   = 0;
    36         IssmDouble eps_rel = .001;
    37         femmodel->parameters->SetParam(.6,AugmentedLagrangianREnum);
     38        int  count = 0;
    3839        GetSolutionFromInputsx(&ug,femmodel);
    3940
    4041        while(true){
     42                count++;
    4143
    4244                /*save pointer to old velocity*/
     
    4749                CreateNodalConstraintsx(&ys,femmodel->nodes,configuration_type);
    4850                Reduceloadx(pf, Kfs, ys); delete Kfs;
    49 
    50         //      pf->Echo();
    51         //      IssmDouble* temp=Kff->ToSerial();
    52         //      int m,n;
    53         //      Kff->GetSize(&m,&n);
    54         //      printarray(temp,m,n);
    55         //      xDelete<IssmDouble>(temp);
    56 
    5751                Solverx(&uf, Kff, pf, NULL, df, femmodel->parameters);
    58                 //uf->Echo();
    5952                delete Kff; delete pf; delete df;
    60 
    6153                Mergesolutionfromftogx(&ug, uf,ys,femmodel->nodes,femmodel->parameters);delete uf; delete ys;
    6254
    6355                /*Update solution*/
    64                 _printf_("ug norm = " << ug->Norm(NORM_TWO) << "\n");
    6556                InputUpdateFromSolutionx(femmodel,ug);
    6657
     
    8172                }
    8273
    83                 count++;
    84                 if(count>=max_nonlinear_iterations) break;
     74                if(count>=max_nonlinear_iterations){
     75                        _printf0_("   maximum number of nonlinear iterations (" << max_nonlinear_iterations << ") exceeded\n");
     76                        break;
     77                }
    8578        }
     79
     80        if(VerboseConvergence()) _printf0_("\n   total number of iterations: " << count-1 << "\n");
    8681
    8782        delete ug; 
Note: See TracChangeset for help on using the changeset viewer.