Quantum Numbers Sectors
The direct diagonalization of the Hamiltonian for a finite system becomes quickly impossible due to the exponential increase of its size \(D^{Ns}\), where \(D\) is the dimension of the local Hilbert space (\(D=4\) for spin-\(1/2\) electrons).
A way to partially soften such severe behavior is to take into account conserved quantities. For any quantity \({\cal Q}\) such that \([H,{\cal Q}]=0\), we can separate the structure of the Hamiltonian matrix into different blocks, each corresponding to a discrete value \(q\) of the spectrum of \(Q\). Analyzing one-by-one such symmetry sector it becomes possible to construct at least part of the energy spectrum.
The ED_SECTOR
represents a key part of the ED code. Here the
symmetry sectors construction essentially consist in the determination of the
injective map \({\cal M}:{\cal S}(\vec{Q})\rightarrow{\cal F}\)
relating the states of the sectors \(|i\rangle\in{\cal
S}(\vec{Q})\) to the corresponding ones \(|I\rangle\in{\cal F}\) in
the Fock space.
The map is constructed iterating over the states of the Fock spaces while verified the quantum number conditions. If verified for a given state \(|I\rangle\) a new state is found and it is added to the list. The following code snippet illustrates the case for a system conserving the total magnetization \(S_z=N_\uparrow-N_\downarrow\)
dim=0
! Iterate over down spin configurations
do idw=0,2**Ns-1
! use bit operation to get :math:`N_\downarrow`
ndw_= popcnt(idw)
! Iterate over up spin configurations
do iup=0,2**Ns-1
! use bit operation to get :math:`N_\uparrow`
nup_ = popcnt(iup)
! Get :math:`S_z=N_\uparrow-N_\downarrow`
sz_ = nup_ - ndw_
! if the evaluated magnetization is the required one:
! increase counter and store the Fock state into the map
if(sz_ == self%Sz)then
dim=dim+1
self%H(1)%map(dim) = iup + idw*2**Ns
endif
enddo
enddo
The dimension of the symmetry sector, i.e. the size of the map \({\cal M}(\vec{Q})\), is determined by a simple combinatorial algorithm (\(N\) being the total number of electronic levels):
Quantum Numbers |
Sector Dimension |
|
---|---|---|
|
\([\vec{N}_\uparrow,\vec{N}_\downarrow]\) |
\(\prod_{\alpha}\binom{N}{N_{\alpha\uparrow}}\binom{N}{N_{\alpha\downarrow}}\) |
|
\(S_z=N_\uparrow-N_\downarrow\) |
\(\sum_i 2^{N-S_z-2i}\binom{N}{N-S_z-2i}\binom{S_z+2i}{i}\) |
|
\(N_{tot}=N_\uparrow+N_\downarrow\) |
\(\binom{2N}{N_{tot}}\) |
Description
Contains procedures to construct the symmetry sectors corresponding to a given set of quantum numbers \(\vec{Q}\), in particular it allocated and build the sector_map
connecting the states of a given sector with the corresponding Fock ones.
Quick access
- Routines:
build_sector()
,get_dim()
,get_quantumnumbers()
,get_sector()
,map_allocate()
Used modules
ed_input_vars
: User-accessible input variablesed_vars_global
: Global variable accessible throughout the codeed_aux_funx
: Assortment of auxiliary procedures required throughout the code
External modules
-
mpi
Subroutines and functions
- interface ed_sector/map_allocate(h, n[, nsp])
Allocate the map(s) connecting the states in the symmetry sector to thos in the Fock space.
- Parameters:
h (various shapes) [sector_map]
n (various shapes) [integer]
- Options:
nsp [integer]
- interface ed_sector/get_sector(qn, n, isector, twojz)
Returns the index of
isector
of the symmetry sector given the quantum numbersqn
- Parameters:
qn (various shapes) [integer]
n [integer]
isector [integer]
twojz [integer]
- interface ed_sector/get_quantumnumbers(isector, n, qn)
Returns the quantum numbers
qn
given the index ofisector
of the symmetry sector- Parameters:
isector [integer]
n [integer]
qn (various shapes) [integer]
- subroutine ed_sector/build_sector(isector, self[, itrace])
This procedure build the sector
sector
\({\cal S}(\vec{Q})\) given the indexisector
which univocally determines the quantum numbers \(\vec{Q}\). All the components of the data structuresector
are determined here. Moreover the map connecting the states of the sector to thos in the Fock space is constructed. To avoid integer overflow the loop over Fock space states is decomposed in spin up and down integer so that \(I = I_\uparrow + 2^{N}I_\downarrow\).- Parameters:
isector [integer, in]
self [sector]
- Options:
itrace [logical]
- subroutine ed_sector/get_dim(isector, dim)
Returns the dimension of the symmetry sector with index
isector
- Parameters:
isector [integer]
dim [integer]