Skip to content

Commit 310d101

Browse files
committed
vdW-D4: Switch to smooth cutoff
1 parent 648aff5 commit 310d101

2 files changed

Lines changed: 32 additions & 23 deletions

File tree

source/source_hamilt/module_vdw/test/vdw_test.cpp

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -690,7 +690,7 @@ TEST_F(vdwd4Test, D4GetEnergy)
690690
auto vdw_solver = vdw::make_vdw(ucell, input);
691691
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(false, false));
692692
const double ene = result.energy;
693-
EXPECT_NEAR(ene, -0.04998837990336073, 1E-10);
693+
EXPECT_NEAR(ene, -0.049988405722573105, 1E-10);
694694
}
695695

696696
TEST_F(vdwd4Test, D4GetEnergyForChargedSystem)
@@ -700,21 +700,21 @@ TEST_F(vdwd4Test, D4GetEnergyForChargedSystem)
700700
auto vdw_solver = vdw::make_vdw(ucell, input);
701701
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(false, false));
702702
const double ene = result.energy;
703-
EXPECT_NEAR(ene, -0.04359451765256733, 1E-10);
703+
EXPECT_NEAR(ene, -0.04359454509118302, 1E-10);
704704
}
705705

706706
TEST_F(vdwd4Test, D4GetForce)
707707
{
708708
auto vdw_solver = vdw::make_vdw(ucell, input);
709709
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(true, false));
710-
EXPECT_NEAR(result.energy, -0.04998837990336073, 1E-10);
710+
EXPECT_NEAR(result.energy, -0.049988405722573105, 1E-10);
711711
ASSERT_TRUE(result.has_force);
712712
EXPECT_FALSE(result.has_stress);
713713
const std::vector<ModuleBase::Vector3<double>>& force = result.force;
714-
EXPECT_NEAR(force[0].x, -0.0023357259921368717, 1e-12);
714+
EXPECT_NEAR(force[0].x, -0.002339156758188389, 1e-12);
715715
EXPECT_NEAR(force[0].y, 0.0, 1e-12);
716716
EXPECT_NEAR(force[0].z, 0.0, 1e-12);
717-
EXPECT_NEAR(force[1].x, 0.0023357259921368730, 1e-12);
717+
EXPECT_NEAR(force[1].x, 0.0023391567581883886, 1e-12);
718718
EXPECT_NEAR(force[1].y, 0.0, 1e-12);
719719
EXPECT_NEAR(force[1].z, 0.0, 1e-12);
720720
}
@@ -723,19 +723,19 @@ TEST_F(vdwd4Test, D4GetStress)
723723
{
724724
auto vdw_solver = vdw::make_vdw(ucell, input);
725725
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(true, true));
726-
EXPECT_NEAR(result.energy, -0.04998837990336073, 1E-10);
726+
EXPECT_NEAR(result.energy, -0.049988405722573105, 1E-10);
727727
ASSERT_TRUE(result.has_force);
728728
ASSERT_TRUE(result.has_stress);
729729
const ModuleBase::Matrix3& stress = result.stress;
730-
EXPECT_NEAR(stress.e11, 0.00015830384474877792, 1e-12);
730+
EXPECT_NEAR(stress.e11, 0.0001583939298091549, 1e-12);
731731
EXPECT_NEAR(stress.e12, 0.0, 1e-12);
732732
EXPECT_NEAR(stress.e13, 0.0, 1e-12);
733733
EXPECT_NEAR(stress.e21, 0.0, 1e-12);
734-
EXPECT_NEAR(stress.e22, 0.00016694998515968720, 1e-12);
735-
EXPECT_NEAR(stress.e23, -1.5500973166318808e-05, 1e-12);
734+
EXPECT_NEAR(stress.e22, 0.00016697881796423088, 1e-12);
735+
EXPECT_NEAR(stress.e23, -1.527806618822572e-05, 1e-12);
736736
EXPECT_NEAR(stress.e31, 0.0, 1e-12);
737-
EXPECT_NEAR(stress.e32, -1.5500973166318808e-05, 1e-12);
738-
EXPECT_NEAR(stress.e33, 0.00016694998515968726, 1e-12);
737+
EXPECT_NEAR(stress.e32, -1.527806618822572e-05, 1e-12);
738+
EXPECT_NEAR(stress.e33, 0.0001669788179642309, 1e-12);
739739
}
740740

741741
TEST_F(vdwd4Test, D4SGetEnergy)
@@ -744,22 +744,22 @@ TEST_F(vdwd4Test, D4SGetEnergy)
744744
auto vdw_solver = vdw::make_vdw(ucell, input);
745745
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(false, false));
746746
const double ene = result.energy;
747-
EXPECT_NEAR(ene, -0.05638517144755526, 1E-10);
747+
EXPECT_NEAR(ene, -0.05638520357171156, 1E-10);
748748
}
749749

