Actual source code: preconditioner.h
1: #ifndef __PETSc_Preconditioner_h__
4: // this contains the PETSc definition of Preconditioner
5: #include petscpc.h
7: #include esi/petsc/vector.h
9: // The esi::petsc::Preconditioner supports the
10: #include "esi/Operator.h"
11: #include "esi/Preconditioner.h"
13: namespace esi{namespace petsc{
15: /**=========================================================================**/
16: template<class Scalar,class Ordinal>
17: class Preconditioner : public virtual esi::Preconditioner<Scalar,Ordinal>,
18: public esi::petsc::Object
19: {
20: public:
22: // Default destructor.
23: ~Preconditioner(void);
25: // Construct a preconditioner from a PETSc PC
26: Preconditioner(PC pc);
28: // Interface for esi::Object ---------------
30: virtual esi::ErrorCode getInterface(const char* name, void*& iface) ;
31: virtual esi::ErrorCode getInterfacesSupported(esi::Argv * list);
34: // Interface for esi::Operator ---------------
36: virtual esi::ErrorCode setup(void);
37: virtual esi::ErrorCode apply( esi::Vector<Scalar,Ordinal>& x, esi::Vector<Scalar,Ordinal>& y);
39: // Interface for esi::Preconditioner ---------------
40: /** Input control parameters. */
41: virtual esi::ErrorCode parameters( int numParams, char** paramStrings ){return 1;};
43: /** z = M1^(-1) y */
44: virtual esi::ErrorCode solveLeft( esi::Vector<Scalar, Ordinal> & y,esi::Vector<Scalar, Ordinal> & z );
45: /** z = M2^(-1) y */
46: virtual esi::ErrorCode solveRight( esi::Vector<Scalar, Ordinal> & y, esi::Vector<Scalar, Ordinal> & z );
48: /** z = M^(-1) y */
49: virtual esi::ErrorCode solve( esi::Vector<Scalar, Ordinal> & y, esi::Vector<Scalar, Ordinal> & z );
50:
51: /** z = B y */
52: virtual esi::ErrorCode applyB( esi::Vector<Scalar,Ordinal>& y, esi::Vector<Scalar,Ordinal>& z );
54: /** Get the preconditioning side. */
55: virtual esi::ErrorCode getPreconditionerSide( PreconditionerSide & side );
57: /** Set the preconditioning side. */
58: virtual esi::ErrorCode setPreconditionerSide( PreconditionerSide side );
60: virtual esi::ErrorCode setOperator( esi::Operator<Scalar,Ordinal> &op);
61: private:
62: PC pc;
63: esi::IndexSpace<Ordinal> *rmap,*cmap;
64: esi::PreconditionerSide side;
65: };
67: /**=========================================================================**/
68: template<>
69: class Preconditioner<double,int> : public virtual esi::Preconditioner<double,int>,
70: public esi::petsc::Object
71: {
72: public:
74: // Default destructor.
75: ~Preconditioner(void);
77: // Construct a preconditioner from a PETSc PC
78: Preconditioner(PC pc);
80: // Interface for esi::Object ---------------
82: virtual esi::ErrorCode getInterface(const char* name, void*& iface) ;
83: virtual esi::ErrorCode getInterfacesSupported(esi::Argv * list);
86: // Interface for esi::Operator ---------------
88: virtual esi::ErrorCode setup(void);
89: virtual esi::ErrorCode apply( esi::Vector<double,int>& x, esi::Vector<double,int>& y);
91: // Interface for esi::Preconditioner ---------------
92: /** Input control parameters. */
93: virtual esi::ErrorCode parameters( int numParams, char** paramStrings ){return 1;};
95: /** z = M1^(-1) y */
96: virtual esi::ErrorCode solveLeft( esi::Vector<double, int> & y,esi::Vector<double, int> & z );
97: /** z = M2^(-1) y */
98: virtual esi::ErrorCode solveRight( esi::Vector<double, int> & y, esi::Vector<double, int> & z );
100: /** z = M^(-1) y */
101: virtual esi::ErrorCode solve( esi::Vector<double, int> & y, esi::Vector<double, int> & z );
102:
103: /** z = B y */
104: virtual esi::ErrorCode applyB( esi::Vector<double,int>& y, esi::Vector<double,int>& z );
106: /** Get the preconditioning side. */
107: virtual esi::ErrorCode getPreconditionerSide( PreconditionerSide & side );
109: /** Set the preconditioning side. */
110: virtual esi::ErrorCode setPreconditionerSide( PreconditionerSide side );
112: virtual esi::ErrorCode setOperator( esi::Operator<double,int> &op);
113: private:
114: PC pc;
115: esi::IndexSpace<int> *rmap,*cmap;
116: esi::PreconditionerSide side;
117: };
118: }}
120: #endif