xref: /petsc/include/petscsys.h (revision fdf6c4e30aafdbc795e4f76379caa977fd5cdf5a)
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/100000000 != PETSC_HAVE_MPICH_NUMVERSION/100000000) || (MPICH_NUMVERSION/100000 < PETSC_HAVE_MPICH_NUMVERSION/100000) || (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_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 PETSC_EXTERN PetscErrorCode PetscFunctionListPrintNonEmpty(PetscFunctionList);
1371 PETSC_EXTERN PetscErrorCode PetscFunctionListPrintAll(void);
1372 
1373 PETSC_EXTERN PetscDLLibrary  PetscDLLibrariesLoaded;
1374 PETSC_EXTERN PetscErrorCode PetscDLLibraryAppend(MPI_Comm,PetscDLLibrary *,const char[]);
1375 PETSC_EXTERN PetscErrorCode PetscDLLibraryPrepend(MPI_Comm,PetscDLLibrary *,const char[]);
1376 PETSC_EXTERN PetscErrorCode PetscDLLibrarySym(MPI_Comm,PetscDLLibrary *,const char[],const char[],void **);
1377 PETSC_EXTERN PetscErrorCode PetscDLLibraryPrintPath(PetscDLLibrary);
1378 PETSC_EXTERN PetscErrorCode PetscDLLibraryRetrieve(MPI_Comm,const char[],char *,size_t,PetscBool  *);
1379 PETSC_EXTERN PetscErrorCode PetscDLLibraryOpen(MPI_Comm,const char[],PetscDLLibrary *);
1380 PETSC_EXTERN PetscErrorCode PetscDLLibraryClose(PetscDLLibrary);
1381 
1382 /*
1383      Useful utility routines
1384 */
1385 PETSC_EXTERN PetscErrorCode PetscSplitOwnership(MPI_Comm,PetscInt*,PetscInt*);
1386 PETSC_EXTERN PetscErrorCode PetscSplitOwnershipBlock(MPI_Comm,PetscInt,PetscInt*,PetscInt*);
1387 PETSC_EXTERN PetscErrorCode PetscSplitOwnershipEqual(MPI_Comm,PetscInt*,PetscInt*);
1388 PETSC_EXTERN PetscErrorCode PetscSequentialPhaseBegin(MPI_Comm,PetscMPIInt);
1389 PETSC_EXTERN PetscErrorCode PetscSequentialPhaseEnd(MPI_Comm,PetscMPIInt);
1390 PETSC_EXTERN PetscErrorCode PetscBarrier(PetscObject);
1391 PETSC_EXTERN PetscErrorCode PetscMPIDump(FILE*);
1392 PETSC_EXTERN PetscErrorCode PetscGlobalMinMaxInt(MPI_Comm,const PetscInt[2],PetscInt[2]);
1393 PETSC_EXTERN PetscErrorCode PetscGlobalMinMaxReal(MPI_Comm,const PetscReal[2],PetscReal[2]);
1394 
1395 /*MC
1396     PetscNot - negates a logical type value and returns result as a PetscBool
1397 
1398     Notes:
1399     This is useful in cases like
1400 $     int        *a;
1401 $     PetscBool  flag = PetscNot(a)
1402      where !a would not return a PetscBool because we cannot provide a cast from int to PetscBool in C.
1403 
1404     Level: beginner
1405 
1406     .seealso `:` `PetscBool`, `PETSC_TRUE`, `PETSC_FALSE`
1407 M*/
1408 #define PetscNot(a) ((a) ? PETSC_FALSE : PETSC_TRUE)
1409 
1410 /*MC
1411     PetscHelpPrintf - Prints help messages.
1412 
1413    Synopsis:
1414     #include <petscsys.h>
1415      PetscErrorCode (*PetscHelpPrintf)(MPI_Comm comm, const char format[],args);
1416 
1417     Collective on comm
1418 
1419     Input Parameters:
1420 +  comm - the MPI communicator over which the help message is printed
1421 .  format - the usual printf() format string
1422 -  args - arguments to be printed
1423 
1424    Level: developer
1425 
1426    Fortran Note:
1427      This routine is not supported in Fortran.
1428 
1429    Note:
1430      You can change how help messages are printed by replacing the function pointer with a function that does not simply write to stdout.
1431 
1432       To use, write your own function, for example,
1433 $PetscErrorCode mypetschelpprintf(MPI_Comm comm,const char format[],....)
1434 ${
1435 $ PetscFunctionReturn(0);
1436 $}
1437 then do the assigment
1438 $    PetscHelpPrintf = mypetschelpprintf;
1439    You can do the assignment before PetscInitialize().
1440 
1441   The default routine used is called PetscHelpPrintfDefault().
1442 
1443 .seealso: `PetscFPrintf()`, `PetscSynchronizedPrintf()`, `PetscErrorPrintf()`
1444 M*/
1445 PETSC_EXTERN PetscErrorCode (*PetscHelpPrintf)(MPI_Comm,const char[],...) PETSC_ATTRIBUTE_FORMAT(2,3);
1446 
1447 /*
1448      Defines PETSc profiling.
1449 */
1450 #include <petsclog.h>
1451 
1452 /*
1453       Simple PETSc parallel IO for ASCII printing
1454 */
1455 PETSC_EXTERN PetscErrorCode PetscFixFilename(const char[],char[]);
1456 PETSC_EXTERN PetscErrorCode PetscFOpen(MPI_Comm,const char[],const char[],FILE**);
1457 PETSC_EXTERN PetscErrorCode PetscFClose(MPI_Comm,FILE*);
1458 PETSC_EXTERN PetscErrorCode PetscFPrintf(MPI_Comm,FILE*,const char[],...) PETSC_ATTRIBUTE_FORMAT(3,4);
1459 PETSC_EXTERN PetscErrorCode PetscPrintf(MPI_Comm,const char[],...) PETSC_ATTRIBUTE_FORMAT(2,3);
1460 PETSC_EXTERN PetscErrorCode PetscSNPrintf(char*,size_t,const char [],...) PETSC_ATTRIBUTE_FORMAT(3,4);
1461 PETSC_EXTERN PetscErrorCode PetscSNPrintfCount(char*,size_t,const char [],size_t*,...) PETSC_ATTRIBUTE_FORMAT(3,5);
1462 PETSC_EXTERN PetscErrorCode PetscFormatRealArray(char[],size_t,const char*,PetscInt,const PetscReal[]);
1463 
1464 PETSC_EXTERN PetscErrorCode PetscErrorPrintfDefault(const char [],...) PETSC_ATTRIBUTE_FORMAT(1,2);
1465 PETSC_EXTERN PetscErrorCode PetscErrorPrintfNone(const char [],...) PETSC_ATTRIBUTE_FORMAT(1,2);
1466 PETSC_EXTERN PetscErrorCode PetscHelpPrintfDefault(MPI_Comm,const char [],...) PETSC_ATTRIBUTE_FORMAT(2,3);
1467 
1468 PETSC_EXTERN PetscErrorCode PetscFormatConvertGetSize(const char*,size_t*);
1469 PETSC_EXTERN PetscErrorCode PetscFormatConvert(const char*,char *);
1470 
1471 #if defined(PETSC_HAVE_POPEN)
1472 PETSC_EXTERN PetscErrorCode PetscPOpen(MPI_Comm,const char[],const char[],const char[],FILE **);
1473 PETSC_EXTERN PetscErrorCode PetscPClose(MPI_Comm,FILE*);
1474 PETSC_EXTERN PetscErrorCode PetscPOpenSetMachine(const char[]);
1475 #endif
1476 
1477 PETSC_EXTERN PetscErrorCode PetscSynchronizedPrintf(MPI_Comm,const char[],...) PETSC_ATTRIBUTE_FORMAT(2,3);
1478 PETSC_EXTERN PetscErrorCode PetscSynchronizedFPrintf(MPI_Comm,FILE*,const char[],...) PETSC_ATTRIBUTE_FORMAT(3,4);
1479 PETSC_EXTERN PetscErrorCode PetscSynchronizedFlush(MPI_Comm,FILE*);
1480 PETSC_EXTERN PetscErrorCode PetscSynchronizedFGets(MPI_Comm,FILE*,size_t,char[]);
1481 PETSC_EXTERN PetscErrorCode PetscStartMatlab(MPI_Comm,const char[],const char[],FILE**);
1482 PETSC_EXTERN PetscErrorCode PetscStartJava(MPI_Comm,const char[],const char[],FILE**);
1483 PETSC_EXTERN PetscErrorCode PetscGetPetscDir(const char*[]);
1484 
1485 PETSC_EXTERN PetscClassId PETSC_CONTAINER_CLASSID;
1486 PETSC_EXTERN PetscErrorCode PetscContainerGetPointer(PetscContainer,void**);
1487 PETSC_EXTERN PetscErrorCode PetscContainerSetPointer(PetscContainer,void*);
1488 PETSC_EXTERN PetscErrorCode PetscContainerDestroy(PetscContainer*);
1489 PETSC_EXTERN PetscErrorCode PetscContainerCreate(MPI_Comm,PetscContainer*);
1490 PETSC_EXTERN PetscErrorCode PetscContainerSetUserDestroy(PetscContainer,PetscErrorCode (*)(void*));
1491 PETSC_EXTERN PetscErrorCode PetscContainerUserDestroyDefault(void*);
1492 
1493 /*
1494    For use in debuggers
1495 */
1496 PETSC_EXTERN PetscMPIInt PetscGlobalRank;
1497 PETSC_EXTERN PetscMPIInt PetscGlobalSize;
1498 PETSC_EXTERN PetscErrorCode PetscIntView(PetscInt,const PetscInt[],PetscViewer);
1499 PETSC_EXTERN PetscErrorCode PetscRealView(PetscInt,const PetscReal[],PetscViewer);
1500 PETSC_EXTERN PetscErrorCode PetscScalarView(PetscInt,const PetscScalar[],PetscViewer);
1501 
1502 #include <stddef.h>
1503 #include <string.h>             /* for memcpy, memset */
1504 #include <stdlib.h>
1505 
1506 #if defined(PETSC_HAVE_XMMINTRIN_H) && !defined(__CUDACC__)
1507 #include <xmmintrin.h>
1508 #endif
1509 
1510 /*@C
1511    PetscMemmove - Copies n bytes, beginning at location b, to the space
1512    beginning at location a. Copying  between regions that overlap will
1513    take place correctly. Use PetscMemcpy() if the locations do not overlap
1514 
1515    Not Collective
1516 
1517    Input Parameters:
1518 +  b - pointer to initial memory space
1519 .  a - pointer to copy space
1520 -  n - length (in bytes) of space to copy
1521 
1522    Level: intermediate
1523 
1524    Note:
1525    PetscArraymove() is preferred
1526    This routine is analogous to memmove().
1527 
1528    Developers Note: This is inlined for performance
1529 
1530 .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscMemzero()`, `PetscArraycmp()`, `PetscArraycpy()`, `PetscStrallocpy()`,
1531           `PetscArraymove()`
1532 @*/
1533 static inline PetscErrorCode PetscMemmove(void *a,const void *b,size_t n)
1534 {
1535   PetscFunctionBegin;
1536   if (n > 0) {
1537     PetscCheck(a,PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy to null pointer");
1538     PetscCheck(b,PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy from a null pointer");
1539   }
1540 #if !defined(PETSC_HAVE_MEMMOVE)
1541   if (a < b) {
1542     if (a <= b - n) memcpy(a,b,n);
1543     else {
1544       memcpy(a,b,(int)(b - a));
1545       PetscMemmove(b,b + (int)(b - a),n - (int)(b - a));
1546     }
1547   } else {
1548     if (b <= a - n) memcpy(a,b,n);
1549     else {
1550       memcpy(b + n,b + (n - (int)(a - b)),(int)(a - b));
1551       PetscMemmove(a,b,n - (int)(a - b));
1552     }
1553   }
1554 #else
1555   memmove((char*)(a),(char*)(b),n);
1556 #endif
1557   PetscFunctionReturn(0);
1558 }
1559 
1560 /*@C
1561    PetscMemcpy - Copies n bytes, beginning at location b, to the space
1562    beginning at location a. The two memory regions CANNOT overlap, use
1563    PetscMemmove() in that case.
1564 
1565    Not Collective
1566 
1567    Input Parameters:
1568 +  b - pointer to initial memory space
1569 -  n - length (in bytes) of space to copy
1570 
1571    Output Parameter:
1572 .  a - pointer to copy space
1573 
1574    Level: intermediate
1575 
1576    Compile Option:
1577     PETSC_PREFER_DCOPY_FOR_MEMCPY will cause the BLAS dcopy() routine to be used
1578                                   for memory copies on double precision values.
1579     PETSC_PREFER_COPY_FOR_MEMCPY will cause C code to be used
1580                                   for memory copies on double precision values.
1581     PETSC_PREFER_FORTRAN_FORMEMCPY will cause Fortran code to be used
1582                                   for memory copies on double precision values.
1583 
1584    Note:
1585    Prefer PetscArraycpy()
1586    This routine is analogous to memcpy().
1587    Not available from Fortran
1588 
1589    Developer Note: this is inlined for fastest performance
1590 
1591 .seealso: `PetscMemzero()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscArraycmp()`, `PetscArraycpy()`, `PetscMemmove()`, `PetscStrallocpy()`
1592 
1593 @*/
1594 static inline PetscErrorCode PetscMemcpy(void *a,const void *b,size_t n)
1595 {
1596 #if defined(PETSC_USE_DEBUG)
1597   size_t al = (size_t) a,bl = (size_t) b;
1598   size_t nl = (size_t) n;
1599   PetscFunctionBegin;
1600   if (n > 0) {
1601     PetscCheck(b,PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy from a null pointer");
1602     PetscCheck(a,PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy to a null pointer");
1603   }
1604 #else
1605   PetscFunctionBegin;
1606 #endif
1607   if (a != b && n > 0) {
1608 #if defined(PETSC_USE_DEBUG)
1609     PetscCheck(!((al > bl && (al - bl) < nl) || (bl - al) < nl),PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"Memory regions overlap: either use PetscMemmov()\n\
1610               or make sure your copy regions and lengths are correct. \n\
1611               Length (bytes) %zu first address %zu second address %zu",nl,al,bl);
1612 #endif
1613 #if (defined(PETSC_PREFER_DCOPY_FOR_MEMCPY) || defined(PETSC_PREFER_COPY_FOR_MEMCPY) || defined(PETSC_PREFER_FORTRAN_FORMEMCPY))
1614    if (!(a % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) {
1615       size_t len = n/sizeof(PetscScalar);
1616 #if defined(PETSC_PREFER_DCOPY_FOR_MEMCPY)
1617       PetscBLASInt one = 1,blen;
1618       PetscCall(PetscBLASIntCast(len,&blen));
1619       PetscStackCallBLAS("BLAScopy",BLAScopy_(&blen,(PetscScalar *)b,&one,(PetscScalar *)a,&one));
1620 #elif defined(PETSC_PREFER_FORTRAN_FORMEMCPY)
1621       fortrancopy_(&len,(PetscScalar*)b,(PetscScalar*)a);
1622 #else
1623       PetscScalar *x = (PetscScalar*)b, *y = (PetscScalar*)a;
1624       for (size_t i=0; i<len; i++) y[i] = x[i];
1625 #endif
1626     } else {
1627       memcpy((char*)(a),(char*)(b),n);
1628     }
1629 #else
1630     memcpy((char*)(a),(char*)(b),n);
1631 #endif
1632   }
1633   PetscFunctionReturn(0);
1634 }
1635 
1636 /*@C
1637    PetscMemzero - Zeros the specified memory.
1638 
1639    Not Collective
1640 
1641    Input Parameters:
1642 +  a - pointer to beginning memory location
1643 -  n - length (in bytes) of memory to initialize
1644 
1645    Level: intermediate
1646 
1647    Compile Option:
1648    PETSC_PREFER_BZERO - on certain machines (the IBM RS6000) the bzero() routine happens
1649   to be faster than the memset() routine. This flag causes the bzero() routine to be used.
1650 
1651    Not available from Fortran
1652    Prefer PetscArrayzero()
1653 
1654    Developer Note: this is inlined for fastest performance
1655 
1656 .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscArraycmp()`, `PetscArraycpy()`, `PetscMemmove()`, `PetscStrallocpy()`
1657 @*/
1658 static inline PetscErrorCode PetscMemzero(void *a,size_t n)
1659 {
1660   if (n > 0) {
1661 #if defined(PETSC_USE_DEBUG)
1662     PetscCheck(a,PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to zero at a null pointer with %zu bytes",n);
1663 #endif
1664 #if defined(PETSC_PREFER_ZERO_FOR_MEMZERO)
1665     if (!(((long) a) % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) {
1666       size_t      i,len = n/sizeof(PetscScalar);
1667       PetscScalar *x = (PetscScalar*)a;
1668       for (i=0; i<len; i++) x[i] = 0.0;
1669     } else {
1670 #elif defined(PETSC_PREFER_FORTRAN_FOR_MEMZERO)
1671     if (!(((long) a) % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) {
1672       PetscInt len = n/sizeof(PetscScalar);
1673       fortranzero_(&len,(PetscScalar*)a);
1674     } else {
1675 #endif
1676 #if defined(PETSC_PREFER_BZERO)
1677       bzero((char *)a,n);
1678 #else
1679       memset((char*)a,0,n);
1680 #endif
1681 #if defined(PETSC_PREFER_ZERO_FOR_MEMZERO) || defined(PETSC_PREFER_FORTRAN_FOR_MEMZERO)
1682     }
1683 #endif
1684   }
1685   return 0;
1686 }
1687 
1688 /*MC
1689    PetscArraycmp - Compares two arrays in memory.
1690 
1691    Synopsis:
1692     #include <petscsys.h>
1693     PetscErrorCode PetscArraycmp(const anytype *str1,const anytype *str2,size_t cnt,PetscBool *e)
1694 
1695    Not Collective
1696 
1697    Input Parameters:
1698 +  str1 - First array
1699 .  str2 - Second array
1700 -  cnt  - Count of the array, not in bytes, but number of entries in the arrays
1701 
1702    Output Parameters:
1703 .   e - PETSC_TRUE if equal else PETSC_FALSE.
1704 
1705    Level: intermediate
1706 
1707    Note:
1708    This routine is a preferred replacement to PetscMemcmp()
1709    The arrays must be of the same type
1710 
1711 .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscMemzero()`, `PetscArraycpy()`, `PetscMemmove()`, `PetscStrallocpy()`,
1712           `PetscArraymove()`
1713 M*/
1714 #define  PetscArraycmp(str1,str2,cnt,e) ((sizeof(*(str1)) != sizeof(*(str2))) || PetscMemcmp(str1,str2,(size_t)(cnt)*sizeof(*(str1)),e))
1715 
1716 /*MC
1717    PetscArraymove - Copies from one array in memory to another, the arrays may overlap. Use PetscArraycpy() when the arrays
1718                     do not overlap
1719 
1720    Synopsis:
1721     #include <petscsys.h>
1722     PetscErrorCode PetscArraymove(anytype *str1,const anytype *str2,size_t cnt)
1723 
1724    Not Collective
1725 
1726    Input Parameters:
1727 +  str1 - First array
1728 .  str2 - Second array
1729 -  cnt  - Count of the array, not in bytes, but number of entries in the arrays
1730 
1731    Level: intermediate
1732 
1733    Note:
1734    This routine is a preferred replacement to PetscMemmove()
1735    The arrays must be of the same type
1736 
1737 .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscMemzero()`, `PetscArraycpy()`, `PetscMemmove()`, `PetscArraycmp()`, `PetscStrallocpy()`
1738 M*/
1739 #define  PetscArraymove(str1,str2,cnt) ((sizeof(*(str1)) != sizeof(*(str2))) || PetscMemmove(str1,str2,(size_t)(cnt)*sizeof(*(str1))))
1740 
1741 /*MC
1742    PetscArraycpy - Copies from one array in memory to another
1743 
1744    Synopsis:
1745     #include <petscsys.h>
1746     PetscErrorCode PetscArraycpy(anytype *str1,const anytype *str2,size_t cnt)
1747 
1748    Not Collective
1749 
1750    Input Parameters:
1751 +  str1 - First array (destination)
1752 .  str2 - Second array (source)
1753 -  cnt  - Count of the array, not in bytes, but number of entries in the arrays
1754 
1755    Level: intermediate
1756 
1757    Note:
1758    This routine is a preferred replacement to PetscMemcpy()
1759    The arrays must be of the same type
1760 
1761 .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscMemzero()`, `PetscArraymove()`, `PetscMemmove()`, `PetscArraycmp()`, `PetscStrallocpy()`
1762 M*/
1763 #define  PetscArraycpy(str1,str2,cnt) ((sizeof(*(str1)) != sizeof(*(str2))) || PetscMemcpy(str1,str2,(size_t)(cnt)*sizeof(*(str1))))
1764 
1765 /*MC
1766    PetscArrayzero - Zeros an array in memory.
1767 
1768    Synopsis:
1769     #include <petscsys.h>
1770     PetscErrorCode PetscArrayzero(anytype *str1,size_t cnt)
1771 
1772    Not Collective
1773 
1774    Input Parameters:
1775 +  str1 - array
1776 -  cnt  - Count of the array, not in bytes, but number of entries in the array
1777 
1778    Level: intermediate
1779 
1780    Note:
1781    This routine is a preferred replacement to PetscMemzero()
1782 
1783 .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscMemzero()`, `PetscArraycmp()`, `PetscArraycpy()`, `PetscMemmove()`, `PetscStrallocpy()`, `PetscArraymove()`
1784 M*/
1785 #define  PetscArrayzero(str1,cnt) PetscMemzero(str1,(size_t)(cnt)*sizeof(*(str1)))
1786 
1787 /*MC
1788    PetscPrefetchBlock - Prefetches a block of memory
1789 
1790    Synopsis:
1791     #include <petscsys.h>
1792     void PetscPrefetchBlock(const anytype *a,size_t n,int rw,int t)
1793 
1794    Not Collective
1795 
1796    Input Parameters:
1797 +  a - pointer to first element to fetch (any type but usually PetscInt or PetscScalar)
1798 .  n - number of elements to fetch
1799 .  rw - 1 if the memory will be written to, otherwise 0 (ignored by many processors)
1800 -  t - temporal locality (PETSC_PREFETCH_HINT_{NTA,T0,T1,T2}), see note
1801 
1802    Level: developer
1803 
1804    Notes:
1805    The last two arguments (rw and t) must be compile-time constants.
1806 
1807    Adopting Intel's x86/x86-64 conventions, there are four levels of temporal locality.  Not all architectures offer
1808    equivalent locality hints, but the following macros are always defined to their closest analogue.
1809 +  PETSC_PREFETCH_HINT_NTA - Non-temporal.  Prefetches directly to L1, evicts to memory (skips higher level cache unless it was already there when prefetched).
1810 .  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.
1811 .  PETSC_PREFETCH_HINT_T1 - Fetch to level 2 and higher (not L1).
1812 -  PETSC_PREFETCH_HINT_T2 - Fetch to high-level cache only.  (On many systems, T0 and T1 are equivalent.)
1813 
1814    This function does nothing on architectures that do not support prefetch and never errors (even if passed an invalid
1815    address).
1816 
1817 M*/
1818 #define PetscPrefetchBlock(a,n,rw,t) do {                               \
1819     const char *_p = (const char*)(a),*_end = (const char*)((a)+(n));   \
1820     for (; _p < _end; _p += PETSC_LEVEL1_DCACHE_LINESIZE) PETSC_Prefetch(_p,(rw),(t)); \
1821   } while (0)
1822 
1823 /*
1824       Determine if some of the kernel computation routines use
1825    Fortran (rather than C) for the numerical calculations. On some machines
1826    and compilers (like complex numbers) the Fortran version of the routines
1827    is faster than the C/C++ versions. The flag --with-fortran-kernels
1828    should be used with ./configure to turn these on.
1829 */
1830 #if defined(PETSC_USE_FORTRAN_KERNELS)
1831 
1832 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTCRL)
1833 #define PETSC_USE_FORTRAN_KERNEL_MULTCRL
1834 #endif
1835 
1836 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTAIJPERM)
1837 #define PETSC_USE_FORTRAN_KERNEL_MULTAIJPERM
1838 #endif
1839 
1840 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTAIJ)
1841 #define PETSC_USE_FORTRAN_KERNEL_MULTAIJ
1842 #endif
1843 
1844 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ)
1845 #define PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ
1846 #endif
1847 
1848 #if !defined(PETSC_USE_FORTRAN_KERNEL_NORM)
1849 #define PETSC_USE_FORTRAN_KERNEL_NORM
1850 #endif
1851 
1852 #if !defined(PETSC_USE_FORTRAN_KERNEL_MAXPY)
1853 #define PETSC_USE_FORTRAN_KERNEL_MAXPY
1854 #endif
1855 
1856 #if !defined(PETSC_USE_FORTRAN_KERNEL_SOLVEAIJ)
1857 #define PETSC_USE_FORTRAN_KERNEL_SOLVEAIJ
1858 #endif
1859 
1860 #if !defined(PETSC_USE_FORTRAN_KERNEL_RELAXAIJ)
1861 #define PETSC_USE_FORTRAN_KERNEL_RELAXAIJ
1862 #endif
1863 
1864 #if !defined(PETSC_USE_FORTRAN_KERNEL_SOLVEBAIJ)
1865 #define PETSC_USE_FORTRAN_KERNEL_SOLVEBAIJ
1866 #endif
1867 
1868 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ)
1869 #define PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ
1870 #endif
1871 
1872 #if !defined(PETSC_USE_FORTRAN_KERNEL_MDOT)
1873 #define PETSC_USE_FORTRAN_KERNEL_MDOT
1874 #endif
1875 
1876 #if !defined(PETSC_USE_FORTRAN_KERNEL_XTIMESY)
1877 #define PETSC_USE_FORTRAN_KERNEL_XTIMESY
1878 #endif
1879 
1880 #if !defined(PETSC_USE_FORTRAN_KERNEL_AYPX)
1881 #define PETSC_USE_FORTRAN_KERNEL_AYPX
1882 #endif
1883 
1884 #if !defined(PETSC_USE_FORTRAN_KERNEL_WAXPY)
1885 #define PETSC_USE_FORTRAN_KERNEL_WAXPY
1886 #endif
1887 
1888 #endif
1889 
1890 /*
1891     Macros for indicating code that should be compiled with a C interface,
1892    rather than a C++ interface. Any routines that are dynamically loaded
1893    (such as the PCCreate_XXX() routines) must be wrapped so that the name
1894    mangler does not change the functions symbol name. This just hides the
1895    ugly extern "C" {} wrappers.
1896 */
1897 #if defined(__cplusplus)
1898 #  define EXTERN_C_BEGIN extern "C" {
1899 #  define EXTERN_C_END }
1900 #else
1901 #  define EXTERN_C_BEGIN
1902 #  define EXTERN_C_END
1903 #endif
1904 
1905 /* --------------------------------------------------------------------*/
1906 
1907 /*MC
1908     MPI_Comm - the basic object used by MPI to determine which processes are involved in a
1909         communication
1910 
1911    Level: beginner
1912 
1913    Note: This manual page is a place-holder because MPICH does not have a manual page for MPI_Comm
1914 
1915 .seealso: `PETSC_COMM_WORLD`, `PETSC_COMM_SELF`
1916 M*/
1917 
1918 #if defined(PETSC_HAVE_MPIIO)
1919 PETSC_EXTERN PetscErrorCode MPIU_File_write_all(MPI_File,void*,PetscMPIInt,MPI_Datatype,MPI_Status*);
1920 PETSC_EXTERN PetscErrorCode MPIU_File_read_all(MPI_File,void*,PetscMPIInt,MPI_Datatype,MPI_Status*);
1921 PETSC_EXTERN PetscErrorCode MPIU_File_write_at(MPI_File,MPI_Offset,void*,PetscMPIInt,MPI_Datatype,MPI_Status*);
1922 PETSC_EXTERN PetscErrorCode MPIU_File_read_at(MPI_File,MPI_Offset,void*,PetscMPIInt,MPI_Datatype,MPI_Status*);
1923 PETSC_EXTERN PetscErrorCode MPIU_File_write_at_all(MPI_File,MPI_Offset,void*,PetscMPIInt,MPI_Datatype,MPI_Status*);
1924 PETSC_EXTERN PetscErrorCode MPIU_File_read_at_all(MPI_File,MPI_Offset,void*,PetscMPIInt,MPI_Datatype,MPI_Status*);
1925 #endif
1926 
1927 /* the following petsc_static_inline require petscerror.h */
1928 
1929 /* Limit MPI to 32-bits */
1930 #define PETSC_MPI_INT_MAX  2147483647
1931 #define PETSC_MPI_INT_MIN -2147483647
1932 /* Limit BLAS to 32-bits */
1933 #define PETSC_BLAS_INT_MAX  2147483647
1934 #define PETSC_BLAS_INT_MIN -2147483647
1935 #define PETSC_CUBLAS_INT_MAX  2147483647
1936 
1937 /*@C
1938     PetscIntCast - casts a PetscInt64 (which is 64 bits in size) to a PetscInt (which may be 32 bits in size), generates an
1939          error if the PetscInt is not large enough to hold the number.
1940 
1941    Not Collective
1942 
1943    Input Parameter:
1944 .     a - the PetscInt64 value
1945 
1946    Output Parameter:
1947 .     b - the resulting PetscInt value
1948 
1949    Level: advanced
1950 
1951    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
1952 
1953    Not available from Fortran
1954 
1955 .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscMPIIntCast()`, `PetscBLASIntCast()`, `PetscIntMultError()`, `PetscIntSumError()`
1956 @*/
1957 static inline PetscErrorCode PetscIntCast(PetscInt64 a,PetscInt *b)
1958 {
1959   PetscFunctionBegin;
1960 #if !defined(PETSC_USE_64BIT_INDICES)
1961   if (a > PETSC_MAX_INT) {
1962     *b = 0;
1963     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);
1964   }
1965 #endif
1966   *b = (PetscInt)(a);
1967   PetscFunctionReturn(0);
1968 }
1969 
1970 /*@C
1971     PetscCountCast - casts a PetscCount to a PetscInt (which may be 32 bits in size), generates an
1972          error if the PetscInt is not large enough to hold the number.
1973 
1974    Not Collective
1975 
1976    Input Parameter:
1977 .     a - the PetscCount value
1978 
1979    Output Parameter:
1980 .     b - the resulting PetscInt value
1981 
1982    Level: advanced
1983 
1984    Notes:
1985      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
1986 
1987    Not available from Fortran
1988 
1989 .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscMPIIntCast()`, `PetscBLASIntCast()`, `PetscIntMultError()`, `PetscIntSumError()`, `PetscIntCast()`
1990 @*/
1991 static inline PetscErrorCode PetscCountCast(PetscCount a,PetscInt *b)
1992 {
1993   PetscFunctionBegin;
1994   if (sizeof(PetscCount) > sizeof(PetscInt) && a > PETSC_MAX_INT) {
1995     *b = 0;
1996     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);
1997   }
1998   *b = (PetscInt)(a);
1999   PetscFunctionReturn(0);
2000 }
2001 
2002 /*@C
2003     PetscBLASIntCast - casts a PetscInt (which may be 64 bits in size) to a PetscBLASInt (which may be 32 bits in size), generates an
2004          error if the PetscBLASInt is not large enough to hold the number.
2005 
2006    Not Collective
2007 
2008    Input Parameter:
2009 .     a - the PetscInt value
2010 
2011    Output Parameter:
2012 .     b - the resulting PetscBLASInt value
2013 
2014    Level: advanced
2015 
2016    Notes:
2017       Not available from Fortran
2018       Errors if the integer is negative since PETSc calls to BLAS/LAPACK never need to cast negative integer inputs
2019 
2020 .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscMPIIntCast()`, `PetscIntCast()`, `PetscCountCast()`
2021 @*/
2022 static inline PetscErrorCode PetscBLASIntCast(PetscInt a,PetscBLASInt *b)
2023 {
2024   PetscFunctionBegin;
2025   *b = 0;
2026   if (PetscDefined(USE_64BIT_INDICES) && !PetscDefined(HAVE_64BIT_BLAS_INDICES)) {
2027     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);
2028   }
2029   PetscCheck(a >= 0,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Passing negative integer to BLAS/LAPACK routine");
2030   *b = (PetscBLASInt)(a);
2031   PetscFunctionReturn(0);
2032 }
2033 
2034 /*@C
2035     PetscCuBLASIntCast - like PetscBLASIntCast(), but for PetscCuBLASInt.
2036 
2037    Not Collective
2038 
2039    Input Parameter:
2040 .     a - the PetscInt value
2041 
2042    Output Parameter:
2043 .     b - the resulting PetscCuBLASInt value
2044 
2045    Level: advanced
2046 
2047    Notes:
2048       Errors if the integer is negative since PETSc calls to cuBLAS and friends never need to cast negative integer inputs
2049 
2050 .seealso: `PetscCuBLASInt`, `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscBLASIntCast()`, `PetscMPIIntCast()`, `PetscIntCast()`
2051 @*/
2052 static inline PetscErrorCode PetscCuBLASIntCast(PetscInt a,PetscCuBLASInt *b)
2053 {
2054   PetscFunctionBegin;
2055   *b = 0;
2056   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);
2057   PetscCheck(a >= 0,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Passing negative integer to cuBLAS routine");
2058   *b = (PetscCuBLASInt)(a);
2059   PetscFunctionReturn(0);
2060 }
2061 
2062 /*@C
2063     PetscMPIIntCast - casts a PetscInt (which may be 64 bits in size) to a PetscMPIInt (which may be 32 bits in size), generates an
2064          error if the PetscMPIInt is not large enough to hold the number.
2065 
2066    Not Collective
2067 
2068    Input Parameter:
2069 .     a - the PetscInt value
2070 
2071    Output Parameter:
2072 .     b - the resulting PetscMPIInt value
2073 
2074    Level: advanced
2075 
2076    Not available from Fortran
2077 
2078 .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscBLASIntCast()`, `PetscIntCast()`
2079 @*/
2080 static inline PetscErrorCode PetscMPIIntCast(PetscInt a,PetscMPIInt *b)
2081 {
2082   PetscFunctionBegin;
2083   *b = 0;
2084   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);
2085   *b = (PetscMPIInt)(a);
2086   PetscFunctionReturn(0);
2087 }
2088 
2089 #define PetscInt64Mult(a,b)   ((PetscInt64)(a))*((PetscInt64)(b))
2090 
2091 /*@C
2092 
2093    PetscRealIntMultTruncate - Computes the product of a positive PetscReal and a positive PetscInt and truncates the value to slightly less than the maximal possible value
2094 
2095    Not Collective
2096 
2097    Input Parameters:
2098 +     a - the PetscReal value
2099 -     b - the second value
2100 
2101    Returns:
2102       the result as a PetscInt value
2103 
2104    Use PetscInt64Mult() to compute the product of two PetscInt as a PetscInt64
2105    Use PetscIntMultTruncate() to compute the product of two positive PetscInt and truncate to fit a PetscInt
2106    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
2107 
2108    Developers Note:
2109    We currently assume that PetscInt addition can never overflow, this is obviously wrong but requires many more checks.
2110 
2111    This is used where we compute approximate sizes for workspace and need to insure the workspace is index-able.
2112 
2113    Not available from Fortran
2114 
2115    Level: advanced
2116 
2117 .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscBLASIntCast()`, `PetscInt64Mult()`, `PetscIntMultError()`, `PetscIntSumError()`
2118 @*/
2119 static inline PetscInt PetscRealIntMultTruncate(PetscReal a,PetscInt b)
2120 {
2121   PetscInt64 r = (PetscInt64)(a*(PetscReal)b);
2122   if (r > PETSC_MAX_INT - 100) r = PETSC_MAX_INT - 100;
2123   return (PetscInt)r;
2124 }
2125 
2126 /*@C
2127 
2128    PetscIntMultTruncate - Computes the product of two positive PetscInt and truncates the value to slightly less than the maximal possible value
2129 
2130    Not Collective
2131 
2132    Input Parameters:
2133 +     a - the PetscInt value
2134 -     b - the second value
2135 
2136    Returns:
2137       the result as a PetscInt value
2138 
2139    Use PetscInt64Mult() to compute the product of two PetscInt as a PetscInt64
2140    Use PetscRealIntMultTruncate() to compute the product of a PetscReal and a PetscInt and truncate to fit a PetscInt
2141    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
2142 
2143    Not available from Fortran
2144 
2145    Developers Note: We currently assume that PetscInt addition can never overflow, this is obviously wrong but requires many more checks.
2146 
2147    This is used where we compute approximate sizes for workspace and need to insure the workspace is index-able.
2148 
2149    Level: advanced
2150 
2151 .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscBLASIntCast()`, `PetscInt64Mult()`, `PetscIntMultError()`, `PetscIntSumError()`
2152 @*/
2153 static inline PetscInt PetscIntMultTruncate(PetscInt a,PetscInt b)
2154 {
2155   PetscInt64 r = PetscInt64Mult(a,b);
2156   if (r > PETSC_MAX_INT - 100) r = PETSC_MAX_INT - 100;
2157   return (PetscInt)r;
2158 }
2159 
2160 /*@C
2161 
2162    PetscIntSumTruncate - Computes the sum of two positive PetscInt and truncates the value to slightly less than the maximal possible value
2163 
2164    Not Collective
2165 
2166    Input Parameters:
2167 +     a - the PetscInt value
2168 -     b - the second value
2169 
2170    Returns:
2171      the result as a PetscInt value
2172 
2173    Use PetscInt64Mult() to compute the product of two PetscInt as a PetscInt64
2174    Use PetscRealIntMultTruncate() to compute the product of a PetscReal and a PetscInt and truncate to fit a PetscInt
2175    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
2176 
2177    This is used where we compute approximate sizes for workspace and need to insure the workspace is index-able.
2178 
2179    Not available from Fortran
2180 
2181    Level: advanced
2182 
2183 .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscBLASIntCast()`, `PetscInt64Mult()`, `PetscIntMultError()`
2184 @*/
2185 static inline PetscInt PetscIntSumTruncate(PetscInt a,PetscInt b)
2186 {
2187   PetscInt64 r = ((PetscInt64)a) + ((PetscInt64)b);
2188   if (r > PETSC_MAX_INT - 100) r = PETSC_MAX_INT - 100;
2189   return (PetscInt)r;
2190 }
2191 
2192 /*@C
2193 
2194    PetscIntMultError - Computes the product of two positive PetscInt and generates an error with overflow.
2195 
2196    Not Collective
2197 
2198    Input Parameters:
2199 +     a - the PetscInt value
2200 -     b - the second value
2201 
2202    Output Parameter:
2203 .     result - the result as a PetscInt value, or NULL if you do not want the result, you just want to check if it overflows
2204 
2205    Use PetscInt64Mult() to compute the product of two 32 bit PetscInt and store in a PetscInt64
2206    Use PetscIntMultTruncate() to compute the product of two PetscInt and truncate it to fit in a PetscInt
2207 
2208    Not available from Fortran
2209 
2210    Developers Note: We currently assume that PetscInt addition does not overflow, this is obviously wrong but requires many more checks.
2211 
2212    Level: advanced
2213 
2214 .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscBLASIntCast()`, `PetscIntMult64()`, `PetscIntSumError()`
2215 @*/
2216 static inline PetscErrorCode PetscIntMultError(PetscInt a,PetscInt b,PetscInt *result)
2217 {
2218   PetscInt64 r;
2219 
2220   PetscFunctionBegin;
2221   r = PetscInt64Mult(a,b);
2222 #if !defined(PETSC_USE_64BIT_INDICES)
2223   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);
2224 #endif
2225   if (result) *result = (PetscInt)r;
2226   PetscFunctionReturn(0);
2227 }
2228 
2229 /*@C
2230 
2231    PetscIntSumError - Computes the sum of two positive PetscInt and generates an error with overflow.
2232 
2233    Not Collective
2234 
2235    Input Parameters:
2236 +     a - the PetscInt value
2237 -     b - the second value
2238 
2239    Output Parameter:
2240 .     c - the result as a PetscInt value,  or NULL if you do not want the result, you just want to check if it overflows
2241 
2242    Use PetscInt64Mult() to compute the product of two 32 bit PetscInt and store in a PetscInt64
2243    Use PetscIntMultTruncate() to compute the product of two PetscInt and truncate it to fit in a PetscInt
2244 
2245    Not available from Fortran
2246 
2247    Level: advanced
2248 
2249 .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscBLASIntCast()`, `PetscInt64Mult()`, `PetscIntMultError()`
2250 @*/
2251 static inline PetscErrorCode PetscIntSumError(PetscInt a,PetscInt b,PetscInt *result)
2252 {
2253   PetscInt64 r;
2254 
2255   PetscFunctionBegin;
2256   r  =  ((PetscInt64)a) + ((PetscInt64)b);
2257 #if !defined(PETSC_USE_64BIT_INDICES)
2258   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);
2259 #endif
2260   if (result) *result = (PetscInt) r;
2261   PetscFunctionReturn(0);
2262 }
2263 
2264 /*
2265      The IBM include files define hz, here we hide it so that it may be used as a regular user variable.
2266 */
2267 #if defined(hz)
2268 #  undef hz
2269 #endif
2270 
2271 #include <limits.h>
2272 
2273 /* The number of bits in a byte */
2274 
2275 #define PETSC_BITS_PER_BYTE CHAR_BIT
2276 
2277 #if defined(PETSC_HAVE_SYS_TYPES_H)
2278 #  include <sys/types.h>
2279 #endif
2280 
2281 /*MC
2282 
2283     PETSC_VERSION - This manual page provides information about how PETSc documents and uses its version information. This information is available to both C/C++
2284                     and Fortran compilers when petscsys.h is included.
2285 
2286     The current PETSc version and the API for accessing it are defined in petscversion.h
2287 
2288     The complete version number is given as the triple  PETSC_VERSION_MAJOR.PETSC_VERSION_MINOR.PETSC_VERSION_SUBMINOR (in short hand x.y.z)
2289 
2290     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
2291     where only a change in the major version number (x) indicates a change in the API.
2292 
2293     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
2294 
2295     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),
2296     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
2297     version number (x.y.z).
2298 
2299     PETSC_RELEASE_DATE is the date the x.y version was released (i.e. the version before any patch releases)
2300 
2301     PETSC_VERSION_DATE is the date the x.y.z version was released
2302 
2303     PETSC_VERSION_GIT is the last git commit to the repository given in the form vx.y.z-wwwww
2304 
2305     PETSC_VERSION_DATE_GIT is the date of the last git commit to the repository
2306 
2307     PETSC_VERSION_() is deprecated and will eventually be removed.
2308 
2309     Level: intermediate
2310 
2311 M*/
2312 
2313 PETSC_EXTERN PetscErrorCode PetscGetArchType(char[],size_t);
2314 PETSC_EXTERN PetscErrorCode PetscGetHostName(char[],size_t);
2315 PETSC_EXTERN PetscErrorCode PetscGetUserName(char[],size_t);
2316 PETSC_EXTERN PetscErrorCode PetscGetProgramName(char[],size_t);
2317 PETSC_EXTERN PetscErrorCode PetscSetProgramName(const char[]);
2318 PETSC_EXTERN PetscErrorCode PetscGetDate(char[],size_t);
2319 PETSC_EXTERN PetscErrorCode PetscGetVersion(char[], size_t);
2320 PETSC_EXTERN PetscErrorCode PetscGetVersionNumber(PetscInt*,PetscInt*,PetscInt*,PetscInt*);
2321 
2322 PETSC_EXTERN PetscErrorCode PetscSortedInt(PetscInt,const PetscInt[],PetscBool*);
2323 PETSC_EXTERN PetscErrorCode PetscSortedMPIInt(PetscInt,const PetscMPIInt[],PetscBool*);
2324 PETSC_EXTERN PetscErrorCode PetscSortedReal(PetscInt,const PetscReal[],PetscBool*);
2325 PETSC_EXTERN PetscErrorCode PetscSortInt(PetscInt,PetscInt[]);
2326 PETSC_EXTERN PetscErrorCode PetscSortReverseInt(PetscInt,PetscInt[]);
2327 PETSC_EXTERN PetscErrorCode PetscSortedRemoveDupsInt(PetscInt*,PetscInt[]);
2328 PETSC_EXTERN PetscErrorCode PetscSortedCheckDupsInt(PetscInt,const PetscInt[],PetscBool*);
2329 PETSC_EXTERN PetscErrorCode PetscSortRemoveDupsInt(PetscInt*,PetscInt[]);
2330 PETSC_EXTERN PetscErrorCode PetscCheckDupsInt(PetscInt,const PetscInt[],PetscBool*);
2331 PETSC_EXTERN PetscErrorCode PetscFindInt(PetscInt, PetscInt, const PetscInt[], PetscInt*);
2332 PETSC_EXTERN PetscErrorCode PetscFindMPIInt(PetscMPIInt, PetscInt, const PetscMPIInt[], PetscInt*);
2333 PETSC_EXTERN PetscErrorCode PetscSortIntWithPermutation(PetscInt,const PetscInt[],PetscInt[]);
2334 PETSC_EXTERN PetscErrorCode PetscSortStrWithPermutation(PetscInt,const char*[],PetscInt[]);
2335 PETSC_EXTERN PetscErrorCode PetscSortIntWithArray(PetscInt,PetscInt[],PetscInt[]);
2336 PETSC_EXTERN PetscErrorCode PetscSortIntWithCountArray(PetscCount,PetscInt[],PetscCount[]);
2337 PETSC_EXTERN PetscErrorCode PetscSortIntWithArrayPair(PetscInt,PetscInt[],PetscInt[],PetscInt[]);
2338 PETSC_EXTERN PetscErrorCode PetscSortIntWithIntCountArrayPair(PetscCount,PetscInt[],PetscInt[],PetscCount[]);
2339 PETSC_EXTERN PetscErrorCode PetscSortMPIInt(PetscInt,PetscMPIInt[]);
2340 PETSC_EXTERN PetscErrorCode PetscSortRemoveDupsMPIInt(PetscInt*,PetscMPIInt[]);
2341 PETSC_EXTERN PetscErrorCode PetscSortMPIIntWithArray(PetscMPIInt,PetscMPIInt[],PetscMPIInt[]);
2342 PETSC_EXTERN PetscErrorCode PetscSortMPIIntWithIntArray(PetscMPIInt,PetscMPIInt[],PetscInt[]);
2343 PETSC_EXTERN PetscErrorCode PetscSortIntWithScalarArray(PetscInt,PetscInt[],PetscScalar[]);
2344 PETSC_EXTERN PetscErrorCode PetscSortIntWithDataArray(PetscInt,PetscInt[],void*,size_t,void*);
2345 PETSC_EXTERN PetscErrorCode PetscSortReal(PetscInt,PetscReal[]);
2346 PETSC_EXTERN PetscErrorCode PetscSortRealWithArrayInt(PetscInt,PetscReal[],PetscInt[]);
2347 PETSC_EXTERN PetscErrorCode PetscSortRealWithPermutation(PetscInt,const PetscReal[],PetscInt[]);
2348 PETSC_EXTERN PetscErrorCode PetscSortRemoveDupsReal(PetscInt*,PetscReal[]);
2349 PETSC_EXTERN PetscErrorCode PetscFindReal(PetscReal,PetscInt,const PetscReal[],PetscReal,PetscInt*);
2350 PETSC_EXTERN PetscErrorCode PetscSortSplit(PetscInt,PetscInt,PetscScalar[],PetscInt[]);
2351 PETSC_EXTERN PetscErrorCode PetscSortSplitReal(PetscInt,PetscInt,PetscReal[],PetscInt[]);
2352 PETSC_EXTERN PetscErrorCode PetscProcessTree(PetscInt,const PetscBool [],const PetscInt[],PetscInt*,PetscInt**,PetscInt**,PetscInt**,PetscInt**);
2353 PETSC_EXTERN PetscErrorCode PetscMergeIntArrayPair(PetscInt,const PetscInt[],const PetscInt[],PetscInt,const PetscInt[],const PetscInt[],PetscInt*,PetscInt**,PetscInt**);
2354 PETSC_EXTERN PetscErrorCode PetscMergeIntArray(PetscInt,const PetscInt[],PetscInt,const PetscInt[],PetscInt*,PetscInt**);
2355 PETSC_EXTERN PetscErrorCode PetscMergeMPIIntArray(PetscInt,const PetscMPIInt[],PetscInt,const PetscMPIInt[],PetscInt*,PetscMPIInt**);
2356 PETSC_EXTERN PetscErrorCode PetscParallelSortedInt(MPI_Comm, PetscInt, const PetscInt[], PetscBool *);
2357 
2358 PETSC_EXTERN PetscErrorCode PetscTimSort(PetscInt,void*,size_t,int(*)(const void*,const void*,void*),void*);
2359 PETSC_EXTERN PetscErrorCode PetscIntSortSemiOrdered(PetscInt,PetscInt[]);
2360 PETSC_EXTERN PetscErrorCode PetscMPIIntSortSemiOrdered(PetscInt,PetscMPIInt[]);
2361 PETSC_EXTERN PetscErrorCode PetscRealSortSemiOrdered(PetscInt,PetscReal[]);
2362 PETSC_EXTERN PetscErrorCode PetscTimSortWithArray(PetscInt,void*,size_t,void*,size_t,int(*)(const void*,const void*,void*),void*);
2363 PETSC_EXTERN PetscErrorCode PetscIntSortSemiOrderedWithArray(PetscInt,PetscInt[],PetscInt[]);
2364 PETSC_EXTERN PetscErrorCode PetscMPIIntSortSemiOrderedWithArray(PetscInt,PetscMPIInt[],PetscMPIInt[]);
2365 PETSC_EXTERN PetscErrorCode PetscRealSortSemiOrderedWithArrayInt(PetscInt,PetscReal[],PetscInt[]);
2366 
2367 PETSC_EXTERN PetscErrorCode PetscSetDisplay(void);
2368 PETSC_EXTERN PetscErrorCode PetscGetDisplay(char[],size_t);
2369 
2370 /*J
2371     PetscRandomType - String with the name of a PETSc randomizer
2372 
2373    Level: beginner
2374 
2375    Notes:
2376    To use SPRNG or RANDOM123 you must have ./configure PETSc
2377    with the option --download-sprng or --download-random123
2378 
2379 .seealso: `PetscRandomSetType()`, `PetscRandom`, `PetscRandomCreate()`
2380 J*/
2381 typedef const char* PetscRandomType;
2382 #define PETSCRAND       "rand"
2383 #define PETSCRAND48     "rand48"
2384 #define PETSCSPRNG      "sprng"
2385 #define PETSCRANDER48   "rander48"
2386 #define PETSCRANDOM123  "random123"
2387 #define PETSCCURAND     "curand"
2388 
2389 /* Logging support */
2390 PETSC_EXTERN PetscClassId PETSC_RANDOM_CLASSID;
2391 
2392 PETSC_EXTERN PetscErrorCode PetscRandomInitializePackage(void);
2393 
2394 /* Dynamic creation and loading functions */
2395 PETSC_EXTERN PetscFunctionList PetscRandomList;
2396 
2397 PETSC_EXTERN PetscErrorCode PetscRandomRegister(const char[],PetscErrorCode (*)(PetscRandom));
2398 PETSC_EXTERN PetscErrorCode PetscRandomSetType(PetscRandom,PetscRandomType);
2399 PETSC_EXTERN PetscErrorCode PetscRandomSetFromOptions(PetscRandom);
2400 PETSC_EXTERN PetscErrorCode PetscRandomGetType(PetscRandom,PetscRandomType*);
2401 PETSC_EXTERN PetscErrorCode PetscRandomViewFromOptions(PetscRandom,PetscObject,const char[]);
2402 PETSC_EXTERN PetscErrorCode PetscRandomView(PetscRandom,PetscViewer);
2403 
2404 PETSC_EXTERN PetscErrorCode PetscRandomCreate(MPI_Comm,PetscRandom*);
2405 PETSC_EXTERN PetscErrorCode PetscRandomGetValue(PetscRandom,PetscScalar*);
2406 PETSC_EXTERN PetscErrorCode PetscRandomGetValueReal(PetscRandom,PetscReal*);
2407 PETSC_EXTERN PetscErrorCode PetscRandomGetValues(PetscRandom,PetscInt,PetscScalar*);
2408 PETSC_EXTERN PetscErrorCode PetscRandomGetValuesReal(PetscRandom,PetscInt,PetscReal*);
2409 PETSC_EXTERN PetscErrorCode PetscRandomGetInterval(PetscRandom,PetscScalar*,PetscScalar*);
2410 PETSC_EXTERN PetscErrorCode PetscRandomSetInterval(PetscRandom,PetscScalar,PetscScalar);
2411 PETSC_EXTERN PetscErrorCode PetscRandomSetSeed(PetscRandom,unsigned long);
2412 PETSC_EXTERN PetscErrorCode PetscRandomGetSeed(PetscRandom,unsigned long *);
2413 PETSC_EXTERN PetscErrorCode PetscRandomSeed(PetscRandom);
2414 PETSC_EXTERN PetscErrorCode PetscRandomDestroy(PetscRandom*);
2415 
2416 PETSC_EXTERN PetscErrorCode PetscGetFullPath(const char[],char[],size_t);
2417 PETSC_EXTERN PetscErrorCode PetscGetRelativePath(const char[],char[],size_t);
2418 PETSC_EXTERN PetscErrorCode PetscGetWorkingDirectory(char[],size_t);
2419 PETSC_EXTERN PetscErrorCode PetscGetRealPath(const char[],char[]);
2420 PETSC_EXTERN PetscErrorCode PetscGetHomeDirectory(char[],size_t);
2421 PETSC_EXTERN PetscErrorCode PetscTestFile(const char[],char,PetscBool *);
2422 PETSC_EXTERN PetscErrorCode PetscTestDirectory(const char[],char,PetscBool *);
2423 PETSC_EXTERN PetscErrorCode PetscMkdir(const char[]);
2424 PETSC_EXTERN PetscErrorCode PetscMkdtemp(char[]);
2425 PETSC_EXTERN PetscErrorCode PetscRMTree(const char[]);
2426 
2427 static inline PetscBool PetscBinaryBigEndian(void) {long _petsc_v = 1; return ((char*)&_petsc_v)[0] ? PETSC_FALSE : PETSC_TRUE;}
2428 
2429 PETSC_EXTERN PetscErrorCode PetscBinaryRead(int,void*,PetscInt,PetscInt*,PetscDataType);
2430 PETSC_EXTERN PetscErrorCode PetscBinarySynchronizedRead(MPI_Comm,int,void*,PetscInt,PetscInt*,PetscDataType);
2431 PETSC_EXTERN PetscErrorCode PetscBinaryWrite(int,const void*,PetscInt,PetscDataType);
2432 PETSC_EXTERN PetscErrorCode PetscBinarySynchronizedWrite(MPI_Comm,int,const void*,PetscInt,PetscDataType);
2433 PETSC_EXTERN PetscErrorCode PetscBinaryOpen(const char[],PetscFileMode,int *);
2434 PETSC_EXTERN PetscErrorCode PetscBinaryClose(int);
2435 PETSC_EXTERN PetscErrorCode PetscSharedTmp(MPI_Comm,PetscBool  *);
2436 PETSC_EXTERN PetscErrorCode PetscSharedWorkingDirectory(MPI_Comm,PetscBool  *);
2437 PETSC_EXTERN PetscErrorCode PetscGetTmp(MPI_Comm,char[],size_t);
2438 PETSC_EXTERN PetscErrorCode PetscFileRetrieve(MPI_Comm,const char[],char[],size_t,PetscBool *);
2439 PETSC_EXTERN PetscErrorCode PetscLs(MPI_Comm,const char[],char[],size_t,PetscBool *);
2440 #if defined(PETSC_USE_SOCKET_VIEWER)
2441 PETSC_EXTERN PetscErrorCode PetscOpenSocket(const char[],int,int*);
2442 #endif
2443 
2444 PETSC_EXTERN PetscErrorCode PetscBinarySeek(int,off_t,PetscBinarySeekType,off_t*);
2445 PETSC_EXTERN PetscErrorCode PetscBinarySynchronizedSeek(MPI_Comm,int,off_t,PetscBinarySeekType,off_t*);
2446 PETSC_EXTERN PetscErrorCode PetscByteSwap(void *,PetscDataType,PetscInt);
2447 
2448 PETSC_EXTERN PetscErrorCode PetscSetDebugTerminal(const char[]);
2449 PETSC_EXTERN PetscErrorCode PetscSetDebugger(const char[],PetscBool);
2450 PETSC_EXTERN PetscErrorCode PetscSetDefaultDebugger(void);
2451 PETSC_EXTERN PetscErrorCode PetscSetDebuggerFromString(const char*);
2452 PETSC_EXTERN PetscErrorCode PetscAttachDebugger(void);
2453 PETSC_EXTERN PetscErrorCode PetscStopForDebugger(void);
2454 PETSC_EXTERN PetscErrorCode PetscWaitOnError(void);
2455 
2456 PETSC_EXTERN PetscErrorCode PetscGatherNumberOfMessages(MPI_Comm,const PetscMPIInt[],const PetscMPIInt[],PetscMPIInt*);
2457 PETSC_EXTERN PetscErrorCode PetscGatherMessageLengths(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],PetscMPIInt**,PetscMPIInt**);
2458 PETSC_EXTERN PetscErrorCode PetscGatherMessageLengths2(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],const PetscMPIInt[],PetscMPIInt**,PetscMPIInt**,PetscMPIInt**);
2459 PETSC_EXTERN PetscErrorCode PetscPostIrecvInt(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],const PetscMPIInt[],PetscInt***,MPI_Request**);
2460 PETSC_EXTERN PetscErrorCode PetscPostIrecvScalar(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],const PetscMPIInt[],PetscScalar***,MPI_Request**);
2461 PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSided(MPI_Comm,PetscMPIInt,MPI_Datatype,PetscMPIInt,const PetscMPIInt*,const void*,PetscMPIInt*,PetscMPIInt**,void*)
2462   PetscAttrMPIPointerWithType(6,3);
2463 PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedF(MPI_Comm,PetscMPIInt,MPI_Datatype,PetscMPIInt,const PetscMPIInt[],const void*,PetscMPIInt*,PetscMPIInt**,void*,PetscMPIInt,
2464                                                     PetscErrorCode (*send)(MPI_Comm,const PetscMPIInt[],PetscMPIInt,PetscMPIInt,void*,MPI_Request[],void*),
2465                                                     PetscErrorCode (*recv)(MPI_Comm,const PetscMPIInt[],PetscMPIInt,void*,MPI_Request[],void*),void *ctx)
2466   PetscAttrMPIPointerWithType(6,3);
2467 PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedFReq(MPI_Comm,PetscMPIInt,MPI_Datatype,PetscMPIInt,const PetscMPIInt[],const void*,PetscMPIInt*,PetscMPIInt**,void*,PetscMPIInt,
2468                                                        MPI_Request**,MPI_Request**,
2469                                                        PetscErrorCode (*send)(MPI_Comm,const PetscMPIInt[],PetscMPIInt,PetscMPIInt,void*,MPI_Request[],void*),
2470                                                        PetscErrorCode (*recv)(MPI_Comm,const PetscMPIInt[],PetscMPIInt,void*,MPI_Request[],void*),void *ctx)
2471   PetscAttrMPIPointerWithType(6,3);
2472 
2473 PETSC_EXTERN const char *const PetscBuildTwoSidedTypes[];
2474 PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedSetType(MPI_Comm,PetscBuildTwoSidedType);
2475 PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedGetType(MPI_Comm,PetscBuildTwoSidedType*);
2476 
2477 PETSC_EXTERN PetscErrorCode PetscSSEIsEnabled(MPI_Comm,PetscBool*,PetscBool*);
2478 
2479 PETSC_EXTERN MPI_Comm PetscObjectComm(PetscObject);
2480 
2481 PETSC_EXTERN const char *const PetscSubcommTypes[];
2482 
2483 struct _n_PetscSubcomm {
2484   MPI_Comm         parent;           /* parent communicator */
2485   MPI_Comm         dupparent;        /* duplicate parent communicator, under which the processors of this subcomm have contiguous rank */
2486   MPI_Comm         child;            /* the sub-communicator */
2487   PetscMPIInt      n;                /* num of subcommunicators under the parent communicator */
2488   PetscMPIInt      color;            /* color of processors belong to this communicator */
2489   PetscMPIInt      *subsize;         /* size of subcommunicator[color] */
2490   PetscSubcommType type;
2491   char             *subcommprefix;
2492 };
2493 
2494 static inline MPI_Comm PetscSubcommParent(PetscSubcomm scomm) {return scomm->parent;}
2495 static inline MPI_Comm PetscSubcommChild(PetscSubcomm scomm) {return scomm->child;}
2496 static inline MPI_Comm PetscSubcommContiguousParent(PetscSubcomm scomm) {return scomm->dupparent;}
2497 PETSC_EXTERN PetscErrorCode PetscSubcommCreate(MPI_Comm,PetscSubcomm*);
2498 PETSC_EXTERN PetscErrorCode PetscSubcommDestroy(PetscSubcomm*);
2499 PETSC_EXTERN PetscErrorCode PetscSubcommSetNumber(PetscSubcomm,PetscInt);
2500 PETSC_EXTERN PetscErrorCode PetscSubcommSetType(PetscSubcomm,PetscSubcommType);
2501 PETSC_EXTERN PetscErrorCode PetscSubcommSetTypeGeneral(PetscSubcomm,PetscMPIInt,PetscMPIInt);
2502 PETSC_EXTERN PetscErrorCode PetscSubcommView(PetscSubcomm,PetscViewer);
2503 PETSC_EXTERN PetscErrorCode PetscSubcommSetFromOptions(PetscSubcomm);
2504 PETSC_EXTERN PetscErrorCode PetscSubcommSetOptionsPrefix(PetscSubcomm,const char[]);
2505 PETSC_EXTERN PetscErrorCode PetscSubcommGetParent(PetscSubcomm,MPI_Comm*);
2506 PETSC_EXTERN PetscErrorCode PetscSubcommGetContiguousParent(PetscSubcomm,MPI_Comm*);
2507 PETSC_EXTERN PetscErrorCode PetscSubcommGetChild(PetscSubcomm,MPI_Comm*);
2508 
2509 PETSC_EXTERN PetscErrorCode PetscHeapCreate(PetscInt,PetscHeap*);
2510 PETSC_EXTERN PetscErrorCode PetscHeapAdd(PetscHeap,PetscInt,PetscInt);
2511 PETSC_EXTERN PetscErrorCode PetscHeapPop(PetscHeap,PetscInt*,PetscInt*);
2512 PETSC_EXTERN PetscErrorCode PetscHeapPeek(PetscHeap,PetscInt*,PetscInt*);
2513 PETSC_EXTERN PetscErrorCode PetscHeapStash(PetscHeap,PetscInt,PetscInt);
2514 PETSC_EXTERN PetscErrorCode PetscHeapUnstash(PetscHeap);
2515 PETSC_EXTERN PetscErrorCode PetscHeapDestroy(PetscHeap*);
2516 PETSC_EXTERN PetscErrorCode PetscHeapView(PetscHeap,PetscViewer);
2517 
2518 PETSC_EXTERN PetscErrorCode PetscProcessPlacementView(PetscViewer);
2519 PETSC_EXTERN PetscErrorCode PetscShmCommGet(MPI_Comm,PetscShmComm*);
2520 PETSC_EXTERN PetscErrorCode PetscShmCommGlobalToLocal(PetscShmComm,PetscMPIInt,PetscMPIInt*);
2521 PETSC_EXTERN PetscErrorCode PetscShmCommLocalToGlobal(PetscShmComm,PetscMPIInt,PetscMPIInt*);
2522 PETSC_EXTERN PetscErrorCode PetscShmCommGetMpiShmComm(PetscShmComm,MPI_Comm*);
2523 
2524 /* routines to better support OpenMP multithreading needs of some PETSc third party libraries */
2525 PETSC_EXTERN PetscErrorCode PetscOmpCtrlCreate(MPI_Comm,PetscInt,PetscOmpCtrl*);
2526 PETSC_EXTERN PetscErrorCode PetscOmpCtrlGetOmpComms(PetscOmpCtrl,MPI_Comm*,MPI_Comm*,PetscBool*);
2527 PETSC_EXTERN PetscErrorCode PetscOmpCtrlDestroy(PetscOmpCtrl*);
2528 PETSC_EXTERN PetscErrorCode PetscOmpCtrlBarrier(PetscOmpCtrl);
2529 PETSC_EXTERN PetscErrorCode PetscOmpCtrlOmpRegionOnMasterBegin(PetscOmpCtrl);
2530 PETSC_EXTERN PetscErrorCode PetscOmpCtrlOmpRegionOnMasterEnd(PetscOmpCtrl);
2531 
2532 PETSC_EXTERN PetscErrorCode PetscSegBufferCreate(size_t,size_t,PetscSegBuffer*);
2533 PETSC_EXTERN PetscErrorCode PetscSegBufferDestroy(PetscSegBuffer*);
2534 PETSC_EXTERN PetscErrorCode PetscSegBufferGet(PetscSegBuffer,size_t,void*);
2535 PETSC_EXTERN PetscErrorCode PetscSegBufferExtractAlloc(PetscSegBuffer,void*);
2536 PETSC_EXTERN PetscErrorCode PetscSegBufferExtractTo(PetscSegBuffer,void*);
2537 PETSC_EXTERN PetscErrorCode PetscSegBufferExtractInPlace(PetscSegBuffer,void*);
2538 PETSC_EXTERN PetscErrorCode PetscSegBufferGetSize(PetscSegBuffer,size_t*);
2539 PETSC_EXTERN PetscErrorCode PetscSegBufferUnuse(PetscSegBuffer,size_t);
2540 
2541 /* Type-safe wrapper to encourage use of PETSC_RESTRICT. Does not use PetscFunctionBegin because the error handling
2542  * prevents the compiler from completely erasing the stub. This is called in inner loops so it has to be as fast as
2543  * possible. */
2544 static inline PetscErrorCode PetscSegBufferGetInts(PetscSegBuffer seg,size_t count,PetscInt *PETSC_RESTRICT *slot) {return PetscSegBufferGet(seg,count,(void**)slot);}
2545 
2546 extern PetscOptionsHelpPrinted PetscOptionsHelpPrintedSingleton;
2547 PETSC_EXTERN PetscErrorCode PetscOptionsHelpPrintedDestroy(PetscOptionsHelpPrinted*);
2548 PETSC_EXTERN PetscErrorCode PetscOptionsHelpPrintedCreate(PetscOptionsHelpPrinted*);
2549 PETSC_EXTERN PetscErrorCode PetscOptionsHelpPrintedCheck(PetscOptionsHelpPrinted,const char*,const char*,PetscBool*);
2550 
2551 #include <stdarg.h>
2552 PETSC_EXTERN PetscErrorCode PetscVSNPrintf(char*,size_t,const char[],size_t*,va_list);
2553 PETSC_EXTERN PetscErrorCode (*PetscVFPrintf)(FILE*,const char[],va_list);
2554 
2555 PETSC_EXTERN PetscSegBuffer PetscCitationsList;
2556 
2557 /*@C
2558       PetscCitationsRegister - Register a bibtex item to obtain credit for an implemented algorithm used in the code.
2559 
2560      Not Collective - only what is registered on rank 0 of PETSC_COMM_WORLD will be printed
2561 
2562      Input Parameters:
2563 +      cite - the bibtex item, formated to displayed on multiple lines nicely
2564 -      set - a boolean variable initially set to PETSC_FALSE; this is used to insure only a single registration of the citation
2565 
2566    Level: intermediate
2567 
2568    Not available from Fortran
2569 
2570      Options Database:
2571 .     -citations [filename]   - print out the bibtex entries for the given computation
2572 @*/
2573 static inline PetscErrorCode PetscCitationsRegister(const char cit[],PetscBool *set)
2574 {
2575   size_t  len;
2576   char   *vstring;
2577 
2578   PetscFunctionBegin;
2579   if (set && *set) PetscFunctionReturn(0);
2580   PetscCall(PetscStrlen(cit,&len));
2581   PetscCall(PetscSegBufferGet(PetscCitationsList,len,&vstring));
2582   PetscCall(PetscArraycpy(vstring,cit,len));
2583   if (set) *set = PETSC_TRUE;
2584   PetscFunctionReturn(0);
2585 }
2586 
2587 PETSC_EXTERN PETSC_DEPRECATED_FUNCTION("Google has discontinued its URL shortener service") PetscErrorCode PetscURLShorten(const char [],char [], size_t c);
2588 PETSC_EXTERN PetscErrorCode PetscGoogleDriveAuthorize(MPI_Comm,char[],char[],size_t);
2589 PETSC_EXTERN PetscErrorCode PetscGoogleDriveRefresh(MPI_Comm,const char[],char[],size_t);
2590 PETSC_EXTERN PetscErrorCode PetscGoogleDriveUpload(MPI_Comm,const char[],const char []);
2591 
2592 PETSC_EXTERN PetscErrorCode PetscBoxAuthorize(MPI_Comm,char[],char[],size_t);
2593 PETSC_EXTERN PetscErrorCode PetscBoxRefresh(MPI_Comm,const char[],char[],char[],size_t);
2594 
2595 PETSC_EXTERN PetscErrorCode PetscGlobusGetTransfers(MPI_Comm,const char[],char[],size_t);
2596 
2597 PETSC_EXTERN PetscErrorCode PetscTextBelt(MPI_Comm,const char[],const char[],PetscBool*);
2598 PETSC_EXTERN PetscErrorCode PetscTellMyCell(MPI_Comm,const char[],const char[],PetscBool*);
2599 
2600 PETSC_EXTERN PetscErrorCode PetscPullJSONValue(const char[],const char[],char[],size_t,PetscBool*);
2601 PETSC_EXTERN PetscErrorCode PetscPushJSONValue(char[],const char[],const char[],size_t);
2602 
2603 #if defined(PETSC_USE_DEBUG)
2604 static inline unsigned int PetscStrHash(const char *str)
2605 {
2606   unsigned int c,hash = 5381;
2607 
2608   while ((c = (unsigned int)*str++)) hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
2609   return hash;
2610 }
2611 
2612 /*MC
2613    MPIU_Allreduce - a PETSc replacement for MPI_Allreduce() that tries to determine if the call from all the MPI processes occur from the
2614                     same place in the PETSc code. This helps to detect bugs where different MPI processes follow different code paths
2615                     resulting in inconsistent and incorrect calls to MPI_Allreduce().
2616 
2617    Collective
2618 
2619    Synopsis:
2620      #include <petscsys.h>
2621      PetscErrorCode MPIU_Allreduce(void *indata,void *outdata,PetscMPIInt count,MPI_Datatype datatype, MPI_Op op, MPI_Comm comm);
2622 
2623    Input Parameters:
2624 +  a - pointer to the input data to be reduced
2625 .  c - the number of MPI data items in a and b
2626 .  d - the MPI datatype, for example MPI_INT
2627 .  e - the MPI operation, for example MPI_SUM
2628 -  fcomm - the MPI communicator on which the operation occurs
2629 
2630    Output Parameter:
2631 .  b - the reduced values
2632 
2633    Notes:
2634      In optimized mode this directly calls MPI_Allreduce()
2635 
2636      This is defined as a macro that can return error codes internally so it cannot be used in a subroutine that returns void.
2637 
2638      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
2639 
2640    Level: developer
2641 
2642 .seealso: `MPI_Allreduce()`
2643 M*/
2644 #define MPIU_Allreduce(a,b,c,d,e,fcomm) PetscMacroReturnStandard(                           \
2645     PetscMPIInt a_b1[6],a_b2[6];                                                               \
2646     int         _mpiu_allreduce_c_int = (int)c;                                                \
2647     a_b1[0] = -(PetscMPIInt)__LINE__;                          a_b1[1] = -a_b1[0];             \
2648     a_b1[2] = -(PetscMPIInt)PetscStrHash(PETSC_FUNCTION_NAME); a_b1[3] = -a_b1[2];             \
2649     a_b1[4] = -(PetscMPIInt)(c);                               a_b1[5] = -a_b1[4];             \
2650     PetscCallMPI(MPI_Allreduce(a_b1,a_b2,6,MPI_INT,MPI_MAX,fcomm));                               \
2651     PetscCheck(-a_b2[0] == a_b2[1],PETSC_COMM_SELF,PETSC_ERR_PLIB,"MPI_Allreduce() called in different locations (code lines) on different processors"); \
2652     PetscCheck(-a_b2[2] == a_b2[3],PETSC_COMM_SELF,PETSC_ERR_PLIB,"MPI_Allreduce() called in different locations (functions) on different processors"); \
2653     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); \
2654     PetscCallMPI(MPI_Allreduce((a),(b),(c),d,e,(fcomm)));                                         \
2655   )
2656 #else
2657 #define MPIU_Allreduce(a,b,c,d,e,fcomm) PetscMacroReturnStandard(PetscCallMPI(MPI_Allreduce((a),(b),(c),d,e,(fcomm))))
2658 #endif
2659 
2660 #if defined(PETSC_HAVE_MPI_PROCESS_SHARED_MEMORY)
2661 PETSC_EXTERN PetscErrorCode MPIU_Win_allocate_shared(MPI_Aint,PetscMPIInt,MPI_Info,MPI_Comm,void*,MPI_Win*);
2662 PETSC_EXTERN PetscErrorCode MPIU_Win_shared_query(MPI_Win,PetscMPIInt,MPI_Aint*,PetscMPIInt*,void*);
2663 #endif
2664 
2665 /* this is a vile hack */
2666 #if defined(PETSC_HAVE_NECMPI)
2667 #if !defined(PETSC_NECMPI_VERSION_MAJOR) ||                              \
2668     !defined(PETSC_NECMPI_VERSION_MINOR) ||                              \
2669     PETSC_NECMPI_VERSION_MAJOR < 2       ||                              \
2670     (PETSC_NECMPI_VERSION_MAJOR == 2 && PETSC_NECMPI_VERSION_MINOR < 18)
2671 #define MPI_Type_free(a) (*(a) = MPI_DATATYPE_NULL,0);
2672 #endif
2673 #endif
2674 
2675 /*
2676     List of external packages and queries on it
2677 */
2678 PETSC_EXTERN PetscErrorCode  PetscHasExternalPackage(const char[],PetscBool*);
2679 
2680 /*
2681  OpenMP support
2682 */
2683 #if defined(_OPENMP)
2684 #define PetscPragmaOMP(...) _Pragma(PetscStringize(omp __VA_ARGS__))
2685 #else // no OpenMP so no threads
2686 #define PetscPragmaOMP(...)
2687 #endif
2688 
2689 /* this cannot go here because it may be in a different shared library */
2690 PETSC_EXTERN PetscErrorCode PCMPIServerBegin(void);
2691 PETSC_EXTERN PetscErrorCode PCMPIServerEnd(void);
2692 PETSC_EXTERN PetscErrorCode PCMPICommsDestroy(void);
2693 #endif
2694