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 <[EMAIL PROTECTED]> 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/ _______________________________________________ Numpy-discussion mailing list Numpy-discussion@scipy.org http://projects.scipy.org/mailman/listinfo/numpy-discussion