首页 > 其他分享 >MindSponge分子动力学模拟——自建力场(2024.03)

MindSponge分子动力学模拟——自建力场(2024.03)

时间:2024-03-22 17:57:25浏览次数:28  
标签:1.0 2024.03 0.100 力场 MindSponge ATOM WAT

技术背景

MindSponge教程合集中我们已经介绍了很多使用MindSponge进行分子动力学模拟的方法,这里主要介绍在MindSponge中自定义一个力场。在传统的MD软件中,如果你希望去开发一个自己的力场,或者是添加一些分子动力学模拟方法如增强采样等,会面临不少编程上的困难。而这些困难对于使用Python来编程的MindSponge来说,就天然的降低了门槛。以力场为例子,我们可以在EnergyCell的基础上,去开发一个自定义的ForceField。

自定义力场

首先,关于MindSponge的安装和基础使用,大家可以在前面的博客中去学习,这里不做更多介绍。
由于这里我们只是为了演示如何使用MindSponge来构建自定义力场的方法,因此我们可以用一个最简单方便的操作,把所有的坐标做一个加和:

\[E_{self}=\sum_{i}(x_i+y_i+z_i) \]

这里\(E_{self}\)就是我们用到的自定义力场的势能。在MindSponge里面定义一个力场,首先我们继承基础能量类EnergyCell来构建一个新的势能类:

class MyEnergy(EnergyCell):
        def construct(self, coordinate: Tensor, **kwargs):
            return coordinate.sum()[None, None]

这里需要解释的是,因为我们只是定义一个简单的力场,没有额外的参数,所以没必要修改__init__函数里面的参数内容,只需要修改construct里面的内容就可以了。唯一有要求的是最后输出的能量的维度有一点要求,为了原生支持多batch的操作,我们输出的能量项是二维的,所以这里求和之后又做了一个扩维。完整的演示代码如下所示:

from mindspore import context, Tensor
from mindspore.nn import Adam
context.set_context(mode=context.GRAPH_MODE, device_target='GPU')

if __name__ == "__main__":
    from sponge import Sponge, Molecule, WithEnergyCell
    from sponge.potential import EnergyCell, ForceFieldBase
    from sponge.callback import RunInfo, SaveLastPdb
    # 自定义能量类
    class MyEnergy(EnergyCell):
        def construct(self, coordinate: Tensor, **kwargs):
            return coordinate.sum()[None, None]
    # 生成水分子系统
    system = Molecule(template='water.spce.yaml')
    system.reduplicate([0.3, 0, 0])
    new_sys = system.copy([0, 0, -0.3])
    system.append(new_sys)
    # 根据系统生成自定义力场对象
    potential = MyEnergy(system)
    forcefield = ForceFieldBase(potential)
    withenergy = WithEnergyCell(system, forcefield)
    opt = Adam(system.trainable_params(), 1e-3)
    mini = Sponge(withenergy, optimizer=opt)
    # 配置回调函数
    run_info = RunInfo(5)
    save_pdb = SaveLastPdb(system, save_freq=1, pdb_name='water_last.pdb')
    # 开始执行模拟任务
    mini.run(10, callbacks=[run_info, save_pdb])

这里演示的是4个水分子的体系,其中定义好能量项之后,要用ForceFieldBase力场基础类封装起来,才是一个完整的力场。然后再把力场信息、系统信息和迭代器信息传给Sponge类,就可以来时进行模拟了。根据定义的迭代器的不同,既可以完成能量优化的功能,也可以实现分子动力学模拟的过程,在框架上实现了统一。此外我们还可以分别定义两个回调函数RunInfo和SaveLastPdb,用于在屏幕上输出迭代信息,以及输出最后一步的系统的坐标到一个指定的pdb文件里面。运行结果如下所示:

[MindSPONGE] Started simulation at 2024-03-22 16:54:45
[MindSPONGE] Step: 5, E_pot: 0.31788814
[MindSPONGE] Step: 10, E_pot: 0.13788882
[MindSPONGE] Finished simulation at 2024-03-22 16:54:46
[MindSPONGE] Simulation time: 1.03 seconds.
--------------------------------------------------------------------------------

同时在当前路径下生成了一个pdb文件:

MODEL     1
ATOM      1  O   WAT A   1      -0.100  -0.100  -0.100   1.0   0.0           O
ATOM      2  H1  WAT A   1       0.716   0.477  -0.100   1.0   0.0           H
ATOM      3  H2  WAT A   1      -0.916   0.477  -0.100   1.0   0.0           H
ATOM      4  O   WAT A   2       2.900  -0.100  -0.100   1.0   0.0           O
ATOM      5  H1  WAT A   2       3.716   0.477  -0.100   1.0   0.0           H
ATOM      6  H2  WAT A   2       2.084   0.477  -0.100   1.0   0.0           H
ATOM      7  O   WAT A   3      -0.100  -0.100  -3.100   1.0   0.0           O
ATOM      8  H1  WAT A   3       0.716   0.477  -3.100   1.0   0.0           H
ATOM      9  H2  WAT A   3      -0.916   0.477  -3.100   1.0   0.0           H
ATOM     10  O   WAT A   4       2.900  -0.100  -3.100   1.0   0.0           O
ATOM     11  H1  WAT A   4       3.716   0.477  -3.100   1.0   0.0           H
ATOM     12  H2  WAT A   4       2.084   0.477  -3.100   1.0   0.0           H
TER
ENDMDL
END

