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