SpECTRE Documentation Coverage Report
Current view: top level - Evolution/Particles/MonteCarlo - Packet.hpp Coverage Total Hit
Commit: 0d1d717af84a81fb1284a20c4013708fe85cc2f0 Lines: 86.7 % 15 13
Test Date: 2026-10-22 17:29:42
Legend: Lines:     hit not hit

            Line data    Source code
       1            0 : // Distributed under the MIT License.
       2              : // See LICENSE.txt for details.
       3              : 
       4              : #pragma once
       5              : 
       6              : #include <vector>
       7              : 
       8              : #include "DataStructures/DataVector.hpp"
       9              : #include "DataStructures/Tensor/Tensor.hpp"
      10              : #include "Utilities/Gsl.hpp"
      11              : 
      12              : /// Items related to the evolution of particles
      13              : /// Items related to Monte-Carlo radiation transport
      14              : namespace Particles::MonteCarlo {
      15              : 
      16              : /// Struct representing a single Monte Carlo packet of neutrinos
      17            1 : struct Packet {
      18              :   /// Constructor
      19            1 :   Packet(const size_t& species_,
      20              :          const double& number_of_neutrinos_,
      21              :          const size_t& index_of_closest_grid_point_, const double& time_,
      22              :          const double& coord_x_, const double& coord_y_, const double& coord_z_,
      23              :          const double& p_upper_t_, const double& p_x_, const double& p_y_,
      24              :          const double& p_z_)
      25              :       : species(species_),
      26              :         number_of_neutrinos(number_of_neutrinos_),
      27              :         index_of_closest_grid_point(index_of_closest_grid_point_),
      28              :         time(time_),
      29              :         momentum_upper_t(p_upper_t_) {
      30              :     coordinates[0] = coord_x_;
      31              :     coordinates[1] = coord_y_;
      32              :     coordinates[2] = coord_z_;
      33              :     momentum[0] = p_x_;
      34              :     momentum[1] = p_y_;
      35              :     momentum[2] = p_z_;
      36              :   }
      37              : 
      38              :   /// Default constructor needed to make Packet puppable
      39              :   /// For the same reason, we have default initialization
      40              :   /// for a number of member variables to unphysical values.
      41            1 :   Packet()
      42              :       : species{0},
      43              :         number_of_neutrinos{0},
      44              :         index_of_closest_grid_point{0},
      45              :         time{-1.0},
      46              :         momentum_upper_t{0.0} {
      47              :     coordinates[0] = 0.0;
      48              :     coordinates[1] = 0.0;
      49              :     coordinates[2] = 0.0;
      50              :     momentum[0] = 0.0;
      51              :     momentum[1] = 0.0;
      52              :     momentum[2] = 0.0;
      53              :   }
      54              : 
      55              :   /// Species of neutrinos (in the code, just an index used to access the
      56              :   /// right interaction rates; typically \f$0=\nu_e, 1=\nu_a, 2=\nu_x\f$)
      57            1 :   size_t species = std::numeric_limits<size_t>::max();
      58              : 
      59              :   /// Number of neutrinos represented by current packet
      60              :   /// Note that this number is rescaled so that
      61              :   /// `Energy_of_packet = N * Energy_of_neutrinos`
      62              :   /// with the packet energy in G=Msun=c=1 units but
      63              :   /// the neutrino energy in MeV!
      64            1 :   double number_of_neutrinos = std::numeric_limits<double>::signaling_NaN();
      65              : 
      66              :   /// Index of the closest point on the FD grid.
      67            1 :   size_t index_of_closest_grid_point = std::numeric_limits<size_t>::max();
      68              : 
      69              :   /// Current time
      70            1 :   double time = std::numeric_limits<double>::signaling_NaN();
      71              : 
      72              :   /// Stores \f$p^t\f$
      73            1 :   double momentum_upper_t = std::numeric_limits<double>::signaling_NaN();
      74              : 
      75              :   /// Coordinates of the packet, in element logical coordinates
      76            1 :   tnsr::I<double, 3, Frame::ElementLogical> coordinates;
      77              : 
      78              :   /// Spatial components of the 4-momentum \f$p_i\f$, in Inertial coordinates
      79            1 :   tnsr::i<double, 3, Frame::Inertial> momentum;
      80              : 
      81              :   /*!
      82              :    * Recalculte \f$p^t\f$ using the fact that the 4-momentum is a null vector
      83              :    * \f{align}{
      84              :    * p^t = \sqrt{\gamma^{ij} p_i p_j}/\alpha
      85              :    * \f}
      86              :    */
      87            1 :   void renormalize_momentum(
      88              :       const tnsr::II<DataVector, 3, Frame::Inertial>& inv_spatial_metric,
      89              :       const Scalar<DataVector>& lapse);
      90              : 
      91            0 :   void pup(PUP::er& p);
      92              : 
      93              :   /// Overloaded comparison operator. Useful for test; in an actual simulation
      94              :   /// two distinct packets are not truly "identical" as they represent different
      95              :   /// particles.
      96            1 :   bool operator==(const Packet& rhs) const {
      97              :     return (this->species == rhs.species) and
      98              :            (this->number_of_neutrinos == rhs.number_of_neutrinos) and
      99              :            (this->index_of_closest_grid_point ==
     100              :             rhs.index_of_closest_grid_point) and
     101              :            (this->time == rhs.time) and
     102              :            (this->momentum_upper_t == rhs.momentum_upper_t) and
     103              :            (this->coordinates == rhs.coordinates) and
     104              :            (this->momentum == rhs.momentum);
     105              :   };
     106              : };
     107              : 
     108              : /*!
     109              :  * Calculate energy of neutrinos in a frame comoving with the fluid
     110              :  *
     111              :  * \f{align}{
     112              :  * E = W \alpha p^t - \gamma^{ij} u_i p_j
     113              :  * \f}
     114              :  */
     115            1 : double compute_fluid_frame_energy(
     116              :     const Packet& packet, const Scalar<DataVector>& lorentz_factor,
     117              :     const tnsr::i<DataVector, 3, Frame::Inertial>& lower_spatial_four_velocity,
     118              :     const Scalar<DataVector>& lapse,
     119              :     const tnsr::II<DataVector, 3, Frame::Inertial>& inv_spatial_metric);
     120              : 
     121              : }  // namespace Particles::MonteCarlo
        

Generated by: LCOV version 2.0-1