On Wed, Nov 28, 2012 at 2:08 PM, Barry Smith <bsm...@mcs.anl.gov> wrote: > > On Nov 28, 2012, at 3:00 PM, Michael Povolotskyi <mpovo...@purdue.edu> wrote: > >> Thank you. >> Looks like also others treated this parameter erroneously as the absolute >> tolerance: >> >> For example, the Libmesh library: >> http://libmesh.sourceforge.net/doxygen/classlibMesh_1_1PetscNonlinearSolver.php#a1d5ed777465c1f08785bc321c84c7c71 >> >> 00486 // Set the tolerances for the non-linear solver. >> 00487 ierr = SNESSetTolerances(_snes, this->absolute_residual_tolerance, >> this->relative_residual_tolerance, >> 00488 this->absolute_step_tolerance, >> this->max_nonlinear_iterations, this->max_function_evaluations); >> >> Am I right that they have a problem? > > Based on the name of their variable yes it does appear to be wrong. The > reason it is a relative tolerance (and not absolute) is that one is computing > > x = delta x + x > > and once delta x is sufficiently smaller than x, delta x + x == x (in > floating point) so we don't want to iterate past the point where x is not > being changed.
So, if I'm interpreting everything correctly, it would be more correct for the third argument to be this->relative_step_tolerance instead of this->absolute_step_tolerance? We could change this, but it might break backwards compatibility: some users may not currently use relative_step_tolerance at all, etc. -- John ------------------------------------------------------------------------------ Keep yourself connected to Go Parallel: VERIFY Test and improve your parallel project with help from experts and peers. http://goparallel.sourceforge.net _______________________________________________ Libmesh-devel mailing list Libmesh-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libmesh-devel