1#ifndef __WRITE_VXC_LIP_H_
2#define __WRITE_VXC_LIP_H_
20 template<
typename FPTYPE>
21 inline FPTYPE
get_real(
const std::complex<FPTYPE>& c)
25 template<
typename FPTYPE>
32 std::vector<T>
cVc(
T*
const V,
T*
const c,
int nbasis,
int nbands)
34 std::vector<T> Vc(nbasis * nbands, 0.0);
37 const T alpha(1.0, 0.0);
38 const T beta(0.0, 0.0);
39 container::BlasConnector::gemm(transa, transb, nbasis, nbands, nbasis,
40 alpha, V, nbasis, c, nbasis, beta, Vc.data(), nbasis);
42 std::vector<T>
cVc(nbands * nbands, 0.0);
43 transa = ((std::is_same<T, double>::value || std::is_same<T, float>::value) ?
'T' :
'C');
44 container::BlasConnector::gemm(transa, transb, nbands, nbands, nbasis,
45 alpha, c, nbasis, Vc.data(), nbasis, beta,
cVc.data(), nbands);
49 template <
typename FPTYPE>
50 std::vector<std::complex<FPTYPE>>
psi_Hpsi(std::complex<FPTYPE>*
const psi,
51 std::complex<FPTYPE>*
const hpsi,
const int nbasis,
const int nbands)
53 using T = std::complex<FPTYPE>;
54 std::vector<T>
cVc(nbands * nbands, (
T)0.0);
55 const T alpha(1.0, 0.0);
56 const T beta(0.0, 0.0);
57 container::BlasConnector::gemm(
'C',
'N', nbands, nbands, nbasis, alpha,
58 psi, nbasis, hpsi, nbasis, beta,
cVc.data(), nbands);
62 template <
typename FPTYPE>
64 const std::vector<std::complex<FPTYPE>>& mat_mo)
69 std::vector<FPTYPE> e(nbands, 0.0);
70 for (
int i = 0; i < nbands; ++i)
72 e[i] =
get_real(mat_mo[i * nbands + i]);
77 template <
typename FPTYPE>
82 for (
int i = 0; i < nbands; ++i)
84 e +=
get_real(mat_mo[i * nbands + i]) * (FPTYPE)wg(ik, i);
89 template <
typename FPTYPE>
103 template <
typename FPTYPE>
107 const psi::Psi<std::complex<FPTYPE>>& psi_pw,
121 const Exx_Lip<std::complex<FPTYPE>>& exx_lip
125 using T = std::complex<FPTYPE>;
135 =
new elecstate::Potential(&rhod_basis, &rho_basis, &ucell, &vloc, &sf, &solvent, &etxc, &vtxc);
136 std::vector<std::string> compnents_list = {
"xc" };
143 psi::Psi<T> hpsi_localxc(psi_pw.get_nk(), psi_pw.get_nbands(), psi_pw.get_nbasis(), kv.
ngk,
true);
151 std::vector<std::vector<FPTYPE>> e_orb_locxc;
152 std::vector<std::vector<FPTYPE>> e_orb_tot;
153 std::vector<std::vector<FPTYPE>> e_orb_exx;
157 std::vector<FPTYPE> exx_energy(kv.
get_nks());
159 for (
int ik = 0; ik < kv.
get_nks(); ++ik)
164 vxcs_op_pw->init(ik);
166 hpsi_localxc.
fix_k(ik);
179 vxcs_op_pw->act(psi_pw.get_nbands(), psi_pw.get_nbasis(), psi_pw.get_npol(), &psi_pw(ik, 0, 0), &hpsi_localxc(ik, 0, 0), psi_pw.
get_ngk(ik));
181 std::vector<T> vxc_local_k_mo =
psi_Hpsi(&psi_pw(ik, 0, 0), &hpsi_localxc(ik, 0, 0), psi_pw.
get_nbasis(), psi_pw.get_nbands());
183 e_orb_locxc.emplace_back(
orbital_energy(ik, nbands, vxc_local_k_mo));
186 std::vector<T> vxc_tot_k_mo(std::move(vxc_local_k_mo));
187 std::vector<T> vexx_k_ao(naos * naos);
188#if((defined __LCAO)&&(defined __EXX) && !(defined __CUDA)&& !(defined __ROCM))
191 for (
int n = 0; n < naos; ++n)
193 for (
int m = 0; m < naos; ++m)
196 * exx_lip.get_exx_matrix()[ik][m][n];
199 std::vector<T> vexx_k_mo =
cVc(vexx_k_ao.data(), &(exx_lip.get_hvec()(ik, 0, 0)), naos, nbands);
207 container::BlasConnector::axpy(nbands * nbands, 1.0, vexx_k_mo.data(), 1, vxc_tot_k_mo.data(), 1);
213 const int istep = -1;
214 const int out_label = 1;
215 const bool out_app_flag = 0;
221 out_label,out_app_flag,gamma_only,istep);
225 out_app_flag, vxc_file,
226 p2d_serial, drank,
false);
260 const int nspin0 = (nspin == 2) ? 2 : 1;
261 auto write_orb_energy = [&kv, &nspin0, &nbands](
const std::vector<std::vector<FPTYPE>>& e_orb,
262 const std::string& label,
263 const bool app =
false) {
264 assert(e_orb.size() == kv.
get_nks());
265 const int nk = kv.
get_nks() / nspin0;
268 app ? std::ios::app : std::ios::out);
269 ofs << nk <<
"\n" << nspin0 <<
"\n" << nbands <<
"\n";
270 ofs << std::scientific << std::setprecision(16);
271 for (
int ik = 0; ik < nk; ++ik)
273 for (
int is = 0; is < nspin0; ++is)
275 for (
auto e : e_orb[is * nk + ik])
286#if((defined __LCAO)&&(defined __EXX) && !(defined __CUDA)&& !(defined __ROCM))
int get_nks() const
Definition klist.h:68
std::vector< int > ik2iktot
[nks] map ik to the global index of k points
Definition klist.h:128
std::vector< int > isk
ngk, number of plane waves for each k point
Definition klist.h:21
std::vector< int > ngk
wk, weight of k points
Definition klist.h:20
int get_nkstot() const
Definition klist.h:73
int nr
Definition matrix.h:23
int nc
Definition matrix.h:24
Special pw_basis class. It includes different k-points.
Definition pw_basis_k.h:57
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
void set_serial(const int mg, const int ng)
Definition parallel_2d.cpp:124
const Input_para & inp
Definition parameter.h:26
const System_para & globalv
Definition parameter.h:30
Definition structure_factor.h:11
Definition potential_new.h:48
ModuleBase::matrix & get_veff_smooth()
Definition potential_new.h:141
void pot_register(const std::vector< std::string > &components_list)
Definition potential_new.cpp:62
FPTYPE * get_veff_smooth_data()
void update_from_charge(const Charge *const chg, const UnitCell *const ucell)
Definition potential_new.cpp:152
Definition veff_lcao.h:20
int get_current_nbas() const
Definition psi.cpp:474
const int & get_nbasis() const
Definition psi.cpp:348
void zero_out()
Definition psi.cpp:487
const int & get_ngk(const int ik_in) const
Definition psi.cpp:480
void fix_k(const int ik) const
Definition psi.cpp:364
#define T
Definition exp.cpp:237
Exx_Info exx_info
Definition test_xc.cpp:29
int MY_RANK
global index of process
Definition global_variable.cpp:21
const double Ry_to_eV
Definition constants.h:81
void TITLE(const std::string &class_name, const std::string &function_name, const bool disable)
Definition tool_title.cpp:18
This class has two functions: restart psi from the previous calculation, and write psi to the disk.
Definition cal_dos.h:9
double get_real(const std::complex< double > &c)
Definition write_vxc.hpp:81
std::vector< double > orbital_energy(const int ik, const int nbands, const std::vector< T > &mat_mo, const Parallel_2D &p2d)
Definition write_vxc.hpp:110
std::vector< T > cVc(T *V, T *c, const int nbasis, const int nbands, const Parallel_Orbitals &pv, const Parallel_2D &p2d)
Definition write_vxc.hpp:45
void save_mat(const int istep, const T *mat, const int dim, const bool bit, const int precision, const bool tri, const bool app, const std::string &file_name, const Parallel_2D &pv, const int drank, const bool reduce=true)
save a square matrix, such as H(k) and S(k)
Definition write_HS.hpp:99
typename GetTypeReal< T >::type Real
Definition write_vxc_lip.hpp:18
std::string filename_output(const std::string &directory, const std::string &property, const std::string &basis, const int ik_local, const std::vector< int > &ik2iktot, const int nspin, const int nkstot, const int out_type, const bool out_app_flag, const bool gamma_only, const int istep)
Definition filename.cpp:8
std::vector< std::complex< FPTYPE > > psi_Hpsi(std::complex< FPTYPE > *const psi, std::complex< FPTYPE > *const hpsi, const int nbasis, const int nbands)
Definition write_vxc_lip.hpp:50
void write_Vxc(const int nspin, const int nbasis, const int drank, const Parallel_Orbitals *pv, const psi::Psi< TK > &psi, const UnitCell &ucell, Structure_Factor &sf, surchem &solvent, const ModulePW::PW_Basis &rho_basis, const ModulePW::PW_Basis &rhod_basis, const ModuleBase::matrix &vloc, const Charge &chg, Gint_Gamma &gint_gamma, Gint_k &gint_k, const K_Vectors &kv, const std::vector< double > &orb_cutoff, const ModuleBase::matrix &wg, Grid_Driver &gd)
write the Vxc matrix in KS orbital representation, usefull for GW calculation including terms: local/...
Definition write_vxc.hpp:178
double all_band_energy(const int ik, const std::vector< T > &mat_mo, const Parallel_2D &p2d, const ModuleBase::matrix &wg)
Definition write_vxc.hpp:92
void write_orb_energy(const K_Vectors &kv, const int nspin0, const int nbands, const std::vector< std::vector< double > > &e_orb, const std::string &term, const std::string &label, const bool app=false)
Definition write_vxc.hpp:151
void reduce_pool(T &object)
Definition depend_mock.cpp:15
Parameter PARAM
Definition parameter.cpp:3
base device SOURCES math_dngvd_test cpp endif() if(ENABLE_GOOGLEBENCH) AddTest(TARGET PERF_MODULE_HSOLVER_KERNELS LIBS parameter $
Definition CMakeLists.txt:10
T type
Definition macros.h:8
bool gamma_only_local
Definition system_parameter.h:38
std::string global_out_dir
global output directory
Definition system_parameter.h:42