xref: /petsc/include/petscvec.h (revision 9ae82921df069a58776bfe4da82b38e8ff7dd41c)
1 /*
2     Defines the vector component of PETSc. Vectors generally represent
3   degrees of freedom for finite element/finite difference functions
4   on a grid. They have more mathematical structure then simple arrays.
5 */
6 
7 #ifndef __PETSCVEC_H
8 #define __PETSCVEC_H
9 #include "petscis.h"
10 
11 PETSC_EXTERN_CXX_BEGIN
12 
13 /*S
14      Vec - Abstract PETSc vector object
15 
16    Level: beginner
17 
18   Concepts: field variables, unknowns, arrays
19 
20 .seealso:  VecCreate(), VecType, VecSetType()
21 S*/
22 typedef struct _p_Vec*         Vec;
23 
24 /*S
25      VecScatter - Object used to manage communication of data
26        between vectors in parallel. Manages both scatters and gathers
27 
28    Level: beginner
29 
30   Concepts: scatter
31 
32 .seealso:  VecScatterCreate(), VecScatterBegin(), VecScatterEnd()
33 S*/
34 typedef struct _p_VecScatter*  VecScatter;
35 
36 /*E
37   ScatterMode - Determines the direction of a scatter
38 
39   Level: beginner
40 
41 .seealso: VecScatter, VecScatterBegin(), VecScatterEnd()
42 E*/
43 typedef enum {SCATTER_FORWARD=0, SCATTER_REVERSE=1, SCATTER_FORWARD_LOCAL=2, SCATTER_REVERSE_LOCAL=3, SCATTER_LOCAL=2} ScatterMode;
44 
45 /*MC
46     SCATTER_FORWARD - Scatters the values as dictated by the VecScatterCreate() call
47 
48     Level: beginner
49 
50 .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_REVERSE, SCATTER_FORWARD_LOCAL,
51           SCATTER_REVERSE_LOCAL
52 
53 M*/
54 
55 /*MC
56     SCATTER_REVERSE - Moves the values in the opposite direction then the directions indicated in
57          in the VecScatterCreate()
58 
59     Level: beginner
60 
61 .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_FORWARD, SCATTER_FORWARD_LOCAL,
62           SCATTER_REVERSE_LOCAL
63 
64 M*/
65 
66 /*MC
67     SCATTER_FORWARD_LOCAL - Scatters the values as dictated by the VecScatterCreate() call except NO parallel communication
68        is done. Any variables that have be moved between processes are ignored
69 
70     Level: developer
71 
72 .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_REVERSE, SCATTER_FORWARD,
73           SCATTER_REVERSE_LOCAL
74 
75 M*/
76 
77 /*MC
78     SCATTER_REVERSE_LOCAL - Moves the values in the opposite direction then the directions indicated in
79          in the VecScatterCreate()  except NO parallel communication
80        is done. Any variables that have be moved between processes are ignored
81 
82     Level: developer
83 
84 .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_FORWARD, SCATTER_FORWARD_LOCAL,
85           SCATTER_REVERSE
86 
87 M*/
88 
89 /*J
90     VecType - String with the name of a PETSc vector or the creation function
91        with an optional dynamic library name, for example
92        http://www.mcs.anl.gov/petsc/lib.a:myveccreate()
93 
94    Level: beginner
95 
96 .seealso: VecSetType(), Vec
97 J*/
98 #define VecType char*
99 #define VECSEQ         "seq"
100 #define VECMPI         "mpi"
101 #define VECSTANDARD    "standard"   /* seq on one process and mpi on several */
102 #define VECSHARED      "shared"
103 #define VECSIEVE       "sieve"
104 #define VECSEQCUSP     "seqcusp"
105 #define VECMPICUSP     "mpicusp"
106 #define VECCUSP        "cusp"       /* seqcusp on one process and mpicusp on several */
107 #define VECNEST        "nest"
108 #define VECSEQPTHREAD  "seqpthread"
109 #define VECMPIPTHREAD  "mpipthread"
110 #define VECPTHREAD     "pthread"    /* seqpthread on one process and mpipthread on several */
111 
112 
113 /* Logging support */
114 #define    VEC_FILE_CLASSID 1211214
115 extern  PetscClassId VEC_CLASSID;
116 extern  PetscClassId VEC_SCATTER_CLASSID;
117 
118 
119 extern PetscErrorCode  VecInitializePackage(const char[]);
120 extern PetscErrorCode  VecFinalizePackage(void);
121 
122 extern PetscErrorCode  VecCreate(MPI_Comm,Vec*);
123 extern PetscErrorCode  VecCreateSeq(MPI_Comm,PetscInt,Vec*);
124 extern PetscErrorCode  VecCreateMPI(MPI_Comm,PetscInt,PetscInt,Vec*);
125 extern PetscErrorCode  VecCreateSeqWithArray(MPI_Comm,PetscInt,PetscInt,const PetscScalar[],Vec*);
126 extern PetscErrorCode  VecCreateMPIWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscScalar[],Vec*);
127 extern PetscErrorCode  VecCreateShared(MPI_Comm,PetscInt,PetscInt,Vec*);
128 extern PetscErrorCode  VecSetFromOptions(Vec);
129 extern PetscErrorCode  VecSetUp(Vec);
130 extern PetscErrorCode  VecDestroy(Vec*);
131 extern PetscErrorCode  VecZeroEntries(Vec);
132 extern PetscErrorCode  VecSetOptionsPrefix(Vec,const char[]);
133 extern PetscErrorCode  VecAppendOptionsPrefix(Vec,const char[]);
134 extern PetscErrorCode  VecGetOptionsPrefix(Vec,const char*[]);
135 
136 extern PetscErrorCode  VecSetSizes(Vec,PetscInt,PetscInt);
137 
138 extern PetscErrorCode  VecDotNorm2(Vec,Vec,PetscScalar*,PetscScalar*);
139 extern PetscErrorCode  VecDot(Vec,Vec,PetscScalar*);
140 extern PetscErrorCode  VecTDot(Vec,Vec,PetscScalar*);
141 extern PetscErrorCode  VecMDot(Vec,PetscInt,const Vec[],PetscScalar[]);
142 extern PetscErrorCode  VecMTDot(Vec,PetscInt,const Vec[],PetscScalar[]);
143 extern PetscErrorCode  VecGetSubVector(Vec,IS,Vec*);
144 extern PetscErrorCode  VecRestoreSubVector(Vec,IS,Vec*);
145 
146 /*E
147     NormType - determines what type of norm to compute
148 
149     Level: beginner
150 
151 .seealso: VecNorm(), VecNormBegin(), VecNormEnd(), MatNorm()
152 E*/
153 typedef enum {NORM_1=0,NORM_2=1,NORM_FROBENIUS=2,NORM_INFINITY=3,NORM_1_AND_2=4} NormType;
154 extern const char *NormTypes[];
155 #define NORM_MAX NORM_INFINITY
156 
157 /*MC
158      NORM_1 - the one norm, ||v|| = sum_i | v_i |. ||A|| = max_j || v_*j ||, maximum column sum
159 
160    Level: beginner
161 
162 .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_2, NORM_FROBENIUS,
163            NORM_INFINITY, NORM_1_AND_2
164 
165 M*/
166 
167 /*MC
168      NORM_2 - the two norm, ||v|| = sqrt(sum_i (v_i)^2) (vectors only)
169 
170    Level: beginner
171 
172 .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_FROBENIUS,
173            NORM_INFINITY, NORM_1_AND_2
174 
175 M*/
176 
177 /*MC
178      NORM_FROBENIUS - ||A|| = sqrt(sum_ij (A_ij)^2), same as NORM_2 for vectors
179 
180    Level: beginner
181 
182 .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
183            NORM_INFINITY, NORM_1_AND_2
184 
185 M*/
186 
187 /*MC
188      NORM_INFINITY - ||v|| = max_i |v_i|. ||A|| = max_i || v_i* ||, maximum row sum
189 
190    Level: beginner
191 
192 .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
193            NORM_FROBINIUS, NORM_1_AND_2
194 
195 M*/
196 
197 /*MC
198      NORM_1_AND_2 - computes both the 1 and 2 norm of a vector
199 
200    Level: beginner
201 
202 .seealso:  NormType, MatNorm(), VecNorm(), VecNormBegin(), VecNormEnd(), NORM_1, NORM_2,
203            NORM_FROBINIUS, NORM_INFINITY
204 
205 M*/
206 
207 /*MC
208      NORM_MAX - see NORM_INFINITY
209 
210    Level: beginner
211 
212 M*/
213 
214 extern PetscErrorCode  VecNorm(Vec,NormType,PetscReal *);
215 extern PetscErrorCode  VecNormAvailable(Vec,NormType,PetscBool *,PetscReal *);
216 extern PetscErrorCode  VecNormalize(Vec,PetscReal *);
217 extern PetscErrorCode  VecSum(Vec,PetscScalar*);
218 extern PetscErrorCode  VecMax(Vec,PetscInt*,PetscReal *);
219 extern PetscErrorCode  VecMin(Vec,PetscInt*,PetscReal *);
220 extern PetscErrorCode  VecScale(Vec,PetscScalar);
221 extern PetscErrorCode  VecCopy(Vec,Vec);
222 extern PetscErrorCode  VecSetRandom(Vec,PetscRandom);
223 extern PetscErrorCode  VecSet(Vec,PetscScalar);
224 extern PetscErrorCode  VecSwap(Vec,Vec);
225 extern PetscErrorCode  VecAXPY(Vec,PetscScalar,Vec);
226 extern PetscErrorCode  VecAXPBY(Vec,PetscScalar,PetscScalar,Vec);
227 extern PetscErrorCode  VecMAXPY(Vec,PetscInt,const PetscScalar[],Vec[]);
228 extern PetscErrorCode  VecAYPX(Vec,PetscScalar,Vec);
229 extern PetscErrorCode  VecWAXPY(Vec,PetscScalar,Vec,Vec);
230 extern PetscErrorCode  VecAXPBYPCZ(Vec,PetscScalar,PetscScalar,PetscScalar,Vec,Vec);
231 extern PetscErrorCode  VecPointwiseMax(Vec,Vec,Vec);
232 extern PetscErrorCode  VecPointwiseMaxAbs(Vec,Vec,Vec);
233 extern PetscErrorCode  VecPointwiseMin(Vec,Vec,Vec);
234 extern PetscErrorCode  VecPointwiseMult(Vec,Vec,Vec);
235 extern PetscErrorCode  VecPointwiseDivide(Vec,Vec,Vec);
236 extern PetscErrorCode  VecMaxPointwiseDivide(Vec,Vec,PetscReal*);
237 extern PetscErrorCode  VecShift(Vec,PetscScalar);
238 extern PetscErrorCode  VecReciprocal(Vec);
239 extern PetscErrorCode  VecPermute(Vec, IS, PetscBool );
240 extern PetscErrorCode  VecSqrtAbs(Vec);
241 extern PetscErrorCode  VecLog(Vec);
242 extern PetscErrorCode  VecExp(Vec);
243 extern PetscErrorCode  VecAbs(Vec);
244 extern PetscErrorCode  VecDuplicate(Vec,Vec*);
245 extern PetscErrorCode  VecDuplicateVecs(Vec,PetscInt,Vec*[]);
246 extern PetscErrorCode  VecDestroyVecs(PetscInt, Vec*[]);
247 extern PetscErrorCode  VecStrideNormAll(Vec,NormType,PetscReal[]);
248 extern PetscErrorCode  VecStrideMaxAll(Vec,PetscInt [],PetscReal []);
249 extern PetscErrorCode  VecStrideMinAll(Vec,PetscInt [],PetscReal []);
250 extern PetscErrorCode  VecStrideScaleAll(Vec,const PetscScalar[]);
251 
252 extern PetscErrorCode  VecStrideNorm(Vec,PetscInt,NormType,PetscReal*);
253 extern PetscErrorCode  VecStrideMax(Vec,PetscInt,PetscInt *,PetscReal *);
254 extern PetscErrorCode  VecStrideMin(Vec,PetscInt,PetscInt *,PetscReal *);
255 extern PetscErrorCode  VecStrideScale(Vec,PetscInt,PetscScalar);
256 extern PetscErrorCode  VecStrideSet(Vec,PetscInt,PetscScalar);
257 
258 
259 extern PetscErrorCode  VecStrideGather(Vec,PetscInt,Vec,InsertMode);
260 extern PetscErrorCode  VecStrideScatter(Vec,PetscInt,Vec,InsertMode);
261 extern PetscErrorCode  VecStrideGatherAll(Vec,Vec[],InsertMode);
262 extern PetscErrorCode  VecStrideScatterAll(Vec[],Vec,InsertMode);
263 
264 extern PetscErrorCode  VecSetValues(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
265 extern PetscErrorCode  VecGetValues(Vec,PetscInt,const PetscInt[],PetscScalar[]);
266 extern PetscErrorCode  VecAssemblyBegin(Vec);
267 extern PetscErrorCode  VecAssemblyEnd(Vec);
268 extern PetscErrorCode  VecStashSetInitialSize(Vec,PetscInt,PetscInt);
269 extern PetscErrorCode  VecStashView(Vec,PetscViewer);
270 extern PetscErrorCode  VecStashGetInfo(Vec,PetscInt*,PetscInt*,PetscInt*,PetscInt*);
271 
272 /*MC
273    VecSetValue - Set a single entry into a vector.
274 
275    Synopsis:
276    PetscErrorCode VecSetValue(Vec v,int row,PetscScalar value, InsertMode mode);
277 
278    Not Collective
279 
280    Input Parameters:
281 +  v - the vector
282 .  row - the row location of the entry
283 .  value - the value to insert
284 -  mode - either INSERT_VALUES or ADD_VALUES
285 
286    Notes:
287    For efficiency one should use VecSetValues() and set several or
288    many values simultaneously if possible.
289 
290    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
291    MUST be called after all calls to VecSetValues() have been completed.
292 
293    VecSetValues() uses 0-based indices in Fortran as well as in C.
294 
295    Level: beginner
296 
297 .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValueLocal()
298 M*/
299 PETSC_STATIC_INLINE PetscErrorCode VecSetValue(Vec v,PetscInt i,PetscScalar va,InsertMode mode) {return VecSetValues(v,1,&i,&va,mode);}
300 
301 
302 extern PetscErrorCode  VecSetBlockSize(Vec,PetscInt);
303 extern PetscErrorCode  VecGetBlockSize(Vec,PetscInt*);
304 extern PetscErrorCode  VecSetValuesBlocked(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
305 
306 /* Dynamic creation and loading functions */
307 extern PetscFList VecList;
308 extern PetscBool  VecRegisterAllCalled;
309 extern PetscErrorCode  VecSetType(Vec, const VecType);
310 extern PetscErrorCode  VecGetType(Vec, const VecType *);
311 extern PetscErrorCode  VecRegister(const char[],const char[],const char[],PetscErrorCode (*)(Vec));
312 extern PetscErrorCode  VecRegisterAll(const char []);
313 extern PetscErrorCode  VecRegisterDestroy(void);
314 
315 /*MC
316   VecRegisterDynamic - Adds a new vector component implementation
317 
318   Synopsis:
319   PetscErrorCode VecRegisterDynamic(const char *name, const char *path, const char *func_name, PetscErrorCode (*create_func)(Vec))
320 
321   Not Collective
322 
323   Input Parameters:
324 + name        - The name of a new user-defined creation routine
325 . path        - The path (either absolute or relative) of the library containing this routine
326 . func_name   - The name of routine to create method context
327 - create_func - The creation routine itself
328 
329   Notes:
330   VecRegisterDynamic() may be called multiple times to add several user-defined vectors
331 
332   If dynamic libraries are used, then the fourth input argument (routine_create) is ignored.
333 
334   Sample usage:
335 .vb
336     VecRegisterDynamic("my_vec","/home/username/my_lib/lib/libO/solaris/libmy.a", "MyVectorCreate", MyVectorCreate);
337 .ve
338 
339   Then, your vector type can be chosen with the procedural interface via
340 .vb
341     VecCreate(MPI_Comm, Vec *);
342     VecSetType(Vec,"my_vector_name");
343 .ve
344    or at runtime via the option
345 .vb
346     -vec_type my_vector_name
347 .ve
348 
349   Notes: $PETSC_ARCH occuring in pathname will be replaced with appropriate values.
350          If your function is not being put into a shared library then use VecRegister() instead
351 
352   Level: advanced
353 
354 .keywords: Vec, register
355 .seealso: VecRegisterAll(), VecRegisterDestroy(), VecRegister()
356 M*/
357 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
358 #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,0)
359 #else
360 #define VecRegisterDynamic(a,b,c,d) VecRegister(a,b,c,d)
361 #endif
362 
363 
364 extern PetscErrorCode  VecScatterCreate(Vec,IS,Vec,IS,VecScatter *);
365 extern PetscErrorCode  VecScatterCreateEmpty(MPI_Comm,VecScatter *);
366 extern PetscErrorCode  VecScatterCreateLocal(VecScatter,PetscInt,const PetscInt[],const PetscInt[],const PetscInt[],PetscInt,const PetscInt[],const PetscInt[],const PetscInt[],PetscInt);
367 extern PetscErrorCode  VecScatterBegin(VecScatter,Vec,Vec,InsertMode,ScatterMode);
368 extern PetscErrorCode  VecScatterEnd(VecScatter,Vec,Vec,InsertMode,ScatterMode);
369 extern PetscErrorCode  VecScatterDestroy(VecScatter*);
370 extern PetscErrorCode  VecScatterCopy(VecScatter,VecScatter *);
371 extern PetscErrorCode  VecScatterView(VecScatter,PetscViewer);
372 extern PetscErrorCode  VecScatterRemap(VecScatter,PetscInt *,PetscInt*);
373 extern PetscErrorCode  VecScatterGetMerged(VecScatter,PetscBool *);
374 
375 extern PetscErrorCode  VecGetArray4d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]);
376 extern PetscErrorCode  VecRestoreArray4d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar****[]);
377 extern PetscErrorCode  VecGetArray3d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]);
378 extern PetscErrorCode  VecRestoreArray3d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar***[]);
379 extern PetscErrorCode  VecGetArray2d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]);
380 extern PetscErrorCode  VecRestoreArray2d(Vec,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar**[]);
381 extern PetscErrorCode  VecGetArray1d(Vec,PetscInt,PetscInt,PetscScalar *[]);
382 extern PetscErrorCode  VecRestoreArray1d(Vec,PetscInt,PetscInt,PetscScalar *[]);
383 
384 extern PetscErrorCode  VecTransplantPlaceArray(Vec,Vec);
385 extern PetscErrorCode  VecTransplantResetArray(Vec,Vec);
386 extern PetscErrorCode  VecPlaceArray(Vec,const PetscScalar[]);
387 extern PetscErrorCode  VecResetArray(Vec);
388 extern PetscErrorCode  VecReplaceArray(Vec,const PetscScalar[]);
389 extern PetscErrorCode  VecGetArrays(const Vec[],PetscInt,PetscScalar**[]);
390 extern PetscErrorCode  VecRestoreArrays(const Vec[],PetscInt,PetscScalar**[]);
391 
392 extern PetscErrorCode  VecView(Vec,PetscViewer);
393 extern PetscErrorCode  VecViewFromOptions(Vec, const char *);
394 extern PetscErrorCode  VecEqual(Vec,Vec,PetscBool *);
395 extern PetscErrorCode  VecLoad(Vec, PetscViewer);
396 
397 extern PetscErrorCode  VecGetSize(Vec,PetscInt*);
398 extern PetscErrorCode  VecGetLocalSize(Vec,PetscInt*);
399 extern PetscErrorCode  VecGetOwnershipRange(Vec,PetscInt*,PetscInt*);
400 extern PetscErrorCode  VecGetOwnershipRanges(Vec,const PetscInt *[]);
401 
402 extern PetscErrorCode  VecSetLocalToGlobalMapping(Vec,ISLocalToGlobalMapping);
403 extern PetscErrorCode  VecSetValuesLocal(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
404 
405 /*MC
406    VecSetValueLocal - Set a single entry into a vector using the local numbering
407 
408    Synopsis:
409    PetscErrorCode VecSetValueLocal(Vec v,int row,PetscScalar value, InsertMode mode);
410 
411    Not Collective
412 
413    Input Parameters:
414 +  v - the vector
415 .  row - the row location of the entry
416 .  value - the value to insert
417 -  mode - either INSERT_VALUES or ADD_VALUES
418 
419    Notes:
420    For efficiency one should use VecSetValues() and set several or
421    many values simultaneously if possible.
422 
423    These values may be cached, so VecAssemblyBegin() and VecAssemblyEnd()
424    MUST be called after all calls to VecSetValues() have been completed.
425 
426    VecSetValues() uses 0-based indices in Fortran as well as in C.
427 
428    Level: beginner
429 
430 .seealso: VecSetValues(), VecAssemblyBegin(), VecAssemblyEnd(), VecSetValuesBlockedLocal(), VecSetValue()
431 M*/
432 PETSC_STATIC_INLINE PetscErrorCode VecSetValueLocal(Vec v,PetscInt i,PetscScalar va,InsertMode mode) {return VecSetValuesLocal(v,1,&i,&va,mode);}
433 
434 extern PetscErrorCode  VecSetLocalToGlobalMappingBlock(Vec,ISLocalToGlobalMapping);
435 extern PetscErrorCode  VecSetValuesBlockedLocal(Vec,PetscInt,const PetscInt[],const PetscScalar[],InsertMode);
436 extern PetscErrorCode  VecGetLocalToGlobalMappingBlock(Vec,ISLocalToGlobalMapping*);
437 extern PetscErrorCode  VecGetLocalToGlobalMapping(Vec,ISLocalToGlobalMapping*);
438 
439 extern PetscErrorCode  VecDotBegin(Vec,Vec,PetscScalar *);
440 extern PetscErrorCode  VecDotEnd(Vec,Vec,PetscScalar *);
441 extern PetscErrorCode  VecTDotBegin(Vec,Vec,PetscScalar *);
442 extern PetscErrorCode  VecTDotEnd(Vec,Vec,PetscScalar *);
443 extern PetscErrorCode  VecNormBegin(Vec,NormType,PetscReal *);
444 extern PetscErrorCode  VecNormEnd(Vec,NormType,PetscReal *);
445 
446 extern PetscErrorCode  VecMDotBegin(Vec,PetscInt,const Vec[],PetscScalar[]);
447 extern PetscErrorCode  VecMDotEnd(Vec,PetscInt,const Vec[],PetscScalar[]);
448 extern PetscErrorCode  VecMTDotBegin(Vec,PetscInt,const Vec[],PetscScalar[]);
449 extern PetscErrorCode  VecMTDotEnd(Vec,PetscInt,const Vec[],PetscScalar[]);
450 extern PetscErrorCode PetscCommSplitReductionBegin(MPI_Comm);
451 
452 
453 #if defined(PETSC_USE_DEBUG)
454 #define VecValidValues(vec,argnum,input) do {                           \
455     PetscErrorCode     _ierr;                                           \
456     PetscInt          _n,_i;                                            \
457     const PetscScalar *_x;                                              \
458                                                                         \
459     if (vec->petscnative || vec->ops->getarray) {                       \
460       _ierr = VecGetLocalSize(vec,&_n);CHKERRQ(_ierr);                  \
461       _ierr = VecGetArrayRead(vec,&_x);CHKERRQ(_ierr);                  \
462       for (_i=0; _i<_n; _i++) {                                         \
463         if (input) {                                                    \
464           if (PetscIsInfOrNanScalar(_x[_i])) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_FP,"Vec entry at local location %D is not-a-number or infinite at beginning of function: Parameter number %d",_i,argnum); \
465         } else {                                                        \
466           if (PetscIsInfOrNanScalar(_x[_i])) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_FP,"Vec entry at local location %D is not-a-number or infinite at end of function: Parameter number %d",_i,argnum); \
467         }                                                               \
468       }                                                                 \
469       _ierr = VecRestoreArrayRead(vec,&_x);CHKERRQ(_ierr);              \
470     }                                                                   \
471   } while (0)
472 #else
473 #define VecValidValues(vec,argnum,input)
474 #endif
475 
476 
477 typedef enum {VEC_IGNORE_OFF_PROC_ENTRIES,VEC_IGNORE_NEGATIVE_INDICES} VecOption;
478 extern PetscErrorCode  VecSetOption(Vec,VecOption,PetscBool );
479 
480 /*
481    Expose VecGetArray()/VecRestoreArray() to users. Allows this to work without any function
482    call overhead on any 'native' Vecs.
483 */
484 
485 #include "petsc-private/vecimpl.h"
486 
487 extern PetscErrorCode  VecContourScale(Vec,PetscReal,PetscReal);
488 
489 /*
490     These numbers need to match the entries in
491   the function table in vecimpl.h
492 */
493 typedef enum { VECOP_VIEW = 33, VECOP_LOAD = 41, VECOP_DUPLICATE = 0} VecOperation;
494 extern PetscErrorCode  VecSetOperation(Vec,VecOperation,void(*)(void));
495 
496 /*
497      Routines for dealing with ghosted vectors:
498   vectors with ghost elements at the end of the array.
499 */
500 extern PetscErrorCode  VecMPISetGhost(Vec,PetscInt,const PetscInt[]);
501 extern PetscErrorCode  VecCreateGhost(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*);
502 extern PetscErrorCode  VecCreateGhostWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*);
503 extern PetscErrorCode  VecCreateGhostBlock(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],Vec*);
504 extern PetscErrorCode  VecCreateGhostBlockWithArray(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscScalar[],Vec*);
505 extern PetscErrorCode  VecGhostGetLocalForm(Vec,Vec*);
506 extern PetscErrorCode  VecGhostRestoreLocalForm(Vec,Vec*);
507 extern PetscErrorCode  VecGhostUpdateBegin(Vec,InsertMode,ScatterMode);
508 extern PetscErrorCode  VecGhostUpdateEnd(Vec,InsertMode,ScatterMode);
509 
510 extern PetscErrorCode  VecConjugate(Vec);
511 
512 extern PetscErrorCode  VecScatterCreateToAll(Vec,VecScatter*,Vec*);
513 extern PetscErrorCode  VecScatterCreateToZero(Vec,VecScatter*,Vec*);
514 
515 extern PetscErrorCode  PetscViewerMathematicaGetVector(PetscViewer, Vec);
516 extern PetscErrorCode  PetscViewerMathematicaPutVector(PetscViewer, Vec);
517 
518 /*S
519      Vecs - Collection of vectors where the data for the vectors is stored in
520             one contiguous memory
521 
522    Level: advanced
523 
524    Notes:
525     Temporary construct for handling multiply right hand side solves
526 
527     This is faked by storing a single vector that has enough array space for
528     n vectors
529 
530   Concepts: parallel decomposition
531 
532 S*/
533         struct _n_Vecs  {PetscInt n; Vec v;};
534 typedef struct _n_Vecs* Vecs;
535 #define VecsDestroy(x)            (VecDestroy(&(x)->v)         || PetscFree(x))
536 #define VecsCreateSeq(comm,p,m,x) (PetscNew(struct _n_Vecs,x) || VecCreateSeq(comm,p*m,&(*(x))->v) || (-1 == ((*(x))->n = (m))))
537 #define VecsCreateSeqWithArray(comm,p,m,a,x) (PetscNew(struct _n_Vecs,x) || VecCreateSeqWithArray(comm,1,p*m,a,&(*(x))->v) || (-1 == ((*(x))->n = (m))))
538 #define VecsDuplicate(x,y)        (PetscNew(struct _n_Vecs,y) || VecDuplicate(x->v,&(*(y))->v) || (-1 == ((*(y))->n = (x)->n)))
539 
540 #if defined(PETSC_HAVE_CUSP)
541 typedef struct _p_PetscCUSPIndices* PetscCUSPIndices;
542 extern PetscErrorCode PetscCUSPIndicesCreate(PetscInt, PetscInt*,PetscInt, PetscInt*,PetscCUSPIndices*);
543 extern PetscErrorCode PetscCUSPIndicesDestroy(PetscCUSPIndices*);
544 extern PetscErrorCode VecCUSPCopyToGPUSome_Public(Vec,PetscCUSPIndices);
545 extern PetscErrorCode VecCUSPCopyFromGPUSome_Public(Vec,PetscCUSPIndices);
546 
547 #if defined(PETSC_HAVE_TXPETSCGPU)
548 extern PetscErrorCode VecCUSPResetIndexBuffersFlagsGPU_Public(PetscCUSPIndices);
549 extern PetscErrorCode VecCUSPCopySomeToContiguousBufferGPU_Public(Vec,PetscCUSPIndices);
550 extern PetscErrorCode VecCUSPCopySomeFromContiguousBufferGPU_Public(Vec,PetscCUSPIndices);
551 extern PetscErrorCode VecScatterInitializeForGPU(VecScatter,Vec,ScatterMode);
552 extern PetscErrorCode VecScatterFinalizeForGPU(VecScatter);
553 #endif
554 
555 extern PetscErrorCode  VecCreateSeqCUSP(MPI_Comm,PetscInt,Vec*);
556 extern PetscErrorCode  VecCreateMPICUSP(MPI_Comm,PetscInt,PetscInt,Vec*);
557 #endif
558 
559 #if defined(PETSC_HAVE_PTHREADCLASSES)
560 extern PetscErrorCode VecSetNThreads(Vec,PetscInt);
561 extern PetscErrorCode VecGetNThreads(Vec,PetscInt*);
562 extern PetscErrorCode VecGetThreadOwnershipRange(Vec,PetscInt,PetscInt*,PetscInt*);
563 extern PetscErrorCode VecSetThreadAffinities(Vec,const PetscInt[]);
564 extern PetscErrorCode VecCreateSeqPThread(MPI_Comm,PetscInt,PetscInt,PetscInt[],Vec*);
565 extern PetscErrorCode VecCreateMPIPThread(MPI_Comm,PetscInt,PetscInt,PetscInt,PetscInt[],Vec*);
566 #endif
567 
568 extern PetscErrorCode  VecNestGetSubVecs(Vec,PetscInt*,Vec**);
569 extern PetscErrorCode  VecNestGetSubVec(Vec,PetscInt,Vec*);
570 extern PetscErrorCode  VecNestSetSubVecs(Vec,PetscInt,PetscInt*,Vec*);
571 extern PetscErrorCode  VecNestSetSubVec(Vec,PetscInt,Vec);
572 extern PetscErrorCode  VecCreateNest(MPI_Comm,PetscInt,IS*,Vec*,Vec*);
573 extern PetscErrorCode  VecNestGetSize(Vec,PetscInt*);
574 
575 PETSC_EXTERN_CXX_END
576 #endif
577 
578