xref: /petsc/include/petscvec.h (revision c3d102fe2dfc19c1832704c537829f04ceb136a2)
1 /*
2     Defines the vector component of PETSc. Vectors generally represent
3   degrees of freedom for finite element/finite difference functions
4   on a grid. They have more mathematical structure then simple arrays.
5 */
6 
7 #ifndef __PETSCVEC_H
8 #define __PETSCVEC_H
9 #include "petscis.h"
10 #include "petscsys.h"
11 PETSC_EXTERN_CXX_BEGIN
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 #define MAP_SEQ "seq"
29 #define MAP_MPI "mpi"
30 #define PetscMapType char*
31 
32 /* Logging support */
33 extern PetscCookie MAP_COOKIE;
34 
35 EXTERN PetscErrorCode PetscMapCreate(MPI_Comm,PetscMap*);
36 EXTERN PetscErrorCode PetscMapCreateMPI(MPI_Comm,PetscInt,PetscInt,PetscMap*);
37 EXTERN PetscErrorCode PetscMapSetFromOptions(PetscMap);
38 EXTERN PetscErrorCode PetscMapPrintHelp(PetscMap);
39 EXTERN PetscErrorCode PetscMapDestroy(PetscMap);
40 
41 EXTERN PetscErrorCode PetscMapSetLocalSize(PetscMap,PetscInt);
42 EXTERN PetscErrorCode PetscMapGetLocalSize(PetscMap,PetscInt *);
43 EXTERN PetscErrorCode PetscMapSetSize(PetscMap,PetscInt);
44 EXTERN PetscErrorCode PetscMapGetSize(PetscMap,PetscInt *);
45 EXTERN PetscErrorCode PetscMapGetLocalRange(PetscMap,PetscInt *,PetscInt *);
46 EXTERN PetscErrorCode PetscMapGetGlobalRange(PetscMap,PetscInt *[]);
47 
48 /* Dynamic creation and loading functions */
49 extern PetscFList PetscMapList;
50 extern PetscTruth PetscMapRegisterAllCalled;
51 EXTERN PetscErrorCode PetscMapSetType(PetscMap, const PetscMapType);
52 EXTERN PetscErrorCode PetscMapGetType(PetscMap, PetscMapType *);
53 EXTERN PetscErrorCode PetscMapRegister(const char[],const char[],const char[],PetscErrorCode (*)(PetscMap));
54 EXTERN PetscErrorCode PetscMapRegisterAll(const char []);
55 EXTERN PetscErrorCode PetscMapRegisterDestroy(void);
56 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
57 #define PetscMapRegisterDynamic(a,b,c,d) PetscMapRegister(a,b,c,0)
58 #else
59 #define PetscMapRegisterDynamic(a,b,c,d) PetscMapRegister(a,b,c,d)
60 #endif
61 
62 /*S
63      Vec - Abstract PETSc vector object
64 
65    Level: beginner
66 
67   Concepts: field variables, unknowns, arrays
68 
69 .seealso:  VecCreate(), VecType, VecSetType()
70 S*/
71 typedef struct _p_Vec*         Vec;
72 
73 /*S
74      VecScatter - Object used to manage communication of data
75        between vectors in parallel. Manages both scatters and gathers
76 
77    Level: beginner
78 
79   Concepts: scatter
80 
81 .seealso:  VecScatterCreate(), VecScatterBegin(), VecScatterEnd()
82 S*/
83 typedef struct _p_VecScatter*  VecScatter;
84 
85 /*E
86     VecType - String with the name of a PETSc vector or the creation function
87        with an optional dynamic library name, for example
88        http://www.mcs.anl.gov/petsc/lib.a:myveccreate()
89 
90    Level: beginner
91 
92 .seealso: VecSetType(), Vec
93 E*/
94 #define VECSEQ         "seq"
95 #define VECMPI         "mpi"
96 #define VECFETI        "feti"
97 #define VECSHARED      "shared"
98 #define VecType char*
99 
100 /* Logging support */
101 #define    VEC_FILE_COOKIE 1211214
102 extern PetscCookie VEC_COOKIE, VEC_SCATTER_COOKIE;
103 extern PetscEvent    VEC_View, VEC_Max, VEC_Min, VEC_DotBarrier, VEC_Dot, VEC_MDotBarrier, VEC_MDot, VEC_TDot, VEC_MTDot;
104 extern PetscEvent    VEC_Norm, VEC_Normalize, VEC_Scale, VEC_Copy, VEC_Set, VEC_AXPY, VEC_AYPX, VEC_WAXPY, VEC_MAXPY;
105 extern PetscEvent    VEC_AssemblyEnd, VEC_PointwiseMult, VEC_SetValues, VEC_Load, VEC_ScatterBarrier, VEC_ScatterBegin, VEC_ScatterEnd;
106 extern PetscEvent    VEC_SetRandom, VEC_ReduceArithmetic, VEC_ReduceBarrier, VEC_ReduceCommunication;
107 extern PetscEvent    VEC_Swap, VEC_AssemblyBegin, VEC_NormBarrier;
108 
109 EXTERN PetscErrorCode VecInitializePackage(char *);
110 
111 EXTERN PetscErrorCode VecCreate(MPI_Comm,Vec *);
112 PetscPolymorphicSubroutine(VecCreate,(Vec *x),(PETSC_COMM_SELF,x))
113 EXTERN PetscErrorCode VecCreateSeq(MPI_Comm,PetscInt,Vec*);
114 PetscPolymorphicSubroutine(VecCreateSeq,(PetscInt n,Vec *x),(PETSC_COMM_SELF,n,x))
115 EXTERN PetscErrorCode VecCreateMPI(MPI_Comm,PetscInt,PetscInt,Vec*);
116 PetscPolymorphicSubroutine(VecCreateMPI,(PetscInt n,PetscInt N,Vec *x),(PETSC_COMM_WORLD,n,N,x))
117 EXTERN PetscErrorCode VecCreateSeqWithArray(MPI_Comm,PetscInt,const PetscScalar[],Vec*);
118 PetscPolymorphicSubroutine(VecCreateSeqWithArray,(PetscInt n,PetscScalar s[],Vec *x),(PETSC_COMM_SELF,n,s,x))
119 EXTERN PetscErrorCode VecCreateMPIWithArray(MPI_Comm,PetscInt,PetscInt,const PetscScalar[],Vec*);
120 PetscPolymorphicSubroutine(VecCreateMPIWithArray,(PetscInt n,PetscInt N,PetscScalar s[],Vec *x),(PETSC_COMM_WORLD,n,N,s,x))
121 EXTERN PetscErrorCode VecCreateShared(MPI_Comm,PetscInt,PetscInt,Vec*);
122 EXTERN PetscErrorCode VecSetFromOptions(Vec);
123 EXTERN PetscErrorCode VecPrintHelp(Vec);
124 EXTERN PetscErrorCode VecDestroy(Vec);
125 
126 EXTERN PetscErrorCode VecSetSizes(Vec,PetscInt,PetscInt);
127 
128 EXTERN PetscErrorCode VecDot(Vec,Vec,PetscScalar*);
129 EXTERN PetscErrorCode VecTDot(Vec,Vec,PetscScalar*);
130 EXTERN PetscErrorCode VecMDot(PetscInt,Vec,const Vec[],PetscScalar*);
131 EXTERN PetscErrorCode VecMTDot(PetscInt,Vec,const Vec[],PetscScalar*);
132 
133 /*E
134     NormType - determines what type of norm to compute
135 
136     Level: beginner
137 
138 .seealso: VecNorm(), VecNormBegin(), VecNormEnd(), MatNorm()
139 E*/
140 typedef enum {NORM_1=1,NORM_2=2,NORM_FROBENIUS=3,NORM_INFINITY=4,NORM_1_AND_2=5} NormType;
141 #define NORM_MAX NORM_INFINITY
142 
143 /*MC
144      NORM_1 - the one norm, ||v|| = sum_i | v_i |. ||A|| = max_j || v_*j ||, maximum column sum
145 
146    Level: beginner
147 
148 .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_2, NORM_FROBENIUS,
149            NORM_INFINITY, NORM_1_AND_2
150 
151 M*/
152 
153 /*MC
154      NORM_2 - the two norm, ||v|| = sqrt(sum_i (v_i)^2) (vectors only)
155 
156    Level: beginner
157 
158 .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_FROBENIUS,
159            NORM_INFINITY, NORM_1_AND_2
160 
161 M*/
162 
163 /*MC
164      NORM_FROBENIUS - ||A|| = sqrt(sum_ij (A_ij)^2), same as NORM_2 for vectors
165 
166    Level: beginner
167 
168 .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
169            NORM_INFINITY, NORM_1_AND_2
170 
171 M*/
172 
173 /*MC
174      NORM_INFINITY - ||v|| = max_i |v_i|. ||A|| = max_i || v_i* ||, maximum row sum
175 
176    Level: beginner
177 
178 .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
179            NORM_FROBINIUS, NORM_1_AND_2
180 
181 M*/
182 
183 /*MC
184      NORM_1_AND_2 - computes both the 1 and 2 norm of a vector
185 
186    Level: beginner
187 
188 .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
189            NORM_FROBINIUS, NORM_INFINITY
190 
191 M*/
192 
193 /*MC
194      NORM_MAX - see NORM_INFINITY
195 
196    Level: beginner
197 
198 M*/
199 
200 EXTERN PetscErrorCode VecNorm(Vec,NormType,PetscReal *);
201 PetscPolymorphicSubroutine(VecNorm,(Vec x,PetscReal *r),(x,NORM_2,r))
202 EXTERN PetscErrorCode VecNormComposedDataID(NormType,PetscInt*);
203 EXTERN PetscErrorCode VecNormalize(Vec,PetscReal *);
204 EXTERN PetscErrorCode VecSum(Vec,PetscScalar*);
205 EXTERN PetscErrorCode VecMax(Vec,PetscInt*,PetscReal *);
206 PetscPolymorphicSubroutine(VecMax,(Vec x,PetscReal *r),(x,PETSC_NULL,r))
207 EXTERN PetscErrorCode VecMin(Vec,PetscInt*,PetscReal *);
208 PetscPolymorphicSubroutine(VecMin,(Vec x,PetscReal *r),(x,PETSC_NULL,r))
209 EXTERN PetscErrorCode VecScale(const PetscScalar *a,Vec v);
210 EXTERN PetscErrorCode VecCopy(Vec,Vec);
211 EXTERN PetscErrorCode VecSetRandom(PetscRandom,Vec);
212 EXTERN PetscErrorCode VecSet(const PetscScalar*,Vec);
213 EXTERN PetscErrorCode VecSwap(Vec,Vec);
214 EXTERN PetscErrorCode VecAXPY(const PetscScalar*,Vec,Vec);
215 EXTERN PetscErrorCode VecAXPBY(const PetscScalar*,const PetscScalar *,Vec,Vec);
216 EXTERN PetscErrorCode VecMAXPY(PetscInt,const PetscScalar*,Vec,Vec*);
217 EXTERN PetscErrorCode VecAYPX(const PetscScalar*,Vec,Vec);
218 EXTERN PetscErrorCode VecWAXPY(const PetscScalar*,Vec,Vec,Vec);
219 EXTERN PetscErrorCode VecPointwiseMax(Vec,Vec,Vec);
220 EXTERN PetscErrorCode VecPointwiseMaxAbs(Vec,Vec,Vec);
221 EXTERN PetscErrorCode VecPointwiseMin(Vec,Vec,Vec);
222 EXTERN PetscErrorCode VecPointwiseMult(Vec,Vec,Vec);
223 EXTERN PetscErrorCode VecPointwiseDivide(Vec,Vec,Vec);
224 EXTERN PetscErrorCode VecMaxPointwiseDivide(Vec,Vec,PetscReal*);
225 EXTERN PetscErrorCode VecShift(const PetscScalar*,Vec);
226 EXTERN PetscErrorCode VecReciprocal(Vec);
227 EXTERN PetscErrorCode VecPermute(Vec, IS, PetscTruth);
228 EXTERN PetscErrorCode VecSqrt(Vec);
229 EXTERN PetscErrorCode VecAbs(Vec);
230 EXTERN PetscErrorCode VecDuplicate(Vec,Vec*);
231 EXTERN PetscErrorCode VecDuplicateVecs(Vec,PetscInt,Vec*[]);
232 EXTERN PetscErrorCode VecDestroyVecs(Vec[],PetscInt);
233 EXTERN PetscErrorCode VecGetPetscMap(Vec,PetscMap*);
234 
235 EXTERN PetscErrorCode VecStrideNormAll(Vec,NormType,PetscReal*);
236 EXTERN PetscErrorCode VecStrideMaxAll(Vec,PetscInt *,PetscReal *);
237 EXTERN PetscErrorCode VecStrideMinAll(Vec,PetscInt *,PetscReal *);
238 EXTERN PetscErrorCode VecStrideScaleAll(Vec,PetscScalar*);
239 
240 EXTERN PetscErrorCode VecStrideNorm(Vec,PetscInt,NormType,PetscReal*);
241 EXTERN PetscErrorCode VecStrideMax(Vec,PetscInt,PetscInt *,PetscReal *);
242 EXTERN PetscErrorCode VecStrideMin(Vec,PetscInt,PetscInt *,PetscReal *);
243 EXTERN PetscErrorCode VecStrideScale(Vec,PetscInt,PetscScalar*);
244 EXTERN PetscErrorCode VecStrideGather(Vec,PetscInt,Vec,InsertMode);
245 EXTERN PetscErrorCode VecStrideScatter(Vec,PetscInt,Vec,InsertMode);
246 EXTERN PetscErrorCode VecStrideGatherAll(Vec,Vec*,InsertMode);
247 EXTERN PetscErrorCode VecStrideScatterAll(Vec*,Vec,InsertMode);
248 
249 EXTERN PetscErrorCode VecSetValues(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
250 EXTERN PetscErrorCode VecGetValues(Vec,PetscInt,const PetscInt[],PetscScalar[]);
251 EXTERN PetscErrorCode VecAssemblyBegin(Vec);
252 EXTERN PetscErrorCode VecAssemblyEnd(Vec);
253 EXTERN PetscErrorCode VecStashSetInitialSize(Vec,PetscInt,PetscInt);
254 EXTERN PetscErrorCode VecStashView(Vec,PetscViewer);
255 EXTERN PetscErrorCode VecStashGetInfo(Vec,PetscInt*,PetscInt*,PetscInt*,PetscInt*);
256 
257 extern PetscInt         VecSetValue_Row;
258 extern PetscScalar VecSetValue_Value;
259 /*MC
260    VecSetValue - Set a single entry into a vector.
261 
262    Synopsis:
263    PetscErrorCode VecSetValue(Vec v,int row,PetscScalar value, InsertMode mode);
264 
265    Not Collective
266 
267    Input Parameters:
268 +  v - the vector
269 .  row - the row location of the entry
270 .  value - the value to insert
271 -  mode - either INSERT_VALUES or ADD_VALUES
272 
273    Notes:
274    For efficiency one should use VecSetValues() and set several or
275    many values simultaneously if possible.
276 
277    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
278    MUST be called after all calls to VecSetValues() have been completed.
279 
280    VecSetValues() uses 0-based indices in Fortran as well as in C.
281 
282    Level: beginner
283 
284 .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValueLocal()
285 M*/
286 #define VecSetValue(v,i,va,mode) ((VecSetValue_Row = i,VecSetValue_Value = va,0) || VecSetValues(v,1,&VecSetValue_Row,&VecSetValue_Value,mode))
287 
288 /*MC
289    VecSetValueLocal - Set a single entry into a vector using the local numbering
290 
291    Synopsis:
292    PetscErrorCode VecSetValueLocal(Vec v,int row,PetscScalar value, InsertMode mode);
293 
294    Not Collective
295 
296    Input Parameters:
297 +  v - the vector
298 .  row - the row location of the entry
299 .  value - the value to insert
300 -  mode - either INSERT_VALUES or ADD_VALUES
301 
302    Notes:
303    For efficiency one should use VecSetValues() and set several or
304    many values simultaneously if possible.
305 
306    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
307    MUST be called after all calls to VecSetValues() have been completed.
308 
309    VecSetValues() uses 0-based indices in Fortran as well as in C.
310 
311    Level: beginner
312 
313 .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValue()
314 M*/
315 #define VecSetValueLocal(v,i,va,mode) ((VecSetValue_Row = i,VecSetValue_Value = va,0) || VecSetValuesLocal(v,1,&VecSetValue_Row,&VecSetValue_Value,mode))
316 
317 EXTERN PetscErrorCode VecSetBlockSize(Vec,PetscInt);
318 EXTERN PetscErrorCode VecGetBlockSize(Vec,PetscInt*);
319 EXTERN PetscErrorCode VecSetValuesBlocked(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
320 
321 /* Dynamic creation and loading functions */
322 extern PetscFList VecList;
323 extern PetscTruth VecRegisterAllCalled;
324 EXTERN PetscErrorCode VecSetType(Vec, const VecType);
325 EXTERN PetscErrorCode VecGetType(Vec, VecType *);
326 EXTERN PetscErrorCode VecRegister(const char[],const char[],const char[],PetscErrorCode (*)(Vec));
327 EXTERN PetscErrorCode VecRegisterAll(const char []);
328 EXTERN PetscErrorCode VecRegisterDestroy(void);
329 
330 /*MC
331   VecRegisterDynamic - Adds a new vector component implementation
332 
333   Synopsis:
334   PetscErrorCode VecRegisterDynamic(char *name, char *path, char *func_name, PetscErrorCode (*create_func)(Vec))
335 
336   Not Collective
337 
338   Input Parameters:
339 + name        - The name of a new user-defined creation routine
340 . path        - The path (either absolute or relative) of the library containing this routine
341 . func_name   - The name of routine to create method context
342 - create_func - The creation routine itself
343 
344   Notes:
345   VecRegisterDynamic() may be called multiple times to add several user-defined vectors
346 
347   If dynamic libraries are used, then the fourth input argument (routine_create) is ignored.
348 
349   Sample usage:
350 .vb
351     VecRegisterDynamic("my_vec","/home/username/my_lib/lib/libO/solaris/libmy.a", "MyVectorCreate", MyVectorCreate);
352 .ve
353 
354   Then, your vector type can be chosen with the procedural interface via
355 .vb
356     VecCreate(MPI_Comm, Vec *);
357     VecSetType(Vec,"my_vector_name");
358 .ve
359    or at runtime via the option
360 .vb
361     -vec_type my_vector_name
362 .ve
363 
364   Notes: $PETSC_ARCH occuring in pathname will be replaced with appropriate values.
365          If your function is not being put into a shared library then use VecRegister() instead
366 
367   Level: advanced
368 
369 .keywords: Vec, register
370 .seealso: VecRegisterAll(), VecRegisterDestroy(), VecRegister()
371 M*/
372 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
373 #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,0)
374 #else
375 #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,d)
376 #endif
377 
378 
379 EXTERN PetscErrorCode VecScatterCreate(Vec,IS,Vec,IS,VecScatter *);
380 EXTERN PetscErrorCode VecScatterPostRecvs(Vec,Vec,InsertMode,ScatterMode,VecScatter);
381 EXTERN PetscErrorCode VecScatterBegin(Vec,Vec,InsertMode,ScatterMode,VecScatter);
382 EXTERN PetscErrorCode VecScatterEnd(Vec,Vec,InsertMode,ScatterMode,VecScatter);
383 EXTERN PetscErrorCode VecScatterDestroy(VecScatter);
384 EXTERN PetscErrorCode VecScatterCopy(VecScatter,VecScatter *);
385 EXTERN PetscErrorCode VecScatterView(VecScatter,PetscViewer);
386 EXTERN PetscErrorCode VecScatterRemap(VecScatter,PetscInt *,PetscInt*);
387 EXTERN PetscErrorCode VecScatterGetMerged(VecScatter,PetscTruth*);
388 
389 EXTERN PetscErrorCode VecGetArray_Private(Vec,PetscScalar*[]);
390 EXTERN PetscErrorCode VecRestoreArray_Private(Vec,PetscScalar*[]);
391 EXTERN PetscErrorCode VecGetArray4d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]);
392 EXTERN PetscErrorCode VecRestoreArray4d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]);
393 EXTERN PetscErrorCode VecGetArray3d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]);
394 EXTERN PetscErrorCode VecRestoreArray3d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]);
395 EXTERN PetscErrorCode VecGetArray2d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]);
396 EXTERN PetscErrorCode VecRestoreArray2d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]);
397 EXTERN PetscErrorCode VecGetArray1d(Vec,PetscInt,PetscInt,PetscScalar *[]);
398 EXTERN PetscErrorCode VecRestoreArray1d(Vec,PetscInt,PetscInt,PetscScalar *[]);
399 
400 EXTERN PetscErrorCode VecPlaceArray(Vec,const PetscScalar[]);
401 EXTERN PetscErrorCode VecResetArray(Vec);
402 EXTERN PetscErrorCode VecReplaceArray(Vec,const PetscScalar[]);
403 EXTERN PetscErrorCode VecGetArrays(const Vec[],PetscInt,PetscScalar**[]);
404 EXTERN PetscErrorCode VecRestoreArrays(const Vec[],PetscInt,PetscScalar**[]);
405 
406 EXTERN PetscErrorCode VecValid(Vec,PetscTruth*);
407 EXTERN PetscErrorCode VecView(Vec,PetscViewer);
408 EXTERN PetscErrorCode VecViewFromOptions(Vec, char *);
409 EXTERN PetscErrorCode VecEqual(Vec,Vec,PetscTruth*);
410 EXTERN PetscErrorCode VecLoad(PetscViewer,const VecType,Vec*);
411 EXTERN PetscErrorCode VecLoadIntoVector(PetscViewer,Vec);
412 
413 EXTERN PetscErrorCode VecGetSize(Vec,PetscInt*);
414 EXTERN PetscErrorCode VecGetLocalSize(Vec,PetscInt*);
415 EXTERN PetscErrorCode VecGetOwnershipRange(Vec,PetscInt*,PetscInt*);
416 
417 EXTERN PetscErrorCode VecSetLocalToGlobalMapping(Vec,ISLocalToGlobalMapping);
418 EXTERN PetscErrorCode VecSetValuesLocal(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
419 EXTERN PetscErrorCode VecSetLocalToGlobalMappingBlock(Vec,ISLocalToGlobalMapping);
420 EXTERN PetscErrorCode VecSetValuesBlockedLocal(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
421 
422 EXTERN PetscErrorCode VecDotBegin(Vec,Vec,PetscScalar *);
423 EXTERN PetscErrorCode VecDotEnd(Vec,Vec,PetscScalar *);
424 EXTERN PetscErrorCode VecTDotBegin(Vec,Vec,PetscScalar *);
425 EXTERN PetscErrorCode VecTDotEnd(Vec,Vec,PetscScalar *);
426 EXTERN PetscErrorCode VecNormBegin(Vec,NormType,PetscReal *);
427 EXTERN PetscErrorCode VecNormEnd(Vec,NormType,PetscReal *);
428 
429 typedef enum {VEC_IGNORE_OFF_PROC_ENTRIES,VEC_TREAT_OFF_PROC_ENTRIES} VecOption;
430 EXTERN PetscErrorCode VecSetOption(Vec,VecOption);
431 
432 /*
433    Expose VecGetArray()/VecRestoreArray() to users. Allows this to work without any function
434    call overhead on any 'native' Vecs.
435 */
436 #include "vecimpl.h"
437 
438 EXTERN PetscErrorCode VecContourScale(Vec,PetscReal,PetscReal);
439 
440 /*
441     These numbers need to match the entries in
442   the function table in vecimpl.h
443 */
444 typedef enum { VECOP_VIEW = 32,
445                VECOP_LOADINTOVECTOR = 38
446              } VecOperation;
447 EXTERN PetscErrorCode VecSetOperation(Vec,VecOperation,void(*)(void));
448 
449 /*
450      Routines for dealing with ghosted vectors:
451   vectors with ghost elements at the end of the array.
452 */
453 EXTERN PetscErrorCode VecCreateGhost(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*);
454 EXTERN PetscErrorCode VecCreateGhostWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*);
455 EXTERN PetscErrorCode VecCreateGhostBlock(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*);
456 EXTERN PetscErrorCode VecCreateGhostBlockWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*);
457 EXTERN PetscErrorCode VecGhostGetLocalForm(Vec,Vec*);
458 EXTERN PetscErrorCode VecGhostRestoreLocalForm(Vec,Vec*);
459 EXTERN PetscErrorCode VecGhostUpdateBegin(Vec,InsertMode,ScatterMode);
460 EXTERN PetscErrorCode VecGhostUpdateEnd(Vec,InsertMode,ScatterMode);
461 
462 EXTERN PetscErrorCode VecConjugate(Vec);
463 
464 EXTERN PetscErrorCode VecScatterCreateToAll(Vec,VecScatter*,Vec*);
465 EXTERN PetscErrorCode VecScatterCreateToZero(Vec,VecScatter*,Vec*);
466 
467 EXTERN PetscErrorCode PetscViewerMathematicaGetVector(PetscViewer, Vec);
468 EXTERN PetscErrorCode PetscViewerMathematicaPutVector(PetscViewer, Vec);
469 
470 /*S
471      Vecs - Collection of vectors where the data for the vectors is stored in
472             one continquous memory
473 
474    Level: advanced
475 
476    Notes:
477     Temporary construct for handling multiply right hand side solves
478 
479     This is faked by storing a single vector that has enough array space for
480     n vectors
481 
482   Concepts: parallel decomposition
483 
484 S*/
485         struct _p_Vecs  {PetscInt n; Vec v;};
486 typedef struct _p_Vecs* Vecs;
487 #define VecsDestroy(x)            (VecDestroy((x)->v)         || PetscFree(x))
488 #define VecsCreateSeq(comm,p,m,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeq(comm,p*m,&(*(x))->v) || (-1 == ((*(x))->n = (m))))
489 #define VecsCreateSeqWithArray(comm,p,m,a,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeqWithArray(comm,p*m,a,&(*(x))->v) || (-1 == ((*(x))->n = (m))))
490 #define VecsDuplicate(x,y)        (PetscNew(struct _p_Vecs,y) || VecDuplicate(x->v,&(*(y))->v) || (-1 == ((*(y))->n = (x)->n)))
491 
492 
493 PETSC_EXTERN_CXX_END
494 #endif
495