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 11 PETSC_EXTERN_CXX_BEGIN 12 13 /*S 14 Vec - Abstract PETSc vector object 15 16 Level: beginner 17 18 Concepts: field variables, unknowns, arrays 19 20 .seealso: VecCreate(), VecType, VecSetType() 21 S*/ 22 typedef struct _p_Vec* Vec; 23 24 /*S 25 VecScatter - Object used to manage communication of data 26 between vectors in parallel. Manages both scatters and gathers 27 28 Level: beginner 29 30 Concepts: scatter 31 32 .seealso: VecScatterCreate(), VecScatterBegin(), VecScatterEnd() 33 S*/ 34 typedef struct _p_VecScatter* VecScatter; 35 36 /*E 37 ScatterMode - Determines the direction of a scatter 38 39 Level: beginner 40 41 .seealso: VecScatter, VecScatterBegin(), VecScatterEnd() 42 E*/ 43 typedef enum {SCATTER_FORWARD=0, SCATTER_REVERSE=1, SCATTER_FORWARD_LOCAL=2, SCATTER_REVERSE_LOCAL=3, SCATTER_LOCAL=2} ScatterMode; 44 45 /*MC 46 SCATTER_FORWARD - Scatters the values as dictated by the VecScatterCreate() call 47 48 Level: beginner 49 50 .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_REVERSE, SCATTER_FORWARD_LOCAL, 51 SCATTER_REVERSE_LOCAL 52 53 M*/ 54 55 /*MC 56 SCATTER_REVERSE - Moves the values in the opposite direction then the directions indicated in 57 in the VecScatterCreate() 58 59 Level: beginner 60 61 .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_FORWARD, SCATTER_FORWARD_LOCAL, 62 SCATTER_REVERSE_LOCAL 63 64 M*/ 65 66 /*MC 67 SCATTER_FORWARD_LOCAL - Scatters the values as dictated by the VecScatterCreate() call except NO parallel communication 68 is done. Any variables that have be moved between processes are ignored 69 70 Level: developer 71 72 .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_REVERSE, SCATTER_FORWARD, 73 SCATTER_REVERSE_LOCAL 74 75 M*/ 76 77 /*MC 78 SCATTER_REVERSE_LOCAL - Moves the values in the opposite direction then the directions indicated in 79 in the VecScatterCreate() except NO parallel communication 80 is done. Any variables that have be moved between processes are ignored 81 82 Level: developer 83 84 .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_FORWARD, SCATTER_FORWARD_LOCAL, 85 SCATTER_REVERSE 86 87 M*/ 88 89 /*J 90 VecType - String with the name of a PETSc vector or the creation function 91 with an optional dynamic library name, for example 92 http://www.mcs.anl.gov/petsc/lib.a:myveccreate() 93 94 Level: beginner 95 96 .seealso: VecSetType(), Vec 97 J*/ 98 #define VecType char* 99 #define VECSEQ "seq" 100 #define VECMPI "mpi" 101 #define VECSTANDARD "standard" /* seq on one process and mpi on several */ 102 #define VECSHARED "shared" 103 #define VECSIEVE "sieve" 104 #define VECSEQCUSP "seqcusp" 105 #define VECMPICUSP "mpicusp" 106 #define VECCUSP "cusp" /* seqcusp on one process and mpicusp on several */ 107 #define VECNEST "nest" 108 #define VECSEQPTHREAD "seqpthread" 109 #define VECMPIPTHREAD "mpipthread" 110 #define VECPTHREAD "pthread" /* seqpthread on one process and mpipthread on several */ 111 112 113 /* Logging support */ 114 #define VEC_FILE_CLASSID 1211214 115 extern PetscClassId VEC_CLASSID; 116 extern PetscClassId VEC_SCATTER_CLASSID; 117 118 119 extern PetscErrorCode VecInitializePackage(const char[]); 120 extern PetscErrorCode VecFinalizePackage(void); 121 122 extern PetscErrorCode VecCreate(MPI_Comm,Vec*); 123 PetscPolymorphicSubroutine(VecCreate,(Vec *x),(PETSC_COMM_SELF,x)) 124 extern PetscErrorCode VecCreateSeq(MPI_Comm,PetscInt,Vec*); 125 PetscPolymorphicSubroutine(VecCreateSeq,(PetscInt n,Vec *x),(PETSC_COMM_SELF,n,x)) 126 extern PetscErrorCode VecCreateMPI(MPI_Comm,PetscInt,PetscInt,Vec*); 127 PetscPolymorphicSubroutine(VecCreateMPI,(PetscInt n,PetscInt N,Vec *x),(PETSC_COMM_WORLD,n,N,x)) 128 extern PetscErrorCode VecCreateSeqWithArray(MPI_Comm,PetscInt,const PetscScalar[],Vec*); 129 PetscPolymorphicSubroutine(VecCreateSeqWithArray,(PetscInt n,PetscScalar s[],Vec *x),(PETSC_COMM_SELF,n,s,x)) 130 extern PetscErrorCode VecCreateMPIWithArray(MPI_Comm,PetscInt,PetscInt,const PetscScalar[],Vec*); 131 PetscPolymorphicSubroutine(VecCreateMPIWithArray,(PetscInt n,PetscInt N,PetscScalar s[],Vec *x),(PETSC_COMM_WORLD,n,N,s,x)) 132 extern PetscErrorCode VecCreateShared(MPI_Comm,PetscInt,PetscInt,Vec*); 133 extern PetscErrorCode VecSetFromOptions(Vec); 134 extern PetscErrorCode VecSetUp(Vec); 135 extern PetscErrorCode VecDestroy(Vec*); 136 extern PetscErrorCode VecZeroEntries(Vec); 137 extern PetscErrorCode VecSetOptionsPrefix(Vec,const char[]); 138 extern PetscErrorCode VecAppendOptionsPrefix(Vec,const char[]); 139 extern PetscErrorCode VecGetOptionsPrefix(Vec,const char*[]); 140 141 extern PetscErrorCode VecSetSizes(Vec,PetscInt,PetscInt); 142 143 extern PetscErrorCode VecDotNorm2(Vec,Vec,PetscScalar*,PetscScalar*); 144 extern PetscErrorCode VecDot(Vec,Vec,PetscScalar*); 145 PetscPolymorphicFunction(VecDot,(Vec x,Vec y),(x,y,&s),PetscScalar,s) 146 extern PetscErrorCode VecTDot(Vec,Vec,PetscScalar*); 147 PetscPolymorphicFunction(VecTDot,(Vec x,Vec y),(x,y,&s),PetscScalar,s) 148 extern PetscErrorCode VecMDot(Vec,PetscInt,const Vec[],PetscScalar[]); 149 extern PetscErrorCode VecMTDot(Vec,PetscInt,const Vec[],PetscScalar[]); 150 extern PetscErrorCode VecGetSubVector(Vec,IS,Vec*); 151 extern PetscErrorCode VecRestoreSubVector(Vec,IS,Vec*); 152 153 /*E 154 NormType - determines what type of norm to compute 155 156 Level: beginner 157 158 .seealso: VecNorm(), VecNormBegin(), VecNormEnd(), MatNorm() 159 E*/ 160 typedef enum {NORM_1=0,NORM_2=1,NORM_FROBENIUS=2,NORM_INFINITY=3,NORM_1_AND_2=4} NormType; 161 extern const char *NormTypes[]; 162 #define NORM_MAX NORM_INFINITY 163 164 /*MC 165 NORM_1 - the one norm, ||v|| = sum_i | v_i |. ||A|| = max_j || v_*j ||, maximum column sum 166 167 Level: beginner 168 169 .seealso: NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_2, NORM_FROBENIUS, 170 NORM_INFINITY, NORM_1_AND_2 171 172 M*/ 173 174 /*MC 175 NORM_2 - the two norm, ||v|| = sqrt(sum_i (v_i)^2) (vectors only) 176 177 Level: beginner 178 179 .seealso: NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_FROBENIUS, 180 NORM_INFINITY, NORM_1_AND_2 181 182 M*/ 183 184 /*MC 185 NORM_FROBENIUS - ||A|| = sqrt(sum_ij (A_ij)^2), same as NORM_2 for vectors 186 187 Level: beginner 188 189 .seealso: NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2, 190 NORM_INFINITY, NORM_1_AND_2 191 192 M*/ 193 194 /*MC 195 NORM_INFINITY - ||v|| = max_i |v_i|. ||A|| = max_i || v_i* ||, maximum row sum 196 197 Level: beginner 198 199 .seealso: NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2, 200 NORM_FROBINIUS, NORM_1_AND_2 201 202 M*/ 203 204 /*MC 205 NORM_1_AND_2 - computes both the 1 and 2 norm of a vector 206 207 Level: beginner 208 209 .seealso: NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2, 210 NORM_FROBINIUS, NORM_INFINITY 211 212 M*/ 213 214 /*MC 215 NORM_MAX - see NORM_INFINITY 216 217 Level: beginner 218 219 M*/ 220 221 extern PetscErrorCode VecNorm(Vec,NormType,PetscReal *); 222 extern PetscErrorCode VecNormAvailable(Vec,NormType,PetscBool *,PetscReal *); 223 PetscPolymorphicSubroutine(VecNorm,(Vec x,PetscReal *r),(x,NORM_2,r)) 224 PetscPolymorphicFunction(VecNorm,(Vec x,NormType t),(x,t,&r),PetscReal,r) 225 PetscPolymorphicFunction(VecNorm,(Vec x),(x,NORM_2,&r),PetscReal,r) 226 extern PetscErrorCode VecNormalize(Vec,PetscReal *); 227 extern PetscErrorCode VecSum(Vec,PetscScalar*); 228 extern PetscErrorCode VecMax(Vec,PetscInt*,PetscReal *); 229 PetscPolymorphicSubroutine(VecMax,(Vec x,PetscReal *r),(x,PETSC_NULL,r)) 230 extern PetscErrorCode VecMin(Vec,PetscInt*,PetscReal *); 231 PetscPolymorphicSubroutine(VecMin,(Vec x,PetscReal *r),(x,PETSC_NULL,r)) 232 extern PetscErrorCode VecScale(Vec,PetscScalar); 233 extern PetscErrorCode VecCopy(Vec,Vec); 234 extern PetscErrorCode VecSetRandom(Vec,PetscRandom); 235 extern PetscErrorCode VecSet(Vec,PetscScalar); 236 extern PetscErrorCode VecSwap(Vec,Vec); 237 extern PetscErrorCode VecAXPY(Vec,PetscScalar,Vec); 238 extern PetscErrorCode VecAXPBY(Vec,PetscScalar,PetscScalar,Vec); 239 extern PetscErrorCode VecMAXPY(Vec,PetscInt,const PetscScalar[],Vec[]); 240 extern PetscErrorCode VecAYPX(Vec,PetscScalar,Vec); 241 extern PetscErrorCode VecWAXPY(Vec,PetscScalar,Vec,Vec); 242 extern PetscErrorCode VecAXPBYPCZ(Vec,PetscScalar,PetscScalar,PetscScalar,Vec,Vec); 243 extern PetscErrorCode VecPointwiseMax(Vec,Vec,Vec); 244 PetscPolymorphicSubroutine(VecPointwiseMax,(Vec x,Vec y),(x,y,y)) 245 extern PetscErrorCode VecPointwiseMaxAbs(Vec,Vec,Vec); 246 PetscPolymorphicSubroutine(VecPointwiseMaxAbs,(Vec x,Vec y),(x,y,y)) 247 extern PetscErrorCode VecPointwiseMin(Vec,Vec,Vec); 248 PetscPolymorphicSubroutine(VecPointwiseMin,(Vec x,Vec y),(x,y,y)) 249 extern PetscErrorCode VecPointwiseMult(Vec,Vec,Vec); 250 PetscPolymorphicSubroutine(VecPointwiseMult,(Vec x,Vec y),(x,x,y)) 251 extern PetscErrorCode VecPointwiseDivide(Vec,Vec,Vec); 252 PetscPolymorphicSubroutine(VecPointwiseDivide,(Vec x,Vec y),(x,x,y)) 253 extern PetscErrorCode VecMaxPointwiseDivide(Vec,Vec,PetscReal*); 254 extern PetscErrorCode VecShift(Vec,PetscScalar); 255 extern PetscErrorCode VecReciprocal(Vec); 256 extern PetscErrorCode VecPermute(Vec, IS, PetscBool ); 257 extern PetscErrorCode VecSqrtAbs(Vec); 258 extern PetscErrorCode VecLog(Vec); 259 extern PetscErrorCode VecExp(Vec); 260 extern PetscErrorCode VecAbs(Vec); 261 extern PetscErrorCode VecDuplicate(Vec,Vec*); 262 extern PetscErrorCode VecDuplicateVecs(Vec,PetscInt,Vec*[]); 263 extern PetscErrorCode VecDestroyVecs(PetscInt, Vec*[]); 264 extern PetscErrorCode VecStrideNormAll(Vec,NormType,PetscReal[]); 265 extern PetscErrorCode VecStrideMaxAll(Vec,PetscInt [],PetscReal []); 266 extern PetscErrorCode VecStrideMinAll(Vec,PetscInt [],PetscReal []); 267 extern PetscErrorCode VecStrideScaleAll(Vec,const PetscScalar[]); 268 269 extern PetscErrorCode VecStrideNorm(Vec,PetscInt,NormType,PetscReal*); 270 PetscPolymorphicFunction(VecStrideNorm,(Vec x,PetscInt i),(x,i,NORM_2,&r),PetscReal,r) 271 PetscPolymorphicFunction(VecStrideNorm,(Vec x,PetscInt i,NormType t),(x,i,t,&r),PetscReal,r) 272 extern PetscErrorCode VecStrideMax(Vec,PetscInt,PetscInt *,PetscReal *); 273 PetscPolymorphicFunction(VecStrideMax,(Vec x,PetscInt i),(x,i,PETSC_NULL,&r),PetscReal,r) 274 extern PetscErrorCode VecStrideMin(Vec,PetscInt,PetscInt *,PetscReal *); 275 PetscPolymorphicFunction(VecStrideMin,(Vec x,PetscInt i),(x,i,PETSC_NULL,&r),PetscReal,r) 276 extern PetscErrorCode VecStrideScale(Vec,PetscInt,PetscScalar); 277 extern PetscErrorCode VecStrideSet(Vec,PetscInt,PetscScalar); 278 279 280 extern PetscErrorCode VecStrideGather(Vec,PetscInt,Vec,InsertMode); 281 extern PetscErrorCode VecStrideScatter(Vec,PetscInt,Vec,InsertMode); 282 extern PetscErrorCode VecStrideGatherAll(Vec,Vec[],InsertMode); 283 extern PetscErrorCode VecStrideScatterAll(Vec[],Vec,InsertMode); 284 285 extern PetscErrorCode VecSetValues(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode); 286 extern PetscErrorCode VecGetValues(Vec,PetscInt,const PetscInt[],PetscScalar[]); 287 extern PetscErrorCode VecAssemblyBegin(Vec); 288 extern PetscErrorCode VecAssemblyEnd(Vec); 289 extern PetscErrorCode VecStashSetInitialSize(Vec,PetscInt,PetscInt); 290 extern PetscErrorCode VecStashView(Vec,PetscViewer); 291 extern PetscErrorCode VecStashGetInfo(Vec,PetscInt*,PetscInt*,PetscInt*,PetscInt*); 292 293 /*MC 294 VecSetValue - Set a single entry into a vector. 295 296 Synopsis: 297 PetscErrorCode VecSetValue(Vec v,int row,PetscScalar value, InsertMode mode); 298 299 Not Collective 300 301 Input Parameters: 302 + v - the vector 303 . row - the row location of the entry 304 . value - the value to insert 305 - mode - either INSERT_VALUES or ADD_VALUES 306 307 Notes: 308 For efficiency one should use VecSetValues() and set several or 309 many values simultaneously if possible. 310 311 These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd() 312 MUST be called after all calls to VecSetValues() have been completed. 313 314 VecSetValues() uses 0-based indices in Fortran as well as in C. 315 316 Level: beginner 317 318 .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValueLocal() 319 M*/ 320 PETSC_STATIC_INLINE PetscErrorCode VecSetValue(Vec v,PetscInt i,PetscScalar va,InsertMode mode) {return VecSetValues(v,1,&i,&va,mode);} 321 322 323 extern PetscErrorCode VecSetBlockSize(Vec,PetscInt); 324 extern PetscErrorCode VecGetBlockSize(Vec,PetscInt*); 325 PetscPolymorphicFunction(VecGetBlockSize,(Vec x),(x,&i),PetscInt,i) 326 extern PetscErrorCode VecSetValuesBlocked(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode); 327 328 /* Dynamic creation and loading functions */ 329 extern PetscFList VecList; 330 extern PetscBool VecRegisterAllCalled; 331 extern PetscErrorCode VecSetType(Vec, const VecType); 332 extern PetscErrorCode VecGetType(Vec, const VecType *); 333 extern PetscErrorCode VecRegister(const char[],const char[],const char[],PetscErrorCode (*)(Vec)); 334 extern PetscErrorCode VecRegisterAll(const char []); 335 extern PetscErrorCode VecRegisterDestroy(void); 336 337 /*MC 338 VecRegisterDynamic - Adds a new vector component implementation 339 340 Synopsis: 341 PetscErrorCode VecRegisterDynamic(const char *name, const char *path, const char *func_name, PetscErrorCode (*create_func)(Vec)) 342 343 Not Collective 344 345 Input Parameters: 346 + name - The name of a new user-defined creation routine 347 . path - The path (either absolute or relative) of the library containing this routine 348 . func_name - The name of routine to create method context 349 - create_func - The creation routine itself 350 351 Notes: 352 VecRegisterDynamic() may be called multiple times to add several user-defined vectors 353 354 If dynamic libraries are used, then the fourth input argument (routine_create) is ignored. 355 356 Sample usage: 357 .vb 358 VecRegisterDynamic("my_vec","/home/username/my_lib/lib/libO/solaris/libmy.a", "MyVectorCreate", MyVectorCreate); 359 .ve 360 361 Then, your vector type can be chosen with the procedural interface via 362 .vb 363 VecCreate(MPI_Comm, Vec *); 364 VecSetType(Vec,"my_vector_name"); 365 .ve 366 or at runtime via the option 367 .vb 368 -vec_type my_vector_name 369 .ve 370 371 Notes: $PETSC_ARCH occuring in pathname will be replaced with appropriate values. 372 If your function is not being put into a shared library then use VecRegister() instead 373 374 Level: advanced 375 376 .keywords: Vec, register 377 .seealso: VecRegisterAll(), VecRegisterDestroy(), VecRegister() 378 M*/ 379 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 380 #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,0) 381 #else 382 #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,d) 383 #endif 384 385 386 extern PetscErrorCode VecScatterCreate(Vec,IS,Vec,IS,VecScatter *); 387 PetscPolymorphicFunction(VecScatterCreate,(Vec x,IS is1,Vec y,IS is2),(x,is1,y,is2,&s),VecScatter,s) 388 PetscPolymorphicSubroutine(VecScatterCreate,(Vec x,IS is,Vec y,VecScatter *s),(x,is,y,PETSC_NULL,s)) 389 PetscPolymorphicFunction(VecScatterCreate,(Vec x,IS is,Vec y),(x,is,y,PETSC_NULL,&s),VecScatter,s) 390 PetscPolymorphicSubroutine(VecScatterCreate,(Vec x,Vec y,IS is,VecScatter *s),(x,PETSC_NULL,y,is,s)) 391 PetscPolymorphicFunction(VecScatterCreate,(Vec x,Vec y,IS is),(x,PETSC_NULL,y,is,&s),VecScatter,s) 392 extern PetscErrorCode VecScatterCreateEmpty(MPI_Comm,VecScatter *); 393 extern PetscErrorCode VecScatterCreateLocal(VecScatter,PetscInt,const PetscInt[],const PetscInt[],const PetscInt[],PetscInt,const PetscInt[],const PetscInt[],const PetscInt[],PetscInt); 394 extern PetscErrorCode VecScatterBegin(VecScatter,Vec,Vec,InsertMode,ScatterMode); 395 extern PetscErrorCode VecScatterEnd(VecScatter,Vec,Vec,InsertMode,ScatterMode); 396 extern PetscErrorCode VecScatterDestroy(VecScatter*); 397 extern PetscErrorCode VecScatterCopy(VecScatter,VecScatter *); 398 extern PetscErrorCode VecScatterView(VecScatter,PetscViewer); 399 extern PetscErrorCode VecScatterRemap(VecScatter,PetscInt *,PetscInt*); 400 extern PetscErrorCode VecScatterGetMerged(VecScatter,PetscBool *); 401 402 extern PetscErrorCode VecGetArray4d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]); 403 extern PetscErrorCode VecRestoreArray4d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]); 404 extern PetscErrorCode VecGetArray3d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]); 405 extern PetscErrorCode VecRestoreArray3d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]); 406 extern PetscErrorCode VecGetArray2d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]); 407 extern PetscErrorCode VecRestoreArray2d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]); 408 extern PetscErrorCode VecGetArray1d(Vec,PetscInt,PetscInt,PetscScalar *[]); 409 extern PetscErrorCode VecRestoreArray1d(Vec,PetscInt,PetscInt,PetscScalar *[]); 410 411 extern PetscErrorCode VecPlaceArray(Vec,const PetscScalar[]); 412 extern PetscErrorCode VecResetArray(Vec); 413 extern PetscErrorCode VecReplaceArray(Vec,const PetscScalar[]); 414 extern PetscErrorCode VecGetArrays(const Vec[],PetscInt,PetscScalar**[]); 415 extern PetscErrorCode VecRestoreArrays(const Vec[],PetscInt,PetscScalar**[]); 416 417 extern PetscErrorCode VecView(Vec,PetscViewer); 418 extern PetscErrorCode VecViewFromOptions(Vec, const char *); 419 extern PetscErrorCode VecEqual(Vec,Vec,PetscBool *); 420 PetscPolymorphicFunction(VecEqual,(Vec x,Vec y),(x,y,&s),PetscBool ,s) 421 extern PetscErrorCode VecLoad(Vec, PetscViewer); 422 423 extern PetscErrorCode VecGetSize(Vec,PetscInt*); 424 PetscPolymorphicFunction(VecGetSize,(Vec x),(x,&s),PetscInt,s) 425 extern PetscErrorCode VecGetLocalSize(Vec,PetscInt*); 426 PetscPolymorphicFunction(VecGetLocalSize,(Vec x),(x,&s),PetscInt,s) 427 extern PetscErrorCode VecGetOwnershipRange(Vec,PetscInt*,PetscInt*); 428 extern PetscErrorCode VecGetOwnershipRanges(Vec,const PetscInt *[]); 429 430 extern PetscErrorCode VecSetLocalToGlobalMapping(Vec,ISLocalToGlobalMapping); 431 extern PetscErrorCode VecSetValuesLocal(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode); 432 433 /*MC 434 VecSetValueLocal - Set a single entry into a vector using the local numbering 435 436 Synopsis: 437 PetscErrorCode VecSetValueLocal(Vec v,int row,PetscScalar value, InsertMode mode); 438 439 Not Collective 440 441 Input Parameters: 442 + v - the vector 443 . row - the row location of the entry 444 . value - the value to insert 445 - mode - either INSERT_VALUES or ADD_VALUES 446 447 Notes: 448 For efficiency one should use VecSetValues() and set several or 449 many values simultaneously if possible. 450 451 These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd() 452 MUST be called after all calls to VecSetValues() have been completed. 453 454 VecSetValues() uses 0-based indices in Fortran as well as in C. 455 456 Level: beginner 457 458 .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValue() 459 M*/ 460 PETSC_STATIC_INLINE PetscErrorCode VecSetValueLocal(Vec v,PetscInt i,PetscScalar va,InsertMode mode) {return VecSetValuesLocal(v,1,&i,&va,mode);} 461 462 extern PetscErrorCode VecSetLocalToGlobalMappingBlock(Vec,ISLocalToGlobalMapping); 463 extern PetscErrorCode VecSetValuesBlockedLocal(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode); 464 extern PetscErrorCode VecGetLocalToGlobalMappingBlock(Vec,ISLocalToGlobalMapping*); 465 extern PetscErrorCode VecGetLocalToGlobalMapping(Vec,ISLocalToGlobalMapping*); 466 467 extern PetscErrorCode VecDotBegin(Vec,Vec,PetscScalar *); 468 PetscPolymorphicSubroutine(VecDotBegin,(Vec x,Vec y),(x,y,PETSC_NULL)) 469 extern PetscErrorCode VecDotEnd(Vec,Vec,PetscScalar *); 470 PetscPolymorphicFunction(VecDotEnd,(Vec x,Vec y),(x,y,&s),PetscScalar,s) 471 extern PetscErrorCode VecTDotBegin(Vec,Vec,PetscScalar *); 472 PetscPolymorphicSubroutine(VecTDotBegin,(Vec x,Vec y),(x,y,PETSC_NULL)) 473 extern PetscErrorCode VecTDotEnd(Vec,Vec,PetscScalar *); 474 PetscPolymorphicFunction(VecTDotEnd,(Vec x,Vec y),(x,y,&s),PetscScalar,s) 475 extern PetscErrorCode VecNormBegin(Vec,NormType,PetscReal *); 476 PetscPolymorphicSubroutine(VecNormBegin,(Vec x,NormType t),(x,t,PETSC_NULL)) 477 PetscPolymorphicSubroutine(VecNormBegin,(Vec x),(x,NORM_2,PETSC_NULL)) 478 extern PetscErrorCode VecNormEnd(Vec,NormType,PetscReal *); 479 PetscPolymorphicFunction(VecNormEnd,(Vec x,NormType t),(x,t,&s),PetscReal,s) 480 PetscPolymorphicFunction(VecNormEnd,(Vec x),(x,NORM_2,&s),PetscReal,s) 481 482 extern PetscErrorCode VecMDotBegin(Vec,PetscInt,const Vec[],PetscScalar[]); 483 extern PetscErrorCode VecMDotEnd(Vec,PetscInt,const Vec[],PetscScalar[]); 484 extern PetscErrorCode VecMTDotBegin(Vec,PetscInt,const Vec[],PetscScalar[]); 485 extern PetscErrorCode VecMTDotEnd(Vec,PetscInt,const Vec[],PetscScalar[]); 486 487 488 typedef enum {VEC_IGNORE_OFF_PROC_ENTRIES,VEC_IGNORE_NEGATIVE_INDICES} VecOption; 489 extern PetscErrorCode VecSetOption(Vec,VecOption,PetscBool ); 490 491 /* 492 Expose VecGetArray()/VecRestoreArray() to users. Allows this to work without any function 493 call overhead on any 'native' Vecs. 494 */ 495 496 #include "private/vecimpl.h" 497 498 extern PetscErrorCode VecContourScale(Vec,PetscReal,PetscReal); 499 500 /* 501 These numbers need to match the entries in 502 the function table in vecimpl.h 503 */ 504 typedef enum { VECOP_VIEW = 33, VECOP_LOAD = 41, VECOP_DUPLICATE = 0} VecOperation; 505 extern PetscErrorCode VecSetOperation(Vec,VecOperation,void(*)(void)); 506 507 /* 508 Routines for dealing with ghosted vectors: 509 vectors with ghost elements at the end of the array. 510 */ 511 extern PetscErrorCode VecMPISetGhost(Vec,PetscInt,const PetscInt[]); 512 extern PetscErrorCode VecCreateGhost(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*); 513 extern PetscErrorCode VecCreateGhostWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*); 514 extern PetscErrorCode VecCreateGhostBlock(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*); 515 extern PetscErrorCode VecCreateGhostBlockWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*); 516 extern PetscErrorCode VecGhostGetLocalForm(Vec,Vec*); 517 PetscPolymorphicFunction(VecGhostGetLocalForm,(Vec x),(x,&s),Vec,s) 518 extern PetscErrorCode VecGhostRestoreLocalForm(Vec,Vec*); 519 extern PetscErrorCode VecGhostUpdateBegin(Vec,InsertMode,ScatterMode); 520 extern PetscErrorCode VecGhostUpdateEnd(Vec,InsertMode,ScatterMode); 521 522 extern PetscErrorCode VecConjugate(Vec); 523 524 extern PetscErrorCode VecScatterCreateToAll(Vec,VecScatter*,Vec*); 525 extern PetscErrorCode VecScatterCreateToZero(Vec,VecScatter*,Vec*); 526 527 extern PetscErrorCode PetscViewerMathematicaGetVector(PetscViewer, Vec); 528 extern PetscErrorCode PetscViewerMathematicaPutVector(PetscViewer, Vec); 529 530 /*S 531 Vecs - Collection of vectors where the data for the vectors is stored in 532 one contiguous memory 533 534 Level: advanced 535 536 Notes: 537 Temporary construct for handling multiply right hand side solves 538 539 This is faked by storing a single vector that has enough array space for 540 n vectors 541 542 Concepts: parallel decomposition 543 544 S*/ 545 struct _n_Vecs {PetscInt n; Vec v;}; 546 typedef struct _n_Vecs* Vecs; 547 #define VecsDestroy(x) (VecDestroy(&(x)->v) || PetscFree(x)) 548 #define VecsCreateSeq(comm,p,m,x) (PetscNew(struct _n_Vecs,x) || VecCreateSeq(comm,p*m,&(*(x))->v) || (-1 == ((*(x))->n = (m)))) 549 #define VecsCreateSeqWithArray(comm,p,m,a,x) (PetscNew(struct _n_Vecs,x) || VecCreateSeqWithArray(comm,p*m,a,&(*(x))->v) || (-1 == ((*(x))->n = (m)))) 550 #define VecsDuplicate(x,y) (PetscNew(struct _n_Vecs,y) || VecDuplicate(x->v,&(*(y))->v) || (-1 == ((*(y))->n = (x)->n))) 551 552 #if defined(PETSC_HAVE_CUSP) 553 typedef struct _p_PetscCUSPIndices* PetscCUSPIndices; 554 extern PetscErrorCode PetscCUSPIndicesCreate(PetscInt,const PetscInt*,PetscCUSPIndices*); 555 extern PetscErrorCode PetscCUSPIndicesDestroy(PetscCUSPIndices*); 556 extern PetscErrorCode VecCUSPCopyToGPUSome_Public(Vec,PetscCUSPIndices); 557 extern PetscErrorCode VecCUSPCopyFromGPUSome_Public(Vec,PetscCUSPIndices); 558 559 extern PetscErrorCode VecCreateSeqCUSP(MPI_Comm,PetscInt,Vec*); 560 extern PetscErrorCode VecCreateMPICUSP(MPI_Comm,PetscInt,PetscInt,Vec*); 561 #endif 562 563 #if defined(PETSC_HAVE_PTHREADCLASSES) 564 extern PetscErrorCode VecSeqPThreadSetNThreads(Vec,PetscInt); 565 extern PetscErrorCode VecCreateSeqPThread(MPI_Comm,PetscInt,PetscInt,Vec*); 566 #endif 567 568 extern PetscErrorCode VecNestGetSubVecs(Vec,PetscInt*,Vec**); 569 extern PetscErrorCode VecNestGetSubVec(Vec,PetscInt,Vec*); 570 extern PetscErrorCode VecNestSetSubVecs(Vec,PetscInt,PetscInt*,Vec*); 571 extern PetscErrorCode VecNestSetSubVec(Vec,PetscInt,Vec); 572 extern PetscErrorCode VecCreateNest(MPI_Comm,PetscInt,IS*,Vec*,Vec*); 573 extern PetscErrorCode VecNestGetSize(Vec,PetscInt*); 574 575 PETSC_EXTERN_CXX_END 576 #endif 577 578