LIBINT 2.9.0
comp_11_tig12_11.h
1/*
2 * Copyright (C) 2004-2024 Edward F. Valeev
3 *
4 * This file is part of Libint compiler.
5 *
6 * Libint compiler is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * Libint compiler is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with Libint compiler. If not, see <http://www.gnu.org/licenses/>.
18 *
19 */
20
21#ifndef _libint2_src_bin_libint_cr11tig1211_h_
22#define _libint2_src_bin_libint_cr11tig1211_h_
23
24#include <gaussoper.h>
25#include <generic_rr.h>
26#include <tig12_11_11.h>
27
28namespace libint2 {
29
32template <class BFSet>
34 CR_11_TiG12_11<BFSet>, BFSet,
35 GenIntegralSet_11_11<BFSet, TiG12, mType> > {
36 public:
42 static const unsigned int max_nchildren = 8;
43
45
47 static bool directional() { return false; }
48
49 private:
51 using ParentType::target_;
52 using ParentType::RecurrenceRelation::expr_;
53 using ParentType::RecurrenceRelation::nflops_;
54 template <class RR, class C>
55 friend class ChildFactory;
56
59 CR_11_TiG12_11(const std::shared_ptr<TargetType>&, unsigned int dir);
60 static std::string descr() { return "CR"; }
61};
62
63template <class F>
64CR_11_TiG12_11<F>::CR_11_TiG12_11(const std::shared_ptr<TargetType>& Tint,
65 unsigned int dir)
66 : ParentType(Tint, dir) {
67 if (dir != 0) return;
68 using namespace libint2::algebra;
69 using namespace libint2::prefactor;
70 using namespace libint2::braket;
71 // kinetic energy of which electron?
72 const int i = target_->oper()->descr().K();
73 const R12kG12 G0(R12_k_G12_Descr(0));
74 const R12kG12 G2(R12_k_G12_Descr(2));
75
76 F a(Tint->bra(0, 0));
77 F b(Tint->ket(0, 0));
78 F c(Tint->bra(1, 0));
79 F d(Tint->ket(1, 0));
80
81 if (i == 0) {
82 if (b.contracted() || target_->oper()->descr().contracted()) return;
83 }
84 if (i == 1) {
85 if (d.contracted() || target_->oper()->descr().contracted()) return;
86 }
87
88 // [T1,G12]
89 if (i == 0) {
91 ChildType;
93 for (int xyz = 0; xyz < 3; ++xyz) {
94 R12k_R12l_G12_Descr descr(IntVec3(), unit_intvec3(xyz));
95 factory.wedge(_pbra(a, c), Nabla1(_pket(b, d), xyz), EmptySet(),
96 R12kR12lG12(descr));
97 }
98 if (is_simple()) expr_ *= Scalar(2.0) * Scalar("gamma");
99 }
100 // [T2,G12]
101 if (i == 1) {
103 ChildType;
105 for (int xyz = 0; xyz < 3; ++xyz) {
106 R12k_R12l_G12_Descr descr(IntVec3(), unit_intvec3(xyz));
107 factory.wedge(_pbra(a, c), Nabla2(_pket(b, d), xyz), EmptySet(),
108 R12kR12lG12(descr));
109 }
110 if (is_simple()) expr_ *= Scalar(-2.0) * Scalar("gamma");
111 }
112
113 {
116 auto ab_G0_cd = factory.make_child(a, b, c, d, 0u, G0);
117 if (is_simple()) expr_ += Scalar(3.0) * Scalar("gamma") * ab_G0_cd;
118
119 auto ab_G2_cd = factory.make_child(a, b, c, d, 0u, G2);
120 if (is_simple())
121 expr_ += Scalar(-2.0) * Scalar("gamma") * Scalar("gamma") * ab_G2_cd;
122 }
123}
124
125}; // namespace libint2
126
127#endif
Set of basis functions.
Definition bfset.h:43
Compute relation for 2-e integrals of the Ti_G12 operators.
Definition comp_11_tig12_11.h:35
static bool directional()
This relation is not directional.
Definition comp_11_tig12_11.h:47
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 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
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
R12k_R12l_G12 is a two-body operator of form ( r_{12x}^kx * r_{12y}^ky * r_{12z}^kz ) * (r_{12x}^lx *...
Definition oper.h:445
these objects help to construct BraketPairs
Definition src/bin/libint/braket.h:275
BraketPair< F, PKet > _pket(const F &f1, const F &f2)
Physicists ket.
Definition src/bin/libint/braket.h:283
BraketPair< F, PBra > _pbra(const F &f1, const F &f2)
Physicists bra.
Definition src/bin/libint/braket.h:278
Defaults definitions for various parameters assumed by Libint.
Definition algebra.cc:24
LinearCombination< std::shared_ptr< DGVertex >, BraketPair< F, BKType > > Nabla1(const BraketPair< F, BKType > &bkt, int xyz)
Applies Nabla1 to a physicists' braket.
Definition gaussoper.h:127
LinearCombination< std::shared_ptr< DGVertex >, BraketPair< F, BKType > > Nabla2(const BraketPair< F, BKType > &bkt, int xyz)
Applies Nabla2 to a physicists' braket.
Definition gaussoper.h:158
DefaultQuantumNumbers< int, 0 >::Result EmptySet
EmptySet is the type that describes null set of auxiliary indices.
Definition quanta.h:390