46double occNum_func(
double eta,
int symbol = 0,
const std::string XC_func_rdmft =
"hf",
const double alpha_power = 1.0);
52 TK* pwfc = &wfc(0, 0, 0);
53 for(
int i=0; i<wfc.
size(); ++i) { pwfc[i] = std::conj( pwfc[i] );
68 const int one_int = 1;
70 const std::complex<double> one_complex = {1.0, 0.0};
71 const std::complex<double> zero_complex = {0.0, 0.0};
72 const char N_char =
'N';
73 const char C_char =
'C';
76 const int nbasis = ParaV->
desc[2];
77 const int nbands = ParaV->
desc_wfc[3];
80 pzgemm_( &C_char, &N_char, &nbasis, &nbands, &nbasis, &one_complex, &HK, &one_int, &one_int, ParaV->
desc,
81 &wfc, &one_int, &one_int, ParaV->
desc_wfc, &zero_complex, &H_wfc, &one_int, &one_int, ParaV->
desc_wfc );
94 const int one_int = 1;
95 const std::complex<double> one_complex = {1.0, 0.0};
96 const std::complex<double> zero_complex = {0.0, 0.0};
97 const char N_char =
'N';
98 const char C_char =
'C';
104 const int nbasis = ParaV->
desc[2];
105 const int nbands = ParaV->
desc_wfc[3];
107 pzgemm_( &C_char, &N_char, &nbands, &nbands, &nbasis, &one_complex, &wfc, &one_int, &one_int, ParaV->
desc_wfc,
108 &H_wfc, &one_int, &one_int, ParaV->
desc_wfc, &zero_complex, &Dmn[0], &one_int, &one_int, para_Eij_in.
desc );
115 const double& wfc,
const double& H_wfc, std::vector<double>& Dmn);
119template <
typename TK>
125 for(
int i=0; i<nrow_bands; ++i)
128 for(
int j=0; j<ncol_bands; ++j)
131 if(i_global==j_global)
134 wfcHwfc[j_global] = std::real( Dmn[i+j*nrow_bands] );
142template <
typename TK>
144 const std::string XC_func_rdmft =
"hf",
const double alpha = 1.0)
146 const int nk_local = wfc.
get_nk();
153 for (
int ik = 0; ik < nk_local; ++ik)
155 for (
int ib_local = 0; ib_local < nbands_local; ++ib_local)
158 TK* wfc_pointer = &(wfc(ik, ib_local, 0));
166template <
typename TK>
175 const std::string XC_func_rdmft =
"hf",
176 const double alpha = 1.0)
178 const int nk = psi_TV.
get_nk();
184 occNum_MulPsi(ParaV, occ_number, psi_exx_XC, 2, XC_func_rdmft, alpha);
189 for(
int ik=0; ik<nk; ++ik)
191 for(
int inbn=0; inbn<nbn_local; ++inbn)
193 TK* p_occNum_Hpsi = &( occNum_Hpsi(ik, inbn, 0) );
194 for(
int inbs=0; inbs<nbs_local; ++inbs)
196 p_occNum_Hpsi[inbs] = psi_TV(ik, inbn, inbs) + psi_hartree(ik, inbn, inbs) + psi_dft_XC(ik, inbn, inbs) + psi_exx_XC(ik, inbn, inbs);
215 const std::string XC_func_rdmft =
"hf",
216 const double alpha = 1.0);
230 const std::string XC_func_rdmft =
"hf",
231 const double alpha = 1.0);
241 const std::string XC_func_rdmft,
254template <
typename TK,
typename TR>
266 const std::vector<double>& orb_cutoff,
273 const std::string potential_in,
274 double* etxc_in =
nullptr,
275 double* vtxc_in =
nullptr)
static void scal(const int n, const float alpha, float *X, const int incX, base_device::AbacusDevice_t device_type=base_device::AbacusDevice_t::CpuDevice)
Definition blas_connector_vector.cpp:80
Definition sltk_grid_driver.h:43
std::vector< double > wk
Direct coordinates of k points.
Definition klist.h:18
Definition complexmatrix.h:14
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
int local2global_col(const int ilc) const
get the global index of a local index (col)
Definition parallel_2d.h:63
int get_row_size() const
number of local rows
Definition parallel_2d.h:21
int local2global_row(const int ilr) const
get the global index of a local index (row)
Definition parallel_2d.h:57
int desc[9]
ScaLAPACK descriptor.
Definition parallel_2d.h:103
int get_col_size() const
number of local columns
Definition parallel_2d.h:27
Definition parallel_orbitals.h:9
int desc_wfc[9]
Definition parallel_orbitals.h:37
Definition potential_new.h:49
Definition hcontainer.h:144
Definition hs_matrix_k.hpp:11
Definition operator_lcao.h:12
OperatorLCAO(HS_Matrix_K< TK > *hsk_in, const std::vector< ModuleBase::Vector3< double > > &kvec_d_in, HContainer< TR > *hR_in)
H(R) matrix, R is the Bravis lattice vector.
Definition operator_lcao.h:15
enum calculation_type cal_type
Definition operator.h:107
const int & get_nbands() const
Definition psi.cpp:341
const int & get_nk() const
Definition psi.cpp:335
size_t size() const
Definition psi.cpp:353
const int & get_nbasis() const
Definition psi.cpp:347
this part of the code is copying from class Veff and do some modifications.
Definition rdmft_tools.h:256
double * etxc
Definition rdmft_tools.h:329
double * vtxc
Definition rdmft_tools.h:331
std::string potential_
Definition rdmft_tools.h:321
const ModuleBase::ComplexMatrix * sf_
Definition rdmft_tools.h:327
const Grid_Driver * gd
Definition rdmft_tools.h:297
elecstate::Potential * pot
Definition rdmft_tools.h:305
Veff_rdmft(hamilt::HS_Matrix_K< TK > *hsk_in, const std::vector< ModuleBase::Vector3< double > > &kvec_d_in, elecstate::Potential *pot_in, hamilt::HContainer< TR > *hR_in, const UnitCell *ucell_in, const std::vector< double > &orb_cutoff, const Grid_Driver *GridD_in, const int &nspin, const Charge *charge_in, const ModulePW::PW_Basis *rho_basis_in, const ModuleBase::matrix *vloc_in, const ModuleBase::ComplexMatrix *sf_in, const std::string potential_in, double *etxc_in=nullptr, double *vtxc_in=nullptr)
Construct a new Veff object for multi-kpoint calculation.
Definition rdmft_tools.h:261
int current_spin
Definition rdmft_tools.h:308
virtual void contributeHR() override
contributeHR() is used to calculate the HR matrix <phi_{\mu, 0}|V_{eff}|phi_{\nu, R}> the contributio...
const ModulePW::PW_Basis * rho_basis_
Definition rdmft_tools.h:323
const UnitCell * ucell
Definition rdmft_tools.h:295
const Charge * charge_
Definition rdmft_tools.h:319
int nspin
Definition rdmft_tools.h:307
void initialize_HR(const UnitCell *ucell_in, const Grid_Driver *GridD_in)
initialize HR, search the nearest neighbor atoms HContainer is used to store the electronic kinetic m...
Definition rdmft_tools.cpp:199
const ModuleBase::matrix * vloc_
Definition rdmft_tools.h:325
std::vector< double > orb_cutoff_
Definition rdmft_tools.h:301
Reduced Density Matrix Functional Theory (RDMFT)
Definition rdmft.cpp:24
void cal_bra_op_ket< double >(const Parallel_Orbitals *ParaV, const Parallel_2D ¶_Eij_in, const double &wfc, const double &H_wfc, std::vector< double > &Dmn)
Definition rdmft_tools.cpp:55
void HkPsi< double >(const Parallel_Orbitals *ParaV, const double &HK, const double &wfc, double &H_wfc)
Definition rdmft_tools.cpp:31
void occNum_Mul_wfcHwfc(const ModuleBase::matrix &occ_number, const ModuleBase::matrix &wfcHwfc, ModuleBase::matrix &occNum_wfcHwfc, int symbol, const std::string XC_func_rdmft, const double alpha)
occNum_wfcHwfc = occNum*wfcHwfc + occNum_wfcHwfc
Definition rdmft_tools.cpp:82
void add_occNum(const K_Vectors &kv, const ModuleBase::matrix &occ_number, const ModuleBase::matrix &wfcHwfc_TV_in, const ModuleBase::matrix &wfcHwfc_hartree_in, const ModuleBase::matrix &wfcHwfc_dft_XC_in, const ModuleBase::matrix &wfcHwfc_exx_XC_in, ModuleBase::matrix &occNum_wfcHwfc, const std::string XC_func_rdmft, const double alpha)
Default symbol = 0 for the gradient of Etotal with respect to occupancy, symbol = 1 for the relevant ...
Definition rdmft_tools.cpp:100
void conj_psi< double >(psi::Psi< double > &wfc)
Definition rdmft_tools.cpp:28
void cal_bra_op_ket(const Parallel_Orbitals *ParaV, const Parallel_2D ¶_Eij_in, const TK &wfc, const TK &H_wfc, std::vector< TK > &Dmn)
implement matrix multiplication of sum_mu conj(wfc(ik, m ,mu)) * op_wfc(ik, n, mu)
Definition rdmft_tools.h:92
double getEnergy(const ModuleBase::matrix &occNum_wfcHwfc)
give certain occNum_wfcHwfc, get the corresponding energy
Definition rdmft_tools.cpp:146
void HkPsi(const Parallel_Orbitals *ParaV, const TK &HK, const TK &wfc, TK &H_wfc)
implement matrix multiplication of Hk^dagger and psi
Definition rdmft_tools.h:65
void add_psi(const Parallel_Orbitals *ParaV, const K_Vectors *kv, const ModuleBase::matrix &occ_number, psi::Psi< TK > &psi_TV, psi::Psi< TK > &psi_hartree, psi::Psi< TK > &psi_dft_XC, psi::Psi< TK > &psi_exx_XC, psi::Psi< TK > &occNum_Hpsi, const std::string XC_func_rdmft="hf", const double alpha=1.0)
add psi with eta and g(eta)
Definition rdmft_tools.h:167
void _diagonal_in_serial(const Parallel_2D ¶_Eij_in, const std::vector< TK > &Dmn, double *wfcHwfc)
for Dmn that conforms to the 2d-block rule, get its diagonal elements
Definition rdmft_tools.h:120
double occNum_func(const double eta, const int symbol, const std::string XC_func_rdmft, double alpha)
now support XC_func_rdmft = "hf", "muller", "power", "pbe", "pbe0". "wp22" and "cwp22" is realizing.
Definition rdmft_tools.cpp:163
void occNum_MulPsi(const Parallel_Orbitals *ParaV, const ModuleBase::matrix &occ_number, psi::Psi< TK > &wfc, int symbol=0, const std::string XC_func_rdmft="hf", const double alpha=1.0)
realize occNum_wfc = occNum * wfc. Calling this function and we can get wfc = occNum*wfc.
Definition rdmft_tools.h:143
void add_wfcHwfc(const ModuleBase::matrix &wg, const ModuleBase::matrix &wk_fun_occNum, const ModuleBase::matrix &wfcHwfc_TV_in, const ModuleBase::matrix &wfcHwfc_hartree_in, const ModuleBase::matrix &wfcHwfc_XC_in, ModuleBase::matrix &occNum_wfcHwfc, const std::string XC_func_rdmft, const double alpha)
do wk*g(occNum)*wfcHwfc and add for TV, hartree, XC. This function just use once, so it can be replac...
Definition rdmft_tools.cpp:129
void conj_psi(psi::Psi< TK > &wfc)
Definition rdmft_tools.h:50
void pzgemm_(const char *transa, const char *transb, const int *M, const int *N, const int *K, const std::complex< double > *alpha, const std::complex< double > *A, const int *IA, const int *JA, const int *DESCA, const std::complex< double > *B, const int *IB, const int *JB, const int *DESCB, const std::complex< double > *beta, std::complex< double > *C, const int *IC, const int *JC, const int *DESCC)