Open In Colab

Nudged Elastic Band

janus-core contains various machine learnt interatomic potentials (MLIPs), including MACE based models (MACE-MP, MACE-OFF), CHGNet, SevenNet and more, full list on https://github.com/stfc/janus-core.

Other will be added as their utility is proven beyond a specific material.

Aim

We showcase the use of NEB with janus and MLIPs by studying Ethanol oxidation reactions catalyzed by water molecules, the full study was carried out in this paper Chemical Physics Letters 363 (2002) 80–86

https://doi.org/10.1016/S0009-2614(02)01142-9

Set up environment (optional)

These steps are required to run this tutorial with Google Colab. To do so, uncomment and run the cell below.

This will replace pre-installed versions of numpy and torch in Colab with versions that are known to be compatible with janus-core.

It may be possible to skip the steps that uninstall and reinstall torch, which will save a considerable amount of time.

These instructions but may work for other systems too, but it is typically preferable to prepare a virtual environment separately before running this notebook if possible.

[1]:
# import locale
# locale.getpreferredencoding = lambda: "UTF-8"

# ! pip uninstall numpy -y # Uninstall pre-installed numpy

# ! pip uninstall torch torchaudio torchvision transformers -y # Uninstall pre-installed torch
# ! uv pip install torch==2.5.1 # Install pinned version of torch

# ! uv pip install janus-core[mace,visualise] data-tutorials --system # Install janus-core with MACE and WeasWidget, and data-tutorials

# get_ipython().kernel.do_shutdown(restart=True) # Restart kernel to update libraries. This may warn that your session has crashed.

To ensure you have the latest version of janus-core installed, compare the output of the following cell to the latest version available at https://pypi.org/project/janus-core/

[2]:
from janus_core import __version__

print(__version__)
0.8.7

Prepare data

Use data_tutorials to get the data required for this tutorial:

[3]:
from data_tutorials.data import get_data

get_data(
    url="https://raw.githubusercontent.com/stfc/janus-core/main/docs/source/tutorials/data/",
    filename=["ethanol_reactants.extxyz", "ethanol_products.extxyz","ethanol_reactants_1water.extxyz","ethanol_products_1water.extxyz","ethanol_reactants_2water.extxyz","ethanol_products_2water.extxyz"],
    folder="../data",
)
try to download ethanol_reactants.extxyz from https://raw.githubusercontent.com/stfc/janus-core/main/docs/source/tutorials/data/ and save it in ../data/ethanol_reactants.extxyz
saved in ../data/ethanol_reactants.extxyz
try to download ethanol_products.extxyz from https://raw.githubusercontent.com/stfc/janus-core/main/docs/source/tutorials/data/ and save it in ../data/ethanol_products.extxyz
saved in ../data/ethanol_products.extxyz
try to download ethanol_reactants_1water.extxyz from https://raw.githubusercontent.com/stfc/janus-core/main/docs/source/tutorials/data/ and save it in ../data/ethanol_reactants_1water.extxyz
saved in ../data/ethanol_reactants_1water.extxyz
try to download ethanol_products_1water.extxyz from https://raw.githubusercontent.com/stfc/janus-core/main/docs/source/tutorials/data/ and save it in ../data/ethanol_products_1water.extxyz
saved in ../data/ethanol_products_1water.extxyz
try to download ethanol_reactants_2water.extxyz from https://raw.githubusercontent.com/stfc/janus-core/main/docs/source/tutorials/data/ and save it in ../data/ethanol_reactants_2water.extxyz
saved in ../data/ethanol_reactants_2water.extxyz
try to download ethanol_products_2water.extxyz from https://raw.githubusercontent.com/stfc/janus-core/main/docs/source/tutorials/data/ and save it in ../data/ethanol_products_2water.extxyz
saved in ../data/ethanol_products_2water.extxyz

Command-line help and options

Once janus-core is installed, the janus CLI command should be available:

[4]:
! janus neb --help
                                                                                
 Usage: janus neb [OPTIONS]                                                     
                                                                                
 Run Nudged Elastic Band method.

