Skill: sirutong/cp2k-input-generator (version 1.0.0)

--- name: cp2k-input-generator description: This skill should be used when generating CP2K input files (.inp) for quantum chemistry calculations. Use when users request CP2K input file creation from structural files (cif, pdb, xyz, etc.) or CP2K output files, with specifications for calculation types (energy calculation, geometry optimization, molecular dynamics, frequency analysis, NEB, etc.), computational methods (DFT, QMMM, MM), and other parameters. license: MIT --- # CP2K 输入文件生成器 ## Skill 概述 本 Skill 用于根据用户的计算要求和结构文件,生成准确可用的 CP2K 输入文件。支持多种计算类型、结构格式和计算方法,并能够根据体系特征自动选择合适的参数。 ## 触发词 当用户提及以下内容时应该使用此 Skill: - "生成 CP2K 输入文件" - "创建 .inp 文件" - "CP2K calculation input" - "准备 CP2K 计算任务" - "写一个 CP2K 输入文件" - "帮我生成 CP2K 的输入" - 包含计算类型关键词: "单点计算", "几何优化", "分子动力学", "MD", "频率分析", "NEB", "能带结构", "DOS" - 提及结构文件格式: cif, pdb, xyz, gaussian - 从 CP2K 输出文件生成新的输入 ## 执行流程 ### 步骤 1: 理解计算需求 向用户确认或从描述中提取以下信息: **必需参数:** 1. **计算类型** (RUN_TYPE): - ENERGY / ENERGY_FORCE: 单点能量计算 - GEO_OPT: 几何优化 - MD: 分子动力学 - FREQUENCY: 频率分析 - VIBRATIONAL_ANALYSIS: 振动分析 - BAND_STRUCTURE: 能带结构 - NEB: 弹性带路径搜索 2. **结构文件**: - 支持格式: .xyz, .cif, .pdb, .gjf, .com - 或提供直接的坐标数据 **重要参数(如果没有提供需要询问):** 3. **计算方法**: - Quickstep (DFT): 密度泛函理论 - QMMM: 量子力学/分子力学混合方法 - Classical/MM: 纯分子力学 - xTB: 半经验方法 4. **周期性条件**: - XYZ: 三维周期性(晶体) - XY: 二维周期性(表面/平板) - X/Y/Z: 一维周期性(纳米线) - NONE: 孤立体系(分子/团簇) 5. **电荷和自旋**: - CHARGE: 净电荷 - MULTIPLICITY: 自旋多重度(如果自旋极化) **可选参数(如果没有提供可以使用默认值):** 6. **交换关联泛函**: PBE, BLYP, PBE0, HSE06 等 7. **基组类型**: DZVP-MOLOPT, TZVP-MOLOPT 等 8. **k点采样**: Monkhorst-Pack 网格 9. **CUTOFF**: 平面波截止能量 10. **SCF 收敛判据** 11. **MD 参数**: 系综,温度,时间步长,步数 12. **几何优化参数**: 优化器,收敛判据,最大迭代次数 ### 步骤 2: 读取和解析结构文件 使用 `read_file` 工具读取结构文件内容,然后: - **CIF 文件**: 提取晶胞参数和原子坐标 - **PDB 文件**: 提取原子类型和坐标,注意元素符号 - **XYZ 文件**: 提取原子类型和坐标 - **Gaussian 文件**: 提取原子类型和坐标 - **CP2K 输出文件**: 从输出中提取最后的结构坐标 ### 步骤 3: 确定计算参数 根据体系特征和计算需求,智能选择参数: **基组选择:** ``` 体系大小判断: - 小体系 (<50 原子): TZVP-MOLOPT-GTH - 中等体系 (50-200 原子): DZVP-MOLOPT-SR-GTH - 大体系 (>200 原子): DZVP-MOLOPT-SR-GTH ``` **CUTOFF 选择:** ``` - 小分子: 300-350 Ry - 中等体系: 400-500 Ry - 大体系: 500-600 Ry ``` **k点选择:** ``` 周期性体系: - 原胞: 4x4x4 或 6x6x6 - 2x2x2 超胞: 2x2x2 - 3x3x3 超胞: Γ 点 (1x1x1) - 4x4x4 超胞: Γ 点 (1x1x1) - 表面模型: 8x8x1 或 6x6x1 ``` **SCF 参数:** ``` - MAX_SCF: 128 (标准), 300 (困难体系) - EPS_SCF: 5.0E-06 (标准), 1.0E-05 (快速), 1.0E-07 (高精度) - DIAGONALIZATION: STANDARD (小体系), DAVIDSON (大体系) - MIXING: BROYDEN_MIXING 或 PULAY_MIXING ``` ### 步骤 4: 生成输入文件内容 根据计算类型生成相应的输入文件结构: #### 通用结构框架: ``` &GLOBAL PROJECT <project_name> PRINT_LEVEL <level> RUN_TYPE <calculation_type> &END GLOBAL &FORCE_EVAL METHOD <Quickstep/QMMM/Classical> &SUBSYS &CELL 晶胞定义 &END CELL &COORD 原子坐标 &END COORD &KIND 每种元素类型的基组和赝势 &END KIND &END SUBSYS &DFT BASIS_SET_FILE_NAME POTENTIAL_FILE_NAME CHARGE MULTIPLICITY [UKS] (如果自旋极化) &KPOINTS k点设置 &END KPOINTS &QS &END QS &POISSON &END POISSON &XC &XC_FUNCTIONAL <PBE/BLYP/PBE0/HSE06> &END XC_FUNCTIONAL &END XC &MGRID CUTOFF REL_CUTOFF NGRIDS &END MGRID &SCF 收敛设置 &END SCF &END DFT &END FORCE_EVAL &MOTION 根据计算类型添加相应设置 &END MOTION ``` #### 不同计算类型的 MOTION 设置: **GEO_OPT (几何优化):** ``` &MOTION &GEO_OPT TYPE MINIMIZATION OPTIMIZER <BFGS/CG/LBFGS> &BFGS TRUST_RADIUS 0.2 &END BFGS MAX_ITER 500 MAX_DR 3E-3 RMS_DR 1.5E-3 MAX_FORCE 4.5E-4 RMS_FORCE 3E-4 &END GEO_OPT &PRINT &TRAJECTORY FORMAT xyz &END TRAJECTORY &END PRINT &END MOTION ``` **MD (分子动力学):** ``` &MOTION &MD ENSEMBLE <NVT/NVE/NPT> STEPS 50000 TIMESTEP 0.2-1.0 # fs TEMPERATURE 300 &THERMOSTAT TYPE <CSVR/NOSE/LANGEVIN> &<THERMOSTAT_TYPE> TIMECON 100 &END <THERMOSTAT_TYPE> &END THERMOSTAT &END MD &PRINT &TRAJECTORY &EACH MD 10 &END EACH FORMAT xyz &END TRAJECTORY &END PRINT &END MOTION ``` **FREQUENCY (频率分析):** ``` &MOTION &FREQUENCY &PRINT &EIGENVECTORS &END EIGENVECTORS &END PRINT &END FREQUENCY &END MOTION ``` **NEB (弹性带):** ``` &MOTION &NEB NIMAGE 7 K_SPRING 0.5 TOL_FORCE 0.02 &END NEB &END MOTION ``` ### 步骤 5: 处理特殊情况 **自旋极化计算:** - 添加 `UKS` 关键字 - 设置正确的 `MULTIPLICITY` 值 - 对于铁磁性系统,设置所有原子的初始磁矩 **金属体系:** - 使用 Fermi-Dirac smearing - 设置 `&SMearing METHOD FERMI_DIRAC WIDTH 0.01` - 使用较密的 k 点采样 **表面/平板模型:** - 周期性设置为 XY - 使用适当的真空层(通常 >15 Å) - k 点设置为 8x8x1 或类似 **QMMM 计算:** - METHOD 设置为 QMMM - 定义 QM 和 MM 区域 - 设置耦合参数 **xTB 方法:** - 在 `&QS` 中设置 `METHOD xTB` - 添加 `&xTB` 部分 - 包含必要的参数文件 ### 步骤 6: 使用辅助脚本(可选) 对于复杂的输入文件生成,可以使用 `scripts/generate_cp2k_input.py` 脚本: ```bash python scripts/generate_cp2k_input.py <calculation_type> <structure_file> \ -o function.inp \ -p <project_name> \ -c <charge> \ -m <multiplicity> \ -f <functional> ``` 支持的命令: - `energy`: 单点能量计算 - `opt`: 几何优化 - `md`: 分子动力学 ### 步骤 7: 输入文件验证 生成输入文件后,检查: 1. **语法正确性**: - 所有 `&SECTION` 都有对应的 `&END SECTION` - 关键字拼写正确 - 参数在合理范围内 2. **参数一致性**: - CHARGE 和 MULTIPLICITY 匹配 - CUTOFF 和基组匹配 - k 点和周期性匹配 3. **文件路径**: - 结构文件路径正确 - 基组文件和赝势文件路径正确 4. **资源预估**: - 估算计算所需的内存和 CPU 核心数 - 提醒用户计算可能需要的时间 ### 步骤 8: 输出文件 将生成的输入文件写入 `function.inp`: ```python # 使用 write_to_file 工具 write_to_file( filePath="/path/to/function.inp", content=inp_content ) ``` ## 参考资源 ### 内部参考文档 在 `references/cp2k_input_reference.md` 中包含: - 完整的 CP2K 输入文件结构说明 - 各个关键字的详细解释 - 不同计算类型的示例 - 参数选择指南 - 常见错误和解决方案 ### 外部参考 当遇到复杂情况或特殊需求时,参考: 1. **CP2K 官方文档**: https://www.cp2k.org/ - Input Reference: 详细的关键字说明 - Howtos: 特定计算类型的教程 2. **用户工作区的示例文件**: - `/file/SP/`: 单点计算示例 - `/file/opt/`: 几何优化示例 - `/file/MD/`: 分子动力学示例 - `/file/NEB/`: NEB 计算示例 - `/file/DOS/`: 态密度示例 - `/file/freq/`: 频率分析示例 - `/file/QMMM/`: QMMM 计算示例 ### 加载参考文档 在生成输入文件时,如果需要详细参考: ```python read_file("references/cp2k_input_reference.md") ``` ## 计算类型快速参考 | 计算类型 | RUN_TYPE | 主要用途 | 关键参数 | |---------|----------|---------|---------| | 单点能量 | ENERGY | 计算体系总能量 | CUTOFF, k-points | | 能量+力 | ENERGY_FORCE | MD前准备 | 同上 | | 几何优化 | GEO_OPT | 优化结构 | OPTIMIZER, 收敛判据 | | 分子动力学 | MD | 模拟时间演化 | ENSEMBLE, TIMESTEP, STEPS | | 频率分析 | FREQUENCY | 计算振动频率 | - | | 能带结构 | BAND_STRUCTURE | 固体能带 | k点路径 | | 态密度 | ENERGY + 特殊k点 | 电子态密度 | 高密度k点 | | NEB | NEB | 反应路径 | NIMAGE, K_SPRING | | QMMM | ENERGY/QMMM | 大体系精确计算 | QM/MM分区 | ## 常见问题处理 **问题 1: SCF 不收敛** 解决方案: - 降低 EPS_SCF 到 1.0E-05 - 增加混合参数 ALPHA - 使用不同的混合方法 (BROYDEN_MIXING → PULAY_MIXING) - 增加网格精度 (提高 CUTOFF) **问题 2: 计算太慢** 解决方案: - 降低基组精度 (TZVP → DZVP) - 减少k点数 - 使用 xTB 方法 - 使用 OT 方法代替 DIAGONALIZATION **问题 3: 内存不足** 解决方案: - 降低 CUTOFF - 使用 DAVIDSON 对角化 - 减少k点数 - 使用 OT 方法 **问题 4: 结果不准确** 解决方案: - 提高 CUTOFF - 使用更高精度的基组 - 增加k点采样 - 使用更精确的泛函 (PBE → PBE0 → HSE06) ## 注意事项 1. **始终使用绝对路径** 当引用文件时 2. **保留原始文件** 不要直接修改用户的结构文件 3. **添加有意义的注释** 在输入文件中解释关键参数的选择 4. **提供多种选择** 当有多种可能方案时 5. **询问重要参数** 当不确定时,不要随意设置 6. **参考已有示例** 查看工作区中相似计算的输入文件 ## 输出文件命名 默认输出文件名为 `function.inp`,但如果用户指定了项目名称,可以使用: - `{project_name}.inp` - `{calculation_type}.inp` - `calc_{date}.inp` 始终确保输出文件在用户指定的位置。

