xref: /petsc/include/petscsys.h (revision ed170139b2a0d64288c7bf97cedbc4d7d1412afc)
1d382aafbSBarry Smith /*
2d382aafbSBarry Smith    This is the main PETSc include file (for C and C++).  It is included by all
3d382aafbSBarry Smith    other PETSc include files, so it almost never has to be specifically included.
447d993e7Ssuyashtn    Portions of this code are under:
547d993e7Ssuyashtn    Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved.
6d382aafbSBarry Smith */
76524c165SJacob Faibussowitsch #ifndef PETSCSYS_H
826bd1501SBarry Smith #define PETSCSYS_H
93ca90d2dSJacob Faibussowitsch 
10d382aafbSBarry Smith /* ========================================================================== */
11d382aafbSBarry Smith /*
12d382aafbSBarry Smith    petscconf.h is contained in ${PETSC_ARCH}/include/petscconf.h it is
131c77a0c5SBarry Smith    found automatically by the compiler due to the -I${PETSC_DIR}/${PETSC_ARCH}/include that
141c77a0c5SBarry Smith    PETSc's makefiles add to the compiler rules.
151c77a0c5SBarry Smith    For --prefix installs the directory ${PETSC_ARCH} does not exist and petscconf.h is in the same
161cc8b206SBarry Smith    directory as the other PETSc include files.
17d382aafbSBarry Smith */
182c8e378dSBarry Smith #include <petscconf.h>
191c77a0c5SBarry Smith #include <petscconf_poison.h>
202c8e378dSBarry Smith #include <petscfix.h>
21bde483f2SJacob Faibussowitsch #include <petscmacros.h>
2233bb201bSJacob Faibussowitsch 
23ac09b921SBarry Smith /* SUBMANSEC = Sys */
24ac09b921SBarry Smith 
2573fca5a0SBarry Smith #if defined(PETSC_DESIRE_FEATURE_TEST_MACROS)
2673fca5a0SBarry Smith   /*
2773fca5a0SBarry Smith    Feature test macros must be included before headers defined by IEEE Std 1003.1-2001
2873fca5a0SBarry Smith    We only turn these in PETSc source files that require them by setting PETSC_DESIRE_FEATURE_TEST_MACROS
2973fca5a0SBarry Smith */
30216f1ae6SBarry Smith   #if defined(PETSC__POSIX_C_SOURCE_200112L) && !defined(_POSIX_C_SOURCE)
3173fca5a0SBarry Smith     #define _POSIX_C_SOURCE 200112L
3273fca5a0SBarry Smith   #endif
33216f1ae6SBarry Smith   #if defined(PETSC__BSD_SOURCE) && !defined(_BSD_SOURCE)
3473fca5a0SBarry Smith     #define _BSD_SOURCE
3573fca5a0SBarry Smith   #endif
3607f00807SSatish Balay   #if defined(PETSC__DEFAULT_SOURCE) && !defined(_DEFAULT_SOURCE)
3707f00807SSatish Balay     #define _DEFAULT_SOURCE
3807f00807SSatish Balay   #endif
39ea0fecefSShri Abhyankar   #if defined(PETSC__GNU_SOURCE) && !defined(_GNU_SOURCE)
40ea0fecefSShri Abhyankar     #define _GNU_SOURCE
41ea0fecefSShri Abhyankar   #endif
4273fca5a0SBarry Smith #endif
4373fca5a0SBarry Smith 
44df4397b0SStefano Zampini #include <petscsystypes.h>
45df4397b0SStefano Zampini 
46d382aafbSBarry Smith /* ========================================================================== */
47d382aafbSBarry Smith 
48d382aafbSBarry Smith /*
49d382aafbSBarry Smith     Defines the interface to MPI allowing the use of all MPI functions.
50d382aafbSBarry Smith 
51d382aafbSBarry Smith     PETSc does not use the C++ binding of MPI at ALL. The following flag
52d382aafbSBarry Smith     makes sure the C++ bindings are not included. The C++ bindings REQUIRE
53d382aafbSBarry Smith     putting mpi.h before ANY C++ include files, we cannot control this
54d382aafbSBarry Smith     with all PETSc users. Users who want to use the MPI C++ bindings can include
55d382aafbSBarry Smith     mpicxx.h directly in their code
56d382aafbSBarry Smith */
57fa9e63e2SJed Brown #if !defined(MPICH_SKIP_MPICXX)
58d382aafbSBarry Smith   #define MPICH_SKIP_MPICXX 1
59fa9e63e2SJed Brown #endif
60fa9e63e2SJed Brown #if !defined(OMPI_SKIP_MPICXX)
61d382aafbSBarry Smith   #define OMPI_SKIP_MPICXX 1
62fa9e63e2SJed Brown #endif
63e771154cSJed Brown #if defined(PETSC_HAVE_MPIUNI)
64e771154cSJed Brown   #include <petsc/mpiuni/mpi.h>
65e771154cSJed Brown #else
662c8e378dSBarry Smith   #include <mpi.h>
67e771154cSJed Brown #endif
6865013866SBarry Smith 
69d382aafbSBarry Smith /*
70a7886beaSBarry Smith    Perform various sanity checks that the correct mpi.h is being included at compile time.
71a7886beaSBarry Smith    This usually happens because
72a7886beaSBarry Smith       * either an unexpected mpi.h is in the default compiler path (i.e. in /usr/include) or
73a7886beaSBarry Smith       * an extra include path -I/something (which contains the unexpected mpi.h) is being passed to the compiler
74a7886beaSBarry Smith */
75a7886beaSBarry Smith #if defined(PETSC_HAVE_MPIUNI)
766524c165SJacob Faibussowitsch   #ifndef MPIUNI_H
77a7886beaSBarry Smith     #error "PETSc was configured with --with-mpi=0 but now appears to be compiling using a different mpi.h"
78a7886beaSBarry Smith   #endif
7941f4af4cSSatish Balay #elif defined(PETSC_HAVE_I_MPI_NUMVERSION)
8041f4af4cSSatish Balay   #if !defined(I_MPI_NUMVERSION)
8141f4af4cSSatish Balay     #error "PETSc was configured with I_MPI but now appears to be compiling using a non-I_MPI mpi.h"
8241f4af4cSSatish Balay   #elif I_MPI_NUMVERSION != PETSC_HAVE_I_MPI_NUMVERSION
8341f4af4cSSatish Balay     #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"
8441f4af4cSSatish Balay   #endif
8541f4af4cSSatish Balay #elif defined(PETSC_HAVE_MVAPICH2_NUMVERSION)
8641f4af4cSSatish Balay   #if !defined(MVAPICH2_NUMVERSION)
8741f4af4cSSatish Balay     #error "PETSc was configured with MVAPICH2 but now appears to be compiling using a non-MVAPICH2 mpi.h"
8841f4af4cSSatish Balay   #elif MVAPICH2_NUMVERSION != PETSC_HAVE_MVAPICH2_NUMVERSION
8941f4af4cSSatish Balay     #error "PETSc was configured with one MVAPICH2 mpi.h version but now appears to be compiling using a different MVAPICH2 mpi.h version"
9041f4af4cSSatish Balay   #endif
91a7886beaSBarry Smith #elif defined(PETSC_HAVE_MPICH_NUMVERSION)
9241f4af4cSSatish Balay   #if !defined(MPICH_NUMVERSION) || defined(MVAPICH2_NUMVERSION) || defined(I_MPI_NUMVERSION)
93a7886beaSBarry Smith     #error "PETSc was configured with MPICH but now appears to be compiling using a non-MPICH mpi.h"
941c284764SMin RK   #elif (MPICH_NUMVERSION / 100000000 != PETSC_HAVE_MPICH_NUMVERSION / 100000000) || (MPICH_NUMVERSION / 100000 < PETSC_HAVE_MPICH_NUMVERSION / 100000) || (MPICH_NUMVERSION / 100000 == PETSC_HAVE_MPICH_NUMVERSION / 100000 && MPICH_NUMVERSION % 100000 / 1000 < PETSC_HAVE_MPICH_NUMVERSION % 100000 / 1000)
95a7886beaSBarry Smith     #error "PETSc was configured with one MPICH mpi.h version but now appears to be compiling using a different MPICH mpi.h version"
96a7886beaSBarry Smith   #endif
97a7886beaSBarry Smith #elif defined(PETSC_HAVE_OMPI_MAJOR_VERSION)
98a7886beaSBarry Smith   #if !defined(OMPI_MAJOR_VERSION)
99a7886beaSBarry Smith     #error "PETSc was configured with OpenMPI but now appears to be compiling using a non-OpenMPI mpi.h"
1001c284764SMin RK   #elif (OMPI_MAJOR_VERSION != PETSC_HAVE_OMPI_MAJOR_VERSION) || (OMPI_MINOR_VERSION < PETSC_HAVE_OMPI_MINOR_VERSION) || (OMPI_MINOR_VERSION == PETSC_HAVE_OMPI_MINOR_VERSION && OMPI_RELEASE_VERSION < PETSC_HAVE_OMPI_RELEASE_VERSION)
101c3ac57cfSSatish Balay     #error "PETSc was configured with one OpenMPI mpi.h version but now appears to be compiling using a different OpenMPI mpi.h version"
102a7886beaSBarry Smith   #endif
103d97fd468SStefano Zampini #elif defined(PETSC_HAVE_MSMPI_VERSION)
104d97fd468SStefano Zampini   #if !defined(MSMPI_VER)
105d97fd468SStefano Zampini     #error "PETSc was configured with MSMPI but now appears to be compiling using a non-MSMPI mpi.h"
106d97fd468SStefano Zampini   #elif (MSMPI_VER != PETSC_HAVE_MSMPI_VERSION)
107d97fd468SStefano Zampini     #error "PETSc was configured with one MSMPI mpi.h version but now appears to be compiling using a different MSMPI mpi.h version"
108d97fd468SStefano Zampini   #endif
109d97fd468SStefano Zampini #elif defined(OMPI_MAJOR_VERSION) || defined(MPICH_NUMVERSION) || defined(MSMPI_VER)
110d97fd468SStefano Zampini   #error "PETSc was configured with undetermined MPI - but now appears to be compiling using any of OpenMPI, MS-MPI or a MPICH variant"
111a7886beaSBarry Smith #endif
112a7886beaSBarry Smith 
113a7886beaSBarry Smith /*
1142981ebdbSBarry Smith     Need to put stdio.h AFTER mpi.h for MPICH2 with C++ compiler
115d382aafbSBarry Smith     see the top of mpicxx.h in the MPICH2 distribution.
116d382aafbSBarry Smith */
117d382aafbSBarry Smith #include <stdio.h>
118d382aafbSBarry Smith 
119d382aafbSBarry Smith /* MSMPI on 32bit windows requires this yukky hack - that breaks MPI standard compliance */
120d382aafbSBarry Smith #if !defined(MPIAPI)
121d382aafbSBarry Smith   #define MPIAPI
122d382aafbSBarry Smith #endif
123d382aafbSBarry Smith 
12493d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU_ENUM PETSC_ATTRIBUTE_MPI_TYPE_TAG(PetscEnum);
12593d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU_BOOL PETSC_ATTRIBUTE_MPI_TYPE_TAG(PetscBool);
126e28ce29aSPatrick Sanan 
127e28ce29aSPatrick Sanan /*MC
12887497f52SBarry Smith    MPIU_INT - Portable MPI datatype corresponding to `PetscInt` independent of the precision of `PetscInt`
129e28ce29aSPatrick Sanan 
130e28ce29aSPatrick Sanan    Notes:
13187497f52SBarry Smith    In MPI calls that require an MPI datatype that matches a `PetscInt` or array of `PetscInt` values, pass this value.
132e28ce29aSPatrick Sanan 
133e28ce29aSPatrick Sanan    Level: beginner
134e28ce29aSPatrick Sanan 
135db781477SPatrick Sanan .seealso: `PetscReal`, `PetscScalar`, `PetscComplex`, `PetscInt`, `MPIU_REAL`, `MPIU_SCALAR`, `MPIU_COMPLEX`
136e28ce29aSPatrick Sanan M*/
137e28ce29aSPatrick Sanan 
1387cdaf61dSJed Brown PETSC_EXTERN MPI_Datatype MPIU_FORTRANADDR;
139b7b8f77aSBarry Smith 
140d382aafbSBarry Smith #if defined(PETSC_USE_64BIT_INDICES)
141bd84f1cfSSatish Balay   #define MPIU_INT MPIU_INT64
142d382aafbSBarry Smith #else
143d382aafbSBarry Smith   #define MPIU_INT MPI_INT
144d382aafbSBarry Smith #endif
145d382aafbSBarry Smith 
146503cfb0cSBarry Smith /*
147503cfb0cSBarry Smith     For the rare cases when one needs to send a size_t object with MPI
148503cfb0cSBarry Smith */
14993d501b3SJacob Faibussowitsch PETSC_EXTERN MPI_Datatype MPIU_SIZE_T PETSC_ATTRIBUTE_MPI_TYPE_TAG(size_t);
150d382aafbSBarry Smith 
151d382aafbSBarry Smith /*
152d382aafbSBarry Smith       You can use PETSC_STDOUT as a replacement of stdout. You can also change
153d382aafbSBarry Smith     the value of PETSC_STDOUT to redirect all standard output elsewhere
154d382aafbSBarry Smith */
155014dd563SJed Brown PETSC_EXTERN FILE *PETSC_STDOUT;
156d382aafbSBarry Smith 
157d382aafbSBarry Smith /*
158d382aafbSBarry Smith       You can use PETSC_STDERR as a replacement of stderr. You can also change
159d382aafbSBarry Smith     the value of PETSC_STDERR to redirect all standard error elsewhere
160d382aafbSBarry Smith */
161014dd563SJed Brown PETSC_EXTERN FILE *PETSC_STDERR;
162d382aafbSBarry Smith 
163c8b9133aSSatish Balay /* PetscPragmaSIMD - from CeedPragmaSIMD */
164c8b9133aSSatish Balay 
1655c993f7fSStefano Zampini #if defined(__NEC__)
1665c993f7fSStefano Zampini   #define PetscPragmaSIMD _Pragma("_NEC ivdep")
1675c993f7fSStefano Zampini #elif defined(__INTEL_COMPILER) && !defined(_WIN32)
168c8b9133aSSatish Balay   #define PetscPragmaSIMD _Pragma("vector")
1691dba8834SJose E. Roman #elif defined(__GNUC__) && __GNUC__ >= 5 && !defined(__PGI)
170c8b9133aSSatish Balay   #define PetscPragmaSIMD _Pragma("GCC ivdep")
171e5518150SSatish Balay #elif defined(_OPENMP) && _OPENMP >= 201307
172e5518150SSatish Balay   #if defined(_MSC_VER)
173160a5775SAli Reza Khaz'ali     #define PetscPragmaSIMD __pragma(omp simd)
174e5518150SSatish Balay   #else
175e5518150SSatish Balay     #define PetscPragmaSIMD _Pragma("omp simd")
176e5518150SSatish Balay   #endif
177c8b9133aSSatish Balay #elif defined(PETSC_HAVE_CRAY_VECTOR)
178c8b9133aSSatish Balay   #define PetscPragmaSIMD _Pragma("_CRI ivdep")
179c8b9133aSSatish Balay #else
180c8b9133aSSatish Balay   #define PetscPragmaSIMD
181c8b9133aSSatish Balay #endif
182c8b9133aSSatish Balay 
183d382aafbSBarry Smith /*
184d382aafbSBarry Smith     Declare extern C stuff after including external header files
185d382aafbSBarry Smith */
186d382aafbSBarry Smith 
1876edef35eSSatish Balay PETSC_EXTERN PetscBool PETSC_RUNNING_ON_VALGRIND;
1888b49ba18SBarry Smith /*
189390e1bf2SBarry Smith     Defines elementary mathematics functions and constants.
1908b49ba18SBarry Smith */
1918b49ba18SBarry Smith #include <petscmath.h>
1928b49ba18SBarry Smith 
193d382aafbSBarry Smith /*MC
1940298fd71SBarry Smith     PETSC_IGNORE - same as NULL, means PETSc will ignore this argument
195d382aafbSBarry Smith 
196d382aafbSBarry Smith    Level: beginner
197d382aafbSBarry Smith 
198e28ce29aSPatrick Sanan    Note:
19987497f52SBarry Smith    Accepted by many PETSc functions to not set a parameter and instead use some default
200d382aafbSBarry Smith 
20187497f52SBarry Smith    Fortran Note:
20287497f52SBarry Smith    This macro does not exist in Fortran; you must use `PETSC_NULL_INTEGER`, `PETSC_NULL_DOUBLE_PRECISION` etc
203d382aafbSBarry Smith 
204db781477SPatrick Sanan .seealso: `PETSC_DECIDE`, `PETSC_DEFAULT`, `PETSC_DETERMINE`
205d382aafbSBarry Smith 
206d382aafbSBarry Smith M*/
207f3fa974cSJacob Faibussowitsch #define PETSC_IGNORE PETSC_NULLPTR
208f3fa974cSJacob Faibussowitsch #define PETSC_NULL   PETSC_DEPRECATED_MACRO("GCC warning \"PETSC_NULL is deprecated, use PETSC_NULLPTR instead (since version 3.19)\"") PETSC_NULLPTR
209c528d872SBarry Smith 
210d382aafbSBarry Smith /*MC
211557d4da8SBarry Smith     PETSC_DECIDE - standard way of passing in integer or floating point parameter
212557d4da8SBarry Smith        where you wish PETSc to use the default.
213557d4da8SBarry Smith 
214557d4da8SBarry Smith    Level: beginner
215557d4da8SBarry Smith 
216db781477SPatrick Sanan .seealso: `PETSC_DEFAULT`, `PETSC_IGNORE`, `PETSC_DETERMINE`
217557d4da8SBarry Smith 
218557d4da8SBarry Smith M*/
219557d4da8SBarry Smith 
220557d4da8SBarry Smith /*MC
221d382aafbSBarry Smith     PETSC_DETERMINE - standard way of passing in integer or floating point parameter
222d382aafbSBarry Smith        where you wish PETSc to compute the required value.
223d382aafbSBarry Smith 
224d382aafbSBarry Smith    Level: beginner
225d382aafbSBarry Smith 
226e28ce29aSPatrick Sanan    Developer Note:
22787497f52SBarry Smith    I would like to use const `PetscInt` `PETSC_DETERMINE` = `PETSC_DECIDE`; but for
22887497f52SBarry Smith      some reason this is not allowed by the standard even though `PETSC_DECIDE` is a constant value.
229557d4da8SBarry Smith 
230db781477SPatrick Sanan .seealso: `PETSC_DECIDE`, `PETSC_DEFAULT`, `PETSC_IGNORE`, `VecSetSizes()`
231d382aafbSBarry Smith 
232d382aafbSBarry Smith M*/
233d382aafbSBarry Smith 
234d382aafbSBarry Smith /*MC
235557d4da8SBarry Smith     PETSC_DEFAULT - standard way of passing in integer or floating point parameter
236557d4da8SBarry Smith        where you wish PETSc to use the default.
237557d4da8SBarry Smith 
238557d4da8SBarry Smith    Level: beginner
239557d4da8SBarry Smith 
24087497f52SBarry Smith    Fortran Note:
24187497f52SBarry Smith    You need to use `PETSC_DEFAULT_INTEGER` or `PETSC_DEFAULT_REAL`.
242557d4da8SBarry Smith 
243db781477SPatrick Sanan .seealso: `PETSC_DECIDE`, `PETSC_IGNORE`, `PETSC_DETERMINE`
244557d4da8SBarry Smith 
245557d4da8SBarry Smith M*/
246f3fa974cSJacob Faibussowitsch enum {
247f3fa974cSJacob Faibussowitsch   PETSC_DECIDE    = -1,
248f3fa974cSJacob Faibussowitsch   PETSC_DETERMINE = PETSC_DECIDE,
249f3fa974cSJacob Faibussowitsch   PETSC_DEFAULT   = -2
250f3fa974cSJacob Faibussowitsch };
251557d4da8SBarry Smith 
252557d4da8SBarry Smith /*MC
25387497f52SBarry Smith     PETSC_COMM_WORLD - the equivalent of the `MPI_COMM_WORLD` communicator which represents
254ea8fe74dSBarry Smith            all the processes that PETSc knows about.
255d382aafbSBarry Smith 
256d382aafbSBarry Smith    Level: beginner
257d382aafbSBarry Smith 
258e28ce29aSPatrick Sanan    Notes:
25987497f52SBarry Smith    By default `PETSC_COMM_WORLD` and `MPI_COMM_WORLD` are identical unless you wish to
26087497f52SBarry Smith           run PETSc on ONLY a subset of `MPI_COMM_WORLD`. In that case create your new (smaller)
26187497f52SBarry Smith           communicator, call it, say comm, and set `PETSC_COMM_WORLD` = comm BEFORE calling
26287497f52SBarry Smith           PetscInitialize(), but after `MPI_Init()` has been called.
263a990b902SBarry Smith 
26487497f52SBarry Smith           The value of `PETSC_COMM_WORLD` should never be USED/accessed before `PetscInitialize()`
265a990b902SBarry Smith           is called because it may not have a valid value yet.
266d382aafbSBarry Smith 
267db781477SPatrick Sanan .seealso: `PETSC_COMM_SELF`
268d382aafbSBarry Smith 
269d382aafbSBarry Smith M*/
270014dd563SJed Brown PETSC_EXTERN MPI_Comm PETSC_COMM_WORLD;
271d382aafbSBarry Smith 
272d382aafbSBarry Smith /*MC
27387497f52SBarry Smith     PETSC_COMM_SELF - This is always `MPI_COMM_SELF`
274d382aafbSBarry Smith 
275d382aafbSBarry Smith    Level: beginner
276d382aafbSBarry Smith 
277e28ce29aSPatrick Sanan    Notes:
278e28ce29aSPatrick Sanan    Do not USE/access or set this variable before PetscInitialize() has been called.
279a990b902SBarry Smith 
280db781477SPatrick Sanan .seealso: `PETSC_COMM_WORLD`
281d382aafbSBarry Smith 
282d382aafbSBarry Smith M*/
283d382aafbSBarry Smith #define PETSC_COMM_SELF MPI_COMM_SELF
284d382aafbSBarry Smith 
2856de5d289SStefano Zampini /*MC
2866de5d289SStefano Zampini     PETSC_MPI_THREAD_REQUIRED - the required threading support used if PETSc initializes
28787497f52SBarry Smith            MPI with `MPI_Init_thread()`.
2886de5d289SStefano Zampini 
2896de5d289SStefano Zampini    Level: beginner
2906de5d289SStefano Zampini 
2916de5d289SStefano Zampini    Notes:
29287497f52SBarry Smith    By default `PETSC_MPI_THREAD_REQUIRED` equals `MPI_THREAD_FUNNELED`.
2936de5d289SStefano Zampini 
294db781477SPatrick Sanan .seealso: `PetscInitialize()`
2956de5d289SStefano Zampini 
2966de5d289SStefano Zampini M*/
2976de5d289SStefano Zampini PETSC_EXTERN PetscMPIInt PETSC_MPI_THREAD_REQUIRED;
2986de5d289SStefano Zampini 
299d6f2c3cbSBarry Smith PETSC_EXTERN PetscBool PetscBeganMPI;
3008ad20175SVaclav Hapla PETSC_EXTERN PetscBool PetscErrorHandlingInitialized;
301014dd563SJed Brown PETSC_EXTERN PetscBool PetscInitializeCalled;
302014dd563SJed Brown PETSC_EXTERN PetscBool PetscFinalizeCalled;
3034cf1874eSKarl Rupp PETSC_EXTERN PetscBool PetscViennaCLSynchronize;
304d382aafbSBarry Smith 
305014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetHelpVersionFunctions(PetscErrorCode (*)(MPI_Comm), PetscErrorCode (*)(MPI_Comm));
306014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscCommDuplicate(MPI_Comm, MPI_Comm *, int *);
307014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscCommDestroy(MPI_Comm *);
30857f21012SBarry Smith PETSC_EXTERN PetscErrorCode PetscCommGetComm(MPI_Comm, MPI_Comm *);
30957f21012SBarry Smith PETSC_EXTERN PetscErrorCode PetscCommRestoreComm(MPI_Comm, MPI_Comm *);
310d382aafbSBarry Smith 
31159e55d94SJunchao Zhang #if defined(PETSC_HAVE_KOKKOS)
31259e55d94SJunchao Zhang PETSC_EXTERN PetscErrorCode PetscKokkosInitializeCheck(void); /* Initialize Kokkos if not yet. */
31359e55d94SJunchao Zhang #endif
31459e55d94SJunchao Zhang 
31571438e86SJunchao Zhang #if defined(PETSC_HAVE_NVSHMEM)
31671438e86SJunchao Zhang PETSC_EXTERN PetscBool      PetscBeganNvshmem;
31771438e86SJunchao Zhang PETSC_EXTERN PetscBool      PetscNvshmemInitialized;
31871438e86SJunchao Zhang PETSC_EXTERN PetscErrorCode PetscNvshmemFinalize(void);
31971438e86SJunchao Zhang #endif
32071438e86SJunchao Zhang 
321540e20f2SPierre Jolivet #if defined(PETSC_HAVE_ELEMENTAL)
322540e20f2SPierre Jolivet PETSC_EXTERN PetscErrorCode PetscElementalInitializePackage(void);
323540e20f2SPierre Jolivet PETSC_EXTERN PetscErrorCode PetscElementalInitialized(PetscBool *);
324540e20f2SPierre Jolivet PETSC_EXTERN PetscErrorCode PetscElementalFinalizePackage(void);
325540e20f2SPierre Jolivet #endif
326540e20f2SPierre Jolivet 
327d382aafbSBarry Smith /*MC
32887497f52SBarry Smith    PetscMalloc - Allocates memory, One should use `PetscNew()`, `PetscMalloc1()` or `PetscCalloc1()` usually instead of this
329d382aafbSBarry Smith 
330eca87e8dSBarry Smith    Synopsis:
331aaa7dc30SBarry Smith     #include <petscsys.h>
332eca87e8dSBarry Smith    PetscErrorCode PetscMalloc(size_t m,void **result)
333eca87e8dSBarry Smith 
334eca87e8dSBarry Smith    Not Collective
335eca87e8dSBarry Smith 
336d382aafbSBarry Smith    Input Parameter:
337d382aafbSBarry Smith .  m - number of bytes to allocate
338d382aafbSBarry Smith 
339d382aafbSBarry Smith    Output Parameter:
340d382aafbSBarry Smith .  result - memory allocated
341d382aafbSBarry Smith 
342d382aafbSBarry Smith    Level: beginner
343d382aafbSBarry Smith 
34449d7da52SJed Brown    Notes:
34549d7da52SJed Brown    Memory is always allocated at least double aligned
346d382aafbSBarry Smith 
34787497f52SBarry Smith    It is safe to allocate size 0 and pass the resulting pointer (which may or may not be NULL) to `PetscFree()`.
348d382aafbSBarry Smith 
349db781477SPatrick Sanan .seealso: `PetscFree()`, `PetscNew()`
350d382aafbSBarry Smith 
351d382aafbSBarry Smith M*/
352071fcb05SBarry Smith #define PetscMalloc(a, b) ((*PetscTrMalloc)((a), PETSC_FALSE, __LINE__, PETSC_FUNCTION_NAME, __FILE__, (void **)(b)))
353d382aafbSBarry Smith 
354d382aafbSBarry Smith /*MC
355d5b43468SJose E. Roman    PetscRealloc - Reallocates memory
3563221ece2SMatthew G. Knepley 
3573221ece2SMatthew G. Knepley    Synopsis:
3583221ece2SMatthew G. Knepley     #include <petscsys.h>
3593221ece2SMatthew G. Knepley    PetscErrorCode PetscRealloc(size_t m,void **result)
3603221ece2SMatthew G. Knepley 
3613221ece2SMatthew G. Knepley    Not Collective
3623221ece2SMatthew G. Knepley 
3633221ece2SMatthew G. Knepley    Input Parameters:
3643221ece2SMatthew G. Knepley +  m - number of bytes to allocate
36592f119d6SBarry Smith -  result - previous memory
3663221ece2SMatthew G. Knepley 
3673221ece2SMatthew G. Knepley    Output Parameter:
3683221ece2SMatthew G. Knepley .  result - new memory allocated
3693221ece2SMatthew G. Knepley 
3703221ece2SMatthew G. Knepley    Level: developer
3713221ece2SMatthew G. Knepley 
3723221ece2SMatthew G. Knepley    Notes:
3733221ece2SMatthew G. Knepley    Memory is always allocated at least double aligned
3743221ece2SMatthew G. Knepley 
375db781477SPatrick Sanan .seealso: `PetscMalloc()`, `PetscFree()`, `PetscNew()`
3763221ece2SMatthew G. Knepley 
3773221ece2SMatthew G. Knepley M*/
3783221ece2SMatthew G. Knepley #define PetscRealloc(a, b) ((*PetscTrRealloc)((a), __LINE__, PETSC_FUNCTION_NAME, __FILE__, (void **)(b)))
3793221ece2SMatthew G. Knepley 
3803221ece2SMatthew G. Knepley /*MC
38187497f52SBarry Smith    PetscAddrAlign - Rounds up an address to `PETSC_MEMALIGN` alignment
382d382aafbSBarry Smith 
383d382aafbSBarry Smith    Synopsis:
384aaa7dc30SBarry Smith     #include <petscsys.h>
385d382aafbSBarry Smith    void *PetscAddrAlign(void *addr)
386d382aafbSBarry Smith 
387eca87e8dSBarry Smith    Not Collective
388eca87e8dSBarry Smith 
389eca87e8dSBarry Smith    Input Parameters:
390eca87e8dSBarry Smith .  addr - address to align (any pointer type)
391eca87e8dSBarry Smith 
392d382aafbSBarry Smith    Level: developer
393d382aafbSBarry Smith 
394db781477SPatrick Sanan .seealso: `PetscMallocAlign()`
395d382aafbSBarry Smith 
396d382aafbSBarry Smith M*/
397f3fa974cSJacob Faibussowitsch #define PetscAddrAlign(a) ((void *)((((PETSC_UINTPTR_T)(a)) + (PETSC_MEMALIGN - 1)) & ~(PETSC_MEMALIGN - 1)))
398d382aafbSBarry Smith 
399d382aafbSBarry Smith /*MC
40087497f52SBarry Smith    PetscCalloc - Allocates a cleared (zeroed) memory region aligned to `PETSC_MEMALIGN`
4018f51dc47SJunchao Zhang 
4028f51dc47SJunchao Zhang    Synopsis:
4038f51dc47SJunchao Zhang     #include <petscsys.h>
4048f51dc47SJunchao Zhang    PetscErrorCode PetscCalloc(size_t m,void **result)
4058f51dc47SJunchao Zhang 
4068f51dc47SJunchao Zhang    Not Collective
4078f51dc47SJunchao Zhang 
4088f51dc47SJunchao Zhang    Input Parameter:
4098f51dc47SJunchao Zhang .  m - number of bytes to allocate
4108f51dc47SJunchao Zhang 
4118f51dc47SJunchao Zhang    Output Parameter:
4128f51dc47SJunchao Zhang .  result - memory allocated
4138f51dc47SJunchao Zhang 
4148f51dc47SJunchao Zhang    Level: beginner
4158f51dc47SJunchao Zhang 
4168f51dc47SJunchao Zhang    Notes:
4178f51dc47SJunchao Zhang    Memory is always allocated at least double aligned. This macro is useful in allocating memory pointed by void pointers
4188f51dc47SJunchao Zhang 
4198f51dc47SJunchao Zhang    It is safe to allocate size 0 and pass the resulting pointer (which may or may not be NULL) to PetscFree().
4208f51dc47SJunchao Zhang 
421db781477SPatrick Sanan .seealso: `PetscFree()`, `PetscNew()`
4228f51dc47SJunchao Zhang 
4238f51dc47SJunchao Zhang M*/
424f3fa974cSJacob Faibussowitsch #define PetscCalloc(m, result) PetscMallocA(1, PETSC_TRUE, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ((size_t)m), (result))
4258f51dc47SJunchao Zhang 
4268f51dc47SJunchao Zhang /*MC
42787497f52SBarry Smith    PetscMalloc1 - Allocates an array of memory aligned to `PETSC_MEMALIGN`
428d382aafbSBarry Smith 
429eca87e8dSBarry Smith    Synopsis:
430aaa7dc30SBarry Smith     #include <petscsys.h>
431785e854fSJed Brown    PetscErrorCode PetscMalloc1(size_t m1,type **r1)
432785e854fSJed Brown 
433785e854fSJed Brown    Not Collective
434785e854fSJed Brown 
435785e854fSJed Brown    Input Parameter:
436390e1bf2SBarry Smith .  m1 - number of elements to allocate  (may be zero)
437785e854fSJed Brown 
438785e854fSJed Brown    Output Parameter:
4391fe1b817SJunchao Zhang .  r1 - memory allocated
440785e854fSJed Brown 
441e28ce29aSPatrick Sanan    Note:
442e28ce29aSPatrick Sanan    This uses the sizeof() of the memory type requested to determine the total memory to be allocated, therefore you should not
44387497f52SBarry Smith          multiply the number of elements requested by the `sizeof()` the type. For example use
444390e1bf2SBarry Smith $  PetscInt *id;
445390e1bf2SBarry Smith $  PetscMalloc1(10,&id);
446390e1bf2SBarry Smith         not
447390e1bf2SBarry Smith $  PetscInt *id;
448390e1bf2SBarry Smith $  PetscMalloc1(10*sizeof(PetscInt),&id);
449390e1bf2SBarry Smith 
45087497f52SBarry Smith         Does not zero the memory allocated, use `PetscCalloc1()` to obtain memory that has been zeroed.
451390e1bf2SBarry Smith 
452390e1bf2SBarry Smith    Level: beginner
453785e854fSJed Brown 
454db781477SPatrick Sanan .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscCalloc1()`, `PetscMalloc2()`
455785e854fSJed Brown 
456785e854fSJed Brown M*/
457f3fa974cSJacob Faibussowitsch #define PetscMalloc1(m1, r1) PetscMallocA(1, PETSC_FALSE, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ((size_t)((size_t)m1) * sizeof(**(r1))), (r1))
458785e854fSJed Brown 
459785e854fSJed Brown /*MC
46087497f52SBarry Smith    PetscCalloc1 - Allocates a cleared (zeroed) array of memory aligned to `PETSC_MEMALIGN`
4611795a4d1SJed Brown 
4621795a4d1SJed Brown    Synopsis:
463aaa7dc30SBarry Smith     #include <petscsys.h>
4641795a4d1SJed Brown    PetscErrorCode PetscCalloc1(size_t m1,type **r1)
4651795a4d1SJed Brown 
4661795a4d1SJed Brown    Not Collective
4671795a4d1SJed Brown 
4681795a4d1SJed Brown    Input Parameter:
4691795a4d1SJed Brown .  m1 - number of elements to allocate in 1st chunk  (may be zero)
4701795a4d1SJed Brown 
4711795a4d1SJed Brown    Output Parameter:
4721fe1b817SJunchao Zhang .  r1 - memory allocated
4731795a4d1SJed Brown 
474e28ce29aSPatrick Sanan    Notes:
47587497f52SBarry Smith    See `PetsMalloc1()` for more details on usage.
476390e1bf2SBarry Smith 
477390e1bf2SBarry Smith    Level: beginner
4781795a4d1SJed Brown 
479db781477SPatrick Sanan .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscMalloc1()`, `PetscCalloc2()`
4801795a4d1SJed Brown 
4811795a4d1SJed Brown M*/
482f3fa974cSJacob Faibussowitsch #define PetscCalloc1(m1, r1) PetscMallocA(1, PETSC_TRUE, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ((size_t)((size_t)m1) * sizeof(**(r1))), (r1))
4831795a4d1SJed Brown 
4841795a4d1SJed Brown /*MC
48587497f52SBarry Smith    PetscMalloc2 - Allocates 2 arrays of memory both aligned to `PETSC_MEMALIGN`
486d382aafbSBarry Smith 
487eca87e8dSBarry Smith    Synopsis:
488aaa7dc30SBarry Smith     #include <petscsys.h>
489dcca6d9dSJed Brown    PetscErrorCode PetscMalloc2(size_t m1,type **r1,size_t m2,type **r2)
490eca87e8dSBarry Smith 
491eca87e8dSBarry Smith    Not Collective
492eca87e8dSBarry Smith 
493d8d19677SJose E. Roman    Input Parameters:
494d382aafbSBarry Smith +  m1 - number of elements to allocate in 1st chunk  (may be zero)
495dcca6d9dSJed Brown -  m2 - number of elements to allocate in 2nd chunk  (may be zero)
496d382aafbSBarry Smith 
497d8d19677SJose E. Roman    Output Parameters:
498d382aafbSBarry Smith +  r1 - memory allocated in first chunk
499d382aafbSBarry Smith -  r2 - memory allocated in second chunk
500d382aafbSBarry Smith 
501d382aafbSBarry Smith    Level: developer
502d382aafbSBarry Smith 
503db781477SPatrick Sanan .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscMalloc1()`, `PetscCalloc2()`
504d382aafbSBarry Smith 
505d382aafbSBarry Smith M*/
506f3fa974cSJacob Faibussowitsch #define PetscMalloc2(m1, r1, m2, r2) PetscMallocA(2, PETSC_FALSE, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ((size_t)((size_t)m1) * sizeof(**(r1))), (r1), ((size_t)((size_t)m2) * sizeof(**(r2))), (r2))
507d382aafbSBarry Smith 
508d382aafbSBarry Smith /*MC
50987497f52SBarry Smith    PetscCalloc2 - Allocates 2 cleared (zeroed) arrays of memory both aligned to `PETSC_MEMALIGN`
510d382aafbSBarry Smith 
511eca87e8dSBarry Smith    Synopsis:
512aaa7dc30SBarry Smith     #include <petscsys.h>
5131795a4d1SJed Brown    PetscErrorCode PetscCalloc2(size_t m1,type **r1,size_t m2,type **r2)
514eca87e8dSBarry Smith 
515eca87e8dSBarry Smith    Not Collective
516eca87e8dSBarry Smith 
517d8d19677SJose E. Roman    Input Parameters:
518d382aafbSBarry Smith +  m1 - number of elements to allocate in 1st chunk  (may be zero)
5191795a4d1SJed Brown -  m2 - number of elements to allocate in 2nd chunk  (may be zero)
5201795a4d1SJed Brown 
521d8d19677SJose E. Roman    Output Parameters:
5221795a4d1SJed Brown +  r1 - memory allocated in first chunk
5231795a4d1SJed Brown -  r2 - memory allocated in second chunk
5241795a4d1SJed Brown 
5251795a4d1SJed Brown    Level: developer
5261795a4d1SJed Brown 
527db781477SPatrick Sanan .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscCalloc1()`, `PetscMalloc2()`
5281795a4d1SJed Brown 
5291795a4d1SJed Brown M*/
530f3fa974cSJacob Faibussowitsch #define PetscCalloc2(m1, r1, m2, r2) PetscMallocA(2, PETSC_TRUE, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ((size_t)((size_t)m1) * sizeof(**(r1))), (r1), ((size_t)((size_t)m2) * sizeof(**(r2))), (r2))
5311795a4d1SJed Brown 
5321795a4d1SJed Brown /*MC
53387497f52SBarry Smith    PetscMalloc3 - Allocates 3 arrays of memory, all aligned to `PETSC_MEMALIGN`
534d382aafbSBarry Smith 
535d382aafbSBarry Smith    Synopsis:
536aaa7dc30SBarry Smith     #include <petscsys.h>
537dcca6d9dSJed Brown    PetscErrorCode PetscMalloc3(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3)
538d382aafbSBarry Smith 
539d382aafbSBarry Smith    Not Collective
540d382aafbSBarry Smith 
541d8d19677SJose E. Roman    Input Parameters:
542d382aafbSBarry Smith +  m1 - number of elements to allocate in 1st chunk  (may be zero)
543d382aafbSBarry Smith .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
544dcca6d9dSJed Brown -  m3 - number of elements to allocate in 3rd chunk  (may be zero)
545d382aafbSBarry Smith 
546d8d19677SJose E. Roman    Output Parameters:
547d382aafbSBarry Smith +  r1 - memory allocated in first chunk
548d382aafbSBarry Smith .  r2 - memory allocated in second chunk
549d382aafbSBarry Smith -  r3 - memory allocated in third chunk
550d382aafbSBarry Smith 
551d382aafbSBarry Smith    Level: developer
552d382aafbSBarry Smith 
553db781477SPatrick Sanan .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscCalloc3()`, `PetscFree3()`
554d382aafbSBarry Smith 
555d382aafbSBarry Smith M*/
556f3fa974cSJacob Faibussowitsch #define PetscMalloc3(m1, r1, m2, r2, m3, r3) \
557f3fa974cSJacob Faibussowitsch   PetscMallocA(3, PETSC_FALSE, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ((size_t)((size_t)m1) * sizeof(**(r1))), (r1), ((size_t)((size_t)m2) * sizeof(**(r2))), (r2), ((size_t)((size_t)m3) * sizeof(**(r3))), (r3))
558d382aafbSBarry Smith 
559d382aafbSBarry Smith /*MC
56087497f52SBarry Smith    PetscCalloc3 - Allocates 3 cleared (zeroed) arrays of memory, all aligned to `PETSC_MEMALIGN`
561d382aafbSBarry Smith 
562eca87e8dSBarry Smith    Synopsis:
563aaa7dc30SBarry Smith     #include <petscsys.h>
5641795a4d1SJed Brown    PetscErrorCode PetscCalloc3(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3)
565eca87e8dSBarry Smith 
566eca87e8dSBarry Smith    Not Collective
567eca87e8dSBarry Smith 
568d8d19677SJose E. Roman    Input Parameters:
569d382aafbSBarry Smith +  m1 - number of elements to allocate in 1st chunk  (may be zero)
570d382aafbSBarry Smith .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
5711795a4d1SJed Brown -  m3 - number of elements to allocate in 3rd chunk  (may be zero)
5721795a4d1SJed Brown 
573d8d19677SJose E. Roman    Output Parameters:
5741795a4d1SJed Brown +  r1 - memory allocated in first chunk
5751795a4d1SJed Brown .  r2 - memory allocated in second chunk
5761795a4d1SJed Brown -  r3 - memory allocated in third chunk
5771795a4d1SJed Brown 
5781795a4d1SJed Brown    Level: developer
5791795a4d1SJed Brown 
580db781477SPatrick Sanan .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscCalloc2()`, `PetscMalloc3()`, `PetscFree3()`
5811795a4d1SJed Brown 
5821795a4d1SJed Brown M*/
583f3fa974cSJacob Faibussowitsch #define PetscCalloc3(m1, r1, m2, r2, m3, r3) \
584f3fa974cSJacob Faibussowitsch   PetscMallocA(3, PETSC_TRUE, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ((size_t)((size_t)m1) * sizeof(**(r1))), (r1), ((size_t)((size_t)m2) * sizeof(**(r2))), (r2), ((size_t)((size_t)m3) * sizeof(**(r3))), (r3))
5851795a4d1SJed Brown 
5861795a4d1SJed Brown /*MC
58787497f52SBarry Smith    PetscMalloc4 - Allocates 4 arrays of memory, all aligned to `PETSC_MEMALIGN`
588d382aafbSBarry Smith 
589d382aafbSBarry Smith    Synopsis:
590aaa7dc30SBarry Smith     #include <petscsys.h>
591dcca6d9dSJed Brown    PetscErrorCode PetscMalloc4(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3,size_t m4,type **r4)
592d382aafbSBarry Smith 
593d382aafbSBarry Smith    Not Collective
594d382aafbSBarry Smith 
595d8d19677SJose E. Roman    Input Parameters:
596d382aafbSBarry Smith +  m1 - number of elements to allocate in 1st chunk  (may be zero)
597d382aafbSBarry Smith .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
598d382aafbSBarry Smith .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
599dcca6d9dSJed Brown -  m4 - number of elements to allocate in 4th chunk  (may be zero)
600d382aafbSBarry Smith 
601d8d19677SJose E. Roman    Output Parameters:
602d382aafbSBarry Smith +  r1 - memory allocated in first chunk
603d382aafbSBarry Smith .  r2 - memory allocated in second chunk
604d382aafbSBarry Smith .  r3 - memory allocated in third chunk
605d382aafbSBarry Smith -  r4 - memory allocated in fourth chunk
606d382aafbSBarry Smith 
607d382aafbSBarry Smith    Level: developer
608d382aafbSBarry Smith 
609db781477SPatrick Sanan .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscCalloc4()`, `PetscFree4()`
610d382aafbSBarry Smith 
611d382aafbSBarry Smith M*/
6129371c9d4SSatish Balay #define PetscMalloc4(m1, r1, m2, r2, m3, r3, m4, r4) \
613f3fa974cSJacob Faibussowitsch   PetscMallocA(4, PETSC_FALSE, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ((size_t)((size_t)m1) * sizeof(**(r1))), (r1), ((size_t)((size_t)m2) * sizeof(**(r2))), (r2), ((size_t)((size_t)m3) * sizeof(**(r3))), (r3), ((size_t)((size_t)m4) * sizeof(**(r4))), (r4))
614d382aafbSBarry Smith 
615d382aafbSBarry Smith /*MC
61687497f52SBarry Smith    PetscCalloc4 - Allocates 4 cleared (zeroed) arrays of memory, all aligned to `PETSC_MEMALIGN`
617d382aafbSBarry Smith 
618eca87e8dSBarry Smith    Synopsis:
619aaa7dc30SBarry Smith     #include <petscsys.h>
6201795a4d1SJed Brown    PetscErrorCode PetscCalloc4(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3,size_t m4,type **r4)
621eca87e8dSBarry Smith 
622eca87e8dSBarry Smith    Not Collective
623eca87e8dSBarry Smith 
624e28ce29aSPatrick Sanan    Input Parameters:
625d382aafbSBarry Smith +  m1 - number of elements to allocate in 1st chunk  (may be zero)
626d382aafbSBarry Smith .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
627d382aafbSBarry Smith .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
6281795a4d1SJed Brown -  m4 - number of elements to allocate in 4th chunk  (may be zero)
6291795a4d1SJed Brown 
630e28ce29aSPatrick Sanan    Output Parameters:
6311795a4d1SJed Brown +  r1 - memory allocated in first chunk
6321795a4d1SJed Brown .  r2 - memory allocated in second chunk
6331795a4d1SJed Brown .  r3 - memory allocated in third chunk
6341795a4d1SJed Brown -  r4 - memory allocated in fourth chunk
6351795a4d1SJed Brown 
6361795a4d1SJed Brown    Level: developer
6371795a4d1SJed Brown 
638db781477SPatrick Sanan .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscCalloc4()`, `PetscFree4()`
6391795a4d1SJed Brown 
6401795a4d1SJed Brown M*/
6419371c9d4SSatish Balay #define PetscCalloc4(m1, r1, m2, r2, m3, r3, m4, r4) \
642f3fa974cSJacob Faibussowitsch   PetscMallocA(4, PETSC_TRUE, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ((size_t)((size_t)m1) * sizeof(**(r1))), (r1), ((size_t)((size_t)m2) * sizeof(**(r2))), (r2), ((size_t)((size_t)m3) * sizeof(**(r3))), (r3), ((size_t)((size_t)m4) * sizeof(**(r4))), (r4))
6431795a4d1SJed Brown 
6441795a4d1SJed Brown /*MC
64587497f52SBarry Smith    PetscMalloc5 - Allocates 5 arrays of memory, all aligned to `PETSC_MEMALIGN`
646d382aafbSBarry Smith 
647d382aafbSBarry Smith    Synopsis:
648aaa7dc30SBarry Smith     #include <petscsys.h>
649dcca6d9dSJed Brown    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)
650d382aafbSBarry Smith 
651d382aafbSBarry Smith    Not Collective
652d382aafbSBarry Smith 
653e28ce29aSPatrick Sanan    Input Parameters:
654d382aafbSBarry Smith +  m1 - number of elements to allocate in 1st chunk  (may be zero)
655d382aafbSBarry Smith .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
656d382aafbSBarry Smith .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
657d382aafbSBarry Smith .  m4 - number of elements to allocate in 4th chunk  (may be zero)
658dcca6d9dSJed Brown -  m5 - number of elements to allocate in 5th chunk  (may be zero)
659d382aafbSBarry Smith 
660e28ce29aSPatrick Sanan    Output Parameters:
661d382aafbSBarry Smith +  r1 - memory allocated in first chunk
662d382aafbSBarry Smith .  r2 - memory allocated in second chunk
663d382aafbSBarry Smith .  r3 - memory allocated in third chunk
664d382aafbSBarry Smith .  r4 - memory allocated in fourth chunk
665d382aafbSBarry Smith -  r5 - memory allocated in fifth chunk
666d382aafbSBarry Smith 
667d382aafbSBarry Smith    Level: developer
668d382aafbSBarry Smith 
669db781477SPatrick Sanan .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscCalloc5()`, `PetscFree5()`
670d382aafbSBarry Smith 
671d382aafbSBarry Smith M*/
6729371c9d4SSatish Balay #define PetscMalloc5(m1, r1, m2, r2, m3, r3, m4, r4, m5, r5) \
673f3fa974cSJacob Faibussowitsch   PetscMallocA(5, PETSC_FALSE, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ((size_t)((size_t)m1) * sizeof(**(r1))), (r1), ((size_t)((size_t)m2) * sizeof(**(r2))), (r2), ((size_t)((size_t)m3) * sizeof(**(r3))), (r3), ((size_t)((size_t)m4) * sizeof(**(r4))), (r4), ((size_t)((size_t)m5) * sizeof(**(r5))), (r5))
674d382aafbSBarry Smith 
675d382aafbSBarry Smith /*MC
67687497f52SBarry Smith    PetscCalloc5 - Allocates 5 cleared (zeroed) arrays of memory, all aligned to `PETSC_MEMALIGN`
677d382aafbSBarry Smith 
678eca87e8dSBarry Smith    Synopsis:
679aaa7dc30SBarry Smith     #include <petscsys.h>
6801795a4d1SJed Brown    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)
681eca87e8dSBarry Smith 
682eca87e8dSBarry Smith    Not Collective
683eca87e8dSBarry Smith 
684e28ce29aSPatrick Sanan    Input Parameters:
685d382aafbSBarry Smith +  m1 - number of elements to allocate in 1st chunk  (may be zero)
686d382aafbSBarry Smith .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
687d382aafbSBarry Smith .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
688d382aafbSBarry Smith .  m4 - number of elements to allocate in 4th chunk  (may be zero)
6891795a4d1SJed Brown -  m5 - number of elements to allocate in 5th chunk  (may be zero)
6901795a4d1SJed Brown 
691e28ce29aSPatrick Sanan    Output Parameters:
6921795a4d1SJed Brown +  r1 - memory allocated in first chunk
6931795a4d1SJed Brown .  r2 - memory allocated in second chunk
6941795a4d1SJed Brown .  r3 - memory allocated in third chunk
6951795a4d1SJed Brown .  r4 - memory allocated in fourth chunk
6961795a4d1SJed Brown -  r5 - memory allocated in fifth chunk
6971795a4d1SJed Brown 
6981795a4d1SJed Brown    Level: developer
6991795a4d1SJed Brown 
700db781477SPatrick Sanan .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscMalloc5()`, `PetscFree5()`
7011795a4d1SJed Brown 
7021795a4d1SJed Brown M*/
7039371c9d4SSatish Balay #define PetscCalloc5(m1, r1, m2, r2, m3, r3, m4, r4, m5, r5) \
704f3fa974cSJacob Faibussowitsch   PetscMallocA(5, PETSC_TRUE, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ((size_t)((size_t)m1) * sizeof(**(r1))), (r1), ((size_t)((size_t)m2) * sizeof(**(r2))), (r2), ((size_t)((size_t)m3) * sizeof(**(r3))), (r3), ((size_t)((size_t)m4) * sizeof(**(r4))), (r4), ((size_t)((size_t)m5) * sizeof(**(r5))), (r5))
705d382aafbSBarry Smith 
706d382aafbSBarry Smith /*MC
70787497f52SBarry Smith    PetscMalloc6 - Allocates 6 arrays of memory, all aligned to `PETSC_MEMALIGN`
708d382aafbSBarry Smith 
709d382aafbSBarry Smith    Synopsis:
710aaa7dc30SBarry Smith     #include <petscsys.h>
711dcca6d9dSJed Brown    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)
712d382aafbSBarry Smith 
713d382aafbSBarry Smith    Not Collective
714d382aafbSBarry Smith 
715e28ce29aSPatrick Sanan    Input Parameters:
716d382aafbSBarry Smith +  m1 - number of elements to allocate in 1st chunk  (may be zero)
717d382aafbSBarry Smith .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
718d382aafbSBarry Smith .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
719d382aafbSBarry Smith .  m4 - number of elements to allocate in 4th chunk  (may be zero)
720d382aafbSBarry Smith .  m5 - number of elements to allocate in 5th chunk  (may be zero)
721dcca6d9dSJed Brown -  m6 - number of elements to allocate in 6th chunk  (may be zero)
722d382aafbSBarry Smith 
723e28ce29aSPatrick Sanan    Output Parameteasr:
724d382aafbSBarry Smith +  r1 - memory allocated in first chunk
725d382aafbSBarry Smith .  r2 - memory allocated in second chunk
726d382aafbSBarry Smith .  r3 - memory allocated in third chunk
727d382aafbSBarry Smith .  r4 - memory allocated in fourth chunk
728d382aafbSBarry Smith .  r5 - memory allocated in fifth chunk
729d382aafbSBarry Smith -  r6 - memory allocated in sixth chunk
730d382aafbSBarry Smith 
731d382aafbSBarry Smith    Level: developer
732d382aafbSBarry Smith 
733db781477SPatrick Sanan .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscCalloc6()`, `PetscFree3()`, `PetscFree4()`, `PetscFree5()`, `PetscFree6()`
734d382aafbSBarry Smith 
735d382aafbSBarry Smith M*/
7369371c9d4SSatish Balay #define PetscMalloc6(m1, r1, m2, r2, m3, r3, m4, r4, m5, r5, m6, r6) \
737f3fa974cSJacob Faibussowitsch   PetscMallocA(6, PETSC_FALSE, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ((size_t)((size_t)m1) * sizeof(**(r1))), (r1), ((size_t)((size_t)m2) * sizeof(**(r2))), (r2), ((size_t)((size_t)m3) * sizeof(**(r3))), (r3), ((size_t)((size_t)m4) * sizeof(**(r4))), (r4), ((size_t)((size_t)m5) * sizeof(**(r5))), (r5), ((size_t)((size_t)m6) * sizeof(**(r6))), (r6))
738d382aafbSBarry Smith 
739d382aafbSBarry Smith /*MC
74087497f52SBarry Smith    PetscCalloc6 - Allocates 6 cleared (zeroed) arrays of memory, all aligned to `PETSC_MEMALIGN`
741d382aafbSBarry Smith 
742eca87e8dSBarry Smith    Synopsis:
743aaa7dc30SBarry Smith     #include <petscsys.h>
7441795a4d1SJed Brown    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)
745eca87e8dSBarry Smith 
746eca87e8dSBarry Smith    Not Collective
747eca87e8dSBarry Smith 
748e28ce29aSPatrick Sanan    Input Parameters:
749d382aafbSBarry Smith +  m1 - number of elements to allocate in 1st chunk  (may be zero)
750d382aafbSBarry Smith .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
751d382aafbSBarry Smith .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
752d382aafbSBarry Smith .  m4 - number of elements to allocate in 4th chunk  (may be zero)
753d382aafbSBarry Smith .  m5 - number of elements to allocate in 5th chunk  (may be zero)
7541795a4d1SJed Brown -  m6 - number of elements to allocate in 6th chunk  (may be zero)
7551795a4d1SJed Brown 
756e28ce29aSPatrick Sanan    Output Parameters:
7571795a4d1SJed Brown +  r1 - memory allocated in first chunk
7581795a4d1SJed Brown .  r2 - memory allocated in second chunk
7591795a4d1SJed Brown .  r3 - memory allocated in third chunk
7601795a4d1SJed Brown .  r4 - memory allocated in fourth chunk
7611795a4d1SJed Brown .  r5 - memory allocated in fifth chunk
7621795a4d1SJed Brown -  r6 - memory allocated in sixth chunk
7631795a4d1SJed Brown 
7641795a4d1SJed Brown    Level: developer
7651795a4d1SJed Brown 
766db781477SPatrick Sanan .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscMalloc6()`, `PetscFree6()`
7671795a4d1SJed Brown 
7681795a4d1SJed Brown M*/
7699371c9d4SSatish Balay #define PetscCalloc6(m1, r1, m2, r2, m3, r3, m4, r4, m5, r5, m6, r6) \
770f3fa974cSJacob Faibussowitsch   PetscMallocA(6, PETSC_TRUE, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ((size_t)((size_t)m1) * sizeof(**(r1))), (r1), ((size_t)((size_t)m2) * sizeof(**(r2))), (r2), ((size_t)((size_t)m3) * sizeof(**(r3))), (r3), ((size_t)((size_t)m4) * sizeof(**(r4))), (r4), ((size_t)((size_t)m5) * sizeof(**(r5))), (r5), ((size_t)((size_t)m6) * sizeof(**(r6))), (r6))
7711795a4d1SJed Brown 
7721795a4d1SJed Brown /*MC
77387497f52SBarry Smith    PetscMalloc7 - Allocates 7 arrays of memory, all aligned to `PETSC_MEMALIGN`
774d382aafbSBarry Smith 
775d382aafbSBarry Smith    Synopsis:
776aaa7dc30SBarry Smith     #include <petscsys.h>
777dcca6d9dSJed Brown    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)
778d382aafbSBarry Smith 
779d382aafbSBarry Smith    Not Collective
780d382aafbSBarry Smith 
781e28ce29aSPatrick Sanan    Input Parameters:
782d382aafbSBarry Smith +  m1 - number of elements to allocate in 1st chunk  (may be zero)
783d382aafbSBarry Smith .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
784d382aafbSBarry Smith .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
785d382aafbSBarry Smith .  m4 - number of elements to allocate in 4th chunk  (may be zero)
786d382aafbSBarry Smith .  m5 - number of elements to allocate in 5th chunk  (may be zero)
787d382aafbSBarry Smith .  m6 - number of elements to allocate in 6th chunk  (may be zero)
788dcca6d9dSJed Brown -  m7 - number of elements to allocate in 7th chunk  (may be zero)
789d382aafbSBarry Smith 
790e28ce29aSPatrick Sanan    Output Parameters:
791d382aafbSBarry Smith +  r1 - memory allocated in first chunk
792d382aafbSBarry Smith .  r2 - memory allocated in second chunk
793d382aafbSBarry Smith .  r3 - memory allocated in third chunk
794d382aafbSBarry Smith .  r4 - memory allocated in fourth chunk
795d382aafbSBarry Smith .  r5 - memory allocated in fifth chunk
796d382aafbSBarry Smith .  r6 - memory allocated in sixth chunk
797eca87e8dSBarry Smith -  r7 - memory allocated in seventh chunk
798d382aafbSBarry Smith 
799d382aafbSBarry Smith    Level: developer
800d382aafbSBarry Smith 
801db781477SPatrick Sanan .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscCalloc7()`, `PetscFree7()`
802d382aafbSBarry Smith 
803d382aafbSBarry Smith M*/
8049371c9d4SSatish Balay #define PetscMalloc7(m1, r1, m2, r2, m3, r3, m4, r4, m5, r5, m6, r6, m7, r7) \
805f3fa974cSJacob Faibussowitsch   PetscMallocA(7, PETSC_FALSE, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ((size_t)((size_t)m1) * sizeof(**(r1))), (r1), ((size_t)((size_t)m2) * sizeof(**(r2))), (r2), ((size_t)((size_t)m3) * sizeof(**(r3))), (r3), ((size_t)((size_t)m4) * sizeof(**(r4))), (r4), ((size_t)((size_t)m5) * sizeof(**(r5))), (r5), ((size_t)((size_t)m6) * sizeof(**(r6))), (r6), ((size_t)((size_t)m7) * sizeof(**(r7))), (r7))
806d382aafbSBarry Smith 
807d382aafbSBarry Smith /*MC
80887497f52SBarry Smith    PetscCalloc7 - Allocates 7 cleared (zeroed) arrays of memory, all aligned to `PETSC_MEMALIGN`
8091795a4d1SJed Brown 
8101795a4d1SJed Brown    Synopsis:
811aaa7dc30SBarry Smith     #include <petscsys.h>
8121795a4d1SJed Brown    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)
8131795a4d1SJed Brown 
8141795a4d1SJed Brown    Not Collective
8151795a4d1SJed Brown 
816e28ce29aSPatrick Sanan    Input Parameters:
8171795a4d1SJed Brown +  m1 - number of elements to allocate in 1st chunk  (may be zero)
8181795a4d1SJed Brown .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
8191795a4d1SJed Brown .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
8201795a4d1SJed Brown .  m4 - number of elements to allocate in 4th chunk  (may be zero)
8211795a4d1SJed Brown .  m5 - number of elements to allocate in 5th chunk  (may be zero)
8221795a4d1SJed Brown .  m6 - number of elements to allocate in 6th chunk  (may be zero)
8231795a4d1SJed Brown -  m7 - number of elements to allocate in 7th chunk  (may be zero)
8241795a4d1SJed Brown 
825e28ce29aSPatrick Sanan    Output Parameters:
8261795a4d1SJed Brown +  r1 - memory allocated in first chunk
8271795a4d1SJed Brown .  r2 - memory allocated in second chunk
8281795a4d1SJed Brown .  r3 - memory allocated in third chunk
8291795a4d1SJed Brown .  r4 - memory allocated in fourth chunk
8301795a4d1SJed Brown .  r5 - memory allocated in fifth chunk
8311795a4d1SJed Brown .  r6 - memory allocated in sixth chunk
8321795a4d1SJed Brown -  r7 - memory allocated in seventh chunk
8331795a4d1SJed Brown 
8341795a4d1SJed Brown    Level: developer
8351795a4d1SJed Brown 
836db781477SPatrick Sanan .seealso: `PetscFree()`, `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscMalloc7()`, `PetscFree7()`
8371795a4d1SJed Brown 
8381795a4d1SJed Brown M*/
8399371c9d4SSatish Balay #define PetscCalloc7(m1, r1, m2, r2, m3, r3, m4, r4, m5, r5, m6, r6, m7, r7) \
840f3fa974cSJacob Faibussowitsch   PetscMallocA(7, PETSC_TRUE, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ((size_t)((size_t)m1) * sizeof(**(r1))), (r1), ((size_t)((size_t)m2) * sizeof(**(r2))), (r2), ((size_t)((size_t)m3) * sizeof(**(r3))), (r3), ((size_t)((size_t)m4) * sizeof(**(r4))), (r4), ((size_t)((size_t)m5) * sizeof(**(r5))), (r5), ((size_t)((size_t)m6) * sizeof(**(r6))), (r6), ((size_t)((size_t)m7) * sizeof(**(r7))), (r7))
8411795a4d1SJed Brown 
8421795a4d1SJed Brown /*MC
84387497f52SBarry Smith    PetscNew - Allocates memory of a particular type, zeros the memory! Aligned to `PETSC_MEMALIGN`
844d382aafbSBarry Smith 
845eca87e8dSBarry Smith    Synopsis:
846aaa7dc30SBarry Smith     #include <petscsys.h>
847b00a9115SJed Brown    PetscErrorCode PetscNew(type **result)
848eca87e8dSBarry Smith 
849eca87e8dSBarry Smith    Not Collective
850eca87e8dSBarry Smith 
851d382aafbSBarry Smith    Output Parameter:
852b00a9115SJed Brown .  result - memory allocated, sized to match pointer type
853d382aafbSBarry Smith 
854d382aafbSBarry Smith    Level: beginner
855d382aafbSBarry Smith 
856fea72eb4SStefano Zampini .seealso: `PetscFree()`, `PetscMalloc()`, `PetscCalloc1()`, `PetscMalloc1()`
857d382aafbSBarry Smith 
858d382aafbSBarry Smith M*/
859b00a9115SJed Brown #define PetscNew(b) PetscCalloc1(1, (b))
860ad0619ddSBarry Smith 
8614dfa11a4SJacob Faibussowitsch #define PetscNewLog(o, b) PETSC_DEPRECATED_MACRO("GCC warning \"PetscNewLog is deprecated, use PetscNew() instead (since version 3.18)\"") PetscNew((b))
862d382aafbSBarry Smith 
863d382aafbSBarry Smith /*MC
864d382aafbSBarry Smith    PetscFree - Frees memory
865d382aafbSBarry Smith 
866eca87e8dSBarry Smith    Synopsis:
867aaa7dc30SBarry Smith     #include <petscsys.h>
868eca87e8dSBarry Smith    PetscErrorCode PetscFree(void *memory)
869eca87e8dSBarry Smith 
870eca87e8dSBarry Smith    Not Collective
871eca87e8dSBarry Smith 
872d382aafbSBarry Smith    Input Parameter:
8737f4976b7SJacob Faibussowitsch .   memory - memory to free (the pointer is ALWAYS set to NULL upon success)
874d382aafbSBarry Smith 
875d382aafbSBarry Smith    Level: beginner
876d382aafbSBarry Smith 
87749d7da52SJed Brown    Notes:
87887497f52SBarry Smith    Do not free memory obtained with `PetscMalloc2()`, `PetscCalloc2()` etc, they must be freed with `PetscFree2()` etc.
879390e1bf2SBarry Smith 
88087497f52SBarry Smith    It is safe to call `PetscFree()` on a NULL pointer.
881d382aafbSBarry Smith 
882fea72eb4SStefano Zampini .seealso: `PetscNew()`, `PetscMalloc()`, `PetscMalloc1()`, `PetscCalloc1()`
883d382aafbSBarry Smith 
884d382aafbSBarry Smith M*/
885f3fa974cSJacob Faibussowitsch #define PetscFree(a) ((*PetscTrFree)((void *)(a), __LINE__, PETSC_FUNCTION_NAME, __FILE__) || ((a) = PETSC_NULLPTR, 0))
886d382aafbSBarry Smith 
887d382aafbSBarry Smith /*MC
88887497f52SBarry Smith    PetscFree2 - Frees 2 chunks of memory obtained with `PetscMalloc2()`
889d382aafbSBarry Smith 
890eca87e8dSBarry Smith    Synopsis:
891aaa7dc30SBarry Smith     #include <petscsys.h>
892eca87e8dSBarry Smith    PetscErrorCode PetscFree2(void *memory1,void *memory2)
893eca87e8dSBarry Smith 
894eca87e8dSBarry Smith    Not Collective
895eca87e8dSBarry Smith 
896e28ce29aSPatrick Sanan    Input Parameters:
897d382aafbSBarry Smith +   memory1 - memory to free
898d382aafbSBarry Smith -   memory2 - 2nd memory to free
899d382aafbSBarry Smith 
900d382aafbSBarry Smith    Level: developer
901d382aafbSBarry Smith 
90295452b02SPatrick Sanan    Notes:
90387497f52SBarry Smith     Memory must have been obtained with `PetscMalloc2()`
904d382aafbSBarry Smith 
905db781477SPatrick Sanan .seealso: `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscFree()`
906d382aafbSBarry Smith 
907d382aafbSBarry Smith M*/
908ba282f50SJed Brown #define PetscFree2(m1, m2) PetscFreeA(2, __LINE__, PETSC_FUNCTION_NAME, __FILE__, &(m1), &(m2))
909d382aafbSBarry Smith 
910d382aafbSBarry Smith /*MC
91187497f52SBarry Smith    PetscFree3 - Frees 3 chunks of memory obtained with `PetscMalloc3()`
912d382aafbSBarry Smith 
913eca87e8dSBarry Smith    Synopsis:
914aaa7dc30SBarry Smith     #include <petscsys.h>
915eca87e8dSBarry Smith    PetscErrorCode PetscFree3(void *memory1,void *memory2,void *memory3)
916eca87e8dSBarry Smith 
917eca87e8dSBarry Smith    Not Collective
918eca87e8dSBarry Smith 
919e28ce29aSPatrick Sanan    Input Parameters:
920d382aafbSBarry Smith +   memory1 - memory to free
921d382aafbSBarry Smith .   memory2 - 2nd memory to free
922d382aafbSBarry Smith -   memory3 - 3rd memory to free
923d382aafbSBarry Smith 
924d382aafbSBarry Smith    Level: developer
925d382aafbSBarry Smith 
92695452b02SPatrick Sanan    Notes:
92787497f52SBarry Smith     Memory must have been obtained with `PetscMalloc3()`
928d382aafbSBarry Smith 
929db781477SPatrick Sanan .seealso: `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscFree()`, `PetscMalloc3()`
930d382aafbSBarry Smith 
931d382aafbSBarry Smith M*/
932ba282f50SJed Brown #define PetscFree3(m1, m2, m3) PetscFreeA(3, __LINE__, PETSC_FUNCTION_NAME, __FILE__, &(m1), &(m2), &(m3))
933d382aafbSBarry Smith 
934d382aafbSBarry Smith /*MC
93587497f52SBarry Smith    PetscFree4 - Frees 4 chunks of memory obtained with `PetscMalloc4()`
936d382aafbSBarry Smith 
937eca87e8dSBarry Smith    Synopsis:
938aaa7dc30SBarry Smith     #include <petscsys.h>
939eca87e8dSBarry Smith    PetscErrorCode PetscFree4(void *m1,void *m2,void *m3,void *m4)
940eca87e8dSBarry Smith 
941eca87e8dSBarry Smith    Not Collective
942eca87e8dSBarry Smith 
943e28ce29aSPatrick Sanan    Input Parameters:
944d382aafbSBarry Smith +   m1 - memory to free
945d382aafbSBarry Smith .   m2 - 2nd memory to free
946d382aafbSBarry Smith .   m3 - 3rd memory to free
947d382aafbSBarry Smith -   m4 - 4th memory to free
948d382aafbSBarry Smith 
949d382aafbSBarry Smith    Level: developer
950d382aafbSBarry Smith 
95195452b02SPatrick Sanan    Notes:
95287497f52SBarry Smith     Memory must have been obtained with `PetscMalloc4()`
953d382aafbSBarry Smith 
954db781477SPatrick Sanan .seealso: `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscFree()`, `PetscMalloc3()`, `PetscMalloc4()`
955d382aafbSBarry Smith 
956d382aafbSBarry Smith M*/
957ba282f50SJed Brown #define PetscFree4(m1, m2, m3, m4) PetscFreeA(4, __LINE__, PETSC_FUNCTION_NAME, __FILE__, &(m1), &(m2), &(m3), &(m4))
958d382aafbSBarry Smith 
959d382aafbSBarry Smith /*MC
96087497f52SBarry Smith    PetscFree5 - Frees 5 chunks of memory obtained with `PetscMalloc5()`
961d382aafbSBarry Smith 
962eca87e8dSBarry Smith    Synopsis:
963aaa7dc30SBarry Smith     #include <petscsys.h>
964eca87e8dSBarry Smith    PetscErrorCode PetscFree5(void *m1,void *m2,void *m3,void *m4,void *m5)
965eca87e8dSBarry Smith 
966eca87e8dSBarry Smith    Not Collective
967eca87e8dSBarry Smith 
968e28ce29aSPatrick Sanan    Input Parameters:
969d382aafbSBarry Smith +   m1 - memory to free
970d382aafbSBarry Smith .   m2 - 2nd memory to free
971d382aafbSBarry Smith .   m3 - 3rd memory to free
972d382aafbSBarry Smith .   m4 - 4th memory to free
973d382aafbSBarry Smith -   m5 - 5th memory to free
974d382aafbSBarry Smith 
975d382aafbSBarry Smith    Level: developer
976d382aafbSBarry Smith 
97795452b02SPatrick Sanan    Notes:
97887497f52SBarry Smith     Memory must have been obtained with `PetscMalloc5()`
979d382aafbSBarry Smith 
980db781477SPatrick Sanan .seealso: `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscFree()`, `PetscMalloc3()`, `PetscMalloc4()`, `PetscMalloc5()`
981d382aafbSBarry Smith 
982d382aafbSBarry Smith M*/
983ba282f50SJed Brown #define PetscFree5(m1, m2, m3, m4, m5) PetscFreeA(5, __LINE__, PETSC_FUNCTION_NAME, __FILE__, &(m1), &(m2), &(m3), &(m4), &(m5))
984d382aafbSBarry Smith 
985d382aafbSBarry Smith /*MC
98687497f52SBarry Smith    PetscFree6 - Frees 6 chunks of memory obtained with `PetscMalloc6()`
987d382aafbSBarry Smith 
988eca87e8dSBarry Smith    Synopsis:
989aaa7dc30SBarry Smith     #include <petscsys.h>
990eca87e8dSBarry Smith    PetscErrorCode PetscFree6(void *m1,void *m2,void *m3,void *m4,void *m5,void *m6)
991eca87e8dSBarry Smith 
992eca87e8dSBarry Smith    Not Collective
993eca87e8dSBarry Smith 
994e28ce29aSPatrick Sanan    Input Parameters:
995d382aafbSBarry Smith +   m1 - memory to free
996d382aafbSBarry Smith .   m2 - 2nd memory to free
997d382aafbSBarry Smith .   m3 - 3rd memory to free
998d382aafbSBarry Smith .   m4 - 4th memory to free
999d382aafbSBarry Smith .   m5 - 5th memory to free
1000d382aafbSBarry Smith -   m6 - 6th memory to free
1001d382aafbSBarry Smith 
1002d382aafbSBarry Smith    Level: developer
1003d382aafbSBarry Smith 
100495452b02SPatrick Sanan    Notes:
100587497f52SBarry Smith     Memory must have been obtained with `PetscMalloc6()`
1006d382aafbSBarry Smith 
1007db781477SPatrick Sanan .seealso: `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscFree()`, `PetscMalloc3()`, `PetscMalloc4()`, `PetscMalloc5()`, `PetscMalloc6()`
1008d382aafbSBarry Smith 
1009d382aafbSBarry Smith M*/
1010ba282f50SJed Brown #define PetscFree6(m1, m2, m3, m4, m5, m6) PetscFreeA(6, __LINE__, PETSC_FUNCTION_NAME, __FILE__, &(m1), &(m2), &(m3), &(m4), &(m5), &(m6))
1011d382aafbSBarry Smith 
1012d382aafbSBarry Smith /*MC
101387497f52SBarry Smith    PetscFree7 - Frees 7 chunks of memory obtained with `PetscMalloc7()`
1014d382aafbSBarry Smith 
1015eca87e8dSBarry Smith    Synopsis:
1016aaa7dc30SBarry Smith     #include <petscsys.h>
1017eca87e8dSBarry Smith    PetscErrorCode PetscFree7(void *m1,void *m2,void *m3,void *m4,void *m5,void *m6,void *m7)
1018eca87e8dSBarry Smith 
1019eca87e8dSBarry Smith    Not Collective
1020eca87e8dSBarry Smith 
1021e28ce29aSPatrick Sanan    Input Parameters:
1022d382aafbSBarry Smith +   m1 - memory to free
1023d382aafbSBarry Smith .   m2 - 2nd memory to free
1024d382aafbSBarry Smith .   m3 - 3rd memory to free
1025d382aafbSBarry Smith .   m4 - 4th memory to free
1026d382aafbSBarry Smith .   m5 - 5th memory to free
1027d382aafbSBarry Smith .   m6 - 6th memory to free
1028d382aafbSBarry Smith -   m7 - 7th memory to free
1029d382aafbSBarry Smith 
1030d382aafbSBarry Smith    Level: developer
1031d382aafbSBarry Smith 
103295452b02SPatrick Sanan    Notes:
103387497f52SBarry Smith     Memory must have been obtained with `PetscMalloc7()`
1034d382aafbSBarry Smith 
1035db781477SPatrick Sanan .seealso: `PetscNew()`, `PetscMalloc()`, `PetscMalloc2()`, `PetscFree()`, `PetscMalloc3()`, `PetscMalloc4()`, `PetscMalloc5()`, `PetscMalloc6()`,
1036db781477SPatrick Sanan           `PetscMalloc7()`
1037d382aafbSBarry Smith 
1038d382aafbSBarry Smith M*/
1039ba282f50SJed Brown #define PetscFree7(m1, m2, m3, m4, m5, m6, m7) PetscFreeA(7, __LINE__, PETSC_FUNCTION_NAME, __FILE__, &(m1), &(m2), &(m3), &(m4), &(m5), &(m6), &(m7))
1040d382aafbSBarry Smith 
1041ba282f50SJed Brown PETSC_EXTERN PetscErrorCode PetscMallocA(int, PetscBool, int, const char *, const char *, size_t, void *, ...);
1042ba282f50SJed Brown PETSC_EXTERN PetscErrorCode PetscFreeA(int, int, const char *, const char *, void *, ...);
1043071fcb05SBarry Smith PETSC_EXTERN                PetscErrorCode (*PetscTrMalloc)(size_t, PetscBool, int, const char[], const char[], void **);
1044efca3c55SSatish Balay PETSC_EXTERN                PetscErrorCode (*PetscTrFree)(void *, int, const char[], const char[]);
10453221ece2SMatthew G. Knepley PETSC_EXTERN                PetscErrorCode (*PetscTrRealloc)(size_t, int, const char[], const char[], void **);
1046ba282f50SJed Brown PETSC_EXTERN PetscErrorCode PetscMallocSetCoalesce(PetscBool);
104792f119d6SBarry Smith PETSC_EXTERN PetscErrorCode PetscMallocSet(PetscErrorCode (*)(size_t, PetscBool, int, const char[], const char[], void **), PetscErrorCode (*)(void *, int, const char[], const char[]), PetscErrorCode (*)(size_t, int, const char[], const char[], void **));
1048014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMallocClear(void);
1049d382aafbSBarry Smith 
1050d382aafbSBarry Smith /*
1051c1706be6SHong Zhang   Unlike PetscMallocSet and PetscMallocClear which overwrite the existing settings, these two functions save the previous choice of allocator, and should be used in pair.
1052c1706be6SHong Zhang */
1053c1706be6SHong Zhang PETSC_EXTERN PetscErrorCode PetscMallocSetDRAM(void);
1054c1706be6SHong Zhang PETSC_EXTERN PetscErrorCode PetscMallocResetDRAM(void);
105531f06eaaSHong Zhang #if defined(PETSC_HAVE_CUDA)
105631f06eaaSHong Zhang PETSC_EXTERN PetscErrorCode PetscMallocSetCUDAHost(void);
105731f06eaaSHong Zhang PETSC_EXTERN PetscErrorCode PetscMallocResetCUDAHost(void);
105831f06eaaSHong Zhang #endif
105959af0bd3SScott Kruger #if defined(PETSC_HAVE_HIP)
106059af0bd3SScott Kruger PETSC_EXTERN PetscErrorCode PetscMallocSetHIPHost(void);
106159af0bd3SScott Kruger PETSC_EXTERN PetscErrorCode PetscMallocResetHIPHost(void);
106259af0bd3SScott Kruger #endif
106359af0bd3SScott Kruger 
1064a5057860SBarry Smith #define MPIU_PETSCLOGDOUBLE  MPI_DOUBLE
106536763ca0SBas van 't Hof #define MPIU_2PETSCLOGDOUBLE MPI_2DOUBLE_PRECISION
1066a5057860SBarry Smith 
1067a5057860SBarry Smith /*
106866d669d6SBarry Smith    Routines for tracing memory corruption/bleeding with default PETSc memory allocation
1069d382aafbSBarry Smith */
1070014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMallocDump(FILE *);
107192f119d6SBarry Smith PETSC_EXTERN PetscErrorCode PetscMallocView(FILE *);
1072014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMallocGetCurrentUsage(PetscLogDouble *);
1073014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMallocGetMaximumUsage(PetscLogDouble *);
1074e3ed9ee7SBarry Smith PETSC_EXTERN PetscErrorCode PetscMallocPushMaximumUsage(int);
1075e3ed9ee7SBarry Smith PETSC_EXTERN PetscErrorCode PetscMallocPopMaximumUsage(int, PetscLogDouble *);
107692f119d6SBarry Smith PETSC_EXTERN PetscErrorCode PetscMallocSetDebug(PetscBool, PetscBool);
107792f119d6SBarry Smith PETSC_EXTERN PetscErrorCode PetscMallocGetDebug(PetscBool *, PetscBool *, PetscBool *);
1078efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode PetscMallocValidate(int, const char[], const char[]);
107992f119d6SBarry Smith PETSC_EXTERN PetscErrorCode PetscMallocViewSet(PetscLogDouble);
108092f119d6SBarry Smith PETSC_EXTERN PetscErrorCode PetscMallocViewGet(PetscBool *);
1081608c71bfSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscMallocLogRequestedSizeSet(PetscBool);
1082608c71bfSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscMallocLogRequestedSizeGet(PetscBool *);
1083d382aafbSBarry Smith 
1084014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDataTypeToMPIDataType(PetscDataType, MPI_Datatype *);
1085014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMPIDataTypeToPetscDataType(MPI_Datatype, PetscDataType *);
1086014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDataTypeGetSize(PetscDataType, size_t *);
10878e4b2d1dSBarry Smith PETSC_EXTERN PetscErrorCode PetscDataTypeFromString(const char *, PetscDataType *, PetscBool *);
1088d382aafbSBarry Smith 
1089d382aafbSBarry Smith /*
1090d382aafbSBarry Smith     Basic memory and string operations. These are usually simple wrappers
1091d382aafbSBarry Smith    around the basic Unix system calls, but a few of them have additional
1092d382aafbSBarry Smith    functionality and/or error checking.
1093d382aafbSBarry Smith */
1094014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMemcmp(const void *, const void *, size_t, PetscBool *);
1095014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrlen(const char[], size_t *);
1096d67fe73bSBarry Smith PETSC_EXTERN PetscErrorCode PetscStrToArray(const char[], char, int *, char ***);
1097014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrToArrayDestroy(int, char **);
1098014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrcmp(const char[], const char[], PetscBool *);
1099014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrgrt(const char[], const char[], PetscBool *);
1100014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrcasecmp(const char[], const char[], PetscBool *);
1101014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrncmp(const char[], const char[], size_t, PetscBool *);
1102014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrcpy(char[], const char[]);
1103014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrcat(char[], const char[]);
1104a126751eSBarry Smith PETSC_EXTERN PetscErrorCode PetscStrlcat(char[], const char[], size_t);
1105014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrncpy(char[], const char[], size_t);
1106014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrchr(const char[], char, char *[]);
1107014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrtolower(char[]);
11082f234a98SBarry Smith PETSC_EXTERN PetscErrorCode PetscStrtoupper(char[]);
1109014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrrchr(const char[], char, char *[]);
1110014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrstr(const char[], const char[], char *[]);
1111014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrrstr(const char[], const char[], char *[]);
1112014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrendswith(const char[], const char[], PetscBool *);
11132c9581d2SBarry Smith PETSC_EXTERN PetscErrorCode PetscStrbeginswith(const char[], const char[], PetscBool *);
1114014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrendswithwhich(const char[], const char *const *, PetscInt *);
1115014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrallocpy(const char[], char *[]);
111647340559SBarry Smith PETSC_EXTERN PetscErrorCode PetscStrArrayallocpy(const char *const *, char ***);
11176fed8037SJed Brown PETSC_EXTERN PetscErrorCode PetscStrArrayDestroy(char ***);
11186991f827SBarry Smith PETSC_EXTERN PetscErrorCode PetscStrNArrayallocpy(PetscInt, const char *const *, char ***);
11196991f827SBarry Smith PETSC_EXTERN PetscErrorCode PetscStrNArrayDestroy(PetscInt, char ***);
1120014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrreplace(MPI_Comm, const char[], char[], size_t);
1121d382aafbSBarry Smith 
1122573b0fb4SBarry Smith PETSC_EXTERN void PetscStrcmpNoError(const char[], const char[], PetscBool *);
1123573b0fb4SBarry Smith 
112498e514b7SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscTokenCreate(const char[], char, PetscToken *);
1125014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscTokenFind(PetscToken, char *[]);
1126014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscTokenDestroy(PetscToken *);
1127d382aafbSBarry Smith 
1128e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscStrInList(const char[], const char[], char, PetscBool *);
112980b92c66SBarry Smith PETSC_EXTERN const char    *PetscBasename(const char[]);
1130a53986e1SJed Brown PETSC_EXTERN PetscErrorCode PetscEListFind(PetscInt, const char *const *, const char *, PetscInt *, PetscBool *);
1131a53986e1SJed Brown PETSC_EXTERN PetscErrorCode PetscEnumFind(const char *const *, const char *, PetscEnum *, PetscBool *);
1132a53986e1SJed Brown 
1133d382aafbSBarry Smith /*
1134d382aafbSBarry Smith    These are MPI operations for MPI_Allreduce() etc
1135d382aafbSBarry Smith */
1136367daffbSBarry Smith PETSC_EXTERN MPI_Op MPIU_MAXSUM_OP;
1137570b7f6dSBarry Smith #if defined(PETSC_USE_REAL___FLOAT128) || defined(PETSC_USE_REAL___FP16)
1138de272c7aSSatish Balay PETSC_EXTERN MPI_Op MPIU_SUM;
1139014dd563SJed Brown PETSC_EXTERN MPI_Op MPIU_MAX;
1140014dd563SJed Brown PETSC_EXTERN MPI_Op MPIU_MIN;
1141d9822059SBarry Smith #else
1142de272c7aSSatish Balay   #define MPIU_SUM MPI_SUM
1143d9822059SBarry Smith   #define MPIU_MAX MPI_MAX
1144d9822059SBarry Smith   #define MPIU_MIN MPI_MIN
1145d9822059SBarry Smith #endif
114662e5d2d2SJDBetteridge PETSC_EXTERN MPI_Op         Petsc_Garbage_SetIntersectOp;
114762e5d2d2SJDBetteridge PETSC_EXTERN PetscErrorCode PetscMaxSum(MPI_Comm, const PetscInt[], PetscInt *, PetscInt *);
114862e5d2d2SJDBetteridge 
11499e517322SPierre Jolivet #if defined(PETSC_HAVE_REAL___FLOAT128) || defined(PETSC_HAVE_REAL___FP16)
1150613bf2b2SPierre Jolivet /*MC
11519e517322SPierre Jolivet     MPIU_SUM___FP16___FLOAT128 - MPI_Op that acts as a replacement for MPI_SUM with
11529e517322SPierre Jolivet     custom MPI_Datatype `MPIU___FLOAT128`, `MPIU___COMPLEX128`, and `MPIU___FP16`.
1153613bf2b2SPierre Jolivet 
1154613bf2b2SPierre Jolivet    Level: advanced
1155613bf2b2SPierre Jolivet 
1156613bf2b2SPierre Jolivet    Developer Note:
1157613bf2b2SPierre Jolivet    This should be unified with `MPIU_SUM`
1158613bf2b2SPierre Jolivet 
1159613bf2b2SPierre Jolivet .seealso: `MPIU_REAL`, `MPIU_SCALAR`, `MPIU_COMPLEX`
1160613bf2b2SPierre Jolivet M*/
11619e517322SPierre Jolivet PETSC_EXTERN MPI_Op MPIU_SUM___FP16___FLOAT128;
1162613bf2b2SPierre Jolivet #endif
1163014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMaxSum(MPI_Comm, const PetscInt[], PetscInt *, PetscInt *);
1164d382aafbSBarry Smith 
116593d501b3SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode MPIULong_Send(void *, PetscInt, MPI_Datatype, PetscMPIInt, PetscMPIInt, MPI_Comm) PETSC_ATTRIBUTE_MPI_POINTER_WITH_TYPE(1, 3);
116693d501b3SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode MPIULong_Recv(void *, PetscInt, MPI_Datatype, PetscMPIInt, PetscMPIInt, MPI_Comm) PETSC_ATTRIBUTE_MPI_POINTER_WITH_TYPE(1, 3);
1167eb3f98d2SBarry Smith 
1168639ff905SBarry Smith /*
1169639ff905SBarry Smith     Defines PETSc error handling.
1170639ff905SBarry Smith */
1171639ff905SBarry Smith #include <petscerror.h>
1172d382aafbSBarry Smith 
1173660278c0SBarry Smith PETSC_EXTERN PetscBool   PetscCIEnabled;                    /* code is running in the PETSc test harness CI */
1174660278c0SBarry Smith PETSC_EXTERN PetscBool   PetscCIEnabledPortableErrorOutput; /* error output is stripped to ensure portability of error messages across systems */
1175660278c0SBarry Smith PETSC_EXTERN const char *PetscCIFilename(const char *);
1176660278c0SBarry Smith PETSC_EXTERN int         PetscCILinenumber(int);
1177660278c0SBarry Smith 
1178f3fa974cSJacob Faibussowitsch #define PETSC_SMALLEST_CLASSID ((PetscClassId)1211211)
1179014dd563SJed Brown PETSC_EXTERN PetscClassId   PETSC_LARGEST_CLASSID;
1180014dd563SJed Brown PETSC_EXTERN PetscClassId   PETSC_OBJECT_CLASSID;
1181014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscClassIdRegister(const char[], PetscClassId *);
118281256985SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscObjectGetId(PetscObject, PetscObjectId *);
118381256985SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscObjectCompareId(PetscObject, PetscObjectId, PetscBool *);
118481256985SMatthew G. Knepley 
1185d382aafbSBarry Smith /*
1186d382aafbSBarry Smith    Routines that get memory usage information from the OS
1187d382aafbSBarry Smith */
1188014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMemoryGetCurrentUsage(PetscLogDouble *);
1189014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMemoryGetMaximumUsage(PetscLogDouble *);
1190014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMemorySetGetMaximumUsage(void);
1191b44d5720SBarry Smith PETSC_EXTERN PetscErrorCode PetscMemoryTrace(const char[]);
1192d382aafbSBarry Smith 
1193014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSleep(PetscReal);
1194d382aafbSBarry Smith 
1195d382aafbSBarry Smith /*
1196d382aafbSBarry Smith    Initialization of PETSc
1197d382aafbSBarry Smith */
1198014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscInitialize(int *, char ***, const char[], const char[]);
1199014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscInitializeNoPointers(int, char **, const char[], const char[]);
1200014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscInitializeNoArguments(void);
1201014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscInitialized(PetscBool *);
1202014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFinalized(PetscBool *);
1203014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFinalize(void);
1204014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscInitializeFortran(void);
1205014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetArgs(int *, char ***);
1206014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetArguments(char ***);
1207014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFreeArguments(char **);
1208d382aafbSBarry Smith 
1209014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscEnd(void);
1210607a6623SBarry Smith PETSC_EXTERN PetscErrorCode PetscSysInitializePackage(void);
1211d382aafbSBarry Smith 
1212014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPythonInitialize(const char[], const char[]);
1213014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPythonFinalize(void);
1214014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPythonPrintError(void);
1215014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPythonMonitorSet(PetscObject, const char[]);
1216d382aafbSBarry Smith 
1217a50e088cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscMonitorCompare(PetscErrorCode (*)(void), void *, PetscErrorCode (*)(void **), PetscErrorCode (*)(void), void *, PetscErrorCode (*)(void **), PetscBool *);
1218a50e088cSMatthew G. Knepley 
1219d382aafbSBarry Smith /*
1220d382aafbSBarry Smith      These are so that in extern C code we can caste function pointers to non-extern C
12212981ebdbSBarry Smith    function pointers. Since the regular C++ code expects its function pointers to be C++
1222d382aafbSBarry Smith */
1223638cfed1SJed Brown PETSC_EXTERN_TYPEDEF typedef void (**PetscVoidStarFunction)(void);
1224638cfed1SJed Brown PETSC_EXTERN_TYPEDEF typedef void (*PetscVoidFunction)(void);
1225638cfed1SJed Brown PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*PetscErrorCodeFunction)(void);
1226d382aafbSBarry Smith 
1227d382aafbSBarry Smith /*
1228d382aafbSBarry Smith     Functions that can act on any PETSc object.
1229d382aafbSBarry Smith */
1230014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectDestroy(PetscObject *);
1231014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetComm(PetscObject, MPI_Comm *);
1232014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetClassId(PetscObject, PetscClassId *);
1233014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetClassName(PetscObject, const char *[]);
1234014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetType(PetscObject, const char *[]);
1235014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectSetName(PetscObject, const char[]);
1236014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetName(PetscObject, const char *[]);
1237014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectSetTabLevel(PetscObject, PetscInt);
1238014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetTabLevel(PetscObject, PetscInt *);
1239014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectIncrementTabLevel(PetscObject, PetscObject, PetscInt);
1240014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectReference(PetscObject);
1241014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetReference(PetscObject, PetscInt *);
1242014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectDereference(PetscObject);
1243014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetNewTag(PetscObject, PetscMPIInt *);
1244014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectCompose(PetscObject, const char[], PetscObject);
1245014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectRemoveReference(PetscObject, const char[]);
1246014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectQuery(PetscObject, const char[], PetscObject *);
1247bdf89e91SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectComposeFunction_Private(PetscObject, const char[], void (*)(void));
1248f3fa974cSJacob Faibussowitsch #define PetscObjectComposeFunction(a, b, d) PetscObjectComposeFunction_Private((a), (b), (PetscVoidFunction)(d))
1249014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectSetFromOptions(PetscObject);
1250014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectSetUp(PetscObject);
12510eb63584SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectSetPrintedOptions(PetscObject);
12520eb63584SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectInheritPrintedOptions(PetscObject, PetscObject);
1253014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscCommGetNewTag(MPI_Comm, PetscMPIInt *);
1254d382aafbSBarry Smith 
1255665c2dedSJed Brown #include <petscviewertypes.h>
1256639ff905SBarry Smith #include <petscoptions.h>
1257639ff905SBarry Smith 
1258608c71bfSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscMallocTraceSet(PetscViewer, PetscBool, PetscLogDouble);
1259608c71bfSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscMallocTraceGet(PetscBool *);
1260608c71bfSMatthew G. Knepley 
12610633abcbSJed Brown PETSC_EXTERN PetscErrorCode PetscObjectsListGetGlobalNumbering(MPI_Comm, PetscInt, PetscObject *, PetscInt *, PetscInt *);
12620633abcbSJed Brown 
1263c5e4d11fSDmitry Karpeev PETSC_EXTERN PetscErrorCode PetscMemoryView(PetscViewer, const char[]);
1264dae58748SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectPrintClassNamePrefixType(PetscObject, PetscViewer);
1265639ff905SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectView(PetscObject, PetscViewer);
12660005d66cSJed Brown #define PetscObjectQueryFunction(obj, name, fptr) PetscObjectQueryFunction_Private((obj), (name), (PetscVoidFunction *)(fptr))
12670005d66cSJed Brown PETSC_EXTERN PetscErrorCode PetscObjectQueryFunction_Private(PetscObject, const char[], void (**)(void));
1268014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectSetOptionsPrefix(PetscObject, const char[]);
1269014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectAppendOptionsPrefix(PetscObject, const char[]);
1270014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectPrependOptionsPrefix(PetscObject, const char[]);
1271014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetOptionsPrefix(PetscObject, const char *[]);
1272014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectChangeTypeName(PetscObject, const char[]);
1273014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectRegisterDestroy(PetscObject);
1274014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectRegisterDestroyAll(void);
1275685405a1SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectViewFromOptions(PetscObject, PetscObject, const char[]);
1276014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectName(PetscObject);
1277014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectTypeCompare(PetscObject, const char[], PetscBool *);
1278013e2dc7SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectObjectTypeCompare(PetscObject, PetscObject, PetscBool *);
12794099cc6bSBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectBaseTypeCompare(PetscObject, const char[], PetscBool *);
1280014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectTypeCompareAny(PetscObject, PetscBool *, const char[], ...);
1281b9e7e5c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectBaseTypeCompareAny(PetscObject, PetscBool *, const char[], ...);
1282014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRegisterFinalize(PetscErrorCode (*)(void));
1283014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRegisterFinalizeAll(void);
1284d382aafbSBarry Smith 
1285e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
12867aab2a10SBarry Smith PETSC_EXTERN PetscErrorCode PetscSAWsBlock(void);
1287e04113cfSBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectSAWsViewOff(PetscObject);
1288e04113cfSBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectSAWsSetBlock(PetscObject, PetscBool);
1289e04113cfSBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectSAWsBlock(PetscObject);
1290e04113cfSBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectSAWsGrantAccess(PetscObject);
1291e04113cfSBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectSAWsTakeAccess(PetscObject);
1292e04113cfSBarry Smith PETSC_EXTERN void           PetscStackSAWsGrantAccess(void);
1293e04113cfSBarry Smith PETSC_EXTERN void           PetscStackSAWsTakeAccess(void);
1294e04113cfSBarry Smith PETSC_EXTERN PetscErrorCode PetscStackViewSAWs(void);
1295e04113cfSBarry Smith PETSC_EXTERN PetscErrorCode PetscStackSAWsViewOff(void);
129615681b3cSBarry Smith 
1297ec7429eaSBarry Smith #else
12987aab2a10SBarry Smith   #define PetscSAWsBlock()                  0
1299e04113cfSBarry Smith   #define PetscObjectSAWsViewOff(obj)       0
1300e04113cfSBarry Smith   #define PetscObjectSAWsSetBlock(obj, flg) 0
1301e04113cfSBarry Smith   #define PetscObjectSAWsBlock(obj)         0
1302e04113cfSBarry Smith   #define PetscObjectSAWsGrantAccess(obj)   0
1303e04113cfSBarry Smith   #define PetscObjectSAWsTakeAccess(obj)    0
1304e04113cfSBarry Smith   #define PetscStackViewSAWs()              0
1305e04113cfSBarry Smith   #define PetscStackSAWsViewOff()           0
1306e04113cfSBarry Smith   #define PetscStackSAWsTakeAccess()
1307e04113cfSBarry Smith   #define PetscStackSAWsGrantAccess()
130815681b3cSBarry Smith 
1309ec7429eaSBarry Smith #endif
1310b90c6cbeSBarry Smith 
131182b97d80SJed Brown PETSC_EXTERN PetscErrorCode PetscDLOpen(const char[], PetscDLMode, PetscDLHandle *);
131282b97d80SJed Brown PETSC_EXTERN PetscErrorCode PetscDLClose(PetscDLHandle *);
131382b97d80SJed Brown PETSC_EXTERN PetscErrorCode PetscDLSym(PetscDLHandle, const char[], void **);
1314258ec3d2SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscDLAddr(void (*)(void), char **);
1315258ec3d2SMatthew G. Knepley #ifdef PETSC_HAVE_CXX
1316258ec3d2SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscDemangleSymbol(const char *, char **);
1317258ec3d2SMatthew G. Knepley #endif
13187d5d4d99SBarry Smith 
1319a64a8e02SBarry Smith PETSC_EXTERN PetscErrorCode PetscMallocGetStack(void *, PetscStack **);
1320a64a8e02SBarry Smith 
1321dfb7d7afSStefano Zampini PETSC_EXTERN PetscErrorCode PetscObjectsDump(FILE *, PetscBool);
1322140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectListDestroy(PetscObjectList *);
1323140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectListFind(PetscObjectList, const char[], PetscObject *);
1324140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectListReverseFind(PetscObjectList, PetscObject, char **, PetscBool *);
1325140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectListAdd(PetscObjectList *, const char[], PetscObject);
1326140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectListRemoveReference(PetscObjectList *, const char[]);
1327140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectListDuplicate(PetscObjectList, PetscObjectList *);
1328d382aafbSBarry Smith 
1329d382aafbSBarry Smith /*
1330503cfb0cSBarry Smith     Dynamic library lists. Lists of names of routines in objects or in dynamic
1331d382aafbSBarry Smith   link libraries that will be loaded as needed.
1332d382aafbSBarry Smith */
1333a240a19fSJed Brown 
1334a240a19fSJed Brown #define PetscFunctionListAdd(list, name, fptr) PetscFunctionListAdd_Private((list), (name), (PetscVoidFunction)(fptr))
1335*ed170139SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscFunctionListAdd_Private(PetscFunctionList *, const char[], PetscVoidFunction);
1336140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscFunctionListDestroy(PetscFunctionList *);
13370e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscFunctionListClear(PetscFunctionList);
13381c9cd337SJed Brown #define PetscFunctionListFind(list, name, fptr) PetscFunctionListFind_Private((list), (name), (PetscVoidFunction *)(fptr))
1339*ed170139SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscFunctionListFind_Private(PetscFunctionList, const char[], PetscVoidFunction *);
134044ef3d73SBarry Smith PETSC_EXTERN PetscErrorCode PetscFunctionListPrintTypes(MPI_Comm, FILE *, const char[], const char[], const char[], const char[], PetscFunctionList, const char[], const char[]);
1341140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscFunctionListDuplicate(PetscFunctionList, PetscFunctionList *);
1342140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscFunctionListView(PetscFunctionList, PetscViewer);
1343140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscFunctionListGet(PetscFunctionList, const char ***, int *);
13442e956fe4SStefano Zampini PETSC_EXTERN PetscErrorCode PetscFunctionListPrintNonEmpty(PetscFunctionList);
13452e956fe4SStefano Zampini PETSC_EXTERN PetscErrorCode PetscFunctionListPrintAll(void);
1346d382aafbSBarry Smith 
1347014dd563SJed Brown PETSC_EXTERN PetscDLLibrary PetscDLLibrariesLoaded;
1348014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDLLibraryAppend(MPI_Comm, PetscDLLibrary *, const char[]);
1349014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDLLibraryPrepend(MPI_Comm, PetscDLLibrary *, const char[]);
1350014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDLLibrarySym(MPI_Comm, PetscDLLibrary *, const char[], const char[], void **);
1351014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDLLibraryPrintPath(PetscDLLibrary);
1352014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDLLibraryRetrieve(MPI_Comm, const char[], char *, size_t, PetscBool *);
1353014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDLLibraryOpen(MPI_Comm, const char[], PetscDLLibrary *);
1354014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDLLibraryClose(PetscDLLibrary);
1355d382aafbSBarry Smith 
1356d382aafbSBarry Smith /*
1357d382aafbSBarry Smith      Useful utility routines
1358d382aafbSBarry Smith */
1359014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSplitOwnership(MPI_Comm, PetscInt *, PetscInt *);
1360014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSplitOwnershipBlock(MPI_Comm, PetscInt, PetscInt *, PetscInt *);
1361d24d4204SJose E. Roman PETSC_EXTERN PetscErrorCode PetscSplitOwnershipEqual(MPI_Comm, PetscInt *, PetscInt *);
1362014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSequentialPhaseBegin(MPI_Comm, PetscMPIInt);
1363014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSequentialPhaseEnd(MPI_Comm, PetscMPIInt);
1364014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscBarrier(PetscObject);
1365014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMPIDump(FILE *);
136658b5cd2aSSatish Balay PETSC_EXTERN PetscErrorCode PetscGlobalMinMaxInt(MPI_Comm, const PetscInt[2], PetscInt[2]);
136758b5cd2aSSatish Balay PETSC_EXTERN PetscErrorCode PetscGlobalMinMaxReal(MPI_Comm, const PetscReal[2], PetscReal[2]);
1368d382aafbSBarry Smith 
136964ac3b0dSPatrick Sanan /*MC
137087497f52SBarry Smith     PetscNot - negates a logical type value and returns result as a `PetscBool`
1371503cfb0cSBarry Smith 
137264ac3b0dSPatrick Sanan     Level: beginner
137364ac3b0dSPatrick Sanan 
1374a1cb98faSBarry Smith     Note:
1375a1cb98faSBarry Smith     This is useful in cases like
1376a1cb98faSBarry Smith .vb
1377a1cb98faSBarry Smith      int        *a;
1378a1cb98faSBarry Smith      PetscBool  flag = PetscNot(a)
1379a1cb98faSBarry Smith .ve
1380a1cb98faSBarry Smith      where !a would not return a `PetscBool` because we cannot provide a cast from int to `PetscBool` in C.
1381a1cb98faSBarry Smith 
1382a1cb98faSBarry Smith .seealso: `PetscBool`, `PETSC_TRUE`, `PETSC_FALSE`
138364ac3b0dSPatrick Sanan M*/
1384d382aafbSBarry Smith #define PetscNot(a) ((a) ? PETSC_FALSE : PETSC_TRUE)
1385503cfb0cSBarry Smith 
1386d382aafbSBarry Smith /*MC
1387d382aafbSBarry Smith     PetscHelpPrintf - Prints help messages.
1388d382aafbSBarry Smith 
1389cd05f99aSJacob Faibussowitsch     Not Collective, only applies on rank 0; No Fortran Support
1390cf53795eSBarry Smith 
1391d382aafbSBarry Smith    Synopsis:
1392aaa7dc30SBarry Smith     #include <petscsys.h>
1393659f7ba0SBarry Smith      PetscErrorCode (*PetscHelpPrintf)(MPI_Comm comm, const char format[],args);
1394d382aafbSBarry Smith 
1395d382aafbSBarry Smith     Input Parameters:
1396659f7ba0SBarry Smith +  comm - the MPI communicator over which the help message is printed
1397d382aafbSBarry Smith .  format - the usual printf() format string
1398659f7ba0SBarry Smith -  args - arguments to be printed
1399d382aafbSBarry Smith 
1400d382aafbSBarry Smith    Level: developer
1401d382aafbSBarry Smith 
1402659f7ba0SBarry Smith    Note:
1403659f7ba0SBarry Smith      You can change how help messages are printed by replacing the function pointer with a function that does not simply write to stdout.
1404659f7ba0SBarry Smith 
1405659f7ba0SBarry Smith       To use, write your own function, for example,
1406659f7ba0SBarry Smith $PetscErrorCode mypetschelpprintf(MPI_Comm comm,const char format[],....)
1407659f7ba0SBarry Smith ${
1408659f7ba0SBarry Smith $ PetscFunctionReturn(0);
1409659f7ba0SBarry Smith $}
1410d5b43468SJose E. Roman then do the assignment
1411659f7ba0SBarry Smith $    PetscHelpPrintf = mypetschelpprintf;
141287497f52SBarry Smith    You can do the assignment before `PetscInitialize()`.
1413659f7ba0SBarry Smith 
141487497f52SBarry Smith   The default routine used is called `PetscHelpPrintfDefault()`.
1415d382aafbSBarry Smith 
1416db781477SPatrick Sanan .seealso: `PetscFPrintf()`, `PetscSynchronizedPrintf()`, `PetscErrorPrintf()`
1417d382aafbSBarry Smith M*/
14183ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode (*PetscHelpPrintf)(MPI_Comm, const char[], ...) PETSC_ATTRIBUTE_FORMAT(2, 3);
1419d382aafbSBarry Smith 
1420fcfd50ebSBarry Smith /*
1421fcfd50ebSBarry Smith      Defines PETSc profiling.
1422fcfd50ebSBarry Smith */
14232c8e378dSBarry Smith #include <petsclog.h>
1424fcfd50ebSBarry Smith 
1425fcfd50ebSBarry Smith /*
1426fcfd50ebSBarry Smith       Simple PETSc parallel IO for ASCII printing
1427fcfd50ebSBarry Smith */
1428014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFixFilename(const char[], char[]);
1429014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFOpen(MPI_Comm, const char[], const char[], FILE **);
1430014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFClose(MPI_Comm, FILE *);
14313ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscFPrintf(MPI_Comm, FILE *, const char[], ...) PETSC_ATTRIBUTE_FORMAT(3, 4);
14323ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscPrintf(MPI_Comm, const char[], ...) PETSC_ATTRIBUTE_FORMAT(2, 3);
14333ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscSNPrintf(char *, size_t, const char[], ...) PETSC_ATTRIBUTE_FORMAT(3, 4);
14343ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscSNPrintfCount(char *, size_t, const char[], size_t *, ...) PETSC_ATTRIBUTE_FORMAT(3, 5);
14351b5687a1SBarry Smith PETSC_EXTERN PetscErrorCode PetscFormatRealArray(char[], size_t, const char *, PetscInt, const PetscReal[]);
1436fcfd50ebSBarry Smith 
14373ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscErrorPrintfDefault(const char[], ...) PETSC_ATTRIBUTE_FORMAT(1, 2);
14383ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscErrorPrintfNone(const char[], ...) PETSC_ATTRIBUTE_FORMAT(1, 2);
14393ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscHelpPrintfDefault(MPI_Comm, const char[], ...) PETSC_ATTRIBUTE_FORMAT(2, 3);
1440d382aafbSBarry Smith 
1441d781fa04SBarry Smith PETSC_EXTERN PetscErrorCode PetscFormatConvertGetSize(const char *, size_t *);
1442d781fa04SBarry Smith PETSC_EXTERN PetscErrorCode PetscFormatConvert(const char *, char *);
1443d781fa04SBarry Smith 
1444d382aafbSBarry Smith #if defined(PETSC_HAVE_POPEN)
1445014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPOpen(MPI_Comm, const char[], const char[], const char[], FILE **);
1446016831caSBarry Smith PETSC_EXTERN PetscErrorCode PetscPClose(MPI_Comm, FILE *);
144774ba8654SBarry Smith PETSC_EXTERN PetscErrorCode PetscPOpenSetMachine(const char[]);
1448d382aafbSBarry Smith #endif
1449d382aafbSBarry Smith 
14503ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscSynchronizedPrintf(MPI_Comm, const char[], ...) PETSC_ATTRIBUTE_FORMAT(2, 3);
14513ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscSynchronizedFPrintf(MPI_Comm, FILE *, const char[], ...) PETSC_ATTRIBUTE_FORMAT(3, 4);
14520ec8b6e3SBarry Smith PETSC_EXTERN PetscErrorCode PetscSynchronizedFlush(MPI_Comm, FILE *);
1453014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSynchronizedFGets(MPI_Comm, FILE *, size_t, char[]);
1454014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStartMatlab(MPI_Comm, const char[], const char[], FILE **);
1455014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStartJava(MPI_Comm, const char[], const char[], FILE **);
1456014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetPetscDir(const char *[]);
1457d382aafbSBarry Smith 
1458014dd563SJed Brown PETSC_EXTERN PetscClassId   PETSC_CONTAINER_CLASSID;
1459014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscContainerGetPointer(PetscContainer, void **);
1460014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscContainerSetPointer(PetscContainer, void *);
1461014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscContainerDestroy(PetscContainer *);
1462014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscContainerCreate(MPI_Comm, PetscContainer *);
1463014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscContainerSetUserDestroy(PetscContainer, PetscErrorCode (*)(void *));
1464b61ba218SStefano Zampini PETSC_EXTERN PetscErrorCode PetscContainerUserDestroyDefault(void *);
1465d382aafbSBarry Smith 
1466d382aafbSBarry Smith /*
1467d382aafbSBarry Smith    For use in debuggers
1468d382aafbSBarry Smith */
1469014dd563SJed Brown PETSC_EXTERN PetscMPIInt    PetscGlobalRank;
1470014dd563SJed Brown PETSC_EXTERN PetscMPIInt    PetscGlobalSize;
1471014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscIntView(PetscInt, const PetscInt[], PetscViewer);
1472014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRealView(PetscInt, const PetscReal[], PetscViewer);
1473014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscScalarView(PetscInt, const PetscScalar[], PetscViewer);
1474d382aafbSBarry Smith 
1475a663daf8SBarry Smith #include <stddef.h>
1476a3aaec0aSJed Brown #include <string.h> /* for memcpy, memset */
1477d382aafbSBarry Smith #include <stdlib.h>
14786c7e564aSBarry Smith 
14794a92a979SJed Brown #if defined(PETSC_HAVE_XMMINTRIN_H) && !defined(__CUDACC__)
1480d382aafbSBarry Smith   #include <xmmintrin.h>
1481d382aafbSBarry Smith #endif
1482d382aafbSBarry Smith 
1483d382aafbSBarry Smith /*@C
1484580bdb30SBarry Smith    PetscMemmove - Copies n bytes, beginning at location b, to the space
1485580bdb30SBarry Smith    beginning at location a. Copying  between regions that overlap will
148687497f52SBarry Smith    take place correctly. Use `PetscMemcpy()` if the locations do not overlap
1487580bdb30SBarry Smith 
1488580bdb30SBarry Smith    Not Collective
1489580bdb30SBarry Smith 
1490580bdb30SBarry Smith    Input Parameters:
1491580bdb30SBarry Smith +  b - pointer to initial memory space
1492580bdb30SBarry Smith .  a - pointer to copy space
1493580bdb30SBarry Smith -  n - length (in bytes) of space to copy
1494580bdb30SBarry Smith 
1495580bdb30SBarry Smith    Level: intermediate
1496580bdb30SBarry Smith 
149787497f52SBarry Smith    Notes:
149887497f52SBarry Smith    `PetscArraymove()` is preferred
1499580bdb30SBarry Smith 
150087497f52SBarry Smith    This routine is analogous to `memmove()`.
150187497f52SBarry Smith 
150287497f52SBarry Smith    Developers Note:
150387497f52SBarry Smith    This is inlined for performance
1504580bdb30SBarry Smith 
1505db781477SPatrick Sanan .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscMemzero()`, `PetscArraycmp()`, `PetscArraycpy()`, `PetscStrallocpy()`,
1506db781477SPatrick Sanan           `PetscArraymove()`
1507580bdb30SBarry Smith @*/
1508d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscMemmove(void *a, const void *b, size_t n)
1509d71ae5a4SJacob Faibussowitsch {
1510580bdb30SBarry Smith   PetscFunctionBegin;
1511f3fa974cSJacob Faibussowitsch   if (PetscUnlikely((n == 0) || (a == b))) PetscFunctionReturn(0);
1512f3fa974cSJacob Faibussowitsch   PetscAssert(a, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL, "Trying to copy %zu bytes to null pointer (Argument #1)", n);
1513f3fa974cSJacob Faibussowitsch   PetscAssert(b, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL, "Trying to copy %zu bytes from a null pointer (Argument #2)", n);
1514f3fa974cSJacob Faibussowitsch #if PetscDefined(HAVE_MEMMOVE)
1515f3fa974cSJacob Faibussowitsch   memmove((char *)a, (const char *)b, n);
1516f3fa974cSJacob Faibussowitsch #else
1517580bdb30SBarry Smith   if (a < b) {
1518f3fa974cSJacob Faibussowitsch     if (a <= b - n) {
1519f3fa974cSJacob Faibussowitsch       memcpy(a, b, n);
1520f3fa974cSJacob Faibussowitsch     } else {
1521f3fa974cSJacob Faibussowitsch       const size_t ptr_diff = (size_t)(b - a);
1522f3fa974cSJacob Faibussowitsch 
1523f3fa974cSJacob Faibussowitsch       memcpy(a, b, ptr_diff);
1524f3fa974cSJacob Faibussowitsch       PetscCall(PetscMemmove((void *)b, b + ptr_diff, n - ptr_diff));
1525580bdb30SBarry Smith     }
1526580bdb30SBarry Smith   } else {
1527f3fa974cSJacob Faibussowitsch     if (b <= a - n) {
1528f3fa974cSJacob Faibussowitsch       memcpy(a, b, n);
1529f3fa974cSJacob Faibussowitsch     } else {
1530f3fa974cSJacob Faibussowitsch       const size_t ptr_diff = (size_t)(a - b);
1531f3fa974cSJacob Faibussowitsch 
1532f3fa974cSJacob Faibussowitsch       memcpy((void *)(b + n), b + (n - ptr_diff), ptr_diff);
1533f3fa974cSJacob Faibussowitsch       PetscCall(PetscMemmove(a, b, n - ptr_diff));
1534580bdb30SBarry Smith     }
1535580bdb30SBarry Smith   }
1536580bdb30SBarry Smith #endif
1537580bdb30SBarry Smith   PetscFunctionReturn(0);
1538580bdb30SBarry Smith }
1539580bdb30SBarry Smith 
1540d382aafbSBarry Smith /*@C
1541d382aafbSBarry Smith    PetscMemcpy - Copies n bytes, beginning at location b, to the space
1542d382aafbSBarry Smith    beginning at location a. The two memory regions CANNOT overlap, use
154387497f52SBarry Smith    `PetscMemmove()` in that case.
1544d382aafbSBarry Smith 
1545d382aafbSBarry Smith    Not Collective
1546d382aafbSBarry Smith 
1547d382aafbSBarry Smith    Input Parameters:
1548d382aafbSBarry Smith +  b - pointer to initial memory space
1549d382aafbSBarry Smith -  n - length (in bytes) of space to copy
1550d382aafbSBarry Smith 
1551d382aafbSBarry Smith    Output Parameter:
1552d382aafbSBarry Smith .  a - pointer to copy space
1553d382aafbSBarry Smith 
1554d382aafbSBarry Smith    Level: intermediate
1555d382aafbSBarry Smith 
1556d382aafbSBarry Smith    Compile Option:
155787497f52SBarry Smith     `PETSC_PREFER_DCOPY_FOR_MEMCPY` will cause the BLAS dcopy() routine to be used
1558d382aafbSBarry Smith                                   for memory copies on double precision values.
155987497f52SBarry Smith     `PETSC_PREFER_COPY_FOR_MEMCPY` will cause C code to be used
1560d382aafbSBarry Smith                                   for memory copies on double precision values.
156187497f52SBarry Smith     `PETSC_PREFER_FORTRAN_FORMEMCPY` will cause Fortran code to be used
1562d382aafbSBarry Smith                                   for memory copies on double precision values.
1563d382aafbSBarry Smith 
156487497f52SBarry Smith    Notes:
156587497f52SBarry Smith    Prefer `PetscArraycpy()`
156687497f52SBarry Smith 
156787497f52SBarry Smith    This routine is analogous to `memcpy()`.
156887497f52SBarry Smith 
15691fd49c25SBarry Smith    Not available from Fortran
15701fd49c25SBarry Smith 
157187497f52SBarry Smith    Developer Note:
157287497f52SBarry Smith    This is inlined for fastest performance
1573f5f57ec0SBarry Smith 
1574db781477SPatrick Sanan .seealso: `PetscMemzero()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscArraycmp()`, `PetscArraycpy()`, `PetscMemmove()`, `PetscStrallocpy()`
1575d382aafbSBarry Smith @*/
1576d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscMemcpy(void *a, const void *b, size_t n)
1577d71ae5a4SJacob Faibussowitsch {
1578f3fa974cSJacob Faibussowitsch   const PETSC_UINTPTR_T al = (PETSC_UINTPTR_T)a;
1579f3fa974cSJacob Faibussowitsch   const PETSC_UINTPTR_T bl = (PETSC_UINTPTR_T)b;
1580f3fa974cSJacob Faibussowitsch 
1581a7e36092SMatthew G Knepley   PetscFunctionBegin;
1582f3fa974cSJacob Faibussowitsch   if (PetscUnlikely((n == 0) || (a == b))) PetscFunctionReturn(0);
1583f3fa974cSJacob Faibussowitsch   PetscAssert(a, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL, "Trying to copy %zu bytes to a null pointer (Argument #1)", n);
1584f3fa974cSJacob Faibussowitsch   PetscAssert(b, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL, "Trying to copy %zu bytes from a null pointer (Argument #2)", n);
1585f3fa974cSJacob Faibussowitsch   PetscAssert(!(((al > bl) && (al - bl) < n) || (bl - al) < n), PETSC_COMM_SELF, PETSC_ERR_ARG_INCOMP, "Memory regions overlap: either use PetscMemmove()\nor make sure your copy regions and lengths are correct.\nLength (bytes) %zu first address %" PRIxPTR " second address %" PRIxPTR, n, al, bl);
1586f3fa974cSJacob Faibussowitsch   if (PetscDefined(PREFER_DCOPY_FOR_MEMCPY) || PetscDefined(PREFER_COPY_FOR_MEMCPY) || PetscDefined(PREFER_FORTRAN_FORMEMCPY)) {
1587f3fa974cSJacob Faibussowitsch     if (!(al % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) {
1588f3fa974cSJacob Faibussowitsch       const size_t       scalar_len = n / sizeof(PetscScalar);
1589f3fa974cSJacob Faibussowitsch       const PetscScalar *x          = (PetscScalar *)b;
1590f3fa974cSJacob Faibussowitsch       PetscScalar       *y          = (PetscScalar *)a;
1591f3fa974cSJacob Faibussowitsch 
1592f3fa974cSJacob Faibussowitsch #if PetscDefined(PREFER_DCOPY_FOR_MEMCPY)
1593f3fa974cSJacob Faibussowitsch       {
1594f3fa974cSJacob Faibussowitsch         const PetscBLASInt one = 1;
1595f3fa974cSJacob Faibussowitsch         PetscBLASInt       blen;
1596f3fa974cSJacob Faibussowitsch 
1597f3fa974cSJacob Faibussowitsch         PetscCall(PetscBLASIntCast(scalar_len, &blen));
1598f3fa974cSJacob Faibussowitsch         PetscCallBLAS("BLAScopy", BLAScopy_(&blen, x, &one, y, &one));
15999a202e32SJacob Faibussowitsch       }
1600f3fa974cSJacob Faibussowitsch #elif PetscDefined(PREFER_FORTRAN_FORMEMCPY)
1601f3fa974cSJacob Faibussowitsch       fortrancopy_(&scalar_len, x, y);
1602a7e36092SMatthew G Knepley #else
1603f3fa974cSJacob Faibussowitsch       for (size_t i = 0; i < scalar_len; i++) y[i] = x[i];
1604a7e36092SMatthew G Knepley #endif
1605f3fa974cSJacob Faibussowitsch       PetscFunctionReturn(0);
1606d382aafbSBarry Smith     }
1607d382aafbSBarry Smith   }
1608f3fa974cSJacob Faibussowitsch   memcpy(a, b, n);
1609d382aafbSBarry Smith   PetscFunctionReturn(0);
1610d382aafbSBarry Smith }
1611d382aafbSBarry Smith 
1612d382aafbSBarry Smith /*@C
1613d382aafbSBarry Smith    PetscMemzero - Zeros the specified memory.
1614d382aafbSBarry Smith 
1615d382aafbSBarry Smith    Not Collective
1616d382aafbSBarry Smith 
1617d382aafbSBarry Smith    Input Parameters:
1618d382aafbSBarry Smith +  a - pointer to beginning memory location
1619d382aafbSBarry Smith -  n - length (in bytes) of memory to initialize
1620d382aafbSBarry Smith 
1621d382aafbSBarry Smith    Level: intermediate
1622d382aafbSBarry Smith 
1623d382aafbSBarry Smith    Compile Option:
162487497f52SBarry Smith    `PETSC_PREFER_BZERO` - on certain machines (the IBM RS6000) the bzero() routine happens
1625d382aafbSBarry Smith   to be faster than the memset() routine. This flag causes the bzero() routine to be used.
1626d382aafbSBarry Smith 
162787497f52SBarry Smith    Notes:
16281fd49c25SBarry Smith    Not available from Fortran
16291fd49c25SBarry Smith 
163087497f52SBarry Smith    Prefer `PetscArrayzero()`
163187497f52SBarry Smith 
163287497f52SBarry Smith    Developer Note:
163387497f52SBarry Smith    This is inlined for fastest performance
1634503cfb0cSBarry Smith 
1635db781477SPatrick Sanan .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscArraycmp()`, `PetscArraycpy()`, `PetscMemmove()`, `PetscStrallocpy()`
1636d382aafbSBarry Smith @*/
1637d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscMemzero(void *a, size_t n)
1638d71ae5a4SJacob Faibussowitsch {
1639f3fa974cSJacob Faibussowitsch   PetscFunctionBegin;
1640f3fa974cSJacob Faibussowitsch   if (PetscUnlikely(n == 0)) PetscFunctionReturn(0);
1641f3fa974cSJacob Faibussowitsch   PetscAssert(a, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL, "Trying to zero %zu bytes at a null pointer", n);
1642f3fa974cSJacob Faibussowitsch   if (PetscDefined(PREFER_ZERO_FOR_MEMZERO) || PetscDefined(PREFER_FORTRAN_FOR_MEMZERO)) {
1643f3fa974cSJacob Faibussowitsch     if (!(((PETSC_UINTPTR_T)a) % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) {
1644f3fa974cSJacob Faibussowitsch       const size_t scalar_len = n / sizeof(PetscScalar);
1645d382aafbSBarry Smith       PetscScalar *x          = (PetscScalar *)a;
1646f3fa974cSJacob Faibussowitsch 
1647f3fa974cSJacob Faibussowitsch       if (PetscDefined(PREFER_ZERO_FOR_MEMZERO)) {
1648f3fa974cSJacob Faibussowitsch         for (size_t i = 0; i < scalar_len; ++i) x[i] = 0;
1649d382aafbSBarry Smith       } else {
1650f3fa974cSJacob Faibussowitsch #if PetscDefined(PREFER_FORTRAN_FOR_MEMZERO)
1651f3fa974cSJacob Faibussowitsch         fortranzero_(&scalar_len, x);
1652d382aafbSBarry Smith #else
1653f3fa974cSJacob Faibussowitsch         (void)scalar_len;
1654f3fa974cSJacob Faibussowitsch         (void)x;
1655d382aafbSBarry Smith #endif
1656d382aafbSBarry Smith       }
1657f3fa974cSJacob Faibussowitsch       PetscFunctionReturn(0);
1658f3fa974cSJacob Faibussowitsch     }
1659f3fa974cSJacob Faibussowitsch   }
1660f3fa974cSJacob Faibussowitsch #if PetscDefined(PREFER_BZERO)
1661f3fa974cSJacob Faibussowitsch   bzero(a, n);
1662f3fa974cSJacob Faibussowitsch #else
1663f3fa974cSJacob Faibussowitsch   memset(a, 0, n);
1664f3fa974cSJacob Faibussowitsch #endif
1665f3fa974cSJacob Faibussowitsch   PetscFunctionReturn(0);
1666d382aafbSBarry Smith }
1667d382aafbSBarry Smith 
1668d382aafbSBarry Smith /*MC
1669580bdb30SBarry Smith    PetscArraycmp - Compares two arrays in memory.
1670580bdb30SBarry Smith 
1671580bdb30SBarry Smith    Synopsis:
1672580bdb30SBarry Smith     #include <petscsys.h>
1673580bdb30SBarry Smith     PetscErrorCode PetscArraycmp(const anytype *str1,const anytype *str2,size_t cnt,PetscBool *e)
1674580bdb30SBarry Smith 
1675580bdb30SBarry Smith    Not Collective
1676580bdb30SBarry Smith 
1677580bdb30SBarry Smith    Input Parameters:
1678580bdb30SBarry Smith +  str1 - First array
1679580bdb30SBarry Smith .  str2 - Second array
1680580bdb30SBarry Smith -  cnt  - Count of the array, not in bytes, but number of entries in the arrays
1681580bdb30SBarry Smith 
1682580bdb30SBarry Smith    Output Parameters:
168387497f52SBarry Smith .   e - `PETSC_TRUE` if equal else `PETSC_FALSE`.
1684580bdb30SBarry Smith 
1685580bdb30SBarry Smith    Level: intermediate
1686580bdb30SBarry Smith 
168787497f52SBarry Smith    Notes:
168887497f52SBarry Smith    This routine is a preferred replacement to `PetscMemcmp()`
168987497f52SBarry Smith 
1690580bdb30SBarry Smith    The arrays must be of the same type
1691580bdb30SBarry Smith 
1692db781477SPatrick Sanan .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscMemzero()`, `PetscArraycpy()`, `PetscMemmove()`, `PetscStrallocpy()`,
1693db781477SPatrick Sanan           `PetscArraymove()`
1694580bdb30SBarry Smith M*/
1695f3fa974cSJacob Faibussowitsch #define PetscArraycmp(str1, str2, cnt, e) ((sizeof(*(str1)) != sizeof(*(str2))) || PetscMemcmp((str1), (str2), (size_t)(cnt) * sizeof(*(str1)), (e)))
1696580bdb30SBarry Smith 
16978f8f2f0dSBarry Smith /*MC
169887497f52SBarry Smith    PetscArraymove - Copies from one array in memory to another, the arrays may overlap. Use `PetscArraycpy()` when the arrays
1699580bdb30SBarry Smith                     do not overlap
1700580bdb30SBarry Smith 
1701580bdb30SBarry Smith    Synopsis:
1702580bdb30SBarry Smith     #include <petscsys.h>
1703580bdb30SBarry Smith     PetscErrorCode PetscArraymove(anytype *str1,const anytype *str2,size_t cnt)
1704580bdb30SBarry Smith 
1705580bdb30SBarry Smith    Not Collective
1706580bdb30SBarry Smith 
1707580bdb30SBarry Smith    Input Parameters:
1708580bdb30SBarry Smith +  str1 - First array
1709580bdb30SBarry Smith .  str2 - Second array
1710580bdb30SBarry Smith -  cnt  - Count of the array, not in bytes, but number of entries in the arrays
1711580bdb30SBarry Smith 
1712580bdb30SBarry Smith    Level: intermediate
1713580bdb30SBarry Smith 
171487497f52SBarry Smith    Notes:
171587497f52SBarry Smith    This routine is a preferred replacement to `PetscMemmove()`
171687497f52SBarry Smith 
1717580bdb30SBarry Smith    The arrays must be of the same type
1718580bdb30SBarry Smith 
1719db781477SPatrick Sanan .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscMemzero()`, `PetscArraycpy()`, `PetscMemmove()`, `PetscArraycmp()`, `PetscStrallocpy()`
1720580bdb30SBarry Smith M*/
1721f3fa974cSJacob Faibussowitsch #define PetscArraymove(str1, str2, cnt) ((sizeof(*(str1)) != sizeof(*(str2))) || PetscMemmove((str1), (str2), (size_t)(cnt) * sizeof(*(str1))))
1722580bdb30SBarry Smith 
17238f8f2f0dSBarry Smith /*MC
1724580bdb30SBarry Smith    PetscArraycpy - Copies from one array in memory to another
1725580bdb30SBarry Smith 
1726580bdb30SBarry Smith    Synopsis:
1727580bdb30SBarry Smith     #include <petscsys.h>
1728580bdb30SBarry Smith     PetscErrorCode PetscArraycpy(anytype *str1,const anytype *str2,size_t cnt)
1729580bdb30SBarry Smith 
1730580bdb30SBarry Smith    Not Collective
1731580bdb30SBarry Smith 
1732580bdb30SBarry Smith    Input Parameters:
1733de25709eSStefano Zampini +  str1 - First array (destination)
1734de25709eSStefano Zampini .  str2 - Second array (source)
1735580bdb30SBarry Smith -  cnt  - Count of the array, not in bytes, but number of entries in the arrays
1736580bdb30SBarry Smith 
1737580bdb30SBarry Smith    Level: intermediate
1738580bdb30SBarry Smith 
173987497f52SBarry Smith    Notes:
174087497f52SBarry Smith    This routine is a preferred replacement to `PetscMemcpy()`
174187497f52SBarry Smith 
1742580bdb30SBarry Smith    The arrays must be of the same type
1743580bdb30SBarry Smith 
1744db781477SPatrick Sanan .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscArrayzero()`, `PetscMemzero()`, `PetscArraymove()`, `PetscMemmove()`, `PetscArraycmp()`, `PetscStrallocpy()`
1745580bdb30SBarry Smith M*/
1746f3fa974cSJacob Faibussowitsch #define PetscArraycpy(str1, str2, cnt) ((sizeof(*(str1)) != sizeof(*(str2))) || PetscMemcpy((str1), (str2), (size_t)(cnt) * sizeof(*(str1))))
1747580bdb30SBarry Smith 
17488f8f2f0dSBarry Smith /*MC
1749580bdb30SBarry Smith    PetscArrayzero - Zeros an array in memory.
1750580bdb30SBarry Smith 
1751580bdb30SBarry Smith    Synopsis:
1752580bdb30SBarry Smith     #include <petscsys.h>
1753580bdb30SBarry Smith     PetscErrorCode PetscArrayzero(anytype *str1,size_t cnt)
1754580bdb30SBarry Smith 
1755580bdb30SBarry Smith    Not Collective
1756580bdb30SBarry Smith 
1757580bdb30SBarry Smith    Input Parameters:
1758580bdb30SBarry Smith +  str1 - array
1759580bdb30SBarry Smith -  cnt  - Count of the array, not in bytes, but number of entries in the array
1760580bdb30SBarry Smith 
1761580bdb30SBarry Smith    Level: intermediate
1762580bdb30SBarry Smith 
1763580bdb30SBarry Smith    Note:
176487497f52SBarry Smith    This routine is a preferred replacement to `PetscMemzero()`
1765580bdb30SBarry Smith 
1766db781477SPatrick Sanan .seealso: `PetscMemcpy()`, `PetscMemcmp()`, `PetscMemzero()`, `PetscArraycmp()`, `PetscArraycpy()`, `PetscMemmove()`, `PetscStrallocpy()`, `PetscArraymove()`
1767580bdb30SBarry Smith M*/
1768f3fa974cSJacob Faibussowitsch #define PetscArrayzero(str1, cnt) PetscMemzero((str1), (size_t)(cnt) * sizeof(*(str1)))
1769580bdb30SBarry Smith 
1770447bcd8fSJacob Faibussowitsch #if defined(PETSC_CLANG_STATIC_ANALYZER)
1771447bcd8fSJacob Faibussowitsch   #define PetscPrefetchBlock(a, b, c, d)
1772447bcd8fSJacob Faibussowitsch #else
1773d382aafbSBarry Smith   /*MC
1774d382aafbSBarry Smith    PetscPrefetchBlock - Prefetches a block of memory
1775d382aafbSBarry Smith 
1776eca87e8dSBarry Smith    Synopsis:
1777aaa7dc30SBarry Smith     #include <petscsys.h>
1778eca87e8dSBarry Smith     void PetscPrefetchBlock(const anytype *a,size_t n,int rw,int t)
1779eca87e8dSBarry Smith 
1780d382aafbSBarry Smith    Not Collective
1781d382aafbSBarry Smith 
1782d382aafbSBarry Smith    Input Parameters:
1783d382aafbSBarry Smith +  a - pointer to first element to fetch (any type but usually PetscInt or PetscScalar)
1784d382aafbSBarry Smith .  n - number of elements to fetch
1785d382aafbSBarry Smith .  rw - 1 if the memory will be written to, otherwise 0 (ignored by many processors)
178650d8bf02SJed Brown -  t - temporal locality (PETSC_PREFETCH_HINT_{NTA,T0,T1,T2}), see note
1787d382aafbSBarry Smith 
1788d382aafbSBarry Smith    Level: developer
1789d382aafbSBarry Smith 
1790d382aafbSBarry Smith    Notes:
1791d382aafbSBarry Smith    The last two arguments (rw and t) must be compile-time constants.
1792d382aafbSBarry Smith 
179350d8bf02SJed Brown    Adopting Intel's x86/x86-64 conventions, there are four levels of temporal locality.  Not all architectures offer
179450d8bf02SJed Brown    equivalent locality hints, but the following macros are always defined to their closest analogue.
179587497f52SBarry Smith +  `PETSC_PREFETCH_HINT_NTA` - Non-temporal.  Prefetches directly to L1, evicts to memory (skips higher level cache unless it was already there when prefetched).
179687497f52SBarry Smith .  `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.
179787497f52SBarry Smith .  `PETSC_PREFETCH_HINT_T1` - Fetch to level 2 and higher (not L1).
179887497f52SBarry Smith -  `PETSC_PREFETCH_HINT_T2` - Fetch to high-level cache only.  (On many systems, T0 and T1 are equivalent.)
1799d382aafbSBarry Smith 
1800d382aafbSBarry Smith    This function does nothing on architectures that do not support prefetch and never errors (even if passed an invalid
1801d382aafbSBarry Smith    address).
1802d382aafbSBarry Smith 
1803d382aafbSBarry Smith M*/
18049371c9d4SSatish Balay   #define PetscPrefetchBlock(a, n, rw, t) \
18059371c9d4SSatish Balay     do { \
1806d382aafbSBarry Smith       const char *_p = (const char *)(a), *_end = (const char *)((a) + (n)); \
1807d382aafbSBarry Smith       for (; _p < _end; _p += PETSC_LEVEL1_DCACHE_LINESIZE) PETSC_Prefetch(_p, (rw), (t)); \
1808d382aafbSBarry Smith     } while (0)
1809447bcd8fSJacob Faibussowitsch #endif
1810d382aafbSBarry Smith /*
1811d382aafbSBarry Smith       Determine if some of the kernel computation routines use
1812d382aafbSBarry Smith    Fortran (rather than C) for the numerical calculations. On some machines
1813d382aafbSBarry Smith    and compilers (like complex numbers) the Fortran version of the routines
1814d382aafbSBarry Smith    is faster than the C/C++ versions. The flag --with-fortran-kernels
1815e2e64c6bSBarry Smith    should be used with ./configure to turn these on.
1816d382aafbSBarry Smith */
1817d382aafbSBarry Smith #if defined(PETSC_USE_FORTRAN_KERNELS)
1818d382aafbSBarry Smith 
1819d382aafbSBarry Smith   #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTCRL)
1820d382aafbSBarry Smith     #define PETSC_USE_FORTRAN_KERNEL_MULTCRL
1821d382aafbSBarry Smith   #endif
1822d382aafbSBarry Smith 
18235a11e1b2SBarry Smith   #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTAIJPERM)
18245a11e1b2SBarry Smith     #define PETSC_USE_FORTRAN_KERNEL_MULTAIJPERM
1825d382aafbSBarry Smith   #endif
1826d382aafbSBarry Smith 
1827d382aafbSBarry Smith   #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTAIJ)
1828d382aafbSBarry Smith     #define PETSC_USE_FORTRAN_KERNEL_MULTAIJ
1829d382aafbSBarry Smith   #endif
1830d382aafbSBarry Smith 
1831d382aafbSBarry Smith   #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ)
1832d382aafbSBarry Smith     #define PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ
1833d382aafbSBarry Smith   #endif
1834d382aafbSBarry Smith 
1835d382aafbSBarry Smith   #if !defined(PETSC_USE_FORTRAN_KERNEL_NORM)
1836d382aafbSBarry Smith     #define PETSC_USE_FORTRAN_KERNEL_NORM
1837d382aafbSBarry Smith   #endif
1838d382aafbSBarry Smith 
1839d382aafbSBarry Smith   #if !defined(PETSC_USE_FORTRAN_KERNEL_MAXPY)
1840d382aafbSBarry Smith     #define PETSC_USE_FORTRAN_KERNEL_MAXPY
1841d382aafbSBarry Smith   #endif
1842d382aafbSBarry Smith 
1843d382aafbSBarry Smith   #if !defined(PETSC_USE_FORTRAN_KERNEL_SOLVEAIJ)
1844d382aafbSBarry Smith     #define PETSC_USE_FORTRAN_KERNEL_SOLVEAIJ
1845d382aafbSBarry Smith   #endif
1846d382aafbSBarry Smith 
1847d382aafbSBarry Smith   #if !defined(PETSC_USE_FORTRAN_KERNEL_RELAXAIJ)
1848d382aafbSBarry Smith     #define PETSC_USE_FORTRAN_KERNEL_RELAXAIJ
1849d382aafbSBarry Smith   #endif
1850d382aafbSBarry Smith 
1851d382aafbSBarry Smith   #if !defined(PETSC_USE_FORTRAN_KERNEL_SOLVEBAIJ)
1852d382aafbSBarry Smith     #define PETSC_USE_FORTRAN_KERNEL_SOLVEBAIJ
1853d382aafbSBarry Smith   #endif
1854d382aafbSBarry Smith 
1855d382aafbSBarry Smith   #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ)
1856d382aafbSBarry Smith     #define PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ
1857d382aafbSBarry Smith   #endif
1858d382aafbSBarry Smith 
1859d382aafbSBarry Smith   #if !defined(PETSC_USE_FORTRAN_KERNEL_MDOT)
1860d382aafbSBarry Smith     #define PETSC_USE_FORTRAN_KERNEL_MDOT
1861d382aafbSBarry Smith   #endif
1862d382aafbSBarry Smith 
1863d382aafbSBarry Smith   #if !defined(PETSC_USE_FORTRAN_KERNEL_XTIMESY)
1864d382aafbSBarry Smith     #define PETSC_USE_FORTRAN_KERNEL_XTIMESY
1865d382aafbSBarry Smith   #endif
1866d382aafbSBarry Smith 
1867d382aafbSBarry Smith   #if !defined(PETSC_USE_FORTRAN_KERNEL_AYPX)
1868d382aafbSBarry Smith     #define PETSC_USE_FORTRAN_KERNEL_AYPX
1869d382aafbSBarry Smith   #endif
1870d382aafbSBarry Smith 
1871d382aafbSBarry Smith   #if !defined(PETSC_USE_FORTRAN_KERNEL_WAXPY)
1872d382aafbSBarry Smith     #define PETSC_USE_FORTRAN_KERNEL_WAXPY
1873d382aafbSBarry Smith   #endif
1874d382aafbSBarry Smith 
1875d382aafbSBarry Smith #endif
1876d382aafbSBarry Smith 
1877d382aafbSBarry Smith /*
1878d382aafbSBarry Smith     Macros for indicating code that should be compiled with a C interface,
1879d382aafbSBarry Smith    rather than a C++ interface. Any routines that are dynamically loaded
1880d382aafbSBarry Smith    (such as the PCCreate_XXX() routines) must be wrapped so that the name
1881d382aafbSBarry Smith    mangler does not change the functions symbol name. This just hides the
1882d382aafbSBarry Smith    ugly extern "C" {} wrappers.
1883d382aafbSBarry Smith */
1884d382aafbSBarry Smith #if defined(__cplusplus)
1885d382aafbSBarry Smith   #define EXTERN_C_BEGIN extern "C" {
1886d382aafbSBarry Smith   #define EXTERN_C_END   }
1887d382aafbSBarry Smith #else
1888d382aafbSBarry Smith   #define EXTERN_C_BEGIN
1889d382aafbSBarry Smith   #define EXTERN_C_END
1890d382aafbSBarry Smith #endif
1891d382aafbSBarry Smith 
1892d382aafbSBarry Smith /* --------------------------------------------------------------------*/
1893d382aafbSBarry Smith 
1894d382aafbSBarry Smith /*MC
1895d382aafbSBarry Smith     MPI_Comm - the basic object used by MPI to determine which processes are involved in a
1896d382aafbSBarry Smith         communication
1897d382aafbSBarry Smith 
1898d382aafbSBarry Smith    Level: beginner
1899d382aafbSBarry Smith 
1900d382aafbSBarry Smith    Note: This manual page is a place-holder because MPICH does not have a manual page for MPI_Comm
1901d382aafbSBarry Smith 
1902db781477SPatrick Sanan .seealso: `PETSC_COMM_WORLD`, `PETSC_COMM_SELF`
1903d382aafbSBarry Smith M*/
1904d382aafbSBarry Smith 
1905d382aafbSBarry Smith #if defined(PETSC_HAVE_MPIIO)
190693d501b3SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode MPIU_File_write_all(MPI_File, void *, PetscMPIInt, MPI_Datatype, MPI_Status *) PETSC_ATTRIBUTE_MPI_POINTER_WITH_TYPE(2, 4);
190793d501b3SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode MPIU_File_read_all(MPI_File, void *, PetscMPIInt, MPI_Datatype, MPI_Status *) PETSC_ATTRIBUTE_MPI_POINTER_WITH_TYPE(2, 4);
190893d501b3SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode MPIU_File_write_at(MPI_File, MPI_Offset, void *, PetscMPIInt, MPI_Datatype, MPI_Status *) PETSC_ATTRIBUTE_MPI_POINTER_WITH_TYPE(3, 5);
190993d501b3SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode MPIU_File_read_at(MPI_File, MPI_Offset, void *, PetscMPIInt, MPI_Datatype, MPI_Status *) PETSC_ATTRIBUTE_MPI_POINTER_WITH_TYPE(3, 5);
191093d501b3SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode MPIU_File_write_at_all(MPI_File, MPI_Offset, void *, PetscMPIInt, MPI_Datatype, MPI_Status *) PETSC_ATTRIBUTE_MPI_POINTER_WITH_TYPE(3, 5);
191193d501b3SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode MPIU_File_read_at_all(MPI_File, MPI_Offset, void *, PetscMPIInt, MPI_Datatype, MPI_Status *) PETSC_ATTRIBUTE_MPI_POINTER_WITH_TYPE(3, 5);
1912d382aafbSBarry Smith #endif
1913d382aafbSBarry Smith 
191461b0d812SBarry Smith /*@C
191587497f52SBarry Smith     PetscIntCast - casts a `PetscInt64` (which is 64 bits in size) to a `PetscInt` (which may be 32 bits in size), generates an
191687497f52SBarry Smith          error if the `PetscInt` is not large enough to hold the number.
1917c73702f5SBarry Smith 
1918c73702f5SBarry Smith    Not Collective
1919c73702f5SBarry Smith 
1920c73702f5SBarry Smith    Input Parameter:
192187497f52SBarry Smith .     a - the `PetscInt64` value
1922c73702f5SBarry Smith 
1923c73702f5SBarry Smith    Output Parameter:
192487497f52SBarry Smith .     b - the resulting `PetscInt` value
1925c73702f5SBarry Smith 
1926c73702f5SBarry Smith    Level: advanced
1927c73702f5SBarry Smith 
192887497f52SBarry Smith    Notes:
192987497f52SBarry Smith    If integers needed for the applications are too large to fit in 32 bit ints you can ./configure using --with-64-bit-indices to make `PetscInt` use 64 bit ints
1930c73702f5SBarry Smith 
1931c73702f5SBarry Smith    Not available from Fortran
1932c73702f5SBarry Smith 
1933db781477SPatrick Sanan .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscMPIIntCast()`, `PetscBLASIntCast()`, `PetscIntMultError()`, `PetscIntSumError()`
1934c73702f5SBarry Smith @*/
1935d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscIntCast(PetscInt64 a, PetscInt *b)
1936d71ae5a4SJacob Faibussowitsch {
1937c73702f5SBarry Smith   PetscFunctionBegin;
19383ca90d2dSJacob Faibussowitsch   *b = 0;
1939f3fa974cSJacob Faibussowitsch   // if using 64-bit indices already then this comparison is tautologically true
1940f3fa974cSJacob Faibussowitsch   PetscCheck(a < PETSC_MAX_INT, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "%" PetscInt64_FMT " is too big for PetscInt, you may need to ./configure using --with-64-bit-indices", a);
1941f3fa974cSJacob Faibussowitsch   *b = (PetscInt)a;
1942c73702f5SBarry Smith   PetscFunctionReturn(0);
1943c73702f5SBarry Smith }
1944c73702f5SBarry Smith 
1945c73702f5SBarry Smith /*@C
194687497f52SBarry Smith     PetscCountCast - casts a `PetscCount` to a `PetscInt` (which may be 32 bits in size), generates an
194787497f52SBarry Smith          error if the `PetscInt` is not large enough to hold the number.
1948981bb840SJunchao Zhang 
1949981bb840SJunchao Zhang    Not Collective
1950981bb840SJunchao Zhang 
1951981bb840SJunchao Zhang    Input Parameter:
195287497f52SBarry Smith .     a - the `PetscCount` value
1953981bb840SJunchao Zhang 
1954981bb840SJunchao Zhang    Output Parameter:
195587497f52SBarry Smith .     b - the resulting `PetscInt` value
1956981bb840SJunchao Zhang 
1957981bb840SJunchao Zhang    Level: advanced
1958981bb840SJunchao Zhang 
1959981bb840SJunchao Zhang    Notes:
1960981bb840SJunchao Zhang      If integers needed for the applications are too large to fit in 32 bit ints you can ./configure using --with-64-bit-indices to make PetscInt use 64 bit ints
1961981bb840SJunchao Zhang 
1962981bb840SJunchao Zhang    Not available from Fortran
1963981bb840SJunchao Zhang 
1964db781477SPatrick Sanan .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscMPIIntCast()`, `PetscBLASIntCast()`, `PetscIntMultError()`, `PetscIntSumError()`, `PetscIntCast()`
1965981bb840SJunchao Zhang @*/
1966d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscCountCast(PetscCount a, PetscInt *b)
1967d71ae5a4SJacob Faibussowitsch {
1968981bb840SJunchao Zhang   PetscFunctionBegin;
1969981bb840SJunchao Zhang   *b = 0;
1970f3fa974cSJacob Faibussowitsch   PetscCheck(sizeof(PetscCount) <= sizeof(PetscInt) || a <= PETSC_MAX_INT, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "%" PetscCount_FMT " is too big for PetscInt, you may need to ./configure using --with-64-bit-indices", a);
1971f3fa974cSJacob Faibussowitsch   *b = (PetscInt)a;
1972981bb840SJunchao Zhang   PetscFunctionReturn(0);
1973981bb840SJunchao Zhang }
1974981bb840SJunchao Zhang 
1975981bb840SJunchao Zhang /*@C
197687497f52SBarry Smith     PetscBLASIntCast - casts a `PetscInt` (which may be 64 bits in size) to a `PetscBLASInt` (which may be 32 bits in size), generates an
197787497f52SBarry Smith          error if the `PetscBLASInt` is not large enough to hold the number.
197861b0d812SBarry Smith 
197961b0d812SBarry Smith    Not Collective
198061b0d812SBarry Smith 
198161b0d812SBarry Smith    Input Parameter:
198287497f52SBarry Smith .     a - the `PetscInt` value
198361b0d812SBarry Smith 
198461b0d812SBarry Smith    Output Parameter:
198587497f52SBarry Smith .     b - the resulting `PetscBLASInt` value
198661b0d812SBarry Smith 
198761b0d812SBarry Smith    Level: advanced
198861b0d812SBarry Smith 
19890bc7d38cSBarry Smith    Notes:
19901fd49c25SBarry Smith    Not available from Fortran
199187497f52SBarry Smith 
1992f0b7f91aSBarry Smith    Errors if the integer is negative since PETSc calls to BLAS/LAPACK never need to cast negative integer inputs
19931fd49c25SBarry Smith 
1994db781477SPatrick Sanan .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscMPIIntCast()`, `PetscIntCast()`, `PetscCountCast()`
199561b0d812SBarry Smith @*/
1996d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscBLASIntCast(PetscInt a, PetscBLASInt *b)
1997d71ae5a4SJacob Faibussowitsch {
1998c5df96a5SBarry Smith   PetscFunctionBegin;
199954c59aa7SJacob Faibussowitsch   *b = 0;
200054c59aa7SJacob Faibussowitsch   if (PetscDefined(USE_64BIT_INDICES) && !PetscDefined(HAVE_64BIT_BLAS_INDICES)) {
200154c59aa7SJacob Faibussowitsch     PetscCheck(a <= PETSC_BLAS_INT_MAX, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "%" PetscInt_FMT " is too big for BLAS/LAPACK, which is restricted to 32 bit integers. Either you have an invalidly large integer error in your code or you must ./configure PETSc with --with-64-bit-blas-indices for the case you are running", a);
200254c59aa7SJacob Faibussowitsch   }
200354c59aa7SJacob Faibussowitsch   PetscCheck(a >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Passing negative integer to BLAS/LAPACK routine");
2004f3fa974cSJacob Faibussowitsch   *b = (PetscBLASInt)a;
2005c5df96a5SBarry Smith   PetscFunctionReturn(0);
2006c5df96a5SBarry Smith }
2007c5df96a5SBarry Smith 
200861b0d812SBarry Smith /*@C
200987497f52SBarry Smith     PetscCuBLASIntCast - like `PetscBLASIntCast()`, but for `PetscCuBLASInt`.
2010eee0c0a6SToby Isaac 
2011eee0c0a6SToby Isaac    Not Collective
2012eee0c0a6SToby Isaac 
2013eee0c0a6SToby Isaac    Input Parameter:
201487497f52SBarry Smith .     a - the `PetscInt` value
2015eee0c0a6SToby Isaac 
2016eee0c0a6SToby Isaac    Output Parameter:
201787497f52SBarry Smith .     b - the resulting `PetscCuBLASInt` value
2018eee0c0a6SToby Isaac 
2019eee0c0a6SToby Isaac    Level: advanced
2020eee0c0a6SToby Isaac 
2021eee0c0a6SToby Isaac    Notes:
2022eee0c0a6SToby Isaac       Errors if the integer is negative since PETSc calls to cuBLAS and friends never need to cast negative integer inputs
2023eee0c0a6SToby Isaac 
2024db781477SPatrick Sanan .seealso: `PetscCuBLASInt`, `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscBLASIntCast()`, `PetscMPIIntCast()`, `PetscIntCast()`
2025eee0c0a6SToby Isaac @*/
2026d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscCuBLASIntCast(PetscInt a, PetscCuBLASInt *b)
2027d71ae5a4SJacob Faibussowitsch {
2028eee0c0a6SToby Isaac   PetscFunctionBegin;
202954c59aa7SJacob Faibussowitsch   *b = 0;
2030f3fa974cSJacob Faibussowitsch   PetscCheck(a <= PETSC_CUBLAS_INT_MAX, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "%" PetscInt_FMT " is too big for cuBLAS, which is restricted to 32 bit integers.", a);
2031f3fa974cSJacob Faibussowitsch   PetscCheck(a >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Passing negative integer %" PetscInt_FMT "to cuBLAS routine", a);
2032f3fa974cSJacob Faibussowitsch   *b = (PetscCuBLASInt)a;
2033eee0c0a6SToby Isaac   PetscFunctionReturn(0);
2034eee0c0a6SToby Isaac }
2035eee0c0a6SToby Isaac 
2036eee0c0a6SToby Isaac /*@C
203747d993e7Ssuyashtn     PetscHipBLASIntCast - like `PetscBLASIntCast()`, but for `PetscHipBLASInt`.
203847d993e7Ssuyashtn 
203947d993e7Ssuyashtn    Not Collective
204047d993e7Ssuyashtn 
204147d993e7Ssuyashtn    Input Parameter:
204247d993e7Ssuyashtn .     a - the `PetscInt` value
204347d993e7Ssuyashtn 
204447d993e7Ssuyashtn    Output Parameter:
204547d993e7Ssuyashtn .     b - the resulting `PetscHipBLASInt` value
204647d993e7Ssuyashtn 
204747d993e7Ssuyashtn    Level: advanced
204847d993e7Ssuyashtn 
204947d993e7Ssuyashtn    Notes:
205047d993e7Ssuyashtn       Errors if the integer is negative since PETSc calls to hipBLAS and friends never need to cast negative integer inputs
205147d993e7Ssuyashtn 
205247d993e7Ssuyashtn .seealso: `PetscHipBLASInt`, `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscBLASIntCast()`, `PetscMPIIntCast()`, `PetscIntCast()`
205347d993e7Ssuyashtn @*/
205447d993e7Ssuyashtn static inline PetscErrorCode PetscHipBLASIntCast(PetscInt a, PetscHipBLASInt *b)
205547d993e7Ssuyashtn {
205647d993e7Ssuyashtn   PetscFunctionBegin;
205747d993e7Ssuyashtn   *b = 0;
2058f3fa974cSJacob Faibussowitsch   PetscCheck(a <= PETSC_HIPBLAS_INT_MAX, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "%" PetscInt_FMT " is too big for hipBLAS, which is restricted to 32 bit integers.", a);
2059f3fa974cSJacob Faibussowitsch   PetscCheck(a >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Passing negative integer %" PetscInt_FMT "to hipBLAS routine", a);
2060f3fa974cSJacob Faibussowitsch   *b = (PetscHipBLASInt)a;
206147d993e7Ssuyashtn   PetscFunctionReturn(0);
206247d993e7Ssuyashtn }
206347d993e7Ssuyashtn 
206447d993e7Ssuyashtn /*@C
206547d993e7Ssuyashtn     PetscMPIIntCast - casts a PetscInt (which may be 64 bits in size) to a PetscMPIInt (which may be 32 bits in size), generates an
206647d993e7Ssuyashtn          error if the PetscMPIInt is not large enough to hold the number.
206761b0d812SBarry Smith 
206861b0d812SBarry Smith    Not Collective
206961b0d812SBarry Smith 
207061b0d812SBarry Smith    Input Parameter:
207187497f52SBarry Smith .     a - the `PetscInt` value
207261b0d812SBarry Smith 
207361b0d812SBarry Smith    Output Parameter:
207487497f52SBarry Smith .     b - the resulting `PetscMPIInt` value
207561b0d812SBarry Smith 
207661b0d812SBarry Smith    Level: advanced
207761b0d812SBarry Smith 
20781fd49c25SBarry Smith    Not available from Fortran
20791fd49c25SBarry Smith 
2080db781477SPatrick Sanan .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscBLASIntCast()`, `PetscIntCast()`
208161b0d812SBarry Smith @*/
2082d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscMPIIntCast(PetscInt a, PetscMPIInt *b)
2083d71ae5a4SJacob Faibussowitsch {
20844dc2109aSBarry Smith   PetscFunctionBegin;
208554c59aa7SJacob Faibussowitsch   *b = 0;
2086f3fa974cSJacob Faibussowitsch   PetscCheck(a <= PETSC_MPI_INT_MAX, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "%" PetscInt_FMT " is too big for MPI buffer length. Maximum supported value is %d", a, PETSC_MPI_INT_MAX);
2087f3fa974cSJacob Faibussowitsch   *b = (PetscMPIInt)a;
20884dc2109aSBarry Smith   PetscFunctionReturn(0);
20894dc2109aSBarry Smith }
20904dc2109aSBarry Smith 
2091f3fa974cSJacob Faibussowitsch #define PetscInt64Mult(a, b) (((PetscInt64)(a)) * ((PetscInt64)(b)))
20922f18eb33SBarry Smith 
20932f18eb33SBarry Smith /*@C
2094f3fa974cSJacob Faibussowitsch   PetscRealIntMultTruncate - Computes the product of a positive `PetscReal` and a positive
2095f3fa974cSJacob Faibussowitsch   `PetscInt` and truncates the value to slightly less than the maximal possible value.
20962f18eb33SBarry Smith 
2097f3fa974cSJacob Faibussowitsch   Not Collective, Not available from Fortran
20982f18eb33SBarry Smith 
2099d8d19677SJose E. Roman   Input Parameters:
2100f3fa974cSJacob Faibussowitsch + a - The `PetscReal` value
2101f3fa974cSJacob Faibussowitsch - b - The `PetscInt` value
21022f18eb33SBarry Smith 
2103f3fa974cSJacob Faibussowitsch   Notes:
2104f3fa974cSJacob Faibussowitsch   Returns the result as a `PetscInt` value.
21052f18eb33SBarry Smith 
2106f3fa974cSJacob Faibussowitsch   Use `PetscInt64Mult()` to compute the product of two `PetscInt` as a `PetscInt64`.
2107f3fa974cSJacob Faibussowitsch   Use `PetscIntMultTruncate()` to compute the product of two positive `PetscInt` and truncate
2108f3fa974cSJacob Faibussowitsch   to fit a `PetscInt`.
2109f3fa974cSJacob Faibussowitsch   Use `PetscIntMultError()` to compute the product of two `PetscInt` if you wish to generate an
2110f3fa974cSJacob Faibussowitsch   error if the result will not fit in a `PetscInt`.
21112f18eb33SBarry Smith 
2112e28ce29aSPatrick Sanan   Developers Note:
2113f3fa974cSJacob Faibussowitsch   We currently assume that `PetscInt` addition can never overflow, this is obviously wrong but
2114f3fa974cSJacob Faibussowitsch   requires many more checks.
21152f18eb33SBarry Smith 
2116f3fa974cSJacob Faibussowitsch   This is used where we compute approximate sizes for workspace and need to insure the
2117f3fa974cSJacob Faibussowitsch   workspace is index-able.
21181fd49c25SBarry Smith 
21192f18eb33SBarry Smith   Level: advanced
21202f18eb33SBarry Smith 
2121f3fa974cSJacob Faibussowitsch .seealso: `PetscReal`, `PetscInt`, `PetscInt64Mult()`, `PetscIntMultError()`, `PetscIntSumError()`
21222f18eb33SBarry Smith @*/
2123d71ae5a4SJacob Faibussowitsch static inline PetscInt PetscRealIntMultTruncate(PetscReal a, PetscInt b)
2124d71ae5a4SJacob Faibussowitsch {
21255f80ce2aSJacob Faibussowitsch   PetscInt64 r = (PetscInt64)(a * (PetscReal)b);
21262f18eb33SBarry Smith   if (r > PETSC_MAX_INT - 100) r = PETSC_MAX_INT - 100;
21272f18eb33SBarry Smith   return (PetscInt)r;
21282f18eb33SBarry Smith }
21292f18eb33SBarry Smith 
21302f18eb33SBarry Smith /*@C
21312f18eb33SBarry Smith 
213287497f52SBarry Smith    PetscIntMultTruncate - Computes the product of two positive `PetscInt` and truncates the value to slightly less than the maximal possible value
21332f18eb33SBarry Smith 
21342f18eb33SBarry Smith    Not Collective
21352f18eb33SBarry Smith 
2136d8d19677SJose E. Roman    Input Parameters:
21372f18eb33SBarry Smith +     a - the PetscInt value
21382f18eb33SBarry Smith -     b - the second value
21392f18eb33SBarry Smith 
2140390e1bf2SBarry Smith    Returns:
214187497f52SBarry Smith       the result as a `PetscInt` value
21422f18eb33SBarry Smith 
214387497f52SBarry Smith    Use `PetscInt64Mult()` to compute the product of two `PetscInt` as a `PetscInt64`
214487497f52SBarry Smith    Use `PetscRealIntMultTruncate()` to compute the product of a `PetscReal` and a `PetscInt` and truncate to fit a `PetscInt`
214587497f52SBarry Smith    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`
21462f18eb33SBarry Smith 
21471fd49c25SBarry Smith    Not available from Fortran
21481fd49c25SBarry Smith 
214987497f52SBarry Smith    Developers Note:
215087497f52SBarry Smith    We currently assume that `PetscInt` addition can never overflow, this is obviously wrong but requires many more checks.
21512f18eb33SBarry Smith 
21522f18eb33SBarry Smith    This is used where we compute approximate sizes for workspace and need to insure the workspace is index-able.
21532f18eb33SBarry Smith 
21542f18eb33SBarry Smith    Level: advanced
21552f18eb33SBarry Smith 
2156db781477SPatrick Sanan .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscBLASIntCast()`, `PetscInt64Mult()`, `PetscIntMultError()`, `PetscIntSumError()`
21572f18eb33SBarry Smith @*/
2158d71ae5a4SJacob Faibussowitsch static inline PetscInt PetscIntMultTruncate(PetscInt a, PetscInt b)
2159d71ae5a4SJacob Faibussowitsch {
21605f80ce2aSJacob Faibussowitsch   PetscInt64 r = PetscInt64Mult(a, b);
21612f18eb33SBarry Smith   if (r > PETSC_MAX_INT - 100) r = PETSC_MAX_INT - 100;
21622f18eb33SBarry Smith   return (PetscInt)r;
21632f18eb33SBarry Smith }
21642f18eb33SBarry Smith 
2165f91af8c7SBarry Smith /*@C
2166f91af8c7SBarry Smith 
216787497f52SBarry Smith    PetscIntSumTruncate - Computes the sum of two positive `PetscInt` and truncates the value to slightly less than the maximal possible value
2168f91af8c7SBarry Smith 
2169f91af8c7SBarry Smith    Not Collective
2170f91af8c7SBarry Smith 
2171d8d19677SJose E. Roman    Input Parameters:
217287497f52SBarry Smith +     a - the `PetscInt` value
2173f91af8c7SBarry Smith -     b - the second value
2174f91af8c7SBarry Smith 
2175390e1bf2SBarry Smith    Returns:
217687497f52SBarry Smith      the result as a `PetscInt` value
2177f91af8c7SBarry Smith 
217887497f52SBarry Smith    Use `PetscInt64Mult()` to compute the product of two `PetscInt` as a `PetscInt64`
217987497f52SBarry Smith    Use `PetscRealIntMultTruncate()` to compute the product of a `PetscReal` and a `PetscInt` and truncate to fit a `PetscInt`
218087497f52SBarry Smith    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`
2181f91af8c7SBarry Smith 
2182f91af8c7SBarry Smith    This is used where we compute approximate sizes for workspace and need to insure the workspace is index-able.
2183f91af8c7SBarry Smith 
2184f5f57ec0SBarry Smith    Not available from Fortran
2185f5f57ec0SBarry Smith 
2186f91af8c7SBarry Smith    Level: advanced
2187f91af8c7SBarry Smith 
2188db781477SPatrick Sanan .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscBLASIntCast()`, `PetscInt64Mult()`, `PetscIntMultError()`
2189f91af8c7SBarry Smith @*/
2190d71ae5a4SJacob Faibussowitsch static inline PetscInt PetscIntSumTruncate(PetscInt a, PetscInt b)
2191d71ae5a4SJacob Faibussowitsch {
21925f80ce2aSJacob Faibussowitsch   PetscInt64 r = ((PetscInt64)a) + ((PetscInt64)b);
2193f91af8c7SBarry Smith   if (r > PETSC_MAX_INT - 100) r = PETSC_MAX_INT - 100;
2194f91af8c7SBarry Smith   return (PetscInt)r;
2195f91af8c7SBarry Smith }
2196f91af8c7SBarry Smith 
21972f18eb33SBarry Smith /*@C
21982f18eb33SBarry Smith 
219987497f52SBarry Smith    PetscIntMultError - Computes the product of two positive `PetscInt` and generates an error with overflow.
22002f18eb33SBarry Smith 
22012f18eb33SBarry Smith    Not Collective
22022f18eb33SBarry Smith 
2203d8d19677SJose E. Roman    Input Parameters:
220487497f52SBarry Smith +     a - the `PetscInt` value
22052f18eb33SBarry Smith -     b - the second value
22062f18eb33SBarry Smith 
2207d8d19677SJose E. Roman    Output Parameter:
220887497f52SBarry Smith .     result - the result as a `PetscInt` value, or NULL if you do not want the result, you just want to check if it overflows
22092f18eb33SBarry Smith 
221087497f52SBarry Smith    Use `PetscInt64Mult()` to compute the product of two `PetscInt` and store in a `PetscInt64`
221187497f52SBarry Smith    Use `PetscIntMultTruncate()` to compute the product of two `PetscInt` and truncate it to fit in a `PetscInt`
22122f18eb33SBarry Smith 
2213f5f57ec0SBarry Smith    Not available from Fortran
2214f5f57ec0SBarry Smith 
221587497f52SBarry Smith    Developers Note:
221687497f52SBarry Smith    We currently assume that `PetscInt` addition does not overflow, this is obviously wrong but requires many more checks.
22172f18eb33SBarry Smith 
22182f18eb33SBarry Smith    Level: advanced
22192f18eb33SBarry Smith 
2220db781477SPatrick Sanan .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscBLASIntCast()`, `PetscIntMult64()`, `PetscIntSumError()`
22212f18eb33SBarry Smith @*/
2222d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscIntMultError(PetscInt a, PetscInt b, PetscInt *result)
2223d71ae5a4SJacob Faibussowitsch {
2224f3fa974cSJacob Faibussowitsch   PetscInt64 r = PetscInt64Mult(a, b);
22252f18eb33SBarry Smith 
22262f18eb33SBarry Smith   PetscFunctionBegin;
2227f3fa974cSJacob Faibussowitsch   if (!PetscDefined(USE_64BIT_INDICES)) {
2228f3fa974cSJacob Faibussowitsch     PetscCheck(r <= PETSC_MAX_INT, PETSC_COMM_SELF, PETSC_ERR_SUP, "Product of two integers %" PetscInt_FMT " %" PetscInt_FMT " overflow, either you have an invalidly large integer error in your code or you must ./configure PETSc with --with-64-bit-indices for the case you are running", a, b);
2229f3fa974cSJacob Faibussowitsch   }
2230f91af8c7SBarry Smith   if (result) *result = (PetscInt)r;
2231f91af8c7SBarry Smith   PetscFunctionReturn(0);
2232f91af8c7SBarry Smith }
2233f91af8c7SBarry Smith 
2234f91af8c7SBarry Smith /*@C
2235f91af8c7SBarry Smith 
223687497f52SBarry Smith    PetscIntSumError - Computes the sum of two positive `PetscInt` and generates an error with overflow.
2237f91af8c7SBarry Smith 
2238f91af8c7SBarry Smith    Not Collective
2239f91af8c7SBarry Smith 
2240d8d19677SJose E. Roman    Input Parameters:
224187497f52SBarry Smith +     a - the `PetscInt` value
2242f91af8c7SBarry Smith -     b - the second value
2243f91af8c7SBarry Smith 
2244d8d19677SJose E. Roman    Output Parameter:
224587497f52SBarry Smith .     c - the result as a `PetscInt` value,  or NULL if you do not want the result, you just want to check if it overflows
2246f91af8c7SBarry Smith 
224787497f52SBarry Smith    Use `PetscInt64Mult()` to compute the product of two 32 bit PetscInt and store in a `PetscInt64`
224887497f52SBarry Smith    Use `PetscIntMultTruncate()` to compute the product of two `PetscInt` and truncate it to fit in a `PetscInt`
2249f91af8c7SBarry Smith 
2250f5f57ec0SBarry Smith    Not available from Fortran
2251f5f57ec0SBarry Smith 
2252f91af8c7SBarry Smith    Level: advanced
2253f91af8c7SBarry Smith 
2254db781477SPatrick Sanan .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscBLASIntCast()`, `PetscInt64Mult()`, `PetscIntMultError()`
2255f91af8c7SBarry Smith @*/
2256d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscIntSumError(PetscInt a, PetscInt b, PetscInt *result)
2257d71ae5a4SJacob Faibussowitsch {
2258f3fa974cSJacob Faibussowitsch   PetscInt64 r = ((PetscInt64)a) + ((PetscInt64)b);
2259f91af8c7SBarry Smith 
2260f91af8c7SBarry Smith   PetscFunctionBegin;
2261f3fa974cSJacob Faibussowitsch   if (!PetscDefined(USE_64BIT_INDICES)) {
2262f3fa974cSJacob Faibussowitsch     PetscCheck(r <= PETSC_MAX_INT, PETSC_COMM_SELF, PETSC_ERR_SUP, "Sum of two integers %" PetscInt_FMT " %" PetscInt_FMT " overflow, either you have an invalidly large integer error in your code or you must ./configure PETSc with --with-64-bit-indices for the case you are running", a, b);
2263f3fa974cSJacob Faibussowitsch   }
2264f91af8c7SBarry Smith   if (result) *result = (PetscInt)r;
22652f18eb33SBarry Smith   PetscFunctionReturn(0);
22662f18eb33SBarry Smith }
2267c5df96a5SBarry Smith 
2268d382aafbSBarry Smith /*
22692981ebdbSBarry Smith      The IBM include files define hz, here we hide it so that it may be used as a regular user variable.
2270d382aafbSBarry Smith */
2271d382aafbSBarry Smith #if defined(hz)
2272d382aafbSBarry Smith   #undef hz
2273d382aafbSBarry Smith #endif
2274d382aafbSBarry Smith 
227515a5570dSLisandro Dalcin #include <limits.h>
227615a5570dSLisandro Dalcin 
227715a5570dSLisandro Dalcin /* The number of bits in a byte */
227815a5570dSLisandro Dalcin 
227915a5570dSLisandro Dalcin #define PETSC_BITS_PER_BYTE CHAR_BIT
228015a5570dSLisandro Dalcin 
2281d382aafbSBarry Smith #if defined(PETSC_HAVE_SYS_TYPES_H)
2282d382aafbSBarry Smith   #include <sys/types.h>
2283d382aafbSBarry Smith #endif
2284d382aafbSBarry Smith 
2285d382aafbSBarry Smith /*MC
2286d382aafbSBarry Smith 
228766d79e26SBarry Smith     PETSC_VERSION - This manual page provides information about how PETSc documents and uses its version information. This information is available to both C/C++
228866d79e26SBarry Smith                     and Fortran compilers when petscsys.h is included.
228966d79e26SBarry Smith 
22906274ba02SSatish Balay     The current PETSc version and the API for accessing it are defined in <A HREF="PETSC_DOC_OUT_ROOT_PLACEHOLDER/include/petscversion.h.html">include/petscverson.html</A>
229166d79e26SBarry Smith 
229266d79e26SBarry Smith     The complete version number is given as the triple  PETSC_VERSION_MAJOR.PETSC_VERSION_MINOR.PETSC_VERSION_SUBMINOR (in short hand x.y.z)
229366d79e26SBarry Smith 
229466d79e26SBarry Smith     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
229566d79e26SBarry Smith     where only a change in the major version number (x) indicates a change in the API.
229666d79e26SBarry Smith 
229766d79e26SBarry Smith     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
229866d79e26SBarry Smith 
229966d79e26SBarry Smith     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),
230066d79e26SBarry Smith     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
230166d79e26SBarry Smith     version number (x.y.z).
230266d79e26SBarry Smith 
230387497f52SBarry Smith     `PETSC_RELEASE_DATE` is the date the x.y version was released (i.e. the version before any patch releases)
230466d79e26SBarry Smith 
230587497f52SBarry Smith     `PETSC_VERSION_DATE` is the date the x.y.z version was released
230666d79e26SBarry Smith 
230787497f52SBarry Smith     `PETSC_VERSION_GIT` is the last git commit to the repository given in the form vx.y.z-wwwww
230866d79e26SBarry Smith 
230987497f52SBarry Smith     `PETSC_VERSION_DATE_GIT` is the date of the last git commit to the repository
231066d79e26SBarry Smith 
231187497f52SBarry Smith     `PETSC_VERSION_()` is deprecated and will eventually be removed.
231266d79e26SBarry Smith 
2313cbc12506SBarry Smith     Level: intermediate
231466d79e26SBarry Smith 
231566d79e26SBarry Smith M*/
231666d79e26SBarry Smith 
2317014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetArchType(char[], size_t);
2318014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetHostName(char[], size_t);
2319014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetUserName(char[], size_t);
2320014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetProgramName(char[], size_t);
2321014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetProgramName(const char[]);
2322014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetDate(char[], size_t);
232327710113SBarry Smith PETSC_EXTERN PetscErrorCode PetscGetVersion(char[], size_t);
23245f309d01SBarry Smith PETSC_EXTERN PetscErrorCode PetscGetVersionNumber(PetscInt *, PetscInt *, PetscInt *, PetscInt *);
2325d382aafbSBarry Smith 
23266a7c706bSVaclav Hapla PETSC_EXTERN PetscErrorCode PetscSortedInt(PetscInt, const PetscInt[], PetscBool *);
232762e5d2d2SJDBetteridge PETSC_EXTERN PetscErrorCode PetscSortedInt64(PetscInt, const PetscInt64[], PetscBool *);
23286a7c706bSVaclav Hapla PETSC_EXTERN PetscErrorCode PetscSortedMPIInt(PetscInt, const PetscMPIInt[], PetscBool *);
23296a7c706bSVaclav Hapla PETSC_EXTERN PetscErrorCode PetscSortedReal(PetscInt, const PetscReal[], PetscBool *);
2330014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortInt(PetscInt, PetscInt[]);
233162e5d2d2SJDBetteridge PETSC_EXTERN PetscErrorCode PetscSortInt64(PetscInt, PetscInt64[]);
233262e5d2d2SJDBetteridge PETSC_EXTERN PetscErrorCode PetscSortCount(PetscInt, PetscCount[]);
2333ce605777SToby Isaac PETSC_EXTERN PetscErrorCode PetscSortReverseInt(PetscInt, PetscInt[]);
233422ab5688SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscSortedRemoveDupsInt(PetscInt *, PetscInt[]);
2335b6a18d21SVaclav Hapla PETSC_EXTERN PetscErrorCode PetscSortedCheckDupsInt(PetscInt, const PetscInt[], PetscBool *);
2336014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortRemoveDupsInt(PetscInt *, PetscInt[]);
2337f1cab4e1SJunchao Zhang PETSC_EXTERN PetscErrorCode PetscCheckDupsInt(PetscInt, const PetscInt[], PetscBool *);
233860e03357SMatthew G Knepley PETSC_EXTERN PetscErrorCode PetscFindInt(PetscInt, PetscInt, const PetscInt[], PetscInt *);
2339d2aeb606SJed Brown PETSC_EXTERN PetscErrorCode PetscFindMPIInt(PetscMPIInt, PetscInt, const PetscMPIInt[], PetscInt *);
2340014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortIntWithPermutation(PetscInt, const PetscInt[], PetscInt[]);
2341014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortStrWithPermutation(PetscInt, const char *[], PetscInt[]);
2342014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortIntWithArray(PetscInt, PetscInt[], PetscInt[]);
2343981bb840SJunchao Zhang PETSC_EXTERN PetscErrorCode PetscSortIntWithCountArray(PetscCount, PetscInt[], PetscCount[]);
23446c2863d0SBarry Smith PETSC_EXTERN PetscErrorCode PetscSortIntWithArrayPair(PetscInt, PetscInt[], PetscInt[], PetscInt[]);
2345981bb840SJunchao Zhang PETSC_EXTERN PetscErrorCode PetscSortIntWithIntCountArrayPair(PetscCount, PetscInt[], PetscInt[], PetscCount[]);
234617d7d925SStefano Zampini PETSC_EXTERN PetscErrorCode PetscSortMPIInt(PetscInt, PetscMPIInt[]);
234717d7d925SStefano Zampini PETSC_EXTERN PetscErrorCode PetscSortRemoveDupsMPIInt(PetscInt *, PetscMPIInt[]);
2348014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortMPIIntWithArray(PetscMPIInt, PetscMPIInt[], PetscMPIInt[]);
23495569a785SJunchao Zhang PETSC_EXTERN PetscErrorCode PetscSortMPIIntWithIntArray(PetscMPIInt, PetscMPIInt[], PetscInt[]);
2350014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortIntWithScalarArray(PetscInt, PetscInt[], PetscScalar[]);
235117df18f2SToby Isaac PETSC_EXTERN PetscErrorCode PetscSortIntWithDataArray(PetscInt, PetscInt[], void *, size_t, void *);
2352014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortReal(PetscInt, PetscReal[]);
235339f41f7fSStefano Zampini PETSC_EXTERN PetscErrorCode PetscSortRealWithArrayInt(PetscInt, PetscReal[], PetscInt[]);
2354014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortRealWithPermutation(PetscInt, const PetscReal[], PetscInt[]);
2355745b41b2SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscSortRemoveDupsReal(PetscInt *, PetscReal[]);
235639f41f7fSStefano Zampini PETSC_EXTERN PetscErrorCode PetscFindReal(PetscReal, PetscInt, const PetscReal[], PetscReal, PetscInt *);
2357014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortSplit(PetscInt, PetscInt, PetscScalar[], PetscInt[]);
2358014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortSplitReal(PetscInt, PetscInt, PetscReal[], PetscInt[]);
2359014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscProcessTree(PetscInt, const PetscBool[], const PetscInt[], PetscInt *, PetscInt **, PetscInt **, PetscInt **, PetscInt **);
23606c2863d0SBarry Smith PETSC_EXTERN PetscErrorCode PetscMergeIntArrayPair(PetscInt, const PetscInt[], const PetscInt[], PetscInt, const PetscInt[], const PetscInt[], PetscInt *, PetscInt **, PetscInt **);
23616c2863d0SBarry Smith PETSC_EXTERN PetscErrorCode PetscMergeIntArray(PetscInt, const PetscInt[], PetscInt, const PetscInt[], PetscInt *, PetscInt **);
2362e498c390SJed Brown PETSC_EXTERN PetscErrorCode PetscMergeMPIIntArray(PetscInt, const PetscMPIInt[], PetscInt, const PetscMPIInt[], PetscInt *, PetscMPIInt **);
2363ce605777SToby Isaac PETSC_EXTERN PetscErrorCode PetscParallelSortedInt(MPI_Comm, PetscInt, const PetscInt[], PetscBool *);
2364ce605777SToby Isaac 
23654d3610e3SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscTimSort(PetscInt, void *, size_t, int (*)(const void *, const void *, void *), void *);
2366676f2a66SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscIntSortSemiOrdered(PetscInt, PetscInt[]);
2367676f2a66SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscMPIIntSortSemiOrdered(PetscInt, PetscMPIInt[]);
2368676f2a66SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscRealSortSemiOrdered(PetscInt, PetscReal[]);
23694d3610e3SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscTimSortWithArray(PetscInt, void *, size_t, void *, size_t, int (*)(const void *, const void *, void *), void *);
2370676f2a66SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscIntSortSemiOrderedWithArray(PetscInt, PetscInt[], PetscInt[]);
2371676f2a66SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscMPIIntSortSemiOrderedWithArray(PetscInt, PetscMPIInt[], PetscMPIInt[]);
2372676f2a66SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscRealSortSemiOrderedWithArrayInt(PetscInt, PetscReal[], PetscInt[]);
2373676f2a66SJacob Faibussowitsch 
2374014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetDisplay(void);
2375014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetDisplay(char[], size_t);
2376d382aafbSBarry Smith 
237776bdecfbSBarry Smith /*J
2378d382aafbSBarry Smith     PetscRandomType - String with the name of a PETSc randomizer
2379d382aafbSBarry Smith 
2380d382aafbSBarry Smith    Level: beginner
2381d382aafbSBarry Smith 
2382e28ce29aSPatrick Sanan    Notes:
238387497f52SBarry Smith    To use `PETSCSPRNG` or `PETSCRANDOM123` you must have ./configure PETSc
238425ccb61fSToby Isaac    with the option --download-sprng or --download-random123
2385d382aafbSBarry Smith 
2386db781477SPatrick Sanan .seealso: `PetscRandomSetType()`, `PetscRandom`, `PetscRandomCreate()`
238776bdecfbSBarry Smith J*/
238819fd82e9SBarry Smith typedef const char *PetscRandomType;
2389d382aafbSBarry Smith #define PETSCRAND      "rand"
2390d382aafbSBarry Smith #define PETSCRAND48    "rand48"
2391d382aafbSBarry Smith #define PETSCSPRNG     "sprng"
2392c5e4d11fSDmitry Karpeev #define PETSCRANDER48  "rander48"
239325ccb61fSToby Isaac #define PETSCRANDOM123 "random123"
2394808ba619SStefano Zampini #define PETSCCURAND    "curand"
2395d382aafbSBarry Smith 
2396d382aafbSBarry Smith /* Logging support */
2397014dd563SJed Brown PETSC_EXTERN PetscClassId PETSC_RANDOM_CLASSID;
2398d382aafbSBarry Smith 
2399607a6623SBarry Smith PETSC_EXTERN PetscErrorCode PetscRandomInitializePackage(void);
2400d382aafbSBarry Smith 
2401d382aafbSBarry Smith /* Dynamic creation and loading functions */
2402140e18c1SBarry Smith PETSC_EXTERN PetscFunctionList PetscRandomList;
2403d382aafbSBarry Smith 
2404bdf89e91SBarry Smith PETSC_EXTERN PetscErrorCode PetscRandomRegister(const char[], PetscErrorCode (*)(PetscRandom));
240519fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode PetscRandomSetType(PetscRandom, PetscRandomType);
2406014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomSetFromOptions(PetscRandom);
240719fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode PetscRandomGetType(PetscRandom, PetscRandomType *);
2408fe2efc57SMark PETSC_EXTERN PetscErrorCode PetscRandomViewFromOptions(PetscRandom, PetscObject, const char[]);
2409014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomView(PetscRandom, PetscViewer);
2410d382aafbSBarry Smith 
2411014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate(MPI_Comm, PetscRandom *);
2412014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomGetValue(PetscRandom, PetscScalar *);
2413014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomGetValueReal(PetscRandom, PetscReal *);
2414808ba619SStefano Zampini PETSC_EXTERN PetscErrorCode PetscRandomGetValues(PetscRandom, PetscInt, PetscScalar *);
2415808ba619SStefano Zampini PETSC_EXTERN PetscErrorCode PetscRandomGetValuesReal(PetscRandom, PetscInt, PetscReal *);
2416014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomGetInterval(PetscRandom, PetscScalar *, PetscScalar *);
2417014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomSetInterval(PetscRandom, PetscScalar, PetscScalar);
2418014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomSetSeed(PetscRandom, unsigned long);
2419014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomGetSeed(PetscRandom, unsigned long *);
2420014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomSeed(PetscRandom);
2421014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomDestroy(PetscRandom *);
2422d382aafbSBarry Smith 
2423014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetFullPath(const char[], char[], size_t);
2424014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetRelativePath(const char[], char[], size_t);
2425014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetWorkingDirectory(char[], size_t);
2426014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetRealPath(const char[], char[]);
2427014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetHomeDirectory(char[], size_t);
2428014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscTestFile(const char[], char, PetscBool *);
2429014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscTestDirectory(const char[], char, PetscBool *);
243097540f07SSatish Balay PETSC_EXTERN PetscErrorCode PetscMkdir(const char[]);
24318a10d460SHong Zhang PETSC_EXTERN PetscErrorCode PetscMkdtemp(char[]);
243297540f07SSatish Balay PETSC_EXTERN PetscErrorCode PetscRMTree(const char[]);
2433d382aafbSBarry Smith 
2434d71ae5a4SJacob Faibussowitsch static inline PetscBool PetscBinaryBigEndian(void)
2435d71ae5a4SJacob Faibussowitsch {
24369371c9d4SSatish Balay   long _petsc_v = 1;
24379371c9d4SSatish Balay   return ((char *)&_petsc_v)[0] ? PETSC_FALSE : PETSC_TRUE;
24389371c9d4SSatish Balay }
243930815ce0SLisandro Dalcin 
24409860990eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscBinaryRead(int, void *, PetscInt, PetscInt *, PetscDataType);
24419860990eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscBinarySynchronizedRead(MPI_Comm, int, void *, PetscInt, PetscInt *, PetscDataType);
2442f253e43cSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscBinaryWrite(int, const void *, PetscInt, PetscDataType);
2443f253e43cSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscBinarySynchronizedWrite(MPI_Comm, int, const void *, PetscInt, PetscDataType);
2444014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscBinaryOpen(const char[], PetscFileMode, int *);
2445014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscBinaryClose(int);
2446014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSharedTmp(MPI_Comm, PetscBool *);
2447014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSharedWorkingDirectory(MPI_Comm, PetscBool *);
2448014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetTmp(MPI_Comm, char[], size_t);
2449014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFileRetrieve(MPI_Comm, const char[], char[], size_t, PetscBool *);
2450014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLs(MPI_Comm, const char[], char[], size_t, PetscBool *);
2451c891a504SStefano Zampini #if defined(PETSC_USE_SOCKET_VIEWER)
2452e2fc02c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscOpenSocket(const char[], int, int *);
2453c891a504SStefano Zampini #endif
2454d382aafbSBarry Smith 
2455014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscBinarySeek(int, off_t, PetscBinarySeekType, off_t *);
2456014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscBinarySynchronizedSeek(MPI_Comm, int, off_t, PetscBinarySeekType, off_t *);
2457014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscByteSwap(void *, PetscDataType, PetscInt);
2458d382aafbSBarry Smith 
2459014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetDebugTerminal(const char[]);
2460014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetDebugger(const char[], PetscBool);
2461014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetDefaultDebugger(void);
2462014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetDebuggerFromString(const char *);
2463014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscAttachDebugger(void);
2464014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStopForDebugger(void);
24652a2a2941SBarry Smith PETSC_EXTERN PetscErrorCode PetscWaitOnError(void);
2466d382aafbSBarry Smith 
2467014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGatherNumberOfMessages(MPI_Comm, const PetscMPIInt[], const PetscMPIInt[], PetscMPIInt *);
2468014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGatherMessageLengths(MPI_Comm, PetscMPIInt, PetscMPIInt, const PetscMPIInt[], PetscMPIInt **, PetscMPIInt **);
2469014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGatherMessageLengths2(MPI_Comm, PetscMPIInt, PetscMPIInt, const PetscMPIInt[], const PetscMPIInt[], PetscMPIInt **, PetscMPIInt **, PetscMPIInt **);
2470014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPostIrecvInt(MPI_Comm, PetscMPIInt, PetscMPIInt, const PetscMPIInt[], const PetscMPIInt[], PetscInt ***, MPI_Request **);
2471014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPostIrecvScalar(MPI_Comm, PetscMPIInt, PetscMPIInt, const PetscMPIInt[], const PetscMPIInt[], PetscScalar ***, MPI_Request **);
247293d501b3SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSided(MPI_Comm, PetscMPIInt, MPI_Datatype, PetscMPIInt, const PetscMPIInt *, const void *, PetscMPIInt *, PetscMPIInt **, void *) PETSC_ATTRIBUTE_MPI_POINTER_WITH_TYPE(6, 3);
247393d501b3SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedF(MPI_Comm, PetscMPIInt, MPI_Datatype, PetscMPIInt, const PetscMPIInt[], const void *, PetscMPIInt *, PetscMPIInt **, void *, PetscMPIInt, PetscErrorCode (*send)(MPI_Comm, const PetscMPIInt[], PetscMPIInt, PetscMPIInt, void *, MPI_Request[], void *), PetscErrorCode (*recv)(MPI_Comm, const PetscMPIInt[], PetscMPIInt, void *, MPI_Request[], void *), void *ctx) PETSC_ATTRIBUTE_MPI_POINTER_WITH_TYPE(6, 3);
247493d501b3SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedFReq(MPI_Comm, PetscMPIInt, MPI_Datatype, PetscMPIInt, const PetscMPIInt[], const void *, PetscMPIInt *, PetscMPIInt **, void *, PetscMPIInt, MPI_Request **, MPI_Request **, PetscErrorCode (*send)(MPI_Comm, const PetscMPIInt[], PetscMPIInt, PetscMPIInt, void *, MPI_Request[], void *), PetscErrorCode (*recv)(MPI_Comm, const PetscMPIInt[], PetscMPIInt, void *, MPI_Request[], void *), void *ctx) PETSC_ATTRIBUTE_MPI_POINTER_WITH_TYPE(6, 3);
2475d382aafbSBarry Smith 
24766145cd65SJed Brown PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedSetType(MPI_Comm, PetscBuildTwoSidedType);
24776145cd65SJed Brown PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedGetType(MPI_Comm, PetscBuildTwoSidedType *);
24786145cd65SJed Brown 
2479014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSSEIsEnabled(MPI_Comm, PetscBool *, PetscBool *);
2480d382aafbSBarry Smith 
2481ce94432eSBarry Smith PETSC_EXTERN MPI_Comm PetscObjectComm(PetscObject);
2482ce94432eSBarry Smith 
2483d382aafbSBarry Smith struct _n_PetscSubcomm {
2484d382aafbSBarry Smith   MPI_Comm         parent;    /* parent communicator */
2485d382aafbSBarry Smith   MPI_Comm         dupparent; /* duplicate parent communicator, under which the processors of this subcomm have contiguous rank */
2486306c2d5bSBarry Smith   MPI_Comm         child;     /* the sub-communicator */
248745487dadSJed Brown   PetscMPIInt      n;         /* num of subcommunicators under the parent communicator */
248845487dadSJed Brown   PetscMPIInt      color;     /* color of processors belong to this communicator */
2489708d824cSJed Brown   PetscMPIInt     *subsize;   /* size of subcommunicator[color] */
249045487dadSJed Brown   PetscSubcommType type;
2491e5acf8a4SHong Zhang   char            *subcommprefix;
2492d382aafbSBarry Smith };
2493d382aafbSBarry Smith 
2494d71ae5a4SJacob Faibussowitsch static inline MPI_Comm PetscSubcommParent(PetscSubcomm scomm)
2495d71ae5a4SJacob Faibussowitsch {
24969371c9d4SSatish Balay   return scomm->parent;
24979371c9d4SSatish Balay }
2498d71ae5a4SJacob Faibussowitsch static inline MPI_Comm PetscSubcommChild(PetscSubcomm scomm)
2499d71ae5a4SJacob Faibussowitsch {
25009371c9d4SSatish Balay   return scomm->child;
25019371c9d4SSatish Balay }
2502d71ae5a4SJacob Faibussowitsch static inline MPI_Comm PetscSubcommContiguousParent(PetscSubcomm scomm)
2503d71ae5a4SJacob Faibussowitsch {
25049371c9d4SSatish Balay   return scomm->dupparent;
25059371c9d4SSatish Balay }
2506014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSubcommCreate(MPI_Comm, PetscSubcomm *);
2507014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSubcommDestroy(PetscSubcomm *);
2508014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSubcommSetNumber(PetscSubcomm, PetscInt);
2509014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSubcommSetType(PetscSubcomm, PetscSubcommType);
251065d9b8f1SHong Zhang PETSC_EXTERN PetscErrorCode PetscSubcommSetTypeGeneral(PetscSubcomm, PetscMPIInt, PetscMPIInt);
2511053d1c95SHong Zhang PETSC_EXTERN PetscErrorCode PetscSubcommView(PetscSubcomm, PetscViewer);
2512f68be91cSHong Zhang PETSC_EXTERN PetscErrorCode PetscSubcommSetFromOptions(PetscSubcomm);
2513e5acf8a4SHong Zhang PETSC_EXTERN PetscErrorCode PetscSubcommSetOptionsPrefix(PetscSubcomm, const char[]);
2514a530d236SBarry Smith PETSC_EXTERN PetscErrorCode PetscSubcommGetParent(PetscSubcomm, MPI_Comm *);
2515a530d236SBarry Smith PETSC_EXTERN PetscErrorCode PetscSubcommGetContiguousParent(PetscSubcomm, MPI_Comm *);
2516a530d236SBarry Smith PETSC_EXTERN PetscErrorCode PetscSubcommGetChild(PetscSubcomm, MPI_Comm *);
2517d382aafbSBarry Smith 
25189962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapCreate(PetscInt, PetscHeap *);
25199962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapAdd(PetscHeap, PetscInt, PetscInt);
25209962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapPop(PetscHeap, PetscInt *, PetscInt *);
25219962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapPeek(PetscHeap, PetscInt *, PetscInt *);
25229962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapStash(PetscHeap, PetscInt, PetscInt);
25239962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapUnstash(PetscHeap);
25249962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapDestroy(PetscHeap *);
25259962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapView(PetscHeap, PetscViewer);
25269962606eSBarry Smith 
25275e71baefSBarry Smith PETSC_EXTERN PetscErrorCode PetscProcessPlacementView(PetscViewer);
25285f7487a0SJunchao Zhang PETSC_EXTERN PetscErrorCode PetscShmCommGet(MPI_Comm, PetscShmComm *);
25295f7487a0SJunchao Zhang PETSC_EXTERN PetscErrorCode PetscShmCommGlobalToLocal(PetscShmComm, PetscMPIInt, PetscMPIInt *);
25305f7487a0SJunchao Zhang PETSC_EXTERN PetscErrorCode PetscShmCommLocalToGlobal(PetscShmComm, PetscMPIInt, PetscMPIInt *);
25315f7487a0SJunchao Zhang PETSC_EXTERN PetscErrorCode PetscShmCommGetMpiShmComm(PetscShmComm, MPI_Comm *);
25325e71baefSBarry Smith 
2533a32e93adSJunchao Zhang /* routines to better support OpenMP multithreading needs of some PETSc third party libraries */
2534a32e93adSJunchao Zhang PETSC_EXTERN PetscErrorCode PetscOmpCtrlCreate(MPI_Comm, PetscInt, PetscOmpCtrl *);
2535a32e93adSJunchao Zhang PETSC_EXTERN PetscErrorCode PetscOmpCtrlGetOmpComms(PetscOmpCtrl, MPI_Comm *, MPI_Comm *, PetscBool *);
2536a32e93adSJunchao Zhang PETSC_EXTERN PetscErrorCode PetscOmpCtrlDestroy(PetscOmpCtrl *);
2537a32e93adSJunchao Zhang PETSC_EXTERN PetscErrorCode PetscOmpCtrlBarrier(PetscOmpCtrl);
2538a32e93adSJunchao Zhang PETSC_EXTERN PetscErrorCode PetscOmpCtrlOmpRegionOnMasterBegin(PetscOmpCtrl);
2539a32e93adSJunchao Zhang PETSC_EXTERN PetscErrorCode PetscOmpCtrlOmpRegionOnMasterEnd(PetscOmpCtrl);
2540a32e93adSJunchao Zhang 
254113e3f751SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferCreate(size_t, size_t, PetscSegBuffer *);
25420f453b92SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferDestroy(PetscSegBuffer *);
254313e3f751SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferGet(PetscSegBuffer, size_t, void *);
2544137cf7b6SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferExtractAlloc(PetscSegBuffer, void *);
2545137cf7b6SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferExtractTo(PetscSegBuffer, void *);
2546137cf7b6SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferExtractInPlace(PetscSegBuffer, void *);
254713e3f751SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferGetSize(PetscSegBuffer, size_t *);
254813e3f751SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferUnuse(PetscSegBuffer, size_t);
25490f453b92SJed Brown 
2550471ecdacSJed Brown /* Type-safe wrapper to encourage use of PETSC_RESTRICT. Does not use PetscFunctionBegin because the error handling
2551471ecdacSJed Brown  * prevents the compiler from completely erasing the stub. This is called in inner loops so it has to be as fast as
2552471ecdacSJed Brown  * possible. */
2553d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscSegBufferGetInts(PetscSegBuffer seg, size_t count, PetscInt *PETSC_RESTRICT *slot)
2554d71ae5a4SJacob Faibussowitsch {
25559371c9d4SSatish Balay   return PetscSegBufferGet(seg, count, (void **)slot);
25569371c9d4SSatish Balay }
2557d382aafbSBarry Smith 
25589de0f6ecSBarry Smith extern PetscOptionsHelpPrinted PetscOptionsHelpPrintedSingleton;
25599de0f6ecSBarry Smith PETSC_EXTERN PetscErrorCode    PetscOptionsHelpPrintedDestroy(PetscOptionsHelpPrinted *);
25609de0f6ecSBarry Smith PETSC_EXTERN PetscErrorCode    PetscOptionsHelpPrintedCreate(PetscOptionsHelpPrinted *);
25619de0f6ecSBarry Smith PETSC_EXTERN PetscErrorCode    PetscOptionsHelpPrintedCheck(PetscOptionsHelpPrinted, const char *, const char *, PetscBool *);
25629de0f6ecSBarry Smith 
2563ace2fbaeSBarry Smith #include <stdarg.h>
2564ace2fbaeSBarry Smith PETSC_EXTERN PetscErrorCode PetscVSNPrintf(char *, size_t, const char[], size_t *, va_list);
2565ace2fbaeSBarry Smith PETSC_EXTERN                PetscErrorCode (*PetscVFPrintf)(FILE *, const char[], va_list);
2566ace2fbaeSBarry Smith 
2567268b0dfdSSatish Balay PETSC_EXTERN PetscSegBuffer PetscCitationsList;
2568fbfcfee5SBarry Smith 
25691f817a21SBarry Smith /*@C
25701f817a21SBarry Smith       PetscCitationsRegister - Register a bibtex item to obtain credit for an implemented algorithm used in the code.
25711f817a21SBarry Smith 
257287497f52SBarry Smith      Not Collective - only what is registered on rank 0 of `PETSC_COMM_WORLD` will be printed
25731f817a21SBarry Smith 
25741f817a21SBarry Smith      Input Parameters:
257535cb6cd3SPierre Jolivet +      cite - the bibtex item, formatted to displayed on multiple lines nicely
257687497f52SBarry Smith -      set - a boolean variable initially set to `PETSC_FALSE`; this is used to insure only a single registration of the citation
25771f817a21SBarry Smith 
25783c7db156SBarry Smith      Options Database: Key
25793c7db156SBarry Smith .     -citations [filename]   - print out the bibtex entries for the given computation
25803c7db156SBarry Smith 
2581850545d0SSatish Balay      Level: intermediate
2582850545d0SSatish Balay 
25833c7db156SBarry Smith      Fortran Note:
2584f5f57ec0SBarry Smith      Not available from Fortran
2585f5f57ec0SBarry Smith 
25861f817a21SBarry Smith @*/
2587d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscCitationsRegister(const char cit[], PetscBool *set)
2588d71ae5a4SJacob Faibussowitsch {
2589dff31646SBarry Smith   size_t len;
2590dff31646SBarry Smith   char  *vstring;
2591dff31646SBarry Smith 
25921f817a21SBarry Smith   PetscFunctionBegin;
25938d3683fcSBarry Smith   if (set && *set) PetscFunctionReturn(0);
25949566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(cit, &len));
25959566063dSJacob Faibussowitsch   PetscCall(PetscSegBufferGet(PetscCitationsList, len, &vstring));
25969566063dSJacob Faibussowitsch   PetscCall(PetscArraycpy(vstring, cit, len));
2597dff31646SBarry Smith   if (set) *set = PETSC_TRUE;
25981f817a21SBarry Smith   PetscFunctionReturn(0);
2599dff31646SBarry Smith }
2600dff31646SBarry Smith 
2601d8174014SToby Isaac PETSC_EXTERN                PETSC_DEPRECATED_FUNCTION("Google has discontinued its URL shortener service") PetscErrorCode PetscURLShorten(const char[], char[], size_t c);
2602fe278a28SBarry Smith PETSC_EXTERN PetscErrorCode PetscGoogleDriveAuthorize(MPI_Comm, char[], char[], size_t);
2603fe278a28SBarry Smith PETSC_EXTERN PetscErrorCode PetscGoogleDriveRefresh(MPI_Comm, const char[], char[], size_t);
2604f044a08eSBarry Smith PETSC_EXTERN PetscErrorCode PetscGoogleDriveUpload(MPI_Comm, const char[], const char[]);
2605fe278a28SBarry Smith 
2606f044a08eSBarry Smith PETSC_EXTERN PetscErrorCode PetscBoxAuthorize(MPI_Comm, char[], char[], size_t);
2607f044a08eSBarry Smith PETSC_EXTERN PetscErrorCode PetscBoxRefresh(MPI_Comm, const char[], char[], char[], size_t);
2608b967cddfSBarry Smith 
26099f4d3c52SBarry Smith PETSC_EXTERN PetscErrorCode PetscGlobusGetTransfers(MPI_Comm, const char[], char[], size_t);
26109f4d3c52SBarry Smith 
261104102261SBarry Smith PETSC_EXTERN PetscErrorCode PetscTextBelt(MPI_Comm, const char[], const char[], PetscBool *);
2612763ec7b1SBarry Smith PETSC_EXTERN PetscErrorCode PetscTellMyCell(MPI_Comm, const char[], const char[], PetscBool *);
2613dff31646SBarry Smith 
261468e69593SBarry Smith PETSC_EXTERN PetscErrorCode PetscPullJSONValue(const char[], const char[], char[], size_t, PetscBool *);
26155dc0f0a4SBarry Smith PETSC_EXTERN PetscErrorCode PetscPushJSONValue(char[], const char[], const char[], size_t);
2616d382aafbSBarry Smith 
2617b2566f29SBarry Smith #if defined(PETSC_USE_DEBUG)
2618d71ae5a4SJacob Faibussowitsch static inline unsigned int PetscStrHash(const char *str)
2619d71ae5a4SJacob Faibussowitsch {
2620df05ca09SBarry Smith   unsigned int c, hash = 5381;
2621df05ca09SBarry Smith 
2622503e1a2cSLisandro Dalcin   while ((c = (unsigned int)*str++)) hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
2623df05ca09SBarry Smith   return hash;
2624df05ca09SBarry Smith }
262577a5e07dSBarry Smith 
262677a5e07dSBarry Smith   /*MC
262787497f52SBarry Smith    MPIU_Allreduce - a PETSc replacement for `MPI_Allreduce()` that tries to determine if the call from all the MPI ranks occur from the
262887497f52SBarry Smith                     same place in the PETSc code. This helps to detect bugs where different MPI ranks follow different code paths
262987497f52SBarry Smith                     resulting in inconsistent and incorrect calls to `MPI_Allreduce()`.
263077a5e07dSBarry Smith 
2631d083f849SBarry Smith    Collective
263277a5e07dSBarry Smith 
263377a5e07dSBarry Smith    Synopsis:
263477a5e07dSBarry Smith      #include <petscsys.h>
263577a5e07dSBarry Smith      PetscErrorCode MPIU_Allreduce(void *indata,void *outdata,PetscMPIInt count,MPI_Datatype datatype, MPI_Op op, MPI_Comm comm);
263677a5e07dSBarry Smith 
263777a5e07dSBarry Smith    Input Parameters:
2638df05ca09SBarry Smith +  a - pointer to the input data to be reduced
2639df05ca09SBarry Smith .  c - the number of MPI data items in a and b
264087497f52SBarry Smith .  d - the MPI datatype, for example `MPI_INT`
264187497f52SBarry Smith .  e - the MPI operation, for example `MPI_SUM`
2642df05ca09SBarry Smith -  fcomm - the MPI communicator on which the operation occurs
264377a5e07dSBarry Smith 
264477a5e07dSBarry Smith    Output Parameter:
2645df05ca09SBarry Smith .  b - the reduced values
264677a5e07dSBarry Smith 
2647e28ce29aSPatrick Sanan    Notes:
264887497f52SBarry Smith      In optimized mode this directly calls `MPI_Allreduce()`
264977a5e07dSBarry Smith 
2650df05ca09SBarry Smith      This is defined as a macro that can return error codes internally so it cannot be used in a subroutine that returns void.
2651df05ca09SBarry Smith 
265287497f52SBarry Smith      The error code this returns should be checked with `PetscCall()` even though it looks like an MPI function because it always returns PETSc error codes
2653df05ca09SBarry Smith 
265477a5e07dSBarry Smith    Level: developer
265577a5e07dSBarry Smith 
2656db781477SPatrick Sanan .seealso: `MPI_Allreduce()`
265777a5e07dSBarry Smith M*/
26589371c9d4SSatish Balay   #define MPIU_Allreduce(a, b, c, d, e, fcomm) \
26599371c9d4SSatish Balay     PetscMacroReturnStandard(PetscMPIInt a_b1[6], a_b2[6]; int _mpiu_allreduce_c_int = (int)c; a_b1[0] = -(PetscMPIInt)__LINE__; a_b1[1] = -a_b1[0]; a_b1[2] = -(PetscMPIInt)PetscStrHash(PETSC_FUNCTION_NAME); a_b1[3] = -a_b1[2]; a_b1[4] = -(PetscMPIInt)(c); a_b1[5] = -a_b1[4]; PetscCallMPI(MPI_Allreduce(a_b1, a_b2, 6, MPI_INT, MPI_MAX, fcomm)); PetscCheck(-a_b2[0] == a_b2[1], PETSC_COMM_SELF, PETSC_ERR_PLIB, "MPI_Allreduce() called in different locations (code lines) on different processors"); PetscCheck(-a_b2[2] == a_b2[3], PETSC_COMM_SELF, PETSC_ERR_PLIB, "MPI_Allreduce() called in different locations (functions) on different processors"); PetscCheck(-a_b2[4] == a_b2[5], PETSC_COMM_SELF, PETSC_ERR_PLIB, "MPI_Allreduce() called with different counts %d on different processors", _mpiu_allreduce_c_int); PetscCallMPI(MPI_Allreduce((a), (b), (c), d, e, (fcomm)));)
2660b2566f29SBarry Smith #else
2661f3fa974cSJacob Faibussowitsch   #define MPIU_Allreduce(a, b, c, d, e, fcomm) PetscMacroReturnStandard(PetscCallMPI(MPI_Allreduce((a), (b), (c), (d), (e), (fcomm))))
2662b2566f29SBarry Smith #endif
2663b2566f29SBarry Smith 
2664b674149eSJunchao Zhang #if defined(PETSC_HAVE_MPI_PROCESS_SHARED_MEMORY)
26658198064fSBarry Smith PETSC_EXTERN PetscErrorCode MPIU_Win_allocate_shared(MPI_Aint, PetscMPIInt, MPI_Info, MPI_Comm, void *, MPI_Win *);
26668198064fSBarry Smith PETSC_EXTERN PetscErrorCode MPIU_Win_shared_query(MPI_Win, PetscMPIInt, MPI_Aint *, PetscMPIInt *, void *);
26672f065d89SBarry Smith #endif
26688198064fSBarry Smith 
2669cd88fca5SStefano Zampini /* this is a vile hack */
2670cd88fca5SStefano Zampini #if defined(PETSC_HAVE_NECMPI)
26719371c9d4SSatish Balay   #if !defined(PETSC_NECMPI_VERSION_MAJOR) || !defined(PETSC_NECMPI_VERSION_MINOR) || PETSC_NECMPI_VERSION_MAJOR < 2 || (PETSC_NECMPI_VERSION_MAJOR == 2 && PETSC_NECMPI_VERSION_MINOR < 18)
2672cd88fca5SStefano Zampini     #define MPI_Type_free(a) (*(a) = MPI_DATATYPE_NULL, 0);
2673cd88fca5SStefano Zampini   #endif
2674961fb248SStefano Zampini #endif
2675cd88fca5SStefano Zampini 
267612801b39SBarry Smith /*
267760fbe2beSVaclav Hapla     List of external packages and queries on it
267860fbe2beSVaclav Hapla */
267960fbe2beSVaclav Hapla PETSC_EXTERN PetscErrorCode PetscHasExternalPackage(const char[], PetscBool *);
268060fbe2beSVaclav Hapla 
2681a52b435bSMark Adams /*
2682a52b435bSMark Adams  OpenMP support
2683a52b435bSMark Adams */
2684a52b435bSMark Adams #if defined(_OPENMP)
2685a52b435bSMark Adams   #define PetscPragmaOMP(...) _Pragma(PetscStringize(omp __VA_ARGS__))
2686a52b435bSMark Adams #else // no OpenMP so no threads
2687a52b435bSMark Adams   #define PetscPragmaOMP(...)
2688a52b435bSMark Adams #endif
2689a52b435bSMark Adams 
2690f1f2ae84SBarry Smith /* this cannot go here because it may be in a different shared library */
2691f1f2ae84SBarry Smith PETSC_EXTERN PetscErrorCode PCMPIServerBegin(void);
2692f1f2ae84SBarry Smith PETSC_EXTERN PetscErrorCode PCMPIServerEnd(void);
2693f1f2ae84SBarry Smith PETSC_EXTERN PetscErrorCode PCMPICommsDestroy(void);
2694d382aafbSBarry Smith #endif
2695