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