fortran计算时cpu,内存
我在用fortran计算时前12个小时cpu利用率100%,后面就基本不用cpu,但是计算并没有完成,是怎么回事?我用的是微软的fortran powerstation,for90[ 本帖最后由 yxb345 于 2007-5-22 15:38 编辑 ] 贴程序看看 real K(1:8922,1:8922),a(1:89103,1:3)
open(unit=1,file='filestiffness.txt',status='old')
open(unit=2,file='kk.txt',status='new')
read(1,*)((a(i,j),j=1,3),i=1,89103)
do 10 i=1,8922
do 20 j=1,8922
do 30 n=1,89103
if (a(n,1).eq.i.and.a(n,2).eq.j) then
K(i,j)=a(n,3)
end if
30 continue
20 continue
10 continue
!100 format(1x,8922(e19.12,1x))
write(2,*) ((K(i,j),j=1,8922),i=1,8922)
end
这个程序的功能是将数组a的第一列和第二列作为行号和列号给第三列在k中定位.
filestiffness.txt内容如下:
10 9 2558
6 4 5285
3 35582
…………
……………
[ 本帖最后由 yxb345 于 2007-5-22 16:39 编辑 ] 程序好像没有什么问题
kk.txt没有输出吗?
不行再程序中设置个断点看看,比如write前面 已经算了快24个小时了,还没有结果。 原帖由 yxb345 于 2007-5-22 16:40 发表 http://www.chinavib.com/forum/images/common/back.gif
已经算了快24个小时了,还没有结果。
这个程序不应该运行这么长时间的,从cpu的情况看应该已经停止运行 后面就不怎么占用cpu了.kk.txt一直是0kb.但是内存好象占用很多.电脑反应很慢
[ 本帖最后由 yxb345 于 2007-5-22 16:45 编辑 ] 请问一下在build的时候出现一个警告,好象是说我的矩正太大,得到的结果可能不正确.这对结果有影响吗?如果有,如何改进? 原帖由 yxb345 于 2007-5-22 17:00 发表 http://www.chinavib.com/forum/images/common/back.gif
请问一下在build的时候出现一个警告,好象是说我的矩正太大,得到的结果可能不正确.这对结果有影响吗?如果有,如何改进?
你这么说估计就是这个问题了,改进算法,不要一次性读入所有数据,可以读一点处理一点 下面的程序可以检测你的机器最大能开的数组大小,可以看看
Program Tarray
implicit none
integer::size,error=0
integer,parameter::one_mb=1024*1024
character,allocatable::a(:)
write(*,*) size,error
open(unit=9,file='result.txt',status='unknown')
do while(.true.)
size=size+one_mb
allocate(a(size),stat=error)
if(error.ne.0)then
exit
end if
write(9,"('allocate',I10,'byte')")size
write(9,"(F10.2,'MB used')")real(size)/real(one_mb)
write(9,"(F10.2,'MW used')") real(size)/(real(one_mb)*16.0)
deallocate(a)
end do
stop 原帖由 yxb345 于 2007-5-22 16:31 发表 http://www.chinavib.com/forum/images/common/back.gif
real K(1:8922,1:8922),a(1:89103,1:3)
open(unit=1,file='filestiffness.txt',status='old')
open(unit=2,file='kk.txt',status='new')
read(1,*)((a(i,j),j=1,3),i=1,89103)
do 10...
我不清楚你的完整的数据文件是什么样子的,所以下面提出的几个问题可能不恰当,但是请你参考:
1. 很明显,你的数据文件a的元素个数(仅针对行)不等于K中的矩阵元素个数,所以对K不给初始值可能让某些没有赋值得元素任意赋值,造成想象不到的偏差。
2. 如果a中元素某两行,前两列相同,第三列不同,如何考虑?(如果存在这样的情况)
3. 如果a中的第一列和第二列元素都小于等于8922,那么你完全可以用一个循环实现,即
do ii=1,89103
K(a(ii,1),a(ii,2)) = a(ii,3)
enddo
大大的减少计算时间。
4. suffer说的方法你可以尝试一下,如果你真的要按照你原来的思路做,我建议你缩小矩阵的维数,然后多次读取文件,重复利用这个矩阵空间,不占用那么大的内存。 多谢高手指点!!
另外还有一个问题请教:
1.filestiffness.txt这个文件的读取方法应该是"DIRECT"还是其它?
2.我把矩阵分块后,为何我算得的结果并不正确?我需要得到的是一个8992列的矩阵,而实际得到的是一个四列的矩阵.是不是读取文件的错误?(我让第一个循环为i=1,1000,第二个为1,8922,只过把判断条件改为(if a(i,1).eq.(i+1000).and.a(i,2).eq.j),后面依此类推,i+1000,i+2000````,i+8000后面再将得到的9个K组合
3.如果采用稀疏矩阵,FORTRAN该如何实现?
另外,在矩阵a中缺少的元素会自动在k中赋0值,我用一个小矩阵试过!
[ 本帖最后由 yxb345 于 2007-5-29 20:48 编辑 ] 1. DIRECT是二进制文件的读取方式
2. 看看read命令的帮助文件吧
3. 稀疏矩阵一般采用二维存储或者一维存储,比较多的是用一维存储,建议看看有限元方面的书一般对这些存储格式都有介绍的
页:
[1]