3
0
mirror of https://github.com/triqs/dft_tools synced 2024-12-27 06:43:40 +01:00
dft_tools/doc/reference/arrays/concepts_0.cpp
tayral edd1ff4529 Restructuring documentation.
A first general restructuration of the doc according to the pattern [tour|tutorial|reference].
In the reference part, objects are documented per topic.
In each topic, [definition|c++|python|hdf5] (not yet implemented)
2014-10-18 12:21:08 +01:00

43 lines
1.3 KiB
C++

#include <triqs/arrays.hpp>
#include <iostream>
namespace triqs {
namespace arrays { // better to put it in this namespace for ADL...
template <typename T> class immutable_diagonal_matrix_view {
array_view<T, 1> data; // the diagonal stored as a 1d array
public:
immutable_diagonal_matrix_view(array_view<T, 1> v) : data(v) {} // constructor
// the ImmutableMatrix concept
typedef indexmaps::cuboid::domain_t<2> domain_type;
domain_type domain() const {
auto s = data.shape()[0];
return {s, s};
}
typedef T value_type;
T operator()(size_t i, size_t j) const { return (i == j ? data(i) : 0); } // just kronecker...
friend std::ostream &operator<<(std::ostream &out, immutable_diagonal_matrix_view const &d) {
return out << "diagonal_matrix " << d.data;
}
};
// Marking this class as belonging to the Matrix & Vector algebra.
template <typename T> struct ImmutableMatrix<immutable_diagonal_matrix_view<T>> : std::true_type {};
}
}
/// TESTING
using namespace triqs::arrays;
int main(int argc, char **argv) {
auto a = array<int, 1>{1, 2, 3, 4};
auto d = immutable_diagonal_matrix_view<int>{a};
std::cout << "domain = " << d.domain() << std::endl;
std::cout << "d = " << d << std::endl;
std::cout << "2*d = " << make_matrix(2 * d) << std::endl;
std::cout << "d*d = " << matrix<int>(d * d) << std::endl;
}