SpECTRE Documentation Coverage Report
Current view: top level - NumericalAlgorithms/Spectral - LogicalCoordinates.hpp Coverage Total Hit
Commit: 0d1d717af84a81fb1284a20c4013708fe85cc2f0 Lines: 50.0 % 8 4
Test Date: 2026-10-22 17:29:42
Legend: Lines:     hit not hit

            Line data    Source code
       1            1 : // Distributed under the MIT License.
       2              : // See LICENSE.txt for details.
       3              : 
       4              : /// \file
       5              : /// Defines functions logical_coordinates and interface_logical_coordinates
       6              : 
       7              : #pragma once
       8              : 
       9              : #include <cstddef>
      10              : 
      11              : #include "DataStructures/DataBox/Tag.hpp"
      12              : #include "DataStructures/Tensor/TypeAliases.hpp"
      13              : #include "Utilities/TMPL.hpp"
      14              : 
      15              : /// \cond
      16              : namespace domain {
      17              : namespace Tags {
      18              : template<size_t Dim>
      19              : struct Mesh;
      20              : template <size_t, typename>
      21              : struct Coordinates;
      22              : }  // namespace Tags
      23              : }  // namespace domain
      24              : 
      25              : template <size_t Dim>
      26              : class Mesh;
      27              : class DataVector;
      28              : template <size_t Dim>
      29              : class Direction;
      30              : 
      31              : namespace gsl {
      32              : template <typename>
      33              : struct not_null;
      34              : }  // namespace gsl
      35              : /// \endcond
      36              : 
      37              : /// @{
      38              : /*!
      39              :  * \ingroup ComputationalDomainGroup
      40              :  * \brief Compute the logical coordinates of a Mesh in an Element.
      41              :  *
      42              :  * \details The logical coordinates are the collocation points
      43              :  * associated with the Spectral::Basis and Spectral::Quadrature of the \p mesh.
      44              :  * The Spectral::Basis determines the domain of the logical coordinates, while
      45              :  * the Spectral::Quadrature determines their distribution.  For Legendre or
      46              :  * Chebyshev bases, the logical coordinates are in the interval \f$[-1, 1]\f$.
      47              :  * These bases may have either GaussLobatto or Gauss quadrature, which are not
      48              :  * uniformly distributed, and either include (GaussLobatto) or do not include
      49              :  * (Gauss) the end points.  For the FiniteDifference basis, the logical
      50              :  * coordinates are again in the interval \f$[-1, 1]\f$.  This basis may have
      51              :  * either FaceCentered or CellCentered quadrature, which are uniformly
      52              :  * distributed, and either include (FaceCentered) or do not include
      53              :  * (CellCentered) the end points. The Fourier basis has logical coordinates
      54              :  * in the interval \f$[0, 2 \pi]\f$. The SphericalHarmonic basis corresponds to
      55              :  * the spherical coordinates \f$(\theta, \phi)\f$ where the polar angle
      56              :  * \f$\theta\f$ is in the interval \f$[0, \pi]\f$ and the azimuth \f$\phi\f$ is
      57              :  * in the interval \f$[0, 2 \pi]\f$.  The polar angle has Gauss quadrature
      58              :  * corresponding to the Legendre Gauss points of \f$\cos \theta\f$ (and thus
      59              :  * have no points at the poles), while the azimuth has Equiangular quadrature
      60              :  * which are distributed uniformly including the left endpoint, but not the
      61              :  * right. For the Cartoon basis, only one logical coordinate is allowed and it
      62              :  * is never used for computations. The Zernike bases have the radial basis
      63              :  * implemented such that the logical coordinates are \f$[-1, 1]\f$, while
      64              :  * an affine map is internally used to go to \f$[0, 1]\f$, where these bases are
      65              :  * defined. Being a scaled one-sided Jacobi polynomial, the gridpoint are
      66              :  * shifted to upper \f$r\f$, and GaussRadauUpper quadrature has been implemented
      67              :  * such that the lower edge does not have an end point but the upper does.
      68              :  *
      69              :  * \example
      70              :  * \snippet Test_LogicalCoordinates.cpp logical_coordinates_example
      71              :  */
      72              : template <size_t VolumeDim>
      73            1 : void logical_coordinates(
      74              :     gsl::not_null<tnsr::I<DataVector, VolumeDim, Frame::ElementLogical>*>
      75              :         logical_coords,
      76              :     const Mesh<VolumeDim>& mesh);
      77              : 
      78              : template <size_t VolumeDim>
      79            1 : tnsr::I<DataVector, VolumeDim, Frame::ElementLogical> logical_coordinates(
      80              :     const Mesh<VolumeDim>& mesh);
      81              : /// @}
      82              : 
      83              : namespace domain {
      84              : namespace Tags {
      85              : /// \ingroup DataBoxTagsGroup
      86              : /// \ingroup ComputationalDomainGroup
      87              : /// The logical coordinates in the Element
      88              : template <size_t VolumeDim>
      89            1 : struct LogicalCoordinates : Coordinates<VolumeDim, Frame::ElementLogical>,
      90              :                             db::ComputeTag {
      91            0 :   using base = Coordinates<VolumeDim, Frame::ElementLogical>;
      92            0 :   using return_type = typename base::type;
      93            0 :   using argument_tags = tmpl::list<Mesh<VolumeDim>>;
      94            0 :   static constexpr auto function = static_cast<void (*)(
      95              :       gsl::not_null<return_type*>, const ::Mesh<VolumeDim>&)>(
      96              :       &logical_coordinates<VolumeDim>);
      97              : };
      98              : }  // namespace Tags
      99              : }  // namespace domain
        

Generated by: LCOV version 2.0-1