Actual source code: snesimpl.h

      2: #ifndef __SNESIMPL_H

     5:  #include petscsnes.h

      7: /*
      8:    Nonlinear solver context
      9:  */
     10: #define MAXSNESMONITORS 5

     12: struct _p_SNES {
     13:   PETSCHEADER(int);

     15:   /* Identifies this as a grid SNES structure */
     16:   PetscTruth  isGSNES;                          /* This problem arises from an underlying grid */

     18:   /*  ------------------------ User-provided stuff -------------------------------*/
     19:   void  *user;                                        /* user-defined context */

     21:   Vec   vec_sol,vec_sol_always;                 /* pointer to solution */
     22:   Vec   vec_sol_update_always;                  /* pointer to solution update */

     24:   PetscErrorCode (*computefunction)(SNES,Vec,Vec,void*); /* function routine */
     25:   Vec            vec_func,vec_func_always;               /* pointer to function */
     26:   Vec            afine;                                  /* If non-null solve F(x) = afine */
     27:   void           *funP;                                  /* user-defined function context */

     29:   PetscErrorCode (*computejacobian)(SNES,Vec,Mat*,Mat*,MatStructure*,void*);
     30:   Mat            jacobian;                               /* Jacobian matrix */
     31:   Mat            jacobian_pre;                           /* preconditioner matrix */
     32:   void           *jacP;                                  /* user-defined Jacobian context */
     33:   KSP            ksp;                                   /* linear solver context */

     35:   PetscErrorCode (*computescaling)(Vec,Vec,void*);       /* scaling routine */
     36:   Vec            scaling;                                /* scaling vector */
     37:   void           *scaP;                                  /* scaling context */

     39:   /* ------------------------Boundary conditions-----------------------------------*/
     40:   PetscErrorCode (*applyrhsbc)(SNES, Vec, void *);         /* Applies boundary conditions to the rhs */
     41:   PetscErrorCode (*applysolbc)(SNES, Vec, void *);         /* Applies boundary conditions to the solution */

     43:   /* ------------------------Time stepping hooks-----------------------------------*/
     44:   PetscErrorCode (*update)(SNES, PetscInt);                     /* General purpose function for update */

     46:   /* ---------------- PETSc-provided (or user-provided) stuff ---------------------*/

     48:   PetscErrorCode (*monitor[MAXSNESMONITORS])(SNES,PetscInt,PetscReal,void*); /* monitor routine */
     49:   PetscErrorCode (*monitordestroy[MAXSNESMONITORS])(void*);          /* monitor context destroy routine */
     50:   void           *monitorcontext[MAXSNESMONITORS];                   /* monitor context */
     51:   PetscInt       numbermonitors;                                     /* number of monitors */
     52:   PetscErrorCode (*converged)(SNES,PetscReal,PetscReal,PetscReal,SNESConvergedReason*,void*);      /* convergence routine */
     53:   void           *cnvP;                                                    /* convergence context */
     54:   SNESConvergedReason reason;

     56:   /* --- Routines and data that are unique to each particular solver --- */

     58:   PetscErrorCode (*setup)(SNES);             /* routine to set up the nonlinear solver */
     59:   PetscTruth     setupcalled;                /* true if setup has been called */
     60:   PetscErrorCode (*solve)(SNES);             /* actual nonlinear solver */
     61:   PetscErrorCode (*setfromoptions)(SNES);    /* sets options from database */
     62:   PetscErrorCode (*printhelp)(SNES,char*);   /* prints help info */
     63:   void           *data;                      /* implementation-specific data */

     65:   /* --------------------------  Parameters -------------------------------------- */

     67:   PetscInt    max_its;            /* max number of iterations */
     68:   PetscInt    max_funcs;          /* max number of function evals */
     69:   PetscInt    nfuncs;             /* number of function evaluations */
     70:   PetscInt    iter;               /* global iteration number */
     71:   PetscInt    linear_its;         /* total number of linear solver iterations */
     72:   PetscReal   norm;            /* residual norm of current iterate */
     73:   PetscReal   rtol;            /* relative tolerance */
     74:   PetscReal   abstol;            /* absolute tolerance */
     75:   PetscReal   xtol;            /* relative tolerance in solution */
     76:   PetscReal   deltatol;        /* trust region convergence tolerance */
     77:   PetscTruth  printreason;     /* print reason for convergence/divergence after each solve */
     78:   /* ------------------------ Default work-area management ---------------------- */

     80:   PetscInt    nwork;
     81:   Vec         *work;

     83:   /* ------------------------- Miscellaneous Information ------------------------ */

     85:   PetscReal   *conv_hist;         /* If !0, stores function norm (or
     86:                                     gradient norm) at each iteration */
     87:   PetscInt    *conv_hist_its;     /* linear iterations for each Newton step */
     88:   PetscInt    conv_hist_len;      /* size of convergence history array */
     89:   PetscInt    conv_hist_max;      /* actual amount of data in conv_history */
     90:   PetscTruth  conv_hist_reset;    /* reset counter for each new SNES solve */
     91:   PetscInt    numFailures;        /* number of unsuccessful step attempts */
     92:   PetscInt    maxFailures;        /* maximum number of unsuccessful step attempts */

     94:  /*
     95:    These are REALLY ugly and don't belong here, but since they must
     96:   be destroyed at the conclusion we have to put them somewhere.
     97:  */
     98:   PetscTruth  ksp_ewconv;        /* flag indicating use of Eisenstat-Walker KSP convergence criteria */
     99:   void        *kspconvctx;       /* KSP convergence context */

    101:   PetscReal   ttol;           /* used by default convergence test routine */

    103:   Vec             *vwork;            /* more work vectors for Jacobian approx */
    104:   PetscInt        nvwork;
    105:   PetscErrorCode (*destroy)(SNES);
    106:   PetscErrorCode (*view)(SNES,PetscViewer);
    107: };

    109: /* Context for Eisenstat-Walker convergence criteria for KSP solvers */
    110: typedef struct {
    111:   PetscInt  version;             /* flag indicating version 1 or 2 of test */
    112:   PetscReal rtol_0;              /* initial rtol */
    113:   PetscReal rtol_last;           /* last rtol */
    114:   PetscReal rtol_max;            /* maximum rtol */
    115:   PetscReal gamma;               /* mult. factor for version 2 rtol computation */
    116:   PetscReal alpha;               /* power for version 2 rtol computation */
    117:   PetscReal alpha2;              /* power for safeguard */
    118:   PetscReal threshold;           /* threshold for imposing safeguard */
    119:   PetscReal lresid_last;         /* linear residual from last iteration */
    120:   PetscReal norm_last;           /* function norm from last iteration */
    121: } SNES_KSP_EW_ConvCtx;

    123: #define SNESLogConvHistory(snes,res,its) \
    124:   { if (snes->conv_hist && snes->conv_hist_max > snes->conv_hist_len) \
    125:     { if (snes->conv_hist)     snes->conv_hist[snes->conv_hist_len]     = res; \
    126:       if (snes->conv_hist_its) snes->conv_hist_its[snes->conv_hist_len] = its; \
    127:       snes->conv_hist_len++;\
    128:     }}

    130: #define SNESMonitor(snes,it,rnorm) \
    131:         { PetscErrorCode _ierr; PetscInt _i,_im = snes->numbermonitors; \
    132:           for (_i=0; _i<_im; _i++) {\
    133:             _(*snes->monitor[_i])(snes,it,rnorm,snes->monitorcontext[_i]);CHKERRQ(_ierr); \
    134:           } \
    135:         }

    137: PetscErrorCode SNES_KSP_EW_Converged_Private(KSP,PetscInt,PetscReal,KSPConvergedReason*,void*);
    138: PetscErrorCode SNES_KSP_EW_ComputeRelativeTolerance_Private(SNES,KSP);
    139: PetscErrorCode SNESScaleStep_Private(SNES,Vec,PetscReal*,PetscReal*,PetscReal*,PetscReal*);

    141: #endif