21 #ifndef FUB_AMREX_CUTCELL_BOUNDARY_CONDITION_REFLECTIVE_BOUNDARY_HPP
22 #define FUB_AMREX_CUTCELL_BOUNDARY_CONDITION_REFLECTIVE_BOUNDARY_HPP
51 template <
typename Tag,
typename Equation>
55 : equation_{
Local<Tag,
Equation>{equation}}, dir_{dir}, side_{side} {}
57 template <
typename Tag,
typename Equation>
62 FillBoundary(mf, gridding, level);
66 template <
typename Tag,
typename Equation>
70 const int ngrow = mf.nGrow(
int(dir_));
71 ::amrex::Box grown_box = geom.growNonPeriodicDomain(ngrow);
72 ::amrex::BoxList boundaries =
73 ::amrex::complementIn(grown_box, ::amrex::BoxList{geom.Domain()});
74 if (boundaries.isEmpty()) {
77 static constexpr
int Rank = Equation::Rank();
78 static constexpr std::size_t sRank =
static_cast<std::size_t
>(Rank);
79 const Eigen::Matrix<double, Rank, 1> unit = UnitVector<Rank>(dir_);
80 const ::amrex::MultiFab& alphas =
82 ForEachFab(Tag(), mf, [&](const ::amrex::MFIter& mfi) {
86 ::amrex::FArrayBox& fab = mf[mfi];
87 const ::amrex::FArrayBox& alpha = alphas[mfi];
90 ::amrex::shift(boundary,
int(dir_),
GetSign(side_) * ngrow);
91 if (!geom.Domain().intersects(shifted)) {
94 ::amrex::Box box_to_fill = mfi.growntilebox() & boundary;
95 if (!box_to_fill.isEmpty()) {
97 MakeView<Complete<Equation>>(fab, *equation_, mfi.growntilebox());
98 auto box = AsIndexBox<Rank>(box_to_fill);
100 std::array<std::ptrdiff_t, sRank> dest{is...};
101 std::array<std::ptrdiff_t, sRank> src =
104 AMREX_D_DECL(
int(src[0]),
int(src[1]),
int(src[2]))};
105 ::amrex::IntVect dest_iv{
106 AMREX_D_DECL(
int(dest[0]),
int(dest[1]),
int(dest[2]))};
107 if (alpha(dest_iv) > 0.0 && alpha(iv) > 0.0) {
108 Load(state, states, src);
110 Reflect(reflected, state, unit, *equation_);
111 Store(states, reflected, dest);
113 Store(states, zeros, dest);
121 template <
typename Tag,
typename Equation>
123 ->ReflectiveBoundary<Tag,
Equation>;
#define FUB_ASSERT(x)
Definition: assert.hpp:39
const ::amrex::Geometry & GetGeometry(int level) const
Returns a Geometry object for a specified level.
void FillBoundary(::amrex::MultiFab &mf, const GriddingAlgorithm &gridding, int level)
Definition: AMReX/boundary_condition/ReflectiveBoundary.hpp:97
This class modifies and initializes a cutcell::PatchLevel in a cutcell::PatchHierarchy.
Definition: AMReX/cutcell/GriddingAlgorithm.hpp:56
const PatchHierarchy & GetPatchHierarchy() const noexcept
Definition: AMReX/cutcell/boundary_condition/ReflectiveBoundary.hpp:35
ReflectiveBoundary(Tag, const Equation &equation, Direction dir, int side)
Definition: AMReX/cutcell/boundary_condition/ReflectiveBoundary.hpp:52
int side_
Definition: AMReX/cutcell/boundary_condition/ReflectiveBoundary.hpp:48
void FillBoundary(::amrex::MultiFab &mf, const GriddingAlgorithm &gridding, int level)
Definition: AMReX/cutcell/boundary_condition/ReflectiveBoundary.hpp:67
Direction dir_
Definition: AMReX/cutcell/boundary_condition/ReflectiveBoundary.hpp:47
Local< Tag, Equation > equation_
Definition: AMReX/cutcell/boundary_condition/ReflectiveBoundary.hpp:46
ReflectiveBoundary(const Equation &, Direction, int) -> ReflectiveBoundary< execution::SequentialTag, Equation >
void ForEachFab(Tag, const ::amrex::FabArrayBase &fabarray, F function)
Iterate through all local FArrayBox objects in a MultiFab.
Definition: ForEachFab.hpp:34
Definition: FillCutCellData.hpp:30
void ForEachIndex(const ::amrex::Box &box, F function)
Definition: ForEachIndex.hpp:29
Index< 1 > ReflectIndex(Index< 1 > i, const IndexBox< 1 > &domain, Direction dir, int side)
void Load(State &state, const BasicView< const State, Layout, Rank > &view, const std::array< std::ptrdiff_t, State::Equation::Rank()> &index)
Definition: State.hpp:640
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
void Reflect(Complete< IdealGasMix< 1 >> &reflected, const Complete< IdealGasMix< 1 >> &state, const Eigen::Matrix< double, 1, 1 > &normal, const IdealGasMix< 1 > &gas)
void Store(const BasicView< Conservative< Eq >, Layout, Eq::Rank()> &view, const Conservative< Eq > &state, const std::array< std::ptrdiff_t, Eq::Rank()> &index)
Definition: State.hpp:663
IndexBox< Rank > Box(const BasicView< State, Layout, Rank > &view)
Definition: State.hpp:486
typename detail::LocalType< Tag, T >::type Local
Definition: Execution.hpp:56