Changeset 15077


Ignore:
Timestamp:
05/22/13 09:24:09 (12 years ago)
Author:
bdef
Message:

BUG: fixing segmentation fault

File:
1 edited

Legend:

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

    r15062 r15077  
    2929        int        constraints_converged;
    3030        int        num_unstable_constraints;
    31         int        count;
     31        int        sedcount,eplcount,hydrocount;
    3232        int        hydro_maxiter;
    3333        IssmDouble sediment_kmax,time;
     
    4343        femmodel->BasisIntegralsx();
    4444        hydro_maxiter=100;
    45         count=1;
     45        hydrocount=1;
    4646        sedconverged=false;
    4747        eplconverged=false;
     
    6060
    6161        for(;;){
     62                sedcount=1;
     63                eplcount=1;
    6264                //save pointer to old velocity
    6365                delete aged_uf_sed;aged_uf_sed=uf_sed;
     
    7880                        femmodel->SystemMatricesx(&Kff, &Kfs, &pf,&df, &sediment_kmax);
    7981                        CreateNodalConstraintsx(&ys,femmodel->nodes,HydrologyDCInefficientAnalysisEnum);
    80                         Reduceloadx(pf,Kfs,ys); delete Kfs; delete uf_sed;
     82                        Reduceloadx(pf,Kfs,ys); delete Kfs;
     83                        if(sedcount>1)delete uf_sed;
    8184                        Solverx(&uf_sed, Kff, pf,old_uf, df, femmodel->parameters);
    8285                        delete old_uf; old_uf=uf_sed->Duplicate();
     
    9093                                if(VerboseConvergence()) _pprintLine_("   #unstable constraints = " << num_unstable_constraints);
    9194                                if(num_unstable_constraints==0) sedconverged = true;
    92                                 if (count>=hydro_maxiter){
    93                                         _error_("   maximum number of iterations (" << hydro_maxiter << ") exceeded");
    94                                 }
    95                         }
    96                         count++;
     95                                if (sedcount>=hydro_maxiter){
     96                                        _error_("   maximum number of Sediment iterations (" << hydro_maxiter << ") exceeded");
     97                                }
     98                        }
     99                        sedcount++;
    97100
    98101                        if(sedconverged){
     
    117120                        femmodel->SystemMatricesx(&Kff, &Kfs, &pf,&df,NULL);
    118121                        CreateNodalConstraintsx(&ys,femmodel->nodes,HydrologyDCEfficientAnalysisEnum);
    119                         Reduceloadx(pf,Kfs,ys); delete Kfs; delete uf_epl;
     122                        Reduceloadx(pf,Kfs,ys); delete Kfs;
     123                        if(eplcount>1) delete uf_epl;
    120124                        Solverx(&uf_epl, Kff, pf,old_uf, df, femmodel->parameters);
    121125                        delete old_uf; old_uf=uf_epl->Duplicate();
     
    129133                                if(VerboseConvergence()) _pprintLine_("   #unstable constraints = " << num_unstable_constraints);
    130134                                if(num_unstable_constraints==0) eplconverged = true;
    131                                 if (count>=hydro_maxiter){
    132                                         _error_("   maximum number of iterations (" << hydro_maxiter << ") exceeded");
    133                                 }
    134                         }
    135                         count++;
     135                                if (eplcount>=hydro_maxiter){
     136                                        _error_("   maximum number of EPL iterations (" << hydro_maxiter << ") exceeded");
     137                                }
     138                        }
     139                        eplcount++;
    136140
    137141                        if(eplconverged){
     
    148152                        _assert_(aged_uf_sed); _assert_(uf_sed);
    149153                        duf=uf_sed->Duplicate(); _assert_(duf);
    150                         aged_uf_sed->Copy(duf); duf->AYPX(uf_sed,-1.0);
     154                        aged_uf_sed->Copy(duf);
     155                        duf->AYPX(uf_sed,-1.0);
    151156                        ndu_sed=duf->Norm(NORM_TWO); nu_sed=aged_uf_sed->Norm(NORM_TWO);
    152157                        if (xIsNan<IssmDouble>(ndu_sed) || xIsNan<IssmDouble>(nu_sed)) _error_("convergence criterion is NaN!");
    153                        
    154158                        if(isefficientlayer){
    155159                                duf=aged_uf_epl->Duplicate(); aged_uf_epl->Copy(duf); duf->AYPX(uf_epl,-1.0);
     
    160164                        if (!xIsNan<IssmDouble>(eps_hyd)){
    161165                                if((ndu_sed/nu_sed)<eps_hyd){
    162                                         if(VerboseConvergence()) _pprintLine_(setw(50) << left << "   Sediment Convergence criterion: norm(du)/norm(u)" << ndu_sed/nu_sed*100 << " < " << eps_hyd*100 << " %");
     166                                        if(VerboseConvergence()) _pprintLine_(setw(50) << left << "   Sediment Convergence criterion:" << ndu_sed/nu_sed*100 << " < " << eps_hyd*100 << " %");
    163167                                        hydroconverged=true;
    164168                                }
    165169                                else{
    166                                         if(VerboseConvergence()) _pprintLine_(setw(50) << left << "   Sediment Convergence criterion: norm(du)/norm(u)" << ndu_sed/nu_sed*100 << " > " << eps_hyd*100 << " %");
     170                                        if(VerboseConvergence()) _pprintLine_(setw(50) << left << "   Sediment Convergence criterion:" << ndu_sed/nu_sed*100 << " > " << eps_hyd*100 << " %");
    167171                                        hydroconverged=false;
    168172                                }
    169173                                if(isefficientlayer){
    170174                                        if((ndu_epl/nu_epl)<eps_hyd){
    171                                                 if(VerboseConvergence()) _pprintLine_(setw(50) << left << "   EPL Convergence criterion: norm(du)/norm(u)" << ndu_epl/nu_epl*100 << " < " << eps_hyd*100 << " %");
     175                                                if(VerboseConvergence()) _pprintLine_(setw(50) << left << "   EPL Convergence criterion:" << ndu_epl/nu_epl*100 << " < " << eps_hyd*100 << " %");
    172176                                        }
    173177                                        else{
    174                                                 if(VerboseConvergence()) _pprintLine_(setw(50) << left << "   EPL Convergence criterion: norm(du)/norm(u)" << ndu_epl/nu_epl*100 << " > " << eps_hyd*100 << " %");
     178                                                if(VerboseConvergence()) _pprintLine_(setw(50) << left << "   EPL Convergence criterion:" << ndu_epl/nu_epl*100 << " > " << eps_hyd*100 << " %");
    175179                                                hydroconverged=false;
    176180                                        }
    177181                                }
    178182                        }
    179                         else _pprintLine_(setw(50) << left << "   Convergence criterion: norm(du)/norm(u)" << ndu_sed/nu_sed*100 << " %");
    180                 }
    181        
     183                        else _pprintLine_(setw(50) << left << "   Convergence criterion:" << ndu_sed/nu_sed*100 << " %");
     184                        if (hydrocount>=hydro_maxiter){
     185                                _error_("   maximum number for hydrological global iterations (" << hydro_maxiter << ") exceeded");
     186                        }
     187                }
     188                hydrocount++;
     189                       
    182190                if(hydroconverged)break;
    183191        }
Note: See TracChangeset for help on using the changeset viewer.