Fortran Coder

查看: 6061|回复: 2
打印 上一主题 下一主题

[流程控制] 求助:程序死循环,不知道判断语句怎么改,求帮助,非...

[复制链接]

10

帖子

2

主题

0

精华

入门

F 币
56 元
贡献
28 点
跳转到指定楼层
楼主
发表于 2015-7-3 17:34:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
沙发
发表于 2015-7-4 09:07:44 | 只看该作者
在 p_t 函数里,你知道写
if((abs(rd).ge.1.e-8).and.(number.le.1000))goto 77
而在 rov 和 rol 函数里,你却写成了
if((abs(DP/(rou + 0.0010)) .gt. 1e-5).or.(number.le.30))goto 99
这就导致了无限死循环。尝试也写成 .and.
你的代码有三层嵌套的迭代,速度非常慢,我没耐心做完。
做完一次 rol 和 rov 就耗时几十分钟。p_t 函数里,number 要从 500 到 1000,要做500次。我可没那么大的耐心。
我建议你好好优化一下你的算法。

最后,给你一些善意的忠告:
1. 不要用固定格式,而用自由格式
2. 用 Implicit None
3. 使用检查程序接口的编译器,例如 IVF 或 gfortran,而放弃 CVF 这种老的编译器。这对你的代码有好处。
4. 你的程序中大量的实参虚参不一致。例如虚参的 z(2,2) 而实参却是 z(2,1),这很危险。
5. 对于规则的数据,例如你的 cr_sk.dat,读取时不必指定格式 FORMAT(1X,2000g15.6) , read( 13 , * ) 就可以了
6. 不要输出那么多 liumeng,你的程序本来就够慢了,输出这么多只会让你的程序更慢。更好的办法是 rov、rol 迭代时,把 number 输出出来。

10

帖子

2

主题

0

精华

入门

F 币
56 元
贡献
28 点
板凳
 楼主| 发表于 2015-7-6 09:01:31 | 只看该作者
真的非常非常感谢您。对一个研一刚进实验室初涉Fortran的我来说帮助非常非常大,我按照您的建议再修改一下。再次感谢。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-11-1 09:20

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表