Skip to content

Commit 40da285

Browse files
committed
Fix: fix nk_total in class RDMFT depend on the Symmetry::symm_flag
1 parent 17faaa5 commit 40da285

File tree

9 files changed

+61
-54
lines changed

9 files changed

+61
-54
lines changed

source/module_esolver/esolver_ks.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -401,10 +401,10 @@ namespace ModuleESolver
401401
}
402402

403403
// do rdmft calculation
404-
ModuleBase::matrix E_gradient_wg(this->pelec->wg.nr, this->pelec->wg.nc, true);
404+
ModuleBase::matrix E_gradient_occNum(this->pelec->wg.nr, this->pelec->wg.nc, true);
405405
psi::Psi<T> E_gradient_wfc(this->psi->get_nk(), this->psi->get_nbands(), this->psi->get_nbasis());
406-
double Etotal = this->Run_rdmft(E_gradient_wg, E_gradient_wfc); // add by jghan 2024-03-16
407-
406+
double Etotal = this->Run_rdmft(E_gradient_occNum, E_gradient_wfc); // add by jghan 2024-03-16
407+
408408
// continue;
409409
}
410410
ModuleBase::timer::tick("RDMFT", "E & Egradient");

source/module_esolver/esolver_ks.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ namespace ModuleESolver
5151
// get current step of Ionic simulation
5252
virtual int getniter() override;
5353

54-
virtual double Run_rdmft(ModuleBase::matrix& E_gradient_wg, psi::Psi<T>& E_gradient_wfc) { return 0.0; }; // add by jghan, 2024-03-16
54+
virtual double Run_rdmft(ModuleBase::matrix& E_gradient_occNum, psi::Psi<T>& E_gradient_wfc) { return 0.0; }; // add by jghan, 2024-03-16
5555
virtual void update_elec_rdmft(const ModuleBase::matrix& occ_number_in, const psi::Psi<T>& wfc_in) {};
5656

5757
protected:

source/module_esolver/esolver_ks_lcao.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -939,7 +939,7 @@ namespace ModuleESolver
939939

940940

941941
//initialize the gradients of Etotal on wg and wfc, and set all elements to 0.
942-
ModuleBase::matrix E_gradient_wg(this->pelec->wg.nr, this->pelec->wg.nc, true);
942+
ModuleBase::matrix E_gradient_occNum(this->pelec->wg.nr, this->pelec->wg.nc, true);
943943
psi::Psi<TK> E_gradient_wfc(this->psi->get_nk(), this->psi->get_nbands(), this->psi->get_nbasis());
944944
E_gradient_wfc.zero_out();
945945
double Etotal_RDMFT = 0.0;
@@ -976,7 +976,7 @@ namespace ModuleESolver
976976
LM.ParaV,
977977
occ_number,
978978
wfc_rdmft,
979-
E_gradient_wg,
979+
E_gradient_occNum,
980980
E_gradient_wfc,
981981
this->kv,
982982
this->UHM.GG,
@@ -997,7 +997,7 @@ namespace ModuleESolver
997997
LM.ParaV,
998998
occ_number,
999999
*(this->psi),
1000-
E_gradient_wg,
1000+
E_gradient_occNum,
10011001
E_gradient_wfc,
10021002
this->kv,
10031003
this->UHM.GK,
@@ -1016,7 +1016,7 @@ namespace ModuleESolver
10161016

10171017
// // test class rdmft
10181018
// rdmft_solver.update_elec(occ_number, *(this->psi));
1019-
// this->Run_rdmft(E_gradient_wg, E_gradient_wfc);
1019+
// this->Run_rdmft(E_gradient_occNum, E_gradient_wfc);
10201020
// std::cout << "\nrdmft_solver: " << "0.0000" << std::endl;
10211021

10221022
// ModuleBase::timer::tick("RDMFT", "E & Egradient");
@@ -1135,9 +1135,9 @@ namespace ModuleESolver
11351135

11361136

