Skip to content

Commit 0086028

Browse files
committed
use FloorParser
1 parent f9aaf4b commit 0086028

5 files changed

Lines changed: 36 additions & 30 deletions

File tree

docs/markdown/parameters.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ These parameters are read in the `AMRSimulation<problem_t>::readParameters()` fu
2626
| derived_vars | String | A list of the names of derived variables that should be included in the plotfile and Ascent outputs. |
2727
| regrid_interval | Integer | The number of timesteps between AMR regridding. |
2828
| density_floor | Float | The minimum density value allowed in the simulation. Enforced through EnforceLimits. |
29+
| density_floor_expr | String | Optional AMReX parser expression for a spatially varying density floor. Variables: x, y, z, base_density_floor. When set, this overrides the constant floor. |
2930
| temperature_floor | Float | The minimum temperature value allowed in the simulation. Enforced through EnforceLimits. |
3031
| max_walltime | String | The maximum walltime for the simulation in the format DD:HH:SS (days/hours/seconds). After 90% of this walltime elapses, the simulation will automatically stop and exit. |
3132
| dt_cutoff | Float | Timestep drop detector threshold. If the timestep drops below dt_cutoff \* current_time, the simulation aborts with an error message. This helps detect numerical instabilities early. Default: 0.0 (disabled). |

inputs/StarCluster.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,5 @@ derived_vars = log_density
4646

4747
amrex.throw_exception = 0
4848
amrex.signal_handling = 1
49+
50+
density_floor_expr = "1.0 - (sqrt(x*x + y*y + z*z)/10.0)"

src/QuokkaSimulation.hpp

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1693,27 +1693,20 @@ template <typename problem_t> void QuokkaSimulation<problem_t>::postInitializati
16931693

16941694
template <typename problem_t> void QuokkaSimulation<problem_t>::enforceDensityFloor(int lev, amrex::MultiFab &state_mf)
16951695
{
1696-
// if (this->useDensityFloorParser_) {
1697-
// auto const density_floor_parser = this->densityFloorParserExe_.value();
1698-
// auto const density_floor_func = [=] AMREX_GPU_HOST_DEVICE(amrex::Real x, amrex::Real y, amrex::Real z,
1699-
// amrex::Real base_density_floor) -> amrex::Real {
1700-
// return density_floor_parser(x, y, z, base_density_floor);
1701-
// };
1702-
// HydroSystem<problem_t>::EnforceLimits(densityFloor_, tempFloor_, state_mf, geom[lev].data(), density_floor_func);
1703-
// } else {
1704-
// auto const density_floor_func = [this] AMREX_GPU_HOST_DEVICE(amrex::Real x, amrex::Real y, amrex::Real z,
1705-
// amrex::Real base_density_floor) -> amrex::Real {
1706-
// return densityFloor(x, y, z, base_density_floor);
1707-
// };
1708-
// HydroSystem<problem_t>::EnforceLimits(densityFloor_, tempFloor_, state_mf, geom[lev].data(), density_floor_func);
1709-
// }
1710-
1711-
// enforce density floor
1712-
auto const density_floor_func = [this] AMREX_GPU_HOST_DEVICE(amrex::Real x, amrex::Real y, amrex::Real z,
1713-
amrex::Real base_density_floor) -> amrex::Real {
1714-
return densityFloor(x, y, z, base_density_floor);
1715-
};
1716-
HydroSystem<problem_t>::EnforceLimits(densityFloor_, tempFloor_, state_mf, geom[lev].data(), density_floor_func);
1696+
if (this->useDensityFloorParser_) {
1697+
auto const density_floor_parser = this->densityFloorParserExe_.value();
1698+
auto const density_floor_func = [=] AMREX_GPU_HOST_DEVICE(amrex::Real x, amrex::Real y, amrex::Real z,
1699+
amrex::Real base_density_floor) -> amrex::Real {
1700+
return density_floor_parser(x, y, z, base_density_floor);
1701+
};
1702+
HydroSystem<problem_t>::EnforceLimits(densityFloor_, tempFloor_, state_mf, geom[lev].data(), density_floor_func);
1703+
} else {
1704+
auto const density_floor_func = [this] AMREX_GPU_HOST_DEVICE(amrex::Real x, amrex::Real y, amrex::Real z,
1705+
amrex::Real base_density_floor) -> amrex::Real {
1706+
return densityFloor(x, y, z, base_density_floor);
1707+
};
1708+
HydroSystem<problem_t>::EnforceLimits(densityFloor_, tempFloor_, state_mf, geom[lev].data(), density_floor_func);
1709+
}
17171710
}
17181711

