[Numpy-discussion] [F2PY]: Allocatable Arrays

Andrea Gavana andrea.gavana@gmail....
Fri Feb 1 08:18:53 CST 2008


Hi Lisandro,

On Feb 1, 2008 1:59 PM, Lisandro Dalcin wrote:
> Sorry if I'm making noise, my knowledge of fortran is really little,
> but in your routine AllocateDummy your are fist allocating and next
> deallocating the arrays. Are you sure you can then access the contents
> of your arrays after deallocating them?

Thank you for your answer.

Unfortunately it seems that it doesn't matter whether I deallocate
them or not, I still get the compilation warning and I can't access
those variable in any case. It seems like f2py (or python or whatever)
does not like having more than 1 allocatable array inside a MODULE
declaration.

> How much complicated is your binary format?

*Very* complex. The fact is, I already know how to read those files in
Fortran, is the linking with Python via f2py that is driving me mad. I
can't believe no one has used before allocatable arrays as outputs
(whether from a subroutine or from a module).


> On 2/1/08, Andrea Gavana <andrea.gavana@gmail.com> wrote:
> > Hi All,
> >
> >     I sent a couple of messages to f2py mailing list, but it seems
> > like my problem has no simple solution so I thought to ask for some
> > suggestions here.
> >
> > Basically, I read some huge unformatted binary files which contain
> > time-step data from a reservoir simulation. I don't know the
> > dimensions (i.e., lengths) of the vectors I am going to read, and I
> > find out this information only when I start reading the file. So, I
> > thought it would be nice to do something like:
> >
> > 1) Declare outputVector as allocatable;
> > 2) Start reading the file;
> > 3) Find the outputVector dimension and allocate it;
> > 4) Read the data in the outputVector;
> > 5) Return this outputVector.
> >
> > It works when I compile it and build it in Fortran as an executable
> > (defining a "main" program in my f90 module), but it bombs when I try
> > to use it from Python with the error:
> >
> > C:\Documents and Settings\gavana\Desktop\ECLIPSEReader>prova.py
> > Traceback (most recent call last):
> >  File "C:\Documents and
> > Settings\gavana\Desktop\ECLIPSEReader\prova.py", line 3, in <module>
> >    inteHead, propertyNames, propertyTypes, propertyNumbers =
> > ECLIPSEReader.init.readinspec("OPT_INJ.INSPEC")
> > ValueError: failed to create intent(cache|hide)|optional array-- must
> > have defined dimensions but got (-1,)
> >
> >
> > So, I have tried with a suggestion given in the f2py mailing list, and
> > I found out that this routine works:
> >
> >
> > MODULE DUMMY
> > IMPLICIT NONE
> >
> > ! Ok, so I want an allocatable array as output
> >
> > real(8), allocatable :: realOutput(:)
> >
> > CONTAINS
> >
> >        subroutine AllocateDummy(dummyInput)
> >
> >                implicit none
> >                save
> >
> >                ! dummyInput is *not* used, it's here just as
> >                ! an example
> >                integer, intent(in) :: dummyInput
> >
> >                ! Allocate and build the output array
> >                allocate(realOutput(10))
> >
> >                realOutput(1:10) = 0.0
> >                realOutput(3) = 3.0
> >                realOutput(7) = 7.0
> >
> >                deallocate(realOutput)
> >
> >                return
> >
> >        end subroutine AllocateDummy
> >
> >
> > END MODULE DUMMY
> >
> >
> >
> > But this one doesn't work:
> >
> >
> > MODULE DUMMY
> > IMPLICIT NONE
> >
> > ! Ok, so I want an allocatable array as output
> >
> > real(8), allocatable :: realOutput(:)
> > integer, allocatable :: inteOutput(:)
> >
> > CONTAINS
> >
> >        subroutine AllocateDummy(dummyInput)
> >
> >                implicit none
> >                save
> >
> >                ! dummyInput is *not* used, it's here just as
> >                ! an example
> >                integer, intent(in) :: dummyInput
> >
> >
> >                ! Allocate and build the output array
> >                allocate(realOutput(10))
> >                allocate(inteOutput(20))
> >
> >                realOutput(1:10) = 0.0
> >                realOutput(3) = 3.0
> >                realOutput(7) = 7.0
> >
> >                inteOutput(10) = 2
> >
> >                deallocate(realOutput)
> >                deallocate(inteOutput)
> >
> >                return
> >
> >        end subroutine AllocateDummy
> >
> >
> > END MODULE DUMMY
> >
> >
> >
> > The difference between the 2 scripts, is just that in the second one I
> > want 2 allocatable arrays instead of 1. When I compile it with f2py, I
> > get this warning from getarrdims:
> >
> > Building modules...
> >        Building module "dummy"...
> >                Constructing F90 module support for "dummy"...
> >                  Variables: realoutput inteoutput
> > getarrdims:warning: assumed shape array, using 0 instead of ':'
> > getarrdims:warning: assumed shape array, using 0 instead of ':'
> >                        Constructing wrapper function "dummy.allocatedummy"...
> >                          allocatedummy(dummyinput)
> >
> >
> > Which is not present if I compile script number 1. Actually, if I run
> > script 2, I can't access anymore the 2 variables realoutput and
> > inteoutput (they are not there), while with script 1 I can easily
> > access realoutput by writing dummy.dummy.realoutput.
> > I can't actually see any big difference between the 2 scripts... am I
> > missing something?
> >
> > This is Windows XP, Python 2.5, numpy 1.0.3.1, Compaq Visual Fortran
> > 6.6, MS Visual Studio .NET 2003.
> >
> > Thank you for all your suggestions, I am at loss.
> >
> > Andrea.
> >
> > "Imagination Is The Only Weapon In The War Against Reality."
> > http://xoomer.alice.it/infinity77/
> > _______________________________________________
> > Numpy-discussion mailing list
> > Numpy-discussion@scipy.org
> > http://projects.scipy.org/mailman/listinfo/numpy-discussion
> >
>
>
> --
> Lisandro Dalcín
> ---------------
> Centro Internacional de Métodos Computacionales en Ingeniería (CIMEC)
> Instituto de Desarrollo Tecnológico para la Industria Química (INTEC)
> Consejo Nacional de Investigaciones Científicas y Técnicas (CONICET)
> PTLC - Güemes 3450, (3000) Santa Fe, Argentina
> Tel/Fax: +54-(0)342-451.1594
> _______________________________________________
> Numpy-discussion mailing list
> Numpy-discussion@scipy.org
> http://projects.scipy.org/mailman/listinfo/numpy-discussion
>



-- 
Andrea.

"Imagination Is The Only Weapon In The War Against Reality."
http://xoomer.alice.it/infinity77/


More information about the Numpy-discussion mailing list