Computational 2D Materials Database (C2DB)

If you are using data from this database in your research, please cite the following paper:

The Computational 2D Materials Database: High-Throughput Modeling and Discovery of Atomically Thin Crystals

Sten Haastrup, Mikkel Strange, Mohnish Pandey, Thorsten Deilmann, Per S. Schmidt, Nicki F. Hinsche, Morten N. Gjerding, Daniele Torelli, Peter M. Larsen, Anders C. Riis-Jensen, Jakob Gath, Karsten W. Jacobsen, Jens Jørgen Mortensen, Thomas Olsen, Kristian S. Thygesen

2D Materials 5, 042002 (2018)

The data can be downloaded or browsed online:

Brief description

The database contains structural, thermodynamic, elastic, electronic, magnetic, and optical properties of around 4000 two-dimensional materials distributed over more than 50 different crystal structures. The properties are calculated by DFT and many-body perturbation theory (G0W0 and the Bethe- Salpeter Equation for around 200 materials) using the GPAW code and a semi- automated ASE based workflow. The workflow and a table with the numerical settings employed for the calculation of the different properties is provided below.

../_images/workflow.png

Overview of methods and parameters used

If a parameter is not specified at a given step, its value equals that of the last step where it was specified:

Workflow step(s)

Parameters

Structure and energetics(*) (1-4)

vacuum = 15 Å; \(k\)-point density = 6.0/Å\(^{-1}\); Fermi smearing = 0.05 eV; PW cutoff = 800 eV; xc functional = PBE; maximum force = 0.01 eV/Å; maximum stress = 0.002 eV/Å\(^3\); phonon displacement = 0.01Å

Elastic constants (5)

\(k\)-point density = \(12.0/\mathrm{Å}^{-1}\); strain = \(\pm\)1%

Magnetic anisotropy (6)

\(k\)-point density = \(20.0/\mathrm{Å}^{-1}\); spin-orbit coupling = True

PBE electronic properties (7-10 and 12)

\(k\)-point density = \(12.0/\mathrm{Å}^{-1}\) (\(36.0/\mathrm{Å}^{-1}\) for DOS)

Effective masses (11)

\(k\)-point density = \(45.0/\mathrm{Å}^{-1}\); finite difference

Deformation potential (13)

\(k\)-point density = 12.0/Å\(^{-1}\); strain = \(\pm\)1%

Plasma frequency (14)

\(k\)-point density = 20.0/Å\(^{-1}\); tetrahedral interpolation

HSE band structure (8-12)

HSE06@PBE; \(k\)-point density = 12.0/Å\(^{-1}\)

\(G_0W_0\) band structure (8, 9)

\(G_0W_0\)@PBE; \(k\)-point density = \(5.0/\mathrm{Å}^{-1}\); PW cutoff = \(\infty\) (extrapolated from 170, 185 and 200 eV); full frequency integration; analytical treatment of \(W({q})\) for small \(q\); truncated Coulomb interaction

RPA polarisability (15)

RPA@PBE; \(k\)-point density = \(20.0/\mathrm{Å}^{-1}\); PW cutoff = 50 eV; truncated Coulomb interaction; tetrahedral interpolation

BSE absorbance (16)

BSE@PBE with \(G_0W_0\) scissors operator; \(k\)-point density = \(20.0/\mathrm{Å}^{-1}\); PW cutoff = 50 eV; truncated Coulomb interaction; at least 4 occupied and 4 empty bands

(*) For the cases with convergence issues, we set a (k)-point density of 9.0 and a smearing of 0.02 eV.

Versions

Version

rows

comment

2018-06-01

1888

Initial release

2018-08-01

2391

Two new prototypes added

2018-09-25

3084

New prototypes

2018-12-10

3331

Some BSE spectra recalculated due to small bug affecting absorption strength of materials with large spin-orbit couplings

Key-value pairs

key

description

unit

E_B

Exciton binding energy from BSE

eV

E_x

Soc. total energy, x-direction

eV/unit cell

E_y

Soc. total energy, y-direction

eV/unit cell

E_z

Soc. total energy, z-direction

eV/unit cell

Topology

Band topology

absfolder

Absolute path to original folder

age

Time since creation

alphax

Static total polarizability (x)

Ang

alphax_el

Static electronic polarizability (x)

Ang

alphax_lat

Static lattice polarizability (x)

Ang

alphay

Static total polarizability (y)

Ang

alphay_el

Static electronic polarizability (y)

Ang

alphay_lat

Static lattice polarizability (y)

Ang

alphaz

Static total polarizability (z)

Ang

alphaz_el

Static electronic polarizability (z)

Ang

alphaz_lat

Static lattice polarizability (z)

Ang

asr_id

Material unique ID

c_11

Stiffness tensor, 11-component

N/m<sup>dim-1</sup>

c_12

Stiffness tensor, 12-component

N/m<sup>dim-1</sup>

c_13

Stiffness tensor, 13-component

N/m<sup>dim-1</sup>

c_22

Stiffness tensor, 22-component

N/m<sup>dim-1</sup>

c_23

Stiffness tensor, 23-component

