From 694a4decce3c2cbf288ef32194e8bd0b59a7d022 Mon Sep 17 00:00:00 2001 From: weiqingzhou Date: Fri, 2 Feb 2024 15:57:58 +0800 Subject: [PATCH 01/10] move mixing_data object from public to private --- .../module_charge/charge_mixing.h | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/source/module_elecstate/module_charge/charge_mixing.h b/source/module_elecstate/module_charge/charge_mixing.h index 752fe3f01a..35bb49cd66 100644 --- a/source/module_elecstate/module_charge/charge_mixing.h +++ b/source/module_elecstate/module_charge/charge_mixing.h @@ -13,13 +13,6 @@ class Charge_Mixing public: Charge_Mixing(); ~Charge_Mixing(); - Base_Mixing::Mixing* mixing = nullptr; ///< Mixing object to mix charge density, kinetic energy density and compensation density - Base_Mixing::Mixing_Data rho_mdata; ///< Mixing data for charge density - Base_Mixing::Mixing_Data tau_mdata; ///< Mixing data for kinetic energy density - Base_Mixing::Mixing_Data nhat_mdata; ///< Mixing data for compensation density - Base_Mixing::Mixing_Data dmr_mdata; ///< Mixing data for real space density matrix - - Base_Mixing::Plain_Mixing* mixing_highf = nullptr; ///< The high_frequency part is mixed by plain mixing method. /** * @brief reset mixing @@ -140,6 +133,15 @@ class Charge_Mixing } private: + + // mixing_data + Base_Mixing::Mixing* mixing = nullptr; ///< Mixing object to mix charge density, kinetic energy density and compensation density + Base_Mixing::Mixing_Data rho_mdata; ///< Mixing data for charge density + Base_Mixing::Mixing_Data tau_mdata; ///< Mixing data for kinetic energy density + Base_Mixing::Mixing_Data nhat_mdata; ///< Mixing data for compensation density + Base_Mixing::Mixing_Data dmr_mdata; ///< Mixing data for real space density matrix + Base_Mixing::Plain_Mixing* mixing_highf = nullptr; ///< The high_frequency part is mixed by plain mixing method. + //====================================== // General parameters //====================================== @@ -156,7 +158,6 @@ class Charge_Mixing ModulePW::PW_Basis* rhodpw = nullptr; ///< dense grid, same as rhopw for ncpp. // bool autoset = false; - private: double rhog_dot_product(const std::complex* const* const rhog1, const std::complex* const* const rhog2) const; From 29ca2c4867d6c461a83c93e01f29f9994842568d Mon Sep 17 00:00:00 2001 From: weiqingzhou Date: Fri, 2 Feb 2024 16:10:28 +0800 Subject: [PATCH 02/10] move kerker and inner_product functions from public to private --- .../module_charge/charge_mixing.h | 63 +++++++++---------- 1 file changed, 29 insertions(+), 34 deletions(-) diff --git a/source/module_elecstate/module_charge/charge_mixing.h b/source/module_elecstate/module_charge/charge_mixing.h index 35bb49cd66..87779d68d1 100644 --- a/source/module_elecstate/module_charge/charge_mixing.h +++ b/source/module_elecstate/module_charge/charge_mixing.h @@ -45,33 +45,6 @@ class Charge_Mixing */ void mix_rho_real(Charge* chr); - /** - * @brief Kerker screen method for reciprocal space - * - */ - void Kerker_screen_recip(std::complex* rhog); - void Kerker_screen_recip_new(std::complex* rhog); - - /** - * @brief Kerker screen method for real space - * - */ - void Kerker_screen_real(double* rho); - - /** - * @brief Inner product of two complex vectors - * - */ - double inner_product_recip(std::complex* rho1, std::complex* rho2); - double inner_product_recip_new1(std::complex* rho1, std::complex* rho2); - double inner_product_recip_new2(std::complex* rho1, std::complex* rho2); - - /** - * @brief Inner product of two double vectors - * - */ - double inner_product_real(double* rho1, double* rho2); - /** * @brief Set the mixing object * @@ -100,8 +73,6 @@ class Charge_Mixing * */ double get_drho(Charge* chr, const double nelec); - - // init pwrho and rhodpw /** * @brief Set the smooth and dense grids @@ -111,10 +82,8 @@ class Charge_Mixing */ void set_rhopw(ModulePW::PW_Basis* rhopw_in, ModulePW::PW_Basis* rhodpw_in); - // extracting parameters - // normally these parameters will not be used - // outside charge mixing, but Exx is using them - // as well as some other places + // extracting parameters normally these parameters will not be used outside charge mixing + // while Exx is using them as well as some other places const std::string& get_mixing_mode() const { return mixing_mode; @@ -156,7 +125,33 @@ class Charge_Mixing ModulePW::PW_Basis* rhopw = nullptr; ///< smooth grid ModulePW::PW_Basis* rhodpw = nullptr; ///< dense grid, same as rhopw for ncpp. - // bool autoset = false; + + /** + * @brief Kerker screen method for reciprocal space + * + */ + void Kerker_screen_recip(std::complex* rhog); + void Kerker_screen_recip_new(std::complex* rhog); + + /** + * @brief Kerker screen method for real space + * + */ + void Kerker_screen_real(double* rho); + + /** + * @brief Inner product of two complex vectors + * + */ + double inner_product_recip(std::complex* rho1, std::complex* rho2); + double inner_product_recip_new1(std::complex* rho1, std::complex* rho2); + double inner_product_recip_new2(std::complex* rho1, std::complex* rho2); + + /** + * @brief Inner product of two double vectors + * + */ + double inner_product_real(double* rho1, double* rho2); double rhog_dot_product(const std::complex* const* const rhog1, const std::complex* const* const rhog2) const; From 0065a6fea49533455ea37aa5ce372d37de6acad3 Mon Sep 17 00:00:00 2001 From: weiqingzhou Date: Fri, 2 Feb 2024 16:13:45 +0800 Subject: [PATCH 03/10] move mix_rho_real() and mix_rho_recip() functions from public to private --- .../module_charge/charge_mixing.h | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/source/module_elecstate/module_charge/charge_mixing.h b/source/module_elecstate/module_charge/charge_mixing.h index 87779d68d1..539f14783d 100644 --- a/source/module_elecstate/module_charge/charge_mixing.h +++ b/source/module_elecstate/module_charge/charge_mixing.h @@ -33,18 +33,6 @@ class Charge_Mixing void mix_dmr(elecstate::DensityMatrix* DM); void mix_dmr(elecstate::DensityMatrix, double>* DM); - /** - * @brief charge mixing for reciprocal space - * - */ - void mix_rho_recip_new(Charge* chr); - - /** - * @brief charge mixing for real space - * - */ - void mix_rho_real(Charge* chr); - /** * @brief Set the mixing object * @@ -126,6 +114,18 @@ class Charge_Mixing ModulePW::PW_Basis* rhopw = nullptr; ///< smooth grid ModulePW::PW_Basis* rhodpw = nullptr; ///< dense grid, same as rhopw for ncpp. + /** + * @brief charge mixing for reciprocal space + * + */ + void mix_rho_recip_new(Charge* chr); + + /** + * @brief charge mixing for real space + * + */ + void mix_rho_real(Charge* chr); + /** * @brief Kerker screen method for reciprocal space * From eccc02af73d07f34393dfd4e97d743411ffef909 Mon Sep 17 00:00:00 2001 From: weiqingzhou Date: Fri, 2 Feb 2024 16:23:50 +0800 Subject: [PATCH 04/10] add some comments --- .../module_charge/charge_mixing.h | 41 ++++++------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/source/module_elecstate/module_charge/charge_mixing.h b/source/module_elecstate/module_charge/charge_mixing.h index 539f14783d..13ca4f0c7f 100644 --- a/source/module_elecstate/module_charge/charge_mixing.h +++ b/source/module_elecstate/module_charge/charge_mixing.h @@ -16,26 +16,24 @@ class Charge_Mixing /** * @brief reset mixing - * */ void mix_reset(); /** * @brief charge mixing - * + * @param chr pointer of Charge object */ void mix_rho(Charge* chr); /** * @brief density matrix mixing, only for LCAO - * + * @param DM pointer of DensityMatrix object */ void mix_dmr(elecstate::DensityMatrix* DM); void mix_dmr(elecstate::DensityMatrix, double>* DM); /** * @brief Set the mixing object - * * @param mixing_mode_in mixing mode: "plain", "broyden", "pulay" * @param mixing_beta_in mixing beta * @param mixing_ndim_in mixing ndim @@ -52,7 +50,7 @@ class Charge_Mixing /** * @brief allocate memory of dmr_mdata - * + * @param nnr size of real-space density matrix */ void allocate_mixing_dmr(int nnr); @@ -64,7 +62,6 @@ class Charge_Mixing /** * @brief Set the smooth and dense grids - * * @param rhopw_in smooth grid * @param rhodpw_in dense grid when double grid is used, otherwise same as rhopw */ @@ -72,22 +69,10 @@ class Charge_Mixing // extracting parameters normally these parameters will not be used outside charge mixing // while Exx is using them as well as some other places - const std::string& get_mixing_mode() const - { - return mixing_mode; - } - double get_mixing_beta() const - { - return mixing_beta; - } - int get_mixing_ndim() const - { - return mixing_ndim; - } - double get_mixing_gg0() const - { - return mixing_gg0; - } + const std::string& get_mixing_mode() const {return mixing_mode;} + double get_mixing_beta() const {return mixing_beta;} + int get_mixing_ndim() const {return mixing_ndim;} + double get_mixing_gg0() const {return mixing_gg0;} private: @@ -116,32 +101,32 @@ class Charge_Mixing /** * @brief charge mixing for reciprocal space - * + * @param chr pointer of Charge object */ void mix_rho_recip_new(Charge* chr); /** * @brief charge mixing for real space - * + * @param chr pointer of Charge object */ void mix_rho_real(Charge* chr); - + /** * @brief Kerker screen method for reciprocal space - * + * @param rhog charge density in reciprocal space */ void Kerker_screen_recip(std::complex* rhog); void Kerker_screen_recip_new(std::complex* rhog); /** * @brief Kerker screen method for real space - * + * @param rho charge density in real space */ void Kerker_screen_real(double* rho); /** * @brief Inner product of two complex vectors - * + * */ double inner_product_recip(std::complex* rho1, std::complex* rho2); double inner_product_recip_new1(std::complex* rho1, std::complex* rho2); From 4e5b2b06a35f0c3152d2b917357383f02e9f885c Mon Sep 17 00:00:00 2001 From: weiqingzhou Date: Fri, 2 Feb 2024 17:16:29 +0800 Subject: [PATCH 05/10] add some private parameters in charge_mixing.h --- source/module_elecstate/module_charge/charge_mixing.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/source/module_elecstate/module_charge/charge_mixing.h b/source/module_elecstate/module_charge/charge_mixing.h index 13ca4f0c7f..3d60135432 100644 --- a/source/module_elecstate/module_charge/charge_mixing.h +++ b/source/module_elecstate/module_charge/charge_mixing.h @@ -33,7 +33,7 @@ class Charge_Mixing void mix_dmr(elecstate::DensityMatrix, double>* DM); /** - * @brief Set the mixing object + * @brief Set all private mixing paramters * @param mixing_mode_in mixing mode: "plain", "broyden", "pulay" * @param mixing_beta_in mixing beta * @param mixing_ndim_in mixing ndim @@ -85,7 +85,7 @@ class Charge_Mixing Base_Mixing::Plain_Mixing* mixing_highf = nullptr; ///< The high_frequency part is mixed by plain mixing method. //====================================== - // General parameters + // private mixing parameters //====================================== std::string mixing_mode = "broyden"; ///< mixing mode: "plain", "broyden", "pulay" double mixing_beta = 0.8; ///< mixing beta for density @@ -93,6 +93,10 @@ class Charge_Mixing int mixing_ndim = 8; ///< mixing ndim for broyden and pulay double mixing_gg0 = 0.0; ///< mixing gg0 for Kerker screen bool mixing_tau = false; ///< whether to use tau mixing + double mixing_gg0_mag = 0.0; ///< mixing gg0 for Kerker screen for magnetism + double mixing_gg0_min = 0.1; ///< minimum kerker coefficient + double mixing_angle = 0.0; ///< mixing angle for nspin=4 + bool mixing_dmr = false; ///< whether to mixing real space density matrix bool new_e_iteration = true; From 9f26b1be57e0b7acd3fc07b7831d5a7ca6a519f7 Mon Sep 17 00:00:00 2001 From: weiqingzhou Date: Fri, 2 Feb 2024 17:35:11 +0800 Subject: [PATCH 06/10] define a get_mixing() to return mixing object --- source/module_elecstate/module_charge/charge_mixing.h | 1 + source/module_ri/Exx_LRI_interface.hpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/source/module_elecstate/module_charge/charge_mixing.h b/source/module_elecstate/module_charge/charge_mixing.h index 3d60135432..d38135adb4 100644 --- a/source/module_elecstate/module_charge/charge_mixing.h +++ b/source/module_elecstate/module_charge/charge_mixing.h @@ -73,6 +73,7 @@ class Charge_Mixing double get_mixing_beta() const {return mixing_beta;} int get_mixing_ndim() const {return mixing_ndim;} double get_mixing_gg0() const {return mixing_gg0;} + Base_Mixing::Mixing* get_mixing() const {return mixing;} private: diff --git a/source/module_ri/Exx_LRI_interface.hpp b/source/module_ri/Exx_LRI_interface.hpp index 02ba298f20..cf07890e04 100644 --- a/source/module_ri/Exx_LRI_interface.hpp +++ b/source/module_ri/Exx_LRI_interface.hpp @@ -60,7 +60,7 @@ void Exx_LRI_Interface::exx_beforescf(const K_Vectors& kv, const Charg if(GlobalC::exx_info.info_global.separate_loop) this->mix_DMk_2D.set_mixing(nullptr); else - this->mix_DMk_2D.set_mixing(chgmix.mixing); + this->mix_DMk_2D.set_mixing(chgmix.get_mixing()); } // for exx two_level scf this->two_level_step = 0; From 0b74e01ebaaf3aafc0f139bceb7c1d2a9a855373 Mon Sep 17 00:00:00 2001 From: weiqingzhou Date: Sun, 4 Feb 2024 14:02:07 +0800 Subject: [PATCH 07/10] fix bugs induced by new set_mixing() --- .../module_charge/charge_mixing.cpp | 11 +- .../module_charge/charge_mixing.h | 20 ++- .../test/charge_mixing_test.cpp | 136 ++++++++++++++---- source/module_esolver/esolver_ks.cpp | 6 +- source/module_esolver/esolver_ks_lcao.cpp | 6 +- source/module_esolver/esolver_ks_pw.cpp | 6 +- .../module_io/test/for_testing_input_conv.h | 14 -- 7 files changed, 152 insertions(+), 47 deletions(-) diff --git a/source/module_elecstate/module_charge/charge_mixing.cpp b/source/module_elecstate/module_charge/charge_mixing.cpp index 73c43dbfd2..8b0d5bdbef 100755 --- a/source/module_elecstate/module_charge/charge_mixing.cpp +++ b/source/module_elecstate/module_charge/charge_mixing.cpp @@ -24,14 +24,23 @@ void Charge_Mixing::set_mixing(const std::string& mixing_mode_in, const int& mixing_ndim_in, const double& mixing_gg0_in, const bool& mixing_tau_in, - const double& mixing_beta_mag_in) + const double& mixing_beta_mag_in, + const double& mixing_gg0_mag_in, + const double& mixing_gg0_min_in, + const double& mixing_angle_in, + const bool& mixing_dmr_in) { + // get private mixing parameters this->mixing_mode = mixing_mode_in; this->mixing_beta = mixing_beta_in; this->mixing_beta_mag = mixing_beta_mag_in; this->mixing_ndim = mixing_ndim_in; this->mixing_gg0 = mixing_gg0_in; this->mixing_tau = mixing_tau_in; + this->mixing_gg0_mag = mixing_gg0_mag_in; + this->mixing_gg0_min = mixing_gg0_min_in; + this->mixing_angle = mixing_angle_in; + this->mixing_dmr = mixing_dmr_in; GlobalV::ofs_running<<"\n----------- Double Check Mixing Parameters Begin ------------"<mixing_mode <::eachiterinit(const int istep, const int iter) GlobalV::MIXING_NDIM, GlobalV::MIXING_GG0, GlobalV::MIXING_TAU, - GlobalV::MIXING_BETA_MAG); + GlobalV::MIXING_BETA_MAG, + GlobalV::MIXING_GG0_MAG, + GlobalV::MIXING_GG0_MIN, + GlobalV::MIXING_ANGLE, + GlobalV::MIXING_DMR); } this->p_chgmix->mix_reset(); } diff --git a/source/module_io/test/for_testing_input_conv.h b/source/module_io/test/for_testing_input_conv.h index 13b507e2c8..4f9b53e579 100644 --- a/source/module_io/test/for_testing_input_conv.h +++ b/source/module_io/test/for_testing_input_conv.h @@ -265,20 +265,6 @@ Magnetism::Magnetism() Magnetism::~Magnetism() { } - -void Charge_Mixing::set_mixing(const std::string& mixing_mode_in, - const double& mixing_beta_in, - const int& mixing_ndim_in, - const double& mixing_gg0_in, - const bool& mixing_tau_in, - const double& mixing_beta_mag_in) -{ - return; -} -// void Charge_Mixing::need_auto_set() -// { -// this->autoset = true; -// } void Occupy::decision(const std::string& name, const std::string& smearing_method, const double& smearing_sigma) { return; From 320231a39d01cb74bf619db32225b1295a42c408 Mon Sep 17 00:00:00 2001 From: weiqingzhou Date: Sun, 4 Feb 2024 14:45:23 +0800 Subject: [PATCH 08/10] move parameters checks from esolver_ks::Init() to set_mixing() --- .../module_charge/charge_mixing.cpp | 11 +++++++++++ source/module_esolver/esolver_ks.cpp | 14 -------------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/source/module_elecstate/module_charge/charge_mixing.cpp b/source/module_elecstate/module_charge/charge_mixing.cpp index 8b0d5bdbef..95bda47e3b 100755 --- a/source/module_elecstate/module_charge/charge_mixing.cpp +++ b/source/module_elecstate/module_charge/charge_mixing.cpp @@ -42,6 +42,17 @@ void Charge_Mixing::set_mixing(const std::string& mixing_mode_in, this->mixing_angle = mixing_angle_in; this->mixing_dmr = mixing_dmr_in; + // check the paramters + if (GlobalV::MIXING_BETA > 1.0 || GlobalV::MIXING_BETA < 0.0) + { + ModuleBase::WARNING_QUIT("Charge_Mixing", "You'd better set mixing_beta to [0.0, 1.0]!"); + } + if (GlobalV::MIXING_BETA_MAG < 0.0) + { + ModuleBase::WARNING_QUIT("Charge_Mixing", "You'd better set mixing_beta_mag >= 0.0!"); + } + + // print into running.log GlobalV::ofs_running<<"\n----------- Double Check Mixing Parameters Begin ------------"<mixing_mode <mixing_beta <need_auto_set(); - //} - if (GlobalV::MIXING_BETA > 1.0 || GlobalV::MIXING_BETA < 0.0) - { - ModuleBase::WARNING("INPUT", "You'd better set mixing_beta to [0.0, 1.0]!"); - } - if (GlobalV::MIXING_BETA_MAG < 0.0) - { - ModuleBase::WARNING("INPUT", "You'd better set mixing_beta_mag >= 0.0!"); - } #ifdef USE_PAW if(GlobalV::use_paw) From 997dd22d1a6c573b8d8dbfa23b17d602e0590cd4 Mon Sep 17 00:00:00 2001 From: weiqingzhou Date: Sun, 4 Feb 2024 14:46:20 +0800 Subject: [PATCH 09/10] polish charge_mixing_test to protect set_mixing() --- .../test/charge_mixing_test.cpp | 53 ++++++++++++++++--- 1 file changed, 47 insertions(+), 6 deletions(-) diff --git a/source/module_elecstate/test/charge_mixing_test.cpp b/source/module_elecstate/test/charge_mixing_test.cpp index 0dbbb3985e..02c1422287 100644 --- a/source/module_elecstate/test/charge_mixing_test.cpp +++ b/source/module_elecstate/test/charge_mixing_test.cpp @@ -93,7 +93,7 @@ class ChargeMixingTest : public ::testing::Test pw_dbasis.initparameters(false, 40); pw_dbasis.setuptransform(&pw_basis); pw_dbasis.collect_local_pw(); - // mixing parameters + // default mixing parameters GlobalV::MIXING_MODE = "broyden"; GlobalV::MIXING_BETA = 0.8; GlobalV::MIXING_NDIM = 8; @@ -133,6 +133,16 @@ TEST_F(ChargeMixingTest, SetMixingTest) GlobalV::MIXING_ANGLE, GlobalV::MIXING_DMR); EXPECT_EQ(CMtest.rho_mdata.length, pw_basis.npw); + EXPECT_EQ(CMtest.get_mixing_mode(), "broyden"); + EXPECT_EQ(CMtest.get_mixing_beta(), 1.0); + EXPECT_EQ(CMtest.get_mixing_ndim(), 1); + EXPECT_EQ(CMtest.get_mixing_gg0(), 1.0); + EXPECT_EQ(CMtest.mixing_tau, false); + EXPECT_EQ(CMtest.mixing_beta_mag, 1.6); + EXPECT_EQ(CMtest.mixing_gg0_mag, 0.0); + EXPECT_EQ(CMtest.mixing_gg0_min, 0.1); + EXPECT_EQ(CMtest.mixing_angle, -10.0); + EXPECT_EQ(CMtest.mixing_dmr, false); GlobalV::SCF_THR_TYPE = 2; CMtest.set_mixing(GlobalV::MIXING_MODE, @@ -146,10 +156,6 @@ TEST_F(ChargeMixingTest, SetMixingTest) GlobalV::MIXING_ANGLE, GlobalV::MIXING_DMR); EXPECT_EQ(CMtest.rho_mdata.length, pw_basis.nrxx); - EXPECT_EQ(CMtest.get_mixing_mode(), "broyden"); - EXPECT_EQ(CMtest.get_mixing_beta(), 1.0); - EXPECT_EQ(CMtest.get_mixing_ndim(), 1); - EXPECT_EQ(CMtest.get_mixing_gg0(), 1.0); FUNC_TYPE = 3; GlobalV::MIXING_TAU = true; @@ -167,6 +173,8 @@ TEST_F(ChargeMixingTest, SetMixingTest) GlobalV::MIXING_DMR); CMtest.mix_reset(); EXPECT_EQ(CMtest.tau_mdata.length, pw_basis.npw); + EXPECT_EQ(CMtest.mixing_mode, "plain"); + EXPECT_EQ(CMtest.mixing_tau, true); GlobalV::SCF_THR_TYPE = 2; CMtest.set_mixing(GlobalV::MIXING_MODE, @@ -182,7 +190,7 @@ TEST_F(ChargeMixingTest, SetMixingTest) CMtest.mix_reset(); EXPECT_EQ(CMtest.tau_mdata.length, pw_basis.nrxx); - GlobalV::MIXING_MODE = "nothing"; + GlobalV::MIXING_BETA = 1.1; std::string output; testing::internal::CaptureStdout(); EXPECT_EXIT(CMtest.set_mixing(GlobalV::MIXING_MODE, @@ -196,6 +204,39 @@ TEST_F(ChargeMixingTest, SetMixingTest) GlobalV::MIXING_ANGLE, GlobalV::MIXING_DMR);, ::testing::ExitedWithCode(0), ""); output = testing::internal::GetCapturedStdout(); + EXPECT_THAT(output, testing::HasSubstr("You'd better set mixing_beta to [0.0, 1.0]!")); + + GlobalV::MIXING_BETA = 0.7; + GlobalV::MIXING_BETA_MAG = -0.1; + testing::internal::CaptureStdout(); + EXPECT_EXIT(CMtest.set_mixing(GlobalV::MIXING_MODE, + GlobalV::MIXING_BETA, + GlobalV::MIXING_NDIM, + GlobalV::MIXING_GG0, + GlobalV::MIXING_TAU, + GlobalV::MIXING_BETA_MAG, + GlobalV::MIXING_GG0_MAG, + GlobalV::MIXING_GG0_MIN, + GlobalV::MIXING_ANGLE, + GlobalV::MIXING_DMR);, ::testing::ExitedWithCode(0), ""); + output = testing::internal::GetCapturedStdout(); + EXPECT_THAT(output, testing::HasSubstr("You'd better set mixing_beta_mag >= 0.0!")); + + GlobalV::MIXING_BETA = 0.7; + GlobalV::MIXING_BETA_MAG = 1.6; + GlobalV::MIXING_MODE = "nothing"; + testing::internal::CaptureStdout(); + EXPECT_EXIT(CMtest.set_mixing(GlobalV::MIXING_MODE, + GlobalV::MIXING_BETA, + GlobalV::MIXING_NDIM, + GlobalV::MIXING_GG0, + GlobalV::MIXING_TAU, + GlobalV::MIXING_BETA_MAG, + GlobalV::MIXING_GG0_MAG, + GlobalV::MIXING_GG0_MIN, + GlobalV::MIXING_ANGLE, + GlobalV::MIXING_DMR);, ::testing::ExitedWithCode(0), ""); + output = testing::internal::GetCapturedStdout(); EXPECT_THAT(output, testing::HasSubstr("This Mixing mode is not implemended yet,coming soon.")); } From 071939dc41b12c9c411e75eb6f62268036276acb Mon Sep 17 00:00:00 2001 From: weiqingzhou Date: Sun, 4 Feb 2024 15:45:20 +0800 Subject: [PATCH 10/10] fix a bug induced by negative mixing_beta_mag --- source/module_elecstate/module_charge/charge_mixing.cpp | 4 ++-- source/module_elecstate/test/charge_mixing_test.cpp | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/source/module_elecstate/module_charge/charge_mixing.cpp b/source/module_elecstate/module_charge/charge_mixing.cpp index 95bda47e3b..6a489b05b3 100755 --- a/source/module_elecstate/module_charge/charge_mixing.cpp +++ b/source/module_elecstate/module_charge/charge_mixing.cpp @@ -43,11 +43,11 @@ void Charge_Mixing::set_mixing(const std::string& mixing_mode_in, this->mixing_dmr = mixing_dmr_in; // check the paramters - if (GlobalV::MIXING_BETA > 1.0 || GlobalV::MIXING_BETA < 0.0) + if (this->mixing_beta > 1.0 || this->mixing_beta < 0.0) { ModuleBase::WARNING_QUIT("Charge_Mixing", "You'd better set mixing_beta to [0.0, 1.0]!"); } - if (GlobalV::MIXING_BETA_MAG < 0.0) + if (GlobalV::NSPIN >= 2 && this->mixing_beta_mag < 0.0) { ModuleBase::WARNING_QUIT("Charge_Mixing", "You'd better set mixing_beta_mag >= 0.0!"); } diff --git a/source/module_elecstate/test/charge_mixing_test.cpp b/source/module_elecstate/test/charge_mixing_test.cpp index 02c1422287..a01a288b01 100644 --- a/source/module_elecstate/test/charge_mixing_test.cpp +++ b/source/module_elecstate/test/charge_mixing_test.cpp @@ -208,6 +208,7 @@ TEST_F(ChargeMixingTest, SetMixingTest) GlobalV::MIXING_BETA = 0.7; GlobalV::MIXING_BETA_MAG = -0.1; + GlobalV::NSPIN = 2; testing::internal::CaptureStdout(); EXPECT_EXIT(CMtest.set_mixing(GlobalV::MIXING_MODE, GlobalV::MIXING_BETA, @@ -222,6 +223,7 @@ TEST_F(ChargeMixingTest, SetMixingTest) output = testing::internal::GetCapturedStdout(); EXPECT_THAT(output, testing::HasSubstr("You'd better set mixing_beta_mag >= 0.0!")); + GlobalV::NSPIN = 1; GlobalV::MIXING_BETA = 0.7; GlobalV::MIXING_BETA_MAG = 1.6; GlobalV::MIXING_MODE = "nothing";