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