path: README.md
content: # CP2K 输入文件生成器 Skill - 使用指南

## Skill 概述

`cp2k-input-generator` Skill 旨在帮助用户根据计算要求和结构文件,自动生成准确可用的 CP2K 输入文件 (.inp)。

## 主要功能

### 1. 支持多种计算类型
- ✅ 单点能量计算 (ENERGY)
- ✅ 几何优化 (GEO_OPT)
- ✅ 分子动力学 (MD)
- ✅ 频率分析 (FREQUENCY)
- ✅ NEB 路径搜索 (NEB)
- ✅ 能带结构 (BAND_STRUCTURE)
- ✅ 态密度 (DOS)
- ✅ QMMM 计算

### 2. 支持多种结构文件格式
- ✅ XYZ 格式 (.xyz)
- ✅ CIF 格式 (.cif)
- ✅ PDB 格式 (.pdb)
- ✅ Gaussian 格式 (.gjf, .com)
- ✅ 从 CP2K 输出文件提取结构

### 3. 智能参数选择
- 根据体系大小自动选择基组
- 根据周期性自动设置 k 点
- 根据计算类型推荐 CUTOFF
- 自动配置 SCF 收敛参数

### 4. 支持多种计算方法
- Quickstep (DFT)
- QMMM (量子力学/分子力学混合)
- Classical/MM (纯分子力学)
- xTB (半经验方法)

