Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
163 changes: 87 additions & 76 deletions CMakeLists.txt

Large diffs are not rendered by default.

5 changes: 4 additions & 1 deletion cmake/modules/int_am.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,7 @@ endmacro()

process_integrals_class(ONEBODY)
process_integrals_class(ERI)
process_integrals_class(RKB_ERI)
process_integrals_class(ERI3)
process_integrals_class(ERI2)
# unlike above, these classes (1) don't do AM_LIST and (2) require value in config.h if enabled
Expand Down Expand Up @@ -396,7 +397,7 @@ list(REVERSE _amlist)
list(APPEND Libint2_ERI_COMPONENTS "${_amlist}")
message(VERBOSE "setting components ${_amlist}")

foreach(_cls ONEBODY;ERI;ERI3;ERI2;G12;G12DKH)
foreach(_cls ONEBODY;ERI;RKB_ERI;ERI3;ERI2;G12;G12DKH)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there's a slight disadv to the underscore if ppl are splitting the integral codes (e.g., rkb_eri_ffff_d1) on underscore, but I think RKB_ERI is fine.

if((_cls STREQUAL G12) OR (_cls STREQUAL G12DKH))
add_feature_info(
"integral class ${_cls}"
Expand Down Expand Up @@ -433,6 +434,8 @@ foreach(_cls ONEBODY;ERI;ERI3;ERI2;G12;G12DKH)
list(APPEND _amlist "onebody_${_am${_l}}${_am${_l}}_d${_d}")
elseif (_cls STREQUAL "G12")
list(APPEND _amlist "g12_${_am${_l}}${_am${_l}}${_am${_l}}${_am${_l}}_d${_d}")
elseif (_cls STREQUAL "RKB_ERI")
list(APPEND _amlist "rkb_eri_${_am${_l}}${_am${_l}}${_am${_l}}${_am${_l}}_d${_d}")
endif()
endforeach()
if (_cls STREQUAL "ERI3")
Expand Down
276 changes: 266 additions & 10 deletions export/tests/unit/test-2body.cc
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2024 Edward F. Valeev
* Copyright (C) 2004-2026 Edward F. Valeev
*
* This file is part of Libint library.
*
Expand Down Expand Up @@ -344,6 +344,262 @@ TEST_CASE("eri geometric derivatives", "[engine][2-body]") {
}
}

TEST_CASE("RKB Coulomb integrals", "[engine][2-body]") {
std::vector<Shell> obs{// pseudorandom s
Shell{{1.0}, {{0, false, {1.0}}}, {{0.0, 0.0, 0.0}}},
// pseudorandom p
Shell{{2.0}, {{1, false, {1.0}}}, {{1.0, 1.0, 1.0}}}};

const auto max_nprim = libint2::max_nprim(obs);
const auto max_l = libint2::max_l(obs);
typedef std::array<unsigned int, 12> der_idx;

// e.g. d_xx maps the derivative index of derivative w.r.t x
// coord of ket1 and x coord of ket2 in Chemist notation.
// deriv indices for (LL|SS)
der_idx d_xx = {0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0};
der_idx d_yy = {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0};
der_idx d_zz = {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1};
der_idx d_yz = {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1};
der_idx d_zy = {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0};
der_idx d_zx = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0};
der_idx d_xz = {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1};
der_idx d_xy = {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0};
der_idx d_yx = {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0};

// deriv indices for (SS|SS)
// 0th component
der_idx xxxx = {1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0};
der_idx yyxx = {0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0};
der_idx zzxx = {0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0};
der_idx yxyx = {0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0};
der_idx xyyx = {1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0};
der_idx yxxy = {0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0};
der_idx xyxy = {1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0};
der_idx xxyy = {1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0};
der_idx yyyy = {0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0};
der_idx zzyy = {0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0};
der_idx xxzz = {1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1};
der_idx yyzz = {0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1};
der_idx zzzz = {0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1};

// x-component
der_idx zxzx = {0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0};
der_idx xzzx = {1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0};
der_idx zyzy = {0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0};
der_idx yzzy = {0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0};
der_idx zxxz = {0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1};
der_idx xzxz = {1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1};
der_idx zyyz = {0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1};
der_idx yzyz = {0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1};

