Skip to content

Cobalt Nanoparticle on Silica Support

Estimated total CPU time: < 2 min when using 70 CPUs or more

Theoretical Background

Spin Polarization in Transition Metal Systems

Unlike our previous Si(100) example where we could use a non-spin-polarized approach, transition metals like cobalt exhibit strong magnetic behavior due to partially filled d-orbitals. To accurately model these systems, we must account for spin polarization by treating the spin-up (\(n_\uparrow\)) and spin-down (\(n_\downarrow\)) electron densities separately in our calculations.

The magnetic moment \(M\) of the system is given by the difference between the number of spin-up and spin-down electrons:

\[M = \int (n_\uparrow(\mathbf{r}) - n_\downarrow(\mathbf{r})) d\mathbf{r}\]

For cobalt-based systems, proper treatment of spin polarization is critical. While the non-magnetic silicon surface in our previous example did not require spin treatment, neglecting magnetism in cobalt systems would lead to qualitatively incorrect results for both geometric structure and adsorption energetics.

In FHI-aims, we can perform spin-polarized calculations using a collinear spin treatment, where the spins are aligned along a single axis. This is controlled by setting an initial magnetic moment for each atom, which is particularly crucial for cobalt to ensure proper convergence to the correct magnetic ground state.

For the calculations in this tutorial, we use the RPBE functional. This functional provides improved accuracy for adsorption energies on transition metal surfaces compared to standard PBE 3 and was used in the reference studies 1 2 that we are following.

Warning

In the following exercises, the "light" basis set settings are used throughout our calculations. The other settings are taken directly from the references that we are following 1 2. Although the qualitative trends already hold with the present settings, the basis set would have to be converged with much more care for real production calculations. As we will see later on, adsorption energies with "tight" basis settings reported in 1 2 agree well with the results reported here. For publication-quality results, we generally recommend 'tight' basis settings for these kinds of systems.

Note

If you have an interest in simulating complex metal oxides (or any other complex, charged, or spin-polarized sytem) with FHI-aims, we recommend to read through the tutorial here, which deals with Fe\(_2\)O\(_3\) (iron-oxide - based on the hematite crystal form). This will teach you strategies to achieve converged calculations for complex systems that rely on charge and spin initilization.

Adsorption Energy Calculation

The adsorption energy (\(E_{\text{ads}}\)) is a key descriptor for understanding catalyst-adsorbate interactions. It is defined as the energy difference between the combined system (adsorbate on catalyst) and the sum of the isolated components:

\[E_{\text{ads}} = E_{\text{adsorbate+catalyst}} - (E_{\text{catalyst}} + E_{\text{adsorbate}})\]

where \(E_{\text{adsorbate+catalyst}}\) is the total energy of the adsorbate on the catalyst, \(E_{\text{catalyst}}\) is the energy of the isolated catalyst, and \(E_{\text{adsorbate}}\) is the energy of the isolated adsorbate molecule. By this convention, a negative \(E_{\text{ads}}\) indicates an exothermic (energetically favorable) adsorption process. The more negative the adsorption energy, the stronger the binding.

In the case of CO\(_2\) adsorption on a Co\(_{20}\)/SiO\(_2\), we have the following:

\[E_{\text{ads}} = E(\text{CO}_2 + \text{Co}_{20}/\text{SiO}_2) - E(\text{Co}_{20}/\text{SiO}_2) - E(\text{CO}_2)\]

Where \(E(\text{CO}_2 + \text{Co}_{20}/\text{SiO}_2)\) is the total energy of the CO\(_2\) molecule adsorbed on the C0\(_{20}\)/SiO\(_2\) slab, \(E(\text{Co}_{20}/\text{SiO}_2)\) is the total energy of the clean C0\(_{20}\)/SiO\(_2\) surface, and \(E(\text{CO}_2)\) is the total energy of an isolated CO\(_2\) molecule.

However, in this case, the catalyst components exhibit magnetic properties that must be properly accounted for to obtain reliable results.

For CO\(_2\) adsorption on cobalt catalysts, the adsorption energy provides insight into the initial activation of the molecule, which is often the rate-determining step in CO\(_2\) conversion reactions. Strong adsorption may facilitate CO\(_2\) activation by weakening and elongating the C-O bonds, but excessively strong binding can lead to catalyst poisoning.

In the studies we're following 1 2, the CO\(_2\) adsorption energy was identified as an important descriptor that correlates with catalytic performance, particularly the selectivity toward different products like methanol or methane.

Manual creation of input files

All the input files that we will show in the following sections can be manually created and adjusted by the user. The usage of the clims package is only for convenience but not necessary.

Modeling a Single Cobalt Atom

Understanding the electronic structure and magnetic properties of a single cobalt atom provides the foundation for our multi-scale approach to cobalt catalysis. The isolated cobalt atom, with its electron configuration [Ar]3d\(^7\)4s\(^2\), exhibits distinct magnetic behavior that needs to be properly captured in our calculations.

Start by creating a new working folder in your terminal:

mkdir Co_silica_work
cd Co_silica_work

Before we calculate the different components to obtain the adsorption energies, we want to briefly explain how we can accurately model the cobalt cluster in FHI-aims.

Electronic Structure of Cobalt

We start by looking at the electronic configuration of a free cobalt atom:

Cobalt Electronic Configuration

A free cobalt atom has 9 valence electrons distributed across the 3d and 4s orbitals. According to Hund's rule, the electrons in the 3d orbitals align their spins to maximize the total spin angular momentum. This results in 3 unpaired electrons and a theoretical magnetic moment of +3 per atom.

Setting Up a Single Atom Calculation in FHI-aims

Converging free-atom simulations

Converging free-atom calculations is no simple feat and we have a dedicated tutorial for this here. Please read through it if you are interested in strategies on how to achieve convergence in those cases.

One advantage of FHI-aims is its ability to perform calculations on non-periodic systems directly in real space without requiring a periodic cell. This makes it well-suited for modeling isolated atoms and clusters, as well as periodic systems on equal footing.

Create a new folder for our single atom calculation with

mkdir Co_atom
cd Co_atom

For a single cobalt atom calculation, we create a geometry.in file with a Co atom:

atom 0.0 0.0 0.0 Co
initial_moment 3.0

Here, we set an initial spin moment of +3 (see the explanation above).

For our computational settings, we'll use the following control.in:

xc               rpbe
charge           0.0
spin             collinear
relativistic atomic_zora scalar

The key parameters here include:

  • xc rpbe: Using the RPBE functional for improved accuracy in adsorption energetics
  • spin collinear: Enabling spin-polarized calculations with collinear spin treatment

Warning

When calculating adsorption energies, or energy differences in general, it's important to do so using consistent computational settings, i.e., the same basis set settings, exchange-correlation functional, and k-grid (if modeling periodic systems). In this tutorial we will thus only use the RPBE functional and "light" basis settings for consistency.

Add the light species defaults by inputting this clims command:

clims-prepare-run --species=light

Submit the calculation to your compute system. During the webinar hands-on session, you may use the provided fhiaims_job.sh script:

cp ~/fhiaims_job.sh .
sbatch fhiaims_job.sh

Submission script on provided AWS resources

You can submit a job to the computing queue with:

sbatch fhiaims_job.sh

Make sure to submit the job from the folder where the FHI-aims input files are located.

The submission script looks like the following:

fhiaims_job.sh
#!/bin/bash -l
# Standard output and error:
#SBATCH -o ./slurm.stdout
#SBATCH -e ./slurm.stderr
# Initial working directory:
#SBATCH -D ./
# Job Name:
#SBATCH -J FHI-aims
# Number of nodes and MPI tasks per node:
#SBATCH --nodes=1
# HPC7g
#SBATCH --tasks-per-node=64
#
# Wall clock limit:
#SBATCH --time=00:15:00

ulimit -s unlimited

module purge
module load fhi-aims aims-tools

date
mpirun aims.x > aims.out

After finishing this calculation, we can inspect the output file aims.out in more detail. In the beginning, we can see the spin initialization, which should match the expected electronic configuration:

   List of occupied orbitals and eigenvalues:
     n    l      energy [Ha]    energy [eV]    occupation
   Spin-up
     1    0      -281.582965     -7662.2623     1.00000000
     2    0       -33.093880      -900.5303     1.00000000
     3    0        -3.807790      -103.6152     1.00000000
     4    0        -0.199895        -5.4394     1.00000000
     2    1       -28.323563      -770.7234     3.00000000
     3    1        -2.452683       -66.7409     3.00000000
     3    2        -0.336156        -9.1473     5.00000000
   Spin-down
     1    0      -281.583196     -7662.2686     1.00000000
     2    0       -33.037891      -899.0067     1.00000000
     3    0        -3.686177      -100.3060     1.00000000
     4    0        -0.179912        -4.8957     1.00000000
     2    1       -28.281718      -769.5847     3.00000000
     3    1        -2.333021       -63.4847     3.00000000
     3    2        -0.228713        -6.2236     2.00000000

We can extract the converged magnetic moment from the output file aims.out in the final self-consistent-cycle step to verify that our chemical intuition is appropriate, and we converged to the ground state:

   Current spin moment of the entire structure :
   | N = N_up - N_down :    3.00
   | S                 :    1.50
   | J                 :    4.00

