Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <memory>
7 : #include <pup.h>
8 :
9 : #include "Domain/BoundaryConditions/BoundaryCondition.hpp"
10 : #include "Options/String.hpp"
11 : #include "Utilities/Serialization/CharmPupable.hpp"
12 : #include "Utilities/TMPL.hpp"
13 :
14 : namespace domain::BoundaryConditions {
15 : /// Mark a boundary condition as being periodic.
16 : ///
17 : /// Periodic boundary conditions shouldn't require any implementation outside of
18 : /// a check in the domain creator using the `is_periodic()` function to
19 : /// determine what boundaries are periodic. Across each matching pair of
20 : /// periodic boundary conditions, the domain creator should specify that the DG
21 : /// elements are neighbors of each other.
22 1 : class MarkAsPeriodic {
23 : public:
24 0 : MarkAsPeriodic() = default;
25 0 : MarkAsPeriodic(MarkAsPeriodic&&) = default;
26 0 : MarkAsPeriodic& operator=(MarkAsPeriodic&&) = default;
27 0 : MarkAsPeriodic(const MarkAsPeriodic&) = default;
28 0 : MarkAsPeriodic& operator=(const MarkAsPeriodic&) = default;
29 0 : virtual ~MarkAsPeriodic() = 0;
30 : };
31 :
32 : /*!
33 : * \brief Periodic boundary conditions.
34 : *
35 : * To use with a specific system add:
36 : *
37 : * \code
38 : * domain::BoundaryConditions::Periodic<your::system::BoundaryConditionBase>
39 : * \endcode
40 : *
41 : * to the list of creatable classes.
42 : *
43 : * \note Not all domain creators will allow you to specify periodic boundary
44 : * conditions since they may not make sense.
45 : */
46 : template <typename SystemBoundaryConditionBaseClass>
47 1 : struct Periodic final : public SystemBoundaryConditionBaseClass,
48 : public MarkAsPeriodic {
49 : public:
50 0 : using options = tmpl::list<>;
51 0 : static constexpr Options::String help{
52 : "Periodic boundary conditions.\n\nNote: Not all domain creators will "
53 : "allow you to specify periodic boundary conditions since they may not "
54 : "make sense."};
55 0 : static std::string name() { return "Periodic"; }
56 :
57 0 : Periodic() = default;
58 0 : Periodic(Periodic&&) = default;
59 0 : Periodic& operator=(Periodic&&) = default;
60 0 : Periodic(const Periodic&) = default;
61 0 : Periodic& operator=(const Periodic&) = default;
62 0 : ~Periodic() override = default;
63 :
64 0 : explicit Periodic(CkMigrateMessage* msg);
65 :
66 0 : WRAPPED_PUPable_decl_base_template(
67 : domain::BoundaryConditions::BoundaryCondition, Periodic);
68 :
69 0 : auto get_clone() const -> std::unique_ptr<
70 : domain::BoundaryConditions::BoundaryCondition> override;
71 :
72 0 : void pup(PUP::er& p) override;
73 : };
74 :
75 : template <typename SystemBoundaryConditionBaseClass>
76 : Periodic<SystemBoundaryConditionBaseClass>::Periodic(
77 : CkMigrateMessage* const msg)
78 : : SystemBoundaryConditionBaseClass(msg) {}
79 :
80 : template <typename SystemBoundaryConditionBaseClass>
81 : std::unique_ptr<domain::BoundaryConditions::BoundaryCondition>
82 : Periodic<SystemBoundaryConditionBaseClass>::get_clone() const {
83 : return std::make_unique<Periodic>(*this);
84 : }
85 :
86 : template <typename SystemBoundaryConditionBaseClass>
87 : void Periodic<SystemBoundaryConditionBaseClass>::pup(PUP::er& p) {
88 : BoundaryCondition::pup(p);
89 : }
90 :
91 : /// \cond
92 : template <typename SystemBoundaryConditionBaseClass>
93 : // NOLINTNEXTLINE
94 : PUP::able::PUP_ID Periodic<SystemBoundaryConditionBaseClass>::my_PUP_ID = 0;
95 : /// \endcond
96 :
97 : /// Check if a boundary condition inherits from `MarkAsPeriodic`, which
98 : /// constitutes as it being marked as a periodic boundary condition.
99 1 : bool is_periodic(const std::unique_ptr<BoundaryCondition>& boundary_condition);
100 : } // namespace domain::BoundaryConditions
|