ampsci
High-precision calculations for one- and two-valence atomic systems
ExternalField::TDHF

ok

Uses TDHF to include core-polarisation (RPA) corrections to matrix elements of an external field operator.

Solves the set of TDHF equations

\[ (H - \epsilon \pm \omega)\delta\psi_b = -(\delta V + \delta\epsilon_c)\psi_b \]

self-consistently for each electron in the core to determine \(\delta V\). See 'ampsci.pdf' for a detailed physics description.

Construction
Requires a pointer to an operator (h) and a const HF::HartreeFock object.
Usage
solve_core (omega) solves the TDHF equations for a given frequency. Frequency should be positive (negative is allowed for testing only, with care). Can be re-run with a different frequency without restarting from scratch. dV (Fa, Fb) then returns the correction to the matrix element:

\[ \langle \phi_a || \delta V || \phi_b \rangle \]

#include <TDHF.hpp>

+ Inheritance diagram for ExternalField::TDHF:

Public Member Functions

 TDHF (const DiracOperator::TensorOperator *const h, const HF::HartreeFock *const hf)
 Constructs TDHF for operator h.
 
virtual void solve_core (double omega, int max_its=100, bool print=true) override
 Solves TDHF equations self-consistently for core electrons at frequency omega.
 
virtual Method method () const override
 Returns RPA method.
 
virtual void clear () override final
 Clears the internal state back to pre solve_core()
 
double dV (const DiracSpinor &Fa, const DiracSpinor &Fb, bool conj) const
 Returns reduced matrix element \(\langle a||\delta V||b\rangle\), or the conjugate \(\langle a||\delta V^\dagger||b\rangle\) if conj=true.
 
