xref: /petsc/include/petscvec.h (revision d41222bbcdea31b88e23614a3c2b1a0fe84fa572)
173f4d377SMatthew Knepley /* $Id: petscvec.h,v 1.127 2001/09/11 16:31:30 bsmith Exp $ */
22eac72dbSBarry Smith /*
337f753daSBarry Smith     Defines the vector component of PETSc. Vectors generally represent
437f753daSBarry Smith   degrees of freedom for finite element/finite difference functions
584cb2905SBarry Smith   on a grid. They have more mathematical structure then simple arrays.
62eac72dbSBarry Smith */
72eac72dbSBarry Smith 
80a835dfdSSatish Balay #ifndef __PETSCVEC_H
90a835dfdSSatish Balay #define __PETSCVEC_H
100a835dfdSSatish Balay #include "petscis.h"
110a835dfdSSatish Balay #include "petscsys.h"
12e9fa29b7SSatish Balay PETSC_EXTERN_CXX_BEGIN
132eac72dbSBarry Smith 
1409321671SBarry Smith /*S
158a124369SBarry Smith      PetscMap - Abstract PETSc object that defines the layout of vector and
16013c094aSBarry Smith   matrices across processors
1709321671SBarry Smith 
1809321671SBarry Smith    Level: advanced
1909321671SBarry Smith 
2009321671SBarry Smith    Notes:
2109321671SBarry Smith     Does not play a role in the PETSc design, can be ignored
2209321671SBarry Smith 
2309321671SBarry Smith   Concepts: parallel decomposition
2409321671SBarry Smith 
258a124369SBarry Smith .seealso:  PetscMapCreateMPI()
2609321671SBarry Smith S*/
278a124369SBarry Smith typedef struct _p_PetscMap*         PetscMap;
2809321671SBarry Smith 
29d772e1d7SMatthew Knepley #define MAP_SEQ "seq"
30d772e1d7SMatthew Knepley #define MAP_MPI "mpi"
3149773a63SBarry Smith #define PetscMapType char*
32d772e1d7SMatthew Knepley 
33d772e1d7SMatthew Knepley /* Logging support */
34d772e1d7SMatthew Knepley extern int MAP_COOKIE;
35d772e1d7SMatthew Knepley 
36d772e1d7SMatthew Knepley EXTERN int PetscMapCreate(MPI_Comm,PetscMap*);
37d772e1d7SMatthew Knepley EXTERN int PetscMapCreateMPI(MPI_Comm,int,int,PetscMap*);
38d772e1d7SMatthew Knepley EXTERN int PetscMapSetFromOptions(PetscMap);
39d772e1d7SMatthew Knepley EXTERN int PetscMapPrintHelp(PetscMap);
40d772e1d7SMatthew Knepley EXTERN int PetscMapDestroy(PetscMap);
41d772e1d7SMatthew Knepley 
42d772e1d7SMatthew Knepley EXTERN int PetscMapSetLocalSize(PetscMap,int);
43d772e1d7SMatthew Knepley EXTERN int PetscMapGetLocalSize(PetscMap,int *);
44d772e1d7SMatthew Knepley EXTERN int PetscMapSetSize(PetscMap,int);
45d772e1d7SMatthew Knepley EXTERN int PetscMapGetSize(PetscMap,int *);
46d772e1d7SMatthew Knepley EXTERN int PetscMapGetLocalRange(PetscMap,int *,int *);
47d772e1d7SMatthew Knepley EXTERN int PetscMapGetGlobalRange(PetscMap,int *[]);
48d772e1d7SMatthew Knepley 
49d772e1d7SMatthew Knepley /* Dynamic creation and loading functions */
50d772e1d7SMatthew Knepley extern PetscFList PetscMapList;
51d772e1d7SMatthew Knepley extern PetscTruth PetscMapRegisterAllCalled;
520e33f6ddSBarry Smith EXTERN int PetscMapSetType(PetscMap, const PetscMapType);
53d772e1d7SMatthew Knepley EXTERN int PetscMapGetType(PetscMap, PetscMapType *);
54d772e1d7SMatthew Knepley EXTERN int PetscMapRegister(const char[],const char[],const char[],int(*)(PetscMap));
55d772e1d7SMatthew Knepley EXTERN int PetscMapRegisterAll(const char []);
56d772e1d7SMatthew Knepley EXTERN int PetscMapRegisterDestroy(void);
57d772e1d7SMatthew Knepley #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
58d772e1d7SMatthew Knepley #define PetscMapRegisterDynamic(a,b,c,d) PetscMapRegister(a,b,c,0)
59d772e1d7SMatthew Knepley #else
60d772e1d7SMatthew Knepley #define PetscMapRegisterDynamic(a,b,c,d) PetscMapRegister(a,b,c,d)
61d772e1d7SMatthew Knepley #endif
62d772e1d7SMatthew Knepley 
6309321671SBarry Smith /*S
6409321671SBarry Smith      Vec - Abstract PETSc vector object
6509321671SBarry Smith 
6609321671SBarry Smith    Level: beginner
6709321671SBarry Smith 
6809321671SBarry Smith   Concepts: field variables, unknowns, arrays
6909321671SBarry Smith 
7009321671SBarry Smith .seealso:  VecCreate(), VecType, VecSetType()
7109321671SBarry Smith S*/
72f09e8eb9SSatish Balay typedef struct _p_Vec*         Vec;
7309321671SBarry Smith 
7409321671SBarry Smith /*S
7509321671SBarry Smith      VecScatter - Object used to manage communication of data
7609321671SBarry Smith        between vectors in parallel. Manages both scatters and gathers
7709321671SBarry Smith 
7809321671SBarry Smith    Level: beginner
7909321671SBarry Smith 
8009321671SBarry Smith   Concepts: scatter
8109321671SBarry Smith 
8209321671SBarry Smith .seealso:  VecScatterCreate(), VecScatterBegin(), VecScatterEnd()
8309321671SBarry Smith S*/
84f09e8eb9SSatish Balay typedef struct _p_VecScatter*  VecScatter;
8509321671SBarry Smith 
8609321671SBarry Smith /*E
8709321671SBarry Smith     VecType - String with the name of a PETSc vector or the creation function
8809321671SBarry Smith        with an optional dynamic library name, for example
8909321671SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:myveccreate()
9009321671SBarry Smith 
9109321671SBarry Smith    Level: beginner
9209321671SBarry Smith 
9309321671SBarry Smith .seealso: VecSetType(), Vec
9409321671SBarry Smith E*/
950676abe4SMatthew Knepley #define VECSEQ         "seq"
960676abe4SMatthew Knepley #define VECMPI         "mpi"
970676abe4SMatthew Knepley #define VECFETI        "feti"
980676abe4SMatthew Knepley #define VECSHARED      "shared"
990676abe4SMatthew Knepley #define VECESI         "esi"
1000676abe4SMatthew Knepley #define VECPETSCESI    "petscesi"
10149773a63SBarry Smith #define VecType char*
1022eac72dbSBarry Smith 
103fd487807SMatthew Knepley /* Logging support */
104552e946dSBarry Smith #define    VEC_FILE_COOKIE 1211214
1058ba1e511SMatthew Knepley extern int VEC_COOKIE;
106fd487807SMatthew Knepley extern int VEC_SCATTER_COOKIE;
107d5ba7fb7SMatthew Knepley extern int VEC_View, VEC_Max, VEC_Min, VEC_DotBarrier, VEC_Dot, VEC_MDotBarrier, VEC_MDot, VEC_TDot, VEC_MTDot, VEC_NormBarrier;
1087bdeda15SDinesh Kaushik extern int VEC_Norm, VEC_Normalize, VEC_Scale, VEC_Copy, VEC_Set, VEC_AXPY, VEC_AYPX, VEC_WAXPY, VEC_MAXPY, VEC_Swap, VEC_AssemblyBegin;
109d5ba7fb7SMatthew Knepley extern int VEC_AssemblyEnd, VEC_PointwiseMult, VEC_SetValues, VEC_Load, VEC_ScatterBarrier, VEC_ScatterBegin, VEC_ScatterEnd;
110d5ba7fb7SMatthew Knepley extern int VEC_SetRandom, VEC_ReduceArithmetic, VEC_ReduceBarrier, VEC_ReduceCommunication;
1118ba1e511SMatthew Knepley 
1128ba1e511SMatthew Knepley EXTERN int VecInitializePackage(char *);
113fd487807SMatthew Knepley 
114d772e1d7SMatthew Knepley EXTERN int VecCreate(MPI_Comm,Vec *);
115ca44d042SBarry Smith EXTERN int VecCreateSeq(MPI_Comm,int,Vec*);
116ca44d042SBarry Smith EXTERN int VecCreateMPI(MPI_Comm,int,int,Vec*);
117ea709b57SSatish Balay EXTERN int VecCreateSeqWithArray(MPI_Comm,int,const PetscScalar[],Vec*);
118ea709b57SSatish Balay EXTERN int VecCreateMPIWithArray(MPI_Comm,int,int,const PetscScalar[],Vec*);
119ca44d042SBarry Smith EXTERN int VecCreateShared(MPI_Comm,int,int,Vec*);
120ca44d042SBarry Smith EXTERN int VecSetFromOptions(Vec);
121fd487807SMatthew Knepley EXTERN int VecPrintHelp(Vec);
122ca44d042SBarry Smith EXTERN int VecDestroy(Vec);
1234b0e389bSBarry Smith 
1247097b907SMatthew Knepley EXTERN int VecSetSizes(Vec,int,int);
125fd487807SMatthew Knepley 
12687828ca2SBarry Smith EXTERN int VecDot(Vec,Vec,PetscScalar*);
12787828ca2SBarry Smith EXTERN int VecTDot(Vec,Vec,PetscScalar*);
12887828ca2SBarry Smith EXTERN int VecMDot(int,Vec,const Vec[],PetscScalar*);
12987828ca2SBarry Smith EXTERN int VecMTDot(int,Vec,const Vec[],PetscScalar*);
130cddf8d76SBarry Smith 
13109321671SBarry Smith /*E
13209321671SBarry Smith     NormType - determines what type of norm to compute
13309321671SBarry Smith 
13409321671SBarry Smith     Level: beginner
13509321671SBarry Smith 
13609321671SBarry Smith .seealso: VecNorm(), VecNormBegin(), VecNormEnd(), MatNorm()
13709321671SBarry Smith E*/
13893c39befSBarry Smith typedef enum {NORM_1=1,NORM_2=2,NORM_FROBENIUS=3,NORM_INFINITY=4,NORM_1_AND_2=5} NormType;
139cddf8d76SBarry Smith #define NORM_MAX NORM_INFINITY
14009321671SBarry Smith 
1419b250c83SBarry Smith /*MC
1429b250c83SBarry Smith      NORM_1 - the one norm, ||v|| = sum_i | v_i |. ||A|| = max_j || v_*j ||, maximum column sum
1439b250c83SBarry Smith 
1449b250c83SBarry Smith    Level: beginner
1459b250c83SBarry Smith 
1469b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_2, NORM_FROBENIUS,
1479b250c83SBarry Smith            NORM_INFINITY, NORM_1_AND_2
1489b250c83SBarry Smith 
1499b250c83SBarry Smith M*/
1509b250c83SBarry Smith 
1519b250c83SBarry Smith /*MC
1529b250c83SBarry Smith      NORM_2 - the two norm, ||v|| = sqrt(sum_i (v_i)^2) (vectors only)
1539b250c83SBarry Smith 
1549b250c83SBarry Smith    Level: beginner
1559b250c83SBarry Smith 
1569b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_FROBENIUS,
1579b250c83SBarry Smith            NORM_INFINITY, NORM_1_AND_2
1589b250c83SBarry Smith 
1599b250c83SBarry Smith M*/
1609b250c83SBarry Smith 
1619b250c83SBarry Smith /*MC
1629b250c83SBarry Smith      NORM_FROBENIUS - ||A|| = sqrt(sum_ij (A_ij)^2), same as NORM_2 for vectors
1639b250c83SBarry Smith 
1649b250c83SBarry Smith    Level: beginner
1659b250c83SBarry Smith 
1669b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
1679b250c83SBarry Smith            NORM_INFINITY, NORM_1_AND_2
1689b250c83SBarry Smith 
1699b250c83SBarry Smith M*/
1709b250c83SBarry Smith 
1719b250c83SBarry Smith /*MC
1729b250c83SBarry Smith      NORM_INFINITY - ||v|| = max_i |v_i|. ||A|| = max_i || v_i* ||, maximum row sum
1739b250c83SBarry Smith 
1749b250c83SBarry Smith    Level: beginner
1759b250c83SBarry Smith 
1769b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
1779b250c83SBarry Smith            NORM_FROBINIUS, NORM_1_AND_2
1789b250c83SBarry Smith 
1799b250c83SBarry Smith M*/
1809b250c83SBarry Smith 
1819b250c83SBarry Smith /*MC
1829b250c83SBarry Smith      NORM_1_AND_2 - computes both the 1 and 2 norm of a vector
1839b250c83SBarry Smith 
1849b250c83SBarry Smith    Level: beginner
1859b250c83SBarry Smith 
1869b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
1879b250c83SBarry Smith            NORM_FROBINIUS, NORM_INFINITY
1889b250c83SBarry Smith 
1899b250c83SBarry Smith M*/
1909b250c83SBarry Smith 
1919b250c83SBarry Smith /*MC
1929b250c83SBarry Smith      NORM_MAX - see NORM_INFINITY
1939b250c83SBarry Smith 
194*d41222bbSBarry Smith    Level: beginner
195*d41222bbSBarry Smith 
1969b250c83SBarry Smith M*/
1979b250c83SBarry Smith 
198b0a32e0cSBarry Smith EXTERN int VecNorm(Vec,NormType,PetscReal *);
19973ff66d1Svictorle EXTERN int VecNormComposedDataID(NormType,int*);
2007bdeda15SDinesh Kaushik EXTERN int VecNormalize(Vec,PetscReal *);
20187828ca2SBarry Smith EXTERN int VecSum(Vec,PetscScalar*);
202b0a32e0cSBarry Smith EXTERN int VecMax(Vec,int*,PetscReal *);
203b0a32e0cSBarry Smith EXTERN int VecMin(Vec,int*,PetscReal *);
204ea709b57SSatish Balay EXTERN int VecScale(const PetscScalar *a,Vec v);
205ca44d042SBarry Smith EXTERN int VecCopy(Vec,Vec);
206ca44d042SBarry Smith EXTERN int VecSetRandom(PetscRandom,Vec);
207ea709b57SSatish Balay EXTERN int VecSet(const PetscScalar*,Vec);
208ca44d042SBarry Smith EXTERN int VecSwap(Vec,Vec);
209ea709b57SSatish Balay EXTERN int VecAXPY(const PetscScalar*,Vec,Vec);
210ea709b57SSatish Balay EXTERN int VecAXPBY(const PetscScalar*,const PetscScalar *,Vec,Vec);
211ea709b57SSatish Balay EXTERN int VecMAXPY(int,const PetscScalar*,Vec,Vec*);
212ea709b57SSatish Balay EXTERN int VecAYPX(const PetscScalar*,Vec,Vec);
213ea709b57SSatish Balay EXTERN int VecWAXPY(const PetscScalar*,Vec,Vec,Vec);
214ca44d042SBarry Smith EXTERN int VecPointwiseMult(Vec,Vec,Vec);
215ca44d042SBarry Smith EXTERN int VecPointwiseDivide(Vec,Vec,Vec);
216b10e564cSKris Buschelman EXTERN int VecMaxPointwiseDivide(Vec,Vec,PetscReal*);
217ea709b57SSatish Balay EXTERN int VecShift(const PetscScalar*,Vec);
218ca44d042SBarry Smith EXTERN int VecReciprocal(Vec);
219deeb6e72SMatthew Knepley EXTERN int VecPermute(Vec, IS, PetscTruth);
220deeb6e72SMatthew Knepley EXTERN int VecSqrt(Vec);
221ca44d042SBarry Smith EXTERN int VecAbs(Vec);
222ca44d042SBarry Smith EXTERN int VecDuplicate(Vec,Vec*);
223ca44d042SBarry Smith EXTERN int VecDuplicateVecs(Vec,int,Vec*[]);
224ca44d042SBarry Smith EXTERN int VecDestroyVecs(const Vec[],int);
2258a124369SBarry Smith EXTERN int VecGetPetscMap(Vec,PetscMap*);
2262eac72dbSBarry Smith 
227147746d1SBarry Smith EXTERN int VecStrideNormAll(Vec,NormType,PetscReal*);
228147746d1SBarry Smith EXTERN int VecStrideMaxAll(Vec,int *,PetscReal *);
229147746d1SBarry Smith EXTERN int VecStrideMinAll(Vec,int *,PetscReal *);
230147746d1SBarry Smith EXTERN int VecStrideScaleAll(Vec,PetscScalar*);
2314a560884SBarry Smith 
23287828ca2SBarry Smith EXTERN int VecStrideNorm(Vec,int,NormType,PetscReal*);
23387828ca2SBarry Smith EXTERN int VecStrideMax(Vec,int,int *,PetscReal *);
23487828ca2SBarry Smith EXTERN int VecStrideMin(Vec,int,int *,PetscReal *);
2354a560884SBarry Smith EXTERN int VecStrideScale(Vec,int,PetscScalar*);
2364a560884SBarry Smith EXTERN int VecStrideGather(Vec,int,Vec,InsertMode);
2374a560884SBarry Smith EXTERN int VecStrideScatter(Vec,int,Vec,InsertMode);
238ca44d042SBarry Smith EXTERN int VecStrideGatherAll(Vec,Vec*,InsertMode);
239ca44d042SBarry Smith EXTERN int VecStrideScatterAll(Vec*,Vec,InsertMode);
240d2655a18SBarry Smith 
241ea709b57SSatish Balay EXTERN int VecSetValues(Vec,int,const int[],const PetscScalar[],InsertMode);
242ca44d042SBarry Smith EXTERN int VecAssemblyBegin(Vec);
243ca44d042SBarry Smith EXTERN int VecAssemblyEnd(Vec);
2441ecfd215SBarry Smith EXTERN int VecStashSetInitialSize(Vec,int,int);
245b0a32e0cSBarry Smith EXTERN int VecStashView(Vec,PetscViewer);
2461ecfd215SBarry Smith EXTERN int VecStashGetInfo(Vec,int*,int*,int*,int*);
24762dc5420SSatish Balay 
2481d73ed98SBarry Smith extern int         VecSetValue_Row;
2491d73ed98SBarry Smith extern PetscScalar VecSetValue_Value;
25030de9b25SBarry Smith /*MC
25130de9b25SBarry Smith    VecSetValue - Set a single entry into a vector.
25230de9b25SBarry Smith 
25330de9b25SBarry Smith    Synopsis:
25430de9b25SBarry Smith    int VecSetValue(Vec v,int row,PetscScalar value, InsertMode mode);
25530de9b25SBarry Smith 
25630de9b25SBarry Smith    Not Collective
25730de9b25SBarry Smith 
25830de9b25SBarry Smith    Input Parameters:
25930de9b25SBarry Smith +  v - the vector
26030de9b25SBarry Smith .  row - the row location of the entry
26130de9b25SBarry Smith .  value - the value to insert
26230de9b25SBarry Smith -  mode - either INSERT_VALUES or ADD_VALUES
26330de9b25SBarry Smith 
26430de9b25SBarry Smith    Notes:
26530de9b25SBarry Smith    For efficiency one should use VecSetValues() and set several or
26630de9b25SBarry Smith    many values simultaneously if possible.
26730de9b25SBarry Smith 
2681d73ed98SBarry Smith    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
2691d73ed98SBarry Smith    MUST be called after all calls to VecSetValues() have been completed.
2701d73ed98SBarry Smith 
2711d73ed98SBarry Smith    VecSetValues() uses 0-based indices in Fortran as well as in C.
2721d73ed98SBarry Smith 
2731d73ed98SBarry Smith    Level: beginner
2741d73ed98SBarry Smith 
2751d73ed98SBarry Smith .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValueLocal()
2761d73ed98SBarry Smith M*/
2771d73ed98SBarry Smith #define VecSetValue(v,i,va,mode) (VecSetValue_Row = i, VecSetValue_Value = va, VecSetValues(v,1,&VecSetValue_Row,&VecSetValue_Value,mode))
2781d73ed98SBarry Smith 
2791d73ed98SBarry Smith /*MC
2801d73ed98SBarry Smith    VecSetValueLocal - Set a single entry into a vector using the local numbering
2811d73ed98SBarry Smith 
2821d73ed98SBarry Smith    Synopsis:
2831d73ed98SBarry Smith    int VecSetValueLocal(Vec v,int row,PetscScalar value, InsertMode mode);
2841d73ed98SBarry Smith 
2851d73ed98SBarry Smith    Not Collective
2861d73ed98SBarry Smith 
2871d73ed98SBarry Smith    Input Parameters:
2881d73ed98SBarry Smith +  v - the vector
2891d73ed98SBarry Smith .  row - the row location of the entry
2901d73ed98SBarry Smith .  value - the value to insert
2911d73ed98SBarry Smith -  mode - either INSERT_VALUES or ADD_VALUES
2921d73ed98SBarry Smith 
2931d73ed98SBarry Smith    Notes:
2941d73ed98SBarry Smith    For efficiency one should use VecSetValues() and set several or
2951d73ed98SBarry Smith    many values simultaneously if possible.
29630de9b25SBarry Smith 
29730de9b25SBarry Smith    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
29830de9b25SBarry Smith    MUST be called after all calls to VecSetValues() have been completed.
29930de9b25SBarry Smith 
30030de9b25SBarry Smith    VecSetValues() uses 0-based indices in Fortran as well as in C.
30130de9b25SBarry Smith 
30230de9b25SBarry Smith    Level: beginner
30330de9b25SBarry Smith 
3041d73ed98SBarry Smith .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValue()
30530de9b25SBarry Smith M*/
3061d73ed98SBarry Smith #define VecSetValueLocal(v,i,va,mode) (VecSetValue_Row = i,VecSetValue_Value = va,VecSetValuesLocal(v,1,&VecSetValue_Row,&VecSetValue_Value,mode))
30730de9b25SBarry Smith 
308ca44d042SBarry Smith EXTERN int VecSetBlockSize(Vec,int);
309ca44d042SBarry Smith EXTERN int VecGetBlockSize(Vec,int*);
310ea709b57SSatish Balay EXTERN int VecSetValuesBlocked(Vec,int,const int[],const PetscScalar[],InsertMode);
3118ed539a5SBarry Smith 
312fd487807SMatthew Knepley /* Dynamic creation and loading functions */
313fd487807SMatthew Knepley extern PetscFList VecList;
314d772e1d7SMatthew Knepley extern PetscTruth VecRegisterAllCalled;
3150e33f6ddSBarry Smith EXTERN int VecSetType(Vec, const VecType);
316d772e1d7SMatthew Knepley EXTERN int VecGetType(Vec, VecType *);
317d772e1d7SMatthew Knepley EXTERN int VecRegister(const char[],const char[],const char[],int(*)(Vec));
318d772e1d7SMatthew Knepley EXTERN int VecRegisterAll(const char []);
319d772e1d7SMatthew Knepley EXTERN int VecRegisterDestroy(void);
32030de9b25SBarry Smith 
32130de9b25SBarry Smith /*MC
32230de9b25SBarry Smith   VecRegisterDynamic - Adds a new vector component implementation
32330de9b25SBarry Smith 
32430de9b25SBarry Smith   Synopsis:
32530de9b25SBarry Smith   VecRegisterDynamic(char *name, char *path, char *func_name, int (*create_func)(Vec))
32630de9b25SBarry Smith 
32730de9b25SBarry Smith   Not Collective
32830de9b25SBarry Smith 
32930de9b25SBarry Smith   Input Parameters:
33030de9b25SBarry Smith + name        - The name of a new user-defined creation routine
33130de9b25SBarry Smith . path        - The path (either absolute or relative) of the library containing this routine
33230de9b25SBarry Smith . func_name   - The name of routine to create method context
33330de9b25SBarry Smith - create_func - The creation routine itself
33430de9b25SBarry Smith 
33530de9b25SBarry Smith   Notes:
33630de9b25SBarry Smith   VecRegisterDynamic() may be called multiple times to add several user-defined vectors
33730de9b25SBarry Smith 
33830de9b25SBarry Smith   If dynamic libraries are used, then the fourth input argument (routine_create) is ignored.
33930de9b25SBarry Smith 
34030de9b25SBarry Smith   Sample usage:
34130de9b25SBarry Smith .vb
34230de9b25SBarry Smith     VecRegisterDynamic("my_vec","/home/username/my_lib/lib/libO/solaris/libmy.a", "MyVectorCreate", MyVectorCreate);
34330de9b25SBarry Smith .ve
34430de9b25SBarry Smith 
34530de9b25SBarry Smith   Then, your vector type can be chosen with the procedural interface via
34630de9b25SBarry Smith .vb
34730de9b25SBarry Smith     VecCreate(MPI_Comm, Vec *);
34830de9b25SBarry Smith     VecSetType(Vec,"my_vector_name");
34930de9b25SBarry Smith .ve
35030de9b25SBarry Smith    or at runtime via the option
35130de9b25SBarry Smith .vb
35230de9b25SBarry Smith     -vec_type my_vector_name
35330de9b25SBarry Smith .ve
35430de9b25SBarry Smith 
35530de9b25SBarry Smith   Notes: $PETSC_ARCH and $BOPT occuring in pathname will be replaced with appropriate values.
35630de9b25SBarry Smith          If your function is not being put into a shared library then use VecRegister() instead
35730de9b25SBarry Smith 
35830de9b25SBarry Smith   Level: advanced
35930de9b25SBarry Smith 
36030de9b25SBarry Smith .keywords: Vec, register
36130de9b25SBarry Smith .seealso: VecRegisterAll(), VecRegisterDestroy(), VecRegister()
36230de9b25SBarry Smith M*/
363aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
364f1af5d2fSBarry Smith #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,0)
36588d459dfSBarry Smith #else
366f1af5d2fSBarry Smith #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,d)
36788d459dfSBarry Smith #endif
36888d459dfSBarry Smith 
36909321671SBarry Smith 
370ca44d042SBarry Smith EXTERN int VecScatterCreate(Vec,IS,Vec,IS,VecScatter *);
371ca44d042SBarry Smith EXTERN int VecScatterPostRecvs(Vec,Vec,InsertMode,ScatterMode,VecScatter);
372ca44d042SBarry Smith EXTERN int VecScatterBegin(Vec,Vec,InsertMode,ScatterMode,VecScatter);
373ca44d042SBarry Smith EXTERN int VecScatterEnd(Vec,Vec,InsertMode,ScatterMode,VecScatter);
374ca44d042SBarry Smith EXTERN int VecScatterDestroy(VecScatter);
375ca44d042SBarry Smith EXTERN int VecScatterCopy(VecScatter,VecScatter *);
376b0a32e0cSBarry Smith EXTERN int VecScatterView(VecScatter,PetscViewer);
377ca44d042SBarry Smith EXTERN int VecScatterRemap(VecScatter,int *,int*);
3782195c698SBarry Smith 
379cb5b572fSBarry Smith typedef enum {PIPELINE_DOWN=0,PIPELINE_UP=1} PipelineDirection;
380cb5b572fSBarry Smith typedef enum {PIPELINE_NONE=1,PIPELINE_SEQUENTIAL=2,
3818ea6152fSSatish Balay 	      PIPELINE_REDBLACK=3,PIPELINE_MULTICOLOR=4} PipelineType;
382cb5b572fSBarry Smith 
383cb5b572fSBarry Smith typedef struct _p_VecPipeline*  VecPipeline;
384cb5b572fSBarry Smith 
385ca44d042SBarry Smith EXTERN int VecPipelineCreate(MPI_Comm,Vec,IS,Vec,IS,VecPipeline *);
386ca44d042SBarry Smith EXTERN int VecPipelineSetType(VecPipeline,PipelineType,PetscObject);
387ca44d042SBarry Smith EXTERN int VecPipelineSetup(VecPipeline);
388ca44d042SBarry Smith EXTERN int VecPipelineBegin(Vec,Vec,InsertMode,ScatterMode,PipelineDirection,VecPipeline);
389ca44d042SBarry Smith EXTERN int VecPipelineEnd(Vec,Vec,InsertMode,ScatterMode,PipelineDirection,VecPipeline);
390b0a32e0cSBarry Smith EXTERN int VecPipelineView(VecPipeline,PetscViewer);
391ca44d042SBarry Smith EXTERN int VecPipelineDestroy(VecPipeline);
392cb5b572fSBarry Smith 
393ebe3b25bSBarry Smith EXTERN int VecGetArray_Private(Vec,PetscScalar*[]);
394ebe3b25bSBarry Smith EXTERN int VecRestoreArray_Private(Vec,PetscScalar*[]);
39587828ca2SBarry Smith EXTERN int VecGetArray4d(Vec,int,int,int,int,int,int,int,int,PetscScalar****[]);
39687828ca2SBarry Smith EXTERN int VecRestoreArray4d(Vec,int,int,int,int,int,int,int,int,PetscScalar****[]);
39787828ca2SBarry Smith EXTERN int VecGetArray3d(Vec,int,int,int,int,int,int,PetscScalar***[]);
39887828ca2SBarry Smith EXTERN int VecRestoreArray3d(Vec,int,int,int,int,int,int,PetscScalar***[]);
39987828ca2SBarry Smith EXTERN int VecGetArray2d(Vec,int,int,int,int,PetscScalar**[]);
40087828ca2SBarry Smith EXTERN int VecRestoreArray2d(Vec,int,int,int,int,PetscScalar**[]);
40187828ca2SBarry Smith EXTERN int VecGetArray1d(Vec,int,int,PetscScalar *[]);
40287828ca2SBarry Smith EXTERN int VecRestoreArray1d(Vec,int,int,PetscScalar *[]);
403ab360428SBarry Smith 
404ea709b57SSatish Balay EXTERN int VecPlaceArray(Vec,const PetscScalar[]);
405b0a32e0cSBarry Smith EXTERN int VecResetArray(Vec);
406ea709b57SSatish Balay EXTERN int VecReplaceArray(Vec,const PetscScalar[]);
40787828ca2SBarry Smith EXTERN int VecGetArrays(const Vec[],int,PetscScalar**[]);
40887828ca2SBarry Smith EXTERN int VecRestoreArrays(const Vec[],int,PetscScalar**[]);
40984cb2905SBarry Smith 
410ca44d042SBarry Smith EXTERN int VecValid(Vec,PetscTruth*);
411b0a32e0cSBarry Smith EXTERN int VecView(Vec,PetscViewer);
41291d0cc33SMatthew Knepley EXTERN int VecViewFromOptions(Vec, char *);
413ca44d042SBarry Smith EXTERN int VecEqual(Vec,Vec,PetscTruth*);
4147425b172SBarry Smith EXTERN int VecLoad(PetscViewer,const VecType,Vec*);
415b0a32e0cSBarry Smith EXTERN int VecLoadIntoVector(PetscViewer,Vec);
4168ed539a5SBarry Smith 
417ca44d042SBarry Smith EXTERN int VecGetSize(Vec,int*);
418ca44d042SBarry Smith EXTERN int VecGetLocalSize(Vec,int*);
419ca44d042SBarry Smith EXTERN int VecGetOwnershipRange(Vec,int*,int*);
4208ed539a5SBarry Smith 
421ca44d042SBarry Smith EXTERN int VecSetLocalToGlobalMapping(Vec,ISLocalToGlobalMapping);
422ea709b57SSatish Balay EXTERN int VecSetValuesLocal(Vec,int,const int[],const PetscScalar[],InsertMode);
423323b833fSBarry Smith EXTERN int VecSetLocalToGlobalMappingBlock(Vec,ISLocalToGlobalMapping);
424ea709b57SSatish Balay EXTERN int VecSetValuesBlockedLocal(Vec,int,const int[],const PetscScalar[],InsertMode);
42590f02eecSBarry Smith 
42687828ca2SBarry Smith EXTERN int VecDotBegin(Vec,Vec,PetscScalar *);
42787828ca2SBarry Smith EXTERN int VecDotEnd(Vec,Vec,PetscScalar *);
42887828ca2SBarry Smith EXTERN int VecTDotBegin(Vec,Vec,PetscScalar *);
42987828ca2SBarry Smith EXTERN int VecTDotEnd(Vec,Vec,PetscScalar *);
43087828ca2SBarry Smith EXTERN int VecNormBegin(Vec,NormType,PetscReal *);
43187828ca2SBarry Smith EXTERN int VecNormEnd(Vec,NormType,PetscReal *);
432d3c178dbSBarry Smith 
433fdbc4c26SBarry Smith typedef enum {VEC_IGNORE_OFF_PROC_ENTRIES,VEC_TREAT_OFF_PROC_ENTRIES} VecOption;
434ca44d042SBarry Smith EXTERN int VecSetOption(Vec,VecOption);
43590f02eecSBarry Smith 
436ebe3b25bSBarry Smith /*
437ebe3b25bSBarry Smith    Expose VecGetArray()/VecRestoreArray() to users. Allows this to work without any function
438ebe3b25bSBarry Smith    call overhead on any 'native' Vecs.
439ebe3b25bSBarry Smith */
4403c94ec11SBarry Smith #include "vecimpl.h"
441ebe3b25bSBarry Smith 
44287828ca2SBarry Smith EXTERN int VecContourScale(Vec,PetscReal,PetscReal);
443522c5e43SBarry Smith 
44415091d37SBarry Smith /*
44515091d37SBarry Smith     These numbers need to match the entries in
4463c94ec11SBarry Smith   the function table in vecimpl.h
44715091d37SBarry Smith */
448b1bcba4aSBarry Smith typedef enum { VECOP_VIEW = 32,
449b1bcba4aSBarry Smith                VECOP_LOADINTOVECTOR = 38
45015091d37SBarry Smith              } VecOperation;
451c134de8dSSatish Balay EXTERN int VecSetOperation(Vec,VecOperation,void(*)(void));
452b19c1e4cSBarry Smith 
453e182c471SBarry Smith /*
454e182c471SBarry Smith      Routines for dealing with ghosted vectors:
455e182c471SBarry Smith   vectors with ghost elements at the end of the array.
456e182c471SBarry Smith */
457ca44d042SBarry Smith EXTERN int VecCreateGhost(MPI_Comm,int,int,int,const int[],Vec*);
458ea709b57SSatish Balay EXTERN int VecCreateGhostWithArray(MPI_Comm,int,int,int,const int[],const PetscScalar[],Vec*);
459ca44d042SBarry Smith EXTERN int VecCreateGhostBlock(MPI_Comm,int,int,int,int,const int[],Vec*);
460ea709b57SSatish Balay EXTERN int VecCreateGhostBlockWithArray(MPI_Comm,int,int,int,int,const int[],const PetscScalar[],Vec*);
461ca44d042SBarry Smith EXTERN int VecGhostGetLocalForm(Vec,Vec*);
462ca44d042SBarry Smith EXTERN int VecGhostRestoreLocalForm(Vec,Vec*);
463ca44d042SBarry Smith EXTERN int VecGhostUpdateBegin(Vec,InsertMode,ScatterMode);
464ca44d042SBarry Smith EXTERN int VecGhostUpdateEnd(Vec,InsertMode,ScatterMode);
465e182c471SBarry Smith 
4667b200f87SKris Buschelman EXTERN int VecConjugate(Vec);
46734233285SBarry Smith 
468bba1ac68SSatish Balay EXTERN int VecConvertMPIToSeqAll(Vec vin,Vec *vout);
469bba1ac68SSatish Balay EXTERN int VecConvertMPIToMPIZero(Vec vin,Vec *vout);
470bba1ac68SSatish Balay 
471bba1ac68SSatish Balay 
4720e33f6ddSBarry Smith EXTERN int VecESISetType(Vec,const char*);
473bba1ac68SSatish Balay EXTERN int VecESISetFromOptions(Vec);
474bba1ac68SSatish Balay 
4757dbadf16SMatthew Knepley EXTERN int PetscViewerMathematicaGetVector(PetscViewer, Vec);
4767dbadf16SMatthew Knepley EXTERN int 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*/
493d59c15a7SBarry Smith         struct _p_Vecs  {int 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