Actual source code: agmresimpl.h
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
9: #include <../src/ksp/ksp/impls/gmres/dgmres/dgmresimpl.h>
10: typedef struct {
11: KSPGMRESHEADER
12: KSPDGMRESHEADER
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;
36: PETSC_EXTERN PetscLogEvent KSP_AGMRESComputeDeflationData;
37: PETSC_EXTERN PetscLogEvent KSP_AGMRESBuildBasis;
38: PETSC_EXTERN PetscLogEvent KSP_AGMRESComputeShifts;
39: PETSC_EXTERN PetscLogEvent KSP_AGMRESRoddec;
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]
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))
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);
58: #define AGMRES_DEFAULT_MAXK 30
59: #define AGMRES_DELTA_DIRECTIONS 10