今天木木给大家带来一期有关Fortran中Subroutine的基础讲解,其实Fortran还有一个可以封装计算模块的语句——Function,但是在子程序开发中用的都是各种Subroutine,所以本期内容将为大家尽可能主要详细阐述Subroutine的各种小细节,希望在子程序二次开发过程中能够在一定程度上帮助到大家。
写程序时,可以把某一段常常被使用、具有特定功能的程序代码独立出来,封装成子程序,以后只要经过调用Call
命令就可以执行这一段程序代码。
注:
Subroutine
开头,以End
或End Subroutine
结束;Return
,表示程序要返回原来调用它的地方来继续执行程序,若将之写为Stop
,则表示子程序执行完后,整个程序就会跟着全部结束,Return
命令可以省略,子程序执行完它所有的程序代码后会自动Return;Subroutine
中的形参包括了输入参数和输出参数,外部函数Function
的形参只有输入参数。接下来以徐老的二分法程序为例,来进一步解读Fortran-Subroutine.
“《Fortran常用算法程序集》——徐士良
求方程
在区间[-2,5]的全部单实根,取步长H=0.2,误差EPS=10^-6,N=6
子程序语句
SUBROUTINE DDHRT(A,B,H,EPS,X,N,M,F)
形参说明
FUNCTION F(x)
其中:X为实型的自变量名,实型函数名返回函数值。SUBROUTINE DDHRT(A,B,H,EPS,X,N,M,F)
DIMENSION X(N)
M=0
Z=A
Y=F(Z)
10IF ((Z.GT.B+H/2.0).OR.(M.EQ.N)) RETURN
IF (ABS(Y).LT.EPS) THEN
M=M+1
X(M)=Z
Z=Z+H/2.0
Y=F(Z)
GOTO 10
END IF
Z1=Z+H
Y1=F(Z1)
IF (ABS(Y1).LT.EPS) THEN
M=M+1
X(M)=Z1
Z=Z1+H/2.0
Y=F(Z)
GOTO 10
END IF
IF (Y*Y1.GT.0.0) THEN
Y=Y1
Z=Z1
GOTO 10
END IF
20IF (ABS(Z1-Z).LT.EPS) THEN
M=M+1
X(M)=(Z1+Z)/2.0
Z=Z1+H/2.0
Y=F(Z)
GOTO 10
END IF
Z0=(Z1+Z)/2.0
Y0=F(Z0)
IF (ABS(Y0).LT.EPS) THEN
M=M+1
X(M)=Z0
Z=Z0+H/2.0
Y=F(Z)
GOTO 10
END IF
IF (Y*Y0.LT.0.0) THEN
Z1=Z0
Y1=Y0
ELSE
Z=Z0
Y=Y0
END IF
GOTO 20
END
DIMENSION X(6)
EXTERNAL F
CALL DDHRT(-2.0,5.0,0.2,1.0E-06,X,6,M,F)
WRITE(*,10) M
10FORMAT(1X,'M=',I2)
DO 20 I=1,M
20WRITE(*,30) I,X(I)
30FORMAT(1X,'X(',I2,')=',E15.6)
END
FUNCTION F(X)
F=(((((X-5)*X+3)*X+1)*X-7)*X+7)*X-20.0
RETURN
END
结果如下:
M= 2
X( 1)= -0.140246E+01
X( 2)= 0.433376E+01
注:EXTERNAL
的作用的引进外部函数的意思,属于固定格式的专用语法。
今日份分享就到此为止啦,我们下期再见啦~
觉得本期内容对你有用的话可以点点小赞,在看再看哦,给与木木更多的创作动力~