xref: /petsc/include/petscvec.h (revision 3ba1676111f5c958fe6c2729b46ca4d523958bb3)
12eac72dbSBarry Smith /*
237f753daSBarry Smith     Defines the vector component of PETSc. Vectors generally represent
337f753daSBarry Smith   degrees of freedom for finite element/finite difference functions
484cb2905SBarry Smith   on a grid. They have more mathematical structure then simple arrays.
52eac72dbSBarry Smith */
66524c165SJacob Faibussowitsch #ifndef PETSCVEC_H
726bd1501SBarry Smith #define PETSCVEC_H
8ac09b921SBarry Smith 
997929ea7SJunchao Zhang #include <petscsys.h>
1097929ea7SJunchao Zhang #include <petscsftypes.h> /* for VecScatter, VecScatterType */
112c8e378dSBarry Smith #include <petscis.h>
12030f984aSJacob Faibussowitsch #include <petscdevicetypes.h>
13665c2dedSJed Brown #include <petscviewer.h>
142eac72dbSBarry Smith 
15ac09b921SBarry Smith /* SUBMANSEC = Vec */
16ac09b921SBarry Smith 
1709321671SBarry Smith /*S
1809321671SBarry Smith      Vec - Abstract PETSc vector object
1909321671SBarry Smith 
2009321671SBarry Smith    Level: beginner
2109321671SBarry Smith 
22db781477SPatrick Sanan .seealso: `VecCreate()`, `VecType`, `VecSetType()`
2309321671SBarry Smith S*/
24f09e8eb9SSatish Balay typedef struct _p_Vec *Vec;
2509321671SBarry Smith 
2609321671SBarry Smith /*E
27398c84b2SBarry Smith   ScatterMode - Determines the direction of a scatter
28398c84b2SBarry Smith 
29398c84b2SBarry Smith   Level: beginner
30398c84b2SBarry Smith 
31db781477SPatrick Sanan .seealso: `VecScatter`, `VecScatterBegin()`, `VecScatterEnd()`
32398c84b2SBarry Smith E*/
339371c9d4SSatish Balay typedef enum {
349371c9d4SSatish Balay   SCATTER_FORWARD       = 0,
359371c9d4SSatish Balay   SCATTER_REVERSE       = 1,
369371c9d4SSatish Balay   SCATTER_FORWARD_LOCAL = 2,
379371c9d4SSatish Balay   SCATTER_REVERSE_LOCAL = 3,
389371c9d4SSatish Balay   SCATTER_LOCAL         = 2
399371c9d4SSatish Balay } ScatterMode;
40398c84b2SBarry Smith 
41398c84b2SBarry Smith /*MC
4287497f52SBarry Smith     SCATTER_FORWARD - Scatters the values as dictated by the `VecScatterCreate()` call
43398c84b2SBarry Smith 
44398c84b2SBarry Smith     Level: beginner
45398c84b2SBarry Smith 
46db781477SPatrick Sanan .seealso: `VecScatter`, `ScatterMode`, `VecScatterCreate()`, `VecScatterBegin()`, `VecScatterEnd()`, `SCATTER_REVERSE`, `SCATTER_FORWARD_LOCAL`,
47db781477SPatrick Sanan           `SCATTER_REVERSE_LOCAL`
48398c84b2SBarry Smith 
49398c84b2SBarry Smith M*/
50398c84b2SBarry Smith 
51398c84b2SBarry Smith /*MC
52398c84b2SBarry Smith     SCATTER_REVERSE - Moves the values in the opposite direction then the directions indicated in
5387497f52SBarry Smith          in the `VecScatterCreate()`
54398c84b2SBarry Smith 
55398c84b2SBarry Smith     Level: beginner
56398c84b2SBarry Smith 
57db781477SPatrick Sanan .seealso: `VecScatter`, `ScatterMode`, `VecScatterCreate()`, `VecScatterBegin()`, `VecScatterEnd()`, `SCATTER_FORWARD`, `SCATTER_FORWARD_LOCAL`,
58db781477SPatrick Sanan           `SCATTER_REVERSE_LOCAL`
59398c84b2SBarry Smith 
60398c84b2SBarry Smith M*/
61398c84b2SBarry Smith 
62398c84b2SBarry Smith /*MC
6387497f52SBarry Smith     SCATTER_FORWARD_LOCAL - Scatters the values as dictated by the `VecScatterCreate()` call except NO parallel communication
64398c84b2SBarry Smith        is done. Any variables that have be moved between processes are ignored
65398c84b2SBarry Smith 
66398c84b2SBarry Smith     Level: developer
67398c84b2SBarry Smith 
68db781477SPatrick Sanan .seealso: `VecScatter`, `ScatterMode`, `VecScatterCreate()`, `VecScatterBegin()`, `VecScatterEnd()`, `SCATTER_REVERSE`, `SCATTER_FORWARD`,
69db781477SPatrick Sanan           `SCATTER_REVERSE_LOCAL`
70398c84b2SBarry Smith 
71398c84b2SBarry Smith M*/
72398c84b2SBarry Smith 
73398c84b2SBarry Smith /*MC
74398c84b2SBarry Smith     SCATTER_REVERSE_LOCAL - Moves the values in the opposite direction then the directions indicated in
7587497f52SBarry Smith          in the `VecScatterCreate()`  except NO parallel communication
76398c84b2SBarry Smith        is done. Any variables that have be moved between processes are ignored
77398c84b2SBarry Smith 
78398c84b2SBarry Smith     Level: developer
79398c84b2SBarry Smith 
80db781477SPatrick Sanan .seealso: `VecScatter`, `ScatterMode`, `VecScatterCreate()`, `VecScatterBegin()`, `VecScatterEnd()`, `SCATTER_FORWARD`, `SCATTER_FORWARD_LOCAL`,
81db781477SPatrick Sanan           `SCATTER_REVERSE`
82398c84b2SBarry Smith 
83398c84b2SBarry Smith M*/
84398c84b2SBarry Smith 
8576bdecfbSBarry Smith /*J
868f6c3df8SBarry Smith     VecType - String with the name of a PETSc vector
8709321671SBarry Smith 
8809321671SBarry Smith    Level: beginner
8909321671SBarry Smith 
90db781477SPatrick Sanan .seealso: `VecSetType()`, `Vec`, `VecCreate()`, `VecDestroy()`
9176bdecfbSBarry Smith J*/
9219fd82e9SBarry Smith typedef const char *VecType;
930676abe4SMatthew Knepley #define VECSEQ         "seq"
940676abe4SMatthew Knepley #define VECMPI         "mpi"
95f48c50deSBarry Smith #define VECSTANDARD    "standard" /* seq on one process and mpi on several */
960676abe4SMatthew Knepley #define VECSHARED      "shared"
97b17c682bSKarl Rupp #define VECSEQVIENNACL "seqviennacl"
98b17c682bSKarl Rupp #define VECMPIVIENNACL "mpiviennacl"
99b17c682bSKarl Rupp #define VECVIENNACL    "viennacl" /* seqviennacl on one process and mpiviennacl on several */
10082f73ecaSAlejandro Lamas Daviña #define VECSEQCUDA     "seqcuda"
10182f73ecaSAlejandro Lamas Daviña #define VECMPICUDA     "mpicuda"
10282f73ecaSAlejandro Lamas Daviña #define VECCUDA        "cuda" /* seqcuda on one process and mpicuda on several */
10359af0bd3SScott Kruger #define VECSEQHIP      "seqhip"
10459af0bd3SScott Kruger #define VECMPIHIP      "mpihip"
10559af0bd3SScott Kruger #define VECHIP         "hip" /* seqcuda on one process and mpicuda on several */
1061aae2881SJed Brown #define VECNEST        "nest"
10710171e34SJunchao Zhang #define VECSEQKOKKOS   "seqkokkos"
10810171e34SJunchao Zhang #define VECMPIKOKKOS   "mpikokkos"
10910171e34SJunchao Zhang #define VECKOKKOS      "kokkos" /* seqkokkos on one process and mpikokkos on several */
1102eac72dbSBarry Smith 
111803a1b88SHong Zhang /* Dynamic creation and loading functions */
112803a1b88SHong Zhang PETSC_EXTERN PetscErrorCode VecScatterSetType(VecScatter, VecScatterType);
113803a1b88SHong Zhang PETSC_EXTERN PetscErrorCode VecScatterGetType(VecScatter, VecScatterType *);
114803a1b88SHong Zhang PETSC_EXTERN PetscErrorCode VecScatterSetFromOptions(VecScatter);
115803a1b88SHong Zhang PETSC_EXTERN PetscErrorCode VecScatterRegister(const char[], PetscErrorCode (*)(VecScatter));
116130e142eSJunchao Zhang PETSC_EXTERN PetscErrorCode VecScatterCreate(Vec, IS, Vec, IS, VecScatter *);
1174b71561bSShri Abhyankar 
118fd487807SMatthew Knepley /* Logging support */
119450a797fSBarry Smith #define REAL_FILE_CLASSID 1211213
1200700a824SBarry Smith #define VEC_FILE_CLASSID  1211214
121014dd563SJed Brown PETSC_EXTERN PetscClassId VEC_CLASSID;
12297929ea7SJunchao Zhang PETSC_EXTERN PetscClassId PETSCSF_CLASSID;
12345b63f25SDmitry Karpeev 
124607a6623SBarry Smith PETSC_EXTERN PetscErrorCode VecInitializePackage(void);
125014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecFinalizePackage(void);
126fd487807SMatthew Knepley 
127014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecCreate(MPI_Comm, Vec *);
128014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecCreateSeq(MPI_Comm, PetscInt, Vec *);
129014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecCreateMPI(MPI_Comm, PetscInt, PetscInt, Vec *);
130014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecCreateSeqWithArray(MPI_Comm, PetscInt, PetscInt, const PetscScalar[], Vec *);
131014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecCreateMPIWithArray(MPI_Comm, PetscInt, PetscInt, PetscInt, const PetscScalar[], Vec *);
132014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecCreateShared(MPI_Comm, PetscInt, PetscInt, Vec *);
133803a1b88SHong Zhang PETSC_EXTERN PetscErrorCode VecCreateNode(MPI_Comm, PetscInt, PetscInt, Vec *);
134803a1b88SHong Zhang 
135014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecSetFromOptions(Vec);
136fe2efc57SMark PETSC_EXTERN PetscErrorCode VecViewFromOptions(Vec, PetscObject, const char[]);
1370d2bece7SBarry Smith 
138014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecSetUp(Vec);
139014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecDestroy(Vec *);
140014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecZeroEntries(Vec);
141014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecSetOptionsPrefix(Vec, const char[]);
142014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecAppendOptionsPrefix(Vec, const char[]);
143014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecGetOptionsPrefix(Vec, const char *[]);
144f69a0ea3SMatthew Knepley 
145014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecSetSizes(Vec, PetscInt, PetscInt);
146fd487807SMatthew Knepley 
14752b6e47cSBarry Smith PETSC_EXTERN PetscErrorCode VecDotNorm2(Vec, Vec, PetscScalar *, PetscReal *);
148014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecDot(Vec, Vec, PetscScalar *);
14967392de3SBarry Smith PETSC_EXTERN PetscErrorCode VecDotRealPart(Vec, Vec, PetscReal *);
150014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecTDot(Vec, Vec, PetscScalar *);
151014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecMDot(Vec, PetscInt, const Vec[], PetscScalar[]);
152014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecMTDot(Vec, PetscInt, const Vec[], PetscScalar[]);
153014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecGetSubVector(Vec, IS, Vec *);
154014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecRestoreSubVector(Vec, IS, Vec *);
155598f99faSAlp Dener PETSC_EXTERN PetscErrorCode VecConcatenate(PetscInt, const Vec[], Vec *, IS *[]);
156cddf8d76SBarry Smith 
15709321671SBarry Smith /*E
15809321671SBarry Smith     NormType - determines what type of norm to compute
15909321671SBarry Smith 
16009321671SBarry Smith     Level: beginner
16109321671SBarry Smith 
162db781477SPatrick Sanan .seealso: `VecNorm()`, `VecNormBegin()`, `VecNormEnd()`, `MatNorm()`
16309321671SBarry Smith E*/
1649371c9d4SSatish Balay typedef enum {
1659371c9d4SSatish Balay   NORM_1         = 0,
166a873a8cdSSam Reynolds   NORM_2         = 1,
167a873a8cdSSam Reynolds   NORM_FROBENIUS = 2,
168a873a8cdSSam Reynolds   NORM_INFINITY  = 3,
169a873a8cdSSam Reynolds   NORM_1_AND_2   = 4
170a873a8cdSSam Reynolds } NormType;
1716a6fc655SJed Brown PETSC_EXTERN const char *const NormTypes[];
172cddf8d76SBarry Smith #define NORM_MAX NORM_INFINITY
17309321671SBarry Smith 
1749b250c83SBarry Smith /*MC
1759b250c83SBarry Smith      NORM_1 - the one norm, ||v|| = sum_i | v_i |. ||A|| = max_j || v_*j ||, maximum column sum
1769b250c83SBarry Smith 
1779b250c83SBarry Smith    Level: beginner
1789b250c83SBarry Smith 
179db781477SPatrick Sanan .seealso: `NormType`, `MatNorm()`, `VecNorm()`, `VecNormBegin()`, `VecNormEnd()`, `NORM_2`, `NORM_FROBENIUS`,
180db781477SPatrick Sanan           `NORM_INFINITY`, `NORM_1_AND_2`
1819b250c83SBarry Smith 
1829b250c83SBarry Smith M*/
1839b250c83SBarry Smith 
1849b250c83SBarry Smith /*MC
185df54d55cSMatthias Liertzer      NORM_2 - the two norm, ||v|| = sqrt(sum_i |v_i|^2) (vectors only)
1869b250c83SBarry Smith 
1879b250c83SBarry Smith    Level: beginner
1889b250c83SBarry Smith 
189db781477SPatrick Sanan .seealso: `NormType`, `MatNorm()`, `VecNorm()`, `VecNormBegin()`, `VecNormEnd()`, `NORM_1`, `NORM_FROBENIUS`,
190db781477SPatrick Sanan           `NORM_INFINITY`, `NORM_1_AND_2`
1919b250c83SBarry Smith 
1929b250c83SBarry Smith M*/
1939b250c83SBarry Smith 
1949b250c83SBarry Smith /*MC
19587497f52SBarry Smith      NORM_FROBENIUS - ||A|| = sqrt(sum_ij |A_ij|^2), same as `NORM_2` for vectors
1969b250c83SBarry Smith 
1979b250c83SBarry Smith    Level: beginner
1989b250c83SBarry Smith 
199db781477SPatrick Sanan .seealso: `NormType`, `MatNorm()`, `VecNorm()`, `VecNormBegin()`, `VecNormEnd()`, `NORM_1`, `NORM_2`,
200db781477SPatrick Sanan           `NORM_INFINITY`, `NORM_1_AND_2`
2019b250c83SBarry Smith 
2029b250c83SBarry Smith M*/
2039b250c83SBarry Smith 
2049b250c83SBarry Smith /*MC
2059b250c83SBarry Smith      NORM_INFINITY - ||v|| = max_i |v_i|. ||A|| = max_i || v_i* ||, maximum row sum
2069b250c83SBarry Smith 
2079b250c83SBarry Smith    Level: beginner
2089b250c83SBarry Smith 
209db781477SPatrick Sanan .seealso: `NormType`, `MatNorm()`, `VecNorm()`, `VecNormBegin()`, `VecNormEnd()`, `NORM_1`, `NORM_2`,
210db781477SPatrick Sanan           `NORM_FROBENIUS`, `NORM_1_AND_2`
2119b250c83SBarry Smith 
2129b250c83SBarry Smith M*/
2139b250c83SBarry Smith 
2149b250c83SBarry Smith /*MC
2159b250c83SBarry Smith      NORM_1_AND_2 - computes both the 1 and 2 norm of a vector
2169b250c83SBarry Smith 
2179b250c83SBarry Smith    Level: beginner
2189b250c83SBarry Smith 
219db781477SPatrick Sanan .seealso: `NormType`, `MatNorm()`, `VecNorm()`, `VecNormBegin()`, `VecNormEnd()`, `NORM_1`, `NORM_2`,
220db781477SPatrick Sanan           `NORM_FROBENIUS`, `NORM_INFINITY`
2219b250c83SBarry Smith 
2229b250c83SBarry Smith M*/
2239b250c83SBarry Smith 
2249b250c83SBarry Smith /*MC
22587497f52SBarry Smith      NORM_MAX - see `NORM_INFINITY`
2269b250c83SBarry Smith 
227d41222bbSBarry Smith    Level: beginner
228d41222bbSBarry Smith 
2299b250c83SBarry Smith M*/
2309b250c83SBarry Smith 
231a873a8cdSSam Reynolds /*E
23287497f52SBarry Smith     ReductionType - determines what type of column reduction (one that is not a type of norm defined in `NormType`) to compute
233a873a8cdSSam Reynolds 
234a873a8cdSSam Reynolds     Level: beginner
235a873a8cdSSam Reynolds 
236db781477SPatrick Sanan .seealso: `MatGetColumnReductions()`, `MatGetColumnNorms()`, `NormType`
237a873a8cdSSam Reynolds E*/
238857cbf51SRichard Tran Mills /* NOTE: The integer constants defined in ReductionType MUST BE DISTINCT from those defined in NormType.
239857cbf51SRichard Tran Mills  * This is because MatGetColumnReductions() is used to compute both norms and other types of reductions,
240857cbf51SRichard Tran Mills  * and the constants defined in both NormType and ReductionType are used to designate the desired operation. */
2419371c9d4SSatish Balay typedef enum {
2429371c9d4SSatish Balay   REDUCTION_SUM_REALPART       = 10,
243857cbf51SRichard Tran Mills   REDUCTION_MEAN_REALPART      = 11,
244857cbf51SRichard Tran Mills   REDUCTION_SUM_IMAGINARYPART  = 12,
245857cbf51SRichard Tran Mills   REDUCTION_MEAN_IMAGINARYPART = 13
246a873a8cdSSam Reynolds } ReductionType;
247a873a8cdSSam Reynolds 
248a873a8cdSSam Reynolds /*MC
249857cbf51SRichard Tran Mills      REDUCTION_SUM_REALPART - sum of real part of matrix column
250a873a8cdSSam Reynolds 
251a873a8cdSSam Reynolds    Level: beginner
252a873a8cdSSam Reynolds 
253db781477SPatrick Sanan .seealso: `ReductionType`, `MatGetColumnReductions()`, `REDUCTION_SUM_IMAGINARYPART`, `REDUCTION_MEAN_REALPART`, `REDUCTION_NORM_1`,
254db781477SPatrick Sanan           `REDUCTION_NORM_2`, `REDUCTION_NORM_FROBENIUS`, `REDUCTION_NORM_INFINITY`
255a873a8cdSSam Reynolds 
256a873a8cdSSam Reynolds M*/
257a873a8cdSSam Reynolds 
258a873a8cdSSam Reynolds /*MC
259857cbf51SRichard Tran Mills      REDUCTION_SUM_IMAGINARYPART - sum of imaginary part of matrix column
260a873a8cdSSam Reynolds 
261a873a8cdSSam Reynolds    Level: beginner
262a873a8cdSSam Reynolds 
263db781477SPatrick Sanan .seealso: `ReductionType`, `MatGetColumnReductions()`, `REDUCTION_SUM_REALPART`, `REDUCTION_MEAN_IMAGINARYPART`, `REDUCTION_NORM_1`,
264db781477SPatrick Sanan           `REDUCTION_NORM_2`, `REDUCTION_NORM_FROBENIUS`, `REDUCTION_NORM_INFINITY`
265857cbf51SRichard Tran Mills 
266857cbf51SRichard Tran Mills M*/
267857cbf51SRichard Tran Mills 
268857cbf51SRichard Tran Mills /*MC
269857cbf51SRichard Tran Mills      REDUCTION_MEAN_REALPART - arithmetic mean of real part of matrix column
270857cbf51SRichard Tran Mills 
271857cbf51SRichard Tran Mills    Level: beginner
272857cbf51SRichard Tran Mills 
273db781477SPatrick Sanan .seealso: `ReductionType`, `MatGetColumnReductions()`, `REDUCTION_MEAN_IMAGINARYPART`, `REDUCTION_SUM_REALPART`, `REDUCTION_NORM_1`,
274db781477SPatrick Sanan           `REDUCTION_NORM_2`, `REDUCTION_NORM_FROBENIUS`, `REDUCTION_NORM_INFINITY`
275857cbf51SRichard Tran Mills 
276857cbf51SRichard Tran Mills M*/
277857cbf51SRichard Tran Mills 
278857cbf51SRichard Tran Mills /*MC
279857cbf51SRichard Tran Mills      REDUCTION_MEAN_IMAGINARYPART - arithmetic mean of imaginary part of matrix column
280857cbf51SRichard Tran Mills 
281857cbf51SRichard Tran Mills    Level: beginner
282857cbf51SRichard Tran Mills 
283db781477SPatrick Sanan .seealso: `ReductionType`, `MatGetColumnReductions()`, `REDUCTION_MEAN_REALPART`, `REDUCTION_SUM_IMAGINARYPART`, `REDUCTION_NORM_1`,
284db781477SPatrick Sanan           `REDUCTION_NORM_2`, `REDUCTION_NORM_FROBENIUS`, `REDUCTION_NORM_INFINITY`
285a873a8cdSSam Reynolds 
286a873a8cdSSam Reynolds M*/
287a873a8cdSSam Reynolds 
288014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecNorm(Vec, NormType, PetscReal *);
289014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecNormAvailable(Vec, NormType, PetscBool *, PetscReal *);
290014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecNormalize(Vec, PetscReal *);
291014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecSum(Vec, PetscScalar *);
292f7c17b9fSRichard Tran Mills PETSC_EXTERN PetscErrorCode VecMean(Vec, PetscScalar *);
293014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecMax(Vec, PetscInt *, PetscReal *);
294014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecMin(Vec, PetscInt *, PetscReal *);
295014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecScale(Vec, PetscScalar);
296014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecCopy(Vec, Vec);
297014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecSetRandom(Vec, PetscRandom);
298014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecSet(Vec, PetscScalar);
299422a814eSBarry Smith PETSC_EXTERN PetscErrorCode VecSetInf(Vec);
300014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecSwap(Vec, Vec);
301014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecAXPY(Vec, PetscScalar, Vec);
302014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecAXPBY(Vec, PetscScalar, PetscScalar, Vec);
303014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecMAXPY(Vec, PetscInt, const PetscScalar[], Vec[]);
304014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecAYPX(Vec, PetscScalar, Vec);
305014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecWAXPY(Vec, PetscScalar, Vec, Vec);
306014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecAXPBYPCZ(Vec, PetscScalar, PetscScalar, PetscScalar, Vec, Vec);
307014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecPointwiseMax(Vec, Vec, Vec);
308014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecPointwiseMaxAbs(Vec, Vec, Vec);
309014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecPointwiseMin(Vec, Vec, Vec);
310014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecPointwiseMult(Vec, Vec, Vec);
311014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecPointwiseDivide(Vec, Vec, Vec);
312014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecMaxPointwiseDivide(Vec, Vec, PetscReal *);
313014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecShift(Vec, PetscScalar);
314014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecReciprocal(Vec);
315014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecPermute(Vec, IS, PetscBool);
316014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecSqrtAbs(Vec);
317014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecLog(Vec);
318014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecExp(Vec);
319014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecAbs(Vec);
320014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecDuplicate(Vec, Vec *);
321014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecDuplicateVecs(Vec, PetscInt, Vec *[]);
322014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecDestroyVecs(PetscInt, Vec *[]);
323014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecStrideNormAll(Vec, NormType, PetscReal[]);
324014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecStrideMaxAll(Vec, PetscInt[], PetscReal[]);
325014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecStrideMinAll(Vec, PetscInt[], PetscReal[]);
326014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecStrideScaleAll(Vec, const PetscScalar[]);
327408c233dSJeremy L Thompson PETSC_EXTERN PetscErrorCode VecStrideSumAll(Vec, PetscScalar *);
328849b11cfSMatthew G. Knepley PETSC_EXTERN PetscErrorCode VecUniqueEntries(Vec, PetscInt *, PetscScalar **);
3294a560884SBarry Smith 
330014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecStrideNorm(Vec, PetscInt, NormType, PetscReal *);
331014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecStrideMax(Vec, PetscInt, PetscInt *, PetscReal *);
332014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecStrideMin(Vec, PetscInt, PetscInt *, PetscReal *);
333014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecStrideScale(Vec, PetscInt, PetscScalar);
334408c233dSJeremy L Thompson PETSC_EXTERN PetscErrorCode VecStrideSum(Vec, PetscInt, PetscScalar *);
335014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecStrideSet(Vec, PetscInt, PetscScalar);
336954b3ec6SBarry Smith 
337014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecStrideGather(Vec, PetscInt, Vec, InsertMode);
338014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecStrideScatter(Vec, PetscInt, Vec, InsertMode);
339014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecStrideGatherAll(Vec, Vec[], InsertMode);
340014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecStrideScatterAll(Vec[], Vec, InsertMode);
341d2655a18SBarry Smith 
342bdeb6c88SBarry Smith PETSC_EXTERN PetscErrorCode VecStrideSubSetScatter(Vec, PetscInt, const PetscInt[], const PetscInt[], Vec, InsertMode);
343bdeb6c88SBarry Smith PETSC_EXTERN PetscErrorCode VecStrideSubSetGather(Vec, PetscInt, const PetscInt[], const PetscInt[], Vec, InsertMode);
344bdeb6c88SBarry Smith 
345014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecSetValues(Vec, PetscInt, const PetscInt[], const PetscScalar[], InsertMode);
346014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecGetValues(Vec, PetscInt, const PetscInt[], PetscScalar[]);
347014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecAssemblyBegin(Vec);
348014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecAssemblyEnd(Vec);
349014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecStashSetInitialSize(Vec, PetscInt, PetscInt);
350014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecStashView(Vec, PetscViewer);
351685405a1SBarry Smith PETSC_EXTERN PetscErrorCode VecStashViewFromOptions(Vec, PetscObject, const char[]);
352014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecStashGetInfo(Vec, PetscInt *, PetscInt *, PetscInt *, PetscInt *);
35362dc5420SSatish Balay 
354158e8e18SJunchao Zhang PETSC_EXTERN PetscErrorCode VecSetPreallocationCOO(Vec, PetscCount, const PetscInt[]);
355158e8e18SJunchao Zhang PETSC_EXTERN PetscErrorCode VecSetPreallocationCOOLocal(Vec, PetscCount, PetscInt[]);
356158e8e18SJunchao Zhang PETSC_EXTERN PetscErrorCode VecSetValuesCOO(Vec, const PetscScalar[], InsertMode);
357158e8e18SJunchao Zhang 
35830de9b25SBarry Smith /*MC
35930de9b25SBarry Smith    VecSetValue - Set a single entry into a vector.
36030de9b25SBarry Smith 
36130de9b25SBarry Smith    Synopsis:
362aaa7dc30SBarry Smith    #include <petscvec.h>
3638122439eSJed Brown    PetscErrorCode VecSetValue(Vec v,PetscInt row,PetscScalar value, InsertMode mode);
36430de9b25SBarry Smith 
36530de9b25SBarry Smith    Not Collective
36630de9b25SBarry Smith 
36730de9b25SBarry Smith    Input Parameters:
36830de9b25SBarry Smith +  v - the vector
36930de9b25SBarry Smith .  row - the row location of the entry
37030de9b25SBarry Smith .  value - the value to insert
37187497f52SBarry Smith -  mode - either `INSERT_VALUES` or `ADD_VALUES`
37230de9b25SBarry Smith 
37330de9b25SBarry Smith    Notes:
37487497f52SBarry Smith    For efficiency one should use `VecSetValues()` and set several or
37530de9b25SBarry Smith    many values simultaneously if possible.
37630de9b25SBarry Smith 
37787497f52SBarry Smith    These values may be cached, so `VecAssemblyBegin()` and `VecAssemblyEnd()`
37887497f52SBarry Smith    MUST be called after all calls to `VecSetValue()` have been completed.
3791d73ed98SBarry Smith 
38087497f52SBarry Smith    `VecSetValue()` uses 0-based indices in Fortran as well as in C.
3811d73ed98SBarry Smith 
3821d73ed98SBarry Smith    Level: beginner
3831d73ed98SBarry Smith 
384db781477SPatrick Sanan .seealso: `VecSetValues()`, `VecAssemblyBegin()`, `VecAssemblyEnd()`, `VecSetValuesBlockedLocal()`, `VecSetValueLocal()`
3851d73ed98SBarry Smith M*/
386d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode VecSetValue(Vec v, PetscInt i, PetscScalar va, InsertMode mode)
387d71ae5a4SJacob Faibussowitsch {
3889371c9d4SSatish Balay   return VecSetValues(v, 1, &i, &va, mode);
3899371c9d4SSatish Balay }
3901d73ed98SBarry Smith 
391014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecSetBlockSize(Vec, PetscInt);
392014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecGetBlockSize(Vec, PetscInt *);
393014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecSetValuesBlocked(Vec, PetscInt, const PetscInt[], const PetscScalar[], InsertMode);
3948ed539a5SBarry Smith 
395fd487807SMatthew Knepley /* Dynamic creation and loading functions */
396140e18c1SBarry Smith PETSC_EXTERN PetscFunctionList VecList;
39719fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode    VecSetType(Vec, VecType);
39819fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode    VecGetType(Vec, VecType *);
399bdf89e91SBarry Smith PETSC_EXTERN PetscErrorCode    VecRegister(const char[], PetscErrorCode (*)(Vec));
40030de9b25SBarry Smith 
401014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecScatterBegin(VecScatter, Vec, Vec, InsertMode, ScatterMode);
402014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecScatterEnd(VecScatter, Vec, Vec, InsertMode, ScatterMode);
403014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecScatterDestroy(VecScatter *);
404246626dcSBarry Smith PETSC_EXTERN PetscErrorCode VecScatterSetUp(VecScatter);
405014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecScatterCopy(VecScatter, VecScatter *);
406014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecScatterView(VecScatter, PetscViewer);
407fe2efc57SMark PETSC_EXTERN PetscErrorCode VecScatterViewFromOptions(VecScatter, PetscObject, const char[]);
408d27e6124SSatish Balay PETSC_EXTERN PetscErrorCode VecScatterRemap(VecScatter, PetscInt[], PetscInt[]);
409014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecScatterGetMerged(VecScatter, PetscBool *);
4102195c698SBarry Smith 
411014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecGetArray4d(Vec, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscScalar ****[]);
412014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecRestoreArray4d(Vec, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscScalar ****[]);
413014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecGetArray3d(Vec, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscScalar ***[]);
414014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecRestoreArray3d(Vec, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscScalar ***[]);
415014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecGetArray2d(Vec, PetscInt, PetscInt, PetscInt, PetscInt, PetscScalar **[]);
416014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecRestoreArray2d(Vec, PetscInt, PetscInt, PetscInt, PetscInt, PetscScalar **[]);
417014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecGetArray1d(Vec, PetscInt, PetscInt, PetscScalar *[]);
418014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecRestoreArray1d(Vec, PetscInt, PetscInt, PetscScalar *[]);
419ab360428SBarry Smith 
420fdc842d1SBarry Smith PETSC_EXTERN PetscErrorCode VecGetArray4dWrite(Vec, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscScalar ****[]);
421fdc842d1SBarry Smith PETSC_EXTERN PetscErrorCode VecGetArray4dWrite(Vec, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscScalar ****[]);
422fdc842d1SBarry Smith PETSC_EXTERN PetscErrorCode VecRestoreArray4dWrite(Vec, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscScalar ****[]);
423fdc842d1SBarry Smith PETSC_EXTERN PetscErrorCode VecGetArray3dWrite(Vec, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscScalar ***[]);
424fdc842d1SBarry Smith PETSC_EXTERN PetscErrorCode VecRestoreArray3dWrite(Vec, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscScalar ***[]);
425fdc842d1SBarry Smith PETSC_EXTERN PetscErrorCode VecGetArray2dWrite(Vec, PetscInt, PetscInt, PetscInt, PetscInt, PetscScalar **[]);
426fdc842d1SBarry Smith PETSC_EXTERN PetscErrorCode VecRestoreArray2dWrite(Vec, PetscInt, PetscInt, PetscInt, PetscInt, PetscScalar **[]);
427fdc842d1SBarry Smith PETSC_EXTERN PetscErrorCode VecGetArray1dWrite(Vec, PetscInt, PetscInt, PetscScalar *[]);
428fdc842d1SBarry Smith PETSC_EXTERN PetscErrorCode VecRestoreArray1dWrite(Vec, PetscInt, PetscInt, PetscScalar *[]);
429fdc842d1SBarry Smith 
4305edff71fSBarry Smith PETSC_EXTERN PetscErrorCode VecGetArray4dRead(Vec, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscScalar ****[]);
4315edff71fSBarry Smith PETSC_EXTERN PetscErrorCode VecRestoreArray4dRead(Vec, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscScalar ****[]);
4325edff71fSBarry Smith PETSC_EXTERN PetscErrorCode VecGetArray3dRead(Vec, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscScalar ***[]);
4335edff71fSBarry Smith PETSC_EXTERN PetscErrorCode VecRestoreArray3dRead(Vec, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscInt, PetscScalar ***[]);
4345edff71fSBarry Smith PETSC_EXTERN PetscErrorCode VecGetArray2dRead(Vec, PetscInt, PetscInt, PetscInt, PetscInt, PetscScalar **[]);
4355edff71fSBarry Smith PETSC_EXTERN PetscErrorCode VecRestoreArray2dRead(Vec, PetscInt, PetscInt, PetscInt, PetscInt, PetscScalar **[]);
4365edff71fSBarry Smith PETSC_EXTERN PetscErrorCode VecGetArray1dRead(Vec, PetscInt, PetscInt, PetscScalar *[]);
4375edff71fSBarry Smith PETSC_EXTERN PetscErrorCode VecRestoreArray1dRead(Vec, PetscInt, PetscInt, PetscScalar *[]);
4385edff71fSBarry Smith 
439014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecPlaceArray(Vec, const PetscScalar[]);
440014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecResetArray(Vec);
441014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecReplaceArray(Vec, const PetscScalar[]);
442de0d48c1SKarl Rupp 
443014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecGetArrays(const Vec[], PetscInt, PetscScalar **[]);
444014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecRestoreArrays(const Vec[], PetscInt, PetscScalar **[]);
44584cb2905SBarry Smith 
446014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecView(Vec, PetscViewer);
447f9558f5cSBarry Smith PETSC_EXTERN PetscErrorCode VecViewNative(Vec, PetscViewer);
448014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecEqual(Vec, Vec, PetscBool *);
449014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecLoad(Vec, PetscViewer);
4508ed539a5SBarry Smith 
451014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecGetSize(Vec, PetscInt *);
452014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecGetLocalSize(Vec, PetscInt *);
453014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecGetOwnershipRange(Vec, PetscInt *, PetscInt *);
454014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecGetOwnershipRanges(Vec, const PetscInt *[]);
4558ed539a5SBarry Smith 
456014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecSetLocalToGlobalMapping(Vec, ISLocalToGlobalMapping);
457014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecSetValuesLocal(Vec, PetscInt, const PetscInt[], const PetscScalar[], InsertMode);
45888b03592SBarry Smith 
45976ec7f3eSKaushik Kulkarni PETSC_EXTERN PetscErrorCode VecViennaCLGetCLContext(Vec, PETSC_UINTPTR_T *);
46076ec7f3eSKaushik Kulkarni PETSC_EXTERN PetscErrorCode VecViennaCLGetCLQueue(Vec, PETSC_UINTPTR_T *);
46176ec7f3eSKaushik Kulkarni PETSC_EXTERN PetscErrorCode VecViennaCLGetCLMemRead(Vec, PETSC_UINTPTR_T *);
46276ec7f3eSKaushik Kulkarni PETSC_EXTERN PetscErrorCode VecViennaCLGetCLMemWrite(Vec, PETSC_UINTPTR_T *);
46376ec7f3eSKaushik Kulkarni PETSC_EXTERN PetscErrorCode VecViennaCLRestoreCLMemWrite(Vec);
46476ec7f3eSKaushik Kulkarni PETSC_EXTERN PetscErrorCode VecViennaCLGetCLMem(Vec, PETSC_UINTPTR_T *);
46576ec7f3eSKaushik Kulkarni PETSC_EXTERN PetscErrorCode VecViennaCLRestoreCLMem(Vec);
46676ec7f3eSKaushik Kulkarni 
46788b03592SBarry Smith /*MC
46888b03592SBarry Smith    VecSetValueLocal - Set a single entry into a vector using the local numbering
46988b03592SBarry Smith 
47088b03592SBarry Smith    Synopsis:
471aaa7dc30SBarry Smith    #include <petscvec.h>
4728122439eSJed Brown    PetscErrorCode VecSetValueLocal(Vec v,PetscInt row,PetscScalar value, InsertMode mode);
47388b03592SBarry Smith 
47488b03592SBarry Smith    Not Collective
47588b03592SBarry Smith 
47688b03592SBarry Smith    Input Parameters:
47788b03592SBarry Smith +  v - the vector
47888b03592SBarry Smith .  row - the row location of the entry
47988b03592SBarry Smith .  value - the value to insert
48087497f52SBarry Smith -  mode - either `INSERT_VALUES` or `ADD_VALUES`
48188b03592SBarry Smith 
48288b03592SBarry Smith    Notes:
48387497f52SBarry Smith    For efficiency one should use `VecSetValues()` and set several or
48488b03592SBarry Smith    many values simultaneously if possible.
48588b03592SBarry Smith 
48687497f52SBarry Smith    These values may be cached, so `VecAssemblyBegin()` and `VecAssemblyEnd()`
48787497f52SBarry Smith    MUST be called after all calls to `VecSetValues()` have been completed.
48888b03592SBarry Smith 
48987497f52SBarry Smith    `VecSetValues()` uses 0-based indices in Fortran as well as in C.
49088b03592SBarry Smith 
49188b03592SBarry Smith    Level: beginner
49288b03592SBarry Smith 
493db781477SPatrick Sanan .seealso: `VecSetValues()`, `VecAssemblyBegin()`, `VecAssemblyEnd()`, `VecSetValuesBlockedLocal()`, `VecSetValue()`
49488b03592SBarry Smith M*/
495d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode VecSetValueLocal(Vec v, PetscInt i, PetscScalar va, InsertMode mode)
496d71ae5a4SJacob Faibussowitsch {
4979371c9d4SSatish Balay   return VecSetValuesLocal(v, 1, &i, &va, mode);
4989371c9d4SSatish Balay }
49988b03592SBarry Smith 
50060211e57SBarry Smith /*MC
50160211e57SBarry Smith    VecCheckAssembled - checks if values have been changed in the vector, by `VecSetValues()` or related routines,  but it has not been assembled
50260211e57SBarry Smith 
50360211e57SBarry Smith    Synopsis:
50460211e57SBarry Smith    #include <petscvec.h>
50560211e57SBarry Smith    VecCheckAssembled(Vec v);
50660211e57SBarry Smith 
50760211e57SBarry Smith    Not Collective
50860211e57SBarry Smith 
50960211e57SBarry Smith    Input Parameter:
51060211e57SBarry Smith .  v - the vector to check
51160211e57SBarry Smith 
51260211e57SBarry Smith    Level: developer
51360211e57SBarry Smith 
51460211e57SBarry Smith    Note:
51560211e57SBarry Smith    After calls to `VecSetValues()` and related routines on must call ``VecAssemblyBegin()` and `VecAssemblyEnd()` before using the vector
51660211e57SBarry Smith 
51760211e57SBarry Smith .seealso: [](chapter_vectors), `Vec`, `VecSetValues()`, `VecAssemblyBegin()`, `VecAssemblyEnd()`, `MatAssemblyBegin()`, `MatAssemblyEnd()`
51860211e57SBarry Smith M*/
51960211e57SBarry Smith #define VecCheckAssembled(v) PetscCheck(v->stash.insertmode == NOT_SET_VALUES, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Not for unassembled vector, did you call VecAssemblyBegin()/VecAssemblyEnd()?");
52060211e57SBarry Smith 
521014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecSetValuesBlockedLocal(Vec, PetscInt, const PetscInt[], const PetscScalar[], InsertMode);
522014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecGetLocalToGlobalMapping(Vec, ISLocalToGlobalMapping *);
52390f02eecSBarry Smith 
524014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecDotBegin(Vec, Vec, PetscScalar *);
525014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecDotEnd(Vec, Vec, PetscScalar *);
526014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecTDotBegin(Vec, Vec, PetscScalar *);
527014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecTDotEnd(Vec, Vec, PetscScalar *);
528014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecNormBegin(Vec, NormType, PetscReal *);
529014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecNormEnd(Vec, NormType, PetscReal *);
530d3c178dbSBarry Smith 
531014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecMDotBegin(Vec, PetscInt, const Vec[], PetscScalar[]);
532014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecMDotEnd(Vec, PetscInt, const Vec[], PetscScalar[]);
533014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecMTDotBegin(Vec, PetscInt, const Vec[], PetscScalar[]);
534014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecMTDotEnd(Vec, PetscInt, const Vec[], PetscScalar[]);
535014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscCommSplitReductionBegin(MPI_Comm);
536a751f32aSSatish Balay 
537b470e4b4SRichard Tran Mills PETSC_EXTERN PetscErrorCode VecBindToCPU(Vec, PetscBool);
538d71ae5a4SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION("Use VecBindToCPU (since v3.13)") static inline PetscErrorCode VecPinToCPU(Vec v, PetscBool flg)
539d71ae5a4SJacob Faibussowitsch {
5409371c9d4SSatish Balay   return VecBindToCPU(v, flg);
5419371c9d4SSatish Balay }
5422216c58aSStefano Zampini PETSC_EXTERN PetscErrorCode VecBoundToCPU(Vec, PetscBool *);
54365a9ecf2SRichard Tran Mills PETSC_EXTERN PetscErrorCode VecSetBindingPropagates(Vec, PetscBool);
544e9c74fd6SRichard Tran Mills PETSC_EXTERN PetscErrorCode VecGetBindingPropagates(Vec, PetscBool *);
545387df023SRichard Tran Mills PETSC_EXTERN PetscErrorCode VecSetPinnedMemoryMin(Vec, size_t);
546387df023SRichard Tran Mills PETSC_EXTERN PetscErrorCode VecGetPinnedMemoryMin(Vec, size_t *);
547a751f32aSSatish Balay 
5486fe358cdSKaushik Kulkarni PETSC_EXTERN PetscErrorCode VecGetOffloadMask(Vec, PetscOffloadMask *);
54948d97fd2SKaushik Kulkarni 
5509371c9d4SSatish Balay typedef enum {
5519371c9d4SSatish Balay   VEC_IGNORE_OFF_PROC_ENTRIES,
5529371c9d4SSatish Balay   VEC_IGNORE_NEGATIVE_INDICES,
5539371c9d4SSatish Balay   VEC_SUBSET_OFF_PROC_ENTRIES
5549371c9d4SSatish Balay } VecOption;
555014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecSetOption(Vec, VecOption, PetscBool);
55690f02eecSBarry Smith 
5575c0c2446SJed Brown PETSC_EXTERN PetscErrorCode VecGetArray(Vec, PetscScalar **);
558fdc842d1SBarry Smith PETSC_EXTERN PetscErrorCode VecGetArrayWrite(Vec, PetscScalar **);
5595c0c2446SJed Brown PETSC_EXTERN PetscErrorCode VecGetArrayRead(Vec, const PetscScalar **);
5605c0c2446SJed Brown PETSC_EXTERN PetscErrorCode VecRestoreArray(Vec, PetscScalar **);
561fdc842d1SBarry Smith PETSC_EXTERN PetscErrorCode VecRestoreArrayWrite(Vec, PetscScalar **);
5625c0c2446SJed Brown PETSC_EXTERN PetscErrorCode VecRestoreArrayRead(Vec, const PetscScalar **);
563df341386SStefano Zampini PETSC_EXTERN PetscErrorCode VecCreateLocalVector(Vec, Vec *);
564046dc149SDominic Meiser PETSC_EXTERN PetscErrorCode VecGetLocalVector(Vec, Vec);
565046dc149SDominic Meiser PETSC_EXTERN PetscErrorCode VecRestoreLocalVector(Vec, Vec);
566046dc149SDominic Meiser PETSC_EXTERN PetscErrorCode VecGetLocalVectorRead(Vec, Vec);
567046dc149SDominic Meiser PETSC_EXTERN PetscErrorCode VecRestoreLocalVectorRead(Vec, Vec);
568a256111fSJunchao Zhang PETSC_EXTERN PetscErrorCode VecGetArrayAndMemType(Vec, PetscScalar **, PetscMemType *);
569a256111fSJunchao Zhang PETSC_EXTERN PetscErrorCode VecRestoreArrayAndMemType(Vec, PetscScalar **);
570a256111fSJunchao Zhang PETSC_EXTERN PetscErrorCode VecGetArrayReadAndMemType(Vec, const PetscScalar **, PetscMemType *);
571a256111fSJunchao Zhang PETSC_EXTERN PetscErrorCode VecRestoreArrayReadAndMemType(Vec, const PetscScalar **);
572b5f78e91SJunchao Zhang PETSC_EXTERN PetscErrorCode VecGetArrayWriteAndMemType(Vec, PetscScalar **, PetscMemType *);
573b5f78e91SJunchao Zhang PETSC_EXTERN PetscErrorCode VecRestoreArrayWriteAndMemType(Vec, PetscScalar **);
57410171e34SJunchao Zhang 
5759521ec69SBarry Smith /*@C
5769521ec69SBarry Smith    VecGetArrayPair - Accesses a pair of pointers for two vectors that may be common. When not common the first is read only
5779521ec69SBarry Smith 
578c3339decSBarry Smith    Logically Collective
5799521ec69SBarry Smith 
580f5f57ec0SBarry Smith    Input Parameters:
5819521ec69SBarry Smith +  x - the vector
5829521ec69SBarry Smith -  y - the second vector
5839521ec69SBarry Smith 
584f5f57ec0SBarry Smith    Output Parameters:
5859521ec69SBarry Smith +  xv - location to put pointer to the first array
5869521ec69SBarry Smith -  yv - location to put pointer to the second array
5879521ec69SBarry Smith 
5889521ec69SBarry Smith    Level: developer
5899521ec69SBarry Smith 
590f5f57ec0SBarry Smith    Not available from Fortran
591f5f57ec0SBarry Smith 
592db781477SPatrick Sanan .seealso: `VecGetArray()`, `VecGetArrayRead()`, `VecRestoreArrayPair()`
5939521ec69SBarry Smith 
5949521ec69SBarry Smith @*/
595d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode VecGetArrayPair(Vec x, Vec y, PetscScalar **xv, PetscScalar **yv)
596d71ae5a4SJacob Faibussowitsch {
597d9ca1df4SBarry Smith   PetscFunctionBegin;
5989566063dSJacob Faibussowitsch   PetscCall(VecGetArray(y, yv));
5995f80ce2aSJacob Faibussowitsch   if (x == y) *xv = *yv;
6009566063dSJacob Faibussowitsch   else PetscCall(VecGetArrayRead(x, (const PetscScalar **)xv));
601*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
602d9ca1df4SBarry Smith }
6039521ec69SBarry Smith 
6049521ec69SBarry Smith /*@C
6059521ec69SBarry Smith    VecRestoreArrayPair - Returns a pair of pointers for two vectors that may be common. When not common the first is read only
6069521ec69SBarry Smith 
607c3339decSBarry Smith    Logically Collective
6089521ec69SBarry Smith 
609f5f57ec0SBarry Smith    Input Parameters:
6109521ec69SBarry Smith +  x - the vector
6119521ec69SBarry Smith -  y - the second vector
6129521ec69SBarry Smith 
613f5f57ec0SBarry Smith    Output Parameters:
6149521ec69SBarry Smith +  xv - location to put pointer to the first array
6159521ec69SBarry Smith -  yv - location to put pointer to the second array
6169521ec69SBarry Smith 
6179521ec69SBarry Smith    Level: developer
6189521ec69SBarry Smith 
619f5f57ec0SBarry Smith    Not available from Fortran
620f5f57ec0SBarry Smith 
621db781477SPatrick Sanan .seealso: `VecGetArray()`, `VecGetArrayRead()`, `VecGetArrayPair()`
6229521ec69SBarry Smith 
6239521ec69SBarry Smith @*/
624d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode VecRestoreArrayPair(Vec x, Vec y, PetscScalar **xv, PetscScalar **yv)
625d71ae5a4SJacob Faibussowitsch {
626d9ca1df4SBarry Smith   PetscFunctionBegin;
6279566063dSJacob Faibussowitsch   PetscCall(VecRestoreArray(y, yv));
6289566063dSJacob Faibussowitsch   if (x != y) PetscCall(VecRestoreArrayRead(x, (const PetscScalar **)xv));
629*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
630d9ca1df4SBarry Smith }
631d9ca1df4SBarry Smith 
632d9ca1df4SBarry Smith #if defined(PETSC_USE_DEBUG)
63338fecf7cSJunchao Zhang PETSC_EXTERN PetscErrorCode  VecLockReadPush(Vec);
63438fecf7cSJunchao Zhang PETSC_EXTERN PetscErrorCode  VecLockReadPop(Vec);
635805b4a0dSBarry Smith PETSC_EXTERN PetscErrorCode  VecLockWriteSet(Vec, PetscBool);
636d9ca1df4SBarry Smith PETSC_EXTERN PetscErrorCode  VecLockGet(Vec, PetscInt *);
6375a96b57dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode  VecLockGetLocation(Vec, const char *[], const char *[], int *);
638d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode VecSetErrorIfLocked(Vec x, PetscInt arg)
639d71ae5a4SJacob Faibussowitsch {
640da1c2f70SJunchao Zhang   PetscInt state;
64138fecf7cSJunchao Zhang 
642da1c2f70SJunchao Zhang   PetscFunctionBegin;
6439566063dSJacob Faibussowitsch   PetscCall(VecLockGet(x, &state));
6445a96b57dSJacob Faibussowitsch   if (PetscUnlikely(state != 0)) {
6455a96b57dSJacob Faibussowitsch     const char *file, *func, *name;
6465a96b57dSJacob Faibussowitsch     int         line;
6475a96b57dSJacob Faibussowitsch 
6485a96b57dSJacob Faibussowitsch     PetscCall(VecLockGetLocation(x, &file, &func, &line));
6495a96b57dSJacob Faibussowitsch     PetscCall(PetscObjectGetName((PetscObject)x, &name));
650dfb7d7afSStefano Zampini     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);
6515a96b57dSJacob Faibussowitsch   }
652*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
653da1c2f70SJunchao Zhang }
65438fecf7cSJunchao Zhang /* The three are deprecated */
6555f1efc1aSLisandro Dalcin PETSC_EXTERN PETSC_DEPRECATED_FUNCTION("Use VecLockReadPush() (since version 3.11)") PetscErrorCode VecLockPush(Vec);
6565f1efc1aSLisandro Dalcin PETSC_EXTERN PETSC_DEPRECATED_FUNCTION("Use VecLockReadPop() (since version 3.11)") PetscErrorCode VecLockPop(Vec);
657ed274036SLisandro Dalcin   #define VecLocked(x, arg) VecSetErrorIfLocked(x, arg) PETSC_DEPRECATED_MACRO("GCC warning \"Use VecSetErrorIfLocked() (since version 3.11)\"")
658d9ca1df4SBarry Smith #else
659*3ba16761SJacob Faibussowitsch   #define VecLockReadPush(x)          PETSC_SUCCESS
660*3ba16761SJacob Faibussowitsch   #define VecLockReadPop(x)           PETSC_SUCCESS
661*3ba16761SJacob Faibussowitsch   #define VecLockGet(x, s)            (*(s) = 0, PETSC_SUCCESS)
662*3ba16761SJacob Faibussowitsch   #define VecSetErrorIfLocked(x, arg) PETSC_SUCCESS
663*3ba16761SJacob Faibussowitsch   #define VecLockWriteSet(x, flg)     PETSC_SUCCESS
66438fecf7cSJunchao Zhang   /* The three are deprecated */
665*3ba16761SJacob Faibussowitsch   #define VecLockPush(x)              PETSC_SUCCESS
666*3ba16761SJacob Faibussowitsch   #define VecLockPop(x)               PETSC_SUCCESS
667*3ba16761SJacob Faibussowitsch   #define VecLocked(x, arg)           PETSC_SUCCESS
668d9ca1df4SBarry Smith #endif
669e1fa1e0fSSatish Balay 
67074852143SJacob Faibussowitsch /*E
67174852143SJacob Faibussowitsch   VecOperation - Enumeration of overide-able methods in the `Vec` implementation function-table.
67274852143SJacob Faibussowitsch 
67374852143SJacob Faibussowitsch + VECOP_DUPLICATE  - `VecDuplicate()`
67474852143SJacob Faibussowitsch . VECOP_SET        - `VecSet()`
67574852143SJacob Faibussowitsch . VECOP_VIEW       - `VecView()`
67674852143SJacob Faibussowitsch . VECOP_LOAD       - `VecLoad()`
67774852143SJacob Faibussowitsch . VECOP_VIEWNATIVE - `VecViewNative()`
67874852143SJacob Faibussowitsch - VECOP_LOADNATIVE - `VecLoadNative()`
67974852143SJacob Faibussowitsch 
68074852143SJacob Faibussowitsch   Notes:
68174852143SJacob Faibussowitsch   Some operations may serve as the implementation for other routines not listed above. For
68274852143SJacob Faibussowitsch   example `VECOP_SET` can be used to simultaneously overriding the implementation used in
68374852143SJacob Faibussowitsch   `VecSet()`, `VecSetInf()`, and `VecZeroEntries()`.
68474852143SJacob Faibussowitsch 
68574852143SJacob Faibussowitsch   Entries to `VecOperation` are added as needed so if you do not see the operation listed which
68674852143SJacob Faibussowitsch   you'd like to replace, please send mail to `petsc-maint@mcs.anl.gov`!
68774852143SJacob Faibussowitsch 
68874852143SJacob Faibussowitsch   Level: advanced
68974852143SJacob Faibussowitsch 
69074852143SJacob Faibussowitsch .seealso: `Vec`, `VecSetOperation()`
69123084d82SJacob Faibussowitsch E*/
6929371c9d4SSatish Balay typedef enum {
6939371c9d4SSatish Balay   VECOP_DUPLICATE  = 0,
69474852143SJacob Faibussowitsch   VECOP_SET        = 10,
6959371c9d4SSatish Balay   VECOP_VIEW       = 33,
6969371c9d4SSatish Balay   VECOP_LOAD       = 41,
6979371c9d4SSatish Balay   VECOP_VIEWNATIVE = 68,
6989371c9d4SSatish Balay   VECOP_LOADNATIVE = 69
6999371c9d4SSatish Balay } VecOperation;
700014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecSetOperation(Vec, VecOperation, void (*)(void));
701b19c1e4cSBarry Smith 
702e182c471SBarry Smith /*
703e182c471SBarry Smith      Routines for dealing with ghosted vectors:
704e182c471SBarry Smith   vectors with ghost elements at the end of the array.
705e182c471SBarry Smith */
706014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecMPISetGhost(Vec, PetscInt, const PetscInt[]);
707014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecCreateGhost(MPI_Comm, PetscInt, PetscInt, PetscInt, const PetscInt[], Vec *);
708014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecCreateGhostWithArray(MPI_Comm, PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscScalar[], Vec *);
709014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecCreateGhostBlock(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, const PetscInt[], Vec *);
710014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecCreateGhostBlockWithArray(MPI_Comm, PetscInt, PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscScalar[], Vec *);
711014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecGhostGetLocalForm(Vec, Vec *);
712014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecGhostRestoreLocalForm(Vec, Vec *);
7133efe6655SBarry Smith PETSC_EXTERN PetscErrorCode VecGhostIsLocalForm(Vec, Vec, PetscBool *);
714014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecGhostUpdateBegin(Vec, InsertMode, ScatterMode);
715014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecGhostUpdateEnd(Vec, InsertMode, ScatterMode);
716e182c471SBarry Smith 
717014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecConjugate(Vec);
718c92e3469SBarry Smith PETSC_EXTERN PetscErrorCode VecImaginaryPart(Vec);
719c92e3469SBarry Smith PETSC_EXTERN PetscErrorCode VecRealPart(Vec);
72034233285SBarry Smith 
721014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecScatterCreateToAll(Vec, VecScatter *, Vec *);
722014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecScatterCreateToZero(Vec, VecScatter *, Vec *);
723bba1ac68SSatish Balay 
7244473680cSBarry Smith PETSC_EXTERN PetscErrorCode ISComplementVec(IS, Vec, IS *);
7254473680cSBarry Smith PETSC_EXTERN PetscErrorCode VecPow(Vec, PetscScalar);
7264473680cSBarry Smith PETSC_EXTERN PetscErrorCode VecMedian(Vec, Vec, Vec, Vec);
727ce902467SBarry Smith PETSC_EXTERN PetscErrorCode VecWhichInactive(Vec, Vec, Vec, Vec, PetscBool, IS *);
7284473680cSBarry Smith PETSC_EXTERN PetscErrorCode VecWhichBetween(Vec, Vec, Vec, IS *);
7294473680cSBarry Smith PETSC_EXTERN PetscErrorCode VecWhichBetweenOrEqual(Vec, Vec, Vec, IS *);
7304473680cSBarry Smith PETSC_EXTERN PetscErrorCode VecWhichGreaterThan(Vec, Vec, IS *);
7314473680cSBarry Smith PETSC_EXTERN PetscErrorCode VecWhichLessThan(Vec, Vec, IS *);
7324473680cSBarry Smith PETSC_EXTERN PetscErrorCode VecWhichEqual(Vec, Vec, IS *);
7334473680cSBarry Smith PETSC_EXTERN PetscErrorCode VecISAXPY(Vec, IS, PetscScalar, Vec);
7348883cd90SMatthew G. Knepley PETSC_EXTERN PetscErrorCode VecISCopy(Vec, IS, ScatterMode, Vec);
7354473680cSBarry Smith PETSC_EXTERN PetscErrorCode VecISSet(Vec, IS, PetscScalar);
7364473680cSBarry Smith PETSC_EXTERN PetscErrorCode VecBoundGradientProjection(Vec, Vec, Vec, Vec, Vec);
7374473680cSBarry Smith PETSC_EXTERN PetscErrorCode VecStepBoundInfo(Vec, Vec, Vec, Vec, PetscReal *, PetscReal *, PetscReal *);
7384473680cSBarry Smith PETSC_EXTERN PetscErrorCode VecStepMax(Vec, Vec, PetscReal *);
7394473680cSBarry Smith PETSC_EXTERN PetscErrorCode VecStepMaxBounded(Vec, Vec, Vec, Vec, PetscReal *);
7404473680cSBarry Smith 
741014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscViewerMathematicaGetVector(PetscViewer, Vec);
742014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscViewerMathematicaPutVector(PetscViewer, Vec);
7437dbadf16SMatthew Knepley 
744d59c15a7SBarry Smith /*S
745d59c15a7SBarry Smith      Vecs - Collection of vectors where the data for the vectors is stored in
746759e7b9cSHong Zhang             one contiguous memory
747d59c15a7SBarry Smith 
748d59c15a7SBarry Smith    Level: advanced
749d59c15a7SBarry Smith 
750d59c15a7SBarry Smith    Notes:
751d59c15a7SBarry Smith     Temporary construct for handling multiply right hand side solves
752d59c15a7SBarry Smith 
753d59c15a7SBarry Smith     This is faked by storing a single vector that has enough array space for
754d59c15a7SBarry Smith     n vectors
755d59c15a7SBarry Smith 
756d59c15a7SBarry Smith S*/
7579371c9d4SSatish Balay struct _n_Vecs {
7589371c9d4SSatish Balay   PetscInt n;
7599371c9d4SSatish Balay   Vec      v;
7609371c9d4SSatish Balay };
76195fbd943SSatish Balay typedef struct _n_Vecs     *Vecs;
762e1317eeeSBarry Smith PETSC_EXTERN PetscErrorCode VecsDestroy(Vecs);
763e1317eeeSBarry Smith PETSC_EXTERN PetscErrorCode VecsCreateSeq(MPI_Comm, PetscInt, PetscInt, Vecs *);
764e1317eeeSBarry Smith PETSC_EXTERN PetscErrorCode VecsCreateSeqWithArray(MPI_Comm, PetscInt, PetscInt, PetscScalar *, Vecs *);
765e1317eeeSBarry Smith PETSC_EXTERN PetscErrorCode VecsDuplicate(Vecs, Vecs *);
766e9fa29b7SSatish Balay 
767e9e886b6SKarl Rupp #if defined(PETSC_HAVE_VIENNACL)
768b17c682bSKarl Rupp typedef struct _p_PetscViennaCLIndices *PetscViennaCLIndices;
769b17c682bSKarl Rupp PETSC_EXTERN PetscErrorCode             PetscViennaCLIndicesCreate(PetscInt, PetscInt *, PetscInt, PetscInt *, PetscViennaCLIndices *);
770b17c682bSKarl Rupp PETSC_EXTERN PetscErrorCode             PetscViennaCLIndicesDestroy(PetscViennaCLIndices *);
771b17c682bSKarl Rupp PETSC_EXTERN PetscErrorCode             VecViennaCLCopyToGPUSome_Public(Vec, PetscViennaCLIndices);
772b17c682bSKarl Rupp PETSC_EXTERN PetscErrorCode             VecViennaCLCopyFromGPUSome_Public(Vec, PetscViennaCLIndices);
773b17c682bSKarl Rupp PETSC_EXTERN PetscErrorCode             VecCreateSeqViennaCL(MPI_Comm, PetscInt, Vec *);
774b17c682bSKarl Rupp PETSC_EXTERN PetscErrorCode             VecCreateMPIViennaCL(MPI_Comm, PetscInt, PetscInt, Vec *);
775b8ced49eSKarl Rupp #endif
77659af0bd3SScott Kruger #if defined(PETSC_HAVE_CUDA) || defined(PETSC_HAVE_HIP)
77759af0bd3SScott Kruger PETSC_EXTERN PetscErrorCode VecScatterInitializeForGPU(VecScatter, Vec);
77859af0bd3SScott Kruger PETSC_EXTERN PetscErrorCode VecScatterFinalizeForGPU(VecScatter);
77959af0bd3SScott Kruger #endif
7801e8b6502SStefano Zampini #if defined(PETSC_HAVE_KOKKOS_KERNELS)
7811e8b6502SStefano Zampini PETSC_EXTERN PetscErrorCode VecCreateSeqKokkos(MPI_Comm, PetscInt, Vec *);
7821e8b6502SStefano Zampini PETSC_EXTERN PetscErrorCode VecCreateSeqKokkosWithArray(MPI_Comm, PetscInt, PetscInt, const PetscScalar *, Vec *);
7831e8b6502SStefano Zampini PETSC_EXTERN PetscErrorCode VecCreateMPIKokkos(MPI_Comm, PetscInt, PetscInt, Vec *);
7841e8b6502SStefano Zampini PETSC_EXTERN PetscErrorCode VecCreateMPIKokkosWithArray(MPI_Comm, PetscInt, PetscInt, PetscInt, const PetscScalar *, Vec *);
7851e8b6502SStefano Zampini #endif
786b17c682bSKarl Rupp 
787014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecNestGetSubVecs(Vec, PetscInt *, Vec **);
788014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecNestGetSubVec(Vec, PetscInt, Vec *);
789014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecNestSetSubVecs(Vec, PetscInt, PetscInt *, Vec *);
790014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecNestSetSubVec(Vec, PetscInt, Vec);
791014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecCreateNest(MPI_Comm, PetscInt, IS *, Vec *, Vec *);
792014dd563SJed Brown PETSC_EXTERN PetscErrorCode VecNestGetSize(Vec, PetscInt *);
79345b63f25SDmitry Karpeev 
794c5929fdfSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsGetVec(PetscOptions, const char[], const char[], Vec, PetscBool *);
7954325cce7SMatthew G Knepley PETSC_EXTERN PetscErrorCode VecChop(Vec, PetscReal);
796ab352700SBarry Smith 
797077aedafSJed Brown PETSC_EXTERN PetscErrorCode VecGetLayout(Vec, PetscLayout *);
798077aedafSJed Brown PETSC_EXTERN PetscErrorCode VecSetLayout(Vec, PetscLayout);
7999a6d0b0bSJed Brown 
8009a6d0b0bSJed Brown PETSC_EXTERN PetscErrorCode PetscSectionVecView(PetscSection, Vec, PetscViewer);
8019a6d0b0bSJed Brown PETSC_EXTERN PetscErrorCode VecGetValuesSection(Vec, PetscSection, PetscInt, PetscScalar **);
8029a6d0b0bSJed Brown PETSC_EXTERN PetscErrorCode VecSetValuesSection(Vec, PetscSection, PetscInt, PetscScalar[], InsertMode);
80322d96a0cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscSectionVecNorm(PetscSection, PetscSection, Vec, NormType, PetscReal[]);
8049a6d0b0bSJed Brown 
8055543aaa0SToby Isaac /*S
8065543aaa0SToby Isaac   VecTagger - Object used to manage the tagging of a subset of indices based on the values of a vector.  The
8075543aaa0SToby Isaac               motivating application is the selection of cells for refinement or coarsening based on vector containing
8085543aaa0SToby Isaac               the values in an error indicator metric.
8095543aaa0SToby Isaac 
8105543aaa0SToby Isaac   Level: advanced
81187497f52SBarry Smith 
81287497f52SBarry Smith   Developer Note:
81387497f52SBarry Smith   Why not use a `DMLabel` or similar object
81487497f52SBarry Smith 
8155543aaa0SToby Isaac S*/
81661bbf837SToby Isaac typedef struct _p_VecTagger *VecTagger;
8175543aaa0SToby Isaac 
8185543aaa0SToby Isaac /*J
81987497f52SBarry Smith   VecTaggerType - String with the name of a `VecTagger` type
8205543aaa0SToby Isaac 
8215543aaa0SToby Isaac   Level: advanced
8225543aaa0SToby Isaac J*/
8235543aaa0SToby Isaac typedef const char *VecTaggerType;
8244178c1b7SToby Isaac /* tag where the vector values are in a box of explicitly defined values */
825cab77d58SToby Isaac #define VECTAGGERABSOLUTE "absolute"
8264178c1b7SToby Isaac /* tag where the vector values are in a box of values relative to the set of all values in the vector */
8275543aaa0SToby Isaac #define VECTAGGERRELATIVE "relative"
8285543aaa0SToby Isaac /* tag where the vector values are in a relative range of the *cumulative distribution* of values in the vector */
8291d1d0dd8SToby Isaac #define VECTAGGERCDF "cdf"
8305543aaa0SToby Isaac /* tag a vector as the union of other tags */
8315543aaa0SToby Isaac #define VECTAGGEROR "or"
8325543aaa0SToby Isaac /* tag a vector as the intersection of other tags */
8335543aaa0SToby Isaac #define VECTAGGERAND "and"
8345543aaa0SToby Isaac 
8355543aaa0SToby Isaac PETSC_EXTERN PetscClassId      VEC_TAGGER_CLASSID;
83661bbf837SToby Isaac PETSC_EXTERN PetscFunctionList VecTaggerList;
83761bbf837SToby Isaac PETSC_EXTERN PetscErrorCode    VecTaggerRegister(const char[], PetscErrorCode (*)(VecTagger));
8385543aaa0SToby Isaac 
8395543aaa0SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerCreate(MPI_Comm, VecTagger *);
840cab77d58SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerSetBlockSize(VecTagger, PetscInt);
841cab77d58SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerGetBlockSize(VecTagger, PetscInt *);
8425543aaa0SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerSetType(VecTagger, VecTaggerType);
8435543aaa0SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerGetType(VecTagger, VecTaggerType *);
8445543aaa0SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerSetInvert(VecTagger, PetscBool);
8455543aaa0SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerGetInvert(VecTagger, PetscBool *);
8465543aaa0SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerSetFromOptions(VecTagger);
8475543aaa0SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerSetUp(VecTagger);
8485543aaa0SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerView(VecTagger, PetscViewer);
8491cee10b1SBarry Smith PETSC_EXTERN PetscErrorCode VecTaggerComputeIS(VecTagger, Vec, IS *, PetscBool *);
8505543aaa0SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerDestroy(VecTagger *);
8515543aaa0SToby Isaac 
8524178c1b7SToby Isaac /*S
8534178c1b7SToby Isaac    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
8544178c1b7SToby Isaac    such that real(min) <= real(z) <= real(max) and imag(min) <= imag(z) <= imag(max).  INF is an acceptable endpoint.
85561bbf837SToby Isaac 
8564178c1b7SToby Isaac    Level: beginner
85761bbf837SToby Isaac 
858db781477SPatrick Sanan .seealso: `VecTaggerComputeIntervals()`
8594178c1b7SToby Isaac S*/
8604178c1b7SToby Isaac typedef struct {
8614178c1b7SToby Isaac   PetscScalar min;
8624178c1b7SToby Isaac   PetscScalar max;
8634178c1b7SToby Isaac } VecTaggerBox;
8641cee10b1SBarry Smith PETSC_EXTERN PetscErrorCode VecTaggerComputeBoxes(VecTagger, Vec, PetscInt *, VecTaggerBox **, PetscBool *);
8654178c1b7SToby Isaac 
8664178c1b7SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerAbsoluteSetBox(VecTagger, VecTaggerBox *);
8674178c1b7SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerAbsoluteGetBox(VecTagger, const VecTaggerBox **);
8684178c1b7SToby Isaac 
8694178c1b7SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerRelativeSetBox(VecTagger, VecTaggerBox *);
8704178c1b7SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerRelativeGetBox(VecTagger, const VecTaggerBox **);
8714178c1b7SToby Isaac 
8724178c1b7SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerCDFSetBox(VecTagger, VecTaggerBox *);
8734178c1b7SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerCDFGetBox(VecTagger, const VecTaggerBox **);
8741d1d0dd8SToby Isaac 
8751d1d0dd8SToby Isaac /*E
87687497f52SBarry Smith   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).
87787497f52SBarry Smith   Relevant only in parallel: in serial it is directly computed.
8781d1d0dd8SToby Isaac 
8791d1d0dd8SToby Isaac   Level: advanced
88087497f52SBarry Smith 
881db781477SPatrick Sanan .seealso: `VecTaggerCDFSetMethod()`, `VecTaggerCDFMethods`
8821d1d0dd8SToby Isaac E*/
8839371c9d4SSatish Balay typedef enum {
8849371c9d4SSatish Balay   VECTAGGER_CDF_GATHER,
8859371c9d4SSatish Balay   VECTAGGER_CDF_ITERATIVE,
8869371c9d4SSatish Balay   VECTAGGER_CDF_NUM_METHODS
8879371c9d4SSatish Balay } VecTaggerCDFMethod;
8881d1d0dd8SToby Isaac PETSC_EXTERN const char *const VecTaggerCDFMethods[];
8891d1d0dd8SToby Isaac 
8901d1d0dd8SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerCDFSetMethod(VecTagger, VecTaggerCDFMethod);
8911d1d0dd8SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerCDFGetMethod(VecTagger, VecTaggerCDFMethod *);
8921d1d0dd8SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerCDFIterativeSetTolerances(VecTagger, PetscInt, PetscReal, PetscReal);
8931d1d0dd8SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerCDFIterativeGetTolerances(VecTagger, PetscInt *, PetscReal *, PetscReal *);
89461bbf837SToby Isaac 
895497ee004SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerOrSetSubs(VecTagger, PetscInt, VecTagger *, PetscCopyMode);
896497ee004SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerOrGetSubs(VecTagger, PetscInt *, VecTagger **);
89761bbf837SToby Isaac 
898497ee004SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerAndSetSubs(VecTagger, PetscInt, VecTagger *, PetscCopyMode);
899497ee004SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerAndGetSubs(VecTagger, PetscInt *, VecTagger **);
90061bbf837SToby Isaac 
90161bbf837SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerInitializePackage(void);
90261bbf837SToby Isaac PETSC_EXTERN PetscErrorCode VecTaggerFinalizePackage(void);
90361bbf837SToby Isaac 
904e0f629ddSJacob Faibussowitsch #if PetscDefined(USE_DEBUG)
905e0f629ddSJacob Faibussowitsch /* This is an internal debug-only routine that should not be used by users */
906e0f629ddSJacob Faibussowitsch PETSC_SINGLE_LIBRARY_INTERN PetscErrorCode VecValidValues_Internal(Vec, PetscInt, PetscBool);
907e0f629ddSJacob Faibussowitsch #else
908*3ba16761SJacob Faibussowitsch   #define VecValidValues_Internal(...) PETSC_SUCCESS
909e0f629ddSJacob Faibussowitsch #endif /* PETSC_USE_DEBUG */
910e0f629ddSJacob Faibussowitsch 
9116d54fb17SJacob Faibussowitsch #define VEC_CUPM_NOT_CONFIGURED(impl) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP_SYS, "Must configure PETSc with " PetscStringize(impl) " support to use %s", PETSC_FUNCTION_NAME)
912cdf07013SJacob Faibussowitsch 
9136d54fb17SJacob Faibussowitsch #if PetscDefined(HAVE_CUDA)
914cdf07013SJacob Faibussowitsch   #define VEC_CUDA_DECL_OR_STUB(__decl__, ...) PETSC_EXTERN __decl__;
9156d54fb17SJacob Faibussowitsch #else
916cdf07013SJacob Faibussowitsch   #define VEC_CUDA_DECL_OR_STUB(__decl__, ...) \
917cdf07013SJacob Faibussowitsch     static inline __decl__ \
9186d54fb17SJacob Faibussowitsch     { \
919cdf07013SJacob Faibussowitsch       __VA_ARGS__; \
9206d54fb17SJacob Faibussowitsch       VEC_CUPM_NOT_CONFIGURED(cuda); \
9216d54fb17SJacob Faibussowitsch     }
9226d54fb17SJacob Faibussowitsch #endif /* PETSC_HAVE_CUDA */
9236d54fb17SJacob Faibussowitsch 
9246d54fb17SJacob Faibussowitsch /* extra underscore here to make it line up with the cuda versions */
9256d54fb17SJacob Faibussowitsch #if PetscDefined(HAVE_HIP)
926cdf07013SJacob Faibussowitsch   #define VEC_HIP__DECL_OR_STUB(__decl__, ...) PETSC_EXTERN __decl__;
9276d54fb17SJacob Faibussowitsch #else
928cdf07013SJacob Faibussowitsch   #define VEC_HIP__DECL_OR_STUB(__decl__, ...) \
929cdf07013SJacob Faibussowitsch     static inline __decl__ \
9306d54fb17SJacob Faibussowitsch     { \
931cdf07013SJacob Faibussowitsch       __VA_ARGS__; \
9326d54fb17SJacob Faibussowitsch       VEC_CUPM_NOT_CONFIGURED(hip); \
9336d54fb17SJacob Faibussowitsch     }
9346d54fb17SJacob Faibussowitsch #endif /* PETSC_HAVE_HIP */
9356d54fb17SJacob Faibussowitsch 
936cdf07013SJacob Faibussowitsch VEC_CUDA_DECL_OR_STUB(PetscErrorCode VecCreateSeqCUDA(MPI_Comm a, PetscInt b, Vec *c), (void)a, (void)b, (void)c)
937cdf07013SJacob Faibussowitsch VEC_HIP__DECL_OR_STUB(PetscErrorCode VecCreateSeqHIP(MPI_Comm a, PetscInt b, Vec *c), (void)a, (void)b, (void)c)
9386d54fb17SJacob Faibussowitsch 
939cdf07013SJacob Faibussowitsch VEC_CUDA_DECL_OR_STUB(PetscErrorCode VecCreateSeqCUDAWithArray(MPI_Comm a, PetscInt b, PetscInt c, const PetscScalar *d, Vec *e), (void)a, (void)b, (void)c, (void)d, (void)e)
940cdf07013SJacob Faibussowitsch VEC_HIP__DECL_OR_STUB(PetscErrorCode VecCreateSeqHIPWithArray(MPI_Comm a, PetscInt b, PetscInt c, const PetscScalar *d, Vec *e), (void)a, (void)b, (void)c, (void)d, (void)e)
9416d54fb17SJacob Faibussowitsch 
942cdf07013SJacob Faibussowitsch VEC_CUDA_DECL_OR_STUB(PetscErrorCode VecCreateSeqCUDAWithArrays(MPI_Comm a, PetscInt b, PetscInt c, const PetscScalar *d, const PetscScalar *e, Vec *f), (void)a, (void)b, (void)c, (void)d, (void)e, (void)f)
943cdf07013SJacob Faibussowitsch VEC_HIP__DECL_OR_STUB(PetscErrorCode VecCreateSeqHIPWithArrays(MPI_Comm a, PetscInt b, PetscInt c, const PetscScalar *d, const PetscScalar *e, Vec *f), (void)a, (void)b, (void)c, (void)d, (void)e, (void)f)
9446d54fb17SJacob Faibussowitsch 
945cdf07013SJacob Faibussowitsch VEC_CUDA_DECL_OR_STUB(PetscErrorCode VecCreateMPICUDA(MPI_Comm a, PetscInt b, PetscInt c, Vec *d), (void)a, (void)b, (void)c, (void)d)
946cdf07013SJacob Faibussowitsch VEC_HIP__DECL_OR_STUB(PetscErrorCode VecCreateMPIHIP(MPI_Comm a, PetscInt b, PetscInt c, Vec *d), (void)a, (void)b, (void)c, (void)d)
9476d54fb17SJacob Faibussowitsch 
948cdf07013SJacob Faibussowitsch VEC_CUDA_DECL_OR_STUB(PetscErrorCode VecCreateMPICUDAWithArray(MPI_Comm a, PetscInt b, PetscInt c, PetscInt d, const PetscScalar *e, Vec *f), (void)a, (void)b, (void)c, (void)d, (void)e, (void)f)
949cdf07013SJacob Faibussowitsch VEC_HIP__DECL_OR_STUB(PetscErrorCode VecCreateMPIHIPWithArray(MPI_Comm a, PetscInt b, PetscInt c, PetscInt d, const PetscScalar *e, Vec *f), (void)a, (void)b, (void)c, (void)d, (void)e, (void)f)
9506d54fb17SJacob Faibussowitsch 
951cdf07013SJacob Faibussowitsch VEC_CUDA_DECL_OR_STUB(PetscErrorCode VecCreateMPICUDAWithArrays(MPI_Comm a, PetscInt b, PetscInt c, PetscInt d, const PetscScalar *e, const PetscScalar *f, Vec *g), (void)a, (void)b, (void)c, (void)d, (void)e, (void)f, (void)g)
952cdf07013SJacob Faibussowitsch VEC_HIP__DECL_OR_STUB(PetscErrorCode VecCreateMPIHIPWithArrays(MPI_Comm a, PetscInt b, PetscInt c, PetscInt d, const PetscScalar *e, const PetscScalar *f, Vec *g), (void)a, (void)b, (void)c, (void)d, (void)e, (void)f, (void)g)
9536d54fb17SJacob Faibussowitsch 
954cdf07013SJacob Faibussowitsch VEC_CUDA_DECL_OR_STUB(PetscErrorCode VecCUDAGetArray(Vec a, PetscScalar **b), (void)a, (void)b)
955cdf07013SJacob Faibussowitsch VEC_HIP__DECL_OR_STUB(PetscErrorCode VecHIPGetArray(Vec a, PetscScalar **b), (void)a, (void)b)
9566d54fb17SJacob Faibussowitsch 
957cdf07013SJacob Faibussowitsch VEC_CUDA_DECL_OR_STUB(PetscErrorCode VecCUDARestoreArray(Vec a, PetscScalar **b), (void)a, (void)b)
958cdf07013SJacob Faibussowitsch VEC_HIP__DECL_OR_STUB(PetscErrorCode VecHIPRestoreArray(Vec a, PetscScalar **b), (void)a, (void)b)
9596d54fb17SJacob Faibussowitsch 
960cdf07013SJacob Faibussowitsch VEC_CUDA_DECL_OR_STUB(PetscErrorCode VecCUDAGetArrayRead(Vec a, const PetscScalar **b), (void)a, (void)b)
961cdf07013SJacob Faibussowitsch VEC_HIP__DECL_OR_STUB(PetscErrorCode VecHIPGetArrayRead(Vec a, const PetscScalar **b), (void)a, (void)b)
9626d54fb17SJacob Faibussowitsch 
963cdf07013SJacob Faibussowitsch VEC_CUDA_DECL_OR_STUB(PetscErrorCode VecCUDARestoreArrayRead(Vec a, const PetscScalar **b), (void)a, (void)b)
964cdf07013SJacob Faibussowitsch VEC_HIP__DECL_OR_STUB(PetscErrorCode VecHIPRestoreArrayRead(Vec a, const PetscScalar **b), (void)a, (void)b)
9656d54fb17SJacob Faibussowitsch 
966cdf07013SJacob Faibussowitsch VEC_CUDA_DECL_OR_STUB(PetscErrorCode VecCUDAGetArrayWrite(Vec a, PetscScalar **b), (void)a, (void)b)
967cdf07013SJacob Faibussowitsch VEC_HIP__DECL_OR_STUB(PetscErrorCode VecHIPGetArrayWrite(Vec a, PetscScalar **b), (void)a, (void)b)
9686d54fb17SJacob Faibussowitsch 
969cdf07013SJacob Faibussowitsch VEC_CUDA_DECL_OR_STUB(PetscErrorCode VecCUDARestoreArrayWrite(Vec a, PetscScalar **b), (void)a, (void)b)
970cdf07013SJacob Faibussowitsch VEC_HIP__DECL_OR_STUB(PetscErrorCode VecHIPRestoreArrayWrite(Vec a, PetscScalar **b), (void)a, (void)b)
9716d54fb17SJacob Faibussowitsch 
972cdf07013SJacob Faibussowitsch VEC_CUDA_DECL_OR_STUB(PetscErrorCode VecCUDAPlaceArray(Vec a, const PetscScalar b[]), (void)a, (void)b)
973cdf07013SJacob Faibussowitsch VEC_HIP__DECL_OR_STUB(PetscErrorCode VecHIPPlaceArray(Vec a, const PetscScalar b[]), (void)a, (void)b)
9746d54fb17SJacob Faibussowitsch 
975cdf07013SJacob Faibussowitsch VEC_CUDA_DECL_OR_STUB(PetscErrorCode VecCUDAReplaceArray(Vec a, const PetscScalar b[]), (void)a, (void)b)
976cdf07013SJacob Faibussowitsch VEC_HIP__DECL_OR_STUB(PetscErrorCode VecHIPReplaceArray(Vec a, const PetscScalar b[]), (void)a, (void)b)
9776d54fb17SJacob Faibussowitsch 
978cdf07013SJacob Faibussowitsch VEC_CUDA_DECL_OR_STUB(PetscErrorCode VecCUDAResetArray(Vec a), (void)a)
979cdf07013SJacob Faibussowitsch VEC_HIP__DECL_OR_STUB(PetscErrorCode VecHIPResetArray(Vec a), (void)a)
9806d54fb17SJacob Faibussowitsch 
9816d54fb17SJacob Faibussowitsch #undef VEC_CUPM_NOT_CONFIGURED
9826d54fb17SJacob Faibussowitsch #undef VEC_CUDA_DECL_OR_STUB
9836d54fb17SJacob Faibussowitsch #undef VEC_HIP__DECL_OR_STUB
9846d54fb17SJacob Faibussowitsch 
9852eac72dbSBarry Smith #endif
986