Fortran最强大的莫过于矩阵运算了,Fortran90标准中允许对数据进行整体操作,这样不仅能加快代码执行效率,还能减少代码量,例如:

1
2
3
4
1    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中的指针可以实现数组中某一块的读取,例如:

1
2
3
4
5
6
7
1    real, dimension(:), pointer :: p1, p2
2 real, target :: var(10)
3 logical :: chi
4 p1=>var(2:4)
5 p2=>var(1:5:2)
6 nullify(p1)
7 chi = associated(p2, var) ! chi = associated(p2)

上述定义了一个指针数组和一个含有10个元素的一维数组,第四行将指针数组指向了var的第2到第4个元素,相当于执行了(p1(1)=>var(2),p1(2)=>var(3),p1(3)=>var(4)),改变p中元素的值就会同时改变var中的值,这要设置的好处就是可以把数据中某一块拿出来单独进行计算。甚至可以不连续的读取数组中的元素,如第五行所示。这里相当于执行了(p2(1)=>var(1),p2(2)=>var(3),p2(3)=>var(5))。两个冒号n: m :k,头一个数字n是引用数组指标开始的地方,第二个数字m是结束的地方,第三个数字k是步长。当不需要这个指针的时候,另外可以用函数nullify解除指针的绑定,将其指向一个不能使用的内存地址。另外用可以用associated函数来检测指针是否已经有了指向一个对象,或者有没有指向,若有则返回.true.,否则返回.false.。

写在最后

Fortran中还可以使用equivalence函数实现变量共享内存,如下:

1
2
real :: a, b
equivalence(a,b)

这里也是不建议使用的。另外需要说明的一点就是,关于变量的声明必须要放在程序的前方,也就是紧接在implicit none的后面,Fortran是不支持随时随地定义变量的,这里是和C/C++有区别的。