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