xref: /petsc/src/binding/petsc4py/src/petsc4py/PETSc/petscsys.pxi (revision 552edb6364df478b294b3111f33a8f37ca096b20)
1cdef extern from * nogil:
2
3    ctypedef enum PetscDataType:
4        PETSC_INT
5        PETSC_REAL
6        PETSC_SCALAR
7        PETSC_COMPLEX
8        PETSC_DATATYPE_UNKNOWN
9
10    const char PETSC_AUTHOR_INFO[]
11    PetscErrorCode PetscGetVersion(char[], size_t)
12    PetscErrorCode PetscGetVersionNumber(PetscInt*, PetscInt*, PetscInt*, PetscInt*)
13
14    PetscErrorCode PetscInitialize(int*, char***, char[], char[])
15    PetscErrorCode PetscInitializeNoArguments()
16    PetscErrorCode PetscFinalize()
17    PetscBool PetscInitializeCalled
18    PetscBool PetscFinalizeCalled
19
20    ctypedef PetscErrorCode (*PetscErrorHandlerFunction)(
21        MPI_Comm, int, char*, char*, int, PetscErrorType, char*, void*)
22    PetscErrorHandlerFunction PetscAttachDebuggerErrorHandler
23    PetscErrorHandlerFunction PetscEmacsClientErrorHandler
24    PetscErrorHandlerFunction PetscTraceBackErrorHandler
25    PetscErrorHandlerFunction PetscMPIAbortErrorHandler
26    PetscErrorHandlerFunction PetscAbortErrorHandler
27    PetscErrorHandlerFunction PetscIgnoreErrorHandler
28    PetscErrorCode PetscPushErrorHandler(PetscErrorHandlerFunction, void*)
29    PetscErrorCode PetscPopErrorHandler()
30    PetscErrorCode PetscPopSignalHandler()
31    PetscErrorCode PetscInfoAllow(PetscBool)
32    PetscErrorCode PetscInfoSetFile(char*, char*)
33
34    PetscErrorCode PetscErrorMessage(int, char*[], char**)
35
36    PetscErrorCode PetscSplitOwnership(MPI_Comm, PetscInt*, PetscInt*)
37    PetscErrorCode PetscSplitOwnershipBlock(MPI_Comm, PetscInt, PetscInt*, PetscInt*)
38
39    FILE *PETSC_STDOUT
40    FILE *PETSC_STDERR
41
42    PetscErrorCode PetscPrintf(MPI_Comm, char[], ...)
43    PetscErrorCode PetscVSNPrintf(char*, size_t, const char[], size_t *, va_list)
44    PetscErrorCode PetscVFPrintfDefault(FILE*, const char[], va_list)
45    PetscErrorCode PetscSynchronizedPrintf(MPI_Comm, char[], ...)
46    PetscErrorCode PetscSynchronizedFlush(MPI_Comm, FILE*)
47
48    PetscErrorCode PetscSequentialPhaseBegin(MPI_Comm, int)
49    PetscErrorCode PetscSequentialPhaseEnd(MPI_Comm, int)
50    PetscErrorCode PetscSleep(PetscReal)
51
52    PetscErrorCode PetscCitationsRegister(const char[], PetscBool*)
53
54    PetscErrorCode PetscHasExternalPackage(const char[], PetscBool*)
55
56
57cdef inline PetscErrorCode Sys_Sizes(
58    object size, object bsize,
59    PetscInt *_b,
60    PetscInt *_n,
61    PetscInt *_N,
62   ) except PETSC_ERR_PYTHON:
63    # get block size
64    cdef PetscInt bs=PETSC_DECIDE, b=PETSC_DECIDE
65    if bsize is not None: bs = b = asInt(bsize)
66    if bs == PETSC_DECIDE: bs = 1
67    # unpack and get local and global sizes
68    cdef PetscInt n=PETSC_DECIDE, N=PETSC_DECIDE
69    cdef object on, oN
70    try:
71        on, oN = size
72    except (TypeError, ValueError):
73        on = None; oN = size
74    if on is not None: n = asInt(on)
75    if oN is not None: N = asInt(oN)
76    # check block, local, and global sizes
77    if (bs < 1): raise ValueError(
78        "block size %d must be positive" % toInt(bs))
79    if n==PETSC_DECIDE and N==PETSC_DECIDE: raise ValueError(
80        "local and global sizes cannot be both 'DECIDE'")
81    if (n > 0) and (n % bs): raise ValueError(
82        "local size %d not divisible by block size %d" %
83        (toInt(n), toInt(bs)))
84    if (N > 0) and (N % bs): raise ValueError(
85        "global size %d not divisible by block size %d" %
86        (toInt(N), toInt(bs)))
87    # return result to the caller
88    if _b != NULL: _b[0] = b
89    if _n != NULL: _n[0] = n
90    if _N != NULL: _N[0] = N
91    return PETSC_SUCCESS
92
93cdef inline PetscErrorCode Sys_Layout(
94    MPI_Comm comm,
95    PetscInt bs,
96    PetscInt *_n,
97    PetscInt *_N,
98   ) except PETSC_ERR_PYTHON:
99    cdef PetscInt n = _n[0]
100    cdef PetscInt N = _N[0]
101    if bs < 0: bs = 1
102    if n  > 0: n = n // bs
103    if N  > 0: N = N // bs
104    CHKERR(PetscSplitOwnership(comm, &n, &N))
105    _n[0] = n * bs
106    _N[0] = N * bs
107    return PETSC_SUCCESS
108