有了这个pdb结构文件,我们就可以用VMD来进行可视化了:

如果需要保存完整的轨迹文件,那就需要用到MindSponge所支持的h5md数据结构,相关方法可以参考这篇博客中的范例,其中还包含了使用MDAnalysis第三方软件进行后分析的方法。

总结概要

基于力场的分子动力学模拟,其实可以看做是一个最简单的机器学习模型,具有计算成本低的特点,在药物研发、生物化学和计算物理学等研究领域存在广泛的应用。那么,如何去快速的开发一个新的力场,在传统的MD模拟软件中其实可能是一个不小的门槛,而基于MindSpore框架开发的MindSponge分子动力学模拟软件,则具有这种便捷开发的特性。本文通过一个简单的示例,介绍了如何在MindSponge分子动力学模拟框架内构建一个自定义的分子力场,可以正常的执行分子动力学模拟迭代过程并保存相应的结果和输出。

版权声明

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

作者ID:DechinPhy

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

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

标签:1.0,2024.03,0.100,力场,MindSponge,ATOM,WAT
From: https://www.cnblogs.com/dechinphy/p/18089928/energy-cell

相关文章

  • 2024.03.22
    今天学习安卓的时间选择器时间选择器DatePickerHelperimportandroid.app.DatePickerDialogimportandroid.content.Contextimportandroid.widget.DatePickerimportandroid.widget.EditTextimportjava.text.SimpleDateFormatimportjava.util.Calendarimportjava.util.Loca......
  • 2024.03.22【文字海报】如何使用文字来展现中文排版的高级感
    上图这行字除了使用英文以外,它还使用了衬线体。衬线体能够体现出字体的复古文艺的感觉;相应的,如果换成了非衬线体,就会体现出一种现代简约的感觉,相同的文字不同的字体能够带给人们不一样的视觉感受。通过这些主体文字的语言,你就能感受到强烈的风格。当主体变成中文时,画面中这个......
  • 专题2024.03.21
    2024.03.21专题T1Bombs答案显然具有单调性,多删一定比少删更优,这是明显的一个数\(a_i=x\)不被删掉的充要条件为:\[\sum\limits_{j=1}^{i-1}[a_j<x]\leqk\]其中\(k\)为\(i\)之前的炸弹数量由单调性,考虑每次加一个炸弹后怎么快速的检查一个数合不合法,可以用线段树维......
  • 模拟赛记录2024.03
    2024.03模拟赛记录2024.03.20TheBrickTowerMediumDivOne不考虑相同元素顺序,最优解的形式为,将原序列从小到大排序,从前往后依次放在当前答案的开头或者结尾考虑相同元素的影响,发现在贪心的同时记录当前放在首尾的同样元素的编号然后贪心的把小的编号靠前即可code//Autho......
  • 2024.03.19【文字排版】作为设计师 这三个功能不用还是尽量别用
    第一个功能-黑色加粗的“B”它是Bold的简写,可以通过这一功能将字体给加粗加大一号。可是实际上这个功能并不是把字体变成大一号,而是单纯的给字体加上一个外轮廓,这样不仅破坏了设计师原本的字形轮廓设计,可选粗细单一而且会使得字体变形,看着不美观也不自然所以大部分字库都会......
  • 2024.03.17【补】【品牌设计】佐藤可士和-品牌设计的六大方法
    品牌设计的六大元素包括1.商标2.产品3.空间4.建筑5.城市6.方法1.商标:商标在现代品牌战略中,是必不可缺少的一部分,商标就是品牌的门面,让顾客看见商标就能认识到这是哪一个品牌。2.产品:产品应该通过使用简洁明了的视觉标志,从整体的角度来捕捉产品的定位,使用售卖的产品来开展......
  • 2024.03.16【补】【版面编排】排版的三率一界
    三率一界----三率:版面率、图版率、跳跃率一、版面率:版面率是文字与图片占据画面的比例(1)信息量多,元素面积占比高,版面率高(2)信息量少,元素面积占比低,版面低(3)除去天头地脚,左右边距就是版心,版心留白越多,版面率越低,反之。(4)版面率越高,画面更加富有张力;版面率越低,画面显得端庄、安......
  • 【2024.03.12】定时执行专家 V7.2 发布 - TimingExecutor V7.2 Release
    目录▉软件介绍▉新版本V7.2 下载地址▉ V7.2新功能▼2024-03-12 V7.2 -更新日志▉ V7.x 新UI设计▉软件介绍《定时执行专家》是一款制作精良、功能强大、毫秒精度、专业级的定时任务执行软件。软件具有25种【任务类型】、12种【触发器】触发方式,并且......
  • 百度网盘(百度云)SVIP超级会员共享账号每日更新(2024.03.14)
    一、百度网盘SVIP超级会员共享账号可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答。我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免了U盘的物理载体,直接在网上就实现文件传输。百度网盘SVIP会员可以让自己百度账......
  • 2024.03.13
     第七天所学时间(包括上课)1h代码量(行)50行博客量(篇)1篇学到的知识点实现Android页面的跳转      1.设置好button与activity,记住button的id。 2.接下来设置文件 (1)在onCreate外声明button。(2)在Oncreate中写如下代码。button1=(B......