如何使用具有不同参数数量的子例程的过程指针

时间:2018-01-17 08:16:50

标签: fortran function-pointers procedures

我正在开发一个用于科学计算的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的定义现在不起作用了。

是否可以使用过程指针来处理这种情况?或者其他任何方式?

1 个答案:

答案 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}})