[Numpy-discussion] [F2PY]: Allocatable Arrays

Lisandro Dalcin dalcinl at gmail.com
Fri Feb 1 08:59:12 EST 2008


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?

How much complicated is your binary format? For simple formats, you
can just use numpy to read binary data, I use this sometimes, but
again, for simple formats.



On 2/1/08, Andrea Gavana <andrea.gavana at 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 at 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



More information about the NumPy-Discussion mailing list