17191712
// fix-up any unphysical states created by AMR operations

src/problems/StarCluster/testStarCluster.cpp

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ template <> void QuokkaSimulation<StarCluster>::ComputeDerivedVar(int lev, std::
213213
}
214214

215215
// A GPU helper function to set up the density floor
216-
AMREX_GPU_HOST_DEVICE auto localDensityFloor(amrex::Real x, amrex::Real y, amrex::Real z) -> amrex::Real
216+
auto localDensityFloor(amrex::Real x, amrex::Real y, amrex::Real z) -> amrex::Real
217217
{
218218
amrex::Real r = std::sqrt(x * x + y * y + z * z);
219219
const Real rho_base_floor = 0.001;
@@ -223,14 +223,6 @@ AMREX_GPU_HOST_DEVICE auto localDensityFloor(amrex::Real x, amrex::Real y, amrex
223223
return custom_floor;
224224
}
225225

226-
// Custom density floor for StarCluster: max(0.001, 0.1 - 0.01 * r)
227-
template <>
228-
AMREX_GPU_HOST_DEVICE auto QuokkaSimulation<StarCluster>::densityFloor(amrex::Real x, amrex::Real y, amrex::Real z, amrex::Real /*base_density_floor*/) const
229-
-> amrex::Real
230-
{
231-
return localDensityFloor(x, y, z);
232-
}
233-
234226
auto problem_main() -> int
235227
{
236228
// read problem parameters

src/simulation.hpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ namespace filesystem = experimental::filesystem;
6262
#include "AMReX_Orientation.H"
6363
#include "AMReX_ParallelDescriptor.H"
6464
#include "AMReX_ParmParse.H"
65+
#include "AMReX_Parser.H"
6566
#include "AMReX_PlotFileUtil.H"
6667
#include "AMReX_Print.H"
6768
#include "AMReX_REAL.H"
@@ -213,6 +214,10 @@ template <typename problem_t> class AMRSimulation : public amrex::AmrCore
213214

214215
amrex::Real densityFloor_ = 0.0; // default
215216
amrex::Real tempFloor_ = 0.0; // default
217+
bool useDensityFloorParser_ = false;
218+
std::string densityFloorExpr_;
219+
std::optional<amrex::Parser> densityFloorParser_;
220+
std::optional<amrex::ParserExecutor<4>> densityFloorParserExe_;
216221

217222
mutable YAML::Node simulationMetadata_;
218223

@@ -857,6 +862,19 @@ template <typename problem_t> void AMRSimulation<problem_t>::readParameters()
857862
// read temperature floor in K
858863
pp.query("temperature_floor", tempFloor_);
859864

865+
// optional density floor expression (variables: x, y, z, base_density_floor)
866+
densityFloorExpr_.clear();
867+
pp.query("density_floor_expr", densityFloorExpr_);
868+
useDensityFloorParser_ = !densityFloorExpr_.empty();
869+
if (useDensityFloorParser_) {
870+
densityFloorParser_.emplace(densityFloorExpr_);
871+
densityFloorParser_->registerVariables({"x", "y", "z", "base_density_floor"});
872+
densityFloorParserExe_ = densityFloorParser_->compile<4>();
873+
} else {
874+
densityFloorParser_.reset();
875+
densityFloorParserExe_.reset();
876+
}
877+
860878
// specify maximum walltime in HH:MM:SS format
861879
std::string maxWalltimeInput;
862880
pp.query("max_walltime", maxWalltimeInput);

0 commit comments

Comments
 (0)