From d29994c9cede577fcbaf2365c3e740d1b17a5bed Mon Sep 17 00:00:00 2001 From: aodongliu Date: Fri, 3 May 2024 13:55:50 -0700 Subject: [PATCH] check if spin is polarized before constructing epc kernel --- include/exchcxx/impl/xc_kernel.hpp | 4 ++-- src/builtin_interface.cxx | 15 ++++++++++----- src/libxc.cxx | 7 ++++++- test/reference_values.hpp | 1 - test/xc_kernel_test.cxx | 8 ++++++-- 5 files changed, 24 insertions(+), 11 deletions(-) diff --git a/include/exchcxx/impl/xc_kernel.hpp b/include/exchcxx/impl/xc_kernel.hpp index 39cf906..99e283b 100644 --- a/include/exchcxx/impl/xc_kernel.hpp +++ b/include/exchcxx/impl/xc_kernel.hpp @@ -76,7 +76,7 @@ struct XCKernelImpl { bool is_mgga() const noexcept { return is_mgga_(); } bool is_hyb() const noexcept { return is_hyb_(); } bool is_polarized() const noexcept { return is_polarized_(); } - bool is_epc() const noexcept { return is_epc_(); } + bool is_epc() const noexcept { return is_epc_(); } bool needs_laplacian() const noexcept { return needs_laplacian_(); } bool needs_tau() const noexcept { return needs_tau_(); } @@ -178,7 +178,7 @@ struct XCKernelImpl { virtual bool is_mgga_() const noexcept = 0; virtual bool is_hyb_() const noexcept = 0; virtual bool is_polarized_() const noexcept = 0; - virtual bool is_epc_() const noexcept = 0; + virtual bool is_epc_() const noexcept = 0; virtual bool needs_laplacian_() const noexcept = 0; virtual bool needs_tau_() const noexcept = 0; diff --git a/src/builtin_interface.cxx b/src/builtin_interface.cxx index a064276..a470cf0 100644 --- a/src/builtin_interface.cxx +++ b/src/builtin_interface.cxx @@ -46,6 +46,7 @@ #include #include #include +#include namespace ExchCXX { @@ -117,16 +118,20 @@ std::unique_ptr else if( kern == Kernel::PC07OPT_K ) return std::make_unique( polar ); - else if( kern == Kernel::EPC17_1) + else if( kern == Kernel::EPC17_1) { + EXCHCXX_BOOL_CHECK("EPC17_1 Needs to be Spin-Polarized!",polar==Spin::Polarized); return std::make_unique( polar ); - else if( kern == Kernel::EPC17_2) + } else if( kern == Kernel::EPC17_2) { + EXCHCXX_BOOL_CHECK("EPC17_2 Needs to be Spin-Polarized!",polar==Spin::Polarized); return std::make_unique( polar ); - else if( kern == Kernel::EPC18_1) + } else if( kern == Kernel::EPC18_1) { + EXCHCXX_BOOL_CHECK("EPC18_1 Needs to be Spin-Polarized!",polar==Spin::Polarized); return std::make_unique( polar ); - else if( kern == Kernel::EPC18_2) + } else if( kern == Kernel::EPC18_2) { + EXCHCXX_BOOL_CHECK("EPC18_2 Needs to be Spin-Polarized!",polar==Spin::Polarized); return std::make_unique( polar ); - else + } else throw std::runtime_error("Specified kernel does not have a builtin implementation"); diff --git a/src/libxc.cxx b/src/libxc.cxx index db4e67f..7c37251 100644 --- a/src/libxc.cxx +++ b/src/libxc.cxx @@ -232,7 +232,12 @@ bool LibxcKernelImpl::is_polarized_() const noexcept { bool LibxcKernelImpl::is_epc_() const noexcept { int xcNumber = xc_info()->number; - return xcNumber == 328 or xcNumber == 329 or xcNumber == 330 or xcNumber or 331; + return +#if XC_MAJOR_VERSION > 7 + xcNumber == XC_LDA_C_EPC17 or xcNumber == XC_LDA_C_EPC17_2 or xcNumber == XC_LDA_C_EPC18_1 or xcNumber == XC_LDA_C_EPC18_2; +#else + xcNumber == 328 or xcNumber == 329 or xcNumber == 330 or xcNumber or 331; +#endif } diff --git a/test/reference_values.hpp b/test/reference_values.hpp index e73a717..4e2a462 100644 --- a/test/reference_values.hpp +++ b/test/reference_values.hpp @@ -81,7 +81,6 @@ struct mgga_reference { lda_reference load_lda_reference_values(ExchCXX::Kernel, ExchCXX::Spin); gga_reference load_gga_reference_values(ExchCXX::Kernel, ExchCXX::Spin); mgga_reference load_mgga_reference_values(ExchCXX::Kernel, ExchCXX::Spin, bool need_lap); -lda_reference load_epc_lda_reference_values(ExchCXX::Kernel, ExchCXX::Spin); lda_reference gen_lda_reference_values(ExchCXX::Backend, ExchCXX::Kernel, ExchCXX::Spin); gga_reference gen_gga_reference_values(ExchCXX::Backend, ExchCXX::Kernel, ExchCXX::Spin); diff --git a/test/xc_kernel_test.cxx b/test/xc_kernel_test.cxx index 8a5a560..29d7d24 100644 --- a/test/xc_kernel_test.cxx +++ b/test/xc_kernel_test.cxx @@ -1011,15 +1011,19 @@ TEST_CASE( "Builtin Corectness Test", "[xc-builtin]" ) { TEST_CASE( "Scale and Increment Interface", "[xc-inc]" ) { SECTION( "Builtin Unpolarized EXC" ) { - for( auto kern : builtin_supported_kernels ) + for( auto kern : builtin_supported_kernels ) { + if(is_epc(kern)) continue; kernel_test( TestInterface::EXC_INC, Backend::builtin, kern, Spin::Unpolarized ); + } } SECTION( "Builtin Unpolarized EXC + VXC" ) { - for( auto kern : builtin_supported_kernels ) + for( auto kern : builtin_supported_kernels ) { + if(is_epc(kern)) continue; kernel_test( TestInterface::EXC_VXC_INC, Backend::builtin, kern, Spin::Unpolarized ); + } } SECTION( "Builtin Polarized EXC" ) {