xref: /petsc/src/binding/petsc4py/src/petsc4py/include/petsc4py/pyscalar.h (revision 9d47de495d3c23378050c1b4a410c12a375cb6c6)
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)8 PyObject *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)20 PetscScalar 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