1#ifndef AMREX_SMALL_MATRIX_H_
2#define AMREX_SMALL_MATRIX_H_
3#include <AMReX_Config.H>
13#include <initializer_list>
34 template <
class T,
int NRows,
int NCols, Order ORDER = Order::F,
int StartIndex = 0>
60 template <
typename... Ts,
int MM=NRows,
int NN=NCols,
61 std::enable_if_t<MM==1 || NN==1, int> = 0>
66 static_assert(
sizeof...(vs) <= std::max(NRows,NCols));
81 explicit SmallMatrix (std::initializer_list<std::initializer_list<T>>
const& init)
85 for (
auto const& row : init) {
88 for (
auto const&
x : row) {
99 static_assert(StartIndex == 0 || StartIndex == 1);
100 if constexpr (StartIndex == 1) {
107 return m_mat[i+j*NRows];
109 return m_mat[j+i*NCols];
116 static_assert(StartIndex == 0 || StartIndex == 1);
117 if constexpr (StartIndex == 1) {
124 return m_mat[i+j*NRows];
126 return m_mat[j+i*NCols];
131 template <
int MM=NRows,
int NN=NCols, std::enable_if_t<(MM==1 || NN==1),
int> = 0>
134 static_assert(StartIndex == 0 || StartIndex == 1);
135 if constexpr (StartIndex == 1) {
144 template <
int MM=NRows,
int NN=NCols, std::enable_if_t<(MM==1 || NN==1),
int> = 0>
147 static_assert(StartIndex == 0 || StartIndex == 1);
148 if constexpr (StartIndex == 1) {
157 template <
int MM=NRows,
int NN=NCols, std::enable_if_t<(MM==1 || NN==1),
int> = 0>
160 static_assert(StartIndex == 0 || StartIndex == 1);
161 if constexpr (StartIndex == 1) {
170 template <
int MM=NRows,
int NN=NCols, std::enable_if_t<(MM==1 || NN==1),
int> = 0>
173 static_assert(StartIndex == 0 || StartIndex == 1);
174 if constexpr (StartIndex == 1) {
187 const T*
begin () const noexcept {
return m_mat; }
194 const T*
end () const noexcept {
return m_mat + NRows*NCols; }
201 T*
begin () noexcept {
return m_mat; }
208 T*
end () noexcept {
return m_mat + NRows*NCols; }
215 for (
auto&
x : m_mat) {
x = val; }
220 template <
int MM=NRows,
int NN=NCols, std::enable_if_t<MM==NN,
int> = 0>
225 static_assert(StartIndex == 0 || StartIndex == 1);
227 constexpr_for<StartIndex,NRows+StartIndex>(
228 [&] (
int i) { I(i,i) = T(1); });
247 for (
int j = StartIndex; j < NRows+StartIndex; ++j) {
248 for (
int i = StartIndex; i < NCols+StartIndex; ++i) {
249 r(i,j) = (*this)(j,i);
256 template <
int MM=NRows,
int NN=NCols, std::enable_if_t<MM==NN,
int> = 0>
261 static_assert(StartIndex == 0 || StartIndex == 1);
262 for (
int j = 1+StartIndex; j < NCols+StartIndex; ++j) {
263 for (
int i = StartIndex; i < j; ++i) {
275 for (
auto const&
x : m_mat) {
286 for (
auto const&
x : m_mat) {
293 template <
int MM=NRows,
int NN=NCols, std::enable_if_t<MM==NN,
int> = 0>
298 constexpr_for<StartIndex,MM+StartIndex>([&] (
int i) { t += (*this)(i,i); });
307 for (
int n = 0; n < NRows*NCols; ++n) {
308 m_mat[n] += rhs.m_mat[n];
328 for (
int n = 0; n < NRows*NCols; ++n) {
329 m_mat[n] -= rhs.m_mat[n];
349 return (*
this) * T(-1);
357 for (
auto&
x : m_mat) {
382 template <
class U,
class V,
int N1,
int N2,
int N3, Order Ord,
int SI>
384 friend decltype(
auto)
393 for (
int n = 0; n < NRows*NCols; ++n) {
394 r += m_mat[n] * rhs.m_mat[n];
399 template <
int N, std::enable_if_t<(N<NRows*NCols),
int> = 0>
400 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
401 constexpr T const& get () const { return m_mat[N]; }
403 template <
int N, std::enable_if_t<(N<NRows*NCols),
int> = 0>
404 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
405 constexpr T& get () { return m_mat[N]; }
408 T m_mat[NRows*NCols];
411 template <
class U,
class V,
int N1,
int N2,
int N3, Order Ord,
int SI>
417 static_assert(SI == 0 || SI == 1);
419 using P =
decltype(std::declval<U>() * std::declval<V>());
423 for (
int j = SI; j < N3+SI; ++j) {
424 constexpr_for<SI,N1+SI>([&] (
int i) { r(i,j) = P(0); });
425 for (
int k = SI; k < N2+SI; ++k) {
427 constexpr_for<SI,N1+SI>([&] (
int i)
429 r(i,j) += lhs(i,k) * b;
434 for (
int i = SI; i < N1+SI; ++i) {
435 constexpr_for<SI,N3+SI>([&] (
int j) { r(i,j) = P(0); });
436 for (
int k = SI; k < N2+SI; ++k) {
438 constexpr_for<SI,N3+SI>([&] (
int j)
440 r(i,j) += a * rhs(k,j);
448 template <
class T,
int NRows,
int NCols, Order ORDER,
int SI>
452 for (
int i = SI; i < NRows+SI; ++i) {
454 for (
int j = 1+SI; j < NCols+SI; ++j) {
455 os <<
" " << mat(i,j);
462 template <
class T,
int N,
int StartIndex = 0>
465 template <
class T,
int N,
int StartIndex = 0>
469template <
class T,
int NRows,
int NCols, amrex::Order ORDER,
int StartIndex>
470struct std::tuple_size<amrex::SmallMatrix<T,NRows,NCols,ORDER,StartIndex> >
471 : std::integral_constant<std::size_t,NRows*NCols> {};
473template <std::
size_t N,
class T,
int NRows,
int NCols, amrex::Order ORDER,
int StartIndex>
474struct std::tuple_element<N,
amrex::SmallMatrix<T,NRows,NCols,ORDER,StartIndex> >
#define AMREX_ASSERT(EX)
Definition AMReX_BLassert.H:38
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:119
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
Definition AMReX_Amr.cpp:49
__host__ __device__ void Swap(T &t1, T &t2) noexcept
Definition AMReX_Algorithm.H:93
Order
Definition AMReX_Order.H:7
std::ostream & operator<<(std::ostream &os, AmrMesh const &amr_mesh)
Definition AMReX_AmrMesh.cpp:1237
Matrix class with compile-time size.
Definition AMReX_SmallMatrix.H:36
__host__ __device__ const T * end() const noexcept
Definition AMReX_SmallMatrix.H:194
static constexpr int row_size
Definition AMReX_SmallMatrix.H:39
__host__ __device__ T product() const
Returns the product of all elements in the matrix.
Definition AMReX_SmallMatrix.H:272
__host__ __device__ friend SmallMatrix< T, NRows, NCols, ORDER, StartIndex > operator*(SmallMatrix< T, NRows, NCols, ORDER, StartIndex > m, T a)
Returns the product of a matrix and a scalar.
Definition AMReX_SmallMatrix.H:366
__host__ __device__ friend SmallMatrix< T, NRows, NCols, ORDER, StartIndex > operator-(SmallMatrix< T, NRows, NCols, ORDER, StartIndex > lhs, SmallMatrix< T, NRows, NCols, ORDER, StartIndex > const &rhs)
Binary operator - returning the result of maxtrix subtraction, lhs-rhs.
Definition AMReX_SmallMatrix.H:337
__host__ __device__ constexpr SmallMatrix()=default
Default constructor.
static constexpr Order ordering
Definition AMReX_SmallMatrix.H:41
__host__ __device__ SmallMatrix< T, NRows, NCols, ORDER, StartIndex > & operator-=(SmallMatrix< T, NRows, NCols, ORDER, StartIndex > const &rhs)
Operator -= performing matrix subtraction as in (*this) -= rhs.
Definition AMReX_SmallMatrix.H:326
__host__ __device__ const T & operator()(int i, int j) const noexcept
Returns a const reference to the element at row i and column j.
Definition AMReX_SmallMatrix.H:98
static constexpr int starting_index
Definition AMReX_SmallMatrix.H:42
static constexpr __host__ __device__ SmallMatrix< T, NRows, NCols, ORDER, StartIndex > Zero() noexcept
Returns a matrix initialized with zeros.
Definition AMReX_SmallMatrix.H:236
__host__ __device__ SmallMatrix< T, NRows, NCols, ORDER, StartIndex > & operator+=(SmallMatrix< T, NRows, NCols, ORDER, StartIndex > const &rhs)
Operator += performing matrix addition as in (*this) += rhs.
Definition AMReX_SmallMatrix.H:305
__host__ __device__ T * end() noexcept
Definition AMReX_SmallMatrix.H:208
__host__ __device__ T * begin() noexcept
Definition AMReX_SmallMatrix.H:201
static constexpr __host__ __device__ SmallMatrix< T, NRows, NCols, ORDER, StartIndex > Identity() noexcept
Returns an identity matrix.
Definition AMReX_SmallMatrix.H:224
__host__ __device__ SmallMatrix(std::initializer_list< std::initializer_list< T > > const &init)
Constructs SmallMatrix with nested std::initializer_list.
Definition AMReX_SmallMatrix.H:81
__host__ __device__ SmallMatrix< T, NRows, NCols, ORDER, StartIndex > & operator*=(T a)
Operator *= that scales this matrix in place by a scalar.
Definition AMReX_SmallMatrix.H:355
__host__ __device__ T trace() const
Returns the trace of a square matrix.
Definition AMReX_SmallMatrix.H:295
__host__ __device__ SmallMatrix< T, NRows, NCols, ORDER, StartIndex > & setVal(T val)
Set all elements in the matrix to the given value.
Definition AMReX_SmallMatrix.H:213
T value_type
Definition AMReX_SmallMatrix.H:37
static constexpr int column_size
Definition AMReX_SmallMatrix.H:40
__host__ __device__ const T & operator[](int i) const noexcept
Returns a const reference to element i of a vector.
Definition AMReX_SmallMatrix.H:159
__host__ __device__ T dot(SmallMatrix< T, NRows, NCols, ORDER, StartIndex > const &rhs) const
Returns the dot product of two vectors.
Definition AMReX_SmallMatrix.H:390
__host__ __device__ friend SmallMatrix< T, NRows, NCols, ORDER, StartIndex > operator+(SmallMatrix< T, NRows, NCols, ORDER, StartIndex > lhs, SmallMatrix< T, NRows, NCols, ORDER, StartIndex > const &rhs)
Binary operator + returning the result of maxtrix addition, lhs+rhs.
Definition AMReX_SmallMatrix.H:316
__host__ __device__ const T * begin() const noexcept
Definition AMReX_SmallMatrix.H:187
T & reference_type
Definition AMReX_SmallMatrix.H:38
__host__ __device__ constexpr SmallMatrix(Ts... vs)
Constructs column- or row-vector.
Definition AMReX_SmallMatrix.H:63
__host__ __device__ SmallMatrix< T, NRows, NCols, ORDER, StartIndex > & transposeInPlace()
Transposes a square matrix in-place.
Definition AMReX_SmallMatrix.H:259
__host__ __device__ T sum() const
Returns the sum of all elements in the matrix.
Definition AMReX_SmallMatrix.H:283
__host__ __device__ SmallMatrix< T, NCols, NRows, ORDER, StartIndex > transpose() const
Returns transposed matrix.
Definition AMReX_SmallMatrix.H:244
T type
Definition AMReX_SmallMatrix.H:476