แพ็คเกจใดที่ฉันควรใช้เพื่อห่อ Modern Fortran Code กับ Python


27

ฉันรู้และใช้f2py2eเพื่อห่อรหัส Fortran 77 เก่าบางส่วน แต่ความเข้าใจของฉันคือว่ามันไม่ทำงานกับรหัส Fortran 95 ที่ใหม่กว่า ฉันได้ค้นคว้าสิ่งที่ฉันควรใช้และเจอ fwrap และ G3 f2py ซึ่งดูเหมือนจะไม่ให้คำอธิบายใด ๆ เกี่ยวกับสถานะปัจจุบันของพวกเขาหรือวิธีใช้ (นอกเหนือจากการใช้งานพื้นฐาน)

ฉันได้เห็นด้วยเช่นกันว่าเวอร์ชันของ f2py มีตัวเลือกให้ใช้รุ่นที่สามของ f2py แต่มันก็มีความเห็นว่าเป็นการใช้งานไม่ได้ รับสิ่งนี้ฉันไม่ทราบว่าโครงการใดที่ฉันควรใช้สำหรับโครงการเดียว ฉันควรใช้รหัสใดกับรหัสใหม่

ป.ล. นี่เป็นคำถามเดียวกันกับhttps://stackoverflow.com/questions/10665717/current-best-method-for-wrapping-modern-fortran-code-with-pythonแนะนำว่าการถามที่นี่อาจให้คำตอบที่ดีกว่า .


2
"Modern Fortran"
meawoppl

คำตอบ:


19

คุณสามารถใช้งูหลาม builtin ctypesโมดูลตามที่อธิบายไว้ในfortran90.org มันค่อนข้างตรงไปตรงมาและไม่ต้องการการพึ่งพาจากภายนอก นอกจากนี้ตัวช่วยประเภท arg ndinterinterยังมีประโยชน์มาก


8
ถูกตัอง. หรือใช้ Cython แทน ctypes ตามที่อธิบายไว้ในหน้า fortran90.org
OndČejČertík

@ OndřejČertíkเว็บไซต์ที่ยอดเยี่ยม! มีทรัพยากรที่มีค่าน้อยใน Fortran ที่ทันสมัยบนอินเทอร์เน็ต แต่นี่เป็นหนึ่งในรายการโปรดของฉันพร้อมกับ fortranwiki.org
astrojuanlu

6

ส่วนตัวผมใช้ f2py สำหรับสิ่งนี้ อย่างไรก็ตาม Fortran ที่ฉันเขียนสำหรับ f2py นั้นไม่ใช่ Fortran ที่ทันสมัยจริงๆ แต่แทนที่จะเป็น F90 แบบฟรีฟอร์มที่มีโมดูล ฉันไม่ใช้รูปร่างหรือประเภทแบบกำหนดเองที่สันนิษฐาน วิธีนี้ยังใช้ได้ดีสำหรับฉัน

มีทรัพยากรที่ฉันต้องการแบ่งปันเกี่ยวกับการใช้ C เป็นส่วนหนึ่งของการตัดคำ แนะนำให้ใช้ส่วนที่เหลือของหน้านี้ด้วย


1
อัปเดตในปี 2015: สักพักหนึ่งการเชื่อมต่อ Fortran ทั้งหมดของฉันเกิดขึ้นผ่าน Cython และ iso_c_binding สิ่งนี้ช่วยให้สามารถรักษารหัส Fortran ให้ทันสมัยอยู่เสมอในขณะที่เปิดเผยเฉพาะสิ่งที่จำเป็นสำหรับ Cython / C
AlexE

อัปเดตปี 2559: ตัวเลือก iso_c_binding ง่ายขึ้นกว่าตอนนี้ฉันสามารถคอมไพล์ไฟล์. pyx โดยใช้cythonคำสั่งและลดการทับซ้อนระหว่างการเปลี่ยนรหัส fortran หรือรหัสหลามของฉันและทำให้ทุกอย่างทำงานได้อย่างรวดเร็ว
cbcoutinho

