xref: /petsc/src/ksp/ksp/impls/gmres/agmres/agmresimpl.h (revision 970231d20df44f79b27787157e39d441e79f434b)
1 /*
2   Private data structure used for the KSP AGMRES.
3   It extends the definition of KSP_GMRES and KSP_DGMRES data structures.
4   If you modify something there (located in gmresimpl.h and in dgmresimpl.h), you should  modify it here as well.
5   In this KSP, KSPSIZE denotes the size of the basis (possibly augmented with Schur vectors) and MAXKSPSIZE denotes the maximum size of the augmented basis
6 */
7 #pragma once
8 
9 #include <../src/ksp/ksp/impls/gmres/dgmres/dgmresimpl.h>
10 typedef struct {
11   KSPGMRESHEADER
12   KSPDGMRESHEADER
13 
14   /* Data specific to AGMRES */
15   PetscReal     bgv;                        /* large multiple of the remaining allowed number of steps -- used for the adaptive strategy */
16   PetscBool     ritz;                       /* Compute the Harmonic Ritz vectors instead of the Ritz vectors */
17   PetscBool     DeflPrecond;                /* Apply deflation by building adaptively a preconditioner, otherwise augment the basis */
18   PetscScalar  *Qloc;                       /* Orthogonal reflectors from the QR of the basis */
19   PetscScalar  *Rloc;                       /* triangular matrix obtained from the QR of the basis */
20   PetscScalar  *Rshift, *Ishift;            /* Real and Imaginary parts of the shifts in the Newton basis */
21   PetscScalar  *Scale;                      /* Norm of the vectors in the Newton basis */
22   PetscBool     HasShifts;                  /* Estimation of shifts exists */
23   PetscMPIInt   rank, size;                 /* Rank and size of the current process; to be used in RODDEC*/
24   PetscMPIInt   First, Last, Ileft, Iright; /* Create a ring of processors for RODDEC */
25   PetscScalar  *MatEigL, *MatEigR;          /* matrices for the eigenvalue problem */
26   PetscScalar  *sgn;                        /* Sign of the rotation in the QR factorization of the basis */
27   PetscScalar  *tloc;                       /* */
28   Vec          *TmpU;                       /* Temporary vectors */
29   PetscScalar  *beta;                       /* needed for the eigenvalues */
30   PetscBLASInt *select;                     /* array used to select the Schur vectors to order */
31   PetscScalar  *temp, *wbufptr;
32   PetscScalar  *tau; /* Scalar factors of the elementary reflectors in xgeqrf */
33   PetscMPIInt   tag;
34 } KSP_AGMRES;
35 
36 PETSC_EXTERN PetscLogEvent KSP_AGMRESComputeDeflationData;
37 PETSC_EXTERN PetscLogEvent KSP_AGMRESBuildBasis;
38 PETSC_EXTERN PetscLogEvent KSP_AGMRESComputeShifts;
39 PETSC_EXTERN PetscLogEvent KSP_AGMRESRoddec;
40 
41 /* vector names */
42 #define VEC_TMP       agmres->vecs[0]
43 #define VEC_TMP_MATOP agmres->vecs[1]
44 #define VEC_V(i)      agmres->vecs[VEC_OFFSET + i]
45 
46 #define MAXKSPSIZE (agmres->DeflPrecond ? agmres->max_k : (agmres->max_k + agmres->max_neig))
47 #define KSPSIZE    (agmres->DeflPrecond ? agmres->max_k : (agmres->max_k + agmres->r))
48 #define H(a, b)    (agmres->hh_origin + (b) * (MAXKSPSIZE + 2) + (a))
49 #define HS(a, b)   (agmres->hes_origin + (b) * (MAXKSPSIZE + 1) + (a))
50 #define RLOC(a, b) (agmres->Rloc + (b) * (MAXKSPSIZE + 1) + (a))
51 
52 PetscErrorCode KSPAGMRESRoddec(KSP, PetscInt);
53 PetscErrorCode KSPAGMRESRodvec(KSP, PetscInt, PetscScalar *, Vec);
54 PetscErrorCode KSPAGMRESLejaOrdering(PetscScalar *, PetscScalar *, PetscScalar *, PetscScalar *, PetscInt);
55 PetscErrorCode KSPAGMRESRoddecInitNeighboor(KSP);
56 PetscErrorCode KSPAGMRESComputeDeflationData(KSP);
57 
58 #define AGMRES_DEFAULT_MAXK     30
59 #define AGMRES_DELTA_DIRECTIONS 10
60