IM-SRG++  0
Public Member Functions | Public Attributes | List of all members
HartreeFock Class Reference

Public Member Functions

 HartreeFock (Operator &hbare)
 Constructor.
 
void BuildMonopoleV ()
 Only the monopole part of V is needed, so construct it. More...
 
void BuildMonopoleV3 ()
 Only the monopole part of V3 is needed. More...
 
void Diagonalize ()
 Diagonalize the Fock matrix. More...
 
void UpdateF ()
 Update the Fock matrix with the new transformation coefficients C. More...
 
void UpdateDensityMatrix ()
 Update the density matrix with the new coefficients C. More...
 
bool CheckConvergence ()
 Compare the current energies with those from the previous iteration. More...
 
void Solve ()
 Diagonalize and UpdateF until convergence. More...
 
void CalcEHF ()
 Evaluate the Hartree Fock energy. More...
 
void PrintEHF ()
 Print out the Hartree Fock energy. More...
 
void ReorderCoefficients ()
 Reorder the coefficients in C to eliminate phases etc. More...
 
Operator TransformToHFBasis (Operator &OpIn)
 Transform an operator from oscillator basis to HF basis. More...
 
Operator GetNormalOrderedH ()
 Return the Hamiltonian in the HF basis at the normal-ordered 2body level. More...
 
Operator GetOmega ()
 Return a generator of the Hartree Fock transformation. More...
 
Operator GetHbare ()
 
void PrintSPE ()
 Getter function for Hbare. More...
 
void FreeVmon ()
 Free up the memory used to store Vmon3.
 
void GetRadialWF (index_t index, vector< double > &R, vector< double > &PSI)
 Return the radial wave function of an orbit in the HF basis.
 

Public Attributes

OperatorHbare
 Input bare Hamiltonian.
 
ModelSpacemodelspace
 Model Space of the Hamiltonian.
 
arma::mat C
 transformation coefficients, 1st index is ho basis, 2nd = HF basis
 
arma::mat rho
 density matrix rho_ij
 
arma::mat KE
 kinetic energy
 
arma::mat Vij
 1 body piece of 2 body potential
 
arma::mat V3ij
 1 body piece of 3 body potential
 
arma::mat F
 Fock matrix.
 
array< array< arma::mat, 2 >, 3 > Vmon
 Monopole 2-body interaction.
 
array< array< arma::mat, 2 >, 3 > Vmon_exch
 Monopole 2-body interaction.
 
arma::uvec holeorbs
 list of hole orbits for generating density matrix
 
arma::rowvec hole_occ
 
arma::vec energies
 occupations of hole orbits More...
 
arma::vec prev_energies
 SPE's from last iteration.
 
double tolerance
 tolerance for convergence
 
double EHF
 Hartree-Fock energy (Normal-ordered 0-body term)
 
double e1hf
 One-body contribution to EHF.
 
double e2hf
 Two-body contribution to EHF.
 
double e3hf
 Three-body contribution to EHF.
 
int iterations
 iterations used in Solve()
 
vector< pair< const array< int, 6 >, double > > Vmon3
 
IMSRGProfiler profiler
 Profiler for timing, etc.
 
deque< double > convergence_ediff
 Save last few convergence checks for diagnostics.
 
deque< double > convergence_EHF
 Save last few convergence checks for diagnostics.
 

Member Function Documentation

void HartreeFock::BuildMonopoleV ( )

Only the monopole part of V is needed, so construct it.

Construct an unnormalized two-body monopole interaction

\[ \langle ab | \bar{V}^{(2)} | cd \rangle = \sqrt{(1+\delta_{ab})(1+\delta_{cd})} \sum_{J} (2J+1) \langle ab | V^{(2)} | cd \rangle_{J} \]

This method utilizes the operator method TwoBodyME::GetTBMEmonopole()

void HartreeFock::BuildMonopoleV3 ( )

