Kindfield
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Properties Friends Pages
gaussianelectroninteractionintegral.cpp
Go to the documentation of this file.
2 
4 #include "math/vector3.h"
5 #include "hermiteintegral.h"
7 
9  m_hermiteIntegral(4 * singleAngularMomentumMax),
10  m_hermiteExpansionCoefficientAB(singleAngularMomentumMax+1),
11  m_hermiteExpansionCoefficientCD(singleAngularMomentumMax+1)
12 {
13  reset(singleAngularMomentumMax);
14 }
15 
16 void GaussianElectronInteractionIntegral::reset(int singleAngularMomentumMax)
17 {
18  m_hermiteIntegral.reset(4*singleAngularMomentumMax+1);
19  m_hermiteExpansionCoefficientAB.reset(singleAngularMomentumMax+1);
20  m_hermiteExpansionCoefficientCD.reset(singleAngularMomentumMax+1);
21 }
22 
23 void GaussianElectronInteractionIntegral::set(const Vector3 &corePositionA, const Vector3 &corePositionB, const Vector3 &corePositionC, const Vector3 &corePositionD, const GaussianPrimitiveOrbital &primitiveA, const GaussianPrimitiveOrbital &primitiveB, const GaussianPrimitiveOrbital &primitiveC, const GaussianPrimitiveOrbital &primitiveD)
24 {
25  setAB(corePositionA, corePositionB, primitiveA, primitiveB);
26  setCD(corePositionC, corePositionD, primitiveC, primitiveD);
27 }
28 
29 void GaussianElectronInteractionIntegral::setAB(const Vector3 &corePositionA, const Vector3 &corePositionB,
30  const GaussianPrimitiveOrbital& primitiveA, const GaussianPrimitiveOrbital& primitiveB)
31 {
32  m_primitiveA = &primitiveA;
33  m_primitiveB = &primitiveB;
34  double a = primitiveA.exponent();
35  double b = primitiveB.exponent();
36  double p = a + b;
37  m_exponentP = p;
38  Vector3 P = (a * corePositionA + b * corePositionB) / (a + b);
39  m_centerOfMassP = P;
40  m_hermiteExpansionCoefficientAB.set(a, b, corePositionA, corePositionB,
41  primitiveA.xExponent(), primitiveB.xExponent(),
42  primitiveA.yExponent(), primitiveB.yExponent(),
43  primitiveA.zExponent(), primitiveB.zExponent());
44 }
45 
46 void GaussianElectronInteractionIntegral::setCD(const Vector3 &corePositionC, const Vector3 &corePositionD,
47  const GaussianPrimitiveOrbital& primitiveC, const GaussianPrimitiveOrbital& primitiveD)
48 {
49  m_primitiveC = &primitiveC;
50  m_primitiveD = &primitiveD;
51  double c = primitiveC.exponent();
52  double d = primitiveD.exponent();
53  double p = m_exponentP;
54  double q = c + d;
55  m_exponentQ = q;
57  Vector3 Q = (c * corePositionC + d * corePositionD) / (c + d);
58  m_centerOfMassQ = Q;
59  Vector3 PQ = P - Q;
60  double alpha = p*q/(p+q);
64  m_hermiteIntegral.set(alpha, PQ, tPlusTau, uPlusNu, vPlusPhi);
65  m_hermiteExpansionCoefficientCD.set(c, d, corePositionC, corePositionD,
66  primitiveC.xExponent(), primitiveD.xExponent(),
67  primitiveC.yExponent(), primitiveD.yExponent(),
68  primitiveC.zExponent(), primitiveD.zExponent());
69 }
70 
72 {
73 }
74 
76  const GaussianPrimitiveOrbital& primitiveB,
77  const GaussianPrimitiveOrbital& primitiveC,
78  const GaussianPrimitiveOrbital& primitiveD) {
79  return electronInteractionIntegral(primitiveA.xExponent(), primitiveA.yExponent(), primitiveA.zExponent(),
80  primitiveB.xExponent(), primitiveB.yExponent(), primitiveB.zExponent(),
81  primitiveC.xExponent(), primitiveC.yExponent(), primitiveC.zExponent(),
82  primitiveD.xExponent(), primitiveD.yExponent(), primitiveD.zExponent());
83 }
84 
86  int iB, int jB, int kB,
87  int iC, int jC, int kC,
88  int iD, int jD, int kD) {
89  double result = 0;
90  double p = m_exponentP;
91  double q = m_exponentQ;
92 
96  int tMax = iA + iB;
97  int uMax = jA + jB;
98  int vMax = kA + kB;
99  int tauMax = iC + iD;
100  int nuMax = jC + jD;
101  int phiMax = kC + kD;
102  for (int t = 0; t < tMax + 1; ++t) {
103  for (int u = 0; u < uMax + 1; ++u) {
104  for (int v = 0; v < vMax + 1; ++v) {
105  for (int tau = 0; tau < tauMax + 1; ++tau) {
106  for (int nu = 0; nu < nuMax + 1; ++nu) {
107  for (int phi = 0; phi < phiMax + 1; ++phi) {
108  double product = 1;
109  product *= Eab(iA, jA, kA, iB, jB, kB, t, u, v);
110  product *= Ecd(iC, jC, kC, iD, jD, kD, tau, nu, phi);
111 // product *= pow(-1, tau + nu + phi);
112  product *= (1 - 2*((tau + nu + phi) % 2));
113  product *= R(0, t + tau, u + nu, v + phi);
114  result += product;
115  }
116  }
117  }
118  }
119  }
120  }
121 
122  result *= 2 * pow(M_PI, 5.0/2.0) / (p*q*sqrt(p + q));
123 
124  return result;
125 }