14 #include "ParallelAlgorithms/LinearSolver/Schwarz/OverlapHelpers.hpp"
28 template <
size_t Dim,
typename TagsList>
30 static constexpr
size_t volume_dim = Dim;
31 using ElementData = Variables<TagsList>;
32 using OverlapData = ElementData;
45 const size_t element_num_points) noexcept
46 : element_data{element_num_points} {}
48 template <
typename UsedForSizeTagsList>
49 void destructive_resize(
51 used_for_size) noexcept {
52 if (
UNLIKELY(element_data.number_of_grid_points() !=
53 used_for_size.element_data.number_of_grid_points())) {
54 element_data.initialize(
55 used_for_size.element_data.number_of_grid_points());
57 for (
const auto& [overlap_id, used_for_overlap_size] :
58 used_for_size.overlap_data) {
59 if (
UNLIKELY(overlap_data[overlap_id].number_of_grid_points() !=
60 used_for_overlap_size.number_of_grid_points())) {
61 overlap_data[overlap_id].initialize(
62 used_for_overlap_size.number_of_grid_points());
68 Variables<TagsList> local_element_data,
69 OverlapMap<Dim, Variables<TagsList>> local_overlap_data) noexcept
70 : element_data{std::move(local_element_data)},
71 overlap_data{std::move(local_overlap_data)} {}
73 void pup(PUP::er& p) noexcept {
78 template <
typename RhsTagsList>
81 element_data += rhs.element_data;
82 for (
auto& [overlap_id, data] : overlap_data) {
83 data += rhs.overlap_data.at(overlap_id);
88 template <
typename RhsTagsList>
91 element_data -= rhs.element_data;
92 for (
auto& [overlap_id, data] : overlap_data) {
93 data -= rhs.overlap_data.at(overlap_id);
99 element_data *= scalar;
100 for (
auto& [overlap_id, data] : overlap_data) {
109 element_data /= scalar;
110 for (
auto& [overlap_id, data] : overlap_data) {
118 ElementData element_data{};
122 template <
size_t Dim,
typename LhsTagsList,
typename RhsTagsList>
123 decltype(
auto) operator+(
130 template <
size_t Dim,
typename LhsTagsList,
typename RhsTagsList>
131 decltype(
auto) operator-(
132 ElementCenteredSubdomainData<Dim, LhsTagsList> lhs,
133 const ElementCenteredSubdomainData<Dim, RhsTagsList>& rhs) noexcept {
138 template <
size_t Dim,
typename TagsList>
139 decltype(
auto) operator*(
141 ElementCenteredSubdomainData<Dim, TagsList> data) noexcept {
146 template <
size_t Dim,
typename TagsList>
147 decltype(
auto) operator*(ElementCenteredSubdomainData<Dim, TagsList> data,
148 const
double scalar) noexcept {
153 template <
size_t Dim,
typename TagsList>
154 decltype(
auto) operator/(ElementCenteredSubdomainData<Dim, TagsList> data,
155 const
double scalar) noexcept {
160 template <
size_t Dim,
typename TagsList>
162 const ElementCenteredSubdomainData<Dim, TagsList>&
163 subdomain_data) noexcept {
164 os <<
"Element data:\n"
165 << subdomain_data.element_data <<
"\nOverlap data:\n"
166 << subdomain_data.overlap_data;
170 template <
size_t Dim,
typename TagsList>
172 const ElementCenteredSubdomainData<Dim, TagsList>& lhs,
173 const ElementCenteredSubdomainData<Dim, TagsList>& rhs) noexcept {
174 return lhs.element_data == rhs.element_data and
175 lhs.overlap_data == rhs.overlap_data;
178 template <
size_t Dim,
typename TagsList>
180 const ElementCenteredSubdomainData<Dim, TagsList>& lhs,
181 const ElementCenteredSubdomainData<Dim, TagsList>& rhs) noexcept {
182 return not(lhs == rhs);
189 template <
size_t Dim,
typename LhsTagsList,
typename RhsTagsList>
191 Schwarz::ElementCenteredSubdomainData<Dim, LhsTagsList>,
197 double result =
inner_product(lhs.element_data, rhs.element_data);
198 for (
const auto& [overlap_id, lhs_data] : lhs.overlap_data) {
199 result +=
inner_product(lhs_data, rhs.overlap_data.at(overlap_id));
209 template <
size_t Dim,
typename TagsListOut,
typename TagsListIn>
211 LinearSolver::Schwarz::ElementCenteredSubdomainData<Dim, TagsListOut>,
220 output.element_data =
221 make_with_value<typename SubdomainDataOut::ElementData>(
222 input.element_data, value);
223 for (
const auto& [overlap_id, input_data] : input.overlap_data) {
224 output.overlap_data.emplace(
225 overlap_id, make_with_value<typename SubdomainDataOut::OverlapData>(