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