Dispersion¶
DFT-D4 dispersion energies used by place_guest_in_host(method="energy"):
cage_isomer_builder.utils.dispersion.
D4PairModel ¶
Fixed C6 coefficients and r4r2 values for a host and its guest types.
Atoms are indexed in one list: the host first, then each guest type in
order. offsets[t] is where guest type t starts.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
host
|
Atoms
|
|
required |
guests
|
sequence of ase.Atoms
|
|
required |
method
|
str or dict
|
D4 damping parameters, see :data: |
"pbe"
|
Examples:
>>> import numpy as np
>>> from ase.build import molecule
>>> a, b = molecule("CH4"), molecule("CH4")
>>> b.translate([4.0, 0.0, 0.0]) # methane dimer, C...C = 4 A
>>> from cage_isomer_builder.utils.dispersion import D4PairModel # needs dftd4
>>> model = D4PairModel(a, [b])
>>> model.name, model.offsets
('D4(pbe)+UFF repulsion', [0, 5])
Source code in cage_isomer_builder/utils/dispersion.py
score ¶
Two-body D4 energy plus UFF repulsion of each guest pose with the existing atoms, and the clash penalty.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
source_existing
|
np.ndarray of int, shape (n_e,)
|
Index of each existing atom in this model's atom list. |
required |
existing_positions
|
(ndarray, shape(n_e, 3))
|
|
required |
source_guest
|
np.ndarray of int, shape (n_g,)
|
Index of each guest atom in this model's atom list. |
required |
guest_positions
|
(ndarray, shape(n_poses, n_g, 3))
|
|
required |
min_distance
|
(ndarray, shape(n_e, n_g))
|
Smallest allowed distance (Angstrom) for each pair. |
required |
Returns:
| Name | Type | Description |
|---|---|---|
energy |
(ndarray, shape(n_poses))
|
D4 plus repulsion energy (eV). |
penalty |
(ndarray, shape(n_poses))
|
Clash penalty (eV), zero when no pair is too close. |
overlap |
(ndarray, shape(n_poses))
|
How far (Angstrom) the worst pair is inside its minimum distance. |
Examples:
>>> import numpy as np
>>> from ase.build import molecule
>>> a, b = molecule("CH4"), molecule("CH4")
>>> b.translate([4.0, 0.0, 0.0]) # methane dimer, C...C = 4 A
>>> from cage_isomer_builder.utils.dispersion import D4PairModel
>>> model = D4PairModel(a, [b])
>>> host, guest = np.arange(5), model.offsets[1] + np.arange(5)
>>> energy, penalty, overlap = model.score(host, a.positions, guest, b.positions[None],
... min_distance=np.zeros((5, 5)))
>>> bool(energy[0] < 0), float(penalty[0]) # attractive, no clash
(True, 0.0)
Source code in cage_isomer_builder/utils/dispersion.py
interaction_energy ¶
Full D4 interaction energy (see d4_interaction_energy) plus the UFF repulsion between the fragments, in eV.
Examples:
>>> import numpy as np
>>> from ase.build import molecule
>>> a, b = molecule("CH4"), molecule("CH4")
>>> b.translate([4.0, 0.0, 0.0]) # methane dimer, C...C = 4 A
>>> from cage_isomer_builder.utils.dispersion import D4PairModel
>>> energy = D4PairModel(a, [b]).interaction_energy([a, b])
>>> bool(-0.05 < energy < 0) # eV: a weak dispersion contact
True
Source code in cage_isomer_builder/utils/dispersion.py
UFFPairModel ¶
UFF Lennard-Jones pair energies for a host and its guest types, with the
same interface as :class:D4PairModel. Needs no optional packages.
Atoms are indexed in one list: the host first, then each guest type in
order. offsets[t] is where guest type t starts.
Examples:
>>> import numpy as np
>>> from ase.build import molecule
>>> a, b = molecule("CH4"), molecule("CH4")
>>> b.translate([4.0, 0.0, 0.0]) # methane dimer, C...C = 4 A
>>> from cage_isomer_builder.utils.dispersion import UFFPairModel
>>> model = UFFPairModel(a, [b])
>>> model.name, [int(o) for o in model.offsets]
('UFF', [0, 5])
Source code in cage_isomer_builder/utils/dispersion.py
score ¶
Lennard-Jones energy of each guest pose with the existing atoms, plus
the clash penalty. Same arguments and returns as
:meth:D4PairModel.score, in eV and Angstrom.
Examples:
>>> import numpy as np
>>> from ase.build import molecule
>>> a, b = molecule("CH4"), molecule("CH4")
>>> b.translate([4.0, 0.0, 0.0]) # methane dimer, C...C = 4 A
>>> from cage_isomer_builder.utils.dispersion import UFFPairModel, uff_interaction_energy
>>> model = UFFPairModel(a, [b])
>>> host, guest = np.arange(5), model.offsets[1] + np.arange(5)
>>> energy, penalty, overlap = model.score(host, a.positions, guest, b.positions[None],
... min_distance=np.zeros((5, 5)))
>>> bool(np.isclose(energy[0], uff_interaction_energy([a, b]))), float(penalty[0])
(True, 0.0)
Source code in cage_isomer_builder/utils/dispersion.py
interaction_energy ¶
Lennard-Jones energy (eV) between all pairs of fragments.
Examples:
>>> import numpy as np
>>> from ase.build import molecule
>>> a, b = molecule("CH4"), molecule("CH4")
>>> b.translate([4.0, 0.0, 0.0]) # methane dimer, C...C = 4 A
>>> from cage_isomer_builder.utils.dispersion import UFFPairModel, uff_interaction_energy
>>> UFFPairModel(a, [b]).interaction_energy([a, b]) == uff_interaction_energy([a, b])
True
Source code in cage_isomer_builder/utils/dispersion.py
dftd4_available ¶
d4_interaction_energy ¶
Full D4 interaction energy (eV), including the three-body term: E(all fragments together) - sum of E(each fragment alone).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
fragments
|
sequence of ase.Atoms
|
For example the host followed by each placed guest. |
required |
method
|
str or dict
|
|
"pbe"
|
Examples:
>>> import numpy as np
>>> from ase.build import molecule
>>> a, b = molecule("CH4"), molecule("CH4")
>>> b.translate([4.0, 0.0, 0.0]) # methane dimer, C...C = 4 A
>>> from cage_isomer_builder.utils.dispersion import d4_interaction_energy
>>> far = b.copy()
>>> far.translate([50.0, 0.0, 0.0])
>>> bool(d4_interaction_energy([a, b]) < 0), round(float(d4_interaction_energy([a, far])), 6)
(True, 0.0)
Source code in cage_isomer_builder/utils/dispersion.py
uff_interaction_energy ¶
UFF Lennard-Jones interaction energy (eV): the sum over every atom pair
that belongs to two different fragments. With repulsion_only, only
the repulsive D*(x/r)^12 part.
Examples:
>>> import numpy as np
>>> from ase.build import molecule
>>> a, b = molecule("CH4"), molecule("CH4")
>>> b.translate([4.0, 0.0, 0.0]) # methane dimer, C...C = 4 A
>>> from cage_isomer_builder.utils.dispersion import uff_interaction_energy
>>> bool(uff_interaction_energy([a, b]) < 0 < uff_interaction_energy([a, b], repulsion_only=True))
True
Source code in cage_isomer_builder/utils/dispersion.py
pair_model ¶
The pair model for dispersion:
"auto": D4 with PBE parameters (plus UFF repulsion) if dftd4 is installed, otherwise UFF Lennard-Jones (with a warning)."uff": UFF Lennard-Jones.- a D4 method name (e.g.
"pbe") or a dict of D4 damping parameters.
Examples:
>>> import numpy as np
>>> from ase.build import molecule
>>> a, b = molecule("CH4"), molecule("CH4")
>>> b.translate([4.0, 0.0, 0.0]) # methane dimer, C...C = 4 A
>>> from cage_isomer_builder.utils.dispersion import pair_model
>>> pair_model(a, [b], dispersion="uff").name
'UFF'