1#ifndef AMREX_LU_SOLVER_H_
2#define AMREX_LU_SOLVER_H_
3#include <AMReX_Config.H>
14template <
int N,
typename T>
19 static constexpr int size = N;
31 for (
int i = 0; i < N; ++i) {
33 for (
int k = 0; k < i; ++k) {
34 x[i] -= m_mat(i,k) *
x[k];
38 for (
int i = N-1; i >= 0; --i) {
39 for (
int k = i+1; k < N; ++k) {
40 x[i] -= m_mat(i,k) *
x[k];
50 for (
int j = 0; j < N; ++j) {
51 for (
int i = 0; i < N; ++i) {
52 IA(i,j) = (m_piv(i) == j) ? T(1.0) : T(0.0);
53 for (
int k = 0; k < i; ++k) {
54 IA(i,j) -= m_mat(i,k) * IA(k,j);
57 for (
int i = N-1; i >= 0; --i) {
58 for (
int k = i+1; k < N; ++k) {
59 IA(i,j) -= m_mat(i,k) * IA(k,j);
61 IA(i,j) *= m_mat(i,i);
71 for (
int i = 1; i < N; ++i) {
75 return (m_npivs % 2 == 0) ? det : -det;
81 void define_innard ();
88template <
int N,
typename T>
96template <
int N,
typename T>
103template <
int N,
typename T>
107 static_assert(N > 1);
108 static_assert(std::is_floating_point_v<T>);
110 for (
int i = 0; i < N; ++i) { m_piv(i) = i; }
113 for (
int i = 0; i < N; ++i) {
117 for (
int k = i; k < N; ++k) {
118 auto const absA = std::abs(m_mat(k,i));
125 if (maxA < std::numeric_limits<T>::min()) {
131 for (
int j = 0; j < N; ++j) {
137 for (
int j = i+1; j < N; ++j) {
138 m_mat(j,i) /= m_mat(i,i);
139 for (
int k = i+1; k < N; ++k) {
140 m_mat(j,k) -= m_mat(j,i) * m_mat(i,k);
145 for (
int i = 0; i < N; ++i) {
146 m_mat(i,i) = T(1) / m_mat(i,i);
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:119
#define AMREX_RESTRICT
Definition AMReX_Extension.H:32
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
Definition AMReX_LUSolver.H:16
static constexpr int size
Definition AMReX_LUSolver.H:19
__host__ __device__ LUSolver(Array2D< T, 0, N-1, 0, N-1, Order::C > const &a_mat)
Definition AMReX_LUSolver.H:90
__host__ __device__ void operator()(T *__restrict__ x, T const *__restrict__ b) const
Definition AMReX_LUSolver.H:29
void define(Array2D< T, 0, N-1, 0, N-1, Order::C > const &a_mat)
Definition AMReX_LUSolver.H:97
__host__ __device__ Array2D< T, 0, N-1, 0, N-1, Order::C > invert() const
Definition AMReX_LUSolver.H:47
__host__ __device__ T determinant() const
Definition AMReX_LUSolver.H:68
Definition AMReX_Amr.cpp:50
__host__ __device__ void Swap(T &t1, T &t2) noexcept
Definition AMReX_Algorithm.H:94
void Abort(const std::string &msg)
Print out message to cerr and exit via abort().
Definition AMReX.cpp:241
const int[]
Definition AMReX_BLProfiler.cpp:1664
A GPU-compatible one-dimensional array.
Definition AMReX_Array.H:204
A GPU-compatible two-dimensional array.
Definition AMReX_Array.H:357