17 #include "Omega_h_adj.hpp"
18 #include "Omega_h_qr.hpp"
19 #include "Omega_h_simplex.hpp"
36 get_cavity_qr_factorization(LO k,
LOs const& k2ke,
LOs const& ke2e,
37 LOs const& ev2v,
Reals const& coords) {
41 auto end = k2ke[k + 1];
42 auto nfit_pts = end - begin;
43 OMEGA_H_CHECK(nfit_pts >= dim + 1);
44 OMEGA_H_CHECK(nfit_pts <= max_fit_pts);
45 for (
auto i = 0; i < nfit_pts; ++i) {
48 auto eev2v = gather_verts<dim + 1>(ev2v, e);
49 auto eev2x = gather_vectors<dim + 1, dim>(coords, eev2v);
50 auto centroid = average(eev2x);
51 vandermonde[0][i] = 1.0;
52 for (Int j = 0; j < dim; ++j) {
53 vandermonde[1 + j][i] = centroid[j];
56 auto qr = factorize_qr_householder(nfit_pts, dim + 1, vandermonde);
60 for (
int k = 0; k < dim + 1; ++k) {
61 for (
int i = k; i < nfit_pts; ++i) {
62 assert(!isnan(qr.v[k][i]));
79 OMEGA_H_DEVICE Vector<dim + 1> fit_cavity_polynomial(
80 QRFactorization<MaxFitPoints<dim>::value, dim + 1> qr, LO k,
81 LOs
const& k2ke, LOs
const& ke2e, Reals
const& e_data, Int comp,
83 constexpr
auto max_fit_pts = MaxFitPoints<dim>::value;
85 auto end = k2ke[k + 1];
86 auto nfit_pts = end - begin;
87 OMEGA_H_CHECK(nfit_pts >= dim + 1);
88 OMEGA_H_CHECK(nfit_pts <= max_fit_pts);
89 Vector<max_fit_pts> b;
90 for (
auto i = 0; i < nfit_pts; ++i) {
93 b[i] = e_data[e * ncomps + comp];
95 for (
auto i = nfit_pts; i < max_fit_pts; ++i) {
98 auto qtb = implicit_q_trans_b(nfit_pts, dim + 1, qr.v, b);
99 auto coeffs = solve_upper_triangular(dim + 1, qr.r, qtb);
104 OMEGA_H_DEVICE Real eval_polynomial(Vector<dim + 1> coeffs, Vector<dim> x) {
105 auto val = coeffs[0];
106 for (Int j = 0; j < dim; ++j) val += coeffs[1 + j] * x[j];
Definition: Omega_h_matrix.hpp:34
Definition: amr_mpi_test.cpp:6
Definition: Omega_h_fit.hpp:24
Definition: Omega_h_qr.hpp:54
Definition: Omega_h_simplex.hpp:347