Actual source code: lgmresimpl.h
1: /* A. Baker */
2: /*
3: Private data structure used by the LGMRES method.
4: */
6: #ifndef PETSC_LGMRESIMPL_H
7: #define PETSC_LGMRESIMPL_H
9: #define KSPGMRES_NO_MACROS
10: #include <../src/ksp/ksp/impls/gmres/gmresimpl.h>
12: typedef struct {
13: KSPGMRESHEADER
15: /* LGMRES_MOD - make these for the z vectors - new storage for lgmres */
16: Vec *augvecs; /* holds the error approximation vectors for lgmres. */
17: Vec **augvecs_user_work; /* same purpose as user_work above, but this one is
18: for our error approx vectors */
19: /* currently only augvecs_user_work[0] is used, not sure if this will be */
20: /* extended in the future to use more, or if this is a design bug */
21: PetscInt aug_vv_allocated; /* aug_vv_allocated is the number of allocated lgmres
22: augmentation vectors */
23: PetscInt aug_vecs_allocated; /* aug_vecs_allocated is the total number of augmentation vecs
24: available - used to simplify the dynamic
25: allocation of vectors */
26: PetscScalar *hwork; /* work array to hold Hessenberg product */
28: PetscInt augwork_alloc; /*size of chunk allocated for augmentation vectors */
30: PetscInt aug_dim; /* max number of augmented directions to add */
32: PetscInt aug_ct; /* number of aug. vectors available */
34: PetscInt *aug_order; /*keeps track of order to use aug. vectors*/
36: PetscBool approx_constant; /* = 1 then the approx space at each restart will
37: be size max_k . Therefore, more than (max_k - aug_dim)
38: krylov vectors may be used if less than aug_dim error
39: approximations are available (in the first few restarts,
40: for example) to keep the space a constant size. */
42: PetscInt matvecs; /*keep track of matvecs */
43: } KSP_LGMRES;
45: #define HH(a, b) (lgmres->hh_origin + (b) * (lgmres->max_k + 2) + (a))
46: /* HH will be size (max_k+2)*(max_k+1) - think of HH as
47: being stored columnwise (inc. zeros) for access purposes. */
48: #define HES(a, b) (lgmres->hes_origin + (b) * (lgmres->max_k + 1) + (a))
49: /* HES will be size (max_k + 1) * (max_k + 1) -
50: again, think of HES as being stored columnwise */
51: #define CC(a) (lgmres->cc_origin + (a)) /* CC will be length (max_k+1) - cosines */
52: #define SS(a) (lgmres->ss_origin + (a)) /* SS will be length (max_k+1) - sines */
53: #define GRS(a) (lgmres->rs_origin + (a)) /* GRS will be length (max_k+2) - rt side */
55: /* vector names */
56: #define VEC_OFFSET 2
57: #define VEC_TEMP lgmres->vecs[0] /* work space */
58: #define VEC_TEMP_MATOP lgmres->vecs[1] /* work space */
59: #define VEC_VV(i) \
60: lgmres->vecs[VEC_OFFSET + i] /* use to access
61: othog basis vectors */
62: /*LGMRES_MOD */
63: #define AUG_OFFSET 1
64: #define AUGVEC(i) lgmres->augvecs[AUG_OFFSET + i] /*error approx vectors */
65: #define AUG_ORDER(i) lgmres->aug_order[i] /*order in which to augment */
66: #define A_AUGVEC(i) lgmres->augvecs[AUG_OFFSET + i + lgmres->aug_dim] /*A times error vector */
67: #define AUG_TEMP lgmres->augvecs[0] /* work vector */
69: #endif // PETSC_LGMRESIMPL_H