ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
lr_spectrum.h
Go to the documentation of this file.
1#pragma once
2#include "source_cell/klist.h"
4#include "source_psi/psi.h"
9namespace LR
10{
11 template<typename T>
13 {
14 public:
15 LR_Spectrum(const int& nspin_global, const int& naos, const std::vector<int>& nocc, const std::vector<int>& nvirt,
16 typename TGint<T>::type* gint, const ModulePW::PW_Basis& rho_basis, psi::Psi<T>& psi_ks_in,
17 const UnitCell& ucell, const K_Vectors& kv_in, const Grid_Driver& gd, const std::vector<double>& orb_cutoff,
19 const std::vector<Parallel_2D>& pX_in, const Parallel_2D& pc_in, const Parallel_Orbitals& pmat_in,
20 const double* eig, const T* X, const int& nstate, const bool& openshell,
21 const std::string& gauge = "length") :
22 nspin_x(openshell ? 2 : 1), naos(naos), nocc(nocc), nvirt(nvirt), nk(kv_in.get_nks() / nspin_global),
23 gint(gint), rho_basis(rho_basis), ucell(ucell), kv(kv_in), gd_(gd),
25 pX(pX_in), pc(pc_in), pmat(pmat_in),
26 eig(eig), X(X), nstate(nstate),
27 ldim(nk* (nspin_x == 2 ? pX_in[0].get_local_size() + pX_in[1].get_local_size() : pX_in[0].get_local_size())),
28 gdim(nk* std::inner_product(nocc.begin(), nocc.end(), nvirt.begin(), 0))
29 {
30 for (int is = 0;is < nspin_global;++is) { psi_ks.emplace_back(LR_Util::get_psi_spin(psi_ks_in, is, nk)); }
31 gauge == "velocity" ? this->cal_transition_dipoles_velocity() : this->cal_transition_dipoles_length();
32 this->oscillator_strength();
33 };
35 void optical_absorption_method1(const std::vector<double>& freq, const double eta);
37 void optical_absorption_method2(const std::vector<double>& freq, const double eta);
39 void transition_analysis(const std::string& spintype);
40
41 //========================================== test functions ==============================================
43 void write_transition_dipole(const std::string& filename);
45 void test_transition_dipoles_velocity_ks(const double* const ks_eig);
46 //======================================================================================================
47 private:
55 ModuleBase::Vector3<T> cal_transition_dipole_istate_velocity_R(const int istate, const Velocity_op<std::complex<double>>& vR);
56 ModuleBase::Vector3<T> cal_transition_dipole_istate_velocity_k(const int istate, const Velocity_op<std::complex<double>>& vR);
61 elecstate::DensityMatrix<T, T> cal_transition_density_matrix(const int istate, const T* X_in = nullptr, const bool need_R = true);
62 const int nspin_x = 1;
63 const int naos = 1;
64 const std::vector<int>& nocc;
65 const std::vector<int>& nvirt;
66 const int nk = 1;
67 const int nstate = 1;
68 const int ldim = 1;
69 const int gdim = 1;
70 const double ana_thr = 0.3;
71 const double* eig;
72 const T* X;
73 const K_Vectors& kv;
74 std::vector<psi::Psi<T>> psi_ks;
75 const std::vector<Parallel_2D>& pX;
78 typename TGint<T>::type* gint = nullptr;
82 const std::vector<double>& orb_cutoff_;
84
85 void cal_gint_rho(double** rho, const int& nrxx);
86 std::map<std::string, int> get_pair_info(const int i);
87
88 std::vector<ModuleBase::Vector3<T>> transition_dipole_;
89 std::vector<double> mean_squared_transition_dipole_;
90 std::vector<double> oscillator_strength_;
91 };
92}
Definition sltk_grid_driver.h:43
Definition klist.h:13
Definition lr_spectrum.h:13
void cal_transition_dipoles_velocity()
calculate the transition dipole of all states in velocity gauge
Definition lr_spectrum_velocity.cpp:98
void test_transition_dipoles_velocity_ks(const double *const ks_eig)
calculate transition dipole in velocity gauge using ks eigenvalues instead of excitation energies
Definition lr_spectrum_velocity.cpp:148
std::vector< double > oscillator_strength_
$|dipole|^2/3$, atomic unit (Hartree)
Definition lr_spectrum.h:90
std::vector< ModuleBase::Vector3< T > > transition_dipole_
$\braket{ \psi_{i} | \mathbf{r} | \psi_{a} }$
Definition lr_spectrum.h:88
const double * eig
Definition lr_spectrum.h:71
const std::vector< Parallel_2D > & pX
Definition lr_spectrum.h:75
ModuleBase::Vector3< T > cal_transition_dipole_istate_length(const int istate)
calculate the transition dipole of state S in length gauge: $\sum_{iak}X^S_{iak}<ik|r|ak>$
const TwoCenterBundle & two_center_bundle_
Definition lr_spectrum.h:83
void optical_absorption_method1(const std::vector< double > &freq, const double eta)
calculate the optical absorption spectrum with $Im[1/[(w+i\eta)^2-\Omega_S^2]]$
Definition lr_spectrum.cpp:200
const int nspin_x
1 for singlet/triplet, 2 for updown(openshell)
Definition lr_spectrum.h:62
std::vector< double > mean_squared_transition_dipole_
Definition lr_spectrum.h:89
const std::vector< int > & nocc
Definition lr_spectrum.h:64
const UnitCell & ucell
Definition lr_spectrum.h:81
const Parallel_2D & pc
Definition lr_spectrum.h:76
const double ana_thr
{abs(X) > thr} will appear in the transition analysis log
Definition lr_spectrum.h:70
std::vector< psi::Psi< T > > psi_ks
Definition lr_spectrum.h:74
std::map< std::string, int > get_pair_info(const int i)
given the index in X, return its ispin, ik, iocc, ivirt
Definition lr_spectrum.cpp:294
const K_Vectors & kv
Definition lr_spectrum.h:73
const Grid_Driver & gd_
Definition lr_spectrum.h:80
const Parallel_Orbitals & pmat
Definition lr_spectrum.h:77
ModuleBase::Vector3< T > cal_transition_dipole_istate_velocity_k(const int istate, const Velocity_op< std::complex< double > > &vR)
Definition lr_spectrum_velocity.cpp:72
const int ldim
local leading dimension of X, or the data size of each state
Definition lr_spectrum.h:68
void write_transition_dipole(const std::string &filename)
write transition dipole
Definition lr_spectrum.cpp:307
const int nk
Definition lr_spectrum.h:66
const std::vector< int > & nvirt
Definition lr_spectrum.h:65
double cal_mean_squared_dipole(ModuleBase::Vector3< T > dipole)
void cal_gint_rho(double **rho, const int &nrxx)
const std::vector< double > & orb_cutoff_
Definition lr_spectrum.h:82
void cal_transition_dipoles_length()
calculate the transition dipole of all states in length gauge
Definition lr_spectrum.cpp:173
void optical_absorption_method2(const std::vector< double > &freq, const double eta)
calculate the optical absorption spectrum with lorentzian delta function
Definition lr_spectrum_velocity.cpp:111
const T * X
Definition lr_spectrum.h:72
ModuleBase::Vector3< T > cal_transition_dipole_istate_velocity_R(const int istate, const Velocity_op< std::complex< double > > &vR)
calculate the transition dipole of state S in velocity gauge: $i(\sum_{iak}X^S_{iak}<ik|v|ak>)/\Omega...
Definition lr_spectrum_velocity.cpp:50
TGint< T >::type * gint
Definition lr_spectrum.h:78
const int nstate
Definition lr_spectrum.h:67
elecstate::DensityMatrix< T, T > cal_transition_density_matrix(const int istate, const T *X_in=nullptr, const bool need_R=true)
calculate the transition density matrix
Definition lr_spectrum.cpp:12
const ModulePW::PW_Basis & rho_basis
Definition lr_spectrum.h:79
void oscillator_strength()
$$2/3\Omega\sum_{ia\sigma} |\braket{\psi_{i}|\mathbf{r}|\psi_{a}} |^2\int \rho_{\alpha\beta}(\mathbf{...
Definition lr_spectrum.cpp:185
const int gdim
global leading dimension of X
Definition lr_spectrum.h:69
LR_Spectrum(const int &nspin_global, const int &naos, const std::vector< int > &nocc, const std::vector< int > &nvirt, typename TGint< T >::type *gint, const ModulePW::PW_Basis &rho_basis, psi::Psi< T > &psi_ks_in, const UnitCell &ucell, const K_Vectors &kv_in, const Grid_Driver &gd, const std::vector< double > &orb_cutoff, const TwoCenterBundle &two_center_bundle_, const std::vector< Parallel_2D > &pX_in, const Parallel_2D &pc_in, const Parallel_Orbitals &pmat_in, const double *eig, const T *X, const int &nstate, const bool &openshell, const std::string &gauge="length")
Definition lr_spectrum.h:15
void transition_analysis(const std::string &spintype)
print out the transition dipole moment and the main contributions to the transition amplitude
Definition lr_spectrum.cpp:236
const int naos
Definition lr_spectrum.h:63
3 elements vector
Definition vector3.h:22
A class which can convert a function of "r" to the corresponding linear superposition of plane waves ...
Definition pw_basis.h:56
This class packs the basic information of 2D-block-cyclic parallel distribution of an arbitrary matri...
Definition parallel_2d.h:12
Definition parallel_orbitals.h:9
Definition two_center_bundle.h:11
Definition unitcell.h:16
Definition velocity_op.h:15
Definition density_matrix.h:36
Definition psi.h:37
#define T
Definition exp.cpp:237
psi::Psi< T > get_psi_spin(const psi::Psi< T > &psi_in, const int &is, const int &nk)
get the Psi wrapper of the selected spin from the Psi object
Definition lr_util.hpp:100
Definition esolver_ks_lcao.h:37
Definition gint_template.h:6