1 #if !defined(PETSC4PY_PYSCALAR_H) 2 #define PETSC4PY_PYSCALAR_H 3 4 #include <Python.h> 5 #include <petscsystypes.h> 6 7 static inline PyPetscScalar_FromPetscScalar(PetscScalar s)8PyObject *PyPetscScalar_FromPetscScalar(PetscScalar s) 9 { 10 #if defined(PETSC_USE_COMPLEX) 11 double a = (double)PetscRealPart(s); 12 double b = (double)PetscImaginaryPart(s); 13 return PyComplex_FromDoubles(a, b); 14 #else 15 return PyFloat_FromDouble((double)s); 16 #endif 17 } 18 19 static inline PyPetscScalar_AsPetscScalar(PyObject * o)20PetscScalar PyPetscScalar_AsPetscScalar(PyObject *o) 21 { 22 #if defined(PETSC_USE_COMPLEX) 23 #if defined(Py_LIMITED_API) 24 PetscReal a = (PetscReal)PyComplex_RealAsDouble(o); 25 PetscReal b = (PetscReal)PyComplex_ImagAsDouble(o); 26 #else 27 Py_complex cval = PyComplex_AsCComplex(o); 28 PetscReal a = (PetscReal)cval.real; 29 PetscReal b = (PetscReal)cval.imag; 30 #endif 31 return a + b * PETSC_i; 32 #else 33 return (PetscScalar)PyFloat_AsDouble(o); 34 #endif 35 } 36 37 #endif/*PETSC4PY_PYSCALAR_H*/ 38