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>
61 requires (NRows==1 || NCols==1)
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];
133 requires (NRows==1 || NCols==1)
135 static_assert(StartIndex == 0 || StartIndex == 1);
136 if constexpr (StartIndex == 1) {
147 requires (NRows==1 || NCols==1)
149 static_assert(StartIndex == 0 || StartIndex == 1);
150 if constexpr (StartIndex == 1) {
161 requires (NRows==1 || NCols==1)
163 static_assert(StartIndex == 0 || StartIndex == 1);
164 if constexpr (StartIndex == 1) {
175 requires (NRows==1 || NCols==1)
177 static_assert(StartIndex == 0 || StartIndex == 1);
178 if constexpr (StartIndex == 1) {
191 const T*
begin () const noexcept {
return m_mat; }
198 const T*
end () const noexcept {
return m_mat + NRows*NCols; }
205 T*
begin () noexcept {
return m_mat; }
212 T*
end () noexcept {
return m_mat + NRows*NCols; }
219 for (
auto&
x : m_mat) {
x = val; }
229 static_assert(StartIndex == 0 || StartIndex == 1);
231 constexpr_for<StartIndex,NRows+StartIndex>(
232 [&] (
int i) { I(i,i) = T(1); });
248 requires (NRows==NCols && NRows%2==0 && std::is_floating_point_v<T>)
250 static_assert(StartIndex == 0 || StartIndex == 1);
254 omega(2*i + StartIndex, 2*i+1 + StartIndex) = T(1);
255 omega(2*i+1 + StartIndex, 2*i + StartIndex) = -T(1);
275 for (
int j = StartIndex; j < NRows+StartIndex; ++j) {
276 for (
int i = StartIndex; i < NCols+StartIndex; ++i) {
277 r(i,j) = (*this)(j,i);
288 static_assert(StartIndex == 0 || StartIndex == 1);
289 for (
int j = 1+StartIndex; j < NCols+StartIndex; ++j) {
290 for (
int i = StartIndex; i < j; ++i) {
302 for (
auto const&
x : m_mat) {
313 for (
auto const&
x : m_mat) {
321 T
trace () const requires (NRows==NCols)
324 constexpr_for<StartIndex,NRows+StartIndex>([&] (
int i) { t += (*this)(i,i); });
333 for (
int n = 0; n < NRows*NCols; ++n) {
334 m_mat[n] += rhs.m_mat[n];
354 for (
int n = 0; n < NRows*NCols; ++n) {
355 m_mat[n] -= rhs.m_mat[n];
375 return (*
this) * T(-1);
383 for (
auto&
x : m_mat) {
408 template <
class U,
class V,
int N1,
int N2,
int N3, Order Ord,
int SI>
410 friend decltype(
auto)
419 for (
int n = 0; n < NRows*NCols; ++n) {
420 r += m_mat[n] * rhs.m_mat[n];
426 requires (N<NRows*NCols)
428 constexpr T
const&
get ()
const {
return m_mat[N]; }
431 requires (N<NRows*NCols)
433 constexpr T&
get () {
return m_mat[N]; }
436 T m_mat[NRows*NCols];
439 template <
class U,
class V,
int N1,
int N2,
int N3, Order Ord,
int SI>
445 static_assert(SI == 0 || SI == 1);
447 using P =
decltype(std::declval<U>() * std::declval<V>());
451 for (
int j = SI; j < N3+SI; ++j) {
452 constexpr_for<SI,N1+SI>([&] (
int i) { r(i,j) = P(0); });
453 for (
int k = SI; k < N2+SI; ++k) {
455 constexpr_for<SI,N1+SI>([&] (
int i)
457 r(i,j) += lhs(i,k) * b;
462 for (
int i = SI; i < N1+SI; ++i) {
463 constexpr_for<SI,N3+SI>([&] (
int j) { r(i,j) = P(0); });
464 for (
int k = SI; k < N2+SI; ++k) {
466 constexpr_for<SI,N3+SI>([&] (
int j)
468 r(i,j) += a * rhs(k,j);
476 template <
class T,
int NRows,
int NCols, Order ORDER,
int SI>
480 for (
int i = SI; i < NRows+SI; ++i) {
482 for (
int j = 1+SI; j < NCols+SI; ++j) {
483 os <<
" " << mat(i,j);
490 template <
class T,
int N,
int StartIndex = 0>
493 template <
class T,
int N,
int StartIndex = 0>
497template <
class T,
int NRows,
int NCols, amrex::Order ORDER,
int StartIndex>
498struct std::tuple_size<
amrex::SmallMatrix<T,NRows,NCols,ORDER,StartIndex> >
499 : std::integral_constant<std::size_t,NRows*NCols> {};
501template <std::
size_t N,
class T,
int NRows,
int NCols, amrex::Order ORDER,
int StartIndex>
502struct 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:50
std::ostream & operator<<(std::ostream &os, AmrMesh const &amr_mesh)
Stream helper; forwards to the friend declared inside AmrMesh.
Definition AMReX_AmrMesh.cpp:1306
__host__ __device__ void Swap(T &t1, T &t2) noexcept
Definition AMReX_Algorithm.H:94
Order
Definition AMReX_Order.H:7
__host__ __device__ constexpr void constexpr_for(F const &f)
Definition AMReX_ConstexprFor.H:28
Matrix class with compile-time size.
Definition AMReX_SmallMatrix.H:36
__host__ __device__ const T * end() const noexcept
Definition AMReX_SmallMatrix.H:198
__host__ __device__ const T & operator[](int i) const noexcept
Returns a const reference to element i of a vector.
Definition AMReX_SmallMatrix.H:160
__host__ __device__ SmallMatrix< T, NRows, NCols, ORDER, StartIndex > & transposeInPlace()
Transposes a square matrix in-place.
Definition AMReX_SmallMatrix.H:286
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:299
static constexpr __host__ __device__ SmallMatrix< T, NRows, NCols, ORDER, StartIndex > Identity() noexcept
Returns an identity matrix.
Definition AMReX_SmallMatrix.H:227
__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:392
__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:363
__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:352
__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:264
__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:331
__host__ __device__ T * end() noexcept
Definition AMReX_SmallMatrix.H:212
__host__ __device__ T * begin() noexcept
Definition AMReX_SmallMatrix.H:205
__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:381
__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:217
T value_type
Definition AMReX_SmallMatrix.H:37
__host__ __device__ constexpr T const & get() const
Definition AMReX_SmallMatrix.H:428
__host__ __device__ T trace() const
Returns the trace of a square matrix.
Definition AMReX_SmallMatrix.H:321
static constexpr int column_size
Definition AMReX_SmallMatrix.H:40
__host__ __device__ T dot(SmallMatrix< T, NRows, NCols, ORDER, StartIndex > const &rhs) const
Returns the dot product of two vectors.
Definition AMReX_SmallMatrix.H:416
__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:342
__host__ __device__ const T * begin() const noexcept
Definition AMReX_SmallMatrix.H:191
T & reference_type
Definition AMReX_SmallMatrix.H:38
static constexpr __host__ __device__ SmallMatrix< T, NRows, NCols, ORDER, StartIndex > Omega() noexcept
Definition AMReX_SmallMatrix.H:247
__host__ __device__ T sum() const
Returns the sum of all elements in the matrix.
Definition AMReX_SmallMatrix.H:310
__host__ __device__ SmallMatrix< T, NCols, NRows, ORDER, StartIndex > transpose() const
Returns transposed matrix.
Definition AMReX_SmallMatrix.H:272
T type
Definition AMReX_SmallMatrix.H:504