xref: /petsc/include/petscvec.h (revision ab90151441bebc4d0600d71c4d1b89a49c47f278)
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 EXTERN PetscErrorCode VecCreateSeq(MPI_Comm,PetscInt,Vec*);
113 EXTERN PetscErrorCode VecCreateMPI(MPI_Comm,PetscInt,PetscInt,Vec*);
114 EXTERN PetscErrorCode VecCreateSeqWithArray(MPI_Comm,PetscInt,const PetscScalar[],Vec*);
115 EXTERN PetscErrorCode VecCreateMPIWithArray(MPI_Comm,PetscInt,PetscInt,const PetscScalar[],Vec*);
116 EXTERN PetscErrorCode VecCreateShared(MPI_Comm,PetscInt,PetscInt,Vec*);
117 EXTERN PetscErrorCode VecSetFromOptions(Vec);
118 EXTERN PetscErrorCode VecPrintHelp(Vec);
119 EXTERN PetscErrorCode VecDestroy(Vec);
120 
121 EXTERN PetscErrorCode VecSetSizes(Vec,PetscInt,PetscInt);
122 
123 EXTERN PetscErrorCode VecDot(Vec,Vec,PetscScalar*);
124 EXTERN PetscErrorCode VecTDot(Vec,Vec,PetscScalar*);
125 EXTERN PetscErrorCode VecMDot(PetscInt,Vec,const Vec[],PetscScalar*);
126 EXTERN PetscErrorCode VecMTDot(PetscInt,Vec,const Vec[],PetscScalar*);
127 
128 /*E
129     NormType - determines what type of norm to compute
130 
131     Level: beginner
132 
133 .seealso: VecNorm(), VecNormBegin(), VecNormEnd(), MatNorm()
134 E*/
135 typedef enum {NORM_1=1,NORM_2=2,NORM_FROBENIUS=3,NORM_INFINITY=4,NORM_1_AND_2=5} NormType;
136 #define NORM_MAX NORM_INFINITY
137 
138 /*MC
139      NORM_1 - the one norm, ||v|| = sum_i | v_i |. ||A|| = max_j || v_*j ||, maximum column sum
140 
141    Level: beginner
142 
143 .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_2, NORM_FROBENIUS,
144            NORM_INFINITY, NORM_1_AND_2
145 
146 M*/
147 
148 /*MC
149      NORM_2 - the two norm, ||v|| = sqrt(sum_i (v_i)^2) (vectors only)
150 
151    Level: beginner
152 
153 .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_FROBENIUS,
154            NORM_INFINITY, NORM_1_AND_2
155 
156 M*/
157 
158 /*MC
159      NORM_FROBENIUS - ||A|| = sqrt(sum_ij (A_ij)^2), same as NORM_2 for vectors
160 
161    Level: beginner
162 
163 .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
164            NORM_INFINITY, NORM_1_AND_2
165 
166 M*/
167 
168 /*MC
169      NORM_INFINITY - ||v|| = max_i |v_i|. ||A|| = max_i || v_i* ||, maximum row sum
170 
171    Level: beginner
172 
173 .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
174            NORM_FROBINIUS, NORM_1_AND_2
175 
176 M*/
177 
178 /*MC
179      NORM_1_AND_2 - computes both the 1 and 2 norm of a vector
180 
181    Level: beginner
182 
183 .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
184            NORM_FROBINIUS, NORM_INFINITY
185 
186 M*/
187 
188 /*MC
189      NORM_MAX - see NORM_INFINITY
190 
191    Level: beginner
192 
193 M*/
194 
195 EXTERN PetscErrorCode VecNorm(Vec,NormType,PetscReal *);
196 EXTERN PetscErrorCode VecNormComposedDataID(NormType,PetscInt*);
197 EXTERN PetscErrorCode VecNormalize(Vec,PetscReal *);
198 EXTERN PetscErrorCode VecSum(Vec,PetscScalar*);
199 EXTERN PetscErrorCode VecMax(Vec,PetscInt*,PetscReal *);
200 EXTERN PetscErrorCode VecMin(Vec,PetscInt*,PetscReal *);
201 EXTERN PetscErrorCode VecScale(const PetscScalar *a,Vec v);
202 EXTERN PetscErrorCode VecCopy(Vec,Vec);
203 EXTERN PetscErrorCode VecSetRandom(PetscRandom,Vec);
204 EXTERN PetscErrorCode VecSet(const PetscScalar*,Vec);
205 EXTERN PetscErrorCode VecSwap(Vec,Vec);
206 EXTERN PetscErrorCode VecAXPY(const PetscScalar*,Vec,Vec);
207 EXTERN PetscErrorCode VecAXPBY(const PetscScalar*,const PetscScalar *,Vec,Vec);
208 EXTERN PetscErrorCode VecMAXPY(PetscInt,const PetscScalar*,Vec,Vec*);
209 EXTERN PetscErrorCode VecAYPX(const PetscScalar*,Vec,Vec);
210 EXTERN PetscErrorCode VecWAXPY(const PetscScalar*,Vec,Vec,Vec);
211 EXTERN PetscErrorCode VecPointwiseMax(Vec,Vec,Vec);
212 EXTERN PetscErrorCode VecPointwiseMaxAbs(Vec,Vec,Vec);
213 EXTERN PetscErrorCode VecPointwiseMin(Vec,Vec,Vec);
214 EXTERN PetscErrorCode VecPointwiseMult(Vec,Vec,Vec);
215 EXTERN PetscErrorCode VecPointwiseDivide(Vec,Vec,Vec);
216 EXTERN PetscErrorCode VecMaxPointwiseDivide(Vec,Vec,PetscReal*);
217 EXTERN PetscErrorCode VecShift(const PetscScalar*,Vec);
218 EXTERN PetscErrorCode VecReciprocal(Vec);
219 EXTERN PetscErrorCode VecPermute(Vec, IS, PetscTruth);
220 EXTERN PetscErrorCode VecSqrt(Vec);
221 EXTERN PetscErrorCode VecAbs(Vec);
222 EXTERN PetscErrorCode VecDuplicate(Vec,Vec*);
223 EXTERN PetscErrorCode VecDuplicateVecs(Vec,PetscInt,Vec*[]);
224 EXTERN PetscErrorCode VecDestroyVecs(Vec[],PetscInt);
225 EXTERN PetscErrorCode VecGetPetscMap(Vec,PetscMap*);
226 
227 EXTERN PetscErrorCode VecStrideNormAll(Vec,NormType,PetscReal*);
228 EXTERN PetscErrorCode VecStrideMaxAll(Vec,PetscInt *,PetscReal *);
229 EXTERN PetscErrorCode VecStrideMinAll(Vec,PetscInt *,PetscReal *);
230 EXTERN PetscErrorCode VecStrideScaleAll(Vec,PetscScalar*);
231 
232 EXTERN PetscErrorCode VecStrideNorm(Vec,PetscInt,NormType,PetscReal*);
233 EXTERN PetscErrorCode VecStrideMax(Vec,PetscInt,PetscInt *,PetscReal *);
234 EXTERN PetscErrorCode VecStrideMin(Vec,PetscInt,PetscInt *,PetscReal *);
235 EXTERN PetscErrorCode VecStrideScale(Vec,PetscInt,PetscScalar*);
236 EXTERN PetscErrorCode VecStrideGather(Vec,PetscInt,Vec,InsertMode);
237 EXTERN PetscErrorCode VecStrideScatter(Vec,PetscInt,Vec,InsertMode);
238 EXTERN PetscErrorCode VecStrideGatherAll(Vec,Vec*,InsertMode);
239 EXTERN PetscErrorCode VecStrideScatterAll(Vec*,Vec,InsertMode);
240 
241 EXTERN PetscErrorCode VecSetValues(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
242 EXTERN PetscErrorCode VecAssemblyBegin(Vec);
243 EXTERN PetscErrorCode VecAssemblyEnd(Vec);
244 EXTERN PetscErrorCode VecStashSetInitialSize(Vec,PetscInt,PetscInt);
245 EXTERN PetscErrorCode VecStashView(Vec,PetscViewer);
246 EXTERN PetscErrorCode VecStashGetInfo(Vec,PetscInt*,PetscInt*,PetscInt*,PetscInt*);
247 
248 extern PetscInt         VecSetValue_Row;
249 extern PetscScalar VecSetValue_Value;
250 /*MC
251    VecSetValue - Set a single entry into a vector.
252 
253    Synopsis:
254    PetscErrorCode VecSetValue(Vec v,int row,PetscScalar value, InsertMode mode);
255 
256    Not Collective
257 
258    Input Parameters:
259 +  v - the vector
260 .  row - the row location of the entry
261 .  value - the value to insert
262 -  mode - either INSERT_VALUES or ADD_VALUES
263 
264    Notes:
265    For efficiency one should use VecSetValues() and set several or
266    many values simultaneously if possible.
267 
268    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
269    MUST be called after all calls to VecSetValues() have been completed.
270 
271    VecSetValues() uses 0-based indices in Fortran as well as in C.
272 
273    Level: beginner
274 
275 .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValueLocal()
276 M*/
277 #define VecSetValue(v,i,va,mode) (VecSetValue_Row = i, VecSetValue_Value = va, VecSetValues(v,1,&VecSetValue_Row,&VecSetValue_Value,mode))
278 
279 /*MC
280    VecSetValueLocal - Set a single entry into a vector using the local numbering
281 
282    Synopsis:
283    PetscErrorCode VecSetValueLocal(Vec v,int row,PetscScalar value, InsertMode mode);
284 
285    Not Collective
286 
287    Input Parameters:
288 +  v - the vector
289 .  row - the row location of the entry
290 .  value - the value to insert
291 -  mode - either INSERT_VALUES or ADD_VALUES
292 
293    Notes:
294    For efficiency one should use VecSetValues() and set several or
295    many values simultaneously if possible.
296 
297    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
298    MUST be called after all calls to VecSetValues() have been completed.
299 
300    VecSetValues() uses 0-based indices in Fortran as well as in C.
301 
302    Level: beginner
303 
304 .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValue()
305 M*/
306 #define VecSetValueLocal(v,i,va,mode) (VecSetValue_Row = i,VecSetValue_Value = va,VecSetValuesLocal(v,1,&VecSetValue_Row,&VecSetValue_Value,mode))
307 
308 EXTERN PetscErrorCode VecSetBlockSize(Vec,PetscInt);
309 EXTERN PetscErrorCode VecGetBlockSize(Vec,PetscInt*);
310 EXTERN PetscErrorCode VecSetValuesBlocked(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
311 
312 /* Dynamic creation and loading functions */
313 extern PetscFList VecList;
314 extern PetscTruth VecRegisterAllCalled;
315 EXTERN PetscErrorCode VecSetType(Vec, const VecType);
316 EXTERN PetscErrorCode VecGetType(Vec, VecType *);
317 EXTERN PetscErrorCode VecRegister(const char[],const char[],const char[],PetscErrorCode (*)(Vec));
318 EXTERN PetscErrorCode VecRegisterAll(const char []);
319 EXTERN PetscErrorCode VecRegisterDestroy(void);
320 
321 /*MC
322   VecRegisterDynamic - Adds a new vector component implementation
323 
324   Synopsis:
325   PetscErrorCode VecRegisterDynamic(char *name, char *path, char *func_name, PetscErrorCode (*create_func)(Vec))
326 
327   Not Collective
328 
329   Input Parameters:
330 + name        - The name of a new user-defined creation routine
331 . path        - The path (either absolute or relative) of the library containing this routine
332 . func_name   - The name of routine to create method context
333 - create_func - The creation routine itself
334 
335   Notes:
336   VecRegisterDynamic() may be called multiple times to add several user-defined vectors
337 
338   If dynamic libraries are used, then the fourth input argument (routine_create) is ignored.
339 
340   Sample usage:
341 .vb
342     VecRegisterDynamic("my_vec","/home/username/my_lib/lib/libO/solaris/libmy.a", "MyVectorCreate", MyVectorCreate);
343 .ve
344 
345   Then, your vector type can be chosen with the procedural interface via
346 .vb
347     VecCreate(MPI_Comm, Vec *);
348     VecSetType(Vec,"my_vector_name");
349 .ve
350    or at runtime via the option
351 .vb
352     -vec_type my_vector_name
353 .ve
354 
355   Notes: $PETSC_ARCH occuring in pathname will be replaced with appropriate values.
356          If your function is not being put into a shared library then use VecRegister() instead
357 
358   Level: advanced
359 
360 .keywords: Vec, register
361 .seealso: VecRegisterAll(), VecRegisterDestroy(), VecRegister()
362 M*/
363 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
364 #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,0)
365 #else
366 #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,d)
367 #endif
368 
369 
370 EXTERN PetscErrorCode VecScatterCreate(Vec,IS,Vec,IS,VecScatter *);
371 EXTERN PetscErrorCode VecScatterPostRecvs(Vec,Vec,InsertMode,ScatterMode,VecScatter);
372 EXTERN PetscErrorCode VecScatterBegin(Vec,Vec,InsertMode,ScatterMode,VecScatter);
373 EXTERN PetscErrorCode VecScatterEnd(Vec,Vec,InsertMode,ScatterMode,VecScatter);
374 EXTERN PetscErrorCode VecScatterDestroy(VecScatter);
375 EXTERN PetscErrorCode VecScatterCopy(VecScatter,VecScatter *);
376 EXTERN PetscErrorCode VecScatterView(VecScatter,PetscViewer);
377 EXTERN PetscErrorCode VecScatterRemap(VecScatter,PetscInt *,PetscInt*);
378 
379 EXTERN PetscErrorCode VecGetArray_Private(Vec,PetscScalar*[]);
380 EXTERN PetscErrorCode VecRestoreArray_Private(Vec,PetscScalar*[]);
381 EXTERN PetscErrorCode VecGetArray4d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]);
382 EXTERN PetscErrorCode VecRestoreArray4d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]);
383 EXTERN PetscErrorCode VecGetArray3d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]);
384 EXTERN PetscErrorCode VecRestoreArray3d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]);
385 EXTERN PetscErrorCode VecGetArray2d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]);
386 EXTERN PetscErrorCode VecRestoreArray2d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]);
387 EXTERN PetscErrorCode VecGetArray1d(Vec,PetscInt,PetscInt,PetscScalar *[]);
388 EXTERN PetscErrorCode VecRestoreArray1d(Vec,PetscInt,PetscInt,PetscScalar *[]);
389 
390 EXTERN PetscErrorCode VecPlaceArray(Vec,const PetscScalar[]);
391 EXTERN PetscErrorCode VecResetArray(Vec);
392 EXTERN PetscErrorCode VecReplaceArray(Vec,const PetscScalar[]);
393 EXTERN PetscErrorCode VecGetArrays(const Vec[],PetscInt,PetscScalar**[]);
394 EXTERN PetscErrorCode VecRestoreArrays(const Vec[],PetscInt,PetscScalar**[]);
395 
396 EXTERN PetscErrorCode VecValid(Vec,PetscTruth*);
397 EXTERN PetscErrorCode VecView(Vec,PetscViewer);
398 EXTERN PetscErrorCode VecViewFromOptions(Vec, char *);
399 EXTERN PetscErrorCode VecEqual(Vec,Vec,PetscTruth*);
400 EXTERN PetscErrorCode VecLoad(PetscViewer,const VecType,Vec*);
401 EXTERN PetscErrorCode VecLoadIntoVector(PetscViewer,Vec);
402 
403 EXTERN PetscErrorCode VecGetSize(Vec,PetscInt*);
404 EXTERN PetscErrorCode VecGetLocalSize(Vec,PetscInt*);
405 EXTERN PetscErrorCode VecGetOwnershipRange(Vec,PetscInt*,PetscInt*);
406 
407 EXTERN PetscErrorCode VecSetLocalToGlobalMapping(Vec,ISLocalToGlobalMapping);
408 EXTERN PetscErrorCode VecSetValuesLocal(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
409 EXTERN PetscErrorCode VecSetLocalToGlobalMappingBlock(Vec,ISLocalToGlobalMapping);
410 EXTERN PetscErrorCode VecSetValuesBlockedLocal(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
411 
412 EXTERN PetscErrorCode VecDotBegin(Vec,Vec,PetscScalar *);
413 EXTERN PetscErrorCode VecDotEnd(Vec,Vec,PetscScalar *);
414 EXTERN PetscErrorCode VecTDotBegin(Vec,Vec,PetscScalar *);
415 EXTERN PetscErrorCode VecTDotEnd(Vec,Vec,PetscScalar *);
416 EXTERN PetscErrorCode VecNormBegin(Vec,NormType,PetscReal *);
417 EXTERN PetscErrorCode VecNormEnd(Vec,NormType,PetscReal *);
418 
419 typedef enum {VEC_IGNORE_OFF_PROC_ENTRIES,VEC_TREAT_OFF_PROC_ENTRIES} VecOption;
420 EXTERN PetscErrorCode VecSetOption(Vec,VecOption);
421 
422 /*
423    Expose VecGetArray()/VecRestoreArray() to users. Allows this to work without any function
424    call overhead on any 'native' Vecs.
425 */
426 #include "vecimpl.h"
427 
428 EXTERN PetscErrorCode VecContourScale(Vec,PetscReal,PetscReal);
429 
430 /*
431     These numbers need to match the entries in
432   the function table in vecimpl.h
433 */
434 typedef enum { VECOP_VIEW = 32,
435                VECOP_LOADINTOVECTOR = 38
436              } VecOperation;
437 EXTERN PetscErrorCode VecSetOperation(Vec,VecOperation,void(*)(void));
438 
439 /*
440      Routines for dealing with ghosted vectors:
441   vectors with ghost elements at the end of the array.
442 */
443 EXTERN PetscErrorCode VecCreateGhost(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*);
444 EXTERN PetscErrorCode VecCreateGhostWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*);
445 EXTERN PetscErrorCode VecCreateGhostBlock(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*);
446 EXTERN PetscErrorCode VecCreateGhostBlockWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*);
447 EXTERN PetscErrorCode VecGhostGetLocalForm(Vec,Vec*);
448 EXTERN PetscErrorCode VecGhostRestoreLocalForm(Vec,Vec*);
449 EXTERN PetscErrorCode VecGhostUpdateBegin(Vec,InsertMode,ScatterMode);
450 EXTERN PetscErrorCode VecGhostUpdateEnd(Vec,InsertMode,ScatterMode);
451 
452 EXTERN PetscErrorCode VecConjugate(Vec);
453 
454 EXTERN PetscErrorCode VecScatterCreateToAll(Vec,VecScatter*,Vec*);
455 EXTERN PetscErrorCode VecScatterCreateToZero(Vec,VecScatter*,Vec*);
456 
457 EXTERN PetscErrorCode PetscViewerMathematicaGetVector(PetscViewer, Vec);
458 EXTERN PetscErrorCode PetscViewerMathematicaPutVector(PetscViewer, Vec);
459 
460 /*S
461      Vecs - Collection of vectors where the data for the vectors is stored in
462             one continquous memory
463 
464    Level: advanced
465 
466    Notes:
467     Temporary construct for handling multiply right hand side solves
468 
469     This is faked by storing a single vector that has enough array space for
470     n vectors
471 
472   Concepts: parallel decomposition
473 
474 S*/
475         struct _p_Vecs  {PetscInt n; Vec v;};
476 typedef struct _p_Vecs* Vecs;
477 #define VecsDestroy(x)            (VecDestroy((x)->v)         || PetscFree(x))
478 #define VecsCreateSeq(comm,p,m,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeq(comm,p*m,&(*(x))->v) || (-1 == ((*(x))->n = (m))))
479 #define VecsCreateSeqWithArray(comm,p,m,a,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeqWithArray(comm,p*m,a,&(*(x))->v) || (-1 == ((*(x))->n = (m))))
480 #define VecsDuplicate(x,y)        (PetscNew(struct _p_Vecs,y) || VecDuplicate(x->v,&(*(y))->v) || (-1 == ((*(y))->n = (x)->n)))
481 
482 
483 PETSC_EXTERN_CXX_END
484 #endif
485