xref: /petsc/include/petscvec.h (revision 0c735eeda8a2887117349413b2056a31b1879af2)
12eac72dbSBarry Smith /*
237f753daSBarry Smith     Defines the vector component of PETSc. Vectors generally represent
337f753daSBarry Smith   degrees of freedom for finite element/finite difference functions
484cb2905SBarry Smith   on a grid. They have more mathematical structure then simple arrays.
52eac72dbSBarry Smith */
62eac72dbSBarry Smith 
70a835dfdSSatish Balay #ifndef __PETSCVEC_H
80a835dfdSSatish Balay #define __PETSCVEC_H
90a835dfdSSatish Balay #include "petscis.h"
100a835dfdSSatish Balay #include "petscsys.h"
11e9fa29b7SSatish Balay PETSC_EXTERN_CXX_BEGIN
122eac72dbSBarry Smith 
1309321671SBarry Smith /*S
148a124369SBarry Smith      PetscMap - Abstract PETSc object that defines the layout of vector and
15013c094aSBarry Smith   matrices across processors
1609321671SBarry Smith 
1709321671SBarry Smith    Level: advanced
1809321671SBarry Smith 
1909321671SBarry Smith    Notes:
2009321671SBarry Smith     Does not play a role in the PETSc design, can be ignored
2109321671SBarry Smith 
2209321671SBarry Smith   Concepts: parallel decomposition
2309321671SBarry Smith 
248a124369SBarry Smith .seealso:  PetscMapCreateMPI()
2509321671SBarry Smith S*/
268a124369SBarry Smith typedef struct _p_PetscMap*         PetscMap;
2709321671SBarry Smith 
28d772e1d7SMatthew Knepley #define MAP_SEQ "seq"
29d772e1d7SMatthew Knepley #define MAP_MPI "mpi"
3049773a63SBarry Smith #define PetscMapType char*
31d772e1d7SMatthew Knepley 
32d772e1d7SMatthew Knepley /* Logging support */
336849ba73SBarry Smith extern PetscCookie MAP_COOKIE;
34d772e1d7SMatthew Knepley 
35*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT PetscMapCreate(MPI_Comm,PetscMap*);
3665f510b9SBarry Smith PetscPolymorphicSubroutine(PetscMapCreate,(PetscMap*m),(m))
3765f510b9SBarry Smith PetscPolymorphicFunction(PetscMapCreate,(void),(PETSC_COMM_SELF,&m),PetscMap,m)
38*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT PetscMapCreateMPI(MPI_Comm,PetscInt,PetscInt,PetscMap*);
3965f510b9SBarry Smith PetscPolymorphicFunction(PetscMapCreateMPI,(MPI_Comm comm,PetscInt l,PetscInt g),(comm,l,g,&m),PetscMap,m)
40*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT PetscMapSetFromOptions(PetscMap);
41*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT PetscMapPrintHelp(PetscMap);
42*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT PetscMapDestroy(PetscMap);
43d772e1d7SMatthew Knepley 
44*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT PetscMapSetLocalSize(PetscMap,PetscInt);
45*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT PetscMapGetLocalSize(PetscMap,PetscInt *);
469785fde0SSatish Balay PetscPolymorphicFunction(PetscMapGetLocalSize,(PetscMap m),(m,&s),PetscInt,s)
47*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT PetscMapSetSize(PetscMap,PetscInt);
48*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT PetscMapGetSize(PetscMap,PetscInt *);
499785fde0SSatish Balay PetscPolymorphicFunction(PetscMapGetSize,(PetscMap m),(m,&s),PetscInt,s)
50*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT PetscMapGetLocalRange(PetscMap,PetscInt *,PetscInt *);
51*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT PetscMapGetGlobalRange(PetscMap,PetscInt *[]);
52d772e1d7SMatthew Knepley 
53d772e1d7SMatthew Knepley /* Dynamic creation and loading functions */
54d772e1d7SMatthew Knepley extern PetscFList PetscMapList;
55d772e1d7SMatthew Knepley extern PetscTruth PetscMapRegisterAllCalled;
56*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT PetscMapSetType(PetscMap, const PetscMapType);
57*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT PetscMapGetType(PetscMap, PetscMapType *);
589785fde0SSatish Balay PetscPolymorphicFunction(PetscMapGetType,(PetscMap m),(m,&t),PetscMapType,t)
59*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT PetscMapRegister(const char[],const char[],const char[],PetscErrorCode (*)(PetscMap));
60*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT PetscMapRegisterAll(const char []);
61*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT PetscMapRegisterDestroy(void);
62d772e1d7SMatthew Knepley #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
63d772e1d7SMatthew Knepley #define PetscMapRegisterDynamic(a,b,c,d) PetscMapRegister(a,b,c,0)
64d772e1d7SMatthew Knepley #else
65d772e1d7SMatthew Knepley #define PetscMapRegisterDynamic(a,b,c,d) PetscMapRegister(a,b,c,d)
66d772e1d7SMatthew Knepley #endif
67d772e1d7SMatthew Knepley 
6809321671SBarry Smith /*S
6909321671SBarry Smith      Vec - Abstract PETSc vector object
7009321671SBarry Smith 
7109321671SBarry Smith    Level: beginner
7209321671SBarry Smith 
7309321671SBarry Smith   Concepts: field variables, unknowns, arrays
7409321671SBarry Smith 
7509321671SBarry Smith .seealso:  VecCreate(), VecType, VecSetType()
7609321671SBarry Smith S*/
77f09e8eb9SSatish Balay typedef struct _p_Vec*         Vec;
7809321671SBarry Smith 
7909321671SBarry Smith /*S
8009321671SBarry Smith      VecScatter - Object used to manage communication of data
8109321671SBarry Smith        between vectors in parallel. Manages both scatters and gathers
8209321671SBarry Smith 
8309321671SBarry Smith    Level: beginner
8409321671SBarry Smith 
8509321671SBarry Smith   Concepts: scatter
8609321671SBarry Smith 
8709321671SBarry Smith .seealso:  VecScatterCreate(), VecScatterBegin(), VecScatterEnd()
8809321671SBarry Smith S*/
89f09e8eb9SSatish Balay typedef struct _p_VecScatter*  VecScatter;
9009321671SBarry Smith 
9109321671SBarry Smith /*E
9209321671SBarry Smith     VecType - String with the name of a PETSc vector or the creation function
9309321671SBarry Smith        with an optional dynamic library name, for example
9409321671SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:myveccreate()
9509321671SBarry Smith 
9609321671SBarry Smith    Level: beginner
9709321671SBarry Smith 
9809321671SBarry Smith .seealso: VecSetType(), Vec
9909321671SBarry Smith E*/
1000676abe4SMatthew Knepley #define VECSEQ         "seq"
1010676abe4SMatthew Knepley #define VECMPI         "mpi"
1020676abe4SMatthew Knepley #define VECFETI        "feti"
1030676abe4SMatthew Knepley #define VECSHARED      "shared"
10449773a63SBarry Smith #define VecType char*
1052eac72dbSBarry Smith 
106fd487807SMatthew Knepley /* Logging support */
107552e946dSBarry Smith #define    VEC_FILE_COOKIE 1211214
108*0c735eedSKris Buschelman extern PETSCVEC_DLLEXPORT PetscCookie VEC_COOKIE;
109*0c735eedSKris Buschelman extern PETSCVEC_DLLEXPORT PetscCookie VEC_SCATTER_COOKIE;
1106849ba73SBarry Smith extern PetscEvent    VEC_View, VEC_Max, VEC_Min, VEC_DotBarrier, VEC_Dot, VEC_MDotBarrier, VEC_MDot, VEC_TDot, VEC_MTDot;
1116849ba73SBarry Smith extern PetscEvent    VEC_Norm, VEC_Normalize, VEC_Scale, VEC_Copy, VEC_Set, VEC_AXPY, VEC_AYPX, VEC_WAXPY, VEC_MAXPY;
1126849ba73SBarry Smith extern PetscEvent    VEC_AssemblyEnd, VEC_PointwiseMult, VEC_SetValues, VEC_Load, VEC_ScatterBarrier, VEC_ScatterBegin, VEC_ScatterEnd;
1136849ba73SBarry Smith extern PetscEvent    VEC_SetRandom, VEC_ReduceArithmetic, VEC_ReduceBarrier, VEC_ReduceCommunication;
1146849ba73SBarry Smith extern PetscEvent    VEC_Swap, VEC_AssemblyBegin, VEC_NormBarrier;
1158ba1e511SMatthew Knepley 
116*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecInitializePackage(char *);
117fd487807SMatthew Knepley 
118*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecCreate(MPI_Comm,Vec *);
119045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecCreate,(Vec *x),(PETSC_COMM_SELF,x))
120*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecCreateSeq(MPI_Comm,PetscInt,Vec*);
121045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecCreateSeq,(PetscInt n,Vec *x),(PETSC_COMM_SELF,n,x))
122*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecCreateMPI(MPI_Comm,PetscInt,PetscInt,Vec*);
123045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecCreateMPI,(PetscInt n,PetscInt N,Vec *x),(PETSC_COMM_WORLD,n,N,x))
124*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecCreateSeqWithArray(MPI_Comm,PetscInt,const PetscScalar[],Vec*);
125045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecCreateSeqWithArray,(PetscInt n,PetscScalar s[],Vec *x),(PETSC_COMM_SELF,n,s,x))
126*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecCreateMPIWithArray(MPI_Comm,PetscInt,PetscInt,const PetscScalar[],Vec*);
127045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecCreateMPIWithArray,(PetscInt n,PetscInt N,PetscScalar s[],Vec *x),(PETSC_COMM_WORLD,n,N,s,x))
128*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecCreateShared(MPI_Comm,PetscInt,PetscInt,Vec*);
129*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecSetFromOptions(Vec);
130*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecPrintHelp(Vec);
131*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecDestroy(Vec);
1324b0e389bSBarry Smith 
133*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecSetSizes(Vec,PetscInt,PetscInt);
134fd487807SMatthew Knepley 
135*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecDot(Vec,Vec,PetscScalar*);
136*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecTDot(Vec,Vec,PetscScalar*);
137*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecMDot(PetscInt,Vec,const Vec[],PetscScalar*);
138*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecMTDot(PetscInt,Vec,const Vec[],PetscScalar*);
139cddf8d76SBarry Smith 
14009321671SBarry Smith /*E
14109321671SBarry Smith     NormType - determines what type of norm to compute
14209321671SBarry Smith 
14309321671SBarry Smith     Level: beginner
14409321671SBarry Smith 
14509321671SBarry Smith .seealso: VecNorm(), VecNormBegin(), VecNormEnd(), MatNorm()
14609321671SBarry Smith E*/
14793c39befSBarry Smith typedef enum {NORM_1=1,NORM_2=2,NORM_FROBENIUS=3,NORM_INFINITY=4,NORM_1_AND_2=5} NormType;
148cddf8d76SBarry Smith #define NORM_MAX NORM_INFINITY
14909321671SBarry Smith 
1509b250c83SBarry Smith /*MC
1519b250c83SBarry Smith      NORM_1 - the one norm, ||v|| = sum_i | v_i |. ||A|| = max_j || v_*j ||, maximum column sum
1529b250c83SBarry Smith 
1539b250c83SBarry Smith    Level: beginner
1549b250c83SBarry Smith 
1559b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_2, NORM_FROBENIUS,
1569b250c83SBarry Smith            NORM_INFINITY, NORM_1_AND_2
1579b250c83SBarry Smith 
1589b250c83SBarry Smith M*/
1599b250c83SBarry Smith 
1609b250c83SBarry Smith /*MC
1619b250c83SBarry Smith      NORM_2 - the two norm, ||v|| = sqrt(sum_i (v_i)^2) (vectors only)
1629b250c83SBarry Smith 
1639b250c83SBarry Smith    Level: beginner
1649b250c83SBarry Smith 
1659b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_FROBENIUS,
1669b250c83SBarry Smith            NORM_INFINITY, NORM_1_AND_2
1679b250c83SBarry Smith 
1689b250c83SBarry Smith M*/
1699b250c83SBarry Smith 
1709b250c83SBarry Smith /*MC
1719b250c83SBarry Smith      NORM_FROBENIUS - ||A|| = sqrt(sum_ij (A_ij)^2), same as NORM_2 for vectors
1729b250c83SBarry Smith 
1739b250c83SBarry Smith    Level: beginner
1749b250c83SBarry Smith 
1759b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
1769b250c83SBarry Smith            NORM_INFINITY, NORM_1_AND_2
1779b250c83SBarry Smith 
1789b250c83SBarry Smith M*/
1799b250c83SBarry Smith 
1809b250c83SBarry Smith /*MC
1819b250c83SBarry Smith      NORM_INFINITY - ||v|| = max_i |v_i|. ||A|| = max_i || v_i* ||, maximum row sum
1829b250c83SBarry Smith 
1839b250c83SBarry Smith    Level: beginner
1849b250c83SBarry Smith 
1859b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
1869b250c83SBarry Smith            NORM_FROBINIUS, NORM_1_AND_2
1879b250c83SBarry Smith 
1889b250c83SBarry Smith M*/
1899b250c83SBarry Smith 
1909b250c83SBarry Smith /*MC
1919b250c83SBarry Smith      NORM_1_AND_2 - computes both the 1 and 2 norm of a vector
1929b250c83SBarry Smith 
1939b250c83SBarry Smith    Level: beginner
1949b250c83SBarry Smith 
1959b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
1969b250c83SBarry Smith            NORM_FROBINIUS, NORM_INFINITY
1979b250c83SBarry Smith 
1989b250c83SBarry Smith M*/
1999b250c83SBarry Smith 
2009b250c83SBarry Smith /*MC
2019b250c83SBarry Smith      NORM_MAX - see NORM_INFINITY
2029b250c83SBarry Smith 
203d41222bbSBarry Smith    Level: beginner
204d41222bbSBarry Smith 
2059b250c83SBarry Smith M*/
2069b250c83SBarry Smith 
207*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecNorm(Vec,NormType,PetscReal *);
208045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecNorm,(Vec x,PetscReal *r),(x,NORM_2,r))
209c714d2d0SBarry Smith PetscPolymorphicFunction(VecNorm,(Vec x,NormType t),(x,t,&r),PetscReal,r)
210c714d2d0SBarry Smith PetscPolymorphicFunction(VecNorm,(Vec x),(x,NORM_2,&r),PetscReal,r)
211*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecNormComposedDataID(NormType,PetscInt*);
212*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecNormalize(Vec,PetscReal *);
213*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecSum(Vec,PetscScalar*);
214*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecMax(Vec,PetscInt*,PetscReal *);
215045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecMax,(Vec x,PetscReal *r),(x,PETSC_NULL,r))
216*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecMin(Vec,PetscInt*,PetscReal *);
217045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecMin,(Vec x,PetscReal *r),(x,PETSC_NULL,r))
218*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecScale(const PetscScalar *a,Vec v);
219*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecCopy(Vec,Vec);
220*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecSetRandom(PetscRandom,Vec);
221*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecSet(const PetscScalar*,Vec);
222*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecSwap(Vec,Vec);
223*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecAXPY(const PetscScalar*,Vec,Vec);
224*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecAXPBY(const PetscScalar*,const PetscScalar *,Vec,Vec);
225*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecMAXPY(PetscInt,const PetscScalar*,Vec,Vec*);
226*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecAYPX(const PetscScalar*,Vec,Vec);
227*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecWAXPY(const PetscScalar*,Vec,Vec,Vec);
228*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecPointwiseMax(Vec,Vec,Vec);
229*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecPointwiseMaxAbs(Vec,Vec,Vec);
230*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecPointwiseMin(Vec,Vec,Vec);
231*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecPointwiseMult(Vec,Vec,Vec);
232*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecPointwiseDivide(Vec,Vec,Vec);
233*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecMaxPointwiseDivide(Vec,Vec,PetscReal*);
234*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecShift(const PetscScalar*,Vec);
235*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecReciprocal(Vec);
236*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecPermute(Vec, IS, PetscTruth);
237*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecSqrt(Vec);
238*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecAbs(Vec);
239*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecDuplicate(Vec,Vec*);
240*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecDuplicateVecs(Vec,PetscInt,Vec*[]);
241*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecDestroyVecs(Vec[],PetscInt);
242*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecGetPetscMap(Vec,PetscMap*);
2432eac72dbSBarry Smith 
244*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecStrideNormAll(Vec,NormType,PetscReal*);
245*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecStrideMaxAll(Vec,PetscInt *,PetscReal *);
246*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecStrideMinAll(Vec,PetscInt *,PetscReal *);
247*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecStrideScaleAll(Vec,PetscScalar*);
2484a560884SBarry Smith 
249*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecStrideNorm(Vec,PetscInt,NormType,PetscReal*);
250*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecStrideMax(Vec,PetscInt,PetscInt *,PetscReal *);
251*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecStrideMin(Vec,PetscInt,PetscInt *,PetscReal *);
252*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecStrideScale(Vec,PetscInt,PetscScalar*);
253*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecStrideGather(Vec,PetscInt,Vec,InsertMode);
254*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecStrideScatter(Vec,PetscInt,Vec,InsertMode);
255*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecStrideGatherAll(Vec,Vec*,InsertMode);
256*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecStrideScatterAll(Vec*,Vec,InsertMode);
257d2655a18SBarry Smith 
258*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecSetValues(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
259*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecGetValues(Vec,PetscInt,const PetscInt[],PetscScalar[]);
260*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecAssemblyBegin(Vec);
261*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecAssemblyEnd(Vec);
262*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecStashSetInitialSize(Vec,PetscInt,PetscInt);
263*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecStashView(Vec,PetscViewer);
264*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecStashGetInfo(Vec,PetscInt*,PetscInt*,PetscInt*,PetscInt*);
26562dc5420SSatish Balay 
266*0c735eedSKris Buschelman extern PETSCVEC_DLLEXPORT PetscInt    VecSetValue_Row;
267*0c735eedSKris Buschelman extern PETSCVEC_DLLEXPORT PetscScalar VecSetValue_Value;
26830de9b25SBarry Smith /*MC
26930de9b25SBarry Smith    VecSetValue - Set a single entry into a vector.
27030de9b25SBarry Smith 
27130de9b25SBarry Smith    Synopsis:
272d360dc6fSBarry Smith    PetscErrorCode VecSetValue(Vec v,int row,PetscScalar value, InsertMode mode);
27330de9b25SBarry Smith 
27430de9b25SBarry Smith    Not Collective
27530de9b25SBarry Smith 
27630de9b25SBarry Smith    Input Parameters:
27730de9b25SBarry Smith +  v - the vector
27830de9b25SBarry Smith .  row - the row location of the entry
27930de9b25SBarry Smith .  value - the value to insert
28030de9b25SBarry Smith -  mode - either INSERT_VALUES or ADD_VALUES
28130de9b25SBarry Smith 
28230de9b25SBarry Smith    Notes:
28330de9b25SBarry Smith    For efficiency one should use VecSetValues() and set several or
28430de9b25SBarry Smith    many values simultaneously if possible.
28530de9b25SBarry Smith 
2861d73ed98SBarry Smith    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
2871d73ed98SBarry Smith    MUST be called after all calls to VecSetValues() have been completed.
2881d73ed98SBarry Smith 
2891d73ed98SBarry Smith    VecSetValues() uses 0-based indices in Fortran as well as in C.
2901d73ed98SBarry Smith 
2911d73ed98SBarry Smith    Level: beginner
2921d73ed98SBarry Smith 
2931d73ed98SBarry Smith .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValueLocal()
2941d73ed98SBarry Smith M*/
295f1144a30SSatish Balay #define VecSetValue(v,i,va,mode) ((VecSetValue_Row = i,VecSetValue_Value = va,0) || VecSetValues(v,1,&VecSetValue_Row,&VecSetValue_Value,mode))
2961d73ed98SBarry Smith 
2971d73ed98SBarry Smith /*MC
2981d73ed98SBarry Smith    VecSetValueLocal - Set a single entry into a vector using the local numbering
2991d73ed98SBarry Smith 
3001d73ed98SBarry Smith    Synopsis:
301d360dc6fSBarry Smith    PetscErrorCode VecSetValueLocal(Vec v,int row,PetscScalar value, InsertMode mode);
3021d73ed98SBarry Smith 
3031d73ed98SBarry Smith    Not Collective
3041d73ed98SBarry Smith 
3051d73ed98SBarry Smith    Input Parameters:
3061d73ed98SBarry Smith +  v - the vector
3071d73ed98SBarry Smith .  row - the row location of the entry
3081d73ed98SBarry Smith .  value - the value to insert
3091d73ed98SBarry Smith -  mode - either INSERT_VALUES or ADD_VALUES
3101d73ed98SBarry Smith 
3111d73ed98SBarry Smith    Notes:
3121d73ed98SBarry Smith    For efficiency one should use VecSetValues() and set several or
3131d73ed98SBarry Smith    many values simultaneously if possible.
31430de9b25SBarry Smith 
31530de9b25SBarry Smith    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
31630de9b25SBarry Smith    MUST be called after all calls to VecSetValues() have been completed.
31730de9b25SBarry Smith 
31830de9b25SBarry Smith    VecSetValues() uses 0-based indices in Fortran as well as in C.
31930de9b25SBarry Smith 
32030de9b25SBarry Smith    Level: beginner
32130de9b25SBarry Smith 
3221d73ed98SBarry Smith .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValue()
32330de9b25SBarry Smith M*/
324f1144a30SSatish Balay #define VecSetValueLocal(v,i,va,mode) ((VecSetValue_Row = i,VecSetValue_Value = va,0) || VecSetValuesLocal(v,1,&VecSetValue_Row,&VecSetValue_Value,mode))
32530de9b25SBarry Smith 
326*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecSetBlockSize(Vec,PetscInt);
327*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecGetBlockSize(Vec,PetscInt*);
328*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecSetValuesBlocked(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
3298ed539a5SBarry Smith 
330fd487807SMatthew Knepley /* Dynamic creation and loading functions */
331fd487807SMatthew Knepley extern PetscFList VecList;
332d772e1d7SMatthew Knepley extern PetscTruth VecRegisterAllCalled;
333*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecSetType(Vec, const VecType);
334*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecGetType(Vec, VecType *);
335*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecRegister(const char[],const char[],const char[],PetscErrorCode (*)(Vec));
336*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecRegisterAll(const char []);
337*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecRegisterDestroy(void);
33830de9b25SBarry Smith 
33930de9b25SBarry Smith /*MC
34030de9b25SBarry Smith   VecRegisterDynamic - Adds a new vector component implementation
34130de9b25SBarry Smith 
34230de9b25SBarry Smith   Synopsis:
343d360dc6fSBarry Smith   PetscErrorCode VecRegisterDynamic(char *name, char *path, char *func_name, PetscErrorCode (*create_func)(Vec))
34430de9b25SBarry Smith 
34530de9b25SBarry Smith   Not Collective
34630de9b25SBarry Smith 
34730de9b25SBarry Smith   Input Parameters:
34830de9b25SBarry Smith + name        - The name of a new user-defined creation routine
34930de9b25SBarry Smith . path        - The path (either absolute or relative) of the library containing this routine
35030de9b25SBarry Smith . func_name   - The name of routine to create method context
35130de9b25SBarry Smith - create_func - The creation routine itself
35230de9b25SBarry Smith 
35330de9b25SBarry Smith   Notes:
35430de9b25SBarry Smith   VecRegisterDynamic() may be called multiple times to add several user-defined vectors
35530de9b25SBarry Smith 
35630de9b25SBarry Smith   If dynamic libraries are used, then the fourth input argument (routine_create) is ignored.
35730de9b25SBarry Smith 
35830de9b25SBarry Smith   Sample usage:
35930de9b25SBarry Smith .vb
36030de9b25SBarry Smith     VecRegisterDynamic("my_vec","/home/username/my_lib/lib/libO/solaris/libmy.a", "MyVectorCreate", MyVectorCreate);
36130de9b25SBarry Smith .ve
36230de9b25SBarry Smith 
36330de9b25SBarry Smith   Then, your vector type can be chosen with the procedural interface via
36430de9b25SBarry Smith .vb
36530de9b25SBarry Smith     VecCreate(MPI_Comm, Vec *);
36630de9b25SBarry Smith     VecSetType(Vec,"my_vector_name");
36730de9b25SBarry Smith .ve
36830de9b25SBarry Smith    or at runtime via the option
36930de9b25SBarry Smith .vb
37030de9b25SBarry Smith     -vec_type my_vector_name
37130de9b25SBarry Smith .ve
37230de9b25SBarry Smith 
373ab901514SBarry Smith   Notes: $PETSC_ARCH occuring in pathname will be replaced with appropriate values.
37430de9b25SBarry Smith          If your function is not being put into a shared library then use VecRegister() instead
37530de9b25SBarry Smith 
37630de9b25SBarry Smith   Level: advanced
37730de9b25SBarry Smith 
37830de9b25SBarry Smith .keywords: Vec, register
37930de9b25SBarry Smith .seealso: VecRegisterAll(), VecRegisterDestroy(), VecRegister()
38030de9b25SBarry Smith M*/
381aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
382f1af5d2fSBarry Smith #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,0)
38388d459dfSBarry Smith #else
384f1af5d2fSBarry Smith #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,d)
38588d459dfSBarry Smith #endif
38688d459dfSBarry Smith 
38709321671SBarry Smith 
388*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecScatterCreate(Vec,IS,Vec,IS,VecScatter *);
389*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecScatterPostRecvs(Vec,Vec,InsertMode,ScatterMode,VecScatter);
390*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecScatterBegin(Vec,Vec,InsertMode,ScatterMode,VecScatter);
391*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecScatterEnd(Vec,Vec,InsertMode,ScatterMode,VecScatter);
392*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecScatterDestroy(VecScatter);
393*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecScatterCopy(VecScatter,VecScatter *);
394*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecScatterView(VecScatter,PetscViewer);
395*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecScatterRemap(VecScatter,PetscInt *,PetscInt*);
396*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecScatterGetMerged(VecScatter,PetscTruth*);
3972195c698SBarry Smith 
398*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecGetArray_Private(Vec,PetscScalar*[]);
399*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecRestoreArray_Private(Vec,PetscScalar*[]);
400*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecGetArray4d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]);
401*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecRestoreArray4d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]);
402*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecGetArray3d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]);
403*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecRestoreArray3d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]);
404*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecGetArray2d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]);
405*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecRestoreArray2d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]);
406*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecGetArray1d(Vec,PetscInt,PetscInt,PetscScalar *[]);
407*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecRestoreArray1d(Vec,PetscInt,PetscInt,PetscScalar *[]);
408ab360428SBarry Smith 
409*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecPlaceArray(Vec,const PetscScalar[]);
410*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecResetArray(Vec);
411*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecReplaceArray(Vec,const PetscScalar[]);
412*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecGetArrays(const Vec[],PetscInt,PetscScalar**[]);
413*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecRestoreArrays(const Vec[],PetscInt,PetscScalar**[]);
41484cb2905SBarry Smith 
415*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecValid(Vec,PetscTruth*);
416*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecView(Vec,PetscViewer);
417*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecViewFromOptions(Vec, char *);
418*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecEqual(Vec,Vec,PetscTruth*);
419*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecLoad(PetscViewer,const VecType,Vec*);
420*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecLoadIntoVector(PetscViewer,Vec);
4218ed539a5SBarry Smith 
422*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecGetSize(Vec,PetscInt*);
423*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecGetLocalSize(Vec,PetscInt*);
424*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecGetOwnershipRange(Vec,PetscInt*,PetscInt*);
4258ed539a5SBarry Smith 
426*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecSetLocalToGlobalMapping(Vec,ISLocalToGlobalMapping);
427*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecSetValuesLocal(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
428*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecSetLocalToGlobalMappingBlock(Vec,ISLocalToGlobalMapping);
429*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecSetValuesBlockedLocal(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
43090f02eecSBarry Smith 
431*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecDotBegin(Vec,Vec,PetscScalar *);
432*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecDotEnd(Vec,Vec,PetscScalar *);
433*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecTDotBegin(Vec,Vec,PetscScalar *);
434*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecTDotEnd(Vec,Vec,PetscScalar *);
435*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecNormBegin(Vec,NormType,PetscReal *);
436*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecNormEnd(Vec,NormType,PetscReal *);
437d3c178dbSBarry Smith 
438fdbc4c26SBarry Smith typedef enum {VEC_IGNORE_OFF_PROC_ENTRIES,VEC_TREAT_OFF_PROC_ENTRIES} VecOption;
439*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecSetOption(Vec,VecOption);
44090f02eecSBarry Smith 
441ebe3b25bSBarry Smith /*
442ebe3b25bSBarry Smith    Expose VecGetArray()/VecRestoreArray() to users. Allows this to work without any function
443ebe3b25bSBarry Smith    call overhead on any 'native' Vecs.
444ebe3b25bSBarry Smith */
4453c94ec11SBarry Smith #include "vecimpl.h"
446ebe3b25bSBarry Smith 
447*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecContourScale(Vec,PetscReal,PetscReal);
448522c5e43SBarry Smith 
44915091d37SBarry Smith /*
45015091d37SBarry Smith     These numbers need to match the entries in
4513c94ec11SBarry Smith   the function table in vecimpl.h
45215091d37SBarry Smith */
453b1bcba4aSBarry Smith typedef enum { VECOP_VIEW = 32,
454b1bcba4aSBarry Smith                VECOP_LOADINTOVECTOR = 38
45515091d37SBarry Smith              } VecOperation;
456*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecSetOperation(Vec,VecOperation,void(*)(void));
457b19c1e4cSBarry Smith 
458e182c471SBarry Smith /*
459e182c471SBarry Smith      Routines for dealing with ghosted vectors:
460e182c471SBarry Smith   vectors with ghost elements at the end of the array.
461e182c471SBarry Smith */
462*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecCreateGhost(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*);
463*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecCreateGhostWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*);
464*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecCreateGhostBlock(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*);
465*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecCreateGhostBlockWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*);
466*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecGhostGetLocalForm(Vec,Vec*);
467*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecGhostRestoreLocalForm(Vec,Vec*);
468*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecGhostUpdateBegin(Vec,InsertMode,ScatterMode);
469*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecGhostUpdateEnd(Vec,InsertMode,ScatterMode);
470e182c471SBarry Smith 
471*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecConjugate(Vec);
47234233285SBarry Smith 
473*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecScatterCreateToAll(Vec,VecScatter*,Vec*);
474*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT VecScatterCreateToZero(Vec,VecScatter*,Vec*);
475bba1ac68SSatish Balay 
476*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT PetscViewerMathematicaGetVector(PetscViewer, Vec);
477*0c735eedSKris Buschelman EXTERN PetscErrorCode PETSCVEC_DLLEXPORT PetscViewerMathematicaPutVector(PetscViewer, Vec);
4787dbadf16SMatthew Knepley 
479d59c15a7SBarry Smith /*S
480d59c15a7SBarry Smith      Vecs - Collection of vectors where the data for the vectors is stored in
481d59c15a7SBarry Smith             one continquous memory
482d59c15a7SBarry Smith 
483d59c15a7SBarry Smith    Level: advanced
484d59c15a7SBarry Smith 
485d59c15a7SBarry Smith    Notes:
486d59c15a7SBarry Smith     Temporary construct for handling multiply right hand side solves
487d59c15a7SBarry Smith 
488d59c15a7SBarry Smith     This is faked by storing a single vector that has enough array space for
489d59c15a7SBarry Smith     n vectors
490d59c15a7SBarry Smith 
491d59c15a7SBarry Smith   Concepts: parallel decomposition
492d59c15a7SBarry Smith 
493d59c15a7SBarry Smith S*/
49432dcc486SBarry Smith         struct _p_Vecs  {PetscInt n; Vec v;};
495d59c15a7SBarry Smith typedef struct _p_Vecs* Vecs;
496d59c15a7SBarry Smith #define VecsDestroy(x)            (VecDestroy((x)->v)         || PetscFree(x))
497d59c15a7SBarry Smith #define VecsCreateSeq(comm,p,m,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeq(comm,p*m,&(*(x))->v) || (-1 == ((*(x))->n = (m))))
498d59c15a7SBarry Smith #define VecsCreateSeqWithArray(comm,p,m,a,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeqWithArray(comm,p*m,a,&(*(x))->v) || (-1 == ((*(x))->n = (m))))
499d59c15a7SBarry Smith #define VecsDuplicate(x,y)        (PetscNew(struct _p_Vecs,y) || VecDuplicate(x->v,&(*(y))->v) || (-1 == ((*(y))->n = (x)->n)))
500e9fa29b7SSatish Balay 
501e9fa29b7SSatish Balay 
502e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END
5032eac72dbSBarry Smith #endif
504