Select Git revision
CartesianMeshBuilder.hpp
TinyMatrix.hpp 11.55 KiB
#ifndef TINY_MATRIX_HPP
#define TINY_MATRIX_HPP
#include <utils/PugsAssert.hpp>
#include <utils/PugsMacros.hpp>
#include <utils/Types.hpp>
#include <algebra/TinyVector.hpp>
#include <iostream>
template <size_t N, typename T = double>
class [[nodiscard]] TinyMatrix
{
public:
using data_type = T;
private:
T m_values[N * N];
static_assert((N > 0), "TinyMatrix size must be strictly positive");
PUGS_FORCEINLINE
constexpr size_t _index(size_t i, size_t j) const noexcept // LCOV_EXCL_LINE (due to forced inline)
{
return i * N + j;
}
template <typename... Args>
PUGS_FORCEINLINE constexpr void _unpackVariadicInput(const T& t, Args&&... args) noexcept
{
m_values[N * N - 1 - sizeof...(args)] = t;
if constexpr (sizeof...(args) > 0) {
this->_unpackVariadicInput(std::forward<Args>(args)...);
}
}
public:
PUGS_INLINE
constexpr size_t dimension() const
{
return N * N;
}
PUGS_INLINE
constexpr size_t nbRows() const
{
return N;
}
PUGS_INLINE
constexpr size_t nbColumns() const
{
return N;
}
PUGS_INLINE
constexpr TinyMatrix operator-() const
{
TinyMatrix opposite;
for (size_t i = 0; i < N * N; ++i) {
opposite.m_values[i] = -m_values[i];
}
return opposite;
}
PUGS_INLINE
constexpr friend TinyMatrix operator*(const T& t, const TinyMatrix& A)
{
TinyMatrix B = A;