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
热门推荐
蜜袋鼯:从外观特征到饲养指南的全面解析
为什么我的WhatsApp收不到信息?
新生儿用品全攻略:为宝宝的温馨小世界准备一切
女命三个七杀命理分析与影响
肺癌晚期吐血了怎么办?肺癌晚期还能活多久?
春节申遗成功背后的江苏“推动力”
俄罗斯硬币10卢布:承载历史的文化瑰宝
2024年公基常识考点汇总——“黑天鹅和灰犀牛事件”
以太坊2.0信标链工作原理
如何理解期权的实际用途与市场价值?期权在投资中有哪些重要作用?
《燕云十六声》陷入性别争议,游戏行业的“女性友好”还有多少含金量?
要想了解什么是白洞,必须先弄清什么是黑洞
心肌因长期COVID-19状况而发炎
逆矩阵求法详解:从定义到计算步骤的全面解析
探秘古代神话:蚩尤的魔神形象与十大魔神的传说
js如何判断全角半角
手机白平衡怎么调?学会拍出满满的氛围感!
漱口水怎么用?正确使用方法、用量及注意事项全解析
十类常见打击乐器有哪些 打击乐有哪些乐器
当前AI监管法律的现状是什么?解析日本与欧盟的比较及对策要点
获中国航空科学技术领域最高奖!甬江实验室成果“上新”
零基础如何软件开发:从入门到实践的全方位指南
如何制作软件开发工具
儿童接种疫苗那些事
食道癌CT能查出来吗
双子座的性格特征解析及致命弱点了解 双子座性格的优点与陷阱
一文读懂激光共聚焦显微镜(LSCM)!
为什么汉朝的皇帝叫帝,而唐宋的皇帝却叫宗?背后究竟有何玄机?
大学专业实力强弱如何判断?这5大官方评价指标可参考!
明朝国库亏缺的幕后黑手——三大利益集团的操控