virtual double dV (const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
 Calculate reduced matrix element <n||dV||m>
 
DiracSpinor dV_rhs (int kappa_n, const DiracSpinor &Fm, bool conj=false) const override
 Calculates reduced right-hand-side, projected onto kappa: [dV|phi_m]_kappa.
 
const std::vector< DiracSpinor > & get_dPsis (const DiracSpinor &Fc, dPsiType XorY) const
 Returns const ref to dPsi orbitals for given core orbital Fc.
 
const DiracSpinorget_dPsi_x (const DiracSpinor &Fc, dPsiType XorY, const int kappa_x) const
 Returns const ref to dPsi orbital of given kappa.
 
DiracSpinor solve_dPsi (const DiracSpinor &Fv, const double omega, dPsiType XorY, const int kappa_beta, const MBPT::CorrelationPotential *const Sigma=nullptr, StateType st=StateType::ket, bool incl_dV=true) const
 Forms \(\delta\psi_v\) for valence state Fv (including core pol.): single kappa.
 
std::vector< DiracSpinorsolve_dPsis (const DiracSpinor &Fv, const double omega, dPsiType XorY, const MBPT::CorrelationPotential *const Sigma=nullptr, StateType st=StateType::ket, bool incl_dV=true) const
 Forms \(\delta\psi_v\) for all kappa channels; see solve_dPsi.
 
TDHFoperator= (const TDHF &)=delete
 
 TDHF (const TDHF &)=default
 
- Public Member Functions inherited from ExternalField::CorePolarisation
double last_eps () const
 Returns eps (convergance) of last solve_core run.
 
double last_its () const
 Returns its (# of iterations) of last solve_core run.
 
double last_omega () const
 Returns omega (frequency) of last solve_core run.
 
int rank () const
 
int parity () const
 
bool imagQ () const
 
double & eps_target ()
 Convergance target.
 
double eps_target () const
 Convergance target.
 
double eta () const
 Damping factor; 0 means no damping. Must have 0 <= eta < 1.
 
void set_eta (double eta)
 Set/update damping factor; 0 means no damping. Must have 0 <= eta < 1.
 
CorePolarisationoperator= (const CorePolarisation &)=delete
 
 CorePolarisation (const CorePolarisation &)=default
 

Protected Attributes

std::vector< std::vector< DiracSpinor > > m_X {}
 
std::vector< std::vector< DiracSpinor > > m_Y {}
 
std::vector< std::vector< DiracSpinor > > m_hFcore {}
 
const HF::HartreeFock *const p_hf
 
const std::vector< DiracSpinorm_core
 
const double m_alpha
 
const HF::Breit *const p_VBr
 
- Protected Attributes inherited from ExternalField::CorePolarisation
const DiracOperator::TensorOperatorm_h
 
double m_core_eps {1.0}
 
int m_core_its {0}
 
double m_core_omega {0.0}
 
int m_rank
 
int m_pi
 
bool m_imag
 
double m_eta {0.4}
 
double m_eps {1.0e-10}
 

Additional Inherited Members

- Protected Member Functions inherited from ExternalField::CorePolarisation
 CorePolarisation (const DiracOperator::TensorOperator *const h)
 

Constructor & Destructor Documentation

◆ TDHF()

ExternalField::TDHF::TDHF ( const DiracOperator::TensorOperator *const  h,
const HF::HartreeFock *const  hf 
)

Constructs TDHF for operator h.

Parameters
hExternal field operator.
hfHF::HartreeFock object defining the core.

Member Function Documentation

◆ solve_core()

void ExternalField::TDHF::solve_core ( double  omega,
int  max_its = 100,
bool  print = true 
)
overridevirtual

Solves TDHF equations self-consistently for core electrons at frequency omega.

Will iterate up to a maximum of max_its. Set max_its=1 to get first-order correction [note: no damping is used for first iteration]. If print=true, will write progress to screen.

Implements ExternalField::CorePolarisation.

Reimplemented in ExternalField::TDHFbasis.

◆ method()

virtual Method ExternalField::TDHF::method ( ) const
inlineoverridevirtual

Returns RPA method.

Implements ExternalField::CorePolarisation.

Reimplemented in ExternalField::TDHFbasis.

◆ clear()

void ExternalField::TDHF::clear ( )
finaloverridevirtual

Clears the internal state back to pre solve_core()

Implements ExternalField::CorePolarisation.

◆ dV() [1/2]

double ExternalField::TDHF::dV ( const DiracSpinor Fa,
const DiracSpinor Fb,
bool  conj 
) const

Returns reduced matrix element \(\langle a||\delta V||b\rangle\), or the conjugate \(\langle a||\delta V^\dagger||b\rangle\) if conj=true.

◆ dV() [2/2]

double ExternalField::TDHF::dV ( const DiracSpinor Fn,
const DiracSpinor Fm 
) const
finaloverridevirtual

Calculate reduced matrix element <n||dV||m>

Implements ExternalField::CorePolarisation.

◆ dV_rhs()

DiracSpinor ExternalField::TDHF::dV_rhs ( int  kappa,
const DiracSpinor Fm,
bool  conj = false 
) const
overridevirtual

Calculates reduced right-hand-side, projected onto kappa: [dV|phi_m]_kappa.

Reimplemented from ExternalField::CorePolarisation.

◆ get_dPsis()

const std::vector< DiracSpinor > & ExternalField::TDHF::get_dPsis ( const DiracSpinor Fc,
dPsiType  XorY 
) const

Returns const ref to dPsi orbitals for given core orbital Fc.

◆ get_dPsi_x()

const DiracSpinor & ExternalField::TDHF::get_dPsi_x ( const DiracSpinor Fc,
dPsiType  XorY,
const int  kappa_x 
) const

Returns const ref to dPsi orbital of given kappa.

◆ solve_dPsi()

DiracSpinor ExternalField::TDHF::solve_dPsi ( const DiracSpinor Fv,
const double  omega,
dPsiType  XorY,
const int  kappa_beta,
const MBPT::CorrelationPotential *const  Sigma = nullptr,
StateType  st = StateType::ket,
bool  incl_dV = true 
) const

Forms \(\delta\psi_v\) for valence state Fv (including core pol.): single kappa.

Solves

\[ (H + \Sigma - \epsilon - \omega)X = -(h + \delta V - \delta\epsilon)\psi \]

or

\[ (H + \Sigma - \epsilon + \omega)Y = -(h^\dagger + \delta V^\dagger - \delta\epsilon)\psi \]

Returns \( \chi_\beta \) for given kappa_beta, where

\[ X_{j,m} = (-1)^{j_\beta-m}tjs(j,k,j;-m,0,m)\chi_j \]

Parameters
FvValence state \(\psi_v\).
omegaPerturbation frequency \(\omega\).
XorYSelects X or Y solution; see dPsiType.
kappa_betaKappa quantum number of the target channel.
SigmaOptional correlation potential; see MBPT::CorrelationPotential.
stBra or ket convention; see StateType.
incl_dVInclude the induced potential \(\delta V\) if true.

XXX Think this ^ shouldn't be here. Haven't checked though!

◆ solve_dPsis()

std::vector< DiracSpinor > ExternalField::TDHF::solve_dPsis ( const DiracSpinor Fv,
const double  omega,
dPsiType  XorY,
const MBPT::CorrelationPotential *const  Sigma = nullptr,
StateType  st = StateType::ket,
bool  incl_dV = true 
) const

Forms \(\delta\psi_v\) for all kappa channels; see solve_dPsi.


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