Actual source code: vector.h

  1: #ifndef __PETSc_Vector_h__

  4: // The esi::petsc::Vector supports the
  5: //    esi::Vector<Scalar,Ordinal>
  6: //    esi::Vector<Scalar,Ordinal>ReplaceAccess interfaces

 8:  #include esi/petsc/indexspace.h

 10: #include "esi/Vector.h"
 11: #include "esi/VectorReplaceAccess.h"

 13: // this contains the PETSc definition of Vector
 14:  #include petscvec.h

 16: namespace esi{namespace petsc{

 18: /**=========================================================================**/
 19: template<class Scalar,class Ordinal>
 20:   class Vector : public virtual esi::VectorReplaceAccess<Scalar,Ordinal>, public esi::petsc::Object
 21: {
 22:   public:

 24:     // Destructor.
 25:     virtual ~Vector(void);

 27:     // Construct a Vector from a IndexSpace.
 28:     Vector(  esi::IndexSpace<Ordinal> *source);

 30:     // Construct a Vector from a PETSc Vector
 31:     Vector(Vec pvec);

 33:     //  Interface for esi::Object  ---------------

 35:     virtual esi::ErrorCode getInterface(const char* name, void*& iface);
 36:     virtual esi::ErrorCode getInterfacesSupported(esi::Argv * list);


 39:     //  Interface for ESI_Vector  ---------------
 40: 
 41:     virtual esi::ErrorCode clone(esi::Vector<Scalar,Ordinal>*& x);
 42:     virtual esi::ErrorCode getGlobalSize( Ordinal & dim) ;
 43:     virtual esi::ErrorCode getLocalSize( Ordinal & dim) ;
 44:     virtual esi::ErrorCode getIndexSpace(  esi::IndexSpace<Ordinal>*& outmap)  ;
 45:     virtual esi::ErrorCode copy( esi::Vector<Scalar,Ordinal>& x) ;
 46:     virtual esi::ErrorCode put(  Scalar scalar) ;
 47:     virtual esi::ErrorCode scale(  Scalar scalar) ;
 48:     virtual esi::ErrorCode scaleDiagonal(  esi::Vector<Scalar,Ordinal>& x) ;
 49:     virtual esi::ErrorCode norm1( Scalar& norm)   ;
 50:     virtual esi::ErrorCode norm2( Scalar& norm)   ;
 51:     virtual esi::ErrorCode norm2squared( Scalar& norm)   ;
 52:     virtual esi::ErrorCode normInfinity( Scalar& norm)   ;
 53:     virtual esi::ErrorCode dot( esi::Vector<Scalar,Ordinal>& x, Scalar& product)   ;
 54:     virtual esi::ErrorCode axpy( esi::Vector<Scalar,Ordinal>& x, Scalar scalar) ;
 55:     virtual esi::ErrorCode aypx(Scalar scalar, esi::Vector<Scalar,Ordinal>& x) ;

 57:     virtual esi::ErrorCode minAbsCoef(Scalar &)  {return 1;}
 58:     virtual esi::ErrorCode axpby(Scalar,esi::Vector<Scalar,Ordinal>&,Scalar,esi::Vector<Scalar,Ordinal>&);
 59:     virtual esi::ErrorCode getCoefPtrReadLock(Scalar *&) ;
 60:     virtual esi::ErrorCode getCoefPtrReadWriteLock(Scalar *&);
 61:     virtual esi::ErrorCode releaseCoefPtrLock(Scalar *&) ;

 63:     // Interface for ESI_VectorReplaceAccess
 64: 
 65:     virtual esi::ErrorCode setArrayPointer(Scalar* array, Ordinal length);

 67:   private:
 68:     Vec                      vec;
 69:     esi::IndexSpace<Ordinal> *map;
 70: };

 72: /**=========================================================================**/
 73: template<>
 74:   class Vector<double,int>: public virtual esi::VectorReplaceAccess<double,int>, public esi::petsc::Object
 75: {
 76:   public:

 78:     // Destructor.
 79:     virtual ~Vector(void);

 81:     // Construct a Vector from a IndexSpace.
 82:     Vector(  esi::IndexSpace<int> *source);

 84:     // Construct a Vector from a PETSc Vector
 85:     Vector(Vec pvec);

 87:     //  Interface for esi::Object  ---------------

 89:     virtual esi::ErrorCode getInterface(const char* name, void*& iface);
 90:     virtual esi::ErrorCode getInterfacesSupported(esi::Argv * list);


 93:     //  Interface for ESI_Vector  ---------------
 94: 
 95:     virtual esi::ErrorCode clone(esi::Vector<double,int>*& x);
 96:     virtual esi::ErrorCode getGlobalSize( int & dim) ;
 97:     virtual esi::ErrorCode getLocalSize( int & dim) ;
 98:     virtual esi::ErrorCode getIndexSpace(  esi::IndexSpace<int>*& outmap)  ;
 99:     virtual esi::ErrorCode copy( esi::Vector<double,int>& x) ;
100:     virtual esi::ErrorCode put(  double scalar) ;
101:     virtual esi::ErrorCode scale(  double scalar) ;
102:     virtual esi::ErrorCode scaleDiagonal(  esi::Vector<double,int>& x) ;
103:     virtual esi::ErrorCode norm1( double& norm)   ;
104:     virtual esi::ErrorCode norm2( double& norm)   ;
105:     virtual esi::ErrorCode norm2squared( double& norm)   ;
106:     virtual esi::ErrorCode normInfinity( double& norm)   ;
107:     virtual esi::ErrorCode dot( esi::Vector<double,int>& x, double& product)   ;
108:     virtual esi::ErrorCode axpy( esi::Vector<double,int>& x, double scalar) ;
109:     virtual esi::ErrorCode aypx(double scalar, esi::Vector<double,int>& x) ;

111:     virtual esi::ErrorCode minAbsCoef(double &)  {return 1;}
112:     virtual esi::ErrorCode axpby(double,esi::Vector<double,int>&,double,esi::Vector<double,int>&);
113:     virtual esi::ErrorCode getCoefPtrReadLock(double *&) ;
114:     virtual esi::ErrorCode getCoefPtrReadWriteLock(double *&);
115:     virtual esi::ErrorCode releaseCoefPtrLock(double *&) ;

117:     // Interface for ESI_VectorReplaceAccess
118: 
119:     virtual esi::ErrorCode setArrayPointer(double* array, int length);

121:   private:
122:     Vec                      vec;
123:     esi::IndexSpace<int> *map;
124: };

126: }
127:   /* -------------------------------------------------------------------------*/

129: template<class Scalar,class Ordinal> class VectorFactory
130: #if defined(PETSC_HAVE_CCA)
131:            :  public virtual gov::cca::Port, public virtual gov::cca::Component
132: #endif
133: {
134:   public:

136:     // Destructor.
137:   virtual ~VectorFactory(void){};

139:     // Interface for gov::cca::Component
140: #if defined(PETSC_HAVE_CCA)
141:     virtual void setServices(gov::cca::Services *) = 0;
142: #endif

144:     // Construct a Vector
145:     virtual esi::ErrorCode getVector(esi::IndexSpace<Ordinal>&,esi::Vector<Scalar,Ordinal>*&v) = 0;
146: };

148: }
149: EXTERN int VecESIWrap(Vec,esi::Vector<double,int>**);

151: #endif