In this case, we indeed converge to the appropriate spin state with a total spin moment of +3.

Modeling Cobalt Clusters

When cobalt atoms form clusters, their electronic and magnetic properties undergo substantial changes due to several quantum mechanical phenomena. Orbital hybridization occurs as the d-orbitals of adjacent cobalt atoms begin to overlap and interact, creating new combined electronic states with altered energy levels. This process is accompanied by electron delocalization, particularly the 4s electrons, creating a more metallic-like electron distribution throughout the cluster. These effects result in changes to the magnetic properties, notably reducing the magnetic moment per atom from approximately +3 for an isolated cobalt atom down to around +2 per atom in smaller clusters, approaching the bulk value of +1.7 per atom 5.

For our Co\(_{20}\) cluster model, we use the structure optimized by Farkaš and de Leeuw 4 as our starting point, which was subsequently reoptimized with FHI-aims (RPBE + light species defaults) by Miyazaki et al. in 1. This structure has been identified as a stable configuration for the Co\(_{20}\) cluster.

Practical Recommendation

One calculation - one directory.

We strongly recommend to create a new directory (with its own control.in and geometry.in files) for every new FHI-aims calculation. Rerunning and/or continuing FHI-aims calculations in the same directory that was used before will overwrite output and input files.

Create a new working folder for the cluster with:

cd ..
mkdir Co20_cluster
cd Co20_cluster

The geometry.in file for the relaxed Co\(_{20}\) cluster looks like the following:

atom 12.1633426699999969 15.1550794450000001 12.3410990649999999 Co
initial_moment  2.00
atom 11.2385140099999976 13.4051366150000000 11.0216271949999989 Co
initial_moment  2.00
atom 13.6719532099999981 13.5824434450000009 11.3842088149999991 Co
initial_moment  2.00
atom 10.4068971099999974 11.4253416449999996 10.0577690949999994 Co
initial_moment  2.00
atom 12.6970824399999973 11.6392623450000006 10.4897286950000002 Co
initial_moment  2.00
atom 15.0204173699999970 11.7616739750000008 10.7463090749999992 Co
initial_moment  2.00
atom 11.9047665599999970 14.0033479750000005 14.6334573450000001 Co
initial_moment  2.00
atom 10.7528315099999965 11.8884177449999999 14.5584822549999995 Co
initial_moment  2.00
atom 13.3209518999999972 12.0774066150000010 14.9417877249999993 Co
initial_moment  2.00
atom 9.9668595199999963 9.9449205549999995 13.6507811449999998 Co
initial_moment  2.00
atom 12.2768497999999973 10.1755601250000005 14.0318692849999991 Co
initial_moment  2.00
atom 14.6045294099999978 10.2844251650000000 14.3443841849999991 Co
initial_moment  2.00
atom 10.2809060299999970 13.9576365050000000 13.1161075049999987 Co
initial_moment  2.00
atom 13.8900079099999978 14.2212029150000010 13.6543330350000005 Co
initial_moment  2.00
atom 9.9195826299999972 11.8098550949999996 12.2622936050000000 Co
initial_moment  2.00
atom 12.3145226599999980 12.2266808749999996 12.7692361649999988 Co
initial_moment  2.00
atom 14.7877902399999979 12.1654135050000001 12.9885887849999992 Co
initial_moment  2.00
atom 11.4225603899999975 10.1093964750000005 11.7797781349999990 Co
initial_moment  2.00
atom 13.7474318199999974 10.2794481849999997 12.1270269249999991 Co
initial_moment  2.00
atom 11.7279753099999979 12.7337418050000011 16.4522309050000004 Co
initial_moment  2.00

We specify the initial moments individually (+2 per atom), based on a ferromagnetic configuration, which is the stable spin configuration for this Co cluster 4 and was also used in 1 2.

For the Co\(_{20}\) cluster, the control.in file is similar to the single atom case:

xc               rpbe
charge           0.0
spin             collinear
relativistic atomic_zora scalar
output  hirshfeld

We add the keyword output hirshfeld to perform a Hirshfeld analysis at the end of the S.C.F. cycle. This will be useful when analyzing charge transfer later on.

Add the light species defaults by inputting this clims command:

clims-prepare-run --species=light

Submit the calculation again to your compute system. During the webinar hands-on session, you may use the provided fhiaims_job.sh script:

cp ~/fhiaims_job.sh .
sbatch fhiaims_job.sh

Inspect the aims.out file to extract the magnetic moment in the final self-consistent-cycle step:

   Current spin moment of the entire structure :
   | N = N_up - N_down :   40.00
   | S                 :   20.00
   | J                 :   41.00

Once the S.C.F. cycle is completed, the Hirshfeld analysis can be found in aims.out, as shown for the first atom here:

 ------------------------------------------------------------
   Performing Hirshfeld analysis of fragment charges and moments.
   ----------------------------------------------------------------------
   | Atom     1: Co
   |   Hirshfeld charge        :      0.01980900
   |   Free atom volume        :     95.29304162
   |   Hirshfeld volume        :     86.51136731
   |   Hirshfeld spin moment   :      2.16095524
   |   Hirshfeld dipole vector :     -0.01160885       0.27044604      -0.05419864
   |   Hirshfeld dipole moment :      0.27606760
   |   Hirshfeld second moments:      0.13405466      -0.00481166       0.00643837
   |                                 -0.00481166       0.29830871      -0.04768267
   |                                  0.00643837      -0.04768267       0.11443993
...

We can see that the Hirshfeld spin moment of +2.16 is quite close to our chemical intuition.

Charge Analysis Methods

When analyzing atomic charges, several methods are available beyond the Hirshfeld approach used in this tutorial. These include Bader charge analysis, which uses topological properties of the electron density and is supported for FHI-aims via external programs, Mulliken and Löwdin population analyses based on orbital partitioning, Natural Population Analysis (NPA), and Charge Model 5 (CM5). Each method has different theoretical foundations and may yield varying results for the same system. Hirshfeld and Bader analyses are particularly common for extended systems like the supported catalysts studied here. For critical applications, comparing results across multiple charge partitioning schemes is recommended.

We could read this in manually from the output file, but GIMS also has the functionality to display Hirshfeld charges directly from its Output Analyzer when you upload the aims.out file:

Co20 cluster hirshfeld charges

The absolute values are typically not to be seen as perfectly reliable, but they are suitable to study charge transfer effects. We will look at the difference of the Hirshfeld charges for the Co\(_{20}\) cluster in the gas phase and adsorbed on the silica support later.

Provided analysis scripts

In the following, we will provide python scripts to do the data analysis. We do this to ensure that the tutorial can be completed by any user. Writing scripts (in whatever programming language) is something any user should try to do. There are many good python resources available online, such as the one provided by MolSSI on Python Scripting for Computational Molecular Science.

As an alternative, we can also read in the Hirshfeld charges manually. For this, you can use the following script:

Hirshfeld analysis script

This script does the following:

  1. Read in the FHI-aims output file aims.out from a specified folder and save the Hirshfeld charges/spins for the last 20 atoms. The output folder is the command line argument.
  2. Output the results in a markdown table, {folder_name}_hirshfeld_analysis.md, and as a json file, {folder_name}_hirshfeld_analysis.json.
analyze_hirshfeld.py
import json
import sys
import re
from pathlib import Path


def extract_hirshfeld_data(file_path):
    """
    Manually extract Hirshfeld charges and spin moments from an aims.out file.

    Args:
        file_path: Path to the aims.out file

    Returns:
        list: List of dictionaries with atom index, element, charge, and spin moment
    """
    results = []

    # Regular expression pattern to match the charge blocks
    # This pattern looks for blocks starting with "| Atom" and captures the atom number and element
    atom_pattern = re.compile(r"\|\s+Atom\s+(\d+):\s+([A-Za-z]+)")

    # Pattern to extract the Hirshfeld charge
    charge_pattern = re.compile(r"\|\s+Hirshfeld charge\s+:\s+(-?\d+\.\d+)")

    # Pattern to extract the Hirshfeld spin moment
    spin_pattern = re.compile(r"\|\s+Hirshfeld spin moment\s+:\s+(-?\d+\.\d+)")

    current_atom = None

    with open(file_path, "r") as file:
        for line in file:
            # Check if this line starts a new atom block
            atom_match = atom_pattern.search(line)
            if atom_match:
                current_atom = {
                    "index": int(atom_match.group(1)),
                    "element": atom_match.group(2),
                }

            # If we're in an atom block, look for the charge and spin lines
            elif current_atom is not None:
                charge_match = charge_pattern.search(line)
                if charge_match:
                    current_atom["charge"] = float(charge_match.group(1))

                spin_match = spin_pattern.search(line)
                if spin_match:
                    current_atom["spin"] = float(spin_match.group(1))

                # If we have both charge and spin, add to results
                if "charge" in current_atom and "spin" in current_atom:
                    results.append(current_atom)
                    current_atom = None  # Reset for the next atom

    return results


