5#include "preconditioner/domain.h"
7#include "common/zip_sort.h"
12 index_t domain::size()
const {
return static_cast<index_t
>(point_indices.size()); }
14 index_t domain::grad_size()
const {
return static_cast<index_t
>(grad_point_indices.size()); }
16 index_t domain::mixed_size()
const {
return size() + grad_size(); }
18 void domain::merge_poly_points(
const std::vector<index_t>& poly_point_idcs) {
19 common::zip_sort(point_indices.begin(), point_indices.end(), inner_point.begin(),
21 [](
const auto& a,
const auto& b) { return a.first < b.first; });
23 auto n_poly_points =
static_cast<index_t
>(poly_point_idcs.size());
24 std::vector<index_t> new_point_indices(poly_point_idcs);
25 std::vector<bool> new_inner_point(n_poly_points);
27 for (index_t i = 0; i < n_poly_points; i++) {
28 auto idx = poly_point_idcs.at(i);
29 auto it = std::lower_bound(point_indices.begin(), point_indices.end(), idx);
30 if (it == point_indices.end() || *it != idx) {
34 auto it_inner = inner_point.begin() + std::distance(point_indices.begin(), it);
35 new_inner_point.at(i) = *it_inner;
37 point_indices.erase(it);
38 inner_point.erase(it_inner);
41 new_point_indices.insert(new_point_indices.end(), point_indices.begin(), point_indices.end());
42 new_inner_point.insert(new_inner_point.end(), inner_point.begin(), inner_point.end());
44 point_indices = new_point_indices;
45 inner_point = new_inner_point;
该命名空间下主要定义了关于krylov子空间方法的预处理相关的类和函数