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