Skip to content

Commit dee3860

Browse files
committed
Evaluate vdW corrections once per ionic step
1 parent 11d1112 commit dee3860

22 files changed

Lines changed: 445 additions & 315 deletions

source/source_esolver/esolver_double_xc.cpp

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#include "esolver_double_xc.h"
22
#include "source_hamilt/module_xc/xc_functional.h"
33
#include "source_hamilt/module_ewald/H_Ewald_pw.h"
4-
#include "source_hamilt/module_vdw/vdw.h"
54
#ifdef __MLALGO
65
#include "source_lcao/module_deepks/LCAO_deepks.h"
76
#include "source_lcao/module_deepks/LCAO_deepks_interface.h"
@@ -117,13 +116,9 @@ void ESolver_DoubleXC<TK, TR>::before_scf(UnitCell& ucell, const int istep)
117116
ESolver_KS_LCAO<TK,TR>::before_scf(ucell, istep);
118117

119118
//----------------------------------------------------------
120-
//! calculate D2 or D3 vdW
119+
//! Reuse the vdW correction prepared by ESolver_FP::before_scf.
121120
//----------------------------------------------------------
122-
auto vdw_solver = vdw::make_vdw(ucell, PARAM.inp, &(GlobalV::ofs_running));
123-
if (vdw_solver != nullptr)
124-
{
125-
this->pelec_base->f_en.evdw = vdw_solver->get_energy();
126-
}
121+
this->pelec_base->f_en.evdw = this->pelec->f_en.evdw;
127122

128123
//----------------------------------------------------------
129124
//! calculate ewald energy
@@ -382,6 +377,7 @@ void ESolver_DoubleXC<TK, TR>::cal_force(UnitCell& ucell, ModuleBase::matrix& fo
382377
this->deepks.dpks_out_type = "base"; // for deepks method
383378

384379
fsl.getForceStress(ucell,
380+
this->get_vdw_result(),
385381
PARAM.inp.cal_force,
386382
PARAM.inp.cal_stress,
387383
PARAM.inp.test_force,

source/source_esolver/esolver_fp.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,11 +187,18 @@ void ESolver_FP::before_scf(UnitCell& ucell, const int istep)
187187
GlobalV::ofs_running, GlobalV::ofs_warning);
188188
}
189189

190-
//! calculate D2 or D3 vdW
190+
//! Evaluate the vdW correction once for this ionic configuration.
191+
this->vdw_result_.reset();
191192
auto vdw_solver = vdw::make_vdw(ucell, PARAM.inp, &(GlobalV::ofs_running));
192193
if (vdw_solver != nullptr)
193194
{
194-
this->pelec->f_en.evdw = vdw_solver->get_energy();
195+
const vdw::VdwRequest request(PARAM.inp.cal_force, PARAM.inp.cal_stress);
196+
this->vdw_result_.reset(new vdw::VdwResult(vdw_solver->evaluate(request)));
197+
this->pelec->f_en.evdw = this->vdw_result_->energy;
198+
}
199+
else
200+
{
201+
this->pelec->f_en.evdw = 0.0;
195202
}
196203

197204
//! calculate ewald energy

source/source_esolver/esolver_fp.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@
1414
#include "source_pw/module_pwdft/structure_factor.h" // structure factor
1515

1616
#include <fstream>
17+
#include <memory>
18+
19+
namespace vdw
20+
{
21+
struct VdwResult;
22+
}
1723

1824

1925
//! The First-Principles (FP) Energy Solver Class
@@ -45,6 +51,11 @@ class ESolver_FP: public ESolver
4551

4652
virtual void iter_finish(UnitCell& ucell, const int istep, int& iter, bool &conv_esolver);
4753

54+
const vdw::VdwResult* get_vdw_result() const { return this->vdw_result_.get(); }
55+
56+
//! vdW correction evaluated once for the current ionic configuration.
57+
std::unique_ptr<const vdw::VdwResult> vdw_result_;
58+
4859
//! These pointers will be deleted in the free_pointers() function every ion step.
4960
elecstate::ElecState* pelec = nullptr; ///< Electronic states
5061