╭─ Options ────────────────────────────────────────────────────────────────────╮
│ --config        TEXT  Path to configuration file.                            │
│ --help                Show this message and exit.                            │
╰──────────────────────────────────────────────────────────────────────────────╯
╭─ MLIP calculator ────────────────────────────────────────────────────────────╮
│ *  --arch               [mace|mace_mp|mace_off|m  MLIP architecture to use   │
│                         3gnet|chgnet|alignn|seve  for calculations.          │
│                         nnet|nequip|dpa3|orb|mat  [required]                 │
│                         tersim|grace|esen|equifo                             │
│                         rmer|pet_mad|uma|mace_om                             │
│                         ol]                                                  │
│    --device             [cpu|cuda|mps|xpu]        Device to run calculations │
│                                                   on.                        │
│                                                   [default: cpu]             │
│    --model              TEXT                      MLIP model name, or path   │
│                                                   to model.                  │
│    --calc-kwargs        DICT                      Keyword arguments to pass  │
│                                                   to selected calculator.    │
│                                                   Must be passed as a        │
│                                                   dictionary wrapped in      │
│                                                   quotes, e.g. "{'key':      │
│                                                   value}".                   │
╰──────────────────────────────────────────────────────────────────────────────╯
╭─ Calculation ────────────────────────────────────────────────────────────────╮
│ --init-struct                             PATH            Path of initial    │
│                                                           structure in band. │
│ --final-struct                            PATH            Path of final      │
│                                                           structure in band. │
│ --neb-structs                             PATH            Path of all NEB    │
│                                                           images.            │
│ --neb-class                               TEXT            Name of ASE NEB    │
│                                                           class to use.      │
│                                                           [default: NEB]     │
│ --n-images                                INTEGER         Number of images   │
│                                                           to use in NEB.     │
│                                                           [default: 15]      │
│ --write-band           --no-write-band                    Whether to write   │
│                                                           out all band       │
│                                                           images after       │
│                                                           optimization.      │
│                                                           [default:          │
│                                                           no-write-band]     │
│ --neb-kwargs                              DICT            Keyword arguments  │
│                                                           to pass to         │
│                                                           neb_method. Must   │
│                                                           be passed as a     │
│                                                           dictionary wrapped │
│                                                           in quotes, e.g.    │
│                                                           "{'key': value}".  │
│ --interpolator                            [ase|pymatgen]  Choice of          │
│                                                           interpolation      │
│                                                           strategy.          │
│                                                           [default: ase]     │
│ --interpolator-kwa…                       DICT            Keyword arguments  │
│                                                           to pass to         │
│                                                           interpolator. Must │
│                                                           be passed as a     │
│                                                           dictionary wrapped │
│                                                           in quotes, e.g.    │
│                                                           "{'key': value}".  │
│ --optimizer                               TEXT            Name of ASE NEB    │
│                                                           optimizer to use.  │
│                                                           [default:          │
│                                                           NEBOptimizer]      │
│ --fmax                                    FLOAT           Maximum force for  │
│                                                           NEB optimizer.     │
│                                                           [default: 0.1]     │
│ --steps                                   INTEGER         Maximum number of  │
│                                                           steps for          │
│                                                           optimization.      │
│                                                           [default: 100]     │
│ --optimizer-kwargs                        DICT            Keyword arguments  │
│                                                           to pass to         │
│                                                           neb_optimizer.     │
│                                                           Must be passed as  │
│                                                           a dictionary       │
│                                                           wrapped in quotes, │
│                                                           e.g. "{'key':      │
│                                                           value}".           │
│ --plot-band            --no-plot-band                     Whether to plot    │
│                                                           and save NEB band. │
│                                                           [default:          │
│                                                           no-plot-band]      │
│ --minimize             --no-minimize                      Whether to         │
│                                                           minimize initial   │
│                                                           and final          │
│                                                           structures.        │
│                                                           [default:          │
│                                                           no-minimize]       │
│ --minimize-kwargs                         DICT            Keyword arguments  │
│                                                           to pass to         │
│                                                           geometry           │
│                                                           optimizer,         │
│                                                           including          │
│                                                           "opt_kwargs",      │
│                                                           "filter_kwargs",   │
│                                                           and "traj_kwargs". │
│                                                           Must be passed as  │
│                                                           a dictionary       │
│                                                           wrapped in quotes, │
│                                                           e.g. "{'key':      │
│                                                           value}".           │
╰──────────────────────────────────────────────────────────────────────────────╯
╭─ Structure I/O ──────────────────────────────────────────────────────────────╮
│ --file-prefix         PATH  Prefix for output files, including directories.  │
│                             Default directory is ./janus_results, and        │
│                             default filename prefix is inferred from the     │
│                             input stucture filename.                         │
│ --read-kwargs         DICT  Keyword arguments to pass to ase.io.read. Must   │
│                             be passed as a dictionary wrapped in quotes,     │
│                             e.g. "{'key': value}". By default,               │
│                             read_kwargs['index'] = -1, so only the last      │
│                             structure is read.                               │
│ --write-kwargs        DICT  Keyword arguments to pass to ase.io.write when   │
│                             saving any structures. Must be passed as a       │
│                             dictionary wrapped in quotes, e.g. "{'key':      │
│                             value}".                                         │
╰──────────────────────────────────────────────────────────────────────────────╯
╭─ Logging/summary ────────────────────────────────────────────────────────────╮
│ --log                        PATH  Path to save logs to. Default is inferred │
│                                    from `file_prefix`                        │
│ --tracker    --no-tracker          Whether to save carbon emissions of       │
│                                    calculation                               │
│                                    [default: tracker]                        │
│ --summary                    PATH  Path to save summary of inputs, start/end │
│                                    time, and carbon emissions. Default is    │
│                                    inferred from `file_prefix`.              │
╰──────────────────────────────────────────────────────────────────────────────╯

