最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python調(diào)用Fortran的三種形式

 更新時間:2023年04月13日 09:24:59   作者:大作家佚名  
這篇文章主要介紹了在Python中調(diào)用Fortran的三種形式,文中有詳細(xì)的代碼示例,感興趣的同學(xué)可以參考閱讀

1. 簡介

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

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

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

步驟3:

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

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

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

2.2 使用動態(tài)鏈接庫調(diào)用Fortran

步驟1:

修改上面的Fortran代碼,用result返回函數(shù)結(jié)果,指定輸入和返回數(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)

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。

3. 總結(jié)

方法1:比較推薦,針對Python編程,如果返回數(shù)據(jù)類型復(fù)雜,也不是太方便;
方法2:過于繁瑣不推薦;
方法3:是一種需要首先編譯出可執(zhí)行程序然后調(diào)用,交互性不方便。如果將輸入輸出寫為固定文件,然后由Python生產(chǎn)輸入文件,由Python讀取輸出文件,也是一種比較好的選擇。

到此這篇關(guān)于Python調(diào)用Fortran的三種形式的文章就介紹到這了,更多相關(guān)Python調(diào)用Fortran內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python正則過濾字母、中文、數(shù)字及特殊字符方法詳解

    python正則過濾字母、中文、數(shù)字及特殊字符方法詳解

    這篇文章主要介紹了python正則過濾字母、數(shù)字及特殊字符方法詳解,需要的朋友可以參考下
    2020-02-02
  • python剪切視頻與合并視頻的實現(xiàn)

    python剪切視頻與合并視頻的實現(xiàn)

    這篇文章主要介紹了python剪切視頻與合并視頻的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • python IDLE添加行號顯示教程

    python IDLE添加行號顯示教程

    這篇文章主要介紹了python IDLE添加行號顯示教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • python常用數(shù)據(jù)結(jié)構(gòu)字典梳理

    python常用數(shù)據(jù)結(jié)構(gòu)字典梳理

    這篇文章主要介紹了python常用數(shù)據(jù)結(jié)構(gòu)字典梳理,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • Python迷宮生成和迷宮破解算法實例

    Python迷宮生成和迷宮破解算法實例

    今天小編就為大家分享一篇Python迷宮生成和迷宮破解算法實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python的exec、eval使用分析

    python的exec、eval使用分析

    這篇文章主要介紹了python的exec、eval使用分析,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • python實現(xiàn)的批量分析xml標(biāo)簽中各個類別個數(shù)功能示例

    python實現(xiàn)的批量分析xml標(biāo)簽中各個類別個數(shù)功能示例

    這篇文章主要介紹了python實現(xiàn)的批量分析xml標(biāo)簽中各個類別個數(shù)功能,涉及Python針對xml文件的遍歷、讀取、解析等相關(guān)操作技巧,需要的朋友可以參考下
    2019-12-12
  • Sanic框架路由用法實例分析

    Sanic框架路由用法實例分析

    這篇文章主要介紹了Sanic框架路由用法,結(jié)合實例形式較為詳細(xì)的分析了Sanic框架路由的原理、請求參數(shù)、請求類型、重定向等相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07
  • 如何用Python搭建gRPC服務(wù)

    如何用Python搭建gRPC服務(wù)

    gRPC是一個高性能、通用的開源RPC框架,其由Google主要面向移動應(yīng)用開發(fā)并基于HTTP/2協(xié)議標(biāo)準(zhǔn)而設(shè)計,基于ProtoBuf序列化協(xié)議開發(fā),且支持眾多開發(fā)語言
    2021-06-06
  • 使用Python的pygame庫實現(xiàn)下雪效果的示例代碼

    使用Python的pygame庫實現(xiàn)下雪效果的示例代碼

    這篇文章給大家介紹了如何使用Python的pygame庫實現(xiàn)下雪的效果,文中通過代碼示例介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的的幫助,需要的朋友可以參考下
    2024-01-01

最新評論

辰溪县| 汤阴县| 大悟县| 保亭| 溆浦县| 靖远县| 竹溪县| 商洛市| 巴马| 太湖县| 云霄县| 宝应县| 杨浦区| 仙游县| 柘城县| 邵阳县| 蚌埠市| 邢台市| 黄骅市| 夹江县| 寻乌县| 肇源县| 汉中市| 武宁县| 麦盖提县| 河池市| 肃南| 隆安县| 商南县| 盱眙县| 柳江县| 札达县| 安远县| 如东县| 林口县| 闻喜县| 祁东县| 偃师市| 贡觉县| 信丰县| 阳春市|