source/source_esolver/esolver_ks_lcao.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ void ESolver_KS_LCAO<TK, TR>::cal_force(UnitCell& ucell, ModuleBase::matrix& for
242242

243243
deepks.dpks_out_type = "tot"; // for deepks method
244244

245-
fsl.getForceStress(ucell, PARAM.inp.cal_force, PARAM.inp.cal_stress,
245+
fsl.getForceStress(ucell, this->get_vdw_result(), PARAM.inp.cal_force, PARAM.inp.cal_stress,
246246
PARAM.inp.test_force, PARAM.inp.test_stress,
247247
this->gd, this->pv, this->pelec, this->dmat, this->psi,
248248
two_center_bundle_, orb_, force, this->scs,

source/source_esolver/esolver_ks_pw.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ void ESolver_KS_PW<T, Device>::cal_force(UnitCell& ucell, ModuleBase::matrix& fo
311311
this->stp.update_psi_d();
312312

313313
// Calculate forces
314-
ff.cal_force(ucell, force, *this->pelec, this->pw_rhod, &ucell.symm,
314+
ff.cal_force(ucell, force, this->get_vdw_result(), *this->pelec, this->pw_rhod, &ucell.symm,
315315
&this->sf, this->solvent, &this->dftu, &this->locpp, &this->ppcell,
316316
&this->kv, this->pw_wfc, this->stp.template get_psi_d<T, Device>());
317317
}
@@ -324,7 +324,7 @@ void ESolver_KS_PW<T, Device>::cal_stress(UnitCell& ucell, ModuleBase::matrix& s
324324
// mohan add 2025-10-12
325325
this->stp.update_psi_d();
326326

327-
ss.cal_stress(stress, ucell, this->dftu, this->locpp, this->ppcell, this->pw_rhod,
327+
ss.cal_stress(stress, ucell, this->get_vdw_result(), this->dftu, this->locpp, this->ppcell, this->pw_rhod,
328328
&ucell.symm, &this->sf, &this->kv, this->pw_wfc, this->stp.template get_psi_d<T, Device>());
329329

330330
// external stress

source/source_esolver/esolver_of.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -546,7 +546,8 @@ void ESolver_OF::cal_force(UnitCell& ucell, ModuleBase::matrix& force)
546546

547547
// here nullptr is for DFT+U, which may cause bugs, mohan note 2025-11-07
548548
// solvent can be used? mohan ask 2025-11-07
549-
ff.cal_force(ucell, force, *pelec, this->pw_rho, &ucell.symm, &sf, this->solvent, nullptr, &this->locpp);
549+
ff.cal_force(ucell, force, this->get_vdw_result(), *pelec, this->pw_rho, &ucell.symm, &sf,
550+
this->solvent, nullptr, &this->locpp);
550551
}
551552

552553
/**
@@ -562,6 +563,6 @@ void ESolver_OF::cal_stress(UnitCell& ucell, ModuleBase::matrix& stress)
562563
this->pphi_, this->pw_rho, kinetic_stress_); // kinetic stress
563564

564565
OF_Stress_PW ss(this->pelec, this->pw_rho);
565-
ss.cal_stress(stress, kinetic_stress_, ucell, &ucell.symm, this->locpp, &sf, &kv);
566+
ss.cal_stress(stress, kinetic_stress_, ucell, this->get_vdw_result(), &ucell.symm, this->locpp, &sf, &kv);
566567
}
567568
} // namespace ModuleESolver

source/source_hamilt/module_vdw/test/vdw_test.cpp

Lines changed: 89 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
* - vdw::make_vdw():
2626
* Based on the value of INPUT.vdw_method, construct
2727
* Vdwd2 or Vdwd3 class, and do the initialization.
28-
* - vdw::get_energy()/vdw::get_force()/vdw::get_stress():
29-
* Calculate the VDW (d2, d3_0 and d3_bj types) enerygy, force, stress.
28+
* - vdw::Vdw::evaluate():
29+
* Calculate the requested vdW energy, force and stress in one evaluation.
3030
* - Vdwd2Parameters::initial_parameters()
3131
* - Vdwd3Parameters::initial_parameters()
3232
*/
@@ -313,21 +313,26 @@ TEST_F(vdwd2Test, D2R0ZeroQuit)
313313
vdwd2_test.parameter().R0_["Si"] = 0.0;
314314

315315
testing::internal::CaptureStdout();
316-
EXPECT_EXIT(vdwd2_test.get_energy(), ::testing::ExitedWithCode(1), "");
316+
EXPECT_EXIT(vdwd2_test.evaluate(vdw::VdwRequest(false, false)), ::testing::ExitedWithCode(1), "");
317317
std::string output = testing::internal::GetCapturedStdout();
318318
}
319319

320320
TEST_F(vdwd2Test, D2GetEnergy)
321321
{
322322
auto vdw_solver = vdw::make_vdw(ucell, input);
323-
double ene = vdw_solver->get_energy();
323+
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(false, false));
324+
const double ene = result.energy;
324325
EXPECT_NEAR(ene,-0.034526673470525196,1E-10);
325326
}
326327

327328
TEST_F(vdwd2Test, D2GetForce)
328329
{
329330
auto vdw_solver = vdw::make_vdw(ucell, input);
330-
std::vector<ModuleBase::Vector3<double>> force = vdw_solver->get_force();
331+
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(true, false));
332+
EXPECT_NEAR(result.energy, -0.034526673470525196, 1E-10);
333+
ASSERT_TRUE(result.has_force);
334+
EXPECT_FALSE(result.has_stress);
335+
const std::vector<ModuleBase::Vector3<double>>& force = result.force;
331336
EXPECT_NEAR(force[0].x, -0.00078824525563651242,1e-12);
332337
EXPECT_NEAR(force[0].y, 2.6299822052061785e-08,1e-12);
333338
EXPECT_NEAR(force[0].z, 2.6299822050796364e-08,1e-12);
@@ -339,7 +344,11 @@ TEST_F(vdwd2Test, D2GetForce)
339344
TEST_F(vdwd2Test, D2GetStress)
340345
{
341346
auto vdw_solver = vdw::make_vdw(ucell, input);
342-
ModuleBase::Matrix3 stress = vdw_solver->get_stress();
347+
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(true, true));
348+
EXPECT_NEAR(result.energy, -0.034526673470525196, 1E-10);
349+
ASSERT_TRUE(result.has_force);
350+
ASSERT_TRUE(result.has_stress);
351+
const ModuleBase::Matrix3& stress = result.stress;
343352
EXPECT_NEAR(stress.e11, -0.00020532319044269705,1e-12);
344353
EXPECT_NEAR(stress.e12, -3.5642821939401251e-08,1e-12);
345354
EXPECT_NEAR(stress.e13, -3.5642821939437223e-08,1e-12);
@@ -433,14 +442,19 @@ TEST_F(vdwd3Test, D30Period)
433442
TEST_F(vdwd3Test, D30GetEnergy)
434443
{
435444
auto vdw_solver = vdw::make_vdw(ucell, input);
436-
double ene = vdw_solver->get_energy();
445+
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(false, false));
446+
const double ene = result.energy;
437447
EXPECT_NEAR(ene,-0.20932367230529664,1E-10);
438448
}
439449

440450
TEST_F(vdwd3Test, D30GetForce)
441451
{
442452
auto vdw_solver = vdw::make_vdw(ucell, input);
443-
std::vector<ModuleBase::Vector3<double>> force = vdw_solver->get_force();
453+
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(true, false));
454+
EXPECT_NEAR(result.energy, -0.20932367230529664, 1E-10);
455+
ASSERT_TRUE(result.has_force);
456+
EXPECT_FALSE(result.has_stress);
457+
const std::vector<ModuleBase::Vector3<double>>& force = result.force;
444458
EXPECT_NEAR(force[0].x, -0.032450975169023302,1e-12);
445459
EXPECT_NEAR(force[0].y, 0.0,1e-12);
446460
EXPECT_NEAR(force[0].z, 0.0,1e-12);
@@ -452,7 +466,11 @@ TEST_F(vdwd3Test, D30GetForce)
452466
TEST_F(vdwd3Test, D30GetStress)
453467
{
454468
auto vdw_solver = vdw::make_vdw(ucell, input);
455-
ModuleBase::Matrix3 stress = vdw_solver->get_stress();
469+
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(true, true));
470+
EXPECT_NEAR(result.energy, -0.20932367230529664, 1E-10);
471+
ASSERT_TRUE(result.has_force);
472+
ASSERT_TRUE(result.has_stress);
473+
const ModuleBase::Matrix3& stress = result.stress;
456474
EXPECT_NEAR(stress.e11, -0.0011141545452036336,1e-12);
457475
EXPECT_NEAR(stress.e12, 0.0,1e-12);
458476
EXPECT_NEAR(stress.e13, 0.0,1e-12);
@@ -468,15 +486,20 @@ TEST_F(vdwd3Test, D3bjGetEnergy)
468486
{
469487
input.vdw_method = "d3_bj";
470488
auto vdw_solver = vdw::make_vdw(ucell, input);
471-
double ene = vdw_solver->get_energy();
489+
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(false, false));
490+
const double ene = result.energy;
472491
EXPECT_NEAR(ene,-0.047458675421836918,1E-10);
473492
}
474493

475494
TEST_F(vdwd3Test, D3bjGetForce)
476495
{
477496
input.vdw_method = "d3_bj";
478497
auto vdw_solver = vdw::make_vdw(ucell, input);
479-
std::vector<ModuleBase::Vector3<double>> force = vdw_solver->get_force();
498+
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(true, false));
499+
EXPECT_NEAR(result.energy, -0.047458675421836918, 1E-10);
500+
ASSERT_TRUE(result.has_force);
501+
EXPECT_FALSE(result.has_stress);
502+
const std::vector<ModuleBase::Vector3<double>>& force = result.force;
480503
EXPECT_NEAR(force[0].x, -0.0026006968781200602,1e-12);
481504
EXPECT_NEAR(force[0].y, 0.0,1e-12);
482505
EXPECT_NEAR(force[0].z, 0.0,1e-12);
@@ -489,7 +512,11 @@ TEST_F(vdwd3Test, D3bjGetStress)
489512
{
490513
input.vdw_method = "d3_bj";
491514
auto vdw_solver = vdw::make_vdw(ucell, input);
492-
ModuleBase::Matrix3 stress = vdw_solver->get_stress();
515+
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(true, true));
516+
EXPECT_NEAR(result.energy, -0.047458675421836918, 1E-10);
517+
ASSERT_TRUE(result.has_force);
518+
ASSERT_TRUE(result.has_stress);
519+
const ModuleBase::Matrix3& stress = result.stress;
493520
EXPECT_NEAR(stress.e11, -0.00014376286737216365,1e-12);
494521
EXPECT_NEAR(stress.e12, 0.0,1e-12);
495522
EXPECT_NEAR(stress.e13, 0.0,1e-12);
@@ -538,14 +565,19 @@ class vdwd3abcTest: public testing::Test
538565
TEST_F(vdwd3abcTest, D30GetEnergy)
539566
{
540567
auto vdw_solver = vdw::make_vdw(ucell, input);
541-
double ene = vdw_solver->get_energy();
568+
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(false, false));
569+
const double ene = result.energy;
542570
EXPECT_NEAR(ene,-0.11487062308916372,1E-10);
543571
}
544572

