Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include "DataStructures/DataBox/Tag.hpp" 7 : #include "DataStructures/Tensor/TypeAliases.hpp" 8 : #include "Evolution/Systems/ForceFree/Tags.hpp" 9 : #include "PointwiseFunctions/GeneralRelativity/TagsDeclarations.hpp" 10 : #include "Utilities/TMPL.hpp" 11 : 12 : /// \cond 13 : class DataVector; 14 : namespace gsl { 15 : template <typename T> 16 : class not_null; 17 : } // namespace gsl 18 : /// \endcond 19 : 20 : namespace ForceFree { 21 : 22 : /*! 23 : * \brief Computes electric field $E^i$ from TildeE or magnetic field $B^i$ from 24 : * TildeB. 25 : */ 26 1 : void em_field_from_evolved_fields( 27 : const gsl::not_null<tnsr::I<DataVector, 3>*> vector, 28 : const tnsr::I<DataVector, 3>& densitized_vector, 29 : const Scalar<DataVector>& sqrt_det_spatial_metric); 30 : 31 : /*! 32 : * \brief Computes electric charge density $q$ from TildeQ. 33 : */ 34 1 : void charge_density_from_tilde_q( 35 : const gsl::not_null<Scalar<DataVector>*> charge_density, 36 : const Scalar<DataVector>& tilde_q, 37 : const Scalar<DataVector>& sqrt_det_spatial_metric); 38 : 39 : /*! 40 : * \brief Computes electric current density $J^i$ from TildeJ. 41 : */ 42 1 : void electric_current_density_from_tilde_j( 43 : const gsl::not_null<tnsr::I<DataVector, 3>*> electric_current_density, 44 : const tnsr::I<DataVector, 3>& tilde_j, 45 : const Scalar<DataVector>& sqrt_det_spatial_metric, 46 : const Scalar<DataVector>& lapse); 47 : 48 : namespace Tags { 49 : /*! 50 : * \brief Compute item for electric field $E^i$ from TildeE. 51 : * 52 : * \note This ComputeTag is solely for observation purpose, not related to 53 : * actual time evolution. 54 : */ 55 1 : struct ElectricFieldCompute : ElectricField, db::ComputeTag { 56 0 : using argument_tags = 57 : tmpl::list<TildeE, gr::Tags::SqrtDetSpatialMetric<DataVector>>; 58 0 : using return_type = tnsr::I<DataVector, 3>; 59 0 : using base = ElectricField; 60 : 61 0 : static constexpr auto function = &em_field_from_evolved_fields; 62 : }; 63 : 64 : /*! 65 : * \brief Compute item for magnetic field $B^i$ from TildeB. 66 : * 67 : * \note This ComputeTag is solely for observation purpose, not related to 68 : * actual time evolution. 69 : */ 70 1 : struct MagneticFieldCompute : MagneticField, db::ComputeTag { 71 0 : using argument_tags = 72 : tmpl::list<TildeB, gr::Tags::SqrtDetSpatialMetric<DataVector>>; 73 0 : using return_type = tnsr::I<DataVector, 3>; 74 0 : using base = MagneticField; 75 : 76 0 : static constexpr auto function = &em_field_from_evolved_fields; 77 : }; 78 : 79 : /*! 80 : * \brief Compute item for electric charge density $q$ from TildeQ. 81 : * 82 : * \note This ComputeTag is solely for observation purpose, not related to 83 : * actual time evolution. 84 : */ 85 1 : struct ChargeDensityCompute : ChargeDensity, db::ComputeTag { 86 0 : using argument_tags = 87 : tmpl::list<TildeQ, gr::Tags::SqrtDetSpatialMetric<DataVector>>; 88 0 : using return_type = Scalar<DataVector>; 89 0 : using base = ChargeDensity; 90 : 91 0 : static constexpr auto function = &charge_density_from_tilde_q; 92 : }; 93 : 94 : /*! 95 : * \brief Compute item for electric current density $J^i$ from TildeJ. 96 : * 97 : * \note This ComputeTag is solely for observation purpose, not related to 98 : * actual time evolution. 99 : */ 100 1 : struct ElectricCurrentDensityCompute : ElectricCurrentDensity, db::ComputeTag { 101 0 : using argument_tags = tmpl::list<TildeJ, gr::Tags::Lapse<DataVector>, 102 : gr::Tags::SqrtDetSpatialMetric<DataVector>>; 103 0 : using return_type = tnsr::I<DataVector, 3>; 104 0 : using base = ElectricCurrentDensity; 105 : 106 0 : static constexpr auto function = &electric_current_density_from_tilde_j; 107 : }; 108 : 109 : } // namespace Tags 110 : } // namespace ForceFree