Skip to main content

Torch autodiff DFT-D3 implementation

Project description

Release Apache-2.0 Tests Ubuntu Tests macOS (ARM) Tests Windows 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.

If you use this software, please cite the following publication

  • J. Chem. Phys., 2024, 161, 062501. (DOI)

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

PyPI

The project can easily be installed with pip.

pip install tad-dftd3

conda

Conda Version

tad-dftd3 is also available from conda.

conda 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

Install this project with pip in the environment

pip install .

The following dependencies are required

Development

For development, additionally install the following tools in your environment.

mamba install black covdefaults mypy pre-commit pylint pytest pytest-cov pytest-xdist tox
pip install pytest-random-order

With pip, add the option -e for installing in development mode, and add [dev] for the development dependencies

pip install -e .[dev]

The pre-commit hooks are initialized by running the following command in the root of the repository.

pre-commit install

For testing all Python environments, simply run tox.

tox

Note that this randomizes the order of tests but skips “large” tests. To modify this behavior, tox has to skip the optional posargs.

tox -- test

Example

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

import torch
import tad_dftd3 as d3
import tad_mctc as mctc

numbers = mctc.convert.symbol_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
import tad_mctc as mctc

sample1 = dict(
    numbers=mctc.convert.symbol_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=mctc.convert.symbol_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 = mctc.batch.pack(
    (
        sample1["numbers"],
        sample2["numbers"],
    )
)
positions = mctc.batch.pack(
    (
        sample1["positions"],
        sample2["positions"],
    )
)
ref = d3.reference.Reference()
rcov = mctc.data.COV_D3()[numbers]
rvdw = mctc.data.VDW_PAIRWISE()[numbers.unsqueeze(-1), numbers.unsqueeze(-2)]
r4r2 = d3.data.R4R2()[numbers]
param = {
    "a1": torch.tensor(0.49484001),
    "s8": torch.tensor(0.78981345),
    "a2": torch.tensor(5.73083694),
}

cn = mctc.ncoord.cn_d3(
    numbers, positions, counting_function=mctc.ncoord.exp_count, rcov=rcov
)
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,
    param,
    c6,
    rvdw,
    r4r2,
    d3.disp.rational_damping,
)

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.6.0.tar.gz (714.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tad_dftd3-0.6.0-py3-none-any.whl (725.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: tad_dftd3-0.6.0.tar.gz
  • Upload date:
  • Size: 714.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for tad_dftd3-0.6.0.tar.gz
Algorithm Hash digest
SHA256 1f14bb4049d06139e30056cc0bb67defce4ccf27130a9555e181a7309356dbc5
MD5 604578cf04d4262b788b438822afa6bc
BLAKE2b-256 40361a14197580796cd9a6d34165ffde2ba84e2008a023e863d26b3399cd57bb

See more details on using hashes here.

Provenance

The following attestation bundles were made for tad_dftd3-0.6.0.tar.gz:

Publisher: release.yaml on dftd3/tad-dftd3

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

  • Download URL: tad_dftd3-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 725.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for tad_dftd3-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c9f8745b8aa24cc44b7931fbd00265d8e6aff2a7d5aa79944faecfa2e0d0c287
MD5 eae90cd3a8b29a7a47e0cb05972a7505
BLAKE2b-256 63ad0505d70265cde8b3badddf56f6770ec28442ad647152b38d7d84db5bb194

See more details on using hashes here.

Provenance

The following attestation bundles were made for tad_dftd3-0.6.0-py3-none-any.whl:

Publisher: release.yaml on dftd3/tad-dftd3

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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