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
热门推荐
毕业论文参考文献格式指南:Word高效引用技巧
魔兽怀旧服新手入门攻略:十大要点助你快速上手
婴儿髋关节发育不良挂什么科
为什么我的公积金缴纳比例基数和别人不一样?
初学者必看:电吹管多少钱一支?到底该怎么选?
国足备战澳队:锋线寻枪,韦世豪或成关键“爆点”
针对不同脸型的日常妆容技巧全解析
读懂近代史,最容易忽视的四个关键视角
SAR指标完整教学:抛物线指标参数设定与当冲优化
垃圾渗滤液如何有效处理
如何平衡文章深度与读者兴趣
熔盐储热:低成本长寿命大容量的长时储能技术
为什么冬天我们经常能看到树干被刷上白色的石灰浆?
每当你觉得不成功时,读它一遍
E5 2680V4 vs E3 1231 V3:服务器处理器的选择指南
办群众身边的比赛,办群众满意的比赛——第一届全国全民健身大赛举步可就、全民共享
这个小区停车收费方案遭部分业主反对:没公示没收费标准 也不知资金去向
"Through"的用法总结:12种使用方法详解
藏地“基因”的传承:西藏博物馆改扩建项目设计
深度解析:影响液体压力大小的因素及计算方法
Excel中计算万分之一的多种方法详解
修真境界划分:从炼气到渡劫的修行之路
中西医谈护耳之道:科学清洁与日常保健全攻略
日语单词记忆技巧有哪些?
住家阿姨的分寸感究竟该如何把握
诉讼标的是什么?详解民事诉讼中的关键概念
注意 | 刚打完狂犬疫苗又被咬了,还要再打吗?狂犬疫苗常见问题问答→
都金辉主任医生:夏季,如何预防过敏性皮炎?
嘴巴小的女人命运好不好
生物建造:土木工程的未来发展方向