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