20 #ifndef _libint2_src_bin_libint_quanta_h_ 21 #define _libint2_src_bin_libint_quanta_h_ 24 #include <smart_ptr.h> 25 #include <global_macros.h> 38 public Hashable<LIBINT2_UINT_LEAST64,ComputeKey> {
40 typedef DummyIterator iter_type;
42 static const LIBINT2_UINT_LEAST64 max_quantum_number = 100;
45 virtual const std::string label()
const =0;
48 virtual unsigned int num_quanta()
const =0;
50 virtual void inc(
unsigned int i) =0;
52 virtual void dec(
unsigned int i) =0;
74 const std::string label()
const;
77 void inc(
unsigned int i) { ++qn_.at(i); }
79 void dec(
unsigned int i) {
81 if (qn_.at(i) == T(0))
82 throw std::runtime_error(
"QuantumNumbers::dec -- quantum number already zero");
88 const T
elem(
unsigned int i)
const {
98 LIBINT2_UINT_LEAST64
key()
const {
99 LIBINT2_UINT_LEAST64 key = 0;
100 LIBINT2_UINT_LEAST64 pfac = 1;
101 const int maxi = ((int)num_quanta()) - 1;
102 for(
int i=maxi; i>=0; i--) {
104 pfac *= QuantumSet::max_quantum_number;
106 assert(key < this->max_key());
112 LIBINT2_UINT_LEAST64 max_key = 1;
113 const int maxi = ((int)num_quanta()) - 1;
114 for(
int i=maxi; i>=0; i--) {
115 max_key *= QuantumSet::max_quantum_number;
122 template<
typename T,
unsigned int N>
128 template<
typename T,
unsigned int N>
129 QuantumNumbers<T,N>::QuantumNumbers(
const SafePtr<QuantumNumbers>& sptr) :
134 template<
typename T,
unsigned int N>
135 QuantumNumbers<T,N>::QuantumNumbers(
const SafePtr<QuantumSet>& sptr)
140 throw std::runtime_error(
"QuantumNumbers<T,N>::QuantumNumbers(const SafePtr<QuantumSet>& sptr) -- type of sptr is incompatible with QuantumNumbers");
143 qn_ = sptr_cast->qn_;
146 template<
typename T,
unsigned int N>
147 QuantumNumbers<T,N>::QuantumNumbers(
const SafePtr<ConstructablePolymorphically>& sptr)
152 throw std::runtime_error(
"QuantumNumbers<T,N>::QuantumNumbers(const SafePtr<ConstructablePolymorphically>& sptr) -- type of sptr is incompatible with QuantumNumbers");
155 qn_ = sptr_cast->qn_;
158 template<
typename T,
unsigned int N>
165 template<
typename T,
unsigned int N>
170 template<
typename T,
unsigned int N>
177 template<
typename T,
unsigned int N>
181 std::ostringstream oss;
185 for(
int i=1; i<qn_.size(); i++)
186 oss <<
"," << qn_[i];
217 const std::string label()
const;
220 void inc(
unsigned int i) { ++qn_[i]; }
222 void dec(
unsigned int i) {
225 throw std::runtime_error(
"QuantumNumbersA::dec -- quantum number already zero");
231 const T
elem(
unsigned int i)
const {
246 LIBINT2_UINT_LEAST64
key()
const {
247 LIBINT2_UINT_LEAST64 key = 0;
248 LIBINT2_UINT_LEAST64 pfac = 1;
249 const int maxi = ((int)num_quanta()) - 1;
250 for(
int i=maxi; i>=0; i--) {
252 pfac *= QuantumSet::max_quantum_number;
254 assert(key < this->max_key());
260 LIBINT2_UINT_LEAST64 max_key = 1;
261 const int maxi = ((int)num_quanta()) - 1;
262 for(
int i=maxi; i>=0; i--) {
263 max_key *= QuantumSet::max_quantum_number;
270 template<
typename T,
unsigned int N>
273 for(
unsigned int i=0; i<N; i++)
277 template<
typename T,
unsigned int N>
280 for(
int i=0; i<N; i++)
284 template<
typename T,
unsigned int N>
287 for(
int i=0; i<N; i++)
291 template<
typename T,
unsigned int N>
295 for(
unsigned int i=0; i<N; i++)
299 template<
typename T,
unsigned int N>
305 throw std::runtime_error(
"QuantumNumbersA<T,N>::QuantumNumbersA(const SafePtr<QuantumSet>& sptr) -- type of sptr is incompatible with QuantumNumbersA");
308 T* qn = sptr_cast->qn_;
309 for(
int i=0; i<N; i++)
313 template<
typename T,
unsigned int N>
319 throw std::runtime_error(
"QuantumNumbersA<T,N>::QuantumNumbersA(const SafePtr<ConstructablePolymorphically>& sptr) -- type of sptr is incompatible with QuantumNumbersA");
321 T* qn = sptr_cast->qn_;
322 for(
int i=0; i<N; i++)
326 template<
typename T,
unsigned int N>
331 template<
typename T,
unsigned int N>
336 const T* qn1 = a.qn_;
337 for(
int i=0; i<N; i++, ++qn0, ++qn1)
344 template<
typename T,
unsigned int N>
348 std::ostringstream oss;
352 for(
unsigned int i=1; i<N; i++)
353 oss <<
"," << qn_[i];
375 const std::string label()
const {
return "{}"; }
378 void inc(
unsigned int i) {
throw std::runtime_error(
"QuantumNumbersA<T,0>::inc -- no quantum numbers to increment"); }
380 void dec(
unsigned int i) {
381 throw std::runtime_error(
"QuantumNumbersA<T,0>::inc -- no quantum numbers to decrement");
384 const T
elem(
unsigned int i)
const {
throw std::runtime_error(
"QuantumNumbersA<T,0>::inc -- no quantum numbers to return"); }
389 LIBINT2_UINT_LEAST64
key()
const {
return 0; }
392 LIBINT2_UINT_LEAST64
max_key()
const {
return 1; }
397 template <
typename T,
unsigned int N>
unsigned int num_quanta() const
Implementation of QuantumSet::num_quanta()
Definition: quanta.h:386
LIBINT2_UINT_LEAST64 max_key() const
key is in range [0,max_key())
Definition: quanta.h:259
LIBINT2_UINT_LEAST64 key() const
Implements Hashable::key()
Definition: quanta.h:389
QuantumNumbersA iter_type
QuantumSet is a set of one QuantumSet.
Definition: quanta.h:364
ConstructablePolymorphically is a base for all objects which can be constructed using a SafePtr to a ...
Definition: polyconstr.h:30
QuantumSet is the base class for all (sets of) quantum numbers.
Definition: quanta.h:37
void dec(unsigned int i)
Decrement quantum number i.
Definition: quanta.h:79
Defaults definitions for various parameters assumed by Libint.
Definition: algebra.cc:23
Objects of Hashable<T> class provide hashing function key() which computes keys of type KeyType...
Definition: hashable.h:72
Definition: stdarray.h:18
QuantumNumbers<T,N> is a set of N quantum numbers of type T implemented in terms of std::vector...
Definition: quanta.h:57
void dec(unsigned int i)
Decrement quantum number i.
Definition: quanta.h:380
LIBINT2_UINT_LEAST64 key() const
Implements Hashable::key()
Definition: quanta.h:98
void inc(unsigned int i)
Increment quantum number i.
Definition: quanta.h:378
QuantumNumbersA<T,N> is a set of N quantum numbers of type T implemented in terms of a C-style array...
Definition: quanta.h:198
void set_elem(unsigned int i, const T &value)
Return i-th quantum number.
Definition: quanta.h:236
void inc(unsigned int i)
Increment quantum number i.
Definition: quanta.h:77
LIBINT2_UINT_LEAST64 key() const
Implements Hashable::key()
Definition: quanta.h:246
const T elem(unsigned int i) const
Return i-th quantum number.
Definition: quanta.h:88
unsigned int num_quanta() const
Return i-th quantum number.
Definition: quanta.h:93
LIBINT2_UINT_LEAST64 max_key() const
key is in range [0,max_key())
Definition: quanta.h:111
QuantumNumbers iter_type
QuantumSet is a set of one QuantumSet.
Definition: quanta.h:64
LIBINT2_UINT_LEAST64 max_key() const
key is in range [0,max_key())
Definition: quanta.h:392
const T elem(unsigned int i) const
Return i-th quantum number.
Definition: quanta.h:231
unsigned int num_quanta() const
Implementation of QuantumSet::num_quanta()
Definition: quanta.h:241
void inc(unsigned int i)
Increment quantum number i.
Definition: quanta.h:220
void dec(unsigned int i)
Decrement quantum number i.
Definition: quanta.h:222
Default implementation of QuantumNumbers.
Definition: quanta.h:398
QuantumNumbersA iter_type
QuantumSet is a set of one QuantumSet.
Definition: quanta.h:205
const T elem(unsigned int i) const
Return i-th quantum number.
Definition: quanta.h:384
QuantumNumbersA< T, N > Result
This defines which QuantumNumbers implementation to use.
Definition: quanta.h:400