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