545573
TEST_F(vdwd3abcTest, D30GetForce)
546574
{
547575
auto vdw_solver = vdw::make_vdw(ucell, input);
548-
std::vector<ModuleBase::Vector3<double>> force = vdw_solver->get_force();
576+
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(true, false));
577+
EXPECT_NEAR(result.energy, -0.11487062308916372, 1E-10);
578+
ASSERT_TRUE(result.has_force);
579+
EXPECT_FALSE(result.has_stress);
580+
const std::vector<ModuleBase::Vector3<double>>& force = result.force;
549581
EXPECT_NEAR(force[0].x, 0.030320738678429094,1e-12);
550582
EXPECT_NEAR(force[0].y, 0.025570534655235538,1e-12);
551583
EXPECT_NEAR(force[0].z, 0.025570534655235538,1e-12);
@@ -557,7 +589,11 @@ TEST_F(vdwd3abcTest, D30GetForce)
557589
TEST_F(vdwd3abcTest, D30GetStress)
558590
{
559591
auto vdw_solver = vdw::make_vdw(ucell, input);
560-
ModuleBase::Matrix3 stress = vdw_solver->get_stress();
592+
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(true, true));
593+
EXPECT_NEAR(result.energy, -0.11487062308916372, 1E-10);
594+
ASSERT_TRUE(result.has_force);
595+
ASSERT_TRUE(result.has_stress);
596+
const ModuleBase::Matrix3& stress = result.stress;
561597
EXPECT_NEAR(stress.e11, -0.00023421562840819491,1e-12);
562598
EXPECT_NEAR(stress.e12, -0.00015112406243413323,1e-12);
563599
EXPECT_NEAR(stress.e13, -0.00015112406243413302,1e-12);
@@ -573,15 +609,20 @@ TEST_F(vdwd3abcTest, D3bjGetEnergy)
573609
{
574610
input.vdw_method = "d3_bj";
575611
auto vdw_solver = vdw::make_vdw(ucell, input);
576-
double ene = vdw_solver->get_energy();
612+
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(false, false));
613+
const double ene = result.energy;
577614
EXPECT_NEAR(ene,-0.030667806197006021,1E-10);
578615
}
579616

