diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 34820bf5e..2ed6f8f51 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -55,7 +55,7 @@ jobs: - name: Install prerequisite MacOS packages if: ${{ steps.skip_check.outputs.should_skip != 'true' && matrix.os == 'macos-latest' }} run: | - brew install ninja gcc@10 boost eigen bison ccache automake python3 numpy scipy + brew install ninja gcc@10 boost eigen bison ccache automake python@3.11 numpy scipy echo "FC=/usr/local/bin/gfortran-10" >> $GITHUB_ENV echo "EIGEN3_INCLUDE_DIR=/usr/local/include/eigen3" >> $GITHUB_ENV diff --git a/CHANGES b/CHANGES index 71ac128cb..b54d84dfa 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,8 @@ Following is a brief summary of changes made in each release of Libint. - 2022-xx-yy: 2.8.0-beta.1 + - UNMERGED PR #271: Add `libint2::configuration_accessor` and `libint2::supports` functions. If + library source is patched, these provides codes for what integrals a library instance can supply. - UNMERGED PR #271: Small pkgconfig and cmake detection improvements. Enable unity build. Testing of solid harmonics runtime switchable from #269. - PR #270: For Windows, basis sets with a star have been renamed to "s" on the filesystem, @@ -17,6 +19,9 @@ Following is a brief summary of changes made in each release of Libint. - PR #269: Solid harmonics ordering is runtime switchable in the library. Issue `libint2::set_solid_harmonics_ordering(libint2::SHGShellOrdering_Gaussian)` or `_Standard` after initialization. Similarly, prefer new `INT_SOLIDHARMINDEX(sho, l, m)` to usual `(l, m)` version. + - PR #269: The ordering for spherical multipole integrals has been fixed at Standard, rather than + Gaussian or Standard as previously. Note that between this and the next item above, the + `--with-shgauss-ordering=standard|gaussian` has been rendered pointless for the C++ interface. - PR #268: Python detection (relevant to Python bindings, Fortran, and some tests) now uses modern `find_package(Python)`. Specify with `Python_EXECUTABLE` (note change in case) or https://cmake.org/cmake/help/latest/module/FindPython.html for details . diff --git a/INSTALL.md b/INSTALL.md index 0e59e3298..8bd925408 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -3,7 +3,7 @@ Functions are provided to check the library configuration and solid harmonics orderings at runtime: Note: As of v2.8.0 (libtool-based), the configuration_accessor() function will return `(nyi)` by default. - Packagers are encouraged to patch a generated configuration string into file `configuration.cc` to + Packagers are encouraged to patch a generated configuration string into file `configuration.cc.cmake.in` to imitate future cmake-based behavior. See sample patch below. ``` @@ -11,13 +11,16 @@ libint2::initialize(); printf("SHGShell: %d\n", libint2::solid_harmonics_ordering()); libint2::set_solid_harmonics_ordering(libint2::SHGShellOrdering_Gaussian); printf("SHGShell: %d\n", libint2::solid_harmonics_ordering()); +// if patched as described above printf("Configuration: %s\n", libint2::configuration_accessor().c_str()); +printf("Supports: dddd=%d mmmm=%d\n", libint2::supports("eri_dddd_d0"), libint2::supports("eri_mmmm_d0")); libint2::finalize(); ``` ``` SHGShell: 1 SHGShell: 2 -Configuration: eri_c4_d0_l2;eri_c4_d0_l3;ss;... +Configuration: eri_dddd_d0_l2;eri_ffff_d0;ss;... +Supports: dddd=1 mmmm=0 ``` For the C library, a similar function is available: @@ -26,7 +29,7 @@ For the C library, a similar function is available: printf("CMake Configuration (C) : %s\n", configuration_accessor()); ``` ``` -CMake Configuration (C) : eri_c4_d0_l2;eri_c4_d0_l3;ss;... +CMake Configuration (C) : eri_dddd_d0;eri_ffff_d0;ss;... ``` If you have a built libint2 library whose history you don't know, a command like this on Linux can provide the same information: @@ -35,7 +38,7 @@ If you have a built libint2 library whose history you don't know, a command like strings -n80 /a/random/L2/lying/around/libint2.so ``` ``` -eri_c2_d0_l2;eri_c2_d0_l3;eri_c2_d1_l2;eri_c3_d0_l2;eri_c3_d0_l3;eri_c3_d1_l2;eri_c4_d0_l2;eri_c4_d1_l2;impure_sh;onebody_d0_l2;onebody_d0_l3;onebody_d1_l2;ss +ss;onebody_i_d0;onebody_h_d0;eri_iiI_d0;eri_iii_d0;eri_II_d0;eri_ii_d0;eri_hhhh_d0;eri_hhH_d0;eri_hhh_d0;eri_HH_d0;eri_hh_d0;eri_gggg_d1;eri_dddd_d1 ``` A patch like the following is suitable for an export tarball generated from the next following. @@ -49,8 +52,8 @@ A patch like the following is suitable for an export tarball generated from the const char * configuration_accessor() { //return "@Libint2_CONFIG_COMPONENTS@"; - return "(nyi)"; -+ return "eri_c2_d0_l2;eri_c2_d0_l3;eri_c2_d0_l4;eri_c2_d0_l5;eri_c2_d0_l6;eri_c2_d1_l2;eri_c2_d1_l3;eri_c2_d1_l4;eri_c2_d1_l5;eri_c3_d0_l2;eri_c3_d0_l3;eri_c3_d0_l4;eri_c3_d0_l5;eri_c3_d0_l6;eri_c3_d1_l2;eri_c3_d1_l3;eri_c3_d1_l4;eri_c3_d1_l5;eri_c4_d0_l2;eri_c4_d0_l3;eri_c4_d0_l4;eri_c4_d0_l5;eri_c4_d1_l2;eri_c4_d1_l3;eri_c4_d1_l4;g12_d0_l2;g12_d0_l3;g12_d0_l4;g12_d1_l2;g12_d1_l3;g12_d1_l4;impure_sh;onebody_d0_l2;onebody_d0_l3;onebody_d0_l4;onebody_d0_l5;onebody_d0_l6;onebody_d1_l2;onebody_d1_l3;onebody_d1_l4;onebody_d1_l5;onebody_d2_l2;onebody_d2_l3;onebody_d2_l4;ss"; - } ++ return "ss;multipole_n;multipole_m;multipole_l;multipole_k;multipole_i;multipole_h;multipole_g;multipole_f;multipole_d;onebody_i_d0;onebody_h_d0;onebody_g_d0;onebody_f_d0;onebody_d_d0;onebody_h_d1;onebody_g_d1;onebody_f_d1;onebody_d_d1;onebody_g_d2;onebody_f_d2;onebody_d_d2;eri_hhhh_d0;eri_gggg_d0;eri_ffff_d0;eri_dddd_d0;eri_gggg_d1;eri_ffff_d1;eri_dddd_d1;eri_iiI_d0;eri_hhI_d0;eri_hhH_d0;eri_ggI_d0;eri_ggH_d0;eri_ggG_d0;eri_ffI_d0;eri_ffH_d0;eri_ffG_d0;eri_ffF_d0;eri_ddI_d0;eri_ddH_d0;eri_ddG_d0;eri_ddF_d0;eri_ddD_d0;eri_hhH_d1;eri_ggH_d1;eri_ggG_d1;eri_ffH_d1;eri_ffG_d1;eri_ffF_d1;eri_ddH_d1;eri_ddG_d1;eri_ddF_d1;eri_ddD_d1;eri_iii_d0;eri_hhi_d0;eri_hhh_d0;eri_ggi_d0;eri_ggh_d0;eri_ggg_d0;eri_ffi_d0;eri_ffh_d0;eri_ffg_d0;eri_fff_d0;eri_ddi_d0;eri_ddh_d0;eri_ddg_d0;eri_ddf_d0;eri_ddd_d0;eri_hhh_d1;eri_ggh_d1;eri_ggg_d1;eri_ffh_d1;eri_ffg_d1;eri_fff_d1;eri_ddh_d1;eri_ddg_d1;eri_ddf_d1;eri_ddd_d1;eri_II_d0;eri_HH_d0;eri_GG_d0;eri_FF_d0;eri_DD_d0;eri_HH_d1;eri_GG_d1;eri_FF_d1;eri_DD_d1;eri_ii_d0;eri_hh_d0;eri_gg_d0;eri_ff_d0;eri_dd_d0;eri_hh_d1;eri_gg_d1;eri_ff_d1;eri_dd_d1;g12_g_d0;g12_f_d0;g12_d_d0;g12_g_d1;g12_f_d1;g12_d_d1"; +} ``` ``` ./configure \ @@ -60,7 +63,7 @@ A patch like the following is suitable for an export tarball generated from the --enable-1body=2 \ --enable-g12=1 \ --disable-1body-property-derivs \ - --with-multipole-max-order=4 \ + --with-multipole-max-order=10 \ --with-g12-max-am=4 \ --with-eri-max-am=5,4 \ --with-eri3-max-am=6,5 \ @@ -68,16 +71,47 @@ A patch like the following is suitable for an export tarball generated from the --with-max-am=6,5 ``` + #### Configuration Codes Evenually, these will be CMake Components, too. ``` - onebody_dD_lL - library includes 1-body integrals with derivative order D (D=0,1,2,...) and max angular momentum up to L (L=2,3,4,...) - eri_cC_dD_lL - library includes 2-body integrals with C (C=2,3,4) centers, derivative order D (D=0,1,2,...), and max angular momentum up to L (L=2,3,4,...) - g12_dD-lL - library includes F12 integrals with Gaussian factors with derivative order D and max angular momentum up to L - - impure_sh - library doesn't assume that 2- and 3-center integrals involve pure solid harmonics + multipole_h - library includes spherical multipole integrals with max angular momentum up to + "h" (h=(sp)dfghikl...; s,p not enumerated). + For example, the presence of "multipole_i" means mpole ints are available for L=6. + onebody_h_dD - library includes 1-body integrals with max angular momentum up to "h" + (h=(sp)dfghikl...; s,p not enumerated) and derivative order "D" (D=0,1,2,...). + For example, the presence of "onebody_i_d1" means onebody gradient ints are + available for L=6. + eri_hhhh_dD - library includes 2-body integrals with 4 centers and max angular momentum up to + "h" (h=(sp)dfghikl...; s,p not enumerated) and derivative order "D" (D=0,1,2,...). + For example, the presence of "eri_ffff_d1" means 4-center gradient ints are + available for L=3. That is, the library was configured with at least + "--enable-eri=1 --with-eri-max-am=?,>=3". + eri_hhL_dD - library includes 2-body integrals with 3 centers and max angular momentum up to + eri_hhl_dD Cartesian "h" for the two paired centers and Cartesian "l" or solid harmonics "L" + for the unpaired/fitting center, (h/l=(sp)dfghikl..., L=(SP)DFGHIKL...; l>=h + enumerated; s,p not enumerated) and derivative order "D" (D=0,1,2,...). The + "eri_hhL_dD" component is always available when 3-center ints are present. When pure + solid harmonics are assumed for 3-center ints, "eri_hhl_dD" will *not be available*. + For example, the presence of "eri_ffG_d0" means 3-center energy ints are + available for L=3 (paired centers) and L=4 (fitting center). That is, the library + was configured with at least "--enable-eri3=0 --with-max-am=3 --with-eri3-max-am=4". + The presence of "eri_ffg_d0" means the library configuration did not additionally + include "--enable-eri3-pure-sh[=yes]". + eri_HH_dD - library includes 2-body integrals with 2 centers and max angular momentum up to + eri_hh_dD Cartesian "h" or solid harmonics "H", (h=(sp)dfghikl..., H=(SP)DFGHIKL...; s,p not + enumerated) and derivative order "D" (D=0,1,2,...). The "eri_HH_dD" component is + always available when 2-center ints are present. When pure solid harmonics are + assumed for 2-center ints, "eri_hh_dD" will *not be available*. + For example, the presence of "eri_FF_d2" means 2-center Hessian ints are + available for L=3. That is, the library was configured with at least + "--enable-eri2=2 --with-eri2-max-am=?,?,>=3". The presence of "eri_ff_d2" means the + library configuration did not additionally include "--enable-eri2-pure-sh[=yes]". + g12_h_dD - library includes F12 integrals with Gaussian factors max angular momentum up to + "h" (h=(sp)dfghikl...; s,p not enumerated) and derivative order "D" (D=0,1,2,...). + For example, the presence of "g12_i_d2" means g12 Hessian ints are available for L=6. cart shell_set used_by -------- --------- ------- diff --git a/include/libint2/util/configuration.h b/include/libint2/util/configuration.h index cfa1e119e..39a55da29 100644 --- a/include/libint2/util/configuration.h +++ b/include/libint2/util/configuration.h @@ -28,6 +28,8 @@ const char * configuration_accessor(); #ifdef _libint2_src_lib_libint_cxxapi_h_ #include +#include +#include namespace libint2 { @@ -38,6 +40,19 @@ namespace libint2 { std::string components = ::configuration_accessor(); return components; } + + /// Runtime accessor for individual library configuration components: + /// integral derivatives, AM, orderings, etc. + /// @param[in] target CMake component with maximally uniform AM + /// @return whether target component available + inline bool supports(std::string component) { + std::string segment; + std::vector seglist; + std::stringstream ca(configuration_accessor()); + while(std::getline(ca, segment, ';')) { seglist.push_back(segment); } + bool tf = (std::find(seglist.begin(), seglist.end(), component) != seglist.end()); + return tf; + } } #endif /* cxxapi guard */ diff --git a/tests/unit/test.cc b/tests/unit/test.cc index 13e0b901b..5b21d2769 100644 --- a/tests/unit/test.cc +++ b/tests/unit/test.cc @@ -34,6 +34,7 @@ int main( int argc, char* argv[] ) libint2::initialize(); libint2::set_solid_harmonics_ordering(libint2::SHGShellOrdering_Standard); // redundant printf("Configuration S: sho=%d components=%s\n", libint2::solid_harmonics_ordering(), libint2::configuration_accessor().c_str()); + printf("Supports: dddd=%d mmmm=%d FF=%d\n", libint2::supports("eri_dddd_d0"), libint2::supports("eri_mmmm_d0"), libint2::supports("eri_FF_d0")); #ifdef LIBINT_HAS_MPFR // default to 256 bits of precision for mpf_class