deal.II version GIT relicensing-6834-g5b78e6bcdf 2026-10-01 11:20:01+00:00
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
Loading...
Searching...
No Matches
vector_data_exchange.h
Go to the documentation of this file.
1// -----------------------------------------------------------------------------
2//
3// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception OR LGPL-2.1-or-later
4// Copyright (C) 2020 - 2023 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Detailed license information governing the source code and contributions
9// can be found in LICENSE.md and CONTRIBUTING.md at the top level directory.
10//
11// -----------------------------------------------------------------------------
12
13
14#ifndef dealii_matrix_free_vector_data_exchange_h
15#define dealii_matrix_free_vector_data_exchange_h
16
17
18#include <deal.II/base/config.h>
19
23
25
26#include <memory>
27
29
30namespace internal
31{
32 namespace MatrixFreeFunctions
33 {
38 namespace VectorDataExchange
39 {
43 class Base
44 {
45 public:
46 virtual ~Base() = default;
47
48 virtual unsigned int
49 locally_owned_size() const = 0;
50
51 virtual unsigned int
52 n_ghost_indices() const = 0;
53
54 virtual unsigned int
55 n_import_indices() const = 0;
56
57 virtual unsigned int
58 n_import_sm_procs() const = 0;
59
61 size() const = 0;
62
63 virtual void
65 const unsigned int communication_channel,
66 const ArrayView<const double> &locally_owned_array,
67 const std::vector<ArrayView<const double>> &shared_arrays,
68 const ArrayView<double> &ghost_array,
69 const ArrayView<double> &temporary_storage,
70 std::vector<MPI_Request> &requests) const = 0;
71
72 virtual void
74 const ArrayView<const double> &locally_owned_array,
75 const std::vector<ArrayView<const double>> &shared_arrays,
76 const ArrayView<double> &ghost_array,
77 std::vector<MPI_Request> &requests) const = 0;
78
79 virtual void
81 const VectorOperation::values vector_operation,
82 const unsigned int communication_channel,
83 const ArrayView<const double> &locally_owned_array,
84 const std::vector<ArrayView<const double>> &shared_arrays,
85 const ArrayView<double> &ghost_array,
86 const ArrayView<double> &temporary_storage,
87 std::vector<MPI_Request> &requests) const = 0;
88
89 virtual void
91 const VectorOperation::values vector_operation,
92 const ArrayView<double> &locally_owned_storage,
93 const std::vector<ArrayView<const double>> &shared_arrays,
94 const ArrayView<double> &ghost_array,
95 const ArrayView<const double> &temporary_storage,
96 std::vector<MPI_Request> &requests) const = 0;
97
98 virtual void
99 reset_ghost_values(const ArrayView<double> &ghost_array) const = 0;
100
101 virtual void
103 const unsigned int communication_channel,
104 const ArrayView<const float> &locally_owned_array,
105 const std::vector<ArrayView<const float>> &shared_arrays,
106 const ArrayView<float> &ghost_array,
107 const ArrayView<float> &temporary_storage,
108 std::vector<MPI_Request> &requests) const = 0;
109
110 virtual void
112 const ArrayView<const float> &locally_owned_array,
113 const std::vector<ArrayView<const float>> &shared_arrays,
114 const ArrayView<float> &ghost_array,
115 std::vector<MPI_Request> &requests) const = 0;
116
117 virtual void
119 const VectorOperation::values vector_operation,
120 const unsigned int communication_channel,
121 const ArrayView<const float> &locally_owned_array,
122 const std::vector<ArrayView<const float>> &shared_arrays,
123 const ArrayView<float> &ghost_array,
124 const ArrayView<float> &temporary_storage,
125 std::vector<MPI_Request> &requests) const = 0;
126
127 virtual void
129 const VectorOperation::values vector_operation,
130 const ArrayView<float> &locally_owned_storage,
131 const std::vector<ArrayView<const float>> &shared_arrays,
132 const ArrayView<float> &ghost_array,
133 const ArrayView<const float> &temporary_storage,
134 std::vector<MPI_Request> &requests) const = 0;
135
136 virtual void
137 reset_ghost_values(const ArrayView<float> &ghost_array) const = 0;
138 };
139
140
145 {
146 public:
148 const std::shared_ptr<const Utilities::MPI::Partitioner>
149 &partitioner);
150
151 virtual ~PartitionerWrapper() = default;
152
153 unsigned int
154 locally_owned_size() const override;
155
156 unsigned int
157 n_ghost_indices() const override;
158
159 unsigned int
160 n_import_indices() const override;
161
162 unsigned int
163 n_import_sm_procs() const override;
164
166 size() const override;
167
168 void
170 const unsigned int communication_channel,
171 const ArrayView<const double> &locally_owned_array,
172 const std::vector<ArrayView<const double>> &shared_arrays,
173 const ArrayView<double> &ghost_array,
174 const ArrayView<double> &temporary_storage,
175 std::vector<MPI_Request> &requests) const override;
176
177 void
179 const ArrayView<const double> &locally_owned_array,
180 const std::vector<ArrayView<const double>> &shared_arrays,
181 const ArrayView<double> &ghost_array,
182 std::vector<MPI_Request> &requests) const override;
183
184 void
186 const VectorOperation::values vector_operation,
187 const unsigned int communication_channel,
188 const ArrayView<const double> &locally_owned_array,
189 const std::vector<ArrayView<const double>> &shared_arrays,
190 const ArrayView<double> &ghost_array,
191 const ArrayView<double> &temporary_storage,
192 std::vector<MPI_Request> &requests) const override;
193
194 void
196 const VectorOperation::values vector_operation,
197 const ArrayView<double> &locally_owned_storage,
198 const std::vector<ArrayView<const double>> &shared_arrays,
199 const ArrayView<double> &ghost_array,
200 const ArrayView<const double> &temporary_storage,
201 std::vector<MPI_Request> &requests) const override;
202
203 void
204 reset_ghost_values(const ArrayView<double> &ghost_array) const override;
205
206 void
208 const unsigned int communication_channel,
209 const ArrayView<const float> &locally_owned_array,
210 const std::vector<ArrayView<const float>> &shared_arrays,
211 const ArrayView<float> &ghost_array,
212 const ArrayView<float> &temporary_storage,
213 std::vector<MPI_Request> &requests) const override;
214
215 void
217 const ArrayView<const float> &locally_owned_array,
218 const std::vector<ArrayView<const float>> &shared_arrays,
219 const ArrayView<float> &ghost_array,
220 std::vector<MPI_Request> &requests) const override;
221
222 void
224 const VectorOperation::values vector_operation,
225 const unsigned int communication_channel,
226 const ArrayView<const float> &locally_owned_array,
227 const std::vector<ArrayView<const float>> &shared_arrays,
228 const ArrayView<float> &ghost_array,
229 const ArrayView<float> &temporary_storage,
230 std::vector<MPI_Request> &requests) const override;
231
232 void
234 const VectorOperation::values vector_operation,
235 const ArrayView<float> &locally_owned_storage,
236 const std::vector<ArrayView<const float>> &shared_arrays,
237 const ArrayView<float> &ghost_array,
238 const ArrayView<const float> &temporary_storage,
239 std::vector<MPI_Request> &requests) const override;
240
241 void
242 reset_ghost_values(const ArrayView<float> &ghost_array) const override;
243
244 private:
245 template <typename Number>
246 void
247 reset_ghost_values_impl(const ArrayView<Number> &ghost_array) const;
248
249 const std::shared_ptr<const Utilities::MPI::Partitioner> partitioner;
250 };
251
252
253
259 class Full : public Base
260 {
261 public:
262 Full(
263 const std::shared_ptr<const Utilities::MPI::Partitioner> &partitioner,
264 const MPI_Comm communicator_sm);
265
266 unsigned int
267 locally_owned_size() const override;
268
269 unsigned int
270 n_ghost_indices() const override;
271
272 unsigned int
273 n_import_indices() const override;
274
275 virtual unsigned int
276 n_import_sm_procs() const override;
277
279 size() const override;
280
283
284 void
286 const unsigned int communication_channel,
287 const ArrayView<const double> &locally_owned_array,
288 const std::vector<ArrayView<const double>> &shared_arrays,
289 const ArrayView<double> &ghost_array,
290 const ArrayView<double> &temporary_storage,
291 std::vector<MPI_Request> &requests) const override;
292
293 void
295 const ArrayView<const double> &locally_owned_array,
296 const std::vector<ArrayView<const double>> &shared_arrays,
297 const ArrayView<double> &ghost_array,
298 std::vector<MPI_Request> &requests) const override;
299
300 void
302 const VectorOperation::values vector_operation,
303 const unsigned int communication_channel,
304 const ArrayView<const double> &locally_owned_array,
305 const std::vector<ArrayView<const double>> &shared_arrays,
306 const ArrayView<double> &ghost_array,
307 const ArrayView<double> &temporary_storage,
308 std::vector<MPI_Request> &requests) const override;
309
310 void
312 const VectorOperation::values vector_operation,
313 const ArrayView<double> &locally_owned_storage,
314 const std::vector<ArrayView<const double>> &shared_arrays,
315 const ArrayView<double> &ghost_array,
316 const ArrayView<const double> &temporary_storage,
317 std::vector<MPI_Request> &requests) const override;
318
319 void
320 reset_ghost_values(const ArrayView<double> &ghost_array) const override;
321
322 void
324 const unsigned int communication_channel,
325 const ArrayView<const float> &locally_owned_array,
326 const std::vector<ArrayView<const float>> &shared_arrays,
327 const ArrayView<float> &ghost_array,
328 const ArrayView<float> &temporary_storage,
329 std::vector<MPI_Request> &requests) const override;
330
331 void
333 const ArrayView<const float> &locally_owned_array,
334 const std::vector<ArrayView<const float>> &shared_arrays,
335 const ArrayView<float> &ghost_array,
336 std::vector<MPI_Request> &requests) const override;
337
338 void
340 const VectorOperation::values vector_operation,
341 const unsigned int communication_channel,
342 const ArrayView<const float> &locally_owned_array,
343 const std::vector<ArrayView<const float>> &shared_arrays,
344 const ArrayView<float> &ghost_array,
345 const ArrayView<float> &temporary_storage,
346 std::vector<MPI_Request> &requests) const override;
347
348 void
350 const VectorOperation::values vector_operation,
351 const ArrayView<float> &locally_owned_storage,
352 const std::vector<ArrayView<const float>> &shared_arrays,
353 const ArrayView<float> &ghost_array,
354 const ArrayView<const float> &temporary_storage,
355 std::vector<MPI_Request> &requests) const override;
356
357 void
358 reset_ghost_values(const ArrayView<float> &ghost_array) const override;
359
360 private:
361 template <typename Number>
362 void
364 const unsigned int communication_channel,
365 const ArrayView<const Number> &locally_owned_array,
366 const std::vector<ArrayView<const Number>> &shared_arrays,
367 const ArrayView<Number> &ghost_array,
368 const ArrayView<Number> &temporary_storage,
369 std::vector<MPI_Request> &requests) const;
370
371 template <typename Number>
372 void
374 const ArrayView<const Number> &locally_owned_array,
375 const std::vector<ArrayView<const Number>> &shared_arrays,
376 const ArrayView<Number> &ghost_array,
377 std::vector<MPI_Request> &requests) const;
378
379 template <typename Number>
380 void
382 const VectorOperation::values vector_operation,
383 const unsigned int communication_channel,
384 const ArrayView<const Number> &locally_owned_array,
385 const std::vector<ArrayView<const Number>> &shared_arrays,
386 const ArrayView<Number> &ghost_array,
387 const ArrayView<Number> &temporary_storage,
388 std::vector<MPI_Request> &requests) const;
389
390 template <typename Number>
391 void
393 const VectorOperation::values vector_operation,
394 const ArrayView<Number> &locally_owned_storage,
395 const std::vector<ArrayView<const Number>> &shared_arrays,
396 const ArrayView<Number> &ghost_array,
397 const ArrayView<const Number> &temporary_storage,
398 std::vector<MPI_Request> &requests) const;
399
400 template <typename Number>
401 void
402 reset_ghost_values_impl(const ArrayView<Number> &ghost_array) const;
403
404 private:
409
414
418 const unsigned int n_local_elements;
419
423 const unsigned int n_ghost_elements;
424
429
435
440 std::pair<std::vector<unsigned int>,
441 std::vector<std::pair<unsigned int, unsigned int>>>
443
448 std::vector<std::array<unsigned int, 3>> ghost_targets_data;
449
456 std::vector<std::array<unsigned int, 3>> import_targets_data;
457
466 std::pair<std::vector<unsigned int>,
467 std::vector<std::pair<unsigned int, unsigned int>>>
469
474 std::vector<unsigned int> sm_ghost_ranks;
475
480 std::pair<std::vector<unsigned int>,
481 std::vector<std::pair<unsigned int, unsigned int>>>
483
488 std::pair<std::vector<unsigned int>,
489 std::vector<std::pair<unsigned int, unsigned int>>>
491
496 std::vector<unsigned int> sm_import_ranks;
497
502 std::pair<std::vector<unsigned int>,
503 std::vector<std::pair<unsigned int, unsigned int>>>
505
510 std::pair<std::vector<unsigned int>,
511 std::vector<std::pair<unsigned int, unsigned int>>>
513 };
514
515 } // namespace VectorDataExchange
516 } // end of namespace MatrixFreeFunctions
517} // end of namespace internal
518
520
521#endif
virtual void import_from_ghosted_array_start(const VectorOperation::values vector_operation, const unsigned int communication_channel, const ArrayView< const float > &locally_owned_array, const std::vector< ArrayView< const float > > &shared_arrays, const ArrayView< float > &ghost_array, const ArrayView< float > &temporary_storage, std::vector< MPI_Request > &requests) const =0
virtual void export_to_ghosted_array_finish(const ArrayView< const float > &locally_owned_array, const std::vector< ArrayView< const float > > &shared_arrays, const ArrayView< float > &ghost_array, std::vector< MPI_Request > &requests) const =0
virtual void reset_ghost_values(const ArrayView< float > &ghost_array) const =0
virtual types::global_dof_index size() const =0
virtual unsigned int locally_owned_size() const =0
virtual void import_from_ghosted_array_finish(const VectorOperation::values vector_operation, const ArrayView< float > &locally_owned_storage, const std::vector< ArrayView< const float > > &shared_arrays, const ArrayView< float > &ghost_array, const ArrayView< const float > &temporary_storage, std::vector< MPI_Request > &requests) const =0
virtual void reset_ghost_values(const ArrayView< double > &ghost_array) const =0
virtual void export_to_ghosted_array_start(const unsigned int communication_channel, const ArrayView< const float > &locally_owned_array, const std::vector< ArrayView< const float > > &shared_arrays, const ArrayView< float > &ghost_array, const ArrayView< float > &temporary_storage, std::vector< MPI_Request > &requests) const =0
virtual void import_from_ghosted_array_start(const VectorOperation::values vector_operation, const unsigned int communication_channel, const ArrayView< const double > &locally_owned_array, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, const ArrayView< double > &temporary_storage, std::vector< MPI_Request > &requests) const =0
virtual void import_from_ghosted_array_finish(const VectorOperation::values vector_operation, const ArrayView< double > &locally_owned_storage, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, const ArrayView< const double > &temporary_storage, std::vector< MPI_Request > &requests) const =0
virtual void export_to_ghosted_array_start(const unsigned int communication_channel, const ArrayView< const double > &locally_owned_array, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, const ArrayView< double > &temporary_storage, std::vector< MPI_Request > &requests) const =0
virtual void export_to_ghosted_array_finish(const ArrayView< const double > &locally_owned_array, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, std::vector< MPI_Request > &requests) const =0
void export_to_ghosted_array_start(const unsigned int communication_channel, const ArrayView< const double > &locally_owned_array, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, const ArrayView< double > &temporary_storage, std::vector< MPI_Request > &requests) const override
void reset_ghost_values(const ArrayView< double > &ghost_array) const override
std::vector< std::array< unsigned int, 3 > > ghost_targets_data
std::pair< std::vector< unsigned int >, std::vector< std::pair< unsigned int, unsigned int > > > sm_export_data_this
void export_to_ghosted_array_finish(const ArrayView< const double > &locally_owned_array, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, std::vector< MPI_Request > &requests) const override
void import_from_ghosted_array_start(const VectorOperation::values vector_operation, const unsigned int communication_channel, const ArrayView< const double > &locally_owned_array, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, const ArrayView< double > &temporary_storage, std::vector< MPI_Request > &requests) const override
void export_to_ghosted_array_start_impl(const unsigned int communication_channel, const ArrayView< const Number > &locally_owned_array, const std::vector< ArrayView< const Number > > &shared_arrays, const ArrayView< Number > &ghost_array, const ArrayView< Number > &temporary_storage, std::vector< MPI_Request > &requests) const
void import_from_ghosted_array_finish_impl(const VectorOperation::values vector_operation, const ArrayView< Number > &locally_owned_storage, const std::vector< ArrayView< const Number > > &shared_arrays, const ArrayView< Number > &ghost_array, const ArrayView< const Number > &temporary_storage, std::vector< MPI_Request > &requests) const
std::pair< std::vector< unsigned int >, std::vector< std::pair< unsigned int, unsigned int > > > sm_export_data
std::vector< std::array< unsigned int, 3 > > import_targets_data
std::pair< std::vector< unsigned int >, std::vector< std::pair< unsigned int, unsigned int > > > ghost_indices_subset_data
void import_from_ghosted_array_finish(const VectorOperation::values vector_operation, const ArrayView< double > &locally_owned_storage, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, const ArrayView< const double > &temporary_storage, std::vector< MPI_Request > &requests) const override
void export_to_ghosted_array_finish_impl(const ArrayView< const Number > &locally_owned_array, const std::vector< ArrayView< const Number > > &shared_arrays, const ArrayView< Number > &ghost_array, std::vector< MPI_Request > &requests) const
std::pair< std::vector< unsigned int >, std::vector< std::pair< unsigned int, unsigned int > > > sm_import_data
void import_from_ghosted_array_start_impl(const VectorOperation::values vector_operation, const unsigned int communication_channel, const ArrayView< const Number > &locally_owned_array, const std::vector< ArrayView< const Number > > &shared_arrays, const ArrayView< Number > &ghost_array, const ArrayView< Number > &temporary_storage, std::vector< MPI_Request > &requests) const
void reset_ghost_values_impl(const ArrayView< Number > &ghost_array) const
std::pair< std::vector< unsigned int >, std::vector< std::pair< unsigned int, unsigned int > > > sm_import_data_this
virtual types::global_dof_index size() const override
std::pair< std::vector< unsigned int >, std::vector< std::pair< unsigned int, unsigned int > > > import_indices_data
const std::shared_ptr< const Utilities::MPI::Partitioner > partitioner
void export_to_ghosted_array_finish(const ArrayView< const double > &locally_owned_array, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, std::vector< MPI_Request > &requests) const override
void export_to_ghosted_array_start(const unsigned int communication_channel, const ArrayView< const double > &locally_owned_array, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, const ArrayView< double > &temporary_storage, std::vector< MPI_Request > &requests) const override
void reset_ghost_values_impl(const ArrayView< Number > &ghost_array) const
void import_from_ghosted_array_finish(const VectorOperation::values vector_operation, const ArrayView< double > &locally_owned_storage, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, const ArrayView< const double > &temporary_storage, std::vector< MPI_Request > &requests) const override
void reset_ghost_values(const ArrayView< double > &ghost_array) const override
void import_from_ghosted_array_start(const VectorOperation::values vector_operation, const unsigned int communication_channel, const ArrayView< const double > &locally_owned_array, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, const ArrayView< double > &temporary_storage, std::vector< MPI_Request > &requests) const override
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39