21#ifndef _libint2_src_bin_libint_vrr11r12kg1211_h_
22#define _libint2_src_bin_libint_vrr11r12kg1211_h_
24#include <generic_rr.h>
25#include <r12kg12_11_11.h>
33template <
class BFSet,
int part, FunctionPosition where>
35 VRR_11_R12kG12_11<BFSet, part, where>, BFSet,
36 GenIntegralSet_11_11<BFSet, R12kG12, mType> > {
43 static const unsigned int max_nchildren = 8;
52 using ParentType::target_;
53 using ParentType::RecurrenceRelation::expr_;
54 using ParentType::RecurrenceRelation::nflops_;
60 static std::string descr() {
return "VRR"; }
65 std::string generate_label()
const override {
66 typedef typename TargetType::AuxIndexType
mType;
67 static std::shared_ptr<mType> aux0(
new mType(0u));
68 std::ostringstream os;
69 os << descr() <<
"P" << part <<
to_string(where)
70 << genintegralset_label(target_->bra(), target_->ket(), aux0,
75#if LIBINT_ENABLE_GENERIC_CODE
78 const std::shared_ptr<CompilationParameters>& cparams)
const override;
80 std::string generic_header()
const override;
82 std::string generic_instance(
83 const std::shared_ptr<CodeContext>& context,
84 const std::shared_ptr<CodeSymbols>& args)
const override;
88template <
class F,
int part, FunctionPosition where>
89VRR_11_R12kG12_11<F, part, where>::VRR_11_R12kG12_11(
90 const std::shared_ptr<TargetType>& Tint,
unsigned int dir)
91 : ParentType(Tint, dir) {
92 using namespace libint2::algebra;
93 using namespace libint2::prefactor;
94 const int K = Tint->oper()->descr().K();
96 const R12kG12 oK((R12kG12Descr(K)));
97 const unsigned int m = Tint->aux()->elem(0);
98 const F _1 = unit<F>(dir);
102 F a(Tint->bra(0, 0));
103 F b(Tint->ket(0, 0));
104 F c(Tint->bra(1, 0));
105 F d(Tint->ket(1, 0));
106 if (a.contracted() || b.contracted() || c.contracted() || d.contracted() ||
107 Tint->oper()->descr().contracted())
119 typedef TargetType ChildType;
126 if (part == 0 && where == InBra) {
127 F a(Tint->bra(0, 0) - _1);
129 F b(Tint->ket(0, 0));
130 F c(Tint->bra(1, 0));
131 F d(Tint->ket(1, 0));
133 auto ABCD_m = factory.make_child(a, b, c, d, m, oK);
134 auto ABCD_mp1 = factory.make_child(a, b, c, d, m + 1, oK);
136 expr_ = Vector(
"PA")[dir] * ABCD_m + Vector(
"WP")[dir] * ABCD_mp1;
140 const F& am1 = a - _1;
142 auto Am1BCD_m = factory.make_child(am1, b, c, d, m, oK);
143 auto Am1BCD_mp1 = factory.make_child(am1, b, c, d, m + 1, oK);
145 expr_ += Scalar(a[dir]) * Scalar(
"oo2z") *
146 (Am1BCD_m - Scalar(
"roz") * Am1BCD_mp1);
150 const F& bm1 = b - _1;
152 auto ABm1CD_m = factory.make_child(a, bm1, c, d, m, oK);
153 auto ABm1CD_mp1 = factory.make_child(a, bm1, c, d, m + 1, oK);
155 expr_ += Scalar(b[dir]) * Scalar(
"oo2z") *
156 (ABm1CD_m - Scalar(
"roz") * ABm1CD_mp1);
160 const F& cm1 = c - _1;
162 auto ABCm1D_mp1 = factory.make_child(a, b, cm1, d, m + 1, oK);
164 expr_ += Scalar(c[dir]) * Scalar(
"oo2ze") * ABCm1D_mp1;
168 const F& dm1 = d - _1;
170 auto ABCDm1_mp1 = factory.make_child(a, b, c, dm1, m + 1, oK);
172 expr_ += Scalar(d[dir]) * Scalar(
"oo2ze") * ABCDm1_mp1;
179 if (part == 0 && where == InKet) {
180 F a(Tint->bra(0, 0));
181 F b(Tint->ket(0, 0) - _1);
183 F c(Tint->bra(1, 0));
184 F d(Tint->ket(1, 0));
186 auto ABCD_m = factory.make_child(a, b, c, d, m, oK);
187 auto ABCD_mp1 = factory.make_child(a, b, c, d, m + 1, oK);
189 expr_ = Vector(
"PB")[dir] * ABCD_m + Vector(
"WP")[dir] * ABCD_mp1;
193 const F& am1 = a - _1;
195 auto Am1BCD_m = factory.make_child(am1, b, c, d, m, oK);
196 auto Am1BCD_mp1 = factory.make_child(am1, b, c, d, m + 1, oK);
198 expr_ += Scalar(a[dir]) * Scalar(
"oo2z") *
199 (Am1BCD_m - Scalar(
"roz") * Am1BCD_mp1);
203 const F& bm1 = b - _1;
205 auto ABm1CD_m = factory.make_child(a, bm1, c, d, m, oK);
206 auto ABm1CD_mp1 = factory.make_child(a, bm1, c, d, m + 1, oK);
208 expr_ += Scalar(b[dir]) * Scalar(
"oo2z") *
209 (ABm1CD_m - Scalar(
"roz") * ABm1CD_mp1);
213 const F& cm1 = c - _1;
215 auto ABCm1D_mp1 = factory.make_child(a, b, cm1, d, m + 1, oK);
217 expr_ += Scalar(c[dir]) * Scalar(
"oo2ze") * ABCm1D_mp1;
221 const F& dm1 = d - _1;
223 auto ABCDm1_mp1 = factory.make_child(a, b, c, dm1, m + 1, oK);
225 expr_ += Scalar(d[dir]) * Scalar(
"oo2ze") * ABCDm1_mp1;
232 if (part == 1 && where == InBra) {
233 F a(Tint->bra(0, 0));
234 F b(Tint->ket(0, 0));
235 F c(Tint->bra(1, 0) - _1);
237 F d(Tint->ket(1, 0));
239 auto ABCD_m = factory.make_child(a, b, c, d, m, oK);
240 auto ABCD_mp1 = factory.make_child(a, b, c, d, m + 1, oK);
242 expr_ = Vector(
"QC")[dir] * ABCD_m + Vector(
"WQ")[dir] * ABCD_mp1;
246 const F& cm1 = c - _1;
248 auto ABCm1D_m = factory.make_child(a, b, cm1, d, m, oK);
249 auto ABCm1D_mp1 = factory.make_child(a, b, cm1, d, m + 1, oK);
251 expr_ += Scalar(c[dir]) * Scalar(
"oo2e") *
252 (ABCm1D_m - Scalar(
"roe") * ABCm1D_mp1);
256 const F& dm1 = d - _1;
258 auto ABCDm1_m = factory.make_child(a, b, c, dm1, m, oK);
259 auto ABCDm1_mp1 = factory.make_child(a, b, c, dm1, m + 1, oK);
261 expr_ += Scalar(d[dir]) * Scalar(
"oo2e") *
262 (ABCDm1_m - Scalar(
"roe") * ABCDm1_mp1);
266 const F& am1 = a - _1;
268 auto Am1BCD_mp1 = factory.make_child(am1, b, c, d, m + 1, oK);
270 expr_ += Scalar(a[dir]) * Scalar(
"oo2ze") * Am1BCD_mp1;
274 const F& bm1 = b - _1;
276 auto ABm1CD_mp1 = factory.make_child(a, bm1, c, d, m + 1, oK);
278 expr_ += Scalar(b[dir]) * Scalar(
"oo2ze") * ABm1CD_mp1;
285 if (part == 1 && where == InKet) {
286 F a(Tint->bra(0, 0));
287 F b(Tint->ket(0, 0));
288 F c(Tint->bra(1, 0));
289 F d(Tint->ket(1, 0) - _1);
292 auto ABCD_m = factory.make_child(a, b, c, d, m, oK);
293 auto ABCD_mp1 = factory.make_child(a, b, c, d, m + 1, oK);
295 expr_ = Vector(
"QD")[dir] * ABCD_m + Vector(
"WQ")[dir] * ABCD_mp1;
299 const F& cm1 = c - _1;
301 auto ABCm1D_m = factory.make_child(a, b, cm1, d, m, oK);
302 auto ABCm1D_mp1 = factory.make_child(a, b, cm1, d, m + 1, oK);
304 expr_ += Scalar(c[dir]) * Scalar(
"oo2e") *
305 (ABCm1D_m - Scalar(
"roe") * ABCm1D_mp1);
309 const F& dm1 = d - _1;
311 auto ABCDm1_m = factory.make_child(a, b, c, dm1, m, oK);
312 auto ABCDm1_mp1 = factory.make_child(a, b, c, dm1, m + 1, oK);
314 expr_ += Scalar(d[dir]) * Scalar(
"oo2e") *
315 (ABCDm1_m - Scalar(
"roe") * ABCDm1_mp1);
319 const F& am1 = a - _1;
321 auto Am1BCD_mp1 = factory.make_child(am1, b, c, d, m + 1, oK);
323 expr_ += Scalar(a[dir]) * Scalar(
"oo2ze") * Am1BCD_mp1;
327 const F& bm1 = b - _1;
329 auto ABm1CD_mp1 = factory.make_child(a, bm1, c, d, m + 1, oK);
331 expr_ += Scalar(b[dir]) * Scalar(
"oo2ze") * ABm1CD_mp1;
342 throw std::logic_error(
343 "VRR_11_R12kG12_11<I,F,K,part,where>::children_and_expr_Kge0() -- "
344 "nonzero auxiliary quantum detected.");
350 F b(Tint->ket(0, 0) - _1);
351 F d(Tint->ket(1, 0) - _1);
355 F a(Tint->bra(0, 0) - _1);
356 F c(Tint->bra(1, 0) - _1);
360 if (!xsxs && !sxsx)
return;
362 if (xsxs && sxsx)
return;
366 if (part == 0 && where == InBra) {
367 F a(Tint->bra(0, 0) - _1);
369 F b(Tint->ket(0, 0));
370 F c(Tint->bra(1, 0));
371 F d(Tint->ket(1, 0));
373 auto ABCD_K = factory.make_child(a, b, c, d, 0u, oK);
375 expr_ = Vector(
"R12kG12_pfac0_0")[dir] * ABCD_K;
378 const F& am1 = a - _1;
380 auto Am1BCD_K = factory.make_child(am1, b, c, d, 0u, oK);
382 expr_ += Scalar(a[dir]) * Scalar(
"R12kG12_pfac1_0") * Am1BCD_K;
386 const F& cm1 = c - _1;
388 auto ABCm1D_K = factory.make_child(a, b, cm1, d, 0u, oK);
390 expr_ += Scalar(c[dir]) * Scalar(
"R12kG12_pfac2") * ABCm1D_K;
395 const R12kG12 oKm2((R12kG12Descr(K - 2)));
396 auto Ap1BCD_Km2 = factory.make_child(a + _1, b, c, d, 0u, oKm2);
397 auto ABCp1D_Km2 = factory.make_child(a, b, c + _1, d, 0u, oKm2);
398 auto ABCD_Km2 = factory.make_child(a, b, c, d, 0u, oKm2);
400 expr_ += Scalar((
double)K) * Scalar(
"R12kG12_pfac3_0") *
401 (Ap1BCD_Km2 - ABCp1D_Km2 +
402 Vector(
"R12kG12_pfac4_0")[dir] * ABCD_Km2);
409 if (part == 1 && where == InBra) {
410 F a(Tint->bra(0, 0));
411 F b(Tint->ket(0, 0));
412 F c(Tint->bra(1, 0) - _1);
414 F d(Tint->ket(1, 0));
416 auto ABCD_K = factory.make_child(a, b, c, d, 0u, oK);
418 expr_ = Vector(
"R12kG12_pfac0_1")[dir] * ABCD_K;
421 const F& cm1 = c - _1;
423 auto ABCm1D_K = factory.make_child(a, b, cm1, d, 0u, oK);
425 expr_ += Scalar(c[dir]) * Scalar(
"R12kG12_pfac1_1") * ABCm1D_K;
429 const F& am1 = a - _1;
431 auto Am1BCD_K = factory.make_child(am1, b, c, d, 0u, oK);
433 expr_ += Scalar(a[dir]) * Scalar(
"R12kG12_pfac2") * Am1BCD_K;
438 const R12kG12 oKm2((R12kG12Descr(K - 2)));
439 auto ABCp1D_Km2 = factory.make_child(a, b, c + _1, d, 0u, oKm2);
440 auto Ap1BCD_Km2 = factory.make_child(a + _1, b, c, d, 0u, oKm2);
441 auto ABCD_Km2 = factory.make_child(a, b, c, d, 0u, oKm2);
443 expr_ += Scalar((
double)K) * Scalar(
"R12kG12_pfac3_1") *
444 (ABCp1D_Km2 - Ap1BCD_Km2 +
445 Vector(
"R12kG12_pfac4_1")[dir] * ABCD_Km2);
455 if (part == 0 && where == InKet) {
456 F a(Tint->bra(0, 0));
457 F b(Tint->ket(0, 0) - _1);
459 F c(Tint->bra(1, 0));
460 F d(Tint->ket(1, 0));
462 auto ABCD_K = factory.make_child(a, b, c, d, 0u, oK);
464 expr_ = Vector(
"R12kG12_pfac0_0")[dir] * ABCD_K;
467 const F& bm1 = b - _1;
469 auto ABm1CD_K = factory.make_child(a, bm1, c, d, 0u, oK);
471 expr_ += Scalar(b[dir]) * Scalar(
"R12kG12_pfac1_0") * ABm1CD_K;
475 const F& dm1 = d - _1;
477 auto ABCDm1_K = factory.make_child(a, b, c, dm1, 0u, oK);
479 expr_ += Scalar(d[dir]) * Scalar(
"R12kG12_pfac2") * ABCDm1_K;
484 const R12kG12 oKm2((R12kG12Descr(K - 2)));
485 auto ABp1CD_Km2 = factory.make_child(a, b + _1, c, d, 0u, oKm2);
486 auto ABCDp1_Km2 = factory.make_child(a, b, c, d + _1, 0u, oKm2);
487 auto ABCD_Km2 = factory.make_child(a, b, c, d, 0u, oKm2);
489 expr_ += Scalar((
double)K) * Scalar(
"R12kG12_pfac3_0") *
490 (ABp1CD_Km2 - ABCDp1_Km2 +
491 Vector(
"R12kG12_pfac4_0")[dir] * ABCD_Km2);
498 if (part == 1 && where == InKet) {
499 F a(Tint->bra(0, 0));
500 F b(Tint->ket(0, 0));
501 F c(Tint->bra(1, 0));
502 F d(Tint->ket(1, 0) - _1);
505 auto ABCD_K = factory.make_child(a, b, c, d, 0u, oK);
507 expr_ = Vector(
"R12kG12_pfac0_1")[dir] * ABCD_K;
510 const F& dm1 = d - _1;
512 auto ABCDm1_K = factory.make_child(a, b, c, dm1, 0u, oK);
514 expr_ += Scalar(d[dir]) * Scalar(
"R12kG12_pfac1_1") * ABCDm1_K;
518 const F& bm1 = b - _1;
520 auto ABm1CD_K = factory.make_child(a, bm1, c, d, 0u, oK);
522 expr_ += Scalar(b[dir]) * Scalar(
"R12kG12_pfac2") * ABm1CD_K;
527 const R12kG12 oKm2((R12kG12Descr(K - 2)));
528 auto ABCDp1_Km2 = factory.make_child(a, b, c, d + _1, 0u, oKm2);
529 auto ABp1CD_Km2 = factory.make_child(a, b + _1, c, d, 0u, oKm2);
530 auto ABCD_Km2 = factory.make_child(a, b, c, d, 0u, oKm2);
532 expr_ += Scalar((
double)K) * Scalar(
"R12kG12_pfac3_1") *
533 (ABCDp1_Km2 - ABp1CD_Km2 +
534 Vector(
"R12kG12_pfac4_1")[dir] * ABCD_Km2);
546#if LIBINT_ENABLE_GENERIC_CODE
547template <
class F,
int part, FunctionPosition where>
549 const std::shared_ptr<CompilationParameters>& cparams)
const {
550 F sh_a(target_->bra(0, 0));
551 F sh_b(target_->ket(0, 0));
552 F sh_c(target_->bra(1, 0));
553 F sh_d(target_->ket(1, 0));
554 const unsigned int max_opt_am = cparams->max_am_opt();
559 (sh_a.norm() > std::max(2 * max_opt_am, 1u) ||
560 sh_c.norm() > std::max(2 * max_opt_am, 1u)) &&
561 (sh_a.norm() > 1u && sh_c.norm() > 1u))
564 (sh_b.norm() > std::max(2 * max_opt_am, 1u) ||
565 sh_d.norm() > std::max(2 * max_opt_am, 1u)) &&
566 (sh_b.norm() > 1u && sh_d.norm() > 1u))
571template <
class F,
int part, FunctionPosition where>
573 F sh_a(target_->bra(0, 0));
574 F sh_b(target_->ket(0, 0));
575 F sh_c(target_->bra(1, 0));
576 F sh_d(target_->ket(1, 0));
577 const bool xsxs = sh_b.zero() && sh_d.zero();
578 const bool sxsx = sh_a.zero() && sh_c.zero();
579 const int K = target_->oper()->descr().K();
581 if (xsxs)
return std::string(
"OSVRR_xs_xs.h");
582 if (sxsx)
return std::string(
"OSVRR_sx_sx.h");
584 return std::string(
"VRR_r12kg12_xs_xs.h");
589template <
class F,
int part, FunctionPosition where>
591 const std::shared_ptr<CodeContext>& context,
592 const std::shared_ptr<CodeSymbols>& args)
const {
593 const int K = target_->oper()->descr().K();
594 std::ostringstream oss;
595 F sh_a(target_->bra(0, 0));
596 F sh_b(target_->ket(0, 0));
597 F sh_c(target_->bra(1, 0));
598 F sh_d(target_->ket(1, 0));
599 const bool xsxs = sh_b.zero() && sh_d.zero();
600 const bool sxsx = sh_a.zero() && sh_c.zero();
602 bool ahlrichs_simplification =
false;
605 unit_s = sh_b.is_unit();
607 unit_s = sh_a.is_unit();
610 oss <<
"using namespace libint2;" << std::endl;
613 oss <<
"libint2::OSVRR_xs_xs<" << part <<
"," << sh_a.norm() <<
","
614 << sh_c.norm() <<
",";
615 if (not ahlrichs_simplification) oss << (unit_s ?
"true," :
"false,");
616 oss << ((context->cparams()->max_vector_length() == 1) ?
"false"
620 oss <<
"libint2::OSVRR_sx_sx<" << part <<
"," << sh_b.norm() <<
","
621 << sh_d.norm() <<
",";
622 if (not ahlrichs_simplification) oss << (unit_s ?
"true," :
"false,");
623 oss << ((context->cparams()->max_vector_length() == 1) ?
"false"
628 oss <<
"libint2::VRR_r12kg12_xs_xs<" << part <<
"," << sh_a.norm() <<
","
629 << sh_c.norm() <<
",";
631 << ((context->cparams()->max_vector_length() == 1) ?
"false"
637 oss <<
"libint2::VRR_r12kg12_xs_xs<" << part <<
"," << sh_b.norm() <<
","
638 << sh_d.norm() <<
",";
640 << ((context->cparams()->max_vector_length() == 1) ?
"false"
644 oss <<
">::compute(inteval";
648 oss <<
"," << args->symbol(0);
649 if (not ahlrichs_simplification &&
653 const unsigned int nargs = args->n();
654 for (
unsigned int a = 1; a < nargs; a++) {
655 oss <<
"," << args->symbol(a);
658 const unsigned int nargs = args->n();
659 for (
unsigned int a = 0; a < nargs; a++) {
660 oss <<
"," << args->symbol(a);
666 for (
unsigned int a = 0; a < 3; ++a) {
667 oss <<
",(LIBINT2_REALTYPE*)0";
Set of basis functions.
Definition bfset.h:43
Helps GenericRecurrenceRelation to work around the compiler problem with make_child.
Definition generic_rr.h:150
Generic integral over a two-body operator with one bfs for each particle in bra and ket.
Definition integral_11_11.h:36
GenOper is a single operator described by descriptor Descr.
Definition oper.h:164
RRImpl must inherit GenericRecurrenceRelation<RRImpl>
Definition generic_rr.h:47
bool is_simple() const override
Implementation of RecurrenceRelation::is_simple()
Definition generic_rr.h:81
static bool default_directional()
is this recurrence relation parameterized by a direction (x, y, or z).
Definition generic_rr.h:101
static std::shared_ptr< RRImpl > Instance(const std::shared_ptr< TargetType > &Tint, unsigned int dir)
Return an instance if applicable, or a null pointer otherwise.
Definition generic_rr.h:55
Represents cartesian derivatives of atom-centered basis functions.
Definition bfset.h:101
bool zero() const
norm() == 0
Definition bfset.h:158
R12_k_G12 is a two-body operator of form r_{12}^k * exp(-\gamma * r_{12}), where k is an integer and ...
Definition oper.h:418
VRR Recurrence Relation for 2-e integrals of the R12_k_G12 operators.
Definition vrr_11_r12kg12_11.h:36
static bool directional()
Default directionality.
Definition vrr_11_r12kg12_11.h:48
Defaults definitions for various parameters assumed by Libint.
Definition algebra.cc:24
bool exists(const IncableBFSet &A)
Return true if A is valid.
Definition bfset.h:96
DefaultQuantumNumbers< unsignedint, 1 >::Result mType
mType is the type that describes the auxiliary index of standard 2-body repulsion integrals
Definition quanta.h:395
std::string to_string(const T &x)
Converts x to its string representation.
Definition entity.h:121
TrivialBFSet<T> defines static member result, which is true if T is a basis function set consisting o...
Definition bfset.h:906