diff --git a/Src/Amr/AMReX_Amr.H b/Src/Amr/AMReX_Amr.H index a6fdeeb235..9dc1f27acd 100644 --- a/Src/Amr/AMReX_Amr.H +++ b/Src/Amr/AMReX_Amr.H @@ -222,6 +222,16 @@ public: Real time, int lev, int ngrow); + //! Compute derived data on all levels and store in the dcompth component of + //! each Multifab in mf + void derive (const std::string& name, + Real time, + const Vector& mf, + int dcomp); + //! Compute derived data on all levels and return as a vector of MultiFab pointers + Vector> derive (const std::string& name, + amrex::Real time, + int ngrow); //! Name of the restart chkpoint file. const std::string& theRestartFile () const noexcept { return restart_chkfile; } //! Name of the restart plotfile. diff --git a/Src/Amr/AMReX_Amr.cpp b/Src/Amr/AMReX_Amr.cpp index 82116d7ee0..e4df222d2b 100644 --- a/Src/Amr/AMReX_Amr.cpp +++ b/Src/Amr/AMReX_Amr.cpp @@ -205,6 +205,46 @@ Amr::derive (const std::string& name, return amr_level[lev]->derive(name,time,ngrow); } +Vector> +Amr::derive(const std::string& name, + amrex::Real time, + int ngrow) +{ + BL_PROFILE("Amr::derive()"); + Vector> out; + out.reserve(finest_level + 1); + + for (int i = 0; i <= finest_level; ++i) + { + auto mf = amr_level[i]->derive(name,time,ngrow); + out.push_back(std::move(mf)); + } + + return out; +} + +void +Amr::derive (const std::string& name, + Real time, + const Vector& mf, + int dcomp) +{ + BL_PROFILE("Amr::derive()"); + AMREX_ASSERT(mf.size() == static_cast(finest_level + 1)); + + for (int i = 0; i <= finest_level; ++i) + { + AMREX_ASSERT(mf[i] != nullptr); + AMREX_ASSERT(mf[i]->ok()); + AMREX_ASSERT(mf[i]->nComp() > dcomp); + } + + for (int i = 0; i <= finestLevel(); ++i) + { + amr_level[i]->derive(name,time,*(mf[i]),dcomp); + } +} + Amr::Amr (LevelBld* a_levelbld) : levelbld(a_levelbld)