xref: /petsc/src/snes/impls/ngmres/snesngmres.h (revision 4d179fb46f278960ac3f14025f9cb6eb7a8aa015)
1a4963045SJacob Faibussowitsch #pragma once
219653cdaSPeter Brune 
3af0996ceSBarry Smith #include <petsc/private/snesimpl.h>
419653cdaSPeter Brune 
519653cdaSPeter Brune /*  Data structure for the Nonlinear GMRES method.  */
619653cdaSPeter Brune typedef struct {
798b3e84cSPeter Brune   /* Solver parameters and counters */
898b3e84cSPeter Brune   PetscInt    msize;            /* maximum size of krylov space */
928ed4a04SPeter Brune   PetscInt    restart_it;       /* number of iterations the restart conditions persist before restart */
10dfbf837cSBarry Smith   PetscViewer monitor;          /* debugging output for NGMRES */
1113a62661SPeter Brune   PetscInt    restart_periodic; /* number of iterations to restart after */
1213a62661SPeter Brune 
1313a62661SPeter Brune   SNESNGMRESRestartType restart_type;
1413a62661SPeter Brune   SNESNGMRESSelectType  select_type;
1528ed4a04SPeter Brune 
1698b3e84cSPeter Brune   /* History and subspace data */
17f109b39eSPeter Brune   Vec       *Fdot;   /* residual history -- length msize */
18f109b39eSPeter Brune   Vec       *Xdot;   /* solution history -- length msize */
19f109b39eSPeter Brune   PetscReal *fnorms; /* the residual norm history  */
2018aa0c0cSPeter Brune   PetscReal *xnorms; /* the solution norm history */
2119653cdaSPeter Brune 
2298b3e84cSPeter Brune   /* General minimization problem context */
2398b3e84cSPeter Brune   PetscScalar *h;    /* the constraint matrix */
2498b3e84cSPeter Brune   PetscScalar *beta; /* rhs for the minimization problem */
2598b3e84cSPeter Brune   PetscScalar *xi;   /* the dot-product of the current and previous res. */
2619653cdaSPeter Brune 
27e7058c64SPeter Brune   /* Line searches */
28f1c6b773SPeter Brune   SNESLineSearch additive_linesearch; /* Line search for the additive variant */
294936d809SStefano Zampini   PetscReal      descent_ls_test;     /* restart GMRES when X_A -X_M is not a descent direction */
30e7058c64SPeter Brune 
3198b3e84cSPeter Brune   /* Selection constants */
3238774f0aSPeter Brune   PetscBool candidate;       /* use candidate storage approach */
33077c4231SPeter Brune   PetscBool approxfunc;      /* approximate the function rather than recomputing it */
3498b3e84cSPeter Brune   PetscReal gammaA;          /* Criterion A residual tolerance */
3598b3e84cSPeter Brune   PetscReal epsilonB;        /* Criterion B difference tolerance */
3698b3e84cSPeter Brune   PetscReal deltaB;          /* Criterion B residual tolerance */
3798b3e84cSPeter Brune   PetscReal gammaC;          /* Restart residual tolerance */
3823b3e82cSAsbjørn Nilsen Riseth   PetscBool restart_fm_rise; /* Restart on F_M residual increase */
3919653cdaSPeter Brune 
40f31c9d25SPeter Brune   PetscReal andersonBeta; /* Relaxation parameter for Anderson Mixing */
41f31c9d25SPeter Brune 
42e7058c64SPeter Brune   /* Least squares minimization solve context */
4398b3e84cSPeter Brune   PetscScalar *q;     /* the matrix formed as q_ij = (rdot_i, rdot_j) */
4498b3e84cSPeter Brune   PetscBLASInt m;     /* matrix dimension */
4598b3e84cSPeter Brune   PetscBLASInt n;     /* matrix dimension */
46*dd8e379bSPierre Jolivet   PetscBLASInt nrhs;  /* the number of right-hand sides */
4798b3e84cSPeter Brune   PetscBLASInt lda;   /* the padded matrix dimension */
4898b3e84cSPeter Brune   PetscBLASInt ldb;   /* the padded vector dimension */
4998b3e84cSPeter Brune   PetscReal   *s;     /* the singular values */
5098b3e84cSPeter Brune   PetscReal    rcond; /* the exit condition */
5198b3e84cSPeter Brune   PetscBLASInt rank;  /* the effective rank */
5298b3e84cSPeter Brune   PetscScalar *work;  /* the work vector */
5398b3e84cSPeter Brune   PetscReal   *rwork; /* the real work vector used for complex */
5498b3e84cSPeter Brune   PetscBLASInt lwork; /* the size of the work vector */
5598b3e84cSPeter Brune   PetscBLASInt info;  /* the output condition */
5619653cdaSPeter Brune 
5778440776SJed Brown   PetscBool setup_called; /* indicates whether SNESSetUp_NGMRES() has been called  */
5819653cdaSPeter Brune } SNES_NGMRES;
5919653cdaSPeter Brune 
6019653cdaSPeter Brune #define H(i, j) ngmres->h[i * ngmres->msize + j]
6119653cdaSPeter Brune #define Q(i, j) ngmres->q[i * ngmres->msize + j]
6219653cdaSPeter Brune 
6338774f0aSPeter Brune /* private functions that are shared components of the methods */
64b30237c6SBarry Smith PETSC_INTERN PetscErrorCode SNESNGMRESUpdateSubspace_Private(SNES, PetscInt, PetscInt, Vec, PetscReal, Vec);
65b3c6a99cSPeter Brune PETSC_INTERN PetscErrorCode SNESNGMRESFormCombinedSolution_Private(SNES, PetscInt, PetscInt, Vec, Vec, PetscReal, Vec, Vec, Vec);
66b3c6a99cSPeter Brune PETSC_INTERN PetscErrorCode SNESNGMRESNorms_Private(SNES, PetscInt, Vec, Vec, Vec, Vec, Vec, Vec, Vec, PetscReal *, PetscReal *, PetscReal *, PetscReal *, PetscReal *, PetscReal *, PetscReal *, PetscReal *);
674936d809SStefano Zampini 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 *);
684936d809SStefano Zampini PETSC_INTERN PetscErrorCode SNESNGMRESSelectRestart_Private(SNES, PetscInt, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal, PetscBool *);
6938774f0aSPeter Brune 
704936d809SStefano Zampini PETSC_INTERN PetscErrorCode SNESNGMRESGetAdditiveLineSearch_Private(SNES, SNESLineSearch *);
7125acbd8eSLisandro Dalcin PETSC_INTERN PetscErrorCode SNESDestroy_NGMRES(SNES);
7225acbd8eSLisandro Dalcin PETSC_INTERN PetscErrorCode SNESReset_NGMRES(SNES);
7325acbd8eSLisandro Dalcin PETSC_INTERN PetscErrorCode SNESSetUp_NGMRES(SNES);
7425acbd8eSLisandro Dalcin PETSC_INTERN PetscErrorCode SNESView_NGMRES(SNES, PetscViewer);
75