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
热门推荐
高压锅冬日美食速成攻略
高压锅美食大挑战:土鸡蛋溜溜肉
十二生肖文化:你属什么?
清明节里的十二生肖智慧
清朝皇家园林中的十二生肖:圆明园兽首铜像的历史与文化
首批!江苏宜兴蜀山古南街入选
DeepSeek带你玩转常德:桃花源里的诗画世界
常德冬日赏雪美食之旅:三大景点+特色美食+实用贴士
探秘常德城头山:6000年前的“单元房”
不用把上班每一刻都塞滿!保留「平靜時間」能提升效率,甚至提早完成工作
《携程报告》揭秘:如何用好评引爆酒店流量?
双十一酒店好评攻略:如何回复在线评论提升满意度?
成人泪道堵塞小妙招
泪道堵塞怎么办?从日常缓解到专业治疗的全面指南
从汾酒牧童到IPA酒标:酒文化中的艺术与匠心
怎样培养孩子坚持一项业余爱好
环境是第三位老师
凌乱的家庭环境,会影响孩子的心理成长吗?
王佑硕吕小雨新剧《亲爱的天狐大人》阵容揭秘:仙侠爱情与轻喜剧的完美融合
上班时自信不足?5招教你如何瞬间提升自信感
股市风云变幻,新老股民谨防情绪狂飙
编程猫入选教育部精品课:游戏化学习+AI赋能的创新教育模式获官方认可
朱良春养生粥高压锅版,秋冬必备!
高压锅煮牛排?这个选题有点“悬”
高压锅快速烹饪红烧牛肉,你get了吗?
江苏宜兴举办2025年龙窑过大年活动
被拘留了怎么办?详解行政复议申请流程及特殊情况处理
双十一买高压锅,这些小技巧让你用得更久!
双十一高压锅选购全攻略:从技术到品牌,一文读懂如何挑选
高压锅烹饪:留住更多营养的秘密