改写程序中碰到的问题
在改一个水质模型的程序,要求按照f90的标准来改,由于是商业资料无法上传源代码,现在的问题是原来的程序是用include aaa, aaa中用common定义了一些数组,我将其改写成了module,并用allocate定义了这些数组的形状,然后这些数组全部初始化成0了,按道理来来说两者的计算结果应该一致才是,可是在试算1年得到的结果中,前面的1到6月一致,后面渐渐的就出现不同数值了。想请教各位,在用use 替换include,用module和allocate的时候,是不是有什么细节要注意?
计算部分全部没有改。实数也全部定义一致。
这,没有必要的信息还真是不容易猜。 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'
我给修改成了
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
定义数组的部分用一个子程序:
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
类似的。
结果是两者的计算大部分吻合,但有偏差。
我想不出来为什么,唯有debug调试以后才知道。 fcode 发表于 2015-4-14 14:51
我想不出来为什么,唯有debug调试以后才知道。
代码有9000多行,debug都不知道从哪开始,纠结啊。
我觉得是误差,上司非要找出原因,坑啊。 我已经非常明确你的问题是什么现象了。
但对于产生的原因,我确实很茫然,即没有源代码,又不能debug,实在爱莫能助。 fcode 发表于 2015-4-14 15:42
我已经非常明确你的问题是什么现象了。
但对于产生的原因,我确实很茫然,即没有源代码,又不能debug,实 ...
谢谢了。
越改越糟糕,都出现数值震荡了,看来黄金周是泡汤了~~~`:'(:'(:'(
页:
[1]