Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <deque> 7 : #include <memory> 8 : #include <optional> 9 : #include <tuple> 10 : 11 : #include "DataStructures/Tensor/Tensor.hpp" 12 : #include "DataStructures/Tensor/TypeAliases.hpp" 13 : #include "Evolution/Systems/Cce/InterfaceManagers/GhInterfaceManager.hpp" 14 : #include "Options/String.hpp" 15 : #include "Time/TimeStepId.hpp" 16 : #include "Utilities/Serialization/CharmPupable.hpp" 17 : 18 : namespace Cce::InterfaceManagers { 19 : 20 : /*! 21 : * \brief Simple implementation of a `GhInterfaceManager` that only 22 : * provides boundary data on matching `TimeStepId`s 23 : * 24 : * \details This version of the interface manager assumes that the CCE system 25 : * and the generalized harmonic system that it communicates with evolve with an 26 : * identical time stepper and on identical time step intervals (they evolve in 27 : * 'lock step'). As a result, and to streamline communications, new data is 28 : * always immediately 'ready' and requests are ignored to produce the behavior 29 : * of just immediately gauge-transforming and sending the data to the CCE 30 : * component as soon as it becomes available from the GH system. 31 : * 32 : * \warning Using this interface manager when the GH components and the CCE 33 : * evolution are not identically stepped is considered undefined behavior. For 34 : * current implementations involving dense output and local time-stepping, this 35 : * interface manager can only be used during self-start. 36 : */ 37 1 : class GhLockstep : public GhInterfaceManager { 38 : public: 39 0 : using GhInterfaceManager::gh_variables; 40 : 41 0 : static constexpr Options::String help{ 42 : "Pass data between GH and CCE systems on matching timesteps only."}; 43 : 44 0 : using options = tmpl::list<>; 45 : 46 0 : GhLockstep() = default; 47 : 48 0 : explicit GhLockstep(CkMigrateMessage* /*unused*/) {} 49 : 50 0 : WRAPPED_PUPable_decl_template(GhLockstep); // NOLINT 51 : 52 0 : std::unique_ptr<GhInterfaceManager> get_clone() const override; 53 : 54 : /// \brief Store a provided data set in a `std::deque`. 55 : /// 56 : /// \details The lock-step constraint ensures that only the generalized 57 : /// harmonic variables `spacetime_metric`, `phi`, and `pi` are used. The 58 : /// remaining variables are accepted to comply with the more general abstract 59 : /// interface. 60 1 : void insert_gh_data(TimeStepId time_id, 61 : const tnsr::aa<DataVector, 3>& spacetime_metric, 62 : const tnsr::iaa<DataVector, 3>& phi, 63 : const tnsr::aa<DataVector, 3>& pi); 64 : 65 0 : void request_gh_data(const TimeStepId& time_id) override; 66 : 67 : /// \brief Return a `std::optional<std::tuple>` of the least recently 68 : /// submitted generalized harmonic boundary data if any exists and removes it 69 : /// from the internal `std::deque`, otherwise returns `std::nullopt`. 70 1 : auto retrieve_and_remove_first_ready_gh_data() 71 : -> std::optional<std::tuple<TimeStepId, gh_variables>> override; 72 : 73 : /// \brief This class ignores requests to ensure a one-way communication 74 : /// pattern, so the number of requests is always 0. 75 1 : size_t number_of_pending_requests() const override { return 0; } 76 : 77 : /// \brief The number of times at which data from a GH evolution have been 78 : /// stored and not yet retrieved 79 1 : size_t number_of_gh_times() const override { return provided_data_.size(); } 80 : 81 : /// Serialization for Charm++. 82 1 : void pup(PUP::er& p) override; 83 : 84 : private: 85 0 : std::map<TimeStepId, gh_variables> provided_data_; 86 0 : std::set<TimeStepId> requests_; 87 : }; 88 : 89 : } // namespace Cce::InterfaceManagers