Date: 2026-07-30T21:14:20+00:00

Actual source code: snesngmres.h

      1: #pragma once

      3: #include <petsc/private/snesimpl.h>

      5: /*  Data structure for the Nonlinear GMRES method.  */
      6: typedef struct {
      7:   /* Solver parameters and counters */
      8:   PetscInt    msize;            /* maximum size of krylov space */
      9:   PetscInt    restart_it;       /* number of iterations the restart conditions persist before restart */
     10:   PetscViewer monitor;          /* debugging output for NGMRES */
     11:   PetscInt    restart_periodic; /* number of iterations to restart after */

     13:   SNESNGMRESRestartType restart_type;
     14:   SNESNGMRESSelectType  select_type;

     16:   /* History and subspace data */
     17:   Vec       *Fdot;   /* residual history -- length msize */
     18:   Vec       *Xdot;   /* solution history -- length msize */
     19:   PetscReal *fnorms; /* the residual norm history  */
     20:   PetscReal *xnorms; /* the solution norm history */

     22:   /* General minimization problem context */
     23:   PetscScalar *h;    /* the constraint matrix */
     24:   PetscScalar *beta; /* rhs for the minimization problem */
     25:   PetscScalar *xi;   /* the dot-product of the current and previous res. */

     27:   /* Line searches */
     28:   SNESLineSearch additive_linesearch; /* Line search for the additive variant */
     29:   PetscReal      descent_ls_test;     /* restart GMRES when X_A -X_M is not a descent direction */

     31:   /* Selection constants */
     32:   PetscBool candidate;       /* use candidate storage approach */
     33:   PetscBool approxfunc;      /* approximate the function rather than recomputing it */
     34:   PetscReal gammaA;          /* Criterion A residual tolerance */
     35:   PetscReal epsilonB;        /* Criterion B difference tolerance */
     36:   PetscReal deltaB;          /* Criterion B residual tolerance */
     37:   PetscReal gammaC;          /* Restart residual tolerance */
     38:   PetscBool restart_fm_rise; /* Restart on F_M residual increase */

     40:   PetscReal andersonBeta; /* Relaxation parameter for Anderson Mixing */

     42:   /* Least squares minimization solve context */
     43:   PetscScalar *q;     /* the matrix formed as q_ij = (rdot_i, rdot_j) */
     44:   PetscBLASInt m;     /* matrix dimension */
     45:   PetscBLASInt n;     /* matrix dimension */
     46:   PetscBLASInt nrhs;  /* the number of right-hand sides */
     47:   PetscBLASInt lda;   /* the padded matrix dimension */
     48:   PetscBLASInt ldb;   /* the padded vector dimension */
     49:   PetscReal   *s;     /* the singular values */
     50:   PetscReal    rcond; /* the exit condition */
     51:   PetscBLASInt rank;  /* the effective rank */
     52:   PetscScalar *work;  /* the work vector */
     53:   PetscReal   *rwork; /* the real work vector used for complex */
     54:   PetscBLASInt lwork; /* the size of the work vector */
     55:   PetscBLASInt info;  /* the output condition */

     57:   PetscBool setup_called; /* indicates whether SNESSetUp_NGMRES() has been called  */
     58: } SNES_NGMRES;

     60: #define H(i, j) ngmres->h[i * ngmres->msize + j]
     61: #define Q(i, j) ngmres->q[i * ngmres->msize + j]

     63: /* private functions that are shared components of the methods */
     64: PETSC_INTERN PetscErrorCode SNESNGMRESUpdateSubspace_Private(SNES, PetscInt, PetscInt, Vec, PetscReal, Vec);
     65: PETSC_INTERN PetscErrorCode SNESNGMRESFormCombinedSolution_Private(SNES, PetscInt, PetscInt, Vec, Vec, PetscReal, Vec, Vec, Vec);
     66: PETSC_INTERN PetscErrorCode SNESNGMRESNorms_Private(SNES, PetscInt, Vec, Vec, Vec, Vec, Vec, Vec, Vec, PetscReal *, PetscReal *, PetscReal *, PetscReal *, PetscReal *, PetscReal *, PetscReal *, PetscReal *);
     67: PETSC_INTERN PetscErrorCode SNESNGMRESSelect_Private(SNES, PetscInt, Vec, Vec, PetscReal, PetscReal, PetscReal, PetscReal, Vec, Vec, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal, Vec, Vec, Vec, PetscReal *, PetscReal *, PetscReal *);
     68: PETSC_INTERN PetscErrorCode SNESNGMRESSelectRestart_Private(SNES, PetscInt, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal, PetscBool *);

     70: PETSC_INTERN PetscErrorCode SNESNGMRESGetAdditiveLineSearch_Private(SNES, SNESLineSearch *);
     71: PETSC_INTERN PetscErrorCode SNESDestroy_NGMRES(SNES);
     72: PETSC_INTERN PetscErrorCode SNESReset_NGMRES(SNES);
     73: PETSC_INTERN PetscErrorCode SNESSetUp_NGMRES(SNES);
     74: PETSC_INTERN PetscErrorCode SNESView_NGMRES(SNES, PetscViewer);