Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions source/source_esolver/esolver_ks_lcao.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -370,7 +370,7 @@ void ESolver_KS_LCAO<TK, TR>::iter_init(UnitCell& ucell, const int istep, const
}
#endif

init_dftu_lcao<TK>(istep, iter, PARAM.inp, &(this->dftu), this->dmat.dm, ucell, this->chr.rho, this->pw_rho->nrxx);
init_dftu_lcao<TK>(istep, iter, PARAM.inp.dft_plus_u, &(this->dftu), this->dmat.dm, ucell, this->chr.rho, this->pw_rho->nrxx);

#ifdef __MLALGO
// the density matrixes of DeePKS have been updated in each iter
Expand Down Expand Up @@ -481,7 +481,7 @@ void ESolver_KS_LCAO<TK, TR>::iter_finish(UnitCell& ucell, const int istep, int&
const std::vector<std::vector<TK>>& dm_vec = this->dmat.dm->get_DMK_vector();

// 1) calculate the local occupation number matrix and energy correction in DFT+U
finish_dftu_lcao<TK>(iter, conv_esolver, PARAM.inp, &(this->dftu), ucell, dm_vec, this->kv, this->p_chgmix->get_mixing_beta(), hamilt_lcao);
finish_dftu_lcao<TK>(iter, conv_esolver, PARAM.inp.dft_plus_u, PARAM.inp.out_chg[0], &(this->dftu), ucell, dm_vec, this->kv, this->p_chgmix->get_mixing_beta(), hamilt_lcao, PARAM.globalv.global_out_dir, PARAM.inp.nspin, PARAM.globalv.npol);

// 2) for deepks, calculate delta_e, output labels during electronic steps
this->deepks.delta_e(ucell, this->kv, this->orb_, this->pv, this->gd, dm_vec, this->pelec->f_en, PARAM.inp);
Expand Down
39 changes: 26 additions & 13 deletions source/source_lcao/dftu_lcao.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ namespace ModuleESolver
template <typename TK>
void init_dftu_lcao(const int istep,
const int iter,
const Input_para& inp,
int dft_plus_u,
void* dftu,
void* dm,
const UnitCell& ucell,
double** rho,
const int nrxx)
{
if (!inp.dft_plus_u)
if (!dft_plus_u)
{
return;
}
Expand All @@ -36,15 +36,19 @@ void init_dftu_lcao(const int istep,
template <typename TK>
void finish_dftu_lcao(const int iter,
const bool conv_esolver,
const Input_para& inp,
int dft_plus_u,
bool out_chg,
void* dftu,
const UnitCell& ucell,
const std::vector<std::vector<TK>>& dm_vec,
const K_Vectors& kv,
const double mixing_beta,
void* hamilt_lcao)
void* hamilt_lcao,
const std::string& global_out_dir,
int nspin,
int npol)
{
if (!inp.dft_plus_u)
if (!dft_plus_u)
{
return;
}
Expand All @@ -54,7 +58,7 @@ void finish_dftu_lcao(const int iter,

/// old DFT+U method calculates energy correction in esolver,
/// new DFT+U method calculates energy in Hamiltonian
if (inp.dft_plus_u == 2)
if (dft_plus_u == 2)
{
if (dftu_ptr->omc != 2)
{
Expand All @@ -63,7 +67,7 @@ void finish_dftu_lcao(const int iter,
}
dftu_ptr->cal_energy_correction(ucell, iter);
}
dftu_ptr->output(ucell);
dftu_ptr->output(ucell, out_chg, global_out_dir, nspin, npol);

/// use the converged occupation matrix for next MD/Relax SCF calculation
if (conv_esolver)
Expand All @@ -75,15 +79,16 @@ void finish_dftu_lcao(const int iter,
/// Template instantiation
template void init_dftu_lcao<double>(const int istep,
const int iter,
const Input_para& inp,
int dft_plus_u,
void* dftu,
void* dm,
const UnitCell& ucell,
double** rho,
const int nrxx);

template void init_dftu_lcao<std::complex<double>>(const int istep,
const int iter,
const Input_para& inp,
int dft_plus_u,
void* dftu,
void* dm,
const UnitCell& ucell,
Expand All @@ -92,21 +97,29 @@ template void init_dftu_lcao<std::complex<double>>(const int istep,

template void finish_dftu_lcao<double>(const int iter,
const bool conv_esolver,
const Input_para& inp,
int dft_plus_u,
bool out_chg,
void* dftu,
const UnitCell& ucell,
const std::vector<std::vector<double>>& dm_vec,
const K_Vectors& kv,
const double mixing_beta,
void* hamilt_lcao);
void* hamilt_lcao,
const std::string& global_out_dir,
int nspin,
int npol);
template void finish_dftu_lcao<std::complex<double>>(const int iter,
const bool conv_esolver,
const Input_para& inp,
int dft_plus_u,
bool out_chg,
void* dftu,
const UnitCell& ucell,
const std::vector<std::vector<std::complex<double>>>& dm_vec,
const K_Vectors& kv,
const double mixing_beta,
void* hamilt_lcao);
void* hamilt_lcao,
const std::string& global_out_dir,
int nspin,
int npol);

} // namespace ModuleESolver
14 changes: 9 additions & 5 deletions source/source_lcao/dftu_lcao.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

#include "source_cell/unitcell.h"
#include "source_cell/klist.h"
#include "source_io/module_parameter/input_parameter.h"

namespace ModuleESolver
{
Expand All @@ -26,7 +25,7 @@ namespace ModuleESolver
template <typename TK>
void init_dftu_lcao(const int istep,
const int iter,
const Input_para& inp,
int dft_plus_u,
void* dftu,
void* dm,
const UnitCell& ucell,
Expand All @@ -41,7 +40,8 @@ void init_dftu_lcao(const int istep,
*
* @param iter Current SCF iteration
* @param conv_esolver Whether ESolver has converged
* @param inp Input parameters
* @param dft_plus_u DFT+U mode (0=disabled, 1=old, 2=new)
* @param out_chg Whether to output onsite.dm
* @param dftu DFT+U object
* @param ucell Unit cell
* @param dm_vec Density matrix vector
Expand All @@ -52,13 +52,17 @@ void init_dftu_lcao(const int istep,
template <typename TK>
void finish_dftu_lcao(const int iter,
const bool conv_esolver,
const Input_para& inp,
int dft_plus_u,
bool out_chg,
void* dftu,
const UnitCell& ucell,
const std::vector<std::vector<TK>>& dm_vec,
const K_Vectors& kv,
const double mixing_beta,
void* hamilt_lcao);
void* hamilt_lcao,
const std::string& global_out_dir,
int nspin,
int npol);

} // namespace ModuleESolver

Expand Down
8 changes: 4 additions & 4 deletions source/source_lcao/module_dftu/dftu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -238,9 +238,9 @@ void Plus_U::init(UnitCell& cell, // unitcell class
{
std::stringstream sst;
sst << "initial_onsite.dm";
this->read_occup_m(cell,sst.str());
this->read_occup_m(cell, sst.str(), PARAM.inp.init_chg, PARAM.inp.nspin, PARAM.globalv.npol);
#ifdef __MPI
this->local_occup_bcast(cell);
this->local_occup_bcast(cell, PARAM.inp.nspin, PARAM.globalv.npol);
#endif

mark_locale_initialized();
Expand All @@ -252,9 +252,9 @@ void Plus_U::init(UnitCell& cell, // unitcell class
{
std::stringstream sst;
sst << PARAM.globalv.global_readin_dir << "onsite.dm";
this->read_occup_m(cell,sst.str());
this->read_occup_m(cell, sst.str(), PARAM.inp.init_chg, PARAM.inp.nspin, PARAM.globalv.npol);
#ifdef __MPI
this->local_occup_bcast(cell);
this->local_occup_bcast(cell, PARAM.inp.nspin, PARAM.globalv.npol);
#endif
mark_locale_initialized();
}
Expand Down
21 changes: 16 additions & 5 deletions source/source_lcao/module_dftu/dftu.h
Original file line number Diff line number Diff line change
Expand Up @@ -369,15 +369,26 @@ class Plus_U
// For reading/writing/broadcasting/copying relevant data structures
//=============================================================
public:
void output(const UnitCell& ucell);
void output(const UnitCell& ucell,
bool out_chg,
const std::string& global_out_dir,
int nspin,
int npol);

private:
void write_occup_m(const UnitCell& ucell,
std::ofstream& ofs,
bool diag=false);
std::ofstream& ofs,
bool diag,
int nspin,
int npol);
void read_occup_m(const UnitCell& ucell,
const std::string& fn);
void local_occup_bcast(const UnitCell& ucell);
const std::string& fn,
const std::string& init_chg,
int nspin,
int npol);
void local_occup_bcast(const UnitCell& ucell,
int nspin,
int npol);

//=============================================================
// In dftu_yukawa.cpp
Expand Down
Loading
Loading