Using OCP to enumerate adsorbates on alloy catalyst surfaces#

In the previous example, we constructed slab models of adsorbates on desired sites. Here we leverage code to automate this process. The goal in this section is to generate candidate structures, compute energetics, and then filter out the most relevant ones.

from ocpmodels.common.relaxation.ase_utils import OCPCalculator
import ase.io
from ase.optimize import BFGS
import sys
from scipy.stats import linregress
import pickle
import matplotlib.pyplot as plt
import time

from ocdata.core import Adsorbate, AdsorbateSlabConfig, Bulk, Slab
import os
from glob import glob
import pandas as pd
from ocdata.utils import DetectTrajAnomaly
%run ../ocp-tutorial.ipynb

checkpoint = get_checkpoint('GemNet-OC-Large All+MD')
checkpoint
'gemnet_oc_large_s2ef_all_md.pt'

Introduction#

We will reproduce Fig 6b from the following paper: Zhou, Jing, et al. “Enhanced Catalytic Activity of Bimetallic Ordered Catalysts for Nitrogen Reduction Reaction by Perturbation of Scaling Relations.” ACS Catalysis 134 (2023): 2190-2201 (https://doi.org/10.1021/acscatal.2c05877).

The gist of this figure is a correlation between H* and NNH* adsorbates across many different alloy surfaces. Then, they identify a dividing line between these that separates surfaces known for HER and those known for NRR.

To do this, we will enumerate adsorbate-slab configurations and run ML relaxations on them to find the lowest energy configuration. We will assess parity between the model predicted values and those reported in the paper. Finally we will make the figure and assess separability of the NRR favored and HER favored domains.

Enumerate the adsorbate-slab configurations to run relaxations on#

Be sure to set the path in ocdata/configs/paths.py to point to the correct place or pass the paths as an argument. The database pickles can be found in ocdata/databases/pkls. We will show one explicitly here as an example and then run all of them in an automated fashion for brevity.

import ocdata
from pathlib import Path
db = Path(ocdata.__file__).parent / Path('databases/pkls/adsorbates.pkl')
db
PosixPath('/home/jovyan/shared-scratch/jkitchin/ocdata/ocdata/databases/pkls/adsorbates.pkl')

Work out a single example#

We load one bulk id, create a bulk reference structure from it, then generate the surfaces we want to compute.

bulk_src_id = "oqmd-343039"
adsorbate_smiles_nnh = "*N*NH"
adsorbate_smiles_h = "*H"

bulk = Bulk(bulk_src_id_from_db = bulk_src_id, bulk_db_path="NRR_example_bulks.pkl")
adsorbate_H = Adsorbate(adsorbate_smiles_from_db = adsorbate_smiles_h, adsorbate_db_path=db)
adsorbate_NNH = Adsorbate(adsorbate_smiles_from_db = adsorbate_smiles_nnh, adsorbate_db_path=db)
slab = Slab.from_bulk_get_specific_millers(bulk= bulk, specific_millers = (1, 1, 1))
slab
[Slab: (Ag36Pd12, (1, 1, 1), 0.16666666666666669, True)]

We now need to generate potential placements. We use two kinds of guesses, a heuristic and a random approach. This cell generates 13 potential adsorption geometries.

# Perform heuristic placements
heuristic_adslabs = AdsorbateSlabConfig(slab[0], adsorbate_H, mode="heuristic")

# Perform random placements
# (for AdsorbML we use `num_sites = 100` but we will use 4 for brevity here)
random_adslabs = AdsorbateSlabConfig(slab[0], adsorbate_H, mode="random_site_heuristic_placement", num_sites=4)

adslabs = [*heuristic_adslabs.atoms_list, *random_adslabs.atoms_list]
len(adslabs)
13

Let’s see what we are looking at. It is a little tricky to see the tiny H atom in these figures, but with some inspection you can see there are ontop, bridge, and hollow sites in different places. This is not an exhaustive search; you can increase the number of random placements to check more possibilities. The main idea here is to increase the probability you find the most relevant sites.

import matplotlib.pyplot as plt
from ase.visualize.plot import plot_atoms

fig, axs = plt.subplots(4, 4)

for i, slab in enumerate(adslabs):
    plot_atoms(slab, axs[i % 4, i // 4]);
    axs[i % 4, i // 4].set_axis_off()
    
for i in range(16):
    axs[i % 4, i // 4].set_axis_off()

plt.tight_layout()   
../_images/c75c04bb2eb862c6c49b6a1b784cb23a071455298d66d8492ec83e613ebd9fc7.png

Run an ML relaxation#

We will use an ASE compatible calculator to run these.

Running the model with BFGS prints at each relaxation step which is a lot to print. So we will just run one to demonstrate what happens on each iteration.

os.makedirs(f"data/{bulk_src_id}_{adsorbate_smiles_h}", exist_ok=True)

# Define the calculator
calc = OCPCalculator(checkpoint=checkpoint, cpu=False)   # if you have a GPU
# calc = OCPCalculator(checkpoint=checkpoint_path, cpu=True)  # If you have CPU only
WARNING:root:Unrecognized arguments: ['symmetric_edge_symmetrization']
amp: true
cmd:
  checkpoint_dir: /home/jovyan/shared-scratch/jkitchin/tutorial/ocp-tutorial/NRR/checkpoints/2023-07-20-20-13-52
  commit: f79a6f7
  identifier: ''
  logs_dir: /home/jovyan/shared-scratch/jkitchin/tutorial/ocp-tutorial/NRR/logs/tensorboard/2023-07-20-20-13-52
  print_every: 100
  results_dir: /home/jovyan/shared-scratch/jkitchin/tutorial/ocp-tutorial/NRR/results/2023-07-20-20-13-52
  seed: null
  timestamp_id: 2023-07-20-20-13-52
dataset: null
gpus: 1
logger: tensorboard
model: gemnet_oc
model_attributes:
  activation: silu
  atom_edge_interaction: true
  atom_interaction: true
  cbf:
    name: spherical_harmonics
  cutoff: 12.0
  cutoff_aeaint: 12.0
  cutoff_aint: 12.0
  cutoff_qint: 12.0
  direct_forces: true
  edge_atom_interaction: true
  emb_size_aint_in: 64
  emb_size_aint_out: 64
  emb_size_atom: 256
  emb_size_cbf: 16
  emb_size_edge: 1024
  emb_size_quad_in: 64
  emb_size_quad_out: 32
  emb_size_rbf: 32
  emb_size_sbf: 64
  emb_size_trip_in: 64
  emb_size_trip_out: 128
  envelope:
    exponent: 5
    name: polynomial
  extensive: true
  forces_coupled: false
  max_neighbors: 30
  max_neighbors_aeaint: 20
  max_neighbors_aint: 1000
  max_neighbors_qint: 8
  num_after_skip: 2
  num_atom: 3
  num_atom_emb_layers: 2
  num_before_skip: 2
  num_blocks: 6
  num_concat: 4
  num_global_out_layers: 2
  num_output_afteratom: 3
  num_radial: 128
  num_spherical: 7
  otf_graph: true
  output_init: HeOrthogonal
  qint_tags:
  - 1
  - 2
  quad_interaction: true
  rbf:
    name: gaussian
  regress_forces: true
  sbf:
    name: legendre_outer
  symmetric_edge_symmetrization: false
noddp: false
optim:
  batch_size: 4
  clip_grad_norm: 10
  ema_decay: 0.999
  energy_coefficient: 1
  eval_batch_size: 4
  eval_every: 5000
  factor: 0.8
  force_coefficient: 100
  load_balancing: atoms
  loss_energy: mae
  loss_force: l2mae
  lr_initial: 0.0002
  max_epochs: 80
  mode: min
  num_workers: 2
  optimizer: AdamW
  optimizer_params:
    amsgrad: true
  patience: 3
  scheduler: ReduceLROnPlateau
  weight_decay: 0
slurm:
  additional_parameters:
    constraint: volta32gb
  cpus_per_task: 3
  folder: /private/home/anuroops/workspace/ocp_internal/gemnet/ocp/logs/47397573
  gpus_per_node: 8
  job_id: '47397573'
  job_name: gemnet_base_allmd_8x8x4_nb6_ed1024_qin64_tout128_rbf32_sbf64_ncat4_lr2e-4
  mem: 480GB
  nodes: 8
  ntasks_per_node: 8
  partition: ocp,learnfair
  time: 4320
task:
  dataset: trajectory_lmdb
  description: Regressing to energies and forces for DFT trajectories from OCP
  eval_on_free_atoms: true
  grad_input: atomic forces
  labels:
  - potential energy
  metric: mae
  primary_metric: forces_mae
  train_on_free_atoms: true
  type: regression
trainer: forces

Now we setup and run the relaxation.

t0 = time.time()
os.makedirs(f"data/{bulk_src_id}_H", exist_ok=True)
adslab = adslabs[0]
adslab.calc = calc
opt = BFGS(adslab, trajectory=f"data/{bulk_src_id}_H/test.traj")
opt.run(fmax=0.05, steps=100)

print(f'Elapsed time {time.time() - t0:1.1f} seconds')
      Step     Time          Energy         fmax
BFGS:    0 20:14:47        0.185308        0.7326
BFGS:    1 20:14:47        0.150291        0.6961
BFGS:    2 20:14:47        0.025938        0.4521
BFGS:    3 20:14:48        0.014360        0.2323
BFGS:    4 20:14:48        0.010407        0.1982
BFGS:    5 20:14:48       -0.003240        0.1370
BFGS:    6 20:14:48       -0.003685        0.1263
BFGS:    7 20:14:48       -0.009171        0.0845
BFGS:    8 20:14:48       -0.010415        0.0890
BFGS:    9 20:14:48       -0.008571        0.0840
BFGS:   10 20:14:48       -0.008951        0.0721
BFGS:   11 20:14:48       -0.013824        0.0486
Elapsed time 1.3 seconds

With a GPU this runs pretty quickly. It is much slower on a CPU.

Run all the systems#

In principle you can run all the systems now. It takes about an hour though, and we leave that for a later exercise if you want. For now we will run the first two, and for later analysis we provide a results file of all the runs. Let’s read in our reference file and take a look at what is in it.

with open("NRR_example_bulks.pkl", "rb") as f:
    bulks = pickle.load(f)
    
bulks
[{'atoms': Atoms(symbols='CuPd3', pbc=True, cell=[3.91276645, 3.91276645, 3.91276645], calculator=SinglePointDFTCalculator(...)),
  'src_id': 'oqmd-349719'},
 {'atoms': Atoms(symbols='Pd3Ag', pbc=True, cell=[4.02885979, 4.02885979, 4.02885979], calculator=SinglePointDFTCalculator(...)),
  'src_id': 'oqmd-345911'},
 {'atoms': Atoms(symbols='ScPd3', pbc=True, cell=[4.04684963, 4.04684963, 4.04684963], initial_charges=..., initial_magmoms=..., momenta=..., tags=..., calculator=SinglePointCalculator(...)),
  'src_id': 'mp-2677'},
 {'atoms': Atoms(symbols='Mo3Pd', pbc=True, cell=[3.96898192, 3.96898192, 3.96898192], initial_charges=..., initial_magmoms=..., momenta=..., tags=..., calculator=SinglePointCalculator(...)),
  'src_id': 'mp-1186014'},
 {'atoms': Atoms(symbols='Ag3Pd', pbc=True, cell=[4.14093081, 4.14093081, 4.14093081], calculator=SinglePointCalculator(...)),
  'src_id': 'oqmd-343039'},
 {'src_id': 'oqmd-348629',
  'atoms': Atoms(symbols='Ag3Cu', pbc=True, cell=[4.09439099, 4.09439099, 4.09439099], calculator=SinglePointDFTCalculator(...))},
 {'src_id': 'oqmd-343006',
  'atoms': Atoms(symbols='Ag3Mo', pbc=True, cell=[4.1665424, 4.1665424, 4.1665424], calculator=SinglePointDFTCalculator(...))},
 {'src_id': 'oqmd-349813',
  'atoms': Atoms(symbols='AgCu3', pbc=True, cell=[3.82618693, 3.82618693, 3.82618693], calculator=SinglePointDFTCalculator(...))},
 {'src_id': 'oqmd-347528',
  'atoms': Atoms(symbols='Cu3Ru', pbc=True, cell=[3.72399424, 3.72399424, 3.72399424], calculator=SinglePointDFTCalculator(...))},
 {'src_id': 'oqmd-344251',
  'atoms': Atoms(symbols='PdTa3', pbc=True, cell=[4.13568646, 4.13568646, 4.13568646], calculator=SinglePointDFTCalculator(...))},
 {'src_id': 'oqmd-343394',
  'atoms': Atoms(symbols='AgMo3', pbc=True, cell=[4.00594441, 4.00594441, 4.00594441], calculator=SinglePointDFTCalculator(...))},
 {'src_id': 'oqmd-344635',
  'atoms': Atoms(symbols='Mo3Ru', pbc=True, cell=[3.95617571, 3.95617571, 3.95617571], calculator=SinglePointDFTCalculator(...))},
 {'src_id': 'oqmd-344237',
  'atoms': Atoms(symbols='MoPd3', pbc=True, cell=[3.96059535, 3.96059535, 3.96059535], calculator=SinglePointDFTCalculator(...))},
 {'src_id': 'oqmd-346818',
  'atoms': Atoms(symbols='Pd3Ru', pbc=True, cell=[3.93112559, 3.93112559, 3.93112559], calculator=SinglePointDFTCalculator(...))},
 {'src_id': 'oqmd-349496',
  'atoms': Atoms(symbols='Pd3Ta', pbc=True, cell=[3.9907085, 3.9907085, 3.9907085], calculator=SinglePointDFTCalculator(...))},
 {'src_id': 'oqmd-343615',
  'atoms': Atoms(symbols='MoRu3', pbc=True, cell=[3.85915122, 3.85915122, 3.85915122], calculator=SinglePointDFTCalculator(...))},
 {'src_id': 'oqmd-348366',
  'atoms': Atoms(symbols='AgTa3', pbc=True, cell=[4.1730103, 4.1730103, 4.1730103], calculator=SinglePointDFTCalculator(...))},
 {'src_id': 'oqmd-345352',
  'atoms': Atoms(symbols='AuHf3', pbc=True, cell=[4.36653536, 4.36653536, 4.36653536], calculator=SinglePointDFTCalculator(...))},
 {'src_id': 'oqmd-346653',
  'atoms': Atoms(symbols='AgHf3', pbc=True, cell=[4.39618436, 4.39618436, 4.39618436], calculator=SinglePointDFTCalculator(...))}]

We have 19 bulk materials we will consider. Next we extract the src-id for each one.

bulk_ids = [row['src_id'] for row in bulks]

In theory you would run all of these, but it takes about an hour with a GPU. We provide the relaxation logs and trajectories in the repo for the next step.

These steps are embarrassingly parallel, and can be launched that way to speed things up. The only thing you need to watch is that you don’t exceed the available RAM, which will cause the Jupyter kernel to crash.

The goal here is to relax each candidate adsorption geometry and save the results in a trajectory file we will analyze later. Each trajectory file will have the geometry and final energy of the relaxed structure.

It is somewhat time consuming to run this, so in this cell we only run one example.

import time
from tqdm import tqdm
tinit = time.time()

for bulk_src_id in tqdm(bulk_ids[1:2]): 
    # Enumerate slabs and establish adsorbates
    bulk = Bulk(bulk_src_id_from_db=bulk_src_id, bulk_db_path="NRR_example_bulks.pkl")
    slab = Slab.from_bulk_get_specific_millers(bulk= bulk, specific_millers=(1, 1, 1))

    # Perform heuristic placements
    heuristic_adslabs_H = AdsorbateSlabConfig(slab[0], adsorbate_H, mode="heuristic")
    heuristic_adslabs_NNH = AdsorbateSlabConfig(slab[0], adsorbate_NNH, mode="heuristic")

    #Run relaxations
    os.makedirs(f"data/{bulk_src_id}_H", exist_ok=True)
    os.makedirs(f"data/{bulk_src_id}_NNH", exist_ok=True)

    print(f'{len(heuristic_adslabs_H.atoms_list)} H slabs to compute for {bulk_src_id}')
    print(f'{len(heuristic_adslabs_NNH.atoms_list)} NNH slabs to compute for {bulk_src_id}')

    # Set up the calculator
    for idx, adslab in enumerate(heuristic_adslabs_H.atoms_list):
        t0 = time.time()
        adslab.calc = calc
        print(f'Running data/{bulk_src_id}_H/{idx}')
        opt = BFGS(adslab, trajectory=f"data/{bulk_src_id}_H/{idx}.traj", logfile=f"data/{bulk_src_id}_H/{idx}.log")
        opt.run(fmax=0.05, steps=20)
        print(f'  Elapsed time: {time.time() - t0:1.1f} seconds for data/{bulk_src_id}_H/{idx}')
        
    for idx, adslab in enumerate(heuristic_adslabs_NNH.atoms_list):
        t0 = time.time()
        adslab.calc = calc
        print(f'Running data/{bulk_src_id}_NNH/{idx}')
        opt = BFGS(adslab, trajectory=f"data/{bulk_src_id}_NNH/{idx}.traj", logfile=f"data/{bulk_src_id}_NNH/{idx}.log")
        opt.run(fmax=0.05, steps=50)
        print(f'  Elapsed time: {time.time() - t0:1.1f} seconds for data/{bulk_src_id}_NNH/{idx}')

print(f'Elapsed time: {time.time() - tinit:1.1f} seconds')
  0%|          | 0/1 [00:00<?, ?it/s]
9 H slabs to compute for oqmd-345911
9 NNH slabs to compute for oqmd-345911
Running data/oqmd-345911_H/0
  Elapsed time: 0.9 seconds for data/oqmd-345911_H/0
Running data/oqmd-345911_H/1
  Elapsed time: 1.6 seconds for data/oqmd-345911_H/1
Running data/oqmd-345911_H/2
  Elapsed time: 2.3 seconds for data/oqmd-345911_H/2
Running data/oqmd-345911_H/3
  Elapsed time: 1.3 seconds for data/oqmd-345911_H/3
Running data/oqmd-345911_H/4
  Elapsed time: 0.8 seconds for data/oqmd-345911_H/4
Running data/oqmd-345911_H/5
  Elapsed time: 1.8 seconds for data/oqmd-345911_H/5
Running data/oqmd-345911_H/6
  Elapsed time: 0.6 seconds for data/oqmd-345911_H/6
Running data/oqmd-345911_H/7
  Elapsed time: 1.3 seconds for data/oqmd-345911_H/7
Running data/oqmd-345911_H/8
  Elapsed time: 2.3 seconds for data/oqmd-345911_H/8
Running data/oqmd-345911_NNH/0
  Elapsed time: 5.7 seconds for data/oqmd-345911_NNH/0
Running data/oqmd-345911_NNH/1
  Elapsed time: 5.7 seconds for data/oqmd-345911_NNH/1
Running data/oqmd-345911_NNH/2
  Elapsed time: 5.7 seconds for data/oqmd-345911_NNH/2
Running data/oqmd-345911_NNH/3
  Elapsed time: 5.7 seconds for data/oqmd-345911_NNH/3
Running data/oqmd-345911_NNH/4
  Elapsed time: 4.7 seconds for data/oqmd-345911_NNH/4
Running data/oqmd-345911_NNH/5
  Elapsed time: 5.7 seconds for data/oqmd-345911_NNH/5
Running data/oqmd-345911_NNH/6
  Elapsed time: 5.7 seconds for data/oqmd-345911_NNH/6
Running data/oqmd-345911_NNH/7
  Elapsed time: 5.7 seconds for data/oqmd-345911_NNH/7
Running data/oqmd-345911_NNH/8
100%|██████████| 1/1 [01:04<00:00, 64.03s/it]
  Elapsed time: 5.7 seconds for data/oqmd-345911_NNH/8
Elapsed time: 64.0 seconds

This cell runs all the examples. I don’t recommend you run this during the workshop. Instead, we have saved the results for the subsequent analyses so you can skip this one.

import time
from tqdm import tqdm
tinit = time.time()

for bulk_src_id in tqdm(bulk_ids): 
    # Enumerate slabs and establish adsorbates
    bulk = Bulk(bulk_src_id_from_db=bulk_src_id, bulk_db_path="NRR_example_bulks.pkl")
    slab = Slab.from_bulk_get_specific_millers(bulk= bulk, specific_millers=(1, 1, 1))

    # Perform heuristic placements
    heuristic_adslabs_H = AdsorbateSlabConfig(slab[0], adsorbate_H, mode="heuristic")
    heuristic_adslabs_NNH = AdsorbateSlabConfig(slab[0], adsorbate_NNH, mode="heuristic")

    #Run relaxations
    os.makedirs(f"data/{bulk_src_id}_H", exist_ok=True)
    os.makedirs(f"data/{bulk_src_id}_NNH", exist_ok=True)

    print(f'{len(heuristic_adslabs_H.atoms_list)} H slabs to compute for {bulk_src_id}')
    print(f'{len(heuristic_adslabs_NNH.atoms_list)} NNH slabs to compute for {bulk_src_id}')

    # Set up the calculator
    for idx, adslab in enumerate(heuristic_adslabs_H.atoms_list):
        t0 = time.time()
        adslab.calc = calc
        print(f'Running data/{bulk_src_id}_H/{idx}')
        opt = BFGS(adslab, trajectory=f"data/{bulk_src_id}_H/{idx}.traj", logfile=f"data/{bulk_src_id}_H/{idx}.log")
        opt.run(fmax=0.05, steps=20)
        print(f'  Elapsed time: {time.time() - t0:1.1f} seconds for data/{bulk_src_id}_H/{idx}')
        
    for idx, adslab in enumerate(heuristic_adslabs_NNH.atoms_list):
        t0 = time.time()
        adslab.calc = calc
        print(f'Running data/{bulk_src_id}_NNH/{idx}')
        opt = BFGS(adslab, trajectory=f"data/{bulk_src_id}_NNH/{idx}.traj", logfile=f"data/{bulk_src_id}_NNH/{idx}.log")
        opt.run(fmax=0.05, steps=50)
        print(f'  Elapsed time: {time.time() - t0:1.1f} seconds for data/{bulk_src_id}_NNH/{idx}')

print(f'Elapsed time: {time.time() - tinit:1.1f} seconds')
Hide code cell output
  0%|          | 0/19 [00:00<?, ?it/s]
9 H slabs to compute for oqmd-349719
9 NNH slabs to compute for oqmd-349719
Running data/oqmd-349719_H/0
  Elapsed time: 0.6 seconds for data/oqmd-349719_H/0
Running data/oqmd-349719_H/1
  Elapsed time: 1.1 seconds for data/oqmd-349719_H/1
Running data/oqmd-349719_H/2
  Elapsed time: 0.9 seconds for data/oqmd-349719_H/2
Running data/oqmd-349719_H/3
  Elapsed time: 0.8 seconds for data/oqmd-349719_H/3
Running data/oqmd-349719_H/4
  Elapsed time: 1.7 seconds for data/oqmd-349719_H/4
Running data/oqmd-349719_H/5
  Elapsed time: 2.3 seconds for data/oqmd-349719_H/5
Running data/oqmd-349719_H/6
  Elapsed time: 1.3 seconds for data/oqmd-349719_H/6
Running data/oqmd-349719_H/7
  Elapsed time: 0.6 seconds for data/oqmd-349719_H/7
Running data/oqmd-349719_H/8
  Elapsed time: 1.0 seconds for data/oqmd-349719_H/8
Running data/oqmd-349719_NNH/0
  Elapsed time: 5.7 seconds for data/oqmd-349719_NNH/0
Running data/oqmd-349719_NNH/1
  Elapsed time: 5.7 seconds for data/oqmd-349719_NNH/1
Running data/oqmd-349719_NNH/2
  Elapsed time: 5.4 seconds for data/oqmd-349719_NNH/2
Running data/oqmd-349719_NNH/3
  Elapsed time: 5.7 seconds for data/oqmd-349719_NNH/3
Running data/oqmd-349719_NNH/4
  Elapsed time: 5.7 seconds for data/oqmd-349719_NNH/4
Running data/oqmd-349719_NNH/5
  Elapsed time: 5.7 seconds for data/oqmd-349719_NNH/5
Running data/oqmd-349719_NNH/6
  Elapsed time: 5.7 seconds for data/oqmd-349719_NNH/6
Running data/oqmd-349719_NNH/7
  Elapsed time: 5.7 seconds for data/oqmd-349719_NNH/7
Running data/oqmd-349719_NNH/8
  5%|▌         | 1/19 [01:02<18:41, 62.30s/it]
  Elapsed time: 5.7 seconds for data/oqmd-349719_NNH/8
9 H slabs to compute for oqmd-345911
9 NNH slabs to compute for oqmd-345911
Running data/oqmd-345911_H/0
  Elapsed time: 0.9 seconds for data/oqmd-345911_H/0
Running data/oqmd-345911_H/1
  Elapsed time: 1.3 seconds for data/oqmd-345911_H/1
Running data/oqmd-345911_H/2
  Elapsed time: 1.3 seconds for data/oqmd-345911_H/2
Running data/oqmd-345911_H/3
  Elapsed time: 0.8 seconds for data/oqmd-345911_H/3
Running data/oqmd-345911_H/4
  Elapsed time: 0.6 seconds for data/oqmd-345911_H/4
Running data/oqmd-345911_H/5
  Elapsed time: 1.8 seconds for data/oqmd-345911_H/5
Running data/oqmd-345911_H/6
  Elapsed time: 1.7 seconds for data/oqmd-345911_H/6
Running data/oqmd-345911_H/7
  Elapsed time: 2.3 seconds for data/oqmd-345911_H/7
Running data/oqmd-345911_H/8
  Elapsed time: 2.3 seconds for data/oqmd-345911_H/8
Running data/oqmd-345911_NNH/0
  Elapsed time: 5.7 seconds for data/oqmd-345911_NNH/0
Running data/oqmd-345911_NNH/1
  Elapsed time: 5.7 seconds for data/oqmd-345911_NNH/1
Running data/oqmd-345911_NNH/2
  Elapsed time: 5.7 seconds for data/oqmd-345911_NNH/2
Running data/oqmd-345911_NNH/3
  Elapsed time: 5.7 seconds for data/oqmd-345911_NNH/3
Running data/oqmd-345911_NNH/4
  Elapsed time: 5.7 seconds for data/oqmd-345911_NNH/4
Running data/oqmd-345911_NNH/5
  Elapsed time: 5.7 seconds for data/oqmd-345911_NNH/5
Running data/oqmd-345911_NNH/6
  Elapsed time: 5.7 seconds for data/oqmd-345911_NNH/6
Running data/oqmd-345911_NNH/7
  Elapsed time: 5.7 seconds for data/oqmd-345911_NNH/7
Running data/oqmd-345911_NNH/8
 11%|█         | 2/19 [02:07<18:08, 64.01s/it]
  Elapsed time: 5.7 seconds for data/oqmd-345911_NNH/8
9 H slabs to compute for mp-2677
9 NNH slabs to compute for mp-2677
Running data/mp-2677_H/0
  Elapsed time: 1.6 seconds for data/mp-2677_H/0
Running data/mp-2677_H/1
  Elapsed time: 1.7 seconds for data/mp-2677_H/1
Running data/mp-2677_H/2
  Elapsed time: 0.4 seconds for data/mp-2677_H/2
Running data/mp-2677_H/3
  Elapsed time: 1.1 seconds for data/mp-2677_H/3
Running data/mp-2677_H/4
  Elapsed time: 1.7 seconds for data/mp-2677_H/4
Running data/mp-2677_H/5
  Elapsed time: 0.4 seconds for data/mp-2677_H/5
Running data/mp-2677_H/6
  Elapsed time: 1.2 seconds for data/mp-2677_H/6
Running data/mp-2677_H/7
  Elapsed time: 1.2 seconds for data/mp-2677_H/7
Running data/mp-2677_H/8
  Elapsed time: 0.9 seconds for data/mp-2677_H/8
Running data/mp-2677_NNH/0
  Elapsed time: 4.1 seconds for data/mp-2677_NNH/0
Running data/mp-2677_NNH/1
  Elapsed time: 4.3 seconds for data/mp-2677_NNH/1
Running data/mp-2677_NNH/2
  Elapsed time: 4.2 seconds for data/mp-2677_NNH/2
Running data/mp-2677_NNH/3
  Elapsed time: 4.2 seconds for data/mp-2677_NNH/3
Running data/mp-2677_NNH/4
  Elapsed time: 4.2 seconds for data/mp-2677_NNH/4
Running data/mp-2677_NNH/5
  Elapsed time: 3.6 seconds for data/mp-2677_NNH/5
Running data/mp-2677_NNH/6
  Elapsed time: 4.2 seconds for data/mp-2677_NNH/6
Running data/mp-2677_NNH/7
  Elapsed time: 4.2 seconds for data/mp-2677_NNH/7
Running data/mp-2677_NNH/8
 16%|█▌        | 3/19 [02:55<15:09, 56.82s/it]
  Elapsed time: 4.2 seconds for data/mp-2677_NNH/8
9 H slabs to compute for mp-1186014
9 NNH slabs to compute for mp-1186014
Running data/mp-1186014_H/0
  Elapsed time: 1.1 seconds for data/mp-1186014_H/0
Running data/mp-1186014_H/1
  Elapsed time: 1.3 seconds for data/mp-1186014_H/1
Running data/mp-1186014_H/2
  Elapsed time: 2.3 seconds for data/mp-1186014_H/2
Running data/mp-1186014_H/3
  Elapsed time: 2.3 seconds for data/mp-1186014_H/3
Running data/mp-1186014_H/4
  Elapsed time: 1.1 seconds for data/mp-1186014_H/4
Running data/mp-1186014_H/5
  Elapsed time: 2.3 seconds for data/mp-1186014_H/5
Running data/mp-1186014_H/6
  Elapsed time: 0.8 seconds for data/mp-1186014_H/6
Running data/mp-1186014_H/7
  Elapsed time: 0.9 seconds for data/mp-1186014_H/7
Running data/mp-1186014_H/8
  Elapsed time: 2.3 seconds for data/mp-1186014_H/8
Running data/mp-1186014_NNH/0
  Elapsed time: 5.7 seconds for data/mp-1186014_NNH/0
Running data/mp-1186014_NNH/1
  Elapsed time: 5.7 seconds for data/mp-1186014_NNH/1
Running data/mp-1186014_NNH/2
  Elapsed time: 5.3 seconds for data/mp-1186014_NNH/2
Running data/mp-1186014_NNH/3
  Elapsed time: 5.7 seconds for data/mp-1186014_NNH/3
Running data/mp-1186014_NNH/4
  Elapsed time: 3.6 seconds for data/mp-1186014_NNH/4
Running data/mp-1186014_NNH/5
  Elapsed time: 5.7 seconds for data/mp-1186014_NNH/5
Running data/mp-1186014_NNH/6
  Elapsed time: 5.7 seconds for data/mp-1186014_NNH/6
Running data/mp-1186014_NNH/7
  Elapsed time: 4.1 seconds for data/mp-1186014_NNH/7
Running data/mp-1186014_NNH/8
 21%|██        | 4/19 [03:58<14:46, 59.12s/it]
  Elapsed time: 5.7 seconds for data/mp-1186014_NNH/8
9 H slabs to compute for oqmd-343039
9 NNH slabs to compute for oqmd-343039
Running data/oqmd-343039_H/0
  Elapsed time: 1.2 seconds for data/oqmd-343039_H/0
Running data/oqmd-343039_H/1
  Elapsed time: 1.2 seconds for data/oqmd-343039_H/1
Running data/oqmd-343039_H/2
  Elapsed time: 1.7 seconds for data/oqmd-343039_H/2
Running data/oqmd-343039_H/3
  Elapsed time: 1.1 seconds for data/oqmd-343039_H/3
Running data/oqmd-343039_H/4
  Elapsed time: 1.0 seconds for data/oqmd-343039_H/4
Running data/oqmd-343039_H/5
  Elapsed time: 1.7 seconds for data/oqmd-343039_H/5
Running data/oqmd-343039_H/6
  Elapsed time: 1.1 seconds for data/oqmd-343039_H/6
Running data/oqmd-343039_H/7
  Elapsed time: 1.0 seconds for data/oqmd-343039_H/7
Running data/oqmd-343039_H/8
  Elapsed time: 0.5 seconds for data/oqmd-343039_H/8
Running data/oqmd-343039_NNH/0
  Elapsed time: 4.2 seconds for data/oqmd-343039_NNH/0
Running data/oqmd-343039_NNH/1
  Elapsed time: 4.2 seconds for data/oqmd-343039_NNH/1
Running data/oqmd-343039_NNH/2
  Elapsed time: 4.2 seconds for data/oqmd-343039_NNH/2
Running data/oqmd-343039_NNH/3
  Elapsed time: 4.2 seconds for data/oqmd-343006_NNH/2
Running data/oqmd-343006_NNH/3
  Elapsed time: 4.2 seconds for data/oqmd-343006_NNH/3
Running data/oqmd-343006_NNH/4
  Elapsed time: 4.0 seconds for data/oqmd-343006_NNH/4
Running data/oqmd-343006_NNH/5
  Elapsed time: 4.2 seconds for data/oqmd-343006_NNH/5
Running data/oqmd-343006_NNH/6
  Elapsed time: 4.2 seconds for data/oqmd-343006_NNH/6
Running data/oqmd-343006_NNH/7
  Elapsed time: 4.2 seconds for data/oqmd-343006_NNH/7
Running data/oqmd-343006_NNH/8
 37%|███▋      | 7/19 [06:21<10:11, 50.97s/it]
  Elapsed time: 4.0 seconds for data/oqmd-343006_NNH/8
9 H slabs to compute for oqmd-349813
9 NNH slabs to compute for oqmd-349813
Running data/oqmd-349813_H/0
  Elapsed time: 1.2 seconds for data/oqmd-349813_H/0
Running data/oqmd-349813_H/1
  Elapsed time: 1.7 seconds for data/oqmd-349813_H/1
Running data/oqmd-349813_H/2
  Elapsed time: 0.9 seconds for data/oqmd-349813_H/2
Running data/oqmd-349813_H/3
  Elapsed time: 1.0 seconds for data/oqmd-349813_H/3
Running data/oqmd-349813_H/4
  Elapsed time: 1.0 seconds for data/oqmd-349813_H/4
Running data/oqmd-349813_H/5
  Elapsed time: 1.5 seconds for data/oqmd-349813_H/5
Running data/oqmd-349813_H/6
  Elapsed time: 1.7 seconds for data/oqmd-349813_H/6
Running data/oqmd-349813_H/7
  Elapsed time: 1.2 seconds for data/oqmd-349813_H/7
Running data/oqmd-349813_H/8
  Elapsed time: 0.8 seconds for data/oqmd-349813_H/8
Running data/oqmd-349813_NNH/0
  Elapsed time: 5.8 seconds for data/oqmd-349813_NNH/0
Running data/oqmd-349813_NNH/1
  Elapsed time: 5.7 seconds for data/oqmd-349813_NNH/1
Running data/oqmd-349813_NNH/2
  Elapsed time: 5.8 seconds for data/oqmd-349813_NNH/2
Running data/oqmd-349813_NNH/3
  Elapsed time: 5.8 seconds for data/oqmd-349813_NNH/3
Running data/oqmd-349813_NNH/4
  Elapsed time: 5.2 seconds for data/oqmd-349813_NNH/4
Running data/oqmd-349813_NNH/5
  Elapsed time: 5.8 seconds for data/oqmd-349813_NNH/5
Running data/oqmd-349813_NNH/6
  Elapsed time: 3.5 seconds for data/oqmd-349813_NNH/6
Running data/oqmd-349813_NNH/7
  Elapsed time: 5.8 seconds for data/oqmd-349813_NNH/7
Running data/oqmd-349813_NNH/8
 42%|████▏     | 8/19 [07:22<09:55, 54.11s/it]
  Elapsed time: 5.8 seconds for data/oqmd-349813_NNH/8
9 H slabs to compute for oqmd-347528
9 NNH slabs to compute for oqmd-347528
Running data/oqmd-347528_H/0
  Elapsed time: 1.0 seconds for data/oqmd-347528_H/0
Running data/oqmd-347528_H/1
  Elapsed time: 1.1 seconds for data/oqmd-347528_H/1
Running data/oqmd-347528_H/2
  Elapsed time: 2.3 seconds for data/oqmd-347528_H/2
Running data/oqmd-347528_H/3
  Elapsed time: 1.6 seconds for data/oqmd-347528_H/3
Running data/oqmd-347528_H/4
  Elapsed time: 2.3 seconds for data/oqmd-347528_H/4
Running data/oqmd-347528_H/5
  Elapsed time: 0.5 seconds for data/oqmd-347528_H/5
Running data/oqmd-347528_H/6
  Elapsed time: 2.3 seconds for data/oqmd-347528_H/6
Running data/oqmd-347528_H/7
  Elapsed time: 0.7 seconds for data/oqmd-347528_H/7
Running data/oqmd-347528_H/8
  Elapsed time: 2.3 seconds for data/oqmd-347528_H/8
Running data/oqmd-347528_NNH/0
  Elapsed time: 5.8 seconds for data/oqmd-347528_NNH/0
Running data/oqmd-347528_NNH/1
  Elapsed time: 5.8 seconds for data/oqmd-347528_NNH/1
Running data/oqmd-347528_NNH/2
  Elapsed time: 5.8 seconds for data/oqmd-347528_NNH/2
Running data/oqmd-347528_NNH/3
  Elapsed time: 5.8 seconds for data/oqmd-347528_NNH/3
Running data/oqmd-347528_NNH/4
  Elapsed time: 5.7 seconds for data/oqmd-347528_NNH/4
Running data/oqmd-347528_NNH/5
  Elapsed time: 4.9 seconds for data/oqmd-347528_NNH/5
Running data/oqmd-347528_NNH/6
  Elapsed time: 5.7 seconds for data/oqmd-347528_NNH/6
Running data/oqmd-347528_NNH/7
  Elapsed time: 5.8 seconds for data/oqmd-347528_NNH/7
Running data/oqmd-347528_NNH/8
 47%|████▋     | 9/19 [08:24<09:28, 56.81s/it]
  Elapsed time: 2.6 seconds for data/oqmd-347528_NNH/8
9 H slabs to compute for oqmd-344251
9 NNH slabs to compute for oqmd-344251
Running data/oqmd-344251_H/0
  Elapsed time: 0.7 seconds for data/oqmd-344251_H/0
Running data/oqmd-344251_H/1
  Elapsed time: 0.7 seconds for data/oqmd-344251_H/1
Running data/oqmd-344251_H/2
  Elapsed time: 0.7 seconds for data/oqmd-344251_H/2
Running data/oqmd-344251_H/3
  Elapsed time: 0.7 seconds for data/oqmd-344251_H/3
Running data/oqmd-344251_H/4
  Elapsed time: 0.7 seconds for data/oqmd-344251_H/4
Running data/oqmd-344251_H/5
  Elapsed time: 0.6 seconds for data/oqmd-344251_H/5
Running data/oqmd-344251_H/6
  Elapsed time: 1.7 seconds for data/oqmd-344251_H/6
Running data/oqmd-344251_H/7
  Elapsed time: 1.7 seconds for data/oqmd-344251_H/7
Running data/oqmd-344251_H/8
  Elapsed time: 1.7 seconds for data/oqmd-344251_H/8
Running data/oqmd-344251_NNH/0
  Elapsed time: 4.2 seconds for data/oqmd-344251_NNH/0
Running data/oqmd-344251_NNH/1
  Elapsed time: 4.2 seconds for data/oqmd-344251_NNH/1
Running data/oqmd-344251_NNH/2
  Elapsed time: 3.6 seconds for data/oqmd-344251_NNH/2
Running data/oqmd-344251_NNH/3
  Elapsed time: 4.2 seconds for data/oqmd-344251_NNH/3
Running data/oqmd-344251_NNH/4
  Elapsed time: 3.5 seconds for data/oqmd-344251_NNH/4
Running data/oqmd-344251_NNH/5
  Elapsed time: 4.2 seconds for data/oqmd-344251_NNH/5
Running data/oqmd-344251_NNH/6
  Elapsed time: 4.2 seconds for data/oqmd-344251_NNH/6
Running data/oqmd-344251_NNH/7
  Elapsed time: 4.2 seconds for data/oqmd-344251_NNH/7
Running data/oqmd-344251_NNH/8
 53%|█████▎    | 10/19 [09:10<07:59, 53.24s/it]
  Elapsed time: 3.0 seconds for data/oqmd-344251_NNH/8
9 H slabs to compute for oqmd-343394
9 NNH slabs to compute for oqmd-343394
Running data/oqmd-343394_H/0
  Elapsed time: 1.1 seconds for data/oqmd-343394_H/0
Running data/oqmd-343394_H/1
  Elapsed time: 2.3 seconds for data/oqmd-343394_H/1
Running data/oqmd-343394_H/2
  Elapsed time: 1.7 seconds for data/oqmd-343394_H/2
Running data/oqmd-343394_H/3
  Elapsed time: 2.3 seconds for data/oqmd-343394_H/3
Running data/oqmd-343394_H/4
  Elapsed time: 1.2 seconds for data/oqmd-343394_H/4
Running data/oqmd-343394_H/5
  Elapsed time: 2.3 seconds for data/oqmd-343394_H/5
Running data/oqmd-343394_H/6
  Elapsed time: 2.3 seconds for data/oqmd-343394_H/6
Running data/oqmd-343394_H/7
  Elapsed time: 2.3 seconds for data/oqmd-343394_H/7
Running data/oqmd-343394_H/8
  Elapsed time: 2.3 seconds for data/oqmd-343394_H/8
Running data/oqmd-343394_NNH/0
  Elapsed time: 5.7 seconds for data/oqmd-343394_NNH/0
Running data/oqmd-343394_NNH/1
  Elapsed time: 5.7 seconds for data/oqmd-343394_NNH/1
Running data/oqmd-343394_NNH/2
  Elapsed time: 5.7 seconds for data/oqmd-343394_NNH/2
Running data/oqmd-343394_NNH/3
  Elapsed time: 5.7 seconds for data/oqmd-343394_NNH/3
Running data/oqmd-343394_NNH/4
  Elapsed time: 5.7 seconds for data/oqmd-343394_NNH/4
Running data/oqmd-343394_NNH/5
  Elapsed time: 4.1 seconds for data/oqmd-343394_NNH/5
Running data/oqmd-343394_NNH/6
  Elapsed time: 5.7 seconds for data/oqmd-343394_NNH/6
Running data/oqmd-343394_NNH/7
  Elapsed time: 5.7 seconds for data/oqmd-343394_NNH/7
Running data/oqmd-343394_NNH/8
 58%|█████▊    | 11/19 [10:18<07:43, 57.92s/it]
  Elapsed time: 5.7 seconds for data/oqmd-343394_NNH/8
9 H slabs to compute for oqmd-344635
9 NNH slabs to compute for oqmd-344635
Running data/oqmd-344635_H/0
  Elapsed time: 1.4 seconds for data/oqmd-344635_H/0
Running data/oqmd-344635_H/1
  Elapsed time: 0.9 seconds for data/oqmd-344635_H/1
Running data/oqmd-344635_H/2
  Elapsed time: 2.3 seconds for data/oqmd-344635_H/2
Running data/oqmd-344635_H/3
  Elapsed time: 1.1 seconds for data/oqmd-344635_H/3
Running data/oqmd-344635_H/4
  Elapsed time: 2.3 seconds for data/oqmd-344635_H/4
Running data/oqmd-344635_H/5
  Elapsed time: 2.3 seconds for data/oqmd-344635_H/5
Running data/oqmd-344635_H/6
  Elapsed time: 2.3 seconds for data/oqmd-344635_H/6
Running data/oqmd-344635_H/7
  Elapsed time: 1.1 seconds for data/oqmd-344635_H/7
Running data/oqmd-344635_H/8
  Elapsed time: 0.7 seconds for data/oqmd-344635_H/8
Running data/oqmd-344635_NNH/0
  Elapsed time: 5.7 seconds for data/oqmd-344635_NNH/0
Running data/oqmd-344635_NNH/1
  Elapsed time: 4.6 seconds for data/oqmd-344635_NNH/1
Running data/oqmd-344635_NNH/2
  Elapsed time: 5.7 seconds for data/oqmd-344635_NNH/2
Running data/oqmd-344635_NNH/3
  Elapsed time: 5.7 seconds for data/oqmd-344635_NNH/3
Running data/oqmd-344635_NNH/4
  Elapsed time: 4.6 seconds for data/oqmd-344635_NNH/4
Running data/oqmd-344635_NNH/5
  Elapsed time: 5.6 seconds for data/oqmd-344635_NNH/5
Running data/oqmd-344635_NNH/6
  Elapsed time: 5.7 seconds for data/oqmd-344635_NNH/6
Running data/oqmd-344635_NNH/7
  Elapsed time: 3.5 seconds for data/oqmd-344635_NNH/7
Running data/oqmd-344635_NNH/8
 63%|██████▎   | 12/19 [11:20<06:54, 59.22s/it]
  Elapsed time: 5.7 seconds for data/oqmd-344635_NNH/8
9 H slabs to compute for oqmd-344237
9 NNH slabs to compute for oqmd-344237
Running data/oqmd-344237_H/0
  Elapsed time: 2.3 seconds for data/oqmd-344237_H/0
Running data/oqmd-344237_H/1
  Elapsed time: 2.3 seconds for data/oqmd-344237_H/1
Running data/oqmd-344237_H/2
  Elapsed time: 1.0 seconds for data/oqmd-344237_H/2
Running data/oqmd-344237_H/3
  Elapsed time: 1.4 seconds for data/oqmd-344237_H/3
Running data/oqmd-344237_H/4
  Elapsed time: 2.3 seconds for data/oqmd-344237_H/4
Running data/oqmd-344237_H/5
  Elapsed time: 1.0 seconds for data/oqmd-344237_H/5
Running data/oqmd-344237_H/6
  Elapsed time: 1.2 seconds for data/oqmd-344237_H/6
Running data/oqmd-344237_H/7
  Elapsed time: 2.3 seconds for data/oqmd-344237_H/7
Running data/oqmd-344237_H/8
  Elapsed time: 1.8 seconds for data/oqmd-344237_H/8
Running data/oqmd-344237_NNH/0
  Elapsed time: 5.7 seconds for data/oqmd-344237_NNH/0
Running data/oqmd-344237_NNH/1
  Elapsed time: 5.7 seconds for data/oqmd-344237_NNH/1
Running data/oqmd-344237_NNH/2
  Elapsed time: 5.2 seconds for data/oqmd-344237_NNH/2
Running data/oqmd-344237_NNH/3
  Elapsed time: 5.0 seconds for data/oqmd-344237_NNH/3
Running data/oqmd-344237_NNH/4
  Elapsed time: 5.7 seconds for data/oqmd-344237_NNH/4
Running data/oqmd-344237_NNH/5
  Elapsed time: 5.7 seconds for data/oqmd-344237_NNH/5
Running data/oqmd-344237_NNH/6
  Elapsed time: 5.7 seconds for data/oqmd-344237_NNH/6
Running data/oqmd-344237_NNH/7
  Elapsed time: 5.3 seconds for data/oqmd-344237_NNH/7
Running data/oqmd-344237_NNH/8
 68%|██████▊   | 13/19 [12:26<06:06, 61.04s/it]
  Elapsed time: 4.6 seconds for data/oqmd-344237_NNH/8
9 H slabs to compute for oqmd-346818
9 NNH slabs to compute for oqmd-346818
Running data/oqmd-346818_H/0
  Elapsed time: 1.9 seconds for data/oqmd-346818_H/0
Running data/oqmd-346818_H/1
  Elapsed time: 1.1 seconds for data/oqmd-346818_H/1
Running data/oqmd-346818_H/2
  Elapsed time: 0.8 seconds for data/oqmd-346818_H/2
Running data/oqmd-346818_H/3
  Elapsed time: 1.1 seconds for data/oqmd-346818_H/3
Running data/oqmd-346818_H/4
  Elapsed time: 0.8 seconds for data/oqmd-346818_H/4
Running data/oqmd-346818_H/5
  Elapsed time: 1.0 seconds for data/oqmd-346818_H/5
Running data/oqmd-346818_H/6
  Elapsed time: 1.2 seconds for data/oqmd-346818_H/6
Running data/oqmd-346818_H/7
  Elapsed time: 2.3 seconds for data/oqmd-346818_H/7
Running data/oqmd-346818_H/8
  Elapsed time: 1.2 seconds for data/oqmd-346818_H/8
Running data/oqmd-346818_NNH/0
  Elapsed time: 5.7 seconds for data/oqmd-346818_NNH/0
Running data/oqmd-346818_NNH/1
  Elapsed time: 5.2 seconds for data/oqmd-346818_NNH/1
Running data/oqmd-346818_NNH/2
  Elapsed time: 5.7 seconds for data/oqmd-346818_NNH/2
Running data/oqmd-346818_NNH/3
  Elapsed time: 5.7 seconds for data/oqmd-346818_NNH/3
Running data/oqmd-346818_NNH/4
  Elapsed time: 4.5 seconds for data/oqmd-346818_NNH/4
Running data/oqmd-346818_NNH/5
  Elapsed time: 5.7 seconds for data/oqmd-346818_NNH/5
Running data/oqmd-346818_NNH/6
  Elapsed time: 4.3 seconds for data/oqmd-346818_NNH/6
Running data/oqmd-346818_NNH/7
  Elapsed time: 5.7 seconds for data/oqmd-346818_NNH/7
Running data/oqmd-346818_NNH/8
 74%|███████▎  | 14/19 [13:26<05:04, 60.86s/it]
  Elapsed time: 5.7 seconds for data/oqmd-346818_NNH/8
9 H slabs to compute for oqmd-349496
9 NNH slabs to compute for oqmd-349496
Running data/oqmd-349496_H/0
  Elapsed time: 2.3 seconds for data/oqmd-349496_H/0
Running data/oqmd-349496_H/1
  Elapsed time: 1.2 seconds for data/oqmd-349496_H/1
Running data/oqmd-349496_H/2
  Elapsed time: 1.3 seconds for data/oqmd-349496_H/2
Running data/oqmd-349496_H/3
  Elapsed time: 2.3 seconds for data/oqmd-349496_H/3
Running data/oqmd-349496_H/4
  Elapsed time: 2.3 seconds for data/oqmd-349496_H/4
Running data/oqmd-349496_H/5
  Elapsed time: 1.6 seconds for data/oqmd-349496_H/5
Running data/oqmd-349496_H/6
  Elapsed time: 1.7 seconds for data/oqmd-349496_H/6
Running data/oqmd-349496_H/7
  Elapsed time: 1.8 seconds for data/oqmd-349496_H/7
Running data/oqmd-349496_H/8
  Elapsed time: 0.9 seconds for data/oqmd-349496_H/8
Running data/oqmd-349496_NNH/0
  Elapsed time: 5.7 seconds for data/oqmd-349496_NNH/0
Running data/oqmd-349496_NNH/1
  Elapsed time: 4.9 seconds for data/oqmd-349496_NNH/1
Running data/oqmd-349496_NNH/2
  Elapsed time: 5.6 seconds for data/oqmd-349496_NNH/2
Running data/oqmd-349496_NNH/3
  Elapsed time: 5.7 seconds for data/oqmd-349496_NNH/3
Running data/oqmd-349496_NNH/4
  Elapsed time: 5.6 seconds for data/oqmd-349496_NNH/4
Running data/oqmd-349496_NNH/5
  Elapsed time: 5.7 seconds for data/oqmd-349496_NNH/5
Running data/oqmd-349496_NNH/6
  Elapsed time: 5.1 seconds for data/oqmd-349496_NNH/6
Running data/oqmd-349496_NNH/7
  Elapsed time: 5.8 seconds for data/oqmd-349496_NNH/7
Running data/oqmd-349496_NNH/8
 79%|███████▉  | 15/19 [14:32<04:09, 62.48s/it]
  Elapsed time: 5.5 seconds for data/oqmd-349496_NNH/8
9 H slabs to compute for oqmd-343615
9 NNH slabs to compute for oqmd-343615
Running data/oqmd-343615_H/0
  Elapsed time: 1.2 seconds for data/oqmd-343615_H/0
Running data/oqmd-343615_H/1
  Elapsed time: 2.3 seconds for data/oqmd-343615_H/1
Running data/oqmd-343615_H/2
  Elapsed time: 2.3 seconds for data/oqmd-343615_H/2
Running data/oqmd-343615_H/3
  Elapsed time: 1.2 seconds for data/oqmd-343615_H/3
Running data/oqmd-343615_H/4
  Elapsed time: 1.0 seconds for data/oqmd-343615_H/4
Running data/oqmd-343615_H/5
  Elapsed time: 1.2 seconds for data/oqmd-343615_H/5
Running data/oqmd-343615_H/6
  Elapsed time: 2.3 seconds for data/oqmd-343615_H/6
Running data/oqmd-343615_H/7
  Elapsed time: 1.3 seconds for data/oqmd-343615_H/7
Running data/oqmd-343615_H/8
  Elapsed time: 2.3 seconds for data/oqmd-343615_H/8
Running data/oqmd-343615_NNH/0
  Elapsed time: 5.7 seconds for data/oqmd-343615_NNH/0
Running data/oqmd-343615_NNH/1
  Elapsed time: 3.1 seconds for data/oqmd-343615_NNH/1
Running data/oqmd-343615_NNH/2
  Elapsed time: 5.7 seconds for data/oqmd-343615_NNH/2
Running data/oqmd-343615_NNH/3
  Elapsed time: 5.7 seconds for data/oqmd-343615_NNH/3
Running data/oqmd-343615_NNH/4
  Elapsed time: 5.7 seconds for data/oqmd-343615_NNH/4
Running data/oqmd-343615_NNH/5
  Elapsed time: 3.6 seconds for data/oqmd-343615_NNH/5
Running data/oqmd-343615_NNH/6
  Elapsed time: 5.7 seconds for data/oqmd-343615_NNH/6
Running data/oqmd-343615_NNH/7
  Elapsed time: 5.7 seconds for data/oqmd-343615_NNH/7
Running data/oqmd-343615_NNH/8
 84%|████████▍ | 16/19 [15:35<03:07, 62.65s/it]
  Elapsed time: 5.8 seconds for data/oqmd-343615_NNH/8
9 H slabs to compute for oqmd-348366
9 NNH slabs to compute for oqmd-348366
Running data/oqmd-348366_H/0
  Elapsed time: 1.7 seconds for data/oqmd-348366_H/0
Running data/oqmd-348366_H/1
  Elapsed time: 1.1 seconds for data/oqmd-348366_H/1
Running data/oqmd-348366_H/2
  Elapsed time: 1.7 seconds for data/oqmd-348366_H/2
Running data/oqmd-348366_H/3
  Elapsed time: 1.7 seconds for data/oqmd-348366_H/3
Running data/oqmd-348366_H/4
  Elapsed time: 1.7 seconds for data/oqmd-348366_H/4
Running data/oqmd-348366_H/5
  Elapsed time: 0.7 seconds for data/oqmd-348366_H/5
Running data/oqmd-348366_H/6
  Elapsed time: 1.1 seconds for data/oqmd-348366_H/6
Running data/oqmd-348366_H/7
  Elapsed time: 1.7 seconds for data/oqmd-348366_H/7
Running data/oqmd-348366_H/8
  Elapsed time: 0.7 seconds for data/oqmd-348366_H/8
Running data/oqmd-348366_NNH/0
  Elapsed time: 4.2 seconds for data/oqmd-348366_NNH/0
Running data/oqmd-348366_NNH/1
  Elapsed time: 3.8 seconds for data/oqmd-348366_NNH/1
Running data/oqmd-348366_NNH/2
  Elapsed time: 3.9 seconds for data/oqmd-348366_NNH/2
Running data/oqmd-348366_NNH/3
  Elapsed time: 4.2 seconds for data/oqmd-348366_NNH/3
Running data/oqmd-348366_NNH/4
  Elapsed time: 2.6 seconds for data/oqmd-348366_NNH/4
Running data/oqmd-348366_NNH/5
  Elapsed time: 4.2 seconds for data/oqmd-348366_NNH/5
Running data/oqmd-348366_NNH/6
  Elapsed time: 3.1 seconds for data/oqmd-348366_NNH/6
Running data/oqmd-348366_NNH/7
  Elapsed time: 4.2 seconds for data/oqmd-348366_NNH/7
Running data/oqmd-348366_NNH/8
 89%|████████▉ | 17/19 [16:23<01:56, 58.02s/it]
  Elapsed time: 4.2 seconds for data/oqmd-348366_NNH/8
9 H slabs to compute for oqmd-345352
9 NNH slabs to compute for oqmd-345352
Running data/oqmd-345352_H/0
  Elapsed time: 1.7 seconds for data/oqmd-345352_H/0
Running data/oqmd-345352_H/1
  Elapsed time: 1.7 seconds for data/oqmd-345352_H/1
Running data/oqmd-345352_H/2
  Elapsed time: 1.1 seconds for data/oqmd-345352_H/2
Running data/oqmd-345352_H/3
  Elapsed time: 1.7 seconds for data/oqmd-345352_H/3
Running data/oqmd-345352_H/4
  Elapsed time: 1.0 seconds for data/oqmd-345352_H/4
Running data/oqmd-345352_H/5
  Elapsed time: 1.7 seconds for data/oqmd-345352_H/5
Running data/oqmd-345352_H/6
  Elapsed time: 1.7 seconds for data/oqmd-345352_H/6
Running data/oqmd-345352_H/7
  Elapsed time: 1.7 seconds for data/oqmd-345352_H/7
Running data/oqmd-345352_H/8
  Elapsed time: 0.8 seconds for data/oqmd-345352_H/8
Running data/oqmd-345352_NNH/0
  Elapsed time: 4.2 seconds for data/oqmd-345352_NNH/0
Running data/oqmd-345352_NNH/1
  Elapsed time: 4.2 seconds for data/oqmd-345352_NNH/1
Running data/oqmd-345352_NNH/2
  Elapsed time: 4.2 seconds for data/oqmd-345352_NNH/2
Running data/oqmd-345352_NNH/3
  Elapsed time: 4.2 seconds for data/oqmd-345352_NNH/3
Running data/oqmd-345352_NNH/4
  Elapsed time: 4.2 seconds for data/oqmd-345352_NNH/4
Running data/oqmd-345352_NNH/5
  Elapsed time: 4.2 seconds for data/oqmd-345352_NNH/5
Running data/oqmd-345352_NNH/6
  Elapsed time: 4.2 seconds for data/oqmd-345352_NNH/6
Running data/oqmd-345352_NNH/7
  Elapsed time: 4.2 seconds for data/oqmd-345352_NNH/7
Running data/oqmd-345352_NNH/8
 95%|█████████▍| 18/19 [17:14<00:56, 56.08s/it]
  Elapsed time: 4.2 seconds for data/oqmd-345352_NNH/8
9 H slabs to compute for oqmd-346653
9 NNH slabs to compute for oqmd-346653
Running data/oqmd-346653_H/0
  Elapsed time: 0.6 seconds for data/oqmd-346653_H/0
Running data/oqmd-346653_H/1
  Elapsed time: 1.2 seconds for data/oqmd-346653_H/1
Running data/oqmd-346653_H/2
  Elapsed time: 1.7 seconds for data/oqmd-346653_H/2
Running data/oqmd-346653_H/3
  Elapsed time: 1.7 seconds for data/oqmd-346653_H/3
Running data/oqmd-346653_H/4
  Elapsed time: 1.7 seconds for data/oqmd-346653_H/4
Running data/oqmd-346653_H/5
  Elapsed time: 0.6 seconds for data/oqmd-346653_H/5
Running data/oqmd-346653_H/6
  Elapsed time: 1.7 seconds for data/oqmd-346653_H/6
Running data/oqmd-346653_H/7
  Elapsed time: 1.7 seconds for data/oqmd-346653_H/7
Running data/oqmd-346653_H/8
  Elapsed time: 1.7 seconds for data/oqmd-346653_H/8
Running data/oqmd-346653_NNH/0
  Elapsed time: 4.3 seconds for data/oqmd-346653_NNH/0
Running data/oqmd-346653_NNH/1
  Elapsed time: 4.1 seconds for data/oqmd-346653_NNH/1
Running data/oqmd-346653_NNH/2
  Elapsed time: 3.7 seconds for data/oqmd-346653_NNH/2
Running data/oqmd-346653_NNH/3
  Elapsed time: 2.9 seconds for data/oqmd-346653_NNH/3
Running data/oqmd-346653_NNH/4
  Elapsed time: 3.8 seconds for data/oqmd-346653_NNH/4
Running data/oqmd-346653_NNH/5
  Elapsed time: 3.1 seconds for data/oqmd-346653_NNH/5
Running data/oqmd-346653_NNH/6
  Elapsed time: 4.2 seconds for data/oqmd-346653_NNH/6
Running data/oqmd-346653_NNH/7
  Elapsed time: 3.0 seconds for data/oqmd-346653_NNH/7
Running data/oqmd-346653_NNH/8
100%|██████████| 19/19 [18:01<00:00, 56.91s/it]
  Elapsed time: 4.2 seconds for data/oqmd-346653_NNH/8
Elapsed time: 1081.2 seconds

Parse the trajectories and post-process#

As a post-processing step we check to see if:

  1. the adsorbate desorbed

  2. the adsorbate disassociated

  3. the adsorbate intercalated

  4. the surface has changed

We check these because they affect our referencing scheme and may result in energies that don’t mean what we think, e.g. they aren’t just adsorption, but include contributions from other things like desorption, dissociation or reconstruction. For (4), the relaxed surface should really be supplied as well. It will be necessary when correcting the SP / RX energies later. Since we don’t have it here, we will ommit supplying it, and the detector will instead compare the initial and final slab from the adsorbate-slab relaxation trajectory. If a relaxed slab is provided, the detector will compare it and the slab after the adsorbate-slab relaxation. The latter is more correct!

In this loop we find the most stable (most negative) adsorption energy for each adsorbate on each surface and save them in a DataFrame.

# Iterate over trajs to extract results
min_E = []
for file_outer in glob("data/*"):
    ads = file_outer.split("_")[1]
    bulk = file_outer.split("/")[1].split("_")[0]
    results = []
    for file in glob(f"{file_outer}/*.traj"):
        rx_id = file.split("/")[-1].split(".")[0]
        traj = ase.io.read(file, ":")

        # Check to see if the trajectory is anomolous
        detector = DetectTrajAnomaly(traj[0], traj[-1], traj[0].get_tags())
        anom = (
            detector.is_adsorbate_dissociated()
            or detector.is_adsorbate_desorbed()
            or detector.has_surface_changed()
            or detector.is_adsorbate_intercalated()
        )
        rx_energy = traj[-1].get_potential_energy()
        results.append({"relaxation_idx": rx_id, "relaxed_atoms": traj[-1],
                        "relaxed_energy_ml": rx_energy, "anomolous": anom})
    df = pd.DataFrame(results)

    df = df[~df.anomolous].copy().reset_index()
    min_e = min(df.relaxed_energy_ml.tolist())
    min_E.append({"adsorbate":ads, "bulk_id":bulk, "min_E_ml": min_e})

df = pd.DataFrame(min_E)
df_h = df[df.adsorbate == "H"]
df_nnh = df[df.adsorbate == "NNH"]
df_flat = df_h.merge(df_nnh, on = "bulk_id")

Make parity plots for values obtained by ML v. reported in the paper#

# Add literature data to the dataframe
with open("literature_data.pkl", "rb") as f:
    literature_data = pickle.load(f)
df_all = df_flat.merge(pd.DataFrame(literature_data), on = "bulk_id")
f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
f.set_figheight(15)
x = df_all.min_E_ml_x.tolist()
y = df_all.E_lit_H.tolist()
ax1.set_title("*H parity")
ax1.plot([-3.5, 2], [-3.5, 2], "k-", linewidth=3)
slope, intercept, r, p, se = linregress(x, y)
ax1.plot(
    [-3.5, 2],
    [
        -3.5 * slope + intercept,
        2 * slope + intercept,
    ],
    "k--",
    linewidth=2,
)

ax1.legend(
    [
        "y = x",
        f"y = {slope:1.2f} x + {intercept:1.2f}, R-sq = {r**2:1.2f}",
    ],
    loc="upper left",
)
ax1.scatter(x, y)
ax1.axis("square")
ax1.set_xlim([-3.5, 2])
ax1.set_ylim([-3.5, 2])
ax1.set_xlabel("dE predicted OCP [eV]")
ax1.set_ylabel("dE NRR paper [eV]");


x = df_all.min_E_ml_y.tolist()
y = df_all.E_lit_NNH.tolist()
ax2.set_title("*N*NH parity")
ax2.plot([-3.5, 2], [-3.5, 2], "k-", linewidth=3)
slope, intercept, r, p, se = linregress(x, y)
ax2.plot(
    [-3.5, 2],
    [
        -3.5 * slope + intercept,
        2 * slope + intercept,
    ],
    "k--",
    linewidth=2,
)

ax2.legend(
    [
        "y = x",
        f"y = {slope:1.2f} x + {intercept:1.2f}, R-sq = {r**2:1.2f}",
    ],
    loc="upper left",
)
ax2.scatter(x, y)
ax2.axis("square")
ax2.set_xlim([-3.5, 2])
ax2.set_ylim([-3.5, 2])
ax2.set_xlabel("dE predicted OCP [eV]")
ax2.set_ylabel("dE NRR paper [eV]");
f.set_figwidth(15)
f.set_figheight(7)
../_images/83e9c74aefa30f5fb52c4e0226bda5f9655b2301875b7ed44d7c35300ab3a7aa.png

Make figure 6b and compare to literature results#

f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
x = df_all[df_all.reaction == "HER"].min_E_ml_y.tolist()
y = df_all[df_all.reaction == "HER"].min_E_ml_x.tolist()
comp = df_all[df_all.reaction == "HER"].composition.tolist()

ax1.scatter(x, y,c= "r", label = "HER")
for i, txt in enumerate(comp):
    ax1.annotate(txt, (x[i], y[i]))

x = df_all[df_all.reaction == "NRR"].min_E_ml_y.tolist()
y = df_all[df_all.reaction == "NRR"].min_E_ml_x.tolist()
comp = df_all[df_all.reaction == "NRR"].composition.tolist()
ax1.scatter(x, y,c= "b", label = "NRR")
for i, txt in enumerate(comp):
    ax1.annotate(txt, (x[i], y[i]))


ax1.legend()
ax1.set_xlabel("dE *N*NH predicted OCP [eV]")
ax1.set_ylabel("dE *H predicted OCP [eV]")


x = df_all[df_all.reaction == "HER"].E_lit_NNH.tolist()
y = df_all[df_all.reaction == "HER"].E_lit_H.tolist()
comp = df_all[df_all.reaction == "HER"].composition.tolist()

ax2.scatter(x, y,c= "r", label = "HER")
for i, txt in enumerate(comp):
    ax2.annotate(txt, (x[i], y[i]))

x = df_all[df_all.reaction == "NRR"].E_lit_NNH.tolist()
y = df_all[df_all.reaction == "NRR"].E_lit_H.tolist()
comp = df_all[df_all.reaction == "NRR"].composition.tolist()
ax2.scatter(x, y,c= "b", label = "NRR")
for i, txt in enumerate(comp):
    ax2.annotate(txt, (x[i], y[i]))

ax2.legend()
ax2.set_xlabel("dE *N*NH literature [eV]")
ax2.set_ylabel("dE *H literature [eV]")
f.set_figwidth(15)
f.set_figheight(7)
../_images/ee5a63ed1b706e9478e5bbde0b68203627279ec06749469ba09009127c2d86bc.png

Next steps#

Next we consider fine-tuning.