Kode Octree di Fortran

10

Saya baru mengenal komputasi ilmiah. Saya mencari implementasi Fortran (lebih disukai f90) dari Octree.

Masalah saya memerlukan Oktree yang membagi domain saya sampai tidak ada lebih dari beberapa partikel N (atau sumber di mana saya tahu nilai kerapatan yang dapat dicolokkan dalam metode persamaan integral untuk menyelesaikan persamaan seperti persamaan Laplace) di kotak mana pun.

Yang bisa saya temukan hanyalah implementasi C ++ ini . Saya ingin tahu apakah sudah ada perpustakaan Fortran yang bisa saya gunakan.

Juga, rekomendasi makalah yang baik tentang implementasi Octree di Fortran yang dapat digunakan sehingga menerapkan metode persamaan integral cepat pada kotak komputasi menjadi mudah, akan dihargai!

Rivendell
sumber
Coba BoxLib. Menurut manual ada versi Fortran 90 murni. Lihat ccse.lbl.gov/BoxLib/BoxLibUsersGuide.pdf
stali

Jawaban:

9

Saya tidak punya pengalaman dengan Octrees, tetapi setiap kali ada beberapa perpustakaan C ++ yang bagus yang ingin saya gunakan di Fortran, saya cukup menulis driver C sederhana --- biasanya beberapa fungsi C yang melakukan persis apa yang saya butuhkan. Lalu saya memanggil mereka dari Fortran menggunakan modul iso_c_binding. Ini memiliki keuntungan besar bahwa Anda menggunakan kembali perpustakaan yang sudah teruji dengan komunitas di sekitarnya.

Untuk informasi cara menggunakan iso_c_binding, saya menulis beberapa informasi di sini:

http://fortran90.org/src/best-practices.html#interfacing-with-c

info khusus ini untuk memanggil Fortran dari C. Saya dapat melihat bahwa saya harus memperbaruinya. Berikut adalah kode saya di mana saya memanggil perpustakaan C ++ dari Fortran, tautan pertama adalah driver C sederhana, tautan kedua adalah antarmuka Fortran, dan kemudian saya menyebutnya seperti subrutin Fortran lainnya:

https://github.com/certik/hfsolver/blob/master/src/qc_libint.cpp

https://github.com/certik/hfsolver/blob/master/src/qc.f90

Ondřej Čertík
sumber
6

Anda tampaknya sangat siap menggunakan Fortran. Oktaf, ketika diimplementasikan secara efisien, adalah struktur data yang agak kompleks dan, dengan demikian, lebih cocok untuk bahasa pemrograman yang memiliki lebih banyak dukungan untuk ini, seperti C / C ++. Ada sejumlah implementasi berkualitas sangat tinggi di C / C ++ yang bisa Anda gunakan.

Wolfgang Bangerth
sumber
Terima kasih atas jawaban anda! Tapi, metode integral cepat yang saya gunakan ditulis dalam Fortran. Itu wajar untuk menulis kode Octree di Fortran juga.
Rivendell
Metode integral mana yang cepat? Mereka sebagian besar semuanya dibungkus dalam bahasa tingkat yang lebih tinggi, yang juga membungkus oktri juga. . .
meawoppl
Dukungan apa untuk implementasi octree efisien yang tidak ada di Fortran (modern) dibandingkan dengan C? Satu-satunya downside nyata yang saya tahu adalah bilangan bulat unsigned hilang, sehingga Anda harus menulis beberapa operasi bitwise secara eksplisit.
Jannis Teunissen
@ JannisTeunissen - bukan Fortran 200x yang tidak memiliki cara untuk membuat struktur data yang kompleks, ini lebih tentang betapa mudahnya (atau tidak). C ++, misalnya, telah std::map, std::multimap, std::vector, std::sort, dan seterusnya dan sebagainya, semua independen umum avaiable dari jenis data yang mendasari disimpan. Tidak ada argumen yang dapat Anda lakukan semua ini di Fortran hari ini, tetapi itu membutuhkan hari dan minggu kerja yang dapat Anda gunakan secara produktif untuk benar-benar bekerja pada aplikasi Anda, daripada pada struktur data yang mendasarinya.
Wolfgang Bangerth