run a simple Nudged Elastic Bands

0 water molecules case

[5]:
%%writefile neb.yml

init_struct: ../data/ethanol_reactants.extxyz
final_struct: ../data/ethanol_products.extxyz
n_images: 11
device: cpu
arch: mace_mp
model: medium-omat-0
minimize: False
plot_band: True
write_band: True
calc_kwargs:
      dispersion: True
tracker: False
Writing neb.yml

visualise the inputs

[6]:
from ase.io import read
from weas_widget import WeasWidget

r = read("../data/ethanol_reactants.extxyz")
p = read("../data/ethanol_products.extxyz")

v=WeasWidget()
v.from_ase([r,p])
v.avr.model_style = 1
v.avr.show_hydrogen_bonds = True
v

[6]:
[7]:
!janus neb --config neb.yml
/home/runner/work/janus-core/janus-core/.venv/lib/python3.12/site-packages/e3nn/o3/_wigner.py:10: UserWarning: Environment variable TORCH_FORCE_NO_WEIGHTS_ONLY_LOAD detected, since the`weights_only` argument was not explicitly passed to `torch.load`, forcing weights_only=False.
  _Jd, _W3j_flat, _W3j_indices = torch.load(os.path.join(os.path.dirname(__file__), 'constants.pt'))
cuequivariance or cuequivariance_torch is not available. Cuequivariance acceleration will be disabled.
Using model under Academic Software License (ASL) license, see https://github.com/gabor1/ASL
 To use this model you accept the terms of the license.
Downloading MACE model from 'https://github.com/ACEsuit/mace-mp/releases/download/mace_omat_0/mace-omat-0-medium.model'
Cached MACE model to /home/runner/.cache/mace/maceomat0mediummodel
Using Materials Project MACE for MACECalculator with /home/runner/.cache/mace/maceomat0mediummodel
Using float64 for MACECalculator, which is slower but more accurate. Recommended for geometry optimization.
/home/runner/work/janus-core/janus-core/.venv/lib/python3.12/site-packages/mace/calculators/mace.py:197: UserWarning: Environment variable TORCH_FORCE_NO_WEIGHTS_ONLY_LOAD detected, since the`weights_only` argument was not explicitly passed to `torch.load`, forcing weights_only=False.
  torch.load(f=model_path, map_location=device)
Using head default out of ['default']
                   Step     Time         fmax
