Skip to content

Commit 6dc4b3a

Browse files
committed
output debug field
1 parent 437cdcc commit 6dc4b3a

2 files changed

Lines changed: 80 additions & 18 deletions

File tree

src/QuokkaSimulation.hpp

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@ template <typename problem_t> class QuokkaSimulation : public AMRSimulation<prob
292292

293293
// compute derived variables
294294
void ComputeDerivedVar(int lev, std::string const &dname, amrex::MultiFab &mf, int ncomp) const override;
295+
void ComputeDensityFloorDebug(int lev, amrex::MultiFab &mf, int ncomp) const override;
295296

296297
// compute projected vars
297298
[[nodiscard]] auto ComputeProjections(amrex::Direction dir) const -> std::unordered_map<std::string, amrex::BaseFab<amrex::Real>> override;
@@ -979,17 +980,27 @@ auto QuokkaSimulation<problem_t>::addStrangSplitSourcesWithBuiltin(amrex::MultiF
979980
template <typename problem_t> void QuokkaSimulation<problem_t>::ComputeDerivedVar(int lev, std::string const &dname, amrex::MultiFab &mf, const int ncomp) const
980981
{
981982
// compute derived variables and save in 'mf' -- user should implement
982-
static constexpr char const *kDensityFloorDbgName = "density_floor_dbg";
983-
if (dname == kDensityFloorDbgName) {
984-
auto arr = mf.arrays();
985-
auto const geom_data = geom[lev].data();
986-
auto const prob_lo = geom_data.ProbLo();
987-
auto const dx = geom_data.CellSize();
988-
auto const density_floor = densityFloor_;
983+
(void)lev;
984+
(void)dname;
985+
(void)mf;
986+
(void)ncomp;
987+
}
989988

990-
if (this->useDensityFloorParser_) {
991-
auto const density_floor_parser = this->densityFloorParserExe_.value();
992-
amrex::ParallelFor(mf, [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept {
989+
template <typename problem_t> void QuokkaSimulation<problem_t>::ComputeDensityFloorDebug(int lev, amrex::MultiFab &mf, int ncomp) const
990+
{
991+
auto const ncomp_out = ncomp;
992+
auto const geom_data = geom[lev].data();
993+
auto const prob_lo = geom_data.ProbLo();
994+
auto const dx = geom_data.CellSize();
995+
auto const density_floor = densityFloor_;
996+
auto const ngrow = mf.nGrow();
997+
998+
if (this->useDensityFloorParser_) {
999+
auto const density_floor_parser = this->densityFloorParserExe_.value();
1000+
for (amrex::MFIter iter(mf); iter.isValid(); ++iter) {
1001+
amrex::Box const &box = iter.growntilebox(ngrow);
1002+
auto const &arr = mf.array(iter);
1003+
amrex::ParallelFor(box, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
9931004
amrex::Real const x = prob_lo[0] + (static_cast<amrex::Real>(i) + static_cast<amrex::Real>(0.5)) * dx[0];
9941005
#if (AMREX_SPACEDIM >= 2)
9951006
amrex::Real const y = prob_lo[1] + (static_cast<amrex::Real>(j) + static_cast<amrex::Real>(0.5)) * dx[1];
@@ -1001,14 +1012,18 @@ template <typename problem_t> void QuokkaSimulation<problem_t>::ComputeDerivedVa
10011012
#else
10021013
amrex::Real const z = 0.0;
10031014
#endif
1004-
arr[bx](i, j, k, ncomp) = density_floor_parser(x, y, z, density_floor);
1015+
arr(i, j, k, ncomp_out) = density_floor_parser(x, y, z, density_floor);
10051016
});
1006-
} else {
1007-
auto const density_floor_func = [this] AMREX_GPU_HOST_DEVICE(amrex::Real x, amrex::Real y, amrex::Real z,
1008-
amrex::Real base_density_floor) -> amrex::Real {
1009-
return densityFloor(x, y, z, base_density_floor);
1010-
};
1011-
amrex::ParallelFor(mf, [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept {
1017+
}
1018+
} else {
1019+
auto const density_floor_func = [this] AMREX_GPU_HOST_DEVICE(amrex::Real x, amrex::Real y, amrex::Real z,
1020+
amrex::Real base_density_floor) -> amrex::Real {
1021+
return densityFloor(x, y, z, base_density_floor);
1022+
};
1023+
for (amrex::MFIter iter(mf); iter.isValid(); ++iter) {
1024+
amrex::Box const &box = iter.growntilebox(ngrow);
1025+
auto const &arr = mf.array(iter);
1026+
amrex::ParallelFor(box, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
10121027
amrex::Real const x = prob_lo[0] + (static_cast<amrex::Real>(i) + static_cast<amrex::Real>(0.5)) * dx[0];
10131028
#if (AMREX_SPACEDIM >= 2)
10141029
amrex::Real const y = prob_lo[1] + (static_cast<amrex::Real>(j) + static_cast<amrex::Real>(0.5)) * dx[1];
@@ -1020,10 +1035,11 @@ template <typename problem_t> void QuokkaSimulation<problem_t>::ComputeDerivedVa
10201035
#else
10211036
amrex::Real const z = 0.0;
10221037
#endif
1023-
arr[bx](i, j, k, ncomp) = density_floor_func(x, y, z, density_floor);
1038+
arr(i, j, k, ncomp_out) = density_floor_func(x, y, z, density_floor);
10241039
});
10251040
}
10261041
}
1042+
amrex::Gpu::streamSynchronize();
10271043
}
10281044

10291045
template <typename problem_t>

src/simulation.hpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ template <typename problem_t> class AMRSimulation : public amrex::AmrCore
296296

297297
// compute derived variables
298298
virtual void ComputeDerivedVar(int lev, std::string const &dname, amrex::MultiFab &mf, int ncomp) const = 0;
299+
virtual void ComputeDensityFloorDebug(int lev, amrex::MultiFab &mf, int ncomp) const;
299300

300301
// compute projected vars
301302
[[nodiscard]] virtual auto ComputeProjections(amrex::Direction dir) const -> std::unordered_map<std::string, amrex::BaseFab<amrex::Real>> = 0;
@@ -3038,6 +3039,12 @@ template <typename problem_t> auto AMRSimulation<problem_t>::PlotFileMFAtLevel_c
30383039
// Check if it's a derived variable
30393040
auto deriv_it = std::ranges::find(derivedNames_, varname);
30403041
if (deriv_it != derivedNames_.end()) {
3042+
static constexpr char const *kDensityFloorDbgName = "density_floor_dbg";
3043+
if (varname == kDensityFloorDbgName) {
3044+
ComputeDensityFloorDebug(lev, plotMF, comp);
3045+
comp++;
3046+
continue;
3047+
}
30413048
ComputeDerivedVar(lev, varname, plotMF, comp);
30423049
comp++;
30433050
continue;
@@ -3050,6 +3057,45 @@ template <typename problem_t> auto AMRSimulation<problem_t>::PlotFileMFAtLevel_c
30503057
return plotMF;
30513058
}
30523059

3060+
template <typename problem_t> void AMRSimulation<problem_t>::ComputeDensityFloorDebug(int lev, amrex::MultiFab &mf, int ncomp) const
3061+
{
3062+
auto const ncomp_out = ncomp;
3063+
auto const geom_data = geom[lev].data();
3064+
auto const prob_lo = geom_data.ProbLo();
3065+
auto const dx = geom_data.CellSize();
3066+
auto const density_floor = densityFloor_;
3067+
auto const ngrow = mf.nGrow();
3068+
3069+
if (useDensityFloorParser_) {
3070+
auto const density_floor_parser = densityFloorParserExe_.value();
3071+
for (amrex::MFIter iter(mf); iter.isValid(); ++iter) {
3072+
amrex::Box const &box = iter.growntilebox(ngrow);
3073+
auto const &arr = mf.array(iter);
3074+
amrex::ParallelFor(box, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
3075+
amrex::Real const x = prob_lo[0] + (static_cast<amrex::Real>(i) + static_cast<amrex::Real>(0.5)) * dx[0];
3076+
#if (AMREX_SPACEDIM >= 2)
3077+
amrex::Real const y = prob_lo[1] + (static_cast<amrex::Real>(j) + static_cast<amrex::Real>(0.5)) * dx[1];
3078+
#else
3079+
amrex::Real const y = 0.0;
3080+
#endif
3081+
#if (AMREX_SPACEDIM == 3)
3082+
amrex::Real const z = prob_lo[2] + (static_cast<amrex::Real>(k) + static_cast<amrex::Real>(0.5)) * dx[2];
3083+
#else
3084+
amrex::Real const z = 0.0;
3085+
#endif
3086+
arr(i, j, k, ncomp_out) = density_floor_parser(x, y, z, density_floor);
3087+
});
3088+
}
3089+
} else {
3090+
for (amrex::MFIter iter(mf); iter.isValid(); ++iter) {
3091+
amrex::Box const &box = iter.growntilebox(ngrow);
3092+
auto const &arr = mf.array(iter);
3093+
amrex::ParallelFor(box, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept { arr(i, j, k, ncomp_out) = density_floor; });
3094+
}
3095+
}
3096+
amrex::Gpu::streamSynchronize();
3097+
}
3098+
30533099
template <typename problem_t> auto AMRSimulation<problem_t>::PlotFileMFAtLevel_fc(const int lev, int idim, const int nghost_fc_) -> amrex::MultiFab
30543100
{
30553101
int comp = 0;

0 commit comments

Comments
 (0)