由于历史缘故,很多成熟的计算代码都是用fortran写成的。在python中调用fortran代码,要用到f2py这个程序。现在该项目已经合并到numpy中了,先安装python再装好numpy,就可以使用f2py。

一个简单的例子:

foo.f90

subroutine hello (a)

integer a

write(*,*)'Hello from Fortran90!!!', a

end subroutine hello

用终端编译:

f2py -m foo -c foo.f90

在python控制台中运行:

$ python

>>> import foo

>>> foo.hello(15)

Hello from Fortran90!!! 15

明确定义接口的参数:

另外一个例子,非常明确地定义了接口的输入、输出参数:

!SUBROUTINE

SUBROUTINE ADDSUB(A,B,C,D)

IMPLICIT NONE

DOUBLE PRECISION A,B,C,D

!f2py intent(in) :: A,B

!f2py intent(out) :: C,D

C = A + B

D = A - B

print*, "ADDSUB From Fortran!"

print*, "ADD=",C

print*, "SUB=",D

RETURN

END

注意这两行的代码:

!f2py intent(in) :: A,B

!f2py intent(out) :: C,D

对于Fortran只是注释,但对于f2py却很重要,相当于”签名”.

注意签名的注释前面不能有空格!

当然也可以写成如下的形式:

Cf2py intent(in) :: A,B

Cf2py intent(out) :: C,D

下面开始编译Fortran代码为python模块,打开CMD窗口,输入如下命令:

f2py -m testfortran -c testfortran.f90

会在当前目录下生成testfortran.pyd的文件. 下面就可以再python中使用这个模块了:

In [1]: import testfortran

In [2]: print testfortran.__doc__

This module 'testfortran' is auto-generated with f2py (version:2).

Functions:

c,d = addsub(a,b)

In [3]: x=testfortran.addsub(4,9)

ADDSUB From Fortran!

ADD= 13.000

SUB= -5.000

In [4]: x

Out[4]: (13.0, -5.0)

接口参数是数组:

接口参数是数组的情况比较复杂。需要Python中必须确定数组的维数,并且NumPy定义的数组存储方式必须是Fortran的按列存储。

实现方式:

在Python中使用NumPy定义Fortran方式存储的二维数组,利用ndpointer定义数组类型和维数,用ctypes模块调用其data属性将数组首地址传入将二维数组的首地址和维数信息传入Fortran中进行计算并返回。

fortran代码:py2f90.f90

module py2f90

use,intrinsic::iso_c_binding

implicit none

contains

subroutine transferMat2For(matrix,n1,n2)bind(c,name='array2py')

implicit none

integer(c_int),intent(in),value::n1,n2

real(c_float),intent(out)::matrix(n1,n2)

integer::i,j

! initialize matrix

matrix = 0.0E0

! loop

do i=1,n1

do j=1,n2

matrix(i,j) = real(i,4)*1.E1+real(j,4)*2.E0

write(*,"('Row:',i4,1x,'Col:',i4,1x,'Value:',1x,F5.2)")i,j,matrix(i,j)

enddo

enddo

return

end subroutine

end module

test_mat.f90:

program test

use py2f90

implicit none

real(kind=4)::aa(4,5)

call transferMat2For(aa,4,5)

end program

python调用代码:test_mat.py

#! /usr/bin/env python

#coding=utf-8

import numpy as np

from numpy.ctypeslib import load_library,ndpointer

from ctypes import c_int

# shape of 2d array

n1,n2 = 2, 5

# create an empty 2d array

data = np.empty(shape=(n1,n2),dtype='f4',order='f')

flib = load_library("test_mat","./")

flib.argtypes = [ndpointer(dtype='f4',ndim=2),c_int,c_int]

flib.array2py(data.ctypes.data,n1,n2)

print("*"*80)

print(data)

终端编译指令:

f2py -m test_mat -c test_mat.f90 py2f90.f90

在终端输入:python test_mat.py,得到:

image.png

作者:Alex_lxy

原文地址:https://www.jianshu.com/p/1f04e2a81798

