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/Prefixes.hpp"
9 : #include "DataStructures/DataBox/Tag.hpp"
10 : #include "DataStructures/Tensor/TypeAliases.hpp"
11 : #include "Domain/Tags.hpp"
12 : #include "PointwiseFunctions/GeneralRelativity/Psi4.hpp"
13 : #include "PointwiseFunctions/GeneralRelativity/Tags.hpp"
14 :
15 : /// \cond
16 : namespace domain::Tags {
17 : template <size_t Dim, typename Frame>
18 : struct Coordinates;
19 : } // namespace domain::Tags
20 : namespace gsl {
21 : template <typename>
22 : struct not_null;
23 : } // namespace gsl
24 : /// \endcond
25 :
26 : namespace gr {
27 :
28 : /// @{
29 : /*!
30 : * \ingroup GeneralRelativityGroup
31 : * \brief Computes the real part of the Newman Penrose quantity \f$\Psi_4\f$
32 : * using \f$\Psi_4[Real] = -0.5*U^{8+}_{ij}*(x^ix^j - y^iy^j)\f$.
33 : */
34 : template <typename Frame>
35 1 : void psi_4_real(
36 : gsl::not_null<Scalar<DataVector>*> psi_4_real_result,
37 : const tnsr::ii<DataVector, 3, Frame>& spatial_ricci,
38 : const tnsr::ii<DataVector, 3, Frame>& extrinsic_curvature,
39 : const tnsr::ijj<DataVector, 3, Frame>& cov_deriv_extrinsic_curvature,
40 : const tnsr::ii<DataVector, 3, Frame>& spatial_metric,
41 : const tnsr::II<DataVector, 3, Frame>& inverse_spatial_metric,
42 : const tnsr::I<DataVector, 3, Frame>& inertial_coords);
43 :
44 : template <typename Frame>
45 1 : Scalar<DataVector> psi_4_real(
46 : const tnsr::ii<DataVector, 3, Frame>& spatial_ricci,
47 : const tnsr::ii<DataVector, 3, Frame>& extrinsic_curvature,
48 : const tnsr::ijj<DataVector, 3, Frame>& cov_deriv_extrinsic_curvature,
49 : const tnsr::ii<DataVector, 3, Frame>& spatial_metric,
50 : const tnsr::II<DataVector, 3, Frame>& inverse_spatial_metric,
51 : const tnsr::I<DataVector, 3, Frame>& inertial_coords);
52 :
53 : namespace Tags {
54 : /// Computes the real part of the Newman Penrose quantity \f$\Psi_4\f$ using
55 : /// \f$\Psi_4[Real] = -0.5*U^{8+}_{ij}*(x^ix^j - y^iy^j)\f$.
56 : ///
57 : /// Can be retrieved using `gr::Tags::Psi4Real`
58 : template <typename Frame>
59 1 : struct Psi4RealCompute : Psi4Real<DataVector>, db::ComputeTag {
60 0 : using argument_tags = tmpl::list<
61 : gr::Tags::SpatialRicci<DataVector, 3, Frame>,
62 : gr::Tags::ExtrinsicCurvature<DataVector, 3, Frame>,
63 : ::Tags::deriv<gr::Tags::ExtrinsicCurvature<DataVector, 3, Frame>,
64 : tmpl::size_t<3>, Frame>,
65 : gr::Tags::SpatialMetric<DataVector, 3, Frame>,
66 : gr::Tags::InverseSpatialMetric<DataVector, 3, Frame>,
67 : domain::Tags::Coordinates<3, Frame>>;
68 :
69 0 : using return_type = Scalar<DataVector>;
70 0 : static constexpr auto function = static_cast<void (*)(
71 : gsl::not_null<Scalar<DataVector>*>, const tnsr::ii<DataVector, 3, Frame>&,
72 : const tnsr::ii<DataVector, 3, Frame>&,
73 : const tnsr::ijj<DataVector, 3, Frame>&,
74 : const tnsr::ii<DataVector, 3, Frame>&,
75 : const tnsr::II<DataVector, 3, Frame>&,
76 : const tnsr::I<DataVector, 3, Frame>&)>(&psi_4_real<Frame>);
77 0 : using base = Psi4Real<DataVector>;
78 : };
79 : } // namespace Tags
80 : } // namespace gr
|