21 #ifndef FUB_AMREX_CUTCELL_RECONSTRUCTION_HPP
22 #define FUB_AMREX_CUTCELL_RECONSTRUCTION_HPP
32 template <
typename Equation,
bool IsSimd = true>
struct ReconstructionKernel;
36 static constexpr
int Rank = Equation::Rank();
37 static constexpr
bool IsSimd = std::is_base_of<execution::SimdTag, Tag>();
48 template <
typename Equation>
57 template <
typename Equation,
bool IsSimd>
struct ReconstructionKernel {
62 static constexpr
int Rank = Equation::Rank();
67 Load(cons_, src, {is...});
69 Store(dest, complete_, {is...});
78 const double alpha = volume(is...);
80 Load(cons_, src, {is...});
82 Store(dest, complete_, {is...});
89 template <
typename Equation>
struct ReconstructionKernel<
Equation, true> {
94 static constexpr
int Rank = Equation::Rank();
104 constexpr std::ptrdiff_t size =
106 std::ptrdiff_t n = get<0>(last) - get<0>(first);
110 Store(out, complete_);
113 n = get<0>(last) - get<0>(first);
115 LoadN(cons_, first,
static_cast<int>(n));
117 StoreN(out, complete_,
static_cast<int>(n));
132 Array1d alpha = Array1d::Zero();
133 constexpr std::ptrdiff_t size =
135 std::ptrdiff_t n = get<0>(last) - get<0>(first);
138 alpha = Array1d::Map(volume.data());
141 Store(out, complete_);
144 volume = volume.subspan(size);
145 n = get<0>(last) - get<0>(first);
147 LoadN(cons_, first,
static_cast<int>(n));
148 std::copy_n(volume.data(), n, alpha.data());
149 std::fill_n(alpha.data() + n, size - n, 0.0);
152 StoreN(out, complete_,
static_cast<int>(n));
158 template <
typename Tag,
typename Equation>
163 detail::ReconstructionKernel<Equation, IsSimd>{eq}};
166 template <
typename Tag,
typename Equation>
169 ::amrex::MultiFab& dest = context.
GetScratch(level);
170 const ::amrex::MultiFab& volumes =
172 const ::amrex::MultiFab& src = context.
GetScratch(level);
174 ForEachFab(Tag(), dest, [&](const ::amrex::MFIter& mfi) {
177 MakeView<Complete<Equation>>(dest[mfi], kernel_->equation_, box);
178 auto scratch = MakeView<const Conservative<Equation>>(
179 src[mfi], kernel_->equation_, box);
180 ::amrex::FabType type =
183 if (type == ::amrex::FabType::regular) {
184 kernel_->CompleteFromCons(state, scratch);
185 }
else if (type == ::amrex::FabType::singlevalued) {
187 kernel_->CompleteFromCons(state, scratch, volume);
This class manages data and the numerical method to perform cut cell simulations with the AMReX libra...
Definition: AMReX/cutcell/IntegratorContext.hpp:46
::amrex::MultiFab & GetScratch(int level)
Returns the MultiFab associated with level data with ghost cells on the specifed level number and dir...
::amrex::EBFArrayBoxFactory & GetEmbeddedBoundary(int level)
Returns the current boundary condition for the specified level.
A span is a view over a contiguous sequence of objects, the storage of which is owned by some other o...
Definition: span.hpp:81
void CompleteFromCons(Equation &&equation, Complete< std::decay_t< Equation >> &complete, const Conservative< std::decay_t< Equation >> &cons)
Definition: CompleteFromCons.hpp:42
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
Reconstruction(const Equation &) -> Reconstruction< execution::OpenMpSimdTag, Equation >
void ForEachIndex(const ::amrex::Box &box, F function)
Definition: ForEachIndex.hpp:29
PatchDataView< T, AMREX_SPACEDIM+1 > MakePatchDataView(::amrex::BaseFab< T > &fab)
Definition: ViewFArrayBox.hpp:86
std::chrono::duration< double > Duration
Definition: Duration.hpp:31
Array< double, 1 > Array1d
Definition: Eigen.hpp:53
constexpr const int kDefaultChunkSize
Definition: Eigen.hpp:39
void StoreN(nodeduce_t< ViewPointer< Conservative< Eq >>> pointer, const ConservativeArray< Eq > &state, int n)
Definition: StateArray.hpp:416
void ForEachRow(const Tuple &views, Function f)
Definition: StateRow.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
ViewPointer< State > Begin(const BasicView< State, Layout, Rank > &view)
Definition: State.hpp:769
void LoadN(CompleteArray< Eq, N > &state, const BasicView< const Complete< Eq >, Layout, Rank > &view, int size, nodeduce_t< const std::array< std::ptrdiff_t, std::size_t(Rank)> & > pos)
Definition: StateArray.hpp:310
void Advance(ViewPointer< State > &pointer, std::ptrdiff_t n) noexcept
Definition: State.hpp:825
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
ViewPointer< State > End(const BasicView< State, Layout, Rank > &view)
Definition: State.hpp:782
Array< bool, 1 > MaskArray
Definition: Eigen.hpp:59
IndexBox< Rank > Box(const BasicView< State, Layout, Rank > &view)
Definition: State.hpp:486
typename detail::LocalType< Tag, T >::type Local
Definition: Execution.hpp:56
Definition: State.hpp:403
Definition: PatchDataView.hpp:201
Definition: StateRow.hpp:51
Definition: State.hpp:750
Definition: cutcell/Reconstruction.hpp:35
Local< Tag, detail::ReconstructionKernel< Equation, IsSimd > > kernel_
Definition: cutcell/Reconstruction.hpp:45
Reconstruction(const Equation &eq)
Definition: cutcell/Reconstruction.hpp:39
static constexpr int Rank
Definition: cutcell/Reconstruction.hpp:36
static constexpr bool IsSimd
Definition: cutcell/Reconstruction.hpp:37
void CompleteFromCons(IntegratorContext &context, int level, [[maybe_unused]] Duration dt)
Definition: Execution.hpp:39