Actual source code: svdimpl.h
1: /*
2: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3: SLEPc - Scalable Library for Eigenvalue Problem Computations
4: Copyright (c) 2002-2010, Universidad Politecnica de Valencia, Spain
6: This file is part of SLEPc.
7:
8: SLEPc is free software: you can redistribute it and/or modify it under the
9: terms of version 3 of the GNU Lesser General Public License as published by
10: the Free Software Foundation.
12: SLEPc is distributed in the hope that it will be useful, but WITHOUT ANY
13: WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14: FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
15: more details.
17: You should have received a copy of the GNU Lesser General Public License
18: along with SLEPc. If not, see <http://www.gnu.org/licenses/>.
19: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
20: */
22: #ifndef _SVDIMPL
23: #define _SVDIMPL
25: #include slepcsvd.h
26: #include slepcip.h
31: typedef struct _SVDOps *SVDOps;
33: struct _SVDOps {
34: PetscErrorCode (*solve)(SVD);
35: PetscErrorCode (*setup)(SVD);
36: PetscErrorCode (*setfromoptions)(SVD);
37: PetscErrorCode (*publishoptions)(SVD);
38: PetscErrorCode (*destroy)(SVD);
39: PetscErrorCode (*view)(SVD,PetscViewer);
40: };
42: /*
43: Maximum number of monitors you can run with a single SVD
44: */
45: #define MAXSVDMONITORS 5
47: /*
48: Defines the SVD data structure.
49: */
50: struct _p_SVD {
51: PETSCHEADER(struct _SVDOps);
52: Mat OP; /* problem matrix */
53: Mat A; /* problem matrix (m>n) */
54: Mat AT; /* transposed matrix */
55: SVDTransposeMode transmode; /* transpose mode */
56: PetscReal *sigma; /* singular values */
57: PetscInt *perm; /* permutation for singular value ordering */
58: Vec *U,*V; /* left and right singular vectors */
59: Vec *IS; /* placeholder for references to user-provided initial space */
60: PetscInt n; /* maximun size of descomposition */
61: SVDWhich which; /* which singular values are computed */
62: PetscInt nconv; /* number of converged values */
63: PetscInt nsv; /* number of requested values */
64: PetscInt ncv; /* basis size */
65: PetscInt mpd; /* maximum dimension of projected problem */
66: PetscInt nini; /* number of initial vectors (negative means not copied yet) */
67: PetscInt its; /* iteration counter */
68: PetscInt max_it; /* max iterations */
69: PetscReal tol; /* tolerance */
70: PetscReal *errest; /* error estimates */
71: PetscRandom rand; /* random number generator */
72: void *data; /* placeholder for misc stuff associated
73: with a particular solver */
74: PetscInt setupcalled;
75: SVDConvergedReason reason;
76: IP ip;
77: PetscTruth trackall;
78:
79: PetscErrorCode (*monitor[MAXSVDMONITORS])(SVD,PetscInt,PetscInt,PetscReal*,PetscReal*,PetscInt,void*);
80: PetscErrorCode (*monitordestroy[MAXSVDMONITORS])(void*);
81: void *monitorcontext[MAXSVDMONITORS];
82: PetscInt numbermonitors;
83:
84: PetscInt matvecs;
85: };
87: EXTERN PetscErrorCode SVDRegisterAll(char *);
88: EXTERN PetscErrorCode SVDInitializePackage(char*);
89: EXTERN PetscErrorCode SVDFinalizePackage(void);
91: #define SVDMonitor(svd,it,nconv,sigma,errest,nest) \
92: { PetscErrorCode _ierr; PetscInt _i,_im = svd->numbermonitors; \
93: for ( _i=0; _i<_im; _i++ ) {\
94: _ierr=(*svd->monitor[_i])(svd,it,nconv,sigma,errest,nest,svd->monitorcontext[_i]);\
95: CHKERRQ(_ierr); \
96: } \
97: }
99: /* context for SVDMonitorConverged */
100: typedef struct {
101: PetscViewerASCIIMonitor viewer;
102: PetscInt oldnconv;
103: } SVDMONITOR_CONV;
104: EXTERN PetscErrorCode SVDMonitorDestroy_Converged(SVDMONITOR_CONV*);
106: EXTERN PetscErrorCode SVDDestroy_Default(SVD);
107: EXTERN PetscErrorCode SVDMatMult(SVD,PetscTruth,Vec,Vec);
108: EXTERN PetscErrorCode SVDMatGetVecs(SVD,Vec*,Vec*);
109: EXTERN PetscErrorCode SVDMatGetSize(SVD,PetscInt*,PetscInt*);
110: EXTERN PetscErrorCode SVDMatGetLocalSize(SVD,PetscInt*,PetscInt*);
111: EXTERN PetscErrorCode SVDTwoSideLanczos(SVD,PetscReal*,PetscReal*,Vec*,Vec,Vec*,PetscInt,PetscInt,PetscScalar*);
113: #endif