Line data Source code
1 1 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : /// \file 5 : /// Defines class Poisson::FirstOrderSystem 6 : 7 : #pragma once 8 : 9 : #include <cstddef> 10 : 11 : #include "DataStructures/DataBox/PrefixHelpers.hpp" 12 : #include "DataStructures/DataBox/Prefixes.hpp" 13 : #include "Elliptic/BoundaryConditions/BoundaryCondition.hpp" 14 : #include "Elliptic/Protocols/FirstOrderSystem.hpp" 15 : #include "Elliptic/Systems/Poisson/Equations.hpp" 16 : #include "Elliptic/Systems/Poisson/Geometry.hpp" 17 : #include "Elliptic/Systems/Poisson/Tags.hpp" 18 : #include "NumericalAlgorithms/LinearOperators/PartialDerivatives.hpp" 19 : #include "PointwiseFunctions/GeneralRelativity/TagsDeclarations.hpp" 20 : #include "Utilities/ProtocolHelpers.hpp" 21 : #include "Utilities/TMPL.hpp" 22 : 23 : namespace Poisson { 24 : 25 : /*! 26 : * \brief The Poisson equation formulated as a set of coupled first-order PDEs. 27 : * 28 : * \details This system formulates the Poisson equation \f$-\Delta_\gamma u(x) = 29 : * f(x)\f$ on a background metric \f$\gamma_{ij}\f$ as the set of coupled 30 : * first-order PDEs 31 : * 32 : * \f{align*} 33 : * -\partial_i v^i - \Gamma^i_{ij} v^j = f(x) \\ 34 : * v^i = \gamma^{ij} \partial_j u(x) 35 : * \f} 36 : * 37 : * where \f$\Gamma^i_{jk}=\frac{1}{2}\gamma^{il}\left(\partial_j\gamma_{kl} 38 : * +\partial_k\gamma_{jl}-\partial_l\gamma_{jk}\right)\f$ are the Christoffel 39 : * symbols of the second kind of the background metric \f$\gamma_{ij}\f$. The 40 : * background metric \f$\gamma_{ij}\f$ and the Christoffel symbols derived from 41 : * it are assumed to be independent of the variables \f$u\f$, i.e. 42 : * constant throughout an iterative elliptic solve. 43 : * 44 : * The system can be formulated in terms of these fluxes and sources (see 45 : * `elliptic::protocols::FirstOrderSystem`): 46 : * 47 : * \f{align*} 48 : * F^i &= v^i = \gamma^{ij} \partial_j u \\ 49 : * S &= -\Gamma^i_{ij} v^j \\ 50 : * f &= f(x) \text{.} 51 : * \f} 52 : * 53 : * The fluxes and sources simplify significantly when the background metric is 54 : * flat and we employ Cartesian coordinates so \f$\gamma_{ij} = \delta_{ij}\f$ 55 : * and \f$\Gamma^i_{jk} = 0\f$. Set the template parameter `BackgroundGeometry` 56 : * to `Poisson::Geometry::FlatCartesian` to specialize the system for this case. 57 : * Set it to `Poisson::Geometry::Curved` for the general case. 58 : * 59 : * ## Complex Poisson equation 60 : * 61 : * This system can also be used to solve the complex Poisson equation where 62 : * $u(x)$ and $f(x)$ are complex-valued, by setting the `DataType` template 63 : * parameter to `ComplexDataVector`. Note that the real and imaginary sectors of 64 : * the equations decouple, so they are essentially two independent Poisson 65 : * equations. This is useful for testing the elliptic solver with complex-valued 66 : * fields, and also as building blocks for other Poisson-like systems of 67 : * equations that have additional complex-valued source terms. 68 : */ 69 : template <size_t Dim, Geometry BackgroundGeometry, 70 : typename DataType = DataVector> 71 1 : struct FirstOrderSystem 72 : : tt::ConformsTo<elliptic::protocols::FirstOrderSystem> { 73 0 : static constexpr size_t volume_dim = Dim; 74 : 75 0 : using primal_fields = tmpl::list<Tags::Field<DataType>>; 76 : // We just use the standard `Flux` prefix because the fluxes don't have 77 : // symmetries and we don't need to give them a particular meaning. 78 0 : using primal_fluxes = tmpl::list< 79 : ::Tags::Flux<Tags::Field<DataType>, tmpl::size_t<Dim>, Frame::Inertial>>; 80 : 81 0 : using background_fields = tmpl::conditional_t< 82 : BackgroundGeometry == Geometry::FlatCartesian, tmpl::list<>, 83 : tmpl::list< 84 : gr::Tags::InverseSpatialMetric<DataVector, Dim>, 85 : gr::Tags::SpatialChristoffelSecondKindContracted<DataVector, Dim>>>; 86 0 : using inv_metric_tag = 87 : tmpl::conditional_t<BackgroundGeometry == Geometry::FlatCartesian, void, 88 : gr::Tags::InverseSpatialMetric<DataVector, Dim>>; 89 : 90 0 : using fluxes_computer = Fluxes<Dim, BackgroundGeometry, DataType>; 91 0 : using sources_computer = 92 : tmpl::conditional_t<BackgroundGeometry == Geometry::FlatCartesian, void, 93 : Sources<Dim, BackgroundGeometry, DataType>>; 94 : 95 0 : using boundary_conditions_base = 96 : elliptic::BoundaryConditions::BoundaryCondition<Dim>; 97 0 : using modify_boundary_data = void; 98 : }; 99 : } // namespace Poisson