Changeset 15161


Ignore:
Timestamp:
05/30/13 10:08:07 (12 years ago)
Author:
bdef
Message:

BUG: fixing the convergence issue in the hydrological solver

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

Legend:

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

    r15104 r15161  
    8181                        InputDuplicatex(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,SedimentHeadEnum,SedimentHeadOldEnum);
    8282                        femmodel->parameters->FindParam(&isefficientlayer,HydrologydcIsefficientlayerEnum);
    83 
    84                         if(VerboseSolution()) _printf0_("   computing water transfer\n");
     83                        if (isefficientlayer){
     84                                InputDuplicatex(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,EplHeadEnum,EplHeadOldEnum);
     85                        }
    8586
    8687                        if(VerboseSolution()) _printf0_("   computing water head\n");
  • issm/trunk-jpl/src/c/classes/Elements/Tria.cpp

    r15151 r15161  
    21352135                                name==SedimentHeadOldEnum ||
    21362136                                name==SedimentHeadEnum ||
     2137                                name==EplHeadOldEnum ||
     2138                                name==EplHeadEnum ||
    21372139                                name==WaterTransferEnum ||
    21382140                                name==BasisIntegralEnum ||
     
    62186220
    62196221        if(reCast<bool,IssmDouble>(dt)){
    6220                 old_wh_input=inputs->GetInput(EplHeadEnum); _assert_(old_wh_input);
     6222                old_wh_input=inputs->GetInput(EplHeadOldEnum); _assert_(old_wh_input);
    62216223        }
    62226224
     
    64076409                this->parameters->FindParam(&penalty_factor,HydrologydcPenaltyFactorEnum);
    64086410                kappa=kmax*pow(10.,penalty_factor);
    6409 
     6411               
    64106412                for(int i=0;i<NUMVERTICES;i++){
    64116413                        this->GetHydrologyDCInefficientHmax(&h_max,nodes[i]);
     
    64176419                                residual[i]=0.0;
    64186420                }
     6421                if(this->id==1)printf("residual, %g \n", residual[1]);
     6422                if(this->id==1)printf("hSed, %g \n", values[1]);
    64196423        }
    64206424        /*Add input to the element: */
     
    64226426        this->inputs->AddInput(new TriaP1Input(SedimentHeadEnum,values));
    64236427        this->inputs->AddInput(new TriaP1Input(SedimentHeadResidualEnum,residual));
    6424         if(converged)this->inputs->AddInput(new TriaP1Input(SedimentHeadOldEnum,values));
    64256428
    64266429        /*Free ressources:*/
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/HydrologyDCInefficient/UpdateElementsHydrologyDCInefficient.cpp

    r15006 r15161  
    4343        iomodel->FetchDataToInput(elements,BasalforcingsMeltingRateEnum);
    4444        iomodel->FetchDataToInput(elements,SedimentHeadEnum);
    45         /*      iomodel->FetchDataToInput(elements,SedimentHeadOldEnum);*/
    4645
    4746        /*Free data: */
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r15150 r15161  
    9090        SedimentHeadResidualEnum,
    9191        EplHeadEnum,
     92        EplHeadOldEnum,
    9293  HydrologydcRelTolEnum,
    9394        HydrologydcSpcsedimentHeadEnum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r15150 r15161  
    9898                case SedimentHeadResidualEnum : return "SedimentHeadResidual";
    9999                case EplHeadEnum : return "EplHead";
     100                case EplHeadOldEnum : return "EplHeadOld";
    100101                case HydrologydcRelTolEnum : return "HydrologydcRelTol";
    101102                case HydrologydcSpcsedimentHeadEnum : return "HydrologydcSpcsedimentHead";
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r15150 r15161  
    9898              else if (strcmp(name,"SedimentHeadResidual")==0) return SedimentHeadResidualEnum;
    9999              else if (strcmp(name,"EplHead")==0) return EplHeadEnum;
     100              else if (strcmp(name,"EplHeadOld")==0) return EplHeadOldEnum;
    100101              else if (strcmp(name,"HydrologydcRelTol")==0) return HydrologydcRelTolEnum;
    101102              else if (strcmp(name,"HydrologydcSpcsedimentHead")==0) return HydrologydcSpcsedimentHeadEnum;
     
    136137              else if (strcmp(name,"InversionMinParameters")==0) return InversionMinParametersEnum;
    137138              else if (strcmp(name,"InversionNsteps")==0) return InversionNstepsEnum;
    138               else if (strcmp(name,"InversionNumControlParameters")==0) return InversionNumControlParametersEnum;
    139139         else stage=2;
    140140   }
    141141   if(stage==2){
    142               if (strcmp(name,"InversionNumCostFunctions")==0) return InversionNumCostFunctionsEnum;
     142              if (strcmp(name,"InversionNumControlParameters")==0) return InversionNumControlParametersEnum;
     143              else if (strcmp(name,"InversionNumCostFunctions")==0) return InversionNumCostFunctionsEnum;
    143144              else if (strcmp(name,"InversionStepThreshold")==0) return InversionStepThresholdEnum;
    144145              else if (strcmp(name,"InversionThicknessObs")==0) return InversionThicknessObsEnum;
     
    259260              else if (strcmp(name,"TimesteppingStartTime")==0) return TimesteppingStartTimeEnum;
    260261              else if (strcmp(name,"TimesteppingFinalTime")==0) return TimesteppingFinalTimeEnum;
    261               else if (strcmp(name,"TimesteppingCflCoefficient")==0) return TimesteppingCflCoefficientEnum;
    262262         else stage=3;
    263263   }
    264264   if(stage==3){
    265               if (strcmp(name,"TimesteppingTimeAdapt")==0) return TimesteppingTimeAdaptEnum;
     265              if (strcmp(name,"TimesteppingCflCoefficient")==0) return TimesteppingCflCoefficientEnum;
     266              else if (strcmp(name,"TimesteppingTimeAdapt")==0) return TimesteppingTimeAdaptEnum;
    266267              else if (strcmp(name,"TimesteppingTimeStep")==0) return TimesteppingTimeStepEnum;
    267268              else if (strcmp(name,"TransientIsdiagnostic")==0) return TransientIsdiagnosticEnum;
     
    382383              else if (strcmp(name,"SpcDynamic")==0) return SpcDynamicEnum;
    383384              else if (strcmp(name,"SpcStatic")==0) return SpcStaticEnum;
    384               else if (strcmp(name,"SpcTransient")==0) return SpcTransientEnum;
    385385         else stage=4;
    386386   }
    387387   if(stage==4){
    388               if (strcmp(name,"StokesIceFront")==0) return StokesIceFrontEnum;
     388              if (strcmp(name,"SpcTransient")==0) return SpcTransientEnum;
     389              else if (strcmp(name,"StokesIceFront")==0) return StokesIceFrontEnum;
    389390              else if (strcmp(name,"StringArrayParam")==0) return StringArrayParamEnum;
    390391              else if (strcmp(name,"StringParam")==0) return StringParamEnum;
     
    505506              else if (strcmp(name,"PentaP1ElementResult")==0) return PentaP1ElementResultEnum;
    506507              else if (strcmp(name,"StringExternalResult")==0) return StringExternalResultEnum;
    507               else if (strcmp(name,"Step")==0) return StepEnum;
    508508         else stage=5;
    509509   }
    510510   if(stage==5){
    511               if (strcmp(name,"Time")==0) return TimeEnum;
     511              if (strcmp(name,"Step")==0) return StepEnum;
     512              else if (strcmp(name,"Time")==0) return TimeEnum;
    512513              else if (strcmp(name,"TriaP1ElementResult")==0) return TriaP1ElementResultEnum;
    513514              else if (strcmp(name,"WaterColumnOld")==0) return WaterColumnOldEnum;
  • issm/trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp

    r15106 r15161  
    154154                        duf->AYPX(uf_sed,-1.0);
    155155                        ndu_sed=duf->Norm(NORM_TWO); nu_sed=aged_uf_sed->Norm(NORM_TWO);
    156                         if (xIsNan<IssmDouble>(ndu_sed) || xIsNan<IssmDouble>(nu_sed)) _error_("convergence criterion is NaN!");
    157                         if(isefficientlayer){
    158                                 duf=aged_uf_epl->Duplicate(); aged_uf_epl->Copy(duf); duf->AYPX(uf_epl,-1.0);
    159                                 ndu_epl=duf->Norm(NORM_TWO); nu_epl=aged_uf_epl->Norm(NORM_TWO);
    160                                 if (xIsNan<IssmDouble>(ndu_epl) || xIsNan<IssmDouble>(nu_epl)) _error_("convergence criterion is NaN!");
    161                         }
    162                         //print
     156                        if (xIsNan<IssmDouble>(ndu_sed) || xIsNan<IssmDouble>(nu_sed)) _error_("Sed convergence criterion is NaN!");
    163157                        if (!xIsNan<IssmDouble>(eps_hyd)){
    164                                 if((ndu_sed/nu_sed)<eps_hyd){
    165                                         if(VerboseConvergence()) _printf0_(setw(50) << left << "   Sediment Convergence criterion:" << ndu_sed/nu_sed*100 << " < " << eps_hyd*100 << " %\n");
    166                                         hydroconverged=true;
    167                                 }
    168                                 else{
    169                                         if(VerboseConvergence()) _printf0_(setw(50) << left << "   Sediment Convergence criterion:" << ndu_sed/nu_sed*100 << " > " << eps_hyd*100 << " %\n");
    170                                         hydroconverged=false;
    171                                 }
    172                                 if(isefficientlayer){
    173                                         if((ndu_epl/nu_epl)<eps_hyd){
    174                                                 if(VerboseConvergence()) _printf0_(setw(50) << left << "   EPL Convergence criterion:" << ndu_epl/nu_epl*100 << " < " << eps_hyd*100 << " %\n");
     158                                if (!isefficientlayer){
     159                                        if ((ndu_sed/nu_sed)<eps_hyd){
     160                                                if(VerboseConvergence()) _printf0_(setw(50) << left << "   Converged");
     161                                                hydroconverged=true;
    175162                                        }
    176163                                        else{
    177                                                 if(VerboseConvergence()) _printf0_(setw(50) << left << "   EPL Convergence criterion:" << ndu_epl/nu_epl*100 << " > " << eps_hyd*100 << " %\n");
     164                                                if(VerboseConvergence()) _printf0_(setw(50) << left << "   Sediment Convergence criterion:" << ndu_sed/nu_sed*100 << " > " << eps_hyd*100 << " %\n");
     165                                                hydroconverged=false;
     166                                        }
     167                                }
     168                                else{
     169                                        duf=aged_uf_epl->Duplicate(); aged_uf_epl->Copy(duf); duf->AYPX(uf_epl,-1.0);
     170                                        ndu_epl=duf->Norm(NORM_TWO); nu_epl=aged_uf_epl->Norm(NORM_TWO);
     171                                        if (xIsNan<IssmDouble>(ndu_epl) || xIsNan<IssmDouble>(nu_epl)) _error_("EPL convergence criterion is NaN!");
     172                                        if (ndu_epl==0.0 && nu_epl==0.0) nu_epl=1.0e-6; /*Hacking the case where the EPL is used but empty*/
     173                                        if ((ndu_epl/nu_epl)<eps_hyd && (ndu_sed/nu_sed)<eps_hyd){
     174                                                if (VerboseConvergence()) _printf0_(setw(50) << left << "   Converged");
     175                                                hydroconverged=true;
     176                                        }
     177                                        else{
     178                                                if(VerboseConvergence()) _printf0_(setw(50) << left << "   Sediment Convergence criterion:" << ndu_sed/nu_sed*100 << " aiming lower than " << eps_hyd*100 << " % ;"<<ndu_sed <<";"<<nu_sed <<"\n");
     179                                                if(VerboseConvergence()) _printf0_(setw(50) << left << "   EPL Convergence criterion:" << ndu_epl/nu_epl*100 << " aiming lower than " << eps_hyd*100 << ";"<<ndu_epl <<";"<<nu_epl <<" %\n");
    178180                                                hydroconverged=false;
    179181                                        }
     
    186188                }
    187189                hydrocount++;
    188 
    189190                if(hydroconverged)break;
    190191        }
    191192
    192193        InputUpdateFromSolutionx(femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,ug);
    193 
     194       
    194195        /*Free ressources: */
    195196        delete ug;
Note: See TracChangeset for help on using the changeset viewer.