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