xref: /petsc/src/ksp/ksp/utils/lmvm/lmbasis.h (revision 58bddbc0aeb8e2276be3739270a4176cb222ba3a)
1 #pragma once
2 #include <petscmat.h>
3 
4 PETSC_INTERN PetscLogEvent LMBASIS_GEMM;
5 PETSC_INTERN PetscLogEvent LMBASIS_GEMV;
6 PETSC_INTERN PetscLogEvent LMBASIS_GEMVH;
7 
8 typedef struct _n_VecLink *VecLink;
9 
10 struct _n_VecLink {
11   Vec     vec;
12   VecLink next;
13 };
14 
15 // Limited Memory Basis
16 typedef struct _n_LMBasis *LMBasis;
17 struct _n_LMBasis {
18   PetscInt         m;                   // Number of vectors in the limited memory window
19   PetscInt         k;                   // Index of the history-order next vector to be inserted
20   Mat              vecs;                // Dense matrix backing storage of vectors
21   PetscObjectId    operator_id;         // If these vecs include the output of an operator (like B0 * S), the id of the operator
22   PetscObjectState operator_state;      // The state of the operator when vectors in S were computed, to determine when basis vectors are stale because B0 has changed
23   Vec              cached_product;      // Some methods will cache v <- S^T g during MatLMVMUpdate(B, x, g) for use in MatSolve(B, g, p), this is that v
24   PetscObjectId    cached_vec_id;       // The id of g, to help determine when an input vector is g that was used to compute v
25   PetscObjectState cached_vec_state;    // The state of g when v was computed, to determine when v is stale because g has changed
26   VecLink          work_vecs_available; // work vectors the layout of column vectors of S
27   VecLink          work_vecs_in_use;
28   VecLink          work_rows_available; // work vectors the layout of row vectors of S
29   VecLink          work_rows_in_use;
30 };
31 
32 PETSC_INTERN PetscErrorCode LMBasisCreate(Vec, PetscInt, LMBasis *);
33 PETSC_INTERN PetscErrorCode LMBasisDestroy(LMBasis *);
34 PETSC_INTERN PetscErrorCode LMBasisReset(LMBasis);
35 PETSC_INTERN PetscErrorCode LMBasisGetNextVec(LMBasis, Vec *);
36 PETSC_INTERN PetscErrorCode LMBasisRestoreNextVec(LMBasis, Vec *);
37 PETSC_INTERN PetscErrorCode LMBasisSetNextVec(LMBasis, Vec);
38 PETSC_INTERN PetscErrorCode LMBasisGetVecRead(LMBasis, PetscInt, Vec *);
39 PETSC_INTERN PetscErrorCode LMBasisRestoreVecRead(LMBasis, PetscInt, Vec *);
40 PETSC_INTERN PetscErrorCode LMBasisCopy(LMBasis, LMBasis);
41 PETSC_INTERN PetscErrorCode LMBasisCreateRow(LMBasis, Vec *);
42 PETSC_INTERN PetscErrorCode LMBasisGetWorkRow(LMBasis, Vec *);
43 PETSC_INTERN PetscErrorCode LMBasisRestoreWorkRow(LMBasis, Vec *);
44 PETSC_INTERN PetscErrorCode LMBasisGetWorkVec(LMBasis, Vec *);
45 PETSC_INTERN PetscErrorCode LMBasisRestoreWorkVec(LMBasis, Vec *);
46 PETSC_INTERN PetscErrorCode LMBasisGetRange(LMBasis, PetscInt *, PetscInt *);
47 PETSC_INTERN PetscErrorCode LMBasisGEMV(LMBasis, PetscInt, PetscInt, PetscScalar, Vec, PetscScalar, Vec);
48 PETSC_INTERN PetscErrorCode LMBasisGEMVH(LMBasis, PetscInt, PetscInt, PetscScalar, Vec, PetscScalar, Vec);
49 PETSC_INTERN PetscErrorCode LMBasisGEMMH(LMBasis, PetscInt, PetscInt, LMBasis, PetscInt, PetscInt, PetscScalar, PetscScalar, Mat);
50 PETSC_INTERN PetscErrorCode LMBasisSetCachedProduct(LMBasis, Vec, Vec);
51