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