49#define M_PI 3.14159265358979323846
57#define LMAX LIBGRPP_MAX_BASIS_L
81 double alpha_B,
double *rpp_origin,
double rpp_alpha,
double *rpp_matrix);
85 double alpha_B,
double *rpp_origin,
double rpp_alpha,
double *rpp_matrix);
89 double alpha_B,
double *rpp_origin,
double rpp_alpha,
double *rpp_matrix);
103 double alpha_C,
int ecp_power,
double *rpp_matrix) {
104 assert((ecp_power == 0) || (ecp_power == 1) || (ecp_power == 2));
109 double *buf = calloc(size_A * size_B,
sizeof(
double));
111 memset(rpp_matrix, 0, size_A * size_B *
sizeof(
double));
117 double coef_A_i = shell_A->
coeffs[
i];
123 double coef_B_j = shell_B->
coeffs[j];
128 if (ecp_power == 2) {
130 shell_A, shell_A->
alpha[
i], shell_B, shell_B->
alpha[j], origin_C,
132 }
else if (ecp_power == 1) {
134 shell_A, shell_A->
alpha[
i], shell_B, shell_B->
alpha[j], origin_C,
136 }
else if (ecp_power == 0) {
138 shell_A, shell_A->
alpha[
i], shell_B, shell_B->
alpha[j], origin_C,
142 libgrpp_daxpy(size_A * size_B, coef_A_i * coef_B_j, buf, rpp_matrix);
154 double alpha_B,
double *rpp_origin,
double rpp_alpha,
double *rpp_matrix) {
157 double c = rpp_alpha;
159 double *A = shell_A->
origin;
160 double *B = shell_B->
origin;
161 double *C = rpp_origin;
163 double q = a + b + c;
164 double mu_AB = a * b / q;
165 double mu_AC = a * c / q;
166 double mu_BC = b * c / q;
170 for (
int i = 0;
i < 3;
i++) {
174 data.
Q[
i] = (a *
A[
i] + b *
B[
i] + c *
C[
i]) /
q;
176 double X_AB =
A[
i] -
B[
i];
177 double X_AC =
A[
i] -
C[
i];
178 double X_BC =
B[
i] -
C[
i];
180 double K_ab = exp(-mu_AB * X_AB * X_AB);
181 double K_ac = exp(-mu_AC * X_AC * X_AC);
182 double K_bc = exp(-mu_BC * X_BC * X_BC);
184 data.
K_abc[
i] = K_ab * K_ac * K_bc;
189 int L_A = shell_A->
L;
190 int L_B = shell_B->
L;
191 int Nmax = L_A + L_B;
212 for (
int m = 0; m < size_A; m++) {
213 for (
int n = 0; n < size_B; n++) {
223 for (
int t = 0; t <= n_A + n_B; t++) {
224 double Ex = data.
E[0][n_A][n_B][t];
226 for (
int u = 0; u <= l_A + l_B; u++) {
227 double Ey = data.
E[1][l_A][l_B][u];
229 for (
int v = 0; v <= m_A + m_B; v++) {
230 double Ez = data.
E[2][m_A][m_B][v];
232 double R_tuv = data.
R[t][u][v][0];
234 s += Ex * Ey * Ez * R_tuv;
239 s *= N_A * N_B * 2.0 * pow(
M_PI, 1.5) / sqrt(
q);
240 rpp_matrix[m * size_B + n] = s;
250 double alpha_B,
double *rpp_origin,
double rpp_alpha,
double *rpp_matrix) {
253 double c = rpp_alpha;
257 double *
C = rpp_origin;
259 double q = a + b + c;
260 double mu_AB = a * b /
q;
261 double mu_AC = a * c /
q;
262 double mu_BC = b * c /
q;
266 for (
int i = 0;
i < 3;
i++) {
270 data.
Q[
i] = (a *
A[
i] + b *
B[
i] + c *
C[
i]) /
q;
272 double X_AB =
A[
i] -
B[
i];
273 double X_AC =
A[
i] -
C[
i];
274 double X_BC =
B[
i] -
C[
i];
276 double K_ab = exp(-mu_AB * X_AB * X_AB);
277 double K_ac = exp(-mu_AC * X_AC * X_AC);
278 double K_bc = exp(-mu_BC * X_BC * X_BC);
280 data.
K_abc[
i] = K_ab * K_ac * K_bc;
285 int L_A = shell_A->
L;
286 int L_B = shell_B->
L;
287 int Nmax = L_A + L_B;
309 for (
int m = 0; m < size_A; m++) {
310 for (
int n = 0; n < size_B; n++) {
320 for (
int t = 0; t <= n_A + n_B; t++) {
321 double Ex = data.
E[0][n_A][n_B][t];
323 for (
int u = 0; u <= l_A + l_B; u++) {
324 double Ey = data.
E[1][l_A][l_B][u];
326 for (
int v = 0; v <= m_A + m_B; v++) {
327 double Ez = data.
E[2][m_A][m_B][v];
329 double R_tuv = data.
R[t][u][v][0];
331 s += Ex * Ey * Ez * R_tuv;
336 s *= N_A * N_B * 2.0 *
M_PI /
q;
337 rpp_matrix[m * size_B + n] = s;
347 double alpha_B,
double *rpp_origin,
double rpp_alpha,
double *rpp_matrix) {
350 double c = rpp_alpha;
354 double *
C = rpp_origin;
356 double q = a + b + c;
357 double mu_AB = a * b /
q;
358 double mu_AC = a * c /
q;
359 double mu_BC = b * c /
q;
363 for (
int i = 0;
i < 3;
i++) {
367 data.
Q[
i] = (a *
A[
i] + b *
B[
i] + c *
C[
i]) /
q;
369 double X_AB =
A[
i] -
B[
i];
370 double X_AC =
A[
i] -
C[
i];
371 double X_BC =
B[
i] -
C[
i];
373 double K_ab = exp(-mu_AB * X_AB * X_AB);
374 double K_ac = exp(-mu_AC * X_AC * X_AC);
375 double K_bc = exp(-mu_BC * X_BC * X_BC);
377 data.
K_abc[
i] = K_ab * K_ac * K_bc;
383 int L_A = shell_A->
L;
384 int L_B = shell_B->
L;
399 for (
int m = 0; m < size_A; m++) {
400 for (
int n = 0; n < size_B; n++) {
408 double E_ij_0 = data.
E[0][n_A][n_B][0];
409 double E_kl_0 = data.
E[1][l_A][l_B][0];
410 double E_mn_0 = data.
E[2][m_A][m_B][0];
412 double s = N_A * N_B * E_ij_0 * E_kl_0 * E_mn_0 * pow(
M_PI /
q, 1.5);
414 rpp_matrix[m * size_B + n] = s;
424 double X_QC = data->
Q[0] - data->
C[0];
425 double Y_QC = data->
Q[1] - data->
C[1];
426 double Z_QC = data->
Q[2] - data->
C[2];
428 int nmax = L_A + L_B;
429 int L_SUM = L_A + L_B;
431 for (
int t = 0; t <= L_SUM; t++) {
432 for (
int u = 0; u <= L_SUM; u++) {
433 for (
int v = 0; v <= L_SUM; v++) {
435 if (t + u + v > L_SUM) {
439 for (
int n = 0; n <= nmax - (t + u + v); n++) {
443 if (t + u + v == 0) {
444 val = pow(-2.0 *
q, n) * data->
boys[n];
445 }
else if (t + u == 0) {
447 val += (v - 1) * data->
R[t][u][v - 2][n + 1];
449 val += Z_QC * data->
R[t][u][v - 1][n + 1];
452 val += (u - 1) * data->
R[t][u - 2][v][n + 1];
454 val += Y_QC * data->
R[t][u - 1][v][n + 1];
457 val += (t - 1) * data->
R[t - 2][u][v][n + 1];
459 val += X_QC * data->
R[t - 1][u][v][n + 1];
462 data->
R[t][u][v][n] = val;
474 double X_QC = data->
Q[0] - data->
C[0];
475 double Y_QC = data->
Q[1] - data->
C[1];
476 double Z_QC = data->
Q[2] - data->
C[2];
478 int nmax = L_A + L_B;
479 int L_SUM = L_A + L_B;
481 for (
int t = 0; t <= L_SUM; t++) {
482 for (
int u = 0; u <= L_SUM; u++) {
483 for (
int v = 0; v <= L_SUM; v++) {
485 if (t + u + v > L_SUM) {
489 for (
int n = 0; n <= nmax - (t + u + v); n++) {
493 if (t + u + v == 0) {
494 val = pow(2.0 *
q, n) * data->
boys[n];
495 }
else if (t + u == 0) {
497 val += (v - 1) * (data->
R[t][u][v - 2][n + 1] -
498 2.0 *
q * data->
R[t][u][v - 2][n]);
500 val += Z_QC * (data->
R[t][u][v - 1][n + 1] -
501 2.0 *
q * data->
R[t][u][v - 1][n]);
504 val += (u - 1) * (data->
R[t][u - 2][v][n + 1] -
505 2.0 *
q * data->
R[t][u - 2][v][n]);
507 val += Y_QC * (data->
R[t][u - 1][v][n + 1] -
508 2.0 *
q * data->
R[t][u - 1][v][n]);
511 val += (t - 1) * (data->
R[t - 2][u][v][n + 1] -
512 2.0 *
q * data->
R[t - 2][u][v][n]);
514 val += X_QC * (data->
R[t - 1][u][v][n + 1] -
515 2.0 *
q * data->
R[t - 1][u][v][n]);
518 data->
R[t][u][v][n] = val;
531 for (
int coord = 0; coord < 3; coord++) {
532 for (
int i = 0;
i <= L_A;
i++) {
533 for (
int j = 0; j <= L_B; j++) {
535 for (
int t = 0; t <=
i + j; t++) {
538 if (
i == 0 && j == 0) {
539 data->
E[coord][0][0][0] = data->
K_abc[coord];
541 }
else if (
i == 1 && j == 0) {
542 double X_QA = data->
Q[coord] - data->
A[coord];
543 data->
E[coord][1][0][0] = X_QA * data->
E[coord][0][0][0];
545 }
else if (
i == 0 && j == 1) {
546 double X_QB = data->
Q[coord] - data->
B[coord];
547 data->
E[coord][0][1][0] = X_QB * data->
E[coord][0][0][0];
550 double X_QB = data->
Q[coord] - data->
B[coord];
551 data->
E[coord][
i][j][0] = X_QB * data->
E[coord][
i][j - 1][0] +
552 data->
E[coord][
i][j - 1][1];
555 double X_QA = data->
Q[coord] - data->
A[coord];
556 data->
E[coord][
i][j][0] = X_QA * data->
E[coord][
i - 1][j][0] +
557 data->
E[coord][
i - 1][j][1];
562 double factor = 1.0 / (2.0 *
q * t);
565 E_ijt += factor *
i * data->
E[coord][
i - 1][j][t - 1];
568 E_ijt += factor * j * data->
E[coord][
i][j - 1][t - 1];
571 data->
E[coord][
i][j][t] = E_ijt;
static void const int const int i
double libgrpp_gaussian_norm_factor(int n, int l, int m, double alpha)
int libgrpp_get_shell_size(libgrpp_shell_t *shell)
void libgrpp_boys_values(double x, int nmax, double *b)
void libgrpp_gfun_values(double x, int nmax, double *g)
static void setup_G_array(struct mmd_data *data, int L_A, int L_B)
static void evaluate_rpp_type1_mmd_n0_primitive_shell_pair(libgrpp_shell_t *shell_A, double alpha_A, libgrpp_shell_t *shell_B, double alpha_B, double *rpp_origin, double rpp_alpha, double *rpp_matrix)
static void setup_E_array(struct mmd_data *data, int L_A, int L_B)
void libgrpp_type1_integrals_mcmurchie_davidson_1978(libgrpp_shell_t *shell_A, libgrpp_shell_t *shell_B, double *origin_C, double alpha_C, int ecp_power, double *rpp_matrix)
void libgrpp_evaluate_rpp_type1_mmd_n1_primitive_shell_pair(libgrpp_shell_t *shell_A, double alpha_A, libgrpp_shell_t *shell_B, double alpha_B, double *rpp_origin, double rpp_alpha, double *rpp_matrix)
static void evaluate_rpp_type1_mmd_n2_primitive_shell_pair(libgrpp_shell_t *shell_A, double alpha_A, libgrpp_shell_t *shell_B, double alpha_B, double *rpp_origin, double rpp_alpha, double *rpp_matrix)
static void setup_R_array(struct mmd_data *data, int L_A, int L_B)
double distance_squared(double *A, double *B)
void libgrpp_daxpy(int n, double a, double *x, double *y)
#define LIBGRPP_ZERO_THRESH
double E[3][LMAX][LMAX][2 *LMAX]
double R[2 *LMAX][2 *LMAX][2 *LMAX][2 *LMAX]