mirror of
https://github.com/QuantumPackage/qp2.git
synced 2024-11-20 12:22:21 +01:00
Global Replacement of 'occupation pattern' with 'configuration'
This commit is contained in:
parent
05cdfa4f44
commit
3713ca46ad
49
TODO.org
49
TODO.org
@ -1,36 +1,29 @@
|
||||
det : dans la fonction d'onde vec
|
||||
csf : dans la fonctions d'onde vec
|
||||
conf_det : Nconf x Ndet'(conf)
|
||||
conf_csf : Nconf x Ncsf'(conf)
|
||||
* popcnt pour avoir les determinants par NSOMO
|
||||
* Trier par Nsomo
|
||||
* Tableau (i) -> indice du 1er CFG qui a i SOMO
|
||||
* Boucler sur toutes les CFG mono-excitees par rapport a toutes les autres
|
||||
|
||||
csf'(conf) : dans une conf (N_somo(conf) + N_domo(conf))
|
||||
det'(conf) : dans une conf (N_somo(conf) + N_domo(conf))
|
||||
|
||||
det''(conf) : probleme modele avec N_somo(conf)
|
||||
csf''(conf) : probleme modele avec N_somo(conf)
|
||||
|
||||
* [0/2]
|
||||
- [ ] Precalculer dans la base des configurations
|
||||
W_pq = \sum_{K} <Psi | E_pq | K>
|
||||
K> configuration \in SOMO-SOMO SOMO-DOMO DOMO-VMO SOMO-VMO
|
||||
W : matrice mono x mono
|
||||
- [ ] Fonction conf ->
|
||||
- [ ] Compute <i|H|j> in conf basis
|
||||
- [ ] Function hij_conf(i,j) -> matrix Ndet_ixM
|
||||
* p,q,cfg -> 0|1|2|3 (Type d'excitation)
|
||||
|
||||
|
||||
222200000000
|
||||
000010100101
|
||||
p->q
|
||||
222200200000
|
||||
000000000101
|
||||
|
||||
(1,Ndet) (Ndet,Ndet) (Ndet,1) -> E
|
||||
SOMO->SOMO
|
||||
|
||||
for i=1,Nconf
|
||||
for j=1,Nconf
|
||||
(i,Ndet') [(Ndet',Ndet'') (Ndet'',Ndet'') (Ndet'',Ndet')] (Ndet',j) -> E
|
||||
(i,Ncsf') (Ncsf',Ncsf'') [(Ncsf'',Ndet'') (Ndet'',Ndet'') (Ndet'',Ncsf'')] (Ncsf'',Ncsf') (Ncsf',j) -> E
|
||||
DOMO -> SOMO
|
||||
|
||||
<psi | [\sum_K E_pq | K>< K | E_rs] | Psi>
|
||||
|
||||
C.D^t
|
||||
do p in DO
|
||||
do q in not(DO or SO)
|
||||
p->q + 2 DOMO->VMO
|
||||
|
||||
K : toutes les mono
|
||||
|
||||
<ij|kl> = \sum_m <ij|mj><ml|kl>
|
||||
do p in DO
|
||||
do q in not(DO or SO)
|
||||
p->q + 2 DOMO->VMO
|
||||
DOMO -> VMO
|
||||
test si bit=1 dans DO
|
||||
test si bit=1 dans VO
|
||||
|
@ -1,107 +1,116 @@
|
||||
#+TITLE: CFG CIPSI
|
||||
#+AUTHOR: Vijay Gopal Chilkuri (vijay.gopal.c@gmail.com)
|
||||
#+DATE: <2020-12-08 Tue 08:27>
|
||||
#+DATE: 2020-12-08 Tue 08:27
|
||||
#+startup: latexpreview
|
||||
|
||||
#+LATEX_HEADER: \usepackage{braket}
|
||||
|
||||
* Biblio
|
||||
* Theoretical background
|
||||
|
||||
Here we describe the main theoretical background and definitions of the
|
||||
Configuration (CFG) based CIPSI algorithm. The outline of the document is as follows.
|
||||
First, we give some definitions of the CFG many-particle basis follwed by the
|
||||
definitions of the overlap, one-particle, and two-particle matrix-elements. Finally,
|
||||
an algorithm is presented for the sigma-vector (\[ \sigma \]-vector defined later) calculation using
|
||||
an algorithm is presented for the sigma-vector (\( \sigma \)-vector defined later) calculation using
|
||||
the CFG basis.
|
||||
|
||||
|
||||
* Definitino of CI basis
|
||||
** Definitinon of CI basis
|
||||
|
||||
In CFG based CIPSI, the wavefunction is represented in CFG basis as shown in Eq:\[~\ref{Eq:definebasis1}\].
|
||||
In CFG based CIPSI, the wavefunction is represented in CFG basis
|
||||
as shown in Eq: [[Eq:definebasis1]].
|
||||
|
||||
#+LATEX: \newcommand{\Ncfg}{N_{\text{CFG}}}
|
||||
#+LATEX: \newcommand{\Ncsf}{N_{\text{CSF}}}
|
||||
#+LATEX: \newcommand{\Nsomo}{N_{\text{SOMO}}}
|
||||
#+NAME: Eq:definebasis1
|
||||
\begin{equation}
|
||||
\label{Eq:definebasis1}
|
||||
\ket{\psi} &= \sum_{ij} c_{ij} ^s\ket{\phi^j_i}
|
||||
\ket{\Psi} = \sum_{i=1}^{\Ncfg} \sum_{j=1}^{\Ncsf(i)} c_{ij} {^S\ket{\Phi^j_i}}
|
||||
\end{equation}
|
||||
|
||||
|
||||
where the \[\ket{\Phi^j_i}\] represent Configuration State Functions (CSFs)
|
||||
where the \(\ket{\Phi^j_i}\) represent Configuration State Functions (CSFs)
|
||||
which are expanded in terms of Bonded functions (BFs) as shown in
|
||||
Eq:\[~\ref{Eq:definebasis2}\].
|
||||
|
||||
[[Eq:definebasis2]].
|
||||
#+NAME: Eq:definebasis2
|
||||
\begin{equation}
|
||||
\label{Eq:definebasis2}
|
||||
\ket{\Phi^j_i} &= \sum^j_{i,k} O^j_{i,k} \ket{^S\phi_k(i,j)}
|
||||
\ket{\Phi^j_i} = \sum_k O^{\Nsomo(i)}_{kj} \ket{^S\phi_k(i,j)}
|
||||
\end{equation}
|
||||
where the functions \(\ket{^S\phi_k(i,j)}\) represent the BFs for the CFG
|
||||
\(\ket{^S\Phi_i}\).
|
||||
The coefficients \(O^b_{a,k}\) depend only on the number of SOMOs
|
||||
in \(\Phi_i\).
|
||||
|
||||
Each CFG contains a list of CSFs related to it which describes the
|
||||
spin part of the wavefunction (see Eq: [[Eq:definebasis3]]) which is
|
||||
encoded in the BFs as shown below in Eq: [[Eq:definebasis5]].
|
||||
|
||||
|
||||
Where the functions \[\ket{^S\phi_k(i,j)}\] represent the BFs for the CFG
|
||||
\[i\]. Each CFG contains a list of CSFs related to it which describes the
|
||||
spin part of the wavefunction (see Eq:~\ref{Eq:definebasis3}) which is
|
||||
encoded in the BFs as shown below in Eq:~\ref{Eq:definebasis5}.
|
||||
|
||||
|
||||
\begin{equation}\begin{equation}
|
||||
\label{Eq:definebasis3}
|
||||
\ket{^S\Phi_i} = \left\{ \ket{^S\Phi^1_i}, \ket{^S\Phi^2_i}, \dots, \ket{^s\phi^{n_{csf}}_i} \right}
|
||||
#+NAME: Eq:definebasis3
|
||||
\begin{equation}
|
||||
\ket{^S\Phi_i} = \left\{ \ket{^S\Phi^1_i}, \ket{^S\Phi^2_i}, \dots, \ket{^s\Phi^{\Ncsf}_i} \right\}
|
||||
\end{equation}
|
||||
|
||||
|
||||
|
||||
\begin{equation}\begin{equation}
|
||||
\label{eq:definebasis4}
|
||||
\ket{^s\phi_i} = \left\{ c^1_i, c^1_i, \dots, c^{N_{CSF}}_i \right\}
|
||||
\end{equation}
|
||||
|
||||
|
||||
Each of the CSFs belonging to the CFG \[\ket{^S\Phi_i}\] have coefficients
|
||||
associated to them as shown in Eq:~\ref{Eq:definebasis4}. Crucially, the bonded functions
|
||||
defined in Eq:~\ref{Eq:definebasis5} are not northogonal to each other.
|
||||
|
||||
|
||||
#+NAME: Eq:definebasis4
|
||||
\begin{equation}
|
||||
\label{Eq:definebasis4}
|
||||
\ket{^S\phi_k(i,j)} = (i\bar{i})\dots (j,k) l m
|
||||
\mathbf{c}_i = \left\{ c^1_i, c^2_i, \dots, c^{\Ncsf}_i \right\}
|
||||
\end{equation}
|
||||
|
||||
|
||||
Each of the CSFs belonging to the CFG \(\ket{^S\Phi_i}\) have coefficients
|
||||
associated to them as shown in Eq: [[Eq:definebasis4]]. Crucially, the bonded functions
|
||||
defined in Eq: [[Eq:definebasis5]] are not northogonal to each other.
|
||||
|
||||
|
||||
#+NAME: Eq:definebasis5
|
||||
\begin{equation}
|
||||
\ket{^S\phi_k(i,j)} = (a\bar{a})\dots (b\ c) (d (e
|
||||
\end{equation}
|
||||
$i$ is the index of the CFG and $j$ determines the coupling.
|
||||
|
||||
|
||||
The bonded functions are made up of products of slater determinants. There are
|
||||
three types of determinants, first, the closed shell pairs \[(i\bar{i})\]. Second,
|
||||
the open-shell singlet pairs \[(i,j)\] which are expanded as \[(i,j) = \frac{\ket{i\bar{j}}-\ket{\bar{i}j}}{\sqrt{2}}\]. Third, the
|
||||
three types of determinants, first, the closed shell pairs \((a\bar{a})\). Second,
|
||||
the open-shell singlet pairs \((b\ c)\) which are expanded as
|
||||
\((b\ c) = \frac{\ket{b\bar{c}}-\ket{\bar{b}c}}{\sqrt{2}}\). Third, the
|
||||
open-shell SOMOs which are coupled parallel and account for the total spin of the
|
||||
wavefunction \[(l (m \dots\]. They are shown as open brackets.
|
||||
wavefunction \((l (m \dots\). They are shown as open brackets.
|
||||
|
||||
* Overlap of the wavefunction
|
||||
** Overlap of the wavefunction
|
||||
|
||||
Once the wavefunction has been expanded in terms of the CSFs, the most fundamental
|
||||
operation is to calculate the overlap between two states. The overlap in the
|
||||
basis of CSFs is defined as shown in Eq:~\ref{Eq:defineovlp1}.
|
||||
basis of CSFs is defined as shown in Eq: [[Eq:defineovlp1]].
|
||||
|
||||
|
||||
#+NAME: Eq:defineovlp1
|
||||
\begin{equation}
|
||||
\label{Eq:defineovlp1}
|
||||
\braket{^S\Phi_i|^S\Phi_j} = \sum_{kl} C_i C_j \braket{^S\Psi^k_i|^S\Psi^l_j}
|
||||
\end{equation}
|
||||
|
||||
|
||||
Where the sum is over the CSFs \[k\] and \[l\] corresponding to the \[i\]
|
||||
and \[j\] CFGs respectively. The overlap between the CSFs can be expanded in terms
|
||||
of the BFs using the definition given in Eq:~\ref{Eq:definebasis2} and Eq:~\ref{Eq:definebasis3}
|
||||
as given in Eq:~\ref{Eq:defineovlp2}.
|
||||
Where the sum is over the CSFs \(k\) and \(l\) corresponding to the \(i\)
|
||||
and \(j\) CFGs respectively. The overlap between the CSFs can be expanded in terms
|
||||
of the BFs using the definition given in Eq: [[Eq:definebasis2]] and
|
||||
Eq: [[Eq:definebasis3]] as given in Eq: [[Eq:defineovlp2]].
|
||||
|
||||
|
||||
#+NAME: Eq:defineovlp2
|
||||
\begin{equation}
|
||||
\label{Eq:defineovlp2}
|
||||
\braket{^S\Phi^k_i|^S\Phi^l_j} = \sum_m \sum_n \left( O^k_{i,m}\right)^{\dagger} \braket{^S\phi_m(i,k)|^S\phi_n(j,l)} O^l_{j,n}
|
||||
\end{equation}
|
||||
|
||||
|
||||
Therefore, the overlap between two CSFs can be expanded in terms of the overlap
|
||||
between the constituent BFs. The overlap matrix \[S_{mn}\] is of dimension \[\left( N^k_{N_{BF}} , N^l_{N_{BF}} \rigth)\].
|
||||
The equation shown above (Eq:~\ref{Eq:defineovlp2}) can be written in marix-form as
|
||||
shown below in Eq:~\ref{Eq:defineovlp3}.
|
||||
between the constituent BFs. The overlap matrix \(S_{mn}\) is of dimension \(\left( N^k_{N_{BF}} , N^l_{N_{BF}} \right)\).
|
||||
The equation shown above (Eq: [[Eq:defineovlp2]]) can be written in marix-form as
|
||||
shown below in Eq: [[Eq:defineovlp3]].
|
||||
|
||||
#+NAME: Eq:defineovlp3
|
||||
\begin{equation}
|
||||
\label{Eq:defineovlp3}
|
||||
\braket{^S\Phi_i|^S\Phi_j} = \left( C_{i,1} \right)^{\dagger} \mathbf{O}_i\cdot\mathbf{S}_{ij}\cdot\mathbf{O}_j C_{j,1}
|
||||
\end{equation}
|
||||
|
||||
@ -110,16 +119,13 @@
|
||||
labels. It only depends on the number of Singly Occupied Molecular Orbitals
|
||||
(SOMOs) therefore it can be pretabulated. Actually, it is possible to
|
||||
redefine the CSFs in terms of a linear combination of BFs such that
|
||||
\[S_{ij}\] becomes the identity matrix. In this case, one needs to store the
|
||||
orthogonalization matrix \[\mathbf{\tilde{O}}_i\] which is given by
|
||||
\[\mathbf{O}_i\cdot S^{1/2}_i\] for a given CFG \[i\]. Note that the a CFG
|
||||
\[i\] is by definition of an orthonormal set of MOs automatically orthogonal
|
||||
to a CFG \[j\] with a different occupation.
|
||||
\(S_{ij}\) becomes the identity matrix. In this case, one needs to store the
|
||||
orthogonalization matrix \(\mathbf{\tilde{O}}_i\) which is given by
|
||||
\(\mathbf{O}_i\cdot S^{1/2}_i\) for a given CFG \(i\). Note that the a CFG
|
||||
\(i\) is by definition of an orthonormal set of MOs automatically orthogonal
|
||||
to a CFG \(j\) with a different occupation.
|
||||
|
||||
* Definition of matrix-elements
|
||||
** Definition of matrix-elements
|
||||
|
||||
The matrix-element (ME) evaluation follows a similar logic.
|
||||
|
||||
# Local variables:
|
||||
# after-save-hook: org-preview-latex-fragment
|
||||
# end:
|
||||
|
Binary file not shown.
@ -102,7 +102,7 @@ subroutine run_cipsi
|
||||
|
||||
call write_double(6,correlation_energy_ratio, 'Correlation ratio')
|
||||
call print_summary(psi_energy_with_nucl_rep, &
|
||||
pt2_data, pt2_data_err, N_det,N_occ_pattern,N_states,psi_s2)
|
||||
pt2_data, pt2_data_err, N_det,N_configuration,N_states,psi_s2)
|
||||
|
||||
call save_energy(psi_energy_with_nucl_rep, pt2_data % pt2)
|
||||
|
||||
@ -144,13 +144,13 @@ subroutine run_cipsi
|
||||
SOFT_TOUCH threshold_generators
|
||||
endif
|
||||
print *, 'N_det = ', N_det
|
||||
print *, 'N_sop = ', N_occ_pattern
|
||||
print *, 'N_cfg = ', N_configuration
|
||||
print *, 'N_states = ', N_states
|
||||
print*, 'correlation_ratio = ', correlation_energy_ratio
|
||||
|
||||
call save_energy(psi_energy_with_nucl_rep, pt2_data % pt2)
|
||||
call print_summary(psi_energy_with_nucl_rep(1:N_states), &
|
||||
pt2_data, pt2_data_err, N_det,N_occ_pattern,N_states,psi_s2)
|
||||
pt2_data, pt2_data_err, N_det,N_configuration,N_states,psi_s2)
|
||||
call save_iterations(psi_energy_with_nucl_rep(1:N_states),pt2_data % rpt2,N_det)
|
||||
call print_extrapolated_energy()
|
||||
endif
|
||||
|
@ -22,7 +22,7 @@ BEGIN_PROVIDER [ double precision, pt2_E0_denominator, (N_states) ]
|
||||
enddo
|
||||
else if (h0_type == "Barycentric") then
|
||||
pt2_E0_denominator(1:N_states) = barycentric_electronic_energy(1:N_states)
|
||||
else if (h0_type == "SOP") then
|
||||
else if (h0_type == "CFG") then
|
||||
pt2_E0_denominator(1:N_states) = psi_energy(1:N_states)
|
||||
else
|
||||
print *, h0_type, ' not implemented'
|
||||
|
@ -71,9 +71,9 @@ subroutine fill_buffer_double_rdm(i_generator, sp, h1, h2, bannedOrb, banned, fo
|
||||
call apply_holes(psi_det_generators(1,1,i_generator), s1, h1, s2, h2, mask, ok, N_int)
|
||||
E_shift = 0.d0
|
||||
|
||||
if (h0_type == 'SOP') then
|
||||
j = det_to_occ_pattern(i_generator)
|
||||
E_shift = psi_det_Hii(i_generator) - psi_occ_pattern_Hii(j)
|
||||
if (h0_type == 'CFG') then
|
||||
j = det_to_configuration(i_generator)
|
||||
E_shift = psi_det_Hii(i_generator) - psi_configuration_Hii(j)
|
||||
endif
|
||||
|
||||
do p1=1,mo_num
|
||||
|
@ -134,8 +134,8 @@ subroutine ZMQ_pt2(E, pt2_data, pt2_data_err, relative_error, N_in)
|
||||
PROVIDE psi_bilinear_matrix_transp_order psi_selectors_coef_transp psi_det_sorted
|
||||
PROVIDE psi_det_hii selection_weight pseudo_sym
|
||||
|
||||
if (h0_type == 'SOP') then
|
||||
PROVIDE psi_occ_pattern_hii det_to_occ_pattern
|
||||
if (h0_type == 'CFG') then
|
||||
PROVIDE psi_configuration_hii det_to_configuration
|
||||
endif
|
||||
|
||||
if (N_det <= max(4,N_states) .or. pt2_N_teeth < 2) then
|
||||
|
@ -700,9 +700,9 @@ subroutine fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_d
|
||||
call apply_holes(psi_det_generators(1,1,i_generator), s1, h1, s2, h2, mask, ok, N_int)
|
||||
E_shift = 0.d0
|
||||
|
||||
if (h0_type == 'SOP') then
|
||||
j = det_to_occ_pattern(i_generator)
|
||||
E_shift = psi_det_Hii(i_generator) - psi_occ_pattern_Hii(j)
|
||||
if (h0_type == 'CFG') then
|
||||
j = det_to_configuration(i_generator)
|
||||
E_shift = psi_det_Hii(i_generator) - psi_configuration_Hii(j)
|
||||
endif
|
||||
|
||||
do p1=1,mo_num
|
||||
@ -766,8 +766,8 @@ subroutine fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_d
|
||||
w = 0d0
|
||||
|
||||
! integer(bit_kind) :: occ(N_int,2), n
|
||||
! call occ_pattern_of_det(det,occ,N_int)
|
||||
! call occ_pattern_to_dets_size(occ,n,elec_alpha_num,N_int)
|
||||
! call configuration_of_det(det,occ,N_int)
|
||||
! call configuration_to_dets_size(occ,n,elec_alpha_num,N_int)
|
||||
|
||||
e_pert = 0.d0
|
||||
coef = 0.d0
|
||||
|
@ -175,7 +175,7 @@ subroutine make_selection_buffer_s2(b)
|
||||
! Sort
|
||||
integer, allocatable :: iorder(:)
|
||||
integer*8, allocatable :: bit_tmp(:)
|
||||
integer*8, external :: occ_pattern_search_key
|
||||
integer*8, external :: configuration_search_key
|
||||
integer(bit_kind), allocatable :: tmp_array(:,:,:)
|
||||
logical, allocatable :: duplicate(:)
|
||||
|
||||
@ -193,7 +193,7 @@ subroutine make_selection_buffer_s2(b)
|
||||
o(k,2,i) = iand(b%det(k,1,i), b%det(k,2,i))
|
||||
enddo
|
||||
iorder(i) = i
|
||||
bit_tmp(i) = occ_pattern_search_key(o(1,1,i),N_int)
|
||||
bit_tmp(i) = configuration_search_key(o(1,1,i),N_int)
|
||||
enddo
|
||||
|
||||
deallocate(b%det)
|
||||
@ -279,7 +279,7 @@ subroutine make_selection_buffer_s2(b)
|
||||
! Create determinants
|
||||
n_d = 0
|
||||
do i=1,n_p
|
||||
call occ_pattern_to_dets_size(o(1,1,i),sze,elec_alpha_num,N_int)
|
||||
call configuration_to_dets_size(o(1,1,i),sze,elec_alpha_num,N_int)
|
||||
n_d = n_d + sze
|
||||
if (n_d > b%cur) then
|
||||
! if (n_d - b%cur > b%cur - n_d + sze) then
|
||||
@ -295,8 +295,8 @@ subroutine make_selection_buffer_s2(b)
|
||||
k=1
|
||||
do i=1,n_p
|
||||
n=n_d
|
||||
call occ_pattern_to_dets_size(o(1,1,i),n,elec_alpha_num,N_int)
|
||||
call occ_pattern_to_dets(o(1,1,i),b%det(1,1,k),n,elec_alpha_num,N_int)
|
||||
call configuration_to_dets_size(o(1,1,i),n,elec_alpha_num,N_int)
|
||||
call configuration_to_dets(o(1,1,i),b%det(1,1,k),n,elec_alpha_num,N_int)
|
||||
do j=k,k+n-1
|
||||
b%val(j) = val(i)
|
||||
enddo
|
||||
|
@ -296,8 +296,8 @@ subroutine run_slave_main
|
||||
print *, 'Number of threads', nproc_target
|
||||
endif
|
||||
|
||||
if (h0_type == 'SOP') then
|
||||
PROVIDE det_to_occ_pattern
|
||||
if (h0_type == 'CFG') then
|
||||
PROVIDE det_to_configuration
|
||||
endif
|
||||
|
||||
PROVIDE global_selection_buffer
|
||||
|
@ -92,7 +92,7 @@ subroutine run_stochastic_cipsi
|
||||
|
||||
call write_double(6,correlation_energy_ratio, 'Correlation ratio')
|
||||
call print_summary(psi_energy_with_nucl_rep, &
|
||||
pt2_data, pt2_data_err, N_det,N_occ_pattern,N_states,psi_s2)
|
||||
pt2_data, pt2_data_err, N_det,N_configuration,N_states,psi_s2)
|
||||
|
||||
call save_energy(psi_energy_with_nucl_rep, pt2_data % pt2)
|
||||
|
||||
@ -131,7 +131,7 @@ subroutine run_stochastic_cipsi
|
||||
|
||||
call save_energy(psi_energy_with_nucl_rep, pt2_data % pt2)
|
||||
call print_summary(psi_energy_with_nucl_rep, &
|
||||
pt2_data , pt2_data_err, N_det, N_occ_pattern, N_states, psi_s2)
|
||||
pt2_data , pt2_data_err, N_det, N_configuration, N_states, psi_s2)
|
||||
call save_iterations(psi_energy_with_nucl_rep(1:N_states),pt2_data % rpt2,N_det)
|
||||
call print_extrapolated_energy()
|
||||
endif
|
||||
|
@ -1,9 +1,9 @@
|
||||
use bitmasks
|
||||
subroutine occ_pattern_of_det(d,o,Nint)
|
||||
subroutine configuration_of_det(d,o,Nint)
|
||||
use bitmasks
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
! Transforms a determinant to an occupation pattern
|
||||
! Transforms a determinant to a configuration
|
||||
!
|
||||
! occ(:,1) : Single occupations
|
||||
!
|
||||
@ -23,11 +23,11 @@ subroutine occ_pattern_of_det(d,o,Nint)
|
||||
end
|
||||
|
||||
|
||||
subroutine occ_pattern_to_dets_size(o,sze,n_alpha,Nint)
|
||||
subroutine configuration_to_dets_size(o,sze,n_alpha,Nint)
|
||||
use bitmasks
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
! Number of possible determinants for a given occ_pattern
|
||||
! Number of possible determinants for a given configuration
|
||||
END_DOC
|
||||
integer ,intent(in) :: Nint, n_alpha
|
||||
integer(bit_kind),intent(in) :: o(Nint,2)
|
||||
@ -49,15 +49,15 @@ subroutine occ_pattern_to_dets_size(o,sze,n_alpha,Nint)
|
||||
end
|
||||
|
||||
|
||||
subroutine occ_pattern_to_dets(o,d,sze,n_alpha,Nint)
|
||||
subroutine configuration_to_dets(o,d,sze,n_alpha,Nint)
|
||||
use bitmasks
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
! Generate all possible determinants for a given occ_pattern
|
||||
! Generate all possible determinants for a given configuration
|
||||
!
|
||||
! Input :
|
||||
! o : occupation pattern : (doubly occupied, singly occupied)
|
||||
! sze : Number of produced determinants, computed by `occ_pattern_to_dets_size`
|
||||
! o : configuration : (doubly occupied, singly occupied)
|
||||
! sze : Number of produced determinants, computed by `configuration_to_dets_size`
|
||||
! n_alpha : Number of $\alpha$ electrons
|
||||
! Nint : N_int
|
||||
!
|
||||
@ -184,32 +184,32 @@ subroutine occ_pattern_to_dets(o,d,sze,n_alpha,Nint)
|
||||
end
|
||||
|
||||
|
||||
BEGIN_PROVIDER [ integer(bit_kind), psi_occ_pattern, (N_int,2,psi_det_size) ]
|
||||
&BEGIN_PROVIDER [ integer, N_occ_pattern ]
|
||||
BEGIN_PROVIDER [ integer(bit_kind), psi_configuration, (N_int,2,psi_det_size) ]
|
||||
&BEGIN_PROVIDER [ integer, N_configuration ]
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
! Array of the occ_patterns present in the wave function.
|
||||
! Array of the configurations present in the wave function.
|
||||
!
|
||||
! psi_occ_pattern(:,1,j) = j-th occ_pattern of the wave function : represents all the single occupations
|
||||
! psi_configuration(:,1,j) = j-th configuration of the wave function : represents all the single occupations
|
||||
!
|
||||
! psi_occ_pattern(:,2,j) = j-th occ_pattern of the wave function : represents all the double occupations
|
||||
! psi_configuration(:,2,j) = j-th configuration of the wave function : represents all the double occupations
|
||||
!
|
||||
! The occ patterns are sorted by :c:func:`occ_pattern_search_key`
|
||||
! The occ patterns are sorted by :c:func:`configuration_search_key`
|
||||
END_DOC
|
||||
integer :: i,j,k
|
||||
|
||||
! create
|
||||
do i = 1, N_det
|
||||
do k = 1, N_int
|
||||
psi_occ_pattern(k,1,i) = ieor(psi_det(k,1,i),psi_det(k,2,i))
|
||||
psi_occ_pattern(k,2,i) = iand(psi_det(k,1,i),psi_det(k,2,i))
|
||||
psi_configuration(k,1,i) = ieor(psi_det(k,1,i),psi_det(k,2,i))
|
||||
psi_configuration(k,2,i) = iand(psi_det(k,1,i),psi_det(k,2,i))
|
||||
enddo
|
||||
enddo
|
||||
|
||||
! Sort
|
||||
integer, allocatable :: iorder(:)
|
||||
integer*8, allocatable :: bit_tmp(:)
|
||||
integer*8, external :: occ_pattern_search_key
|
||||
integer*8, external :: configuration_search_key
|
||||
integer(bit_kind), allocatable :: tmp_array(:,:,:)
|
||||
logical,allocatable :: duplicate(:)
|
||||
logical :: dup
|
||||
@ -219,7 +219,7 @@ end
|
||||
|
||||
do i=1,N_det
|
||||
iorder(i) = i
|
||||
bit_tmp(i) = occ_pattern_search_key(psi_occ_pattern(1,1,i),N_int)
|
||||
bit_tmp(i) = configuration_search_key(psi_configuration(1,1,i),N_int)
|
||||
enddo
|
||||
|
||||
call i8sort(bit_tmp,iorder,N_det)
|
||||
@ -230,8 +230,8 @@ end
|
||||
!$OMP DO
|
||||
do i=1,N_det
|
||||
do k=1,N_int
|
||||
tmp_array(k,1,i) = psi_occ_pattern(k,1,iorder(i))
|
||||
tmp_array(k,2,i) = psi_occ_pattern(k,2,iorder(i))
|
||||
tmp_array(k,1,i) = psi_configuration(k,1,iorder(i))
|
||||
tmp_array(k,2,i) = psi_configuration(k,2,iorder(i))
|
||||
enddo
|
||||
duplicate(i) = .False.
|
||||
enddo
|
||||
@ -273,36 +273,36 @@ end
|
||||
!$OMP END PARALLEL
|
||||
|
||||
! Copy filtered result
|
||||
N_occ_pattern=0
|
||||
N_configuration=0
|
||||
do i=1,N_det
|
||||
if (duplicate(i)) then
|
||||
cycle
|
||||
endif
|
||||
N_occ_pattern += 1
|
||||
N_configuration += 1
|
||||
do k=1,N_int
|
||||
psi_occ_pattern(k,1,N_occ_pattern) = tmp_array(k,1,i)
|
||||
psi_occ_pattern(k,2,N_occ_pattern) = tmp_array(k,2,i)
|
||||
psi_configuration(k,1,N_configuration) = tmp_array(k,1,i)
|
||||
psi_configuration(k,2,N_configuration) = tmp_array(k,2,i)
|
||||
enddo
|
||||
enddo
|
||||
|
||||
!- Check
|
||||
! print *, 'Checking for duplicates in occ pattern'
|
||||
! do i=1,N_occ_pattern
|
||||
! do j=i+1,N_occ_pattern
|
||||
! do i=1,N_configuration
|
||||
! do j=i+1,N_configuration
|
||||
! duplicate(1) = .True.
|
||||
! do k=1,N_int
|
||||
! if (psi_occ_pattern(k,1,i) /= psi_occ_pattern(k,1,j)) then
|
||||
! if (psi_configuration(k,1,i) /= psi_configuration(k,1,j)) then
|
||||
! duplicate(1) = .False.
|
||||
! exit
|
||||
! endif
|
||||
! if (psi_occ_pattern(k,2,i) /= psi_occ_pattern(k,2,j)) then
|
||||
! if (psi_configuration(k,2,i) /= psi_configuration(k,2,j)) then
|
||||
! duplicate(1) = .False.
|
||||
! exit
|
||||
! endif
|
||||
! enddo
|
||||
! if (duplicate(1)) then
|
||||
! call debug_det(psi_occ_pattern(1,1,i),N_int)
|
||||
! call debug_det(psi_occ_pattern(1,1,j),N_int)
|
||||
! call debug_det(psi_configuration(1,1,i),N_int)
|
||||
! call debug_det(psi_configuration(1,1,j),N_int)
|
||||
! stop 'DUPLICATE'
|
||||
! endif
|
||||
! enddo
|
||||
@ -313,21 +313,21 @@ end
|
||||
|
||||
END_PROVIDER
|
||||
|
||||
BEGIN_PROVIDER [ integer, det_to_occ_pattern, (N_det) ]
|
||||
BEGIN_PROVIDER [ integer, det_to_configuration, (N_det) ]
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
! Returns the index of the occupation pattern for each determinant
|
||||
! Returns the index of the configuration for each determinant
|
||||
END_DOC
|
||||
integer :: i,j,k,r,l
|
||||
integer*8 :: key
|
||||
integer(bit_kind) :: occ(N_int,2)
|
||||
logical :: found
|
||||
integer*8, allocatable :: bit_tmp(:)
|
||||
integer*8, external :: occ_pattern_search_key
|
||||
integer*8, external :: configuration_search_key
|
||||
|
||||
allocate(bit_tmp(N_occ_pattern))
|
||||
do i=1,N_occ_pattern
|
||||
bit_tmp(i) = occ_pattern_search_key(psi_occ_pattern(1,1,i),N_int)
|
||||
allocate(bit_tmp(N_configuration))
|
||||
do i=1,N_configuration
|
||||
bit_tmp(i) = configuration_search_key(psi_configuration(1,1,i),N_int)
|
||||
enddo
|
||||
|
||||
!$OMP PARALLEL DO DEFAULT(SHARED) &
|
||||
@ -338,11 +338,11 @@ BEGIN_PROVIDER [ integer, det_to_occ_pattern, (N_det) ]
|
||||
occ(k,2) = iand(psi_det(k,1,i),psi_det(k,2,i))
|
||||
enddo
|
||||
|
||||
key = occ_pattern_search_key(occ,N_int)
|
||||
key = configuration_search_key(occ,N_int)
|
||||
|
||||
! TODO: Binary search
|
||||
l = 1
|
||||
r = N_occ_pattern
|
||||
r = N_configuration
|
||||
! do while(r-l > 32)
|
||||
! j = shiftr(r+l,1)
|
||||
! if (bit_tmp(j) < key) then
|
||||
@ -354,14 +354,14 @@ BEGIN_PROVIDER [ integer, det_to_occ_pattern, (N_det) ]
|
||||
do j=l,r
|
||||
found = .True.
|
||||
do k=1,N_int
|
||||
if ( (occ(k,1) /= psi_occ_pattern(k,1,j)) &
|
||||
.or. (occ(k,2) /= psi_occ_pattern(k,2,j)) ) then
|
||||
if ( (occ(k,1) /= psi_configuration(k,1,j)) &
|
||||
.or. (occ(k,2) /= psi_configuration(k,2,j)) ) then
|
||||
found = .False.
|
||||
exit
|
||||
endif
|
||||
enddo
|
||||
if (found) then
|
||||
det_to_occ_pattern(i) = j
|
||||
det_to_configuration(i) = j
|
||||
exit
|
||||
endif
|
||||
enddo
|
||||
@ -376,78 +376,78 @@ BEGIN_PROVIDER [ integer, det_to_occ_pattern, (N_det) ]
|
||||
END_PROVIDER
|
||||
|
||||
|
||||
BEGIN_PROVIDER [ double precision, psi_occ_pattern_Hii, (N_occ_pattern) ]
|
||||
BEGIN_PROVIDER [ double precision, psi_configuration_Hii, (N_configuration) ]
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
! $\langle I|H|I \rangle$ where $|I\rangle$ is an occupation pattern.
|
||||
! $\langle I|H|I \rangle$ where $|I\rangle$ is a configuration.
|
||||
! This is the minimum $H_{ii}$, where the $|i\rangle$ are the
|
||||
! determinants of $|I\rangle$.
|
||||
END_DOC
|
||||
integer :: j, i
|
||||
|
||||
psi_occ_pattern_Hii(:) = huge(1.d0)
|
||||
psi_configuration_Hii(:) = huge(1.d0)
|
||||
do i=1,N_det
|
||||
j = det_to_occ_pattern(i)
|
||||
psi_occ_pattern_Hii(j) = min(psi_occ_pattern_Hii(j), psi_det_Hii(i))
|
||||
j = det_to_configuration(i)
|
||||
psi_configuration_Hii(j) = min(psi_configuration_Hii(j), psi_det_Hii(i))
|
||||
enddo
|
||||
|
||||
END_PROVIDER
|
||||
|
||||
|
||||
BEGIN_PROVIDER [ double precision, weight_occ_pattern, (N_occ_pattern,N_states) ]
|
||||
BEGIN_PROVIDER [ double precision, weight_configuration, (N_configuration,N_states) ]
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
! Weight of the occupation patterns in the wave function
|
||||
! Weight of the configurations in the wave function
|
||||
END_DOC
|
||||
integer :: i,j,k
|
||||
weight_occ_pattern = 0.d0
|
||||
weight_configuration = 0.d0
|
||||
do i=1,N_det
|
||||
j = det_to_occ_pattern(i)
|
||||
j = det_to_configuration(i)
|
||||
do k=1,N_states
|
||||
weight_occ_pattern(j,k) += psi_coef(i,k) * psi_coef(i,k)
|
||||
weight_configuration(j,k) += psi_coef(i,k) * psi_coef(i,k)
|
||||
enddo
|
||||
enddo
|
||||
END_PROVIDER
|
||||
|
||||
BEGIN_PROVIDER [ double precision, weight_occ_pattern_average, (N_occ_pattern) ]
|
||||
BEGIN_PROVIDER [ double precision, weight_configuration_average, (N_configuration) ]
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
! State-average weight of the occupation patterns in the wave function
|
||||
! State-average weight of the configurations in the wave function
|
||||
END_DOC
|
||||
integer :: i,j,k
|
||||
weight_occ_pattern_average(:) = 0.d0
|
||||
weight_configuration_average(:) = 0.d0
|
||||
do i=1,N_det
|
||||
j = det_to_occ_pattern(i)
|
||||
j = det_to_configuration(i)
|
||||
do k=1,N_states
|
||||
weight_occ_pattern_average(j) += psi_coef(i,k) * psi_coef(i,k) * state_average_weight(k)
|
||||
weight_configuration_average(j) += psi_coef(i,k) * psi_coef(i,k) * state_average_weight(k)
|
||||
enddo
|
||||
enddo
|
||||
END_PROVIDER
|
||||
|
||||
BEGIN_PROVIDER [ integer(bit_kind), psi_occ_pattern_sorted, (N_int,2,N_occ_pattern) ]
|
||||
&BEGIN_PROVIDER [ double precision, weight_occ_pattern_average_sorted, (N_occ_pattern) ]
|
||||
&BEGIN_PROVIDER [ integer, psi_occ_pattern_sorted_order, (N_occ_pattern) ]
|
||||
&BEGIN_PROVIDER [ integer, psi_occ_pattern_sorted_order_reverse, (N_occ_pattern) ]
|
||||
BEGIN_PROVIDER [ integer(bit_kind), psi_configuration_sorted, (N_int,2,N_configuration) ]
|
||||
&BEGIN_PROVIDER [ double precision, weight_configuration_average_sorted, (N_configuration) ]
|
||||
&BEGIN_PROVIDER [ integer, psi_configuration_sorted_order, (N_configuration) ]
|
||||
&BEGIN_PROVIDER [ integer, psi_configuration_sorted_order_reverse, (N_configuration) ]
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
! Occupation patterns sorted by weight
|
||||
! Configurations sorted by weight
|
||||
END_DOC
|
||||
integer :: i,j,k
|
||||
integer, allocatable :: iorder(:)
|
||||
allocate ( iorder(N_occ_pattern) )
|
||||
do i=1,N_occ_pattern
|
||||
weight_occ_pattern_average_sorted(i) = -weight_occ_pattern_average(i)
|
||||
allocate ( iorder(N_configuration) )
|
||||
do i=1,N_configuration
|
||||
weight_configuration_average_sorted(i) = -weight_configuration_average(i)
|
||||
iorder(i) = i
|
||||
enddo
|
||||
call dsort(weight_occ_pattern_average_sorted,iorder,N_occ_pattern)
|
||||
do i=1,N_occ_pattern
|
||||
call dsort(weight_configuration_average_sorted,iorder,N_configuration)
|
||||
do i=1,N_configuration
|
||||
do j=1,N_int
|
||||
psi_occ_pattern_sorted(j,1,i) = psi_occ_pattern(j,1,iorder(i))
|
||||
psi_occ_pattern_sorted(j,2,i) = psi_occ_pattern(j,2,iorder(i))
|
||||
psi_configuration_sorted(j,1,i) = psi_configuration(j,1,iorder(i))
|
||||
psi_configuration_sorted(j,2,i) = psi_configuration(j,2,iorder(i))
|
||||
enddo
|
||||
psi_occ_pattern_sorted_order(iorder(i)) = i
|
||||
psi_occ_pattern_sorted_order_reverse(i) = iorder(i)
|
||||
weight_occ_pattern_average_sorted(i) = -weight_occ_pattern_average_sorted(i)
|
||||
psi_configuration_sorted_order(iorder(i)) = i
|
||||
psi_configuration_sorted_order_reverse(i) = iorder(i)
|
||||
weight_configuration_average_sorted(i) = -weight_configuration_average_sorted(i)
|
||||
enddo
|
||||
|
||||
deallocate(iorder)
|
||||
@ -466,27 +466,27 @@ subroutine make_s2_eigenfunction
|
||||
logical :: update
|
||||
|
||||
update=.False.
|
||||
call write_int(6,N_occ_pattern,'Number of occupation patterns')
|
||||
call write_int(6,N_configuration,'Number of configurations')
|
||||
|
||||
!$OMP PARALLEL DEFAULT(NONE) &
|
||||
!$OMP SHARED(N_occ_pattern, psi_occ_pattern, elec_alpha_num,N_int,update) &
|
||||
!$OMP SHARED(N_configuration, psi_configuration, elec_alpha_num,N_int,update) &
|
||||
!$OMP PRIVATE(s,ithread, d, det_buffer, smax, N_det_new,i,j,k)
|
||||
N_det_new = 0
|
||||
call occ_pattern_to_dets_size(psi_occ_pattern(1,1,1),s,elec_alpha_num,N_int)
|
||||
call configuration_to_dets_size(psi_configuration(1,1,1),s,elec_alpha_num,N_int)
|
||||
allocate (d(N_int,2,s+64), det_buffer(N_int,2,bufsze) )
|
||||
smax = s
|
||||
ithread=0
|
||||
!$ ithread = omp_get_thread_num()
|
||||
!$OMP DO SCHEDULE (dynamic,1000)
|
||||
do i=1,N_occ_pattern
|
||||
call occ_pattern_to_dets_size(psi_occ_pattern(1,1,i),s,elec_alpha_num,N_int)
|
||||
do i=1,N_configuration
|
||||
call configuration_to_dets_size(psi_configuration(1,1,i),s,elec_alpha_num,N_int)
|
||||
s += 1
|
||||
if (s > smax) then
|
||||
deallocate(d)
|
||||
allocate ( d(N_int,2,s+64) )
|
||||
smax = s
|
||||
endif
|
||||
call occ_pattern_to_dets(psi_occ_pattern(1,1,i),d,s,elec_alpha_num,N_int)
|
||||
call configuration_to_dets(psi_configuration(1,1,i),d,s,elec_alpha_num,N_int)
|
||||
do j=1,s
|
||||
if ( is_in_wavefunction(d(1,1,j), N_int) ) then
|
||||
cycle
|
||||
@ -511,7 +511,7 @@ subroutine make_s2_eigenfunction
|
||||
|
||||
if (update) then
|
||||
call copy_H_apply_buffer_to_wf
|
||||
TOUCH N_det psi_coef psi_det psi_occ_pattern N_occ_pattern
|
||||
TOUCH N_det psi_coef psi_det psi_configuration N_configuration
|
||||
endif
|
||||
call write_time(6)
|
||||
|
@ -12,7 +12,7 @@ integer*8 function det_search_key(det,Nint)
|
||||
end
|
||||
|
||||
|
||||
integer*8 function occ_pattern_search_key(det,Nint)
|
||||
integer*8 function configuration_search_key(det,Nint)
|
||||
use bitmasks
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
@ -22,7 +22,7 @@ integer*8 function occ_pattern_search_key(det,Nint)
|
||||
integer(bit_kind), intent(in) :: det(Nint,2)
|
||||
integer :: i
|
||||
i = shiftr(elec_alpha_num, bit_kind_shift)+1
|
||||
occ_pattern_search_key = int(shiftr(ior(det(i,1),det(i,2)),1)+sum(det),8)
|
||||
configuration_search_key = int(shiftr(ior(det(i,1),det(i,2)),1)+sum(det),8)
|
||||
end
|
||||
|
||||
|
||||
|
@ -10,16 +10,16 @@ BEGIN_PROVIDER [ logical, pruned, (N_det) ]
|
||||
return
|
||||
endif
|
||||
|
||||
integer :: i,j,k,ndet_new,nsop_max
|
||||
integer :: i,j,k,ndet_new,ncfg_max
|
||||
double precision :: thr
|
||||
|
||||
if (s2_eig) then
|
||||
|
||||
nsop_max = max(1,int ( dble(N_occ_pattern) * (1.d0 - pruning) + 0.5d0 ))
|
||||
ncfg_max = max(1,int ( dble(N_configuration) * (1.d0 - pruning) + 0.5d0 ))
|
||||
|
||||
do i=1,N_det
|
||||
k = det_to_occ_pattern(i)
|
||||
pruned(i) = psi_occ_pattern_sorted_order_reverse(k) > nsop_max
|
||||
k = det_to_configuration(i)
|
||||
pruned(i) = psi_configuration_sorted_order_reverse(k) > ncfg_max
|
||||
enddo
|
||||
|
||||
else
|
||||
|
@ -54,7 +54,7 @@ subroutine run
|
||||
endif
|
||||
|
||||
call print_summary(psi_energy_with_nucl_rep(1:N_states), &
|
||||
pt2_data, pt2_data_err, N_det,N_occ_pattern,N_states,psi_s2)
|
||||
pt2_data, pt2_data_err, N_det,N_configuration,N_states,psi_s2)
|
||||
|
||||
call save_energy(E_CI_before, pt2_data % pt2)
|
||||
call pt2_dealloc(pt2_data)
|
||||
|
@ -1,11 +1,11 @@
|
||||
subroutine print_summary(e_,pt2_data,pt2_data_err,n_det_,n_occ_pattern_,n_st,s2_)
|
||||
subroutine print_summary(e_,pt2_data,pt2_data_err,n_det_,n_configuration_,n_st,s2_)
|
||||
use selection_types
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
! Print the extrapolated energy in the output
|
||||
END_DOC
|
||||
|
||||
integer, intent(in) :: n_det_, n_occ_pattern_, n_st
|
||||
integer, intent(in) :: n_det_, n_configuration_, n_st
|
||||
double precision, intent(in) :: e_(n_st), s2_(n_st)
|
||||
type(pt2_type) , intent(in) :: pt2_data, pt2_data_err
|
||||
integer :: i, k
|
||||
@ -57,7 +57,7 @@ subroutine print_summary(e_,pt2_data,pt2_data_err,n_det_,n_occ_pattern_,n_st,s2_
|
||||
print *, 'N_det = ', N_det_
|
||||
print *, 'N_states = ', n_st
|
||||
if (s2_eig) then
|
||||
print *, 'N_sop = ', N_occ_pattern_
|
||||
print *, 'N_cfg = ', N_configuration_
|
||||
endif
|
||||
print *, ''
|
||||
|
||||
|
@ -36,6 +36,6 @@ default: 1.00
|
||||
|
||||
[h0_type]
|
||||
type: character*(32)
|
||||
doc: Type of denominator in PT2. [EN | SOP | HF]
|
||||
doc: Type of denominator in PT2. [EN | CFG | HF]
|
||||
interface: ezfio,provider,ocaml
|
||||
default: EN
|
||||
|
Loading…
Reference in New Issue
Block a user