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