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