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