Actual source code: lmvmmat.h
petsc-3.7.7 2017-09-25
1: #ifndef __LMVMMAT_H
5: #include <petsc/private/matimpl.h>
6: #include <petscksp.h>
8: #define MatLMVM_Scale_None 0
9: #define MatLMVM_Scale_Scalar 1
10: #define MatLMVM_Scale_Broyden 2
11: #define MatLMVM_Scale_H0 3
12: #define MatLMVM_Scale_Types 4
14: #define MatLMVM_Rescale_None 0
15: #define MatLMVM_Rescale_Scalar 1
16: #define MatLMVM_Rescale_GL 2
17: #define MatLMVM_Rescale_Types 3
19: #define MatLMVM_Limit_None 0
20: #define MatLMVM_Limit_Average 1
21: #define MatLMVM_Limit_Relative 2
22: #define MatLMVM_Limit_Absolute 3
23: #define MatLMVM_Limit_Types 4
25: #define TAO_ZERO_SAFEGUARD 1e-8
26: #define TAO_INF_SAFEGUARD 1e+8
28: typedef struct{
29: PetscBool allocated;
30: PetscInt lm;
31: PetscReal eps;
32: PetscInt limitType;
33: PetscInt scaleType;
34: PetscInt rScaleType;
36: PetscReal s_alpha; /* Factor for scalar scaling */
37: PetscReal r_alpha; /* Factor on scalar for rescaling diagonal matrix */
38: PetscReal r_beta; /* Factor on diagonal for rescaling diagonal matrix */
39: PetscReal mu; /* Factor for using historical information */
40: PetscReal nu; /* Factor for using historical information */
41: PetscReal phi; /* Factor for Broyden scaling */
43: PetscInt scalar_history; /* Amount of history to keep for scalar scaling */
44: PetscReal *yy_history; /* Past information for scalar scaling */
45: PetscReal *ys_history; /* Past information for scalar scaling */
46: PetscReal *ss_history; /* Past information for scalar scaling */
48: PetscInt rescale_history; /* Amount of history to keep for rescaling diagonal */
49: PetscReal *yy_rhistory; /* Past information for scalar rescaling */
50: PetscReal *ys_rhistory; /* Past information for scalar rescaling */
51: PetscReal *ss_rhistory; /* Past information for scalar rescaling */
53: PetscReal delta_max; /* Maximum value for delta */
54: PetscReal delta_min; /* Minimum value for delta */
56: PetscInt lmnow;
57: PetscInt iter;
58: PetscInt nupdates;
59: PetscInt nrejects;
61: Vec *S;
62: Vec *Y;
63: Vec Gprev;
64: Vec Xprev;
66: Vec D;
67: Vec U;
68: Vec V;
69: Vec W;
70: Vec P;
71: Vec Q;
73: PetscReal delta;
74: PetscReal sigma;
75: PetscReal theta;
76: PetscReal *rho;
77: PetscReal *beta;
79: PetscBool useDefaultH0;
80: Mat H0_mat;
81: KSP H0_ksp;
82: Vec H0_norm;
84: PetscBool useScale;
85: Vec scale;
88: } MatLMVMCtx;
91: extern PetscErrorCode MatCreateLMVM(MPI_Comm,PetscInt,PetscInt,Mat*);
94: /* PETSc Mat overrides */
95: extern PetscErrorCode MatView_LMVM(Mat,PetscViewer);
96: extern PetscErrorCode MatDestroy_LMVM(Mat);
98: /*
99: int MatMultTranspose_LMVM(Mat,Vec,Vec);
100: int MatDiagonalShift_LMVM(Vec,Mat);
101: int MatDestroy_LMVM(Mat);
102: int MatShift_LMVM(Mat,PetscReal);
103: int MatDuplicate_LMVM(Mat,MatDuplicateOption,Mat*);
104: int MatEqual_LMVM(Mat,Mat,PetscBool*);
105: int MatScale_LMVM(Mat,PetscReal);
106: int MatGetSubMatrix_LMVM(Mat,IS,IS,int,MatReuse,Mat *);
107: int MatGetSubMatrices_LMVM(Mat,int,IS*,IS*,MatReuse,Mat**);
108: int MatTranspose_LMVM(Mat,Mat*);
109: int MatGetDiagonal_LMVM(Mat,Vec);
110: int MatGetColumnVector_LMVM(Mat,Vec, int);
111: int MatNorm_LMVM(Mat,NormType,PetscReal *);
112: */
114: /* Functions used by TAO */
115: PetscErrorCode MatLMVMReset(Mat);
116: PetscErrorCode MatLMVMUpdate(Mat,Vec, Vec);
117: PetscErrorCode MatLMVMSetDelta(Mat,PetscReal);
118: PetscErrorCode MatLMVMSetScale(Mat,Vec);
119: PetscErrorCode MatLMVMGetRejects(Mat,PetscInt*);
120: PetscErrorCode MatLMVMSetH0(Mat,Mat);
121: PetscErrorCode MatLMVMGetH0(Mat,Mat*);
122: PetscErrorCode MatLMVMGetH0KSP(Mat,KSP*);
123: PetscErrorCode MatLMVMSetPrev(Mat,Vec,Vec);
124: PetscErrorCode MatLMVMGetX0(Mat,Vec);
125: PetscErrorCode MatLMVMRefine(Mat, Mat, Vec, Vec);
126: PetscErrorCode MatLMVMAllocateVectors(Mat m, Vec v);
127: PetscErrorCode MatLMVMSolve(Mat, Vec, Vec);
130: #endif