将例程名称分配给Fortran中的其他例程

时间:2013-11-09 19:07:20

标签: pointers fortran function-pointers solver

我有一个迭代很长时间(几个小时)的求解器,我试图从主循环中删除几个if语句以节省时间。

我在这里尝试做的是创建一个例程updateGhosts,它指向一个指定的例程。此例程属于派生数据类型,其中包含若干其他属性和例程。我想使用例程setGhosts将updateGhost设置为ghostOne或ghostTwo,这将是正确更新某些条件的例程。

我似乎无法弄清楚导致代码编译的方法,尽管我尝试了几种不同的方法但无济于事。

为了简单起见,我尝试尽可能地减少代码示例,但实际上GridPoint和BlockType类型有更多的参数需要处理,因此简单的重构不是一种选择。

以下是简化代码:

module BlockModule
  implicit none

  type GridPoint
    real(kind=8) :: x, y, T
  end type GridPoint

  type BlockType
    integer :: BC
    type (GridPoint) :: Points(0:102,0:102)
  contains
    procedure :: setGhosts, updateGhosts
    procedure :: ghostOne, ghostTwo
  end type BlockType

contains
  subroutine setGhosts(this)
    class(BlockType), intent(inout) :: this

    if (this%BC == -1) then
      ! We want to assign updateGhosts to ghostOne.
      this%updateGhosts => this%ghostOne
    else
      ! We want to assign updateGhosts to ghostTwo.
      this%updateGhosts => this%ghostTwo
    end if
  end subroutine

  ! Routine that will be either ghostOne or ghostTwo.
  subroutine updateGhosts(this)
    class(BlockType), intent(inout) :: this
  end subroutine

  ! Routine will do something.
  subroutine ghostOne(this)
    class(BlockType), intent(inout) :: this
  end subroutine

  ! Routine will do something completely different, with same inputs.
  subroutine ghostTwo(this)
    class(BlockType), intent(inout) :: this
  end subroutine
end module

如何在Fortran90 / 95/03中指定例程名称指向不同的例程? (最古老的版本可能是理想的,但不是必需的。)很抱歉,如果之前有过类似的问题,我尝试过搜索,但我不太确定我需要查找的内容。

感谢阅读!

1 个答案:

答案 0 :(得分:0)

(问题已在评论中得到解答。请参阅Question with no answers, but issue solved in the comments (or extended in chat)

@SuperCow写道:

  

这有帮助吗? Procedure Pointer, Derived Type

OP写道:

  

是的!这就是诀窍。