下面是我正在运行的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
的值,因为它还与代码的其他区域相关联,并且需要进行许多更改。相反,我更喜欢是否可以在终端中打印输出或将它们保存在文件中。
虽然程序已执行但我没有看到结果保存在文件中,甚至是正在创建的文件中。
答案 0 :(得分:1)
有几个问题突出:
您使用文件单元1 - 这不是一个好主意。 Fortran经常为特定单位使用这些低数字,即标准输出,错误输出,标准输入。更好地使用这种语法:
integer :: u ! unit for file i/o
open(newunit=u, file='data1.dat', status='new', action='write')
do
...
end do
这样,您可以确定单元号是免费的。
write(*, *) <data>
始终写入标准输出 - 您应该看到运行它时屏幕上显示的值。要写入文件,您需要将*
语句的第一个write
替换为文件单元。
write(u, *) Qr(i)
答案 1 :(得分:0)
Oki @francescalus在评论中仍然使用旧版本是正确的,我必须在更改后更新我的代码,以便界面知道已经进行了更新。使用:f2py -c -m codename codename.f90
编辑: Oki在对此运行一些测试后,我能够打印并创建一个文件,但这必须在一个单独的子程序中,我不明白这一点。看起来它与导入功能有关。 import _codename
与import codename
不同。如果有人可以解释,请告诉我。