NEBOptimizer[ode]:    0 13:28:17       4.9176
NEBOptimizer[ode]:    1 13:28:18       4.3168
NEBOptimizer[ode]:    2 13:28:19       3.4105
NEBOptimizer[ode]:    3 13:28:20       2.5245
NEBOptimizer[ode]:    4 13:28:21       2.4167
NEBOptimizer[ode]:    5 13:28:23       1.9228
NEBOptimizer[ode]:    6 13:28:24       1.8611
NEBOptimizer[ode]:    7 13:28:25       1.7459
NEBOptimizer[ode]:    8 13:28:26       1.3831
NEBOptimizer[ode]:    9 13:28:27       0.7608
NEBOptimizer[ode]:   10 13:28:29       0.6523
NEBOptimizer[ode]:   11 13:28:30       0.6026
NEBOptimizer[ode]:   12 13:28:31       0.5555
NEBOptimizer[ode]:   13 13:28:32       0.4538
NEBOptimizer[ode]:   14 13:28:35       0.4449
NEBOptimizer[ode]:   15 13:28:36       0.4384
NEBOptimizer[ode]:   16 13:28:37       0.4322
NEBOptimizer[ode]:   17 13:28:38       0.4093
NEBOptimizer[ode]:   18 13:28:39       0.5584
NEBOptimizer[ode]:   19 13:28:41       0.3333
NEBOptimizer[ode]:   20 13:28:42       0.3303
NEBOptimizer[ode]:   21 13:28:43       0.3266
NEBOptimizer[ode]:   22 13:28:45       0.3129
NEBOptimizer[ode]:   23 13:28:46       0.2650
NEBOptimizer[ode]:   24 13:28:48       0.2537
NEBOptimizer[ode]:   25 13:28:49       0.2517
NEBOptimizer[ode]:   26 13:28:50       0.2496
NEBOptimizer[ode]:   27 13:28:51       0.2474
NEBOptimizer[ode]:   28 13:28:52       0.2385
NEBOptimizer[ode]:   29 13:28:53       0.2017
NEBOptimizer[ode]:   30 13:28:55       0.1961
NEBOptimizer[ode]:   31 13:28:57       0.1940
NEBOptimizer[ode]:   32 13:28:58       0.1923
NEBOptimizer[ode]:   33 13:28:59       0.1895
NEBOptimizer[ode]:   34 13:29:00       0.1786
NEBOptimizer[ode]:   35 13:29:01       0.1368
NEBOptimizer[ode]:   36 13:29:03       0.1698
NEBOptimizer[ode]:   37 13:29:04       0.1318
NEBOptimizer[ode]:   38 13:29:05       0.1307
NEBOptimizer[ode]:   39 13:29:07       0.1260
NEBOptimizer[ode]:   40 13:29:08       0.1096
NEBOptimizer[ode]:   41 13:29:10       0.1054
NEBOptimizer[ode]:   42 13:29:11       0.1355
NEBOptimizer[ode]:   43 13:29:12       0.1019
NEBOptimizer[ode]:   44 13:29:13       0.1012
NEBOptimizer[ode]:   45 13:29:14       0.1004
NEBOptimizer[ode]:   46 13:29:15       0.0971
[8]:
!ls janus_results/
Aluminium-elastic_tensor.dat
Aluminium-elasticity-log.yml
Aluminium-elasticity-summary.yml
Carbon-nanotube-elastic_tensor.dat
Carbon-nanotube-elasticity-log.yml
Carbon-nanotube-elasticity-summary.yml
Diamond-elastic_tensor.dat
Diamond-elasticity-generated.extxyz
Diamond-elasticity-log.yml
Diamond-elasticity-opt.extxyz
Diamond-elasticity-summary.yml
NaCl-1040-npt-T1040.0-T1080.0-p0.0-final.extxyz
NaCl-1040-npt-T1040.0-T1080.0-p0.0-md-log.yml
NaCl-1040-npt-T1040.0-T1080.0-p0.0-md-summary.yml
NaCl-1040-npt-T1040.0-T1080.0-p0.0-stats.dat
NaCl-1040-npt-T1040.0-T1080.0-p0.0-traj.extxyz
NaCl-deformed-geomopt-log.yml
NaCl-deformed-geomopt-summary.yml
NaCl-deformed-opt.extxyz
NaCl-deformed-traj.extxyz
NaCl-mace-geomopt-log.yml
NaCl-mace-geomopt-summary.yml
NaCl-mace-opt.extxyz
NaCl-nvt-T100.0-cor.dat
NaCl-nvt-T100.0-final.extxyz
NaCl-nvt-T100.0-md-log.yml
NaCl-nvt-T100.0-md-summary.yml
NaCl-nvt-T100.0-res-100.extxyz
NaCl-nvt-T100.0-res-150.extxyz
NaCl-nvt-T100.0-res-200.extxyz
NaCl-nvt-T100.0-res-250.extxyz
NaCl-nvt-T100.0-res-300.extxyz
NaCl-nvt-T100.0-res-50.extxyz
NaCl-nvt-T100.0-stats.dat
NaCl-nvt-T100.0-traj.extxyz
NaCl-orb-geomopt-log.yml
NaCl-orb-geomopt-summary.yml
NaCl-orb-opt.extxyz
ethanol_reactants-neb-band.extxyz
ethanol_reactants-neb-log.yml
ethanol_reactants-neb-plot.svg
ethanol_reactants-neb-results.dat
ethanol_reactants-neb-summary.yml
[9]:
from IPython.display import SVG, display
display(SVG("janus_results/ethanol_reactants-neb-plot.svg"))
../../_images/tutorials_cli_neb_20_0.svg
[10]:
nebp = read("janus_results/ethanol_reactants-neb-band.extxyz", index=":")

