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