4#include"interpolation/rbf_direct_evaluator.h"
5#include"numeric/sum_accumulator.h"
8 rbf_direct_evaluator::rbf_direct_evaluator(
const model& model,
const geometry::points3d& source_points
10 : model_(model), dim_(model.poly_dimension()), l_(model.poly_basis_size()),
11 mu_(source_points.rows()), sigma_(source_grad_points.rows()), src_points_(source_points), src_grad_points_(source_grad_points) {
13 p_ = std::make_unique<PolynomialEvaluator>(model.poly_dimension(), model.poly_degree());
17 rbf_direct_evaluator::rbf_direct_evaluator(
const rsmesh::model &model,
const geometry::points3d &source_points) :
18 rbf_direct_evaluator(model, source_points, geometry::
points3d(0, 3)) {
22 valuesd rbf_direct_evaluator::evaluate()
const {
23 auto y_accm = std::vector<numeric::sum_accumulator<double>>(n_fld_points_);
25 auto weights = weights_.head(mu_);
26 auto grad_weights = weights_.segment(mu_, dim_ * sigma_).reshaped<Eigen::RowMajor>(sigma_, dim_);
28 const auto& rbf = model_.rbf();
29 for(index_t i = 0; i < n_fld_points_; i ++) {
30 for(index_t j = 0; j < mu_; j ++) {
31 y_accm.at(i) += weights[j] * rbf.evaluate(fld_points_.row(i) - src_points_.row(j));
33 for(index_t j = 0; j < sigma_; j ++) {
34 y_accm.at(i) += grad_weights.row(j).dot(
35 -rbf.evaluate_gradient(fld_points_.row(i) - src_points_.row(j)).head(dim_)
41 auto poly_val = p_->evaluate();
42 for(index_t i = 0; i < n_fld_points_; i ++) {
43 y_accm.at(i) += poly_val(i);
47 valuesd y(n_fld_points_);
48 for(index_t i = 0; i < n_fld_points_; i ++) {
49 y(i) = y_accm.at(i).get();
54 void rbf_direct_evaluator::set_field_points(
const geometry::points3d &field_points) {
55 n_fld_points_ =
static_cast<index_t
>(field_points.rows());
56 fld_points_ = field_points;
58 p_->set_field_points(fld_points_);