xref: /petsc/src/snes/impls/ngmres/snesngmres.h (revision 84df9cb40eca90ea9b18a456fab7a4ecc7f6c1a4)
1 #ifndef _SNESNGMRES_H
2 #define _SNESNGMRES_H
3 
4 #include <private/snesimpl.h>
5 
6 /*  Data structure for the Nonlinear GMRES method.  */
7 typedef struct {
8 
9   /* Solver parameters and counters */
10   PetscInt     msize;          /* maximum size of krylov space */
11   PetscInt     k_rmax;         /* maximum number of iterations before restart */
12   PetscViewer  monitor;          /* debugging output for NGMRES */
13   /* History and subspace data */
14   Vec          *rdot;          /* residual history -- length msize */
15   Vec          *xdot;          /* solution history -- length msize */
16   PetscReal     *r_norms;      /* the residual norm history  */
17 
18   /* General minimization problem context */
19   PetscScalar  *h;             /* the constraint matrix */
20   PetscScalar  *beta;          /* rhs for the minimization problem */
21   PetscScalar    *xi;          /* the dot-product of the current and previous res. */
22 
23   /* Selection constants */
24   PetscReal gammaA;          /* Criterion A residual tolerance */
25   PetscReal epsilonB;        /* Criterion B difference tolerance */
26   PetscReal deltaB;          /* Criterion B residual tolerance */
27   PetscReal gammaC;          /* Restart residual tolerance */
28 
29   /* LS Minimization solve context */
30   PetscScalar  *q;    /* the matrix formed as q_ij = (rdot_i, rdot_j) */
31   PetscBLASInt m;     /* matrix dimension */
32   PetscBLASInt n;     /* matrix dimension */
33   PetscBLASInt nrhs;  /* the number of right hand sides */
34   PetscBLASInt lda;   /* the padded matrix dimension */
35   PetscBLASInt ldb;   /* the padded vector dimension */
36   PetscReal * s;      /* the singular values */
37   PetscReal rcond;    /* the exit condition */
38   PetscBLASInt rank;  /* the effective rank */
39   PetscScalar * work; /* the work vector */
40   PetscReal  * rwork; /* the real work vector used for complex */
41   PetscBLASInt lwork; /* the size of the work vector */
42   PetscBLASInt info;  /* the output condition */
43 
44 } SNES_NGMRES;
45 
46 #define H(i,j)  ngmres->h[i*ngmres->msize + j]
47 #define Q(i,j)  ngmres->q[i*ngmres->msize + j]
48 
49 #endif
50