18 double *
const coef_xyz) {
20 assert(coef_xyz != NULL);
23 const int lp = (coef->
size[0] - 1);
24 for (
int lzp = 0; lzp <= lp; lzp++) {
25 for (
int lyp = 0; lyp <= lp - lzp; lyp++) {
26 for (
int lxp = 0; lxp <= lp - lzp - lyp; lxp++, lxyz++) {
27 coef_xyz[lxyz] =
idx3(coef[0], lzp, lyp, lxp);
34 double *
const coef_xyz) {
36 assert(coef_xyz != NULL);
38 const int lp = (coef->
size[0] - 1);
39 for (
int lzp = 0; lzp <= lp; lzp++) {
40 for (
int lyp = 0; lyp <= lp - lzp; lyp++) {
41 for (
int lxp = 0; lxp <= lp - lzp - lyp; lxp++, lxyz++) {
42 coef_xyz[lxyz] =
idx3(coef[0], lyp, lxp, lzp);
51 assert(coef_xyz != NULL);
53 const int lp = coef->
size[0] - 1;
54 for (
int lzp = 0; lzp <= lp; lzp++) {
55 for (
int lyp = 0; lyp <= lp - lzp; lyp++) {
56 for (
int lxp = 0; lxp <= lp - lzp - lyp; lxp++, lxyz++) {
57 idx3(coef[0], lzp, lyp, lxp) = coef_xyz[lxyz];
60 for (
int lxp = lp - lzp - lyp + 1; lxp <= lp; lxp++)
61 idx3(coef[0], lzp, lyp, lxp) = 0.0;
70 const int *lmin,
const int *lmax,
const int lp,
const double prefactor,
78 assert(alpha != NULL);
79 assert(coef_xyz != NULL);
80 assert(coef_xyz->
data != NULL);
84 for (
int lzb = 0; lzb <= lmax[1]; lzb++) {
85 for (
int lyb = 0; lyb <= lmax[1] - lzb; lyb++) {
86 const int lxb_min =
imax(lmin[1] - lzb - lyb, 0);
87 for (
int lxb = lxb_min; lxb <= lmax[1] - lzb - lyb; lxb++) {
88 const int jco = coset(lxb, lyb, lzb);
89 for (
int lza = 0; lza <= lmax[0]; lza++) {
90 for (
int lya = 0; lya <= lmax[0] - lza; lya++) {
91 const int lxa_min =
imax(lmin[0] - lza - lya, 0);
92 for (
int lxa = lxa_min; lxa <= lmax[0] - lza - lya; lxa++) {
93 const int ico = coset(lxa, lya, lza);
94 const double pab_ =
idx2(pab[0], jco, ico);
95 for (
int lxp = 0; lxp <= lxa + lxb; lxp++) {
97 idx4(alpha[0], 0, lxb, lxa, lxp) * pab_ * prefactor;
98 for (
int lzp = 0; lzp <= lp - lxa - lxb; lzp++) {
99 for (
int lyp = 0; lyp <= lp - lxa - lxb - lzp; lyp++) {
100 const double p2 =
idx4(alpha[0], 1, lyb, lya, lyp) *
101 idx4(alpha[0], 2, lzb, lza, lzp) * p1;
102 idx3(coef_xyz[0], lxp, lzp, lyp) += p2;
118 const int *
const lmin,
const int *
const lmax,
const int lp,
119 const double prefactor,
120 const tensor *
const alpha,
126 assert(alpha != NULL);
127 assert(coef_xyz != NULL);
128 assert(coef_xyz->
data != NULL);
133 for (
int lzb = 0; lzb <= lmax[1]; lzb++) {
134 for (
int lyb = 0; lyb <= lmax[1] - lzb; lyb++) {
135 const int lxb_min =
imax(lmin[1] - lzb - lyb, 0);
136 for (
int lxb = lxb_min; lxb <= lmax[1] - lzb - lyb; lxb++) {
137 const int jco = coset(lxb, lyb, lzb);
138 for (
int lza = 0; lza <= lmax[0]; lza++) {
139 for (
int lya = 0; lya <= lmax[0] - lza; lya++) {
140 const int lxa_min =
imax(lmin[0] - lza - lya, 0);
141 for (
int lxa = lxa_min; lxa <= lmax[0] - lza - lya; lxa++) {
142 const int ico = coset(lxa, lya, lza);
149 for (
int lxp = 0; lxp <= lxa + lxb; lxp++) {
150 for (
int lzp = 0; lzp <= lp - lxa - lxb; lzp++) {
151 for (
int lyp = 0; lyp <= lp - lxa - lxb - lzp; lyp++) {
152 const double p2 =
idx4(alpha[0], 1, lyb, lya, lyp) *
153 idx4(alpha[0], 2, lzb, lza, lzp) *
154 idx4(alpha[0], 0, lxb, lxa, lxp) *
156 pab_ +=
idx3(coef_xyz[0], lyp, lxp, lzp) * p2;
160 idx2(vab[0], jco, ico) += pab_;
171 const double rp[3],
const int *lmax,
173 assert(alpha != NULL);
175 memset(alpha->data, 0, alpha->alloc_size_ *
sizeof(
double));
182 for (
int iaxis = 0; iaxis < 3; iaxis++) {
183 const double drpa = rp[iaxis] - ra[iaxis];
184 const double drpb = rp[iaxis] - rb[iaxis];
185 for (
int lxa = 0; lxa <= lmax[0]; lxa++) {
186 for (
int lxb = 0; lxb <= lmax[1]; lxb++) {
187 double binomial_k_lxa = 1.0;
189 for (
int k = 0; k <= lxa; k++) {
190 double binomial_l_lxb = 1.0;
192 for (
int l = 0; l <= lxb; l++) {
193 idx4(alpha[0], iaxis, lxb, lxa, lxa - l + lxb - k) +=
194 binomial_k_lxa * binomial_l_lxb * a * b;
195 binomial_l_lxb *= ((double)(lxb - l)) / ((
double)(l + 1));
198 binomial_k_lxa *= ((double)(lxa - k)) / ((
double)(k + 1));
212 assert(coef_xyz != NULL);
213 const int lp = coef_xyz->
size[0] - 1;
228 if (coef_ijk.
data == NULL)
238 for (
int i = 0;
i < 3;
i++) {
239 for (
int j = 0; j < 3; j++) {
240 idx3(hmatgridp, 0, j,
i) = 1.0;
241 for (
int k = 1; k <= lp; k++) {
242 idx3(hmatgridp, k, j,
i) =
idx3(hmatgridp, k - 1, j,
i) * dh[j][
i];
248 for (
int klx = 0; klx <= lpx; klx++) {
249 for (
int jlx = 0; jlx <= lpx - klx; jlx++) {
250 for (
int ilx = 0; ilx <= lpx - klx - jlx; ilx++) {
251 const int lx = ilx + jlx + klx;
252 const int lpy = lp - lx;
253 const double tx =
idx3(hmatgridp, ilx, 0, 0) *
254 idx3(hmatgridp, jlx, 1, 0) *
255 idx3(hmatgridp, klx, 2, 0) * fac(lx) *
inv_fac[klx] *
258 for (
int kly = 0; kly <= lpy; kly++) {
259 for (
int jly = 0; jly <= lpy - kly; jly++) {
260 for (
int ily = 0; ily <= lpy - kly - jly; ily++) {
261 const int ly = ily + jly + kly;
262 const int lpz = lp - lx - ly;
263 const double ty = tx *
idx3(hmatgridp, ily, 0, 1) *
264 idx3(hmatgridp, jly, 1, 1) *
265 idx3(hmatgridp, kly, 2, 1) * fac(ly) *
267 for (
int klz = 0; klz <= lpz; klz++) {
268 for (
int jlz = 0; jlz <= lpz - klz; jlz++) {
269 for (
int ilz = 0; ilz <= lpz - klz - jlz; ilz++) {
270 const int lz = ilz + jlz + klz;
271 const int il = ilx + ily + ilz;
272 const int jl = jlx + jly + jlz;
273 const int kl = klx + kly + klz;
278 idx3(coef_ijk, il, kl, jl) +=
279 idx3(coef_xyz[0], lx, lz, ly) * ty *
280 idx3(hmatgridp, ilz, 0, 2) *
281 idx3(hmatgridp, jlz, 1, 2) *
282 idx3(hmatgridp, klz, 2, 2) * fac(lz) *
inv_fac[klz] *
305 const int lp = coef_xyz->
size[0] - 1;
319 if (coef_ijk.
data == NULL)
329 for (
int i = 0;
i < 3;
i++) {
330 for (
int j = 0; j < 3; j++) {
331 idx3(hmatgridp, 0, j,
i) = 1.0;
332 for (
int k = 1; k <= lp; k++) {
333 idx3(hmatgridp, k, j,
i) =
idx3(hmatgridp, k - 1, j,
i) * dh[j][
i];
339 for (
int klx = 0; klx <= lpx; klx++) {
340 for (
int jlx = 0; jlx <= lpx - klx; jlx++) {
341 for (
int ilx = 0; ilx <= lpx - klx - jlx; ilx++) {
342 const int lx = ilx + jlx + klx;
343 const int lpy = lp - lx;
344 for (
int kly = 0; kly <= lpy; kly++) {
345 for (
int jly = 0; jly <= lpy - kly; jly++) {
346 for (
int ily = 0; ily <= lpy - kly - jly; ily++) {
347 const int ly = ily + jly + kly;
348 const int lpz = lp - lx - ly;
349 for (
int klz = 0; klz <= lpz; klz++) {
350 for (
int jlz = 0; jlz <= lpz - klz; jlz++) {
351 for (
int ilz = 0; ilz <= lpz - klz - jlz; ilz++) {
352 const int lz = ilz + jlz + klz;
353 const int il = ilx + ily + ilz;
354 const int jl = jlx + jly + jlz;
355 const int kl = klx + kly + klz;
360 idx3(coef_ijk, ly, lx, lz) +=
361 idx3(coef_xyz[0], jl, il, kl) *
362 idx3(hmatgridp, ilx, 0, 0) *
363 idx3(hmatgridp, jlx, 1, 0) *
364 idx3(hmatgridp, klx, 2, 0) *
365 idx3(hmatgridp, ily, 0, 1) *
366 idx3(hmatgridp, jly, 1, 1) *
367 idx3(hmatgridp, kly, 2, 1) *
368 idx3(hmatgridp, ilz, 0, 2) *
369 idx3(hmatgridp, jlz, 1, 2) *
370 idx3(hmatgridp, klz, 2, 2) * fac(lx) * fac(ly) *
372 (fac(ilx) * fac(ily) * fac(ilz) * fac(jlx) * fac(jly) *
373 fac(jlz) * fac(klx) * fac(kly) * fac(klz));
void grid_compute_coefficients_dgemm(const int *lmin, const int *lmax, const int lp, const double prefactor, const tensor *const alpha, const tensor *const pab, tensor *coef_xyz)
void grid_compute_vab(const int *const lmin, const int *const lmax, const int lp, const double prefactor, const tensor *const alpha, const tensor *const coef_xyz, tensor *vab)