diff --git a/.gitignore b/.gitignore index ad33721f56e..5ac775e3b60 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ obj OUT.* log.txt result.out +test.sum *.dat .DS_Store .cache diff --git a/source/source_lcao/module_deepks/test/CMakeLists.txt b/source/source_lcao/module_deepks/test/CMakeLists.txt index 486fad10ea7..1a382b9c745 100644 --- a/source/source_lcao/module_deepks/test/CMakeLists.txt +++ b/source/source_lcao/module_deepks/test/CMakeLists.txt @@ -1,6 +1,19 @@ -add_executable( - test_deepks - main_deepks.cpp klist_1.cpp LCAO_deepks_test_prep.cpp LCAO_deepks_test.cpp +file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/support DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +set(DEEPKS_UT_PP_ORB_DIR "${PROJECT_SOURCE_DIR}/tests/PP_ORB") +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/support/NO_GO_deepks_UT/STRU + ${CMAKE_CURRENT_BINARY_DIR}/support/NO_GO_deepks_UT/STRU + @ONLY +) +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/support/NO_KP_deepks_UT/STRU + ${CMAKE_CURRENT_BINARY_DIR}/support/NO_KP_deepks_UT/STRU + @ONLY +) + +set(DEEPKS_UNIT_COMMON_SOURCES + deepks_test_prep.cpp + deepks_test.cpp ../../../source_cell/unitcell.cpp ../../../source_cell/update_cell.cpp ../../../source_cell/bcast_cell.cpp @@ -11,6 +24,9 @@ add_executable( ../../../source_cell/read_stru.cpp ../../../source_cell/print_cell.cpp ../../../source_cell/read_atom_species.cpp + ../../../source_cell/klist.cpp + ../../../source_cell/parallel_kpoints.cpp + ../../../source_cell/k_vector_utils.cpp ../../../source_cell/setup_nonlocal.cpp ../../../source_cell/pseudo.cpp ../../../source_cell/read_pp.cpp @@ -22,7 +38,6 @@ add_executable( ../../../source_cell/sep.cpp ../../../source_cell/sep_cell.cpp ../../../source_pw/module_pwdft/soc.cpp - ../../../source_io/module_output/sparse_matrix.cpp ../../../source_estate/read_pseudo.cpp ../../../source_estate/cal_wfc.cpp @@ -30,6 +45,9 @@ add_executable( ../../../source_estate/cal_nelec_nband.cpp ../../../source_estate/module_dm/density_matrix.cpp ../../../source_estate/module_dm/density_matrix_io.cpp + ../../center2_orb.cpp + ../../center2_orb-orb11.cpp + ../../center2_orb-orb21.cpp ../../module_hcontainer/base_matrix.cpp ../../module_hcontainer/hcontainer.cpp ../../module_hcontainer/atom_pair.cpp @@ -40,24 +58,297 @@ add_executable( ../../module_operator_lcao/deepks_lcao.cpp ../../module_operator_lcao/operator_lcao.cpp ../../../source_hamilt/operator.cpp + ../../../source_io/module_hs/cal_r_overlap_R.cpp + ../../../source_io/module_hs/single_R_io.cpp + ../../../source_io/module_hs/rr_sparse_writer.cpp ../../module_rt/td_folding.cpp + mock_berryphase.cpp mock_tdinfo.cpp ) -target_link_libraries( - test_deepks - PRIVATE - base device parameter deepks psi planewave neighbor container - orb gint numerical_atomic_orbitals - ${math_libs} -) +add_library(deepks_unit_support OBJECT ${DEEPKS_UNIT_COMMON_SOURCES}) if(ENABLE_COVERAGE) - add_coverage(test_deepks) + add_coverage(deepks_unit_support) endif() +set(DEEPKS_UNIT_LIBS + deepks_unit_support + base + device + parameter + deepks + psi + planewave + neighbor + container + orb + gint + numerical_atomic_orbitals + symmetry + ${math_libs} +) + +set(DEEPKS_UNIT_PHIALPHA_SOURCES + deepks_test_phialpha.cpp +) +set(DEEPKS_UNIT_PDM_SOURCES + ${DEEPKS_UNIT_PHIALPHA_SOURCES} + deepks_test_pdm.cpp +) +set(DEEPKS_UNIT_DESCRIPTOR_SOURCES + ${DEEPKS_UNIT_PDM_SOURCES} + deepks_test_descriptor.cpp +) +set(DEEPKS_UNIT_GDMX_SOURCES + ${DEEPKS_UNIT_PDM_SOURCES} + deepks_test_gdmx.cpp +) +set(DEEPKS_UNIT_GVX_SOURCES + ${DEEPKS_UNIT_DESCRIPTOR_SOURCES} + deepks_test_gdmx.cpp + deepks_test_gvx.cpp +) +set(DEEPKS_UNIT_GDMEPSL_SOURCES + ${DEEPKS_UNIT_PDM_SOURCES} + deepks_test_gdmepsl.cpp +) +set(DEEPKS_UNIT_GVEPSL_SOURCES + ${DEEPKS_UNIT_DESCRIPTOR_SOURCES} + deepks_test_gdmepsl.cpp + deepks_test_gvepsl.cpp +) +set(DEEPKS_UNIT_ORBPRE_SOURCES + ${DEEPKS_UNIT_DESCRIPTOR_SOURCES} + deepks_test_orbpre.cpp +) +set(DEEPKS_UNIT_VDPRE_SOURCES + ${DEEPKS_UNIT_DESCRIPTOR_SOURCES} + deepks_test_vdpre.cpp +) +set(DEEPKS_UNIT_VDRPRE_SOURCES + ${DEEPKS_UNIT_DESCRIPTOR_SOURCES} + deepks_test_vdrpre.cpp +) +set(DEEPKS_UNIT_EDELTA_SOURCES + ${DEEPKS_UNIT_DESCRIPTOR_SOURCES} + deepks_test_edelta.cpp +) +set(DEEPKS_UNIT_E_DELTABANDS_SOURCES + ${DEEPKS_UNIT_EDELTA_SOURCES} + deepks_test_e_deltabands.cpp +) +set(DEEPKS_UNIT_FORCE_STRESS_DELTA_SOURCES + ${DEEPKS_UNIT_EDELTA_SOURCES} + deepks_test_force_stress_delta.cpp +) +set(DEEPKS_UNIT_O_DELTA_SOURCES + ${DEEPKS_UNIT_E_DELTABANDS_SOURCES} + deepks_test_o_delta.cpp +) + +function(configure_deepks_unit_target TARGET_NAME CHECK_NAME CASE_DIR) + target_compile_definitions( + ${TARGET_NAME} + PRIVATE + DEEPKS_UT_CHECK_NAME="${CHECK_NAME}" + DEEPKS_UT_CASE_DIR="${CASE_DIR}" + DEEPKS_UT_RUNNER=run_deepks_unit_${CHECK_NAME} + ) +endfunction() + +AddTest( + TARGET MODULE_LCAO_DEEPKS_phialpha_gamma + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_PHIALPHA_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_phialpha_gamma phialpha NO_GO_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_pdm_gamma + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_PDM_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_pdm_gamma pdm NO_GO_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_descriptor_gamma + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_DESCRIPTOR_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_descriptor_gamma descriptor NO_GO_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_gdmx_gamma + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_GDMX_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_gdmx_gamma gdmx NO_GO_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_gvx_gamma + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_GVX_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_gvx_gamma gvx NO_GO_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_gdmepsl_gamma + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_GDMEPSL_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_gdmepsl_gamma gdmepsl NO_GO_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_gvepsl_gamma + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_GVEPSL_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_gvepsl_gamma gvepsl NO_GO_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_orbpre_gamma + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_ORBPRE_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_orbpre_gamma orbpre NO_GO_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_vdpre_gamma + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_VDPRE_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_vdpre_gamma vdpre NO_GO_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_vdrpre_gamma + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_VDRPRE_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_vdrpre_gamma vdrpre NO_GO_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_edelta_gamma + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_EDELTA_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_edelta_gamma edelta NO_GO_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_e_deltabands_gamma + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_E_DELTABANDS_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_e_deltabands_gamma e_deltabands NO_GO_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_force_stress_delta_gamma + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_FORCE_STRESS_DELTA_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_force_stress_delta_gamma force_stress_delta NO_GO_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_o_delta_gamma + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_O_DELTA_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_o_delta_gamma o_delta NO_GO_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_phialpha_multik + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_PHIALPHA_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_phialpha_multik phialpha NO_KP_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_pdm_multik + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_PDM_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_pdm_multik pdm NO_KP_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_descriptor_multik + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_DESCRIPTOR_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_descriptor_multik descriptor NO_KP_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_gdmx_multik + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_GDMX_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_gdmx_multik gdmx NO_KP_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_gvx_multik + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_GVX_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_gvx_multik gvx NO_KP_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_gdmepsl_multik + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_GDMEPSL_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_gdmepsl_multik gdmepsl NO_KP_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_gvepsl_multik + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_GVEPSL_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_gvepsl_multik gvepsl NO_KP_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_orbpre_multik + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_ORBPRE_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_orbpre_multik orbpre NO_KP_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_vdpre_multik + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_VDPRE_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_vdpre_multik vdpre NO_KP_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_vdrpre_multik + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_VDRPRE_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_vdrpre_multik vdrpre NO_KP_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_edelta_multik + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_EDELTA_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_edelta_multik edelta NO_KP_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_e_deltabands_multik + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_E_DELTABANDS_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_e_deltabands_multik e_deltabands NO_KP_deepks_UT) + +AddTest( + TARGET MODULE_LCAO_DEEPKS_force_stress_delta_multik + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_FORCE_STRESS_DELTA_SOURCES} +) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_force_stress_delta_multik force_stress_delta NO_KP_deepks_UT) -install( - TARGETS test_deepks - DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/../../../../tests +AddTest( + TARGET MODULE_LCAO_DEEPKS_o_delta_multik + LIBS ${DEEPKS_UNIT_LIBS} + SOURCES main_deepks.cpp ${DEEPKS_UNIT_O_DELTA_SOURCES} ) +configure_deepks_unit_target(MODULE_LCAO_DEEPKS_o_delta_multik o_delta NO_KP_deepks_UT) diff --git a/source/source_lcao/module_deepks/test/LCAO_deepks_test.cpp b/source/source_lcao/module_deepks/test/LCAO_deepks_test.cpp deleted file mode 100644 index 6f53a757d6c..00000000000 --- a/source/source_lcao/module_deepks/test/LCAO_deepks_test.cpp +++ /dev/null @@ -1,497 +0,0 @@ -#include "LCAO_deepks_test.h" -#include "source_lcao/module_deepks/deepks_check.h" -#include "source_lcao/module_deepks/deepks_descriptor.h" -#include "source_lcao/module_deepks/deepks_force.h" -#include "source_lcao/module_deepks/deepks_fpre.h" -#include "source_lcao/module_deepks/deepks_orbpre.h" -#include "source_lcao/module_deepks/deepks_orbital.h" -#include "source_lcao/module_deepks/deepks_pdm.h" -#include "source_lcao/module_deepks/deepks_phialpha.h" -#include "source_lcao/module_deepks/deepks_spre.h" -#include "source_lcao/module_deepks/deepks_vdpre.h" -#include "source_lcao/module_deepks/deepks_vdrpre.h" -#define private public -#include "source_io/module_parameter/parameter.h" - -#include -#include -#undef private -#include "source_lcao/hs_matrix_k.hpp" -#include "source_lcao/module_operator_lcao/deepks_lcao.h" -namespace Test_Deepks -{ -Grid_Driver GridD(PARAM.input.test_deconstructor, PARAM.input.test_grid); -} - -template -test_deepks::test_deepks() -{ -} - -template -test_deepks::~test_deepks() -{ -} - -template -void test_deepks::check_dstable() -{ - // OGT.talpha.print_Table_DSR(ORB); - // this->compare_with_ref("S_I_mu_alpha.dat","S_I_mu_alpha_ref.dat"); -} - -template -void test_deepks::check_phialpha() -{ - std::vector na; - na.resize(ucell.ntype); - for (int it = 0; it < ucell.ntype; it++) - { - na[it] = ucell.atoms[it].na; - } - this->ld.init(ORB, ucell.nat, ucell.ntype, kv.nkstot, ParaO, na, GlobalV::ofs_running); - - DeePKS_domain::allocate_phialpha(PARAM.input.cal_force, ucell, ORB, Test_Deepks::GridD, &ParaO, this->ld.phialpha); - - DeePKS_domain::build_phialpha(PARAM.input.cal_force, - ucell, - ORB, - Test_Deepks::GridD, - &ParaO, - overlap_orb_alpha_, - this->ld.phialpha); - - DeePKS_domain::check_phialpha(PARAM.input.cal_force, - ucell, - ORB, - Test_Deepks::GridD, - &ParaO, - this->ld.phialpha, - 0); // 0 for rank - - this->compare_with_ref("phialpha.dat", "phialpha_ref.dat"); - this->compare_with_ref("dphialpha_x.dat", "dphialpha_x_ref.dat"); - this->compare_with_ref("dphialpha_y.dat", "dphialpha_y_ref.dat"); - this->compare_with_ref("dphialpha_z.dat", "dphialpha_z_ref.dat"); -} - -template -void test_deepks::read_dm(const int nks) -{ - dm.resize(nks); - std::stringstream ss; - for (int ik = 0; ik < nks; ik++) - { - ss.str(""); - if (nks == 1) - { - ss << "dm"; - } - else - { - ss << "dm_" << ik; - } - std::ifstream ifs(ss.str().c_str()); - dm[ik].create(PARAM.sys.nlocal, PARAM.sys.nlocal); - - for (int mu = 0; mu < PARAM.sys.nlocal; mu++) - { - for (int nu = 0; nu < PARAM.sys.nlocal; nu++) - { - T c; - ifs >> c; - dm[ik](mu, nu) = c; - } - } - } -} - -template -void test_deepks::set_dm_new() -{ - dm_new.resize(dm.size()); - for (int i = 0; i < dm.size(); i++) - { - dm_new[i].resize(dm[i].nr * dm[i].nc); - dm_new[i].assign(dm[i].c, dm[i].c + dm[i].nr * dm[i].nc); - } -} - -template -void test_deepks::set_p_elec_DM() -{ - int nk = 1; - const int nspin = PARAM.inp.nspin; - if (PARAM.sys.gamma_only_local) - { - nk = nspin; - this->p_elec_DM = new elecstate::DensityMatrix(&ParaO, nspin); - } - else - { - nk = kv.nkstot; - this->p_elec_DM - = new elecstate::DensityMatrix(&ParaO, nspin, kv.kvec_d, kv.nkstot / PARAM.inp.nspin); - } - p_elec_DM->init_DMR(&Test_Deepks::GridD, &ucell); - - for (int ik = 0; ik < nk; ik++) - { - p_elec_DM->set_DMK_pointer(ik, dm_new[ik].data()); - } - p_elec_DM->cal_DMR(); -} - -template -void test_deepks::check_pdm() -{ - this->read_dm(kv.nkstot); - this->set_dm_new(); - this->set_p_elec_DM(); - this->ld.init_DMR(ucell, ORB, ParaO, Test_Deepks::GridD); - DeePKS_domain::update_dmr(kv.kvec_d, - p_elec_DM->get_DMK_vector(), - ucell, - ORB, - ParaO, - Test_Deepks::GridD, - this->ld.dm_r); - DeePKS_domain::cal_pdm(this->ld.init_pdm, - this->ld.deepks_param, - kv.kvec_d, - this->ld.dm_r, - this->ld.phialpha, - ucell, - ORB, - Test_Deepks::GridD, - ParaO, - this->ld.pdm); - DeePKS_domain::check_pdm(this->ld.deepks_param, this->ld.pdm); - this->compare_with_ref("deepks_projdm.dat", "pdm_ref.dat"); -} - -template -void test_deepks::check_descriptor(std::vector& descriptor) -{ - DeePKS_domain::cal_descriptor(ucell.nat, this->ld.deepks_param, this->ld.pdm, descriptor); - DeePKS_domain::check_descriptor(this->ld.deepks_param, ucell, "./", descriptor, 0); - this->compare_with_ref("deepks_desc.dat", "descriptor_ref.dat"); -} - -template -void test_deepks::check_gdmx(torch::Tensor& gdmx) -{ - DeePKS_domain::cal_gdmx(kv.nkstot, - this->ld.deepks_param, - kv.kvec_d, - this->ld.phialpha, - this->ld.dm_r, - ucell, - ORB, - ParaO, - Test_Deepks::GridD, - gdmx); - DeePKS_domain::check_tensor(gdmx, "gdmx.dat", 0); // 0 for rank - this->compare_with_ref("gdmx.dat", "gdmx_ref.dat"); -} - -template -void test_deepks::check_gvx(torch::Tensor& gdmx) -{ - std::vector gevdm; - DeePKS_domain::cal_gevdm(ucell.nat, this->ld.deepks_param, this->ld.pdm, gevdm); - torch::Tensor gvx; - DeePKS_domain::cal_gvx(ucell.nat, this->ld.deepks_param, gevdm, gdmx, gvx, 0); - DeePKS_domain::check_tensor(gvx, "gvx.dat", 0); // 0 for rank - this->compare_with_ref("gvx.dat", "gvx_ref.dat"); -} - -template -void test_deepks::check_gdmepsl(torch::Tensor& gdmepsl) -{ - DeePKS_domain::cal_gdmepsl(kv.nkstot, - this->ld.deepks_param, - kv.kvec_d, - this->ld.phialpha, - this->ld.dm_r, - ucell, - ORB, - ParaO, - Test_Deepks::GridD, - gdmepsl); - DeePKS_domain::check_tensor(gdmepsl, "gdmepsl.dat", 0); // 0 for rank - this->compare_with_ref("gdmepsl.dat", "gdmepsl_ref.dat"); -} - -template -void test_deepks::check_gvepsl(torch::Tensor& gdmepsl) -{ - std::vector gevdm; - DeePKS_domain::cal_gevdm(ucell.nat, this->ld.deepks_param, this->ld.pdm, gevdm); - torch::Tensor gvepsl; - DeePKS_domain::cal_gvepsl(ucell.nat, this->ld.deepks_param, gevdm, gdmepsl, gvepsl, 0); - DeePKS_domain::check_tensor(gvepsl, "gvepsl.dat", 0); // 0 for rank - this->compare_with_ref("gvepsl.dat", "gvepsl_ref.dat"); -} - -template -void test_deepks::check_orbpre() -{ - using TH = std::conditional_t::value, ModuleBase::matrix, ModuleBase::ComplexMatrix>; - std::vector gevdm; - torch::Tensor orbpre; - DeePKS_domain::cal_gevdm(ucell.nat, this->ld.deepks_param, this->ld.pdm, gevdm); - DeePKS_domain::cal_orbital_precalc(dm, - ucell.nat, - kv.nkstot, - this->ld.deepks_param, - kv.kvec_d, - this->ld.phialpha, - gevdm, - ucell, - ORB, - ParaO, - Test_Deepks::GridD, - orbpre); - DeePKS_domain::check_tensor(orbpre, "orbital_precalc.dat", 0); // 0 for rank - this->compare_with_ref("orbital_precalc.dat", "orbpre_ref.dat"); -} - -template -void test_deepks::check_vdpre() -{ - std::vector gevdm; - torch::Tensor vdpre; - DeePKS_domain::cal_gevdm(ucell.nat, this->ld.deepks_param, this->ld.pdm, gevdm); - DeePKS_domain::cal_v_delta_precalc(PARAM.sys.nlocal, - ucell.nat, - kv.nkstot, - this->ld.deepks_param, - kv.kvec_d, - this->ld.phialpha, - gevdm, - ucell, - ORB, - ParaO, - Test_Deepks::GridD, - vdpre); - DeePKS_domain::check_tensor(vdpre, "v_delta_precalc.dat", 0); // 0 for rank - this->compare_with_ref("v_delta_precalc.dat", "vdpre_ref.dat"); -} - -template -void test_deepks::check_vdrpre() -{ - std::vector gevdm; - torch::Tensor vdrpre; - torch::Tensor overlap_out; - torch::Tensor iRmat; - DeePKS_domain::cal_gevdm(ucell.nat, this->ld.deepks_param, this->ld.pdm, gevdm); - // normally use hR to get R_size, here use 3 instead for Bravo lattice R in [-1,0,1] - int R_size = 3; - DeePKS_domain::cal_vdr_precalc(PARAM.sys.nlocal, - ucell.nat, - kv.nkstot, - R_size, - this->ld.deepks_param, - kv.kvec_d, - this->ld.phialpha, - gevdm, - ucell, - ORB, - ParaO, - Test_Deepks::GridD, - vdrpre); - DeePKS_domain::prepare_phialpha_iRmat(PARAM.sys.nlocal, - R_size, - this->ld.deepks_param, - this->ld.phialpha, - ucell, - ORB, - ParaO, - Test_Deepks::GridD, - overlap_out, - iRmat); - // vdrpre is large, we only check the main element in Bravo lattice vector (0, 0, 0) and (1, 0, 0) - torch::Tensor vdrpre_sliced = vdrpre.slice(0, 0, 2, 1).slice(1, 0, 1, 1).slice(2, 0, 1, 1); - DeePKS_domain::check_tensor(vdrpre_sliced, "vdr_precalc.dat", 0); // 0 for rank - DeePKS_domain::check_tensor(overlap_out, "phialpha_r.dat", 0); // 0 for rank - DeePKS_domain::check_tensor(iRmat, "iRmat.dat", 0); // 0 for rank - this->compare_with_ref("vdr_precalc.dat", "vdrpre_ref.dat"); - this->compare_with_ref("phialpha_r.dat", "phialpha_r_ref.dat"); - this->compare_with_ref("iRmat.dat", "iRmat_ref.dat"); -} - -template -void test_deepks::check_edelta(std::vector& descriptor) -{ - DeePKS_domain::load_model("model.ptg", ld.model_deepks); - ld.allocate_V_delta(ucell.nat, kv.nkstot); - if (PARAM.inp.deepks_equiv) - { - DeePKS_domain::cal_edelta_gedm_equiv(ucell.nat, - this->ld.deepks_param, - descriptor, - this->ld.model_deepks, - this->ld.gedm, - this->ld.E_delta, - 0); // 0 for rank - } - else - { - DeePKS_domain::cal_edelta_gedm(ucell.nat, - this->ld.deepks_param, - this->ld.model_deepks, - this->ld.E_delta, - descriptor, - this->ld.pdm, - this->ld.gedm); - } - - std::ofstream ofs("E_delta.dat"); - ofs << std::setprecision(10) << this->ld.E_delta << std::endl; - ofs.close(); - this->compare_with_ref("E_delta.dat", "E_delta_ref.dat"); - - // DeePKS_domain::check_gedm(this->ld.deepks_param, this->ld.gedm); - // this->compare_with_ref("gedm.dat", "gedm_ref.dat"); -} - -template -void test_deepks::cal_V_delta() -{ - hamilt::HS_Matrix_K* hsk = new hamilt::HS_Matrix_K(&ParaO); - hamilt::HContainer* hR = new hamilt::HContainer(ucell, &ParaO); - hamilt::Operator* op_deepks = new hamilt::DeePKS>(hsk, - kv.kvec_d, - hR, // no explicit call yet - &ucell, - &Test_Deepks::GridD, - &overlap_orb_alpha_, - &ORB, - kv.nkstot, - p_elec_DM, - &this->ld); - for (int ik = 0; ik < kv.nkstot; ++ik) - { - op_deepks->init(ik); - } -} - -template -void test_deepks::check_e_deltabands() -{ - this->cal_V_delta(); - this->ld.dpks_cal_e_delta_band(dm_new, kv.nkstot); - - std::ofstream ofs("E_delta_bands.dat"); - ofs << std::setprecision(10) << this->ld.e_delta_band << std::endl; - ofs.close(); - this->compare_with_ref("E_delta_bands.dat", "E_delta_bands_ref.dat"); -} - -template -void test_deepks::check_f_delta_and_stress_delta() -{ - ModuleBase::matrix fvnl_dalpha; - fvnl_dalpha.create(ucell.nat, 3); - - ModuleBase::matrix svnl_dalpha; - svnl_dalpha.create(3, 3); - const int cal_stress = 1; - const int nks = kv.nkstot; - DeePKS_domain::cal_f_delta(ucell, - ORB, - Test_Deepks::GridD, - ParaO, - nks, - this->ld.deepks_param, - kv.kvec_d, - this->ld.phialpha, - fvnl_dalpha, - cal_stress, - svnl_dalpha, - this->ld.dm_r, - this->ld.gedm); - std::ofstream ofs_f("F_delta.dat"); - std::ofstream ofs_s("stress_delta.dat"); - ofs_f << std::setprecision(10); - ofs_s << std::setprecision(10); - fvnl_dalpha.print(ofs_f); - ofs_f.close(); - svnl_dalpha.print(ofs_s); - ofs_s.close(); - - this->compare_with_ref("F_delta.dat", "F_delta_ref.dat"); - this->compare_with_ref("stress_delta.dat", "stress_delta_ref.dat"); -} - -template -void test_deepks::check_o_delta() -{ - const int nspin = PARAM.inp.nspin; - const int nks = kv.nkstot; - ModuleBase::matrix o_delta; - o_delta.create(nks, 1); - DeePKS_domain::cal_o_delta(dm, ld.V_delta, o_delta, ParaO, nks, nspin); - std::ofstream ofs("o_delta.dat"); - ofs << std::setprecision(10); - o_delta.print(ofs); - ofs.close(); - this->compare_with_ref("o_delta.dat", "o_delta_ref.dat"); -} - -template -void test_deepks::compare_with_ref(const std::string f1, const std::string f2) -{ - this->total_check += 1; - std::ifstream file1(f1.c_str()); - std::ifstream file2(f2.c_str()); - double test_thr = 1e-8; - - std::string word1; - std::string word2; - while (file1 >> word1) - { - file2 >> word2; - if ((word1[0] - '0' >= 0 && word1[0] - '0' < 10) || word1[0] == '-') - { - double num1 = std::stod(word1); - double num2 = std::stod(word2); - if (std::abs(num1 - num2) > test_thr) - { - this->failed_check += 1; - std::cout << "\e[1;31m [ FAILED ] \e[0m" << f1.c_str() << " inconsistent!" << std::endl; - return; - } - } - else if (word1[0] == '(' && word1[word1.size() - 1] == ')' && word2[0] == '(' - && word2[word2.size() - 1] == ')') // complex number - { - std::string word1_str = word1.substr(1, word1.size() - 2); - std::string word2_str = word2.substr(1, word2.size() - 2); - double word1_real = std::stod(word1_str.substr(0, word1_str.find(','))); - double word1_imag = std::stod(word1_str.substr(word1_str.find(',') + 1)); - double word2_real = std::stod(word2_str.substr(0, word2_str.find(','))); - double word2_imag = std::stod(word2_str.substr(word2_str.find(',') + 1)); - if (std::abs(word1_real - word2_real) > test_thr || std::abs(word1_imag - word2_imag) > test_thr) - { - this->failed_check += 1; - std::cout << "\e[1;31m [ FAILED ] \e[0m" << f1.c_str() << " inconsistent!" << std::endl; - return; - } - } - else - { - if (word1 != word2) - { - this->failed_check += 1; - return; - } - } - } - return; -} - -template class test_deepks; -template class test_deepks>; \ No newline at end of file diff --git a/source/source_lcao/module_deepks/test/Makefile b/source/source_lcao/module_deepks/test/Makefile deleted file mode 100644 index b24f576d026..00000000000 --- a/source/source_lcao/module_deepks/test/Makefile +++ /dev/null @@ -1,101 +0,0 @@ -# This is the Makefile of ABACUS-ORB API - -#========================== -# Compiler information -#========================== -CPLUSPLUS = icpc -CPLUSPLUS_MPI = mpiicpc -FFTW_DIR = /home/wenfei/codes/FFTW -OBJ_DIR = obj_deepks -NP = 4 - -#========================== -# FFTW package needed -#========================== -HONG_FFTW = -D__FFTW3 -D__MLALGO -FFTW_INCLUDE_DIR = ${FFTW_DIR}/include -FFTW_LIB_DIR = ${FFTW_DIR}/lib -FFTW_LIB = -L${FFTW_LIB_DIR} -lfftw3 -Wl,-rpath=${FFTW_LIB_DIR} - -#========================== -# libtorch and libnpy -#========================== -LIBTORCH_DIR = /home/wenfei/codes/libtorch -LIBNPY_DIR = /home/wenfei/codes/libnpy - -LIBTORCH_INCLUDE_DIR = -isystem ${LIBTORCH_DIR}/include -isystem ${LIBTORCH_DIR}/include/torch/csrc/api/include -LIBTORCH_LIB_DIR= ${LIBTORCH_DIR}/lib -LIBTORCH_LIB = -L${LIBTORCH_LIB_DIR} -ltorch -lc10 -Wl,-rpath,${LIBTORCH_LIB_DIR} -Wl,--no-as-needed,"${LIBTORCH_LIB_DIR}/libtorch_cpu.so" -Wl,--as-needed ${LIBTORCH_LIB_DIR}/libc10.so -lpthread -Wl,--no-as-needed,"${LIBTORCH_LIB_DIR}/libtorch.so" -Wl,--as-needed - -CNPY_INCLUDE_DIR = ${LIBNPY_DIR} - -#========================== -# LIBS and INCLUDES -#========================== -LIBS = -lifcore -lm -lpthread ${FFTW_LIB} ${LIBTORCH_LIB} - -#========================== -# OPTIMIZE OPTIONS -#========================== -INCLUDES = -I. -Icommands -I${FFTW_INCLUDE_DIR} ${LIBTORCH_INCLUDE_DIR} -I${CNPY_INCLUDE_DIR} - -# -pedantic turns off more extensions and generates more warnings -# -xHost generates instructions for the highest instruction set available on the compilation host processor -OPTS = ${INCLUDES} -Ofast -std=c++14 -march=native -xHost -m64 -qopenmp -Werror -Wall -pedantic -g - -include Makefile.Objects - -VPATH=../../../source_main\ -:../../source_base\ -:../../source_io\ -:../../source_pw/module_pwdft\ -:../../source_basis/module_ao\ -:../../module_neighbor\ -:../../source_cell\ -:../../source_estate\ -:../../\ -:../\ -:./\ - -#========================== -# Define HONG -#========================== -HONG= -DMETIS -DMKL_ILP64 -D__LCAO ${HONG_FFTW} - -FP_OBJS_0=main.o\ -LCAO_deepks_test.o\ -LCAO_deepks_test_prep.o\ -$(OBJS_MAIN)\ -$(OBJS_IO)\ -$(OBJS_BASE)\ -$(OBJS_CELL)\ -$(OBJS_ORB)\ -$(OBJS_NEIGHBOR)\ -$(OBJS_PW)\ -$(OBJS_ELECSTATE)\ - -FP_OBJS=$(patsubst %.o, ${OBJ_DIR}/%.o, ${FP_OBJS_0}) - -#========================== -# MAKING OPTIONS -#========================== -DEEPKS : - @ make init - @ make -j $(NP) serial - -init : - @ if [ ! -d $(OBJ_DIR) ]; then mkdir $(OBJ_DIR); fi - @ if [ ! -d $(OBJ_DIR)/README ]; then echo "This directory contains all of the .o files" > $(OBJ_DIR)/README; fi - -serial : ${FP_OBJS} - ${CPLUSPLUS} ${OPTS} $(FP_OBJS) ${LIBS} -o ${VERSION}.x - -#========================== -# rules -#========================== -${OBJ_DIR}/%.o:%.cpp - ${CPLUSPLUS_MPI} ${OPTS} ${OPTS_MPI} -c ${HONG} $< -o $@ - -.PHONY:clean -clean: - @ if [ -d $(OBJ_DIR) ]; then rm -rf $(OBJ_DIR); fi diff --git a/source/source_lcao/module_deepks/test/Makefile.Objects b/source/source_lcao/module_deepks/test/Makefile.Objects deleted file mode 100644 index b10aac23e7f..00000000000 --- a/source/source_lcao/module_deepks/test/Makefile.Objects +++ /dev/null @@ -1,77 +0,0 @@ -# -# The ABACUS-deepks module -# - -VERSION= ABACUS-deepks -HEADERS= *.h - -OBJS_MAIN=klist_1.o\ -parallel_orbitals.o\ -deepks_basic.o\ -deepks_force.o\ -deepks_iterate.o\ -deepks_vdelta.o\ -deepks_pdm.o\ -deepks_phialpha.o\ -LCAO_deepks.o\ -LCAO_deepks_io.o\ - -OBJS_IO=output.o\ - -OBJS_PW=magnetism.o\ -soc.o\ - -OBJS_BASE=math_integral.o\ -math_sphbes.o\ -math_polyint.o\ -math_ylmreal.o\ -ylm.o\ -memory_recorder.o\ -matrix3.o\ -matrix.o\ -intarray.o\ -sph_bessel.o\ -sph_bessel_recursive-d1.o\ -sph_bessel_recursive-d2.o\ -complexarray.o\ -complexmatrix.o\ -timer.o\ -realarray.o\ -global_file.o\ -global_function.o\ -global_variable.o\ -tool_title.o\ -tool_quit.o\ -tool_check.o\ -mathzone_add1.o\ - -OBJS_CELL=pseudo.o\ -atom_spec.o\ -atom_pseudo.o\ -read_pp.o\ -read_pp_complete.o\ -read_pp_upf100.o\ -read_pp_upf201.o\ -read_pp_vwr.o\ -read_pp_blps.o\ -unitcell.o\ -check_atomic_stru.o\ -read_atoms.o\ -read_atoms_helper.o\ -read_cell_pseudopots.o\ -setup_nonlocal.o - -OBJS_ORB=ORB_read.o\ -ORB_atomic.o\ -ORB_atomic_lm.o\ -ORB_nonlocal.o\ -ORB_nonlocal_lm.o\ -ORB_gaunt_table.o\ - -OBJS_NEIGHBOR=sltk_atom_arrange.o\ -sltk_atom.o\ -sltk_grid.o\ -sltk_grid_driver.o - -OBJS_ELECSTATE=read_pseudo.o\ -cal_nelec_nband.o\ \ No newline at end of file diff --git a/source/source_lcao/module_deepks/test/deepks_test.cpp b/source/source_lcao/module_deepks/test/deepks_test.cpp new file mode 100644 index 00000000000..76258bc9679 --- /dev/null +++ b/source/source_lcao/module_deepks/test/deepks_test.cpp @@ -0,0 +1,121 @@ +#include "deepks_test.h" + +#include +#include +#include +#include +#include + +namespace +{ +bool parse_double_token(const std::string& token, double* value) +{ + char* end = nullptr; + errno = 0; + const double parsed = std::strtod(token.c_str(), &end); + if (end == token.c_str() || *end != '\0' || errno == ERANGE) + { + return false; + } + *value = parsed; + return true; +} + +bool parse_complex_token(const std::string& token, double* real, double* imag) +{ + if (token.size() < 5 || token[0] != '(' || token[token.size() - 1] != ')') + { + return false; + } + + const std::string value = token.substr(1, token.size() - 2); + const std::string::size_type comma = value.find(','); + if (comma == std::string::npos || comma == 0 || comma == value.size() - 1) + { + return false; + } + + return parse_double_token(value.substr(0, comma), real) && parse_double_token(value.substr(comma + 1), imag); +} +} // namespace + +namespace Test_Deepks +{ +Grid_Driver GridD(false, false); +} + +template +test_deepks::test_deepks() +{ +} + +template +test_deepks::~test_deepks() +{ + delete this->p_elec_DM; +} + +template +void test_deepks::check_dstable() +{ + // OGT.talpha.print_Table_DSR(ORB); + // this->assert_file_matches_reference("S_I_mu_alpha.dat", "S_I_mu_alpha_ref.dat"); +} + +template +void test_deepks::assert_file_matches_reference(const std::string& actual_file, const std::string& reference_file) +{ + SCOPED_TRACE("Comparing " + actual_file + " with " + reference_file); + std::ifstream actual(actual_file.c_str()); + std::ifstream reference(reference_file.c_str()); + const double test_thr = 1e-8; + + ASSERT_TRUE(actual.is_open()) << "Cannot open actual file " << actual_file; + ASSERT_TRUE(reference.is_open()) << "Cannot open reference file " << reference_file; + + std::string actual_word; + std::string reference_word; + int entry = 0; + while (actual >> actual_word) + { + ASSERT_TRUE(reference >> reference_word) + << reference_file << " has fewer entries than " << actual_file << " at entry " << entry; + + double actual_num = 0.0; + double reference_num = 0.0; + const bool actual_is_number = parse_double_token(actual_word, &actual_num); + const bool reference_is_number = parse_double_token(reference_word, &reference_num); + double actual_real = 0.0; + double actual_imag = 0.0; + double reference_real = 0.0; + double reference_imag = 0.0; + const bool actual_is_complex = parse_complex_token(actual_word, &actual_real, &actual_imag); + const bool reference_is_complex = parse_complex_token(reference_word, &reference_real, &reference_imag); + + if (actual_is_number || reference_is_number) + { + ASSERT_TRUE(actual_is_number) << "Cannot parse actual numeric entry " << entry << ": " << actual_word; + ASSERT_TRUE(reference_is_number) + << "Cannot parse reference numeric entry " << entry << ": " << reference_word; + EXPECT_NEAR(actual_num, reference_num, test_thr) << "numeric mismatch at entry " << entry; + } + else if (actual_is_complex || reference_is_complex) + { + ASSERT_TRUE(actual_is_complex) << "Cannot parse actual complex entry " << entry << ": " << actual_word; + ASSERT_TRUE(reference_is_complex) + << "Cannot parse reference complex entry " << entry << ": " << reference_word; + EXPECT_NEAR(actual_real, reference_real, test_thr) << "complex real mismatch at entry " << entry; + EXPECT_NEAR(actual_imag, reference_imag, test_thr) << "complex imag mismatch at entry " << entry; + } + else + { + EXPECT_EQ(actual_word, reference_word) << "text mismatch at entry " << entry; + } + ++entry; + } + EXPECT_FALSE(reference >> reference_word) + << reference_file << " has more entries than " << actual_file << " starting with " << reference_word; +} + +template class test_deepks; +template class test_deepks>; diff --git a/source/source_lcao/module_deepks/test/LCAO_deepks_test.h b/source/source_lcao/module_deepks/test/deepks_test.h similarity index 81% rename from source/source_lcao/module_deepks/test/LCAO_deepks_test.h rename to source/source_lcao/module_deepks/test/deepks_test.h index d90d881eff9..7fcd69e065d 100644 --- a/source/source_lcao/module_deepks/test/LCAO_deepks_test.h +++ b/source/source_lcao/module_deepks/test/deepks_test.h @@ -1,14 +1,12 @@ -#include "klist.h" +#include "../LCAO_deepks.h" #include "source_base/global_function.h" #include "source_base/global_variable.h" #include "source_basis/module_ao/ORB_read.h" +#include "source_cell/klist.h" #include "source_cell/module_neighbor/sltk_atom_arrange.h" #include "source_cell/module_neighbor/sltk_grid_driver.h" #include "source_cell/unitcell.h" #include "source_estate/module_dm/density_matrix.h" -//#include "parallel_orbitals.h" - -#include "../LCAO_deepks.h" #include #include @@ -39,12 +37,9 @@ class test_deepks UnitCell ucell; Parallel_Orbitals ParaO; - Test_Deepks::K_Vectors kv; + K_Vectors kv; LCAO_Deepks ld; - int failed_check = 0; - int total_check = 0; - int my_rank = 0; double lcao_ecut = 0; // (Ry) @@ -56,12 +51,24 @@ class test_deepks int lmax = 2; int ntype = 0; + int nlocal = 0; + int nbands = 0; + int npol = 1; + int nspin = 1; + bool gamma_only_local = false; + bool cal_force = true; + bool deepks_setorb = true; + bool test_atom_input = false; + bool search_pbc = true; + bool out_element_info = false; + std::string orbital_dir = ""; + std::string out_level = "ie"; using TH = std::conditional_t::value, ModuleBase::matrix, ModuleBase::ComplexMatrix>; std::vector dm; std::vector> dm_new; - elecstate::DensityMatrix* p_elec_DM; + elecstate::DensityMatrix* p_elec_DM = nullptr; // preparation void preparation(); @@ -112,5 +119,5 @@ class test_deepks void check_o_delta(); // compares numbers stored in two files - void compare_with_ref(const std::string f1, const std::string f2); + void assert_file_matches_reference(const std::string& actual_file, const std::string& reference_file); }; diff --git a/source/source_lcao/module_deepks/test/deepks_test_descriptor.cpp b/source/source_lcao/module_deepks/test/deepks_test_descriptor.cpp new file mode 100644 index 00000000000..93790998e5c --- /dev/null +++ b/source/source_lcao/module_deepks/test/deepks_test_descriptor.cpp @@ -0,0 +1,26 @@ +#include "deepks_test_runner.h" + +#include "source_lcao/module_deepks/deepks_descriptor.h" + +#include + +template +void test_deepks::check_descriptor(std::vector& descriptor) +{ + DeePKS_domain::cal_descriptor(ucell.nat, this->ld.deepks_param, this->ld.pdm, descriptor); + DeePKS_domain::check_descriptor(this->ld.deepks_param, ucell, "./", descriptor, 0); + this->assert_file_matches_reference("deepks_desc.dat", "descriptor_ref.dat"); +} + +template void test_deepks::check_descriptor(std::vector& descriptor); +template void test_deepks>::check_descriptor(std::vector& descriptor); + +template +void run_deepks_unit_descriptor(test_deepks& test) +{ + std::vector descriptor; + DeepksTestRunner::build_descriptor(test, descriptor); +} + +template void run_deepks_unit_descriptor(test_deepks& test); +template void run_deepks_unit_descriptor>(test_deepks>& test); diff --git a/source/source_lcao/module_deepks/test/deepks_test_e_deltabands.cpp b/source/source_lcao/module_deepks/test/deepks_test_e_deltabands.cpp new file mode 100644 index 00000000000..bf6906b91b6 --- /dev/null +++ b/source/source_lcao/module_deepks/test/deepks_test_e_deltabands.cpp @@ -0,0 +1,60 @@ +#include "deepks_test_runner.h" + +#include "source_lcao/hs_matrix_k.hpp" +#include "source_lcao/module_operator_lcao/deepks_lcao.h" + +#include +#include + +template +void test_deepks::cal_V_delta() +{ + hamilt::HS_Matrix_K hsk(&ParaO); + hamilt::HContainer hR(ucell, &ParaO); + hamilt::DeePKS> op_deepks(&hsk, + kv.kvec_d, + &hR, + &ucell, + &Test_Deepks::GridD, + &overlap_orb_alpha_, + &ORB, + kv.get_nkstot(), + p_elec_DM, + &this->ld); + for (int ik = 0; ik < kv.get_nkstot(); ++ik) + { + op_deepks.init(ik); + } +} + +template +void test_deepks::check_e_deltabands() +{ + this->cal_V_delta(); + this->ld.dpks_cal_e_delta_band(dm_new, kv.get_nkstot()); + + std::ofstream ofs("E_delta_bands.dat"); + ofs << std::setprecision(10) << this->ld.e_delta_band << std::endl; + ofs.close(); + this->assert_file_matches_reference("E_delta_bands.dat", "E_delta_bands_ref.dat"); +} + +template void test_deepks::cal_V_delta(); +template void test_deepks>::cal_V_delta(); +template void test_deepks::check_e_deltabands(); +template void test_deepks>::check_e_deltabands(); + +template +void run_deepks_unit_e_deltabands(test_deepks& test) +{ + std::vector descriptor; + DeepksTestRunner::build_edelta(test, descriptor); + if (testing::Test::HasFatalFailure()) + { + return; + } + test.check_e_deltabands(); +} + +template void run_deepks_unit_e_deltabands(test_deepks& test); +template void run_deepks_unit_e_deltabands>(test_deepks>& test); diff --git a/source/source_lcao/module_deepks/test/deepks_test_edelta.cpp b/source/source_lcao/module_deepks/test/deepks_test_edelta.cpp new file mode 100644 index 00000000000..67a152136af --- /dev/null +++ b/source/source_lcao/module_deepks/test/deepks_test_edelta.cpp @@ -0,0 +1,52 @@ +#include "deepks_test_runner.h" + +#include "source_io/module_parameter/parameter.h" +#include "source_lcao/module_deepks/deepks_basic.h" + +#include +#include + +template +void test_deepks::check_edelta(std::vector& descriptor) +{ + DeePKS_domain::load_model("model.ptg", ld.model_deepks); + ld.allocate_V_delta(ucell.nat, kv.get_nkstot()); + if (PARAM.inp.deepks_equiv) + { + DeePKS_domain::cal_edelta_gedm_equiv(ucell.nat, + this->ld.deepks_param, + descriptor, + this->ld.model_deepks, + this->ld.gedm, + this->ld.E_delta, + 0); + } + else + { + DeePKS_domain::cal_edelta_gedm(ucell.nat, + this->ld.deepks_param, + this->ld.model_deepks, + this->ld.E_delta, + descriptor, + this->ld.pdm, + this->ld.gedm); + } + + std::ofstream ofs("E_delta.dat"); + ofs << std::setprecision(10) << this->ld.E_delta << std::endl; + ofs.close(); + this->assert_file_matches_reference("E_delta.dat", "E_delta_ref.dat"); +} + +template void test_deepks::check_edelta(std::vector& descriptor); +template void test_deepks>::check_edelta(std::vector& descriptor); + +template +void run_deepks_unit_edelta(test_deepks& test) +{ + std::vector descriptor; + DeepksTestRunner::build_edelta(test, descriptor); +} + +template void run_deepks_unit_edelta(test_deepks& test); +template void run_deepks_unit_edelta>(test_deepks>& test); diff --git a/source/source_lcao/module_deepks/test/deepks_test_force_stress_delta.cpp b/source/source_lcao/module_deepks/test/deepks_test_force_stress_delta.cpp new file mode 100644 index 00000000000..1387ff029b3 --- /dev/null +++ b/source/source_lcao/module_deepks/test/deepks_test_force_stress_delta.cpp @@ -0,0 +1,60 @@ +#include "deepks_test_runner.h" + +#include "source_lcao/module_deepks/deepks_force.h" + +#include +#include + +template +void test_deepks::check_f_delta_and_stress_delta() +{ + ModuleBase::matrix fvnl_dalpha; + fvnl_dalpha.create(ucell.nat, 3); + + ModuleBase::matrix svnl_dalpha; + svnl_dalpha.create(3, 3); + const int cal_stress = 1; + const int nks = kv.get_nkstot(); + DeePKS_domain::cal_f_delta(ucell, + ORB, + Test_Deepks::GridD, + ParaO, + nks, + this->ld.deepks_param, + kv.kvec_d, + this->ld.phialpha, + fvnl_dalpha, + cal_stress, + svnl_dalpha, + this->ld.dm_r, + this->ld.gedm); + std::ofstream ofs_f("F_delta.dat"); + std::ofstream ofs_s("stress_delta.dat"); + ofs_f << std::setprecision(10); + ofs_s << std::setprecision(10); + fvnl_dalpha.print(ofs_f); + ofs_f.close(); + svnl_dalpha.print(ofs_s); + ofs_s.close(); + + this->assert_file_matches_reference("F_delta.dat", "F_delta_ref.dat"); + this->assert_file_matches_reference("stress_delta.dat", "stress_delta_ref.dat"); +} + +template void test_deepks::check_f_delta_and_stress_delta(); +template void test_deepks>::check_f_delta_and_stress_delta(); + +template +void run_deepks_unit_force_stress_delta(test_deepks& test) +{ + std::vector descriptor; + DeepksTestRunner::build_edelta(test, descriptor); + if (testing::Test::HasFatalFailure()) + { + return; + } + test.check_f_delta_and_stress_delta(); +} + +template void run_deepks_unit_force_stress_delta(test_deepks& test); +template void run_deepks_unit_force_stress_delta>(test_deepks>& test); diff --git a/source/source_lcao/module_deepks/test/deepks_test_gdmepsl.cpp b/source/source_lcao/module_deepks/test/deepks_test_gdmepsl.cpp new file mode 100644 index 00000000000..9025c097e3c --- /dev/null +++ b/source/source_lcao/module_deepks/test/deepks_test_gdmepsl.cpp @@ -0,0 +1,41 @@ +#include "deepks_test_runner.h" + +#include "source_lcao/module_deepks/deepks_check.h" +#include "source_lcao/module_deepks/deepks_spre.h" + +#include + +template +void test_deepks::check_gdmepsl(torch::Tensor& gdmepsl) +{ + DeePKS_domain::cal_gdmepsl(kv.get_nkstot(), + this->ld.deepks_param, + kv.kvec_d, + this->ld.phialpha, + this->ld.dm_r, + ucell, + ORB, + ParaO, + Test_Deepks::GridD, + gdmepsl); + DeePKS_domain::check_tensor(gdmepsl, "gdmepsl.dat", 0); + this->assert_file_matches_reference("gdmepsl.dat", "gdmepsl_ref.dat"); +} + +template void test_deepks::check_gdmepsl(torch::Tensor& gdmepsl); +template void test_deepks>::check_gdmepsl(torch::Tensor& gdmepsl); + +template +void run_deepks_unit_gdmepsl(test_deepks& test) +{ + DeepksTestRunner::build_pdm(test); + if (testing::Test::HasFatalFailure()) + { + return; + } + torch::Tensor gdmepsl; + test.check_gdmepsl(gdmepsl); +} + +template void run_deepks_unit_gdmepsl(test_deepks& test); +template void run_deepks_unit_gdmepsl>(test_deepks>& test); diff --git a/source/source_lcao/module_deepks/test/deepks_test_gdmx.cpp b/source/source_lcao/module_deepks/test/deepks_test_gdmx.cpp new file mode 100644 index 00000000000..117360334ee --- /dev/null +++ b/source/source_lcao/module_deepks/test/deepks_test_gdmx.cpp @@ -0,0 +1,41 @@ +#include "deepks_test_runner.h" + +#include "source_lcao/module_deepks/deepks_check.h" +#include "source_lcao/module_deepks/deepks_fpre.h" + +#include + +template +void test_deepks::check_gdmx(torch::Tensor& gdmx) +{ + DeePKS_domain::cal_gdmx(kv.get_nkstot(), + this->ld.deepks_param, + kv.kvec_d, + this->ld.phialpha, + this->ld.dm_r, + ucell, + ORB, + ParaO, + Test_Deepks::GridD, + gdmx); + DeePKS_domain::check_tensor(gdmx, "gdmx.dat", 0); + this->assert_file_matches_reference("gdmx.dat", "gdmx_ref.dat"); +} + +template void test_deepks::check_gdmx(torch::Tensor& gdmx); +template void test_deepks>::check_gdmx(torch::Tensor& gdmx); + +template +void run_deepks_unit_gdmx(test_deepks& test) +{ + DeepksTestRunner::build_pdm(test); + if (testing::Test::HasFatalFailure()) + { + return; + } + torch::Tensor gdmx; + test.check_gdmx(gdmx); +} + +template void run_deepks_unit_gdmx(test_deepks& test); +template void run_deepks_unit_gdmx>(test_deepks>& test); diff --git a/source/source_lcao/module_deepks/test/deepks_test_gvepsl.cpp b/source/source_lcao/module_deepks/test/deepks_test_gvepsl.cpp new file mode 100644 index 00000000000..6589a6767cb --- /dev/null +++ b/source/source_lcao/module_deepks/test/deepks_test_gvepsl.cpp @@ -0,0 +1,42 @@ +#include "deepks_test_runner.h" + +#include "source_lcao/module_deepks/deepks_basic.h" +#include "source_lcao/module_deepks/deepks_check.h" +#include "source_lcao/module_deepks/deepks_spre.h" + +#include + +template +void test_deepks::check_gvepsl(torch::Tensor& gdmepsl) +{ + std::vector gevdm; + DeePKS_domain::cal_gevdm(ucell.nat, this->ld.deepks_param, this->ld.pdm, gevdm); + torch::Tensor gvepsl; + DeePKS_domain::cal_gvepsl(ucell.nat, this->ld.deepks_param, gevdm, gdmepsl, gvepsl, 0); + DeePKS_domain::check_tensor(gvepsl, "gvepsl.dat", 0); + this->assert_file_matches_reference("gvepsl.dat", "gvepsl_ref.dat"); +} + +template void test_deepks::check_gvepsl(torch::Tensor& gdmepsl); +template void test_deepks>::check_gvepsl(torch::Tensor& gdmepsl); + +template +void run_deepks_unit_gvepsl(test_deepks& test) +{ + std::vector descriptor; + DeepksTestRunner::build_descriptor(test, descriptor); + if (testing::Test::HasFatalFailure()) + { + return; + } + torch::Tensor gdmepsl; + test.check_gdmepsl(gdmepsl); + if (testing::Test::HasFatalFailure()) + { + return; + } + test.check_gvepsl(gdmepsl); +} + +template void run_deepks_unit_gvepsl(test_deepks& test); +template void run_deepks_unit_gvepsl>(test_deepks>& test); diff --git a/source/source_lcao/module_deepks/test/deepks_test_gvx.cpp b/source/source_lcao/module_deepks/test/deepks_test_gvx.cpp new file mode 100644 index 00000000000..9cb07b9a857 --- /dev/null +++ b/source/source_lcao/module_deepks/test/deepks_test_gvx.cpp @@ -0,0 +1,42 @@ +#include "deepks_test_runner.h" + +#include "source_lcao/module_deepks/deepks_basic.h" +#include "source_lcao/module_deepks/deepks_check.h" +#include "source_lcao/module_deepks/deepks_fpre.h" + +#include + +template +void test_deepks::check_gvx(torch::Tensor& gdmx) +{ + std::vector gevdm; + DeePKS_domain::cal_gevdm(ucell.nat, this->ld.deepks_param, this->ld.pdm, gevdm); + torch::Tensor gvx; + DeePKS_domain::cal_gvx(ucell.nat, this->ld.deepks_param, gevdm, gdmx, gvx, 0); + DeePKS_domain::check_tensor(gvx, "gvx.dat", 0); + this->assert_file_matches_reference("gvx.dat", "gvx_ref.dat"); +} + +template void test_deepks::check_gvx(torch::Tensor& gdmx); +template void test_deepks>::check_gvx(torch::Tensor& gdmx); + +template +void run_deepks_unit_gvx(test_deepks& test) +{ + std::vector descriptor; + DeepksTestRunner::build_descriptor(test, descriptor); + if (testing::Test::HasFatalFailure()) + { + return; + } + torch::Tensor gdmx; + test.check_gdmx(gdmx); + if (testing::Test::HasFatalFailure()) + { + return; + } + test.check_gvx(gdmx); +} + +template void run_deepks_unit_gvx(test_deepks& test); +template void run_deepks_unit_gvx>(test_deepks>& test); diff --git a/source/source_lcao/module_deepks/test/deepks_test_o_delta.cpp b/source/source_lcao/module_deepks/test/deepks_test_o_delta.cpp new file mode 100644 index 00000000000..d6e7d522c4b --- /dev/null +++ b/source/source_lcao/module_deepks/test/deepks_test_o_delta.cpp @@ -0,0 +1,43 @@ +#include "deepks_test_runner.h" + +#include "source_lcao/module_deepks/deepks_orbital.h" + +#include +#include + +template +void test_deepks::check_o_delta() +{ + const int nks = kv.get_nkstot(); + ModuleBase::matrix o_delta; + o_delta.create(nks, 1); + DeePKS_domain::cal_o_delta(dm, ld.V_delta, o_delta, ParaO, nks, this->nspin); + std::ofstream ofs("o_delta.dat"); + ofs << std::setprecision(10); + o_delta.print(ofs); + ofs.close(); + this->assert_file_matches_reference("o_delta.dat", "o_delta_ref.dat"); +} + +template void test_deepks::check_o_delta(); +template void test_deepks>::check_o_delta(); + +template +void run_deepks_unit_o_delta(test_deepks& test) +{ + std::vector descriptor; + DeepksTestRunner::build_edelta(test, descriptor); + if (testing::Test::HasFatalFailure()) + { + return; + } + test.check_e_deltabands(); + if (testing::Test::HasFatalFailure()) + { + return; + } + test.check_o_delta(); +} + +template void run_deepks_unit_o_delta(test_deepks& test); +template void run_deepks_unit_o_delta>(test_deepks>& test); diff --git a/source/source_lcao/module_deepks/test/deepks_test_orbpre.cpp b/source/source_lcao/module_deepks/test/deepks_test_orbpre.cpp new file mode 100644 index 00000000000..d50f05013da --- /dev/null +++ b/source/source_lcao/module_deepks/test/deepks_test_orbpre.cpp @@ -0,0 +1,48 @@ +#include "deepks_test_runner.h" + +#include "source_lcao/module_deepks/deepks_basic.h" +#include "source_lcao/module_deepks/deepks_check.h" +#include "source_lcao/module_deepks/deepks_orbpre.h" + +#include + +template +void test_deepks::check_orbpre() +{ + using TH = std::conditional_t::value, ModuleBase::matrix, ModuleBase::ComplexMatrix>; + std::vector gevdm; + torch::Tensor orbpre; + DeePKS_domain::cal_gevdm(ucell.nat, this->ld.deepks_param, this->ld.pdm, gevdm); + DeePKS_domain::cal_orbital_precalc(dm, + ucell.nat, + kv.get_nkstot(), + this->ld.deepks_param, + kv.kvec_d, + this->ld.phialpha, + gevdm, + ucell, + ORB, + ParaO, + Test_Deepks::GridD, + orbpre); + DeePKS_domain::check_tensor(orbpre, "orbital_precalc.dat", 0); + this->assert_file_matches_reference("orbital_precalc.dat", "orbpre_ref.dat"); +} + +template void test_deepks::check_orbpre(); +template void test_deepks>::check_orbpre(); + +template +void run_deepks_unit_orbpre(test_deepks& test) +{ + std::vector descriptor; + DeepksTestRunner::build_descriptor(test, descriptor); + if (testing::Test::HasFatalFailure()) + { + return; + } + test.check_orbpre(); +} + +template void run_deepks_unit_orbpre(test_deepks& test); +template void run_deepks_unit_orbpre>(test_deepks>& test); diff --git a/source/source_lcao/module_deepks/test/deepks_test_pdm.cpp b/source/source_lcao/module_deepks/test/deepks_test_pdm.cpp new file mode 100644 index 00000000000..c5d1524a812 --- /dev/null +++ b/source/source_lcao/module_deepks/test/deepks_test_pdm.cpp @@ -0,0 +1,119 @@ +#include "deepks_test_runner.h" + +#include "source_lcao/module_deepks/deepks_pdm.h" + +#include +#include + +template +void test_deepks::read_dm(const int nks) +{ + dm.resize(nks); + std::stringstream ss; + for (int ik = 0; ik < nks; ik++) + { + ss.str(""); + if (nks == 1) + { + ss << "dm"; + } + else + { + ss << "dm_" << ik; + } + std::ifstream ifs(ss.str().c_str()); + ASSERT_TRUE(ifs.is_open()) << "Cannot open density matrix file " << ss.str(); + dm[ik].create(this->nlocal, this->nlocal); + + for (int mu = 0; mu < this->nlocal; mu++) + { + for (int nu = 0; nu < this->nlocal; nu++) + { + T c; + ASSERT_TRUE(ifs >> c) << "Failed to read " << ss.str() << " at (" << mu << ", " << nu << ")"; + dm[ik](mu, nu) = c; + } + } + } +} + +template +void test_deepks::set_dm_new() +{ + dm_new.resize(dm.size()); + for (int i = 0; i < dm.size(); i++) + { + dm_new[i].resize(dm[i].nr * dm[i].nc); + dm_new[i].assign(dm[i].c, dm[i].c + dm[i].nr * dm[i].nc); + } +} + +template +void test_deepks::set_p_elec_DM() +{ + int nk = 1; + if (this->gamma_only_local) + { + nk = this->nspin; + this->p_elec_DM = new elecstate::DensityMatrix(&ParaO, this->nspin); + } + else + { + nk = kv.get_nkstot(); + this->p_elec_DM + = new elecstate::DensityMatrix(&ParaO, this->nspin, kv.kvec_d, kv.get_nkstot() / this->nspin); + } + p_elec_DM->init_DMR(&Test_Deepks::GridD, &ucell); + + for (int ik = 0; ik < nk; ik++) + { + p_elec_DM->set_DMK_pointer(ik, dm_new[ik].data()); + } + p_elec_DM->cal_DMR(); +} + +template +void test_deepks::check_pdm() +{ + this->read_dm(kv.get_nkstot()); + this->set_dm_new(); + this->set_p_elec_DM(); + this->ld.init_DMR(ucell, ORB, ParaO, Test_Deepks::GridD); + DeePKS_domain::update_dmr(kv.kvec_d, + p_elec_DM->get_DMK_vector(), + ucell, + ORB, + ParaO, + Test_Deepks::GridD, + this->ld.dm_r); + DeePKS_domain::cal_pdm(this->ld.init_pdm, + this->ld.deepks_param, + kv.kvec_d, + this->ld.dm_r, + this->ld.phialpha, + ucell, + ORB, + Test_Deepks::GridD, + ParaO, + this->ld.pdm); + DeePKS_domain::check_pdm(this->ld.deepks_param, this->ld.pdm); + this->assert_file_matches_reference("deepks_projdm.dat", "pdm_ref.dat"); +} + +template void test_deepks::read_dm(const int nks); +template void test_deepks>::read_dm(const int nks); +template void test_deepks::set_dm_new(); +template void test_deepks>::set_dm_new(); +template void test_deepks::set_p_elec_DM(); +template void test_deepks>::set_p_elec_DM(); +template void test_deepks::check_pdm(); +template void test_deepks>::check_pdm(); + +template +void run_deepks_unit_pdm(test_deepks& test) +{ + DeepksTestRunner::build_pdm(test); +} + +template void run_deepks_unit_pdm(test_deepks& test); +template void run_deepks_unit_pdm>(test_deepks>& test); diff --git a/source/source_lcao/module_deepks/test/deepks_test_phialpha.cpp b/source/source_lcao/module_deepks/test/deepks_test_phialpha.cpp new file mode 100644 index 00000000000..59b48204346 --- /dev/null +++ b/source/source_lcao/module_deepks/test/deepks_test_phialpha.cpp @@ -0,0 +1,51 @@ +#include "deepks_test_runner.h" + +#include "source_lcao/module_deepks/deepks_check.h" +#include "source_lcao/module_deepks/deepks_phialpha.h" + +#include + +template +void test_deepks::check_phialpha() +{ + std::vector na; + na.resize(ucell.ntype); + for (int it = 0; it < ucell.ntype; it++) + { + na[it] = ucell.atoms[it].na; + } + this->ld.init(ORB, ucell.nat, ucell.ntype, kv.get_nkstot(), ParaO, na, GlobalV::ofs_running); + + DeePKS_domain::allocate_phialpha(this->cal_force, ucell, ORB, Test_Deepks::GridD, &ParaO, this->ld.phialpha); + DeePKS_domain::build_phialpha(this->cal_force, + ucell, + ORB, + Test_Deepks::GridD, + &ParaO, + overlap_orb_alpha_, + this->ld.phialpha); + DeePKS_domain::check_phialpha(this->cal_force, + ucell, + ORB, + Test_Deepks::GridD, + &ParaO, + this->ld.phialpha, + 0); + + this->assert_file_matches_reference("phialpha.dat", "phialpha_ref.dat"); + this->assert_file_matches_reference("dphialpha_x.dat", "dphialpha_x_ref.dat"); + this->assert_file_matches_reference("dphialpha_y.dat", "dphialpha_y_ref.dat"); + this->assert_file_matches_reference("dphialpha_z.dat", "dphialpha_z_ref.dat"); +} + +template void test_deepks::check_phialpha(); +template void test_deepks>::check_phialpha(); + +template +void run_deepks_unit_phialpha(test_deepks& test) +{ + test.check_phialpha(); +} + +template void run_deepks_unit_phialpha(test_deepks& test); +template void run_deepks_unit_phialpha>(test_deepks>& test); diff --git a/source/source_lcao/module_deepks/test/LCAO_deepks_test_prep.cpp b/source/source_lcao/module_deepks/test/deepks_test_prep.cpp similarity index 68% rename from source/source_lcao/module_deepks/test/LCAO_deepks_test_prep.cpp rename to source/source_lcao/module_deepks/test/deepks_test_prep.cpp index 4b6621d5dd5..6b115fa1557 100644 --- a/source/source_lcao/module_deepks/test/LCAO_deepks_test_prep.cpp +++ b/source/source_lcao/module_deepks/test/deepks_test_prep.cpp @@ -1,10 +1,23 @@ -#include "LCAO_deepks_test.h" +#include "deepks_test.h" #include "source_base/global_variable.h" -#define private public -#include "source_io/module_parameter/parameter.h" -#undef private #include "source_estate/read_pseudo.h" #include "source_hamilt/module_xc/exx_info.h" +#include "source_io/module_parameter/parameter.h" + +#include + +namespace +{ +Input_para& mutable_input_for_deepks_unit() +{ + return const_cast(PARAM.inp); +} + +System_para& mutable_system_for_deepks_unit() +{ + return const_cast(PARAM.globalv); +} +} // namespace Magnetism::Magnetism() { @@ -26,6 +39,10 @@ void test_deepks::preparation() { this->count_ntype(); this->set_parameters(); + if (testing::Test::HasFatalFailure()) + { + return; + } this->setup_cell(); @@ -35,33 +52,50 @@ void test_deepks::preparation() this->set_orbs(); this->prep_neighbour(); - this->ParaO.set_serial(PARAM.globalv.nlocal, PARAM.globalv.nlocal); - this->ParaO.nrow_bands = PARAM.globalv.nlocal; - this->ParaO.ncol_bands = PARAM.inp.nbands; + this->ParaO.set_serial(this->nlocal, this->nlocal); + this->ParaO.nrow_bands = this->nlocal; + this->ParaO.ncol_bands = this->nbands; // Zhang Xiaoyang enable the serial version of LCAO and recovered this function usage. 2024-07-06 - this->ParaO.set_atomic_trace(ucell.get_iat2iwt(), ucell.nat, PARAM.globalv.nlocal); + this->ParaO.set_atomic_trace(ucell.get_iat2iwt(), ucell.nat, this->nlocal); } template void test_deepks::set_parameters() { - PARAM.input.basis_type = "lcao"; - // GlobalV::global_pseudo_type= "auto"; - PARAM.input.pseudo_rcut = 15.0; - PARAM.sys.global_out_dir = "./"; + Input_para& input = mutable_input_for_deepks_unit(); + System_para& system = mutable_system_for_deepks_unit(); + + input.basis_type = "lcao"; + input.kpoint_file = "KPT"; + input.pseudo_rcut = 15.0; + input.cal_force = this->cal_force; + input.gamma_only = this->gamma_only_local; + input.nspin = this->nspin; + input.orbital_dir = this->orbital_dir; + input.out_element_info = this->out_element_info; + system.global_out_dir = "./"; GlobalV::ofs_warning.open("warning.log"); GlobalV::ofs_running.open("running.log"); - PARAM.sys.deepks_setorb = true; - PARAM.input.cal_force = 1; + system.deepks_setorb = this->deepks_setorb; std::ifstream ifs("INPUT"); + ASSERT_TRUE(ifs.is_open()) << "Cannot open DeePKS unit-test INPUT"; char word[80]; - ifs >> word; - ifs >> PARAM.sys.gamma_only_local; + ASSERT_TRUE(ifs >> word); + ASSERT_STREQ(word, "gamma_only_local"); + ASSERT_TRUE(ifs >> this->gamma_only_local); ifs.close(); - ucell.latName = "none"; + input.gamma_only = this->gamma_only_local; + system.gamma_only_local = this->gamma_only_local; + system.npol = this->npol; + GlobalV::KPAR = 1; + GlobalV::MY_POOL = 0; + GlobalV::RANK_IN_POOL = 0; + GlobalV::NPROC_IN_POOL = 1; + + ucell.latName = "user_defined_lattice"; ucell.ntype = ntype; return; } @@ -158,6 +192,9 @@ void test_deepks::setup_cell() { ucell.setup_cell("STRU", GlobalV::ofs_running); elecstate::read_pseudo(GlobalV::ofs_running, ucell); + this->nlocal = PARAM.globalv.nlocal; + this->nbands = PARAM.inp.nbands; + this->npol = PARAM.globalv.npol; return; } @@ -166,17 +203,17 @@ template void test_deepks::prep_neighbour() { double search_radius = atom_arrange::set_sr_NL(GlobalV::ofs_running, - PARAM.input.out_level, + this->out_level, ORB.get_rcutmax_Phi(), ucell.infoNL.get_rcutmax_Beta(), - PARAM.sys.gamma_only_local); + this->gamma_only_local); - atom_arrange::search(PARAM.globalv.search_pbc, + atom_arrange::search(this->search_pbc, GlobalV::ofs_running, Test_Deepks::GridD, ucell, search_radius, - PARAM.inp.test_atom_input); + this->test_atom_input); } template @@ -184,7 +221,7 @@ void test_deepks::set_orbs() { ORB.init(GlobalV::ofs_running, ucell.ntype, - PARAM.inp.orbital_dir, + this->orbital_dir, ucell.orbital_fn.data(), ucell.descriptor_file, ucell.lmax, @@ -192,17 +229,17 @@ void test_deepks::set_orbs() lcao_dk, lcao_dr, lcao_rmax, - PARAM.sys.deepks_setorb, + this->deepks_setorb, out_mat_r, - PARAM.inp.out_element_info, - PARAM.input.cal_force, + this->out_element_info, + this->cal_force, my_rank); ucell.infoNL.setupNonlocal(ucell.ntype, ucell.atoms, GlobalV::ofs_running, ORB); orb_.build(ntype, ucell.orbital_fn.data()); - std::string file_alpha = PARAM.inp.orbital_dir + ucell.descriptor_file; + std::string file_alpha = this->orbital_dir + ucell.descriptor_file; alpha_.build(1, &file_alpha); double rmax = std::max(orb_.rcut_max(), alpha_.rcut_max()); @@ -220,13 +257,14 @@ void test_deepks::set_orbs() template void test_deepks::setup_kpt() { - this->kv.set("KPT", - PARAM.input.nspin, + ModuleSymmetry::Symmetry::symm_flag = -1; + this->kv.set(ucell, + ucell.symm, + PARAM.inp.kpoint_file, + this->nspin, ucell.G, ucell.latvec, - PARAM.sys.gamma_only_local, - GlobalV::ofs_running, - GlobalV::ofs_warning); + GlobalV::ofs_running); } template class test_deepks; diff --git a/source/source_lcao/module_deepks/test/deepks_test_runner.h b/source/source_lcao/module_deepks/test/deepks_test_runner.h new file mode 100644 index 00000000000..37e185f381d --- /dev/null +++ b/source/source_lcao/module_deepks/test/deepks_test_runner.h @@ -0,0 +1,52 @@ +#ifndef DEEPKS_TEST_RUNNER_H_ +#define DEEPKS_TEST_RUNNER_H_ + +#include "deepks_test.h" + +#include +#include +#include + +namespace DeepksTestRunner +{ +template +void build_phialpha(test_deepks& test) +{ + test.check_phialpha(); +} + +template +void build_pdm(test_deepks& test) +{ + build_phialpha(test); + if (testing::Test::HasFatalFailure()) + { + return; + } + test.check_pdm(); +} + +template +void build_descriptor(test_deepks& test, std::vector& descriptor) +{ + build_pdm(test); + if (testing::Test::HasFatalFailure()) + { + return; + } + test.check_descriptor(descriptor); +} + +template +void build_edelta(test_deepks& test, std::vector& descriptor) +{ + build_descriptor(test, descriptor); + if (testing::Test::HasFatalFailure()) + { + return; + } + test.check_edelta(descriptor); +} +} // namespace DeepksTestRunner + +#endif diff --git a/source/source_lcao/module_deepks/test/deepks_test_vdpre.cpp b/source/source_lcao/module_deepks/test/deepks_test_vdpre.cpp new file mode 100644 index 00000000000..634332c5986 --- /dev/null +++ b/source/source_lcao/module_deepks/test/deepks_test_vdpre.cpp @@ -0,0 +1,47 @@ +#include "deepks_test_runner.h" + +#include "source_lcao/module_deepks/deepks_basic.h" +#include "source_lcao/module_deepks/deepks_check.h" +#include "source_lcao/module_deepks/deepks_vdpre.h" + +#include + +template +void test_deepks::check_vdpre() +{ + std::vector gevdm; + torch::Tensor vdpre; + DeePKS_domain::cal_gevdm(ucell.nat, this->ld.deepks_param, this->ld.pdm, gevdm); + DeePKS_domain::cal_v_delta_precalc(this->nlocal, + ucell.nat, + kv.get_nkstot(), + this->ld.deepks_param, + kv.kvec_d, + this->ld.phialpha, + gevdm, + ucell, + ORB, + ParaO, + Test_Deepks::GridD, + vdpre); + DeePKS_domain::check_tensor(vdpre, "v_delta_precalc.dat", 0); + this->assert_file_matches_reference("v_delta_precalc.dat", "vdpre_ref.dat"); +} + +template void test_deepks::check_vdpre(); +template void test_deepks>::check_vdpre(); + +template +void run_deepks_unit_vdpre(test_deepks& test) +{ + std::vector descriptor; + DeepksTestRunner::build_descriptor(test, descriptor); + if (testing::Test::HasFatalFailure()) + { + return; + } + test.check_vdpre(); +} + +template void run_deepks_unit_vdpre(test_deepks& test); +template void run_deepks_unit_vdpre>(test_deepks>& test); diff --git a/source/source_lcao/module_deepks/test/deepks_test_vdrpre.cpp b/source/source_lcao/module_deepks/test/deepks_test_vdrpre.cpp new file mode 100644 index 00000000000..af0883bafb4 --- /dev/null +++ b/source/source_lcao/module_deepks/test/deepks_test_vdrpre.cpp @@ -0,0 +1,66 @@ +#include "deepks_test_runner.h" + +#include "source_lcao/module_deepks/deepks_basic.h" +#include "source_lcao/module_deepks/deepks_check.h" +#include "source_lcao/module_deepks/deepks_vdrpre.h" + +#include + +template +void test_deepks::check_vdrpre() +{ + std::vector gevdm; + torch::Tensor vdrpre; + torch::Tensor overlap_out; + torch::Tensor iRmat; + DeePKS_domain::cal_gevdm(ucell.nat, this->ld.deepks_param, this->ld.pdm, gevdm); + const int R_size = 3; + DeePKS_domain::cal_vdr_precalc(this->nlocal, + ucell.nat, + kv.get_nkstot(), + R_size, + this->ld.deepks_param, + kv.kvec_d, + this->ld.phialpha, + gevdm, + ucell, + ORB, + ParaO, + Test_Deepks::GridD, + vdrpre); + DeePKS_domain::prepare_phialpha_iRmat(this->nlocal, + R_size, + this->ld.deepks_param, + this->ld.phialpha, + ucell, + ORB, + ParaO, + Test_Deepks::GridD, + overlap_out, + iRmat); + torch::Tensor vdrpre_sliced = vdrpre.slice(0, 0, 2, 1).slice(1, 0, 1, 1).slice(2, 0, 1, 1); + DeePKS_domain::check_tensor(vdrpre_sliced, "vdr_precalc.dat", 0); + DeePKS_domain::check_tensor(overlap_out, "phialpha_r.dat", 0); + DeePKS_domain::check_tensor(iRmat, "iRmat.dat", 0); + this->assert_file_matches_reference("vdr_precalc.dat", "vdrpre_ref.dat"); + this->assert_file_matches_reference("phialpha_r.dat", "phialpha_r_ref.dat"); + this->assert_file_matches_reference("iRmat.dat", "iRmat_ref.dat"); +} + +template void test_deepks::check_vdrpre(); +template void test_deepks>::check_vdrpre(); + +template +void run_deepks_unit_vdrpre(test_deepks& test) +{ + std::vector descriptor; + DeepksTestRunner::build_descriptor(test, descriptor); + if (testing::Test::HasFatalFailure()) + { + return; + } + test.check_vdrpre(); +} + +template void run_deepks_unit_vdrpre(test_deepks& test); +template void run_deepks_unit_vdrpre>(test_deepks>& test); diff --git a/source/source_lcao/module_deepks/test/klist.h b/source/source_lcao/module_deepks/test/klist.h deleted file mode 100644 index 373554e5497..00000000000 --- a/source/source_lcao/module_deepks/test/klist.h +++ /dev/null @@ -1,68 +0,0 @@ -/// klist : adapted from klist from source_pw/module_pwdft -/// deals with k point sampling - -#include "source_base/global_function.h" -#include "source_base/matrix3.h" -#include "source_base/vector3.h" - -#include -#include - -namespace Test_Deepks -{ -class K_Vectors -{ - public: - ModuleBase::Vector3* kvec_c; // Cartesian coordinates of k points - std::vector> kvec_d; // Direct coordinates of k points - - double* wk; // wk, weight of k points - - int* isk; // distinguish spin up and down k points - - int nkstot; // total number of k points - - int nmp[3]; // Number of Monhorst-Pack - - K_Vectors(); - ~K_Vectors(); - - void set(const std::string& k_file_name, - const int& nspin, - const ModuleBase::Matrix3& reciprocal_vec, - const ModuleBase::Matrix3& latvec, - bool& GAMMA_ONLY_LOCAL, - std::ofstream& ofs_running, - std::ofstream& ofs_warning); - - private: - int nspin; - bool kc_done; - bool kd_done; - double koffset[3]; // used only in automatic k-points. - std::string k_kword; // LiuXh add 20180619 - int k_nkstot; // LiuXh add 20180619 - - // step 1 : generate kpoints - bool read_kpoints(const std::string& fn, - bool& GAMMA_ONLY_LOCAL, - std::ofstream& ofs_warning, - std::ofstream& ofs_running); - void Monkhorst_Pack(const int* nmp_in, const double* koffset_in, const int tipo); - double Monkhorst_Pack_formula(const int& k_type, const double& offset, const int& n, const int& dim); - - // step 2 : set both kvec and kved; normalize weight - void set_both_kvec(const ModuleBase::Matrix3& G, const ModuleBase::Matrix3& Rm, std::ofstream& ofs_running); - void renew(const int& kpoint_number); - void normalize_wk(const int& degspin); - - // step 3 : *2 or *4 kpoints. - // *2 for LSDA - // *4 for non-collinear - void set_kup_and_kdw(std::ofstream& ofs_running); - - // step 4 - // print k lists. - void print_klists(std::ofstream& fn_running); -}; -} // namespace Test_Deepks diff --git a/source/source_lcao/module_deepks/test/klist_1.cpp b/source/source_lcao/module_deepks/test/klist_1.cpp deleted file mode 100644 index 68ecb8f0469..00000000000 --- a/source/source_lcao/module_deepks/test/klist_1.cpp +++ /dev/null @@ -1,590 +0,0 @@ -#include "klist.h" -#include "source_io/module_parameter/parameter.h" -#include "source_base/memory_recorder.h" -namespace Test_Deepks -{ -K_Vectors::K_Vectors() -{ - nspin = 0; // default spin. - kc_done = false; - kd_done = false; - - kvec_c = new ModuleBase::Vector3[1]; - kvec_d.resize(1); - - wk = nullptr; - isk = nullptr; - - nkstot = 0; -} - -K_Vectors::~K_Vectors() -{ - delete[] kvec_c; - kvec_d.clear(); - delete[] wk; - delete[] isk; -} - -void K_Vectors::set(const std::string& k_file_name, - const int& nspin_in, - const ModuleBase::Matrix3& reciprocal_vec, - const ModuleBase::Matrix3& latvec, - bool& GAMMA_ONLY_LOCAL, - std::ofstream& ofs_running, - std::ofstream& ofs_warning) -{ - - ofs_running << "\n\n\n\n"; - ofs_running << " >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" << std::endl; - ofs_running << " | |" << std::endl; - ofs_running << " | Setup K-points |" << std::endl; - ofs_running << " | We setup the k-points according to input parameters. |" << std::endl; - ofs_running << " | The reduced k-points are set according to symmetry operations. |" << std::endl; - ofs_running << " | We treat the spin as another set of k-points. |" << std::endl; - ofs_running << " | |" << std::endl; - ofs_running << " <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" << std::endl; - ofs_running << "\n\n\n\n"; - - ofs_running << "\n SETUP K-POINTS" << std::endl; - - // (1) set nspin, read kpoints. - this->nspin = nspin_in; - ModuleBase::GlobalFunc::OUT(ofs_running, "nspin", nspin); - - bool read_succesfully = this->read_kpoints(k_file_name, GAMMA_ONLY_LOCAL, ofs_warning, ofs_running); - if (!read_succesfully) - { - ofs_warning << "in K_Vectors::set, something wrong while reading KPOINTS." << std::endl; - exit(1); - } - - // (2) - this->set_both_kvec(reciprocal_vec, latvec, ofs_running); - - int deg = 0; - if (PARAM.inp.nspin == 1) - { - deg = 2; - } - else if (PARAM.inp.nspin == 2 || PARAM.inp.nspin == 4) - { - deg = 1; - } - else - { - ofs_warning << "In K_Vectors::set, Only available for nspin = 1 or 2 or 4" << std::endl; - exit(1); - } - this->normalize_wk(deg); - - // It's very important in parallel case, - // firstly do the mpi_k() and then - // do set_kup_and_kdw() - - this->set_kup_and_kdw(ofs_running); - - this->print_klists(ofs_running); - // std::cout << " NUMBER OF K-POINTS : " << nkstot << std::endl; - - return; -} - -void K_Vectors::renew(const int& kpoint_number) -{ - delete[] kvec_c; - delete[] wk; - delete[] isk; - - kvec_c = new ModuleBase::Vector3[kpoint_number]; - kvec_d.resize(kpoint_number); - wk = new double[kpoint_number]; - isk = new int[kpoint_number]; - - ModuleBase::Memory::record("KV::kvec_c", sizeof(double) * kpoint_number * 3); - ModuleBase::Memory::record("KV::kvec_d", sizeof(double) * kpoint_number * 3); - ModuleBase::Memory::record("KV::wk", sizeof(double) * kpoint_number * 3); - ModuleBase::Memory::record("KV::isk", sizeof(int) * kpoint_number * 3); - - return; -} - -bool K_Vectors::read_kpoints(const std::string& fn, - bool& GAMMA_ONLY_LOCAL, - std::ofstream& ofs_warning, - std::ofstream& ofs_running) -{ - - std::ifstream ifk(fn.c_str()); - ifk >> std::setiosflags(std::ios::uppercase); - - ifk.clear(); - ifk.seekg(0); - - std::string word; - std::string kword; - - int ierr = 0; - - ifk.rdstate(); - - while (ifk.good()) - { - ifk >> word; - ifk.ignore(150, '\n'); // LiuXh add 20180416, fix bug in k-point file when the first line with comments - if (word == "K_POINTS" || word == "KPOINTS" || word == "K") - { - ierr = 1; - break; - } - - ifk.rdstate(); - } - - if (ierr == 0) - { - ofs_warning << " symbol K_POINTS not found." << std::endl; - return 0; - } - - // input k-points are in 2pi/a units - ModuleBase::GlobalFunc::READ_VALUE(ifk, nkstot); - - // std::cout << " nkstot = " << nkstot << std::endl; - ModuleBase::GlobalFunc::READ_VALUE(ifk, kword); - - // mohan update 2021-02-22 - int max_kpoints = 100000; - if (nkstot > 100000) - { - ofs_warning << " nkstot > MAX_KPOINTS" << std::endl; - return 0; - } - - int k_type = 0; - if (nkstot == 0) // nkstot==0, use monkhorst_pack. add by dwan - { - if (kword == "Gamma") - { - k_type = 0; - ModuleBase::GlobalFunc::OUT(ofs_running, "Input type of k points", "Monkhorst-Pack(Gamma)"); - } - else if (kword == "Monkhorst-Pack" || kword == "MP" || kword == "mp") - { - k_type = 1; - ModuleBase::GlobalFunc::OUT(ofs_running, "Input type of k points", "Monkhorst-Pack"); - } - else - { - ofs_warning << " Error: neither Gamma nor Monkhorst-Pack." << std::endl; - return 0; - } - - ifk >> nmp[0] >> nmp[1] >> nmp[2]; - - ifk >> koffset[0] >> koffset[1] >> koffset[2]; - this->Monkhorst_Pack(nmp, koffset, k_type); - } - else if (nkstot > 0) - { - if (kword == "Cartesian" || kword == "C") - { - this->renew(nkstot * nspin); // mohan fix bug 2009-09-01 - for (int i = 0; i < nkstot; i++) - { - ifk >> kvec_c[i].x >> kvec_c[i].y >> kvec_c[i].z; - ModuleBase::GlobalFunc::READ_VALUE(ifk, wk[i]); - } - - this->kc_done = true; - } - else if (kword == "Direct" || kword == "D") - { - this->renew(nkstot * nspin); // mohan fix bug 2009-09-01 - for (int i = 0; i < nkstot; i++) - { - ifk >> kvec_d[i].x >> kvec_d[i].y >> kvec_d[i].z; - ModuleBase::GlobalFunc::READ_VALUE(ifk, wk[i]); - } - this->kd_done = true; - } - else if (kword == "Line_Cartesian") - { - // std::cout << " kword = " << kword << std::endl; - - // how many special points. - int nks_special = this->nkstot; - // std::cout << " nks_special = " << nks_special << std::endl; - - //------------------------------------------ - // number of points to the next k points - //------------------------------------------ - int* nkl = new int[nks_special]; - - //------------------------------------------ - // cartesian coordinates of special points. - //------------------------------------------ - double* ksx = new double[nks_special]; - double* ksy = new double[nks_special]; - double* ksz = new double[nks_special]; - std::vector kposx; - std::vector kposy; - std::vector kposz; - ModuleBase::GlobalFunc::ZEROS(nkl, nks_special); - - // recalculate nkstot. - nkstot = 0; - for (int iks = 0; iks < nks_special; iks++) - { - ifk >> ksx[iks]; - ifk >> ksy[iks]; - ifk >> ksz[iks]; - ModuleBase::GlobalFunc::READ_VALUE(ifk, nkl[iks]); - // std::cout << " nkl[" << iks << "]=" << nkl[iks] << std::endl; - assert(nkl[iks] >= 0); - nkstot += nkl[iks]; - } - assert(nkl[nks_special - 1] == 1); - - // std::cout << " nkstot = " << nkstot << std::endl; - this->renew(nkstot * nspin); // mohan fix bug 2009-09-01 - - int count = 0; - for (int iks = 1; iks < nks_special; iks++) - { - double dx = (ksx[iks] - ksx[iks - 1]) / nkl[iks - 1]; - double dy = (ksy[iks] - ksy[iks - 1]) / nkl[iks - 1]; - double dz = (ksz[iks] - ksz[iks - 1]) / nkl[iks - 1]; - // GlobalV::ofs_running << " dx=" << dx << " dy=" << dy << " dz=" << dz << std::endl; - for (int is = 0; is < nkl[iks - 1]; is++) - { - kvec_c[count].x = ksx[iks - 1] + is * dx; - kvec_c[count].y = ksy[iks - 1] + is * dy; - kvec_c[count].z = ksz[iks - 1] + is * dz; - ++count; - } - } - - // deal with the last special k point. - kvec_c[count].x = ksx[nks_special - 1]; - kvec_c[count].y = ksy[nks_special - 1]; - kvec_c[count].z = ksz[nks_special - 1]; - ++count; - - // std::cout << " count = " << count << std::endl; - assert(count == nkstot); - - for (int ik = 0; ik < nkstot; ik++) - { - wk[ik] = 1.0; - } - - ofs_warning << " Error : nkstot == -1, not implemented yet." << std::endl; - - delete[] nkl; - delete[] ksx; - delete[] ksy; - delete[] ksz; - - this->kc_done = true; - } - - else if (kword == "Line_Direct" || kword == "L" || kword == "Line") - { - // std::cout << " kword = " << kword << std::endl; - - // how many special points. - int nks_special = this->nkstot; - // std::cout << " nks_special = " << nks_special << std::endl; - - //------------------------------------------ - // number of points to the next k points - //------------------------------------------ - int* nkl = new int[nks_special]; - - //------------------------------------------ - // cartesian coordinates of special points. - //------------------------------------------ - double* ksx = new double[nks_special]; - double* ksy = new double[nks_special]; - double* ksz = new double[nks_special]; - std::vector kposx; - std::vector kposy; - std::vector kposz; - ModuleBase::GlobalFunc::ZEROS(nkl, nks_special); - - // recalculate nkstot. - nkstot = 0; - for (int iks = 0; iks < nks_special; iks++) - { - ifk >> ksx[iks]; - ifk >> ksy[iks]; - ifk >> ksz[iks]; - ModuleBase::GlobalFunc::READ_VALUE(ifk, nkl[iks]); - // std::cout << " nkl[" << iks << "]=" << nkl[iks] << std::endl; - assert(nkl[iks] >= 0); - nkstot += nkl[iks]; - } - assert(nkl[nks_special - 1] == 1); - - // std::cout << " nkstot = " << nkstot << std::endl; - this->renew(nkstot * nspin); // mohan fix bug 2009-09-01 - - int count = 0; - for (int iks = 1; iks < nks_special; iks++) - { - double dx = (ksx[iks] - ksx[iks - 1]) / nkl[iks - 1]; - double dy = (ksy[iks] - ksy[iks - 1]) / nkl[iks - 1]; - double dz = (ksz[iks] - ksz[iks - 1]) / nkl[iks - 1]; - // GlobalV::ofs_running << " dx=" << dx << " dy=" << dy << " dz=" << dz << std::endl; - for (int is = 0; is < nkl[iks - 1]; is++) - { - kvec_d[count].x = ksx[iks - 1] + is * dx; - kvec_d[count].y = ksy[iks - 1] + is * dy; - kvec_d[count].z = ksz[iks - 1] + is * dz; - ++count; - } - } - - // deal with the last special k point. - kvec_d[count].x = ksx[nks_special - 1]; - kvec_d[count].y = ksy[nks_special - 1]; - kvec_d[count].z = ksz[nks_special - 1]; - ++count; - - // std::cout << " count = " << count << std::endl; - assert(count == nkstot); - - for (int ik = 0; ik < nkstot; ik++) - { - wk[ik] = 1.0; - } - - ofs_warning << " Error : nkstot == -1, not implemented yet." << std::endl; - - delete[] nkl; - delete[] ksx; - delete[] ksy; - delete[] ksz; - - this->kd_done = true; - } - - else - { - ofs_warning << " Error : neither Cartesian nor Direct kpoint." << std::endl; - return 0; - } - } - - ModuleBase::GlobalFunc::OUT(ofs_running, "nkstot", nkstot); - return 1; -} // END SUBROUTINE - -double K_Vectors::Monkhorst_Pack_formula(const int& k_type, const double& offset, const int& n, const int& dim) -{ - double coordinate; - if (k_type == 1) - coordinate = (offset + 2.0 * (double)n - (double)dim - 1.0) / (2.0 * (double)dim); - else - coordinate = (offset + (double)n - 1.0) / (double)dim; - - return coordinate; -} - -// add by dwan -void K_Vectors::Monkhorst_Pack(const int* nmp_in, const double* koffset_in, const int k_type) -{ - const int mpnx = nmp_in[0]; - const int mpny = nmp_in[1]; - const int mpnz = nmp_in[2]; - - this->nkstot = mpnx * mpny * mpnz; - // only can renew after nkstot is estimated. - this->renew(nkstot * nspin); // mohan fix bug 2009-09-01 - for (int x = 1; x <= mpnx; x++) - { - double v1 = Monkhorst_Pack_formula(k_type, koffset_in[0], x, mpnx); - if (std::abs(v1) < 1.0e-10) - v1 = 0.0; // mohan update 2012-06-10 - for (int y = 1; y <= mpny; y++) - { - double v2 = Monkhorst_Pack_formula(k_type, koffset_in[1], y, mpny); - if (std::abs(v2) < 1.0e-10) - v2 = 0.0; - for (int z = 1; z <= mpnz; z++) - { - double v3 = Monkhorst_Pack_formula(k_type, koffset_in[2], z, mpnz); - if (std::abs(v3) < 1.0e-10) - v3 = 0.0; - // index of nks kpoint - const int i = mpnx * mpny * (z - 1) + mpnx * (y - 1) + (x - 1); - kvec_d[i].set(v1, v2, v3); - } - } - } - - const double weight = 1.0 / static_cast(nkstot); - for (int ik = 0; ik < nkstot; ik++) - { - wk[ik] = weight; - } - this->kd_done = true; - - return; -} - -void K_Vectors::set_both_kvec(const ModuleBase::Matrix3& G, const ModuleBase::Matrix3& R, std::ofstream& ofs_running) -{ - // set cartesian k vectors. - if (!kc_done && kd_done) - { - for (int i = 0; i < nkstot; i++) - { - // wrong!! kvec_c[i] = G * kvec_d[i]; - // mohan fixed bug 2010-1-10 - if (std::abs(kvec_d[i].x) < 1.0e-10) - kvec_d[i].x = 0.0; - if (std::abs(kvec_d[i].y) < 1.0e-10) - kvec_d[i].y = 0.0; - if (std::abs(kvec_d[i].z) < 1.0e-10) - kvec_d[i].z = 0.0; - - // mohan add2012-06-10 - if (std::abs(kvec_c[i].x) < 1.0e-10) - kvec_c[i].x = 0.0; - if (std::abs(kvec_c[i].y) < 1.0e-10) - kvec_c[i].y = 0.0; - if (std::abs(kvec_c[i].z) < 1.0e-10) - kvec_c[i].z = 0.0; - } - kc_done = true; - } - - // set direct k vectors - else if (kc_done && !kd_done) - { - ModuleBase::Matrix3 RT = R.Transpose(); - for (int i = 0; i < nkstot; i++) - { - // std::cout << " ik=" << i - // << " kvec.x=" << kvec_c[i].x - // << " kvec.y=" << kvec_c[i].y - // << " kvec.z=" << kvec_c[i].z << std::endl; - // wrong! kvec_d[i] = RT * kvec_c[i]; - // mohan fixed bug 2011-03-07 - kvec_d[i] = kvec_c[i] * RT; - } - kd_done = true; - } - - ofs_running << "\n " << std::setw(8) << "KPOINTS" << std::setw(20) << "DIRECT_X" << std::setw(20) << "DIRECT_Y" - << std::setw(20) << "DIRECT_Z" << std::setw(20) << "WEIGHT" << std::endl; - - for (int i = 0; i < nkstot; i++) - { - ofs_running << " " << std::setw(8) << i + 1 << std::setw(20) << this->kvec_d[i].x << std::setw(20) - << this->kvec_d[i].y << std::setw(20) << this->kvec_d[i].z << std::setw(20) << this->wk[i] - << std::endl; - } - - return; -} - -void K_Vectors::normalize_wk(const int& degspin) -{ - double sum = 0.0; - - for (int ik = 0; ik < nkstot; ik++) - { - sum += this->wk[ik]; - } - assert(sum > 0.0); - - for (int ik = 0; ik < nkstot; ik++) - { - this->wk[ik] /= sum; - } - - for (int ik = 0; ik < nkstot; ik++) - { - this->wk[ik] *= degspin; - } - - return; -} - -//---------------------------------------------------------- -// This routine sets the k vectors for the up and down spin -//---------------------------------------------------------- -// from set_kup_and_kdw.f90 -void K_Vectors::set_kup_and_kdw(std::ofstream& ofs_running) -{ - //========================================================================= - // on output: the number of points is doubled and xk and wk in the - // first (nks/2) positions correspond to up spin - // those in the second (nks/2) ones correspond to down spin - //========================================================================= - switch (nspin) - { - case 1: - - for (int ik = 0; ik < nkstot; ik++) - { - this->isk[ik] = 0; - } - - break; - - case 2: - - for (int ik = 0; ik < nkstot; ik++) - { - this->kvec_c[ik + nkstot] = kvec_c[ik]; - this->kvec_d[ik + nkstot] = kvec_d[ik]; - this->wk[ik + nkstot] = wk[ik]; - this->isk[ik] = 0; - this->isk[ik + nkstot] = 1; - } - - this->nkstot *= 2; - - ModuleBase::GlobalFunc::OUT(ofs_running, "nkstot(nspin=2)", nkstot); - break; - case 4: - - for (int ik = 0; ik < nkstot; ik++) - { - this->isk[ik] = 0; - } - - break; - } - - return; -} // end subroutine set_kup_and_kdw - -void K_Vectors::print_klists(std::ofstream& ofs_running) -{ - ofs_running << "\n " << std::setw(8) << "KPOINTS" << std::setw(20) << "CARTESIAN_X" << std::setw(20) - << "CARTESIAN_Y" << std::setw(20) << "CARTESIAN_Z" << std::setw(20) << "WEIGHT" << std::endl; - for (int i = 0; i < nkstot; i++) - { - ofs_running << " " << std::setw(8) << i + 1 << std::setw(20) << this->kvec_c[i].x << std::setw(20) - << this->kvec_c[i].y << std::setw(20) << this->kvec_c[i].z << std::setw(20) << this->wk[i] - << std::endl; - } - - ofs_running << "\n " << std::setw(8) << "KPOINTS" << std::setw(20) << "DIRECT_X" << std::setw(20) << "DIRECT_Y" - << std::setw(20) << "DIRECT_Z" << std::setw(20) << "WEIGHT" << std::endl; - for (int i = 0; i < nkstot; i++) - { - ofs_running << " " << std::setw(8) << i + 1 << std::setw(20) << this->kvec_d[i].x << std::setw(20) - << this->kvec_d[i].y << std::setw(20) << this->kvec_d[i].z << std::setw(20) << this->wk[i] - << std::endl; - } - - return; -} - -} // namespace Test_Deepks diff --git a/source/source_lcao/module_deepks/test/main_deepks.cpp b/source/source_lcao/module_deepks/test/main_deepks.cpp index a80e07db69a..77188ca0755 100644 --- a/source/source_lcao/module_deepks/test/main_deepks.cpp +++ b/source/source_lcao/module_deepks/test/main_deepks.cpp @@ -1,97 +1,121 @@ -#include "LCAO_deepks_test.h" +#include "deepks_test_runner.h" + +#include + #ifdef __MPI #include #endif -int calculate(); - -template -void run_tests(test_deepks& test); +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef DEEPKS_UT_CHECK_NAME +#error "DEEPKS_UT_CHECK_NAME must be defined by CMake." +#endif -int main(int argc, char** argv) -{ -#ifdef __MPI - MPI_Init(&argc, &argv); +#ifndef DEEPKS_UT_CASE_DIR +#error "DEEPKS_UT_CASE_DIR must be defined by CMake." #endif - int status = calculate(); -#ifdef __MPI - MPI_Finalize(); + +#ifndef DEEPKS_UT_RUNNER +#error "DEEPKS_UT_RUNNER must be defined by CMake." #endif - if (status > 0) - { - return 1; - } - else - { - return 0; - } -} +template +void DEEPKS_UT_RUNNER(test_deepks& test); -int calculate() +namespace { - std::ifstream ifs("INPUT"); - char word[80]; - bool gamma_only_local; - ifs >> word; - ifs >> gamma_only_local; - ifs.close(); - - if (gamma_only_local) - { - test_deepks test; - run_tests(test); - return test.failed_check; - } - else +std::string shell_quote(const std::string& value) +{ + std::string quoted = "'"; + for (std::string::const_iterator it = value.begin(); it != value.end(); ++it) { - test_deepks> test; - run_tests(test); - return test.failed_check; + if (*it == '\'') + { + quoted += "'\\''"; + } + else + { + quoted += *it; + } } + quoted += "'"; + return quoted; } -template -void run_tests(test_deepks& test) +void prepare_workdir() { - test.preparation(); - - test.check_dstable(); - test.check_phialpha(); + const std::string case_dir = DEEPKS_UT_CASE_DIR; + const std::string check_name = DEEPKS_UT_CHECK_NAME; + const std::string run_root = "deepks_unit_run_" + case_dir + "_" + check_name; - test.check_pdm(); + std::ostringstream command; + command << "rm -rf " << shell_quote(run_root) << " && " + << "mkdir -p " << shell_quote(run_root) << " && " + << "cp -R " << shell_quote("support/" + case_dir) << " " << shell_quote(run_root + "/" + case_dir); - std::vector descriptor; - test.check_descriptor(descriptor); + ASSERT_EQ(std::system(command.str().c_str()), 0) << "Failed to prepare DeePKS unit-test work directory"; - torch::Tensor gdmx; - test.check_gdmx(gdmx); - test.check_gvx(gdmx); + const std::string workdir = run_root + "/" + case_dir; + ASSERT_EQ(chdir(workdir.c_str()), 0) << "Failed to chdir to " << workdir << ": " << std::strerror(errno); +} - torch::Tensor gdmepsl; - test.check_gdmepsl(gdmepsl); - test.check_gvepsl(gdmepsl); +template +void run_typed_check() +{ + test_deepks test; + test.preparation(); + if (testing::Test::HasFatalFailure()) + { + return; + } + DEEPKS_UT_RUNNER(test); +} - test.check_orbpre(); +void gamma_only_case(bool* gamma_only_local) +{ + std::ifstream ifs("INPUT"); + std::string key; + ASSERT_TRUE(ifs.is_open()) << "Cannot open DeePKS unit-test INPUT"; + ASSERT_TRUE(ifs >> key) << "Cannot read gamma_only_local key from DeePKS unit-test INPUT"; + ASSERT_EQ(key, "gamma_only_local") << "Unexpected first entry in DeePKS unit-test INPUT"; + ASSERT_TRUE(ifs >> *gamma_only_local) << "Cannot read gamma_only_local value from DeePKS unit-test INPUT"; +} +} // namespace - test.check_vdpre(); - test.check_vdrpre(); +TEST(DeePKSUnitTest, ConfiguredCheck) +{ + prepare_workdir(); - test.check_edelta(descriptor); - test.check_e_deltabands(); - test.check_f_delta_and_stress_delta(); - test.check_o_delta(); + bool gamma_only_local = false; + ASSERT_NO_FATAL_FAILURE(gamma_only_case(&gamma_only_local)); - std::cout << " [ ------ ] Total checks : " << test.total_check << std::endl; - if (test.failed_check > 0) + if (gamma_only_local) { - std::cout << "\e[1;31m [ FAILED ]\e[0m Failed checks : " << test.failed_check << std::endl; + run_typed_check(); } else { - std::cout << "\e[1;32m [ PASS ]\e[0m All checks passed!" << std::endl; + run_typed_check>(); } } -template void run_tests(test_deepks& test); -template void run_tests(test_deepks>& test); \ No newline at end of file +int main(int argc, char** argv) +{ +#ifdef __MPI + MPI_Init(&argc, &argv); +#endif + testing::InitGoogleTest(&argc, argv); + const int result = RUN_ALL_TESTS(); +#ifdef __MPI + MPI_Finalize(); +#endif + return result; +} diff --git a/source/source_lcao/module_deepks/test/mock_berryphase.cpp b/source/source_lcao/module_deepks/test/mock_berryphase.cpp new file mode 100644 index 00000000000..12090830601 --- /dev/null +++ b/source/source_lcao/module_deepks/test/mock_berryphase.cpp @@ -0,0 +1,3 @@ +#include "source_io/module_unk/berryphase.h" + +bool berryphase::berry_phase_flag = false; diff --git a/source/source_lcao/module_deepks/test/mock_tdinfo.cpp b/source/source_lcao/module_deepks/test/mock_tdinfo.cpp index 5c1af5ed8f2..d61e33157a0 100644 --- a/source/source_lcao/module_deepks/test/mock_tdinfo.cpp +++ b/source/source_lcao/module_deepks/test/mock_tdinfo.cpp @@ -1,10 +1,15 @@ #include "source_base/vector3.h" #include "source_cell/unitcell.h" // mock of TD_info -class TD_info { -public: - TD_info() {} - ~TD_info() {} +class TD_info +{ + public: + TD_info() + { + } + ~TD_info() + { + } const UnitCell* get_ucell() { return nullptr; @@ -14,4 +19,4 @@ class TD_info { }; TD_info td_info; TD_info* TD_info::td_vel_op = &td_info; -ModuleBase::Vector3 TD_info::cart_At(0.0, 0.0, 0.0); \ No newline at end of file +ModuleBase::Vector3 TD_info::cart_At(0.0, 0.0, 0.0); diff --git a/source/source_lcao/module_deepks/test/parallel_orbitals.h b/source/source_lcao/module_deepks/test/parallel_orbitals.h deleted file mode 100644 index 0908a533d25..00000000000 --- a/source/source_lcao/module_deepks/test/parallel_orbitals.h +++ /dev/null @@ -1,23 +0,0 @@ -/// adapted from parallel_orbitals from source_basis/module_ao -/// deals with the parallelization of atomic basis - -#include "source_base/global_function.h" -#include "source_base/global_variable.h" - -namespace Test_Deepks -{ -class Parallel_Orbitals -{ - public: - Parallel_Orbitals(); - ~Parallel_Orbitals(); - - int* global2local_row; - int* global2local_col; - void set_global2local(void); - - int ncol; - int nrow; - int nloc; -}; -} // namespace Test_Deepks diff --git a/source/source_lcao/module_deepks/test/support/.gitignore b/source/source_lcao/module_deepks/test/support/.gitignore new file mode 100644 index 00000000000..cd5483d0099 --- /dev/null +++ b/source/source_lcao/module_deepks/test/support/.gitignore @@ -0,0 +1 @@ +!**/*.dat diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/E_delta_bands_ref.dat b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/E_delta_bands_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/E_delta_bands_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/E_delta_bands_ref.dat diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/E_delta_ref.dat b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/E_delta_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/E_delta_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/E_delta_ref.dat diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/F_delta_ref.dat b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/F_delta_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/F_delta_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/F_delta_ref.dat diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/INPUT b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/INPUT similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/INPUT rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/INPUT diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/KPT b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/KPT similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/KPT rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/KPT diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/STRU b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/STRU similarity index 66% rename from tests/09_DeePKS/NO_GO_deepks_UT/STRU rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/STRU index 5c03d5e45ff..4b87bef0cb1 100644 --- a/tests/09_DeePKS/NO_GO_deepks_UT/STRU +++ b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/STRU @@ -1,10 +1,10 @@ ATOMIC_SPECIES -C 12.000 ../../PP_ORB/C_ONCV_PBE-1.0.upf #Element, Mass, Pseudopotential -H 1.008 ../../PP_ORB/H_ONCV_PBE-1.0.upf +C 12.000 @DEEPKS_UT_PP_ORB_DIR@/C_ONCV_PBE-1.0.upf #Element, Mass, Pseudopotential +H 1.008 @DEEPKS_UT_PP_ORB_DIR@/H_ONCV_PBE-1.0.upf NUMERICAL_ORBITAL -../../PP_ORB/C_gga_8au_100Ry_1s1p.orb -../../PP_ORB/H_gga_6au_60Ry_1s.orb +@DEEPKS_UT_PP_ORB_DIR@/C_gga_8au_100Ry_1s1p.orb +@DEEPKS_UT_PP_ORB_DIR@/H_gga_6au_60Ry_1s.orb NUMERICAL_DESCRIPTOR jle.orb diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/S_I_mu_alpha_ref.dat b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/S_I_mu_alpha_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/S_I_mu_alpha_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/S_I_mu_alpha_ref.dat diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/descriptor_ref.dat b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/descriptor_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/descriptor_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/descriptor_ref.dat diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/dm b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/dm similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/dm rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/dm diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/dphialpha_x_ref.dat b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/dphialpha_x_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/dphialpha_x_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/dphialpha_x_ref.dat diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/dphialpha_y_ref.dat b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/dphialpha_y_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/dphialpha_y_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/dphialpha_y_ref.dat diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/dphialpha_z_ref.dat b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/dphialpha_z_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/dphialpha_z_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/dphialpha_z_ref.dat diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/gdmepsl_ref.dat b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/gdmepsl_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/gdmepsl_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/gdmepsl_ref.dat diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/gdmx_ref.dat b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/gdmx_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/gdmx_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/gdmx_ref.dat diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/gedm_ref.dat b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/gedm_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/gedm_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/gedm_ref.dat diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/gvepsl_ref.dat b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/gvepsl_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/gvepsl_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/gvepsl_ref.dat diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/gvx_ref.dat b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/gvx_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/gvx_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/gvx_ref.dat diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/iRmat_ref.dat b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/iRmat_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/iRmat_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/iRmat_ref.dat diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/jle.orb b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/jle.orb similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/jle.orb rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/jle.orb diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/model.ptg b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/model.ptg similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/model.ptg rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/model.ptg diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/o_delta_ref.dat b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/o_delta_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/o_delta_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/o_delta_ref.dat diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/orbpre_ref.dat b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/orbpre_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/orbpre_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/orbpre_ref.dat diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/pdm_ref.dat b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/pdm_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/pdm_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/pdm_ref.dat diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/phialpha_r_ref.dat b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/phialpha_r_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/phialpha_r_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/phialpha_r_ref.dat diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/phialpha_ref.dat b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/phialpha_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/phialpha_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/phialpha_ref.dat diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/stress_delta_ref.dat b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/stress_delta_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/stress_delta_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/stress_delta_ref.dat diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/vdpre_ref.dat b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/vdpre_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/vdpre_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/vdpre_ref.dat diff --git a/tests/09_DeePKS/NO_GO_deepks_UT/vdrpre_ref.dat b/source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/vdrpre_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_GO_deepks_UT/vdrpre_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_GO_deepks_UT/vdrpre_ref.dat diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/E_delta_bands_ref.dat b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/E_delta_bands_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/E_delta_bands_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/E_delta_bands_ref.dat diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/E_delta_ref.dat b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/E_delta_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/E_delta_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/E_delta_ref.dat diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/F_delta_ref.dat b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/F_delta_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/F_delta_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/F_delta_ref.dat diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/INPUT b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/INPUT similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/INPUT rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/INPUT diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/KPT b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/KPT similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/KPT rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/KPT diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/STRU b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/STRU similarity index 66% rename from tests/09_DeePKS/NO_KP_deepks_UT/STRU rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/STRU index 743d25b5616..61580fc6d6d 100644 --- a/tests/09_DeePKS/NO_KP_deepks_UT/STRU +++ b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/STRU @@ -1,6 +1,6 @@ ATOMIC_SPECIES -O 1.00 ../../PP_ORB/O_ONCV_PBE-1.0.upf -H 1.00 ../../PP_ORB/H_ONCV_PBE-1.0.upf +O 1.00 @DEEPKS_UT_PP_ORB_DIR@/O_ONCV_PBE-1.0.upf +H 1.00 @DEEPKS_UT_PP_ORB_DIR@/H_ONCV_PBE-1.0.upf LATTICE_CONSTANT 1 @@ -24,8 +24,8 @@ H -0.2473714095935 -0.0346105497687 0.63538026574395 1 1 1 NUMERICAL_ORBITAL -../../PP_ORB/O_gga_6au_60Ry_1s1p.orb -../../PP_ORB/H_gga_6au_60Ry_1s.orb +@DEEPKS_UT_PP_ORB_DIR@/O_gga_6au_60Ry_1s1p.orb +@DEEPKS_UT_PP_ORB_DIR@/H_gga_6au_60Ry_1s.orb NUMERICAL_DESCRIPTOR jle.orb diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/S_I_mu_alpha_ref.dat b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/S_I_mu_alpha_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/S_I_mu_alpha_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/S_I_mu_alpha_ref.dat diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/descriptor_ref.dat b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/descriptor_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/descriptor_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/descriptor_ref.dat diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/dm_0 b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dm_0 similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/dm_0 rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dm_0 diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/dm_1 b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dm_1 similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/dm_1 rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dm_1 diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/dm_2 b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dm_2 similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/dm_2 rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dm_2 diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/dm_3 b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dm_3 similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/dm_3 rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dm_3 diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/dm_4 b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dm_4 similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/dm_4 rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dm_4 diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/dm_5 b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dm_5 similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/dm_5 rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dm_5 diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/dm_6 b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dm_6 similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/dm_6 rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dm_6 diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/dm_7 b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dm_7 similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/dm_7 rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dm_7 diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/dm_8 b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dm_8 similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/dm_8 rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dm_8 diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/dphialpha_x_ref.dat b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dphialpha_x_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/dphialpha_x_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dphialpha_x_ref.dat diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/dphialpha_y_ref.dat b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dphialpha_y_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/dphialpha_y_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dphialpha_y_ref.dat diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/dphialpha_z_ref.dat b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dphialpha_z_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/dphialpha_z_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/dphialpha_z_ref.dat diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/gdmepsl_ref.dat b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/gdmepsl_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/gdmepsl_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/gdmepsl_ref.dat diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/gdmx_ref.dat b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/gdmx_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/gdmx_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/gdmx_ref.dat diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/gedm_ref.dat b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/gedm_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/gedm_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/gedm_ref.dat diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/gvepsl_ref.dat b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/gvepsl_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/gvepsl_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/gvepsl_ref.dat diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/gvx_ref.dat b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/gvx_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/gvx_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/gvx_ref.dat diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/iRmat_ref.dat b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/iRmat_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/iRmat_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/iRmat_ref.dat diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/jle.orb b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/jle.orb similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/jle.orb rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/jle.orb diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/model.ptg b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/model.ptg similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/model.ptg rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/model.ptg diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/o_delta_ref.dat b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/o_delta_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/o_delta_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/o_delta_ref.dat diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/orbpre_ref.dat b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/orbpre_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/orbpre_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/orbpre_ref.dat diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/pdm_ref.dat b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/pdm_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/pdm_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/pdm_ref.dat diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/phialpha_r_ref.dat b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/phialpha_r_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/phialpha_r_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/phialpha_r_ref.dat diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/phialpha_ref.dat b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/phialpha_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/phialpha_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/phialpha_ref.dat diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/stress_delta_ref.dat b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/stress_delta_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/stress_delta_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/stress_delta_ref.dat diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/vdpre_ref.dat b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/vdpre_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/vdpre_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/vdpre_ref.dat diff --git a/tests/09_DeePKS/NO_KP_deepks_UT/vdrpre_ref.dat b/source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/vdrpre_ref.dat similarity index 100% rename from tests/09_DeePKS/NO_KP_deepks_UT/vdrpre_ref.dat rename to source/source_lcao/module_deepks/test/support/NO_KP_deepks_UT/vdrpre_ref.dat diff --git a/tests/09_DeePKS/Autotest1.sh b/tests/09_DeePKS/Autotest1.sh deleted file mode 100755 index b86261010e9..00000000000 --- a/tests/09_DeePKS/Autotest1.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/bash - -# deepks_test executable path -deepks_test=test_deepks -# regex for test cases -case="^[^#].*_.*$" - -while getopts a:r flag -do - case "${flag}" in - a) deepks_test=${OPTARG};; - r) case=${OPTARG};; - esac -done - -echo "-----AUTO TESTS OF ABACUS-DEEPKS 2------" -echo "deepks_test path: $deepks_test"; -echo "Test cases: $case" -echo "--------------------------------" -echo "" - -testdir=`cat CASES1 | grep -E $case` -failed=0 - -for dir in $testdir -do - cd $dir - echo -e "\e[1;32m [ RUN ]\e[0m $dir" - echo -e " [ ------ ] test module_deepks components" - $deepks_test - state=`echo $?` - if [ $state != "0" ]; then - let failed++ - running_path=`echo "./running.log"` - cat $running_path - fi - cd .. - echo"" -done - -if [ $failed -eq 0 ] -then - exit 0 -else - exit 1 -fi - - diff --git a/tests/09_DeePKS/CMakeLists.txt b/tests/09_DeePKS/CMakeLists.txt index 4f1fd0bc075..11c9b0cd9df 100644 --- a/tests/09_DeePKS/CMakeLists.txt +++ b/tests/09_DeePKS/CMakeLists.txt @@ -7,11 +7,6 @@ if(ENABLE_ASAN) COMMAND ${BASH} ../integrate/Autotest.sh -a ${ABACUS_BIN_PATH} -n 2 -s true WORKING_DIRECTORY ${ABACUS_TEST_DIR}/09_DeePKS ) - add_test( - NAME 09_DeePKS_test1_with_asan - COMMAND ${BASH} Autotest1.sh -a ${CMAKE_CURRENT_BINARY_DIR}/../../source/source_lcao/module_deepks/test/test_deepks - WORKING_DIRECTORY ${ABACUS_TEST_DIR}/09_DeePKS - ) else() add_test( @@ -19,10 +14,4 @@ else() COMMAND ${BASH} ../integrate/Autotest.sh -a ${ABACUS_BIN_PATH} -n 4 WORKING_DIRECTORY ${ABACUS_TEST_DIR}/09_DeePKS ) - # TODO: I will rewrite the unit tests and remove 604 to module_deepks/test/ - add_test( - NAME 09_DeePKS_test1 - COMMAND ${BASH} Autotest1.sh -a ${CMAKE_CURRENT_BINARY_DIR}/../../source/source_lcao/module_deepks/test/test_deepks - WORKING_DIRECTORY ${ABACUS_TEST_DIR}/09_DeePKS - ) endif()