// y-component
der_idx zyzx = {0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0};
der_idx yzzx = {0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0};
der_idx zxzy = {0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0};
der_idx xzzy = {1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0};
der_idx zyxz = {0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1};
der_idx yzxz = {0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1};
der_idx zxyz = {0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1};
der_idx xzyz = {1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1};

// z-component
der_idx yxxx = {0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0};
der_idx xyxx = {1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0};
der_idx xxyx = {1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0};
der_idx yyyx = {0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0};
der_idx zzyx = {0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0};
der_idx xxxy = {1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0};
der_idx yyxy = {0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0};
der_idx zzxy = {0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0};
der_idx yxyy = {0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0};
der_idx xyyy = {1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0};
der_idx yxzz = {0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1};
der_idx xyzz = {1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1};

SECTION("Coulombσpσp and σpσpCoulombσpσp") {
Engine engine_llss, engine_ssss;
try {
engine_llss = Engine(Operator::coulomb_opop, max_nprim, max_l, 0);
engine_ssss = Engine(Operator::opop_coulomb_opop, max_nprim, max_l, 0);
// TODO: need another unit test for derivatives of RKB ERIs
} catch (
Engine::lmax_exceeded &) { // skip the test if lmax exceeded or libint2
// not configured with RKB support
return;
}

const auto nshell = obs.size();
for (int s0 = 0; s0 != nshell; ++s0) {
for (int s1 = 0; s1 != nshell; ++s1) {
for (int s2 = 0; s2 != nshell; ++s2) {
for (int s3 = 0; s3 != nshell; ++s3) {
const auto &results_llss =
engine_llss.compute(obs[s0], obs[s1], obs[s2], obs[s3]);
const auto &results_ssss =
engine_ssss.compute(obs[s0], obs[s1], obs[s2], obs[s3]);
assert(results_llss.size() ==
4); // we get 4 buffers for each quaternion component

LIBINT2_REF_REALTYPE Aref[3];
for (int i = 0; i < 3; ++i) Aref[i] = obs[s0].O[i];
LIBINT2_REF_REALTYPE Bref[3];
for (int i = 0; i < 3; ++i) Bref[i] = obs[s1].O[i];
LIBINT2_REF_REALTYPE Cref[3];
for (int i = 0; i < 3; ++i) Cref[i] = obs[s2].O[i];
LIBINT2_REF_REALTYPE Dref[3];
for (int i = 0; i < 3; ++i) Dref[i] = obs[s3].O[i];

int ijkl = 0;

int l0, m0, n0;
FOR_CART(l0, m0, n0, obs[s0].contr[0].l)

int l1, m1, n1;
FOR_CART(l1, m1, n1, obs[s1].contr[0].l)

int l2, m2, n2;
FOR_CART(l2, m2, n2, obs[s2].contr[0].l)

int l3, m3, n3;
FOR_CART(l3, m3, n3, obs[s3].contr[0].l)

std::array<LIBINT2_REF_REALTYPE, 4> ref_coulomb_opop{0.0, 0.0, 0.0,
0.0};
std::array<LIBINT2_REF_REALTYPE, 4> ref_opop_coulomb_opop{0.0, 0.0,
0.0, 0.0};
uint p0123 = 0;
for (uint p0 = 0; p0 < obs[s0].nprim(); p0++) {
for (uint p1 = 0; p1 < obs[s1].nprim(); p1++) {
for (uint p2 = 0; p2 < obs[s2].nprim(); p2++) {
for (uint p3 = 0; p3 < obs[s3].nprim(); p3++, p0123++) {
const LIBINT2_REF_REALTYPE alpha0 = obs[s0].alpha[p0];
const LIBINT2_REF_REALTYPE alpha1 = obs[s1].alpha[p1];
const LIBINT2_REF_REALTYPE alpha2 = obs[s2].alpha[p2];
const LIBINT2_REF_REALTYPE alpha3 = obs[s3].alpha[p3];

const LIBINT2_REF_REALTYPE c0 = obs[s0].contr[0].coeff[p0];
const LIBINT2_REF_REALTYPE c1 = obs[s1].contr[0].coeff[p1];
const LIBINT2_REF_REALTYPE c2 = obs[s2].contr[0].coeff[p2];
const LIBINT2_REF_REALTYPE c3 = obs[s3].contr[0].coeff[p3];
const LIBINT2_REF_REALTYPE c0123 = c0 * c1 * c2 * c3;

auto eri_drrrr = [&](der_idx d_rrrr) {
return eri(d_rrrr.data(), l0, m0, n0, alpha0, Aref, l1,
m1, n1, alpha1, Bref, l2, m2, n2, alpha2, Cref,
l3, m3, n3, alpha3, Dref, 0);
};

// (LL|SS)
ref_coulomb_opop[0] +=
c0123 *
(eri_drrrr(d_xx) + eri_drrrr(d_yy) + eri_drrrr(d_zz));
ref_coulomb_opop[1] +=
c0123 * (eri_drrrr(d_yz) - eri_drrrr(d_zy));
ref_coulomb_opop[2] +=
c0123 * (eri_drrrr(d_zx) - eri_drrrr(d_xz));
ref_coulomb_opop[3] +=
c0123 * (eri_drrrr(d_xy) - eri_drrrr(d_yx));

// (SS|SS)
ref_opop_coulomb_opop[0] +=
c0123 *
(eri_drrrr(xxxx) + eri_drrrr(yyxx) + eri_drrrr(zzxx) -
eri_drrrr(yxyx) + eri_drrrr(xyyx) + eri_drrrr(yxxy) -
eri_drrrr(xyxy) + eri_drrrr(xxyy) + eri_drrrr(yyyy) +
eri_drrrr(zzyy) + eri_drrrr(xxzz) + eri_drrrr(yyzz) +
eri_drrrr(zzzz));
ref_opop_coulomb_opop[1] +=
c0123 *
(eri_drrrr(zxzx) - eri_drrrr(xzzx) - eri_drrrr(zyzy) +
eri_drrrr(yzzy) - eri_drrrr(zxxz) + eri_drrrr(xzxz) +
eri_drrrr(zyyz) - eri_drrrr(yzyz));
ref_opop_coulomb_opop[2] +=
c0123 *
(-eri_drrrr(zyzx) + eri_drrrr(yzzx) - eri_drrrr(zxzy) +
eri_drrrr(xzzy) + eri_drrrr(zyxz) - eri_drrrr(yzxz) +
eri_drrrr(zxyz) - eri_drrrr(xzyz));
ref_opop_coulomb_opop[3] +=
c0123 *
(-eri_drrrr(yxxx) + eri_drrrr(xyxx) - eri_drrrr(xxyx) -
eri_drrrr(yyyx) - eri_drrrr(zzyx) + eri_drrrr(xxxy) +
eri_drrrr(yyxy) + eri_drrrr(zzxy) - eri_drrrr(yxyy) +
eri_drrrr(xyyy) - eri_drrrr(yxzz) + eri_drrrr(xyzz));
}
}
}
}

const double ABSOLUTE_DEVIATION_THRESHOLD = 5.0E-14;
const double RELATIVE_DEVIATION_THRESHOLD =
1.0E-9; // For more detail on choice of these thresholds, see
// the comments in the TEST_CASE "eri geometric
// derivatives"

std::array<LIBINT2_REF_REALTYPE, 4> abs_errs_llss;
std::array<LIBINT2_REF_REALTYPE, 4> rel_abs_errs_llss;

std::array<LIBINT2_REF_REALTYPE, 4> abs_errs_ssss;
std::array<LIBINT2_REF_REALTYPE, 4> rel_abs_errs_ssss;

for (auto comp = 0; comp < 4; ++comp) {
abs_errs_llss[comp] =
abs(ref_coulomb_opop[comp] - results_llss[comp][ijkl]);
rel_abs_errs_llss[comp] =
abs(abs_errs_llss[comp] / ref_coulomb_opop[comp]);

abs_errs_ssss[comp] =
abs(ref_opop_coulomb_opop[comp] - results_ssss[comp][ijkl]);
rel_abs_errs_ssss[comp] =
abs(abs_errs_ssss[comp] / ref_opop_coulomb_opop[comp]);

bool llss_not_ok =
rel_abs_errs_llss[comp] > RELATIVE_DEVIATION_THRESHOLD &&
abs_errs_llss[comp] > ABSOLUTE_DEVIATION_THRESHOLD;

bool ssss_not_ok =
rel_abs_errs_ssss[comp] > RELATIVE_DEVIATION_THRESHOLD &&
abs_errs_ssss[comp] > ABSOLUTE_DEVIATION_THRESHOLD;

// no 3^n prefactor here since the intrinsic deriv order is 2
if (llss_not_ok) {
std::cout << "(l0 l1| l2 l3) = "
<< "(" << s0 << " " << s1 << " | " << s2 << " " << s3
<< ") "
<< "Elem " << ijkl << " comp= " << comp
<< " : ref = " << ref_coulomb_opop[comp]
<< " libint = " << results_llss[comp][ijkl]
<< " relabs_error = " << rel_abs_errs_llss[comp]
<< " abs_error = " << abs_errs_llss[comp]
<< std::endl;
}
if (ssss_not_ok) {
std::cout << "(l0 l1| l2 l3) = "
<< "(" << s0 << " " << s1 << " | " << s2 << " " << s3
<< ") "
<< "Elem " << ijkl << " comp= " << comp
<< " : ref = " << ref_opop_coulomb_opop[comp]
<< " libint = " << results_ssss[comp][ijkl]
<< " relabs_error = " << rel_abs_errs_ssss[comp]
<< " abs_error = " << abs_errs_ssss[comp]
<< std::endl;
}
REQUIRE(!llss_not_ok);
REQUIRE(!ssss_not_ok);
}

++ijkl;
END_FOR_CART
END_FOR_CART
END_FOR_CART
END_FOR_CART
}
}
}
}
}
}

