26 libgrpp_grpp_t *grpp_operator,
double *grpp_origin,
double **grad_arep,
27 double **grad_so_x,
double **grad_so_y,
double **grad_so_z,
double factor);
32 double **arep_matrix_down,
double **so_x_matrix_down,
33 double **so_y_matrix_down,
double **so_z_matrix_down,
34 double **arep_matrix_up,
double **so_x_matrix_up,
double **so_y_matrix_up,
35 double **so_z_matrix_up,
int *cart_size_down,
int *cart_size_up);
39 libgrpp_grpp_t *grpp_operator,
double *grpp_origin,
double **grad_arep,
40 double **grad_so_x,
double **grad_so_y,
double **grad_so_z,
double factor);
45 double **arep_matrix_down,
double **so_x_matrix_down,
46 double **so_y_matrix_down,
double **so_z_matrix_down,
47 double **arep_matrix_up,
double **so_x_matrix_up,
double **so_y_matrix_up,
48 double **so_z_matrix_up,
int *cart_size_down,
int *cart_size_up);
53 double *grpp_origin,
double **grad_arep,
54 double **grad_so_x,
double **grad_so_y,
55 double **grad_so_z,
int diff_bra,
61 double **arep_matrix_down,
double **so_x_matrix_down,
62 double **so_y_matrix_down,
double **so_z_matrix_down,
63 double **arep_matrix_up,
double **so_x_matrix_up,
double **so_y_matrix_up,
64 double **so_z_matrix_up,
int *cart_size_down,
int *cart_size_up,
81 double *point_3d,
double **grad_arep) {
95 shell_A, shell_B, grpp_operator, grpp_origin, point_3d, grad_arep,
96 stub_grad_so_x, stub_grad_so_y, stub_grad_so_z);
102 grpp_operator->
U_L = NULL;
114 double *point_3d,
double **grad_arep) {
128 shell_A, shell_B, grpp_operator, grpp_origin, point_3d, grad_arep,
129 stub_grad_so_x, stub_grad_so_y, stub_grad_so_z);
135 grpp_operator->
n_arep = 0;
147 double **grad_so_y,
double **grad_so_z) {
158 grpp_origin, point_3d, stub_grad_arep,
159 grad_so_x, grad_so_y, grad_so_z);
166 int L = potential->
L;
168 for (
int icoord = 0; icoord < 3; icoord++) {
169 for (
int i = 0;
i < buf_size;
i++) {
170 grad_so_x[icoord][
i] *= (2.0 * L + 1.0) / 2.0;
171 grad_so_y[icoord][
i] *= (2.0 * L + 1.0) / 2.0;
172 grad_so_z[icoord][
i] *= (2.0 * L + 1.0) / 2.0;
178 grpp_operator->
n_esop = 0;
186 double **grad_so_x,
double **grad_so_y,
double **grad_so_z) {
188 for (
int ioc = 0; ioc < num_oc_shells; ioc++) {
194 rpp_origin, point_3d, grad_arep,
195 grad_so_x, grad_so_y, grad_so_z);
209 libgrpp_grpp_t *grpp_operator,
double *grpp_origin,
double *point_3d,
210 double **grad_arep,
double **grad_so_x,
double **grad_so_y,
211 double **grad_so_z) {
214 int buf_size = cart_size_A * cart_size_B;
219 for (
int icoord = 0; icoord < 3; icoord++) {
220 memset(grad_arep[icoord], 0,
sizeof(
double) * buf_size);
221 memset(grad_so_x[icoord], 0,
sizeof(
double) * buf_size);
222 memset(grad_so_y[icoord], 0,
sizeof(
double) * buf_size);
223 memset(grad_so_z[icoord], 0,
sizeof(
double) * buf_size);
243 double *A = shell_A->
origin;
244 double *B = shell_B->
origin;
245 double *C = grpp_origin;
246 double *D = point_3d;
248 const int diff_bra = 1;
249 const int diff_ket = 0;
258 grad_arep, grad_so_x, grad_so_y, grad_so_z,
263 grad_arep, grad_so_x, grad_so_y, grad_so_z,
268 grad_arep, grad_so_x, grad_so_y, grad_so_z,
271 grad_arep, grad_so_x, grad_so_y, grad_so_z,
282 grpp_origin, grad_arep, grad_so_x,
283 grad_so_y, grad_so_z, +1.0);
285 grpp_origin, grad_arep, grad_so_x,
286 grad_so_y, grad_so_z, +1.0);
289 grpp_origin, grad_arep, grad_so_x,
290 grad_so_y, grad_so_z, -1.0);
292 grpp_origin, grad_arep, grad_so_x,
293 grad_so_y, grad_so_z, -1.0);
303 grad_arep, grad_so_x, grad_so_y, grad_so_z,
307 grad_arep, grad_so_x, grad_so_y, grad_so_z,
318 grad_arep, grad_so_x, grad_so_y, grad_so_z,
322 grad_arep, grad_so_x, grad_so_y, grad_so_z,
337 libgrpp_grpp_t *grpp_operator,
double *grpp_origin,
double **grad_arep,
338 double **grad_so_x,
double **grad_so_y,
double **grad_so_z,
double factor) {
342 double *arep_matrix_down = NULL;
343 double *so_x_matrix_down = NULL;
344 double *so_y_matrix_down = NULL;
345 double *so_z_matrix_down = NULL;
346 double *arep_matrix_up = NULL;
347 double *so_x_matrix_up = NULL;
348 double *so_y_matrix_up = NULL;
349 double *so_z_matrix_up = NULL;
350 int cart_size_down = 0;
351 int cart_size_up = 0;
354 shell_A, shell_B, grpp_operator, grpp_origin, &arep_matrix_down,
355 &so_x_matrix_down, &so_y_matrix_down, &so_z_matrix_down, &arep_matrix_up,
356 &so_x_matrix_up, &so_y_matrix_up, &so_z_matrix_up, &cart_size_down,
363 for (
int icoord = 0; icoord < 3; icoord++) {
365 for (
int j = 0; j < shell_B->
cart_size; j++) {
373 ket_nlm[0] = shell_B->
cart_list[3 * j + 0];
374 ket_nlm[1] = shell_B->
cart_list[3 * j + 1];
375 ket_nlm[2] = shell_B->
cart_list[3 * j + 2];
382 if (shell_A->
L > 0) {
383 bra_nlm[icoord] -= 1;
386 bra_nlm[icoord] += 1;
388 grad_arep[icoord][index] -=
389 factor * bra_nlm[icoord] *
390 arep_matrix_down[shell_B->
cart_size * bra_index + ket_index];
391 grad_so_x[icoord][index] -=
392 factor * bra_nlm[icoord] *
393 so_x_matrix_down[shell_B->
cart_size * bra_index + ket_index];
394 grad_so_y[icoord][index] -=
395 factor * bra_nlm[icoord] *
396 so_y_matrix_down[shell_B->
cart_size * bra_index + ket_index];
397 grad_so_z[icoord][index] -=
398 factor * bra_nlm[icoord] *
399 so_z_matrix_down[shell_B->
cart_size * bra_index + ket_index];
405 bra_nlm[icoord] += 1;
408 bra_nlm[icoord] -= 1;
410 grad_arep[icoord][index] +=
411 factor * arep_matrix_up[shell_B->
cart_size * bra_index + ket_index];
412 grad_so_x[icoord][index] +=
413 factor * so_x_matrix_up[shell_B->
cart_size * bra_index + ket_index];
414 grad_so_y[icoord][index] +=
415 factor * so_y_matrix_up[shell_B->
cart_size * bra_index + ket_index];
416 grad_so_z[icoord][index] +=
417 factor * so_z_matrix_up[shell_B->
cart_size * bra_index + ket_index];
422 if (arep_matrix_down) {
423 free(arep_matrix_down);
424 free(so_x_matrix_down);
425 free(so_y_matrix_down);
426 free(so_z_matrix_down);
428 free(arep_matrix_up);
429 free(so_x_matrix_up);
430 free(so_y_matrix_up);
431 free(so_z_matrix_up);
447 double **arep_matrix_down,
double **so_x_matrix_down,
448 double **so_y_matrix_down,
double **so_z_matrix_down,
449 double **arep_matrix_up,
double **so_x_matrix_up,
double **so_y_matrix_up,
450 double **so_z_matrix_up,
int *cart_size_down,
int *cart_size_up) {
459 if (shell_A_down != NULL) {
460 *cart_size_down = shell_A_down->
cart_size;
467 if (shell_A_down != NULL) {
469 *arep_matrix_down = (
double *)calloc(mat_size_down,
sizeof(
double));
470 *so_x_matrix_down = (
double *)calloc(mat_size_down,
sizeof(
double));
471 *so_y_matrix_down = (
double *)calloc(mat_size_down,
sizeof(
double));
472 *so_z_matrix_down = (
double *)calloc(mat_size_down,
sizeof(
double));
475 shell_A_down, shell_B, grpp_operator, grpp_origin, *arep_matrix_down,
476 *so_x_matrix_down, *so_y_matrix_down, *so_z_matrix_down);
478 *arep_matrix_down = NULL;
479 *so_x_matrix_down = NULL;
480 *so_y_matrix_down = NULL;
481 *so_z_matrix_down = NULL;
488 *arep_matrix_up = (
double *)calloc(mat_size_up,
sizeof(
double));
489 *so_x_matrix_up = (
double *)calloc(mat_size_up,
sizeof(
double));
490 *so_y_matrix_up = (
double *)calloc(mat_size_up,
sizeof(
double));
491 *so_z_matrix_up = (
double *)calloc(mat_size_up,
sizeof(
double));
494 *arep_matrix_up, *so_x_matrix_up, *so_y_matrix_up,
515 libgrpp_grpp_t *grpp_operator,
double *grpp_origin,
double **grad_arep,
516 double **grad_so_x,
double **grad_so_y,
double **grad_so_z,
double factor) {
520 double *arep_matrix_down = NULL;
521 double *so_x_matrix_down = NULL;
522 double *so_y_matrix_down = NULL;
523 double *so_z_matrix_down = NULL;
524 double *arep_matrix_up = NULL;
525 double *so_x_matrix_up = NULL;
526 double *so_y_matrix_up = NULL;
527 double *so_z_matrix_up = NULL;
528 int cart_size_down = 0;
529 int cart_size_up = 0;
532 shell_A, shell_B, grpp_operator, grpp_origin, &arep_matrix_down,
533 &so_x_matrix_down, &so_y_matrix_down, &so_z_matrix_down, &arep_matrix_up,
534 &so_x_matrix_up, &so_y_matrix_up, &so_z_matrix_up, &cart_size_down,
541 for (
int icoord = 0; icoord < 3; icoord++) {
543 for (
int j = 0; j < shell_B->
cart_size; j++) {
551 ket_nlm[0] = shell_B->
cart_list[3 * j + 0];
552 ket_nlm[1] = shell_B->
cart_list[3 * j + 1];
553 ket_nlm[2] = shell_B->
cart_list[3 * j + 2];
560 if (shell_B->
L > 0) {
561 ket_nlm[icoord] -= 1;
564 ket_nlm[icoord] += 1;
566 grad_arep[icoord][index] -=
567 factor * ket_nlm[icoord] *
568 arep_matrix_down[cart_size_down * bra_index + ket_index];
569 grad_so_x[icoord][index] -=
570 factor * ket_nlm[icoord] *
571 so_x_matrix_down[cart_size_down * bra_index + ket_index];
572 grad_so_y[icoord][index] -=
573 factor * ket_nlm[icoord] *
574 so_y_matrix_down[cart_size_down * bra_index + ket_index];
575 grad_so_z[icoord][index] -=
576 factor * ket_nlm[icoord] *
577 so_z_matrix_down[cart_size_down * bra_index + ket_index];
583 ket_nlm[icoord] += 1;
586 ket_nlm[icoord] -= 1;
588 grad_arep[icoord][index] +=
589 factor * arep_matrix_up[cart_size_up * bra_index + ket_index];
590 grad_so_x[icoord][index] +=
591 factor * so_x_matrix_up[cart_size_up * bra_index + ket_index];
592 grad_so_y[icoord][index] +=
593 factor * so_y_matrix_up[cart_size_up * bra_index + ket_index];
594 grad_so_z[icoord][index] +=
595 factor * so_z_matrix_up[cart_size_up * bra_index + ket_index];
600 if (arep_matrix_down) {
601 free(arep_matrix_down);
602 free(so_x_matrix_down);
603 free(so_y_matrix_down);
604 free(so_z_matrix_down);
606 free(arep_matrix_up);
607 free(so_x_matrix_up);
608 free(so_y_matrix_up);
609 free(so_z_matrix_up);
625 double **arep_matrix_down,
double **so_x_matrix_down,
626 double **so_y_matrix_down,
double **so_z_matrix_down,
627 double **arep_matrix_up,
double **so_x_matrix_up,
double **so_y_matrix_up,
628 double **so_z_matrix_up,
int *cart_size_down,
int *cart_size_up) {
637 if (shell_B_down != NULL) {
638 *cart_size_down = shell_B_down->
cart_size;
645 if (shell_B_down != NULL) {
647 *arep_matrix_down = (
double *)calloc(mat_size_down,
sizeof(
double));
648 *so_x_matrix_down = (
double *)calloc(mat_size_down,
sizeof(
double));
649 *so_y_matrix_down = (
double *)calloc(mat_size_down,
sizeof(
double));
650 *so_z_matrix_down = (
double *)calloc(mat_size_down,
sizeof(
double));
654 shell_A, shell_B_down, grpp_operator, grpp_origin, *arep_matrix_down,
655 *so_x_matrix_down, *so_y_matrix_down, *so_z_matrix_down);
657 *arep_matrix_down = NULL;
658 *so_x_matrix_down = NULL;
659 *so_y_matrix_down = NULL;
660 *so_z_matrix_down = NULL;
667 *arep_matrix_up = (
double *)calloc(mat_size_up,
sizeof(
double));
668 *so_x_matrix_up = (
double *)calloc(mat_size_up,
sizeof(
double));
669 *so_y_matrix_up = (
double *)calloc(mat_size_up,
sizeof(
double));
670 *so_z_matrix_up = (
double *)calloc(mat_size_up,
sizeof(
double));
674 shell_A, shell_B_up, grpp_operator, grpp_origin, *arep_matrix_up,
675 *so_x_matrix_up, *so_y_matrix_up, *so_z_matrix_up);
689 double *grpp_origin,
double **grad_arep,
690 double **grad_so_x,
double **grad_so_y,
691 double **grad_so_z,
int diff_bra,
706 double *arep_matrix_down = NULL;
707 double *so_x_matrix_down = NULL;
708 double *so_y_matrix_down = NULL;
709 double *so_z_matrix_down = NULL;
710 double *arep_matrix_up = NULL;
711 double *so_x_matrix_up = NULL;
712 double *so_y_matrix_up = NULL;
713 double *so_z_matrix_up = NULL;
714 int cart_size_down = 0;
715 int cart_size_up = 0;
718 shell_A, shell_B, grpp_operator, grpp_origin, &arep_matrix_down,
719 &so_x_matrix_down, &so_y_matrix_down, &so_z_matrix_down, &arep_matrix_up,
720 &so_x_matrix_up, &so_y_matrix_up, &so_z_matrix_up, &cart_size_down,
721 &cart_size_up, diff_bra);
727 for (
int icoord = 0; icoord < 3; icoord++) {
729 for (
int j = 0; j < shell_B->
cart_size; j++) {
737 ket_nlm[0] = shell_B->
cart_list[3 * j + 0];
738 ket_nlm[1] = shell_B->
cart_list[3 * j + 1];
739 ket_nlm[2] = shell_B->
cart_list[3 * j + 2];
743 int *diff_nlm = diff_bra ? bra_nlm : ket_nlm;
748 if (cart_size_down > 0) {
749 diff_nlm[icoord] -= 1;
752 diff_nlm[icoord] += 1;
754 int n = diff_nlm[icoord];
755 int row_len = diff_bra ? shell_B->
cart_size : cart_size_down;
756 int index_down = row_len * bra_index + ket_index;
758 grad_arep[icoord][index] -= factor * n * arep_matrix_down[index_down];
759 grad_so_x[icoord][index] -= factor * n * so_x_matrix_down[index_down];
760 grad_so_y[icoord][index] -= factor * n * so_y_matrix_down[index_down];
761 grad_so_z[icoord][index] -= factor * n * so_z_matrix_down[index_down];
767 diff_nlm[icoord] += 1;
770 diff_nlm[icoord] -= 1;
772 int row_len = diff_bra ? shell_B->
cart_size : cart_size_up;
773 int index_up = row_len * bra_index + ket_index;
775 grad_arep[icoord][index] += factor * arep_matrix_up[index_up];
776 grad_so_x[icoord][index] += factor * so_x_matrix_up[index_up];
777 grad_so_y[icoord][index] += factor * so_y_matrix_up[index_up];
778 grad_so_z[icoord][index] += factor * so_z_matrix_up[index_up];
783 if (arep_matrix_down) {
784 free(arep_matrix_down);
785 free(so_x_matrix_down);
786 free(so_y_matrix_down);
787 free(so_z_matrix_down);
789 free(arep_matrix_up);
790 free(so_x_matrix_up);
791 free(so_y_matrix_up);
792 free(so_z_matrix_up);
808 double **arep_matrix_down,
double **so_x_matrix_down,
809 double **so_y_matrix_down,
double **so_z_matrix_down,
810 double **arep_matrix_up,
double **so_x_matrix_up,
double **so_y_matrix_up,
811 double **so_z_matrix_up,
int *cart_size_down,
int *cart_size_up,
829 diff_shell = shell_A;
830 const_shell = shell_B;
832 diff_shell = shell_B;
833 const_shell = shell_A;
844 if (shell_down != NULL) {
853 if (shell_down != NULL) {
855 *arep_matrix_down = (
double *)calloc(mat_size_down,
sizeof(
double));
856 *so_x_matrix_down = (
double *)calloc(mat_size_down,
sizeof(
double));
857 *so_y_matrix_down = (
double *)calloc(mat_size_down,
sizeof(
double));
858 *so_z_matrix_down = (
double *)calloc(mat_size_down,
sizeof(
double));
861 diff_bra ? shell_down : shell_A, diff_bra ? shell_B : shell_down,
862 grpp_operator, grpp_origin, *arep_matrix_down, *so_x_matrix_down,
863 *so_y_matrix_down, *so_z_matrix_down);
865 *arep_matrix_down = NULL;
866 *so_x_matrix_down = NULL;
867 *so_y_matrix_down = NULL;
868 *so_z_matrix_down = NULL;
876 *arep_matrix_up = (
double *)calloc(mat_size_up,
sizeof(
double));
877 *so_x_matrix_up = (
double *)calloc(mat_size_up,
sizeof(
double));
878 *so_y_matrix_up = (
double *)calloc(mat_size_up,
sizeof(
double));
879 *so_z_matrix_up = (
double *)calloc(mat_size_up,
sizeof(
double));
882 diff_bra ? shell_B : shell_up, grpp_operator,
883 grpp_origin, *arep_matrix_up, *so_x_matrix_up,
884 *so_y_matrix_up, *so_z_matrix_up);
901 double **grad = (
double **)calloc(3,
sizeof(
double *));
902 for (
int icoord = 0; icoord < 3; icoord++) {
903 grad[icoord] = (
double *)calloc(size,
sizeof(
double));
static void const int const int i
libgrpp_grpp_t * libgrpp_new_grpp()
void libgrpp_grpp_add_spin_orbit_potential(libgrpp_grpp_t *grpp, libgrpp_potential_t *pot)
void libgrpp_grpp_add_outercore_potential(libgrpp_grpp_t *grpp, libgrpp_potential_t *pot, libgrpp_shell_t *oc_shell)
void libgrpp_delete_grpp(libgrpp_grpp_t *grpp)
void libgrpp_grpp_add_averaged_potential(libgrpp_grpp_t *grpp, libgrpp_potential_t *pot)
void libgrpp_grpp_set_local_potential(libgrpp_grpp_t *grpp, libgrpp_potential_t *pot)
void libgrpp_differentiate_shell(libgrpp_shell_t *shell, libgrpp_shell_t **shell_minus, libgrpp_shell_t **shell_plus)
void libgrpp_full_grpp_integrals(libgrpp_shell_t *shell_A, libgrpp_shell_t *shell_B, libgrpp_grpp_t *grpp_operator, double *grpp_origin, double *arep_matrix, double *so_x_matrix, double *so_y_matrix, double *so_z_matrix)
void grpp_gradient_diff_bra_grpp_integrals(libgrpp_shell_t *shell_A, libgrpp_shell_t *shell_B, libgrpp_grpp_t *grpp_operator, double *grpp_origin, double **arep_matrix_down, double **so_x_matrix_down, double **so_y_matrix_down, double **so_z_matrix_down, double **arep_matrix_up, double **so_x_matrix_up, double **so_y_matrix_up, double **so_z_matrix_up, int *cart_size_down, int *cart_size_up)
double ** libgrpp_alloc_gradients(libgrpp_shell_t *bra, libgrpp_shell_t *ket)
void libgrpp_type2_integrals_gradient(libgrpp_shell_t *shell_A, libgrpp_shell_t *shell_B, double *grpp_origin, libgrpp_potential_t *potential, double *point_3d, double **grad_arep)
void libgrpp_outercore_potential_integrals_gradient(libgrpp_shell_t *shell_A, libgrpp_shell_t *shell_B, double *rpp_origin, int num_oc_shells, libgrpp_potential_t **oc_potentials, libgrpp_shell_t **oc_shells, double *point_3d, double **grad_arep, double **grad_so_x, double **grad_so_y, double **grad_so_z)
void libgrpp_full_grpp_integrals_gradient(libgrpp_shell_t *shell_A, libgrpp_shell_t *shell_B, libgrpp_grpp_t *grpp_operator, double *grpp_origin, double *point_3d, double **grad_arep, double **grad_so_x, double **grad_so_y, double **grad_so_z)
void grpp_gradient_diff_ket_grpp_integrals(libgrpp_shell_t *shell_A, libgrpp_shell_t *shell_B, libgrpp_grpp_t *grpp_operator, double *grpp_origin, double **arep_matrix_down, double **so_x_matrix_down, double **so_y_matrix_down, double **so_z_matrix_down, double **arep_matrix_up, double **so_x_matrix_up, double **so_y_matrix_up, double **so_z_matrix_up, int *cart_size_down, int *cart_size_up)
void grpp_gradient_diff_bra_contribution(libgrpp_shell_t *shell_A, libgrpp_shell_t *shell_B, libgrpp_grpp_t *grpp_operator, double *grpp_origin, double **grad_arep, double **grad_so_x, double **grad_so_y, double **grad_so_z, double factor)
void libgrpp_spin_orbit_integrals_gradient(libgrpp_shell_t *shell_A, libgrpp_shell_t *shell_B, double *grpp_origin, libgrpp_potential_t *potential, double *point_3d, double **grad_so_x, double **grad_so_y, double **grad_so_z)
void libgrpp_type1_integrals_gradient(libgrpp_shell_t *shell_A, libgrpp_shell_t *shell_B, double *grpp_origin, libgrpp_potential_t *potential, double *point_3d, double **grad_arep)
void grpp_gradient_diff_gaussian(libgrpp_shell_t *shell_A, libgrpp_shell_t *shell_B, libgrpp_grpp_t *grpp_operator, double *grpp_origin, double **arep_matrix_down, double **so_x_matrix_down, double **so_y_matrix_down, double **so_z_matrix_down, double **arep_matrix_up, double **so_x_matrix_up, double **so_y_matrix_up, double **so_z_matrix_up, int *cart_size_down, int *cart_size_up, int diff_bra)
void grpp_gradient_diff_ket_contribution(libgrpp_shell_t *shell_A, libgrpp_shell_t *shell_B, libgrpp_grpp_t *grpp_operator, double *grpp_origin, double **grad_arep, double **grad_so_x, double **grad_so_y, double **grad_so_z, double factor)
int libgrpp_nlm_to_linear(int *nlm)
void grpp_gradient_contribution(libgrpp_shell_t *shell_A, libgrpp_shell_t *shell_B, libgrpp_grpp_t *grpp_operator, double *grpp_origin, double **grad_arep, double **grad_so_x, double **grad_so_y, double **grad_so_z, int diff_bra, double factor)
void libgrpp_dealloc_gradients(double **grad)
void libgrpp_delete_shell(libgrpp_shell_t *shell)
int points_are_equal(double *a, double *b)
libgrpp_potential_t * U_L