typedef enum {/* converged */ TAO_CONVERGED_GATOL = 3, /* ||g(X)|| < gatol */ TAO_CONVERGED_GRTOL = 4, /* ||g(X)|| / f(X) < grtol */ TAO_CONVERGED_GTTOL = 5, /* ||g(X)|| / ||g(X0)|| < gttol */ TAO_CONVERGED_STEPTOL = 6, /* step size small */ TAO_CONVERGED_MINF = 7, /* F < F_min */ TAO_CONVERGED_USER = 8, /* User defined */ /* diverged */ TAO_DIVERGED_MAXITS = -2, TAO_DIVERGED_NAN = -4, TAO_DIVERGED_MAXFCN = -5, TAO_DIVERGED_LS_FAILURE = -6, TAO_DIVERGED_TR_REDUCTION = -7, TAO_DIVERGED_USER = -8, /* User defined */ /* keep going */ TAO_CONTINUE_ITERATING = 0} TaoConvergedReason;
The two most common reasons for divergence are
1) an incorrectly coded or computed gradient or Hessian
2) failure or lack of convergence in the linear system (in this case we recommend
testing with -pc_type lu to eliminate the linear solver as the cause of the problem).
Developer Notes: this must match petsc/finclude/petsctao.h
The string versions of these are in TAOConvergedReasons, if you change any value here you must also adjust that array.