Re: [f2py] Create array in Python, deallocate in Fortran

Pearu Peterson <[email protected]> Sat, 30 Apr 2011 08:13:17 +0300
Newsgroups gmane.comp.python.f2py.user
Message-ID <[email protected]>
On Sat, Apr 30, 2011 at 4:20 AM, Ben Forbes <[email protected]> wrote:

> Thanks that clears it up. So would the most efficient use of memory be
> to allocate directly from Fortran? It looks like an array can't be
> created in Python and used in Fortran without a copy being made.
>
>
Yes.

But note that

  helloworld.mymodule.b=arr
  arr = helloworld.mymodule.b

will free the original arr object (provided that it was
created to only initialize b) and in addition, arr is a
reference to Fortran array (IIRC). That is,
  arr[0,0] = 100
will modify Fortran array.

Pearu


> On Fri, Apr 29, 2011 at 5:31 PM, Pearu Peterson
> <[email protected]> wrote:
> >
> >
> > On 04/29/2011 09:19 AM, Ben Forbes wrote:
> >> When I create an array in Python, then deallocate it in Fortran, it
> >> doesn't appear to do anything to the original Python array. Here is
> >> the code:
> >>
> >> helloworld.f90:
> >>
> >> module mymodule
> >>      real(8),allocatable,dimension(:,:)::b
> >>      subroutine foo()
> >>          deallocate(b)
> >>          write(*,*) allocated(b)
> >>      end subroutine foo2
> >> end module mymodule
> >>
> >>
> >> Python:
> >>
> >> import helloworld
> >>
> >> arr=np.array([[1,2],[3,4]],dtype=np.float64,order='F')
> >> Out[2]:
> >> array([[ 1.,  2.],
> >>         [ 3.,  4.]])
> >>
> >> helloworld.mymodule.b=arr
> >
> > Note that this statement creates helloworld.mymodule.b (via Fortran
> > allocate) and then initialises with arr (via copy).
> > So,  helloworld.mymodule.b and arr are actually two different arrays.
> > And so, when you deallocate helloworld.mymodule.b, then nothing happends
> > to arr indeed.
> >
> >> Out[6]:
> >> array([[ 1.,  2.],
> >>         [ 3.,  4.]])
> >>
> >> helloworld.mymodule.foo()
> >> Out: F
> >>
> >> arr
> >> Out[2]:
> >> array([[ 1.,  2.],
> >>         [ 3.,  4.]])
> >
> > Try to print helloworld.mymodule.b before and after calling
> > helloworld.mymodule.foo() to see the effect.
> >
> >
> >> Fortran thinks it has deallocated b, but Python still has the original
> >> array. I've included the directive -DF2PY_REPORT_ON_ARRAY_COPY=2, and
> >> it doesn't give any array copy warnings.
> >>
> >> How can I understand this behaviour?
> >
> > See above.
> >
> >> Is it potentially dangerous to deallocate from Fortran?
> >
> > No, it should not be.
> >
> > HTH,
> > Pearu
> >
> > _______________________________________________
> > f2py-users mailing list
> > f2py-users-Y4l6ocDipWCuvFJfX82//[email protected]
> > http://cens.ioc.ee/mailman/listinfo/f2py-users
> >
>
>
>
> --
> Benjamin D. Forbes
> School of Physics
> The University of Melbourne
> Parkville, VIC 3010, Australia
>
> _______________________________________________
> f2py-users mailing list
> f2py-users-Y4l6ocDipWCuvFJfX82//[email protected]
> http://cens.ioc.ee/mailman/listinfo/f2py-users
>

_______________________________________________
f2py-users mailing list
f2py-users-Y4l6ocDipWCuvFJfX82//[email protected]
http://cens.ioc.ee/mailman/listinfo/f2py-users