yxb345 发表于 2007-5-22 15:36

fortran计算时cpu,内存

我在用fortran计算时前12个小时cpu利用率100%,后面就基本不用cpu,但是计算并没有完成,是怎么回事?我用的是微软的fortran powerstation,for90

[ 本帖最后由 yxb345 于 2007-5-22 15:38 编辑 ]

suffer 发表于 2007-5-22 16:17

贴程序看看

yxb345 发表于 2007-5-22 16:31

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 编辑 ]

suffer 发表于 2007-5-22 16:39

程序好像没有什么问题
kk.txt没有输出吗?

不行再程序中设置个断点看看,比如write前面

yxb345 发表于 2007-5-22 16:40

已经算了快24个小时了,还没有结果。

suffer 发表于 2007-5-22 16:42

原帖由 yxb345 于 2007-5-22 16:40 发表 http://www.chinavib.com/forum/images/common/back.gif
已经算了快24个小时了,还没有结果。

这个程序不应该运行这么长时间的,从cpu的情况看应该已经停止运行

yxb345 发表于 2007-5-22 16:44

后面就不怎么占用cpu了.kk.txt一直是0kb.但是内存好象占用很多.电脑反应很慢

[ 本帖最后由 yxb345 于 2007-5-22 16:45 编辑 ]

yxb345 发表于 2007-5-22 17:00

请问一下在build的时候出现一个警告,好象是说我的矩正太大,得到的结果可能不正确.这对结果有影响吗?如果有,如何改进?

suffer 发表于 2007-5-22 17:04

原帖由 yxb345 于 2007-5-22 17:00 发表 http://www.chinavib.com/forum/images/common/back.gif
请问一下在build的时候出现一个警告,好象是说我的矩正太大,得到的结果可能不正确.这对结果有影响吗?如果有,如何改进?

你这么说估计就是这个问题了,改进算法,不要一次性读入所有数据,可以读一点处理一点

suffer 发表于 2007-5-22 17:05

下面的程序可以检测你的机器最大能开的数组大小,可以看看

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

心灯 发表于 2007-5-23 21:10

原帖由 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说的方法你可以尝试一下,如果你真的要按照你原来的思路做,我建议你缩小矩阵的维数,然后多次读取文件,重复利用这个矩阵空间,不占用那么大的内存。

yxb345 发表于 2007-5-29 20:28

多谢高手指点!!
另外还有一个问题请教:
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 编辑 ]

suffer 发表于 2007-6-3 12:24

1. DIRECT是二进制文件的读取方式
2. 看看read命令的帮助文件吧
3. 稀疏矩阵一般采用二维存储或者一维存储,比较多的是用一维存储,建议看看有限元方面的书一般对这些存储格式都有介绍的
页: [1]
查看完整版本: fortran计算时cpu,内存