作者Yagyu (近在眼前)
看板Fortran
标题Re: [问题] 效率
时间Mon Nov 11 21:27:35 2013
※ 引述《DMFC (sole)》之铭言:
: 贴一部份程式码,fortran90语法
do i=1,nx ; do j=1,ny ; do k=1,nz
csum=sum(coeff(1:np)*cdexp)/Vol
csumout(i,j,k)=csum
end do ; end do ; end do
sum(coeff(1:np)*cdexp)
请问这边是要将整个 coeff(1:23000) 乘上 cdexp 再做 sum 吗?
会这麽问是因为我不确定你未贴上程式码部分是否还有 np 的 loop
如果没有 np loop, 同时 cdexp 只是个常数,不会随 nx,ny,nz 变动
那可以试着将这部份移出回圈外, 这样省得每次 loop 都要重算一遍
如果有 np loop, 那请无视我的想法
另外输出的部份
do i=1,nx
do j=1,ny
do k=1,nz
csumout(i,j,k)=sum(coeff(1:np)*cdexp)/Vol
end do
end do
end do
do k=1,nz
do j=1,ny
do i=1,nx
csumout(i,j,k)=sum(coeff(1:np)*cdexp)/Vol
end do
end do
end do
两者差异 请参考彭国伦先生的fortran工具书 应该是在阵列章节中的多维阵列那边
没记错的话 是跟记忆体存放资料方式有关 这边变动我想绝对有帮助
: 请问一下
: 由於资料量不算小
: 目前测试 nx=ny=nz=47, np=23000
: 上面贴的部份是需要最久计算的部份
: 普通执行需要约两分钟(测试用参数)
: 若是把第三行去掉
: 则可以10秒内结束
: 可是我就是要把这个资料输出
: 才用了一个三维 ARRAY 把资料存起来
: 然後离开这个 LOOP 後再写出
: 如果把 WRITE 写在 LOOP 内
: 则情况会更糟
: 请问有什麽方法可以处理这窘境
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.115.247.64
※ 编辑: Yagyu 来自: 59.115.247.64 (11/11 21:29)