Fortran Coder

楼主: kif117
打印 上一主题 下一主题

[求助] 一个计算相关的编程思路/方法讨论

[复制链接]

1967

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1370 元
贡献
581 点

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

6#
发表于 2015-3-24 21:51:23 | 只看该作者
kif117 发表于 2015-3-24 17:40
您要有好办法就请您用代码介绍介绍,这样我和其他看帖子的人都能尝试运行一下比较哪种更好。我是职业研究 ...

没有人是职业玩 fortran 的。你,我,pasuka 都不是。

楼上的说话一贯就是这样,习惯了就好了。倒是不必太在意了~~

不管是不是职业的,代码里必要的优化还是要做的,是吧?多听听他人的意见,总是能是自己开阔思维。

46

帖子

8

主题

0

精华

熟手

F 币
211 元
贡献
131 点
5#
 楼主| 发表于 2015-3-24 17:40:17 | 只看该作者
pasuka 发表于 2015-3-24 08:37
为啥不是数据完全读入后,向量化操作呢?边读取边计算的话,编译器没法很好滴优化
lz一点profile的经验也 ...

您要有好办法就请您用代码介绍介绍,这样我和其他看帖子的人都能尝试运行一下比较哪种更好。我是职业研究数学的,不是职业程序员,学这个就是自己的兴趣。另外麻烦您说话客气点儿。

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

地板
发表于 2015-3-24 08:37:47 | 只看该作者
li913 发表于 2015-3-23 22:21
上面的代码,主题结构没啥可更改的了,适当优化一下。比如
up=(x(i)*a+y(i)*b+z(i)*c)*(x(i)*a+y(i)*b+z(i) ...

为啥不是数据完全读入后,向量化操作呢?边读取边计算的话,编译器没法很好滴优化
lz一点profile的经验也没有?程序热点都找不到的话,等于是无头苍蝇

46

帖子

8

主题

0

精华

熟手

F 币
211 元
贡献
131 点
板凳
 楼主| 发表于 2015-3-23 23:28:28 | 只看该作者
li913 发表于 2015-3-23 22:21
上面的代码,主题结构没啥可更改的了,适当优化一下。比如
up=(x(i)*a+y(i)*b+z(i)*c)*(x(i)*a+y(i)*b+z(i) ...

非常感谢!
我试了一下你的代码,遇到一个小问题:

对应coss(i)=up/down语句。之前的部分我有逐一检查过。
------
另外就是关于下面的统计部分,您有其他好办法可以让这两个程序写在一起吗? 比如说,对应这样的计算(就是您给优化过的那个),能不能直接选择file的间隔? 现在是按顺序一个接一个读,A1之后是A2,A3......能不能跳着读? 就是先一个接一个,然后每隔两个,每隔三个,重复同样的计算,一直到全部文件数的一半。我只会下面那个土办法,就是先提取出来,然后用j=1, num-step这样的。这个办法可以用,但是太慢了。我不知道怎样能把它们写在一起。

恳请您的指导!

801

帖子

2

主题

0

精华

大宗师

F 币
3804 元
贡献
2273 点
沙发
发表于 2015-3-23 22:21:14 | 只看该作者
本帖最后由 li913 于 2015-3-23 22:33 编辑

上面的代码,主题结构没啥可更改的了,适当优化一下。比如
up=(x(i)*a+y(i)*b+z(i)*c)*(x(i)*a+y(i)*b+z(i)*c) 改为:
up=(x(i)*a+y(i)*b+z(i)*c);up=up*up 。

建议改为动态数组
[Fortran] 纯文本查看 复制代码
 program main
    implicit none
    integer i,j
    integer ios
    integer m,n
    character(160) :: filename1,filename2,filename3,filename4,tmp 
    integer id, n10, n20
    integer n1,n2
    real x1,y1,z1
    real x2,y2,z2
    real,allocatable:: x(:),y(:),z(:),s1(:),s2(:),s3(:),coss(:)
    real v1,v2,v3
    real a,b,c,d
    real up,down,avg
    integer GetFileN,ii,jj
    character(len=10)::status

    print*, 'Running...'
    filename1='c6_'
    filename2='c8_'
    do m=1,1   ! number of files to read
		write(tmp,*)m             
		open(10,file=trim(filename1)//trim(adjustl(tmp))//'.dat',status='old' )
		open(20,file=trim(filename2)//trim(adjustl(tmp))//'.dat',status='old' )
		n10=GetFileN(10); n20=GetFileN(20); n10=min(n10,n20)
		! 此处分配动态数组
		allocate(x(n10),y(n10),z(n10),s1(n10),s2(n10),s3(n10))
		a=0; b=0; c=1 ! labframe
		d = a*a+b*b+c*c
		do i=1,n10
			read(10,*) n1,x1,y1,z1   !read c6
			read(20,*) n2,x2,y2,z2   !read c8
			x(i)=x2-x1    !c8-c6 x
			y(i)=y2-y1    !c8-c6 y
			z(i)=z2-z1    !c8-c6 z
			!  up=(x(i)*a+y(i)*b+z(i)*c)*(x(i)*a+y(i)*b+z(i)*c)
			up=(x(i)*a+y(i)*b+z(i)*c); up=up*up !优化
			! down=(x(i)*x(i)+y(i)*y(i)+z(i)*z(i))*(a*a+b*b+c*c)
			down=(x(i)*x(i)+y(i)*y(i)+z(i)*z(i))*d !优化
			coss(i)=up/down   ! cos(i)^2 
			s1(i)=(3*coss(i)-1)/2  !n=0 d00
			!s2(i)=-sqrt(1.5)*sqrt(1-coss(i))*sqrt(coss(i)) ! n=1 d10
			s2(i)=-sqrt(1.5*(1-coss(i))*coss(i)) !优化
			s3(i)=sqrt(0.375)*(1-coss(i)) !n=2 d20
		enddo
    enddo
    print*, 'Done.'
    close(10)
    close(20)
end

评分

参与人数 1贡献 +16 收起 理由
fcode + 16 赞一个!

查看全部评分

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

本版积分规则

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

GMT+8, 2024-5-19 13:54

Powered by Tencent X3.4

© 2013-2024 Tencent

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