2017-04-10 5 views
0

Ich habe eine Subroutine, die ich in Fortran schreiben mit f2py kompiliert werden und die Kompilierung schlägt fehl. Ich werde nicht das volle Unterprogramm hier posten, aber ein MWE ist:Unterroutine mit Array-Ausgabe mit f2py kann nicht kompiliert werden

SUBROUTINE mwe(Vars, nxc, nyc, vCorr) 
IMPLICIT NONE 
real(kind=8), dimension(:,:,:,:) :: Vars 
integer :: nxc, nyc 
integer :: dims(4), nv, nt, nx, ny 
real(kind=8), intent(out), allocatable :: vCorr(:,:,:,:) 

dims = shape(Vars) 
nv=dims(1) 
nt=dims(2) 
nx=dims(3) 
ny=dims(4) 
allocate(vCorr(nv, nt, 2*nxc+1, 2*nyc+1)) 

print*,size(vCorr) 
print*,size(Vars) 
END SUBROUTINE 

Dieser schlägt mit

/tmp/tmpy43di1/src.linux-x86_64-2.7/mwe-f2pywrappers.f:30:31: 

     call mwe(vars, nxc, nyc, vcorr) 
           1 
Error: Actual argument for ‘vcorr’ must be ALLOCATABLE at (1) 

die offenbar bedeutet, dass f2py nicht zuordenbaren Ausgang Arrays akzeptiert. Also habe ich versucht, dieses Problem zu umgehen, indem sie die Form Vars als Array übergeben, so vCorr hat nicht zugeordnet werden, was führte mich zu diesem Code

SUBROUTINE mwe(Vars, nxc, nyc, dims, vCorr) 
IMPLICIT NONE 
real(kind=8), dimension(:,:,:,:) :: Vars 
integer :: nxc, nyc 
integer :: dims(4) 
real(kind=8) :: vCorr(dims(1),dims(2),2*nxc+1,2*nyc+1) 

print*,size(vCorr) 
print*,size(Vars) 
END SUBROUTINE 

, die mit diesem Fehler fehlschlägt

/tmp/tmp0Y1S9x/src.linux-x86_64-2.7/mwemodule.c:296:39: error: called object ‘dims’ is not a function or function pointer 
    vcorr_Dims[0]=dims(1),vcorr_Dims[1]=dims(2),vcorr_Dims[2]=2 * nxc + 1,vcorr_Dims[3]=2 * nyc + 1; 

Nach einigem Hinsehen bin ich auf this page gestoßen, was mich glauben lässt (obwohl ich f2py2 benutze und nicht 3), dass dies ein Fehler ist.

Irgendwelche Vorschläge dazu?

+0

Der Vorschlag besteht nicht darin, zuweisbare Array-Argumente zu verwenden. F2py unterstützt sie nicht. Wahrscheinlich gibt es ein Duplikat herum. Der andere sieht wie ein Fehler aus. –

+0

@VladimirF Ja, aber, wenn die Option, die zuweisbare Arrays verwendet, nicht unterstützt wird, und die andere mir einen Fehler gibt, was sind die anderen Optionen? – TomCho

+0

Verwenden Sie kein Dim-Array, sondern einzelne skalare Variablen dim1 und dim2. –

Antwort

0

Im ersten Beispiel unterstützt f2py nicht zuweisbare Array-Argumente. Sie passen nicht gut zu Python-Arrays. In dem anderen Beispiel versteht f2py nicht dims(1),dims(2) in vCorr(dims(1),dims(2). Array-Elemente werden dort nicht unterstützt. Dies ist ein Fehler.

Als Abhilfe Verwendung Skalarvariablen für die Dimensionen

SUBROUTINE mwe(Vars, nxc, nyc, dim1, dim2, vCorr) 
    integer, parameter :: dp = kind(1.d0) 
    real(dp), dimension(:,:,:,:) :: Vars 
    integer :: nxc, nyc 
    integer :: dim1, dim2 
    real(dp) :: vCorr(dim1,dim2,2*nxc+1,2*nyc+1) 

Hinweis: kind=8 ist hässlich und nicht tragbar. Die wahre Bedeutung ist NICHT 8 Byte, obwohl es in vielen Compilern 8 Byte Realen entspricht. Aber nicht in allen. Sogar das gute alte double precision ist besser.

+0

Ich verstehe das, aber ich habe versucht, das zu vermeiden, weil mein Plan ist, diese Routine auf Arrays mit mehr Dimensionen (wahrscheinlich 6 oder mehr) zu erweitern. So wird es zum Problem, dass viele einzelne Zahlen in der richtigen Reihenfolge übergeben werden. Gibt es keinen anderen Weg? – TomCho

+0

Ich glaube nicht. Sie könnten abgeleiteten Typ versuchen, ich erwarte das gleiche Problem. –

Verwandte Themen