580617
TEST_F(vdwd3abcTest, D3bjGetForce)
581618
{
582619
input.vdw_method = "d3_bj";
583620
auto vdw_solver = vdw::make_vdw(ucell, input);
584-
std::vector<ModuleBase::Vector3<double>> force = vdw_solver->get_force();
621+
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(true, false));
622+
EXPECT_NEAR(result.energy, -0.030667806197006021, 1E-10);
623+
ASSERT_TRUE(result.has_force);
624+
EXPECT_FALSE(result.has_stress);
625+
const std::vector<ModuleBase::Vector3<double>>& force = result.force;
585626
EXPECT_NEAR(force[0].x, -0.0010630099217696475,1e-12);
586627
EXPECT_NEAR(force[0].y, -0.0010031953309458587,1e-12);
587628
EXPECT_NEAR(force[0].z, -0.0010031953309458642,1e-12);
@@ -594,7 +635,11 @@ TEST_F(vdwd3abcTest, D3bjGetStress)
594635
{
595636
input.vdw_method = "d3_bj";
596637
auto vdw_solver = vdw::make_vdw(ucell, input);
597-
ModuleBase::Matrix3 stress = vdw_solver->get_stress();
638+
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(true, true));
639+
EXPECT_NEAR(result.energy, -0.030667806197006021, 1E-10);
640+
ASSERT_TRUE(result.has_force);
641+
ASSERT_TRUE(result.has_stress);
642+
const ModuleBase::Matrix3& stress = result.stress;
598643
EXPECT_NEAR(stress.e11, -3.3803329202372578e-05,1e-12);
599644
EXPECT_NEAR(stress.e12, 5.1291622417145846e-06,1e-12);
600645
EXPECT_NEAR(stress.e13, 5.1291622417145889e-06,1e-12);
@@ -643,7 +688,8 @@ class vdwd4Test: public testing::Test
643688
TEST_F(vdwd4Test, D4GetEnergy)
644689
{
645690
auto vdw_solver = vdw::make_vdw(ucell, input);
646-
double ene = vdw_solver->get_energy();
691+
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(false, false));
692+
const double ene = result.energy;
647693
EXPECT_NEAR(ene, -0.04998837990336073, 1E-10);
648694
}
649695

