计算化学公社

 找回密码 Forget password
 注册 Register
Views: 963|回复 Reply: 3
打印 Print 上一主题 Last thread 下一主题 Next thread

[GROMACS] 求助用MDanalysis计算温度分布计算出的结果很小

[复制链接 Copy URL]

3

帖子

0

威望

37

eV
积分
40

Level 2 能力者

跳转到指定楼层 Go to specific reply
楼主
大家好!我想用MDanalysis计算温度分布  基本思想就是切片   然后计算每片的总动能,然后根据公式计算温度分布  下面是我的代码:
import MDAnalysis as mda
import numpy as np

u=mda.Universe("system-NVT.tpr","system-NVT.trr")

# 获取系统边界(x轴最小和最大值)
x_min = u.atoms.positions[:, 0].min()
x_max = u.atoms.positions[:, 0].max()

# 计算每片的宽度
slice_width = (x_max - x_min) / 20

# 准备数据结构存储结果
slices_mass_energy = [{'mass': 0, 'total_kinetic_energy': 0.0,'velocity': np.zeros(3), 'atom_count': 0,'center_x': 0.0, 'water_molecule_count': 0} for _ in range(20)]

# 切换到最后一帧
u.trajectory[-1]
print('Time', u.trajectory.time)
for i in range(20):
        x_start = x_min + i * slice_width
        x_end = x_start + slice_width
        # 计算每个分片的中心点 x 坐标
center_x = (x_start + x_end) / 2

        # 输出当前分片范围及其中心点
print(f"Processing slice {i + 1}: x range = [{x_start:.3f}, {x_end:.3f}], center_x = {center_x:.3f}")
        # 选择x轴在指定范围内的原子
slice_atoms = u.select_atoms(f"prop x >= {x_start} and prop x < {x_end}")
        # 输出选中原子的数量
print(f"Number of atoms in slice {i + 1}: {len(slice_atoms)}")

        # 选择分片中的水分子数量
water_molecules = u.select_atoms(f"resname SOL and prop x >= {x_start} and prop x < {x_end}")
        water_molecule_count = len(water_molecules.residues)  # 获取水分子的数量(按残基计数)
print(f"Water molecule count in slice {i + 1}: {water_molecule_count}")

        if len(slice_atoms) > 0:
        # 获取原子的质量和速度
masses = slice_atoms.masses * 1.66053906660e-27  # 将道尔顿转换为千克
velocities = slice_atoms.velocities * 100   # 将速度从Å/ps转换为m/s
        # 输出原子的质量和速度
print(f"Original masses (amu): {slice_atoms.masses}")
         print(f"Converted masses (kg): {masses}")
         print(f"Velocities (m/s): {velocities}")

        # 计算每个原子的动能
kinetic_energies = 0.5 * masses * np.sum(velocities ** 2, axis=1)
         print(f"Kinetic_energies (J):{kinetic_energies}")



        # # 计算每片的总质量和总动能
total_mass = masses.sum()
         total_kinetic_energy = kinetic_energies.sum()

        # 将结果存储在数据结构中
slices_mass_energy['mass'] = total_mass
         slices_mass_energy['total_kinetic_energy'] = total_kinetic_energy
         slices_mass_energy['atom_count'] = len(slice_atoms)  # 获取每片的原子数目
slices_mass_energy['center_x'] = center_x  # 中心点x坐标
slices_mass_energy['water_molecule_count'] = water_molecule_count  # 获取每片的水分子数
else:
            print(f"No atoms found in slice {i + 1}")

        # 计算每个分片的温度
for i, slice_data in enumerate(slices_mass_energy):
        total_kinetic_energy = slice_data['total_kinetic_energy']  # 使用总动能
atom_count = slice_data['atom_count']  # 获取原子数
center_x = slice_data['center_x']
        water_molecule_count = slice_data['water_molecule_count']  # 获取水分子数
