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