F2py ile oynuyorum. Ben numran intrinsic türleri vs fortran 90 türleri hakkında biraz kafam karıştı. Python ile etkileşime girdiğinde, yalnızca 90'lı yıllardaki tekli hassas işleri kullanabiliyorum gibi görünüyor. f2py: Python ile arabirim oluştururken Fortran'da gerçek kesinlik belirtiliyor mu?
Ben f2py ile derlenmiş ve piton ithal edilecek, bu Fortran 90 modülü, test.f90 olduğunu varsayalım:module test
implicit none
integer, parameter :: sp = selected_real_kind(6,37) ! single precision
integer, parameter :: dp = selected_real_kind(15,307) ! double precision
real(sp) :: r_sp = 1.0
real(dp) :: r_dp = 1.0_dp
end module
ve böyle derlemek: Bir örnekle açıklayalım
f2py c -m Test test.f90
Sonra python:
>>> import test
>>> test.test.r_sp
array(1.0, dtype=float32)
>>> test.test.r_dp
array(1.0)
IOW, f2py çift duyarlığı kabul etmiyor gibi görünüyor. Bu, girdiyi pitondan bir fortran 90 alt programına geçirirken daha da sorunlu hale gelir. Ben benim modülü uzatmak ki:
module test
implicit none
integer, parameter :: sp = selected_real_kind(6,37) ! single precision
integer, parameter :: dp = selected_real_kind(15,307) ! double precision
real(sp) :: r_sp = 1.0
real(dp) :: r_dp = 1.0_dp
contains
subroutine input_sp(val)
real(sp), intent(in) :: val
real(sp) :: x
x = val
write(*,*) x
end subroutine
subroutine input_dp(val)
real(dp), intent(in) :: val
real(dp) :: x
x = val
write(*,*) x
end subroutine
end module
f2py Yani
>>> import test
>>> test.test.input_sp(array(1.0,dtype=float32))
1.0000000
>>> test.test.input_sp(array(1.0,dtype=float64))
1.0000000
>>> test.test.input_dp(array(1.0,dtype=float32))
-1.15948430791165406E+155
>>> test.test.input_dp(array(1.0,dtype=float64))
-1.15948430791165406E + 155
piton test.f90
testi -m -c, herhangi gibi görünüyor python'dan gönderilecek giriş değişkeni tek bir hassasiyet olarak bildirilmelidir. Bu f2py ile bilinen bir sorun mu? Ayrıca
, bir takip sorusu olarak: Aşağıdaki anlamda çalışmalarını dp için sp dönüştürme:subroutine input_sp_to_dp(val)
real(sp), intent(in) :: val(2)
real(dp) :: x(2)
x = val
write(*,*) x
end subroutine
Ama bu özel derleyici hiç olduğunu acaba? Yukarıdaki altprogramın herhangi bir mimaride herhangi bir derleyiciyle doğru şeyi yapmasını bekleyebilir miyim? Test ederken, yukarıdaki tüm örnekler için gfortran kullandım.
Cevabınız için teşekkürler. İlk olarak yöntem 2'yi yaptım ve bu iyi çalıştı. Ama sonra bunu yazdığım gerçek bir programa uygulamayı denedim, bu da derlemeyi bir setup.py dosyası aracılığıyla yapmak ve benzerleri yapmak için gerekenleri kullanır. Daha sonra, bir .f2py_cmap dosyasının sahip olmasının, yapı sırasında .f2py_cmap uygulamasından başarıyla uygulanan değişiklikleri uygulamasına rağmen, yeterli olmadığını buldum. Bu nedenle, 3. yöntemi kullanmam gerekti. Aslında, hassas değişkenlerin tanımları için ayrı bir modül kullanıyordum, fakat modülün üst kısmının, kullanılan tek alt yordamlar içinde değil, kullanılan 'kullanım türleri' ifadesi vardı. – arne