Virtual base class for core-polarisation (RPA); computes dV corrections.
Defines the interface for all RPA/core-polarisation methods. Concrete implementations are TDHF, TDHFbasis, and DiagramRPA. See the ExternalField namespace documentation for notation and physics.
- Note
- Stores a raw pointer to the external-field operator
h passed at construction. That operator must remain alive for the lifetime of this object.
- Note
- For frequency-dependent operators, updating the operator frequency externally will affect results. solve_core() should be re-called after any such update.
- Note
- Calling solve_core() with a different freuqnecy will only chnage the frequency used to solve the TDHF/RPA equations. It wil not change the frequency of the operator itself. For frequency-dependent operators, you must update the freuqency of the operator first. See DiracOperator::TensorOperator . Since this class stores just a pointer to the operator, that's all you need to do.
|
| 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 |
| | Rank of the operator.
|
| |
| int | parity () const |
| | Parity of the operator.
|
| |
| bool | imagQ () const |
| | Returns true if the operator is imaginary.
|
| |
| 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.
|
| |
| virtual Method | method () const =0 |
| | Returns RPA method.
|
| |
| virtual void | solve_core (double omega, int max_its=100, bool print=true)=0 |
| | Solve for delta_V_pm self-consistently for all core orbitals at frequency omega.
|
| |
| virtual void | clear ()=0 |
| | Clears the internal state back to pre solve_core()
|
| |
| virtual double | dV (const DiracSpinor &Fn, const DiracSpinor &Fm, bool conj=false) const =0 |
| | Returns the reduced matrix element <n||dV||m> (see namespace doc).
|
| |
| virtual DiracSpinor | dV_rhs (int kappa, const DiracSpinor &Fm, bool conj=false) const |
| | Returns [dV_pm * phi_m]_kappa: RHS of TDHF eq., projected onto kappa (see namespace doc)
|
| |
|
CorePolarisation & | operator= (const CorePolarisation &)=delete |
| |
|
| CorePolarisation (const CorePolarisation &)=default |
| |
| virtual void ExternalField::CorePolarisation::solve_core |
( |
double |
omega, |
|
|
int |
max_its = 100, |
|
|
bool |
print = true |
|
) |
| |
|
pure virtual |
Solve for delta_V_pm self-consistently for all core orbitals at frequency omega.
Iterates the RPA equations (TDHF or diagram, depending on the implementation) until the correction \( \delta V_\pm(\omega) \) converges to within eps_target(), or max_its iterations are reached.
- Parameters
-
| omega | External-field frequency \( \omega \) in atomic units. Solved at \( |\omega| \): both components, \( \delta V(\pm|\omega|) \), are found together, and selected in dV(). |
| max_its | Maximum number of iterations.
- 0: no iterations; dV() returns 0.
- 1: single iteration; dV() returns lowest-order correction.
|
| print | If true, print convergence progress to stdout. |
- Note
- Does not update the frequency of the operator itself; for frequency-dependent operators, update the operator frequency externally before calling.
Implemented in ExternalField::TDHFbasis, ExternalField::TDHF, ExternalField::TDHFcntm, and ExternalField::DiagramRPA.
| virtual double ExternalField::CorePolarisation::dV |
( |
const DiracSpinor & |
Fn, |
|
|
const DiracSpinor & |
Fm, |
|
|
bool |
conj = false |
|
) |
| const |
|
pure virtual |
Returns the reduced matrix element <n||dV||m> (see namespace doc).
conj = false: dV at +|omega|, the absorption (e^{-i omega t}) component; conj = true: dV at -|omega|, the emission component, which is the Hermitian conjugate dV^dag.
Both are solved by solve_core, which takes |omega|. The caller chooses: for a matrix element at the transition frequency omega = e_n - e_m, conj = (omega < 0). For a sum over states or a mixed state, conj follows the sign of the frequency the operator was set at, not the energies of the pair of orbitals.
For a static solve the two coincide (exactly, including imaginary operators), so conj does nothing there.
Implemented in ExternalField::TDHF, ExternalField::TDHFcntm, and ExternalField::DiagramRPA.