2015-06-14 3 views
0

Мне нужно использовать подпрограмму (neqnf), включенную в библиотеку IMSL, которая позволяет мне решать нелинейные системы. (Ссылка на руководство пользователя, neqnf страница here) main.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 

где подпрограмма СКЛС кодируется во внешнем модуле, 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] 

NB: если я поместил весь код в основную программу, все будет хорошо! в то время как если я код с использованием модуля (как я уже сделал, фактически опубликованный код), я получаю эти ошибки! Может ли кто-нибудь мне помочь?

+0

Я использую Visual Studio (2010 SP1) с Fortran IMSL (2011) –

+0

Я пробовал это только сейчас и добавляю «внешний FCN» между объявлением переменной и содержит инструкцию (правильно ли разместить ее там?) Я получаю этот новый ошибка рядом с вышеупомянутыми тремя ошибками Ошибка ошибка # 6645: имя процедуры модуля конфликтует с именем в охватывающей области охвата. [FCN] ' –

+0

также меняет' ikind = kind (1.d0) 'не решает проблему (и, как еще большее доказательство, я использую другую процедуру _d__ с реальным, и все идет хорошо) –

ответ

0

Проблема заключается в том, что вы обеспечиваете фиксированный размер для фиктивных аргументов x(3) и f(3) в пользовательской функции FCN, в то время как IMSL ожидает переменный размер x(n), f(n):

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 

Рабочий пример воспроизводить это (интерфейс заимствован от HYBRD1):

module test_int 
contains 
    subroutine final(FCN, x, f, n) 
    interface 
     SUBROUTINE FCN (X, F, N) 
     INTEGER    N 
     DOUBLE PRECISION X(N), F(N) 
     END SUBROUTINE 
    end interface 
    integer   :: n 
    double precision :: x(n), f(n) 
    call FCN(x,f,n) 
    end subroutine 
end module 

module test_fct 
contains 
    subroutine FCN(X, F, N) 
    integer   :: n 
    double precision :: x(n), f(n) 
    print *,X ; print *,F ; print *,N 
    end subroutine 
end module 

program prova 
    use, intrinsic :: iso_fortran_env 
    use test_int 
    use test_fct 
    implicit none 
    integer,parameter :: n=2 
    double precision :: x(n), f(n) 
    x = [ 1.d0, 2.d0 ] 
    f = [ 3.d0, 4.d0 ] 
    call final(FCN, x, f, n) 
end program prova 
+0

Я понимаю, что вы сказали, но если я изменю правильную размер массива проблема здесь снова ... –

+0

Ну, у меня нет правильного интерфейса, я догадался. Является ли код, который я построил, компилируется и запускается на вашем компьютере? Также отправьте интерфейс для 'FCN' (из' link_fnl_shared.h', я предполагаю). –

+0

Да, ваш код работает. интерфейс для FCN связан в верхней части сообщения об открытии, я думаю, –

Смежные вопросы