Ice Sheet System Model  4.18
Code documentation
Functions
Solverx.h File Reference

solver More...

#include "../../toolkits/toolkits.h"

Go to the source code of this file.

Functions

void Solverx (Vector< IssmDouble > **puf, Matrix< IssmDouble > *Kff, Vector< IssmDouble > *pf, Vector< IssmDouble > *uf0, Vector< IssmDouble > *df, Parameters *parameters)
 
bool checkconvergence (Matrix< IssmDouble > *Kff, Vector< IssmDouble > *pf, Vector< IssmDouble > *uf, Parameters *parameters)
 

Detailed Description

solver

Definition in file Solverx.h.

Function Documentation

◆ Solverx()

void Solverx ( Vector< IssmDouble > **  puf,
Matrix< IssmDouble > *  Kff,
Vector< IssmDouble > *  pf,
Vector< IssmDouble > *  uf0,
Vector< IssmDouble > *  df,
Parameters parameters 
)

Definition at line 15 of file Solverx.cpp.

15  {
16 
17  /*Create Solver Object*/
18  Solver<IssmDouble>* solver=new Solver<IssmDouble>(Kff,pf,uf0,df,parameters);
19 
20  /*Solve:*/
21  if(VerboseModule()) _printf0_(" Solving matrix system\n");
22  Vector<IssmDouble>* uf=solver->Solve();
23 
24  /*Check convergence, if failed, try recovery model*/
25  if(!checkconvergence(Kff,pf,uf,parameters)){
26 
27  _printf0_("WARNING: Solver failed, Trying Recovery Mode\n");
29  delete uf;
30  uf=solver->Solve();
31 
32  if(!checkconvergence(Kff,pf,uf,parameters)) _error_("Recovery solver failed...");
33  }
34 
35  /*clean up and assign output pointers:*/
36  _assert_(puf);
37  delete solver;
38  *puf=uf;
39 }

◆ checkconvergence()

bool checkconvergence ( Matrix< IssmDouble > *  Kff,
Vector< IssmDouble > *  pf,
Vector< IssmDouble > *  uf,
Parameters parameters 
)

Definition at line 40 of file Solverx.cpp.

40  {
41 
42  /*Recover parameters: */
43  IssmDouble solver_residue_threshold;
44  parameters->FindParam(&solver_residue_threshold,SettingsSolverResidueThresholdEnum);
45 
46  /*don't check convergence if NaN*/
47  if(xIsNan<IssmDouble>(solver_residue_threshold)) return true;
48 
49  /*compute KUF = KU - F = K*U - F*/
50  Vector<IssmDouble>* KU = uf->Duplicate(); Kff->MatMult(uf,KU);
51  Vector<IssmDouble>* KUF = KU->Duplicate(); KU->Copy(KUF); KUF->AYPX(pf,-1.);
52  delete KU;
53 
54  /*compute norm(KUF), norm(F)*/
55  IssmDouble nKUF=KUF->Norm(NORM_TWO);
56  IssmDouble nF=pf->Norm(NORM_TWO);
57  delete KUF;
58 
59  /*Check solver residue*/
60  IssmDouble solver_residue = 0.;
61  if(nF>0.) solver_residue = nKUF/(nF);
62  if(VerboseConvergence()) _printf0_("\n solver residue: norm(KU-F)/norm(F)=" << solver_residue << "\n");
63  if(xIsNan<IssmDouble>(solver_residue)) _error_("Solver residue is NaN");
64 
65  /*Check convergence*/
66  if(solver_residue>solver_residue_threshold){
67  _printf0_("solver residue too high!: norm(KU-F)/norm(F)=" << solver_residue << " > "<<solver_residue_threshold<<" (md.settings.solver_residue_threshold)");
68  return false;
69  }
70  else{
71  return true;
72  }
73 
74 }
_assert_
#define _assert_(ignore)
Definition: exceptions.h:37
IssmDouble
double IssmDouble
Definition: types.h:37
_printf0_
#define _printf0_(StreamArgs)
Definition: Print.h:29
VerboseConvergence
bool VerboseConvergence(void)
Definition: Verbosity.cpp:26
ToolkitsOptionsFromAnalysis
void ToolkitsOptionsFromAnalysis(Parameters *parameters, int analysis_type)
Vector::Duplicate
Vector< doubletype > * Duplicate(void)
Definition: Vector.h:230
Matrix::MatMult
void MatMult(Vector< doubletype > *X, Vector< doubletype > *AX)
Definition: Matrix.h:239
VerboseModule
bool VerboseModule(void)
Definition: Verbosity.cpp:23
SettingsSolverResidueThresholdEnum
@ SettingsSolverResidueThresholdEnum
Definition: EnumDefinitions.h:340
checkconvergence
bool checkconvergence(Matrix< IssmDouble > *Kff, Vector< IssmDouble > *pf, Vector< IssmDouble > *uf, Parameters *parameters)
Definition: Solverx.cpp:40
NORM_TWO
@ NORM_TWO
Definition: toolkitsenums.h:15
Vector::Norm
doubletype Norm(NormMode norm_type)
Definition: Vector.h:342
RecoveryAnalysisEnum
@ RecoveryAnalysisEnum
Definition: EnumDefinitions.h:1239
Solver
Definition: Solver.h:20
Solver::Solve
Vector< doubletype > * Solve(void)
Definition: Solver.h:53
Vector::AYPX
void AYPX(Vector *X, doubletype a)
Definition: Vector.h:267
_error_
#define _error_(StreamArgs)
Definition: exceptions.h:49
Parameters::FindParam
void FindParam(bool *pinteger, int enum_type)
Definition: Parameters.cpp:262
Vector::Copy
void Copy(Vector *to)
Definition: Vector.h:319
Vector< IssmDouble >