20 #ifndef _libint2_src_bin_libint_deriviter_h_ 21 #define _libint2_src_bin_libint_deriviter_h_ 30 template <
unsigned int NCenters>
34 assert(NCenters != 0);
35 std::fill(deriv_index_, deriv_index_+NCenters*3, 0u);
36 deriv_index_[0] = deriv_order_;
39 unsigned int range_rank()
const {
40 unsigned int result = 1;
41 for(
unsigned int d=1; d<=deriv_order_; ++d) {
42 result *= (NCenters*3+d-1); result /= d;
47 unsigned int value(
unsigned int i)
const {
48 assert(i < NCenters*3);
49 return deriv_index_[i];
52 const unsigned int* values()
const {
58 return last(const_cast<unsigned int*>(deriv_index_), NCenters*3);
62 next(deriv_index_, NCenters*3);
66 unsigned int deriv_order_;
67 unsigned int deriv_index_[NCenters*3];
70 first(
unsigned int* deriv_index,
unsigned int n) {
72 const unsigned int deriv_order = std::accumulate(deriv_index, deriv_index+n, 0u);
73 std::fill(deriv_index, deriv_index+n, 0u);
74 deriv_index[0] = deriv_order;
77 last(
unsigned int* deriv_index,
unsigned int n) {
78 const unsigned int deriv_order = std::accumulate(deriv_index, deriv_index+n, 0u);
79 return deriv_index[n-1] == deriv_order;
82 next(
unsigned int* deriv_index,
unsigned int n) {
84 if (last(deriv_index+1, n-1)) {
85 assert(deriv_index[0]!=0u);
88 first(deriv_index+1, n-1);
91 next(deriv_index+1, n-1);
Iterates over unique derivative indices.
Definition: deriv_iter.h:31
Defaults definitions for various parameters assumed by Libint.
Definition: algebra.cc:23
void next()
will throw if last() == true
Definition: deriv_iter.h:61