xref: /petsc/include/petscsystypes.h (revision af27ebaa0199971c43fd2e2e162251afd1bcda49)
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