Fortran Coder

查看: 13825|回复: 6
打印 上一主题 下一主题

[求助] 改写程序中碰到的问题

[复制链接]

60

帖子

17

主题

0

精华

专家

F 币
454 元
贡献
266 点
跳转到指定楼层
楼主
发表于 2015-4-14 10:48:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在改一个水质模型的程序,要求按照f90的标准来改,由于是商业资料无法上传源代码,现在的问题是原来的程序是用include aaa, aaa中用common定义了一些数组,我将其改写成了module,并用allocate定义了这些数组的形状,然后这些数组全部初始化成0了,按道理来来说两者的计算结果应该一致才是,可是在试算1年得到的结果中,前面的1到6月一致,后面渐渐的就出现不同数值了。
想请教各位,在用use 替换include,用module和allocate的时候,是不是有什么细节要注意?

计算部分全部没有改。实数也全部定义一致。
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2015-4-14 11:56:22 | 只看该作者
这,没有必要的信息还真是不容易猜。

60

帖子

17

主题

0

精华

专家

F 币
454 元
贡献
266 点
板凳
 楼主| 发表于 2015-4-14 14:42:57 | 只看该作者
fcode 发表于 2015-4-14 11:56
这,没有必要的信息还真是不容易猜。

大概是这样的:
原始的代码的定义数组部分是:

common /ustar/ use(ndn), usc2(ndn,ndl), us2(ndn), tausm(ndn), tause(ndn,ndl), &
                us(ndn)

common /rsedi/ dk(ndl),dm(ndn),dm0(ndn),wk(ndl),bar(ndn),p0(ndn,ndl),  &
                qb(ndn),qbik(ndn,ndl),cijk(ndn,ndj,ndl),qs(ndn),       &
                qsik(ndn,ndl),qw(ndn),qwik(ndn,ndl),qbsub(ndn,ndl),    &
                qssub(ndn,ndl),qwsub(ndn,ndl),desik(ndn,ndl),         &
                dewik(ndn,ndl),chekin(ndn,ndl),pwh(n4)

common /rtrib/ bsub(nhs),sbsub(nhs),snsub(nhs),darmor(nhs),rqb(nhs),  &
                rqs(nhs),qbsub1(nhs,ndl),qssub1(nhs,ndl),  &
                qwsub1(nhs,ndl)

common /combsw/ tqb(ndn),tqs(ndn),tqw(ndn),  &
                 tdb(ndn),tds(ndn),tdw(ndn),tqbswall(ndn,ndl),  &
                 tqbsub(nhs),tqssub(nhs),tqwsub(nhs),tqbswsba(nhs,ndl)

common /comtqb/ tqbik(ndn,ndl),tqsik(ndn,ndl),tqwik(ndn,ndl)

common /chkerr/ ndzb

文本格式,文件名是main.com
主程序中调用的时候是include 'main.com'

我给修改成了
[Fortran] 纯文本查看 复制代码
module MAIN1
    implicit none
    real(kind=8),allocatable::use(:), usc2(:,:), us2(:), tausm(:),   &
                        tause(:,:),us(:)
    
    real(kind=8),allocatable::dk(:),dm(:),dm0(:),wk(:),bar(:),       &
                        p0(:,:),qb(:),qbik(:,:),cijk(:,:,:),qs(:),   &
                        qsik(:,:),qw(:),qwik(:,:),qbsub(:,:),        &
                        qssub(:,:),qwsub(:,:),desik(:,:),dewik(:,:), &
                        chekin(:,:),pwh(:)

    real(kind=8),allocatable::bsub(:),sbsub(:),snsub(:),darmor(:),   &
                       rqb(:),rqs(:),qbsub1(:,:),qssub1(:,:),        &
                       qwsub1(:,:)

    real(kind=8),allocatable::tqb(:),tqs(:),tqw(:),tdb(:),tds(:),    &
                        tdw(:),tqbswall(:,:),tqbsub(:),tqssub(:),    &
                        tqwsub(:),tqbswsba(:,:)

    real(kind=8),allocatable::tqbik(:,:),tqsik(:,:),tqwik(:,:)

    integer::ndzb
end module MAIN1


