10
1
mirror of https://gitlab.com/scemama/qmcchem.git synced 2024-11-06 22:23:39 +01:00

General diag

This commit is contained in:
Anthony Scemama 2016-05-09 09:21:10 +02:00
parent ca21d44409
commit 09bf6140c8
3 changed files with 33 additions and 26 deletions

View File

@ -264,14 +264,15 @@ BEGIN_PROVIDER [ double precision, E_loc ]
END_PROVIDER END_PROVIDER
BEGIN_PROVIDER [ double precision, E_loc_zv, (3) ] BEGIN_PROVIDER [ double precision, E_loc_zv, ((pdmc_n_diag+1)*2) ]
implicit none implicit none
BEGIN_DOC BEGIN_DOC
! Zero-variance parameter on E_loc ! Zero-variance parameter on E_loc
END_DOC END_DOC
E_loc_zv(1) = E_loc + (E_trial-E_loc) * dmc_zv_weight_half ! E_loc_zv(1) = E_loc + (E_trial-E_loc) * dmc_zv_weight_half
E_loc_zv(2) = E_loc + (E_trial-E_loc) * dmc_zv_weight ! E_loc_zv(2) = E_loc + (E_trial-E_loc) * dmc_zv_weight
E_loc_zv(3) = dmc_zv_weight_half ! E_loc_zv(3) = dmc_zv_weight_half
E_loc_zv(:) = 0.d0
END_PROVIDER END_PROVIDER

View File

@ -56,7 +56,7 @@ BEGIN_PROVIDER [ double precision, pop_weight ]
if (qmc_method == t_SRMC) then if (qmc_method == t_SRMC) then
pop_weight = srmc_pop_weight_mult pop_weight = srmc_pop_weight_mult
else if (qmc_method == t_PDMC) then else if (qmc_method == t_PDMC) then
pop_weight = pdmc_pop_weight_mult(1) pop_weight = pdmc_pop_weight_mult(pdmc_n_diag)
endif endif
pop_weight_min = min(pop_weight,pop_weight_min) pop_weight_min = min(pop_weight,pop_weight_min)
pop_weight_max = max(pop_weight,pop_weight_max) pop_weight_max = max(pop_weight,pop_weight_max)

View File

