1
0
mirror of https://github.com/TREX-CoE/qmckl.git synced 2025-04-30 12:24:49 +02:00

optimizations

This commit is contained in:
Emiel Slootman 2025-02-05 12:44:32 +01:00
parent 7b3a8fd558
commit 51e41b2b3c
2 changed files with 493 additions and 70 deletions

View File

@ -2142,20 +2142,19 @@ integer(qmckl_exit_code) function qmckl_compute_forces_dtmp_c( &
if (cord_num < 0) info = QMCKL_INVALID_ARG_5
if (info /= QMCKL_SUCCESS) return
do nw=1, walk_num
do i=0, cord_num-1
do k =1, 4
info = qmckl_dgemm(context,'N','N',elec_num*1_8,&
nucl_num*(cord_num+1)*4_8, elec_num*1_8, -1.0d0, &
een_rescaled_e_gl(1,k,1,i,nw),4_8*elec_num, &
een_rescaled_n_gl(1,1,1,0,nw),elec_num*1_8, &
0.0d0, &
forces_dtmp_c(1,k,1,1,0,i,nw),4_8*elec_num)
end do
end do
end do
!do nw=1, walk_num
! do i=0, cord_num-1
! do k =1, 4
! info = qmckl_dgemm(context,'N','N',elec_num*1_8,&
! nucl_num*(cord_num+1)*4_8, elec_num*1_8, -1.0d0, &
! een_rescaled_e_gl(1,k,1,i,nw),4_8*elec_num, &
! een_rescaled_n_gl(1,1,1,0,nw),elec_num*1_8, &
! 0.0d0, &
! forces_dtmp_c(1,k,1,1,0,i,nw),4_8*elec_num)
! end do
! end do
!end do
if (.true.) then
do nw = 1, walk_num
do l = 0, cord_num-1
do m = 0, cord_num
@ -2175,7 +2174,6 @@ integer(qmckl_exit_code) function qmckl_compute_forces_dtmp_c( &
end do
end do
end do
end if
end function qmckl_compute_forces_dtmp_c
#+end_src
@ -2543,6 +2541,8 @@ integer(qmckl_exit_code) function qmckl_compute_forces_jastrow_een( &
if (cord_num < 0) info = QMCKL_INVALID_ARG_5
if (info /= QMCKL_SUCCESS) return
forces_jastrow_een = 0.d0
do nw =1, walk_num
do n = 1, dim_c_vector
l = lkpm_combined_index(n, 1)
@ -2555,8 +2555,8 @@ integer(qmckl_exit_code) function qmckl_compute_forces_jastrow_een( &
if(cn == 0.d0) cycle
do j = 1, elec_num
do ii = 1, 3
accu = een_rescaled_n(j,a,m,nw) * forces_tmp_c(j,ii,a,m+l,k,nw)
accu = accu - een_rescaled_n_gl(j,ii,a,m,nw) * tmp_c(j,a,m+l,k,nw)
accu = een_rescaled_n(j,a,m,nw) * forces_tmp_c(j,ii,a,m+l,k,nw) &
- een_rescaled_n_gl(j,ii,a,m,nw) * tmp_c(j,a,m+l,k,nw)
forces_jastrow_een(ii, a, nw) = forces_jastrow_een(ii, a, nw) + accu * cn
end do
@ -2790,7 +2790,7 @@ integer(qmckl_exit_code) function qmckl_compute_forces_een_rescaled_n_gl( &
real (c_double ) , intent(in) :: een_rescaled_n_gl(elec_num,4,nucl_num,0:cord_num,walk_num)
real (c_double ) , intent(out) :: forces_een_n(elec_num,4,nucl_num,3,0:cord_num,walk_num)
double precision :: x, ria_inv, kappa_l
double precision :: x, ria_inv, kappa_l, temp
integer*8 :: i, a, k, l, nw, m, n
@ -2823,6 +2823,34 @@ integer(qmckl_exit_code) function qmckl_compute_forces_een_rescaled_n_gl( &
!forces_een_n = 0.0d0
!do nw = 1, walk_num
! do l = 0, cord_num
! do a = 1, nucl_num
! kappa_l = dble(l)*rescale_factor_en(type_nucl_vector(a)+1)
! do i = 1, elec_num
! ria_inv = 1.0d0 / en_distance(a,i,nw)
! do n = 1, 3
! do m = 1, 3
! if (m == n) then
! forces_een_n(i,m,a,n,l,nw) = forces_een_n(i,m,a,n,l,nw) + &
! kappa_l*een_rescaled_n(i,a,l,nw) * ria_inv
! end if
! temp = een_rescaled_n_gl(i,m,a,l,nw) * een_rescaled_n_gl(i,n,a,l,nw) / een_rescaled_n(i,a,l,nw)
! forces_een_n(i,m,a,n,l,nw) = forces_een_n(i,m,a,n,l,nw) - &
! temp * ria_inv / kappa_l - temp
! end do
! forces_een_n(i,4,a,n,l,nw) = forces_een_n(i,4,a,n,l,nw) + &
! (2.0d0 * ria_inv * ria_inv &
! - een_rescaled_n_gl(i,4,a,l,nw)/een_rescaled_n(i,a,l,nw)) * &
! een_rescaled_n_gl(i,n,a,l,nw)
! end do
! end do
! end do
! end do
!end do
forces_een_n = 0.0d0
do nw = 1, walk_num
do i = 1, elec_num
@ -4345,7 +4373,6 @@ integer(qmckl_exit_code) function qmckl_compute_forces_jastrow_delta_p_doc( &
do a = 1, nucl_num
delta_n_gl = een_rescaled_single_n_gl(k,a,l,nw) - een_rescaled_n_gl(num, k, a, l, nw)
do j = 1, elec_num
forces_delta_p(j,k,a,l,m,nw) = delta_e(j) * (-een_rescaled_single_n_gl(k,a,l,nw)) - &
een_rescaled_e(j,num,m,nw) * delta_n_gl
end do
@ -5308,6 +5335,7 @@ qmckl_exit_code qmckl_provide_forces_ao_value(qmckl_context context)
}
ctx->forces.forces_ao_value = forces_ao_value;
}
rc = qmckl_provide_ao_basis_ao_vgl(context);
if (rc != QMCKL_SUCCESS) {
return qmckl_failwith( context, rc, "qmckl_provide_ao_basis_ao_vgl", NULL);
@ -5430,6 +5458,8 @@ function qmckl_compute_forces_ao_value_doc(context, &
end do
end do
deallocate(ao_index)
end function qmckl_compute_forces_ao_value_doc
#+end_src
@ -5729,26 +5759,41 @@ integer(qmckl_exit_code) function qmckl_compute_forces_mo_value_doc(context, &
real(c_double) , intent(in) :: forces_ao_value(ao_num,point_num,3,nucl_num)
real(c_double) , intent(in) :: coefficient_t(mo_num,ao_num)
real(c_double) , intent(out) :: forces_mo_value(mo_num,point_num,3,nucl_num)
integer*8 :: i,j,k,a
integer*8 :: i,j,k,a, m
double precision :: c1, c2, c3
info = QMCKL_SUCCESS
forces_mo_value = 0.0d0
do j=1,point_num
do k=1,ao_num
do a=1,nucl_num
c1 = forces_ao_value(k,j,1,a)
c2 = forces_ao_value(k,j,2,a)
c3 = forces_ao_value(k,j,3,a)
do i=1,mo_num
forces_mo_value(i,j,1,a) = forces_mo_value(i,j,1,a) + coefficient_t(i,k) * c1
forces_mo_value(i,j,2,a) = forces_mo_value(i,j,2,a) + coefficient_t(i,k) * c2
forces_mo_value(i,j,3,a) = forces_mo_value(i,j,3,a) + coefficient_t(i,k) * c3
end do
end do
end do
end do
!do a=1,nucl_num
! do j=1,point_num
! do k=1,ao_num
! c1 = forces_ao_value(k,j,1,a)
! c2 = forces_ao_value(k,j,2,a)
! c3 = forces_ao_value(k,j,3,a)
! do i=1,mo_num
! forces_mo_value(i,j,1,a) = forces_mo_value(i,j,1,a) + coefficient_t(i,k) * c1
! forces_mo_value(i,j,2,a) = forces_mo_value(i,j,2,a) + coefficient_t(i,k) * c2
! forces_mo_value(i,j,3,a) = forces_mo_value(i,j,3,a) + coefficient_t(i,k) * c3
! end do
! end do
! end do
!end do
!do a=1,nucl_num
! do m=1,3
! info = qmckl_dgemm(context,'N', 'N', mo_num, point_num, ao_num, &
! 1.0d0, coefficient_t, mo_num, &
! forces_ao_value(:, :, m, a), ao_num, &
! 0.0d0, forces_mo_value(:, :, m, a), mo_num)
! end do
!end do
info = qmckl_dgemm(context,'N', 'N', mo_num, 3*nucl_num*point_num, ao_num, &
1.0d0, coefficient_t(1,1), mo_num, &
forces_ao_value(1,1,1,1), ao_num, &
0.0d0, forces_mo_value(1,1,1,1), mo_num)
end function qmckl_compute_forces_mo_value_doc
@ -6062,19 +6107,48 @@ integer function qmckl_compute_forces_mo_g_doc(context, &
info = QMCKL_SUCCESS
do j=1,point_num
forces_mo_g(:,:,j,:,:) = 0.d0
do k=1,ao_num
do i=1,mo_num
do a=1, nucl_num
do m = 1, 3
do n = 1, 3
forces_mo_g(i, m, j, n, a) = forces_mo_g(i, m, j, n, a) - coefficient_t(i,k) * ao_hessian(k, m, j, n, a)
end do
end do
end do
end do
end do
forces_mo_g = 0.d0
!do j=1,point_num
! !forces_mo_g(:,:,j,:,:) = 0.d0
! do k=1,ao_num
! do i=1,mo_num
! do a=1, nucl_num
! do m = 1, 3
! do n = 1, 3
! forces_mo_g(i, m, j, n, a) = forces_mo_g(i, m, j, n, a) - coefficient_t(i,k) * ao_hessian(k, m, j, n, a)
! end do
! end do
! end do
! end do
! end do
!end do
! do k=1,ao_num
! do i=1,mo_num
! do m = 1, 3
! forces_mo_g(i, m, :,:,:) = forces_mo_g(i, m, :,:,:) - coefficient_t(i,k) * ao_hessian(k, m, :,:,:)
! end do
! end do
! end do
!do m = 1, 3
! info = qmckl_dgemm(context,'N', 'N', mo_num, point_num * 3 * nucl_num, ao_num, &
! -1.d0, coefficient_t, mo_num, &
! ao_hessian(:, m, :, :, :), ao_num, &
! 1.d0, forces_mo_g(:, m, :, :, :), mo_num)
!end do
do a=1,nucl_num
do n = 1,3
do m = 1, 3
info = qmckl_dgemm(context,'N', 'N', mo_num, point_num, ao_num, &
-1.d0, coefficient_t, mo_num, &
ao_hessian(:, m, :, n, a), ao_num, &
1.d0, forces_mo_g(:, m, :, n, a), mo_num)
end do
end do
end do
@ -6392,21 +6466,31 @@ integer function qmckl_compute_forces_mo_l_doc(context, &
integer*8 :: i,j,k, m, n,a
info = QMCKL_SUCCESS
forces_mo_l = 0.d0
!do j=1,point_num
! forces_mo_l(:,j,:,:) = 0.d0
! do k=1,ao_num
! do i=1,mo_num
! do a=1, nucl_num
! do n = 1, 3
! forces_mo_l(i, j, n, a) = forces_mo_l(i, j, n, a) - coefficient_t(i,k) * ao_hessian(k, 4, j, n, a)
! end do
! end do
! end do
! end do
!end do
do j=1,point_num
forces_mo_l(:,j,:,:) = 0.d0
do k=1,ao_num
do i=1,mo_num
do a=1, nucl_num
do n = 1, 3
forces_mo_l(i, j, n, a) = forces_mo_l(i, j, n, a) - coefficient_t(i,k) * ao_hessian(k, 4, j, n, a)
end do
end do
end do
end do
do a=1,nucl_num
do m = 1, 3
info = qmckl_dgemm(context,'N', 'N', mo_num, point_num, ao_num, &
-1.d0, coefficient_t, mo_num, &
ao_hessian(:, 4, :, m, a), ao_num, &
1.d0, forces_mo_l(:, :, m, a), mo_num)
end do
end do
end function qmckl_compute_forces_mo_l_doc
#+end_src

View File

@ -3291,12 +3291,8 @@ integer(qmckl_exit_code) function qmckl_compute_jastrow_champ_delta_p_gl_doc( &
do k = 1, 4
do a = 1, nucl_num
een_rescaled_delta_n = een_rescaled_single_n(a,l,nw) - een_rescaled_n(num, a, l, nw)
!tmp = fk(k) * (een_rescaled_n(num,a,l,nw) + een_rescaled_delta_n)
tmp = fk(k) * een_rescaled_single_n(a,l,nw)
do j = 1, elec_num
delta_p_gl(j,a,k,l,m,nw) = delta_e_gl(j,k) * tmp + &
een_rescaled_e_gl(j,k,num,m,nw) * een_rescaled_delta_n
end do
delta_p_gl(:,a,k,l,m,nw) = delta_e_gl(:,k) * fk(k) * een_rescaled_single_n(a,l,nw) + &
een_rescaled_e_gl(:,k,num,m,nw) * een_rescaled_delta_n
do j = 1, elec_num
delta_p_gl(num,a,k,l,m,nw) = delta_p_gl(num,a,k,l,m,nw) + delta_e_gl(j,k) * een_rescaled_n(j,a,l,nw)
end do
@ -3699,6 +3695,7 @@ integer(qmckl_exit_code) function qmckl_compute_jastrow_champ_factor_single_een_
delta_p(i,a,m ,k,nw) * een_rescaled_n_gl(i,kk,a,m+l,nw) + &
delta_p(i,a,m+l,k,nw) * een_rescaled_n_gl(i,kk,a,m ,nw) ) * cn
end do
delta_een_gl(num,kk,nw) = delta_een_gl(num,kk,nw) + ( &
(dtmp_c(num,kk,a,m ,k,nw) + delta_p_gl(num,a,kk,m ,k,nw)) * een_rescaled_delta_n(a,m+l,nw) + &
(dtmp_c(num,kk,a,m+l,k,nw) + delta_p_gl(num,a,kk,m+l,k,nw)) * een_rescaled_delta_n(a,m ,nw) + &
@ -3903,12 +3900,12 @@ qmckl_get_jastrow_champ_single_een_g(qmckl_context context,
"Array is NULL.");
}
int64_t sze = 3 * ctx->electron.num * ctx->electron.walker.num;
int64_t sze = 4 * ctx->electron.num * ctx->electron.walker.num;
if (size_max < sze) {
return qmckl_failwith( context,
QMCKL_INVALID_ARG_3,
"qmckl_get_jastrow_champ_single_een_g",
"Array too small. Expected 3 * ctx->electron.num * ctx->electron.walker.num");
"Array too small. Expected 4 * ctx->electron.num * ctx->electron.walker.num");
}
memcpy(delta_een_g, ctx->single_point.delta_een_g, sze * sizeof(double));
@ -3985,7 +3982,7 @@ qmckl_exit_code qmckl_provide_jastrow_champ_single_een_g(qmckl_context context)
if (ctx->single_point.delta_een_g == NULL) {
qmckl_memory_info_struct mem_info = qmckl_memory_info_struct_zero;
mem_info.size = 3 * ctx->electron.num * ctx->electron.walker.num * sizeof(double);
mem_info.size = 4 * ctx->electron.num * ctx->electron.walker.num * sizeof(double);
double* delta_een_g = (double*) qmckl_malloc(context, mem_info);
if (delta_een_g == NULL) {
@ -4053,7 +4050,7 @@ qmckl_exit_code qmckl_provide_jastrow_champ_single_een_g(qmckl_context context)
| ~een_rescaled_single_n~ | ~double[walk_num][0:cord_num][nucl_num]~ | in | Electron-nucleus single rescaled distances |
| ~een_rescaled_n_gl~ | ~double[walk_num][0:cord_num][nucl_num][4][elec_num]~ | in | Electron-nucleus rescaled distances derivatives |
| ~een_rescaled_single_n_gl~ | ~double[walk_num][0:cord_num][nucl_num][4]~ | in | Electron-nucleus single rescaled distances derivatives |
| ~delta_een_g~ | ~double[walk_num][3][elec_num]~ | out | Delta electron-electron-nucleus jastrow gradient |
| ~delta_een_g~ | ~double[walk_num][4][elec_num]~ | out | Delta electron-electron-nucleus jastrow gradient |
|----------------------------+---------------------------------------------------------------------+--------+----------------------------------------------------------------|
#+begin_src f90 :comments org :tangle (eval f) :noweb yes
@ -4078,7 +4075,7 @@ integer(qmckl_exit_code) function qmckl_compute_jastrow_champ_factor_single_een_
real(c_double) , intent(in) :: een_rescaled_single_n(nucl_num, 0:cord_num, walk_num)
real(c_double) , intent(in) :: een_rescaled_n_gl(elec_num, 4, nucl_num, 0:cord_num, walk_num)
real(c_double) , intent(in) :: een_rescaled_single_n_gl(4, nucl_num, 0:cord_num, walk_num)
real(c_double) , intent(out) :: delta_een_g(elec_num, 3, walk_num)
real(c_double) , intent(out) :: delta_een_g(elec_num, 4, walk_num)
integer*8 :: i, a, j, l, k, p, m, n, nw, kk, num
double precision :: accu, accu2, cn
@ -4222,7 +4219,7 @@ qmckl_compute_jastrow_champ_factor_single_een_g (const qmckl_context context,
assert(qmckl_jastrow_champ_provided(context));
double een_g_old[walk_num][4][elec_num];
double delta_een_g[walk_num][3][elec_num];
double delta_een_g[walk_num][4][elec_num];
double een_g_new[walk_num][4][elec_num];
@ -4240,7 +4237,7 @@ for (int elec = 0; elec < elec_num; elec++){
rc = qmckl_set_single_point(context, 'N', elec, new_coords, 3*walk_num);
assert (rc == QMCKL_SUCCESS);
rc = qmckl_get_jastrow_champ_single_een_g(context, &delta_een_g[0][0][0], walk_num*3*elec_num);
rc = qmckl_get_jastrow_champ_single_een_g(context, &delta_een_g[0][0][0], walk_num*4*elec_num);
assert (rc == QMCKL_SUCCESS);
coords[0][elec][0] = new_coords[0];
@ -7122,6 +7119,348 @@ qmckl_get_jastrow_champ_single_accept(qmckl_context context);
#+begin_src c :comments org :tangle (eval c) :noweb yes
qmckl_exit_code
qmckl_get_jastrow_champ_single_accept_alt(qmckl_context context)
{
if (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) {
return QMCKL_NULL_CONTEXT;
}
qmckl_context_struct* const ctx = (qmckl_context_struct*) context;
assert (ctx != NULL);
qmckl_exit_code rc;
double metric[4] = {-1.0, -1.0, -1.0, 1.0};
int old_date, do_update;
int shift1, shift2, shift3, shift4, shift5, shift6, shift7;
int shift8, shift9, shift10, shift11, shift12, shift13, shift14;
old_date = ctx->single_point.date;
do_update = 0;
rc = qmckl_context_touch(context);
if (rc != QMCKL_SUCCESS) return rc;
ctx->single_point.date = ctx->date;
if (ctx->jastrow_champ.cord_num > 0) {
if(old_date == ctx->single_point.delta_een_date) {
shift1 = (ctx->jastrow_champ.cord_num+1)*ctx->electron.num*ctx->electron.num;
shift2 = ctx->electron.num*ctx->electron.num;
shift3 = (ctx->jastrow_champ.cord_num+1)*ctx->nucleus.num*ctx->electron.num;
shift4 = ctx->nucleus.num*ctx->electron.num;
shift5 = (ctx->jastrow_champ.cord_num+1)*ctx->nucleus.num;
for (int nw = 0; nw < ctx->electron.walker.num; nw++) {
ctx->jastrow_champ.factor_een[nw] = ctx->jastrow_champ.factor_een[nw] + ctx->single_point.delta_een[nw];
for (int l = 0; l <= ctx->jastrow_champ.cord_num; l++){
for (int i = 0; i < ctx->electron.num; i++) {
ctx->jastrow_champ.een_rescaled_e[nw*shift1
+ l*shift2
+ i*ctx->electron.num
+ ctx->single_point.num] =
ctx->single_point.een_rescaled_single_e[nw*shift3
+ l*ctx->electron.num
+ i];
ctx->jastrow_champ.een_rescaled_e[nw*shift1
+ l*shift2
+ ctx->single_point.num*ctx->electron.num
+ i] =
ctx->single_point.een_rescaled_single_e[nw*shift3
+ l*ctx->electron.num
+ i];
}
for (int a = 0; a < ctx->nucleus.num; a++){
ctx->jastrow_champ.een_rescaled_n[nw*shift3
+ l*shift4
+ a*ctx->electron.num
+ ctx->single_point.num] =
ctx->single_point.een_rescaled_single_n[nw*shift5
+ l*ctx->nucleus.num
+ a];
}
}
}
for (int i = 0; i < (ctx->electron.walker.num*(ctx->jastrow_champ.cord_num+1)*ctx->nucleus.num*ctx->electron.num*ctx->jastrow_champ.cord_num); i++) {
ctx->jastrow_champ.tmp_c[i] = ctx->jastrow_champ.tmp_c[i] + ctx->single_point.delta_p[i];
}
ctx->jastrow_champ.een_rescaled_e_date = ctx->date;
ctx->jastrow_champ.een_rescaled_n_date = ctx->date;
ctx->jastrow_champ.factor_een_date = ctx->date;
ctx->jastrow_champ.tmp_c_date = ctx->date;
ctx->single_point.een_rescaled_single_e_date = ctx->single_point.date;
ctx->single_point.een_rescaled_single_n_date = ctx->single_point.date;
ctx->single_point.delta_een_date = ctx->single_point.date;
ctx->single_point.delta_p_date = ctx->single_point.date;
}
if(old_date == ctx->single_point.delta_een_gl_date) {
for (int i = 0; i < ctx->electron.walker.num * 4 * ctx->electron.num; i++) {
ctx->jastrow_champ.factor_een_gl[i] = ctx->jastrow_champ.factor_een_gl[i] + ctx->single_point.delta_een_gl[i];
}
ctx->jastrow_champ.factor_een_gl_date = ctx->date;
ctx->single_point.delta_een_gl_date = ctx->single_point.date;
do_update = 1;
} else if (old_date == ctx->single_point.delta_een_g_date) {
for (int nw = 0; nw < ctx->electron.walker.num; nw++) {
for (int k = 0; k < 3; k++){
for (int i = 0; i < ctx->electron.num; i++){
ctx->jastrow_champ.factor_een_gl[nw*ctx->electron.num*4 + k*ctx->electron.num + i] =
ctx->jastrow_champ.factor_een_gl[nw*ctx->electron.num*4 + k*ctx->electron.num + i] +
ctx->single_point.delta_een_g[nw*ctx->electron.num*3 + k*ctx->electron.num + i];
}
}
}
ctx->jastrow_champ.factor_een_gl_date = ctx->date;
ctx->single_point.delta_een_g_date = ctx->single_point.date;
do_update = 1;
}
if (do_update == 1) {
shift1 = (ctx->jastrow_champ.cord_num+1)*ctx->electron.num*4*ctx->electron.num;
shift2 = ctx->electron.num*4*ctx->electron.num;
shift3 = ctx->electron.num*4;
shift4 = (ctx->jastrow_champ.cord_num+1)*ctx->electron.num*4;
shift5 = (ctx->jastrow_champ.cord_num+1)*ctx->nucleus.num*4*ctx->electron.num;
shift6 = ctx->nucleus.num*4*ctx->electron.num;
shift7 = (ctx->jastrow_champ.cord_num+1)*ctx->nucleus.num*4;
shift8 = ctx->nucleus.num*4;
shift9 = ctx->nucleus.num*ctx->electron.num;
for (int nw = 0; nw < ctx->electron.walker.num; nw++) {
for (int l = 0; l <= ctx->jastrow_champ.cord_num; l++){
for (int i = 0; i < ctx->electron.num; i++) {
for (int k = 0; k < 4; k++){
ctx->jastrow_champ.een_rescaled_e_gl[nw*shift1
+ l*shift2
+ i*shift3
+ k*ctx->electron.num
+ ctx->single_point.num] =
ctx->single_point.een_rescaled_single_e_gl[nw*shift4
+ l*shift3
+ i*4
+ k];
ctx->jastrow_champ.een_rescaled_e_gl[nw*shift1
+ l*shift2
+ ctx->single_point.num*shift3
+ k*ctx->electron.num
+ i] =
metric[k] * ctx->single_point.een_rescaled_single_e_gl[nw*shift4
+ l*shift3
+ i*4
+ k];
}
}
for (int a = 0; a < ctx->nucleus.num; a++){
for (int k = 0; k < 4; k++){
ctx->jastrow_champ.een_rescaled_n_gl[nw*shift5
+ l*shift6
+ a*shift3
+ k*ctx->electron.num
+ ctx->single_point.num] =
ctx->single_point.een_rescaled_single_n_gl[nw*shift7
+ l*shift8
+ a*4
+ k];
}
}
}
}
for (int nw = 0; nw < ctx->electron.walker.num*(ctx->jastrow_champ.cord_num+1)*ctx->jastrow_champ.cord_num; nw++) {
for (int a = 0; a < ctx->nucleus.num; a++) {
for (int k = 0; k < 4; k++){
for (int i = 0; i < ctx->electron.num; i++) {
ctx->jastrow_champ.dtmp_c[nw*shift6
+ a*shift3
+ k*ctx->electron.num
+ i] =
ctx->jastrow_champ.dtmp_c[nw*shift6
+ a*shift3
+ k*ctx->electron.num
+ i] +
ctx->single_point.delta_p_gl[nw*shift6
+ k*shift9
+ a*ctx->electron.num
+ i];
}
}
}
}
ctx->jastrow_champ.dtmp_c_date = ctx->date;
ctx->jastrow_champ.een_rescaled_e_gl_date = ctx->date;
ctx->jastrow_champ.een_rescaled_n_gl_date = ctx->date;
ctx->single_point.een_rescaled_single_e_gl_date = ctx->single_point.date;
ctx->single_point.een_rescaled_single_n_gl_date = ctx->single_point.date;
ctx->single_point.delta_p_gl_date = ctx->single_point.date;
}
}
shift1 = (ctx->jastrow_champ.cord_num+1)*ctx->electron.num*ctx->electron.num;
shift2 = ctx->electron.num*ctx->electron.num;
shift3 = (ctx->jastrow_champ.cord_num+1)*ctx->electron.num;
shift4 = (ctx->jastrow_champ.cord_num+1)*ctx->electron.num*4*ctx->electron.num;
shift5 = ctx->electron.num*4*ctx->electron.num;
shift6 = ctx->electron.num*4;
shift7 = (ctx->jastrow_champ.cord_num+1)*ctx->electron.num*4;
shift8 = (ctx->jastrow_champ.cord_num+1)*ctx->nucleus.num*ctx->electron.num;
shift9 = (ctx->jastrow_champ.cord_num+1)*ctx->nucleus.num;
shift10 = (ctx->jastrow_champ.cord_num+1)*ctx->nucleus.num*4*ctx->electron.num;
shift11 = ctx->nucleus.num*4*ctx->electron.num;
shift12 = (ctx->jastrow_champ.cord_num+1)*ctx->nucleus.num*4;
shift13 = ctx->nucleus.num*4;
shift14 = ctx->nucleus.num*ctx->electron.num;
for (int nw = 0; nw < ctx->electron.walker.num; nw++) {
ctx->jastrow_champ.factor_en[nw] = ctx->jastrow_champ.factor_en[nw] + ctx->single_point.delta_en[nw];
ctx->jastrow_champ.factor_ee[nw] = ctx->jastrow_champ.factor_ee[nw] + ctx->single_point.delta_ee[nw];
for (int a = 0; a < ctx->nucleus.num; a++) {
ctx->electron.en_distance[nw*shift14
+ ctx->single_point.num*ctx->nucleus.num
+ a] =
ctx->single_point.single_en_distance[nw*ctx->nucleus.num
+ a];
ctx->jastrow_champ.en_distance_rescaled[nw*shift14
+ a*ctx->electron.num
+ ctx->single_point.num] =
ctx->single_point.en_rescaled_single[nw*ctx->nucleus.num
+ a];
for (int k = 0; k < 4; k++){
ctx->jastrow_champ.en_distance_rescaled_gl[nw*shift11
+ a*shift6
+ ctx->single_point.num*4
+ k] =
ctx->single_point.en_rescaled_single_gl[nw*shift13
+ a*4
+ k];
}
}
for (int i = 0; i < ctx->electron.num; i++) {
ctx->jastrow_champ.ee_distance_rescaled[nw*shift2
+ i*ctx->electron.num
+ ctx->single_point.num] =
ctx->single_point.ee_rescaled_single[nw*ctx->electron.num
+ i];
ctx->jastrow_champ.ee_distance_rescaled[nw*shift2
+ ctx->single_point.num*ctx->electron.num
+ i] =
ctx->single_point.ee_rescaled_single[nw*ctx->electron.num
+ i];
ctx->electron.ee_distance[nw*shift2
+ i*ctx->electron.num
+ ctx->single_point.num] =
ctx->single_point.single_ee_distance[nw*ctx->electron.num
+ i];
ctx->electron.ee_distance[nw*shift2
+ ctx->single_point.num*ctx->electron.num
+ i] =
ctx->single_point.single_ee_distance[nw*ctx->electron.num
+ i];
for (int k = 0; k < 4; k++){
ctx->jastrow_champ.ee_distance_rescaled_gl[nw*shift5
+ i*shift6
+ ctx->single_point.num*4
+ k] =
metric[k] * ctx->single_point.ee_rescaled_single_gl[nw*shift6
+ i*4
+ k];
ctx->jastrow_champ.ee_distance_rescaled_gl[nw*shift5
+ ctx->single_point.num*shift6
+ i*4
+ k] =
ctx->single_point.ee_rescaled_single_gl[nw*shift6
+ i*4
+ k];
}
}
for (int k = 0; k < 4; k++){
for (int i = 0; i < ctx->electron.num; i++) {
ctx->jastrow_champ.factor_ee_gl[nw*shift6
+ k*ctx->electron.num
+ i] =
ctx->jastrow_champ.factor_ee_gl[nw*shift6
+ k*ctx->electron.num
+ i] +
ctx->single_point.delta_ee_gl[nw*shift6
+ i*4
+ k];
ctx->jastrow_champ.factor_en_gl[nw*shift6
+ k*ctx->electron.num
+ i] =
ctx->jastrow_champ.factor_en_gl[nw*shift6
+ k*ctx->electron.num
+ i] +
ctx->single_point.delta_en_gl[nw*shift6
+ i*4
+ k];
}
}
}
for (int nw = 0; nw < ctx->electron.walker.num; nw++) {
for (int k = 0; k < 3; k++) {
ctx->point.coord.data[nw*3*ctx->electron.num + k*ctx->electron.num + ctx->single_point.num] = ctx->single_point.coord.data[nw*3 + k];
}
}
ctx->jastrow_champ.ee_distance_rescaled_date = ctx->date;
ctx->jastrow_champ.ee_distance_rescaled_gl_date = ctx->date;
ctx->jastrow_champ.en_distance_rescaled_date = ctx->date;
ctx->jastrow_champ.en_distance_rescaled_gl_date = ctx->date;
ctx->jastrow_champ.factor_ee_date = ctx->date;
ctx->jastrow_champ.factor_ee_gl_date = ctx->date;
ctx->jastrow_champ.factor_en_date = ctx->date;
ctx->jastrow_champ.factor_en_gl_date = ctx->date;
ctx->electron.ee_distance_date = ctx->date;
ctx->electron.en_distance_date = ctx->date;
ctx->single_point.date = ctx->date;
ctx->single_point.single_ee_distance_date = ctx->single_point.date;
ctx->single_point.single_en_distance_date = ctx->single_point.date;
ctx->single_point.ee_rescaled_single_date = ctx->single_point.date;
ctx->single_point.en_rescaled_single_date = ctx->single_point.date;
ctx->single_point.delta_en_date = ctx->single_point.date;
ctx->single_point.delta_ee_date = ctx->single_point.date;
ctx->single_point.ee_rescaled_single_gl_date = ctx->single_point.date;
ctx->single_point.en_rescaled_single_gl_date = ctx->single_point.date;
ctx->single_point.delta_en_gl_date = ctx->single_point.date;
ctx->single_point.delta_ee_gl_date = ctx->single_point.date;
return QMCKL_SUCCESS;
}
#+end_src
#+begin_src c :comments org :tangle (eval c) :noweb yes
qmckl_exit_code
qmckl_get_jastrow_champ_single_accept(qmckl_context context)
{