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