xref: /petsc/include/petscvec.h (revision 8e58c17d92fd182847eda150482aa81aa9e1fb44)
1 /* $Id: petscvec.h,v 1.127 2001/09/11 16:31:30 bsmith Exp $ */
2 /*
3     Defines the vector component of PETSc. Vectors generally represent
4   degrees of freedom for finite element/finite difference functions
5   on a grid. They have more mathematical structure then simple arrays.
6 */
7 
8 #ifndef __PETSCVEC_H
9 #define __PETSCVEC_H
10 #include "petscis.h"
11 #include "petscsys.h"
12 
13 /*S
14      PetscMap - Abstract PETSc object that defines the layout of vector and
15   matrices across processors
16 
17    Level: advanced
18 
19    Notes:
20     Does not play a role in the PETSc design, can be ignored
21 
22   Concepts: parallel decomposition
23 
24 .seealso:  PetscMapCreateMPI()
25 S*/
26 typedef struct _p_PetscMap*         PetscMap;
27 
28 /*S
29      Vec - Abstract PETSc vector object
30 
31    Level: beginner
32 
33   Concepts: field variables, unknowns, arrays
34 
35 .seealso:  VecCreate(), VecType, VecSetType()
36 S*/
37 typedef struct _p_Vec*         Vec;
38 
39 /*S
40      VecScatter - Object used to manage communication of data
41        between vectors in parallel. Manages both scatters and gathers
42 
43    Level: beginner
44 
45   Concepts: scatter
46 
47 .seealso:  VecScatterCreate(), VecScatterBegin(), VecScatterEnd()
48 S*/
49 typedef struct _p_VecScatter*  VecScatter;
50 
51 /*E
52     VecType - String with the name of a PETSc vector or the creation function
53        with an optional dynamic library name, for example
54        http://www.mcs.anl.gov/petsc/lib.a:myveccreate()
55 
56    Level: beginner
57 
58 .seealso: VecSetType(), Vec
59 E*/
60 #define VECSEQ         "seq"
61 #define VECMPI         "mpi"
62 #define VECFETI        "feti"
63 #define VECSHARED      "shared"
64 #define VECESI         "esi"
65 #define VECPETSCESI    "petscesi"
66 typedef char*  VecType;
67 
68 #define VEC_SER_SEQ_BINARY "seq_binary"
69 #define VEC_SER_MPI_BINARY "mpi_binary"
70 typedef char *VecSerializeType;
71 
72 /* Logging support */
73 extern int MAP_COOKIE;
74 extern int VEC_COOKIE;
75 extern int VEC_SCATTER_COOKIE;
76 enum {VEC_View, VEC_Max, VEC_Min, VEC_DotBarrier, VEC_Dot, VEC_MDotBarrier, VEC_MDot, VEC_TDot, VEC_MTDot, VEC_NormBarrier,
77       VEC_Norm, VEC_Scale, VEC_Copy, VEC_Set, VEC_AXPY, VEC_AYPX, VEC_WAXPY, VEC_MAXPY, VEC_Swap, VEC_AssemblyBegin,
78       VEC_AssemblyEnd, VEC_PointwiseMult, VEC_SetValues, VEC_Load, VEC_ScatterBarrier, VEC_ScatterBegin, VEC_ScatterEnd,
79       VEC_SetRandom, VEC_ReduceArithmetic, VEC_ReduceBarrier, VEC_ReduceCommunication, VEC_MAX_EVENTS};
80 extern int VecEvents[VEC_MAX_EVENTS];
81 #define VecLogEventBegin(e,o1,o2,o3,o4) PetscLogEventBegin(VecEvents[e],o1,o2,o3,o4)
82 #define VecLogEventEnd(e,o1,o2,o3,o4)   PetscLogEventEnd(VecEvents[e],o1,o2,o3,o4)
83 
84 EXTERN int VecInitializePackage(char *);
85 
86 EXTERN int VecCreateSeq(MPI_Comm,int,Vec*);
87 EXTERN int PetscMapCreateMPI(MPI_Comm,int,int,PetscMap*);
88 EXTERN int VecCreateMPI(MPI_Comm,int,int,Vec*);
89 EXTERN int VecCreateSeqWithArray(MPI_Comm,int,const PetscScalar[],Vec*);
90 EXTERN int VecCreateMPIWithArray(MPI_Comm,int,int,const PetscScalar[],Vec*);
91 EXTERN int VecCreateShared(MPI_Comm,int,int,Vec*);
92 EXTERN int VecCreate(MPI_Comm,Vec *);
93 EXTERN int VecSerialize(MPI_Comm,Vec *,PetscViewer,PetscTruth);
94 EXTERN int VecSetType(Vec,VecType);
95 EXTERN int VecSetFromOptions(Vec);
96 EXTERN int VecPrintHelp(Vec);
97 EXTERN int VecDestroy(Vec);
98 
99 EXTERN int VecSetSizes(Vec,int,int);
100 
101 EXTERN int PetscMapDestroy(PetscMap);
102 EXTERN int PetscMapGetLocalSize(PetscMap,int *);
103 EXTERN int PetscMapGetSize(PetscMap,int *);
104 EXTERN int PetscMapGetLocalRange(PetscMap,int *,int *);
105 EXTERN int PetscMapGetGlobalRange(PetscMap,int *[]);
106 
107 EXTERN int VecDot(Vec,Vec,PetscScalar*);
108 EXTERN int VecTDot(Vec,Vec,PetscScalar*);
109 EXTERN int VecMDot(int,Vec,const Vec[],PetscScalar*);
110 EXTERN int VecMTDot(int,Vec,const Vec[],PetscScalar*);
111 
112 /*E
113     NormType - determines what type of norm to compute
114 
115     Level: beginner
116 
117 .seealso: VecNorm(), VecNormBegin(), VecNormEnd(), MatNorm()
118 E*/
119 typedef enum {NORM_1=1,NORM_2=2,NORM_FROBENIUS=3,NORM_INFINITY=4,NORM_1_AND_2=5} NormType;
120 #define NORM_MAX NORM_INFINITY
121 
122 EXTERN int VecNorm(Vec,NormType,PetscReal *);
123 EXTERN int VecSum(Vec,PetscScalar*);
124 EXTERN int VecMax(Vec,int*,PetscReal *);
125 EXTERN int VecMin(Vec,int*,PetscReal *);
126 EXTERN int VecScale(const PetscScalar *a,Vec v);
127 EXTERN int VecCopy(Vec,Vec);
128 EXTERN int VecSetRandom(PetscRandom,Vec);
129 EXTERN int VecSet(const PetscScalar*,Vec);
130 EXTERN int VecSwap(Vec,Vec);
131 EXTERN int VecAXPY(const PetscScalar*,Vec,Vec);
132 EXTERN int VecAXPBY(const PetscScalar*,const PetscScalar *,Vec,Vec);
133 EXTERN int VecMAXPY(int,const PetscScalar*,Vec,Vec*);
134 EXTERN int VecAYPX(const PetscScalar*,Vec,Vec);
135 EXTERN int VecWAXPY(const PetscScalar*,Vec,Vec,Vec);
136 EXTERN int VecPointwiseMult(Vec,Vec,Vec);
137 EXTERN int VecPointwiseDivide(Vec,Vec,Vec);
138 EXTERN int VecShift(const PetscScalar*,Vec);
139 EXTERN int VecReciprocal(Vec);
140 EXTERN int VecPermute(Vec, IS, PetscTruth);
141 EXTERN int VecSqrt(Vec);
142 EXTERN int VecAbs(Vec);
143 EXTERN int VecDuplicate(Vec,Vec*);
144 EXTERN int VecDuplicateVecs(Vec,int,Vec*[]);
145 EXTERN int VecDestroyVecs(const Vec[],int);
146 EXTERN int VecGetPetscMap(Vec,PetscMap*);
147 
148 EXTERN int VecStrideNorm(Vec,int,NormType,PetscReal*);
149 EXTERN int VecStrideGather(Vec,int,Vec,InsertMode);
150 EXTERN int VecStrideScatter(Vec,int,Vec,InsertMode);
151 EXTERN int VecStrideMax(Vec,int,int *,PetscReal *);
152 EXTERN int VecStrideMin(Vec,int,int *,PetscReal *);
153 EXTERN int VecStrideGatherAll(Vec,Vec*,InsertMode);
154 EXTERN int VecStrideScatterAll(Vec*,Vec,InsertMode);
155 
156 EXTERN int VecSetValues(Vec,int,const int[],const PetscScalar[],InsertMode);
157 EXTERN int VecAssemblyBegin(Vec);
158 EXTERN int VecAssemblyEnd(Vec);
159 EXTERN int VecSetStashInitialSize(Vec,int,int);
160 EXTERN int VecStashView(Vec,PetscViewer);
161 
162 #define VecSetValue(v,i,va,mode) 0;\
163 {int _ierr,_row = i; PetscScalar _va = va; \
164   _ierr = VecSetValues(v,1,&_row,&_va,mode);CHKERRQ(_ierr); \
165 }
166 EXTERN int VecSetBlockSize(Vec,int);
167 EXTERN int VecGetBlockSize(Vec,int*);
168 EXTERN int VecSetValuesBlocked(Vec,int,const int[],const PetscScalar[],InsertMode);
169 
170 /* Dynamic creation and loading functions */
171 extern PetscFList VecList;
172 extern int VecRegisterAllCalled;
173 extern int VecSetType(Vec, VecType);
174 extern int VecGetType(Vec, VecType *);
175 extern int VecRegister(const char[],const char[],const char[],int(*)(Vec));
176 extern int VecRegisterAll(const char []);
177 extern int VecRegisterDestroy(void);
178 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
179 #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,0)
180 #else
181 #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,d)
182 #endif
183 
184 extern PetscFList VecSerializeList;
185 extern int VecSerializeRegisterAllCalled;
186 extern int VecSetSerializeType(Vec, VecSerializeType);
187 extern int VecGetSerializeType(Vec, VecSerializeType *);
188 extern int VecSerializeRegister(const char [], const char [], const char [], int (*)(MPI_Comm, Vec *, PetscViewer, PetscTruth));
189 extern int VecSerializeRegisterAll(const char []);
190 extern int VecSerializeRegisterDestroy(void);
191 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
192 #define VecSerializeRegisterDynamic(a,b,c,d) VecSerializeRegister(a,b,c,0)
193 #else
194 #define VecSerializeRegisterDynamic(a,b,c,d) VecSerializeRegister(a,b,c,d)
195 #endif
196 
197 EXTERN int VecScatterCreate(Vec,IS,Vec,IS,VecScatter *);
198 EXTERN int VecScatterPostRecvs(Vec,Vec,InsertMode,ScatterMode,VecScatter);
199 EXTERN int VecScatterBegin(Vec,Vec,InsertMode,ScatterMode,VecScatter);
200 EXTERN int VecScatterEnd(Vec,Vec,InsertMode,ScatterMode,VecScatter);
201 EXTERN int VecScatterDestroy(VecScatter);
202 EXTERN int VecScatterCopy(VecScatter,VecScatter *);
203 EXTERN int VecScatterView(VecScatter,PetscViewer);
204 EXTERN int VecScatterRemap(VecScatter,int *,int*);
205 
206 typedef enum {PIPELINE_DOWN=0,PIPELINE_UP=1} PipelineDirection;
207 typedef enum {PIPELINE_NONE=1,PIPELINE_SEQUENTIAL=2,
208 	      PIPELINE_REDBLACK=3,PIPELINE_MULTICOLOR=4} PipelineType;
209 
210 typedef struct _p_VecPipeline*  VecPipeline;
211 
212 EXTERN int VecPipelineCreate(MPI_Comm,Vec,IS,Vec,IS,VecPipeline *);
213 EXTERN int VecPipelineSetType(VecPipeline,PipelineType,PetscObject);
214 EXTERN int VecPipelineSetup(VecPipeline);
215 EXTERN int VecPipelineBegin(Vec,Vec,InsertMode,ScatterMode,PipelineDirection,VecPipeline);
216 EXTERN int VecPipelineEnd(Vec,Vec,InsertMode,ScatterMode,PipelineDirection,VecPipeline);
217 EXTERN int VecPipelineView(VecPipeline,PetscViewer);
218 EXTERN int VecPipelineDestroy(VecPipeline);
219 
220 EXTERN int VecGetArray(Vec,PetscScalar*[]);
221 EXTERN int VecRestoreArray(Vec,PetscScalar*[]);
222 EXTERN int VecGetArray4d(Vec,int,int,int,int,int,int,int,int,PetscScalar****[]);
223 EXTERN int VecRestoreArray4d(Vec,int,int,int,int,int,int,int,int,PetscScalar****[]);
224 EXTERN int VecGetArray3d(Vec,int,int,int,int,int,int,PetscScalar***[]);
225 EXTERN int VecRestoreArray3d(Vec,int,int,int,int,int,int,PetscScalar***[]);
226 EXTERN int VecGetArray2d(Vec,int,int,int,int,PetscScalar**[]);
227 EXTERN int VecRestoreArray2d(Vec,int,int,int,int,PetscScalar**[]);
228 EXTERN int VecGetArray1d(Vec,int,int,PetscScalar *[]);
229 EXTERN int VecRestoreArray1d(Vec,int,int,PetscScalar *[]);
230 
231 EXTERN int VecPlaceArray(Vec,const PetscScalar[]);
232 EXTERN int VecResetArray(Vec);
233 EXTERN int VecReplaceArray(Vec,const PetscScalar[]);
234 EXTERN int VecGetArrays(const Vec[],int,PetscScalar**[]);
235 EXTERN int VecRestoreArrays(const Vec[],int,PetscScalar**[]);
236 
237 EXTERN int VecValid(Vec,PetscTruth*);
238 EXTERN int VecView(Vec,PetscViewer);
239 EXTERN int VecEqual(Vec,Vec,PetscTruth*);
240 EXTERN int VecLoad(PetscViewer,Vec*);
241 EXTERN int VecLoadIntoVector(PetscViewer,Vec);
242 
243 EXTERN int VecGetSize(Vec,int*);
244 EXTERN int VecGetLocalSize(Vec,int*);
245 EXTERN int VecGetType(Vec,VecType*);
246 EXTERN int VecGetOwnershipRange(Vec,int*,int*);
247 
248 EXTERN int VecSetLocalToGlobalMapping(Vec,ISLocalToGlobalMapping);
249 EXTERN int VecSetValuesLocal(Vec,int,const int[],const PetscScalar[],InsertMode);
250 EXTERN int VecSetLocalToGlobalMappingBlock(Vec,ISLocalToGlobalMapping);
251 EXTERN int VecSetValuesBlockedLocal(Vec,int,const int[],const PetscScalar[],InsertMode);
252 
253 EXTERN int VecDotBegin(Vec,Vec,PetscScalar *);
254 EXTERN int VecDotEnd(Vec,Vec,PetscScalar *);
255 EXTERN int VecTDotBegin(Vec,Vec,PetscScalar *);
256 EXTERN int VecTDotEnd(Vec,Vec,PetscScalar *);
257 EXTERN int VecNormBegin(Vec,NormType,PetscReal *);
258 EXTERN int VecNormEnd(Vec,NormType,PetscReal *);
259 
260 typedef enum {VEC_IGNORE_OFF_PROC_ENTRIES,VEC_TREAT_OFF_PROC_ENTRIES} VecOption;
261 EXTERN int VecSetOption(Vec,VecOption);
262 
263 EXTERN int VecContourScale(Vec,PetscReal,PetscReal);
264 
265 /*
266     These numbers need to match the entries in
267   the function table in src/vec/vecimpl.h
268 */
269 typedef enum { VECOP_VIEW = 32,
270                VECOP_LOADINTOVECTOR = 38
271              } VecOperation;
272 EXTERN int VecSetOperation(Vec,VecOperation,void(*)(void));
273 
274 /*
275      Routines for dealing with ghosted vectors:
276   vectors with ghost elements at the end of the array.
277 */
278 EXTERN int VecCreateGhost(MPI_Comm,int,int,int,const int[],Vec*);
279 EXTERN int VecCreateGhostWithArray(MPI_Comm,int,int,int,const int[],const PetscScalar[],Vec*);
280 EXTERN int VecCreateGhostBlock(MPI_Comm,int,int,int,int,const int[],Vec*);
281 EXTERN int VecCreateGhostBlockWithArray(MPI_Comm,int,int,int,int,const int[],const PetscScalar[],Vec*);
282 EXTERN int VecGhostGetLocalForm(Vec,Vec*);
283 EXTERN int VecGhostRestoreLocalForm(Vec,Vec*);
284 EXTERN int VecGhostUpdateBegin(Vec,InsertMode,ScatterMode);
285 EXTERN int VecGhostUpdateEnd(Vec,InsertMode,ScatterMode);
286 
287 EXTERN int VecConjugate(Vec);
288 
289 EXTERN int VecConvertMPIToSeqAll(Vec vin,Vec *vout);
290 EXTERN int VecConvertMPIToMPIZero(Vec vin,Vec *vout);
291 
292 
293 EXTERN int VecESISetType(Vec,char*);
294 EXTERN int VecESISetFromOptions(Vec);
295 
296 #endif
297 
298 
299 
300 
301 
302 
303 
304 
305 
306