跳转至

8.3 解析日志而不制造成功结论

这些输入和起始模型为未执行的教学示例。原创配图为示意图,不是计算结果。使用前请验证版本相关语法、授权数据、数值收敛及科学模型。

8.3.1 模型、单位与来源记录

结构长度使用 Å,电子能使用 hartree,振动波数使用 cm⁻¹。核对各输出字段,区分热修正与标准态项。

共享输入、约定与证据

原创示意图:解析日志而不制造成功结论。不声称已有数值计算结果。
原创示意图:解析日志而不制造成功结论。不声称已有数值计算结果。

8.3.2 未执行输入与明确修改片段

按照下方说明确认每个片段的母计算与替换位置;片段不自动构成独立输入。保留空行与文件来源要求。

8.3.2.1 输入块 1

from pathlib import Path
import hashlib, json, re, sys

def number(s):
    return float(s.replace('D', 'E').replace('d', 'e'))

reports = []
for name in sys.argv[1:]:
    path = Path(name)
    raw = path.read_bytes()
    text = raw.decode('utf-8', errors='replace')
    scf = []
    freq = []
    for line_no, line in enumerate(text.splitlines(), 1):
        m = re.search(r'SCF Done:\s+E\(([^)]+)\)\s*=\s*([-+0-9.DEde]+)', line)
        if m:
            scf.append({'line': line_no, 'method_label': m.group(1),
                        'energy_hartree': number(m.group(2))})
        if 'Frequencies --' in line:
            values = line.split('Frequencies --', 1)[1].split()
            freq.append({'line': line_no,
                         'wavenumbers_cm_minus_1': [number(x) for x in values]})
    flat = [v for row in freq for v in row['wavenumbers_cm_minus_1']]
    reports.append({
        'file': str(path), 'sha256': hashlib.sha256(raw).hexdigest(),
        'normal_termination_count': text.count('Normal termination of Gaussian'),
        'error_termination_count': text.count('Error termination'),
        'optimization_completed_count': text.count('Optimization completed'),
        'scf_records': scf, 'frequency_blocks': freq,
        'printed_negative_frequency_count': sum(v < 0 for v in flat),
        'review_required': True,
        'scope_note': 'SCF values are not post-HF totals; multiple jobs require segmentation.'
    })
print(json.dumps(reports, indent=2, ensure_ascii=False))

8.3.3 实作研究

8.3.3.1 直觉与前提

可重现计算应留下足够证据,让他人重建模型并审查每个数值。自动化能帮助收集证据,也可能从失败作业中提取早期 SCF 能量而制造虚假信心。本例提供只读 Python 提取器,只报告观察,不自动认证科学有效性。它保留全部 SCF 和频率记录,不偷偷替用户选择一个值。前提是已有日志与 Python 3,并逐项核对原文。

8.3.3.2 原创只读提取脚本

参见上方输入块 1。

替换为实际文件名运行;脚本仅读取日志,并通过重定向写 JSON。

8.3.3.3 操作步骤

归档输入、完整日志、最终坐标、允许保留的检查点、调度输出和方法记录。 运行提取器,按行号人工核对至少一个能量与一个频率。 用已知不完整日志测试,确认数值出现不等于自动成功。 对 Link1 或拼接日志,先分段再选最终量,并核对预期任务数。 为每个报告量保存值、单位、作业标识、来源行、结构来源与验证状态。 日志变化后重新解析并比较哈希,防止旧摘要与新原文混用。

8.3.3.4 解读 核查与局限

任意合并日志中的负频总数不等于一个结构的鞍点方向数,因为日志可能含多个几何、同位素分析或重复作业。该脚本故意不提取后 HF 总能量、TD 根、热修正、溶剂项或原子映射,这些都需要理解任务语义。哈希只能检测文件变化,不能证明化学正确。公开归档前要保护商业程序与许可证,记录版本和基组来源而非重分发受限软件,并检查日志中的用户名或路径。

练习。 增加作业分段和预期任务字段,为“优化成功但频率失败”与“两段均成功”分别写测试。

8.3.4 相关计算

8.3.5 来源与进一步阅读