def analyze_cobalt_data(folder_path):
    """
    Analyze the Hirshfeld charges and spin moments of the last 20 atoms in the aims.out file.

    Args:
        folder_path: Path to the folder containing the aims.out file

    Returns:
        dict: Dictionary with analysis results
    """
    # Construct the path to the aims.out file
    aims_file = Path(folder_path) / "aims.out"

    # Check if the file exists
    if not aims_file.exists():
        print(f"Error: File {aims_file} does not exist.")
        sys.exit(1)

    try:
        # Extract all Hirshfeld data from the file
        all_atoms = extract_hirshfeld_data(aims_file)

        if not all_atoms:
            print("Error: No Hirshfeld data found in the output file.")
            sys.exit(1)

        # Get the last 20 atoms (or all if less than 20)
        last_atoms = all_atoms[-20:] if len(all_atoms) >= 20 else all_atoms

        # Extract just the charges and spins for calculations
        charges = [atom["charge"] for atom in last_atoms]
        spins = [atom["spin"] for atom in last_atoms]

        # Create result dictionary
        results = {
            "folder": folder_path,
            "cobalt_data": [
                {
                    "atom_index": atom["index"],
                    "element": atom["element"],
                    "charge": atom["charge"],
                    "spin": atom["spin"],
                }
                for atom in last_atoms
            ],
            "charge_statistics": {
                "average": float(sum(charges) / len(charges)),
                "min": float(min(charges)),
                "max": float(max(charges)),
            },
            "spin_statistics": {
                "average": float(sum(spins) / len(spins)),
                "min": float(min(spins)),
                "max": float(max(spins)),
            },
        }

        # Print summary to console
        print(f"Analysis completed for {folder_path}")
        print(f"Total atoms found: {len(all_atoms)}")
        print(f"Number of atoms analyzed: {len(last_atoms)}")
        print(
            f"Average charge of last {len(last_atoms)} atoms: {results['charge_statistics']['average']:.6f}"
        )
        print(
            f"Average spin moment of last {len(last_atoms)} atoms: {results['spin_statistics']['average']:.6f}"
        )

        return results

    except Exception as e:
        print(f"Error analyzing file: {e}")
        sys.exit(1)


def save_results_json(results):
    """
    Save analysis results to a JSON file.

    Args:
        results (dict): Dictionary with analysis results
    """
    folder_name = Path(results["folder"]).name
    output_file = f"{folder_name}_hirshfeld_analysis.json"

    with open(output_file, "w") as file:
        json.dump(results, file, indent=2)

    print(f"\nAnalysis data has been saved to '{output_file}'")


def create_markdown_report(results):
    """
    Create and save a markdown report of the analysis results.

    Args:
        results (dict): Dictionary with analysis results
    """
    folder_path = results["folder"]
    folder_name = Path(folder_path).name

    # Create the header
    markdown = f"# Atom Analysis for {folder_path}\n\n"

    # Add charges and spins section
    markdown += "## Hirshfeld Charges and Spin Moments\n\n"
    markdown += "| Atom Index | Element | Charge | Spin Moment |\n"
    markdown += "|------------|---------|--------|-------------|\n"

    for item in results["cobalt_data"]:
        markdown += f"| {item['atom_index']} | {item['element']} | {item['charge']:.6f} | {item['spin']:.6f} |\n"

    # Add charge statistics with extra line break for better rendering
    markdown += f"\n**Charge Statistics:**\n\n"
    markdown += f"- Average charge: {results['charge_statistics']['average']:.6f}\n"
    markdown += f"- Min charge: {results['charge_statistics']['min']:.6f}\n"
    markdown += f"- Max charge: {results['charge_statistics']['max']:.6f}\n"

    # Add spin statistics with extra line break for better rendering
    markdown += f"\n**Spin Moment Statistics:**\n\n"
    markdown += f"- Average spin moment: {results['spin_statistics']['average']:.6f}\n"
    markdown += f"- Min spin moment: {results['spin_statistics']['min']:.6f}\n"
    markdown += f"- Max spin moment: {results['spin_statistics']['max']:.6f}\n"

    # Save the markdown file with folder name included
    output_file = f"{folder_name}_hirshfeld_analysis.md"
    with open(output_file, "w") as file:
        file.write(markdown)

    print(f"Markdown report has been saved to '{output_file}'")


def main():
    # Check if a command line argument is provided
    if len(sys.argv) != 2:
        print("Usage: python analyze_charges.py <folder_path>")
        print("Example: python analyze_charges.py Co20-silica")
        sys.exit(1)

    folder_path = sys.argv[1]

    results = analyze_cobalt_data(folder_path)

    save_results_json(results)

    create_markdown_report(results)


if __name__ == "__main__":
    main()

First go back a folder level with:

cd ..

Copy in the script above and run the script with

python analyze_hirshfeld.py Co20_cluster

You should also see two new files in your working directory after the script is finished, namely Co20_cluster_hirshfeld_analysis.json and Co20_cluster_hirshfeld_analysis.md:

Reference files after running analyze_charges.py
# Atom Analysis for Co20_cluster

## Hirshfeld Charges and Spin Moments

| Atom Index | Element | Charge | Spin Moment |
|------------|---------|--------|-------------|
| 1 | Co | 0.019809 | 2.160955 |
| 2 | Co | -0.025578 | 1.922202 |
| 3 | Co | -0.025416 | 1.922412 |
| 4 | Co | 0.044926 | 2.171776 |
| 5 | Co | -0.034440 | 1.839762 |
| 6 | Co | 0.044876 | 2.171896 |
| 7 | Co | -0.060213 | 1.836097 |
| 8 | Co | -0.038640 | 1.820869 |
| 9 | Co | -0.038584 | 1.820900 |
| 10 | Co | 0.039639 | 2.166580 |
| 11 | Co | -0.018020 | 1.929086 |
| 12 | Co | 0.039631 | 2.166352 |
| 13 | Co | 0.026927 | 2.093399 |
| 14 | Co | 0.026809 | 2.093116 |
| 15 | Co | -0.037215 | 1.918621 |
| 16 | Co | 0.041595 | 1.981964 |
| 17 | Co | -0.037070 | 1.919301 |
| 18 | Co | -0.014239 | 1.967989 |
| 19 | Co | -0.014309 | 1.967741 |
| 20 | Co | 0.057167 | 2.128045 |

**Charge Statistics:**

- Average charge: -0.000117
- Min charge: -0.060213
- Max charge: 0.057167

**Spin Moment Statistics:**

- Average spin moment: 1.999953
- Min spin moment: 1.820869
- Max spin moment: 2.171896
{
  "folder": "Co20_cluster",
  "cobalt_data": [
    {
      "atom_index": 1,
      "element": "Co",
      "charge": 0.019809,
      "spin": 2.16095524
    },
    {
      "atom_index": 2,
      "element": "Co",
      "charge": -0.02557834,
      "spin": 1.92220219
    },
    {
      "atom_index": 3,
      "element": "Co",
      "charge": -0.02541574,
      "spin": 1.9224122
    },
    {
      "atom_index": 4,
      "element": "Co",
      "charge": 0.04492621,
      "spin": 2.17177627
    },
    {
      "atom_index": 5,
      "element": "Co",
      "charge": -0.03443963,
      "spin": 1.83976219
    },
    {
      "atom_index": 6,
      "element": "Co",
      "charge": 0.04487592,
      "spin": 2.17189602
    },
    {
      "atom_index": 7,
      "element": "Co",
      "charge": -0.06021344,
      "spin": 1.83609721
    },
    {
      "atom_index": 8,
      "element": "Co",
      "charge": -0.0386399,
      "spin": 1.82086927
    },
    {
      "atom_index": 9,
      "element": "Co",
      "charge": -0.03858364,
      "spin": 1.82090042
    },
    {
      "atom_index": 10,
      "element": "Co",
      "charge": 0.03963923,
      "spin": 2.16658015
    },
    {
      "atom_index": 11,
      "element": "Co",
      "charge": -0.01801952,
      "spin": 1.92908557
    },
    {
      "atom_index": 12,
      "element": "Co",
      "charge": 0.03963108,
      "spin": 2.16635215
    },
    {
      "atom_index": 13,
      "element": "Co",
      "charge": 0.02692718,
      "spin": 2.0933989
    },
    {
      "atom_index": 14,
      "element": "Co",
      "charge": 0.0268086,
      "spin": 2.09311638
    },
    {
      "atom_index": 15,
      "element": "Co",
      "charge": -0.03721539,
      "spin": 1.91862117
    },
    {
      "atom_index": 16,
      "element": "Co",
      "charge": 0.04159488,
      "spin": 1.98196429
    },
    {
      "atom_index": 17,
      "element": "Co",
      "charge": -0.03707007,
      "spin": 1.91930076
    },
    {
      "atom_index": 18,
      "element": "Co",
      "charge": -0.0142392,
      "spin": 1.96798933
    },
    {
      "atom_index": 19,
      "element": "Co",
      "charge": -0.01430855,
      "spin": 1.96774124
    },
    {
      "atom_index": 20,
      "element": "Co",
      "charge": 0.05716719,
      "spin": 2.12804523
    }
  ],
  "charge_statistics": {
    "average": -0.00011720650000000034,
    "min": -0.06021344,
    "max": 0.05716719
  },
  "spin_statistics": {
    "average": 1.9999533090000003,
    "min": 1.82086927,
    "max": 2.17189602
  }
}

