xref: /petsc/include/petscvec.h (revision c714d2d09ac8939bd15527009db68a4d39221e46)
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*);
3632dcc486SBarry Smith EXTERN PetscErrorCode PetscMapCreateMPI(MPI_Comm,PetscInt,PetscInt,PetscMap*);
37dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapSetFromOptions(PetscMap);
38dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapPrintHelp(PetscMap);
39dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapDestroy(PetscMap);
40d772e1d7SMatthew Knepley 
4132dcc486SBarry Smith EXTERN PetscErrorCode PetscMapSetLocalSize(PetscMap,PetscInt);
4232dcc486SBarry Smith EXTERN PetscErrorCode PetscMapGetLocalSize(PetscMap,PetscInt *);
4332dcc486SBarry Smith EXTERN PetscErrorCode PetscMapSetSize(PetscMap,PetscInt);
4432dcc486SBarry Smith EXTERN PetscErrorCode PetscMapGetSize(PetscMap,PetscInt *);
4532dcc486SBarry Smith EXTERN PetscErrorCode PetscMapGetLocalRange(PetscMap,PetscInt *,PetscInt *);
4632dcc486SBarry Smith EXTERN PetscErrorCode PetscMapGetGlobalRange(PetscMap,PetscInt *[]);
47d772e1d7SMatthew Knepley 
48d772e1d7SMatthew Knepley /* Dynamic creation and loading functions */
49d772e1d7SMatthew Knepley extern PetscFList PetscMapList;
50d772e1d7SMatthew Knepley extern PetscTruth PetscMapRegisterAllCalled;
51dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapSetType(PetscMap, const PetscMapType);
52dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapGetType(PetscMap, PetscMapType *);
536849ba73SBarry Smith EXTERN PetscErrorCode PetscMapRegister(const char[],const char[],const char[],PetscErrorCode (*)(PetscMap));
54dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapRegisterAll(const char []);
55dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapRegisterDestroy(void);
56d772e1d7SMatthew Knepley #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
57d772e1d7SMatthew Knepley #define PetscMapRegisterDynamic(a,b,c,d) PetscMapRegister(a,b,c,0)
58d772e1d7SMatthew Knepley #else
59d772e1d7SMatthew Knepley #define PetscMapRegisterDynamic(a,b,c,d) PetscMapRegister(a,b,c,d)
60d772e1d7SMatthew Knepley #endif
61d772e1d7SMatthew Knepley 
6209321671SBarry Smith /*S
6309321671SBarry Smith      Vec - Abstract PETSc vector object
6409321671SBarry Smith 
6509321671SBarry Smith    Level: beginner
6609321671SBarry Smith 
6709321671SBarry Smith   Concepts: field variables, unknowns, arrays
6809321671SBarry Smith 
6909321671SBarry Smith .seealso:  VecCreate(), VecType, VecSetType()
7009321671SBarry Smith S*/
71f09e8eb9SSatish Balay typedef struct _p_Vec*         Vec;
7209321671SBarry Smith 
7309321671SBarry Smith /*S
7409321671SBarry Smith      VecScatter - Object used to manage communication of data
7509321671SBarry Smith        between vectors in parallel. Manages both scatters and gathers
7609321671SBarry Smith 
7709321671SBarry Smith    Level: beginner
7809321671SBarry Smith 
7909321671SBarry Smith   Concepts: scatter
8009321671SBarry Smith 
8109321671SBarry Smith .seealso:  VecScatterCreate(), VecScatterBegin(), VecScatterEnd()
8209321671SBarry Smith S*/
83f09e8eb9SSatish Balay typedef struct _p_VecScatter*  VecScatter;
8409321671SBarry Smith 
8509321671SBarry Smith /*E
8609321671SBarry Smith     VecType - String with the name of a PETSc vector or the creation function
8709321671SBarry Smith        with an optional dynamic library name, for example
8809321671SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:myveccreate()
8909321671SBarry Smith 
9009321671SBarry Smith    Level: beginner
9109321671SBarry Smith 
9209321671SBarry Smith .seealso: VecSetType(), Vec
9309321671SBarry Smith E*/
940676abe4SMatthew Knepley #define VECSEQ         "seq"
950676abe4SMatthew Knepley #define VECMPI         "mpi"
960676abe4SMatthew Knepley #define VECFETI        "feti"
970676abe4SMatthew Knepley #define VECSHARED      "shared"
9849773a63SBarry Smith #define VecType char*
992eac72dbSBarry Smith 
100fd487807SMatthew Knepley /* Logging support */
101552e946dSBarry Smith #define    VEC_FILE_COOKIE 1211214
1026849ba73SBarry Smith extern PetscCookie VEC_COOKIE, VEC_SCATTER_COOKIE;
1036849ba73SBarry Smith extern PetscEvent    VEC_View, VEC_Max, VEC_Min, VEC_DotBarrier, VEC_Dot, VEC_MDotBarrier, VEC_MDot, VEC_TDot, VEC_MTDot;
1046849ba73SBarry Smith extern PetscEvent    VEC_Norm, VEC_Normalize, VEC_Scale, VEC_Copy, VEC_Set, VEC_AXPY, VEC_AYPX, VEC_WAXPY, VEC_MAXPY;
1056849ba73SBarry Smith extern PetscEvent    VEC_AssemblyEnd, VEC_PointwiseMult, VEC_SetValues, VEC_Load, VEC_ScatterBarrier, VEC_ScatterBegin, VEC_ScatterEnd;
1066849ba73SBarry Smith extern PetscEvent    VEC_SetRandom, VEC_ReduceArithmetic, VEC_ReduceBarrier, VEC_ReduceCommunication;
1076849ba73SBarry Smith extern PetscEvent    VEC_Swap, VEC_AssemblyBegin, VEC_NormBarrier;
1088ba1e511SMatthew Knepley 
109dfbe8321SBarry Smith EXTERN PetscErrorCode VecInitializePackage(char *);
110fd487807SMatthew Knepley 
111dfbe8321SBarry Smith EXTERN PetscErrorCode VecCreate(MPI_Comm,Vec *);
112045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecCreate,(Vec *x),(PETSC_COMM_SELF,x))
11332dcc486SBarry Smith EXTERN PetscErrorCode VecCreateSeq(MPI_Comm,PetscInt,Vec*);
114045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecCreateSeq,(PetscInt n,Vec *x),(PETSC_COMM_SELF,n,x))
11532dcc486SBarry Smith EXTERN PetscErrorCode VecCreateMPI(MPI_Comm,PetscInt,PetscInt,Vec*);
116045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecCreateMPI,(PetscInt n,PetscInt N,Vec *x),(PETSC_COMM_WORLD,n,N,x))
11732dcc486SBarry Smith EXTERN PetscErrorCode VecCreateSeqWithArray(MPI_Comm,PetscInt,const PetscScalar[],Vec*);
118045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecCreateSeqWithArray,(PetscInt n,PetscScalar s[],Vec *x),(PETSC_COMM_SELF,n,s,x))
11932dcc486SBarry Smith EXTERN PetscErrorCode VecCreateMPIWithArray(MPI_Comm,PetscInt,PetscInt,const PetscScalar[],Vec*);
120045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecCreateMPIWithArray,(PetscInt n,PetscInt N,PetscScalar s[],Vec *x),(PETSC_COMM_WORLD,n,N,s,x))
12132dcc486SBarry Smith EXTERN PetscErrorCode VecCreateShared(MPI_Comm,PetscInt,PetscInt,Vec*);
122dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetFromOptions(Vec);
123dfbe8321SBarry Smith EXTERN PetscErrorCode VecPrintHelp(Vec);
124dfbe8321SBarry Smith EXTERN PetscErrorCode VecDestroy(Vec);
1254b0e389bSBarry Smith 
12632dcc486SBarry Smith EXTERN PetscErrorCode VecSetSizes(Vec,PetscInt,PetscInt);
127fd487807SMatthew Knepley 
128dfbe8321SBarry Smith EXTERN PetscErrorCode VecDot(Vec,Vec,PetscScalar*);
129dfbe8321SBarry Smith EXTERN PetscErrorCode VecTDot(Vec,Vec,PetscScalar*);
13032dcc486SBarry Smith EXTERN PetscErrorCode VecMDot(PetscInt,Vec,const Vec[],PetscScalar*);
13132dcc486SBarry Smith EXTERN PetscErrorCode VecMTDot(PetscInt,Vec,const Vec[],PetscScalar*);
132cddf8d76SBarry Smith 
13309321671SBarry Smith /*E
13409321671SBarry Smith     NormType - determines what type of norm to compute
13509321671SBarry Smith 
13609321671SBarry Smith     Level: beginner
13709321671SBarry Smith 
13809321671SBarry Smith .seealso: VecNorm(), VecNormBegin(), VecNormEnd(), MatNorm()
13909321671SBarry Smith E*/
14093c39befSBarry Smith typedef enum {NORM_1=1,NORM_2=2,NORM_FROBENIUS=3,NORM_INFINITY=4,NORM_1_AND_2=5} NormType;
141cddf8d76SBarry Smith #define NORM_MAX NORM_INFINITY
14209321671SBarry Smith 
1439b250c83SBarry Smith /*MC
1449b250c83SBarry Smith      NORM_1 - the one norm, ||v|| = sum_i | v_i |. ||A|| = max_j || v_*j ||, maximum column sum
1459b250c83SBarry Smith 
1469b250c83SBarry Smith    Level: beginner
1479b250c83SBarry Smith 
1489b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_2, NORM_FROBENIUS,
1499b250c83SBarry Smith            NORM_INFINITY, NORM_1_AND_2
1509b250c83SBarry Smith 
1519b250c83SBarry Smith M*/
1529b250c83SBarry Smith 
1539b250c83SBarry Smith /*MC
1549b250c83SBarry Smith      NORM_2 - the two norm, ||v|| = sqrt(sum_i (v_i)^2) (vectors only)
1559b250c83SBarry Smith 
1569b250c83SBarry Smith    Level: beginner
1579b250c83SBarry Smith 
1589b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_FROBENIUS,
1599b250c83SBarry Smith            NORM_INFINITY, NORM_1_AND_2
1609b250c83SBarry Smith 
1619b250c83SBarry Smith M*/
1629b250c83SBarry Smith 
1639b250c83SBarry Smith /*MC
1649b250c83SBarry Smith      NORM_FROBENIUS - ||A|| = sqrt(sum_ij (A_ij)^2), same as NORM_2 for vectors
1659b250c83SBarry Smith 
1669b250c83SBarry Smith    Level: beginner
1679b250c83SBarry Smith 
1689b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
1699b250c83SBarry Smith            NORM_INFINITY, NORM_1_AND_2
1709b250c83SBarry Smith 
1719b250c83SBarry Smith M*/
1729b250c83SBarry Smith 
1739b250c83SBarry Smith /*MC
1749b250c83SBarry Smith      NORM_INFINITY - ||v|| = max_i |v_i|. ||A|| = max_i || v_i* ||, maximum row sum
1759b250c83SBarry Smith 
1769b250c83SBarry Smith    Level: beginner
1779b250c83SBarry Smith 
1789b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
1799b250c83SBarry Smith            NORM_FROBINIUS, NORM_1_AND_2
1809b250c83SBarry Smith 
1819b250c83SBarry Smith M*/
1829b250c83SBarry Smith 
1839b250c83SBarry Smith /*MC
1849b250c83SBarry Smith      NORM_1_AND_2 - computes both the 1 and 2 norm of a vector
1859b250c83SBarry Smith 
1869b250c83SBarry Smith    Level: beginner
1879b250c83SBarry Smith 
1889b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
1899b250c83SBarry Smith            NORM_FROBINIUS, NORM_INFINITY
1909b250c83SBarry Smith 
1919b250c83SBarry Smith M*/
1929b250c83SBarry Smith 
1939b250c83SBarry Smith /*MC
1949b250c83SBarry Smith      NORM_MAX - see NORM_INFINITY
1959b250c83SBarry Smith 
196d41222bbSBarry Smith    Level: beginner
197d41222bbSBarry Smith 
1989b250c83SBarry Smith M*/
1999b250c83SBarry Smith 
200dfbe8321SBarry Smith EXTERN PetscErrorCode VecNorm(Vec,NormType,PetscReal *);
201045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecNorm,(Vec x,PetscReal *r),(x,NORM_2,r))
202*c714d2d0SBarry Smith PetscPolymorphicFunction(VecNorm,(Vec x,NormType t),(x,t,&r),PetscReal,r)
203*c714d2d0SBarry Smith PetscPolymorphicFunction(VecNorm,(Vec x),(x,NORM_2,&r),PetscReal,r)
20432dcc486SBarry Smith EXTERN PetscErrorCode VecNormComposedDataID(NormType,PetscInt*);
205dfbe8321SBarry Smith EXTERN PetscErrorCode VecNormalize(Vec,PetscReal *);
206dfbe8321SBarry Smith EXTERN PetscErrorCode VecSum(Vec,PetscScalar*);
20732dcc486SBarry Smith EXTERN PetscErrorCode VecMax(Vec,PetscInt*,PetscReal *);
208045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecMax,(Vec x,PetscReal *r),(x,PETSC_NULL,r))
20932dcc486SBarry Smith EXTERN PetscErrorCode VecMin(Vec,PetscInt*,PetscReal *);
210045ff3e0SBarry Smith PetscPolymorphicSubroutine(VecMin,(Vec x,PetscReal *r),(x,PETSC_NULL,r))
211dfbe8321SBarry Smith EXTERN PetscErrorCode VecScale(const PetscScalar *a,Vec v);
212dfbe8321SBarry Smith EXTERN PetscErrorCode VecCopy(Vec,Vec);
213dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetRandom(PetscRandom,Vec);
214dfbe8321SBarry Smith EXTERN PetscErrorCode VecSet(const PetscScalar*,Vec);
215dfbe8321SBarry Smith EXTERN PetscErrorCode VecSwap(Vec,Vec);
216dfbe8321SBarry Smith EXTERN PetscErrorCode VecAXPY(const PetscScalar*,Vec,Vec);
217dfbe8321SBarry Smith EXTERN PetscErrorCode VecAXPBY(const PetscScalar*,const PetscScalar *,Vec,Vec);
21832dcc486SBarry Smith EXTERN PetscErrorCode VecMAXPY(PetscInt,const PetscScalar*,Vec,Vec*);
219dfbe8321SBarry Smith EXTERN PetscErrorCode VecAYPX(const PetscScalar*,Vec,Vec);
220dfbe8321SBarry Smith EXTERN PetscErrorCode VecWAXPY(const PetscScalar*,Vec,Vec,Vec);
221fa5fa523SBarry Smith EXTERN PetscErrorCode VecPointwiseMax(Vec,Vec,Vec);
222fa5fa523SBarry Smith EXTERN PetscErrorCode VecPointwiseMaxAbs(Vec,Vec,Vec);
223fa5fa523SBarry Smith EXTERN PetscErrorCode VecPointwiseMin(Vec,Vec,Vec);
224dfbe8321SBarry Smith EXTERN PetscErrorCode VecPointwiseMult(Vec,Vec,Vec);
225dfbe8321SBarry Smith EXTERN PetscErrorCode VecPointwiseDivide(Vec,Vec,Vec);
226dfbe8321SBarry Smith EXTERN PetscErrorCode VecMaxPointwiseDivide(Vec,Vec,PetscReal*);
227dfbe8321SBarry Smith EXTERN PetscErrorCode VecShift(const PetscScalar*,Vec);
228dfbe8321SBarry Smith EXTERN PetscErrorCode VecReciprocal(Vec);
229dfbe8321SBarry Smith EXTERN PetscErrorCode VecPermute(Vec, IS, PetscTruth);
230dfbe8321SBarry Smith EXTERN PetscErrorCode VecSqrt(Vec);
231dfbe8321SBarry Smith EXTERN PetscErrorCode VecAbs(Vec);
232dfbe8321SBarry Smith EXTERN PetscErrorCode VecDuplicate(Vec,Vec*);
23332dcc486SBarry Smith EXTERN PetscErrorCode VecDuplicateVecs(Vec,PetscInt,Vec*[]);
2344bf112e7SSatish Balay EXTERN PetscErrorCode VecDestroyVecs(Vec[],PetscInt);
235dfbe8321SBarry Smith EXTERN PetscErrorCode VecGetPetscMap(Vec,PetscMap*);
2362eac72dbSBarry Smith 
237dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideNormAll(Vec,NormType,PetscReal*);
23832dcc486SBarry Smith EXTERN PetscErrorCode VecStrideMaxAll(Vec,PetscInt *,PetscReal *);
23932dcc486SBarry Smith EXTERN PetscErrorCode VecStrideMinAll(Vec,PetscInt *,PetscReal *);
240dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideScaleAll(Vec,PetscScalar*);
2414a560884SBarry Smith 
24232dcc486SBarry Smith EXTERN PetscErrorCode VecStrideNorm(Vec,PetscInt,NormType,PetscReal*);
24332dcc486SBarry Smith EXTERN PetscErrorCode VecStrideMax(Vec,PetscInt,PetscInt *,PetscReal *);
24432dcc486SBarry Smith EXTERN PetscErrorCode VecStrideMin(Vec,PetscInt,PetscInt *,PetscReal *);
24532dcc486SBarry Smith EXTERN PetscErrorCode VecStrideScale(Vec,PetscInt,PetscScalar*);
24632dcc486SBarry Smith EXTERN PetscErrorCode VecStrideGather(Vec,PetscInt,Vec,InsertMode);
24732dcc486SBarry Smith EXTERN PetscErrorCode VecStrideScatter(Vec,PetscInt,Vec,InsertMode);
248dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideGatherAll(Vec,Vec*,InsertMode);
249dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideScatterAll(Vec*,Vec,InsertMode);
250d2655a18SBarry Smith 
25132dcc486SBarry Smith EXTERN PetscErrorCode VecSetValues(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
252feb25392SBarry Smith EXTERN PetscErrorCode VecGetValues(Vec,PetscInt,const PetscInt[],PetscScalar[]);
253dfbe8321SBarry Smith EXTERN PetscErrorCode VecAssemblyBegin(Vec);
254dfbe8321SBarry Smith EXTERN PetscErrorCode VecAssemblyEnd(Vec);
25532dcc486SBarry Smith EXTERN PetscErrorCode VecStashSetInitialSize(Vec,PetscInt,PetscInt);
256dfbe8321SBarry Smith EXTERN PetscErrorCode VecStashView(Vec,PetscViewer);
25732dcc486SBarry Smith EXTERN PetscErrorCode VecStashGetInfo(Vec,PetscInt*,PetscInt*,PetscInt*,PetscInt*);
25862dc5420SSatish Balay 
25932dcc486SBarry Smith extern PetscInt         VecSetValue_Row;
2601d73ed98SBarry Smith extern PetscScalar VecSetValue_Value;
26130de9b25SBarry Smith /*MC
26230de9b25SBarry Smith    VecSetValue - Set a single entry into a vector.
26330de9b25SBarry Smith 
26430de9b25SBarry Smith    Synopsis:
265d360dc6fSBarry Smith    PetscErrorCode VecSetValue(Vec v,int row,PetscScalar value, InsertMode mode);
26630de9b25SBarry Smith 
26730de9b25SBarry Smith    Not Collective
26830de9b25SBarry Smith 
26930de9b25SBarry Smith    Input Parameters:
27030de9b25SBarry Smith +  v - the vector
27130de9b25SBarry Smith .  row - the row location of the entry
27230de9b25SBarry Smith .  value - the value to insert
27330de9b25SBarry Smith -  mode - either INSERT_VALUES or ADD_VALUES
27430de9b25SBarry Smith 
27530de9b25SBarry Smith    Notes:
27630de9b25SBarry Smith    For efficiency one should use VecSetValues() and set several or
27730de9b25SBarry Smith    many values simultaneously if possible.
27830de9b25SBarry Smith 
2791d73ed98SBarry Smith    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
2801d73ed98SBarry Smith    MUST be called after all calls to VecSetValues() have been completed.
2811d73ed98SBarry Smith 
2821d73ed98SBarry Smith    VecSetValues() uses 0-based indices in Fortran as well as in C.
2831d73ed98SBarry Smith 
2841d73ed98SBarry Smith    Level: beginner
2851d73ed98SBarry Smith 
2861d73ed98SBarry Smith .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValueLocal()
2871d73ed98SBarry Smith M*/
288f1144a30SSatish Balay #define VecSetValue(v,i,va,mode) ((VecSetValue_Row = i,VecSetValue_Value = va,0) || VecSetValues(v,1,&VecSetValue_Row,&VecSetValue_Value,mode))
2891d73ed98SBarry Smith 
2901d73ed98SBarry Smith /*MC
2911d73ed98SBarry Smith    VecSetValueLocal - Set a single entry into a vector using the local numbering
2921d73ed98SBarry Smith 
2931d73ed98SBarry Smith    Synopsis:
294d360dc6fSBarry Smith    PetscErrorCode VecSetValueLocal(Vec v,int row,PetscScalar value, InsertMode mode);
2951d73ed98SBarry Smith 
2961d73ed98SBarry Smith    Not Collective
2971d73ed98SBarry Smith 
2981d73ed98SBarry Smith    Input Parameters:
2991d73ed98SBarry Smith +  v - the vector
3001d73ed98SBarry Smith .  row - the row location of the entry
3011d73ed98SBarry Smith .  value - the value to insert
3021d73ed98SBarry Smith -  mode - either INSERT_VALUES or ADD_VALUES
3031d73ed98SBarry Smith 
3041d73ed98SBarry Smith    Notes:
3051d73ed98SBarry Smith    For efficiency one should use VecSetValues() and set several or
3061d73ed98SBarry Smith    many values simultaneously if possible.
30730de9b25SBarry Smith 
30830de9b25SBarry Smith    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
30930de9b25SBarry Smith    MUST be called after all calls to VecSetValues() have been completed.
31030de9b25SBarry Smith 
31130de9b25SBarry Smith    VecSetValues() uses 0-based indices in Fortran as well as in C.
31230de9b25SBarry Smith 
31330de9b25SBarry Smith    Level: beginner
31430de9b25SBarry Smith 
3151d73ed98SBarry Smith .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValue()
31630de9b25SBarry Smith M*/
317f1144a30SSatish Balay #define VecSetValueLocal(v,i,va,mode) ((VecSetValue_Row = i,VecSetValue_Value = va,0) || VecSetValuesLocal(v,1,&VecSetValue_Row,&VecSetValue_Value,mode))
31830de9b25SBarry Smith 
31932dcc486SBarry Smith EXTERN PetscErrorCode VecSetBlockSize(Vec,PetscInt);
32032dcc486SBarry Smith EXTERN PetscErrorCode VecGetBlockSize(Vec,PetscInt*);
32132dcc486SBarry Smith EXTERN PetscErrorCode VecSetValuesBlocked(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
3228ed539a5SBarry Smith 
323fd487807SMatthew Knepley /* Dynamic creation and loading functions */
324fd487807SMatthew Knepley extern PetscFList VecList;
325d772e1d7SMatthew Knepley extern PetscTruth VecRegisterAllCalled;
326dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetType(Vec, const VecType);
327dfbe8321SBarry Smith EXTERN PetscErrorCode VecGetType(Vec, VecType *);
3286849ba73SBarry Smith EXTERN PetscErrorCode VecRegister(const char[],const char[],const char[],PetscErrorCode (*)(Vec));
329dfbe8321SBarry Smith EXTERN PetscErrorCode VecRegisterAll(const char []);
330dfbe8321SBarry Smith EXTERN PetscErrorCode VecRegisterDestroy(void);
33130de9b25SBarry Smith 
33230de9b25SBarry Smith /*MC
33330de9b25SBarry Smith   VecRegisterDynamic - Adds a new vector component implementation
33430de9b25SBarry Smith 
33530de9b25SBarry Smith   Synopsis:
336d360dc6fSBarry Smith   PetscErrorCode VecRegisterDynamic(char *name, char *path, char *func_name, PetscErrorCode (*create_func)(Vec))
33730de9b25SBarry Smith 
33830de9b25SBarry Smith   Not Collective
33930de9b25SBarry Smith 
34030de9b25SBarry Smith   Input Parameters:
34130de9b25SBarry Smith + name        - The name of a new user-defined creation routine
34230de9b25SBarry Smith . path        - The path (either absolute or relative) of the library containing this routine
34330de9b25SBarry Smith . func_name   - The name of routine to create method context
34430de9b25SBarry Smith - create_func - The creation routine itself
34530de9b25SBarry Smith 
34630de9b25SBarry Smith   Notes:
34730de9b25SBarry Smith   VecRegisterDynamic() may be called multiple times to add several user-defined vectors
34830de9b25SBarry Smith 
34930de9b25SBarry Smith   If dynamic libraries are used, then the fourth input argument (routine_create) is ignored.
35030de9b25SBarry Smith 
35130de9b25SBarry Smith   Sample usage:
35230de9b25SBarry Smith .vb
35330de9b25SBarry Smith     VecRegisterDynamic("my_vec","/home/username/my_lib/lib/libO/solaris/libmy.a", "MyVectorCreate", MyVectorCreate);
35430de9b25SBarry Smith .ve
35530de9b25SBarry Smith 
35630de9b25SBarry Smith   Then, your vector type can be chosen with the procedural interface via
35730de9b25SBarry Smith .vb
35830de9b25SBarry Smith     VecCreate(MPI_Comm, Vec *);
35930de9b25SBarry Smith     VecSetType(Vec,"my_vector_name");
36030de9b25SBarry Smith .ve
36130de9b25SBarry Smith    or at runtime via the option
36230de9b25SBarry Smith .vb
36330de9b25SBarry Smith     -vec_type my_vector_name
36430de9b25SBarry Smith .ve
36530de9b25SBarry Smith 
366ab901514SBarry Smith   Notes: $PETSC_ARCH occuring in pathname will be replaced with appropriate values.
36730de9b25SBarry Smith          If your function is not being put into a shared library then use VecRegister() instead
36830de9b25SBarry Smith 
36930de9b25SBarry Smith   Level: advanced
37030de9b25SBarry Smith 
37130de9b25SBarry Smith .keywords: Vec, register
37230de9b25SBarry Smith .seealso: VecRegisterAll(), VecRegisterDestroy(), VecRegister()
37330de9b25SBarry Smith M*/
374aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
375f1af5d2fSBarry Smith #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,0)
37688d459dfSBarry Smith #else
377f1af5d2fSBarry Smith #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,d)
37888d459dfSBarry Smith #endif
37988d459dfSBarry Smith 
38009321671SBarry Smith 
381dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterCreate(Vec,IS,Vec,IS,VecScatter *);
382dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterPostRecvs(Vec,Vec,InsertMode,ScatterMode,VecScatter);
383dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterBegin(Vec,Vec,InsertMode,ScatterMode,VecScatter);
384dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterEnd(Vec,Vec,InsertMode,ScatterMode,VecScatter);
385dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterDestroy(VecScatter);
386dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterCopy(VecScatter,VecScatter *);
387dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterView(VecScatter,PetscViewer);
38832dcc486SBarry Smith EXTERN PetscErrorCode VecScatterRemap(VecScatter,PetscInt *,PetscInt*);
389a5ff213dSBarry Smith EXTERN PetscErrorCode VecScatterGetMerged(VecScatter,PetscTruth*);
3902195c698SBarry Smith 
391dfbe8321SBarry Smith EXTERN PetscErrorCode VecGetArray_Private(Vec,PetscScalar*[]);
392dfbe8321SBarry Smith EXTERN PetscErrorCode VecRestoreArray_Private(Vec,PetscScalar*[]);
39332dcc486SBarry Smith EXTERN PetscErrorCode VecGetArray4d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]);
39432dcc486SBarry Smith EXTERN PetscErrorCode VecRestoreArray4d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]);
39532dcc486SBarry Smith EXTERN PetscErrorCode VecGetArray3d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]);
39632dcc486SBarry Smith EXTERN PetscErrorCode VecRestoreArray3d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]);
39732dcc486SBarry Smith EXTERN PetscErrorCode VecGetArray2d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]);
39832dcc486SBarry Smith EXTERN PetscErrorCode VecRestoreArray2d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]);
39932dcc486SBarry Smith EXTERN PetscErrorCode VecGetArray1d(Vec,PetscInt,PetscInt,PetscScalar *[]);
40032dcc486SBarry Smith EXTERN PetscErrorCode VecRestoreArray1d(Vec,PetscInt,PetscInt,PetscScalar *[]);
401ab360428SBarry Smith 
402dfbe8321SBarry Smith EXTERN PetscErrorCode VecPlaceArray(Vec,const PetscScalar[]);
403dfbe8321SBarry Smith EXTERN PetscErrorCode VecResetArray(Vec);
404dfbe8321SBarry Smith EXTERN PetscErrorCode VecReplaceArray(Vec,const PetscScalar[]);
40532dcc486SBarry Smith EXTERN PetscErrorCode VecGetArrays(const Vec[],PetscInt,PetscScalar**[]);
40632dcc486SBarry Smith EXTERN PetscErrorCode VecRestoreArrays(const Vec[],PetscInt,PetscScalar**[]);
40784cb2905SBarry Smith 
408dfbe8321SBarry Smith EXTERN PetscErrorCode VecValid(Vec,PetscTruth*);
409dfbe8321SBarry Smith EXTERN PetscErrorCode VecView(Vec,PetscViewer);
410dfbe8321SBarry Smith EXTERN PetscErrorCode VecViewFromOptions(Vec, char *);
411dfbe8321SBarry Smith EXTERN PetscErrorCode VecEqual(Vec,Vec,PetscTruth*);
412dfbe8321SBarry Smith EXTERN PetscErrorCode VecLoad(PetscViewer,const VecType,Vec*);
413dfbe8321SBarry Smith EXTERN PetscErrorCode VecLoadIntoVector(PetscViewer,Vec);
4148ed539a5SBarry Smith 
41532dcc486SBarry Smith EXTERN PetscErrorCode VecGetSize(Vec,PetscInt*);
41632dcc486SBarry Smith EXTERN PetscErrorCode VecGetLocalSize(Vec,PetscInt*);
41732dcc486SBarry Smith EXTERN PetscErrorCode VecGetOwnershipRange(Vec,PetscInt*,PetscInt*);
4188ed539a5SBarry Smith 
419dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetLocalToGlobalMapping(Vec,ISLocalToGlobalMapping);
42032dcc486SBarry Smith EXTERN PetscErrorCode VecSetValuesLocal(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
421dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetLocalToGlobalMappingBlock(Vec,ISLocalToGlobalMapping);
42232dcc486SBarry Smith EXTERN PetscErrorCode VecSetValuesBlockedLocal(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
42390f02eecSBarry Smith 
424dfbe8321SBarry Smith EXTERN PetscErrorCode VecDotBegin(Vec,Vec,PetscScalar *);
425dfbe8321SBarry Smith EXTERN PetscErrorCode VecDotEnd(Vec,Vec,PetscScalar *);
426dfbe8321SBarry Smith EXTERN PetscErrorCode VecTDotBegin(Vec,Vec,PetscScalar *);
427dfbe8321SBarry Smith EXTERN PetscErrorCode VecTDotEnd(Vec,Vec,PetscScalar *);
428dfbe8321SBarry Smith EXTERN PetscErrorCode VecNormBegin(Vec,NormType,PetscReal *);
429dfbe8321SBarry Smith EXTERN PetscErrorCode VecNormEnd(Vec,NormType,PetscReal *);
430d3c178dbSBarry Smith 
431fdbc4c26SBarry Smith typedef enum {VEC_IGNORE_OFF_PROC_ENTRIES,VEC_TREAT_OFF_PROC_ENTRIES} VecOption;
432dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetOption(Vec,VecOption);
43390f02eecSBarry Smith 
434ebe3b25bSBarry Smith /*
435ebe3b25bSBarry Smith    Expose VecGetArray()/VecRestoreArray() to users. Allows this to work without any function
436ebe3b25bSBarry Smith    call overhead on any 'native' Vecs.
437ebe3b25bSBarry Smith */
4383c94ec11SBarry Smith #include "vecimpl.h"
439ebe3b25bSBarry Smith 
440dfbe8321SBarry Smith EXTERN PetscErrorCode VecContourScale(Vec,PetscReal,PetscReal);
441522c5e43SBarry Smith 
44215091d37SBarry Smith /*
44315091d37SBarry Smith     These numbers need to match the entries in
4443c94ec11SBarry Smith   the function table in vecimpl.h
44515091d37SBarry Smith */
446b1bcba4aSBarry Smith typedef enum { VECOP_VIEW = 32,
447b1bcba4aSBarry Smith                VECOP_LOADINTOVECTOR = 38
44815091d37SBarry Smith              } VecOperation;
449dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetOperation(Vec,VecOperation,void(*)(void));
450b19c1e4cSBarry Smith 
451e182c471SBarry Smith /*
452e182c471SBarry Smith      Routines for dealing with ghosted vectors:
453e182c471SBarry Smith   vectors with ghost elements at the end of the array.
454e182c471SBarry Smith */
45532dcc486SBarry Smith EXTERN PetscErrorCode VecCreateGhost(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*);
45632dcc486SBarry Smith EXTERN PetscErrorCode VecCreateGhostWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*);
45732dcc486SBarry Smith EXTERN PetscErrorCode VecCreateGhostBlock(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*);
45832dcc486SBarry Smith EXTERN PetscErrorCode VecCreateGhostBlockWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*);
459dfbe8321SBarry Smith EXTERN PetscErrorCode VecGhostGetLocalForm(Vec,Vec*);
460dfbe8321SBarry Smith EXTERN PetscErrorCode VecGhostRestoreLocalForm(Vec,Vec*);
461dfbe8321SBarry Smith EXTERN PetscErrorCode VecGhostUpdateBegin(Vec,InsertMode,ScatterMode);
462dfbe8321SBarry Smith EXTERN PetscErrorCode VecGhostUpdateEnd(Vec,InsertMode,ScatterMode);
463e182c471SBarry Smith 
464dfbe8321SBarry Smith EXTERN PetscErrorCode VecConjugate(Vec);
46534233285SBarry Smith 
466dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterCreateToAll(Vec,VecScatter*,Vec*);
467dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterCreateToZero(Vec,VecScatter*,Vec*);
468bba1ac68SSatish Balay 
469dfbe8321SBarry Smith EXTERN PetscErrorCode PetscViewerMathematicaGetVector(PetscViewer, Vec);
470dfbe8321SBarry Smith EXTERN PetscErrorCode PetscViewerMathematicaPutVector(PetscViewer, Vec);
4717dbadf16SMatthew Knepley 
472d59c15a7SBarry Smith /*S
473d59c15a7SBarry Smith      Vecs - Collection of vectors where the data for the vectors is stored in
474d59c15a7SBarry Smith             one continquous memory
475d59c15a7SBarry Smith 
476d59c15a7SBarry Smith    Level: advanced
477d59c15a7SBarry Smith 
478d59c15a7SBarry Smith    Notes:
479d59c15a7SBarry Smith     Temporary construct for handling multiply right hand side solves
480d59c15a7SBarry Smith 
481d59c15a7SBarry Smith     This is faked by storing a single vector that has enough array space for
482d59c15a7SBarry Smith     n vectors
483d59c15a7SBarry Smith 
484d59c15a7SBarry Smith   Concepts: parallel decomposition
485d59c15a7SBarry Smith 
486d59c15a7SBarry Smith S*/
48732dcc486SBarry Smith         struct _p_Vecs  {PetscInt n; Vec v;};
488d59c15a7SBarry Smith typedef struct _p_Vecs* Vecs;
489d59c15a7SBarry Smith #define VecsDestroy(x)            (VecDestroy((x)->v)         || PetscFree(x))
490d59c15a7SBarry Smith #define VecsCreateSeq(comm,p,m,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeq(comm,p*m,&(*(x))->v) || (-1 == ((*(x))->n = (m))))
491d59c15a7SBarry Smith #define VecsCreateSeqWithArray(comm,p,m,a,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeqWithArray(comm,p*m,a,&(*(x))->v) || (-1 == ((*(x))->n = (m))))
492d59c15a7SBarry Smith #define VecsDuplicate(x,y)        (PetscNew(struct _p_Vecs,y) || VecDuplicate(x->v,&(*(y))->v) || (-1 == ((*(y))->n = (x)->n)))
493e9fa29b7SSatish Balay 
494e9fa29b7SSatish Balay 
495e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END
4962eac72dbSBarry Smith #endif
497