xref: /petsc/src/ksp/ksp/utils/lmvm/dense/denseqn.h (revision 58bddbc0aeb8e2276be3739270a4176cb222ba3a)
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   dense representation for the limited-memory BFGS/DFP method.
8 */
9 
10 typedef struct {
11   PetscInt          num_updates;
12   PetscInt          num_mult_updates;
13   Mat               HY, BS; // Stored in recycled order
14   Vec               StFprev;
15   Mat               StY_triu;        // triu(StY) is the R matrix
16   Mat               StY_triu_strict; // strict_triu(YtS) is the R matrix
17   Mat               YtS_triu_strict; // strict_triu(YtS) is the L^T matrix
18   Mat               YtS_triu;        // triu(YtS) is the L matrix
19   Mat               YtHY;
20   Mat               StBS;
21   Mat               J;
22   Mat               temp_mat;
23   Vec              *PQ; /* P for BFGS, Q for DFP */
24   Vec               diag_vec;
25   Vec               diag_vec_recycle_order;
26   Vec               inv_diag_vec;
27   Vec               column_work, column_work2, rwork1, rwork2, rwork3;
28   Vec               rwork2_local, rwork3_local;
29   Vec               local_work_vec, local_work_vec_copy;
30   Vec               cyclic_work_vec;
31   MatType           dense_type;
32   MatLMVMDenseType  strategy;
33   SymBroydenRescale rescale; /* context for diagonal or scalar rescaling */
34 
35   PetscReal       *ytq, *stp, *yts;
36   PetscScalar     *workscalar;
37   PetscInt         S_count, St_count, Y_count, Yt_count;
38   PetscInt         watchdog, max_seq_rejects;        /* tracker to reset after a certain # of consecutive rejects */
39   PetscBool        allocated, use_recursive, needPQ; /* P for BFGS, Q for DFP */
40   Vec              Fprev_ref;
41   PetscObjectState Fprev_state;
42 } Mat_DQN;
43 
44 PETSC_INTERN PetscErrorCode MatView_LMVMDDFP(Mat, PetscViewer);
45 PETSC_INTERN PetscErrorCode MatView_LMVMDBFGS(Mat, PetscViewer);
46 
47 PETSC_INTERN PetscErrorCode MatUpperTriangularSolveInPlace_CUPM(PetscBool, PetscInt, const PetscScalar[], PetscInt, PetscScalar[], PetscInt);
48 PETSC_INTERN PetscErrorCode MatUpperTriangularSolveInPlaceCyclic_CUPM(PetscBool, PetscInt, PetscInt, PetscInt, const PetscScalar[], PetscInt, PetscScalar[], PetscInt);
49 
50 PETSC_INTERN PetscErrorCode VecCyclicShift(Mat, Vec, PetscInt, Vec);
51 PETSC_INTERN PetscErrorCode VecRecycleOrderToHistoryOrder(Mat, Vec, PetscInt, Vec);
52 PETSC_INTERN PetscErrorCode VecHistoryOrderToRecycleOrder(Mat, Vec, PetscInt, Vec);
53 PETSC_INTERN PetscErrorCode MatUpperTriangularSolveInPlace(Mat, Mat, Vec, PetscBool, PetscInt, MatLMVMDenseType);
54 PETSC_INTERN PetscErrorCode MatMove_LR3(Mat, Mat, PetscInt);
55