fortran的gui开发 python_python和fortran的接口相关推荐

  1. R语言图形编辑器GUI开发环境RStudio安装(Windows操作系统下、RStudio开发环境安装)

    R语言图形编辑器GUI开发环境RStudio安装(Windows操作系统下.RStudio开发环境安装) RStudio是R语言的集成开发环境(IDE),它是一个独立的开源项目,它将许多功能强大的编程 ...

  2. Eclipse进行可视化的GUI开发3大GUI插件

    Eclipse进行可视化的GUI开发3大GUI插件 转自http://www.cnblogs.com/NationWoo/archive/2011/05/31/2065176.html Eclipse ...

  3. python gui开发工具_深入解析Python,透析应用开发,涵盖9大应用领域的Python框架...

    前言 当前,Python 已经成为最流行的程序设计语言之一,被越来越多的人作为首选语言来学习和应用.作为一种解释型的语言,Python具有内置的高级数据结构和简单有效的面向对象编程机制.同时,其语法简 ...

  4. php7可以做什么开发,php7 图形用户界面GUI 开发怎么做?看完这个代码你就明白了...

    [摘要]php7作为PHP的一个版本,也能实现很多功能,不过今天环球网校的小编要为大家讲解php7 图形用户界面GUI 开发怎么做?看完这个代码你就明白了,因为只要你了解了php7 图形用户界面GUI ...

  5. python编程工具p-python Gui开发工具选择

    Python最大的特点就在于她的快速开发功能.作为一种胶水型语言,python几乎可以渗透在我们编程过程中的各个领域.这里我简单介绍一下用python进行gui开发的一些选择. 1.Tkinter T ...

  6. V2EX › 郁闷于Python GUI开发,有没有好的框架啊?

    V2EX › 郁闷于Python GUI开发,有没有好的框架啊? 郁闷于Python GUI开发,有没有好的框架啊? By ectotherm at 2 months, 2 weeks ago, 11 ...

  7. python自带gui_Python GUI开发工具中五种类型的相关介绍

    Python这一计算机语言不仅具有十分简捷的操作功能,它还具有十分快速的相关开发功能,此文主要向你介绍的是关于Python GUI开发工具在实际相关应用操作过程中的具体操作,以及这几种开发工具相关内容 ...

  8. Java GUI 开发专题

    Java GUI 开发专题 IBM http://www.ibm.com/developerworks/cn/java/j-gui/#N10095 作者:wenhai_zhang 发表于2009-11 ...

  9. 【.NET Core 跨平台 GUI 开发】第一篇:编写你的第一个 Gtk# 应用

    本文是[.NET Core 跨平台 GUI 开发]系列博文的第一篇.该系列博文是一个关于 Gtk# 跨平台应用开发的初级随笔集合.该随笔集合介绍了 GTK 和 Gtk# 的基本信息以及开发方法,并展示 ...

最新文章

  1. TYVJ P1053 字符串的展开 Label:字符 水
  2. JavaScirpt类型检测函数总结
  3. 再学 GDI+[98]: TGPImage(18) - 获取 GDI+ 图像格式对应的 GUID
  4. kali创建python脚本_kali下编译学习python3
  5. 给你出道题 红绿灯问题
  6. 预处理、const、static与sizeof-static全局变量与普通的全局变量有什么区别
  7. 两用物项许可证办理流程_[进出口管制类]两用物项和技术进口许可证之易制毒化学品(6)欣海丁丁检务工作室(272)...
  8. python在数字后添加字符_用python生成数字、字母和特殊字符混合的字符串
  9. winform调用大华相机
  10. 使用CSS过滤器让透明的彩色png图像变纯白
  11. 【沧海拾昧】微机原理:并行接口电路8255芯片
  12. 在电脑上安装Linux系统步骤
  13. 2019Python人工智能前景怎么样?
  14. 告别“停车难”,条形智能停车场导视牌推动城市智能停车建设
  15. python 解决 mismatch问题
  16. browsersync——代码变动实时更新到页面
  17. 计算机网络————Wireshark 实验
  18. 孩子stem教育特殊之处
  19. 关于十六进制数输入输出
  20. MOOC高级语言程序设计第七章课后作业

热门文章

  1. 推荐:制作地图的网站和工具
  2. 移动隐藏邮箱并删除默认邮箱数据库
  3. CLR Via CSharp读书笔记(29) - 混合线程同步构造
  4. 无聊博文之:用同余的语言阐述欧几里德算法
  5. 推荐 12 个提升程序员软技能与效率的必备工具,爱了爱了!
  6. 好好爱惜自己的牙齿(电动牙刷)
  7. gorm的零值问题:默认仅更新非零值
  8. fedora 35 安装各种桌面环境命令整理
  9. centos7安装ansible AWX17.1.0
  10. pyspark subtract代码示例