feat(example): storage_tank example extended with custom quantity types

This commit is contained in:
Mateusz Pusz
2023-06-21 11:29:22 +02:00
parent 3725db4243
commit d9d9d9d3b7
2 changed files with 13 additions and 7 deletions

View File

@@ -53,7 +53,7 @@ add_example(glide_computer mp-units::core-fmt mp-units::international mp-units::
add_example(hello_units mp-units::core-fmt mp-units::core-io mp-units::si mp-units::usc) add_example(hello_units mp-units::core-fmt mp-units::core-io mp-units::si mp-units::usc)
add_example(measurement mp-units::core-io mp-units::si) add_example(measurement mp-units::core-io mp-units::si)
add_example(si_constants mp-units::core-fmt mp-units::si) add_example(si_constants mp-units::core-fmt mp-units::si)
add_example(storage_tank mp-units::core-fmt mp-units::si) add_example(storage_tank mp-units::core-fmt mp-units::si mp-units::utility)
add_example( add_example(
strong_angular_quantities mp-units::core-fmt mp-units::core-io mp-units::si mp-units::isq_angle mp-units::utility strong_angular_quantities mp-units::core-fmt mp-units::core-io mp-units::si mp-units::isq_angle mp-units::utility
) )

View File

@@ -21,6 +21,7 @@
// SOFTWARE. // SOFTWARE.
#include <mp-units/format.h> #include <mp-units/format.h>
#include <mp-units/math.h>
#include <mp-units/systems/isq/mechanics.h> #include <mp-units/systems/isq/mechanics.h>
#include <mp-units/systems/isq/space_and_time.h> #include <mp-units/systems/isq/space_and_time.h>
#include <mp-units/systems/si/constants.h> #include <mp-units/systems/si/constants.h>
@@ -28,6 +29,7 @@
#include <mp-units/systems/si/units.h> #include <mp-units/systems/si/units.h>
#include <cassert> #include <cassert>
#include <iostream> #include <iostream>
#include <numbers>
#include <utility> #include <utility>
template<class T> template<class T>
@@ -39,6 +41,13 @@ namespace {
using namespace mp_units; using namespace mp_units;
using namespace mp_units::si::unit_symbols; using namespace mp_units::si::unit_symbols;
// add a custom quantity type of kind isq::length
QUANTITY_SPEC(horizontal_length, isq::length);
// add a custom derived quantity type of kind isq::area
// with a constrained quantity equation
QUANTITY_SPEC(horizontal_area, isq::area, horizontal_length* isq::width);
inline constexpr auto g = 1 * si::standard_gravity; inline constexpr auto g = 1 * si::standard_gravity;
inline constexpr auto air_density = isq::mass_density(1.225 * (kg / m3)); inline constexpr auto air_density = isq::mass_density(1.225 * (kg / m3));
@@ -80,14 +89,14 @@ public:
class CylindricalStorageTank : public StorageTank { class CylindricalStorageTank : public StorageTank {
public: public:
constexpr CylindricalStorageTank(const quantity<isq::radius[m]>& radius, const quantity<isq::height[m]>& height) : constexpr CylindricalStorageTank(const quantity<isq::radius[m]>& radius, const quantity<isq::height[m]>& height) :
StorageTank(std::numbers::pi * radius * radius, height) StorageTank(quantity_cast<horizontal_area>(std::numbers::pi * pow<2>(radius)), height)
{ {
} }
}; };
class RectangularStorageTank : public StorageTank { class RectangularStorageTank : public StorageTank {
public: public:
constexpr RectangularStorageTank(const quantity<isq::length[m]>& length, const quantity<isq::width[m]>& width, constexpr RectangularStorageTank(const quantity<horizontal_length[m]>& length, const quantity<isq::width[m]>& width,
const quantity<isq::height[m]>& height) : const quantity<isq::height[m]>& height) :
StorageTank(length * width, height) StorageTank(length * width, height)
{ {
@@ -99,11 +108,8 @@ public:
int main() int main()
{ {
using namespace mp_units;
using namespace mp_units::si::unit_symbols;
const auto height = isq::height(200 * mm); const auto height = isq::height(200 * mm);
auto tank = RectangularStorageTank(isq::length(1'000 * mm), isq::width(500 * mm), height); auto tank = RectangularStorageTank(horizontal_length(1'000 * mm), isq::width(500 * mm), height);
tank.set_contents_density(1'000 * isq::mass_density[kg / m3]); tank.set_contents_density(1'000 * isq::mass_density[kg / m3]);
const auto fill_time = 200 * s; // time since starting fill const auto fill_time = 200 * s; // time since starting fill