xref: /petsc/include/petscvec.h (revision 1d73ed98e2847f7abb40ffed08f57c10c487fa4f)
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 
141b0a32e0cSBarry Smith EXTERN int VecNorm(Vec,NormType,PetscReal *);
14273ff66d1Svictorle EXTERN int VecNormComposedDataID(NormType,int*);
1437bdeda15SDinesh Kaushik EXTERN int VecNormalize(Vec,PetscReal *);
14487828ca2SBarry Smith EXTERN int VecSum(Vec,PetscScalar*);
145b0a32e0cSBarry Smith EXTERN int VecMax(Vec,int*,PetscReal *);
146b0a32e0cSBarry Smith EXTERN int VecMin(Vec,int*,PetscReal *);
147ea709b57SSatish Balay EXTERN int VecScale(const PetscScalar *a,Vec v);
148ca44d042SBarry Smith EXTERN int VecCopy(Vec,Vec);
149ca44d042SBarry Smith EXTERN int VecSetRandom(PetscRandom,Vec);
150ea709b57SSatish Balay EXTERN int VecSet(const PetscScalar*,Vec);
151ca44d042SBarry Smith EXTERN int VecSwap(Vec,Vec);
152ea709b57SSatish Balay EXTERN int VecAXPY(const PetscScalar*,Vec,Vec);
153ea709b57SSatish Balay EXTERN int VecAXPBY(const PetscScalar*,const PetscScalar *,Vec,Vec);
154ea709b57SSatish Balay EXTERN int VecMAXPY(int,const PetscScalar*,Vec,Vec*);
155ea709b57SSatish Balay EXTERN int VecAYPX(const PetscScalar*,Vec,Vec);
156ea709b57SSatish Balay EXTERN int VecWAXPY(const PetscScalar*,Vec,Vec,Vec);
157ca44d042SBarry Smith EXTERN int VecPointwiseMult(Vec,Vec,Vec);
158ca44d042SBarry Smith EXTERN int VecPointwiseDivide(Vec,Vec,Vec);
159b10e564cSKris Buschelman EXTERN int VecMaxPointwiseDivide(Vec,Vec,PetscReal*);
160ea709b57SSatish Balay EXTERN int VecShift(const PetscScalar*,Vec);
161ca44d042SBarry Smith EXTERN int VecReciprocal(Vec);
162deeb6e72SMatthew Knepley EXTERN int VecPermute(Vec, IS, PetscTruth);
163deeb6e72SMatthew Knepley EXTERN int VecSqrt(Vec);
164ca44d042SBarry Smith EXTERN int VecAbs(Vec);
165ca44d042SBarry Smith EXTERN int VecDuplicate(Vec,Vec*);
166ca44d042SBarry Smith EXTERN int VecDuplicateVecs(Vec,int,Vec*[]);
167ca44d042SBarry Smith EXTERN int VecDestroyVecs(const Vec[],int);
1688a124369SBarry Smith EXTERN int VecGetPetscMap(Vec,PetscMap*);
1692eac72dbSBarry Smith 
170147746d1SBarry Smith EXTERN int VecStrideNormAll(Vec,NormType,PetscReal*);
171147746d1SBarry Smith EXTERN int VecStrideMaxAll(Vec,int *,PetscReal *);
172147746d1SBarry Smith EXTERN int VecStrideMinAll(Vec,int *,PetscReal *);
173147746d1SBarry Smith EXTERN int VecStrideScaleAll(Vec,PetscScalar*);
1744a560884SBarry Smith 
17587828ca2SBarry Smith EXTERN int VecStrideNorm(Vec,int,NormType,PetscReal*);
17687828ca2SBarry Smith EXTERN int VecStrideMax(Vec,int,int *,PetscReal *);
17787828ca2SBarry Smith EXTERN int VecStrideMin(Vec,int,int *,PetscReal *);
1784a560884SBarry Smith EXTERN int VecStrideScale(Vec,int,PetscScalar*);
1794a560884SBarry Smith EXTERN int VecStrideGather(Vec,int,Vec,InsertMode);
1804a560884SBarry Smith EXTERN int VecStrideScatter(Vec,int,Vec,InsertMode);
181ca44d042SBarry Smith EXTERN int VecStrideGatherAll(Vec,Vec*,InsertMode);
182ca44d042SBarry Smith EXTERN int VecStrideScatterAll(Vec*,Vec,InsertMode);
183d2655a18SBarry Smith 
184ea709b57SSatish Balay EXTERN int VecSetValues(Vec,int,const int[],const PetscScalar[],InsertMode);
185ca44d042SBarry Smith EXTERN int VecAssemblyBegin(Vec);
186ca44d042SBarry Smith EXTERN int VecAssemblyEnd(Vec);
187ca44d042SBarry Smith EXTERN int VecSetStashInitialSize(Vec,int,int);
188b0a32e0cSBarry Smith EXTERN int VecStashView(Vec,PetscViewer);
18962dc5420SSatish Balay 
190*1d73ed98SBarry Smith extern int         VecSetValue_Row;
191*1d73ed98SBarry Smith extern PetscScalar VecSetValue_Value;
19230de9b25SBarry Smith /*MC
19330de9b25SBarry Smith    VecSetValue - Set a single entry into a vector.
19430de9b25SBarry Smith 
19530de9b25SBarry Smith    Synopsis:
19630de9b25SBarry Smith    int VecSetValue(Vec v,int row,PetscScalar value, InsertMode mode);
19730de9b25SBarry Smith 
19830de9b25SBarry Smith    Not Collective
19930de9b25SBarry Smith 
20030de9b25SBarry Smith    Input Parameters:
20130de9b25SBarry Smith +  v - the vector
20230de9b25SBarry Smith .  row - the row location of the entry
20330de9b25SBarry Smith .  value - the value to insert
20430de9b25SBarry Smith -  mode - either INSERT_VALUES or ADD_VALUES
20530de9b25SBarry Smith 
20630de9b25SBarry Smith    Notes:
20730de9b25SBarry Smith    For efficiency one should use VecSetValues() and set several or
20830de9b25SBarry Smith    many values simultaneously if possible.
20930de9b25SBarry Smith 
210*1d73ed98SBarry Smith    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
211*1d73ed98SBarry Smith    MUST be called after all calls to VecSetValues() have been completed.
212*1d73ed98SBarry Smith 
213*1d73ed98SBarry Smith    VecSetValues() uses 0-based indices in Fortran as well as in C.
214*1d73ed98SBarry Smith 
215*1d73ed98SBarry Smith    Level: beginner
216*1d73ed98SBarry Smith 
217*1d73ed98SBarry Smith .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValueLocal()
218*1d73ed98SBarry Smith M*/
219*1d73ed98SBarry Smith #define VecSetValue(v,i,va,mode) (VecSetValue_Row = i, VecSetValue_Value = va, VecSetValues(v,1,&VecSetValue_Row,&VecSetValue_Value,mode))
220*1d73ed98SBarry Smith 
221*1d73ed98SBarry Smith /*MC
222*1d73ed98SBarry Smith    VecSetValueLocal - Set a single entry into a vector using the local numbering
223*1d73ed98SBarry Smith 
224*1d73ed98SBarry Smith    Synopsis:
225*1d73ed98SBarry Smith    int VecSetValueLocal(Vec v,int row,PetscScalar value, InsertMode mode);
226*1d73ed98SBarry Smith 
227*1d73ed98SBarry Smith    Not Collective
228*1d73ed98SBarry Smith 
229*1d73ed98SBarry Smith    Input Parameters:
230*1d73ed98SBarry Smith +  v - the vector
231*1d73ed98SBarry Smith .  row - the row location of the entry
232*1d73ed98SBarry Smith .  value - the value to insert
233*1d73ed98SBarry Smith -  mode - either INSERT_VALUES or ADD_VALUES
234*1d73ed98SBarry Smith 
235*1d73ed98SBarry Smith    Notes:
236*1d73ed98SBarry Smith    For efficiency one should use VecSetValues() and set several or
237*1d73ed98SBarry Smith    many values simultaneously if possible.
23830de9b25SBarry Smith 
23930de9b25SBarry Smith    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
24030de9b25SBarry Smith    MUST be called after all calls to VecSetValues() have been completed.
24130de9b25SBarry Smith 
24230de9b25SBarry Smith    VecSetValues() uses 0-based indices in Fortran as well as in C.
24330de9b25SBarry Smith 
24430de9b25SBarry Smith    Level: beginner
24530de9b25SBarry Smith 
246*1d73ed98SBarry Smith .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValue()
24730de9b25SBarry Smith M*/
248*1d73ed98SBarry Smith #define VecSetValueLocal(v,i,va,mode) (VecSetValue_Row = i,VecSetValue_Value = va,VecSetValuesLocal(v,1,&VecSetValue_Row,&VecSetValue_Value,mode))
24930de9b25SBarry Smith 
250ca44d042SBarry Smith EXTERN int VecSetBlockSize(Vec,int);
251ca44d042SBarry Smith EXTERN int VecGetBlockSize(Vec,int*);
252ea709b57SSatish Balay EXTERN int VecSetValuesBlocked(Vec,int,const int[],const PetscScalar[],InsertMode);
2538ed539a5SBarry Smith 
254fd487807SMatthew Knepley /* Dynamic creation and loading functions */
255fd487807SMatthew Knepley extern PetscFList VecList;
256d772e1d7SMatthew Knepley extern PetscTruth VecRegisterAllCalled;
2570e33f6ddSBarry Smith EXTERN int VecSetType(Vec, const VecType);
258d772e1d7SMatthew Knepley EXTERN int VecGetType(Vec, VecType *);
259d772e1d7SMatthew Knepley EXTERN int VecRegister(const char[],const char[],const char[],int(*)(Vec));
260d772e1d7SMatthew Knepley EXTERN int VecRegisterAll(const char []);
261d772e1d7SMatthew Knepley EXTERN int VecRegisterDestroy(void);
26230de9b25SBarry Smith 
26330de9b25SBarry Smith /*MC
26430de9b25SBarry Smith   VecRegisterDynamic - Adds a new vector component implementation
26530de9b25SBarry Smith 
26630de9b25SBarry Smith   Synopsis:
26730de9b25SBarry Smith   VecRegisterDynamic(char *name, char *path, char *func_name, int (*create_func)(Vec))
26830de9b25SBarry Smith 
26930de9b25SBarry Smith   Not Collective
27030de9b25SBarry Smith 
27130de9b25SBarry Smith   Input Parameters:
27230de9b25SBarry Smith + name        - The name of a new user-defined creation routine
27330de9b25SBarry Smith . path        - The path (either absolute or relative) of the library containing this routine
27430de9b25SBarry Smith . func_name   - The name of routine to create method context
27530de9b25SBarry Smith - create_func - The creation routine itself
27630de9b25SBarry Smith 
27730de9b25SBarry Smith   Notes:
27830de9b25SBarry Smith   VecRegisterDynamic() may be called multiple times to add several user-defined vectors
27930de9b25SBarry Smith 
28030de9b25SBarry Smith   If dynamic libraries are used, then the fourth input argument (routine_create) is ignored.
28130de9b25SBarry Smith 
28230de9b25SBarry Smith   Sample usage:
28330de9b25SBarry Smith .vb
28430de9b25SBarry Smith     VecRegisterDynamic("my_vec","/home/username/my_lib/lib/libO/solaris/libmy.a", "MyVectorCreate", MyVectorCreate);
28530de9b25SBarry Smith .ve
28630de9b25SBarry Smith 
28730de9b25SBarry Smith   Then, your vector type can be chosen with the procedural interface via
28830de9b25SBarry Smith .vb
28930de9b25SBarry Smith     VecCreate(MPI_Comm, Vec *);
29030de9b25SBarry Smith     VecSetType(Vec,"my_vector_name");
29130de9b25SBarry Smith .ve
29230de9b25SBarry Smith    or at runtime via the option
29330de9b25SBarry Smith .vb
29430de9b25SBarry Smith     -vec_type my_vector_name
29530de9b25SBarry Smith .ve
29630de9b25SBarry Smith 
29730de9b25SBarry Smith   Notes: $PETSC_ARCH and $BOPT occuring in pathname will be replaced with appropriate values.
29830de9b25SBarry Smith          If your function is not being put into a shared library then use VecRegister() instead
29930de9b25SBarry Smith 
30030de9b25SBarry Smith   Level: advanced
30130de9b25SBarry Smith 
30230de9b25SBarry Smith .keywords: Vec, register
30330de9b25SBarry Smith .seealso: VecRegisterAll(), VecRegisterDestroy(), VecRegister()
30430de9b25SBarry Smith M*/
305aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
306f1af5d2fSBarry Smith #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,0)
30788d459dfSBarry Smith #else
308f1af5d2fSBarry Smith #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,d)
30988d459dfSBarry Smith #endif
31088d459dfSBarry Smith 
31109321671SBarry Smith 
312ca44d042SBarry Smith EXTERN int VecScatterCreate(Vec,IS,Vec,IS,VecScatter *);
313ca44d042SBarry Smith EXTERN int VecScatterPostRecvs(Vec,Vec,InsertMode,ScatterMode,VecScatter);
314ca44d042SBarry Smith EXTERN int VecScatterBegin(Vec,Vec,InsertMode,ScatterMode,VecScatter);
315ca44d042SBarry Smith EXTERN int VecScatterEnd(Vec,Vec,InsertMode,ScatterMode,VecScatter);
316ca44d042SBarry Smith EXTERN int VecScatterDestroy(VecScatter);
317ca44d042SBarry Smith EXTERN int VecScatterCopy(VecScatter,VecScatter *);
318b0a32e0cSBarry Smith EXTERN int VecScatterView(VecScatter,PetscViewer);
319ca44d042SBarry Smith EXTERN int VecScatterRemap(VecScatter,int *,int*);
3202195c698SBarry Smith 
321cb5b572fSBarry Smith typedef enum {PIPELINE_DOWN=0,PIPELINE_UP=1} PipelineDirection;
322cb5b572fSBarry Smith typedef enum {PIPELINE_NONE=1,PIPELINE_SEQUENTIAL=2,
3238ea6152fSSatish Balay 	      PIPELINE_REDBLACK=3,PIPELINE_MULTICOLOR=4} PipelineType;
324cb5b572fSBarry Smith 
325cb5b572fSBarry Smith typedef struct _p_VecPipeline*  VecPipeline;
326cb5b572fSBarry Smith 
327ca44d042SBarry Smith EXTERN int VecPipelineCreate(MPI_Comm,Vec,IS,Vec,IS,VecPipeline *);
328ca44d042SBarry Smith EXTERN int VecPipelineSetType(VecPipeline,PipelineType,PetscObject);
329ca44d042SBarry Smith EXTERN int VecPipelineSetup(VecPipeline);
330ca44d042SBarry Smith EXTERN int VecPipelineBegin(Vec,Vec,InsertMode,ScatterMode,PipelineDirection,VecPipeline);
331ca44d042SBarry Smith EXTERN int VecPipelineEnd(Vec,Vec,InsertMode,ScatterMode,PipelineDirection,VecPipeline);
332b0a32e0cSBarry Smith EXTERN int VecPipelineView(VecPipeline,PetscViewer);
333ca44d042SBarry Smith EXTERN int VecPipelineDestroy(VecPipeline);
334cb5b572fSBarry Smith 
335ebe3b25bSBarry Smith EXTERN int VecGetArray_Private(Vec,PetscScalar*[]);
336ebe3b25bSBarry Smith EXTERN int VecRestoreArray_Private(Vec,PetscScalar*[]);
33787828ca2SBarry Smith EXTERN int VecGetArray4d(Vec,int,int,int,int,int,int,int,int,PetscScalar****[]);
33887828ca2SBarry Smith EXTERN int VecRestoreArray4d(Vec,int,int,int,int,int,int,int,int,PetscScalar****[]);
33987828ca2SBarry Smith EXTERN int VecGetArray3d(Vec,int,int,int,int,int,int,PetscScalar***[]);
34087828ca2SBarry Smith EXTERN int VecRestoreArray3d(Vec,int,int,int,int,int,int,PetscScalar***[]);
34187828ca2SBarry Smith EXTERN int VecGetArray2d(Vec,int,int,int,int,PetscScalar**[]);
34287828ca2SBarry Smith EXTERN int VecRestoreArray2d(Vec,int,int,int,int,PetscScalar**[]);
34387828ca2SBarry Smith EXTERN int VecGetArray1d(Vec,int,int,PetscScalar *[]);
34487828ca2SBarry Smith EXTERN int VecRestoreArray1d(Vec,int,int,PetscScalar *[]);
345ab360428SBarry Smith 
346ea709b57SSatish Balay EXTERN int VecPlaceArray(Vec,const PetscScalar[]);
347b0a32e0cSBarry Smith EXTERN int VecResetArray(Vec);
348ea709b57SSatish Balay EXTERN int VecReplaceArray(Vec,const PetscScalar[]);
34987828ca2SBarry Smith EXTERN int VecGetArrays(const Vec[],int,PetscScalar**[]);
35087828ca2SBarry Smith EXTERN int VecRestoreArrays(const Vec[],int,PetscScalar**[]);
35184cb2905SBarry Smith 
352ca44d042SBarry Smith EXTERN int VecValid(Vec,PetscTruth*);
353b0a32e0cSBarry Smith EXTERN int VecView(Vec,PetscViewer);
35491d0cc33SMatthew Knepley EXTERN int VecViewFromOptions(Vec, char *);
355ca44d042SBarry Smith EXTERN int VecEqual(Vec,Vec,PetscTruth*);
3567425b172SBarry Smith EXTERN int VecLoad(PetscViewer,const VecType,Vec*);
357b0a32e0cSBarry Smith EXTERN int VecLoadIntoVector(PetscViewer,Vec);
3588ed539a5SBarry Smith 
359ca44d042SBarry Smith EXTERN int VecGetSize(Vec,int*);
360ca44d042SBarry Smith EXTERN int VecGetLocalSize(Vec,int*);
361ca44d042SBarry Smith EXTERN int VecGetOwnershipRange(Vec,int*,int*);
3628ed539a5SBarry Smith 
363ca44d042SBarry Smith EXTERN int VecSetLocalToGlobalMapping(Vec,ISLocalToGlobalMapping);
364ea709b57SSatish Balay EXTERN int VecSetValuesLocal(Vec,int,const int[],const PetscScalar[],InsertMode);
365323b833fSBarry Smith EXTERN int VecSetLocalToGlobalMappingBlock(Vec,ISLocalToGlobalMapping);
366ea709b57SSatish Balay EXTERN int VecSetValuesBlockedLocal(Vec,int,const int[],const PetscScalar[],InsertMode);
36790f02eecSBarry Smith 
36887828ca2SBarry Smith EXTERN int VecDotBegin(Vec,Vec,PetscScalar *);
36987828ca2SBarry Smith EXTERN int VecDotEnd(Vec,Vec,PetscScalar *);
37087828ca2SBarry Smith EXTERN int VecTDotBegin(Vec,Vec,PetscScalar *);
37187828ca2SBarry Smith EXTERN int VecTDotEnd(Vec,Vec,PetscScalar *);
37287828ca2SBarry Smith EXTERN int VecNormBegin(Vec,NormType,PetscReal *);
37387828ca2SBarry Smith EXTERN int VecNormEnd(Vec,NormType,PetscReal *);
374d3c178dbSBarry Smith 
375fdbc4c26SBarry Smith typedef enum {VEC_IGNORE_OFF_PROC_ENTRIES,VEC_TREAT_OFF_PROC_ENTRIES} VecOption;
376ca44d042SBarry Smith EXTERN int VecSetOption(Vec,VecOption);
37790f02eecSBarry Smith 
378ebe3b25bSBarry Smith /*
379ebe3b25bSBarry Smith    Expose VecGetArray()/VecRestoreArray() to users. Allows this to work without any function
380ebe3b25bSBarry Smith    call overhead on any 'native' Vecs.
381ebe3b25bSBarry Smith */
3823c94ec11SBarry Smith #include "vecimpl.h"
383ebe3b25bSBarry Smith 
38487828ca2SBarry Smith EXTERN int VecContourScale(Vec,PetscReal,PetscReal);
385522c5e43SBarry Smith 
38615091d37SBarry Smith /*
38715091d37SBarry Smith     These numbers need to match the entries in
3883c94ec11SBarry Smith   the function table in vecimpl.h
38915091d37SBarry Smith */
390b1bcba4aSBarry Smith typedef enum { VECOP_VIEW = 32,
391b1bcba4aSBarry Smith                VECOP_LOADINTOVECTOR = 38
39215091d37SBarry Smith              } VecOperation;
393c134de8dSSatish Balay EXTERN int VecSetOperation(Vec,VecOperation,void(*)(void));
394b19c1e4cSBarry Smith 
395e182c471SBarry Smith /*
396e182c471SBarry Smith      Routines for dealing with ghosted vectors:
397e182c471SBarry Smith   vectors with ghost elements at the end of the array.
398e182c471SBarry Smith */
399ca44d042SBarry Smith EXTERN int VecCreateGhost(MPI_Comm,int,int,int,const int[],Vec*);
400ea709b57SSatish Balay EXTERN int VecCreateGhostWithArray(MPI_Comm,int,int,int,const int[],const PetscScalar[],Vec*);
401ca44d042SBarry Smith EXTERN int VecCreateGhostBlock(MPI_Comm,int,int,int,int,const int[],Vec*);
402ea709b57SSatish Balay EXTERN int VecCreateGhostBlockWithArray(MPI_Comm,int,int,int,int,const int[],const PetscScalar[],Vec*);
403ca44d042SBarry Smith EXTERN int VecGhostGetLocalForm(Vec,Vec*);
404ca44d042SBarry Smith EXTERN int VecGhostRestoreLocalForm(Vec,Vec*);
405ca44d042SBarry Smith EXTERN int VecGhostUpdateBegin(Vec,InsertMode,ScatterMode);
406ca44d042SBarry Smith EXTERN int VecGhostUpdateEnd(Vec,InsertMode,ScatterMode);
407e182c471SBarry Smith 
4087b200f87SKris Buschelman EXTERN int VecConjugate(Vec);
40934233285SBarry Smith 
410bba1ac68SSatish Balay EXTERN int VecConvertMPIToSeqAll(Vec vin,Vec *vout);
411bba1ac68SSatish Balay EXTERN int VecConvertMPIToMPIZero(Vec vin,Vec *vout);
412bba1ac68SSatish Balay 
413bba1ac68SSatish Balay 
4140e33f6ddSBarry Smith EXTERN int VecESISetType(Vec,const char*);
415bba1ac68SSatish Balay EXTERN int VecESISetFromOptions(Vec);
416bba1ac68SSatish Balay 
4177dbadf16SMatthew Knepley EXTERN int PetscViewerMathematicaGetVector(PetscViewer, Vec);
4187dbadf16SMatthew Knepley EXTERN int PetscViewerMathematicaPutVector(PetscViewer, Vec);
4197dbadf16SMatthew Knepley 
420d59c15a7SBarry Smith /*S
421d59c15a7SBarry Smith      Vecs - Collection of vectors where the data for the vectors is stored in
422d59c15a7SBarry Smith             one continquous memory
423d59c15a7SBarry Smith 
424d59c15a7SBarry Smith    Level: advanced
425d59c15a7SBarry Smith 
426d59c15a7SBarry Smith    Notes:
427d59c15a7SBarry Smith     Temporary construct for handling multiply right hand side solves
428d59c15a7SBarry Smith 
429d59c15a7SBarry Smith     This is faked by storing a single vector that has enough array space for
430d59c15a7SBarry Smith     n vectors
431d59c15a7SBarry Smith 
432d59c15a7SBarry Smith   Concepts: parallel decomposition
433d59c15a7SBarry Smith 
434d59c15a7SBarry Smith S*/
435d59c15a7SBarry Smith         struct _p_Vecs  {int n; Vec v;};
436d59c15a7SBarry Smith typedef struct _p_Vecs* Vecs;
437d59c15a7SBarry Smith #define VecsDestroy(x)            (VecDestroy((x)->v)         || PetscFree(x))
438d59c15a7SBarry Smith #define VecsCreateSeq(comm,p,m,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeq(comm,p*m,&(*(x))->v) || (-1 == ((*(x))->n = (m))))
439d59c15a7SBarry Smith #define VecsCreateSeqWithArray(comm,p,m,a,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeqWithArray(comm,p*m,a,&(*(x))->v) || (-1 == ((*(x))->n = (m))))
440d59c15a7SBarry Smith #define VecsDuplicate(x,y)        (PetscNew(struct _p_Vecs,y) || VecDuplicate(x->v,&(*(y))->v) || (-1 == ((*(y))->n = (x)->n)))
441e9fa29b7SSatish Balay 
442e9fa29b7SSatish Balay 
443e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END
4442eac72dbSBarry Smith #endif
445