У меня есть решатель, который повторяется в течение большого количества времени (несколько часов), и я пытаюсь удалить несколько операторов 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
Как я могу назначить имя подпрограммы, чтобы оно указывало на другую подпрограмму в Fortran 90/95/03? (Самая старая версия идеальна, но не обязательна.) Извините, если подобные вопросы уже задавались, я попробовал поиск, но не совсем уверен, что мне нужно искать.
Спасибо за чтение!