前言
老师给我了一个Fortran77的老代码,这段代码在他的电脑上可以顺利运行,在我这里就会出现各种各样的奇怪问题,考虑到老代码新编译器没法好好运行,所以我想把它改写成Fortran95的,但是里面有一些奇怪的语法不知道怎么改。
一、奇怪的运行错误
在导师电脑上可以成功运行,在我这里就会变成NaN
奇怪的是,我想看看哪里开始出错的,加了一句‘write(6,*) d(20,20,20)’在一个函数之前,想看看这个值的变化,这个值和加这一句的位置是随手选的,奇怪的是,不再出现NaN了,虽然结果是错的,但是能够顺利运行下去了,而且换个位置,或者改成‘write(5)’,输出去别处,NaN就又出现了。
二、这是什么写法?
代码如下:
ixjx=ix*jx
ixjxkx=ix*jx*kx
do 40 l=1,ixjx
p(l,1,1)=pbtm
p(l,1,kx)=ptop
40 continue
do 50 l=1,ixjxkx
t(l,1,1)=p(l,1,1)/d(l,1,1)
50 continue
do 60 l=1,ixjx
t(l,1,1)=t(l,1,2)
t(l,1,kx)=t(l,1,kxm1)
60 continue
do循环的上界远远超过循环里的矩阵的上界了,源码里还有各种各样的超界,老师说在过去这么写可以提高运行效率,请问这么写的规则是什么?原理又是什么?Fortran95是不是还能够支持这种写法?
我是win10装了一个Ubuntu的虚拟机,这个代码用gfortran和ifort运行结果不一样。
以下是解决
这是Fortran77很早以前的写法,这么写可以让代码运行更加高效,不用多个do循环嵌套,Fortran是列优先的存储顺序,
a(1,1)a(2,1)a(3,1)a(1,2)a(2,2)a(3,2)a(1,3)a(2,3)a(3,3)这样
从a(1,1)开始向后寻找5个,即a(5,1),就是a(2,2)。
如果需要计算x(i,j)=a(i,j)+a(i,j+1),就可以写成
do 10 i=1,9
x(l,1)=a(l,1)+a(l,2)
10 continue
这种写法在Fortran90就不能用了。
至于不同电脑,不同编译器结果不一样,主要是因为有几个变量没有初始化,导致一开始就有个变量炸了,但是到后来才体现出来。ifort和gfortran自动给这几个变量的值不一样,所以结果也不一样。