@@ -40,6 +40,9 @@ cdef class PyCGF:
4040
4141 def add_gto (self , c:float , alpha:float , l:int , m:int , n:int ):
4242 self .cgf.add_gto(c, alpha, l, m, n)
43+
44+ def add_gto_with_position (self , c:float , px:float , py:float , pz:float , alpha:float , l:int , m:int , n:int ):
45+ self .cgf.add_gto_with_position(c, px, py, pz, alpha, l, m, n)
4346
4447 def get_amp_f (self , x:float , y:float , z:float ):
4548 return self .cgf.get_amp(x, y, z)
@@ -89,6 +92,25 @@ cdef class PyQInt:
8992
9093 return compile_info
9194
95+ @staticmethod
96+ cdef CGF build_c_cgf(object cgf):
97+ """
98+ Helper method to build a CGF object to be used in the Cython
99+ back-end; used by all CGF-level molecular integral functions
100+ """
101+ cdef CGF c_cgf
102+ cdef object gto
103+
104+ c_cgf = CGF(cgf.p[0 ], cgf.p[1 ], cgf.p[2 ])
105+ for gto in cgf.gtos:
106+ c_cgf.add_gto_with_position(
107+ gto.c,
108+ gto.p[0 ], gto.p[1 ], gto.p[2 ],
109+ gto.alpha,
110+ gto.l, gto.m, gto.n
111+ )
112+ return c_cgf
113+
92114 def get_num_threads (self ) -> int:
93115 """
94116 Get the number of OpenMP threads
@@ -125,18 +147,8 @@ cdef class PyQInt:
125147 float : overlap integral
126148 """
127149
128- cdef CGF c_cgf1
129- cdef CGF c_cgf2
130-
131- # build cgf1
132- c_cgf1 = CGF(cgf1.p[0], cgf1.p[1], cgf1.p[2])
133- for gto in cgf1.gtos:
134- c_cgf1.add_gto(gto.c, gto.alpha, gto.l, gto.m, gto.n)
135-
136- # build cgf2
137- c_cgf2 = CGF(cgf2.p[0], cgf2.p[1], cgf2.p[2])
138- for gto in cgf2.gtos:
139- c_cgf2.add_gto(gto.c, gto.alpha, gto.l, gto.m, gto.n)
150+ cdef CGF c_cgf1 = PyQInt.build_c_cgf(cgf1)
151+ cdef CGF c_cgf2 = PyQInt.build_c_cgf(cgf2)
140152
141153 return self.integrator.overlap(c_cgf1, c_cgf2)
142154
@@ -174,18 +186,8 @@ cdef class PyQInt:
174186 float : dipole integral in direction cc
175187 """
176188
177- cdef CGF c_cgf1
178- cdef CGF c_cgf2
179-
180- # build cgf1
181- c_cgf1 = CGF(cgf1.p[0], cgf1.p[1], cgf1.p[2])
182- for gto in cgf1.gtos:
183- c_cgf1.add_gto(gto.c, gto.alpha, gto.l, gto.m, gto.n)
184-
185- # build cgf2
186- c_cgf2 = CGF(cgf2.p[0], cgf2.p[1], cgf2.p[2])
187- for gto in cgf2.gtos:
188- c_cgf2.add_gto(gto.c, gto.alpha, gto.l, gto.m, gto.n)
189+ cdef CGF c_cgf1 = PyQInt.build_c_cgf(cgf1)
190+ cdef CGF c_cgf2 = PyQInt.build_c_cgf(cgf2)
189191
190192 return self.integrator.dipole(c_cgf1, c_cgf2, cc, cref)
191193
@@ -202,18 +204,8 @@ cdef class PyQInt:
202204 float : derivate of overlap integral in cartesian direction coord
203205 """
204206
205- cdef CGF c_cgf1
206- cdef CGF c_cgf2
207-
208- # build cgf1
209- c_cgf1 = CGF(cgf1.p[0], cgf1.p[1], cgf1.p[2])
210- for gto in cgf1.gtos:
211- c_cgf1.add_gto(gto.c, gto.alpha, gto.l, gto.m, gto.n)
212-
213- # build cgf2
214- c_cgf2 = CGF(cgf2.p[0], cgf2.p[1], cgf2.p[2])
215- for gto in cgf2.gtos:
216- c_cgf2.add_gto(gto.c, gto.alpha, gto.l, gto.m, gto.n)
207+ cdef CGF c_cgf1 = PyQInt.build_c_cgf(cgf1)
208+ cdef CGF c_cgf2 = PyQInt.build_c_cgf(cgf2)
217209
218210 return self.integrator.overlap_deriv(c_cgf1, c_cgf2, nuc[0], nuc[1], nuc[2], coord)
219211
@@ -247,18 +239,8 @@ cdef class PyQInt:
247239 float : kinetic integral
248240 """
249241
250- cdef CGF c_cgf1
251- cdef CGF c_cgf2
252-
253- # build cgf1
254- c_cgf1 = CGF(cgf1.p[0], cgf1.p[1], cgf1.p[2])
255- for gto in cgf1.gtos:
256- c_cgf1.add_gto(gto.c, gto.alpha, gto.l, gto.m, gto.n)
257-
258- # build cgf2
259- c_cgf2 = CGF(cgf2.p[0], cgf2.p[1], cgf2.p[2])
260- for gto in cgf2.gtos:
261- c_cgf2.add_gto(gto.c, gto.alpha, gto.l, gto.m, gto.n)
242+ cdef CGF c_cgf1 = PyQInt.build_c_cgf(cgf1)
243+ cdef CGF c_cgf2 = PyQInt.build_c_cgf(cgf2)
262244
263245 return self.integrator.kinetic(c_cgf1, c_cgf2)
264246
@@ -274,19 +256,8 @@ cdef class PyQInt:
274256 Returns:
275257 float : kinetic integral derivative
276258 """
277-
278- cdef CGF c_cgf1
279- cdef CGF c_cgf2
280-
281- # build cgf1
282- c_cgf1 = CGF(cgf1.p[0], cgf1.p[1], cgf1.p[2])
283- for gto in cgf1.gtos:
284- c_cgf1.add_gto(gto.c, gto.alpha, gto.l, gto.m, gto.n)
285-
286- # build cgf2
287- c_cgf2 = CGF(cgf2.p[0], cgf2.p[1], cgf2.p[2])
288- for gto in cgf2.gtos:
289- c_cgf2.add_gto(gto.c, gto.alpha, gto.l, gto.m, gto.n)
259+ cdef CGF c_cgf1 = PyQInt.build_c_cgf(cgf1)
260+ cdef CGF c_cgf2 = PyQInt.build_c_cgf(cgf2)
290261
291262 return self.integrator.kinetic_deriv(c_cgf1, c_cgf2, nuc[0], nuc[1], nuc[2], coord)
292263
@@ -322,19 +293,8 @@ cdef class PyQInt:
322293 Returns:
323294 float : nuclear integral
324295 """
325-
326- cdef CGF c_cgf1
327- cdef CGF c_cgf2
328-
329- # build cgf1
330- c_cgf1 = CGF(cgf1.p[0], cgf1.p[1], cgf1.p[2])
331- for gto in cgf1.gtos:
332- c_cgf1.add_gto(gto.c, gto.alpha, gto.l, gto.m, gto.n)
333-
334- # build cgf2
335- c_cgf2 = CGF(cgf2.p[0], cgf2.p[1], cgf2.p[2])
336- for gto in cgf2.gtos:
337- c_cgf2.add_gto(gto.c, gto.alpha, gto.l, gto.m, gto.n)
296+ cdef CGF c_cgf1 = PyQInt.build_c_cgf(cgf1)
297+ cdef CGF c_cgf2 = PyQInt.build_c_cgf(cgf2)
338298
339299 return self.integrator.nuclear(c_cgf1, c_cgf2, rc[0], rc[1], rc[2], zc)
340300
@@ -352,19 +312,8 @@ cdef class PyQInt:
352312 Returns:
353313 float : nuclear derivative
354314 """
355-
356- cdef CGF c_cgf1
357- cdef CGF c_cgf2
358-
359- # build cgf1
360- c_cgf1 = CGF(cgf1.p[0], cgf1.p[1], cgf1.p[2])
361- for gto in cgf1.gtos:
362- c_cgf1.add_gto(gto.c, gto.alpha, gto.l, gto.m, gto.n)
363-
364- # build cgf2
365- c_cgf2 = CGF(cgf2.p[0], cgf2.p[1], cgf2.p[2])
366- for gto in cgf2.gtos:
367- c_cgf2.add_gto(gto.c, gto.alpha, gto.l, gto.m, gto.n)
315+ cdef CGF c_cgf1 = PyQInt.build_c_cgf(cgf1)
316+ cdef CGF c_cgf2 = PyQInt.build_c_cgf(cgf2)
368317
369318 return self.integrator.nuclear_deriv(c_cgf1, c_cgf2, rc[0], rc[1], rc[2], zc, rd[0], rd[1], rd[2], coord)
370319
@@ -405,21 +354,10 @@ cdef class PyQInt:
405354 Returns:
406355 float : repulsion integral
407356 """
408-
409- cdef CGF c_cgf1
410- cdef CGF c_cgf2
411- cdef CGF c_cgf3
412- cdef CGF c_cgf4
413-
414- # build cgf1
415- c_cgf1 = CGF(cgf1.p[0], cgf1.p[1], cgf1.p[2])
416- for gto in cgf1.gtos:
417- c_cgf1.add_gto(gto.c, gto.alpha, gto.l, gto.m, gto.n)
418-
419- # build cgf2
420- c_cgf2 = CGF(cgf2.p[0], cgf2.p[1], cgf2.p[2])
421- for gto in cgf2.gtos:
422- c_cgf2.add_gto(gto.c, gto.alpha, gto.l, gto.m, gto.n)
357+ cdef CGF c_cgf1 = PyQInt.build_c_cgf(cgf1)
358+ cdef CGF c_cgf2 = PyQInt.build_c_cgf(cgf2)
359+ cdef CGF c_cgf3 = PyQInt.build_c_cgf(cgf3)
360+ cdef CGF c_cgf4 = PyQInt.build_c_cgf(cgf4)
423361
424362 # build cgf3
425363 c_cgf3 = CGF(cgf3.p[0], cgf3.p[1], cgf3.p[2])
@@ -447,21 +385,10 @@ cdef class PyQInt:
447385 Returns:
448386 float : nuclear integral derivative
449387 """
450-
451- cdef CGF c_cgf1
452- cdef CGF c_cgf2
453- cdef CGF c_cgf3
454- cdef CGF c_cgf4
455-
456- # build cgf1
457- c_cgf1 = CGF(cgf1.p[0], cgf1.p[1], cgf1.p[2])
458- for gto in cgf1.gtos:
459- c_cgf1.add_gto(gto.c, gto.alpha, gto.l, gto.m, gto.n)
460-
461- # build cgf2
462- c_cgf2 = CGF(cgf2.p[0], cgf2.p[1], cgf2.p[2])
463- for gto in cgf2.gtos:
464- c_cgf2.add_gto(gto.c, gto.alpha, gto.l, gto.m, gto.n)
388+ cdef CGF c_cgf1 = PyQInt.build_c_cgf(cgf1)
389+ cdef CGF c_cgf2 = PyQInt.build_c_cgf(cgf2)
390+ cdef CGF c_cgf3 = PyQInt.build_c_cgf(cgf3)
391+ cdef CGF c_cgf4 = PyQInt.build_c_cgf(cgf4)
465392
466393 # build cgf3
467394 c_cgf3 = CGF(cgf3.p[0], cgf3.p[1], cgf3.p[2])
0 commit comments