Hirshfeld analysis for the Co20 cluster

Atom Index Element Charge Spin Moment
1 Co 0.019809 2.160955
2 Co -0.025578 1.922202
3 Co -0.025416 1.922412
4 Co 0.044926 2.171776
5 Co -0.034440 1.839762
6 Co 0.044876 2.171896
7 Co -0.060213 1.836097
8 Co -0.038640 1.820869
9 Co -0.038584 1.820900
10 Co 0.039639 2.166580
11 Co -0.018020 1.929086
12 Co 0.039631 2.166352
13 Co 0.026927 2.093399
14 Co 0.026809 2.093116
15 Co -0.037215 1.918621
16 Co 0.041595 1.981964
17 Co -0.037070 1.919301
18 Co -0.014239 1.967989
19 Co -0.014309 1.967741
20 Co 0.057167 2.128045

Charge Statistics:

  • Average charge: -0.000117
  • Min charge: -0.060213
  • Max charge: 0.057167

Spin Moment Statistics:

  • Average spin moment: 1.999953
  • Min spin moment: 1.820869
  • Max spin moment: 2.171896

Here, we can see that the Hirshfeld analysis results in an average spin moment of 2.0 as expected.

Simulating the Cobalt Nanoparticle on Silica Support

We now simulate the Co\(_{20}\) cluster on an amorphous silica support just as done in 1 and 2. If you are interested in how the structure of the amorphous silica support has been constructed and found, we refer to the explanations in 6. The structure that we will look at is the most stable position for the cobalt nanoparticle that was found, where 32 configurations of the cluster on different surface CO groups were sampled. For more details on the different configurations and their relative formation energies, we refer to the supporting information of 1.

The relaxed structure (again with the "light" basis settings and the RPBE functional) looks like this

Co20 on silica support

and contains 417 atoms.

