我正在开发一个用于科学计算的Fortran程序。我想使用过程指针来分配问题中的边界条件,如以下主程序所示
program main
use boundary
implicit none
bc1 => boundaryA
bc2 => boundaryB
bc3 => boundaryC
call comp_boundary
end program
我在“边界”模块中定义了所有边界操作“boundaryA / B / C”
module boundary
implicit none
procedure(boundary_type), pointer :: bc1,bc2,bc3
abstract interface
subroutine boundary_type(i)
integer :: i
end subroutine
end interface
contains
subroutine boundaryA(i)
integer :: i
print*, 'Boundary A at ',i
end subroutine
subroutine boundaryB(i)
integer :: i
print*, 'Boundary B at ',i
end subroutine
subroutine boundaryC(i)
integer :: i
print*, 'Boundary C at',i
end subroutine
subroutine comp_boundary
call bc1(1)
call bc2(2)
call bc3(3)
end subroutine
end module
这很有效。
但我的问题是,如果说boundaryC
没有一个输入参数,而是两个,那么我对抽象接口boundary_type
的定义现在不起作用了。
是否可以使用过程指针来处理这种情况?或者其他任何方式?
答案 0 :(得分:0)
您可以使用OPTIONAL
参数来实现此目的。这更像是一种学术解决方案,因为始终存在着苦难的保护。正如High Performance Mark所述的评论,您需要在某处使用一个或两个参数。
尽管如此,OPTIONAL
参数还需要添加所有子例程,因此可能不是您请求的解决方案,因为所有子例程都已基本更改。它基本上与您提供的解决方案相同,只有不同的过程参数集。
MODULE boundary
IMPLICIT NONE
PROCEDURE(boundary_type), POINTER :: bc1,bc2
ABSTRACT INTERFACE
SUBROUTINE boundary_type(i,j)
INTEGER :: i
INTEGER, OPTIONAL :: j
END SUBROUTINE boundary_type
END INTERFACE
CONTAINS
SUBROUTINE boundaryA(i,j)
INTEGER :: i
INTEGER, OPTIONAL :: j
PRINT *, 'Boundary A at ',i
END SUBROUTINE boundaryA
SUBROUTINE boundaryB(i,j)
INTEGER :: i
INTEGER, OPTIONAL :: j
PRINT *, 'Boundary B at ',i,j
END SUBROUTINE boundaryB
SUBROUTINE comp_boundary
CALL bc1(1)
CALL bc2(2,3)
END SUBROUTINE comp_boundary
END MODULE boundary
注意:子例程boundaryB
必须总是同时使用两个参数调用,因为没有检查j
的可用性(使用{ {1}})