w=WeasWidget()
w.from_ase(nebp)
w.avr.model_style = 1
w.avr.show_hydrogen_bonds = True
w
[10]:

is the barrier realistic? compare with the numbers from the paper.

1 water molecule

we can use the previous config and just overwrite the init and final structures

[11]:
! janus neb --config neb.yml --init-struct ../data/ethanol_reactants_1water.extxyz --final-struct ../data/ethanol_products_1water.extxyz
/home/runner/work/janus-core/janus-core/.venv/lib/python3.12/site-packages/e3nn/o3/_wigner.py:10: UserWarning: Environment variable TORCH_FORCE_NO_WEIGHTS_ONLY_LOAD detected, since the`weights_only` argument was not explicitly passed to `torch.load`, forcing weights_only=False.
  _Jd, _W3j_flat, _W3j_indices = torch.load(os.path.join(os.path.dirname(__file__), 'constants.pt'))
cuequivariance or cuequivariance_torch is not available. Cuequivariance acceleration will be disabled.
Using model under Academic Software License (ASL) license, see https://github.com/gabor1/ASL
 To use this model you accept the terms of the license.
Using Materials Project MACE for MACECalculator with /home/runner/.cache/mace/maceomat0mediummodel
Using float64 for MACECalculator, which is slower but more accurate. Recommended for geometry optimization.
/home/runner/work/janus-core/janus-core/.venv/lib/python3.12/site-packages/mace/calculators/mace.py:197: UserWarning: Environment variable TORCH_FORCE_NO_WEIGHTS_ONLY_LOAD detected, since the`weights_only` argument was not explicitly passed to `torch.load`, forcing weights_only=False.
  torch.load(f=model_path, map_location=device)
Using head default out of ['default']
                   Step     Time         fmax
