Hi,

Ignore this please. The answer was staring me in the Cython docs: Cython 
ignores what’s inside the cdef extern from block; the compiler reads the 
correct definitions from the header file. I’ve read this many times but keep 
forgetting!

Sorry about that.

Thanks,

Samar

> On Jun 5, 2025, at 10:44 AM, Samar Khatiwala <samar.khatiw...@earth.ox.ac.uk> 
> wrote:
> 
> Hello,
> 
> I’m writing a Python extension module to expose various classes, functions in 
> my C PETSc-based application code. I’ve taken a lot of inspiration from 
> petsc4py and borrowed bits of code from it. Everything works but one niggling 
> issue I’m facing is how to automatically inherit the data-types used to build 
> PETSc in my Cython code. Specifically, I want to make sure that if PETSc is 
> built with 64-bit ints then I use the correct type when I call my PETSc C 
> functions or create Numpy arrays with PyArray_SimpleNewFromData, etc.
> 
> I tried to understand how petsc4py does it, but looking at PETSc/PETSc.pyx it 
> seems that PetscInt is hardwired:
> 
> cdef extern from * nogil:
>    ctypedef long   PetscInt
>    ctypedef double PetscReal
>    ctypedef double PetscScalar
> 
> PetscInt is then used elsewhere Ωin petsc4py (e.g., in Mat.pyx) when calling 
> PETSc functions. But wouldn’t this be incompatible with the PetscInt defined 
> in petscsystypes.h if PETSc were built with --with-64-bit-indices?
> 
> On the other hand, I see (sort of; the code is very complicated!) that 
> arraynpy.pxi correctly picks up (via numpy.h) the mappings between PETSc and 
> Numpy arrays and these are used in the few places where an enumerated data 
> type is required as an argument (e.g., in DMSwarm.pyx).
> 
> I don’t believe there’s any incompatibility with PetscInt in petsc4py so I’m 
> likely missing something here. Could someone please explain how PetscInt, etc 
> pick up their correct values and how I can do the same in my code?
> 
> Thanks very much!
> 
> Best,
> 
> Samar
> 
> 
> 
> 
> 

Reply via email to