首页/文章/ 详情

Fortran基础编程(5)——Subroutine正确食用方法

1年前浏览741

今天木木给大家带来一期有关Fortran中Subroutine的基础讲解,其实Fortran还有一个可以封装计算模块的语句——Function,但是在子程序开发中用的都是各种Subroutine,所以本期内容将为大家尽可能主要详细阐述Subroutine的各种小细节,希望在子程序二次开发过程中能够在一定程度上帮助到大家。

写程序时,可以把某一段常常被使用、具有特定功能的程序代码独立出来,封装成子程序,以后只要经过调用Call命令就可以执行这一段程序代码。

  1. 子程序的程序代码以Subroutine开头,以EndEnd Subroutine结束;
  2. 子程序最后一个命令通常是Return,表示程序要返回原来调用它的地方来继续执行程序,若将之写为Stop,则表示子程序执行完后,整个程序就会跟着全部结束,Return命令可以省略,子程序执行完它所有的程序代码后会自动Return;
  3. 子程序之间可以相互调用,但是在Fortran77中不允许自己调用自己,也就是递归,我不晓得Umat或者Uel中是否可以使用,没试过,感兴趣的童鞋可以试一试;
  4. 子程序独立地拥有属于自己的变量声明,即不同子程序声明的变量彼此是没有关系的。同样,子程序也拥有自己的行代码;
  5. 子程序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)

形参说明

  1. A,B: 均为实型变量,输入参数,求根区间的左端点与右端点;
  2. H: 实型变量,输入参数,搜索的步长;
  3. EPS:实型变量,输入参数,控制精度要求;
  4. X:实型一维数组,长度为N,输出参数,前M个返回所有的实根;
  5. N: 整型变量,输入参数,在区间[A,B]内实根个数的预估值;
  6. M:整型变量,输出参数,返回在区间[A,B]内方程实根的个数,如果返回的M=N,则有可能在区间[A,B]内的实根未搜索完;
  7. 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的作用的引进外部函数的意思,属于固定格式的专用语法。

今日份分享就到此为止啦,我们下期再见啦~

觉得本期内容对你有用的话可以点点小赞,在看再看哦,给与木木更多的创作动力~

来源:易木木响叮当
二次开发控制
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-06-01
最近编辑:1年前
易木木响叮当
硕士 有限元爱好者
获赞 212粉丝 244文章 344课程 2
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