@@ -652,14 +698,19 @@ TEST_F(vdwd4Test, D4GetEnergyForChargedSystem)
652698
input.nelec = 7.0;
653699

654700
auto vdw_solver = vdw::make_vdw(ucell, input);
655-
const double ene = vdw_solver->get_energy();
701+
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(false, false));
702+
const double ene = result.energy;
656703
EXPECT_NEAR(ene, -0.04359451765256733, 1E-10);
657704
}
658705

659706
TEST_F(vdwd4Test, D4GetForce)
660707
{
661708
auto vdw_solver = vdw::make_vdw(ucell, input);
662-
std::vector<ModuleBase::Vector3<double>> force = vdw_solver->get_force();
709+
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(true, false));
710+
EXPECT_NEAR(result.energy, -0.04998837990336073, 1E-10);
711+
ASSERT_TRUE(result.has_force);
712+
EXPECT_FALSE(result.has_stress);
713+
const std::vector<ModuleBase::Vector3<double>>& force = result.force;
663714
EXPECT_NEAR(force[0].x, -0.0023357259921368717, 1e-12);
664715
EXPECT_NEAR(force[0].y, 0.0, 1e-12);
665716
EXPECT_NEAR(force[0].z, 0.0, 1e-12);
@@ -671,7 +722,11 @@ TEST_F(vdwd4Test, D4GetForce)
671722
TEST_F(vdwd4Test, D4GetStress)
672723
{
673724
auto vdw_solver = vdw::make_vdw(ucell, input);
674-
ModuleBase::Matrix3 stress = vdw_solver->get_stress();
725+
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(true, true));
726+
EXPECT_NEAR(result.energy, -0.04998837990336073, 1E-10);
727+
ASSERT_TRUE(result.has_force);
728+
ASSERT_TRUE(result.has_stress);
729+
const ModuleBase::Matrix3& stress = result.stress;
675730
EXPECT_NEAR(stress.e11, 0.00015830384474877792, 1e-12);
676731
EXPECT_NEAR(stress.e12, 0.0, 1e-12);
677732
EXPECT_NEAR(stress.e13, 0.0, 1e-12);
@@ -687,15 +742,20 @@ TEST_F(vdwd4Test, D4SGetEnergy)
687742
{
688743
input.vdw_d4_model = "d4s";
689744
auto vdw_solver = vdw::make_vdw(ucell, input);
690-
double ene = vdw_solver->get_energy();
745+
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(false, false));
746+
const double ene = result.energy;
691747
EXPECT_NEAR(ene, -0.05638517144755526, 1E-10);
692748
}
693749