定义数组的部分用一个子程序:
[Fortran] 纯文本查看 复制代码
subroutine alloca
    use para
    use MAIN1

    implicit none
! ======== MAIN1 ========
    allocate( use(ndn), usc2(ndn,ndl), us2(ndn), tausm(ndn),         &
              tause(ndn,ndl), us(ndn) )

    allocate( dk(ndl),dm(ndn),dm0(ndn),wk(ndl),bar(ndn),p0(ndn,ndl), &
              qb(ndn),qbik(ndn,ndl),cijk(ndn,ndj,ndl),qs(ndn),       &
              qsik(ndn,ndl),qw(ndn),qwik(ndn,ndl),qbsub(ndn,ndl),    &
              qssub(ndn,ndl),qwsub(ndn,ndl),desik(ndn,ndl),          &
              dewik(ndn,ndl),chekin(ndn,ndl),pwh(n4) )

    allocate( bsub(nhs),sbsub(nhs),snsub(nhs),darmor(nhs),rqb(nhs),  &
              rqs(nhs),qbsub1(nhs,ndl),qssub1(nhs,ndl),              &
              qwsub1(nhs,ndl) )

    allocate( tqb(ndn),tqs(ndn),tqw(ndn),                            &
              tdb(ndn),tds(ndn),tdw(ndn),tqbswall(ndn,ndl),          &
              tqbsub(nhs),tqssub(nhs),tqwsub(nhs),tqbswsba(nhs,ndl) )

    allocate( tqbik(ndn,ndl),tqsik(ndn,ndl),tqwik(ndn,ndl) )

! ======== initial ========

    use=0.0; usc2=0.0; us2=0.0; tausm=0.0
    tause=0.0;us=0.0
    
    dk=0.0;dm=0.0;dm0=0.0;wk=0.0;bar=0.0;p0=0.0
    qb=0.0;qbik=0.0;cijk=0.0;qs=0.0;qsik=0.0
    qw=0.0;qwik=0.0;qbsub=0.0;qssub=0.0
    qwsub=0.0;desik=0.0;dewik=0.0
    chekin=0.0;pwh=0.0

    bsub=0.0;sbsub=0.0;snsub=0.0;darmor=0.0;rqb=0.0
    rqs=0.0;qbsub1=0.0;qssub1=0.0;qwsub1=0.0

    tqb=0.0;tqs=0.0;tqw=0.0;tdb=0.0;tds=0.0;tdw=0.0
    tqbswall=0.0;tqbsub=0.0;tqssub=0.0;tqwsub=0.0
    tqbswsba=0.0

    tqbik=0.0;tqsik=0.0;tqwik=0.0

    ndzb=0


end subroutine alloca


主程序中是:
use main1

call alloca

然后其它子程序都是use main1

类似的。

结果是两者的计算大部分吻合,但有偏差。

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

地板
发表于 2015-4-14 14:51:33 | 只看该作者
我想不出来为什么,唯有debug调试以后才知道。

60

帖子

17

主题

0

精华

专家

F 币
454 元
贡献
266 点
5#
 楼主| 发表于 2015-4-14 15:38:31 | 只看该作者
fcode 发表于 2015-4-14 14:51
我想不出来为什么,唯有debug调试以后才知道。

代码有9000多行,debug都不知道从哪开始,纠结啊。
我觉得是误差,上司非要找出原因,坑啊。

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

6#
发表于 2015-4-14 15:42:00 | 只看该作者
我已经非常明确你的问题是什么现象了。

但对于产生的原因,我确实很茫然,即没有源代码,又不能debug,实在爱莫能助。

60

帖子

17

主题

0

精华

专家

F 币
454 元
贡献
266 点
7#
 楼主| 发表于 2015-4-16 09:40:51 | 只看该作者
fcode 发表于 2015-4-14 15:42
我已经非常明确你的问题是什么现象了。

但对于产生的原因,我确实很茫然,即没有源代码,又不能debug,实 ...

谢谢了。

越改越糟糕,都出现数值震荡了,看来黄金周是泡汤了~~~`
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-4-28 09:32

Powered by Tencent X3.4

© 2013-2024 Tencent

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