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