作者shaufire (二天一流)
看板Fortran
标题[问题] 以可调步幅法解ODE-IVP
时间Mon Apr 27 18:19:12 2009
各位版上的朋友大家好
小弟第一次在这里发文,望各位多多包涵 ^ ^a
问题是关於使用IMSL库存函式IVPAG解ODE-IVP(一阶常微分方程组)
ODE写於函式CODE,计算所需的起始值和欲计算的y(t)写在主程式内
以下为部分程式码:(使用Visual Fortran90撰写)
--
PROGRAM MAIN
USE IMSL
IMPLICIT NONE
INTEGER, PARAMETER :: N = 2 ! No. of eqns
INTEGER, PARAMETER :: NPARAM = 50 ! no. of input entries
INTEGER MODE, I
INTEGER IDO, IEND, NOUT
REAL TI, TF, Y10, Y20, TFI
REAL PARAM(NPARAM)
REAL, PARAMETER :: TOLERR = 1.0E-4
INTEGER, PARAMETER :: NUMPT = 20
DATA TI, TF, Y10, Y20 /0.0, 1.0, 1.0, 0.0/
REAL Y(N), A(1,1), T ! A is not uesd since the ODEs is explicit
REAL, EXTERNAL :: CODE, CODEJ ! Required for IVPAG and IVPRK
c Initialization:
CALL SSET(NPARAM, 0.0, PARAM, 1)
IDO = 1
T = TI
TFI = 0.0002
Y(1) = Y10
Y(2) = Y20
... (从略)
SELECT CASE (MODE)
CASE (1)
PRINT*, 'Use Adams-Moulton-Gear method'
DO I = 1, NUMPT+1
CALL IVPAG(IDO, N, CODE, CODEJ, A, T, TFI, TOLERR, PARAM, Y)
TFI = TFI + (TF - TI)/REAL(NUMPT)
IF (TFI .EQ. TF) THEN
IDO = 3
ELSE
WRITE(*,100) T, Y
END IF
END DO
CASE (2)
... (从略)
END SELECT
100 FORMAT(3E16.4)
END
SUBROUTINE CODE(N, T, Y, DIFFY)
IMPLICIT NONE
INTEGER N
REAL T, Y(N), DIFFY(N)
DIFFY(1) = -5.005E2*Y(1) + 4.995E2*Y(2)
DIFFY(2) = 4.995E2*Y(1) - 5.005E2*Y(2)
RETURN
END SUBROUTINE
SUBROUTINE CODEJ(N, T, Y, DIFFY) ! Not used
IMPLICIT NONE
INTEGER N
REAL T, Y(N), DIFFY(N,*)
RETURN
END SUBROUTINE
--
在编译程式的时候出现了以下讯息:
Warning: In the call to IVPAG,
actual argument #3 does not match the type and kind of the corresponding
dummy argument.
CALL IVPAG(IDO, N, CODE, CODEJ, A, T, TFI, TOLERR, PARAM, Y)
---------------------------------^
Warning: In the call to IVPAG,
actual argument #4 does not match the type and kind of the corresponding
dummy argument.
CALL IVPAG(IDO, N, CODE, CODEJ, A, T, TFI, TOLERR, PARAM, Y)
程式计算出来的结果似乎没有问题
不过实在是对这警告讯息有点介意XD
想请问版上高手们
这警告讯息是不是来自於我宣告变数或函式有错?
应该要怎样修改才不会有这问题呢?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.112.36.25
1F:→ shaufire:找到解答了:以 EXTERNAL CODE, CODEJ 宣告两副常式即可 05/07 19:58
2F:→ shaufire:real的宣告多余了...抱歉占用版面久矣<(_ _)> 05/07 19:58