Actual source code: lmvm.h

  1: #pragma once
  2: #include <petscksp.h>
  3: #include <petsc/private/matimpl.h>
  4: #include <petsc/private/vecimpl.h>

  6: /*
  7:   MATLMVM format - a base matrix-type that represents Limited-Memory
  8:   Variable Metric (LMVM) approximations of a Jacobian.

 10:   LMVM approximations can be symmetric, symmetric positive-definite,
 11:   rectangular, or otherwise square with no determinable properties.
 12:   Each derived LMVM type should automatically set its matrix properties
 13:   if its construction can guarantee symmetry (MAT_SYMMETRIC) or symmetric
 14:   positive-definiteness (MAT_SPD).
 15: */

 17: typedef struct _MatOps_LMVM *MatOps_LMVM;
 18: struct _MatOps_LMVM {
 19:   PetscErrorCode (*update)(Mat, Vec, Vec);
 20:   PetscErrorCode (*allocate)(Mat, Vec, Vec);
 21:   PetscErrorCode (*reset)(Mat, PetscBool);
 22:   PetscErrorCode (*mult)(Mat, Vec, Vec);
 23:   PetscErrorCode (*copy)(Mat, Mat, MatStructure);
 24: };

 26: typedef struct {
 27:   /* Core data structures for stored updates */
 28:   PETSCHEADER(struct _MatOps_LMVM);
 29:   PetscBool allocated, prev_set;
 30:   PetscInt  m_old, m, k, nupdates, nrejects, nresets;
 31:   Vec      *S, *Y;
 32:   Vec       Xprev, Fprev;

 34:   /* User-defined initial Jacobian tools */
 35:   PetscBool user_pc, user_ksp, user_scale;
 36:   PetscReal ksp_rtol, ksp_atol;
 37:   PetscInt  ksp_max_it;
 38:   PetscReal J0scalar;
 39:   Vec       J0diag;
 40:   Mat       J0;
 41:   PC        J0pc;
 42:   KSP       J0ksp;

 44:   /* Data structures to support common Mat functions */
 45:   PetscReal shift;

 47:   /* Miscellenous parameters */
 48:   PetscBool square; /* flag for defining the LMVM approximation as a square matrix */
 49:   PetscReal eps;    /* (default: PetscPowReal(PETSC_MACHINE_EPSILON, 2.0/3.0)) */
 50:   void     *ctx;    /* implementation specific context */
 51: } Mat_LMVM;

 53: /* Shared internal functions for LMVM matrices */
 54: PETSC_INTERN PetscErrorCode MatUpdateKernel_LMVM(Mat, Vec, Vec);
 55: PETSC_INTERN PetscErrorCode MatUpdate_LMVM(Mat, Vec, Vec);
 56: PETSC_INTERN PetscErrorCode MatAllocate_LMVM(Mat, Vec, Vec);
 57: PETSC_INTERN PetscErrorCode MatReset_LMVM(Mat, PetscBool);

 59: /* LMVM implementations of core Mat functionality */
 60: PETSC_INTERN PetscErrorCode MatSetFromOptions_LMVM(Mat, PetscOptionItems *PetscOptionsObject);
 61: PETSC_INTERN PetscErrorCode MatSetUp_LMVM(Mat);
 62: PETSC_INTERN PetscErrorCode MatView_LMVM(Mat, PetscViewer);
 63: PETSC_INTERN PetscErrorCode MatDestroy_LMVM(Mat);
 64: PETSC_INTERN PetscErrorCode MatCreate_LMVM(Mat);

 66: /* Create functions for derived LMVM types */
 67: PETSC_EXTERN PetscErrorCode MatCreate_LMVMDFP(Mat);
 68: PETSC_EXTERN PetscErrorCode MatCreate_LMVMBFGS(Mat);
 69: PETSC_EXTERN PetscErrorCode MatCreate_LMVMSR1(Mat);
 70: PETSC_EXTERN PetscErrorCode MatCreate_LMVMBrdn(Mat);
 71: PETSC_EXTERN PetscErrorCode MatCreate_LMVMBadBrdn(Mat);
 72: PETSC_EXTERN PetscErrorCode MatCreate_LMVMSymBrdn(Mat);
 73: PETSC_EXTERN PetscErrorCode MatCreate_LMVMSymBadBrdn(Mat);
 74: PETSC_EXTERN PetscErrorCode MatCreate_LMVMDiagBrdn(Mat);

 76: /* Solve functions for derived LMVM types (necessary only for DFP and BFGS for re-use under SymBrdn) */
 77: PETSC_INTERN PetscErrorCode MatSolve_LMVMDFP(Mat, Vec, Vec);
 78: PETSC_INTERN PetscErrorCode MatSolve_LMVMBFGS(Mat, Vec, Vec);

 80: /* Mult functions for derived LMVM types (necessary only for DFP and BFGS for re-use under SymBrdn) */
 81: PETSC_INTERN PetscErrorCode MatMult_LMVMDFP(Mat, Vec, Vec);
 82: PETSC_INTERN PetscErrorCode MatMult_LMVMBFGS(Mat, Vec, Vec);