将Fortran子例程输出写入文件从Python接口

时间:2018-05-16 13:38:44

标签: python fortran fortran90 f2py

下面是我正在运行的Fortran代码,我想将Qr值保存到文件中。这个子程序在python中调用并执行。

subroutine thrustTorque(n, Np, Tp, r, precurve, presweep, precone, &
Rhub, Rtip, precurveTip, presweepTip, T, Q)

implicit none

integer, parameter :: dp = kind(0.d0)

! in
integer, intent(in) :: n
real(dp), dimension(n), intent(in) :: Np, Tp, r, precurve, presweep
real(dp), intent(in) :: precone, Rhub, Rtip, precurveTip, presweepTip

! out
real(dp), intent(out) :: T, Q

! local
real(dp) :: ds
real(dp), dimension(n+2) :: rfull, curvefull, sweepfull, Npfull, Tpfull
real(dp), dimension(n+2) :: thrust, torque, x_az, y_az, z_az, cone, s
integer :: i

这里有很多变量及其定义的列表,我正在跳过。

cone =0.0_dp
z_az = 0.0_dp
! integrate Thrust and Torque (trapezoidal)
thrust = Npfull*cos(cone)
torque = Tpfull*z_az

现在这里Qr(i)值我希望保存在文件中。

T = 0.0_dp
do i = 1, n+1
    ds = s(i+1) - s(i)
    T = T + 0.5_dp*(thrust(i) + thrust(i+1))*ds
    Q = Q + 0.5_dp*(torque(i) + torque(i+1))*ds
    Qr(i) = Q
end do
end subroutine thrustTorque

我试过了:

T = 0.0_dp
open (1, file = 'data1.dat', status ='new')
do i = 1, n+1
    ds = s(i+1) - s(i)
    T = T + 0.5_dp*(thrust(i) + thrust(i+1))*ds
    Q = Q + 0.5_dp*(torque(i) + torque(i+1))*ds
    Qr(i) = Q
    write(1, *) Qr(i)
end do
close(1)
end subroutine thrustTorque

使用以下命令在python中调用此子例程:

T, Q = _oxi.thrustTorque(Np, Tp, *args)

我无法返回Qr的值,因为它还与代码的其他区域相关联,并且需要进行许多更改。相反,我更喜欢是否可以在终端中打印输出或将它们保存在文件中。

虽然程序已执行但我没有看到结果保存在文件中,甚至是正在创建的文件中。

2 个答案:

答案 0 :(得分:1)

有几个问题突出:

  1. 您使用文件单元1 - 这不是一个好主意。 Fortran经常为特定单位使用这些低数字,即标准输出,错误输出,标准输入。更好地使用这种语法:

    integer :: u ! unit for file i/o
    
    open(newunit=u, file='data1.dat', status='new', action='write')
    do
        ...
    end do
    

    这样,您可以确定单元号是免费的。

  2. write(*, *) <data>始终写入标准输出 - 您应该看到运行它时屏幕上显示的值。要写入文件,您需要将*语句的第一个write替换为文件单元。

    write(u, *) Qr(i)
    

答案 1 :(得分:0)

Oki @francescalus在评论中仍然使用旧版本是正确的,我必须在更改后更新我的代码,以便界面知道已经进行了更新。使用:f2py -c -m codename codename.f90

执行此操作

编辑: Oki在对此运行一些测试后,我能够打印并创建一个文件,但这必须在一个单独的子程序中,我不明白这一点。看起来它与导入功能有关。 import _codenameimport codename不同。如果有人可以解释,请告诉我。