N/m<sup>dim-1</sup>

c_33

Stiffness tensor, 33-component

N/m<sup>dim-1</sup>

calculator

ASE-calculator name

cbm

Conduction band minimum

eV

cbm_gw

Conduction band minimum (GW)

eV

cbm_hse

Conduction band minimum (HSE)

eV

cell_area

Area of unit-cell

Ang<sup>2</sup>

charge

Net charge in unit cell

|e|

class

Material class

cod_id

COD id of parent bulk structure

crystal_prototype

Crystal prototype

dE_zx

Magnetic anisotropy energy between x and z axis

meV/unit cell

dE_zy

Magnetic anisotropy energy between y and z axis

meV/unit cell

dipz

Out-of-plane dipole

e * Ang

dir_gap_gw

Direct band gap (GW)

eV

dir_gap_hse

Direct band gap (HSE)

eV

doi

Monolayer reported DOI

dos_at_ef_nosoc

Density of states at the Fermi energy w/o soc.

states/eV * unit cell

dos_at_ef_soc

Density of states at the Fermi energy with soc.

states/eV * unit cell

dynamic_stability_level

Dynamic stability level

efermi

Fermi level

eV

ehull

Energy above convex hull

eV/atom

emass_cb_dir1

Conduction band effective mass in direction 1

m<sub>e</sub>

emass_cb_dir2

Conduction band effective mass in direction 2

m<sub>e</sub>

emass_vb_dir1

Valence band effective mass in direction 1

m<sub>e</sub>

emass_vb_dir2

Valence band effective mass in direction 2

m<sub>e</sub>

energy

Total energy

eV

evac

Vacuum level

eV

evacdiff

Vacuum level shift

eV

fmax

Maximum force

eV/Ang

folder

Relative path to original folder

formula

Chemical formula

gap

Band gap

eV

gap_dir

Direct band gap

eV

gap_dir_nosoc

Direct gap without soc.

eV

gap_gw

Band gap (GW)

eV

gap_hse

Band gap (HSE)

eV

hform

Heat of formation

eV/atom

icsd_id

ICSD id of parent bulk structure

id

Uniqe row ID

is_magnetic

Material is magnetic

magmom

Magnetic moment

au

magstate

Magnetic state

mass

Sum of atomic masses in unit cell

au

minhessianeig

Minimum eigenvalue of Hessian

eV/Ang<sup>2</sup>

pbc

Periodic boundary conditions

plasmafrequency_x

2D plasma frequency (x)

eV/Ang<sup>0.5</sup>

plasmafrequency_y

2D plasma frequency (y)

eV/Ang<sup>0.5</sup>

smax

Maximum stress on unit cell

eV/Ang<sup>3</sup>

spacegroup

Space group

speed_of_sound_x

Speed of sound (x)

m/s

speed_of_sound_y

Speed of sound (y)

m/s

spgnum

Space group number

spin_axis

Magnetic easy axis

stoichiometry

Stoichiometry

thermodynamic_stability_level

Thermodynamic stability level

uid

Unique identifier

unique_id

Random (unique) ID

user

Username

vbm

Valence band maximum

eV

vbm_gw

Valence band maximum (GW)

eV

vbm_hse

Valence band maximum (HSE)

eV

volume

Volume of unit cell

Ang<sup>3</sup>

workfunction

Work function

eV

Example

The following python script shows how to plot the positions of the VBM and CBM.

# creates: band-alignment.png
from math import floor
import numpy as np
import matplotlib.pyplot as plt
import ase.db

# Connect to database
db = ase.db.connect('c2db.db')

rows = db.select('gap>0,class=TMDC-H', sort='gap')

labels = []
vbms = []
cbms = []
for row in rows:
    M, X = row.symbols[:2]
    label = M + X + '$_2$'
    labels.append(label)
    vbms.append(row.vbm)
    cbms.append(row.cbm)

x = np.arange(len(vbms)) + 0.5
emin = floor(min(vbms)) - 1.0

# With and height in pixels
ppi = 100
figw = 800
figh = 400

fig = plt.figure(figsize=(figw / ppi, figh / ppi), dpi=ppi)
ax = fig.add_subplot(1, 1, 1)
ax.bar(x, np.array(vbms) - emin, bottom=emin)
ax.bar(x, -np.array(cbms), bottom=cbms)
ax.set_xlim(0, len(labels))
ax.set_ylim(emin, 0)
ax.set_xticks(x)
ax.set_xticklabels(labels, rotation=90, fontsize=10)

plt.title("2H-TMD's: Positions of VBM and CBM (PBE+SOC)", fontsize=12)
plt.ylabel('Energy relative to vacuum [eV]', fontsize=10)
plt.tight_layout()
plt.savefig('band-alignment.png')

This produces the figure

../_images/band-alignment.png

Tools for creating the “Computational 2D materials” database

Requirements

Workflow

The workflow for each material is described in the workflow.py file:

"""Workflow for C2DB project."""
from myqueue.task import task
from pathlib import Path
from asr.core import read_json
from ase.io import read
import numpy as np


def is_thermodynamically_stable():
    ch = read_json("results-asr.convex_hull.json")
    hform = ch["hform"]

    if hform > 0.2:
        return False
    return True


def is_stable_material():
    ph = read_json("results-asr.phonons.json")
    if ph["minhessianeig"] < -1e-5:
        return False

    st = read_json("results-asr.stiffness.json")
    if np.min(st["eigenvalues"].real) < 0:
        return False

    return True


def all_exists(lst):
    return all([Path(fl).is_file() for fl in lst])


def create_tasks():
    tasks = []
    files = []
    atoms = read("structure.json")

    def append(*args, **kwargs):
        name = kwargs.get("name") or args[0]
        if "creates" not in kwargs:
            kwargs["creates"] = [f"results-{name}.json"]
        tasks.append(task(*args, **kwargs))
        files.extend(kwargs["creates"])

    append("asr.relax", resources="40:5h")
    append("asr.structureinfo", resources="1:10m",
           deps=["asr.relax"])
    append("asr.gs", resources="40:5h",
           deps=["asr.relax"])
    append(
        "asr.convex_hull ../../../../oqmdreferences.db "
        "../../../../c2dbreferences.db",
        name="asr.convex_hull",
        resources="1:10m",
        deps=["asr.gs"],
    )

    if not is_thermodynamically_stable():
        return tasks

    append("asr.phonons", restart=3, resources="40:8h", deps=["asr.gs"])
    # Mini workflow for stiffness
    if not Path("results-asr.stiffness.json").is_file():
        append(
            "asr.setup.strains",
            resources="1:10m",
            creates=["results-asr.setup.strains.json"],
        )

        strainfolders = Path().glob("strains*")
        for strainfolder in Path().glob("strains*"):
            append(
                "asr.relax",
                folder=strainfolder,
                resources="40:3h",
                creates="results-asr.relax.json",
                deps=["../asr.setup.strains"],
            )

        append(
            "asr.stiffness",
            resources="1:10m",
            creates=["results-asr.stiffness.json"],
            deps=(
                [f"{strainfolder}/asr.relax" for strainfolder in strainfolders]
                + ["asr.setup.strains"]
            ),
        )

    if not all_exists(files):
        return tasks

    if not is_stable_material():
        return tasks

    append(
        "asr.bandstructure",
        resources="40:5h",
        creates=["results-asr.bandstructure.json"],
        deps=["asr.gs"],
    )
    append(
        "asr.projected_bandstructure",
        resources="1:10m",
        creates=["results-asr.projected_bandstructure.json"],
        deps=["asr.bandstructure"],
    )
    append(
        "asr.polarizability",
        resources="40:20h",
        creates=["results-asr.polarizability.json"],
        deps=["asr.gs"],
    )
    append(
        "asr.pdos",
        resources="40:5h",
        creates=["results-asr.pdos.json"],
        deps=["asr.gs"],
    )

    gsresults = read_json("results-asr.gs.json")
    gap = gsresults.get("gap")

    # If there is a band gap
    if gap > 0.01:
        append(
            "asr.emasses",
            resources="40:5h",
            creates=["results-asr.emasses.json"],
            deps=["asr.gs"],
        )
        append(
            "asr.borncharges",
            resources="40:5h",
            creates=["results-asr.borncharges.json"],
            deps=["asr.gs"],
        )
        append(
            "asr.infraredpolarizability",
            creates=["results-asr.infraredpolarizability.json"],
            deps=["asr.borncharges", "asr.phonons", "asr.polarizability"],
        )
        append(
            "asr.hse", resources="40:10h", creates=["results-asr.hse.json"]
        ),

        if len(atoms) < 5:
            append(
                "asr.gw", resources="40:20h", creates=["results-asr.gw.json"]
            )
    else:
        append(
            "asr.fermisurface",
            resources="1:10m",
            creates=["results-asr.fermisurface.json"],
            deps=["asr.gs"],
        )
        append(
            "asr.plasmafrequency",
            resources="40:5h",
            creates=["results-asr.plasmafrequency.json"],
            deps=["asr.gs"],
        )

    return tasks

As an example, let’s do MoS\(_2\) in the CdI2 prototype (T-phase). Create a main folder and a subfolder:

$ mkdir TMD
$ cd TMD
$ mkdir MoS2-CdI2

Create a structure.json file containing something close to the groundstate structure:

$ python3
>>> from ase.build import mx2
>>> a = mx2('MoS2', '1T', a=3.20, thickness=3.17, vacuum=7.5)
>>> a.write('MoS2-CdI2/structure.json')

Start the workflow with:

$ mq workflow ~/cmr/docs/c2db/workflow.py MoS2-CdI2/

Note

The \(mq\) tool is described here

Once the first part of the workflow has finished, one or more folders will appear (nm/, fm/, afm/) if the material was thermodynimically stable. You can then run the remaining part of the workflow:

$ mq workflow ~/cmr/docs/c2db/workflow.py MoS2-CdI2/*m/

When everything is ready you can collect the results in a database file and inspect the results in a web-browser:

$ python3 -m asr.database.fromtree MoS2-CdI2/*m/
$ python3 -m asr.app