Запись выводов подпрограммы Fortran в файл, работающий из интерфейса Python - PullRequest
0 голосов
/ 16 мая 2018

Ниже приведен код 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 голосов
/ 16 мая 2018

Oki @francescalus был прав в комментариях, он все еще использовал старую версию, мне пришлось обновить свой код после изменений, чтобы интерфейс знал, что обновление было сделано. Сделайте это, используя: f2py -c -m codename codename.f90

Редактировать: Оки, выполнив несколько тестов на этом, я могу напечатать и создать файл, но это должно быть в отдельной подпрограмме, я не понимаю этого. похоже, это как-то связано с функцией импорта. import _codename отличается от import codename. Если кто-нибудь может объяснить это, пожалуйста, дайте мне знать.

0 голосов
/ 16 мая 2018

Выделяется несколько проблем:

  1. Вы используете файловый блок 1 - это не очень хорошая идея.Фортран часто использует эти младшие числа для определенных единиц измерения, т. Е. Стандартного выхода, ошибки, стандартного ввода. Лучше использовать этот синтаксис:

    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)
    
...