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