https://github.com/theochem/denspart
Atoms-in-molecules density partitioning schemes based on stockholder recipe
https://github.com/theochem/denspart
Last synced: about 1 year ago
JSON representation
Atoms-in-molecules density partitioning schemes based on stockholder recipe
- Host: GitHub
- URL: https://github.com/theochem/denspart
- Owner: theochem
- License: gpl-3.0
- Created: 2019-06-24T23:07:58.000Z (about 7 years ago)
- Default Branch: main
- Last Pushed: 2025-05-05T20:35:01.000Z (about 1 year ago)
- Last Synced: 2025-05-05T21:38:45.288Z (about 1 year ago)
- Language: Python
- Size: 728 KB
- Stars: 22
- Watchers: 4
- Forks: 11
- Open Issues: 6
-
Metadata Files:
- Readme: README.rst
- License: LICENSE.txt
Awesome Lists containing this project
README
DensPart
########
DensPart is an atoms-in-molecules density partitioning program. At the moment, it only
features one method to partition the density, namely the Minimal Basis Iterative
Stockholder (MBIS) scheme. See http://dx.doi.org/10.1021/acs.jctc.6b00456
**Disclaimer:** This implementation is a prototype and is not extensively tested yet.
Future revisions may break backward compatibility of the API and file formats.
Minimal setup
=============
Required dependencies:
- NumPy: https://numpy.org
- QC-Grid: https://github.com/theochem/grid
Install (with dependencies):
.. code-block:: bash
pip install git+https://github.com/theochem/grid.git
pip install git+https://github.com/theochem/denspart.git
(There are no releases yet.)
Usage
=====
One needs to construct a ``density.npz`` file, which is used as input for the ``denspart``
script. (The optional dependencies below provide convenient tools to make such files.)
The file ``density.npz`` uses the NumPy ZIP (NPZ) format, which is a simple container file
format for arrays. More details on NPZ can be found here in `the NumPy documentation
`_. The file ``density.npz``
should contain at least the following arrays:
- ``points``: Quadrature grid points, shape ``(npoint, 3)``.
- ``weights``: Quadrature grid weights, shape ``(npoint, )``.
- ``density``: Electron density at the grid points, shape ``(npoint, )``.
- ``atnums``: Atomic numbers, shape ``(natom, )``.
- ``atcoords``: Nuclear coordinates, shape ``(natom, 3)``.
- ``cellvecs``: (Optional) One, two or three cell vectors (rows) defining periodic boundary
conditions, shape ``(nvec, 3)``.
All data are assumed to be in atomic units.
With a ``density.npz`` file, one can perform the partitioning as follows:
.. code-block:: bash
denspart density.npz results.npz
The output is stored in ``results.npz``, and contains the following arrays. (These may
be subject to change in future code revisions.)
- Copied from the input file ``density.npz``:
- ``atnums``: Atomic numbers, shape ``(natom, )``.
- ``atcoords``: Nuclear coordinates, shape ``(natom, 3)``.
- General outputs:
- ``atnfn``: The number of pro-density basis functions on each atom, shape ``(natom, )``.
- ``atnpar``: The number of pro-density parameters for each atom, shape ``(natom, )``.
- ``charges``: atomic partial charges, shape ``(natom,)``.
- ``multipole_moments``: Multipole moments (using spherical harmonics), for ``l`` going
from 1 to 4, shape ``(natom, (lmax + 1)**2 - 1)``. The moments are in HORTON 2 order.
.. code-block::
c10 c11 s11
c20 c21 s21 c22 s22
c30 c31 s31 c32 s32 c33 s33
c40 c41 s41 c42 s42 c43 s43 c44 s44
In this list, the prefix ``c`` denotes cosine-like real spherical harmonics and
``s`` denotes the sine-like functions. The first digit refers to the degree ``l`` and
the second to the order ``m``.
- ``propars``: The pro-density parameters, shape ``(sum(atnpar), )``.
- ``radial_moments``: Expectation values of ``r**n``, for ``n`` going from 0 to 4,
shape ``(natom, 5)``.
- MBIS-specific outputs:
- ``core_charges``: MBIS core charges, shape ``(natom,)``.
- ``valence_charges``: MBIS valence charges, shape ``(natom,)``.
- ``valence_widths``: MBIS valence widths, shape ``(natom,)``.
- Algorithm settings:
- ``gtol``: A stopping condition that was used for the optimization of the pro-density
parameters. This is a threshold on the gradient of the extended KL divergence.
- ``maxiter``: A stopping condition that was used for the optimization of the pro-density
parameters. This is the maximum number of iterations allowed in SciPy's trust-constr
minimizer.
- ``density_cutoff``: A density cutoff parameter that was used to determine the cutoff radii
for the local integration grids.
The arrays in the ``results.npz`` file can be accessed in Python as follows:
.. code-block:: python
import numpy as np
results = np.load("results.npz")
print("charges", results["charges"])
# From here, one can convert data to other formats:
# - CSV
np.savetxt("charges.csv", results["charges"], delimiter=",")
# - JSON
import json
json.dump(results["charges"].tolist(), open("charges.json", "w"))
# One can also easily post-process the results with some scripting:
# - Molecular dipole moment predicted by the atomic charges.
print(np.dot(results["atcoords"].T, results["charges"]))
# - Contribution to the molecular dipole moment due to the atomic dipoles.
# (This includes a reordering the spherical harmonics.)
print(results["multipole_moments"][:, [1, 2, 0]].sum(axis=0))
Optional dependencies and interfaces to quantum chemistry codes
===============================================================
IOData
------
See https://github.com/theochem/iodata
Install as follows:
.. code-block:: bash
pip install git+https://github.com/theochem/iodata.git
When IOData is installed, the npz output of the partitioning can be converted into an
extended XYZ file as follows:
.. code-block:: bash
denspart-write-extxyz results.npz results.xyz
IOData and GBasis
-----------------
In order to derive a ``density.npz`` from several wavefunction file formats
(wfn, wfx, molden, fchk, ...), one needs install a two dependencies:
- https://github.com/theochem/iodata
- https://github.com/theochem/gbasis
Install as follows:
.. code-block:: bash
pip install git+https://github.com/theochem/iodata.git
pip install git+https://github.com/theochem/gbasis.git
Once these are installed, one can compute densities on a grid from a wavefunction file.
For example:
.. code-block:: bash
denspart-from-horton3 some-file.fchk density.npz
A minimal working example showing how to partition a density from a Gaussian FCHK
can be found in `examples/horton3 `_.
GPAW
----
One may also derive a ``density.npz`` file from a
`GPAW `_ calculation.
When GPAW is installed, one can run:
.. code-block:: bash
denspart-from-gpaw some-file.gpw density.npz
A minimal working example can be found in `examples/gpaw `_.
Note that you may have to add `mpirun` in front of the command.
However, the conversion does not yet support parallel execution and thus only works for the case of a single process, even when using `mpirun`.
ADF (AMS 2021.202)
------------------
One may also derive a ``density.npz`` from an ADF AMSJob.
When `AMS `_ is installed, you can install
denspart in the AMS Python environment as follows:
.. code-block:: bash
# If needed:
source ${ADFHOME}/amsbashrc.sh
# Avoid setting ADF and AMS environment variables manually, because these may change
# with different versions of AMS.
amspython -m pip install git+https://github.com/theochem/grid.git
amspython -m pip install git+https://github.com/theochem/denspart.git
# For writing the extended XYZ file:
amspython -m pip install git+https://github.com/theochem/iodata.git
Then, the conversion and partitioning are done as follows:
.. code-block:: bash
amspython -m denspart.adapters.adf ams.results density.npz
amspython -m denspart density.npz results.npz
amspython -m denspart.utils.write_extxyz results.npz results.xyz
where ``ams.results`` is the directory with output files. You need to disable symmetry
and write out the TAPE10 file. More details can be found the the ``denspart.adapters.adf``
module. A minimal working example can be found in `examples/adf `_.
Psi4
----
By adding a few lines to the `Psi4 `_ input script, it will write
an NPZ file with Psi4's built-in molecular quadrature grids:
.. code-block:: python
energy, wfn = psi4.energy(return_wfn=True)
from denspart.adapters.psi4 import write_density_npz
write_density_npz(wfn)
Symmetry is not supported, so you need to set the point group to ``c1`` when specifying
the geometry. A minimal working example can be found in `examples/psi4 `_.
Development setup
=================
The development environment is configured as follows.
It is assumed that you have `direnv `_ installed.
(If not, you can manually the virtual environment.)
.. code-block:: bash
# Clone git repo, assuming you have ssh access to github
git clone git@github.com:theochem/denspart.git
cd denspart
# Create a virtual environment with all dependencies needed for testing
python -m venv venv
cat > .envrc << 'EOL'
source venv/bin/activate
export GPAW_SETUP_PATH=${PWD}/venv/share/gpaw-setups-0.9.20000
EOL
direnv allow
pip install -U pip
pip install -e .
# Mandatory dependency, but not yet included in setup.py
pip install --upgrade git+https://github.com/theochem/grid.git
# Development tools
pip install --upgrade pre-commit ruff black
# Extra dependency for testing adapters
pip install --upgrade git+https://github.com/theochem/iodata.git
pip install --upgrade git+https://github.com/theochem/gbasis.git
pip install --upgrade git+https://github.com/tovrstra/pytest-regressions@npz
pip install --upgrade ase
# (Make sure BLAS and LibXC are installed, so GPAW can link to them.)
# Fedora: sudo dnf install libxc-devel blas-devel
pip install --upgrade gpaw
# Install GPAW pseudopotentials
gpaw install-data venv/share
To run all tests locally:
.. code-block:: bash
pre-commit run --all
pytest