1

我有一个求解器可以迭代很长时间(几个小时),我试图从主循环中删除几个 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 中的不同例程?(可能的最旧版本是理想的,但不是必需的。)抱歉,如果以前有人问过类似的问题,我尝试了搜索,但我不太确定我需要寻找什么。

谢谢阅读!

4

1 回答 1

0

(问题已在评论中回答。请参阅没有答案的问题,但问题已在评论中解决(或在聊天中扩展)

@SuperCow 写道:

这有帮助吗?过程指针,派生类型

OP写道:

是的!这就是诀窍。

于 2015-01-25T20:45:10.063 回答