Skip to main content

Torch autodiff DFT-D3 implementation

Reason this release was yanked:

broken due to missing file

Project description

Release PyPI Apache-2.0 CI Documentation Status Coverage pre-commit.ci status

Implementation of the DFT-D3 dispersion model in PyTorch. This module allows to process a single structure or a batch of structures for the calculation of atom-resolved dispersion energies.

For details on the D3 dispersion model see

  • J. Chem. Phys., 2010, 132, 154104 (DOI)

  • J. Comput. Chem., 2011, 32, 1456 (DOI)

For alternative implementations also check out

simple-dftd3:

Simple reimplementation of the DFT-D3 dispersion model in Fortran with Python bindings

torch-dftd:

PyTorch implementation of DFT-D2 and DFT-D3

dispax:

Implementation of the DFT-D3 dispersion model in Jax M.D.

Installation

pip

The project can easily be installed with pip.

pip install tad-dftd3

From source

This project is hosted on GitHub at dftd3/tad-dftd3. Obtain the source by cloning the repository with

git clone https://github.com/dftd3/tad-dftd3
cd tad-dftd3

We recommend using a conda environment to install the package. You can setup the environment manager using a mambaforge installer. Install the required dependencies from the conda-forge channel.

mamba env create -n torch -f environment.yml
mamba activate torch

For development, install the following additional dependencies

mamba install black coverage covdefaults mypy pre-commit pylint pytest tox

Install this project with pip in the environment

pip install .

Add the option -e for installing in development mode.

The following dependencies are required

You can check your installation by running the test suite with pytest

pytest tests/ --pyargs tad_dftd3

or tox for testing multiple Python versions

tox

Example

The following example shows how to calculate the DFT-D3 dispersion energy for a single structure.

import torch
import tad_dftd3 as d3

numbers = d3.util.to_number(symbols="C C C C N C S H H H H H".split())
positions = torch.tensor(
    [
        [-2.56745685564671, -0.02509985979910, 0.00000000000000],
        [-1.39177582455797, +2.27696188880014, 0.00000000000000],
        [+1.27784995624894, +2.45107479759386, 0.00000000000000],
        [+2.62801937615793, +0.25927727028120, 0.00000000000000],
        [+1.41097033661123, -1.99890996077412, 0.00000000000000],
        [-1.17186102298849, -2.34220576284180, 0.00000000000000],
        [-2.39505990368378, -5.22635838332362, 0.00000000000000],
        [+2.41961980455457, -3.62158019253045, 0.00000000000000],
        [-2.51744374846065, +3.98181713686746, 0.00000000000000],
        [+2.24269048384775, +4.24389473203647, 0.00000000000000],
        [+4.66488984573956, +0.17907568006409, 0.00000000000000],
        [-4.60044244782237, -0.17794734637413, 0.00000000000000],
    ]
)
param = {
    "a1": torch.tensor(0.49484001),
    "s8": torch.tensor(0.78981345),
    "a2": torch.tensor(5.73083694),
}

energy = d3.dftd3(numbers, positions, param)

torch.set_printoptions(precision=10)
print(energy)
# tensor([-0.0004075971, -0.0003940886, -0.0003817684, -0.0003949536,
#         -0.0003577212, -0.0004110279, -0.0005385976, -0.0001808242,
#         -0.0001563670, -0.0001503394, -0.0001577045, -0.0001764488])

The next example shows the calculation of dispersion energies for a batch of structures, while retaining access to all intermediates used for calculating the dispersion energy.

import torch
import tad_dftd3 as d3

