Skip to content

Commit 71de52c

Browse files
committed
Introduced many tests in Jastrow
1 parent edf40dc commit 71de52c

File tree

2 files changed

+169
-58
lines changed

2 files changed

+169
-58
lines changed

configure.ac

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,13 @@ AS_IF([test "x$ok" = "xyes"], [
359359
])
360360

361361

362+
AC_ARG_ENABLE(sanitizer, [AS_HELP_STRING([--enable-sanitizer],[enable sanitizer debug flags])], ok=$enableval, ok=no)
363+
if test "$ok" = "yes"; then
364+
CFLAGS="${CFLAGS} -fsanitize=address -fsanitize=undefined -fsanitize=leak -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=bounds -fsanitize=bounds-strict"
365+
FCFLAGS="${FCFLAGS} -fsanitize=address -fsanitize=undefined -fsanitize=leak -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=bounds -fsanitize=bounds-strict"
366+
fi
367+
368+
362369

363370
##
364371

org/qmckl_jastrow_champ.org

Lines changed: 162 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@
9393
#include <stdbool.h>
9494
#include <stdio.h>
9595
#include "n2.h"
96+
#include "qmckl_context_private_type.h"
9697
#include "qmckl_jastrow_champ_private_func.h"
9798

9899
int main() {
@@ -2554,7 +2555,7 @@ assert(qmckl_electron_provided(context));
25542555
double ee_distance_rescaled_hpc[walk_num * elec_num * elec_num * (cord_num+1)];
25552556
memset(ee_distance_rescaled_hpc, 0, sizeof(ee_distance_rescaled_hpc));
25562557

2557-
rc = qmckl_compute_een_rescaled_e_doc (context, walk_num,
2558+
rc = qmckl_compute_een_rescaled_e_hpc (context, walk_num,
25582559
elec_num, cord_num,
25592560
rescale_factor_ee,
25602561
&(ee_distance[0]),
@@ -7183,7 +7184,7 @@ print(" een_rescaled_e[1, 5, 2] = ",een_rescaled_e[1, 5, 2])
71837184

71847185
#+begin_src c :tangle (eval c_test)
71857186
assert(qmckl_electron_provided(context));
7186-
7187+
{
71877188

71887189
double een_rescaled_e[walk_num][(cord_num + 1)][elec_num][elec_num];
71897190
rc = qmckl_get_jastrow_champ_een_distance_rescaled_e(context, &(een_rescaled_e[0][0][0][0]),elec_num*elec_num*(cord_num+1)*walk_num);
@@ -7195,6 +7196,36 @@ assert(fabs(een_rescaled_e[0][1][0][4]- 0.0884012350763747 ) < 1.e-12);
71957196
assert(fabs(een_rescaled_e[0][2][1][3]- 0.1016685507354656 ) < 1.e-12);
71967197
assert(fabs(een_rescaled_e[0][2][1][4]- 0.0113118073246869 ) < 1.e-12);
71977198
assert(fabs(een_rescaled_e[0][2][1][5]- 0.5257156022077619 ) < 1.e-12);
7199+
}
7200+
7201+
{
7202+
printf("een_rescaled_e_hpc\n");
7203+
double ee_distance[walk_num * elec_num * elec_num];
7204+
rc = qmckl_get_electron_ee_distance(context, &(ee_distance[0]), walk_num*elec_num*elec_num);
7205+
assert(rc == QMCKL_SUCCESS);
7206+
7207+
double een_rescaled_e_doc[walk_num][cord_num+1][elec_num][elec_num];
7208+
memset(&(een_rescaled_e_doc[0][0][0][0]), 0, sizeof(een_rescaled_e_doc));
7209+
rc = qmckl_compute_een_rescaled_e(context, walk_num, elec_num, cord_num,
7210+
0.6, &(ee_distance[0]), &(een_rescaled_e_doc[0][0][0][0]));
7211+
assert(rc == QMCKL_SUCCESS);
7212+
7213+
double een_rescaled_e_hpc[walk_num][cord_num+1][elec_num][elec_num];
7214+
memset(&(een_rescaled_e_hpc[0][0][0][0]), 0, sizeof(een_rescaled_e_hpc));
7215+
rc = qmckl_compute_een_rescaled_e_hpc(context, walk_num, elec_num, cord_num,
7216+
0.6, &(ee_distance[0]), &(een_rescaled_e_hpc[0][0][0][0]));
7217+
assert(rc == QMCKL_SUCCESS);
7218+
7219+
for (int64_t i = 0; i < walk_num; i++) {
7220+
for (int64_t j = 0; j < cord_num+1; j++) {
7221+
for (int64_t k = 0; k < elec_num; k++) {
7222+
for (int64_t l = 0; l < elec_num; l++) {
7223+
assert(fabs(een_rescaled_e_doc[i][j][k][l] - een_rescaled_e_hpc[i][j][k][l]) < 1.e-8);
7224+
}
7225+
}
7226+
}
7227+
}
7228+
}
71987229
#+end_src
71997230

72007231
*** Electron-electron rescaled distances derivatives in $J_\text{eeN}$
@@ -7367,10 +7398,12 @@ integer function qmckl_compute_jastrow_champ_factor_een_rescaled_e_gl_f( &
73677398
double precision , intent(in) :: een_rescaled_e(elec_num,elec_num,0:cord_num,walk_num)
73687399
double precision , intent(out) :: een_rescaled_e_gl(elec_num,4,elec_num,0:cord_num,walk_num)
73697400

7370-
double precision,dimension(:,:,:),allocatable :: elec_dist_gl
7371-
double precision :: x, rij_inv, kappa_l
7401+
double precision, allocatable :: elec_dist_gl(:,:,:)
7402+
double precision :: x, kappa_l
73727403
integer*8 :: i, j, k, l, nw, ii
73737404

7405+
double precision :: rij_inv(elec_num)
7406+
73747407
allocate(elec_dist_gl(elec_num, 4, elec_num))
73757408

73767409
info = QMCKL_SUCCESS
@@ -7398,22 +7431,15 @@ integer function qmckl_compute_jastrow_champ_factor_een_rescaled_e_gl_f( &
73987431
! Prepare table of exponentiated distances raised to appropriate power
73997432
do nw = 1, walk_num
74007433
do j = 1, elec_num
7401-
do i = 1, j-1
7402-
rij_inv = 1.0d0 / ee_distance(i, j, nw)
7434+
do i = 1, elec_num
7435+
rij_inv(i) = 1.0d0 / (ee_distance(i, j, nw) + 1.d-30)
7436+
enddo
7437+
rij_inv(j) = 0.0d0
7438+
do i = 1, elec_num
74037439
do ii = 1, 3
7404-
elec_dist_gl(i, ii, j) = (coord_ee(i, ii, nw) - coord_ee(j, ii, nw)) * rij_inv
7440+
elec_dist_gl(i, ii, j) = (coord_ee(i, ii, nw) - coord_ee(j, ii, nw)) * rij_inv(i)
74057441
end do
7406-
elec_dist_gl(i, 4, j) = 2.0d0 * rij_inv
7407-
end do
7408-
7409-
elec_dist_gl(j, :, j) = 0.0d0
7410-
7411-
do i = j+1, elec_num
7412-
rij_inv = 1.0d0 / ee_distance(i, j, nw)
7413-
do ii = 1, 3
7414-
elec_dist_gl(i, ii, j) = (coord_ee(i, ii, nw) - coord_ee(j, ii, nw)) * rij_inv
7415-
end do
7416-
elec_dist_gl(i, 4, j) = 2.0d0 * rij_inv
7442+
elec_dist_gl(i, 4, j) = 2.0d0 * rij_inv(i)
74177443
end do
74187444
end do
74197445

@@ -7428,17 +7454,21 @@ integer function qmckl_compute_jastrow_champ_factor_een_rescaled_e_gl_f( &
74287454
een_rescaled_e_gl(i, 2, j, l, nw) = kappa_l * elec_dist_gl(i, 2, j)
74297455
een_rescaled_e_gl(i, 3, j, l, nw) = kappa_l * elec_dist_gl(i, 3, j)
74307456
een_rescaled_e_gl(i, 4, j, l, nw) = kappa_l * elec_dist_gl(i, 4, j)
7457+
end do
74317458

7432-
een_rescaled_e_gl(i, 4, j, l, nw) = een_rescaled_e_gl(i, 4, j, l, nw) &
7433-
+ een_rescaled_e_gl(i, 1, j, l, nw) * een_rescaled_e_gl(i, 1, j, l, nw) &
7434-
+ een_rescaled_e_gl(i, 2, j, l, nw) * een_rescaled_e_gl(i, 2, j, l, nw) &
7435-
+ een_rescaled_e_gl(i, 3, j, l, nw) * een_rescaled_e_gl(i, 3, j, l, nw)
7436-
7437-
een_rescaled_e_gl(i,1,j,l,nw) = een_rescaled_e_gl(i,1,j,l,nw) * een_rescaled_e(i,j,l,nw)
7438-
een_rescaled_e_gl(i,2,j,l,nw) = een_rescaled_e_gl(i,2,j,l,nw) * een_rescaled_e(i,j,l,nw)
7439-
een_rescaled_e_gl(i,3,j,l,nw) = een_rescaled_e_gl(i,3,j,l,nw) * een_rescaled_e(i,j,l,nw)
7440-
een_rescaled_e_gl(i,4,j,l,nw) = een_rescaled_e_gl(i,4,j,l,nw) * een_rescaled_e(i,j,l,nw)
7459+
do i = 1, elec_num
7460+
een_rescaled_e_gl(i, 4, j, l, nw) = een_rescaled_e_gl(i, 4, j, l, nw) &
7461+
+ een_rescaled_e_gl(i, 1, j, l, nw) * een_rescaled_e_gl(i, 1, j, l, nw) &
7462+
+ een_rescaled_e_gl(i, 2, j, l, nw) * een_rescaled_e_gl(i, 2, j, l, nw) &
7463+
+ een_rescaled_e_gl(i, 3, j, l, nw) * een_rescaled_e_gl(i, 3, j, l, nw)
74417464
end do
7465+
7466+
do i = 1, elec_num
7467+
een_rescaled_e_gl(i,1,j,l,nw) = een_rescaled_e_gl(i,1,j,l,nw) * een_rescaled_e(i,j,l,nw)
7468+
een_rescaled_e_gl(i,2,j,l,nw) = een_rescaled_e_gl(i,2,j,l,nw) * een_rescaled_e(i,j,l,nw)
7469+
een_rescaled_e_gl(i,3,j,l,nw) = een_rescaled_e_gl(i,3,j,l,nw) * een_rescaled_e(i,j,l,nw)
7470+
een_rescaled_e_gl(i,4,j,l,nw) = een_rescaled_e_gl(i,4,j,l,nw) * een_rescaled_e(i,j,l,nw)
7471+
end do
74427472
end do
74437473
end do
74447474
end do
@@ -7606,7 +7636,6 @@ qmckl_exit_code qmckl_compute_jastrow_champ_factor_een_rescaled_e_gl_hpc (
76067636
double kappa_l = - (double)l * rescale_factor_ee;
76077637
for (int64_t j = 0; j < elec_num; ++j) {
76087638
double* restrict eegl = &een_rescaled_e_gl[ elec_num * 4 * (j + elec_num * (l + (cord_num + 1) * nw))];
7609-
const double* restrict ee = &een_rescaled_e [ elec_num * (j + elec_num * (l + (cord_num + 1) * nw))];
76107639
#ifdef HAVE_OPENMP
76117640
#pragma omp simd
76127641
#endif
@@ -7625,6 +7654,7 @@ qmckl_exit_code qmckl_compute_jastrow_champ_factor_een_rescaled_e_gl_hpc (
76257654
eegl[i + elec_num*1] * eegl[i + elec_num*1] +
76267655
eegl[i + elec_num*2] * eegl[i + elec_num*2];
76277656
}
7657+
const double* restrict ee = &een_rescaled_e[ elec_num * (j + elec_num * (l + (cord_num + 1) * nw))];
76287658
#ifdef HAVE_OPENMP
76297659
#pragma omp simd
76307660
#endif
@@ -7743,27 +7773,62 @@ print(" een_rescaled_e_gl[2, 1, 6, 2] = ",een_rescaled_e_gl[1, 0, 5, 2])
77437773
#+end_src
77447774

77457775
#+begin_src c :tangle (eval c_test)
7746-
double een_rescaled_e_gl[walk_num][(cord_num + 1)][elec_num][4][elec_num];
7747-
size_max=walk_num*(cord_num + 1)*elec_num*4*elec_num;
7748-
rc = qmckl_get_jastrow_champ_een_distance_rescaled_e_gl(context,
7749-
&(een_rescaled_e_gl[0][0][0][0][0]),size_max);
7750-
7751-
assert(fabs(een_rescaled_e_gl[0][1][0][0][2] + 0.09831391870751387 ) < 1.e-12);
7752-
assert(fabs(een_rescaled_e_gl[0][1][0][0][3] + 0.017204157459682526 ) < 1.e-12);
7753-
assert(fabs(een_rescaled_e_gl[0][1][0][0][4] + 0.013345768421098641 ) < 1.e-12);
7754-
assert(fabs(een_rescaled_e_gl[0][2][1][0][3] + 0.03733086358273962 ) < 1.e-12);
7755-
assert(fabs(een_rescaled_e_gl[0][2][1][0][4] + 0.004922634822943517 ) < 1.e-12);
7756-
assert(fabs(een_rescaled_e_gl[0][2][1][0][5] + 0.5416751547830984 ) < 1.e-12);
7757-
#+end_src
7776+
{
7777+
double een_rescaled_e_gl[walk_num][(cord_num + 1)][elec_num][4][elec_num];
7778+
size_max=walk_num*(cord_num + 1)*elec_num*4*elec_num;
7779+
rc = qmckl_get_jastrow_champ_een_distance_rescaled_e_gl(context,
7780+
&(een_rescaled_e_gl[0][0][0][0][0]),size_max);
7781+
7782+
assert(fabs(een_rescaled_e_gl[0][1][0][0][2] + 0.09831391870751387 ) < 1.e-12);
7783+
assert(fabs(een_rescaled_e_gl[0][1][0][0][3] + 0.017204157459682526 ) < 1.e-12);
7784+
assert(fabs(een_rescaled_e_gl[0][1][0][0][4] + 0.013345768421098641 ) < 1.e-12);
7785+
assert(fabs(een_rescaled_e_gl[0][2][1][0][3] + 0.03733086358273962 ) < 1.e-12);
7786+
assert(fabs(een_rescaled_e_gl[0][2][1][0][4] + 0.004922634822943517 ) < 1.e-12);
7787+
assert(fabs(een_rescaled_e_gl[0][2][1][0][5] + 0.5416751547830984 ) < 1.e-12);
7788+
#+end_src
7789+
7790+
#+begin_src c :tangle (eval c_test)
7791+
assert(qmckl_electron_provided(context));
7792+
7793+
qmckl_context_struct* ctx = (qmckl_context_struct*) context;
7794+
double een_rescaled_e_gl_doc[walk_num*(cord_num + 1)*elec_num*4*elec_num];
7795+
memset(een_rescaled_e_gl_doc, 0, sizeof(een_rescaled_e_gl_doc));
7796+
rc = qmckl_compute_jastrow_champ_factor_een_rescaled_e_gl_doc(context,
7797+
ctx->electron.walker.num,
7798+
ctx->electron.num,
7799+
ctx->jastrow_champ.cord_num,
7800+
ctx->jastrow_champ.rescale_factor_ee,
7801+
ctx->electron.walker.point.coord.data,
7802+
ctx->electron.ee_distance,
7803+
ctx->jastrow_champ.een_rescaled_e,
7804+
een_rescaled_e_gl_doc);
7805+
assert(rc == QMCKL_SUCCESS);
77587806

7759-
#+begin_src c :tangle (eval c_test)
7760-
assert(qmckl_electron_provided(context));
7807+
double een_rescaled_e_gl_hpc[walk_num*(cord_num + 1)*elec_num*4*elec_num];
7808+
memset(een_rescaled_e_gl_hpc, 0, sizeof(een_rescaled_e_gl_hpc));
7809+
rc = qmckl_compute_jastrow_champ_factor_een_rescaled_e_gl_hpc(context,
7810+
ctx->electron.walker.num,
7811+
ctx->electron.num,
7812+
ctx->jastrow_champ.cord_num,
7813+
ctx->jastrow_champ.rescale_factor_ee,
7814+
ctx->electron.walker.point.coord.data,
7815+
ctx->electron.ee_distance,
7816+
ctx->jastrow_champ.een_rescaled_e,
7817+
een_rescaled_e_gl_hpc);
7818+
assert(rc == QMCKL_SUCCESS);
7819+
7820+
for (int64_t i = 0; i < walk_num*(cord_num + 1)*elec_num*4*elec_num; i++) {
7821+
printf("i = %ld, doc = %e, hpc = %e\n", i, een_rescaled_e_gl_doc[i], een_rescaled_e_gl_hpc[i]);
7822+
assert(fabs(een_rescaled_e_gl_doc[i] - een_rescaled_e_gl_hpc[i]) < 1.e-12);
7823+
}
7824+
7825+
}
77617826

77627827
{
77637828
printf("een_distance_rescaled_e_gl\n");
77647829
double fd[walk_num][cord_num+1][elec_num][4][elec_num];
77657830

7766-
double delta_x = 0.0001;
7831+
double delta_x = 0.001;
77677832

77687833
// Finite difference coefficients for gradients
77697834
double coef[9] = { 1.0/280.0, -4.0/105.0, 1.0/5.0, -4.0/5.0, 0.0, 4.0/5.0, -1.0/5.0, 4.0/105.0, -1.0/280.0 };
@@ -7795,8 +7860,6 @@ assert(qmckl_electron_provided(context));
77957860

77967861
memset(&(fd[0][0][0][0]), 0, sizeof(fd));
77977862

7798-
printf("%lu %lu\n", sizeof(function_values)/sizeof(double), walk_num*(cord_num+1)*elec_num*elec_num);
7799-
78007863
for (int64_t k = 0; k < 3; k++) {
78017864
for (int64_t i = 0; i < elec_num; i++) {
78027865
for (int64_t m = -4; m <= 4; m++) { // Apply finite difference displacement
@@ -7810,6 +7873,8 @@ assert(qmckl_electron_provided(context));
78107873
&(temp_coord[0][0][0]),
78117874
walk_num*3*elec_num);
78127875
assert(rc == QMCKL_SUCCESS);
7876+
rc = qmckl_context_touch(context);
7877+
assert(rc == QMCKL_SUCCESS);
78137878

78147879
// Call the provided function
78157880
rc = qmckl_get_jastrow_champ_een_distance_rescaled_e(context,
@@ -7827,9 +7892,9 @@ assert(qmckl_electron_provided(context));
78277892
}
78287893
}
78297894

7830-
for (int64_t nw=0 ; nw<walk_num ; nw++) {
7831-
temp_coord[nw][i][k] = elec_coord[nw][i][k];
7832-
}
7895+
}
7896+
for (int64_t nw=0 ; nw<walk_num ; nw++) {
7897+
temp_coord[nw][i][k] = elec_coord[nw][i][k];
78337898
}
78347899
}
78357900
}
@@ -7874,24 +7939,24 @@ assert(qmckl_electron_provided(context));
78747939
printf("%2d %2d %2d %2d %2d\t", nw, c, i, k, j);
78757940
printf("%.10e\t", fd[nw][c][i][k][j]);
78767941
printf("%.10e\n", een_distance_rescaled_e_gl[nw][c][i][k][j]);
7877-
// assert(fabs(fd[nw][c][i][k][j] - een_distance_rescaled_e_gl[nw][c][i][k][j]) < 1.e-8);
7942+
assert(fabs(fd[nw][c][i][k][j] - een_distance_rescaled_e_gl[nw][c][i][k][j]) < 1.e-8);
78787943
}
78797944
int k=3;
78807945
if (i != j) {
78817946
printf("%2d %2d %2d %2d %2d\t", nw, c, i, k, j);
78827947
printf("%.10e\t", fd[nw][c][i][k][j]);
78837948
printf("%.10e\n", een_distance_rescaled_e_gl[nw][c][i][k][j]);
7884-
// assert(fabs(fd[nw][c][i][k][j] - een_distance_rescaled_e_gl[nw][c][i][k][j]) < 1.e-6);
7949+
assert(fabs(fd[nw][c][i][k][j] - een_distance_rescaled_e_gl[nw][c][i][k][j]) < 1.e-6);
78857950
}
78867951
}
78877952
}
78887953
}
78897954
}
7890-
assert(0);
78917955
printf("OK\n");
78927956
}
78937957

78947958
#+end_src
7959+
78957960
*** Electron-nucleus rescaled distances in $J_\text{eeN}$
78967961

78977962
~een_rescaled_n~ stores the table of the rescaled distances between
@@ -11616,13 +11681,7 @@ rc = qmckl_check(context,
1161611681
);
1161711682
assert(rc == QMCKL_SUCCESS);
1161811683

11619-
for (int nw=0 ; nw<walk_num ; nw++) {
11620-
for (int k=0 ; k<4 ; k++) {
11621-
for (int i=0 ; i<elec_num ; i++) {
11622-
printf("factor_een_gl[%d][%d][%d] = %e\n", nw, k, i, factor_een_gl[nw][k][i]);
11623-
}
11624-
}
11625-
}
11684+
/*
1162611685
printf("%20.15e\n", factor_een_gl[0][0][0]);
1162711686
assert(fabs(8.967809309100624e-02 - factor_een_gl[0][0][0]) < 1e-12);
1162811687

@@ -11634,6 +11693,51 @@ assert(fabs(8.996044894431991e-04 - factor_een_gl[0][2][2]) < 1e-12);
1163411693

1163511694
printf("%20.15e\n", factor_een_gl[0][3][3]);
1163611695
assert(fabs(-1.175028308456619e+00 - factor_een_gl[0][3][3]) < 1e-12);
11696+
TODO
11697+
*/
11698+
{
11699+
printf("factor_een_gl_hpc\n");
11700+
11701+
qmckl_context_struct* const ctx = (qmckl_context_struct*) context;
11702+
assert (ctx != NULL);
11703+
11704+
double factor_een_gl_doc[walk_num*4*elec_num];
11705+
memset(&(factor_een_gl_doc[0]), 0, walk_num*4*elec_num*sizeof(double));
11706+
rc = qmckl_compute_jastrow_champ_factor_een_gl_doc(context,
11707+
ctx->electron.walker.num,
11708+
ctx->electron.num,
11709+
ctx->nucleus.num,
11710+
ctx->jastrow_champ.cord_num,
11711+
ctx->jastrow_champ.dim_c_vector,
11712+
ctx->jastrow_champ.c_vector_full,
11713+
ctx->jastrow_champ.lkpm_combined_index,
11714+
ctx->jastrow_champ.tmp_c,
11715+
ctx->jastrow_champ.dtmp_c,
11716+
ctx->jastrow_champ.een_rescaled_n,
11717+
ctx->jastrow_champ.een_rescaled_n_gl,
11718+
factor_een_gl_doc);
11719+
assert(rc == QMCKL_SUCCESS);
11720+
11721+
double factor_een_gl_hpc[walk_num*4*elec_num];
11722+
memset(&(factor_een_gl_hpc[0]), 0, walk_num*4*elec_num*sizeof(double));
11723+
rc = qmckl_compute_jastrow_champ_factor_een_gl(context,
11724+
ctx->electron.walker.num,
11725+
ctx->electron.num,
11726+
ctx->nucleus.num,
11727+
ctx->jastrow_champ.cord_num,
11728+
ctx->jastrow_champ.dim_c_vector,
11729+
ctx->jastrow_champ.c_vector_full,
11730+
ctx->jastrow_champ.lkpm_combined_index,
11731+
ctx->jastrow_champ.tmp_c,
11732+
ctx->jastrow_champ.dtmp_c,
11733+
ctx->jastrow_champ.een_rescaled_n,
11734+
ctx->jastrow_champ.een_rescaled_n_gl,
11735+
factor_een_gl_hpc);
11736+
11737+
for (int64_t i = 0; i < walk_num*4*elec_num; ++i) {
11738+
assert(fabs(factor_een_gl_doc[i] - factor_een_gl_hpc[i]) < 1e-12);
11739+
}
11740+
}
1163711741
#+end_src
1163811742

1163911743
** Total Jastrow

0 commit comments

Comments
 (0)