OLED workflows¶
Starting with the 2022 release of the Amsterdam Modeling Suite we include a set of workflow scripts for multiscale OLED modeling. These workflows are developed and validated in close collaboration with Simbeyond to bridge the gap between ab-initio atomistic modeling of OLED molecules with AMS, and device level kinetic Monte Carlo simulations using Simbeyond’s Bumblebee code. Together with Simbeyond, we attempt to provide a fully integrated multiscale simulation platform for the digital screening and prediction of successful OLED materials and devices.

The Amsterdam Modeling Suite implements the atomistic simulation part of this multiscale toolchain in the form of two workflow scripts:

- Deposition
- The first step simulates the growth of a thin film in a molecular dynamics and force-bias Monte Carlo calculation mimicking physical vapor deposition.
- Properties
- In the second step the morphology resulting from the deposition is used to obtain the distributions (and possibly spatial correlations) of molecular properties such as ionization potential, electron affinity and exciton energies at the DFT level. Each molecule’s environment is taken into account in a polarizable QM/MM scheme using the DRF model.
The output of the Properties workflow is an HDF5 file containing a summary of the results for a material. This file can be opened in AMSview for a visualization of the results, but also directly imported into Simbeyond’s Bumblebee code to use it in simulations at the device level.
This manual page describes the technical details and options of the OLED workflow scripts. For a more hands-on introduction, you may want to start with the GUI tutorial, that will guide you through the entire workflow using the hole transport material β-NPB as an example.
Note
The OLED workflow scripts use ADF and DFTB. In addition to the Advanced Workflows and Tools license, you will therefore also need a license for ADF and DFTB in order to use the OLED workflows.
Deposition¶
The deposition workflow implements a series of mixed molecular dynamics and force-bias Monte Carlo calculations to simulate the growth of a thin film with physical vapor deposition.
The molecule gun is used to shoot molecules at the substrate. Upon reaching the surface, the force-bias Monte Carlo method is used to accelerate the search for favorable adsorption sites. This process is repeated until a thin film of a user-defined thickness has grown on the substrate.
To make this process computationally more efficient, the deposition happens in so called “cycles”. At the end of each deposition cycle, the bulk material at the bottom of the growing film is “trimmed off” and stored. Only the two top layers (each about 10 Å thick) are transferred to the next deposition cycle, where the lower of the two layers is frozen. This ensures that the trimmed off parts of the system fit perfectly together when the system is reassembled in the end of the simulation. By depositing in cycles we avoid simulating a lot of bulk material and are able to make the total computational cost linear in the thickness of the deposited film.
At the end of the simulation the layer deposited by the individual cycles are stacked and a short molecular dynamics calculation on the entire film is used to anneal it from the deposition temperature down to 300K at ambient pressure.
An entire deposition with 6 deposition cycles (and the final equilibration to room temperature) is shown in the video on the right.
Basic input¶
The minimal input to the deposition workflow just specifies what to deposit:
#!/bin/sh
DEPOSITION_JOBNAME=myDeposition $AMSBIN/oled-deposition << EOF
Molecule
SystemName myMol
End
System myMol
...
End
EOF
The Molecule
block is only really used when depositing mixed molecule materials, e.g. host-guest systems. This will be explained in a separate section below. For a single molecule deposition there should just be one Molecule
block that references the only System
block by name via the SystemName
keyword, as shown in the example above.
The System
block used by the OLED deposition script closely follows the System
block in the input for the AMS driver, but supports only a subset of the keywords:
System
Type: Block Recurring: True Description: Specification of the chemical system. For some applications more than one system may be present in the input. In this case, all systems except one must have a non-empty string ID specified after the System keyword. The system without an ID is considered the main one. Atoms
Type: Non-standard block Description: The atom types and coordinates. Unit can be specified in the header. Default unit is Angstrom. GeometryFile
Type: String Description: Read the geometry from a file (instead of from Atoms and Lattice blocks). Supported formats: .xyz BondOrders
Type: Non-standard block Description: Defined bond orders. Each line should contain two atom indices, followed by the bond order (1, 1.5, 2, 3 for single, aromatic, double and triple bonds) and (optionally) the cell shifts for periodic systems. May be used by MM engines and for defining constraints. If the system is periodic and none of the bonds have the cell shift defined then AMS will attempt to determine them following the minimum image convention.
Just like in the AMS driver, as an alternative to the System
block, you an also use the LoadSystem
block to load a system directly from a .rkf
file of a previous calculation.
The deposition workflow uses the ForceField engine for the molecular dynamics simulation of the physical vapor deposition. In order to also support the deposition of metal containing compounds, we use the UFF force field with the UFF4MOF-II parametrization for the deposition. As with any calculation with the ForceField engine you may manually provide (UFF4MOF-II) atom-types, atomic charges and bond orders in the input file:
System
Atoms
C [...] ForceField.Type=C_R ForceField.Charge=-0.1186
N [...] ForceField.Type=N_R ForceField.Charge=-0.2563
H [...] ForceField.Type=H_ ForceField.Charge=+0.1021
[...]
End
BondOrders
1 2 1.0
1 5 1.5
1 6 1.5
[...]
End
End
Whatever is not specified in the input will automatically be determined: the input system is optimized with ADF using the S12g exchange-correlation functional with a TZP basis set. At the optimized geometry, the Charge Model 5 is used to calculate the atomic charges, while the rounded Nalewajski-Mrozek bond orders determine the topology. See the ADF manual for details on the calculation of charges and bond orders. Finally, using the topology determined by the calculated bond orders, the automatic UFF atom-typing that is built into the ForceField engine is used to determine the atom-types.
If you want to make sure the correct atom-types and bonds are used in your calculation, we recommend building the system in AMSinput, where you can visually check the bond orders and atom-types to make sure they are correct.
The result can then be exported into a file as a System
block via File → Export coordinates → .in.
For the atomic charges we recommend relying on the automatic calculation with ADF. (Just make sure the ForceField.Charge
suffixes are not included in the atom block. Their absence will trigger the automatic charge calculation with ADF.)
By default a box of 60 x 60 x 120 Å is deposited. The first two dimensions give the surface area of the deposited layer, while the third dimension is the thickness of the layer.
The size of the deposited box can be changed using the Size
keyword in the Box
block:
Box
Size 60 60 120
End
Box
Type: Block Description: Specifications of the box into which the material is deposited. Size
Type: Float List Default value: [60.0, 60.0, 120.0] Unit: Angstrom GUI name: Box size Description: Specify the desired size of the box. The final deposited box may have a different size. The x- and y-axis are perpendicular to the direction of deposition, so these may be regarded as the width of the growing layer. The z-axis is the direction along which the deposition happens, so this determines the thickness of the deposited layer. Note that the x- and y-axis will be ignored if a custom substrate is used: the are of the box is then determined by the lattice of the substrate. The z-axis can still be freely chosen, but should be large enough that there is enough space for the substrate itself and to deposit more molecules on top of it.
With sizes typical for molecules used in OLED devices, the default box size results in a deposition of ~500 molecules. Note that the computational time of a deposition scales linearly with the thickness of the layer, but quadratically with the surface area. This is because a larger area requires both the deposition of more molecules to fill the box, but also makes each MD step more expensive as more molecules have to be simulated at the same time. When increasing the thickness of the layer, molecules at the bottom are first frozen, and later removed from the simulation altogether, giving an overall linear scaling.
The temperature at which the deposition is performed can be configured in the Deposition
section.
Deposition
Temperature float
End
Deposition
Type: Block Description: Specifies the details of how molecules are deposited. Temperature
Type: Float Default value: 600.0 Description: The temperature at which the deposition happens.
Finally, there are a couple more technical options in the Deposition
section, that we suggest to leave at their default values.
Deposition
Frequency integer
TimeStep float
ConstrainHXBonds Yes/No
NumMolecules integer
End
Deposition
Type: Block Description: Specifies the details of how molecules are deposited. Frequency
Type: Integer Default value: 10000 Description: The frequency in MD steps at which new molecules will be added to the system. TimeStep
Type: Float Default value: 1.0 Unit: Femtoseconds Description: The time difference per step. ConstrainHXBonds
Type: Bool Default value: Yes GUI name: Constrain H-* bonds Description: Constrain the bond length for all H-* bonds (i.e. any bond to a hydrogen atom). Doing this allows choosing a larger time step. If this option is disabled, the TimeStep needs to be reduced manually. NumMolecules
Type: Integer Description: The number of molecules that we will try to deposit. If not specified the number will be determined automatically such that the box becomes approximately full.
Output¶
Running the oled-deposition
workflow script creates a single directory in which you can find all results of a deposition.
By default this directory is named deposition.workdir
, but in order to avoid name clashes, that location can be changed with the DEPOSITION_WORKDIR
environment variable, similar to AMS_JOBNAME
for the AMS driver. The example below will collect all results in the directory myMol.workdir
:
#!/bin/sh
DEPOSITION_WORKDIR=myMol $AMSBIN/oled-deposition << EOF
...
EOF
Let us go through all files and folders in the working directory in the order in which they are created.
Firstly, the working directory contains a logfile
.
The contents of the logfile are identical to what you see on standard output when running the oled-deposition
workflow.
The deposition workflow starts with a couple of calculations on single molecules in vacuum. Each of them runs in a separate folder, in which you can find the usual AMS output files (such as ams.rkf
):
dft_opt/
ff_opt/
equilibrate_ff_input_molecule/
The dft_opt
directory contains the results of the initial geometry optimization with ADF, which is used to determine the atomic charges and bond orders if these were not specified in the input. The ff_opt
directory contains the results of a subsequent geometry optimization using the ForceField engine with the UFF4MOF-II forcefield. In this step the atom-types are determined if they were not specified in the input already. Finally in the equilibrate_ff_input_molecule
directory a short MD simulation at the deposition temperature is performed to equilibrate the molecule to the desired temperature. We suggest visualizing the trajectory of this equilibration in AMSmovie to make sure the molecule does not undergo unexpected conformational changes that could be caused by wrong atom-types or bonds. If the molecule behaves strangely (or falls apart) at this point, one may need to go back and assign atom-types and bonds manually in the input.
When depositing mixtures you will see multiple instances of the three directories above: one for each deposited species.
Once all the preparatory work is done, the actual deposition cycles each write a folder and (upon completion of the cycle) two files:
depo_cycle_1/
depo_box.1.in
depo_box.1.xyz
You can follow the progress of your deposition by opening the ams.rkf
in the last depo_cycle_*/
directory.
The depo_box.*.in
and depo_box.*.xyz
files contain the entire morphology deposited so far: by visualizing them in order you can watch your material grow!
Important
The files with the .in
extension contain the System geometry in form of a System block. This format contains bond orders, force field atom-types as well as atomic charges. It can be opened in AMSinput and PLAMS and should be the preferred format when working with the OLED workflow scripts in AMS. The .xyz
file is in extended XYZ format does not contain that extra information. Always use a .in
file when transferring a system from one script to the next, e.g. when going from the OLED deposition to the OLED properties workflow.
Once all molecules have been deposited the entire box is annealed from the deposition temperature down to room temperature. This creates one directory and (upon completion) a .in
and .xyz
file containing the annealed morphologies:
equilibrate_box/
equil_box.in
equil_box.xyz
The last step is to take the room temperature morphology and perform a geometry optimization on it.
This essentially removes all thermal vibrations and results in a geometry that is relaxed at the force field level.
As you might expect, the last step also produces a folder and (upon completion) a .in
and .xyz
file:
optimize_box/
opt_box.in
opt_box.xyz
It is up to the user to decide whether to continue to the OLED properties workflow with the morphology from equil_box.in
(equilibrated to 300K) or opt_box.in
file (fully relaxed). (We recommend using the fully relaxed morphology though.)
Deposition of host-guest materials¶
A deposition of host-guest materials can easily be done by specifying multiple Molecule
and System
blocks in the input. The following runscript generates a 95% to 5% mixture (by number of molecules) of two compounds:
#!/bin/sh
DEPOSITION_JOBNAME=host_guest $AMSBIN/oled-deposition << EOF
Molecule
SystemName myHost
MoleFraction 0.95
End
Molecule
SystemName myGuest
MoleFraction 0.05
End
System myHost
...
End
System myGuest
...
End
EOF
Molecule
MoleFraction float
SystemName string
End
Molecule
Type: Block Recurring: True GUI name: Molecules Description: Specification of the molecule to be deposited. MoleFraction
Type: Float Default value: 1.0 GUI name: Molar fraction Description: The relative occurrence of the molecule with regard to other deposited species. Only relevant for mixed molecule depositions. SystemName
Type: String GUI name: Molecule Description: String ID of a named [System] to be inserted. The lattice specified with this System, if any, is ignored and the main system’s lattice is used instead.
You can have an arbitrary number of Molecule
blocks in your input to deposit multi-component mixtures. Obviously, the box your are depositing must be large enough that it still contains at least a few molecules of the rarest component.
Note that multiple Molecule
and System
blocks can also be used to deposit different conformers of the same compound. While conformational changes can in principle happen over the course of the MD simulation, it may be a good idea to deposit a mixture of conformers directly if their geometries are very different.
Deposition of interfaces¶
By default the deposition will use a single graphene layer as a substrate.
The graphene layer is removed after the first deposition cycle and will not be included in the output morphologies, i.e. the .in
files in the working directory.
Note that the graphene layer is not present in the annealing of the entire morphology from deposition temperature to 300K, which is performed at the end of the workflow.
The result of this is that both the bottom and top of the deposited thin-film by default represents an interface between the material and a vacuum.
Instead of depositing on a clean graphene sheet, the deposition workflow also supports custom substrates.
This is intended to be used for depositing a thin film of one material on top of another material and allows users to study the interface between the two.
A custom substrate is set up using the Substrate
and SubstrateSystem
keys in the Box
block.
Box
Substrate [Graphene | Custom]
SubstrateSystem string
End
Box
Type: Block Description: Specifications of the box into which the material is deposited. Substrate
Type: Multiple Choice Default value: Graphene Options: [Graphene, Custom] Description: The substrate on which to grow the layer. SubstrateSystem
Type: String GUI name: Custom substrate Description: String ID of a named [System] to be used as a substrate. (This is only used when the Substrate key is set to Custom.)
Here the value of the SubstrateSystem
refers to a named System
block in the input, representing the geometry of the substrate. The following example shows how to deposit a molecule B on top of a substrate of molecule A:
#!/bin/sh
DEPOSITION_JOBNAME=molB_on_molA $AMSBIN/oled-deposition << EOF
Molecule
SystemName molB
End
System molB
...
End
Box
Size 0 0 240
Substrate Custom
SubstrateSystem molA_substrate
End
System molA_substrate
Atoms
...
End
BondOrders
...
End
Lattice
...
End
End
EOF
The contents of the block System molA_substrate
should be obtained by first running a deposition of molecule A: just use the System
block found in e.g. the equil_box.in
file of that deposition as the custom substrate for the next job.
(Note that no attempt will be made to automatically determine atomic charges, bond orders, or force-field atom types for the molecules in the substrate.
Taking the System
block from the results of an earlier deposition is the easiest way ensure you are using exactly the same bonds, atom types and charges for the substrate molecules in the new calculation.)
Warning
The custom substrate option can currently not be used to deposit thin films on top of crystalline materials. The substrate must consist of individual molecules and be >20 Å thick, so that it can be split into a frozen (lower) and thermostatted (upper) layers.
Note that the Box%Size
in the x- and y-direction is ignored when using a custom substrate: the size of the custom substrate is used instead. The thickness of the layer can be set manually when using a custom substrate, but it needs to accommodate both the already existing substrate as well as the newly grown film on top. Assume that the thickness of the substrate film is 120 Å in the example above. By setting the the z-value of the Box%Size
to 240 Å, we will have space to accommodate the substrate and then grow another layer of 120 Å thickness on top of it. Note that while the default graphene layer is removed from the morphology, a custom substrate will be included in the morphology.
Restarting a deposition¶
The OLED workflow scripts are based on the PLAMS scripting framework. As such it can rely on the PLAMS rerun prevention to implement restarting of interrupted depositions.
The easiest way to restart a deposition is to include the --restart
(or short: -r
) command line flag:
#!/bin/sh
DEPOSITION_JOBNAME=myDeposition $AMSBIN/oled-deposition --restart << EOF
...
EOF
This first (interrupted) run will have created the myDeposition.workdir
directory. Running the above script again will move that directory to myDeposition.workdir.res
and reuse all successful jobs from the first run. (People already familiar with PLAMS will recognize that this works just like the -r
flag on the PLAMS launch script.) Note that this does not restart the previous deposition precisely at the point where it was interrupted. Instead it restarts from the beginning of the last deposition cycle.
When running a deposition workflow on a batch system such as SLURM, you may want to consider always including the --restart
flag in your runscript. It is not a problem if there are no previous results to restart from, but in case your job gets interrupted and automatically rescheduled, the --restart
flag will make sure that it continues (approximately) where it stopped.
There is also the RestartWorkdir
keyword in the input file:
#!/bin/sh
DEPOSITION_JOBNAME=newDepo $AMSBIN/oled-deposition << EOF
RestartWorkdir oldDepo.workdir
...
EOF
RestartWorkdir
Type: String Description: Uses the data from the working directory of a previously run deposition workflow for restarting. Under the hood this uses the normal rerun-prevention available in PLAMS: it may reuse results from old jobs instead of running them again.
While this can be used to accomplish the same thing the --restart
flag would do, its best use is to specify a RestartWorkdir
of a previous deposition of the same molecules. This can save you the initial step of doing the DFT calculations in order to determine the atomic charges and bonds. A perfect use it when you have already deposited a mixture, and later decide to change the ratio between the compounds: by specifying the working directory of the first deposition the initial DFT calculations can be skipped entirely.
Properties¶
The properties workflow is used to obtain distributions (and possibly spatial correlations) of molecular properties such as ionization potential and electron affinity from the morphology. To accomplish this, it will perform DFT calculations on all individual molecules from the morphology, taking their environment into account in QM/MM calculation.
The exact workflow (with all default settings) is as follows:
- For each molecule in the box, do a quick DFT calculation with LDA and a DZP basis and use the MDC-D charge model to determine atomic charges. These charges will be used for the electrostatic part of the embedding potential in the next step.
- For each molecule in the box:
- Determine which other molecules to consider as the environment. By default all molecules within 15 Å (atom-atom distance) are considered.
- Individually, for neutral molecule, cation, and anion:
- Optimize geometry of central QM molecule in frozen MM environment using GFN1-xTB and UFF4MOF-II with electrostatic embedding in the Hybrid engine.
- Do a DFT single point on the optimized geometry using PBE and an all-electron TZ2P basis. The environment is taken into account using a polarizable DRF embedding. (For the neutral systems exciton energies and transition dipole moments are also computed with TD-DFT.)
- Calculate the (approximately) adiabatic ionization potential and electron affinity from the differences in total energy with respect to the neutral system.
- For all pairs of neighboring molecules (within 4 Å atom-atom distance of each other) calculate the electron and hole charge transfer integrals with GFN1-xTB.
What is described above is the workflow with all default settings. Various aspects of this (such as the ranges) can be tweaked from the input, see the Settings section below.
Warning
The calculation of exciton properties and transfer integrals is in a very early state. We have not verified their accuracy against experiment, and expect both the excitation energies as well as the transfer integrals to be severely underestimated in AMS2021.1. We will improve the calculation of exciton properties and transfer integrals in the future.
Basic input¶
The simplest possible input for the oled-properties
workflow script is just a single System
block.
#!/bin/sh
$AMSBIN/oled-properties << EOF
System
Atoms
...
End
Lattice
...
End
[BondOrders
...
End]
End
EOF
Obviously, the Atoms
and Lattice
blocks are required, while the BondOrders
block is optional.
If the bond orders are present, they will be used to determine which parts of the system are connected, which ultimately determines which sets of atoms are considered distinct molecules.
If the BondOrders
block is not present, the bonds will be guessed.
Since we only care about which atoms are bonded at all, and not on details such as the bond order, this should work quite reliably.
Nevertheless, if the morphology was obtained with the AMS deposition workflow, we can use the fact that it writes out the morphology as a .in
file containing exactly the System
block we need.
Basically, we use the System
block from e.g. the opt_box.in
output file of the deposition as the input for the properties script.
#!/bin/sh
$AMSBIN/oled-deposition << EOF
... see oled-deposition manual page ...
EOF
$AMSBIN/oled-properties < deposition.workdir/opt_box.in
This has the advantage that the bonds are guaranteed to be transferred without change between the two workflows.
Output¶
Working directory¶
Running the oled-properties
workflow script creates a single directory in which you can find all results of the calculation.
By default this directory is named properties.workdir
, but in order to avoid name clashes, that location can be changed with the PROPERTIES_WORKDIR
environment variable, similar to AMS_JOBNAME
for the AMS driver. The example below will collect all results in the directory myMaterial.workdir
:
#!/bin/sh
PROPERTIES_WORKDIR=myMaterial $AMSBIN/oled-properties << EOF
...
EOF
This will create the myMaterial.workdir
directory with roughly the following internal structure:
myMaterial.workdir/
├── logfile
├── atomic_charges
│ ├── 0/
│ │ ├── adf.rkf
│ │ ├── ams.log
│ │ └── ...
│ ├── 1/
│ │ ├── adf.rkf
│ │ ├── ams.log
│ │ └── ...
│ └── .../
└── properties/
├── relax_0/
│ ├── ams.rkf
│ ├── ams.log
│ └── ...
├── 0/
│ ├── adf.rkf
│ ├── ams.log
│ └── ...
├── relax_0_-1/
│ ├── ams.rkf
│ ├── ams.log
│ └── ...
├── 0_-1/
│ ├── adf.rkf
│ ├── ams.log
│ └── ...
├── relax_0_1/
│ ├── ams.rkf
│ └── ...
├── 0_1/
│ ├── adf.rkf
│ ├── ams.log
│ └── ...
├── .../
└── summary.hdf5
The atomic_charges
directory contains the results from the intial pass over all molecules, in which the atomic charges are determined with a quick DFT calculations.
These charges are later be used for the electrostatic part of the embedding.
The directory will be missing if you did not use DFT
as the setting for the Embedding%Charges
keyword.
The properties
directory contains the results from the second pass over all molecules.
The first number in the name of the subdirectories is again the ID of the molecule (starting from zero).
This is followed by the total charge for the calculations on the ions.
The QM/MM geometry optimizations used to obtain approximate equilibrium structures follow the same naming scheme, with the added relax_
prefix.
If you choose not to relax (ion) geometries by setting the Relax
keyword to None
(or Neutral
), the relax_*
folders (or at least some of them) may be missing.
Data on the HDF5 file¶
I addition to the full output of all individual calculations, you will also get a small HDF5 file called summary.hdf5
containing a summary of the results of your calculations.
These are generally just the results that are usually interesting for the design of OLED materials, such as site energies, exciton energies, (transition) dipole moments, etc.
This file can be imported into Simbeyond’s Bumblebee code to use your calculated material in a device level kinetic Monte Carlo simulation.
The following groups and datasets can be found on the HDF5 file.
Note that all arrays on the HDF5 file are indexes starting from zero.
The species
group contains information about the different molecular species making up the morphology.
There are two arrays in the species
group whose size is equal to the number of different species (numSpecies
):
species.name
- An array of human readable names identifying the molecular species making up the morphology. Currently this is just the molecular formula in Hill notation.
species.smiles
- An array of SMILES strings for the different molecular species. May contain a dummy value in case the determination of the SMILES string from the 3D structure fails for a species.
The molecules
group contains the complete geometrical description of the morphology.
It contains a number of arrays, (almost) all of which have the total number of molecules (numMolecules
) as their size:
molecules.species
- An array of integers containing the species a molecule in for of an index into the arrays in the
species
group. molecules.lattice
- (3 x 3) array containing the lattice vectors in Ångstrom.
molecules.position
- (
numMolecules
x 3) array containing the center of mass positions of all molecules in Ångstrom. Note that all center of mass positions are within the parallelepiped spanned by the lattice vectors, i.e. all fractional coordinates are in the [0,1] range. molecules.atoms
- This is an
numMolecules
sized 1D array, where each element itself is an array ofstring,float,float,float
tuples representingsymbol,x,y,z
. The x, y and z coordinates are given in Ångstrom. molecules.bonds
- This is an
numMolecules
sized 1D array, where each element itself is an array ofint,int,float
tuples representingatom1,atom2,bondOrder
. Hereatom1
andatom2
are indices into the corresponding element of themolecules.atoms
array. ThebondOrder
is a floating point number, where the value of1.5
is used to represent an aromatic bond.
The site energies are contained in the energies
group on the HDF5 file:
energies.IP
- A
numMolecules
sized array containing the first ionization potential for each molecule in eV. energies.EA
- A
numMolecules
sized array containing the first electron affinity for each molecule in eV. energies.HOMO
- A
numMolecules
sized array containing the Kohn-Sham orbital energy of the highest occupied orbital in eV. If requested via theNumAdditionalEnergies
keyword in the input of the properties workflow, more arrays of this type (HOMO-1
,HOMO-2
, …) may exist and contain the orbital energies of lower lying occupied orbitals. energies.LUMO
- A
numMolecules
sized array containing the Kohn-Sham orbital energy of the lowest unoccupied orbital in eV. If requested via theNumAdditionalEnergies
keyword in the input of the properties workflow, more arrays of this type (LUMO+1
,LUMO+2
, …) may exist and contain the orbital energies of higher lying virtual orbitals.
Similarly the exciton energies (in eV) can be found in the exciton_energies
group. If the calculation of exciton energies was disabled by setting NumExcitations
to 0
in the input, this information is not present.
exciton_energies.S1
- Energies of the first excited singlet state (S1) with respect to the ground state. Higher singlet excitation energies may be found in more arrays of this type (
S2
,S3
, …) if their calculation was requested by settingNumExcitations
to a value larger1
. exciton_energies.T1
- Energies of the first excited triplet state (T1) with respect to the ground state. Higher triplet excitation energies may be found in more arrays of this type (
T2
,T3
, …) if their calculation was requested by settingNumExcitations
to a value larger1
.
Static dipole moments and transition dipole moments (in Debye) can be found in their respective groups:
static_multipole_moments.dipole_moment
- (
numMolecules
x 3) array containing the dipole moment vectors for each molecule. transition_dipole_moments.S1_S0
- (
numMolecules
x 3) array containing the transition dipole moment vectors for the S0 → S1 transition for each molecule. Transition dipole moments for higher singlet excitations may be found in more arrays of this type (S2_S0
,S3_S0
, …) if their calculation was requested by settingNumExcitations
to a value larger1
.
If the calculation of transfer integrals is requested with the TransferIntegrals%Type
key in the input, the pairs
and transfer_integrals
groups will also be available on the HDF5 file, containing the following datasets:
pairs.indices
- A (
numPairs
x 2) array of integers containing the molecule indices for all pairs of molecules that were considered close enough to trigger the calculation of transfer integrals between them. transfer_integrals.electron
- A
numPairs
sized array containing the transfer integral (in eV) for electrons between each pair. transfer_integrals.hole
- A
numPairs
sized array containing the transfer integral (in eV) for holes between each pair.
Accessing the HDF5 file¶
The easiest way to view the data from the HDF5 file is to open it in the GUI using the AMSview module. There you can easily plot histograms of all the calculated properties, but also visualize the spacial distribution of the properties.
For more custom built analysis, the HDF5 file can easily be opened from Python using the h5py library, which is included in the AMS Python Stack. The following code snippet shows how to calculate the mean and standard deviation of the ionization potential:
import h5py
with h5py.File("summary.hdf5", "r") as f:
IPs = f['energies']['IP'].value
print("IP = ", IPs.mean(), "±" , IPs.std())
The above snippet is only suitable for calculations of pure compounds, as we are calculating the mean and standard deviation over all molecules, not taking their species into account.
For mixtures calculating these properties per species would be much more useful.
This can easily be accomplished by using an appropriate mask on the IPs
array for the calculation of mean and standard deviation:
import h5py
import numpy as np
with h5py.File("summary.hdf5", "r") as f:
IPs = f['energies']['IP'].value
speciesIDs = f['molecules']['species'].value
for specID, specName in enumerate(f['species']['name']):
mask = (speciesIDs==specID) & (~np.isnan(IPs))
print(specName)
print("IP = ", IPs[mask].mean(), "±" , IPs[mask].std())
Note how we also use the mask to exclude all NaN
elements in the array from the calculation of the mean and standard deviation.
Occasional NaN
values in the arrays on the HDF5 file indicate that a property could not be calculated for a molecule because the job for it crashed or failed in some other way.
This is not a problem as long as it happens only rarely, but the NaN
values need to be excluded from the analysis.
Parallelization¶
As you can imagine, the properties workflow is computationally quite expensive. After all, we are doing hundreds of (TD-)DFT calculations on relatively large molecules.
Luckily all the calculations on the different molecules are independent from each other, and can therefore run in parallel.
The workflow scripts supports different methods of parallelization through the JobRunner
keyword.
JobRunner
Type: String Default value: local:*,4 Description: Configures how the jobs will be executed. • local:N,M
: Run the jobs locally. HereN
is the number of jobs to run in parallel, andM
is the number of CPU cores used by each job. The total number of CPU cores used will be the product ofN
andM
. Note thatN
orM
can be replaced by the asterisk as a wildcard. In that case the missing number will be automatically determined such that in total$NSCM
CPU cores will be utilized. If$NSCM
is not set, the entire machine will be utilized. •batch_system:submit_cmd
: Submit the individual jobs to a batch system. Example:slurm:sbatch -p mars -N 1 -n 4
will submit each job with 4 tasks/cores on 1 node to themars
partition of a SLURM batch system. Please refer to the PLAMS GridRunner documentation for a list of supported batch systems.
Local job execution¶
The simplest option (local
) is to run the job on the machine that also executes the workflow script itself.
This is a good option if you have access to a powerful machine with many CPU cores, on which you can run jobs directly (i.e. not through a batch system).
By default 4 cores will be used for the execution of each job, and enough jobs will be run in parallel to saturate the entire machine:
JobRunner local:*,4
See above for a detailed description of the local
option.
Job submission to a batch system¶
If you have access to a cluster through a batch system, it is also an option to run the workflow scripts and the actual jobs on different machines.
The workflow script then submits the individual jobs to the batch system and waits for them to finish.
(Under the hood, this is based on the PLAMS GridRunner.)
The workflow script itself can then either run under a terminal multiplexer (e.g. GNU screen) on the login node of the cluster, or be submitted as a simple 1 core job to the batch system.
Note that it is essential that the workflow script keeps running until all jobs have finished, as the summary of the results into the HDF5 file only happens when all jobs have finished.
You will have to specify used batch systems, as well as the command used for the job submission with the JobRunner
keyword.
This gives you a lot of flexibility and allows to efficiently use the computational resources at hand.
The following example will submit 4 core, single node jobs to either the mars
, jupiter
or saturn
queue of a cluster, requesting 2 gigabytes of memory per used CPU core, with a maximum wall-time of 4 hours per job:
JobRunner slurm:sbatch -p mars,jupiter,saturn -N 1 -n 4 --mem-per-cpu=2G --time=04:00:00
The downside of this approach is that each job for an individual molecule might be waiting in the batch system’s queue before starting.
Note that it is currently not possible to submit the workflow script and molecule jobs together as a single, large job to a batch system. In other words it is not possible to request a large allocation from the batch system once, and then run the workflow script and all jobs within that allocation. (Support for this needs to be added to the PLAMS library, which will happen in the future.)
Additional settings¶
The OLED properties workflow script has a few options that determine what properties will be calculated and/or written to the HDF5 file file:
NumAdditionalEnergies integer
NumExcitations integer
TransferIntegrals
Cutoff float
Metric [CoM | Atoms | Atoms_noH]
Type [None | DFTB]
End
NumAdditionalEnergies
Type: Integer Default value: 1 Description: The number of additional orbital energies to write to the HDF5 file. A value of N means to write everything up to HOMO-N and LUMO+N.
NumExcitations
Type: Integer Default value: 1 Description: The number of exited states to calculate. By default the S_1 and T_1 states will be calculated. The calculation of excited states is currently only supported for systems with a closed-shell ground state.
TransferIntegrals
Type: Block Description: Configures the details of the calculation of electron and hole transfer integrals. Cutoff
Type: Float Default value: 4.0 Unit: Angstrom Description: Transfer integrals will be calculated for all molecule pairs within a cutoff distance from each other. This distance can be measured using different metrics, see the corresponding Metric
keyword.Metric
Type: Multiple Choice Default value: Atoms Options: [CoM, Atoms, Atoms_noH] Description: The metric used to calculate the distance between two molecules. • CoM: use the distance between the centers of mass of the two molecules. • Atoms: Use the distance between the two closest atoms of two molecules. • Atoms_noH: Use the distance between the closest non-hydrogen atoms of the two molecules. Type
Type: Multiple Choice Default value: DFTB Options: [None, DFTB] Description: The method used for the calculation of the transfer integrals. By default the transfer integrals are calculated with DFTB (using the GFN1-xTB) model Hamiltonian. Selecting None
skips the calculation of the transfer integrals altogether.
There are also a few options to tweak some aspects of the workflow. We have not properly tested their effect on the results. When changing these options, verify your results against calculations using all default settings.
Embedding
Charges [DFTB | DFT]
Cutoff float
Metric [CoM | Atoms | Atoms_noH]
Type [None | DRF]
End
Relax [None | Neutral | All]
OccupationSmearing [None | Ions | All]
Embedding
Type: Block Description: Configures details of how the environment is taken into account. Charges
Type: Multiple Choice Default value: DFT Options: [DFTB, DFT] Description: Which atomic charges to use for the DRF embedding. • DFTB: Use the self-consistent Mulliken charges from a quick DFTB calculation with the GFN1-xTB model. • DFT: Use the MDC-D charges from a relatively quick DFT calculation using LDA and a DZP basis set. Cutoff
Type: Float Default value: 15.0 Unit: Angstrom Description: The cutoff distance determining which molecules will be considered the environment of the central molecule. The maximum possible cutoff distance is half the length of the smallest lattice vector. The distance can be measured using different metrics, see the Metric
keyword.Metric
Type: Multiple Choice Default value: Atoms Options: [CoM, Atoms, Atoms_noH] Description: The metric used to calculate the distance between two molecules. • CoM: use the distance between the centers of mass of the two molecules. • Atoms: Use the distance between the two closest atoms of two molecules. • Atoms_noH: Use the distance between the closest non-hydrogen atoms of the two molecules. Type
Type: Multiple Choice Default value: DRF Options: [None, DRF] Description: The type of embedding used to simulate the molecular environment.
Relax
Type: Multiple Choice Default value: All Options: [None, Neutral, All] Description: Which geometries to relax prior to taking the energy differences for the calculation of ionization potential and electron affinity. The relaxation is done at the DFTB level using the GFN1-xTB model Hamiltonian with electrostatic embedding in a UFF environment. • None: Use the geometries directly from the input. • Neutral: Relax the uncharged molecule and use its optimized geometry for the neutral as well as the ionic systems. This gives (approximately) the vertial ionization potential and electron affinity. • All: Individually relax the neutral systems and the ions before calculating the total energies. This gives (approximately) the adiabatic ionization potential and electron affinity.
OccupationSmearing
Type: Multiple Choice Default value: Ions Options: [None, Ions, All] Description: Determines for which systems the electron smearing feature in ADF will be used. If enabled, the molecular orbital occupations will be smeared out with a 300K Fermi-Dirac distribution. This makes SCF convergence easier, as the occupation of energetically close orbitals does not jump when their energetic order flips. See the ADF manual for details. It is recommended to keep this option enabled for the ionic systems, which are more likely to suffer from difficult SCF convergence.
The oled-properties
workflow supports both the -r/--restart
command line flag and the RestartWorkdir
keyword. They work exactly the same way as for the oled-deposition
workflow, see above.
RestartWorkdir
Type: String Description: Uses the data from the working directory of a previously run properties workflow for restarting. Under the hood this uses the normal rerun-prevention available in PLAMS: it may reuse results from old jobs instead of running them again.
Material database¶
The OLED workflows come with a set of precalculated results for standard materials. These are just the results you would get if you ran both the deposition and properties workflow with all default settings on these materials. This data can be used as a reference to judge the performance of the workflows before running them on your own compounds.
Due to its size, the OLED material database is not included with AMS, but can easily be installed via AMSpackages. Once the material database is installed, you can click either the folder icon next to it in AMSpackages, or the Open button on the input panel for the deposition workflow in AMSinput to open it in your file browser. Data for each material is stored in a separate directory, e.g.:
beta-NPB/
├── beta-NPB.in
├── morphology.in
├── properties.hdf5
└── properties.pdf
Here beta-NPB.in
contains the 3D structure of the deposited molecule.
(It is basically the input to the deposition workflow, as all other settings were left at their default values.)
Note that all molecules from the OLED material database can also be found in AMSinput through the search box at the top right.
The result of the deposition is stored as the morphology.in
file, which can be opened in AMSinput and directly be used as input for the properties workflow.
The resulting properties are stored in the properties.hdf5
file, see HDF5 file above for details.
A quick overview of the properties (e.g. the histograms) can be viewed by opening the properties.pdf
file in a document viewer.
As of the 2022.1 release, the OLED material database contains data for the following pure materials, as well as a number of host-guest systems:
Pure materials¶
Compound | PubChem CID | calc. IP ± σ [eV] [1] | calc. EA ± σ [eV] |
---|---|---|---|
BCP | 65149 | 6.62 ± 0.20 | 1.37 ± 0.18 |
CBP | 11248716 | 6.06 ± 0.11 | 1.43 ± 0.12 |
mCBP | 23386664 | 6.16 ± 0.10 | 1.35 ± 0.13 |
mCP | 22020377 | 6.24 ± 0.089 | 1.14 ± 0.089 |
mer-Alq3 | 16683111 | 5.81 ± 0.29 | 1.87 ± 0.29 |
fac-Alq3 | 16683111 | 5.87 ± 0.33 | 1.84 ± 0.32 |
fac-Irppy3 | 59117881 | 5.76 ± 0.25 | 1.54 ± 0.26 |
mer-Irppy3 | 59117881 | 5.47 ± 0.17 | 1.55 ± 0.18 |
α-MADN | 53403806 | 6.06 ± 0.081 | 1.65 ± 0.081 |
β-MADN | 53403806 (isomer) | 6.00 ± 0.082 | 1.69 ± 0.085 |
α-NPB | 5069127 | 5.44 ± 0.089 | 1.56 ± 0.083 |
α-NPB-2Me | 5069127 (+ 2 methyl groups) | 5.53 ± 0.081 | 1.54 ± 0.085 |
β-NPB | 21881245 | 5.43 ± 0.075 | 1.51 ± 0.074 |
β-NPB-2Me | 21881245 (+ 2 methyl groups) | 5.51 ± 0.075 | 1.48 ± 0.074 |
2-TNATA | 16184079 | 5.04 ± 0.088 | 1.63 ± 0.067 |
MTDATA | 11061735 | 4.98 ± 0.089 | 1.11 ± 0.072 |
NBPhen | 53403424 | 6.07 ± 0.17 | 1.85 ± 0.16 |
Spiro-TAD | 16134428 | 5.24 ± 0.062 | 1.38 ± 0.078 |
T2T / TMBT [2] | 59336459 | 6.63 ± 0.079 | 1.80 ± 0.075 |
T2T / TMBT | 59336459 | 6.62 ± 0.080 | 1.81 ± 0.077 |
TAPC | 94071 | 5.26 ± 0.058 | 0.791 ± 0.070 |
TBRb | 23576810 | 5.33 ± 0.063 | 1.98 ± 0.060 |
TCTA | 9962045 | 5.68 ± 0.095 | 1.50 ± 0.092 |
TPBi | 21932919 | 6.41 ± 0.19 | 1.58 ± 0.20 |
[1] | For the calculation of the mean and standard deviation of IP and EA, data points with a modified Z score > 16 were discarded as outliers. This only affects a few systems that had isolated outliers, e.g. due to SCF convergence problems. |
[2] | T2T and TMBT are actually just two different names for the same compound. We did not realize this until after running the calculations. Both sets of results are included in the database. |
Host-guest systems¶
Component | PubChem CID | calc. IP ± σ [eV] | calc. EA ± σ [eV] |
---|---|---|---|
95% CBP | 11248716 | 6.06 ± 0.12 | 1.45 ± 0.14 |
5% fac-Irppy3 | 59117881 | 5.89 ± 0.12 | 1.60 ± 0.12 |
Component | PubChem CID | calc. IP ± σ [eV] | calc. EA ± σ [eV] |
---|---|---|---|
95% CBP | 11248716 | 6.05 ± 0.094 | 1.43 ± 0.11 |
5% PtOEP | 636283 | 6.08 ± 0.094 | 1.85 ± 0.11 |
Component | PubChem CID | calc. IP ± σ [eV] | calc. EA ± σ [eV] |
---|---|---|---|
93.05% mCBP | 23386664 | 6.14 ± 0.11 | 1.34 ± 0.13 |
6.3% 4CzIPN-Me | 102198498 (+ 8 methyl groups) | 5.96 ± 0.13 | 2.47 ± 0.13 |
0.65% TBRb | 23576810 | 5.39 ± 0.096 | 2.04 ± 0.098 |