Fortran Coder

查看: 23215|回复: 13
打印 上一主题 下一主题

[求助] CVF中函数的问题

[复制链接]

30

帖子

8

主题

0

精华

熟手

F 币
212 元
贡献
104 点
跳转到指定楼层
楼主
发表于 2014-12-25 10:56:51 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
最近在写一个程序,发现在CVF中将函数采用数学表达式的形式写在程序开始的地方,和单独写一个function进行调用,两者得到的计算结果不一样,不知道怎么回事,还请指导!

很抱歉,由于项目要求,无法将源代码贴在这里。我检查了所有参数声明和intent属性,没有发现什么不对的地方,不知道一般会有哪些原因导致?
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩
世界上有 10 种人:懂 10 进制的人,和不懂 10 进制的人。

30

帖子

8

主题

0

精华

熟手

F 币
212 元
贡献
104 点
沙发
 楼主| 发表于 2014-12-25 17:51:33 | 显示全部楼层
楚香饭 发表于 2014-12-25 14:00
没有源代码很难说明问题。

你如果懂得如何 debug,可以尝试跟踪分析。

这部分代码是属于一个迭代过程中的子程序,我已经debug200多次迭代了,还没有计算问题,正在试着看后面的情况,计算不一样的情况出在迭代很久之后,感觉很奇怪,但采用语句函数的时候确实和参考的一个程序的结果完全一样。
世界上有 10 种人:懂 10 进制的人,和不懂 10 进制的人。

30

帖子

8

主题

0

精华

熟手

F 币
212 元
贡献
104 点
板凳
 楼主| 发表于 2014-12-25 17:52:38 | 显示全部楼层
li913 发表于 2014-12-25 14:57
那个叫语句函数,比如   f(x)=2*x;  需要对f和x的类型进行显示声明。

我是采用implicit real(a-h,k-z)的方式声明整个子程序的变量的。

刚从C转到Fortran,各种不适应啊!
世界上有 10 种人:懂 10 进制的人,和不懂 10 进制的人。

30

帖子

8

主题

0

精华

熟手

F 币
212 元
贡献
104 点
地板
 楼主| 发表于 2014-12-26 16:30:43 | 显示全部楼层
查了下,浮点数的计算结果到后面就慢慢开始不一样了,估计是数值比较小的原因。
唉,一样的代码,在CVF、IVF、GFortran三个里面跑得到三个结果:
(1)CVF的和原来的参考结果一致
(2)IVF编译的时候选择了Qsave、iface:cvf、/arch:IA32、fp:source这几个参数,但是算到中间就出现数组索引值越界(编译时有越界检查,这个是计算的问题吧)
(3)GFortran编译信息很详细,warning很全面细致,但是计算结果和参考结果相比开始是一致的,到后面就不一样了,但是还能跑到底,不知道是不是由于代码中直接将Real*8计算的值直接赋给Real*4以及字符串截断导致的,具体的两个warning如下:
-------1-------Possible change of value in conversion from REAL(8) to REAL(4).
-------2-------CHARACTER expression will be truncated in assignment.
快崩溃了!
世界上有 10 种人:懂 10 进制的人,和不懂 10 进制的人。

30

帖子

8

主题

0

精华

熟手

F 币
212 元
贡献
104 点
5#
 楼主| 发表于 2014-12-28 09:43:53 | 显示全部楼层
li913 发表于 2014-12-27 09:17
cvf运行正确,ivf出现越界,这种情况一般是未初始化变量造成的。在cvf中,默认将变量初始化为零,ivf则不 ...

这种情况能否在IVF加编译选项Qsave和Qzero完全解决?
如果要赋初值的话估计得有成百上千变量了,工作量不是一般的大。
另外,类似这种情况,变量i初值应该赋0还是1,还是只要有个初值都行?
世界上有 10 种人:懂 10 进制的人,和不懂 10 进制的人。

30

帖子

8

主题

0

精华

熟手

F 币
212 元
贡献
104 点
6#
 楼主| 发表于 2015-1-23 11:25:06 | 显示全部楼层
li913 发表于 2014-12-28 16:15
IVF加编译选项Qsave和Qzero不一定能够完全解决
cvf默认的初值是0

目前已经把老版本程序中implicit real改成了implicit none,并且将所有未声明的局部变量进行了声明,common变量还是沿用之前的external+block data的方式赋初值。
为了程序能够在IVF中正常运行,不知道有没有必要将所有的声明的局部变量初始化为0或0.0或' '?
我初步设想是直接复制各个程序模块中的局部变量声明语句,然后改成DATA+变量名+/变量数*0或0.0或' '/,这样就可以认为初始化所有变量了,兴许这样之后程序就可以在IVF中运行了。不知道这样做是否靠谱?
(老板非要将程序转到IVF中,很捉急啊!CVF成动态链接库都不愿意。。。)
世界上有 10 种人:懂 10 进制的人,和不懂 10 进制的人。

30

帖子

8

主题

0

精华

熟手

F 币
212 元
贡献
104 点
7#
 楼主| 发表于 2015-2-7 21:36:20 | 显示全部楼层
花了几周时间,把老程序中的所有变量都声明并且赋初值了(integer赋0,real赋0.0,character赋' '),但是编译后运行还是会出错,程序执行过程中还是有数组越界的问题,仔细看了下,有一个common变量的值莫名其妙不是0,而且每次执行都是那些值,感觉不像没有初始化导致的,不知道会不会是IO的问题,因为老程序需要从txt中读入大量参数。不知道有没有什么解决方法?
此外,发现IVF的write输出到文本文件时,当每行超过一定字符数后会自动换行,即使输出时使用了格式化字符串。自己试着在write中添加了advance='no'也没有作用,不知道该怎么解决,还请大家指导!
世界上有 10 种人:懂 10 进制的人,和不懂 10 进制的人。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-16 01:55

Powered by Tencent X3.4

© 2013-2024 Tencent

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