NEBOptimizer[ode]:    0 13:29:27       3.0813
NEBOptimizer[ode]:    1 13:29:28       2.9654
NEBOptimizer[ode]:    2 13:29:29       2.5738
NEBOptimizer[ode]:    3 13:29:31       3.6499
NEBOptimizer[ode]:    4 13:29:32       3.6534
NEBOptimizer[ode]:    5 13:29:33       2.3194
NEBOptimizer[ode]:    6 13:29:35       1.2271
NEBOptimizer[ode]:    7 13:29:36       1.1127
NEBOptimizer[ode]:    8 13:29:37       0.9297
NEBOptimizer[ode]:    9 13:29:40       0.8083
NEBOptimizer[ode]:   10 13:29:42       0.7616
NEBOptimizer[ode]:   11 13:29:43       1.2211
NEBOptimizer[ode]:   12 13:29:44       1.8915
NEBOptimizer[ode]:   13 13:29:46       0.6141
NEBOptimizer[ode]:   14 13:29:47       0.5161
NEBOptimizer[ode]:   15 13:29:48       0.4897
NEBOptimizer[ode]:   16 13:29:50       0.4248
NEBOptimizer[ode]:   17 13:29:52       0.4203
NEBOptimizer[ode]:   18 13:29:54       0.4153
NEBOptimizer[ode]:   19 13:29:55       0.4107
NEBOptimizer[ode]:   20 13:29:56       0.4072
NEBOptimizer[ode]:   21 13:29:58       0.4040
NEBOptimizer[ode]:   22 13:29:59       0.3996
NEBOptimizer[ode]:   23 13:30:00       0.3888
NEBOptimizer[ode]:   24 13:30:02       0.7117
NEBOptimizer[ode]:   25 13:30:03       0.3768
NEBOptimizer[ode]:   26 13:30:05       0.3744
NEBOptimizer[ode]:   27 13:30:06       0.3712
NEBOptimizer[ode]:   28 13:30:07       0.3573
NEBOptimizer[ode]:   29 13:30:09       0.3410
NEBOptimizer[ode]:   30 13:30:11       0.3172
NEBOptimizer[ode]:   31 13:30:13       0.2816
NEBOptimizer[ode]:   32 13:30:14       0.2789
NEBOptimizer[ode]:   33 13:30:15       0.2675
NEBOptimizer[ode]:   34 13:30:17       0.2207
NEBOptimizer[ode]:   35 13:30:19       0.2188
NEBOptimizer[ode]:   36 13:30:22       0.2136
NEBOptimizer[ode]:   37 13:30:23       0.2123
NEBOptimizer[ode]:   38 13:30:25       0.2055
NEBOptimizer[ode]:   39 13:30:26       0.2923
NEBOptimizer[ode]:   40 13:30:29       0.1806
NEBOptimizer[ode]:   41 13:30:30       0.1799
NEBOptimizer[ode]:   42 13:30:32       0.1763
NEBOptimizer[ode]:   43 13:30:33       0.1616
NEBOptimizer[ode]:   44 13:30:34       0.1855
NEBOptimizer[ode]:   45 13:30:38       0.1267
NEBOptimizer[ode]:   46 13:30:40       0.1244
NEBOptimizer[ode]:   47 13:30:41       0.1197
NEBOptimizer[ode]:   48 13:30:43       0.1153
NEBOptimizer[ode]:   49 13:30:45       0.1134
NEBOptimizer[ode]:   50 13:30:47       0.1143
NEBOptimizer[ode]:   51 13:30:48       0.1123
NEBOptimizer[ode]:   52 13:30:49       0.1131
NEBOptimizer[ode]:   53 13:30:51       0.1103
NEBOptimizer[ode]:   54 13:30:52       0.1104
NEBOptimizer[ode]:   55 13:30:53       0.1102
NEBOptimizer[ode]:   56 13:30:55       0.1089
NEBOptimizer[ode]:   57 13:30:56       0.1025
NEBOptimizer[ode]:   58 13:30:59       0.1071
NEBOptimizer[ode]:   59 13:31:00       0.1519
NEBOptimizer[ode]:   60 13:31:02       0.0993
[12]:
!ls janus_results/
Aluminium-elastic_tensor.dat
Aluminium-elasticity-log.yml
Aluminium-elasticity-summary.yml
Carbon-nanotube-elastic_tensor.dat
Carbon-nanotube-elasticity-log.yml
Carbon-nanotube-elasticity-summary.yml
Diamond-elastic_tensor.dat
Diamond-elasticity-generated.extxyz
Diamond-elasticity-log.yml
Diamond-elasticity-opt.extxyz
Diamond-elasticity-summary.yml
NaCl-1040-npt-T1040.0-T1080.0-p0.0-final.extxyz
NaCl-1040-npt-T1040.0-T1080.0-p0.0-md-log.yml
NaCl-1040-npt-T1040.0-T1080.0-p0.0-md-summary.yml
NaCl-1040-npt-T1040.0-T1080.0-p0.0-stats.dat
NaCl-1040-npt-T1040.0-T1080.0-p0.0-traj.extxyz
NaCl-deformed-geomopt-log.yml
NaCl-deformed-geomopt-summary.yml
NaCl-deformed-opt.extxyz
NaCl-deformed-traj.extxyz
NaCl-mace-geomopt-log.yml
NaCl-mace-geomopt-summary.yml
NaCl-mace-opt.extxyz
NaCl-nvt-T100.0-cor.dat
NaCl-nvt-T100.0-final.extxyz
NaCl-nvt-T100.0-md-log.yml
NaCl-nvt-T100.0-md-summary.yml
NaCl-nvt-T100.0-res-100.extxyz
NaCl-nvt-T100.0-res-150.extxyz
NaCl-nvt-T100.0-res-200.extxyz
NaCl-nvt-T100.0-res-250.extxyz
NaCl-nvt-T100.0-res-300.extxyz
NaCl-nvt-T100.0-res-50.extxyz
NaCl-nvt-T100.0-stats.dat
NaCl-nvt-T100.0-traj.extxyz
NaCl-orb-geomopt-log.yml
NaCl-orb-geomopt-summary.yml
NaCl-orb-opt.extxyz
ethanol_reactants-neb-band.extxyz
ethanol_reactants-neb-log.yml
ethanol_reactants-neb-plot.svg
ethanol_reactants-neb-results.dat
ethanol_reactants-neb-summary.yml
ethanol_reactants_1water-neb-band.extxyz
ethanol_reactants_1water-neb-log.yml
ethanol_reactants_1water-neb-plot.svg
ethanol_reactants_1water-neb-results.dat
ethanol_reactants_1water-neb-summary.yml
[13]:
display(SVG("janus_results/ethanol_reactants_1water-neb-plot.svg"))
../../_images/tutorials_cli_neb_25_0.svg
[14]:
from ase.io import read
from weas_widget import WeasWidget
nebp = read("janus_results/ethanol_reactants_1water-neb-band.extxyz", index=":")

