xref: /petsc/include/petscsys.h (revision ac09b9214d23ea9ad238aa607de9fa447fd4e91b)
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 /*
10    petscconf.h is contained in ${PETSC_ARCH}/include/petscconf.h it is
11    found automatically by the compiler due to the -I${PETSC_DIR}/${PETSC_ARCH}/include that
12    PETSc's makefiles add to the compiler rules.
13    For --prefix installs the directory ${PETSC_ARCH} does not exist and petscconf.h is in the same
14    directory as the other PETSc include files.
15 */
16 #include <petscconf.h>
17 #include <petscconf_poison.h>
18 #include <petscfix.h>
19 #include <petscmacros.h>
20 
21 /* SUBMANSEC = Sys */
22 
23 #if defined(PETSC_DESIRE_FEATURE_TEST_MACROS)
24 /*
25    Feature test macros must be included before headers defined by IEEE Std 1003.1-2001
26    We only turn these in PETSc source files that require them by setting PETSC_DESIRE_FEATURE_TEST_MACROS
27 */
28 #  if defined(PETSC__POSIX_C_SOURCE_200112L) && !defined(_POSIX_C_SOURCE)
29 #    define _POSIX_C_SOURCE 200112L
30 #  endif
31 #  if defined(PETSC__BSD_SOURCE) && !defined(_BSD_SOURCE)
32 #    define _BSD_SOURCE
33 #  endif
34 #  if defined(PETSC__DEFAULT_SOURCE) && !defined(_DEFAULT_SOURCE)
35 #    define _DEFAULT_SOURCE
36 #  endif
37 #  if defined(PETSC__GNU_SOURCE) && !defined(_GNU_SOURCE)
38 #    define _GNU_SOURCE
39 #  endif
40 #endif
41 
42 #include <petscsystypes.h>
43 
44 /* ========================================================================== */
45 
46 /*
47     Defines the interface to MPI allowing the use of all MPI functions.
48 
49     PETSc does not use the C++ binding of MPI at ALL. The following flag
50     makes sure the C++ bindings are not included. The C++ bindings REQUIRE
51     putting mpi.h before ANY C++ include files, we cannot control this
52     with all PETSc users. Users who want to use the MPI C++ bindings can include
53     mpicxx.h directly in their code
54 */
55 #if !defined(MPICH_SKIP_MPICXX)
56 #  define MPICH_SKIP_MPICXX 1
57 #endif
58 #if !defined(OMPI_SKIP_MPICXX)
59 #  define OMPI_SKIP_MPICXX 1
60 #endif
61 #if defined(PETSC_HAVE_MPIUNI)
62 #  include <petsc/mpiuni/mpi.h>
63 #else
64 #  include <mpi.h>
65 #endif
66 
67 /*
68    Perform various sanity checks that the correct mpi.h is being included at compile time.
69    This usually happens because
70       * either an unexpected mpi.h is in the default compiler path (i.e. in /usr/include) or
71       * an extra include path -I/something (which contains the unexpected mpi.h) is being passed to the compiler
72 */
73 #if defined(PETSC_HAVE_MPIUNI)
74 #  if !defined(MPIUNI_H)
75 #    error "PETSc was configured with --with-mpi=0 but now appears to be compiling using a different mpi.h"
76 #  endif
77 #elif defined(PETSC_HAVE_I_MPI_NUMVERSION)
78 #  if !defined(I_MPI_NUMVERSION)
79 #    error "PETSc was configured with I_MPI but now appears to be compiling using a non-I_MPI mpi.h"
80 #  elif I_MPI_NUMVERSION != PETSC_HAVE_I_MPI_NUMVERSION
81 #    error "PETSc was configured with one I_MPI mpi.h version but now appears to be compiling using a different I_MPI mpi.h version"
82 #  endif
83 #elif defined(PETSC_HAVE_MVAPICH2_NUMVERSION)
84 #  if !defined(MVAPICH2_NUMVERSION)
85 #    error "PETSc was configured with MVAPICH2 but now appears to be compiling using a non-MVAPICH2 mpi.h"
86 #  elif MVAPICH2_NUMVERSION != PETSC_HAVE_MVAPICH2_NUMVERSION
87 #    error "PETSc was configured with one MVAPICH2 mpi.h version but now appears to be compiling using a different MVAPICH2 mpi.h version"
88 #  endif
89 #elif defined(PETSC_HAVE_MPICH_NUMVERSION)
90 #  if !defined(MPICH_NUMVERSION) || defined(MVAPICH2_NUMVERSION) || defined(I_MPI_NUMVERSION)
91 #    error "PETSc was configured with MPICH but now appears to be compiling using a non-MPICH mpi.h"
92 #  elif (MPICH_NUMVERSION/100000 != PETSC_HAVE_MPICH_NUMVERSION/100000) || (MPICH_NUMVERSION%100000/1000 < PETSC_HAVE_MPICH_NUMVERSION%100000/1000)
93 #    error "PETSc was configured with one MPICH mpi.h version but now appears to be compiling using a different MPICH mpi.h version"
94 #  endif
95 #elif defined(PETSC_HAVE_OMPI_MAJOR_VERSION)
96 #  if !defined(OMPI_MAJOR_VERSION)
97 #    error "PETSc was configured with OpenMPI but now appears to be compiling using a non-OpenMPI mpi.h"
98 #  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)
99 #    error "PETSc was configured with one OpenMPI mpi.h version but now appears to be compiling using a different OpenMPI mpi.h version"
100 #  endif
101 #  define PETSC_MPI_COMM_FMT "p"
102 #  define PETSC_MPI_WIN_FMT  "p"
103 #elif defined(PETSC_HAVE_MSMPI_VERSION)
104 #  if !defined(MSMPI_VER)
105 #    error "PETSc was configured with MSMPI but now appears to be compiling using a non-MSMPI mpi.h"
106 #  elif (MSMPI_VER != PETSC_HAVE_MSMPI_VERSION)
107 #    error "PETSc was configured with one MSMPI mpi.h version but now appears to be compiling using a different MSMPI mpi.h version"
108 #  endif
109 #elif defined(OMPI_MAJOR_VERSION) || defined(MPICH_NUMVERSION) || defined(MSMPI_VER)
110 #  error "PETSc was configured with undetermined MPI - but now appears to be compiling using any of OpenMPI, MS-MPI or a MPICH variant"
111 #endif
112 
113 /* Format specifier for printing MPI_Comm (most implementations use 'int' as type) */
114 #if !defined(PETSC_MPI_COMM_FMT)
115 #  define PETSC_MPI_COMM_FMT "d"
116 #endif
117 
118 #if !defined(PETSC_MPI_WIN_FMT)
119 #  define PETSC_MPI_WIN_FMT "d"
120 #endif
121 
122 /*
123     Need to put stdio.h AFTER mpi.h for MPICH2 with C++ compiler
124     see the top of mpicxx.h in the MPICH2 distribution.
125 */
126 #include <stdio.h>
127 
128 /* MSMPI on 32bit windows requires this yukky hack - that breaks MPI standard compliance */
129 #if !defined(MPIAPI)
130 #define MPIAPI
131 #endif
132 
133 /*
134    Support for Clang (>=3.2) matching type tag arguments with void* buffer types.
135    This allows the compiler to detect cases where the MPI datatype argument passed to a MPI routine
136    does not match the actual type of the argument being passed in
137 */
138 #if defined(__has_attribute) && defined(works_with_const_which_is_not_true)
139 #  if __has_attribute(argument_with_type_tag) && __has_attribute(pointer_with_type_tag) && __has_attribute(type_tag_for_datatype)
140 #    define PetscAttrMPIPointerWithType(bufno,typeno) __attribute__((pointer_with_type_tag(MPI,bufno,typeno)))
141 #    define PetscAttrMPITypeTag(type)                 __attribute__((type_tag_for_datatype(MPI,type)))
142 #    define PetscAttrMPITypeTagLayoutCompatible(type) __attribute__((type_tag_for_datatype(MPI,type,layout_compatible)))
143 #  endif
144 #endif
145 #if !defined(PetscAttrMPIPointerWithType)
146 #  define PetscAttrMPIPointerWithType(bufno,typeno)
147 #  define PetscAttrMPITypeTag(type)
148 #  define PetscAttrMPITypeTagLayoutCompatible(type)
149 #endif
150 
151 PETSC_EXTERN MPI_Datatype MPIU_ENUM PetscAttrMPITypeTag(PetscEnum);
152 PETSC_EXTERN MPI_Datatype MPIU_BOOL PetscAttrMPITypeTag(PetscBool);
153 
154 /*MC
155    MPIU_INT - MPI datatype corresponding to PetscInt
156 
157    Notes:
158    In MPI calls that require an MPI datatype that matches a PetscInt or array of PetscInt values, pass this value.
159 
160    Level: beginner
161 
162 .seealso: `PetscReal`, `PetscScalar`, `PetscComplex`, `PetscInt`, `MPIU_REAL`, `MPIU_SCALAR`, `MPIU_COMPLEX`
163 M*/
164 
165 PETSC_EXTERN MPI_Datatype MPIU_FORTRANADDR;
166 
167 #if defined(PETSC_USE_64BIT_INDICES)
168 #  define MPIU_INT MPIU_INT64
169 #  define PetscInt_FMT PetscInt64_FMT
170 #else
171 #  define MPIU_INT MPI_INT
172 #  define PetscInt_FMT "d"
173 #endif
174 
175 /*
176     For the rare cases when one needs to send a size_t object with MPI
177 */
178 PETSC_EXTERN MPI_Datatype MPIU_SIZE_T;
179 
180 /*
181       You can use PETSC_STDOUT as a replacement of stdout. You can also change
182     the value of PETSC_STDOUT to redirect all standard output elsewhere
183 */
184 PETSC_EXTERN FILE* PETSC_STDOUT;
185 
186 /*
187       You can use PETSC_STDERR as a replacement of stderr. You can also change
188     the value of PETSC_STDERR to redirect all standard error elsewhere
189 */
190 PETSC_EXTERN FILE* PETSC_STDERR;
191 
192 /* PetscPragmaSIMD - from CeedPragmaSIMD */
193 
194 #if defined(__NEC__)
195 #  define PetscPragmaSIMD _Pragma("_NEC ivdep")
196 #elif defined(__INTEL_COMPILER) && !defined(_WIN32)
197 #  define PetscPragmaSIMD _Pragma("vector")
198 #elif defined(__GNUC__) && __GNUC__ >= 5 && !defined(__PGI)
199 #  define PetscPragmaSIMD _Pragma("GCC ivdep")
200 #elif defined(_OPENMP) && _OPENMP >= 201307
201 #  if defined(_MSC_VER)
202 #    define PetscPragmaSIMD __pragma(omp simd)
203 #  else
204 #    define PetscPragmaSIMD _Pragma("omp simd")
205 #  endif
206 #elif defined(PETSC_HAVE_CRAY_VECTOR)
207 #  define PetscPragmaSIMD _Pragma("_CRI ivdep")
208 #else
209 #  define PetscPragmaSIMD
210 #endif
211 
212 /*
213     Declare extern C stuff after including external header files
214 */
215 
216 PETSC_EXTERN const char *const PetscBools[];
217 
218 PETSC_EXTERN PetscBool PETSC_RUNNING_ON_VALGRIND;
219 /*
220     Defines elementary mathematics functions and constants.
221 */
222 #include <petscmath.h>
223 
224 PETSC_EXTERN const char *const PetscCopyModes[];
225 
226 /*MC
227     PETSC_IGNORE - same as NULL, means PETSc will ignore this argument
228 
229    Level: beginner
230 
231    Note:
232    Accepted by many PETSc functions to not set a parameter and instead use
233           some default
234 
235    Fortran Notes:
236    This macro does not exist in Fortran; you must use PETSC_NULL_INTEGER,
237           PETSC_NULL_DOUBLE_PRECISION etc
238 
239 .seealso: `PETSC_DECIDE`, `PETSC_DEFAULT`, `PETSC_DETERMINE`
240 
241 M*/
242 #define PETSC_IGNORE NULL
243 
244 /* This is deprecated */
245 #define PETSC_NULL NULL
246 
247 /*MC
248     PETSC_DECIDE - standard way of passing in integer or floating point parameter
249        where you wish PETSc to use the default.
250 
251    Level: beginner
252 
253 .seealso: `PETSC_DEFAULT`, `PETSC_IGNORE`, `PETSC_DETERMINE`
254 
255 M*/
256 #define PETSC_DECIDE -1
257 
258 /*MC
259     PETSC_DETERMINE - standard way of passing in integer or floating point parameter
260        where you wish PETSc to compute the required value.
261 
262    Level: beginner
263 
264    Developer Note:
265    I would like to use const PetscInt PETSC_DETERMINE = PETSC_DECIDE; but for
266      some reason this is not allowed by the standard even though PETSC_DECIDE is a constant value.
267 
268 .seealso: `PETSC_DECIDE`, `PETSC_DEFAULT`, `PETSC_IGNORE`, `VecSetSizes()`
269 
270 M*/
271 #define PETSC_DETERMINE PETSC_DECIDE
272 
273 /*MC
274     PETSC_DEFAULT - standard way of passing in integer or floating point parameter
275        where you wish PETSc to use the default.
276 
277    Level: beginner
278 
279    Fortran Notes:
280    You need to use PETSC_DEFAULT_INTEGER or PETSC_DEFAULT_REAL.
281 
282 .seealso: `PETSC_DECIDE`, `PETSC_IGNORE`, `PETSC_DETERMINE`
283 
284 M*/
285 #define PETSC_DEFAULT -2
286 
287 /*MC
288     PETSC_COMM_WORLD - the equivalent of the MPI_COMM_WORLD communicator which represents
289            all the processes that PETSc knows about.
290 
291    Level: beginner
292 
293    Notes:
294    By default PETSC_COMM_WORLD and MPI_COMM_WORLD are identical unless you wish to
295           run PETSc on ONLY a subset of MPI_COMM_WORLD. In that case create your new (smaller)
296           communicator, call it, say comm, and set PETSC_COMM_WORLD = comm BEFORE calling
297           PetscInitialize(), but after MPI_Init() has been called.
298 
299           The value of PETSC_COMM_WORLD should never be USED/accessed before PetscInitialize()
300           is called because it may not have a valid value yet.
301 
302 .seealso: `PETSC_COMM_SELF`
303 
304 M*/
305 PETSC_EXTERN MPI_Comm PETSC_COMM_WORLD;
306 
307 /*MC
308     PETSC_COMM_SELF - This is always MPI_COMM_SELF
309 
310    Level: beginner
311 
312    Notes:
313    Do not USE/access or set this variable before PetscInitialize() has been called.
314 
315 .seealso: `PETSC_COMM_WORLD`
316 
317 M*/
318 #define PETSC_COMM_SELF MPI_COMM_SELF
319 
320 /*MC
321     PETSC_MPI_THREAD_REQUIRED - the required threading support used if PETSc initializes
322            MPI with MPI_Init_thread.
323 
324    Level: beginner
325 
326    Notes:
327    By default PETSC_MPI_THREAD_REQUIRED equals MPI_THREAD_FUNNELED.
328 
329 .seealso: `PetscInitialize()`
330 
331 M*/
332 PETSC_EXTERN PetscMPIInt PETSC_MPI_THREAD_REQUIRED;
333 
334 PETSC_EXTERN PetscBool PetscBeganMPI;
335 PETSC_EXTERN PetscBool PetscErrorHandlingInitialized;
336 PETSC_EXTERN PetscBool PetscInitializeCalled;
337 PETSC_EXTERN PetscBool PetscFinalizeCalled;
338 PETSC_EXTERN PetscBool PetscViennaCLSynchronize;
339 
340 PETSC_EXTERN PetscErrorCode PetscSetHelpVersionFunctions(PetscErrorCode (*)(MPI_Comm),PetscErrorCode (*)(MPI_Comm));
341 PETSC_EXTERN PetscErrorCode PetscCommDuplicate(MPI_Comm,MPI_Comm*,int*);
342 PETSC_EXTERN PetscErrorCode PetscCommDestroy(MPI_Comm*);
343 PETSC_EXTERN PetscErrorCode PetscCommGetComm(MPI_Comm,MPI_Comm*);
344 PETSC_EXTERN PetscErrorCode PetscCommRestoreComm(MPI_Comm,MPI_Comm*);
345 
346 #if defined(PETSC_HAVE_KOKKOS)
347 PETSC_EXTERN PetscErrorCode PetscKokkosInitializeCheck(void);  /* Initialize Kokkos if not yet. */
348 #endif
349 
350 #if defined(PETSC_HAVE_NVSHMEM)
351 PETSC_EXTERN PetscBool      PetscBeganNvshmem;
352 PETSC_EXTERN PetscBool      PetscNvshmemInitialized;
353 PETSC_EXTERN PetscErrorCode PetscNvshmemFinalize(void);
354 #endif
355 
356 #if defined(PETSC_HAVE_ELEMENTAL)
357 PETSC_EXTERN PetscErrorCode PetscElementalInitializePackage(void);
358 PETSC_EXTERN PetscErrorCode PetscElementalInitialized(PetscBool*);
359 PETSC_EXTERN PetscErrorCode PetscElementalFinalizePackage(void);
360 #endif
361 
362 /*MC
363    PetscMalloc - Allocates memory, One should use PetscNew(), PetscMalloc1() or PetscCalloc1() usually instead of this
364 
365    Synopsis:
366     #include <petscsys.h>
367    PetscErrorCode PetscMalloc(size_t m,void **result)
368 
369    Not Collective
370 
371    Input Parameter:
372 .  m - number of bytes to allocate
373 
374    Output Parameter:
375 .  result - memory allocated
376 
377    Level: beginner
378 
379    Notes:
380    Memory is always allocated at least double aligned
381 
382    It is safe to allocate size 0 and pass the resulting pointer (which may or may not be NULL) to PetscFree().
383 
384 .seealso: `PetscFree()`, `PetscNew()`
385 
386 M*/
387 #define PetscMalloc(a,b)  ((*PetscTrMalloc)((a),PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(void**)(b)))
388 
389 /*MC
390    PetscRealloc - Rellocates memory
391 
392    Synopsis:
393     #include <petscsys.h>
394    PetscErrorCode PetscRealloc(size_t m,void **result)
395 
396    Not Collective
397 
398    Input Parameters:
399 +  m - number of bytes to allocate
400 -  result - previous memory
401 
402    Output Parameter:
403 .  result - new memory allocated
404 
405    Level: developer
406 
407    Notes:
408    Memory is always allocated at least double aligned
409 
410 .seealso: `PetscMalloc()`, `PetscFree()`, `PetscNew()`
411 
412 M*/
413 #define PetscRealloc(a,b)  ((*PetscTrRealloc)((a),__LINE__,PETSC_FUNCTION_NAME,__FILE__,(void**)(b)))
414 
415 /*MC
416    PetscAddrAlign - Rounds up an address to PETSC_MEMALIGN alignment
417 
418    Synopsis:
419     #include <petscsys.h>
420    void *PetscAddrAlign(void *addr)
421 
422    Not Collective
423 
424    Input Parameters:
425 .  addr - address to align (any pointer type)
426 
427    Level: developer
428 
429 .seealso: `PetscMallocAlign()`
430 
431 M*/
432 #define PetscAddrAlign(a) (void*)((((PETSC_UINTPTR_T)(a))+(PETSC_MEMALIGN-1)) & ~(PETSC_MEMALIGN-1))
433 
434 /*MC
435    PetscCalloc - Allocates a cleared (zeroed) memory region aligned to PETSC_MEMALIGN
436 
437    Synopsis:
438     #include <petscsys.h>
439    PetscErrorCode PetscCalloc(size_t m,void **result)
440 
441    Not Collective
442 
443    Input Parameter:
444 .  m - number of bytes to allocate
445 
446    Output Parameter:
447 .  result - memory allocated
448 
449    Level: beginner
450 
451    Notes:
452    Memory is always allocated at least double aligned. This macro is useful in allocating memory pointed by void pointers
453 
454    It is safe to allocate size 0 and pass the resulting pointer (which may or may not be NULL) to PetscFree().
455 
456 .seealso: `PetscFree()`, `PetscNew()`
457 
458 M*/
459 #define PetscCalloc(m,result)  PetscMallocA(1,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)((size_t)m),(result))
460 
461 /*MC
462    PetscMalloc1 - Allocates an array of memory aligned to PETSC_MEMALIGN
463 
464    Synopsis:
465     #include <petscsys.h>
466    PetscErrorCode PetscMalloc1(size_t m1,type **r1)
467 
468    Not Collective
469 
470    Input Parameter:
471 .  m1 - number of elements to allocate  (may be zero)
472 
473    Output Parameter:
474 .  r1 - memory allocated
475 
476    Note:
477    This uses the sizeof() of the memory type requested to determine the total memory to be allocated, therefore you should not
478          multiply the number of elements requested by the sizeof() the type. For example use
479 $  PetscInt *id;
480 $  PetscMalloc1(10,&id);
481         not
482 $  PetscInt *id;
483 $  PetscMalloc1(10*sizeof(PetscInt),&id);
484 
485         Does not zero the memory allocated, use PetscCalloc1() to obtain memory that has been zeroed.
486 
487    Level: beginner
488 
489 .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscCalloc1()`, `PetscMalloc2()`
490 
491 M*/
492 #define PetscMalloc1(m1,r1) PetscMallocA(1,PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)((size_t)m1)*sizeof(**(r1)),(r1))
493 
494 /*MC
495    PetscCalloc1 - Allocates a cleared (zeroed) array of memory aligned to PETSC_MEMALIGN
496 
497    Synopsis:
498     #include <petscsys.h>
499    PetscErrorCode PetscCalloc1(size_t m1,type **r1)
500 
501    Not Collective
502 
503    Input Parameter:
504 .  m1 - number of elements to allocate in 1st chunk  (may be zero)
505 
506    Output Parameter:
507 .  r1 - memory allocated
508 
509    Notes:
510    See PetsMalloc1() for more details on usage.
511 
512    Level: beginner
513 
514 .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscMalloc1()`, `PetscCalloc2()`
515 
516 M*/
517 #define PetscCalloc1(m1,r1) PetscMallocA(1,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)((size_t)m1)*sizeof(**(r1)),(r1))
518 
519 /*MC
520    PetscMalloc2 - Allocates 2 arrays of memory both aligned to PETSC_MEMALIGN
521 
522    Synopsis:
523     #include <petscsys.h>
524    PetscErrorCode PetscMalloc2(size_t m1,type **r1,size_t m2,type **r2)
525 
526    Not Collective
527 
528    Input Parameters:
529 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
530 -  m2 - number of elements to allocate in 2nd chunk  (may be zero)
531 
532    Output Parameters:
533 +  r1 - memory allocated in first chunk
534 -  r2 - memory allocated in second chunk
535 
536    Level: developer
537 
538 .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscMalloc1()`, `PetscCalloc2()`
539 
540 M*/
541 #define PetscMalloc2(m1,r1,m2,r2) PetscMallocA(2,PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)((size_t)m1)*sizeof(**(r1)),(r1),(size_t)((size_t)m2)*sizeof(**(r2)),(r2))
542 
543 /*MC
544    PetscCalloc2 - Allocates 2 cleared (zeroed) arrays of memory both aligned to PETSC_MEMALIGN
545 
546    Synopsis:
547     #include <petscsys.h>
548    PetscErrorCode PetscCalloc2(size_t m1,type **r1,size_t m2,type **r2)
549 
550    Not Collective
551 
552    Input Parameters:
553 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
554 -  m2 - number of elements to allocate in 2nd chunk  (may be zero)
555 
556    Output Parameters:
557 +  r1 - memory allocated in first chunk
558 -  r2 - memory allocated in second chunk
559 
560    Level: developer
561 
562 .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscCalloc1()`, `PetscMalloc2()`
563 
564 M*/
565 #define PetscCalloc2(m1,r1,m2,r2) PetscMallocA(2,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)((size_t)m1)*sizeof(**(r1)),(r1),(size_t)((size_t)m2)*sizeof(**(r2)),(r2))
566 
567 /*MC
568    PetscMalloc3 - Allocates 3 arrays of memory, all aligned to PETSC_MEMALIGN
569 
570    Synopsis:
571     #include <petscsys.h>
572    PetscErrorCode PetscMalloc3(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3)
573 
574    Not Collective
575 
576    Input Parameters:
577 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
578 .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
579 -  m3 - number of elements to allocate in 3rd chunk  (may be zero)
580 
581    Output Parameters:
582 +  r1 - memory allocated in first chunk
583 .  r2 - memory allocated in second chunk
584 -  r3 - memory allocated in third chunk
585 
586    Level: developer
587 
588 .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscCalloc3()`, `PetscFree3()`
589 
590 M*/
591 #define PetscMalloc3(m1,r1,m2,r2,m3,r3) PetscMallocA(3,PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)((size_t)m1)*sizeof(**(r1)),(r1),(size_t)((size_t)m2)*sizeof(**(r2)),(r2),(size_t)((size_t)m3)*sizeof(**(r3)),(r3))
592 
593 /*MC
594    PetscCalloc3 - Allocates 3 cleared (zeroed) arrays of memory, all aligned to PETSC_MEMALIGN
595 
596    Synopsis:
597     #include <petscsys.h>
598    PetscErrorCode PetscCalloc3(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3)
599 
600    Not Collective
601 
602    Input Parameters:
603 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
604 .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
605 -  m3 - number of elements to allocate in 3rd chunk  (may be zero)
606 
607    Output Parameters:
608 +  r1 - memory allocated in first chunk
609 .  r2 - memory allocated in second chunk
610 -  r3 - memory allocated in third chunk
611 
612    Level: developer
613 
614 .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscCalloc2()`, `PetscMalloc3()`, `PetscFree3()`
615 
616 M*/
617 #define PetscCalloc3(m1,r1,m2,r2,m3,r3) PetscMallocA(3,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)((size_t)m1)*sizeof(**(r1)),(r1),(size_t)((size_t)m2)*sizeof(**(r2)),(r2),(size_t)((size_t)m3)*sizeof(**(r3)),(r3))
618 
619 /*MC
620    PetscMalloc4 - Allocates 4 arrays of memory, all aligned to PETSC_MEMALIGN
621 
622    Synopsis:
623     #include <petscsys.h>
624    PetscErrorCode PetscMalloc4(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3,size_t m4,type **r4)
625 
626    Not Collective
627 
628    Input Parameters:
629 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
630 .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
631 .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
632 -  m4 - number of elements to allocate in 4th chunk  (may be zero)
633 
634    Output Parameters:
635 +  r1 - memory allocated in first chunk
636 .  r2 - memory allocated in second chunk
637 .  r3 - memory allocated in third chunk
638 -  r4 - memory allocated in fourth chunk
639 
640    Level: developer
641 
642 .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscCalloc4()`, `PetscFree4()`
643 
644 M*/
645 #define PetscMalloc4(m1,r1,m2,r2,m3,r3,m4,r4) PetscMallocA(4,PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)((size_t)m1)*sizeof(**(r1)),(r1),(size_t)((size_t)m2)*sizeof(**(r2)),(r2),(size_t)((size_t)m3)*sizeof(**(r3)),(r3),(size_t)((size_t)m4)*sizeof(**(r4)),(r4))
646 
647 /*MC
648    PetscCalloc4 - Allocates 4 cleared (zeroed) arrays of memory, all aligned to PETSC_MEMALIGN
649 
650    Synopsis:
651     #include <petscsys.h>
652    PetscErrorCode PetscCalloc4(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3,size_t m4,type **r4)
653 
654    Not Collective
655 
656    Input Parameters:
657 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
658 .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
659 .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
660 -  m4 - number of elements to allocate in 4th chunk  (may be zero)
661 
662    Output Parameters:
663 +  r1 - memory allocated in first chunk
664 .  r2 - memory allocated in second chunk
665 .  r3 - memory allocated in third chunk
666 -  r4 - memory allocated in fourth chunk
667 
668    Level: developer
669 
670 .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscCalloc4()`, `PetscFree4()`
671 
672 M*/
673 #define PetscCalloc4(m1,r1,m2,r2,m3,r3,m4,r4) PetscMallocA(4,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)((size_t)m1)*sizeof(**(r1)),(r1),(size_t)((size_t)m2)*sizeof(**(r2)),(r2),(size_t)((size_t)m3)*sizeof(**(r3)),(r3),(size_t)((size_t)m4)*sizeof(**(r4)),(r4))
674 
675 /*MC
676    PetscMalloc5 - Allocates 5 arrays of memory, all aligned to PETSC_MEMALIGN
677 
678    Synopsis:
679     #include <petscsys.h>
680    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)
681 
682    Not Collective
683 
684    Input Parameters:
685 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
686 .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
687 .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
688 .  m4 - number of elements to allocate in 4th chunk  (may be zero)
689 -  m5 - number of elements to allocate in 5th chunk  (may be zero)
690 
691    Output Parameters:
692 +  r1 - memory allocated in first chunk
693 .  r2 - memory allocated in second chunk
694 .  r3 - memory allocated in third chunk
695 .  r4 - memory allocated in fourth chunk
696 -  r5 - memory allocated in fifth chunk
697 
698    Level: developer
699 
700 .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscCalloc5()`, `PetscFree5()`
701 
702 M*/
703 #define PetscMalloc5(m1,r1,m2,r2,m3,r3,m4,r4,m5,r5) PetscMallocA(5,PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)((size_t)m1)*sizeof(**(r1)),(r1),(size_t)((size_t)m2)*sizeof(**(r2)),(r2),(size_t)((size_t)m3)*sizeof(**(r3)),(r3),(size_t)((size_t)m4)*sizeof(**(r4)),(r4),(size_t)((size_t)m5)*sizeof(**(r5)),(r5))
704 
705 /*MC
706    PetscCalloc5 - Allocates 5 cleared (zeroed) arrays of memory, all aligned to PETSC_MEMALIGN
707 
708    Synopsis:
709     #include <petscsys.h>
710    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)
711 
712    Not Collective
713 
714    Input Parameters:
715 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
716 .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
717 .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
718 .  m4 - number of elements to allocate in 4th chunk  (may be zero)
719 -  m5 - number of elements to allocate in 5th chunk  (may be zero)
720 
721    Output Parameters:
722 +  r1 - memory allocated in first chunk
723 .  r2 - memory allocated in second chunk
724 .  r3 - memory allocated in third chunk
725 .  r4 - memory allocated in fourth chunk
726 -  r5 - memory allocated in fifth chunk
727 
728    Level: developer
729 
730 .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscMalloc5()`, `PetscFree5()`
731 
732 M*/
733 #define PetscCalloc5(m1,r1,m2,r2,m3,r3,m4,r4,m5,r5) PetscMallocA(5,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)((size_t)m1)*sizeof(**(r1)),(r1),(size_t)((size_t)m2)*sizeof(**(r2)),(r2),(size_t)((size_t)m3)*sizeof(**(r3)),(r3),(size_t)((size_t)m4)*sizeof(**(r4)),(r4),(size_t)((size_t)m5)*sizeof(**(r5)),(r5))
734 
735 /*MC
736    PetscMalloc6 - Allocates 6 arrays of memory, all aligned to PETSC_MEMALIGN
737 
738    Synopsis:
739     #include <petscsys.h>
740    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)
741 
742    Not Collective
743 
744    Input Parameters:
745 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
746 .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
747 .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
748 .  m4 - number of elements to allocate in 4th chunk  (may be zero)
749 .  m5 - number of elements to allocate in 5th chunk  (may be zero)
750 -  m6 - number of elements to allocate in 6th chunk  (may be zero)
751 
752    Output Parameteasr:
753 +  r1 - memory allocated in first chunk
754 .  r2 - memory allocated in second chunk
755 .  r3 - memory allocated in third chunk
756 .  r4 - memory allocated in fourth chunk
757 .  r5 - memory allocated in fifth chunk
758 -  r6 - memory allocated in sixth chunk
759 
760    Level: developer
761 
762 .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscCalloc6()`, `PetscFree3()`, `PetscFree4()`, `PetscFree5()`, `PetscFree6()`
763 
764 M*/
765 #define PetscMalloc6(m1,r1,m2,r2,m3,r3,m4,r4,m5,r5,m6,r6) PetscMallocA(6,PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)((size_t)m1)*sizeof(**(r1)),(r1),(size_t)((size_t)m2)*sizeof(**(r2)),(r2),(size_t)((size_t)m3)*sizeof(**(r3)),(r3),(size_t)((size_t)m4)*sizeof(**(r4)),(r4),(size_t)((size_t)m5)*sizeof(**(r5)),(r5),(size_t)((size_t)m6)*sizeof(**(r6)),(r6))
766 
767 /*MC
768    PetscCalloc6 - Allocates 6 cleared (zeroed) arrays of memory, all aligned to PETSC_MEMALIGN
769 
770    Synopsis:
771     #include <petscsys.h>
772    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)
773 
774    Not Collective
775 
776    Input Parameters:
777 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
778 .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
779 .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
780 .  m4 - number of elements to allocate in 4th chunk  (may be zero)
781 .  m5 - number of elements to allocate in 5th chunk  (may be zero)
782 -  m6 - number of elements to allocate in 6th chunk  (may be zero)
783 
784    Output Parameters:
785 +  r1 - memory allocated in first chunk
786 .  r2 - memory allocated in second chunk
787 .  r3 - memory allocated in third chunk
788 .  r4 - memory allocated in fourth chunk
789 .  r5 - memory allocated in fifth chunk
790 -  r6 - memory allocated in sixth chunk
791 
792    Level: developer
793 
794 .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscMalloc6()`, `PetscFree6()`
795 
796 M*/
797 #define PetscCalloc6(m1,r1,m2,r2,m3,r3,m4,r4,m5,r5,m6,r6) PetscMallocA(6,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)((size_t)m1)*sizeof(**(r1)),(r1),(size_t)((size_t)m2)*sizeof(**(r2)),(r2),(size_t)((size_t)m3)*sizeof(**(r3)),(r3),(size_t)((size_t)m4)*sizeof(**(r4)),(r4),(size_t)((size_t)m5)*sizeof(**(r5)),(r5),(size_t)((size_t)m6)*sizeof(**(r6)),(r6))
798 
799 /*MC
800    PetscMalloc7 - Allocates 7 arrays of memory, all aligned to PETSC_MEMALIGN
801 
802    Synopsis:
803     #include <petscsys.h>
804    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)
805 
806    Not Collective
807 
808    Input Parameters:
809 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
810 .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
811 .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
812 .  m4 - number of elements to allocate in 4th chunk  (may be zero)
813 .  m5 - number of elements to allocate in 5th chunk  (may be zero)
814 .  m6 - number of elements to allocate in 6th chunk  (may be zero)
815 -  m7 - number of elements to allocate in 7th chunk  (may be zero)
816 
817    Output Parameters:
818 +  r1 - memory allocated in first chunk
819 .  r2 - memory allocated in second chunk
820 .  r3 - memory allocated in third chunk
821 .  r4 - memory allocated in fourth chunk
822 .  r5 - memory allocated in fifth chunk
823 .  r6 - memory allocated in sixth chunk
824 -  r7 - memory allocated in seventh chunk
825 
826    Level: developer
827 
828 .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscCalloc7()`, `PetscFree7()`
829 
830 M*/
831 #define PetscMalloc7(m1,r1,m2,r2,m3,r3,m4,r4,m5,r5,m6,r6,m7,r7) PetscMallocA(7,PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)((size_t)m1)*sizeof(**(r1)),(r1),(size_t)((size_t)m2)*sizeof(**(r2)),(r2),(size_t)((size_t)m3)*sizeof(**(r3)),(r3),(size_t)((size_t)m4)*sizeof(**(r4)),(r4),(size_t)((size_t)m5)*sizeof(**(r5)),(r5),(size_t)((size_t)m6)*sizeof(**(r6)),(r6),(size_t)((size_t)m7)*sizeof(**(r7)),(r7))
832 
833 /*MC
834    PetscCalloc7 - Allocates 7 cleared (zeroed) arrays of memory, all aligned to PETSC_MEMALIGN
835 
836    Synopsis:
837     #include <petscsys.h>
838    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)
839 
840    Not Collective
841 
842    Input Parameters:
843 +  m1 - number of elements to allocate in 1st chunk  (may be zero)
844 .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
845 .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
846 .  m4 - number of elements to allocate in 4th chunk  (may be zero)
847 .  m5 - number of elements to allocate in 5th chunk  (may be zero)
848 .  m6 - number of elements to allocate in 6th chunk  (may be zero)
849 -  m7 - number of elements to allocate in 7th chunk  (may be zero)
850 
851    Output Parameters:
852 +  r1 - memory allocated in first chunk
853 .  r2 - memory allocated in second chunk
854 .  r3 - memory allocated in third chunk
855 .  r4 - memory allocated in fourth chunk
856 .  r5 - memory allocated in fifth chunk
857 .  r6 - memory allocated in sixth chunk
858 -  r7 - memory allocated in seventh chunk
859 
860    Level: developer
861 
862 .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscMalloc7()`, `PetscFree7()`
863 
864 M*/
865 #define PetscCalloc7(m1,r1,m2,r2,m3,r3,m4,r4,m5,r5,m6,r6,m7,r7) PetscMallocA(7,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)((size_t)m1)*sizeof(**(r1)),(r1),(size_t)((size_t)m2)*sizeof(**(r2)),(r2),(size_t)((size_t)m3)*sizeof(**(r3)),(r3),(size_t)((size_t)m4)*sizeof(**(r4)),(r4),(size_t)((size_t)m5)*sizeof(**(r5)),(r5),(size_t)((size_t)m6)*sizeof(**(r6)),(r6),(size_t)((size_t)m7)*sizeof(**(r7)),(r7))
866 
867 /*MC
868    PetscNew - Allocates memory of a particular type, zeros the memory! Aligned to PETSC_MEMALIGN
869 
870    Synopsis:
871     #include <petscsys.h>
872    PetscErrorCode PetscNew(type **result)
873 
874    Not Collective
875 
876    Output Parameter:
877 .  result - memory allocated, sized to match pointer type
878 
879    Level: beginner
880 
881 .seealso: `PetscFree()`, `PetscMalloc()`, `PetscNewLog()`, `PetscCalloc1()`, `PetscMalloc1()`
882 
883 M*/
884 #define PetscNew(b)      PetscCalloc1(1,(b))
885 
886 /*MC
887    PetscNewLog - Allocates memory of a type matching pointer, zeros the memory! Aligned to PETSC_MEMALIGN. Associates the memory allocated
888          with the given object using PetscLogObjectMemory().
889 
890    Synopsis:
891     #include <petscsys.h>
892    PetscErrorCode PetscNewLog(PetscObject obj,type **result)
893 
894    Not Collective
895 
896    Input Parameter:
897 .  obj - object memory is logged to
898 
899    Output Parameter:
900 .  result - memory allocated, sized to match pointer type
901 
902    Level: developer
903 
904 .seealso: `PetscFree()`, `PetscMalloc()`, `PetscNew()`, `PetscLogObjectMemory()`, `PetscCalloc1()`, `PetscMalloc1()`
905 
906 M*/
907 #define PetscNewLog(o,b) (PetscNew((b)) || PetscLogObjectMemory((PetscObject)o,sizeof(**(b))))
908 
909 /*MC
910    PetscFree - Frees memory
911 
912    Synopsis:
913     #include <petscsys.h>
914    PetscErrorCode PetscFree(void *memory)
915 
916    Not Collective
917 
918    Input Parameter:
919 .   memory - memory to free (the pointer is ALWAYS set to NULL upon success)
920 
921    Level: beginner
922 
923    Notes:
924    Do not free memory obtained with PetscMalloc2(), PetscCalloc2() etc, they must be freed with PetscFree2() etc.
925 
926    It is safe to call PetscFree() on a NULL pointer.
927 
928 .seealso: `PetscNew()`, `PetscMalloc()`, `PetscNewLog()`, `PetscMalloc1()`, `PetscCalloc1()`
929 
930 M*/
931 #define PetscFree(a)   ((*PetscTrFree)((void*)(a),__LINE__,PETSC_FUNCTION_NAME,__FILE__) || ((a) = NULL,0))
932 
933 /*MC
934    PetscFree2 - Frees 2 chunks of memory obtained with PetscMalloc2()
935 
936    Synopsis:
937     #include <petscsys.h>
938    PetscErrorCode PetscFree2(void *memory1,void *memory2)
939 
940    Not Collective
941 
942    Input Parameters:
943 +   memory1 - memory to free
944 -   memory2 - 2nd memory to free
945 
946    Level: developer
947 
948    Notes:
949     Memory must have been obtained with PetscMalloc2()
950 
951 .seealso: `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscFree()`
952 
953 M*/
954 #define PetscFree2(m1,m2)   PetscFreeA(2,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2))
955 
956 /*MC
957    PetscFree3 - Frees 3 chunks of memory obtained with PetscMalloc3()
958 
959    Synopsis:
960     #include <petscsys.h>
961    PetscErrorCode PetscFree3(void *memory1,void *memory2,void *memory3)
962 
963    Not Collective
964 
965    Input Parameters:
966 +   memory1 - memory to free
967 .   memory2 - 2nd memory to free
968 -   memory3 - 3rd memory to free
969 
970    Level: developer
971 
972    Notes:
973     Memory must have been obtained with PetscMalloc3()
974 
975 .seealso: `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscFree()`, `PetscMalloc3()`
976 
977 M*/
978 #define PetscFree3(m1,m2,m3)   PetscFreeA(3,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2),&(m3))
979 
980 /*MC
981    PetscFree4 - Frees 4 chunks of memory obtained with PetscMalloc4()
982 
983    Synopsis:
984     #include <petscsys.h>
985    PetscErrorCode PetscFree4(void *m1,void *m2,void *m3,void *m4)
986 
987    Not Collective
988 
989    Input Parameters:
990 +   m1 - memory to free
991 .   m2 - 2nd memory to free
992 .   m3 - 3rd memory to free
993 -   m4 - 4th memory to free
994 
995    Level: developer
996 
997    Notes:
998     Memory must have been obtained with PetscMalloc4()
999 
1000 .seealso: `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscFree()`, `PetscMalloc3()`, `PetscMalloc4()`
1001 
1002 M*/
1003 #define PetscFree4(m1,m2,m3,m4)   PetscFreeA(4,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2),&(m3),&(m4))
1004 
1005 /*MC
1006    PetscFree5 - Frees 5 chunks of memory obtained with PetscMalloc5()
1007 
1008    Synopsis:
1009     #include <petscsys.h>
1010    PetscErrorCode PetscFree5(void *m1,void *m2,void *m3,void *m4,void *m5)
1011 
1012    Not Collective
1013 
1014    Input Parameters:
1015 +   m1 - memory to free
1016 .   m2 - 2nd memory to free
1017 .   m3 - 3rd memory to free
1018 .   m4 - 4th memory to free
1019 -   m5 - 5th memory to free
1020 
1021    Level: developer
1022 
1023    Notes:
1024     Memory must have been obtained with PetscMalloc5()
1025 
1026 .seealso: `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscFree()`, `PetscMalloc3()`, `PetscMalloc4()`, `PetscMalloc5()`
1027 
1028 M*/
1029 #define PetscFree5(m1,m2,m3,m4,m5)   PetscFreeA(5,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2),&(m3),&(m4),&(m5))
1030 
1031 /*MC
1032    PetscFree6 - Frees 6 chunks of memory obtained with PetscMalloc6()
1033 
1034    Synopsis:
1035     #include <petscsys.h>
1036    PetscErrorCode PetscFree6(void *m1,void *m2,void *m3,void *m4,void *m5,void *m6)
1037 
1038    Not Collective
1039 
1040    Input Parameters:
1041 +   m1 - memory to free
1042 .   m2 - 2nd memory to free
1043 .   m3 - 3rd memory to free
1044 .   m4 - 4th memory to free
1045 .   m5 - 5th memory to free
1046 -   m6 - 6th memory to free
1047 
1048    Level: developer
1049 
1050    Notes:
1051     Memory must have been obtained with PetscMalloc6()
1052 
1053 .seealso: `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscFree()`, `PetscMalloc3()`, `PetscMalloc4()`, `PetscMalloc5()`, `PetscMalloc6()`
1054 
1055 M*/
1056 #define PetscFree6(m1,m2,m3,m4,m5,m6)   PetscFreeA(6,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2),&(m3),&(m4),&(m5),&(m6))
1057 
1058 /*MC
1059    PetscFree7 - Frees 7 chunks of memory obtained with PetscMalloc7()
1060 
1061    Synopsis:
1062     #include <petscsys.h>
1063    PetscErrorCode PetscFree7(void *m1,void *m2,void *m3,void *m4,void *m5,void *m6,void *m7)
1064 
1065    Not Collective
1066 
1067    Input Parameters:
1068 +   m1 - memory to free
1069 .   m2 - 2nd memory to free
1070 .   m3 - 3rd memory to free
1071 .   m4 - 4th memory to free
1072 .   m5 - 5th memory to free
1073 .   m6 - 6th memory to free
1074 -   m7 - 7th memory to free
1075 
1076    Level: developer
1077 
1078    Notes:
1079     Memory must have been obtained with PetscMalloc7()
1080 
1081 .seealso: `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscFree()`, `PetscMalloc3()`, `PetscMalloc4()`, `PetscMalloc5()`, `PetscMalloc6()`,
1082           `PetscMalloc7()`
1083 
1084 M*/
1085 #define PetscFree7(m1,m2,m3,m4,m5,m6,m7)   PetscFreeA(7,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2),&(m3),&(m4),&(m5),&(m6),&(m7))
1086 
1087 PETSC_EXTERN PetscErrorCode PetscMallocA(int,PetscBool,int,const char *,const char *,size_t,void *,...);
1088 PETSC_EXTERN PetscErrorCode PetscFreeA(int,int,const char *,const char *,void *,...);
1089 PETSC_EXTERN PetscErrorCode (*PetscTrMalloc)(size_t,PetscBool,int,const char[],const char[],void**);
1090 PETSC_EXTERN PetscErrorCode (*PetscTrFree)(void*,int,const char[],const char[]);
1091 PETSC_EXTERN PetscErrorCode (*PetscTrRealloc)(size_t,int,const char[],const char[],void**);
1092 PETSC_EXTERN PetscErrorCode PetscMallocSetCoalesce(PetscBool);
1093 PETSC_EXTERN PetscErrorCode PetscMallocSet(PetscErrorCode (*)(size_t,PetscBool,int,const char[],const char[],void**),PetscErrorCode (*)(void*,int,const char[],const char[]),PetscErrorCode (*)(size_t,int,const char[],const char[], void **));
1094 PETSC_EXTERN PetscErrorCode PetscMallocClear(void);
1095 
1096 /*
1097   Unlike PetscMallocSet and PetscMallocClear which overwrite the existing settings, these two functions save the previous choice of allocator, and should be used in pair.
1098 */
1099 PETSC_EXTERN PetscErrorCode PetscMallocSetDRAM(void);
1100 PETSC_EXTERN PetscErrorCode PetscMallocResetDRAM(void);
1101 #if defined(PETSC_HAVE_CUDA)
1102 PETSC_EXTERN PetscErrorCode PetscMallocSetCUDAHost(void);
1103 PETSC_EXTERN PetscErrorCode PetscMallocResetCUDAHost(void);
1104 #endif
1105 #if defined(PETSC_HAVE_HIP)
1106 PETSC_EXTERN PetscErrorCode PetscMallocSetHIPHost(void);
1107 PETSC_EXTERN PetscErrorCode PetscMallocResetHIPHost(void);
1108 #endif
1109 
1110 #define MPIU_PETSCLOGDOUBLE  MPI_DOUBLE
1111 #define MPIU_2PETSCLOGDOUBLE MPI_2DOUBLE_PRECISION
1112 
1113 /*
1114    Routines for tracing memory corruption/bleeding with default PETSc memory allocation
1115 */
1116 PETSC_EXTERN PetscErrorCode PetscMallocDump(FILE *);
1117 PETSC_EXTERN PetscErrorCode PetscMallocView(FILE *);
1118 PETSC_EXTERN PetscErrorCode PetscMallocGetCurrentUsage(PetscLogDouble *);
1119 PETSC_EXTERN PetscErrorCode PetscMallocGetMaximumUsage(PetscLogDouble *);
1120 PETSC_EXTERN PetscErrorCode PetscMallocPushMaximumUsage(int);
1121 PETSC_EXTERN PetscErrorCode PetscMallocPopMaximumUsage(int,PetscLogDouble*);
1122 PETSC_EXTERN PetscErrorCode PetscMallocSetDebug(PetscBool,PetscBool);
1123 PETSC_EXTERN PetscErrorCode PetscMallocGetDebug(PetscBool*,PetscBool*,PetscBool*);
1124 PETSC_EXTERN PetscErrorCode PetscMallocValidate(int,const char[],const char[]);
1125 PETSC_EXTERN PetscErrorCode PetscMallocViewSet(PetscLogDouble);
1126 PETSC_EXTERN PetscErrorCode PetscMallocViewGet(PetscBool*);
1127 PETSC_EXTERN PetscErrorCode PetscMallocLogRequestedSizeSet(PetscBool);
1128 PETSC_EXTERN PetscErrorCode PetscMallocLogRequestedSizeGet(PetscBool*);
1129 
1130 PETSC_EXTERN const char *const PetscDataTypes[];
1131 PETSC_EXTERN PetscErrorCode PetscDataTypeToMPIDataType(PetscDataType,MPI_Datatype*);
1132 PETSC_EXTERN PetscErrorCode PetscMPIDataTypeToPetscDataType(MPI_Datatype,PetscDataType*);
1133 PETSC_EXTERN PetscErrorCode PetscDataTypeGetSize(PetscDataType,size_t*);
1134 PETSC_EXTERN PetscErrorCode PetscDataTypeFromString(const char*,PetscDataType*,PetscBool*);
1135 
1136 /*
1137     Basic memory and string operations. These are usually simple wrappers
1138    around the basic Unix system calls, but a few of them have additional
1139    functionality and/or error checking.
1140 */
1141 PETSC_EXTERN PetscErrorCode PetscMemcmp(const void*,const void*,size_t,PetscBool  *);
1142 PETSC_EXTERN PetscErrorCode PetscStrlen(const char[],size_t*);
1143 PETSC_EXTERN PetscErrorCode PetscStrToArray(const char[],char,int*,char ***);
1144 PETSC_EXTERN PetscErrorCode PetscStrToArrayDestroy(int,char **);
1145 PETSC_EXTERN PetscErrorCode PetscStrcmp(const char[],const char[],PetscBool  *);
1146 PETSC_EXTERN PetscErrorCode PetscStrgrt(const char[],const char[],PetscBool  *);
1147 PETSC_EXTERN PetscErrorCode PetscStrcasecmp(const char[],const char[],PetscBool *);
1148 PETSC_EXTERN PetscErrorCode PetscStrncmp(const char[],const char[],size_t,PetscBool *);
1149 PETSC_EXTERN PetscErrorCode PetscStrcpy(char[],const char[]);
1150 PETSC_EXTERN PetscErrorCode PetscStrcat(char[],const char[]);
1151 PETSC_EXTERN PetscErrorCode PetscStrlcat(char[],const char[],size_t);
1152 PETSC_EXTERN PetscErrorCode PetscStrncpy(char[],const char[],size_t);
1153 PETSC_EXTERN PetscErrorCode PetscStrchr(const char[],char,char *[]);
1154 PETSC_EXTERN PetscErrorCode PetscStrtolower(char[]);
1155 PETSC_EXTERN PetscErrorCode PetscStrtoupper(char[]);
1156 PETSC_EXTERN PetscErrorCode PetscStrrchr(const char[],char,char *[]);
1157 PETSC_EXTERN PetscErrorCode PetscStrstr(const char[],const char[],char *[]);
1158 PETSC_EXTERN PetscErrorCode PetscStrrstr(const char[],const char[],char *[]);
1159 PETSC_EXTERN PetscErrorCode PetscStrendswith(const char[],const char[],PetscBool*);
1160 PETSC_EXTERN PetscErrorCode PetscStrbeginswith(const char[],const char[],PetscBool*);
1161 PETSC_EXTERN PetscErrorCode PetscStrendswithwhich(const char[],const char *const*,PetscInt*);
1162 PETSC_EXTERN PetscErrorCode PetscStrallocpy(const char[],char *[]);
1163 PETSC_EXTERN PetscErrorCode PetscStrArrayallocpy(const char *const*,char***);
1164 PETSC_EXTERN PetscErrorCode PetscStrArrayDestroy(char***);
1165 PETSC_EXTERN PetscErrorCode PetscStrNArrayallocpy(PetscInt,const char *const*,char***);
1166 PETSC_EXTERN PetscErrorCode PetscStrNArrayDestroy(PetscInt,char***);
1167 PETSC_EXTERN PetscErrorCode PetscStrreplace(MPI_Comm,const char[],char[],size_t);
1168 
1169 PETSC_EXTERN void PetscStrcmpNoError(const char[],const char[],PetscBool  *);
1170 
1171 PETSC_EXTERN PetscErrorCode PetscTokenCreate(const char[],const char,PetscToken*);
1172 PETSC_EXTERN PetscErrorCode PetscTokenFind(PetscToken,char *[]);
1173 PETSC_EXTERN PetscErrorCode PetscTokenDestroy(PetscToken*);
1174 
1175 PETSC_EXTERN PetscErrorCode PetscStrInList(const char[],const char[],char,PetscBool*);
1176 PETSC_EXTERN PetscErrorCode PetscEListFind(PetscInt,const char *const*,const char*,PetscInt*,PetscBool*);
1177 PETSC_EXTERN PetscErrorCode PetscEnumFind(const char *const*,const char*,PetscEnum*,PetscBool*);
1178 
1179 /*
1180    These are MPI operations for MPI_Allreduce() etc
1181 */
1182 PETSC_EXTERN MPI_Op MPIU_MAXSUM_OP;
1183 #if defined(PETSC_USE_REAL___FLOAT128) || defined(PETSC_USE_REAL___FP16)
1184 PETSC_EXTERN MPI_Op MPIU_SUM;
1185 PETSC_EXTERN MPI_Op MPIU_MAX;
1186 PETSC_EXTERN MPI_Op MPIU_MIN;
1187 #else
1188 #define MPIU_SUM MPI_SUM
1189 #define MPIU_MAX MPI_MAX
1190 #define MPIU_MIN MPI_MIN
1191 #endif
1192 PETSC_EXTERN PetscErrorCode PetscMaxSum(MPI_Comm,const PetscInt[],PetscInt*,PetscInt*);
1193 
1194 PETSC_EXTERN PetscErrorCode MPIULong_Send(void*,PetscInt,MPI_Datatype,PetscMPIInt,PetscMPIInt,MPI_Comm);
1195 PETSC_EXTERN PetscErrorCode MPIULong_Recv(void*,PetscInt,MPI_Datatype,PetscMPIInt,PetscMPIInt,MPI_Comm);
1196 
1197 PETSC_EXTERN const char *const PetscFileModes[];
1198 
1199 /*
1200     Defines PETSc error handling.
1201 */
1202 #include <petscerror.h>
1203 
1204 #define PETSC_SMALLEST_CLASSID  1211211
1205 PETSC_EXTERN PetscClassId PETSC_LARGEST_CLASSID;
1206 PETSC_EXTERN PetscClassId PETSC_OBJECT_CLASSID;
1207 PETSC_EXTERN PetscErrorCode PetscClassIdRegister(const char[],PetscClassId *);
1208 PETSC_EXTERN PetscErrorCode PetscObjectGetId(PetscObject,PetscObjectId*);
1209 PETSC_EXTERN PetscErrorCode PetscObjectCompareId(PetscObject,PetscObjectId,PetscBool*);
1210 
1211 /*
1212    Routines that get memory usage information from the OS
1213 */
1214 PETSC_EXTERN PetscErrorCode PetscMemoryGetCurrentUsage(PetscLogDouble *);
1215 PETSC_EXTERN PetscErrorCode PetscMemoryGetMaximumUsage(PetscLogDouble *);
1216 PETSC_EXTERN PetscErrorCode PetscMemorySetGetMaximumUsage(void);
1217 PETSC_EXTERN PetscErrorCode PetscMemoryTrace(const char[]);
1218 
1219 PETSC_EXTERN PetscErrorCode PetscSleep(PetscReal);
1220 
1221 /*
1222    Initialization of PETSc
1223 */
1224 PETSC_EXTERN PetscErrorCode PetscInitialize(int*,char***,const char[],const char[]);
1225 PETSC_EXTERN PetscErrorCode PetscInitializeNoPointers(int,char**,const char[],const char[]);
1226 PETSC_EXTERN PetscErrorCode PetscInitializeNoArguments(void);
1227 PETSC_EXTERN PetscErrorCode PetscInitialized(PetscBool *);
1228 PETSC_EXTERN PetscErrorCode PetscFinalized(PetscBool *);
1229 PETSC_EXTERN PetscErrorCode PetscFinalize(void);
1230 PETSC_EXTERN PetscErrorCode PetscInitializeFortran(void);
1231 PETSC_EXTERN PetscErrorCode PetscGetArgs(int*,char ***);
1232 PETSC_EXTERN PetscErrorCode PetscGetArguments(char ***);
1233 PETSC_EXTERN PetscErrorCode PetscFreeArguments(char **);
1234 
1235 PETSC_EXTERN PetscErrorCode PetscEnd(void);
1236 PETSC_EXTERN PetscErrorCode PetscSysInitializePackage(void);
1237 
1238 PETSC_EXTERN PetscErrorCode PetscPythonInitialize(const char[],const char[]);
1239 PETSC_EXTERN PetscErrorCode PetscPythonFinalize(void);
1240 PETSC_EXTERN PetscErrorCode PetscPythonPrintError(void);
1241 PETSC_EXTERN PetscErrorCode PetscPythonMonitorSet(PetscObject,const char[]);
1242 
1243 PETSC_EXTERN PetscErrorCode PetscMonitorCompare(PetscErrorCode (*)(void),void *,PetscErrorCode (*)(void**),PetscErrorCode (*)(void),void *,PetscErrorCode (*)(void**),PetscBool *);
1244 
1245 /*
1246      These are so that in extern C code we can caste function pointers to non-extern C
1247    function pointers. Since the regular C++ code expects its function pointers to be C++
1248 */
1249 PETSC_EXTERN_TYPEDEF typedef void (**PetscVoidStarFunction)(void);
1250 PETSC_EXTERN_TYPEDEF typedef void (*PetscVoidFunction)(void);
1251 PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*PetscErrorCodeFunction)(void);
1252 
1253 /*
1254     Functions that can act on any PETSc object.
1255 */
1256 PETSC_EXTERN PetscErrorCode PetscObjectDestroy(PetscObject*);
1257 PETSC_EXTERN PetscErrorCode PetscObjectGetComm(PetscObject,MPI_Comm *);
1258 PETSC_EXTERN PetscErrorCode PetscObjectGetClassId(PetscObject,PetscClassId *);
1259 PETSC_EXTERN PetscErrorCode PetscObjectGetClassName(PetscObject,const char *[]);
1260 PETSC_EXTERN PetscErrorCode PetscObjectGetType(PetscObject,const char *[]);
1261 PETSC_EXTERN PetscErrorCode PetscObjectSetName(PetscObject,const char[]);
1262 PETSC_EXTERN PetscErrorCode PetscObjectGetName(PetscObject,const char*[]);
1263 PETSC_EXTERN PetscErrorCode PetscObjectSetTabLevel(PetscObject,PetscInt);
1264 PETSC_EXTERN PetscErrorCode PetscObjectGetTabLevel(PetscObject,PetscInt*);
1265 PETSC_EXTERN PetscErrorCode PetscObjectIncrementTabLevel(PetscObject,PetscObject,PetscInt);
1266 PETSC_EXTERN PetscErrorCode PetscObjectReference(PetscObject);
1267 PETSC_EXTERN PetscErrorCode PetscObjectGetReference(PetscObject,PetscInt*);
1268 PETSC_EXTERN PetscErrorCode PetscObjectDereference(PetscObject);
1269 PETSC_EXTERN PetscErrorCode PetscObjectGetNewTag(PetscObject,PetscMPIInt*);
1270 PETSC_EXTERN PetscErrorCode PetscObjectCompose(PetscObject,const char[],PetscObject);
1271 PETSC_EXTERN PetscErrorCode PetscObjectRemoveReference(PetscObject,const char[]);
1272 PETSC_EXTERN PetscErrorCode PetscObjectQuery(PetscObject,const char[],PetscObject*);
1273 PETSC_EXTERN PetscErrorCode PetscObjectComposeFunction_Private(PetscObject,const char[],void (*)(void));
1274 #define PetscObjectComposeFunction(a,b,d) PetscObjectComposeFunction_Private(a,b,(PetscVoidFunction)(d))
1275 PETSC_EXTERN PetscErrorCode PetscObjectSetFromOptions(PetscObject);
1276 PETSC_EXTERN PetscErrorCode PetscObjectSetUp(PetscObject);
1277 PETSC_EXTERN PetscErrorCode PetscObjectSetPrintedOptions(PetscObject);
1278 PETSC_EXTERN PetscErrorCode PetscObjectInheritPrintedOptions(PetscObject,PetscObject);
1279 PETSC_EXTERN PetscErrorCode PetscCommGetNewTag(MPI_Comm,PetscMPIInt*);
1280 
1281 #include <petscviewertypes.h>
1282 #include <petscoptions.h>
1283 
1284 PETSC_EXTERN PetscErrorCode PetscMallocTraceSet(PetscViewer,PetscBool,PetscLogDouble);
1285 PETSC_EXTERN PetscErrorCode PetscMallocTraceGet(PetscBool*);
1286 
1287 PETSC_EXTERN PetscErrorCode PetscObjectsListGetGlobalNumbering(MPI_Comm,PetscInt,PetscObject*,PetscInt*,PetscInt*);
1288 
1289 PETSC_EXTERN PetscErrorCode PetscMemoryView(PetscViewer,const char[]);
1290 PETSC_EXTERN PetscErrorCode PetscObjectPrintClassNamePrefixType(PetscObject,PetscViewer);
1291 PETSC_EXTERN PetscErrorCode PetscObjectView(PetscObject,PetscViewer);
1292 #define PetscObjectQueryFunction(obj,name,fptr) PetscObjectQueryFunction_Private((obj),(name),(PetscVoidFunction*)(fptr))
1293 PETSC_EXTERN PetscErrorCode PetscObjectQueryFunction_Private(PetscObject,const char[],void (**)(void));
1294 PETSC_EXTERN PetscErrorCode PetscObjectSetOptionsPrefix(PetscObject,const char[]);
1295 PETSC_EXTERN PetscErrorCode PetscObjectAppendOptionsPrefix(PetscObject,const char[]);
1296 PETSC_EXTERN PetscErrorCode PetscObjectPrependOptionsPrefix(PetscObject,const char[]);
1297 PETSC_EXTERN PetscErrorCode PetscObjectGetOptionsPrefix(PetscObject,const char*[]);
1298 PETSC_EXTERN PetscErrorCode PetscObjectChangeTypeName(PetscObject,const char[]);
1299 PETSC_EXTERN PetscErrorCode PetscObjectRegisterDestroy(PetscObject);
1300 PETSC_EXTERN PetscErrorCode PetscObjectRegisterDestroyAll(void);
1301 PETSC_EXTERN PetscErrorCode PetscObjectViewFromOptions(PetscObject,PetscObject,const char[]);
1302 PETSC_EXTERN PetscErrorCode PetscObjectName(PetscObject);
1303 PETSC_EXTERN PetscErrorCode PetscObjectTypeCompare(PetscObject,const char[],PetscBool *);
1304 PETSC_EXTERN PetscErrorCode PetscObjectBaseTypeCompare(PetscObject,const char[],PetscBool *);
1305 PETSC_EXTERN PetscErrorCode PetscObjectTypeCompareAny(PetscObject,PetscBool*,const char[],...);
1306 PETSC_EXTERN PetscErrorCode PetscObjectBaseTypeCompareAny(PetscObject,PetscBool*,const char[],...);
1307 PETSC_EXTERN PetscErrorCode PetscRegisterFinalize(PetscErrorCode (*)(void));
1308 PETSC_EXTERN PetscErrorCode PetscRegisterFinalizeAll(void);
1309 
1310 #if defined(PETSC_HAVE_SAWS)
1311 PETSC_EXTERN PetscErrorCode PetscSAWsBlock(void);
1312 PETSC_EXTERN PetscErrorCode PetscObjectSAWsViewOff(PetscObject);
1313 PETSC_EXTERN PetscErrorCode PetscObjectSAWsSetBlock(PetscObject,PetscBool);
1314 PETSC_EXTERN PetscErrorCode PetscObjectSAWsBlock(PetscObject);
1315 PETSC_EXTERN PetscErrorCode PetscObjectSAWsGrantAccess(PetscObject);
1316 PETSC_EXTERN PetscErrorCode PetscObjectSAWsTakeAccess(PetscObject);
1317 PETSC_EXTERN void           PetscStackSAWsGrantAccess(void);
1318 PETSC_EXTERN void           PetscStackSAWsTakeAccess(void);
1319 PETSC_EXTERN PetscErrorCode PetscStackViewSAWs(void);
1320 PETSC_EXTERN PetscErrorCode PetscStackSAWsViewOff(void);
1321 
1322 #else
1323 #define PetscSAWsBlock()                        0
1324 #define PetscObjectSAWsViewOff(obj)             0
1325 #define PetscObjectSAWsSetBlock(obj,flg)        0
1326 #define PetscObjectSAWsBlock(obj)               0
1327 #define PetscObjectSAWsGrantAccess(obj)         0
1328 #define PetscObjectSAWsTakeAccess(obj)          0
1329 #define PetscStackViewSAWs()                    0
1330 #define PetscStackSAWsViewOff()                 0
1331 #define PetscStackSAWsTakeAccess()
1332 #define PetscStackSAWsGrantAccess()
1333 
1334 #endif
1335 
1336 PETSC_EXTERN PetscErrorCode PetscDLOpen(const char[],PetscDLMode,PetscDLHandle *);
1337 PETSC_EXTERN PetscErrorCode PetscDLClose(PetscDLHandle *);
1338 PETSC_EXTERN PetscErrorCode PetscDLSym(PetscDLHandle,const char[],void **);
1339 PETSC_EXTERN PetscErrorCode PetscDLAddr(void (*)(void), char **);
1340 #ifdef PETSC_HAVE_CXX
1341 PETSC_EXTERN PetscErrorCode PetscDemangleSymbol(const char *, char **);
1342 #endif
1343 
1344 #if defined(PETSC_USE_DEBUG)
1345 PETSC_EXTERN PetscErrorCode PetscMallocGetStack(void*,PetscStack**);
1346 #endif
1347 PETSC_EXTERN PetscErrorCode PetscObjectsDump(FILE*,PetscBool);
1348 
1349 PETSC_EXTERN PetscErrorCode PetscObjectListDestroy(PetscObjectList*);
1350 PETSC_EXTERN PetscErrorCode PetscObjectListFind(PetscObjectList,const char[],PetscObject*);
1351 PETSC_EXTERN PetscErrorCode PetscObjectListReverseFind(PetscObjectList,PetscObject,char**,PetscBool*);
1352 PETSC_EXTERN PetscErrorCode PetscObjectListAdd(PetscObjectList *,const char[],PetscObject);
1353 PETSC_EXTERN PetscErrorCode PetscObjectListRemoveReference(PetscObjectList *,const char[]);
1354 PETSC_EXTERN PetscErrorCode PetscObjectListDuplicate(PetscObjectList,PetscObjectList *);
1355 
1356 /*
1357     Dynamic library lists. Lists of names of routines in objects or in dynamic
1358   link libraries that will be loaded as needed.
1359 */
1360 
1361 #define PetscFunctionListAdd(list,name,fptr) PetscFunctionListAdd_Private((list),(name),(PetscVoidFunction)(fptr))
1362 PETSC_EXTERN PetscErrorCode PetscFunctionListAdd_Private(PetscFunctionList*,const char[],void (*)(void));
1363 PETSC_EXTERN PetscErrorCode PetscFunctionListDestroy(PetscFunctionList*);
1364 #define PetscFunctionListFind(list,name,fptr) PetscFunctionListFind_Private((list),(name),(PetscVoidFunction*)(fptr))
1365 PETSC_EXTERN PetscErrorCode PetscFunctionListFind_Private(PetscFunctionList,const char[],void (**)(void));
1366 PETSC_EXTERN PetscErrorCode PetscFunctionListPrintTypes(MPI_Comm,FILE*,const char[],const char[],const char[],const char[],PetscFunctionList,const char[],const char[]);
1367 PETSC_EXTERN PetscErrorCode PetscFunctionListDuplicate(PetscFunctionList,PetscFunctionList *);
1368 PETSC_EXTERN PetscErrorCode PetscFunctionListView(PetscFunctionList,PetscViewer);
1369 PETSC_EXTERN PetscErrorCode PetscFunctionListGet(PetscFunctionList,const char ***,int*);
1370 
1371 PETSC_EXTERN PetscDLLibrary  PetscDLLibrariesLoaded;
1372 PETSC_EXTERN PetscErrorCode PetscDLLibraryAppend(MPI_Comm,PetscDLLibrary *,const char[]);
1373 PETSC_EXTERN PetscErrorCode PetscDLLibraryPrepend(MPI_Comm,PetscDLLibrary *,const char[]);
1374 PETSC_EXTERN PetscErrorCode PetscDLLibrarySym(MPI_Comm,PetscDLLibrary *,const char[],const char[],void **);
1375 PETSC_EXTERN PetscErrorCode PetscDLLibraryPrintPath(PetscDLLibrary);
1376 PETSC_EXTERN PetscErrorCode PetscDLLibraryRetrieve(MPI_Comm,const char[],char *,size_t,PetscBool  *);
1377 PETSC_EXTERN PetscErrorCode PetscDLLibraryOpen(MPI_Comm,const char[],PetscDLLibrary *);
1378 PETSC_EXTERN PetscErrorCode PetscDLLibraryClose(PetscDLLibrary);
1379 
1380 /*
1381      Useful utility routines
1382 */
1383 PETSC_EXTERN PetscErrorCode PetscSplitOwnership(MPI_Comm,PetscInt*,PetscInt*);
1384 PETSC_EXTERN PetscErrorCode PetscSplitOwnershipBlock(MPI_Comm,PetscInt,PetscInt*,PetscInt*);
1385 PETSC_EXTERN PetscErrorCode PetscSplitOwnershipEqual(MPI_Comm,PetscInt*,PetscInt*);
1386 PETSC_EXTERN PetscErrorCode PetscSequentialPhaseBegin(MPI_Comm,PetscMPIInt);
1387 PETSC_EXTERN PetscErrorCode PetscSequentialPhaseEnd(MPI_Comm,PetscMPIInt);
1388 PETSC_EXTERN PetscErrorCode PetscBarrier(PetscObject);
1389 PETSC_EXTERN PetscErrorCode PetscMPIDump(FILE*);
1390 PETSC_EXTERN PetscErrorCode PetscGlobalMinMaxInt(MPI_Comm,const PetscInt[2],PetscInt[2]);
1391 PETSC_EXTERN PetscErrorCode PetscGlobalMinMaxReal(MPI_Comm,const PetscReal[2],PetscReal[2]);
1392 
1393 /*MC
1394     PetscNot - negates a logical type value and returns result as a PetscBool
1395 
1396     Notes:
1397     This is useful in cases like
1398 $     int        *a;
1399 $     PetscBool  flag = PetscNot(a)
1400      where !a would not return a PetscBool because we cannot provide a cast from int to PetscBool in C.
1401 
1402     Level: beginner
1403 
1404     .seealso `:` `PetscBool`, `PETSC_TRUE`, `PETSC_FALSE`
1405 M*/
1406 #define PetscNot(a) ((a) ? PETSC_FALSE : PETSC_TRUE)
1407 
1408 /*MC
1409     PetscHelpPrintf - Prints help messages.
1410 
1411    Synopsis:
1412     #include <petscsys.h>
1413      PetscErrorCode (*PetscHelpPrintf)(MPI_Comm comm, const char format[],args);
1414 
1415     Collective on comm
1416 
1417     Input Parameters:
1418 +  comm - the MPI communicator over which the help message is printed
1419 .  format - the usual printf() format string
1420 -  args - arguments to be printed
1421 
1422    Level: developer
1423 
1424    Fortran Note:
1425      This routine is not supported in Fortran.
1426 
1427    Note:
1428      You can change how help messages are printed by replacing the function pointer with a function that does not simply write to stdout.
1429 
1430       To use, write your own function, for example,
1431 $PetscErrorCode mypetschelpprintf(MPI_Comm comm,const char format[],....)
1432 ${
1433 $ PetscFunctionReturn(0);
1434 $}
1435 then do the assigment
1436 $    PetscHelpPrintf = mypetschelpprintf;
1437    You can do the assignment before PetscInitialize().
1438 
1439   The default routine used is called PetscHelpPrintfDefault().
1440 
1441 .seealso: `PetscFPrintf()`, `PetscSynchronizedPrintf()`, `PetscErrorPrintf()`
1442 M*/
1443 PETSC_EXTERN PetscErrorCode (*PetscHelpPrintf)(MPI_Comm,const char[],...) PETSC_ATTRIBUTE_FORMAT(2,3);
1444 
1445 /*
1446      Defines PETSc profiling.
1447 */
1448 #include <petsclog.h>
1449 
1450 /*
1451       Simple PETSc parallel IO for ASCII printing
1452 */
1453 PETSC_EXTERN PetscErrorCode PetscFixFilename(const char[],char[]);
1454 PETSC_EXTERN PetscErrorCode PetscFOpen(MPI_Comm,const char[],const char[],FILE**);
1455 PETSC_EXTERN PetscErrorCode PetscFClose(MPI_Comm,FILE*);
1456 PETSC_EXTERN PetscErrorCode PetscFPrintf(MPI_Comm,FILE*,const char[],...) PETSC_ATTRIBUTE_FORMAT(3,4);
1457 PETSC_EXTERN PetscErrorCode PetscPrintf(MPI_Comm,const char[],...) PETSC_ATTRIBUTE_FORMAT(2,3);
1458 PETSC_EXTERN PetscErrorCode PetscSNPrintf(char*,size_t,const char [],...) PETSC_ATTRIBUTE_FORMAT(3,4);
1459 PETSC_EXTERN PetscErrorCode PetscSNPrintfCount(char*,size_t,const char [],size_t*,...) PETSC_ATTRIBUTE_FORMAT(3,5);
1460 PETSC_EXTERN PetscErrorCode PetscFormatRealArray(char[],size_t,const char*,PetscInt,const PetscReal[]);
1461 
1462 PETSC_EXTERN PetscErrorCode PetscErrorPrintfDefault(const char [],...) PETSC_ATTRIBUTE_FORMAT(1,2);
1463 PETSC_EXTERN PetscErrorCode PetscErrorPrintfNone(const char [],...) PETSC_ATTRIBUTE_FORMAT(1,2);
1464 PETSC_EXTERN PetscErrorCode PetscHelpPrintfDefault(MPI_Comm,const char [],...) PETSC_ATTRIBUTE_FORMAT(2,3);
1465 
1466 PETSC_EXTERN PetscErrorCode PetscFormatConvertGetSize(const char*,size_t*);
1467 PETSC_EXTERN PetscErrorCode PetscFormatConvert(const char*,char *);
1468 
1469 #if defined(PETSC_HAVE_POPEN)
1470 PETSC_EXTERN PetscErrorCode PetscPOpen(MPI_Comm,const char[],const char[],const char[],FILE **);
1471 PETSC_EXTERN PetscErrorCode PetscPClose(MPI_Comm,FILE*);
1472 PETSC_EXTERN PetscErrorCode PetscPOpenSetMachine(const char[]);
1473 #endif
1474 
1475 PETSC_EXTERN PetscErrorCode PetscSynchronizedPrintf(MPI_Comm,const char[],...) PETSC_ATTRIBUTE_FORMAT(2,3);
1476 PETSC_EXTERN PetscErrorCode PetscSynchronizedFPrintf(MPI_Comm,FILE*,const char[],...) PETSC_ATTRIBUTE_FORMAT(3,4);
1477 PETSC_EXTERN PetscErrorCode PetscSynchronizedFlush(MPI_Comm,FILE*);
1478 PETSC_EXTERN PetscErrorCode PetscSynchronizedFGets(MPI_Comm,FILE*,size_t,char[]);
1479 PETSC_EXTERN PetscErrorCode PetscStartMatlab(MPI_Comm,const char[],const char[],FILE**);
1480 PETSC_EXTERN PetscErrorCode PetscStartJava(MPI_Comm,const char[],const char[],FILE**);
1481 PETSC_EXTERN PetscErrorCode PetscGetPetscDir(const char*[]);
1482 
1483 PETSC_EXTERN PetscClassId PETSC_CONTAINER_CLASSID;
1484 PETSC_EXTERN PetscErrorCode PetscContainerGetPointer(PetscContainer,void**);
1485 PETSC_EXTERN PetscErrorCode PetscContainerSetPointer(PetscContainer,void*);
1486 PETSC_EXTERN PetscErrorCode PetscContainerDestroy(PetscContainer*);
1487 PETSC_EXTERN PetscErrorCode PetscContainerCreate(MPI_Comm,PetscContainer*);
1488 PETSC_EXTERN PetscErrorCode PetscContainerSetUserDestroy(PetscContainer,PetscErrorCode (*)(void*));
1489 PETSC_EXTERN PetscErrorCode PetscContainerUserDestroyDefault(void*);
1490 
1491 /*
1492    For use in debuggers
1493 */
1494 PETSC_EXTERN PetscMPIInt PetscGlobalRank;
1495 PETSC_EXTERN PetscMPIInt PetscGlobalSize;
1496 PETSC_EXTERN PetscErrorCode PetscIntView(PetscInt,const PetscInt[],PetscViewer);
1497 PETSC_EXTERN PetscErrorCode PetscRealView(PetscInt,const PetscReal[],PetscViewer);
1498 PETSC_EXTERN PetscErrorCode PetscScalarView(PetscInt,const PetscScalar[],PetscViewer);
1499 
1500 #include <stddef.h>
1501 #include <string.h>             /* for memcpy, memset */
1502 #include <stdlib.h>
1503 
1504 #if defined(PETSC_HAVE_XMMINTRIN_H) && !defined(__CUDACC__)
1505 #include <xmmintrin.h>
1506 #endif
1507 
1508 /*@C
1509    PetscMemmove - Copies n bytes, beginning at location b, to the space
1510    beginning at location a. Copying  between regions that overlap will
1511    take place correctly. Use PetscMemcpy() if the locations do not overlap
1512 
1513    Not Collective
1514 
1515    Input Parameters:
1516 +  b - pointer to initial memory space
1517 .  a - pointer to copy space
1518 -  n - length (in bytes) of space to copy
1519 
1520    Level: intermediate
1521 
1522    Note:
1523    PetscArraymove() is preferred
1524    This routine is analogous to memmove().
1525 
1526    Developers Note: This is inlined for performance
1527 
1528 .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscMemzero()`, `PetscArraycmp()`, `PetscArraycpy()`, `PetscStrallocpy()`,
1529           `PetscArraymove()`
1530 @*/
1531 static inline PetscErrorCode PetscMemmove(void *a,const void *b,size_t n)
1532 {
1533   PetscFunctionBegin;
1534   if (n > 0) {
1535     PetscCheck(a,PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy to null pointer");
1536     PetscCheck(b,PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy from a null pointer");
1537   }
1538 #if !defined(PETSC_HAVE_MEMMOVE)
1539   if (a < b) {
1540     if (a <= b - n) memcpy(a,b,n);
1541     else {
1542       memcpy(a,b,(int)(b - a));
1543       PetscMemmove(b,b + (int)(b - a),n - (int)(b - a));
1544     }
1545   } else {
1546     if (b <= a - n) memcpy(a,b,n);
1547     else {
1548       memcpy(b + n,b + (n - (int)(a - b)),(int)(a - b));
1549       PetscMemmove(a,b,n - (int)(a - b));
1550     }
1551   }
1552 #else
1553   memmove((char*)(a),(char*)(b),n);
1554 #endif
1555   PetscFunctionReturn(0);
1556 }
1557 
1558 /*@C
1559    PetscMemcpy - Copies n bytes, beginning at location b, to the space
1560    beginning at location a. The two memory regions CANNOT overlap, use
1561    PetscMemmove() in that case.
1562 
1563    Not Collective
1564 
1565    Input Parameters:
1566 +  b - pointer to initial memory space
1567 -  n - length (in bytes) of space to copy
1568 
1569    Output Parameter:
1570 .  a - pointer to copy space
1571 
1572    Level: intermediate
1573 
1574    Compile Option:
1575     PETSC_PREFER_DCOPY_FOR_MEMCPY will cause the BLAS dcopy() routine to be used
1576                                   for memory copies on double precision values.
1577     PETSC_PREFER_COPY_FOR_MEMCPY will cause C code to be used
1578                                   for memory copies on double precision values.
1579     PETSC_PREFER_FORTRAN_FORMEMCPY will cause Fortran code to be used
1580                                   for memory copies on double precision values.
1581 
1582    Note:
1583    Prefer PetscArraycpy()
1584    This routine is analogous to memcpy().
1585    Not available from Fortran
1586 
1587    Developer Note: this is inlined for fastest performance
1588 
1589 .seealso: `PetscMemzero()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscArraycmp()`, `PetscArraycpy()`, `PetscMemmove()`, `PetscStrallocpy()`
1590 
1591 @*/
1592 static inline PetscErrorCode PetscMemcpy(void *a,const void *b,size_t n)
1593 {
1594 #if defined(PETSC_USE_DEBUG)
1595   size_t al = (size_t) a,bl = (size_t) b;
1596   size_t nl = (size_t) n;
1597   PetscFunctionBegin;
1598   if (n > 0) {
1599     PetscCheck(b,PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy from a null pointer");
1600     PetscCheck(a,PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy to a null pointer");
1601   }
1602 #else
1603   PetscFunctionBegin;
1604 #endif
1605   if (a != b && n > 0) {
1606 #if defined(PETSC_USE_DEBUG)
1607     PetscCheck(!((al > bl && (al - bl) < nl) || (bl - al) < nl),PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"Memory regions overlap: either use PetscMemmov()\n\
1608               or make sure your copy regions and lengths are correct. \n\
1609               Length (bytes) %zu first address %zu second address %zu",nl,al,bl);
1610 #endif
1611 #if (defined(PETSC_PREFER_DCOPY_FOR_MEMCPY) || defined(PETSC_PREFER_COPY_FOR_MEMCPY) || defined(PETSC_PREFER_FORTRAN_FORMEMCPY))
1612    if (!(a % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) {
1613       size_t len = n/sizeof(PetscScalar);
1614 #if defined(PETSC_PREFER_DCOPY_FOR_MEMCPY)
1615       PetscBLASInt one = 1,blen;
1616       PetscCall(PetscBLASIntCast(len,&blen));
1617       PetscStackCallBLAS("BLAScopy",BLAScopy_(&blen,(PetscScalar *)b,&one,(PetscScalar *)a,&one));
1618 #elif defined(PETSC_PREFER_FORTRAN_FORMEMCPY)
1619       fortrancopy_(&len,(PetscScalar*)b,(PetscScalar*)a);
1620 #else
1621       PetscScalar *x = (PetscScalar*)b, *y = (PetscScalar*)a;
1622       for (size_t i=0; i<len; i++) y[i] = x[i];
1623 #endif
1624     } else {
1625       memcpy((char*)(a),(char*)(b),n);
1626     }
1627 #else
1628     memcpy((char*)(a),(char*)(b),n);
1629 #endif
1630   }
1631   PetscFunctionReturn(0);
1632 }
1633 
1634 /*@C
1635    PetscMemzero - Zeros the specified memory.
1636 
1637    Not Collective
1638 
1639    Input Parameters:
1640 +  a - pointer to beginning memory location
1641 -  n - length (in bytes) of memory to initialize
1642 
1643    Level: intermediate
1644 
1645    Compile Option:
1646    PETSC_PREFER_BZERO - on certain machines (the IBM RS6000) the bzero() routine happens
1647   to be faster than the memset() routine. This flag causes the bzero() routine to be used.
1648 
1649    Not available from Fortran
1650    Prefer PetscArrayzero()
1651 
1652    Developer Note: this is inlined for fastest performance
1653 
1654 .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscArraycmp()`, `PetscArraycpy()`, `PetscMemmove()`, `PetscStrallocpy()`
1655 @*/
1656 static inline PetscErrorCode PetscMemzero(void *a,size_t n)
1657 {
1658   if (n > 0) {
1659 #if defined(PETSC_USE_DEBUG)
1660     PetscCheck(a,PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to zero at a null pointer with %zu bytes",n);
1661 #endif
1662 #if defined(PETSC_PREFER_ZERO_FOR_MEMZERO)
1663     if (!(((long) a) % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) {
1664       size_t      i,len = n/sizeof(PetscScalar);
1665       PetscScalar *x = (PetscScalar*)a;
1666       for (i=0; i<len; i++) x[i] = 0.0;
1667     } else {
1668 #elif defined(PETSC_PREFER_FORTRAN_FOR_MEMZERO)
1669     if (!(((long) a) % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) {
1670       PetscInt len = n/sizeof(PetscScalar);
1671       fortranzero_(&len,(PetscScalar*)a);
1672     } else {
1673 #endif
1674 #if defined(PETSC_PREFER_BZERO)
1675       bzero((char *)a,n);
1676 #else
1677       memset((char*)a,0,n);
1678 #endif
1679 #if defined(PETSC_PREFER_ZERO_FOR_MEMZERO) || defined(PETSC_PREFER_FORTRAN_FOR_MEMZERO)
1680     }
1681 #endif
1682   }
1683   return 0;
1684 }
1685 
1686 /*MC
1687    PetscArraycmp - Compares two arrays in memory.
1688 
1689    Synopsis:
1690     #include <petscsys.h>
1691     PetscErrorCode PetscArraycmp(const anytype *str1,const anytype *str2,size_t cnt,PetscBool *e)
1692 
1693    Not Collective
1694 
1695    Input Parameters:
1696 +  str1 - First array
1697 .  str2 - Second array
1698 -  cnt  - Count of the array, not in bytes, but number of entries in the arrays
1699 
1700    Output Parameters:
1701 .   e - PETSC_TRUE if equal else PETSC_FALSE.
1702 
1703    Level: intermediate
1704 
1705    Note:
1706    This routine is a preferred replacement to PetscMemcmp()
1707    The arrays must be of the same type
1708 
1709 .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscMemzero()`, `PetscArraycpy()`, `PetscMemmove()`, `PetscStrallocpy()`,
1710           `PetscArraymove()`
1711 M*/
1712 #define  PetscArraycmp(str1,str2,cnt,e) ((sizeof(*(str1)) != sizeof(*(str2))) || PetscMemcmp(str1,str2,(size_t)(cnt)*sizeof(*(str1)),e))
1713 
1714 /*MC
1715    PetscArraymove - Copies from one array in memory to another, the arrays may overlap. Use PetscArraycpy() when the arrays
1716                     do not overlap
1717 
1718    Synopsis:
1719     #include <petscsys.h>
1720     PetscErrorCode PetscArraymove(anytype *str1,const anytype *str2,size_t cnt)
1721 
1722    Not Collective
1723 
1724    Input Parameters:
1725 +  str1 - First array
1726 .  str2 - Second array
1727 -  cnt  - Count of the array, not in bytes, but number of entries in the arrays
1728 
1729    Level: intermediate
1730 
1731    Note:
1732    This routine is a preferred replacement to PetscMemmove()
1733    The arrays must be of the same type
1734 
1735 .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscMemzero()`, `PetscArraycpy()`, `PetscMemmove()`, `PetscArraycmp()`, `PetscStrallocpy()`
1736 M*/
1737 #define  PetscArraymove(str1,str2,cnt) ((sizeof(*(str1)) != sizeof(*(str2))) || PetscMemmove(str1,str2,(size_t)(cnt)*sizeof(*(str1))))
1738 
1739 /*MC
1740    PetscArraycpy - Copies from one array in memory to another
1741 
1742    Synopsis:
1743     #include <petscsys.h>
1744     PetscErrorCode PetscArraycpy(anytype *str1,const anytype *str2,size_t cnt)
1745 
1746    Not Collective
1747 
1748    Input Parameters:
1749 +  str1 - First array (destination)
1750 .  str2 - Second array (source)
1751 -  cnt  - Count of the array, not in bytes, but number of entries in the arrays
1752 
1753    Level: intermediate
1754 
1755    Note:
1756    This routine is a preferred replacement to PetscMemcpy()
1757    The arrays must be of the same type
1758 
1759 .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscMemzero()`, `PetscArraymove()`, `PetscMemmove()`, `PetscArraycmp()`, `PetscStrallocpy()`
1760 M*/
1761 #define  PetscArraycpy(str1,str2,cnt) ((sizeof(*(str1)) != sizeof(*(str2))) || PetscMemcpy(str1,str2,(size_t)(cnt)*sizeof(*(str1))))
1762 
1763 /*MC
1764    PetscArrayzero - Zeros an array in memory.
1765 
1766    Synopsis:
1767     #include <petscsys.h>
1768     PetscErrorCode PetscArrayzero(anytype *str1,size_t cnt)
1769 
1770    Not Collective
1771 
1772    Input Parameters:
1773 +  str1 - array
1774 -  cnt  - Count of the array, not in bytes, but number of entries in the array
1775 
1776    Level: intermediate
1777 
1778    Note:
1779    This routine is a preferred replacement to PetscMemzero()
1780 
1781 .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscMemzero()`, `PetscArraycmp()`, `PetscArraycpy()`, `PetscMemmove()`, `PetscStrallocpy()`, `PetscArraymove()`
1782 M*/
1783 #define  PetscArrayzero(str1,cnt) PetscMemzero(str1,(size_t)(cnt)*sizeof(*(str1)))
1784 
1785 /*MC
1786    PetscPrefetchBlock - Prefetches a block of memory
1787 
1788    Synopsis:
1789     #include <petscsys.h>
1790     void PetscPrefetchBlock(const anytype *a,size_t n,int rw,int t)
1791 
1792    Not Collective
1793 
1794    Input Parameters:
1795 +  a - pointer to first element to fetch (any type but usually PetscInt or PetscScalar)
1796 .  n - number of elements to fetch
1797 .  rw - 1 if the memory will be written to, otherwise 0 (ignored by many processors)
1798 -  t - temporal locality (PETSC_PREFETCH_HINT_{NTA,T0,T1,T2}), see note
1799 
1800    Level: developer
1801 
1802    Notes:
1803    The last two arguments (rw and t) must be compile-time constants.
1804 
1805    Adopting Intel's x86/x86-64 conventions, there are four levels of temporal locality.  Not all architectures offer
1806    equivalent locality hints, but the following macros are always defined to their closest analogue.
1807 +  PETSC_PREFETCH_HINT_NTA - Non-temporal.  Prefetches directly to L1, evicts to memory (skips higher level cache unless it was already there when prefetched).
1808 .  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.
1809 .  PETSC_PREFETCH_HINT_T1 - Fetch to level 2 and higher (not L1).
1810 -  PETSC_PREFETCH_HINT_T2 - Fetch to high-level cache only.  (On many systems, T0 and T1 are equivalent.)
1811 
1812    This function does nothing on architectures that do not support prefetch and never errors (even if passed an invalid
1813    address).
1814 
1815 M*/
1816 #define PetscPrefetchBlock(a,n,rw,t) do {                               \
1817     const char *_p = (const char*)(a),*_end = (const char*)((a)+(n));   \
1818     for (; _p < _end; _p += PETSC_LEVEL1_DCACHE_LINESIZE) PETSC_Prefetch(_p,(rw),(t)); \
1819   } while (0)
1820 
1821 /*
1822       Determine if some of the kernel computation routines use
1823    Fortran (rather than C) for the numerical calculations. On some machines
1824    and compilers (like complex numbers) the Fortran version of the routines
1825    is faster than the C/C++ versions. The flag --with-fortran-kernels
1826    should be used with ./configure to turn these on.
1827 */
1828 #if defined(PETSC_USE_FORTRAN_KERNELS)
1829 
1830 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTCRL)
1831 #define PETSC_USE_FORTRAN_KERNEL_MULTCRL
1832 #endif
1833 
1834 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTAIJPERM)
1835 #define PETSC_USE_FORTRAN_KERNEL_MULTAIJPERM
1836 #endif
1837 
1838 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTAIJ)
1839 #define PETSC_USE_FORTRAN_KERNEL_MULTAIJ
1840 #endif
1841 
1842 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ)
1843 #define PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ
1844 #endif
1845 
1846 #if !defined(PETSC_USE_FORTRAN_KERNEL_NORM)
1847 #define PETSC_USE_FORTRAN_KERNEL_NORM
1848 #endif
1849 
1850 #if !defined(PETSC_USE_FORTRAN_KERNEL_MAXPY)
1851 #define PETSC_USE_FORTRAN_KERNEL_MAXPY
1852 #endif
1853 
1854 #if !defined(PETSC_USE_FORTRAN_KERNEL_SOLVEAIJ)
1855 #define PETSC_USE_FORTRAN_KERNEL_SOLVEAIJ
1856 #endif
1857 
1858 #if !defined(PETSC_USE_FORTRAN_KERNEL_RELAXAIJ)
1859 #define PETSC_USE_FORTRAN_KERNEL_RELAXAIJ
1860 #endif
1861 
1862 #if !defined(PETSC_USE_FORTRAN_KERNEL_SOLVEBAIJ)
1863 #define PETSC_USE_FORTRAN_KERNEL_SOLVEBAIJ
1864 #endif
1865 
1866 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ)
1867 #define PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ
1868 #endif
1869 
1870 #if !defined(PETSC_USE_FORTRAN_KERNEL_MDOT)
1871 #define PETSC_USE_FORTRAN_KERNEL_MDOT
1872 #endif
1873 
1874 #if !defined(PETSC_USE_FORTRAN_KERNEL_XTIMESY)
1875 #define PETSC_USE_FORTRAN_KERNEL_XTIMESY
1876 #endif
1877 
1878 #if !defined(PETSC_USE_FORTRAN_KERNEL_AYPX)
1879 #define PETSC_USE_FORTRAN_KERNEL_AYPX
1880 #endif
1881 
1882 #if !defined(PETSC_USE_FORTRAN_KERNEL_WAXPY)
1883 #define PETSC_USE_FORTRAN_KERNEL_WAXPY
1884 #endif
1885 
1886 #endif
1887 
1888 /*
1889     Macros for indicating code that should be compiled with a C interface,
1890    rather than a C++ interface. Any routines that are dynamically loaded
1891    (such as the PCCreate_XXX() routines) must be wrapped so that the name
1892    mangler does not change the functions symbol name. This just hides the
1893    ugly extern "C" {} wrappers.
1894 */
1895 #if defined(__cplusplus)
1896 #  define EXTERN_C_BEGIN extern "C" {
1897 #  define EXTERN_C_END }
1898 #else
1899 #  define EXTERN_C_BEGIN
1900 #  define EXTERN_C_END
1901 #endif
1902 
1903 /* --------------------------------------------------------------------*/
1904 
1905 /*MC
1906     MPI_Comm - the basic object used by MPI to determine which processes are involved in a
1907         communication
1908 
1909    Level: beginner
1910 
1911    Note: This manual page is a place-holder because MPICH does not have a manual page for MPI_Comm
1912 
1913 .seealso: `PETSC_COMM_WORLD`, `PETSC_COMM_SELF`
1914 M*/
1915 
1916 #if defined(PETSC_HAVE_MPIIO)
1917 PETSC_EXTERN PetscErrorCode MPIU_File_write_all(MPI_File,void*,PetscMPIInt,MPI_Datatype,MPI_Status*);
1918 PETSC_EXTERN PetscErrorCode MPIU_File_read_all(MPI_File,void*,PetscMPIInt,MPI_Datatype,MPI_Status*);
1919 PETSC_EXTERN PetscErrorCode MPIU_File_write_at(MPI_File,MPI_Offset,void*,PetscMPIInt,MPI_Datatype,MPI_Status*);
1920 PETSC_EXTERN PetscErrorCode MPIU_File_read_at(MPI_File,MPI_Offset,void*,PetscMPIInt,MPI_Datatype,MPI_Status*);
1921 PETSC_EXTERN PetscErrorCode MPIU_File_write_at_all(MPI_File,MPI_Offset,void*,PetscMPIInt,MPI_Datatype,MPI_Status*);
1922 PETSC_EXTERN PetscErrorCode MPIU_File_read_at_all(MPI_File,MPI_Offset,void*,PetscMPIInt,MPI_Datatype,MPI_Status*);
1923 #endif
1924 
1925 /* the following petsc_static_inline require petscerror.h */
1926 
1927 /* Limit MPI to 32-bits */
1928 #define PETSC_MPI_INT_MAX  2147483647
1929 #define PETSC_MPI_INT_MIN -2147483647
1930 /* Limit BLAS to 32-bits */
1931 #define PETSC_BLAS_INT_MAX  2147483647
1932 #define PETSC_BLAS_INT_MIN -2147483647
1933 #define PETSC_CUBLAS_INT_MAX  2147483647
1934 
1935 /*@C
1936     PetscIntCast - casts a PetscInt64 (which is 64 bits in size) to a PetscInt (which may be 32 bits in size), generates an
1937          error if the PetscInt is not large enough to hold the number.
1938 
1939    Not Collective
1940 
1941    Input Parameter:
1942 .     a - the PetscInt64 value
1943 
1944    Output Parameter:
1945 .     b - the resulting PetscInt value
1946 
1947    Level: advanced
1948 
1949    Notes: If integers needed for the applications are too large to fit in 32 bit ints you can ./configure using --with-64-bit-indices to make PetscInt use 64 bit ints
1950 
1951    Not available from Fortran
1952 
1953 .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscMPIIntCast()`, `PetscBLASIntCast()`, `PetscIntMultError()`, `PetscIntSumError()`
1954 @*/
1955 static inline PetscErrorCode PetscIntCast(PetscInt64 a,PetscInt *b)
1956 {
1957   PetscFunctionBegin;
1958 #if !defined(PETSC_USE_64BIT_INDICES)
1959   if (a > PETSC_MAX_INT) {
1960     *b = 0;
1961     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"%" PetscInt64_FMT " is too big for PetscInt, you may need to ./configure using --with-64-bit-indices",a);
1962   }
1963 #endif
1964   *b = (PetscInt)(a);
1965   PetscFunctionReturn(0);
1966 }
1967 
1968 /*@C
1969     PetscCountCast - casts a PetscCount to a PetscInt (which may be 32 bits in size), generates an
1970          error if the PetscInt is not large enough to hold the number.
1971 
1972    Not Collective
1973 
1974    Input Parameter:
1975 .     a - the PetscCount value
1976 
1977    Output Parameter:
1978 .     b - the resulting PetscInt value
1979 
1980    Level: advanced
1981 
1982    Notes:
1983      If integers needed for the applications are too large to fit in 32 bit ints you can ./configure using --with-64-bit-indices to make PetscInt use 64 bit ints
1984 
1985    Not available from Fortran
1986 
1987 .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscMPIIntCast()`, `PetscBLASIntCast()`, `PetscIntMultError()`, `PetscIntSumError()`, `PetscIntCast()`
1988 @*/
1989 static inline PetscErrorCode PetscCountCast(PetscCount a,PetscInt *b)
1990 {
1991   PetscFunctionBegin;
1992   if (sizeof(PetscCount) > sizeof(PetscInt) && a > PETSC_MAX_INT) {
1993     *b = 0;
1994     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"%" PetscCount_FMT " is too big for PetscInt, you may need to ./configure using --with-64-bit-indices",a);
1995   }
1996   *b = (PetscInt)(a);
1997   PetscFunctionReturn(0);
1998 }
1999 
2000 /*@C
2001     PetscBLASIntCast - casts a PetscInt (which may be 64 bits in size) to a PetscBLASInt (which may be 32 bits in size), generates an
2002          error if the PetscBLASInt is not large enough to hold the number.
2003 
2004    Not Collective
2005 
2006    Input Parameter:
2007 .     a - the PetscInt value
2008 
2009    Output Parameter:
2010 .     b - the resulting PetscBLASInt value
2011 
2012    Level: advanced
2013 
2014    Notes:
2015       Not available from Fortran
2016       Errors if the integer is negative since PETSc calls to BLAS/LAPACK never need to cast negative integer inputs
2017 
2018 .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscMPIIntCast()`, `PetscIntCast()`, `PetscCountCast()`
2019 @*/
2020 static inline PetscErrorCode PetscBLASIntCast(PetscInt a,PetscBLASInt *b)
2021 {
2022   PetscFunctionBegin;
2023   *b = 0;
2024   if (PetscDefined(USE_64BIT_INDICES) && !PetscDefined(HAVE_64BIT_BLAS_INDICES)) {
2025     PetscCheck(a <= PETSC_BLAS_INT_MAX,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"%" PetscInt_FMT " is too big for BLAS/LAPACK, which is restricted to 32 bit integers. Either you have an invalidly large integer error in your code or you must ./configure PETSc with --with-64-bit-blas-indices for the case you are running",a);
2026   }
2027   PetscCheck(a >= 0,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Passing negative integer to BLAS/LAPACK routine");
2028   *b = (PetscBLASInt)(a);
2029   PetscFunctionReturn(0);
2030 }
2031 
2032 /*@C
2033     PetscCuBLASIntCast - like PetscBLASIntCast(), but for PetscCuBLASInt.
2034 
2035    Not Collective
2036 
2037    Input Parameter:
2038 .     a - the PetscInt value
2039 
2040    Output Parameter:
2041 .     b - the resulting PetscCuBLASInt value
2042 
2043    Level: advanced
2044 
2045    Notes:
2046       Errors if the integer is negative since PETSc calls to cuBLAS and friends never need to cast negative integer inputs
2047 
2048 .seealso: `PetscCuBLASInt`, `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscBLASIntCast()`, `PetscMPIIntCast()`, `PetscIntCast()`
2049 @*/
2050 static inline PetscErrorCode PetscCuBLASIntCast(PetscInt a,PetscCuBLASInt *b)
2051 {
2052   PetscFunctionBegin;
2053   *b = 0;
2054   if (PetscDefined(USE_64BIT_INDICES)) PetscCheck(a <= PETSC_CUBLAS_INT_MAX,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"%" PetscInt_FMT " is too big for cuBLAS, which is restricted to 32 bit integers.",a);
2055   PetscCheck(a >= 0,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Passing negative integer to cuBLAS routine");
2056   *b = (PetscCuBLASInt)(a);
2057   PetscFunctionReturn(0);
2058 }
2059 
2060 /*@C
2061     PetscMPIIntCast - casts a PetscInt (which may be 64 bits in size) to a PetscMPIInt (which may be 32 bits in size), generates an
2062          error if the PetscMPIInt is not large enough to hold the number.
2063 
2064    Not Collective
2065 
2066    Input Parameter:
2067 .     a - the PetscInt value
2068 
2069    Output Parameter:
2070 .     b - the resulting PetscMPIInt value
2071 
2072    Level: advanced
2073 
2074    Not available from Fortran
2075 
2076 .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscBLASIntCast()`, `PetscIntCast()`
2077 @*/
2078 static inline PetscErrorCode PetscMPIIntCast(PetscInt a,PetscMPIInt *b)
2079 {
2080   PetscFunctionBegin;
2081   *b = 0;
2082   if (PetscDefined(USE_64BIT_INDICES)) PetscCheck(a <= PETSC_MPI_INT_MAX,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"%" PetscInt_FMT " is too big for MPI buffer length. We currently only support 32 bit integers",a);
2083   *b = (PetscMPIInt)(a);
2084   PetscFunctionReturn(0);
2085 }
2086 
2087 #define PetscInt64Mult(a,b)   ((PetscInt64)(a))*((PetscInt64)(b))
2088 
2089 /*@C
2090 
2091    PetscRealIntMultTruncate - Computes the product of a positive PetscReal and a positive PetscInt and truncates the value to slightly less than the maximal possible value
2092 
2093    Not Collective
2094 
2095    Input Parameters:
2096 +     a - the PetscReal value
2097 -     b - the second value
2098 
2099    Returns:
2100       the result as a PetscInt value
2101 
2102    Use PetscInt64Mult() to compute the product of two PetscInt as a PetscInt64
2103    Use PetscIntMultTruncate() to compute the product of two positive PetscInt and truncate to fit a PetscInt
2104    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
2105 
2106    Developers Note:
2107    We currently assume that PetscInt addition can never overflow, this is obviously wrong but requires many more checks.
2108 
2109    This is used where we compute approximate sizes for workspace and need to insure the workspace is index-able.
2110 
2111    Not available from Fortran
2112 
2113    Level: advanced
2114 
2115 .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscBLASIntCast()`, `PetscInt64Mult()`, `PetscIntMultError()`, `PetscIntSumError()`
2116 @*/
2117 static inline PetscInt PetscRealIntMultTruncate(PetscReal a,PetscInt b)
2118 {
2119   PetscInt64 r = (PetscInt64)(a*(PetscReal)b);
2120   if (r > PETSC_MAX_INT - 100) r = PETSC_MAX_INT - 100;
2121   return (PetscInt)r;
2122 }
2123 
2124 /*@C
2125 
2126    PetscIntMultTruncate - Computes the product of two positive PetscInt and truncates the value to slightly less than the maximal possible value
2127 
2128    Not Collective
2129 
2130    Input Parameters:
2131 +     a - the PetscInt value
2132 -     b - the second value
2133 
2134    Returns:
2135       the result as a PetscInt value
2136 
2137    Use PetscInt64Mult() to compute the product of two PetscInt as a PetscInt64
2138    Use PetscRealIntMultTruncate() to compute the product of a PetscReal and a PetscInt and truncate to fit a PetscInt
2139    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
2140 
2141    Not available from Fortran
2142 
2143    Developers Note: We currently assume that PetscInt addition can never overflow, this is obviously wrong but requires many more checks.
2144 
2145    This is used where we compute approximate sizes for workspace and need to insure the workspace is index-able.
2146 
2147    Level: advanced
2148 
2149 .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscBLASIntCast()`, `PetscInt64Mult()`, `PetscIntMultError()`, `PetscIntSumError()`
2150 @*/
2151 static inline PetscInt PetscIntMultTruncate(PetscInt a,PetscInt b)
2152 {
2153   PetscInt64 r = PetscInt64Mult(a,b);
2154   if (r > PETSC_MAX_INT - 100) r = PETSC_MAX_INT - 100;
2155   return (PetscInt)r;
2156 }
2157 
2158 /*@C
2159 
2160    PetscIntSumTruncate - Computes the sum of two positive PetscInt and truncates the value to slightly less than the maximal possible value
2161 
2162    Not Collective
2163 
2164    Input Parameters:
2165 +     a - the PetscInt value
2166 -     b - the second value
2167 
2168    Returns:
2169      the result as a PetscInt value
2170 
2171    Use PetscInt64Mult() to compute the product of two PetscInt as a PetscInt64
2172    Use PetscRealIntMultTruncate() to compute the product of a PetscReal and a PetscInt and truncate to fit a PetscInt
2173    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
2174 
2175    This is used where we compute approximate sizes for workspace and need to insure the workspace is index-able.
2176 
2177    Not available from Fortran
2178 
2179    Level: advanced
2180 
2181 .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscBLASIntCast()`, `PetscInt64Mult()`, `PetscIntMultError()`
2182 @*/
2183 static inline PetscInt PetscIntSumTruncate(PetscInt a,PetscInt b)
2184 {
2185   PetscInt64 r = ((PetscInt64)a) + ((PetscInt64)b);
2186   if (r > PETSC_MAX_INT - 100) r = PETSC_MAX_INT - 100;
2187   return (PetscInt)r;
2188 }
2189 
2190 /*@C
2191 
2192    PetscIntMultError - Computes the product of two positive PetscInt and generates an error with overflow.
2193 
2194    Not Collective
2195 
2196    Input Parameters:
2197 +     a - the PetscInt value
2198 -     b - the second value
2199 
2200    Output Parameter:
2201 .     result - the result as a PetscInt value, or NULL if you do not want the result, you just want to check if it overflows
2202 
2203    Use PetscInt64Mult() to compute the product of two 32 bit PetscInt and store in a PetscInt64
2204    Use PetscIntMultTruncate() to compute the product of two PetscInt and truncate it to fit in a PetscInt
2205 
2206    Not available from Fortran
2207 
2208    Developers Note: We currently assume that PetscInt addition does not overflow, this is obviously wrong but requires many more checks.
2209 
2210    Level: advanced
2211 
2212 .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscBLASIntCast()`, `PetscIntMult64()`, `PetscIntSumError()`
2213 @*/
2214 static inline PetscErrorCode PetscIntMultError(PetscInt a,PetscInt b,PetscInt *result)
2215 {
2216   PetscInt64 r;
2217 
2218   PetscFunctionBegin;
2219   r = PetscInt64Mult(a,b);
2220 #if !defined(PETSC_USE_64BIT_INDICES)
2221   PetscCheck(r <= PETSC_MAX_INT,PETSC_COMM_SELF,PETSC_ERR_SUP,"Product of two integers %d %d overflow, either you have an invalidly large integer error in your code or you must ./configure PETSc with --with-64-bit-indices for the case you are running",a,b);
2222 #endif
2223   if (result) *result = (PetscInt)r;
2224   PetscFunctionReturn(0);
2225 }
2226 
2227 /*@C
2228 
2229    PetscIntSumError - Computes the sum of two positive PetscInt and generates an error with overflow.
2230 
2231    Not Collective
2232 
2233    Input Parameters:
2234 +     a - the PetscInt value
2235 -     b - the second value
2236 
2237    Output Parameter:
2238 .     c - the result as a PetscInt value,  or NULL if you do not want the result, you just want to check if it overflows
2239 
2240    Use PetscInt64Mult() to compute the product of two 32 bit PetscInt and store in a PetscInt64
2241    Use PetscIntMultTruncate() to compute the product of two PetscInt and truncate it to fit in a PetscInt
2242 
2243    Not available from Fortran
2244 
2245    Level: advanced
2246 
2247 .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscBLASIntCast()`, `PetscInt64Mult()`, `PetscIntMultError()`
2248 @*/
2249 static inline PetscErrorCode PetscIntSumError(PetscInt a,PetscInt b,PetscInt *result)
2250 {
2251   PetscInt64 r;
2252 
2253   PetscFunctionBegin;
2254   r  =  ((PetscInt64)a) + ((PetscInt64)b);
2255 #if !defined(PETSC_USE_64BIT_INDICES)
2256   PetscCheck(r <= PETSC_MAX_INT,PETSC_COMM_SELF,PETSC_ERR_SUP,"Sum of two integers %d %d overflow, either you have an invalidly large integer error in your code or you must ./configure PETSc with --with-64-bit-indices for the case you are running",a,b);
2257 #endif
2258   if (result) *result = (PetscInt) r;
2259   PetscFunctionReturn(0);
2260 }
2261 
2262 /*
2263      The IBM include files define hz, here we hide it so that it may be used as a regular user variable.
2264 */
2265 #if defined(hz)
2266 #  undef hz
2267 #endif
2268 
2269 #include <limits.h>
2270 
2271 /* The number of bits in a byte */
2272 
2273 #define PETSC_BITS_PER_BYTE CHAR_BIT
2274 
2275 #if defined(PETSC_HAVE_SYS_TYPES_H)
2276 #  include <sys/types.h>
2277 #endif
2278 
2279 /*MC
2280 
2281     PETSC_VERSION - This manual page provides information about how PETSc documents and uses its version information. This information is available to both C/C++
2282                     and Fortran compilers when petscsys.h is included.
2283 
2284     The current PETSc version and the API for accessing it are defined in petscversion.h
2285 
2286     The complete version number is given as the triple  PETSC_VERSION_MAJOR.PETSC_VERSION_MINOR.PETSC_VERSION_SUBMINOR (in short hand x.y.z)
2287 
2288     A change in the minor version number (y) indicates possible/likely changes in the PETSc API. Note this is different than with the semantic versioning convention
2289     where only a change in the major version number (x) indicates a change in the API.
2290 
2291     A subminor greater than zero indicates a patch release. Version x.y.z maintains source and binary compatibility with version x.y.w for all z and w
2292 
2293     Use the macros PETSC_VERSION_EQ(x,y,z), PETSC_VERSION_LT(x,y,z), PETSC_VERSION_LE(x,y,z), PETSC_VERSION_GT(x,y,z),
2294     PETSC_VERSION_GE(x,y,z) to determine if the current version is equal to, less than, less than or equal to, greater than or greater than or equal to a given
2295     version number (x.y.z).
2296 
2297     PETSC_RELEASE_DATE is the date the x.y version was released (i.e. the version before any patch releases)
2298 
2299     PETSC_VERSION_DATE is the date the x.y.z version was released
2300 
2301     PETSC_VERSION_GIT is the last git commit to the repository given in the form vx.y.z-wwwww
2302 
2303     PETSC_VERSION_DATE_GIT is the date of the last git commit to the repository
2304 
2305     PETSC_VERSION_() is deprecated and will eventually be removed.
2306 
2307     Level: intermediate
2308 
2309 M*/
2310 
2311 PETSC_EXTERN PetscErrorCode PetscGetArchType(char[],size_t);
2312 PETSC_EXTERN PetscErrorCode PetscGetHostName(char[],size_t);
2313 PETSC_EXTERN PetscErrorCode PetscGetUserName(char[],size_t);
2314 PETSC_EXTERN PetscErrorCode PetscGetProgramName(char[],size_t);
2315 PETSC_EXTERN PetscErrorCode PetscSetProgramName(const char[]);
2316 PETSC_EXTERN PetscErrorCode PetscGetDate(char[],size_t);
2317 PETSC_EXTERN PetscErrorCode PetscGetVersion(char[], size_t);
2318 PETSC_EXTERN PetscErrorCode PetscGetVersionNumber(PetscInt*,PetscInt*,PetscInt*,PetscInt*);
2319 
2320 PETSC_EXTERN PetscErrorCode PetscSortedInt(PetscInt,const PetscInt[],PetscBool*);
2321 PETSC_EXTERN PetscErrorCode PetscSortedMPIInt(PetscInt,const PetscMPIInt[],PetscBool*);
2322 PETSC_EXTERN PetscErrorCode PetscSortedReal(PetscInt,const PetscReal[],PetscBool*);
2323 PETSC_EXTERN PetscErrorCode PetscSortInt(PetscInt,PetscInt[]);
2324 PETSC_EXTERN PetscErrorCode PetscSortReverseInt(PetscInt,PetscInt[]);
2325 PETSC_EXTERN PetscErrorCode PetscSortedRemoveDupsInt(PetscInt*,PetscInt[]);
2326 PETSC_EXTERN PetscErrorCode PetscSortedCheckDupsInt(PetscInt,const PetscInt[],PetscBool*);
2327 PETSC_EXTERN PetscErrorCode PetscSortRemoveDupsInt(PetscInt*,PetscInt[]);
2328 PETSC_EXTERN PetscErrorCode PetscCheckDupsInt(PetscInt,const PetscInt[],PetscBool*);
2329 PETSC_EXTERN PetscErrorCode PetscFindInt(PetscInt, PetscInt, const PetscInt[], PetscInt*);
2330 PETSC_EXTERN PetscErrorCode PetscFindMPIInt(PetscMPIInt, PetscInt, const PetscMPIInt[], PetscInt*);
2331 PETSC_EXTERN PetscErrorCode PetscSortIntWithPermutation(PetscInt,const PetscInt[],PetscInt[]);
2332 PETSC_EXTERN PetscErrorCode PetscSortStrWithPermutation(PetscInt,const char*[],PetscInt[]);
2333 PETSC_EXTERN PetscErrorCode PetscSortIntWithArray(PetscInt,PetscInt[],PetscInt[]);
2334 PETSC_EXTERN PetscErrorCode PetscSortIntWithCountArray(PetscCount,PetscInt[],PetscCount[]);
2335 PETSC_EXTERN PetscErrorCode PetscSortIntWithArrayPair(PetscInt,PetscInt[],PetscInt[],PetscInt[]);
2336 PETSC_EXTERN PetscErrorCode PetscSortIntWithIntCountArrayPair(PetscCount,PetscInt[],PetscInt[],PetscCount[]);
2337 PETSC_EXTERN PetscErrorCode PetscSortMPIInt(PetscInt,PetscMPIInt[]);
2338 PETSC_EXTERN PetscErrorCode PetscSortRemoveDupsMPIInt(PetscInt*,PetscMPIInt[]);
2339 PETSC_EXTERN PetscErrorCode PetscSortMPIIntWithArray(PetscMPIInt,PetscMPIInt[],PetscMPIInt[]);
2340 PETSC_EXTERN PetscErrorCode PetscSortMPIIntWithIntArray(PetscMPIInt,PetscMPIInt[],PetscInt[]);
2341 PETSC_EXTERN PetscErrorCode PetscSortIntWithScalarArray(PetscInt,PetscInt[],PetscScalar[]);
2342 PETSC_EXTERN PetscErrorCode PetscSortIntWithDataArray(PetscInt,PetscInt[],void*,size_t,void*);
2343 PETSC_EXTERN PetscErrorCode PetscSortReal(PetscInt,PetscReal[]);
2344 PETSC_EXTERN PetscErrorCode PetscSortRealWithArrayInt(PetscInt,PetscReal[],PetscInt[]);
2345 PETSC_EXTERN PetscErrorCode PetscSortRealWithPermutation(PetscInt,const PetscReal[],PetscInt[]);
2346 PETSC_EXTERN PetscErrorCode PetscSortRemoveDupsReal(PetscInt*,PetscReal[]);
2347 PETSC_EXTERN PetscErrorCode PetscFindReal(PetscReal,PetscInt,const PetscReal[],PetscReal,PetscInt*);
2348 PETSC_EXTERN PetscErrorCode PetscSortSplit(PetscInt,PetscInt,PetscScalar[],PetscInt[]);
2349 PETSC_EXTERN PetscErrorCode PetscSortSplitReal(PetscInt,PetscInt,PetscReal[],PetscInt[]);
2350 PETSC_EXTERN PetscErrorCode PetscProcessTree(PetscInt,const PetscBool [],const PetscInt[],PetscInt*,PetscInt**,PetscInt**,PetscInt**,PetscInt**);
2351 PETSC_EXTERN PetscErrorCode PetscMergeIntArrayPair(PetscInt,const PetscInt[],const PetscInt[],PetscInt,const PetscInt[],const PetscInt[],PetscInt*,PetscInt**,PetscInt**);
2352 PETSC_EXTERN PetscErrorCode PetscMergeIntArray(PetscInt,const PetscInt[],PetscInt,const PetscInt[],PetscInt*,PetscInt**);
2353 PETSC_EXTERN PetscErrorCode PetscMergeMPIIntArray(PetscInt,const PetscMPIInt[],PetscInt,const PetscMPIInt[],PetscInt*,PetscMPIInt**);
2354 PETSC_EXTERN PetscErrorCode PetscParallelSortedInt(MPI_Comm, PetscInt, const PetscInt[], PetscBool *);
2355 
2356 PETSC_EXTERN PetscErrorCode PetscTimSort(PetscInt,void*,size_t,int(*)(const void*,const void*,void*),void*);
2357 PETSC_EXTERN PetscErrorCode PetscIntSortSemiOrdered(PetscInt,PetscInt[]);
2358 PETSC_EXTERN PetscErrorCode PetscMPIIntSortSemiOrdered(PetscInt,PetscMPIInt[]);
2359 PETSC_EXTERN PetscErrorCode PetscRealSortSemiOrdered(PetscInt,PetscReal[]);
2360 PETSC_EXTERN PetscErrorCode PetscTimSortWithArray(PetscInt,void*,size_t,void*,size_t,int(*)(const void*,const void*,void*),void*);
2361 PETSC_EXTERN PetscErrorCode PetscIntSortSemiOrderedWithArray(PetscInt,PetscInt[],PetscInt[]);
2362 PETSC_EXTERN PetscErrorCode PetscMPIIntSortSemiOrderedWithArray(PetscInt,PetscMPIInt[],PetscMPIInt[]);
2363 PETSC_EXTERN PetscErrorCode PetscRealSortSemiOrderedWithArrayInt(PetscInt,PetscReal[],PetscInt[]);
2364 
2365 PETSC_EXTERN PetscErrorCode PetscSetDisplay(void);
2366 PETSC_EXTERN PetscErrorCode PetscGetDisplay(char[],size_t);
2367 
2368 /*J
2369     PetscRandomType - String with the name of a PETSc randomizer
2370 
2371    Level: beginner
2372 
2373    Notes:
2374    To use SPRNG or RANDOM123 you must have ./configure PETSc
2375    with the option --download-sprng or --download-random123
2376 
2377 .seealso: `PetscRandomSetType()`, `PetscRandom`, `PetscRandomCreate()`
2378 J*/
2379 typedef const char* PetscRandomType;
2380 #define PETSCRAND       "rand"
2381 #define PETSCRAND48     "rand48"
2382 #define PETSCSPRNG      "sprng"
2383 #define PETSCRANDER48   "rander48"
2384 #define PETSCRANDOM123  "random123"
2385 #define PETSCCURAND     "curand"
2386 
2387 /* Logging support */
2388 PETSC_EXTERN PetscClassId PETSC_RANDOM_CLASSID;
2389 
2390 PETSC_EXTERN PetscErrorCode PetscRandomInitializePackage(void);
2391 
2392 /* Dynamic creation and loading functions */
2393 PETSC_EXTERN PetscFunctionList PetscRandomList;
2394 
2395 PETSC_EXTERN PetscErrorCode PetscRandomRegister(const char[],PetscErrorCode (*)(PetscRandom));
2396 PETSC_EXTERN PetscErrorCode PetscRandomSetType(PetscRandom,PetscRandomType);
2397 PETSC_EXTERN PetscErrorCode PetscRandomSetFromOptions(PetscRandom);
2398 PETSC_EXTERN PetscErrorCode PetscRandomGetType(PetscRandom,PetscRandomType*);
2399 PETSC_EXTERN PetscErrorCode PetscRandomViewFromOptions(PetscRandom,PetscObject,const char[]);
2400 PETSC_EXTERN PetscErrorCode PetscRandomView(PetscRandom,PetscViewer);
2401 
2402 PETSC_EXTERN PetscErrorCode PetscRandomCreate(MPI_Comm,PetscRandom*);
2403 PETSC_EXTERN PetscErrorCode PetscRandomGetValue(PetscRandom,PetscScalar*);
2404 PETSC_EXTERN PetscErrorCode PetscRandomGetValueReal(PetscRandom,PetscReal*);
2405 PETSC_EXTERN PetscErrorCode PetscRandomGetValues(PetscRandom,PetscInt,PetscScalar*);
2406 PETSC_EXTERN PetscErrorCode PetscRandomGetValuesReal(PetscRandom,PetscInt,PetscReal*);
2407 PETSC_EXTERN PetscErrorCode PetscRandomGetInterval(PetscRandom,PetscScalar*,PetscScalar*);
2408 PETSC_EXTERN PetscErrorCode PetscRandomSetInterval(PetscRandom,PetscScalar,PetscScalar);
2409 PETSC_EXTERN PetscErrorCode PetscRandomSetSeed(PetscRandom,unsigned long);
2410 PETSC_EXTERN PetscErrorCode PetscRandomGetSeed(PetscRandom,unsigned long *);
2411 PETSC_EXTERN PetscErrorCode PetscRandomSeed(PetscRandom);
2412 PETSC_EXTERN PetscErrorCode PetscRandomDestroy(PetscRandom*);
2413 
2414 PETSC_EXTERN PetscErrorCode PetscGetFullPath(const char[],char[],size_t);
2415 PETSC_EXTERN PetscErrorCode PetscGetRelativePath(const char[],char[],size_t);
2416 PETSC_EXTERN PetscErrorCode PetscGetWorkingDirectory(char[],size_t);
2417 PETSC_EXTERN PetscErrorCode PetscGetRealPath(const char[],char[]);
2418 PETSC_EXTERN PetscErrorCode PetscGetHomeDirectory(char[],size_t);
2419 PETSC_EXTERN PetscErrorCode PetscTestFile(const char[],char,PetscBool *);
2420 PETSC_EXTERN PetscErrorCode PetscTestDirectory(const char[],char,PetscBool *);
2421 PETSC_EXTERN PetscErrorCode PetscMkdir(const char[]);
2422 PETSC_EXTERN PetscErrorCode PetscMkdtemp(char[]);
2423 PETSC_EXTERN PetscErrorCode PetscRMTree(const char[]);
2424 
2425 static inline PetscBool PetscBinaryBigEndian(void) {long _petsc_v = 1; return ((char*)&_petsc_v)[0] ? PETSC_FALSE : PETSC_TRUE;}
2426 
2427 PETSC_EXTERN PetscErrorCode PetscBinaryRead(int,void*,PetscInt,PetscInt*,PetscDataType);
2428 PETSC_EXTERN PetscErrorCode PetscBinarySynchronizedRead(MPI_Comm,int,void*,PetscInt,PetscInt*,PetscDataType);
2429 PETSC_EXTERN PetscErrorCode PetscBinaryWrite(int,const void*,PetscInt,PetscDataType);
2430 PETSC_EXTERN PetscErrorCode PetscBinarySynchronizedWrite(MPI_Comm,int,const void*,PetscInt,PetscDataType);
2431 PETSC_EXTERN PetscErrorCode PetscBinaryOpen(const char[],PetscFileMode,int *);
2432 PETSC_EXTERN PetscErrorCode PetscBinaryClose(int);
2433 PETSC_EXTERN PetscErrorCode PetscSharedTmp(MPI_Comm,PetscBool  *);
2434 PETSC_EXTERN PetscErrorCode PetscSharedWorkingDirectory(MPI_Comm,PetscBool  *);
2435 PETSC_EXTERN PetscErrorCode PetscGetTmp(MPI_Comm,char[],size_t);
2436 PETSC_EXTERN PetscErrorCode PetscFileRetrieve(MPI_Comm,const char[],char[],size_t,PetscBool *);
2437 PETSC_EXTERN PetscErrorCode PetscLs(MPI_Comm,const char[],char[],size_t,PetscBool *);
2438 #if defined(PETSC_USE_SOCKET_VIEWER)
2439 PETSC_EXTERN PetscErrorCode PetscOpenSocket(const char[],int,int*);
2440 #endif
2441 
2442 PETSC_EXTERN PetscErrorCode PetscBinarySeek(int,off_t,PetscBinarySeekType,off_t*);
2443 PETSC_EXTERN PetscErrorCode PetscBinarySynchronizedSeek(MPI_Comm,int,off_t,PetscBinarySeekType,off_t*);
2444 PETSC_EXTERN PetscErrorCode PetscByteSwap(void *,PetscDataType,PetscInt);
2445 
2446 PETSC_EXTERN PetscErrorCode PetscSetDebugTerminal(const char[]);
2447 PETSC_EXTERN PetscErrorCode PetscSetDebugger(const char[],PetscBool);
2448 PETSC_EXTERN PetscErrorCode PetscSetDefaultDebugger(void);
2449 PETSC_EXTERN PetscErrorCode PetscSetDebuggerFromString(const char*);
2450 PETSC_EXTERN PetscErrorCode PetscAttachDebugger(void);
2451 PETSC_EXTERN PetscErrorCode PetscStopForDebugger(void);
2452 PETSC_EXTERN PetscErrorCode PetscWaitOnError(void);
2453 
2454 PETSC_EXTERN PetscErrorCode PetscGatherNumberOfMessages(MPI_Comm,const PetscMPIInt[],const PetscMPIInt[],PetscMPIInt*);
2455 PETSC_EXTERN PetscErrorCode PetscGatherMessageLengths(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],PetscMPIInt**,PetscMPIInt**);
2456 PETSC_EXTERN PetscErrorCode PetscGatherMessageLengths2(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],const PetscMPIInt[],PetscMPIInt**,PetscMPIInt**,PetscMPIInt**);
2457 PETSC_EXTERN PetscErrorCode PetscPostIrecvInt(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],const PetscMPIInt[],PetscInt***,MPI_Request**);
2458 PETSC_EXTERN PetscErrorCode PetscPostIrecvScalar(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],const PetscMPIInt[],PetscScalar***,MPI_Request**);
2459 PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSided(MPI_Comm,PetscMPIInt,MPI_Datatype,PetscMPIInt,const PetscMPIInt*,const void*,PetscMPIInt*,PetscMPIInt**,void*)
2460   PetscAttrMPIPointerWithType(6,3);
2461 PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedF(MPI_Comm,PetscMPIInt,MPI_Datatype,PetscMPIInt,const PetscMPIInt[],const void*,PetscMPIInt*,PetscMPIInt**,void*,PetscMPIInt,
2462                                                     PetscErrorCode (*send)(MPI_Comm,const PetscMPIInt[],PetscMPIInt,PetscMPIInt,void*,MPI_Request[],void*),
2463                                                     PetscErrorCode (*recv)(MPI_Comm,const PetscMPIInt[],PetscMPIInt,void*,MPI_Request[],void*),void *ctx)
2464   PetscAttrMPIPointerWithType(6,3);
2465 PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedFReq(MPI_Comm,PetscMPIInt,MPI_Datatype,PetscMPIInt,const PetscMPIInt[],const void*,PetscMPIInt*,PetscMPIInt**,void*,PetscMPIInt,
2466                                                        MPI_Request**,MPI_Request**,
2467                                                        PetscErrorCode (*send)(MPI_Comm,const PetscMPIInt[],PetscMPIInt,PetscMPIInt,void*,MPI_Request[],void*),
2468                                                        PetscErrorCode (*recv)(MPI_Comm,const PetscMPIInt[],PetscMPIInt,void*,MPI_Request[],void*),void *ctx)
2469   PetscAttrMPIPointerWithType(6,3);
2470 
2471 PETSC_EXTERN const char *const PetscBuildTwoSidedTypes[];
2472 PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedSetType(MPI_Comm,PetscBuildTwoSidedType);
2473 PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedGetType(MPI_Comm,PetscBuildTwoSidedType*);
2474 
2475 PETSC_EXTERN PetscErrorCode PetscSSEIsEnabled(MPI_Comm,PetscBool*,PetscBool*);
2476 
2477 PETSC_EXTERN MPI_Comm PetscObjectComm(PetscObject);
2478 
2479 PETSC_EXTERN const char *const PetscSubcommTypes[];
2480 
2481 struct _n_PetscSubcomm {
2482   MPI_Comm         parent;           /* parent communicator */
2483   MPI_Comm         dupparent;        /* duplicate parent communicator, under which the processors of this subcomm have contiguous rank */
2484   MPI_Comm         child;            /* the sub-communicator */
2485   PetscMPIInt      n;                /* num of subcommunicators under the parent communicator */
2486   PetscMPIInt      color;            /* color of processors belong to this communicator */
2487   PetscMPIInt      *subsize;         /* size of subcommunicator[color] */
2488   PetscSubcommType type;
2489   char             *subcommprefix;
2490 };
2491 
2492 static inline MPI_Comm PetscSubcommParent(PetscSubcomm scomm) {return scomm->parent;}
2493 static inline MPI_Comm PetscSubcommChild(PetscSubcomm scomm) {return scomm->child;}
2494 static inline MPI_Comm PetscSubcommContiguousParent(PetscSubcomm scomm) {return scomm->dupparent;}
2495 PETSC_EXTERN PetscErrorCode PetscSubcommCreate(MPI_Comm,PetscSubcomm*);
2496 PETSC_EXTERN PetscErrorCode PetscSubcommDestroy(PetscSubcomm*);
2497 PETSC_EXTERN PetscErrorCode PetscSubcommSetNumber(PetscSubcomm,PetscInt);
2498 PETSC_EXTERN PetscErrorCode PetscSubcommSetType(PetscSubcomm,PetscSubcommType);
2499 PETSC_EXTERN PetscErrorCode PetscSubcommSetTypeGeneral(PetscSubcomm,PetscMPIInt,PetscMPIInt);
2500 PETSC_EXTERN PetscErrorCode PetscSubcommView(PetscSubcomm,PetscViewer);
2501 PETSC_EXTERN PetscErrorCode PetscSubcommSetFromOptions(PetscSubcomm);
2502 PETSC_EXTERN PetscErrorCode PetscSubcommSetOptionsPrefix(PetscSubcomm,const char[]);
2503 PETSC_EXTERN PetscErrorCode PetscSubcommGetParent(PetscSubcomm,MPI_Comm*);
2504 PETSC_EXTERN PetscErrorCode PetscSubcommGetContiguousParent(PetscSubcomm,MPI_Comm*);
2505 PETSC_EXTERN PetscErrorCode PetscSubcommGetChild(PetscSubcomm,MPI_Comm*);
2506 
2507 PETSC_EXTERN PetscErrorCode PetscHeapCreate(PetscInt,PetscHeap*);
2508 PETSC_EXTERN PetscErrorCode PetscHeapAdd(PetscHeap,PetscInt,PetscInt);
2509 PETSC_EXTERN PetscErrorCode PetscHeapPop(PetscHeap,PetscInt*,PetscInt*);
2510 PETSC_EXTERN PetscErrorCode PetscHeapPeek(PetscHeap,PetscInt*,PetscInt*);
2511 PETSC_EXTERN PetscErrorCode PetscHeapStash(PetscHeap,PetscInt,PetscInt);
2512 PETSC_EXTERN PetscErrorCode PetscHeapUnstash(PetscHeap);
2513 PETSC_EXTERN PetscErrorCode PetscHeapDestroy(PetscHeap*);
2514 PETSC_EXTERN PetscErrorCode PetscHeapView(PetscHeap,PetscViewer);
2515 
2516 PETSC_EXTERN PetscErrorCode PetscProcessPlacementView(PetscViewer);
2517 PETSC_EXTERN PetscErrorCode PetscShmCommGet(MPI_Comm,PetscShmComm*);
2518 PETSC_EXTERN PetscErrorCode PetscShmCommGlobalToLocal(PetscShmComm,PetscMPIInt,PetscMPIInt*);
2519 PETSC_EXTERN PetscErrorCode PetscShmCommLocalToGlobal(PetscShmComm,PetscMPIInt,PetscMPIInt*);
2520 PETSC_EXTERN PetscErrorCode PetscShmCommGetMpiShmComm(PetscShmComm,MPI_Comm*);
2521 
2522 /* routines to better support OpenMP multithreading needs of some PETSc third party libraries */
2523 PETSC_EXTERN PetscErrorCode PetscOmpCtrlCreate(MPI_Comm,PetscInt,PetscOmpCtrl*);
2524 PETSC_EXTERN PetscErrorCode PetscOmpCtrlGetOmpComms(PetscOmpCtrl,MPI_Comm*,MPI_Comm*,PetscBool*);
2525 PETSC_EXTERN PetscErrorCode PetscOmpCtrlDestroy(PetscOmpCtrl*);
2526 PETSC_EXTERN PetscErrorCode PetscOmpCtrlBarrier(PetscOmpCtrl);
2527 PETSC_EXTERN PetscErrorCode PetscOmpCtrlOmpRegionOnMasterBegin(PetscOmpCtrl);
2528 PETSC_EXTERN PetscErrorCode PetscOmpCtrlOmpRegionOnMasterEnd(PetscOmpCtrl);
2529 
2530 PETSC_EXTERN PetscErrorCode PetscSegBufferCreate(size_t,size_t,PetscSegBuffer*);
2531 PETSC_EXTERN PetscErrorCode PetscSegBufferDestroy(PetscSegBuffer*);
2532 PETSC_EXTERN PetscErrorCode PetscSegBufferGet(PetscSegBuffer,size_t,void*);
2533 PETSC_EXTERN PetscErrorCode PetscSegBufferExtractAlloc(PetscSegBuffer,void*);
2534 PETSC_EXTERN PetscErrorCode PetscSegBufferExtractTo(PetscSegBuffer,void*);
2535 PETSC_EXTERN PetscErrorCode PetscSegBufferExtractInPlace(PetscSegBuffer,void*);
2536 PETSC_EXTERN PetscErrorCode PetscSegBufferGetSize(PetscSegBuffer,size_t*);
2537 PETSC_EXTERN PetscErrorCode PetscSegBufferUnuse(PetscSegBuffer,size_t);
2538 
2539 /* Type-safe wrapper to encourage use of PETSC_RESTRICT. Does not use PetscFunctionBegin because the error handling
2540  * prevents the compiler from completely erasing the stub. This is called in inner loops so it has to be as fast as
2541  * possible. */
2542 static inline PetscErrorCode PetscSegBufferGetInts(PetscSegBuffer seg,size_t count,PetscInt *PETSC_RESTRICT *slot) {return PetscSegBufferGet(seg,count,(void**)slot);}
2543 
2544 extern PetscOptionsHelpPrinted PetscOptionsHelpPrintedSingleton;
2545 PETSC_EXTERN PetscErrorCode PetscOptionsHelpPrintedDestroy(PetscOptionsHelpPrinted*);
2546 PETSC_EXTERN PetscErrorCode PetscOptionsHelpPrintedCreate(PetscOptionsHelpPrinted*);
2547 PETSC_EXTERN PetscErrorCode PetscOptionsHelpPrintedCheck(PetscOptionsHelpPrinted,const char*,const char*,PetscBool*);
2548 
2549 #include <stdarg.h>
2550 PETSC_EXTERN PetscErrorCode PetscVSNPrintf(char*,size_t,const char[],size_t*,va_list);
2551 PETSC_EXTERN PetscErrorCode (*PetscVFPrintf)(FILE*,const char[],va_list);
2552 
2553 PETSC_EXTERN PetscSegBuffer PetscCitationsList;
2554 
2555 /*@C
2556       PetscCitationsRegister - Register a bibtex item to obtain credit for an implemented algorithm used in the code.
2557 
2558      Not Collective - only what is registered on rank 0 of PETSC_COMM_WORLD will be printed
2559 
2560      Input Parameters:
2561 +      cite - the bibtex item, formated to displayed on multiple lines nicely
2562 -      set - a boolean variable initially set to PETSC_FALSE; this is used to insure only a single registration of the citation
2563 
2564    Level: intermediate
2565 
2566    Not available from Fortran
2567 
2568      Options Database:
2569 .     -citations [filename]   - print out the bibtex entries for the given computation
2570 @*/
2571 static inline PetscErrorCode PetscCitationsRegister(const char cit[],PetscBool *set)
2572 {
2573   size_t  len;
2574   char   *vstring;
2575 
2576   PetscFunctionBegin;
2577   if (set && *set) PetscFunctionReturn(0);
2578   PetscCall(PetscStrlen(cit,&len));
2579   PetscCall(PetscSegBufferGet(PetscCitationsList,len,&vstring));
2580   PetscCall(PetscArraycpy(vstring,cit,len));
2581   if (set) *set = PETSC_TRUE;
2582   PetscFunctionReturn(0);
2583 }
2584 
2585 PETSC_EXTERN PetscErrorCode PetscURLShorten(const char[],char[],size_t);
2586 PETSC_EXTERN PetscErrorCode PetscGoogleDriveAuthorize(MPI_Comm,char[],char[],size_t);
2587 PETSC_EXTERN PetscErrorCode PetscGoogleDriveRefresh(MPI_Comm,const char[],char[],size_t);
2588 PETSC_EXTERN PetscErrorCode PetscGoogleDriveUpload(MPI_Comm,const char[],const char []);
2589 
2590 PETSC_EXTERN PetscErrorCode PetscBoxAuthorize(MPI_Comm,char[],char[],size_t);
2591 PETSC_EXTERN PetscErrorCode PetscBoxRefresh(MPI_Comm,const char[],char[],char[],size_t);
2592 
2593 PETSC_EXTERN PetscErrorCode PetscGlobusGetTransfers(MPI_Comm,const char[],char[],size_t);
2594 
2595 PETSC_EXTERN PetscErrorCode PetscTextBelt(MPI_Comm,const char[],const char[],PetscBool*);
2596 PETSC_EXTERN PetscErrorCode PetscTellMyCell(MPI_Comm,const char[],const char[],PetscBool*);
2597 
2598 PETSC_EXTERN PetscErrorCode PetscPullJSONValue(const char[],const char[],char[],size_t,PetscBool*);
2599 PETSC_EXTERN PetscErrorCode PetscPushJSONValue(char[],const char[],const char[],size_t);
2600 
2601 #if defined(PETSC_USE_DEBUG)
2602 static inline unsigned int PetscStrHash(const char *str)
2603 {
2604   unsigned int c,hash = 5381;
2605 
2606   while ((c = (unsigned int)*str++)) hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
2607   return hash;
2608 }
2609 
2610 /*MC
2611    MPIU_Allreduce - a PETSc replacement for MPI_Allreduce() that tries to determine if the call from all the MPI processes occur from the
2612                     same place in the PETSc code. This helps to detect bugs where different MPI processes follow different code paths
2613                     resulting in inconsistent and incorrect calls to MPI_Allreduce().
2614 
2615    Collective
2616 
2617    Synopsis:
2618      #include <petscsys.h>
2619      PetscErrorCode MPIU_Allreduce(void *indata,void *outdata,PetscMPIInt count,MPI_Datatype datatype, MPI_Op op, MPI_Comm comm);
2620 
2621    Input Parameters:
2622 +  a - pointer to the input data to be reduced
2623 .  c - the number of MPI data items in a and b
2624 .  d - the MPI datatype, for example MPI_INT
2625 .  e - the MPI operation, for example MPI_SUM
2626 -  fcomm - the MPI communicator on which the operation occurs
2627 
2628    Output Parameter:
2629 .  b - the reduced values
2630 
2631    Notes:
2632      In optimized mode this directly calls MPI_Allreduce()
2633 
2634      This is defined as a macro that can return error codes internally so it cannot be used in a subroutine that returns void.
2635 
2636      The error code this returns should be checked with PetscCall() even though it looks like an MPI function because it always returns PETSc error codes
2637 
2638    Level: developer
2639 
2640 .seealso: `MPI_Allreduce()`
2641 M*/
2642 #define MPIU_Allreduce(a,b,c,d,e,fcomm) PetscMacroReturnStandard(                           \
2643     PetscMPIInt a_b1[6],a_b2[6];                                                               \
2644     int         _mpiu_allreduce_c_int = (int)c;                                                \
2645     a_b1[0] = -(PetscMPIInt)__LINE__;                          a_b1[1] = -a_b1[0];             \
2646     a_b1[2] = -(PetscMPIInt)PetscStrHash(PETSC_FUNCTION_NAME); a_b1[3] = -a_b1[2];             \
2647     a_b1[4] = -(PetscMPIInt)(c);                               a_b1[5] = -a_b1[4];             \
2648     PetscCallMPI(MPI_Allreduce(a_b1,a_b2,6,MPI_INT,MPI_MAX,fcomm));                               \
2649     PetscCheck(-a_b2[0] == a_b2[1],PETSC_COMM_SELF,PETSC_ERR_PLIB,"MPI_Allreduce() called in different locations (code lines) on different processors"); \
2650     PetscCheck(-a_b2[2] == a_b2[3],PETSC_COMM_SELF,PETSC_ERR_PLIB,"MPI_Allreduce() called in different locations (functions) on different processors"); \
2651     PetscCheck(-a_b2[4] == a_b2[5],PETSC_COMM_SELF,PETSC_ERR_PLIB,"MPI_Allreduce() called with different counts %d on different processors",_mpiu_allreduce_c_int); \
2652     PetscCallMPI(MPI_Allreduce((a),(b),(c),d,e,(fcomm)));                                         \
2653   )
2654 #else
2655 #define MPIU_Allreduce(a,b,c,d,e,fcomm) PetscMacroReturnStandard(PetscCallMPI(MPI_Allreduce((a),(b),(c),d,e,(fcomm))))
2656 #endif
2657 
2658 #if defined(PETSC_HAVE_MPI_PROCESS_SHARED_MEMORY)
2659 PETSC_EXTERN PetscErrorCode MPIU_Win_allocate_shared(MPI_Aint,PetscMPIInt,MPI_Info,MPI_Comm,void*,MPI_Win*);
2660 PETSC_EXTERN PetscErrorCode MPIU_Win_shared_query(MPI_Win,PetscMPIInt,MPI_Aint*,PetscMPIInt*,void*);
2661 #endif
2662 
2663 /* this is a vile hack */
2664 #if defined(PETSC_HAVE_NECMPI)
2665 #if !defined(PETSC_NECMPI_VERSION_MAJOR) ||                              \
2666     !defined(PETSC_NECMPI_VERSION_MINOR) ||                              \
2667     PETSC_NECMPI_VERSION_MAJOR < 2       ||                              \
2668     (PETSC_NECMPI_VERSION_MAJOR == 2 && PETSC_NECMPI_VERSION_MINOR < 18)
2669 #define MPI_Type_free(a) (*(a) = MPI_DATATYPE_NULL,0);
2670 #endif
2671 #endif
2672 
2673 /*
2674     List of external packages and queries on it
2675 */
2676 PETSC_EXTERN PetscErrorCode  PetscHasExternalPackage(const char[],PetscBool*);
2677 
2678 /*
2679  OpenMP support
2680 */
2681 #if defined(_OPENMP)
2682 #define PetscPragmaOMP(...) _Pragma(PetscStringize(omp __VA_ARGS__))
2683 #else // no OpenMP so no threads
2684 #define PetscPragmaOMP(...)
2685 #endif
2686 
2687 #endif
2688