Fortran循环语句
Fortran中循环语句结构一共有两种,一种是do关键字,这里类似于C/C++中的for循环(更像Python中的for),另外一种是当型循环,通过do while关键字实现。
do语法结构:
新标准123do i=n,m,k 循环体end do
旧标准123do 100 i=n,m,k 循环体100 continue
上述语法表述的意思是变量i的值从n遍历到m,遍历步长为k(可省略,默认为1),新标准看起来很直观。旧标准中do后面的100相当于是给它起了一个别名,需要匹配对应的100 continue。这种结构不再建议使用。例子:
12341 integer :: n, var(10)2 do n=1,103 var(n) = n4 end do
上述语句通过do循环将变量var的元素进行了赋值。另外do循环还可以嵌套使用。例如:
1234561 integer :: n, m, var(5,10)2 do n=1,103 do m=1,54 var(m,n)=m*n5 ...
Fortran条件语句
Fortran中有主要有两种条件结构语句,一种是通过if实现,另外一种是通过select实现。
if 语句最简单的逻辑结构为:
1if(条件) 语句体
若条件成立,则执行语句体。例子:
1if(a>5) b=6
若a的数值大于5,则就给变量赋值为6。
稍复杂一些的逻辑结构为:
12345if(条件) then 语句体1else 语句体2end if
若条件成立,则实行语句体1,否则执行语句体2。
例子:
123451 if(a>5) then2 b=23 else4 b=65 end if
判断条件不止一个的条件结构为:
123456if(条件1) then 语句体1else if(条件2) then 语句体2......end if
若满足条件1则执行语句体1,否则判断条件2,若满足执行语句体2,否则判断……
注意这里的第二个if后面还要跟一个then,不要漏掉。
select 语句select语句有点类似C/C++中的switch语句。结构为:
123456789select case(a) ...
Fortran输入输出
今天聊一聊Fortran中的输入和输出。作为科学计算语言,免不了涉及到数据的读取和输出(例如读取输入卡信息)。Fortran提供了十分简洁的输入输出函数,日常操作是完全够用了。
输出Fortran中的输出函数有两个,分别是write和print。
121 write(*,*) "Hello World!"2 print *, "Hello World!"
上述两个语句输出效果在这里是等价的,我们注意到write中有两个参数,这里都是星号*,这两个星号是默认参数,第一个参数是设置输出位置,默认为屏幕。第二个参数是设置输出格式,默认没有格式,完全输出。print输出到屏幕,唯一的参数是设置格式用的,不过不再推荐使用print函数,write已将print的功能覆盖。
这里先讲解一下Fortran的格式,常用的格式标识符如下(不区分大小写):
x 输出空格
a 输出字符串(不限字符个数)
i 输出整数(完整形式为iw.m)
f 浮点数(完整形式为fw.d)
e 指数形式(完整形式为ew.d)
...
Fortran运算符
Fortran中包含有算术运算符、关系运算符和逻辑运算符三种运算符。各类运算符如下表所示:
算数运算符
功能
算符
示范
加法
+
a = b + c
减法
-
a = b - c
乘法
*
a = b * c
除法
/
a = b / c
乘方
**
a = b**2
算符优先级是:乘方>乘法和除法>加法和减法。
关系运算符
功能
算符
F77
示范
恒等
==
.eq.
a==b
大于
>
.gt.
a>b
大于等于
>=
.ge.
a>=b
小于
<
.lt.
a>=b
小于等于
<=
.le.
a<=b
不等于
/=
.ne.
a/=b
其中F77中表示的是老标准中的写法,都是英文单词的首字母组成的。
逻辑运算符
功能
算符
示范
非
.not.
. ...
Fortran矩阵运算
Fortran最强大的莫过于矩阵运算了,Fortran90标准中允许对数据进行整体操作,这样不仅能加快代码执行效率,还能减少代码量,例如:
12341 integer :: var1(3), var2(3), var3(3) = [1,2,3]2 var1 = var3*3 ! var1 = [3,6,9]3 var2 = var3 + 5 ! var2 = [6,7,8]4 var3 = var1*var2 ! var3 = [18,42,72]
上述代码定义了3个数组var1、var2和var3,并将var3进行了初始化。第二行代码将var3整体乘以3并赋值给了var1,第三行将var3整体都加了5并赋值给var2,第四行将var1和var2逐个元素相乘并赋值给了var3。我若想让变量刚开始初值为0,则可以简单的令var1=0就可以实现了,而不需要写一个循环,逐个初始化。感叹号 ! 是代码注释标识,Fortran没有像C/C++中一样的块注释(/* */)。另外老代码中的注释标识为c、C(因 ...
Fortran变量声明
Fortran代码是由主程序(program),子过程(subroutine),子函数(function),以及模块(module,submodule)组成。
program与C/C++中的main函数类似,每一个project必须也仅能含有一个。
subroutine和function则对应于C/C++中的有返回值和无返回值的函数。
module和submodule是Fortran中特有的,方便共享变量和函数。
如下是一个合法的Fortran程序:
12341 program main2 implicit none3 write(*,*) “Hello World!”4 end program main
第一行是主程序声明program,其中main为主程序的名字,也可以起其他的名字,第二行代码是要求这个程序中的变量必须显式的定义,因为Fortran中有一个隐含规则,就是以ijklmn开头的变量名默认为单精度整数(4byte),其他变量名为单精度浮点数(4byte),不作变量声明即可使用。不过这个规则现已经过时,尤其在程序调 ...
Fortran指针和数组
Fortran声明变量的同时也可以加一些限定词以表明这个变量的属性。例如上次教程中提到的parameter关键字就可以限定变量为常数。这个关键字在定义变量时类似于C/C++中的const关键字,需要在声明的同时赋初值,并且之后不能被修改。声明方式如下:
1integer, parameter :: var = 5
这里定义了一个整数常量var,并赋初值为5。
指针Fortran90/95标准中首次引入了指针(pointer)的概念。这里和C/C++不同的是,若要声明一个变量是指针,那么它的指向目标也要有目标(target)属性的修饰。Fortran中的指针更像是C/C++中的引用,或者说是变量别名。
1231 real, pointer :: p2 real, target :: var3 p=>var
上述代码声明了一个浮点型指针p和浮点型变量var,并将p指向了var。正如上所说p和var实际上是指向同一块内存空间的,其中一个变量的指若是发生了变化,那另一个变量的值也会随着发生变化。当然,这里还体会不到Fortran ...
Fortran简介
简介Fortran是Formula Translation的缩写,是历史上第一种高级计算机语言,它是上世纪50年代由IBM公司设计并研发用于科学计算的语言。Fortran一直以高性能著称,有强大的数组操作功能。Fortran77版本的发布,使得Fortran在业内流行起来。但后续版本的严重滞后,使得近来Fortran变得不流行。现在大多也只是在科研领域会见到Fortran的身影。
Fortran90/95标准中加入了现代语言的风格,例如引入了自由编程格式。Fortran03/08标准更是引入了面向对象的功能,后续版本中也引入了并行实现(Coarray),之前的版本Fortran是不支持并行功能的,因此衍生出了一些支持并行功能的Fortran分支,例如openmp和openmpi。最新的Fortran18标准中还引入了函数式编程的范式。
gfortran环境搭建Fortran是一种静态语言,从而需要编译后才能执行,现在比较流行的编译器有intel开发的ivf编译器以及开源组织GNU的gfortran编译器,不同的编译器含有不同于标准的功能,这里才用gfortran编译 ...