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