我正在启动此线程以寻求帮助以解决可能来自我对函数接口的错误规范的问题,但我不知道如何解决它。
我遇到的错误消息很简短,简单地说,“lnsrch 的参数数量或类型非法 - fmin 和 func 的参数不同意。”
LNSRCH
、FMIN
和的定义FUNC
将在下面的内容中明确。
原始程序代码被修剪以说明我的意图,如下所示。它由三个部分组成:一个名为 的主程序单元MAIN
、一个名为 的模块MODEL
和一个名为NEWTON
) 的模块。您应该能够仅使用以下单个 .f90 格式文件重现错误消息:link
模块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
很抱歉这篇冗长的帖子。感谢您花时间阅读我的问题。期待解决错误消息的任何输入。谢谢。
李