|
计算要求是这样的:
有两种文件:
第一种文件数据为 a1,a2,a3....a100
第二种文件数据为 b1,b2,b3...b100
; 其中每种文件各有1000个,文件名分别是x1,x2,....x100(x对应第一种文件)和y1,y2,...y100(y对应第二种文件),分别放入名为x和y的两个文件夹内。
计算过程是:
以各自文件夹的第一个文件为例子,对应文件x1和y1,
b1-a(1,100)
b2-a(1,100)
...
b100-a(1,100)
分别用b1减去全部数据a, b2减去全部数据a,.....直到第a100; 这样得到共10000数据个差。
对它进行运算,对最后的运算结果求和,为输出的第一个数......循环操作全部1000个文件,最后得到共1000个输出结果。
这是经过帮助优化后的计算程序:
[Fortran] 纯文本查看 复制代码 PROGRAM test
IMPLICIT NONE
REAL, ALLOCATABLE :: a(:),b(:),hhs(:)
INTEGER :: i, z, j, k, tn, num, numm
REAL :: summ, cos2, r1, q1, w1
character(160):: filename
Real(8) time
Integer(4) time0, time1, dtime
num=100
numm=num*num
tn=1000
ALLOCATE(a(num),b(num),hhs(numm))
Print*, 'Running...'
Call system_clock(time0)
OPEN(10, FILE='output.dat',status='unknown' )
Do i=1,tn
write(filename,'(i6)') i
Open(200,File="D:\x\"//trim(adjustl(filename))//'.dat',status='old')
READ(200,*) a
close(200)
Open(300,File="D:\y\"//trim(adjustl(filename))//'.dat',status='old')
READ(300,*) b
close(300)
z=0
summ=0.0
r1 = 20
do j = 1, num
do k = 1, num
z=z+1
q1 = b(j)-a(k)
cos2 = (r1*q1+r1*r1+q1*q1)**2/3
w1=sqrt(q1*q1+r1*r1)
if (w1.GT.0.and.w1.LE.20) then
hhs(z)=cos2/(w1*w1*w1)
endif
enddo
enddo
summ=sum(hhs)
WRITE(10,'(1X,F12.6)') summ
enddo
DEALLOCATE(a,b)
close(10)
Call system_clock(time1, dtime)
time = 1D0*(time1-time0)/dtime
Write (*, '(a7,f16.7)') 'Time = ', time
END PROGRAM
现在我想改变一下运算,就是将其中的 r1 = 20由定量换成变量,让它等于以各自文件夹的第一个文件操作所得到的数据差,
对应文件x1和y1,
b1-a(1,100)
b2-a(1,100)
...
b100-a(1,100)
分别用b1减去全部数据a, b2减去全部数据a,.....直到第a100; 这样得到共10000数据。以最初的10000个数据作为r1,然后循环其他文件和它进行计算。
我想问能不能不再另外写循环实现这个目的? 我现在的写法是另外独立写一个循环读取,这样又降低了计算速度。
感谢指导!
|
|