1 #ifndef AMREX_SMALL_MATRIX_H_
2 #define AMREX_SMALL_MATRIX_H_
3 #include <AMReX_Config.H>
12 #include <initializer_list>
15 #include <type_traits>
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) {
105 return m_mat[i+j*NRows];
107 return m_mat[j+i*NCols];
114 static_assert(StartIndex == 0 || StartIndex == 1);
115 if constexpr (StartIndex == 1) {
121 return m_mat[i+j*NRows];
123 return m_mat[j+i*NCols];
128 template <
int MM=NRows,
int NN=NCols, std::enable_if_t<(MM==1 || NN==1),
int> = 0>
131 static_assert(StartIndex == 0 || StartIndex == 1);
132 if constexpr (StartIndex == 1) {
140 template <
int MM=NRows,
int NN=NCols, std::enable_if_t<(MM==1 || NN==1),
int> = 0>
143 static_assert(StartIndex == 0 || StartIndex == 1);
144 if constexpr (StartIndex == 1) {
152 template <
int MM=NRows,
int NN=NCols, std::enable_if_t<(MM==1 || NN==1),
int> = 0>
155 static_assert(StartIndex == 0 || StartIndex == 1);
156 if constexpr (StartIndex == 1) {
164 template <
int MM=NRows,
int NN=NCols, std::enable_if_t<(MM==1 || NN==1),
int> = 0>
167 static_assert(StartIndex == 0 || StartIndex == 1);
168 if constexpr (StartIndex == 1) {
187 const T*
end () const noexcept {
return m_mat + NRows*NCols; }
208 for (
auto&
x :
m_mat) {
x = val; }
213 template <
int MM=NRows,
int NN=NCols, std::enable_if_t<MM==NN,
int> = 0>
218 static_assert(StartIndex == 0 || StartIndex == 1);
220 constexpr_for<StartIndex,NRows+StartIndex>(
221 [&] (
int i) { I(i,i) = T(1); });
240 for (
int j = StartIndex; j < NRows+StartIndex; ++j) {
241 for (
int i = StartIndex; i < NCols+StartIndex; ++i) {
242 r(i,j) = (*this)(j,i);
249 template <
int MM=NRows,
int NN=NCols, std::enable_if_t<MM==NN,
int> = 0>
254 static_assert(StartIndex == 0 || StartIndex == 1);
255 for (
int j = 1+StartIndex; j < NCols+StartIndex; ++j) {
256 for (
int i = StartIndex; i < j; ++i) {
268 for (
auto const&
x :
m_mat) {
279 for (
auto const&
x :
m_mat) {
286 template <
int MM=NRows,
int NN=NCols, std::enable_if_t<MM==NN,
int> = 0>
291 constexpr_for<StartIndex,MM+StartIndex>([&] (
int i) { t += (*this)(i,i); });
300 for (
int n = 0; n < NRows*NCols; ++n) {
321 for (
int n = 0; n < NRows*NCols; ++n) {
342 return (*
this) * T(-1);
375 template <
class U,
int N1,
int N2,
int N3, Order Ord,
int SI>
386 for (
int n = 0; n < NRows*NCols; ++n) {
392 template <
int N, std::enable_if_t<(N<NRows*NCols),
int> = 0>
393 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
394 constexpr T const& get () const { return m_mat[N]; }
396 template <
int N, std::enable_if_t<(N<NRows*NCols),
int> = 0>
397 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
398 constexpr T& get () { return m_mat[N]; }
401 T m_mat[NRows*NCols];
404 template <
class U,
int N1,
int N2,
int N3, Order Ord,
int SI>
410 static_assert(SI == 0 || SI == 1);
413 for (
int j = SI; j < N3+SI; ++j) {
414 constexpr_for<SI,N1+SI>([&] (
int i) {
r(i,j) = U(0); });
415 for (
int k = SI; k < N2+SI; ++k) {
417 constexpr_for<SI,N1+SI>([&] (
int i)
419 r(i,j) += lhs(i,k) *
b;
424 for (
int i = SI; i < N1+SI; ++i) {
425 constexpr_for<SI,N3+SI>([&] (
int j) {
r(i,j) = U(0); });
426 for (
int k = SI; k < N2+SI; ++k) {
428 constexpr_for<SI,N3+SI>([&] (
int j)
430 r(i,j) += a * rhs(k,j);
438 template <
class T,
int NRows,
int NCols, Order ORDER,
int SI>
442 for (
int i = SI; i < NRows+SI; ++i) {
444 for (
int j = 1+SI; j < NCols+SI; ++j) {
445 os <<
" " << mat(i,j);
452 template <
class T,
int N,
int StartIndex = 0>
455 template <
class T,
int N,
int StartIndex = 0>
459 template <
class T,
int NRows,
int NCols, amrex::Order ORDER,
int StartIndex>
460 struct std::tuple_size<amrex::SmallMatrix<T,NRows,NCols,ORDER,StartIndex> >
461 : std::integral_constant<std::size_t,NRows*NCols> {};
463 template <std::
size_t N,
class T,
int NRows,
int NCols, amrex::Order ORDER,
int StartIndex>
464 struct 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
@ max
Definition: AMReX_ParallelReduce.H:17
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:237
static constexpr int row_size
Definition: AMReX_SmallMatrix.H:38
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:217
T m_mat[NRows *NCols]
Definition: AMReX_SmallMatrix.H:401
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:298
static constexpr Order ordering
Definition: AMReX_SmallMatrix.H:40
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:359
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE SmallMatrix< T, NRows, NCols, ORDER, StartIndex > operator-() const
Unary minus operator.
Definition: AMReX_SmallMatrix.H:340
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:348
AMREX_GPU_HOST_DEVICE constexpr AMREX_FORCE_INLINE SmallMatrix()=default
Default constructor.
static constexpr int starting_index
Definition: AMReX_SmallMatrix.H:41
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
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:206
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T sum() const
Returns the sum of all elements in the matrix.
Definition: AMReX_SmallMatrix.H:276
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:229
AMREX_GPU_HOST_DEVICE constexpr AMREX_FORCE_INLINE SmallMatrix(Ts... vs)
Constructs column- or row-vector.
Definition: AMReX_SmallMatrix.H:62
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:383
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:309
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:154
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
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:180
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T * begin() noexcept
Definition: AMReX_SmallMatrix.H:194
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T product() const
Returns the product of all elements in the matrix.
Definition: AMReX_SmallMatrix.H:265
T & reference_type
Definition: AMReX_SmallMatrix.H:37
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T * end() noexcept
Definition: AMReX_SmallMatrix.H:201
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T trace() const
Returns the trace of a square matrix.
Definition: AMReX_SmallMatrix.H:288
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:319
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE const T * end() const noexcept
Definition: AMReX_SmallMatrix.H:187
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE SmallMatrix< T, NRows, NCols, ORDER, StartIndex > & transposeInPlace()
Transposes a square matrix in-place.
Definition: AMReX_SmallMatrix.H:252
T type
Definition: AMReX_SmallMatrix.H:466