## 文件结构

```
cp2k-input-generator/
├── SKILL.md                      # Skill 主文档,包含完整的执行指南
├── references/
│   └── cp2k_input_reference.md   # CP2K 输入文件完整参考
└── scripts/
    └── generate_cp2k_input.py    # Python 生成脚本
```

## 使用方法

### 方法 1: 通过 AI 助手使用(推荐)

直接向 AI 助手描述你的计算需求,例如:

```
"帮我生成一个 CP2K 输入文件用于几何优化。
结构文件是 structure.xyz,
使用 PBE 泛函,体系是金属铜,
净电荷为 0,自旋多重度为 1。"
```

AI 助手会自动:
1. 读取并解析结构文件
2. 确定合适的计算参数
3. 生成输入文件
4. 输出为 `function.inp`

### 方法 2: 使用 Python 脚本

#### 单点能量计算

```bash
python scripts/generate_cp2k_input.py energy structure.xyz \
  -o function.inp \
  -p energy_calc \
  -c 0 \
  -m 1 \
  -f PBE
```

#### 几何优化

```bash
python scripts/generate_cp2k_input.py opt structure.xyz \
  -o geo_opt.inp \
  -p opt_calc \
  -c 0 \
  -m 1 \
  -f PBE \
  --optimizer BFGS \
  --max-iter 500
```

#### 分子动力学

```bash
python scripts/generate_cp2k_input.py md structure.xyz \
  -o md.inp \
  -p md_calc \
  -c 0 \
  -m 1 \
  -f PBE \
  --ensemble NVT \
  --steps 50000 \
  --timestep 0.5 \
  --temperature 300
```

## 命令行参数说明

### 通用参数
- `calculation_type`: 计算类型 (energy/opt/md/freq)
- `structure_file`: 结构文件路径
- `-o, --output`: 输出文件名 (默认: function.inp)
- `-p, --project`: 项目名称
- `-c, --charge`: 净电荷 (默认: 0)
- `-m, --multiplicity`: 自旋多重度 (默认: 1)
- `-f, --functional`: 交换关联泛函 (默认: PBE)

### MD 专用参数
- `--ensemble`: 系综 (默认: NVT)
- `--steps`: MD 步数 (默认: 50000)
- `--timestep`: 时间步长 fs (默认: 0.5)
- `--temperature`: 温度 K (默认: 300)

### 几何优化专用参数
- `--optimizer`: 优化器 (默认: BFGS)
- `--max-iter`: 最大迭代次数 (默认: 500)

## 使用示例

### 示例 1: 简单单点计算

**用户请求:**
```
"用 CP2K 计算这个分子的能量,
结构在 water.xyz,
使用 PBE 泛函。"
```

**生成的输入文件:**
```
&GLOBAL
  PROJECT water_energy
  PRINT_LEVEL LOW
  RUN_TYPE ENERGY
&END GLOBAL

&FORCE_EVAL
  METHOD Quickstep
  &SUBSYS
    &CELL
      ...
    &END CELL
    &COORD
      O       0.00000000    0.00000000    0.11926200
      H       0.00000000    0.76323900   -0.47704700
      H       0.00000000   -0.76323900   -0.47704700
    &END COORD
    &KIND O
      ELEMENT O
      BASIS_SET TZVP-MOLOPT-GTH
      POTENTIAL GTH-PBE
    &END KIND
    &KIND H
      ELEMENT H
      BASIS_SET TZVP-MOLOPT-GTH
      POTENTIAL GTH-PBE
    &END KIND
  &END SUBSYS
  
  &DFT
    BASIS_SET_FILE_NAME  BASIS_MOLOPT
    POTENTIAL_FILE_NAME  POTENTIAL
    CHARGE    0
    MULTIPLICITY    1
    &QS
      EPS_DEFAULT 1E-10
    &END QS
    &POISSON
      PERIODIC NONE
      PSOLVER MT
    &END POISSON
    &XC
      &XC_FUNCTIONAL PBE
      &END XC_FUNCTIONAL
    &END XC
    &MGRID
      CUTOFF 350
      REL_CUTOFF 50
      NGRIDS 5
    &END MGRID
    &SCF
      MAX_SCF 128
      EPS_SCF 5.0E-06
      &DIAGONALIZATION
        ALGORITHM STANDARD
      &END DIAGONALIZATION
      &MIXING
        METHOD BROYDEN_MIXING
        ALPHA 0.4
        NBROYDEN 8
      &END MIXING
    &END SCF
  &END DFT
&END FORCE_EVAL
```

### 示例 2: 晶体几何优化

**用户请求:**
```
"优化硅晶体的结构,
结构文件是 silicon.cif,
周期性是 XYZ 方向,
使用 3x3x3 的 k 点网格。"
```

### 示例 3: 表面体系的分子动力学

**用户请求:**
```
"做一个铜表面的分子动力学模拟,
结构在 copper_surface.pdb,
温度 300 K, 1 ps 的模拟时间,
使用 NVT 系综,CSVR 热浴。"
```

## 参数选择指南

### CUTOFF 选择

| 体系大小 | 基组类型 | 推荐值 |
|---------|---------|--------|
| 小分子 (<50 原子) | TZVP-MOLOPT | 300-350 Ry |
| 中等体系 (50-200 原子) | DZVP-MOLOPT | 400-500 Ry |
| 大体系 (>200 原子) | DZVP-MOLOPT | 500-600 Ry |

### k 点选择

| 体系类型 | 超胞大小 | 推荐 k 点 |
|---------|---------|----------|
| 体相晶体 | 原胞 | 6x6x6 |
| | 2x2x2 超胞 | 3x3x3 |
| | 3x3x3 超胞 | Γ 点 |
| 表面/平板 | - | 8x8x1 或 6x6x1 |
| 纳米线 | - | 1x1x6 或 1x1x4 |

### SCF 收敛判据

| 计算类型 | EPS_SCF | MAX_SCF |
|---------|---------|---------|
| 初步测试 | 1.0E-05 | 50 |
| 标准计算 | 5.0E-06 | 128 |
| 高精度 | 1.0E-07 | 200 |
| MD 模拟 | 1.0E-05 | 25 |