@ -111,7 +111,7 @@ END_SHELL
endif endif
integer :: info integer :: info
double precision :: H(0:pdmc_n_diag/2,0:pdmc_n_diag/2), S(0:pdmc_n_diag/2,0:pdmc_n_diag/2), w(0:pdmc_n_diag/2), work(3*pdmc_n_diag+1) double precision :: H(0:pdmc_n_diag/2,0:pdmc_n_diag/2), S(0:pdmc_n_diag/2,0:pdmc_n_diag/2), w(0:pdmc_n_diag/2), work(3*pdmc_n_diag+1)
H = 0.d0 H = 0.d0
S = 0.d0 S = 0.d0
@ -150,7 +150,7 @@ END_SHELL
logical :: accepted logical :: accepted
call brownian_step(p,q,accepted,delta_x) call brownian_step(p,q,accepted,delta_x)
if ( psi_value * psi_value_save(i_walk) >= 0.d0 ) then ! if ( psi_value * psi_value_save(i_walk) >= 0.d0 ) then
delta = ((E_loc+E_loc_save(i_walk))*0.5d0 - E_ref) * p delta = ((E_loc+E_loc_save(i_walk))*0.5d0 - E_ref) * p
if ( delta > thr ) then if ( delta > thr ) then
pdmc_weight(i_walk) = dexp(-dtime_step*thr) pdmc_weight(i_walk) = dexp(-dtime_step*thr)
@ -185,6 +185,11 @@ END_SHELL
endif endif
TOUCH dmc_zv_weight dmc_zv_weight_half TOUCH dmc_zv_weight dmc_zv_weight_half
do i=1,pdmc_n_diag+1
E_loc_zv(i) = E_loc * pdmc_pop_weight_mult(i-1) * pdmc_weight(i_walk) * dmc_zv_weight + (E_trial-E_loc) * dmc_zv_weight
E_loc_zv(i+pdmc_n_diag+1) = pdmc_pop_weight_mult(i-1) * pdmc_weight(i_walk) * dmc_zv_weight
enddo
BEGIN_SHELL [ /usr/bin/python ] BEGIN_SHELL [ /usr/bin/python ]
from properties import * from properties import *
t = """ t = """
@ -221,9 +226,6 @@ END_SHELL
block_weight += pdmc_pop_weight_mult(pdmc_n_diag) * pdmc_weight(i_walk) block_weight += pdmc_pop_weight_mult(pdmc_n_diag) * pdmc_weight(i_walk)
H(0,0) += E_loc
S(0,0) += 1.d0
pdmc_pop_weight_mult(0) = 1.d0/pdmc_weight(i_walk) pdmc_pop_weight_mult(0) = 1.d0/pdmc_weight(i_walk)
do k=0,pdmc_n_diag/2 do k=0,pdmc_n_diag/2
do l=0,pdmc_n_diag/2 do l=0,pdmc_n_diag/2
@ -231,14 +233,13 @@ END_SHELL
S(k,l) += pdmc_pop_weight_mult(k+l) * pdmc_weight(i_walk) S(k,l) += pdmc_pop_weight_mult(k+l) * pdmc_weight(i_walk)
enddo enddo
enddo enddo
H = H + (E_trial - E_loc)
H = H+E_trial-E_loc ! else
! pdmc_weight(i_walk) = 1.d0
else ! pdmc_pop_weight(:,:) = 1.d0
pdmc_weight(i_walk) = 1.d0 ! pdmc_pop_weight_mult(:) = 1.d0
pdmc_pop_weight(:,:) = 1.d0 ! endif
pdmc_pop_weight_mult(:) = 1.d0
endif
do k=1,pdmc_n_diag do k=1,pdmc_n_diag
@ -303,17 +304,22 @@ for p in properties:
print t.replace("$X",p[1]) print t.replace("$X",p[1])
END_SHELL END_SHELL
H = 0.d0
H(0,0) = E_loc_zv_pdmc_block_walk(1)
H(1,0) = E_loc_zv_pdmc_block_walk(3)
H(0,1) = E_loc_zv_pdmc_block_walk(3)
H(1,1) = E_loc_zv_pdmc_block_walk(5)
S = 0.d0
S(0,0) = E_loc_zv_pdmc_block_walk(6)
S(1,0) = E_loc_zv_pdmc_block_walk(8)
S(0,1) = E_loc_zv_pdmc_block_walk(8)
S(1,1) = E_loc_zv_pdmc_block_walk(10)
S(2,2) = 1.d0
call dsygv(1, 'N', 'U', pdmc_n_diag/2+1, H, pdmc_n_diag/2+1, S, pdmc_n_diag/2+1, w, work, 3*(pdmc_n_diag+1), info) call dsygv(1, 'N', 'U', pdmc_n_diag/2+1, H, pdmc_n_diag/2+1, S, pdmc_n_diag/2+1, w, work, 3*(pdmc_n_diag+1), info)
E_loc_zv_diag_pdmc_block_walk = w(0) E_loc_zv_diag_pdmc_block_walk = w(0)
print *, info, w
! E_loc_zv_diag_pdmc_block_walk = 0.5d0 * (sqrt( &
! E_loc_zv_pdmc_block_walk(2)*E_loc_zv_pdmc_block_walk(2) &
! - 2.d0*E_trial*E_loc_zv_pdmc_block_walk(2) &
! + 5.d0*E_trial*E_trial &
! - 8.d0*E_loc_zv_pdmc_block_walk(1)*E_trial &
! + 4.d0*E_loc_zv_pdmc_block_walk(1)*E_loc_zv_pdmc_block_walk(1) &
! ) - E_loc_zv_pdmc_block_walk(2) - E_trial)
deallocate ( elec_coord_tmp, psi_grad_psi_inv_save, psi_grad_psi_inv_save_tmp ) deallocate ( elec_coord_tmp, psi_grad_psi_inv_save, psi_grad_psi_inv_save_tmp )
@ -359,7 +365,7 @@ BEGIN_PROVIDER [ integer, pdmc_n_diag ]
BEGIN_DOC BEGIN_DOC
! Size of the matrix to diagonalize ! Size of the matrix to diagonalize
END_DOC END_DOC
pdmc_n_diag = 2 pdmc_n_diag = 8
END_PROVIDER END_PROVIDER