11371137
template <typename TK, typename TR>
1138-
double ESolver_KS_LCAO<TK, TR>::Run_rdmft(ModuleBase::matrix& E_gradient_wg, psi::Psi<TK>& E_gradient_wfc)
1138+
double ESolver_KS_LCAO<TK, TR>::Run_rdmft(ModuleBase::matrix& E_gradient_occNum, psi::Psi<TK>& E_gradient_wfc)
11391139
{
1140-
return rdmft_solver.Run(E_gradient_wg, E_gradient_wfc);
1140+
return rdmft_solver.Run(E_gradient_occNum, E_gradient_wfc);
11411141
}
11421142

11431143

source/module_esolver/esolver_ks_lcao.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ namespace ModuleESolver
4141
void nscf() override;
4242
void get_S();
4343

44-
virtual double Run_rdmft(ModuleBase::matrix& E_gradient_wg, psi::Psi<TK>& E_gradient_wfc) override; // add by jghan for rdmft calculation, 2024-03-16
44+
virtual double Run_rdmft(ModuleBase::matrix& E_gradient_occNum, psi::Psi<TK>& E_gradient_wfc) override; // add by jghan for rdmft calculation, 2024-03-16
4545
virtual void update_elec_rdmft(const ModuleBase::matrix& occ_number_in, const psi::Psi<TK>& wfc_in) override;
4646

4747
protected:

source/module_rdmft/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
add_library(
22
rdmft
33
OBJECT
4-
rdmft_test.cpp
54
rdmft.cpp
65
rdmft_tools.cpp
6+
rdmft_test.cpp
77
)
88

99
# add_library(

source/module_rdmft/rdmft.cpp

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
#include "module_hamilt_lcao/hamilt_lcaodft/LCAO_matrix.h"
1515
#include "module_elecstate/module_dm/cal_dm_psi.h"
16+
#include "module_cell/module_symmetry/symmetry.h"
1617

1718
#include <iostream>
1819
#include <cmath>
@@ -79,10 +80,12 @@ void RDMFT<TK, TR>::init(Gint_Gamma& GG_in, Gint_k& GK_in, Parallel_Orbitals& Pa
7980
ucell = &ucell_in;
8081
kv = &kv_in;
8182
charge = &charge_in;
82-
nk_total = kv->nkstot_full;
8383
XC_func_rdmft = XC_func_rdmft_in;
8484
alpha_power = alpha_power_in;
8585

86+
if (ModuleSymmetry::Symmetry::symm_flag == -1) nk_total = kv->nkstot_full;
87+
else nk_total = kv->nks;
88+
8689
// XC_func_rdmft = "power"; // just for test
8790

8891
// create desc[] and something about MPI to Eij(nbands*nbands)
@@ -175,11 +178,15 @@ void RDMFT<TK, TR>::update_elec(const ModuleBase::matrix& occ_number_in, const p
175178
}
176179
}
177180

181+
std::cout << "\nrdmft_solver: " << "0.1" << std::endl;
182+
178183
// update wfc
179184
TK* pwfc_in = &wfc_in(0, 0, 0);
180185
TK* pwfc = &wfc(0, 0, 0);
181186
for(int i=0; i<wfc.size(); ++i) pwfc[i] = pwfc_in[i];
182187