Geometry file for Co\(_{20}\)/SiO\(_2\) slab
lattice_vector     21.39490000      0.00000000      0.00000000
lattice_vector      0.00000000     21.39490000      0.00000000
lattice_vector      0.00000000      0.00000000     50.17000000
atom       5.95160724     15.04632614      2.68503702 O
atom      13.24189241     13.34067450      7.14992808 O
atom       3.34380247      8.40137257      3.20495870 O
atom       8.25737636      9.35687383      5.16799843 O
atom      14.42283393     17.95516393      4.46285795 O
atom       2.13786877      9.70170416     12.50163445 O
atom      -0.13803135     16.50974549     10.35146696 O
atom      14.23684936      2.96602471      6.76312121 O
atom       7.62393607      8.36899618      3.99115112 Si
atom       4.56654914     14.15601342      2.93216469 Si
atom       6.71070697     15.27055715     10.89315001 Si
atom       7.50877247     15.43037037      3.07261643 Si
atom       6.23233585     18.11447197      9.97183343 Si
atom       9.59631689     12.27083187      7.95361090 Si
atom       4.35778769     19.59252970      6.89326677 O
atom      18.04955005     11.47007579      3.24802224 O
atom       8.26169244     16.10003944      6.73727288 O
atom      11.18975078     11.78824585      7.98366265 O
atom       2.53874200     10.90849402      7.50587170 O
atom      13.02395742     11.32344645     12.29771704 O
atom       9.42353401     13.91246782      7.87689017 O
atom       2.60632117      8.76747318      9.88171500 O
atom       8.53467900      2.07027686      9.90880988 Si
atom      13.56538415      3.90286996      7.95720895 Si
atom      10.70918832     16.25844561      7.66002156 O
atom       6.67546214     20.87179567      6.56442465 O
atom       6.54181191     18.18103416      6.07049386 O
atom      17.31209268     18.91114330      9.44709265 O
atom      21.18150851      5.35238280     11.24625811 O
atom      21.06756283      1.18458886     10.17376942 O
atom      -0.64227776      0.05917405      6.23849737 O
atom       2.16550590      6.38206955      4.44156599 O
atom      19.54006188      1.03274918      9.59276455 Si
atom       1.47003828     16.51489229     10.78824213 Si
atom      17.32978765     16.02251936     12.28684466 Si
atom      12.52750938     15.41953415      9.41717322 O
atom       8.92825384     12.23184340     11.95837553 O
atom      17.04452698      6.89177206      5.35065873 O
atom       0.61893855      4.23134420      8.90981212 O
atom      11.14960171     14.58256656      2.88993334 O
atom      17.46180056     11.27717357      4.79219717 Si
atom       8.84652232     17.80368846      1.84262140 Si
atom      11.53043478      8.18205443      5.23346754 Si
atom       9.84168938      7.16111084     12.12237322 Si
atom      14.05852542     14.46741195      6.23506315 Si
atom       9.67071797     15.22083767      6.91420629 Si
atom      16.42902046      8.46108773      5.28450155 Si
atom       3.28566608     13.10739888      8.85961528 O
atom      11.93366100      3.68001819      8.03192948 O
atom      15.50011227      8.80897603      6.62169666 O
atom      10.82905501     20.17205833      4.07862337 O
atom       5.20229284     18.38163791      2.90538084 O
atom      13.31009157     15.94028857      6.06195552 O
atom      15.93460714     19.12507768      2.53987564 O
atom      14.79931731     17.93684204      9.39410446 O
atom      15.55631836     14.76372071      6.84640604 O
atom      18.28942021     16.42735377      4.49422302 Si
atom      18.39393878     19.74394964      8.52725324 Si
atom       4.80791532      6.10398021      6.17412990 O
atom       2.17293142      1.32267682      3.58311241 O
atom      12.29453407      3.74665424     11.18903332 O
atom      17.28210075     14.40297577     11.74651794 O
atom       4.77620965      6.13317099      8.84261539 O
atom      13.15728181     11.42463242      4.28602407 O
atom      18.61203136     11.44529873     11.10976588 Si
atom       7.12987510     10.14145925      7.52923061 O
atom       6.91762053      7.06228923      4.71280072 O
atom       6.37904490     20.64675240      3.88188723 O
atom      10.50203372     12.29384705      4.06191844 O
atom      18.78813453      9.82131137     10.99611126 O
atom      12.76223010      1.28891655     10.02874649 O
atom      13.44935614      2.68112757     10.61731826 Si
atom      16.62278269     21.15275740      6.14782056 Si
atom      12.82782124     12.00241656      8.05019226 Si
atom      13.34027054     12.55957119     11.23218597 Si
atom      20.36391361      1.61600423      6.66514921 Si
atom       7.03248075      3.10150028      4.12106468 Si
atom       6.00719848     19.42236432      7.05231484 Si
atom      10.01801064      2.78167398      6.30213659 O
atom      10.33811119     16.78553858     10.37562353 O
atom      10.92201733      8.32265811     12.64607916 O
atom       2.06564945     18.05892129     10.73036899 O
atom       6.62448114      8.61734655      9.60938917 O
atom      16.73112562      3.22356689     12.13077149 O
atom      10.24001193     14.70123573      5.43766552 O
atom      -0.40992752     18.85545416      5.63636362 O
atom      18.91841377     16.43257361     12.47675008 O
atom      13.26087255     12.15517972      9.64286377 O
atom      15.91768501     18.59664539      4.11981587 Si
atom      16.62079786     14.87903044      8.08741715 Si
atom      20.16297576     17.87075239      6.65688767 Si
atom      16.93172487     17.28819684      4.16000023 O
atom      19.28757092      7.24828469     10.86042127 O
atom      17.60073233      9.67146477      5.25000528 O
atom      13.78157346      5.55148230      7.81057905 O
atom      18.95513550     17.18847976      5.78583014 O
atom      18.45792751      1.87597202     10.52776775 O
atom      15.48689087      2.59661348     13.01785200 Si
atom       3.52155680     18.70868042     11.25138850 Si
atom       1.37170270      0.10638891      2.80481620 Si
atom       9.61759990     19.37542231     10.86015471 O
atom       2.29113651      1.22639230     10.73474761 O
atom       0.74907524      9.00589709      7.79225862 O
atom      12.12304392     18.08321880      8.94510725 O
atom       0.39476482      2.38639730      6.90847905 O
atom       4.71050879      6.09510124      3.48983286 O
atom      10.08725944      6.78747421      7.63158393 Si
atom       0.89092985      5.42416168     10.02745134 Si
atom      10.32268836      3.63780178      7.68005328 Si
atom       4.37626613      6.97794737      7.49758970 Si
atom       1.93482855     14.09072114      9.01037320 Si
atom       2.67974679      2.87885450      3.72520491 Si
atom       9.17599099     18.33772028      5.40922955 O
atom       8.73118700      0.06183187      4.99513740 O
atom       2.73325830      3.27562075      7.53164797 O
atom       1.79409736     20.08679827      6.33531373 O
atom       6.47027783     19.01559132      8.57997992 O
atom       7.41491021     16.55955892      4.27584949 O
atom      12.67876449      0.81389652      7.32164247 O
atom       6.63990415      1.72049276      4.96269160 O
atom       0.94192569     10.58269769      7.31825230 Si
atom       8.77431819      7.47301003      8.37307510 O
atom      11.16927569      4.28895827      4.39141997 O
atom      14.52777993      7.11489813      1.90593745 O
atom      17.97410811     14.84091721      4.92547291 O
atom      18.07823460     14.26209648      7.60330178 O
atom      13.15708256      5.01617238      2.83164316 O
atom       8.17160410     16.28318513      1.79146092 O
atom       7.88674417     17.30011539      5.66662636 Si
atom       9.00992731      0.58317701     10.46913842 O
atom       6.63108140     11.41017815     10.88247868 O
atom       5.21466781      2.52847620      7.36535028 O
atom      10.23586386     20.89255203     10.55742064 Si
atom      13.59705649     18.69034274      8.56613558 Si
atom       5.70806261      5.93572891      4.79734305 Si
atom      14.01186735      0.93121357      3.22382509 Si
atom      12.55158869     21.53730803      8.83336740 Si
atom       3.27235955     10.02905325      3.29896006 Si
atom      11.60506396     11.06271766      3.76461990 Si
atom       9.89070588      0.15542675      3.82924466 Si
atom      15.84242929     11.68214201      4.82413770 O
atom      13.65314048      1.26506235      4.81074703 O
atom      17.63967169     20.54112122      7.29051221 O
atom       3.19267583      7.39234085     12.17139769 O
atom       5.11297268     14.77903076     11.09775084 O
atom       1.07253695     15.53549931      5.14076650 O
atom      14.24994590     13.86424404      4.70023679 O
atom      15.21653422      0.31540800      6.83279080 O
atom      13.77857621     18.51355522      6.92208648 O
atom      17.11512072      5.46017113      4.43664611 Si
atom      14.66068849      5.51255874      2.34070252 Si
atom       8.84038876      7.74297240      3.02767629 O
atom      10.65512594      5.64180707      2.06622808 O
atom      19.55923272     18.68468701      7.96199167 O
atom      11.82451620      6.99248582      4.12475557 O
atom       8.67162467      3.28969146      3.98227111 O
atom      16.88517397     16.45811898      8.48718231 O
atom      13.62399524     20.73107280      2.89235331 O
atom       4.60242623      9.63838314     11.47914826 O
atom       1.28388765     14.39948791      7.52152511 O
atom      12.25709400      5.38121218     11.48568837 Si
atom      10.32535035     17.98843354     11.54373119 Si
atom       1.15055000      3.75233100      7.42257515 Si
atom       3.38039640      0.20157353     10.04712597 Si
atom      19.10813373     20.82912319      9.54369978 O
atom       3.46043652      0.76773898      6.40457291 O
atom       7.21135318      1.76158476      8.96004363 O
atom       0.77563746     13.40100788      9.97366798 O
atom      19.55864928      2.43174608      5.46531281 O
atom      17.99781943      2.51382620      4.90298948 Si
atom      21.26800108     12.01497217      9.84621079 Si
atom       6.26958731     19.60189647      2.59099204 Si
atom      18.28607685      3.10260030     11.62179735 Si
atom       5.42978835     11.01521041     11.95268945 Si
atom       0.35853000     20.31690426      5.55721257 Si
atom       9.63936073      2.86839965      8.95760471 O
atom       3.70731181      2.99647319      5.03854447 O
atom       2.75245658     20.90075431      8.67784209 O
atom       6.85885961     18.93317613     11.24942546 O
atom       3.12488636     20.69925108      7.08634024 Si
atom       5.64746557      2.27382079      8.94858403 Si
atom       0.79894546     11.56997226      4.28407159 Si
atom      17.06886009      1.40109745      2.23276942 Si
atom       6.36899135      3.03847502      2.57975271 O
atom      18.35854889      5.57221368      3.35429949 O
atom      19.30884402     16.36105755      3.17065204 O
atom       2.38344269     15.50044385      9.77016055 O
atom      10.12083166     17.78602217      2.94967621 O
atom       9.34725146      0.25325153      2.26705606 O
atom       4.61058554     17.94085825     10.25993839 O
atom      17.25818418      1.14129751      5.49010979 O
atom       7.82908653      7.47039389      9.73661901 Si
atom       1.71248735     14.60286096      3.90877929 Si
atom      20.32803594     14.17366208      6.16696813 O
atom       7.18285667      5.94536406      9.99093999 O
atom      19.45540111      1.64450969      8.04643070 O
atom      17.10243262     11.93373130     10.64245832 O
atom       7.51431037     13.94213379     10.28507455 O
atom      10.67014525      5.87048095     11.44668856 O
atom       3.76451357      2.38240728      6.58426826 Si
atom       5.90375436      9.50526104      8.39256217 Si
atom       3.21002104      6.76412525      3.21346910 Si
atom      11.41885558     16.59161425      9.12307485 Si
atom       5.62764549      5.32934014      9.99532973 Si
atom      14.34732996      2.15421895     11.87981601 O
atom      19.67796733     12.32510869     10.17825735 O
atom      20.71452738     11.82027976      3.62318126 O
atom      11.02180863     20.96307359      9.08459855 O
atom       8.47911366     14.12741608      3.46798480 O
atom       8.26543636      2.94835909     11.28323908 O
atom      10.30881824      7.61021496      6.21411063 O
atom       0.52272446     10.85114552      5.75185004 O
atom       1.70095309     10.54452868      3.33767253 O
atom       4.59037705     12.39299597      6.62596170 O
atom      15.36286660      8.47905904      2.28186566 Si
atom      18.68277329     13.88586048      6.10575577 Si
atom      10.47528084     18.55526502      4.39237892 Si
atom       7.97540307     12.38367397     10.65073313 Si
atom      20.92120580      5.87247522      4.24941460 O
atom       4.08854705     10.54366652      4.66307379 O
atom       7.83477380     19.06509860      2.25526500 O
atom       6.63110277     11.39245610      5.15722480 O
atom      15.49434701      8.63622846      3.92500124 O
atom       3.30381901     15.02545207      3.61605780 O
atom      13.96164883      9.04649338      7.18575211 Si
atom      18.34662796      8.43253987     10.17385021 Si
atom      16.38652167     17.55838193      9.62917456 Si
atom      13.34168584     17.55051005      5.64570836 Si
atom      12.47369638     13.92522067     11.65811816 O
atom      13.18996560      6.23586577     10.39700861 O
atom       9.74448263      5.17633413      7.43337360 O
atom       5.59483571      3.71063441      9.75509225 O
atom      14.92119073     13.07150804     11.60127268 O
atom      11.45430918      6.94542856      8.54737207 O
atom       8.78904342      7.84739425     11.03359453 O
atom       6.38917548      4.42998385      4.85215340 O
atom      13.06945032      6.70422847      8.80783475 Si
atom      10.15460898      3.01764301      4.67098140 Si
atom      11.68068315      5.51984426      3.35669647 Si
atom      12.91100625      8.37206677      6.11737767 O
atom      11.55476934     10.77643787      2.13233394 O
atom       5.10549046      8.45353160      7.40220154 O
atom      13.87288606      8.14579744      8.60502694 O
atom       0.55710826     20.60794322      3.94740447 O
atom      18.33270330     12.28955900      5.79573223 O
atom      10.08483072     13.91230351      3.97079923 Si
atom       0.99012519     10.89106500     12.50493647 Si
atom      14.78513897     12.44176377      2.42640293 O
atom      13.62687577     10.64546680      7.48737518 O
atom       1.33637417      3.84236271      3.91110846 O
atom      19.37678995      5.82088897     13.19513653 O
atom      17.96813910      2.36175477      3.24837033 O
atom      10.74768919      1.57798950      4.02739317 O
atom      13.63637217     20.29603772      8.99745574 O
atom       4.98722100     13.00454981      4.02680352 O
atom       0.90750482      4.98742921      6.34979232 O
atom      16.34981700     19.88763775      5.09626832 O
atom      17.36140897      4.02341436      5.30453693 O
atom      19.60405624      5.78888920     11.53780526 Si
atom       0.77961681      1.06289615     11.41038491 Si
atom       7.08460790      0.12400387      5.09156841 Si
atom       7.75641307     10.61881886      6.10406618 Si
atom       4.96007314      5.56665620     11.48377359 O
atom       0.71122549      2.32969854     12.48108990 O
atom      15.63382681      1.00465478      2.95418539 O
atom       6.62033536      9.27743554      3.00898500 O
atom      16.52767992     16.94687162     11.14380630 O
atom       1.64371607     12.99961019      4.39410433 O
atom      18.63092634      4.58419477     10.94340622 O
atom       2.75182036      7.25390015      7.58037464 O
atom       0.70575456      6.90400358      9.30935034 O
atom      14.27916273      3.41479282      9.38724438 O
atom       3.36303389      5.77284562     11.90500273 Si
atom       3.12713708      8.88472118     11.47342503 Si
atom      14.51341431     12.35455214      4.07915833 Si
atom       5.03204581     11.82854465      5.13895196 Si
atom       3.83139362     11.79776992      7.97507770 Si
atom       0.22270919     15.17391889      6.51966967 Si
atom      16.35805941     13.39882713     10.82519847 Si
atom       4.86571613     10.76751022      8.78250691 O
atom      15.99433314     14.02772478      9.35018975 O
atom      15.67433627      5.29093328      3.64778223 O
atom       0.42936426     10.90274071     10.91794003 O
atom       4.32027894     12.26282022     12.05776620 O
atom       6.81878914     16.54938047      9.80688867 O
atom       2.41061910      5.23534895     10.64508919 O
atom       8.80504842     11.78247864      9.31574429 O
atom      16.02510327      1.25915469     13.84040938 O
atom      19.86457867      6.16894052      3.00068205 Si
atom      13.97966485      1.34092175      6.41766143 Si
atom       1.75023674      8.00404986      8.66952873 Si
atom      19.51735386     11.68498309      2.48207262 Si
atom       0.98243486      5.25669759      4.71663901 Si
atom       8.99445807     11.61208855      6.54387512 O
atom       0.79642312     14.89379678      2.55109008 O
atom      21.35158019     11.49516775      8.27694076 O
atom      11.14935855      9.66032666      4.57199360 O
atom      21.12317601     16.61480679      7.22994339 O
atom       3.68707889     20.35427363     11.09478722 O
atom      11.83456673     17.89072728      5.03208024 O
atom       4.72375212      1.10455735      9.68153572 O
atom      15.57050390     12.95981431      2.17866027 H
atom      12.33445028     10.28619861      1.80240913 H
atom       6.57210667     10.18223661      3.37073098 H
atom       9.26636703      8.43743324      2.49312762 H
atom       4.45625796     15.21601182     10.52738714 H
atom       7.25144937     15.65424214     12.40537172 O
atom       7.92294270     16.37289959     12.46645630 H
atom       4.63113228     13.13684933     11.71059377 H
atom       6.15930132     10.70453360     13.42676294 O
atom       5.52315657     10.45817575     14.11848725 H
atom      11.09749501      9.05355209     12.02826213 H
atom       9.04649654      6.51023189     13.42417135 O
atom       8.32902300      7.06287053     13.77609664 H
atom       2.99066180      4.97206254     13.29997989 O
atom       2.48759820      4.14983733     13.15234118 H
atom      12.50173132     15.00639610     10.31374059 H
atom      12.95093123      5.59268052     12.99620494 O
atom      12.99806733      6.52579364     13.26991740 H
atom       8.36090735      3.90993485     11.18847494 H
atom      14.87175353      3.66336214     14.12189766 O
atom      14.24564680      4.33509560     13.78028432 H
atom      19.31606644      2.78159022     12.91471067 O
atom      19.23754525      3.47045391     13.60166332 H
atom      19.51034015     16.44731179     11.70174721 H
atom      16.59276764     16.15875589     13.73664135 O
atom      18.85994105     11.78721182     12.74055950 O
atom      18.78054559     12.74053842     12.92907299 H
atom      16.73147638      8.18679275     10.43738338 O
atom      18.63717374      8.53647507      8.54515873 O
atom      19.56136360      8.40446427      8.27232346 H
atom      16.18726542      8.01417886      9.65138037 H
atom       1.64739738     12.35137172     12.94697912 O
atom       2.59580069     12.40333636     12.67552011 H
atom      -0.17806750     10.42532004     13.57171706 O
atom      -1.03804802     10.88156190     13.45366891 H
atom      11.89260087     18.31274665     12.04177111 O
atom      -0.30538552     16.78019062      9.42964572 H
atom       1.61734676     15.99222834     12.36079641 O
atom       1.43117037     15.04922198     12.51996660 H
atom       3.71379518     18.43771192     12.87554628 O
atom       3.33326431     17.59107465     13.16970768 H
atom      -0.21427180      2.52529291     12.74889899 H
atom       0.50485780     -0.42558806     12.09828137 O
atom       0.99951874     -0.59596830     12.91676074 H
atom      12.02691286     19.26940565     12.20202811 H
atom       9.41280545     17.44722160     12.80166497 O
atom       7.77495333     19.25900851     11.14807780 H
atom      15.56048057      1.10650081     14.67872946 H
atom      11.25176744     21.12684088     11.87119529 O
atom      11.87647783     21.86321263     11.75064920 H
atom      19.82426149      6.55642820     13.64657443 H
atom      14.45400500      9.69366883      1.60256325 O
atom      16.94831110      8.45137872      1.71815400 O
atom      17.02099600      8.39522267      0.75000166 H
atom      14.77021210     10.61131867      1.74860278 H
atom      15.17677665      4.75331413      0.98104615 O
atom      15.65702706      3.90370765      1.04752161 H
atom       6.81857735      2.42103489      1.97648674 H
atom       2.67558654      6.25002490      1.72837071 O
atom       2.91624416      5.30847733      1.59601508 H
atom       3.94923878     10.66140717      1.89943847 O
atom       4.68251288     10.10777894      1.57475194 H
atom       5.29310405     17.94678478      3.77013959 H
atom       9.85866745      6.16827936      2.27956663 H
atom       9.42351866     18.18954943      0.33910127 O
atom       9.82008547     17.45157670     -0.15181419 H
atom       4.09163926     13.51754956      1.48864361 O
atom       4.03522568     12.53800968      1.48793475 H
atom       8.93762076     -0.56076468      1.91895784 H
atom       0.07352086     15.51863226      2.74599439 H
atom      19.09445912     15.58924581      2.61290783 H
atom      15.11230861     19.64209058      2.38172851 H
atom      11.16874243     15.55494598      2.89733221 H
atom       5.75720814     20.41621351      1.24288759 O
atom       4.81445273     20.66444690      1.31088146 H
atom      19.33044219     13.12658796      1.65237107 O
atom      19.85872663     10.49112113      1.38951226 O
atom      20.10474280     13.32974943      1.09828289 H
atom      20.14665942      9.64500003      1.78762953 H
atom      12.75507905     20.43339734      3.22131073 H
atom      17.88185581      0.01503162      1.82035674 O
atom      17.38983237     20.58683941      2.02551477 H
atom      16.83455711      2.36565822      0.88498527 O
atom      16.74964912      1.87014951      0.05405284 H
atom       3.46913599      3.41806889      2.36565713 O
atom       4.44001649      3.26341793      2.36259591 H
atom       0.28942339      0.59992311      1.65103558 O
atom       2.58320010     20.62384468      2.05812954 O
atom      20.75929892      0.67531334      1.94214459 H
atom      20.32578945      5.39500205      1.60543446 O
atom      19.72859602      7.82891363      2.80795065 O
atom      21.20738370      5.64304727      1.27878196 H
atom      18.81657980      8.04972678      2.52222908 H
atom       2.27771352     19.78193272      1.67952937 H
atom      13.29544382      1.98648607      2.18269487 O
atom      12.39259193      2.25271972      2.42015022 H
atom      11.65096252     12.26696400     17.85418912 Co
initial_moment  2.00
atom      13.00081500     11.77854685     16.00590775 Co
initial_moment  2.00
atom      10.52463431     12.22246044     15.74761825 Co
initial_moment  2.00
atom      14.19460488     11.64899061     13.95153610 Co
initial_moment  2.00
atom      11.94618834     12.08502965     13.90812709 Co
initial_moment  2.00
atom       9.70434634     12.64387660     13.51347215 Co
initial_moment  2.00
atom      12.08299973     14.63989830     17.88830657 Co
initial_moment  2.00
atom      13.80957276     15.43638880     16.44751013 Co
initial_moment  2.00
atom      11.06299284     16.00850729     16.23511395 Co
initial_moment  2.00
atom      15.06444744     15.54766598     14.49146095 Co
initial_moment  2.00
atom      12.65365638     16.04441252     14.50425348 Co
initial_moment  2.00
atom      10.34013236     16.38874998     14.01788831 Co
initial_moment  2.00
atom      13.88094669     13.25466954     17.64648783 Co
initial_moment  2.00
atom       9.99152461     13.97962904     17.27842965 Co
initial_moment  2.00
atom      14.65391591     13.41388452     15.45619618 Co
initial_moment  2.00
atom      12.15088666     13.93810230     15.47430512 Co
initial_moment  2.00
atom       9.76567211     14.38500794     15.01652756 Co
initial_moment  2.00
atom      13.62498056     14.09395192     13.47911415 Co
initial_moment  2.00
atom      11.30499788     14.40474914     13.19734785 Co
initial_moment  2.00
atom      12.55240193     16.87046892     17.71131528 Co
initial_moment  2.00

