Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <array> 7 : #include <map> 8 : #include <optional> 9 : #include <utility> 10 : 11 : #include "DataStructures/DataBox/Tag.hpp" 12 : #include "DataStructures/Tensor/TypeAliases.hpp" 13 : #include "Domain/Structure/DirectionalIdMap.hpp" 14 : #include "Evolution/Particles/MonteCarlo/GhostZoneCommunicationStep.hpp" 15 : #include "Evolution/Particles/MonteCarlo/Packet.hpp" 16 : #include "Time/Slab.hpp" 17 : #include "Time/Tags/TimeStepId.hpp" 18 : #include "Time/Time.hpp" 19 : #include "Time/TimeStepId.hpp" 20 : #include "Utilities/Gsl.hpp" 21 : 22 : /// \cond 23 : class DataVector; 24 : /// \endcond 25 : 26 : /// Items related to the evolution of particles 27 : /// Items related to Monte-Carlo radiation transport 28 : namespace Particles::MonteCarlo { 29 : 30 : /*! 31 : * \brief The container for ghost zone data to be communicated 32 : * in the Monte-Carlo algorithm 33 : * 34 : * The stored data consists of 35 : * (1) The fluid variables in those ghost cells, in the form 36 : * of a DataVector. The data should contain the 37 : * scalars (baryon density, temperature, electron fraction, 38 : * and cell light-crossing time) in pre-step communication 39 : * and (coupling_tilde_tau, coupling_tilde_s, coupling_rho_ye) 40 : * in post-step communication 41 : * (2) The packets moved from a neighbor to this element. This 42 : * can be std::null_ptr in pre-step communication 43 : */ 44 : template <size_t Dim> 45 1 : struct McGhostZoneData { 46 0 : void pup(PUP::er& p) { 47 : p | ghost_zone_hydro_variables; 48 : p | packets_entering_this_element; 49 : } 50 : 51 0 : DataVector ghost_zone_hydro_variables{}; 52 : std::optional<std::vector<Particles::MonteCarlo::Packet>> 53 0 : packets_entering_this_element{}; 54 : }; 55 : 56 : /// Inbox tag to be used before MC step 57 : template <size_t Dim, CommunicationStep CommStep> 58 1 : struct McGhostZoneDataInboxTag { 59 0 : using stored_type = McGhostZoneData<Dim>; 60 : 61 0 : using temporal_id = TimeStepId; 62 0 : using type = std::map<TimeStepId, DirectionalIdMap<Dim, stored_type>>; 63 0 : using value_type = type; 64 : 65 0 : CommunicationStep comm_step = CommStep; 66 : 67 : template <typename ReceiveDataType> 68 0 : static size_t insert_into_inbox(const gsl::not_null<type*> inbox, 69 : const temporal_id& time_step_id, 70 : ReceiveDataType&& data) { 71 : auto& current_inbox = (*inbox)[time_step_id]; 72 : if (not current_inbox.insert(std::forward<ReceiveDataType>(data)) 73 : .second) { 74 : ERROR("Failed to insert data to receive at instance '" 75 : << time_step_id 76 : << " in McGhostZonePreStepDataInboxTag.\n"); 77 : } 78 : return current_inbox.size(); 79 : } 80 : 81 0 : void pup(PUP::er& /*p*/) {} 82 : }; 83 : 84 : // Tags to put in DataBox for MC communication. 85 1 : namespace Tags { 86 : 87 : /// Simple tag for the structure containing ghost zone data 88 : /// for Monte Carlo radiation transport. 89 : template <size_t Dim> 90 1 : struct McGhostZoneDataTag : db::SimpleTag { 91 0 : using type = DirectionalIdMap<Dim, McGhostZoneData<Dim>>; 92 : }; 93 : 94 : } // namespace Tags 95 : 96 : } // namespace Particles::MonteCarlo