参数和过程出错

时间:2015-06-14 09:48:07

标签: visual-studio-2010 fortran imsl

我必须使用IMSL库中包含的子程序(neqnf),这让我可以解决非线性系统问题。 (链接到用户手册,neqnf页面heremain.f90,是:

program prova_sistema_in_un_modulo

    include "link_fnl_shared.h"
    use neqnf_int
    use modx

    implicit none

    call d_neqnf(FCN, x, xguess=x_guess, fnorm=f_norm)

end program prova_sistema_in_un_modulo

子程序FCN在外部模块中编码,modx.f90

module modx

implicit none

integer, parameter :: ikind = selected_real_kind(8,99)
integer :: n=3
real(kind=ikind) :: f_norm
real(kind=ikind), dimension(3) :: x, x_guess=(/ 4.0, 4.0, 4.0/)

contains

subroutine FCN(x,f,n)
    integer :: n                                  !dummy var
    real(kind=ikind), dimension(3) :: x, f        !dummy var

    f(1)=x(1)+A(x(1))+(x(2)+x(3))*(x(2)+x(3))-27.0            ! =0
    f(2)=B(x(1),x(2))+x(3)*x(3)-10.0                          ! =0
    f(3)=Z(x(2),x(3))                                         ! =0

end subroutine FCN

function A(x)
    real(kind=ikind) :: x    !dummy var
    real(kind=ikind) :: A    !function var

    A=exp(x-1.0)

end function A

function B(x,y)
    real(kind=ikind) :: x,y  !dummy var
    real(kind=ikind) :: B    !function var

    B=exp(y-2.0)/x

end function B

function C(x)
    real(kind=ikind) :: x    !dummy var
    real(kind=ikind) :: C    !function var

    C=sin(x-2.0)

end function C

function Z(x,y)
    real(kind=ikind) :: x,y  !dummy var
    real(kind=ikind) :: Z    !function var

    Z=y+C(x)+x*x-7.0

end function Z
end module modx

但是我得到了这三个错误:

Error   1    error #7061: The characteristics of dummy argument 1 of the associated actual procedure differ from the characteristics of dummy argument 1 of the dummy procedure. (12.2)   [FCN]
Error   2    error #7062: The characteristics of dummy argument 2 of the associated actual procedure differ from the characteristics of dummy argument 2 of the dummy procedure. (12.2)   [FCN]
Error   3    error #7063: The characteristics of dummy argument 3 of the associated actual procedure differ from the characteristics of dummy argument 3 of the dummy procedure. (12.2)   [FCN]

注意:如果我把所有代码放在主程序中,一切都顺利!如果我使用模块编码(就像我已经完成,实际发布的代码)我得到了错误! 有谁可以帮助我?

1 个答案:

答案 0 :(得分:0)

问题是您为自定义函数x(3)中的伪参数f(3)FCN提供了固定维度,而IMSL期望变量维x(n),{ {1}}:

f(n)

重现这个的一个工作示例是(从HYBRD1借来的接口):

subroutine FCN(x,f,n)
    integer :: n                                  !dummy var
!    real(kind=ikind), dimension(3) :: x, f       !<- wrong
    real(kind=ikind), dimension(n) :: x, f        !<- correct

    f(1)=x(1)+A(x(1))+(x(2)+x(3))*(x(2)+x(3))-27.0            ! =0
    f(2)=B(x(1),x(2))+x(3)*x(3)-10.0                          ! =0
    f(3)=Z(x(2),x(3))                                         ! =0

end subroutine FCN