Fortran Coder

查看: 13491|回复: 10
打印 上一主题 下一主题

[通用算法] monte carlo 模拟光子传输

[复制链接]

32

帖子

9

主题

0

精华

专家

F 币
391 元
贡献
212 点
跳转到指定楼层
楼主
发表于 2019-6-4 20:19:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
蒙特卡洛方法 模拟算法测试可以运行大致思路时一次一个光子随机传输,重复很多次并统计结果。

当光子数为1千万个光子时,程序运行正常大约耗时10s左右,依次增加光子数 1.1---1.2 ----1.3----1.4----1.5---1.6千万均计算正常耗时性应增加也基本在十几秒左右,但增加到1.7千万或者更大时程序就永远无法运行完毕,不知道是什么问题,fortran对大量循环次数有限制吗,我采用fortran语言编写的程序,望高手指教,随便什么建议都可以,感谢感谢了

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
沙发
发表于 2019-6-4 20:40:30 | 只看该作者
fortran语法没有任何限制。
但可能来自于你使用的操作系统、平台、编译器等。

具体需给出代码以便测试分析。

32

帖子

9

主题

0

精华

专家

F 币
391 元
贡献
212 点
板凳
 楼主| 发表于 2019-6-4 21:20:14 | 只看该作者
本帖最后由 xuanyz 于 2019-6-5 11:53 编辑

附件中文程序代码

Upscat.for

1001 Bytes, 下载次数: 32

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
地板
发表于 2019-6-4 21:54:10 | 只看该作者
没有输入文件,没法测试。

你试试把 pm , pn 定义为整数。

32

帖子

9

主题

0

精华

专家

F 币
391 元
贡献
212 点
5#
 楼主| 发表于 2019-6-4 23:07:45 来自移动端 | 只看该作者
本帖最后由 xuanyz 于 2019-6-5 08:41 编辑

抱歉,是我的疏忽,不需要输入文件,注释或者删掉掉代码中的这几行即可
          DO 2 i=1,72
     read(10,111) SCATT(i)
111     format(F7.5)
2     CONTINUE
     DO 4 I=1,36
      SINTH(I)=SCATT(I)
      CSINTH(I)=SCATT(I+36)
4     CONTINUE

附件Upscat.for已经更新



954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
6#
发表于 2019-6-5 09:03:10 | 只看该作者
pm,pn 改成整数就好了

32

帖子

9

主题

0

精华

专家

F 币
391 元
贡献
212 点
7#
 楼主| 发表于 2019-6-5 09:31:52 | 只看该作者
感谢vvt,
已经按照你的思路将pm,pn改成整数
修改如下  INTEGER ZSTART,ZFINSH,BOTTOM,pm,pn
测试光子数pm=16000000正常
但光子数增加到pm=17000000时 程序依然永远无法运行完毕????
难道是我的系统或编译器的限制
我用的是win7 64位   vs2010 结合Intel® Parallel Studio XE 2011编译fortran的, 还请指教 再次感谢

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
8#
发表于 2019-6-5 09:42:07 | 只看该作者
110 PN=PN+1.0
改成
110 PN=PN+1

32

帖子

9

主题

0

精华

专家

F 币
391 元
贡献
212 点
9#
 楼主| 发表于 2019-6-5 09:53:33 | 只看该作者
再次感谢 vvt ,这次
pm=17000000测试通过了,
还想弱弱的问一下,为何将pm,pn 改成整数就可以呢,原因是什么呢,方便解释一下嘛 谢谢

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
10#
发表于 2019-6-5 09:57:02 | 只看该作者
不定义成整数的话,就是浮点数。
浮点数是有误差的。
在数学上,17000000.0 + 1.0 = 17000001.0
但是浮点数只有7位有效数字,不能表达 17000001.0,就导致结果还是 17000000.0

所以你不管怎么加,都不能满足 IF(PN.GT.PM)
该用整数的时候,一定要用整数类型。因为整数类型是没有误差的(但是有表达的最大范围)
像计个数这种量,应该用整数类型。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-12-25 16:35

Powered by Tencent X3.4

© 2013-2024 Tencent

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