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