Я начинаю эту тему, чтобы попросить помощи в решении проблемы, которая может возникнуть из-за моей неправильной спецификации интерфейса функции, но я не знаю, как это исправить.
Сообщение об ошибке, с которым я столкнулся, короткое и просто говорит: «Недопустимое число или тип аргументов для lnsrch — аргументы fmin и func не согласуются».
Определение LNSRCH
, FMIN
и FUNC
будет понятно из содержания ниже.
Исходный программный код обрезан, чтобы проиллюстрировать мое намерение, как показано ниже. Он состоит из трех частей: основной программной единицы с именем MAIN
, модуля с именем MODEL
и модуля с именем NEWTON
). Вы должны быть в состоянии воспроизвести сообщение об ошибке, просто используя следующий единственный файл формата .f90: ссылка
Модуль MODEL
просто определяет простую систему уравнений с двумя переменными ---y(1)=x(1); y(2)=x(2) --- в подпрограмме FUNC_SYSTEM1
. Модуль MODEL
также содержит абстрактный интерфейс для будущего расширения, так что я могу просто заставить указатель FUNCV
ссылаться на любую другую систему уравнений того же типа, что и текущий пример системы уравнений FUNC_SYSTEM1
, за исключением только количества переменных системы уравнений. .
MODULE model
IMPLICIT NONE
REAL, DIMENSION(:), POINTER :: fmin_fvecp
ABSTRACT INTERFACE
FUNCTION function_system_template(x) RESULT(y)
REAL, DIMENSION(:), INTENT(IN) :: x
REAL, DIMENSION(SIZE(x)) :: y
END FUNCTION
END INTERFACE
PROCEDURE(function_system_template), POINTER :: funcv
CONTAINS
FUNCTION func_system1(x) Result(y)
IMPLICIT NONE
REAL, DIMENSION(:), INTENT(IN) :: x
REAL, DIMENSION(size(x)) :: y
y(1)=x(1)
y(2)=x(2)
END FUNCTION func_system1
END MODULE model
Модуль NEWTON
определяет отношения между тремя подпрограммами, которые являются ключевыми для вычислений программы: BROYDEN
вызывает FMIN
для получения суммы квадратов x(1) и x(2); одновременно в FMIN
вектор x(1) и x(2) присваивается указателю массива с именем FMIN_FVECP
. Этот указатель массива должен использоваться для некоторых дополнительных вычислений в функции LNSRCH
.
MODULE newton
USE model
IMPLICIT NONE
REAL, DIMENSION(:), POINTER :: fmin_fvecp
CONTAINS
SUBROUTINE broyden(x,fmin_fvecp,funcv)
IMPLICIT NONE
REAL, DIMENSION(:), INTENT(IN) :: x
REAL, DIMENSION(size(x)), TARGET :: y
REAL, DIMENSION(:), POINTER :: fmin_fvecp
PROCEDURE(function_system_template), POINTER :: funcv
fmin_fvecp=>y
print*,fmin(x,fmin_fvecp,funcv) ! Get the sum of squares
print*,fmin_fvecp ! Show the vector x(1) and x(2)
print*,lnsrch(x,fmin,fmin_fvecp,funcv) ! Show the figure calculated in LNSRCH
END SUBROUTINE broyden
FUNCTION fmin(x,fmin_fvecp,funcv) RESULT(y)
IMPLICIT NONE
REAL, DIMENSION(:), INTENT(IN) :: x
REAL, DIMENSION(:), POINTER :: fmin_fvecp
PROCEDURE(function_system_template), POINTER :: funcv
REAL :: y
fmin_fvecp=funcv(x) ! The value of FMIN_FVECP is assigend
fmin=dot_product(fmin_fvecp,fmin_fvecp)! when FMIN is called by BROYDEN
END FUNCTION fmin
FUNCTION lnsrch(x,func,a_fvecp,b_funcv) RESULT(y)
IMPLICIT NONE
REAL, DIMENSION(:), INTENT(IN) :: x
REAL, DIMENSION(:), POINTER :: a_fvecp
PROCEDURE(function_system_template), POINTER :: b_funcv
INTERFACE
FUNCTION func(x,fvecp,funcp)
IMPORT :: function_system_template
IMPLICIT NONE
REAL, DIMENSION(:), INTENT(IN) :: x
REAL :: func
REAL, DIMENSION(:), POINTER :: fvecp
PROCEDURE(function_system_template), POINTER :: funcp
END FUNCTION
END INTERFACE
REAL, DIMENSION(SIZE(x)) :: y
y=x+a_fvecp+b_funcv(x)+1000.
END FUNCTION lnsrch
END MODULE newton
Основная программная единица определяется следующим образом:
PROGRAM main
USE model
USE newton
IMPLICIT NONE
REAL, DIMENSION(:), allocatable :: x
allocate(x(2))
x=[1.,2.] ! The input arguments to be passed into
funcv=>func_system1 ! the equation system, FUNC_SYSTEM1.
call broyden(x,fmin_fvecp,funcv) ! Call BROYDEN to do the subsequent calcualtion
deallocate(x)
END PROGRAM main
Извините за длинный пост. Спасибо за время, прочитанное через мой вопрос. С нетерпением жду любых входных данных для работы с сообщением об ошибке. Спасибо.
Ли
fmin_fvecp1
в обоих модулях, что является конфликтом, поскольку оба используются в программе. У вас естьfmin=..
вfunction fmin
, но нетy=...
, что является проблемой, поскольку вы объявилиresult (y)
. - person M. S. B.   schedule 29.04.2013