## 特殊计算处理

### 自旋极化计算

对于有未成对电子的体系,需要设置自旋参数:

```
&DFT
  CHARGE 0
  MULTIPLICITY 3    # 2S+1, S 为总自旋
  UKS               # 启用非受限自旋
  ...
&END DFT
```

### 金属体系

金属体系需要 smearing 和密 k 点采样:

```
&DFT
  &SMearing
    METHOD FERMI_DIRAC
    WIDTH 0.01
  &END SMearing
  ...
  &KPOINTS
    SCHEME MONKHORST-PACK  8  8  8
  &END KPOINTS
&END DFT
```

### xTB 半经验方法

适合大体系的快速计算:

```
&DFT
  &QS
    METHOD xTB
    &xTB
      DO_EWALD T
      CHECK_ATOMIC_CHARGES F
      &PARAMETER
        DISPERSION_PARAMETER_FILE dftd3.dat
        PARAM_FILE_NAME xTB_parameters
      &END PARAMETER
    &END xTB
  &END QS
&END DFT
```

## 常见问题

### Q: 如何从 CP2K 输出文件提取结构?

A: AI 助手会自动从 CP2K 输出文件中提取最后的原子坐标,用于生成新的输入文件。

### Q: SCF 不收敛怎么办?

A: 可以尝试:
1. 降低收敛判据 (EPS_SCF)
2. 增加混合参数 (ALPHA)
3. 使用不同的混合方法
4. 提高 CUTOFF
5. 使用 smearing (金属体系)

### Q: 计算太慢怎么办?

A: 可以尝试:
1. 降低基组精度
2. 减少k点数
3. 使用 xTB 方法
4. 使用 OT 方法
5. 并行计算

### Q: 如何设置 QMMM 计算?

A: 需要指定 QM 区域和 MM 区域,并设置耦合参数。AI 助手会根据你的描述生成相应的 QMMM 输入文件。

## 参考资源

- **CP2K 官方网站**: https://www.cp2k.org/
- **用户工作区示例**: `/file/` 目录下的各种计算示例
- **Skill 参考文档**: `references/cp2k_input_reference.md`

## 技术支持

如果遇到问题:
1. 查阅 `references/cp2k_input_reference.md` 参考文档
2. 查看 `/file/` 目录下的示例文件
3. 访问 CP2K 官方网站获取帮助

## 更新日志

### v1.0.0 (2026-03-12)
- 初始版本发布
- 支持基本计算类型 (energy, opt, md)
- 支持多种结构文件格式
- 智能参数选择
- 完整的参考文档

## 贡献

欢迎提出改进建议和功能请求!


path: scripts/generate_cp2k_input.py
content: #!/usr/bin/env python3
"""
CP2K输入文件生成工具

这个脚本根据计算要求和结构文件生成CP2K输入文件。
支持从多种格式读取结构,并根据计算类型自动设置参数。
"""

import os
import sys
import argparse
from pathlib import Path
from typing import Dict, List, Tuple, Optional


