atst-tools 2.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- atst_tools-2.0.0/PKG-INFO +304 -0
- atst_tools-2.0.0/README.md +289 -0
- atst_tools-2.0.0/pyproject.toml +35 -0
- atst_tools-2.0.0/setup.cfg +4 -0
- atst_tools-2.0.0/src/atst_tools/__init__.py +51 -0
- atst_tools-2.0.0/src/atst_tools/calculators/__init__.py +0 -0
- atst_tools-2.0.0/src/atst_tools/calculators/abacuslite_backend.py +81 -0
- atst_tools-2.0.0/src/atst_tools/calculators/base.py +10 -0
- atst_tools-2.0.0/src/atst_tools/calculators/dp.py +112 -0
- atst_tools-2.0.0/src/atst_tools/calculators/factory.py +126 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/__init__.py +1 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/abacuslite/__init__.py +13 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/abacuslite/core.py +655 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/abacuslite/io/__init__.py +0 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/abacuslite/io/generalio.py +830 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/abacuslite/io/latestio.py +677 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/abacuslite/io/legacyio.py +1193 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/abacuslite/utils/__init__.py +0 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/abacuslite/utils/ksampling.py +260 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/examples/bandstructure.py +82 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/examples/cellrelax.py +76 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/examples/constraintmd.py +101 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/examples/dos.py +65 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/examples/md.py +72 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/examples/metadynamics.py +146 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/examples/neb.py +111 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/examples/relax.py +67 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/examples/scf.py +56 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/examples/soc.py +63 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/tests/band.py +61 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/tests/magnetic.py +129 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/tests/md.py +50 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/tests/relax.py +47 -0
- atst_tools-2.0.0/src/atst_tools/external/ASE_interface/tests/scf.py +39 -0
- atst_tools-2.0.0/src/atst_tools/external/__init__.py +1 -0
- atst_tools-2.0.0/src/atst_tools/mep/__init__.py +4 -0
- atst_tools-2.0.0/src/atst_tools/mep/autoneb.py +535 -0
- atst_tools-2.0.0/src/atst_tools/mep/dimer.py +241 -0
- atst_tools-2.0.0/src/atst_tools/mep/neb.py +169 -0
- atst_tools-2.0.0/src/atst_tools/mep/sella.py +105 -0
- atst_tools-2.0.0/src/atst_tools/scripts/__init__.py +0 -0
- atst_tools-2.0.0/src/atst_tools/scripts/cli.py +543 -0
- atst_tools-2.0.0/src/atst_tools/scripts/main.py +629 -0
- atst_tools-2.0.0/src/atst_tools/scripts/neb_make.py +65 -0
- atst_tools-2.0.0/src/atst_tools/scripts/neb_post.py +46 -0
- atst_tools-2.0.0/src/atst_tools/utils/__init__.py +0 -0
- atst_tools-2.0.0/src/atst_tools/utils/abacus_io.py +231 -0
- atst_tools-2.0.0/src/atst_tools/utils/analysis.py +57 -0
- atst_tools-2.0.0/src/atst_tools/utils/config.py +89 -0
- atst_tools-2.0.0/src/atst_tools/utils/config_docs.py +189 -0
- atst_tools-2.0.0/src/atst_tools/utils/config_schema.py +522 -0
- atst_tools-2.0.0/src/atst_tools/utils/idpp.py +422 -0
- atst_tools-2.0.0/src/atst_tools/utils/io.py +61 -0
- atst_tools-2.0.0/src/atst_tools/utils/neb_endpoints.py +125 -0
- atst_tools-2.0.0/src/atst_tools/utils/post.py +134 -0
- atst_tools-2.0.0/src/atst_tools/utils/restart_helpers.py +157 -0
- atst_tools-2.0.0/src/atst_tools/utils/thermochemistry.py +109 -0
- atst_tools-2.0.0/src/atst_tools/workflows/__init__.py +0 -0
- atst_tools-2.0.0/src/atst_tools/workflows/d2s.py +299 -0
- atst_tools-2.0.0/src/atst_tools/workflows/irc.py +163 -0
- atst_tools-2.0.0/src/atst_tools/workflows/relax.py +116 -0
- atst_tools-2.0.0/src/atst_tools/workflows/vibration.py +136 -0
- atst_tools-2.0.0/src/atst_tools.egg-info/PKG-INFO +304 -0
- atst_tools-2.0.0/src/atst_tools.egg-info/SOURCES.txt +66 -0
- atst_tools-2.0.0/src/atst_tools.egg-info/dependency_links.txt +1 -0
- atst_tools-2.0.0/src/atst_tools.egg-info/entry_points.txt +2 -0
- atst_tools-2.0.0/src/atst_tools.egg-info/requires.txt +8 -0
- atst_tools-2.0.0/src/atst_tools.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: atst-tools
|
|
3
|
+
Version: 2.0.0
|
|
4
|
+
Summary: Advanced ASE Transition State Tools for ABACUS and Deep-Potential
|
|
5
|
+
Requires-Python: >=3.9
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
Requires-Dist: ase>=3.28.0
|
|
8
|
+
Requires-Dist: numpy
|
|
9
|
+
Requires-Dist: scipy
|
|
10
|
+
Requires-Dist: matplotlib
|
|
11
|
+
Requires-Dist: pydantic<3,>=2
|
|
12
|
+
Requires-Dist: ruamel.yaml
|
|
13
|
+
Requires-Dist: seekpath
|
|
14
|
+
Requires-Dist: sella
|
|
15
|
+
|
|
16
|
+
# ATST-Tools
|
|
17
|
+
|
|
18
|
+
[](pyproject.toml)
|
|
19
|
+
[](#validation)
|
|
20
|
+
[](pyproject.toml)
|
|
21
|
+
[](#license)
|
|
22
|
+
|
|
23
|
+
ATST-Tools is a pip-installable **ASE transition-state workflow toolkit** for
|
|
24
|
+
ABACUS and DeePMD-kit calculators. It turns the project's legacy script
|
|
25
|
+
collection into one governed command-line interface:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
atst run CONFIG.yaml
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Use it when you want repeatable NEB, AutoNEB, Dimer, Sella, D2S, relaxation,
|
|
32
|
+
vibration, or IRC calculations driven by YAML instead of one-off Python scripts.
|
|
33
|
+
|
|
34
|
+
## At A Glance
|
|
35
|
+
|
|
36
|
+
| Area | Current 2.0.0 status |
|
|
37
|
+
| :--- | :--- |
|
|
38
|
+
| Package | Installable Python package with the `atst` console command. |
|
|
39
|
+
| Main interface | `atst run CONFIG.yaml` for all calculator-backed workflows. |
|
|
40
|
+
| Lightweight tools | `atst config`, `atst abacus`, `atst neb`, `atst traj`, `atst dimer`, `atst relax`, `atst vibration`. |
|
|
41
|
+
| Calculators | ABACUS through `abacuslite`; DeePMD-kit through `deepmd.calculator.DP`. |
|
|
42
|
+
| Configuration | Pydantic-governed YAML schema with generated user documentation. |
|
|
43
|
+
| Validation | Unit tests, example dry-runs, SAI ABACUS evidence, and DP/DPA smoke validation. |
|
|
44
|
+
| Release | `2.0.0`, documented in [release notes](docs/releases/RELEASE_NOTES_2.0.0.md). |
|
|
45
|
+
|
|
46
|
+
## What You Can Run
|
|
47
|
+
|
|
48
|
+
| `calculation.type` | Workflow | Notes |
|
|
49
|
+
| :--- | :--- | :--- |
|
|
50
|
+
| `neb` | NEB / DyNEB | Endpoint single-point governance is enabled by default. |
|
|
51
|
+
| `autoneb` | AutoNEB | Adaptive image insertion plus final-chain post-processing. |
|
|
52
|
+
| `d2s` | Double-ended to single-ended TS search | Rough NEB followed by Dimer or Sella. |
|
|
53
|
+
| `dimer` | ASE Dimer | Single-ended transition-state search. |
|
|
54
|
+
| `sella` | Sella saddle search | Uses the external `sella` package. |
|
|
55
|
+
| `relax` | Structure optimization | ASE optimizer based relaxation. |
|
|
56
|
+
| `vibration` | Vibrations and thermochemistry | Harmonic and ideal-gas helpers. |
|
|
57
|
+
| `irc` | Sella IRC | Sella-backed IRC orchestration with controlled boundary diagnostics. |
|
|
58
|
+
|
|
59
|
+
Local pre/post-processing commands are intentionally lightweight. They do not
|
|
60
|
+
construct calculators or submit expensive calculations:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
atst neb make ...
|
|
64
|
+
atst neb post ...
|
|
65
|
+
atst traj collect ...
|
|
66
|
+
atst traj transform ...
|
|
67
|
+
atst dimer make-from-neb ...
|
|
68
|
+
atst relax post ...
|
|
69
|
+
atst vibration post ...
|
|
70
|
+
atst config validate ...
|
|
71
|
+
atst abacus prepare ...
|
|
72
|
+
atst abacus collect ...
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Installation
|
|
76
|
+
|
|
77
|
+
### Development Install
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
git clone https://github.com/deepmodeling/atst-tools.git
|
|
81
|
+
cd atst-tools
|
|
82
|
+
pip install -e .
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Wheel Install
|
|
86
|
+
|
|
87
|
+
Build a local release artifact:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
python -m build
|
|
91
|
+
pip install dist/atst_tools-2.0.0-py3-none-any.whl
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
ATST-Tools itself installs the Python workflow layer. Real calculations also
|
|
95
|
+
need the selected calculator runtime:
|
|
96
|
+
|
|
97
|
+
- **ABACUS**: an executable ABACUS installation plus pseudopotential/orbital
|
|
98
|
+
files referenced by YAML.
|
|
99
|
+
- **DP / DeePMD-kit**: a working DeePMD-kit Python installation and a model file
|
|
100
|
+
outside git-tracked paths.
|
|
101
|
+
|
|
102
|
+
## Quick Start
|
|
103
|
+
|
|
104
|
+
Run a small relaxation example:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
cd examples/06_relax_H2-Au
|
|
108
|
+
atst run config.yaml
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Validate an input without launching the calculation:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
atst run --dry-run examples/06_relax_H2-Au/config.yaml
|
|
115
|
+
atst config validate examples/06_relax_H2-Au/config.yaml --print-normalized
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Print a schema-governed template:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
atst run --show-template neb --calculator abacus
|
|
122
|
+
atst run --show-template neb --calculator dp
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
List available workflow types:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
atst run --list-types
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Minimal YAML Shape
|
|
132
|
+
|
|
133
|
+
Every production workflow uses the same top-level structure:
|
|
134
|
+
|
|
135
|
+
```yaml
|
|
136
|
+
calculation:
|
|
137
|
+
type: neb
|
|
138
|
+
init_chain: inputs/init_neb_chain.traj
|
|
139
|
+
fmax: 0.05
|
|
140
|
+
max_steps: 100
|
|
141
|
+
climb: true
|
|
142
|
+
|
|
143
|
+
calculator:
|
|
144
|
+
name: abacus
|
|
145
|
+
abacus:
|
|
146
|
+
command: abacus
|
|
147
|
+
mpi: 4
|
|
148
|
+
omp: 1
|
|
149
|
+
directory: run_neb
|
|
150
|
+
kpts: [2, 2, 2]
|
|
151
|
+
parameters:
|
|
152
|
+
calculation: scf
|
|
153
|
+
ecutwfc: 100
|
|
154
|
+
basis_type: lcao
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
The governed schema defines defaults, types, and descriptions for user-facing
|
|
158
|
+
inputs. See [YAML input variables](docs/user/YAML_INPUT_VARIABLES.md) for the
|
|
159
|
+
generated reference and [configuration reference](docs/user/CONFIG_REFERENCE.md)
|
|
160
|
+
for hand-written guidance.
|
|
161
|
+
|
|
162
|
+
## Calculator Backends
|
|
163
|
+
|
|
164
|
+
### ABACUS
|
|
165
|
+
|
|
166
|
+
ABACUS is integrated through `abacuslite`. ATST-Tools first tries an installed
|
|
167
|
+
`abacuslite` package and then falls back to the vendored snapshot under
|
|
168
|
+
`src/atst_tools/external/ASE_interface/abacuslite`.
|
|
169
|
+
|
|
170
|
+
Typical example files use:
|
|
171
|
+
|
|
172
|
+
```yaml
|
|
173
|
+
calculator:
|
|
174
|
+
name: abacus
|
|
175
|
+
abacus:
|
|
176
|
+
command: abacus
|
|
177
|
+
mpi: 4
|
|
178
|
+
omp: 1
|
|
179
|
+
pseudo_dir: ../data
|
|
180
|
+
orbital_dir: ../data
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
ATST-Tools is a layered `abacuslite` wrapper. Calculator-backed workflows such
|
|
184
|
+
as NEB, D2S, Dimer, Sella, Relax, Vibration, and IRC still run through
|
|
185
|
+
`atst run CONFIG.yaml`; local ABACUS helpers support safe input preparation and
|
|
186
|
+
result collection:
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
atst abacus prepare config.yaml --structure inputs/init.stru --output-dir abacus_input
|
|
190
|
+
atst abacus collect run_neb --output abacus_results.json
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
These helper commands do not run ABACUS and do not submit Slurm jobs.
|
|
194
|
+
|
|
195
|
+
### DeePMD-kit / DP
|
|
196
|
+
|
|
197
|
+
DP support uses the official ASE calculator entry point,
|
|
198
|
+
`deepmd.calculator.DP`. DeePMD-kit detects the model backend from the model
|
|
199
|
+
file. Multi-head DPA/DPA3 models are configured through `calculator.dp.head`.
|
|
200
|
+
|
|
201
|
+
```yaml
|
|
202
|
+
calculator:
|
|
203
|
+
name: dp
|
|
204
|
+
dp:
|
|
205
|
+
model: ../../temp_repos/dp_model/DPA-3.1-3M.pt
|
|
206
|
+
head: Omat24
|
|
207
|
+
omp: 4
|
|
208
|
+
share_calculator: true
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
The 2.0.0 DP validation used DPA-3.1-3M with the `Omat24` head. Model files and
|
|
212
|
+
runtime outputs are intentionally not tracked by git.
|
|
213
|
+
|
|
214
|
+
## Examples
|
|
215
|
+
|
|
216
|
+
The [examples directory](examples/README.md) is the fastest way to learn the
|
|
217
|
+
project:
|
|
218
|
+
|
|
219
|
+
| Directory | Workflow focus |
|
|
220
|
+
| :--- | :--- |
|
|
221
|
+
| `examples/01_neb_Li-Si` | Quick NEB smoke case. |
|
|
222
|
+
| `examples/02_neb_H2-Au` | Surface NEB example. |
|
|
223
|
+
| `examples/03_autoneb_Cy-Pt` | AutoNEB workflow. |
|
|
224
|
+
| `examples/04_dimer_CO-Pt` | Dimer transition-state search. |
|
|
225
|
+
| `examples/05_sella_H2-Au` | Sella saddle search. |
|
|
226
|
+
| `examples/06_relax_H2-Au` | Geometry relaxation. |
|
|
227
|
+
| `examples/07_vibration_H2-Au` | Surface vibration analysis. |
|
|
228
|
+
| `examples/08_d2s_Cy-Pt` | Rough NEB plus single-ended TS search. |
|
|
229
|
+
| `examples/09_lightweight_cli` | Local helper command examples. |
|
|
230
|
+
| `examples/10_irc_H2` | IRC YAML examples. |
|
|
231
|
+
| `examples/11_vibration_ideal_gas_H2` | Ideal-gas thermochemistry example. |
|
|
232
|
+
|
|
233
|
+
Each calculation example uses `config.yaml` for ABACUS and, where available,
|
|
234
|
+
`config_dp.yaml` for DP.
|
|
235
|
+
|
|
236
|
+
## Validation
|
|
237
|
+
|
|
238
|
+
The 2.0.0 README badges reflect the current governed project state:
|
|
239
|
+
|
|
240
|
+
- Version badge: `pyproject.toml` -> `[project].version` -> `2.0.0`.
|
|
241
|
+
- Unit test coverage badge: measured with
|
|
242
|
+
`coverage run --source=src/atst_tools -m pytest tests -q`, then reported with
|
|
243
|
+
`coverage report --omit='src/atst_tools/external/*'`.
|
|
244
|
+
- Current first-party unit test coverage: `66%`.
|
|
245
|
+
- Full source-tree coverage including the vendored `abacuslite` snapshot:
|
|
246
|
+
`43%`.
|
|
247
|
+
|
|
248
|
+
The vendored `src/atst_tools/external/ASE_interface` tree is kept for ABACUS
|
|
249
|
+
backend reproducibility and is not treated as first-party ATST-Tools coverage.
|
|
250
|
+
|
|
251
|
+
## For Developers
|
|
252
|
+
|
|
253
|
+
The main extension points are deliberately small:
|
|
254
|
+
|
|
255
|
+
| Task | Start here |
|
|
256
|
+
| :--- | :--- |
|
|
257
|
+
| Add or change YAML inputs | `src/atst_tools/utils/config_schema.py` |
|
|
258
|
+
| Regenerate YAML docs | `python -m atst_tools.utils.config_docs` |
|
|
259
|
+
| Add a calculator backend | `src/atst_tools/calculators/` |
|
|
260
|
+
| Add an `atst run` workflow | `src/atst_tools/scripts/main.py` and `src/atst_tools/workflows/` |
|
|
261
|
+
| Add lightweight CLI commands | `src/atst_tools/scripts/cli.py` plus focused command modules |
|
|
262
|
+
| Add examples | `examples/<case>/config.yaml` and curated `inputs/` |
|
|
263
|
+
|
|
264
|
+
Developer documentation:
|
|
265
|
+
|
|
266
|
+
- [Documentation index](docs/index.md)
|
|
267
|
+
- [YAML input governance](docs/developer/YAML_INPUT_GOVERNANCE.md)
|
|
268
|
+
- [Documentation standards](docs/developer/DOCUMENTATION_STANDARDS.md)
|
|
269
|
+
- [ABACUS wrapper guide](docs/user/ABACUSLITE_WRAPPER_GUIDE.md)
|
|
270
|
+
- [Maintained atst-cli skill](docs/skills/atst-cli/SKILL.md)
|
|
271
|
+
- [Refactor stage review](docs/reports/PROJECT_REFACTOR_REVIEW_2026-05-15.md)
|
|
272
|
+
- [User experience reinforcement report](docs/reports/USER_EXPERIENCE_REINFORCEMENT_2026-05-15.md)
|
|
273
|
+
- [Feature status matrix](docs/reports/FEATURE_STATUS_MATRIX.md)
|
|
274
|
+
- [DP validation report](docs/reports/DP_VALIDATION_2.0.0.md)
|
|
275
|
+
- [IRC integration review](docs/reports/IRC_INTEGRATION_REVIEW.md)
|
|
276
|
+
|
|
277
|
+
## Version Governance
|
|
278
|
+
|
|
279
|
+
The package version has one source of truth:
|
|
280
|
+
|
|
281
|
+
```text
|
|
282
|
+
pyproject.toml -> [project].version
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
Runtime entry points read that governed package version through
|
|
286
|
+
`atst_tools.package_version()`. Source-tree runs read `pyproject.toml`, while
|
|
287
|
+
installed-package runs use distribution metadata generated from the same field.
|
|
288
|
+
The YAML `config_version` is a separate schema-compatibility marker and is also
|
|
289
|
+
`2.0.0` for this release line.
|
|
290
|
+
|
|
291
|
+
## Project Boundary
|
|
292
|
+
|
|
293
|
+
ATST-Tools owns workflow orchestration, YAML validation, calculator construction,
|
|
294
|
+
trajectory naming, restart handling, ABACUS input/output helpers, examples, and
|
|
295
|
+
documentation. Numerical engines remain external:
|
|
296
|
+
|
|
297
|
+
- ABACUS owns first-principles electronic-structure calculations.
|
|
298
|
+
- DeePMD-kit owns DP model loading and inference.
|
|
299
|
+
- ASE owns the core optimizer and transition-state method implementations.
|
|
300
|
+
- Sella owns its saddle-search and IRC algorithms.
|
|
301
|
+
|
|
302
|
+
## License
|
|
303
|
+
|
|
304
|
+
LGPL-v3 License.
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
# ATST-Tools
|
|
2
|
+
|
|
3
|
+
[](pyproject.toml)
|
|
4
|
+
[](#validation)
|
|
5
|
+
[](pyproject.toml)
|
|
6
|
+
[](#license)
|
|
7
|
+
|
|
8
|
+
ATST-Tools is a pip-installable **ASE transition-state workflow toolkit** for
|
|
9
|
+
ABACUS and DeePMD-kit calculators. It turns the project's legacy script
|
|
10
|
+
collection into one governed command-line interface:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
atst run CONFIG.yaml
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Use it when you want repeatable NEB, AutoNEB, Dimer, Sella, D2S, relaxation,
|
|
17
|
+
vibration, or IRC calculations driven by YAML instead of one-off Python scripts.
|
|
18
|
+
|
|
19
|
+
## At A Glance
|
|
20
|
+
|
|
21
|
+
| Area | Current 2.0.0 status |
|
|
22
|
+
| :--- | :--- |
|
|
23
|
+
| Package | Installable Python package with the `atst` console command. |
|
|
24
|
+
| Main interface | `atst run CONFIG.yaml` for all calculator-backed workflows. |
|
|
25
|
+
| Lightweight tools | `atst config`, `atst abacus`, `atst neb`, `atst traj`, `atst dimer`, `atst relax`, `atst vibration`. |
|
|
26
|
+
| Calculators | ABACUS through `abacuslite`; DeePMD-kit through `deepmd.calculator.DP`. |
|
|
27
|
+
| Configuration | Pydantic-governed YAML schema with generated user documentation. |
|
|
28
|
+
| Validation | Unit tests, example dry-runs, SAI ABACUS evidence, and DP/DPA smoke validation. |
|
|
29
|
+
| Release | `2.0.0`, documented in [release notes](docs/releases/RELEASE_NOTES_2.0.0.md). |
|
|
30
|
+
|
|
31
|
+
## What You Can Run
|
|
32
|
+
|
|
33
|
+
| `calculation.type` | Workflow | Notes |
|
|
34
|
+
| :--- | :--- | :--- |
|
|
35
|
+
| `neb` | NEB / DyNEB | Endpoint single-point governance is enabled by default. |
|
|
36
|
+
| `autoneb` | AutoNEB | Adaptive image insertion plus final-chain post-processing. |
|
|
37
|
+
| `d2s` | Double-ended to single-ended TS search | Rough NEB followed by Dimer or Sella. |
|
|
38
|
+
| `dimer` | ASE Dimer | Single-ended transition-state search. |
|
|
39
|
+
| `sella` | Sella saddle search | Uses the external `sella` package. |
|
|
40
|
+
| `relax` | Structure optimization | ASE optimizer based relaxation. |
|
|
41
|
+
| `vibration` | Vibrations and thermochemistry | Harmonic and ideal-gas helpers. |
|
|
42
|
+
| `irc` | Sella IRC | Sella-backed IRC orchestration with controlled boundary diagnostics. |
|
|
43
|
+
|
|
44
|
+
Local pre/post-processing commands are intentionally lightweight. They do not
|
|
45
|
+
construct calculators or submit expensive calculations:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
atst neb make ...
|
|
49
|
+
atst neb post ...
|
|
50
|
+
atst traj collect ...
|
|
51
|
+
atst traj transform ...
|
|
52
|
+
atst dimer make-from-neb ...
|
|
53
|
+
atst relax post ...
|
|
54
|
+
atst vibration post ...
|
|
55
|
+
atst config validate ...
|
|
56
|
+
atst abacus prepare ...
|
|
57
|
+
atst abacus collect ...
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Installation
|
|
61
|
+
|
|
62
|
+
### Development Install
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
git clone https://github.com/deepmodeling/atst-tools.git
|
|
66
|
+
cd atst-tools
|
|
67
|
+
pip install -e .
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Wheel Install
|
|
71
|
+
|
|
72
|
+
Build a local release artifact:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
python -m build
|
|
76
|
+
pip install dist/atst_tools-2.0.0-py3-none-any.whl
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
ATST-Tools itself installs the Python workflow layer. Real calculations also
|
|
80
|
+
need the selected calculator runtime:
|
|
81
|
+
|
|
82
|
+
- **ABACUS**: an executable ABACUS installation plus pseudopotential/orbital
|
|
83
|
+
files referenced by YAML.
|
|
84
|
+
- **DP / DeePMD-kit**: a working DeePMD-kit Python installation and a model file
|
|
85
|
+
outside git-tracked paths.
|
|
86
|
+
|
|
87
|
+
## Quick Start
|
|
88
|
+
|
|
89
|
+
Run a small relaxation example:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
cd examples/06_relax_H2-Au
|
|
93
|
+
atst run config.yaml
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Validate an input without launching the calculation:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
atst run --dry-run examples/06_relax_H2-Au/config.yaml
|
|
100
|
+
atst config validate examples/06_relax_H2-Au/config.yaml --print-normalized
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Print a schema-governed template:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
atst run --show-template neb --calculator abacus
|
|
107
|
+
atst run --show-template neb --calculator dp
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
List available workflow types:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
atst run --list-types
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Minimal YAML Shape
|
|
117
|
+
|
|
118
|
+
Every production workflow uses the same top-level structure:
|
|
119
|
+
|
|
120
|
+
```yaml
|
|
121
|
+
calculation:
|
|
122
|
+
type: neb
|
|
123
|
+
init_chain: inputs/init_neb_chain.traj
|
|
124
|
+
fmax: 0.05
|
|
125
|
+
max_steps: 100
|
|
126
|
+
climb: true
|
|
127
|
+
|
|
128
|
+
calculator:
|
|
129
|
+
name: abacus
|
|
130
|
+
abacus:
|
|
131
|
+
command: abacus
|
|
132
|
+
mpi: 4
|
|
133
|
+
omp: 1
|
|
134
|
+
directory: run_neb
|
|
135
|
+
kpts: [2, 2, 2]
|
|
136
|
+
parameters:
|
|
137
|
+
calculation: scf
|
|
138
|
+
ecutwfc: 100
|
|
139
|
+
basis_type: lcao
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
The governed schema defines defaults, types, and descriptions for user-facing
|
|
143
|
+
inputs. See [YAML input variables](docs/user/YAML_INPUT_VARIABLES.md) for the
|
|
144
|
+
generated reference and [configuration reference](docs/user/CONFIG_REFERENCE.md)
|
|
145
|
+
for hand-written guidance.
|
|
146
|
+
|
|
147
|
+
## Calculator Backends
|
|
148
|
+
|
|
149
|
+
### ABACUS
|
|
150
|
+
|
|
151
|
+
ABACUS is integrated through `abacuslite`. ATST-Tools first tries an installed
|
|
152
|
+
`abacuslite` package and then falls back to the vendored snapshot under
|
|
153
|
+
`src/atst_tools/external/ASE_interface/abacuslite`.
|
|
154
|
+
|
|
155
|
+
Typical example files use:
|
|
156
|
+
|
|
157
|
+
```yaml
|
|
158
|
+
calculator:
|
|
159
|
+
name: abacus
|
|
160
|
+
abacus:
|
|
161
|
+
command: abacus
|
|
162
|
+
mpi: 4
|
|
163
|
+
omp: 1
|
|
164
|
+
pseudo_dir: ../data
|
|
165
|
+
orbital_dir: ../data
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
ATST-Tools is a layered `abacuslite` wrapper. Calculator-backed workflows such
|
|
169
|
+
as NEB, D2S, Dimer, Sella, Relax, Vibration, and IRC still run through
|
|
170
|
+
`atst run CONFIG.yaml`; local ABACUS helpers support safe input preparation and
|
|
171
|
+
result collection:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
atst abacus prepare config.yaml --structure inputs/init.stru --output-dir abacus_input
|
|
175
|
+
atst abacus collect run_neb --output abacus_results.json
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
These helper commands do not run ABACUS and do not submit Slurm jobs.
|
|
179
|
+
|
|
180
|
+
### DeePMD-kit / DP
|
|
181
|
+
|
|
182
|
+
DP support uses the official ASE calculator entry point,
|
|
183
|
+
`deepmd.calculator.DP`. DeePMD-kit detects the model backend from the model
|
|
184
|
+
file. Multi-head DPA/DPA3 models are configured through `calculator.dp.head`.
|
|
185
|
+
|
|
186
|
+
```yaml
|
|
187
|
+
calculator:
|
|
188
|
+
name: dp
|
|
189
|
+
dp:
|
|
190
|
+
model: ../../temp_repos/dp_model/DPA-3.1-3M.pt
|
|
191
|
+
head: Omat24
|
|
192
|
+
omp: 4
|
|
193
|
+
share_calculator: true
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
The 2.0.0 DP validation used DPA-3.1-3M with the `Omat24` head. Model files and
|
|
197
|
+
runtime outputs are intentionally not tracked by git.
|
|
198
|
+
|
|
199
|
+
## Examples
|
|
200
|
+
|
|
201
|
+
The [examples directory](examples/README.md) is the fastest way to learn the
|
|
202
|
+
project:
|
|
203
|
+
|
|
204
|
+
| Directory | Workflow focus |
|
|
205
|
+
| :--- | :--- |
|
|
206
|
+
| `examples/01_neb_Li-Si` | Quick NEB smoke case. |
|
|
207
|
+
| `examples/02_neb_H2-Au` | Surface NEB example. |
|
|
208
|
+
| `examples/03_autoneb_Cy-Pt` | AutoNEB workflow. |
|
|
209
|
+
| `examples/04_dimer_CO-Pt` | Dimer transition-state search. |
|
|
210
|
+
| `examples/05_sella_H2-Au` | Sella saddle search. |
|
|
211
|
+
| `examples/06_relax_H2-Au` | Geometry relaxation. |
|
|
212
|
+
| `examples/07_vibration_H2-Au` | Surface vibration analysis. |
|
|
213
|
+
| `examples/08_d2s_Cy-Pt` | Rough NEB plus single-ended TS search. |
|
|
214
|
+
| `examples/09_lightweight_cli` | Local helper command examples. |
|
|
215
|
+
| `examples/10_irc_H2` | IRC YAML examples. |
|
|
216
|
+
| `examples/11_vibration_ideal_gas_H2` | Ideal-gas thermochemistry example. |
|
|
217
|
+
|
|
218
|
+
Each calculation example uses `config.yaml` for ABACUS and, where available,
|
|
219
|
+
`config_dp.yaml` for DP.
|
|
220
|
+
|
|
221
|
+
## Validation
|
|
222
|
+
|
|
223
|
+
The 2.0.0 README badges reflect the current governed project state:
|
|
224
|
+
|
|
225
|
+
- Version badge: `pyproject.toml` -> `[project].version` -> `2.0.0`.
|
|
226
|
+
- Unit test coverage badge: measured with
|
|
227
|
+
`coverage run --source=src/atst_tools -m pytest tests -q`, then reported with
|
|
228
|
+
`coverage report --omit='src/atst_tools/external/*'`.
|
|
229
|
+
- Current first-party unit test coverage: `66%`.
|
|
230
|
+
- Full source-tree coverage including the vendored `abacuslite` snapshot:
|
|
231
|
+
`43%`.
|
|
232
|
+
|
|
233
|
+
The vendored `src/atst_tools/external/ASE_interface` tree is kept for ABACUS
|
|
234
|
+
backend reproducibility and is not treated as first-party ATST-Tools coverage.
|
|
235
|
+
|
|
236
|
+
## For Developers
|
|
237
|
+
|
|
238
|
+
The main extension points are deliberately small:
|
|
239
|
+
|
|
240
|
+
| Task | Start here |
|
|
241
|
+
| :--- | :--- |
|
|
242
|
+
| Add or change YAML inputs | `src/atst_tools/utils/config_schema.py` |
|
|
243
|
+
| Regenerate YAML docs | `python -m atst_tools.utils.config_docs` |
|
|
244
|
+
| Add a calculator backend | `src/atst_tools/calculators/` |
|
|
245
|
+
| Add an `atst run` workflow | `src/atst_tools/scripts/main.py` and `src/atst_tools/workflows/` |
|
|
246
|
+
| Add lightweight CLI commands | `src/atst_tools/scripts/cli.py` plus focused command modules |
|
|
247
|
+
| Add examples | `examples/<case>/config.yaml` and curated `inputs/` |
|
|
248
|
+
|
|
249
|
+
Developer documentation:
|
|
250
|
+
|
|
251
|
+
- [Documentation index](docs/index.md)
|
|
252
|
+
- [YAML input governance](docs/developer/YAML_INPUT_GOVERNANCE.md)
|
|
253
|
+
- [Documentation standards](docs/developer/DOCUMENTATION_STANDARDS.md)
|
|
254
|
+
- [ABACUS wrapper guide](docs/user/ABACUSLITE_WRAPPER_GUIDE.md)
|
|
255
|
+
- [Maintained atst-cli skill](docs/skills/atst-cli/SKILL.md)
|
|
256
|
+
- [Refactor stage review](docs/reports/PROJECT_REFACTOR_REVIEW_2026-05-15.md)
|
|
257
|
+
- [User experience reinforcement report](docs/reports/USER_EXPERIENCE_REINFORCEMENT_2026-05-15.md)
|
|
258
|
+
- [Feature status matrix](docs/reports/FEATURE_STATUS_MATRIX.md)
|
|
259
|
+
- [DP validation report](docs/reports/DP_VALIDATION_2.0.0.md)
|
|
260
|
+
- [IRC integration review](docs/reports/IRC_INTEGRATION_REVIEW.md)
|
|
261
|
+
|
|
262
|
+
## Version Governance
|
|
263
|
+
|
|
264
|
+
The package version has one source of truth:
|
|
265
|
+
|
|
266
|
+
```text
|
|
267
|
+
pyproject.toml -> [project].version
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
Runtime entry points read that governed package version through
|
|
271
|
+
`atst_tools.package_version()`. Source-tree runs read `pyproject.toml`, while
|
|
272
|
+
installed-package runs use distribution metadata generated from the same field.
|
|
273
|
+
The YAML `config_version` is a separate schema-compatibility marker and is also
|
|
274
|
+
`2.0.0` for this release line.
|
|
275
|
+
|
|
276
|
+
## Project Boundary
|
|
277
|
+
|
|
278
|
+
ATST-Tools owns workflow orchestration, YAML validation, calculator construction,
|
|
279
|
+
trajectory naming, restart handling, ABACUS input/output helpers, examples, and
|
|
280
|
+
documentation. Numerical engines remain external:
|
|
281
|
+
|
|
282
|
+
- ABACUS owns first-principles electronic-structure calculations.
|
|
283
|
+
- DeePMD-kit owns DP model loading and inference.
|
|
284
|
+
- ASE owns the core optimizer and transition-state method implementations.
|
|
285
|
+
- Sella owns its saddle-search and IRC algorithms.
|
|
286
|
+
|
|
287
|
+
## License
|
|
288
|
+
|
|
289
|
+
LGPL-v3 License.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "atst-tools"
|
|
7
|
+
version = "2.0.0"
|
|
8
|
+
description = "Advanced ASE Transition State Tools for ABACUS and Deep-Potential"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.9"
|
|
11
|
+
dependencies = [
|
|
12
|
+
"ase>=3.28.0",
|
|
13
|
+
"numpy",
|
|
14
|
+
"scipy",
|
|
15
|
+
"matplotlib",
|
|
16
|
+
"pydantic>=2,<3",
|
|
17
|
+
"ruamel.yaml",
|
|
18
|
+
"seekpath",
|
|
19
|
+
"sella",
|
|
20
|
+
]
|
|
21
|
+
|
|
22
|
+
[project.scripts]
|
|
23
|
+
atst = "atst_tools.scripts.cli:main"
|
|
24
|
+
|
|
25
|
+
[tool.pytest.ini_options]
|
|
26
|
+
minversion = "6.0"
|
|
27
|
+
addopts = "-ra -q"
|
|
28
|
+
testpaths = [
|
|
29
|
+
"tests",
|
|
30
|
+
]
|
|
31
|
+
markers = [
|
|
32
|
+
"unit: fast local unit tests that do not require external executables",
|
|
33
|
+
"integration: local integration-style fixture tests that do not submit Slurm jobs",
|
|
34
|
+
"slurm: opt-in tests that may require ABACUS/DeePMD and a Slurm allocation",
|
|
35
|
+
]
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"""ATST-Tools package metadata helpers."""
|
|
2
|
+
|
|
3
|
+
from importlib.metadata import PackageNotFoundError, version as _metadata_version
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def _source_tree_version() -> str | None:
|
|
8
|
+
"""Return the project version from a local source-tree ``pyproject.toml``."""
|
|
9
|
+
for parent in Path(__file__).resolve().parents:
|
|
10
|
+
pyproject = parent / "pyproject.toml"
|
|
11
|
+
if not pyproject.exists():
|
|
12
|
+
continue
|
|
13
|
+
|
|
14
|
+
in_project = False
|
|
15
|
+
for raw_line in pyproject.read_text(encoding="utf-8").splitlines():
|
|
16
|
+
line = raw_line.strip()
|
|
17
|
+
if line == "[project]":
|
|
18
|
+
in_project = True
|
|
19
|
+
continue
|
|
20
|
+
if in_project and line.startswith("["):
|
|
21
|
+
return None
|
|
22
|
+
if in_project and line.startswith("version"):
|
|
23
|
+
_, value = line.split("=", 1)
|
|
24
|
+
return value.strip().strip('"').strip("'")
|
|
25
|
+
return None
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def package_version() -> str:
|
|
29
|
+
"""Return the ATST-Tools package version.
|
|
30
|
+
|
|
31
|
+
The package version is governed by ``pyproject.toml``. Source-tree runs
|
|
32
|
+
read that file directly, while installed-package runs use distribution
|
|
33
|
+
metadata generated from the same project version.
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
Project package version, or ``"unknown"`` when neither source-tree nor
|
|
37
|
+
installed-package metadata is available.
|
|
38
|
+
"""
|
|
39
|
+
return _source_tree_version() or _installed_version()
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _installed_version() -> str:
|
|
43
|
+
try:
|
|
44
|
+
return _metadata_version("atst-tools")
|
|
45
|
+
except PackageNotFoundError:
|
|
46
|
+
return "unknown"
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
__version__ = package_version()
|
|
50
|
+
|
|
51
|
+
__all__ = ["__version__", "package_version"]
|
|
File without changes
|