TEST_CASE("Erfx_Coulomb integrals", "[engine][2-body]") {
// pseudorandom s shells
std::vector<Shell> obs{
Expand Down Expand Up @@ -374,12 +630,12 @@ TEST_CASE("Erfx_Coulomb integrals", "[engine][2-body]") {
REQUIRE(results[0] != nullptr);
switch (k) {
/* VALIDATION WOLFRAM CODE:
(* Integral of Coulomb kernel damped by (\[Lambda] Erf[\[Omega] r] + \
\[Sigma] Erfc[\[Omega] r]), over unit-normalized s functions, \
see Eq 52 in DOI 10.1039/b605188j *)
F0[T_] := If[T == 0, 1, Sqrt[\[Pi]/T]*Erf[Sqrt[T]]/2];
sN[a_] := ((2 a)/\[Pi])^(3/4);
VVeeErfx[\[Alpha]1_, A1_List, \[Alpha]2_, A2_List, \[Beta]1_,
(* Integral of Coulomb kernel damped by (\[Lambda] Erf[\[Omega] r] + \
\[Sigma] Erfc[\[Omega] r]), over unit-normalized s functions, \
see Eq 52 in DOI 10.1039/b605188j *)
F0[T_] := If[T == 0, 1, Sqrt[\[Pi]/T]*Erf[Sqrt[T]]/2];
sN[a_] := ((2 a)/\[Pi])^(3/4);
VVeeErfx[\[Alpha]1_, A1_List, \[Alpha]2_, A2_List, \[Beta]1_,
B1_List, \[Beta]2_, B2_List, \[Omega]_, \[Lambda]_, \[Sigma]_] :=
Module[{\[Gamma]1, \[Gamma]2, P1, P2, K1, K2, T, result, \[Rho]},
\[Gamma]1 = \[Alpha]1 + \[Beta]1;
Expand All @@ -397,13 +653,13 @@ VVeeErfx[\[Alpha]1_, A1_List, \[Alpha]2_, A2_List, \[Beta]1_,
T]) sN[\[Alpha]1] sN[\[Alpha]2] sN[\[Beta]1] sN[\[Beta]2];
Return[result];
];
Print[CForm[
Print[CForm[
N[VVeeErfx[1, {0, 0, 0}, 3, {2, 2, 2}, 2, {1, 1, 1}, 4, {3, 3, 3},
1.1, 1, 0], 20]]]
Print[CForm[
Print[CForm[
N[VVeeErfx[1, {0, 0, 0}, 3, {2, 2, 2}, 2, {1, 1, 1}, 4, {3, 3, 3},
1.1, 0, 1], 20]]]
Print[CForm[
Print[CForm[
N[VVeeErfx[1, {0, 0, 0}, 3, {2, 2, 2}, 2, {1, 1, 1}, 4, {3, 3, 3},
1.1, 2, 3], 20]]]
*/
Expand Down
17 changes: 9 additions & 8 deletions include/libint2.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,19 @@
#define _libint2_header_

#define LIBINT_T_SS_EREP_SS(mValue) \
_aB_s___0__s___1___TwoPRep_s___0__s___1___Ab__up_##mValue
_aB_s____0__s____1___TwoPRep_s____0__s____1___Ab__up_##mValue
#define LIBINT_T_SS_Km1G12_SS(mValue) \
_aB_s___0__s___1___r12_minus_1_g12_s___0__s___1___Ab__up_##mValue
_aB_s____0__s____1___r12_minus_1_g12_s____0__s____1___Ab__up_##mValue
#define LIBINT_T_SS_K0G12_SS_0 \
_aB_s___0__s___1___r12_0_g12_s___0__s___1___Ab__up_0
_aB_s____0__s____1___r12_0_g12_s____0__s____1___Ab__up_0
#define LIBINT_T_SS_K2G12_SS_0 \
_aB_s___0__s___1___r12_2_g12_s___0__s___1___Ab__up_0
_aB_s____0__s____1___r12_2_g12_s____0__s____1___Ab__up_0
#define LIBINT_T_SS_K4G12_SS_0 \
_aB_s___0__s___1___r12_4_g12_s___0__s___1___Ab__up_0
#define LIBINT_T_S_OVERLAP_S _aB_s___0___Overlap_s___0___Ab__up_
#define LIBINT_T_S_KINETIC_S _aB_s___0___Kinetic_s___0___Ab__up_
#define LIBINT_T_S_ELECPOT_S(mValue) _aB_s___0___ElecPot_s___0___Ab__up_##mValue
_aB_s____0__s____1___r12_4_g12_s____0__s____1___Ab__up_0
#define LIBINT_T_S_OVERLAP_S _aB_s____0___Overlap_s____0___Ab__up_
#define LIBINT_T_S_KINETIC_S _aB_s____0___Kinetic_s____0___Ab__up_
#define LIBINT_T_S_ELECPOT_S(mValue) \
_aB_s____0___ElecPot_s____0___Ab__up_##mValue

#include <libint2/util/configuration.h>
#include <libint2/util/generated/libint2_params.h>
Expand Down
19 changes: 19 additions & 0 deletions include/libint2/config.h.cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,13 @@
#undef LIBINT_INCLUDE_ERI
#endif

/* Support ERI derivatives up to this order */
#define LIBINT_INCLUDE_RKB_ERI @LIBINT_INCLUDE_RKB_ERI@
#if @LIBINT_INCLUDE_RKB_ERI@ == -1
#undef LIBINT_INCLUDE_RKB_ERI
#endif


/* Support 3-center ERI derivatives up to this order */
#define LIBINT_INCLUDE_ERI3 @LIBINT_INCLUDE_ERI3@
#if @LIBINT_INCLUDE_ERI3@ == -1
Expand Down Expand Up @@ -122,6 +129,18 @@
/* Max optimized AM for ERI and its derivatives */
#cmakedefine LIBINT_ERI_OPT_AM_LIST "@LIBINT_ERI_OPT_AM_LIST@"

/* Max AM for RKB_ERI (same for all derivatives; if not defined see LIBINT_RKB_ERI_MAX_AM_LIST) */
#cmakedefine LIBINT_RKB_ERI_MAX_AM @LIBINT_RKB_ERI_MAX_AM@

/* Max AM for RKB_ERI and its derivatives */
#cmakedefine LIBINT_RKB_ERI_MAX_AM_LIST "@LIBINT_RKB_ERI_MAX_AM_LIST@"

/* Max optimized AM for ERI (same for all derivatives; if not defined see LIBINT_RKB_ERI_OPT_AM_LIST) */
#cmakedefine LIBINT_RKB_ERI_OPT_AM @LIBINT_RKB_ERI_OPT_AM@

/* Max optimized AM for ERI and its derivatives */
#cmakedefine LIBINT_RKB_ERI_OPT_AM_LIST "@LIBINT_RKB_ERI_OPT_AM_LIST@"

/* Max AM for 3-center ERI (same for all derivatives; if not defined see LIBINT_ERI3_MAX_AM_LIST) */
#cmakedefine LIBINT_ERI3_MAX_AM @LIBINT_ERI3_MAX_AM@

Expand Down
Loading
Loading