# -*- Pyrex -*- # # ====================================================================== # # Brad T. Aagaard # U.S. Geological Survey # # {LicenseText} # # ====================================================================== # #header{ #include #include #}header # ---------------------------------------------------------------------- cdef extern from "Python.h": object PyCObject_FromVoidPtr(void*, void (*destruct)(void*)) void* PyCObject_AsVoidPtr(object) cdef void* ptrFromHandle(obj): """Extract pointer from PyCObject.""" return PyCObject_AsVoidPtr(obj.handle) cdef extern from "stdlib.h": ctypedef unsigned long size_t void* malloc(size_t size) void free(void* mem) cdef extern from "string.h": void strcpy(char*, char*) int strlen(char*) # ---------------------------------------------------------------------- def petsc_initialize(options): """ Initialize PETSc. """ # create shim for 'PetscInitialize' #embed{ int Petsc_initialize(int* argc, char*** argv) PetscErrorCode err = PetscInitialize(argc, argv, NULL, NULL); CHKERRQ(err); return 0; #}embed cdef int err cdef char** argv cdef char* arg cdef int argc argc = len(options) argv = malloc((argc+1)*sizeof(char*)); for i from 0 <= i < argc: arg = options[i] argv[i] = malloc((strlen(arg)+1)*sizeof(char)); strcpy(argv[i], arg); argv[argc] = NULL; err = Petsc_initialize(&argc, &argv); if err: raise RuntimeError("Error initializing PETSc.") for i from 0 <= i < argc: free(argv[i]) free(argv) return def petsc_finalize(): """ Finalize PETSc. """ # create shim for 'PetscFinalize' #embed{ int Petsc_finalize() PetscErrorCode err = PetscFinalize(); CHKERRQ(err); return 0; #}embed cdef int err err = Petsc_finalize() if err: raise RuntimError("Error finalizing PETSc.") return def mat_assemble(mat): """ Assemble matrix. """ # create shim for 'MatAssemblyBegin/MatAssemblyEnd' #embed{ int Mat_assemble(void* matVptr) Mat* mat = (Mat*) matVptr; PetscErrorCode err = 0; err = MatAssemblyBegin(*mat, MAT_FINAL_ASSEMBLY); CHKERRQ(err); err = MatAssemblyEnd(*mat, MAT_FINAL_ASSEMBLY); CHKERRQ(err); return 0; #}embed cdef void* matVptr matVptr = PyCObject_AsVoidPtr(mat) err = Mat_assemble(matVptr) if err: raise RuntimError("Error assembling matrix.") return def mat_setzero(mat): """ Zero out entries in matrix (retain structure). """ # create shim for 'MatZeroEntries' #embed{ int Mat_setzero(void* matVptr) Mat* mat = (Mat*) matVptr; PetscErrorCode err = 0; err = MatZeroEntries(*mat); return 0; #}embed cdef void* matVptr matVptr = PyCObject_AsVoidPtr(mat) err = Mat_setzero(matVptr) if err: raise RuntimError("Error zeroing matrix values.") return def mat_view(mat): """ Dump matrix to stdout. """ # create shim for 'MatView' #embed{ int Mat_view(void* matVptr) Mat* mat = (Mat*) matVptr; MatView(*mat, PETSC_VIEWER_STDOUT_WORLD); return 0; #}embed cdef void* matVptr err = Mat_view(PyCObject_AsVoidPtr(mat)) return # End of file