694750
TEST_F(vdwd4Test, D4SGetForce)
695751
{
696752
input.vdw_d4_model = "d4s";
697753
auto vdw_solver = vdw::make_vdw(ucell, input);
698-
std::vector<ModuleBase::Vector3<double>> force = vdw_solver->get_force();
754+
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(true, false));
755+
EXPECT_NEAR(result.energy, -0.05638517144755526, 1E-10);
756+
ASSERT_TRUE(result.has_force);
757+
EXPECT_FALSE(result.has_stress);
758+
const std::vector<ModuleBase::Vector3<double>>& force = result.force;
699759
EXPECT_NEAR(force[0].x, -0.005448661796788402, 1e-12);
700760
EXPECT_NEAR(force[0].y, 0.0, 1e-12);
701761
EXPECT_NEAR(force[0].z, 0.0, 1e-12);
@@ -708,7 +768,11 @@ TEST_F(vdwd4Test, D4SGetStress)
708768
{
709769
input.vdw_d4_model = "d4s";
710770
auto vdw_solver = vdw::make_vdw(ucell, input);
711-
ModuleBase::Matrix3 stress = vdw_solver->get_stress();
771+
const vdw::VdwResult result = vdw_solver->evaluate(vdw::VdwRequest(true, true));
772+
EXPECT_NEAR(result.energy, -0.05638517144755526, 1E-10);
773+
ASSERT_TRUE(result.has_force);
774+
ASSERT_TRUE(result.has_stress);
775+
const ModuleBase::Matrix3& stress = result.stress;
712776
EXPECT_NEAR(stress.e11, 0.00013831119855416262, 1e-12);
713777
EXPECT_NEAR(stress.e12, 0.0, 1e-12);
714778
EXPECT_NEAR(stress.e13, 0.0, 1e-12);

0 commit comments

Comments
 (0)