faunus
pairmatrix.h
1 #pragma once
2 #include <doctest/doctest.h>
3 #include <vector>
4 
5 namespace Faunus {
24 template <class T, bool triangular = false> class PairMatrix
25 {
26  private:
27  T default_value; // default value when resizing
28  std::vector<std::vector<T>> matrix;
29 
30  public:
31  void resize(size_t n)
32  {
33  matrix.resize(n);
34  for (size_t i = 0; i < matrix.size(); i++) {
35  if constexpr (triangular) {
36  matrix[i].resize(i + 1, default_value);
37  }
38  else {
39  matrix[i].resize(n, default_value);
40  }
41  }
42  }
43 
44  PairMatrix(size_t n = 0, T val = T())
45  : default_value(val)
46  {
47  resize(n);
48  }
49 
50  auto size() const { return matrix.size(); }
51 
52  inline const T& operator()(size_t i, size_t j) const
53  {
54  if constexpr (triangular) {
55  if (j > i) {
56  std::swap(i, j);
57  }
58  }
59  assert(i < matrix.size());
60  assert(j < matrix[i].size());
61  return matrix[i][j];
62  }
63 
64  void set(size_t i, size_t j, T val)
65  {
66  if (j > i) {
67  std::swap(i, j);
68  }
69  if (i >= matrix.size()) {
70  resize(i + 1);
71  }
72  if constexpr (!triangular) {
73  matrix[j][i] = val;
74  }
75  matrix[i][j] = val;
76  }
77 
79  void set(T val)
80  {
81  for (size_t i = 0; i < matrix.size(); i++) {
82  for (size_t j = 0; j < matrix.size(); j++) {
83  set(i, j, val);
84  }
85  }
86  }
87 
88  void setZero() { set(T()); }
89 };
90 
91 TEST_CASE("[Faunus] PairMatrix")
92 {
93  int i = 2, j = 3; // particle type, for example
94 
95  SUBCASE("full matrix")
96  {
98  m.set(i, j, 12.1);
99  CHECK_EQ(m.size(), 4);
100  CHECK_EQ(m(i, j), 12.1);
101  CHECK_EQ(m(i, j), m(j, i));
102  CHECK_EQ(m(0, 2), 0);
103  CHECK_EQ(m(2, 0), 0);
104  }
105 
106  SUBCASE("full matrix - default value")
107  {
108  PairMatrix<double, false> m(5, 3.1);
109  for (size_t i = 0; i < 5; i++)
110  for (size_t j = 0; j < 5; j++)
111  CHECK_EQ(m(i, j), 3.1);
112  }
113 
114  SUBCASE("triangular matrix - default value")
115  {
116  PairMatrix<double, true> m(5, 3.1);
117  for (size_t i = 0; i < 5; i++)
118  for (size_t j = 0; j < 5; j++)
119  CHECK_EQ(m(i, j), 3.1);
120  }
121 
122  SUBCASE("triangular matrix")
123  {
125  m.set(i, j, 12.1);
126  CHECK_EQ(m.size(), 4);
127  CHECK_EQ(m(i, j), 12.1);
128  CHECK_EQ(m(i, j), m(j, i));
129  CHECK_EQ(m(0, 2), 0);
130  CHECK_EQ(m(2, 0), 0);
131  }
132 }
133 
134 } // namespace Faunus
double T
floating point size
Definition: units.h:73
Cell list class templates.
Definition: actions.cpp:11
Container for data between pairs.
Definition: pairmatrix.h:24