【LAMMPS学习】八、基础知识(3.9)输出结构化数据

8. 基础知识

此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各种模拟。

8.1.通用基础知识

8.2. 设置入门

8.3. 分析入门

8.3.1. LAMMPS 的输出(thermo, dumps, computes, fixes, variables

8.3.2.使用chunks计算系统属性 

8.3.3.使用分布式网格 

8.3.4.计算温度

8.3.5.计算弹性常数

8.3.6.计算热导率

8.3.7.计算粘度

8.3.8.计算扩散系数

8.3.9.从 LAMMPS 输出结构化数据

LAMMPS可以使用print 和 fix print 命令输出结构化数据。这为您提供了灵活性,因为您可以构建包含系统属性、热数据和变量值的自定义数据格式。该输出可以定向到屏幕和/或文件以进行后处理。

写入当前系统状态、热数据、变量值 

使用print 命令输出当前系统状态,其中可以包括系统属性、热数据和变量值。

YAML

print """---
timestep: $(step)
pe: $(pe)
ke: $(ke)
...""" file current_state.yaml screen no

current_state.yaml

---
timestep: 250
pe: -4.7774327356321810711
ke: 2.4962152903997174569

JSON

print """{
  "timestep": $(step),
  "pe": $(pe),
  "ke": $(ke)
}""" file current_state.json screen no

current_state.json

{
  "timestep": 250,
  "pe": -4.7774327356321810711,
  "ke": 2.4962152903997174569
}

be54ac5ed1714d8f8698851fe769d890.png

YAML 格式 Thermo_style 或 dump_style 输出

从log文件中提取数据

2022 年 3 月 24 日版本中的新增内容。

LAMMPS 支持热样式“yaml”,对于“自定义”样式热力学输出,可以使用thermo_modify line yaml将格式更改为YAML。这将生成一个紧凑的 YAML 格式的输出块 - 每次运行一个“文档” - 具有以下样式:

---
keywords: ['Step', 'Temp', 'E_pair', 'E_mol', 'TotEng', 'Press', ]
data:
  - [100, 0.757453103239935, -5.7585054860159, 0, -4.62236133677021, 0.207261053624721, ]
  - [110, 0.759322359337036, -5.7614668389562, 0, -4.62251889318624, 0.194314975399602, ]
  - [120, 0.759372342462676, -5.76149365656489, 0, -4.62247073844943, 0.191600048851267, ]
  - [130, 0.756833027516501, -5.75777334823494, 0, -4.62255928350835, 0.208792327853067, ]
...

可以使用 python 从日志文件中提取和解析这些数据:

import re, yaml
try:
    from yaml import CSafeLoader as Loader
except ImportError:
    from yaml import SafeLoader as Loader

docs = ""
with open("log.lammps") as f:
    for line in f:
        m = re.search(r"^(keywords:.*$|data:$|---$|\.\.\.$|  - \[.*\]$)", line)
        if m: docs += m.group(0) + '\n'

thermo = list(yaml.load_all(docs, Loader=Loader))

print("Number of runs: ", len(thermo))
print(thermo[1]['keywords'][4], ' = ', thermo[1]['data'][2][4])

加载 YAML 数据后,thermo 是一个列表,其中包含每个“run”的字典,其中标签“keywords”映射到thermo标题字符串列表,标签“data”有一个列表列表,其中外部列表​​代表行输出和内部列表匹配该步骤的标题关键字的列的值。例如,第二个 print() 命令将打印第二次运行的第五个关键字的标头字符串以及该运行的第三个输出行的相应值:

Number of runs:  2
TotEng  =  -4.62140097780047

ac44e3b27f854817867e055c2af9ac5e.png

从dump文件中提取数据

2022 年 5 月 4 日版本中的新增功能。

YAML 格式输出已添加到 LAMMPS 中的多个命令中,例如 dump yaml 和 fix ave/time根据写入的数据类型,数据的组织或使用的特定语法可能会发生变化,但原理非常相似,并且都文件应该可以使用合适的 YAML 解析器读取。下面给出了一个简单的示例:

import yaml
try:
    from yaml import CSafeLoader as YamlLoader
except ImportError:
    from yaml import SafeLoader as YamlLoader

timesteps = []
with open("dump.yaml", "r") as f:
    data = yaml.load_all(f, Loader=YamlLoader)

    for d in data:
        print('Processing timestep %d' % d['timestep'])
        timesteps.append(d)

print('Read %d timesteps from yaml dump' % len(timesteps))
print('Second timestep: ', timesteps[1]['timestep'])
print('Box info: x: ' , timesteps[1]['box'][0], ' y:', timesteps[1]['box'][1], ' z:',timesteps[1]['box'][2])
print('First 5 per-atom columns: ', timesteps[1]['keywords'][0:5])
print('Corresponding 10th atom data: ', timesteps[1]['data'][9][0:5])

添加到“melt”示例的 YAML 转储命令的相应输出是:

Processing timestep 0
Processing timestep 50
Processing timestep 100
Processing timestep 150
Processing timestep 200
Processing timestep 250
Read 6 timesteps from yaml dump
Second timestep:  50
Box info: x:  [0, 16.795961913825074]  y: [0, 16.795961913825074]  z: [0, 16.795961913825074]
First 5 per-atom columns:  ['id', 'type', 'x', 'y', 'z']
Corresponding 10th atom data:  [10, 1, 4.43828, 0.968481, 0.108555]

使用 Python 处理标量数据 

d785f48eace045f0b4e31cc888b02250.png

读取和解析 YAML 格式数据后,可以轻松导入该数据,以便使用pandas 和 matplotlib Python 模块进行进一步处理和可视化。由于 YAML 格式热输出中的数据组织,需要告知它仅处理导入数据的“数据”部分来创建 pandas 数据框,并且需要从“关键字”设置列名称' 入口。以下 Python 脚本代码示例对此进行了演示,并在将 thermo style 更改为“yaml”后,创建了各种键合能贡献与运行“肽”示例输入的时间步的简单图右侧所示的图像。可以通过关键字方便地选择用于 x 和 y 值的属性。请注意,可以使用 thermo_modify colname命令将这些关键字更改为自定义字符串。

import re, yaml
import pandas as pd
import matplotlib.pyplot as plt

try:
    from yaml import CSafeLoader as Loader
except ImportError:
    from yaml import SafeLoader as Loader

docs = ""
with open("log.lammps") as f:
    for line in f:
        m = re.search(r"^(keywords:.*$|data:$|---$|\.\.\.$|  - \[.*\]$)", line)
        if m: docs += m.group(0) + '\n'

thermo = list(yaml.load_all(docs, Loader=Loader))

df = pd.DataFrame(data=thermo[0]['data'], columns=thermo[0]['keywords'])
fig = df.plot(x='Step', y=['E_bond', 'E_angle', 'E_dihed', 'E_impro'], ylabel='Energy in kcal/mol')
plt.savefig('thermo_bondeng.png')

使用 Python 处理矢量数据 

由 fix ave/time 生成的全局矢量数据使用略有不同的数据组织。您仍然拥有列标题和数据的字典键“keywords”和“data”。但数据是按时间步长索引的字典,每个步骤都有多行值,每行都有一个平均属性列表。这需要稍微不同的处理,因为整个数据不能直接导入到单个 pandas DataFrame 类实例中。以下 Python 脚本示例演示了如何读取此类数据。结果将把不同步骤的数据合并到一个大的“多索引”表中。然后可以使用 pandas IndexSlice 类从该组合数据框中选择数据。

import yaml
import pandas as pd

try:
    from yaml import CSafeLoader as Loader
except ImportError:
    from yaml import SafeLoader as Loader

with open("ave.yaml") as f:
    ave = yaml.load(f, Loader=Loader)

keys = ave['keywords']
df = {}
for k in ave['data'].keys():
    df[k] = pd.DataFrame(data=ave['data'][k], columns=keys)

# create multi-index data frame
df = pd.concat(df)

# output only the first 3 value for steps 200 to 300 of the column Pressure
idx = pd.IndexSlice
print(df['Pressure'].loc[idx[200:300, 0:2]])

d3626c823a29484fb8a5d1905184f0c5.png

使用 Perl 处理标量数据

The ease of processing YAML data is not limited to Python. Here is an example for extracting and processing a LAMMPS log file with Perl instead.
处理 YAML 数据的简便性并不限于 Python。下面是使用 Perl 提取和处理 LAMMPS 日志文件的示例。

use YAML::XS;

open(LOG, "log.lammps") or die("could not open log.lammps: $!");
my $file = "";
while(my $line = <LOG>) {
    if ($line =~ /^(keywords:.*$|data:$|---$|\.\.\.$|  - \[.*\]$)/) {
        $file .= $line;
    }
}
close(LOG);

# convert YAML to perl as nested hash and array references
my $thermo = Load $file;

# convert references to real arrays
my @keywords = @{$thermo->{'keywords'}};
my @data = @{$thermo->{'data'}};

# print first two columns
print("$keywords[0] $keywords[1]\n");
foreach (@data) {
    print("${$_}[0]  ${$_}[1]\n");
}

在模拟期间写入连续数据

fix print 命令允许您在模拟运行期间在定义的时间输出任意字符串。

YAML

fix extra all print 50 """
- timestep: $(step)
  pe: $(pe)
  ke: $(ke)""" file output.yaml screen no

output.yaml

# Fix print output for fix extra
- timestep: 0
  pe: -6.77336805325924729
  ke: 4.4988750000000026219

- timestep: 50
  pe: -4.8082494418323200591
  ke: 2.5257981827119797558

- timestep: 100
  pe: -4.7875608875581505686
  ke: 2.5062598821985102582

- timestep: 150
  pe: -4.7471033686005483787
  ke: 2.466095925545450207

- timestep: 200
  pe: -4.7509052858544134068
  ke: 2.4701136792591693592

- timestep: 250
  pe: -4.7774327356321810711
  ke: 2.4962152903997174569

YAML 文件的后处理可以使用 Python 和其他脚本语言轻松完成。对于 Python,yaml 包允许您加载数据文件并获取字典列表。

import yaml

with open("output.yaml") as f:
   data = yaml.load(f, Loader=yaml.FullLoader)

print(data)
[{'timestep': 0, 'pe': -6.773368053259247, 'ke': 4.498875000000003}, {'timestep': 50, 'pe': -4.80824944183232, 'ke': 2.5257981827119798}, {'timestep': 100, 'pe': -4.787560887558151, 'ke': 2.5062598821985103}, {'timestep': 150, 'pe': -4.747103368600548, 'ke': 2.46609592554545}, {'timestep': 200, 'pe': -4.750905285854413, 'ke': 2.4701136792591694}, {'timestep': 250, 'pe': -4.777432735632181, 'ke': 2.4962152903997175}]

行分隔 JSON (LD-JSON) 

JSON 格式本身对于分隔符非常严格。对于连续输出/流数据,使用行分隔的 JSON 格式是有益的。每一行代表一个 JSON 对象。

fix extra all print 50 """{"timestep": $(step), "pe": $(pe), "ke": $(ke)}""" title "" file output.json screen no

output.json

{"timestep": 0, "pe": -6.77336805325924729, "ke": 4.4988750000000026219}
{"timestep": 50, "pe": -4.8082494418323200591, "ke": 2.5257981827119797558}
{"timestep": 100, "pe": -4.7875608875581505686, "ke": 2.5062598821985102582}
{"timestep": 150, "pe": -4.7471033686005483787, "ke": 2.466095925545450207}
{"timestep": 200, "pe": -4.7509052858544134068, "ke": 2.4701136792591693592}
{"timestep": 250, "pe": -4.7774327356321810711, "ke": 2.4962152903997174569}

将此数据加载到 Python 脚本中的一种简单方法是使用 pandas 包。它可以直接将这些文件加载​​到数据框中:

import pandas as pd

data = pd.read_json('output.json', lines=True)
print(data)
   timestep        pe        ke
0         0 -6.773368  4.498875
1        50 -4.808249  2.525798
2       100 -4.787561  2.506260
3       150 -4.747103  2.466096
4       200 -4.750905  2.470114
5       250 -4.777433  2.496215

cbdd5f0002d24802a599a6e2e6a1aabc.png

 

 

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值