class CP2KInputGenerator:
    """CP2K输入文件生成器"""
    
    def __init__(self):
        self.input_params = {}
        self.structure = None
        
    def parse_structure_file(self, filepath: str) -> Dict:
        """
        解析结构文件
        
        支持的格式: xyz, cif, pdb, gaussian
        """
        file_ext = Path(filepath).suffix.lower()
        
        if file_ext == '.xyz':
            return self._parse_xyz(filepath)
        elif file_ext == '.cif':
            return self._parse_cif(filepath)
        elif file_ext == '.pdb':
            return self._parse_pdb(filepath)
        elif file_ext == '.gjf' or file_ext == '.com':
            return self._parse_gaussian(filepath)
        else:
            raise ValueError(f"不支持的文件格式: {file_ext}")
    
    def _parse_xyz(self, filepath: str) -> Dict:
        """解析XYZ格式"""
        atoms = []
        coords = []
        
        with open(filepath, 'r') as f:
            lines = f.readlines()
        
        num_atoms = int(lines[0].strip())
        comment = lines[1].strip() if len(lines) > 1 else ""
        
        for line in lines[2:2+num_atoms]:
            parts = line.strip().split()
            atoms.append(parts[0])
            coords.append([float(x) for x in parts[1:4]])
        
        return {
            'num_atoms': num_atoms,
            'comment': comment,
            'atoms': atoms,
            'coords': coords,
            'format': 'xyz'
        }
    
    def _parse_cif(self, filepath: str) -> Dict:
        """解析CIF格式"""
        import re
        
        atoms = []
        coords = []
        cell = None
        
        with open(filepath, 'r') as f:
            content = f.read()
        
        # 解析晶胞参数
        cell_pattern = r'_cell_length_[abc]\s+([\d.]+)'
        cell_matches = re.findall(cell_pattern, content)
        if len(cell_matches) == 3:
            cell = [float(x) for x in cell_matches]
        
        # 解析原子坐标
        atom_pattern = r'([A-Z][a-z]?)\s+([\d\.-]+)\s+([\d\.-]+)\s+([\d\.-]+)'
        matches = re.findall(atom_pattern, content)
        
        for match in matches:
            atoms.append(match[0])
            coords.append([float(match[1]), float(match[2]), float(match[3])])
        
        return {
            'num_atoms': len(atoms),
            'atoms': atoms,
            'coords': coords,
            'cell': cell,
            'format': 'cif'
        }
    
    def _parse_pdb(self, filepath: str) -> Dict:
        """解析PDB格式"""
        atoms = []
        coords = []
        
        with open(filepath, 'r') as f:
            for line in f:
                if line.startswith('ATOM') or line.startswith('HETATM'):
                    atom_name = line[12:16].strip()
                    x = float(line[30:38].strip())
                    y = float(line[38:46].strip())
                    z = float(line[46:54].strip())
                    
                    # 提取元素符号
                    elem = atom_name[0]
                    if atom_name[0].isdigit():
                        elem = atom_name[1]
                    
                    atoms.append(elem)
                    coords.append([x, y, z])
        
        return {
            'num_atoms': len(atoms),
            'atoms': atoms,
            'coords': coords,
            'format': 'pdb'
        }
    
    def _parse_gaussian(self, filepath: str) -> Dict:
        """解析Gaussian格式"""
        atoms = []
        coords = []
        
        with open(filepath, 'r') as f:
            lines = f.readlines()
        
        # 跳过前两行
        started = False
        for line in lines[2:]:
            parts = line.strip().split()
            if len(parts) >= 4:
                if parts[0].isdigit() and not started:
                    continue
                started = True
                atoms.append(parts[0])
                coords.append([float(x) for x in parts[1:4]])
        
        return {
            'num_atoms': len(atoms),
            'atoms': atoms,
            'coords': coords,
            'format': 'gaussian'
        }
    
    def _guess_basis_set(self, element: str, system_size: int) -> str:
        """
        根据元素和体系大小推荐基组
        
        Args:
            element: 元素符号
            system_size: 体系大小
        """
        # 大体系使用DZVP,小体系使用TZVP
        if system_size > 200:
            return 'DZVP-MOLOPT-SR-GTH'
        else:
            return 'TZVP-MOLOPT-GTH'
    
    def _guess_potential(self, functional: str) -> str:
        """根据泛函推荐赝势"""
        if 'PBE' in functional.upper():
            return 'GTH-PBE'
        elif 'BLYP' in functional.upper():
            return 'GTH-BLYP'
        else:
            return 'GTH-PBE'
    
    def _determine_cutoff(self, system_size: int, basis_type: str) -> int:
        """确定CUTOFF值"""
        if system_size > 200:
            return 500
        elif system_size > 50:
            return 400
        else:
            return 350
    
    def _determine_kpoints(self, periodicity: str, cell_size: List[float]) -> List[int]:
        """
        根据周期性和晶胞大小确定k点
        
        Args:
            periodicity: 周期性方向 (XYZ/XY/Y/Z/NONE)
            cell_size: 晶胞向量长度 [a, b, c]
        """
        if periodicity == 'NONE':
            return [1, 1, 1]
        
        # 简单策略: 反比于晶胞大小
        kpoints = []
        for i, size in enumerate(cell_size[:3]):
            if periodicity[i] in ['X', 'Y', 'Z']:
                # 如果该方向是周期性的
                k = max(1, int(20.0 / size))
                kpoints.append(k)
            else:
                kpoints.append(1)
        
        return kpoints
    
    def generate_energy_input(
        self,
        structure_file: str,
        project_name: str = "energy",
        charge: int = 0,
        multiplicity: int = 1,
        functional: str = "PBE",
        method: str = "Quickstep",
        spin_polarized: bool = False,
        periodicity: str = "XYZ",
        **kwargs
    ) -> str:
        """
        生成单点能量计算输入文件
        
        Args:
            structure_file: 结构文件路径
            project_name: 项目名称
            charge: 净电荷
            multiplicity: 自旋多重度
            functional: 交换关联泛函
            method: 计算方法
            spin_polarized: 是否自旋极化
            periodicity: 周期性方向
        """
        # 解析结构
        struct = self.parse_structure_file(structure_file)
        
        # 确定参数
        system_size = struct['num_atoms']
        basis_type = self._guess_basis_set(struct['atoms'][0], system_size)
        potential = self._guess_potential(functional)
        cutoff = self._determine_cutoff(system_size, basis_type)
        
        # 确定k点
        kpoints = [1, 1, 1]
        if periodicity != 'NONE' and struct.get('cell'):
            kpoints = self._determine_kpoints(periodicity, struct['cell'])
        
        # 生成输入文件
        inp_lines = []
        inp_lines.append(f"#Generated from {Path(structure_file).name}")
        inp_lines.append("&GLOBAL")
        inp_lines.append(f"  PROJECT {project_name}")
        inp_lines.append("  PRINT_LEVEL LOW")
        inp_lines.append("  RUN_TYPE ENERGY")
        inp_lines.append("&END GLOBAL")
        inp_lines.append("")
        
        inp_lines.append("&FORCE_EVAL")
        inp_lines.append(f"  METHOD {method}")
        inp_lines.append("  &SUBSYS")
        
        # CELL部分
        if struct.get('cell'):
            inp_lines.append("    &CELL")
            inp_lines.append(f"      A     {struct['cell'][0]:.8f}     0.00000000     0.00000000")
            inp_lines.append(f"      B     0.00000000     {struct['cell'][1]:.8f}     0.00000000")
            inp_lines.append(f"      C     0.00000000     0.00000000     {struct['cell'][2]:.8f}")
            inp_lines.append(f"      PERIODIC {periodicity} #Direction of applied PBC")
            inp_lines.append("    &END CELL")
        
        # COORD部分
        inp_lines.append("    &COORD")
        for atom, coord in zip(struct['atoms'], struct['coords']):
            inp_lines.append(f"      {atom:<6}   {coord[0]:12.8f}   {coord[1]:12.8f}   {coord[2]:12.8f}")
        inp_lines.append("    &END COORD")
        
        # KIND部分
        unique_atoms = list(set(struct['atoms']))
        for atom in unique_atoms:
            inp_lines.append(f"    &KIND {atom}")
            inp_lines.append(f"      ELEMENT {atom}")
            inp_lines.append(f"      BASIS_SET {basis_type}")
            inp_lines.append(f"      POTENTIAL {potential}")
            inp_lines.append("    &END KIND")
        
        inp_lines.append("  &END SUBSYS")
        inp_lines.append("")
        
        # DFT部分
        inp_lines.append("  &DFT")
        inp_lines.append("    BASIS_SET_FILE_NAME  BASIS_MOLOPT")
        inp_lines.append("    POTENTIAL_FILE_NAME  POTENTIAL")
        inp_lines.append(f"    CHARGE    {charge} #Net charge")
        inp_lines.append(f"    MULTIPLICITY    {multiplicity} #Spin multiplicity")
        
        if spin_polarized:
            inp_lines.append("    UKS")
        
        # KPOINTS
        if periodicity != 'NONE' and sum(kpoints) > 3:
            inp_lines.append("    &KPOINTS")
            inp_lines.append(f"      SCHEME MONKHORST-PACK  {kpoints[0]}  {kpoints[1]}  {kpoints[2]}")
            inp_lines.append("      SYMMETRY F")
            inp_lines.append("    &END KPOINTS")
        
        inp_lines.append("    &QS")
        inp_lines.append("      EPS_DEFAULT 1E-10")
        inp_lines.append("    &END QS")
        
        # POISSON
        inp_lines.append("    &POISSON")
        if periodicity == 'NONE':
            inp_lines.append("      PERIODIC NONE")
            inp_lines.append("      PSOLVER MT")
        else:
            inp_lines.append(f"      PERIODIC {periodicity}")
            inp_lines.append("      PSOLVER PERIODIC")
        inp_lines.append("    &END POISSON")
        
        # XC
        inp_lines.append("    &XC")
        inp_lines.append(f"      &XC_FUNCTIONAL {functional}")
        inp_lines.append("      &END XC_FUNCTIONAL")
        inp_lines.append("    &END XC")
        
        # MGRID
        inp_lines.append("    &MGRID")
        inp_lines.append(f"      CUTOFF {cutoff}")
        inp_lines.append("      REL_CUTOFF 50")
        if 'TZVP' in basis_type:
            inp_lines.append("      NGRIDS 5")
        inp_lines.append("    &END MGRID")
        
        # SCF
        inp_lines.append("    &SCF")
        inp_lines.append("      MAX_SCF 128")
        inp_lines.append("      EPS_SCF 5.0E-06")
        inp_lines.append("      &DIAGONALIZATION")
        inp_lines.append("        ALGORITHM STANDARD")
        inp_lines.append("      &END DIAGONALIZATION")
        inp_lines.append("      &MIXING")
        inp_lines.append("        METHOD BROYDEN_MIXING")
        inp_lines.append("        ALPHA 0.4")
        inp_lines.append("        NBROYDEN 8")
        inp_lines.append("      &END MIXING")
        inp_lines.append("    &END SCF")
        inp_lines.append("  &END DFT")
        inp_lines.append("&END FORCE_EVAL")
        
        return "\n".join(inp_lines)
    
    def generate_geo_opt_input(
        self,
        structure_file: str,
        project_name: str = "opt",
        charge: int = 0,
        multiplicity: int = 1,
        functional: str = "PBE",
        optimizer: str = "BFGS",
        max_iter: int = 500,
        **kwargs
    ) -> str:
        """
        生成几何优化输入文件
        
        Args:
            structure_file: 结构文件路径
            project_name: 项目名称
            charge: 净电荷
            multiplicity: 自旋多重度
            functional: 交换关联泛函
            optimizer: 优化器 (BFGS/CG/LBFGS)
            max_iter: 最大迭代次数
        """
        # 先生成能量计算的基础部分
        inp = self.generate_energy_input(
            structure_file=structure_file,
            project_name=project_name,
            charge=charge,
            multiplicity=multiplicity,
            functional=functional,
            **kwargs
        )
        
        # 替换RUN_TYPE
        inp = inp.replace("RUN_TYPE ENERGY", "RUN_TYPE GEO_OPT")
        
        # 添加MOTION部分
        motion_section = f"""
&MOTION
  &GEO_OPT
    TYPE MINIMIZATION
    OPTIMIZER {optimizer}
    &{optimizer}
      TRUST_RADIUS 0.2
    &END {optimizer}
    MAX_ITER {max_iter}
    MAX_DR 3E-3
    RMS_DR 1.5E-3
    MAX_FORCE 4.5E-4
    RMS_FORCE 3E-4
  &END GEO_OPT
  &PRINT
    &TRAJECTORY
      FORMAT xyz
    &END TRAJECTORY
  &END PRINT
&END MOTION"""
        
        inp += motion_section
        
        return inp
    
    def generate_md_input(
        self,
        structure_file: str,
        project_name: str = "md",
        charge: int = 0,
        multiplicity: int = 1,
        functional: str = "PBE",
        ensemble: str = "NVT",
        steps: int = 50000,
        timestep: float = 0.5,
        temperature: float = 300.0,
        thermostat: str = "CSVR",
        timecon: float = 100.0,
        **kwargs
    ) -> str:
        """
        生成分子动力学输入文件
        
        Args:
            structure_file: 结构文件路径
            project_name: 项目名称
            charge: 净电荷
            multiplicity: 自旋多重度
            functional: 交换关联泛函
            ensemble: 系综 (NVT/NVE/NPT)
            steps: 步数
            timestep: 时间步长(fs)
            temperature: 温度(K)
            thermostat: 热浴类型
            timecon: 热浴时间常数(fs)
        """
        # 先生成基础部分
        inp = self.generate_energy_input(
            structure_file=structure_file,
            project_name=project_name,
            charge=charge,
            multiplicity=multiplicity,
            functional=functional,
            periodicity="XYZ",  # MD通常需要周期性
            **kwargs
        )
        
        # 替换RUN_TYPE
        inp = inp.replace("RUN_TYPE ENERGY", "RUN_TYPE MD")
        
        # 添加MOTION部分
        motion_section = f"""
&MOTION
  &MD
    ENSEMBLE {ensemble}
    STEPS {steps}
    TIMESTEP {timestep}
    TEMPERATURE {temperature}
    &THERMOSTAT
      TYPE {thermostat}
      &{thermostat}
        TIMECON {timecon}
      &END {thermostat}
    &END THERMOSTAT
  &END MD
  &PRINT
    &TRAJECTORY
      &EACH
        MD     10
      &END EACH
      FORMAT xyz
    &END TRAJECTORY
    &RESTART
      BACKUP_COPIES 0
      &EACH
        MD 10
      &END EACH
    &END RESTART
    &RESTART_HISTORY OFF
    &END RESTART_HISTORY
  &END PRINT
&END MOTION"""
        
        inp += motion_section
        
        return inp


