21 #ifndef FUB_GRID_AMREX_BOUNDARY_CONDITION_HPP
22 #define FUB_GRID_AMREX_BOUNDARY_CONDITION_HPP
39 template <
typename Gr
iddingAlgorithm>
struct BoundaryConditionBase {
42 virtual ~BoundaryConditionBase() =
default;
43 virtual std::unique_ptr<BoundaryConditionBase> Clone()
const = 0;
68 template <
typename BC,
69 typename = std::enable_if_t<!decays_to<BC, AnyBoundaryCondition>()>>
100 std::unique_ptr<detail::BoundaryConditionBase<GriddingAlgorithm>>
104 inline int GetSign(
int side) {
return (side == 0) - (side == 1); }
110 template <
typename Gr
iddingAlgorithm,
typename BC>
111 struct BoundaryConditionWrapper
112 :
public BoundaryConditionBase<GriddingAlgorithm> {
113 using DataReference =
typename GridTraits<GriddingAlgorithm>::DataReference;
115 BoundaryConditionWrapper(
const BC& bc) : boundary_condition_{bc} {}
116 BoundaryConditionWrapper(BC&& bc) : boundary_condition_{std::move(bc)} {}
118 std::unique_ptr<BoundaryConditionBase<GriddingAlgorithm>>
119 Clone()
const override {
120 return std::make_unique<BoundaryConditionWrapper<GriddingAlgorithm, BC>>(
121 boundary_condition_);
125 int level)
override {
126 boundary_condition_.FillBoundary(data, gridding, level);
131 boundary_condition_.FillBoundary(data, gridding, level, dir);
134 BC boundary_condition_;
138 template <
typename Gr
iddingAlgorithm>
141 : boundary_condition_(other.boundary_condition_
142 ? other.boundary_condition_->Clone()
145 template <
typename Gr
iddingAlgorithm>
150 return *
this = std::move(tmp);
153 template <
typename Gr
iddingAlgorithm>
154 template <
typename BC,
typename>
156 : boundary_condition_{std::make_unique<detail::BoundaryConditionWrapper<
159 template <
typename Gr
iddingAlgorithm>
162 if (boundary_condition_) {
163 boundary_condition_->FillBoundary(data, gridding, level);
167 template <
typename Gr
iddingAlgorithm>
171 if (boundary_condition_) {
172 boundary_condition_->FillBoundary(data, gridding, level, dir);
This is a polymorphic value type that wraps any BoundaryCondition object.
Definition: AnyBoundaryCondition.hpp:55
AnyBoundaryCondition()=default
This constructs a method that does nothing on invocation.
AnyBoundaryCondition(AnyBoundaryCondition &&)=default
Moves the other object without allocating and leaves an empty method.
AnyBoundaryCondition & operator=(const AnyBoundaryCondition &other)
Copies the implementation.
Definition: AnyBoundaryCondition.hpp:147
AnyBoundaryCondition & operator=(AnyBoundaryCondition &&)=default
Moves the other object without allocating and leaves an empty method.
std::unique_ptr< detail::BoundaryConditionBase< GriddingAlgorithm > > boundary_condition_
Definition: AnyBoundaryCondition.hpp:101
void FillBoundary(DataReference data, const GriddingAlgorithm &gridding, int level)
Fill the boundary layer of data.
Definition: AnyBoundaryCondition.hpp:160
typename GridTraits< GriddingAlgorithm >::DataReference DataReference
Definition: AnyBoundaryCondition.hpp:57
The fub namespace.
Definition: AnyBoundaryCondition.hpp:31
int GetSign(int side)
Definition: AnyBoundaryCondition.hpp:104
Direction
This is a type safe type to denote a dimensional split direction.
Definition: Direction.hpp:30