Paket mana yang harus saya gunakan untuk membungkus Kode Fortran Modern dengan Python?

27

Saya tahu, dan telah menggunakan f2py2e untuk membungkus beberapa kode Fortran 77 lama, tetapi pemahaman saya adalah bahwa itu tidak bekerja dengan kode Fortran 95 yang lebih baru. Saya telah meneliti apa yang harus saya gunakan, dan telah menemukan fwrap dan G3 f2py, yang keduanya tidak memberikan penjelasan tentang keadaan mereka saat ini, atau bagaimana menggunakannya (di luar penggunaan dasar).

Saya juga telah melihat bahwa versi f2py memiliki opsi untuk menggunakan f2py generasi ketiga, tetapi dikomentari sebagai non-fungsional. Mengingat ini, saya tidak tahu proyek mana yang harus saya gunakan untuk proyek uni. Mana yang harus saya gunakan untuk kode baru?

PS Ini pada dasarnya pertanyaan yang sama dengan /programming/10665717/current-best-method-for-wrapping-modern-fortran-code-with-python , disarankan bahwa bertanya di sini mungkin memberikan jawaban yang lebih baik .

James Tocknell
sumber
2
"Modern Fortran"
meawoppl

Jawaban:

19

Anda dapat menggunakan modul ctypes builtin Python seperti yang dijelaskan di fortran90.org . Ini cukup lurus ke depan dan tidak memerlukan dependensi eksternal. Juga, helper tipe arg ndpointer sangat berguna.

Matthew Emmett
sumber
8
Betul sekali. Atau gunakan Cython sebagai ganti ctypes seperti yang dijelaskan pada halaman fortran90.org.
Ondřej Čertík
@ OndřejČertík, situs web yang bagus! Ada beberapa sumber daya berharga tentang Fortran modern di Internet, tetapi ini jelas salah satu favorit saya bersama dengan fortranwiki.org
astrojuanlu
6

Saya pribadi menggunakan f2py untuk ini. Namun, Fortran yang saya tulis untuk f2py sebenarnya bukan Fortran modern, melainkan F90 bentuk bebas dengan modul. Saya tidak menggunakan bentuk asumsi atau tipe khusus. Metode ini masih berfungsi dengan baik untuk saya.

Ada sumber daya yang ingin saya bagikan mengenai penggunaan C sebagai bagian dari pembungkus. Sisa halaman ini juga direkomendasikan.

AlexE
sumber
1
Pembaruan 2015: sejak beberapa saat, semua antarmuka Fortran saya terjadi melalui Cython dan iso_c_binding. Hal ini memungkinkan untuk menjaga kode Fortran itu sendiri tetap modern sementara hanya mengekspos apa yang benar-benar diperlukan untuk Cython / C.
AlexE
Pembaruan 2016: opsi iso_c_binding semakin mudah sekarang daripada saya hanya bisa mengkompilasi file .pyx menggunakan cythonperintah, dan mengurangi tumpang tindih antara mengubah kode fortran atau kode python saya dan dengan cepat membuat semuanya berfungsi.
cbcoutinho
5

Dokumentasi f2py benar-benar tidak terlalu bagus. Saya sedang dalam proses memindahkan proyek saya sendiri dari f2py ke Cython . Meskipun Cython dapat digunakan untuk membungkus kode C, saya menemukan bahwa itu sangat berguna untuk membuat kode kinerja tinggi baru. Jika maksud Anda adalah untuk menulis kode Fortran baru, bungkus, dan panggil dengan Python, saya sarankan Anda menggunakan Cython saja. Dengan begitu Anda dapat menulis kode Python, dan jika ada hambatan kinerja, Anda mentransfernya ke Cython dengan modifikasi kecil.

Leo Uieda
sumber
Jadi daripada menggunakan Fortran gunakan Cython untuk bit kode yang lebih lambat?
James Tocknell
2
Persis! Saya telah menemukan bahwa ini jauh lebih mudah karena kode Cython Anda dapat berinteraksi dengan objek Python dan array Numpy secara alami (tanpa lapisan konversi tambahan). Ini sangat membantu jika Anda ingin menggunakan struktur data Anda sendiri. Membuat Fortran atau C menggunakan Anda kelas Python di f2py bukanlah tugas yang mudah.
Leo Uieda
3

f90wrap dibangun di atas f2py dan secara otomatis menghasilkan pembungkus Python untuk basis kode Fortran yang mendasarinya, termasuk akses ke jenis turunan. Seperangkat contoh sederhana menunjukkan cara kerjanya.

DavidVitch
sumber
2

Anda bisa menggunakan FortWrap untuk membuat Anda setengah jalan di sana. Ini akan membuat antarmuka C ++ ke kode Fortran Anda, yang kemudian dapat dibungkus dengan SWIG untuk mendapatkan antarmuka Python. Kami melakukan ini pada basis kode Fortran yang agak besar dan bekerja cukup baik (pada kenyataannya, FortWrap dikembangkan oleh anggota tim kami untuk tujuan yang tepat ini).

Barron
sumber
1

fwrapsecara khusus menargetkan Fortran90 / 95 dan menggunakan beberapa tumpukan perangkat lunak yang sama dengan f2py.

MRocklin
sumber
3
Komit terakhir untuk repo GitHub proyek ini adalah akhir 2010.
Geoff Oxberry
1
Sementara saya setuju bahwa itu mengecilkan hati saya masih memiliki kesuksesan yang layak dengannya. Di luar kotak, ini lebih fungsional daripada f2pydi F90. Ini juga memiliki penghalang masuk yang sangat rendah. Saya senang telah menemukannya.
MRocklin
1

f2pymendukung fortran modern (array berbentuk asumsi dan sebagainya), lihat contoh skrip

Juga, untuk percobaan dengan kode fortran saya akan merekomendasikan IPython magic , yang mudah dipasang dan sangat nyaman (ini bergantung pada f2py juga).

Alleo
sumber