Line data Source code
1 0 : 2 : // Distributed under the MIT License. 3 : // See LICENSE.txt for details. 4 : 5 : #pragma once 6 : 7 : #include <cstddef> 8 : 9 : #include "DataStructures/DataBox/PrefixHelpers.hpp" 10 : #include "DataStructures/DataBox/Prefixes.hpp" 11 : #include "Elliptic/BoundaryConditions/BoundaryCondition.hpp" 12 : #include "Elliptic/Protocols/FirstOrderSystem.hpp" 13 : #include "Elliptic/Systems/BnsInitialData/Equations.hpp" 14 : #include "Elliptic/Systems/BnsInitialData/Tags.hpp" 15 : #include "NumericalAlgorithms/LinearOperators/PartialDerivatives.hpp" 16 : #include "PointwiseFunctions/GeneralRelativity/TagsDeclarations.hpp" 17 : #include "Utilities/ProtocolHelpers.hpp" 18 : #include "Utilities/TMPL.hpp" 19 : 20 : namespace BnsInitialData { 21 : 22 : /*! 23 : * \brief The Irrotational Bns equations From Baumgarte and Shapiro Chapter 15 24 : * formulated as a set of coupled first-order PDEs. 25 : * 26 : * \details This system formulates the Irrotational Bns Hydrostatic Equilibrium 27 : * equations for the velocity potential \f$\Phi\f$. For a background matter 28 : * distribution (given by the specific enthalpy h) and a background metric 29 : * \f$\gamma_{ij}\f$. The velocity potential is defined by \f$D_i \Phi = h 30 : * u_i\f$ with \f$u_i\f$ (the spatial part of) the four velocity and where 31 : * \f$\Gamma^i_{jk}=\frac{1}{2}\gamma^{il}\left(\partial_j\gamma_{kl} 32 : * +\partial_k\gamma_{jl}-\partial_l\gamma_{jk}\right)\f$ are the Christoffel 33 : * symbols of the second kind of the background (spatial) metric 34 : * \f$\gamma_{ij}\f$. The 35 : * background metric \f$\gamma_{ij}\f$ and the Christoffel symbols derived from 36 : * it are assumed to be independent of the variables \f$\Phi\f$ and \f$u_i\f$, 37 : * i.e. 38 : * constant throughout an iterative elliptic solve. Additionally a background 39 : * lapse (\f$\alpha\f$) and 40 : * shift (\f$\beta\f$) must be provided. Finally, a ``rotational killing 41 : * vector" \f$k^i\f$ (with magnitude 42 : * proportional to the angular velocity of the orbital motion) is provided. The 43 : * rotational shift is defined as \f$B^i = \beta^i + k^i\f$ which is 44 : * heuristically the background 45 : * motion of the spacetime. 46 : * 47 : * The system can be formulated in terms of these fluxes and sources (see 48 : * `elliptic::protocols::FirstOrderSystem`): 49 : * 50 : * 51 : * \f{align*} 52 : * -\partial_i F^i + S = f 53 : * \f} 54 : * 55 : * \f{align*} 56 : * F^i &= D_i \phi - \frac{B^j D_j \phi}{\alpha^2}B^i \\ 57 : * S &= -F^iD_i \left( \ln \frac{\alpha \rho}{h}\right) -\Gamma^i_{ij}F^j \\ 58 : * f &= -D_i \left(\frac{C B^i}{\alpha^2}\right) - 59 : * \frac{C}{\alpha^2}B^iD_i\left( 60 : * \ln \frac{\alpha \rho}{h}\right)\\ 61 : * \f} 62 : */ 63 1 : struct FirstOrderSystem 64 : : tt::ConformsTo<elliptic::protocols::FirstOrderSystem> { 65 : private: 66 0 : using velocity_potential = Tags::VelocityPotential<DataVector>; 67 : 68 : public: 69 0 : static constexpr size_t volume_dim = 3; 70 : 71 0 : using primal_fields = tmpl::list<velocity_potential>; 72 : 73 : // We just use the standard `Flux` prefix because the fluxes don't have 74 : // symmetries and we don't need to give them a particular meaning. 75 0 : using primal_fluxes = tmpl::list< 76 : ::Tags::Flux<velocity_potential, tmpl::size_t<3>, Frame::Inertial>>; 77 : 78 0 : using background_fields = tmpl::list< 79 : gr::Tags::InverseSpatialMetric<DataVector, 3>, 80 : gr::Tags::SpatialChristoffelSecondKindContracted<DataVector, 3>, 81 : gr::Tags::Lapse<DataVector>, 82 : ::Tags::deriv<gr::Tags::Lapse<DataVector>, 83 : tmpl::integral_constant<size_t, 3>, Frame::Inertial>, 84 : gr::Tags::Shift<DataVector, 3>, 85 : ::Tags::deriv<gr::Tags::Shift<DataVector, 3>, 86 : tmpl::integral_constant<size_t, 3>, Frame::Inertial>, 87 : Tags::RotationalShift<DataVector>, 88 : Tags::DerivLogLapseTimesDensityOverSpecificEnthalpy<DataVector>, 89 : Tags::RotationalShiftStress<DataVector>>; 90 0 : using inv_metric_tag = gr::Tags::InverseSpatialMetric<DataVector, 3>; 91 : 92 0 : using fluxes_computer = Fluxes; 93 0 : using sources_computer = Sources; 94 : 95 0 : using boundary_conditions_base = 96 : elliptic::BoundaryConditions::BoundaryCondition<3>; 97 : }; 98 : } // namespace BnsInitialData