93
93
#include <stdbool.h>
94
94
#include <stdio.h>
95
95
#include "n2.h"
96
+ #include "qmckl_context_private_type.h"
96
97
#include "qmckl_jastrow_champ_private_func.h"
97
98
98
99
int main() {
@@ -2554,7 +2555,7 @@ assert(qmckl_electron_provided(context));
2554
2555
double ee_distance_rescaled_hpc[walk_num * elec_num * elec_num * (cord_num+1)];
2555
2556
memset(ee_distance_rescaled_hpc, 0, sizeof(ee_distance_rescaled_hpc));
2556
2557
2557
- rc = qmckl_compute_een_rescaled_e_doc (context, walk_num,
2558
+ rc = qmckl_compute_een_rescaled_e_hpc (context, walk_num,
2558
2559
elec_num, cord_num,
2559
2560
rescale_factor_ee,
2560
2561
&(ee_distance[0]),
@@ -7183,7 +7184,7 @@ print(" een_rescaled_e[1, 5, 2] = ",een_rescaled_e[1, 5, 2])
7183
7184
7184
7185
#+begin_src c :tangle (eval c_test)
7185
7186
assert(qmckl_electron_provided(context));
7186
-
7187
+ {
7187
7188
7188
7189
double een_rescaled_e[walk_num][(cord_num + 1)][elec_num][elec_num];
7189
7190
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);
7195
7196
assert(fabs(een_rescaled_e[0][2][1][3]- 0.1016685507354656 ) < 1.e-12);
7196
7197
assert(fabs(een_rescaled_e[0][2][1][4]- 0.0113118073246869 ) < 1.e-12);
7197
7198
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
+ }
7198
7229
#+end_src
7199
7230
7200
7231
*** 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( &
7367
7398
double precision , intent(in) :: een_rescaled_e(elec_num,elec_num,0:cord_num,walk_num)
7368
7399
double precision , intent(out) :: een_rescaled_e_gl(elec_num,4,elec_num,0:cord_num,walk_num)
7369
7400
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
7372
7403
integer*8 :: i, j, k, l, nw, ii
7373
7404
7405
+ double precision :: rij_inv(elec_num)
7406
+
7374
7407
allocate(elec_dist_gl(elec_num, 4, elec_num))
7375
7408
7376
7409
info = QMCKL_SUCCESS
@@ -7398,22 +7431,15 @@ integer function qmckl_compute_jastrow_champ_factor_een_rescaled_e_gl_f( &
7398
7431
! Prepare table of exponentiated distances raised to appropriate power
7399
7432
do nw = 1, walk_num
7400
7433
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
7403
7439
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)
7405
7441
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)
7417
7443
end do
7418
7444
end do
7419
7445
@@ -7428,17 +7454,21 @@ integer function qmckl_compute_jastrow_champ_factor_een_rescaled_e_gl_f( &
7428
7454
een_rescaled_e_gl(i, 2, j, l, nw) = kappa_l * elec_dist_gl(i, 2, j)
7429
7455
een_rescaled_e_gl(i, 3, j, l, nw) = kappa_l * elec_dist_gl(i, 3, j)
7430
7456
een_rescaled_e_gl(i, 4, j, l, nw) = kappa_l * elec_dist_gl(i, 4, j)
7457
+ end do
7431
7458
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)
7441
7464
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
7442
7472
end do
7443
7473
end do
7444
7474
end do
@@ -7606,7 +7636,6 @@ qmckl_exit_code qmckl_compute_jastrow_champ_factor_een_rescaled_e_gl_hpc (
7606
7636
double kappa_l = - (double)l * rescale_factor_ee;
7607
7637
for (int64_t j = 0; j < elec_num; ++j) {
7608
7638
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))];
7610
7639
#ifdef HAVE_OPENMP
7611
7640
#pragma omp simd
7612
7641
#endif
@@ -7625,6 +7654,7 @@ qmckl_exit_code qmckl_compute_jastrow_champ_factor_een_rescaled_e_gl_hpc (
7625
7654
eegl[i + elec_num*1] * eegl[i + elec_num*1] +
7626
7655
eegl[i + elec_num*2] * eegl[i + elec_num*2];
7627
7656
}
7657
+ const double* restrict ee = &een_rescaled_e[ elec_num * (j + elec_num * (l + (cord_num + 1) * nw))];
7628
7658
#ifdef HAVE_OPENMP
7629
7659
#pragma omp simd
7630
7660
#endif
@@ -7743,27 +7773,62 @@ print(" een_rescaled_e_gl[2, 1, 6, 2] = ",een_rescaled_e_gl[1, 0, 5, 2])
7743
7773
#+end_src
7744
7774
7745
7775
#+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);
7758
7806
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
+ }
7761
7826
7762
7827
{
7763
7828
printf("een_distance_rescaled_e_gl\n");
7764
7829
double fd[walk_num][cord_num+1][elec_num][4][elec_num];
7765
7830
7766
- double delta_x = 0.0001 ;
7831
+ double delta_x = 0.001 ;
7767
7832
7768
7833
// Finite difference coefficients for gradients
7769
7834
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));
7795
7860
7796
7861
memset(&(fd[0][0][0][0]), 0, sizeof(fd));
7797
7862
7798
- printf("%lu %lu\n", sizeof(function_values)/sizeof(double), walk_num*(cord_num+1)*elec_num*elec_num);
7799
-
7800
7863
for (int64_t k = 0; k < 3; k++) {
7801
7864
for (int64_t i = 0; i < elec_num; i++) {
7802
7865
for (int64_t m = -4; m <= 4; m++) { // Apply finite difference displacement
@@ -7810,6 +7873,8 @@ assert(qmckl_electron_provided(context));
7810
7873
&(temp_coord[0][0][0]),
7811
7874
walk_num*3*elec_num);
7812
7875
assert(rc == QMCKL_SUCCESS);
7876
+ rc = qmckl_context_touch(context);
7877
+ assert(rc == QMCKL_SUCCESS);
7813
7878
7814
7879
// Call the provided function
7815
7880
rc = qmckl_get_jastrow_champ_een_distance_rescaled_e(context,
@@ -7827,9 +7892,9 @@ assert(qmckl_electron_provided(context));
7827
7892
}
7828
7893
}
7829
7894
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];
7833
7898
}
7834
7899
}
7835
7900
}
@@ -7874,24 +7939,24 @@ assert(qmckl_electron_provided(context));
7874
7939
printf("%2d %2d %2d %2d %2d\t", nw, c, i, k, j);
7875
7940
printf("%.10e\t", fd[nw][c][i][k][j]);
7876
7941
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);
7878
7943
}
7879
7944
int k=3;
7880
7945
if (i != j) {
7881
7946
printf("%2d %2d %2d %2d %2d\t", nw, c, i, k, j);
7882
7947
printf("%.10e\t", fd[nw][c][i][k][j]);
7883
7948
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);
7885
7950
}
7886
7951
}
7887
7952
}
7888
7953
}
7889
7954
}
7890
- assert(0);
7891
7955
printf("OK\n");
7892
7956
}
7893
7957
7894
7958
#+end_src
7959
+
7895
7960
*** Electron-nucleus rescaled distances in $J_\text{eeN}$
7896
7961
7897
7962
~een_rescaled_n~ stores the table of the rescaled distances between
@@ -11616,13 +11681,7 @@ rc = qmckl_check(context,
11616
11681
);
11617
11682
assert(rc == QMCKL_SUCCESS);
11618
11683
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
+ /*
11626
11685
printf("%20.15e\n", factor_een_gl[0][0][0]);
11627
11686
assert(fabs(8.967809309100624e-02 - factor_een_gl[0][0][0]) < 1e-12);
11628
11687
@@ -11634,6 +11693,51 @@ assert(fabs(8.996044894431991e-04 - factor_een_gl[0][2][2]) < 1e-12);
11634
11693
11635
11694
printf("%20.15e\n", factor_een_gl[0][3][3]);
11636
11695
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
+ }
11637
11741
#+end_src
11638
11742
11639
11743
** Total Jastrow
0 commit comments