xref: /petsc/include/petscvec.h (revision 9785fde04869f8d6bd6a370e64727956f4f31033)
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 
35dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapCreate(MPI_Comm,PetscMap*);
3665f510b9SBarry Smith PetscPolymorphicSubroutine(PetscMapCreate,(PetscMap*m),(m))
3765f510b9SBarry Smith PetscPolymorphicFunction(PetscMapCreate,(void),(PETSC_COMM_SELF,&m),PetscMap,m)
3832dcc486SBarry Smith EXTERN PetscErrorCode PetscMapCreateMPI(MPI_Comm,PetscInt,PetscInt,PetscMap*);
3965f510b9SBarry Smith PetscPolymorphicFunction(PetscMapCreateMPI,(MPI_Comm comm,PetscInt l,PetscInt g),(comm,l,g,&m),PetscMap,m)
40dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapSetFromOptions(PetscMap);
41dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapPrintHelp(PetscMap);
42dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapDestroy(PetscMap);
43d772e1d7SMatthew Knepley 
4432dcc486SBarry Smith EXTERN PetscErrorCode PetscMapSetLocalSize(PetscMap,PetscInt);
4532dcc486SBarry Smith EXTERN PetscErrorCode PetscMapGetLocalSize(PetscMap,PetscInt *);
46*9785fde0SSatish Balay PetscPolymorphicFunction(PetscMapGetLocalSize,(PetscMap m),(m,&s),PetscInt,s)
4732dcc486SBarry Smith EXTERN PetscErrorCode PetscMapSetSize(PetscMap,PetscInt);
4832dcc486SBarry Smith EXTERN PetscErrorCode PetscMapGetSize(PetscMap,PetscInt *);
49*9785fde0SSatish Balay PetscPolymorphicFunction(PetscMapGetSize,(PetscMap m),(m,&s),PetscInt,s)
5032dcc486SBarry Smith EXTERN PetscErrorCode PetscMapGetLocalRange(PetscMap,PetscInt *,PetscInt *);
5132dcc486SBarry Smith EXTERN PetscErrorCode PetscMapGetGlobalRange(PetscMap,PetscInt *[]);
52d772e1d7SMatthew Knepley 
53d772e1d7SMatthew Knepley /* Dynamic creation and loading functions */
54d772e1d7SMatthew Knepley extern PetscFList PetscMapList;
55d772e1d7SMatthew Knepley extern PetscTruth PetscMapRegisterAllCalled;
56dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapSetType(PetscMap, const PetscMapType);
57dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapGetType(PetscMap, PetscMapType *);
58*9785fde0SSatish Balay PetscPolymorphicFunction(PetscMapGetType,(PetscMap m),(m,&t),PetscMapType,t)
596849ba73SBarry Smith EXTERN PetscErrorCode PetscMapRegister(const char[],const char[],const char[],PetscErrorCode (*)(PetscMap));
60dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapRegisterAll(const char []);
61dfbe8321SBarry Smith EXTERN PetscErrorCode 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
1086849ba73SBarry Smith extern PetscCookie VEC_COOKIE, VEC_SCATTER_COOKIE;
1096849ba73SBarry Smith extern PetscEvent    VEC_View, VEC_Max, VEC_Min, VEC_DotBarrier, VEC_Dot, VEC_MDotBarrier, VEC_MDot, VEC_TDot, VEC_MTDot;
1106849ba73SBarry Smith extern PetscEvent    VEC_Norm, VEC_Normalize, VEC_Scale, VEC_Copy, VEC_Set, VEC_AXPY, VEC_AYPX, VEC_WAXPY, VEC_MAXPY;
1116849ba73SBarry Smith extern PetscEvent    VEC_AssemblyEnd, VEC_PointwiseMult, VEC_SetValues, VEC_Load, VEC_ScatterBarrier, VEC_ScatterBegin, VEC_ScatterEnd;
1126849ba73SBarry Smith extern PetscEvent    VEC_SetRandom, VEC_ReduceArithmetic, VEC_ReduceBarrier, VEC_ReduceCommunication;
1136849ba73SBarry Smith extern PetscEvent    VEC_Swap, VEC_AssemblyBegin, VEC_NormBarrier;
1148ba1e511SMatthew Knepley 
115dfbe8321SBarry Smith EXTERN PetscErrorCode VecInitializePackage(char *);
116fd487807SMatthew Knepley 
117dfbe8321SBarry Smith EXTERN PetscErrorCode VecCreate(MPI_Comm,Vec *);
118045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecCreate,(Vec *x),(PETSC_COMM_SELF,x))
11932dcc486SBarry Smith EXTERN PetscErrorCode VecCreateSeq(MPI_Comm,PetscInt,Vec*);
120045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecCreateSeq,(PetscInt n,Vec *x),(PETSC_COMM_SELF,n,x))
12132dcc486SBarry Smith EXTERN PetscErrorCode VecCreateMPI(MPI_Comm,PetscInt,PetscInt,Vec*);
122045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecCreateMPI,(PetscInt n,PetscInt N,Vec *x),(PETSC_COMM_WORLD,n,N,x))
12332dcc486SBarry Smith EXTERN PetscErrorCode VecCreateSeqWithArray(MPI_Comm,PetscInt,const PetscScalar[],Vec*);
124045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecCreateSeqWithArray,(PetscInt n,PetscScalar s[],Vec *x),(PETSC_COMM_SELF,n,s,x))
12532dcc486SBarry Smith EXTERN PetscErrorCode VecCreateMPIWithArray(MPI_Comm,PetscInt,PetscInt,const PetscScalar[],Vec*);
126045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecCreateMPIWithArray,(PetscInt n,PetscInt N,PetscScalar s[],Vec *x),(PETSC_COMM_WORLD,n,N,s,x))
12732dcc486SBarry Smith EXTERN PetscErrorCode VecCreateShared(MPI_Comm,PetscInt,PetscInt,Vec*);
128dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetFromOptions(Vec);
129dfbe8321SBarry Smith EXTERN PetscErrorCode VecPrintHelp(Vec);
130dfbe8321SBarry Smith EXTERN PetscErrorCode VecDestroy(Vec);
1314b0e389bSBarry Smith 
13232dcc486SBarry Smith EXTERN PetscErrorCode VecSetSizes(Vec,PetscInt,PetscInt);
133fd487807SMatthew Knepley 
134dfbe8321SBarry Smith EXTERN PetscErrorCode VecDot(Vec,Vec,PetscScalar*);
135dfbe8321SBarry Smith EXTERN PetscErrorCode VecTDot(Vec,Vec,PetscScalar*);
13632dcc486SBarry Smith EXTERN PetscErrorCode VecMDot(PetscInt,Vec,const Vec[],PetscScalar*);
13732dcc486SBarry Smith EXTERN PetscErrorCode VecMTDot(PetscInt,Vec,const Vec[],PetscScalar*);
138cddf8d76SBarry Smith 
13909321671SBarry Smith /*E
14009321671SBarry Smith     NormType - determines what type of norm to compute
14109321671SBarry Smith 
14209321671SBarry Smith     Level: beginner
14309321671SBarry Smith 
14409321671SBarry Smith .seealso: VecNorm(), VecNormBegin(), VecNormEnd(), MatNorm()
14509321671SBarry Smith E*/
14693c39befSBarry Smith typedef enum {NORM_1=1,NORM_2=2,NORM_FROBENIUS=3,NORM_INFINITY=4,NORM_1_AND_2=5} NormType;
147cddf8d76SBarry Smith #define NORM_MAX NORM_INFINITY
14809321671SBarry Smith 
1499b250c83SBarry Smith /*MC
1509b250c83SBarry Smith      NORM_1 - the one norm, ||v|| = sum_i | v_i |. ||A|| = max_j || v_*j ||, maximum column sum
1519b250c83SBarry Smith 
1529b250c83SBarry Smith    Level: beginner
1539b250c83SBarry Smith 
1549b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_2, NORM_FROBENIUS,
1559b250c83SBarry Smith            NORM_INFINITY, NORM_1_AND_2
1569b250c83SBarry Smith 
1579b250c83SBarry Smith M*/
1589b250c83SBarry Smith 
1599b250c83SBarry Smith /*MC
1609b250c83SBarry Smith      NORM_2 - the two norm, ||v|| = sqrt(sum_i (v_i)^2) (vectors only)
1619b250c83SBarry Smith 
1629b250c83SBarry Smith    Level: beginner
1639b250c83SBarry Smith 
1649b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_FROBENIUS,
1659b250c83SBarry Smith            NORM_INFINITY, NORM_1_AND_2
1669b250c83SBarry Smith 
1679b250c83SBarry Smith M*/
1689b250c83SBarry Smith 
1699b250c83SBarry Smith /*MC
1709b250c83SBarry Smith      NORM_FROBENIUS - ||A|| = sqrt(sum_ij (A_ij)^2), same as NORM_2 for vectors
1719b250c83SBarry Smith 
1729b250c83SBarry Smith    Level: beginner
1739b250c83SBarry Smith 
1749b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
1759b250c83SBarry Smith            NORM_INFINITY, NORM_1_AND_2
1769b250c83SBarry Smith 
1779b250c83SBarry Smith M*/
1789b250c83SBarry Smith 
1799b250c83SBarry Smith /*MC
1809b250c83SBarry Smith      NORM_INFINITY - ||v|| = max_i |v_i|. ||A|| = max_i || v_i* ||, maximum row sum
1819b250c83SBarry Smith 
1829b250c83SBarry Smith    Level: beginner
1839b250c83SBarry Smith 
1849b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
1859b250c83SBarry Smith            NORM_FROBINIUS, NORM_1_AND_2
1869b250c83SBarry Smith 
1879b250c83SBarry Smith M*/
1889b250c83SBarry Smith 
1899b250c83SBarry Smith /*MC
1909b250c83SBarry Smith      NORM_1_AND_2 - computes both the 1 and 2 norm of a vector
1919b250c83SBarry Smith 
1929b250c83SBarry Smith    Level: beginner
1939b250c83SBarry Smith 
1949b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
1959b250c83SBarry Smith            NORM_FROBINIUS, NORM_INFINITY
1969b250c83SBarry Smith 
1979b250c83SBarry Smith M*/
1989b250c83SBarry Smith 
1999b250c83SBarry Smith /*MC
2009b250c83SBarry Smith      NORM_MAX - see NORM_INFINITY
2019b250c83SBarry Smith 
202d41222bbSBarry Smith    Level: beginner
203d41222bbSBarry Smith 
2049b250c83SBarry Smith M*/
2059b250c83SBarry Smith 
206dfbe8321SBarry Smith EXTERN PetscErrorCode VecNorm(Vec,NormType,PetscReal *);
207045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecNorm,(Vec x,PetscReal *r),(x,NORM_2,r))
208c714d2d0SBarry Smith PetscPolymorphicFunction(VecNorm,(Vec x,NormType t),(x,t,&r),PetscReal,r)
209c714d2d0SBarry Smith PetscPolymorphicFunction(VecNorm,(Vec x),(x,NORM_2,&r),PetscReal,r)
21032dcc486SBarry Smith EXTERN PetscErrorCode VecNormComposedDataID(NormType,PetscInt*);
211dfbe8321SBarry Smith EXTERN PetscErrorCode VecNormalize(Vec,PetscReal *);
212dfbe8321SBarry Smith EXTERN PetscErrorCode VecSum(Vec,PetscScalar*);
21332dcc486SBarry Smith EXTERN PetscErrorCode VecMax(Vec,PetscInt*,PetscReal *);
214045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecMax,(Vec x,PetscReal *r),(x,PETSC_NULL,r))
21532dcc486SBarry Smith EXTERN PetscErrorCode VecMin(Vec,PetscInt*,PetscReal *);
216045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecMin,(Vec x,PetscReal *r),(x,PETSC_NULL,r))
217dfbe8321SBarry Smith EXTERN PetscErrorCode VecScale(const PetscScalar *a,Vec v);
218dfbe8321SBarry Smith EXTERN PetscErrorCode VecCopy(Vec,Vec);
219dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetRandom(PetscRandom,Vec);
220dfbe8321SBarry Smith EXTERN PetscErrorCode VecSet(const PetscScalar*,Vec);
221dfbe8321SBarry Smith EXTERN PetscErrorCode VecSwap(Vec,Vec);
222dfbe8321SBarry Smith EXTERN PetscErrorCode VecAXPY(const PetscScalar*,Vec,Vec);
223dfbe8321SBarry Smith EXTERN PetscErrorCode VecAXPBY(const PetscScalar*,const PetscScalar *,Vec,Vec);
22432dcc486SBarry Smith EXTERN PetscErrorCode VecMAXPY(PetscInt,const PetscScalar*,Vec,Vec*);
225dfbe8321SBarry Smith EXTERN PetscErrorCode VecAYPX(const PetscScalar*,Vec,Vec);
226dfbe8321SBarry Smith EXTERN PetscErrorCode VecWAXPY(const PetscScalar*,Vec,Vec,Vec);
227fa5fa523SBarry Smith EXTERN PetscErrorCode VecPointwiseMax(Vec,Vec,Vec);
228fa5fa523SBarry Smith EXTERN PetscErrorCode VecPointwiseMaxAbs(Vec,Vec,Vec);
229fa5fa523SBarry Smith EXTERN PetscErrorCode VecPointwiseMin(Vec,Vec,Vec);
230dfbe8321SBarry Smith EXTERN PetscErrorCode VecPointwiseMult(Vec,Vec,Vec);
231dfbe8321SBarry Smith EXTERN PetscErrorCode VecPointwiseDivide(Vec,Vec,Vec);
232dfbe8321SBarry Smith EXTERN PetscErrorCode VecMaxPointwiseDivide(Vec,Vec,PetscReal*);
233dfbe8321SBarry Smith EXTERN PetscErrorCode VecShift(const PetscScalar*,Vec);
234dfbe8321SBarry Smith EXTERN PetscErrorCode VecReciprocal(Vec);
235dfbe8321SBarry Smith EXTERN PetscErrorCode VecPermute(Vec, IS, PetscTruth);
236dfbe8321SBarry Smith EXTERN PetscErrorCode VecSqrt(Vec);
237dfbe8321SBarry Smith EXTERN PetscErrorCode VecAbs(Vec);
238dfbe8321SBarry Smith EXTERN PetscErrorCode VecDuplicate(Vec,Vec*);
23932dcc486SBarry Smith EXTERN PetscErrorCode VecDuplicateVecs(Vec,PetscInt,Vec*[]);
2404bf112e7SSatish Balay EXTERN PetscErrorCode VecDestroyVecs(Vec[],PetscInt);
241dfbe8321SBarry Smith EXTERN PetscErrorCode VecGetPetscMap(Vec,PetscMap*);
2422eac72dbSBarry Smith 
243dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideNormAll(Vec,NormType,PetscReal*);
24432dcc486SBarry Smith EXTERN PetscErrorCode VecStrideMaxAll(Vec,PetscInt *,PetscReal *);
24532dcc486SBarry Smith EXTERN PetscErrorCode VecStrideMinAll(Vec,PetscInt *,PetscReal *);
246dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideScaleAll(Vec,PetscScalar*);
2474a560884SBarry Smith 
24832dcc486SBarry Smith EXTERN PetscErrorCode VecStrideNorm(Vec,PetscInt,NormType,PetscReal*);
24932dcc486SBarry Smith EXTERN PetscErrorCode VecStrideMax(Vec,PetscInt,PetscInt *,PetscReal *);
25032dcc486SBarry Smith EXTERN PetscErrorCode VecStrideMin(Vec,PetscInt,PetscInt *,PetscReal *);
25132dcc486SBarry Smith EXTERN PetscErrorCode VecStrideScale(Vec,PetscInt,PetscScalar*);
25232dcc486SBarry Smith EXTERN PetscErrorCode VecStrideGather(Vec,PetscInt,Vec,InsertMode);
25332dcc486SBarry Smith EXTERN PetscErrorCode VecStrideScatter(Vec,PetscInt,Vec,InsertMode);
254dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideGatherAll(Vec,Vec*,InsertMode);
255dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideScatterAll(Vec*,Vec,InsertMode);
256d2655a18SBarry Smith 
25732dcc486SBarry Smith EXTERN PetscErrorCode VecSetValues(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
258feb25392SBarry Smith EXTERN PetscErrorCode VecGetValues(Vec,PetscInt,const PetscInt[],PetscScalar[]);
259dfbe8321SBarry Smith EXTERN PetscErrorCode VecAssemblyBegin(Vec);
260dfbe8321SBarry Smith EXTERN PetscErrorCode VecAssemblyEnd(Vec);
26132dcc486SBarry Smith EXTERN PetscErrorCode VecStashSetInitialSize(Vec,PetscInt,PetscInt);
262dfbe8321SBarry Smith EXTERN PetscErrorCode VecStashView(Vec,PetscViewer);
26332dcc486SBarry Smith EXTERN PetscErrorCode VecStashGetInfo(Vec,PetscInt*,PetscInt*,PetscInt*,PetscInt*);
26462dc5420SSatish Balay 
26532dcc486SBarry Smith extern PetscInt         VecSetValue_Row;
2661d73ed98SBarry Smith extern PetscScalar VecSetValue_Value;
26730de9b25SBarry Smith /*MC
26830de9b25SBarry Smith    VecSetValue - Set a single entry into a vector.
26930de9b25SBarry Smith 
27030de9b25SBarry Smith    Synopsis:
271d360dc6fSBarry Smith    PetscErrorCode VecSetValue(Vec v,int row,PetscScalar value, InsertMode mode);
27230de9b25SBarry Smith 
27330de9b25SBarry Smith    Not Collective
27430de9b25SBarry Smith 
27530de9b25SBarry Smith    Input Parameters:
27630de9b25SBarry Smith +  v - the vector
27730de9b25SBarry Smith .  row - the row location of the entry
27830de9b25SBarry Smith .  value - the value to insert
27930de9b25SBarry Smith -  mode - either INSERT_VALUES or ADD_VALUES
28030de9b25SBarry Smith 
28130de9b25SBarry Smith    Notes:
28230de9b25SBarry Smith    For efficiency one should use VecSetValues() and set several or
28330de9b25SBarry Smith    many values simultaneously if possible.
28430de9b25SBarry Smith 
2851d73ed98SBarry Smith    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
2861d73ed98SBarry Smith    MUST be called after all calls to VecSetValues() have been completed.
2871d73ed98SBarry Smith 
2881d73ed98SBarry Smith    VecSetValues() uses 0-based indices in Fortran as well as in C.
2891d73ed98SBarry Smith 
2901d73ed98SBarry Smith    Level: beginner
2911d73ed98SBarry Smith 
2921d73ed98SBarry Smith .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValueLocal()
2931d73ed98SBarry Smith M*/
294f1144a30SSatish Balay #define VecSetValue(v,i,va,mode) ((VecSetValue_Row = i,VecSetValue_Value = va,0) || VecSetValues(v,1,&VecSetValue_Row,&VecSetValue_Value,mode))
2951d73ed98SBarry Smith 
2961d73ed98SBarry Smith /*MC
2971d73ed98SBarry Smith    VecSetValueLocal - Set a single entry into a vector using the local numbering
2981d73ed98SBarry Smith 
2991d73ed98SBarry Smith    Synopsis:
300d360dc6fSBarry Smith    PetscErrorCode VecSetValueLocal(Vec v,int row,PetscScalar value, InsertMode mode);
3011d73ed98SBarry Smith 
3021d73ed98SBarry Smith    Not Collective
3031d73ed98SBarry Smith 
3041d73ed98SBarry Smith    Input Parameters:
3051d73ed98SBarry Smith +  v - the vector
3061d73ed98SBarry Smith .  row - the row location of the entry
3071d73ed98SBarry Smith .  value - the value to insert
3081d73ed98SBarry Smith -  mode - either INSERT_VALUES or ADD_VALUES
3091d73ed98SBarry Smith 
3101d73ed98SBarry Smith    Notes:
3111d73ed98SBarry Smith    For efficiency one should use VecSetValues() and set several or
3121d73ed98SBarry Smith    many values simultaneously if possible.
31330de9b25SBarry Smith 
31430de9b25SBarry Smith    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
31530de9b25SBarry Smith    MUST be called after all calls to VecSetValues() have been completed.
31630de9b25SBarry Smith 
31730de9b25SBarry Smith    VecSetValues() uses 0-based indices in Fortran as well as in C.
31830de9b25SBarry Smith 
31930de9b25SBarry Smith    Level: beginner
32030de9b25SBarry Smith 
3211d73ed98SBarry Smith .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValue()
32230de9b25SBarry Smith M*/
323f1144a30SSatish Balay #define VecSetValueLocal(v,i,va,mode) ((VecSetValue_Row = i,VecSetValue_Value = va,0) || VecSetValuesLocal(v,1,&VecSetValue_Row,&VecSetValue_Value,mode))
32430de9b25SBarry Smith 
32532dcc486SBarry Smith EXTERN PetscErrorCode VecSetBlockSize(Vec,PetscInt);
32632dcc486SBarry Smith EXTERN PetscErrorCode VecGetBlockSize(Vec,PetscInt*);
32732dcc486SBarry Smith EXTERN PetscErrorCode VecSetValuesBlocked(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
3288ed539a5SBarry Smith 
329fd487807SMatthew Knepley /* Dynamic creation and loading functions */
330fd487807SMatthew Knepley extern PetscFList VecList;
331d772e1d7SMatthew Knepley extern PetscTruth VecRegisterAllCalled;
332dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetType(Vec, const VecType);
333dfbe8321SBarry Smith EXTERN PetscErrorCode VecGetType(Vec, VecType *);
3346849ba73SBarry Smith EXTERN PetscErrorCode VecRegister(const char[],const char[],const char[],PetscErrorCode (*)(Vec));
335dfbe8321SBarry Smith EXTERN PetscErrorCode VecRegisterAll(const char []);
336dfbe8321SBarry Smith EXTERN PetscErrorCode VecRegisterDestroy(void);
33730de9b25SBarry Smith 
33830de9b25SBarry Smith /*MC
33930de9b25SBarry Smith   VecRegisterDynamic - Adds a new vector component implementation
34030de9b25SBarry Smith 
34130de9b25SBarry Smith   Synopsis:
342d360dc6fSBarry Smith   PetscErrorCode VecRegisterDynamic(char *name, char *path, char *func_name, PetscErrorCode (*create_func)(Vec))
34330de9b25SBarry Smith 
34430de9b25SBarry Smith   Not Collective
34530de9b25SBarry Smith 
34630de9b25SBarry Smith   Input Parameters:
34730de9b25SBarry Smith + name        - The name of a new user-defined creation routine
34830de9b25SBarry Smith . path        - The path (either absolute or relative) of the library containing this routine
34930de9b25SBarry Smith . func_name   - The name of routine to create method context
35030de9b25SBarry Smith - create_func - The creation routine itself
35130de9b25SBarry Smith 
35230de9b25SBarry Smith   Notes:
35330de9b25SBarry Smith   VecRegisterDynamic() may be called multiple times to add several user-defined vectors
35430de9b25SBarry Smith 
35530de9b25SBarry Smith   If dynamic libraries are used, then the fourth input argument (routine_create) is ignored.
35630de9b25SBarry Smith 
35730de9b25SBarry Smith   Sample usage:
35830de9b25SBarry Smith .vb
35930de9b25SBarry Smith     VecRegisterDynamic("my_vec","/home/username/my_lib/lib/libO/solaris/libmy.a", "MyVectorCreate", MyVectorCreate);
36030de9b25SBarry Smith .ve
36130de9b25SBarry Smith 
36230de9b25SBarry Smith   Then, your vector type can be chosen with the procedural interface via
36330de9b25SBarry Smith .vb
36430de9b25SBarry Smith     VecCreate(MPI_Comm, Vec *);
36530de9b25SBarry Smith     VecSetType(Vec,"my_vector_name");
36630de9b25SBarry Smith .ve
36730de9b25SBarry Smith    or at runtime via the option
36830de9b25SBarry Smith .vb
36930de9b25SBarry Smith     -vec_type my_vector_name
37030de9b25SBarry Smith .ve
37130de9b25SBarry Smith 
372ab901514SBarry Smith   Notes: $PETSC_ARCH occuring in pathname will be replaced with appropriate values.
37330de9b25SBarry Smith          If your function is not being put into a shared library then use VecRegister() instead
37430de9b25SBarry Smith 
37530de9b25SBarry Smith   Level: advanced
37630de9b25SBarry Smith 
37730de9b25SBarry Smith .keywords: Vec, register
37830de9b25SBarry Smith .seealso: VecRegisterAll(), VecRegisterDestroy(), VecRegister()
37930de9b25SBarry Smith M*/
380aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
381f1af5d2fSBarry Smith #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,0)
38288d459dfSBarry Smith #else
383f1af5d2fSBarry Smith #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,d)
38488d459dfSBarry Smith #endif
38588d459dfSBarry Smith 
38609321671SBarry Smith 
387dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterCreate(Vec,IS,Vec,IS,VecScatter *);
388dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterPostRecvs(Vec,Vec,InsertMode,ScatterMode,VecScatter);
389dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterBegin(Vec,Vec,InsertMode,ScatterMode,VecScatter);
390dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterEnd(Vec,Vec,InsertMode,ScatterMode,VecScatter);
391dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterDestroy(VecScatter);
392dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterCopy(VecScatter,VecScatter *);
393dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterView(VecScatter,PetscViewer);
39432dcc486SBarry Smith EXTERN PetscErrorCode VecScatterRemap(VecScatter,PetscInt *,PetscInt*);
395a5ff213dSBarry Smith EXTERN PetscErrorCode VecScatterGetMerged(VecScatter,PetscTruth*);
3962195c698SBarry Smith 
397dfbe8321SBarry Smith EXTERN PetscErrorCode VecGetArray_Private(Vec,PetscScalar*[]);
398dfbe8321SBarry Smith EXTERN PetscErrorCode VecRestoreArray_Private(Vec,PetscScalar*[]);
39932dcc486SBarry Smith EXTERN PetscErrorCode VecGetArray4d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]);
40032dcc486SBarry Smith EXTERN PetscErrorCode VecRestoreArray4d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]);
40132dcc486SBarry Smith EXTERN PetscErrorCode VecGetArray3d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]);
40232dcc486SBarry Smith EXTERN PetscErrorCode VecRestoreArray3d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]);
40332dcc486SBarry Smith EXTERN PetscErrorCode VecGetArray2d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]);
40432dcc486SBarry Smith EXTERN PetscErrorCode VecRestoreArray2d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]);
40532dcc486SBarry Smith EXTERN PetscErrorCode VecGetArray1d(Vec,PetscInt,PetscInt,PetscScalar *[]);
40632dcc486SBarry Smith EXTERN PetscErrorCode VecRestoreArray1d(Vec,PetscInt,PetscInt,PetscScalar *[]);
407ab360428SBarry Smith 
408dfbe8321SBarry Smith EXTERN PetscErrorCode VecPlaceArray(Vec,const PetscScalar[]);
409dfbe8321SBarry Smith EXTERN PetscErrorCode VecResetArray(Vec);
410dfbe8321SBarry Smith EXTERN PetscErrorCode VecReplaceArray(Vec,const PetscScalar[]);
41132dcc486SBarry Smith EXTERN PetscErrorCode VecGetArrays(const Vec[],PetscInt,PetscScalar**[]);
41232dcc486SBarry Smith EXTERN PetscErrorCode VecRestoreArrays(const Vec[],PetscInt,PetscScalar**[]);
41384cb2905SBarry Smith 
414dfbe8321SBarry Smith EXTERN PetscErrorCode VecValid(Vec,PetscTruth*);
415dfbe8321SBarry Smith EXTERN PetscErrorCode VecView(Vec,PetscViewer);
416dfbe8321SBarry Smith EXTERN PetscErrorCode VecViewFromOptions(Vec, char *);
417dfbe8321SBarry Smith EXTERN PetscErrorCode VecEqual(Vec,Vec,PetscTruth*);
418dfbe8321SBarry Smith EXTERN PetscErrorCode VecLoad(PetscViewer,const VecType,Vec*);
419dfbe8321SBarry Smith EXTERN PetscErrorCode VecLoadIntoVector(PetscViewer,Vec);
4208ed539a5SBarry Smith 
42132dcc486SBarry Smith EXTERN PetscErrorCode VecGetSize(Vec,PetscInt*);
42232dcc486SBarry Smith EXTERN PetscErrorCode VecGetLocalSize(Vec,PetscInt*);
42332dcc486SBarry Smith EXTERN PetscErrorCode VecGetOwnershipRange(Vec,PetscInt*,PetscInt*);
4248ed539a5SBarry Smith 
425dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetLocalToGlobalMapping(Vec,ISLocalToGlobalMapping);
42632dcc486SBarry Smith EXTERN PetscErrorCode VecSetValuesLocal(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
427dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetLocalToGlobalMappingBlock(Vec,ISLocalToGlobalMapping);
42832dcc486SBarry Smith EXTERN PetscErrorCode VecSetValuesBlockedLocal(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
42990f02eecSBarry Smith 
430dfbe8321SBarry Smith EXTERN PetscErrorCode VecDotBegin(Vec,Vec,PetscScalar *);
431dfbe8321SBarry Smith EXTERN PetscErrorCode VecDotEnd(Vec,Vec,PetscScalar *);
432dfbe8321SBarry Smith EXTERN PetscErrorCode VecTDotBegin(Vec,Vec,PetscScalar *);
433dfbe8321SBarry Smith EXTERN PetscErrorCode VecTDotEnd(Vec,Vec,PetscScalar *);
434dfbe8321SBarry Smith EXTERN PetscErrorCode VecNormBegin(Vec,NormType,PetscReal *);
435dfbe8321SBarry Smith EXTERN PetscErrorCode VecNormEnd(Vec,NormType,PetscReal *);
436d3c178dbSBarry Smith 
437fdbc4c26SBarry Smith typedef enum {VEC_IGNORE_OFF_PROC_ENTRIES,VEC_TREAT_OFF_PROC_ENTRIES} VecOption;
438dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetOption(Vec,VecOption);
43990f02eecSBarry Smith 
440ebe3b25bSBarry Smith /*
441ebe3b25bSBarry Smith    Expose VecGetArray()/VecRestoreArray() to users. Allows this to work without any function
442ebe3b25bSBarry Smith    call overhead on any 'native' Vecs.
443ebe3b25bSBarry Smith */
4443c94ec11SBarry Smith #include "vecimpl.h"
445ebe3b25bSBarry Smith 
446dfbe8321SBarry Smith EXTERN PetscErrorCode VecContourScale(Vec,PetscReal,PetscReal);
447522c5e43SBarry Smith 
44815091d37SBarry Smith /*
44915091d37SBarry Smith     These numbers need to match the entries in
4503c94ec11SBarry Smith   the function table in vecimpl.h
45115091d37SBarry Smith */
452b1bcba4aSBarry Smith typedef enum { VECOP_VIEW = 32,
453b1bcba4aSBarry Smith                VECOP_LOADINTOVECTOR = 38
45415091d37SBarry Smith              } VecOperation;
455dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetOperation(Vec,VecOperation,void(*)(void));
456b19c1e4cSBarry Smith 
457e182c471SBarry Smith /*
458e182c471SBarry Smith      Routines for dealing with ghosted vectors:
459e182c471SBarry Smith   vectors with ghost elements at the end of the array.
460e182c471SBarry Smith */
46132dcc486SBarry Smith EXTERN PetscErrorCode VecCreateGhost(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*);
46232dcc486SBarry Smith EXTERN PetscErrorCode VecCreateGhostWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*);
46332dcc486SBarry Smith EXTERN PetscErrorCode VecCreateGhostBlock(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*);
46432dcc486SBarry Smith EXTERN PetscErrorCode VecCreateGhostBlockWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*);
465dfbe8321SBarry Smith EXTERN PetscErrorCode VecGhostGetLocalForm(Vec,Vec*);
466dfbe8321SBarry Smith EXTERN PetscErrorCode VecGhostRestoreLocalForm(Vec,Vec*);
467dfbe8321SBarry Smith EXTERN PetscErrorCode VecGhostUpdateBegin(Vec,InsertMode,ScatterMode);
468dfbe8321SBarry Smith EXTERN PetscErrorCode VecGhostUpdateEnd(Vec,InsertMode,ScatterMode);
469e182c471SBarry Smith 
470dfbe8321SBarry Smith EXTERN PetscErrorCode VecConjugate(Vec);
47134233285SBarry Smith 
472dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterCreateToAll(Vec,VecScatter*,Vec*);
473dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterCreateToZero(Vec,VecScatter*,Vec*);
474bba1ac68SSatish Balay 
475dfbe8321SBarry Smith EXTERN PetscErrorCode PetscViewerMathematicaGetVector(PetscViewer, Vec);
476dfbe8321SBarry Smith EXTERN PetscErrorCode PetscViewerMathematicaPutVector(PetscViewer, Vec);
4777dbadf16SMatthew Knepley 
478d59c15a7SBarry Smith /*S
479d59c15a7SBarry Smith      Vecs - Collection of vectors where the data for the vectors is stored in
480d59c15a7SBarry Smith             one continquous memory
481d59c15a7SBarry Smith 
482d59c15a7SBarry Smith    Level: advanced
483d59c15a7SBarry Smith 
484d59c15a7SBarry Smith    Notes:
485d59c15a7SBarry Smith     Temporary construct for handling multiply right hand side solves
486d59c15a7SBarry Smith 
487d59c15a7SBarry Smith     This is faked by storing a single vector that has enough array space for
488d59c15a7SBarry Smith     n vectors
489d59c15a7SBarry Smith 
490d59c15a7SBarry Smith   Concepts: parallel decomposition
491d59c15a7SBarry Smith 
492d59c15a7SBarry Smith S*/
49332dcc486SBarry Smith         struct _p_Vecs  {PetscInt n; Vec v;};
494d59c15a7SBarry Smith typedef struct _p_Vecs* Vecs;
495d59c15a7SBarry Smith #define VecsDestroy(x)            (VecDestroy((x)->v)         || PetscFree(x))
496d59c15a7SBarry Smith #define VecsCreateSeq(comm,p,m,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeq(comm,p*m,&(*(x))->v) || (-1 == ((*(x))->n = (m))))
497d59c15a7SBarry Smith #define VecsCreateSeqWithArray(comm,p,m,a,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeqWithArray(comm,p*m,a,&(*(x))->v) || (-1 == ((*(x))->n = (m))))
498d59c15a7SBarry Smith #define VecsDuplicate(x,y)        (PetscNew(struct _p_Vecs,y) || VecDuplicate(x->v,&(*(y))->v) || (-1 == ((*(y))->n = (x)->n)))
499e9fa29b7SSatish Balay 
500e9fa29b7SSatish Balay 
501e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END
5022eac72dbSBarry Smith #endif
503