Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : #include <cstddef> 6 : #include "DataStructures/DataBox/Prefixes.hpp" 7 : #include "DataStructures/Variables.hpp" 8 : #include "DataStructures/VariablesTag.hpp" 9 : #include "Evolution/Systems/CurvedScalarWave/Worldtube/Tags.hpp" 10 : #include "Time/Tags/HistoryEvolvedVariables.hpp" 11 : #include "Time/TimeSteppers/TimeStepper.hpp" 12 : #include "Utilities/Gsl.hpp" 13 : /// \cond 14 : namespace Tags { 15 : template <typename StepperInterface> 16 : struct TimeStepper; 17 : } // namespace Tags 18 : /// \endcond 19 : namespace CurvedScalarWave::Worldtube::Initialization { 20 : /*! 21 : * \brief Initializes the time stepper and evolved variables used by the 22 : * worldtube system. Also sets `Tags::CurrentIteration` to 0. 23 : * 24 : * \details Sets the initial position and velocity of the particle to the values 25 : * specified in the input file. The time stepper history is set analogous to the 26 : * elements which use the same time stepper. 27 : */ 28 1 : struct InitializeEvolvedVariables { 29 0 : static constexpr size_t Dim = 3; 30 0 : using variables_tag = ::Tags::Variables< 31 : tmpl::list<Tags::EvolvedPosition<Dim>, Tags::EvolvedVelocity<Dim>>>; 32 0 : using dt_variables_tag = db::add_tag_prefix<::Tags::dt, variables_tag>; 33 : 34 0 : using simple_tags = 35 : tmpl::list<variables_tag, dt_variables_tag, Tags::CurrentIteration, 36 : Tags::ExpirationTime, Tags::WorldtubeRadius, 37 : ::Tags::HistoryEvolvedVariables<variables_tag>>; 38 0 : using return_tags = simple_tags; 39 : 40 0 : using compute_tags = tmpl::list<>; 41 0 : using const_global_cache_tags = tmpl::list<>; 42 0 : using mutable_global_cache_tags = tmpl::list<>; 43 0 : using simple_tags_from_options = tmpl::list<Tags::InitialPositionAndVelocity>; 44 0 : using argument_tags = tmpl::list<::Tags::TimeStepper<TimeStepper>, 45 : Tags::InitialPositionAndVelocity, 46 : ::Tags::Time, Tags::ExcisionSphere<Dim>>; 47 0 : static void apply( 48 : const gsl::not_null<Variables< 49 : tmpl::list<Tags::EvolvedPosition<Dim>, Tags::EvolvedVelocity<Dim>>>*> 50 : evolved_vars, 51 : const gsl::not_null< 52 : Variables<tmpl::list<::Tags::dt<Tags::EvolvedPosition<Dim>>, 53 : ::Tags::dt<Tags::EvolvedVelocity<Dim>>>>*> 54 : dt_evolved_vars, 55 : const gsl::not_null<size_t*> current_iteration, 56 : const gsl::not_null<double*> expiration_time, 57 : const gsl::not_null<double*> worldtube_radius, 58 : const gsl::not_null<::Tags::HistoryEvolvedVariables<variables_tag>::type*> 59 : time_stepper_history, 60 : const TimeStepper& time_stepper, 61 : const std::array<tnsr::I<double, Dim>, 2>& initial_pos_and_vel, 62 : const double initial_time, const ExcisionSphere<Dim>& excision_sphere) { 63 : *current_iteration = 0; 64 : 65 : // the functions of time should be ready during the first step but not the 66 : // second. We choose the arbitrary value of 1e-10 here to ensure this. 67 : *expiration_time = initial_time + 1e-10; 68 : *worldtube_radius = excision_sphere.radius(); 69 : 70 : const size_t starting_order = 71 : time_stepper.number_of_past_steps() == 0 ? time_stepper.order() : 1; 72 : *time_stepper_history = 73 : typename ::Tags::HistoryEvolvedVariables<variables_tag>::type{ 74 : starting_order}; 75 : evolved_vars->initialize(size_t(1), 0.); 76 : dt_evolved_vars->initialize(size_t(1), 0.); 77 : for (size_t i = 0; i < Dim; ++i) { 78 : get<Tags::EvolvedPosition<Dim>>(*evolved_vars).get(i)[0] = 79 : initial_pos_and_vel.at(0).get(i); 80 : get<Tags::EvolvedVelocity<Dim>>(*evolved_vars).get(i)[0] = 81 : initial_pos_and_vel.at(1).get(i); 82 : } 83 : } 84 : }; 85 : } // namespace CurvedScalarWave::Worldtube::Initialization