Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <limits> 7 : #include <optional> 8 : 9 : #include "DataStructures/DataBox/DataBox.hpp" 10 : #include "DataStructures/DataBox/Prefixes.hpp" 11 : #include "IO/Logging/Tags.hpp" 12 : #include "NumericalAlgorithms/Convergence/Tags.hpp" 13 : #include "Parallel/AlgorithmExecution.hpp" 14 : #include "Parallel/Algorithms/AlgorithmSingleton.hpp" 15 : #include "Parallel/GlobalCache.hpp" 16 : #include "Parallel/Local.hpp" 17 : #include "Parallel/Phase.hpp" 18 : #include "ParallelAlgorithms/Initialization/MutateAssign.hpp" 19 : #include "ParallelAlgorithms/LinearSolver/Tags.hpp" 20 : #include "ParallelAlgorithms/NonlinearSolver/Tags.hpp" 21 : 22 : /// \cond 23 : namespace tuples { 24 : template <typename...> 25 : class TaggedTuple; 26 : } // namespace tuples 27 : namespace NonlinearSolver::newton_raphson::detail { 28 : template <typename Metavariables, typename FieldsTag> 29 : struct InitializeResidualMonitor; 30 : } // namespace NonlinearSolver::newton_raphson::detail 31 : /// \endcond 32 : 33 : namespace NonlinearSolver::newton_raphson::detail { 34 : 35 : template <typename Metavariables, typename FieldsTag, typename OptionsGroup> 36 : struct ResidualMonitor { 37 : using chare_type = Parallel::Algorithms::Singleton; 38 : static constexpr bool checkpoint_data = true; 39 : using const_global_cache_tags = 40 : tmpl::list<logging::Tags::Verbosity<OptionsGroup>, 41 : Convergence::Tags::Criteria<OptionsGroup>, 42 : NonlinearSolver::Tags::SufficientDecrease<OptionsGroup>, 43 : NonlinearSolver::Tags::MaxGlobalizationSteps<OptionsGroup>>; 44 : using metavariables = Metavariables; 45 : using phase_dependent_action_list = tmpl::list<Parallel::PhaseActions< 46 : Parallel::Phase::Initialization, 47 : tmpl::list<InitializeResidualMonitor<FieldsTag, OptionsGroup>>>>; 48 : 49 : using simple_tags_from_options = Parallel::get_simple_tags_from_options< 50 : Parallel::get_initialization_actions_list<phase_dependent_action_list>>; 51 : 52 : static void initialize( 53 : Parallel::CProxy_GlobalCache<Metavariables>& /*global_cache*/) {} 54 : 55 : static void execute_next_phase( 56 : const Parallel::Phase next_phase, 57 : Parallel::CProxy_GlobalCache<Metavariables>& global_cache) { 58 : auto& local_cache = *Parallel::local_branch(global_cache); 59 : Parallel::get_parallel_component<ResidualMonitor>(local_cache) 60 : .start_phase(next_phase); 61 : } 62 : }; 63 : 64 : template <typename FieldsTag, typename OptionsGroup> 65 : struct InitializeResidualMonitor { 66 : private: 67 : using fields_tag = FieldsTag; 68 : using residual_tag = 69 : db::add_tag_prefix<NonlinearSolver::Tags::Residual, fields_tag>; 70 : using residual_magnitude_square_tag = 71 : LinearSolver::Tags::MagnitudeSquare<residual_tag>; 72 : using initial_residual_magnitude_tag = 73 : ::Tags::Initial<LinearSolver::Tags::Magnitude<residual_tag>>; 74 : using prev_residual_magnitude_square_tag = 75 : NonlinearSolver::Tags::Globalization<residual_magnitude_square_tag>; 76 : 77 : public: 78 : using simple_tags = 79 : db::AddSimpleTags<residual_magnitude_square_tag, 80 : initial_residual_magnitude_tag, 81 : NonlinearSolver::Tags::StepLength<OptionsGroup>, 82 : prev_residual_magnitude_square_tag>; 83 : using compute_tags = tmpl::list<>; 84 : 85 : template <typename DbTagsList, typename... InboxTags, typename Metavariables, 86 : typename ArrayIndex, typename ActionList, 87 : typename ParallelComponent> 88 : static Parallel::iterable_action_return_t apply( 89 : db::DataBox<DbTagsList>& box, 90 : tuples::TaggedTuple<InboxTags...>& /*inboxes*/, 91 : const Parallel::GlobalCache<Metavariables>& /*cache*/, 92 : const ArrayIndex& /*array_index*/, const ActionList /*meta*/, 93 : const ParallelComponent* const /*meta*/) { 94 : Initialization::mutate_assign<simple_tags>( 95 : make_not_null(&box), std::numeric_limits<double>::signaling_NaN(), 96 : std::numeric_limits<double>::signaling_NaN(), 97 : std::numeric_limits<double>::signaling_NaN(), 98 : std::numeric_limits<double>::signaling_NaN()); 99 : return {Parallel::AlgorithmExecution::Pause, std::nullopt}; 100 : } 101 : }; 102 : 103 : } // namespace NonlinearSolver::newton_raphson::detail