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 VecScatterInitializeForGPU(VecScatter,Vec,ScatterMode); 395 extern PetscErrorCode VecScatterFinalizeForGPU(VecScatter); 396 extern PetscErrorCode VecScatterBegin(VecScatter,Vec,Vec,InsertMode,ScatterMode); 397 extern PetscErrorCode VecScatterEnd(VecScatter,Vec,Vec,InsertMode,ScatterMode); 398 extern PetscErrorCode VecScatterDestroy(VecScatter*); 399 extern PetscErrorCode VecScatterCopy(VecScatter,VecScatter *); 400 extern PetscErrorCode VecScatterView(VecScatter,PetscViewer); 401 extern PetscErrorCode VecScatterRemap(VecScatter,PetscInt *,PetscInt*); 402 extern PetscErrorCode VecScatterGetMerged(VecScatter,PetscBool *); 403 404 extern PetscErrorCode VecGetArray4d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]); 405 extern PetscErrorCode VecRestoreArray4d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]); 406 extern PetscErrorCode VecGetArray3d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]); 407 extern PetscErrorCode VecRestoreArray3d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]); 408 extern PetscErrorCode VecGetArray2d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]); 409 extern PetscErrorCode VecRestoreArray2d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]); 410 extern PetscErrorCode VecGetArray1d(Vec,PetscInt,PetscInt,PetscScalar *[]); 411 extern PetscErrorCode VecRestoreArray1d(Vec,PetscInt,PetscInt,PetscScalar *[]); 412 413 extern PetscErrorCode VecPlaceArray(Vec,const PetscScalar[]); 414 extern PetscErrorCode VecResetArray(Vec); 415 extern PetscErrorCode VecReplaceArray(Vec,const PetscScalar[]); 416 extern PetscErrorCode VecGetArrays(const Vec[],PetscInt,PetscScalar**[]); 417 extern PetscErrorCode VecRestoreArrays(const Vec[],PetscInt,PetscScalar**[]); 418 419 extern PetscErrorCode VecView(Vec,PetscViewer); 420 extern PetscErrorCode VecViewFromOptions(Vec, const char *); 421 extern PetscErrorCode VecEqual(Vec,Vec,PetscBool *); 422 PetscPolymorphicFunction(VecEqual,(Vec x,Vec y),(x,y,&s),PetscBool ,s) 423 extern PetscErrorCode VecLoad(Vec, PetscViewer); 424 425 extern PetscErrorCode VecGetSize(Vec,PetscInt*); 426 PetscPolymorphicFunction(VecGetSize,(Vec x),(x,&s),PetscInt,s) 427 extern PetscErrorCode VecGetLocalSize(Vec,PetscInt*); 428 PetscPolymorphicFunction(VecGetLocalSize,(Vec x),(x,&s),PetscInt,s) 429 extern PetscErrorCode VecGetOwnershipRange(Vec,PetscInt*,PetscInt*); 430 extern PetscErrorCode VecGetOwnershipRanges(Vec,const PetscInt *[]); 431 432 extern PetscErrorCode VecSetLocalToGlobalMapping(Vec,ISLocalToGlobalMapping); 433 extern PetscErrorCode VecSetValuesLocal(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode); 434 435 /*MC 436 VecSetValueLocal - Set a single entry into a vector using the local numbering 437 438 Synopsis: 439 PetscErrorCode VecSetValueLocal(Vec v,int row,PetscScalar value, InsertMode mode); 440 441 Not Collective 442 443 Input Parameters: 444 + v - the vector 445 . row - the row location of the entry 446 . value - the value to insert 447 - mode - either INSERT_VALUES or ADD_VALUES 448 449 Notes: 450 For efficiency one should use VecSetValues() and set several or 451 many values simultaneously if possible. 452 453 These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd() 454 MUST be called after all calls to VecSetValues() have been completed. 455 456 VecSetValues() uses 0-based indices in Fortran as well as in C. 457 458 Level: beginner 459 460 .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValue() 461 M*/ 462 PETSC_STATIC_INLINE PetscErrorCode VecSetValueLocal(Vec v,PetscInt i,PetscScalar va,InsertMode mode) {return VecSetValuesLocal(v,1,&i,&va,mode);} 463 464 extern PetscErrorCode VecSetLocalToGlobalMappingBlock(Vec,ISLocalToGlobalMapping); 465 extern PetscErrorCode VecSetValuesBlockedLocal(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode); 466 extern PetscErrorCode VecGetLocalToGlobalMappingBlock(Vec,ISLocalToGlobalMapping*); 467 extern PetscErrorCode VecGetLocalToGlobalMapping(Vec,ISLocalToGlobalMapping*); 468 469 extern PetscErrorCode VecDotBegin(Vec,Vec,PetscScalar *); 470 PetscPolymorphicSubroutine(VecDotBegin,(Vec x,Vec y),(x,y,PETSC_NULL)) 471 extern PetscErrorCode VecDotEnd(Vec,Vec,PetscScalar *); 472 PetscPolymorphicFunction(VecDotEnd,(Vec x,Vec y),(x,y,&s),PetscScalar,s) 473 extern PetscErrorCode VecTDotBegin(Vec,Vec,PetscScalar *); 474 PetscPolymorphicSubroutine(VecTDotBegin,(Vec x,Vec y),(x,y,PETSC_NULL)) 475 extern PetscErrorCode VecTDotEnd(Vec,Vec,PetscScalar *); 476 PetscPolymorphicFunction(VecTDotEnd,(Vec x,Vec y),(x,y,&s),PetscScalar,s) 477 extern PetscErrorCode VecNormBegin(Vec,NormType,PetscReal *); 478 PetscPolymorphicSubroutine(VecNormBegin,(Vec x,NormType t),(x,t,PETSC_NULL)) 479 PetscPolymorphicSubroutine(VecNormBegin,(Vec x),(x,NORM_2,PETSC_NULL)) 480 extern PetscErrorCode VecNormEnd(Vec,NormType,PetscReal *); 481 PetscPolymorphicFunction(VecNormEnd,(Vec x,NormType t),(x,t,&s),PetscReal,s) 482 PetscPolymorphicFunction(VecNormEnd,(Vec x),(x,NORM_2,&s),PetscReal,s) 483 484 extern PetscErrorCode VecMDotBegin(Vec,PetscInt,const Vec[],PetscScalar[]); 485 extern PetscErrorCode VecMDotEnd(Vec,PetscInt,const Vec[],PetscScalar[]); 486 extern PetscErrorCode VecMTDotBegin(Vec,PetscInt,const Vec[],PetscScalar[]); 487 extern PetscErrorCode VecMTDotEnd(Vec,PetscInt,const Vec[],PetscScalar[]); 488 489 490 #if defined(PETSC_USE_DEBUG) 491 #define VecValidValues(vec,argnum,input) do { \ 492 PetscErrorCode _ierr; \ 493 PetscInt _n,_i; \ 494 const PetscScalar *_x; \ 495 \ 496 if (vec->petscnative || vec->ops->getarray) { \ 497 _ierr = VecGetLocalSize(vec,&_n);CHKERRQ(_ierr); \ 498 _ierr = VecGetArrayRead(vec,&_x);CHKERRQ(_ierr); \ 499 for (_i=0; _i<_n; _i++) { \ 500 if (input) { \ 501 if (PetscIsInfOrNanScalar(_x[_i])) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_FP,"Vec entry at local location %D is not-a-number or infinite at beginning of function: Parameter number %d",_i,argnum); \ 502 } else { \ 503 if (PetscIsInfOrNanScalar(_x[_i])) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_FP,"Vec entry at local location %D is not-a-number or infinite at end of function: Parameter number %d",_i,argnum); \ 504 } \ 505 } \ 506 _ierr = VecRestoreArrayRead(vec,&_x);CHKERRQ(_ierr); \ 507 } \ 508 } while (0) 509 #else 510 #define VecValidValues(vec,argnum,input) 511 #endif 512 513 514 typedef enum {VEC_IGNORE_OFF_PROC_ENTRIES,VEC_IGNORE_NEGATIVE_INDICES} VecOption; 515 extern PetscErrorCode VecSetOption(Vec,VecOption,PetscBool ); 516 517 /* 518 Expose VecGetArray()/VecRestoreArray() to users. Allows this to work without any function 519 call overhead on any 'native' Vecs. 520 */ 521 522 #include "private/vecimpl.h" 523 524 extern PetscErrorCode VecContourScale(Vec,PetscReal,PetscReal); 525 526 /* 527 These numbers need to match the entries in 528 the function table in vecimpl.h 529 */ 530 typedef enum { VECOP_VIEW = 33, VECOP_LOAD = 41, VECOP_DUPLICATE = 0} VecOperation; 531 extern PetscErrorCode VecSetOperation(Vec,VecOperation,void(*)(void)); 532 533 /* 534 Routines for dealing with ghosted vectors: 535 vectors with ghost elements at the end of the array. 536 */ 537 extern PetscErrorCode VecMPISetGhost(Vec,PetscInt,const PetscInt[]); 538 extern PetscErrorCode VecCreateGhost(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*); 539 extern PetscErrorCode VecCreateGhostWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*); 540 extern PetscErrorCode VecCreateGhostBlock(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*); 541 extern PetscErrorCode VecCreateGhostBlockWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*); 542 extern PetscErrorCode VecGhostGetLocalForm(Vec,Vec*); 543 PetscPolymorphicFunction(VecGhostGetLocalForm,(Vec x),(x,&s),Vec,s) 544 extern PetscErrorCode VecGhostRestoreLocalForm(Vec,Vec*); 545 extern PetscErrorCode VecGhostUpdateBegin(Vec,InsertMode,ScatterMode); 546 extern PetscErrorCode VecGhostUpdateEnd(Vec,InsertMode,ScatterMode); 547 548 extern PetscErrorCode VecConjugate(Vec); 549 550 extern PetscErrorCode VecScatterCreateToAll(Vec,VecScatter*,Vec*); 551 extern PetscErrorCode VecScatterCreateToZero(Vec,VecScatter*,Vec*); 552 553 extern PetscErrorCode PetscViewerMathematicaGetVector(PetscViewer, Vec); 554 extern PetscErrorCode PetscViewerMathematicaPutVector(PetscViewer, Vec); 555 556 /*S 557 Vecs - Collection of vectors where the data for the vectors is stored in 558 one contiguous memory 559 560 Level: advanced 561 562 Notes: 563 Temporary construct for handling multiply right hand side solves 564 565 This is faked by storing a single vector that has enough array space for 566 n vectors 567 568 Concepts: parallel decomposition 569 570 S*/ 571 struct _n_Vecs {PetscInt n; Vec v;}; 572 typedef struct _n_Vecs* Vecs; 573 #define VecsDestroy(x) (VecDestroy(&(x)->v) || PetscFree(x)) 574 #define VecsCreateSeq(comm,p,m,x) (PetscNew(struct _n_Vecs,x) || VecCreateSeq(comm,p*m,&(*(x))->v) || (-1 == ((*(x))->n = (m)))) 575 #define VecsCreateSeqWithArray(comm,p,m,a,x) (PetscNew(struct _n_Vecs,x) || VecCreateSeqWithArray(comm,p*m,a,&(*(x))->v) || (-1 == ((*(x))->n = (m)))) 576 #define VecsDuplicate(x,y) (PetscNew(struct _n_Vecs,y) || VecDuplicate(x->v,&(*(y))->v) || (-1 == ((*(y))->n = (x)->n))) 577 578 #if defined(PETSC_HAVE_CUSP) 579 typedef struct _p_PetscCUSPIndices* PetscCUSPIndices; 580 extern PetscErrorCode PetscCUSPIndicesCreate(PetscInt, PetscInt*,PetscInt, PetscInt*,PetscCUSPIndices*); 581 extern PetscErrorCode PetscCUSPIndicesDestroy(PetscCUSPIndices*); 582 extern PetscErrorCode VecCUSPCopyToGPUSome_Public(Vec,PetscCUSPIndices); 583 extern PetscErrorCode VecCUSPCopyFromGPUSome_Public(Vec,PetscCUSPIndices); 584 585 #if defined(PETSC_HAVE_TXPETSCGPU) 586 extern PetscErrorCode VecCUSPResetIndexBuffersFlagsGPU_Public(PetscCUSPIndices); 587 extern PetscErrorCode VecCUSPCopySomeToContiguousBufferGPU_Public(Vec,PetscCUSPIndices); 588 extern PetscErrorCode VecCUSPCopySomeFromContiguousBufferGPU_Public(Vec,PetscCUSPIndices); 589 #endif 590 591 extern PetscErrorCode VecCreateSeqCUSP(MPI_Comm,PetscInt,Vec*); 592 extern PetscErrorCode VecCreateMPICUSP(MPI_Comm,PetscInt,PetscInt,Vec*); 593 #endif 594 595 #if defined(PETSC_HAVE_PTHREADCLASSES) 596 extern PetscErrorCode VecPThreadSetNThreads(Vec,PetscInt); 597 extern PetscErrorCode VecPThreadGetNThreads(Vec,PetscInt*); 598 extern PetscErrorCode VecPThreadSetThreadAffinities(Vec,const PetscInt[]); 599 extern PetscErrorCode VecCreateSeqPThread(MPI_Comm,PetscInt,PetscInt,PetscInt[],Vec*); 600 extern PetscErrorCode VecCreateMPIPThread(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt[],Vec*); 601 #endif 602 603 extern PetscErrorCode VecNestGetSubVecs(Vec,PetscInt*,Vec**); 604 extern PetscErrorCode VecNestGetSubVec(Vec,PetscInt,Vec*); 605 extern PetscErrorCode VecNestSetSubVecs(Vec,PetscInt,PetscInt*,Vec*); 606 extern PetscErrorCode VecNestSetSubVec(Vec,PetscInt,Vec); 607 extern PetscErrorCode VecCreateNest(MPI_Comm,PetscInt,IS*,Vec*,Vec*); 608 extern PetscErrorCode VecNestGetSize(Vec,PetscInt*); 609 610 PETSC_EXTERN_CXX_END 611 #endif 612 613