经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python3 » 查看文章
MindSponge分子动力学模拟——自定义控制器(2024.05)
来源:cnblogs  作者:DECHIN  时间:2024/5/15 16:49:25  对本文有异议

技术背景

分子动力学模拟中的控制器(Controller)可以被用于修改模拟过程中的原子坐标和原子速度等参量,从而达到控制系统特定参量的目的。例如控温器可以用于实现NVT系综,控压器可用于实现NPT系综。而在MindSponge分子动力学模拟框架下,控温控压都可以基于控制器Controller来实现。关于更多的MindSponge分子动力学模拟框架的信息,如安装和基本使用等,可以阅读MindSponge专栏里面的文章。

自定义Controller

Controller位于control路径下,除了已经定义好的一些控温控压算法之外,用户还可以直接继承Controller来实现自己需要的系统控制算法。例如最简单的,这里我们定义一个缩放原子速度的控制器:

  1. class MyController(Controller):
  2. def construct(self,
  3. coordinate: Tensor,
  4. velocity: Tensor,
  5. **kwargs):
  6. return super().construct(coordinate, velocity/2, **kwargs)

它的功能是保持原子当前位置不变,但是速度减半,简单表述就是:

\[\textbf{v}_{control}=\frac{\textbf{v}}{2} \]

完整的MindSponge用例如下所示:

  1. from mindspore import context, Tensor
  2. # 选择MindSpore图模式,0号GPU硬件
  3. context.set_context(mode=context.GRAPH_MODE, device_target='GPU', device_id=0)
  4. from sponge import set_global_units, Sponge, Molecule, WithEnergyCell, UpdaterMD, ForceField
  5. from sponge.function import VelocityGenerator
  6. from sponge.callback import RunInfo
  7. from sponge.control import Controller
  8. # 自定义控制器
  9. class MyController(Controller):
  10. def construct(self,
  11. coordinate: Tensor,
  12. velocity: Tensor,
  13. **kwargs):
  14. return super().construct(coordinate, velocity/2, **kwargs)
  15. # 设置全局分子动力学模拟单位
  16. set_global_units('nm', 'kj/mol')
  17. # 根据内置模板生成水分子系统
  18. system = Molecule(template='water.spce.yaml')
  19. # 将分子沿X轴方向复制一份,现在体系有2个水分子
  20. system.reduplicate([0.3, 0, 0])
  21. # 基于前面的分子系统,再复制一份,然后合并到system里面,此时一共是4个水分子
  22. new_sys = system.copy([0, 0, -0.3])
  23. system.append(new_sys)
  24. # 选择SPCE力场
  25. potential = ForceField(system, parameters='SPCE')
  26. # 类似于深度学习中的WithLossCell,绑定了分子系统和力场的信息
  27. withenergy = WithEnergyCell(system, potential)
  28. # 配置MD参数
  29. temp = 300
  30. vgen = VelocityGenerator(temp)
  31. velocity = vgen(system.shape, system.atom_mass)
  32. # 构建迭代器,并且传入我们自定义的控制器
  33. updater = UpdaterMD(
  34. system=system,
  35. time_step=1e-3,
  36. velocity=velocity,
  37. integrator='velocity_verlet',
  38. temperature=300,
  39. controller=MyController(system),
  40. )
  41. # 绑定系统、力场和迭代器三者的内容
  42. mini = Sponge(withenergy, optimizer=updater)
  43. # 使用回调函数,每一步都会打印输出能量、温度等信息
  44. run_info = RunInfo(1)
  45. mini.run(5, callbacks=[run_info])

因为每次控制器被调用都会使得速度减半,而且按照执行的顺序,控制器在常规的控温之后,因此运行过程中体系的温度无法达到我们预期的300K:

  1. [MindSPONGE] Started simulation at 2024-05-15 16:07:54
  2. [MindSPONGE] Step: 1, E_pot: 110.0423, E_kin: 11.559962, E_tot: 121.60226, Temperature: 84.26327
  3. [MindSPONGE] Step: 2, E_pot: 111.15905, E_kin: 11.305634, E_tot: 122.46468, Temperature: 82.40941
  4. [MindSPONGE] Step: 3, E_pot: 121.5491, E_kin: 8.962629, E_tot: 130.51173, Temperature: 65.330696
  5. [MindSPONGE] Step: 4, E_pot: 126.55731, E_kin: 7.8556476, E_tot: 134.41296, Temperature: 57.26165
  6. [MindSPONGE] Step: 5, E_pot: 118.11452, E_kin: 9.807281, E_tot: 127.9218, Temperature: 71.48756
  7. [MindSPONGE] Finished simulation at 2024-05-15 16:07:57
  8. [MindSPONGE] Simulation time: 3.06 seconds.
  9. --------------------------------------------------------------------------------

如果去掉这个降低速度的控制器,那么体系的温度和动能一下子就上去了,并且在稳定之后,温度会逐渐收敛在300K附近:

  1. [MindSPONGE] Started simulation at 2024-05-15 16:09:10
  2. [MindSPONGE] Step: 1, E_pot: 110.0423, E_kin: 64.28456, E_tot: 174.32686, Temperature: 468.5852
  3. [MindSPONGE] Step: 2, E_pot: 116.11336, E_kin: 58.616272, E_tot: 174.72963, Temperature: 427.26773
  4. [MindSPONGE] Step: 3, E_pot: 120.5004, E_kin: 54.469967, E_tot: 174.97037, Temperature: 397.04434
  5. [MindSPONGE] Step: 4, E_pot: 119.11376, E_kin: 55.627754, E_tot: 174.74152, Temperature: 405.48373
  6. [MindSPONGE] Step: 5, E_pot: 114.84599, E_kin: 59.536713, E_tot: 174.3827, Temperature: 433.97702
  7. [MindSPONGE] Finished simulation at 2024-05-15 16:09:12
  8. [MindSPONGE] Simulation time: 2.84 seconds.
  9. --------------------------------------------------------------------------------

总结概要

本文介绍了在MindSponge分子动力学模拟框架先实现自定义Controller控制器的方法,通过调控体系中的原子坐标和原子速度等,来控制系综的参量。MindSponge分子模拟框架基于MindSpore深度学习框架开发而成,对于开发者尤其是深度学习开发者来说,非常的友好。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/controller.html

作者ID:DechinPhy

更多原著文章:https://www.cnblogs.com/dechinphy/

请博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

原文链接:https://www.cnblogs.com/dechinphy/p/18096072/controller

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号