xref: /petsc/src/snes/impls/ngmres/snesngmres.h (revision 98b3e84c0de41e2127bad7e475775da2d279ed99)
119653cdaSPeter Brune #ifndef _SNESNGMRES_H
219653cdaSPeter Brune #define _SNESNGMRES_H
319653cdaSPeter Brune 
419653cdaSPeter Brune #include <private/snesimpl.h>
519653cdaSPeter Brune 
619653cdaSPeter Brune /*  Data structure for the Nonlinear GMRES method.  */
719653cdaSPeter Brune typedef struct {
819653cdaSPeter Brune 
9*98b3e84cSPeter Brune   /* Solver parameters and counters */
10*98b3e84cSPeter Brune   PetscInt     msize;          /* maximum size of krylov space */
11*98b3e84cSPeter Brune   PetscInt     k_rmax;         /* maximum number of iterations before restart */
12*98b3e84cSPeter Brune   PetscBool    debug;          /* debugging output for NGMRES */
13*98b3e84cSPeter Brune   /* History and subspace data */
14*98b3e84cSPeter Brune   Vec          *rdot;          /* residual history -- length msize */
15*98b3e84cSPeter Brune   Vec          *xdot;          /* solution history -- length msize */
16*98b3e84cSPeter Brune   PetscReal     *r_norms;      /* the residual norm history  */
1719653cdaSPeter Brune 
18*98b3e84cSPeter Brune   /* General minimization problem context */
19*98b3e84cSPeter Brune   PetscScalar  *h;             /* the constraint matrix */
20*98b3e84cSPeter Brune   PetscScalar  *beta;          /* rhs for the minimization problem */
21*98b3e84cSPeter Brune   PetscScalar    *xi;          /* the dot-product of the current and previous res. */
2219653cdaSPeter Brune 
23*98b3e84cSPeter Brune   /* Selection constants */
24*98b3e84cSPeter Brune   PetscReal gammaA;          /* Criterion A residual tolerance */
25*98b3e84cSPeter Brune   PetscReal epsilonB;        /* Criterion B difference tolerance */
26*98b3e84cSPeter Brune   PetscReal deltaB;          /* Criterion B residual tolerance */
27*98b3e84cSPeter Brune   PetscReal gammaC;          /* Restart residual tolerance */
2819653cdaSPeter Brune 
29*98b3e84cSPeter Brune   /* LS Minimization solve context */
30*98b3e84cSPeter Brune   PetscScalar  *q;    /* the matrix formed as q_ij = (rdot_i, rdot_j) */
31*98b3e84cSPeter Brune   PetscBLASInt m;     /* matrix dimension */
32*98b3e84cSPeter Brune   PetscBLASInt n;     /* matrix dimension */
33*98b3e84cSPeter Brune   PetscBLASInt nrhs;  /* the number of right hand sides */
34*98b3e84cSPeter Brune   PetscBLASInt lda;   /* the padded matrix dimension */
35*98b3e84cSPeter Brune   PetscBLASInt ldb;   /* the padded vector dimension */
36*98b3e84cSPeter Brune   PetscReal * s;      /* the singular values */
37*98b3e84cSPeter Brune   PetscReal rcond;    /* the exit condition */
38*98b3e84cSPeter Brune   PetscBLASInt rank;  /* the effective rank */
39*98b3e84cSPeter Brune   PetscScalar * work; /* the work vector */
40*98b3e84cSPeter Brune   PetscReal  * rwork; /* the real work vector used for complex */
41*98b3e84cSPeter Brune   PetscBLASInt lwork; /* the size of the work vector */
42*98b3e84cSPeter Brune   PetscBLASInt info;  /* the output condition */
4319653cdaSPeter Brune 
4419653cdaSPeter Brune } SNES_NGMRES;
4519653cdaSPeter Brune 
4619653cdaSPeter Brune #define H(i,j)  ngmres->h[i*ngmres->msize + j]
4719653cdaSPeter Brune #define Q(i,j)  ngmres->q[i*ngmres->msize + j]
4819653cdaSPeter Brune 
4919653cdaSPeter Brune #endif
50