147d993e7Ssuyashtn /* Portions of this code are under: 247d993e7Ssuyashtn Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. 347d993e7Ssuyashtn */ 447d993e7Ssuyashtn 5a4963045SJacob Faibussowitsch #pragma once 6df4397b0SStefano Zampini 7df4397b0SStefano Zampini #include <petscconf.h> 8e1bf4ed2SJacob Faibussowitsch #include <petscconf_poison.h> 9df4397b0SStefano Zampini #include <petscfix.h> 103ba16761SJacob Faibussowitsch #include <petscmacros.h> // PETSC_NODISCARD, PETSC_CPP_VERSION 113edda6a2SJed Brown #include <stddef.h> 12df4397b0SStefano Zampini 13ac09b921SBarry Smith /* SUBMANSEC = Sys */ 14ac09b921SBarry Smith 15778ae69aSToby Isaac #include <limits.h> // INT_MIN, INT_MAX, CHAR_BIT 163ba16761SJacob Faibussowitsch 173ba16761SJacob Faibussowitsch #if defined(__clang__) || (PETSC_CPP_VERSION >= 17) 183ba16761SJacob Faibussowitsch // clang allows both [[nodiscard]] and __attribute__((warn_unused_result)) on type 193ba16761SJacob Faibussowitsch // definitions. GCC, however, does not, so check that we are using C++17 [[nodiscard]] 203ba16761SJacob Faibussowitsch // instead of __attribute__((warn_unused_result)) 213ba16761SJacob Faibussowitsch #define PETSC_ERROR_CODE_NODISCARD PETSC_NODISCARD 223ba16761SJacob Faibussowitsch #else 233ba16761SJacob Faibussowitsch #define PETSC_ERROR_CODE_NODISCARD 243ba16761SJacob Faibussowitsch #endif 253ba16761SJacob Faibussowitsch 268a7d4faaSJacob Faibussowitsch #ifdef PETSC_CLANG_STATIC_ANALYZER 278a7d4faaSJacob Faibussowitsch #undef PETSC_USE_STRICT_PETSCERRORCODE 288a7d4faaSJacob Faibussowitsch #endif 298a7d4faaSJacob Faibussowitsch 303ba16761SJacob Faibussowitsch #ifdef PETSC_USE_STRICT_PETSCERRORCODE 313ba16761SJacob Faibussowitsch #define PETSC_ERROR_CODE_TYPEDEF typedef 323ba16761SJacob Faibussowitsch #define PETSC_ERROR_CODE_ENUM_NAME PetscErrorCode 333ba16761SJacob Faibussowitsch #else 343ba16761SJacob Faibussowitsch #define PETSC_ERROR_CODE_TYPEDEF 353ba16761SJacob Faibussowitsch #define PETSC_ERROR_CODE_ENUM_NAME 363ba16761SJacob Faibussowitsch #endif 373ba16761SJacob Faibussowitsch 383ba16761SJacob Faibussowitsch /*E 393ba16761SJacob Faibussowitsch PetscErrorCode - Datatype used to return PETSc error codes. 40df4397b0SStefano Zampini 41df4397b0SStefano Zampini Level: beginner 42df4397b0SStefano Zampini 433ba16761SJacob Faibussowitsch Notes: 443ba16761SJacob Faibussowitsch Virtually all PETSc functions return an error code. It is the callers responsibility to check 453ba16761SJacob Faibussowitsch the value of the returned error code after each PETSc call to determine if any errors 463ba16761SJacob Faibussowitsch occurred. A set of convenience macros (e.g. `PetscCall()`, `PetscCallVoid()`) are provided 473ba16761SJacob Faibussowitsch for this purpose. Failing to properly check for errors is not supported, as errors may leave 483ba16761SJacob Faibussowitsch PETSc in an undetermined state. 493ba16761SJacob Faibussowitsch 503ba16761SJacob Faibussowitsch One can retrieve the error string corresponding to a particular error code using 513ba16761SJacob Faibussowitsch `PetscErrorMessage()`. 523ba16761SJacob Faibussowitsch 533ba16761SJacob Faibussowitsch The user can also configure PETSc with the `--with-strict-petscerrorcode` option to enable 543ba16761SJacob Faibussowitsch compiler warnings when the returned error codes are not captured and checked. Users are 553ba16761SJacob Faibussowitsch *heavily* encouraged to opt-in to this option, as it will become enabled by default in a 563ba16761SJacob Faibussowitsch future release. 573ba16761SJacob Faibussowitsch 583ba16761SJacob Faibussowitsch Developer Notes: 593ba16761SJacob Faibussowitsch These are the generic error codes. These error codes are used in many different places in the 603ba16761SJacob Faibussowitsch PETSc source code. The C-string versions are at defined in `PetscErrorStrings[]` in 6116a05f60SBarry Smith `src/sys/error/err.c`, while the Fortran versions are defined in 623ba16761SJacob Faibussowitsch `src/sys/f90-mod/petscerror.h`. Any changes here must also be made in both locations. 633ba16761SJacob Faibussowitsch 643ba16761SJacob Faibussowitsch .seealso: `PetscErrorMessage()`, `PetscCall()`, `SETERRQ()` 653ba16761SJacob Faibussowitsch E*/ 663ba16761SJacob Faibussowitsch PETSC_ERROR_CODE_TYPEDEF enum PETSC_ERROR_CODE_NODISCARD { 673ba16761SJacob Faibussowitsch PETSC_SUCCESS = 0, 683ba16761SJacob Faibussowitsch PETSC_ERR_BOOLEAN_MACRO_FAILURE = 1, /* do not use */ 693ba16761SJacob Faibussowitsch 70467446fbSPierre Jolivet PETSC_ERR_MIN_VALUE = 54, /* should always be one less than the smallest value */ 713ba16761SJacob Faibussowitsch 723ba16761SJacob Faibussowitsch PETSC_ERR_MEM = 55, /* unable to allocate requested memory */ 733ba16761SJacob Faibussowitsch PETSC_ERR_SUP = 56, /* no support for requested operation */ 743ba16761SJacob Faibussowitsch PETSC_ERR_SUP_SYS = 57, /* no support for requested operation on this computer system */ 753ba16761SJacob Faibussowitsch PETSC_ERR_ORDER = 58, /* operation done in wrong order */ 763ba16761SJacob Faibussowitsch PETSC_ERR_SIG = 59, /* signal received */ 773ba16761SJacob Faibussowitsch PETSC_ERR_FP = 72, /* floating point exception */ 783ba16761SJacob Faibussowitsch PETSC_ERR_COR = 74, /* corrupted PETSc object */ 793ba16761SJacob Faibussowitsch PETSC_ERR_LIB = 76, /* error in library called by PETSc */ 803ba16761SJacob Faibussowitsch PETSC_ERR_PLIB = 77, /* PETSc library generated inconsistent data */ 813ba16761SJacob Faibussowitsch PETSC_ERR_MEMC = 78, /* memory corruption */ 823ba16761SJacob Faibussowitsch PETSC_ERR_CONV_FAILED = 82, /* iterative method (KSP or SNES) failed */ 833ba16761SJacob Faibussowitsch PETSC_ERR_USER = 83, /* user has not provided needed function */ 843ba16761SJacob Faibussowitsch PETSC_ERR_SYS = 88, /* error in system call */ 853ba16761SJacob Faibussowitsch PETSC_ERR_POINTER = 70, /* pointer does not point to valid address */ 863ba16761SJacob Faibussowitsch PETSC_ERR_MPI_LIB_INCOMP = 87, /* MPI library at runtime is not compatible with MPI user compiled with */ 873ba16761SJacob Faibussowitsch 883ba16761SJacob Faibussowitsch PETSC_ERR_ARG_SIZ = 60, /* nonconforming object sizes used in operation */ 893ba16761SJacob Faibussowitsch PETSC_ERR_ARG_IDN = 61, /* two arguments not allowed to be the same */ 903ba16761SJacob Faibussowitsch PETSC_ERR_ARG_WRONG = 62, /* wrong argument (but object probably ok) */ 913ba16761SJacob Faibussowitsch PETSC_ERR_ARG_CORRUPT = 64, /* null or corrupted PETSc object as argument */ 923ba16761SJacob Faibussowitsch PETSC_ERR_ARG_OUTOFRANGE = 63, /* input argument, out of range */ 933ba16761SJacob Faibussowitsch PETSC_ERR_ARG_BADPTR = 68, /* invalid pointer argument */ 943ba16761SJacob Faibussowitsch PETSC_ERR_ARG_NOTSAMETYPE = 69, /* two args must be same object type */ 953ba16761SJacob Faibussowitsch PETSC_ERR_ARG_NOTSAMECOMM = 80, /* two args must be same communicators */ 963ba16761SJacob Faibussowitsch PETSC_ERR_ARG_WRONGSTATE = 73, /* object in argument is in wrong state, e.g. unassembled mat */ 973ba16761SJacob Faibussowitsch PETSC_ERR_ARG_TYPENOTSET = 89, /* the type of the object has not yet been set */ 983ba16761SJacob Faibussowitsch PETSC_ERR_ARG_INCOMP = 75, /* two arguments are incompatible */ 993ba16761SJacob Faibussowitsch PETSC_ERR_ARG_NULL = 85, /* argument is null that should not be */ 1003ba16761SJacob Faibussowitsch PETSC_ERR_ARG_UNKNOWN_TYPE = 86, /* type name doesn't match any registered type */ 1013ba16761SJacob Faibussowitsch 1023ba16761SJacob Faibussowitsch PETSC_ERR_FILE_OPEN = 65, /* unable to open file */ 1033ba16761SJacob Faibussowitsch PETSC_ERR_FILE_READ = 66, /* unable to read from file */ 1043ba16761SJacob Faibussowitsch PETSC_ERR_FILE_WRITE = 67, /* unable to write to file */ 1053ba16761SJacob Faibussowitsch PETSC_ERR_FILE_UNEXPECTED = 79, /* unexpected data in file */ 1063ba16761SJacob Faibussowitsch 1073ba16761SJacob Faibussowitsch PETSC_ERR_MAT_LU_ZRPVT = 71, /* detected a zero pivot during LU factorization */ 1083ba16761SJacob Faibussowitsch PETSC_ERR_MAT_CH_ZRPVT = 81, /* detected a zero pivot during Cholesky factorization */ 1093ba16761SJacob Faibussowitsch 1103ba16761SJacob Faibussowitsch PETSC_ERR_INT_OVERFLOW = 84, 1113ba16761SJacob Faibussowitsch PETSC_ERR_FLOP_COUNT = 90, 1123ba16761SJacob Faibussowitsch PETSC_ERR_NOT_CONVERGED = 91, /* solver did not converge */ 1133ba16761SJacob Faibussowitsch PETSC_ERR_MISSING_FACTOR = 92, /* MatGetFactor() failed */ 1143ba16761SJacob Faibussowitsch PETSC_ERR_OPT_OVERWRITE = 93, /* attempted to over write options which should not be changed */ 1153ba16761SJacob Faibussowitsch PETSC_ERR_WRONG_MPI_SIZE = 94, /* example/application run with number of MPI ranks it does not support */ 1163ba16761SJacob Faibussowitsch PETSC_ERR_USER_INPUT = 95, /* missing or incorrect user input */ 1173ba16761SJacob Faibussowitsch PETSC_ERR_GPU_RESOURCE = 96, /* unable to load a GPU resource, for example cuBLAS */ 1183ba16761SJacob Faibussowitsch PETSC_ERR_GPU = 97, /* An error from a GPU call, this may be due to lack of resources on the GPU or a true error in the call */ 1193ba16761SJacob Faibussowitsch PETSC_ERR_MPI = 98, /* general MPI error */ 1203ba16761SJacob Faibussowitsch PETSC_ERR_RETURN = 99, /* PetscError() incorrectly returned an error code of 0 */ 1219beb8f72SToby Isaac PETSC_ERR_MEM_LEAK = 100, /* memory alloc/free imbalance */ 1229beb8f72SToby Isaac PETSC_ERR_MAX_VALUE = 101, /* this is always the one more than the largest error code */ 1233ba16761SJacob Faibussowitsch 1243ba16761SJacob Faibussowitsch /* 1253ba16761SJacob Faibussowitsch do not use, exist purely to make the enum bounds equal that of a regular int (so conversion 1263ba16761SJacob Faibussowitsch to int in main() is not undefined behavior) 1273ba16761SJacob Faibussowitsch */ 1283ba16761SJacob Faibussowitsch PETSC_ERR_MIN_SIGNED_BOUND_DO_NOT_USE = INT_MIN, 1293ba16761SJacob Faibussowitsch PETSC_ERR_MAX_SIGNED_BOUND_DO_NOT_USE = INT_MAX 1303ba16761SJacob Faibussowitsch } PETSC_ERROR_CODE_ENUM_NAME; 1313ba16761SJacob Faibussowitsch 1323ba16761SJacob Faibussowitsch #ifndef PETSC_USE_STRICT_PETSCERRORCODE 133df4397b0SStefano Zampini typedef int PetscErrorCode; 134df4397b0SStefano Zampini 1353ba16761SJacob Faibussowitsch /* 1363ba16761SJacob Faibussowitsch Needed so that C++ lambdas can deduce the return type as PetscErrorCode from 1373ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS). Otherwise we get 1383ba16761SJacob Faibussowitsch 1393ba16761SJacob Faibussowitsch error: return type '(unnamed enum at include/petscsystypes.h:50:1)' must match previous 1403ba16761SJacob Faibussowitsch return type 'int' when lambda expression has unspecified explicit return type 1413ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1423ba16761SJacob Faibussowitsch ^ 1433ba16761SJacob Faibussowitsch */ 1443ba16761SJacob Faibussowitsch #define PETSC_SUCCESS ((PetscErrorCode)0) 1453ba16761SJacob Faibussowitsch #endif 1463ba16761SJacob Faibussowitsch 1473ba16761SJacob Faibussowitsch #undef PETSC_ERROR_CODE_NODISCARD 1483ba16761SJacob Faibussowitsch #undef PETSC_ERROR_CODE_TYPEDEF 1493ba16761SJacob Faibussowitsch #undef PETSC_ERROR_CODE_ENUM_NAME 1503ba16761SJacob Faibussowitsch 151df4397b0SStefano Zampini /*MC 152df4397b0SStefano Zampini PetscClassId - A unique id used to identify each PETSc class. 153df4397b0SStefano Zampini 15416a05f60SBarry Smith Level: developer 15516a05f60SBarry Smith 15616a05f60SBarry Smith Note: 15787497f52SBarry Smith Use `PetscClassIdRegister()` to obtain a new value for a new class being created. Usually 158df4397b0SStefano Zampini XXXInitializePackage() calls it for each class it defines. 159df4397b0SStefano Zampini 16016a05f60SBarry Smith Developer Note: 161667f096bSBarry Smith Internal integer stored in the `_p_PetscObject` data structure. These are all computed by an offset from the lowest one, `PETSC_SMALLEST_CLASSID`. 162df4397b0SStefano Zampini 163db781477SPatrick Sanan .seealso: `PetscClassIdRegister()`, `PetscLogEventRegister()`, `PetscHeaderCreate()` 164df4397b0SStefano Zampini M*/ 165df4397b0SStefano Zampini typedef int PetscClassId; 166df4397b0SStefano Zampini 167df4397b0SStefano Zampini /*MC 168df4397b0SStefano Zampini PetscMPIInt - datatype used to represent 'int' parameters to MPI functions. 169df4397b0SStefano Zampini 170df4397b0SStefano Zampini Level: intermediate 171df4397b0SStefano Zampini 172df4397b0SStefano Zampini Notes: 1737de69702SBarry Smith This is always a 32-bit integer, sometimes it is the same as `PetscInt`, but if PETSc was built with `--with-64-bit-indices` but 1747de69702SBarry Smith standard C/Fortran integers are 32-bit then this is NOT the same as `PetscInt`; it remains 32-bit. 175df4397b0SStefano Zampini 17687497f52SBarry Smith `PetscMPIIntCast`(a,&b) checks if the given `PetscInt` a will fit in a `PetscMPIInt`, if not it 17787497f52SBarry Smith generates a `PETSC_ERR_ARG_OUTOFRANGE` error. 178df4397b0SStefano Zampini 179db781477SPatrick Sanan .seealso: `PetscBLASInt`, `PetscInt`, `PetscMPIIntCast()` 180df4397b0SStefano Zampini M*/ 181df4397b0SStefano Zampini typedef int PetscMPIInt; 182df4397b0SStefano Zampini 183bf491261SJacob Faibussowitsch /* Limit MPI to 32-bits */ 184bf491261SJacob Faibussowitsch enum { 185bf491261SJacob Faibussowitsch PETSC_MPI_INT_MIN = INT_MIN, 186bf491261SJacob Faibussowitsch PETSC_MPI_INT_MAX = INT_MAX 187bf491261SJacob Faibussowitsch }; 188bf491261SJacob Faibussowitsch 189df4397b0SStefano Zampini /*MC 19016a05f60SBarry Smith PetscSizeT - datatype used to represent sizes in memory (like `size_t`) 1913edda6a2SJed Brown 1923edda6a2SJed Brown Level: intermediate 1933edda6a2SJed Brown 1943edda6a2SJed Brown Notes: 19516a05f60SBarry Smith This is equivalent to `size_t`, but defined for consistency with Fortran, which lacks a native equivalent of `size_t`. 1963edda6a2SJed Brown 197db781477SPatrick Sanan .seealso: `PetscInt`, `PetscInt64`, `PetscCount` 1983edda6a2SJed Brown M*/ 1993edda6a2SJed Brown typedef size_t PetscSizeT; 2003edda6a2SJed Brown 2013edda6a2SJed Brown /*MC 20282a78a4eSJed Brown PetscCount - signed datatype used to represent counts 20382a78a4eSJed Brown 20482a78a4eSJed Brown Level: intermediate 20582a78a4eSJed Brown 20682a78a4eSJed Brown Notes: 20716a05f60SBarry Smith This is equivalent to `ptrdiff_t`, but defined for consistency with Fortran, which lacks a native equivalent of `ptrdiff_t`. 20882a78a4eSJed Brown 20987497f52SBarry Smith Use `PetscCount_FMT` to format with `PetscPrintf()`, `printf()`, and related functions. 21082a78a4eSJed Brown 211db781477SPatrick Sanan .seealso: `PetscInt`, `PetscInt64`, `PetscSizeT` 21282a78a4eSJed Brown M*/ 21382a78a4eSJed Brown typedef ptrdiff_t PetscCount; 21463a3b9bcSJacob Faibussowitsch #define PetscCount_FMT "td" 21582a78a4eSJed Brown 21682a78a4eSJed Brown /*MC 217df4397b0SStefano Zampini PetscEnum - datatype used to pass enum types within PETSc functions. 218df4397b0SStefano Zampini 219df4397b0SStefano Zampini Level: intermediate 220df4397b0SStefano Zampini 221db781477SPatrick Sanan .seealso: `PetscOptionsGetEnum()`, `PetscOptionsEnum()`, `PetscBagRegisterEnum()` 222df4397b0SStefano Zampini M*/ 2239371c9d4SSatish Balay typedef enum { 2249371c9d4SSatish Balay ENUM_DUMMY 2259371c9d4SSatish Balay } PetscEnum; 226df4397b0SStefano Zampini 227df4397b0SStefano Zampini typedef short PetscShort; 228df4397b0SStefano Zampini typedef char PetscChar; 229df4397b0SStefano Zampini typedef float PetscFloat; 230df4397b0SStefano Zampini 231df4397b0SStefano Zampini /*MC 232df4397b0SStefano Zampini PetscInt - PETSc type that represents an integer, used primarily to 23316a05f60SBarry Smith represent size of arrays and indexing into arrays. Its size can be configured with the option `--with-64-bit-indices` to be either 32-bit (default) or 64-bit. 234df4397b0SStefano Zampini 235667f096bSBarry Smith Level: beginner 236667f096bSBarry Smith 237df4397b0SStefano Zampini Notes: 23816a05f60SBarry Smith For MPI calls that require datatypes, use `MPIU_INT` as the datatype for `PetscInt`. It will automatically work correctly regardless of the size of `PetscInt`. 239df4397b0SStefano Zampini 24016a05f60SBarry Smith .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscReal`, `PetscScalar`, `PetscComplex`, `PetscInt`, `MPIU_REAL`, `MPIU_SCALAR`, `MPIU_COMPLEX`, `MPIU_INT`, `PetscIntCast()` 241df4397b0SStefano Zampini M*/ 242df4397b0SStefano Zampini 243df4397b0SStefano Zampini #if defined(PETSC_HAVE_STDINT_H) 244df4397b0SStefano Zampini #include <stdint.h> 245df4397b0SStefano Zampini #endif 246df4397b0SStefano Zampini #if defined(PETSC_HAVE_INTTYPES_H) 247df4397b0SStefano Zampini #if !defined(__STDC_FORMAT_MACROS) 248df4397b0SStefano Zampini #define __STDC_FORMAT_MACROS /* required for using PRId64 from c++ */ 249df4397b0SStefano Zampini #endif 250df4397b0SStefano Zampini #include <inttypes.h> 251df4397b0SStefano Zampini #if !defined(PRId64) 252df4397b0SStefano Zampini #define PRId64 "ld" 253df4397b0SStefano Zampini #endif 254df4397b0SStefano Zampini #endif 255df4397b0SStefano Zampini 256df4397b0SStefano Zampini #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 */ 257df4397b0SStefano Zampini typedef int64_t PetscInt64; 258bf491261SJacob Faibussowitsch 259bf491261SJacob Faibussowitsch #define PETSC_INT64_MIN INT64_MIN 260bf491261SJacob Faibussowitsch #define PETSC_INT64_MAX INT64_MAX 261bf491261SJacob Faibussowitsch 262df4397b0SStefano Zampini #elif (PETSC_SIZEOF_LONG_LONG == 8) 263df4397b0SStefano Zampini typedef long long PetscInt64; 264bf491261SJacob Faibussowitsch 265bf491261SJacob Faibussowitsch #define PETSC_INT64_MIN LLONG_MIN 266bf491261SJacob Faibussowitsch #define PETSC_INT64_MAX LLONG_MAX 267bf491261SJacob Faibussowitsch 268df4397b0SStefano Zampini #elif defined(PETSC_HAVE___INT64) 269df4397b0SStefano Zampini typedef __int64 PetscInt64; 270bf491261SJacob Faibussowitsch 271bf491261SJacob Faibussowitsch #define PETSC_INT64_MIN INT64_MIN 272bf491261SJacob Faibussowitsch #define PETSC_INT64_MAX INT64_MAX 273bf491261SJacob Faibussowitsch 274df4397b0SStefano Zampini #else 275df4397b0SStefano Zampini #error "cannot determine PetscInt64 type" 276df4397b0SStefano Zampini #endif 277df4397b0SStefano Zampini 2783321ca25SJames Wright typedef int32_t PetscInt32; 2793321ca25SJames Wright #define PETSC_INT32_MIN INT32_MIN 2803321ca25SJames Wright #define PETSC_INT32_MAX INT32_MAX 2813321ca25SJames Wright 282df4397b0SStefano Zampini #if defined(PETSC_USE_64BIT_INDICES) 283df4397b0SStefano Zampini typedef PetscInt64 PetscInt; 284bf491261SJacob Faibussowitsch 285bf491261SJacob Faibussowitsch #define PETSC_INT_MIN PETSC_INT64_MIN 286bf491261SJacob Faibussowitsch #define PETSC_INT_MAX PETSC_INT64_MAX 287bf491261SJacob Faibussowitsch #define PetscInt_FMT PetscInt64_FMT 288df4397b0SStefano Zampini #else 289df4397b0SStefano Zampini typedef int PetscInt; 290bf491261SJacob Faibussowitsch 291bf491261SJacob Faibussowitsch enum { 292bf491261SJacob Faibussowitsch PETSC_INT_MIN = INT_MIN, 293bf491261SJacob Faibussowitsch PETSC_INT_MAX = INT_MAX 294bf491261SJacob Faibussowitsch }; 295bf491261SJacob Faibussowitsch 296bf491261SJacob Faibussowitsch #define PetscInt_FMT "d" 297df4397b0SStefano Zampini #endif 298df4397b0SStefano Zampini 299bf491261SJacob Faibussowitsch #define PETSC_MIN_INT PETSC_INT_MIN 300bf491261SJacob Faibussowitsch #define PETSC_MAX_INT PETSC_INT_MAX 301bf491261SJacob Faibussowitsch #define PETSC_MAX_UINT16 65535 302bf491261SJacob Faibussowitsch 303c93fae50SJacob Faibussowitsch #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 */ 304c93fae50SJacob Faibussowitsch #define MPIU_INT64 MPI_INT64_T 305c93fae50SJacob Faibussowitsch #define PetscInt64_FMT PRId64 306c93fae50SJacob Faibussowitsch #elif (PETSC_SIZEOF_LONG_LONG == 8) 307c93fae50SJacob Faibussowitsch #define MPIU_INT64 MPI_LONG_LONG_INT 308c93fae50SJacob Faibussowitsch #define PetscInt64_FMT "lld" 309c93fae50SJacob Faibussowitsch #elif defined(PETSC_HAVE___INT64) 310c93fae50SJacob Faibussowitsch #define MPIU_INT64 MPI_INT64_T 311c93fae50SJacob Faibussowitsch #define PetscInt64_FMT "ld" 312c93fae50SJacob Faibussowitsch #else 313c93fae50SJacob Faibussowitsch #error "cannot determine PetscInt64 type" 314c93fae50SJacob Faibussowitsch #endif 315c93fae50SJacob Faibussowitsch 3163321ca25SJames Wright #define MPIU_INT32 MPI_INT32_T 3173321ca25SJames Wright #define PetscInt32_FMT PRId32 3183321ca25SJames Wright 319df4397b0SStefano Zampini /*MC 320df4397b0SStefano Zampini PetscBLASInt - datatype used to represent 'int' parameters to BLAS/LAPACK functions. 321df4397b0SStefano Zampini 322667f096bSBarry Smith Level: intermediate 323667f096bSBarry Smith 324df4397b0SStefano Zampini Notes: 32516a05f60SBarry Smith Usually this is the same as `PetscInt`, but if PETSc was built with `--with-64-bit-indices` but 3267de69702SBarry Smith standard C/Fortran integers are 32-bit then this may not be the same as `PetscInt`, 3277de69702SBarry Smith except on some BLAS/LAPACK implementations that support 64-bit integers see the notes below. 328df4397b0SStefano Zampini 32987497f52SBarry Smith `PetscErrorCode` `PetscBLASIntCast`(a,&b) checks if the given `PetscInt` a will fit in a `PetscBLASInt`, if not it 33087497f52SBarry Smith generates a `PETSC_ERR_ARG_OUTOFRANGE` error 331df4397b0SStefano Zampini 332*af27ebaaSBarry Smith Installation Notes\: 33316a05f60SBarry Smith ./configure automatically determines the size of the integers used by BLAS/LAPACK except when `--with-batch` is used 3347de69702SBarry Smith in that situation one must know (by some other means) if the integers used by BLAS/LAPACK are 64-bit and if so pass the flag `--known-64-bit-blas-indices` 335cdc6ee08SBarry Smith 3367de69702SBarry Smith MATLAB ships with BLAS and LAPACK that use 64-bit integers, for example if you run ./configure with, the option 33716a05f60SBarry Smith `--with-blaslapack-lib`=[/Applications/MATLAB_R2010b.app/bin/maci64/libmwblas.dylib,/Applications/MATLAB_R2010b.app/bin/maci64/libmwlapack.dylib] 338df4397b0SStefano Zampini 3397de69702SBarry Smith MKL ships with both 32 and 64-bit integer versions of the BLAS and LAPACK. If you pass the flag `-with-64-bit-blas-indices` PETSc will link 3407de69702SBarry Smith against the 64-bit version, otherwise it uses the 32-bit version 341df4397b0SStefano Zampini 3427de69702SBarry Smith OpenBLAS can be built to use 64-bit integers. The ./configure options `--download-openblas` `-with-64-bit-blas-indices` will build a 64-bit integer version 343df4397b0SStefano Zampini 3447de69702SBarry Smith External packages such as hypre, ML, SuperLU etc do not provide any support for passing 64-bit integers to BLAS/LAPACK so cannot 3457de69702SBarry Smith be used with PETSc when PETSc links against 64-bit integer BLAS/LAPACK. ./configure will generate an error if you attempt to link PETSc against any of 3467de69702SBarry Smith these external libraries while using 64-bit integer BLAS/LAPACK. 347df4397b0SStefano Zampini 348db781477SPatrick Sanan .seealso: `PetscMPIInt`, `PetscInt`, `PetscBLASIntCast()` 349df4397b0SStefano Zampini M*/ 350df4397b0SStefano Zampini #if defined(PETSC_HAVE_64BIT_BLAS_INDICES) 351df4397b0SStefano Zampini typedef PetscInt64 PetscBLASInt; 352bf491261SJacob Faibussowitsch 353bf491261SJacob Faibussowitsch #define PETSC_BLAS_INT_MIN PETSC_INT64_MIN 354bf491261SJacob Faibussowitsch #define PETSC_BLAS_INT_MAX PETSC_INT64_MAX 355bf491261SJacob Faibussowitsch #define PetscBLASInt_FMT PetscInt64_FMT 356df4397b0SStefano Zampini #else 357df4397b0SStefano Zampini typedef int PetscBLASInt; 358bf491261SJacob Faibussowitsch 359bf491261SJacob Faibussowitsch enum { 360bf491261SJacob Faibussowitsch PETSC_BLAS_INT_MIN = INT_MIN, 361bf491261SJacob Faibussowitsch PETSC_BLAS_INT_MAX = INT_MAX 362bf491261SJacob Faibussowitsch }; 363bf491261SJacob Faibussowitsch 364bf491261SJacob Faibussowitsch #define PetscBLASInt_FMT "d" 365df4397b0SStefano Zampini #endif 366df4397b0SStefano Zampini 367eee0c0a6SToby Isaac /*MC 368eee0c0a6SToby Isaac PetscCuBLASInt - datatype used to represent 'int' parameters to cuBLAS/cuSOLVER functions. 369eee0c0a6SToby Isaac 370667f096bSBarry Smith Level: intermediate 371667f096bSBarry Smith 372eee0c0a6SToby Isaac Notes: 373667f096bSBarry Smith As of this writing `PetscCuBLASInt` is always the system `int`. 374eee0c0a6SToby Isaac 37587497f52SBarry Smith `PetscErrorCode` `PetscCuBLASIntCast`(a,&b) checks if the given `PetscInt` a will fit in a `PetscCuBLASInt`, if not it 37687497f52SBarry Smith generates a `PETSC_ERR_ARG_OUTOFRANGE` error 377eee0c0a6SToby Isaac 378db781477SPatrick Sanan .seealso: `PetscBLASInt`, `PetscMPIInt`, `PetscInt`, `PetscCuBLASIntCast()` 379eee0c0a6SToby Isaac M*/ 380eee0c0a6SToby Isaac typedef int PetscCuBLASInt; 381eee0c0a6SToby Isaac 382bf491261SJacob Faibussowitsch enum { 383bf491261SJacob Faibussowitsch PETSC_CUBLAS_INT_MIN = INT_MIN, 384bf491261SJacob Faibussowitsch PETSC_CUBLAS_INT_MAX = INT_MAX 385bf491261SJacob Faibussowitsch }; 386bf491261SJacob Faibussowitsch 38747d993e7Ssuyashtn /*MC 38847d993e7Ssuyashtn PetscHipBLASInt - datatype used to represent 'int' parameters to hipBLAS/hipSOLVER functions. 38947d993e7Ssuyashtn 39047d993e7Ssuyashtn Level: intermediate 39147d993e7Ssuyashtn 392667f096bSBarry Smith Notes: 39395bd0b28SBarry Smith `PetscHipBLASInt` is always the system `int`. 39447d993e7Ssuyashtn 395667f096bSBarry Smith `PetscErrorCode` `PetscHipBLASIntCast`(a,&b) checks if the given `PetscInt` a will fit in a `PetscHipBLASInt`, if not it 396667f096bSBarry Smith generates a `PETSC_ERR_ARG_OUTOFRANGE` error 397667f096bSBarry Smith 398667f096bSBarry Smith .seealso: PetscBLASInt, PetscMPIInt, PetscInt, PetscHipBLASIntCast() 39947d993e7Ssuyashtn M*/ 40047d993e7Ssuyashtn typedef int PetscHipBLASInt; 40147d993e7Ssuyashtn 402bf491261SJacob Faibussowitsch enum { 403bf491261SJacob Faibussowitsch PETSC_HIPBLAS_INT_MIN = INT_MIN, 404bf491261SJacob Faibussowitsch PETSC_HIPBLAS_INT_MAX = INT_MAX 405bf491261SJacob Faibussowitsch }; 406bf491261SJacob Faibussowitsch 407df4397b0SStefano Zampini /*E 408b94d7dedSBarry Smith PetscBool - Logical variable. Actually an enum in C and a logical in Fortran. 409df4397b0SStefano Zampini 410df4397b0SStefano Zampini Level: beginner 411df4397b0SStefano Zampini 412df4397b0SStefano Zampini Developer Note: 41387497f52SBarry Smith Why have `PetscBool`, why not use bool in C? The problem is that K and R C, C99 and C++ all have different mechanisms for 414*af27ebaaSBarry Smith Boolean values. It is not easy to have a simple macro that that will work properly in all circumstances with all three mechanisms. 415df4397b0SStefano Zampini 416b94d7dedSBarry Smith .seealso: `PETSC_TRUE`, `PETSC_FALSE`, `PetscNot()`, `PetscBool3` 417df4397b0SStefano Zampini E*/ 4189371c9d4SSatish Balay typedef enum { 4199371c9d4SSatish Balay PETSC_FALSE, 4209371c9d4SSatish Balay PETSC_TRUE 4219371c9d4SSatish Balay } PetscBool; 4223b590011SJacob Faibussowitsch PETSC_EXTERN const char *const PetscBools[]; 423df4397b0SStefano Zampini 424b94d7dedSBarry Smith /*E 425b94d7dedSBarry Smith PetscBool3 - Ternary logical variable. Actually an enum in C and a 4 byte integer in Fortran. 426b94d7dedSBarry Smith 427b94d7dedSBarry Smith Level: beginner 428b94d7dedSBarry Smith 42987497f52SBarry Smith Note: 430b94d7dedSBarry Smith Should not be used with the if (flg) or if (!flg) syntax. 431b94d7dedSBarry Smith 43290dd7910SPierre Jolivet .seealso: `PETSC_TRUE`, `PETSC_FALSE`, `PetscNot()`, `PETSC_BOOL3_TRUE`, `PETSC_BOOL3_FALSE`, `PETSC_BOOL3_UNKNOWN` 433b94d7dedSBarry Smith E*/ 4349371c9d4SSatish Balay typedef enum { 4359371c9d4SSatish Balay PETSC_BOOL3_FALSE, 4369371c9d4SSatish Balay PETSC_BOOL3_TRUE, 4379371c9d4SSatish Balay PETSC_BOOL3_UNKNOWN = -1 4389371c9d4SSatish Balay } PetscBool3; 439b94d7dedSBarry Smith 440b94d7dedSBarry Smith #define PetscBool3ToBool(a) ((a) == PETSC_BOOL3_TRUE ? PETSC_TRUE : PETSC_FALSE) 441b94d7dedSBarry Smith #define PetscBoolToBool3(a) ((a) == PETSC_TRUE ? PETSC_BOOL3_TRUE : PETSC_BOOL3_FALSE) 442b94d7dedSBarry Smith 443df4397b0SStefano Zampini /*MC 44487497f52SBarry Smith PetscReal - PETSc type that represents a real number version of `PetscScalar` 445df4397b0SStefano Zampini 446667f096bSBarry Smith Level: beginner 447667f096bSBarry Smith 448df4397b0SStefano Zampini Notes: 44987497f52SBarry Smith For MPI calls that require datatypes, use `MPIU_REAL` as the datatype for `PetscReal` and `MPIU_SUM`, `MPIU_MAX`, etc. for operations. 45087497f52SBarry Smith They will automatically work correctly regardless of the size of `PetscReal`. 451df4397b0SStefano Zampini 45287497f52SBarry Smith See `PetscScalar` for details on how to ./configure the size of `PetscReal`. 453df4397b0SStefano Zampini 454db781477SPatrick Sanan .seealso: `PetscScalar`, `PetscComplex`, `PetscInt`, `MPIU_REAL`, `MPIU_SCALAR`, `MPIU_COMPLEX`, `MPIU_INT` 455df4397b0SStefano Zampini M*/ 456df4397b0SStefano Zampini 457df4397b0SStefano Zampini #if defined(PETSC_USE_REAL_SINGLE) 458df4397b0SStefano Zampini typedef float PetscReal; 459df4397b0SStefano Zampini #elif defined(PETSC_USE_REAL_DOUBLE) 460df4397b0SStefano Zampini typedef double PetscReal; 461df4397b0SStefano Zampini #elif defined(PETSC_USE_REAL___FLOAT128) 462df4397b0SStefano Zampini #if defined(__cplusplus) 463df4397b0SStefano Zampini extern "C" { 464df4397b0SStefano Zampini #endif 465df4397b0SStefano Zampini #include <quadmath.h> 466df4397b0SStefano Zampini #if defined(__cplusplus) 467df4397b0SStefano Zampini } 468df4397b0SStefano Zampini #endif 469df4397b0SStefano Zampini typedef __float128 PetscReal; 470df4397b0SStefano Zampini #elif defined(PETSC_USE_REAL___FP16) 471df4397b0SStefano Zampini typedef __fp16 PetscReal; 472df4397b0SStefano Zampini #endif /* PETSC_USE_REAL_* */ 473df4397b0SStefano Zampini 474df4397b0SStefano Zampini /*MC 47587497f52SBarry Smith PetscComplex - PETSc type that represents a complex number with precision matching that of `PetscReal`. 476df4397b0SStefano Zampini 477df4397b0SStefano Zampini Synopsis: 478df4397b0SStefano Zampini #include <petscsys.h> 479df4397b0SStefano Zampini PetscComplex number = 1. + 2.*PETSC_i; 480df4397b0SStefano Zampini 481667f096bSBarry Smith Level: beginner 482667f096bSBarry Smith 483df4397b0SStefano Zampini Notes: 48487497f52SBarry Smith For MPI calls that require datatypes, use `MPIU_COMPLEX` as the datatype for `PetscComplex` and `MPIU_SUM` etc for operations. 48587497f52SBarry Smith They will automatically work correctly regardless of the size of `PetscComplex`. 486df4397b0SStefano Zampini 48716a05f60SBarry Smith See `PetscScalar` for details on how to ./configure the size of `PetscReal` 488df4397b0SStefano Zampini 489df4397b0SStefano Zampini Complex numbers are automatically available if PETSc was able to find a working complex implementation 490df4397b0SStefano Zampini 49116a05f60SBarry Smith PETSc has a 'fix' for complex numbers to support expressions such as `std::complex<PetscReal>` + `PetscInt`, which are not supported by the standard 49216a05f60SBarry Smith C++ library, but are convenient for petsc users. If the C++ compiler is able to compile code in `petsccxxcomplexfix.h` (This is checked by 49316a05f60SBarry Smith configure), we include `petsccxxcomplexfix.h` to provide this convenience. 494a966371cSJunchao Zhang 49587497f52SBarry Smith If the fix causes conflicts, or one really does not want this fix for a particular C++ file, one can define `PETSC_SKIP_CXX_COMPLEX_FIX` 496a966371cSJunchao Zhang at the beginning of the C++ file to skip the fix. 497a966371cSJunchao Zhang 498db781477SPatrick Sanan .seealso: `PetscReal`, `PetscScalar`, `PetscComplex`, `PetscInt`, `MPIU_REAL`, `MPIU_SCALAR`, `MPIU_COMPLEX`, `MPIU_INT`, `PETSC_i` 499df4397b0SStefano Zampini M*/ 500df4397b0SStefano Zampini #if !defined(PETSC_SKIP_COMPLEX) 5017a19d461SSatish Balay #if defined(PETSC_CLANGUAGE_CXX) 5027a19d461SSatish Balay #if !defined(PETSC_USE_REAL___FP16) && !defined(PETSC_USE_REAL___FLOAT128) 5037a19d461SSatish Balay #if defined(__cplusplus) && defined(PETSC_HAVE_CXX_COMPLEX) /* enable complex for library code */ 504df4397b0SStefano Zampini #define PETSC_HAVE_COMPLEX 1 505d5b43468SJose E. Roman #elif !defined(__cplusplus) && defined(PETSC_HAVE_C99_COMPLEX) && defined(PETSC_HAVE_CXX_COMPLEX) /* User code only - conditional on library code complex support */ 5067a19d461SSatish Balay #define PETSC_HAVE_COMPLEX 1 5077a19d461SSatish Balay #endif 508450fc7c9SSatish Balay #elif defined(PETSC_USE_REAL___FLOAT128) && defined(PETSC_HAVE_C99_COMPLEX) 509450fc7c9SSatish Balay #define PETSC_HAVE_COMPLEX 1 5107a19d461SSatish Balay #endif 5117a19d461SSatish Balay #else /* !PETSC_CLANGUAGE_CXX */ 5127a19d461SSatish Balay #if !defined(PETSC_USE_REAL___FP16) 5137a19d461SSatish Balay #if !defined(__cplusplus) && defined(PETSC_HAVE_C99_COMPLEX) /* enable complex for library code */ 5147a19d461SSatish Balay #define PETSC_HAVE_COMPLEX 1 515d5b43468SJose E. Roman #elif defined(__cplusplus) && defined(PETSC_HAVE_C99_COMPLEX) && defined(PETSC_HAVE_CXX_COMPLEX) /* User code only - conditional on library code complex support */ 5167a19d461SSatish Balay #define PETSC_HAVE_COMPLEX 1 5177a19d461SSatish Balay #endif 5187a19d461SSatish Balay #endif 5197a19d461SSatish Balay #endif /* PETSC_CLANGUAGE_CXX */ 5207a19d461SSatish Balay #endif /* !PETSC_SKIP_COMPLEX */ 5217a19d461SSatish Balay 5227a19d461SSatish Balay #if defined(PETSC_HAVE_COMPLEX) 5237a19d461SSatish Balay #if defined(__cplusplus) /* C++ complex support */ 52411d22bbfSJunchao Zhang /* Locate a C++ complex template library */ 52511d22bbfSJunchao Zhang #if defined(PETSC_DESIRE_KOKKOS_COMPLEX) /* Defined in petscvec_kokkos.hpp for *.kokkos.cxx files */ 52611d22bbfSJunchao Zhang #define petsccomplexlib Kokkos 52711d22bbfSJunchao Zhang #include <Kokkos_Complex.hpp> 528022afdc5SJed Brown #elif defined(__CUDACC__) || defined(__HIPCC__) 529df4397b0SStefano Zampini #define petsccomplexlib thrust 530df4397b0SStefano Zampini #include <thrust/complex.h> 531450fc7c9SSatish Balay #elif defined(PETSC_USE_REAL___FLOAT128) 532450fc7c9SSatish Balay #include <complex.h> 533df4397b0SStefano Zampini #else 534df4397b0SStefano Zampini #define petsccomplexlib std 535df4397b0SStefano Zampini #include <complex> 536df4397b0SStefano Zampini #endif 53711d22bbfSJunchao Zhang 53811d22bbfSJunchao Zhang /* Define PetscComplex based on the precision */ 539df4397b0SStefano Zampini #if defined(PETSC_USE_REAL_SINGLE) 540df4397b0SStefano Zampini typedef petsccomplexlib::complex<float> PetscComplex; 541df4397b0SStefano Zampini #elif defined(PETSC_USE_REAL_DOUBLE) 542df4397b0SStefano Zampini typedef petsccomplexlib::complex<double> PetscComplex; 543df4397b0SStefano Zampini #elif defined(PETSC_USE_REAL___FLOAT128) 544450fc7c9SSatish Balay typedef __complex128 PetscComplex; 54511d22bbfSJunchao Zhang #endif 54611d22bbfSJunchao Zhang 547a966371cSJunchao Zhang /* Include a PETSc C++ complex 'fix'. Check PetscComplex manual page for details */ 548a966371cSJunchao Zhang #if defined(PETSC_HAVE_CXX_COMPLEX_FIX) && !defined(PETSC_SKIP_CXX_COMPLEX_FIX) 54939829747SLisandro Dalcin #include <petsccxxcomplexfix.h> 55011d22bbfSJunchao Zhang #endif 5517a19d461SSatish Balay #else /* c99 complex support */ 552df4397b0SStefano Zampini #include <complex.h> 553df4397b0SStefano Zampini #if defined(PETSC_USE_REAL_SINGLE) || defined(PETSC_USE_REAL___FP16) 554df4397b0SStefano Zampini typedef float _Complex PetscComplex; 555df4397b0SStefano Zampini #elif defined(PETSC_USE_REAL_DOUBLE) 556df4397b0SStefano Zampini typedef double _Complex PetscComplex; 557df4397b0SStefano Zampini #elif defined(PETSC_USE_REAL___FLOAT128) 558df4397b0SStefano Zampini typedef __complex128 PetscComplex; 559df4397b0SStefano Zampini #endif /* PETSC_USE_REAL_* */ 5607a19d461SSatish Balay #endif /* !__cplusplus */ 5617a19d461SSatish Balay #endif /* PETSC_HAVE_COMPLEX */ 562df4397b0SStefano Zampini 563df4397b0SStefano Zampini /*MC 564df4397b0SStefano Zampini PetscScalar - PETSc type that represents either a double precision real number, a double precision 565df4397b0SStefano Zampini complex number, a single precision real number, a __float128 real or complex or a __fp16 real - if the code is configured 56616a05f60SBarry Smith with `--with-scalar-type`=real,complex `--with-precision`=single,double,__float128,__fp16 567df4397b0SStefano Zampini 568df4397b0SStefano Zampini Level: beginner 569df4397b0SStefano Zampini 57016a05f60SBarry Smith Note: 57116a05f60SBarry Smith For MPI calls that require datatypes, use `MPIU_SCALAR` as the datatype for `PetscScalar` and `MPIU_SUM`, etc for operations. They will automatically work correctly regardless of the size of `PetscScalar`. 57216a05f60SBarry Smith 573db781477SPatrick Sanan .seealso: `PetscReal`, `PetscComplex`, `PetscInt`, `MPIU_REAL`, `MPIU_SCALAR`, `MPIU_COMPLEX`, `MPIU_INT`, `PetscRealPart()`, `PetscImaginaryPart()` 574df4397b0SStefano Zampini M*/ 575df4397b0SStefano Zampini 5767a19d461SSatish Balay #if defined(PETSC_USE_COMPLEX) && defined(PETSC_HAVE_COMPLEX) 577df4397b0SStefano Zampini typedef PetscComplex PetscScalar; 578df4397b0SStefano Zampini #else /* PETSC_USE_COMPLEX */ 579df4397b0SStefano Zampini typedef PetscReal PetscScalar; 580df4397b0SStefano Zampini #endif /* PETSC_USE_COMPLEX */ 581df4397b0SStefano Zampini 582df4397b0SStefano Zampini /*E 58387497f52SBarry Smith PetscCopyMode - Determines how an array or `PetscObject` passed to certain functions is copied or retained by the aggregate `PetscObject` 584df4397b0SStefano Zampini 585667f096bSBarry Smith Values for array input: 586667f096bSBarry Smith + `PETSC_COPY_VALUES` - the array values are copied into new space, the user is free to reuse or delete the passed in array 587667f096bSBarry Smith . `PETSC_OWN_POINTER` - the array values are NOT copied, the object takes ownership of the array and will free it later, the user cannot change or 58816a05f60SBarry Smith delete the array. The array MUST have been obtained with `PetscMalloc()`. Hence this mode cannot be used in Fortran. 589667f096bSBarry Smith - `PETSC_USE_POINTER` - the array values are NOT copied, the object uses the array but does NOT take ownership of the array. The user cannot use 590667f096bSBarry Smith the array but the user must delete the array after the object is destroyed. 5915d80c0bfSVaclav Hapla 592667f096bSBarry Smith Values for PetscObject: 593667f096bSBarry Smith + `PETSC_COPY_VALUES` - the input `PetscObject` is cloned into the aggregate `PetscObject`; the user is free to reuse/modify the input `PetscObject` without side effects. 594667f096bSBarry Smith . `PETSC_OWN_POINTER` - the input `PetscObject` is referenced by pointer (with reference count), thus should not be modified by the user. 595667f096bSBarry Smith increases its reference count). 596667f096bSBarry Smith - `PETSC_USE_POINTER` - invalid for `PetscObject` inputs. 597bdedc06fSMatthew G. Knepley 59895bd0b28SBarry Smith Level: beginner 59995bd0b28SBarry Smith 600097fc5b5SPierre Jolivet .seealso: `PetscInsertMode` 601df4397b0SStefano Zampini E*/ 6029371c9d4SSatish Balay typedef enum { 6039371c9d4SSatish Balay PETSC_COPY_VALUES, 6049371c9d4SSatish Balay PETSC_OWN_POINTER, 6059371c9d4SSatish Balay PETSC_USE_POINTER 6069371c9d4SSatish Balay } PetscCopyMode; 6073b590011SJacob Faibussowitsch PETSC_EXTERN const char *const PetscCopyModes[]; 608df4397b0SStefano Zampini 609df4397b0SStefano Zampini /*MC 61087497f52SBarry Smith PETSC_FALSE - False value of `PetscBool` 611df4397b0SStefano Zampini 612df4397b0SStefano Zampini Level: beginner 613df4397b0SStefano Zampini 614df4397b0SStefano Zampini Note: 615df4397b0SStefano Zampini Zero integer 616df4397b0SStefano Zampini 61787497f52SBarry Smith .seealso: `PetscBool`, `PetscBool3`, `PETSC_TRUE` 618df4397b0SStefano Zampini M*/ 619df4397b0SStefano Zampini 620df4397b0SStefano Zampini /*MC 62187497f52SBarry Smith PETSC_TRUE - True value of `PetscBool` 622df4397b0SStefano Zampini 623df4397b0SStefano Zampini Level: beginner 624df4397b0SStefano Zampini 625df4397b0SStefano Zampini Note: 626df4397b0SStefano Zampini Nonzero integer 627df4397b0SStefano Zampini 62887497f52SBarry Smith .seealso: `PetscBool`, `PetscBool3`, `PETSC_FALSE` 629df4397b0SStefano Zampini M*/ 630df4397b0SStefano Zampini 631df4397b0SStefano Zampini /*MC 632df4397b0SStefano Zampini PetscLogDouble - Used for logging times 633df4397b0SStefano Zampini 6346b3bf505SPatrick Sanan Level: developer 6356b3bf505SPatrick Sanan 636667f096bSBarry Smith Note: 637667f096bSBarry Smith Contains double precision numbers that are not used in the numerical computations, but rather in logging, timing etc. 638667f096bSBarry Smith 639bdedc06fSMatthew G. Knepley .seealso: `PetscBool`, `PetscDataType` 640df4397b0SStefano Zampini M*/ 641df4397b0SStefano Zampini typedef double PetscLogDouble; 642df4397b0SStefano Zampini 643df4397b0SStefano Zampini /*E 644df4397b0SStefano Zampini PetscDataType - Used for handling different basic data types. 645df4397b0SStefano Zampini 646df4397b0SStefano Zampini Level: beginner 647df4397b0SStefano Zampini 648df4397b0SStefano Zampini Notes: 64987497f52SBarry Smith Use of this should be avoided if one can directly use `MPI_Datatype` instead. 650df4397b0SStefano Zampini 65187497f52SBarry Smith `PETSC_INT` is the datatype for a `PetscInt`, regardless of whether it is 4 or 8 bytes. 65287497f52SBarry Smith `PETSC_REAL`, `PETSC_COMPLEX` and `PETSC_SCALAR` are the datatypes for `PetscReal`, `PetscComplex` and `PetscScalar`, regardless of their sizes. 653277f51e8SBarry Smith 65487497f52SBarry Smith Developer Notes: 655df4397b0SStefano Zampini It would be nice if we could always just use MPI Datatypes, why can we not? 656df4397b0SStefano Zampini 65787497f52SBarry Smith If you change any values in `PetscDatatype` make sure you update their usage in 658fa131761SBarry Smith share/petsc/matlab/PetscBagRead.m and share/petsc/matlab/@PetscOpenSocket/read/write.m 65991e29162SBarry Smith 660667f096bSBarry Smith TODO: 6613321ca25SJames Wright Remove use of improper `PETSC_ENUM` 662277f51e8SBarry Smith 663db781477SPatrick Sanan .seealso: `PetscBinaryRead()`, `PetscBinaryWrite()`, `PetscDataTypeToMPIDataType()`, 664db781477SPatrick Sanan `PetscDataTypeGetSize()` 665df4397b0SStefano Zampini E*/ 6669371c9d4SSatish Balay typedef enum { 6679371c9d4SSatish Balay PETSC_DATATYPE_UNKNOWN = 0, 6689371c9d4SSatish Balay PETSC_DOUBLE = 1, 6699371c9d4SSatish Balay PETSC_COMPLEX = 2, 6709371c9d4SSatish Balay PETSC_LONG = 3, 6719371c9d4SSatish Balay PETSC_SHORT = 4, 6729371c9d4SSatish Balay PETSC_FLOAT = 5, 6739371c9d4SSatish Balay PETSC_CHAR = 6, 6749371c9d4SSatish Balay PETSC_BIT_LOGICAL = 7, 6759371c9d4SSatish Balay PETSC_ENUM = 8, 6769371c9d4SSatish Balay PETSC_BOOL = 9, 6779371c9d4SSatish Balay PETSC___FLOAT128 = 10, 6789371c9d4SSatish Balay PETSC_OBJECT = 11, 6799371c9d4SSatish Balay PETSC_FUNCTION = 12, 6809371c9d4SSatish Balay PETSC_STRING = 13, 6819371c9d4SSatish Balay PETSC___FP16 = 14, 6829371c9d4SSatish Balay PETSC_STRUCT = 15, 6839371c9d4SSatish Balay PETSC_INT = 16, 68462e5d2d2SJDBetteridge PETSC_INT64 = 17, 6853321ca25SJames Wright PETSC_COUNT = 18, 6863321ca25SJames Wright PETSC_INT32 = 19, 6879371c9d4SSatish Balay } PetscDataType; 6883b590011SJacob Faibussowitsch PETSC_EXTERN const char *const PetscDataTypes[]; 689df4397b0SStefano Zampini 690df4397b0SStefano Zampini #if defined(PETSC_USE_REAL_SINGLE) 691df4397b0SStefano Zampini #define PETSC_REAL PETSC_FLOAT 6925117d392SLisandro Dalcin #elif defined(PETSC_USE_REAL_DOUBLE) 6935117d392SLisandro Dalcin #define PETSC_REAL PETSC_DOUBLE 694df4397b0SStefano Zampini #elif defined(PETSC_USE_REAL___FLOAT128) 695df4397b0SStefano Zampini #define PETSC_REAL PETSC___FLOAT128 696df4397b0SStefano Zampini #elif defined(PETSC_USE_REAL___FP16) 697df4397b0SStefano Zampini #define PETSC_REAL PETSC___FP16 698df4397b0SStefano Zampini #else 699df4397b0SStefano Zampini #define PETSC_REAL PETSC_DOUBLE 700df4397b0SStefano Zampini #endif 7015117d392SLisandro Dalcin 7025117d392SLisandro Dalcin #if defined(PETSC_USE_COMPLEX) 7035117d392SLisandro Dalcin #define PETSC_SCALAR PETSC_COMPLEX 7045117d392SLisandro Dalcin #else 7055117d392SLisandro Dalcin #define PETSC_SCALAR PETSC_REAL 7065117d392SLisandro Dalcin #endif 7075117d392SLisandro Dalcin 708df4397b0SStefano Zampini #define PETSC_FORTRANADDR PETSC_LONG 709df4397b0SStefano Zampini 710df4397b0SStefano Zampini /*S 711df4397b0SStefano Zampini PetscToken - 'Token' used for managing tokenizing strings 712df4397b0SStefano Zampini 713df4397b0SStefano Zampini Level: intermediate 714df4397b0SStefano Zampini 715db781477SPatrick Sanan .seealso: `PetscTokenCreate()`, `PetscTokenFind()`, `PetscTokenDestroy()` 716df4397b0SStefano Zampini S*/ 717df4397b0SStefano Zampini typedef struct _p_PetscToken *PetscToken; 718df4397b0SStefano Zampini 719df4397b0SStefano Zampini /*S 72087497f52SBarry Smith PetscObject - any PETSc object, `PetscViewer`, `Mat`, `Vec`, `KSP` etc 721df4397b0SStefano Zampini 722df4397b0SStefano Zampini Level: beginner 723df4397b0SStefano Zampini 72487497f52SBarry Smith Notes: 725df4397b0SStefano Zampini This is the base class from which all PETSc objects are derived from. 726df4397b0SStefano Zampini 72787497f52SBarry Smith In certain situations one can cast an object, for example a `Vec`, to a `PetscObject` with (`PetscObject`)vec 72887497f52SBarry Smith 729db781477SPatrick Sanan .seealso: `PetscObjectDestroy()`, `PetscObjectView()`, `PetscObjectGetName()`, `PetscObjectSetName()`, `PetscObjectReference()`, `PetscObjectDereference()` 730df4397b0SStefano Zampini S*/ 731df4397b0SStefano Zampini typedef struct _p_PetscObject *PetscObject; 732df4397b0SStefano Zampini 733df4397b0SStefano Zampini /*MC 73487497f52SBarry Smith PetscObjectId - unique integer Id for a `PetscObject` 735df4397b0SStefano Zampini 736df4397b0SStefano Zampini Level: developer 737df4397b0SStefano Zampini 73887497f52SBarry Smith Note: 73987497f52SBarry Smith Unlike pointer values, object ids are never reused so one may save a `PetscObjectId` and compare it to one obtained later from a `PetscObject` to determine 74087497f52SBarry Smith if the objects are the same. Never compare two object pointer values. 741df4397b0SStefano Zampini 742db781477SPatrick Sanan .seealso: `PetscObjectState`, `PetscObjectGetId()` 743df4397b0SStefano Zampini M*/ 744df4397b0SStefano Zampini typedef PetscInt64 PetscObjectId; 745df4397b0SStefano Zampini 746df4397b0SStefano Zampini /*MC 74787497f52SBarry Smith PetscObjectState - integer state for a `PetscObject` 748df4397b0SStefano Zampini 749df4397b0SStefano Zampini Level: developer 750df4397b0SStefano Zampini 75195bd0b28SBarry Smith Note: 752df4397b0SStefano Zampini Object state is always-increasing and (for objects that track state) can be used to determine if an object has 753df4397b0SStefano Zampini changed since the last time you interacted with it. It is 64-bit so that it will not overflow for a very long time. 754df4397b0SStefano Zampini 755db781477SPatrick Sanan .seealso: `PetscObjectId`, `PetscObjectStateGet()`, `PetscObjectStateIncrease()`, `PetscObjectStateSet()` 756df4397b0SStefano Zampini M*/ 757df4397b0SStefano Zampini typedef PetscInt64 PetscObjectState; 758df4397b0SStefano Zampini 759df4397b0SStefano Zampini /*S 760df4397b0SStefano Zampini PetscFunctionList - Linked list of functions, possibly stored in dynamic libraries, accessed 761df4397b0SStefano Zampini by string name 762df4397b0SStefano Zampini 763df4397b0SStefano Zampini Level: advanced 764df4397b0SStefano Zampini 765db781477SPatrick Sanan .seealso: `PetscFunctionListAdd()`, `PetscFunctionListDestroy()` 766df4397b0SStefano Zampini S*/ 767df4397b0SStefano Zampini typedef struct _n_PetscFunctionList *PetscFunctionList; 768df4397b0SStefano Zampini 769df4397b0SStefano Zampini /*E 770df4397b0SStefano Zampini PetscFileMode - Access mode for a file. 771df4397b0SStefano Zampini 772667f096bSBarry Smith Values: 773667f096bSBarry Smith + `FILE_MODE_UNDEFINED` - initial invalid value 774667f096bSBarry Smith . `FILE_MODE_READ` - open a file at its beginning for reading 775667f096bSBarry Smith . `FILE_MODE_WRITE` - open a file at its beginning for writing (will create if the file does not exist) 776667f096bSBarry Smith . `FILE_MODE_APPEND` - open a file at end for writing 777667f096bSBarry Smith . `FILE_MODE_UPDATE` - open a file for updating, meaning for reading and writing 778667f096bSBarry Smith - `FILE_MODE_APPEND_UPDATE` - open a file for updating, meaning for reading and writing, at the end 779df4397b0SStefano Zampini 78016a05f60SBarry Smith Level: beginner 78116a05f60SBarry Smith 782db781477SPatrick Sanan .seealso: `PetscViewerFileSetMode()` 783df4397b0SStefano Zampini E*/ 7849371c9d4SSatish Balay typedef enum { 7859371c9d4SSatish Balay FILE_MODE_UNDEFINED = -1, 7869371c9d4SSatish Balay FILE_MODE_READ = 0, 7879371c9d4SSatish Balay FILE_MODE_WRITE, 7889371c9d4SSatish Balay FILE_MODE_APPEND, 7899371c9d4SSatish Balay FILE_MODE_UPDATE, 7909371c9d4SSatish Balay FILE_MODE_APPEND_UPDATE 7919371c9d4SSatish Balay } PetscFileMode; 7923b590011SJacob Faibussowitsch PETSC_EXTERN const char *const PetscFileModes[]; 793df4397b0SStefano Zampini 794df4397b0SStefano Zampini typedef void *PetscDLHandle; 7959371c9d4SSatish Balay typedef enum { 7969371c9d4SSatish Balay PETSC_DL_DECIDE = 0, 7979371c9d4SSatish Balay PETSC_DL_NOW = 1, 7989371c9d4SSatish Balay PETSC_DL_LOCAL = 2 7999371c9d4SSatish Balay } PetscDLMode; 800df4397b0SStefano Zampini 801df4397b0SStefano Zampini /*S 8027243573dSPierre Jolivet PetscObjectList - Linked list of PETSc objects, each accessible by string name 803df4397b0SStefano Zampini 804df4397b0SStefano Zampini Level: developer 805df4397b0SStefano Zampini 80687497f52SBarry Smith Note: 80787497f52SBarry Smith Used by `PetscObjectCompose()` and `PetscObjectQuery()` 808df4397b0SStefano Zampini 809db781477SPatrick Sanan .seealso: `PetscObjectListAdd()`, `PetscObjectListDestroy()`, `PetscObjectListFind()`, `PetscObjectCompose()`, `PetscObjectQuery()`, `PetscFunctionList` 810df4397b0SStefano Zampini S*/ 811df4397b0SStefano Zampini typedef struct _n_PetscObjectList *PetscObjectList; 812df4397b0SStefano Zampini 813df4397b0SStefano Zampini /*S 814667f096bSBarry Smith PetscDLLibrary - Linked list of dynamic libraries to search for functions 815df4397b0SStefano Zampini 81616a05f60SBarry Smith Level: developer 817df4397b0SStefano Zampini 818db781477SPatrick Sanan .seealso: `PetscDLLibraryOpen()` 819df4397b0SStefano Zampini S*/ 820df4397b0SStefano Zampini typedef struct _n_PetscDLLibrary *PetscDLLibrary; 821df4397b0SStefano Zampini 822df4397b0SStefano Zampini /*S 823df4397b0SStefano Zampini PetscContainer - Simple PETSc object that contains a pointer to any required data 824df4397b0SStefano Zampini 825df4397b0SStefano Zampini Level: advanced 826df4397b0SStefano Zampini 82787497f52SBarry Smith Note: 82887497f52SBarry Smith This is useful to attach arbitrary data to a `PetscObject` with `PetscObjectCompose()` and `PetscObjectQuery()` 82987497f52SBarry Smith 83087497f52SBarry Smith .seealso: `PetscObject`, `PetscContainerCreate()`, `PetscObjectCompose()`, `PetscObjectQuery()` 831df4397b0SStefano Zampini S*/ 832df4397b0SStefano Zampini typedef struct _p_PetscContainer *PetscContainer; 833df4397b0SStefano Zampini 834df4397b0SStefano Zampini /*S 835df4397b0SStefano Zampini PetscRandom - Abstract PETSc object that manages generating random numbers 836df4397b0SStefano Zampini 837df4397b0SStefano Zampini Level: intermediate 838df4397b0SStefano Zampini 839db781477SPatrick Sanan .seealso: `PetscRandomCreate()`, `PetscRandomGetValue()`, `PetscRandomType` 840df4397b0SStefano Zampini S*/ 841df4397b0SStefano Zampini typedef struct _p_PetscRandom *PetscRandom; 842df4397b0SStefano Zampini 843df4397b0SStefano Zampini /* 844df4397b0SStefano Zampini In binary files variables are stored using the following lengths, 845df4397b0SStefano Zampini regardless of how they are stored in memory on any one particular 846467446fbSPierre Jolivet machine. Use these rather than sizeof() in computing sizes for 847df4397b0SStefano Zampini PetscBinarySeek(). 848df4397b0SStefano Zampini */ 849df4397b0SStefano Zampini #define PETSC_BINARY_INT_SIZE (32 / 8) 850df4397b0SStefano Zampini #define PETSC_BINARY_FLOAT_SIZE (32 / 8) 851df4397b0SStefano Zampini #define PETSC_BINARY_CHAR_SIZE (8 / 8) 852df4397b0SStefano Zampini #define PETSC_BINARY_SHORT_SIZE (16 / 8) 853df4397b0SStefano Zampini #define PETSC_BINARY_DOUBLE_SIZE (64 / 8) 854df4397b0SStefano Zampini #define PETSC_BINARY_SCALAR_SIZE sizeof(PetscScalar) 855df4397b0SStefano Zampini 856df4397b0SStefano Zampini /*E 85787497f52SBarry Smith PetscBinarySeekType - argument to `PetscBinarySeek()` 858df4397b0SStefano Zampini 85916a05f60SBarry Smith Values: 86016a05f60SBarry Smith + `PETSC_BINARY_SEEK_SET` - offset is an absolute location in the file 86116a05f60SBarry Smith . `PETSC_BINARY_SEEK_CUR` - offset is an offset from the current location of the file pointer 86216a05f60SBarry Smith - `PETSC_BINARY_SEEK_END` - offset is an offset from the end of the file 86316a05f60SBarry Smith 864df4397b0SStefano Zampini Level: advanced 865df4397b0SStefano Zampini 866db781477SPatrick Sanan .seealso: `PetscBinarySeek()`, `PetscBinarySynchronizedSeek()` 867df4397b0SStefano Zampini E*/ 8689371c9d4SSatish Balay typedef enum { 8699371c9d4SSatish Balay PETSC_BINARY_SEEK_SET = 0, 8709371c9d4SSatish Balay PETSC_BINARY_SEEK_CUR = 1, 8719371c9d4SSatish Balay PETSC_BINARY_SEEK_END = 2 8729371c9d4SSatish Balay } PetscBinarySeekType; 873df4397b0SStefano Zampini 874df4397b0SStefano Zampini /*E 87516a05f60SBarry Smith PetscBuildTwoSidedType - algorithm for setting up two-sided communication for use with `PetscSF` 876df4397b0SStefano Zampini 877667f096bSBarry Smith Values: 878667f096bSBarry Smith + `PETSC_BUILDTWOSIDED_ALLREDUCE` - classical algorithm using an `MPI_Allreduce()` with 879667f096bSBarry Smith a buffer of length equal to the communicator size. Not memory-scalable due to 88016a05f60SBarry Smith the large reduction size. Requires only an MPI-1 implementation. 881667f096bSBarry Smith . `PETSC_BUILDTWOSIDED_IBARRIER` - nonblocking algorithm based on `MPI_Issend()` and `MPI_Ibarrier()`. 88216a05f60SBarry Smith Proved communication-optimal in Hoefler, Siebert, and Lumsdaine (2010). Requires an MPI-3 implementation. 883667f096bSBarry Smith - `PETSC_BUILDTWOSIDED_REDSCATTER` - similar to above, but use more optimized function 88416a05f60SBarry Smith that only communicates the part of the reduction that is necessary. Requires an MPI-2 implementation. 885df4397b0SStefano Zampini 886df4397b0SStefano Zampini Level: developer 887df4397b0SStefano Zampini 888db781477SPatrick Sanan .seealso: `PetscCommBuildTwoSided()`, `PetscCommBuildTwoSidedSetType()`, `PetscCommBuildTwoSidedGetType()` 889df4397b0SStefano Zampini E*/ 890df4397b0SStefano Zampini typedef enum { 891df4397b0SStefano Zampini PETSC_BUILDTWOSIDED_NOTSET = -1, 892df4397b0SStefano Zampini PETSC_BUILDTWOSIDED_ALLREDUCE = 0, 893df4397b0SStefano Zampini PETSC_BUILDTWOSIDED_IBARRIER = 1, 894df4397b0SStefano Zampini PETSC_BUILDTWOSIDED_REDSCATTER = 2 895df4397b0SStefano Zampini /* Updates here must be accompanied by updates in finclude/petscsys.h and the string array in mpits.c */ 896df4397b0SStefano Zampini } PetscBuildTwoSidedType; 8973b590011SJacob Faibussowitsch PETSC_EXTERN const char *const PetscBuildTwoSidedTypes[]; 898df4397b0SStefano Zampini 899aa2d33c1SMatthew G. Knepley /* NOTE: If you change this, you must also change the values in src/vec/f90-mod/petscvec.h */ 900df4397b0SStefano Zampini /*E 901667f096bSBarry Smith InsertMode - How the entries are combined with the current values in the vectors or matrices 902df4397b0SStefano Zampini 903667f096bSBarry Smith Values: 904667f096bSBarry Smith + `NOT_SET_VALUES` - do not actually use the values 905667f096bSBarry Smith . `INSERT_VALUES` - replace the current values with the provided values, unless the index is marked as constrained by the `PetscSection` 906667f096bSBarry Smith . `ADD_VALUES` - add the values to the current values, unless the index is marked as constrained by the `PetscSection` 907667f096bSBarry Smith . `MAX_VALUES` - use the maximum of each current value and provided value 908667f096bSBarry Smith . `MIN_VALUES` - use the minimum of each current value and provided value 909667f096bSBarry Smith . `INSERT_ALL_VALUES` - insert, even if indices that are not marked as constrained by the `PetscSection` 910667f096bSBarry Smith . `ADD_ALL_VALUES` - add, even if indices that are not marked as constrained by the `PetscSection` 911667f096bSBarry Smith . `INSERT_BC_VALUES` - insert, but ignore indices that are not marked as constrained by the `PetscSection` 912667f096bSBarry Smith - `ADD_BC_VALUES` - add, but ignore indices that are not marked as constrained by the `PetscSection` 913667f096bSBarry Smith 91416a05f60SBarry Smith Level: beginner 91516a05f60SBarry Smith 916667f096bSBarry Smith Note: 917667f096bSBarry Smith The `PetscSection` that determines the effects of the `InsertMode` values can be obtained by the `Vec` object with `VecGetDM()` 918667f096bSBarry Smith and `DMGetLocalSection()`. 919667f096bSBarry Smith 920667f096bSBarry Smith Not all options are supported for all operations or PETSc object types. 921667f096bSBarry Smith 922db781477SPatrick Sanan .seealso: `VecSetValues()`, `MatSetValues()`, `VecSetValue()`, `VecSetValuesBlocked()`, 923db781477SPatrick Sanan `VecSetValuesLocal()`, `VecSetValuesBlockedLocal()`, `MatSetValuesBlocked()`, 924db781477SPatrick Sanan `MatSetValuesBlockedLocal()`, `MatSetValuesLocal()`, `VecScatterBegin()`, `VecScatterEnd()` 925df4397b0SStefano Zampini E*/ 9269371c9d4SSatish Balay typedef enum { 9279371c9d4SSatish Balay NOT_SET_VALUES, 9289371c9d4SSatish Balay INSERT_VALUES, 9299371c9d4SSatish Balay ADD_VALUES, 9309371c9d4SSatish Balay MAX_VALUES, 9319371c9d4SSatish Balay MIN_VALUES, 9329371c9d4SSatish Balay INSERT_ALL_VALUES, 9339371c9d4SSatish Balay ADD_ALL_VALUES, 9349371c9d4SSatish Balay INSERT_BC_VALUES, 9359371c9d4SSatish Balay ADD_BC_VALUES 9369371c9d4SSatish Balay } InsertMode; 937df4397b0SStefano Zampini 938df4397b0SStefano Zampini /*MC 939df4397b0SStefano Zampini INSERT_VALUES - Put a value into a vector or matrix, overwrites any previous value 940df4397b0SStefano Zampini 941df4397b0SStefano Zampini Level: beginner 942df4397b0SStefano Zampini 943db781477SPatrick Sanan .seealso: `InsertMode`, `VecSetValues()`, `MatSetValues()`, `VecSetValue()`, `VecSetValuesBlocked()`, 944db781477SPatrick Sanan `VecSetValuesLocal()`, `VecSetValuesBlockedLocal()`, `MatSetValuesBlocked()`, `ADD_VALUES`, 945db781477SPatrick Sanan `MatSetValuesBlockedLocal()`, `MatSetValuesLocal()`, `VecScatterBegin()`, `VecScatterEnd()`, `MAX_VALUES` 946df4397b0SStefano Zampini M*/ 947df4397b0SStefano Zampini 948df4397b0SStefano Zampini /*MC 949df4397b0SStefano Zampini ADD_VALUES - Adds a value into a vector or matrix, if there previously was no value, just puts the 950df4397b0SStefano Zampini value into that location 951df4397b0SStefano Zampini 952df4397b0SStefano Zampini Level: beginner 953df4397b0SStefano Zampini 954db781477SPatrick Sanan .seealso: `InsertMode`, `VecSetValues()`, `MatSetValues()`, `VecSetValue()`, `VecSetValuesBlocked()`, 955db781477SPatrick Sanan `VecSetValuesLocal()`, `VecSetValuesBlockedLocal()`, `MatSetValuesBlocked()`, `INSERT_VALUES`, 956db781477SPatrick Sanan `MatSetValuesBlockedLocal()`, `MatSetValuesLocal()`, `VecScatterBegin()`, `VecScatterEnd()`, `MAX_VALUES` 957df4397b0SStefano Zampini M*/ 958df4397b0SStefano Zampini 959df4397b0SStefano Zampini /*MC 960df4397b0SStefano Zampini MAX_VALUES - Puts the maximum of the scattered/gathered value and the current value into each location 961df4397b0SStefano Zampini 962df4397b0SStefano Zampini Level: beginner 963df4397b0SStefano Zampini 964db781477SPatrick Sanan .seealso: `InsertMode`, `VecScatterBegin()`, `VecScatterEnd()`, `ADD_VALUES`, `INSERT_VALUES` 965df4397b0SStefano Zampini M*/ 966df4397b0SStefano Zampini 967421aa1e7SJunchao Zhang /*MC 968421aa1e7SJunchao Zhang MIN_VALUES - Puts the minimal of the scattered/gathered value and the current value into each location 969421aa1e7SJunchao Zhang 970421aa1e7SJunchao Zhang Level: beginner 971421aa1e7SJunchao Zhang 972db781477SPatrick Sanan .seealso: `InsertMode`, `VecScatterBegin()`, `VecScatterEnd()`, `ADD_VALUES`, `INSERT_VALUES` 973421aa1e7SJunchao Zhang M*/ 974421aa1e7SJunchao Zhang 975df4397b0SStefano Zampini /*S 976df4397b0SStefano Zampini PetscSubcomm - A decomposition of an MPI communicator into subcommunicators 977df4397b0SStefano Zampini 978667f096bSBarry Smith Values: 979667f096bSBarry Smith + `PETSC_SUBCOMM_GENERAL` - similar to `MPI_Comm_split()` each process sets the new communicator (color) they will belong to and the order within that communicator 980667f096bSBarry Smith . `PETSC_SUBCOMM_CONTIGUOUS` - each new communicator contains a set of process with contiguous ranks in the original MPI communicator 981667f096bSBarry Smith - `PETSC_SUBCOMM_INTERLACED` - each new communictor contains a set of processes equally far apart in rank from the others in that new communicator 982667f096bSBarry Smith 983df4397b0SStefano Zampini Sample Usage: 98487497f52SBarry Smith .vb 98516a05f60SBarry Smith PetscSubcommCreate() 98616a05f60SBarry Smith PetscSubcommSetNumber() 98716a05f60SBarry Smith PetscSubcommSetType(PETSC_SUBCOMM_INTERLACED); 98816a05f60SBarry Smith ccomm = PetscSubcommChild() 98916a05f60SBarry Smith PetscSubcommDestroy() 99087497f52SBarry Smith .ve 991df4397b0SStefano Zampini 992667f096bSBarry Smith Example: 993667f096bSBarry Smith Consider a communicator with six processes split into 3 subcommunicators. 994667f096bSBarry Smith .vb 99516a05f60SBarry Smith PETSC_SUBCOMM_CONTIGUOUS - the first communicator contains rank 0,1 the second rank 2,3 and the third rank 4,5 in the original ordering of the original communicator 99616a05f60SBarry Smith PETSC_SUBCOMM_INTERLACED - the first communicator contains rank 0,3, the second 1,4 and the third 2,5 997667f096bSBarry Smith .ve 998667f096bSBarry Smith 999df4397b0SStefano Zampini Level: advanced 1000df4397b0SStefano Zampini 100116a05f60SBarry Smith Note: 100216a05f60SBarry Smith After a call to `PetscSubcommSetType()`, `PetscSubcommSetTypeGeneral()`, or `PetscSubcommSetFromOptions()` one may call 100316a05f60SBarry Smith .vb 100416a05f60SBarry Smith PetscSubcommChild() returns the associated subcommunicator on this process 100516a05f60SBarry Smith PetscSubcommContiguousParent() returns a parent communitor but with all child of the same subcommunicator having contiguous rank 100616a05f60SBarry Smith .ve 100716a05f60SBarry Smith 100887497f52SBarry Smith Developer Note: 100987497f52SBarry Smith This is used in objects such as `PCREDUNDANT` to manage the subcommunicators on which the redundant computations 1010df4397b0SStefano Zampini are performed. 1011df4397b0SStefano Zampini 1012db781477SPatrick Sanan .seealso: `PetscSubcommCreate()`, `PetscSubcommSetNumber()`, `PetscSubcommSetType()`, `PetscSubcommView()`, `PetscSubcommSetFromOptions()` 1013df4397b0SStefano Zampini S*/ 1014df4397b0SStefano Zampini typedef struct _n_PetscSubcomm *PetscSubcomm; 10159371c9d4SSatish Balay typedef enum { 10169371c9d4SSatish Balay PETSC_SUBCOMM_GENERAL = 0, 10179371c9d4SSatish Balay PETSC_SUBCOMM_CONTIGUOUS = 1, 10189371c9d4SSatish Balay PETSC_SUBCOMM_INTERLACED = 2 10199371c9d4SSatish Balay } PetscSubcommType; 10203b590011SJacob Faibussowitsch PETSC_EXTERN const char *const PetscSubcommTypes[]; 1021df4397b0SStefano Zampini 1022df4397b0SStefano Zampini /*S 1023df4397b0SStefano Zampini PetscHeap - A simple class for managing heaps 1024df4397b0SStefano Zampini 1025df4397b0SStefano Zampini Level: intermediate 1026df4397b0SStefano Zampini 1027db781477SPatrick Sanan .seealso: `PetscHeapCreate()`, `PetscHeapAdd()`, `PetscHeapPop()`, `PetscHeapPeek()`, `PetscHeapStash()`, `PetscHeapUnstash()`, `PetscHeapView()`, `PetscHeapDestroy()` 1028df4397b0SStefano Zampini S*/ 1029df4397b0SStefano Zampini typedef struct _PetscHeap *PetscHeap; 1030df4397b0SStefano Zampini 1031df4397b0SStefano Zampini typedef struct _n_PetscShmComm *PetscShmComm; 1032df4397b0SStefano Zampini typedef struct _n_PetscOmpCtrl *PetscOmpCtrl; 1033df4397b0SStefano Zampini 1034df4397b0SStefano Zampini /*S 1035df4397b0SStefano Zampini PetscSegBuffer - a segmented extendable buffer 1036df4397b0SStefano Zampini 1037df4397b0SStefano Zampini Level: developer 1038df4397b0SStefano Zampini 1039db781477SPatrick Sanan .seealso: `PetscSegBufferCreate()`, `PetscSegBufferGet()`, `PetscSegBufferExtract()`, `PetscSegBufferDestroy()` 1040df4397b0SStefano Zampini S*/ 1041df4397b0SStefano Zampini typedef struct _n_PetscSegBuffer *PetscSegBuffer; 1042df4397b0SStefano Zampini 1043df4397b0SStefano Zampini typedef struct _n_PetscOptionsHelpPrinted *PetscOptionsHelpPrinted; 1044778ae69aSToby Isaac 1045778ae69aSToby Isaac /*S 1046778ae69aSToby Isaac PetscBT - PETSc bitarrays, efficient storage of arrays of boolean values 1047778ae69aSToby Isaac 1048778ae69aSToby Isaac Level: advanced 1049778ae69aSToby Isaac 1050778ae69aSToby Isaac Notes: 1051778ae69aSToby Isaac The following routines do not have their own manual pages 1052778ae69aSToby Isaac 1053778ae69aSToby Isaac .vb 1054778ae69aSToby Isaac PetscBTCreate(m,&bt) - creates a bit array with enough room to hold m values 1055778ae69aSToby Isaac PetscBTDestroy(&bt) - destroys the bit array 1056778ae69aSToby Isaac PetscBTMemzero(m,bt) - zeros the entire bit array (sets all values to false) 1057778ae69aSToby Isaac PetscBTSet(bt,index) - sets a particular entry as true 1058778ae69aSToby Isaac PetscBTClear(bt,index) - sets a particular entry as false 1059778ae69aSToby Isaac PetscBTLookup(bt,index) - returns the value 1060778ae69aSToby Isaac PetscBTLookupSet(bt,index) - returns the value and then sets it true 1061778ae69aSToby Isaac PetscBTLookupClear(bt,index) - returns the value and then sets it false 1062778ae69aSToby Isaac PetscBTLength(m) - returns number of bytes in array with m bits 1063778ae69aSToby Isaac PetscBTView(m,bt,viewer) - prints all the entries in a bit array 1064778ae69aSToby Isaac .ve 1065778ae69aSToby Isaac 1066778ae69aSToby Isaac PETSc does not check error flags on `PetscBTLookup()`, `PetcBTLookupSet()`, `PetscBTLength()` because error checking 1067778ae69aSToby Isaac would cost hundreds more cycles then the operation. 1068778ae69aSToby Isaac 1069778ae69aSToby Isaac S*/ 1070778ae69aSToby Isaac typedef char *PetscBT; 1071778ae69aSToby Isaac 1072778ae69aSToby Isaac /* The number of bits in a byte */ 1073778ae69aSToby Isaac #define PETSC_BITS_PER_BYTE CHAR_BIT 1074