Fortran Coder

标题: 程序运行有问题,有关子程序C06LAF [打印本页]

作者: zjl88915    时间: 2014-2-26 14:53
标题: 程序运行有问题,有关子程序C06LAF
我使用的是CVF编译器,程序是以前师兄编好的,其他类似的几个代码都没有问题,但是这个我调试了好久,就是运行不出理想的结果。代码较长,附件中包含所有需要的文件,以及错误结果及理想结果的截图,跪求大神帮助啊。。。


问题.png (5.49 KB, 下载次数: 1825)

这是屏幕显示的错误结果

这是屏幕显示的错误结果

正常.png (4.85 KB, 下载次数: 1788)

这是应该得到的理想结果

这是应该得到的理想结果

Qiuzhu.zip

59.09 KB, 下载次数: 9

这是所有程序文件


作者: 楚香饭    时间: 2014-2-26 14:53
本帖最后由 chuxf 于 2014-2-26 16:48 编辑

有一点可以引起你的注意:

主程序中,common 部分:

[Fortran] 纯文本查看 复制代码
common H,z
          common ua0,uw0,rw
          common E1w,G1w,E1a,G1a,E2w,G2w,E2a,G2a,E01w,E01a,E02w,
     +                    E02a
          common Cw,Cvw,Ca,Cva,Da,Dw,B,C


分别有 2,3,12,8 个变量

而被变换函数 Ua,Uw 中,common 变量为

[Fortran] 纯文本查看 复制代码
common H,z
          common n0,Sl0,Sg0,ua0,uw0,kw,rw,ka,g,R,Temp,M,Uatm
          common E1w,G1w,E1a,G1a,E2w,G2w,E2a,G2a,E01w,E01a,E02w,
     +                    E02a         
          common Cw,Cvw,Ca,Cva,Da,Dw,B,C


分别有 2,13,12,8 个变量

common 没有对齐,这样的结果是非常可怕的。

请注意,common 并不根据变量名字来一一对应,而是根据变量顺序来对应!!这就导致了你 Ua,Uw 中的 n0,Sl0,Sg0 的值与主程序完全不同!!

我建议你补齐主程序中的10个common变量:common n0,Sl0,Sg0,ua0,uw0,kw,rw,ka,g,R,Temp,M,Uatm

作者: 楚香饭    时间: 2014-2-26 15:20
你的程序走到了 412 行,这里让 IERR = 4,而后因为 IERR 而导致输出错误提示后程序结束。

这是良性错误,即你的代码自行处理的错误。

你可以追溯到 383 行,此处的 IF 不满足条件。RELERX.GT.0.1D0*ERREST(NCURR) ,即 0.1D-3 不大于 01*3.98,因而跳转到412行,IERR=4

于是你看到错误提示为 IFAIL = 4

4 是你的程序自行定义的错误代码,与语法无关。至于它代表什么含义,为什么会抛出这个错误,则要问代码作者或根据你的专业来分析了。
作者: fcode    时间: 2014-2-26 15:42
从 NAG Library 的帮助里可以看到: c06laf 是用于反拉普拉斯变换。

IFAIL = 4
The required accuracy cannot be obtained. It is possible that ALPHAB is less than 
Alternatively, the problem may be especially difficult. Try increasing TFAC, ALPHAB or both.

意思是,需要的精度无法达到。可能是 AlphAB 小于 alpha
试着增加 TFAC ALPHAB 参数,或者两个都增加。
作者: zjl88915    时间: 2014-2-26 15:45
fcode 发表于 2014-2-26 15:42
从 NAG Library 的帮助里可以看到: c06laf 是用于反拉普拉斯变换。

IFAIL = 4

对啊   c6laf用于拉普拉斯逆变换,但是我按照错误提示对相关参数修改后,问题依然存在。。。。
作者: fcode    时间: 2014-2-26 16:17
zjl88915 发表于 2014-2-26 15:45
对啊   c6laf用于拉普拉斯逆变换,但是我按照错误提示对相关参数修改后,问题依然存在。。。。 ...

你手边有 C06laf 的帮助吗?
我建议你认真阅读一下,以便了解函数的局限。设定合适的算例来运算。

我想你的代码里是没有错误的,绝大多数都是 NAG 库里的,输入输出代码很简单,没有问题。

应该还是算例不符合函数库的需求。一般不轻易怀疑函数库的错误。

你的拉氏域函数 Ua 太复杂了,再反变换回来就更复杂了,我实在没有精力帮你分析它。请原谅这些事情我恐怕不能代劳了。我想这恐怕不是一个 Fortran 的代码问题,而是一个学术问题了。
作者: zjl88915    时间: 2014-2-26 20:11
chuxf 发表于 2014-2-26 16:42
有一点可以引起你的注意:

主程序中,common 部分:

谢谢您的指导,非常感谢!不管有没有用,都谢谢您的帮助。
作者: zjl88915    时间: 2014-2-26 20:12
fcode 发表于 2014-2-26 16:17
你手边有 C06laf 的帮助吗?
我建议你认真阅读一下,以便了解函数的局限。设定合适的算例来运算。

谢谢您的建议,非常中肯。我会虚心接受的!
作者: zjl88915    时间: 2014-2-26 20:28
chuxf 发表于 2014-2-26 14:53
有一点可以引起你的注意:

主程序中,common 部分:

你好,再次打扰不好意思。我按照您的建议修改后,出现新的问题,截图如下:不知道神马情况啊。。。。

NQ.png (8.75 KB, 下载次数: 1651)

NQ.png

作者: 楚香饭    时间: 2014-2-26 20:39
发你修改后的程序。这个错误就比较简单一些了
作者: zjl88915    时间: 2014-2-27 11:50
chuxf 发表于 2014-2-26 20:39
发你修改后的程序。这个错误就比较简单一些了

您好,昨晚学校断网,没办法给您回复了。多谢帮助,附件是我修改后的文件,请您再帮我看一下吧。

xiugai.rar

52.88 KB, 下载次数: 1


作者: 楚香饭    时间: 2014-2-27 12:14
本帖最后由 chuxf 于 2014-2-27 12:16 编辑

嗯,这个错误就很明了了。

Ua,Uw,Set 三个函数中,没有对  m1a,m2w,m2a 的定义,于是这三个量默认是整型的。

而我猜,你是想让他们是双精度。因为计算时他们的值小于1,整型的话就=0了,而后被 Cw=(m1w-m2w)/m2w 作为分母,出现了除0错误。


在这三个函数中,添加对  m1a,m2w,m2a 的定义。

[Fortran] 纯文本查看 复制代码
double precision m1a,m2w,m2a


得到如下计算结果,不知是否正确:
------------------------------------------------------------------
       t(s)     Pa(kPa)    Pw(kPa)    Set(cm)
------------------------------------------------------------------
  0.1000E+05    0.43307    0.63307    0.00000


作者: zjl88915    时间: 2014-2-27 13:08
chuxf 发表于 2014-2-27 12:14
嗯,这个错误就很明了了。

Ua,Uw,Set 三个函数中,没有对  m1a,m2w,m2a 的定义,于是这三个量默认是整型的 ...

太感谢您了!就是我想要的结果。您的指导真的帮了我很大的忙。
作者: 楚香饭    时间: 2014-2-27 13:17
zjl88915 发表于 2014-2-27 13:08
太感谢您了!就是我想要的结果。您的指导真的帮了我很大的忙。

不客气,常来论坛看看。
作者: zjl88915    时间: 2014-2-27 14:30
chuxf 发表于 2014-2-27 13:17
不客气,常来论坛看看。

我按照你的指导修改后,可以运行了。但是当我读取1D_Unsat.dat这个文件中的T(1)这个数时,当T(1)<1e7时,很正常,一旦大于就又出现以前的问题了(正常的话我需要算到T(1)=1e11)。我按照C06LAF子程序的帮助文件的错误提示进行修改,问题依然存在。 现在附件里是程序和问题截图,有时间您再帮我看下?我是小白。。。但是这个程序我需要尽快弄出来,好无力的赶脚。。。

作者: 楚香饭    时间: 2014-2-27 14:54
这个恐怕就是管理在 4 楼说的那种情况了。

T(1) 增大以后,要达到相同的精度也就越困难,你需要同步调整其他的参数,例如 RELERR,TFAC,ALPHAB(根据你的具体情况)


作者: zjl88915    时间: 2014-2-27 14:59
chuxf 发表于 2014-2-27 14:54
这个恐怕就是管理在 4 楼说的那种情况了。

T(1) 增大以后,要达到相同的精度也就越困难,你需要同步调整其 ...

恩。。。那我只有再看看吧。。。但是我觉得问题不一定就是出在提示的地方。因为我这里类似这个计算的其他几个程序我计算时即使T很大也没有出现这个问题。唉。。。
作者: zjl88915    时间: 2014-2-27 16:23
chuxf 发表于 2014-2-27 14:54
这个恐怕就是管理在 4 楼说的那种情况了。

T(1) 增大以后,要达到相同的精度也就越困难,你需要同步调整其 ...

您好,在您方便的时候,可不可以帮我再看一下?附件里是我另外的一个程序以及C06LAF的帮助文件,那个运行没有任何问题,两个程序的代码差不多的。。。只是输入的数有个别不同。

作者: schoolhui    时间: 2014-9-23 15:34
你好,请问你有完整的NAG fortran library 源码没有?
作者: zjl88915    时间: 2014-9-29 13:44
schoolhui 发表于 2014-9-23 15:34
你好,请问你有完整的NAG fortran library 源码没有?

不好意思,这个真没有。。。




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