1#ifndef AMREX_SMALL_MATRIX_H_
2#define AMREX_SMALL_MATRIX_H_
3#include <AMReX_Config.H>
12#include <initializer_list>
33 template <
class T,
int NRows,
int NCols, Order ORDER = Order::F,
int StartIndex = 0>
59 template <
typename... Ts,
int MM=NRows,
int NN=NCols,
60 std::enable_if_t<MM==1 || NN==1, int> = 0>
65 static_assert(
sizeof...(vs) <= std::max(NRows,NCols));
80 explicit SmallMatrix (std::initializer_list<std::initializer_list<T>>
const& init)
84 for (
auto const& row : init) {
87 for (
auto const&
x : row) {
98 static_assert(StartIndex == 0 || StartIndex == 1);
99 if constexpr (StartIndex == 1) {
106 return m_mat[i+j*NRows];
108 return m_mat[j+i*NCols];
115 static_assert(StartIndex == 0 || StartIndex == 1);
116 if constexpr (StartIndex == 1) {
123 return m_mat[i+j*NRows];
125 return m_mat[j+i*NCols];
130 template <
int MM=NRows,
int NN=NCols, std::enable_if_t<(MM==1 || NN==1),
int> = 0>
133 static_assert(StartIndex == 0 || StartIndex == 1);
134 if constexpr (StartIndex == 1) {
143 template <
int MM=NRows,
int NN=NCols, std::enable_if_t<(MM==1 || NN==1),
int> = 0>
146 static_assert(StartIndex == 0 || StartIndex == 1);
147 if constexpr (StartIndex == 1) {
156 template <
int MM=NRows,
int NN=NCols, std::enable_if_t<(MM==1 || NN==1),
int> = 0>
159 static_assert(StartIndex == 0 || StartIndex == 1);
160 if constexpr (StartIndex == 1) {
169 template <
int MM=NRows,
int NN=NCols, std::enable_if_t<(MM==1 || NN==1),
int> = 0>
172 static_assert(StartIndex == 0 || StartIndex == 1);
173 if constexpr (StartIndex == 1) {
193 const T*
end () const noexcept {
return m_mat + NRows*NCols; }
214 for (
auto&
x :
m_mat) {
x = val; }
219 template <
int MM=NRows,
int NN=NCols, std::enable_if_t<MM==NN,
int> = 0>
224 static_assert(StartIndex == 0 || StartIndex == 1);
226 constexpr_for<StartIndex,NRows+StartIndex>(
227 [&] (
int i) { I(i,i) = T(1); });
246 for (
int j = StartIndex; j < NRows+StartIndex; ++j) {
247 for (
int i = StartIndex; i < NCols+StartIndex; ++i) {
248 r(i,j) = (*this)(j,i);
255 template <
int MM=NRows,
int NN=NCols, std::enable_if_t<MM==NN,
int> = 0>
260 static_assert(StartIndex == 0 || StartIndex == 1);
261 for (
int j = 1+StartIndex; j < NCols+StartIndex; ++j) {
262 for (
int i = StartIndex; i < j; ++i) {
274 for (
auto const&
x :
m_mat) {
285 for (
auto const&
x :
m_mat) {
292 template <
int MM=NRows,
int NN=NCols, std::enable_if_t<MM==NN,
int> = 0>
297 constexpr_for<StartIndex,MM+StartIndex>([&] (
int i) { t += (*this)(i,i); });
306 for (
int n = 0; n < NRows*NCols; ++n) {
327 for (
int n = 0; n < NRows*NCols; ++n) {
348 return (*
this) * T(-1);
381 template <
class U,
int N1,
int N2,
int N3, Order Ord,
int SI>
392 for (
int n = 0; n < NRows*NCols; ++n) {
398 template <
int N, std::enable_if_t<(N<NRows*NCols),
int> = 0>
399 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
400 constexpr T const& get () const { return m_mat[N]; }
402 template <
int N, std::enable_if_t<(N<NRows*NCols),
int> = 0>
403 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
404 constexpr T& get () { return m_mat[N]; }
407 T m_mat[NRows*NCols];
410 template <
class U,
int N1,
int N2,
int N3, Order Ord,
int SI>
416 static_assert(SI == 0 || SI == 1);
419 for (
int j = SI; j < N3+SI; ++j) {
420 constexpr_for<SI,N1+SI>([&] (
int i) {
r(i,j) = U(0); });
421 for (
int k = SI; k < N2+SI; ++k) {
423 constexpr_for<SI,N1+SI>([&] (
int i)
425 r(i,j) += lhs(i,k) *
b;
430 for (
int i = SI; i < N1+SI; ++i) {
431 constexpr_for<SI,N3+SI>([&] (
int j) {
r(i,j) = U(0); });
432 for (
int k = SI; k < N2+SI; ++k) {
434 constexpr_for<SI,N3+SI>([&] (
int j)
436 r(i,j) += a * rhs(k,j);
444 template <
class T,
int NRows,
int NCols, Order ORDER,
int SI>
448 for (
int i = SI; i < NRows+SI; ++i) {
450 for (
int j = 1+SI; j < NCols+SI; ++j) {
451 os <<
" " << mat(i,j);
458 template <
class T,
int N,
int StartIndex = 0>
461 template <
class T,
int N,
int StartIndex = 0>
465template <
class T,
int NRows,
int NCols, amrex::Order ORDER,
int StartIndex>
466struct std::tuple_size<amrex::SmallMatrix<T,NRows,NCols,ORDER,StartIndex> >
467 : std::integral_constant<std::size_t,NRows*NCols> {};
469template <std::
size_t N,
class T,
int NRows,
int NCols, amrex::Order ORDER,
int StartIndex>
470struct 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
Order
Definition AMReX_SmallMatrix.H:19
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void Swap(T &t1, T &t2) noexcept
Definition AMReX_Algorithm.H:75
std::ostream & operator<<(std::ostream &os, AmrMesh const &amr_mesh)
Definition AMReX_AmrMesh.cpp:1236
Matrix class with compile-time size.
Definition AMReX_SmallMatrix.H:35
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE SmallMatrix< T, NCols, NRows, ORDER, StartIndex > transpose() const
Returns transposed matrix.
Definition AMReX_SmallMatrix.H:243
static constexpr int row_size
Definition AMReX_SmallMatrix.H:38
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE SmallMatrix< T, NRows, NCols, ORDER, StartIndex > & setVal(T val)
Set all elements in the matrix to the given value.
Definition AMReX_SmallMatrix.H:212
T m_mat[NRows *NCols]
Definition AMReX_SmallMatrix.H:407
static constexpr Order ordering
Definition AMReX_SmallMatrix.H:40
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE 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:304
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE 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:336
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE SmallMatrix< T, NRows, NCols, ORDER, StartIndex > & operator*=(T a)
Operator *= that scales this matrix in place by a scalar.
Definition AMReX_SmallMatrix.H:354
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE const T & operator[](int i) const noexcept
Returns a const reference to element i of a vector.
Definition AMReX_SmallMatrix.H:158
static constexpr int starting_index
Definition AMReX_SmallMatrix.H:41
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE constexpr SmallMatrix(Ts... vs)
Constructs column- or row-vector.
Definition AMReX_SmallMatrix.H:62
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE const T * end() const noexcept
Definition AMReX_SmallMatrix.H:193
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE constexpr SmallMatrix()=default
Default constructor.
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE SmallMatrix(std::initializer_list< std::initializer_list< T > > const &init)
Constructs SmallMatrix with nested std::initializer_list.
Definition AMReX_SmallMatrix.H:80
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T * begin() noexcept
Definition AMReX_SmallMatrix.H:200
static constexpr AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE SmallMatrix< T, NRows, NCols, ORDER, StartIndex > Identity() noexcept
Returns an identity matrix.
Definition AMReX_SmallMatrix.H:223
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T * end() noexcept
Definition AMReX_SmallMatrix.H:207
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T sum() const
Returns the sum of all elements in the matrix.
Definition AMReX_SmallMatrix.H:282
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE 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:97
static constexpr AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE SmallMatrix< T, NRows, NCols, ORDER, StartIndex > Zero() noexcept
Returns a matrix initialized with zeros.
Definition AMReX_SmallMatrix.H:235
T value_type
Definition AMReX_SmallMatrix.H:36
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T dot(SmallMatrix< T, NRows, NCols, ORDER, StartIndex > const &rhs) const
Returns the dot product of two vectors.
Definition AMReX_SmallMatrix.H:389
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE 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:315
static constexpr int column_size
Definition AMReX_SmallMatrix.H:39
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE const T * begin() const noexcept
Definition AMReX_SmallMatrix.H:186
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T product() const
Returns the product of all elements in the matrix.
Definition AMReX_SmallMatrix.H:271
T & reference_type
Definition AMReX_SmallMatrix.H:37
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE 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:365
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE SmallMatrix< T, NRows, NCols, ORDER, StartIndex > & transposeInPlace()
Transposes a square matrix in-place.
Definition AMReX_SmallMatrix.H:258
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T trace() const
Returns the trace of a square matrix.
Definition AMReX_SmallMatrix.H:294
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE 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:325
T type
Definition AMReX_SmallMatrix.H:472