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