Actual source code: gmresp.h
1: /*
2: Private data structure used by the GMRES method. This data structure
3: must be identical to the beginning of the KSP_FGMRES data structure
4: so if you CHANGE anything here you must also change it there.
5: */
9: #include src/ksp/ksp/kspimpl.h
11: typedef struct {
12: /* Hessenberg matrix and orthogonalization information. Hes holds
13: the original (unmodified) hessenberg matrix which may be used
14: to estimate the Singular Values of the matrix */
15: PetscScalar *hh_origin,*hes_origin,*cc_origin,*ss_origin,*rs_origin;
17: /* Work space for computing eigenvalues/singular values */
18: PetscReal *Dsvd;
19: PetscScalar *Rsvd;
20:
21: /* parameters */
22: PetscReal haptol;
23: PetscInt max_k;
25: PetscErrorCode (*orthog)(KSP,PetscInt); /* Functions to use (special to gmres) */
26: KSPGMRESCGSRefinementType cgstype;
27:
28: Vec *vecs; /* holds the work vectors */
29: /* vv_allocated is the number of allocated gmres direction vectors */
30: PetscInt q_preallocate,delta_allocate;
31: PetscInt vv_allocated;
32: /* vecs_allocated is the total number of vecs available (used to
33: simplify the dynamic allocation of vectors */
34: PetscInt vecs_allocated;
35: /* Since we may call the user "obtain_work_vectors" several times,
36: we have to keep track of the pointers that it has returned
37: (so that we may free the storage) */
38: Vec **user_work;
39: PetscInt *mwork_alloc; /* Number of work vectors allocated as part of
40: a work-vector chunck */
41: PetscInt nwork_alloc; /* Number of work vectors allocated */
43: /* In order to allow the solution to be constructed during the solution
44: process, we need some additional information: */
46: PetscInt it; /* Current iteration: inside restart */
47: PetscScalar *nrs; /* temp that holds the coefficients of the
48: Krylov vectors that form the minimum residual
49: solution */
50: Vec sol_temp; /* used to hold temporary solution */
51: } KSP_GMRES;
53: #define HH(a,b) (gmres->hh_origin + (b)*(gmres->max_k+2)+(a))
54: #define HES(a,b) (gmres->hes_origin + (b)*(gmres->max_k+1)+(a))
55: #define CC(a) (gmres->cc_origin + (a))
56: #define SS(a) (gmres->ss_origin + (a))
57: #define GRS(a) (gmres->rs_origin + (a))
59: /* vector names */
60: #define VEC_OFFSET 2
61: #define VEC_TEMP gmres->vecs[0]
62: #define VEC_TEMP_MATOP gmres->vecs[1]
63: #define VEC_VV(i) gmres->vecs[VEC_OFFSET+i]
65: #endif