750750
TEST_F(vdwd4Test, D4SGetForce)
751751
{
752752
input.vdw_d4_model = "d4s";
753753
auto vdw_solver = vdw::make_vdw(ucell, input);
754754
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(true, false));
755-
EXPECT_NEAR(result.energy, -0.05638517144755526, 1E-10);
755+
EXPECT_NEAR(result.energy, -0.05638520357171156, 1E-10);
756756
ASSERT_TRUE(result.has_force);
757757
EXPECT_FALSE(result.has_stress);
758758
const std::vector<ModuleBase::Vector3<double>>& force = result.force;
759-
EXPECT_NEAR(force[0].x, -0.005448661796788402, 1e-12);
759+
EXPECT_NEAR(force[0].x, -0.005452776236973487, 1e-12);
760760
EXPECT_NEAR(force[0].y, 0.0, 1e-12);
761761
EXPECT_NEAR(force[0].z, 0.0, 1e-12);
762-
EXPECT_NEAR(force[1].x, 0.005448661796788397, 1e-12);
762+
EXPECT_NEAR(force[1].x, 0.005452776236973491, 1e-12);
763763
EXPECT_NEAR(force[1].y, 0.0, 1e-12);
764764
EXPECT_NEAR(force[1].z, 0.0, 1e-12);
765765
}
@@ -769,19 +769,19 @@ TEST_F(vdwd4Test, D4SGetStress)
769769
input.vdw_d4_model = "d4s";
770770
auto vdw_solver = vdw::make_vdw(ucell, input);
771771
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(true, true));
772-
EXPECT_NEAR(result.energy, -0.05638517144755526, 1E-10);
772+
EXPECT_NEAR(result.energy, -0.05638520357171156, 1E-10);
773773
ASSERT_TRUE(result.has_force);
774774
ASSERT_TRUE(result.has_stress);
775775
const ModuleBase::Matrix3& stress = result.stress;
776-
EXPECT_NEAR(stress.e11, 0.00013831119855416262, 1e-12);
776+
EXPECT_NEAR(stress.e11, 0.0001384186027460731, 1e-12);
777777
EXPECT_NEAR(stress.e12, 0.0, 1e-12);
778778
EXPECT_NEAR(stress.e13, 0.0, 1e-12);
779779
EXPECT_NEAR(stress.e21, 0.0, 1e-12);
780-
EXPECT_NEAR(stress.e22, 0.00015770515797834415, 1e-12);
781-
EXPECT_NEAR(stress.e23, -3.862972112000666e-05, 1e-12);
780+
EXPECT_NEAR(stress.e22, 0.00015772616666498505, 1e-12);
781+
EXPECT_NEAR(stress.e23, -3.836792114896563e-05, 1e-12);
782782
EXPECT_NEAR(stress.e31, 0.0, 1e-12);
783-
EXPECT_NEAR(stress.e32, -3.862972112000666e-05, 1e-12);
784-
EXPECT_NEAR(stress.e33, 0.00015770515797834423, 1e-12);
783+
EXPECT_NEAR(stress.e32, -3.836792114896563e-05, 1e-12);
784+
EXPECT_NEAR(stress.e33, 0.0001577261666649851, 1e-12);
785785
}
786786

787787
#endif // __DFTD4

source/source_hamilt/module_vdw/vdwd4.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ namespace vdw
2323
namespace
2424
{
2525

26+
constexpr double d4_smooth_cutoff_width_2 = 0.05; // Bohr
27+
constexpr double d4_smooth_cutoff_width_3 = 0.0; // Bohr
28+
2629
std::string to_lower(std::string value)
2730
{
2831
std::transform(value.begin(), value.end(), value.begin(), [](unsigned char c) {
@@ -191,8 +194,14 @@ void Vdwd4::compute(double& energy_ha,
191194
ModuleBase::WARNING_QUIT("Vdwd4::compute", "Unsupported DFT-D4 model: " + model_name_);
192195
}
193196

194-
dftd4_set_model_realspace_cutoff(error, model, cutoff_disp2_, cutoff_disp3_, cutoff_cn_);
195-
check_dftd4_error(error, "dftd4_set_model_realspace_cutoff");
197+
dftd4_set_model_realspace_cutoff_smooth(error,
198+
model,
199+
cutoff_disp2_,
200+
cutoff_disp3_,
201+
cutoff_cn_,
202+
d4_smooth_cutoff_width_2,
203+
d4_smooth_cutoff_width_3);
204+
check_dftd4_error(error, "dftd4_set_model_realspace_cutoff_smooth");
196205

197206
std::vector<char> method(xc_name_.begin(), xc_name_.end());
198207
method.push_back('\0');

0 commit comments

Comments
 (0)