+ -
当前位置:首页 → 问答吧 → 会Fortran的请进,程序有个小问题麻烦帮忙解决下。

会Fortran的请进,程序有个小问题麻烦帮忙解决下。

时间:2011-12-21

来源:互联网

代码如下:

C/C++ code

PROGRAM F1
! Driver for routine RK4
! EXTERNAL DERIVS1
! USE DFlib
PARAMETER(N=4)
!USES BESSJ0,BESSJ1,BESSJ
DIMENSION Y(N),DYDX(N),YOUT(N)
X=1.0
Y(1)=BESJ0(X)
Y(2)=BESJ1(X)
Y(3)=BESJN(2,X)
Y(4)=BESJN(3,X)
DYDX(1)= -Y(2)
DYDX(2)=Y(1)-Y(2)
DYDX(3)=Y(2)-2.0*Y(3)
DYDX(4)=Y(3)-3.0*Y(4)
WRITE(*,'(/1X,A,T19,A,T31,A,T43,A,T55,A)')&
   'Bessel Function:','J0','J1','J2','J3'
DO I=1,5
   H=0.2*I
   CALL RK4(Y,DYDX,N,X,H,YOUT,DERIVS1)
   WRITE(*,'(/1X,A,F6.2)')'For a step size of',H
   WRITE(*,'(1X,A10,4F12.6)')'RK4:',(YOUT(J),J=1,4)
   WRITE(8,'(1X,A10,4F12.6)')'Actual:',BESJ0(X+H)&
        ,BESJ1(X+H),BESJN(2,X+H),BESJN(3,X+H)
END DO
END PROGRAM

   
   SUBROUTINE DERIVS1(X,Y,DYDX)
   DIMENSION Y(1),DYDX(1)
     DYDX(1)=-Y(2)
     DYDX(2)=Y(1)-(1.0/X)*Y(2)
     DYDX(3)=Y(2)-(2.0/X)*Y(3)
     DYDX(4)=Y(3)-(3.0/X)*Y(4)
   END SUBROUTINE DERIVS1
   



SUBROUTINE RK4(y,dydx,n,x,h,yout,derivs)
PARAMETER (nmax=10)
DIMENSION y(n),dydx(n),yout(n),yt(nmax),dyt(nmax),&
          dym(nmax)
REAL hh,h6,xh,x,h
INTEGER i,n
hh=h*0.5
h6=h/6.
xh=x+hh
do i=1,n
  yt(i)=y(i)+hh*dydx(i)
end do
call derivs(xh,yt,dyt)
do i=1,n
  yt(i)=y(i)+hh*dyt(i)
end do
call derivs(xh,yt,dym)
do i=1,n
  yt(i)=y(i)+h*dym(i)
  dym(i)=dyt(i)+dym(i)
end do
call derivs(x+h,yt,dyt)
do i=1,n
  yout(i)=y(i)+h6*(dydx(i)+dyt(i)+2.*dym(i))
end do
END SUBROUTINE RK4




出现问题如下:
error #6635: This actual argument must be the name of a procedure and not a data object. [DERIVS1]
1>compilation aborted for D:\scientific research\F1\F1.f90 (code 1)

作者: zzf8811   发布时间: 2011-12-21

你把subroutine当成function来用了

作者: xunxun1982   发布时间: 2011-12-21