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 #if !defined(PETSCVEC_H) 7 #define PETSCVEC_H 8 9 #include <petscsys.h> 10 #include <petscsftypes.h> /* for VecScatter, VecScatterType */ 11 #include <petscis.h> 12 #include <petscdevicetypes.h> 13 #include <petscviewer.h> 14 15 /* SUBMANSEC = Vec */ 16 17 /*S 18 Vec - Abstract PETSc vector object 19 20 Level: beginner 21 22 .seealso: `VecCreate()`, `VecType`, `VecSetType()` 23 S*/ 24 typedef struct _p_Vec* Vec; 25 26 /*E 27 ScatterMode - Determines the direction of a scatter 28 29 Level: beginner 30 31 .seealso: `VecScatter`, `VecScatterBegin()`, `VecScatterEnd()` 32 E*/ 33 typedef enum {SCATTER_FORWARD=0, SCATTER_REVERSE=1, SCATTER_FORWARD_LOCAL=2, SCATTER_REVERSE_LOCAL=3, SCATTER_LOCAL=2} ScatterMode; 34 35 /*MC 36 SCATTER_FORWARD - Scatters the values as dictated by the `VecScatterCreate()` call 37 38 Level: beginner 39 40 .seealso: `VecScatter`, `ScatterMode`, `VecScatterCreate()`, `VecScatterBegin()`, `VecScatterEnd()`, `SCATTER_REVERSE`, `SCATTER_FORWARD_LOCAL`, 41 `SCATTER_REVERSE_LOCAL` 42 43 M*/ 44 45 /*MC 46 SCATTER_REVERSE - Moves the values in the opposite direction then the directions indicated in 47 in the `VecScatterCreate()` 48 49 Level: beginner 50 51 .seealso: `VecScatter`, `ScatterMode`, `VecScatterCreate()`, `VecScatterBegin()`, `VecScatterEnd()`, `SCATTER_FORWARD`, `SCATTER_FORWARD_LOCAL`, 52 `SCATTER_REVERSE_LOCAL` 53 54 M*/ 55 56 /*MC 57 SCATTER_FORWARD_LOCAL - Scatters the values as dictated by the `VecScatterCreate()` call except NO parallel communication 58 is done. Any variables that have be moved between processes are ignored 59 60 Level: developer 61 62 .seealso: `VecScatter`, `ScatterMode`, `VecScatterCreate()`, `VecScatterBegin()`, `VecScatterEnd()`, `SCATTER_REVERSE`, `SCATTER_FORWARD`, 63 `SCATTER_REVERSE_LOCAL` 64 65 M*/ 66 67 /*MC 68 SCATTER_REVERSE_LOCAL - Moves the values in the opposite direction then the directions indicated in 69 in the `VecScatterCreate()` except NO parallel communication 70 is done. Any variables that have be moved between processes are ignored 71 72 Level: developer 73 74 .seealso: `VecScatter`, `ScatterMode`, `VecScatterCreate()`, `VecScatterBegin()`, `VecScatterEnd()`, `SCATTER_FORWARD`, `SCATTER_FORWARD_LOCAL`, 75 `SCATTER_REVERSE` 76 77 M*/ 78 79 /*J 80 VecType - String with the name of a PETSc vector 81 82 Level: beginner 83 84 .seealso: `VecSetType()`, `Vec`, `VecCreate()`, `VecDestroy()` 85 J*/ 86 typedef const char* VecType; 87 #define VECSEQ "seq" 88 #define VECMPI "mpi" 89 #define VECSTANDARD "standard" /* seq on one process and mpi on several */ 90 #define VECSHARED "shared" 91 #define VECSEQVIENNACL "seqviennacl" 92 #define VECMPIVIENNACL "mpiviennacl" 93 #define VECVIENNACL "viennacl" /* seqviennacl on one process and mpiviennacl on several */ 94 #define VECSEQCUDA "seqcuda" 95 #define VECMPICUDA "mpicuda" 96 #define VECCUDA "cuda" /* seqcuda on one process and mpicuda on several */ 97 #define VECSEQHIP "seqhip" 98 #define VECMPIHIP "mpihip" 99 #define VECHIP "hip" /* seqcuda on one process and mpicuda on several */ 100 #define VECNEST "nest" 101 #define VECSEQKOKKOS "seqkokkos" 102 #define VECMPIKOKKOS "mpikokkos" 103 #define VECKOKKOS "kokkos" /* seqkokkos on one process and mpikokkos on several */ 104 105 /* Dynamic creation and loading functions */ 106 PETSC_EXTERN PetscErrorCode VecScatterSetType(VecScatter, VecScatterType); 107 PETSC_EXTERN PetscErrorCode VecScatterGetType(VecScatter, VecScatterType*); 108 PETSC_EXTERN PetscErrorCode VecScatterSetFromOptions(VecScatter); 109 PETSC_EXTERN PetscErrorCode VecScatterRegister(const char[],PetscErrorCode (*)(VecScatter)); 110 PETSC_EXTERN PetscErrorCode VecScatterCreate(Vec,IS,Vec,IS,VecScatter*); 111 112 /* Logging support */ 113 #define REAL_FILE_CLASSID 1211213 114 #define VEC_FILE_CLASSID 1211214 115 PETSC_EXTERN PetscClassId VEC_CLASSID; 116 PETSC_EXTERN PetscClassId PETSCSF_CLASSID; 117 118 PETSC_EXTERN PetscErrorCode VecInitializePackage(void); 119 PETSC_EXTERN PetscErrorCode VecFinalizePackage(void); 120 121 PETSC_EXTERN PetscErrorCode VecCreate(MPI_Comm,Vec*); 122 PETSC_EXTERN PetscErrorCode VecCreateSeq(MPI_Comm,PetscInt,Vec*); 123 PETSC_EXTERN PetscErrorCode VecCreateMPI(MPI_Comm,PetscInt,PetscInt,Vec*); 124 PETSC_EXTERN PetscErrorCode VecCreateSeqWithArray(MPI_Comm,PetscInt,PetscInt,const PetscScalar[],Vec*); 125 PETSC_EXTERN PetscErrorCode VecCreateMPIWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscScalar[],Vec*); 126 PETSC_EXTERN PetscErrorCode VecCreateShared(MPI_Comm,PetscInt,PetscInt,Vec*); 127 PETSC_EXTERN PetscErrorCode VecCreateNode(MPI_Comm,PetscInt,PetscInt,Vec*); 128 129 PETSC_EXTERN PetscErrorCode VecSetFromOptions(Vec); 130 PETSC_EXTERN PetscErrorCode VecViewFromOptions(Vec,PetscObject,const char[]); 131 132 PETSC_EXTERN PetscErrorCode VecSetUp(Vec); 133 PETSC_EXTERN PetscErrorCode VecDestroy(Vec*); 134 PETSC_EXTERN PetscErrorCode VecZeroEntries(Vec); 135 PETSC_EXTERN PetscErrorCode VecSetOptionsPrefix(Vec,const char[]); 136 PETSC_EXTERN PetscErrorCode VecAppendOptionsPrefix(Vec,const char[]); 137 PETSC_EXTERN PetscErrorCode VecGetOptionsPrefix(Vec,const char*[]); 138 139 PETSC_EXTERN PetscErrorCode VecSetSizes(Vec,PetscInt,PetscInt); 140 141 PETSC_EXTERN PetscErrorCode VecDotNorm2(Vec,Vec,PetscScalar*,PetscReal*); 142 PETSC_EXTERN PetscErrorCode VecDot(Vec,Vec,PetscScalar*); 143 PETSC_EXTERN PetscErrorCode VecDotRealPart(Vec,Vec,PetscReal*); 144 PETSC_EXTERN PetscErrorCode VecTDot(Vec,Vec,PetscScalar*); 145 PETSC_EXTERN PetscErrorCode VecMDot(Vec,PetscInt,const Vec[],PetscScalar[]); 146 PETSC_EXTERN PetscErrorCode VecMTDot(Vec,PetscInt,const Vec[],PetscScalar[]); 147 PETSC_EXTERN PetscErrorCode VecGetSubVector(Vec,IS,Vec*); 148 PETSC_EXTERN PetscErrorCode VecRestoreSubVector(Vec,IS,Vec*); 149 PETSC_EXTERN PetscErrorCode VecConcatenate(PetscInt,const Vec[],Vec*,IS*[]); 150 151 /*E 152 NormType - determines what type of norm to compute 153 154 Level: beginner 155 156 .seealso: `VecNorm()`, `VecNormBegin()`, `VecNormEnd()`, `MatNorm()` 157 E*/ 158 typedef enum {NORM_1=0, 159 NORM_2=1, 160 NORM_FROBENIUS=2, 161 NORM_INFINITY=3, 162 NORM_1_AND_2=4 163 } NormType; 164 PETSC_EXTERN const char *const NormTypes[]; 165 #define NORM_MAX NORM_INFINITY 166 167 /*MC 168 NORM_1 - the one norm, ||v|| = sum_i | v_i |. ||A|| = max_j || v_*j ||, maximum column sum 169 170 Level: beginner 171 172 .seealso: `NormType`, `MatNorm()`, `VecNorm()`, `VecNormBegin()`, `VecNormEnd()`, `NORM_2`, `NORM_FROBENIUS`, 173 `NORM_INFINITY`, `NORM_1_AND_2` 174 175 M*/ 176 177 /*MC 178 NORM_2 - the two norm, ||v|| = sqrt(sum_i |v_i|^2) (vectors only) 179 180 Level: beginner 181 182 .seealso: `NormType`, `MatNorm()`, `VecNorm()`, `VecNormBegin()`, `VecNormEnd()`, `NORM_1`, `NORM_FROBENIUS`, 183 `NORM_INFINITY`, `NORM_1_AND_2` 184 185 M*/ 186 187 /*MC 188 NORM_FROBENIUS - ||A|| = sqrt(sum_ij |A_ij|^2), same as `NORM_2` for vectors 189 190 Level: beginner 191 192 .seealso: `NormType`, `MatNorm()`, `VecNorm()`, `VecNormBegin()`, `VecNormEnd()`, `NORM_1`, `NORM_2`, 193 `NORM_INFINITY`, `NORM_1_AND_2` 194 195 M*/ 196 197 /*MC 198 NORM_INFINITY - ||v|| = max_i |v_i|. ||A|| = max_i || v_i* ||, maximum row sum 199 200 Level: beginner 201 202 .seealso: `NormType`, `MatNorm()`, `VecNorm()`, `VecNormBegin()`, `VecNormEnd()`, `NORM_1`, `NORM_2`, 203 `NORM_FROBENIUS`, `NORM_1_AND_2` 204 205 M*/ 206 207 /*MC 208 NORM_1_AND_2 - computes both the 1 and 2 norm of a vector 209 210 Level: beginner 211 212 .seealso: `NormType`, `MatNorm()`, `VecNorm()`, `VecNormBegin()`, `VecNormEnd()`, `NORM_1`, `NORM_2`, 213 `NORM_FROBENIUS`, `NORM_INFINITY` 214 215 M*/ 216 217 /*MC 218 NORM_MAX - see `NORM_INFINITY` 219 220 Level: beginner 221 222 M*/ 223 224 /*E 225 ReductionType - determines what type of column reduction (one that is not a type of norm defined in `NormType`) to compute 226 227 Level: beginner 228 229 .seealso: `MatGetColumnReductions()`, `MatGetColumnNorms()`, `NormType` 230 E*/ 231 /* NOTE: The integer constants defined in ReductionType MUST BE DISTINCT from those defined in NormType. 232 * This is because MatGetColumnReductions() is used to compute both norms and other types of reductions, 233 * and the constants defined in both NormType and ReductionType are used to designate the desired operation. */ 234 typedef enum {REDUCTION_SUM_REALPART=10, 235 REDUCTION_MEAN_REALPART=11, 236 REDUCTION_SUM_IMAGINARYPART=12, 237 REDUCTION_MEAN_IMAGINARYPART=13 238 } ReductionType; 239 240 /*MC 241 REDUCTION_SUM_REALPART - sum of real part of matrix column 242 243 Level: beginner 244 245 .seealso: `ReductionType`, `MatGetColumnReductions()`, `REDUCTION_SUM_IMAGINARYPART`, `REDUCTION_MEAN_REALPART`, `REDUCTION_NORM_1`, 246 `REDUCTION_NORM_2`, `REDUCTION_NORM_FROBENIUS`, `REDUCTION_NORM_INFINITY` 247 248 M*/ 249 250 /*MC 251 REDUCTION_SUM_IMAGINARYPART - sum of imaginary part of matrix column 252 253 Level: beginner 254 255 .seealso: `ReductionType`, `MatGetColumnReductions()`, `REDUCTION_SUM_REALPART`, `REDUCTION_MEAN_IMAGINARYPART`, `REDUCTION_NORM_1`, 256 `REDUCTION_NORM_2`, `REDUCTION_NORM_FROBENIUS`, `REDUCTION_NORM_INFINITY` 257 258 M*/ 259 260 /*MC 261 REDUCTION_MEAN_REALPART - arithmetic mean of real part of matrix column 262 263 Level: beginner 264 265 .seealso: `ReductionType`, `MatGetColumnReductions()`, `REDUCTION_MEAN_IMAGINARYPART`, `REDUCTION_SUM_REALPART`, `REDUCTION_NORM_1`, 266 `REDUCTION_NORM_2`, `REDUCTION_NORM_FROBENIUS`, `REDUCTION_NORM_INFINITY` 267 268 M*/ 269 270 /*MC 271 REDUCTION_MEAN_IMAGINARYPART - arithmetic mean of imaginary part of matrix column 272 273 Level: beginner 274 275 .seealso: `ReductionType`, `MatGetColumnReductions()`, `REDUCTION_MEAN_REALPART`, `REDUCTION_SUM_IMAGINARYPART`, `REDUCTION_NORM_1`, 276 `REDUCTION_NORM_2`, `REDUCTION_NORM_FROBENIUS`, `REDUCTION_NORM_INFINITY` 277 278 M*/ 279 280 PETSC_EXTERN PetscErrorCode VecNorm(Vec,NormType,PetscReal *); 281 PETSC_EXTERN PetscErrorCode VecNormAvailable(Vec,NormType,PetscBool *,PetscReal *); 282 PETSC_EXTERN PetscErrorCode VecNormalize(Vec,PetscReal *); 283 PETSC_EXTERN PetscErrorCode VecSum(Vec,PetscScalar*); 284 PETSC_EXTERN PetscErrorCode VecMean(Vec,PetscScalar*); 285 PETSC_EXTERN PetscErrorCode VecMax(Vec,PetscInt*,PetscReal *); 286 PETSC_EXTERN PetscErrorCode VecMin(Vec,PetscInt*,PetscReal *); 287 PETSC_EXTERN PetscErrorCode VecScale(Vec,PetscScalar); 288 PETSC_EXTERN PetscErrorCode VecCopy(Vec,Vec); 289 PETSC_EXTERN PetscErrorCode VecSetRandom(Vec,PetscRandom); 290 PETSC_EXTERN PetscErrorCode VecSet(Vec,PetscScalar); 291 PETSC_EXTERN PetscErrorCode VecSetInf(Vec); 292 PETSC_EXTERN PetscErrorCode VecSwap(Vec,Vec); 293 PETSC_EXTERN PetscErrorCode VecAXPY(Vec,PetscScalar,Vec); 294 PETSC_EXTERN PetscErrorCode VecAXPBY(Vec,PetscScalar,PetscScalar,Vec); 295 PETSC_EXTERN PetscErrorCode VecMAXPY(Vec,PetscInt,const PetscScalar[],Vec[]); 296 PETSC_EXTERN PetscErrorCode VecAYPX(Vec,PetscScalar,Vec); 297 PETSC_EXTERN PetscErrorCode VecWAXPY(Vec,PetscScalar,Vec,Vec); 298 PETSC_EXTERN PetscErrorCode VecAXPBYPCZ(Vec,PetscScalar,PetscScalar,PetscScalar,Vec,Vec); 299 PETSC_EXTERN PetscErrorCode VecPointwiseMax(Vec,Vec,Vec); 300 PETSC_EXTERN PetscErrorCode VecPointwiseMaxAbs(Vec,Vec,Vec); 301 PETSC_EXTERN PetscErrorCode VecPointwiseMin(Vec,Vec,Vec); 302 PETSC_EXTERN PetscErrorCode VecPointwiseMult(Vec,Vec,Vec); 303 PETSC_EXTERN PetscErrorCode VecPointwiseDivide(Vec,Vec,Vec); 304 PETSC_EXTERN PetscErrorCode VecMaxPointwiseDivide(Vec,Vec,PetscReal*); 305 PETSC_EXTERN PetscErrorCode VecShift(Vec,PetscScalar); 306 PETSC_EXTERN PetscErrorCode VecReciprocal(Vec); 307 PETSC_EXTERN PetscErrorCode VecPermute(Vec, IS, PetscBool); 308 PETSC_EXTERN PetscErrorCode VecSqrtAbs(Vec); 309 PETSC_EXTERN PetscErrorCode VecLog(Vec); 310 PETSC_EXTERN PetscErrorCode VecExp(Vec); 311 PETSC_EXTERN PetscErrorCode VecAbs(Vec); 312 PETSC_EXTERN PetscErrorCode VecDuplicate(Vec,Vec*); 313 PETSC_EXTERN PetscErrorCode VecDuplicateVecs(Vec,PetscInt,Vec*[]); 314 PETSC_EXTERN PetscErrorCode VecDestroyVecs(PetscInt, Vec*[]); 315 PETSC_EXTERN PetscErrorCode VecStrideNormAll(Vec,NormType,PetscReal[]); 316 PETSC_EXTERN PetscErrorCode VecStrideMaxAll(Vec,PetscInt [],PetscReal []); 317 PETSC_EXTERN PetscErrorCode VecStrideMinAll(Vec,PetscInt [],PetscReal []); 318 PETSC_EXTERN PetscErrorCode VecStrideScaleAll(Vec,const PetscScalar[]); 319 PETSC_EXTERN PetscErrorCode VecStrideSumAll(Vec,PetscScalar*); 320 PETSC_EXTERN PetscErrorCode VecUniqueEntries(Vec,PetscInt*,PetscScalar**); 321 322 PETSC_EXTERN PetscErrorCode VecStrideNorm(Vec,PetscInt,NormType,PetscReal*); 323 PETSC_EXTERN PetscErrorCode VecStrideMax(Vec,PetscInt,PetscInt *,PetscReal *); 324 PETSC_EXTERN PetscErrorCode VecStrideMin(Vec,PetscInt,PetscInt *,PetscReal *); 325 PETSC_EXTERN PetscErrorCode VecStrideScale(Vec,PetscInt,PetscScalar); 326 PETSC_EXTERN PetscErrorCode VecStrideSum(Vec,PetscInt,PetscScalar*); 327 PETSC_EXTERN PetscErrorCode VecStrideSet(Vec,PetscInt,PetscScalar); 328 329 PETSC_EXTERN PetscErrorCode VecStrideGather(Vec,PetscInt,Vec,InsertMode); 330 PETSC_EXTERN PetscErrorCode VecStrideScatter(Vec,PetscInt,Vec,InsertMode); 331 PETSC_EXTERN PetscErrorCode VecStrideGatherAll(Vec,Vec[],InsertMode); 332 PETSC_EXTERN PetscErrorCode VecStrideScatterAll(Vec[],Vec,InsertMode); 333 334 PETSC_EXTERN PetscErrorCode VecStrideSubSetScatter(Vec,PetscInt,const PetscInt[],const PetscInt[],Vec,InsertMode); 335 PETSC_EXTERN PetscErrorCode VecStrideSubSetGather(Vec,PetscInt,const PetscInt[],const PetscInt[],Vec,InsertMode); 336 337 PETSC_EXTERN PetscErrorCode VecSetValues(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode); 338 PETSC_EXTERN PetscErrorCode VecGetValues(Vec,PetscInt,const PetscInt[],PetscScalar[]); 339 PETSC_EXTERN PetscErrorCode VecAssemblyBegin(Vec); 340 PETSC_EXTERN PetscErrorCode VecAssemblyEnd(Vec); 341 PETSC_EXTERN PetscErrorCode VecStashSetInitialSize(Vec,PetscInt,PetscInt); 342 PETSC_EXTERN PetscErrorCode VecStashView(Vec,PetscViewer); 343 PETSC_EXTERN PetscErrorCode VecStashViewFromOptions(Vec,PetscObject,const char[]); 344 PETSC_EXTERN PetscErrorCode VecStashGetInfo(Vec,PetscInt*,PetscInt*,PetscInt*,PetscInt*); 345 346 PETSC_EXTERN PetscErrorCode VecSetPreallocationCOO(Vec,PetscCount,const PetscInt[]); 347 PETSC_EXTERN PetscErrorCode VecSetPreallocationCOOLocal(Vec,PetscCount,PetscInt[]); 348 PETSC_EXTERN PetscErrorCode VecSetValuesCOO(Vec,const PetscScalar[],InsertMode); 349 350 /*MC 351 VecSetValue - Set a single entry into a vector. 352 353 Synopsis: 354 #include <petscvec.h> 355 PetscErrorCode VecSetValue(Vec v,PetscInt row,PetscScalar value, InsertMode mode); 356 357 Not Collective 358 359 Input Parameters: 360 + v - the vector 361 . row - the row location of the entry 362 . value - the value to insert 363 - mode - either `INSERT_VALUES` or `ADD_VALUES` 364 365 Notes: 366 For efficiency one should use `VecSetValues()` and set several or 367 many values simultaneously if possible. 368 369 These values may be cached, so `VecAssemblyBegin()` and `VecAssemblyEnd()` 370 MUST be called after all calls to `VecSetValue()` have been completed. 371 372 `VecSetValue()` uses 0-based indices in Fortran as well as in C. 373 374 Level: beginner 375 376 .seealso: `VecSetValues()`, `VecAssemblyBegin()`, `VecAssemblyEnd()`, `VecSetValuesBlockedLocal()`, `VecSetValueLocal()` 377 M*/ 378 static inline PetscErrorCode VecSetValue(Vec v,PetscInt i,PetscScalar va,InsertMode mode) {return VecSetValues(v,1,&i,&va,mode);} 379 380 PETSC_EXTERN PetscErrorCode VecSetBlockSize(Vec,PetscInt); 381 PETSC_EXTERN PetscErrorCode VecGetBlockSize(Vec,PetscInt*); 382 PETSC_EXTERN PetscErrorCode VecSetValuesBlocked(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode); 383 384 /* Dynamic creation and loading functions */ 385 PETSC_EXTERN PetscFunctionList VecList; 386 PETSC_EXTERN PetscErrorCode VecSetType(Vec,VecType); 387 PETSC_EXTERN PetscErrorCode VecGetType(Vec,VecType*); 388 PETSC_EXTERN PetscErrorCode VecRegister(const char[],PetscErrorCode (*)(Vec)); 389 390 PETSC_EXTERN PetscErrorCode VecScatterBegin(VecScatter,Vec,Vec,InsertMode,ScatterMode); 391 PETSC_EXTERN PetscErrorCode VecScatterEnd(VecScatter,Vec,Vec,InsertMode,ScatterMode); 392 PETSC_EXTERN PetscErrorCode VecScatterDestroy(VecScatter*); 393 PETSC_EXTERN PetscErrorCode VecScatterSetUp(VecScatter); 394 PETSC_EXTERN PetscErrorCode VecScatterCopy(VecScatter,VecScatter *); 395 PETSC_EXTERN PetscErrorCode VecScatterView(VecScatter,PetscViewer); 396 PETSC_EXTERN PetscErrorCode VecScatterViewFromOptions(VecScatter,PetscObject,const char[]); 397 PETSC_EXTERN PetscErrorCode VecScatterRemap(VecScatter,PetscInt[],PetscInt[]); 398 PETSC_EXTERN PetscErrorCode VecScatterGetMerged(VecScatter,PetscBool*); 399 400 PETSC_EXTERN PetscErrorCode VecGetArray4d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]); 401 PETSC_EXTERN PetscErrorCode VecRestoreArray4d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]); 402 PETSC_EXTERN PetscErrorCode VecGetArray3d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]); 403 PETSC_EXTERN PetscErrorCode VecRestoreArray3d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]); 404 PETSC_EXTERN PetscErrorCode VecGetArray2d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]); 405 PETSC_EXTERN PetscErrorCode VecRestoreArray2d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]); 406 PETSC_EXTERN PetscErrorCode VecGetArray1d(Vec,PetscInt,PetscInt,PetscScalar*[]); 407 PETSC_EXTERN PetscErrorCode VecRestoreArray1d(Vec,PetscInt,PetscInt,PetscScalar*[]); 408 409 PETSC_EXTERN PetscErrorCode VecGetArray4dWrite(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]); 410 PETSC_EXTERN PetscErrorCode VecGetArray4dWrite(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]); 411 PETSC_EXTERN PetscErrorCode VecRestoreArray4dWrite(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]); 412 PETSC_EXTERN PetscErrorCode VecGetArray3dWrite(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]); 413 PETSC_EXTERN PetscErrorCode VecRestoreArray3dWrite(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]); 414 PETSC_EXTERN PetscErrorCode VecGetArray2dWrite(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]); 415 PETSC_EXTERN PetscErrorCode VecRestoreArray2dWrite(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]); 416 PETSC_EXTERN PetscErrorCode VecGetArray1dWrite(Vec,PetscInt,PetscInt,PetscScalar*[]); 417 PETSC_EXTERN PetscErrorCode VecRestoreArray1dWrite(Vec,PetscInt,PetscInt,PetscScalar*[]); 418 419 PETSC_EXTERN PetscErrorCode VecGetArray4dRead(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]); 420 PETSC_EXTERN PetscErrorCode VecRestoreArray4dRead(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]); 421 PETSC_EXTERN PetscErrorCode VecGetArray3dRead(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]); 422 PETSC_EXTERN PetscErrorCode VecRestoreArray3dRead(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]); 423 PETSC_EXTERN PetscErrorCode VecGetArray2dRead(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]); 424 PETSC_EXTERN PetscErrorCode VecRestoreArray2dRead(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]); 425 PETSC_EXTERN PetscErrorCode VecGetArray1dRead(Vec,PetscInt,PetscInt,PetscScalar*[]); 426 PETSC_EXTERN PetscErrorCode VecRestoreArray1dRead(Vec,PetscInt,PetscInt,PetscScalar*[]); 427 428 PETSC_EXTERN PetscErrorCode VecPlaceArray(Vec,const PetscScalar[]); 429 PETSC_EXTERN PetscErrorCode VecResetArray(Vec); 430 PETSC_EXTERN PetscErrorCode VecReplaceArray(Vec,const PetscScalar[]); 431 432 PETSC_EXTERN PetscErrorCode VecGetArrays(const Vec[],PetscInt,PetscScalar**[]); 433 PETSC_EXTERN PetscErrorCode VecRestoreArrays(const Vec[],PetscInt,PetscScalar**[]); 434 435 PETSC_EXTERN PetscErrorCode VecView(Vec,PetscViewer); 436 PETSC_EXTERN PetscErrorCode VecViewNative(Vec,PetscViewer); 437 PETSC_EXTERN PetscErrorCode VecEqual(Vec,Vec,PetscBool*); 438 PETSC_EXTERN PetscErrorCode VecLoad(Vec,PetscViewer); 439 440 PETSC_EXTERN PetscErrorCode VecGetSize(Vec,PetscInt*); 441 PETSC_EXTERN PetscErrorCode VecGetLocalSize(Vec,PetscInt*); 442 PETSC_EXTERN PetscErrorCode VecGetOwnershipRange(Vec,PetscInt*,PetscInt*); 443 PETSC_EXTERN PetscErrorCode VecGetOwnershipRanges(Vec,const PetscInt*[]); 444 445 PETSC_EXTERN PetscErrorCode VecSetLocalToGlobalMapping(Vec,ISLocalToGlobalMapping); 446 PETSC_EXTERN PetscErrorCode VecSetValuesLocal(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode); 447 448 PETSC_EXTERN PetscErrorCode VecCUDAGetArray(Vec,PetscScalar**); 449 PETSC_EXTERN PetscErrorCode VecCUDARestoreArray(Vec,PetscScalar**); 450 451 PETSC_EXTERN PetscErrorCode VecCUDAGetArrayRead(Vec,const PetscScalar**); 452 PETSC_EXTERN PetscErrorCode VecCUDARestoreArrayRead(Vec,const PetscScalar**); 453 454 PETSC_EXTERN PetscErrorCode VecCUDAGetArrayWrite(Vec,PetscScalar**); 455 PETSC_EXTERN PetscErrorCode VecCUDARestoreArrayWrite(Vec,PetscScalar**); 456 457 PETSC_EXTERN PetscErrorCode VecCUDAPlaceArray(Vec,const PetscScalar[]); 458 PETSC_EXTERN PetscErrorCode VecCUDAReplaceArray(Vec,const PetscScalar[]); 459 PETSC_EXTERN PetscErrorCode VecCUDAResetArray(Vec); 460 461 PETSC_EXTERN PetscErrorCode VecHIPGetArray(Vec,PetscScalar**); 462 PETSC_EXTERN PetscErrorCode VecHIPRestoreArray(Vec,PetscScalar**); 463 464 PETSC_EXTERN PetscErrorCode VecHIPGetArrayRead(Vec,const PetscScalar**); 465 PETSC_EXTERN PetscErrorCode VecHIPRestoreArrayRead(Vec,const PetscScalar**); 466 467 PETSC_EXTERN PetscErrorCode VecHIPGetArrayWrite(Vec,PetscScalar**); 468 PETSC_EXTERN PetscErrorCode VecHIPRestoreArrayWrite(Vec,PetscScalar**); 469 470 PETSC_EXTERN PetscErrorCode VecHIPPlaceArray(Vec,const PetscScalar[]); 471 PETSC_EXTERN PetscErrorCode VecHIPReplaceArray(Vec,const PetscScalar[]); 472 PETSC_EXTERN PetscErrorCode VecHIPResetArray(Vec); 473 474 PETSC_EXTERN PetscErrorCode VecViennaCLGetCLContext(Vec, PETSC_UINTPTR_T*); 475 PETSC_EXTERN PetscErrorCode VecViennaCLGetCLQueue(Vec, PETSC_UINTPTR_T*); 476 PETSC_EXTERN PetscErrorCode VecViennaCLGetCLMemRead(Vec, PETSC_UINTPTR_T*); 477 PETSC_EXTERN PetscErrorCode VecViennaCLGetCLMemWrite(Vec, PETSC_UINTPTR_T*); 478 PETSC_EXTERN PetscErrorCode VecViennaCLRestoreCLMemWrite(Vec); 479 PETSC_EXTERN PetscErrorCode VecViennaCLGetCLMem(Vec, PETSC_UINTPTR_T*); 480 PETSC_EXTERN PetscErrorCode VecViennaCLRestoreCLMem(Vec); 481 482 /*MC 483 VecSetValueLocal - Set a single entry into a vector using the local numbering 484 485 Synopsis: 486 #include <petscvec.h> 487 PetscErrorCode VecSetValueLocal(Vec v,PetscInt row,PetscScalar value, InsertMode mode); 488 489 Not Collective 490 491 Input Parameters: 492 + v - the vector 493 . row - the row location of the entry 494 . value - the value to insert 495 - mode - either `INSERT_VALUES` or `ADD_VALUES` 496 497 Notes: 498 For efficiency one should use `VecSetValues()` and set several or 499 many values simultaneously if possible. 500 501 These values may be cached, so `VecAssemblyBegin()` and `VecAssemblyEnd()` 502 MUST be called after all calls to `VecSetValues()` have been completed. 503 504 `VecSetValues()` uses 0-based indices in Fortran as well as in C. 505 506 Level: beginner 507 508 .seealso: `VecSetValues()`, `VecAssemblyBegin()`, `VecAssemblyEnd()`, `VecSetValuesBlockedLocal()`, `VecSetValue()` 509 M*/ 510 static inline PetscErrorCode VecSetValueLocal(Vec v,PetscInt i,PetscScalar va,InsertMode mode) {return VecSetValuesLocal(v,1,&i,&va,mode);} 511 512 PETSC_EXTERN PetscErrorCode VecSetValuesBlockedLocal(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode); 513 PETSC_EXTERN PetscErrorCode VecGetLocalToGlobalMapping(Vec,ISLocalToGlobalMapping*); 514 515 PETSC_EXTERN PetscErrorCode VecDotBegin(Vec,Vec,PetscScalar *); 516 PETSC_EXTERN PetscErrorCode VecDotEnd(Vec,Vec,PetscScalar *); 517 PETSC_EXTERN PetscErrorCode VecTDotBegin(Vec,Vec,PetscScalar *); 518 PETSC_EXTERN PetscErrorCode VecTDotEnd(Vec,Vec,PetscScalar *); 519 PETSC_EXTERN PetscErrorCode VecNormBegin(Vec,NormType,PetscReal *); 520 PETSC_EXTERN PetscErrorCode VecNormEnd(Vec,NormType,PetscReal *); 521 522 PETSC_EXTERN PetscErrorCode VecMDotBegin(Vec,PetscInt,const Vec[],PetscScalar[]); 523 PETSC_EXTERN PetscErrorCode VecMDotEnd(Vec,PetscInt,const Vec[],PetscScalar[]); 524 PETSC_EXTERN PetscErrorCode VecMTDotBegin(Vec,PetscInt,const Vec[],PetscScalar[]); 525 PETSC_EXTERN PetscErrorCode VecMTDotEnd(Vec,PetscInt,const Vec[],PetscScalar[]); 526 PETSC_EXTERN PetscErrorCode PetscCommSplitReductionBegin(MPI_Comm); 527 528 PETSC_EXTERN PetscErrorCode VecBindToCPU(Vec,PetscBool); 529 PETSC_DEPRECATED_FUNCTION("Use VecBindToCPU (since v3.13)") static inline PetscErrorCode VecPinToCPU(Vec v,PetscBool flg) {return VecBindToCPU(v,flg);} 530 PETSC_EXTERN PetscErrorCode VecBoundToCPU(Vec,PetscBool*); 531 PETSC_EXTERN PetscErrorCode VecSetBindingPropagates(Vec,PetscBool); 532 PETSC_EXTERN PetscErrorCode VecGetBindingPropagates(Vec,PetscBool *); 533 PETSC_EXTERN PetscErrorCode VecSetPinnedMemoryMin(Vec,size_t); 534 PETSC_EXTERN PetscErrorCode VecGetPinnedMemoryMin(Vec,size_t *); 535 536 PETSC_EXTERN PetscErrorCode VecGetOffloadMask(Vec,PetscOffloadMask *); 537 538 typedef enum {VEC_IGNORE_OFF_PROC_ENTRIES,VEC_IGNORE_NEGATIVE_INDICES,VEC_SUBSET_OFF_PROC_ENTRIES} VecOption; 539 PETSC_EXTERN PetscErrorCode VecSetOption(Vec,VecOption,PetscBool); 540 541 PETSC_EXTERN PetscErrorCode VecGetArray(Vec,PetscScalar**); 542 PETSC_EXTERN PetscErrorCode VecGetArrayWrite(Vec,PetscScalar**); 543 PETSC_EXTERN PetscErrorCode VecGetArrayRead(Vec,const PetscScalar**); 544 PETSC_EXTERN PetscErrorCode VecRestoreArray(Vec,PetscScalar**); 545 PETSC_EXTERN PetscErrorCode VecRestoreArrayWrite(Vec,PetscScalar**); 546 PETSC_EXTERN PetscErrorCode VecRestoreArrayRead(Vec,const PetscScalar**); 547 PETSC_EXTERN PetscErrorCode VecGetLocalVector(Vec,Vec); 548 PETSC_EXTERN PetscErrorCode VecRestoreLocalVector(Vec,Vec); 549 PETSC_EXTERN PetscErrorCode VecGetLocalVectorRead(Vec,Vec); 550 PETSC_EXTERN PetscErrorCode VecRestoreLocalVectorRead(Vec,Vec); 551 PETSC_EXTERN PetscErrorCode VecGetArrayAndMemType(Vec,PetscScalar**,PetscMemType*); 552 PETSC_EXTERN PetscErrorCode VecRestoreArrayAndMemType(Vec,PetscScalar**); 553 PETSC_EXTERN PetscErrorCode VecGetArrayReadAndMemType(Vec,const PetscScalar**,PetscMemType*); 554 PETSC_EXTERN PetscErrorCode VecRestoreArrayReadAndMemType(Vec,const PetscScalar**); 555 PETSC_EXTERN PetscErrorCode VecGetArrayWriteAndMemType(Vec,PetscScalar**,PetscMemType*); 556 PETSC_EXTERN PetscErrorCode VecRestoreArrayWriteAndMemType(Vec,PetscScalar**); 557 558 /*@C 559 VecGetArrayPair - Accesses a pair of pointers for two vectors that may be common. When not common the first is read only 560 561 Logically Collective on x 562 563 Input Parameters: 564 + x - the vector 565 - y - the second vector 566 567 Output Parameters: 568 + xv - location to put pointer to the first array 569 - yv - location to put pointer to the second array 570 571 Level: developer 572 573 Not available from Fortran 574 575 .seealso: `VecGetArray()`, `VecGetArrayRead()`, `VecRestoreArrayPair()` 576 577 @*/ 578 static inline PetscErrorCode VecGetArrayPair(Vec x,Vec y,PetscScalar **xv,PetscScalar **yv) 579 { 580 PetscFunctionBegin; 581 PetscCall(VecGetArray(y,yv)); 582 if (x == y) *xv = *yv; 583 else PetscCall(VecGetArrayRead(x,(const PetscScalar**)xv)); 584 PetscFunctionReturn(0); 585 } 586 587 /*@C 588 VecRestoreArrayPair - Returns a pair of pointers for two vectors that may be common. When not common the first is read only 589 590 Logically Collective on x 591 592 Input Parameters: 593 + x - the vector 594 - y - the second vector 595 596 Output Parameters: 597 + xv - location to put pointer to the first array 598 - yv - location to put pointer to the second array 599 600 Level: developer 601 602 Not available from Fortran 603 604 .seealso: `VecGetArray()`, `VecGetArrayRead()`, `VecGetArrayPair()` 605 606 @*/ 607 static inline PetscErrorCode VecRestoreArrayPair(Vec x,Vec y,PetscScalar **xv,PetscScalar **yv) 608 { 609 PetscFunctionBegin; 610 PetscCall(VecRestoreArray(y,yv)); 611 if (x != y) PetscCall(VecRestoreArrayRead(x,(const PetscScalar**)xv)); 612 PetscFunctionReturn(0); 613 } 614 615 #if defined(PETSC_USE_DEBUG) 616 PETSC_EXTERN PetscErrorCode VecLockReadPush(Vec); 617 PETSC_EXTERN PetscErrorCode VecLockReadPop(Vec); 618 PETSC_EXTERN PetscErrorCode VecLockWriteSet(Vec,PetscBool); 619 PETSC_EXTERN PetscErrorCode VecLockGet(Vec,PetscInt*); 620 PETSC_EXTERN PetscErrorCode VecLockGetLocation(Vec,const char*[],const char*[],int*); 621 static inline PetscErrorCode VecSetErrorIfLocked(Vec x,PetscInt arg) 622 { 623 PetscInt state; 624 625 PetscFunctionBegin; 626 PetscCall(VecLockGet(x,&state)); 627 if (PetscUnlikely(state != 0)) { 628 const char *file,*func,*name; 629 int line; 630 631 PetscCall(VecLockGetLocation(x,&file,&func,&line)); 632 PetscCall(PetscObjectGetName((PetscObject)x,&name)); 633 SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Vector '%s' (argument #%" PetscInt_FMT ") was locked for %s access in %s() at %s:%d (line numbers only accurate to function begin)",name,arg,state > 0 ? "read-only" : "write-only",func ? func : "unknown_function",file ? file : "unknown file",line ? line : 0); 634 } 635 PetscFunctionReturn(0); 636 } 637 /* The three are deprecated */ 638 PETSC_EXTERN PETSC_DEPRECATED_FUNCTION("Use VecLockReadPush() (since version 3.11)") PetscErrorCode VecLockPush(Vec); 639 PETSC_EXTERN PETSC_DEPRECATED_FUNCTION("Use VecLockReadPop() (since version 3.11)") PetscErrorCode VecLockPop(Vec); 640 #define VecLocked(x,arg) VecSetErrorIfLocked(x,arg) PETSC_DEPRECATED_MACRO("GCC warning \"Use VecSetErrorIfLocked() (since version 3.11)\"") 641 #else 642 #define VecLockReadPush(x) 0 643 #define VecLockReadPop(x) 0 644 #define VecLockGet(x,s) *(s) = 0 645 #define VecSetErrorIfLocked(x,arg) 0 646 #define VecLockWriteSet(x,flg) 0 647 /* The three are deprecated */ 648 #define VecLockPush(x) 0 649 #define VecLockPop(x) 0 650 #define VecLocked(x,arg) 0 651 #endif 652 653 PETSC_EXTERN PetscErrorCode VecValidValues(Vec,PetscInt,PetscBool); 654 655 /* 656 These numbers need to match the entries in 657 the function table in vecimpl.h 658 */ 659 typedef enum { VECOP_DUPLICATE = 0, VECOP_VIEW = 33, VECOP_LOAD = 41, VECOP_VIEWNATIVE = 68, VECOP_LOADNATIVE = 69 } VecOperation; 660 PETSC_EXTERN PetscErrorCode VecSetOperation(Vec,VecOperation,void(*)(void)); 661 662 /* 663 Routines for dealing with ghosted vectors: 664 vectors with ghost elements at the end of the array. 665 */ 666 PETSC_EXTERN PetscErrorCode VecMPISetGhost(Vec,PetscInt,const PetscInt[]); 667 PETSC_EXTERN PetscErrorCode VecCreateGhost(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*); 668 PETSC_EXTERN PetscErrorCode VecCreateGhostWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*); 669 PETSC_EXTERN PetscErrorCode VecCreateGhostBlock(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*); 670 PETSC_EXTERN PetscErrorCode VecCreateGhostBlockWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*); 671 PETSC_EXTERN PetscErrorCode VecGhostGetLocalForm(Vec,Vec*); 672 PETSC_EXTERN PetscErrorCode VecGhostRestoreLocalForm(Vec,Vec*); 673 PETSC_EXTERN PetscErrorCode VecGhostIsLocalForm(Vec,Vec,PetscBool*); 674 PETSC_EXTERN PetscErrorCode VecGhostUpdateBegin(Vec,InsertMode,ScatterMode); 675 PETSC_EXTERN PetscErrorCode VecGhostUpdateEnd(Vec,InsertMode,ScatterMode); 676 677 PETSC_EXTERN PetscErrorCode VecConjugate(Vec); 678 PETSC_EXTERN PetscErrorCode VecImaginaryPart(Vec); 679 PETSC_EXTERN PetscErrorCode VecRealPart(Vec); 680 681 PETSC_EXTERN PetscErrorCode VecScatterCreateToAll(Vec,VecScatter*,Vec*); 682 PETSC_EXTERN PetscErrorCode VecScatterCreateToZero(Vec,VecScatter*,Vec*); 683 684 PETSC_EXTERN PetscErrorCode ISComplementVec(IS,Vec,IS*); 685 PETSC_EXTERN PetscErrorCode VecPow(Vec, PetscScalar); 686 PETSC_EXTERN PetscErrorCode VecMedian(Vec, Vec, Vec, Vec); 687 PETSC_EXTERN PetscErrorCode VecWhichInactive(Vec, Vec, Vec, Vec, PetscBool, IS *); 688 PETSC_EXTERN PetscErrorCode VecWhichBetween(Vec, Vec, Vec, IS *); 689 PETSC_EXTERN PetscErrorCode VecWhichBetweenOrEqual(Vec, Vec, Vec, IS *); 690 PETSC_EXTERN PetscErrorCode VecWhichGreaterThan(Vec, Vec, IS *); 691 PETSC_EXTERN PetscErrorCode VecWhichLessThan(Vec, Vec, IS *); 692 PETSC_EXTERN PetscErrorCode VecWhichEqual(Vec, Vec, IS *); 693 PETSC_EXTERN PetscErrorCode VecISAXPY(Vec, IS, PetscScalar,Vec); 694 PETSC_EXTERN PetscErrorCode VecISCopy(Vec, IS, ScatterMode, Vec); 695 PETSC_EXTERN PetscErrorCode VecISSet(Vec,IS, PetscScalar); 696 PETSC_EXTERN PetscErrorCode VecBoundGradientProjection(Vec, Vec, Vec, Vec, Vec); 697 PETSC_EXTERN PetscErrorCode VecStepBoundInfo(Vec,Vec,Vec,Vec,PetscReal*, PetscReal*,PetscReal*); 698 PETSC_EXTERN PetscErrorCode VecStepMax(Vec, Vec, PetscReal *); 699 PETSC_EXTERN PetscErrorCode VecStepMaxBounded(Vec,Vec,Vec,Vec,PetscReal*); 700 701 PETSC_EXTERN PetscErrorCode PetscViewerMathematicaGetVector(PetscViewer, Vec); 702 PETSC_EXTERN PetscErrorCode PetscViewerMathematicaPutVector(PetscViewer, Vec); 703 704 /*S 705 Vecs - Collection of vectors where the data for the vectors is stored in 706 one contiguous memory 707 708 Level: advanced 709 710 Notes: 711 Temporary construct for handling multiply right hand side solves 712 713 This is faked by storing a single vector that has enough array space for 714 n vectors 715 716 S*/ 717 struct _n_Vecs {PetscInt n; Vec v;}; 718 typedef struct _n_Vecs* Vecs; 719 PETSC_EXTERN PetscErrorCode VecsDestroy(Vecs); 720 PETSC_EXTERN PetscErrorCode VecsCreateSeq(MPI_Comm,PetscInt,PetscInt,Vecs*); 721 PETSC_EXTERN PetscErrorCode VecsCreateSeqWithArray(MPI_Comm,PetscInt,PetscInt,PetscScalar*,Vecs*); 722 PETSC_EXTERN PetscErrorCode VecsDuplicate(Vecs,Vecs*); 723 724 #if defined(PETSC_HAVE_VIENNACL) 725 typedef struct _p_PetscViennaCLIndices* PetscViennaCLIndices; 726 PETSC_EXTERN PetscErrorCode PetscViennaCLIndicesCreate(PetscInt, PetscInt*,PetscInt, PetscInt*,PetscViennaCLIndices*); 727 PETSC_EXTERN PetscErrorCode PetscViennaCLIndicesDestroy(PetscViennaCLIndices*); 728 PETSC_EXTERN PetscErrorCode VecViennaCLCopyToGPUSome_Public(Vec,PetscViennaCLIndices); 729 PETSC_EXTERN PetscErrorCode VecViennaCLCopyFromGPUSome_Public(Vec,PetscViennaCLIndices); 730 PETSC_EXTERN PetscErrorCode VecCreateSeqViennaCL(MPI_Comm,PetscInt,Vec*); 731 PETSC_EXTERN PetscErrorCode VecCreateMPIViennaCL(MPI_Comm,PetscInt,PetscInt,Vec*); 732 #endif 733 #if defined(PETSC_HAVE_CUDA) || defined(PETSC_HAVE_HIP) 734 PETSC_EXTERN PetscErrorCode VecScatterInitializeForGPU(VecScatter,Vec); 735 PETSC_EXTERN PetscErrorCode VecScatterFinalizeForGPU(VecScatter); 736 #endif 737 #if defined(PETSC_HAVE_CUDA) 738 PETSC_EXTERN PetscErrorCode VecCreateSeqCUDA(MPI_Comm,PetscInt,Vec*); 739 PETSC_EXTERN PetscErrorCode VecCreateSeqCUDAWithArray(MPI_Comm,PetscInt,PetscInt,const PetscScalar*,Vec*); 740 PETSC_EXTERN PetscErrorCode VecCreateSeqCUDAWithArrays(MPI_Comm,PetscInt,PetscInt,const PetscScalar*,const PetscScalar*,Vec*); 741 PETSC_EXTERN PetscErrorCode VecCreateMPICUDA(MPI_Comm,PetscInt,PetscInt,Vec*); 742 PETSC_EXTERN PetscErrorCode VecCreateMPICUDAWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscScalar*,Vec*); 743 PETSC_EXTERN PetscErrorCode VecCreateMPICUDAWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscScalar*,const PetscScalar*,Vec*); 744 #endif 745 #if defined(PETSC_HAVE_HIP) 746 PETSC_EXTERN PetscErrorCode VecCreateSeqHIP(MPI_Comm,PetscInt,Vec*); 747 PETSC_EXTERN PetscErrorCode VecCreateSeqHIPWithArray(MPI_Comm,PetscInt,PetscInt,const PetscScalar*,Vec*); 748 PETSC_EXTERN PetscErrorCode VecCreateSeqHIPWithArrays(MPI_Comm,PetscInt,PetscInt,const PetscScalar*,const PetscScalar*,Vec*); 749 PETSC_EXTERN PetscErrorCode VecCreateMPIHIP(MPI_Comm,PetscInt,PetscInt,Vec*); 750 PETSC_EXTERN PetscErrorCode VecCreateMPIHIPWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscScalar*,Vec*); 751 PETSC_EXTERN PetscErrorCode VecCreateMPIHIPWithArrays(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscScalar*,const PetscScalar*,Vec*); 752 #endif 753 #if defined(PETSC_HAVE_KOKKOS_KERNELS) 754 PETSC_EXTERN PetscErrorCode VecCreateSeqKokkos(MPI_Comm,PetscInt,Vec*); 755 PETSC_EXTERN PetscErrorCode VecCreateSeqKokkosWithArray(MPI_Comm,PetscInt,PetscInt,const PetscScalar*,Vec*); 756 PETSC_EXTERN PetscErrorCode VecCreateMPIKokkos(MPI_Comm,PetscInt,PetscInt,Vec*); 757 PETSC_EXTERN PetscErrorCode VecCreateMPIKokkosWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscScalar*,Vec*); 758 #endif 759 760 PETSC_EXTERN PetscErrorCode VecNestGetSubVecs(Vec,PetscInt*,Vec**); 761 PETSC_EXTERN PetscErrorCode VecNestGetSubVec(Vec,PetscInt,Vec*); 762 PETSC_EXTERN PetscErrorCode VecNestSetSubVecs(Vec,PetscInt,PetscInt*,Vec*); 763 PETSC_EXTERN PetscErrorCode VecNestSetSubVec(Vec,PetscInt,Vec); 764 PETSC_EXTERN PetscErrorCode VecCreateNest(MPI_Comm,PetscInt,IS*,Vec*,Vec*); 765 PETSC_EXTERN PetscErrorCode VecNestGetSize(Vec,PetscInt*); 766 767 PETSC_EXTERN PetscErrorCode PetscOptionsGetVec(PetscOptions,const char[],const char[],Vec,PetscBool*); 768 PETSC_EXTERN PetscErrorCode VecChop(Vec,PetscReal); 769 770 PETSC_EXTERN PetscErrorCode VecGetLayout(Vec,PetscLayout*); 771 PETSC_EXTERN PetscErrorCode VecSetLayout(Vec,PetscLayout); 772 773 PETSC_EXTERN PetscErrorCode PetscSectionVecView(PetscSection, Vec, PetscViewer); 774 PETSC_EXTERN PetscErrorCode VecGetValuesSection(Vec, PetscSection, PetscInt, PetscScalar **); 775 PETSC_EXTERN PetscErrorCode VecSetValuesSection(Vec, PetscSection, PetscInt, PetscScalar [], InsertMode); 776 PETSC_EXTERN PetscErrorCode PetscSectionVecNorm(PetscSection, PetscSection, Vec, NormType, PetscReal []); 777 778 /*S 779 VecTagger - Object used to manage the tagging of a subset of indices based on the values of a vector. The 780 motivating application is the selection of cells for refinement or coarsening based on vector containing 781 the values in an error indicator metric. 782 783 Level: advanced 784 785 Developer Note: 786 Why not use a `DMLabel` or similar object 787 788 S*/ 789 typedef struct _p_VecTagger *VecTagger; 790 791 /*J 792 VecTaggerType - String with the name of a `VecTagger` type 793 794 Level: advanced 795 J*/ 796 typedef const char* VecTaggerType; 797 /* tag where the vector values are in a box of explicitly defined values */ 798 #define VECTAGGERABSOLUTE "absolute" 799 /* tag where the vector values are in a box of values relative to the set of all values in the vector */ 800 #define VECTAGGERRELATIVE "relative" 801 /* tag where the vector values are in a relative range of the *cumulative distribution* of values in the vector */ 802 #define VECTAGGERCDF "cdf" 803 /* tag a vector as the union of other tags */ 804 #define VECTAGGEROR "or" 805 /* tag a vector as the intersection of other tags */ 806 #define VECTAGGERAND "and" 807 808 PETSC_EXTERN PetscClassId VEC_TAGGER_CLASSID; 809 PETSC_EXTERN PetscFunctionList VecTaggerList; 810 PETSC_EXTERN PetscErrorCode VecTaggerRegister(const char[],PetscErrorCode (*) (VecTagger)); 811 812 PETSC_EXTERN PetscErrorCode VecTaggerCreate(MPI_Comm,VecTagger *); 813 PETSC_EXTERN PetscErrorCode VecTaggerSetBlockSize(VecTagger,PetscInt); 814 PETSC_EXTERN PetscErrorCode VecTaggerGetBlockSize(VecTagger,PetscInt*); 815 PETSC_EXTERN PetscErrorCode VecTaggerSetType(VecTagger,VecTaggerType); 816 PETSC_EXTERN PetscErrorCode VecTaggerGetType(VecTagger,VecTaggerType *); 817 PETSC_EXTERN PetscErrorCode VecTaggerSetInvert(VecTagger,PetscBool); 818 PETSC_EXTERN PetscErrorCode VecTaggerGetInvert(VecTagger,PetscBool*); 819 PETSC_EXTERN PetscErrorCode VecTaggerSetFromOptions(VecTagger); 820 PETSC_EXTERN PetscErrorCode VecTaggerSetUp(VecTagger); 821 PETSC_EXTERN PetscErrorCode VecTaggerView(VecTagger,PetscViewer); 822 PETSC_EXTERN PetscErrorCode VecTaggerComputeIS(VecTagger,Vec,IS *,PetscBool*); 823 PETSC_EXTERN PetscErrorCode VecTaggerDestroy(VecTagger *); 824 825 /*S 826 VecTaggerBox - A box range used to tag values. For real scalars, this is just a closed interval; for complex scalars, the box is the closed region in the complex plane 827 such that real(min) <= real(z) <= real(max) and imag(min) <= imag(z) <= imag(max). INF is an acceptable endpoint. 828 829 Level: beginner 830 831 .seealso: `VecTaggerComputeIntervals()` 832 S*/ 833 typedef struct { 834 PetscScalar min; 835 PetscScalar max; 836 } VecTaggerBox; 837 PETSC_EXTERN PetscErrorCode VecTaggerComputeBoxes(VecTagger,Vec,PetscInt *,VecTaggerBox **,PetscBool*); 838 839 PETSC_EXTERN PetscErrorCode VecTaggerAbsoluteSetBox(VecTagger,VecTaggerBox *); 840 PETSC_EXTERN PetscErrorCode VecTaggerAbsoluteGetBox(VecTagger,const VecTaggerBox **); 841 842 PETSC_EXTERN PetscErrorCode VecTaggerRelativeSetBox(VecTagger,VecTaggerBox *); 843 PETSC_EXTERN PetscErrorCode VecTaggerRelativeGetBox(VecTagger,const VecTaggerBox **); 844 845 PETSC_EXTERN PetscErrorCode VecTaggerCDFSetBox(VecTagger,VecTaggerBox *); 846 PETSC_EXTERN PetscErrorCode VecTaggerCDFGetBox(VecTagger,const VecTaggerBox **); 847 848 /*E 849 VecTaggerCDFMethod - Determines what method is used to compute absolute values from cumulative distribution values (e.g., what value is the preimage of .95 in the cdf). 850 Relevant only in parallel: in serial it is directly computed. 851 852 Level: advanced 853 854 .seealso: `VecTaggerCDFSetMethod()`, `VecTaggerCDFMethods` 855 E*/ 856 typedef enum {VECTAGGER_CDF_GATHER,VECTAGGER_CDF_ITERATIVE,VECTAGGER_CDF_NUM_METHODS} VecTaggerCDFMethod; 857 PETSC_EXTERN const char *const VecTaggerCDFMethods[]; 858 859 PETSC_EXTERN PetscErrorCode VecTaggerCDFSetMethod(VecTagger,VecTaggerCDFMethod); 860 PETSC_EXTERN PetscErrorCode VecTaggerCDFGetMethod(VecTagger,VecTaggerCDFMethod*); 861 PETSC_EXTERN PetscErrorCode VecTaggerCDFIterativeSetTolerances(VecTagger,PetscInt,PetscReal,PetscReal); 862 PETSC_EXTERN PetscErrorCode VecTaggerCDFIterativeGetTolerances(VecTagger,PetscInt*,PetscReal*,PetscReal*); 863 864 PETSC_EXTERN PetscErrorCode VecTaggerOrSetSubs(VecTagger,PetscInt,VecTagger*,PetscCopyMode); 865 PETSC_EXTERN PetscErrorCode VecTaggerOrGetSubs(VecTagger,PetscInt*,VecTagger**); 866 867 PETSC_EXTERN PetscErrorCode VecTaggerAndSetSubs(VecTagger,PetscInt,VecTagger*,PetscCopyMode); 868 PETSC_EXTERN PetscErrorCode VecTaggerAndGetSubs(VecTagger,PetscInt*,VecTagger**); 869 870 PETSC_EXTERN PetscErrorCode VecTaggerInitializePackage(void); 871 PETSC_EXTERN PetscErrorCode VecTaggerFinalizePackage(void); 872 873 #endif 874