Kindfield
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Properties Friends Pages
hydrogenmolecule.cpp
Go to the documentation of this file.
1 #include "hydrogenmolecule.h"
2 
3 #include <fstream>
4 
12 {
13 
14  alpha = zeros<rowvec>(4);
15  alpha(0) = 13.00773;
16  alpha(1) = 1.962079;
17  alpha(2) = 0.444529;
18  alpha(3) = 0.1219492;
19 
20  R = zeros(2,3);
21 
22  R(1,0) = distance;
23 }
24 
26 {
27 }
28 
29 double HydrogenMolecule::coupledIntegral(int p, int q, int r, int s) {
30  int pIndex = p % nOrbitalsPerNuclei;
31  int qIndex = q % nOrbitalsPerNuclei;
32  int rIndex = r % nOrbitalsPerNuclei;
33  int sIndex = s % nOrbitalsPerNuclei;
34 
35  int Rp = p / nOrbitalsPerNuclei;
36  int Rq = q / nOrbitalsPerNuclei;
37  int Rr = r / nOrbitalsPerNuclei;
38  int Rs = s / nOrbitalsPerNuclei;
39 
40  double A = alpha[pIndex] + alpha[qIndex];
41  double B = alpha[rIndex] + alpha[sIndex];
42 
43  rowvec Ra = (alpha[pIndex]*R.row(Rp) + alpha[qIndex]*R.row(Rq))/A;
44  rowvec Rb = (alpha[rIndex]*R.row(Rr) + alpha[sIndex]*R.row(Rs))/B;
45 
46 
47  double t = (A*B/(A + B))*dot(Ra-Rb,Ra-Rb);
48 
49  double arg = 2*sqrt(A*B/(acos(-1)*(A+B)))*boysFunction(t)*overlapIntegral(p,q)*overlapIntegral(s,r);
50  return arg;
51 }
52 
54  return 1/sqrt(dot(R.row(0) - R.row(1),R.row(0)- R.row(1)));
55 }
56 
57 double HydrogenMolecule::boysFunction(double arg){
58 
59  if (arg < 1.0E-6){
60  return 1.0;
61  }
62 
63  else{
64  arg = sqrt(arg);
65  double f = 1.0/arg * erf(arg) *sqrt(acos(-1))/2.0;
66  return f;
67  }
68 
69 }
70 
78 double HydrogenMolecule::kineticIntegral(int p, int q) {
79  int pIndex = p % nOrbitalsPerNuclei;
80  int qIndex = q % nOrbitalsPerNuclei;
81 
82  double ap = alpha(pIndex);
83  double aq = alpha(qIndex);
84 
85  double factor = ap*aq/(ap+aq);
86 
87  int RpIndex = p / nOrbitalsPerNuclei;
88  int RqIndex = q / nOrbitalsPerNuclei;
89 
90  rowvec Rp = R.row(RpIndex);
91  rowvec Rq = R.row(RqIndex);
92 
93  double Rpq = dot(Rp-Rq,Rp-Rq);
94  double expTerm = exp(-factor*Rpq);
95  double kin = 0.5*factor*(6-4*factor*Rpq)*pow(acos(-1)/(ap+aq),3.0/2.0)*expTerm;
96 
97  return kin;
98 }
99 
108  int pIndex = p % nOrbitalsPerNuclei;
109  int qIndex = q % nOrbitalsPerNuclei;
110 
111  double ap = alpha(pIndex);
112  double aq = alpha(qIndex);
113 
114  double factor = 1.0/(ap+aq);
115 
116  int Rp = p / nOrbitalsPerNuclei;
117  int Rq = q / nOrbitalsPerNuclei;
118  int Z = 1;
119 
120  double Rpq =dot(R.row(Rp)-R.row(Rq),R.row(Rp)-R.row(Rq));
121  double expTerm = exp(-ap*aq*factor*Rpq);
122 
123  rowvec Rmc = (ap*R.row(Rp) + aq*R.row(Rq))*factor;
124 
125 
126  double F0p = boysFunction(1.0/factor*dot(Rmc-R.row(0),Rmc-R.row(0)));
127  double F0q = boysFunction(1.0/factor*dot(Rmc-R.row(1),Rmc-R.row(1)));
128 
129  double nucAtt = -2*Z*factor*acos(-1)*expTerm*(F0p+F0q);
130 
131  return nucAtt;
132 }
133 
134 double HydrogenMolecule::overlapIntegral(int p, int q) {
135  int pIndex = p % nOrbitalsPerNuclei;
136  int qIndex = q % nOrbitalsPerNuclei;
137 
138  double ap = alpha(pIndex);
139  double aq = alpha(qIndex);
140 
141  double factor = 1.0/(ap+aq);
142 
143  int RpIndex = p / nOrbitalsPerNuclei;
144  int RqIndex = q / nOrbitalsPerNuclei;
145 
146  rowvec Rp = R.row(RpIndex);
147  rowvec Rq = R.row(RqIndex);
148 
149  double Rpq = dot(Rp-Rq,Rp-Rq);
150  double expTerm = exp(-ap*aq*factor*Rpq);
151  double overlap = pow(acos(-1)*factor,3.0/2.0)*expTerm;
152 
153  return overlap;
154 }
155 
156 
158 {
159  return kineticIntegral(p,q) + nuclearAttractionIntegral(p,q);
160 }