Fortran Coder

标题: 求助:程序死循环,不知道判断语句怎么改,求帮助,非... [打印本页]

作者: lmbh2014    时间: 2015-7-3 17:34
标题: 求助:程序死循环,不知道判断语句怎么改,求帮助,非...
http://p.fcode.cn/_1w65E
http://p.fcode.cn/_oVLOr
http://p.fcode.cn/_K1EJM

作者: vvt    时间: 2015-7-4 09:07
在 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 输出出来。

作者: lmbh2014    时间: 2015-7-6 09:01
真的非常非常感谢您。对一个研一刚进实验室初涉Fortran的我来说帮助非常非常大,我按照您的建议再修改一下。再次感谢。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2