使用f2py在Python GUI中更新长时间运行的Fortran子例程

时间:2015-09-30 18:34:40

标签: python fortran wxpython f2py

我有一个Python GUI(wxPython),包含了一个fortran"后端,"使用f2py。有时,fortran进程可能会运行很长时间,我们希望在GUI中放置一个进度条来通过Fortran例程更新进度。有没有办法获取Fortran例程的状态/进度,而不涉及文件I / O?

2 个答案:

答案 0 :(得分:0)

如果您基本了解代码的哪些部分占用的时间最多,则可以包含进度指示器。请考虑以下示例代码:

program main
implicit none
integer, parameter :: N = 100000
integer :: i
real, allocatable :: a(:), b(:)

! -- Initialization
write(*,*) 'FORFTP: Beginning routine'

allocate(a(N), b(N))
a = 0.
b = 0.

write(*,*) 'FORFTP: Completed initialization'

do i=1,N
   call RANDOM_NUMBER(a(i))
   b(i) = exp(a(i))     ! Some expensive calculation

   if (mod(i,N/100)==0) then     ! -- Assumes N is evenly divisible by 100
      write(*,*) 'FORFTP: completed ', i*100/N, ' percent of the calculation'
   endif
enddo

write(*,*) 'FORFTP: completed routine'

end program main

然后,用户将在初始化之后以及“昂贵计算”的每个百分比完成后获得更新。

我不知道f2py是如何工作的,但我认为python有一些方法可以读取fortran在运行时输出的内容,并在其中显示gui。在此示例中,标记为FORFTP的任何内容都将在gui中输出,而我正在使用标准输出。

此示例说明了调查进度的问题。与计算相比,很难理解分配所花费的时间。因此,很难说初始化是总执行时间的15%,例如。

然而,即使他们没有精确的进度表,对正在进行的操作进行更新仍然很有用。

修改 例程提供以下输出:

 >  pgfortran main.f90
 >  ./a.out 
 FORFTP: Beginning routine
 FORFTP: Completed initialization
 FORFTP: completed             1  percent of the calculation
 FORFTP: completed             2  percent of the calculation
  ...
 FORFTP: completed            99  percent of the calculation
 FORFTP: completed           100  percent of the calculation
 FORFTP: completed routine

答案 1 :(得分:0)

如果您大致知道每项任务将花费多长时间,那么最大的选择就是根据任务开始以来经过多长时间的进度,根据预期的任务持续时间来衡量。
为了保持相关性,您每次都可以存储任务的运行持续时间,并使用它或平均值作为基准时间线。
有时,我们可以过度复杂化;)