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. 4d382aafbSBarry Smith */ 526bd1501SBarry Smith #if !defined(PETSCSYS_H) 626bd1501SBarry Smith #define PETSCSYS_H 7d382aafbSBarry Smith /* ========================================================================== */ 8d382aafbSBarry Smith /* 9d382aafbSBarry Smith petscconf.h is contained in ${PETSC_ARCH}/include/petscconf.h it is 101c77a0c5SBarry Smith found automatically by the compiler due to the -I${PETSC_DIR}/${PETSC_ARCH}/include that 111c77a0c5SBarry Smith PETSc's makefiles add to the compiler rules. 121c77a0c5SBarry Smith For --prefix installs the directory ${PETSC_ARCH} does not exist and petscconf.h is in the same 131cc8b206SBarry Smith directory as the other PETSc include files. 14d382aafbSBarry Smith */ 152c8e378dSBarry Smith #include <petscconf.h> 161c77a0c5SBarry Smith #include <petscconf_poison.h> 172c8e378dSBarry Smith #include <petscfix.h> 18d382aafbSBarry Smith 1973fca5a0SBarry Smith #if defined(PETSC_DESIRE_FEATURE_TEST_MACROS) 2073fca5a0SBarry Smith /* 2173fca5a0SBarry Smith Feature test macros must be included before headers defined by IEEE Std 1003.1-2001 2273fca5a0SBarry Smith We only turn these in PETSc source files that require them by setting PETSC_DESIRE_FEATURE_TEST_MACROS 2373fca5a0SBarry Smith */ 24216f1ae6SBarry Smith # if defined(PETSC__POSIX_C_SOURCE_200112L) && !defined(_POSIX_C_SOURCE) 2573fca5a0SBarry Smith # define _POSIX_C_SOURCE 200112L 2673fca5a0SBarry Smith # endif 27216f1ae6SBarry Smith # if defined(PETSC__BSD_SOURCE) && !defined(_BSD_SOURCE) 2873fca5a0SBarry Smith # define _BSD_SOURCE 2973fca5a0SBarry Smith # endif 3007f00807SSatish Balay # if defined(PETSC__DEFAULT_SOURCE) && !defined(_DEFAULT_SOURCE) 3107f00807SSatish Balay # define _DEFAULT_SOURCE 3207f00807SSatish Balay # endif 33ea0fecefSShri Abhyankar # if defined(PETSC__GNU_SOURCE) && !defined(_GNU_SOURCE) 34ea0fecefSShri Abhyankar # define _GNU_SOURCE 35ea0fecefSShri Abhyankar # endif 3673fca5a0SBarry Smith #endif 3773fca5a0SBarry Smith 38df4397b0SStefano Zampini #include <petscsystypes.h> 39df4397b0SStefano Zampini 40d382aafbSBarry Smith /* ========================================================================== */ 41d382aafbSBarry Smith /* 422c280183SJed Brown This facilitates using the C version of PETSc from C++ and the C++ version from C. 43d382aafbSBarry Smith */ 441ec50b02SJed Brown #if defined(__cplusplus) 451ec50b02SJed Brown # define PETSC_FUNCTION_NAME PETSC_FUNCTION_NAME_CXX 461ec50b02SJed Brown #else 471ec50b02SJed Brown # define PETSC_FUNCTION_NAME PETSC_FUNCTION_NAME_C 481ec50b02SJed Brown #endif 49d382aafbSBarry Smith 50c5e4d11fSDmitry Karpeev /* ========================================================================== */ 51c5e4d11fSDmitry Karpeev /* 52c5e4d11fSDmitry Karpeev Since PETSc manages its own extern "C" handling users should never include PETSc include 531cc8b206SBarry Smith files within extern "C". This will generate a compiler error if a user does put the include 541cc8b206SBarry Smith file within an extern "C". 55c5e4d11fSDmitry Karpeev */ 56c5e4d11fSDmitry Karpeev #if defined(__cplusplus) 57c5e4d11fSDmitry Karpeev void assert_never_put_petsc_headers_inside_an_extern_c(int); void assert_never_put_petsc_headers_inside_an_extern_c(double); 58c5e4d11fSDmitry Karpeev #endif 59c5e4d11fSDmitry Karpeev 60ed938b00SJed Brown #if defined(__cplusplus) 61ed938b00SJed Brown # define PETSC_RESTRICT PETSC_CXX_RESTRICT 62ed938b00SJed Brown #else 63ed938b00SJed Brown # define PETSC_RESTRICT PETSC_C_RESTRICT 64ed938b00SJed Brown #endif 65ed938b00SJed Brown 66ed938b00SJed Brown #if defined(__cplusplus) 6758c433abSLisandro Dalcin # define PETSC_INLINE PETSC_CXX_INLINE 68ed938b00SJed Brown #else 6958c433abSLisandro Dalcin # define PETSC_INLINE PETSC_C_INLINE 70ed938b00SJed Brown #endif 71ed938b00SJed Brown 7258c433abSLisandro Dalcin #define PETSC_STATIC_INLINE static PETSC_INLINE 7358c433abSLisandro Dalcin 74ab699e31SSatish Balay #if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES) /* For Win32 shared libraries */ 75014dd563SJed Brown # define PETSC_DLLEXPORT __declspec(dllexport) 76014dd563SJed Brown # define PETSC_DLLIMPORT __declspec(dllimport) 7721f66b81SJed Brown # define PETSC_VISIBILITY_INTERNAL 7826703958SBarry Smith #elif defined(PETSC_USE_VISIBILITY_CXX) && defined(__cplusplus) 7926703958SBarry Smith # define PETSC_DLLEXPORT __attribute__((visibility ("default"))) 8026703958SBarry Smith # define PETSC_DLLIMPORT __attribute__((visibility ("default"))) 8126703958SBarry Smith # define PETSC_VISIBILITY_INTERNAL __attribute__((visibility ("hidden"))) 8226703958SBarry Smith #elif defined(PETSC_USE_VISIBILITY_C) && !defined(__cplusplus) 83014dd563SJed Brown # define PETSC_DLLEXPORT __attribute__((visibility ("default"))) 84014dd563SJed Brown # define PETSC_DLLIMPORT __attribute__((visibility ("default"))) 8521f66b81SJed Brown # define PETSC_VISIBILITY_INTERNAL __attribute__((visibility ("hidden"))) 86d382aafbSBarry Smith #else 87014dd563SJed Brown # define PETSC_DLLEXPORT 88014dd563SJed Brown # define PETSC_DLLIMPORT 8921f66b81SJed Brown # define PETSC_VISIBILITY_INTERNAL 90014dd563SJed Brown #endif 91014dd563SJed Brown 92014dd563SJed Brown #if defined(petsc_EXPORTS) /* CMake defines this when building the shared library */ 93014dd563SJed Brown # define PETSC_VISIBILITY_PUBLIC PETSC_DLLEXPORT 94014dd563SJed Brown #else /* Win32 users need this to import symbols from petsc.dll */ 95014dd563SJed Brown # define PETSC_VISIBILITY_PUBLIC PETSC_DLLIMPORT 96014dd563SJed Brown #endif 97014dd563SJed Brown 981cc8b206SBarry Smith /* 991cc8b206SBarry Smith Functions tagged with PETSC_EXTERN in the header files are 1001cc8b206SBarry Smith always defined as extern "C" when compiled with C++ so they may be 1011cc8b206SBarry Smith used from C and are always visible in the shared libraries 1021cc8b206SBarry Smith */ 1032c280183SJed Brown #if defined(__cplusplus) 104014dd563SJed Brown # define PETSC_EXTERN extern "C" PETSC_VISIBILITY_PUBLIC 105638cfed1SJed Brown # define PETSC_EXTERN_TYPEDEF extern "C" 10621f66b81SJed Brown # define PETSC_INTERN extern "C" PETSC_VISIBILITY_INTERNAL 107014dd563SJed Brown #else 108014dd563SJed Brown # define PETSC_EXTERN extern PETSC_VISIBILITY_PUBLIC 109638cfed1SJed Brown # define PETSC_EXTERN_TYPEDEF 1106258c452SJed Brown # define PETSC_INTERN extern PETSC_VISIBILITY_INTERNAL 111d382aafbSBarry Smith #endif 11227710113SBarry Smith 113193d546dSJacob Faibussowitsch #if defined(PETSC_USE_SINGLE_LIBRARY) 114193d546dSJacob Faibussowitsch # define PETSC_SINGLE_LIBRARY_INTERN PETSC_INTERN 115193d546dSJacob Faibussowitsch #else 116193d546dSJacob Faibussowitsch # define PETSC_SINGLE_LIBRARY_INTERN PETSC_EXTERN 117193d546dSJacob Faibussowitsch #endif 118193d546dSJacob Faibussowitsch 1190609f53bSJacob Faibussowitsch /* C++11 features */ 120030f984aSJacob Faibussowitsch #if defined(__cplusplus) && defined(PETSC_HAVE_CXX_DIALECT_CXX11) 121030f984aSJacob Faibussowitsch # define PETSC_NULLPTR nullptr 122030f984aSJacob Faibussowitsch # define PETSC_CONSTEXPR constexpr 123030f984aSJacob Faibussowitsch # define PETSC_NOEXCEPT noexcept 124030f984aSJacob Faibussowitsch # define PETSC_NOEXCEPT_ARG(cond_) noexcept(cond_) 125030f984aSJacob Faibussowitsch #else 126030f984aSJacob Faibussowitsch # define PETSC_NULLPTR NULL 127030f984aSJacob Faibussowitsch # define PETSC_CONSTEXPR 128030f984aSJacob Faibussowitsch # define PETSC_NOEXCEPT 129030f984aSJacob Faibussowitsch # define PETSC_NOEXCEPT_ARG(cond_) 1300609f53bSJacob Faibussowitsch #endif /* __cplusplus && PETSC_HAVE_CXX_DIALECT_CXX11 */ 1310609f53bSJacob Faibussowitsch 1320609f53bSJacob Faibussowitsch /* C++14 features */ 1330609f53bSJacob Faibussowitsch #if defined(PETSC_HAVE_CXX_DIALECT_CXX14) 1340609f53bSJacob Faibussowitsch # define PETSC_CONSTEXPR_14 PETSC_CONSTEXPR 1350609f53bSJacob Faibussowitsch #else 1360609f53bSJacob Faibussowitsch # define PETSC_CONSTEXPR_14 137030f984aSJacob Faibussowitsch #endif 138030f984aSJacob Faibussowitsch 1390609f53bSJacob Faibussowitsch /* C++17 features */ 1400a996781SJunchao Zhang /* We met cases that the host CXX compiler (say mpicxx) supports C++17, but nvcc does not agree, even with -ccbin mpicxx! */ 1410a996781SJunchao Zhang #if defined(__cplusplus) && defined(PETSC_HAVE_CXX_DIALECT_CXX17) && (!defined(PETSC_HAVE_CUDA) || defined(PETSC_HAVE_CUDA_DIALECT_CXX17)) 142030f984aSJacob Faibussowitsch # define PETSC_NODISCARD [[nodiscard]] 1430609f53bSJacob Faibussowitsch # define PETSC_CONSTEXPR_17 PETSC_CONSTEXPR 144030f984aSJacob Faibussowitsch #else 145030f984aSJacob Faibussowitsch # define PETSC_NODISCARD 1460609f53bSJacob Faibussowitsch # define PETSC_CONSTEXPR_17 147030f984aSJacob Faibussowitsch #endif 148030f984aSJacob Faibussowitsch 1492c8e378dSBarry Smith #include <petscversion.h> 150a17b96a8SKyle Gerard Felker #define PETSC_AUTHOR_INFO " The PETSc Team\n petsc-maint@mcs.anl.gov\n https://petsc.org/\n" 151d382aafbSBarry Smith 152d382aafbSBarry Smith /* ========================================================================== */ 153d382aafbSBarry Smith 154d382aafbSBarry Smith /* 155d382aafbSBarry Smith Defines the interface to MPI allowing the use of all MPI functions. 156d382aafbSBarry Smith 157d382aafbSBarry Smith PETSc does not use the C++ binding of MPI at ALL. The following flag 158d382aafbSBarry Smith makes sure the C++ bindings are not included. The C++ bindings REQUIRE 159d382aafbSBarry Smith putting mpi.h before ANY C++ include files, we cannot control this 160d382aafbSBarry Smith with all PETSc users. Users who want to use the MPI C++ bindings can include 161d382aafbSBarry Smith mpicxx.h directly in their code 162d382aafbSBarry Smith */ 163fa9e63e2SJed Brown #if !defined(MPICH_SKIP_MPICXX) 164d382aafbSBarry Smith # define MPICH_SKIP_MPICXX 1 165fa9e63e2SJed Brown #endif 166fa9e63e2SJed Brown #if !defined(OMPI_SKIP_MPICXX) 167d382aafbSBarry Smith # define OMPI_SKIP_MPICXX 1 168fa9e63e2SJed Brown #endif 169e771154cSJed Brown #if defined(PETSC_HAVE_MPIUNI) 170e771154cSJed Brown # include <petsc/mpiuni/mpi.h> 171e771154cSJed Brown #else 1722c8e378dSBarry Smith # include <mpi.h> 173e771154cSJed Brown #endif 17465013866SBarry Smith 1754e1ad211SJed Brown /*MC 1764e1ad211SJed Brown PetscDefined - determine whether a boolean macro is defined 1774e1ad211SJed Brown 1784e1ad211SJed Brown Notes: 1791393a3abSPatrick Sanan The prefix "PETSC_" is added to the argument. 1801393a3abSPatrick Sanan 1814e1ad211SJed Brown Typical usage is within normal code, 1824e1ad211SJed Brown 1834e1ad211SJed Brown $ if (PetscDefined(USE_DEBUG)) { ... } 1844e1ad211SJed Brown 1854e1ad211SJed Brown but can also be used in the preprocessor, 1864e1ad211SJed Brown 1874e1ad211SJed Brown $ #if PetscDefined(USE_DEBUG) 1884e1ad211SJed Brown $ ... 1894e1ad211SJed Brown $ #else 1904e1ad211SJed Brown 1911393a3abSPatrick Sanan Either way, it evaluates true if PETSC_USE_DEBUG is defined (merely defined or defined to 1), and false if PETSC_USE_DEBUG is undefined. This macro 1924e1ad211SJed Brown should not be used if its argument may be defined to a non-empty value other than 1. 1934e1ad211SJed Brown 1941393a3abSPatrick Sanan To avoid prepending "PETSC_", say to add custom checks in user code, one can use e.g. 1951393a3abSPatrick Sanan 1961393a3abSPatrick Sanan $ #define FooDefined(d) PetscDefined_(FOO_ ## d) 1971393a3abSPatrick Sanan 1984e1ad211SJed Brown Developer Notes: 1994e1ad211SJed Brown Getting something that works in C and CPP for an arg that may or may not be defined is tricky. Here, if we have 2004e1ad211SJed Brown "#define PETSC_HAVE_BOOGER 1" we match on the placeholder define, insert the "0," for arg1 and generate the triplet 2014e1ad211SJed Brown (0, 1, 0). Then the last step cherry picks the 2nd arg (a one). When PETSC_HAVE_BOOGER is not defined, we generate 2024e1ad211SJed Brown a (... 1, 0) pair, and when the last step cherry picks the 2nd arg, we get a zero. 2034e1ad211SJed Brown 2044e1ad211SJed Brown Our extra expansion via PetscDefined__take_second_expand() is needed with MSVC, which has a nonconforming 2054e1ad211SJed Brown implementation of variadic macros. 2064e1ad211SJed Brown 2074e1ad211SJed Brown Level: developer 2084e1ad211SJed Brown M*/ 2094e1ad211SJed Brown #if !defined(PETSC_SKIP_VARIADIC_MACROS) 2104e1ad211SJed Brown # define PetscDefined_arg_1 shift, 2114e1ad211SJed Brown # define PetscDefined_arg_ shift, 2124e1ad211SJed Brown # define PetscDefined__take_second_expanded(ignored, val, ...) val 2134e1ad211SJed Brown # define PetscDefined__take_second_expand(args) PetscDefined__take_second_expanded args 2144e1ad211SJed Brown # define PetscDefined__take_second(...) PetscDefined__take_second_expand((__VA_ARGS__)) 215c7faf32eSJacob Faibussowitsch # define PetscDefined____(arg1_or_junk) PetscDefined__take_second(arg1_or_junk 1, 0, at_) 216c7faf32eSJacob Faibussowitsch # define PetscDefined___(value) PetscDefined____(PetscDefined_arg_ ## value) 217c7faf32eSJacob Faibussowitsch # define PetscDefined__(d) PetscDefined___(d) 218c7faf32eSJacob Faibussowitsch # define PetscDefined_(d) PetscDefined__(PETSC_ ## d) 219c7faf32eSJacob Faibussowitsch # define PetscDefined(d) PetscDefined_(d) 2204e1ad211SJed Brown #endif 2214e1ad211SJed Brown 222d382aafbSBarry Smith /* 223a7886beaSBarry Smith Perform various sanity checks that the correct mpi.h is being included at compile time. 224a7886beaSBarry Smith This usually happens because 225a7886beaSBarry Smith * either an unexpected mpi.h is in the default compiler path (i.e. in /usr/include) or 226a7886beaSBarry Smith * an extra include path -I/something (which contains the unexpected mpi.h) is being passed to the compiler 227a7886beaSBarry Smith */ 228a7886beaSBarry Smith #if defined(PETSC_HAVE_MPIUNI) 229c9b973beSBarry Smith # if !defined(MPIUNI_H) 230a7886beaSBarry Smith # error "PETSc was configured with --with-mpi=0 but now appears to be compiling using a different mpi.h" 231a7886beaSBarry Smith # endif 23241f4af4cSSatish Balay #elif defined(PETSC_HAVE_I_MPI_NUMVERSION) 23341f4af4cSSatish Balay # if !defined(I_MPI_NUMVERSION) 23441f4af4cSSatish Balay # error "PETSc was configured with I_MPI but now appears to be compiling using a non-I_MPI mpi.h" 23541f4af4cSSatish Balay # elif I_MPI_NUMVERSION != PETSC_HAVE_I_MPI_NUMVERSION 23641f4af4cSSatish 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" 23741f4af4cSSatish Balay # endif 23841f4af4cSSatish Balay #elif defined(PETSC_HAVE_MVAPICH2_NUMVERSION) 23941f4af4cSSatish Balay # if !defined(MVAPICH2_NUMVERSION) 24041f4af4cSSatish Balay # error "PETSc was configured with MVAPICH2 but now appears to be compiling using a non-MVAPICH2 mpi.h" 24141f4af4cSSatish Balay # elif MVAPICH2_NUMVERSION != PETSC_HAVE_MVAPICH2_NUMVERSION 24241f4af4cSSatish Balay # error "PETSc was configured with one MVAPICH2 mpi.h version but now appears to be compiling using a different MVAPICH2 mpi.h version" 24341f4af4cSSatish Balay # endif 244a7886beaSBarry Smith #elif defined(PETSC_HAVE_MPICH_NUMVERSION) 24541f4af4cSSatish Balay # if !defined(MPICH_NUMVERSION) || defined(MVAPICH2_NUMVERSION) || defined(I_MPI_NUMVERSION) 246a7886beaSBarry Smith # error "PETSc was configured with MPICH but now appears to be compiling using a non-MPICH mpi.h" 247ca70f86eSJed Brown # elif (MPICH_NUMVERSION/100000 != PETSC_HAVE_MPICH_NUMVERSION/100000) || (MPICH_NUMVERSION%100000/1000 < PETSC_HAVE_MPICH_NUMVERSION%100000/1000) 248a7886beaSBarry Smith # error "PETSc was configured with one MPICH mpi.h version but now appears to be compiling using a different MPICH mpi.h version" 249a7886beaSBarry Smith # endif 250a7886beaSBarry Smith #elif defined(PETSC_HAVE_OMPI_MAJOR_VERSION) 251a7886beaSBarry Smith # if !defined(OMPI_MAJOR_VERSION) 252a7886beaSBarry Smith # error "PETSc was configured with OpenMPI but now appears to be compiling using a non-OpenMPI mpi.h" 253ca70f86eSJed Brown # elif (OMPI_MAJOR_VERSION != PETSC_HAVE_OMPI_MAJOR_VERSION) || (OMPI_MINOR_VERSION != PETSC_HAVE_OMPI_MINOR_VERSION) || (OMPI_RELEASE_VERSION < PETSC_HAVE_OMPI_RELEASE_VERSION) 254c3ac57cfSSatish Balay # error "PETSc was configured with one OpenMPI mpi.h version but now appears to be compiling using a different OpenMPI mpi.h version" 255a7886beaSBarry Smith # endif 256*c93fae50SJacob Faibussowitsch # define PETSC_MPI_COMM_FMT "p" 257*c93fae50SJacob Faibussowitsch # define PETSC_MPI_WIN_FMT "p" 258d97fd468SStefano Zampini #elif defined(PETSC_HAVE_MSMPI_VERSION) 259d97fd468SStefano Zampini # if !defined(MSMPI_VER) 260d97fd468SStefano Zampini # error "PETSc was configured with MSMPI but now appears to be compiling using a non-MSMPI mpi.h" 261d97fd468SStefano Zampini # elif (MSMPI_VER != PETSC_HAVE_MSMPI_VERSION) 262d97fd468SStefano Zampini # error "PETSc was configured with one MSMPI mpi.h version but now appears to be compiling using a different MSMPI mpi.h version" 263d97fd468SStefano Zampini # endif 264d97fd468SStefano Zampini #elif defined(OMPI_MAJOR_VERSION) || defined(MPICH_NUMVERSION) || defined(MSMPI_VER) 265d97fd468SStefano Zampini # error "PETSc was configured with undetermined MPI - but now appears to be compiling using any of OpenMPI, MS-MPI or a MPICH variant" 266a7886beaSBarry Smith #endif 267a7886beaSBarry Smith 268*c93fae50SJacob Faibussowitsch /* Format specifier for printing MPI_Comm (most implementations use 'int' as type) */ 269*c93fae50SJacob Faibussowitsch #if !defined(PETSC_MPI_COMM_FMT) 270*c93fae50SJacob Faibussowitsch # define PETSC_MPI_COMM_FMT "d" 271*c93fae50SJacob Faibussowitsch #endif 272*c93fae50SJacob Faibussowitsch 273*c93fae50SJacob Faibussowitsch #if !defined(PETSC_MPI_WIN_FMT) 274*c93fae50SJacob Faibussowitsch # define PETSC_MPI_WIN_FMT "d" 275*c93fae50SJacob Faibussowitsch #endif 276*c93fae50SJacob Faibussowitsch 277a7886beaSBarry Smith /* 2782981ebdbSBarry Smith Need to put stdio.h AFTER mpi.h for MPICH2 with C++ compiler 279d382aafbSBarry Smith see the top of mpicxx.h in the MPICH2 distribution. 280d382aafbSBarry Smith */ 281d382aafbSBarry Smith #include <stdio.h> 282d382aafbSBarry Smith 283d382aafbSBarry Smith /* MSMPI on 32bit windows requires this yukky hack - that breaks MPI standard compliance */ 284d382aafbSBarry Smith #if !defined(MPIAPI) 285d382aafbSBarry Smith #define MPIAPI 286d382aafbSBarry Smith #endif 287d382aafbSBarry Smith 2881cc8b206SBarry Smith /* 2891cc8b206SBarry Smith Support for Clang (>=3.2) matching type tag arguments with void* buffer types. 2901cc8b206SBarry Smith This allows the compiler to detect cases where the MPI datatype argument passed to a MPI routine 2911cc8b206SBarry Smith does not match the actual type of the argument being passed in 2921cc8b206SBarry Smith */ 293c5e4d11fSDmitry Karpeev #if defined(__has_attribute) && defined(works_with_const_which_is_not_true) 294894dd566SJed Brown # if __has_attribute(argument_with_type_tag) && __has_attribute(pointer_with_type_tag) && __has_attribute(type_tag_for_datatype) 295894dd566SJed Brown # define PetscAttrMPIPointerWithType(bufno,typeno) __attribute__((pointer_with_type_tag(MPI,bufno,typeno))) 2968ad47952SJed Brown # define PetscAttrMPITypeTag(type) __attribute__((type_tag_for_datatype(MPI,type))) 2978ad47952SJed Brown # define PetscAttrMPITypeTagLayoutCompatible(type) __attribute__((type_tag_for_datatype(MPI,type,layout_compatible))) 298894dd566SJed Brown # endif 299894dd566SJed Brown #endif 300894dd566SJed Brown #if !defined(PetscAttrMPIPointerWithType) 301894dd566SJed Brown # define PetscAttrMPIPointerWithType(bufno,typeno) 3028ad47952SJed Brown # define PetscAttrMPITypeTag(type) 3038ad47952SJed Brown # define PetscAttrMPITypeTagLayoutCompatible(type) 304894dd566SJed Brown #endif 305b3506946SBarry Smith 3065a576424SJed Brown PETSC_EXTERN MPI_Datatype MPIU_ENUM PetscAttrMPITypeTag(PetscEnum); 307df4397b0SStefano Zampini PETSC_EXTERN MPI_Datatype MPIU_BOOL PetscAttrMPITypeTag(PetscBool); 308e28ce29aSPatrick Sanan 309e28ce29aSPatrick Sanan /*MC 310e28ce29aSPatrick Sanan MPIU_INT - MPI datatype corresponding to PetscInt 311e28ce29aSPatrick Sanan 312e28ce29aSPatrick Sanan Notes: 313e28ce29aSPatrick Sanan In MPI calls that require an MPI datatype that matches a PetscInt or array of PetscInt values, pass this value. 314e28ce29aSPatrick Sanan 315e28ce29aSPatrick Sanan Level: beginner 316e28ce29aSPatrick Sanan 317e28ce29aSPatrick Sanan .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_REAL, MPIU_SCALAR, MPIU_COMPLEX 318e28ce29aSPatrick Sanan M*/ 319e28ce29aSPatrick Sanan 3207cdaf61dSJed Brown PETSC_EXTERN MPI_Datatype MPIU_FORTRANADDR; 321b7b8f77aSBarry Smith 322d382aafbSBarry Smith #if defined(PETSC_USE_64BIT_INDICES) 323bd84f1cfSSatish Balay # define MPIU_INT MPIU_INT64 324a05e1a72SSatish Balay # define PetscInt_FMT PetscInt64_FMT 325d382aafbSBarry Smith #else 326d382aafbSBarry Smith # define MPIU_INT MPI_INT 327a05e1a72SSatish Balay # define PetscInt_FMT "d" 328d382aafbSBarry Smith #endif 329d382aafbSBarry Smith 330503cfb0cSBarry Smith /* 331503cfb0cSBarry Smith For the rare cases when one needs to send a size_t object with MPI 332503cfb0cSBarry Smith */ 333e316c87fSJed Brown PETSC_EXTERN MPI_Datatype MPIU_SIZE_T; 334d382aafbSBarry Smith 335d382aafbSBarry Smith /* 336d382aafbSBarry Smith You can use PETSC_STDOUT as a replacement of stdout. You can also change 337d382aafbSBarry Smith the value of PETSC_STDOUT to redirect all standard output elsewhere 338d382aafbSBarry Smith */ 339014dd563SJed Brown PETSC_EXTERN FILE* PETSC_STDOUT; 340d382aafbSBarry Smith 341d382aafbSBarry Smith /* 342d382aafbSBarry Smith You can use PETSC_STDERR as a replacement of stderr. You can also change 343d382aafbSBarry Smith the value of PETSC_STDERR to redirect all standard error elsewhere 344d382aafbSBarry Smith */ 345014dd563SJed Brown PETSC_EXTERN FILE* PETSC_STDERR; 346d382aafbSBarry Smith 347d382aafbSBarry Smith /*MC 348d382aafbSBarry Smith PetscUnlikely - hints the compiler that the given condition is usually FALSE 349d382aafbSBarry Smith 350d382aafbSBarry Smith Synopsis: 351aaa7dc30SBarry Smith #include <petscsys.h> 352ace3abfcSBarry Smith PetscBool PetscUnlikely(PetscBool cond) 353d382aafbSBarry Smith 354eca87e8dSBarry Smith Not Collective 355eca87e8dSBarry Smith 356d382aafbSBarry Smith Input Parameters: 357d382aafbSBarry Smith . cond - condition or expression 358d382aafbSBarry Smith 359e28ce29aSPatrick Sanan Notes: 360e28ce29aSPatrick Sanan This returns the same truth value, it is only a hint to compilers that the resulting 361d382aafbSBarry Smith branch is unlikely. 362d382aafbSBarry Smith 363d382aafbSBarry Smith Level: advanced 364d382aafbSBarry Smith 365cf9c20a2SJed Brown .seealso: PetscUnlikelyDebug(), PetscLikely(), CHKERRQ 366d382aafbSBarry Smith M*/ 367d382aafbSBarry Smith 368d382aafbSBarry Smith /*MC 369d382aafbSBarry Smith PetscLikely - hints the compiler that the given condition is usually TRUE 370d382aafbSBarry Smith 371d382aafbSBarry Smith Synopsis: 372aaa7dc30SBarry Smith #include <petscsys.h> 37323072422SBarry Smith PetscBool PetscLikely(PetscBool cond) 374d382aafbSBarry Smith 375eca87e8dSBarry Smith Not Collective 376eca87e8dSBarry Smith 377d382aafbSBarry Smith Input Parameters: 378d382aafbSBarry Smith . cond - condition or expression 379d382aafbSBarry Smith 380e28ce29aSPatrick Sanan Notes: 381e28ce29aSPatrick Sanan This returns the same truth value, it is only a hint to compilers that the resulting 382d382aafbSBarry Smith branch is likely. 383d382aafbSBarry Smith 384d382aafbSBarry Smith Level: advanced 385d382aafbSBarry Smith 386d382aafbSBarry Smith .seealso: PetscUnlikely() 387d382aafbSBarry Smith M*/ 388d382aafbSBarry Smith #if defined(PETSC_HAVE_BUILTIN_EXPECT) 389d382aafbSBarry Smith # define PetscUnlikely(cond) __builtin_expect(!!(cond),0) 390d382aafbSBarry Smith # define PetscLikely(cond) __builtin_expect(!!(cond),1) 391d382aafbSBarry Smith #else 392cd3f4ce9SJed Brown # define PetscUnlikely(cond) (cond) 393cd3f4ce9SJed Brown # define PetscLikely(cond) (cond) 394d382aafbSBarry Smith #endif 395d382aafbSBarry Smith 396cf9c20a2SJed Brown /*MC 397cf9c20a2SJed Brown PetscUnlikelyDebug - hints the compiler that the given condition is usually FALSE, eliding the check in optimized mode 398cf9c20a2SJed Brown 399cf9c20a2SJed Brown Synopsis: 400cf9c20a2SJed Brown #include <petscsys.h> 401cf9c20a2SJed Brown PetscBool PetscUnlikelyDebug(PetscBool cond) 402cf9c20a2SJed Brown 403cf9c20a2SJed Brown Not Collective 404cf9c20a2SJed Brown 405cf9c20a2SJed Brown Input Parameters: 406cf9c20a2SJed Brown . cond - condition or expression 407cf9c20a2SJed Brown 408cf9c20a2SJed Brown Notes: 409cf9c20a2SJed Brown This returns the same truth value, it is only a hint to compilers that the resulting 410cf9c20a2SJed Brown branch is unlikely. When compiled in optimized mode, it always returns false. 411cf9c20a2SJed Brown 412cf9c20a2SJed Brown Level: advanced 413cf9c20a2SJed Brown 414cf9c20a2SJed Brown .seealso: PetscUnlikely(), CHKERRQ, SETERRQ 415cf9c20a2SJed Brown M*/ 416cf9c20a2SJed Brown #define PetscUnlikelyDebug(cond) (PetscDefined(USE_DEBUG) && PetscUnlikely(cond)) 417cf9c20a2SJed Brown 418c8b9133aSSatish Balay /* PetscPragmaSIMD - from CeedPragmaSIMD */ 419c8b9133aSSatish Balay 4205c993f7fSStefano Zampini #if defined(__NEC__) 4215c993f7fSStefano Zampini # define PetscPragmaSIMD _Pragma("_NEC ivdep") 4225c993f7fSStefano Zampini #elif defined(__INTEL_COMPILER) && !defined(_WIN32) 423c8b9133aSSatish Balay # define PetscPragmaSIMD _Pragma("vector") 4241dba8834SJose E. Roman #elif defined(__GNUC__) && __GNUC__ >= 5 && !defined(__PGI) 425c8b9133aSSatish Balay # define PetscPragmaSIMD _Pragma("GCC ivdep") 426160a5775SAli Reza Khaz'ali #elif defined(_OPENMP) && _OPENMP >= 201307 && !defined(_WIN32) 427c8b9133aSSatish Balay # define PetscPragmaSIMD _Pragma("omp simd") 428160a5775SAli Reza Khaz'ali #elif defined(_OPENMP) && _OPENMP >= 201307 && defined(_WIN32) 429160a5775SAli Reza Khaz'ali # define PetscPragmaSIMD __pragma(omp simd) 430c8b9133aSSatish Balay #elif defined(PETSC_HAVE_CRAY_VECTOR) 431c8b9133aSSatish Balay # define PetscPragmaSIMD _Pragma("_CRI ivdep") 432c8b9133aSSatish Balay #else 433c8b9133aSSatish Balay # define PetscPragmaSIMD 434c8b9133aSSatish Balay #endif 435c8b9133aSSatish Balay 436d382aafbSBarry Smith /* 437d382aafbSBarry Smith Declare extern C stuff after including external header files 438d382aafbSBarry Smith */ 439d382aafbSBarry Smith 4406a6fc655SJed Brown PETSC_EXTERN const char *const PetscBools[]; 44170b3c8c7SBarry Smith 4426edef35eSSatish Balay PETSC_EXTERN PetscBool PETSC_RUNNING_ON_VALGRIND; 4438b49ba18SBarry Smith /* 444390e1bf2SBarry Smith Defines elementary mathematics functions and constants. 4458b49ba18SBarry Smith */ 4468b49ba18SBarry Smith #include <petscmath.h> 4478b49ba18SBarry Smith 4486a6fc655SJed Brown PETSC_EXTERN const char *const PetscCopyModes[]; 449d382aafbSBarry Smith 450d382aafbSBarry Smith /*MC 4510298fd71SBarry Smith PETSC_IGNORE - same as NULL, means PETSc will ignore this argument 452d382aafbSBarry Smith 453d382aafbSBarry Smith Level: beginner 454d382aafbSBarry Smith 455e28ce29aSPatrick Sanan Note: 456e28ce29aSPatrick Sanan Accepted by many PETSc functions to not set a parameter and instead use 457d382aafbSBarry Smith some default 458d382aafbSBarry Smith 459e28ce29aSPatrick Sanan Fortran Notes: 460e28ce29aSPatrick Sanan This macro does not exist in Fortran; you must use PETSC_NULL_INTEGER, 461d382aafbSBarry Smith PETSC_NULL_DOUBLE_PRECISION etc 462d382aafbSBarry Smith 463e28ce29aSPatrick Sanan .seealso: PETSC_DECIDE, PETSC_DEFAULT, PETSC_DETERMINE 464d382aafbSBarry Smith 465d382aafbSBarry Smith M*/ 4660298fd71SBarry Smith #define PETSC_IGNORE NULL 467d382aafbSBarry Smith 468c528d872SBarry Smith /* This is deprecated */ 469c528d872SBarry Smith #define PETSC_NULL NULL 470c528d872SBarry Smith 471d382aafbSBarry Smith /*MC 472557d4da8SBarry Smith PETSC_DECIDE - standard way of passing in integer or floating point parameter 473557d4da8SBarry Smith where you wish PETSc to use the default. 474557d4da8SBarry Smith 475557d4da8SBarry Smith Level: beginner 476557d4da8SBarry Smith 477e28ce29aSPatrick Sanan .seealso: PETSC_DEFAULT, PETSC_IGNORE, PETSC_DETERMINE 478557d4da8SBarry Smith 479557d4da8SBarry Smith M*/ 480557d4da8SBarry Smith #define PETSC_DECIDE -1 481557d4da8SBarry Smith 482557d4da8SBarry Smith /*MC 483d382aafbSBarry Smith PETSC_DETERMINE - standard way of passing in integer or floating point parameter 484d382aafbSBarry Smith where you wish PETSc to compute the required value. 485d382aafbSBarry Smith 486d382aafbSBarry Smith Level: beginner 487d382aafbSBarry Smith 488e28ce29aSPatrick Sanan Developer Note: 489e28ce29aSPatrick Sanan I would like to use const PetscInt PETSC_DETERMINE = PETSC_DECIDE; but for 490557d4da8SBarry Smith some reason this is not allowed by the standard even though PETSC_DECIDE is a constant value. 491557d4da8SBarry Smith 4920298fd71SBarry Smith .seealso: PETSC_DECIDE, PETSC_DEFAULT, PETSC_IGNORE, VecSetSizes() 493d382aafbSBarry Smith 494d382aafbSBarry Smith M*/ 495d382aafbSBarry Smith #define PETSC_DETERMINE PETSC_DECIDE 496d382aafbSBarry Smith 497d382aafbSBarry Smith /*MC 498557d4da8SBarry Smith PETSC_DEFAULT - standard way of passing in integer or floating point parameter 499557d4da8SBarry Smith where you wish PETSc to use the default. 500557d4da8SBarry Smith 501557d4da8SBarry Smith Level: beginner 502557d4da8SBarry Smith 503e28ce29aSPatrick Sanan Fortran Notes: 504e28ce29aSPatrick Sanan You need to use PETSC_DEFAULT_INTEGER or PETSC_DEFAULT_REAL. 505557d4da8SBarry Smith 5060298fd71SBarry Smith .seealso: PETSC_DECIDE, PETSC_IGNORE, PETSC_DETERMINE 507557d4da8SBarry Smith 508557d4da8SBarry Smith M*/ 509557d4da8SBarry Smith #define PETSC_DEFAULT -2 510557d4da8SBarry Smith 511557d4da8SBarry Smith /*MC 512d382aafbSBarry Smith PETSC_COMM_WORLD - the equivalent of the MPI_COMM_WORLD communicator which represents 513ea8fe74dSBarry Smith all the processes that PETSc knows about. 514d382aafbSBarry Smith 515d382aafbSBarry Smith Level: beginner 516d382aafbSBarry Smith 517e28ce29aSPatrick Sanan Notes: 518e28ce29aSPatrick Sanan By default PETSC_COMM_WORLD and MPI_COMM_WORLD are identical unless you wish to 519d382aafbSBarry Smith run PETSc on ONLY a subset of MPI_COMM_WORLD. In that case create your new (smaller) 520d382aafbSBarry Smith communicator, call it, say comm, and set PETSC_COMM_WORLD = comm BEFORE calling 521a990b902SBarry Smith PetscInitialize(), but after MPI_Init() has been called. 522a990b902SBarry Smith 523a990b902SBarry Smith The value of PETSC_COMM_WORLD should never be USED/accessed before PetscInitialize() 524a990b902SBarry Smith is called because it may not have a valid value yet. 525d382aafbSBarry Smith 526d382aafbSBarry Smith .seealso: PETSC_COMM_SELF 527d382aafbSBarry Smith 528d382aafbSBarry Smith M*/ 529014dd563SJed Brown PETSC_EXTERN MPI_Comm PETSC_COMM_WORLD; 530d382aafbSBarry Smith 531d382aafbSBarry Smith /*MC 532503cfb0cSBarry Smith PETSC_COMM_SELF - This is always MPI_COMM_SELF 533d382aafbSBarry Smith 534d382aafbSBarry Smith Level: beginner 535d382aafbSBarry Smith 536e28ce29aSPatrick Sanan Notes: 537e28ce29aSPatrick Sanan Do not USE/access or set this variable before PetscInitialize() has been called. 538a990b902SBarry Smith 539d382aafbSBarry Smith .seealso: PETSC_COMM_WORLD 540d382aafbSBarry Smith 541d382aafbSBarry Smith M*/ 542d382aafbSBarry Smith #define PETSC_COMM_SELF MPI_COMM_SELF 543d382aafbSBarry Smith 5446de5d289SStefano Zampini /*MC 5456de5d289SStefano Zampini PETSC_MPI_THREAD_REQUIRED - the required threading support used if PETSc initializes 5466de5d289SStefano Zampini MPI with MPI_Init_thread. 5476de5d289SStefano Zampini 5486de5d289SStefano Zampini Level: beginner 5496de5d289SStefano Zampini 5506de5d289SStefano Zampini Notes: 5516de5d289SStefano Zampini By default PETSC_MPI_THREAD_REQUIRED equals MPI_THREAD_FUNNELED. 5526de5d289SStefano Zampini 5536de5d289SStefano Zampini .seealso: PetscInitialize() 5546de5d289SStefano Zampini 5556de5d289SStefano Zampini M*/ 5566de5d289SStefano Zampini PETSC_EXTERN PetscMPIInt PETSC_MPI_THREAD_REQUIRED; 5576de5d289SStefano Zampini 558d6f2c3cbSBarry Smith PETSC_EXTERN PetscBool PetscBeganMPI; 5598ad20175SVaclav Hapla PETSC_EXTERN PetscBool PetscErrorHandlingInitialized; 560014dd563SJed Brown PETSC_EXTERN PetscBool PetscInitializeCalled; 561014dd563SJed Brown PETSC_EXTERN PetscBool PetscFinalizeCalled; 5624cf1874eSKarl Rupp PETSC_EXTERN PetscBool PetscViennaCLSynchronize; 563d382aafbSBarry Smith 564014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetHelpVersionFunctions(PetscErrorCode (*)(MPI_Comm),PetscErrorCode (*)(MPI_Comm)); 565014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscCommDuplicate(MPI_Comm,MPI_Comm*,int*); 566014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscCommDestroy(MPI_Comm*); 567d382aafbSBarry Smith 56859e55d94SJunchao Zhang #if defined(PETSC_HAVE_KOKKOS) 56959e55d94SJunchao Zhang PETSC_EXTERN PetscErrorCode PetscKokkosInitializeCheck(void); /* Initialize Kokkos if not yet. */ 57059e55d94SJunchao Zhang #endif 57159e55d94SJunchao Zhang 57271438e86SJunchao Zhang #if defined(PETSC_HAVE_NVSHMEM) 57371438e86SJunchao Zhang PETSC_EXTERN PetscBool PetscBeganNvshmem; 57471438e86SJunchao Zhang PETSC_EXTERN PetscBool PetscNvshmemInitialized; 57571438e86SJunchao Zhang PETSC_EXTERN PetscErrorCode PetscNvshmemFinalize(void); 57671438e86SJunchao Zhang #endif 57771438e86SJunchao Zhang 578540e20f2SPierre Jolivet #if defined(PETSC_HAVE_ELEMENTAL) 579540e20f2SPierre Jolivet PETSC_EXTERN PetscErrorCode PetscElementalInitializePackage(void); 580540e20f2SPierre Jolivet PETSC_EXTERN PetscErrorCode PetscElementalInitialized(PetscBool*); 581540e20f2SPierre Jolivet PETSC_EXTERN PetscErrorCode PetscElementalFinalizePackage(void); 582540e20f2SPierre Jolivet #endif 583540e20f2SPierre Jolivet 584d382aafbSBarry Smith /*MC 58595dccacaSBarry Smith PetscMalloc - Allocates memory, One should use PetscNew(), PetscMalloc1() or PetscCalloc1() usually instead of this 586d382aafbSBarry Smith 587eca87e8dSBarry Smith Synopsis: 588aaa7dc30SBarry Smith #include <petscsys.h> 589eca87e8dSBarry Smith PetscErrorCode PetscMalloc(size_t m,void **result) 590eca87e8dSBarry Smith 591eca87e8dSBarry Smith Not Collective 592eca87e8dSBarry Smith 593d382aafbSBarry Smith Input Parameter: 594d382aafbSBarry Smith . m - number of bytes to allocate 595d382aafbSBarry Smith 596d382aafbSBarry Smith Output Parameter: 597d382aafbSBarry Smith . result - memory allocated 598d382aafbSBarry Smith 599d382aafbSBarry Smith Level: beginner 600d382aafbSBarry Smith 60149d7da52SJed Brown Notes: 60249d7da52SJed Brown Memory is always allocated at least double aligned 603d382aafbSBarry Smith 60449d7da52SJed Brown It is safe to allocate size 0 and pass the resulting pointer (which may or may not be NULL) to PetscFree(). 605d382aafbSBarry Smith 606d382aafbSBarry Smith .seealso: PetscFree(), PetscNew() 607d382aafbSBarry Smith 608d382aafbSBarry Smith M*/ 609071fcb05SBarry Smith #define PetscMalloc(a,b) ((*PetscTrMalloc)((a),PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(void**)(b))) 610d382aafbSBarry Smith 611d382aafbSBarry Smith /*MC 6123221ece2SMatthew G. Knepley PetscRealloc - Rellocates memory 6133221ece2SMatthew G. Knepley 6143221ece2SMatthew G. Knepley Synopsis: 6153221ece2SMatthew G. Knepley #include <petscsys.h> 6163221ece2SMatthew G. Knepley PetscErrorCode PetscRealloc(size_t m,void **result) 6173221ece2SMatthew G. Knepley 6183221ece2SMatthew G. Knepley Not Collective 6193221ece2SMatthew G. Knepley 6203221ece2SMatthew G. Knepley Input Parameters: 6213221ece2SMatthew G. Knepley + m - number of bytes to allocate 62292f119d6SBarry Smith - result - previous memory 6233221ece2SMatthew G. Knepley 6243221ece2SMatthew G. Knepley Output Parameter: 6253221ece2SMatthew G. Knepley . result - new memory allocated 6263221ece2SMatthew G. Knepley 6273221ece2SMatthew G. Knepley Level: developer 6283221ece2SMatthew G. Knepley 6293221ece2SMatthew G. Knepley Notes: 6303221ece2SMatthew G. Knepley Memory is always allocated at least double aligned 6313221ece2SMatthew G. Knepley 6323221ece2SMatthew G. Knepley .seealso: PetscMalloc(), PetscFree(), PetscNew() 6333221ece2SMatthew G. Knepley 6343221ece2SMatthew G. Knepley M*/ 6353221ece2SMatthew G. Knepley #define PetscRealloc(a,b) ((*PetscTrRealloc)((a),__LINE__,PETSC_FUNCTION_NAME,__FILE__,(void**)(b))) 6363221ece2SMatthew G. Knepley 6373221ece2SMatthew G. Knepley /*MC 638503cfb0cSBarry Smith PetscAddrAlign - Rounds up an address to PETSC_MEMALIGN alignment 639d382aafbSBarry Smith 640d382aafbSBarry Smith Synopsis: 641aaa7dc30SBarry Smith #include <petscsys.h> 642d382aafbSBarry Smith void *PetscAddrAlign(void *addr) 643d382aafbSBarry Smith 644eca87e8dSBarry Smith Not Collective 645eca87e8dSBarry Smith 646eca87e8dSBarry Smith Input Parameters: 647eca87e8dSBarry Smith . addr - address to align (any pointer type) 648eca87e8dSBarry Smith 649d382aafbSBarry Smith Level: developer 650d382aafbSBarry Smith 651d382aafbSBarry Smith .seealso: PetscMallocAlign() 652d382aafbSBarry Smith 653d382aafbSBarry Smith M*/ 654d382aafbSBarry Smith #define PetscAddrAlign(a) (void*)((((PETSC_UINTPTR_T)(a))+(PETSC_MEMALIGN-1)) & ~(PETSC_MEMALIGN-1)) 655d382aafbSBarry Smith 656d382aafbSBarry Smith /*MC 6578f51dc47SJunchao Zhang PetscCalloc - Allocates a cleared (zeroed) memory region aligned to PETSC_MEMALIGN 6588f51dc47SJunchao Zhang 6598f51dc47SJunchao Zhang Synopsis: 6608f51dc47SJunchao Zhang #include <petscsys.h> 6618f51dc47SJunchao Zhang PetscErrorCode PetscCalloc(size_t m,void **result) 6628f51dc47SJunchao Zhang 6638f51dc47SJunchao Zhang Not Collective 6648f51dc47SJunchao Zhang 6658f51dc47SJunchao Zhang Input Parameter: 6668f51dc47SJunchao Zhang . m - number of bytes to allocate 6678f51dc47SJunchao Zhang 6688f51dc47SJunchao Zhang Output Parameter: 6698f51dc47SJunchao Zhang . result - memory allocated 6708f51dc47SJunchao Zhang 6718f51dc47SJunchao Zhang Level: beginner 6728f51dc47SJunchao Zhang 6738f51dc47SJunchao Zhang Notes: 6748f51dc47SJunchao Zhang Memory is always allocated at least double aligned. This macro is useful in allocating memory pointed by void pointers 6758f51dc47SJunchao Zhang 6768f51dc47SJunchao Zhang It is safe to allocate size 0 and pass the resulting pointer (which may or may not be NULL) to PetscFree(). 6778f51dc47SJunchao Zhang 6788f51dc47SJunchao Zhang .seealso: PetscFree(), PetscNew() 6798f51dc47SJunchao Zhang 6808f51dc47SJunchao Zhang M*/ 6818f51dc47SJunchao Zhang #define PetscCalloc(m,result) PetscMallocA(1,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m),(result)) 6828f51dc47SJunchao Zhang 6838f51dc47SJunchao Zhang /*MC 684785e854fSJed Brown PetscMalloc1 - Allocates an array of memory aligned to PETSC_MEMALIGN 685d382aafbSBarry Smith 686eca87e8dSBarry Smith Synopsis: 687aaa7dc30SBarry Smith #include <petscsys.h> 688785e854fSJed Brown PetscErrorCode PetscMalloc1(size_t m1,type **r1) 689785e854fSJed Brown 690785e854fSJed Brown Not Collective 691785e854fSJed Brown 692785e854fSJed Brown Input Parameter: 693390e1bf2SBarry Smith . m1 - number of elements to allocate (may be zero) 694785e854fSJed Brown 695785e854fSJed Brown Output Parameter: 6961fe1b817SJunchao Zhang . r1 - memory allocated 697785e854fSJed Brown 698e28ce29aSPatrick Sanan Note: 699e28ce29aSPatrick Sanan This uses the sizeof() of the memory type requested to determine the total memory to be allocated, therefore you should not 700390e1bf2SBarry Smith multiply the number of elements requested by the sizeof() the type. For example use 701390e1bf2SBarry Smith $ PetscInt *id; 702390e1bf2SBarry Smith $ PetscMalloc1(10,&id); 703390e1bf2SBarry Smith not 704390e1bf2SBarry Smith $ PetscInt *id; 705390e1bf2SBarry Smith $ PetscMalloc1(10*sizeof(PetscInt),&id); 706390e1bf2SBarry Smith 7071fe1b817SJunchao Zhang Does not zero the memory allocated, use PetscCalloc1() to obtain memory that has been zeroed. 708390e1bf2SBarry Smith 709390e1bf2SBarry Smith Level: beginner 710785e854fSJed Brown 7111795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscCalloc1(), PetscMalloc2() 712785e854fSJed Brown 713785e854fSJed Brown M*/ 7142553b7ecSJed Brown #define PetscMalloc1(m1,r1) PetscMallocA(1,PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1)) 715785e854fSJed Brown 716785e854fSJed Brown /*MC 7171795a4d1SJed Brown PetscCalloc1 - Allocates a cleared (zeroed) array of memory aligned to PETSC_MEMALIGN 7181795a4d1SJed Brown 7191795a4d1SJed Brown Synopsis: 720aaa7dc30SBarry Smith #include <petscsys.h> 7211795a4d1SJed Brown PetscErrorCode PetscCalloc1(size_t m1,type **r1) 7221795a4d1SJed Brown 7231795a4d1SJed Brown Not Collective 7241795a4d1SJed Brown 7251795a4d1SJed Brown Input Parameter: 7261795a4d1SJed Brown . m1 - number of elements to allocate in 1st chunk (may be zero) 7271795a4d1SJed Brown 7281795a4d1SJed Brown Output Parameter: 7291fe1b817SJunchao Zhang . r1 - memory allocated 7301795a4d1SJed Brown 731e28ce29aSPatrick Sanan Notes: 732e28ce29aSPatrick Sanan See PetsMalloc1() for more details on usage. 733390e1bf2SBarry Smith 734390e1bf2SBarry Smith Level: beginner 7351795a4d1SJed Brown 7361795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc1(), PetscCalloc2() 7371795a4d1SJed Brown 7381795a4d1SJed Brown M*/ 7392553b7ecSJed Brown #define PetscCalloc1(m1,r1) PetscMallocA(1,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1)) 7401795a4d1SJed Brown 7411795a4d1SJed Brown /*MC 742dcca6d9dSJed Brown PetscMalloc2 - Allocates 2 arrays of memory both aligned to PETSC_MEMALIGN 743d382aafbSBarry Smith 744eca87e8dSBarry Smith Synopsis: 745aaa7dc30SBarry Smith #include <petscsys.h> 746dcca6d9dSJed Brown PetscErrorCode PetscMalloc2(size_t m1,type **r1,size_t m2,type **r2) 747eca87e8dSBarry Smith 748eca87e8dSBarry Smith Not Collective 749eca87e8dSBarry Smith 750d8d19677SJose E. Roman Input Parameters: 751d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 752dcca6d9dSJed Brown - m2 - number of elements to allocate in 2nd chunk (may be zero) 753d382aafbSBarry Smith 754d8d19677SJose E. Roman Output Parameters: 755d382aafbSBarry Smith + r1 - memory allocated in first chunk 756d382aafbSBarry Smith - r2 - memory allocated in second chunk 757d382aafbSBarry Smith 758d382aafbSBarry Smith Level: developer 759d382aafbSBarry Smith 7601795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc1(), PetscCalloc2() 761d382aafbSBarry Smith 762d382aafbSBarry Smith M*/ 7632553b7ecSJed Brown #define PetscMalloc2(m1,r1,m2,r2) PetscMallocA(2,PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2)) 764d382aafbSBarry Smith 765d382aafbSBarry Smith /*MC 7661795a4d1SJed Brown PetscCalloc2 - Allocates 2 cleared (zeroed) arrays of memory both aligned to PETSC_MEMALIGN 767d382aafbSBarry Smith 768eca87e8dSBarry Smith Synopsis: 769aaa7dc30SBarry Smith #include <petscsys.h> 7701795a4d1SJed Brown PetscErrorCode PetscCalloc2(size_t m1,type **r1,size_t m2,type **r2) 771eca87e8dSBarry Smith 772eca87e8dSBarry Smith Not Collective 773eca87e8dSBarry Smith 774d8d19677SJose E. Roman Input Parameters: 775d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 7761795a4d1SJed Brown - m2 - number of elements to allocate in 2nd chunk (may be zero) 7771795a4d1SJed Brown 778d8d19677SJose E. Roman Output Parameters: 7791795a4d1SJed Brown + r1 - memory allocated in first chunk 7801795a4d1SJed Brown - r2 - memory allocated in second chunk 7811795a4d1SJed Brown 7821795a4d1SJed Brown Level: developer 7831795a4d1SJed Brown 7841795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscCalloc1(), PetscMalloc2() 7851795a4d1SJed Brown 7861795a4d1SJed Brown M*/ 7872553b7ecSJed Brown #define PetscCalloc2(m1,r1,m2,r2) PetscMallocA(2,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2)) 7881795a4d1SJed Brown 7891795a4d1SJed Brown /*MC 790dcca6d9dSJed Brown PetscMalloc3 - Allocates 3 arrays of memory, all aligned to PETSC_MEMALIGN 791d382aafbSBarry Smith 792d382aafbSBarry Smith Synopsis: 793aaa7dc30SBarry Smith #include <petscsys.h> 794dcca6d9dSJed Brown PetscErrorCode PetscMalloc3(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3) 795d382aafbSBarry Smith 796d382aafbSBarry Smith Not Collective 797d382aafbSBarry Smith 798d8d19677SJose E. Roman Input Parameters: 799d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 800d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 801dcca6d9dSJed Brown - m3 - number of elements to allocate in 3rd chunk (may be zero) 802d382aafbSBarry Smith 803d8d19677SJose E. Roman Output Parameters: 804d382aafbSBarry Smith + r1 - memory allocated in first chunk 805d382aafbSBarry Smith . r2 - memory allocated in second chunk 806d382aafbSBarry Smith - r3 - memory allocated in third chunk 807d382aafbSBarry Smith 808d382aafbSBarry Smith Level: developer 809d382aafbSBarry Smith 8101795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscCalloc3(), PetscFree3() 811d382aafbSBarry Smith 812d382aafbSBarry Smith M*/ 8132553b7ecSJed Brown #define PetscMalloc3(m1,r1,m2,r2,m3,r3) PetscMallocA(3,PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2),(size_t)(m3)*sizeof(**(r3)),(r3)) 814d382aafbSBarry Smith 815d382aafbSBarry Smith /*MC 8161795a4d1SJed Brown PetscCalloc3 - Allocates 3 cleared (zeroed) arrays of memory, all aligned to PETSC_MEMALIGN 817d382aafbSBarry Smith 818eca87e8dSBarry Smith Synopsis: 819aaa7dc30SBarry Smith #include <petscsys.h> 8201795a4d1SJed Brown PetscErrorCode PetscCalloc3(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3) 821eca87e8dSBarry Smith 822eca87e8dSBarry Smith Not Collective 823eca87e8dSBarry Smith 824d8d19677SJose E. Roman Input Parameters: 825d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 826d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 8271795a4d1SJed Brown - m3 - number of elements to allocate in 3rd chunk (may be zero) 8281795a4d1SJed Brown 829d8d19677SJose E. Roman Output Parameters: 8301795a4d1SJed Brown + r1 - memory allocated in first chunk 8311795a4d1SJed Brown . r2 - memory allocated in second chunk 8321795a4d1SJed Brown - r3 - memory allocated in third chunk 8331795a4d1SJed Brown 8341795a4d1SJed Brown Level: developer 8351795a4d1SJed Brown 8361795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscCalloc2(), PetscMalloc3(), PetscFree3() 8371795a4d1SJed Brown 8381795a4d1SJed Brown M*/ 8392553b7ecSJed Brown #define PetscCalloc3(m1,r1,m2,r2,m3,r3) PetscMallocA(3,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2),(size_t)(m3)*sizeof(**(r3)),(r3)) 8401795a4d1SJed Brown 8411795a4d1SJed Brown /*MC 842dcca6d9dSJed Brown PetscMalloc4 - Allocates 4 arrays of memory, all aligned to PETSC_MEMALIGN 843d382aafbSBarry Smith 844d382aafbSBarry Smith Synopsis: 845aaa7dc30SBarry Smith #include <petscsys.h> 846dcca6d9dSJed Brown PetscErrorCode PetscMalloc4(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3,size_t m4,type **r4) 847d382aafbSBarry Smith 848d382aafbSBarry Smith Not Collective 849d382aafbSBarry Smith 850d8d19677SJose E. Roman Input Parameters: 851d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 852d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 853d382aafbSBarry Smith . m3 - number of elements to allocate in 3rd chunk (may be zero) 854dcca6d9dSJed Brown - m4 - number of elements to allocate in 4th chunk (may be zero) 855d382aafbSBarry Smith 856d8d19677SJose E. Roman Output Parameters: 857d382aafbSBarry Smith + r1 - memory allocated in first chunk 858d382aafbSBarry Smith . r2 - memory allocated in second chunk 859d382aafbSBarry Smith . r3 - memory allocated in third chunk 860d382aafbSBarry Smith - r4 - memory allocated in fourth chunk 861d382aafbSBarry Smith 862d382aafbSBarry Smith Level: developer 863d382aafbSBarry Smith 8641795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscCalloc4(), PetscFree4() 865d382aafbSBarry Smith 866d382aafbSBarry Smith M*/ 8672553b7ecSJed Brown #define PetscMalloc4(m1,r1,m2,r2,m3,r3,m4,r4) PetscMallocA(4,PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2),(size_t)(m3)*sizeof(**(r3)),(r3),(size_t)(m4)*sizeof(**(r4)),(r4)) 868d382aafbSBarry Smith 869d382aafbSBarry Smith /*MC 8701795a4d1SJed Brown PetscCalloc4 - Allocates 4 cleared (zeroed) arrays of memory, all aligned to PETSC_MEMALIGN 871d382aafbSBarry Smith 872eca87e8dSBarry Smith Synopsis: 873aaa7dc30SBarry Smith #include <petscsys.h> 8741795a4d1SJed Brown PetscErrorCode PetscCalloc4(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3,size_t m4,type **r4) 875eca87e8dSBarry Smith 876eca87e8dSBarry Smith Not Collective 877eca87e8dSBarry Smith 878e28ce29aSPatrick Sanan Input Parameters: 879d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 880d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 881d382aafbSBarry Smith . m3 - number of elements to allocate in 3rd chunk (may be zero) 8821795a4d1SJed Brown - m4 - number of elements to allocate in 4th chunk (may be zero) 8831795a4d1SJed Brown 884e28ce29aSPatrick Sanan Output Parameters: 8851795a4d1SJed Brown + r1 - memory allocated in first chunk 8861795a4d1SJed Brown . r2 - memory allocated in second chunk 8871795a4d1SJed Brown . r3 - memory allocated in third chunk 8881795a4d1SJed Brown - r4 - memory allocated in fourth chunk 8891795a4d1SJed Brown 8901795a4d1SJed Brown Level: developer 8911795a4d1SJed Brown 8921795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscCalloc4(), PetscFree4() 8931795a4d1SJed Brown 8941795a4d1SJed Brown M*/ 8952553b7ecSJed Brown #define PetscCalloc4(m1,r1,m2,r2,m3,r3,m4,r4) PetscMallocA(4,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2),(size_t)(m3)*sizeof(**(r3)),(r3),(size_t)(m4)*sizeof(**(r4)),(r4)) 8961795a4d1SJed Brown 8971795a4d1SJed Brown /*MC 898dcca6d9dSJed Brown PetscMalloc5 - Allocates 5 arrays of memory, all aligned to PETSC_MEMALIGN 899d382aafbSBarry Smith 900d382aafbSBarry Smith Synopsis: 901aaa7dc30SBarry Smith #include <petscsys.h> 902dcca6d9dSJed 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) 903d382aafbSBarry Smith 904d382aafbSBarry Smith Not Collective 905d382aafbSBarry Smith 906e28ce29aSPatrick Sanan Input Parameters: 907d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 908d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 909d382aafbSBarry Smith . m3 - number of elements to allocate in 3rd chunk (may be zero) 910d382aafbSBarry Smith . m4 - number of elements to allocate in 4th chunk (may be zero) 911dcca6d9dSJed Brown - m5 - number of elements to allocate in 5th chunk (may be zero) 912d382aafbSBarry Smith 913e28ce29aSPatrick Sanan Output Parameters: 914d382aafbSBarry Smith + r1 - memory allocated in first chunk 915d382aafbSBarry Smith . r2 - memory allocated in second chunk 916d382aafbSBarry Smith . r3 - memory allocated in third chunk 917d382aafbSBarry Smith . r4 - memory allocated in fourth chunk 918d382aafbSBarry Smith - r5 - memory allocated in fifth chunk 919d382aafbSBarry Smith 920d382aafbSBarry Smith Level: developer 921d382aafbSBarry Smith 9221795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscCalloc5(), PetscFree5() 923d382aafbSBarry Smith 924d382aafbSBarry Smith M*/ 9252553b7ecSJed Brown #define PetscMalloc5(m1,r1,m2,r2,m3,r3,m4,r4,m5,r5) PetscMallocA(5,PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2),(size_t)(m3)*sizeof(**(r3)),(r3),(size_t)(m4)*sizeof(**(r4)),(r4),(size_t)(m5)*sizeof(**(r5)),(r5)) 926d382aafbSBarry Smith 927d382aafbSBarry Smith /*MC 9281795a4d1SJed Brown PetscCalloc5 - Allocates 5 cleared (zeroed) arrays of memory, all aligned to PETSC_MEMALIGN 929d382aafbSBarry Smith 930eca87e8dSBarry Smith Synopsis: 931aaa7dc30SBarry Smith #include <petscsys.h> 9321795a4d1SJed 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) 933eca87e8dSBarry Smith 934eca87e8dSBarry Smith Not Collective 935eca87e8dSBarry Smith 936e28ce29aSPatrick Sanan Input Parameters: 937d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 938d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 939d382aafbSBarry Smith . m3 - number of elements to allocate in 3rd chunk (may be zero) 940d382aafbSBarry Smith . m4 - number of elements to allocate in 4th chunk (may be zero) 9411795a4d1SJed Brown - m5 - number of elements to allocate in 5th chunk (may be zero) 9421795a4d1SJed Brown 943e28ce29aSPatrick Sanan Output Parameters: 9441795a4d1SJed Brown + r1 - memory allocated in first chunk 9451795a4d1SJed Brown . r2 - memory allocated in second chunk 9461795a4d1SJed Brown . r3 - memory allocated in third chunk 9471795a4d1SJed Brown . r4 - memory allocated in fourth chunk 9481795a4d1SJed Brown - r5 - memory allocated in fifth chunk 9491795a4d1SJed Brown 9501795a4d1SJed Brown Level: developer 9511795a4d1SJed Brown 9521795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc5(), PetscFree5() 9531795a4d1SJed Brown 9541795a4d1SJed Brown M*/ 9552553b7ecSJed Brown #define PetscCalloc5(m1,r1,m2,r2,m3,r3,m4,r4,m5,r5) PetscMallocA(5,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2),(size_t)(m3)*sizeof(**(r3)),(r3),(size_t)(m4)*sizeof(**(r4)),(r4),(size_t)(m5)*sizeof(**(r5)),(r5)) 956d382aafbSBarry Smith 957d382aafbSBarry Smith /*MC 958dcca6d9dSJed Brown PetscMalloc6 - Allocates 6 arrays of memory, all aligned to PETSC_MEMALIGN 959d382aafbSBarry Smith 960d382aafbSBarry Smith Synopsis: 961aaa7dc30SBarry Smith #include <petscsys.h> 962dcca6d9dSJed 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) 963d382aafbSBarry Smith 964d382aafbSBarry Smith Not Collective 965d382aafbSBarry Smith 966e28ce29aSPatrick Sanan Input Parameters: 967d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 968d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 969d382aafbSBarry Smith . m3 - number of elements to allocate in 3rd chunk (may be zero) 970d382aafbSBarry Smith . m4 - number of elements to allocate in 4th chunk (may be zero) 971d382aafbSBarry Smith . m5 - number of elements to allocate in 5th chunk (may be zero) 972dcca6d9dSJed Brown - m6 - number of elements to allocate in 6th chunk (may be zero) 973d382aafbSBarry Smith 974e28ce29aSPatrick Sanan Output Parameteasr: 975d382aafbSBarry Smith + r1 - memory allocated in first chunk 976d382aafbSBarry Smith . r2 - memory allocated in second chunk 977d382aafbSBarry Smith . r3 - memory allocated in third chunk 978d382aafbSBarry Smith . r4 - memory allocated in fourth chunk 979d382aafbSBarry Smith . r5 - memory allocated in fifth chunk 980d382aafbSBarry Smith - r6 - memory allocated in sixth chunk 981d382aafbSBarry Smith 982d382aafbSBarry Smith Level: developer 983d382aafbSBarry Smith 9841795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscCalloc6(), PetscFree3(), PetscFree4(), PetscFree5(), PetscFree6() 985d382aafbSBarry Smith 986d382aafbSBarry Smith M*/ 9872553b7ecSJed Brown #define PetscMalloc6(m1,r1,m2,r2,m3,r3,m4,r4,m5,r5,m6,r6) PetscMallocA(6,PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2),(size_t)(m3)*sizeof(**(r3)),(r3),(size_t)(m4)*sizeof(**(r4)),(r4),(size_t)(m5)*sizeof(**(r5)),(r5),(size_t)(m6)*sizeof(**(r6)),(r6)) 988d382aafbSBarry Smith 989d382aafbSBarry Smith /*MC 9901795a4d1SJed Brown PetscCalloc6 - Allocates 6 cleared (zeroed) arrays of memory, all aligned to PETSC_MEMALIGN 991d382aafbSBarry Smith 992eca87e8dSBarry Smith Synopsis: 993aaa7dc30SBarry Smith #include <petscsys.h> 9941795a4d1SJed 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) 995eca87e8dSBarry Smith 996eca87e8dSBarry Smith Not Collective 997eca87e8dSBarry Smith 998e28ce29aSPatrick Sanan Input Parameters: 999d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 1000d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 1001d382aafbSBarry Smith . m3 - number of elements to allocate in 3rd chunk (may be zero) 1002d382aafbSBarry Smith . m4 - number of elements to allocate in 4th chunk (may be zero) 1003d382aafbSBarry Smith . m5 - number of elements to allocate in 5th chunk (may be zero) 10041795a4d1SJed Brown - m6 - number of elements to allocate in 6th chunk (may be zero) 10051795a4d1SJed Brown 1006e28ce29aSPatrick Sanan Output Parameters: 10071795a4d1SJed Brown + r1 - memory allocated in first chunk 10081795a4d1SJed Brown . r2 - memory allocated in second chunk 10091795a4d1SJed Brown . r3 - memory allocated in third chunk 10101795a4d1SJed Brown . r4 - memory allocated in fourth chunk 10111795a4d1SJed Brown . r5 - memory allocated in fifth chunk 10121795a4d1SJed Brown - r6 - memory allocated in sixth chunk 10131795a4d1SJed Brown 10141795a4d1SJed Brown Level: developer 10151795a4d1SJed Brown 10161795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscMalloc6(), PetscFree6() 10171795a4d1SJed Brown 10181795a4d1SJed Brown M*/ 10192553b7ecSJed Brown #define PetscCalloc6(m1,r1,m2,r2,m3,r3,m4,r4,m5,r5,m6,r6) PetscMallocA(6,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2),(size_t)(m3)*sizeof(**(r3)),(r3),(size_t)(m4)*sizeof(**(r4)),(r4),(size_t)(m5)*sizeof(**(r5)),(r5),(size_t)(m6)*sizeof(**(r6)),(r6)) 10201795a4d1SJed Brown 10211795a4d1SJed Brown /*MC 1022dcca6d9dSJed Brown PetscMalloc7 - Allocates 7 arrays of memory, all aligned to PETSC_MEMALIGN 1023d382aafbSBarry Smith 1024d382aafbSBarry Smith Synopsis: 1025aaa7dc30SBarry Smith #include <petscsys.h> 1026dcca6d9dSJed 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) 1027d382aafbSBarry Smith 1028d382aafbSBarry Smith Not Collective 1029d382aafbSBarry Smith 1030e28ce29aSPatrick Sanan Input Parameters: 1031d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 1032d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 1033d382aafbSBarry Smith . m3 - number of elements to allocate in 3rd chunk (may be zero) 1034d382aafbSBarry Smith . m4 - number of elements to allocate in 4th chunk (may be zero) 1035d382aafbSBarry Smith . m5 - number of elements to allocate in 5th chunk (may be zero) 1036d382aafbSBarry Smith . m6 - number of elements to allocate in 6th chunk (may be zero) 1037dcca6d9dSJed Brown - m7 - number of elements to allocate in 7th chunk (may be zero) 1038d382aafbSBarry Smith 1039e28ce29aSPatrick Sanan Output Parameters: 1040d382aafbSBarry Smith + r1 - memory allocated in first chunk 1041d382aafbSBarry Smith . r2 - memory allocated in second chunk 1042d382aafbSBarry Smith . r3 - memory allocated in third chunk 1043d382aafbSBarry Smith . r4 - memory allocated in fourth chunk 1044d382aafbSBarry Smith . r5 - memory allocated in fifth chunk 1045d382aafbSBarry Smith . r6 - memory allocated in sixth chunk 1046eca87e8dSBarry Smith - r7 - memory allocated in seventh chunk 1047d382aafbSBarry Smith 1048d382aafbSBarry Smith Level: developer 1049d382aafbSBarry Smith 10501795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscCalloc7(), PetscFree7() 1051d382aafbSBarry Smith 1052d382aafbSBarry Smith M*/ 10532553b7ecSJed Brown #define PetscMalloc7(m1,r1,m2,r2,m3,r3,m4,r4,m5,r5,m6,r6,m7,r7) PetscMallocA(7,PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2),(size_t)(m3)*sizeof(**(r3)),(r3),(size_t)(m4)*sizeof(**(r4)),(r4),(size_t)(m5)*sizeof(**(r5)),(r5),(size_t)(m6)*sizeof(**(r6)),(r6),(size_t)(m7)*sizeof(**(r7)),(r7)) 1054d382aafbSBarry Smith 1055d382aafbSBarry Smith /*MC 10561795a4d1SJed Brown PetscCalloc7 - Allocates 7 cleared (zeroed) arrays of memory, all aligned to PETSC_MEMALIGN 10571795a4d1SJed Brown 10581795a4d1SJed Brown Synopsis: 1059aaa7dc30SBarry Smith #include <petscsys.h> 10601795a4d1SJed 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) 10611795a4d1SJed Brown 10621795a4d1SJed Brown Not Collective 10631795a4d1SJed Brown 1064e28ce29aSPatrick Sanan Input Parameters: 10651795a4d1SJed Brown + m1 - number of elements to allocate in 1st chunk (may be zero) 10661795a4d1SJed Brown . m2 - number of elements to allocate in 2nd chunk (may be zero) 10671795a4d1SJed Brown . m3 - number of elements to allocate in 3rd chunk (may be zero) 10681795a4d1SJed Brown . m4 - number of elements to allocate in 4th chunk (may be zero) 10691795a4d1SJed Brown . m5 - number of elements to allocate in 5th chunk (may be zero) 10701795a4d1SJed Brown . m6 - number of elements to allocate in 6th chunk (may be zero) 10711795a4d1SJed Brown - m7 - number of elements to allocate in 7th chunk (may be zero) 10721795a4d1SJed Brown 1073e28ce29aSPatrick Sanan Output Parameters: 10741795a4d1SJed Brown + r1 - memory allocated in first chunk 10751795a4d1SJed Brown . r2 - memory allocated in second chunk 10761795a4d1SJed Brown . r3 - memory allocated in third chunk 10771795a4d1SJed Brown . r4 - memory allocated in fourth chunk 10781795a4d1SJed Brown . r5 - memory allocated in fifth chunk 10791795a4d1SJed Brown . r6 - memory allocated in sixth chunk 10801795a4d1SJed Brown - r7 - memory allocated in seventh chunk 10811795a4d1SJed Brown 10821795a4d1SJed Brown Level: developer 10831795a4d1SJed Brown 10841795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscMalloc7(), PetscFree7() 10851795a4d1SJed Brown 10861795a4d1SJed Brown M*/ 10872553b7ecSJed Brown #define PetscCalloc7(m1,r1,m2,r2,m3,r3,m4,r4,m5,r5,m6,r6,m7,r7) PetscMallocA(7,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1),(size_t)(m2)*sizeof(**(r2)),(r2),(size_t)(m3)*sizeof(**(r3)),(r3),(size_t)(m4)*sizeof(**(r4)),(r4),(size_t)(m5)*sizeof(**(r5)),(r5),(size_t)(m6)*sizeof(**(r6)),(r6),(size_t)(m7)*sizeof(**(r7)),(r7)) 10881795a4d1SJed Brown 10891795a4d1SJed Brown /*MC 1090503cfb0cSBarry Smith PetscNew - Allocates memory of a particular type, zeros the memory! Aligned to PETSC_MEMALIGN 1091d382aafbSBarry Smith 1092eca87e8dSBarry Smith Synopsis: 1093aaa7dc30SBarry Smith #include <petscsys.h> 1094b00a9115SJed Brown PetscErrorCode PetscNew(type **result) 1095eca87e8dSBarry Smith 1096eca87e8dSBarry Smith Not Collective 1097eca87e8dSBarry Smith 1098d382aafbSBarry Smith Output Parameter: 1099b00a9115SJed Brown . result - memory allocated, sized to match pointer type 1100d382aafbSBarry Smith 1101d382aafbSBarry Smith Level: beginner 1102d382aafbSBarry Smith 1103390e1bf2SBarry Smith .seealso: PetscFree(), PetscMalloc(), PetscNewLog(), PetscCalloc1(), PetscMalloc1() 1104d382aafbSBarry Smith 1105d382aafbSBarry Smith M*/ 1106b00a9115SJed Brown #define PetscNew(b) PetscCalloc1(1,(b)) 1107ad0619ddSBarry Smith 1108ad0619ddSBarry Smith /*MC 1109b00a9115SJed Brown PetscNewLog - Allocates memory of a type matching pointer, zeros the memory! Aligned to PETSC_MEMALIGN. Associates the memory allocated 1110ad0619ddSBarry Smith with the given object using PetscLogObjectMemory(). 1111ad0619ddSBarry Smith 1112ad0619ddSBarry Smith Synopsis: 1113aaa7dc30SBarry Smith #include <petscsys.h> 1114b00a9115SJed Brown PetscErrorCode PetscNewLog(PetscObject obj,type **result) 1115ad0619ddSBarry Smith 1116ad0619ddSBarry Smith Not Collective 1117ad0619ddSBarry Smith 1118ad0619ddSBarry Smith Input Parameter: 1119b00a9115SJed Brown . obj - object memory is logged to 1120ad0619ddSBarry Smith 1121ad0619ddSBarry Smith Output Parameter: 1122b00a9115SJed Brown . result - memory allocated, sized to match pointer type 1123ad0619ddSBarry Smith 1124ad0619ddSBarry Smith Level: developer 1125ad0619ddSBarry Smith 1126390e1bf2SBarry Smith .seealso: PetscFree(), PetscMalloc(), PetscNew(), PetscLogObjectMemory(), PetscCalloc1(), PetscMalloc1() 1127ad0619ddSBarry Smith 1128ad0619ddSBarry Smith M*/ 1129d12f57a0SLisandro Dalcin #define PetscNewLog(o,b) (PetscNew((b)) || PetscLogObjectMemory((PetscObject)o,sizeof(**(b)))) 1130d382aafbSBarry Smith 1131d382aafbSBarry Smith /*MC 1132d382aafbSBarry Smith PetscFree - Frees memory 1133d382aafbSBarry Smith 1134eca87e8dSBarry Smith Synopsis: 1135aaa7dc30SBarry Smith #include <petscsys.h> 1136eca87e8dSBarry Smith PetscErrorCode PetscFree(void *memory) 1137eca87e8dSBarry Smith 1138eca87e8dSBarry Smith Not Collective 1139eca87e8dSBarry Smith 1140d382aafbSBarry Smith Input Parameter: 11417f4976b7SJacob Faibussowitsch . memory - memory to free (the pointer is ALWAYS set to NULL upon success) 1142d382aafbSBarry Smith 1143d382aafbSBarry Smith Level: beginner 1144d382aafbSBarry Smith 114549d7da52SJed Brown Notes: 1146390e1bf2SBarry Smith Do not free memory obtained with PetscMalloc2(), PetscCalloc2() etc, they must be freed with PetscFree2() etc. 1147390e1bf2SBarry Smith 114849d7da52SJed Brown It is safe to call PetscFree() on a NULL pointer. 1149d382aafbSBarry Smith 1150390e1bf2SBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscNewLog(), PetscMalloc1(), PetscCalloc1() 1151d382aafbSBarry Smith 1152d382aafbSBarry Smith M*/ 1153ffc31a0eSLisandro Dalcin #define PetscFree(a) ((*PetscTrFree)((void*)(a),__LINE__,PETSC_FUNCTION_NAME,__FILE__) || ((a) = NULL,0)) 1154d382aafbSBarry Smith 1155d382aafbSBarry Smith /*MC 1156d382aafbSBarry Smith PetscFree2 - Frees 2 chunks of memory obtained with PetscMalloc2() 1157d382aafbSBarry Smith 1158eca87e8dSBarry Smith Synopsis: 1159aaa7dc30SBarry Smith #include <petscsys.h> 1160eca87e8dSBarry Smith PetscErrorCode PetscFree2(void *memory1,void *memory2) 1161eca87e8dSBarry Smith 1162eca87e8dSBarry Smith Not Collective 1163eca87e8dSBarry Smith 1164e28ce29aSPatrick Sanan Input Parameters: 1165d382aafbSBarry Smith + memory1 - memory to free 1166d382aafbSBarry Smith - memory2 - 2nd memory to free 1167d382aafbSBarry Smith 1168d382aafbSBarry Smith Level: developer 1169d382aafbSBarry Smith 117095452b02SPatrick Sanan Notes: 117195452b02SPatrick Sanan Memory must have been obtained with PetscMalloc2() 1172d382aafbSBarry Smith 1173d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree() 1174d382aafbSBarry Smith 1175d382aafbSBarry Smith M*/ 1176ba282f50SJed Brown #define PetscFree2(m1,m2) PetscFreeA(2,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2)) 1177d382aafbSBarry Smith 1178d382aafbSBarry Smith /*MC 1179d382aafbSBarry Smith PetscFree3 - Frees 3 chunks of memory obtained with PetscMalloc3() 1180d382aafbSBarry Smith 1181eca87e8dSBarry Smith Synopsis: 1182aaa7dc30SBarry Smith #include <petscsys.h> 1183eca87e8dSBarry Smith PetscErrorCode PetscFree3(void *memory1,void *memory2,void *memory3) 1184eca87e8dSBarry Smith 1185eca87e8dSBarry Smith Not Collective 1186eca87e8dSBarry Smith 1187e28ce29aSPatrick Sanan Input Parameters: 1188d382aafbSBarry Smith + memory1 - memory to free 1189d382aafbSBarry Smith . memory2 - 2nd memory to free 1190d382aafbSBarry Smith - memory3 - 3rd memory to free 1191d382aafbSBarry Smith 1192d382aafbSBarry Smith Level: developer 1193d382aafbSBarry Smith 119495452b02SPatrick Sanan Notes: 119595452b02SPatrick Sanan Memory must have been obtained with PetscMalloc3() 1196d382aafbSBarry Smith 1197d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3() 1198d382aafbSBarry Smith 1199d382aafbSBarry Smith M*/ 1200ba282f50SJed Brown #define PetscFree3(m1,m2,m3) PetscFreeA(3,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2),&(m3)) 1201d382aafbSBarry Smith 1202d382aafbSBarry Smith /*MC 1203d382aafbSBarry Smith PetscFree4 - Frees 4 chunks of memory obtained with PetscMalloc4() 1204d382aafbSBarry Smith 1205eca87e8dSBarry Smith Synopsis: 1206aaa7dc30SBarry Smith #include <petscsys.h> 1207eca87e8dSBarry Smith PetscErrorCode PetscFree4(void *m1,void *m2,void *m3,void *m4) 1208eca87e8dSBarry Smith 1209eca87e8dSBarry Smith Not Collective 1210eca87e8dSBarry Smith 1211e28ce29aSPatrick Sanan Input Parameters: 1212d382aafbSBarry Smith + m1 - memory to free 1213d382aafbSBarry Smith . m2 - 2nd memory to free 1214d382aafbSBarry Smith . m3 - 3rd memory to free 1215d382aafbSBarry Smith - m4 - 4th memory to free 1216d382aafbSBarry Smith 1217d382aafbSBarry Smith Level: developer 1218d382aafbSBarry Smith 121995452b02SPatrick Sanan Notes: 122095452b02SPatrick Sanan Memory must have been obtained with PetscMalloc4() 1221d382aafbSBarry Smith 1222d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3(), PetscMalloc4() 1223d382aafbSBarry Smith 1224d382aafbSBarry Smith M*/ 1225ba282f50SJed Brown #define PetscFree4(m1,m2,m3,m4) PetscFreeA(4,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2),&(m3),&(m4)) 1226d382aafbSBarry Smith 1227d382aafbSBarry Smith /*MC 1228d382aafbSBarry Smith PetscFree5 - Frees 5 chunks of memory obtained with PetscMalloc5() 1229d382aafbSBarry Smith 1230eca87e8dSBarry Smith Synopsis: 1231aaa7dc30SBarry Smith #include <petscsys.h> 1232eca87e8dSBarry Smith PetscErrorCode PetscFree5(void *m1,void *m2,void *m3,void *m4,void *m5) 1233eca87e8dSBarry Smith 1234eca87e8dSBarry Smith Not Collective 1235eca87e8dSBarry Smith 1236e28ce29aSPatrick Sanan Input Parameters: 1237d382aafbSBarry Smith + m1 - memory to free 1238d382aafbSBarry Smith . m2 - 2nd memory to free 1239d382aafbSBarry Smith . m3 - 3rd memory to free 1240d382aafbSBarry Smith . m4 - 4th memory to free 1241d382aafbSBarry Smith - m5 - 5th memory to free 1242d382aafbSBarry Smith 1243d382aafbSBarry Smith Level: developer 1244d382aafbSBarry Smith 124595452b02SPatrick Sanan Notes: 124695452b02SPatrick Sanan Memory must have been obtained with PetscMalloc5() 1247d382aafbSBarry Smith 1248d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3(), PetscMalloc4(), PetscMalloc5() 1249d382aafbSBarry Smith 1250d382aafbSBarry Smith M*/ 1251ba282f50SJed Brown #define PetscFree5(m1,m2,m3,m4,m5) PetscFreeA(5,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2),&(m3),&(m4),&(m5)) 1252d382aafbSBarry Smith 1253d382aafbSBarry Smith /*MC 1254d382aafbSBarry Smith PetscFree6 - Frees 6 chunks of memory obtained with PetscMalloc6() 1255d382aafbSBarry Smith 1256eca87e8dSBarry Smith Synopsis: 1257aaa7dc30SBarry Smith #include <petscsys.h> 1258eca87e8dSBarry Smith PetscErrorCode PetscFree6(void *m1,void *m2,void *m3,void *m4,void *m5,void *m6) 1259eca87e8dSBarry Smith 1260eca87e8dSBarry Smith Not Collective 1261eca87e8dSBarry Smith 1262e28ce29aSPatrick Sanan Input Parameters: 1263d382aafbSBarry Smith + m1 - memory to free 1264d382aafbSBarry Smith . m2 - 2nd memory to free 1265d382aafbSBarry Smith . m3 - 3rd memory to free 1266d382aafbSBarry Smith . m4 - 4th memory to free 1267d382aafbSBarry Smith . m5 - 5th memory to free 1268d382aafbSBarry Smith - m6 - 6th memory to free 1269d382aafbSBarry Smith 1270d382aafbSBarry Smith Level: developer 1271d382aafbSBarry Smith 127295452b02SPatrick Sanan Notes: 127395452b02SPatrick Sanan Memory must have been obtained with PetscMalloc6() 1274d382aafbSBarry Smith 1275d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3(), PetscMalloc4(), PetscMalloc5(), PetscMalloc6() 1276d382aafbSBarry Smith 1277d382aafbSBarry Smith M*/ 1278ba282f50SJed Brown #define PetscFree6(m1,m2,m3,m4,m5,m6) PetscFreeA(6,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2),&(m3),&(m4),&(m5),&(m6)) 1279d382aafbSBarry Smith 1280d382aafbSBarry Smith /*MC 1281d382aafbSBarry Smith PetscFree7 - Frees 7 chunks of memory obtained with PetscMalloc7() 1282d382aafbSBarry Smith 1283eca87e8dSBarry Smith Synopsis: 1284aaa7dc30SBarry Smith #include <petscsys.h> 1285eca87e8dSBarry Smith PetscErrorCode PetscFree7(void *m1,void *m2,void *m3,void *m4,void *m5,void *m6,void *m7) 1286eca87e8dSBarry Smith 1287eca87e8dSBarry Smith Not Collective 1288eca87e8dSBarry Smith 1289e28ce29aSPatrick Sanan Input Parameters: 1290d382aafbSBarry Smith + m1 - memory to free 1291d382aafbSBarry Smith . m2 - 2nd memory to free 1292d382aafbSBarry Smith . m3 - 3rd memory to free 1293d382aafbSBarry Smith . m4 - 4th memory to free 1294d382aafbSBarry Smith . m5 - 5th memory to free 1295d382aafbSBarry Smith . m6 - 6th memory to free 1296d382aafbSBarry Smith - m7 - 7th memory to free 1297d382aafbSBarry Smith 1298d382aafbSBarry Smith Level: developer 1299d382aafbSBarry Smith 130095452b02SPatrick Sanan Notes: 130195452b02SPatrick Sanan Memory must have been obtained with PetscMalloc7() 1302d382aafbSBarry Smith 1303d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3(), PetscMalloc4(), PetscMalloc5(), PetscMalloc6(), 1304d382aafbSBarry Smith PetscMalloc7() 1305d382aafbSBarry Smith 1306d382aafbSBarry Smith M*/ 1307ba282f50SJed Brown #define PetscFree7(m1,m2,m3,m4,m5,m6,m7) PetscFreeA(7,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2),&(m3),&(m4),&(m5),&(m6),&(m7)) 1308d382aafbSBarry Smith 1309ba282f50SJed Brown PETSC_EXTERN PetscErrorCode PetscMallocA(int,PetscBool,int,const char *,const char *,size_t,void *,...); 1310ba282f50SJed Brown PETSC_EXTERN PetscErrorCode PetscFreeA(int,int,const char *,const char *,void *,...); 1311071fcb05SBarry Smith PETSC_EXTERN PetscErrorCode (*PetscTrMalloc)(size_t,PetscBool,int,const char[],const char[],void**); 1312efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode (*PetscTrFree)(void*,int,const char[],const char[]); 13133221ece2SMatthew G. Knepley PETSC_EXTERN PetscErrorCode (*PetscTrRealloc)(size_t,int,const char[],const char[],void**); 1314ba282f50SJed Brown PETSC_EXTERN PetscErrorCode PetscMallocSetCoalesce(PetscBool); 131592f119d6SBarry 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 **)); 1316014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMallocClear(void); 1317d382aafbSBarry Smith 1318d382aafbSBarry Smith /* 1319c1706be6SHong 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. 1320c1706be6SHong Zhang */ 1321c1706be6SHong Zhang PETSC_EXTERN PetscErrorCode PetscMallocSetDRAM(void); 1322c1706be6SHong Zhang PETSC_EXTERN PetscErrorCode PetscMallocResetDRAM(void); 132331f06eaaSHong Zhang #if defined(PETSC_HAVE_CUDA) 132431f06eaaSHong Zhang PETSC_EXTERN PetscErrorCode PetscMallocSetCUDAHost(void); 132531f06eaaSHong Zhang PETSC_EXTERN PetscErrorCode PetscMallocResetCUDAHost(void); 132631f06eaaSHong Zhang #endif 132759af0bd3SScott Kruger #if defined(PETSC_HAVE_HIP) 132859af0bd3SScott Kruger PETSC_EXTERN PetscErrorCode PetscMallocSetHIPHost(void); 132959af0bd3SScott Kruger PETSC_EXTERN PetscErrorCode PetscMallocResetHIPHost(void); 133059af0bd3SScott Kruger #endif 133159af0bd3SScott Kruger 1332a5057860SBarry Smith #define MPIU_PETSCLOGDOUBLE MPI_DOUBLE 133336763ca0SBas van 't Hof #define MPIU_2PETSCLOGDOUBLE MPI_2DOUBLE_PRECISION 1334a5057860SBarry Smith 1335a5057860SBarry Smith /* 133666d669d6SBarry Smith Routines for tracing memory corruption/bleeding with default PETSc memory allocation 1337d382aafbSBarry Smith */ 1338014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMallocDump(FILE *); 133992f119d6SBarry Smith PETSC_EXTERN PetscErrorCode PetscMallocView(FILE *); 1340014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMallocGetCurrentUsage(PetscLogDouble *); 1341014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMallocGetMaximumUsage(PetscLogDouble *); 1342e3ed9ee7SBarry Smith PETSC_EXTERN PetscErrorCode PetscMallocPushMaximumUsage(int); 1343e3ed9ee7SBarry Smith PETSC_EXTERN PetscErrorCode PetscMallocPopMaximumUsage(int,PetscLogDouble*); 134492f119d6SBarry Smith PETSC_EXTERN PetscErrorCode PetscMallocSetDebug(PetscBool,PetscBool); 134592f119d6SBarry Smith PETSC_EXTERN PetscErrorCode PetscMallocGetDebug(PetscBool*,PetscBool*,PetscBool*); 1346efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode PetscMallocValidate(int,const char[],const char[]); 134792f119d6SBarry Smith PETSC_EXTERN PetscErrorCode PetscMallocViewSet(PetscLogDouble); 134892f119d6SBarry Smith PETSC_EXTERN PetscErrorCode PetscMallocViewGet(PetscBool*); 1349608c71bfSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscMallocLogRequestedSizeSet(PetscBool); 1350608c71bfSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscMallocLogRequestedSizeGet(PetscBool*); 1351d382aafbSBarry Smith 13526a6fc655SJed Brown PETSC_EXTERN const char *const PetscDataTypes[]; 1353014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDataTypeToMPIDataType(PetscDataType,MPI_Datatype*); 1354014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMPIDataTypeToPetscDataType(MPI_Datatype,PetscDataType*); 1355014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDataTypeGetSize(PetscDataType,size_t*); 13568e4b2d1dSBarry Smith PETSC_EXTERN PetscErrorCode PetscDataTypeFromString(const char*,PetscDataType*,PetscBool*); 1357d382aafbSBarry Smith 1358d382aafbSBarry Smith /* 1359d382aafbSBarry Smith Basic memory and string operations. These are usually simple wrappers 1360d382aafbSBarry Smith around the basic Unix system calls, but a few of them have additional 1361d382aafbSBarry Smith functionality and/or error checking. 1362d382aafbSBarry Smith */ 1363014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMemcmp(const void*,const void*,size_t,PetscBool *); 1364014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrlen(const char[],size_t*); 1365d67fe73bSBarry Smith PETSC_EXTERN PetscErrorCode PetscStrToArray(const char[],char,int*,char ***); 1366014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrToArrayDestroy(int,char **); 1367014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrcmp(const char[],const char[],PetscBool *); 1368014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrgrt(const char[],const char[],PetscBool *); 1369014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrcasecmp(const char[],const char[],PetscBool *); 1370014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrncmp(const char[],const char[],size_t,PetscBool *); 1371014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrcpy(char[],const char[]); 1372014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrcat(char[],const char[]); 1373a126751eSBarry Smith PETSC_EXTERN PetscErrorCode PetscStrlcat(char[],const char[],size_t); 1374014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrncpy(char[],const char[],size_t); 1375014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrchr(const char[],char,char *[]); 1376014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrtolower(char[]); 13772f234a98SBarry Smith PETSC_EXTERN PetscErrorCode PetscStrtoupper(char[]); 1378014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrrchr(const char[],char,char *[]); 1379014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrstr(const char[],const char[],char *[]); 1380014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrrstr(const char[],const char[],char *[]); 1381014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrendswith(const char[],const char[],PetscBool*); 13822c9581d2SBarry Smith PETSC_EXTERN PetscErrorCode PetscStrbeginswith(const char[],const char[],PetscBool*); 1383014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrendswithwhich(const char[],const char *const*,PetscInt*); 1384014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrallocpy(const char[],char *[]); 138547340559SBarry Smith PETSC_EXTERN PetscErrorCode PetscStrArrayallocpy(const char *const*,char***); 13866fed8037SJed Brown PETSC_EXTERN PetscErrorCode PetscStrArrayDestroy(char***); 13876991f827SBarry Smith PETSC_EXTERN PetscErrorCode PetscStrNArrayallocpy(PetscInt,const char *const*,char***); 13886991f827SBarry Smith PETSC_EXTERN PetscErrorCode PetscStrNArrayDestroy(PetscInt,char***); 1389014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrreplace(MPI_Comm,const char[],char[],size_t); 1390d382aafbSBarry Smith 1391573b0fb4SBarry Smith PETSC_EXTERN void PetscStrcmpNoError(const char[],const char[],PetscBool *); 1392573b0fb4SBarry Smith 1393014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscTokenCreate(const char[],const char,PetscToken*); 1394014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscTokenFind(PetscToken,char *[]); 1395014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscTokenDestroy(PetscToken*); 1396d382aafbSBarry Smith 1397e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscStrInList(const char[],const char[],char,PetscBool*); 1398a53986e1SJed Brown PETSC_EXTERN PetscErrorCode PetscEListFind(PetscInt,const char *const*,const char*,PetscInt*,PetscBool*); 1399a53986e1SJed Brown PETSC_EXTERN PetscErrorCode PetscEnumFind(const char *const*,const char*,PetscEnum*,PetscBool*); 1400a53986e1SJed Brown 1401d382aafbSBarry Smith /* 1402d382aafbSBarry Smith These are MPI operations for MPI_Allreduce() etc 1403d382aafbSBarry Smith */ 1404367daffbSBarry Smith PETSC_EXTERN MPI_Op MPIU_MAXSUM_OP; 1405570b7f6dSBarry Smith #if defined(PETSC_USE_REAL___FLOAT128) || defined(PETSC_USE_REAL___FP16) 1406de272c7aSSatish Balay PETSC_EXTERN MPI_Op MPIU_SUM; 1407014dd563SJed Brown PETSC_EXTERN MPI_Op MPIU_MAX; 1408014dd563SJed Brown PETSC_EXTERN MPI_Op MPIU_MIN; 1409d9822059SBarry Smith #else 1410de272c7aSSatish Balay #define MPIU_SUM MPI_SUM 1411d9822059SBarry Smith #define MPIU_MAX MPI_MAX 1412d9822059SBarry Smith #define MPIU_MIN MPI_MIN 1413d9822059SBarry Smith #endif 1414014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMaxSum(MPI_Comm,const PetscInt[],PetscInt*,PetscInt*); 1415d382aafbSBarry Smith 1416014dd563SJed Brown PETSC_EXTERN PetscErrorCode MPIULong_Send(void*,PetscInt,MPI_Datatype,PetscMPIInt,PetscMPIInt,MPI_Comm); 1417014dd563SJed Brown PETSC_EXTERN PetscErrorCode MPIULong_Recv(void*,PetscInt,MPI_Datatype,PetscMPIInt,PetscMPIInt,MPI_Comm); 1418eb3f98d2SBarry Smith 141995c0884eSLisandro Dalcin PETSC_EXTERN const char *const PetscFileModes[]; 1420d6a4318aSJed Brown 1421639ff905SBarry Smith /* 1422639ff905SBarry Smith Defines PETSc error handling. 1423639ff905SBarry Smith */ 1424639ff905SBarry Smith #include <petscerror.h> 1425d382aafbSBarry Smith 14260700a824SBarry Smith #define PETSC_SMALLEST_CLASSID 1211211 1427014dd563SJed Brown PETSC_EXTERN PetscClassId PETSC_LARGEST_CLASSID; 1428014dd563SJed Brown PETSC_EXTERN PetscClassId PETSC_OBJECT_CLASSID; 1429014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscClassIdRegister(const char[],PetscClassId *); 143081256985SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscObjectGetId(PetscObject,PetscObjectId*); 143181256985SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscObjectCompareId(PetscObject,PetscObjectId,PetscBool*); 143281256985SMatthew G. Knepley 1433d382aafbSBarry Smith /* 1434d382aafbSBarry Smith Routines that get memory usage information from the OS 1435d382aafbSBarry Smith */ 1436014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMemoryGetCurrentUsage(PetscLogDouble *); 1437014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMemoryGetMaximumUsage(PetscLogDouble *); 1438014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMemorySetGetMaximumUsage(void); 1439b44d5720SBarry Smith PETSC_EXTERN PetscErrorCode PetscMemoryTrace(const char[]); 1440d382aafbSBarry Smith 1441014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSleep(PetscReal); 1442d382aafbSBarry Smith 1443d382aafbSBarry Smith /* 1444d382aafbSBarry Smith Initialization of PETSc 1445d382aafbSBarry Smith */ 1446014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscInitialize(int*,char***,const char[],const char[]); 1447014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscInitializeNoPointers(int,char**,const char[],const char[]); 1448014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscInitializeNoArguments(void); 1449014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscInitialized(PetscBool *); 1450014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFinalized(PetscBool *); 1451014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFinalize(void); 1452014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscInitializeFortran(void); 1453014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetArgs(int*,char ***); 1454014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetArguments(char ***); 1455014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFreeArguments(char **); 1456d382aafbSBarry Smith 1457014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscEnd(void); 1458607a6623SBarry Smith PETSC_EXTERN PetscErrorCode PetscSysInitializePackage(void); 1459d382aafbSBarry Smith 1460014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPythonInitialize(const char[],const char[]); 1461014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPythonFinalize(void); 1462014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPythonPrintError(void); 1463014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPythonMonitorSet(PetscObject,const char[]); 1464d382aafbSBarry Smith 1465a50e088cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscMonitorCompare(PetscErrorCode (*)(void),void *,PetscErrorCode (*)(void**),PetscErrorCode (*)(void),void *,PetscErrorCode (*)(void**),PetscBool *); 1466a50e088cSMatthew G. Knepley 1467d382aafbSBarry Smith /* 1468d382aafbSBarry Smith These are so that in extern C code we can caste function pointers to non-extern C 14692981ebdbSBarry Smith function pointers. Since the regular C++ code expects its function pointers to be C++ 1470d382aafbSBarry Smith */ 1471638cfed1SJed Brown PETSC_EXTERN_TYPEDEF typedef void (**PetscVoidStarFunction)(void); 1472638cfed1SJed Brown PETSC_EXTERN_TYPEDEF typedef void (*PetscVoidFunction)(void); 1473638cfed1SJed Brown PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*PetscErrorCodeFunction)(void); 1474d382aafbSBarry Smith 1475d382aafbSBarry Smith /* 1476d382aafbSBarry Smith Functions that can act on any PETSc object. 1477d382aafbSBarry Smith */ 1478014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectDestroy(PetscObject*); 1479014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetComm(PetscObject,MPI_Comm *); 1480014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetClassId(PetscObject,PetscClassId *); 1481014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetClassName(PetscObject,const char *[]); 1482014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectSetType(PetscObject,const char []); 1483014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetType(PetscObject,const char *[]); 1484014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectSetName(PetscObject,const char[]); 1485014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetName(PetscObject,const char*[]); 1486014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectSetTabLevel(PetscObject,PetscInt); 1487014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetTabLevel(PetscObject,PetscInt*); 1488014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectIncrementTabLevel(PetscObject,PetscObject,PetscInt); 1489014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectReference(PetscObject); 1490014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetReference(PetscObject,PetscInt*); 1491014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectDereference(PetscObject); 1492014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetNewTag(PetscObject,PetscMPIInt*); 1493014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectCompose(PetscObject,const char[],PetscObject); 1494014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectRemoveReference(PetscObject,const char[]); 1495014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectQuery(PetscObject,const char[],PetscObject*); 1496bdf89e91SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectComposeFunction_Private(PetscObject,const char[],void (*)(void)); 1497bdf89e91SBarry Smith #define PetscObjectComposeFunction(a,b,d) PetscObjectComposeFunction_Private(a,b,(PetscVoidFunction)(d)) 1498014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectSetFromOptions(PetscObject); 1499014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectSetUp(PetscObject); 15000eb63584SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectSetPrintedOptions(PetscObject); 15010eb63584SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectInheritPrintedOptions(PetscObject,PetscObject); 1502014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscCommGetNewTag(MPI_Comm,PetscMPIInt*); 1503d382aafbSBarry Smith 1504665c2dedSJed Brown #include <petscviewertypes.h> 1505639ff905SBarry Smith #include <petscoptions.h> 1506639ff905SBarry Smith 1507608c71bfSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscMallocTraceSet(PetscViewer,PetscBool,PetscLogDouble); 1508608c71bfSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscMallocTraceGet(PetscBool*); 1509608c71bfSMatthew G. Knepley 15100633abcbSJed Brown PETSC_EXTERN PetscErrorCode PetscObjectsListGetGlobalNumbering(MPI_Comm,PetscInt,PetscObject*,PetscInt*,PetscInt*); 15110633abcbSJed Brown 1512c5e4d11fSDmitry Karpeev PETSC_EXTERN PetscErrorCode PetscMemoryView(PetscViewer,const char[]); 1513dae58748SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectPrintClassNamePrefixType(PetscObject,PetscViewer); 1514639ff905SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectView(PetscObject,PetscViewer); 15150005d66cSJed Brown #define PetscObjectQueryFunction(obj,name,fptr) PetscObjectQueryFunction_Private((obj),(name),(PetscVoidFunction*)(fptr)) 15160005d66cSJed Brown PETSC_EXTERN PetscErrorCode PetscObjectQueryFunction_Private(PetscObject,const char[],void (**)(void)); 1517014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectSetOptionsPrefix(PetscObject,const char[]); 1518014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectAppendOptionsPrefix(PetscObject,const char[]); 1519014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectPrependOptionsPrefix(PetscObject,const char[]); 1520014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetOptionsPrefix(PetscObject,const char*[]); 1521014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectChangeTypeName(PetscObject,const char[]); 1522014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectRegisterDestroy(PetscObject); 1523014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectRegisterDestroyAll(void); 1524685405a1SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectViewFromOptions(PetscObject,PetscObject,const char[]); 1525014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectName(PetscObject); 1526014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectTypeCompare(PetscObject,const char[],PetscBool *); 15274099cc6bSBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectBaseTypeCompare(PetscObject,const char[],PetscBool *); 1528014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectTypeCompareAny(PetscObject,PetscBool*,const char[],...); 1529b9e7e5c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectBaseTypeCompareAny(PetscObject,PetscBool*,const char[],...); 1530014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRegisterFinalize(PetscErrorCode (*)(void)); 1531014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRegisterFinalizeAll(void); 1532d382aafbSBarry Smith 1533e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 15347aab2a10SBarry Smith PETSC_EXTERN PetscErrorCode PetscSAWsBlock(void); 1535e04113cfSBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectSAWsViewOff(PetscObject); 1536e04113cfSBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectSAWsSetBlock(PetscObject,PetscBool); 1537e04113cfSBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectSAWsBlock(PetscObject); 1538e04113cfSBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectSAWsGrantAccess(PetscObject); 1539e04113cfSBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectSAWsTakeAccess(PetscObject); 1540e04113cfSBarry Smith PETSC_EXTERN void PetscStackSAWsGrantAccess(void); 1541e04113cfSBarry Smith PETSC_EXTERN void PetscStackSAWsTakeAccess(void); 1542e04113cfSBarry Smith PETSC_EXTERN PetscErrorCode PetscStackViewSAWs(void); 1543e04113cfSBarry Smith PETSC_EXTERN PetscErrorCode PetscStackSAWsViewOff(void); 154415681b3cSBarry Smith 1545ec7429eaSBarry Smith #else 15467aab2a10SBarry Smith #define PetscSAWsBlock() 0 1547e04113cfSBarry Smith #define PetscObjectSAWsViewOff(obj) 0 1548e04113cfSBarry Smith #define PetscObjectSAWsSetBlock(obj,flg) 0 1549e04113cfSBarry Smith #define PetscObjectSAWsBlock(obj) 0 1550e04113cfSBarry Smith #define PetscObjectSAWsGrantAccess(obj) 0 1551e04113cfSBarry Smith #define PetscObjectSAWsTakeAccess(obj) 0 1552e04113cfSBarry Smith #define PetscStackViewSAWs() 0 1553e04113cfSBarry Smith #define PetscStackSAWsViewOff() 0 1554e04113cfSBarry Smith #define PetscStackSAWsTakeAccess() 1555e04113cfSBarry Smith #define PetscStackSAWsGrantAccess() 155615681b3cSBarry Smith 1557ec7429eaSBarry Smith #endif 1558b90c6cbeSBarry Smith 155982b97d80SJed Brown PETSC_EXTERN PetscErrorCode PetscDLOpen(const char[],PetscDLMode,PetscDLHandle *); 156082b97d80SJed Brown PETSC_EXTERN PetscErrorCode PetscDLClose(PetscDLHandle *); 156182b97d80SJed Brown PETSC_EXTERN PetscErrorCode PetscDLSym(PetscDLHandle,const char[],void **); 1562258ec3d2SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscDLAddr(void (*)(void), char **); 1563258ec3d2SMatthew G. Knepley #ifdef PETSC_HAVE_CXX 1564258ec3d2SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscDemangleSymbol(const char *, char **); 1565258ec3d2SMatthew G. Knepley #endif 15667d5d4d99SBarry Smith 15675fe58b6fSBarry Smith #if defined(PETSC_USE_DEBUG) 1568a64a8e02SBarry Smith PETSC_EXTERN PetscErrorCode PetscMallocGetStack(void*,PetscStack**); 15695fe58b6fSBarry Smith #endif 15707eb1d149SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectsDump(FILE*,PetscBool); 1571a64a8e02SBarry Smith 1572140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectListDestroy(PetscObjectList*); 1573140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectListFind(PetscObjectList,const char[],PetscObject*); 1574140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectListReverseFind(PetscObjectList,PetscObject,char**,PetscBool*); 1575140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectListAdd(PetscObjectList *,const char[],PetscObject); 1576140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectListRemoveReference(PetscObjectList *,const char[]); 1577140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectListDuplicate(PetscObjectList,PetscObjectList *); 1578d382aafbSBarry Smith 1579d382aafbSBarry Smith /* 1580503cfb0cSBarry Smith Dynamic library lists. Lists of names of routines in objects or in dynamic 1581d382aafbSBarry Smith link libraries that will be loaded as needed. 1582d382aafbSBarry Smith */ 1583a240a19fSJed Brown 1584a240a19fSJed Brown #define PetscFunctionListAdd(list,name,fptr) PetscFunctionListAdd_Private((list),(name),(PetscVoidFunction)(fptr)) 1585a240a19fSJed Brown PETSC_EXTERN PetscErrorCode PetscFunctionListAdd_Private(PetscFunctionList*,const char[],void (*)(void)); 1586140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscFunctionListDestroy(PetscFunctionList*); 15871c9cd337SJed Brown #define PetscFunctionListFind(list,name,fptr) PetscFunctionListFind_Private((list),(name),(PetscVoidFunction*)(fptr)) 15881c9cd337SJed Brown PETSC_EXTERN PetscErrorCode PetscFunctionListFind_Private(PetscFunctionList,const char[],void (**)(void)); 158944ef3d73SBarry Smith PETSC_EXTERN PetscErrorCode PetscFunctionListPrintTypes(MPI_Comm,FILE*,const char[],const char[],const char[],const char[],PetscFunctionList,const char[],const char[]); 1590140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscFunctionListDuplicate(PetscFunctionList,PetscFunctionList *); 1591140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscFunctionListView(PetscFunctionList,PetscViewer); 1592140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscFunctionListGet(PetscFunctionList,const char ***,int*); 1593d382aafbSBarry Smith 1594014dd563SJed Brown PETSC_EXTERN PetscDLLibrary PetscDLLibrariesLoaded; 1595014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDLLibraryAppend(MPI_Comm,PetscDLLibrary *,const char[]); 1596014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDLLibraryPrepend(MPI_Comm,PetscDLLibrary *,const char[]); 1597014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDLLibrarySym(MPI_Comm,PetscDLLibrary *,const char[],const char[],void **); 1598014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDLLibraryPrintPath(PetscDLLibrary); 1599014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDLLibraryRetrieve(MPI_Comm,const char[],char *,size_t,PetscBool *); 1600014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDLLibraryOpen(MPI_Comm,const char[],PetscDLLibrary *); 1601014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDLLibraryClose(PetscDLLibrary); 1602d382aafbSBarry Smith 1603d382aafbSBarry Smith /* 1604d382aafbSBarry Smith Useful utility routines 1605d382aafbSBarry Smith */ 1606014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSplitOwnership(MPI_Comm,PetscInt*,PetscInt*); 1607014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSplitOwnershipBlock(MPI_Comm,PetscInt,PetscInt*,PetscInt*); 1608d24d4204SJose E. Roman PETSC_EXTERN PetscErrorCode PetscSplitOwnershipEqual(MPI_Comm,PetscInt*,PetscInt*); 1609014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSequentialPhaseBegin(MPI_Comm,PetscMPIInt); 1610014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSequentialPhaseEnd(MPI_Comm,PetscMPIInt); 1611014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscBarrier(PetscObject); 1612014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMPIDump(FILE*); 1613dd438433SSatish Balay PETSC_EXTERN PetscErrorCode PetscGlobalMinMaxInt(MPI_Comm,PetscInt[2],PetscInt[2]); 1614dd438433SSatish Balay PETSC_EXTERN PetscErrorCode PetscGlobalMinMaxReal(MPI_Comm,PetscReal[2],PetscReal[2]); 1615d382aafbSBarry Smith 161664ac3b0dSPatrick Sanan /*MC 1617ace3abfcSBarry Smith PetscNot - negates a logical type value and returns result as a PetscBool 1618503cfb0cSBarry Smith 1619e28ce29aSPatrick Sanan Notes: 1620e28ce29aSPatrick Sanan This is useful in cases like 1621503cfb0cSBarry Smith $ int *a; 1622ace3abfcSBarry Smith $ PetscBool flag = PetscNot(a) 16231cc8b206SBarry Smith where !a would not return a PetscBool because we cannot provide a cast from int to PetscBool in C. 162464ac3b0dSPatrick Sanan 162564ac3b0dSPatrick Sanan Level: beginner 162664ac3b0dSPatrick Sanan 162764ac3b0dSPatrick Sanan .seealso : PetscBool, PETSC_TRUE, PETSC_FALSE 162864ac3b0dSPatrick Sanan M*/ 1629d382aafbSBarry Smith #define PetscNot(a) ((a) ? PETSC_FALSE : PETSC_TRUE) 1630503cfb0cSBarry Smith 1631d382aafbSBarry Smith /*MC 1632d382aafbSBarry Smith PetscHelpPrintf - Prints help messages. 1633d382aafbSBarry Smith 1634d382aafbSBarry Smith Synopsis: 1635aaa7dc30SBarry Smith #include <petscsys.h> 1636659f7ba0SBarry Smith PetscErrorCode (*PetscHelpPrintf)(MPI_Comm comm, const char format[],args); 1637d382aafbSBarry Smith 1638659f7ba0SBarry Smith Collective on comm 1639eca87e8dSBarry Smith 1640d382aafbSBarry Smith Input Parameters: 1641659f7ba0SBarry Smith + comm - the MPI communicator over which the help message is printed 1642d382aafbSBarry Smith . format - the usual printf() format string 1643659f7ba0SBarry Smith - args - arguments to be printed 1644d382aafbSBarry Smith 1645d382aafbSBarry Smith Level: developer 1646d382aafbSBarry Smith 1647d382aafbSBarry Smith Fortran Note: 1648d382aafbSBarry Smith This routine is not supported in Fortran. 1649d382aafbSBarry Smith 1650659f7ba0SBarry Smith Note: 1651659f7ba0SBarry Smith You can change how help messages are printed by replacing the function pointer with a function that does not simply write to stdout. 1652659f7ba0SBarry Smith 1653659f7ba0SBarry Smith To use, write your own function, for example, 1654659f7ba0SBarry Smith $PetscErrorCode mypetschelpprintf(MPI_Comm comm,const char format[],....) 1655659f7ba0SBarry Smith ${ 1656659f7ba0SBarry Smith $ PetscFunctionReturn(0); 1657659f7ba0SBarry Smith $} 1658659f7ba0SBarry Smith then do the assigment 1659659f7ba0SBarry Smith $ PetscHelpPrintf = mypetschelpprintf; 1660659f7ba0SBarry Smith You can do the assignment before PetscInitialize(). 1661659f7ba0SBarry Smith 1662659f7ba0SBarry Smith The default routine used is called PetscHelpPrintfDefault(). 1663d382aafbSBarry Smith 1664d382aafbSBarry Smith .seealso: PetscFPrintf(), PetscSynchronizedPrintf(), PetscErrorPrintf() 1665d382aafbSBarry Smith M*/ 1666014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscHelpPrintf)(MPI_Comm,const char[],...); 1667d382aafbSBarry Smith 1668fcfd50ebSBarry Smith /* 1669fcfd50ebSBarry Smith Defines PETSc profiling. 1670fcfd50ebSBarry Smith */ 16712c8e378dSBarry Smith #include <petsclog.h> 1672fcfd50ebSBarry Smith 1673fcfd50ebSBarry Smith /* 1674fcfd50ebSBarry Smith Simple PETSc parallel IO for ASCII printing 1675fcfd50ebSBarry Smith */ 1676014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFixFilename(const char[],char[]); 1677014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFOpen(MPI_Comm,const char[],const char[],FILE**); 1678014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFClose(MPI_Comm,FILE*); 1679014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFPrintf(MPI_Comm,FILE*,const char[],...); 1680014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPrintf(MPI_Comm,const char[],...); 1681014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSNPrintf(char*,size_t,const char [],...); 1682014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSNPrintfCount(char*,size_t,const char [],size_t*,...); 16831b5687a1SBarry Smith PETSC_EXTERN PetscErrorCode PetscFormatRealArray(char[],size_t,const char*,PetscInt,const PetscReal[]); 1684fcfd50ebSBarry Smith 1685014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscErrorPrintfDefault(const char [],...); 1686014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscErrorPrintfNone(const char [],...); 1687014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscHelpPrintfDefault(MPI_Comm,const char [],...); 1688d382aafbSBarry Smith 1689d781fa04SBarry Smith PETSC_EXTERN PetscErrorCode PetscFormatConvertGetSize(const char*,size_t*); 1690d781fa04SBarry Smith PETSC_EXTERN PetscErrorCode PetscFormatConvert(const char*,char *); 1691d781fa04SBarry Smith 1692d382aafbSBarry Smith #if defined(PETSC_HAVE_POPEN) 1693014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPOpen(MPI_Comm,const char[],const char[],const char[],FILE **); 1694016831caSBarry Smith PETSC_EXTERN PetscErrorCode PetscPClose(MPI_Comm,FILE*); 169574ba8654SBarry Smith PETSC_EXTERN PetscErrorCode PetscPOpenSetMachine(const char[]); 1696d382aafbSBarry Smith #endif 1697d382aafbSBarry Smith 1698014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSynchronizedPrintf(MPI_Comm,const char[],...); 1699014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSynchronizedFPrintf(MPI_Comm,FILE*,const char[],...); 17000ec8b6e3SBarry Smith PETSC_EXTERN PetscErrorCode PetscSynchronizedFlush(MPI_Comm,FILE*); 1701014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSynchronizedFGets(MPI_Comm,FILE*,size_t,char[]); 1702014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStartMatlab(MPI_Comm,const char[],const char[],FILE**); 1703014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStartJava(MPI_Comm,const char[],const char[],FILE**); 1704014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetPetscDir(const char*[]); 1705d382aafbSBarry Smith 1706014dd563SJed Brown PETSC_EXTERN PetscClassId PETSC_CONTAINER_CLASSID; 1707014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscContainerGetPointer(PetscContainer,void**); 1708014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscContainerSetPointer(PetscContainer,void*); 1709014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscContainerDestroy(PetscContainer*); 1710014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscContainerCreate(MPI_Comm,PetscContainer*); 1711014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscContainerSetUserDestroy(PetscContainer,PetscErrorCode (*)(void*)); 1712b61ba218SStefano Zampini PETSC_EXTERN PetscErrorCode PetscContainerUserDestroyDefault(void*); 1713d382aafbSBarry Smith 1714d382aafbSBarry Smith /* 1715d382aafbSBarry Smith For use in debuggers 1716d382aafbSBarry Smith */ 1717014dd563SJed Brown PETSC_EXTERN PetscMPIInt PetscGlobalRank; 1718014dd563SJed Brown PETSC_EXTERN PetscMPIInt PetscGlobalSize; 1719014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscIntView(PetscInt,const PetscInt[],PetscViewer); 1720014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRealView(PetscInt,const PetscReal[],PetscViewer); 1721014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscScalarView(PetscInt,const PetscScalar[],PetscViewer); 1722d382aafbSBarry Smith 1723a663daf8SBarry Smith #include <stddef.h> 1724a3aaec0aSJed Brown #include <string.h> /* for memcpy, memset */ 1725d382aafbSBarry Smith #include <stdlib.h> 17266c7e564aSBarry Smith 17274a92a979SJed Brown #if defined(PETSC_HAVE_XMMINTRIN_H) && !defined(__CUDACC__) 1728d382aafbSBarry Smith #include <xmmintrin.h> 1729d382aafbSBarry Smith #endif 1730d382aafbSBarry Smith 1731d382aafbSBarry Smith /*@C 1732580bdb30SBarry Smith PetscMemmove - Copies n bytes, beginning at location b, to the space 1733580bdb30SBarry Smith beginning at location a. Copying between regions that overlap will 1734580bdb30SBarry Smith take place correctly. Use PetscMemcpy() if the locations do not overlap 1735580bdb30SBarry Smith 1736580bdb30SBarry Smith Not Collective 1737580bdb30SBarry Smith 1738580bdb30SBarry Smith Input Parameters: 1739580bdb30SBarry Smith + b - pointer to initial memory space 1740580bdb30SBarry Smith . a - pointer to copy space 1741580bdb30SBarry Smith - n - length (in bytes) of space to copy 1742580bdb30SBarry Smith 1743580bdb30SBarry Smith Level: intermediate 1744580bdb30SBarry Smith 1745580bdb30SBarry Smith Note: 1746857a15f1SBarry Smith PetscArraymove() is preferred 1747580bdb30SBarry Smith This routine is analogous to memmove(). 1748580bdb30SBarry Smith 1749580bdb30SBarry Smith Developers Note: This is inlined for performance 1750580bdb30SBarry Smith 1751580bdb30SBarry Smith .seealso: PetscMemcpy(), PetscMemcmp(), PetscArrayzero(), PetscMemzero(), PetscArraycmp(), PetscArraycpy(), PetscStrallocpy(), 1752580bdb30SBarry Smith PetscArraymove() 1753580bdb30SBarry Smith @*/ 1754580bdb30SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscMemmove(void *a,const void *b,size_t n) 1755580bdb30SBarry Smith { 1756580bdb30SBarry Smith PetscFunctionBegin; 1757580bdb30SBarry Smith if (n > 0 && !a) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy to null pointer"); 1758580bdb30SBarry Smith if (n > 0 && !b) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy from a null pointer"); 1759580bdb30SBarry Smith #if !defined(PETSC_HAVE_MEMMOVE) 1760580bdb30SBarry Smith if (a < b) { 1761580bdb30SBarry Smith if (a <= b - n) memcpy(a,b,n); 1762580bdb30SBarry Smith else { 1763580bdb30SBarry Smith memcpy(a,b,(int)(b - a)); 1764580bdb30SBarry Smith PetscMemmove(b,b + (int)(b - a),n - (int)(b - a)); 1765580bdb30SBarry Smith } 1766580bdb30SBarry Smith } else { 1767580bdb30SBarry Smith if (b <= a - n) memcpy(a,b,n); 1768580bdb30SBarry Smith else { 1769580bdb30SBarry Smith memcpy(b + n,b + (n - (int)(a - b)),(int)(a - b)); 1770580bdb30SBarry Smith PetscMemmove(a,b,n - (int)(a - b)); 1771580bdb30SBarry Smith } 1772580bdb30SBarry Smith } 1773580bdb30SBarry Smith #else 1774580bdb30SBarry Smith memmove((char*)(a),(char*)(b),n); 1775580bdb30SBarry Smith #endif 1776580bdb30SBarry Smith PetscFunctionReturn(0); 1777580bdb30SBarry Smith } 1778580bdb30SBarry Smith 1779d382aafbSBarry Smith /*@C 1780d382aafbSBarry Smith PetscMemcpy - Copies n bytes, beginning at location b, to the space 1781d382aafbSBarry Smith beginning at location a. The two memory regions CANNOT overlap, use 1782d382aafbSBarry Smith PetscMemmove() in that case. 1783d382aafbSBarry Smith 1784d382aafbSBarry Smith Not Collective 1785d382aafbSBarry Smith 1786d382aafbSBarry Smith Input Parameters: 1787d382aafbSBarry Smith + b - pointer to initial memory space 1788d382aafbSBarry Smith - n - length (in bytes) of space to copy 1789d382aafbSBarry Smith 1790d382aafbSBarry Smith Output Parameter: 1791d382aafbSBarry Smith . a - pointer to copy space 1792d382aafbSBarry Smith 1793d382aafbSBarry Smith Level: intermediate 1794d382aafbSBarry Smith 1795d382aafbSBarry Smith Compile Option: 1796d382aafbSBarry Smith PETSC_PREFER_DCOPY_FOR_MEMCPY will cause the BLAS dcopy() routine to be used 1797d382aafbSBarry Smith for memory copies on double precision values. 1798d382aafbSBarry Smith PETSC_PREFER_COPY_FOR_MEMCPY will cause C code to be used 1799d382aafbSBarry Smith for memory copies on double precision values. 1800d382aafbSBarry Smith PETSC_PREFER_FORTRAN_FORMEMCPY will cause Fortran code to be used 1801d382aafbSBarry Smith for memory copies on double precision values. 1802d382aafbSBarry Smith 1803d382aafbSBarry Smith Note: 1804580bdb30SBarry Smith Prefer PetscArraycpy() 1805d382aafbSBarry Smith This routine is analogous to memcpy(). 18061fd49c25SBarry Smith Not available from Fortran 18071fd49c25SBarry Smith 1808f5f57ec0SBarry Smith Developer Note: this is inlined for fastest performance 1809f5f57ec0SBarry Smith 1810580bdb30SBarry Smith .seealso: PetscMemzero(), PetscMemcmp(), PetscArrayzero(), PetscArraycmp(), PetscArraycpy(), PetscMemmove(), PetscStrallocpy() 1811d382aafbSBarry Smith 1812d382aafbSBarry Smith @*/ 18137087cfbeSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscMemcpy(void *a,const void *b,size_t n) 1814d382aafbSBarry Smith { 1815d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG) 1816c5e4d11fSDmitry Karpeev size_t al = (size_t) a,bl = (size_t) b; 1817c5e4d11fSDmitry Karpeev size_t nl = (size_t) n; 1818a7e36092SMatthew G Knepley PetscFunctionBegin; 1819e32f2f54SBarry Smith if (n > 0 && !b) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy from a null pointer"); 1820e32f2f54SBarry Smith if (n > 0 && !a) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy to a null pointer"); 1821a7e36092SMatthew G Knepley #else 1822d382aafbSBarry Smith PetscFunctionBegin; 1823a7e36092SMatthew G Knepley #endif 1824a47a537aSLisandro Dalcin if (a != b && n > 0) { 1825d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG) 1826e47d2de2SBarry Smith if ((al > bl && (al - bl) < nl) || (bl - al) < nl) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"Memory regions overlap: either use PetscMemmov()\n\ 1827d382aafbSBarry Smith or make sure your copy regions and lengths are correct. \n\ 1828d382aafbSBarry Smith Length (bytes) %ld first address %ld second address %ld",nl,al,bl); 1829d382aafbSBarry Smith #endif 1830d382aafbSBarry Smith #if (defined(PETSC_PREFER_DCOPY_FOR_MEMCPY) || defined(PETSC_PREFER_COPY_FOR_MEMCPY) || defined(PETSC_PREFER_FORTRAN_FORMEMCPY)) 1831c5e4d11fSDmitry Karpeev if (!(a % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) { 1832d382aafbSBarry Smith size_t len = n/sizeof(PetscScalar); 1833d382aafbSBarry Smith #if defined(PETSC_PREFER_DCOPY_FOR_MEMCPY) 1834c5df96a5SBarry Smith PetscBLASInt one = 1,blen; 1835c5df96a5SBarry Smith PetscErrorCode ierr; 1836c5df96a5SBarry Smith ierr = PetscBLASIntCast(len,&blen);CHKERRQ(ierr); 18378b83055fSJed Brown PetscStackCallBLAS("BLAScopy",BLAScopy_(&blen,(PetscScalar *)b,&one,(PetscScalar *)a,&one)); 1838d382aafbSBarry Smith #elif defined(PETSC_PREFER_FORTRAN_FORMEMCPY) 1839d382aafbSBarry Smith fortrancopy_(&len,(PetscScalar*)b,(PetscScalar*)a); 1840d382aafbSBarry Smith #else 1841d382aafbSBarry Smith size_t i; 1842d382aafbSBarry Smith PetscScalar *x = (PetscScalar*)b, *y = (PetscScalar*)a; 1843d382aafbSBarry Smith for (i=0; i<len; i++) y[i] = x[i]; 1844d382aafbSBarry Smith #endif 1845d382aafbSBarry Smith } else { 1846d382aafbSBarry Smith memcpy((char*)(a),(char*)(b),n); 1847d382aafbSBarry Smith } 1848d382aafbSBarry Smith #else 1849d382aafbSBarry Smith memcpy((char*)(a),(char*)(b),n); 1850d382aafbSBarry Smith #endif 1851d382aafbSBarry Smith } 1852d382aafbSBarry Smith PetscFunctionReturn(0); 1853d382aafbSBarry Smith } 1854d382aafbSBarry Smith 1855d382aafbSBarry Smith /*@C 1856d382aafbSBarry Smith PetscMemzero - Zeros the specified memory. 1857d382aafbSBarry Smith 1858d382aafbSBarry Smith Not Collective 1859d382aafbSBarry Smith 1860d382aafbSBarry Smith Input Parameters: 1861d382aafbSBarry Smith + a - pointer to beginning memory location 1862d382aafbSBarry Smith - n - length (in bytes) of memory to initialize 1863d382aafbSBarry Smith 1864d382aafbSBarry Smith Level: intermediate 1865d382aafbSBarry Smith 1866d382aafbSBarry Smith Compile Option: 1867d382aafbSBarry Smith PETSC_PREFER_BZERO - on certain machines (the IBM RS6000) the bzero() routine happens 1868d382aafbSBarry Smith to be faster than the memset() routine. This flag causes the bzero() routine to be used. 1869d382aafbSBarry Smith 18701fd49c25SBarry Smith Not available from Fortran 1871857a15f1SBarry Smith Prefer PetscArrayzero() 18721fd49c25SBarry Smith 1873503cfb0cSBarry Smith Developer Note: this is inlined for fastest performance 1874503cfb0cSBarry Smith 1875580bdb30SBarry Smith .seealso: PetscMemcpy(), PetscMemcmp(), PetscArrayzero(), PetscArraycmp(), PetscArraycpy(), PetscMemmove(), PetscStrallocpy() 1876d382aafbSBarry Smith @*/ 18777087cfbeSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscMemzero(void *a,size_t n) 1878d382aafbSBarry Smith { 1879d382aafbSBarry Smith if (n > 0) { 1880d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG) 188118703db9SJunchao Zhang if (!a) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to zero at a null pointer with %zu bytes",n); 1882d382aafbSBarry Smith #endif 1883d382aafbSBarry Smith #if defined(PETSC_PREFER_ZERO_FOR_MEMZERO) 1884d382aafbSBarry Smith if (!(((long) a) % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) { 1885d382aafbSBarry Smith size_t i,len = n/sizeof(PetscScalar); 1886d382aafbSBarry Smith PetscScalar *x = (PetscScalar*)a; 1887d382aafbSBarry Smith for (i=0; i<len; i++) x[i] = 0.0; 1888d382aafbSBarry Smith } else { 1889d382aafbSBarry Smith #elif defined(PETSC_PREFER_FORTRAN_FOR_MEMZERO) 1890d382aafbSBarry Smith if (!(((long) a) % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) { 1891d382aafbSBarry Smith PetscInt len = n/sizeof(PetscScalar); 1892d382aafbSBarry Smith fortranzero_(&len,(PetscScalar*)a); 1893d382aafbSBarry Smith } else { 1894d382aafbSBarry Smith #endif 1895d382aafbSBarry Smith #if defined(PETSC_PREFER_BZERO) 1896d382aafbSBarry Smith bzero((char *)a,n); 1897d382aafbSBarry Smith #else 1898d382aafbSBarry Smith memset((char*)a,0,n); 1899d382aafbSBarry Smith #endif 1900d382aafbSBarry Smith #if defined(PETSC_PREFER_ZERO_FOR_MEMZERO) || defined(PETSC_PREFER_FORTRAN_FOR_MEMZERO) 1901d382aafbSBarry Smith } 1902d382aafbSBarry Smith #endif 1903d382aafbSBarry Smith } 1904d382aafbSBarry Smith return 0; 1905d382aafbSBarry Smith } 1906d382aafbSBarry Smith 1907d382aafbSBarry Smith /*MC 1908580bdb30SBarry Smith PetscArraycmp - Compares two arrays in memory. 1909580bdb30SBarry Smith 1910580bdb30SBarry Smith Synopsis: 1911580bdb30SBarry Smith #include <petscsys.h> 1912580bdb30SBarry Smith PetscErrorCode PetscArraycmp(const anytype *str1,const anytype *str2,size_t cnt,PetscBool *e) 1913580bdb30SBarry Smith 1914580bdb30SBarry Smith Not Collective 1915580bdb30SBarry Smith 1916580bdb30SBarry Smith Input Parameters: 1917580bdb30SBarry Smith + str1 - First array 1918580bdb30SBarry Smith . str2 - Second array 1919580bdb30SBarry Smith - cnt - Count of the array, not in bytes, but number of entries in the arrays 1920580bdb30SBarry Smith 1921580bdb30SBarry Smith Output Parameters: 1922580bdb30SBarry Smith . e - PETSC_TRUE if equal else PETSC_FALSE. 1923580bdb30SBarry Smith 1924580bdb30SBarry Smith Level: intermediate 1925580bdb30SBarry Smith 1926580bdb30SBarry Smith Note: 1927857a15f1SBarry Smith This routine is a preferred replacement to PetscMemcmp() 1928580bdb30SBarry Smith The arrays must be of the same type 1929580bdb30SBarry Smith 1930580bdb30SBarry Smith .seealso: PetscMemcpy(), PetscMemcmp(), PetscArrayzero(), PetscMemzero(), PetscArraycpy(), PetscMemmove(), PetscStrallocpy(), 1931580bdb30SBarry Smith PetscArraymove() 1932580bdb30SBarry Smith M*/ 19339e2232c7SLisandro Dalcin #define PetscArraycmp(str1,str2,cnt,e) ((sizeof(*(str1)) != sizeof(*(str2))) || PetscMemcmp(str1,str2,(size_t)(cnt)*sizeof(*(str1)),e)) 1934580bdb30SBarry Smith 19358f8f2f0dSBarry Smith /*MC 1936580bdb30SBarry Smith PetscArraymove - Copies from one array in memory to another, the arrays may overlap. Use PetscArraycpy() when the arrays 1937580bdb30SBarry Smith do not overlap 1938580bdb30SBarry Smith 1939580bdb30SBarry Smith Synopsis: 1940580bdb30SBarry Smith #include <petscsys.h> 1941580bdb30SBarry Smith PetscErrorCode PetscArraymove(anytype *str1,const anytype *str2,size_t cnt) 1942580bdb30SBarry Smith 1943580bdb30SBarry Smith Not Collective 1944580bdb30SBarry Smith 1945580bdb30SBarry Smith Input Parameters: 1946580bdb30SBarry Smith + str1 - First array 1947580bdb30SBarry Smith . str2 - Second array 1948580bdb30SBarry Smith - cnt - Count of the array, not in bytes, but number of entries in the arrays 1949580bdb30SBarry Smith 1950580bdb30SBarry Smith Level: intermediate 1951580bdb30SBarry Smith 1952580bdb30SBarry Smith Note: 1953857a15f1SBarry Smith This routine is a preferred replacement to PetscMemmove() 1954580bdb30SBarry Smith The arrays must be of the same type 1955580bdb30SBarry Smith 1956580bdb30SBarry Smith .seealso: PetscMemcpy(), PetscMemcmp(), PetscArrayzero(), PetscMemzero(), PetscArraycpy(), PetscMemmove(), PetscArraycmp(), PetscStrallocpy() 1957580bdb30SBarry Smith M*/ 19589e2232c7SLisandro Dalcin #define PetscArraymove(str1,str2,cnt) ((sizeof(*(str1)) != sizeof(*(str2))) || PetscMemmove(str1,str2,(size_t)(cnt)*sizeof(*(str1)))) 1959580bdb30SBarry Smith 19608f8f2f0dSBarry Smith /*MC 1961580bdb30SBarry Smith PetscArraycpy - Copies from one array in memory to another 1962580bdb30SBarry Smith 1963580bdb30SBarry Smith Synopsis: 1964580bdb30SBarry Smith #include <petscsys.h> 1965580bdb30SBarry Smith PetscErrorCode PetscArraycpy(anytype *str1,const anytype *str2,size_t cnt) 1966580bdb30SBarry Smith 1967580bdb30SBarry Smith Not Collective 1968580bdb30SBarry Smith 1969580bdb30SBarry Smith Input Parameters: 1970de25709eSStefano Zampini + str1 - First array (destination) 1971de25709eSStefano Zampini . str2 - Second array (source) 1972580bdb30SBarry Smith - cnt - Count of the array, not in bytes, but number of entries in the arrays 1973580bdb30SBarry Smith 1974580bdb30SBarry Smith Level: intermediate 1975580bdb30SBarry Smith 1976580bdb30SBarry Smith Note: 1977857a15f1SBarry Smith This routine is a preferred replacement to PetscMemcpy() 1978580bdb30SBarry Smith The arrays must be of the same type 1979580bdb30SBarry Smith 1980580bdb30SBarry Smith .seealso: PetscMemcpy(), PetscMemcmp(), PetscArrayzero(), PetscMemzero(), PetscArraymove(), PetscMemmove(), PetscArraycmp(), PetscStrallocpy() 1981580bdb30SBarry Smith M*/ 19829e2232c7SLisandro Dalcin #define PetscArraycpy(str1,str2,cnt) ((sizeof(*(str1)) != sizeof(*(str2))) || PetscMemcpy(str1,str2,(size_t)(cnt)*sizeof(*(str1)))) 1983580bdb30SBarry Smith 19848f8f2f0dSBarry Smith /*MC 1985580bdb30SBarry Smith PetscArrayzero - Zeros an array in memory. 1986580bdb30SBarry Smith 1987580bdb30SBarry Smith Synopsis: 1988580bdb30SBarry Smith #include <petscsys.h> 1989580bdb30SBarry Smith PetscErrorCode PetscArrayzero(anytype *str1,size_t cnt) 1990580bdb30SBarry Smith 1991580bdb30SBarry Smith Not Collective 1992580bdb30SBarry Smith 1993580bdb30SBarry Smith Input Parameters: 1994580bdb30SBarry Smith + str1 - array 1995580bdb30SBarry Smith - cnt - Count of the array, not in bytes, but number of entries in the array 1996580bdb30SBarry Smith 1997580bdb30SBarry Smith Level: intermediate 1998580bdb30SBarry Smith 1999580bdb30SBarry Smith Note: 2000857a15f1SBarry Smith This routine is a preferred replacement to PetscMemzero() 2001580bdb30SBarry Smith 2002580bdb30SBarry Smith .seealso: PetscMemcpy(), PetscMemcmp(), PetscMemzero(), PetscArraycmp(), PetscArraycpy(), PetscMemmove(), PetscStrallocpy(), PetscArraymove() 2003580bdb30SBarry Smith M*/ 20049e2232c7SLisandro Dalcin #define PetscArrayzero(str1,cnt) PetscMemzero(str1,(size_t)(cnt)*sizeof(*(str1))) 2005580bdb30SBarry Smith 2006d382aafbSBarry Smith /*MC 2007d382aafbSBarry Smith PetscPrefetchBlock - Prefetches a block of memory 2008d382aafbSBarry Smith 2009eca87e8dSBarry Smith Synopsis: 2010aaa7dc30SBarry Smith #include <petscsys.h> 2011eca87e8dSBarry Smith void PetscPrefetchBlock(const anytype *a,size_t n,int rw,int t) 2012eca87e8dSBarry Smith 2013d382aafbSBarry Smith Not Collective 2014d382aafbSBarry Smith 2015d382aafbSBarry Smith Input Parameters: 2016d382aafbSBarry Smith + a - pointer to first element to fetch (any type but usually PetscInt or PetscScalar) 2017d382aafbSBarry Smith . n - number of elements to fetch 2018d382aafbSBarry Smith . rw - 1 if the memory will be written to, otherwise 0 (ignored by many processors) 201950d8bf02SJed Brown - t - temporal locality (PETSC_PREFETCH_HINT_{NTA,T0,T1,T2}), see note 2020d382aafbSBarry Smith 2021d382aafbSBarry Smith Level: developer 2022d382aafbSBarry Smith 2023d382aafbSBarry Smith Notes: 2024d382aafbSBarry Smith The last two arguments (rw and t) must be compile-time constants. 2025d382aafbSBarry Smith 202650d8bf02SJed Brown Adopting Intel's x86/x86-64 conventions, there are four levels of temporal locality. Not all architectures offer 202750d8bf02SJed Brown equivalent locality hints, but the following macros are always defined to their closest analogue. 202850d8bf02SJed Brown + PETSC_PREFETCH_HINT_NTA - Non-temporal. Prefetches directly to L1, evicts to memory (skips higher level cache unless it was already there when prefetched). 202963cf1ef0SJed Brown . 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. 203063cf1ef0SJed Brown . PETSC_PREFETCH_HINT_T1 - Fetch to level 2 and higher (not L1). 203163cf1ef0SJed Brown - PETSC_PREFETCH_HINT_T2 - Fetch to high-level cache only. (On many systems, T0 and T1 are equivalent.) 2032d382aafbSBarry Smith 2033d382aafbSBarry Smith This function does nothing on architectures that do not support prefetch and never errors (even if passed an invalid 2034d382aafbSBarry Smith address). 2035d382aafbSBarry Smith 2036d382aafbSBarry Smith M*/ 2037d382aafbSBarry Smith #define PetscPrefetchBlock(a,n,rw,t) do { \ 2038d382aafbSBarry Smith const char *_p = (const char*)(a),*_end = (const char*)((a)+(n)); \ 2039d382aafbSBarry Smith for (; _p < _end; _p += PETSC_LEVEL1_DCACHE_LINESIZE) PETSC_Prefetch(_p,(rw),(t)); \ 2040d382aafbSBarry Smith } while (0) 2041d382aafbSBarry Smith 2042d382aafbSBarry Smith /* 2043d382aafbSBarry Smith Determine if some of the kernel computation routines use 2044d382aafbSBarry Smith Fortran (rather than C) for the numerical calculations. On some machines 2045d382aafbSBarry Smith and compilers (like complex numbers) the Fortran version of the routines 2046d382aafbSBarry Smith is faster than the C/C++ versions. The flag --with-fortran-kernels 2047e2e64c6bSBarry Smith should be used with ./configure to turn these on. 2048d382aafbSBarry Smith */ 2049d382aafbSBarry Smith #if defined(PETSC_USE_FORTRAN_KERNELS) 2050d382aafbSBarry Smith 2051d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTCRL) 2052d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MULTCRL 2053d382aafbSBarry Smith #endif 2054d382aafbSBarry Smith 20555a11e1b2SBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTAIJPERM) 20565a11e1b2SBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MULTAIJPERM 2057d382aafbSBarry Smith #endif 2058d382aafbSBarry Smith 2059d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTAIJ) 2060d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MULTAIJ 2061d382aafbSBarry Smith #endif 2062d382aafbSBarry Smith 2063d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ) 2064d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ 2065d382aafbSBarry Smith #endif 2066d382aafbSBarry Smith 2067d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_NORM) 2068d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_NORM 2069d382aafbSBarry Smith #endif 2070d382aafbSBarry Smith 2071d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MAXPY) 2072d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MAXPY 2073d382aafbSBarry Smith #endif 2074d382aafbSBarry Smith 2075d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_SOLVEAIJ) 2076d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_SOLVEAIJ 2077d382aafbSBarry Smith #endif 2078d382aafbSBarry Smith 2079d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_RELAXAIJ) 2080d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_RELAXAIJ 2081d382aafbSBarry Smith #endif 2082d382aafbSBarry Smith 2083d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_SOLVEBAIJ) 2084d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_SOLVEBAIJ 2085d382aafbSBarry Smith #endif 2086d382aafbSBarry Smith 2087d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ) 2088d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ 2089d382aafbSBarry Smith #endif 2090d382aafbSBarry Smith 2091d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MDOT) 2092d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MDOT 2093d382aafbSBarry Smith #endif 2094d382aafbSBarry Smith 2095d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_XTIMESY) 2096d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_XTIMESY 2097d382aafbSBarry Smith #endif 2098d382aafbSBarry Smith 2099d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_AYPX) 2100d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_AYPX 2101d382aafbSBarry Smith #endif 2102d382aafbSBarry Smith 2103d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_WAXPY) 2104d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_WAXPY 2105d382aafbSBarry Smith #endif 2106d382aafbSBarry Smith 2107d382aafbSBarry Smith #endif 2108d382aafbSBarry Smith 2109d382aafbSBarry Smith /* 2110d382aafbSBarry Smith Macros for indicating code that should be compiled with a C interface, 2111d382aafbSBarry Smith rather than a C++ interface. Any routines that are dynamically loaded 2112d382aafbSBarry Smith (such as the PCCreate_XXX() routines) must be wrapped so that the name 2113d382aafbSBarry Smith mangler does not change the functions symbol name. This just hides the 2114d382aafbSBarry Smith ugly extern "C" {} wrappers. 2115d382aafbSBarry Smith */ 2116d382aafbSBarry Smith #if defined(__cplusplus) 2117d382aafbSBarry Smith # define EXTERN_C_BEGIN extern "C" { 2118d382aafbSBarry Smith # define EXTERN_C_END } 2119d382aafbSBarry Smith #else 2120d382aafbSBarry Smith # define EXTERN_C_BEGIN 2121d382aafbSBarry Smith # define EXTERN_C_END 2122d382aafbSBarry Smith #endif 2123d382aafbSBarry Smith 2124d382aafbSBarry Smith /* --------------------------------------------------------------------*/ 2125d382aafbSBarry Smith 2126d382aafbSBarry Smith /*MC 2127d382aafbSBarry Smith MPI_Comm - the basic object used by MPI to determine which processes are involved in a 2128d382aafbSBarry Smith communication 2129d382aafbSBarry Smith 2130d382aafbSBarry Smith Level: beginner 2131d382aafbSBarry Smith 2132d382aafbSBarry Smith Note: This manual page is a place-holder because MPICH does not have a manual page for MPI_Comm 2133d382aafbSBarry Smith 2134d382aafbSBarry Smith .seealso: PETSC_COMM_WORLD, PETSC_COMM_SELF 2135d382aafbSBarry Smith M*/ 2136d382aafbSBarry Smith 2137d382aafbSBarry Smith #if defined(PETSC_HAVE_MPIIO) 2138014dd563SJed Brown PETSC_EXTERN PetscErrorCode MPIU_File_write_all(MPI_File,void*,PetscMPIInt,MPI_Datatype,MPI_Status*); 2139014dd563SJed Brown PETSC_EXTERN PetscErrorCode MPIU_File_read_all(MPI_File,void*,PetscMPIInt,MPI_Datatype,MPI_Status*); 2140c4e82887SLisandro Dalcin PETSC_EXTERN PetscErrorCode MPIU_File_write_at(MPI_File,MPI_Offset,void*,PetscMPIInt,MPI_Datatype,MPI_Status*); 2141c4e82887SLisandro Dalcin PETSC_EXTERN PetscErrorCode MPIU_File_read_at(MPI_File,MPI_Offset,void*,PetscMPIInt,MPI_Datatype,MPI_Status*); 2142c4e82887SLisandro Dalcin PETSC_EXTERN PetscErrorCode MPIU_File_write_at_all(MPI_File,MPI_Offset,void*,PetscMPIInt,MPI_Datatype,MPI_Status*); 2143c4e82887SLisandro Dalcin PETSC_EXTERN PetscErrorCode MPIU_File_read_at_all(MPI_File,MPI_Offset,void*,PetscMPIInt,MPI_Datatype,MPI_Status*); 2144d382aafbSBarry Smith #endif 2145d382aafbSBarry Smith 2146d382aafbSBarry Smith /* the following petsc_static_inline require petscerror.h */ 2147d382aafbSBarry Smith 2148d382aafbSBarry Smith /* Limit MPI to 32-bits */ 2149d382aafbSBarry Smith #define PETSC_MPI_INT_MAX 2147483647 2150d382aafbSBarry Smith #define PETSC_MPI_INT_MIN -2147483647 2151d382aafbSBarry Smith /* Limit BLAS to 32-bits */ 2152d382aafbSBarry Smith #define PETSC_BLAS_INT_MAX 2147483647 2153d382aafbSBarry Smith #define PETSC_BLAS_INT_MIN -2147483647 2154eee0c0a6SToby Isaac #define PETSC_CUBLAS_INT_MAX 2147483647 2155d382aafbSBarry Smith 215661b0d812SBarry Smith /*@C 2157c73702f5SBarry Smith PetscIntCast - casts a PetscInt64 (which is 64 bits in size) to a PetscInt (which may be 32 bits in size), generates an 2158c73702f5SBarry Smith error if the PetscInt is not large enough to hold the number. 2159c73702f5SBarry Smith 2160c73702f5SBarry Smith Not Collective 2161c73702f5SBarry Smith 2162c73702f5SBarry Smith Input Parameter: 2163c73702f5SBarry Smith . a - the PetscInt64 value 2164c73702f5SBarry Smith 2165c73702f5SBarry Smith Output Parameter: 2166c73702f5SBarry Smith . b - the resulting PetscInt value 2167c73702f5SBarry Smith 2168c73702f5SBarry Smith Level: advanced 2169c73702f5SBarry Smith 2170c73702f5SBarry Smith Notes: If integers needed for the applications are too large to fit in 32 bit ints you can ./configure using --with-64-bit-indices to make PetscInt use 64 bit ints 2171c73702f5SBarry Smith 2172c73702f5SBarry Smith Not available from Fortran 2173c73702f5SBarry Smith 217461778c46SBarry Smith .seealso: PetscBLASInt, PetscMPIInt, PetscInt, PetscMPIIntCast(), PetscBLASIntCast(), PetscIntMultError(), PetscIntSumError() 2175c73702f5SBarry Smith @*/ 2176c73702f5SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscIntCast(PetscInt64 a,PetscInt *b) 2177c73702f5SBarry Smith { 2178c73702f5SBarry Smith PetscFunctionBegin; 2179c73702f5SBarry Smith #if !defined(PETSC_USE_64BIT_INDICES) 2180e9e21dffSJose E. Roman if (a > PETSC_MAX_INT) { *b = 0; SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"%D is too big for PetscInt, you may need to ./configure using --with-64-bit-indices",a); } 2181c73702f5SBarry Smith #endif 2182c73702f5SBarry Smith *b = (PetscInt)(a); 2183c73702f5SBarry Smith PetscFunctionReturn(0); 2184c73702f5SBarry Smith } 2185c73702f5SBarry Smith 2186c73702f5SBarry Smith /*@C 218761b0d812SBarry Smith PetscBLASIntCast - casts a PetscInt (which may be 64 bits in size) to a PetscBLASInt (which may be 32 bits in size), generates an 218861b0d812SBarry Smith error if the PetscBLASInt is not large enough to hold the number. 218961b0d812SBarry Smith 219061b0d812SBarry Smith Not Collective 219161b0d812SBarry Smith 219261b0d812SBarry Smith Input Parameter: 219361b0d812SBarry Smith . a - the PetscInt value 219461b0d812SBarry Smith 219561b0d812SBarry Smith Output Parameter: 219661b0d812SBarry Smith . b - the resulting PetscBLASInt value 219761b0d812SBarry Smith 219861b0d812SBarry Smith Level: advanced 219961b0d812SBarry Smith 22000bc7d38cSBarry Smith Notes: 22011fd49c25SBarry Smith Not available from Fortran 2202f0b7f91aSBarry Smith Errors if the integer is negative since PETSc calls to BLAS/LAPACK never need to cast negative integer inputs 22031fd49c25SBarry Smith 2204c73702f5SBarry Smith .seealso: PetscBLASInt, PetscMPIInt, PetscInt, PetscMPIIntCast(), PetscIntCast() 220561b0d812SBarry Smith @*/ 2206c5df96a5SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBLASIntCast(PetscInt a,PetscBLASInt *b) 2207c5df96a5SBarry Smith { 2208c5df96a5SBarry Smith PetscFunctionBegin; 2209c5df96a5SBarry Smith #if defined(PETSC_USE_64BIT_INDICES) && !defined(PETSC_HAVE_64BIT_BLAS_INDICES) 2210e9e21dffSJose E. Roman if (a > PETSC_BLAS_INT_MAX) { *b = 0; SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"%D 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); } 2211c5df96a5SBarry Smith #endif 2212e9e21dffSJose E. Roman if (a < 0) { *b = 0; SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Passing negative integer to BLAS/LAPACK routine"); } 2213c73702f5SBarry Smith *b = (PetscBLASInt)(a); 2214c5df96a5SBarry Smith PetscFunctionReturn(0); 2215c5df96a5SBarry Smith } 2216c5df96a5SBarry Smith 221761b0d812SBarry Smith /*@C 2218eee0c0a6SToby Isaac PetscCuBLASIntCast - like PetscBLASIntCast(), but for PetscCuBLASInt. 2219eee0c0a6SToby Isaac 2220eee0c0a6SToby Isaac Not Collective 2221eee0c0a6SToby Isaac 2222eee0c0a6SToby Isaac Input Parameter: 2223eee0c0a6SToby Isaac . a - the PetscInt value 2224eee0c0a6SToby Isaac 2225eee0c0a6SToby Isaac Output Parameter: 2226eee0c0a6SToby Isaac . b - the resulting PetscCuBLASInt value 2227eee0c0a6SToby Isaac 2228eee0c0a6SToby Isaac Level: advanced 2229eee0c0a6SToby Isaac 2230eee0c0a6SToby Isaac Notes: 2231eee0c0a6SToby Isaac Errors if the integer is negative since PETSc calls to cuBLAS and friends never need to cast negative integer inputs 2232eee0c0a6SToby Isaac 2233eee0c0a6SToby Isaac .seealso: PetscCuBLASInt, PetscBLASInt, PetscMPIInt, PetscInt, PetscBLASIntCast(), PetscMPIIntCast(), PetscIntCast() 2234eee0c0a6SToby Isaac @*/ 2235ae77d22fSJunchao Zhang PETSC_STATIC_INLINE PetscErrorCode PetscCuBLASIntCast(PetscInt a,PetscCuBLASInt *b) 2236eee0c0a6SToby Isaac { 2237eee0c0a6SToby Isaac PetscFunctionBegin; 2238eee0c0a6SToby Isaac #if defined(PETSC_USE_64BIT_INDICES) 2239e9e21dffSJose E. Roman if (a > PETSC_CUBLAS_INT_MAX) { *b = 0; SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"%D is too big for cuBLAS, which is restricted to 32 bit integers.",a); } 2240eee0c0a6SToby Isaac #endif 2241e9e21dffSJose E. Roman if (a < 0) { *b = 0; SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Passing negative integer to cuBLAS routine"); } 2242eee0c0a6SToby Isaac *b = (PetscCuBLASInt)(a); 2243eee0c0a6SToby Isaac PetscFunctionReturn(0); 2244eee0c0a6SToby Isaac } 2245eee0c0a6SToby Isaac 2246eee0c0a6SToby Isaac /*@C 224761b0d812SBarry Smith PetscMPIIntCast - casts a PetscInt (which may be 64 bits in size) to a PetscMPIInt (which may be 32 bits in size), generates an 224861b0d812SBarry Smith error if the PetscMPIInt is not large enough to hold the number. 224961b0d812SBarry Smith 225061b0d812SBarry Smith Not Collective 225161b0d812SBarry Smith 225261b0d812SBarry Smith Input Parameter: 225361b0d812SBarry Smith . a - the PetscInt value 225461b0d812SBarry Smith 225561b0d812SBarry Smith Output Parameter: 225661b0d812SBarry Smith . b - the resulting PetscMPIInt value 225761b0d812SBarry Smith 225861b0d812SBarry Smith Level: advanced 225961b0d812SBarry Smith 22601fd49c25SBarry Smith Not available from Fortran 22611fd49c25SBarry Smith 2262c73702f5SBarry Smith .seealso: PetscBLASInt, PetscMPIInt, PetscInt, PetscBLASIntCast(), PetscIntCast() 226361b0d812SBarry Smith @*/ 22644dc2109aSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscMPIIntCast(PetscInt a,PetscMPIInt *b) 22654dc2109aSBarry Smith { 22664dc2109aSBarry Smith PetscFunctionBegin; 22674dc2109aSBarry Smith #if defined(PETSC_USE_64BIT_INDICES) 2268e9e21dffSJose E. Roman if (a > PETSC_MPI_INT_MAX) { *b = 0; SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"%D is too big for MPI buffer length. We currently only support 32 bit integers",a); } 22694dc2109aSBarry Smith #endif 2270c73702f5SBarry Smith *b = (PetscMPIInt)(a); 22714dc2109aSBarry Smith PetscFunctionReturn(0); 22724dc2109aSBarry Smith } 22734dc2109aSBarry Smith 2274bafee8b4SSatish Balay #define PetscInt64Mult(a,b) ((PetscInt64)(a))*((PetscInt64)(b)) 22752f18eb33SBarry Smith 22762f18eb33SBarry Smith /*@C 22772f18eb33SBarry Smith 22782f18eb33SBarry Smith PetscRealIntMultTruncate - Computes the product of a positive PetscReal and a positive PetscInt and truncates the value to slightly less than the maximal possible value 22792f18eb33SBarry Smith 22802f18eb33SBarry Smith Not Collective 22812f18eb33SBarry Smith 2282d8d19677SJose E. Roman Input Parameters: 22832f18eb33SBarry Smith + a - the PetscReal value 22842f18eb33SBarry Smith - b - the second value 22852f18eb33SBarry Smith 2286390e1bf2SBarry Smith Returns: 2287390e1bf2SBarry Smith the result as a PetscInt value 22882f18eb33SBarry Smith 2289bafee8b4SSatish Balay Use PetscInt64Mult() to compute the product of two PetscInt as a PetscInt64 22902f18eb33SBarry Smith Use PetscIntMultTruncate() to compute the product of two positive PetscInt and truncate to fit a PetscInt 22912f18eb33SBarry 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 22922f18eb33SBarry Smith 2293e28ce29aSPatrick Sanan Developers Note: 2294e28ce29aSPatrick Sanan We currently assume that PetscInt addition can never overflow, this is obviously wrong but requires many more checks. 22952f18eb33SBarry Smith 22962f18eb33SBarry Smith This is used where we compute approximate sizes for workspace and need to insure the workspace is index-able. 22972f18eb33SBarry Smith 22981fd49c25SBarry Smith Not available from Fortran 22991fd49c25SBarry Smith 23002f18eb33SBarry Smith Level: advanced 23012f18eb33SBarry Smith 230261778c46SBarry Smith .seealso: PetscBLASInt, PetscMPIInt, PetscInt, PetscBLASIntCast(), PetscInt64Mult(), PetscIntMultError(), PetscIntSumError() 23032f18eb33SBarry Smith @*/ 23042f18eb33SBarry Smith PETSC_STATIC_INLINE PetscInt PetscRealIntMultTruncate(PetscReal a,PetscInt b) 23052f18eb33SBarry Smith { 2306bafee8b4SSatish Balay PetscInt64 r; 23072f18eb33SBarry Smith 2308bafee8b4SSatish Balay r = (PetscInt64) (a*(PetscReal)b); 23092f18eb33SBarry Smith if (r > PETSC_MAX_INT - 100) r = PETSC_MAX_INT - 100; 23102f18eb33SBarry Smith return (PetscInt) r; 23112f18eb33SBarry Smith } 23122f18eb33SBarry Smith 23132f18eb33SBarry Smith /*@C 23142f18eb33SBarry Smith 23152f18eb33SBarry Smith PetscIntMultTruncate - Computes the product of two positive PetscInt and truncates the value to slightly less than the maximal possible value 23162f18eb33SBarry Smith 23172f18eb33SBarry Smith Not Collective 23182f18eb33SBarry Smith 2319d8d19677SJose E. Roman Input Parameters: 23202f18eb33SBarry Smith + a - the PetscInt value 23212f18eb33SBarry Smith - b - the second value 23222f18eb33SBarry Smith 2323390e1bf2SBarry Smith Returns: 2324390e1bf2SBarry Smith the result as a PetscInt value 23252f18eb33SBarry Smith 2326bafee8b4SSatish Balay Use PetscInt64Mult() to compute the product of two PetscInt as a PetscInt64 23272f18eb33SBarry Smith Use PetscRealIntMultTruncate() to compute the product of a PetscReal and a PetscInt and truncate to fit a PetscInt 23282f18eb33SBarry 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 23292f18eb33SBarry Smith 23301fd49c25SBarry Smith Not available from Fortran 23311fd49c25SBarry Smith 23322f18eb33SBarry Smith Developers Note: We currently assume that PetscInt addition can never overflow, this is obviously wrong but requires many more checks. 23332f18eb33SBarry Smith 23342f18eb33SBarry Smith This is used where we compute approximate sizes for workspace and need to insure the workspace is index-able. 23352f18eb33SBarry Smith 23362f18eb33SBarry Smith Level: advanced 23372f18eb33SBarry Smith 233861778c46SBarry Smith .seealso: PetscBLASInt, PetscMPIInt, PetscInt, PetscBLASIntCast(), PetscInt64Mult(), PetscIntMultError(), PetscIntSumError() 23392f18eb33SBarry Smith @*/ 23402f18eb33SBarry Smith PETSC_STATIC_INLINE PetscInt PetscIntMultTruncate(PetscInt a,PetscInt b) 23412f18eb33SBarry Smith { 2342bafee8b4SSatish Balay PetscInt64 r; 23432f18eb33SBarry Smith 2344bafee8b4SSatish Balay r = PetscInt64Mult(a,b); 23452f18eb33SBarry Smith if (r > PETSC_MAX_INT - 100) r = PETSC_MAX_INT - 100; 23462f18eb33SBarry Smith return (PetscInt) r; 23472f18eb33SBarry Smith } 23482f18eb33SBarry Smith 2349f91af8c7SBarry Smith /*@C 2350f91af8c7SBarry Smith 2351f91af8c7SBarry Smith PetscIntSumTruncate - Computes the sum of two positive PetscInt and truncates the value to slightly less than the maximal possible value 2352f91af8c7SBarry Smith 2353f91af8c7SBarry Smith Not Collective 2354f91af8c7SBarry Smith 2355d8d19677SJose E. Roman Input Parameters: 2356f91af8c7SBarry Smith + a - the PetscInt value 2357f91af8c7SBarry Smith - b - the second value 2358f91af8c7SBarry Smith 2359390e1bf2SBarry Smith Returns: 2360390e1bf2SBarry Smith the result as a PetscInt value 2361f91af8c7SBarry Smith 2362bafee8b4SSatish Balay Use PetscInt64Mult() to compute the product of two PetscInt as a PetscInt64 2363f91af8c7SBarry Smith Use PetscRealIntMultTruncate() to compute the product of a PetscReal and a PetscInt and truncate to fit a PetscInt 2364f91af8c7SBarry 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 2365f91af8c7SBarry Smith 2366f91af8c7SBarry Smith This is used where we compute approximate sizes for workspace and need to insure the workspace is index-able. 2367f91af8c7SBarry Smith 2368f5f57ec0SBarry Smith Not available from Fortran 2369f5f57ec0SBarry Smith 2370f91af8c7SBarry Smith Level: advanced 2371f91af8c7SBarry Smith 237261778c46SBarry Smith .seealso: PetscBLASInt, PetscMPIInt, PetscInt, PetscBLASIntCast(), PetscInt64Mult(), PetscIntMultError() 2373f91af8c7SBarry Smith @*/ 2374f91af8c7SBarry Smith PETSC_STATIC_INLINE PetscInt PetscIntSumTruncate(PetscInt a,PetscInt b) 2375f91af8c7SBarry Smith { 2376bafee8b4SSatish Balay PetscInt64 r; 2377f91af8c7SBarry Smith 2378bafee8b4SSatish Balay r = ((PetscInt64)a) + ((PetscInt64)b); 2379f91af8c7SBarry Smith if (r > PETSC_MAX_INT - 100) r = PETSC_MAX_INT - 100; 2380f91af8c7SBarry Smith return (PetscInt) r; 2381f91af8c7SBarry Smith } 2382f91af8c7SBarry Smith 23832f18eb33SBarry Smith /*@C 23842f18eb33SBarry Smith 23852f18eb33SBarry Smith PetscIntMultError - Computes the product of two positive PetscInt and generates an error with overflow. 23862f18eb33SBarry Smith 23872f18eb33SBarry Smith Not Collective 23882f18eb33SBarry Smith 2389d8d19677SJose E. Roman Input Parameters: 23902f18eb33SBarry Smith + a - the PetscInt value 23912f18eb33SBarry Smith - b - the second value 23922f18eb33SBarry Smith 2393d8d19677SJose E. Roman Output Parameter: 2394390e1bf2SBarry 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 23952f18eb33SBarry Smith 2396bafee8b4SSatish Balay Use PetscInt64Mult() to compute the product of two 32 bit PetscInt and store in a PetscInt64 23972f18eb33SBarry Smith Use PetscIntMultTruncate() to compute the product of two PetscInt and truncate it to fit in a PetscInt 23982f18eb33SBarry Smith 2399f5f57ec0SBarry Smith Not available from Fortran 2400f5f57ec0SBarry Smith 2401220afb94SBarry Smith Developers Note: We currently assume that PetscInt addition does not overflow, this is obviously wrong but requires many more checks. 24022f18eb33SBarry Smith 24032f18eb33SBarry Smith Level: advanced 24042f18eb33SBarry Smith 2405220afb94SBarry Smith .seealso: PetscBLASInt, PetscMPIInt, PetscInt, PetscBLASIntCast(), PetscIntMult64(), PetscIntSumError() 24062f18eb33SBarry Smith @*/ 24072f18eb33SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscIntMultError(PetscInt a,PetscInt b,PetscInt *result) 24082f18eb33SBarry Smith { 2409bafee8b4SSatish Balay PetscInt64 r; 24102f18eb33SBarry Smith 24112f18eb33SBarry Smith PetscFunctionBegin; 2412bafee8b4SSatish Balay r = PetscInt64Mult(a,b); 24132f18eb33SBarry Smith #if !defined(PETSC_USE_64BIT_INDICES) 241461778c46SBarry Smith if (r > PETSC_MAX_INT) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_SUP,"Product of two integers %d %d overflow, either you have an invalidly large integer error in your code or you must ./configure PETSc with --with-64-bit-indices for the case you are running",a,b); 24152f18eb33SBarry Smith #endif 2416f91af8c7SBarry Smith if (result) *result = (PetscInt) r; 2417f91af8c7SBarry Smith PetscFunctionReturn(0); 2418f91af8c7SBarry Smith } 2419f91af8c7SBarry Smith 2420f91af8c7SBarry Smith /*@C 2421f91af8c7SBarry Smith 2422fbfcfee5SBarry Smith PetscIntSumError - Computes the sum of two positive PetscInt and generates an error with overflow. 2423f91af8c7SBarry Smith 2424f91af8c7SBarry Smith Not Collective 2425f91af8c7SBarry Smith 2426d8d19677SJose E. Roman Input Parameters: 2427f91af8c7SBarry Smith + a - the PetscInt value 2428f91af8c7SBarry Smith - b - the second value 2429f91af8c7SBarry Smith 2430d8d19677SJose E. Roman Output Parameter: 2431390e1bf2SBarry 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 2432f91af8c7SBarry Smith 2433bafee8b4SSatish Balay Use PetscInt64Mult() to compute the product of two 32 bit PetscInt and store in a PetscInt64 2434f91af8c7SBarry Smith Use PetscIntMultTruncate() to compute the product of two PetscInt and truncate it to fit in a PetscInt 2435f91af8c7SBarry Smith 2436f5f57ec0SBarry Smith Not available from Fortran 2437f5f57ec0SBarry Smith 2438f91af8c7SBarry Smith Level: advanced 2439f91af8c7SBarry Smith 244061778c46SBarry Smith .seealso: PetscBLASInt, PetscMPIInt, PetscInt, PetscBLASIntCast(), PetscInt64Mult(), PetscIntMultError() 2441f91af8c7SBarry Smith @*/ 2442f91af8c7SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscIntSumError(PetscInt a,PetscInt b,PetscInt *result) 2443f91af8c7SBarry Smith { 2444bafee8b4SSatish Balay PetscInt64 r; 2445f91af8c7SBarry Smith 2446f91af8c7SBarry Smith PetscFunctionBegin; 2447bafee8b4SSatish Balay r = ((PetscInt64)a) + ((PetscInt64)b); 2448f91af8c7SBarry Smith #if !defined(PETSC_USE_64BIT_INDICES) 244961778c46SBarry Smith if (r > PETSC_MAX_INT) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_SUP,"Sum of two integers %d %d overflow, either you have an invalidly large integer error in your code or you must ./configure PETSc with --with-64-bit-indices for the case you are running",a,b); 2450f91af8c7SBarry Smith #endif 2451f91af8c7SBarry Smith if (result) *result = (PetscInt) r; 24522f18eb33SBarry Smith PetscFunctionReturn(0); 24532f18eb33SBarry Smith } 2454c5df96a5SBarry Smith 2455d382aafbSBarry Smith /* 24562981ebdbSBarry Smith The IBM include files define hz, here we hide it so that it may be used as a regular user variable. 2457d382aafbSBarry Smith */ 2458d382aafbSBarry Smith #if defined(hz) 2459d382aafbSBarry Smith # undef hz 2460d382aafbSBarry Smith #endif 2461d382aafbSBarry Smith 246215a5570dSLisandro Dalcin #include <limits.h> 246315a5570dSLisandro Dalcin 246415a5570dSLisandro Dalcin /* The number of bits in a byte */ 246515a5570dSLisandro Dalcin 246615a5570dSLisandro Dalcin #define PETSC_BITS_PER_BYTE CHAR_BIT 246715a5570dSLisandro Dalcin 2468d382aafbSBarry Smith #if defined(PETSC_HAVE_SYS_TYPES_H) 2469d382aafbSBarry Smith # include <sys/types.h> 2470d382aafbSBarry Smith #endif 2471d382aafbSBarry Smith 2472d382aafbSBarry Smith /*MC 2473d382aafbSBarry Smith 247466d79e26SBarry 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++ 247566d79e26SBarry Smith and Fortran compilers when petscsys.h is included. 247666d79e26SBarry Smith 247766d79e26SBarry Smith The current PETSc version and the API for accessing it are defined in petscversion.h 247866d79e26SBarry Smith 247966d79e26SBarry 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) 248066d79e26SBarry Smith 248166d79e26SBarry 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 248266d79e26SBarry Smith where only a change in the major version number (x) indicates a change in the API. 248366d79e26SBarry Smith 248466d79e26SBarry 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 248566d79e26SBarry Smith 248666d79e26SBarry 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), 248766d79e26SBarry 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 248866d79e26SBarry Smith version number (x.y.z). 248966d79e26SBarry Smith 249066d79e26SBarry Smith PETSC_RELEASE_DATE is the date the x.y version was released (i.e. the version before any patch releases) 249166d79e26SBarry Smith 249266d79e26SBarry Smith PETSC_VERSION_DATE is the date the x.y.z version was released 249366d79e26SBarry Smith 249466d79e26SBarry Smith PETSC_VERSION_GIT is the last git commit to the repository given in the form vx.y.z-wwwww 249566d79e26SBarry Smith 249666d79e26SBarry Smith PETSC_VERSION_DATE_GIT is the date of the last git commit to the repository 249766d79e26SBarry Smith 2498cbc12506SBarry Smith PETSC_VERSION_() is deprecated and will eventually be removed. 249966d79e26SBarry Smith 2500cbc12506SBarry Smith Level: intermediate 250166d79e26SBarry Smith 250266d79e26SBarry Smith M*/ 250366d79e26SBarry Smith 2504014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetArchType(char[],size_t); 2505014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetHostName(char[],size_t); 2506014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetUserName(char[],size_t); 2507014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetProgramName(char[],size_t); 2508014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetProgramName(const char[]); 2509014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetDate(char[],size_t); 251027710113SBarry Smith PETSC_EXTERN PetscErrorCode PetscGetVersion(char[], size_t); 25115f309d01SBarry Smith PETSC_EXTERN PetscErrorCode PetscGetVersionNumber(PetscInt*,PetscInt*,PetscInt*,PetscInt*); 2512d382aafbSBarry Smith 25136a7c706bSVaclav Hapla PETSC_EXTERN PetscErrorCode PetscSortedInt(PetscInt,const PetscInt[],PetscBool*); 25146a7c706bSVaclav Hapla PETSC_EXTERN PetscErrorCode PetscSortedMPIInt(PetscInt,const PetscMPIInt[],PetscBool*); 25156a7c706bSVaclav Hapla PETSC_EXTERN PetscErrorCode PetscSortedReal(PetscInt,const PetscReal[],PetscBool*); 2516014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortInt(PetscInt,PetscInt[]); 2517ce605777SToby Isaac PETSC_EXTERN PetscErrorCode PetscSortReverseInt(PetscInt,PetscInt[]); 251822ab5688SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscSortedRemoveDupsInt(PetscInt*,PetscInt[]); 2519014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortRemoveDupsInt(PetscInt*,PetscInt[]); 2520f1cab4e1SJunchao Zhang PETSC_EXTERN PetscErrorCode PetscCheckDupsInt(PetscInt,const PetscInt[],PetscBool*); 252160e03357SMatthew G Knepley PETSC_EXTERN PetscErrorCode PetscFindInt(PetscInt, PetscInt, const PetscInt[], PetscInt*); 2522d2aeb606SJed Brown PETSC_EXTERN PetscErrorCode PetscFindMPIInt(PetscMPIInt, PetscInt, const PetscMPIInt[], PetscInt*); 2523014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortIntWithPermutation(PetscInt,const PetscInt[],PetscInt[]); 2524014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortStrWithPermutation(PetscInt,const char*[],PetscInt[]); 2525014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortIntWithArray(PetscInt,PetscInt[],PetscInt[]); 25266c2863d0SBarry Smith PETSC_EXTERN PetscErrorCode PetscSortIntWithArrayPair(PetscInt,PetscInt[],PetscInt[],PetscInt[]); 252717d7d925SStefano Zampini PETSC_EXTERN PetscErrorCode PetscSortMPIInt(PetscInt,PetscMPIInt[]); 252817d7d925SStefano Zampini PETSC_EXTERN PetscErrorCode PetscSortRemoveDupsMPIInt(PetscInt*,PetscMPIInt[]); 2529014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortMPIIntWithArray(PetscMPIInt,PetscMPIInt[],PetscMPIInt[]); 25305569a785SJunchao Zhang PETSC_EXTERN PetscErrorCode PetscSortMPIIntWithIntArray(PetscMPIInt,PetscMPIInt[],PetscInt[]); 2531014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortIntWithScalarArray(PetscInt,PetscInt[],PetscScalar[]); 253217df18f2SToby Isaac PETSC_EXTERN PetscErrorCode PetscSortIntWithDataArray(PetscInt,PetscInt[],void*,size_t,void*); 2533014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortReal(PetscInt,PetscReal[]); 253439f41f7fSStefano Zampini PETSC_EXTERN PetscErrorCode PetscSortRealWithArrayInt(PetscInt,PetscReal[],PetscInt[]); 2535014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortRealWithPermutation(PetscInt,const PetscReal[],PetscInt[]); 2536745b41b2SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscSortRemoveDupsReal(PetscInt*,PetscReal[]); 253739f41f7fSStefano Zampini PETSC_EXTERN PetscErrorCode PetscFindReal(PetscReal,PetscInt,const PetscReal[],PetscReal,PetscInt*); 2538014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortSplit(PetscInt,PetscInt,PetscScalar[],PetscInt[]); 2539014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortSplitReal(PetscInt,PetscInt,PetscReal[],PetscInt[]); 2540014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscProcessTree(PetscInt,const PetscBool [],const PetscInt[],PetscInt*,PetscInt**,PetscInt**,PetscInt**,PetscInt**); 25416c2863d0SBarry Smith PETSC_EXTERN PetscErrorCode PetscMergeIntArrayPair(PetscInt,const PetscInt[],const PetscInt[],PetscInt,const PetscInt[],const PetscInt[],PetscInt*,PetscInt**,PetscInt**); 25426c2863d0SBarry Smith PETSC_EXTERN PetscErrorCode PetscMergeIntArray(PetscInt,const PetscInt[],PetscInt,const PetscInt[],PetscInt*,PetscInt**); 2543e498c390SJed Brown PETSC_EXTERN PetscErrorCode PetscMergeMPIIntArray(PetscInt,const PetscMPIInt[],PetscInt,const PetscMPIInt[],PetscInt*,PetscMPIInt**); 2544ce605777SToby Isaac PETSC_EXTERN PetscErrorCode PetscParallelSortedInt(MPI_Comm, PetscInt, const PetscInt[], PetscBool *); 2545ce605777SToby Isaac 25464d3610e3SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscTimSort(PetscInt,void*,size_t,int(*)(const void*,const void*,void*),void*); 2547676f2a66SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscIntSortSemiOrdered(PetscInt,PetscInt[]); 2548676f2a66SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscMPIIntSortSemiOrdered(PetscInt,PetscMPIInt[]); 2549676f2a66SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscRealSortSemiOrdered(PetscInt,PetscReal[]); 25504d3610e3SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscTimSortWithArray(PetscInt,void*,size_t,void*,size_t,int(*)(const void*,const void*,void*),void*); 2551676f2a66SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscIntSortSemiOrderedWithArray(PetscInt,PetscInt[],PetscInt[]); 2552676f2a66SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscMPIIntSortSemiOrderedWithArray(PetscInt,PetscMPIInt[],PetscMPIInt[]); 2553676f2a66SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscRealSortSemiOrderedWithArrayInt(PetscInt,PetscReal[],PetscInt[]); 2554676f2a66SJacob Faibussowitsch 2555014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetDisplay(void); 2556014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetDisplay(char[],size_t); 2557d382aafbSBarry Smith 255876bdecfbSBarry Smith /*J 2559d382aafbSBarry Smith PetscRandomType - String with the name of a PETSc randomizer 2560d382aafbSBarry Smith 2561d382aafbSBarry Smith Level: beginner 2562d382aafbSBarry Smith 2563e28ce29aSPatrick Sanan Notes: 2564e28ce29aSPatrick Sanan To use SPRNG or RANDOM123 you must have ./configure PETSc 256525ccb61fSToby Isaac with the option --download-sprng or --download-random123 2566d382aafbSBarry Smith 25678f6c3df8SBarry Smith .seealso: PetscRandomSetType(), PetscRandom, PetscRandomCreate() 256876bdecfbSBarry Smith J*/ 256919fd82e9SBarry Smith typedef const char* PetscRandomType; 2570d382aafbSBarry Smith #define PETSCRAND "rand" 2571d382aafbSBarry Smith #define PETSCRAND48 "rand48" 2572d382aafbSBarry Smith #define PETSCSPRNG "sprng" 2573c5e4d11fSDmitry Karpeev #define PETSCRANDER48 "rander48" 257425ccb61fSToby Isaac #define PETSCRANDOM123 "random123" 2575808ba619SStefano Zampini #define PETSCCURAND "curand" 2576d382aafbSBarry Smith 2577d382aafbSBarry Smith /* Logging support */ 2578014dd563SJed Brown PETSC_EXTERN PetscClassId PETSC_RANDOM_CLASSID; 2579d382aafbSBarry Smith 2580607a6623SBarry Smith PETSC_EXTERN PetscErrorCode PetscRandomInitializePackage(void); 2581d382aafbSBarry Smith 2582d382aafbSBarry Smith /* Dynamic creation and loading functions */ 2583140e18c1SBarry Smith PETSC_EXTERN PetscFunctionList PetscRandomList; 2584d382aafbSBarry Smith 2585bdf89e91SBarry Smith PETSC_EXTERN PetscErrorCode PetscRandomRegister(const char[],PetscErrorCode (*)(PetscRandom)); 258619fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode PetscRandomSetType(PetscRandom,PetscRandomType); 2587014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomSetFromOptions(PetscRandom); 258819fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode PetscRandomGetType(PetscRandom,PetscRandomType*); 2589fe2efc57SMark PETSC_EXTERN PetscErrorCode PetscRandomViewFromOptions(PetscRandom,PetscObject,const char[]); 2590014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomView(PetscRandom,PetscViewer); 2591d382aafbSBarry Smith 2592014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate(MPI_Comm,PetscRandom*); 2593014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomGetValue(PetscRandom,PetscScalar*); 2594014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomGetValueReal(PetscRandom,PetscReal*); 2595808ba619SStefano Zampini PETSC_EXTERN PetscErrorCode PetscRandomGetValues(PetscRandom,PetscInt,PetscScalar*); 2596808ba619SStefano Zampini PETSC_EXTERN PetscErrorCode PetscRandomGetValuesReal(PetscRandom,PetscInt,PetscReal*); 2597014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomGetInterval(PetscRandom,PetscScalar*,PetscScalar*); 2598014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomSetInterval(PetscRandom,PetscScalar,PetscScalar); 2599014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomSetSeed(PetscRandom,unsigned long); 2600014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomGetSeed(PetscRandom,unsigned long *); 2601014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomSeed(PetscRandom); 2602014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomDestroy(PetscRandom*); 2603d382aafbSBarry Smith 2604014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetFullPath(const char[],char[],size_t); 2605014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetRelativePath(const char[],char[],size_t); 2606014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetWorkingDirectory(char[],size_t); 2607014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetRealPath(const char[],char[]); 2608014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetHomeDirectory(char[],size_t); 2609014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscTestFile(const char[],char,PetscBool *); 2610014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscTestDirectory(const char[],char,PetscBool *); 261197540f07SSatish Balay PETSC_EXTERN PetscErrorCode PetscMkdir(const char[]); 26128a10d460SHong Zhang PETSC_EXTERN PetscErrorCode PetscMkdtemp(char[]); 261397540f07SSatish Balay PETSC_EXTERN PetscErrorCode PetscRMTree(const char[]); 2614d382aafbSBarry Smith 261530815ce0SLisandro Dalcin PETSC_STATIC_INLINE PetscBool PetscBinaryBigEndian(void) {long _petsc_v = 1; return ((char*)&_petsc_v)[0] ? PETSC_FALSE : PETSC_TRUE;} 261630815ce0SLisandro Dalcin 26179860990eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscBinaryRead(int,void*,PetscInt,PetscInt*,PetscDataType); 26189860990eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscBinarySynchronizedRead(MPI_Comm,int,void*,PetscInt,PetscInt*,PetscDataType); 2619f253e43cSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscBinaryWrite(int,const void*,PetscInt,PetscDataType); 2620f253e43cSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscBinarySynchronizedWrite(MPI_Comm,int,const void*,PetscInt,PetscDataType); 2621014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscBinaryOpen(const char[],PetscFileMode,int *); 2622014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscBinaryClose(int); 2623014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSharedTmp(MPI_Comm,PetscBool *); 2624014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSharedWorkingDirectory(MPI_Comm,PetscBool *); 2625014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetTmp(MPI_Comm,char[],size_t); 2626014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFileRetrieve(MPI_Comm,const char[],char[],size_t,PetscBool *); 2627014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLs(MPI_Comm,const char[],char[],size_t,PetscBool *); 2628c891a504SStefano Zampini #if defined(PETSC_USE_SOCKET_VIEWER) 2629e2fc02c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscOpenSocket(const char[],int,int*); 2630c891a504SStefano Zampini #endif 2631d382aafbSBarry Smith 2632014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscBinarySeek(int,off_t,PetscBinarySeekType,off_t*); 2633014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscBinarySynchronizedSeek(MPI_Comm,int,off_t,PetscBinarySeekType,off_t*); 2634014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscByteSwap(void *,PetscDataType,PetscInt); 2635d382aafbSBarry Smith 2636014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetDebugTerminal(const char[]); 2637014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetDebugger(const char[],PetscBool); 2638014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetDefaultDebugger(void); 2639014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetDebuggerFromString(const char*); 2640014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscAttachDebugger(void); 2641014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStopForDebugger(void); 26422a2a2941SBarry Smith PETSC_EXTERN PetscErrorCode PetscWaitOnError(void); 2643d382aafbSBarry Smith 2644014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGatherNumberOfMessages(MPI_Comm,const PetscMPIInt[],const PetscMPIInt[],PetscMPIInt*); 2645014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGatherMessageLengths(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],PetscMPIInt**,PetscMPIInt**); 2646014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGatherMessageLengths2(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],const PetscMPIInt[],PetscMPIInt**,PetscMPIInt**,PetscMPIInt**); 2647014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPostIrecvInt(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],const PetscMPIInt[],PetscInt***,MPI_Request**); 2648014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPostIrecvScalar(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],const PetscMPIInt[],PetscScalar***,MPI_Request**); 2649cf4b5b4fSJed Brown PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSided(MPI_Comm,PetscMPIInt,MPI_Datatype,PetscMPIInt,const PetscMPIInt*,const void*,PetscMPIInt*,PetscMPIInt**,void*) 2650cf4b5b4fSJed Brown PetscAttrMPIPointerWithType(6,3); 2651d815da10SJed Brown PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedF(MPI_Comm,PetscMPIInt,MPI_Datatype,PetscMPIInt,const PetscMPIInt[],const void*,PetscMPIInt*,PetscMPIInt**,void*,PetscMPIInt, 2652d815da10SJed Brown PetscErrorCode (*send)(MPI_Comm,const PetscMPIInt[],PetscMPIInt,PetscMPIInt,void*,MPI_Request[],void*), 2653d815da10SJed Brown PetscErrorCode (*recv)(MPI_Comm,const PetscMPIInt[],PetscMPIInt,void*,MPI_Request[],void*),void *ctx) 2654d815da10SJed Brown PetscAttrMPIPointerWithType(6,3); 26556afbe7ddSJed Brown PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedFReq(MPI_Comm,PetscMPIInt,MPI_Datatype,PetscMPIInt,const PetscMPIInt[],const void*,PetscMPIInt*,PetscMPIInt**,void*,PetscMPIInt, 26566afbe7ddSJed Brown MPI_Request**,MPI_Request**, 26576afbe7ddSJed Brown PetscErrorCode (*send)(MPI_Comm,const PetscMPIInt[],PetscMPIInt,PetscMPIInt,void*,MPI_Request[],void*), 26586afbe7ddSJed Brown PetscErrorCode (*recv)(MPI_Comm,const PetscMPIInt[],PetscMPIInt,void*,MPI_Request[],void*),void *ctx) 26596afbe7ddSJed Brown PetscAttrMPIPointerWithType(6,3); 2660d382aafbSBarry Smith 26616145cd65SJed Brown PETSC_EXTERN const char *const PetscBuildTwoSidedTypes[]; 26626145cd65SJed Brown PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedSetType(MPI_Comm,PetscBuildTwoSidedType); 26636145cd65SJed Brown PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedGetType(MPI_Comm,PetscBuildTwoSidedType*); 26646145cd65SJed Brown 2665014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSSEIsEnabled(MPI_Comm,PetscBool*,PetscBool*); 2666d382aafbSBarry Smith 2667ce94432eSBarry Smith PETSC_EXTERN MPI_Comm PetscObjectComm(PetscObject); 2668ce94432eSBarry Smith 266945487dadSJed Brown PETSC_EXTERN const char *const PetscSubcommTypes[]; 267045487dadSJed Brown 2671d382aafbSBarry Smith struct _n_PetscSubcomm { 2672d382aafbSBarry Smith MPI_Comm parent; /* parent communicator */ 2673d382aafbSBarry Smith MPI_Comm dupparent; /* duplicate parent communicator, under which the processors of this subcomm have contiguous rank */ 2674306c2d5bSBarry Smith MPI_Comm child; /* the sub-communicator */ 267545487dadSJed Brown PetscMPIInt n; /* num of subcommunicators under the parent communicator */ 267645487dadSJed Brown PetscMPIInt color; /* color of processors belong to this communicator */ 2677708d824cSJed Brown PetscMPIInt *subsize; /* size of subcommunicator[color] */ 267845487dadSJed Brown PetscSubcommType type; 2679e5acf8a4SHong Zhang char *subcommprefix; 2680d382aafbSBarry Smith }; 2681d382aafbSBarry Smith 2682c5e4d11fSDmitry Karpeev PETSC_STATIC_INLINE MPI_Comm PetscSubcommParent(PetscSubcomm scomm) {return scomm->parent;} 2683306c2d5bSBarry Smith PETSC_STATIC_INLINE MPI_Comm PetscSubcommChild(PetscSubcomm scomm) {return scomm->child;} 268436be1a5eSBarry Smith PETSC_STATIC_INLINE MPI_Comm PetscSubcommContiguousParent(PetscSubcomm scomm) {return scomm->dupparent;} 2685014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSubcommCreate(MPI_Comm,PetscSubcomm*); 2686014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSubcommDestroy(PetscSubcomm*); 2687014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSubcommSetNumber(PetscSubcomm,PetscInt); 2688014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSubcommSetType(PetscSubcomm,PetscSubcommType); 268965d9b8f1SHong Zhang PETSC_EXTERN PetscErrorCode PetscSubcommSetTypeGeneral(PetscSubcomm,PetscMPIInt,PetscMPIInt); 2690053d1c95SHong Zhang PETSC_EXTERN PetscErrorCode PetscSubcommView(PetscSubcomm,PetscViewer); 2691f68be91cSHong Zhang PETSC_EXTERN PetscErrorCode PetscSubcommSetFromOptions(PetscSubcomm); 2692e5acf8a4SHong Zhang PETSC_EXTERN PetscErrorCode PetscSubcommSetOptionsPrefix(PetscSubcomm,const char[]); 2693a530d236SBarry Smith PETSC_EXTERN PetscErrorCode PetscSubcommGetParent(PetscSubcomm,MPI_Comm*); 2694a530d236SBarry Smith PETSC_EXTERN PetscErrorCode PetscSubcommGetContiguousParent(PetscSubcomm,MPI_Comm*); 2695a530d236SBarry Smith PETSC_EXTERN PetscErrorCode PetscSubcommGetChild(PetscSubcomm,MPI_Comm*); 2696d382aafbSBarry Smith 26979962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapCreate(PetscInt,PetscHeap*); 26989962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapAdd(PetscHeap,PetscInt,PetscInt); 26999962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapPop(PetscHeap,PetscInt*,PetscInt*); 27009962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapPeek(PetscHeap,PetscInt*,PetscInt*); 27019962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapStash(PetscHeap,PetscInt,PetscInt); 27029962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapUnstash(PetscHeap); 27039962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapDestroy(PetscHeap*); 27049962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapView(PetscHeap,PetscViewer); 27059962606eSBarry Smith 27065e71baefSBarry Smith PETSC_EXTERN PetscErrorCode PetscProcessPlacementView(PetscViewer); 27075f7487a0SJunchao Zhang PETSC_EXTERN PetscErrorCode PetscShmCommGet(MPI_Comm,PetscShmComm*); 27085f7487a0SJunchao Zhang PETSC_EXTERN PetscErrorCode PetscShmCommGlobalToLocal(PetscShmComm,PetscMPIInt,PetscMPIInt*); 27095f7487a0SJunchao Zhang PETSC_EXTERN PetscErrorCode PetscShmCommLocalToGlobal(PetscShmComm,PetscMPIInt,PetscMPIInt*); 27105f7487a0SJunchao Zhang PETSC_EXTERN PetscErrorCode PetscShmCommGetMpiShmComm(PetscShmComm,MPI_Comm*); 27115e71baefSBarry Smith 2712a32e93adSJunchao Zhang /* routines to better support OpenMP multithreading needs of some PETSc third party libraries */ 2713a32e93adSJunchao Zhang PETSC_EXTERN PetscErrorCode PetscOmpCtrlCreate(MPI_Comm,PetscInt,PetscOmpCtrl*); 2714a32e93adSJunchao Zhang PETSC_EXTERN PetscErrorCode PetscOmpCtrlGetOmpComms(PetscOmpCtrl,MPI_Comm*,MPI_Comm*,PetscBool*); 2715a32e93adSJunchao Zhang PETSC_EXTERN PetscErrorCode PetscOmpCtrlDestroy(PetscOmpCtrl*); 2716a32e93adSJunchao Zhang PETSC_EXTERN PetscErrorCode PetscOmpCtrlBarrier(PetscOmpCtrl); 2717a32e93adSJunchao Zhang PETSC_EXTERN PetscErrorCode PetscOmpCtrlOmpRegionOnMasterBegin(PetscOmpCtrl); 2718a32e93adSJunchao Zhang PETSC_EXTERN PetscErrorCode PetscOmpCtrlOmpRegionOnMasterEnd(PetscOmpCtrl); 2719a32e93adSJunchao Zhang 272013e3f751SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferCreate(size_t,size_t,PetscSegBuffer*); 27210f453b92SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferDestroy(PetscSegBuffer*); 272213e3f751SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferGet(PetscSegBuffer,size_t,void*); 2723137cf7b6SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferExtractAlloc(PetscSegBuffer,void*); 2724137cf7b6SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferExtractTo(PetscSegBuffer,void*); 2725137cf7b6SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferExtractInPlace(PetscSegBuffer,void*); 272613e3f751SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferGetSize(PetscSegBuffer,size_t*); 272713e3f751SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferUnuse(PetscSegBuffer,size_t); 27280f453b92SJed Brown 2729471ecdacSJed Brown /* Type-safe wrapper to encourage use of PETSC_RESTRICT. Does not use PetscFunctionBegin because the error handling 2730471ecdacSJed Brown * prevents the compiler from completely erasing the stub. This is called in inner loops so it has to be as fast as 2731471ecdacSJed Brown * possible. */ 27326a11cab8SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscSegBufferGetInts(PetscSegBuffer seg,size_t count,PetscInt *PETSC_RESTRICT *slot) {return PetscSegBufferGet(seg,count,(void**)slot);} 2733d382aafbSBarry Smith 27349de0f6ecSBarry Smith extern PetscOptionsHelpPrinted PetscOptionsHelpPrintedSingleton; 27359de0f6ecSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsHelpPrintedDestroy(PetscOptionsHelpPrinted*); 27369de0f6ecSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsHelpPrintedCreate(PetscOptionsHelpPrinted*); 27379de0f6ecSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsHelpPrintedCheck(PetscOptionsHelpPrinted,const char*,const char*,PetscBool*); 27389de0f6ecSBarry Smith 2739ace2fbaeSBarry Smith #include <stdarg.h> 2740ace2fbaeSBarry Smith PETSC_EXTERN PetscErrorCode PetscVSNPrintf(char*,size_t,const char[],size_t*,va_list); 2741ace2fbaeSBarry Smith PETSC_EXTERN PetscErrorCode (*PetscVFPrintf)(FILE*,const char[],va_list); 2742ace2fbaeSBarry Smith 2743268b0dfdSSatish Balay PETSC_EXTERN PetscSegBuffer PetscCitationsList; 2744fbfcfee5SBarry Smith 27451f817a21SBarry Smith /*@C 27461f817a21SBarry Smith PetscCitationsRegister - Register a bibtex item to obtain credit for an implemented algorithm used in the code. 27471f817a21SBarry Smith 27481f817a21SBarry Smith Not Collective - only what is registered on rank 0 of PETSC_COMM_WORLD will be printed 27491f817a21SBarry Smith 27501f817a21SBarry Smith Input Parameters: 27511f817a21SBarry Smith + cite - the bibtex item, formated to displayed on multiple lines nicely 27521f817a21SBarry Smith - set - a boolean variable initially set to PETSC_FALSE; this is used to insure only a single registration of the citation 27531f817a21SBarry Smith 2754850545d0SSatish Balay Level: intermediate 2755850545d0SSatish Balay 2756f5f57ec0SBarry Smith Not available from Fortran 2757f5f57ec0SBarry Smith 27581f817a21SBarry Smith Options Database: 2759063414e0SPatrick Sanan . -citations [filename] - print out the bibtex entries for the given computation 27601f817a21SBarry Smith @*/ 2761dff31646SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscCitationsRegister(const char cit[],PetscBool *set) 2762dff31646SBarry Smith { 2763dff31646SBarry Smith size_t len; 2764dff31646SBarry Smith char *vstring; 2765dff31646SBarry Smith PetscErrorCode ierr; 2766dff31646SBarry Smith 27671f817a21SBarry Smith PetscFunctionBegin; 27688d3683fcSBarry Smith if (set && *set) PetscFunctionReturn(0); 2769dff31646SBarry Smith ierr = PetscStrlen(cit,&len);CHKERRQ(ierr); 277035005c2bSLisandro Dalcin ierr = PetscSegBufferGet(PetscCitationsList,len,&vstring);CHKERRQ(ierr); 2771580bdb30SBarry Smith ierr = PetscArraycpy(vstring,cit,len);CHKERRQ(ierr); 2772dff31646SBarry Smith if (set) *set = PETSC_TRUE; 27731f817a21SBarry Smith PetscFunctionReturn(0); 2774dff31646SBarry Smith } 2775dff31646SBarry Smith 2776b967cddfSBarry Smith PETSC_EXTERN PetscErrorCode PetscURLShorten(const char[],char[],size_t); 2777fe278a28SBarry Smith PETSC_EXTERN PetscErrorCode PetscGoogleDriveAuthorize(MPI_Comm,char[],char[],size_t); 2778fe278a28SBarry Smith PETSC_EXTERN PetscErrorCode PetscGoogleDriveRefresh(MPI_Comm,const char[],char[],size_t); 2779f044a08eSBarry Smith PETSC_EXTERN PetscErrorCode PetscGoogleDriveUpload(MPI_Comm,const char[],const char []); 2780fe278a28SBarry Smith 2781f044a08eSBarry Smith PETSC_EXTERN PetscErrorCode PetscBoxAuthorize(MPI_Comm,char[],char[],size_t); 2782f044a08eSBarry Smith PETSC_EXTERN PetscErrorCode PetscBoxRefresh(MPI_Comm,const char[],char[],char[],size_t); 2783b967cddfSBarry Smith 27849f4d3c52SBarry Smith PETSC_EXTERN PetscErrorCode PetscGlobusGetTransfers(MPI_Comm,const char[],char[],size_t); 27859f4d3c52SBarry Smith 278604102261SBarry Smith PETSC_EXTERN PetscErrorCode PetscTextBelt(MPI_Comm,const char[],const char[],PetscBool*); 2787763ec7b1SBarry Smith PETSC_EXTERN PetscErrorCode PetscTellMyCell(MPI_Comm,const char[],const char[],PetscBool*); 2788dff31646SBarry Smith 278968e69593SBarry Smith PETSC_EXTERN PetscErrorCode PetscPullJSONValue(const char[],const char[],char[],size_t,PetscBool*); 27905dc0f0a4SBarry Smith PETSC_EXTERN PetscErrorCode PetscPushJSONValue(char[],const char[],const char[],size_t); 2791d382aafbSBarry Smith 2792b2566f29SBarry Smith #if defined(PETSC_USE_DEBUG) 2793503e1a2cSLisandro Dalcin PETSC_STATIC_INLINE unsigned int PetscStrHash(const char *str) 2794df05ca09SBarry Smith { 2795df05ca09SBarry Smith unsigned int c,hash = 5381; 2796df05ca09SBarry Smith 2797503e1a2cSLisandro Dalcin while ((c = (unsigned int)*str++)) hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ 2798df05ca09SBarry Smith return hash; 2799df05ca09SBarry Smith } 280077a5e07dSBarry Smith 280177a5e07dSBarry Smith /*MC 280277a5e07dSBarry Smith MPIU_Allreduce - a PETSc replacement for MPI_Allreduce() that tries to determine if the call from all the MPI processes occur from the 280377a5e07dSBarry Smith same place in the PETSc code. This helps to detect bugs where different MPI processes follow different code paths 280477a5e07dSBarry Smith resulting in inconsistent and incorrect calls to MPI_Allreduce(). 280577a5e07dSBarry Smith 2806d083f849SBarry Smith Collective 280777a5e07dSBarry Smith 280877a5e07dSBarry Smith Synopsis: 280977a5e07dSBarry Smith #include <petscsys.h> 281077a5e07dSBarry Smith PetscErrorCode MPIU_Allreduce(void *indata,void *outdata,PetscMPIInt count,MPI_Datatype datatype, MPI_Op op, MPI_Comm comm); 281177a5e07dSBarry Smith 281277a5e07dSBarry Smith Input Parameters: 2813df05ca09SBarry Smith + a - pointer to the input data to be reduced 2814df05ca09SBarry Smith . c - the number of MPI data items in a and b 2815df05ca09SBarry Smith . d - the MPI datatype, for example MPI_INT 2816df05ca09SBarry Smith . e - the MPI operation, for example MPI_SUM 2817df05ca09SBarry Smith - fcomm - the MPI communicator on which the operation occurs 281877a5e07dSBarry Smith 281977a5e07dSBarry Smith Output Parameter: 2820df05ca09SBarry Smith . b - the reduced values 282177a5e07dSBarry Smith 2822e28ce29aSPatrick Sanan Notes: 2823e28ce29aSPatrick Sanan In optimized mode this directly calls MPI_Allreduce() 282477a5e07dSBarry Smith 2825df05ca09SBarry Smith This is defined as a macro that can return error codes internally so it cannot be used in a subroutine that returns void. 2826df05ca09SBarry Smith 2827df05ca09SBarry Smith The error code this returns should be checked with CHKERRMPI() 2828df05ca09SBarry Smith 282977a5e07dSBarry Smith Level: developer 283077a5e07dSBarry Smith 283177a5e07dSBarry Smith .seealso: MPI_Allreduce() 283277a5e07dSBarry Smith M*/ 2833df05ca09SBarry Smith #define MPIU_Allreduce(a,b,c,d,e,fcomm) MPI_SUCCESS; do {\ 2834df05ca09SBarry Smith PetscErrorCode _4_ierr; \ 2835df05ca09SBarry Smith PetscMPIInt a_b1[6],a_b2[6];\ 2836df05ca09SBarry Smith a_b1[0] = -(PetscMPIInt)__LINE__; a_b1[1] = -a_b1[0];\ 2837df05ca09SBarry Smith a_b1[2] = -(PetscMPIInt)PetscStrHash(PETSC_FUNCTION_NAME); a_b1[3] = -a_b1[2];\ 2838df05ca09SBarry Smith a_b1[4] = -(PetscMPIInt)(c); a_b1[5] = -a_b1[4];\ 2839df05ca09SBarry Smith _4_ierr = MPI_Allreduce(a_b1,a_b2,6,MPI_INT,MPI_MAX,fcomm);CHKERRMPI(_4_ierr);\ 2840df05ca09SBarry Smith if (-a_b2[0] != a_b2[1]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"MPI_Allreduce() called in different locations (code lines) on different processors");\ 2841df05ca09SBarry Smith if (-a_b2[2] != a_b2[3]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"MPI_Allreduce() called in different locations (functions) on different processors");\ 2842df05ca09SBarry Smith if (-a_b2[4] != a_b2[5]) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"MPI_Allreduce() called with different counts %d on different processors",c);\ 2843df05ca09SBarry Smith _4_ierr = MPI_Allreduce((a),(b),(c),d,e,(fcomm));CHKERRMPI(_4_ierr);\ 2844df05ca09SBarry Smith } while (0) 2845b2566f29SBarry Smith #else 2846df05ca09SBarry Smith #define MPIU_Allreduce(a,b,c,d,e,fcomm) MPI_Allreduce((a),(b),(c),d,e,(fcomm)) 2847b2566f29SBarry Smith #endif 2848b2566f29SBarry Smith 2849b674149eSJunchao Zhang #if defined(PETSC_HAVE_MPI_PROCESS_SHARED_MEMORY) 28508198064fSBarry Smith PETSC_EXTERN PetscErrorCode MPIU_Win_allocate_shared(MPI_Aint,PetscMPIInt,MPI_Info,MPI_Comm,void*,MPI_Win*); 28518198064fSBarry Smith PETSC_EXTERN PetscErrorCode MPIU_Win_shared_query(MPI_Win,PetscMPIInt,MPI_Aint*,PetscMPIInt*,void*); 28522f065d89SBarry Smith #endif 28538198064fSBarry Smith 2854cd88fca5SStefano Zampini /* this is a vile hack */ 2855cd88fca5SStefano Zampini #if defined(PETSC_HAVE_NECMPI) 2856961fb248SStefano Zampini #if !defined(PETSC_NECMPI_VERSION_MAJOR) || \ 2857961fb248SStefano Zampini !defined(PETSC_NECMPI_VERSION_MINOR) || \ 2858961fb248SStefano Zampini PETSC_NECMPI_VERSION_MAJOR < 2 || \ 2859961fb248SStefano Zampini (PETSC_NECMPI_VERSION_MAJOR == 2 && PETSC_NECMPI_VERSION_MINOR < 18) 2860cd88fca5SStefano Zampini #define MPI_Type_free(a) (*(a) = MPI_DATATYPE_NULL,0); 2861cd88fca5SStefano Zampini #endif 2862961fb248SStefano Zampini #endif 2863cd88fca5SStefano Zampini 286412801b39SBarry Smith /* 286560fbe2beSVaclav Hapla List of external packages and queries on it 286660fbe2beSVaclav Hapla */ 286760fbe2beSVaclav Hapla PETSC_EXTERN PetscErrorCode PetscHasExternalPackage(const char[],PetscBool*); 286860fbe2beSVaclav Hapla 2869d382aafbSBarry Smith #endif 2870