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