#include #include #include namespace { using namespace units::physical; using namespace units::physical::si::literals; using m = si::metre; using kg = si::kilogram; using N = si::newton; using m3 = si::cubic_metre; using kgpm3 = si::kilogram_per_metre_cub; inline constexpr auto g = si::si2019::standard_gravity<>; } // namespace struct Box { static constexpr auto air_density = 1.225_q_kg_per_m3; si::length length; si::length width; si::length height; struct contents { si::density density = air_density; } contents; constexpr Box(const si::length& l, const si::length& w, const si::length& h) : length{l}, width{w}, height{h} {} constexpr si::force filled_weight() const { const si::volume volume = length * width * height; const si::mass mass = contents.density * volume; return mass * g; } constexpr si::length fill_level(const si::mass& measured_mass) const { return height * (measured_mass * g) / filled_weight(); } constexpr si::volume spare_capacity(const si::mass& measured_mass) const { return (height - fill_level(measured_mass)) * width * length; } constexpr void set_contents_density(const si::density& density_in) { assert(density_in > air_density); contents.density = density_in; } }; #include int main() { auto box = Box(1000.0_q_mm, 500.0_q_mm, 200.0_q_mm); box.set_contents_density(1000.0_q_kg_per_m3); const auto fill_time = 200.0_q_s; // time since starting fill const auto measured_mass = 20.0_q_kg; // measured mass at fill_time std::cout << "mp-units box example...\n"; std::cout << "fill height at " << fill_time << " = " << box.fill_level(measured_mass) << " (" << (box.fill_level(measured_mass) / box.height) * 100 << "% full)\n"; std::cout << "spare_capacity at " << fill_time << " = " << box.spare_capacity(measured_mass) << '\n'; std::cout << "input flow rate after " << fill_time << " = " << measured_mass / fill_time << '\n'; std::cout << "float rise rate = " << box.fill_level(measured_mass) / fill_time << '\n'; const auto fill_time_left = (box.height / box.fill_level(measured_mass) - 1) * fill_time; std::cout << "box full E.T.A. at current flow rate = " << fill_time_left << '\n'; }