sample1 = dict(
    numbers=d3.util.to_number("Pb H H H H Bi H H H".split()),
    positions=torch.tensor(
        [
            [-0.00000020988889, -4.98043478877778, +0.00000000000000],
            [+3.06964045311111, -6.06324400177778, +0.00000000000000],
            [-1.53482054188889, -6.06324400177778, -2.65838526500000],
            [-1.53482054188889, -6.06324400177778, +2.65838526500000],
            [-0.00000020988889, -1.72196703577778, +0.00000000000000],
            [-0.00000020988889, +4.77334244722222, +0.00000000000000],
            [+1.35700257511111, +6.70626379422222, -2.35039772300000],
            [-2.71400388988889, +6.70626379422222, +0.00000000000000],
            [+1.35700257511111, +6.70626379422222, +2.35039772300000],
        ]
    ),
)
sample2 = dict(
    numbers=d3.util.to_number("C C C C C C I H H H H H S H C H H H".split(" ")),
    positions=torch.tensor(
        [
            [-1.42754169820131, -1.50508961850828, -1.93430551124333],
            [+1.19860572924150, -1.66299114873979, -2.03189643761298],
            [+2.65876001301880, +0.37736955363609, -1.23426391650599],
            [+1.50963368042358, +2.57230374419743, -0.34128058818180],
            [-1.12092277855371, +2.71045691257517, -0.25246348639234],
            [-2.60071517756218, +0.67879949508239, -1.04550707592673],
            [-2.86169588073340, +5.99660765711210, +1.08394899986031],
            [+2.09930989272956, -3.36144811062374, -2.72237695164263],
            [+2.64405246349916, +4.15317840474646, +0.27856972788526],
            [+4.69864865613751, +0.26922271535391, -1.30274048619151],
            [-4.63786461351839, +0.79856258572808, -0.96906659938432],
            [-2.57447518692275, -3.08132039046931, -2.54875517521577],
            [-5.88211879210329, 11.88491819358157, +2.31866455902233],
            [-8.18022701418703, 10.95619984550779, +1.83940856333092],
            [-5.08172874482867, 12.66714386256482, -0.92419491629867],
            [-3.18311711399702, 13.44626574330220, -0.86977613647871],
            [-5.07177399637298, 10.99164969235585, -2.10739192258756],
            [-6.35955320518616, 14.08073002965080, -1.68204314084441],
        ]
    ),
)
numbers = d3.util.pack(
    (
        sample1["numbers"],
        sample2["numbers"],
    )
)
positions = d3.util.pack(
    (
        sample1["positions"],
        sample2["positions"],
    )
)
ref = d3.reference.Reference()
rcov = d3.data.covalent_rad_d3[numbers]
rvdw = d3.data.vdw_rad_d3[numbers.unsqueeze(-1), numbers.unsqueeze(-2)]
r4r2 = d3.data.sqrt_z_r4_over_r2[numbers]
param = {
    "a1": torch.tensor(0.49484001),
    "s8": torch.tensor(0.78981345),
    "a2": torch.tensor(5.73083694),
}

cn = d3.ncoord.coordination_number(numbers, positions, rcov, d3.ncoord.exp_count)
weights = d3.model.weight_references(numbers, cn, ref, d3.model.gaussian_weight)
c6 = d3.model.atomic_c6(numbers, weights, ref)
energy = d3.disp.dispersion(
    numbers, positions, c6, rvdw, r4r2, d3.disp.rational_damping, **param
)

torch.set_printoptions(precision=10)
print(torch.sum(energy, dim=-1))
# tensor([-0.0014092578, -0.0057840119])

Contributing

This is a volunteer open source projects and contributions are always welcome. Please, take a moment to read the contributing guidelines.

License

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “as is” basis, without warranties or conditions of any kind, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this project by you, as defined in the Apache-2.0 license, shall be licensed as above, without any additional terms or conditions.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tad_dftd3-0.1.1.tar.gz (43.5 kB view details)

Uploaded Source

Built Distribution

tad_dftd3-0.1.1-py3-none-any.whl (43.5 kB view details)

Uploaded Python 3

File details

Details for the file tad_dftd3-0.1.1.tar.gz.

File metadata

  • Download URL: tad_dftd3-0.1.1.tar.gz
  • Upload date:
  • Size: 43.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.3

File hashes

Hashes for tad_dftd3-0.1.1.tar.gz
Algorithm Hash digest
SHA256 0a891d69313ba5fed25d77dc62976fc7934f0e694949553b765504d0e27e0efc
MD5 4a558c49cdaf609a2d3edce47651fa6a
BLAKE2b-256 0f888f2682195d52a838c16af7de582c8b0c879ae19dc5ba74b37e655e60bc2e

See more details on using hashes here.

File details

Details for the file tad_dftd3-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: tad_dftd3-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 43.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.3

File hashes

Hashes for tad_dftd3-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 76727e4bc3c4c9624ac6693cead67608c53615a803fcdf02b6d184a853f57b82
MD5 6e7cf6e03e46fd97b44e789b3e56ed6a
BLAKE2b-256 3568dbb5bc10fdc2adf92d80d51d1130f2606f4c15b15899652b2abf37acaf87

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page