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 */ 56c7e564aSBarry Smith #if !defined(__PETSCSYS_H) 66c7e564aSBarry Smith #define __PETSCSYS_H 7d382aafbSBarry Smith /* ========================================================================== */ 8d382aafbSBarry Smith /* 9d382aafbSBarry Smith petscconf.h is contained in ${PETSC_ARCH}/include/petscconf.h it is 101cc8b206SBarry Smith found automatically by the compiler due to the -I${PETSC_DIR}/${PETSC_ARCH}/include. 111cc8b206SBarry Smith For --prefix installs the ${PETSC_ARCH}/ does not exist and petscconf.h is in the same 121cc8b206SBarry Smith directory as the other PETSc include files. 13d382aafbSBarry Smith */ 142c8e378dSBarry Smith #include <petscconf.h> 152c8e378dSBarry Smith #include <petscfix.h> 16d382aafbSBarry Smith 1773fca5a0SBarry Smith #if defined(PETSC_DESIRE_FEATURE_TEST_MACROS) 1873fca5a0SBarry Smith /* 1973fca5a0SBarry Smith Feature test macros must be included before headers defined by IEEE Std 1003.1-2001 2073fca5a0SBarry Smith We only turn these in PETSc source files that require them by setting PETSC_DESIRE_FEATURE_TEST_MACROS 2173fca5a0SBarry Smith */ 22216f1ae6SBarry Smith # if defined(PETSC__POSIX_C_SOURCE_200112L) && !defined(_POSIX_C_SOURCE) 2373fca5a0SBarry Smith # define _POSIX_C_SOURCE 200112L 2473fca5a0SBarry Smith # endif 25216f1ae6SBarry Smith # if defined(PETSC__BSD_SOURCE) && !defined(_BSD_SOURCE) 2673fca5a0SBarry Smith # define _BSD_SOURCE 2773fca5a0SBarry Smith # endif 2807f00807SSatish Balay # if defined(PETSC__DEFAULT_SOURCE) && !defined(_DEFAULT_SOURCE) 2907f00807SSatish Balay # define _DEFAULT_SOURCE 3007f00807SSatish Balay # endif 31ea0fecefSShri Abhyankar # if defined(PETSC__GNU_SOURCE) && !defined(_GNU_SOURCE) 32ea0fecefSShri Abhyankar # define _GNU_SOURCE 33ea0fecefSShri Abhyankar # endif 3473fca5a0SBarry Smith #endif 3573fca5a0SBarry Smith 36df4397b0SStefano Zampini #include <petscsystypes.h> 37df4397b0SStefano Zampini 38d382aafbSBarry Smith /* ========================================================================== */ 39d382aafbSBarry Smith /* 402c280183SJed Brown This facilitates using the C version of PETSc from C++ and the C++ version from C. 41d382aafbSBarry Smith */ 421ec50b02SJed Brown #if defined(__cplusplus) 431ec50b02SJed Brown # define PETSC_FUNCTION_NAME PETSC_FUNCTION_NAME_CXX 441ec50b02SJed Brown #else 451ec50b02SJed Brown # define PETSC_FUNCTION_NAME PETSC_FUNCTION_NAME_C 461ec50b02SJed Brown #endif 47d382aafbSBarry Smith 48c5e4d11fSDmitry Karpeev /* ========================================================================== */ 49c5e4d11fSDmitry Karpeev /* 50c5e4d11fSDmitry Karpeev Since PETSc manages its own extern "C" handling users should never include PETSc include 511cc8b206SBarry Smith files within extern "C". This will generate a compiler error if a user does put the include 521cc8b206SBarry Smith file within an extern "C". 53c5e4d11fSDmitry Karpeev */ 54c5e4d11fSDmitry Karpeev #if defined(__cplusplus) 55c5e4d11fSDmitry Karpeev void assert_never_put_petsc_headers_inside_an_extern_c(int); void assert_never_put_petsc_headers_inside_an_extern_c(double); 56c5e4d11fSDmitry Karpeev #endif 57c5e4d11fSDmitry Karpeev 58ed938b00SJed Brown #if defined(__cplusplus) 59ed938b00SJed Brown # define PETSC_RESTRICT PETSC_CXX_RESTRICT 60ed938b00SJed Brown #else 61ed938b00SJed Brown # define PETSC_RESTRICT PETSC_C_RESTRICT 62ed938b00SJed Brown #endif 63ed938b00SJed Brown 64ed938b00SJed Brown #if defined(__cplusplus) 6558c433abSLisandro Dalcin # define PETSC_INLINE PETSC_CXX_INLINE 66ed938b00SJed Brown #else 6758c433abSLisandro Dalcin # define PETSC_INLINE PETSC_C_INLINE 68ed938b00SJed Brown #endif 69ed938b00SJed Brown 7058c433abSLisandro Dalcin #define PETSC_STATIC_INLINE static PETSC_INLINE 7158c433abSLisandro Dalcin 72ab699e31SSatish Balay #if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES) /* For Win32 shared libraries */ 73014dd563SJed Brown # define PETSC_DLLEXPORT __declspec(dllexport) 74014dd563SJed Brown # define PETSC_DLLIMPORT __declspec(dllimport) 7521f66b81SJed Brown # define PETSC_VISIBILITY_INTERNAL 7626703958SBarry Smith #elif defined(PETSC_USE_VISIBILITY_CXX) && defined(__cplusplus) 7726703958SBarry Smith # define PETSC_DLLEXPORT __attribute__((visibility ("default"))) 7826703958SBarry Smith # define PETSC_DLLIMPORT __attribute__((visibility ("default"))) 7926703958SBarry Smith # define PETSC_VISIBILITY_INTERNAL __attribute__((visibility ("hidden"))) 8026703958SBarry Smith #elif defined(PETSC_USE_VISIBILITY_C) && !defined(__cplusplus) 81014dd563SJed Brown # define PETSC_DLLEXPORT __attribute__((visibility ("default"))) 82014dd563SJed Brown # define PETSC_DLLIMPORT __attribute__((visibility ("default"))) 8321f66b81SJed Brown # define PETSC_VISIBILITY_INTERNAL __attribute__((visibility ("hidden"))) 84d382aafbSBarry Smith #else 85014dd563SJed Brown # define PETSC_DLLEXPORT 86014dd563SJed Brown # define PETSC_DLLIMPORT 8721f66b81SJed Brown # define PETSC_VISIBILITY_INTERNAL 88014dd563SJed Brown #endif 89014dd563SJed Brown 90014dd563SJed Brown #if defined(petsc_EXPORTS) /* CMake defines this when building the shared library */ 91014dd563SJed Brown # define PETSC_VISIBILITY_PUBLIC PETSC_DLLEXPORT 92014dd563SJed Brown #else /* Win32 users need this to import symbols from petsc.dll */ 93014dd563SJed Brown # define PETSC_VISIBILITY_PUBLIC PETSC_DLLIMPORT 94014dd563SJed Brown #endif 95014dd563SJed Brown 961cc8b206SBarry Smith /* 971cc8b206SBarry Smith Functions tagged with PETSC_EXTERN in the header files are 981cc8b206SBarry Smith always defined as extern "C" when compiled with C++ so they may be 991cc8b206SBarry Smith used from C and are always visible in the shared libraries 1001cc8b206SBarry Smith */ 1012c280183SJed Brown #if defined(__cplusplus) 102014dd563SJed Brown # define PETSC_EXTERN extern "C" PETSC_VISIBILITY_PUBLIC 103638cfed1SJed Brown # define PETSC_EXTERN_TYPEDEF extern "C" 10421f66b81SJed Brown # define PETSC_INTERN extern "C" PETSC_VISIBILITY_INTERNAL 105014dd563SJed Brown #else 106014dd563SJed Brown # define PETSC_EXTERN extern PETSC_VISIBILITY_PUBLIC 107638cfed1SJed Brown # define PETSC_EXTERN_TYPEDEF 1086258c452SJed Brown # define PETSC_INTERN extern PETSC_VISIBILITY_INTERNAL 109d382aafbSBarry Smith #endif 11027710113SBarry Smith 1112c8e378dSBarry Smith #include <petscversion.h> 112a8d69d7bSBarry Smith #define PETSC_AUTHOR_INFO " The PETSc Team\n petsc-maint@mcs.anl.gov\n https://www.mcs.anl.gov/petsc/\n" 113d382aafbSBarry Smith 114d382aafbSBarry Smith /* ========================================================================== */ 115d382aafbSBarry Smith 116d382aafbSBarry Smith /* 117d382aafbSBarry Smith Defines the interface to MPI allowing the use of all MPI functions. 118d382aafbSBarry Smith 119d382aafbSBarry Smith PETSc does not use the C++ binding of MPI at ALL. The following flag 120d382aafbSBarry Smith makes sure the C++ bindings are not included. The C++ bindings REQUIRE 121d382aafbSBarry Smith putting mpi.h before ANY C++ include files, we cannot control this 122d382aafbSBarry Smith with all PETSc users. Users who want to use the MPI C++ bindings can include 123d382aafbSBarry Smith mpicxx.h directly in their code 124d382aafbSBarry Smith */ 125fa9e63e2SJed Brown #if !defined(MPICH_SKIP_MPICXX) 126d382aafbSBarry Smith # define MPICH_SKIP_MPICXX 1 127fa9e63e2SJed Brown #endif 128fa9e63e2SJed Brown #if !defined(OMPI_SKIP_MPICXX) 129d382aafbSBarry Smith # define OMPI_SKIP_MPICXX 1 130fa9e63e2SJed Brown #endif 131e771154cSJed Brown #if defined(PETSC_HAVE_MPIUNI) 132e771154cSJed Brown # include <petsc/mpiuni/mpi.h> 133e771154cSJed Brown #else 1342c8e378dSBarry Smith # include <mpi.h> 135e771154cSJed Brown #endif 13665013866SBarry Smith 137d382aafbSBarry Smith /* 138a7886beaSBarry Smith Perform various sanity checks that the correct mpi.h is being included at compile time. 139a7886beaSBarry Smith This usually happens because 140a7886beaSBarry Smith * either an unexpected mpi.h is in the default compiler path (i.e. in /usr/include) or 141a7886beaSBarry Smith * an extra include path -I/something (which contains the unexpected mpi.h) is being passed to the compiler 142a7886beaSBarry Smith */ 143a7886beaSBarry Smith #if defined(PETSC_HAVE_MPIUNI) 144a7886beaSBarry Smith # if !defined(__MPIUNI_H) 145a7886beaSBarry Smith # error "PETSc was configured with --with-mpi=0 but now appears to be compiling using a different mpi.h" 146a7886beaSBarry Smith # endif 14741f4af4cSSatish Balay #elif defined(PETSC_HAVE_I_MPI_NUMVERSION) 14841f4af4cSSatish Balay # if !defined(I_MPI_NUMVERSION) 14941f4af4cSSatish Balay # error "PETSc was configured with I_MPI but now appears to be compiling using a non-I_MPI mpi.h" 15041f4af4cSSatish Balay # elif I_MPI_NUMVERSION != PETSC_HAVE_I_MPI_NUMVERSION 15141f4af4cSSatish 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" 15241f4af4cSSatish Balay # endif 15341f4af4cSSatish Balay #elif defined(PETSC_HAVE_MVAPICH2_NUMVERSION) 15441f4af4cSSatish Balay # if !defined(MVAPICH2_NUMVERSION) 15541f4af4cSSatish Balay # error "PETSc was configured with MVAPICH2 but now appears to be compiling using a non-MVAPICH2 mpi.h" 15641f4af4cSSatish Balay # elif MVAPICH2_NUMVERSION != PETSC_HAVE_MVAPICH2_NUMVERSION 15741f4af4cSSatish Balay # error "PETSc was configured with one MVAPICH2 mpi.h version but now appears to be compiling using a different MVAPICH2 mpi.h version" 15841f4af4cSSatish Balay # endif 159a7886beaSBarry Smith #elif defined(PETSC_HAVE_MPICH_NUMVERSION) 16041f4af4cSSatish Balay # if !defined(MPICH_NUMVERSION) || defined(MVAPICH2_NUMVERSION) || defined(I_MPI_NUMVERSION) 161a7886beaSBarry Smith # error "PETSc was configured with MPICH but now appears to be compiling using a non-MPICH mpi.h" 162ca70f86eSJed Brown # elif (MPICH_NUMVERSION/100000 != PETSC_HAVE_MPICH_NUMVERSION/100000) || (MPICH_NUMVERSION%100000/1000 < PETSC_HAVE_MPICH_NUMVERSION%100000/1000) 163a7886beaSBarry Smith # error "PETSc was configured with one MPICH mpi.h version but now appears to be compiling using a different MPICH mpi.h version" 164a7886beaSBarry Smith # endif 165a7886beaSBarry Smith #elif defined(PETSC_HAVE_OMPI_MAJOR_VERSION) 166a7886beaSBarry Smith # if !defined(OMPI_MAJOR_VERSION) 167a7886beaSBarry Smith # error "PETSc was configured with OpenMPI but now appears to be compiling using a non-OpenMPI mpi.h" 168ca70f86eSJed 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) 169c3ac57cfSSatish Balay # error "PETSc was configured with one OpenMPI mpi.h version but now appears to be compiling using a different OpenMPI mpi.h version" 170a7886beaSBarry Smith # endif 17141f4af4cSSatish Balay #elif defined(OMPI_MAJOR_VERSION) || defined(MPICH_NUMVERSION) 17241f4af4cSSatish Balay # error "PETSc was configured with undetermined MPI - but now appears to be compiling using either of OpenMPI or a MPICH variant" 173a7886beaSBarry Smith #endif 174a7886beaSBarry Smith 175a7886beaSBarry Smith /* 1762981ebdbSBarry Smith Need to put stdio.h AFTER mpi.h for MPICH2 with C++ compiler 177d382aafbSBarry Smith see the top of mpicxx.h in the MPICH2 distribution. 178d382aafbSBarry Smith */ 179d382aafbSBarry Smith #include <stdio.h> 180d382aafbSBarry Smith 181d382aafbSBarry Smith /* MSMPI on 32bit windows requires this yukky hack - that breaks MPI standard compliance */ 182d382aafbSBarry Smith #if !defined(MPIAPI) 183d382aafbSBarry Smith #define MPIAPI 184d382aafbSBarry Smith #endif 185d382aafbSBarry Smith 1861cc8b206SBarry Smith /* 1871cc8b206SBarry Smith Support for Clang (>=3.2) matching type tag arguments with void* buffer types. 1881cc8b206SBarry Smith This allows the compiler to detect cases where the MPI datatype argument passed to a MPI routine 1891cc8b206SBarry Smith does not match the actual type of the argument being passed in 1901cc8b206SBarry Smith */ 191c5e4d11fSDmitry Karpeev #if defined(__has_attribute) && defined(works_with_const_which_is_not_true) 192894dd566SJed Brown # if __has_attribute(argument_with_type_tag) && __has_attribute(pointer_with_type_tag) && __has_attribute(type_tag_for_datatype) 193894dd566SJed Brown # define PetscAttrMPIPointerWithType(bufno,typeno) __attribute__((pointer_with_type_tag(MPI,bufno,typeno))) 1948ad47952SJed Brown # define PetscAttrMPITypeTag(type) __attribute__((type_tag_for_datatype(MPI,type))) 1958ad47952SJed Brown # define PetscAttrMPITypeTagLayoutCompatible(type) __attribute__((type_tag_for_datatype(MPI,type,layout_compatible))) 196894dd566SJed Brown # endif 197894dd566SJed Brown #endif 198894dd566SJed Brown #if !defined(PetscAttrMPIPointerWithType) 199894dd566SJed Brown # define PetscAttrMPIPointerWithType(bufno,typeno) 2008ad47952SJed Brown # define PetscAttrMPITypeTag(type) 2018ad47952SJed Brown # define PetscAttrMPITypeTagLayoutCompatible(type) 202894dd566SJed Brown #endif 203b3506946SBarry Smith 2045a576424SJed Brown PETSC_EXTERN MPI_Datatype MPIU_ENUM PetscAttrMPITypeTag(PetscEnum); 205df4397b0SStefano Zampini PETSC_EXTERN MPI_Datatype MPIU_BOOL PetscAttrMPITypeTag(PetscBool); 206e28ce29aSPatrick Sanan 207e28ce29aSPatrick Sanan /*MC 208e28ce29aSPatrick Sanan MPIU_INT - MPI datatype corresponding to PetscInt 209e28ce29aSPatrick Sanan 210e28ce29aSPatrick Sanan Notes: 211e28ce29aSPatrick Sanan In MPI calls that require an MPI datatype that matches a PetscInt or array of PetscInt values, pass this value. 212e28ce29aSPatrick Sanan 213e28ce29aSPatrick Sanan Level: beginner 214e28ce29aSPatrick Sanan 215e28ce29aSPatrick Sanan .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_REAL, MPIU_SCALAR, MPIU_COMPLEX 216e28ce29aSPatrick Sanan M*/ 217e28ce29aSPatrick Sanan 21837354ed4SSatish Balay #if defined(PETSC_HAVE_STDINT_H) && defined(PETSC_HAVE_INTTYPES_H) && defined(PETSC_HAVE_MPI_INT64_T) /* MPI_INT64_T is not guaranteed to be a macro */ 219bd84f1cfSSatish Balay # define MPIU_INT64 MPI_INT64_T 220a05e1a72SSatish Balay # define PetscInt64_FMT PRId64 221fab38c73SJed Brown #elif (PETSC_SIZEOF_LONG_LONG == 8) 222bd84f1cfSSatish Balay # define MPIU_INT64 MPI_LONG_LONG_INT 223a05e1a72SSatish Balay # define PetscInt64_FMT "lld" 224f505b413SSatish Balay #elif defined(PETSC_HAVE___INT64) 225bd84f1cfSSatish Balay # define MPIU_INT64 MPI_INT64_T 226a05e1a72SSatish Balay # define PetscInt64_FMT "ld" 227236ed0a3SSatish Balay #else 228bafee8b4SSatish Balay # error "cannot determine PetscInt64 type" 229236ed0a3SSatish Balay #endif 230b7b8f77aSBarry Smith 2317cdaf61dSJed Brown PETSC_EXTERN MPI_Datatype MPIU_FORTRANADDR; 232b7b8f77aSBarry Smith 233d382aafbSBarry Smith #if defined(PETSC_USE_64BIT_INDICES) 234bd84f1cfSSatish Balay # define MPIU_INT MPIU_INT64 235a05e1a72SSatish Balay # define PetscInt_FMT PetscInt64_FMT 236d382aafbSBarry Smith #else 237d382aafbSBarry Smith # define MPIU_INT MPI_INT 238a05e1a72SSatish Balay # define PetscInt_FMT "d" 239d382aafbSBarry Smith #endif 240d382aafbSBarry Smith 241503cfb0cSBarry Smith /* 242503cfb0cSBarry Smith For the rare cases when one needs to send a size_t object with MPI 243503cfb0cSBarry Smith */ 244e316c87fSJed Brown PETSC_EXTERN MPI_Datatype MPIU_SIZE_T; 245d382aafbSBarry Smith 246d382aafbSBarry Smith /* 247d382aafbSBarry Smith You can use PETSC_STDOUT as a replacement of stdout. You can also change 248d382aafbSBarry Smith the value of PETSC_STDOUT to redirect all standard output elsewhere 249d382aafbSBarry Smith */ 250014dd563SJed Brown PETSC_EXTERN FILE* PETSC_STDOUT; 251d382aafbSBarry Smith 252d382aafbSBarry Smith /* 253d382aafbSBarry Smith You can use PETSC_STDERR as a replacement of stderr. You can also change 254d382aafbSBarry Smith the value of PETSC_STDERR to redirect all standard error elsewhere 255d382aafbSBarry Smith */ 256014dd563SJed Brown PETSC_EXTERN FILE* PETSC_STDERR; 257d382aafbSBarry Smith 258d382aafbSBarry Smith /*MC 259d382aafbSBarry Smith PetscUnlikely - hints the compiler that the given condition is usually FALSE 260d382aafbSBarry Smith 261d382aafbSBarry Smith Synopsis: 262aaa7dc30SBarry Smith #include <petscsys.h> 263ace3abfcSBarry Smith PetscBool PetscUnlikely(PetscBool cond) 264d382aafbSBarry Smith 265eca87e8dSBarry Smith Not Collective 266eca87e8dSBarry Smith 267d382aafbSBarry Smith Input Parameters: 268d382aafbSBarry Smith . cond - condition or expression 269d382aafbSBarry Smith 270e28ce29aSPatrick Sanan Notes: 271e28ce29aSPatrick Sanan This returns the same truth value, it is only a hint to compilers that the resulting 272d382aafbSBarry Smith branch is unlikely. 273d382aafbSBarry Smith 274d382aafbSBarry Smith Level: advanced 275d382aafbSBarry Smith 276d382aafbSBarry Smith .seealso: PetscLikely(), CHKERRQ 277d382aafbSBarry Smith M*/ 278d382aafbSBarry Smith 279d382aafbSBarry Smith /*MC 280d382aafbSBarry Smith PetscLikely - hints the compiler that the given condition is usually TRUE 281d382aafbSBarry Smith 282d382aafbSBarry Smith Synopsis: 283aaa7dc30SBarry Smith #include <petscsys.h> 28423072422SBarry Smith PetscBool PetscLikely(PetscBool cond) 285d382aafbSBarry Smith 286eca87e8dSBarry Smith Not Collective 287eca87e8dSBarry Smith 288d382aafbSBarry Smith Input Parameters: 289d382aafbSBarry Smith . cond - condition or expression 290d382aafbSBarry Smith 291e28ce29aSPatrick Sanan Notes: 292e28ce29aSPatrick Sanan This returns the same truth value, it is only a hint to compilers that the resulting 293d382aafbSBarry Smith branch is likely. 294d382aafbSBarry Smith 295d382aafbSBarry Smith Level: advanced 296d382aafbSBarry Smith 297d382aafbSBarry Smith .seealso: PetscUnlikely() 298d382aafbSBarry Smith M*/ 299d382aafbSBarry Smith #if defined(PETSC_HAVE_BUILTIN_EXPECT) 300d382aafbSBarry Smith # define PetscUnlikely(cond) __builtin_expect(!!(cond),0) 301d382aafbSBarry Smith # define PetscLikely(cond) __builtin_expect(!!(cond),1) 302d382aafbSBarry Smith #else 303cd3f4ce9SJed Brown # define PetscUnlikely(cond) (cond) 304cd3f4ce9SJed Brown # define PetscLikely(cond) (cond) 305d382aafbSBarry Smith #endif 306d382aafbSBarry Smith 307d382aafbSBarry Smith /* 308d382aafbSBarry Smith Declare extern C stuff after including external header files 309d382aafbSBarry Smith */ 310d382aafbSBarry Smith 3116a6fc655SJed Brown PETSC_EXTERN const char *const PetscBools[]; 31270b3c8c7SBarry Smith 3138b49ba18SBarry Smith /* 314390e1bf2SBarry Smith Defines elementary mathematics functions and constants. 3158b49ba18SBarry Smith */ 3168b49ba18SBarry Smith #include <petscmath.h> 3178b49ba18SBarry Smith 3186a6fc655SJed Brown PETSC_EXTERN const char *const PetscCopyModes[]; 319d382aafbSBarry Smith 320d382aafbSBarry Smith /*MC 3210298fd71SBarry Smith PETSC_IGNORE - same as NULL, means PETSc will ignore this argument 322d382aafbSBarry Smith 323d382aafbSBarry Smith Level: beginner 324d382aafbSBarry Smith 325e28ce29aSPatrick Sanan Note: 326e28ce29aSPatrick Sanan Accepted by many PETSc functions to not set a parameter and instead use 327d382aafbSBarry Smith some default 328d382aafbSBarry Smith 329e28ce29aSPatrick Sanan Fortran Notes: 330e28ce29aSPatrick Sanan This macro does not exist in Fortran; you must use PETSC_NULL_INTEGER, 331d382aafbSBarry Smith PETSC_NULL_DOUBLE_PRECISION etc 332d382aafbSBarry Smith 333e28ce29aSPatrick Sanan .seealso: PETSC_DECIDE, PETSC_DEFAULT, PETSC_DETERMINE 334d382aafbSBarry Smith 335d382aafbSBarry Smith M*/ 3360298fd71SBarry Smith #define PETSC_IGNORE NULL 337d382aafbSBarry Smith 338c528d872SBarry Smith /* This is deprecated */ 339c528d872SBarry Smith #define PETSC_NULL NULL 340c528d872SBarry Smith 341d382aafbSBarry Smith /*MC 342557d4da8SBarry Smith PETSC_DECIDE - standard way of passing in integer or floating point parameter 343557d4da8SBarry Smith where you wish PETSc to use the default. 344557d4da8SBarry Smith 345557d4da8SBarry Smith Level: beginner 346557d4da8SBarry Smith 347e28ce29aSPatrick Sanan .seealso: PETSC_DEFAULT, PETSC_IGNORE, PETSC_DETERMINE 348557d4da8SBarry Smith 349557d4da8SBarry Smith M*/ 350557d4da8SBarry Smith #define PETSC_DECIDE -1 351557d4da8SBarry Smith 352557d4da8SBarry Smith /*MC 353d382aafbSBarry Smith PETSC_DETERMINE - standard way of passing in integer or floating point parameter 354d382aafbSBarry Smith where you wish PETSc to compute the required value. 355d382aafbSBarry Smith 356d382aafbSBarry Smith Level: beginner 357d382aafbSBarry Smith 358e28ce29aSPatrick Sanan Developer Note: 359e28ce29aSPatrick Sanan I would like to use const PetscInt PETSC_DETERMINE = PETSC_DECIDE; but for 360557d4da8SBarry Smith some reason this is not allowed by the standard even though PETSC_DECIDE is a constant value. 361557d4da8SBarry Smith 3620298fd71SBarry Smith .seealso: PETSC_DECIDE, PETSC_DEFAULT, PETSC_IGNORE, VecSetSizes() 363d382aafbSBarry Smith 364d382aafbSBarry Smith M*/ 365d382aafbSBarry Smith #define PETSC_DETERMINE PETSC_DECIDE 366d382aafbSBarry Smith 367d382aafbSBarry Smith /*MC 368557d4da8SBarry Smith PETSC_DEFAULT - standard way of passing in integer or floating point parameter 369557d4da8SBarry Smith where you wish PETSc to use the default. 370557d4da8SBarry Smith 371557d4da8SBarry Smith Level: beginner 372557d4da8SBarry Smith 373e28ce29aSPatrick Sanan Fortran Notes: 374e28ce29aSPatrick Sanan You need to use PETSC_DEFAULT_INTEGER or PETSC_DEFAULT_REAL. 375557d4da8SBarry Smith 3760298fd71SBarry Smith .seealso: PETSC_DECIDE, PETSC_IGNORE, PETSC_DETERMINE 377557d4da8SBarry Smith 378557d4da8SBarry Smith M*/ 379557d4da8SBarry Smith #define PETSC_DEFAULT -2 380557d4da8SBarry Smith 381557d4da8SBarry Smith /*MC 382d382aafbSBarry Smith PETSC_COMM_WORLD - the equivalent of the MPI_COMM_WORLD communicator which represents 383ea8fe74dSBarry Smith all the processes that PETSc knows about. 384d382aafbSBarry Smith 385d382aafbSBarry Smith Level: beginner 386d382aafbSBarry Smith 387e28ce29aSPatrick Sanan Notes: 388e28ce29aSPatrick Sanan By default PETSC_COMM_WORLD and MPI_COMM_WORLD are identical unless you wish to 389d382aafbSBarry Smith run PETSc on ONLY a subset of MPI_COMM_WORLD. In that case create your new (smaller) 390d382aafbSBarry Smith communicator, call it, say comm, and set PETSC_COMM_WORLD = comm BEFORE calling 391a990b902SBarry Smith PetscInitialize(), but after MPI_Init() has been called. 392a990b902SBarry Smith 393a990b902SBarry Smith The value of PETSC_COMM_WORLD should never be USED/accessed before PetscInitialize() 394a990b902SBarry Smith is called because it may not have a valid value yet. 395d382aafbSBarry Smith 396d382aafbSBarry Smith .seealso: PETSC_COMM_SELF 397d382aafbSBarry Smith 398d382aafbSBarry Smith M*/ 399014dd563SJed Brown PETSC_EXTERN MPI_Comm PETSC_COMM_WORLD; 400d382aafbSBarry Smith 401d382aafbSBarry Smith /*MC 402503cfb0cSBarry Smith PETSC_COMM_SELF - This is always MPI_COMM_SELF 403d382aafbSBarry Smith 404d382aafbSBarry Smith Level: beginner 405d382aafbSBarry Smith 406e28ce29aSPatrick Sanan Notes: 407e28ce29aSPatrick Sanan Do not USE/access or set this variable before PetscInitialize() has been called. 408a990b902SBarry Smith 409d382aafbSBarry Smith .seealso: PETSC_COMM_WORLD 410d382aafbSBarry Smith 411d382aafbSBarry Smith M*/ 412d382aafbSBarry Smith #define PETSC_COMM_SELF MPI_COMM_SELF 413d382aafbSBarry Smith 414d6f2c3cbSBarry Smith PETSC_EXTERN PetscBool PetscBeganMPI; 415014dd563SJed Brown PETSC_EXTERN PetscBool PetscInitializeCalled; 416014dd563SJed Brown PETSC_EXTERN PetscBool PetscFinalizeCalled; 4174cf1874eSKarl Rupp PETSC_EXTERN PetscBool PetscViennaCLSynchronize; 41882f73ecaSAlejandro Lamas Daviña PETSC_EXTERN PetscBool PetscCUDASynchronize; 419d382aafbSBarry Smith 420014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetHelpVersionFunctions(PetscErrorCode (*)(MPI_Comm),PetscErrorCode (*)(MPI_Comm)); 421014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscCommDuplicate(MPI_Comm,MPI_Comm*,int*); 422014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscCommDestroy(MPI_Comm*); 423d382aafbSBarry Smith 424d382aafbSBarry Smith /*MC 42595dccacaSBarry Smith PetscMalloc - Allocates memory, One should use PetscNew(), PetscMalloc1() or PetscCalloc1() usually instead of this 426d382aafbSBarry Smith 427eca87e8dSBarry Smith Synopsis: 428aaa7dc30SBarry Smith #include <petscsys.h> 429eca87e8dSBarry Smith PetscErrorCode PetscMalloc(size_t m,void **result) 430eca87e8dSBarry Smith 431eca87e8dSBarry Smith Not Collective 432eca87e8dSBarry Smith 433d382aafbSBarry Smith Input Parameter: 434d382aafbSBarry Smith . m - number of bytes to allocate 435d382aafbSBarry Smith 436d382aafbSBarry Smith Output Parameter: 437d382aafbSBarry Smith . result - memory allocated 438d382aafbSBarry Smith 439d382aafbSBarry Smith Level: beginner 440d382aafbSBarry Smith 44149d7da52SJed Brown Notes: 44249d7da52SJed Brown Memory is always allocated at least double aligned 443d382aafbSBarry Smith 44449d7da52SJed Brown It is safe to allocate size 0 and pass the resulting pointer (which may or may not be NULL) to PetscFree(). 445d382aafbSBarry Smith 446d382aafbSBarry Smith .seealso: PetscFree(), PetscNew() 447d382aafbSBarry Smith 448d382aafbSBarry Smith Concepts: memory allocation 449d382aafbSBarry Smith 450d382aafbSBarry Smith M*/ 45149d7da52SJed Brown #define PetscMalloc(a,b) ((*PetscTrMalloc)((a),__LINE__,PETSC_FUNCTION_NAME,__FILE__,(void**)(b))) 452d382aafbSBarry Smith 453d382aafbSBarry Smith /*MC 4543221ece2SMatthew G. Knepley PetscRealloc - Rellocates memory 4553221ece2SMatthew G. Knepley 4563221ece2SMatthew G. Knepley Synopsis: 4573221ece2SMatthew G. Knepley #include <petscsys.h> 4583221ece2SMatthew G. Knepley PetscErrorCode PetscRealloc(size_t m,void **result) 4593221ece2SMatthew G. Knepley 4603221ece2SMatthew G. Knepley Not Collective 4613221ece2SMatthew G. Knepley 4623221ece2SMatthew G. Knepley Input Parameters: 4633221ece2SMatthew G. Knepley + m - number of bytes to allocate 4643221ece2SMatthew G. Knepley - result - initial memory allocated 4653221ece2SMatthew G. Knepley 4663221ece2SMatthew G. Knepley Output Parameter: 4673221ece2SMatthew G. Knepley . result - new memory allocated 4683221ece2SMatthew G. Knepley 4693221ece2SMatthew G. Knepley Level: developer 4703221ece2SMatthew G. Knepley 4713221ece2SMatthew G. Knepley Notes: 4723221ece2SMatthew G. Knepley Memory is always allocated at least double aligned 4733221ece2SMatthew G. Knepley 4743221ece2SMatthew G. Knepley .seealso: PetscMalloc(), PetscFree(), PetscNew() 4753221ece2SMatthew G. Knepley 4763221ece2SMatthew G. Knepley Concepts: memory allocation 4773221ece2SMatthew G. Knepley 4783221ece2SMatthew G. Knepley M*/ 4793221ece2SMatthew G. Knepley #define PetscRealloc(a,b) ((*PetscTrRealloc)((a),__LINE__,PETSC_FUNCTION_NAME,__FILE__,(void**)(b))) 4803221ece2SMatthew G. Knepley 4813221ece2SMatthew G. Knepley /*MC 482503cfb0cSBarry Smith PetscAddrAlign - Rounds up an address to PETSC_MEMALIGN alignment 483d382aafbSBarry Smith 484d382aafbSBarry Smith Synopsis: 485aaa7dc30SBarry Smith #include <petscsys.h> 486d382aafbSBarry Smith void *PetscAddrAlign(void *addr) 487d382aafbSBarry Smith 488eca87e8dSBarry Smith Not Collective 489eca87e8dSBarry Smith 490eca87e8dSBarry Smith Input Parameters: 491eca87e8dSBarry Smith . addr - address to align (any pointer type) 492eca87e8dSBarry Smith 493d382aafbSBarry Smith Level: developer 494d382aafbSBarry Smith 495d382aafbSBarry Smith .seealso: PetscMallocAlign() 496d382aafbSBarry Smith 497d382aafbSBarry Smith Concepts: memory allocation 498d382aafbSBarry Smith M*/ 499d382aafbSBarry Smith #define PetscAddrAlign(a) (void*)((((PETSC_UINTPTR_T)(a))+(PETSC_MEMALIGN-1)) & ~(PETSC_MEMALIGN-1)) 500d382aafbSBarry Smith 501d382aafbSBarry Smith /*MC 502785e854fSJed Brown PetscMalloc1 - Allocates an array of memory aligned to PETSC_MEMALIGN 503d382aafbSBarry Smith 504eca87e8dSBarry Smith Synopsis: 505aaa7dc30SBarry Smith #include <petscsys.h> 506785e854fSJed Brown PetscErrorCode PetscMalloc1(size_t m1,type **r1) 507785e854fSJed Brown 508785e854fSJed Brown Not Collective 509785e854fSJed Brown 510785e854fSJed Brown Input Parameter: 511390e1bf2SBarry Smith . m1 - number of elements to allocate (may be zero) 512785e854fSJed Brown 513785e854fSJed Brown Output Parameter: 514785e854fSJed Brown . r1 - memory allocated in first chunk 515785e854fSJed Brown 516e28ce29aSPatrick Sanan Note: 517e28ce29aSPatrick Sanan This uses the sizeof() of the memory type requested to determine the total memory to be allocated, therefore you should not 518390e1bf2SBarry Smith multiply the number of elements requested by the sizeof() the type. For example use 519390e1bf2SBarry Smith $ PetscInt *id; 520390e1bf2SBarry Smith $ PetscMalloc1(10,&id); 521390e1bf2SBarry Smith not 522390e1bf2SBarry Smith $ PetscInt *id; 523390e1bf2SBarry Smith $ PetscMalloc1(10*sizeof(PetscInt),&id); 524390e1bf2SBarry Smith 525390e1bf2SBarry Smith Does not zero the memory allocatd, used PetscCalloc1() to obtain memory that has been zeroed. 526390e1bf2SBarry Smith 527390e1bf2SBarry Smith Level: beginner 528785e854fSJed Brown 5291795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscCalloc1(), PetscMalloc2() 530785e854fSJed Brown 531785e854fSJed Brown Concepts: memory allocation 532785e854fSJed Brown 533785e854fSJed Brown M*/ 5342553b7ecSJed Brown #define PetscMalloc1(m1,r1) PetscMallocA(1,PETSC_FALSE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1)) 535785e854fSJed Brown 536785e854fSJed Brown /*MC 5371795a4d1SJed Brown PetscCalloc1 - Allocates a cleared (zeroed) array of memory aligned to PETSC_MEMALIGN 5381795a4d1SJed Brown 5391795a4d1SJed Brown Synopsis: 540aaa7dc30SBarry Smith #include <petscsys.h> 5411795a4d1SJed Brown PetscErrorCode PetscCalloc1(size_t m1,type **r1) 5421795a4d1SJed Brown 5431795a4d1SJed Brown Not Collective 5441795a4d1SJed Brown 5451795a4d1SJed Brown Input Parameter: 5461795a4d1SJed Brown . m1 - number of elements to allocate in 1st chunk (may be zero) 5471795a4d1SJed Brown 5481795a4d1SJed Brown Output Parameter: 5491795a4d1SJed Brown . r1 - memory allocated in first chunk 5501795a4d1SJed Brown 551e28ce29aSPatrick Sanan Notes: 552e28ce29aSPatrick Sanan See PetsMalloc1() for more details on usage. 553390e1bf2SBarry Smith 554390e1bf2SBarry Smith Level: beginner 5551795a4d1SJed Brown 5561795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc1(), PetscCalloc2() 5571795a4d1SJed Brown 5581795a4d1SJed Brown Concepts: memory allocation 5591795a4d1SJed Brown 5601795a4d1SJed Brown M*/ 5612553b7ecSJed Brown #define PetscCalloc1(m1,r1) PetscMallocA(1,PETSC_TRUE,__LINE__,PETSC_FUNCTION_NAME,__FILE__,(size_t)(m1)*sizeof(**(r1)),(r1)) 5621795a4d1SJed Brown 5631795a4d1SJed Brown /*MC 564dcca6d9dSJed Brown PetscMalloc2 - Allocates 2 arrays of memory both aligned to PETSC_MEMALIGN 565d382aafbSBarry Smith 566eca87e8dSBarry Smith Synopsis: 567aaa7dc30SBarry Smith #include <petscsys.h> 568dcca6d9dSJed Brown PetscErrorCode PetscMalloc2(size_t m1,type **r1,size_t m2,type **r2) 569eca87e8dSBarry Smith 570eca87e8dSBarry Smith Not Collective 571eca87e8dSBarry Smith 572d382aafbSBarry Smith Input Parameter: 573d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 574dcca6d9dSJed Brown - m2 - number of elements to allocate in 2nd chunk (may be zero) 575d382aafbSBarry Smith 576d382aafbSBarry Smith Output Parameter: 577d382aafbSBarry Smith + r1 - memory allocated in first chunk 578d382aafbSBarry Smith - r2 - memory allocated in second chunk 579d382aafbSBarry Smith 580d382aafbSBarry Smith Level: developer 581d382aafbSBarry Smith 5821795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc1(), PetscCalloc2() 583d382aafbSBarry Smith 584d382aafbSBarry Smith Concepts: memory allocation 585d382aafbSBarry Smith 586d382aafbSBarry Smith M*/ 5872553b7ecSJed 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)) 588d382aafbSBarry Smith 589d382aafbSBarry Smith /*MC 5901795a4d1SJed Brown PetscCalloc2 - Allocates 2 cleared (zeroed) arrays of memory both aligned to PETSC_MEMALIGN 591d382aafbSBarry Smith 592eca87e8dSBarry Smith Synopsis: 593aaa7dc30SBarry Smith #include <petscsys.h> 5941795a4d1SJed Brown PetscErrorCode PetscCalloc2(size_t m1,type **r1,size_t m2,type **r2) 595eca87e8dSBarry Smith 596eca87e8dSBarry Smith Not Collective 597eca87e8dSBarry Smith 598d382aafbSBarry Smith Input Parameter: 599d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 6001795a4d1SJed Brown - m2 - number of elements to allocate in 2nd chunk (may be zero) 6011795a4d1SJed Brown 6021795a4d1SJed Brown Output Parameter: 6031795a4d1SJed Brown + r1 - memory allocated in first chunk 6041795a4d1SJed Brown - r2 - memory allocated in second chunk 6051795a4d1SJed Brown 6061795a4d1SJed Brown Level: developer 6071795a4d1SJed Brown 6081795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscCalloc1(), PetscMalloc2() 6091795a4d1SJed Brown 6101795a4d1SJed Brown Concepts: memory allocation 6111795a4d1SJed Brown M*/ 6122553b7ecSJed 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)) 6131795a4d1SJed Brown 6141795a4d1SJed Brown /*MC 615dcca6d9dSJed Brown PetscMalloc3 - Allocates 3 arrays of memory, all aligned to PETSC_MEMALIGN 616d382aafbSBarry Smith 617d382aafbSBarry Smith Synopsis: 618aaa7dc30SBarry Smith #include <petscsys.h> 619dcca6d9dSJed Brown PetscErrorCode PetscMalloc3(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3) 620d382aafbSBarry Smith 621d382aafbSBarry Smith Not Collective 622d382aafbSBarry Smith 623d382aafbSBarry Smith Input Parameter: 624d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 625d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 626dcca6d9dSJed Brown - m3 - number of elements to allocate in 3rd chunk (may be zero) 627d382aafbSBarry Smith 628d382aafbSBarry Smith Output Parameter: 629d382aafbSBarry Smith + r1 - memory allocated in first chunk 630d382aafbSBarry Smith . r2 - memory allocated in second chunk 631d382aafbSBarry Smith - r3 - memory allocated in third chunk 632d382aafbSBarry Smith 633d382aafbSBarry Smith Level: developer 634d382aafbSBarry Smith 6351795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscCalloc3(), PetscFree3() 636d382aafbSBarry Smith 637d382aafbSBarry Smith Concepts: memory allocation 638d382aafbSBarry Smith 639d382aafbSBarry Smith M*/ 6402553b7ecSJed 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)) 641d382aafbSBarry Smith 642d382aafbSBarry Smith /*MC 6431795a4d1SJed Brown PetscCalloc3 - Allocates 3 cleared (zeroed) arrays of memory, all aligned to PETSC_MEMALIGN 644d382aafbSBarry Smith 645eca87e8dSBarry Smith Synopsis: 646aaa7dc30SBarry Smith #include <petscsys.h> 6471795a4d1SJed Brown PetscErrorCode PetscCalloc3(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3) 648eca87e8dSBarry Smith 649eca87e8dSBarry Smith Not Collective 650eca87e8dSBarry Smith 651d382aafbSBarry Smith Input Parameter: 652d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 653d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 6541795a4d1SJed Brown - m3 - number of elements to allocate in 3rd chunk (may be zero) 6551795a4d1SJed Brown 6561795a4d1SJed Brown Output Parameter: 6571795a4d1SJed Brown + r1 - memory allocated in first chunk 6581795a4d1SJed Brown . r2 - memory allocated in second chunk 6591795a4d1SJed Brown - r3 - memory allocated in third chunk 6601795a4d1SJed Brown 6611795a4d1SJed Brown Level: developer 6621795a4d1SJed Brown 6631795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscCalloc2(), PetscMalloc3(), PetscFree3() 6641795a4d1SJed Brown 6651795a4d1SJed Brown Concepts: memory allocation 6661795a4d1SJed Brown M*/ 6672553b7ecSJed 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)) 6681795a4d1SJed Brown 6691795a4d1SJed Brown /*MC 670dcca6d9dSJed Brown PetscMalloc4 - Allocates 4 arrays of memory, all aligned to PETSC_MEMALIGN 671d382aafbSBarry Smith 672d382aafbSBarry Smith Synopsis: 673aaa7dc30SBarry Smith #include <petscsys.h> 674dcca6d9dSJed Brown PetscErrorCode PetscMalloc4(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3,size_t m4,type **r4) 675d382aafbSBarry Smith 676d382aafbSBarry Smith Not Collective 677d382aafbSBarry Smith 678d382aafbSBarry Smith Input Parameter: 679d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 680d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 681d382aafbSBarry Smith . m3 - number of elements to allocate in 3rd chunk (may be zero) 682dcca6d9dSJed Brown - m4 - number of elements to allocate in 4th chunk (may be zero) 683d382aafbSBarry Smith 684d382aafbSBarry Smith Output Parameter: 685d382aafbSBarry Smith + r1 - memory allocated in first chunk 686d382aafbSBarry Smith . r2 - memory allocated in second chunk 687d382aafbSBarry Smith . r3 - memory allocated in third chunk 688d382aafbSBarry Smith - r4 - memory allocated in fourth chunk 689d382aafbSBarry Smith 690d382aafbSBarry Smith Level: developer 691d382aafbSBarry Smith 6921795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscCalloc4(), PetscFree4() 693d382aafbSBarry Smith 694d382aafbSBarry Smith Concepts: memory allocation 695d382aafbSBarry Smith 696d382aafbSBarry Smith M*/ 6972553b7ecSJed 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)) 698d382aafbSBarry Smith 699d382aafbSBarry Smith /*MC 7001795a4d1SJed Brown PetscCalloc4 - Allocates 4 cleared (zeroed) arrays of memory, all aligned to PETSC_MEMALIGN 701d382aafbSBarry Smith 702eca87e8dSBarry Smith Synopsis: 703aaa7dc30SBarry Smith #include <petscsys.h> 7041795a4d1SJed Brown PetscErrorCode PetscCalloc4(size_t m1,type **r1,size_t m2,type **r2,size_t m3,type **r3,size_t m4,type **r4) 705eca87e8dSBarry Smith 706eca87e8dSBarry Smith Not Collective 707eca87e8dSBarry Smith 708e28ce29aSPatrick Sanan Input Parameters: 709d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 710d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 711d382aafbSBarry Smith . m3 - number of elements to allocate in 3rd chunk (may be zero) 7121795a4d1SJed Brown - m4 - number of elements to allocate in 4th chunk (may be zero) 7131795a4d1SJed Brown 714e28ce29aSPatrick Sanan Output Parameters: 7151795a4d1SJed Brown + r1 - memory allocated in first chunk 7161795a4d1SJed Brown . r2 - memory allocated in second chunk 7171795a4d1SJed Brown . r3 - memory allocated in third chunk 7181795a4d1SJed Brown - r4 - memory allocated in fourth chunk 7191795a4d1SJed Brown 7201795a4d1SJed Brown Level: developer 7211795a4d1SJed Brown 7221795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscCalloc4(), PetscFree4() 7231795a4d1SJed Brown 7241795a4d1SJed Brown Concepts: memory allocation 7251795a4d1SJed Brown 7261795a4d1SJed Brown M*/ 7272553b7ecSJed 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)) 7281795a4d1SJed Brown 7291795a4d1SJed Brown /*MC 730dcca6d9dSJed Brown PetscMalloc5 - Allocates 5 arrays of memory, all aligned to PETSC_MEMALIGN 731d382aafbSBarry Smith 732d382aafbSBarry Smith Synopsis: 733aaa7dc30SBarry Smith #include <petscsys.h> 734dcca6d9dSJed 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) 735d382aafbSBarry Smith 736d382aafbSBarry Smith Not Collective 737d382aafbSBarry Smith 738e28ce29aSPatrick Sanan Input Parameters: 739d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 740d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 741d382aafbSBarry Smith . m3 - number of elements to allocate in 3rd chunk (may be zero) 742d382aafbSBarry Smith . m4 - number of elements to allocate in 4th chunk (may be zero) 743dcca6d9dSJed Brown - m5 - number of elements to allocate in 5th chunk (may be zero) 744d382aafbSBarry Smith 745e28ce29aSPatrick Sanan Output Parameters: 746d382aafbSBarry Smith + r1 - memory allocated in first chunk 747d382aafbSBarry Smith . r2 - memory allocated in second chunk 748d382aafbSBarry Smith . r3 - memory allocated in third chunk 749d382aafbSBarry Smith . r4 - memory allocated in fourth chunk 750d382aafbSBarry Smith - r5 - memory allocated in fifth chunk 751d382aafbSBarry Smith 752d382aafbSBarry Smith Level: developer 753d382aafbSBarry Smith 7541795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscCalloc5(), PetscFree5() 755d382aafbSBarry Smith 756d382aafbSBarry Smith Concepts: memory allocation 757d382aafbSBarry Smith 758d382aafbSBarry Smith M*/ 7592553b7ecSJed 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)) 760d382aafbSBarry Smith 761d382aafbSBarry Smith /*MC 7621795a4d1SJed Brown PetscCalloc5 - Allocates 5 cleared (zeroed) arrays of memory, all aligned to PETSC_MEMALIGN 763d382aafbSBarry Smith 764eca87e8dSBarry Smith Synopsis: 765aaa7dc30SBarry Smith #include <petscsys.h> 7661795a4d1SJed 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) 767eca87e8dSBarry Smith 768eca87e8dSBarry Smith Not Collective 769eca87e8dSBarry Smith 770e28ce29aSPatrick Sanan Input Parameters: 771d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 772d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 773d382aafbSBarry Smith . m3 - number of elements to allocate in 3rd chunk (may be zero) 774d382aafbSBarry Smith . m4 - number of elements to allocate in 4th chunk (may be zero) 7751795a4d1SJed Brown - m5 - number of elements to allocate in 5th chunk (may be zero) 7761795a4d1SJed Brown 777e28ce29aSPatrick Sanan Output Parameters: 7781795a4d1SJed Brown + r1 - memory allocated in first chunk 7791795a4d1SJed Brown . r2 - memory allocated in second chunk 7801795a4d1SJed Brown . r3 - memory allocated in third chunk 7811795a4d1SJed Brown . r4 - memory allocated in fourth chunk 7821795a4d1SJed Brown - r5 - memory allocated in fifth chunk 7831795a4d1SJed Brown 7841795a4d1SJed Brown Level: developer 7851795a4d1SJed Brown 7861795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc5(), PetscFree5() 7871795a4d1SJed Brown 7881795a4d1SJed Brown Concepts: memory allocation 7891795a4d1SJed Brown 7901795a4d1SJed Brown M*/ 7912553b7ecSJed 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)) 792d382aafbSBarry Smith 793d382aafbSBarry Smith /*MC 794dcca6d9dSJed Brown PetscMalloc6 - Allocates 6 arrays of memory, all aligned to PETSC_MEMALIGN 795d382aafbSBarry Smith 796d382aafbSBarry Smith Synopsis: 797aaa7dc30SBarry Smith #include <petscsys.h> 798dcca6d9dSJed 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) 799d382aafbSBarry Smith 800d382aafbSBarry Smith Not Collective 801d382aafbSBarry Smith 802e28ce29aSPatrick Sanan Input Parameters: 803d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 804d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 805d382aafbSBarry Smith . m3 - number of elements to allocate in 3rd chunk (may be zero) 806d382aafbSBarry Smith . m4 - number of elements to allocate in 4th chunk (may be zero) 807d382aafbSBarry Smith . m5 - number of elements to allocate in 5th chunk (may be zero) 808dcca6d9dSJed Brown - m6 - number of elements to allocate in 6th chunk (may be zero) 809d382aafbSBarry Smith 810e28ce29aSPatrick Sanan Output Parameteasr: 811d382aafbSBarry Smith + r1 - memory allocated in first chunk 812d382aafbSBarry Smith . r2 - memory allocated in second chunk 813d382aafbSBarry Smith . r3 - memory allocated in third chunk 814d382aafbSBarry Smith . r4 - memory allocated in fourth chunk 815d382aafbSBarry Smith . r5 - memory allocated in fifth chunk 816d382aafbSBarry Smith - r6 - memory allocated in sixth chunk 817d382aafbSBarry Smith 818d382aafbSBarry Smith Level: developer 819d382aafbSBarry Smith 8201795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscCalloc6(), PetscFree3(), PetscFree4(), PetscFree5(), PetscFree6() 821d382aafbSBarry Smith 822d382aafbSBarry Smith Concepts: memory allocation 823d382aafbSBarry Smith 824d382aafbSBarry Smith M*/ 8252553b7ecSJed 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)) 826d382aafbSBarry Smith 827d382aafbSBarry Smith /*MC 8281795a4d1SJed Brown PetscCalloc6 - Allocates 6 cleared (zeroed) arrays of memory, all aligned to PETSC_MEMALIGN 829d382aafbSBarry Smith 830eca87e8dSBarry Smith Synopsis: 831aaa7dc30SBarry Smith #include <petscsys.h> 8321795a4d1SJed 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) 833eca87e8dSBarry Smith 834eca87e8dSBarry Smith Not Collective 835eca87e8dSBarry Smith 836e28ce29aSPatrick Sanan Input Parameters: 837d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 838d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 839d382aafbSBarry Smith . m3 - number of elements to allocate in 3rd chunk (may be zero) 840d382aafbSBarry Smith . m4 - number of elements to allocate in 4th chunk (may be zero) 841d382aafbSBarry Smith . m5 - number of elements to allocate in 5th chunk (may be zero) 8421795a4d1SJed Brown - m6 - number of elements to allocate in 6th chunk (may be zero) 8431795a4d1SJed Brown 844e28ce29aSPatrick Sanan Output Parameters: 8451795a4d1SJed Brown + r1 - memory allocated in first chunk 8461795a4d1SJed Brown . r2 - memory allocated in second chunk 8471795a4d1SJed Brown . r3 - memory allocated in third chunk 8481795a4d1SJed Brown . r4 - memory allocated in fourth chunk 8491795a4d1SJed Brown . r5 - memory allocated in fifth chunk 8501795a4d1SJed Brown - r6 - memory allocated in sixth chunk 8511795a4d1SJed Brown 8521795a4d1SJed Brown Level: developer 8531795a4d1SJed Brown 8541795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscMalloc6(), PetscFree6() 8551795a4d1SJed Brown 8561795a4d1SJed Brown Concepts: memory allocation 8571795a4d1SJed Brown M*/ 8582553b7ecSJed 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)) 8591795a4d1SJed Brown 8601795a4d1SJed Brown /*MC 861dcca6d9dSJed Brown PetscMalloc7 - Allocates 7 arrays of memory, all aligned to PETSC_MEMALIGN 862d382aafbSBarry Smith 863d382aafbSBarry Smith Synopsis: 864aaa7dc30SBarry Smith #include <petscsys.h> 865dcca6d9dSJed 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) 866d382aafbSBarry Smith 867d382aafbSBarry Smith Not Collective 868d382aafbSBarry Smith 869e28ce29aSPatrick Sanan Input Parameters: 870d382aafbSBarry Smith + m1 - number of elements to allocate in 1st chunk (may be zero) 871d382aafbSBarry Smith . m2 - number of elements to allocate in 2nd chunk (may be zero) 872d382aafbSBarry Smith . m3 - number of elements to allocate in 3rd chunk (may be zero) 873d382aafbSBarry Smith . m4 - number of elements to allocate in 4th chunk (may be zero) 874d382aafbSBarry Smith . m5 - number of elements to allocate in 5th chunk (may be zero) 875d382aafbSBarry Smith . m6 - number of elements to allocate in 6th chunk (may be zero) 876dcca6d9dSJed Brown - m7 - number of elements to allocate in 7th chunk (may be zero) 877d382aafbSBarry Smith 878e28ce29aSPatrick Sanan Output Parameters: 879d382aafbSBarry Smith + r1 - memory allocated in first chunk 880d382aafbSBarry Smith . r2 - memory allocated in second chunk 881d382aafbSBarry Smith . r3 - memory allocated in third chunk 882d382aafbSBarry Smith . r4 - memory allocated in fourth chunk 883d382aafbSBarry Smith . r5 - memory allocated in fifth chunk 884d382aafbSBarry Smith . r6 - memory allocated in sixth chunk 885eca87e8dSBarry Smith - r7 - memory allocated in seventh chunk 886d382aafbSBarry Smith 887d382aafbSBarry Smith Level: developer 888d382aafbSBarry Smith 8891795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscCalloc7(), PetscFree7() 890d382aafbSBarry Smith 891d382aafbSBarry Smith Concepts: memory allocation 892d382aafbSBarry Smith 893d382aafbSBarry Smith M*/ 8942553b7ecSJed 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)) 895d382aafbSBarry Smith 896d382aafbSBarry Smith /*MC 8971795a4d1SJed Brown PetscCalloc7 - Allocates 7 cleared (zeroed) arrays of memory, all aligned to PETSC_MEMALIGN 8981795a4d1SJed Brown 8991795a4d1SJed Brown Synopsis: 900aaa7dc30SBarry Smith #include <petscsys.h> 9011795a4d1SJed 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) 9021795a4d1SJed Brown 9031795a4d1SJed Brown Not Collective 9041795a4d1SJed Brown 905e28ce29aSPatrick Sanan Input Parameters: 9061795a4d1SJed Brown + m1 - number of elements to allocate in 1st chunk (may be zero) 9071795a4d1SJed Brown . m2 - number of elements to allocate in 2nd chunk (may be zero) 9081795a4d1SJed Brown . m3 - number of elements to allocate in 3rd chunk (may be zero) 9091795a4d1SJed Brown . m4 - number of elements to allocate in 4th chunk (may be zero) 9101795a4d1SJed Brown . m5 - number of elements to allocate in 5th chunk (may be zero) 9111795a4d1SJed Brown . m6 - number of elements to allocate in 6th chunk (may be zero) 9121795a4d1SJed Brown - m7 - number of elements to allocate in 7th chunk (may be zero) 9131795a4d1SJed Brown 914e28ce29aSPatrick Sanan Output Parameters: 9151795a4d1SJed Brown + r1 - memory allocated in first chunk 9161795a4d1SJed Brown . r2 - memory allocated in second chunk 9171795a4d1SJed Brown . r3 - memory allocated in third chunk 9181795a4d1SJed Brown . r4 - memory allocated in fourth chunk 9191795a4d1SJed Brown . r5 - memory allocated in fifth chunk 9201795a4d1SJed Brown . r6 - memory allocated in sixth chunk 9211795a4d1SJed Brown - r7 - memory allocated in seventh chunk 9221795a4d1SJed Brown 9231795a4d1SJed Brown Level: developer 9241795a4d1SJed Brown 9251795a4d1SJed Brown .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscMalloc7(), PetscFree7() 9261795a4d1SJed Brown 9271795a4d1SJed Brown Concepts: memory allocation 9281795a4d1SJed Brown M*/ 9292553b7ecSJed 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)) 9301795a4d1SJed Brown 9311795a4d1SJed Brown /*MC 932503cfb0cSBarry Smith PetscNew - Allocates memory of a particular type, zeros the memory! Aligned to PETSC_MEMALIGN 933d382aafbSBarry Smith 934eca87e8dSBarry Smith Synopsis: 935aaa7dc30SBarry Smith #include <petscsys.h> 936b00a9115SJed Brown PetscErrorCode PetscNew(type **result) 937eca87e8dSBarry Smith 938eca87e8dSBarry Smith Not Collective 939eca87e8dSBarry Smith 940d382aafbSBarry Smith Output Parameter: 941b00a9115SJed Brown . result - memory allocated, sized to match pointer type 942d382aafbSBarry Smith 943d382aafbSBarry Smith Level: beginner 944d382aafbSBarry Smith 945390e1bf2SBarry Smith .seealso: PetscFree(), PetscMalloc(), PetscNewLog(), PetscCalloc1(), PetscMalloc1() 946d382aafbSBarry Smith 947d382aafbSBarry Smith Concepts: memory allocation 948d382aafbSBarry Smith 949d382aafbSBarry Smith M*/ 950b00a9115SJed Brown #define PetscNew(b) PetscCalloc1(1,(b)) 951ad0619ddSBarry Smith 952ad0619ddSBarry Smith /*MC 953b00a9115SJed Brown PetscNewLog - Allocates memory of a type matching pointer, zeros the memory! Aligned to PETSC_MEMALIGN. Associates the memory allocated 954ad0619ddSBarry Smith with the given object using PetscLogObjectMemory(). 955ad0619ddSBarry Smith 956ad0619ddSBarry Smith Synopsis: 957aaa7dc30SBarry Smith #include <petscsys.h> 958b00a9115SJed Brown PetscErrorCode PetscNewLog(PetscObject obj,type **result) 959ad0619ddSBarry Smith 960ad0619ddSBarry Smith Not Collective 961ad0619ddSBarry Smith 962ad0619ddSBarry Smith Input Parameter: 963b00a9115SJed Brown . obj - object memory is logged to 964ad0619ddSBarry Smith 965ad0619ddSBarry Smith Output Parameter: 966b00a9115SJed Brown . result - memory allocated, sized to match pointer type 967ad0619ddSBarry Smith 968ad0619ddSBarry Smith Level: developer 969ad0619ddSBarry Smith 970390e1bf2SBarry Smith .seealso: PetscFree(), PetscMalloc(), PetscNew(), PetscLogObjectMemory(), PetscCalloc1(), PetscMalloc1() 971ad0619ddSBarry Smith 972ad0619ddSBarry Smith Concepts: memory allocation 973ad0619ddSBarry Smith 974ad0619ddSBarry Smith M*/ 975d12f57a0SLisandro Dalcin #define PetscNewLog(o,b) (PetscNew((b)) || PetscLogObjectMemory((PetscObject)o,sizeof(**(b)))) 976d382aafbSBarry Smith 977d382aafbSBarry Smith /*MC 978d382aafbSBarry Smith PetscFree - Frees memory 979d382aafbSBarry Smith 980eca87e8dSBarry Smith Synopsis: 981aaa7dc30SBarry Smith #include <petscsys.h> 982eca87e8dSBarry Smith PetscErrorCode PetscFree(void *memory) 983eca87e8dSBarry Smith 984eca87e8dSBarry Smith Not Collective 985eca87e8dSBarry Smith 986d382aafbSBarry Smith Input Parameter: 987390e1bf2SBarry Smith . memory - memory to free (the pointer is ALWAYS set to NULL upon sucess) 988d382aafbSBarry Smith 989d382aafbSBarry Smith Level: beginner 990d382aafbSBarry Smith 99149d7da52SJed Brown Notes: 992390e1bf2SBarry Smith Do not free memory obtained with PetscMalloc2(), PetscCalloc2() etc, they must be freed with PetscFree2() etc. 993390e1bf2SBarry Smith 99449d7da52SJed Brown It is safe to call PetscFree() on a NULL pointer. 995d382aafbSBarry Smith 996390e1bf2SBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscNewLog(), PetscMalloc1(), PetscCalloc1() 997d382aafbSBarry Smith 998d382aafbSBarry Smith Concepts: memory allocation 999d382aafbSBarry Smith 1000d382aafbSBarry Smith M*/ 100149d7da52SJed Brown #define PetscFree(a) ((*PetscTrFree)((void*)(a),__LINE__,PETSC_FUNCTION_NAME,__FILE__) || ((a) = 0,0)) 1002d382aafbSBarry Smith 1003d382aafbSBarry Smith /*MC 1004d382aafbSBarry Smith PetscFree2 - Frees 2 chunks of memory obtained with PetscMalloc2() 1005d382aafbSBarry Smith 1006eca87e8dSBarry Smith Synopsis: 1007aaa7dc30SBarry Smith #include <petscsys.h> 1008eca87e8dSBarry Smith PetscErrorCode PetscFree2(void *memory1,void *memory2) 1009eca87e8dSBarry Smith 1010eca87e8dSBarry Smith Not Collective 1011eca87e8dSBarry Smith 1012e28ce29aSPatrick Sanan Input Parameters: 1013d382aafbSBarry Smith + memory1 - memory to free 1014d382aafbSBarry Smith - memory2 - 2nd memory to free 1015d382aafbSBarry Smith 1016d382aafbSBarry Smith Level: developer 1017d382aafbSBarry Smith 101895452b02SPatrick Sanan Notes: 101995452b02SPatrick Sanan Memory must have been obtained with PetscMalloc2() 1020d382aafbSBarry Smith 1021d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree() 1022d382aafbSBarry Smith 1023d382aafbSBarry Smith Concepts: memory allocation 1024d382aafbSBarry Smith 1025d382aafbSBarry Smith M*/ 1026ba282f50SJed Brown #define PetscFree2(m1,m2) PetscFreeA(2,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2)) 1027d382aafbSBarry Smith 1028d382aafbSBarry Smith /*MC 1029d382aafbSBarry Smith PetscFree3 - Frees 3 chunks of memory obtained with PetscMalloc3() 1030d382aafbSBarry Smith 1031eca87e8dSBarry Smith Synopsis: 1032aaa7dc30SBarry Smith #include <petscsys.h> 1033eca87e8dSBarry Smith PetscErrorCode PetscFree3(void *memory1,void *memory2,void *memory3) 1034eca87e8dSBarry Smith 1035eca87e8dSBarry Smith Not Collective 1036eca87e8dSBarry Smith 1037e28ce29aSPatrick Sanan Input Parameters: 1038d382aafbSBarry Smith + memory1 - memory to free 1039d382aafbSBarry Smith . memory2 - 2nd memory to free 1040d382aafbSBarry Smith - memory3 - 3rd memory to free 1041d382aafbSBarry Smith 1042d382aafbSBarry Smith Level: developer 1043d382aafbSBarry Smith 104495452b02SPatrick Sanan Notes: 104595452b02SPatrick Sanan Memory must have been obtained with PetscMalloc3() 1046d382aafbSBarry Smith 1047d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3() 1048d382aafbSBarry Smith 1049d382aafbSBarry Smith Concepts: memory allocation 1050d382aafbSBarry Smith 1051d382aafbSBarry Smith M*/ 1052ba282f50SJed Brown #define PetscFree3(m1,m2,m3) PetscFreeA(3,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2),&(m3)) 1053d382aafbSBarry Smith 1054d382aafbSBarry Smith /*MC 1055d382aafbSBarry Smith PetscFree4 - Frees 4 chunks of memory obtained with PetscMalloc4() 1056d382aafbSBarry Smith 1057eca87e8dSBarry Smith Synopsis: 1058aaa7dc30SBarry Smith #include <petscsys.h> 1059eca87e8dSBarry Smith PetscErrorCode PetscFree4(void *m1,void *m2,void *m3,void *m4) 1060eca87e8dSBarry Smith 1061eca87e8dSBarry Smith Not Collective 1062eca87e8dSBarry Smith 1063e28ce29aSPatrick Sanan Input Parameters: 1064d382aafbSBarry Smith + m1 - memory to free 1065d382aafbSBarry Smith . m2 - 2nd memory to free 1066d382aafbSBarry Smith . m3 - 3rd memory to free 1067d382aafbSBarry Smith - m4 - 4th memory to free 1068d382aafbSBarry Smith 1069d382aafbSBarry Smith Level: developer 1070d382aafbSBarry Smith 107195452b02SPatrick Sanan Notes: 107295452b02SPatrick Sanan Memory must have been obtained with PetscMalloc4() 1073d382aafbSBarry Smith 1074d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3(), PetscMalloc4() 1075d382aafbSBarry Smith 1076d382aafbSBarry Smith Concepts: memory allocation 1077d382aafbSBarry Smith 1078d382aafbSBarry Smith M*/ 1079ba282f50SJed Brown #define PetscFree4(m1,m2,m3,m4) PetscFreeA(4,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2),&(m3),&(m4)) 1080d382aafbSBarry Smith 1081d382aafbSBarry Smith /*MC 1082d382aafbSBarry Smith PetscFree5 - Frees 5 chunks of memory obtained with PetscMalloc5() 1083d382aafbSBarry Smith 1084eca87e8dSBarry Smith Synopsis: 1085aaa7dc30SBarry Smith #include <petscsys.h> 1086eca87e8dSBarry Smith PetscErrorCode PetscFree5(void *m1,void *m2,void *m3,void *m4,void *m5) 1087eca87e8dSBarry Smith 1088eca87e8dSBarry Smith Not Collective 1089eca87e8dSBarry Smith 1090e28ce29aSPatrick Sanan Input Parameters: 1091d382aafbSBarry Smith + m1 - memory to free 1092d382aafbSBarry Smith . m2 - 2nd memory to free 1093d382aafbSBarry Smith . m3 - 3rd memory to free 1094d382aafbSBarry Smith . m4 - 4th memory to free 1095d382aafbSBarry Smith - m5 - 5th memory to free 1096d382aafbSBarry Smith 1097d382aafbSBarry Smith Level: developer 1098d382aafbSBarry Smith 109995452b02SPatrick Sanan Notes: 110095452b02SPatrick Sanan Memory must have been obtained with PetscMalloc5() 1101d382aafbSBarry Smith 1102d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3(), PetscMalloc4(), PetscMalloc5() 1103d382aafbSBarry Smith 1104d382aafbSBarry Smith Concepts: memory allocation 1105d382aafbSBarry Smith 1106d382aafbSBarry Smith M*/ 1107ba282f50SJed Brown #define PetscFree5(m1,m2,m3,m4,m5) PetscFreeA(5,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2),&(m3),&(m4),&(m5)) 1108d382aafbSBarry Smith 1109d382aafbSBarry Smith /*MC 1110d382aafbSBarry Smith PetscFree6 - Frees 6 chunks of memory obtained with PetscMalloc6() 1111d382aafbSBarry Smith 1112eca87e8dSBarry Smith Synopsis: 1113aaa7dc30SBarry Smith #include <petscsys.h> 1114eca87e8dSBarry Smith PetscErrorCode PetscFree6(void *m1,void *m2,void *m3,void *m4,void *m5,void *m6) 1115eca87e8dSBarry Smith 1116eca87e8dSBarry Smith Not Collective 1117eca87e8dSBarry Smith 1118e28ce29aSPatrick Sanan Input Parameters: 1119d382aafbSBarry Smith + m1 - memory to free 1120d382aafbSBarry Smith . m2 - 2nd memory to free 1121d382aafbSBarry Smith . m3 - 3rd memory to free 1122d382aafbSBarry Smith . m4 - 4th memory to free 1123d382aafbSBarry Smith . m5 - 5th memory to free 1124d382aafbSBarry Smith - m6 - 6th memory to free 1125d382aafbSBarry Smith 1126d382aafbSBarry Smith 1127d382aafbSBarry Smith Level: developer 1128d382aafbSBarry Smith 112995452b02SPatrick Sanan Notes: 113095452b02SPatrick Sanan Memory must have been obtained with PetscMalloc6() 1131d382aafbSBarry Smith 1132d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3(), PetscMalloc4(), PetscMalloc5(), PetscMalloc6() 1133d382aafbSBarry Smith 1134d382aafbSBarry Smith Concepts: memory allocation 1135d382aafbSBarry Smith 1136d382aafbSBarry Smith M*/ 1137ba282f50SJed Brown #define PetscFree6(m1,m2,m3,m4,m5,m6) PetscFreeA(6,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2),&(m3),&(m4),&(m5),&(m6)) 1138d382aafbSBarry Smith 1139d382aafbSBarry Smith /*MC 1140d382aafbSBarry Smith PetscFree7 - Frees 7 chunks of memory obtained with PetscMalloc7() 1141d382aafbSBarry Smith 1142eca87e8dSBarry Smith Synopsis: 1143aaa7dc30SBarry Smith #include <petscsys.h> 1144eca87e8dSBarry Smith PetscErrorCode PetscFree7(void *m1,void *m2,void *m3,void *m4,void *m5,void *m6,void *m7) 1145eca87e8dSBarry Smith 1146eca87e8dSBarry Smith Not Collective 1147eca87e8dSBarry Smith 1148e28ce29aSPatrick Sanan Input Parameters: 1149d382aafbSBarry Smith + m1 - memory to free 1150d382aafbSBarry Smith . m2 - 2nd memory to free 1151d382aafbSBarry Smith . m3 - 3rd memory to free 1152d382aafbSBarry Smith . m4 - 4th memory to free 1153d382aafbSBarry Smith . m5 - 5th memory to free 1154d382aafbSBarry Smith . m6 - 6th memory to free 1155d382aafbSBarry Smith - m7 - 7th memory to free 1156d382aafbSBarry Smith 1157d382aafbSBarry Smith 1158d382aafbSBarry Smith Level: developer 1159d382aafbSBarry Smith 116095452b02SPatrick Sanan Notes: 116195452b02SPatrick Sanan Memory must have been obtained with PetscMalloc7() 1162d382aafbSBarry Smith 1163d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3(), PetscMalloc4(), PetscMalloc5(), PetscMalloc6(), 1164d382aafbSBarry Smith PetscMalloc7() 1165d382aafbSBarry Smith 1166d382aafbSBarry Smith Concepts: memory allocation 1167d382aafbSBarry Smith 1168d382aafbSBarry Smith M*/ 1169ba282f50SJed Brown #define PetscFree7(m1,m2,m3,m4,m5,m6,m7) PetscFreeA(7,__LINE__,PETSC_FUNCTION_NAME,__FILE__,&(m1),&(m2),&(m3),&(m4),&(m5),&(m6),&(m7)) 1170d382aafbSBarry Smith 1171ba282f50SJed Brown PETSC_EXTERN PetscErrorCode PetscMallocA(int,PetscBool,int,const char *,const char *,size_t,void *,...); 1172ba282f50SJed Brown PETSC_EXTERN PetscErrorCode PetscFreeA(int,int,const char *,const char *,void *,...); 1173efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode (*PetscTrMalloc)(size_t,int,const char[],const char[],void**); 1174efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode (*PetscTrFree)(void*,int,const char[],const char[]); 11753221ece2SMatthew G. Knepley PETSC_EXTERN PetscErrorCode (*PetscTrRealloc)(size_t,int,const char[],const char[],void**); 1176ba282f50SJed Brown PETSC_EXTERN PetscErrorCode PetscMallocSetCoalesce(PetscBool); 1177efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode PetscMallocSet(PetscErrorCode (*)(size_t,int,const char[],const char[],void**),PetscErrorCode (*)(void*,int,const char[],const char[])); 1178014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMallocClear(void); 1179d382aafbSBarry Smith 1180d382aafbSBarry Smith /* 1181c1706be6SHong 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. 1182c1706be6SHong Zhang */ 1183c1706be6SHong Zhang PETSC_EXTERN PetscErrorCode PetscMallocSetDRAM(void); 1184c1706be6SHong Zhang PETSC_EXTERN PetscErrorCode PetscMallocResetDRAM(void); 1185c1706be6SHong Zhang 1186a5057860SBarry Smith #define MPIU_PETSCLOGDOUBLE MPI_DOUBLE 118736763ca0SBas van 't Hof #define MPIU_2PETSCLOGDOUBLE MPI_2DOUBLE_PRECISION 1188a5057860SBarry Smith 1189a5057860SBarry Smith /* 119066d669d6SBarry Smith Routines for tracing memory corruption/bleeding with default PETSc memory allocation 1191d382aafbSBarry Smith */ 1192014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMallocDump(FILE *); 1193014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMallocDumpLog(FILE *); 1194014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMallocGetCurrentUsage(PetscLogDouble *); 1195014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMallocGetMaximumUsage(PetscLogDouble *); 1196e3ed9ee7SBarry Smith PETSC_EXTERN PetscErrorCode PetscMallocPushMaximumUsage(int); 1197e3ed9ee7SBarry Smith PETSC_EXTERN PetscErrorCode PetscMallocPopMaximumUsage(int,PetscLogDouble*); 1198014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMallocDebug(PetscBool); 11990acecf5bSBarry Smith PETSC_EXTERN PetscErrorCode PetscMallocGetDebug(PetscBool*); 1200efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode PetscMallocValidate(int,const char[],const char[]); 1201014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMallocSetDumpLog(void); 1202574034a9SJed Brown PETSC_EXTERN PetscErrorCode PetscMallocSetDumpLogThreshold(PetscLogDouble); 1203014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMallocGetDumpLog(PetscBool*); 1204d382aafbSBarry Smith 12056a6fc655SJed Brown PETSC_EXTERN const char *const PetscDataTypes[]; 1206014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDataTypeToMPIDataType(PetscDataType,MPI_Datatype*); 1207014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMPIDataTypeToPetscDataType(MPI_Datatype,PetscDataType*); 1208014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDataTypeGetSize(PetscDataType,size_t*); 12098e4b2d1dSBarry Smith PETSC_EXTERN PetscErrorCode PetscDataTypeFromString(const char*,PetscDataType*,PetscBool*); 1210d382aafbSBarry Smith 1211d382aafbSBarry Smith /* 1212d382aafbSBarry Smith Basic memory and string operations. These are usually simple wrappers 1213d382aafbSBarry Smith around the basic Unix system calls, but a few of them have additional 1214d382aafbSBarry Smith functionality and/or error checking. 1215d382aafbSBarry Smith */ 1216014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscBitMemcpy(void*,PetscInt,const void*,PetscInt,PetscInt,PetscDataType); 1217014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMemmove(void*,void *,size_t); 1218014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMemcmp(const void*,const void*,size_t,PetscBool *); 1219014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrlen(const char[],size_t*); 1220d67fe73bSBarry Smith PETSC_EXTERN PetscErrorCode PetscStrToArray(const char[],char,int*,char ***); 1221014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrToArrayDestroy(int,char **); 1222014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrcmp(const char[],const char[],PetscBool *); 1223014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrgrt(const char[],const char[],PetscBool *); 1224014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrcasecmp(const char[],const char[],PetscBool *); 1225014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrncmp(const char[],const char[],size_t,PetscBool *); 1226014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrcpy(char[],const char[]); 1227014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrcat(char[],const char[]); 1228a126751eSBarry Smith PETSC_EXTERN PetscErrorCode PetscStrlcat(char[],const char[],size_t); 1229014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrncpy(char[],const char[],size_t); 1230014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrchr(const char[],char,char *[]); 1231014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrtolower(char[]); 12322f234a98SBarry Smith PETSC_EXTERN PetscErrorCode PetscStrtoupper(char[]); 1233014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrrchr(const char[],char,char *[]); 1234014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrstr(const char[],const char[],char *[]); 1235014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrrstr(const char[],const char[],char *[]); 1236014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrendswith(const char[],const char[],PetscBool*); 12372c9581d2SBarry Smith PETSC_EXTERN PetscErrorCode PetscStrbeginswith(const char[],const char[],PetscBool*); 1238014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrendswithwhich(const char[],const char *const*,PetscInt*); 1239014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrallocpy(const char[],char *[]); 124047340559SBarry Smith PETSC_EXTERN PetscErrorCode PetscStrArrayallocpy(const char *const*,char***); 12416fed8037SJed Brown PETSC_EXTERN PetscErrorCode PetscStrArrayDestroy(char***); 12426991f827SBarry Smith PETSC_EXTERN PetscErrorCode PetscStrNArrayallocpy(PetscInt,const char *const*,char***); 12436991f827SBarry Smith PETSC_EXTERN PetscErrorCode PetscStrNArrayDestroy(PetscInt,char***); 1244014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStrreplace(MPI_Comm,const char[],char[],size_t); 1245d382aafbSBarry Smith 1246573b0fb4SBarry Smith PETSC_EXTERN void PetscStrcmpNoError(const char[],const char[],PetscBool *); 1247573b0fb4SBarry Smith 1248014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscTokenCreate(const char[],const char,PetscToken*); 1249014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscTokenFind(PetscToken,char *[]); 1250014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscTokenDestroy(PetscToken*); 12518e81d068SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStrInList(const char[],const char[],char,PetscBool*); 1252d382aafbSBarry Smith 1253a53986e1SJed Brown PETSC_EXTERN PetscErrorCode PetscEListFind(PetscInt,const char *const*,const char*,PetscInt*,PetscBool*); 1254a53986e1SJed Brown PETSC_EXTERN PetscErrorCode PetscEnumFind(const char *const*,const char*,PetscEnum*,PetscBool*); 1255a53986e1SJed Brown 1256d382aafbSBarry Smith /* 1257d382aafbSBarry Smith These are MPI operations for MPI_Allreduce() etc 1258d382aafbSBarry Smith */ 1259367daffbSBarry Smith PETSC_EXTERN MPI_Op MPIU_MAXSUM_OP; 1260570b7f6dSBarry Smith #if (defined(PETSC_HAVE_COMPLEX) && !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX)) || defined(PETSC_USE_REAL___FLOAT128) || defined(PETSC_USE_REAL___FP16) 1261014dd563SJed Brown PETSC_EXTERN MPI_Op MPIU_SUM; 12622414b3c7SJed Brown #else 12632414b3c7SJed Brown #define MPIU_SUM MPI_SUM 12642414b3c7SJed Brown #endif 1265570b7f6dSBarry Smith #if defined(PETSC_USE_REAL___FLOAT128) || defined(PETSC_USE_REAL___FP16) 1266014dd563SJed Brown PETSC_EXTERN MPI_Op MPIU_MAX; 1267014dd563SJed Brown PETSC_EXTERN MPI_Op MPIU_MIN; 1268d9822059SBarry Smith #else 1269d9822059SBarry Smith #define MPIU_MAX MPI_MAX 1270d9822059SBarry Smith #define MPIU_MIN MPI_MIN 1271d9822059SBarry Smith #endif 1272014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMaxSum(MPI_Comm,const PetscInt[],PetscInt*,PetscInt*); 1273d382aafbSBarry Smith 1274014dd563SJed Brown PETSC_EXTERN PetscErrorCode MPIULong_Send(void*,PetscInt,MPI_Datatype,PetscMPIInt,PetscMPIInt,MPI_Comm); 1275014dd563SJed Brown PETSC_EXTERN PetscErrorCode MPIULong_Recv(void*,PetscInt,MPI_Datatype,PetscMPIInt,PetscMPIInt,MPI_Comm); 1276eb3f98d2SBarry Smith 127795c0884eSLisandro Dalcin PETSC_EXTERN const char *const PetscFileModes[]; 1278d6a4318aSJed Brown 1279639ff905SBarry Smith /* 1280639ff905SBarry Smith Defines PETSc error handling. 1281639ff905SBarry Smith */ 1282639ff905SBarry Smith #include <petscerror.h> 1283d382aafbSBarry Smith 12840700a824SBarry Smith #define PETSC_SMALLEST_CLASSID 1211211 1285014dd563SJed Brown PETSC_EXTERN PetscClassId PETSC_LARGEST_CLASSID; 1286014dd563SJed Brown PETSC_EXTERN PetscClassId PETSC_OBJECT_CLASSID; 1287014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscClassIdRegister(const char[],PetscClassId *); 1288d382aafbSBarry Smith 1289d382aafbSBarry Smith /* 1290d382aafbSBarry Smith Routines that get memory usage information from the OS 1291d382aafbSBarry Smith */ 1292014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMemoryGetCurrentUsage(PetscLogDouble *); 1293014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMemoryGetMaximumUsage(PetscLogDouble *); 1294014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMemorySetGetMaximumUsage(void); 1295b44d5720SBarry Smith PETSC_EXTERN PetscErrorCode PetscMemoryTrace(const char[]); 1296d382aafbSBarry Smith 1297014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscInfoAllow(PetscBool ,const char []); 1298014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSleep(PetscReal); 1299d382aafbSBarry Smith 1300d382aafbSBarry Smith /* 1301d382aafbSBarry Smith Initialization of PETSc 1302d382aafbSBarry Smith */ 1303014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscInitialize(int*,char***,const char[],const char[]); 1304014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscInitializeNoPointers(int,char**,const char[],const char[]); 1305014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscInitializeNoArguments(void); 1306014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscInitialized(PetscBool *); 1307014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFinalized(PetscBool *); 1308014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFinalize(void); 1309014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscInitializeFortran(void); 1310014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetArgs(int*,char ***); 1311014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetArguments(char ***); 1312014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFreeArguments(char **); 1313d382aafbSBarry Smith 1314014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscEnd(void); 1315607a6623SBarry Smith PETSC_EXTERN PetscErrorCode PetscSysInitializePackage(void); 1316d382aafbSBarry Smith 1317014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPythonInitialize(const char[],const char[]); 1318014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPythonFinalize(void); 1319014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPythonPrintError(void); 1320014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPythonMonitorSet(PetscObject,const char[]); 1321d382aafbSBarry Smith 1322d382aafbSBarry Smith /* 1323d382aafbSBarry Smith These are so that in extern C code we can caste function pointers to non-extern C 13242981ebdbSBarry Smith function pointers. Since the regular C++ code expects its function pointers to be C++ 1325d382aafbSBarry Smith */ 1326638cfed1SJed Brown PETSC_EXTERN_TYPEDEF typedef void (**PetscVoidStarFunction)(void); 1327638cfed1SJed Brown PETSC_EXTERN_TYPEDEF typedef void (*PetscVoidFunction)(void); 1328638cfed1SJed Brown PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*PetscErrorCodeFunction)(void); 1329d382aafbSBarry Smith 1330d382aafbSBarry Smith /* 1331d382aafbSBarry Smith Functions that can act on any PETSc object. 1332d382aafbSBarry Smith */ 1333014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectDestroy(PetscObject*); 1334014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetComm(PetscObject,MPI_Comm *); 1335014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetClassId(PetscObject,PetscClassId *); 1336014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetClassName(PetscObject,const char *[]); 1337014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectSetType(PetscObject,const char []); 1338014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetType(PetscObject,const char *[]); 1339014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectSetName(PetscObject,const char[]); 1340014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetName(PetscObject,const char*[]); 1341014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectSetTabLevel(PetscObject,PetscInt); 1342014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetTabLevel(PetscObject,PetscInt*); 1343014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectIncrementTabLevel(PetscObject,PetscObject,PetscInt); 1344014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectReference(PetscObject); 1345014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetReference(PetscObject,PetscInt*); 1346014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectDereference(PetscObject); 1347014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetNewTag(PetscObject,PetscMPIInt *); 1348014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectCompose(PetscObject,const char[],PetscObject); 1349014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectRemoveReference(PetscObject,const char[]); 1350014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectQuery(PetscObject,const char[],PetscObject *); 1351bdf89e91SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectComposeFunction_Private(PetscObject,const char[],void (*)(void)); 1352bdf89e91SBarry Smith #define PetscObjectComposeFunction(a,b,d) PetscObjectComposeFunction_Private(a,b,(PetscVoidFunction)(d)) 1353014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectSetFromOptions(PetscObject); 1354014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectSetUp(PetscObject); 13550eb63584SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectSetPrintedOptions(PetscObject); 13560eb63584SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectInheritPrintedOptions(PetscObject,PetscObject); 1357014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscCommGetNewTag(MPI_Comm,PetscMPIInt *); 1358d382aafbSBarry Smith 1359665c2dedSJed Brown #include <petscviewertypes.h> 1360639ff905SBarry Smith #include <petscoptions.h> 1361639ff905SBarry Smith 13620633abcbSJed Brown PETSC_EXTERN PetscErrorCode PetscObjectsListGetGlobalNumbering(MPI_Comm,PetscInt,PetscObject*,PetscInt*,PetscInt*); 13630633abcbSJed Brown 1364639ff905SBarry Smith PETSC_EXTERN PetscErrorCode PetscMemoryShowUsage(PetscViewer,const char[]); 1365c5e4d11fSDmitry Karpeev PETSC_EXTERN PetscErrorCode PetscMemoryView(PetscViewer,const char[]); 1366dae58748SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectPrintClassNamePrefixType(PetscObject,PetscViewer); 1367639ff905SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectView(PetscObject,PetscViewer); 13680005d66cSJed Brown #define PetscObjectQueryFunction(obj,name,fptr) PetscObjectQueryFunction_Private((obj),(name),(PetscVoidFunction*)(fptr)) 13690005d66cSJed Brown PETSC_EXTERN PetscErrorCode PetscObjectQueryFunction_Private(PetscObject,const char[],void (**)(void)); 1370014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectSetOptionsPrefix(PetscObject,const char[]); 1371014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectAppendOptionsPrefix(PetscObject,const char[]); 1372014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectPrependOptionsPrefix(PetscObject,const char[]); 1373014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectGetOptionsPrefix(PetscObject,const char*[]); 1374014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectChangeTypeName(PetscObject,const char[]); 1375014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectRegisterDestroy(PetscObject); 1376014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectRegisterDestroyAll(void); 1377685405a1SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectViewFromOptions(PetscObject,PetscObject,const char[]); 1378014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectName(PetscObject); 1379014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectTypeCompare(PetscObject,const char[],PetscBool *); 13804099cc6bSBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectBaseTypeCompare(PetscObject,const char[],PetscBool *); 1381014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscObjectTypeCompareAny(PetscObject,PetscBool*,const char[],...); 1382014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRegisterFinalize(PetscErrorCode (*)(void)); 1383014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRegisterFinalizeAll(void); 1384d382aafbSBarry Smith 1385e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 13867aab2a10SBarry Smith PETSC_EXTERN PetscErrorCode PetscSAWsBlock(void); 1387e04113cfSBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectSAWsViewOff(PetscObject); 1388e04113cfSBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectSAWsSetBlock(PetscObject,PetscBool); 1389e04113cfSBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectSAWsBlock(PetscObject); 1390e04113cfSBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectSAWsGrantAccess(PetscObject); 1391e04113cfSBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectSAWsTakeAccess(PetscObject); 1392e04113cfSBarry Smith PETSC_EXTERN void PetscStackSAWsGrantAccess(void); 1393e04113cfSBarry Smith PETSC_EXTERN void PetscStackSAWsTakeAccess(void); 1394e04113cfSBarry Smith PETSC_EXTERN PetscErrorCode PetscStackViewSAWs(void); 1395e04113cfSBarry Smith PETSC_EXTERN PetscErrorCode PetscStackSAWsViewOff(void); 139615681b3cSBarry Smith 1397ec7429eaSBarry Smith #else 13987aab2a10SBarry Smith #define PetscSAWsBlock() 0 1399e04113cfSBarry Smith #define PetscObjectSAWsViewOff(obj) 0 1400e04113cfSBarry Smith #define PetscObjectSAWsSetBlock(obj,flg) 0 1401e04113cfSBarry Smith #define PetscObjectSAWsBlock(obj) 0 1402e04113cfSBarry Smith #define PetscObjectSAWsGrantAccess(obj) 0 1403e04113cfSBarry Smith #define PetscObjectSAWsTakeAccess(obj) 0 1404e04113cfSBarry Smith #define PetscStackViewSAWs() 0 1405e04113cfSBarry Smith #define PetscStackSAWsViewOff() 0 1406e04113cfSBarry Smith #define PetscStackSAWsTakeAccess() 1407e04113cfSBarry Smith #define PetscStackSAWsGrantAccess() 140815681b3cSBarry Smith 1409ec7429eaSBarry Smith #endif 1410b90c6cbeSBarry Smith 141182b97d80SJed Brown PETSC_EXTERN PetscErrorCode PetscDLOpen(const char[],PetscDLMode,PetscDLHandle *); 141282b97d80SJed Brown PETSC_EXTERN PetscErrorCode PetscDLClose(PetscDLHandle *); 141382b97d80SJed Brown PETSC_EXTERN PetscErrorCode PetscDLSym(PetscDLHandle,const char[],void **); 14147d5d4d99SBarry Smith 14155fe58b6fSBarry Smith #if defined(PETSC_USE_DEBUG) 1416a64a8e02SBarry Smith PETSC_EXTERN PetscErrorCode PetscMallocGetStack(void*,PetscStack**); 14175fe58b6fSBarry Smith #endif 14187eb1d149SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectsDump(FILE*,PetscBool); 1419a64a8e02SBarry Smith 1420140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectListDestroy(PetscObjectList*); 1421140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectListFind(PetscObjectList,const char[],PetscObject*); 1422140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectListReverseFind(PetscObjectList,PetscObject,char**,PetscBool*); 1423140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectListAdd(PetscObjectList *,const char[],PetscObject); 1424140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectListRemoveReference(PetscObjectList *,const char[]); 1425140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscObjectListDuplicate(PetscObjectList,PetscObjectList *); 1426d382aafbSBarry Smith 1427d382aafbSBarry Smith /* 1428503cfb0cSBarry Smith Dynamic library lists. Lists of names of routines in objects or in dynamic 1429d382aafbSBarry Smith link libraries that will be loaded as needed. 1430d382aafbSBarry Smith */ 1431a240a19fSJed Brown 1432a240a19fSJed Brown #define PetscFunctionListAdd(list,name,fptr) PetscFunctionListAdd_Private((list),(name),(PetscVoidFunction)(fptr)) 1433a240a19fSJed Brown PETSC_EXTERN PetscErrorCode PetscFunctionListAdd_Private(PetscFunctionList*,const char[],void (*)(void)); 1434140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscFunctionListDestroy(PetscFunctionList*); 14351c9cd337SJed Brown #define PetscFunctionListFind(list,name,fptr) PetscFunctionListFind_Private((list),(name),(PetscVoidFunction*)(fptr)) 14361c9cd337SJed Brown PETSC_EXTERN PetscErrorCode PetscFunctionListFind_Private(PetscFunctionList,const char[],void (**)(void)); 1437140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscFunctionListPrintTypes(MPI_Comm,FILE*,const char[],const char[],const char[],const char[],PetscFunctionList,const char[]); 1438140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscFunctionListDuplicate(PetscFunctionList,PetscFunctionList *); 1439140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscFunctionListView(PetscFunctionList,PetscViewer); 1440140e18c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscFunctionListGet(PetscFunctionList,const char ***,int*); 1441d382aafbSBarry Smith 1442014dd563SJed Brown PETSC_EXTERN PetscDLLibrary PetscDLLibrariesLoaded; 1443014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDLLibraryAppend(MPI_Comm,PetscDLLibrary *,const char[]); 1444014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDLLibraryPrepend(MPI_Comm,PetscDLLibrary *,const char[]); 1445014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDLLibrarySym(MPI_Comm,PetscDLLibrary *,const char[],const char[],void **); 1446014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDLLibraryPrintPath(PetscDLLibrary); 1447014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDLLibraryRetrieve(MPI_Comm,const char[],char *,size_t,PetscBool *); 1448014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDLLibraryOpen(MPI_Comm,const char[],PetscDLLibrary *); 1449014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscDLLibraryClose(PetscDLLibrary); 1450d382aafbSBarry Smith 1451d382aafbSBarry Smith /* 1452d382aafbSBarry Smith Useful utility routines 1453d382aafbSBarry Smith */ 1454014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSplitOwnership(MPI_Comm,PetscInt*,PetscInt*); 1455014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSplitOwnershipBlock(MPI_Comm,PetscInt,PetscInt*,PetscInt*); 1456014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSequentialPhaseBegin(MPI_Comm,PetscMPIInt); 1457014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSequentialPhaseEnd(MPI_Comm,PetscMPIInt); 1458014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscBarrier(PetscObject); 1459014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscMPIDump(FILE*); 14606ba4152bSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscGlobalMinMaxInt(MPI_Comm,PetscInt[],PetscInt[]); 14616ba4152bSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscGlobalMinMaxReal(MPI_Comm,PetscReal[],PetscReal[]); 1462d382aafbSBarry Smith 146364ac3b0dSPatrick Sanan /*MC 1464ace3abfcSBarry Smith PetscNot - negates a logical type value and returns result as a PetscBool 1465503cfb0cSBarry Smith 1466e28ce29aSPatrick Sanan Notes: 1467e28ce29aSPatrick Sanan This is useful in cases like 1468503cfb0cSBarry Smith $ int *a; 1469ace3abfcSBarry Smith $ PetscBool flag = PetscNot(a) 14701cc8b206SBarry Smith where !a would not return a PetscBool because we cannot provide a cast from int to PetscBool in C. 147164ac3b0dSPatrick Sanan 147264ac3b0dSPatrick Sanan Level: beginner 147364ac3b0dSPatrick Sanan 147464ac3b0dSPatrick Sanan .seealso : PetscBool, PETSC_TRUE, PETSC_FALSE 147564ac3b0dSPatrick Sanan M*/ 1476d382aafbSBarry Smith #define PetscNot(a) ((a) ? PETSC_FALSE : PETSC_TRUE) 1477503cfb0cSBarry Smith 1478d382aafbSBarry Smith /*MC 1479d382aafbSBarry Smith PetscHelpPrintf - Prints help messages. 1480d382aafbSBarry Smith 1481d382aafbSBarry Smith Synopsis: 1482aaa7dc30SBarry Smith #include <petscsys.h> 1483d382aafbSBarry Smith PetscErrorCode (*PetscHelpPrintf)(const char format[],...); 1484d382aafbSBarry Smith 1485eca87e8dSBarry Smith Not Collective 1486eca87e8dSBarry Smith 1487d382aafbSBarry Smith Input Parameters: 1488d382aafbSBarry Smith . format - the usual printf() format string 1489d382aafbSBarry Smith 1490d382aafbSBarry Smith Level: developer 1491d382aafbSBarry Smith 1492d382aafbSBarry Smith Fortran Note: 1493d382aafbSBarry Smith This routine is not supported in Fortran. 1494d382aafbSBarry Smith 1495d382aafbSBarry Smith Concepts: help messages^printing 1496d382aafbSBarry Smith Concepts: printing^help messages 1497d382aafbSBarry Smith 1498d382aafbSBarry Smith .seealso: PetscFPrintf(), PetscSynchronizedPrintf(), PetscErrorPrintf() 1499d382aafbSBarry Smith M*/ 1500014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscHelpPrintf)(MPI_Comm,const char[],...); 1501d382aafbSBarry Smith 1502fcfd50ebSBarry Smith /* 1503fcfd50ebSBarry Smith Defines PETSc profiling. 1504fcfd50ebSBarry Smith */ 15052c8e378dSBarry Smith #include <petsclog.h> 1506fcfd50ebSBarry Smith 1507fcfd50ebSBarry Smith /* 1508fcfd50ebSBarry Smith Simple PETSc parallel IO for ASCII printing 1509fcfd50ebSBarry Smith */ 1510014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFixFilename(const char[],char[]); 1511014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFOpen(MPI_Comm,const char[],const char[],FILE**); 1512014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFClose(MPI_Comm,FILE*); 1513014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFPrintf(MPI_Comm,FILE*,const char[],...); 1514014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPrintf(MPI_Comm,const char[],...); 1515014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSNPrintf(char*,size_t,const char [],...); 1516014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSNPrintfCount(char*,size_t,const char [],size_t*,...); 15171b5687a1SBarry Smith PETSC_EXTERN PetscErrorCode PetscFormatRealArray(char[],size_t,const char*,PetscInt,const PetscReal[]); 1518fcfd50ebSBarry Smith 1519014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscErrorPrintfDefault(const char [],...); 1520014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscErrorPrintfNone(const char [],...); 1521014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscHelpPrintfDefault(MPI_Comm,const char [],...); 1522d382aafbSBarry Smith 1523d781fa04SBarry Smith PETSC_EXTERN PetscErrorCode PetscFormatConvertGetSize(const char*,size_t*); 1524d781fa04SBarry Smith PETSC_EXTERN PetscErrorCode PetscFormatConvert(const char*,char *); 1525d781fa04SBarry Smith 1526d382aafbSBarry Smith #if defined(PETSC_HAVE_POPEN) 1527014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPOpen(MPI_Comm,const char[],const char[],const char[],FILE **); 1528016831caSBarry Smith PETSC_EXTERN PetscErrorCode PetscPClose(MPI_Comm,FILE*); 152974ba8654SBarry Smith PETSC_EXTERN PetscErrorCode PetscPOpenSetMachine(const char[]); 1530d382aafbSBarry Smith #endif 1531d382aafbSBarry Smith 1532014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSynchronizedPrintf(MPI_Comm,const char[],...); 1533014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSynchronizedFPrintf(MPI_Comm,FILE*,const char[],...); 15340ec8b6e3SBarry Smith PETSC_EXTERN PetscErrorCode PetscSynchronizedFlush(MPI_Comm,FILE*); 1535014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSynchronizedFGets(MPI_Comm,FILE*,size_t,char[]); 1536014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStartMatlab(MPI_Comm,const char[],const char[],FILE**); 1537014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStartJava(MPI_Comm,const char[],const char[],FILE**); 1538014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetPetscDir(const char*[]); 1539d382aafbSBarry Smith 1540014dd563SJed Brown PETSC_EXTERN PetscClassId PETSC_CONTAINER_CLASSID; 1541014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscContainerGetPointer(PetscContainer,void **); 1542014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscContainerSetPointer(PetscContainer,void *); 1543014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscContainerDestroy(PetscContainer*); 1544014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscContainerCreate(MPI_Comm,PetscContainer *); 1545014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscContainerSetUserDestroy(PetscContainer, PetscErrorCode (*)(void*)); 1546b61ba218SStefano Zampini PETSC_EXTERN PetscErrorCode PetscContainerUserDestroyDefault(void*); 1547d382aafbSBarry Smith 1548d382aafbSBarry Smith /* 1549d382aafbSBarry Smith For use in debuggers 1550d382aafbSBarry Smith */ 1551014dd563SJed Brown PETSC_EXTERN PetscMPIInt PetscGlobalRank; 1552014dd563SJed Brown PETSC_EXTERN PetscMPIInt PetscGlobalSize; 1553014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscIntView(PetscInt,const PetscInt[],PetscViewer); 1554014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRealView(PetscInt,const PetscReal[],PetscViewer); 1555014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscScalarView(PetscInt,const PetscScalar[],PetscViewer); 1556d382aafbSBarry Smith 1557a663daf8SBarry Smith #include <stddef.h> 1558a3aaec0aSJed Brown #include <string.h> /* for memcpy, memset */ 1559d382aafbSBarry Smith #if defined(PETSC_HAVE_STDLIB_H) 1560d382aafbSBarry Smith #include <stdlib.h> 1561d382aafbSBarry Smith #endif 15626c7e564aSBarry Smith 15634a92a979SJed Brown #if defined(PETSC_HAVE_XMMINTRIN_H) && !defined(__CUDACC__) 1564d382aafbSBarry Smith #include <xmmintrin.h> 1565d382aafbSBarry Smith #endif 1566d382aafbSBarry Smith 1567d382aafbSBarry Smith /*@C 1568d382aafbSBarry Smith PetscMemcpy - Copies n bytes, beginning at location b, to the space 1569d382aafbSBarry Smith beginning at location a. The two memory regions CANNOT overlap, use 1570d382aafbSBarry Smith PetscMemmove() in that case. 1571d382aafbSBarry Smith 1572d382aafbSBarry Smith Not Collective 1573d382aafbSBarry Smith 1574d382aafbSBarry Smith Input Parameters: 1575d382aafbSBarry Smith + b - pointer to initial memory space 1576d382aafbSBarry Smith - n - length (in bytes) of space to copy 1577d382aafbSBarry Smith 1578d382aafbSBarry Smith Output Parameter: 1579d382aafbSBarry Smith . a - pointer to copy space 1580d382aafbSBarry Smith 1581d382aafbSBarry Smith Level: intermediate 1582d382aafbSBarry Smith 1583d382aafbSBarry Smith Compile Option: 1584d382aafbSBarry Smith PETSC_PREFER_DCOPY_FOR_MEMCPY will cause the BLAS dcopy() routine to be used 1585d382aafbSBarry Smith for memory copies on double precision values. 1586d382aafbSBarry Smith PETSC_PREFER_COPY_FOR_MEMCPY will cause C code to be used 1587d382aafbSBarry Smith for memory copies on double precision values. 1588d382aafbSBarry Smith PETSC_PREFER_FORTRAN_FORMEMCPY will cause Fortran code to be used 1589d382aafbSBarry Smith for memory copies on double precision values. 1590d382aafbSBarry Smith 1591d382aafbSBarry Smith Note: 1592d382aafbSBarry Smith This routine is analogous to memcpy(). 1593d382aafbSBarry Smith 15941fd49c25SBarry Smith Not available from Fortran 15951fd49c25SBarry Smith 1596f5f57ec0SBarry Smith Developer Note: this is inlined for fastest performance 1597f5f57ec0SBarry Smith 1598d382aafbSBarry Smith Concepts: memory^copying 1599d382aafbSBarry Smith Concepts: copying^memory 1600d382aafbSBarry Smith 16011fd49c25SBarry Smith .seealso: PetscMemmove(), PetscStrallocpy() 1602d382aafbSBarry Smith 1603d382aafbSBarry Smith @*/ 16047087cfbeSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscMemcpy(void *a,const void *b,size_t n) 1605d382aafbSBarry Smith { 1606d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG) 1607c5e4d11fSDmitry Karpeev size_t al = (size_t) a,bl = (size_t) b; 1608c5e4d11fSDmitry Karpeev size_t nl = (size_t) n; 1609a7e36092SMatthew G Knepley PetscFunctionBegin; 1610e32f2f54SBarry Smith if (n > 0 && !b) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy from a null pointer"); 1611e32f2f54SBarry Smith if (n > 0 && !a) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to copy to a null pointer"); 1612a7e36092SMatthew G Knepley #else 1613d382aafbSBarry Smith PetscFunctionBegin; 1614a7e36092SMatthew G Knepley #endif 1615a47a537aSLisandro Dalcin if (a != b && n > 0) { 1616d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG) 1617e47d2de2SBarry 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\ 1618d382aafbSBarry Smith or make sure your copy regions and lengths are correct. \n\ 1619d382aafbSBarry Smith Length (bytes) %ld first address %ld second address %ld",nl,al,bl); 1620d382aafbSBarry Smith #endif 1621d382aafbSBarry Smith #if (defined(PETSC_PREFER_DCOPY_FOR_MEMCPY) || defined(PETSC_PREFER_COPY_FOR_MEMCPY) || defined(PETSC_PREFER_FORTRAN_FORMEMCPY)) 1622c5e4d11fSDmitry Karpeev if (!(a % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) { 1623d382aafbSBarry Smith size_t len = n/sizeof(PetscScalar); 1624d382aafbSBarry Smith #if defined(PETSC_PREFER_DCOPY_FOR_MEMCPY) 1625c5df96a5SBarry Smith PetscBLASInt one = 1,blen; 1626c5df96a5SBarry Smith PetscErrorCode ierr; 1627c5df96a5SBarry Smith ierr = PetscBLASIntCast(len,&blen);CHKERRQ(ierr); 16288b83055fSJed Brown PetscStackCallBLAS("BLAScopy",BLAScopy_(&blen,(PetscScalar *)b,&one,(PetscScalar *)a,&one)); 1629d382aafbSBarry Smith #elif defined(PETSC_PREFER_FORTRAN_FORMEMCPY) 1630d382aafbSBarry Smith fortrancopy_(&len,(PetscScalar*)b,(PetscScalar*)a); 1631d382aafbSBarry Smith #else 1632d382aafbSBarry Smith size_t i; 1633d382aafbSBarry Smith PetscScalar *x = (PetscScalar*)b, *y = (PetscScalar*)a; 1634d382aafbSBarry Smith for (i=0; i<len; i++) y[i] = x[i]; 1635d382aafbSBarry Smith #endif 1636d382aafbSBarry Smith } else { 1637d382aafbSBarry Smith memcpy((char*)(a),(char*)(b),n); 1638d382aafbSBarry Smith } 1639d382aafbSBarry Smith #else 1640d382aafbSBarry Smith memcpy((char*)(a),(char*)(b),n); 1641d382aafbSBarry Smith #endif 1642d382aafbSBarry Smith } 1643d382aafbSBarry Smith PetscFunctionReturn(0); 1644d382aafbSBarry Smith } 1645d382aafbSBarry Smith 1646d382aafbSBarry Smith /*@C 1647d382aafbSBarry Smith PetscMemzero - Zeros the specified memory. 1648d382aafbSBarry Smith 1649d382aafbSBarry Smith Not Collective 1650d382aafbSBarry Smith 1651d382aafbSBarry Smith Input Parameters: 1652d382aafbSBarry Smith + a - pointer to beginning memory location 1653d382aafbSBarry Smith - n - length (in bytes) of memory to initialize 1654d382aafbSBarry Smith 1655d382aafbSBarry Smith Level: intermediate 1656d382aafbSBarry Smith 1657d382aafbSBarry Smith Compile Option: 1658d382aafbSBarry Smith PETSC_PREFER_BZERO - on certain machines (the IBM RS6000) the bzero() routine happens 1659d382aafbSBarry Smith to be faster than the memset() routine. This flag causes the bzero() routine to be used. 1660d382aafbSBarry Smith 16611fd49c25SBarry Smith Not available from Fortran 16621fd49c25SBarry Smith 1663503cfb0cSBarry Smith Developer Note: this is inlined for fastest performance 1664503cfb0cSBarry Smith 1665d382aafbSBarry Smith Concepts: memory^zeroing 1666d382aafbSBarry Smith Concepts: zeroing^memory 1667d382aafbSBarry Smith 1668d382aafbSBarry Smith .seealso: PetscMemcpy() 1669d382aafbSBarry Smith @*/ 16707087cfbeSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscMemzero(void *a,size_t n) 1671d382aafbSBarry Smith { 1672d382aafbSBarry Smith if (n > 0) { 1673d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG) 1674e32f2f54SBarry Smith if (!a) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Trying to zero at a null pointer"); 1675d382aafbSBarry Smith #endif 1676d382aafbSBarry Smith #if defined(PETSC_PREFER_ZERO_FOR_MEMZERO) 1677d382aafbSBarry Smith if (!(((long) a) % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) { 1678d382aafbSBarry Smith size_t i,len = n/sizeof(PetscScalar); 1679d382aafbSBarry Smith PetscScalar *x = (PetscScalar*)a; 1680d382aafbSBarry Smith for (i=0; i<len; i++) x[i] = 0.0; 1681d382aafbSBarry Smith } else { 1682d382aafbSBarry Smith #elif defined(PETSC_PREFER_FORTRAN_FOR_MEMZERO) 1683d382aafbSBarry Smith if (!(((long) a) % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) { 1684d382aafbSBarry Smith PetscInt len = n/sizeof(PetscScalar); 1685d382aafbSBarry Smith fortranzero_(&len,(PetscScalar*)a); 1686d382aafbSBarry Smith } else { 1687d382aafbSBarry Smith #endif 1688d382aafbSBarry Smith #if defined(PETSC_PREFER_BZERO) 1689d382aafbSBarry Smith bzero((char *)a,n); 1690d382aafbSBarry Smith #else 1691d382aafbSBarry Smith memset((char*)a,0,n); 1692d382aafbSBarry Smith #endif 1693d382aafbSBarry Smith #if defined(PETSC_PREFER_ZERO_FOR_MEMZERO) || defined(PETSC_PREFER_FORTRAN_FOR_MEMZERO) 1694d382aafbSBarry Smith } 1695d382aafbSBarry Smith #endif 1696d382aafbSBarry Smith } 1697d382aafbSBarry Smith return 0; 1698d382aafbSBarry Smith } 1699d382aafbSBarry Smith 1700d382aafbSBarry Smith /*MC 1701d382aafbSBarry Smith PetscPrefetchBlock - Prefetches a block of memory 1702d382aafbSBarry Smith 1703eca87e8dSBarry Smith Synopsis: 1704aaa7dc30SBarry Smith #include <petscsys.h> 1705eca87e8dSBarry Smith void PetscPrefetchBlock(const anytype *a,size_t n,int rw,int t) 1706eca87e8dSBarry Smith 1707d382aafbSBarry Smith Not Collective 1708d382aafbSBarry Smith 1709d382aafbSBarry Smith Input Parameters: 1710d382aafbSBarry Smith + a - pointer to first element to fetch (any type but usually PetscInt or PetscScalar) 1711d382aafbSBarry Smith . n - number of elements to fetch 1712d382aafbSBarry Smith . rw - 1 if the memory will be written to, otherwise 0 (ignored by many processors) 171350d8bf02SJed Brown - t - temporal locality (PETSC_PREFETCH_HINT_{NTA,T0,T1,T2}), see note 1714d382aafbSBarry Smith 1715d382aafbSBarry Smith Level: developer 1716d382aafbSBarry Smith 1717d382aafbSBarry Smith Notes: 1718d382aafbSBarry Smith The last two arguments (rw and t) must be compile-time constants. 1719d382aafbSBarry Smith 172050d8bf02SJed Brown Adopting Intel's x86/x86-64 conventions, there are four levels of temporal locality. Not all architectures offer 172150d8bf02SJed Brown equivalent locality hints, but the following macros are always defined to their closest analogue. 172250d8bf02SJed 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). 172363cf1ef0SJed 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. 172463cf1ef0SJed Brown . PETSC_PREFETCH_HINT_T1 - Fetch to level 2 and higher (not L1). 172563cf1ef0SJed Brown - PETSC_PREFETCH_HINT_T2 - Fetch to high-level cache only. (On many systems, T0 and T1 are equivalent.) 1726d382aafbSBarry Smith 1727d382aafbSBarry Smith This function does nothing on architectures that do not support prefetch and never errors (even if passed an invalid 1728d382aafbSBarry Smith address). 1729d382aafbSBarry Smith 1730d382aafbSBarry Smith Concepts: memory 1731d382aafbSBarry Smith M*/ 1732d382aafbSBarry Smith #define PetscPrefetchBlock(a,n,rw,t) do { \ 1733d382aafbSBarry Smith const char *_p = (const char*)(a),*_end = (const char*)((a)+(n)); \ 1734d382aafbSBarry Smith for ( ; _p < _end; _p += PETSC_LEVEL1_DCACHE_LINESIZE) PETSC_Prefetch(_p,(rw),(t)); \ 1735d382aafbSBarry Smith } while (0) 1736d382aafbSBarry Smith 1737d382aafbSBarry Smith /* 1738d382aafbSBarry Smith Determine if some of the kernel computation routines use 1739d382aafbSBarry Smith Fortran (rather than C) for the numerical calculations. On some machines 1740d382aafbSBarry Smith and compilers (like complex numbers) the Fortran version of the routines 1741d382aafbSBarry Smith is faster than the C/C++ versions. The flag --with-fortran-kernels 1742e2e64c6bSBarry Smith should be used with ./configure to turn these on. 1743d382aafbSBarry Smith */ 1744d382aafbSBarry Smith #if defined(PETSC_USE_FORTRAN_KERNELS) 1745d382aafbSBarry Smith 1746d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTCRL) 1747d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MULTCRL 1748d382aafbSBarry Smith #endif 1749d382aafbSBarry Smith 17505a11e1b2SBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTAIJPERM) 17515a11e1b2SBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MULTAIJPERM 1752d382aafbSBarry Smith #endif 1753d382aafbSBarry Smith 1754d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTAIJ) 1755d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MULTAIJ 1756d382aafbSBarry Smith #endif 1757d382aafbSBarry Smith 1758d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ) 1759d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ 1760d382aafbSBarry Smith #endif 1761d382aafbSBarry Smith 1762d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_NORM) 1763d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_NORM 1764d382aafbSBarry Smith #endif 1765d382aafbSBarry Smith 1766d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MAXPY) 1767d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MAXPY 1768d382aafbSBarry Smith #endif 1769d382aafbSBarry Smith 1770d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_SOLVEAIJ) 1771d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_SOLVEAIJ 1772d382aafbSBarry Smith #endif 1773d382aafbSBarry Smith 1774d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_RELAXAIJ) 1775d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_RELAXAIJ 1776d382aafbSBarry Smith #endif 1777d382aafbSBarry Smith 1778d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_SOLVEBAIJ) 1779d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_SOLVEBAIJ 1780d382aafbSBarry Smith #endif 1781d382aafbSBarry Smith 1782d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ) 1783d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ 1784d382aafbSBarry Smith #endif 1785d382aafbSBarry Smith 1786d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MDOT) 1787d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MDOT 1788d382aafbSBarry Smith #endif 1789d382aafbSBarry Smith 1790d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_XTIMESY) 1791d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_XTIMESY 1792d382aafbSBarry Smith #endif 1793d382aafbSBarry Smith 1794d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_AYPX) 1795d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_AYPX 1796d382aafbSBarry Smith #endif 1797d382aafbSBarry Smith 1798d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_WAXPY) 1799d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_WAXPY 1800d382aafbSBarry Smith #endif 1801d382aafbSBarry Smith 1802d382aafbSBarry Smith #endif 1803d382aafbSBarry Smith 1804d382aafbSBarry Smith /* 1805d382aafbSBarry Smith Macros for indicating code that should be compiled with a C interface, 1806d382aafbSBarry Smith rather than a C++ interface. Any routines that are dynamically loaded 1807d382aafbSBarry Smith (such as the PCCreate_XXX() routines) must be wrapped so that the name 1808d382aafbSBarry Smith mangler does not change the functions symbol name. This just hides the 1809d382aafbSBarry Smith ugly extern "C" {} wrappers. 1810d382aafbSBarry Smith */ 1811d382aafbSBarry Smith #if defined(__cplusplus) 1812d382aafbSBarry Smith # define EXTERN_C_BEGIN extern "C" { 1813d382aafbSBarry Smith # define EXTERN_C_END } 1814d382aafbSBarry Smith #else 1815d382aafbSBarry Smith # define EXTERN_C_BEGIN 1816d382aafbSBarry Smith # define EXTERN_C_END 1817d382aafbSBarry Smith #endif 1818d382aafbSBarry Smith 1819d382aafbSBarry Smith /* --------------------------------------------------------------------*/ 1820d382aafbSBarry Smith 1821d382aafbSBarry Smith /*MC 1822d382aafbSBarry Smith MPI_Comm - the basic object used by MPI to determine which processes are involved in a 1823d382aafbSBarry Smith communication 1824d382aafbSBarry Smith 1825d382aafbSBarry Smith Level: beginner 1826d382aafbSBarry Smith 1827d382aafbSBarry Smith Note: This manual page is a place-holder because MPICH does not have a manual page for MPI_Comm 1828d382aafbSBarry Smith 1829d382aafbSBarry Smith .seealso: PETSC_COMM_WORLD, PETSC_COMM_SELF 1830d382aafbSBarry Smith M*/ 1831d382aafbSBarry Smith 1832d382aafbSBarry Smith #if defined(PETSC_HAVE_MPIIO) 1833014dd563SJed Brown PETSC_EXTERN PetscErrorCode MPIU_File_write_all(MPI_File,void*,PetscMPIInt,MPI_Datatype,MPI_Status*); 1834014dd563SJed Brown PETSC_EXTERN PetscErrorCode MPIU_File_read_all(MPI_File,void*,PetscMPIInt,MPI_Datatype,MPI_Status*); 1835d382aafbSBarry Smith #endif 1836d382aafbSBarry Smith 1837d382aafbSBarry Smith /* the following petsc_static_inline require petscerror.h */ 1838d382aafbSBarry Smith 1839d382aafbSBarry Smith /* Limit MPI to 32-bits */ 1840d382aafbSBarry Smith #define PETSC_MPI_INT_MAX 2147483647 1841d382aafbSBarry Smith #define PETSC_MPI_INT_MIN -2147483647 1842d382aafbSBarry Smith /* Limit BLAS to 32-bits */ 1843d382aafbSBarry Smith #define PETSC_BLAS_INT_MAX 2147483647 1844d382aafbSBarry Smith #define PETSC_BLAS_INT_MIN -2147483647 1845d382aafbSBarry Smith 184661b0d812SBarry Smith /*@C 184761b0d812SBarry Smith PetscBLASIntCast - casts a PetscInt (which may be 64 bits in size) to a PetscBLASInt (which may be 32 bits in size), generates an 184861b0d812SBarry Smith error if the PetscBLASInt is not large enough to hold the number. 184961b0d812SBarry Smith 185061b0d812SBarry Smith Not Collective 185161b0d812SBarry Smith 185261b0d812SBarry Smith Input Parameter: 185361b0d812SBarry Smith . a - the PetscInt value 185461b0d812SBarry Smith 185561b0d812SBarry Smith Output Parameter: 185661b0d812SBarry Smith . b - the resulting PetscBLASInt value 185761b0d812SBarry Smith 185861b0d812SBarry Smith Level: advanced 185961b0d812SBarry Smith 18601fd49c25SBarry Smith Not available from Fortran 18611fd49c25SBarry Smith 186261b0d812SBarry Smith .seealso: PetscBLASInt, PetscMPIInt, PetscInt, PetscMPIIntCast() 186361b0d812SBarry Smith @*/ 1864c5df96a5SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscBLASIntCast(PetscInt a,PetscBLASInt *b) 1865c5df96a5SBarry Smith { 1866c5df96a5SBarry Smith PetscFunctionBegin; 1867ab7117d1SBarry Smith *b = (PetscBLASInt)(a); 1868c5df96a5SBarry Smith #if defined(PETSC_USE_64BIT_INDICES) && !defined(PETSC_HAVE_64BIT_BLAS_INDICES) 1869c5df96a5SBarry Smith if ((a) > PETSC_BLAS_INT_MAX) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Array too long for BLAS/LAPACK"); 1870c5df96a5SBarry Smith #endif 1871c5df96a5SBarry Smith PetscFunctionReturn(0); 1872c5df96a5SBarry Smith } 1873c5df96a5SBarry Smith 187461b0d812SBarry Smith /*@C 187561b0d812SBarry Smith PetscMPIIntCast - casts a PetscInt (which may be 64 bits in size) to a PetscMPIInt (which may be 32 bits in size), generates an 187661b0d812SBarry Smith error if the PetscMPIInt is not large enough to hold the number. 187761b0d812SBarry Smith 187861b0d812SBarry Smith Not Collective 187961b0d812SBarry Smith 188061b0d812SBarry Smith Input Parameter: 188161b0d812SBarry Smith . a - the PetscInt value 188261b0d812SBarry Smith 188361b0d812SBarry Smith Output Parameter: 188461b0d812SBarry Smith . b - the resulting PetscMPIInt value 188561b0d812SBarry Smith 188661b0d812SBarry Smith Level: advanced 188761b0d812SBarry Smith 18881fd49c25SBarry Smith Not available from Fortran 18891fd49c25SBarry Smith 189061b0d812SBarry Smith .seealso: PetscBLASInt, PetscMPIInt, PetscInt, PetscBLASIntCast() 189161b0d812SBarry Smith @*/ 18924dc2109aSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscMPIIntCast(PetscInt a,PetscMPIInt *b) 18934dc2109aSBarry Smith { 18944dc2109aSBarry Smith PetscFunctionBegin; 1895ab7117d1SBarry Smith *b = (PetscMPIInt)(a); 18964dc2109aSBarry Smith #if defined(PETSC_USE_64BIT_INDICES) 18974dc2109aSBarry Smith if ((a) > PETSC_MPI_INT_MAX) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Array too long for MPI"); 18984dc2109aSBarry Smith #endif 18994dc2109aSBarry Smith PetscFunctionReturn(0); 19004dc2109aSBarry Smith } 19014dc2109aSBarry Smith 1902bafee8b4SSatish Balay #define PetscInt64Mult(a,b) ((PetscInt64)(a))*((PetscInt64)(b)) 19032f18eb33SBarry Smith 19042f18eb33SBarry Smith /*@C 19052f18eb33SBarry Smith 19062f18eb33SBarry 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 19072f18eb33SBarry Smith 19082f18eb33SBarry Smith Not Collective 19092f18eb33SBarry Smith 19102f18eb33SBarry Smith Input Parameter: 19112f18eb33SBarry Smith + a - the PetscReal value 19122f18eb33SBarry Smith - b - the second value 19132f18eb33SBarry Smith 1914390e1bf2SBarry Smith Returns: 1915390e1bf2SBarry Smith the result as a PetscInt value 19162f18eb33SBarry Smith 1917bafee8b4SSatish Balay Use PetscInt64Mult() to compute the product of two PetscInt as a PetscInt64 19182f18eb33SBarry Smith Use PetscIntMultTruncate() to compute the product of two positive PetscInt and truncate to fit a PetscInt 19192f18eb33SBarry 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 19202f18eb33SBarry Smith 1921e28ce29aSPatrick Sanan Developers Note: 1922e28ce29aSPatrick Sanan We currently assume that PetscInt addition can never overflow, this is obviously wrong but requires many more checks. 19232f18eb33SBarry Smith 19242f18eb33SBarry Smith This is used where we compute approximate sizes for workspace and need to insure the workspace is index-able. 19252f18eb33SBarry Smith 19261fd49c25SBarry Smith Not available from Fortran 19271fd49c25SBarry Smith 19282f18eb33SBarry Smith Level: advanced 19292f18eb33SBarry Smith 1930390e1bf2SBarry Smith .seealso: PetscBLASInt, PetscMPIInt, PetscInt, PetscBLASIntCast(), PetscInt64Mult() 19312f18eb33SBarry Smith @*/ 19322f18eb33SBarry Smith PETSC_STATIC_INLINE PetscInt PetscRealIntMultTruncate(PetscReal a,PetscInt b) 19332f18eb33SBarry Smith { 1934bafee8b4SSatish Balay PetscInt64 r; 19352f18eb33SBarry Smith 1936bafee8b4SSatish Balay r = (PetscInt64) (a*(PetscReal)b); 19372f18eb33SBarry Smith if (r > PETSC_MAX_INT - 100) r = PETSC_MAX_INT - 100; 19382f18eb33SBarry Smith return (PetscInt) r; 19392f18eb33SBarry Smith } 19402f18eb33SBarry Smith 19412f18eb33SBarry Smith /*@C 19422f18eb33SBarry Smith 19432f18eb33SBarry Smith PetscIntMultTruncate - Computes the product of two positive PetscInt and truncates the value to slightly less than the maximal possible value 19442f18eb33SBarry Smith 19452f18eb33SBarry Smith Not Collective 19462f18eb33SBarry Smith 19472f18eb33SBarry Smith Input Parameter: 19482f18eb33SBarry Smith + a - the PetscInt value 19492f18eb33SBarry Smith - b - the second value 19502f18eb33SBarry Smith 1951390e1bf2SBarry Smith Returns: 1952390e1bf2SBarry Smith the result as a PetscInt value 19532f18eb33SBarry Smith 1954bafee8b4SSatish Balay Use PetscInt64Mult() to compute the product of two PetscInt as a PetscInt64 19552f18eb33SBarry Smith Use PetscRealIntMultTruncate() to compute the product of a PetscReal and a PetscInt and truncate to fit a PetscInt 19562f18eb33SBarry 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 19572f18eb33SBarry Smith 19581fd49c25SBarry Smith Not available from Fortran 19591fd49c25SBarry Smith 19602f18eb33SBarry Smith Developers Note: We currently assume that PetscInt addition can never overflow, this is obviously wrong but requires many more checks. 19612f18eb33SBarry Smith 19622f18eb33SBarry Smith This is used where we compute approximate sizes for workspace and need to insure the workspace is index-able. 19632f18eb33SBarry Smith 19642f18eb33SBarry Smith Level: advanced 19652f18eb33SBarry Smith 1966390e1bf2SBarry Smith .seealso: PetscBLASInt, PetscMPIInt, PetscInt, PetscBLASIntCast(), PetscInt64Mult() 19672f18eb33SBarry Smith @*/ 19682f18eb33SBarry Smith PETSC_STATIC_INLINE PetscInt PetscIntMultTruncate(PetscInt a,PetscInt b) 19692f18eb33SBarry Smith { 1970bafee8b4SSatish Balay PetscInt64 r; 19712f18eb33SBarry Smith 1972bafee8b4SSatish Balay r = PetscInt64Mult(a,b); 19732f18eb33SBarry Smith if (r > PETSC_MAX_INT - 100) r = PETSC_MAX_INT - 100; 19742f18eb33SBarry Smith return (PetscInt) r; 19752f18eb33SBarry Smith } 19762f18eb33SBarry Smith 1977f91af8c7SBarry Smith /*@C 1978f91af8c7SBarry Smith 1979f91af8c7SBarry Smith PetscIntSumTruncate - Computes the sum of two positive PetscInt and truncates the value to slightly less than the maximal possible value 1980f91af8c7SBarry Smith 1981f91af8c7SBarry Smith Not Collective 1982f91af8c7SBarry Smith 1983f91af8c7SBarry Smith Input Parameter: 1984f91af8c7SBarry Smith + a - the PetscInt value 1985f91af8c7SBarry Smith - b - the second value 1986f91af8c7SBarry Smith 1987390e1bf2SBarry Smith Returns: 1988390e1bf2SBarry Smith the result as a PetscInt value 1989f91af8c7SBarry Smith 1990bafee8b4SSatish Balay Use PetscInt64Mult() to compute the product of two PetscInt as a PetscInt64 1991f91af8c7SBarry Smith Use PetscRealIntMultTruncate() to compute the product of a PetscReal and a PetscInt and truncate to fit a PetscInt 1992f91af8c7SBarry 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 1993f91af8c7SBarry Smith 1994f91af8c7SBarry Smith This is used where we compute approximate sizes for workspace and need to insure the workspace is index-able. 1995f91af8c7SBarry Smith 1996f5f57ec0SBarry Smith Not available from Fortran 1997f5f57ec0SBarry Smith 1998f91af8c7SBarry Smith Level: advanced 1999f91af8c7SBarry Smith 2000390e1bf2SBarry Smith .seealso: PetscBLASInt, PetscMPIInt, PetscInt, PetscBLASIntCast(), PetscInt64Mult() 2001f91af8c7SBarry Smith @*/ 2002f91af8c7SBarry Smith PETSC_STATIC_INLINE PetscInt PetscIntSumTruncate(PetscInt a,PetscInt b) 2003f91af8c7SBarry Smith { 2004bafee8b4SSatish Balay PetscInt64 r; 2005f91af8c7SBarry Smith 2006bafee8b4SSatish Balay r = ((PetscInt64)a) + ((PetscInt64)b); 2007f91af8c7SBarry Smith if (r > PETSC_MAX_INT - 100) r = PETSC_MAX_INT - 100; 2008f91af8c7SBarry Smith return (PetscInt) r; 2009f91af8c7SBarry Smith } 2010f91af8c7SBarry Smith 20112f18eb33SBarry Smith /*@C 20122f18eb33SBarry Smith 20132f18eb33SBarry Smith PetscIntMultError - Computes the product of two positive PetscInt and generates an error with overflow. 20142f18eb33SBarry Smith 20152f18eb33SBarry Smith Not Collective 20162f18eb33SBarry Smith 20172f18eb33SBarry Smith Input Parameter: 20182f18eb33SBarry Smith + a - the PetscInt value 20192f18eb33SBarry Smith - b - the second value 20202f18eb33SBarry Smith 20212f18eb33SBarry Smith Output Parameter:ma 2022390e1bf2SBarry 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 20232f18eb33SBarry Smith 2024bafee8b4SSatish Balay Use PetscInt64Mult() to compute the product of two 32 bit PetscInt and store in a PetscInt64 20252f18eb33SBarry Smith Use PetscIntMultTruncate() to compute the product of two PetscInt and truncate it to fit in a PetscInt 20262f18eb33SBarry Smith 2027f5f57ec0SBarry Smith Not available from Fortran 2028f5f57ec0SBarry Smith 2029220afb94SBarry Smith Developers Note: We currently assume that PetscInt addition does not overflow, this is obviously wrong but requires many more checks. 20302f18eb33SBarry Smith 20312f18eb33SBarry Smith Level: advanced 20322f18eb33SBarry Smith 2033220afb94SBarry Smith .seealso: PetscBLASInt, PetscMPIInt, PetscInt, PetscBLASIntCast(), PetscIntMult64(), PetscIntSumError() 20342f18eb33SBarry Smith @*/ 20352f18eb33SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscIntMultError(PetscInt a,PetscInt b,PetscInt *result) 20362f18eb33SBarry Smith { 2037bafee8b4SSatish Balay PetscInt64 r; 20382f18eb33SBarry Smith 20392f18eb33SBarry Smith PetscFunctionBegin; 2040bafee8b4SSatish Balay r = PetscInt64Mult(a,b); 20412f18eb33SBarry Smith #if !defined(PETSC_USE_64BIT_INDICES) 20422f18eb33SBarry Smith if (r > PETSC_MAX_INT) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_SUP,"Product of two integer %d %d overflow, you must ./configure PETSc with --with-64-bit-indices for the case you are running",a,b); 20432f18eb33SBarry Smith #endif 2044f91af8c7SBarry Smith if (result) *result = (PetscInt) r; 2045f91af8c7SBarry Smith PetscFunctionReturn(0); 2046f91af8c7SBarry Smith } 2047f91af8c7SBarry Smith 2048f91af8c7SBarry Smith /*@C 2049f91af8c7SBarry Smith 2050fbfcfee5SBarry Smith PetscIntSumError - Computes the sum of two positive PetscInt and generates an error with overflow. 2051f91af8c7SBarry Smith 2052f91af8c7SBarry Smith Not Collective 2053f91af8c7SBarry Smith 2054f91af8c7SBarry Smith Input Parameter: 2055f91af8c7SBarry Smith + a - the PetscInt value 2056f91af8c7SBarry Smith - b - the second value 2057f91af8c7SBarry Smith 2058f91af8c7SBarry Smith Output Parameter:ma 2059390e1bf2SBarry 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 2060f91af8c7SBarry Smith 2061bafee8b4SSatish Balay Use PetscInt64Mult() to compute the product of two 32 bit PetscInt and store in a PetscInt64 2062f91af8c7SBarry Smith Use PetscIntMultTruncate() to compute the product of two PetscInt and truncate it to fit in a PetscInt 2063f91af8c7SBarry Smith 2064f5f57ec0SBarry Smith Not available from Fortran 2065f5f57ec0SBarry Smith 2066f91af8c7SBarry Smith Level: advanced 2067f91af8c7SBarry Smith 2068390e1bf2SBarry Smith .seealso: PetscBLASInt, PetscMPIInt, PetscInt, PetscBLASIntCast(), PetscInt64Mult() 2069f91af8c7SBarry Smith @*/ 2070f91af8c7SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscIntSumError(PetscInt a,PetscInt b,PetscInt *result) 2071f91af8c7SBarry Smith { 2072bafee8b4SSatish Balay PetscInt64 r; 2073f91af8c7SBarry Smith 2074f91af8c7SBarry Smith PetscFunctionBegin; 2075bafee8b4SSatish Balay r = ((PetscInt64)a) + ((PetscInt64)b); 2076f91af8c7SBarry Smith #if !defined(PETSC_USE_64BIT_INDICES) 2077f91af8c7SBarry Smith if (r > PETSC_MAX_INT) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_SUP,"Sum of two integer %d %d overflow, you must ./configure PETSc with --with-64-bit-indices for the case you are running",a,b); 2078f91af8c7SBarry Smith #endif 2079f91af8c7SBarry Smith if (result) *result = (PetscInt) r; 20802f18eb33SBarry Smith PetscFunctionReturn(0); 20812f18eb33SBarry Smith } 2082c5df96a5SBarry Smith 2083d382aafbSBarry Smith /* 20842981ebdbSBarry Smith The IBM include files define hz, here we hide it so that it may be used as a regular user variable. 2085d382aafbSBarry Smith */ 2086d382aafbSBarry Smith #if defined(hz) 2087d382aafbSBarry Smith # undef hz 2088d382aafbSBarry Smith #endif 2089d382aafbSBarry Smith 2090*15a5570dSLisandro Dalcin #include <limits.h> 2091*15a5570dSLisandro Dalcin 2092*15a5570dSLisandro Dalcin /* The number of bits in a byte */ 2093*15a5570dSLisandro Dalcin 2094*15a5570dSLisandro Dalcin #define PETSC_BITS_PER_BYTE CHAR_BIT 2095*15a5570dSLisandro Dalcin 2096d382aafbSBarry Smith /* For arrays that contain filenames or paths */ 2097d382aafbSBarry Smith 2098d382aafbSBarry Smith #if defined(PETSC_HAVE_SYS_PARAM_H) 2099d382aafbSBarry Smith # include <sys/param.h> 2100d382aafbSBarry Smith #endif 2101d382aafbSBarry Smith #if defined(PETSC_HAVE_SYS_TYPES_H) 2102d382aafbSBarry Smith # include <sys/types.h> 2103d382aafbSBarry Smith #endif 2104d382aafbSBarry Smith #if defined(MAXPATHLEN) 2105d382aafbSBarry Smith # define PETSC_MAX_PATH_LEN MAXPATHLEN 2106d382aafbSBarry Smith #elif defined(MAX_PATH) 2107d382aafbSBarry Smith # define PETSC_MAX_PATH_LEN MAX_PATH 2108d382aafbSBarry Smith #elif defined(_MAX_PATH) 2109d382aafbSBarry Smith # define PETSC_MAX_PATH_LEN _MAX_PATH 2110d382aafbSBarry Smith #else 2111d382aafbSBarry Smith # define PETSC_MAX_PATH_LEN 4096 2112d382aafbSBarry Smith #endif 2113d382aafbSBarry Smith 2114d382aafbSBarry Smith /*MC 2115d382aafbSBarry Smith 211666d79e26SBarry 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++ 211766d79e26SBarry Smith and Fortran compilers when petscsys.h is included. 211866d79e26SBarry Smith 211966d79e26SBarry Smith 212066d79e26SBarry Smith The current PETSc version and the API for accessing it are defined in petscversion.h 212166d79e26SBarry Smith 212266d79e26SBarry 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) 212366d79e26SBarry Smith 212466d79e26SBarry 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 212566d79e26SBarry Smith where only a change in the major version number (x) indicates a change in the API. 212666d79e26SBarry Smith 212766d79e26SBarry 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 212866d79e26SBarry Smith 212966d79e26SBarry 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), 213066d79e26SBarry 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 213166d79e26SBarry Smith version number (x.y.z). 213266d79e26SBarry Smith 213366d79e26SBarry Smith PETSC_RELEASE_DATE is the date the x.y version was released (i.e. the version before any patch releases) 213466d79e26SBarry Smith 213566d79e26SBarry Smith PETSC_VERSION_DATE is the date the x.y.z version was released 213666d79e26SBarry Smith 213766d79e26SBarry Smith PETSC_VERSION_GIT is the last git commit to the repository given in the form vx.y.z-wwwww 213866d79e26SBarry Smith 213966d79e26SBarry Smith PETSC_VERSION_DATE_GIT is the date of the last git commit to the repository 214066d79e26SBarry Smith 214166d79e26SBarry Smith Level: intermediate 214266d79e26SBarry Smith 214366d79e26SBarry Smith PETSC_VERSION_() and PETSC_VERSION_PATCH are deprecated and will eventually be removed. For several releases PETSC_VERSION_PATCH is always 0 214466d79e26SBarry Smith 214566d79e26SBarry Smith M*/ 214666d79e26SBarry Smith 214766d79e26SBarry Smith /*MC 214866d79e26SBarry Smith 21491b266c99SBarry Smith UsingFortran - To use PETSc with Fortran you must use both PETSc include files and modules. At the beginning 21501b266c99SBarry Smith of every function and module definition you need something like 2151d382aafbSBarry Smith 2152d382aafbSBarry Smith $ 2153af0996ceSBarry Smith $#include "petsc/finclude/petscXXX.h" 21540f665fc7SPatrick Sanan $ use petscXXX 21551b266c99SBarry Smith 2156692afcd8SPatrick Sanan You can declare PETSc variables using either of the following. 21571b266c99SBarry Smith 2158d382aafbSBarry Smith $ XXX variablename 21591b266c99SBarry Smith $ type(tXXX) variablename 21601b266c99SBarry Smith 2161692afcd8SPatrick Sanan For example, 21621b266c99SBarry Smith 2163bfc4c25eSBarry Smith $#include "petsc/finclude/petscvec.h" 21641b266c99SBarry Smith $ use petscvec 2165d382aafbSBarry Smith $ 2166692afcd8SPatrick Sanan $ Vec b 2167692afcd8SPatrick Sanan $ type(tVec) x 2168d382aafbSBarry Smith 2169d382aafbSBarry Smith Level: beginner 2170d382aafbSBarry Smith 2171d382aafbSBarry Smith M*/ 2172d382aafbSBarry Smith 2173014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetArchType(char[],size_t); 2174014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetHostName(char[],size_t); 2175014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetUserName(char[],size_t); 2176014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetProgramName(char[],size_t); 2177014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetProgramName(const char[]); 2178014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetDate(char[],size_t); 217927710113SBarry Smith PETSC_EXTERN PetscErrorCode PetscGetVersion(char[], size_t); 21805f309d01SBarry Smith PETSC_EXTERN PetscErrorCode PetscGetVersionNumber(PetscInt*,PetscInt*,PetscInt*,PetscInt*); 2181d382aafbSBarry Smith 2182014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortInt(PetscInt,PetscInt[]); 218322ab5688SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscSortedRemoveDupsInt(PetscInt*,PetscInt[]); 2184014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortRemoveDupsInt(PetscInt*,PetscInt[]); 218560e03357SMatthew G Knepley PETSC_EXTERN PetscErrorCode PetscFindInt(PetscInt, PetscInt, const PetscInt[], PetscInt*); 2186d2aeb606SJed Brown PETSC_EXTERN PetscErrorCode PetscFindMPIInt(PetscMPIInt, PetscInt, const PetscMPIInt[], PetscInt*); 2187014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortIntWithPermutation(PetscInt,const PetscInt[],PetscInt[]); 2188014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortStrWithPermutation(PetscInt,const char*[],PetscInt[]); 2189014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortIntWithArray(PetscInt,PetscInt[],PetscInt[]); 21906c2863d0SBarry Smith PETSC_EXTERN PetscErrorCode PetscSortIntWithArrayPair(PetscInt,PetscInt[],PetscInt[],PetscInt[]); 219117d7d925SStefano Zampini PETSC_EXTERN PetscErrorCode PetscSortMPIInt(PetscInt,PetscMPIInt[]); 219217d7d925SStefano Zampini PETSC_EXTERN PetscErrorCode PetscSortRemoveDupsMPIInt(PetscInt*,PetscMPIInt[]); 2193014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortMPIIntWithArray(PetscMPIInt,PetscMPIInt[],PetscMPIInt[]); 21945569a785SJunchao Zhang PETSC_EXTERN PetscErrorCode PetscSortMPIIntWithIntArray(PetscMPIInt,PetscMPIInt[],PetscInt[]); 2195014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortIntWithScalarArray(PetscInt,PetscInt[],PetscScalar[]); 219617df18f2SToby Isaac PETSC_EXTERN PetscErrorCode PetscSortIntWithDataArray(PetscInt,PetscInt[],void*,size_t,void*); 2197014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortReal(PetscInt,PetscReal[]); 219839f41f7fSStefano Zampini PETSC_EXTERN PetscErrorCode PetscSortRealWithArrayInt(PetscInt,PetscReal[],PetscInt[]); 2199014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortRealWithPermutation(PetscInt,const PetscReal[],PetscInt[]); 2200745b41b2SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscSortRemoveDupsReal(PetscInt*,PetscReal[]); 220139f41f7fSStefano Zampini PETSC_EXTERN PetscErrorCode PetscFindReal(PetscReal,PetscInt,const PetscReal[],PetscReal,PetscInt*); 2202014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortSplit(PetscInt,PetscInt,PetscScalar[],PetscInt[]); 2203014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSortSplitReal(PetscInt,PetscInt,PetscReal[],PetscInt[]); 2204014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscProcessTree(PetscInt,const PetscBool [],const PetscInt[],PetscInt*,PetscInt**,PetscInt**,PetscInt**,PetscInt**); 22056c2863d0SBarry Smith PETSC_EXTERN PetscErrorCode PetscMergeIntArrayPair(PetscInt,const PetscInt[],const PetscInt[],PetscInt,const PetscInt[],const PetscInt[],PetscInt*,PetscInt**,PetscInt**); 22066c2863d0SBarry Smith PETSC_EXTERN PetscErrorCode PetscMergeIntArray(PetscInt,const PetscInt[],PetscInt,const PetscInt[],PetscInt*,PetscInt**); 2207e498c390SJed Brown PETSC_EXTERN PetscErrorCode PetscMergeMPIIntArray(PetscInt,const PetscMPIInt[],PetscInt,const PetscMPIInt[],PetscInt*,PetscMPIInt**); 2208d382aafbSBarry Smith 2209014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetDisplay(void); 2210014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetDisplay(char[],size_t); 2211d382aafbSBarry Smith 221276bdecfbSBarry Smith /*J 2213d382aafbSBarry Smith PetscRandomType - String with the name of a PETSc randomizer 2214d382aafbSBarry Smith 2215d382aafbSBarry Smith Level: beginner 2216d382aafbSBarry Smith 2217e28ce29aSPatrick Sanan Notes: 2218e28ce29aSPatrick Sanan To use SPRNG or RANDOM123 you must have ./configure PETSc 221925ccb61fSToby Isaac with the option --download-sprng or --download-random123 2220d382aafbSBarry Smith 22218f6c3df8SBarry Smith .seealso: PetscRandomSetType(), PetscRandom, PetscRandomCreate() 222276bdecfbSBarry Smith J*/ 222319fd82e9SBarry Smith typedef const char* PetscRandomType; 2224d382aafbSBarry Smith #define PETSCRAND "rand" 2225d382aafbSBarry Smith #define PETSCRAND48 "rand48" 2226d382aafbSBarry Smith #define PETSCSPRNG "sprng" 2227c5e4d11fSDmitry Karpeev #define PETSCRANDER48 "rander48" 222825ccb61fSToby Isaac #define PETSCRANDOM123 "random123" 2229d382aafbSBarry Smith 2230d382aafbSBarry Smith /* Logging support */ 2231014dd563SJed Brown PETSC_EXTERN PetscClassId PETSC_RANDOM_CLASSID; 2232d382aafbSBarry Smith 2233607a6623SBarry Smith PETSC_EXTERN PetscErrorCode PetscRandomInitializePackage(void); 2234d382aafbSBarry Smith 2235d382aafbSBarry Smith /* Dynamic creation and loading functions */ 2236140e18c1SBarry Smith PETSC_EXTERN PetscFunctionList PetscRandomList; 2237d382aafbSBarry Smith 2238bdf89e91SBarry Smith PETSC_EXTERN PetscErrorCode PetscRandomRegister(const char[],PetscErrorCode (*)(PetscRandom)); 223919fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode PetscRandomSetType(PetscRandom, PetscRandomType); 2240014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomSetFromOptions(PetscRandom); 224119fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode PetscRandomGetType(PetscRandom, PetscRandomType*); 2242685405a1SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscRandomViewFromOptions(PetscRandom A,PetscObject obj,const char name[]) {return PetscObjectViewFromOptions((PetscObject)A,obj,name);} 2243014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomView(PetscRandom,PetscViewer); 2244d382aafbSBarry Smith 2245014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate(MPI_Comm,PetscRandom*); 2246014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomGetValue(PetscRandom,PetscScalar*); 2247014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomGetValueReal(PetscRandom,PetscReal*); 2248014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomGetInterval(PetscRandom,PetscScalar*,PetscScalar*); 2249014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomSetInterval(PetscRandom,PetscScalar,PetscScalar); 2250014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomSetSeed(PetscRandom,unsigned long); 2251014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomGetSeed(PetscRandom,unsigned long *); 2252014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomSeed(PetscRandom); 2253014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomDestroy(PetscRandom*); 2254d382aafbSBarry Smith 2255014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetFullPath(const char[],char[],size_t); 2256014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetRelativePath(const char[],char[],size_t); 2257014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetWorkingDirectory(char[],size_t); 2258014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetRealPath(const char[],char[]); 2259014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetHomeDirectory(char[],size_t); 2260014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscTestFile(const char[],char,PetscBool *); 2261014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscTestDirectory(const char[],char,PetscBool *); 226297540f07SSatish Balay PETSC_EXTERN PetscErrorCode PetscMkdir(const char[]); 22638a10d460SHong Zhang PETSC_EXTERN PetscErrorCode PetscMkdtemp(char[]); 226497540f07SSatish Balay PETSC_EXTERN PetscErrorCode PetscRMTree(const char[]); 2265d382aafbSBarry Smith 226630815ce0SLisandro Dalcin PETSC_STATIC_INLINE PetscBool PetscBinaryBigEndian(void) {long _petsc_v = 1; return ((char*)&_petsc_v)[0] ? PETSC_FALSE : PETSC_TRUE;} 226730815ce0SLisandro Dalcin 22689860990eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscBinaryRead(int,void*,PetscInt,PetscInt*,PetscDataType); 22699860990eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscBinarySynchronizedRead(MPI_Comm,int,void*,PetscInt,PetscInt*,PetscDataType); 2270014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscBinaryWrite(int,void*,PetscInt,PetscDataType,PetscBool); 22719860990eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscBinarySynchronizedWrite(MPI_Comm,int,void*,PetscInt,PetscDataType,PetscBool); 2272014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscBinaryOpen(const char[],PetscFileMode,int *); 2273014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscBinaryClose(int); 2274014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSharedTmp(MPI_Comm,PetscBool *); 2275014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSharedWorkingDirectory(MPI_Comm,PetscBool *); 2276014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetTmp(MPI_Comm,char[],size_t); 2277014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFileRetrieve(MPI_Comm,const char[],char[],size_t,PetscBool *); 2278014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLs(MPI_Comm,const char[],char[],size_t,PetscBool *); 2279c891a504SStefano Zampini #if defined(PETSC_USE_SOCKET_VIEWER) 2280e2fc02c1SBarry Smith PETSC_EXTERN PetscErrorCode PetscOpenSocket(const char[],int,int*); 2281c891a504SStefano Zampini #endif 2282d382aafbSBarry Smith 2283014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscBinarySeek(int,off_t,PetscBinarySeekType,off_t*); 2284014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscBinarySynchronizedSeek(MPI_Comm,int,off_t,PetscBinarySeekType,off_t*); 2285014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscByteSwap(void *,PetscDataType,PetscInt); 2286d382aafbSBarry Smith 2287014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetDebugTerminal(const char[]); 2288014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetDebugger(const char[],PetscBool ); 2289014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetDefaultDebugger(void); 2290014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetDebuggerFromString(const char*); 2291014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscAttachDebugger(void); 2292014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStopForDebugger(void); 2293d382aafbSBarry Smith 2294014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGatherNumberOfMessages(MPI_Comm,const PetscMPIInt[],const PetscMPIInt[],PetscMPIInt*); 2295014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGatherMessageLengths(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],PetscMPIInt**,PetscMPIInt**); 2296014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGatherMessageLengths2(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],const PetscMPIInt[],PetscMPIInt**,PetscMPIInt**,PetscMPIInt**); 2297014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPostIrecvInt(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],const PetscMPIInt[],PetscInt***,MPI_Request**); 2298014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPostIrecvScalar(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],const PetscMPIInt[],PetscScalar***,MPI_Request**); 2299cf4b5b4fSJed Brown PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSided(MPI_Comm,PetscMPIInt,MPI_Datatype,PetscMPIInt,const PetscMPIInt*,const void*,PetscMPIInt*,PetscMPIInt**,void*) 2300cf4b5b4fSJed Brown PetscAttrMPIPointerWithType(6,3); 2301d815da10SJed Brown PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedF(MPI_Comm,PetscMPIInt,MPI_Datatype,PetscMPIInt,const PetscMPIInt[],const void*,PetscMPIInt*,PetscMPIInt**,void*,PetscMPIInt, 2302d815da10SJed Brown PetscErrorCode (*send)(MPI_Comm,const PetscMPIInt[],PetscMPIInt,PetscMPIInt,void*,MPI_Request[],void*), 2303d815da10SJed Brown PetscErrorCode (*recv)(MPI_Comm,const PetscMPIInt[],PetscMPIInt,void*,MPI_Request[],void*),void *ctx) 2304d815da10SJed Brown PetscAttrMPIPointerWithType(6,3); 23056afbe7ddSJed Brown PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedFReq(MPI_Comm,PetscMPIInt,MPI_Datatype,PetscMPIInt,const PetscMPIInt[],const void*,PetscMPIInt*,PetscMPIInt**,void*,PetscMPIInt, 23066afbe7ddSJed Brown MPI_Request**,MPI_Request**, 23076afbe7ddSJed Brown PetscErrorCode (*send)(MPI_Comm,const PetscMPIInt[],PetscMPIInt,PetscMPIInt,void*,MPI_Request[],void*), 23086afbe7ddSJed Brown PetscErrorCode (*recv)(MPI_Comm,const PetscMPIInt[],PetscMPIInt,void*,MPI_Request[],void*),void *ctx) 23096afbe7ddSJed Brown PetscAttrMPIPointerWithType(6,3); 2310d382aafbSBarry Smith 23116145cd65SJed Brown PETSC_EXTERN const char *const PetscBuildTwoSidedTypes[]; 23126145cd65SJed Brown PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedSetType(MPI_Comm,PetscBuildTwoSidedType); 23136145cd65SJed Brown PETSC_EXTERN PetscErrorCode PetscCommBuildTwoSidedGetType(MPI_Comm,PetscBuildTwoSidedType*); 23146145cd65SJed Brown 2315014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSSEIsEnabled(MPI_Comm,PetscBool*,PetscBool*); 2316d382aafbSBarry Smith 2317ce94432eSBarry Smith PETSC_EXTERN MPI_Comm PetscObjectComm(PetscObject); 2318ce94432eSBarry Smith 231945487dadSJed Brown PETSC_EXTERN const char *const PetscSubcommTypes[]; 232045487dadSJed Brown 2321d382aafbSBarry Smith struct _n_PetscSubcomm { 2322d382aafbSBarry Smith MPI_Comm parent; /* parent communicator */ 2323d382aafbSBarry Smith MPI_Comm dupparent; /* duplicate parent communicator, under which the processors of this subcomm have contiguous rank */ 2324306c2d5bSBarry Smith MPI_Comm child; /* the sub-communicator */ 232545487dadSJed Brown PetscMPIInt n; /* num of subcommunicators under the parent communicator */ 232645487dadSJed Brown PetscMPIInt color; /* color of processors belong to this communicator */ 2327708d824cSJed Brown PetscMPIInt *subsize; /* size of subcommunicator[color] */ 232845487dadSJed Brown PetscSubcommType type; 2329e5acf8a4SHong Zhang char *subcommprefix; 2330d382aafbSBarry Smith }; 2331d382aafbSBarry Smith 2332c5e4d11fSDmitry Karpeev PETSC_STATIC_INLINE MPI_Comm PetscSubcommParent(PetscSubcomm scomm) {return scomm->parent;} 2333306c2d5bSBarry Smith PETSC_STATIC_INLINE MPI_Comm PetscSubcommChild(PetscSubcomm scomm) {return scomm->child;} 233436be1a5eSBarry Smith PETSC_STATIC_INLINE MPI_Comm PetscSubcommContiguousParent(PetscSubcomm scomm) {return scomm->dupparent;} 2335014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSubcommCreate(MPI_Comm,PetscSubcomm*); 2336014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSubcommDestroy(PetscSubcomm*); 2337014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSubcommSetNumber(PetscSubcomm,PetscInt); 2338014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSubcommSetType(PetscSubcomm,PetscSubcommType); 233965d9b8f1SHong Zhang PETSC_EXTERN PetscErrorCode PetscSubcommSetTypeGeneral(PetscSubcomm,PetscMPIInt,PetscMPIInt); 2340053d1c95SHong Zhang PETSC_EXTERN PetscErrorCode PetscSubcommView(PetscSubcomm,PetscViewer); 2341f68be91cSHong Zhang PETSC_EXTERN PetscErrorCode PetscSubcommSetFromOptions(PetscSubcomm); 2342e5acf8a4SHong Zhang PETSC_EXTERN PetscErrorCode PetscSubcommSetOptionsPrefix(PetscSubcomm,const char[]); 2343d382aafbSBarry Smith 23449962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapCreate(PetscInt,PetscHeap*); 23459962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapAdd(PetscHeap,PetscInt,PetscInt); 23469962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapPop(PetscHeap,PetscInt*,PetscInt*); 23479962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapPeek(PetscHeap,PetscInt*,PetscInt*); 23489962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapStash(PetscHeap,PetscInt,PetscInt); 23499962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapUnstash(PetscHeap); 23509962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapDestroy(PetscHeap*); 23519962606eSBarry Smith PETSC_EXTERN PetscErrorCode PetscHeapView(PetscHeap,PetscViewer); 23529962606eSBarry Smith 23535e71baefSBarry Smith PETSC_EXTERN PetscErrorCode PetscProcessPlacementView(PetscViewer); 23545f7487a0SJunchao Zhang PETSC_EXTERN PetscErrorCode PetscShmCommGet(MPI_Comm,PetscShmComm*); 23555f7487a0SJunchao Zhang PETSC_EXTERN PetscErrorCode PetscShmCommGlobalToLocal(PetscShmComm,PetscMPIInt,PetscMPIInt*); 23565f7487a0SJunchao Zhang PETSC_EXTERN PetscErrorCode PetscShmCommLocalToGlobal(PetscShmComm,PetscMPIInt,PetscMPIInt*); 23575f7487a0SJunchao Zhang PETSC_EXTERN PetscErrorCode PetscShmCommGetMpiShmComm(PetscShmComm,MPI_Comm*); 23585e71baefSBarry Smith 2359a32e93adSJunchao Zhang /* routines to better support OpenMP multithreading needs of some PETSc third party libraries */ 2360a32e93adSJunchao Zhang PETSC_EXTERN PetscErrorCode PetscOmpCtrlCreate(MPI_Comm,PetscInt,PetscOmpCtrl*); 2361a32e93adSJunchao Zhang PETSC_EXTERN PetscErrorCode PetscOmpCtrlGetOmpComms(PetscOmpCtrl,MPI_Comm*,MPI_Comm*,PetscBool*); 2362a32e93adSJunchao Zhang PETSC_EXTERN PetscErrorCode PetscOmpCtrlDestroy(PetscOmpCtrl*); 2363a32e93adSJunchao Zhang PETSC_EXTERN PetscErrorCode PetscOmpCtrlBarrier(PetscOmpCtrl); 2364a32e93adSJunchao Zhang PETSC_EXTERN PetscErrorCode PetscOmpCtrlOmpRegionOnMasterBegin(PetscOmpCtrl); 2365a32e93adSJunchao Zhang PETSC_EXTERN PetscErrorCode PetscOmpCtrlOmpRegionOnMasterEnd(PetscOmpCtrl); 2366a32e93adSJunchao Zhang 236713e3f751SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferCreate(size_t,size_t,PetscSegBuffer*); 23680f453b92SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferDestroy(PetscSegBuffer*); 236913e3f751SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferGet(PetscSegBuffer,size_t,void*); 2370137cf7b6SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferExtractAlloc(PetscSegBuffer,void*); 2371137cf7b6SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferExtractTo(PetscSegBuffer,void*); 2372137cf7b6SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferExtractInPlace(PetscSegBuffer,void*); 237313e3f751SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferGetSize(PetscSegBuffer,size_t*); 237413e3f751SJed Brown PETSC_EXTERN PetscErrorCode PetscSegBufferUnuse(PetscSegBuffer,size_t); 23750f453b92SJed Brown 23765e71baefSBarry Smith 2377471ecdacSJed Brown /* Type-safe wrapper to encourage use of PETSC_RESTRICT. Does not use PetscFunctionBegin because the error handling 2378471ecdacSJed Brown * prevents the compiler from completely erasing the stub. This is called in inner loops so it has to be as fast as 2379471ecdacSJed Brown * possible. */ 238035005c2bSLisandro Dalcin PETSC_STATIC_INLINE PetscErrorCode PetscSegBufferGetInts(PetscSegBuffer seg,PetscInt count,PetscInt *PETSC_RESTRICT *slot) {return PetscSegBufferGet(seg,(size_t)count,(void**)slot);} 2381d382aafbSBarry Smith 23829de0f6ecSBarry Smith extern PetscOptionsHelpPrinted PetscOptionsHelpPrintedSingleton; 23839de0f6ecSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsHelpPrintedDestroy(PetscOptionsHelpPrinted*); 23849de0f6ecSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsHelpPrintedCreate(PetscOptionsHelpPrinted*); 23859de0f6ecSBarry Smith PETSC_EXTERN PetscErrorCode PetscOptionsHelpPrintedCheck(PetscOptionsHelpPrinted,const char*,const char*,PetscBool*); 23869de0f6ecSBarry Smith 2387ace2fbaeSBarry Smith #include <stdarg.h> 2388ace2fbaeSBarry Smith PETSC_EXTERN PetscErrorCode PetscVSNPrintf(char*,size_t,const char[],size_t*,va_list); 2389ace2fbaeSBarry Smith PETSC_EXTERN PetscErrorCode (*PetscVFPrintf)(FILE*,const char[],va_list); 2390ace2fbaeSBarry Smith 2391268b0dfdSSatish Balay PETSC_EXTERN PetscSegBuffer PetscCitationsList; 2392fbfcfee5SBarry Smith 23931f817a21SBarry Smith /*@C 23941f817a21SBarry Smith PetscCitationsRegister - Register a bibtex item to obtain credit for an implemented algorithm used in the code. 23951f817a21SBarry Smith 23961f817a21SBarry Smith Not Collective - only what is registered on rank 0 of PETSC_COMM_WORLD will be printed 23971f817a21SBarry Smith 23981f817a21SBarry Smith Input Parameters: 23991f817a21SBarry Smith + cite - the bibtex item, formated to displayed on multiple lines nicely 24001f817a21SBarry Smith - set - a boolean variable initially set to PETSC_FALSE; this is used to insure only a single registration of the citation 24011f817a21SBarry Smith 2402850545d0SSatish Balay Level: intermediate 2403850545d0SSatish Balay 2404f5f57ec0SBarry Smith Not available from Fortran 2405f5f57ec0SBarry Smith 24061f817a21SBarry Smith Options Database: 2407063414e0SPatrick Sanan . -citations [filename] - print out the bibtex entries for the given computation 24081f817a21SBarry Smith @*/ 2409dff31646SBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscCitationsRegister(const char cit[],PetscBool *set) 2410dff31646SBarry Smith { 2411dff31646SBarry Smith size_t len; 2412dff31646SBarry Smith char *vstring; 2413dff31646SBarry Smith PetscErrorCode ierr; 2414dff31646SBarry Smith 24151f817a21SBarry Smith PetscFunctionBegin; 24168d3683fcSBarry Smith if (set && *set) PetscFunctionReturn(0); 2417dff31646SBarry Smith ierr = PetscStrlen(cit,&len);CHKERRQ(ierr); 241835005c2bSLisandro Dalcin ierr = PetscSegBufferGet(PetscCitationsList,len,&vstring);CHKERRQ(ierr); 2419dff31646SBarry Smith ierr = PetscMemcpy(vstring,cit,len);CHKERRQ(ierr); 2420dff31646SBarry Smith if (set) *set = PETSC_TRUE; 24211f817a21SBarry Smith PetscFunctionReturn(0); 2422dff31646SBarry Smith } 2423dff31646SBarry Smith 2424b967cddfSBarry Smith PETSC_EXTERN PetscErrorCode PetscURLShorten(const char[],char[],size_t); 2425fe278a28SBarry Smith PETSC_EXTERN PetscErrorCode PetscGoogleDriveAuthorize(MPI_Comm,char[],char[],size_t); 2426fe278a28SBarry Smith PETSC_EXTERN PetscErrorCode PetscGoogleDriveRefresh(MPI_Comm,const char[],char[],size_t); 2427f044a08eSBarry Smith PETSC_EXTERN PetscErrorCode PetscGoogleDriveUpload(MPI_Comm,const char[],const char []); 2428fe278a28SBarry Smith 2429f044a08eSBarry Smith PETSC_EXTERN PetscErrorCode PetscBoxAuthorize(MPI_Comm,char[],char[],size_t); 2430f044a08eSBarry Smith PETSC_EXTERN PetscErrorCode PetscBoxRefresh(MPI_Comm,const char[],char[],char[],size_t); 2431b967cddfSBarry Smith 24329f4d3c52SBarry Smith PETSC_EXTERN PetscErrorCode PetscGlobusGetTransfers(MPI_Comm,const char[],char[],size_t); 24339f4d3c52SBarry Smith 243404102261SBarry Smith PETSC_EXTERN PetscErrorCode PetscTextBelt(MPI_Comm,const char[],const char[],PetscBool*); 2435763ec7b1SBarry Smith PETSC_EXTERN PetscErrorCode PetscTellMyCell(MPI_Comm,const char[],const char[],PetscBool*); 2436dff31646SBarry Smith 243768e69593SBarry Smith PETSC_EXTERN PetscErrorCode PetscPullJSONValue(const char[],const char[],char[],size_t,PetscBool*); 24385dc0f0a4SBarry Smith PETSC_EXTERN PetscErrorCode PetscPushJSONValue(char[],const char[],const char[],size_t); 2439d382aafbSBarry Smith 2440b2566f29SBarry Smith 2441b2566f29SBarry Smith #if defined(PETSC_USE_DEBUG) 2442b2566f29SBarry Smith /* 2443b2566f29SBarry Smith Verify that all processes in the communicator have called this from the same line of code 2444b2566f29SBarry Smith */ 24458f5db7efSBarry Smith PETSC_EXTERN PetscErrorCode PetscAllreduceBarrierCheck(MPI_Comm,PetscMPIInt,int,const char*,const char *); 244677a5e07dSBarry Smith 244777a5e07dSBarry Smith /*MC 244877a5e07dSBarry Smith MPIU_Allreduce - a PETSc replacement for MPI_Allreduce() that tries to determine if the call from all the MPI processes occur from the 244977a5e07dSBarry Smith same place in the PETSc code. This helps to detect bugs where different MPI processes follow different code paths 245077a5e07dSBarry Smith resulting in inconsistent and incorrect calls to MPI_Allreduce(). 245177a5e07dSBarry Smith 245277a5e07dSBarry Smith Collective on MPI_Comm 245377a5e07dSBarry Smith 245477a5e07dSBarry Smith Synopsis: 245577a5e07dSBarry Smith #include <petscsys.h> 245677a5e07dSBarry Smith PetscErrorCode MPIU_Allreduce(void *indata,void *outdata,PetscMPIInt count,MPI_Datatype datatype, MPI_Op op, MPI_Comm comm); 245777a5e07dSBarry Smith 245877a5e07dSBarry Smith Input Parameters: 245977a5e07dSBarry Smith + indata - pointer to the input data to be reduced 246077a5e07dSBarry Smith . count - the number of MPI data items in indata and outdata 246177a5e07dSBarry Smith . datatype - the MPI datatype, for example MPI_INT 246277a5e07dSBarry Smith . op - the MPI operation, for example MPI_SUM 246377a5e07dSBarry Smith - comm - the MPI communicator on which the operation occurs 246477a5e07dSBarry Smith 246577a5e07dSBarry Smith Output Parameter: 246677a5e07dSBarry Smith . outdata - the reduced values 246777a5e07dSBarry Smith 2468e28ce29aSPatrick Sanan Notes: 2469e28ce29aSPatrick Sanan In optimized mode this directly calls MPI_Allreduce() 247077a5e07dSBarry Smith 247177a5e07dSBarry Smith Level: developer 247277a5e07dSBarry Smith 247377a5e07dSBarry Smith .seealso: MPI_Allreduce() 247477a5e07dSBarry Smith M*/ 2475fbfcfee5SBarry Smith #define MPIU_Allreduce(a,b,c,d,e,fcomm) (PetscAllreduceBarrierCheck(fcomm,c,__LINE__,PETSC_FUNCTION_NAME,__FILE__) || MPI_Allreduce(a,b,c,d,e,fcomm)) 2476b2566f29SBarry Smith #else 2477b2566f29SBarry Smith #define MPIU_Allreduce(a,b,c,d,e,fcomm) MPI_Allreduce(a,b,c,d,e,fcomm) 2478b2566f29SBarry Smith #endif 2479b2566f29SBarry Smith 24806f7079ddSSatish Balay #if defined(PETSC_HAVE_MPI_WIN_CREATE_FEATURE) 24818198064fSBarry Smith PETSC_EXTERN PetscErrorCode MPIU_Win_allocate_shared(MPI_Aint,PetscMPIInt,MPI_Info,MPI_Comm,void*,MPI_Win*); 24828198064fSBarry Smith PETSC_EXTERN PetscErrorCode MPIU_Win_shared_query(MPI_Win,PetscMPIInt,MPI_Aint*,PetscMPIInt*,void*); 24832f065d89SBarry Smith #endif 24848198064fSBarry Smith 248512801b39SBarry Smith /* 248612801b39SBarry Smith Returned from PETSc functions that are called from MPI, such as related to attributes 248712801b39SBarry Smith */ 24888ba48ad5SSatish Balay PETSC_EXTERN PetscMPIInt PETSC_MPI_ERROR_CLASS; 24898ba48ad5SSatish Balay PETSC_EXTERN PetscMPIInt PETSC_MPI_ERROR_CODE; 249012801b39SBarry Smith 2491d382aafbSBarry Smith #endif 2492