|
10 | 10 | #include "source_hamilt/module_vdw/vdwd3_parameters.h" |
11 | 11 | #include "source_hamilt/module_vdw/vdwd2.h" |
12 | 12 | #include "source_hamilt/module_vdw/vdwd3.h" |
| 13 | +#ifdef __DFTD4 |
| 14 | +#include "source_hamilt/module_vdw/vdwd4.h" |
| 15 | +#endif |
13 | 16 | #include "source_hamilt/module_vdw/vdw.h" |
14 | 17 | #undef private |
15 | 18 |
|
@@ -604,6 +607,111 @@ TEST_F(vdwd3abcTest, D3bjGetStress) |
604 | 607 | EXPECT_NEAR(stress.e33, -3.4278442125590892e-05,1e-12); |
605 | 608 | } |
606 | 609 |
|
| 610 | +#ifdef __DFTD4 |
| 611 | + |
| 612 | +class vdwd4Test: public testing::Test |
| 613 | +{ |
| 614 | + protected: |
| 615 | + UnitCell ucell; |
| 616 | + Input_para input; |
| 617 | + |
| 618 | + void SetUp(){ |
| 619 | + stru_ structure{std::vector<double>{0.5,0.5,0.0,0.5,0.0,0.5,0.0,0.5,0.5}, |
| 620 | + std::vector<atomtype_>{atomtype_{"Si", |
| 621 | + std::vector<std::vector<double>>{ |
| 622 | + {0., 0., 0.}, |
| 623 | + {0.3, 0.25, 0.25} |
| 624 | + }}}}; |
| 625 | + construct_ucell(structure,ucell); |
| 626 | + |
| 627 | + input.vdw_method = "d4"; |
| 628 | + input.vdw_d4_xc = "pbe"; |
| 629 | + input.vdw_d4_model = "d4"; |
| 630 | + input.vdw_cutoff_type = "radius"; |
| 631 | + input.vdw_radius_unit = "Bohr"; |
| 632 | + input.vdw_cutoff_radius = "60"; |
| 633 | + input.vdw_cn_thr_unit = "Bohr"; |
| 634 | + input.vdw_cn_thr = 30; |
| 635 | + } |
| 636 | + |
| 637 | + void TearDown(){ |
| 638 | + ClearUcell(ucell); |
| 639 | + } |
| 640 | +}; |
| 641 | + |
| 642 | +TEST_F(vdwd4Test, D4GetEnergy) |
| 643 | +{ |
| 644 | + auto vdw_solver = vdw::make_vdw(ucell, input); |
| 645 | + double ene = vdw_solver->get_energy(); |
| 646 | + EXPECT_NEAR(ene, -0.04998837990336073, 1E-10); |
| 647 | +} |
| 648 | + |
| 649 | +TEST_F(vdwd4Test, D4GetForce) |
| 650 | +{ |
| 651 | + auto vdw_solver = vdw::make_vdw(ucell, input); |
| 652 | + std::vector<ModuleBase::Vector3<double>> force = vdw_solver->get_force(); |
| 653 | + EXPECT_NEAR(force[0].x, -0.0023357259921368717, 1e-12); |
| 654 | + EXPECT_NEAR(force[0].y, 0.0, 1e-12); |
| 655 | + EXPECT_NEAR(force[0].z, 0.0, 1e-12); |
| 656 | + EXPECT_NEAR(force[1].x, 0.0023357259921368730, 1e-12); |
| 657 | + EXPECT_NEAR(force[1].y, 0.0, 1e-12); |
| 658 | + EXPECT_NEAR(force[1].z, 0.0, 1e-12); |
| 659 | +} |
| 660 | + |
| 661 | +TEST_F(vdwd4Test, D4GetStress) |
| 662 | +{ |
| 663 | + auto vdw_solver = vdw::make_vdw(ucell, input); |
| 664 | + ModuleBase::Matrix3 stress = vdw_solver->get_stress(); |
| 665 | + EXPECT_NEAR(stress.e11, 0.00015830384474877792, 1e-12); |
| 666 | + EXPECT_NEAR(stress.e12, 0.0, 1e-12); |
| 667 | + EXPECT_NEAR(stress.e13, 0.0, 1e-12); |
| 668 | + EXPECT_NEAR(stress.e21, 0.0, 1e-12); |
| 669 | + EXPECT_NEAR(stress.e22, 0.00016694998515968720, 1e-12); |
| 670 | + EXPECT_NEAR(stress.e23, -1.5500973166318808e-05, 1e-12); |
| 671 | + EXPECT_NEAR(stress.e31, 0.0, 1e-12); |
| 672 | + EXPECT_NEAR(stress.e32, -1.5500973166318808e-05, 1e-12); |
| 673 | + EXPECT_NEAR(stress.e33, 0.00016694998515968726, 1e-12); |
| 674 | +} |
| 675 | + |
| 676 | +TEST_F(vdwd4Test, D4SGetEnergy) |
| 677 | +{ |
| 678 | + input.vdw_d4_model = "d4s"; |
| 679 | + auto vdw_solver = vdw::make_vdw(ucell, input); |
| 680 | + double ene = vdw_solver->get_energy(); |
| 681 | + EXPECT_NEAR(ene, -0.05638517144755526, 1E-10); |
| 682 | +} |
| 683 | + |
| 684 | +TEST_F(vdwd4Test, D4SGetForce) |
| 685 | +{ |
| 686 | + input.vdw_d4_model = "d4s"; |
| 687 | + auto vdw_solver = vdw::make_vdw(ucell, input); |
| 688 | + std::vector<ModuleBase::Vector3<double>> force = vdw_solver->get_force(); |
| 689 | + EXPECT_NEAR(force[0].x, -0.005448661796788402, 1e-12); |
| 690 | + EXPECT_NEAR(force[0].y, 0.0, 1e-12); |
| 691 | + EXPECT_NEAR(force[0].z, 0.0, 1e-12); |
| 692 | + EXPECT_NEAR(force[1].x, 0.005448661796788397, 1e-12); |
| 693 | + EXPECT_NEAR(force[1].y, 0.0, 1e-12); |
| 694 | + EXPECT_NEAR(force[1].z, 0.0, 1e-12); |
| 695 | +} |
| 696 | + |
| 697 | +TEST_F(vdwd4Test, D4SGetStress) |
| 698 | +{ |
| 699 | + input.vdw_d4_model = "d4s"; |
| 700 | + auto vdw_solver = vdw::make_vdw(ucell, input); |
| 701 | + ModuleBase::Matrix3 stress = vdw_solver->get_stress(); |
| 702 | + EXPECT_NEAR(stress.e11, 0.00013831119855416262, 1e-12); |
| 703 | + EXPECT_NEAR(stress.e12, 0.0, 1e-12); |
| 704 | + EXPECT_NEAR(stress.e13, 0.0, 1e-12); |
| 705 | + EXPECT_NEAR(stress.e21, 0.0, 1e-12); |
| 706 | + EXPECT_NEAR(stress.e22, 0.00015770515797834415, 1e-12); |
| 707 | + EXPECT_NEAR(stress.e23, -3.862972112000666e-05, 1e-12); |
| 708 | + EXPECT_NEAR(stress.e31, 0.0, 1e-12); |
| 709 | + EXPECT_NEAR(stress.e32, -3.862972112000666e-05, 1e-12); |
| 710 | + EXPECT_NEAR(stress.e33, 0.00015770515797834423, 1e-12); |
| 711 | +} |
| 712 | + |
| 713 | +#endif // __DFTD4 |
| 714 | + |
607 | 715 | int main(int argc, char **argv) |
608 | 716 | { |
609 | 717 | MPI_Init(&argc, &argv); |
|
0 commit comments