Skip to content

Commit a557cb6

Browse files
msrichergabrielasd
andauthored
Add zero-electron species to gaussian dataset (#138)
* Add zero-electron species to gaussian dataset * Add proton msg file under gaussian dataset test files. * Add special case for intensive properties with zero-electron components --------- Co-authored-by: Gabriela Sanchez-Diaz <[email protected]>
1 parent d23ec4d commit a557cb6

File tree

6 files changed

+87
-24
lines changed

6 files changed

+87
-24
lines changed

.gitignore

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,10 @@ cython_debug/
146146
.spyproject
147147
.vscode/
148148

149-
# Raw data files
150-
atomdb/datasets/*/db/
149+
# Data files
150+
#*.msg
151+
repo_data.txt
152+
atomdb/datasets/*/raw/
151153

152154
# Generated documentation
153155
docs/source/api/

atomdb/__main__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
from atomdb import compile_species, load
2121

22-
2322
# Initialize command line argument parser
2423
#
2524
parser = ArgumentParser(prog="atomdb", description="Compile or query an AtomDB entry.")
@@ -58,7 +57,7 @@
5857

5958
args = parser.parse_args()
6059

61-
if args.compile:
60+
if args.compile_species:
6261

6362
compile_species(args.elem, args.charge, args.mult, args.exc, args.dataset)
6463

atomdb/datasets/gaussian/run.py

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,35 +18,25 @@
1818
import os
1919

2020
import numpy as np
21-
22-
from gbasis.wrappers import from_iodata
23-
2421
from gbasis.evals.density import evaluate_density as eval_dens
25-
from gbasis.evals.density import evaluate_density_gradient
26-
from gbasis.evals.density import evaluate_density_hessian
2722
from gbasis.evals.density import evaluate_posdef_kinetic_energy_density as eval_pd_ked
28-
from gbasis.evals.eval_deriv import evaluate_deriv_basis
2923
from gbasis.evals.eval import evaluate_basis
30-
24+
from gbasis.wrappers import from_iodata
25+
from grid.atomgrid import AtomGrid
3126
from grid.onedgrid import UniformInteger
3227
from grid.rtransform import ExpRTransform
33-
from grid.atomgrid import AtomGrid
34-
3528
from iodata import load_one
3629

3730
import atomdb
38-
39-
from atomdb.periodic import Element
4031
from atomdb.datasets.tools import (
32+
eval_orb_ked,
4133
eval_orbs_density,
4234
eval_orbs_radial_d_density,
4335
eval_orbs_radial_dd_density,
44-
eval_orb_ked,
4536
eval_radial_d_density,
4637
eval_radial_dd_density,
47-
eval_orb_ked,
4838
)
49-
39+
from atomdb.periodic import Element
5040

5141
__all__ = [
5242
"run",
@@ -123,7 +113,11 @@ def run(elem, charge, mult, nexc, dataset, datapath):
123113

124114
# Load data from fchk
125115
obasis_name = "def2-svpd"
126-
data = _load_fchk(atnum, elem, nelec, mult, obasis_name, datapath)
116+
if nelec == 0:
117+
# For zero-electron case. use 1-electron case as a base
118+
data = _load_fchk(atnum, elem, 1, 2, obasis_name, datapath)
119+
else:
120+
data = _load_fchk(atnum, elem, nelec, mult, obasis_name, datapath)
127121

128122
# Unrestricted Hartree-Fock SCF results
129123
energy = data.energy
@@ -137,7 +131,7 @@ def run(elem, charge, mult, nexc, dataset, datapath):
137131
coeffs_b = mo_coeffs[:, norba:]
138132

139133
# check for inconsistencies in filenames
140-
if not np.allclose(np.array([n_up, n_dn]), np.array([sum(occs_up), sum(occs_dn)])):
134+
if nelec != 0 and not np.allclose([n_up, n_dn], [sum(occs_up), sum(occs_dn)]):
141135
raise ValueError(f"Inconsistent data in fchk file for N: {atnum}, M: {mult} CH: {charge}")
142136

143137
# Prepare data for computing Species properties
@@ -234,13 +228,38 @@ def run(elem, charge, mult, nexc, dataset, datapath):
234228

235229
# Conceptual-DFT properties (WIP)
236230
# NOTE: Only the alpha component of the MOs is used bellow
231+
# NOTE: Handle zero-electron case here
237232
mo_energy_occ_up = mo_e_up[:n_up]
238233
mo_energy_virt_up = mo_e_up[n_up:]
239-
ip = -mo_energy_occ_up[-1] # - energy_HOMO_alpha
240-
ea = -mo_energy_virt_up[0] # - energy_LUMO_alpha
234+
ip = -mo_energy_occ_up[-1] if nelec != 0 else 0 # - energy_HOMO_alpha
235+
ea = -mo_energy_virt_up[0] if nelec != 0 else 0 # - energy_LUMO_alpha
241236
mu = None
242237
eta = None
243238

239+
# Set appropriate values to zero for zero-electron case
240+
if nelec == 0:
241+
energy=0.0,
242+
mo_e_up[...] = 0
243+
mo_e_dn[...] = 0
244+
occs_up[...] = 0
245+
occs_dn[...] = 0
246+
# Density
247+
orb_dens_avg_up[...] = 0
248+
orb_dens_avg_dn[...] = 0
249+
dens_avg_tot[...] = 0
250+
# Density gradient
251+
orb_d_dens_avg_up[...] = 0
252+
orb_d_dens_avg_dn[...] = 0
253+
d_dens_avg_tot[...] = 0
254+
# Density laplacian
255+
orb_dd_dens_avg_up[...] = 0
256+
orb_dd_dens_avg_dn[...] = 0
257+
dd_dens_avg_tot[...] = 0
258+
# KED
259+
orb_ked_avg_up[...] = 0
260+
orb_ked_avg_dn[...] = 0
261+
ked_avg_tot[...] = 0
262+
244263
# Return Species instance
245264
fields = dict(
246265
elem=elem,
@@ -261,6 +280,7 @@ def run(elem, charge, mult, nexc, dataset, datapath):
261280
mo_occs_a=occs_up,
262281
mo_occs_b=occs_dn,
263282
ip=ip,
283+
# ea=ea,
264284
mu=mu,
265285
eta=eta,
266286
rs=rs,

atomdb/promolecule.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ def nspin(self, p=1):
248248
def f(atom):
249249
return atom.nspin
250250

251-
return _intensive_property(self.atoms, self.coeffs, f, p=1)
251+
return _intensive_property_exclude_zero(self.atoms, self.coeffs, f, p=1)
252252

253253
def mult(self, p=1):
254254
r"""Compute the multiplicity of the promolecule.
@@ -701,7 +701,7 @@ def make_promolecule(
701701
promol._extend(*(min(good_combs, key=itemgetter(0))[1:]))
702702
else:
703703
raise ValueError(
704-
"Unable to construct species with non-integer" "charge/spin from database entries"
704+
"Unable to construct species with non-integer charge/spin from database entries"
705705
)
706706

707707
# Return Promolecule instance
@@ -787,6 +787,32 @@ def _intensive_property(atoms, coeffs, f, p=1):
787787
)
788788

789789

790+
def _intensive_property_exclude_zero(atoms, coeffs, f, p=1):
791+
r"""Helper function for computing intensive properties (excluding zero-electron proatoms).
792+
793+
Parameters
794+
----------
795+
atoms: list of Species
796+
Species instances.
797+
coeffs: np.ndarray((N,), dtype=float)
798+
Coefficients of each species.
799+
f: callable
800+
Property function.
801+
p: int, default=1 (linear mean)
802+
Type of mean used in the computation.
803+
804+
Returns
805+
-------
806+
prop: float
807+
Intensive property.
808+
"""
809+
# P-mean of each atom's property value
810+
return (
811+
sum(coeff * f(atom) ** p for atom, coeff in zip(atoms, coeffs) if atom.nelec != 0)
812+
/ sum(coeff for atom, coeff in zip(atoms, coeffs) if atom.nelec != 0) ** (1 / p)
813+
)
814+
815+
790816
def _radial_vector_outer_triu(radii):
791817
r"""Evaluate the outer products of a set of radial unit vectors.
792818
540 KB
Binary file not shown.

atomdb/test/test_promolecule.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,22 @@
149149
},
150150
id="Be floating point charge/integer mult (neg)",
151151
),
152+
pytest.param(
153+
{
154+
"atnums": [3, 1],
155+
"charges": [0, 1],
156+
"mults": [2, 1],
157+
"coords": np.asarray(
158+
[
159+
[0.0, 0.0, 0.0],
160+
[0.0, 0.0, 1.0],
161+
],
162+
dtype=float,
163+
),
164+
"dataset": "gaussian",
165+
},
166+
id="LiH with zero electrons on the hydrogen center",
167+
),
152168
]
153169

154170

0 commit comments

Comments
 (0)