xref: /petsc/include/petscvec.h (revision 9b250c836e238417c777c071e4e25cfdd2f4369d)
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 
141*9b250c83SBarry Smith /*MC
142*9b250c83SBarry Smith      NORM_1 - the one norm, ||v|| = sum_i | v_i |. ||A|| = max_j || v_*j ||, maximum column sum
143*9b250c83SBarry Smith 
144*9b250c83SBarry Smith    Level: beginner
145*9b250c83SBarry Smith 
146*9b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_2, NORM_FROBENIUS,
147*9b250c83SBarry Smith            NORM_INFINITY, NORM_1_AND_2
148*9b250c83SBarry Smith 
149*9b250c83SBarry Smith M*/
150*9b250c83SBarry Smith 
151*9b250c83SBarry Smith /*MC
152*9b250c83SBarry Smith      NORM_2 - the two norm, ||v|| = sqrt(sum_i (v_i)^2) (vectors only)
153*9b250c83SBarry Smith 
154*9b250c83SBarry Smith    Level: beginner
155*9b250c83SBarry Smith 
156*9b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_FROBENIUS,
157*9b250c83SBarry Smith            NORM_INFINITY, NORM_1_AND_2
158*9b250c83SBarry Smith 
159*9b250c83SBarry Smith M*/
160*9b250c83SBarry Smith 
161*9b250c83SBarry Smith /*MC
162*9b250c83SBarry Smith      NORM_FROBENIUS - ||A|| = sqrt(sum_ij (A_ij)^2), same as NORM_2 for vectors
163*9b250c83SBarry Smith 
164*9b250c83SBarry Smith    Level: beginner
165*9b250c83SBarry Smith 
166*9b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
167*9b250c83SBarry Smith            NORM_INFINITY, NORM_1_AND_2
168*9b250c83SBarry Smith 
169*9b250c83SBarry Smith M*/
170*9b250c83SBarry Smith 
171*9b250c83SBarry Smith /*MC
172*9b250c83SBarry Smith      NORM_INFINITY - ||v|| = max_i |v_i|. ||A|| = max_i || v_i* ||, maximum row sum
173*9b250c83SBarry Smith 
174*9b250c83SBarry Smith    Level: beginner
175*9b250c83SBarry Smith 
176*9b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
177*9b250c83SBarry Smith            NORM_FROBINIUS, NORM_1_AND_2
178*9b250c83SBarry Smith 
179*9b250c83SBarry Smith M*/
180*9b250c83SBarry Smith 
181*9b250c83SBarry Smith /*MC
182*9b250c83SBarry Smith      NORM_1_AND_2 - computes both the 1 and 2 norm of a vector
183*9b250c83SBarry Smith 
184*9b250c83SBarry Smith    Level: beginner
185*9b250c83SBarry Smith 
186*9b250c83SBarry Smith .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
187*9b250c83SBarry Smith            NORM_FROBINIUS, NORM_INFINITY
188*9b250c83SBarry Smith 
189*9b250c83SBarry Smith M*/
190*9b250c83SBarry Smith 
191*9b250c83SBarry Smith /*MC
192*9b250c83SBarry Smith      NORM_MAX - see NORM_INFINITY
193*9b250c83SBarry Smith 
194*9b250c83SBarry Smith M*/
195*9b250c83SBarry Smith 
196b0a32e0cSBarry Smith EXTERN int VecNorm(Vec,NormType,PetscReal *);
19773ff66d1Svictorle EXTERN int VecNormComposedDataID(NormType,int*);
1987bdeda15SDinesh Kaushik EXTERN int VecNormalize(Vec,PetscReal *);
19987828ca2SBarry Smith EXTERN int VecSum(Vec,PetscScalar*);
200b0a32e0cSBarry Smith EXTERN int VecMax(Vec,int*,PetscReal *);
201b0a32e0cSBarry Smith EXTERN int VecMin(Vec,int*,PetscReal *);
202ea709b57SSatish Balay EXTERN int VecScale(const PetscScalar *a,Vec v);
203ca44d042SBarry Smith EXTERN int VecCopy(Vec,Vec);
204ca44d042SBarry Smith EXTERN int VecSetRandom(PetscRandom,Vec);
205ea709b57SSatish Balay EXTERN int VecSet(const PetscScalar*,Vec);
206ca44d042SBarry Smith EXTERN int VecSwap(Vec,Vec);
207ea709b57SSatish Balay EXTERN int VecAXPY(const PetscScalar*,Vec,Vec);
208ea709b57SSatish Balay EXTERN int VecAXPBY(const PetscScalar*,const PetscScalar *,Vec,Vec);
209ea709b57SSatish Balay EXTERN int VecMAXPY(int,const PetscScalar*,Vec,Vec*);
210ea709b57SSatish Balay EXTERN int VecAYPX(const PetscScalar*,Vec,Vec);
211ea709b57SSatish Balay EXTERN int VecWAXPY(const PetscScalar*,Vec,Vec,Vec);
212ca44d042SBarry Smith EXTERN int VecPointwiseMult(Vec,Vec,Vec);
213ca44d042SBarry Smith EXTERN int VecPointwiseDivide(Vec,Vec,Vec);
214b10e564cSKris Buschelman EXTERN int VecMaxPointwiseDivide(Vec,Vec,PetscReal*);
215ea709b57SSatish Balay EXTERN int VecShift(const PetscScalar*,Vec);
216ca44d042SBarry Smith EXTERN int VecReciprocal(Vec);
217deeb6e72SMatthew Knepley EXTERN int VecPermute(Vec, IS, PetscTruth);
218deeb6e72SMatthew Knepley EXTERN int VecSqrt(Vec);
219ca44d042SBarry Smith EXTERN int VecAbs(Vec);
220ca44d042SBarry Smith EXTERN int VecDuplicate(Vec,Vec*);
221ca44d042SBarry Smith EXTERN int VecDuplicateVecs(Vec,int,Vec*[]);
222ca44d042SBarry Smith EXTERN int VecDestroyVecs(const Vec[],int);
2238a124369SBarry Smith EXTERN int VecGetPetscMap(Vec,PetscMap*);
2242eac72dbSBarry Smith 
225147746d1SBarry Smith EXTERN int VecStrideNormAll(Vec,NormType,PetscReal*);
226147746d1SBarry Smith EXTERN int VecStrideMaxAll(Vec,int *,PetscReal *);
227147746d1SBarry Smith EXTERN int VecStrideMinAll(Vec,int *,PetscReal *);
228147746d1SBarry Smith EXTERN int VecStrideScaleAll(Vec,PetscScalar*);
2294a560884SBarry Smith 
23087828ca2SBarry Smith EXTERN int VecStrideNorm(Vec,int,NormType,PetscReal*);
23187828ca2SBarry Smith EXTERN int VecStrideMax(Vec,int,int *,PetscReal *);
23287828ca2SBarry Smith EXTERN int VecStrideMin(Vec,int,int *,PetscReal *);
2334a560884SBarry Smith EXTERN int VecStrideScale(Vec,int,PetscScalar*);
2344a560884SBarry Smith EXTERN int VecStrideGather(Vec,int,Vec,InsertMode);
2354a560884SBarry Smith EXTERN int VecStrideScatter(Vec,int,Vec,InsertMode);
236ca44d042SBarry Smith EXTERN int VecStrideGatherAll(Vec,Vec*,InsertMode);
237ca44d042SBarry Smith EXTERN int VecStrideScatterAll(Vec*,Vec,InsertMode);
238d2655a18SBarry Smith 
239ea709b57SSatish Balay EXTERN int VecSetValues(Vec,int,const int[],const PetscScalar[],InsertMode);
240ca44d042SBarry Smith EXTERN int VecAssemblyBegin(Vec);
241ca44d042SBarry Smith EXTERN int VecAssemblyEnd(Vec);
2421ecfd215SBarry Smith EXTERN int VecStashSetInitialSize(Vec,int,int);
243b0a32e0cSBarry Smith EXTERN int VecStashView(Vec,PetscViewer);
2441ecfd215SBarry Smith EXTERN int VecStashGetInfo(Vec,int*,int*,int*,int*);
24562dc5420SSatish Balay 
2461d73ed98SBarry Smith extern int         VecSetValue_Row;
2471d73ed98SBarry Smith extern PetscScalar VecSetValue_Value;
24830de9b25SBarry Smith /*MC
24930de9b25SBarry Smith    VecSetValue - Set a single entry into a vector.
25030de9b25SBarry Smith 
25130de9b25SBarry Smith    Synopsis:
25230de9b25SBarry Smith    int VecSetValue(Vec v,int row,PetscScalar value, InsertMode mode);
25330de9b25SBarry Smith 
25430de9b25SBarry Smith    Not Collective
25530de9b25SBarry Smith 
25630de9b25SBarry Smith    Input Parameters:
25730de9b25SBarry Smith +  v - the vector
25830de9b25SBarry Smith .  row - the row location of the entry
25930de9b25SBarry Smith .  value - the value to insert
26030de9b25SBarry Smith -  mode - either INSERT_VALUES or ADD_VALUES
26130de9b25SBarry Smith 
26230de9b25SBarry Smith    Notes:
26330de9b25SBarry Smith    For efficiency one should use VecSetValues() and set several or
26430de9b25SBarry Smith    many values simultaneously if possible.
26530de9b25SBarry Smith 
2661d73ed98SBarry Smith    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
2671d73ed98SBarry Smith    MUST be called after all calls to VecSetValues() have been completed.
2681d73ed98SBarry Smith 
2691d73ed98SBarry Smith    VecSetValues() uses 0-based indices in Fortran as well as in C.
2701d73ed98SBarry Smith 
2711d73ed98SBarry Smith    Level: beginner
2721d73ed98SBarry Smith 
2731d73ed98SBarry Smith .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValueLocal()
2741d73ed98SBarry Smith M*/
2751d73ed98SBarry Smith #define VecSetValue(v,i,va,mode) (VecSetValue_Row = i, VecSetValue_Value = va, VecSetValues(v,1,&VecSetValue_Row,&VecSetValue_Value,mode))
2761d73ed98SBarry Smith 
2771d73ed98SBarry Smith /*MC
2781d73ed98SBarry Smith    VecSetValueLocal - Set a single entry into a vector using the local numbering
2791d73ed98SBarry Smith 
2801d73ed98SBarry Smith    Synopsis:
2811d73ed98SBarry Smith    int VecSetValueLocal(Vec v,int row,PetscScalar value, InsertMode mode);
2821d73ed98SBarry Smith 
2831d73ed98SBarry Smith    Not Collective
2841d73ed98SBarry Smith 
2851d73ed98SBarry Smith    Input Parameters:
2861d73ed98SBarry Smith +  v - the vector
2871d73ed98SBarry Smith .  row - the row location of the entry
2881d73ed98SBarry Smith .  value - the value to insert
2891d73ed98SBarry Smith -  mode - either INSERT_VALUES or ADD_VALUES
2901d73ed98SBarry Smith 
2911d73ed98SBarry Smith    Notes:
2921d73ed98SBarry Smith    For efficiency one should use VecSetValues() and set several or
2931d73ed98SBarry Smith    many values simultaneously if possible.
29430de9b25SBarry Smith 
29530de9b25SBarry Smith    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
29630de9b25SBarry Smith    MUST be called after all calls to VecSetValues() have been completed.
29730de9b25SBarry Smith 
29830de9b25SBarry Smith    VecSetValues() uses 0-based indices in Fortran as well as in C.
29930de9b25SBarry Smith 
30030de9b25SBarry Smith    Level: beginner
30130de9b25SBarry Smith 
3021d73ed98SBarry Smith .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValue()
30330de9b25SBarry Smith M*/
3041d73ed98SBarry Smith #define VecSetValueLocal(v,i,va,mode) (VecSetValue_Row = i,VecSetValue_Value = va,VecSetValuesLocal(v,1,&VecSetValue_Row,&VecSetValue_Value,mode))
30530de9b25SBarry Smith 
306ca44d042SBarry Smith EXTERN int VecSetBlockSize(Vec,int);
307ca44d042SBarry Smith EXTERN int VecGetBlockSize(Vec,int*);
308ea709b57SSatish Balay EXTERN int VecSetValuesBlocked(Vec,int,const int[],const PetscScalar[],InsertMode);
3098ed539a5SBarry Smith 
310fd487807SMatthew Knepley /* Dynamic creation and loading functions */
311fd487807SMatthew Knepley extern PetscFList VecList;
312d772e1d7SMatthew Knepley extern PetscTruth VecRegisterAllCalled;
3130e33f6ddSBarry Smith EXTERN int VecSetType(Vec, const VecType);
314d772e1d7SMatthew Knepley EXTERN int VecGetType(Vec, VecType *);
315d772e1d7SMatthew Knepley EXTERN int VecRegister(const char[],const char[],const char[],int(*)(Vec));
316d772e1d7SMatthew Knepley EXTERN int VecRegisterAll(const char []);
317d772e1d7SMatthew Knepley EXTERN int VecRegisterDestroy(void);
31830de9b25SBarry Smith 
31930de9b25SBarry Smith /*MC
32030de9b25SBarry Smith   VecRegisterDynamic - Adds a new vector component implementation
32130de9b25SBarry Smith 
32230de9b25SBarry Smith   Synopsis:
32330de9b25SBarry Smith   VecRegisterDynamic(char *name, char *path, char *func_name, int (*create_func)(Vec))
32430de9b25SBarry Smith 
32530de9b25SBarry Smith   Not Collective
32630de9b25SBarry Smith 
32730de9b25SBarry Smith   Input Parameters:
32830de9b25SBarry Smith + name        - The name of a new user-defined creation routine
32930de9b25SBarry Smith . path        - The path (either absolute or relative) of the library containing this routine
33030de9b25SBarry Smith . func_name   - The name of routine to create method context
33130de9b25SBarry Smith - create_func - The creation routine itself
33230de9b25SBarry Smith 
33330de9b25SBarry Smith   Notes:
33430de9b25SBarry Smith   VecRegisterDynamic() may be called multiple times to add several user-defined vectors
33530de9b25SBarry Smith 
33630de9b25SBarry Smith   If dynamic libraries are used, then the fourth input argument (routine_create) is ignored.
33730de9b25SBarry Smith 
33830de9b25SBarry Smith   Sample usage:
33930de9b25SBarry Smith .vb
34030de9b25SBarry Smith     VecRegisterDynamic("my_vec","/home/username/my_lib/lib/libO/solaris/libmy.a", "MyVectorCreate", MyVectorCreate);
34130de9b25SBarry Smith .ve
34230de9b25SBarry Smith 
34330de9b25SBarry Smith   Then, your vector type can be chosen with the procedural interface via
34430de9b25SBarry Smith .vb
34530de9b25SBarry Smith     VecCreate(MPI_Comm, Vec *);
34630de9b25SBarry Smith     VecSetType(Vec,"my_vector_name");
34730de9b25SBarry Smith .ve
34830de9b25SBarry Smith    or at runtime via the option
34930de9b25SBarry Smith .vb
35030de9b25SBarry Smith     -vec_type my_vector_name
35130de9b25SBarry Smith .ve
35230de9b25SBarry Smith 
35330de9b25SBarry Smith   Notes: $PETSC_ARCH and $BOPT occuring in pathname will be replaced with appropriate values.
35430de9b25SBarry Smith          If your function is not being put into a shared library then use VecRegister() instead
35530de9b25SBarry Smith 
35630de9b25SBarry Smith   Level: advanced
35730de9b25SBarry Smith 
35830de9b25SBarry Smith .keywords: Vec, register
35930de9b25SBarry Smith .seealso: VecRegisterAll(), VecRegisterDestroy(), VecRegister()
36030de9b25SBarry Smith M*/
361aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
362f1af5d2fSBarry Smith #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,0)
36388d459dfSBarry Smith #else
364f1af5d2fSBarry Smith #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,d)
36588d459dfSBarry Smith #endif
36688d459dfSBarry Smith 
36709321671SBarry Smith 
368ca44d042SBarry Smith EXTERN int VecScatterCreate(Vec,IS,Vec,IS,VecScatter *);
369ca44d042SBarry Smith EXTERN int VecScatterPostRecvs(Vec,Vec,InsertMode,ScatterMode,VecScatter);
370ca44d042SBarry Smith EXTERN int VecScatterBegin(Vec,Vec,InsertMode,ScatterMode,VecScatter);
371ca44d042SBarry Smith EXTERN int VecScatterEnd(Vec,Vec,InsertMode,ScatterMode,VecScatter);
372ca44d042SBarry Smith EXTERN int VecScatterDestroy(VecScatter);
373ca44d042SBarry Smith EXTERN int VecScatterCopy(VecScatter,VecScatter *);
374b0a32e0cSBarry Smith EXTERN int VecScatterView(VecScatter,PetscViewer);
375ca44d042SBarry Smith EXTERN int VecScatterRemap(VecScatter,int *,int*);
3762195c698SBarry Smith 
377cb5b572fSBarry Smith typedef enum {PIPELINE_DOWN=0,PIPELINE_UP=1} PipelineDirection;
378cb5b572fSBarry Smith typedef enum {PIPELINE_NONE=1,PIPELINE_SEQUENTIAL=2,
3798ea6152fSSatish Balay 	      PIPELINE_REDBLACK=3,PIPELINE_MULTICOLOR=4} PipelineType;
380cb5b572fSBarry Smith 
381cb5b572fSBarry Smith typedef struct _p_VecPipeline*  VecPipeline;
382cb5b572fSBarry Smith 
383ca44d042SBarry Smith EXTERN int VecPipelineCreate(MPI_Comm,Vec,IS,Vec,IS,VecPipeline *);
384ca44d042SBarry Smith EXTERN int VecPipelineSetType(VecPipeline,PipelineType,PetscObject);
385ca44d042SBarry Smith EXTERN int VecPipelineSetup(VecPipeline);
386ca44d042SBarry Smith EXTERN int VecPipelineBegin(Vec,Vec,InsertMode,ScatterMode,PipelineDirection,VecPipeline);
387ca44d042SBarry Smith EXTERN int VecPipelineEnd(Vec,Vec,InsertMode,ScatterMode,PipelineDirection,VecPipeline);
388b0a32e0cSBarry Smith EXTERN int VecPipelineView(VecPipeline,PetscViewer);
389ca44d042SBarry Smith EXTERN int VecPipelineDestroy(VecPipeline);
390cb5b572fSBarry Smith 
391ebe3b25bSBarry Smith EXTERN int VecGetArray_Private(Vec,PetscScalar*[]);
392ebe3b25bSBarry Smith EXTERN int VecRestoreArray_Private(Vec,PetscScalar*[]);
39387828ca2SBarry Smith EXTERN int VecGetArray4d(Vec,int,int,int,int,int,int,int,int,PetscScalar****[]);
39487828ca2SBarry Smith EXTERN int VecRestoreArray4d(Vec,int,int,int,int,int,int,int,int,PetscScalar****[]);
39587828ca2SBarry Smith EXTERN int VecGetArray3d(Vec,int,int,int,int,int,int,PetscScalar***[]);
39687828ca2SBarry Smith EXTERN int VecRestoreArray3d(Vec,int,int,int,int,int,int,PetscScalar***[]);
39787828ca2SBarry Smith EXTERN int VecGetArray2d(Vec,int,int,int,int,PetscScalar**[]);
39887828ca2SBarry Smith EXTERN int VecRestoreArray2d(Vec,int,int,int,int,PetscScalar**[]);
39987828ca2SBarry Smith EXTERN int VecGetArray1d(Vec,int,int,PetscScalar *[]);
40087828ca2SBarry Smith EXTERN int VecRestoreArray1d(Vec,int,int,PetscScalar *[]);
401ab360428SBarry Smith 
402ea709b57SSatish Balay EXTERN int VecPlaceArray(Vec,const PetscScalar[]);
403b0a32e0cSBarry Smith EXTERN int VecResetArray(Vec);
404ea709b57SSatish Balay EXTERN int VecReplaceArray(Vec,const PetscScalar[]);
40587828ca2SBarry Smith EXTERN int VecGetArrays(const Vec[],int,PetscScalar**[]);
40687828ca2SBarry Smith EXTERN int VecRestoreArrays(const Vec[],int,PetscScalar**[]);
40784cb2905SBarry Smith 
408ca44d042SBarry Smith EXTERN int VecValid(Vec,PetscTruth*);
409b0a32e0cSBarry Smith EXTERN int VecView(Vec,PetscViewer);
41091d0cc33SMatthew Knepley EXTERN int VecViewFromOptions(Vec, char *);
411ca44d042SBarry Smith EXTERN int VecEqual(Vec,Vec,PetscTruth*);
4127425b172SBarry Smith EXTERN int VecLoad(PetscViewer,const VecType,Vec*);
413b0a32e0cSBarry Smith EXTERN int VecLoadIntoVector(PetscViewer,Vec);
4148ed539a5SBarry Smith 
415ca44d042SBarry Smith EXTERN int VecGetSize(Vec,int*);
416ca44d042SBarry Smith EXTERN int VecGetLocalSize(Vec,int*);
417ca44d042SBarry Smith EXTERN int VecGetOwnershipRange(Vec,int*,int*);
4188ed539a5SBarry Smith 
419ca44d042SBarry Smith EXTERN int VecSetLocalToGlobalMapping(Vec,ISLocalToGlobalMapping);
420ea709b57SSatish Balay EXTERN int VecSetValuesLocal(Vec,int,const int[],const PetscScalar[],InsertMode);
421323b833fSBarry Smith EXTERN int VecSetLocalToGlobalMappingBlock(Vec,ISLocalToGlobalMapping);
422ea709b57SSatish Balay EXTERN int VecSetValuesBlockedLocal(Vec,int,const int[],const PetscScalar[],InsertMode);
42390f02eecSBarry Smith 
42487828ca2SBarry Smith EXTERN int VecDotBegin(Vec,Vec,PetscScalar *);
42587828ca2SBarry Smith EXTERN int VecDotEnd(Vec,Vec,PetscScalar *);
42687828ca2SBarry Smith EXTERN int VecTDotBegin(Vec,Vec,PetscScalar *);
42787828ca2SBarry Smith EXTERN int VecTDotEnd(Vec,Vec,PetscScalar *);
42887828ca2SBarry Smith EXTERN int VecNormBegin(Vec,NormType,PetscReal *);
42987828ca2SBarry Smith EXTERN int VecNormEnd(Vec,NormType,PetscReal *);
430d3c178dbSBarry Smith 
431fdbc4c26SBarry Smith typedef enum {VEC_IGNORE_OFF_PROC_ENTRIES,VEC_TREAT_OFF_PROC_ENTRIES} VecOption;
432ca44d042SBarry Smith EXTERN int 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 
44087828ca2SBarry Smith EXTERN int 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;
449c134de8dSSatish Balay EXTERN int 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 */
455ca44d042SBarry Smith EXTERN int VecCreateGhost(MPI_Comm,int,int,int,const int[],Vec*);
456ea709b57SSatish Balay EXTERN int VecCreateGhostWithArray(MPI_Comm,int,int,int,const int[],const PetscScalar[],Vec*);
457ca44d042SBarry Smith EXTERN int VecCreateGhostBlock(MPI_Comm,int,int,int,int,const int[],Vec*);
458ea709b57SSatish Balay EXTERN int VecCreateGhostBlockWithArray(MPI_Comm,int,int,int,int,const int[],const PetscScalar[],Vec*);
459ca44d042SBarry Smith EXTERN int VecGhostGetLocalForm(Vec,Vec*);
460ca44d042SBarry Smith EXTERN int VecGhostRestoreLocalForm(Vec,Vec*);
461ca44d042SBarry Smith EXTERN int VecGhostUpdateBegin(Vec,InsertMode,ScatterMode);
462ca44d042SBarry Smith EXTERN int VecGhostUpdateEnd(Vec,InsertMode,ScatterMode);
463e182c471SBarry Smith 
4647b200f87SKris Buschelman EXTERN int VecConjugate(Vec);
46534233285SBarry Smith 
466bba1ac68SSatish Balay EXTERN int VecConvertMPIToSeqAll(Vec vin,Vec *vout);
467bba1ac68SSatish Balay EXTERN int VecConvertMPIToMPIZero(Vec vin,Vec *vout);
468bba1ac68SSatish Balay 
469bba1ac68SSatish Balay 
4700e33f6ddSBarry Smith EXTERN int VecESISetType(Vec,const char*);
471bba1ac68SSatish Balay EXTERN int VecESISetFromOptions(Vec);
472bba1ac68SSatish Balay 
4737dbadf16SMatthew Knepley EXTERN int PetscViewerMathematicaGetVector(PetscViewer, Vec);
4747dbadf16SMatthew Knepley EXTERN int 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