From 40ce1bceb2fee5a3f4b4a5368f53a90112b7d08a Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 14 Jan 2022 12:40:31 +0100 Subject: [PATCH] Merge Abdallah --- ezfio_config/qmc.config | 12 +- make.config.gfortran | 3 +- make.config.ifort | 3 +- src/JASTROW/jastrow_param.irp.f | 35 +++++ src/PROPERTIES/properties_mu.irp.f | 203 ++++++++++++++++++++--------- src/det.irp.f | 14 +- src/ezfio_interface.irp.f | 5 +- 7 files changed, 202 insertions(+), 73 deletions(-) diff --git a/ezfio_config/qmc.config b/ezfio_config/qmc.config index fc36452..780bd3b 100644 --- a/ezfio_config/qmc.config +++ b/ezfio_config/qmc.config @@ -23,7 +23,7 @@ electrons elec_walk_num integer elec_coord_pool real (electrons_elec_num+1,3,electrons_elec_coord_pool_size) elec_coord_pool_size integer - elec_fitcusp_radius real + elec_fitcusp_radius real nuclei nucl_num integer @@ -64,7 +64,7 @@ simulation equilibration logical http_server character*(128) do_jast logical - nucl_fitcusp_factor real + nucl_fitcusp_factor real method character*(32) block_time integer sampling character*(32) @@ -83,7 +83,7 @@ jastrow jast_a_up_dn real jast_b_up_up real jast_b_up_dn real - mu_erf real + mu_erf real jast_pen real (nuclei_nucl_num) jast_eeN_e_a real (nuclei_nucl_num) jast_eeN_e_b real (nuclei_nucl_num) @@ -92,9 +92,13 @@ jastrow jast_core_a2 real (nuclei_nucl_num) jast_core_b1 real (nuclei_nucl_num) jast_core_b2 real (nuclei_nucl_num) + jast_1b_type integer + jast_1btanh_pen real (nuclei_nucl_num) + jast_1berf_pen real (nuclei_nucl_num) + jast_1bgauss_pen real (nuclei_nucl_num) blocks - empty integer + empty integer pseudo ao_pseudo_grid double precision (ao_basis_ao_num,pseudo_pseudo_lmax+pseudo_pseudo_lmax+1,pseudo_pseudo_lmax-0+1,nuclei_nucl_num,pseudo_pseudo_grid_size) diff --git a/make.config.gfortran b/make.config.gfortran index ac6352b..fc4b749 100644 --- a/make.config.gfortran +++ b/make.config.gfortran @@ -8,10 +8,11 @@ CPU_TYPE="-mavx" FC="gfortran -ffree-line-length-none" FCFLAGS="-O2 -g ${CPU_TYPE}" LIB="-lblas -llapack -lpthread" +ARCHIVE="ar crf" ## IRPF90 IRPF90="${QMCCHEM_PATH}/bin/irpf90" IRPF90_FLAGS="--align=16" -export FC FCFLAGS LIB IRPF90 IRPF90_FLAGS +export FC FCFLAGS LIB IRPF90 IRPF90_FLAGS AR diff --git a/make.config.ifort b/make.config.ifort index 7321337..9ce4809 100644 --- a/make.config.ifort +++ b/make.config.ifort @@ -12,10 +12,11 @@ ALIGN="32" FC="ifort" FCFLAGS="-O2 -g -ip -ftz -finline ${CPU_TYPE} -qopenmp-simd" #-traceback LIB="-mkl=sequential" +ARCHIVE="ar crf" ## IRPF90 IRPF90="${QMCCHEM_PATH}/bin/irpf90" IRPF90_FLAGS="--align=${ALIGN}" -export FC FCFLAGS LIB IRPF90 IRPF90_FLAGS +export FC FCFLAGS LIB IRPF90 IRPF90_FLAGS ARCHIVE diff --git a/src/JASTROW/jastrow_param.irp.f b/src/JASTROW/jastrow_param.irp.f index 95bb8bb..f0dca09 100644 --- a/src/JASTROW/jastrow_param.irp.f +++ b/src/JASTROW/jastrow_param.irp.f @@ -156,3 +156,38 @@ END_PROVIDER END_PROVIDER +BEGIN_PROVIDER [ integer, jast_1b_type ] + implicit none + include '../types.F' + jast_1b_type = 0 ! no 1body Jastrow + !jast_1b_type = 2 ! add 1body-Tanh Jastrow + !jast_1b_type = 3 ! add 1body-Simple Jastrow + !jast_1b_type = 4 ! add 1body-RSDFT Jastrow + !jast_1b_type = 5 ! add 1body-erf Jastrow + !jast_1b_type = 6 ! add 1body-Gauss Jastrow + call get_jastrow_jast_1b_type(jast_1b_type) +END_PROVIDER + +! useful if jast_1b_type = 2 +BEGIN_PROVIDER [ real, jast_1btanh_pen, (nucl_num) ] + implicit none + include '../types.F' + jast_1btanh_pen(:) = 1.0 + call get_jastrow_jast_1btanh_pen(jast_1btanh_pen) +END_PROVIDER + +! useful if jast_1b_type = 5 +BEGIN_PROVIDER [ real, jast_1berf_pen, (nucl_num) ] + implicit none + include '../types.F' + jast_1berf_pen(:) = 1.0 + call get_jastrow_jast_1berf_pen(jast_1berf_pen) +END_PROVIDER + +! useful if jast_1b_type = 6 +BEGIN_PROVIDER [ real, jast_1bGauss_pen, (nucl_num) ] + implicit none + include '../types.F' + jast_1bGauss_pen(:) = 1.0 + call get_jastrow_jast_1bgauss_pen(jast_1bGauss_pen) +END_PROVIDER diff --git a/src/PROPERTIES/properties_mu.irp.f b/src/PROPERTIES/properties_mu.irp.f index 60890c7..5d9ae6b 100644 --- a/src/PROPERTIES/properties_mu.irp.f +++ b/src/PROPERTIES/properties_mu.irp.f @@ -1,18 +1,34 @@ -BEGIN_PROVIDER [ double precision, Energy_mu ] + +BEGIN_PROVIDER [ double precision, emudiff ] implicit none BEGIN_DOC ! E mu - ! Eq.(26-30) END_DOC - integer :: i - energy_mu = E_nucl + !emudiff = e_loc - energy_mu * jast_value_inv * jast_value_inv + emudiff = ( e_loc - energy_mu ) * jast_value_inv * jast_value_inv + + emudiff_min = min(emudiff_min,emudiff) + emudiff_max = max(emudiff_max,emudiff) + SOFT_TOUCH emudiff_min emudiff_max +END_PROVIDER + +BEGIN_PROVIDER [ double precision, Energy_mu ] + + BEGIN_DOC + ! E mu = < H_mu \Phi / \Phi >_{\Phi^2} + END_DOC + + implicit none + integer :: i + + Energy_mu = E_nucl !DIR$ VECTOR ALIGNED !DIR$ LOOP COUNT(200) - do i=1,elec_num - energy_mu += E_kin_elec(i) + do i = 1, elec_num + Energy_mu += E_kin_elec_psidet(i) enddo - energy_mu += Eff_pot_mu + eff_pot_deriv_mu + E_nucl_elec - three_body_mu + Energy_mu += Eff_pot_mu + Eff_pot_deriv_mu + E_nucl_elec - three_body_mu energy_mu_min = min(energy_mu_min,energy_mu) energy_mu_max = max(energy_mu_max,energy_mu) @@ -21,8 +37,6 @@ END_PROVIDER BEGIN_PROVIDER [double precision, E_nucl_elec] implicit none - !TODO - integer :: i,j E_nucl_elec = 0.d0 do i = 1, elec_num @@ -36,41 +50,63 @@ END_PROVIDER BEGIN_PROVIDER [double precision, Eff_pot_mu_elec, (elec_num)] &BEGIN_PROVIDER [double precision, Eff_pot_mu_elec_simple, (elec_num)] - implicit none - include '../constants.F' - BEGIN_DOC - ! Eq.(32) - END_DOC - integer :: i,j - double precision :: rij, mu - mu = mu_erf - Eff_pot_mu_elec = 0.d0 - do i=1,elec_num - !DIR$ VECTOR ALIGNED - !DIR$ LOOP COUNT(50) - do j=1,elec_num - rij = elec_dist(j,i) - if(i==j)cycle - Eff_pot_mu_elec(i) = Eff_pot_mu_elec(i) + 0.5d0 * derf(mu * rij) * elec_dist_inv(j,i) - Eff_pot_mu_elec(i) = Eff_pot_mu_elec(i) + 0.5d0 * mu/dsqpi * dexp(-mu*mu*rij*rij) - Eff_pot_mu_elec_simple(i) = Eff_pot_mu_elec(i) - Eff_pot_mu_elec(i) = Eff_pot_mu_elec(i) + 0.5d0 * (- 0.25d0 * (1.d0 - derf(mu*rij))**2.d0 ) + + include '../constants.F' + + implicit none + integer :: i,j + double precision :: rij, mu + + mu = mu_erf +! mu = jast_mu_erf + Eff_pot_mu_elec = 0.d0 + + + ! 2body-Jastrow: + ! + ! \Delta_i u_ij + \Delta_j u_ij = 2 [ (1-erf(mu r_ij))/r_ij - mu exp(-(mu r_ij)^2)/sqrt(pi) ] + ! + ! (grad_i u_ij)^2 + (grad_j u_ij)^2 = (1-erf(mu r_ij))^2 / 2 + + do i = 1, elec_num + !DIR$ VECTOR ALIGNED + !DIR$ LOOP COUNT(50) + do j = 1, elec_num + rij = elec_dist(j,i) + if(i==j)cycle + + Eff_pot_mu_elec(i) = Eff_pot_mu_elec(i) + 0.5d0 * derf(mu * rij) * elec_dist_inv(j,i) + Eff_pot_mu_elec(i) = Eff_pot_mu_elec(i) + 0.5d0 * mu/dsqpi * dexp(-mu*mu*rij*rij) + Eff_pot_mu_elec_simple(i) = Eff_pot_mu_elec(i) + + Eff_pot_mu_elec(i) = Eff_pot_mu_elec(i) + 0.5d0 * (- 0.25d0 * (1.d0 - derf(mu*rij))**2.d0 ) - enddo - enddo + enddo + enddo + + ! 1-body Jastrow +! if( jast_1b_type .gt. 0 ) then +! do i = 1, elec_num +! Eff_pot_mu_elec(i) -= 0.5d0 * jast_1b_lapl(i) +! Eff_pot_mu_elec(i) -= 0.5d0 * jast_1b_grad_sq(i) +! do j = 1, elec_num +! if(i==j) cycle +! Eff_pot_mu_elec(i) -= ( jast_elec_Mu_grad_x(i) * ( jast_1b_grad_x(i) - jast_1b_grad_x(j) ) & +! + jast_elec_Mu_grad_y(i) * ( jast_1b_grad_y(i) - jast_1b_grad_y(j) ) & +! + jast_elec_Mu_grad_z(i) * ( jast_1b_grad_z(i) - jast_1b_grad_z(j) ) ) +! enddo +! enddo +! endif END_PROVIDER BEGIN_PROVIDER [double precision, Eff_pot_mu ] implicit none include '../constants.F' - BEGIN_DOC - ! Eq.(32) - END_DOC integer :: i Eff_pot_mu = 0.d0 do i=1,elec_num - Eff_pot_mu += eff_pot_mu_elec(i) + Eff_pot_mu += Eff_pot_mu_elec(i) enddo Eff_pot_mu_min = min(Eff_pot_mu_min,Eff_pot_mu) Eff_pot_mu_max = max(Eff_pot_mu_max,Eff_pot_mu) @@ -80,9 +116,6 @@ END_PROVIDER BEGIN_PROVIDER [double precision, Eff_pot_mu_simple ] implicit none - BEGIN_DOC - ! Eq.(32) - END_DOC include '../constants.F' integer :: i Eff_pot_mu_simple = 0.d0 @@ -95,34 +128,58 @@ BEGIN_PROVIDER [double precision, Eff_pot_mu_simple ] END_PROVIDER -BEGIN_PROVIDER [double precision, eff_pot_deriv_mu_elec, (elec_num) ] - implicit none - BEGIN_DOC - ! Eq.(33) - END_DOC - integer :: i,j - double precision :: rij, mu - mu = mu_erf - eff_pot_deriv_mu_elec = 0.d0 - do i = 1, elec_num - do j = 1, elec_num - if(i==j)cycle - rij = elec_dist(i,j) - eff_pot_deriv_mu_elec(i) += 0.5d0 * ( derf(mu * rij) - 1.d0 ) * elec_dist_inv(j,i) & - * ( - elec_dist_vec_x(j,i) * psidet_grad_lapl(1,i) & - - elec_dist_vec_y(j,i) * psidet_grad_lapl(2,i) & - - elec_dist_vec_z(j,i) * psidet_grad_lapl(3,i) ) * psidet_inv + + +BEGIN_PROVIDER [double precision, Eff_pot_deriv_mu_elec, (elec_num) ] + + BEGIN_DOC + ! + ! non-Hermitian term: + ! - grad_i(tau) . grad_i(\Phi) / \Phi + ! + END_DOC + + implicit none + integer :: i, j + double precision :: rij, mu + +! mu = jast_mu_erf + mu = mu_erf + Eff_pot_deriv_mu_elec = 0.d0 + + ! 2body-Jastrow: (eq A4) + ! - [ grad_i(tau_mu) . grad_i(\Phi) + grad_j(tau_mu) . grad_j(\Phi) ] / \Phi = + ! ( erf(mu r_ij) - 1 ) / ( 2 r_ij \Phi) * [ + ! ( x_i - x_j ) * ( \partial_{x_i} - \partial_{x_j} ) + + ! ( y_i - y_j ) * ( \partial_{y_i} - \partial_{y_j} ) + + ! ( z_i - z_j ) * ( \partial_{z_i} - \partial_{z_j} ) ] + ! + do i = 1, elec_num + do j = 1, elec_num + if(i==j)cycle + rij = elec_dist(i,j) + Eff_pot_deriv_mu_elec(i) += 0.5d0 * ( derf(mu * rij) - 1.d0 ) * elec_dist_inv(j,i) & + * ( - elec_dist_vec_x(j,i) * psidet_grad_lapl(1,i) & + - elec_dist_vec_y(j,i) * psidet_grad_lapl(2,i) & + - elec_dist_vec_z(j,i) * psidet_grad_lapl(3,i) ) * psidet_inv + enddo enddo - enddo + + + ! 1-body Jastrow + if( jast_1b_type .gt. 0 ) then + do i = 1, elec_num + Eff_pot_deriv_mu_elec(i) -= ( jast_1b_grad_x(i) * psidet_grad_lapl(1,i) & + + jast_1b_grad_y(i) * psidet_grad_lapl(2,i) & + + jast_1b_grad_z(i) * psidet_grad_lapl(3,i) ) * psidet_inv + enddo + endif END_PROVIDER BEGIN_PROVIDER [double precision, three_body_mu ] implicit none - BEGIN_DOC - ! Eq.(30) - END_DOC integer :: i,j,k three_body_mu = 0.d0 do i = 1, elec_num @@ -147,18 +204,36 @@ BEGIN_PROVIDER [double precision, three_body_mu ] SOFT_TOUCH three_body_mu_min three_body_mu_max END_PROVIDER -BEGIN_PROVIDER [double precision, eff_pot_deriv_mu] +BEGIN_PROVIDER [double precision, Eff_pot_deriv_mu] implicit none - BEGIN_DOC - ! Eq.(33) - END_DOC integer :: i - eff_pot_deriv_mu = 0.d0 + Eff_pot_deriv_mu = 0.d0 do i = 1, elec_num - eff_pot_deriv_mu += eff_pot_deriv_mu_elec(i) + Eff_pot_deriv_mu += Eff_pot_deriv_mu_elec(i) enddo eff_pot_deriv_mu_min = min(eff_pot_deriv_mu_min,eff_pot_deriv_mu) eff_pot_deriv_mu_max = max(eff_pot_deriv_mu_max,eff_pot_deriv_mu) SOFT_TOUCH eff_pot_deriv_mu_min eff_pot_deriv_mu_max END_PROVIDER + +BEGIN_PROVIDER [ double precision, ci_dress_mu, (size_ci_dress_mu) ] + BEGIN_DOC + ! Dimensions : det_num + END_DOC + implicit none + integer :: i, j, k, l + double precision :: T, dij, f, E_noJ, dE + ! energy_mu = H_mu \Phi / \Phi + dE = (E_loc - energy_mu) * psi_value_inv * jast_value_inv + do k = 1, det_num + i = det_coef_matrix_rows( k) + j = det_coef_matrix_columns(k) + f = det_alpha_value(i) * det_beta_value(j) + ci_dress_mu(k) = dE * f + enddo + ci_dress_mu_min = min(ci_dress_mu_min, minval(ci_dress_mu)) + ci_dress_mu_max = max(ci_dress_mu_max, maxval(ci_dress_mu)) + SOFT_TOUCH ci_dress_mu_min ci_dress_mu_max +END_PROVIDER + diff --git a/src/det.irp.f b/src/det.irp.f index 71488b2..cfd3c24 100644 --- a/src/det.irp.f +++ b/src/det.irp.f @@ -2161,11 +2161,21 @@ BEGIN_PROVIDER [ double precision, psidet_lapl ] BEGIN_DOC ! Laplacian of the wave functionwithout Jastrow END_DOC - + integer :: i, j psidet_lapl = 0.d0 do j=1,elec_num - psidet_lapl = psidet_lapl + psidet_grad_lapl(4,j) + psidet_lapl = psidet_lapl + psidet_grad_lapl(4,j) enddo END_PROVIDER +BEGIN_PROVIDER [ double precision, E_kin_elec_psidet, (elec_num) ] + implicit none + BEGIN_DOC + ! Electronic Kinetic energy of the determinantal part only: -1/2 (Lapl.Psidet)/Psidet + END_DOC + integer :: i + do i=1,elec_num + E_kin_elec_psidet(i) = -0.5d0*psidet_grad_lapl(4,i) * psidet_inv + enddo +END_PROVIDER diff --git a/src/ezfio_interface.irp.f b/src/ezfio_interface.irp.f index 1b9dc37..ee71245 100644 --- a/src/ezfio_interface.irp.f +++ b/src/ezfio_interface.irp.f @@ -83,7 +83,10 @@ data_no_set = [\ ("spindeterminants_psi_coef_matrix_rows" , "integer" , "(det_num_input)"), ("spindeterminants_psi_coef_matrix_columns" , "integer" , "(det_num_input)"), ("spindeterminants_psi_coef_matrix_values" , "double precision" , "(det_num_input,N_states)"), - +("jastrow_jast_1b_type" , "integer" , "" ), +("jastrow_jast_1btanh_pen" , "real" , "(nucl_num)" ), +("jastrow_jast_1berf_pen" , "real" , "(nucl_num)" ), +("jastrow_jast_1bgauss_pen" , "real" , "(nucl_num)" ), ]