Fortran Coder

查看: 9213|回复: 1
打印 上一主题 下一主题

[原创] 有这个一个高维数组存储的问题

[复制链接]

9

帖子

5

主题

0

精华

入门

F 币
57 元
贡献
35 点
跳转到指定楼层
楼主
发表于 2021-3-4 23:01:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
01PROGRAM Cs
02 
03      IMPLICIT NONE
04 
05         
06        integer i,j,k,m,n,maxx,x1,x2,y1,y2,z1,z2
07        integer Num,iNum
08         
09        real(kind=8) time1,time2,time3,time4,time5,time6
10 
11        real(kind=8) numi
12        real(kind=8) con
13 
14        real,allocatable :: Ex(:,:,:),Hy(:,:,:),Hz(:,:,:),indt(:,:,:)
15        maxx=70;numi=1.0;Num=10
16        time1=0.0;time2=0.0;time3=0.0;time4=0.0;time5=0.0;time6=0.0
17        allocate(Ex(maxx,maxx,maxx),Hy(maxx,maxx,maxx)
18     +        ,Hz(maxx,maxx,maxx),indt(maxx,maxx,maxx))
19        Ex=0;indt=0
20        x1=15;x2=30
21        y1=20;y2=35
22        z1=18;z2=30
23        do k=1,maxx
24        do j=1,maxx
25        do i=1,maxx
26            if(x1<=i.and.i<=x2) indt(i,j,k)=1
27            if(y1<=j.and.j<=y2) indt(i,j,k)=1
28            if(z1<=k.and.k<=z2) indt(i,j,k)=1
29        enddo
30        enddo
31        enddo
32        num=0
33        do k=1,maxx-1
34        do j=1,maxx-1
35        do i=1,maxx
36            if(indt(i,j,k)==1) num=num+1
37        enddo
38        enddo
39        enddo     
40        print*,'筛选过后数目A',num
41        print*,'筛选过后数目(A)/总数(B)', 1.0*num/(maxx*(maxx-1)*(maxx-1))
42        time1=0.0
43         
44        Ex=0
45        time1=0.0
46        time2=0.0
47        call cpu_time(time1)
48        do n= 1,10000
49        do k=1,maxx-1
50        do j=1,maxx-1
51        do i=1,maxx
52 
53            Ex(i,j,k)=(Hy(i,j,k)-Hy(i,j,k+1))*0.1254
54     +               +(Hz(i,j,k)-Hz(i,j+1,k))*0.2948
55 
56        enddo
57        enddo
58        enddo
59        enddo
60        call cpu_time(time2)   
61     
62        print*,'总迭代时间(B的耗时)',time2-time1,'s'
63 
64         
65        Ex=0
66        time3=0.0
67        time4=0.0
68        call cpu_time(time3)
69        do n= 1,10000
70        do k=1,maxx-1
71        do j=1,maxx-1
72        do i=1,maxx
73             if(indt(i,j,k).eq.1) cycle
74            Ex(i,j,k)=(Hy(i,j,k)-Hy(i,j,k+1))*0.1254
75     +               +(Hz(i,j,k)-Hz(i,j+1,k))*0.2948
76        enddo
77        enddo
78        enddo
79        enddo
80        call cpu_time(time4)     
81     
82        print*,'A的耗时',time4-time3,'s'
83        print*,'A/B的时间比',(time4-time3)/(time2-time1)    
84 
85      ENDPROGRAM Cs

A与B操作的次数比 与耗时不成比例
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

213

帖子

2

主题

0

精华

宗师

F 币
2142 元
贡献
875 点

规矩勋章

沙发
发表于 2021-3-5 05:26:15 | 只看该作者
本帖最后由 风平老涡 于 2021-3-5 05:35 编辑

1) 没有看到Hy和Hz的赋值。
2)请给出具体的次数比和耗时比。
3)print*,'筛选过后数目(A)/总数(B)', 1.0*num/(maxx*(maxx-1)*(maxx-1)) 给出的是符合条件的次数比, 而

    if(indt(i,j,k).eq.1) cycle 四重循环给出的是不满足条件的时间差。

您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2025-4-30 16:01

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

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