w1=WeasWidget()
w1.from_ase(nebp)
w1.avr.model_style = 1
w1.avr.show_hydrogen_bonds = True
w1
[14]:

2 water molecules

[15]:
! janus neb --config neb.yml --init-struct ../data/ethanol_reactants_2water.extxyz --final-struct ../data/ethanol_products_2water.extxyz
/home/runner/work/janus-core/janus-core/.venv/lib/python3.12/site-packages/e3nn/o3/_wigner.py:10: UserWarning: Environment variable TORCH_FORCE_NO_WEIGHTS_ONLY_LOAD detected, since the`weights_only` argument was not explicitly passed to `torch.load`, forcing weights_only=False.
  _Jd, _W3j_flat, _W3j_indices = torch.load(os.path.join(os.path.dirname(__file__), 'constants.pt'))
cuequivariance or cuequivariance_torch is not available. Cuequivariance acceleration will be disabled.
Using model under Academic Software License (ASL) license, see https://github.com/gabor1/ASL
 To use this model you accept the terms of the license.
Using Materials Project MACE for MACECalculator with /home/runner/.cache/mace/maceomat0mediummodel
Using float64 for MACECalculator, which is slower but more accurate. Recommended for geometry optimization.
/home/runner/work/janus-core/janus-core/.venv/lib/python3.12/site-packages/mace/calculators/mace.py:197: UserWarning: Environment variable TORCH_FORCE_NO_WEIGHTS_ONLY_LOAD detected, since the`weights_only` argument was not explicitly passed to `torch.load`, forcing weights_only=False.
  torch.load(f=model_path, map_location=device)
Using head default out of ['default']
                   Step     Time         fmax
