QUGaR 0.0.9
Loading...
Searching...
No Matches
unfitted_domain.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_HPP
12#define QUGAR_UNFITTED_DOMAIN_HPP
13
14
21
24
25#include <array>
26#include <cassert>
27#include <cstddef>
28#include <cstdint>
29#include <functional>
30#include <memory>
31#include <unordered_map>
32#include <vector>
33
34namespace qugar {
35
49
50template<int dim> class UnfittedDomain
51{
52public:
53 static const int n_facets_per_cell = dim * 2;
54 using FacetsStatus = std::array<ImmersedFacetStatus, n_facets_per_cell>;
55 using GridPtr = std::shared_ptr<const CartGridTP<dim>>;
56 using BinarySpacePartPtr = std::shared_ptr<UnfittedBinarySpacePart<dim>>;
57
58protected:
59 explicit UnfittedDomain(const GridPtr &grid);
60
61public:
62 virtual ~UnfittedDomain() = default;
63
65 UnfittedDomain(const UnfittedDomain &other) = default;
66
68 UnfittedDomain &operator=(const UnfittedDomain &other) = default;
69
71 UnfittedDomain(UnfittedDomain &&other) noexcept = default;
72
74 UnfittedDomain &operator=(UnfittedDomain &&other) noexcept = default;
75
76 [[nodiscard]] GridPtr get_grid() const;
77
78 [[nodiscard]] bool is_exterior_facet(std::int64_t cell_id, int local_facet_id) const;
79
80 [[nodiscard]] std::size_t get_num_total_cells() const;
81 [[nodiscard]] std::size_t get_num_full_cells() const;
82 [[nodiscard]] std::size_t get_num_empty_cells() const;
83 [[nodiscard]] std::size_t get_num_cut_cells() const;
84 [[nodiscard]] bool has_facets_with_unf_bdry() const;
85
86 void get_full_cells(std::vector<std::int64_t> &cell_ids) const;
87 void get_empty_cells(std::vector<std::int64_t> &cell_ids) const;
88 void get_cut_cells(std::vector<std::int64_t> &cell_ids) const;
89
90 void get_full_cells(const std::vector<std::int64_t> &target_cell_ids, std::vector<std::int64_t> &cell_ids) const;
91 void get_empty_cells(const std::vector<std::int64_t> &target_cell_ids, std::vector<std::int64_t> &cell_ids) const;
92 void get_cut_cells(const std::vector<std::int64_t> &target_cell_ids, std::vector<std::int64_t> &cell_ids) const;
93
94 void get_empty_facets(std::vector<std::int64_t> &cell_ids, std::vector<int> &local_facets_ids) const;
95 void get_full_facets(std::vector<std::int64_t> &cell_ids, std::vector<int> &local_facets_ids) const;
96 void get_unfitted_facets(std::vector<std::int64_t> &cell_ids, std::vector<int> &local_facets_ids) const;
97 void get_full_unfitted_facets(std::vector<std::int64_t> &cell_ids, std::vector<int> &local_facets_ids) const;
98 void get_cut_facets(std::vector<std::int64_t> &cell_ids, std::vector<int> &local_facets_ids) const;
99
100 void get_empty_facets(const std::vector<std::int64_t> &target_cell_ids,
101 const std::vector<int> &target_local_facets_ids,
102 std::vector<std::int64_t> &cell_ids,
103 std::vector<int> &local_facets_ids) const;
104 void get_full_facets(const std::vector<std::int64_t> &target_cell_ids,
105 const std::vector<int> &target_local_facets_ids,
106 std::vector<std::int64_t> &cell_ids,
107 std::vector<int> &local_facets_ids) const;
108 void get_unfitted_facets(const std::vector<std::int64_t> &target_cell_ids,
109 const std::vector<int> &target_local_facets_ids,
110 std::vector<std::int64_t> &cell_ids,
111 std::vector<int> &local_facets_ids) const;
112 void get_full_unfitted_facets(const std::vector<std::int64_t> &target_cell_ids,
113 const std::vector<int> &target_local_facets_ids,
114 std::vector<std::int64_t> &cell_ids,
115 std::vector<int> &local_facets_ids) const;
116 void get_cut_facets(const std::vector<std::int64_t> &target_cell_ids,
117 const std::vector<int> &target_local_facets_ids,
118 std::vector<std::int64_t> &cell_ids,
119 std::vector<int> &local_facets_ids) const;
120
121 [[nodiscard]] bool is_full_cell(std::int64_t cell_id) const;
122 [[nodiscard]] bool is_empty_cell(std::int64_t cell_id) const;
123 [[nodiscard]] bool is_cut_cell(std::int64_t cell_id) const;
124 [[nodiscard]] bool is_full_with_unf_bdry_cell(std::int64_t cell_id) const;
125
126 // Full unfitted facets are not considered full.
127 [[nodiscard]] bool is_full_facet(std::int64_t cell_id, int local_facet_id) const;
128 [[nodiscard]] bool is_empty_facet(std::int64_t cell_id, int local_facet_id) const;
129 [[nodiscard]] bool is_cut_facet(std::int64_t cell_id, int local_facet_id) const;
130 [[nodiscard]] bool is_full_unfitted_facet(std::int64_t cell_id, int local_facet_id) const;
131 [[nodiscard]] bool is_cell_with_unf_bdry(std::int64_t cell_id) const;
132
133 [[nodiscard]] bool has_unfitted_boundary(std::int64_t cell_id, int local_facet_id) const;
134 [[nodiscard]] bool has_external_boundary(std::int64_t cell_id, int local_facet_id) const;
135
136 // Full unfitted facets are not considered full.
137 [[nodiscard]] static bool is_full_facet(ImmersedFacetStatus status);
138
139 [[nodiscard]] static bool is_empty_facet(ImmersedFacetStatus status);
140 [[nodiscard]] static bool is_cut_facet(ImmersedFacetStatus status);
141 [[nodiscard]] static bool is_full_unfitted_facet(ImmersedFacetStatus status);
142
143 [[nodiscard]] static bool has_unfitted_boundary(ImmersedFacetStatus status);
144 [[nodiscard]] static bool has_external_boundary(ImmersedFacetStatus status);
145
146protected:
149
150 std::unordered_map<std::int64_t, FacetsStatus> facets_status_;
151 std::vector<std::int64_t> full_cells_with_unf_bdry_;
152
153private:
154 static void get_facets_target(const std::vector<std::int64_t> &target_cell_ids,
155 const std::vector<int> &target_local_facets_ids,
156 std::vector<std::int64_t> &cell_ids,
157 std::vector<int> &local_facets_ids,
158 const std::function<bool(std::int64_t, int)> &func);
159
160protected:
162};
163
164
165}// namespace qugar
166
167#endif// QUGAR_UNFITTED_DOMAIN_HPP
Definition of Cartesian grid class.
Definition unfitted_domain.hpp:51
void get_cut_cells(std::vector< std::int64_t > &cell_ids) const
virtual ~UnfittedDomain()=default
std::size_t get_num_empty_cells() const
std::size_t get_num_total_cells() const
bool has_facets_with_unf_bdry() const
std::shared_ptr< UnfittedBinarySpacePart< dim > > BinarySpacePartPtr
Definition unfitted_domain.hpp:56
GridPtr grid_
Definition unfitted_domain.hpp:147
GridPtr get_grid() const
void init_full_cells_with_unf_bdry()
void get_cut_cells(const std::vector< std::int64_t > &target_cell_ids, std::vector< std::int64_t > &cell_ids) const
void get_full_cells(const std::vector< std::int64_t > &target_cell_ids, std::vector< std::int64_t > &cell_ids) const
bool is_empty_facet(std::int64_t cell_id, int local_facet_id) const
UnfittedDomain & operator=(UnfittedDomain &&other) noexcept=default
Move assignment operator.
std::unordered_map< std::int64_t, FacetsStatus > facets_status_
Definition unfitted_domain.hpp:150
static void get_facets_target(const std::vector< std::int64_t > &target_cell_ids, const std::vector< int > &target_local_facets_ids, std::vector< std::int64_t > &cell_ids, std::vector< int > &local_facets_ids, const std::function< bool(std::int64_t, int)> &func)
bool is_cut_cell(std::int64_t cell_id) const
std::vector< std::int64_t > full_cells_with_unf_bdry_
Definition unfitted_domain.hpp:151
bool is_full_unfitted_facet(std::int64_t cell_id, int local_facet_id) const
static bool is_full_facet(ImmersedFacetStatus status)
static bool is_empty_facet(ImmersedFacetStatus status)
UnfittedDomain(const GridPtr &grid)
void get_empty_facets(const std::vector< std::int64_t > &target_cell_ids, const std::vector< int > &target_local_facets_ids, std::vector< std::int64_t > &cell_ids, std::vector< int > &local_facets_ids) const
void get_full_cells(std::vector< std::int64_t > &cell_ids) const
void get_full_unfitted_facets(const std::vector< std::int64_t > &target_cell_ids, const std::vector< int > &target_local_facets_ids, std::vector< std::int64_t > &cell_ids, std::vector< int > &local_facets_ids) const
void get_empty_facets(std::vector< std::int64_t > &cell_ids, std::vector< int > &local_facets_ids) const
bool is_full_facet(std::int64_t cell_id, int local_facet_id) const
std::size_t get_num_full_cells() const
void get_full_unfitted_facets(std::vector< std::int64_t > &cell_ids, std::vector< int > &local_facets_ids) const
bool is_exterior_facet(std::int64_t cell_id, int local_facet_id) const
static bool has_external_boundary(ImmersedFacetStatus status)
void get_cut_facets(std::vector< std::int64_t > &cell_ids, std::vector< int > &local_facets_ids) const
UnfittedDomain(const UnfittedDomain &other)=default
Copy constructor.
std::array< ImmersedFacetStatus, n_facets_per_cell > FacetsStatus
Definition unfitted_domain.hpp:54
UnfittedDomain(UnfittedDomain &&other) noexcept=default
Move constructor.
static bool has_unfitted_boundary(ImmersedFacetStatus status)
bool has_external_boundary(std::int64_t cell_id, int local_facet_id) const
static bool is_cut_facet(ImmersedFacetStatus status)
void get_cut_facets(const std::vector< std::int64_t > &target_cell_ids, const std::vector< int > &target_local_facets_ids, std::vector< std::int64_t > &cell_ids, std::vector< int > &local_facets_ids) const
void get_empty_cells(const std::vector< std::int64_t > &target_cell_ids, std::vector< std::int64_t > &cell_ids) const
bool is_empty_cell(std::int64_t cell_id) const
bool is_full_with_unf_bdry_cell(std::int64_t cell_id) const
void get_full_facets(const std::vector< std::int64_t > &target_cell_ids, const std::vector< int > &target_local_facets_ids, std::vector< std::int64_t > &cell_ids, std::vector< int > &local_facets_ids) const
std::size_t get_num_cut_cells() const
static bool is_full_unfitted_facet(ImmersedFacetStatus status)
void get_full_facets(std::vector< std::int64_t > &cell_ids, std::vector< int > &local_facets_ids) const
BinarySpacePartPtr binary_sp_part_
Definition unfitted_domain.hpp:148
bool is_full_cell(std::int64_t cell_id) const
void get_unfitted_facets(std::vector< std::int64_t > &cell_ids, std::vector< int > &local_facets_ids) const
bool is_cell_with_unf_bdry(std::int64_t cell_id) const
bool is_cut_facet(std::int64_t cell_id, int local_facet_id) const
void get_empty_cells(std::vector< std::int64_t > &cell_ids) const
void get_unfitted_facets(const std::vector< std::int64_t > &target_cell_ids, const std::vector< int > &target_local_facets_ids, std::vector< std::int64_t > &cell_ids, std::vector< int > &local_facets_ids) const
std::shared_ptr< const CartGridTP< dim > > GridPtr
Definition unfitted_domain.hpp:55
static const int n_facets_per_cell
Definition unfitted_domain.hpp:53
UnfittedDomain & operator=(const UnfittedDomain &other)=default
Copy assignment operator.
bool has_unfitted_boundary(std::int64_t cell_id, int local_facet_id) const
QUGaR's main namespace.
Definition affine_transf.hpp:28
ImmersedFacetStatus
Definition unfitted_domain.hpp:36
@ cut
Definition cut_quadrature.hpp:34
@ empty
Definition cut_quadrature.hpp:34
@ full
Definition cut_quadrature.hpp:34
Declaration of of UnfittedDomain class.