10
0
mirror of https://github.com/LCPQ/quantum_package synced 2024-12-25 13:53:49 +01:00

L3 weight

This commit is contained in:
Anthony Scemama 2018-05-25 15:03:12 +02:00
parent de1791f9d6
commit 50b12bcacb
4 changed files with 43 additions and 32 deletions

View File

@ -1,26 +1,4 @@
use bitmasks use bitmasks
BEGIN_PROVIDER [ double precision, selection_weight, (N_states) ]
implicit none
BEGIN_DOC
! Weight of the states in the selection : 1/(sum_i c_i^4)
END_DOC
integer :: i,k
double precision :: c
print *, 'Selection weights'
print *, '-----------------'
do i=1,N_states
selection_weight(i) = 0.d0
do k=1,N_det
c = psi_coef(k,i)*psi_coef(k,i)
selection_weight(i) = selection_weight(i) + c*abs(psi_coef(k,i))
enddo
selection_weight(i) = 1.d0/selection_weight(i)
print *, i, selection_weight(i)
enddo
print *, '-----------------'
END_PROVIDER
BEGIN_PROVIDER [ integer, fragment_count ] BEGIN_PROVIDER [ integer, fragment_count ]
implicit none implicit none
@ -654,7 +632,7 @@ subroutine fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_d
endif endif
e_pert = 0.5d0 * (tmp - delta_E) e_pert = 0.5d0 * (tmp - delta_E)
pt2(istate) = pt2(istate) + e_pert pt2(istate) = pt2(istate) + e_pert
sum_e_pert = sum_e_pert + e_pert * selection_weight(istate) sum_e_pert = sum_e_pert + e_pert * state_average_weight(istate)
end do end do
if(sum_e_pert <= buf%mini) then if(sum_e_pert <= buf%mini) then

View File

@ -40,6 +40,13 @@ doc: Force the wave function to be an eigenfunction of S^2
interface: ezfio,provider,ocaml interface: ezfio,provider,ocaml
default: True default: True
[use_l3_weight]
type: logical
doc: If true, set the state-averaged weight to 1/(Norm_L3(Psi))
interface: ezfio,provider,ocaml
default: False
[threshold_generators] [threshold_generators]
type: Threshold type: Threshold
doc: Thresholds on generators (fraction of the norm) doc: Thresholds on generators (fraction of the norm)

View File

@ -361,6 +361,28 @@ subroutine save_natural_mos
end end
BEGIN_PROVIDER [ double precision, l3_weight, (N_states) ]
implicit none
BEGIN_DOC
! Weight of the states in the selection : 1/(sum_i c_i^4)
END_DOC
integer :: i,k
double precision :: c
do i=1,N_states
l3_weight(i) = 1.d-31
do k=1,N_det
c = psi_coef(k,i)*psi_coef(k,i)
l3_weight(i) = l3_weight(i) + c*abs(psi_coef(k,i))
enddo
l3_weight(i) = min(1.d0/l3_weight(i), 100.d0)
enddo
print *, 'L3 weights'
print *, '----------'
print *, l3_weight(1:N_states)
END_PROVIDER
BEGIN_PROVIDER [ double precision, state_average_weight, (N_states) ] BEGIN_PROVIDER [ double precision, state_average_weight, (N_states) ]
implicit none implicit none
BEGIN_DOC BEGIN_DOC
@ -368,6 +390,9 @@ BEGIN_PROVIDER [ double precision, state_average_weight, (N_states) ]
END_DOC END_DOC
logical :: exists logical :: exists
if (use_l3_weight) then
state_average_weight(:) = l3_weight(:)
else
state_average_weight(:) = 1.d0 state_average_weight(:) = 1.d0
call ezfio_has_determinants_state_average_weight(exists) call ezfio_has_determinants_state_average_weight(exists)
if (exists) then if (exists) then
@ -375,6 +400,7 @@ BEGIN_PROVIDER [ double precision, state_average_weight, (N_states) ]
endif endif
state_average_weight(:) = state_average_weight(:)+1.d-31 state_average_weight(:) = state_average_weight(:)+1.d-31
state_average_weight(:) = state_average_weight(:)/(sum(state_average_weight(:))) state_average_weight(:) = state_average_weight(:)/(sum(state_average_weight(:)))
endif
END_PROVIDER END_PROVIDER

View File

@ -367,13 +367,13 @@ end
j = psi_bilinear_matrix_columns(k) j = psi_bilinear_matrix_columns(k)
f = 0.d0 f = 0.d0
do l=1,N_states do l=1,N_states
f += psi_bilinear_matrix_values(k,l)*psi_bilinear_matrix_values(k,l) f += psi_bilinear_matrix_values(k,l)*psi_bilinear_matrix_values(k,l) * state_average_weight(l)
enddo enddo
det_alpha_norm(i) += f det_alpha_norm(i) += f
det_beta_norm(j) += f det_beta_norm(j) += f
enddo enddo
det_alpha_norm = det_alpha_norm / dble(N_states) det_alpha_norm = det_alpha_norm
det_beta_norm = det_beta_norm / dble(N_states) det_beta_norm = det_beta_norm
END_PROVIDER END_PROVIDER