2

我有两个独立的(和大型的)fortran 程序,我需要在它们之间来回交换数据。它们是环境模拟器(我们称它们为 A 和 B),需要在每个时间步长交换几个数组的数据,直到模拟完成。我想出的解决方案是将 B 转换为每个时间步由 A 调用的子程序,并通过参数传递数据。因为 B 太大,所以每个时间步初始化它都很慢。

有没有办法将 B 保存在内存中,这样 A 就不会每次都将所有内容都加载回内存中?还有其他方法可以使子程序调用不那么慢吗?

有没有更有效的方法在独立的 fortran 程序之间以同步的方式交换数据而无需子程序化?

4

1 回答 1

0

除了 MPI 方法,您还可以设计一个对象(派生类型),其中包含程序 B 需要知道的所有变量,以便在调用之间记住其状态。那么你应该把程序 B 的功能分成三个例程:

  • 初始化例程(在 A 中的第一个时间步之前调用)
  • 主程序(在 A 中的每个时间步调用)
  • 可选:销毁(在 A 中的最后一个时间步之后调用)。

每次从程序 A 调用这些例程中的任何一个时,都会将派生类型与变量一起传递给它们。在第一次调用中,它们被初始化,在随后的调用中它们被使用。

所以程序 A 看起来像:

type(bdata) :: myb
...
call initialize_b(myb)
do ii = 1, ntimesteps
  ...
  call main_b(myb, data)
  ...
end do
call destruct_b(myb)

该类型bdata必须包含程序 B 需要记住的所有内容,例如:

type :: bdata
  integer, allocatable :: whatever(:)
  ...
end type bdata

具有程序 B 功能的模块中的例程如下:

!> First initialization of B (slow).
subroutine initialize_b(myb)
  type(bdata), intent(out) :: myb
  ...
end subroutine initialize_b


!> Process data comming from program A.
subroutine main_b(myb, data)
  type(bdata), intent(inout) :: myb
  ...
end subroutine main_b

如果您只需要程序 B 的一个实例,您可以通过将程序 B 转换为一个模块来执行相同的技巧,其中模块变量存储其状态(而不是派生类型的字段)。但无论采用何种解决方案,您都必须以某种方式分离初始化部分,以确保它只执行一次。

于 2012-12-12T16:03:51.777 回答