Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 29 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,27 @@

## Synopsis

IntegratorXX is a modern C++ library for the generation of atomic and molecular
grids for quantum chemistry calculations. Among the most important applications
of these grids is the evaluation of exchange--correlation (XC) related quantities
IntegratorXX is a modern C++ library for the generation of atomic grids for
quantum chemistry calculations. Among the most important applications of these
grids is the evaluation of exchange--correlation (XC) related quantities
(energies, potentials, etc) required for density functional theory calculations.

IntegratorXX provides a uniform interface for the generation of primitive,
radial and solid angle quadratures, as well as there combination into spherical
radial and solid angle quadratures, as well as their combination into spherical
grids.

The scope of IntegratorXX is the atomic grid. Assembling atomic grids into a
molecular grid -- the fuzzy-cell partition weights, basis set screening and the
batched evaluation that goes with them -- is the responsibility of the calling
code; see [GauXC](https://github.com/wavefunction91/GauXC) for a driver that
does this.

## Design Goals

* Provide stable, reusable, and reproducible implementations of the various atomic and
molecular grids commonly encountered in quantum chemistry calculations
* Provide stable, reusable, and reproducible implementations of the various
atomic grids commonly encountered in quantum chemistry calculations
* Develop a modern, modular, extensible C++ API to allow for the implementation
and validation new atomic and molecular quadrature schemes.
and validation of new atomic quadrature schemes.
* Provide complete C and Python interfaces to allow reusing the implementation in projects written in these languages

## Dependencies
Expand Down Expand Up @@ -72,7 +78,7 @@ in the radial weights while the radial component of the spherical volume element

Angular quadratures integrate over $S^2$ (solid angle). These have typically been
manually constructed to integrate spherical harmonics up to a specific order, and
are thus only compatible witch *specific* grid orders (see note below).
are thus only compatible with *specific* grid orders (see note below).

| Quadrature Name | Domain | C++ Class |
|---------------------------------|---------|---------------------|
Expand All @@ -86,10 +92,10 @@ are thus only compatible witch *specific* grid orders (see note below).
All of the currently implemented angular quadrature schemes are only compatible
with *specific* grid orders corresponding to *specific* algebraic orders of
spherical harmonics they integrate exactly. The construction of the angular
grids takes the number of points as argument, and will fail if the grid order
is incompatible. As these *magic numbers* are different for each of the
quadratures, we provide a set of look-up functions which can safely produce
compatible grid orders:
grids takes the number of points as argument, and throws `std::runtime_error`
if the requested size is not tabulated. As these *magic numbers* are different
for each of the quadratures, we provide a set of look-up functions which can
safely produce compatible grid orders:

```
using angular_type = LebedevLaikov<double>; // FP64 LL grid, similar for other implementations
Expand All @@ -109,7 +115,7 @@ the following radial pruning schemes:
|-----------|--------------------------------------|---------------------------|
| Unpruned | Do not perform pruning | `PruningScheme::Unpruned` |
| Robust | The Psi4 "robust" pruning scheme | `PruningScheme::Robust` |
| Treutler | The Treutler-Ahlrichs pruning scheme | `PruntinScheme::Treutler` |
| Treutler | The Treutler-Ahlrichs pruning scheme | `PruningScheme::Treutler` |



Expand All @@ -121,19 +127,23 @@ a simple invocation example for the generation of an atomic sphere via the
runtime generator:
```
using namespace IntegratorXX; // Import namespace
auto rad_spec = radial_from_string("MuraKnowles"); // MK Radial scheme
auto ang_spec = angular_from_string("AhrensBeylkin"); // AH Angular scheme
auto rad_spec = radial_from_string("MuraKnowles"); // MK radial scheme
auto ang_spec = angular_from_string("AhrensBeylkin"); // AB angular scheme
size_t nrad = 99;
size_t nang = 372;
double rscal = 2.0;

// Generate Grid Specification
// The radial parameters are carried by a RadialTraits instance;
// make_radial_traits builds the one matching the requested scheme
auto rad_traits = make_radial_traits(rad_spec, nrad, rscal);

// Generate grid specification
UnprunedSphericalGridSpecification unp{
rad_spec, nrad, rscal, ang_spec, nang
rad_spec, *rad_traits, ang_spec, nang
};
auto pruning_spec = create_pruned_spec(PruningScheme::Robust, unp);
auto pruning_spec = create_pruned_spec(PruningScheme::Robust, unp);

// Generate Quadrature
// Generate quadrature
auto sph_quad = SphericalGridFactory::generate_grid(pruning_spec);

size_t npts = sph_quad->npts();
Expand Down
Loading