xref: /petsc/src/snes/impls/ngmres/snesngmres.h (revision e7058c64bd2072109d5be3914c0b8ecac89ed00d)
119653cdaSPeter Brune #ifndef _SNESNGMRES_H
219653cdaSPeter Brune #define _SNESNGMRES_H
319653cdaSPeter Brune 
419653cdaSPeter Brune #include <private/snesimpl.h>
5*e7058c64SPeter Brune #include <petsclinesearch.h>
619653cdaSPeter Brune 
719653cdaSPeter Brune /*  Data structure for the Nonlinear GMRES method.  */
819653cdaSPeter Brune typedef struct {
919653cdaSPeter Brune 
1098b3e84cSPeter Brune   /* Solver parameters and counters */
1198b3e84cSPeter Brune   PetscInt     msize;          /* maximum size of krylov space */
1228ed4a04SPeter Brune   PetscInt     restart_it;     /* number of iterations the restart conditions persist before restart */
13dfbf837cSBarry Smith   PetscViewer  monitor;        /* debugging output for NGMRES */
1428ed4a04SPeter Brune 
1598b3e84cSPeter Brune   /* History and subspace data */
16f109b39eSPeter Brune   Vec          *Fdot;          /* residual history -- length msize */
17f109b39eSPeter Brune   Vec          *Xdot;          /* solution history -- length msize */
18f109b39eSPeter Brune   PetscReal    *fnorms;        /* the residual norm history  */
1919653cdaSPeter Brune 
2098b3e84cSPeter Brune   /* General minimization problem context */
2198b3e84cSPeter Brune   PetscScalar  *h;             /* the constraint matrix */
2298b3e84cSPeter Brune   PetscScalar  *beta;          /* rhs for the minimization problem */
2398b3e84cSPeter Brune   PetscScalar  *xi;            /* the dot-product of the current and previous res. */
2419653cdaSPeter Brune 
25*e7058c64SPeter Brune   /* Line searches */
26*e7058c64SPeter Brune   LineSearch   linesearch;     /* Line search for the default step */
27*e7058c64SPeter Brune   LineSearch   additive_linesearch; /* Line search for the additive variant */
28*e7058c64SPeter Brune 
2998b3e84cSPeter Brune   /* Selection constants */
30d2e16ddcSPeter Brune   PetscBool    anderson;       /* use anderson-mixing approach */
319f425c49SPeter Brune   PetscBool    additive;       /* use additive variant instead of selection */
3298b3e84cSPeter Brune   PetscReal    gammaA;         /* Criterion A residual tolerance */
3398b3e84cSPeter Brune   PetscReal    epsilonB;       /* Criterion B difference tolerance */
3498b3e84cSPeter Brune   PetscReal    deltaB;         /* Criterion B residual tolerance */
3598b3e84cSPeter Brune   PetscReal    gammaC;         /* Restart residual tolerance */
3619653cdaSPeter Brune 
37*e7058c64SPeter Brune   /* Least squares minimization solve context */
3898b3e84cSPeter Brune   PetscScalar  *q;             /* the matrix formed as q_ij = (rdot_i, rdot_j) */
3998b3e84cSPeter Brune   PetscBLASInt m;              /* matrix dimension */
4098b3e84cSPeter Brune   PetscBLASInt n;              /* matrix dimension */
4198b3e84cSPeter Brune   PetscBLASInt nrhs;           /* the number of right hand sides */
4298b3e84cSPeter Brune   PetscBLASInt lda;            /* the padded matrix dimension */
4398b3e84cSPeter Brune   PetscBLASInt ldb;            /* the padded vector dimension */
4498b3e84cSPeter Brune   PetscReal    *s;             /* the singular values */
4598b3e84cSPeter Brune   PetscReal    rcond;          /* the exit condition */
4698b3e84cSPeter Brune   PetscBLASInt rank;           /* the effective rank */
4798b3e84cSPeter Brune   PetscScalar  *work;          /* the work vector */
4898b3e84cSPeter Brune   PetscReal    *rwork;         /* the real work vector used for complex */
4998b3e84cSPeter Brune   PetscBLASInt lwork;          /* the size of the work vector */
5098b3e84cSPeter Brune   PetscBLASInt info;           /* the output condition */
5119653cdaSPeter Brune 
5278440776SJed Brown   PetscBool    setup_called;    /* indicates whether SNESSetUp_NGMRES() has been called  */
5319653cdaSPeter Brune } SNES_NGMRES;
5419653cdaSPeter Brune 
5519653cdaSPeter Brune #define H(i,j)  ngmres->h[i*ngmres->msize + j]
5619653cdaSPeter Brune #define Q(i,j)  ngmres->q[i*ngmres->msize + j]
5719653cdaSPeter Brune 
5819653cdaSPeter Brune #endif
59