xref: /petsc/src/ksp/ksp/impls/gmres/pipefgmres/pipefgmresimpl.h (revision 9dd11ecf0918283bb567d8b33a92f53ac4ea7840)
1 #pragma once
2 
3 #define KSPGMRES_NO_MACROS
4 #include <../src/ksp/ksp/impls/gmres/gmresimpl.h>
5 
6 typedef struct {
7   KSPGMRESHEADER
8 
9   /* new storage for explicit storage of preconditioned basis vectors */
10   Vec  *prevecs;           /* holds the preconditioned basis vectors for fgmres. We will allocate these at the same time as vecs
11                               above (and in the same size "chunks". */
12   Vec **prevecs_user_work; /* same purpose as user_work above, but this one is for our preconditioned vectors */
13 
14   /* new storage for explicit storage of pipelining quantities */
15   Vec  *zvecs;
16   Vec **zvecs_user_work;
17 
18   /* A shift parameter */
19   PetscScalar shift;
20 
21   /* Work space to allow all reductions in a single call */
22   Vec *redux;
23 
24 } KSP_PIPEFGMRES;
25 
26 #define HH(a, b) (pipefgmres->hh_origin + (b) * (pipefgmres->max_k + 2) + (a))
27 /* HH will be size (max_k+2)*(max_k+1)  -  think of HH as being stored columnwise for access purposes. */
28 #define HES(a, b) (pipefgmres->hes_origin + (b) * (pipefgmres->max_k + 1) + (a))
29 /* HES will be size (max_k + 1) * (max_k + 1) -  again, think of HES as being stored columnwise */
30 #define CC(a) (pipefgmres->cc_origin + (a)) /* CC will be length (max_k+1) - cosines */
31 #define SS(a) (pipefgmres->ss_origin + (a)) /* SS will be length (max_k+1) - sines */
32 #define RS(a) (pipefgmres->rs_origin + (a)) /* RS will be length (max_k+2) - rt side */
33 
34 /* vector names */
35 #define VEC_OFFSET     4
36 #define VEC_TEMP       pipefgmres->vecs[0] /* work space */
37 #define VEC_TEMP_MATOP pipefgmres->vecs[1] /* work space */
38 #define VEC_Q          pipefgmres->vecs[2] /* work space - Q pipelining var */
39 #define VEC_W          pipefgmres->vecs[3] /* work space - W pipelining var */
40 
41 #define VEC_VV(i) pipefgmres->vecs[VEC_OFFSET + i] /* use to access othog basis vectors. Note the offset, since we use the first few as workspace */
42 
43 #define PREVEC(i) pipefgmres->prevecs[i] /* use to access preconditioned basis */
44 #define ZVEC(i)   pipefgmres->zvecs[i]
45 
46 #define PIPEFGMRES_DELTA_DIRECTIONS 10
47 #define PIPEFGMRES_DEFAULT_MAXK     30
48