Changeset 18589


Ignore:
Timestamp:
10/08/14 02:06:27 (10 years ago)
Author:
jbondzio
Message:

CHG: use solutionsequence_thermal_nonlinear for enthalpy

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

Legend:

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

    r18521 r18589  
    1515
    1616        parameters->AddObject(iomodel->CopyConstantObject(ThermalStabilizationEnum));
     17        parameters->AddObject(iomodel->CopyConstantObject(ThermalMaxiterEnum));
     18        parameters->AddObject(iomodel->CopyConstantObject(ThermalReltolEnum));
    1719        parameters->AddObject(iomodel->CopyConstantObject(ThermalIsenthalpyEnum));
    1820        parameters->AddObject(iomodel->CopyConstantObject(ThermalIsdynamicbasalspcEnum));
  • TabularUnified issm/trunk-jpl/src/c/cores/thermal_core.cpp

    r18237 r18589  
    3131                if(VerboseSolution()) _printf0_("   computing enthalpy\n");
    3232                femmodel->SetCurrentConfiguration(EnthalpyAnalysisEnum);
    33                 solutionsequence_nonlinear(femmodel,true);
     33                solutionsequence_thermal_nonlinear(femmodel);
    3434
    3535                /*transfer enthalpy to enthalpy picard for the next step: */
  • TabularUnified issm/trunk-jpl/src/c/solutionsequences/convergence.cpp

    r15771 r18589  
    2323        IssmDouble nF;
    2424        IssmDouble solver_residue,res;
     25        int analysis_type;
    2526
    2627        /*convergence options*/
     
    4142        /*get convergence options*/
    4243        parameters->FindParam(&eps_res,StressbalanceRestolEnum);
    43         parameters->FindParam(&eps_rel,StressbalanceReltolEnum);
     44        // get analysis type
     45        parameters->FindParam(&analysis_type,AnalysisTypeEnum);
     46        if(analysis_type==StressbalanceAnalysisEnum)
     47                parameters->FindParam(&eps_rel,StressbalanceReltolEnum);
     48        else if(analysis_type==EnthalpyAnalysisEnum)
     49                parameters->FindParam(&eps_rel,ThermalReltolEnum);
    4450        parameters->FindParam(&eps_abs,StressbalanceAbstolEnum);
    4551        parameters->FindParam(&yts,ConstantsYtsEnum);
  • TabularUnified issm/trunk-jpl/src/c/solutionsequences/solutionsequence_thermal_nonlinear.cpp

    r17271 r18589  
    33 */
    44
     5#include "./solutionsequences.h"
    56#include "../toolkits/toolkits.h"
    67#include "../classes/classes.h"
     
    2425
    2526        bool converged;
     27        bool isenthalpy, isdynamicbasalspc;
    2628        int constraints_converged;
    2729        int num_unstable_constraints;
     
    2931        int thermal_penalty_threshold;
    3032        int thermal_maxiter;
     33        IssmDouble thermal_reltol;
    3134
    3235        /*parameters:*/
     
    3437
    3538        /*Recover parameters: */
    36         femmodel->parameters->FindParam(&thermal_penalty_threshold,ThermalPenaltyThresholdEnum);
     39        femmodel->parameters->FindParam(&isenthalpy,ThermalIsenthalpyEnum);
    3740        femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
    3841        femmodel->parameters->FindParam(&thermal_maxiter,ThermalMaxiterEnum);
    3942
     43        converged=false;
     44        InputUpdateFromConstantx(femmodel,converged,ConvergedEnum);
     45
     46        if(isenthalpy){
     47                femmodel->parameters->FindParam(&isdynamicbasalspc,ThermalIsdynamicbasalspcEnum);
     48                femmodel->parameters->FindParam(&thermal_reltol,ThermalReltolEnum);
     49                femmodel->UpdateConstraintsx();
     50
     51                //Update the solution to make sure that vx and vxold are similar (for next step in transient or steadystate)
     52                GetSolutionFromInputsx(&tg,femmodel);
     53                Reducevectorgtofx(&tf, tg, femmodel->nodes,femmodel->parameters);
     54                InputUpdateFromSolutionx(femmodel,tg);
     55        }
     56        else{
     57                femmodel->parameters->FindParam(&thermal_penalty_threshold,ThermalPenaltyThresholdEnum);
     58                InputUpdateFromConstantx(femmodel,true,ResetPenaltiesEnum);
     59                femmodel->UpdateConstraintsx();
     60        }
     61
    4062        count=1;
    41         converged=false;
     63       
     64        for(;;){
     65                delete tf_old;tf_old=tf;
     66                delete tg;
    4267
    43         InputUpdateFromConstantx(femmodel,true,ResetPenaltiesEnum);
    44         InputUpdateFromConstantx(femmodel,false,ConvergedEnum);
    45         femmodel->UpdateConstraintsx();
    46 
    47         for(;;){
    48 
    49                 delete tf_old; tf_old=tf;
    50                 SystemMatricesx(&Kff, &Kfs, &pf,&df, &melting_offset,femmodel);
     68                if(isenthalpy) SystemMatricesx(&Kff,&Kfs,&pf,&df,NULL,femmodel);
     69                else SystemMatricesx(&Kff, &Kfs, &pf,&df, &melting_offset,femmodel);
    5170                CreateNodalConstraintsx(&ys,femmodel->nodes,configuration_type);
    5271                Reduceloadx(pf, Kfs, ys); delete Kfs;
    53                 Solverx(&tf, Kff, pf,tf_old, df, femmodel->parameters);
    54                 delete Kff;delete pf;delete tg; delete df;
     72                Solverx(&tf, Kff, pf, tf_old, df, femmodel->parameters);
    5573                Mergesolutionfromftogx(&tg, tf,ys,femmodel->nodes,femmodel->parameters); delete ys;
     74                if(isenthalpy){
     75                        convergence(&converged,Kff,pf,tf,tf_old,femmodel->parameters); delete Kff; delete pf; delete df;
     76                        InputUpdateFromConstantx(femmodel,converged,ConvergedEnum);
     77                }
    5678                InputUpdateFromSolutionx(femmodel,tg);
     79                ConstraintsStatex(&constraints_converged,&num_unstable_constraints,femmodel);
     80                if(VerboseConvergence()) _printf0_("   number of unstable constraints: " << num_unstable_constraints << "\n");
    5781
    58                 ConstraintsStatex(&constraints_converged,&num_unstable_constraints,femmodel);
    59 
    60                 if (!converged){
    61                         if(VerboseConvergence()) _printf0_("   #unstable constraints = " << num_unstable_constraints << "\n");
    62                         if (num_unstable_constraints <= thermal_penalty_threshold)converged=true;
    63                         if (count>=thermal_maxiter){
     82                if(isenthalpy){
     83                        /*Increase count: */
     84                        count++;
     85                        if(converged==true){
     86                                bool max_iteration_state=false;
     87                                int step; IssmDouble time;
     88                                femmodel->parameters->FindParam(&time,TimeEnum);
     89                                femmodel->parameters->FindParam(&step,StepEnum);
     90                                femmodel->results->AddObject(new GenericExternalResult<bool>(femmodel->results->Size()+1, MaxIterationConvergenceFlagEnum, max_iteration_state, step, time));
     91                                break;
     92                        }
     93                        if(count>=thermal_maxiter){
     94                                _printf0_("   maximum number of nonlinear iterations (" << thermal_maxiter << ") exceeded\n");
    6495                                converged=true;
    65                                 _printf0_("   maximum number of iterations (" << thermal_maxiter << ") exceeded\n");
     96                                InputUpdateFromConstantx(femmodel,converged,ConvergedEnum);
     97                                InputUpdateFromSolutionx(femmodel,tg);         
     98                                bool max_iteration_state=true;
     99                                int step; IssmDouble time;
     100                                femmodel->parameters->FindParam(&time,TimeEnum);
     101                                femmodel->parameters->FindParam(&step,StepEnum);
     102                                femmodel->results->AddObject(new GenericExternalResult<bool>(femmodel->results->Size()+1, MaxIterationConvergenceFlagEnum, max_iteration_state, step, time));
     103                                break;
    66104                        }
    67105                }
    68                 count++;
    69 
    70                 InputUpdateFromConstantx(femmodel,converged,ConvergedEnum);
    71 
    72                 if(converged)break;
     106                else{
     107                        if(!converged){
     108                                if(num_unstable_constraints<=thermal_penalty_threshold) converged=true;
     109                                if(count>=thermal_maxiter){
     110                                        converged=true;
     111                                        _printf0_("   maximum number of iterations (" << thermal_maxiter << ") exceeded\n");
     112                                }
     113                        }
     114                        count++;
     115                        InputUpdateFromConstantx(femmodel,converged,ConvergedEnum);
     116                        if(converged)break;
     117                }
    73118        }
    74119
    75         InputUpdateFromSolutionx(femmodel,tg);
    76         femmodel->parameters->SetParam(melting_offset,MeltingOffsetEnum);
     120        if(isenthalpy){
     121                if(VerboseConvergence()) _printf0_("\n   total number of iterations: " << count-1 << "\n");
     122        }
     123        else{
     124                InputUpdateFromSolutionx(femmodel,tg);
     125                femmodel->parameters->SetParam(melting_offset,MeltingOffsetEnum);
     126        }
    77127
    78128        /*Free ressources: */
Note: See TracChangeset for help on using the changeset viewer.