def main():
    """命令行接口"""
    parser = argparse.ArgumentParser(description='CP2K输入文件生成工具')
    
    # 必需参数
    parser.add_argument('calculation_type', type=str,
                       choices=['energy', 'opt', 'md', 'freq'],
                       help='计算类型')
    parser.add_argument('structure_file', type=str,
                       help='结构文件路径')
    
    # 可选参数
    parser.add_argument('-o', '--output', type=str, default='function.inp',
                       help='输出文件名 (默认: function.inp)')
    parser.add_argument('-p', '--project', type=str, default='calculation',
                       help='项目名称')
    parser.add_argument('-c', '--charge', type=int, default=0,
                       help='净电荷 (默认: 0)')
    parser.add_argument('-m', '--multiplicity', type=int, default=1,
                       help='自旋多重度 (默认: 1)')
    parser.add_argument('-f', '--functional', type=str, default='PBE',
                       help='交换关联泛函 (默认: PBE)')
    
    # MD参数
    parser.add_argument('--ensemble', type=str, default='NVT',
                       help='系综 (默认: NVT)')
    parser.add_argument('--steps', type=int, default=50000,
                       help='MD步数 (默认: 50000)')
    parser.add_argument('--timestep', type=float, default=0.5,
                       help='时间步长 fs (默认: 0.5)')
    parser.add_argument('--temperature', type=float, default=300.0,
                       help='温度 K (默认: 300)')
    
    # 几何优化参数
    parser.add_argument('--optimizer', type=str, default='BFGS',
                       help='优化器 (默认: BFGS)')
    parser.add_argument('--max-iter', type=int, default=500,
                       help='最大迭代次数 (默认: 500)')
    
    args = parser.parse_args()
    
    # 检查结构文件
    if not os.path.exists(args.structure_file):
        print(f"错误: 结构文件不存在: {args.structure_file}")
        sys.exit(1)
    
    # 生成输入文件
    generator = CP2KInputGenerator()
    
    if args.calculation_type == 'energy':
        inp_content = generator.generate_energy_input(
            structure_file=args.structure_file,
            project_name=args.project,
            charge=args.charge,
            multiplicity=args.multiplicity,
            functional=args.functional
        )
    elif args.calculation_type == 'opt':
        inp_content = generator.generate_geo_opt_input(
            structure_file=args.structure_file,
            project_name=args.project,
            charge=args.charge,
            multiplicity=args.multiplicity,
            functional=args.functional,
            optimizer=args.optimizer,
            max_iter=args.max_iter
        )
    elif args.calculation_type == 'md':
        inp_content = generator.generate_md_input(
            structure_file=args.structure_file,
            project_name=args.project,
            charge=args.charge,
            multiplicity=args.multiplicity,
            functional=args.functional,
            ensemble=args.ensemble,
            steps=args.steps,
            timestep=args.timestep,
            temperature=args.temperature
        )
    else:
        print(f"错误: 不支持的计算类型: {args.calculation_type}")
        sys.exit(1)
    
    # 写入输出文件
    with open(args.output, 'w') as f:
        f.write(inp_content)
    
    print(f"✅ 成功生成CP2K输入文件: {args.output}")
    print(f"   计算类型: {args.calculation_type}")
    print(f"   结构文件: {args.structure_file}")


