Fortran Coder

查看: 8124|回复: 3
打印 上一主题 下一主题

[数值问题] 循环问题求教

[复制链接]

46

帖子

8

主题

0

精华

熟手

F 币
211 元
贡献
131 点
跳转到指定楼层
楼主
发表于 2015-6-1 18:08:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
计算要求是这样的:
有两种文件:
第一种文件数据为 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,然后循环其他文件和它进行计算。
我想问能不能不再另外写循环实现这个目的? 我现在的写法是另外独立写一个循环读取,这样又降低了计算速度。
感谢指导!
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2015-6-2 10:17:02 | 只看该作者
这逻辑有点复杂,还是没理清。

r1 等于变量没有问题,你可以用任意变量对其赋值。其他逻辑嘛,有点乱,帮不上你。

46

帖子

8

主题

0

精华

熟手

F 币
211 元
贡献
131 点
板凳
 楼主| 发表于 2015-6-3 04:23:26 | 只看该作者
fcode 发表于 2015-6-2 10:17
这逻辑有点复杂,还是没理清。

r1 等于变量没有问题,你可以用任意变量对其赋值。其他逻辑嘛,有点乱,帮 ...

之前我说得不好,现在我努力分成部分地说一说问题:

首先,假设有两种文件,分别放在两个文件夹里,分成是A和B。对应文件是x1,x2,...x1000,以及y1, y2,...y1000,假设每种各1000个文件。

其中,每个单独的文件,无论种类,分别包含10000个数据,数据共有三列(假设)。x对应a数据,y对应b数据。以第一列数据为例,取x1和y1:

b1-a(1,10000)
b2-a(1,10000)
...
b10000-a(1,10000)

对应一组(a1,b1)一共有10000*10000个数据,这是已经写好的程序循环,之后操作全部的x和y,一共有1000组10000*10000个数据。

我想用2-1000组10000*10000个数据和第1组10000*10000个数据进行减法计算,为了提高运算速度,想请教能不能不再另外写循环就实现目的。现在我的办法是把第1组10000*10000个数据另外写到一个文件里,然后去循环和read.


感谢您的帮助!

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

地板
发表于 2015-6-3 08:19:12 | 只看该作者
开一个 10000*10000 的数组,把它存储起来。就不需要写到文件里,循环read了。
但是2-1000组数据与第一组的减法,还是要循环
do i = 2 , 1000
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-3 07:35

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表