2013-11-14 6 views
7

Ich kann f2py nicht dazu bringen, einen Parameter von einem Modul in einer separaten Unterroutine zu referenzieren, wo es verwendet wird, um eine Eingabearraydimension zu definieren. I.e.F2PY - Zugriff auf Modulparameter aus Unterprogramm

! File: testmod.f90 
MODULE testmod 
INTEGER, PARAMETER :: dimsize = 20 
END MODULE testmod 

und der Parameter dimsize in einem Unterprogramm referenziert werden muss (nicht im Modul enthielt) in einer anderen Datei, die der Einstiegspunkt für meinen Python-Modul sein wird: die Paramter werden in ein Modul defeind

! File testsub.f90 
SUBROUTINE testsub(arg) 
USE testmod 
REAL, INTENT(IN) :: arg(dimsize) 
END SUBROUTINE testsub 

ich kompilieren wie folgt aus:

f2py -m testmod -h testmod.pyf testsub.f90 
pgf90 -g -Mbounds -Mchkptr -c -fPIC testmod.f90 -o testmod.o 
pgf90 -g -Mbounds -Mchkptr -c -fPIC testsub.f90 -o testsub.o 
f2py -c testmod.pyf testmod.o testsub.o 

aber diese Fehlermeldung erhalten:

testmodmodule.c: In function 'f2py_rout_testmod_testsub': 
testmodmodule.c:180: error: 'dimsize' undeclared (first use in this function) 

Ich habe versucht, testsub.g90 enthalten die folgende Anweisung, wie vorgeschlagen ni andere Beiträge ändern:

SUBROUTINE testsub(arg) 
USE testmod 
!f2py integer, parameter :: dimsize 
REAL, INTENT(IN) :: arg(dimsize) 
END SUBROUTINE testsub 

, aber ohne Erfolg. Ich muss das Unterprogramm vom Modul getrennt halten.

Wie bekomme ich f2py, um die Variable dimsize korrekt aufzulösen?

TIA

+0

Ich habe das gleiche Problem mit 'ifort' auf Windows 7, mit f2py Version 2. Das Problem scheint bei der _first_f2py Aufruf auftreten, wo ich den Fehler: ' In:: testmoddd: testsub.f90: testsub get_useparameters: kein modul testmod info verwendet von testub In:: testmoddd: testub.f90: testub getarrlen: Variable "Dimsize" undefined' – bdforbes

+0

@bdforbes: hmmm .... Ich fange an zu denken, dass dies nur ein ernstes ist Nachteil von f2py bei der Verwendung von Fortran90. Ich hätte bei F77 bleiben sollen! – ccbunney

Antwort

1

Obwohl ich es nicht getestet habe, Ich denke Sie haben es fast mit Ihrem ursprünglichen Code. Wir machen etwas ähnliches für einige unserer Code, aber mit gfortran.

Sie sollten die Datei testmod.f90 nicht benötigen f2py. Sie sollten kompilieren es nur zu einer Objektdatei wie würden Sie, wenn das normal Fortran waren:

pgf90 -g -Mbounds -Mchkptr -c -fPIC testmod.f90 -o testmod.o 

Dann sollten Sie in der Lage sein, Ihre testsub.f90 in ein Python-verwendbares Modul zu kompilieren mit:

f2py --fcompiler=pgf90 --f90flags="-g -Mbounds -Mchkptr" -c testsub.f90 -m testsub testmod.o 

Das sollte eine testsub.so, oder gleichwertiges, erstellen lassen Sie import testsub und dann testsub.testsub(my_arg) in Python.

+0

Danke für die Antwort, aber leider bekomme ich den gleichen Fehler ... – ccbunney

+0

Hmmm, hast du es mit einem anderen Compiler versucht? Ich habe nur gfortran mit f2py verwendet ... – cm2

+1

Ich habe es noch einmal versucht mit --fcompiler = gfortran, aber ich bekomme die gleichen Fehler. Es ist im Wesentlichen der c-Compiler, der die Fehler erzeugt, nicht der Fortran-Compiler. Ich denke, dass f2py einfach nicht gut mit den F90-Modulen umgehen kann ... – ccbunney

2

Es ist lange her, seit diese Frage irgendeine Aktivität bekommen hat, aber ich habe das Problem herausgefunden, also dachte ich, ich würde es für jeden anderen veröffentlichen, der dieses Problem hat. Das Problem ist, dass, während der Fortran-Code vollkommen gültig ist, der von F2PY erzeugte C-Wrapper nicht weiß, was Dimsize ist, wenn er überprüft, dass die Arrays die richtige Größe haben (innerhalb des C-Wrappers ist er in irgendeine Art von Modulstruktur eingekapselt).

einfach diesen Code ändern:

SUBROUTINE testsub(arg) 
USE testmod 
!f2py integer, parameter :: dimsize 
REAL, INTENT(IN) :: arg(dimsize) 
END SUBROUTINE testsub 

dazu:

SUBROUTINE testsub(arg) 
USE testmod 
!f2py integer, intent(aux) :: dimsize 
REAL, INTENT(IN) :: arg(dimsize) 
END SUBROUTINE testsub 

Dies wird "Define Hilfs C Variable in f2py Wrapperfunktion erzeugt". Wie die Scipy docs sagen, ist dies "nützlich, um Parameterwerte zu speichern, so dass sie in Initialisierungsausdruck anderer Variablen zugegriffen werden können".

Ich habe dies nicht mit Ihrem Code getestet, aber ich habe es mit einer ähnlichen Situation getestet, die ich hatte.

+0

schön! Ich hatte dieses Problem auch, als ich ein Array in einer Subroutine deklarierte, deren Dimension einen im Modul * same * definierten Parameter verwendete, und dies wurde behoben. –

Verwandte Themen