source: ThirdParty/mpqc_open/src/lib/chemistry/qc/cints/obosrr.cc@ bbc982

Action_Thermostats Add_AtomRandomPerturbation Add_RotateAroundBondAction Add_SelectAtomByNameAction Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_StructOpt_integration_tests AutomationFragmentation_failures Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_ChronosMutex Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion GeometryObjects Gui_displays_atomic_force_velocity IndependentFragmentGrids_IntegrationTest JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks RotateToPrincipalAxisSystem_UndoRedo StoppableMakroAction Subpackage_levmar Subpackage_vmg ThirdParty_MPQC_rebuilt_buildsystem TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps Ubuntu_1604_changes stable
Last change on this file since bbc982 was 860145, checked in by Frederik Heber <heber@…>, 8 years ago

Merge commit '0b990dfaa8c6007a996d030163a25f7f5fc8a7e7' as 'ThirdParty/mpqc_open'

  • Property mode set to 100644
File size: 6.9 KB
Line 
1//
2// obosrr.cc
3//
4// Copyright (C) 2001 Edward Valeev
5//
6// Author: Edward Valeev <edward.valeev@chemistry.gatech.edu>
7// Maintainer: EV
8//
9// This file is part of the SC Toolkit.
10//
11// The SC Toolkit is free software; you can redistribute it and/or modify
12// it under the terms of the GNU Library General Public License as published by
13// the Free Software Foundation; either version 2, or (at your option)
14// any later version.
15//
16// The SC Toolkit is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU Library General Public License for more details.
20//
21// You should have received a copy of the GNU Library General Public License
22// along with the SC Toolkit; see the file COPYING.LIB. If not, write to
23// the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
24//
25// The U.S. Government is granted a limited license as per AL 91-7.
26//
27
28#ifdef __GNUG__
29#pragma implementation
30#endif
31
32#include <chemistry/qc/cints/int1e.h>
33#include <chemistry/qc/intv3/fjt.h>
34
35using namespace std;
36using namespace sc;
37
38inline void fail()
39{
40 ExEnv::errn() << scprintf("failing module:\n%s",__FILE__) << endl;
41 abort();
42}
43
44
45/* Recurrence relation are from the Obara-Saika paper - pp. 3971-3972 */
46
47void Int1eCints::AI_OSrecurs_(double ***AI0, double PA[3], double PB[3],
48 double PC[3], double gamma, int iang, int jang)
49{
50 int a,b,m;
51 int izm = 1;
52 int iym = iang + 1;
53 int ixm = iym * iym;
54 int jzm = 1;
55 int jym = jang + 1;
56 int jxm = jym * jym;
57 int ix,iy,iz,jx,jy,jz;
58 int iind,jind;
59 double pp = 1/(2*gamma);
60 int mmax = iang+jang;
61 double tmp = sqrt(gamma)*M_2_SQRTPI;
62 double u = gamma*(PC[0]*PC[0] + PC[1]*PC[1] + PC[2]*PC[2]);
63 double *F = Fm_Eval_->values(mmax,u);
64
65 /* Computing starting integrals for recursion */
66
67 for(m=0;m<=mmax;m++)
68 AI0[0][0][m] = tmp*F[m];
69
70 /* Upward recursion in j with i=0 */
71
72 for(b=1;b<=jang;b++)
73 for(jx=0;jx<=b;jx++)
74 for(jy=0;jy<=b-jx;jy++) {
75 jz = b-jx-jy;
76 jind = jx*jxm+jy*jym+jz*jzm;
77 if (jz > 0) {
78 for(m=0;m<=mmax-b;m++) /* Electrostatic potential integrals */
79 AI0[0][jind][m] = PB[2]*AI0[0][jind-jzm][m] -
80 PC[2]*AI0[0][jind-jzm][m+1];
81 if (jz > 1) {
82 for(m=0;m<=mmax-b;m++)
83 AI0[0][jind][m] += pp*(jz-1)*(AI0[0][jind-2*jzm][m] -
84 AI0[0][jind-2*jzm][m+1]);
85 }
86 }
87 else
88 if (jy > 0) {
89 for(m=0;m<=mmax-b;m++)
90 AI0[0][jind][m] = PB[1]*AI0[0][jind-jym][m] -
91 PC[1]*AI0[0][jind-jym][m+1];
92 if (jy > 1) {
93 for(m=0;m<=mmax-b;m++)
94 AI0[0][jind][m] += pp*(jy-1)*(AI0[0][jind-2*jym][m] -
95 AI0[0][jind-2*jym][m+1]);
96 }
97 }
98 else
99 if (jx > 0) {
100 for(m=0;m<=mmax-b;m++)
101 AI0[0][jind][m] = PB[0]*AI0[0][jind-jxm][m] -
102 PC[0]*AI0[0][jind-jxm][m+1];
103 if (jx > 1) {
104 for(m=0;m<=mmax-b;m++)
105 AI0[0][jind][m] += pp*(jx-1)*(AI0[0][jind-2*jxm][m] -
106 AI0[0][jind-2*jxm][m+1]);
107 }
108 }
109 else
110 fail();
111 }
112
113
114
115 /* The following fragment cannot be vectorized easily, I guess :-) */
116 /* Upward recursion in i with all possible j's */
117
118 for(b=0;b<=jang;b++)
119 for(jx=0;jx<=b;jx++)
120 for(jy=0;jy<=b-jx;jy++) {
121 jz = b-jx-jy;
122 jind = jx*jxm + jy*jym + jz*jzm;
123 for(a=1;a<=iang;a++)
124 for(ix=0;ix<=a;ix++)
125 for(iy=0;iy<=a-ix;iy++) {
126 iz = a-ix-iy;
127 iind = ix*ixm + iy*iym + iz*izm;
128 if (iz > 0) {
129 for(m=0;m<=mmax-a-b;m++)
130 AI0[iind][jind][m] = PA[2]*AI0[iind-izm][jind][m] -
131 PC[2]*AI0[iind-izm][jind][m+1];
132 if (iz > 1) {
133 for(m=0;m<=mmax-a-b;m++)
134 AI0[iind][jind][m] += pp*(iz-1)*
135 (AI0[iind-2*izm][jind][m] - AI0[iind-2*izm][jind][m+1]);
136 }
137 if (jz > 0) {
138 for(m=0;m<=mmax-a-b;m++)
139 AI0[iind][jind][m] += pp*jz*
140 (AI0[iind-izm][jind-jzm][m] - AI0[iind-izm][jind-jzm][m+1]);
141 }
142 }
143 else
144 if (iy > 0) {
145 for(m=0;m<=mmax-a-b;m++)
146 AI0[iind][jind][m] = PA[1]*AI0[iind-iym][jind][m] -
147 PC[1]*AI0[iind-iym][jind][m+1];
148 if (iy > 1) {
149 for(m=0;m<=mmax-a-b;m++)
150 AI0[iind][jind][m] += pp*(iy-1)*
151 (AI0[iind-2*iym][jind][m] - AI0[iind-2*iym][jind][m+1]);
152 }
153 if (jy > 0) {
154 for(m=0;m<=mmax-a-b;m++)
155 AI0[iind][jind][m] += pp*jy*
156 (AI0[iind-iym][jind-jym][m] - AI0[iind-iym][jind-jym][m+1]);
157 }
158 }
159 else
160 if (ix > 0) {
161 for(m=0;m<=mmax-a-b;m++)
162 AI0[iind][jind][m] = PA[0]*AI0[iind-ixm][jind][m] -
163 PC[0]*AI0[iind-ixm][jind][m+1];
164 if (ix > 1) {
165 for(m=0;m<=mmax-a-b;m++)
166 AI0[iind][jind][m] += pp*(ix-1)*
167 (AI0[iind-2*ixm][jind][m] - AI0[iind-2*ixm][jind][m+1]);
168 }
169 if (jx > 0) {
170 for(m=0;m<=mmax-a-b;m++)
171 AI0[iind][jind][m] += pp*jx*
172 (AI0[iind-ixm][jind-jxm][m] - AI0[iind-ixm][jind-jxm][m+1]);
173 }
174 }
175 else
176 fail();
177 }
178 }
179
180 return;
181}
182
183
184void Int1eCints::OI_OSrecurs_(double **OIX, double **OIY, double **OIZ, double PA[3], double PB[3],
185 double gamma, int lmaxi, int lmaxj)
186{
187 int i,j,k;
188 double pp = 1/(2*gamma);
189
190 OIX[0][0] = OIY[0][0] = OIZ[0][0] = 1.0;
191
192 /* Upward recursion in j for i=0 */
193
194 OIX[0][1] = PB[0];
195 OIY[0][1] = PB[1];
196 OIZ[0][1] = PB[2];
197
198 for(j=1;j<lmaxj;j++) {
199 OIX[0][j+1] = PB[0]*OIX[0][j];
200 OIY[0][j+1] = PB[1]*OIY[0][j];
201 OIZ[0][j+1] = PB[2]*OIZ[0][j];
202 OIX[0][j+1] += j*pp*OIX[0][j-1];
203 OIY[0][j+1] += j*pp*OIY[0][j-1];
204 OIZ[0][j+1] += j*pp*OIZ[0][j-1];
205 }
206
207 /* Upward recursion in i for all j's */
208
209 OIX[1][0] = PA[0];
210 OIY[1][0] = PA[1];
211 OIZ[1][0] = PA[2];
212 for(j=1;j<=lmaxj;j++) {
213 OIX[1][j] = PA[0]*OIX[0][j];
214 OIY[1][j] = PA[1]*OIY[0][j];
215 OIZ[1][j] = PA[2]*OIZ[0][j];
216 OIX[1][j] += j*pp*OIX[0][j-1];
217 OIY[1][j] += j*pp*OIY[0][j-1];
218 OIZ[1][j] += j*pp*OIZ[0][j-1];
219 }
220 for(i=1;i<lmaxi;i++) {
221 OIX[i+1][0] = PA[0]*OIX[i][0];
222 OIY[i+1][0] = PA[1]*OIY[i][0];
223 OIZ[i+1][0] = PA[2]*OIZ[i][0];
224 OIX[i+1][0] += i*pp*OIX[i-1][0];
225 OIY[i+1][0] += i*pp*OIY[i-1][0];
226 OIZ[i+1][0] += i*pp*OIZ[i-1][0];
227 for(j=1;j<=lmaxj;j++) {
228 OIX[i+1][j] = PA[0]*OIX[i][j];
229 OIY[i+1][j] = PA[1]*OIY[i][j];
230 OIZ[i+1][j] = PA[2]*OIZ[i][j];
231 OIX[i+1][j] += i*pp*OIX[i-1][j];
232 OIY[i+1][j] += i*pp*OIY[i-1][j];
233 OIZ[i+1][j] += i*pp*OIZ[i-1][j];
234 OIX[i+1][j] += j*pp*OIX[i][j-1];
235 OIY[i+1][j] += j*pp*OIY[i][j-1];
236 OIZ[i+1][j] += j*pp*OIZ[i][j-1];
237 }
238 }
239
240 return;
241}
Note: See TracBrowser for help on using the repository browser.