xref: /petsc/include/petscvec.h (revision 8bc8193efbc389280f83b3d41dffa9e2d23e2ace)
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 VecPointwiseMult(Vec,Vec,Vec);
212 EXTERN PetscErrorCode VecPointwiseDivide(Vec,Vec,Vec);
213 EXTERN PetscErrorCode VecMaxPointwiseDivide(Vec,Vec,PetscReal*);
214 EXTERN PetscErrorCode VecShift(const PetscScalar*,Vec);
215 EXTERN PetscErrorCode VecReciprocal(Vec);
216 EXTERN PetscErrorCode VecPermute(Vec, IS, PetscTruth);
217 EXTERN PetscErrorCode VecSqrt(Vec);
218 EXTERN PetscErrorCode VecAbs(Vec);
219 EXTERN PetscErrorCode VecDuplicate(Vec,Vec*);
220 EXTERN PetscErrorCode VecDuplicateVecs(Vec,PetscInt,Vec*[]);
221 EXTERN PetscErrorCode VecDestroyVecs(Vec[],PetscInt);
222 EXTERN PetscErrorCode VecGetPetscMap(Vec,PetscMap*);
223 
224 EXTERN PetscErrorCode VecStrideNormAll(Vec,NormType,PetscReal*);
225 EXTERN PetscErrorCode VecStrideMaxAll(Vec,PetscInt *,PetscReal *);
226 EXTERN PetscErrorCode VecStrideMinAll(Vec,PetscInt *,PetscReal *);
227 EXTERN PetscErrorCode VecStrideScaleAll(Vec,PetscScalar*);
228 
229 EXTERN PetscErrorCode VecStrideNorm(Vec,PetscInt,NormType,PetscReal*);
230 EXTERN PetscErrorCode VecStrideMax(Vec,PetscInt,PetscInt *,PetscReal *);
231 EXTERN PetscErrorCode VecStrideMin(Vec,PetscInt,PetscInt *,PetscReal *);
232 EXTERN PetscErrorCode VecStrideScale(Vec,PetscInt,PetscScalar*);
233 EXTERN PetscErrorCode VecStrideGather(Vec,PetscInt,Vec,InsertMode);
234 EXTERN PetscErrorCode VecStrideScatter(Vec,PetscInt,Vec,InsertMode);
235 EXTERN PetscErrorCode VecStrideGatherAll(Vec,Vec*,InsertMode);
236 EXTERN PetscErrorCode VecStrideScatterAll(Vec*,Vec,InsertMode);
237 
238 EXTERN PetscErrorCode VecSetValues(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
239 EXTERN PetscErrorCode VecAssemblyBegin(Vec);
240 EXTERN PetscErrorCode VecAssemblyEnd(Vec);
241 EXTERN PetscErrorCode VecStashSetInitialSize(Vec,PetscInt,PetscInt);
242 EXTERN PetscErrorCode VecStashView(Vec,PetscViewer);
243 EXTERN PetscErrorCode VecStashGetInfo(Vec,PetscInt*,PetscInt*,PetscInt*,PetscInt*);
244 
245 extern PetscInt         VecSetValue_Row;
246 extern PetscScalar VecSetValue_Value;
247 /*MC
248    VecSetValue - Set a single entry into a vector.
249 
250    Synopsis:
251    PetscErrorCode VecSetValue(Vec v,int row,PetscScalar value, InsertMode mode);
252 
253    Not Collective
254 
255    Input Parameters:
256 +  v - the vector
257 .  row - the row location of the entry
258 .  value - the value to insert
259 -  mode - either INSERT_VALUES or ADD_VALUES
260 
261    Notes:
262    For efficiency one should use VecSetValues() and set several or
263    many values simultaneously if possible.
264 
265    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
266    MUST be called after all calls to VecSetValues() have been completed.
267 
268    VecSetValues() uses 0-based indices in Fortran as well as in C.
269 
270    Level: beginner
271 
272 .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValueLocal()
273 M*/
274 #define VecSetValue(v,i,va,mode) (VecSetValue_Row = i, VecSetValue_Value = va, VecSetValues(v,1,&VecSetValue_Row,&VecSetValue_Value,mode))
275 
276 /*MC
277    VecSetValueLocal - Set a single entry into a vector using the local numbering
278 
279    Synopsis:
280    PetscErrorCode VecSetValueLocal(Vec v,int row,PetscScalar value, InsertMode mode);
281 
282    Not Collective
283 
284    Input Parameters:
285 +  v - the vector
286 .  row - the row location of the entry
287 .  value - the value to insert
288 -  mode - either INSERT_VALUES or ADD_VALUES
289 
290    Notes:
291    For efficiency one should use VecSetValues() and set several or
292    many values simultaneously if possible.
293 
294    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
295    MUST be called after all calls to VecSetValues() have been completed.
296 
297    VecSetValues() uses 0-based indices in Fortran as well as in C.
298 
299    Level: beginner
300 
301 .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValue()
302 M*/
303 #define VecSetValueLocal(v,i,va,mode) (VecSetValue_Row = i,VecSetValue_Value = va,VecSetValuesLocal(v,1,&VecSetValue_Row,&VecSetValue_Value,mode))
304 
305 EXTERN PetscErrorCode VecSetBlockSize(Vec,PetscInt);
306 EXTERN PetscErrorCode VecGetBlockSize(Vec,PetscInt*);
307 EXTERN PetscErrorCode VecSetValuesBlocked(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
308 
309 /* Dynamic creation and loading functions */
310 extern PetscFList VecList;
311 extern PetscTruth VecRegisterAllCalled;
312 EXTERN PetscErrorCode VecSetType(Vec, const VecType);
313 EXTERN PetscErrorCode VecGetType(Vec, VecType *);
314 EXTERN PetscErrorCode VecRegister(const char[],const char[],const char[],PetscErrorCode (*)(Vec));
315 EXTERN PetscErrorCode VecRegisterAll(const char []);
316 EXTERN PetscErrorCode VecRegisterDestroy(void);
317 
318 /*MC
319   VecRegisterDynamic - Adds a new vector component implementation
320 
321   Synopsis:
322   PetscErrorCode VecRegisterDynamic(char *name, char *path, char *func_name, PetscErrorCode (*create_func)(Vec))
323 
324   Not Collective
325 
326   Input Parameters:
327 + name        - The name of a new user-defined creation routine
328 . path        - The path (either absolute or relative) of the library containing this routine
329 . func_name   - The name of routine to create method context
330 - create_func - The creation routine itself
331 
332   Notes:
333   VecRegisterDynamic() may be called multiple times to add several user-defined vectors
334 
335   If dynamic libraries are used, then the fourth input argument (routine_create) is ignored.
336 
337   Sample usage:
338 .vb
339     VecRegisterDynamic("my_vec","/home/username/my_lib/lib/libO/solaris/libmy.a", "MyVectorCreate", MyVectorCreate);
340 .ve
341 
342   Then, your vector type can be chosen with the procedural interface via
343 .vb
344     VecCreate(MPI_Comm, Vec *);
345     VecSetType(Vec,"my_vector_name");
346 .ve
347    or at runtime via the option
348 .vb
349     -vec_type my_vector_name
350 .ve
351 
352   Notes: $PETSC_ARCH and $BOPT occuring in pathname will be replaced with appropriate values.
353          If your function is not being put into a shared library then use VecRegister() instead
354 
355   Level: advanced
356 
357 .keywords: Vec, register
358 .seealso: VecRegisterAll(), VecRegisterDestroy(), VecRegister()
359 M*/
360 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
361 #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,0)
362 #else
363 #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,d)
364 #endif
365 
366 
367 EXTERN PetscErrorCode VecScatterCreate(Vec,IS,Vec,IS,VecScatter *);
368 EXTERN PetscErrorCode VecScatterPostRecvs(Vec,Vec,InsertMode,ScatterMode,VecScatter);
369 EXTERN PetscErrorCode VecScatterBegin(Vec,Vec,InsertMode,ScatterMode,VecScatter);
370 EXTERN PetscErrorCode VecScatterEnd(Vec,Vec,InsertMode,ScatterMode,VecScatter);
371 EXTERN PetscErrorCode VecScatterDestroy(VecScatter);
372 EXTERN PetscErrorCode VecScatterCopy(VecScatter,VecScatter *);
373 EXTERN PetscErrorCode VecScatterView(VecScatter,PetscViewer);
374 EXTERN PetscErrorCode VecScatterRemap(VecScatter,PetscInt *,PetscInt*);
375 
376 EXTERN PetscErrorCode VecGetArray_Private(Vec,PetscScalar*[]);
377 EXTERN PetscErrorCode VecRestoreArray_Private(Vec,PetscScalar*[]);
378 EXTERN PetscErrorCode VecGetArray4d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]);
379 EXTERN PetscErrorCode VecRestoreArray4d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]);
380 EXTERN PetscErrorCode VecGetArray3d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]);
381 EXTERN PetscErrorCode VecRestoreArray3d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]);
382 EXTERN PetscErrorCode VecGetArray2d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]);
383 EXTERN PetscErrorCode VecRestoreArray2d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]);
384 EXTERN PetscErrorCode VecGetArray1d(Vec,PetscInt,PetscInt,PetscScalar *[]);
385 EXTERN PetscErrorCode VecRestoreArray1d(Vec,PetscInt,PetscInt,PetscScalar *[]);
386 
387 EXTERN PetscErrorCode VecPlaceArray(Vec,const PetscScalar[]);
388 EXTERN PetscErrorCode VecResetArray(Vec);
389 EXTERN PetscErrorCode VecReplaceArray(Vec,const PetscScalar[]);
390 EXTERN PetscErrorCode VecGetArrays(const Vec[],PetscInt,PetscScalar**[]);
391 EXTERN PetscErrorCode VecRestoreArrays(const Vec[],PetscInt,PetscScalar**[]);
392 
393 EXTERN PetscErrorCode VecValid(Vec,PetscTruth*);
394 EXTERN PetscErrorCode VecView(Vec,PetscViewer);
395 EXTERN PetscErrorCode VecViewFromOptions(Vec, char *);
396 EXTERN PetscErrorCode VecEqual(Vec,Vec,PetscTruth*);
397 EXTERN PetscErrorCode VecLoad(PetscViewer,const VecType,Vec*);
398 EXTERN PetscErrorCode VecLoadIntoVector(PetscViewer,Vec);
399 
400 EXTERN PetscErrorCode VecGetSize(Vec,PetscInt*);
401 EXTERN PetscErrorCode VecGetLocalSize(Vec,PetscInt*);
402 EXTERN PetscErrorCode VecGetOwnershipRange(Vec,PetscInt*,PetscInt*);
403 
404 EXTERN PetscErrorCode VecSetLocalToGlobalMapping(Vec,ISLocalToGlobalMapping);
405 EXTERN PetscErrorCode VecSetValuesLocal(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
406 EXTERN PetscErrorCode VecSetLocalToGlobalMappingBlock(Vec,ISLocalToGlobalMapping);
407 EXTERN PetscErrorCode VecSetValuesBlockedLocal(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
408 
409 EXTERN PetscErrorCode VecDotBegin(Vec,Vec,PetscScalar *);
410 EXTERN PetscErrorCode VecDotEnd(Vec,Vec,PetscScalar *);
411 EXTERN PetscErrorCode VecTDotBegin(Vec,Vec,PetscScalar *);
412 EXTERN PetscErrorCode VecTDotEnd(Vec,Vec,PetscScalar *);
413 EXTERN PetscErrorCode VecNormBegin(Vec,NormType,PetscReal *);
414 EXTERN PetscErrorCode VecNormEnd(Vec,NormType,PetscReal *);
415 
416 typedef enum {VEC_IGNORE_OFF_PROC_ENTRIES,VEC_TREAT_OFF_PROC_ENTRIES} VecOption;
417 EXTERN PetscErrorCode VecSetOption(Vec,VecOption);
418 
419 /*
420    Expose VecGetArray()/VecRestoreArray() to users. Allows this to work without any function
421    call overhead on any 'native' Vecs.
422 */
423 #include "vecimpl.h"
424 
425 EXTERN PetscErrorCode VecContourScale(Vec,PetscReal,PetscReal);
426 
427 /*
428     These numbers need to match the entries in
429   the function table in vecimpl.h
430 */
431 typedef enum { VECOP_VIEW = 32,
432                VECOP_LOADINTOVECTOR = 38
433              } VecOperation;
434 EXTERN PetscErrorCode VecSetOperation(Vec,VecOperation,void(*)(void));
435 
436 /*
437      Routines for dealing with ghosted vectors:
438   vectors with ghost elements at the end of the array.
439 */
440 EXTERN PetscErrorCode VecCreateGhost(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*);
441 EXTERN PetscErrorCode VecCreateGhostWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*);
442 EXTERN PetscErrorCode VecCreateGhostBlock(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*);
443 EXTERN PetscErrorCode VecCreateGhostBlockWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*);
444 EXTERN PetscErrorCode VecGhostGetLocalForm(Vec,Vec*);
445 EXTERN PetscErrorCode VecGhostRestoreLocalForm(Vec,Vec*);
446 EXTERN PetscErrorCode VecGhostUpdateBegin(Vec,InsertMode,ScatterMode);
447 EXTERN PetscErrorCode VecGhostUpdateEnd(Vec,InsertMode,ScatterMode);
448 
449 EXTERN PetscErrorCode VecConjugate(Vec);
450 
451 EXTERN PetscErrorCode VecScatterCreateToAll(Vec,VecScatter*,Vec*);
452 EXTERN PetscErrorCode VecScatterCreateToZero(Vec,VecScatter*,Vec*);
453 
454 EXTERN PetscErrorCode PetscViewerMathematicaGetVector(PetscViewer, Vec);
455 EXTERN PetscErrorCode PetscViewerMathematicaPutVector(PetscViewer, Vec);
456 
457 /*S
458      Vecs - Collection of vectors where the data for the vectors is stored in
459             one continquous memory
460 
461    Level: advanced
462 
463    Notes:
464     Temporary construct for handling multiply right hand side solves
465 
466     This is faked by storing a single vector that has enough array space for
467     n vectors
468 
469   Concepts: parallel decomposition
470 
471 S*/
472         struct _p_Vecs  {PetscInt n; Vec v;};
473 typedef struct _p_Vecs* Vecs;
474 #define VecsDestroy(x)            (VecDestroy((x)->v)         || PetscFree(x))
475 #define VecsCreateSeq(comm,p,m,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeq(comm,p*m,&(*(x))->v) || (-1 == ((*(x))->n = (m))))
476 #define VecsCreateSeqWithArray(comm,p,m,a,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeqWithArray(comm,p*m,a,&(*(x))->v) || (-1 == ((*(x))->n = (m))))
477 #define VecsDuplicate(x,y)        (PetscNew(struct _p_Vecs,y) || VecDuplicate(x->v,&(*(y))->v) || (-1 == ((*(y))->n = (x)->n)))
478 
479 
480 PETSC_EXTERN_CXX_END
481 #endif
482