# 动态计算自由度
constrained_degrees_of_freedom = 3 * water_molecule_count  # 每个水分子有3个约束自由度
degrees_of_freedom = 3 * atom_count - constrained_degrees_of_freedom - 3  # 总自由度减去约束自由度和系统质心自由度
# 计算温度,使用总动能
Temperature = (2 * total_kinetic_energy) / (degrees_of_freedom * 1.38e-23) if atom_count > 0 else 0.0

            # 输出每片的总质量(kg)、总动能(J)、原子数目、温度(K)及中心点 x 坐标
print(f"Slice {i + 1}:")
        print(f"  Center X (Å): {center_x:.3f}")
        print(f"  Total Mass (kg): {slice_data['mass']:.3e}")
        print(f"  Total Kinetic Energy (J): {total_kinetic_energy:.3e}")
        print(f"  Atom Count: {atom_count}")
        print(f"  Water Molecule Count: {water_molecule_count}")
        print(f"  Temperature (K): {Temperature:.3f}")我问了几个人别人说代码乍一看没啥问题  但是计算出的结果很小  有没有大佬帮忙看一下!!!感谢!!

75

帖子

0

威望

675

eV
积分
750

Level 4 (黑子)

4#
发表于 Post on 2024-10-13 00:50:11 | 只看该作者 Only view this author
为什么都换算成标准单位。。。用原来的单位直接KJ/mol不是很方便吗,你这一个1e-23下去误差直接炸了,小数除小数和小数减小数都会导致结果出问题

3

帖子

0

威望

37

eV
积分
40

Level 2 能力者

3#
 楼主 Author| 发表于 Post on 2024-9-3 18:54:21 | 只看该作者 Only view this author
sobereva 发表于 2024-9-3 18:44
如置顶的新社员必读贴、论坛首页的公告栏、版头的红色大字非常明确所示,求助帖必须在帖子标题明确体现出此 ...

感谢社长 下次注意  麻烦社长能帮忙找找问题吗  这个问题卡好几天了

6万

帖子

99

威望

6万

eV
积分
125127

管理员

公社社长

2#
发表于 Post on 2024-9-3 18:44:54 | 只看该作者 Only view this author
如置顶的新社员必读贴、论坛首页的公告栏、版头的红色大字非常明确所示,求助帖必须在帖子标题明确体现出此帖内容是求助或提问,并清楚、准确反映出帖子具体内容,避免有任何歧义和含糊性,仔细看http://bbs.keinsci.com/thread-9348-1-1.html。我已把你的不恰当标题 “Gromacs计算温度分布” 改了,以后务必注意

发帖时恰当排版,别人都很难注意到你要问什么
北京科音自然科学研究中心http://www.keinsci.com)致力于计算化学的发展和传播,长期开办极高质量的各种计算化学类培训:初级量子化学培训班中级量子化学培训班高级量子化学培训班量子化学波函数分析与Multiwfn程序培训班分子动力学与GROMACS培训班CP2K第一性原理计算培训班,内容介绍以及往届资料购买请点击相应链接查看。这些培训是计算化学从零快速入门以及进一步全面系统性提升研究水平的高速路!培训各种常见问题见《北京科音办的培训班FAQ》
欢迎加入北京科音微信公众号获取北京科音培训的最新消息,并避免错过网上有价值的计算化学文章!
欢迎加入人气极高、专业性特别强的理论与计算化学综合交流群思想家公社QQ群(群号见此链接),合计达一万多人。北京科音培训班的学员在群中可申请VIP头衔,提问将得到群主Sobereva的最优先解答。
思想家公社的门口Blog:http://sobereva.com(发布大量原创计算化学相关博文)
Multiwfn主页:http://sobereva.com/multiwfn(十分强大、极为流行的量子化学波函数分析程序)
Google Scholar:https://scholar.google.com/citations?user=tiKE0qkAAAAJ
ResearchGate:https://www.researchgate.net/profile/Tian_Lu

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2026-2-19 03:43 , Processed in 0.177043 second(s), 27 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list