21 #ifndef FUB_AMREX_MULTI_BLOCK_BOUNDARY2_HPP
22 #define FUB_AMREX_MULTI_BLOCK_BOUNDARY2_HPP
31 #include <AMReX_MultiFab.H>
37 class MultiBlockGriddingAlgorithm2;
44 const ::amrex::FArrayBox& plenum_mirror_data) = 0;
47 const ::amrex::FArrayBox& tube_mirror_data) = 0;
49 virtual std::unique_ptr<MultiBlockBoundaryBase>
Clone()
const = 0;
52 template <
typename Boundary>
57 std::unique_ptr<MultiBlockBoundaryBase>
Clone() const override final {
58 return std::make_unique<MultiBlockBoundaryWrapper>(*
impl_);
62 ::amrex::FArrayBox& tube_ghost_data,
63 const ::amrex::FArrayBox& plenum_mirror_data)
override final {
64 impl_->FillTubeGhostLayer(tube_ghost_data, plenum_mirror_data);
67 ::amrex::FArrayBox& plenum_ghost_data,
68 const ::amrex::FArrayBox& tube_mirror_data)
override final {
69 impl_->FillPlenumGhostLayer(plenum_ghost_data, tube_mirror_data);
72 std::unique_ptr<Boundary>
impl_;
84 template <
typename Boundary>
89 std::move(boundary))),
140 std::unique_ptr<MultiBlockBoundaryBase>
impl_;
157 template <
typename TubeEquation,
typename PlenumEquation>
162 dest.density = src.density;
163 for (
int i = 0; i < dest.momentum.size(); ++i) {
164 dest.momentum[i] = src.momentum[i];
166 dest.species = src.species;
167 dest.energy = src.energy;
171 template <
typename PlenumEquation,
typename TubeEquation>
175 dest.density = src.density;
176 dest.momentum.setZero();
177 for (
int i = 0; i < src.momentum.size(); ++i) {
178 dest.momentum[i] = src.momentum[i];
180 dest.species = src.species;
181 dest.energy = src.energy;
185 template <
typename TubeEquation,
typename PlenumEquation>
187 static_assert(TubeEquation::Rank() <= PlenumEquation::Rank());
190 const PlenumEquation& plenum_equation)
201 ::amrex::FArrayBox& tube_ghost_data,
202 const ::amrex::FArrayBox& plenum_mirror_data) {
203 BasicView cons_states = MakeView<const Conservative<PlenumEquation>>(
206 MakeView<Complete<TubeEquation>>(tube_ghost_data,
tube_equation_);
209 const std::ptrdiff_t i0 = plenum_mirror_data.box().smallEnd(0);
210 const std::ptrdiff_t j0 = tube_ghost_data.box().smallEnd(0);
211 ForEachIndex(Box<0>(complete_states), [&](std::ptrdiff_t j) {
212 const std::ptrdiff_t k = j - j0;
213 const std::ptrdiff_t i = i0 + k;
214 Load(cons, cons_states, {i});
215 if (cons.density > 0.0) {
217 Store(complete_states, complete, {j});
223 ::amrex::FArrayBox& plenum_ghost_data,
224 const ::amrex::FArrayBox& tube_mirror_data) {
226 MakeView<const Conservative<TubeEquation>>(tube_mirror_data,
tube_equation_);
231 const std::ptrdiff_t i0 = Box<0>(cons_states).lower[0];
232 const std::ptrdiff_t j0 = Box<0>(complete_states).lower[0];
233 ForEachIndex(Box<0>(cons_states), [&](std::ptrdiff_t i) {
234 const std::ptrdiff_t k = i - i0;
235 const std::ptrdiff_t j = j0 + k;
236 Load(cons, cons_states, {i});
237 if (cons.density > 0.0) {
239 Store(complete_states, complete, {j});
Definition: MultiBlockBoundary2.hpp:77
void FillBoundary(::amrex::MultiFab &mf, const cutcell::GriddingAlgorithm &gridding, int level, Direction dir)
Definition: MultiBlockBoundary2.hpp:115
int gcw_
Definition: MultiBlockBoundary2.hpp:154
void FillBoundary(::amrex::MultiFab &mf, const cutcell::GriddingAlgorithm &gridding, int level)
Assuming that mf represents a MultiFab living in the higher dimensional plenum simulation its ghost l...
AnyMultiBlockBoundary(Boundary boundary, const MultiBlockGriddingAlgorithm2 &gridding, const BlockConnection &connection, int gcw, int level)
Constructs coupled boundary states by pre computing mirror and ghost states for each of the specified...
Definition: MultiBlockBoundary2.hpp:85
std::unique_ptr<::amrex::FArrayBox > plenum_mirror_data_
Definition: MultiBlockBoundary2.hpp:145
int level_
Definition: MultiBlockBoundary2.hpp:153
void FillBoundary(::amrex::MultiFab &mf, const GriddingAlgorithm &gridding, int level)
Assuming that mf represents a MultiFab living in the one dimensional tube simulation its ghost layer ...
Direction dir_
Definition: MultiBlockBoundary2.hpp:151
::amrex::Box plenum_mirror_box_
Definition: MultiBlockBoundary2.hpp:142
AnyMultiBlockBoundary(const AnyMultiBlockBoundary &other)
void ComputeBoundaryData(const cutcell::PatchHierarchy &plenum, const PatchHierarchy &tube)
Precompute Boundary states for each domain.
::amrex::Box tube_mirror_box_
Definition: MultiBlockBoundary2.hpp:143
std::unique_ptr<::amrex::FArrayBox > tube_ghost_data_
Definition: MultiBlockBoundary2.hpp:146
void Initialize(const MultiBlockGriddingAlgorithm2 &gridding, const BlockConnection &connection, int gcw, int level)
void FillBoundary(::amrex::MultiFab &mf, const GriddingAlgorithm &gridding, int level, Direction dir)
Definition: MultiBlockBoundary2.hpp:129
int side_
Definition: MultiBlockBoundary2.hpp:152
std::unique_ptr<::amrex::FArrayBox > tube_mirror_data_
Definition: MultiBlockBoundary2.hpp:148
std::unique_ptr< MultiBlockBoundaryBase > impl_
Definition: MultiBlockBoundary2.hpp:140
std::unique_ptr<::amrex::FArrayBox > plenum_ghost_data_
Definition: MultiBlockBoundary2.hpp:149
This class modifies and initializes a PatchLevel in a PatchHierarchy.
Definition: AMReX/GriddingAlgorithm.hpp:60
Definition: MultiBlockGriddingAlgorithm2.hpp:37
The PatchHierarchy holds simulation data on multiple refinement levels.
Definition: AMReX/PatchHierarchy.hpp:156
This class modifies and initializes a cutcell::PatchLevel in a cutcell::PatchHierarchy.
Definition: AMReX/cutcell/GriddingAlgorithm.hpp:56
Definition: AMReX/cutcell/PatchHierarchy.hpp:139
void CompleteFromCons(Equation &&equation, Complete< std::decay_t< Equation >> &complete, const Conservative< std::decay_t< Equation >> &cons)
Definition: CompleteFromCons.hpp:42
The amrex namespace.
Definition: AverageState.hpp:33
void ForEachIndex(const ::amrex::Box &box, F function)
Definition: ForEachIndex.hpp:29
void ReduceStateDimension(TubeEquation &tube_equation, Complete< TubeEquation > &dest, PlenumEquation &, const Conservative< PlenumEquation > &src)
Definition: MultiBlockBoundary2.hpp:158
void EmbedState(PlenumEquation &plenum_equation, Complete< PlenumEquation > &dest, TubeEquation &, const Conservative< TubeEquation > &src)
Definition: MultiBlockBoundary2.hpp:172
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
Direction
This is a type safe type to denote a dimensional split direction.
Definition: Direction.hpp:30
const Conservative< Eq > & AsCons(const Conservative< Eq > &x)
Definition: State.hpp:438
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
Definition: State.hpp:403
This type has a constructor which takes an equation and might allocate any dynamically sized member v...
Definition: State.hpp:335
This type has a constructor which takes an equation and might allocate any dynamically sized member v...
Definition: State.hpp:251
Definition: MultiBlockBoundary.hpp:54
Definition: MultiBlockBoundary2.hpp:186
void FillTubeGhostLayer(::amrex::FArrayBox &tube_ghost_data, const ::amrex::FArrayBox &plenum_mirror_data)
Definition: MultiBlockBoundary2.hpp:200
PlenumEquation plenum_equation_
Definition: MultiBlockBoundary2.hpp:198
MultiBlockBoundary2(const MultiBlockBoundary2 &other)
Definition: MultiBlockBoundary2.hpp:193
void FillPlenumGhostLayer(::amrex::FArrayBox &plenum_ghost_data, const ::amrex::FArrayBox &tube_mirror_data)
Definition: MultiBlockBoundary2.hpp:222
TubeEquation tube_equation_
Definition: MultiBlockBoundary2.hpp:197
MultiBlockBoundary2(const TubeEquation &tube_equation, const PlenumEquation &plenum_equation)
Definition: MultiBlockBoundary2.hpp:189
Definition: MultiBlockBoundary2.hpp:41
virtual void FillPlenumGhostLayer(::amrex::FArrayBox &plenum_ghost_data, const ::amrex::FArrayBox &tube_mirror_data)=0
virtual void FillTubeGhostLayer(::amrex::FArrayBox &tube_ghost_data, const ::amrex::FArrayBox &plenum_mirror_data)=0
virtual std::unique_ptr< MultiBlockBoundaryBase > Clone() const =0
Definition: MultiBlockBoundary2.hpp:53
std::unique_ptr< MultiBlockBoundaryBase > Clone() const override final
Definition: MultiBlockBoundary2.hpp:57
MultiBlockBoundaryWrapper(Boundary &&impl)
Definition: MultiBlockBoundary2.hpp:55
std::unique_ptr< Boundary > impl_
Definition: MultiBlockBoundary2.hpp:72
MultiBlockBoundaryWrapper(const Boundary &impl)
Definition: MultiBlockBoundary2.hpp:54
void FillPlenumGhostLayer(::amrex::FArrayBox &plenum_ghost_data, const ::amrex::FArrayBox &tube_mirror_data) override final
Definition: MultiBlockBoundary2.hpp:66
void FillTubeGhostLayer(::amrex::FArrayBox &tube_ghost_data, const ::amrex::FArrayBox &plenum_mirror_data) override final
Definition: MultiBlockBoundary2.hpp:61