5

เอกสารของ f2py นั้นยอดเยี่ยมมาก ผมอยู่ในขั้นตอนของการย้ายโครงการของตัวเองจาก f2py ไปCython แม้ว่า Cython สามารถใช้เพื่อห่อรหัส C แต่ฉันพบว่ามันมีประโยชน์มากที่สุดสำหรับการสร้างรหัสประสิทธิภาพสูงใหม่ หากความตั้งใจของคุณคือการเขียนรหัส Fortran ใหม่ห่อมันและเรียกมันใน Python ฉันแนะนำให้คุณใช้ Cython แทน ด้วยวิธีนี้คุณสามารถเขียนโค้ด Python และหากมีปัญหาคอขวดของประสิทธิภาพคุณโอนย้ายไปยัง Cython ด้วยการแก้ไขเล็กน้อย


ดังนั้นแทนที่จะใช้ Fortran ใช้ Cython สำหรับรหัสที่ช้าลง?
James Tocknell

2
แน่นอน! ฉันพบว่ามันง่ายกว่ามากเพราะรหัส Cython ของคุณสามารถโต้ตอบกับวัตถุ Python และอาร์เรย์ Numpy ตามธรรมชาติ (โดยไม่ต้องมีเลเยอร์การแปลงพิเศษ) สิ่งนี้มีประโยชน์เป็นพิเศษหากคุณต้องการใช้โครงสร้างข้อมูลของคุณเอง การทำให้ Fortran หรือ C ใช้คลาส Python ของคุณใน f2py นั้นไม่ใช่งานตรงไปตรงมา
Leo Uieda

3

f90wrapสร้างบน f2py และสร้าง wrapper Python โดยอัตโนมัติสำหรับฐานรหัส Fortran พื้นฐานรวมถึงการเข้าถึงชนิดที่ได้รับ ตัวอย่างง่ายๆชุดหนึ่งแสดงวิธีการทำงาน


2

คุณสามารถใช้FortWrapเพื่อไปครึ่งทาง สิ่งนี้จะสร้างอินเทอร์เฟซ C ++ ให้กับรหัส Fortran ของคุณซึ่งสามารถห่อด้วยSWIGเพื่อรับอินเทอร์เฟซ Python เราทำสิ่งนี้บนฐานรหัส Fortran ที่ค่อนข้างใหญ่และทำงานได้ค่อนข้างดี (อันที่จริง FortWrap ได้รับการพัฒนาโดยสมาชิกของทีมของเราเพื่อจุดประสงค์ที่แน่นอนนี้)


1

fwrapเฉพาะเป้าหมาย Fortran90 / 95 f2pyและใช้บางส่วนของสแต็คซอฟแวร์เช่นเดียวกับ


3
ความมุ่งมั่นล่าสุดของ repo GitHub ของโครงการนี้คือช่วงปลายปี 2010
Geoff Oxberry

1
ในขณะที่ฉันเห็นด้วยว่ามันทำให้ฉันท้อใจ แต่ก็ยังประสบความสำเร็จอยู่ดี นอกกรอบมันใช้งานได้ดีกว่าf2pyบน F90 นอกจากนี้ยังมีสิ่งกีดขวางทางเข้าน้อยมาก ฉันดีใจที่ได้พบมัน
MRocklin

1

f2pyรองรับ Fortran ที่ทันสมัย ​​(อาร์เรย์ที่มีรูปทรงสมมติและอื่น ๆ ) โปรดดูตัวอย่างสคริปต์

นอกจากนี้สำหรับการทดสอบด้วยรหัส fortran ฉันขอแนะนำเวทมนตร์ IPythonซึ่งติดตั้งง่ายและสะดวกมาก (ใช้ f2py เช่นกัน)


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.