xref: /petsc/src/snes/impls/ngmres/snesngmres.h (revision b3c6a99c2dfbbcbe6c384ebbf17f2aa81f303822)
1519f805aSKarl Rupp #if !defined(_SNESNGMRES_H)
219653cdaSPeter Brune #define _SNESNGMRES_H
319653cdaSPeter Brune 
4b45d2f2cSJed Brown #include <petsc-private/snesimpl.h>
519653cdaSPeter Brune 
619653cdaSPeter Brune /*  Data structure for the Nonlinear GMRES method.  */
719653cdaSPeter Brune typedef struct {
819653cdaSPeter Brune 
998b3e84cSPeter Brune   /* Solver parameters and counters */
1098b3e84cSPeter Brune   PetscInt    msize;            /* maximum size of krylov space */
1128ed4a04SPeter Brune   PetscInt    restart_it;       /* number of iterations the restart conditions persist before restart */
12dfbf837cSBarry Smith   PetscViewer monitor;          /* debugging output for NGMRES */
1313a62661SPeter Brune   PetscInt    restart_periodic; /* number of iterations to restart after */
1413a62661SPeter Brune 
1513a62661SPeter Brune   SNESNGMRESRestartType restart_type;
1613a62661SPeter Brune   SNESNGMRESSelectType  select_type;
1728ed4a04SPeter Brune 
1898b3e84cSPeter Brune   /* History and subspace data */
19f109b39eSPeter Brune   Vec       *Fdot;             /* residual history -- length msize */
20f109b39eSPeter Brune   Vec       *Xdot;             /* solution history -- length msize */
21f109b39eSPeter Brune   PetscReal *fnorms;           /* the residual norm history  */
2218aa0c0cSPeter Brune   PetscReal *xnorms;           /* the solution norm history */
2319653cdaSPeter Brune 
2498b3e84cSPeter Brune   /* General minimization problem context */
2598b3e84cSPeter Brune   PetscScalar *h;              /* the constraint matrix */
2698b3e84cSPeter Brune   PetscScalar *beta;           /* rhs for the minimization problem */
2798b3e84cSPeter Brune   PetscScalar *xi;             /* the dot-product of the current and previous res. */
2819653cdaSPeter Brune 
29e7058c64SPeter Brune   /* Line searches */
30f1c6b773SPeter Brune   SNESLineSearch additive_linesearch;   /* Line search for the additive variant */
31e7058c64SPeter Brune 
3298b3e84cSPeter Brune   /* Selection constants */
3338774f0aSPeter Brune   PetscBool candidate;         /* use candidate storage approach */
34077c4231SPeter Brune   PetscBool approxfunc;        /* approximate the function rather than recomputing it */
3518aa0c0cSPeter Brune   PetscBool singlereduction;   /* use a single reduction (with more local work) for tolerance selection */
3698b3e84cSPeter Brune   PetscReal gammaA;            /* Criterion A residual tolerance */
3798b3e84cSPeter Brune   PetscReal epsilonB;          /* Criterion B difference tolerance */
3898b3e84cSPeter Brune   PetscReal deltaB;            /* Criterion B residual tolerance */
3998b3e84cSPeter Brune   PetscReal gammaC;            /* Restart residual tolerance */
4019653cdaSPeter Brune 
41f31c9d25SPeter Brune   PetscReal andersonBeta;      /* Relaxation parameter for Anderson Mixing */
42f31c9d25SPeter Brune 
43e7058c64SPeter Brune   /* Least squares minimization solve context */
4498b3e84cSPeter Brune   PetscScalar  *q;             /* the matrix formed as q_ij = (rdot_i, rdot_j) */
4598b3e84cSPeter Brune   PetscBLASInt m;              /* matrix dimension */
4698b3e84cSPeter Brune   PetscBLASInt n;              /* matrix dimension */
4798b3e84cSPeter Brune   PetscBLASInt nrhs;           /* the number of right hand sides */
4898b3e84cSPeter Brune   PetscBLASInt lda;            /* the padded matrix dimension */
4998b3e84cSPeter Brune   PetscBLASInt ldb;            /* the padded vector dimension */
5098b3e84cSPeter Brune   PetscReal    *s;             /* the singular values */
5198b3e84cSPeter Brune   PetscReal    rcond;          /* the exit condition */
5298b3e84cSPeter Brune   PetscBLASInt rank;           /* the effective rank */
5398b3e84cSPeter Brune   PetscScalar  *work;          /* the work vector */
5498b3e84cSPeter Brune   PetscReal    *rwork;         /* the real work vector used for complex */
5598b3e84cSPeter Brune   PetscBLASInt lwork;          /* the size of the work vector */
5698b3e84cSPeter Brune   PetscBLASInt info;           /* the output condition */
5719653cdaSPeter Brune 
5878440776SJed Brown   PetscBool setup_called;       /* indicates whether SNESSetUp_NGMRES() has been called  */
5919653cdaSPeter Brune } SNES_NGMRES;
6019653cdaSPeter Brune 
6119653cdaSPeter Brune #define H(i,j)  ngmres->h[i*ngmres->msize + j]
6219653cdaSPeter Brune #define Q(i,j)  ngmres->q[i*ngmres->msize + j]
6319653cdaSPeter Brune 
6438774f0aSPeter Brune /* private functions that are shared components of the methods */
65b30237c6SBarry Smith PETSC_INTERN PetscErrorCode SNESNGMRESUpdateSubspace_Private(SNES,PetscInt,PetscInt,Vec,PetscReal,Vec);
66*b3c6a99cSPeter Brune PETSC_INTERN PetscErrorCode SNESNGMRESFormCombinedSolution_Private(SNES,PetscInt,PetscInt,Vec,Vec,PetscReal,Vec,Vec,Vec);
67*b3c6a99cSPeter Brune PETSC_INTERN PetscErrorCode SNESNGMRESNorms_Private(SNES,PetscInt,Vec,Vec,Vec,Vec,Vec,Vec,Vec,PetscReal*,PetscReal*, PetscReal*,PetscReal*,PetscReal*, PetscReal*,PetscReal*,PetscReal*);
68*b3c6a99cSPeter Brune PETSC_INTERN PetscErrorCode SNESNGMRESSelect_Private(SNES,PetscInt,Vec,Vec,PetscReal,PetscReal,PetscReal,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscReal,PetscReal,PetscReal,Vec,Vec,Vec,PetscReal*,PetscReal*,PetscReal*);
69b30237c6SBarry Smith PETSC_INTERN PetscErrorCode SNESNGMRESSelectRestart_Private(SNES,PetscInt,PetscReal,PetscReal,PetscReal,PetscReal,PetscBool*);
7038774f0aSPeter Brune 
7119653cdaSPeter Brune #endif
72