4 #include <Omega_h_matrix.hpp>
18 template <Int max_m, Int max_n>
19 OMEGA_H_INLINE Vector<max_m> householder_vector(
20 Int m, Matrix<max_m, max_n> a, Int k) {
22 for (Int i = k; i < m; ++i) norm_x += square(a[k][i]);
23 norm_x = std::sqrt(norm_x);
32 OMEGA_H_CHECK(norm_x > 0.0);
34 for (Int i = k; i < m; ++i) v_k[i] = a[k][i];
35 v_k[k] += sign(a[k][k]) * norm_x;
37 for (Int i = k; i < m; ++i) norm_v_k += square(v_k[i]);
38 norm_v_k = std::sqrt(norm_v_k);
39 for (Int i = k; i < m; ++i) v_k[i] /= norm_v_k;
43 template <Int max_m, Int max_n>
44 OMEGA_H_INLINE
void reflect_columns(
45 Int m, Int n, Matrix<max_m, max_n>& a, Vector<max_m> v_k, Int k) {
46 for (Int j = k; j < n; ++j) {
48 for (Int i = k; i < m; ++i) dot += a[j][i] * v_k[i];
49 for (Int i = k; i < m; ++i) a[j][i] -= 2.0 * dot * v_k[i];
53 template <Int max_m, Int max_n>
59 template <Int max_m, Int max_n>
63 for (Int k = 0; k < n; ++k) {
64 v[k] = householder_vector(m, a, k);
65 reflect_columns(m, n, a, v[k], k);
67 auto r = reduced_r_from_full(n, a);
77 template <Int max_m, Int max_n>
78 OMEGA_H_INLINE Vector<max_n> implicit_q_trans_b(
79 Int m, Int n, Few<Vector<max_m>, max_n> v, Vector<max_m> b) {
80 for (Int k = 0; k < n; ++k) {
82 for (Int i = k; i < m; ++i) dot += v[k][i] * b[i];
83 for (Int i = k; i < m; ++i) b[i] -= 2.0 * dot * v[k][i];
85 Vector<max_n> qtb = zero_vector<max_n>();
86 for (Int i = 0; i < n; ++i) qtb[i] = b[i];
96 template <Int max_m, Int max_n>
97 OMEGA_H_INLINE
void implicit_q_x(
98 Int m, Int n, Vector<max_m>& x, Few<Vector<max_m>, max_n> v) {
99 for (Int k2 = 0; k2 < n; ++k2) {
102 for (Int i = k; i < m; ++i) dot += v[k][i] * x[i];
103 for (Int i = k; i < m; ++i) x[i] -= 2 * dot * v[k][i];
107 template <Int max_m, Int max_n>
108 OMEGA_H_INLINE Tensor<max_n> reduced_r_from_full(
109 Int n, Matrix<max_m, max_n> fr) {
111 for (Int j = 0; j < n; ++j)
112 for (Int i = 0; i < n; ++i) rr[j][i] = fr[j][i];
117 OMEGA_H_INLINE Vector<max_m> solve_upper_triangular(
118 Int m, Tensor<max_m> a, Vector<max_m> b) {
120 for (Int ii = 0; ii < m; ++ii) {
123 for (Int j = i + 1; j < m; ++j) x[i] -= a[j][i] * x[j];
136 template <Int max_m, Int max_n>
137 OMEGA_H_INLINE Vector<max_n> solve_using_qr(
138 Int m, Int n, Matrix<max_m, max_n> a, Vector<max_m> b) {
139 auto qr = factorize_qr_householder(m, n, a);
140 auto qtb = implicit_q_trans_b(m, n, qr.v, b);
141 auto x = solve_upper_triangular(n, qr.r, qtb);
144 template <Int max_m, Int max_n>
145 OMEGA_H_INLINE Vector<max_n> solve_using_qr(
146 Matrix<max_m, max_n> a, Vector<max_m> b) {
147 return solve_using_qr(max_m, max_n, a, b);
Definition: Omega_h_few.hpp:61
Definition: amr_mpi_test.cpp:6
Definition: Omega_h_qr.hpp:54