Changeset 27177


Ignore:
Timestamp:
08/02/22 02:54:18 (3 years ago)
Author:
bdef
Message:

NEW: implementing addaptative stepping in Hydro

Location:
issm/trunk-jpl/src
Files:
6 edited

Legend:

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

    r27102 r27177  
    1111void HydrologyDCEfficientAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
    1212
     13        bool        isefficientlayer;
    1314        int         hydrology_model;
    1415        int         eplflip_lock;
    1516        int         eplthickcomp;
    16         bool        isefficientlayer;
     17        IssmDouble  eplinitthick;
     18        IssmDouble  eplcolapsethick;
     19        IssmDouble  eplmaxthick;
     20        IssmDouble  eplcond;
     21
    1722        /*retrieve some parameters: */
    1823        iomodel->FindConstant(&hydrology_model,"md.hydrology.model");
     
    2732        if(!isefficientlayer) return;
    2833
    29         /*If yes, initialize a flip flop counter*/
     34        /*If yes, get the parameters*/
    3035        iomodel->FetchData(&eplflip_lock,"md.hydrology.eplflip_lock");
     36        iomodel->FetchData(&eplthickcomp,"md.hydrology.epl_thick_comp");
     37
    3138        parameters->AddObject(new IntParam(HydrologydcEplflipLockEnum,eplflip_lock));
    32 
    33         iomodel->FetchData(&eplthickcomp,"md.hydrology.epl_thick_comp");
    3439        parameters->AddObject(new IntParam(HydrologydcEplThickCompEnum,eplthickcomp));
     40
     41        iomodel->FetchData(&eplinitthick,"md.hydrology.epl_initial_thickness");
     42        iomodel->FetchData(&eplcolapsethick,"md.hydrology.epl_colapse_thickness");
     43        iomodel->FetchData(&eplmaxthick,"md.hydrology.epl_max_thickness");
     44        iomodel->FetchData(&eplcond,"md.hydrology.epl_conductivity");
     45        parameters->AddObject(new DoubleParam(HydrologydcEplInitialThicknessEnum,eplinitthick));
     46        parameters->AddObject(new DoubleParam(HydrologydcEplColapseThicknessEnum,eplcolapsethick));
     47        parameters->AddObject(new DoubleParam(HydrologydcEplMaxThicknessEnum,eplmaxthick));
     48        parameters->AddObject(new DoubleParam(HydrologydcEplConductivityEnum,eplcond));
     49
    3550}/*}}}*/
    3651void HydrologyDCEfficientAnalysis::UpdateElements(Elements* elements,Inputs* inputs,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
  • issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp

    r27102 r27177  
    2323        int         numoutputs;
    2424        bool        isefficientlayer;
     25        bool        sliceadapt;
    2526        IssmDouble  penalty_factor;
    2627        IssmDouble  rel_tol;
    2728        IssmDouble  leakagefactor;
    2829        IssmDouble  sedimentlimit;
     30        IssmDouble  sed_poro;
     31        IssmDouble  sed_thick;
    2932        char**      requestedoutputs = NULL;
    3033
     
    4346        iomodel->FetchData(&hydro_maxiter,      "md.hydrology.max_iter" );
    4447        iomodel->FetchData(&hydroslices,        "md.hydrology.steps_per_step");
     48        iomodel->FetchData(&sliceadapt,         "md.hydrology.step_adapt");
    4549        iomodel->FetchData(&averaging_method,   "md.hydrology.averaging");
    4650        iomodel->FetchData(&isefficientlayer,   "md.hydrology.isefficientlayer");
     
    5559        parameters->AddObject(new IntParam(HydrologydcMaxIterEnum,hydro_maxiter));
    5660        parameters->AddObject(new IntParam(HydrologyStepsPerStepEnum,hydroslices));
     61        parameters->AddObject(new BoolParam(HydrologyStepAdaptEnum,sliceadapt));
    5762        parameters->AddObject(new IntParam(HydrologyAveragingEnum,averaging_method));
    58 
    5963        parameters->AddObject(new BoolParam(HydrologydcIsefficientlayerEnum,isefficientlayer));
    6064        parameters->AddObject(new DoubleParam(HydrologydcPenaltyFactorEnum,penalty_factor));
    6165        parameters->AddObject(new DoubleParam(HydrologydcRelTolEnum,rel_tol));
     66
     67        iomodel->FetchData(&sed_poro,  "md.hydrology.sediment_porosity" );
     68        iomodel->FetchData(&sed_thick, "md.hydrology.sediment_thickness" );
     69
     70        parameters->AddObject(new DoubleParam(HydrologydcSedimentPorosityEnum,sed_poro));
     71        parameters->AddObject(new DoubleParam(HydrologydcSedimentThicknessEnum,sed_thick));
     72
    6273        if(transfer_flag==1){
    6374                iomodel->FetchData(&leakagefactor,"md.hydrology.leakage_factor");
     
    110121        iomodel->FetchDataToInput(inputs,elements,"md.hydrology.sediment_transmitivity",HydrologydcSedimentTransmitivityEnum);
    111122        iomodel->FetchDataToInput(inputs,elements,"md.hydrology.mask_thawed_node",HydrologydcMaskThawedNodeEnum);
     123
     124
    112125        if(iomodel->domaintype!=Domain2DhorizontalEnum){
    113126                iomodel->FetchDataToInput(inputs,elements,"md.mesh.vertexonbase",MeshVertexonbaseEnum);
  • issm/trunk-jpl/src/c/cores/hydrology_core.cpp

    r27102 r27177  
    5757                InputDuplicatex(femmodel,WatercolumnEnum,WaterColumnOldEnum);
    5858
    59                 /*grab tws from the hydrology.spcwatercolumn field input and update 
     59                /*grab tws from the hydrology.spcwatercolumn field input and update
    6060                 * the solution with it:*/
    6161                Vector<IssmDouble>*  ug  = NULL;
    6262                GetVectorFromInputsx(&ug,femmodel,HydrologyTwsSpcEnum,VertexPIdEnum);
    63                 InputUpdateFromSolutionx(femmodel,ug); 
     63                InputUpdateFromSolutionx(femmodel,ug);
    6464
    6565                /*solid earth considerations:*/
     
    8383                if(ThawedNodes>0){
    8484                        /*check if we need sub steps*/
    85                         int        dtslices;
    86                         femmodel->parameters->FindParam(&dtslices,HydrologyStepsPerStepEnum);
    87 
    88                         if(dtslices>1){
    89                                 int        substep, numaveragedinput, hydro_averaging;
    90                                 IssmDouble global_time, subtime, yts;
     85                        int  dtslices;
     86                        bool sliceadapt;
     87         bool conv_fail=false;
     88         femmodel->parameters->FindParam(&dtslices,HydrologyStepsPerStepEnum);
     89         femmodel->parameters->FindParam(&sliceadapt,HydrologyStepAdaptEnum);
     90
     91                        if(dtslices>1 || sliceadapt){
     92                                int        step, substep, numaveragedinput, hydro_averaging, remainingslices;
     93                                IssmDouble global_time, subtime, yts, remainingtime, averagetime;
    9194                                IssmDouble dt, subdt;
    9295
    9396            femmodel->parameters->FindParam(&global_time,TimeEnum);
     97                                femmodel->parameters->FindParam(&step,StepEnum);
    9498            femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
    9599            femmodel->parameters->FindParam(&yts,ConstantsYtsEnum);
     
    124128                                }
    125129                                femmodel->InitTransientInputx(&transientinput[0],numaveragedinput);
     130                                averagetime=0;
    126131                                while(substep<dtslices){ //loop on hydro dts
    127132                                        substep+=1;
    128133                                        subtime+=subdt;
     134                                        averagetime+=subtime*dt;
    129135                                        /*Setting substep time as global time*/
    130136                                        femmodel->parameters->SetParam(subtime,TimeEnum);
     
    138144                                        }
    139145                                        /*Proceed now to heads computations*/
    140                                         solutionsequence_hydro_nonlinear(femmodel);
    141                /*If we have a sub-timestep we store the substep inputs in a transient input here*/
    142                                         femmodel->StackTransientInputonBasex(&substepinput[0],&transientinput[0],subtime,numaveragedinput);
     146                                        solutionsequence_hydro_nonlinear(femmodel, &conv_fail);
     147                                        if(conv_fail){
     148                  /*convergence failed, we want to go back to the begining of the main step and increase the number of subslices*/
     149                  /*First we get teh time and step counter back to the begining of the step that did not converge*/
     150                  averagetime-=subtime*subdt;
     151                  subtime-=subdt;
     152                  substep-=1;
     153                  /*compute the number of slice that are remaining and the time left in the timestep*/
     154                  remainingslices=dtslices-substep;
     155                  remainingtime=global_time-subtime;
     156                  /*We double the number of remaining slices and compute their duration*/
     157                  dtslices=dtslices-remainingslices+(2*remainingslices);
     158                  subdt=remainingtime/(2*remainingslices);
     159                  _printf0_("convergence failed for sub-step "<< substep <<" total number of slice is now "<< dtslices <<" for step "<<step<<"\n");
     160                  _printf0_("next slice duration is "<< subdt/yts <<" years\n");
     161                  conv_fail = false;  //re-initialize the control keyword
     162                  if (dtslices>500){
     163                     _error_("   We reached (" << dtslices << ") which exceeds the hard limit of 500");
     164                  }
     165
     166                  femmodel->parameters->SetParam(subdt,TimesteppingTimeStepEnum);
     167                  femmodel->parameters->SetParam(subtime,TimeEnum);
     168
     169               }
     170               else{
     171                                                /*If we have a sub-timestep we store the substep inputs in a transient input here*/
     172                                                femmodel->StackTransientInputonBasex(&substepinput[0],&transientinput[0],subtime,numaveragedinput);
     173                                        }
    143174                                }
    144175                                /*averaging the stack*/
     
    147178                                femmodel->parameters->SetParam(dt,TimesteppingTimeStepEnum);
    148179                                femmodel->parameters->SetParam(global_time,TimeEnum);
     180                                if(save_results){
     181               femmodel->results->AddResult(new GenericExternalResult<int>(femmodel->results->Size()+1,HydrologySubstepsEnum,dtslices,step,global_time));
     182               femmodel->results->AddResult(new GenericExternalResult<double>(femmodel->results->Size()+1,HydrologySubTimeEnum,(averagetime/dt)/yts,step,global_time));
     183            }
    149184                        }
    150185                        else{
     
    156191                                /*Proceed now to heads computations*/
    157192                                if(VerboseSolution()) _printf0_("   computing water heads\n");
    158                                 solutionsequence_hydro_nonlinear(femmodel);
     193                                solutionsequence_hydro_nonlinear(femmodel, &conv_fail);
    159194                                /*If no substeps are present we want to duplicate the results for coupling purposes*/
    160195                                InputDuplicatex(femmodel,SedimentHeadSubstepEnum,SedimentHeadEnum);
  • issm/trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp

    r27102 r27177  
    1010#include "../solutionsequences/solutionsequences.h"
    1111
    12 void solutionsequence_hydro_nonlinear(FemModel* femmodel){
     12void solutionsequence_hydro_nonlinear(FemModel* femmodel, bool* pconv_fail){
    1313        /*solution : */
    1414        Vector<IssmDouble>* ug_sed=NULL;
     
    1616        Vector<IssmDouble>* uf_sed_sub_iter=NULL;
    1717        Vector<IssmDouble>* ug_sed_main_iter=NULL;
     18        Vector<IssmDouble>* ug_sed_init=NULL;
    1819
    1920        Vector<IssmDouble>* ug_epl=NULL;
    2021        Vector<IssmDouble>* uf_epl=NULL;
    2122        Vector<IssmDouble>* uf_epl_sub_iter=NULL;
    22         Vector<IssmDouble>* ug_epl_sub_iter=NULL;
    2323        Vector<IssmDouble>* ug_epl_main_iter=NULL;
     24        Vector<IssmDouble>* ug_epl_init=NULL;
    2425
    2526        Vector<IssmDouble>* ys=NULL;
    2627        Vector<IssmDouble>* dug=NULL;
    27         Vector<IssmDouble>* duf=NULL;
    2828
    2929        Matrix<IssmDouble>* Kff=NULL;
     
    3838        bool       sedconverged,eplconverged,hydroconverged;
    3939        bool       isefficientlayer;
     40        bool       sliceadapt;
    4041        int        constraints_converged;
    4142        int        num_unstable_constraints;
    4243        int        sedcount,eplcount,hydrocount;
    4344        int        hydro_maxiter;
     45        int        epl_fsize,epl_sub_fsize,epl_main_fsize;
    4446        IssmDouble sediment_kmax;
    45         IssmDouble eps_hyd;
     47        IssmDouble eps_res,eps_rel,eps_abs;
    4648        IssmDouble ndu_sed,nu_sed;
    4749        IssmDouble ndu_epl,nu_epl;
     
    5052        femmodel->SetCurrentConfiguration(HydrologyDCInefficientAnalysisEnum);
    5153        femmodel->parameters->FindParam(&isefficientlayer,HydrologydcIsefficientlayerEnum);
     54        femmodel->parameters->FindParam(&sliceadapt,HydrologyStepAdaptEnum);
    5255        femmodel->parameters->FindParam(&hydro_maxiter,HydrologydcMaxIterEnum);
    53         femmodel->parameters->FindParam(&eps_hyd,HydrologydcRelTolEnum);
     56        femmodel->parameters->FindParam(&eps_res,StressbalanceRestolEnum);
     57        femmodel->parameters->FindParam(&eps_rel,HydrologydcRelTolEnum);
     58        femmodel->parameters->FindParam(&eps_abs,StressbalanceAbstolEnum);
    5459        hydrocount=1;
    5560        hydroconverged=false;
     
    5964        /*{{{*//*Retrieve inputs as the initial state for the non linear iteration*/
    6065        GetBasalSolutionFromInputsx(&ug_sed,femmodel);
     66        /*Initialize the IDS element mask to exclude frozen nodes*/
     67        inefanalysis->ElementizeIdsMask(femmodel);
     68
    6169        Reducevectorgtofx(&uf_sed, ug_sed, femmodel->nodes,femmodel->parameters);
     70        ug_sed_init=ug_sed->Duplicate();
     71        ug_sed->Copy(ug_sed_init);
     72
    6273        if(isefficientlayer) {
    6374                inefanalysis = new HydrologyDCInefficientAnalysis();
     
    6576                femmodel->SetCurrentConfiguration(HydrologyDCEfficientAnalysisEnum);
    6677                GetBasalSolutionFromInputsx(&ug_epl,femmodel);
    67                 /*Initialize the EPL element mask*/
    6878                inefanalysis->ElementizeEplMask(femmodel);
    6979                effanalysis->InitZigZagCounter(femmodel);
    70                 /*Initialize the IDS element mask*/
    71                 femmodel->SetCurrentConfiguration(HydrologyDCInefficientAnalysisEnum);
    72                 inefanalysis->ElementizeIdsMask(femmodel);
     80                Reducevectorgtofx(&uf_epl, ug_epl, femmodel->nodes,femmodel->parameters);
     81                ug_epl_init=ug_epl->Duplicate();
     82                ug_epl->Copy(ug_epl_init);
    7383        }
    7484        /*}}}*/
    7585        /*The real computation starts here, outermost loop is on the two layer system*/
    7686        for(;;){
    77 
    7887                sedcount=1;
    7988                eplcount=1;
     
    105114                                /*{{{*//*Core of the computation*/
    106115                                if(VerboseSolution()) _printf0_("Building Sediment Matrix...\n");
     116
    107117                                femmodel->profiler->Start(SEDMatrix);
    108118                                SystemMatricesx(&Kff,&Kfs,&pf,&df,&sediment_kmax,femmodel);
     
    114124                                femmodel->profiler->Start(SOLVER);
    115125                                Solverx(&uf_sed,Kff,pf,uf_sed_sub_iter,df,femmodel->parameters);
     126                                delete df;
    116127                                femmodel->profiler->Stop(SOLVER);
    117 
    118                                 delete Kff; delete pf; delete df;
    119128                                delete ug_sed;
    120129                                femmodel->profiler->Start(SEDUpdate);
     
    125134                                /*}}}*/
    126135                                if (!sedconverged){
     136                                        /*First check that all the penalizations are applied*/
    127137                                        if(VerboseConvergence()) _printf0_("   # Sediment unstable constraints = " << num_unstable_constraints << "\n");
    128                                         if(num_unstable_constraints==0) sedconverged = true;
     138                                        if(num_unstable_constraints==0) {
     139                                                sedconverged = true;
     140                                        }
     141                                        else{//clean up
     142                                                delete Kff;
     143                                                delete pf;
     144                                        }
    129145                                        if (sedcount>=hydro_maxiter){
     146                                                delete ug_sed;delete uf_sed;delete inefanalysis; delete ug_sed_main_iter;
     147                                                if(isefficientlayer)delete ug_epl;delete uf_epl;delete effanalysis; delete ug_epl_main_iter;
    130148                                                _error_("   maximum number of Sediment iterations (" << hydro_maxiter << ") exceeded");
     149
    131150                                        }
    132151                                }
     
    135154                                if(sedconverged)break;
    136155                        }
    137 
    138156                        /*}}}*//*End of the sediment penalization loop*/
    139157                        sedconverged=false;
    140 
    141158                        /*Checking convergence on the value of the sediment head*/
    142                         duf=uf_sed_sub_iter->Duplicate();_assert_(duf);
    143                         uf_sed_sub_iter->Copy(duf);
    144                         duf->AYPX(uf_sed,-1.0);
    145                         ndu_sed=duf->Norm(NORM_TWO);
    146                         delete duf;
    147                         nu_sed=uf_sed_sub_iter->Norm(NORM_TWO);
    148                         if (xIsNan<IssmDouble>(ndu_sed) || xIsNan<IssmDouble>(nu_sed)) _error_("convergence criterion is NaN!");
    149                         if (ndu_sed==0.0 && nu_sed==0.0) nu_sed=1.0e-6; /*Hacking the case where the layer is empty*/
    150                         if(VerboseConvergence()) _printf0_(setw(50) << left << "   Inner Sediment Convergence criterion:" << ndu_sed/nu_sed*100 << "%, aiming lower than " << eps_hyd*10*100 << " %\n");
    151                         if((ndu_sed/nu_sed)<eps_hyd*10.){
    152                                 if(VerboseConvergence()) _printf0_("   # Inner sediment convergence achieve \n");
    153                                 sedconverged=true;
    154                         }
    155                         delete uf_sed_sub_iter;
     159                        convergence(&sedconverged,Kff,pf,uf_sed,uf_sed_sub_iter,eps_res,eps_rel,eps_abs);
     160                        delete Kff; delete pf;delete uf_sed_sub_iter;
    156161                        if(sedconverged){
    157162                                femmodel->parameters->SetParam(sediment_kmax,HydrologySedimentKmaxEnum);
     
    176181                        for(;;){
    177182                                eplconverged=false;
    178                                 ug_epl_sub_iter=ug_epl->Duplicate();_assert_(ug_epl_sub_iter);
    179                                 ug_epl->Copy(ug_epl_sub_iter);
    180183                                /*{{{*//*Retrieve the EPL head slopes and compute EPL Thickness*/
    181184                                if(VerboseSolution()) _printf0_("computing EPL Head slope...\n");
     
    195198                                femmodel->profiler->Stop(EPLMasking);
    196199                                if(VerboseSolution()) _printf0_("Building EPL Matrix...\n");
     200                                uf_epl_sub_iter=uf_epl->Duplicate();_assert_(uf_epl_sub_iter);
     201                                uf_epl->Copy(uf_epl_sub_iter);
     202                                uf_epl->GetSize(&epl_sub_fsize);
    197203                                femmodel->profiler->Start(EPLMatrices);
    198204                                SystemMatricesx(&Kff,&Kfs,&pf,&df,NULL,femmodel);
    199205                                CreateNodalConstraintsx(&ys,femmodel->nodes);
    200                                 Reduceloadx(pf,Kfs,ys); delete Kfs;
    201                                 delete uf_epl;
     206                                Reduceloadx(pf,Kfs,ys);
     207                                delete Kfs;delete uf_epl;
    202208                                femmodel->profiler->Stop(EPLMatrices);
    203209                                femmodel->profiler->Start(SOLVER);
    204210                                Solverx(&uf_epl,Kff,pf,uf_epl_sub_iter,df,femmodel->parameters);
    205211                                femmodel->profiler->Stop(SOLVER);
    206 
    207                                 delete Kff; delete pf; delete df;
    208                                 delete uf_epl_sub_iter;
    209                                 uf_epl_sub_iter=uf_epl->Duplicate();_assert_(uf_epl_sub_iter);
    210                                 uf_epl->Copy(uf_epl_sub_iter);
    211                                 delete ug_epl;
     212                                delete df;delete ug_epl;
    212213                                femmodel->profiler->Start(EPLUpdate);
    213214                                Mergesolutionfromftogx(&ug_epl,uf_epl,ys,femmodel->nodes,femmodel->parameters); delete ys;
     
    215216                                ConstraintsStatex(&constraints_converged,&num_unstable_constraints,femmodel);
    216217                                femmodel->profiler->Stop(EPLUpdate);
    217 
    218                                 dug=ug_epl_sub_iter->Duplicate();_assert_(dug);
    219                                 ug_epl_sub_iter->Copy(dug);
    220                                 dug->AYPX(ug_epl,-1.0);
    221                                 ndu_epl=dug->Norm(NORM_TWO);
    222                                 delete dug;
    223                                 nu_epl=ug_epl_sub_iter->Norm(NORM_TWO);
    224                                 if (xIsNan<IssmDouble>(ndu_epl) || xIsNan<IssmDouble>(nu_epl)) _error_("convergence criterion is NaN!");
    225                                 if (ndu_epl==0.0 && nu_epl==0.0) nu_epl=1.0e-6; /*Hacking the case where the EPL is used but empty*/
    226                                 if(VerboseConvergence()) _printf0_(setw(50) << left << "   Inner EPL Convergence criterion:" << ndu_epl/nu_epl*100 << "%, aiming lower than " << eps_hyd*10*100 << " %\n");
    227                                 if((ndu_epl/nu_epl)<eps_hyd*10.) eplconverged=true;
    228                                 if (eplcount>=hydro_maxiter){
     218                                uf_epl->GetSize(&epl_fsize);
     219                                if(epl_fsize-epl_sub_fsize==0){
     220                                        convergence(&eplconverged,Kff,pf,uf_epl,uf_epl_sub_iter,eps_res,eps_rel,eps_abs);
     221                                        delete Kff; delete pf;
     222                                        /* if (ndu_epl==0.0 && nu_epl==0.0) nu_epl=1.0e-6; /\*Hacking the case where the EPL is used but empty*\/ */
     223                                }
     224                                else{
     225                                        delete Kff; delete pf;
     226                                }
     227
     228                                if (eplcount>=hydro_maxiter*9/10 && sliceadapt && !eplconverged) {
     229                                        if(VerboseSolution()) _printf0_("epl did not converged after "<<eplconverged<<" iteration, we refine the steping\n");
     230                                        *pconv_fail = true;
     231                                        InputUpdateFromSolutionx(femmodel,ug_epl_init);
     232                                        delete ug_epl_init;
     233                                        femmodel->SetCurrentConfiguration(HydrologyDCInefficientAnalysisEnum);
     234                                        InputUpdateFromSolutionx(femmodel,ug_sed_init);
     235                                        delete ug_sed_init;
     236                                        break;
     237                                }
     238                                else if (eplcount>=hydro_maxiter){
     239                                        delete ug_sed;delete uf_sed;delete inefanalysis;delete ug_sed_main_iter;
     240                                        delete ug_epl;delete uf_epl;delete effanalysis;delete ug_epl_main_iter;
    229241                                        _error_("   maximum number of EPL iterations (" << hydro_maxiter << ") exceeded");
     242
    230243                                }
    231244                                eplcount++;
    232 
    233                                 delete ug_epl_sub_iter;
     245                                delete uf_epl_sub_iter;
    234246                                if(eplconverged){
    235247                                        if(VerboseSolution()) _printf0_("eplconverged...\n");
    236                                         InputUpdateFromConstantx(femmodel,eplconverged,ConvergedEnum);
    237                                         InputUpdateFromSolutionx(femmodel,ug_epl);
    238248                                        effanalysis->ResetCounter(femmodel);
    239249                                        break;
     
    242252                }
    243253                femmodel->profiler->Stop(EPLLOOP);
     254                if(*pconv_fail){
     255                        break;
     256                }
    244257                /*}}}*//*End of the global EPL loop*/
    245258                /*{{{*//*Now dealing with the convergence of the whole system*/
     
    264277                        if (xIsNan<IssmDouble>(ndu_epl) || xIsNan<IssmDouble>(nu_epl)) _error_("EPL convergence criterion is NaN!");
    265278                        if (ndu_epl==0.0 && nu_epl==0.0) nu_epl=1.0e-6; /*Hacking the case where the EPL is used but empty*/
    266                         if (!xIsNan<IssmDouble>(eps_hyd)){
    267                                 if ((ndu_epl/nu_epl)<eps_hyd && (ndu_sed/nu_sed)<(eps_hyd)){
     279                        if (!xIsNan<IssmDouble>(eps_rel)){
     280                                if ((ndu_epl/nu_epl)<eps_rel && (ndu_sed/nu_sed)<(eps_rel)){
    268281                                        if (VerboseConvergence()) _printf0_(setw(50) << left << "   Converged after, " << hydrocount << " iterations \n");
    269282                                        hydroconverged=true;
    270283                                }
    271284                                else{
    272                                         if(VerboseConvergence()) _printf0_(setw(50) << left << "   Sediment Convergence criterion:" << ndu_sed/nu_sed*100 << "%, aiming lower than " << eps_hyd*100 << " %\n");
    273                                         if(VerboseConvergence()) _printf0_(setw(50) << left << "   EPL Convergence criterion:" << ndu_epl/nu_epl*100 << "%, aiming lower than " << eps_hyd*100 << " %\n");
     285                                        if(VerboseConvergence()) _printf0_(setw(50) << left << "   for iteration:" << hydrocount << " \n");
     286                                        if(VerboseConvergence()) _printf0_(setw(50) << left << "   Sediment Convergence criterion:" << ndu_sed/nu_sed*100 << "%, aiming lower than " << eps_rel*100 << " %\n");
     287                                        if(VerboseConvergence()) _printf0_(setw(50) << left << "   EPL Convergence criterion:" << ndu_epl/nu_epl*100 << "%, aiming lower than " << eps_rel*100 << " %\n");
    274288                                        hydroconverged=false;
    275289                                }
    276290                        }
    277291                        else _printf0_(setw(50) << left << "   Convergence criterion:" << ndu_sed/nu_sed*100 << " %\n");
     292
     293                        if (hydrocount>=hydro_maxiter*9/10  && sliceadapt && !hydroconverged) {
     294                                if(VerboseSolution()) _printf0_("hydrology main loop  did not converged after "<<hydrocount<<" iteration, we refine the steping\n");
     295                                *pconv_fail = true;
     296                                InputUpdateFromSolutionx(femmodel,ug_epl_init);
     297                                delete ug_epl_init;
     298                                femmodel->SetCurrentConfiguration(HydrologyDCInefficientAnalysisEnum);
     299                                InputUpdateFromSolutionx(femmodel,ug_sed_init);
     300                                delete ug_sed_init;
     301                                break;
     302                        }
    278303                        if (hydrocount>=hydro_maxiter){
    279304                                _error_("   maximum number for hydrological global iterations (" << hydro_maxiter << ") exceeded");
     305                                delete ug_sed;delete uf_sed;delete effanalysis;
     306                                delete ug_epl;  delete uf_epl;  delete inefanalysis;
    280307                        }
    281308                }
     
    284311        }
    285312        /*}}}*/
    286         if(isefficientlayer)InputUpdateFromSolutionx(femmodel,ug_epl);
    287         femmodel->SetCurrentConfiguration(HydrologyDCInefficientAnalysisEnum);
    288         InputUpdateFromSolutionx(femmodel,ug_sed);
     313        /*To deal with adaptative stepping we only save results if we are actually converged*/
     314        if(hydroconverged){
     315                if(isefficientlayer){
     316                        delete ug_epl_init;
     317                }
     318                delete ug_sed_init;
     319        }
    289320        /*Free resources: */
    290         delete ug_epl;
    291         delete ug_sed;
    292         delete uf_sed;
    293         delete uf_epl;
    294         delete uf_epl_sub_iter;
    295         delete inefanalysis;
    296         delete effanalysis;
     321        delete ug_epl;delete ug_sed;
     322        delete uf_sed;  delete uf_epl;
     323        delete inefanalysis;    delete effanalysis;
    297324}
  • issm/trunk-jpl/src/m/classes/hydrologydc.m

    r25024 r27177  
    1414                max_iter                 = 0;
    1515                steps_per_step           = 0;
     16                step_adapt               = 0;
    1617                averaging                = 0;
    1718                sedimentlimit_flag       = 0;
     
    6667                                list=[list,{'EplHead','HydrologydcMaskEplactiveNode','HydrologydcMaskEplactiveElt','EplHeadSlopeX','EplHeadSlopeY','HydrologydcEplThickness'}];
    6768                        end
    68                         if self.steps_per_step>1,
     69                        if self.steps_per_step>1 | self.step_adapt,
    6970                                list = [list,'EffectivePressureSubstep','SedimentHeadSubstep'];
    7071                                if self.isefficientlayer,
     
    9091                        self.max_iter                 = 100;
    9192                        self.steps_per_step           = 1;
     93                        self.step_adapt               = 0;
    9294                        self.averaging                = 0;
    9395                        self.sedimentlimit_flag       = 0;
     
    126128                        md = checkfield(md,'fieldname','hydrology.max_iter','>',0,'numel',1);
    127129                        md = checkfield(md,'fieldname','hydrology.steps_per_step','>',0,'numel',1);
     130                        md = checkfield(md,'fieldname','hydrology.step_adapt','numel',1,'values',[0 1]);
    128131                        md = checkfield(md,'fieldname','hydrology.averaging','numel',[1],'values',[0 1 2]);
    129132                        md = checkfield(md,'fieldname','hydrology.sedimentlimit_flag','numel',[1],'values',[0 1 2 3]);
     
    172175                        fielddisplay(self,'max_iter','maximum number of nonlinear iteration');
    173176                        fielddisplay(self,'steps_per_step','number of hydrology steps per timestep');
     177                        fielddisplay(self,'step_adapt', 'adaptative sub stepping  [1: true 0: false] default is 0');
    174178                        fielddisplay(self, 'averaging', 'averaging methods from short to long steps');
    175179                        disp(sprintf('%55s  0: Arithmetic (default)'));
     
    226230                        WriteData(fid,prefix,'object',self,'fieldname','max_iter','format','Integer');
    227231                        WriteData(fid,prefix,'object',self,'fieldname','steps_per_step','format','Integer');
     232                        WriteData(fid,prefix,'object',self,'fieldname','step_adapt','format','Boolean');
    228233                        WriteData(fid,prefix,'object',self,'fieldname','averaging','format','Integer');
    229234                        WriteData(fid,prefix,'object',self,'fieldname','sedimentlimit_flag','format','Integer');
  • issm/trunk-jpl/src/m/classes/hydrologydc.py

    r26059 r27177  
    2121        self.max_iter = 0
    2222        self.steps_per_step = 0
     23        self.step_adapt = 0
    2324        self.averaging = 0
    2425        self.sedimentlimit_flag = 0
     
    5354    def __repr__(self):  # {{{
    5455        # TODO:
    55         # - Convert all formatting to calls to <string>.format (see any 
     56        # - Convert all formatting to calls to <string>.format (see any
    5657        #   already converted <class>.__repr__ method for examples)
    5758        #
     
    6566        string = "%s\n%s" % (string, fielddisplay(self, 'max_iter', 'maximum number of nonlinear iteration'))
    6667        string = "%s\n%s" % (string, fielddisplay(self, 'steps_per_step', 'number of hydrology steps per time step'))
     68        string = "%s\n%s" % (string, fielddisplay(self, 'step_adapt', 'adaptative sub stepping  [1: true 0: false] default is 0'))
    6769        string = "%s\n%s" % (string, fielddisplay(self, 'averaging', 'averaging methods from short to long steps'))
    6870        string = "%s\n\t\t%s" % (string, '0: Arithmetic (default)')
     
    134136        self.max_iter = 100
    135137        self.steps_per_step = 1
     138        self.step_adapt = 0
    136139        self.averaging = 0
    137140        self.sedimentlimit_flag = 0
     
    162165        if self.isefficientlayer == 1:
    163166            list.extend(['EplHead', 'HydrologydcMaskEplactiveNode', 'HydrologydcMaskEplactiveElt', 'EplHeadSlopeX', 'EplHeadSlopeY', 'HydrologydcEplThickness'])
    164         if self.steps_per_step > 1:
     167        if self.steps_per_step > 1 or self.step_adapt:
    165168            list.extend(['EffectivePressureSubstep', 'SedimentHeadSubstep'])
    166169            if self.isefficientlayer == 1:
     
    190193        md = checkfield(md, 'fieldname', 'hydrology.max_iter', '>', 0., 'numel', [1])
    191194        md = checkfield(md, 'fieldname', 'hydrology.steps_per_step', '>=', 1, 'numel', [1])
     195        md = checkfield(md, 'fieldname', 'hydrology.step_adapt', 'numel', [1], 'values', [0, 1])
    192196        md = checkfield(md, 'fieldname', 'hydrology.averaging', 'numel', [1], 'values', [0, 1, 2])
    193197        md = checkfield(md, 'fieldname', 'hydrology.sedimentlimit_flag', 'numel', [1], 'values', [0, 1, 2, 3])
     
    233237        WriteData(fid, prefix, 'object', self, 'fieldname', 'max_iter', 'format', 'Integer')
    234238        WriteData(fid, prefix, 'object', self, 'fieldname', 'steps_per_step', 'format', 'Integer')
     239        WriteData(fid, prefix, 'object', self, 'fieldname', 'step_adapt', 'format', 'Boolean')
    235240        WriteData(fid, prefix, 'object', self, 'fieldname', 'averaging', 'format', 'Integer')
    236241        WriteData(fid, prefix, 'object', self, 'fieldname', 'sedimentlimit_flag', 'format', 'Integer')
Note: See TracChangeset for help on using the changeset viewer.