xref: /petsc/include/petscvec.h (revision 73ff66d1d953ce6f6bb8ff02ddbc1507305c32cc)
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"
31d772e1d7SMatthew Knepley typedef char *PetscMapType;
32d772e1d7SMatthew Knepley 
33d772e1d7SMatthew Knepley #define MAP_SER_MPI_BINARY "mpi_binary"
34d772e1d7SMatthew Knepley typedef char *PetscMapSerializeType;
35d772e1d7SMatthew Knepley 
36d772e1d7SMatthew Knepley /* Logging support */
37d772e1d7SMatthew Knepley extern int MAP_COOKIE;
38d772e1d7SMatthew Knepley 
39d772e1d7SMatthew Knepley EXTERN int PetscMapCreate(MPI_Comm,PetscMap*);
40d772e1d7SMatthew Knepley EXTERN int PetscMapCreateMPI(MPI_Comm,int,int,PetscMap*);
41d772e1d7SMatthew Knepley EXTERN int PetscMapSerialize(MPI_Comm,PetscMap *,PetscViewer,PetscTruth);
42d772e1d7SMatthew Knepley EXTERN int PetscMapSetFromOptions(PetscMap);
43d772e1d7SMatthew Knepley EXTERN int PetscMapPrintHelp(PetscMap);
44d772e1d7SMatthew Knepley EXTERN int PetscMapDestroy(PetscMap);
45d772e1d7SMatthew Knepley 
46d772e1d7SMatthew Knepley EXTERN int PetscMapSetLocalSize(PetscMap,int);
47d772e1d7SMatthew Knepley EXTERN int PetscMapGetLocalSize(PetscMap,int *);
48d772e1d7SMatthew Knepley EXTERN int PetscMapSetSize(PetscMap,int);
49d772e1d7SMatthew Knepley EXTERN int PetscMapGetSize(PetscMap,int *);
50d772e1d7SMatthew Knepley EXTERN int PetscMapGetLocalRange(PetscMap,int *,int *);
51d772e1d7SMatthew Knepley EXTERN int PetscMapGetGlobalRange(PetscMap,int *[]);
52d772e1d7SMatthew Knepley 
53d772e1d7SMatthew Knepley /* Dynamic creation and loading functions */
54d772e1d7SMatthew Knepley extern PetscFList PetscMapList;
55d772e1d7SMatthew Knepley extern PetscTruth PetscMapRegisterAllCalled;
56d772e1d7SMatthew Knepley EXTERN int PetscMapSetType(PetscMap, PetscMapType);
57d772e1d7SMatthew Knepley EXTERN int PetscMapGetType(PetscMap, PetscMapType *);
58d772e1d7SMatthew Knepley EXTERN int PetscMapRegister(const char[],const char[],const char[],int(*)(PetscMap));
59d772e1d7SMatthew Knepley EXTERN int PetscMapRegisterAll(const char []);
60d772e1d7SMatthew Knepley EXTERN int PetscMapRegisterDestroy(void);
61d772e1d7SMatthew Knepley #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
62d772e1d7SMatthew Knepley #define PetscMapRegisterDynamic(a,b,c,d) PetscMapRegister(a,b,c,0)
63d772e1d7SMatthew Knepley #else
64d772e1d7SMatthew Knepley #define PetscMapRegisterDynamic(a,b,c,d) PetscMapRegister(a,b,c,d)
65d772e1d7SMatthew Knepley #endif
66d772e1d7SMatthew Knepley 
67d772e1d7SMatthew Knepley extern PetscFList PetscMapSerializeList;
68d772e1d7SMatthew Knepley extern PetscTruth PetscMapSerializeRegisterAllCalled;
69d772e1d7SMatthew Knepley EXTERN int PetscMapSetSerializeType(PetscMap, PetscMapSerializeType);
70d772e1d7SMatthew Knepley EXTERN int PetscMapGetSerializeType(PetscMap, PetscMapSerializeType *);
71d772e1d7SMatthew Knepley EXTERN int PetscMapSerializeRegister(const char [], const char [], const char [], int (*)(MPI_Comm, PetscMap *, PetscViewer, PetscTruth));
72d772e1d7SMatthew Knepley EXTERN int PetscMapSerializeRegisterAll(const char []);
73d772e1d7SMatthew Knepley EXTERN int PetscMapSerializeRegisterDestroy(void);
74d772e1d7SMatthew Knepley #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
75d772e1d7SMatthew Knepley #define PetscMapSerializeRegisterDynamic(a,b,c,d) PetscMapSerializeRegister(a,b,c,0)
76d772e1d7SMatthew Knepley #else
77d772e1d7SMatthew Knepley #define PetscMapSerializeRegisterDynamic(a,b,c,d) PetscMapSerializeRegister(a,b,c,d)
78d772e1d7SMatthew Knepley #endif
79d772e1d7SMatthew Knepley 
8009321671SBarry Smith /*S
8109321671SBarry Smith      Vec - Abstract PETSc vector object
8209321671SBarry Smith 
8309321671SBarry Smith    Level: beginner
8409321671SBarry Smith 
8509321671SBarry Smith   Concepts: field variables, unknowns, arrays
8609321671SBarry Smith 
8709321671SBarry Smith .seealso:  VecCreate(), VecType, VecSetType()
8809321671SBarry Smith S*/
89f09e8eb9SSatish Balay typedef struct _p_Vec*         Vec;
9009321671SBarry Smith 
9109321671SBarry Smith /*S
9209321671SBarry Smith      VecScatter - Object used to manage communication of data
9309321671SBarry Smith        between vectors in parallel. Manages both scatters and gathers
9409321671SBarry Smith 
9509321671SBarry Smith    Level: beginner
9609321671SBarry Smith 
9709321671SBarry Smith   Concepts: scatter
9809321671SBarry Smith 
9909321671SBarry Smith .seealso:  VecScatterCreate(), VecScatterBegin(), VecScatterEnd()
10009321671SBarry Smith S*/
101f09e8eb9SSatish Balay typedef struct _p_VecScatter*  VecScatter;
10209321671SBarry Smith 
10309321671SBarry Smith /*E
10409321671SBarry Smith     VecType - String with the name of a PETSc vector or the creation function
10509321671SBarry Smith        with an optional dynamic library name, for example
10609321671SBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:myveccreate()
10709321671SBarry Smith 
10809321671SBarry Smith    Level: beginner
10909321671SBarry Smith 
11009321671SBarry Smith .seealso: VecSetType(), Vec
11109321671SBarry Smith E*/
1120676abe4SMatthew Knepley #define VECSEQ         "seq"
1130676abe4SMatthew Knepley #define VECMPI         "mpi"
1140676abe4SMatthew Knepley #define VECFETI        "feti"
1150676abe4SMatthew Knepley #define VECSHARED      "shared"
1160676abe4SMatthew Knepley #define VECESI         "esi"
1170676abe4SMatthew Knepley #define VECPETSCESI    "petscesi"
1183f1db9ecSBarry Smith typedef char*  VecType;
1192eac72dbSBarry Smith 
120fd487807SMatthew Knepley #define VEC_SER_SEQ_BINARY "seq_binary"
121fd487807SMatthew Knepley #define VEC_SER_MPI_BINARY "mpi_binary"
122fd487807SMatthew Knepley typedef char *VecSerializeType;
123fd487807SMatthew Knepley 
124fd487807SMatthew Knepley /* Logging support */
125552e946dSBarry Smith #define    VEC_FILE_COOKIE 1211214
1268ba1e511SMatthew Knepley extern int VEC_COOKIE;
127fd487807SMatthew Knepley extern int VEC_SCATTER_COOKIE;
128d5ba7fb7SMatthew Knepley extern int VEC_View, VEC_Max, VEC_Min, VEC_DotBarrier, VEC_Dot, VEC_MDotBarrier, VEC_MDot, VEC_TDot, VEC_MTDot, VEC_NormBarrier;
1297bdeda15SDinesh 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;
130d5ba7fb7SMatthew Knepley extern int VEC_AssemblyEnd, VEC_PointwiseMult, VEC_SetValues, VEC_Load, VEC_ScatterBarrier, VEC_ScatterBegin, VEC_ScatterEnd;
131d5ba7fb7SMatthew Knepley extern int VEC_SetRandom, VEC_ReduceArithmetic, VEC_ReduceBarrier, VEC_ReduceCommunication;
1328ba1e511SMatthew Knepley 
1338ba1e511SMatthew Knepley EXTERN int VecInitializePackage(char *);
134fd487807SMatthew Knepley 
135d772e1d7SMatthew Knepley EXTERN int VecCreate(MPI_Comm,Vec *);
136ca44d042SBarry Smith EXTERN int VecCreateSeq(MPI_Comm,int,Vec*);
137ca44d042SBarry Smith EXTERN int VecCreateMPI(MPI_Comm,int,int,Vec*);
138ea709b57SSatish Balay EXTERN int VecCreateSeqWithArray(MPI_Comm,int,const PetscScalar[],Vec*);
139ea709b57SSatish Balay EXTERN int VecCreateMPIWithArray(MPI_Comm,int,int,const PetscScalar[],Vec*);
140ca44d042SBarry Smith EXTERN int VecCreateShared(MPI_Comm,int,int,Vec*);
1417097b907SMatthew Knepley EXTERN int VecSerialize(MPI_Comm,Vec *,PetscViewer,PetscTruth);
142ca44d042SBarry Smith EXTERN int VecSetFromOptions(Vec);
143fd487807SMatthew Knepley EXTERN int VecPrintHelp(Vec);
144ca44d042SBarry Smith EXTERN int VecDestroy(Vec);
1454b0e389bSBarry Smith 
1467097b907SMatthew Knepley EXTERN int VecSetSizes(Vec,int,int);
147fd487807SMatthew Knepley 
14887828ca2SBarry Smith EXTERN int VecDot(Vec,Vec,PetscScalar*);
14987828ca2SBarry Smith EXTERN int VecTDot(Vec,Vec,PetscScalar*);
15087828ca2SBarry Smith EXTERN int VecMDot(int,Vec,const Vec[],PetscScalar*);
15187828ca2SBarry Smith EXTERN int VecMTDot(int,Vec,const Vec[],PetscScalar*);
152cddf8d76SBarry Smith 
15309321671SBarry Smith /*E
15409321671SBarry Smith     NormType - determines what type of norm to compute
15509321671SBarry Smith 
15609321671SBarry Smith     Level: beginner
15709321671SBarry Smith 
15809321671SBarry Smith .seealso: VecNorm(), VecNormBegin(), VecNormEnd(), MatNorm()
15909321671SBarry Smith E*/
16093c39befSBarry Smith typedef enum {NORM_1=1,NORM_2=2,NORM_FROBENIUS=3,NORM_INFINITY=4,NORM_1_AND_2=5} NormType;
161cddf8d76SBarry Smith #define NORM_MAX NORM_INFINITY
16209321671SBarry Smith 
163b0a32e0cSBarry Smith EXTERN int VecNorm(Vec,NormType,PetscReal *);
164*73ff66d1Svictorle EXTERN int VecNormComposedDataID(NormType,int*);
1657bdeda15SDinesh Kaushik EXTERN int VecNormalize(Vec,PetscReal *);
16687828ca2SBarry Smith EXTERN int VecSum(Vec,PetscScalar*);
167b0a32e0cSBarry Smith EXTERN int VecMax(Vec,int*,PetscReal *);
168b0a32e0cSBarry Smith EXTERN int VecMin(Vec,int*,PetscReal *);
169ea709b57SSatish Balay EXTERN int VecScale(const PetscScalar *a,Vec v);
170ca44d042SBarry Smith EXTERN int VecCopy(Vec,Vec);
171ca44d042SBarry Smith EXTERN int VecSetRandom(PetscRandom,Vec);
172ea709b57SSatish Balay EXTERN int VecSet(const PetscScalar*,Vec);
173ca44d042SBarry Smith EXTERN int VecSwap(Vec,Vec);
174ea709b57SSatish Balay EXTERN int VecAXPY(const PetscScalar*,Vec,Vec);
175ea709b57SSatish Balay EXTERN int VecAXPBY(const PetscScalar*,const PetscScalar *,Vec,Vec);
176ea709b57SSatish Balay EXTERN int VecMAXPY(int,const PetscScalar*,Vec,Vec*);
177ea709b57SSatish Balay EXTERN int VecAYPX(const PetscScalar*,Vec,Vec);
178ea709b57SSatish Balay EXTERN int VecWAXPY(const PetscScalar*,Vec,Vec,Vec);
179ca44d042SBarry Smith EXTERN int VecPointwiseMult(Vec,Vec,Vec);
180ca44d042SBarry Smith EXTERN int VecPointwiseDivide(Vec,Vec,Vec);
181b10e564cSKris Buschelman EXTERN int VecMaxPointwiseDivide(Vec,Vec,PetscReal*);
182ea709b57SSatish Balay EXTERN int VecShift(const PetscScalar*,Vec);
183ca44d042SBarry Smith EXTERN int VecReciprocal(Vec);
184deeb6e72SMatthew Knepley EXTERN int VecPermute(Vec, IS, PetscTruth);
185deeb6e72SMatthew Knepley EXTERN int VecSqrt(Vec);
186ca44d042SBarry Smith EXTERN int VecAbs(Vec);
187ca44d042SBarry Smith EXTERN int VecDuplicate(Vec,Vec*);
188ca44d042SBarry Smith EXTERN int VecDuplicateVecs(Vec,int,Vec*[]);
189ca44d042SBarry Smith EXTERN int VecDestroyVecs(const Vec[],int);
1908a124369SBarry Smith EXTERN int VecGetPetscMap(Vec,PetscMap*);
1912eac72dbSBarry Smith 
192147746d1SBarry Smith EXTERN int VecStrideNormAll(Vec,NormType,PetscReal*);
193147746d1SBarry Smith EXTERN int VecStrideMaxAll(Vec,int *,PetscReal *);
194147746d1SBarry Smith EXTERN int VecStrideMinAll(Vec,int *,PetscReal *);
195147746d1SBarry Smith EXTERN int VecStrideScaleAll(Vec,PetscScalar*);
1964a560884SBarry Smith 
19787828ca2SBarry Smith EXTERN int VecStrideNorm(Vec,int,NormType,PetscReal*);
19887828ca2SBarry Smith EXTERN int VecStrideMax(Vec,int,int *,PetscReal *);
19987828ca2SBarry Smith EXTERN int VecStrideMin(Vec,int,int *,PetscReal *);
2004a560884SBarry Smith EXTERN int VecStrideScale(Vec,int,PetscScalar*);
2014a560884SBarry Smith EXTERN int VecStrideGather(Vec,int,Vec,InsertMode);
2024a560884SBarry Smith EXTERN int VecStrideScatter(Vec,int,Vec,InsertMode);
203ca44d042SBarry Smith EXTERN int VecStrideGatherAll(Vec,Vec*,InsertMode);
204ca44d042SBarry Smith EXTERN int VecStrideScatterAll(Vec*,Vec,InsertMode);
205d2655a18SBarry Smith 
206ea709b57SSatish Balay EXTERN int VecSetValues(Vec,int,const int[],const PetscScalar[],InsertMode);
207ca44d042SBarry Smith EXTERN int VecAssemblyBegin(Vec);
208ca44d042SBarry Smith EXTERN int VecAssemblyEnd(Vec);
209ca44d042SBarry Smith EXTERN int VecSetStashInitialSize(Vec,int,int);
210b0a32e0cSBarry Smith EXTERN int VecStashView(Vec,PetscViewer);
21162dc5420SSatish Balay 
21230de9b25SBarry Smith /*MC
21330de9b25SBarry Smith    VecSetValue - Set a single entry into a vector.
21430de9b25SBarry Smith 
21530de9b25SBarry Smith    Synopsis:
21630de9b25SBarry Smith    int VecSetValue(Vec v,int row,PetscScalar value, InsertMode mode);
21730de9b25SBarry Smith 
21830de9b25SBarry Smith    Not Collective
21930de9b25SBarry Smith 
22030de9b25SBarry Smith    Input Parameters:
22130de9b25SBarry Smith +  v - the vector
22230de9b25SBarry Smith .  row - the row location of the entry
22330de9b25SBarry Smith .  value - the value to insert
22430de9b25SBarry Smith -  mode - either INSERT_VALUES or ADD_VALUES
22530de9b25SBarry Smith 
22630de9b25SBarry Smith    Notes:
22730de9b25SBarry Smith    For efficiency one should use VecSetValues() and set several or
22830de9b25SBarry Smith    many values simultaneously if possible.
22930de9b25SBarry Smith 
23030de9b25SBarry Smith    Note that VecSetValue() does NOT return an error code (since this
23130de9b25SBarry Smith    is checked internally).
23230de9b25SBarry Smith 
23330de9b25SBarry Smith    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
23430de9b25SBarry Smith    MUST be called after all calls to VecSetValues() have been completed.
23530de9b25SBarry Smith 
23630de9b25SBarry Smith    VecSetValues() uses 0-based indices in Fortran as well as in C.
23730de9b25SBarry Smith 
23830de9b25SBarry Smith    Level: beginner
23930de9b25SBarry Smith 
24030de9b25SBarry Smith .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal()
24130de9b25SBarry Smith M*/
242bdea15b1SBarry Smith #define VecSetValue(v,i,va,mode) 0;\
243ea709b57SSatish Balay {int _ierr,_row = i; PetscScalar _va = va; \
244b951964fSBarry Smith   _ierr = VecSetValues(v,1,&_row,&_va,mode);CHKERRQ(_ierr); \
245b951964fSBarry Smith }
24630de9b25SBarry Smith 
247ca44d042SBarry Smith EXTERN int VecSetBlockSize(Vec,int);
248ca44d042SBarry Smith EXTERN int VecGetBlockSize(Vec,int*);
249ea709b57SSatish Balay EXTERN int VecSetValuesBlocked(Vec,int,const int[],const PetscScalar[],InsertMode);
2508ed539a5SBarry Smith 
251fd487807SMatthew Knepley /* Dynamic creation and loading functions */
252fd487807SMatthew Knepley extern PetscFList VecList;
253d772e1d7SMatthew Knepley extern PetscTruth VecRegisterAllCalled;
254d772e1d7SMatthew Knepley EXTERN int VecSetType(Vec, VecType);
255d772e1d7SMatthew Knepley EXTERN int VecGetType(Vec, VecType *);
256d772e1d7SMatthew Knepley EXTERN int VecRegister(const char[],const char[],const char[],int(*)(Vec));
257d772e1d7SMatthew Knepley EXTERN int VecRegisterAll(const char []);
258d772e1d7SMatthew Knepley EXTERN int VecRegisterDestroy(void);
25930de9b25SBarry Smith 
26030de9b25SBarry Smith /*MC
26130de9b25SBarry Smith   VecRegisterDynamic - Adds a new vector component implementation
26230de9b25SBarry Smith 
26330de9b25SBarry Smith   Synopsis:
26430de9b25SBarry Smith   VecRegisterDynamic(char *name, char *path, char *func_name, int (*create_func)(Vec))
26530de9b25SBarry Smith 
26630de9b25SBarry Smith   Not Collective
26730de9b25SBarry Smith 
26830de9b25SBarry Smith   Input Parameters:
26930de9b25SBarry Smith + name        - The name of a new user-defined creation routine
27030de9b25SBarry Smith . path        - The path (either absolute or relative) of the library containing this routine
27130de9b25SBarry Smith . func_name   - The name of routine to create method context
27230de9b25SBarry Smith - create_func - The creation routine itself
27330de9b25SBarry Smith 
27430de9b25SBarry Smith   Notes:
27530de9b25SBarry Smith   VecRegisterDynamic() may be called multiple times to add several user-defined vectors
27630de9b25SBarry Smith 
27730de9b25SBarry Smith   If dynamic libraries are used, then the fourth input argument (routine_create) is ignored.
27830de9b25SBarry Smith 
27930de9b25SBarry Smith   Sample usage:
28030de9b25SBarry Smith .vb
28130de9b25SBarry Smith     VecRegisterDynamic("my_vec","/home/username/my_lib/lib/libO/solaris/libmy.a", "MyVectorCreate", MyVectorCreate);
28230de9b25SBarry Smith .ve
28330de9b25SBarry Smith 
28430de9b25SBarry Smith   Then, your vector type can be chosen with the procedural interface via
28530de9b25SBarry Smith .vb
28630de9b25SBarry Smith     VecCreate(MPI_Comm, Vec *);
28730de9b25SBarry Smith     VecSetType(Vec,"my_vector_name");
28830de9b25SBarry Smith .ve
28930de9b25SBarry Smith    or at runtime via the option
29030de9b25SBarry Smith .vb
29130de9b25SBarry Smith     -vec_type my_vector_name
29230de9b25SBarry Smith .ve
29330de9b25SBarry Smith 
29430de9b25SBarry Smith   Notes: $PETSC_ARCH and $BOPT occuring in pathname will be replaced with appropriate values.
29530de9b25SBarry Smith          If your function is not being put into a shared library then use VecRegister() instead
29630de9b25SBarry Smith 
29730de9b25SBarry Smith   Level: advanced
29830de9b25SBarry Smith 
29930de9b25SBarry Smith .keywords: Vec, register
30030de9b25SBarry Smith .seealso: VecRegisterAll(), VecRegisterDestroy(), VecRegister()
30130de9b25SBarry Smith M*/
302aa482453SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
303f1af5d2fSBarry Smith #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,0)
30488d459dfSBarry Smith #else
305f1af5d2fSBarry Smith #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,d)
30688d459dfSBarry Smith #endif
30788d459dfSBarry Smith 
308fd487807SMatthew Knepley extern PetscFList VecSerializeList;
309d772e1d7SMatthew Knepley extern PetscTruth VecSerializeRegisterAllCalled;
310d772e1d7SMatthew Knepley EXTERN int VecSetSerializeType(Vec, VecSerializeType);
311d772e1d7SMatthew Knepley EXTERN int VecGetSerializeType(Vec, VecSerializeType *);
312d772e1d7SMatthew Knepley EXTERN int VecSerializeRegister(const char [], const char [], const char [], int (*)(MPI_Comm, Vec *, PetscViewer, PetscTruth));
313d772e1d7SMatthew Knepley EXTERN int VecSerializeRegisterAll(const char []);
314d772e1d7SMatthew Knepley EXTERN int VecSerializeRegisterDestroy(void);
31530de9b25SBarry Smith 
31630de9b25SBarry Smith /*MC
31730de9b25SBarry Smith   VecSerializeRegisterDynamic - Adds a serialization method to the vec package.
31830de9b25SBarry Smith 
31930de9b25SBarry Smith   Synopsis:
32030de9b25SBarry Smith 
32130de9b25SBarry Smith   VecSerializeRegisterDynamic(char *name, char *path, char *func_name,
32230de9b25SBarry Smith                               int (*serialize_func)(MPI_Comm, Vec *, PetscViewer, PetscTruth))
32330de9b25SBarry Smith 
32430de9b25SBarry Smith   Not Collective
32530de9b25SBarry Smith 
32630de9b25SBarry Smith   Input Parameters:
32730de9b25SBarry Smith + name           - The name of a new user-defined serialization routine
32830de9b25SBarry Smith . path           - The path (either absolute or relative) of the library containing this routine
32930de9b25SBarry Smith . func_name      - The name of the serialization routine
33030de9b25SBarry Smith - serialize_func - The serialization routine itself
33130de9b25SBarry Smith 
33230de9b25SBarry Smith   Notes:
33330de9b25SBarry Smith   VecSerializeRegister() may be called multiple times to add several user-defined serializers.
33430de9b25SBarry Smith 
33530de9b25SBarry Smith   If dynamic libraries are used, then the fourth input argument (serialize_func) is ignored.
33630de9b25SBarry Smith 
33730de9b25SBarry Smith   Sample usage:
33830de9b25SBarry Smith .vb
33930de9b25SBarry Smith   VecSerializeRegisterDynamic("my_store", "/home/username/my_lib/lib/libO/solaris/libmy.a", "MyStoreFunc", MyStoreFunc);
34030de9b25SBarry Smith .ve
34130de9b25SBarry Smith 
34230de9b25SBarry Smith   Then, your serialization can be chosen with the procedural interface via
34330de9b25SBarry Smith .vb
34430de9b25SBarry Smith     VecSetSerializeType(vec, "my_store")
34530de9b25SBarry Smith .ve
34630de9b25SBarry Smith   or at runtime via the option
34730de9b25SBarry Smith .vb
34830de9b25SBarry Smith     -vec_serialize_type my_store
34930de9b25SBarry Smith .ve
35030de9b25SBarry Smith 
35130de9b25SBarry Smith   Note: $PETSC_ARCH and $BOPT occuring in pathname will be replaced with appropriate values.
35230de9b25SBarry Smith 
35330de9b25SBarry Smith   Level: advanced
35430de9b25SBarry Smith 
35530de9b25SBarry Smith .keywords: Vec, register
35630de9b25SBarry Smith .seealso: VecSerializeRegisterAll(), VecSerializeRegisterDestroy()
35730de9b25SBarry Smith M*/
358fd487807SMatthew Knepley #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
359fd487807SMatthew Knepley #define VecSerializeRegisterDynamic(a,b,c,d) VecSerializeRegister(a,b,c,0)
360fd487807SMatthew Knepley #else
361fd487807SMatthew Knepley #define VecSerializeRegisterDynamic(a,b,c,d) VecSerializeRegister(a,b,c,d)
362fd487807SMatthew Knepley #endif
36309321671SBarry Smith 
364ca44d042SBarry Smith EXTERN int VecScatterCreate(Vec,IS,Vec,IS,VecScatter *);
365ca44d042SBarry Smith EXTERN int VecScatterPostRecvs(Vec,Vec,InsertMode,ScatterMode,VecScatter);
366ca44d042SBarry Smith EXTERN int VecScatterBegin(Vec,Vec,InsertMode,ScatterMode,VecScatter);
367ca44d042SBarry Smith EXTERN int VecScatterEnd(Vec,Vec,InsertMode,ScatterMode,VecScatter);
368ca44d042SBarry Smith EXTERN int VecScatterDestroy(VecScatter);
369ca44d042SBarry Smith EXTERN int VecScatterCopy(VecScatter,VecScatter *);
370b0a32e0cSBarry Smith EXTERN int VecScatterView(VecScatter,PetscViewer);
371ca44d042SBarry Smith EXTERN int VecScatterRemap(VecScatter,int *,int*);
3722195c698SBarry Smith 
373cb5b572fSBarry Smith typedef enum {PIPELINE_DOWN=0,PIPELINE_UP=1} PipelineDirection;
374cb5b572fSBarry Smith typedef enum {PIPELINE_NONE=1,PIPELINE_SEQUENTIAL=2,
3758ea6152fSSatish Balay 	      PIPELINE_REDBLACK=3,PIPELINE_MULTICOLOR=4} PipelineType;
376cb5b572fSBarry Smith 
377cb5b572fSBarry Smith typedef struct _p_VecPipeline*  VecPipeline;
378cb5b572fSBarry Smith 
379ca44d042SBarry Smith EXTERN int VecPipelineCreate(MPI_Comm,Vec,IS,Vec,IS,VecPipeline *);
380ca44d042SBarry Smith EXTERN int VecPipelineSetType(VecPipeline,PipelineType,PetscObject);
381ca44d042SBarry Smith EXTERN int VecPipelineSetup(VecPipeline);
382ca44d042SBarry Smith EXTERN int VecPipelineBegin(Vec,Vec,InsertMode,ScatterMode,PipelineDirection,VecPipeline);
383ca44d042SBarry Smith EXTERN int VecPipelineEnd(Vec,Vec,InsertMode,ScatterMode,PipelineDirection,VecPipeline);
384b0a32e0cSBarry Smith EXTERN int VecPipelineView(VecPipeline,PetscViewer);
385ca44d042SBarry Smith EXTERN int VecPipelineDestroy(VecPipeline);
386cb5b572fSBarry Smith 
38787828ca2SBarry Smith EXTERN int VecGetArray(Vec,PetscScalar*[]);
38887828ca2SBarry Smith EXTERN int VecRestoreArray(Vec,PetscScalar*[]);
38987828ca2SBarry Smith EXTERN int VecGetArray4d(Vec,int,int,int,int,int,int,int,int,PetscScalar****[]);
39087828ca2SBarry Smith EXTERN int VecRestoreArray4d(Vec,int,int,int,int,int,int,int,int,PetscScalar****[]);
39187828ca2SBarry Smith EXTERN int VecGetArray3d(Vec,int,int,int,int,int,int,PetscScalar***[]);
39287828ca2SBarry Smith EXTERN int VecRestoreArray3d(Vec,int,int,int,int,int,int,PetscScalar***[]);
39387828ca2SBarry Smith EXTERN int VecGetArray2d(Vec,int,int,int,int,PetscScalar**[]);
39487828ca2SBarry Smith EXTERN int VecRestoreArray2d(Vec,int,int,int,int,PetscScalar**[]);
39587828ca2SBarry Smith EXTERN int VecGetArray1d(Vec,int,int,PetscScalar *[]);
39687828ca2SBarry Smith EXTERN int VecRestoreArray1d(Vec,int,int,PetscScalar *[]);
397ab360428SBarry Smith 
398ea709b57SSatish Balay EXTERN int VecPlaceArray(Vec,const PetscScalar[]);
399b0a32e0cSBarry Smith EXTERN int VecResetArray(Vec);
400ea709b57SSatish Balay EXTERN int VecReplaceArray(Vec,const PetscScalar[]);
40187828ca2SBarry Smith EXTERN int VecGetArrays(const Vec[],int,PetscScalar**[]);
40287828ca2SBarry Smith EXTERN int VecRestoreArrays(const Vec[],int,PetscScalar**[]);
40384cb2905SBarry Smith 
404ca44d042SBarry Smith EXTERN int VecValid(Vec,PetscTruth*);
405b0a32e0cSBarry Smith EXTERN int VecView(Vec,PetscViewer);
40691d0cc33SMatthew Knepley EXTERN int VecViewFromOptions(Vec, char *);
407ca44d042SBarry Smith EXTERN int VecEqual(Vec,Vec,PetscTruth*);
408b0a32e0cSBarry Smith EXTERN int VecLoad(PetscViewer,Vec*);
409b0a32e0cSBarry Smith EXTERN int VecLoadIntoVector(PetscViewer,Vec);
4108ed539a5SBarry Smith 
411ca44d042SBarry Smith EXTERN int VecGetSize(Vec,int*);
412ca44d042SBarry Smith EXTERN int VecGetLocalSize(Vec,int*);
413ca44d042SBarry Smith EXTERN int VecGetOwnershipRange(Vec,int*,int*);
4148ed539a5SBarry Smith 
415ca44d042SBarry Smith EXTERN int VecSetLocalToGlobalMapping(Vec,ISLocalToGlobalMapping);
416ea709b57SSatish Balay EXTERN int VecSetValuesLocal(Vec,int,const int[],const PetscScalar[],InsertMode);
417323b833fSBarry Smith EXTERN int VecSetLocalToGlobalMappingBlock(Vec,ISLocalToGlobalMapping);
418ea709b57SSatish Balay EXTERN int VecSetValuesBlockedLocal(Vec,int,const int[],const PetscScalar[],InsertMode);
41990f02eecSBarry Smith 
42087828ca2SBarry Smith EXTERN int VecDotBegin(Vec,Vec,PetscScalar *);
42187828ca2SBarry Smith EXTERN int VecDotEnd(Vec,Vec,PetscScalar *);
42287828ca2SBarry Smith EXTERN int VecTDotBegin(Vec,Vec,PetscScalar *);
42387828ca2SBarry Smith EXTERN int VecTDotEnd(Vec,Vec,PetscScalar *);
42487828ca2SBarry Smith EXTERN int VecNormBegin(Vec,NormType,PetscReal *);
42587828ca2SBarry Smith EXTERN int VecNormEnd(Vec,NormType,PetscReal *);
426d3c178dbSBarry Smith 
427fdbc4c26SBarry Smith typedef enum {VEC_IGNORE_OFF_PROC_ENTRIES,VEC_TREAT_OFF_PROC_ENTRIES} VecOption;
428ca44d042SBarry Smith EXTERN int VecSetOption(Vec,VecOption);
42990f02eecSBarry Smith 
43087828ca2SBarry Smith EXTERN int VecContourScale(Vec,PetscReal,PetscReal);
431522c5e43SBarry Smith 
43215091d37SBarry Smith /*
43315091d37SBarry Smith     These numbers need to match the entries in
43415091d37SBarry Smith   the function table in src/vec/vecimpl.h
43515091d37SBarry Smith */
436b1bcba4aSBarry Smith typedef enum { VECOP_VIEW = 32,
437b1bcba4aSBarry Smith                VECOP_LOADINTOVECTOR = 38
43815091d37SBarry Smith              } VecOperation;
439c134de8dSSatish Balay EXTERN int VecSetOperation(Vec,VecOperation,void(*)(void));
440b19c1e4cSBarry Smith 
441e182c471SBarry Smith /*
442e182c471SBarry Smith      Routines for dealing with ghosted vectors:
443e182c471SBarry Smith   vectors with ghost elements at the end of the array.
444e182c471SBarry Smith */
445ca44d042SBarry Smith EXTERN int VecCreateGhost(MPI_Comm,int,int,int,const int[],Vec*);
446ea709b57SSatish Balay EXTERN int VecCreateGhostWithArray(MPI_Comm,int,int,int,const int[],const PetscScalar[],Vec*);
447ca44d042SBarry Smith EXTERN int VecCreateGhostBlock(MPI_Comm,int,int,int,int,const int[],Vec*);
448ea709b57SSatish Balay EXTERN int VecCreateGhostBlockWithArray(MPI_Comm,int,int,int,int,const int[],const PetscScalar[],Vec*);
449ca44d042SBarry Smith EXTERN int VecGhostGetLocalForm(Vec,Vec*);
450ca44d042SBarry Smith EXTERN int VecGhostRestoreLocalForm(Vec,Vec*);
451ca44d042SBarry Smith EXTERN int VecGhostUpdateBegin(Vec,InsertMode,ScatterMode);
452ca44d042SBarry Smith EXTERN int VecGhostUpdateEnd(Vec,InsertMode,ScatterMode);
453e182c471SBarry Smith 
4547b200f87SKris Buschelman EXTERN int VecConjugate(Vec);
45534233285SBarry Smith 
456bba1ac68SSatish Balay EXTERN int VecConvertMPIToSeqAll(Vec vin,Vec *vout);
457bba1ac68SSatish Balay EXTERN int VecConvertMPIToMPIZero(Vec vin,Vec *vout);
458bba1ac68SSatish Balay 
459bba1ac68SSatish Balay 
460bba1ac68SSatish Balay EXTERN int VecESISetType(Vec,char*);
461bba1ac68SSatish Balay EXTERN int VecESISetFromOptions(Vec);
462bba1ac68SSatish Balay 
4637dbadf16SMatthew Knepley EXTERN int PetscViewerMathematicaGetVector(PetscViewer, Vec);
4647dbadf16SMatthew Knepley EXTERN int PetscViewerMathematicaPutVector(PetscViewer, Vec);
4657dbadf16SMatthew Knepley 
466d59c15a7SBarry Smith /*S
467d59c15a7SBarry Smith      Vecs - Collection of vectors where the data for the vectors is stored in
468d59c15a7SBarry Smith             one continquous memory
469d59c15a7SBarry Smith 
470d59c15a7SBarry Smith    Level: advanced
471d59c15a7SBarry Smith 
472d59c15a7SBarry Smith    Notes:
473d59c15a7SBarry Smith     Temporary construct for handling multiply right hand side solves
474d59c15a7SBarry Smith 
475d59c15a7SBarry Smith     This is faked by storing a single vector that has enough array space for
476d59c15a7SBarry Smith     n vectors
477d59c15a7SBarry Smith 
478d59c15a7SBarry Smith   Concepts: parallel decomposition
479d59c15a7SBarry Smith 
480d59c15a7SBarry Smith S*/
481d59c15a7SBarry Smith         struct _p_Vecs  {int n; Vec v;};
482d59c15a7SBarry Smith typedef struct _p_Vecs* Vecs;
483d59c15a7SBarry Smith #define VecsDestroy(x)            (VecDestroy((x)->v)         || PetscFree(x))
484d59c15a7SBarry Smith #define VecsCreateSeq(comm,p,m,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeq(comm,p*m,&(*(x))->v) || (-1 == ((*(x))->n = (m))))
485d59c15a7SBarry Smith #define VecsCreateSeqWithArray(comm,p,m,a,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeqWithArray(comm,p*m,a,&(*(x))->v) || (-1 == ((*(x))->n = (m))))
486d59c15a7SBarry Smith #define VecsDuplicate(x,y)        (PetscNew(struct _p_Vecs,y) || VecDuplicate(x->v,&(*(y))->v) || (-1 == ((*(y))->n = (x)->n)))
487e9fa29b7SSatish Balay 
488e9fa29b7SSatish Balay 
489e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END
4902eac72dbSBarry Smith #endif
491