Only the monopole part of V3 is needed.

Construct an unnormalized three-body monopole interaction

\[ \langle iab | \bar{V}^{(3)} | jcd \rangle = \sum\limits_{J,J_{12}}\sum_{Tt_{12}}(2J+1)(2T+1) \langle (ia)J_{12}t_{12};b JT| V^{(3)} | (jc)J_{12}t_{12}; d JT\rangle \]

void HartreeFock::CalcEHF ( )

Evaluate the Hartree Fock energy.

Calculate the HF energy.

\begin{eqnarray*} E_{HF} &=& \sum_{\alpha} t_{\alpha\alpha} + \frac{1}{2}\sum_{\alpha\beta} V_{\alpha\beta\alpha\beta} + \frac{1}{6}\sum_{\alpha\beta\gamma} V_{\alpha\beta\gamma\alpha\beta\gamma} \\ &=& \sum_{ij} (2j_i+1) \rho_{ij} ( t_{ij} +\frac{1}{2}\tilde{V}^{(2)}_{ij} + \frac{1}{6}\tilde{V}^{(3)}_{ij} ) \end{eqnarray*}

Where the matrices

\begin{eqnarray*} \tilde{V}^{(2)}_{ij} &=& \sum_{ab} \rho_{ab}\bar{V}^{(2)}_{iajb} \\ \tilde{V}^{(3)}_{ij} &=& \sum_{abcd} \rho_{ab}\rho_{cd} \bar{V}^{(3)}_{iacjbd} \\ \end{eqnarray*}

have already been calculated by UpdateF().

bool HartreeFock::CheckConvergence ( )

Compare the current energies with those from the previous iteration.

Check for convergence using difference in s.p. energies between iterations. Converged when

\[ \delta_{e} \equiv \sqrt{ \sum_{i}(e_{i}^{(n)}-e_{i}^{(n-1)})^2} < \textrm{tolerance} \]

where \( e_{i}^{(n)} \) is the \( i \)th eigenvalue of the Fock matrix after \( n \) iterations.

void HartreeFock::Diagonalize ( )

Diagonalize the Fock matrix.

[See Suhonen eq. 4.85] Diagonalize the fock matrix \( <a|F|b> \) and put the eigenvectors in \(C(i,\alpha) = <i|\alpha> \) and eigenvalues in the vector energies. Save the last vector of energies to check for convergence. Submatrices corresponding to different channels are diagonalized independently. This guarantees that J,Tz, and \( \pi \) remain good.

Operator HartreeFock::GetNormalOrderedH ( )

Return the Hamiltonian in the HF basis at the normal-ordered 2body level.

Returns the normal-ordered Hamiltonian in the Hartree-Fock basis, neglecting the residual 3-body piece.

\[ E_0 = E_{HF} \]

\[ f = C^{\dagger} F C \]

\[ \Gamma = D^{\dagger} \left(V^{(2)}+V^{(3\rightarrow 2)} \right) D \]

\[ V^{(2\rightarrow 3)J}_{ijkl} \equiv \frac{1}{\sqrt{(1+\delta_{ij})(1+\delta_{kl})}}\sum_{ab}\sum_{J_3}(2J_{3}+1)\rho_{ab}V^{JJJ_{3}}_{ijaklb} \]

Where \( F\) is the Fock matrix obtained in UpdateF() and the matrix \( D\) is the same as the one defined in TransformToHFBasis().

Operator HartreeFock::GetOmega ( )

Return a generator of the Hartree Fock transformation.

Get the one-body generator corresponding to the transformation to the HF basis. Since the unitary transformation for HF is given by the \( U_{HF} = C^{\dagger} \) matrix, we have \( e^{-\Omega} = C \Rightarrow \Omega = -\log(C) \). The log is evaluated by diagonalizing the one-body submatrix and taking the log of the diagonal entries. This is much slower than the other methods, but it might be useful.

