我的毕业设计做了一些工作,实现了几种分子结构+Lennard-Jones势和库仑势下的力计算+分子间键合(如图)
(http://img17.imageshack.us/img17/3133/simulasyon.png)
所有操作均在单个线程中通过 Verlet 算法完成。
问题是:我正在使用“计算表”数组来快速回答 x^(3.5),x^(1.4), (1/x).... 因为使用 java 的 native 方法计算速度非常慢。数组 - 访问时间非常长,因此我尝试了“unsafe()”方法,但仍然很慢(仅提高了 %10 的性能)。
尝试了 IntBuffer 和 DoubleBuffer 还是不行。
程序计算 O(n) 键计算、O(nlog(n)) Lennard-Jones(+ 额外泡利不相容原理)和 O(nlog(n)) 库仑力计算。 超过 1500 个粒子(和 7000 多个键)时速度较差。
我已经检查过速度瓶颈在哪里(Lennard Jones + Coulomb)。 1500 个粒子时,1 个时间步计算需要 4 毫秒。我需要它是1毫秒。
只有当我可以像任何其他语言一样快地使用数组时(安全与否)。
还尝试用乘法、 HashMap 和列表替换除法(与数组具有相同的性能)。
您知道减少每个时间步的计算时间的其他方法吗? 谢谢。 计算机:2.0 GHz 单核 intel、1.2GB RAM、windows-XP SP-3 和 Eclipse Indigo。
最佳答案
不要使用查找表,而是尝试使用切比雪夫多项式。请记住,您只需 ln(k) 步即可对 x^k 求幂。
这可能看起来有很多操作,但事实上,它可以在不影响内存的情况下完成(因此不会影响缓存),可以使其比查找表快得多。
关于java - 我需要 N 体分子模拟性能方面的帮助!(java 小程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11125948/