Я пытаюсь скомпилировать модуль Fortran ниже (используя gfortran 7.2.0). Суть в том, чтобы определить производный тип, который, в свою очередь, содержит два экземпляра производного типа bspline_3d
из библиотеки bspline-fortran (https://github.com/jacobwilliams/bspline-fortran). Затем я хочу определить процедуру с привязкой к типу, которая, в свою очередь, будет вызывать процедуру с привязкой к типу evaluate
обоих этих типов и возвращать результат в виде массива с двумя элементами.
Когда я пытаюсь скомпилировать модуль ниже, я получаю сообщение об ошибке, говорящее
procedure :: evaluate => evaluate_2d
1
Error: Non-polymorphic passed-object dummy argument of 'evaluate_2d' at (1)
Я абсолютно ничего не понимаю в сообщении об ошибке.
Мне удалось скомпилировать простой пример программы, который можно найти здесь: http://fortranwiki.org/fortran/show/Object-Oriented+programming и, насколько я могу судить, единственная разница в том, что в моем случае "переданный объект" (this
) сам имеет переменные-члены производного типа (type(bspline_3d) :: fvx, fvy
), которые в свою очередь, вероятно, содержат всякую всячину.
module interpolator_module
use bspline_module
use parameters, only: WP
implicit none
private
public :: interpolator
type :: interpolator
type(bspline_3d) :: fvx, fvy
contains
private
procedure :: evaluate => evaluate_2d
end type interpolator
contains
function evaluate_2d(this, X, t) result(V)
implicit none
! inputs
type(interpolator), intent(inout) :: this
real(WP), dimension(2), intent(in) :: X
real(WP), intent(in) :: t
! output
real(WP), dimension(2) :: V
! local variables
integer :: iflag
integer, parameter :: d = 0
call this%fvx%evaluate(X(1), X(2), t, d, d, d, V(1), iflag)
call this%fvy%evaluate(X(1), X(2), t, d, d, d, V(2), iflag)
end function
end module interpolator_module