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
320320TEST_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
327328TEST_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)
339344TEST_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)
433442TEST_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
440450TEST_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)
452466TEST_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
475494TEST_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
538565TEST_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
545573TEST_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)
557589TEST_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
580617TEST_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
643688TEST_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
659706TEST_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)
671722TEST_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
694750TEST_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