Skip to content

Commit e661dce

Browse files
add a new parameter 'mixing_gg0_min' (#3305)
1 parent 80f546f commit e661dce

File tree

9 files changed

+28
-49
lines changed

9 files changed

+28
-49
lines changed

docs/advanced/input_files/input-main.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
- [mixing\_ndim](#mixing_ndim)
7575
- [mixing\_gg0](#mixing_gg0)
7676
- [mixing\_gg0\_mag](#mixing_gg0_mag)
77+
- [mixing\_gg0\_min](#mixing_gg0_min)
7778
- [mixing\_tau](#mixing_tau)
7879
- [mixing\_dftu](#mixing_dftu)
7980
- [gamma\_only](#gamma_only)
@@ -1009,6 +1010,12 @@ We recommend the following options:
10091010
Note: we do not recommand to open Kerker preconditioner of magnetic density unless the system is too hard to converge.
10101011
- **Default**: 0.0
10111012

1013+
### mixing_gg0_min
1014+
1015+
- **Type**: Real
1016+
- **Description**: the minimum kerker coefficient
1017+
- **Default**: 0.1
1018+
10121019
### mixing_tau
10131020

10141021
- **Type**: Boolean

source/module_base/global_variable.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ int MIXING_NDIM = 8;
251251
double MIXING_GG0 = 1.00;
252252
double MIXING_BETA_MAG = 1.6;
253253
double MIXING_GG0_MAG = 1.00;
254+
double MIXING_GG0_MIN = 0.1;
254255
bool MIXING_TAU = 0;
255256

256257
//==========================================================

source/module_base/global_variable.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,7 @@ extern double MIXING_GG0;
280280
extern bool MIXING_TAU;
281281
extern double MIXING_BETA_MAG;
282282
extern double MIXING_GG0_MAG;
283+
extern double MIXING_GG0_MIN;
283284

284285
//==========================================================
285286
// device flags added by denghui

source/module_elecstate/module_charge/charge_mixing.cpp

Lines changed: 6 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ void Charge_Mixing::set_mixing(const std::string& mixing_mode_in,
3737
GlobalV::ofs_running<<"mixing_type: "<< this->mixing_mode <<std::endl;
3838
GlobalV::ofs_running<<"mixing_beta: "<< this->mixing_beta <<std::endl;
3939
GlobalV::ofs_running<<"mixing_gg0: "<< this->mixing_gg0 <<std::endl;
40+
GlobalV::ofs_running<<"mixing_gg0_min: "<< GlobalV::MIXING_GG0_MIN <<std::endl;
4041
if (GlobalV::NSPIN==2)
4142
{
4243
GlobalV::ofs_running<<"mixing_beta_mag: "<< GlobalV::MIXING_BETA_MAG <<std::endl;
@@ -98,50 +99,6 @@ void Charge_Mixing::set_rhopw(ModulePW::PW_Basis* rhopw_in, ModulePW::PW_Basis*
9899
this->rhodpw = rhodpw_in;
99100
}
100101

101-
// void Charge_Mixing::need_auto_set()
102-
// {
103-
// this->autoset = true;
104-
// }
105-
106-
// void Charge_Mixing::auto_set(const double& bandgap_in, const UnitCell& ucell_)
107-
// {
108-
// // auto set parameters once
109-
// if (!this->autoset)
110-
// {
111-
// return;
112-
// }
113-
// else
114-
// {
115-
// this->autoset = false;
116-
// }
117-
// GlobalV::ofs_running << "--------------AUTO-SET---------------" << std::endl;
118-
// // 0.8 for nspin=1 and 0.4 for others
119-
// if (GlobalV::NSPIN == 1)
120-
// {
121-
// this->mixing->mixing_beta = this->mixing_beta = 0.8;
122-
// GlobalV::ofs_running << " Autoset mixing_beta to " << this->mixing_beta << std::endl;
123-
// }
124-
// else
125-
// {
126-
// this->mixing->mixing_beta = this->mixing_beta = 0.4;
127-
// GlobalV::MIXING_BETA_MAG = 4 * this->mixing_beta;
128-
// GlobalV::ofs_running << " Autoset mixing_beta to " << this->mixing_beta << std::endl;
129-
// GlobalV::ofs_running << " Autoset mixing_beta_mag to " << GlobalV::MIXING_BETA_MAG << std::endl;
130-
// }
131-
// GlobalV::MIXING_BETA = mixing_beta;
132-
133-
// // auto set kerker mixing_gg0 = 1.0 as default
134-
// this->mixing_gg0 = 1.0;
135-
// GlobalV::ofs_running << " Autoset mixing_gg0 to " << this->mixing_gg0 << std::endl;
136-
// if (GlobalV::NSPIN == 1)
137-
// {
138-
// GlobalV::MIXING_GG0_MAG = 0.0;
139-
// GlobalV::ofs_running << " Autoset mixing_gg0_mag to " << GlobalV::MIXING_GG0_MAG << std::endl;
140-
// }
141-
142-
// GlobalV::ofs_running << "-------------------------------------" << std::endl;
143-
// }
144-
145102
double Charge_Mixing::get_drho(Charge* chr, const double nelec)
146103
{
147104
ModuleBase::TITLE("Charge_Mixing", "get_drho");
@@ -657,7 +614,7 @@ void Charge_Mixing::Kerker_screen_recip(std::complex<double>* drhog)
657614
for (int ig = 0; ig < this->rhopw->npw; ++ig)
658615
{
659616
double gg = this->rhopw->gg[ig];
660-
double filter_g = std::max(gg / (gg + gg0), 0.1 / this->mixing_beta);
617+
double filter_g = std::max(gg / (gg + gg0), GlobalV::MIXING_GG0_MIN / this->mixing_beta);
661618
drhog[is * this->rhopw->npw + ig] *= filter_g;
662619
}
663620
}
@@ -700,7 +657,7 @@ void Charge_Mixing::Kerker_screen_recip_new(std::complex<double>* drhog)
700657
for (int ig = 0; ig < this->rhopw->npw; ++ig)
701658
{
702659
double gg = this->rhopw->gg[ig];
703-
double filter_g = std::max(gg / (gg + gg0), 0.1 / amin);
660+
double filter_g = std::max(gg / (gg + gg0), GlobalV::MIXING_GG0_MIN / amin);
704661
drhog[is * this->rhopw->npw + ig] *= filter_g;
705662
}
706663
}
@@ -756,7 +713,7 @@ void Charge_Mixing::Kerker_screen_real(double* drhor)
756713
// drhog[is * this->rhopw->npw + ig] *= 0;
757714
// continue;
758715
//}
759-
double filter_g = std::max(gg / (gg + gg0), 0.1 / amin);
716+
double filter_g = std::max(gg / (gg + gg0), GlobalV::MIXING_GG0_MIN / amin);
760717
drhog[is * this->rhopw->npw + ig] *= (1 - filter_g);
761718
}
762719
}
@@ -794,7 +751,7 @@ void Charge_Mixing::Kerker_screen_real_test(double* drhor)
794751
for (int ig = 0; ig < this->rhopw->npw; ig++)
795752
{
796753
double gg = this->rhopw->gg[ig];
797-
double filter_g = std::max(gg / (gg + gg0), 0.1 / this->mixing_beta);
754+
double filter_g = std::max(gg / (gg + gg0), GlobalV::MIXING_GG0_MIN / this->mixing_beta);
798755
drhog[ig] *= (1 - filter_g);
799756
}
800757
// inverse FT
@@ -826,7 +783,7 @@ void Charge_Mixing::Kerker_screen_real_test(double* drhor)
826783
for (int ig = 0; ig < this->rhopw->npw; ig++)
827784
{
828785
double gg = this->rhopw->gg[ig];
829-
double filter_g = std::max(gg / (gg + gg0_mag), 0.1 / GlobalV::MIXING_BETA_MAG);
786+
double filter_g = std::max(gg / (gg + gg0_mag), GlobalV::MIXING_GG0_MIN / GlobalV::MIXING_BETA_MAG);
830787
drhog_mag[ig] *= (1 - filter_g);
831788
}
832789
// inverse FT

source/module_io/input.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,7 @@ void Input::Default(void)
323323
mixing_gg0 = 1.00; // use Kerker defaultly
324324
mixing_beta_mag = -10.0; // only set when nspin == 2
325325
mixing_gg0_mag = 0.0; // defaultly exclude Kerker from mixing magnetic density
326+
mixing_gg0_min = 0.1; // defaultly minimum kerker coefficient
326327
mixing_tau = false;
327328
mixing_dftu = false;
328329
//----------------------------------------------------------
@@ -1391,6 +1392,10 @@ bool Input::Read(const std::string &fn)
13911392
{
13921393
read_value(ifs, mixing_gg0_mag);
13931394
}
1395+
else if (strcmp("mixing_gg0_min", word) == 0)
1396+
{
1397+
read_value(ifs, mixing_gg0_min);
1398+
}
13941399
else if (strcmp("mixing_tau", word) == 0)
13951400
{
13961401
read_bool(ifs, mixing_tau);
@@ -3530,6 +3535,7 @@ void Input::Bcast()
35303535
Parallel_Common::bcast_double(mixing_gg0); // mohan add 2014-09-27
35313536
Parallel_Common::bcast_double(mixing_beta_mag);
35323537
Parallel_Common::bcast_double(mixing_gg0_mag);
3538+
Parallel_Common::bcast_double(mixing_gg0_min);
35333539
Parallel_Common::bcast_bool(mixing_tau);
35343540
Parallel_Common::bcast_bool(mixing_dftu);
35353541

source/module_io/input.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ class Input
233233
double mixing_gg0; // used in kerker method. mohan add 2014-09-27
234234
double mixing_beta_mag;
235235
double mixing_gg0_mag;
236+
double mixing_gg0_min;
236237

237238
bool mixing_tau; // whether to mix tau in mgga
238239
bool mixing_dftu; //whether to mix locale in DFT+U

source/module_io/input_conv.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -751,6 +751,7 @@ void Input_Conv::Convert(void)
751751
GlobalV::MIXING_GG0 = INPUT.mixing_gg0;
752752
GlobalV::MIXING_BETA_MAG = INPUT.mixing_beta_mag;
753753
GlobalV::MIXING_GG0_MAG = INPUT.mixing_gg0_mag;
754+
GlobalV::MIXING_GG0_MIN = INPUT.mixing_gg0_min;
754755
GlobalV::MIXING_TAU = INPUT.mixing_tau;
755756

756757
ModuleBase::timer::tick("Input_Conv", "Convert");

source/module_io/parameter_pool.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -839,6 +839,10 @@ bool input_parameters_set(std::map<std::string, InputParameter> input_parameters
839839
{
840840
INPUT.mixing_gg0_mag = *static_cast<double*>(input_parameters["mixing_gg0_mag"].get());
841841
}
842+
else if (input_parameters.count("mixing_gg0_min") != 0)
843+
{
844+
INPUT.mixing_gg0_min = *static_cast<double*>(input_parameters["mixing_gg0_min"].get());
845+
}
842846
else if (input_parameters.count("mixing_tau") != 0)
843847
{
844848
INPUT.mixing_tau = *static_cast<bool*>(input_parameters["mixing_tau"].get());

source/module_io/write_input.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ ModuleBase::GlobalFunc::OUTP(ofs, "out_bandgap", out_bandgap, "if true, print ou
249249
ModuleBase::GlobalFunc::OUTP(ofs, "mixing_gg0", mixing_gg0, "mixing parameter in kerker");
250250
ModuleBase::GlobalFunc::OUTP(ofs, "mixing_beta_mag", mixing_beta_mag, "mixing parameter for magnetic density");
251251
ModuleBase::GlobalFunc::OUTP(ofs, "mixing_gg0_mag", mixing_gg0_mag, "mixing parameter in kerker");
252+
ModuleBase::GlobalFunc::OUTP(ofs, "mixing_gg0_min", mixing_gg0_min, "the minimum kerker coefficient");
252253
ModuleBase::GlobalFunc::OUTP(ofs, "mixing_tau", mixing_tau, "whether to mix tau in mGGA calculation");
253254
ModuleBase::GlobalFunc::OUTP(ofs, "mixing_dftu", mixing_dftu, "whether to mix locale in DFT+U calculation");
254255

0 commit comments

Comments
 (0)