NEBOptimizer[ode]:    0 13:31:12       4.6405
NEBOptimizer[ode]:    1 13:31:14       2.2632
NEBOptimizer[ode]:    2 13:31:16       1.3853
NEBOptimizer[ode]:    3 13:31:17       1.1299
NEBOptimizer[ode]:    4 13:31:19       0.9930
NEBOptimizer[ode]:    5 13:31:20       1.1564
NEBOptimizer[ode]:    6 13:31:24       1.0885
NEBOptimizer[ode]:    7 13:31:25       1.0995
NEBOptimizer[ode]:    8 13:31:27       1.0312
NEBOptimizer[ode]:    9 13:31:29       1.1042
NEBOptimizer[ode]:   10 13:31:30       0.9436
NEBOptimizer[ode]:   11 13:31:32       0.9031
NEBOptimizer[ode]:   12 13:31:34       0.8189
NEBOptimizer[ode]:   13 13:31:36       0.7859
NEBOptimizer[ode]:   14 13:31:37       0.7575
NEBOptimizer[ode]:   15 13:31:39       0.6450
NEBOptimizer[ode]:   16 13:31:42       0.6245
NEBOptimizer[ode]:   17 13:31:44       0.5879
NEBOptimizer[ode]:   18 13:31:46       0.5748
NEBOptimizer[ode]:   19 13:31:47       0.5508
NEBOptimizer[ode]:   20 13:31:49       0.5406
NEBOptimizer[ode]:   21 13:31:51       0.5171
NEBOptimizer[ode]:   22 13:31:52       0.4669
NEBOptimizer[ode]:   23 13:31:56       0.4490
NEBOptimizer[ode]:   24 13:31:57       0.4422
NEBOptimizer[ode]:   25 13:31:59       0.4181
NEBOptimizer[ode]:   26 13:32:01       0.3404
NEBOptimizer[ode]:   27 13:32:04       0.3215
NEBOptimizer[ode]:   28 13:32:06       0.3176
NEBOptimizer[ode]:   29 13:32:08       0.3113
NEBOptimizer[ode]:   30 13:32:09       0.3028
NEBOptimizer[ode]:   31 13:32:11       0.2695
NEBOptimizer[ode]:   32 13:32:14       0.2638
NEBOptimizer[ode]:   33 13:32:16       0.2541
NEBOptimizer[ode]:   34 13:32:18       0.2369
NEBOptimizer[ode]:   35 13:32:21       0.2307
NEBOptimizer[ode]:   36 13:32:22       0.2256
NEBOptimizer[ode]:   37 13:32:24       0.2187
NEBOptimizer[ode]:   38 13:32:26       0.2243
NEBOptimizer[ode]:   39 13:32:29       0.2130
NEBOptimizer[ode]:   40 13:32:31       0.2102
NEBOptimizer[ode]:   41 13:32:32       0.2069
NEBOptimizer[ode]:   42 13:32:34       0.1986
NEBOptimizer[ode]:   43 13:32:36       0.2522
NEBOptimizer[ode]:   44 13:32:39       0.1837
NEBOptimizer[ode]:   45 13:32:41       0.1793
NEBOptimizer[ode]:   46 13:32:42       0.1748
NEBOptimizer[ode]:   47 13:32:44       0.1579
NEBOptimizer[ode]:   48 13:32:46       0.1342
NEBOptimizer[ode]:   49 13:32:49       0.1479
NEBOptimizer[ode]:   50 13:32:51       0.1281
NEBOptimizer[ode]:   51 13:32:52       0.1277
NEBOptimizer[ode]:   52 13:32:54       0.1282
NEBOptimizer[ode]:   53 13:32:56       0.1288
NEBOptimizer[ode]:   54 13:32:59       0.1257
NEBOptimizer[ode]:   55 13:33:01       0.1513
NEBOptimizer[ode]:   56 13:33:02       0.1277
NEBOptimizer[ode]:   57 13:33:04       0.1273
NEBOptimizer[ode]:   58 13:33:06       0.1270
NEBOptimizer[ode]:   59 13:33:07       0.1269
NEBOptimizer[ode]:   60 13:33:09       0.1286
NEBOptimizer[ode]:   61 13:33:12       0.1156
NEBOptimizer[ode]:   62 13:33:14       0.1249
NEBOptimizer[ode]:   63 13:33:15       0.1234
NEBOptimizer[ode]:   64 13:33:17       0.1230
NEBOptimizer[ode]:   65 13:33:19       0.1225
NEBOptimizer[ode]:   66 13:33:20       0.1253
NEBOptimizer[ode]:   67 13:33:24       0.1011
NEBOptimizer[ode]:   68 13:33:25       0.1522
NEBOptimizer[ode]:   69 13:33:27       0.1119
NEBOptimizer[ode]:   70 13:33:28       0.1181
NEBOptimizer[ode]:   71 13:33:30       0.1180
NEBOptimizer[ode]:   72 13:33:32       0.1172
NEBOptimizer[ode]:   73 13:33:35       0.1167
NEBOptimizer[ode]:   74 13:33:37       0.1165
NEBOptimizer[ode]:   75 13:33:38       0.1159
NEBOptimizer[ode]:   76 13:33:40       0.1148
NEBOptimizer[ode]:   77 13:33:43       0.1131
NEBOptimizer[ode]:   78 13:33:45       0.1124
NEBOptimizer[ode]:   79 13:33:47       0.1110
NEBOptimizer[ode]:   80 13:33:48       0.1138
NEBOptimizer[ode]:   81 13:33:52       0.0923
[16]:
display(SVG("janus_results/ethanol_reactants_2water-neb-plot.svg"))
../../_images/tutorials_cli_neb_29_0.svg
[17]:
from ase.io import read
from weas_widget import WeasWidget
nebp = read("janus_results/ethanol_reactants_2water-neb-band.extxyz", index=":")

w2=WeasWidget()
w2.from_ase(nebp)
w2.avr.model_style = 1
w2.avr.show_hydrogen_bonds = True
w2
[17]:

extra bits

  • analyse the barrier height trend.

  • consider redoing the same exercise with a different potential… remember if you use mace-off dispersion needs to be off.