mirror of
https://gitlab.com/scemama/qp_plugins_scemama.git
synced 2025-01-03 01:55:52 +01:00
Compare commits
3 Commits
c34324368e
...
aa7ac08615
Author | SHA1 | Date | |
---|---|---|---|
aa7ac08615 | |||
ac95c76665 | |||
eed703afa9 |
59
devel/mpn/.gitignore
vendored
Normal file
59
devel/mpn/.gitignore
vendored
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
IRPF90_temp/
|
||||||
|
IRPF90_man/
|
||||||
|
build.ninja
|
||||||
|
irpf90.make
|
||||||
|
ezfio_interface.irp.f
|
||||||
|
irpf90_entities
|
||||||
|
tags
|
||||||
|
Makefile
|
||||||
|
ao_basis
|
||||||
|
ao_one_e_ints
|
||||||
|
ao_two_e_erf_ints
|
||||||
|
ao_two_e_ints
|
||||||
|
aux_quantities
|
||||||
|
becke_numerical_grid
|
||||||
|
bitmask
|
||||||
|
cis
|
||||||
|
cisd
|
||||||
|
cipsi
|
||||||
|
davidson
|
||||||
|
davidson_dressed
|
||||||
|
davidson_undressed
|
||||||
|
density_for_dft
|
||||||
|
determinants
|
||||||
|
dft_keywords
|
||||||
|
dft_utils_in_r
|
||||||
|
dft_utils_one_e
|
||||||
|
dft_utils_two_body
|
||||||
|
dressing
|
||||||
|
dummy
|
||||||
|
electrons
|
||||||
|
ezfio_files
|
||||||
|
fci
|
||||||
|
generators_cas
|
||||||
|
generators_full
|
||||||
|
hartree_fock
|
||||||
|
iterations
|
||||||
|
kohn_sham
|
||||||
|
kohn_sham_rs
|
||||||
|
mo_basis
|
||||||
|
mo_guess
|
||||||
|
mo_one_e_ints
|
||||||
|
mo_two_e_erf_ints
|
||||||
|
mo_two_e_ints
|
||||||
|
mpi
|
||||||
|
mrpt_utils
|
||||||
|
nuclei
|
||||||
|
perturbation
|
||||||
|
pseudo
|
||||||
|
psiref_cas
|
||||||
|
psiref_utils
|
||||||
|
scf_utils
|
||||||
|
selectors_cassd
|
||||||
|
selectors_full
|
||||||
|
selectors_utils
|
||||||
|
single_ref_method
|
||||||
|
slave
|
||||||
|
tools
|
||||||
|
utils
|
||||||
|
zmq
|
12
devel/mpn/EZFIO.cfg
Normal file
12
devel/mpn/EZFIO.cfg
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
[energy]
|
||||||
|
type: double precision
|
||||||
|
doc: Calculated Selected |FCI| energy
|
||||||
|
interface: ezfio
|
||||||
|
size: (determinants.n_states)
|
||||||
|
|
||||||
|
[mp_order]
|
||||||
|
type: integer
|
||||||
|
doc: Max order of MPn
|
||||||
|
interface: ezfio, provider, ocaml
|
||||||
|
default: 4
|
||||||
|
|
3
devel/mpn/NEED
Normal file
3
devel/mpn/NEED
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
davidson_undressed
|
||||||
|
hartree_fock
|
||||||
|
determinants
|
4
devel/mpn/README.rst
Normal file
4
devel/mpn/README.rst
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
===
|
||||||
|
mpn
|
||||||
|
===
|
||||||
|
|
23
devel/mpn/energies.irp.f
Normal file
23
devel/mpn/energies.irp.f
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
BEGIN_PROVIDER [ double precision, energy_det_i, (N_det) ]
|
||||||
|
implicit none
|
||||||
|
BEGIN_DOC
|
||||||
|
! Fock Energy of determinant |I> (sum of epsilon_i)
|
||||||
|
END_DOC
|
||||||
|
integer :: i, k, n
|
||||||
|
integer :: list(elec_alpha_num)
|
||||||
|
|
||||||
|
do k=1,N_det
|
||||||
|
call bitstring_to_list(psi_det(1,1,k), list, n, N_int)
|
||||||
|
energy_det_i(k) = nuclear_repulsion
|
||||||
|
do i=1,n
|
||||||
|
energy_det_i(k) += fock_matrix_diag_mo(list(i))
|
||||||
|
enddo
|
||||||
|
call bitstring_to_list(psi_det(1,2,k), list, n, N_int)
|
||||||
|
do i=1,n
|
||||||
|
energy_det_i(k) += fock_matrix_diag_mo(list(i))
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
END_PROVIDER
|
||||||
|
|
||||||
|
|
||||||
|
|
100
devel/mpn/mpn.irp.f
Normal file
100
devel/mpn/mpn.irp.f
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
program mpn
|
||||||
|
implicit none
|
||||||
|
BEGIN_DOC
|
||||||
|
! TODO : Put the documentation of the program here
|
||||||
|
END_DOC
|
||||||
|
integer :: i, k, l
|
||||||
|
double precision, allocatable :: c_pert(:,:)
|
||||||
|
double precision, allocatable :: e_pert(:)
|
||||||
|
double precision, allocatable :: hc(:), s2(:)
|
||||||
|
|
||||||
|
n_states_diag = 1
|
||||||
|
TOUCH n_states_diag
|
||||||
|
call generate_fci_space
|
||||||
|
allocate(c_pert(N_det,0:mp_order))
|
||||||
|
allocate(s2(N_det))
|
||||||
|
allocate(e_pert(mp_order+1))
|
||||||
|
e_pert = 0.d0
|
||||||
|
c_pert(:,:) = 0.d0
|
||||||
|
c_pert(1,0) = 1.d0
|
||||||
|
|
||||||
|
e_pert(1) = nuclear_repulsion
|
||||||
|
do k=1,mp_order
|
||||||
|
! H_ij C^(k-1)
|
||||||
|
call h_s2_u_0_nstates_zmq(c_pert(1,k),s2,c_pert(1,k-1),1,N_det)
|
||||||
|
e_pert(k) += c_pert(1,k)
|
||||||
|
print *, k, e_pert(k), sum(e_pert)
|
||||||
|
|
||||||
|
c_pert(1,k) = 0.d0
|
||||||
|
c_pert(:,k) = -c_pert(:,k)
|
||||||
|
do l=1,k
|
||||||
|
do i=2,N_det
|
||||||
|
c_pert(i,k) = c_pert(i,k) + e_pert(l) * c_pert(i,k-l)
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
do i=2,N_det
|
||||||
|
c_pert(i,k) = c_pert(i,k) + energy_det_i(i) * c_pert(i,k-1)
|
||||||
|
enddo
|
||||||
|
do i=2,N_det
|
||||||
|
c_pert(i,k) = c_pert(i,k) / (energy_det_i(i) - energy_det_i(1))
|
||||||
|
enddo
|
||||||
|
|
||||||
|
enddo
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
subroutine generate_fci_space
|
||||||
|
use bitmasks
|
||||||
|
implicit none
|
||||||
|
integer :: i, sze
|
||||||
|
integer(bit_kind) :: o(N_int,2)
|
||||||
|
|
||||||
|
if (mo_num > 64) then
|
||||||
|
stop 'No more than 64 MOs'
|
||||||
|
endif
|
||||||
|
o(:,1) = full_ijkl_bitmask(:)
|
||||||
|
o(:,2) = 0_bit_kind
|
||||||
|
|
||||||
|
call configuration_to_dets_size(o,n_det_alpha_unique,elec_alpha_num,N_int)
|
||||||
|
TOUCH n_det_alpha_unique
|
||||||
|
|
||||||
|
integer :: k,n,m, t, t1, t2
|
||||||
|
integer(bit_kind) :: u
|
||||||
|
k=0
|
||||||
|
n = elec_alpha_num
|
||||||
|
m = mo_num - n
|
||||||
|
u = shiftl(1_bit_kind,n) -1
|
||||||
|
do while (u < shiftl(1_bit_kind,n+m))
|
||||||
|
k = k+1
|
||||||
|
psi_det_alpha_unique(1,k) = u
|
||||||
|
t = ior(u,u-1)
|
||||||
|
t1 = t+1
|
||||||
|
t2 = shiftr((iand(not(t),t1)-1), trailz(u)+1)
|
||||||
|
u = ior(t1,t2)
|
||||||
|
enddo
|
||||||
|
|
||||||
|
|
||||||
|
call configuration_to_dets_size(o,n_det_beta_unique,elec_beta_num,N_int)
|
||||||
|
TOUCH n_det_beta_unique
|
||||||
|
|
||||||
|
k=0
|
||||||
|
n = elec_beta_num
|
||||||
|
m = mo_num - n
|
||||||
|
u = shiftl(1_bit_kind,n) -1
|
||||||
|
do while (u < shiftl(1_bit_kind,n+m))
|
||||||
|
k = k+1
|
||||||
|
psi_det_beta_unique(1,k) = u
|
||||||
|
t = ior(u,u-1)
|
||||||
|
t1 = t+1
|
||||||
|
t2 = shiftr((iand(not(t),t1)-1), trailz(u)+1)
|
||||||
|
u = ior(t1,t2)
|
||||||
|
enddo
|
||||||
|
|
||||||
|
call generate_all_alpha_beta_det_products
|
||||||
|
|
||||||
|
print *, N_det
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
|
@ -12,36 +12,53 @@ subroutine run
|
|||||||
implicit none
|
implicit none
|
||||||
double precision, allocatable :: U(:,:), Vt(:,:), D(:), A(:,:)
|
double precision, allocatable :: U(:,:), Vt(:,:), D(:), A(:,:)
|
||||||
integer :: i, j, k, p, q
|
integer :: i, j, k, p, q
|
||||||
|
double precision :: entropy
|
||||||
|
|
||||||
allocate( A (n_det_alpha_unique, n_det_beta_unique), &
|
allocate( A (n_det_alpha_unique, n_det_beta_unique), &
|
||||||
U (n_det_alpha_unique, n_det_alpha_unique), &
|
U (n_det_alpha_unique, n_det_alpha_unique), &
|
||||||
Vt(n_det_beta_unique, n_det_beta_unique), &
|
Vt(n_det_beta_unique, n_det_beta_unique), &
|
||||||
D(max(n_det_beta_unique,n_det_alpha_unique)) )
|
D(max(n_det_beta_unique,n_det_alpha_unique)) )
|
||||||
|
|
||||||
A = 0.D0
|
do j=1,n_det_beta_unique
|
||||||
|
do i=1,n_det_alpha_unique
|
||||||
|
A(i,j) = 0.D0
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
|
||||||
do k=1,N_det
|
do k=1,N_det
|
||||||
i = psi_bilinear_matrix_rows(k)
|
i = psi_bilinear_matrix_rows(k)
|
||||||
j = psi_bilinear_matrix_columns(k)
|
j = psi_bilinear_matrix_columns(k)
|
||||||
A(i,j) = psi_bilinear_matrix_values(k,1)
|
A(i,j) = psi_bilinear_matrix_values(k,1)
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
call randomized_svd(A, size(A,1), &
|
if (N_det == 1) then
|
||||||
|
D(1) = 1.d0
|
||||||
|
U(1,1) = 1.d0
|
||||||
|
Vt(1,1) = 1.d0
|
||||||
|
else
|
||||||
|
call randomized_svd(A, size(A,1), &
|
||||||
U, size(U,1), D, Vt, size(Vt,1), n_det_alpha_unique, n_det_beta_unique, &
|
U, size(U,1), D, Vt, size(Vt,1), n_det_alpha_unique, n_det_beta_unique, &
|
||||||
6,1000)
|
6,min(n_det_beta_unique,1000))
|
||||||
|
endif
|
||||||
|
|
||||||
|
entropy = 0.d0
|
||||||
do i=1,n_det_beta_unique
|
do i=1,n_det_beta_unique
|
||||||
print *, i, real(D(i)), real(D(i)**2), real(sum(D(1:i)**2))
|
print *, i, real(D(i)), real(D(i)**2), real(sum(D(1:i)**2))
|
||||||
|
entropy -= D(i) * dlog(D(i))
|
||||||
if (D(i) < 1.d-15) then
|
if (D(i) < 1.d-15) then
|
||||||
k = i
|
k = i
|
||||||
exit
|
exit
|
||||||
endif
|
endif
|
||||||
enddo
|
enddo
|
||||||
print *, 'threshold: ', 2.858 * D(k/2)
|
print *, 'threshold: ', 2.858 * D(k/2)
|
||||||
do i=1,n_det_alpha_unique
|
print *, 'Entropy : ', entropy
|
||||||
print '(I6,4(X,F12.8))', i, U(i,1:4)
|
|
||||||
enddo
|
! do i=1,n_det_alpha_unique
|
||||||
print *, ''
|
! print '(I6,4(X,F12.8))', i, U(i,1:4)
|
||||||
do i=1,n_det_beta_unique
|
! enddo
|
||||||
print '(I6,4(X,F12.8))', i, Vt(1:4,i)
|
! print *, ''
|
||||||
enddo
|
! do i=1,n_det_beta_unique
|
||||||
|
! print '(I6,4(X,F12.8))', i, Vt(1:4,i)
|
||||||
|
! enddo
|
||||||
|
|
||||||
end
|
end
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
[t1_amplitudes]
|
|
||||||
type: double precision
|
|
||||||
doc: Amplitudes for the single-excitation operator
|
|
||||||
interface: ezfio,provider
|
|
||||||
size: (mo_basis.mo_num,mo_basis.mo_num)
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user