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?
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. –
@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
Verwenden Sie kein Dim-Array, sondern einzelne skalare Variablen dim1 und dim2. –