if __name__ == '__main__':
    main()


path: references/cp2k_input_reference.md
content: # CP2K 输入文件生成完整参考

## 输入文件结构概览

CP2K 输入文件采用层级结构,由以下主要部分组成:

```
&GLOBAL
  项目设置,打印级别,运行类型
&END GLOBAL

&FORCE_EVAL
  METHOD [Quickstep/QMMM/MM/MIXED]
  &SUBSYS
    结构定义(CELL, COORD, KIND)
  &END SUBSYS
  
  &DFT (或 &MM)
    密度泛函设置或分子力学设置
  &END DFT
  
  &PRINT
    输出控制
  &END PRINT
&END FORCE_EVAL

&MOTION
  几何优化,MD,频率分析等
  &GEO_OPT (几何优化)
  &MD (分子动力学)
  &FREQUENCY (频率分析)
  &NEB (弹性带)
&END MOTION
```

## 运行类型 (RUN_TYPE)

在 `&GLOBAL` 中指定计算类型:

- **ENERGY**: 单点能量计算
- **ENERGY_FORCE**: 计算能量和力
- **GEO_OPT**: 几何优化
- **MD**: 分子动力学
- **FREQUENCY**: 频率分析/振动谱
- **VIBRATIONAL_ANALYSIS**: 振动分析
- **BAND_STRUCTURE**: 能带结构
- **ELECTRONIC_DENSITY**: 电子密度

## FORCE_EVAL 方法选择

### Quickstep (DFT)
适用于量子化学计算,支持GPW和GAPW方法

```
&FORCE_EVAL
  METHOD Quickstep
  &DFT
    BASIS_SET_FILE_NAME BASIS_MOLOPT
    POTENTIAL_FILE_NAME POTENTIAL
    ...
  &END DFT
&END FORCE_EVAL
```

### QMMM
量子力学/分子力学混合方法

```
&FORCE_EVAL
  METHOD QMMM
  &QMMM
    E_COUPL &END
    &MM FORCEFIELD ...
  &END QMMM
&END FORCE_EVAL
```

### MM
纯分子力学计算

```
&FORCE_EVAL
  METHOD Classical
  &MM
    FORCEFIELD Charmm
    ...
  &END MM
&END FORCE_EVAL
```

## SUBSYS - 系统定义

### CELL (晶胞定义)

```
&CELL
  A      a_x  a_y  a_z
  B      b_x  b_y  b_z
  C      c_x  c_y  c_z
  PERIODIC [XYZ/X/Y/Z/NONE]
  SYMMETRY [T/F]
&END CELL
```

**PERIODIC 方向**:
- **XYZ**: 三维周期性(晶体)
- **XY**: 二维周期性(表面/平板)
- **X/Y/Z**: 一维周期性(纳米线)
- **NONE**: 孤立体系(分子/团簇)

### COORD (原子坐标)

```
&COORD
  Element  x  y  z
  Si       0.0 0.0 0.0
  O        1.0 1.0 1.0
&END COORD
```

也可以从文件读取:
```
&TOPOLOGY
  COORD_FILE_NAME structure.xyz
  COORDINATE [XYZ/CIF/PDB/GAUSSIAN]
&END TOPOLOGY
```

### KIND (原子类型定义)

```
&KIND Si
  ELEMENT Si
  BASIS_SET TZVP-MOLOPT-GTH-q4
  POTENTIAL GTH-PBE
  &POTENTIAL
    TYPE GTH-PBE
  &END
&END KIND
```

**常用基组**:
- **DZVP-MOLOPT-SR-GTH**: 双ζ价基组,适合大体系
- **TZVP-MOLOPT-GTH-q4**: 三ζ价基组,更高精度

**赝势类型**:
- **GTH-PBE**: PBE泛函GTH赝势
- **GTH-BLYP**: BLYP泛函GTH赝势

## DFT 设置

### 交换关联泛函

```
&XC
  &XC_FUNCTIONAL PBE
  &END XC_FUNCTIONAL
&END XC
```

**常用泛函**:
- **PBE**: GGA泛函,通用性好
- **BLYP**: GGA泛函
- **PADE**: LDA泛函
- **PBE0**: 杂化泛函
- **HSE06**: 杂化泛函

### MGRID (网格设置)

```
&MGRID
  CUTOFF 350          # 平面波截止能量(Rydberg)
  REL_CUTOFF 50       # 相对截止
  NGRIDS 5           # 多重网格层数
&END MGRID
```

**CUTOFF 建议**:
- 小体系: 300-400 Ry
- 中等体系: 400-500 Ry
- 大体系: 500-600 Ry

### KPOINTS (布里渊区采样)

```
&KPOINTS
  SCHEME MONKHORST-PACK  n_x  n_y  n_z
  SYMMETRY T  # 使用对称性减少k点
&END KPOINTS
```

**k点密度建议**:
- 金属: 较密 (如 6x6x6)
- 半导体: 中等 (如 4x4x4)
- 绝缘体: 较稀疏 (如 3x3x3)
- 大超胞: Γ点 (1x1x1)

### SCF (自洽场)

```
&SCF
  MAX_SCF 128           # 最大SCF步数
  EPS_SCF 5.0E-06       # 收敛判据
  
  &DIAGONALIZATION
    ALGORITHM [STANDARD/DAVIDSON]
  &END DIAGONALIZATION
  
  &MIXING
    METHOD BROYDEN_MIXING
    ALPHA 0.4
    NBROYDEN 8
  &END MIXING
&END SCF
```

**算法选择**:
- **STANDARD**: 标准对角化,精确但慢
- **DAVIDSON**: Davidson算法,适合大体系

