Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <cstddef>
7 :
8 : namespace LinearSolver::Schwarz {
9 :
10 : /*!
11 : * \brief Abstract base class for the subdomain operator, i.e. the linear
12 : * operator restricted to an element-centered Schwarz subdomain
13 : *
14 : * A subdomain operator must implement these member function templates
15 : * - `operator()`: Applies the operator to the element-centered subdomain data.
16 : * It must take these arguments, in this order:
17 : * - `gsl::not_null<LinearSolver::Schwarz::ElementCenteredSubdomainData*>`:
18 : * The data where the result of the operator applied to the operand should
19 : * be written to
20 : * - `LinearSolver::Schwarz::ElementCenteredSubdomainData`: The operand data
21 : * to which the operator should be applied
22 : * - `db::DataBox`: The element's DataBox. Can be used to retrieve any data on
23 : * the subdomain geometry and to access and mutate persistent memory
24 : * buffers.
25 : *
26 : * Since the subdomain operator has access to the element's DataBox, it can
27 : * retrieve any background data, i.e. data that does not depend on the variables
28 : * it operates on. Background data on overlap regions with other elements can be
29 : * either initialized in advance if possible or communicated with the
30 : * `LinearSolver::Schwarz::Actions::SendOverlapFields` and
31 : * `LinearSolver::Schwarz::Actions::ReceiveOverlapFields` actions. Note that
32 : * such communication should not be necessary between iterations of the Schwarz
33 : * solve, but only between successive solves, because background data should not
34 : * change during the solve. The Schwarz algorithm takes care of communicating
35 : * all variable data that the subdomain operator operates on, whenever
36 : * necessary. This variable data is passed to the operator as the `operand`
37 : * argument (see above). It includes the data on the central element of the
38 : * subdomain, as well as the data on overlap regions with neighbors. Since data
39 : * on the entire subdomain is available, applying the subdomain operator
40 : * requires _no_ communication between elements. This is the strength of the
41 : * Schwarz algorithm: all subdomain solves are independent of each other (see
42 : * `LinearSolver::Schwarz::Schwarz` for details).
43 : *
44 : * Here's an example of a subdomain operator that is the restriction of an
45 : * explicit global matrix:
46 : *
47 : * \snippet Test_SchwarzAlgorithm.cpp subdomain_operator
48 : */
49 : template <size_t Dim>
50 1 : class SubdomainOperator {
51 : public:
52 0 : static constexpr size_t volume_dim = Dim;
53 :
54 0 : SubdomainOperator() = default;
55 : };
56 :
57 : } // namespace LinearSolver::Schwarz
|