21 #ifndef FUB_AMREX_PATCH_HIERARCHY_HPP
22 #define FUB_AMREX_PATCH_HIERARCHY_HPP
28 #include "fub/counter/CounterRegistry.hpp"
34 #include <AMReX_FluxRegister.H>
35 #include <AMReX_Geometry.H>
37 #include <AMReX_ParallelDescriptor.H>
38 #include <AMReX_PlotFileUtil.H>
39 #include <AMReX_VisMF.H>
41 #include <fmt/format.h>
42 #include <fmt/ranges.h>
58 template <
typename Log>
void Print(
Log& log);
115 const ::amrex::DistributionMapping& dm,
int n_components);
125 const ::amrex::DistributionMapping& dm,
137 const ::amrex::DistributionMapping& dm,
int n_components,
138 const ::amrex::FabFactory<::amrex::FArrayBox>& factory);
146 std::unique_ptr<::amrex::MultiFab>
nodes{};
147 std::array<std::unique_ptr<::amrex::MultiFab>, AMREX_SPACEDIM>
faces{};
150 template <
typename Equation>
160 template <
typename Equation>
180 [[nodiscard]] std::ptrdiff_t
GetCycles(
int level = 0) const;
207 [[nodiscard]] const ::amrex::Vector<::amrex::BoxArray>
GetBoxArrays() const;
210 [[nodiscard]] const ::amrex::Vector<::amrex::DistributionMapping>
214 [[nodiscard]] const ::amrex::Vector<const ::amrex::MultiFab*>
GetData() const;
227 [[nodiscard]] const std::shared_ptr<CounterRegistry>&
251 ForEachVariable([&n_comp](
int depth) { n_comp += depth; }, complete_depths);
260 desc.first_cons_component = 0;
261 desc.n_cons_components = n_cons_comp;
262 desc.dimension = Equation::Rank();
266 template <
typename Equation>
273 std::size_t size =
static_cast<std::size_t
>(nlevels);
274 ::amrex::Vector<const ::amrex::MultiFab*> mf = hier.
GetData();
275 ::amrex::Vector<::amrex::Geometry> geoms = hier.
GetGeometries();
276 ::amrex::Vector<int> level_steps(size);
277 ::amrex::Vector<::amrex::IntVect> ref_ratio(size - 1);
278 for (std::size_t i = 0; i < size; ++i) {
279 level_steps[i] =
static_cast<int>(hier.
GetCycles(
static_cast<int>(i)));
281 for (std::size_t i = 1; i < size; ++i) {
285 constexpr
auto names = Traits::names;
287 const std::size_t n_names =
289 ::amrex::Vector<std::string> varnames;
290 varnames.reserve(n_names);
291 boost::mp11::tuple_for_each(
Zip(names,
StateToTuple(depths)), [&](
auto xs) {
292 const int ncomp = std::get<1>(xs);
294 varnames.push_back(std::get<0>(xs));
296 for (
int i = 0; i < ncomp; ++i) {
297 varnames.push_back(fmt::format(
"{}_{}", std::get<0>(xs), i));
301 ::amrex::WriteMultiLevelPlotfile(plotfilename, nlevels, mf, varnames, geoms,
302 time_point, level_steps, ref_ratio);
313 std::size_t size =
static_cast<std::size_t
>(nlevels);
314 ::amrex::Vector<const ::amrex::MultiFab*> mf = hier.
GetData();
315 ::amrex::Vector<::amrex::Geometry> geoms = hier.
GetGeometries();
316 ::amrex::Vector<int> level_steps(size);
317 ::amrex::Vector<::amrex::IntVect> ref_ratio(size - 1);
318 for (std::size_t i = 0; i < size; ++i) {
319 level_steps[i] =
static_cast<int>(hier.
GetCycles(
static_cast<int>(i)));
321 for (std::size_t i = 1; i < size; ++i) {
325 constexpr
auto names = Traits::names;
327 const std::size_t n_names =
329 ::amrex::Vector<std::string> varnames;
330 varnames.reserve(n_names);
331 boost::mp11::tuple_for_each(
Zip(names,
StateToTuple(depths)), [&](
auto xs) {
332 const int ncomp = std::get<1>(xs);
334 varnames.push_back(std::get<0>(xs));
337 for (
int i = 0; i < ncomp; ++i) {
338 if (std::get<0>(xs) == std::string{
"Species"}) {
339 varnames.push_back(species[i]);
341 varnames.push_back(fmt::format(
"{}_{}", std::get<0>(xs), i));
346 ::amrex::WriteMultiLevelPlotfile(plotfilename, nlevels, mf, varnames, geoms,
347 time_point, level_steps, ref_ratio);
358 template <
typename Equation>
366 const ::amrex::Geometry& geom);
370 const ::amrex::Geometry& geom);
379 std::ptrdiff_t cycle_number, MPI_Comm comm);
381 void WriteToHDF5(
const std::string& name, const ::amrex::FArrayBox& fab,
382 const ::amrex::Geometry& geom,
Duration time_point,
383 std::ptrdiff_t cycle) noexcept;
386 std::array<int, AMREX_SPACEDIM> ref_ratio{};
387 std::array<int, AMREX_SPACEDIM> blocking{};
388 std::array<int, AMREX_SPACEDIM> max_grid{};
389 std::array<int, AMREX_SPACEDIM> error_buf{};
390 std::copy_n(
refine_ratio.begin(), AMREX_SPACEDIM, ref_ratio.begin());
391 std::copy_n(
blocking_factor.begin(), AMREX_SPACEDIM, blocking.begin());
392 std::copy_n(
max_grid_size.begin(), AMREX_SPACEDIM, max_grid.begin());
393 std::copy_n(
n_error_buf.begin(), AMREX_SPACEDIM, error_buf.begin());
394 BOOST_LOG(log) << fmt::format(
" - max_number_of_levels = {}",
396 BOOST_LOG(log) << fmt::format(
" - refine_ratio = {{{}}}",
397 fmt::join(ref_ratio,
", "));
398 BOOST_LOG(log) << fmt::format(
" - blocking_factor = {{{}}}",
399 fmt::join(blocking,
", "));
400 BOOST_LOG(log) << fmt::format(
" - max_grid_size = {{{}}}",
401 fmt::join(max_grid,
", "));
402 BOOST_LOG(log) << fmt::format(
" - n_err_buf = {{{}}}",
403 fmt::join(error_buf,
", "));
404 BOOST_LOG(log) << fmt::format(
" - grid_efficiency = {}",
grid_efficiency);
405 BOOST_LOG(log) << fmt::format(
" - n_proper = {}",
n_proper);
#define FUB_ASSERT(x)
Definition: assert.hpp:39
span< const std::string > GetSpeciesNames() const
Return the name of the ith species.
Definition: FlameMasterReactor.hpp:338
FlameMasterReactor & GetReactor() noexcept
Definition: IdealGasMix.hpp:140
This class stores a list of snapshots and returns proxy objects to those.
Definition: output/DebugOutput.hpp:201
Definition: AMReX/Geometry.hpp:30
The PatchHierarchy holds simulation data on multiple refinement levels.
Definition: AMReX/PatchHierarchy.hpp:156
int GetMaxNumberOfLevels() const noexcept
const ::amrex::Vector<::amrex::Geometry > GetGeometries() const
Returns the hierarchy of Geometry objects.
span< const ::amrex::EB2::IndexSpace * > GetIndexSpaces() noexcept
PatchHierarchy(const Equation &equation, const CartesianGridGeometry &geometry, const PatchHierarchyOptions &options)
Constructs a PatchHierarchy object which is capable of holding data described by the secified data de...
Definition: AMReX/PatchHierarchy.hpp:359
void PushBack(const PatchLevel &level)
const ::amrex::Vector<::amrex::BoxArray > GetBoxArrays() const
Returns the hierarchy of BoxArray objects.
std::ptrdiff_t GetCycles(int level=0) const
const DataDescription & GetDataDescription() const noexcept
std::shared_ptr< DebugStorage > debug_storage_
Definition: AMReX/PatchHierarchy.hpp:244
int GetRatioToCoarserLevel(int level, Direction dir) const noexcept
PatchHierarchy(DataDescription description, const CartesianGridGeometry &geometry, const PatchHierarchyOptions &options)
Constructs a PatchHierarchy object which is capable of holding data described by the secified data de...
int GetNumberOfLevels() const noexcept
Duration GetTimePoint(int level=0) const
const CartesianGridGeometry & GetGridGeometry() const noexcept
Returns the Grid Geometry which was used to create the hierarchy with.
CartesianGridGeometry grid_geometry_
Definition: AMReX/PatchHierarchy.hpp:238
DataDescription description_
Definition: AMReX/PatchHierarchy.hpp:237
const ::amrex::Vector<::amrex::DistributionMapping > GetDistributionMappings() const
Returns the hierarchy of DistributionMapping objects.
const std::shared_ptr< CounterRegistry > & GetCounterRegistry() const noexcept
Returns a shared pointer to the counter registry.
PatchLevel & GetPatchLevel(int level)
std::shared_ptr< CounterRegistry > registry_
Definition: AMReX/PatchHierarchy.hpp:243
std::vector< const ::amrex::EB2::IndexSpace * > index_spaces_
Definition: AMReX/PatchHierarchy.hpp:242
std::vector< PatchLevel > patch_level_
Definition: AMReX/PatchHierarchy.hpp:240
std::vector<::amrex::Geometry > patch_level_geometry_
Definition: AMReX/PatchHierarchy.hpp:241
const ::amrex::Geometry & GetGeometry(int level) const
Returns a Geometry object for a specified level.
const std::shared_ptr< DebugStorage > & GetDebugStorage() const noexcept
Returns a shared pointer to the debug storage.
PatchHierarchyOptions options_
Definition: AMReX/PatchHierarchy.hpp:239
const PatchHierarchyOptions & GetOptions() const noexcept
Return some additional patch hierarchy options.
void SetCounterRegistry(std::shared_ptr< CounterRegistry > registry)
const ::amrex::Vector< const ::amrex::MultiFab * > GetData() const
Returns the hierarchy of MultiFabs representing the data.
Definition: mdspan.hpp:573
An extents object defines a multidimensional index space which is the Cartesian product of integers e...
Definition: mdspan.hpp:208
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 WriteTubeData(const std::string &filename, const PatchHierarchy &hierarchy, const IdealGasMix< 1 > &eq, fub::Duration time_point, std::ptrdiff_t cycle_number, MPI_Comm comm)
void WritePlotFile(const std::string plotfilename, const fub::amrex::PatchHierarchy &hier, const Equation &equation)
Definition: AMReX/PatchHierarchy.hpp:267
void WriteMatlabData(std::ostream &out, const ::amrex::FArrayBox &fab, const fub::IdealGasMix< 1 > &eq, const ::amrex::Geometry &geom)
void WriteCheckpointFile(const std::string checkpointname, const fub::amrex::PatchHierarchy &hier)
std::vector< double > GatherStates(const PatchHierarchy &hierarchy, basic_mdspan< const double, extents< AMREX_SPACEDIM, dynamic_extent >> xs, MPI_Comm comm)
DataDescription MakeDataDescription(const Equation &equation)
Definition: AMReX/PatchHierarchy.hpp:248
PatchHierarchy ReadCheckpointFile(const std::string &checkpointname, DataDescription desc, const CartesianGridGeometry &geometry, const PatchHierarchyOptions &options)
void WriteToHDF5(const std::string &name, const ::amrex::FArrayBox &fab, const ::amrex::Geometry &geom, Duration time_point, std::ptrdiff_t cycle) noexcept
The fub namespace.
Definition: AnyBoundaryCondition.hpp:31
typename remove_cvref< T >::type remove_cvref_t
Definition: type_traits.hpp:226
void Log(std::string message, Duration timepoint, boost::log::trivial::severity_level level=boost::log::trivial::severity_level::info)
std::chrono::duration< double > Duration
Definition: Duration.hpp:31
void ForEachVariable(F function, Ts &&... states)
Definition: State.hpp:89
constexpr struct fub::DepthsFn Depths
Direction
This is a type safe type to denote a dimensional split direction.
Definition: Direction.hpp:30
constexpr auto Zip(Ts &&... ts)
Definition: State.hpp:65
auto StateToTuple(const State &x)
Definition: State.hpp:322
std::map< std::string, pybind11::object > ProgramOptions
Definition: ProgramOptions.hpp:40
Definition: State.hpp:162
Definition: CartesianGridGeometry.hpp:37
The DataDescription class contains all information which is neccessary to describe the complete and c...
Definition: AMReX/PatchHierarchy.hpp:73
int dimension
Definition: AMReX/PatchHierarchy.hpp:79
int n_cons_components
Definition: AMReX/PatchHierarchy.hpp:76
int n_state_components
Definition: AMReX/PatchHierarchy.hpp:74
int first_cons_component
Definition: AMReX/PatchHierarchy.hpp:75
int n_node_components
Definition: AMReX/PatchHierarchy.hpp:77
int n_face_components
Definition: AMReX/PatchHierarchy.hpp:78
Definition: AMReX/PatchHierarchy.hpp:54
int verbose
Definition: AMReX/PatchHierarchy.hpp:66
PatchHierarchyOptions(const ProgramOptions &options)
int n_proper
Definition: AMReX/PatchHierarchy.hpp:67
::amrex::IntVect refine_ratio
Definition: AMReX/PatchHierarchy.hpp:61
int max_number_of_levels
Definition: AMReX/PatchHierarchy.hpp:60
void Print(Log &log)
Definition: AMReX/PatchHierarchy.hpp:385
PatchHierarchyOptions()=default
::amrex::IntVect n_error_buf
Definition: AMReX/PatchHierarchy.hpp:64
double grid_efficiency
Definition: AMReX/PatchHierarchy.hpp:65
::amrex::IntVect max_grid_size
Definition: AMReX/PatchHierarchy.hpp:63
::amrex::IntVect blocking_factor
Definition: AMReX/PatchHierarchy.hpp:62
The PatchLevel represents a distributed grid containing plain simulation data without a ghost cell la...
Definition: AMReX/PatchHierarchy.hpp:90
std::array< std::unique_ptr<::amrex::MultiFab >, AMREX_SPACEDIM > faces
Definition: AMReX/PatchHierarchy.hpp:147
~PatchLevel() noexcept=default
Duration time_point
Definition: AMReX/PatchHierarchy.hpp:141
::amrex::BoxArray box_array
Definition: AMReX/PatchHierarchy.hpp:143
::amrex::DistributionMapping distribution_mapping
Definition: AMReX/PatchHierarchy.hpp:144
std::unique_ptr<::amrex::MultiFab > nodes
Definition: AMReX/PatchHierarchy.hpp:146
std::ptrdiff_t cycles
Definition: AMReX/PatchHierarchy.hpp:142
int level_number
Definition: AMReX/PatchHierarchy.hpp:140
::amrex::MultiFab data
Definition: AMReX/PatchHierarchy.hpp:145