As a total energy calculation for this structure would take ~60 min on the provided resources, we instead provide the output files for your convenience. On the provided resources (you can also find the reference files in the solutions folder here), you may copy the reference results to your folder with

cp -r ~/Co20-silica .

You can look at the control.in file to see the used computational settings:

xc               rpbe
charge           0.0
spin             collinear
relativistic atomic_zora scalar

k_grid 3 3 1

output  hirshfeld

[light species defaults for Si, O, H, Co]

Dipole correction

In typical slab calculations for crystalline surfaces with inequivalent top and bottom surfaces, we recommend to use a dipole correction to correct the dipole moment across the slab. The correction can be turned on with the keyword use_dipole_correction in the control.in file (note that the slab has to be oriented in the z-direction). In this tutorial, we are simulating a neutral amorphous SiO\(_2\) slab that induces less of a dipole moment compared to crystalline surfaces. The effects on the adsorption energies in this case are negligible. If you are interested in an accurate work function or electrostatic potential, you would need the dipole correction. More details on how to do these kinds of calculations can be found here.

Feel free to visualize the structure in geometry.in before continuing. Just as before, all Co atoms have been initialized with a spin moment of +2.

Then analyze the Hirshfeld charges and spins with the same script as before:

python analyze_hirshfeld.py Co20-silica

You should also see two new files in your working directory after the script is finished, namely Co20-silica_hirshfeld_analysis.json and Co20-silica_hirshfeld_analysis.md:

Reference files after running analyze_charges.py
# Atom Analysis for Co20-silica

## Hirshfeld Charges and Spin Moments

| Atom Index | Element | Charge | Spin Moment |
|------------|---------|--------|-------------|
| 398 | Co | 0.060099 | 2.109546 |
| 399 | Co | 0.000153 | 1.994593 |
| 400 | Co | 0.022489 | 1.943407 |
| 401 | Co | 0.166800 | 2.148351 |
| 402 | Co | 0.063943 | 1.983126 |
| 403 | Co | 0.132463 | 2.068829 |
| 404 | Co | -0.026449 | 1.830233 |
| 405 | Co | -0.010586 | 1.886110 |
| 406 | Co | -0.003320 | 1.918911 |
| 407 | Co | 0.109604 | 1.995079 |
| 408 | Co | 0.069515 | 2.001433 |
| 409 | Co | 0.114792 | 2.007837 |
| 410 | Co | 0.066332 | 2.214371 |
| 411 | Co | 0.069908 | 2.223082 |
| 412 | Co | 0.011244 | 1.983635 |
| 413 | Co | 0.039756 | 1.922348 |
| 414 | Co | 0.024104 | 1.922808 |
| 415 | Co | 0.080209 | 1.982236 |
| 416 | Co | 0.109156 | 2.018528 |
| 417 | Co | 0.112373 | 2.196122 |

**Charge Statistics:**

- Average charge: 0.060629
- Min charge: -0.026449
- Max charge: 0.166800

**Spin Moment Statistics:**

- Average spin moment: 2.017529
- Min spin moment: 1.830233
- Max spin moment: 2.223082
{
  "folder": "Co20-silica",
  "cobalt_data": [
    {
      "atom_index": 398,
      "element": "Co",
      "charge": 0.0600989,
      "spin": 2.10954626
    },
    {
      "atom_index": 399,
      "element": "Co",
      "charge": 0.00015314,
      "spin": 1.99459292
    },
    {
      "atom_index": 400,
      "element": "Co",
      "charge": 0.02248891,
      "spin": 1.94340665
    },
    {
      "atom_index": 401,
      "element": "Co",
      "charge": 0.16680031,
      "spin": 2.14835064
    },
    {
      "atom_index": 402,
      "element": "Co",
      "charge": 0.06394348,
      "spin": 1.98312585
    },
    {
      "atom_index": 403,
      "element": "Co",
      "charge": 0.13246316,
      "spin": 2.06882912
    },
    {
      "atom_index": 404,
      "element": "Co",
      "charge": -0.02644909,
      "spin": 1.83023261
    },
    {
      "atom_index": 405,
      "element": "Co",
      "charge": -0.01058594,
      "spin": 1.88610977
    },
    {
      "atom_index": 406,
      "element": "Co",
      "charge": -0.00332023,
      "spin": 1.91891087
    },
    {
      "atom_index": 407,
      "element": "Co",
      "charge": 0.10960427,
      "spin": 1.99507873
    },
    {
      "atom_index": 408,
      "element": "Co",
      "charge": 0.06951514,
      "spin": 2.00143263
    },
    {
      "atom_index": 409,
      "element": "Co",
      "charge": 0.11479204,
      "spin": 2.00783699
    },
    {
      "atom_index": 410,
      "element": "Co",
      "charge": 0.06633245,
      "spin": 2.2143708
    },
    {
      "atom_index": 411,
      "element": "Co",
      "charge": 0.06990796,
      "spin": 2.22308192
    },
    {
      "atom_index": 412,
      "element": "Co",
      "charge": 0.01124408,
      "spin": 1.98363543
    },
    {
      "atom_index": 413,
      "element": "Co",
      "charge": 0.03975608,
      "spin": 1.9223483
    },
    {
      "atom_index": 414,
      "element": "Co",
      "charge": 0.02410396,
      "spin": 1.92280799
    },
    {
      "atom_index": 415,
      "element": "Co",
      "charge": 0.08020891,
      "spin": 1.98223571
    },
    {
      "atom_index": 416,
      "element": "Co",
      "charge": 0.10915595,
      "spin": 2.01852848
    },
    {
      "atom_index": 417,
      "element": "Co",
      "charge": 0.11237316,
      "spin": 2.19612177
    }
  ],
  "charge_statistics": {
    "average": 0.060629331999999994,
    "min": -0.02644909,
    "max": 0.16680031
  },
  "spin_statistics": {
    "average": 2.017529172,
    "min": 1.83023261,
    "max": 2.22308192
  }
}

Hirshfeld analysis for the Co\(_{20}\) nanoparticle on silica support

Atom Index Element Charge Spin Moment
398 Co 0.060099 2.109546
399 Co 0.000153 1.994593
400 Co 0.022489 1.943407
401 Co 0.166800 2.148351
402 Co 0.063943 1.983126
403 Co 0.132463 2.068829
404 Co -0.026449 1.830233
405 Co -0.010586 1.886110
406 Co -0.003320 1.918911
407 Co 0.109604 1.995079
408 Co 0.069515 2.001433
409 Co 0.114792 2.007837
410 Co 0.066332 2.214371
411 Co 0.069908 2.223082
412 Co 0.011244 1.983635
413 Co 0.039756 1.922348
414 Co 0.024104 1.922808
415 Co 0.080209 1.982236
416 Co 0.109156 2.018528
417 Co 0.112373 2.196122

Charge Statistics:

  • Average charge: 0.060629
  • Min charge: -0.026449
  • Max charge: 0.166800

Spin Moment Statistics:

  • Average spin moment: 2.017529
  • Min spin moment: 1.830233
  • Max spin moment: 2.223082

Note that the script only outputs the Hirshfeld analysis for the last 20 atoms of the geometry.in, which is the full Co cluster.

We can observe two things:

  1. The average spin moment for the Co atoms is increased slightly to +2.02.

  2. We can see that there is significant charge transfer from the silica support to the cobalt nanoparticle, with the average Hirshfeld charge being +0.06e. This transfer is most significant for the atoms in direct contact with the silica as also reported in 1:

Hirshfeld analysis Cobalt Silica

The Hirshfeld charge analysis we've performed reveals important insights into the electronic structure of cobalt clusters and their interaction with the silica support. When comparing the isolated Co\(_{20}\) cluster with the supported Co\(_{20}\)/SiO\(_2\) system, we observe a clear pattern of electron transfer from the silica support to the cobalt nanoparticle, with the average charge per cobalt atom changing from approximately -0.0001e in the isolated neutral cluster to +0.061e in the supported system.

This charge transfer is not uniform across all cobalt atoms. As evident from both our calculations and the reference study 1, atoms at the cobalt-silica interface show significantly larger positive charges (up to +0.17e), indicating stronger electronic interaction with the support. These interface atoms, labeled as E, F, G, H, I, and J in the visualization above, act as primary anchoring points for the nanoparticle.

In the following, we will calculate the adsorption energy of a CO\(_2\) molecule when adsorbed on the most oxidized Co site (label J in the above visualization) and compare the result to the reported one in 1.

Simulating the CO₂ Molecule

Before calculating the adsorption energy, we still need to calculate a reference energy for the CO\(_2\) molecule. To start, create a new folder with

mkdir CO2_molecule
cd CO2_molecule

and create the geometry.in file with the experimentally observed bond lengths:

atom 0.0000 0.0000 0.0000 C
atom 1.1600 0.0000 0.0000 O
atom -1.1600 0.0000 0.0000 O

Then create the control.in file with the following to relax the molecule with the RPBE functional:

xc rpbe
relativistic atomic_zora scalar
spin none

relax_geometry  bfgs 5e-3

Append the "light" species defaults with:

clims-prepare-run --species=light

Submit the calculation again to your compute system. During the webinar hands-on session, you may use the provided fhiaims_job.sh script:

cp ~/fhiaims_job.sh .
sbatch fhiaims_job.sh

After the calculation is finished, you can inspect the relaxed geometry in geometry.in.next_step:

atom      -0.00000000      0.00000000      0.00000000 C
atom       1.17859817     -0.00000000     -0.00000000 O
atom      -1.17859817     -0.00000000     -0.00000000 O

With this we now have the reference energy for the CO\(_2\) molecule that we need for the adsorption energy.

Adsorption Energy of CO₂ on Co₂₀/SiO₂

Similar to the pure Co\(_{20}\)/SiO\(_2\) slab, it is not feasible within the time constraints of this tutorial to do a full relaxation and energy calculation for the CO\(_2\) adsorbed structure. When using the webinar resources, you may copy the reference results to your folder with

cd ..
cp -r ~/CO2-Co20-silica .

The relaxed structure looks like this:

CO2 at Co20/SiO2

Your folder structure should now look similar to this:

Co_silica_work
├── CO2-Co20-silica
   ├── aims.out
   ├── control.in
   └── geometry.in
├── CO2_molecule
   ├── aims.out
   ├── control.in
   ├── geometry.in
   └── geometry.in.next_step
├── Co20-silica
   ├── aims.out
   ├── control.in
   └── geometry.in
├── Co20-silica_hirshfeld_analysis.json
├── Co20-silica_hirshfeld_analysis.md
├── Co20_cluster
   ├── aims.out
   ├── control.in
   └── geometry.in
├── Co20_cluster_hirshfeld_analysis.json
├── Co20_cluster_hirshfeld_analysis.md
├── Co_atom
   ├── aims.out
   ├── control.in
   └── geometry.in
└── analyze_hirshfeld.py

We have all the ingredients to finally calculate the adsorption energy for CO\(_2\) on Co\(_{20}\)/SiO\(_2\). You can do this by hand (extract the total energies from the individual folders and calculate the adsorption energy) or you use the following script:

Adsorption energy analysis script

This script does the following:

  1. Read in the FHI-aims output files for a reference catalyst and molecule.
  2. Read in the FHI-aims output files for the adsorbed system as command line arguments. Calculate their adsorption energies.
  3. Output the results in a markdown table, adsorption_energies.md, and as a json file, adsorption_energies.json.
analyze_energies.py
import json
from ase.io import read
from pathlib import Path
import sys
import argparse


def calculate_adsorption_energies(adsorbed_systems, ref_catalyst, ref_mol):
    """
    Calculate adsorption energies for CO2 on Co20/SiO2 at different sites.

    Args:
    adsorbed_systems (list): List of folders with CO2-Co20/SiO2 calculations
    ref_catalyst (Path): Path to the catalyst reference calculation (Co20/SiO2)
    ref_mol (Path): Path to the molecule reference calculation (CO2)

    Returns:
    dict: A dictionary with adsorption sites as keys and adsorption energies in eV as values
    """
    # Read reference energies
    try:
        co2_gas_file = ref_mol / "aims.out"
        catalyst_file = ref_catalyst / "aims.out"

        co2_gas = read(co2_gas_file)
        catalyst = read(catalyst_file)

        e_co2_gas = co2_gas.get_total_energy()
        e_catalyst = catalyst.get_total_energy()

        print(f"Reference energies:")
        print(f"E(CO2_gas) = {e_co2_gas:.6f} eV from {co2_gas_file}")
        print(f"E(Co20/SiO2) = {e_catalyst:.6f} eV from {catalyst_file}")
        print("-" * 50)
    except FileNotFoundError as e:
        print(f"Error: Required reference calculation not found - {e}")
        sys.exit(1)
    except Exception as e:
        print(f"Error reading reference energies: {e}")
        sys.exit(1)

    # Calculate adsorption energies for each system
    adsorption_energies = {}

    for system in adsorbed_systems:
        system_path = Path(system)
        if system_path.is_dir():
            system_file = system_path / "aims.out"
            if system_file.exists():
                try:
                    adsorbed_system = read(system_file)
                    e_adsorbed = adsorbed_system.get_total_energy()

                    # Calculate adsorption energy: E_ads = E(CO2+Co20/SiO2) - E(Co20/SiO2) - E(CO2)
                    e_ads = e_adsorbed - e_catalyst - e_co2_gas

                    adsorption_energies[system] = e_ads
                    print(f"System {system}: E_ads = {e_ads:.4f} eV")
                except Exception as e:
                    print(f"Error processing {system}: {e}")
                    adsorption_energies[system] = None
            else:
                print(f"Warning: {system_file} does not exist. Skipping.")
                adsorption_energies[system] = None
        else:
            print(f"Warning: System directory {system_path} does not exist. Skipping.")
            adsorption_energies[system] = None

    return adsorption_energies


def save_energies_json(adsorption_energies, output_prefix="adsorption"):
    """
    Save calculated adsorption energies to a JSON file.

    Args:
    adsorption_energies (dict): Dictionary of adsorption energies
    output_prefix (str): Prefix for output files
    """
    json_file = f"{output_prefix}_energies.json"
    with open(json_file, "w") as file:
        json.dump(adsorption_energies, file, indent=2)

    print(f"\nAdsorption energy data has been saved to '{json_file}'")


def create_markdown_table(adsorption_energies, output_prefix="adsorption"):
    """
    Create and save a markdown table of the adsorption energy data.

    Args:
    adsorption_energies (dict): Dictionary of adsorption energies
    output_prefix (str): Prefix for output files
    """
    toplevel_header = (
        "# CO2 Adsorption Energies on Co20/SiO2\n\nAdsorption energies are in eV.\n"
    )
    header = "| Adsorption System | Energy (eV) |"
    separator = "|------------------|------------|"

    rows = []
    for system, energy in adsorption_energies.items():
        energy_str = f"{energy:.4f}" if energy is not None else "N/A"
        rows.append(f"| {system} | {energy_str} |")

    markdown_table = "\n".join([toplevel_header, header, separator] + rows)

    # Save the markdown table to a file
    md_file = f"{output_prefix}_energies.md"
    with open(md_file, "w") as file:
        file.write(markdown_table)

    print(f"Markdown table has been saved to '{md_file}'")


def main():
    parser = argparse.ArgumentParser(description="Calculate CO2 adsorption energies on Co20/SiO2")
    parser.add_argument("--ref_catalyst", required=True, help="Path to the reference catalyst (Co20/SiO2) folder")
    parser.add_argument("--ref_mol", required=True, help="Path to the reference molecule (CO2) folder")
    parser.add_argument("--output", default="adsorption", help="Prefix for output files")
    parser.add_argument("adsorbed_systems", nargs="+", help="Paths to adsorbed system folders")

    args = parser.parse_args()

    print(f"Calculating adsorption energies for systems: {args.adsorbed_systems}")
    print(f"Using reference catalyst: {args.ref_catalyst}")
    print(f"Using reference molecule: {args.ref_mol}")

    adsorption_energies = calculate_adsorption_energies(
        args.adsorbed_systems,
        Path(args.ref_catalyst),
        Path(args.ref_mol)
    )

    save_energies_json(adsorption_energies, args.output)
    create_markdown_table(adsorption_energies, args.output)

    print("\nSummary of CO2 adsorption energies on Co20/SiO2:")
    for system, energy in adsorption_energies.items():
        if energy is not None:
            print(f"{system}: {energy:.4f} eV")
        else:
            print(f"{system}: N/A")


if __name__ == "__main__":
    main()

Save the script in a file analyze_energies.py and run it in the terminal with:

python analyze_energies.py --ref_catalyst Co20-silica --ref_mol CO2_molecule CO2-Co20-silica

You should get the following output in your terminal:

Calculating adsorption energies for systems: ['CO2-Co20-silica']
Using reference catalyst: Co20-silica
Using reference molecule: CO2_molecule
Reference energies:
E(CO2_gas) = -5139.434625 eV from CO2_molecule/aims.out
E(Co20/SiO2) = -2053076.565294 eV from Co20-silica/aims.out
--------------------------------------------------
System CO2-Co20-silica: E_ads = -0.3576 eV

Adsorption energy data has been saved to 'adsorption_energies.json'
Markdown table has been saved to 'adsorption_energies.md'

Summary of CO2 adsorption energies on Co20/SiO2:
CO2-Co20-silica: -0.3576 eV

The script will also create two reference files adsorption_energies.md and adsorption_energies.json:

Reference files after running analyze_energies.py
# CO2 Adsorption Energies on Co20/SiO2

Adsorption energies are in eV.

| Adsorption System | Energy (eV) |
|------------------|------------|
| CO2-Co20-silica | -0.3576 |
{
  "CO2-Co20-silica": -0.357631312027479
}

We obtain an adsorption energy for the CO\(_2\) molecule adsorbed at the oxidized Co site (J) of -0.36 eV. This indicates that it is energetically favorable for the CO\(_2\) molecule to adsorb at that site (negative energy equals exothermic reaction). The absolute value we have obtained with "light" basis settings is also very close to the reference value obtained in 1 for "tight" settings of -0.27 eV.

Interestingly, Belthle et al. have shown in 1 that it's actually preferred to adsorb on a metallic Co site:

Ads. Energies for metallic vs oxidized CO sites

This trend was also confirmed when simulating a larger Co\(_{55}\) cluster on the silica support 1. So while DFT calculations show that CO\(_2\) binds more strongly to metallic Co\(^0\) than to oxidized Co\(^{\delta +}\) species, the oxidized interfacial species like Co-O-SiO\(_x\) play a crucial role in determining product selectivity. Catalysts with a higher proportion of these oxidized species demonstrate enhanced selectivity toward valuable oxygenates like methanol and formate, even with reduced overall CO\(_2\) conversion 1. This seems counterintuitive at first - the sites that don't adsorb CO\(_2\) as strongly are actually better at making these specific valuable products but it also shows that having the strongest possible binding isn't always best for obtaining desirable products (recall the Sabatier principle).


Solutions

You can find the solutions to all the above exercises by clicking on the button below.

Show solutions


References