QUGaR 0.0.7
Loading...
Searching...
No Matches
unfitted_domain_kd_tree.hpp
Go to the documentation of this file.
1// --------------------------------------------------------------------------
2//
3// Copyright (C) 2025-present by Pablo Antolin
4//
5// This file is part of the QUGaR library.
6//
7// SPDX-License-Identifier: MIT
8//
9// --------------------------------------------------------------------------
10
11#ifndef QUGAR_UNFITTED_DOMAIN_KD_TREE_HPP
12#define QUGAR_UNFITTED_DOMAIN_KD_TREE_HPP
13
14
21
23
24#include <array>
25#include <cassert>
26#include <cstddef>
27#include <cstdint>
28#include <functional>
29#include <memory>
30#include <vector>
31
32namespace qugar {
33
34enum class ImmersedCellStatus : std::uint8_t {
35 cut,
36 full,
37 empty,
38 unknown,
39};
40
41template<int dim> class UnfittedKDTree : public std::enable_shared_from_this<UnfittedKDTree<dim>>
42{
43 using GridPtr = std::shared_ptr<const CartGridTP<dim>>;
44 using SubGridPtr = std::shared_ptr<const SubCartGridTP<dim>>;
46 using SelfConstPtr = std::shared_ptr<const Self>;
47 using SelfPtr = std::shared_ptr<Self>;
48
49public:
50 explicit UnfittedKDTree(const GridPtr grid);
51 explicit UnfittedKDTree(const SubGridPtr subgrid);
52
53 [[nodiscard]] bool is_leaf() const;
54
55 void set_status(const ImmersedCellStatus &status);
56
57 void branch();
58
59 [[nodiscard]] ImmersedCellStatus get_status() const;
60
61 [[nodiscard]] SubGridPtr get_subgrid() const;
62 [[nodiscard]] GridPtr get_grid() const;
63
64 [[nodiscard]] SelfPtr get_child(int index);
65 [[nodiscard]] SelfConstPtr get_child(int index) const;
66
67 [[nodiscard]] bool is_in_tree(std::int64_t cell_id) const;
68
69 [[nodiscard]] SelfConstPtr find_leaf(std::int64_t cell_id) const;
70
71 void get_leaves(ImmersedCellStatus status, std::vector<SelfConstPtr> &leaves) const;
72
73 void get_cell_ids(ImmersedCellStatus status, std::vector<std::int64_t> &cell_ids) const;
74
75
77 const std::vector<std::int64_t> &target_cell_ids,
78 std::vector<std::int64_t> &cell_ids) const;
79
80 [[nodiscard]] std::size_t get_num_cells(ImmersedCellStatus status) const;
81
82 [[nodiscard]] std::size_t get_num_leaves(ImmersedCellStatus status) const;
83
84 [[nodiscard]] bool is_cell(ImmersedCellStatus status, std::int64_t cell_id) const;
85
86
87private:
90 std::array<std::shared_ptr<UnfittedKDTree<dim>>, 2> children_;
91
92 template<typename Func_0, typename Func_1> void transverse_tree(const Func_0 &func_0, const Func_1 &func_1) const;
93 template<typename Func_0, typename Func_1> std::size_t reduce(const Func_0 &func_0, const Func_1 &func_1) const;
94
95 static std::function<bool(const Self &)> create_leaf_checker(ImmersedCellStatus status);
96};
97
98
99}// namespace qugar
100
101#endif// QUGAR_UNFITTED_DOMAIN_KD_TREE_HPP
Definition of Cartesian grid class.
Definition unfitted_domain_kd_tree.hpp:42
void transverse_tree(const Func_0 &func_0, const Func_1 &func_1) const
ImmersedCellStatus status_
Definition unfitted_domain_kd_tree.hpp:89
std::shared_ptr< const CartGridTP< dim > > GridPtr
Definition unfitted_domain_kd_tree.hpp:43
std::size_t reduce(const Func_0 &func_0, const Func_1 &func_1) const
void get_leaves(ImmersedCellStatus status, std::vector< SelfConstPtr > &leaves) const
std::size_t get_num_leaves(ImmersedCellStatus status) const
void get_cell_ids(ImmersedCellStatus status, const std::vector< std::int64_t > &target_cell_ids, std::vector< std::int64_t > &cell_ids) const
bool is_cell(ImmersedCellStatus status, std::int64_t cell_id) const
UnfittedKDTree(const SubGridPtr subgrid)
SelfConstPtr get_child(int index) const
ImmersedCellStatus get_status() const
bool is_leaf() const
SubGridPtr subgrid_
Definition unfitted_domain_kd_tree.hpp:88
std::shared_ptr< const Self > SelfConstPtr
Definition unfitted_domain_kd_tree.hpp:46
std::size_t get_num_cells(ImmersedCellStatus status) const
std::shared_ptr< Self > SelfPtr
Definition unfitted_domain_kd_tree.hpp:47
std::array< std::shared_ptr< UnfittedKDTree< dim > >, 2 > children_
Definition unfitted_domain_kd_tree.hpp:90
bool is_in_tree(std::int64_t cell_id) const
SelfPtr get_child(int index)
void set_status(const ImmersedCellStatus &status)
static std::function< bool(const Self &)> create_leaf_checker(ImmersedCellStatus status)
void get_cell_ids(ImmersedCellStatus status, std::vector< std::int64_t > &cell_ids) const
SelfConstPtr find_leaf(std::int64_t cell_id) const
std::shared_ptr< const SubCartGridTP< dim > > SubGridPtr
Definition unfitted_domain_kd_tree.hpp:44
GridPtr get_grid() const
SubGridPtr get_subgrid() const
UnfittedKDTree(const GridPtr grid)
QUGaR's main namespace.
Definition affine_transf.hpp:28
@ cut
Definition cut_quadrature.hpp:34
@ empty
Definition cut_quadrature.hpp:34
@ full
Definition cut_quadrature.hpp:34
ImmersedCellStatus
Definition unfitted_domain_kd_tree.hpp:34
std::ptrdiff_t index
Definition types.hpp:19