27#include <boost/math/constants/constants.hpp>
38template <
typename _Shell>
66 nuclear_attraction_operator {nuclear_attraction_operator} {}
81 template <
typename Z = Shell>
110 const double p = a + b;
111 const Vector<double, 3> P {E_x.centerOfMass(), E_y.centerOfMass(), E_z.centerOfMass()};
115 double total_integral {0.0};
118 for (
const auto& nucleus : nuclei) {
119 double integral {0.0};
121 const auto& C = nucleus.position();
124 for (
int t = 0; t <= i + j; t++) {
125 for (
int u = 0; u <= k + l; u++) {
126 for (
int v = 0; v <= m + n; v++) {
128 integral += E_x(i, j, t) * E_y(k, l, u) * E_z(m, n, v) * R(0, t, u, v);
132 const auto charge =
static_cast<double>(nucleus.charge());
133 total_integral += (-charge) * integral;
136 return 2 * boost::math::constants::pi<double>() / p * total_integral;
152 template <
typename Z = Shell>
183 const double p = a + b;
184 const Vector<double, 3> P {E_x.centerOfMass(), E_y.centerOfMass(), E_z.centerOfMass()};
191 for (
const auto& nucleus : nuclei) {
194 const auto& C = nucleus.position();
197 for (
int t = 0; t <= i + j; t++) {
198 for (
int u = 0; u <= k + l; u++) {
199 for (
int v = 0; v <= m + n; v++) {
201 integral += E_x(i, j, t) * E_y(k, l, u) * E_z(m, n, v) * R_k1(0, t, u, v);
205 const auto charge =
static_cast<double>(nucleus.charge());
206 total_integral += (-charge) * integral;
209 return 2 * boost::math::constants::pi<double>() / p *
210 std::exp(-k1.squaredNorm() / (4 * p)) *
const NuclearFramework & nuclearFramework() const
Definition: BaseNuclearOperator.hpp:70
Definition: BaseScalarPrimitiveIntegralEngine.hpp:30
Definition: CartesianGTO.hpp:38
const Vector< double, 3 > & center() const
Definition: CartesianGTO.hpp:129
double gaussianExponent() const
Definition: CartesianGTO.hpp:139
const CartesianExponents & cartesianExponents() const
Definition: CartesianGTO.hpp:112
Definition: HermiteCoulombIntegral.hpp:30
Definition: LondonCartesianGTO.hpp:38
Vector< double, 3 > kVector() const
Definition: LondonCartesianGTO.cpp:45
const CartesianGTO & cartesianGTO() const
Definition: LondonCartesianGTO.hpp:89
Definition: LondonHermiteCoulombIntegral.hpp:31
Definition: Matrix.hpp:47
Definition: McMurchieDavidsonCoefficient.hpp:30
Definition: NuclearAttractionOperator.hpp:33
const std::vector< Nucleus > & nucleiAsVector() const
Definition: NuclearFramework.hpp:133
Definition: PrimitiveNuclearAttractionIntegralEngine.hpp:40
product_t< NuclearAttractionOperator::Scalar, typename Primitive::OutputType > IntegralScalar
Definition: PrimitiveNuclearAttractionIntegralEngine.hpp:49
enable_if_t< std::is_same< Z, GTOShell >::value, IntegralScalar > calculate(const CartesianGTO &left, const CartesianGTO &right)
Definition: PrimitiveNuclearAttractionIntegralEngine.hpp:82
_Shell Shell
Definition: PrimitiveNuclearAttractionIntegralEngine.hpp:43
typename Shell::Primitive Primitive
Definition: PrimitiveNuclearAttractionIntegralEngine.hpp:46
enable_if_t< std::is_same< Z, LondonGTOShell >::value, IntegralScalar > calculate(const LondonCartesianGTO &left, const LondonCartesianGTO &right)
Definition: PrimitiveNuclearAttractionIntegralEngine.hpp:153
PrimitiveNuclearAttractionIntegralEngine(const NuclearAttractionOperator &nuclear_attraction_operator)
Definition: PrimitiveNuclearAttractionIntegralEngine.hpp:65
Definition: BaseOneElectronIntegralBuffer.hpp:25
typename std::enable_if< B, T >::type enable_if_t
Definition: type_traits.hpp:37
decltype(std::declval< T >() *std::declval< U >()) product_t
Definition: aliases.hpp:35
std::complex< double > complex
Definition: complex.hpp:31
@ z
Definition: CartesianDirection.hpp:30
@ x
Definition: CartesianDirection.hpp:28
@ y
Definition: CartesianDirection.hpp:29
size_t value(const CartesianDirection direction) const
Definition: CartesianExponents.hpp:116