1 #pragma once 2 3 #include <../src/ksp/ksp/utils/lmvm/lmvm.h> 4 #include <../src/ksp/ksp/utils/lmvm/rescale/symbrdnrescale.h> 5 6 /* 7 Limited-memory Symmetric Broyden method for approximating both 8 the forward product and inverse application of a Jacobian. 9 */ 10 11 // bases needed by symmetric [bad] Broyden algorithms beyond those in Mat_LMVM 12 enum { 13 SYMBROYDEN_BASIS_BKS = 0, // B_k S_k for recursive algorithms 14 SYMBROYDEN_BASIS_HKY = 1, // dual to the above, H_k Y_k 15 SYMBROYDEN_BASIS_COUNT 16 }; 17 18 typedef PetscInt SymBroydenBasisType; 19 20 // products needed by symmetric [bad] Broyden algorithms beyond those in Mat_LMVM 21 enum { 22 SYMBROYDEN_PRODUCTS_PHI = 0, // diagonal: either phi_k = phi_scalar (symm. Broyden), or phi_k is different for every k (symm. bad Broyden) 23 SYMBROYDEN_PRODUCTS_PSI = 1, // diagonal: either psi_k = psi_scalar (symm. bad Broyden), or psi_k is different for every k (symm. Broyden) 24 SYMBROYDEN_PRODUCTS_STBKS = 2, // diagonal S_k^T B_k S_k values for recursive algorithms 25 SYMBROYDEN_PRODUCTS_YTHKY = 3, // dual to the above: diagonal Y_k^T H_k Y_k values 26 SYMBROYDEN_PRODUCTS_M00 = 4, // matrix that appears in (B_* S) M_00 (B_* S)^T rank-m updates, either diagonal (recursive) or full (compact) 27 SYMBROYDEN_PRODUCTS_N00 = 5, // dual to the above, appears in (H_* Y) N_00 (H_* Y)^T rank-m updates 28 SYMBROYDEN_PRODUCTS_M01 = 6, // matrix that appears in (B_* S) M_01 Y^T rank-m updates, either diagonal (recursive) or full (compact) 29 SYMBROYDEN_PRODUCTS_N01 = 7, // dual to the above, appears in (H_* Y) N_01 S^T rank-m updates 30 SYMBROYDEN_PRODUCTS_M11 = 8, // matrix that appears in Y M_11 Y^T rank-m updates, either diagonal (recursive) or full (compact) 31 SYMBROYDEN_PRODUCTS_N11 = 9, // dual to the above, appears in S N_11 S^T rank-m updates 32 SYMBROYDEN_PRODUCTS_COUNT 33 }; 34 35 typedef PetscInt SymBroydenProductsType; 36 37 typedef struct { 38 PetscReal phi_scalar, psi_scalar; 39 PetscInt watchdog, max_seq_rejects; /* tracker to reset after a certain # of consecutive rejects */ 40 SymBroydenRescale rescale; /* context for diagonal or scalar rescaling */ 41 LMBasis basis[SYMBROYDEN_BASIS_COUNT]; 42 LMProducts products[SYMBROYDEN_PRODUCTS_COUNT]; 43 Vec StFprev, YtH0Fprev; 44 } Mat_SymBrdn; 45 46 PETSC_INTERN PetscErrorCode SymBroydenKernel_Recursive(Mat, MatLMVMMode, Vec, Vec, PetscBool); 47 PETSC_INTERN PetscErrorCode SymBroydenKernel_CompactDense(Mat, MatLMVMMode, Vec, Vec, PetscBool); 48 49 PETSC_INTERN PetscErrorCode DFPKernel_Recursive(Mat, MatLMVMMode, Vec, Vec); 50 PETSC_INTERN PetscErrorCode DFPKernel_CompactDense(Mat, MatLMVMMode, Vec, Vec); 51 PETSC_INTERN PetscErrorCode DFPKernel_Dense(Mat, MatLMVMMode, Vec, Vec); 52 53 PETSC_INTERN PetscErrorCode BFGSKernel_Recursive(Mat, MatLMVMMode, Vec, Vec); 54 PETSC_INTERN PetscErrorCode BFGSKernel_CompactDense(Mat, MatLMVMMode, Vec, Vec); 55 56 PETSC_INTERN PetscErrorCode SymBroydenCompactDenseKernelUseB0S(Mat, MatLMVMMode, Vec, PetscBool *); 57