1#ifndef AMREX_LU_SOLVER_H_
2#define AMREX_LU_SOLVER_H_
3#include <AMReX_Config.H>
14template <
int N,
typename T>
29 for (
int i = 0; i < N; ++i) {
31 for (
int k = 0; k < i; ++k) {
36 for (
int i = N-1; i >= 0; --i) {
37 for (
int k = i+1; k < N; ++k) {
48 for (
int j = 0; j < N; ++j) {
49 for (
int i = 0; i < N; ++i) {
50 IA(i,j) = (
m_piv(i) == j) ? T(1.0) : T(0.0);
51 for (
int k = 0; k < i; ++k) {
52 IA(i,j) -=
m_mat(i,k) * IA(k,j);
55 for (
int i = N-1; i >= 0; --i) {
56 for (
int k = i+1; k < N; ++k) {
57 IA(i,j) -=
m_mat(i,k) * IA(k,j);
59 IA(i,j) *=
m_mat(i,i);
69 for (
int i = 1; i < N; ++i) {
73 return (
m_npivs % 2 == 0) ? det : -det;
86template <
int N,
typename T>
94template <
int N,
typename T>
101template <
int N,
typename T>
105 static_assert(N > 1);
106 static_assert(std::is_floating_point_v<T>);
108 for (
int i = 0; i < N; ++i) { m_piv(i) = i; }
111 for (
int i = 0; i < N; ++i) {
115 for (
int k = i; k < N; ++k) {
116 auto const absA = std::abs(m_mat(k,i));
123 if (maxA < std::numeric_limits<T>::min()) {
129 for (
int j = 0; j < N; ++j) {
135 for (
int j = i+1; j < N; ++j) {
136 m_mat(j,i) /= m_mat(i,i);
137 for (
int k = i+1; k < N; ++k) {
138 m_mat(j,k) -= m_mat(j,i) * m_mat(i,k);
143 for (
int i = 0; i < N; ++i) {
144 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:37
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
Definition AMReX_LUSolver.H:16
int m_npivs
Definition AMReX_LUSolver.H:83
Array2D< T, 0, N-1, 0, N-1, Order::C > m_mat
Definition AMReX_LUSolver.H:81
__host__ __device__ LUSolver(Array2D< T, 0, N-1, 0, N-1, Order::C > const &a_mat)
Definition AMReX_LUSolver.H:88
__host__ __device__ void operator()(T *restrict x, T const *restrict b) const
Definition AMReX_LUSolver.H:27
Array1D< int, 0, N-1 > m_piv
Definition AMReX_LUSolver.H:82
void define(Array2D< T, 0, N-1, 0, N-1, Order::C > const &a_mat)
Definition AMReX_LUSolver.H:95
__host__ __device__ void define_innard()
Definition AMReX_LUSolver.H:103
__host__ __device__ Array2D< T, 0, N-1, 0, N-1, Order::C > invert() const
Definition AMReX_LUSolver.H:45
__host__ __device__ T determinant() const
Definition AMReX_LUSolver.H:66
Definition AMReX_Amr.cpp:49
__host__ __device__ void Swap(T &t1, T &t2) noexcept
Definition AMReX_Algorithm.H:75
void Abort(const std::string &msg)
Print out message to cerr and exit via abort().
Definition AMReX.cpp:230
Definition AMReX_Array.H:193
Definition AMReX_Array.H:341