Fortran模块、子程序和函数的使用示例
创作时间:
作者:
@小白创作中心
Fortran模块、子程序和函数的使用示例
引用
CSDN
1.
https://blog.csdn.net/Gou_Hailong/article/details/102468886
作为一个Fortran语言的初学者,我深刻体会到Fortran对于像我这样习惯于C语言的编程小白来说,确实不太友好。几天不碰,想要实现一个小小的功能就感到困难重重。因此,我觉得还是要多总结。今天闲来无事,就对Fortran中的模块(module)、子程序(subroutine)和函数(function)的用法做一个简单的小结。
知识点概述
关于Fortran语言的基础知识,书上和网上都有很多详细的介绍,这里就不多做赘述。本文主要通过一个简单的双线性插值计算的例子,来演示模块、子程序和函数的使用方法。
1. 题目
题目是一个简单的双线性插值计算,为了涵盖模块、子程序和函数的使用,我采用了如下的方法。
2. 创建模块——module的用法
module typedef
type point
real x,y,z
end type
contains
subroutine set_p(p,x,y,z)
type(point) p
real x,y,z
p.x=x;p.y=y;p.z=z
end subroutine !Attention here
subroutine show_p(P)
type(point) P
print 100," x=",P.x," y=",P.y," f(x,y)=",P.z
100 format(a4,f9.3,a4,f9.3,a9,f9.3)
end subroutine
end module
可以看到,这里创建了一个名为point
的结构体,类似于C++中的类,包含三个实型变量x
、y
和z
,其中z=f(x,y)
。模块中包含了两个子程序:
set_p
:用于为结构体赋值show_p
:用于打印结构体
值得注意的是:
- 在模块内部的子程序结束时必须使用
end subroutine
,不能省略subroutine
关键字。 - 使用自定义的结构体时,需要使用
type(point) p
这样的语法,这与C/C#中的point p
有所不同。
3. 函数——function的用法
function fun(Q1,Q2,x) result(P)
use typedef
implicit none
type(point) Q1,Q2,P
real x !x is PQ1/PQ2
P.z=x*Q2.z+(1-x)*Q1.z
P.x=x*Q2.x+(1-x)*Q1.x
P.y=x*Q2.y+(1-x)*Q1.y
end
这是一个名为fun
的函数,用于计算线性插值。函数的参数在括号中列出,返回值通过result()
指定。使用模块时需要使用use typedef
语句,类似于C语言中的#include
。
4. 子程序——subroutine的用法
subroutine sub(Q11,Q12,Q21,Q22,P)
use typedef
implicit none
type(point) Q11,Q12,Q21,Q22,P,R1,R2,fun !Attention here
R1=fun(Q11,Q21,(P.x-Q11.x)/(Q21.x-Q11.x))
R2=fun(Q12,Q22,(P.x-Q12.x)/(Q22.x-Q12.x))
P=fun(R1,R2,(P.y-R1.y)/(R2.y-R1.y))
end subroutine
这是一个名为sub
的子程序,用于计算双线性插值。在使用函数时,需要对函数进行定义。需要注意的是,无论是函数还是子程序,参数的类型说明都需要在括号外部进行。
5. 完整程序及输出结果
module typedef
type point
real x,y,z
end type
contains
subroutine set_p(p,x,y,z)
type(point) p
real x,y,z
p.x=x;p.y=y;p.z=z
end subroutine !Attention here
subroutine show_p(P)
type(point) P
print 100," x=",P.x," y=",P.y," f(x,y)=",P.z
100 format(a4,f9.3,a4,f9.3,a9,f9.3)
end subroutine
end module
program Hello
use typedef
implicit none
type(point) Q11,Q12,Q21,Q22,P !Attention here
real x,y
call set_p(Q11,0.0,0.0,0.0)
call set_p(Q21,1.0,0.0,1.0)
call set_p(Q12,0.0,1.0,2.0)
call set_p(Q22,1.0,1.0,3.0)
p.x=0.3;p.y=0.7
call sub(Q11,Q12,Q21,Q22,P)
print *,"Q11:"
call show_p(Q11)
print *,"Q12:"
call show_p(Q12)
print *,"Q21:"
call show_p(Q21)
print *,"Q22:"
call show_p(Q22)
print *,"P:"
call show_p(P)
pause
end
subroutine sub(Q11,Q12,Q21,Q22,P)
use typedef
implicit none
type(point) Q11,Q12,Q21,Q22,P,R1,R2,fun !Attention here
R1=fun(Q11,Q21,(P.x-Q11.x)/(Q21.x-Q11.x))
R2=fun(Q12,Q22,(P.x-Q12.x)/(Q22.x-Q12.x))
P=fun(R1,R2,(P.y-R1.y)/(R2.y-R1.y))
end subroutine
function fun(Q1,Q2,x) result(P)
use typedef
implicit none
type(point) Q1,Q2,P
real x !x is PQ1/PQ2
P.z=x*Q2.z+(1-x)*Q1.z
P.x=x*Q2.x+(1-x)*Q1.x
P.y=x*Q2.y+(1-x)*Q1.y
end
运行结果如下:
Q11:
x= 0.000 y= 0.000 f(x,y)= 0.000
Q12:
x= 0.000 y= 1.000 f(x,y)= 2.000
Q21:
x= 1.000 y= 0.000 f(x,y)= 1.000
Q22:
x= 1.000 y= 1.000 f(x,y)= 3.000
P:
x= 0.300 y= 0.700 f(x,y)= 1.700
热门推荐
诸葛亮三步沟通法:如何让人心服口服?
牛顿和莱布尼兹,究竟谁先创建了微积分?
值得体验的 10 部精彩动画
调理肠胃湿热的食物及食疗方
“AI公务员”:有形式更要有内容
创业公司怎么分红
DDR内存电压选择指南:为何电压对内存性能至关重要?
最新研究:生酮饮食或增加心血管疾病风险
动车组为何“头碰头”?上错不通车厢咋解决?高铁科普来了
篮球队伍的灵魂:人数配置与战术运用的深度解析
中国司法体系中的重要组成部分:监狱、看守所与拘留所的区别
木棉花开花时间及数量分析(探究木棉花的开花规律与生长习性)
骑自行车对身体有多重益处,但需注意姿势和运动量
天山雪菊的功效与作用
医学检验师通常需要怎样的教育背景和技能特长
燕云十六声调律词条是什么
为什么外卖小哥买电动车,不建议选雅迪、爱玛?主要有这3个原因
孟菲斯设计风格:叛逆与趣味的完美融合
原神纳塔部族名称揭秘:与阿兹特克神话的神秘联系
设计吸引人的WPS演示幻灯片的方法
番茄炒鸡蛋的烹饪艺术
黑豆从开花到结豆需要多久?关键影响因素有哪些?
医生解答:黑豆真的分“雄”和“雌”吗?
客厅射灯选什么光好,打造舒适家居氛围
中秋节的传统食物:月饼、桂花糕、田螺等
鲐鱼和鲅鱼区别
夏季猫咪降暑攻略:六个实用妙招,让爱宠安全度夏
夏日降温,关爱猫咪从这里开始(为你的爱宠创造舒适夏日生活)
中秋将至,你可懂得明清文人的这份月下美学
沙发摆放方位有什么讲究