LIBINT 2.7.2
integral_11_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_integral1111_h_
22#define _libint2_src_bin_libint_integral1111_h_
23
24#include <integral.h>
25
26namespace libint2 {
27
31 template <class BFS, class Oper, class AuxQuanta = EmptySet> class GenIntegralSet_11_11 :
32 public GenIntegralSet< Oper, IncableBFSet, typename DefaultTwoPBraket<BFS>::Result, typename DefaultTwoPBraket<BFS>::Result, AuxQuanta >
33 {
34 public:
35 typedef BFS BasisFunctionType;
36 typedef Oper OperType;
39 typedef AuxQuanta AuxIndexType;
42
45 typedef typename parent_type::key_type key_type;
50
56 static const SafePtr<this_type> Instance(const BFS& bra0, const BFS& ket0, const BFS& bra1, const BFS& ket1, const AuxIndexType& aux = AuxIndexType(), const OperType& oper = OperType());
59 static const SafePtr<this_type>
61 const AuxIndexType& aux = AuxIndexType(), const OperType& oper = OperType()) {
62 return Instance(braket_wedge.left[0],
63 braket_wedge.right[0],
64 braket_wedge.left[1],
65 braket_wedge.right[1],
66 aux,
67 oper);
68 }
71 static const SafePtr<this_type>
73 const AuxIndexType& aux = AuxIndexType(), const OperType& oper = OperType()) {
74 return Instance(braket_wedge.left[0],
75 braket_wedge.left[1],
76 braket_wedge.right[0],
77 braket_wedge.right[1],
78 aux,
79 oper);
80 }
85 static const SafePtr<this_type> Instance(const BraType& bra, const KetType& ket, const AuxIndexType& aux = AuxIndexType(), const OperType& oper = OperType());
87
89 bool operator==(const this_type&) const;
90
92 void unregister() const;
93
95 bool auto_unroll() const;
96
97 private:
99 GenIntegralSet_11_11(const OperType& oper, const BraType& bra, const KetType& ket, const AuxIndexType& aux);
100
101 // This is used to manage GenIntegralSet objects as singletons
102 static SingletonManagerType singl_manager_;
103
105 bool this_precomputed() const;
106
107 };
108
109#if USE_INT_KEY_TO_HASH
110 template <class BFS, class Oper, class AuxQuanta>
112 GenIntegralSet_11_11<BFS,Oper,AuxQuanta>::singl_manager_(&this_type::key);
113#else
114# error "USE_INT_KEY_TO_HASH must be set"
115#endif
116
117 template <class BFS, class Oper, class AuxQuanta>
118 GenIntegralSet_11_11<BFS,Oper,AuxQuanta>::GenIntegralSet_11_11(const OperType& oper, const BraType& bra, const KetType& ket, const AuxIndexType& aux) :
119 parent_type(oper, bra, ket, aux)
120 {
121 if (bra.num_members(0) != 1)
122 throw std::runtime_error("GenIntegralSet_11_11::GenIntegralSet_11_11(bra,ket) -- number of BFSs in bra for particle 0 must be 1");
123 if (bra.num_members(1) != 1)
124 throw std::runtime_error("GenIntegralSet_11_11::GenIntegralSet_11_11(bra,ket) -- number of BFSs in bra for particle 1 must be 1");
125 if (ket.num_members(0) != 1)
126 throw std::runtime_error("GenIntegralSet_11_11::GenIntegralSet_11_11(bra,ket) -- number of BFSs in ket for particle 0 must be 1");
127 if (ket.num_members(1) != 1)
128 throw std::runtime_error("GenIntegralSet_11_11::GenIntegralSet_11_11(bra,ket) -- number of BFSs in ket for particle 1 must be 1");
129#if DEBUG
130 std::cout << "GenIntegralSet_11_11: constructed " << this->label() << std::endl;
131#endif
132 }
133
134 template <class BFS, class Oper, class AuxQuanta>
135 GenIntegralSet_11_11<BFS,Oper,AuxQuanta>::~GenIntegralSet_11_11()
136 {
137#if DEBUG
138 std::cout << "GenIntegralSet_11_11: destructed " << this->label() << std::endl;
139#endif
140 }
141
142 template <class BFS, class Oper, class AuxQuanta>
143 const SafePtr< GenIntegralSet_11_11<BFS,Oper,AuxQuanta> >
145 const AuxIndexType& aux, const OperType& oper)
146 {
147 typedef typename SingletonManagerType::value_type map_value_type;
148 key_type key = parent_type::compute_key(oper,bra,ket,aux);
149 const map_value_type& val = singl_manager_.find(key);
150 if (!val.second) {
151 SafePtr<this_type> this_int(new this_type(oper,bra,ket,aux));
152 // Use singl_manager_ to make sure this is a new object of this type
153 const typename SingletonManagerType::value_type& val = singl_manager_.find(this_int);
154 val.second->instid_ = val.first;
155 return val.second;
156 }
157 return val.second;
158 }
159
160 template <class BFS, class Oper, class AuxQuanta>
161 const SafePtr< GenIntegralSet_11_11<BFS,Oper,AuxQuanta> >
162 GenIntegralSet_11_11<BFS,Oper,AuxQuanta>::Instance(const BFS& bra0, const BFS& ket0, const BFS& bra1, const BFS& ket1,
163 const AuxIndexType& aux, const OperType& oper)
164 {
165#if USE_BRAKET_H
166 typedef BFS BFSRef;
167 BFSRef bra0_ref(bra0);
168 BFSRef bra1_ref(bra1);
169 BFSRef ket0_ref(ket0);
170 BFSRef ket1_ref(ket1);
171#else
172 typedef SafePtr<BFS> BFSRef;
173 BFSRef bra0_ref(new BFS(bra0));
174 BFSRef bra1_ref(new BFS(bra1));
175 BFSRef ket0_ref(new BFS(ket0));
176 BFSRef ket1_ref(new BFS(ket1));
177#endif
178 std::vector<BFSRef> vbra0; vbra0.push_back(bra0_ref);
179 std::vector<BFSRef> vbra1; vbra1.push_back(bra1_ref);
180 std::vector<BFSRef> vket0; vket0.push_back(ket0_ref);
181 std::vector<BFSRef> vket1; vket1.push_back(ket1_ref);
182 std::vector< std::vector<BFSRef> > vvbra; vvbra.push_back(vbra0); vvbra.push_back(vbra1);
183 std::vector< std::vector<BFSRef> > vvket; vvket.push_back(vket0); vvket.push_back(vket1);
184 BraType bra(vvbra);
185 KetType ket(vvket);
186 return Instance(bra,ket,aux,oper);
187 }
188
189 template <class BFS, class Oper, class AuxQuanta>
190 bool
192 {
193 return parent_type::PtrComp::equiv(static_cast<const parent_type*>(this),a);
194 }
195
196 template <class BFS, class Oper, class AuxQuanta>
197 void
199 {
200 SafePtr<parent_type> this_parent_ptr = const_pointer_cast<parent_type,const parent_type>(EnableSafePtrFromThis<parent_type>::SafePtr_from_this());
201 SafePtr<this_type> this_ptr = static_pointer_cast<this_type>(this_parent_ptr);
202 singl_manager_.remove(this_ptr);
203 }
204
205 // this_precomputed() and auto_unroll() will be specialized, the nonspecialized version is in integral_11_11.impl.h
206};
207
208#endif
209
ArrayBraket is a lightweight implementation of Braket concept.
Definition: src/bin/libint/braket.h:38
unsigned int num_members(unsigned int p) const
Returns the number of BFS for particle p.
Definition: src/bin/libint/braket.h:75
BraketPair is a trimmed down version of ArrayBraket specialized for same-particle or different-partic...
Definition: src/bin/libint/braket.h:244
Generic integral over a two-body operator with one bfs for each particle in bra and ket.
Definition: integral_11_11.h:33
void unregister() const
Reimplements DGVertex::unregister()
Definition: integral_11_11.h:198
SingletonStack< this_type, key_type > SingletonManagerType
This the type of the object that manages objects of this type as Singletons.
Definition: integral_11_11.h:47
GenIntegralSet_11_11< typename BFS::iter_type, typename Oper::iter_type, typename AuxQuanta::iter_type > iter_type
this is a set of these subobjects
Definition: integral_11_11.h:44
static const SafePtr< this_type > Instance(const algebra::Wedge< BraketPair< BFS, PBra >, BraketPair< BFS, PKet > > &braket_wedge, const AuxIndexType &aux=AuxIndexType(), const OperType &oper=OperType())
This "constructor" uses a wedge of 2 physicists brakets.
Definition: integral_11_11.h:60
static const SafePtr< this_type > Instance(const BFS &bra0, const BFS &ket0, const BFS &bra1, const BFS &ket1, const AuxIndexType &aux=AuxIndexType(), const OperType &oper=OperType())
This "constructor" takes basis function sets, in Mulliken ordering.
Definition: integral_11_11.h:162
PtrEquiv< this_type > PtrComp
This class provides comparison operations on pointers.
Definition: integral_11_11.h:49
bool operator==(const this_type &) const
Comparison operator.
Definition: integral_11_11.h:191
static const SafePtr< this_type > Instance(const algebra::Wedge< BraketPair< BFS, CBra >, BraketPair< BFS, CKet > > &braket_wedge, const AuxIndexType &aux=AuxIndexType(), const OperType &oper=OperType())
This "constructor" uses a wedge of 2 chemists brakets.
Definition: integral_11_11.h:72
bool auto_unroll() const
Implements GenIntegralSet::auto_unroll()
Definition: integral_11_11.impl.h:35
GenIntegralSet is a set of integrals over functions derived from BFS.
Definition: integral.h:92
const std::string & label() const override
Specialization of DGVertex::label()
Definition: integral.h:456
const SafePtr< EmptySet > aux() const
Obtain the auxiliary quanta.
Definition: integral.h:365
Oper is OperSet characterized by properties Props.
Definition: oper.h:90
PtrEquiv<T> provides a set of comparison functions named 'equiv' which take as arguments a mix of ref...
Definition: equiv.h:36
SingletonStack<T,KeyType> helps to implement Singleton-like objects of type T.
Definition: singl_stack.h:44
Defaults definitions for various parameters assumed by Libint.
Definition: algebra.cc:24
Wedge is a typeholder for the result of a wedge product.
Definition: algebra.h:245