LIBINT 2.7.2
comp_11_r12kr12lg12_11.h
1/*
2 * Copyright (C) 2004-2021 Edward F. Valeev
3 *
4 * This file is part of Libint.
5 *
6 * Libint 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 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. If not, see <http://www.gnu.org/licenses/>.
18 *
19 */
20
21#ifndef _libint2_src_bin_libint_cr11r12kr12lg1211_h_
22#define _libint2_src_bin_libint_cr11r12kr12lg1211_h_
23
24#include <generic_rr.h>
25#include <integral_11_11.h>
26#include <gaussoper.h>
27
28namespace libint2 {
29
34 template <class BFSet>
36 public GenericRecurrenceRelation< CR_11_R12kR12lG12_11<BFSet>,
37 BFSet,
38 GenIntegralSet_11_11<BFSet,R12kR12lG12,EmptySet> >
39 {
40 public:
46 static const unsigned int max_nchildren = 3;
47
49
51 static bool directional() { return false; }
52
53 private:
54 using ParentType::RecurrenceRelation::expr_;
55 using ParentType::RecurrenceRelation::nflops_;
56 using ParentType::target_;
58 template<class RR, class C> friend class ChildFactory;
59
61 CR_11_R12kR12lG12_11(const SafePtr<TargetType>&, unsigned int dir);
62 static std::string descr() { return "CR"; }
63
64 };
65
66 template <class F>
67 CR_11_R12kR12lG12_11<F>::CR_11_R12kR12lG12_11(const SafePtr<TargetType>& Tint,
68 unsigned int dir) :
69 ParentType(Tint,dir)
70 {
71 using namespace libint2::algebra;
72 using namespace libint2::prefactor;
73 using namespace libint2::braket;
74
75 //std::cout << "CR_11_R12kR12lG12_11<F> -- applying to "
76 // << Tint->label() << std::endl;
77
78 F a(Tint->bra(0,0));
79 F b(Tint->ket(0,0));
80 F c(Tint->bra(1,0));
81 F d(Tint->ket(1,0));
82
83 const IntVec3& r12pbra = Tint->oper()->descr().K();
84 const IntVec3& r12pket = Tint->oper()->descr().L();
85 const int norm = r12pbra.norm1() + r12pket.norm1();
86
87 // Try reducing r12pbra
88 for(int xyz=0; xyz<3; ++xyz) {
89
90 const IntVec3& _1 = unit_intvec3(xyz);
91 const IntVec3 r12pbra_m1 = r12pbra - _1;
92
93 if (!ltzero(r12pbra_m1)) {
94 if (norm == 1) {
95 typedef GenIntegralSet_11_11<BasisFunctionType,R12kG12,mType> ChildType;
96 ChildFactory<ThisType,ChildType> factory(this);
97 factory.wedge( R12v(_pbra(a,c),xyz) , _pket(b,d), mType(0u), R12kG12(R12_k_G12_Descr(0)));
98 }
99 else {
100 typedef GenIntegralSet_11_11<BasisFunctionType,R12kR12lG12,EmptySet> ChildType;
101 ChildFactory<ThisType,ChildType> factory(this);
102 R12k_R12l_G12_Descr odescr(r12pbra_m1,r12pket);
103 factory.wedge( R12v(_pbra(a,c),xyz) , _pket(b,d), EmptySet(), R12kR12lG12(odescr));
104 }
105 return;
106 }
107 }
108
109 // Try reducing r12pket
110 for(int xyz=0; xyz<3; ++xyz) {
111
112 const IntVec3& _1 = unit_intvec3(xyz);
113 const IntVec3 r12pket_m1 = r12pket - _1;
114
115 if (!ltzero(r12pket_m1)) {
116 if (norm == 1) {
117 typedef GenIntegralSet_11_11<BasisFunctionType,R12kG12,mType> ChildType;
118 ChildFactory<ThisType,ChildType> factory(this);
119 factory.wedge( _pbra(a,c) , R12v(_pket(b,d),xyz), mType(0u), R12kG12(R12_k_G12_Descr(0)));
120 }
121 else {
122 typedef GenIntegralSet_11_11<BasisFunctionType,R12kR12lG12,EmptySet> ChildType;
123 ChildFactory<ThisType,ChildType> factory(this);
124 R12k_R12l_G12_Descr odescr(r12pbra,r12pket_m1);
125 factory.wedge( _pbra(a,c) , R12v(_pket(b,d),xyz), EmptySet(), R12kR12lG12(odescr));
126 }
127 return;
128 }
129 }
130
131 }
132
133};
134
135
136#endif
Set of basis functions.
Definition: bfset.h:42
Compute relation for integrals of operator R12k_R12l_G12.
Definition: comp_11_r12kr12lg12_11.h:39
static bool directional()
This relation is not directional.
Definition: comp_11_r12kr12lg12_11.h:51
Helps GenericRecurrenceRelation to work around the compiler problem with make_child.
Definition: generic_rr.h:147
Generic integral over a two-body operator with one bfs for each particle in bra and ket.
Definition: integral_11_11.h:33
RRImpl must inherit GenericRecurrenceRelation<RRImpl>
Definition: generic_rr.h:47
bool is_simple() const override
Implementation of RecurrenceRelation::is_simple()
Definition: generic_rr.h:79
static SafePtr< RRImpl > Instance(const SafePtr< TargetType > &Tint, unsigned int dir)
Return an instance if applicable, or a null pointer otherwise.
Definition: generic_rr.h:55
T norm1() const
1-norm
Definition: vectorn.h:48
these objects help to construct BraketPairs
Definition: src/bin/libint/braket.h:270
BraketPair< F, PKet > _pket(const F &f1, const F &f2)
Physicists ket.
Definition: src/bin/libint/braket.h:276
BraketPair< F, PBra > _pbra(const F &f1, const F &f2)
Physicists bra.
Definition: src/bin/libint/braket.h:272
Defaults definitions for various parameters assumed by Libint.
Definition: algebra.cc:24
DefaultQuantumNumbers< unsignedint, 1 >::Result mType
mType is the type that describes the auxiliary index of standard 2-body repulsion integrals
Definition: quanta.h:408
bool ltzero(const IntVec3 &a)
return true if has elements < 0
Definition: vectorn.h:91
LinearCombination< SafePtr< DGVertex >, BraketPair< F, BKType > > R12v(const BraketPair< F, BKType > &bkt, unsigned int xyz)
Applies R12v to a physicists' braket.
Definition: gaussoper.h:198
DefaultQuantumNumbers< int, 0 >::Result EmptySet
EmptySet is the type that describes null set of auxiliary indices.
Definition: quanta.h:404