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 : #include <limits>
8 : #include <optional>
9 : #include <tuple>
10 : #include <type_traits>
11 : #include <utility>
12 :
13 : #include "DataStructures/DataBox/DataBox.hpp"
14 : #include "DataStructures/DataBox/PrefixHelpers.hpp"
15 : #include "NumericalAlgorithms/Convergence/HasConverged.hpp"
16 : #include "NumericalAlgorithms/Convergence/Tags.hpp"
17 : #include "Parallel/AlgorithmExecution.hpp"
18 : #include "Parallel/GlobalCache.hpp"
19 : #include "ParallelAlgorithms/Amr/Protocols/Projector.hpp"
20 : #include "ParallelAlgorithms/Initialization/MutateAssign.hpp"
21 : #include "ParallelAlgorithms/LinearSolver/Tags.hpp"
22 : #include "Utilities/ProtocolHelpers.hpp"
23 :
24 : /// \cond
25 : namespace tuples {
26 : template <typename...>
27 : class TaggedTuple;
28 : } // namespace tuples
29 : /// \endcond
30 :
31 : namespace LinearSolver::gmres::detail {
32 :
33 : template <typename FieldsTag, typename OptionsGroup, bool Preconditioned>
34 : struct InitializeElement : tt::ConformsTo<amr::protocols::Projector> {
35 : private:
36 : using fields_tag = FieldsTag;
37 : using initial_fields_tag = db::add_tag_prefix<::Tags::Initial, fields_tag>;
38 : using operator_applied_to_fields_tag =
39 : db::add_tag_prefix<LinearSolver::Tags::OperatorAppliedTo, fields_tag>;
40 : using operand_tag =
41 : db::add_tag_prefix<LinearSolver::Tags::Operand, fields_tag>;
42 : using preconditioned_operand_tag =
43 : db::add_tag_prefix<LinearSolver::Tags::Preconditioned, operand_tag>;
44 : using operator_applied_to_operand_tag = db::add_tag_prefix<
45 : LinearSolver::Tags::OperatorAppliedTo,
46 : std::conditional_t<Preconditioned, preconditioned_operand_tag,
47 : operand_tag>>;
48 : using orthogonalization_iteration_id_tag =
49 : LinearSolver::Tags::Orthogonalization<
50 : Convergence::Tags::IterationId<OptionsGroup>>;
51 : using basis_history_tag =
52 : LinearSolver::Tags::KrylovSubspaceBasis<operand_tag>;
53 : using preconditioned_basis_history_tag =
54 : LinearSolver::Tags::KrylovSubspaceBasis<preconditioned_operand_tag>;
55 :
56 : public: // Iterable action
57 : using simple_tags = tmpl::append<
58 : tmpl::list<Convergence::Tags::IterationId<OptionsGroup>,
59 : initial_fields_tag, operator_applied_to_fields_tag,
60 : operand_tag, operator_applied_to_operand_tag,
61 : orthogonalization_iteration_id_tag, basis_history_tag,
62 : Convergence::Tags::HasConverged<OptionsGroup>>,
63 : tmpl::conditional_t<Preconditioned,
64 : tmpl::list<preconditioned_basis_history_tag,
65 : preconditioned_operand_tag>,
66 : tmpl::list<>>>;
67 : using compute_tags = tmpl::list<>;
68 :
69 : template <typename DbTagsList, typename... InboxTags, typename Metavariables,
70 : typename ArrayIndex, typename ActionList,
71 : typename ParallelComponent>
72 : static Parallel::iterable_action_return_t apply(
73 : db::DataBox<DbTagsList>& box,
74 : const tuples::TaggedTuple<InboxTags...>& /*inboxes*/,
75 : Parallel::GlobalCache<Metavariables>& /*cache*/,
76 : const ArrayIndex& /*array_index*/, const ActionList /*meta*/,
77 : const ParallelComponent* const /*meta*/) {
78 : Initialization::mutate_assign<
79 : tmpl::list<Convergence::Tags::IterationId<OptionsGroup>,
80 : orthogonalization_iteration_id_tag>>(
81 : make_not_null(&box), std::numeric_limits<size_t>::max(),
82 : std::numeric_limits<size_t>::max());
83 : return {Parallel::AlgorithmExecution::Continue, std::nullopt};
84 : }
85 :
86 : public: // amr::protocols::Projector
87 : using argument_tags = tmpl::list<>;
88 : using return_tags = simple_tags;
89 :
90 : template <typename... AmrData>
91 : static void apply(const gsl::not_null<size_t*> /*unused*/,
92 : const AmrData&... /*all_items*/) {
93 : // No need to reset or initialize any of the items during AMR because they
94 : // will be set in `PrepareSolve`. AMR can't happen _during_ a solve.
95 : }
96 : };
97 :
98 : } // namespace LinearSolver::gmres::detail
|