Changeset 24313 for issm/trunk/src/c/modules/Solverx/Solverx.cpp
- Timestamp:
- 11/01/19 12:01:57 (5 years ago)
- Location:
- issm/trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk
-
issm/trunk/src
- Property svn:mergeinfo changed
-
issm/trunk/src/c
- Property svn:ignore
-
issm/trunk/src/c/modules/Solverx/Solverx.cpp
r15396 r24313 11 11 #include "./Solverx.h" 12 12 #include "../../shared/shared.h" 13 #include "../../classes/Params/Parameters.h" 13 14 14 15 void Solverx(Vector<IssmDouble>** puf, Matrix<IssmDouble>* Kff, Vector<IssmDouble>* pf, Vector<IssmDouble>* uf0,Vector<IssmDouble>* df, Parameters* parameters){ 15 16 16 /*intermediary: */ 17 Solver<IssmDouble> *solver=NULL; 18 19 /*output: */ 20 Vector<IssmDouble> *uf=NULL; 21 22 if(VerboseModule()) _printf0_(" Solving matrix system\n"); 23 24 /*Initialize solver: */ 25 solver=new Solver<IssmDouble>(Kff,pf,uf0,df,parameters); 17 /*Create Solver Object*/ 18 Solver<IssmDouble>* solver=new Solver<IssmDouble>(Kff,pf,uf0,df,parameters); 26 19 27 20 /*Solve:*/ 28 uf=solver->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"); 28 ToolkitsOptionsFromAnalysis(parameters,RecoveryAnalysisEnum); 29 delete uf; 30 uf=solver->Solve(); 31 32 if(!checkconvergence(Kff,pf,uf,parameters)) _error_("Recovery solver failed..."); 33 } 29 34 30 35 /*clean up and assign output pointers:*/ 36 _assert_(puf); 31 37 delete solver; 32 38 *puf=uf; 33 39 } 40 bool checkconvergence(Matrix<IssmDouble>* Kff,Vector<IssmDouble>* pf,Vector<IssmDouble>* uf,Parameters* parameters){ 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 << " => Trying recovery solver\n"); 68 return false; 69 } 70 else{ 71 return true; 72 } 73 74 }
Note:
See TracChangeset
for help on using the changeset viewer.