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 #if defined(PETSC_USE_DEBUG) 489 #define VecValidValues(vec,argnum,input) do { \ 490 PetscErrorCode _ierr; \ 491 PetscInt _n,_i; \ 492 const PetscScalar *_x; \ 493 \ 494 if (vec->petscnative || vec->ops->getarray) { \ 495 _ierr = VecGetLocalSize(vec,&_n);CHKERRQ(_ierr); \ 496 _ierr = VecGetArrayRead(vec,&_x);CHKERRQ(_ierr); \ 497 for (_i=0; _i<_n; _i++) { \ 498 if (input) { \ 499 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); \ 500 } else { \ 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 end of function: Parameter number %d",_i,argnum); \ 502 } \ 503 } \ 504 _ierr = VecRestoreArrayRead(vec,&_x);CHKERRQ(_ierr); \ 505 } \ 506 } while (0) 507 #else 508 #define VecValidValues(vec,argnum,input) 509 #endif 510 511 512 typedef enum {VEC_IGNORE_OFF_PROC_ENTRIES,VEC_IGNORE_NEGATIVE_INDICES} VecOption; 513 extern PetscErrorCode VecSetOption(Vec,VecOption,PetscBool ); 514 515 /* 516 Expose VecGetArray()/VecRestoreArray() to users. Allows this to work without any function 517 call overhead on any 'native' Vecs. 518 */ 519 520 #include "private/vecimpl.h" 521 522 extern PetscErrorCode VecContourScale(Vec,PetscReal,PetscReal); 523 524 /* 525 These numbers need to match the entries in 526 the function table in vecimpl.h 527 */ 528 typedef enum { VECOP_VIEW = 33, VECOP_LOAD = 41, VECOP_DUPLICATE = 0} VecOperation; 529 extern PetscErrorCode VecSetOperation(Vec,VecOperation,void(*)(void)); 530 531 /* 532 Routines for dealing with ghosted vectors: 533 vectors with ghost elements at the end of the array. 534 */ 535 extern PetscErrorCode VecMPISetGhost(Vec,PetscInt,const PetscInt[]); 536 extern PetscErrorCode VecCreateGhost(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*); 537 extern PetscErrorCode VecCreateGhostWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*); 538 extern PetscErrorCode VecCreateGhostBlock(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*); 539 extern PetscErrorCode VecCreateGhostBlockWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*); 540 extern PetscErrorCode VecGhostGetLocalForm(Vec,Vec*); 541 PetscPolymorphicFunction(VecGhostGetLocalForm,(Vec x),(x,&s),Vec,s) 542 extern PetscErrorCode VecGhostRestoreLocalForm(Vec,Vec*); 543 extern PetscErrorCode VecGhostUpdateBegin(Vec,InsertMode,ScatterMode); 544 extern PetscErrorCode VecGhostUpdateEnd(Vec,InsertMode,ScatterMode); 545 546 extern PetscErrorCode VecConjugate(Vec); 547 548 extern PetscErrorCode VecScatterCreateToAll(Vec,VecScatter*,Vec*); 549 extern PetscErrorCode VecScatterCreateToZero(Vec,VecScatter*,Vec*); 550 551 extern PetscErrorCode PetscViewerMathematicaGetVector(PetscViewer, Vec); 552 extern PetscErrorCode PetscViewerMathematicaPutVector(PetscViewer, Vec); 553 554 /*S 555 Vecs - Collection of vectors where the data for the vectors is stored in 556 one contiguous memory 557 558 Level: advanced 559 560 Notes: 561 Temporary construct for handling multiply right hand side solves 562 563 This is faked by storing a single vector that has enough array space for 564 n vectors 565 566 Concepts: parallel decomposition 567 568 S*/ 569 struct _n_Vecs {PetscInt n; Vec v;}; 570 typedef struct _n_Vecs* Vecs; 571 #define VecsDestroy(x) (VecDestroy(&(x)->v) || PetscFree(x)) 572 #define VecsCreateSeq(comm,p,m,x) (PetscNew(struct _n_Vecs,x) || VecCreateSeq(comm,p*m,&(*(x))->v) || (-1 == ((*(x))->n = (m)))) 573 #define VecsCreateSeqWithArray(comm,p,m,a,x) (PetscNew(struct _n_Vecs,x) || VecCreateSeqWithArray(comm,p*m,a,&(*(x))->v) || (-1 == ((*(x))->n = (m)))) 574 #define VecsDuplicate(x,y) (PetscNew(struct _n_Vecs,y) || VecDuplicate(x->v,&(*(y))->v) || (-1 == ((*(y))->n = (x)->n))) 575 576 #if defined(PETSC_HAVE_CUSP) 577 typedef struct _p_PetscCUSPIndices* PetscCUSPIndices; 578 extern PetscErrorCode PetscCUSPIndicesCreate(PetscInt, PetscInt*,PetscInt, PetscInt*,PetscCUSPIndices*); 579 extern PetscErrorCode PetscCUSPIndicesDestroy(PetscCUSPIndices*); 580 extern PetscErrorCode VecCUSPCopyToGPUSome_Public(Vec,PetscCUSPIndices); 581 extern PetscErrorCode VecCUSPCopyFromGPUSome_Public(Vec,PetscCUSPIndices); 582 583 #if defined(PETSC_HAVE_TXPETSCGPU) 584 extern PetscErrorCode VecCUSPResetIndexBuffersFlagsGPU_Public(PetscCUSPIndices); 585 extern PetscErrorCode VecCUSPCopySomeToContiguousBufferGPU_Public(Vec,PetscCUSPIndices); 586 extern PetscErrorCode VecCUSPCopySomeFromContiguousBufferGPU_Public(Vec,PetscCUSPIndices); 587 extern PetscErrorCode VecScatterInitializeForGPU(VecScatter,Vec,ScatterMode); 588 extern PetscErrorCode VecScatterFinalizeForGPU(VecScatter); 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