Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <cstddef>
7 :
8 : #include "DataStructures/DataBox/Tag.hpp"
9 : #include "DataStructures/DataBox/TagName.hpp"
10 : #include "DataStructures/Tensor/TypeAliases.hpp"
11 : #include "Evolution/Systems/GrMhd/ValenciaDivClean/TagsDeclarations.hpp"
12 : #include "PointwiseFunctions/GeneralRelativity/TagsDeclarations.hpp"
13 : #include "PointwiseFunctions/Hydro/QuadrupoleFormula.hpp"
14 : #include "PointwiseFunctions/Hydro/Tags.hpp"
15 : #include "PointwiseFunctions/Hydro/TagsDeclarations.hpp"
16 : #include "Utilities/TMPL.hpp"
17 :
18 : /// \cond
19 : namespace gsl {
20 : template <typename>
21 : struct not_null;
22 : } // namespace gsl
23 : /// \endcond
24 :
25 : namespace grmhd::ValenciaDivClean::Tags {
26 : /// \brief Compute tag for the quadrupole moment.
27 : ///
28 : /// Compute item for the quadrupole moment, using
29 : /// \f$\tilde{D} x^i x^j\f$ (equation 21 of \cite Shibata2003),
30 : /// with \f$\tilde{D}=\sqrt{\gamma}\rho W\f$, $W$ being the Lorentz factor,
31 : /// $\gamma$ being the determinant of the spatial metric, and
32 : /// \f$x\f$ the coordinates in Frame Fr.
33 : template <typename DataType, size_t Dim, typename OutputCoordsTag,
34 : typename Fr = Frame::Inertial>
35 1 : struct QuadrupoleMomentCompute
36 : : hydro::Tags::QuadrupoleMoment<DataType, Dim, Fr>,
37 : db::ComputeTag {
38 0 : using argument_tags = tmpl::list<TildeD, OutputCoordsTag>;
39 :
40 0 : using base = hydro::Tags::QuadrupoleMoment<DataType, Dim, Fr>;
41 0 : using return_type = typename base::type;
42 :
43 0 : static constexpr auto function = static_cast<void (*)(
44 : const gsl::not_null<tnsr::ii<DataType, Dim, Fr>*> result,
45 : const Scalar<DataType>& tilde_d,
46 : const tnsr::I<DataType, Dim, Fr>& coordinates)>(
47 : &hydro::quadrupole_moment<DataType, Dim, Fr>);
48 : };
49 :
50 : /// \brief Compute tag for the first time derivative of the quadrupole moment.
51 : ///
52 : /// Compute item for the first time derivative of the quadrupole moment, using
53 : /// \f$\tilde{D} (v^i x^j + x^i v^j)\f$ (equation 23 of \cite Shibata2003),
54 : /// with \f$\tilde{D}=\sqrt{\gamma}\rho W\f$, $W$ being the Lorentz factor,
55 : /// $\gamma$ being the determinant of the spatial metric, \f$x\f$ the
56 : /// coordinates in Frame Fr, and \f$v\f$ the corresponding spatial velocity.
57 : template <typename DataType, size_t Dim, typename OutputCoordsTag,
58 : typename VelocityTag, typename Fr = Frame::Inertial>
59 1 : struct QuadrupoleMomentDerivativeCompute
60 : : hydro::Tags::QuadrupoleMomentDerivative<DataType, Dim, Fr>,
61 : db::ComputeTag {
62 0 : using argument_tags = tmpl::list<TildeD, OutputCoordsTag, VelocityTag>;
63 :
64 0 : using base = hydro::Tags::QuadrupoleMomentDerivative<DataType, Dim, Fr>;
65 0 : using return_type = typename base::type;
66 :
67 0 : static std::string name() {
68 : return "QuadrupoleMomentDerivative(" + db::tag_name<VelocityTag>() + ")";
69 : }
70 :
71 0 : static constexpr auto function = static_cast<void (*)(
72 : const gsl::not_null<tnsr::ii<DataType, Dim, Fr>*> result,
73 : const Scalar<DataType>& tilde_d,
74 : const tnsr::I<DataType, Dim, Fr>& coordinates,
75 : const tnsr::I<DataType, Dim, Fr>& spatial_velocity)>(
76 : &hydro::quadrupole_moment_derivative<DataType, Dim, Fr>);
77 : };
78 : } // namespace grmhd::ValenciaDivClean::Tags
|