xref: /petsc/include/petscvec.h (revision 6849ba73f22fecb8f92ef896a42e4e8bd4cd6965)
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 */
33*6849ba73SBarry Smith extern PetscCookie MAP_COOKIE;
34d772e1d7SMatthew Knepley 
35dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapCreate(MPI_Comm,PetscMap*);
36dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapCreateMPI(MPI_Comm,int,int,PetscMap*);
37dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapSetFromOptions(PetscMap);
38dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapPrintHelp(PetscMap);
39dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapDestroy(PetscMap);
40d772e1d7SMatthew Knepley 
41dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapSetLocalSize(PetscMap,int);
42dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapGetLocalSize(PetscMap,int *);
43dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapSetSize(PetscMap,int);
44dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapGetSize(PetscMap,int *);
45dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapGetLocalRange(PetscMap,int *,int *);
46dfbe8321SBarry Smith EXTERN PetscErrorCode PetscMapGetGlobalRange(PetscMap,int *[]);
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 *);
53*6849ba73SBarry 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"
980676abe4SMatthew Knepley #define VECESI         "esi"
990676abe4SMatthew Knepley #define VECPETSCESI    "petscesi"
10049773a63SBarry Smith #define VecType char*
1012eac72dbSBarry Smith 
102fd487807SMatthew Knepley /* Logging support */
103552e946dSBarry Smith #define    VEC_FILE_COOKIE 1211214
104*6849ba73SBarry Smith extern PetscCookie VEC_COOKIE, VEC_SCATTER_COOKIE;
105*6849ba73SBarry Smith extern PetscEvent    VEC_View, VEC_Max, VEC_Min, VEC_DotBarrier, VEC_Dot, VEC_MDotBarrier, VEC_MDot, VEC_TDot, VEC_MTDot;
106*6849ba73SBarry Smith extern PetscEvent    VEC_Norm, VEC_Normalize, VEC_Scale, VEC_Copy, VEC_Set, VEC_AXPY, VEC_AYPX, VEC_WAXPY, VEC_MAXPY;
107*6849ba73SBarry Smith extern PetscEvent    VEC_AssemblyEnd, VEC_PointwiseMult, VEC_SetValues, VEC_Load, VEC_ScatterBarrier, VEC_ScatterBegin, VEC_ScatterEnd;
108*6849ba73SBarry Smith extern PetscEvent    VEC_SetRandom, VEC_ReduceArithmetic, VEC_ReduceBarrier, VEC_ReduceCommunication;
109*6849ba73SBarry Smith extern PetscEvent    VEC_Swap, VEC_AssemblyBegin, VEC_NormBarrier;
1108ba1e511SMatthew Knepley 
111dfbe8321SBarry Smith EXTERN PetscErrorCode VecInitializePackage(char *);
112fd487807SMatthew Knepley 
113dfbe8321SBarry Smith EXTERN PetscErrorCode VecCreate(MPI_Comm,Vec *);
114dfbe8321SBarry Smith EXTERN PetscErrorCode VecCreateSeq(MPI_Comm,int,Vec*);
115dfbe8321SBarry Smith EXTERN PetscErrorCode VecCreateMPI(MPI_Comm,int,int,Vec*);
116dfbe8321SBarry Smith EXTERN PetscErrorCode VecCreateSeqWithArray(MPI_Comm,int,const PetscScalar[],Vec*);
117dfbe8321SBarry Smith EXTERN PetscErrorCode VecCreateMPIWithArray(MPI_Comm,int,int,const PetscScalar[],Vec*);
118dfbe8321SBarry Smith EXTERN PetscErrorCode VecCreateShared(MPI_Comm,int,int,Vec*);
119dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetFromOptions(Vec);
120dfbe8321SBarry Smith EXTERN PetscErrorCode VecPrintHelp(Vec);
121dfbe8321SBarry Smith EXTERN PetscErrorCode VecDestroy(Vec);
1224b0e389bSBarry Smith 
123dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetSizes(Vec,int,int);
124fd487807SMatthew Knepley 
125dfbe8321SBarry Smith EXTERN PetscErrorCode VecDot(Vec,Vec,PetscScalar*);
126dfbe8321SBarry Smith EXTERN PetscErrorCode VecTDot(Vec,Vec,PetscScalar*);
127dfbe8321SBarry Smith EXTERN PetscErrorCode VecMDot(int,Vec,const Vec[],PetscScalar*);
128dfbe8321SBarry Smith EXTERN PetscErrorCode VecMTDot(int,Vec,const Vec[],PetscScalar*);
129cddf8d76SBarry Smith 
13009321671SBarry Smith /*E
13109321671SBarry Smith     NormType - determines what type of norm to compute
13209321671SBarry Smith 
13309321671SBarry Smith     Level: beginner
13409321671SBarry Smith 
13509321671SBarry Smith .seealso: VecNorm(), VecNormBegin(), VecNormEnd(), MatNorm()
13609321671SBarry Smith E*/
13793c39befSBarry Smith typedef enum {NORM_1=1,NORM_2=2,NORM_FROBENIUS=3,NORM_INFINITY=4,NORM_1_AND_2=5} NormType;
138cddf8d76SBarry Smith #define NORM_MAX NORM_INFINITY
13909321671SBarry Smith 
1409b250c83SBarry Smith /*MC
1419b250c83SBarry Smith      NORM_1 - the one norm, ||v|| = sum_i | v_i |. ||A|| = max_j || v_*j ||, maximum column sum
1429b250c83SBarry Smith 
1439b250c83SBarry Smith    Level: beginner
1449b250c83SBarry Smith 
1459b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_2, NORM_FROBENIUS,
1469b250c83SBarry Smith            NORM_INFINITY, NORM_1_AND_2
1479b250c83SBarry Smith 
1489b250c83SBarry Smith M*/
1499b250c83SBarry Smith 
1509b250c83SBarry Smith /*MC
1519b250c83SBarry Smith      NORM_2 - the two norm, ||v|| = sqrt(sum_i (v_i)^2) (vectors only)
1529b250c83SBarry Smith 
1539b250c83SBarry Smith    Level: beginner
1549b250c83SBarry Smith 
1559b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_FROBENIUS,
1569b250c83SBarry Smith            NORM_INFINITY, NORM_1_AND_2
1579b250c83SBarry Smith 
1589b250c83SBarry Smith M*/
1599b250c83SBarry Smith 
1609b250c83SBarry Smith /*MC
1619b250c83SBarry Smith      NORM_FROBENIUS - ||A|| = sqrt(sum_ij (A_ij)^2), same as NORM_2 for vectors
1629b250c83SBarry Smith 
1639b250c83SBarry Smith    Level: beginner
1649b250c83SBarry Smith 
1659b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
1669b250c83SBarry Smith            NORM_INFINITY, NORM_1_AND_2
1679b250c83SBarry Smith 
1689b250c83SBarry Smith M*/
1699b250c83SBarry Smith 
1709b250c83SBarry Smith /*MC
1719b250c83SBarry Smith      NORM_INFINITY - ||v|| = max_i |v_i|. ||A|| = max_i || v_i* ||, maximum row sum
1729b250c83SBarry Smith 
1739b250c83SBarry Smith    Level: beginner
1749b250c83SBarry Smith 
1759b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
1769b250c83SBarry Smith            NORM_FROBINIUS, NORM_1_AND_2
1779b250c83SBarry Smith 
1789b250c83SBarry Smith M*/
1799b250c83SBarry Smith 
1809b250c83SBarry Smith /*MC
1819b250c83SBarry Smith      NORM_1_AND_2 - computes both the 1 and 2 norm of a vector
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_INFINITY
1879b250c83SBarry Smith 
1889b250c83SBarry Smith M*/
1899b250c83SBarry Smith 
1909b250c83SBarry Smith /*MC
1919b250c83SBarry Smith      NORM_MAX - see NORM_INFINITY
1929b250c83SBarry Smith 
193d41222bbSBarry Smith    Level: beginner
194d41222bbSBarry Smith 
1959b250c83SBarry Smith M*/
1969b250c83SBarry Smith 
197dfbe8321SBarry Smith EXTERN PetscErrorCode VecNorm(Vec,NormType,PetscReal *);
198dfbe8321SBarry Smith EXTERN PetscErrorCode VecNormComposedDataID(NormType,int*);
199dfbe8321SBarry Smith EXTERN PetscErrorCode VecNormalize(Vec,PetscReal *);
200dfbe8321SBarry Smith EXTERN PetscErrorCode VecSum(Vec,PetscScalar*);
201dfbe8321SBarry Smith EXTERN PetscErrorCode VecMax(Vec,int*,PetscReal *);
202dfbe8321SBarry Smith EXTERN PetscErrorCode VecMin(Vec,int*,PetscReal *);
203dfbe8321SBarry Smith EXTERN PetscErrorCode VecScale(const PetscScalar *a,Vec v);
204dfbe8321SBarry Smith EXTERN PetscErrorCode VecCopy(Vec,Vec);
205dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetRandom(PetscRandom,Vec);
206dfbe8321SBarry Smith EXTERN PetscErrorCode VecSet(const PetscScalar*,Vec);
207dfbe8321SBarry Smith EXTERN PetscErrorCode VecSwap(Vec,Vec);
208dfbe8321SBarry Smith EXTERN PetscErrorCode VecAXPY(const PetscScalar*,Vec,Vec);
209dfbe8321SBarry Smith EXTERN PetscErrorCode VecAXPBY(const PetscScalar*,const PetscScalar *,Vec,Vec);
210dfbe8321SBarry Smith EXTERN PetscErrorCode VecMAXPY(int,const PetscScalar*,Vec,Vec*);
211dfbe8321SBarry Smith EXTERN PetscErrorCode VecAYPX(const PetscScalar*,Vec,Vec);
212dfbe8321SBarry Smith EXTERN PetscErrorCode VecWAXPY(const PetscScalar*,Vec,Vec,Vec);
213dfbe8321SBarry Smith EXTERN PetscErrorCode VecPointwiseMult(Vec,Vec,Vec);
214dfbe8321SBarry Smith EXTERN PetscErrorCode VecPointwiseDivide(Vec,Vec,Vec);
215dfbe8321SBarry Smith EXTERN PetscErrorCode VecMaxPointwiseDivide(Vec,Vec,PetscReal*);
216dfbe8321SBarry Smith EXTERN PetscErrorCode VecShift(const PetscScalar*,Vec);
217dfbe8321SBarry Smith EXTERN PetscErrorCode VecReciprocal(Vec);
218dfbe8321SBarry Smith EXTERN PetscErrorCode VecPermute(Vec, IS, PetscTruth);
219dfbe8321SBarry Smith EXTERN PetscErrorCode VecSqrt(Vec);
220dfbe8321SBarry Smith EXTERN PetscErrorCode VecAbs(Vec);
221dfbe8321SBarry Smith EXTERN PetscErrorCode VecDuplicate(Vec,Vec*);
222dfbe8321SBarry Smith EXTERN PetscErrorCode VecDuplicateVecs(Vec,int,Vec*[]);
223dfbe8321SBarry Smith EXTERN PetscErrorCode VecDestroyVecs(const Vec[],int);
224dfbe8321SBarry Smith EXTERN PetscErrorCode VecGetPetscMap(Vec,PetscMap*);
2252eac72dbSBarry Smith 
226dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideNormAll(Vec,NormType,PetscReal*);
227dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideMaxAll(Vec,int *,PetscReal *);
228dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideMinAll(Vec,int *,PetscReal *);
229dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideScaleAll(Vec,PetscScalar*);
2304a560884SBarry Smith 
231dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideNorm(Vec,int,NormType,PetscReal*);
232dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideMax(Vec,int,int *,PetscReal *);
233dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideMin(Vec,int,int *,PetscReal *);
234dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideScale(Vec,int,PetscScalar*);
235dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideGather(Vec,int,Vec,InsertMode);
236dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideScatter(Vec,int,Vec,InsertMode);
237dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideGatherAll(Vec,Vec*,InsertMode);
238dfbe8321SBarry Smith EXTERN PetscErrorCode VecStrideScatterAll(Vec*,Vec,InsertMode);
239d2655a18SBarry Smith 
240dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetValues(Vec,int,const int[],const PetscScalar[],InsertMode);
241dfbe8321SBarry Smith EXTERN PetscErrorCode VecAssemblyBegin(Vec);
242dfbe8321SBarry Smith EXTERN PetscErrorCode VecAssemblyEnd(Vec);
243dfbe8321SBarry Smith EXTERN PetscErrorCode VecStashSetInitialSize(Vec,int,int);
244dfbe8321SBarry Smith EXTERN PetscErrorCode VecStashView(Vec,PetscViewer);
245dfbe8321SBarry Smith EXTERN PetscErrorCode VecStashGetInfo(Vec,int*,int*,int*,int*);
24662dc5420SSatish Balay 
2471d73ed98SBarry Smith extern int         VecSetValue_Row;
2481d73ed98SBarry Smith extern PetscScalar VecSetValue_Value;
24930de9b25SBarry Smith /*MC
25030de9b25SBarry Smith    VecSetValue - Set a single entry into a vector.
25130de9b25SBarry Smith 
25230de9b25SBarry Smith    Synopsis:
25330de9b25SBarry Smith    int VecSetValue(Vec v,int row,PetscScalar value, InsertMode mode);
25430de9b25SBarry Smith 
25530de9b25SBarry Smith    Not Collective
25630de9b25SBarry Smith 
25730de9b25SBarry Smith    Input Parameters:
25830de9b25SBarry Smith +  v - the vector
25930de9b25SBarry Smith .  row - the row location of the entry
26030de9b25SBarry Smith .  value - the value to insert
26130de9b25SBarry Smith -  mode - either INSERT_VALUES or ADD_VALUES
26230de9b25SBarry Smith 
26330de9b25SBarry Smith    Notes:
26430de9b25SBarry Smith    For efficiency one should use VecSetValues() and set several or
26530de9b25SBarry Smith    many values simultaneously if possible.
26630de9b25SBarry Smith 
2671d73ed98SBarry Smith    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
2681d73ed98SBarry Smith    MUST be called after all calls to VecSetValues() have been completed.
2691d73ed98SBarry Smith 
2701d73ed98SBarry Smith    VecSetValues() uses 0-based indices in Fortran as well as in C.
2711d73ed98SBarry Smith 
2721d73ed98SBarry Smith    Level: beginner
2731d73ed98SBarry Smith 
2741d73ed98SBarry Smith .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValueLocal()
2751d73ed98SBarry Smith M*/
2761d73ed98SBarry Smith #define VecSetValue(v,i,va,mode) (VecSetValue_Row = i, VecSetValue_Value = va, VecSetValues(v,1,&VecSetValue_Row,&VecSetValue_Value,mode))
2771d73ed98SBarry Smith 
2781d73ed98SBarry Smith /*MC
2791d73ed98SBarry Smith    VecSetValueLocal - Set a single entry into a vector using the local numbering
2801d73ed98SBarry Smith 
2811d73ed98SBarry Smith    Synopsis:
2821d73ed98SBarry Smith    int VecSetValueLocal(Vec v,int row,PetscScalar value, InsertMode mode);
2831d73ed98SBarry Smith 
2841d73ed98SBarry Smith    Not Collective
2851d73ed98SBarry Smith 
2861d73ed98SBarry Smith    Input Parameters:
2871d73ed98SBarry Smith +  v - the vector
2881d73ed98SBarry Smith .  row - the row location of the entry
2891d73ed98SBarry Smith .  value - the value to insert
2901d73ed98SBarry Smith -  mode - either INSERT_VALUES or ADD_VALUES
2911d73ed98SBarry Smith 
2921d73ed98SBarry Smith    Notes:
2931d73ed98SBarry Smith    For efficiency one should use VecSetValues() and set several or
2941d73ed98SBarry Smith    many values simultaneously if possible.
29530de9b25SBarry Smith 
29630de9b25SBarry Smith    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
29730de9b25SBarry Smith    MUST be called after all calls to VecSetValues() have been completed.
29830de9b25SBarry Smith 
29930de9b25SBarry Smith    VecSetValues() uses 0-based indices in Fortran as well as in C.
30030de9b25SBarry Smith 
30130de9b25SBarry Smith    Level: beginner
30230de9b25SBarry Smith 
3031d73ed98SBarry Smith .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValue()
30430de9b25SBarry Smith M*/
3051d73ed98SBarry Smith #define VecSetValueLocal(v,i,va,mode) (VecSetValue_Row = i,VecSetValue_Value = va,VecSetValuesLocal(v,1,&VecSetValue_Row,&VecSetValue_Value,mode))
30630de9b25SBarry Smith 
307dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetBlockSize(Vec,int);
308dfbe8321SBarry Smith EXTERN PetscErrorCode VecGetBlockSize(Vec,int*);
309dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetValuesBlocked(Vec,int,const int[],const PetscScalar[],InsertMode);
3108ed539a5SBarry Smith 
311fd487807SMatthew Knepley /* Dynamic creation and loading functions */
312fd487807SMatthew Knepley extern PetscFList VecList;
313d772e1d7SMatthew Knepley extern PetscTruth VecRegisterAllCalled;
314dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetType(Vec, const VecType);
315dfbe8321SBarry Smith EXTERN PetscErrorCode VecGetType(Vec, VecType *);
316*6849ba73SBarry Smith EXTERN PetscErrorCode VecRegister(const char[],const char[],const char[],PetscErrorCode (*)(Vec));
317dfbe8321SBarry Smith EXTERN PetscErrorCode VecRegisterAll(const char []);
318dfbe8321SBarry Smith EXTERN PetscErrorCode VecRegisterDestroy(void);
31930de9b25SBarry Smith 
32030de9b25SBarry Smith /*MC
32130de9b25SBarry Smith   VecRegisterDynamic - Adds a new vector component implementation
32230de9b25SBarry Smith 
32330de9b25SBarry Smith   Synopsis:
324*6849ba73SBarry Smith   VecRegisterDynamic(char *name, char *path, char *func_name, PetscErrorCode (*create_func)(Vec))
32530de9b25SBarry Smith 
32630de9b25SBarry Smith   Not Collective
32730de9b25SBarry Smith 
32830de9b25SBarry Smith   Input Parameters:
32930de9b25SBarry Smith + name        - The name of a new user-defined creation routine
33030de9b25SBarry Smith . path        - The path (either absolute or relative) of the library containing this routine
33130de9b25SBarry Smith . func_name   - The name of routine to create method context
33230de9b25SBarry Smith - create_func - The creation routine itself
33330de9b25SBarry Smith 
33430de9b25SBarry Smith   Notes:
33530de9b25SBarry Smith   VecRegisterDynamic() may be called multiple times to add several user-defined vectors
33630de9b25SBarry Smith 
33730de9b25SBarry Smith   If dynamic libraries are used, then the fourth input argument (routine_create) is ignored.
33830de9b25SBarry Smith 
33930de9b25SBarry Smith   Sample usage:
34030de9b25SBarry Smith .vb
34130de9b25SBarry Smith     VecRegisterDynamic("my_vec","/home/username/my_lib/lib/libO/solaris/libmy.a", "MyVectorCreate", MyVectorCreate);
34230de9b25SBarry Smith .ve
34330de9b25SBarry Smith 
34430de9b25SBarry Smith   Then, your vector type can be chosen with the procedural interface via
34530de9b25SBarry Smith .vb
34630de9b25SBarry Smith     VecCreate(MPI_Comm, Vec *);
34730de9b25SBarry Smith     VecSetType(Vec,"my_vector_name");
34830de9b25SBarry Smith .ve
34930de9b25SBarry Smith    or at runtime via the option
35030de9b25SBarry Smith .vb
35130de9b25SBarry Smith     -vec_type my_vector_name
35230de9b25SBarry Smith .ve
35330de9b25SBarry Smith 
35430de9b25SBarry Smith   Notes: $PETSC_ARCH and $BOPT occuring in pathname will be replaced with appropriate values.
35530de9b25SBarry Smith          If your function is not being put into a shared library then use VecRegister() instead
35630de9b25SBarry Smith 
35730de9b25SBarry Smith   Level: advanced
35830de9b25SBarry Smith 
35930de9b25SBarry Smith .keywords: Vec, register
36030de9b25SBarry Smith .seealso: VecRegisterAll(), VecRegisterDestroy(), VecRegister()
36130de9b25SBarry Smith M*/
362aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
363f1af5d2fSBarry Smith #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,0)
36488d459dfSBarry Smith #else
365f1af5d2fSBarry Smith #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,d)
36688d459dfSBarry Smith #endif
36788d459dfSBarry Smith 
36809321671SBarry Smith 
369dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterCreate(Vec,IS,Vec,IS,VecScatter *);
370dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterPostRecvs(Vec,Vec,InsertMode,ScatterMode,VecScatter);
371dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterBegin(Vec,Vec,InsertMode,ScatterMode,VecScatter);
372dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterEnd(Vec,Vec,InsertMode,ScatterMode,VecScatter);
373dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterDestroy(VecScatter);
374dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterCopy(VecScatter,VecScatter *);
375dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterView(VecScatter,PetscViewer);
376dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterRemap(VecScatter,int *,int*);
3772195c698SBarry Smith 
378cb5b572fSBarry Smith typedef enum {PIPELINE_DOWN=0,PIPELINE_UP=1} PipelineDirection;
379cb5b572fSBarry Smith typedef enum {PIPELINE_NONE=1,PIPELINE_SEQUENTIAL=2,
3808ea6152fSSatish Balay 	      PIPELINE_REDBLACK=3,PIPELINE_MULTICOLOR=4} PipelineType;
381cb5b572fSBarry Smith 
382cb5b572fSBarry Smith typedef struct _p_VecPipeline*  VecPipeline;
383cb5b572fSBarry Smith 
384dfbe8321SBarry Smith EXTERN PetscErrorCode VecPipelineCreate(MPI_Comm,Vec,IS,Vec,IS,VecPipeline *);
385dfbe8321SBarry Smith EXTERN PetscErrorCode VecPipelineSetType(VecPipeline,PipelineType,PetscObject);
386dfbe8321SBarry Smith EXTERN PetscErrorCode VecPipelineSetup(VecPipeline);
387dfbe8321SBarry Smith EXTERN PetscErrorCode VecPipelineBegin(Vec,Vec,InsertMode,ScatterMode,PipelineDirection,VecPipeline);
388dfbe8321SBarry Smith EXTERN PetscErrorCode VecPipelineEnd(Vec,Vec,InsertMode,ScatterMode,PipelineDirection,VecPipeline);
389dfbe8321SBarry Smith EXTERN PetscErrorCode VecPipelineView(VecPipeline,PetscViewer);
390dfbe8321SBarry Smith EXTERN PetscErrorCode VecPipelineDestroy(VecPipeline);
391cb5b572fSBarry Smith 
392dfbe8321SBarry Smith EXTERN PetscErrorCode VecGetArray_Private(Vec,PetscScalar*[]);
393dfbe8321SBarry Smith EXTERN PetscErrorCode VecRestoreArray_Private(Vec,PetscScalar*[]);
394dfbe8321SBarry Smith EXTERN PetscErrorCode VecGetArray4d(Vec,int,int,int,int,int,int,int,int,PetscScalar****[]);
395dfbe8321SBarry Smith EXTERN PetscErrorCode VecRestoreArray4d(Vec,int,int,int,int,int,int,int,int,PetscScalar****[]);
396dfbe8321SBarry Smith EXTERN PetscErrorCode VecGetArray3d(Vec,int,int,int,int,int,int,PetscScalar***[]);
397dfbe8321SBarry Smith EXTERN PetscErrorCode VecRestoreArray3d(Vec,int,int,int,int,int,int,PetscScalar***[]);
398dfbe8321SBarry Smith EXTERN PetscErrorCode VecGetArray2d(Vec,int,int,int,int,PetscScalar**[]);
399dfbe8321SBarry Smith EXTERN PetscErrorCode VecRestoreArray2d(Vec,int,int,int,int,PetscScalar**[]);
400dfbe8321SBarry Smith EXTERN PetscErrorCode VecGetArray1d(Vec,int,int,PetscScalar *[]);
401dfbe8321SBarry Smith EXTERN PetscErrorCode VecRestoreArray1d(Vec,int,int,PetscScalar *[]);
402ab360428SBarry Smith 
403dfbe8321SBarry Smith EXTERN PetscErrorCode VecPlaceArray(Vec,const PetscScalar[]);
404dfbe8321SBarry Smith EXTERN PetscErrorCode VecResetArray(Vec);
405dfbe8321SBarry Smith EXTERN PetscErrorCode VecReplaceArray(Vec,const PetscScalar[]);
406dfbe8321SBarry Smith EXTERN PetscErrorCode VecGetArrays(const Vec[],int,PetscScalar**[]);
407dfbe8321SBarry Smith EXTERN PetscErrorCode VecRestoreArrays(const Vec[],int,PetscScalar**[]);
40884cb2905SBarry Smith 
409dfbe8321SBarry Smith EXTERN PetscErrorCode VecValid(Vec,PetscTruth*);
410dfbe8321SBarry Smith EXTERN PetscErrorCode VecView(Vec,PetscViewer);
411dfbe8321SBarry Smith EXTERN PetscErrorCode VecViewFromOptions(Vec, char *);
412dfbe8321SBarry Smith EXTERN PetscErrorCode VecEqual(Vec,Vec,PetscTruth*);
413dfbe8321SBarry Smith EXTERN PetscErrorCode VecLoad(PetscViewer,const VecType,Vec*);
414dfbe8321SBarry Smith EXTERN PetscErrorCode VecLoadIntoVector(PetscViewer,Vec);
4158ed539a5SBarry Smith 
416dfbe8321SBarry Smith EXTERN PetscErrorCode VecGetSize(Vec,int*);
417dfbe8321SBarry Smith EXTERN PetscErrorCode VecGetLocalSize(Vec,int*);
418dfbe8321SBarry Smith EXTERN PetscErrorCode VecGetOwnershipRange(Vec,int*,int*);
4198ed539a5SBarry Smith 
420dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetLocalToGlobalMapping(Vec,ISLocalToGlobalMapping);
421dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetValuesLocal(Vec,int,const int[],const PetscScalar[],InsertMode);
422dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetLocalToGlobalMappingBlock(Vec,ISLocalToGlobalMapping);
423dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetValuesBlockedLocal(Vec,int,const int[],const PetscScalar[],InsertMode);
42490f02eecSBarry Smith 
425dfbe8321SBarry Smith EXTERN PetscErrorCode VecDotBegin(Vec,Vec,PetscScalar *);
426dfbe8321SBarry Smith EXTERN PetscErrorCode VecDotEnd(Vec,Vec,PetscScalar *);
427dfbe8321SBarry Smith EXTERN PetscErrorCode VecTDotBegin(Vec,Vec,PetscScalar *);
428dfbe8321SBarry Smith EXTERN PetscErrorCode VecTDotEnd(Vec,Vec,PetscScalar *);
429dfbe8321SBarry Smith EXTERN PetscErrorCode VecNormBegin(Vec,NormType,PetscReal *);
430dfbe8321SBarry Smith EXTERN PetscErrorCode VecNormEnd(Vec,NormType,PetscReal *);
431d3c178dbSBarry Smith 
432fdbc4c26SBarry Smith typedef enum {VEC_IGNORE_OFF_PROC_ENTRIES,VEC_TREAT_OFF_PROC_ENTRIES} VecOption;
433dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetOption(Vec,VecOption);
43490f02eecSBarry Smith 
435ebe3b25bSBarry Smith /*
436ebe3b25bSBarry Smith    Expose VecGetArray()/VecRestoreArray() to users. Allows this to work without any function
437ebe3b25bSBarry Smith    call overhead on any 'native' Vecs.
438ebe3b25bSBarry Smith */
4393c94ec11SBarry Smith #include "vecimpl.h"
440ebe3b25bSBarry Smith 
441dfbe8321SBarry Smith EXTERN PetscErrorCode VecContourScale(Vec,PetscReal,PetscReal);
442522c5e43SBarry Smith 
44315091d37SBarry Smith /*
44415091d37SBarry Smith     These numbers need to match the entries in
4453c94ec11SBarry Smith   the function table in vecimpl.h
44615091d37SBarry Smith */
447b1bcba4aSBarry Smith typedef enum { VECOP_VIEW = 32,
448b1bcba4aSBarry Smith                VECOP_LOADINTOVECTOR = 38
44915091d37SBarry Smith              } VecOperation;
450dfbe8321SBarry Smith EXTERN PetscErrorCode VecSetOperation(Vec,VecOperation,void(*)(void));
451b19c1e4cSBarry Smith 
452e182c471SBarry Smith /*
453e182c471SBarry Smith      Routines for dealing with ghosted vectors:
454e182c471SBarry Smith   vectors with ghost elements at the end of the array.
455e182c471SBarry Smith */
456dfbe8321SBarry Smith EXTERN PetscErrorCode VecCreateGhost(MPI_Comm,int,int,int,const int[],Vec*);
457dfbe8321SBarry Smith EXTERN PetscErrorCode VecCreateGhostWithArray(MPI_Comm,int,int,int,const int[],const PetscScalar[],Vec*);
458dfbe8321SBarry Smith EXTERN PetscErrorCode VecCreateGhostBlock(MPI_Comm,int,int,int,int,const int[],Vec*);
459dfbe8321SBarry Smith EXTERN PetscErrorCode VecCreateGhostBlockWithArray(MPI_Comm,int,int,int,int,const int[],const PetscScalar[],Vec*);
460dfbe8321SBarry Smith EXTERN PetscErrorCode VecGhostGetLocalForm(Vec,Vec*);
461dfbe8321SBarry Smith EXTERN PetscErrorCode VecGhostRestoreLocalForm(Vec,Vec*);
462dfbe8321SBarry Smith EXTERN PetscErrorCode VecGhostUpdateBegin(Vec,InsertMode,ScatterMode);
463dfbe8321SBarry Smith EXTERN PetscErrorCode VecGhostUpdateEnd(Vec,InsertMode,ScatterMode);
464e182c471SBarry Smith 
465dfbe8321SBarry Smith EXTERN PetscErrorCode VecConjugate(Vec);
46634233285SBarry Smith 
467dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterCreateToAll(Vec,VecScatter*,Vec*);
468dfbe8321SBarry Smith EXTERN PetscErrorCode VecScatterCreateToZero(Vec,VecScatter*,Vec*);
469bba1ac68SSatish Balay 
470dfbe8321SBarry Smith EXTERN PetscErrorCode VecESISetType(Vec,const char*);
471dfbe8321SBarry Smith EXTERN PetscErrorCode VecESISetFromOptions(Vec);
472bba1ac68SSatish Balay 
473dfbe8321SBarry Smith EXTERN PetscErrorCode PetscViewerMathematicaGetVector(PetscViewer, Vec);
474dfbe8321SBarry Smith EXTERN PetscErrorCode PetscViewerMathematicaPutVector(PetscViewer, Vec);
4757dbadf16SMatthew Knepley 
476d59c15a7SBarry Smith /*S
477d59c15a7SBarry Smith      Vecs - Collection of vectors where the data for the vectors is stored in
478d59c15a7SBarry Smith             one continquous memory
479d59c15a7SBarry Smith 
480d59c15a7SBarry Smith    Level: advanced
481d59c15a7SBarry Smith 
482d59c15a7SBarry Smith    Notes:
483d59c15a7SBarry Smith     Temporary construct for handling multiply right hand side solves
484d59c15a7SBarry Smith 
485d59c15a7SBarry Smith     This is faked by storing a single vector that has enough array space for
486d59c15a7SBarry Smith     n vectors
487d59c15a7SBarry Smith 
488d59c15a7SBarry Smith   Concepts: parallel decomposition
489d59c15a7SBarry Smith 
490d59c15a7SBarry Smith S*/
491d59c15a7SBarry Smith         struct _p_Vecs  {int n; Vec v;};
492d59c15a7SBarry Smith typedef struct _p_Vecs* Vecs;
493d59c15a7SBarry Smith #define VecsDestroy(x)            (VecDestroy((x)->v)         || PetscFree(x))
494d59c15a7SBarry Smith #define VecsCreateSeq(comm,p,m,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeq(comm,p*m,&(*(x))->v) || (-1 == ((*(x))->n = (m))))
495d59c15a7SBarry Smith #define VecsCreateSeqWithArray(comm,p,m,a,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeqWithArray(comm,p*m,a,&(*(x))->v) || (-1 == ((*(x))->n = (m))))
496d59c15a7SBarry Smith #define VecsDuplicate(x,y)        (PetscNew(struct _p_Vecs,y) || VecDuplicate(x->v,&(*(y))->v) || (-1 == ((*(y))->n = (x)->n)))
497e9fa29b7SSatish Balay 
498e9fa29b7SSatish Balay 
499e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END
5002eac72dbSBarry Smith #endif
501