Open In Colab

Nudge 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 stuing 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 for Google Colab, but may work on other systems too:

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

# ! pip uninstall torch torchaudio torchvision transformers numpy -y
# ! uv pip install janus-core[all] data-tutorials torch==2.5.1 --system
# get_ipython().kernel.do_shutdown(restart=True)

Use data_tutorials to get the data required for this tutorial:

[2]:
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:

[3]:
! 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]                                                │
│    --device             [cpu|cuda|mps|xpu]        Device to run calculations │
│                                                   on.                        │
│                                                   [default: cpu]             │
│    --model              TEXT                      MLIP model name, or path   │
│                                                   to model.                  │
│                                                   [default: None]            │
│    --model-path         TEXT                      Deprecated. Please use     │
│                                                   --model                    │
│                                                   [default: None]            │
│    --calc-kwargs        DICT                      Keyword arguments to pass  │
│                                                   to selected calculator.    │
│                                                   Must be passed as a        │
│                                                   dictionary wrapped in      │
│                                                   quotes, e.g. "{'key':      │
│                                                   value}".                   │
│                                                   [default: None]            │
╰──────────────────────────────────────────────────────────────────────────────╯
╭─ Calculation ────────────────────────────────────────────────────────────────╮
│ --init-struct                             PATH            Path of initial    │
│                                                           structure in band. │
│                                                           [default: None]    │
│ --final-struct                            PATH            Path of final      │
│                                                           structure in band. │
│                                                           [default: None]    │
│ --neb-structs                             PATH            Path of all NEB    │
│                                                           images.            │
│                                                           [default: None]    │
│ --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}".  │
│                                                           [default: None]    │
│ --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}".  │
│                                                           [default: None]    │
│ --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}".           │
│                                                           [default: None]    │
│ --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         │
│                                                           optimizer. Must be │
│                                                           passed as a        │
│                                                           dictionary wrapped │
│                                                           in quotes, e.g.    │
│                                                           "{'key': value}".  │
│                                                           [default: None]    │
╰──────────────────────────────────────────────────────────────────────────────╯
╭─ 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.                         │
│                             [default: None]                                  │
│ --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.                               │
│                             [default: None]                                  │
│ --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}".                                         │
│                             [default: None]                                  │
╰──────────────────────────────────────────────────────────────────────────────╯
╭─ Logging/summary ────────────────────────────────────────────────────────────╮
│ --log                        PATH  Path to save logs to. Default is inferred │
│                                    from `file_prefix`                        │
│                                    [default: None]                           │
│ --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`.              │
│                                    [default: None]                           │
╰──────────────────────────────────────────────────────────────────────────────╯

run a simple Nudge Elastic Bands

0 water molecules case

[4]:
%%writefile neb.yml

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

visualise the inputs

[5]:
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

[5]:
[6]:
!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:143: 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']
Using TorchDFTD3Calculator for D3 dispersion corrections
       Step     Time          Energy          fmax
LBFGS:    0 14:25:32      -45.882336        0.000646
       Step     Time          Energy          fmax
LBFGS:    0 14:25:33      -44.967101        0.000453
                   Step     Time         fmax
NEBOptimizer[ode]:    0 14:25:37       4.9176
NEBOptimizer[ode]:    1 14:25:39       4.3168
NEBOptimizer[ode]:    2 14:25:40       3.4105
NEBOptimizer[ode]:    3 14:25:41       2.5245
NEBOptimizer[ode]:    4 14:25:43       2.4167
NEBOptimizer[ode]:    5 14:25:44       1.9228
NEBOptimizer[ode]:    6 14:25:46       1.8611
NEBOptimizer[ode]:    7 14:25:47       1.7459
NEBOptimizer[ode]:    8 14:25:48       1.3831
NEBOptimizer[ode]:    9 14:25:50       0.7608
NEBOptimizer[ode]:   10 14:25:53       0.6523
NEBOptimizer[ode]:   11 14:25:54       0.6026
NEBOptimizer[ode]:   12 14:25:56       0.5555
NEBOptimizer[ode]:   13 14:25:57       0.4538
NEBOptimizer[ode]:   14 14:26:00       0.4449
NEBOptimizer[ode]:   15 14:26:01       0.4384
NEBOptimizer[ode]:   16 14:26:03       0.4322
NEBOptimizer[ode]:   17 14:26:04       0.4093
NEBOptimizer[ode]:   18 14:26:05       0.5584
NEBOptimizer[ode]:   19 14:26:08       0.3333
NEBOptimizer[ode]:   20 14:26:10       0.3303
NEBOptimizer[ode]:   21 14:26:11       0.3266
NEBOptimizer[ode]:   22 14:26:12       0.3129
NEBOptimizer[ode]:   23 14:26:14       0.2650
NEBOptimizer[ode]:   24 14:26:17       0.2537
NEBOptimizer[ode]:   25 14:26:18       0.2517
NEBOptimizer[ode]:   26 14:26:20       0.2496
NEBOptimizer[ode]:   27 14:26:21       0.2474
NEBOptimizer[ode]:   28 14:26:22       0.2385
NEBOptimizer[ode]:   29 14:26:24       0.2017
NEBOptimizer[ode]:   30 14:26:27       0.1961
NEBOptimizer[ode]:   31 14:26:28       0.1940
NEBOptimizer[ode]:   32 14:26:30       0.1923
NEBOptimizer[ode]:   33 14:26:31       0.1895
NEBOptimizer[ode]:   34 14:26:32       0.1786
NEBOptimizer[ode]:   35 14:26:34       0.1368
NEBOptimizer[ode]:   36 14:26:37       0.1698
NEBOptimizer[ode]:   37 14:26:38       0.1318
NEBOptimizer[ode]:   38 14:26:40       0.1307
NEBOptimizer[ode]:   39 14:26:41       0.1260
NEBOptimizer[ode]:   40 14:26:42       0.1096
NEBOptimizer[ode]:   41 14:26:45       0.1054
NEBOptimizer[ode]:   42 14:26:47       0.1355
NEBOptimizer[ode]:   43 14:26:48       0.1019
NEBOptimizer[ode]:   44 14:26:50       0.1012
NEBOptimizer[ode]:   45 14:26:51       0.1004
NEBOptimizer[ode]:   46 14:26:52       0.0971
[7]:
!ls janus_results/
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-sevennet-geomopt-log.yml
NaCl-sevennet-geomopt-summary.yml
NaCl-sevennet-opt.extxyz
ethanol_products-final-opt.extxyz
ethanol_reactants-init-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
[8]:
from IPython.display import SVG, display
display(SVG("janus_results/ethanol_reactants-neb-plot.svg"))
../../_images/tutorials_cli_neb_17_0.svg
[9]:
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
[9]:

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

[10]:
! 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:143: 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']
Using TorchDFTD3Calculator for D3 dispersion corrections
       Step     Time          Energy          fmax
LBFGS:    0 14:26:58      -60.262994        1.061688
LBFGS:    1 14:26:59      -60.291126        0.393867
LBFGS:    2 14:26:59      -60.299581        0.373133
LBFGS:    3 14:26:59      -60.319127        0.416926
LBFGS:    4 14:26:59      -60.333978        0.497735
LBFGS:    5 14:26:59      -60.348770        0.343877
LBFGS:    6 14:26:59      -60.357433        0.275794
LBFGS:    7 14:27:00      -60.362061        0.179321
LBFGS:    8 14:27:00      -60.366442        0.222576
LBFGS:    9 14:27:00      -60.370525        0.223311
LBFGS:   10 14:27:00      -60.374084        0.258707
LBFGS:   11 14:27:00      -60.377990        0.232420
LBFGS:   12 14:27:00      -60.382620        0.250770
LBFGS:   13 14:27:01      -60.387675        0.246213
LBFGS:   14 14:27:01      -60.391150        0.405453
LBFGS:   15 14:27:01      -60.396162        0.230709
LBFGS:   16 14:27:01      -60.400317        0.195376
LBFGS:   17 14:27:01      -60.409343        0.265397
LBFGS:   18 14:27:01      -60.414254        0.239674
LBFGS:   19 14:27:01      -60.421410        0.292684
LBFGS:   20 14:27:02      -60.427253        0.264662
LBFGS:   21 14:27:02      -60.430653        0.244037
LBFGS:   22 14:27:02      -60.434123        0.159676
LBFGS:   23 14:27:02      -60.436048        0.133209
LBFGS:   24 14:27:02      -60.438018        0.117606
LBFGS:   25 14:27:02      -60.439269        0.093829
       Step     Time          Energy          fmax
LBFGS:    0 14:27:02      -54.782788        4.967930
LBFGS:    1 14:27:03      -55.842124        4.419715
LBFGS:    2 14:27:03      -57.563214        3.842097
LBFGS:    3 14:27:03      -58.156407        3.085929
LBFGS:    4 14:27:03      -58.603480        1.822973
LBFGS:    5 14:27:03      -58.754786        1.667331
LBFGS:    6 14:27:03      -58.893874        1.111416
LBFGS:    7 14:27:04      -58.986243        0.764498
LBFGS:    8 14:27:04      -59.033748        0.684629
LBFGS:    9 14:27:04      -59.089144        0.741023
LBFGS:   10 14:27:04      -59.127877        0.668211
LBFGS:   11 14:27:04      -59.155500        0.531275
LBFGS:   12 14:27:04      -59.176890        0.480577
LBFGS:   13 14:27:04      -59.191363        0.377988
LBFGS:   14 14:27:05      -59.201482        0.238313
LBFGS:   15 14:27:05      -59.206878        0.235811
LBFGS:   16 14:27:05      -59.212756        0.217196
LBFGS:   17 14:27:05      -59.220000        0.247323
LBFGS:   18 14:27:05      -59.227507        0.234202
LBFGS:   19 14:27:05      -59.235758        0.268516
LBFGS:   20 14:27:05      -59.246952        0.323743
LBFGS:   21 14:27:06      -59.262551        0.338733
LBFGS:   22 14:27:06      -59.278414        0.269254
LBFGS:   23 14:27:06      -59.287097        0.199524
LBFGS:   24 14:27:06      -59.291332        0.166812
LBFGS:   25 14:27:06      -59.295380        0.189973
LBFGS:   26 14:27:06      -59.298914        0.196096
LBFGS:   27 14:27:07      -59.301667        0.108823
LBFGS:   28 14:27:07      -59.302967        0.094901
                   Step     Time         fmax
NEBOptimizer[ode]:    0 14:27:12       3.4130
NEBOptimizer[ode]:    1 14:27:13       2.9855
NEBOptimizer[ode]:    2 14:27:15       2.6281
NEBOptimizer[ode]:    3 14:27:17       2.3281
NEBOptimizer[ode]:    4 14:27:18       3.0049
NEBOptimizer[ode]:    5 14:27:20       1.7608
NEBOptimizer[ode]:    6 14:27:22       1.6214
NEBOptimizer[ode]:    7 14:27:23       1.5002
NEBOptimizer[ode]:    8 14:27:25       1.3879
NEBOptimizer[ode]:    9 14:27:27       0.9764
NEBOptimizer[ode]:   10 14:27:30       0.9044
NEBOptimizer[ode]:   11 14:27:31       0.8428
NEBOptimizer[ode]:   12 14:27:33       0.7601
NEBOptimizer[ode]:   13 14:27:35       0.5953
NEBOptimizer[ode]:   14 14:27:38       0.5891
NEBOptimizer[ode]:   15 14:27:40       0.5835
NEBOptimizer[ode]:   16 14:27:41       0.5727
NEBOptimizer[ode]:   17 14:27:43       0.5219
NEBOptimizer[ode]:   18 14:27:46       0.5117
NEBOptimizer[ode]:   19 14:27:48       0.5031
NEBOptimizer[ode]:   20 14:27:50       0.4907
NEBOptimizer[ode]:   21 14:27:51       0.4469
NEBOptimizer[ode]:   22 14:27:55       0.4386
NEBOptimizer[ode]:   23 14:27:56       0.4306
NEBOptimizer[ode]:   24 14:27:58       0.4047
NEBOptimizer[ode]:   25 14:28:00       0.2972
NEBOptimizer[ode]:   26 14:28:03       0.2663
NEBOptimizer[ode]:   27 14:28:04       0.2604
NEBOptimizer[ode]:   28 14:28:06       0.2545
NEBOptimizer[ode]:   29 14:28:08       0.2301
NEBOptimizer[ode]:   30 14:28:11       0.2192
NEBOptimizer[ode]:   31 14:28:14       0.2135
NEBOptimizer[ode]:   32 14:28:16       0.2107
NEBOptimizer[ode]:   33 14:28:18       0.2016
NEBOptimizer[ode]:   34 14:28:19       0.3006
NEBOptimizer[ode]:   35 14:28:23       0.1776
NEBOptimizer[ode]:   36 14:28:24       0.1772
NEBOptimizer[ode]:   37 14:28:26       0.1772
NEBOptimizer[ode]:   38 14:28:27       0.1807
NEBOptimizer[ode]:   39 14:28:29       0.2123
NEBOptimizer[ode]:   40 14:28:32       0.2047
NEBOptimizer[ode]:   41 14:28:34       0.2074
NEBOptimizer[ode]:   42 14:28:36       0.2087
NEBOptimizer[ode]:   43 14:28:37       0.2132
NEBOptimizer[ode]:   44 14:28:39       0.2231
NEBOptimizer[ode]:   45 14:28:41       0.2673
NEBOptimizer[ode]:   46 14:28:44       0.3758
NEBOptimizer[ode]:   47 14:28:45       0.2659
NEBOptimizer[ode]:   48 14:28:47       0.2672
NEBOptimizer[ode]:   49 14:28:49       0.2681
NEBOptimizer[ode]:   50 14:28:50       0.2720
NEBOptimizer[ode]:   51 14:28:52       0.2898
NEBOptimizer[ode]:   52 14:28:55       0.2937
NEBOptimizer[ode]:   53 14:28:57       0.2950
NEBOptimizer[ode]:   54 14:28:59       0.2961
NEBOptimizer[ode]:   55 14:29:01       0.3007
NEBOptimizer[ode]:   56 14:29:02       0.3202
NEBOptimizer[ode]:   57 14:29:05       0.3223
NEBOptimizer[ode]:   58 14:29:07       0.3238
NEBOptimizer[ode]:   59 14:29:09       0.3253
NEBOptimizer[ode]:   60 14:29:10       0.3318
NEBOptimizer[ode]:   61 14:29:12       0.3599
NEBOptimizer[ode]:   62 14:29:15       0.3654
NEBOptimizer[ode]:   63 14:29:17       0.3619
NEBOptimizer[ode]:   64 14:29:19       0.3628
NEBOptimizer[ode]:   65 14:29:20       0.3630
NEBOptimizer[ode]:   66 14:29:22       0.3641
NEBOptimizer[ode]:   67 14:29:24       0.3694
NEBOptimizer[ode]:   68 14:29:25       0.3937
NEBOptimizer[ode]:   69 14:29:29       0.4009
NEBOptimizer[ode]:   70 14:29:30       0.5961
NEBOptimizer[ode]:   71 14:29:32       0.9070
NEBOptimizer[ode]:   72 14:29:33       0.4085
NEBOptimizer[ode]:   73 14:29:35       0.4090
NEBOptimizer[ode]:   74 14:29:37       0.4077
NEBOptimizer[ode]:   75 14:29:38       0.4063
NEBOptimizer[ode]:   76 14:29:40       0.3985
NEBOptimizer[ode]:   77 14:29:42       0.3334
NEBOptimizer[ode]:   78 14:29:43       0.3197
NEBOptimizer[ode]:   79 14:29:45       0.2972
NEBOptimizer[ode]:   80 14:29:47       0.2915
NEBOptimizer[ode]:   81 14:29:48       0.2757
NEBOptimizer[ode]:   82 14:29:50       0.2748
NEBOptimizer[ode]:   83 14:29:52       0.2705
NEBOptimizer[ode]:   84 14:29:53       0.2564
[11]:
!ls janus_results/
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-sevennet-geomopt-log.yml
NaCl-sevennet-geomopt-summary.yml
NaCl-sevennet-opt.extxyz
ethanol_products-final-opt.extxyz
ethanol_products_1water-final-opt.extxyz
ethanol_reactants-init-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-init-opt.extxyz
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
[12]:
display(SVG("janus_results/ethanol_reactants_1water-neb-plot.svg"))
../../_images/tutorials_cli_neb_22_0.svg
[13]:
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
[13]:

2 water molecules

[14]:
! 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:143: 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']
Using TorchDFTD3Calculator for D3 dispersion corrections
       Step     Time          Energy          fmax
LBFGS:    0 14:30:00      -74.874702        1.110446
LBFGS:    1 14:30:00      -74.906042        0.425709
LBFGS:    2 14:30:00      -74.916713        0.406215
LBFGS:    3 14:30:01      -74.941726        0.498748
LBFGS:    4 14:30:01      -74.960387        0.514109
LBFGS:    5 14:30:01      -74.979367        0.340381
LBFGS:    6 14:30:01      -74.991632        0.343507
LBFGS:    7 14:30:01      -74.999807        0.272232
LBFGS:    8 14:30:01      -75.009224        0.276522
LBFGS:    9 14:30:02      -75.017780        0.265146
LBFGS:   10 14:30:02      -75.024942        0.296568
LBFGS:   11 14:30:02      -75.032384        0.272457
LBFGS:   12 14:30:02      -75.036593        0.657137
LBFGS:   13 14:30:02      -75.046940        0.263583
LBFGS:   14 14:30:03      -75.053793        0.167268
LBFGS:   15 14:30:03      -75.058922        0.148490
LBFGS:   16 14:30:03      -75.062275        0.224148
LBFGS:   17 14:30:03      -75.065986        0.217836
LBFGS:   18 14:30:03      -75.069368        0.133980
LBFGS:   19 14:30:03      -75.072034        0.123155
LBFGS:   20 14:30:04      -75.075654        0.223730
LBFGS:   21 14:30:04      -75.079793        0.284257
LBFGS:   22 14:30:04      -75.082180        0.312831
LBFGS:   23 14:30:04      -75.085640        0.188553
LBFGS:   24 14:30:04      -75.088211        0.153994
LBFGS:   25 14:30:05      -75.090710        0.146650
LBFGS:   26 14:30:05      -75.092438        0.149503
LBFGS:   27 14:30:05      -75.094338        0.098866
       Step     Time          Energy          fmax
LBFGS:    0 14:30:05      -69.878542        6.580558
LBFGS:    1 14:30:05      -70.783687        3.680620
LBFGS:    2 14:30:06      -71.397846        2.663688
LBFGS:    3 14:30:06      -71.974651        2.159790
LBFGS:    4 14:30:06      -72.356200        2.415625
LBFGS:    5 14:30:06      -72.809143        3.771575
LBFGS:    6 14:30:06      -73.018475        1.487707
LBFGS:    7 14:30:06      -73.209614        1.393163
LBFGS:    8 14:30:07      -73.359729        1.350852
LBFGS:    9 14:30:07      -73.541021        0.904684
LBFGS:   10 14:30:07      -73.602625        0.615768
LBFGS:   11 14:30:07      -73.633940        0.510137
LBFGS:   12 14:30:07      -73.656341        0.310855
LBFGS:   13 14:30:07      -73.673779        0.288316
LBFGS:   14 14:30:08      -73.688417        0.317602
LBFGS:   15 14:30:08      -73.705938        0.302659
LBFGS:   16 14:30:08      -73.722209        0.325956
LBFGS:   17 14:30:08      -73.735457        0.385612
LBFGS:   18 14:30:08      -73.748883        0.406121
LBFGS:   19 14:30:09      -73.764926        0.342543
LBFGS:   20 14:30:09      -73.778700        0.295499
LBFGS:   21 14:30:09      -73.786688        0.198987
LBFGS:   22 14:30:09      -73.791164        0.206302
LBFGS:   23 14:30:09      -73.795637        0.172821
LBFGS:   24 14:30:09      -73.800348        0.151887
LBFGS:   25 14:30:10      -73.804514        0.161253
LBFGS:   26 14:30:10      -73.807316        0.168133
LBFGS:   27 14:30:10      -73.811388        0.171065
LBFGS:   28 14:30:10      -73.816693        0.163928
LBFGS:   29 14:30:10      -73.822618        0.172456
LBFGS:   30 14:30:11      -73.827520        0.165491
LBFGS:   31 14:30:11      -73.832298        0.166114
LBFGS:   32 14:30:11      -73.836870        0.235128
LBFGS:   33 14:30:11      -73.840173        0.273686
LBFGS:   34 14:30:11      -73.845364        0.167830
LBFGS:   35 14:30:11      -73.848792        0.134181
LBFGS:   36 14:30:12      -73.851981        0.232467
LBFGS:   37 14:30:12      -73.856400        0.198590
LBFGS:   38 14:30:12      -73.863311        0.310402
LBFGS:   39 14:30:12      -73.870934        0.210044
LBFGS:   40 14:30:12      -73.874591        0.383701
LBFGS:   41 14:30:12      -73.879686        0.167827
LBFGS:   42 14:30:13      -73.883564        0.148803
LBFGS:   43 14:30:13      -73.889836        0.347747
LBFGS:   44 14:30:13      -73.893750        0.217652
LBFGS:   45 14:30:13      -73.897174        0.124079
LBFGS:   46 14:30:13      -73.900613        0.290783
LBFGS:   47 14:30:14      -73.903635        0.144156
LBFGS:   48 14:30:14      -73.908172        0.149590
LBFGS:   49 14:30:14      -73.913325        0.141136
LBFGS:   50 14:30:14      -73.916564        0.195442
LBFGS:   51 14:30:14      -73.921801        0.339487
LBFGS:   52 14:30:14      -73.929054        0.388791
LBFGS:   53 14:30:15      -73.936489        0.343151
LBFGS:   54 14:30:15      -73.942297        0.213389
LBFGS:   55 14:30:15      -73.946415        0.406877
LBFGS:   56 14:30:15      -73.941826        0.956343
LBFGS:   57 14:30:15      -73.953157        0.484563
LBFGS:   58 14:30:16      -73.958003        0.143625
LBFGS:   59 14:30:16      -73.961625        0.140891
LBFGS:   60 14:30:16      -73.963749        0.916458
LBFGS:   61 14:30:16      -73.971495        0.467273
LBFGS:   62 14:30:16      -73.976820        0.142323
LBFGS:   63 14:30:16      -73.980921        0.344159
LBFGS:   64 14:30:17      -73.984855        0.285725
LBFGS:   65 14:30:17      -73.991281        0.156891
LBFGS:   66 14:30:17      -73.992750        0.132084
LBFGS:   67 14:30:17      -73.994371        0.112886
LBFGS:   68 14:30:17      -73.996460        0.158670
LBFGS:   69 14:30:17      -73.998556        0.175966
LBFGS:   70 14:30:18      -74.001821        0.135574
LBFGS:   71 14:30:18      -74.005816        0.151122
LBFGS:   72 14:30:18      -74.008853        0.179225
LBFGS:   73 14:30:18      -74.011311        0.153627
LBFGS:   74 14:30:18      -74.012836        0.112600
LBFGS:   75 14:30:19      -74.014010        0.135949
LBFGS:   76 14:30:19      -74.015207        0.136904
LBFGS:   77 14:30:19      -74.016179        0.140220
LBFGS:   78 14:30:19      -74.017397        0.069750
                   Step     Time         fmax
NEBOptimizer[ode]:    0 14:30:23       5.3762
NEBOptimizer[ode]:    1 14:30:25       4.1302
NEBOptimizer[ode]:    2 14:30:27       3.7265
NEBOptimizer[ode]:    3 14:30:29       3.0873
NEBOptimizer[ode]:    4 14:30:31       2.6653
NEBOptimizer[ode]:    5 14:30:33       2.3850
NEBOptimizer[ode]:    6 14:30:35       2.2150
NEBOptimizer[ode]:    7 14:30:37       2.0172
NEBOptimizer[ode]:    8 14:30:39       1.9237
NEBOptimizer[ode]:    9 14:30:41       1.4709
NEBOptimizer[ode]:   10 14:30:42       1.0858
NEBOptimizer[ode]:   11 14:30:44       1.5471
NEBOptimizer[ode]:   12 14:30:46       1.4571
NEBOptimizer[ode]:   13 14:30:48       0.5922
NEBOptimizer[ode]:   14 14:30:50       0.5751
NEBOptimizer[ode]:   15 14:30:52       0.5426
NEBOptimizer[ode]:   16 14:30:54       0.4981
NEBOptimizer[ode]:   17 14:30:56       0.8017
NEBOptimizer[ode]:   18 14:31:00       0.4496
NEBOptimizer[ode]:   19 14:31:02       0.4568
NEBOptimizer[ode]:   20 14:31:03       0.4591
NEBOptimizer[ode]:   21 14:31:05       0.4587
NEBOptimizer[ode]:   22 14:31:07       0.4708
NEBOptimizer[ode]:   23 14:31:11       0.4437
NEBOptimizer[ode]:   24 14:31:13       0.4358
NEBOptimizer[ode]:   25 14:31:15       0.4284
NEBOptimizer[ode]:   26 14:31:17       0.4134
NEBOptimizer[ode]:   27 14:31:21       0.4078
NEBOptimizer[ode]:   28 14:31:23       0.4041
NEBOptimizer[ode]:   29 14:31:25       0.3926
NEBOptimizer[ode]:   30 14:31:26       0.3648
NEBOptimizer[ode]:   31 14:31:30       0.3347
NEBOptimizer[ode]:   32 14:31:32       0.3391
NEBOptimizer[ode]:   33 14:31:34       0.3364
NEBOptimizer[ode]:   34 14:31:36       0.3336
NEBOptimizer[ode]:   35 14:31:38       0.3233
NEBOptimizer[ode]:   36 14:31:40       0.5437
NEBOptimizer[ode]:   37 14:31:44       0.2764
NEBOptimizer[ode]:   38 14:31:46       0.2741
NEBOptimizer[ode]:   39 14:31:48       0.2717
NEBOptimizer[ode]:   40 14:31:49       0.2633
NEBOptimizer[ode]:   41 14:31:51       0.2340
NEBOptimizer[ode]:   42 14:31:55       0.2243
NEBOptimizer[ode]:   43 14:31:57       0.2250
NEBOptimizer[ode]:   44 14:31:59       0.2240
NEBOptimizer[ode]:   45 14:32:01       0.2229
NEBOptimizer[ode]:   46 14:32:03       0.2185
NEBOptimizer[ode]:   47 14:32:05       0.2102
NEBOptimizer[ode]:   48 14:32:08       0.2119
NEBOptimizer[ode]:   49 14:32:10       0.2121
NEBOptimizer[ode]:   50 14:32:12       0.2124
NEBOptimizer[ode]:   51 14:32:14       0.2128
NEBOptimizer[ode]:   52 14:32:16       0.2142
NEBOptimizer[ode]:   53 14:32:18       0.2196
NEBOptimizer[ode]:   54 14:32:22       0.2224
NEBOptimizer[ode]:   55 14:32:24       0.2229
NEBOptimizer[ode]:   56 14:32:26       0.2233
NEBOptimizer[ode]:   57 14:32:27       0.2236
NEBOptimizer[ode]:   58 14:32:29       0.2252
NEBOptimizer[ode]:   59 14:32:31       0.2316
NEBOptimizer[ode]:   60 14:32:33       0.2423
NEBOptimizer[ode]:   61 14:32:35       0.2827
NEBOptimizer[ode]:   62 14:32:37       0.2444
NEBOptimizer[ode]:   63 14:32:39       0.2452
NEBOptimizer[ode]:   64 14:32:41       0.2455
NEBOptimizer[ode]:   65 14:32:43       0.2468
NEBOptimizer[ode]:   66 14:32:44       0.2523
NEBOptimizer[ode]:   67 14:32:46       0.2805
NEBOptimizer[ode]:   68 14:32:50       0.2958
NEBOptimizer[ode]:   69 14:32:52       0.2985
NEBOptimizer[ode]:   70 14:32:54       0.3003
NEBOptimizer[ode]:   71 14:32:56       0.3018
NEBOptimizer[ode]:   72 14:32:58       0.3076
NEBOptimizer[ode]:   73 14:32:59       0.3323
NEBOptimizer[ode]:   74 14:33:03       0.3404
NEBOptimizer[ode]:   75 14:33:05       0.3422
NEBOptimizer[ode]:   76 14:33:07       0.3440
NEBOptimizer[ode]:   77 14:33:09       0.3511
NEBOptimizer[ode]:   78 14:33:11       0.3721
NEBOptimizer[ode]:   79 14:33:15       0.3758
NEBOptimizer[ode]:   80 14:33:16       0.3766
NEBOptimizer[ode]:   81 14:33:18       0.3775
NEBOptimizer[ode]:   82 14:33:20       0.3798
NEBOptimizer[ode]:   83 14:33:22       0.3627
NEBOptimizer[ode]:   84 14:33:26       0.3568
NEBOptimizer[ode]:   85 14:33:28       0.3543
NEBOptimizer[ode]:   86 14:33:30       0.3513
NEBOptimizer[ode]:   87 14:33:32       0.3429
[15]:
display(SVG("janus_results/ethanol_reactants_2water-neb-plot.svg"))
../../_images/tutorials_cli_neb_26_0.svg
[16]:
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
[16]:

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.