除了 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 转换为一个模块来执行相同的技巧,其中模块变量存储其状态(而不是派生类型的字段)。但无论采用何种解决方案,您都必须以某种方式分离初始化部分,以确保它只执行一次。