SpECTRE Documentation Coverage Report
Current view: top level - Domain/Creators - FrustalCloak.hpp Coverage Total Hit
Commit: 0d1d717af84a81fb1284a20c4013708fe85cc2f0 Lines: 9.6 % 52 5
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 class FrustalCloak.
       6              : 
       7              : #pragma once
       8              : 
       9              : #include <array>
      10              : #include <cstddef>
      11              : #include <memory>
      12              : #include <vector>
      13              : 
      14              : #include "Domain/BoundaryConditions/BoundaryCondition.hpp"
      15              : #include "Domain/BoundaryConditions/GetBoundaryConditionsBase.hpp"
      16              : #include "Domain/Creators/DomainCreator.hpp"
      17              : #include "Domain/Domain.hpp"
      18              : #include "Domain/Structure/DirectionMap.hpp"
      19              : #include "Options/Context.hpp"
      20              : #include "Options/String.hpp"
      21              : #include "Utilities/TMPL.hpp"
      22              : 
      23              : /// \cond
      24              : namespace domain {
      25              : namespace CoordinateMaps {
      26              : class Frustum;
      27              : }  // namespace CoordinateMaps
      28              : 
      29              : template <typename SourceFrame, typename TargetFrame, typename... Maps>
      30              : class CoordinateMap;
      31              : }  // namespace domain
      32              : /// \endcond
      33              : 
      34              : namespace domain {
      35              : namespace creators {
      36              : /*!
      37              :  * \brief Create a 3D cubical domain with two equal-sized abutting excised cubes
      38              :  * in the center. This is done by combining ten frusta.
      39              :  *
      40              :  * \image html FrustalCloak.png "A slice through the frustal cloak."
      41              :  */
      42            1 : class FrustalCloak : public DomainCreator<3> {
      43              :  public:
      44            0 :   using maps_list =
      45              :       tmpl::list<domain::CoordinateMap<Frame::BlockLogical, Frame::Inertial,
      46              :                                        domain::CoordinateMaps::Frustum>>;
      47              : 
      48            0 :   struct InitialRefinement {
      49            0 :     using type = size_t;
      50            0 :     static constexpr Options::String help = {
      51              :         "Initial refinement level in each dimension."};
      52              :   };
      53              : 
      54            0 :   struct InitialGridPoints {
      55            0 :     using type = std::array<size_t, 2>;
      56            0 :     static constexpr Options::String help = {
      57              :         "Initial number of grid points in [r,angular]."};
      58              :   };
      59              : 
      60            0 :   struct UseEquiangularMap {
      61            0 :     using type = bool;
      62            0 :     static constexpr Options::String help = {
      63              :         "Use equiangular instead of equidistant coordinates."};
      64              :   };
      65              : 
      66            0 :   struct ProjectionFactor {
      67            0 :     using type = double;
      68            0 :     static constexpr Options::String help = {"Grid compression factor."};
      69              :   };
      70              : 
      71            0 :   struct LengthInnerCube {
      72            0 :     using type = double;
      73            0 :     static constexpr Options::String help = {"Side length of each inner cube."};
      74            0 :     static constexpr type lower_bound() { return 0.0; }
      75              :   };
      76              : 
      77            0 :   struct LengthOuterCube {
      78            0 :     using type = double;
      79            0 :     static constexpr Options::String help = {"Side length of the outer cube."};
      80            0 :     static constexpr type lower_bound() { return 0.0; }
      81              :   };
      82              : 
      83            0 :   struct OriginPreimage {
      84            0 :     using type = std::array<double, 3>;
      85            0 :     static constexpr Options::String help = {"The origin preimage in [x,y,z]."};
      86              :   };
      87              : 
      88              :   template <typename BoundaryConditionsBase>
      89            0 :   struct BoundaryCondition {
      90            0 :     static std::string name() { return "BoundaryCondition"; }
      91            0 :     static constexpr Options::String help =
      92              :         "The boundary condition to impose on all sides.";
      93            0 :     using type = std::unique_ptr<BoundaryConditionsBase>;
      94              :   };
      95              : 
      96            0 :   using basic_options =
      97              :       tmpl::list<InitialRefinement, InitialGridPoints, UseEquiangularMap,
      98              :                  ProjectionFactor, LengthInnerCube, LengthOuterCube,
      99              :                  OriginPreimage>;
     100              : 
     101              :   template <typename Metavariables>
     102            0 :   using options = tmpl::conditional_t<
     103              :       domain::BoundaryConditions::has_boundary_conditions_base_v<
     104              :           typename Metavariables::system>,
     105              :       tmpl::push_back<
     106              :           basic_options,
     107              :           BoundaryCondition<
     108              :               domain::BoundaryConditions::get_boundary_conditions_base<
     109              :                   typename Metavariables::system>>>,
     110              :       basic_options>;
     111              : 
     112            0 :   static constexpr Options::String help{
     113              :       "Creates a cubical domain with two equal-sized abutting excised cubes\n"
     114              :       "in the center. This is done by combining ten frusta. The parameter\n"
     115              :       "`UseEquiangularMap` can be used to apply a tangent mapping to the xi\n"
     116              :       "and eta logical coordinates of each frustum, while the parameter\n"
     117              :       "`ProjectionFactor` can be used to apply a projective map to the zeta\n"
     118              :       "logical coordinate of each frustum. Increasing the\n"
     119              :       "`ProjectionFactor` value can give better gridpoint spacings in the\n"
     120              :       "z direction. The user also specifies values for `LengthInnerCube` and\n"
     121              :       "`LengthOuterCube`. This will create a cubical Domain of side"
     122              :       "length `LengthOuterCube` with the center excised. The size of the\n"
     123              :       "excised region is determined by the value set for `LengthInnerCube`.\n"
     124              :       "`OriginPreimage` moves the blocks such that the origin preimage is\n"
     125              :       "mapped to the origin. Note that the abutting excised cubes share a\n"
     126              :       "face in the x-direction. This Domain is primarily for testing the\n"
     127              :       "frustal cloak in the BinaryCompactObject Domain."};
     128              : 
     129            0 :   FrustalCloak(typename InitialRefinement::type initial_refinement_level,
     130              :                typename InitialGridPoints::type initial_number_of_grid_points,
     131              :                typename UseEquiangularMap::type use_equiangular_map = false,
     132              :                typename ProjectionFactor::type projection_factor = 1.0,
     133              :                typename LengthInnerCube::type length_inner_cube = 0.0,
     134              :                typename LengthOuterCube::type length_outer_cube = 0.0,
     135              :                typename OriginPreimage::type origin_preimage = {{0.0, 0.0,
     136              :                                                                  0.0}},
     137              :                std::unique_ptr<domain::BoundaryConditions::BoundaryCondition>
     138              :                    boundary_condition = nullptr,
     139              :                const Options::Context& context = {});
     140              : 
     141            0 :   FrustalCloak() = default;
     142            0 :   FrustalCloak(const FrustalCloak&) = delete;
     143            0 :   FrustalCloak(FrustalCloak&&) = default;
     144            0 :   FrustalCloak& operator=(const FrustalCloak&) = delete;
     145            0 :   FrustalCloak& operator=(FrustalCloak&&) = default;
     146            0 :   ~FrustalCloak() override = default;
     147              : 
     148            0 :   Domain<3> create_domain() const override;
     149              : 
     150              :   std::vector<DirectionMap<
     151              :       3, std::unique_ptr<domain::BoundaryConditions::BoundaryCondition>>>
     152            1 :   external_boundary_conditions() const override;
     153              : 
     154            1 :   std::vector<std::array<size_t, 3>> initial_extents() const override;
     155              : 
     156            1 :   std::vector<std::array<size_t, 3>> initial_refinement_levels() const override;
     157              : 
     158              :  private:
     159            0 :   typename InitialRefinement::type initial_refinement_level_{};
     160            0 :   typename InitialGridPoints::type initial_number_of_grid_points_{};
     161            0 :   typename UseEquiangularMap::type use_equiangular_map_ = false;
     162            0 :   typename ProjectionFactor::type projection_factor_{};
     163            0 :   typename LengthInnerCube::type length_inner_cube_{0.0};
     164            0 :   typename LengthOuterCube::type length_outer_cube_{0.0};
     165            0 :   typename OriginPreimage::type origin_preimage_{{0.0, 0.0, 0.0}};
     166              :   std::unique_ptr<domain::BoundaryConditions::BoundaryCondition>
     167            0 :       boundary_condition_;
     168              : };
     169              : }  // namespace creators
     170              : }  // namespace domain
        

Generated by: LCOV version 2.0-1