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