xref: /petsc/include/petscvec.h (revision b49fd9e1d405c29f6bb25f979e20b4ec3458514c)
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 VecNormComposedDataID(NormType,int*);
165 EXTERN int VecNormalize(Vec,PetscReal *);
166 EXTERN int VecSum(Vec,PetscScalar*);
167 EXTERN int VecMax(Vec,int*,PetscReal *);
168 EXTERN int VecMin(Vec,int*,PetscReal *);
169 EXTERN int VecScale(const PetscScalar *a,Vec v);
170 EXTERN int VecCopy(Vec,Vec);
171 EXTERN int VecSetRandom(PetscRandom,Vec);
172 EXTERN int VecSet(const PetscScalar*,Vec);
173 EXTERN int VecSwap(Vec,Vec);
174 EXTERN int VecAXPY(const PetscScalar*,Vec,Vec);
175 EXTERN int VecAXPBY(const PetscScalar*,const PetscScalar *,Vec,Vec);
176 EXTERN int VecMAXPY(int,const PetscScalar*,Vec,Vec*);
177 EXTERN int VecAYPX(const PetscScalar*,Vec,Vec);
178 EXTERN int VecWAXPY(const PetscScalar*,Vec,Vec,Vec);
179 EXTERN int VecPointwiseMult(Vec,Vec,Vec);
180 EXTERN int VecPointwiseDivide(Vec,Vec,Vec);
181 EXTERN int VecMaxPointwiseDivide(Vec,Vec,PetscReal*);
182 EXTERN int VecShift(const PetscScalar*,Vec);
183 EXTERN int VecReciprocal(Vec);
184 EXTERN int VecPermute(Vec, IS, PetscTruth);
185 EXTERN int VecSqrt(Vec);
186 EXTERN int VecAbs(Vec);
187 EXTERN int VecDuplicate(Vec,Vec*);
188 EXTERN int VecDuplicateVecs(Vec,int,Vec*[]);
189 EXTERN int VecDestroyVecs(const Vec[],int);
190 EXTERN int VecGetPetscMap(Vec,PetscMap*);
191 
192 EXTERN int VecStrideNormAll(Vec,NormType,PetscReal*);
193 EXTERN int VecStrideMaxAll(Vec,int *,PetscReal *);
194 EXTERN int VecStrideMinAll(Vec,int *,PetscReal *);
195 EXTERN int VecStrideScaleAll(Vec,PetscScalar*);
196 
197 EXTERN int VecStrideNorm(Vec,int,NormType,PetscReal*);
198 EXTERN int VecStrideMax(Vec,int,int *,PetscReal *);
199 EXTERN int VecStrideMin(Vec,int,int *,PetscReal *);
200 EXTERN int VecStrideScale(Vec,int,PetscScalar*);
201 EXTERN int VecStrideGather(Vec,int,Vec,InsertMode);
202 EXTERN int VecStrideScatter(Vec,int,Vec,InsertMode);
203 EXTERN int VecStrideGatherAll(Vec,Vec*,InsertMode);
204 EXTERN int VecStrideScatterAll(Vec*,Vec,InsertMode);
205 
206 EXTERN int VecSetValues(Vec,int,const int[],const PetscScalar[],InsertMode);
207 EXTERN int VecAssemblyBegin(Vec);
208 EXTERN int VecAssemblyEnd(Vec);
209 EXTERN int VecSetStashInitialSize(Vec,int,int);
210 EXTERN int VecStashView(Vec,PetscViewer);
211 
212 /*MC
213    VecSetValue - Set a single entry into a vector.
214 
215    Synopsis:
216    int VecSetValue(Vec v,int row,PetscScalar value, InsertMode mode);
217 
218    Not Collective
219 
220    Input Parameters:
221 +  v - the vector
222 .  row - the row location of the entry
223 .  value - the value to insert
224 -  mode - either INSERT_VALUES or ADD_VALUES
225 
226    Notes:
227    For efficiency one should use VecSetValues() and set several or
228    many values simultaneously if possible.
229 
230    Note that VecSetValue() does NOT return an error code (since this
231    is checked internally).
232 
233    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
234    MUST be called after all calls to VecSetValues() have been completed.
235 
236    VecSetValues() uses 0-based indices in Fortran as well as in C.
237 
238    Level: beginner
239 
240 .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal()
241 M*/
242 #define VecSetValue(v,i,va,mode) 0;\
243 {int _ierr,_row = i; PetscScalar _va = va; \
244   _ierr = VecSetValues(v,1,&_row,&_va,mode);CHKERRQ(_ierr); \
245 }
246 
247 EXTERN int VecSetBlockSize(Vec,int);
248 EXTERN int VecGetBlockSize(Vec,int*);
249 EXTERN int VecSetValuesBlocked(Vec,int,const int[],const PetscScalar[],InsertMode);
250 
251 /* Dynamic creation and loading functions */
252 extern PetscFList VecList;
253 extern PetscTruth VecRegisterAllCalled;
254 EXTERN int VecSetType(Vec, VecType);
255 EXTERN int VecGetType(Vec, VecType *);
256 EXTERN int VecRegister(const char[],const char[],const char[],int(*)(Vec));
257 EXTERN int VecRegisterAll(const char []);
258 EXTERN int VecRegisterDestroy(void);
259 
260 /*MC
261   VecRegisterDynamic - Adds a new vector component implementation
262 
263   Synopsis:
264   VecRegisterDynamic(char *name, char *path, char *func_name, int (*create_func)(Vec))
265 
266   Not Collective
267 
268   Input Parameters:
269 + name        - The name of a new user-defined creation routine
270 . path        - The path (either absolute or relative) of the library containing this routine
271 . func_name   - The name of routine to create method context
272 - create_func - The creation routine itself
273 
274   Notes:
275   VecRegisterDynamic() may be called multiple times to add several user-defined vectors
276 
277   If dynamic libraries are used, then the fourth input argument (routine_create) is ignored.
278 
279   Sample usage:
280 .vb
281     VecRegisterDynamic("my_vec","/home/username/my_lib/lib/libO/solaris/libmy.a", "MyVectorCreate", MyVectorCreate);
282 .ve
283 
284   Then, your vector type can be chosen with the procedural interface via
285 .vb
286     VecCreate(MPI_Comm, Vec *);
287     VecSetType(Vec,"my_vector_name");
288 .ve
289    or at runtime via the option
290 .vb
291     -vec_type my_vector_name
292 .ve
293 
294   Notes: $PETSC_ARCH and $BOPT occuring in pathname will be replaced with appropriate values.
295          If your function is not being put into a shared library then use VecRegister() instead
296 
297   Level: advanced
298 
299 .keywords: Vec, register
300 .seealso: VecRegisterAll(), VecRegisterDestroy(), VecRegister()
301 M*/
302 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
303 #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,0)
304 #else
305 #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,d)
306 #endif
307 
308 extern PetscFList VecSerializeList;
309 extern PetscTruth VecSerializeRegisterAllCalled;
310 EXTERN int VecSetSerializeType(Vec, VecSerializeType);
311 EXTERN int VecGetSerializeType(Vec, VecSerializeType *);
312 EXTERN int VecSerializeRegister(const char [], const char [], const char [], int (*)(MPI_Comm, Vec *, PetscViewer, PetscTruth));
313 EXTERN int VecSerializeRegisterAll(const char []);
314 EXTERN int VecSerializeRegisterDestroy(void);
315 
316 /*MC
317   VecSerializeRegisterDynamic - Adds a serialization method to the vec package.
318 
319   Synopsis:
320 
321   VecSerializeRegisterDynamic(char *name, char *path, char *func_name,
322                               int (*serialize_func)(MPI_Comm, Vec *, PetscViewer, PetscTruth))
323 
324   Not Collective
325 
326   Input Parameters:
327 + name           - The name of a new user-defined serialization routine
328 . path           - The path (either absolute or relative) of the library containing this routine
329 . func_name      - The name of the serialization routine
330 - serialize_func - The serialization routine itself
331 
332   Notes:
333   VecSerializeRegister() may be called multiple times to add several user-defined serializers.
334 
335   If dynamic libraries are used, then the fourth input argument (serialize_func) is ignored.
336 
337   Sample usage:
338 .vb
339   VecSerializeRegisterDynamic("my_store", "/home/username/my_lib/lib/libO/solaris/libmy.a", "MyStoreFunc", MyStoreFunc);
340 .ve
341 
342   Then, your serialization can be chosen with the procedural interface via
343 .vb
344     VecSetSerializeType(vec, "my_store")
345 .ve
346   or at runtime via the option
347 .vb
348     -vec_serialize_type my_store
349 .ve
350 
351   Note: $PETSC_ARCH and $BOPT occuring in pathname will be replaced with appropriate values.
352 
353   Level: advanced
354 
355 .keywords: Vec, register
356 .seealso: VecSerializeRegisterAll(), VecSerializeRegisterDestroy()
357 M*/
358 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
359 #define VecSerializeRegisterDynamic(a,b,c,d) VecSerializeRegister(a,b,c,0)
360 #else
361 #define VecSerializeRegisterDynamic(a,b,c,d) VecSerializeRegister(a,b,c,d)
362 #endif
363 
364 EXTERN int VecScatterCreate(Vec,IS,Vec,IS,VecScatter *);
365 EXTERN int VecScatterPostRecvs(Vec,Vec,InsertMode,ScatterMode,VecScatter);
366 EXTERN int VecScatterBegin(Vec,Vec,InsertMode,ScatterMode,VecScatter);
367 EXTERN int VecScatterEnd(Vec,Vec,InsertMode,ScatterMode,VecScatter);
368 EXTERN int VecScatterDestroy(VecScatter);
369 EXTERN int VecScatterCopy(VecScatter,VecScatter *);
370 EXTERN int VecScatterView(VecScatter,PetscViewer);
371 EXTERN int VecScatterRemap(VecScatter,int *,int*);
372 
373 typedef enum {PIPELINE_DOWN=0,PIPELINE_UP=1} PipelineDirection;
374 typedef enum {PIPELINE_NONE=1,PIPELINE_SEQUENTIAL=2,
375 	      PIPELINE_REDBLACK=3,PIPELINE_MULTICOLOR=4} PipelineType;
376 
377 typedef struct _p_VecPipeline*  VecPipeline;
378 
379 EXTERN int VecPipelineCreate(MPI_Comm,Vec,IS,Vec,IS,VecPipeline *);
380 EXTERN int VecPipelineSetType(VecPipeline,PipelineType,PetscObject);
381 EXTERN int VecPipelineSetup(VecPipeline);
382 EXTERN int VecPipelineBegin(Vec,Vec,InsertMode,ScatterMode,PipelineDirection,VecPipeline);
383 EXTERN int VecPipelineEnd(Vec,Vec,InsertMode,ScatterMode,PipelineDirection,VecPipeline);
384 EXTERN int VecPipelineView(VecPipeline,PetscViewer);
385 EXTERN int VecPipelineDestroy(VecPipeline);
386 
387 EXTERN int VecGetArray(Vec,PetscScalar*[]);
388 EXTERN int VecRestoreArray(Vec,PetscScalar*[]);
389 EXTERN int VecGetArray4d(Vec,int,int,int,int,int,int,int,int,PetscScalar****[]);
390 EXTERN int VecRestoreArray4d(Vec,int,int,int,int,int,int,int,int,PetscScalar****[]);
391 EXTERN int VecGetArray3d(Vec,int,int,int,int,int,int,PetscScalar***[]);
392 EXTERN int VecRestoreArray3d(Vec,int,int,int,int,int,int,PetscScalar***[]);
393 EXTERN int VecGetArray2d(Vec,int,int,int,int,PetscScalar**[]);
394 EXTERN int VecRestoreArray2d(Vec,int,int,int,int,PetscScalar**[]);
395 EXTERN int VecGetArray1d(Vec,int,int,PetscScalar *[]);
396 EXTERN int VecRestoreArray1d(Vec,int,int,PetscScalar *[]);
397 
398 EXTERN int VecPlaceArray(Vec,const PetscScalar[]);
399 EXTERN int VecResetArray(Vec);
400 EXTERN int VecReplaceArray(Vec,const PetscScalar[]);
401 EXTERN int VecGetArrays(const Vec[],int,PetscScalar**[]);
402 EXTERN int VecRestoreArrays(const Vec[],int,PetscScalar**[]);
403 
404 EXTERN int VecValid(Vec,PetscTruth*);
405 EXTERN int VecView(Vec,PetscViewer);
406 EXTERN int VecViewFromOptions(Vec, char *);
407 EXTERN int VecEqual(Vec,Vec,PetscTruth*);
408 EXTERN int VecLoad(PetscViewer,Vec*);
409 EXTERN int VecLoadIntoVector(PetscViewer,Vec);
410 
411 EXTERN int VecGetSize(Vec,int*);
412 EXTERN int VecGetLocalSize(Vec,int*);
413 EXTERN int VecGetOwnershipRange(Vec,int*,int*);
414 
415 EXTERN int VecSetLocalToGlobalMapping(Vec,ISLocalToGlobalMapping);
416 EXTERN int VecSetValuesLocal(Vec,int,const int[],const PetscScalar[],InsertMode);
417 EXTERN int VecSetLocalToGlobalMappingBlock(Vec,ISLocalToGlobalMapping);
418 EXTERN int VecSetValuesBlockedLocal(Vec,int,const int[],const PetscScalar[],InsertMode);
419 
420 EXTERN int VecDotBegin(Vec,Vec,PetscScalar *);
421 EXTERN int VecDotEnd(Vec,Vec,PetscScalar *);
422 EXTERN int VecTDotBegin(Vec,Vec,PetscScalar *);
423 EXTERN int VecTDotEnd(Vec,Vec,PetscScalar *);
424 EXTERN int VecNormBegin(Vec,NormType,PetscReal *);
425 EXTERN int VecNormEnd(Vec,NormType,PetscReal *);
426 
427 typedef enum {VEC_IGNORE_OFF_PROC_ENTRIES,VEC_TREAT_OFF_PROC_ENTRIES} VecOption;
428 EXTERN int VecSetOption(Vec,VecOption);
429 
430 EXTERN int VecContourScale(Vec,PetscReal,PetscReal);
431 
432 /*
433     These numbers need to match the entries in
434   the function table in src/vec/vecimpl.h
435 */
436 typedef enum { VECOP_VIEW = 32,
437                VECOP_LOADINTOVECTOR = 38
438              } VecOperation;
439 EXTERN int 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 int VecCreateGhost(MPI_Comm,int,int,int,const int[],Vec*);
446 EXTERN int VecCreateGhostWithArray(MPI_Comm,int,int,int,const int[],const PetscScalar[],Vec*);
447 EXTERN int VecCreateGhostBlock(MPI_Comm,int,int,int,int,const int[],Vec*);
448 EXTERN int VecCreateGhostBlockWithArray(MPI_Comm,int,int,int,int,const int[],const PetscScalar[],Vec*);
449 EXTERN int VecGhostGetLocalForm(Vec,Vec*);
450 EXTERN int VecGhostRestoreLocalForm(Vec,Vec*);
451 EXTERN int VecGhostUpdateBegin(Vec,InsertMode,ScatterMode);
452 EXTERN int VecGhostUpdateEnd(Vec,InsertMode,ScatterMode);
453 
454 EXTERN int VecConjugate(Vec);
455 
456 EXTERN int VecConvertMPIToSeqAll(Vec vin,Vec *vout);
457 EXTERN int VecConvertMPIToMPIZero(Vec vin,Vec *vout);
458 
459 
460 EXTERN int VecESISetType(Vec,char*);
461 EXTERN int VecESISetFromOptions(Vec);
462 
463 EXTERN int PetscViewerMathematicaGetVector(PetscViewer, Vec);
464 EXTERN int PetscViewerMathematicaPutVector(PetscViewer, Vec);
465 
466 /*S
467      Vecs - Collection of vectors where the data for the vectors is stored in
468             one continquous memory
469 
470    Level: advanced
471 
472    Notes:
473     Temporary construct for handling multiply right hand side solves
474 
475     This is faked by storing a single vector that has enough array space for
476     n vectors
477 
478   Concepts: parallel decomposition
479 
480 S*/
481         struct _p_Vecs  {int n; Vec v;};
482 typedef struct _p_Vecs* Vecs;
483 #define VecsDestroy(x)            (VecDestroy((x)->v)         || PetscFree(x))
484 #define VecsCreateSeq(comm,p,m,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeq(comm,p*m,&(*(x))->v) || (-1 == ((*(x))->n = (m))))
485 #define VecsCreateSeqWithArray(comm,p,m,a,x) (PetscNew(struct _p_Vecs,x) || VecCreateSeqWithArray(comm,p*m,a,&(*(x))->v) || (-1 == ((*(x))->n = (m))))
486 #define VecsDuplicate(x,y)        (PetscNew(struct _p_Vecs,y) || VecDuplicate(x->v,&(*(y))->v) || (-1 == ((*(y))->n = (x)->n)))
487 
488 
489 PETSC_EXTERN_CXX_END
490 #endif
491