【已解决】Fortran77老代码中的do循环,在Fortran95中能否使用?

前言

老师给我了一个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自动给这几个变量的值不一样,所以结果也不一样。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值