188+
std::cout << "\nrdmft_solver: " << "0.2" << std::endl;
189+
183190
// update charge
184191
if( GlobalV::GAMMA_ONLY_LOCAL )
185192
{
@@ -206,22 +213,35 @@ void RDMFT<TK, TR>::update_elec(const ModuleBase::matrix& occ_number_in, const p
206213
{
207214
// calculate DMK and DMR
208215
elecstate::DensityMatrix<TK, double> DM(kv, ParaV, GlobalV::NSPIN);
216+
std::cout << "\nrdmft_solver: " << "0.21" << std::endl;
217+
std::cout << "\nwfc.get_nk(): " << wfc.get_nk() << std::endl;
218+
std::cout << "\nkv->nks: " << kv->nks << std::endl;
219+
std::cout << "\nwg.nr: " << wg.nr << std::endl;
209220
elecstate::cal_dm_psi(ParaV, wg, wfc, DM);
221+
std::cout << "\nrdmft_solver: " << "0.22" << std::endl;
210222
DM.init_DMR(&GlobalC::GridD, &GlobalC::ucell);
223+
std::cout << "\nrdmft_solver: " << "0.23" << std::endl;
211224
DM.cal_DMR();
212225

226+
std::cout << "\nrdmft_solver: " << "0.3" << std::endl;
227+
213228
// this code is copying from function ElecStateLCAO<TK>::psiToRho(), in elecstate_lcao.cpp
214229
for (int is = 0; is < GlobalV::NSPIN; is++)
215230
{
216231
ModuleBase::GlobalFunc::ZEROS(charge->rho[is], charge->nrxx);
217232
}
218233

234+
std::cout << "\nrdmft_solver: " << "0.4" << std::endl;
235+
219236
GK->transfer_DM2DtoGrid(DM.get_DMR_vector());
237+
std::cout << "\nrdmft_solver: " << "0.5" << std::endl;
220238
//double** invaild_ptr = nullptr; // use invaild_ptr replace loc.DM_R in the future
221239
Gint_inout inout(loc->DM_R, charge->rho, Gint_Tools::job_type::rho); // what is Local_Orbital_Charge& loc_in? ///////////////
240+
std::cout << "\nrdmft_solver: " << "0.6" << std::endl;
222241
GK->cal_gint(&inout);
223-
242+
std::cout << "\nrdmft_solver: " << "0.7" << std::endl;
224243
charge->renormalize_rho();
244+
std::cout << "\nrdmft_solver: " << "0.8" << std::endl;
225245
}
226246
}
227247

@@ -465,7 +485,8 @@ double RDMFT<TK, TR>::cal_rdmft()
465485
add_occNum(occ_number, wfcHwfc_TV, wfcHwfc_hartree, wfcHwfc_XC, occNum_wfcHamiltWfc, XC_func_rdmft, alpha_power);
466486

467487
// get the total energy
468-
add_wfcHwfc(kv->wk, occ_number, wfcHwfc_TV, wfcHwfc_hartree, wfcHwfc_XC, Etotal_n_k, XC_func_rdmft, alpha_power);
488+
// add_wfcHwfc(kv->wk, occ_number, wfcHwfc_TV, wfcHwfc_hartree, wfcHwfc_XC, Etotal_n_k, XC_func_rdmft, alpha_power);
489+
add_wfcHwfc(wg, wk_fun_occNum, wfcHwfc_TV, wfcHwfc_hartree, wfcHwfc_XC, Etotal_n_k, XC_func_rdmft, alpha_power);
469490

470491
E_RDMFT[3] = getEnergy(Etotal_n_k);
471492
Parallel_Reduce::reduce_all(E_RDMFT[3]);
@@ -511,19 +532,29 @@ void RDMFT<TK, TR>::cal_Energy()
511532

512533

513534
template <typename TK, typename TR>
514-
double RDMFT<TK, TR>::Run(ModuleBase::matrix& E_gradient_wg, psi::Psi<TK>& E_gradient_wfc)
535+
double RDMFT<TK, TR>::Run(ModuleBase::matrix& E_gradient_occNum, psi::Psi<TK>& E_gradient_wfc)
515536
{
516537
this->get_V_hartree();
517538
this->get_V_XC();
518539
this->cal_rdmft();
519540
this->cal_Energy();
520541

521-
E_gradient_wg = (occNum_wfcHamiltWfc);
542+
E_gradient_occNum = (occNum_wfcHamiltWfc);
522543

523544
TK* pwfc = &occNum_HamiltWfc(0, 0, 0);
524545
TK* pwfc_out = &E_gradient_wfc(0, 0, 0);
525546
for(int i=0; i<wfc.size(); ++i) pwfc_out[i] = pwfc[i];
526547

548+
// test
549+
rdmft::printMatrix_pointer(E_gradient_occNum.nr, E_gradient_occNum.nc, &E_gradient_occNum(0, 0), "E_gradient_occNum");
550+
rdmft::printMatrix_pointer(occ_number.nr, occ_number.nc, &occ_number(0, 0), "occ_number");
551+
rdmft::printMatrix_pointer(wfcHwfc_TV.nr, wfcHwfc_TV.nc, &wfcHwfc_TV(0, 0), "wfcHwfc_TV");
552+
rdmft::printMatrix_pointer(wfcHwfc_hartree.nr, wfcHwfc_hartree.nc, &wfcHwfc_hartree(0, 0), "wfcHwfc_hartree");
553+
rdmft::printMatrix_pointer(wfcHwfc_XC.nr, wfcHwfc_XC.nc, &wfcHwfc_XC(0, 0), "wfcHwfc_XC");
554+
rdmft::printMatrix_pointer(E_gradient_wfc.get_nbands(), E_gradient_wfc.get_nbasis(), &E_gradient_wfc(0, 0, 0), "E_gradient_wfc(ik=0)");
555+
rdmft::printMatrix_pointer(E_gradient_wfc.get_nbands(), E_gradient_wfc.get_nbasis(), &E_gradient_wfc(2, 0, 0), "E_gradient_wfc(ik=2)");
556+
// test
557+
527558
return E_RDMFT[3];
528559
}
529560

source/module_rdmft/rdmft.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ class RDMFT
156156
void update_elec(const ModuleBase::matrix& occ_number_in, const psi::Psi<TK>& wfc_in);
157157

158158
// do all calculation after update occNum&wfc, get Etotal and the gradient of energy with respect to the occNum&wfc
159-
double Run(ModuleBase::matrix& E_gradient_wg, psi::Psi<TK>&E_gradient_wfc);
159+
double Run(ModuleBase::matrix& E_gradient_occNum, psi::Psi<TK>&E_gradient_wfc);
160160

161161

162162

source/module_rdmft/rdmft_tools.cpp

Lines changed: 7 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -117,47 +117,21 @@ void occNum_Mul_wfcHwfc(const ModuleBase::matrix& occ_number, const ModuleBase::
117117
}
118118

119119

120-
// Default symbol = 0 for the gradient of Etotal with respect to occupation numbers
121-
// symbol = 1 for the relevant calculation of Etotal
120+
// for the gradient of Etotal with respect to occupation numbers
122121
void add_occNum(const ModuleBase::matrix& occ_number, const ModuleBase::matrix& wfcHwfc_TV_in, const ModuleBase::matrix& wfcHwfc_hartree_in,
123-
const ModuleBase::matrix& wfcHwfc_XC_in, ModuleBase::matrix& occNum_wfcHwfc, const std::string XC_func_rdmft, const double alpha, int symbol)
124-
{
125-
122+
const ModuleBase::matrix& wfcHwfc_XC_in, ModuleBase::matrix& occNum_wfcHwfc, const std::string XC_func_rdmft, const double alpha)
123+
{
126124
occNum_wfcHwfc.zero_out();
127-
128-
if( symbol==0 )
129-
{
130-
occNum_Mul_wfcHwfc(occ_number, wfcHwfc_XC_in, occNum_wfcHwfc, 4, XC_func_rdmft, alpha);
131-
occNum_wfcHwfc+=(wfcHwfc_TV_in);
132-
occNum_wfcHwfc+=(wfcHwfc_hartree_in);
133-
}
134-
// else if( symbol==1 )
135-
// {
136-
// occNum_Mul_wfcHwfc(wg, wfcHwfc_TV_in, occNum_wfcHwfc);
137-
// occNum_Mul_wfcHwfc(wg, wfcHwfc_hartree_in, occNum_wfcHwfc, 1);
138-
// occNum_Mul_wfcHwfc(wg, wfcHwfc_XC_in, occNum_wfcHwfc, 3, XC_func_rdmft, alpha);
139-
// }
140-
else std::cout << "\n\n\n!!!!!!\nthere are something wrong when calling rdmft_test() and calculation add_occNum()\n!!!!!!\n\n\n";
125+
occNum_Mul_wfcHwfc(occ_number, wfcHwfc_XC_in, occNum_wfcHwfc, 4, XC_func_rdmft, alpha);
126+
occNum_wfcHwfc+=(wfcHwfc_TV_in);
127+
occNum_wfcHwfc+=(wfcHwfc_hartree_in);
141128
}
142129

143130

144131
// do wk*g(occNum)*wfcHwfc and add for TV, hartree, XC. This function just use once, so it can be replace and delete
145-
void add_wfcHwfc(const std::vector<double>& wk_in, const ModuleBase::matrix& occ_number, const ModuleBase::matrix& wfcHwfc_TV_in, const ModuleBase::matrix& wfcHwfc_hartree_in,
132+
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,
146133
const ModuleBase::matrix& wfcHwfc_XC_in, ModuleBase::matrix& occNum_wfcHwfc, const std::string XC_func_rdmft, const double alpha)
147134
{
148-
/****** delete when function rdmft_cal() -> class RDMFT ******/
149-
ModuleBase::matrix wg(occ_number);
150-
for(int ik=0; ik < wg.nr; ++ik)
151-
{
152-
for(int inb=0; inb < wg.nc; ++inb) wg(ik, inb) *= wk_in[ik];
153-
}
154-
ModuleBase::matrix wk_fun_occNum(occ_number.nr, occ_number.nc, true);
155-
for(int ik=0; ik<wg.nr; ++ik)
156-
{
157-
for(int inb=0; inb<wg.nc; ++inb) wk_fun_occNum(ik, inb) = wk_in[ik] * occNum_func(occ_number(ik, inb), 2, XC_func_rdmft, alpha);
158-
}
159-
/****** delete when function rdmft_cal() -> class RDMFT ******/
160-
161135
occNum_wfcHwfc.zero_out();
162136
occNum_Mul_wfcHwfc(wg, wfcHwfc_TV_in, occNum_wfcHwfc);
163137
occNum_Mul_wfcHwfc(wg, wfcHwfc_hartree_in, occNum_wfcHwfc, 1);

source/module_rdmft/rdmft_tools.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -261,11 +261,13 @@ void occNum_Mul_wfcHwfc(const ModuleBase::matrix& occ_number, const ModuleBase::
261261
// Default symbol = 0 for the gradient of Etotal with respect to occupancy
262262
// symbol = 1 for the relevant calculation of Etotal
263263
void add_occNum(const ModuleBase::matrix& occ_number, const ModuleBase::matrix& wfcHwfc_TV_in, const ModuleBase::matrix& wfcHwfc_hartree_in,
264-
const ModuleBase::matrix& wfcHwfc_XC_in, ModuleBase::matrix& occNum_wfcHwfc, const std::string XC_func_rdmft = "HF", const double alpha = 0.656, int symbol = 0);
264+
const ModuleBase::matrix& wfcHwfc_XC_in, ModuleBase::matrix& occNum_wfcHwfc, const std::string XC_func_rdmft = "HF", const double alpha = 0.656);
265265

266266

267-
// do wk*g(occNum)*wfcHwfc and add for TV, hartree, XC. This function just use once, so it can be replace and delete
268-
void add_wfcHwfc(const std::vector<double>& wk_in, const ModuleBase::matrix& occ_number, const ModuleBase::matrix& wfcHwfc_TV_in, const ModuleBase::matrix& wfcHwfc_hartree_in,
267+
// // do wk*g(occNum)*wfcHwfc and add for TV, hartree, XC. This function just use once, so it can be replace and delete
268+
// void add_wfcHwfc(const std::vector<double>& wk_in, const ModuleBase::matrix& occ_number, const ModuleBase::matrix& wfcHwfc_TV_in, const ModuleBase::matrix& wfcHwfc_hartree_in,
269+
// const ModuleBase::matrix& wfcHwfc_XC_in, ModuleBase::matrix& occNum_wfcHwfc, const std::string XC_func_rdmft, const double alpha);
270+
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,
269271
const ModuleBase::matrix& wfcHwfc_XC_in, ModuleBase::matrix& occNum_wfcHwfc, const std::string XC_func_rdmft, const double alpha);
270272

271273

0 commit comments

Comments
 (0)