**OT方法(轨道变换)**:
```
&SCF
  &OT
    PRECONDITIONER FULL_SINGLE_INVERSE
    MINIMIZER DIIS
    LINESEARCH 2PNT
  &END OT
  &OUTER_SCF
    MAX_SCF 20
    EPS_SCF 1.0E-06
  &END OUTER_SCF
&END SCF
```

## MOTION - 运动设置

### 几何优化 (GEO_OPT)

```
&MOTION
  &GEO_OPT
    TYPE MINIMIZATION
    OPTIMIZER [BFGS/CG/LBFGS]
    &BFGS
      TRUST_RADIUS 0.2  # 最大步长(Å)
    &END BFGS
    MAX_ITER 500
    MAX_DR 3E-3         # 最大位移
    RMS_DR 1.5E-3       # RMS位移
    MAX_FORCE 4.5E-4     # 最大力
    RMS_FORCE 3E-4       # RMS力
  &END GEO_OPT
&END MOTION
```

### 分子动力学 (MD)

```
&MOTION
  &MD
    ENSEMBLE [NVT/NVE/NPT]
    STEPS 50000
    TIMESTEP 0.2        # 时间步长(fs)
    TEMPERATURE 300     # 温度(K)
    
    &THERMOSTAT
      TYPE CSVR
      &CSVR
        TIMECON 100     # 时间常数(fs)
      &END CSVR
    &END THERMOSTAT
  &END MD
&END MOTION
```

**热浴类型**:
- **CSVR**: 随机速度重缩放
- **NOSE**: Nosé-Hoover
- **LANGEVIN**: Langevin动力学

### 频率分析 (FREQUENCY)

```
&MOTION
  &FREQUENCY
    &PRINT
      &EIGENVECTORS
        ADD_LAST NO
      &END EIGENVECTORS
    &END PRINT
  &END FREQUENCY
&END MOTION
```

### NEB (弹性带)

```
&MOTION
  &NEB
    NIMAGE 7            # 影像数量
    K_SPRING 0.5       # 弹簧常数
    TOL_FORCE 0.02     # 力收敛判据
  &END NEB
&END MOTION
```

## 特殊计算设置

### 自旋极化 (UKS)

```
&DFT
  CHARGE 0           # 净电荷
  MULTIPLICITY 2     # 自旋多重度
  UKS               # 非受限自旋
&END DFT
```

### smearing (费米涂抹)

```
&DFT
  &SMearing
    METHOD FERMI_DIRAC
    WIDTH 0.01       # 涂抹宽度(Hartree)
  &END SMearing
&END DFT
```

### 约束DFT (CDFT)

```
&DFT
  &CDFT
    &CHARGE
      ATOM_LIST 1 2 3
      CHARGE +0.5
    &END CHARGE
  &END CDFT
&END DFT
```

## 输出控制

### PRINT 选项

```
&GLOBAL
  PRINT_LEVEL [LOW/MEDIUM/HIGH/DEBUG]
&END GLOBAL

&FORCE_EVAL
  &PRINT
    &RESTART
      BACKUP_COPIES 3
    &END RESTART
  &END PRINT
&END FORCE_EVAL

&MOTION
  &PRINT
    &TRAJECTORY
      FORMAT [XYZ/POS/CP2K]
      &EACH
        MD 10
      &END EACH
    &END TRAJECTORY
  &END PRINT
&END MOTION
```

## xTB 方法

```
&DFT
  &QS
    METHOD xTB
    &xTB
      DO_EWALD T
      CHECK_ATOMIC_CHARGES F
      &PARAMETER
        DISPERSION_PARAMETER_FILE dftd3.dat
        PARAM_FILE_NAME xTB_parameters
      &END PARAMETER
    &END xTB
  &END QS
&END DFT
```

## 文件类型支持

### 输入结构文件格式
- **XYZ**: 简单坐标格式
- **CIF**: 晶体信息文件
- **PDB**: 蛋白质数据库格式
- **GAUSSIAN**: Gaussian输入格式

### 从CP2K输出恢复
```
&DFT
  WFN_RESTART_FILE_NAME project-RESTART.wfn
  SCF_GUESS RESTART
&END DFT
```

## 计算类型对应示例

### 1. 单点能量计算 (SP)
- RUN_TYPE: ENERGY
- 需要: CELL, COORD, KIND, DFT设置

### 2. 几何优化 (OPT)
- RUN_TYPE: GEO_OPT
- 需要: GEO_OPT设置,收敛判据

### 3. 分子动力学 (MD)
- RUN_TYPE: MD
- 需要: MD设置,系综,热浴,时间步长

### 4. 频率分析 (FREQ)
- RUN_TYPE: FREQUENCY
- 前提: 优化后的结构

### 5. NEB路径搜索 (NEB)
- RUN_TYPE: NEB
- 需要: 多个起始/终点结构

### 6. QMMM计算
- METHOD: QMMM
- 需要: QM区域和MM区域定义

### 7. 能带结构 (BAND)
- RUN_TYPE: BAND_STRUCTURE
- 需要: k点路径定义

### 8. 态密度 (DOS)
- 需要: 特殊k点采样,高密度k点

## 参数选择指南

### CUTOFF选择
| 体系大小 | 基组 | CUTOFF (Ry) |
|---------|------|-------------|
| 小分子(<50原子) | TZVP | 300-350 |
| 中等体系(50-200) | DZVP | 400-500 |
| 大体系(>200) | DZVP | 500-600 |

### K点选择
| 体系类型 | 超胞大小 | K点网格 |
|---------|---------|---------|
| 体相晶体 | 原胞 | 6x6x6 |
| 2x2x2超胞 | - | 3x3x3 |
| 3x3x3超胞 | - | 2x2x2 |
| 4x4x4超胞 | - | Γ点(1x1x1) |
| 表面模型 | - | 8x8x1 |

### 收敛判据
| 计算类型 | EPS_SCF | MAX_SCF |
|---------|---------|---------|
| 初步测试 | 1.0E-05 | 50 |
| 标准计算 | 5.0E-06 | 128 |
| 高精度 | 1.0E-07 | 200 |
| MD模拟 | 1.0E-05 | 25 |

## 常见错误和解决方案

1. **SCF不收敛**
   - 降低 EPS_SCF (放宽收敛判据)
   - 增加 MAX_SCF
   - 尝试不同的 MIXING 方法
   - 使用 SCF_GUESS RESTART

2. **能量震荡**
   - 减小 TIMESTEP (MD)
   - 调整热浴参数
   - 检查结构合理性

3. **内存不足**
   - 降低 CUTOFF
   - 使用 OT 方法
   - 减少k点数

4. **计算太慢**
   - 使用 xTB 方法
   - 降低基组精度
   - 减少k点数
   - 并行计算


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)