如何无需迭代即可调用Fortran类型绑定子程序处理多实例?
Fortran自定义类型数组批量调用绑定子程序的实现方法
在Fortran中,自定义类型的数组可以直接批量访问其组件(如你代码中的m%grid%var1),但默认的类型绑定子程序只能逐个实例调用。要实现无需显式迭代的批量调用,有两种常用方案:
方案一:将绑定子程序声明为elemental(元素子程序)
Fortran的elemental子程序会自动对数组的每个元素执行操作,无需手动循环。只需修改原compute子程序的声明,添加elemental关键字即可:
修改后的完整代码
module cellmodule implicit none type :: cell real :: var1 = 0 contains procedure, public :: compute end type Contains ! 添加elemental关键字,将子程序标记为元素子程序 elemental subroutine compute(this) class(cell), intent(inout) :: this this%var1 = this%var1 + 1 end subroutine compute end module cellmodule module modelmodule use cellmodule type :: model type(cell), allocatable, dimension(:,:) :: grid end type end module modelmodule program testprogram use cellmodule use modelmodule implicit none integer :: x = 2 integer :: y = 2 type(model) :: m allocate(m%grid(x,y)) ! 批量访问组件 print*, m%grid%var1 m%grid%var1 = m%grid%var1 + 1.0 print*, m%grid%var1 ! 直接对整个数组调用compute,无需迭代 call m%grid%compute print*, m%grid%var1 end program
注意事项
elemental子程序必须满足纯子程序的要求:不能有副作用(除了修改intent(inout)的参数),不能执行I/O操作,参数必须是标量。- 该方案语法最简洁,完全贴合你想要的
call m%grid%compute调用方式。
方案二:定义处理类型数组的独立子程序/类型绑定
如果你的compute逻辑复杂,无法满足elemental的限制,可以直接编写一个接受cell类型数组的子程序,或者将其绑定到model类型上:
示例代码(绑定到model类型)
module cellmodule implicit none type :: cell real :: var1 = 0 contains procedure, public :: compute end type Contains subroutine compute(this) class(cell) :: this this%var1 = this%var1 + 1 end subroutine compute end module cellmodule module modelmodule use cellmodule type :: model type(cell), allocatable, dimension(:,:) :: grid contains ! 添加处理整个grid的绑定子程序 procedure :: compute_grid => compute_all_grid end type contains subroutine compute_all_grid(this) class(model), intent(inout) :: this ! 直接利用数组组件的批量操作,无需循环 this%grid%var1 = this%grid%var1 + 1 ! 如果逻辑复杂,也可以在这里用隐式循环(如forall)替代显式do循环 ! forall(i=1:size(this%grid,1), j=1:size(this%grid,2)) ! call this%grid(i,j)%compute() ! end forall end subroutine compute_all_grid end module modelmodule program testprogram use cellmodule use modelmodule implicit none integer :: x = 2 integer :: y = 2 type(model) :: m allocate(m%grid(x,y)) print*, m%grid%var1 m%grid%var1 = m%grid%var1 + 1.0 print*, m%grid%var1 ! 调用model类型的绑定子程序,批量处理grid call m%compute_grid() print*, m%grid%var1 end program
优势
- 不受
elemental的限制,可处理复杂逻辑; - 把批量操作封装在
model类型内部,更符合面向对象的设计思路。
内容的提问来源于stack exchange,提问作者gcolumbus
相关产品推荐
相关产品推荐

