[petsc-users] petsc4py: PetSc is no longer initialised when calling C Function from Cython

Ethan Coon ecoon at lanl.gov
Thu Oct 20 15:26:10 CDT 2011


On Thu, 2011-10-20 at 13:05 -0700, Jeff Wiens wrote:
> Eventually, I would like
> to Initialise PETSc and construct my PETSc vectors in python and then
> have my C code perform operations on them. Again, this yet another
> test problem.
> 

Maybe I don't completely understand your planned working model, but I
don't think it's the right choice.

petsc4py is very good at making setup and "high level" features of PETSc
work well quickly and easily.  If you plan to call things like
VecSetSizes() from C, you might as well write your entire program in C.
It would be much easier to simply call VecSetSizes() from petsc4py  via
PETSc.Vec().setSizes().

What I suspect you're trying to avoid is doing the work in python,
including things like numerical calculations on the data contained
within the Vec.  Doing this in C via Cython is a good idea.  The better
model for implementing this sort of thing is to do all of your setup in
python, getting the data from the Vec, and passing that data off to your
cython/c code, i.e. something like:

-- Python Code --
 
import sys, petsc4py
petsc4py.init(sys.argv)
from petsc4py import PETSc

v1 = PETSc.Vec().createSeq(3)
v2 = v1.duplicate()
v1.setFromOptions()
v2.setFromOptions()

v1.set(3.)
v2.set(6.)

import dot
val = dot.mydot(v1[...], v2[...]) # note that these ellipses treat the underlying C-data stored in Vec as data to a numpy array

v1.destroy()
v2.destroy()



-- Cython code --
import numpy 
cimport numpy

DTYPE = numpy.float
ctypedef numpy.float_t DTYPE_t

cdef mydot( numpy.ndarray[DTYPE_t, ndim=1] v1,
            numpy.ndarray[DTYPE_t, ndim=1] v2):
    cdef int np = v1.shape[0]
    cdef lcv
    cdef DTYPE_t val

    val = 0.0
    for lcv in range(np):
        val += v1[lcv]*v2[lcv]
    return val

---------

Ethan




> The code is as follows:
> 
> ------- Python Code -----------
> 
> import sys, petsc4py
> petsc4py.init(sys.argv)
> from petsc4py import PETSc
> 
> import dot
> val = dot.mydot()
> PETSc.Sys.Print( "PETSc Dot Product: %i"%val )
> 
> ------- Cython Code -----------
> 
> cdef extern from "c_files/dot.h":
>    void init()
>    double dot()
> 
> def mydot():
>    #init();
>    return dot();
> 
> ------- C Code -----------
> 
> void init()
> {	
>     PetscInitialize(NULL,NULL,(char *)0,NULL);
> }
> 
> 
> double dot()
> {	
>     PetscScalar r;
>     Vec v1,v2;
> 
>     VecCreate(PETSC_COMM_WORLD, &v1);
>     VecCreate(PETSC_COMM_WORLD, &v2);
> 
>     VecSetSizes(v1, PETSC_DECIDE, 5000);
>     VecSetSizes(v2, PETSC_DECIDE, 5000);
>     VecSetFromOptions(v1);
>     VecSetFromOptions(v2);
> 
>     VecSet(v1,1.0);
>     VecSet(v2,2.0);
> 
>     VecAssemblyBegin(v1);
>     VecAssemblyEnd(v1);
>     VecAssemblyBegin(v2);
>     VecAssemblyEnd(v2);
> 
>     VecDot(v1, v2, &r);
>     return r;
> }

-- 
------------------------------------
Ethan Coon
Post-Doctoral Researcher
Applied Mathematics - T-5
Los Alamos National Laboratory
505-665-8289

http://www.ldeo.columbia.edu/~ecoon/
------------------------------------



More information about the petsc-users mailing list