void HartreeFock::PrintEHF ( )

Print out the Hartree Fock energy.

Print out the Hartree Fock energy, and the 1-, 2-, and 3-body contributions to it.

void HartreeFock::PrintSPE ( )

Getter function for Hbare.

Print out the single-particle energies

void HartreeFock::ReorderCoefficients ( )

Reorder the coefficients in C to eliminate phases etc.

Eigenvectors/values come out of the diagonalization energy-ordered. We want them ordered corresponding to the input ordering, i.e. we want the l,j,tz sub-blockes of the matrix C to be energy-ordered and positive along the diagonal. For a 3x3 matrix this would be something like (this needs to be updated)

\[ \left( \begin{array}{rrr} -0.8 & 0.2 & -0.6 \\ -0.3 & 0.3 & 0.9 \\ 0.2 & 0.9 & -0.4 \\ \end{array}\right) \rightarrow \left(\begin{array}{rrr} 0.8 & -0.6 & 0.2 \\ 0.3 & 0.9 & 0.3 \\ -0.2 & -0.4 & 0.9 \\ \end{array}\right) \]

void HartreeFock::Solve ( )

Diagonalize and UpdateF until convergence.

Diagonalize and update the Fock matrix until convergence. Then, call ReorderCoefficients() to make sure the index ordering and phases are preserved in the transformation from the original basis to the Hatree-Fock basis.

Operator HartreeFock::TransformToHFBasis ( Operator OpHO)

Transform an operator from oscillator basis to HF basis.

Takes in an operator expressed in the basis of the original Hamiltonian, and returns that operator in the Hartree-Fock basis.

\[ t_{HF} = C^{\dagger} t_{HO} C \]

\[ V_{HF}^{J} = D^{\dagger} V^{J}_{HO} D \]

The matrix \( D \) is defined as

\[ D_{ab\alpha\beta} \equiv \sqrt{ \frac{1+\delta_{ab}} {1+\delta_{\alpha\beta}} } C_{a\alpha} C_{b\beta} \]

The factor in the square root is due to the fact that we're using normalized TBME's. Since only kets with \( a\leq b\) are stored, we can use the antisymmetry of the TBME's and define

\[ D(J)_{ab\alpha\beta} \equiv \sqrt{ \frac{1+\delta_{ab}} {1+\delta_{\alpha\beta}} } \left( C_{a\alpha} C_{b\beta} -(1-\delta_{ab})(-1)^{j_a+j_b-J} C_{b\alpha}C_{a\beta}\right) \]

void HartreeFock::UpdateDensityMatrix ( )

Update the density matrix with the new coefficients C.

one-body density matrix \( <i|\rho|j> = \sum\limits_{\beta} n_{\beta} <i|\beta> <\beta|j> \) where \(n_{\beta} \) ensures that beta runs over HF orbits in the core (i.e. below the fermi surface)

void HartreeFock::UpdateF ( )

Update the Fock matrix with the new transformation coefficients C.

[See Suhonen eq 4.85]

\[ F_{ij} = t_{ij} + \frac{1}{2j_i+1}\sum_{ab} \rho_{ab} \bar{V}^{(2)}_{iajb} + \frac{1}{2(2j_i+1)}\sum_{abcd}\rho_{ab} \rho_{cd} \bar{V}^{(3)}_{iacjbd} \]

  • \( F \) is the Fock matrix, to be diagonalized
  • \( t \) is the kinetic energy
  • \(\rho\) is the density matrix defined in UpdateDensityMatrix()
  • \( \bar{V}^{(2)} \) is the monopole component of the 2-body interaction defined in BuildMonopoleV().
  • \( \bar{V}^{(3)} \) is the monopole component of the 3-body interaction devined in BuildMonopoleV3().

Member Data Documentation

arma::vec HartreeFock::energies

occupations of hole orbits

vector of single particle energies


The documentation for this class was generated from the following files: