xref: /petsc/include/petscsys.h (revision dc9df7f6ce99c8d1a01a2ef5bdf66dbbcd7eefc9)
1 /*
2    This is the main PETSc include file (for C and C++).  It is included by all
3    other PETSc include files, so it almost never has to be specifically included.
4 */
5 #if !defined(__PETSCSYS_H)
6 #define __PETSCSYS_H
7 /* ========================================================================== */
8 /*
9    petscconf.h is contained in ${PETSC_ARCH}/include/petscconf.h it is
10    found automatically by the compiler due to the -I${PETSC_DIR}/${PETSC_ARCH}/include.
11    For --prefix installs the ${PETSC_ARCH}/ does not exist and petscconf.h is in the same
12    directory as the other PETSc include files.
13 */
14 #include <petscconf.h>
15 #include <petscfix.h>
16 
17 #if defined(PETSC_DESIRE_FEATURE_TEST_MACROS)
18 /*
19    Feature test macros must be included before headers defined by IEEE Std 1003.1-2001
20    We only turn these in PETSc source files that require them by setting PETSC_DESIRE_FEATURE_TEST_MACROS
21 */
22 #if defined(PETSC__POSIX_C_SOURCE_200112L) && !defined(_POSIX_C_SOURCE)
23 #define _POSIX_C_SOURCE 200112L
24 #endif
25 #if defined(PETSC__BSD_SOURCE) && !defined(_BSD_SOURCE)
26 #define _BSD_SOURCE
27 #endif
28 #if defined(PETSC__DEFAULT_SOURCE) && !defined(_DEFAULT_SOURCE)
29 #define _DEFAULT_SOURCE
30 #endif
31 #if defined(PETSC__GNU_SOURCE) && !defined(_GNU_SOURCE)
32 #define _GNU_SOURCE
33 #endif
34 #endif
35 
36 /* ========================================================================== */
37 /*
38    This facilitates using the C version of PETSc from C++ and the C++ version from C.
39 */
40 #if defined(__cplusplus)
41 #  define PETSC_FUNCTION_NAME PETSC_FUNCTION_NAME_CXX
42 #else
43 #  define PETSC_FUNCTION_NAME PETSC_FUNCTION_NAME_C
44 #endif
45 
46 /* ========================================================================== */
47 /*
48    Since PETSc manages its own extern "C" handling users should never include PETSc include
49    files within extern "C". This will generate a compiler error if a user does put the include
50    file within an extern "C".
51 */
52 #if defined(__cplusplus)
53 void assert_never_put_petsc_headers_inside_an_extern_c(int); void assert_never_put_petsc_headers_inside_an_extern_c(double);
54 #endif
55 
56 #if defined(__cplusplus)
57 #  define PETSC_RESTRICT PETSC_CXX_RESTRICT
58 #else
59 #  define PETSC_RESTRICT PETSC_C_RESTRICT
60 #endif
61 
62 #if defined(__cplusplus)
63 #  define PETSC_STATIC_INLINE PETSC_CXX_STATIC_INLINE
64 #else
65 #  define PETSC_STATIC_INLINE PETSC_C_STATIC_INLINE
66 #endif
67 
68 #if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES) /* For Win32 shared libraries */
69 #  define PETSC_DLLEXPORT __declspec(dllexport)
70 #  define PETSC_DLLIMPORT __declspec(dllimport)
71 #  define PETSC_VISIBILITY_INTERNAL
72 #elif defined(PETSC_USE_VISIBILITY_CXX) && defined(__cplusplus)
73 #  define PETSC_DLLEXPORT __attribute__((visibility ("default")))
74 #  define PETSC_DLLIMPORT __attribute__((visibility ("default")))
75 #  define PETSC_VISIBILITY_INTERNAL __attribute__((visibility ("hidden")))
76 #elif defined(PETSC_USE_VISIBILITY_C) && !defined(__cplusplus)
77 #  define PETSC_DLLEXPORT __attribute__((visibility ("default")))
78 #  define PETSC_DLLIMPORT __attribute__((visibility ("default")))
79 #  define PETSC_VISIBILITY_INTERNAL __attribute__((visibility ("hidden")))
80 #else
81 #  define PETSC_DLLEXPORT
82 #  define PETSC_DLLIMPORT
83 #  define PETSC_VISIBILITY_INTERNAL
84 #endif
85 
86 #if defined(petsc_EXPORTS)      /* CMake defines this when building the shared library */
87 #  define PETSC_VISIBILITY_PUBLIC PETSC_DLLEXPORT
88 #else  /* Win32 users need this to import symbols from petsc.dll */
89 #  define PETSC_VISIBILITY_PUBLIC PETSC_DLLIMPORT
90 #endif
91 
92 /*
93     Functions tagged with PETSC_EXTERN in the header files are
94   always defined as extern "C" when compiled with C++ so they may be
95   used from C and are always visible in the shared libraries
96 */
97 #if defined(__cplusplus)
98 #define PETSC_EXTERN extern "C" PETSC_VISIBILITY_PUBLIC
99 #define PETSC_EXTERN_TYPEDEF extern "C"
100 #define PETSC_INTERN extern "C" PETSC_VISIBILITY_INTERNAL
101 #else
102 #define PETSC_EXTERN extern PETSC_VISIBILITY_PUBLIC
103 #define PETSC_EXTERN_TYPEDEF
104 #define PETSC_INTERN extern PETSC_VISIBILITY_INTERNAL
105 #endif
106 
107 #include <petscversion.h>
108 #define PETSC_AUTHOR_INFO  "       The PETSc Team\n    petsc-maint@mcs.anl.gov\n http://www.mcs.anl.gov/petsc/\n"
109 
110 /* ========================================================================== */
111 
112 /*
113     Defines the interface to MPI allowing the use of all MPI functions.
114 
115     PETSc does not use the C++ binding of MPI at ALL. The following flag
116     makes sure the C++ bindings are not included. The C++ bindings REQUIRE
117     putting mpi.h before ANY C++ include files, we cannot control this
118     with all PETSc users. Users who want to use the MPI C++ bindings can include
119     mpicxx.h directly in their code
120 */
121 #if !defined(MPICH_SKIP_MPICXX)
122 #  define MPICH_SKIP_MPICXX 1
123 #endif
124 #if !defined(OMPI_SKIP_MPICXX)
125 #  define OMPI_SKIP_MPICXX 1
126 #endif
127 #if defined(PETSC_HAVE_MPIUNI)
128 #  include <petsc/mpiuni/mpi.h>
129 #else
130 #  include <mpi.h>
131 #endif
132 
133 /*
134    Perform various sanity checks that the correct mpi.h is being included at compile time.
135    This usually happens because
136       * either an unexpected mpi.h is in the default compiler path (i.e. in /usr/include) or
137       * an extra include path -I/something (which contains the unexpected mpi.h) is being passed to the compiler
138 */
139 #if defined(PETSC_HAVE_MPIUNI)
140 #  if !defined(__MPIUNI_H)
141 #    error "PETSc was configured with --with-mpi=0 but now appears to be compiling using a different mpi.h"
142 #  endif
143 #elif defined(PETSC_HAVE_I_MPI_NUMVERSION)
144 #  if !defined(I_MPI_NUMVERSION)
145 #    error "PETSc was configured with I_MPI but now appears to be compiling using a non-I_MPI mpi.h"
146 #  elif I_MPI_NUMVERSION != PETSC_HAVE_I_MPI_NUMVERSION
147 #    error "PETSc was configured with one I_MPI mpi.h version but now appears to be compiling using a different I_MPI mpi.h version"
148 #  endif
149 #elif defined(PETSC_HAVE_MVAPICH2_NUMVERSION)
150 #  if !defined(MVAPICH2_NUMVERSION)
151 #    error "PETSc was configured with MVAPICH2 but now appears to be compiling using a non-MVAPICH2 mpi.h"
152 #  elif MVAPICH2_NUMVERSION != PETSC_HAVE_MVAPICH2_NUMVERSION
153 #    error "PETSc was configured with one MVAPICH2 mpi.h version but now appears to be compiling using a different MVAPICH2 mpi.h version"
154 #  endif
155 #elif defined(PETSC_HAVE_MPICH_NUMVERSION)
156 #  if !defined(MPICH_NUMVERSION) || defined(MVAPICH2_NUMVERSION) || defined(I_MPI_NUMVERSION)
157 #    error "PETSc was configured with MPICH but now appears to be compiling using a non-MPICH mpi.h"
158 #  elif (MPICH_NUMVERSION/100000 != PETSC_HAVE_MPICH_NUMVERSION/100000) || (MPICH_NUMVERSION%100000/1000 < PETSC_HAVE_MPICH_NUMVERSION%100000/1000)
159 #    error "PETSc was configured with one MPICH mpi.h version but now appears to be compiling using a different MPICH mpi.h version"
160 #  endif
161 #elif defined(PETSC_HAVE_OMPI_MAJOR_VERSION)
162 #  if !defined(OMPI_MAJOR_VERSION)
163 #    error "PETSc was configured with OpenMPI but now appears to be compiling using a non-OpenMPI mpi.h"
164 #  elif (OMPI_MAJOR_VERSION != PETSC_HAVE_OMPI_MAJOR_VERSION) || (OMPI_MINOR_VERSION != PETSC_HAVE_OMPI_MINOR_VERSION) || (OMPI_RELEASE_VERSION < PETSC_HAVE_OMPI_RELEASE_VERSION)
165 #    error "PETSc was configured with one OpenMPI mpi.h version but now appears to be compiling using a different OpenMPI mpi.h version"
166 #  endif
167 #elif defined(OMPI_MAJOR_VERSION) || defined(MPICH_NUMVERSION)
168 #  error "PETSc was configured with undetermined MPI - but now appears to be compiling using either of OpenMPI or a MPICH variant"
169 #endif
170 
171 /*
172     Need to put stdio.h AFTER mpi.h for MPICH2 with C++ compiler
173     see the top of mpicxx.h in the MPICH2 distribution.
174 */
175 #include <stdio.h>
176 
177 /* MSMPI on 32bit windows requires this yukky hack - that breaks MPI standard compliance */
178 #if !defined(MPIAPI)
179 #define MPIAPI
180 #endif
181 
182 /*
183    Support for Clang (>=3.2) matching type tag arguments with void* buffer types.
184    This allows the compiler to detect cases where the MPI datatype argument passed to a MPI routine
185    does not match the actual type of the argument being passed in
186 */
187 #if defined(__has_attribute) && defined(works_with_const_which_is_not_true)
188 #  if __has_attribute(argument_with_type_tag) && __has_attribute(pointer_with_type_tag) && __has_attribute(type_tag_for_datatype)
189 #    define PetscAttrMPIPointerWithType(bufno,typeno) __attribute__((pointer_with_type_tag(MPI,bufno,typeno)))
190 #    define PetscAttrMPITypeTag(type)                 __attribute__((type_tag_for_datatype(MPI,type)))
191 #    define PetscAttrMPITypeTagLayoutCompatible(type) __attribute__((type_tag_for_datatype(MPI,type,layout_compatible)))
192 #  endif
193 #endif
194 #if !defined(PetscAttrMPIPointerWithType)
195 #  define PetscAttrMPIPointerWithType(bufno,typeno)
196 #  define PetscAttrMPITypeTag(type)
197 #  define PetscAttrMPITypeTagLayoutCompatible(type)
198 #endif
199 
200 /*MC
201     PetscErrorCode - datatype used for return error code from almost all PETSc functions
202 
203     Level: beginner
204 
205 .seealso: CHKERRQ, SETERRQ
206 M*/
207 typedef int PetscErrorCode;
208 
209 /*MC
210 
211     PetscClassId - A unique id used to identify each PETSc class.
212 
213     Notes:
214     Use PetscClassIdRegister() to obtain a new value for a new class being created. Usually
215          XXXInitializePackage() calls it for each class it defines.
216 
217     Developer Notes:
218     Internal integer stored in the _p_PetscObject data structure.
219          These are all computed by an offset from the lowest one, PETSC_SMALLEST_CLASSID.
220 
221     Level: developer
222 
223 .seealso: PetscClassIdRegister(), PetscLogEventRegister(), PetscHeaderCreate()
224 M*/
225 typedef int PetscClassId;
226 
227 
228 /*MC
229     PetscMPIInt - datatype used to represent 'int' parameters to MPI functions.
230 
231     Level: intermediate
232 
233     Notes:
234     usually this is the same as PetscInt, but if PETSc was built with --with-64-bit-indices but
235            standard C/Fortran integers are 32 bit then this is NOT the same as PetscInt; it remains 32 bit.
236 
237     PetscMPIIntCast(a,&b) checks if the given PetscInt a will fit in a PetscMPIInt, if not it
238       generates a PETSC_ERR_ARG_OUTOFRANGE error.
239 
240 .seealso: PetscBLASInt, PetscInt, PetscMPIIntCast()
241 
242 M*/
243 typedef int PetscMPIInt;
244 
245 /*MC
246     PetscEnum - datatype used to pass enum types within PETSc functions.
247 
248     Level: intermediate
249 
250 .seealso: PetscOptionsGetEnum(), PetscOptionsEnum(), PetscBagRegisterEnum()
251 M*/
252 typedef enum { ENUM_DUMMY } PetscEnum;
253 PETSC_EXTERN MPI_Datatype MPIU_ENUM PetscAttrMPITypeTag(PetscEnum);
254 
255 #if defined(PETSC_HAVE_STDINT_H)
256 #include <stdint.h>
257 #endif
258 #if defined (PETSC_HAVE_INTTYPES_H)
259 #define __STDC_FORMAT_MACROS /* required for using PRId64 from c++ */
260 #include <inttypes.h>
261 # if !defined(PRId64)
262 # define PRId64 "ld"
263 # endif
264 #endif
265 
266 typedef short PetscShort;
267 typedef char PetscChar;
268 typedef float PetscFloat;
269 
270 /*MC
271   PetscInt - PETSc type that represents an integer, used primarily to
272       represent size of arrays and indexing into arrays. Its size can be configured with the option --with-64-bit-indices to be either 32-bit (default) or 64-bit.
273 
274   Notes:
275   For MPI calls that require datatypes, use MPIU_INT as the datatype for PetscInt. It will automatically work correctly regardless of the size of PetscInt.
276 
277   Level: beginner
278 
279 .seealso: PetscBLASInt, PetscMPIInt, PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_REAL, MPIU_SCALAR, MPIU_COMPLEX, MPIU_INT
280 M*/
281 
282 /*MC
283    MPIU_INT - MPI datatype corresponding to PetscInt
284 
285    Notes:
286    In MPI calls that require an MPI datatype that matches a PetscInt or array of PetscInt values, pass this value.
287 
288    Level: beginner
289 
290 .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_REAL, MPIU_SCALAR, MPIU_COMPLEX
291 M*/
292 
293 #if defined(PETSC_HAVE_STDINT_H) && defined(PETSC_HAVE_INTTYPES_H) && defined(PETSC_HAVE_MPI_INT64_T) /* MPI_INT64_T is not guaranteed to be a macro */
294 typedef int64_t PetscInt64;
295 # define MPIU_INT64 MPI_INT64_T
296 # define PetscInt64_FMT PRId64
297 #elif (PETSC_SIZEOF_LONG_LONG == 8)
298 typedef long long PetscInt64;
299 # define MPIU_INT64 MPI_LONG_LONG_INT
300 # define PetscInt64_FMT "lld"
301 #elif defined(PETSC_HAVE___INT64)
302 typedef __int64 PetscInt64;
303 # define MPIU_INT64 MPI_INT64_T
304 # define PetscInt64_FMT "ld"
305 #else
306 #error "cannot determine PetscInt64 type"
307 #endif
308 
309 #if PETSC_SIZEOF_VOID_P == 4
310 #define MPIU_FORTRANADDR MPI_INT
311 #else
312 #define MPIU_FORTRANADDR MPIU_INT64
313 #endif
314 
315 #if defined(PETSC_USE_64BIT_INDICES)
316 typedef PetscInt64 PetscInt;
317 #define MPIU_INT MPIU_INT64
318 #define PetscInt_FMT PetscInt64_FMT
319 #else
320 typedef int PetscInt;
321 #define MPIU_INT MPI_INT
322 #define PetscInt_FMT "d"
323 #endif
324 
325 /*MC
326    PetscBLASInt - datatype used to represent 'int' parameters to BLAS/LAPACK functions.
327 
328    Notes:
329     Usually this is the same as PetscInt, but if PETSc was built with --with-64-bit-indices but
330            standard C/Fortran integers are 32 bit then this is NOT the same as PetscInt it remains 32 bit
331            (except on very rare BLAS/LAPACK implementations that support 64 bit integers see the note below).
332 
333     PetscErrorCode PetscBLASIntCast(a,&b) checks if the given PetscInt a will fit in a PetscBLASInt, if not it
334       generates a PETSC_ERR_ARG_OUTOFRANGE error
335 
336    Installation Notes:
337     The 64bit versions of MATLAB ship with BLAS and LAPACK that use 64 bit integers for sizes etc,
338      if you run ./configure with the option
339      --with-blaslapack-lib=[/Applications/MATLAB_R2010b.app/bin/maci64/libmwblas.dylib,/Applications/MATLAB_R2010b.app/bin/maci64/libmwlapack.dylib]
340      but you need to also use --known-64-bit-blas-indices.
341 
342         MKL also ships with 64 bit integer versions of the BLAS and LAPACK, if you select those you must also ./configure with
343         --known-64-bit-blas-indices
344 
345         OpenBLAS can also be built to use 64 bit integers. The ./configure options --download-openblas -download-openblas-64-bit-blas-indices
346         will build a 64 bit integer version
347 
348     Developer Notes:
349      Eventually ./configure should automatically determine the size of the integers used by BLAS/LAPACK.
350 
351      External packages such as hypre, ML, SuperLU etc do not provide any support for passing 64 bit integers to BLAS/LAPACK so cannot
352      be used with PETSc if you have set PetscBLASInt to long int.
353 
354    Level: intermediate
355 
356 .seealso: PetscMPIInt, PetscInt, PetscBLASIntCast()
357 
358 M*/
359 #if defined(PETSC_HAVE_64BIT_BLAS_INDICES)
360 typedef PetscInt64 PetscBLASInt;
361 #else
362 typedef int PetscBLASInt;
363 #endif
364 
365 /*
366     For the rare cases when one needs to send a size_t object with MPI
367 */
368 #if (PETSC_SIZEOF_SIZE_T) == (PETSC_SIZEOF_INT)
369 #define MPIU_SIZE_T MPI_UNSIGNED
370 #elif  (PETSC_SIZEOF_SIZE_T) == (PETSC_SIZEOF_LONG)
371 #define MPIU_SIZE_T MPI_UNSIGNED_LONG
372 #elif  (PETSC_SIZEOF_SIZE_T) == (PETSC_SIZEOF_LONG_LONG)
373 #define MPIU_SIZE_T MPI_UNSIGNED_LONG_LONG
374 #else
375 #error "Unknown size for size_t! Send us a bugreport at petsc-maint@mcs.anl.gov"
376 #endif
377 
378 /*
379       You can use PETSC_STDOUT as a replacement of stdout. You can also change
380     the value of PETSC_STDOUT to redirect all standard output elsewhere
381 */
382 PETSC_EXTERN FILE* PETSC_STDOUT;
383 
384 /*
385       You can use PETSC_STDERR as a replacement of stderr. You can also change
386     the value of PETSC_STDERR to redirect all standard error elsewhere
387 */
388 PETSC_EXTERN FILE* PETSC_STDERR;
389 
390 /*MC
391     PetscUnlikely - hints the compiler that the given condition is usually FALSE
392 
393     Synopsis:
394     #include <petscsys.h>
395     PetscBool  PetscUnlikely(PetscBool  cond)
396 
397     Not Collective
398 
399     Input Parameters:
400 .   cond - condition or expression
401 
402     Notes:
403     This returns the same truth value, it is only a hint to compilers that the resulting
404     branch is unlikely.
405 
406     Level: advanced
407 
408 .seealso: PetscLikely(), CHKERRQ
409 M*/
410 
411 /*MC
412     PetscLikely - hints the compiler that the given condition is usually TRUE
413 
414     Synopsis:
415     #include <petscsys.h>
416     PetscBool  PetscLikely(PetscBool  cond)
417 
418     Not Collective
419 
420     Input Parameters:
421 .   cond - condition or expression
422 
423     Notes:
424     This returns the same truth value, it is only a hint to compilers that the resulting
425     branch is likely.
426 
427     Level: advanced
428 
429 .seealso: PetscUnlikely()
430 M*/
431 #if defined(PETSC_HAVE_BUILTIN_EXPECT)
432 #  define PetscUnlikely(cond)   __builtin_expect(!!(cond),0)
433 #  define PetscLikely(cond)     __builtin_expect(!!(cond),1)
434 #else
435 #  define PetscUnlikely(cond)   (cond)
436 #  define PetscLikely(cond)     (cond)
437 #endif
438 
439 /*
440     Declare extern C stuff after including external header files
441 */
442 
443 
444 /*
445        Basic PETSc constants
446 */
447 
448 /*E
449     PetscBool  - Logical variable. Actually an int in C and a logical in Fortran.
450 
451    Level: beginner
452 
453    Developer Note:
454    Why have PetscBool , why not use bool in C? The problem is that K and R C, C99 and C++ all have different mechanisms for
455       boolean values. It is not easy to have a simple macro that that will work properly in all circumstances with all three mechanisms.
456 
457 .seealso: PETSC_TRUE, PETSC_FALSE, PetscNot()
458 E*/
459 typedef enum { PETSC_FALSE,PETSC_TRUE } PetscBool;
460 PETSC_EXTERN const char *const PetscBools[];
461 PETSC_EXTERN MPI_Datatype MPIU_BOOL PetscAttrMPITypeTag(PetscBool);
462 
463 /*
464     Defines elementary mathematics functions and constants.
465 */
466 #include <petscmath.h>
467 
468 /*E
469     PetscCopyMode  - Determines how an array passed to certain functions is copied or retained
470 
471    Level: beginner
472 
473 $   PETSC_COPY_VALUES - the array values are copied into new space, the user is free to reuse or delete the passed in array
474 $   PETSC_OWN_POINTER - the array values are NOT copied, the object takes ownership of the array and will free it later, the user cannot change or
475 $                       delete the array. The array MUST have been obtained with PetscMalloc(). Hence this mode cannot be used in Fortran.
476 $   PETSC_USE_POINTER - the array values are NOT copied, the object uses the array but does NOT take ownership of the array. The user cannot use
477                         the array but the user must delete the array after the object is destroyed.
478 
479 E*/
480 typedef enum { PETSC_COPY_VALUES, PETSC_OWN_POINTER, PETSC_USE_POINTER} PetscCopyMode;
481 PETSC_EXTERN const char *const PetscCopyModes[];
482 
483 /*MC
484     PETSC_FALSE - False value of PetscBool
485 
486     Level: beginner
487 
488     Note:
489     Zero integer
490 
491 .seealso: PetscBool, PETSC_TRUE
492 M*/
493 
494 /*MC
495     PETSC_TRUE - True value of PetscBool
496 
497     Level: beginner
498 
499     Note:
500     Nonzero integer
501 
502 .seealso: PetscBool, PETSC_FALSE
503 M*/
504 
505 /*MC
506     PETSC_IGNORE - same as NULL, means PETSc will ignore this argument
507 
508    Level: beginner
509 
510    Note:
511    Accepted by many PETSc functions to not set a parameter and instead use
512           some default
513 
514    Fortran Notes:
515    This macro does not exist in Fortran; you must use PETSC_NULL_INTEGER,
516           PETSC_NULL_DOUBLE_PRECISION etc
517 
518 .seealso: PETSC_DECIDE, PETSC_DEFAULT, PETSC_DETERMINE
519 
520 M*/
521 #define PETSC_IGNORE         NULL
522 
523 /* This is deprecated */
524 #define PETSC_NULL NULL
525 
526 /*MC
527     PETSC_DECIDE - standard way of passing in integer or floating point parameter
528        where you wish PETSc to use the default.
529 
530    Level: beginner
531 
532 .seealso: PETSC_DEFAULT, PETSC_IGNORE, PETSC_DETERMINE
533 
534 M*/
535 #define PETSC_DECIDE  -1
536 
537 /*MC
538     PETSC_DETERMINE - standard way of passing in integer or floating point parameter
539        where you wish PETSc to compute the required value.
540 
541    Level: beginner
542 
543    Developer Note:
544    I would like to use const PetscInt PETSC_DETERMINE = PETSC_DECIDE; but for
545      some reason this is not allowed by the standard even though PETSC_DECIDE is a constant value.
546 
547 .seealso: PETSC_DECIDE, PETSC_DEFAULT, PETSC_IGNORE, VecSetSizes()
548 
549 M*/
550 #define PETSC_DETERMINE PETSC_DECIDE
551 
552 /*MC
553     PETSC_DEFAULT - standard way of passing in integer or floating point parameter
554        where you wish PETSc to use the default.
555 
556    Level: beginner
557 
558    Fortran Notes:
559    You need to use PETSC_DEFAULT_INTEGER or PETSC_DEFAULT_REAL.
560 
561 .seealso: PETSC_DECIDE, PETSC_IGNORE, PETSC_DETERMINE
562 
563 M*/
564 #define PETSC_DEFAULT  -2
565 
566 /*MC
567     PETSC_COMM_WORLD - the equivalent of the MPI_COMM_WORLD communicator which represents
568            all the processs that PETSc knows about.
569 
570    Level: beginner
571 
572    Notes:
573    By default PETSC_COMM_WORLD and MPI_COMM_WORLD are identical unless you wish to
574           run PETSc on ONLY a subset of MPI_COMM_WORLD. In that case create your new (smaller)
575           communicator, call it, say comm, and set PETSC_COMM_WORLD = comm BEFORE calling
576           PetscInitialize(), but after MPI_Init() has been called.
577 
578           The value of PETSC_COMM_WORLD should never be USED/accessed before PetscInitialize()
579           is called because it may not have a valid value yet.
580 
581 .seealso: PETSC_COMM_SELF
582 
583 M*/
584 PETSC_EXTERN MPI_Comm PETSC_COMM_WORLD;
585 
586 /*MC
587     PETSC_COMM_SELF - This is always MPI_COMM_SELF
588 
589    Level: beginner
590 
591    Notes:
592    Do not USE/access or set this variable before PetscInitialize() has been called.
593 
594 .seealso: PETSC_COMM_WORLD
595 
596 M*/
597 #define PETSC_COMM_SELF MPI_COMM_SELF
598 
599 PETSC_EXTERN PetscBool PetscBeganMPI;
600 PETSC_EXTERN PetscBool PetscInitializeCalled;
601 PETSC_EXTERN PetscBool PetscFinalizeCalled;
602 PETSC_EXTERN PetscBool PetscViennaCLSynchronize;
603 PETSC_EXTERN PetscBool PetscCUDASynchronize;
604 
605 PETSC_EXTERN PetscErrorCode PetscSetHelpVersionFunctions(PetscErrorCode (*)(MPI_Comm),PetscErrorCode (*)(MPI_Comm));
606 PETSC_EXTERN PetscErrorCode PetscCommDuplicate(MPI_Comm,MPI_Comm*,int*);
607 PETSC_EXTERN PetscErrorCode PetscCommDestroy(MPI_Comm*);
608 
609 /*MC
610    PetscMalloc - Allocates memory, One should use PetscNew(), PetscMalloc1() or PetscCalloc1() usually instead of this
611 
612    Synopsis:
613     #include <petscsys.h>
614    PetscErrorCode PetscMalloc(size_t m,void **result)
615 
616    Not Collective
617 
618    Input Parameter:
619 .  m - number of bytes to allocate
620 
621    Output Parameter:
622 .  result - memory allocated
623 
624    Level: beginner
625 
626    Notes:
627    Memory is always allocated at least double aligned
628 
629    It is safe to allocate size 0 and pass the resulting pointer (which may or may not be NULL) to PetscFree().
630 
631 .seealso: PetscFree(), PetscNew()
632 
633   Concepts: memory allocation
634 
635 M*/
636 #define PetscMalloc(a,b)  ((*PetscTrMalloc)((a),__LINE__,PETSC_FUNCTION_NAME,__FILE__,(void**)(b)))
637 
638 /*MC
639    PetscRealloc - Rellocates memory
640 
641    Synopsis:
642     #include <petscsys.h>
643    PetscErrorCode PetscRealloc(size_t m,void **result)
644 
645    Not Collective
646 
647    Input Parameters:
648 +  m - number of bytes to allocate
649 -  result - initial memory allocated
650 
651    Output Parameter:
652 .  result - new memory allocated
653 
654    Level: developer
655 
656    Notes:
657    Memory is always allocated at least double aligned
658 
659 .seealso: PetscMalloc(), PetscFree(), PetscNew()
660 
661   Concepts: memory allocation
662 
663 M*/
664 #define PetscRealloc(a,b)  ((*PetscTrRealloc)((a),__LINE__,PETSC_FUNCTION_NAME,__FILE__,(void**)(b)))
665 
666 /*MC
667    PetscAddrAlign - Rounds up an address to PETSC_MEMALIGN alignment
668 
669    Synopsis:
670     #include <petscsys.h>
671    void *PetscAddrAlign(void *addr)
672 
673    Not Collective
674 
675    Input Parameters:
676 .  addr - address to align (any pointer type)
677 
678    Level: developer
679 
680 .seealso: PetscMallocAlign()
681 
682   Concepts: memory allocation
683 M*/
684 #define PetscAddrAlign(a) (void*)((((PETSC_UINTPTR_T)(a))+(PETSC_MEMALIGN-1)) & ~(PETSC_MEMALIGN-1))
685 
686 /*MC
687    PetscMalloc1 - Allocates an array of memory aligned to PETSC_MEMALIGN
688 
689    Synopsis:
690     #include <petscsys.h>
691    PetscErrorCode PetscMalloc1(size_t m1,type **r1)
692 
693    Not Collective
694 
695    Input Parameter:
696 .  m1 - number of elements to allocate  (may be zero)
697 
698    Output Parameter:
699 .  r1 - memory allocated in first chunk
700 
701    Note:
702    This uses the sizeof() of the memory type requested to determine the total memory to be allocated, therefore you should not
703          multiply the number of elements requested by the sizeof() the type. For example use
704 $  PetscInt *id;
705 $  PetscMalloc1(10,&id);
706         not
707 $  PetscInt *id;
708 $  PetscMalloc1(10*sizeof(PetscInt),&id);
709 
710         Does not zero the memory allocatd, used PetscCalloc1() to obtain memory that has been zeroed.
711 
712    Level: beginner
713 
714 .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscCalloc1(), PetscMalloc2()
715 
716   Concepts: memory allocation
717 
718 M*/
719 #define PetscMalloc1(m1,r1) PetscMallocA(1,PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1))
720 
721 /*MC
722    PetscCalloc1 - Allocates a cleared (zeroed) array of memory aligned to PETSC_MEMALIGN
723 
724    Synopsis:
725     #include <petscsys.h>
726    PetscErrorCode PetscCalloc1(size_t m1,type **r1)
727 
728    Not Collective
729 
730    Input Parameter:
731 .  m1 - number of elements to allocate in 1st chunk  (may be zero)
732 
733    Output Parameter:
734 .  r1 - memory allocated in first chunk
735 
736    Notes:
737    See PetsMalloc1() for more details on usage.
738 
739    Level: beginner
740 
741 .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc1(), PetscCalloc2()
742 
743   Concepts: memory allocation
744 
745 M*/
746 #define PetscCalloc1(m1,r1) PetscMallocA(1,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1))
747 
748 /*MC
749    PetscMalloc2 - Allocates 2 arrays of memory both aligned to PETSC_MEMALIGN
750 
751    Synopsis:
752     #include <petscsys.h>
753    PetscErrorCode PetscMalloc2(size_t m1,type **r1,size_t m2,type **r2)
754 
755    Not Collective
756 
757    Input Parameter:
758 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
759 -  m2 - number of elements to allocate in 2nd chunk  (may be zero)
760 
761    Output Parameter:
762 +  r1 - memory allocated in first chunk
763 -  r2 - memory allocated in second chunk
764 
765    Level: developer
766 
767 .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc1(), PetscCalloc2()
768 
769   Concepts: memory allocation
770 
771 M*/
772 #define PetscMalloc2(m1,r1,m2,r2) PetscMallocA(2,PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2))
773 
774 /*MC
775    PetscCalloc2 - Allocates 2 cleared (zeroed) arrays of memory both aligned to PETSC_MEMALIGN
776 
777    Synopsis:
778     #include <petscsys.h>
779    PetscErrorCode PetscCalloc2(size_t m1,type **r1,size_t m2,type **r2)
780 
781    Not Collective
782 
783    Input Parameter:
784 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
785 -  m2 - number of elements to allocate in 2nd chunk  (may be zero)
786 
787    Output Parameter:
788 +  r1 - memory allocated in first chunk
789 -  r2 - memory allocated in second chunk
790 
791    Level: developer
792 
793 .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscCalloc1(), PetscMalloc2()
794 
795   Concepts: memory allocation
796 M*/
797 #define PetscCalloc2(m1,r1,m2,r2) PetscMallocA(2,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2))
798 
799 /*MC
800    PetscMalloc3 - Allocates 3 arrays of memory, all aligned to PETSC_MEMALIGN
801 
802    Synopsis:
803     #include <petscsys.h>
804    PetscErrorCode PetscMalloc3(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3)
805 
806    Not Collective
807 
808    Input Parameter:
809 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
810 .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
811 -  m3 - number of elements to allocate in 3rd chunk  (may be zero)
812 
813    Output Parameter:
814 +  r1 - memory allocated in first chunk
815 .  r2 - memory allocated in second chunk
816 -  r3 - memory allocated in third chunk
817 
818    Level: developer
819 
820 .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscCalloc3(), PetscFree3()
821 
822   Concepts: memory allocation
823 
824 M*/
825 #define PetscMalloc3(m1,r1,m2,r2,m3,r3) PetscMallocA(3,PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2),(size_t)(m3)*sizeof(**(r3)),(r3))
826 
827 /*MC
828    PetscCalloc3 - Allocates 3 cleared (zeroed) arrays of memory, all aligned to PETSC_MEMALIGN
829 
830    Synopsis:
831     #include <petscsys.h>
832    PetscErrorCode PetscCalloc3(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3)
833 
834    Not Collective
835 
836    Input Parameter:
837 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
838 .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
839 -  m3 - number of elements to allocate in 3rd chunk  (may be zero)
840 
841    Output Parameter:
842 +  r1 - memory allocated in first chunk
843 .  r2 - memory allocated in second chunk
844 -  r3 - memory allocated in third chunk
845 
846    Level: developer
847 
848 .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscCalloc2(), PetscMalloc3(), PetscFree3()
849 
850   Concepts: memory allocation
851 M*/
852 #define PetscCalloc3(m1,r1,m2,r2,m3,r3) PetscMallocA(3,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2),(size_t)(m3)*sizeof(**(r3)),(r3))
853 
854 /*MC
855    PetscMalloc4 - Allocates 4 arrays of memory, all aligned to PETSC_MEMALIGN
856 
857    Synopsis:
858     #include <petscsys.h>
859    PetscErrorCode PetscMalloc4(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3,size_t m4,type **r4)
860 
861    Not Collective
862 
863    Input Parameter:
864 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
865 .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
866 .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
867 -  m4 - number of elements to allocate in 4th chunk  (may be zero)
868 
869    Output Parameter:
870 +  r1 - memory allocated in first chunk
871 .  r2 - memory allocated in second chunk
872 .  r3 - memory allocated in third chunk
873 -  r4 - memory allocated in fourth chunk
874 
875    Level: developer
876 
877 .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscCalloc4(), PetscFree4()
878 
879   Concepts: memory allocation
880 
881 M*/
882 #define PetscMalloc4(m1,r1,m2,r2,m3,r3,m4,r4) PetscMallocA(4,PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2),(size_t)(m3)*sizeof(**(r3)),(r3),(size_t)(m4)*sizeof(**(r4)),(r4))
883 
884 /*MC
885    PetscCalloc4 - Allocates 4 cleared (zeroed) arrays of memory, all aligned to PETSC_MEMALIGN
886 
887    Synopsis:
888     #include <petscsys.h>
889    PetscErrorCode PetscCalloc4(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3,size_t m4,type **r4)
890 
891    Not Collective
892 
893    Input Parameters:
894 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
895 .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
896 .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
897 -  m4 - number of elements to allocate in 4th chunk  (may be zero)
898 
899    Output Parameters:
900 +  r1 - memory allocated in first chunk
901 .  r2 - memory allocated in second chunk
902 .  r3 - memory allocated in third chunk
903 -  r4 - memory allocated in fourth chunk
904 
905    Level: developer
906 
907 .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscCalloc4(), PetscFree4()
908 
909   Concepts: memory allocation
910 
911 M*/
912 #define PetscCalloc4(m1,r1,m2,r2,m3,r3,m4,r4) PetscMallocA(4,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2),(size_t)(m3)*sizeof(**(r3)),(r3),(size_t)(m4)*sizeof(**(r4)),(r4))
913 
914 /*MC
915    PetscMalloc5 - Allocates 5 arrays of memory, all aligned to PETSC_MEMALIGN
916 
917    Synopsis:
918     #include <petscsys.h>
919    PetscErrorCode PetscMalloc5(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3,size_t m4,type **r4,size_t m5,type **r5)
920 
921    Not Collective
922 
923    Input Parameters:
924 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
925 .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
926 .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
927 .  m4 - number of elements to allocate in 4th chunk  (may be zero)
928 -  m5 - number of elements to allocate in 5th chunk  (may be zero)
929 
930    Output Parameters:
931 +  r1 - memory allocated in first chunk
932 .  r2 - memory allocated in second chunk
933 .  r3 - memory allocated in third chunk
934 .  r4 - memory allocated in fourth chunk
935 -  r5 - memory allocated in fifth chunk
936 
937    Level: developer
938 
939 .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscCalloc5(), PetscFree5()
940 
941   Concepts: memory allocation
942 
943 M*/
944 #define PetscMalloc5(m1,r1,m2,r2,m3,r3,m4,r4,m5,r5) PetscMallocA(5,PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2),(size_t)(m3)*sizeof(**(r3)),(r3),(size_t)(m4)*sizeof(**(r4)),(r4),(size_t)(m5)*sizeof(**(r5)),(r5))
945 
946 /*MC
947    PetscCalloc5 - Allocates 5 cleared (zeroed) arrays of memory, all aligned to PETSC_MEMALIGN
948 
949    Synopsis:
950     #include <petscsys.h>
951    PetscErrorCode PetscCalloc5(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3,size_t m4,type **r4,size_t m5,type **r5)
952 
953    Not Collective
954 
955    Input Parameters:
956 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
957 .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
958 .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
959 .  m4 - number of elements to allocate in 4th chunk  (may be zero)
960 -  m5 - number of elements to allocate in 5th chunk  (may be zero)
961 
962    Output Parameters:
963 +  r1 - memory allocated in first chunk
964 .  r2 - memory allocated in second chunk
965 .  r3 - memory allocated in third chunk
966 .  r4 - memory allocated in fourth chunk
967 -  r5 - memory allocated in fifth chunk
968 
969    Level: developer
970 
971 .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc5(), PetscFree5()
972 
973   Concepts: memory allocation
974 
975 M*/
976 #define PetscCalloc5(m1,r1,m2,r2,m3,r3,m4,r4,m5,r5) PetscMallocA(5,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2),(size_t)(m3)*sizeof(**(r3)),(r3),(size_t)(m4)*sizeof(**(r4)),(r4),(size_t)(m5)*sizeof(**(r5)),(r5))
977 
978 /*MC
979    PetscMalloc6 - Allocates 6 arrays of memory, all aligned to PETSC_MEMALIGN
980 
981    Synopsis:
982     #include <petscsys.h>
983    PetscErrorCode PetscMalloc6(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3,size_t m4,type **r4,size_t m5,type **r5,size_t m6,type **r6)
984 
985    Not Collective
986 
987    Input Parameters:
988 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
989 .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
990 .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
991 .  m4 - number of elements to allocate in 4th chunk  (may be zero)
992 .  m5 - number of elements to allocate in 5th chunk  (may be zero)
993 -  m6 - number of elements to allocate in 6th chunk  (may be zero)
994 
995    Output Parameteasr:
996 +  r1 - memory allocated in first chunk
997 .  r2 - memory allocated in second chunk
998 .  r3 - memory allocated in third chunk
999 .  r4 - memory allocated in fourth chunk
1000 .  r5 - memory allocated in fifth chunk
1001 -  r6 - memory allocated in sixth chunk
1002 
1003    Level: developer
1004 
1005 .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscCalloc6(), PetscFree3(), PetscFree4(), PetscFree5(), PetscFree6()
1006 
1007   Concepts: memory allocation
1008 
1009 M*/
1010 #define PetscMalloc6(m1,r1,m2,r2,m3,r3,m4,r4,m5,r5,m6,r6) PetscMallocA(6,PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2),(size_t)(m3)*sizeof(**(r3)),(r3),(size_t)(m4)*sizeof(**(r4)),(r4),(size_t)(m5)*sizeof(**(r5)),(r5),(size_t)(m6)*sizeof(**(r6)),(r6))
1011 
1012 /*MC
1013    PetscCalloc6 - Allocates 6 cleared (zeroed) arrays of memory, all aligned to PETSC_MEMALIGN
1014 
1015    Synopsis:
1016     #include <petscsys.h>
1017    PetscErrorCode PetscCalloc6(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3,size_t m4,type **r4,size_t m5,type **r5,size_t m6,type **r6)
1018 
1019    Not Collective
1020 
1021    Input Parameters:
1022 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
1023 .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
1024 .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
1025 .  m4 - number of elements to allocate in 4th chunk  (may be zero)
1026 .  m5 - number of elements to allocate in 5th chunk  (may be zero)
1027 -  m6 - number of elements to allocate in 6th chunk  (may be zero)
1028 
1029    Output Parameters:
1030 +  r1 - memory allocated in first chunk
1031 .  r2 - memory allocated in second chunk
1032 .  r3 - memory allocated in third chunk
1033 .  r4 - memory allocated in fourth chunk
1034 .  r5 - memory allocated in fifth chunk
1035 -  r6 - memory allocated in sixth chunk
1036 
1037    Level: developer
1038 
1039 .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscMalloc6(), PetscFree6()
1040 
1041   Concepts: memory allocation
1042 M*/
1043 #define PetscCalloc6(m1,r1,m2,r2,m3,r3,m4,r4,m5,r5,m6,r6) PetscMallocA(6,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2),(size_t)(m3)*sizeof(**(r3)),(r3),(size_t)(m4)*sizeof(**(r4)),(r4),(size_t)(m5)*sizeof(**(r5)),(r5),(size_t)(m6)*sizeof(**(r6)),(r6))
1044 
1045 /*MC
1046    PetscMalloc7 - Allocates 7 arrays of memory, all aligned to PETSC_MEMALIGN
1047 
1048    Synopsis:
1049     #include <petscsys.h>
1050    PetscErrorCode PetscMalloc7(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3,size_t m4,type **r4,size_t m5,type **r5,size_t m6,type **r6,size_t m7,type **r7)
1051 
1052    Not Collective
1053 
1054    Input Parameters:
1055 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
1056 .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
1057 .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
1058 .  m4 - number of elements to allocate in 4th chunk  (may be zero)
1059 .  m5 - number of elements to allocate in 5th chunk  (may be zero)
1060 .  m6 - number of elements to allocate in 6th chunk  (may be zero)
1061 -  m7 - number of elements to allocate in 7th chunk  (may be zero)
1062 
1063    Output Parameters:
1064 +  r1 - memory allocated in first chunk
1065 .  r2 - memory allocated in second chunk
1066 .  r3 - memory allocated in third chunk
1067 .  r4 - memory allocated in fourth chunk
1068 .  r5 - memory allocated in fifth chunk
1069 .  r6 - memory allocated in sixth chunk
1070 -  r7 - memory allocated in seventh chunk
1071 
1072    Level: developer
1073 
1074 .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscCalloc7(), PetscFree7()
1075 
1076   Concepts: memory allocation
1077 
1078 M*/
1079 #define PetscMalloc7(m1,r1,m2,r2,m3,r3,m4,r4,m5,r5,m6,r6,m7,r7) PetscMallocA(7,PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2),(size_t)(m3)*sizeof(**(r3)),(r3),(size_t)(m4)*sizeof(**(r4)),(r4),(size_t)(m5)*sizeof(**(r5)),(r5),(size_t)(m6)*sizeof(**(r6)),(r6),(size_t)(m7)*sizeof(**(r7)),(r7))
1080 
1081 /*MC
1082    PetscCalloc7 - Allocates 7 cleared (zeroed) arrays of memory, all aligned to PETSC_MEMALIGN
1083 
1084    Synopsis:
1085     #include <petscsys.h>
1086    PetscErrorCode PetscCalloc7(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3,size_t m4,type **r4,size_t m5,type **r5,size_t m6,type **r6,size_t m7,type **r7)
1087 
1088    Not Collective
1089 
1090    Input Parameters:
1091 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
1092 .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
1093 .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
1094 .  m4 - number of elements to allocate in 4th chunk  (may be zero)
1095 .  m5 - number of elements to allocate in 5th chunk  (may be zero)
1096 .  m6 - number of elements to allocate in 6th chunk  (may be zero)
1097 -  m7 - number of elements to allocate in 7th chunk  (may be zero)
1098 
1099    Output Parameters:
1100 +  r1 - memory allocated in first chunk
1101 .  r2 - memory allocated in second chunk
1102 .  r3 - memory allocated in third chunk
1103 .  r4 - memory allocated in fourth chunk
1104 .  r5 - memory allocated in fifth chunk
1105 .  r6 - memory allocated in sixth chunk
1106 -  r7 - memory allocated in seventh chunk
1107 
1108    Level: developer
1109 
1110 .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscMalloc7(), PetscFree7()
1111 
1112   Concepts: memory allocation
1113 M*/
1114 #define PetscCalloc7(m1,r1,m2,r2,m3,r3,m4,r4,m5,r5,m6,r6,m7,r7) PetscMallocA(7,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2),(size_t)(m3)*sizeof(**(r3)),(r3),(size_t)(m4)*sizeof(**(r4)),(r4),(size_t)(m5)*sizeof(**(r5)),(r5),(size_t)(m6)*sizeof(**(r6)),(r6),(size_t)(m7)*sizeof(**(r7)),(r7))
1115 
1116 /*MC
1117    PetscNew - Allocates memory of a particular type, zeros the memory! Aligned to PETSC_MEMALIGN
1118 
1119    Synopsis:
1120     #include <petscsys.h>
1121    PetscErrorCode PetscNew(type **result)
1122 
1123    Not Collective
1124 
1125    Output Parameter:
1126 .  result - memory allocated, sized to match pointer type
1127 
1128    Level: beginner
1129 
1130 .seealso: PetscFree(), PetscMalloc(), PetscNewLog(), PetscCalloc1(), PetscMalloc1()
1131 
1132   Concepts: memory allocation
1133 
1134 M*/
1135 #define PetscNew(b)      PetscCalloc1(1,(b))
1136 
1137 /*MC
1138    PetscNewLog - Allocates memory of a type matching pointer, zeros the memory! Aligned to PETSC_MEMALIGN. Associates the memory allocated
1139          with the given object using PetscLogObjectMemory().
1140 
1141    Synopsis:
1142     #include <petscsys.h>
1143    PetscErrorCode PetscNewLog(PetscObject obj,type **result)
1144 
1145    Not Collective
1146 
1147    Input Parameter:
1148 .  obj - object memory is logged to
1149 
1150    Output Parameter:
1151 .  result - memory allocated, sized to match pointer type
1152 
1153    Level: developer
1154 
1155 .seealso: PetscFree(), PetscMalloc(), PetscNew(), PetscLogObjectMemory(), PetscCalloc1(), PetscMalloc1()
1156 
1157   Concepts: memory allocation
1158 
1159 M*/
1160 #define PetscNewLog(o,b) (PetscNew((b)) || PetscLogObjectMemory((PetscObject)o,sizeof(**(b))))
1161 
1162 /*MC
1163    PetscFree - Frees memory
1164 
1165    Synopsis:
1166     #include <petscsys.h>
1167    PetscErrorCode PetscFree(void *memory)
1168 
1169    Not Collective
1170 
1171    Input Parameter:
1172 .   memory - memory to free (the pointer is ALWAYS set to NULL upon sucess)
1173 
1174    Level: beginner
1175 
1176    Notes:
1177    Do not free memory obtained with PetscMalloc2(), PetscCalloc2() etc, they must be freed with PetscFree2() etc.
1178 
1179    It is safe to call PetscFree() on a NULL pointer.
1180 
1181 .seealso: PetscNew(), PetscMalloc(), PetscNewLog(), PetscMalloc1(), PetscCalloc1()
1182 
1183   Concepts: memory allocation
1184 
1185 M*/
1186 #define PetscFree(a)   ((*PetscTrFree)((void*)(a),__LINE__,PETSC_FUNCTION_NAME,__FILE__) || ((a) = 0,0))
1187 
1188 /*MC
1189    PetscFree2 - Frees 2 chunks of memory obtained with PetscMalloc2()
1190 
1191    Synopsis:
1192     #include <petscsys.h>
1193    PetscErrorCode PetscFree2(void *memory1,void *memory2)
1194 
1195    Not Collective
1196 
1197    Input Parameters:
1198 +   memory1 - memory to free
1199 -   memory2 - 2nd memory to free
1200 
1201    Level: developer
1202 
1203    Notes: Memory must have been obtained with PetscMalloc2()
1204 
1205 .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree()
1206 
1207   Concepts: memory allocation
1208 
1209 M*/
1210 #define PetscFree2(m1,m2)   PetscFreeA(2,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2))
1211 
1212 /*MC
1213    PetscFree3 - Frees 3 chunks of memory obtained with PetscMalloc3()
1214 
1215    Synopsis:
1216     #include <petscsys.h>
1217    PetscErrorCode PetscFree3(void *memory1,void *memory2,void *memory3)
1218 
1219    Not Collective
1220 
1221    Input Parameters:
1222 +   memory1 - memory to free
1223 .   memory2 - 2nd memory to free
1224 -   memory3 - 3rd memory to free
1225 
1226    Level: developer
1227 
1228    Notes: Memory must have been obtained with PetscMalloc3()
1229 
1230 .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3()
1231 
1232   Concepts: memory allocation
1233 
1234 M*/
1235 #define PetscFree3(m1,m2,m3)   PetscFreeA(3,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2),&(m3))
1236 
1237 /*MC
1238    PetscFree4 - Frees 4 chunks of memory obtained with PetscMalloc4()
1239 
1240    Synopsis:
1241     #include <petscsys.h>
1242    PetscErrorCode PetscFree4(void *m1,void *m2,void *m3,void *m4)
1243 
1244    Not Collective
1245 
1246    Input Parameters:
1247 +   m1 - memory to free
1248 .   m2 - 2nd memory to free
1249 .   m3 - 3rd memory to free
1250 -   m4 - 4th memory to free
1251 
1252    Level: developer
1253 
1254    Notes: Memory must have been obtained with PetscMalloc4()
1255 
1256 .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3(), PetscMalloc4()
1257 
1258   Concepts: memory allocation
1259 
1260 M*/
1261 #define PetscFree4(m1,m2,m3,m4)   PetscFreeA(4,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2),&(m3),&(m4))
1262 
1263 /*MC
1264    PetscFree5 - Frees 5 chunks of memory obtained with PetscMalloc5()
1265 
1266    Synopsis:
1267     #include <petscsys.h>
1268    PetscErrorCode PetscFree5(void *m1,void *m2,void *m3,void *m4,void *m5)
1269 
1270    Not Collective
1271 
1272    Input Parameters:
1273 +   m1 - memory to free
1274 .   m2 - 2nd memory to free
1275 .   m3 - 3rd memory to free
1276 .   m4 - 4th memory to free
1277 -   m5 - 5th memory to free
1278 
1279    Level: developer
1280 
1281    Notes: Memory must have been obtained with PetscMalloc5()
1282 
1283 .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3(), PetscMalloc4(), PetscMalloc5()
1284 
1285   Concepts: memory allocation
1286 
1287 M*/
1288 #define PetscFree5(m1,m2,m3,m4,m5)   PetscFreeA(5,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2),&(m3),&(m4),&(m5))
1289 
1290 /*MC
1291    PetscFree6 - Frees 6 chunks of memory obtained with PetscMalloc6()
1292 
1293    Synopsis:
1294     #include <petscsys.h>
1295    PetscErrorCode PetscFree6(void *m1,void *m2,void *m3,void *m4,void *m5,void *m6)
1296 
1297    Not Collective
1298 
1299    Input Parameters:
1300 +   m1 - memory to free
1301 .   m2 - 2nd memory to free
1302 .   m3 - 3rd memory to free
1303 .   m4 - 4th memory to free
1304 .   m5 - 5th memory to free
1305 -   m6 - 6th memory to free
1306 
1307 
1308    Level: developer
1309 
1310    Notes: Memory must have been obtained with PetscMalloc6()
1311 
1312 .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3(), PetscMalloc4(), PetscMalloc5(), PetscMalloc6()
1313 
1314   Concepts: memory allocation
1315 
1316 M*/
1317 #define PetscFree6(m1,m2,m3,m4,m5,m6)   PetscFreeA(6,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2),&(m3),&(m4),&(m5),&(m6))
1318 
1319 /*MC
1320    PetscFree7 - Frees 7 chunks of memory obtained with PetscMalloc7()
1321 
1322    Synopsis:
1323     #include <petscsys.h>
1324    PetscErrorCode PetscFree7(void *m1,void *m2,void *m3,void *m4,void *m5,void *m6,void *m7)
1325 
1326    Not Collective
1327 
1328    Input Parameters:
1329 +   m1 - memory to free
1330 .   m2 - 2nd memory to free
1331 .   m3 - 3rd memory to free
1332 .   m4 - 4th memory to free
1333 .   m5 - 5th memory to free
1334 .   m6 - 6th memory to free
1335 -   m7 - 7th memory to free
1336 
1337 
1338    Level: developer
1339 
1340    Notes: Memory must have been obtained with PetscMalloc7()
1341 
1342 .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3(), PetscMalloc4(), PetscMalloc5(), PetscMalloc6(),
1343           PetscMalloc7()
1344 
1345   Concepts: memory allocation
1346 
1347 M*/
1348 #define PetscFree7(m1,m2,m3,m4,m5,m6,m7)   PetscFreeA(7,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2),&(m3),&(m4),&(m5),&(m6),&(m7))
1349 
1350 PETSC_EXTERN PetscErrorCode PetscMallocA(int,PetscBool,int,const char *,const char *,size_t,void *,...);
1351 PETSC_EXTERN PetscErrorCode PetscFreeA(int,int,const char *,const char *,void *,...);
1352 PETSC_EXTERN PetscErrorCode (*PetscTrMalloc)(size_t,int,const char[],const char[],void**);
1353 PETSC_EXTERN PetscErrorCode (*PetscTrFree)(void*,int,const char[],const char[]);
1354 PETSC_EXTERN PetscErrorCode (*PetscTrRealloc)(size_t,int,const char[],const char[],void**);
1355 PETSC_EXTERN PetscErrorCode PetscMallocSetCoalesce(PetscBool);
1356 PETSC_EXTERN PetscErrorCode PetscMallocSet(PetscErrorCode (*)(size_t,int,const char[],const char[],void**),PetscErrorCode (*)(void*,int,const char[],const char[]));
1357 PETSC_EXTERN PetscErrorCode PetscMallocClear(void);
1358 
1359 /*
1360   Unlike PetscMallocSet and PetscMallocClear which overwrite the existing settings, these two functions save the previous choice of allocator, and should be used in pair.
1361 */
1362 PETSC_EXTERN PetscErrorCode PetscMallocSetDRAM(void);
1363 PETSC_EXTERN PetscErrorCode PetscMallocResetDRAM(void);
1364 
1365 /*
1366     PetscLogDouble variables are used to contain double precision numbers
1367   that are not used in the numerical computations, but rather in logging,
1368   timing etc.
1369 */
1370 typedef double PetscLogDouble;
1371 #define MPIU_PETSCLOGDOUBLE MPI_DOUBLE
1372 
1373 /*
1374    Routines for tracing memory corruption/bleeding with default PETSc memory allocation
1375 */
1376 PETSC_EXTERN PetscErrorCode PetscMallocDump(FILE *);
1377 PETSC_EXTERN PetscErrorCode PetscMallocDumpLog(FILE *);
1378 PETSC_EXTERN PetscErrorCode PetscMallocGetCurrentUsage(PetscLogDouble *);
1379 PETSC_EXTERN PetscErrorCode PetscMallocGetMaximumUsage(PetscLogDouble *);
1380 PETSC_EXTERN PetscErrorCode PetscMallocDebug(PetscBool);
1381 PETSC_EXTERN PetscErrorCode PetscMallocGetDebug(PetscBool*);
1382 PETSC_EXTERN PetscErrorCode PetscMallocValidate(int,const char[],const char[]);
1383 PETSC_EXTERN PetscErrorCode PetscMallocSetDumpLog(void);
1384 PETSC_EXTERN PetscErrorCode PetscMallocSetDumpLogThreshold(PetscLogDouble);
1385 PETSC_EXTERN PetscErrorCode PetscMallocGetDumpLog(PetscBool*);
1386 
1387 /*E
1388     PetscDataType - Used for handling different basic data types.
1389 
1390    Level: beginner
1391 
1392    Notes:
1393    Use of this should be avoided if one can directly use MPI_Datatype instead.
1394 
1395    Developer comment:
1396    It would be nice if we could always just use MPI Datatypes, why can we not?
1397 
1398 .seealso: PetscBinaryRead(), PetscBinaryWrite(), PetscDataTypeToMPIDataType(),
1399           PetscDataTypeGetSize()
1400 
1401 E*/
1402 typedef enum {PETSC_INT = 0,PETSC_DOUBLE = 1,PETSC_COMPLEX = 2, PETSC_LONG = 3 ,PETSC_SHORT = 4,PETSC_FLOAT = 5,
1403               PETSC_CHAR = 6,PETSC_BIT_LOGICAL = 7,PETSC_ENUM = 8,PETSC_BOOL=9, PETSC___FLOAT128 = 10,PETSC_OBJECT = 11, PETSC_FUNCTION = 12, PETSC_STRING = 13, PETSC___FP16 = 14,PETSC_STRUCT, PETSC_DATATYPE_UNKNOWN} PetscDataType;
1404 PETSC_EXTERN const char *const PetscDataTypes[];
1405 
1406 #if defined(PETSC_USE_COMPLEX)
1407 #define  PETSC_SCALAR  PETSC_COMPLEX
1408 #else
1409 #if defined(PETSC_USE_REAL_SINGLE)
1410 #define  PETSC_SCALAR  PETSC_FLOAT
1411 #elif defined(PETSC_USE_REAL___FLOAT128)
1412 #define  PETSC_SCALAR  PETSC___FLOAT128
1413 #elif defined(PETSC_USE_REAL___FP16)
1414 #define  PETSC_SCALAR  PETSC___FP16
1415 #else
1416 #define  PETSC_SCALAR  PETSC_DOUBLE
1417 #endif
1418 #endif
1419 #if defined(PETSC_USE_REAL_SINGLE)
1420 #define  PETSC_REAL  PETSC_FLOAT
1421 #elif defined(PETSC_USE_REAL___FLOAT128)
1422 #define  PETSC_REAL  PETSC___FLOAT128
1423 #elif defined(PETSC_USE_REAL___FP16)
1424 #define  PETSC_REAL  PETSC___FP16
1425 #else
1426 #define  PETSC_REAL  PETSC_DOUBLE
1427 #endif
1428 #define  PETSC_FORTRANADDR  PETSC_LONG
1429 
1430 PETSC_EXTERN PetscErrorCode PetscDataTypeToMPIDataType(PetscDataType,MPI_Datatype*);
1431 PETSC_EXTERN PetscErrorCode PetscMPIDataTypeToPetscDataType(MPI_Datatype,PetscDataType*);
1432 PETSC_EXTERN PetscErrorCode PetscDataTypeGetSize(PetscDataType,size_t*);
1433 PETSC_EXTERN PetscErrorCode PetscDataTypeFromString(const char*,PetscDataType*,PetscBool*);
1434 
1435 /*
1436     Basic memory and string operations. These are usually simple wrappers
1437    around the basic Unix system calls, but a few of them have additional
1438    functionality and/or error checking.
1439 */
1440 PETSC_EXTERN PetscErrorCode PetscBitMemcpy(void*,PetscInt,const void*,PetscInt,PetscInt,PetscDataType);
1441 PETSC_EXTERN PetscErrorCode PetscMemmove(void*,void *,size_t);
1442 PETSC_EXTERN PetscErrorCode PetscMemcmp(const void*,const void*,size_t,PetscBool  *);
1443 PETSC_EXTERN PetscErrorCode PetscStrlen(const char[],size_t*);
1444 PETSC_EXTERN PetscErrorCode PetscStrToArray(const char[],char,int*,char ***);
1445 PETSC_EXTERN PetscErrorCode PetscStrToArrayDestroy(int,char **);
1446 PETSC_EXTERN PetscErrorCode PetscStrcmp(const char[],const char[],PetscBool  *);
1447 PETSC_EXTERN PetscErrorCode PetscStrgrt(const char[],const char[],PetscBool  *);
1448 PETSC_EXTERN PetscErrorCode PetscStrcasecmp(const char[],const char[],PetscBool *);
1449 PETSC_EXTERN PetscErrorCode PetscStrncmp(const char[],const char[],size_t,PetscBool *);
1450 PETSC_EXTERN PetscErrorCode PetscStrcpy(char[],const char[]);
1451 PETSC_EXTERN PetscErrorCode PetscStrcat(char[],const char[]);
1452 PETSC_EXTERN PetscErrorCode PetscStrlcat(char[],const char[],size_t);
1453 PETSC_EXTERN PetscErrorCode PetscStrncpy(char[],const char[],size_t);
1454 PETSC_EXTERN PetscErrorCode PetscStrchr(const char[],char,char *[]);
1455 PETSC_EXTERN PetscErrorCode PetscStrtolower(char[]);
1456 PETSC_EXTERN PetscErrorCode PetscStrtoupper(char[]);
1457 PETSC_EXTERN PetscErrorCode PetscStrrchr(const char[],char,char *[]);
1458 PETSC_EXTERN PetscErrorCode PetscStrstr(const char[],const char[],char *[]);
1459 PETSC_EXTERN PetscErrorCode PetscStrrstr(const char[],const char[],char *[]);
1460 PETSC_EXTERN PetscErrorCode PetscStrendswith(const char[],const char[],PetscBool*);
1461 PETSC_EXTERN PetscErrorCode PetscStrbeginswith(const char[],const char[],PetscBool*);
1462 PETSC_EXTERN PetscErrorCode PetscStrendswithwhich(const char[],const char *const*,PetscInt*);
1463 PETSC_EXTERN PetscErrorCode PetscStrallocpy(const char[],char *[]);
1464 PETSC_EXTERN PetscErrorCode PetscStrArrayallocpy(const char *const*,char***);
1465 PETSC_EXTERN PetscErrorCode PetscStrArrayDestroy(char***);
1466 PETSC_EXTERN PetscErrorCode PetscStrNArrayallocpy(PetscInt,const char *const*,char***);
1467 PETSC_EXTERN PetscErrorCode PetscStrNArrayDestroy(PetscInt,char***);
1468 PETSC_EXTERN PetscErrorCode PetscStrreplace(MPI_Comm,const char[],char[],size_t);
1469 
1470 PETSC_EXTERN void PetscStrcmpNoError(const char[],const char[],PetscBool  *);
1471 
1472 /*S
1473     PetscToken - 'Token' used for managing tokenizing strings
1474 
1475   Level: intermediate
1476 
1477 .seealso: PetscTokenCreate(), PetscTokenFind(), PetscTokenDestroy()
1478 S*/
1479 typedef struct _p_PetscToken* PetscToken;
1480 
1481 PETSC_EXTERN PetscErrorCode PetscTokenCreate(const char[],const char,PetscToken*);
1482 PETSC_EXTERN PetscErrorCode PetscTokenFind(PetscToken,char *[]);
1483 PETSC_EXTERN PetscErrorCode PetscTokenDestroy(PetscToken*);
1484 PETSC_EXTERN PetscErrorCode PetscStrInList(const char[],const char[],char,PetscBool*);
1485 
1486 PETSC_EXTERN PetscErrorCode PetscEListFind(PetscInt,const char *const*,const char*,PetscInt*,PetscBool*);
1487 PETSC_EXTERN PetscErrorCode PetscEnumFind(const char *const*,const char*,PetscEnum*,PetscBool*);
1488 
1489 /*
1490    These are MPI operations for MPI_Allreduce() etc
1491 */
1492 PETSC_EXTERN MPI_Op MPIU_MAXSUM_OP;
1493 #if (defined(PETSC_HAVE_COMPLEX) && !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX)) || defined(PETSC_USE_REAL___FLOAT128) || defined(PETSC_USE_REAL___FP16)
1494 PETSC_EXTERN MPI_Op MPIU_SUM;
1495 #else
1496 #define MPIU_SUM MPI_SUM
1497 #endif
1498 #if defined(PETSC_USE_REAL___FLOAT128) || defined(PETSC_USE_REAL___FP16)
1499 PETSC_EXTERN MPI_Op MPIU_MAX;
1500 PETSC_EXTERN MPI_Op MPIU_MIN;
1501 #else
1502 #define MPIU_MAX MPI_MAX
1503 #define MPIU_MIN MPI_MIN
1504 #endif
1505 PETSC_EXTERN PetscErrorCode PetscMaxSum(MPI_Comm,const PetscInt[],PetscInt*,PetscInt*);
1506 
1507 PETSC_EXTERN PetscErrorCode MPIULong_Send(void*,PetscInt,MPI_Datatype,PetscMPIInt,PetscMPIInt,MPI_Comm);
1508 PETSC_EXTERN PetscErrorCode MPIULong_Recv(void*,PetscInt,MPI_Datatype,PetscMPIInt,PetscMPIInt,MPI_Comm);
1509 
1510 /*S
1511      PetscObject - any PETSc object, PetscViewer, Mat, Vec, KSP etc
1512 
1513    Level: beginner
1514 
1515    Note:
1516    This is the base class from which all PETSc objects are derived from.
1517 
1518 .seealso:  PetscObjectDestroy(), PetscObjectView(), PetscObjectGetName(), PetscObjectSetName(), PetscObjectReference(), PetscObjectDereference()
1519 S*/
1520 typedef struct _p_PetscObject* PetscObject;
1521 
1522 /*MC
1523     PetscObjectId - unique integer Id for a PetscObject
1524 
1525     Level: developer
1526 
1527     Notes:
1528     Unlike pointer values, object ids are never reused.
1529 
1530 .seealso: PetscObjectState, PetscObjectGetId()
1531 M*/
1532 #if defined(PETSC_USING_F90) && !defined(PETSC_USE_FORTRANKIND) /* compaq F90 */
1533 typedef int PetscObjectId;
1534 #else
1535 typedef PetscInt64 PetscObjectId;
1536 #endif
1537 
1538 /*MC
1539     PetscObjectState - integer state for a PetscObject
1540 
1541     Level: developer
1542 
1543     Notes:
1544     Object state is always-increasing and (for objects that track state) can be used to determine if an object has
1545     changed since the last time you interacted with it.  It is 64-bit so that it will not overflow for a very long time.
1546 
1547 .seealso: PetscObjectId, PetscObjectStateGet(), PetscObjectStateIncrease(), PetscObjectStateSet()
1548 M*/
1549 #if defined(PETSC_USING_F90) && !defined(PETSC_USE_FORTRANKIND) /* compaq F90 */
1550 typedef int PetscObjectState;
1551 #else
1552 typedef PetscInt64 PetscObjectState;
1553 #endif
1554 
1555 /*S
1556      PetscFunctionList - Linked list of functions, possibly stored in dynamic libraries, accessed
1557       by string name
1558 
1559    Level: advanced
1560 
1561 .seealso:  PetscFunctionListAdd(), PetscFunctionListDestroy(), PetscOpFlist
1562 S*/
1563 typedef struct _n_PetscFunctionList *PetscFunctionList;
1564 
1565 /*E
1566   PetscFileMode - Access mode for a file.
1567 
1568   Level: beginner
1569 
1570 $  FILE_MODE_READ - open a file at its beginning for reading
1571 $  FILE_MODE_WRITE - open a file at its beginning for writing (will create if the file does not exist)
1572 $  FILE_MODE_APPEND - open a file at end for writing
1573 $  FILE_MODE_UPDATE - open a file for updating, meaning for reading and writing
1574 $  FILE_MODE_APPEND_UPDATE - open a file for updating, meaning for reading and writing, at the end
1575 
1576 .seealso: PetscViewerFileSetMode()
1577 E*/
1578 typedef enum {FILE_MODE_READ, FILE_MODE_WRITE, FILE_MODE_APPEND, FILE_MODE_UPDATE, FILE_MODE_APPEND_UPDATE} PetscFileMode;
1579 extern const char *const PetscFileModes[];
1580 
1581 /*
1582     Defines PETSc error handling.
1583 */
1584 #include <petscerror.h>
1585 
1586 #define PETSC_SMALLEST_CLASSID  1211211
1587 PETSC_EXTERN PetscClassId PETSC_LARGEST_CLASSID;
1588 PETSC_EXTERN PetscClassId PETSC_OBJECT_CLASSID;
1589 PETSC_EXTERN PetscErrorCode PetscClassIdRegister(const char[],PetscClassId *);
1590 
1591 /*
1592    Routines that get memory usage information from the OS
1593 */
1594 PETSC_EXTERN PetscErrorCode PetscMemoryGetCurrentUsage(PetscLogDouble *);
1595 PETSC_EXTERN PetscErrorCode PetscMemoryGetMaximumUsage(PetscLogDouble *);
1596 PETSC_EXTERN PetscErrorCode PetscMemorySetGetMaximumUsage(void);
1597 PETSC_EXTERN PetscErrorCode PetscMemoryTrace(const char[]);
1598 
1599 PETSC_EXTERN PetscErrorCode PetscInfoAllow(PetscBool ,const char []);
1600 PETSC_EXTERN PetscErrorCode PetscSleep(PetscReal);
1601 
1602 /*
1603    Initialization of PETSc
1604 */
1605 PETSC_EXTERN PetscErrorCode PetscInitialize(int*,char***,const char[],const char[]);
1606 PETSC_EXTERN PetscErrorCode PetscInitializeNoPointers(int,char**,const char[],const char[]);
1607 PETSC_EXTERN PetscErrorCode PetscInitializeNoArguments(void);
1608 PETSC_EXTERN PetscErrorCode PetscInitialized(PetscBool *);
1609 PETSC_EXTERN PetscErrorCode PetscFinalized(PetscBool *);
1610 PETSC_EXTERN PetscErrorCode PetscFinalize(void);
1611 PETSC_EXTERN PetscErrorCode PetscInitializeFortran(void);
1612 PETSC_EXTERN PetscErrorCode PetscGetArgs(int*,char ***);
1613 PETSC_EXTERN PetscErrorCode PetscGetArguments(char ***);
1614 PETSC_EXTERN PetscErrorCode PetscFreeArguments(char **);
1615 
1616 PETSC_EXTERN PetscErrorCode PetscEnd(void);
1617 PETSC_EXTERN PetscErrorCode PetscSysInitializePackage(void);
1618 
1619 PETSC_EXTERN PetscErrorCode PetscPythonInitialize(const char[],const char[]);
1620 PETSC_EXTERN PetscErrorCode PetscPythonFinalize(void);
1621 PETSC_EXTERN PetscErrorCode PetscPythonPrintError(void);
1622 PETSC_EXTERN PetscErrorCode PetscPythonMonitorSet(PetscObject,const char[]);
1623 
1624 /*
1625      These are so that in extern C code we can caste function pointers to non-extern C
1626    function pointers. Since the regular C++ code expects its function pointers to be C++
1627 */
1628 PETSC_EXTERN_TYPEDEF typedef void (**PetscVoidStarFunction)(void);
1629 PETSC_EXTERN_TYPEDEF typedef void (*PetscVoidFunction)(void);
1630 PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*PetscErrorCodeFunction)(void);
1631 
1632 /*
1633     Functions that can act on any PETSc object.
1634 */
1635 PETSC_EXTERN PetscErrorCode PetscObjectDestroy(PetscObject*);
1636 PETSC_EXTERN PetscErrorCode PetscObjectGetComm(PetscObject,MPI_Comm *);
1637 PETSC_EXTERN PetscErrorCode PetscObjectGetClassId(PetscObject,PetscClassId *);
1638 PETSC_EXTERN PetscErrorCode PetscObjectGetClassName(PetscObject,const char *[]);
1639 PETSC_EXTERN PetscErrorCode PetscObjectSetType(PetscObject,const char []);
1640 PETSC_EXTERN PetscErrorCode PetscObjectGetType(PetscObject,const char *[]);
1641 PETSC_EXTERN PetscErrorCode PetscObjectSetName(PetscObject,const char[]);
1642 PETSC_EXTERN PetscErrorCode PetscObjectGetName(PetscObject,const char*[]);
1643 PETSC_EXTERN PetscErrorCode PetscObjectSetTabLevel(PetscObject,PetscInt);
1644 PETSC_EXTERN PetscErrorCode PetscObjectGetTabLevel(PetscObject,PetscInt*);
1645 PETSC_EXTERN PetscErrorCode PetscObjectIncrementTabLevel(PetscObject,PetscObject,PetscInt);
1646 PETSC_EXTERN PetscErrorCode PetscObjectReference(PetscObject);
1647 PETSC_EXTERN PetscErrorCode PetscObjectGetReference(PetscObject,PetscInt*);
1648 PETSC_EXTERN PetscErrorCode PetscObjectDereference(PetscObject);
1649 PETSC_EXTERN PetscErrorCode PetscObjectGetNewTag(PetscObject,PetscMPIInt *);
1650 PETSC_EXTERN PetscErrorCode PetscObjectCompose(PetscObject,const char[],PetscObject);
1651 PETSC_EXTERN PetscErrorCode PetscObjectRemoveReference(PetscObject,const char[]);
1652 PETSC_EXTERN PetscErrorCode PetscObjectQuery(PetscObject,const char[],PetscObject *);
1653 PETSC_EXTERN PetscErrorCode PetscObjectComposeFunction_Private(PetscObject,const char[],void (*)(void));
1654 #define PetscObjectComposeFunction(a,b,d) PetscObjectComposeFunction_Private(a,b,(PetscVoidFunction)(d))
1655 PETSC_EXTERN PetscErrorCode PetscObjectSetFromOptions(PetscObject);
1656 PETSC_EXTERN PetscErrorCode PetscObjectSetUp(PetscObject);
1657 PETSC_EXTERN PetscErrorCode PetscObjectSetPrintedOptions(PetscObject);
1658 PETSC_EXTERN PetscErrorCode PetscObjectInheritPrintedOptions(PetscObject,PetscObject);
1659 PETSC_EXTERN PetscErrorCode PetscCommGetNewTag(MPI_Comm,PetscMPIInt *);
1660 
1661 #include <petscviewertypes.h>
1662 #include <petscoptions.h>
1663 
1664 PETSC_EXTERN PetscErrorCode PetscObjectsListGetGlobalNumbering(MPI_Comm,PetscInt,PetscObject*,PetscInt*,PetscInt*);
1665 
1666 PETSC_EXTERN PetscErrorCode PetscMemoryShowUsage(PetscViewer,const char[]);
1667 PETSC_EXTERN PetscErrorCode PetscMemoryView(PetscViewer,const char[]);
1668 PETSC_EXTERN PetscErrorCode PetscObjectPrintClassNamePrefixType(PetscObject,PetscViewer);
1669 PETSC_EXTERN PetscErrorCode PetscObjectView(PetscObject,PetscViewer);
1670 #define PetscObjectQueryFunction(obj,name,fptr) PetscObjectQueryFunction_Private((obj),(name),(PetscVoidFunction*)(fptr))
1671 PETSC_EXTERN PetscErrorCode PetscObjectQueryFunction_Private(PetscObject,const char[],void (**)(void));
1672 PETSC_EXTERN PetscErrorCode PetscObjectSetOptionsPrefix(PetscObject,const char[]);
1673 PETSC_EXTERN PetscErrorCode PetscObjectAppendOptionsPrefix(PetscObject,const char[]);
1674 PETSC_EXTERN PetscErrorCode PetscObjectPrependOptionsPrefix(PetscObject,const char[]);
1675 PETSC_EXTERN PetscErrorCode PetscObjectGetOptionsPrefix(PetscObject,const char*[]);
1676 PETSC_EXTERN PetscErrorCode PetscObjectChangeTypeName(PetscObject,const char[]);
1677 PETSC_EXTERN PetscErrorCode PetscObjectRegisterDestroy(PetscObject);
1678 PETSC_EXTERN PetscErrorCode PetscObjectRegisterDestroyAll(void);
1679 PETSC_EXTERN PetscErrorCode PetscObjectViewFromOptions(PetscObject,PetscObject,const char[]);
1680 PETSC_EXTERN PetscErrorCode PetscObjectName(PetscObject);
1681 PETSC_EXTERN PetscErrorCode PetscObjectTypeCompare(PetscObject,const char[],PetscBool *);
1682 PETSC_EXTERN PetscErrorCode PetscObjectBaseTypeCompare(PetscObject,const char[],PetscBool *);
1683 PETSC_EXTERN PetscErrorCode PetscObjectTypeCompareAny(PetscObject,PetscBool*,const char[],...);
1684 PETSC_EXTERN PetscErrorCode PetscRegisterFinalize(PetscErrorCode (*)(void));
1685 PETSC_EXTERN PetscErrorCode PetscRegisterFinalizeAll(void);
1686 
1687 #if defined(PETSC_HAVE_SAWS)
1688 PETSC_EXTERN PetscErrorCode PetscSAWsBlock(void);
1689 PETSC_EXTERN PetscErrorCode PetscObjectSAWsViewOff(PetscObject);
1690 PETSC_EXTERN PetscErrorCode PetscObjectSAWsSetBlock(PetscObject,PetscBool);
1691 PETSC_EXTERN PetscErrorCode PetscObjectSAWsBlock(PetscObject);
1692 PETSC_EXTERN PetscErrorCode PetscObjectSAWsGrantAccess(PetscObject);
1693 PETSC_EXTERN PetscErrorCode PetscObjectSAWsTakeAccess(PetscObject);
1694 PETSC_EXTERN void           PetscStackSAWsGrantAccess(void);
1695 PETSC_EXTERN void           PetscStackSAWsTakeAccess(void);
1696 PETSC_EXTERN PetscErrorCode PetscStackViewSAWs(void);
1697 PETSC_EXTERN PetscErrorCode PetscStackSAWsViewOff(void);
1698 
1699 #else
1700 #define PetscSAWsBlock()                        0
1701 #define PetscObjectSAWsViewOff(obj)             0
1702 #define PetscObjectSAWsSetBlock(obj,flg)        0
1703 #define PetscObjectSAWsBlock(obj)               0
1704 #define PetscObjectSAWsGrantAccess(obj)         0
1705 #define PetscObjectSAWsTakeAccess(obj)          0
1706 #define PetscStackViewSAWs()                    0
1707 #define PetscStackSAWsViewOff()                 0
1708 #define PetscStackSAWsTakeAccess()
1709 #define PetscStackSAWsGrantAccess()
1710 
1711 #endif
1712 
1713 typedef void* PetscDLHandle;
1714 typedef enum {PETSC_DL_DECIDE=0,PETSC_DL_NOW=1,PETSC_DL_LOCAL=2} PetscDLMode;
1715 PETSC_EXTERN PetscErrorCode PetscDLOpen(const char[],PetscDLMode,PetscDLHandle *);
1716 PETSC_EXTERN PetscErrorCode PetscDLClose(PetscDLHandle *);
1717 PETSC_EXTERN PetscErrorCode PetscDLSym(PetscDLHandle,const char[],void **);
1718 
1719 #if defined(PETSC_USE_DEBUG)
1720 PETSC_EXTERN PetscErrorCode PetscMallocGetStack(void*,PetscStack**);
1721 #endif
1722 PETSC_EXTERN PetscErrorCode PetscObjectsDump(FILE*,PetscBool);
1723 
1724 /*S
1725      PetscObjectList - Linked list of PETSc objects, each accessable by string name
1726 
1727    Level: developer
1728 
1729    Notes:
1730    Used by PetscObjectCompose() and PetscObjectQuery()
1731 
1732 .seealso:  PetscObjectListAdd(), PetscObjectListDestroy(), PetscObjectListFind(), PetscObjectCompose(), PetscObjectQuery(), PetscFunctionList
1733 S*/
1734 typedef struct _n_PetscObjectList *PetscObjectList;
1735 
1736 PETSC_EXTERN PetscErrorCode PetscObjectListDestroy(PetscObjectList*);
1737 PETSC_EXTERN PetscErrorCode PetscObjectListFind(PetscObjectList,const char[],PetscObject*);
1738 PETSC_EXTERN PetscErrorCode PetscObjectListReverseFind(PetscObjectList,PetscObject,char**,PetscBool*);
1739 PETSC_EXTERN PetscErrorCode PetscObjectListAdd(PetscObjectList *,const char[],PetscObject);
1740 PETSC_EXTERN PetscErrorCode PetscObjectListRemoveReference(PetscObjectList *,const char[]);
1741 PETSC_EXTERN PetscErrorCode PetscObjectListDuplicate(PetscObjectList,PetscObjectList *);
1742 
1743 /*
1744     Dynamic library lists. Lists of names of routines in objects or in dynamic
1745   link libraries that will be loaded as needed.
1746 */
1747 
1748 #define PetscFunctionListAdd(list,name,fptr) PetscFunctionListAdd_Private((list),(name),(PetscVoidFunction)(fptr))
1749 PETSC_EXTERN PetscErrorCode PetscFunctionListAdd_Private(PetscFunctionList*,const char[],void (*)(void));
1750 PETSC_EXTERN PetscErrorCode PetscFunctionListDestroy(PetscFunctionList*);
1751 #define PetscFunctionListFind(list,name,fptr) PetscFunctionListFind_Private((list),(name),(PetscVoidFunction*)(fptr))
1752 PETSC_EXTERN PetscErrorCode PetscFunctionListFind_Private(PetscFunctionList,const char[],void (**)(void));
1753 PETSC_EXTERN PetscErrorCode PetscFunctionListPrintTypes(MPI_Comm,FILE*,const char[],const char[],const char[],const char[],PetscFunctionList,const char[]);
1754 PETSC_EXTERN PetscErrorCode PetscFunctionListDuplicate(PetscFunctionList,PetscFunctionList *);
1755 PETSC_EXTERN PetscErrorCode PetscFunctionListView(PetscFunctionList,PetscViewer);
1756 PETSC_EXTERN PetscErrorCode PetscFunctionListGet(PetscFunctionList,const char ***,int*);
1757 
1758 /*S
1759      PetscDLLibrary - Linked list of dynamics libraries to search for functions
1760 
1761    Level: advanced
1762 
1763 .seealso:  PetscDLLibraryOpen()
1764 S*/
1765 typedef struct _n_PetscDLLibrary *PetscDLLibrary;
1766 PETSC_EXTERN PetscDLLibrary  PetscDLLibrariesLoaded;
1767 PETSC_EXTERN PetscErrorCode PetscDLLibraryAppend(MPI_Comm,PetscDLLibrary *,const char[]);
1768 PETSC_EXTERN PetscErrorCode PetscDLLibraryPrepend(MPI_Comm,PetscDLLibrary *,const char[]);
1769 PETSC_EXTERN PetscErrorCode PetscDLLibrarySym(MPI_Comm,PetscDLLibrary *,const char[],const char[],void **);
1770 PETSC_EXTERN PetscErrorCode PetscDLLibraryPrintPath(PetscDLLibrary);
1771 PETSC_EXTERN PetscErrorCode PetscDLLibraryRetrieve(MPI_Comm,const char[],char *,size_t,PetscBool  *);
1772 PETSC_EXTERN PetscErrorCode PetscDLLibraryOpen(MPI_Comm,const char[],PetscDLLibrary *);
1773 PETSC_EXTERN PetscErrorCode PetscDLLibraryClose(PetscDLLibrary);
1774 
1775 /*
1776      Useful utility routines
1777 */
1778 PETSC_EXTERN PetscErrorCode PetscSplitOwnership(MPI_Comm,PetscInt*,PetscInt*);
1779 PETSC_EXTERN PetscErrorCode PetscSplitOwnershipBlock(MPI_Comm,PetscInt,PetscInt*,PetscInt*);
1780 PETSC_EXTERN PetscErrorCode PetscSequentialPhaseBegin(MPI_Comm,PetscMPIInt);
1781 PETSC_EXTERN PetscErrorCode PetscSequentialPhaseEnd(MPI_Comm,PetscMPIInt);
1782 PETSC_EXTERN PetscErrorCode PetscBarrier(PetscObject);
1783 PETSC_EXTERN PetscErrorCode PetscMPIDump(FILE*);
1784 PETSC_EXTERN PetscErrorCode PetscGlobalMinMaxInt(MPI_Comm,PetscInt[],PetscInt[]);
1785 PETSC_EXTERN PetscErrorCode PetscGlobalMinMaxReal(MPI_Comm,PetscReal[],PetscReal[]);
1786 
1787 /*
1788     PetscNot - negates a logical type value and returns result as a PetscBool
1789 
1790     Notes:
1791     This is useful in cases like
1792 $     int        *a;
1793 $     PetscBool  flag = PetscNot(a)
1794      where !a would not return a PetscBool because we cannot provide a cast from int to PetscBool in C.
1795 */
1796 #define PetscNot(a) ((a) ? PETSC_FALSE : PETSC_TRUE)
1797 
1798 /*MC
1799     PetscHelpPrintf - Prints help messages.
1800 
1801    Synopsis:
1802     #include <petscsys.h>
1803      PetscErrorCode (*PetscHelpPrintf)(const char format[],...);
1804 
1805     Not Collective
1806 
1807     Input Parameters:
1808 .   format - the usual printf() format string
1809 
1810    Level: developer
1811 
1812     Fortran Note:
1813     This routine is not supported in Fortran.
1814 
1815     Concepts: help messages^printing
1816     Concepts: printing^help messages
1817 
1818 .seealso: PetscFPrintf(), PetscSynchronizedPrintf(), PetscErrorPrintf()
1819 M*/
1820 PETSC_EXTERN PetscErrorCode (*PetscHelpPrintf)(MPI_Comm,const char[],...);
1821 
1822 /*
1823      Defines PETSc profiling.
1824 */
1825 #include <petsclog.h>
1826 
1827 /*
1828       Simple PETSc parallel IO for ASCII printing
1829 */
1830 PETSC_EXTERN PetscErrorCode PetscFixFilename(const char[],char[]);
1831 PETSC_EXTERN PetscErrorCode PetscFOpen(MPI_Comm,const char[],const char[],FILE**);
1832 PETSC_EXTERN PetscErrorCode PetscFClose(MPI_Comm,FILE*);
1833 PETSC_EXTERN PetscErrorCode PetscFPrintf(MPI_Comm,FILE*,const char[],...);
1834 PETSC_EXTERN PetscErrorCode PetscPrintf(MPI_Comm,const char[],...);
1835 PETSC_EXTERN PetscErrorCode PetscSNPrintf(char*,size_t,const char [],...);
1836 PETSC_EXTERN PetscErrorCode PetscSNPrintfCount(char*,size_t,const char [],size_t*,...);
1837 
1838 PETSC_EXTERN PetscErrorCode PetscErrorPrintfDefault(const char [],...);
1839 PETSC_EXTERN PetscErrorCode PetscErrorPrintfNone(const char [],...);
1840 PETSC_EXTERN PetscErrorCode PetscHelpPrintfDefault(MPI_Comm,const char [],...);
1841 
1842 #if defined(PETSC_HAVE_POPEN)
1843 PETSC_EXTERN PetscErrorCode PetscPOpen(MPI_Comm,const char[],const char[],const char[],FILE **);
1844 PETSC_EXTERN PetscErrorCode PetscPClose(MPI_Comm,FILE*);
1845 PETSC_EXTERN PetscErrorCode PetscPOpenSetMachine(const char[]);
1846 #endif
1847 
1848 PETSC_EXTERN PetscErrorCode PetscSynchronizedPrintf(MPI_Comm,const char[],...);
1849 PETSC_EXTERN PetscErrorCode PetscSynchronizedFPrintf(MPI_Comm,FILE*,const char[],...);
1850 PETSC_EXTERN PetscErrorCode PetscSynchronizedFlush(MPI_Comm,FILE*);
1851 PETSC_EXTERN PetscErrorCode PetscSynchronizedFGets(MPI_Comm,FILE*,size_t,char[]);
1852 PETSC_EXTERN PetscErrorCode PetscStartMatlab(MPI_Comm,const char[],const char[],FILE**);
1853 PETSC_EXTERN PetscErrorCode PetscStartJava(MPI_Comm,const char[],const char[],FILE**);
1854 PETSC_EXTERN PetscErrorCode PetscGetPetscDir(const char*[]);
1855 
1856 /*S
1857      PetscContainer - Simple PETSc object that contains a pointer to any required data
1858 
1859    Level: advanced
1860 
1861 .seealso:  PetscObject, PetscContainerCreate()
1862 S*/
1863 PETSC_EXTERN PetscClassId PETSC_CONTAINER_CLASSID;
1864 typedef struct _p_PetscContainer*  PetscContainer;
1865 PETSC_EXTERN PetscErrorCode PetscContainerGetPointer(PetscContainer,void **);
1866 PETSC_EXTERN PetscErrorCode PetscContainerSetPointer(PetscContainer,void *);
1867 PETSC_EXTERN PetscErrorCode PetscContainerDestroy(PetscContainer*);
1868 PETSC_EXTERN PetscErrorCode PetscContainerCreate(MPI_Comm,PetscContainer *);
1869 PETSC_EXTERN PetscErrorCode PetscContainerSetUserDestroy(PetscContainer, PetscErrorCode (*)(void*));
1870 PETSC_EXTERN PetscErrorCode PetscContainerUserDestroyDefault(void*);
1871 
1872 /*
1873    For use in debuggers
1874 */
1875 PETSC_EXTERN PetscMPIInt PetscGlobalRank;
1876 PETSC_EXTERN PetscMPIInt PetscGlobalSize;
1877 PETSC_EXTERN PetscErrorCode PetscIntView(PetscInt,const PetscInt[],PetscViewer);
1878 PETSC_EXTERN PetscErrorCode PetscRealView(PetscInt,const PetscReal[],PetscViewer);
1879 PETSC_EXTERN PetscErrorCode PetscScalarView(PetscInt,const PetscScalar[],PetscViewer);
1880 
1881 #include <stddef.h>
1882 #include <string.h>             /* for memcpy, memset */
1883 #if defined(PETSC_HAVE_STDLIB_H)
1884 #include <stdlib.h>
1885 #endif
1886 
1887 #if defined(PETSC_HAVE_XMMINTRIN_H) && !defined(__CUDACC__)
1888 #include <xmmintrin.h>
1889 #endif
1890 
1891 /*@C
1892    PetscMemcpy - Copies n bytes, beginning at location b, to the space
1893    beginning at location a. The two memory regions CANNOT overlap, use
1894    PetscMemmove() in that case.
1895 
1896    Not Collective
1897 
1898    Input Parameters:
1899 +  b - pointer to initial memory space
1900 -  n - length (in bytes) of space to copy
1901 
1902    Output Parameter:
1903 .  a - pointer to copy space
1904 
1905    Level: intermediate
1906 
1907    Compile Option:
1908     PETSC_PREFER_DCOPY_FOR_MEMCPY will cause the BLAS dcopy() routine to be used
1909                                   for memory copies on double precision values.
1910     PETSC_PREFER_COPY_FOR_MEMCPY will cause C code to be used
1911                                   for memory copies on double precision values.
1912     PETSC_PREFER_FORTRAN_FORMEMCPY will cause Fortran code to be used
1913                                   for memory copies on double precision values.
1914 
1915    Note:
1916    This routine is analogous to memcpy().
1917 
1918    Not available from Fortran
1919 
1920    Developer Note: this is inlined for fastest performance
1921 
1922   Concepts: memory^copying
1923   Concepts: copying^memory
1924 
1925 .seealso: PetscMemmove(), PetscStrallocpy()
1926 
1927 @*/
1928 PETSC_STATIC_INLINE PetscErrorCode PetscMemcpy(void *a,const void *b,size_t n)
1929 {
1930 #if defined(PETSC_USE_DEBUG)
1931   size_t al = (size_t) a,bl = (size_t) b;
1932   size_t nl = (size_t) n;
1933   PetscFunctionBegin;
1934   if (n > 0 && !b) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy from a null pointer");
1935   if (n > 0 && !a) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy to a null pointer");
1936 #else
1937   PetscFunctionBegin;
1938 #endif
1939   if (a != b && n > 0) {
1940 #if defined(PETSC_USE_DEBUG)
1941     if ((al > bl && (al - bl) < nl) || (bl - al) < nl)  SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"Memory regions overlap: either use PetscMemmov()\n\
1942               or make sure your copy regions and lengths are correct. \n\
1943               Length (bytes) %ld first address %ld second address %ld",nl,al,bl);
1944 #endif
1945 #if (defined(PETSC_PREFER_DCOPY_FOR_MEMCPY) || defined(PETSC_PREFER_COPY_FOR_MEMCPY) || defined(PETSC_PREFER_FORTRAN_FORMEMCPY))
1946    if (!(a % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) {
1947       size_t len = n/sizeof(PetscScalar);
1948 #if defined(PETSC_PREFER_DCOPY_FOR_MEMCPY)
1949       PetscBLASInt   one = 1,blen;
1950       PetscErrorCode ierr;
1951       ierr = PetscBLASIntCast(len,&blen);CHKERRQ(ierr);
1952       PetscStackCallBLAS("BLAScopy",BLAScopy_(&blen,(PetscScalar *)b,&one,(PetscScalar *)a,&one));
1953 #elif defined(PETSC_PREFER_FORTRAN_FORMEMCPY)
1954       fortrancopy_(&len,(PetscScalar*)b,(PetscScalar*)a);
1955 #else
1956       size_t      i;
1957       PetscScalar *x = (PetscScalar*)b, *y = (PetscScalar*)a;
1958       for (i=0; i<len; i++) y[i] = x[i];
1959 #endif
1960     } else {
1961       memcpy((char*)(a),(char*)(b),n);
1962     }
1963 #else
1964     memcpy((char*)(a),(char*)(b),n);
1965 #endif
1966   }
1967   PetscFunctionReturn(0);
1968 }
1969 
1970 /*@C
1971    PetscMemzero - Zeros the specified memory.
1972 
1973    Not Collective
1974 
1975    Input Parameters:
1976 +  a - pointer to beginning memory location
1977 -  n - length (in bytes) of memory to initialize
1978 
1979    Level: intermediate
1980 
1981    Compile Option:
1982    PETSC_PREFER_BZERO - on certain machines (the IBM RS6000) the bzero() routine happens
1983   to be faster than the memset() routine. This flag causes the bzero() routine to be used.
1984 
1985    Not available from Fortran
1986 
1987    Developer Note: this is inlined for fastest performance
1988 
1989    Concepts: memory^zeroing
1990    Concepts: zeroing^memory
1991 
1992 .seealso: PetscMemcpy()
1993 @*/
1994 PETSC_STATIC_INLINE PetscErrorCode  PetscMemzero(void *a,size_t n)
1995 {
1996   if (n > 0) {
1997 #if defined(PETSC_USE_DEBUG)
1998     if (!a) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to zero at a null pointer");
1999 #endif
2000 #if defined(PETSC_PREFER_ZERO_FOR_MEMZERO)
2001     if (!(((long) a) % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) {
2002       size_t      i,len = n/sizeof(PetscScalar);
2003       PetscScalar *x = (PetscScalar*)a;
2004       for (i=0; i<len; i++) x[i] = 0.0;
2005     } else {
2006 #elif defined(PETSC_PREFER_FORTRAN_FOR_MEMZERO)
2007     if (!(((long) a) % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) {
2008       PetscInt len = n/sizeof(PetscScalar);
2009       fortranzero_(&len,(PetscScalar*)a);
2010     } else {
2011 #endif
2012 #if defined(PETSC_PREFER_BZERO)
2013       bzero((char *)a,n);
2014 #else
2015       memset((char*)a,0,n);
2016 #endif
2017 #if defined(PETSC_PREFER_ZERO_FOR_MEMZERO) || defined(PETSC_PREFER_FORTRAN_FOR_MEMZERO)
2018     }
2019 #endif
2020   }
2021   return 0;
2022 }
2023 
2024 /*MC
2025    PetscPrefetchBlock - Prefetches a block of memory
2026 
2027    Synopsis:
2028     #include <petscsys.h>
2029     void PetscPrefetchBlock(const anytype *a,size_t n,int rw,int t)
2030 
2031    Not Collective
2032 
2033    Input Parameters:
2034 +  a - pointer to first element to fetch (any type but usually PetscInt or PetscScalar)
2035 .  n - number of elements to fetch
2036 .  rw - 1 if the memory will be written to, otherwise 0 (ignored by many processors)
2037 -  t - temporal locality (PETSC_PREFETCH_HINT_{NTA,T0,T1,T2}), see note
2038 
2039    Level: developer
2040 
2041    Notes:
2042    The last two arguments (rw and t) must be compile-time constants.
2043 
2044    Adopting Intel's x86/x86-64 conventions, there are four levels of temporal locality.  Not all architectures offer
2045    equivalent locality hints, but the following macros are always defined to their closest analogue.
2046 +  PETSC_PREFETCH_HINT_NTA - Non-temporal.  Prefetches directly to L1, evicts to memory (skips higher level cache unless it was already there when prefetched).
2047 .  PETSC_PREFETCH_HINT_T0 - Fetch to all levels of cache and evict to the closest level.  Use this when the memory will be reused regularly despite necessary eviction from L1.
2048 .  PETSC_PREFETCH_HINT_T1 - Fetch to level 2 and higher (not L1).
2049 -  PETSC_PREFETCH_HINT_T2 - Fetch to high-level cache only.  (On many systems, T0 and T1 are equivalent.)
2050 
2051    This function does nothing on architectures that do not support prefetch and never errors (even if passed an invalid
2052    address).
2053 
2054    Concepts: memory
2055 M*/
2056 #define PetscPrefetchBlock(a,n,rw,t) do {                               \
2057     const char *_p = (const char*)(a),*_end = (const char*)((a)+(n));   \
2058     for ( ; _p < _end; _p += PETSC_LEVEL1_DCACHE_LINESIZE) PETSC_Prefetch(_p,(rw),(t)); \
2059   } while (0)
2060 
2061 /*
2062       Determine if some of the kernel computation routines use
2063    Fortran (rather than C) for the numerical calculations. On some machines
2064    and compilers (like complex numbers) the Fortran version of the routines
2065    is faster than the C/C++ versions. The flag --with-fortran-kernels
2066    should be used with ./configure to turn these on.
2067 */
2068 #if defined(PETSC_USE_FORTRAN_KERNELS)
2069 
2070 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTCRL)
2071 #define PETSC_USE_FORTRAN_KERNEL_MULTCRL
2072 #endif
2073 
2074 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTAIJPERM)
2075 #define PETSC_USE_FORTRAN_KERNEL_MULTAIJPERM
2076 #endif
2077 
2078 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTAIJ)
2079 #define PETSC_USE_FORTRAN_KERNEL_MULTAIJ
2080 #endif
2081 
2082 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ)
2083 #define PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ
2084 #endif
2085 
2086 #if !defined(PETSC_USE_FORTRAN_KERNEL_NORM)
2087 #define PETSC_USE_FORTRAN_KERNEL_NORM
2088 #endif
2089 
2090 #if !defined(PETSC_USE_FORTRAN_KERNEL_MAXPY)
2091 #define PETSC_USE_FORTRAN_KERNEL_MAXPY
2092 #endif
2093 
2094 #if !defined(PETSC_USE_FORTRAN_KERNEL_SOLVEAIJ)
2095 #define PETSC_USE_FORTRAN_KERNEL_SOLVEAIJ
2096 #endif
2097 
2098 #if !defined(PETSC_USE_FORTRAN_KERNEL_RELAXAIJ)
2099 #define PETSC_USE_FORTRAN_KERNEL_RELAXAIJ
2100 #endif
2101 
2102 #if !defined(PETSC_USE_FORTRAN_KERNEL_SOLVEBAIJ)
2103 #define PETSC_USE_FORTRAN_KERNEL_SOLVEBAIJ
2104 #endif
2105 
2106 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ)
2107 #define PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ
2108 #endif
2109 
2110 #if !defined(PETSC_USE_FORTRAN_KERNEL_MDOT)
2111 #define PETSC_USE_FORTRAN_KERNEL_MDOT
2112 #endif
2113 
2114 #if !defined(PETSC_USE_FORTRAN_KERNEL_XTIMESY)
2115 #define PETSC_USE_FORTRAN_KERNEL_XTIMESY
2116 #endif
2117 
2118 #if !defined(PETSC_USE_FORTRAN_KERNEL_AYPX)
2119 #define PETSC_USE_FORTRAN_KERNEL_AYPX
2120 #endif
2121 
2122 #if !defined(PETSC_USE_FORTRAN_KERNEL_WAXPY)
2123 #define PETSC_USE_FORTRAN_KERNEL_WAXPY
2124 #endif
2125 
2126 #endif
2127 
2128 /*
2129     Macros for indicating code that should be compiled with a C interface,
2130    rather than a C++ interface. Any routines that are dynamically loaded
2131    (such as the PCCreate_XXX() routines) must be wrapped so that the name
2132    mangler does not change the functions symbol name. This just hides the
2133    ugly extern "C" {} wrappers.
2134 */
2135 #if defined(__cplusplus)
2136 #define EXTERN_C_BEGIN extern "C" {
2137 #define EXTERN_C_END }
2138 #else
2139 #define EXTERN_C_BEGIN
2140 #define EXTERN_C_END
2141 #endif
2142 
2143 /* --------------------------------------------------------------------*/
2144 
2145 /*MC
2146     MPI_Comm - the basic object used by MPI to determine which processes are involved in a
2147         communication
2148 
2149    Level: beginner
2150 
2151    Note: This manual page is a place-holder because MPICH does not have a manual page for MPI_Comm
2152 
2153 .seealso: PETSC_COMM_WORLD, PETSC_COMM_SELF
2154 M*/
2155 
2156 /*MC
2157    PetscScalar - PETSc type that represents either a double precision real number, a double precision
2158        complex number, a single precision real number, a __float128 real or complex or a __fp16 real - if the code is configured
2159        with --with-scalar-type=real,complex --with-precision=single,double,__float128,__fp16
2160 
2161    Notes:
2162    For MPI calls that require datatypes, use MPIU_SCALAR as the datatype for PetscScalar and MPIU_SUM, MPIU_MAX etc for operations. They will automatically work correctly regardless of the size of PetscScalar.
2163 
2164    Level: beginner
2165 
2166 .seealso: PetscReal, PetscComplex, PetscInt, MPIU_REAL, MPIU_SCALAR, MPIU_COMPLEX, MPIU_INT, PetscRealPart(), PetscImaginaryPart()
2167 M*/
2168 
2169 /*MC
2170    PetscComplex - PETSc type that represents a complex number with precision matching that of PetscReal.
2171 
2172    Synopsis:
2173    #include <petscsys.h>
2174    PetscComplex number = 1. + 2.*PETSC_i;
2175 
2176    Notes:
2177    For MPI calls that require datatypes, use MPIU_COMPLEX as the datatype for PetscComplex and MPIU_SUM etc for operations.
2178           They will automatically work correctly regardless of the size of PetscComplex.
2179 
2180           See PetscScalar for details on how to ./configure the size of PetscReal
2181 
2182           Complex numbers are automatically available if PETSc was able to find a working complex implementation
2183 
2184    Level: beginner
2185 
2186 .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_REAL, MPIU_SCALAR, MPIU_COMPLEX, MPIU_INT, PETSC_i
2187 M*/
2188 
2189 /*MC
2190    PetscReal - PETSc type that represents a real number version of PetscScalar
2191 
2192 
2193    Notes:
2194    For MPI calls that require datatypes, use MPIU_REAL as the datatype for PetscScalar and MPIU_SUM, MPIU_MAX, etc. for operations.
2195           They will automatically work correctly regardless of the size of PetscReal.
2196 
2197           See PetscScalar for details on how to ./configure the size of PetscReal.
2198 
2199    Level: beginner
2200 
2201 .seealso: PetscScalar, PetscComplex, PetscInt, MPIU_REAL, MPIU_SCALAR, MPIU_COMPLEX, MPIU_INT
2202 M*/
2203 
2204 /*MC
2205    MPIU_SCALAR - MPI datatype corresponding to PetscScalar
2206 
2207    Notes:
2208    In MPI calls that require an MPI datatype that matches a PetscScalar or array of PetscScalar values, pass this value.
2209 
2210    Level: beginner
2211 
2212 .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_REAL, MPIU_COMPLEX, MPIU_INT
2213 M*/
2214 
2215 /*MC
2216    MPIU_COMPLEX - MPI datatype corresponding to PetscComplex
2217 
2218    Notes:
2219    In MPI calls that require an MPI datatype that matches a PetscComplex or array of PetscComplex values, pass this value.
2220 
2221    Level: beginner
2222 
2223 .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_REAL, MPIU_SCALAR, MPIU_COMPLEX, MPIU_INT, PETSC_i
2224 M*/
2225 
2226 /*MC
2227    MPIU_REAL - MPI datatype corresponding to PetscReal
2228 
2229    Notes:
2230    In MPI calls that require an MPI datatype that matches a PetscReal or array of PetscReal values, pass this value.
2231 
2232    Level: beginner
2233 
2234 .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_SCALAR, MPIU_COMPLEX, MPIU_INT
2235 M*/
2236 
2237 #if defined(PETSC_HAVE_MPIIO)
2238 #if !defined(PETSC_WORDS_BIGENDIAN)
2239 PETSC_EXTERN PetscErrorCode MPIU_File_write_all(MPI_File,void*,PetscMPIInt,MPI_Datatype,MPI_Status*);
2240 PETSC_EXTERN PetscErrorCode MPIU_File_read_all(MPI_File,void*,PetscMPIInt,MPI_Datatype,MPI_Status*);
2241 #else
2242 #define MPIU_File_write_all(a,b,c,d,e) MPI_File_write_all(a,b,c,d,e)
2243 #define MPIU_File_read_all(a,b,c,d,e) MPI_File_read_all(a,b,c,d,e)
2244 #endif
2245 #endif
2246 
2247 /* the following petsc_static_inline require petscerror.h */
2248 
2249 /* Limit MPI to 32-bits */
2250 #define PETSC_MPI_INT_MAX  2147483647
2251 #define PETSC_MPI_INT_MIN -2147483647
2252 /* Limit BLAS to 32-bits */
2253 #define PETSC_BLAS_INT_MAX  2147483647
2254 #define PETSC_BLAS_INT_MIN -2147483647
2255 
2256 /*@C
2257     PetscBLASIntCast - casts a PetscInt (which may be 64 bits in size) to a PetscBLASInt (which may be 32 bits in size), generates an
2258          error if the PetscBLASInt is not large enough to hold the number.
2259 
2260    Not Collective
2261 
2262    Input Parameter:
2263 .     a - the PetscInt value
2264 
2265    Output Parameter:
2266 .     b - the resulting PetscBLASInt value
2267 
2268    Level: advanced
2269 
2270    Not available from Fortran
2271 
2272 .seealso: PetscBLASInt, PetscMPIInt, PetscInt, PetscMPIIntCast()
2273 @*/
2274 PETSC_STATIC_INLINE PetscErrorCode PetscBLASIntCast(PetscInt a,PetscBLASInt *b)
2275 {
2276   PetscFunctionBegin;
2277   *b =  (PetscBLASInt)(a);
2278 #if defined(PETSC_USE_64BIT_INDICES) && !defined(PETSC_HAVE_64BIT_BLAS_INDICES)
2279   if ((a) > PETSC_BLAS_INT_MAX) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Array too long for BLAS/LAPACK");
2280 #endif
2281   PetscFunctionReturn(0);
2282 }
2283 
2284 /*@C
2285     PetscMPIIntCast - casts a PetscInt (which may be 64 bits in size) to a PetscMPIInt (which may be 32 bits in size), generates an
2286          error if the PetscMPIInt is not large enough to hold the number.
2287 
2288    Not Collective
2289 
2290    Input Parameter:
2291 .     a - the PetscInt value
2292 
2293    Output Parameter:
2294 .     b - the resulting PetscMPIInt value
2295 
2296    Level: advanced
2297 
2298    Not available from Fortran
2299 
2300 .seealso: PetscBLASInt, PetscMPIInt, PetscInt, PetscBLASIntCast()
2301 @*/
2302 PETSC_STATIC_INLINE PetscErrorCode PetscMPIIntCast(PetscInt a,PetscMPIInt *b)
2303 {
2304   PetscFunctionBegin;
2305   *b =  (PetscMPIInt)(a);
2306 #if defined(PETSC_USE_64BIT_INDICES)
2307   if ((a) > PETSC_MPI_INT_MAX) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Array too long for MPI");
2308 #endif
2309   PetscFunctionReturn(0);
2310 }
2311 
2312 #define PetscInt64Mult(a,b)   ((PetscInt64)(a))*((PetscInt64)(b))
2313 
2314 /*@C
2315 
2316    PetscRealIntMultTruncate - Computes the product of a positive PetscReal and a positive PetscInt and truncates the value to slightly less than the maximal possible value
2317 
2318    Not Collective
2319 
2320    Input Parameter:
2321 +     a - the PetscReal value
2322 -     b - the second value
2323 
2324    Returns:
2325       the result as a PetscInt value
2326 
2327    Use PetscInt64Mult() to compute the product of two PetscInt as a PetscInt64
2328    Use PetscIntMultTruncate() to compute the product of two positive PetscInt and truncate to fit a PetscInt
2329    Use PetscIntMultError() to compute the product of two PetscInt if you wish to generate an error if the result will not fit in a PetscInt
2330 
2331    Developers Note:
2332    We currently assume that PetscInt addition can never overflow, this is obviously wrong but requires many more checks.
2333 
2334    This is used where we compute approximate sizes for workspace and need to insure the workspace is index-able.
2335 
2336    Not available from Fortran
2337 
2338    Level: advanced
2339 
2340 .seealso: PetscBLASInt, PetscMPIInt, PetscInt, PetscBLASIntCast(), PetscInt64Mult()
2341 @*/
2342 PETSC_STATIC_INLINE PetscInt PetscRealIntMultTruncate(PetscReal a,PetscInt b)
2343 {
2344   PetscInt64 r;
2345 
2346   r  =  (PetscInt64) (a*(PetscReal)b);
2347   if (r > PETSC_MAX_INT - 100) r = PETSC_MAX_INT - 100;
2348   return (PetscInt) r;
2349 }
2350 
2351 /*@C
2352 
2353    PetscIntMultTruncate - Computes the product of two positive PetscInt and truncates the value to slightly less than the maximal possible value
2354 
2355    Not Collective
2356 
2357    Input Parameter:
2358 +     a - the PetscInt value
2359 -     b - the second value
2360 
2361    Returns:
2362       the result as a PetscInt value
2363 
2364    Use PetscInt64Mult() to compute the product of two PetscInt as a PetscInt64
2365    Use PetscRealIntMultTruncate() to compute the product of a PetscReal and a PetscInt and truncate to fit a PetscInt
2366    Use PetscIntMultError() to compute the product of two PetscInt if you wish to generate an error if the result will not fit in a PetscInt
2367 
2368    Not available from Fortran
2369 
2370    Developers Note: We currently assume that PetscInt addition can never overflow, this is obviously wrong but requires many more checks.
2371 
2372    This is used where we compute approximate sizes for workspace and need to insure the workspace is index-able.
2373 
2374    Level: advanced
2375 
2376 .seealso: PetscBLASInt, PetscMPIInt, PetscInt, PetscBLASIntCast(), PetscInt64Mult()
2377 @*/
2378 PETSC_STATIC_INLINE PetscInt PetscIntMultTruncate(PetscInt a,PetscInt b)
2379 {
2380   PetscInt64 r;
2381 
2382   r  =  PetscInt64Mult(a,b);
2383   if (r > PETSC_MAX_INT - 100) r = PETSC_MAX_INT - 100;
2384   return (PetscInt) r;
2385 }
2386 
2387 /*@C
2388 
2389    PetscIntSumTruncate - Computes the sum of two positive PetscInt and truncates the value to slightly less than the maximal possible value
2390 
2391    Not Collective
2392 
2393    Input Parameter:
2394 +     a - the PetscInt value
2395 -     b - the second value
2396 
2397    Returns:
2398      the result as a PetscInt value
2399 
2400    Use PetscInt64Mult() to compute the product of two PetscInt as a PetscInt64
2401    Use PetscRealIntMultTruncate() to compute the product of a PetscReal and a PetscInt and truncate to fit a PetscInt
2402    Use PetscIntMultError() to compute the product of two PetscInt if you wish to generate an error if the result will not fit in a PetscInt
2403 
2404    This is used where we compute approximate sizes for workspace and need to insure the workspace is index-able.
2405 
2406    Not available from Fortran
2407 
2408    Level: advanced
2409 
2410 .seealso: PetscBLASInt, PetscMPIInt, PetscInt, PetscBLASIntCast(), PetscInt64Mult()
2411 @*/
2412 PETSC_STATIC_INLINE PetscInt PetscIntSumTruncate(PetscInt a,PetscInt b)
2413 {
2414   PetscInt64 r;
2415 
2416   r  =  ((PetscInt64)a) + ((PetscInt64)b);
2417   if (r > PETSC_MAX_INT - 100) r = PETSC_MAX_INT - 100;
2418   return (PetscInt) r;
2419 }
2420 
2421 /*@C
2422 
2423    PetscIntMultError - Computes the product of two positive PetscInt and generates an error with overflow.
2424 
2425    Not Collective
2426 
2427    Input Parameter:
2428 +     a - the PetscInt value
2429 -     b - the second value
2430 
2431    Output Parameter:ma
2432 .     result - the result as a PetscInt value, or NULL if you do not want the result, you just want to check if it overflows
2433 
2434    Use PetscInt64Mult() to compute the product of two 32 bit PetscInt and store in a PetscInt64
2435    Use PetscIntMultTruncate() to compute the product of two PetscInt and truncate it to fit in a PetscInt
2436 
2437    Not available from Fortran
2438 
2439    Developers Note: We currently assume that PetscInt addition does not overflow, this is obviously wrong but requires many more checks.
2440 
2441    Level: advanced
2442 
2443 .seealso: PetscBLASInt, PetscMPIInt, PetscInt, PetscBLASIntCast(), PetscIntMult64(), PetscIntSumError()
2444 @*/
2445 PETSC_STATIC_INLINE PetscErrorCode PetscIntMultError(PetscInt a,PetscInt b,PetscInt *result)
2446 {
2447   PetscInt64 r;
2448 
2449   PetscFunctionBegin;
2450   r  =  PetscInt64Mult(a,b);
2451 #if !defined(PETSC_USE_64BIT_INDICES)
2452   if (r > PETSC_MAX_INT) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_SUP,"Product of two integer %d %d overflow, you must ./configure PETSc with --with-64-bit-indices for the case you are running",a,b);
2453 #endif
2454   if (result) *result = (PetscInt) r;
2455   PetscFunctionReturn(0);
2456 }
2457 
2458 /*@C
2459 
2460    PetscIntSumError - Computes the sum of two positive PetscInt and generates an error with overflow.
2461 
2462    Not Collective
2463 
2464    Input Parameter:
2465 +     a - the PetscInt value
2466 -     b - the second value
2467 
2468    Output Parameter:ma
2469 .     c - the result as a PetscInt value,  or NULL if you do not want the result, you just want to check if it overflows
2470 
2471    Use PetscInt64Mult() to compute the product of two 32 bit PetscInt and store in a PetscInt64
2472    Use PetscIntMultTruncate() to compute the product of two PetscInt and truncate it to fit in a PetscInt
2473 
2474    Not available from Fortran
2475 
2476    Level: advanced
2477 
2478 .seealso: PetscBLASInt, PetscMPIInt, PetscInt, PetscBLASIntCast(), PetscInt64Mult()
2479 @*/
2480 PETSC_STATIC_INLINE PetscErrorCode PetscIntSumError(PetscInt a,PetscInt b,PetscInt *result)
2481 {
2482   PetscInt64 r;
2483 
2484   PetscFunctionBegin;
2485   r  =  ((PetscInt64)a) + ((PetscInt64)b);
2486 #if !defined(PETSC_USE_64BIT_INDICES)
2487   if (r > PETSC_MAX_INT) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_SUP,"Sum of two integer %d %d overflow, you must ./configure PETSc with --with-64-bit-indices for the case you are running",a,b);
2488 #endif
2489   if (result) *result = (PetscInt) r;
2490   PetscFunctionReturn(0);
2491 }
2492 
2493 /*
2494      The IBM include files define hz, here we hide it so that it may be used as a regular user variable.
2495 */
2496 #if defined(hz)
2497 #undef hz
2498 #endif
2499 
2500 /*  For arrays that contain filenames or paths */
2501 
2502 
2503 #if defined(PETSC_HAVE_LIMITS_H)
2504 #include <limits.h>
2505 #endif
2506 #if defined(PETSC_HAVE_SYS_PARAM_H)
2507 #include <sys/param.h>
2508 #endif
2509 #if defined(PETSC_HAVE_SYS_TYPES_H)
2510 #include <sys/types.h>
2511 #endif
2512 #if defined(MAXPATHLEN)
2513 #  define PETSC_MAX_PATH_LEN     MAXPATHLEN
2514 #elif defined(MAX_PATH)
2515 #  define PETSC_MAX_PATH_LEN     MAX_PATH
2516 #elif defined(_MAX_PATH)
2517 #  define PETSC_MAX_PATH_LEN     _MAX_PATH
2518 #else
2519 #  define PETSC_MAX_PATH_LEN     4096
2520 #endif
2521 
2522 /*MC
2523 
2524     PETSC_VERSION - This manual page provides information about how PETSc documents and uses its version information. This information is available to both C/C++
2525                     and Fortran compilers when petscsys.h is included.
2526 
2527 
2528     The current PETSc version and the API for accessing it are defined in petscversion.h
2529 
2530     The complete version number is given as the triple  PETSC_VERSION_MAJOR.PETSC_VERSION_MINOR.PETSC_VERSION_SUBMINOR (in short hand x.y.z)
2531 
2532     A change in the minor version number (y) indicates possible/likely changes in the PETSc API. Note this is different than with the semantic versioning convention
2533     where only a change in the major version number (x) indicates a change in the API.
2534 
2535     A subminor greater than zero indicates a patch release. Version x.y.z maintains source and binary compatibility with version x.y.w for all z and w
2536 
2537     Use the macros PETSC_VERSION_EQ(x,y,z), PETSC_VERSION_LT(x,y,z), PETSC_VERSION_LE(x,y,z), PETSC_VERSION_GT(x,y,z),
2538     PETSC_VERSION_GE(x,y,z) to determine if the current version is equal to, less than, less than or equal to, greater than or greater than or equal to a given
2539     version number (x.y.z).
2540 
2541     PETSC_RELEASE_DATE is the date the x.y version was released (i.e. the version before any patch releases)
2542 
2543     PETSC_VERSION_DATE is the date the x.y.z version was released
2544 
2545     PETSC_VERSION_GIT is the last git commit to the repository given in the form vx.y.z-wwwww
2546 
2547     PETSC_VERSION_DATE_GIT is the date of the last git commit to the repository
2548 
2549     Level: intermediate
2550 
2551     PETSC_VERSION_() and PETSC_VERSION_PATCH are deprecated and will eventually be removed. For several releases PETSC_VERSION_PATCH is always 0
2552 
2553 M*/
2554 
2555 /*MC
2556 
2557     UsingFortran - To use PETSc with Fortran you must use both PETSc include files and modules. At the beginning
2558       of every function and module definition you need something like
2559 
2560 $
2561 $#include "petsc/finclude/petscXXX.h"
2562 $         use petscXXX
2563 
2564      You can declare PETSc variables using either of the following.
2565 
2566 $    XXX variablename
2567 $    type(tXXX) variablename
2568 
2569     For example,
2570 
2571 $#include "petsc/finclude/petscvec.h"
2572 $         use petscvec
2573 $
2574 $    Vec b
2575 $    type(tVec) x
2576 
2577     Level: beginner
2578 
2579 M*/
2580 
2581 PETSC_EXTERN PetscErrorCode PetscGetArchType(char[],size_t);
2582 PETSC_EXTERN PetscErrorCode PetscGetHostName(char[],size_t);
2583 PETSC_EXTERN PetscErrorCode PetscGetUserName(char[],size_t);
2584 PETSC_EXTERN PetscErrorCode PetscGetProgramName(char[],size_t);
2585 PETSC_EXTERN PetscErrorCode PetscSetProgramName(const char[]);
2586 PETSC_EXTERN PetscErrorCode PetscGetDate(char[],size_t);
2587 PETSC_EXTERN PetscErrorCode PetscGetVersion(char[], size_t);
2588 PETSC_EXTERN PetscErrorCode PetscGetVersionNumber(PetscInt*,PetscInt*,PetscInt*,PetscInt*);
2589 
2590 PETSC_EXTERN PetscErrorCode PetscSortInt(PetscInt,PetscInt[]);
2591 PETSC_EXTERN PetscErrorCode PetscSortedRemoveDupsInt(PetscInt*,PetscInt[]);
2592 PETSC_EXTERN PetscErrorCode PetscSortRemoveDupsInt(PetscInt*,PetscInt[]);
2593 PETSC_EXTERN PetscErrorCode PetscFindInt(PetscInt, PetscInt, const PetscInt[], PetscInt*);
2594 PETSC_EXTERN PetscErrorCode PetscFindMPIInt(PetscMPIInt, PetscInt, const PetscMPIInt[], PetscInt*);
2595 PETSC_EXTERN PetscErrorCode PetscSortIntWithPermutation(PetscInt,const PetscInt[],PetscInt[]);
2596 PETSC_EXTERN PetscErrorCode PetscSortStrWithPermutation(PetscInt,const char*[],PetscInt[]);
2597 PETSC_EXTERN PetscErrorCode PetscSortIntWithArray(PetscInt,PetscInt[],PetscInt[]);
2598 PETSC_EXTERN PetscErrorCode PetscSortIntWithArrayPair(PetscInt,PetscInt[],PetscInt[],PetscInt[]);
2599 PETSC_EXTERN PetscErrorCode PetscSortMPIInt(PetscInt,PetscMPIInt[]);
2600 PETSC_EXTERN PetscErrorCode PetscSortRemoveDupsMPIInt(PetscInt*,PetscMPIInt[]);
2601 PETSC_EXTERN PetscErrorCode PetscSortMPIIntWithArray(PetscMPIInt,PetscMPIInt[],PetscMPIInt[]);
2602 PETSC_EXTERN PetscErrorCode PetscSortIntWithScalarArray(PetscInt,PetscInt[],PetscScalar[]);
2603 PETSC_EXTERN PetscErrorCode PetscSortIntWithDataArray(PetscInt,PetscInt[],void*,size_t,void*);
2604 PETSC_EXTERN PetscErrorCode PetscSortReal(PetscInt,PetscReal[]);
2605 PETSC_EXTERN PetscErrorCode PetscSortRealWithArrayInt(PetscInt,PetscReal[],PetscInt[]);
2606 PETSC_EXTERN PetscErrorCode PetscSortRealWithPermutation(PetscInt,const PetscReal[],PetscInt[]);
2607 PETSC_EXTERN PetscErrorCode PetscSortRemoveDupsReal(PetscInt*,PetscReal[]);
2608 PETSC_EXTERN PetscErrorCode PetscFindReal(PetscReal,PetscInt,const PetscReal[],PetscReal,PetscInt*);
2609 PETSC_EXTERN PetscErrorCode PetscSortSplit(PetscInt,PetscInt,PetscScalar[],PetscInt[]);
2610 PETSC_EXTERN PetscErrorCode PetscSortSplitReal(PetscInt,PetscInt,PetscReal[],PetscInt[]);
2611 PETSC_EXTERN PetscErrorCode PetscProcessTree(PetscInt,const PetscBool [],const PetscInt[],PetscInt*,PetscInt**,PetscInt**,PetscInt**,PetscInt**);
2612 PETSC_EXTERN PetscErrorCode PetscMergeIntArrayPair(PetscInt,const PetscInt[],const PetscInt[],PetscInt,const PetscInt[],const PetscInt[],PetscInt*,PetscInt**,PetscInt**);
2613 PETSC_EXTERN PetscErrorCode PetscMergeIntArray(PetscInt,const PetscInt[],PetscInt,const PetscInt[],PetscInt*,PetscInt**);
2614 PETSC_EXTERN PetscErrorCode PetscMergeMPIIntArray(PetscInt,const PetscMPIInt[],PetscInt,const PetscMPIInt[],PetscInt*,PetscMPIInt**);
2615 
2616 PETSC_EXTERN PetscErrorCode PetscSetDisplay(void);
2617 PETSC_EXTERN PetscErrorCode PetscGetDisplay(char[],size_t);
2618 
2619 /*J
2620     PetscRandomType - String with the name of a PETSc randomizer
2621 
2622    Level: beginner
2623 
2624    Notes:
2625    To use SPRNG or RANDOM123 you must have ./configure PETSc
2626    with the option --download-sprng or --download-random123
2627 
2628 .seealso: PetscRandomSetType(), PetscRandom, PetscRandomCreate()
2629 J*/
2630 typedef const char* PetscRandomType;
2631 #define PETSCRAND       "rand"
2632 #define PETSCRAND48     "rand48"
2633 #define PETSCSPRNG      "sprng"
2634 #define PETSCRANDER48   "rander48"
2635 #define PETSCRANDOM123  "random123"
2636 
2637 /* Logging support */
2638 PETSC_EXTERN PetscClassId PETSC_RANDOM_CLASSID;
2639 
2640 PETSC_EXTERN PetscErrorCode PetscRandomInitializePackage(void);
2641 
2642 /*S
2643      PetscRandom - Abstract PETSc object that manages generating random numbers
2644 
2645    Level: intermediate
2646 
2647   Concepts: random numbers
2648 
2649 .seealso:  PetscRandomCreate(), PetscRandomGetValue(), PetscRandomType
2650 S*/
2651 typedef struct _p_PetscRandom*   PetscRandom;
2652 
2653 /* Dynamic creation and loading functions */
2654 PETSC_EXTERN PetscFunctionList PetscRandomList;
2655 
2656 PETSC_EXTERN PetscErrorCode PetscRandomRegister(const char[],PetscErrorCode (*)(PetscRandom));
2657 PETSC_EXTERN PetscErrorCode PetscRandomSetType(PetscRandom, PetscRandomType);
2658 PETSC_EXTERN PetscErrorCode PetscRandomSetFromOptions(PetscRandom);
2659 PETSC_EXTERN PetscErrorCode PetscRandomGetType(PetscRandom, PetscRandomType*);
2660 PETSC_STATIC_INLINE PetscErrorCode PetscRandomViewFromOptions(PetscRandom A,PetscObject obj,const char name[]) {return PetscObjectViewFromOptions((PetscObject)A,obj,name);}
2661 PETSC_EXTERN PetscErrorCode PetscRandomView(PetscRandom,PetscViewer);
2662 
2663 PETSC_EXTERN PetscErrorCode PetscRandomCreate(MPI_Comm,PetscRandom*);
2664 PETSC_EXTERN PetscErrorCode PetscRandomGetValue(PetscRandom,PetscScalar*);
2665 PETSC_EXTERN PetscErrorCode PetscRandomGetValueReal(PetscRandom,PetscReal*);
2666 PETSC_EXTERN PetscErrorCode PetscRandomGetInterval(PetscRandom,PetscScalar*,PetscScalar*);
2667 PETSC_EXTERN PetscErrorCode PetscRandomSetInterval(PetscRandom,PetscScalar,PetscScalar);
2668 PETSC_EXTERN PetscErrorCode PetscRandomSetSeed(PetscRandom,unsigned long);
2669 PETSC_EXTERN PetscErrorCode PetscRandomGetSeed(PetscRandom,unsigned long *);
2670 PETSC_EXTERN PetscErrorCode PetscRandomSeed(PetscRandom);
2671 PETSC_EXTERN PetscErrorCode PetscRandomDestroy(PetscRandom*);
2672 
2673 PETSC_EXTERN PetscErrorCode PetscGetFullPath(const char[],char[],size_t);
2674 PETSC_EXTERN PetscErrorCode PetscGetRelativePath(const char[],char[],size_t);
2675 PETSC_EXTERN PetscErrorCode PetscGetWorkingDirectory(char[],size_t);
2676 PETSC_EXTERN PetscErrorCode PetscGetRealPath(const char[],char[]);
2677 PETSC_EXTERN PetscErrorCode PetscGetHomeDirectory(char[],size_t);
2678 PETSC_EXTERN PetscErrorCode PetscTestFile(const char[],char,PetscBool *);
2679 PETSC_EXTERN PetscErrorCode PetscTestDirectory(const char[],char,PetscBool *);
2680 PETSC_EXTERN PetscErrorCode PetscMkdir(const char[]);
2681 PETSC_EXTERN PetscErrorCode PetscRMTree(const char[]);
2682 
2683 PETSC_EXTERN PetscErrorCode PetscBinaryRead(int,void*,PetscInt,PetscDataType);
2684 PETSC_EXTERN PetscErrorCode PetscBinarySynchronizedRead(MPI_Comm,int,void*,PetscInt,PetscDataType);
2685 PETSC_EXTERN PetscErrorCode PetscBinarySynchronizedWrite(MPI_Comm,int,void*,PetscInt,PetscDataType,PetscBool );
2686 PETSC_EXTERN PetscErrorCode PetscBinaryWrite(int,void*,PetscInt,PetscDataType,PetscBool );
2687 PETSC_EXTERN PetscErrorCode PetscBinaryOpen(const char[],PetscFileMode,int *);
2688 PETSC_EXTERN PetscErrorCode PetscBinaryClose(int);
2689 PETSC_EXTERN PetscErrorCode PetscSharedTmp(MPI_Comm,PetscBool  *);
2690 PETSC_EXTERN PetscErrorCode PetscSharedWorkingDirectory(MPI_Comm,PetscBool  *);
2691 PETSC_EXTERN PetscErrorCode PetscGetTmp(MPI_Comm,char[],size_t);
2692 PETSC_EXTERN PetscErrorCode PetscFileRetrieve(MPI_Comm,const char[],char[],size_t,PetscBool *);
2693 PETSC_EXTERN PetscErrorCode PetscLs(MPI_Comm,const char[],char[],size_t,PetscBool *);
2694 #if defined(PETSC_USE_SOCKET_VIEWER)
2695 PETSC_EXTERN PetscErrorCode PetscOpenSocket(const char[],int,int*);
2696 #endif
2697 
2698 /*
2699    In binary files variables are stored using the following lengths,
2700   regardless of how they are stored in memory on any one particular
2701   machine. Use these rather then sizeof() in computing sizes for
2702   PetscBinarySeek().
2703 */
2704 #define PETSC_BINARY_INT_SIZE   (32/8)
2705 #define PETSC_BINARY_FLOAT_SIZE  (32/8)
2706 #define PETSC_BINARY_CHAR_SIZE  (8/8)
2707 #define PETSC_BINARY_SHORT_SIZE  (16/8)
2708 #define PETSC_BINARY_DOUBLE_SIZE  (64/8)
2709 #define PETSC_BINARY_SCALAR_SIZE  sizeof(PetscScalar)
2710 
2711 /*E
2712   PetscBinarySeekType - argument to PetscBinarySeek()
2713 
2714   Level: advanced
2715 
2716 .seealso: PetscBinarySeek(), PetscBinarySynchronizedSeek()
2717 E*/
2718 typedef enum {PETSC_BINARY_SEEK_SET = 0,PETSC_BINARY_SEEK_CUR = 1,PETSC_BINARY_SEEK_END = 2} PetscBinarySeekType;
2719 PETSC_EXTERN PetscErrorCode PetscBinarySeek(int,off_t,PetscBinarySeekType,off_t*);
2720 PETSC_EXTERN PetscErrorCode PetscBinarySynchronizedSeek(MPI_Comm,int,off_t,PetscBinarySeekType,off_t*);
2721 PETSC_EXTERN PetscErrorCode PetscByteSwap(void *,PetscDataType,PetscInt);
2722 
2723 PETSC_EXTERN PetscErrorCode PetscSetDebugTerminal(const char[]);
2724 PETSC_EXTERN PetscErrorCode PetscSetDebugger(const char[],PetscBool );
2725 PETSC_EXTERN PetscErrorCode PetscSetDefaultDebugger(void);
2726 PETSC_EXTERN PetscErrorCode PetscSetDebuggerFromString(const char*);
2727 PETSC_EXTERN PetscErrorCode PetscAttachDebugger(void);
2728 PETSC_EXTERN PetscErrorCode PetscStopForDebugger(void);
2729 
2730 PETSC_EXTERN PetscErrorCode PetscGatherNumberOfMessages(MPI_Comm,const PetscMPIInt[],const PetscMPIInt[],PetscMPIInt*);
2731 PETSC_EXTERN PetscErrorCode PetscGatherMessageLengths(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],PetscMPIInt**,PetscMPIInt**);
2732 PETSC_EXTERN PetscErrorCode PetscGatherMessageLengths2(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],const PetscMPIInt[],PetscMPIInt**,PetscMPIInt**,PetscMPIInt**);
2733 PETSC_EXTERN PetscErrorCode PetscPostIrecvInt(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],const PetscMPIInt[],PetscInt***,MPI_Request**);
2734 PETSC_EXTERN PetscErrorCode PetscPostIrecvScalar(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],const PetscMPIInt[],PetscScalar***,MPI_Request**);
2735 PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSided(MPI_Comm,PetscMPIInt,MPI_Datatype,PetscMPIInt,const PetscMPIInt*,const void*,PetscMPIInt*,PetscMPIInt**,void*)
2736   PetscAttrMPIPointerWithType(6,3);
2737 PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedF(MPI_Comm,PetscMPIInt,MPI_Datatype,PetscMPIInt,const PetscMPIInt[],const void*,PetscMPIInt*,PetscMPIInt**,void*,PetscMPIInt,
2738                                                     PetscErrorCode (*send)(MPI_Comm,const PetscMPIInt[],PetscMPIInt,PetscMPIInt,void*,MPI_Request[],void*),
2739                                                     PetscErrorCode (*recv)(MPI_Comm,const PetscMPIInt[],PetscMPIInt,void*,MPI_Request[],void*),void *ctx)
2740   PetscAttrMPIPointerWithType(6,3);
2741 PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedFReq(MPI_Comm,PetscMPIInt,MPI_Datatype,PetscMPIInt,const PetscMPIInt[],const void*,PetscMPIInt*,PetscMPIInt**,void*,PetscMPIInt,
2742                                                        MPI_Request**,MPI_Request**,
2743                                                        PetscErrorCode (*send)(MPI_Comm,const PetscMPIInt[],PetscMPIInt,PetscMPIInt,void*,MPI_Request[],void*),
2744                                                        PetscErrorCode (*recv)(MPI_Comm,const PetscMPIInt[],PetscMPIInt,void*,MPI_Request[],void*),void *ctx)
2745   PetscAttrMPIPointerWithType(6,3);
2746 
2747 /*E
2748     PetscBuildTwoSidedType - algorithm for setting up two-sided communication
2749 
2750 $  PETSC_BUILDTWOSIDED_ALLREDUCE - classical algorithm using an MPI_Allreduce with
2751 $      a buffer of length equal to the communicator size. Not memory-scalable due to
2752 $      the large reduction size. Requires only MPI-1.
2753 $  PETSC_BUILDTWOSIDED_IBARRIER - nonblocking algorithm based on MPI_Issend and MPI_Ibarrier.
2754 $      Proved communication-optimal in Hoefler, Siebert, and Lumsdaine (2010). Requires MPI-3.
2755 $  PETSC_BUILDTWOSIDED_REDSCATTER - similar to above, but use more optimized function
2756 $      that only communicates the part of the reduction that is necessary.  Requires MPI-2.
2757 
2758    Level: developer
2759 
2760 .seealso: PetscCommBuildTwoSided(), PetscCommBuildTwoSidedSetType(), PetscCommBuildTwoSidedGetType()
2761 E*/
2762 typedef enum {
2763   PETSC_BUILDTWOSIDED_NOTSET = -1,
2764   PETSC_BUILDTWOSIDED_ALLREDUCE = 0,
2765   PETSC_BUILDTWOSIDED_IBARRIER = 1,
2766   PETSC_BUILDTWOSIDED_REDSCATTER = 2
2767   /* Updates here must be accompanied by updates in finclude/petscsys.h and the string array in mpits.c */
2768 } PetscBuildTwoSidedType;
2769 PETSC_EXTERN const char *const PetscBuildTwoSidedTypes[];
2770 PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedSetType(MPI_Comm,PetscBuildTwoSidedType);
2771 PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedGetType(MPI_Comm,PetscBuildTwoSidedType*);
2772 
2773 PETSC_EXTERN PetscErrorCode PetscSSEIsEnabled(MPI_Comm,PetscBool  *,PetscBool  *);
2774 
2775 /*E
2776   InsertMode - Whether entries are inserted or added into vectors or matrices
2777 
2778   Level: beginner
2779 
2780 .seealso: VecSetValues(), MatSetValues(), VecSetValue(), VecSetValuesBlocked(),
2781           VecSetValuesLocal(), VecSetValuesBlockedLocal(), MatSetValuesBlocked(),
2782           MatSetValuesBlockedLocal(), MatSetValuesLocal(), VecScatterBegin(), VecScatterEnd()
2783 E*/
2784  typedef enum {NOT_SET_VALUES, INSERT_VALUES, ADD_VALUES, MAX_VALUES, INSERT_ALL_VALUES, ADD_ALL_VALUES, INSERT_BC_VALUES, ADD_BC_VALUES} InsertMode;
2785 
2786 /*MC
2787     INSERT_VALUES - Put a value into a vector or matrix, overwrites any previous value
2788 
2789     Level: beginner
2790 
2791 .seealso: InsertMode, VecSetValues(), MatSetValues(), VecSetValue(), VecSetValuesBlocked(),
2792           VecSetValuesLocal(), VecSetValuesBlockedLocal(), MatSetValuesBlocked(), ADD_VALUES,
2793           MatSetValuesBlockedLocal(), MatSetValuesLocal(), VecScatterBegin(), VecScatterEnd(), MAX_VALUES
2794 
2795 M*/
2796 
2797 /*MC
2798     ADD_VALUES - Adds a value into a vector or matrix, if there previously was no value, just puts the
2799                 value into that location
2800 
2801     Level: beginner
2802 
2803 .seealso: InsertMode, VecSetValues(), MatSetValues(), VecSetValue(), VecSetValuesBlocked(),
2804           VecSetValuesLocal(), VecSetValuesBlockedLocal(), MatSetValuesBlocked(), INSERT_VALUES,
2805           MatSetValuesBlockedLocal(), MatSetValuesLocal(), VecScatterBegin(), VecScatterEnd(), MAX_VALUES
2806 
2807 M*/
2808 
2809 /*MC
2810     MAX_VALUES - Puts the maximum of the scattered/gathered value and the current value into each location
2811 
2812     Level: beginner
2813 
2814 .seealso: InsertMode, VecScatterBegin(), VecScatterEnd(), ADD_VALUES, INSERT_VALUES
2815 
2816 M*/
2817 
2818 PETSC_EXTERN MPI_Comm PetscObjectComm(PetscObject);
2819 
2820 typedef enum {PETSC_SUBCOMM_GENERAL=0,PETSC_SUBCOMM_CONTIGUOUS=1,PETSC_SUBCOMM_INTERLACED=2} PetscSubcommType;
2821 PETSC_EXTERN const char *const PetscSubcommTypes[];
2822 
2823 /*S
2824    PetscSubcomm - A decomposition of an MPI communicator into subcommunicators
2825 
2826    Notes:
2827    After a call to PetscSubcommSetType(), PetscSubcommSetTypeGeneral(), or PetscSubcommSetFromOptions() one may call
2828 $     PetscSubcommChild() returns the associated subcommunicator on this process
2829 $     PetscSubcommContiguousParent() returns a parent communitor but with all child of the same subcommunicator having contiguous rank
2830 
2831    Sample Usage:
2832        PetscSubcommCreate()
2833        PetscSubcommSetNumber()
2834        PetscSubcommSetType(PETSC_SUBCOMM_INTERLACED);
2835        ccomm = PetscSubcommChild()
2836        PetscSubcommDestroy()
2837 
2838    Level: advanced
2839 
2840    Concepts: communicator, create
2841 
2842    Notes:
2843 $   PETSC_SUBCOMM_GENERAL - similar to MPI_Comm_split() each process sets the new communicator (color) they will belong to and the order within that communicator
2844 $   PETSC_SUBCOMM_CONTIGUOUS - each new communicator contains a set of process with contiguous ranks in the original MPI communicator
2845 $   PETSC_SUBCOMM_INTERLACED - each new communictor contains a set of processes equally far apart in rank from the others in that new communicator
2846 
2847    Example: Consider a communicator with six processes split into 3 subcommunicators.
2848 $     PETSC_SUBCOMM_CONTIGUOUS - the first communicator contains rank 0,1  the second rank 2,3 and the third rank 4,5 in the original ordering of the original communicator
2849 $     PETSC_SUBCOMM_INTERLACED - the first communicator contains rank 0,3, the second 1,4 and the third 2,5
2850 
2851    Developer Notes:
2852    This is used in objects such as PCREDUNDANT to manage the subcommunicators on which the redundant computations
2853       are performed.
2854 
2855 
2856 .seealso: PetscSubcommCreate(), PetscSubcommSetNumber(), PetscSubcommSetType(), PetscSubcommView(), PetscSubcommSetFromOptions()
2857 
2858 S*/
2859 typedef struct _n_PetscSubcomm* PetscSubcomm;
2860 
2861 struct _n_PetscSubcomm {
2862   MPI_Comm         parent;           /* parent communicator */
2863   MPI_Comm         dupparent;        /* duplicate parent communicator, under which the processors of this subcomm have contiguous rank */
2864   MPI_Comm         child;            /* the sub-communicator */
2865   PetscMPIInt      n;                /* num of subcommunicators under the parent communicator */
2866   PetscMPIInt      color;            /* color of processors belong to this communicator */
2867   PetscMPIInt      *subsize;         /* size of subcommunicator[color] */
2868   PetscSubcommType type;
2869   char             *subcommprefix;
2870 };
2871 
2872 PETSC_STATIC_INLINE MPI_Comm PetscSubcommParent(PetscSubcomm scomm) {return scomm->parent;}
2873 PETSC_STATIC_INLINE MPI_Comm PetscSubcommChild(PetscSubcomm scomm) {return scomm->child;}
2874 PETSC_STATIC_INLINE MPI_Comm PetscSubcommContiguousParent(PetscSubcomm scomm) {return scomm->dupparent;}
2875 PETSC_EXTERN PetscErrorCode PetscSubcommCreate(MPI_Comm,PetscSubcomm*);
2876 PETSC_EXTERN PetscErrorCode PetscSubcommDestroy(PetscSubcomm*);
2877 PETSC_EXTERN PetscErrorCode PetscSubcommSetNumber(PetscSubcomm,PetscInt);
2878 PETSC_EXTERN PetscErrorCode PetscSubcommSetType(PetscSubcomm,PetscSubcommType);
2879 PETSC_EXTERN PetscErrorCode PetscSubcommSetTypeGeneral(PetscSubcomm,PetscMPIInt,PetscMPIInt);
2880 PETSC_EXTERN PetscErrorCode PetscSubcommView(PetscSubcomm,PetscViewer);
2881 PETSC_EXTERN PetscErrorCode PetscSubcommSetFromOptions(PetscSubcomm);
2882 PETSC_EXTERN PetscErrorCode PetscSubcommSetOptionsPrefix(PetscSubcomm,const char[]);
2883 
2884 /*S
2885      PetscHeap - A simple class for managing heaps
2886 
2887    Level: intermediate
2888 
2889   Concepts: random numbers
2890 
2891 .seealso:  PetscHeapCreate(), PetscHeapAdd(), PetscHeapPop(), PetscHeapPeek(), PetscHeapStash(), PetscHeapUnstash(), PetscHeapView(), PetscHeapDestroy()
2892 S*/
2893 typedef struct _PetscHeap *PetscHeap;
2894 
2895 PETSC_EXTERN PetscErrorCode PetscHeapCreate(PetscInt,PetscHeap*);
2896 PETSC_EXTERN PetscErrorCode PetscHeapAdd(PetscHeap,PetscInt,PetscInt);
2897 PETSC_EXTERN PetscErrorCode PetscHeapPop(PetscHeap,PetscInt*,PetscInt*);
2898 PETSC_EXTERN PetscErrorCode PetscHeapPeek(PetscHeap,PetscInt*,PetscInt*);
2899 PETSC_EXTERN PetscErrorCode PetscHeapStash(PetscHeap,PetscInt,PetscInt);
2900 PETSC_EXTERN PetscErrorCode PetscHeapUnstash(PetscHeap);
2901 PETSC_EXTERN PetscErrorCode PetscHeapDestroy(PetscHeap*);
2902 PETSC_EXTERN PetscErrorCode PetscHeapView(PetscHeap,PetscViewer);
2903 
2904 PETSC_EXTERN PetscErrorCode PetscProcessPlacementView(PetscViewer);
2905 typedef struct _n_PetscCommShared* PetscCommShared;
2906 PETSC_EXTERN PetscErrorCode PetscCommSharedGet(MPI_Comm,PetscCommShared*);
2907 PETSC_EXTERN PetscErrorCode PetscCommSharedGlobalToLocal(PetscCommShared,PetscMPIInt,PetscMPIInt*);
2908 PETSC_EXTERN PetscErrorCode PetscCommSharedGetComm(PetscCommShared,MPI_Comm*);
2909 
2910 /*S
2911    PetscSegBuffer - a segmented extendable buffer
2912 
2913    Level: developer
2914 
2915 .seealso: PetscSegBufferCreate(), PetscSegBufferGet(), PetscSegBufferExtract(), PetscSegBufferDestroy()
2916 S*/
2917 typedef struct _n_PetscSegBuffer *PetscSegBuffer;
2918 PETSC_EXTERN PetscErrorCode PetscSegBufferCreate(size_t,size_t,PetscSegBuffer*);
2919 PETSC_EXTERN PetscErrorCode PetscSegBufferDestroy(PetscSegBuffer*);
2920 PETSC_EXTERN PetscErrorCode PetscSegBufferGet(PetscSegBuffer,size_t,void*);
2921 PETSC_EXTERN PetscErrorCode PetscSegBufferExtractAlloc(PetscSegBuffer,void*);
2922 PETSC_EXTERN PetscErrorCode PetscSegBufferExtractTo(PetscSegBuffer,void*);
2923 PETSC_EXTERN PetscErrorCode PetscSegBufferExtractInPlace(PetscSegBuffer,void*);
2924 PETSC_EXTERN PetscErrorCode PetscSegBufferGetSize(PetscSegBuffer,size_t*);
2925 PETSC_EXTERN PetscErrorCode PetscSegBufferUnuse(PetscSegBuffer,size_t);
2926 
2927 
2928 /* Type-safe wrapper to encourage use of PETSC_RESTRICT. Does not use PetscFunctionBegin because the error handling
2929  * prevents the compiler from completely erasing the stub. This is called in inner loops so it has to be as fast as
2930  * possible. */
2931 PETSC_STATIC_INLINE PetscErrorCode PetscSegBufferGetInts(PetscSegBuffer seg,PetscInt count,PetscInt *PETSC_RESTRICT *slot) {return PetscSegBufferGet(seg,(size_t)count,(void**)slot);}
2932 
2933 typedef struct _n_PetscOptionsHelpPrinted *PetscOptionsHelpPrinted;
2934 extern PetscOptionsHelpPrinted PetscOptionsHelpPrintedSingleton;
2935 PETSC_EXTERN PetscErrorCode PetscOptionsHelpPrintedDestroy(PetscOptionsHelpPrinted*);
2936 PETSC_EXTERN PetscErrorCode PetscOptionsHelpPrintedCreate(PetscOptionsHelpPrinted*);
2937 PETSC_EXTERN PetscErrorCode PetscOptionsHelpPrintedCheck(PetscOptionsHelpPrinted,const char*,const char*,PetscBool*);
2938 
2939 #include <stdarg.h>
2940 PETSC_EXTERN PetscErrorCode PetscVSNPrintf(char*,size_t,const char[],size_t*,va_list);
2941 PETSC_EXTERN PetscErrorCode (*PetscVFPrintf)(FILE*,const char[],va_list);
2942 
2943 PETSC_EXTERN PetscSegBuffer PetscCitationsList;
2944 
2945 /*@C
2946       PetscCitationsRegister - Register a bibtex item to obtain credit for an implemented algorithm used in the code.
2947 
2948      Not Collective - only what is registered on rank 0 of PETSC_COMM_WORLD will be printed
2949 
2950      Input Parameters:
2951 +      cite - the bibtex item, formated to displayed on multiple lines nicely
2952 -      set - a boolean variable initially set to PETSC_FALSE; this is used to insure only a single registration of the citation
2953 
2954    Level: intermediate
2955 
2956    Not available from Fortran
2957 
2958      Options Database:
2959 .     -citations [filename]   - print out the bibtex entries for the given computation
2960 @*/
2961 PETSC_STATIC_INLINE PetscErrorCode PetscCitationsRegister(const char cit[],PetscBool *set)
2962 {
2963   size_t         len;
2964   char           *vstring;
2965   PetscErrorCode ierr;
2966 
2967   PetscFunctionBegin;
2968   if (set && *set) PetscFunctionReturn(0);
2969   ierr = PetscStrlen(cit,&len);CHKERRQ(ierr);
2970   ierr = PetscSegBufferGet(PetscCitationsList,len,&vstring);CHKERRQ(ierr);
2971   ierr = PetscMemcpy(vstring,cit,len);CHKERRQ(ierr);
2972   if (set) *set = PETSC_TRUE;
2973   PetscFunctionReturn(0);
2974 }
2975 
2976 PETSC_EXTERN PetscErrorCode PetscURLShorten(const char[],char[],size_t);
2977 PETSC_EXTERN PetscErrorCode PetscGoogleDriveAuthorize(MPI_Comm,char[],char[],size_t);
2978 PETSC_EXTERN PetscErrorCode PetscGoogleDriveRefresh(MPI_Comm,const char[],char[],size_t);
2979 PETSC_EXTERN PetscErrorCode PetscGoogleDriveUpload(MPI_Comm,const char[],const char []);
2980 
2981 PETSC_EXTERN PetscErrorCode PetscBoxAuthorize(MPI_Comm,char[],char[],size_t);
2982 PETSC_EXTERN PetscErrorCode PetscBoxRefresh(MPI_Comm,const char[],char[],char[],size_t);
2983 
2984 PETSC_EXTERN PetscErrorCode PetscGlobusGetTransfers(MPI_Comm,const char[],char[],size_t);
2985 
2986 PETSC_EXTERN PetscErrorCode PetscTextBelt(MPI_Comm,const char[],const char[],PetscBool*);
2987 PETSC_EXTERN PetscErrorCode PetscTellMyCell(MPI_Comm,const char[],const char[],PetscBool*);
2988 
2989 PETSC_EXTERN PetscErrorCode PetscPullJSONValue(const char[],const char[],char[],size_t,PetscBool*);
2990 PETSC_EXTERN PetscErrorCode PetscPushJSONValue(char[],const char[],const char[],size_t);
2991 
2992 
2993 #if defined(PETSC_USE_DEBUG)
2994 /*
2995    Verify that all processes in the communicator have called this from the same line of code
2996  */
2997 PETSC_EXTERN PetscErrorCode PetscAllreduceBarrierCheck(MPI_Comm,PetscMPIInt,int,const char*,const char *);
2998 
2999 /*MC
3000    MPIU_Allreduce - a PETSc replacement for MPI_Allreduce() that tries to determine if the call from all the MPI processes occur from the
3001                     same place in the PETSc code. This helps to detect bugs where different MPI processes follow different code paths
3002                     resulting in inconsistent and incorrect calls to MPI_Allreduce().
3003 
3004    Collective on MPI_Comm
3005 
3006    Synopsis:
3007      #include <petscsys.h>
3008      PetscErrorCode MPIU_Allreduce(void *indata,void *outdata,PetscMPIInt count,MPI_Datatype datatype, MPI_Op op, MPI_Comm comm);
3009 
3010    Input Parameters:
3011 +  indata - pointer to the input data to be reduced
3012 .  count - the number of MPI data items in indata and outdata
3013 .  datatype - the MPI datatype, for example MPI_INT
3014 .  op - the MPI operation, for example MPI_SUM
3015 -  comm - the MPI communicator on which the operation occurs
3016 
3017    Output Parameter:
3018 .  outdata - the reduced values
3019 
3020    Notes:
3021    In optimized mode this directly calls MPI_Allreduce()
3022 
3023    Level: developer
3024 
3025 .seealso: MPI_Allreduce()
3026 M*/
3027 #define MPIU_Allreduce(a,b,c,d,e,fcomm) (PetscAllreduceBarrierCheck(fcomm,c,__LINE__,PETSC_FUNCTION_NAME,__FILE__) || MPI_Allreduce(a,b,c,d,e,fcomm))
3028 #else
3029 #define MPIU_Allreduce(a,b,c,d,e,fcomm) MPI_Allreduce(a,b,c,d,e,fcomm)
3030 #endif
3031 
3032 #if defined(PETSC_HAVE_MPI_WIN_CREATE_FEATURE)
3033 PETSC_EXTERN PetscErrorCode MPIU_Win_allocate_shared(MPI_Aint,PetscMPIInt,MPI_Info,MPI_Comm,void*,MPI_Win*);
3034 PETSC_EXTERN PetscErrorCode MPIU_Win_shared_query(MPI_Win,PetscMPIInt,MPI_Aint*,PetscMPIInt*,void*);
3035 #endif
3036 
3037 /*
3038     Returned from PETSc functions that are called from MPI, such as related to attributes
3039 */
3040 PETSC_EXTERN PetscMPIInt PETSC_MPI_ERROR_CLASS;
3041 PETSC_EXTERN PetscMPIInt PETSC_MPI_ERROR_CODE;
3042 
3043 #endif
3044