43 double *kinetic_matrix) {
47 double *buf = calloc(size_A * size_B,
sizeof(
double));
49 memset(kinetic_matrix, 0, size_A * size_B *
sizeof(
double));
54 double alpha_i = shell_A->
alpha[
i];
55 double alpha_j = shell_B->
alpha[j];
56 double coef_A_i = shell_A->
coeffs[
i];
57 double coef_B_j = shell_B->
coeffs[j];
62 libgrpp_daxpy(size_A * size_B, coef_A_i * coef_B_j, buf, kinetic_matrix);
71 double alpha_B,
double *kinetic_matrix) {
79 double p = alpha_A + alpha_B;
80 double mu = alpha_A * alpha_B / (alpha_A + alpha_B);
81 double *A = shell_A->
origin;
82 double *B = shell_B->
origin;
87 for (
int coord = 0; coord < 3; coord++) {
88 double P = (alpha_A * A[coord] + alpha_B * B[coord]) / p;
90 double X_AB = A[coord] - B[coord];
91 double X_PA = P - A[coord];
92 double X_PB = P - B[coord];
93 double pfac = 1.0 / (2.0 * p);
95 for (
int i = 0;
i <= L_A + 2;
i++) {
96 for (
int j = 0; j <= L_B + 2; j++) {
100 S[coord][0][0] = sqrt(
M_PI / p) * exp(-mu * X_AB * X_AB);
105 S_ij += X_PB * S[coord][
i][j - 1];
107 S_ij += (j - 1) * pfac * S[coord][
i][j - 2];
110 S_ij += X_PA * S[coord][
i - 1][j];
112 S_ij += (
i - 1) * pfac * S[coord][
i - 2][j];
115 S_ij += j * pfac * S[coord][
i - 1][j - 1];
119 S[coord][
i][j] = S_ij;
128 for (
int coord = 0; coord < 3; coord++) {
129 for (
int i = 0;
i <= L_A;
i++) {
130 for (
int j = 0; j <= L_B; j++) {
133 D2_ij += 4.0 * alpha_A * alpha_A * S[coord][
i + 2][j];
134 D2_ij -= 2.0 * alpha_A * (2 *
i + 1) * S[coord][
i][j];
136 D2_ij +=
i * (
i - 1) * S[coord][
i - 2][j];
139 D2[coord][
i][j] = D2_ij;
145 for (
int m = 0; m < size_A; m++) {
146 for (
int n = 0; n < size_B; n++) {
154 kinetic_matrix[m * size_B + n] =
156 (D2[0][n_A][n_B] * S[1][l_A][l_B] * S[2][m_A][m_B] +
157 S[0][n_A][n_B] * D2[1][l_A][l_B] * S[2][m_A][m_B] +
158 S[0][n_A][n_B] * S[1][l_A][l_B] * D2[2][m_A][m_B]);