溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python調(diào)用Fortran的方法有哪些

發(fā)布時(shí)間:2023-04-18 16:19:36 來源:億速云 閱讀:135 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“Python調(diào)用Fortran的方法有哪些”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

    1. 簡(jiǎn)介

    在一些研究領(lǐng)域很多經(jīng)典算法和工具都由上古語言Fortran編寫,而這部分代碼又沒有對(duì)應(yīng)的C/C++和Python版本。因此,掌握Python語言調(diào)用Fortran程序這一技能,在一些研究領(lǐng)域有助于我們站在巨人的肩上看的更遠(yuǎn)。Python調(diào)用Fortran可以總結(jié)為如下三種:
    1)通過 F2PY:F2PY 是 NumPy 團(tuán)隊(duì)開發(fā)的一個(gè)工具,可以把 Fortran 程序轉(zhuǎn)換為 Python 模塊,從而在 Python 中調(diào)用 Fortran 程序。
    2)通過 ctypes 庫(kù):ctypes 是 Python 內(nèi)置的一個(gè)庫(kù),可以用來調(diào)用外部 C 動(dòng)態(tài)鏈接庫(kù),因此也可以用于調(diào)用 Fortran 程序。通過 ctypes 可以讓 Python 調(diào)用 Fortran 程序,也可以從 Fortran 中調(diào)用 Python 函數(shù)。
    3)利用Python的os包調(diào)用Fortran。

    2. Python調(diào)用Fortran的三種方法

    2.1 基于 F2PY的f2py調(diào)用Fortran

    步驟1:

    計(jì)算圓面積的Fortran函數(shù)。接下來將用下面的函數(shù)進(jìn)行演示。這里的例子是返回一個(gè)參數(shù)的,返回多個(gè)參數(shù)以及修改參數(shù)的Fortran用法。
    Fortran77定義變量時(shí)候不用加::

    function area_of_circle (r)  
    ! function result     
    implicit none      
       ! dummy arguments        
       real :: area_of_circle   
       ! local variables 
       real :: r     
       real :: pi
       pi = 4 * atan (1.0)     
       area_of_circle = pi * r**2  
    end function area_of_circle

    function area_of_circle (r) result(a)
    implicit none
       real :: a
       real :: r
       real :: pi
       pi = 4 * atan (1.0)
       a = pi * r**2
    end

    subroutine area_of_circle (r,a)
    implicit none
       real, intent(out) :: a
       real, intent(in) :: r
       real :: pi
       pi = 4 * atan (1.0)
       a = pi * r**2
    end

    步驟2:

    新建circle.f90后,在終端中運(yùn)行如下代碼:

    python -m numpy.f2py -c circle.f90 -m circle

    具體步驟如下圖,然后可以看到生成的circle.cpython-36m-x86_64-linux-gnu.so

    Python調(diào)用Fortran的方法有哪些

    步驟3:

    在Python中,可以直接import上面的函數(shù)名

    import circle
    print(circle.__doc__)
    print(circle.area_of_circle(2))

    Python調(diào)用Fortran的方法有哪些

    注意上面的__doc __是f2py自動(dòng)生成的,可以看到fortran模塊里面包含幾個(gè)函數(shù),每個(gè)函數(shù)里面還可以再調(diào)用doc看到接口參數(shù)類型。

    2.2 使用動(dòng)態(tài)鏈接庫(kù)調(diào)用Fortran

    步驟1:

    修改上面的Fortran代碼,用result返回函數(shù)結(jié)果,指定輸入和返回?cái)?shù)據(jù)類型。

    function area_of_circle(r) result(area) bind(c, name='area_of_circle')
        use iso_c_binding
        implicit none
        real(c_double) :: area
        real(c_double), intent(in) :: r
        real :: pi
        pi = 4 * atan (1.0)
        area = pi * r**2
    end function area_of_circle

    步驟2:

    2.1節(jié) 所示,在系統(tǒng)終端或者Pycharm終端中輸入命令:

     gfortran -shared circle2.f90 -o circle2.so

    步驟3:

    編寫Python調(diào)用腳本

    import ctypes as ct
    
    # import the shared library
    fortlib = ct.CDLL('./circle2.so')
    
    # Specify arguments and result types
    fortlib.area_of_circle.argtypes = [ct.POINTER(ct.c_double)]
    fortlib.area_of_circle.restype = ct.c_double
    
    # Create a double and pass it to Fotran (by reference)
    a = ct.c_double(2)
    b = fortlib.area_of_circle(ct.byref(a))
    print(b)

    Python調(diào)用Fortran的方法有哪些

    2.3 利用Python的os包調(diào)用Fortran

    步驟1:

    以2.1節(jié)中的Fortran代碼為例,稍作修改,這種方式需要Fortran代碼是完整的程序可編譯為可執(zhí)行程序。下面代碼包含了主函數(shù),即調(diào)用函數(shù)的函數(shù)主體。

    program calling_func
       real :: a
       a = area_of_circle(2.0)
       Print *, "The area of a circle with radius 2.0 is"
       Print *, a
    end program calling_func
    
    function area_of_circle(r)
    ! function result
    implicit none
       ! dummy arguments
       real :: area_of_circle
       ! local variables
       real :: r
       real :: pi
       pi = 4 * atan (1.0)
       area_of_circle = pi * r**2
    end function area_of_circle

    步驟2:

    編譯和調(diào)用,Windows系統(tǒng)注意修改路徑,以及可執(zhí)行程序名后綴應(yīng)該是exe,Linux可執(zhí)行程序后綴可以是out或者沒有。

    import os
    #編譯
    os.system(r"gfortran  ./circle3.f90 -o circle")
    #調(diào)用編譯的circle程序
    os.system('./circle')

    上述代碼就是類似于Windows中調(diào)用cmd。

    “Python調(diào)用Fortran的方法有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI