mirror of
https://github.com/mpusz/mp-units.git
synced 2025-07-29 18:07:16 +02:00
added example and some more units to fps system
This commit is contained in:
@ -36,6 +36,7 @@ add_example(clcpp_response)
|
||||
add_example(conversion_factor)
|
||||
add_example(kalman_filter-alpha_beta_filter_example2)
|
||||
add_example(experimental_angle)
|
||||
add_example(foot_pound_second)
|
||||
|
||||
conan_check_testing(linear_algebra)
|
||||
add_example(linear_algebra)
|
||||
|
104
example/foot_pound_second.cpp
Normal file
104
example/foot_pound_second.cpp
Normal file
@ -0,0 +1,104 @@
|
||||
// The MIT License (MIT)
|
||||
//
|
||||
// Copyright (c) 2018 Mateusz Pusz
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
|
||||
#include <units/format.h>
|
||||
#include <units/physical/fps/density.h>
|
||||
#include <units/physical/fps/length.h>
|
||||
#include <units/physical/fps/mass.h>
|
||||
#include <units/physical/fps/power.h>
|
||||
#include <units/physical/fps/speed.h>
|
||||
#include <units/physical/fps/volume.h>
|
||||
#include <units/physical/si/length.h>
|
||||
#include <units/physical/si/mass.h>
|
||||
#include <units/physical/si/power.h>
|
||||
#include <units/physical/si/speed.h>
|
||||
#include <units/physical/si/volume.h>
|
||||
|
||||
#include <units/concepts.h>
|
||||
#include <units/quantity.h>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
using namespace units::physical;
|
||||
|
||||
|
||||
// Some basic specs for the warship
|
||||
struct Ship {
|
||||
fps::length<fps::foot> length;
|
||||
fps::length<fps::foot> draft;
|
||||
fps::length<fps::foot> beam;
|
||||
|
||||
fps::speed<fps::foot_per_second> speed;
|
||||
fps::mass<fps::pound> mass;
|
||||
|
||||
fps::length<fps::inch> mainGuns;
|
||||
fps::mass<fps::pound> shellMass;
|
||||
fps::speed<fps::foot_per_second> shellSpeed;
|
||||
fps::power<fps::foot_poundal_per_second> power;
|
||||
|
||||
|
||||
};
|
||||
|
||||
// Print 'a' in its current units and print its value cast to the units in each of Args
|
||||
template<class ...Args, units::Quantity Q>
|
||||
auto fmt_line(const Q a) {
|
||||
return fmt::format("{:22}",a) + (fmt::format(",{:20}", units::quantity_cast<Args>(a)) + ...);
|
||||
}
|
||||
|
||||
// Print the ship details in the units as defined in the Ship struct, in other imperial units, and in SI
|
||||
std::ostream& print_details(std::string_view description, const Ship& ship) {
|
||||
using namespace units::physical::fps::literals;
|
||||
const auto waterDensity = 62.4q_lb_per_ft3;
|
||||
std::cout << fmt::format("{}\n", description);
|
||||
std::cout << fmt::format("{:20} : {}\n", "length", fmt_line<fps::length<fps::yard>, si::length<si::metre>>(ship.length))
|
||||
<< fmt::format("{:20} : {}\n", "draft", fmt_line<fps::length<fps::yard>, si::length<si::metre>>(ship.draft))
|
||||
<< fmt::format("{:20} : {}\n", "beam", fmt_line<fps::length<fps::yard>, si::length<si::metre>>(ship.beam))
|
||||
<< fmt::format("{:20} : {}\n", "mass", fmt_line<fps::mass<fps::long_ton>, si::mass<si::tonne>>(ship.mass))
|
||||
<< fmt::format("{:20} : {}\n", "speed", fmt_line<fps::speed<fps::knot>, si::speed<si::kilometre_per_hour>>(ship.speed))
|
||||
<< fmt::format("{:20} : {}\n", "power", fmt_line<fps::power<fps::horse_power>, si::power<si::kilowatt>>(ship.power))
|
||||
<< fmt::format("{:20} : {}\n", "main guns", fmt_line<fps::length<fps::inch>, si::length<si::millimetre>>(ship.mainGuns))
|
||||
<< fmt::format("{:20} : {}\n", "fire shells weighing",fmt_line<fps::mass<fps::long_ton>, si::mass<si::kilogram>>(ship.shellMass))
|
||||
<< fmt::format("{:20} : {}\n", "fire shells at",fmt_line<fps::speed<fps::mile_per_hour>, si::speed<si::kilometre_per_hour>>(ship.shellSpeed))
|
||||
<< fmt::format("{:20} : {}\n", "volume underwater", fmt_line<si::volume<si::cubic_metre>, si::volume<si::litre>>(ship.mass / waterDensity));
|
||||
return std::cout;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
using namespace units::physical::si::literals;
|
||||
using namespace units::physical::fps::literals;
|
||||
|
||||
|
||||
// KMS Bismark, using the units the Germans would use, taken from Wiki
|
||||
auto bismark = Ship{.length{251.q_m}, .draft{9.3q_m}, .beam{36q_m}, .speed{56q_km_per_h}, .mass{50.3q_t}, .mainGuns{380q_mm}, .shellMass{800q_kg}, .shellSpeed{820.q_m_per_s}, .power{110.45q_kW}};
|
||||
|
||||
// USS Iowa, using units from the foot-pound-second system
|
||||
auto iowa = Ship{.length{860.q_ft}, .draft{37.q_ft + 2.q_in}, .beam{108.q_ft + 2.q_in}, .speed{33q_knot}, .mass{57'540q_lton}, .mainGuns{16q_in}, .shellMass{2700q_lb}, .shellSpeed{2690.q_ft_per_s}, .power{212'000q_hp}};
|
||||
|
||||
// HMS King George V, using units from the foot-pound-second system
|
||||
auto kgv = Ship{.length{745.1q_ft}, .draft{33.q_ft + 7.5q_in}, .beam{103.2q_ft + 2.5q_in}, .speed{28.3q_knot}, .mass{42'245q_lton}, .mainGuns{14q_in}, .shellMass{1'590q_lb}, .shellSpeed{2483.q_ft_per_s}, .power{110'000q_hp}};
|
||||
|
||||
print_details("KMS Bismark, defined in appropriate units from the SI system", bismark) << "\n\n";
|
||||
print_details("USS Iowa, defined in appropriate units foot-pound-second system", iowa) << "\n\n";
|
||||
print_details("HMS King George V, defined in appropriate units foot-pound-second system", kgv);
|
||||
|
||||
}
|
@ -31,6 +31,16 @@ namespace units::physical::fps {
|
||||
// https://en.wikipedia.org/wiki/Foot_(unit)
|
||||
struct foot : named_scaled_unit<foot, "ft", no_prefix, ratio<3'048, 1'000, -1>, si::metre> {};
|
||||
|
||||
struct yard : named_scaled_unit<yard, "yd", no_prefix, ratio<3, 1>, foot> {};
|
||||
|
||||
struct inch : named_scaled_unit<inch, "in", no_prefix, ratio<1, 12>, foot> {};
|
||||
|
||||
struct mile : named_scaled_unit<mile, "mile", no_prefix, ratio<5'280>, foot> {};
|
||||
|
||||
struct nautical_mile : named_scaled_unit<nautical_mile, "mi(naut)", no_prefix, ratio<2000>, yard> {};
|
||||
|
||||
|
||||
|
||||
struct dim_length : physical::dim_length<foot> {};
|
||||
|
||||
template<Unit U, Scalar Rep = double>
|
||||
@ -38,10 +48,23 @@ using length = quantity<dim_length, U, Rep>;
|
||||
|
||||
inline namespace literals {
|
||||
|
||||
constexpr auto operator"" q_in(unsigned long long l) { return length<inch, std::int64_t>(l); }
|
||||
constexpr auto operator"" q_in(long double l) { return length<inch, long double>(l); }
|
||||
|
||||
// ft
|
||||
constexpr auto operator"" q_ft(unsigned long long l) { return length<foot, std::int64_t>(l); }
|
||||
constexpr auto operator"" q_ft(long double l) { return length<foot, long double>(l); }
|
||||
|
||||
constexpr auto operator"" q_yd(unsigned long long l) { return length<yard, std::int64_t>(l); }
|
||||
constexpr auto operator"" q_yd(long double l) { return length<yard, long double>(l); }
|
||||
|
||||
constexpr auto operator"" q_mile(unsigned long long l) { return length<mile, std::int64_t>(l); }
|
||||
constexpr auto operator"" q_mile(long double l) { return length<mile, long double>(l); }
|
||||
|
||||
constexpr auto operator"" q_naut_mi(unsigned long long l) { return length<nautical_mile, std::int64_t>(l); }
|
||||
constexpr auto operator"" q_naut_mi(long double l) { return length<nautical_mile, long double>(l); }
|
||||
|
||||
|
||||
}
|
||||
|
||||
} // namespace units::physical::fps
|
||||
|
@ -36,12 +36,32 @@ struct dim_mass : physical::dim_mass<pound> {};
|
||||
template<Unit U, Scalar Rep = double>
|
||||
using mass = quantity<dim_mass, U, Rep>;
|
||||
|
||||
struct ounce : named_scaled_unit<ounce, "oz", no_prefix, ratio<1, 16>, pound>{};
|
||||
|
||||
struct short_ton : named_scaled_unit<short_ton, "ton (short)", no_prefix, ratio<2'000, 1>, pound>{};
|
||||
|
||||
struct long_ton : named_scaled_unit<long_ton, "ton (long)", no_prefix, ratio<2'240, 1>, pound>{};
|
||||
|
||||
inline namespace literals {
|
||||
|
||||
// g
|
||||
|
||||
constexpr auto operator"" q_oz(unsigned long long l) { return mass<ounce, std::int64_t>(l); }
|
||||
constexpr auto operator"" q_oz(long double l) { return mass<ounce, long double>(l); }
|
||||
|
||||
|
||||
// lb
|
||||
constexpr auto operator"" q_lb(unsigned long long l) { return mass<pound, std::int64_t>(l); }
|
||||
constexpr auto operator"" q_lb(long double l) { return mass<pound, long double>(l); }
|
||||
|
||||
|
||||
constexpr auto operator"" q_ston(unsigned long long l) { return mass<short_ton, std::int64_t>(l); }
|
||||
constexpr auto operator"" q_ston(long double l) { return mass<short_ton, long double>(l); }
|
||||
|
||||
|
||||
constexpr auto operator"" q_lton(unsigned long long l) { return mass<long_ton, std::int64_t>(l); }
|
||||
constexpr auto operator"" q_lton(long double l) { return mass<long_ton, long double>(l); }
|
||||
|
||||
|
||||
}
|
||||
|
||||
} // namespace units::physical::fps
|
||||
|
@ -35,6 +35,8 @@ struct dim_power : physical::dim_power<dim_power, foot_poundal_per_second, dim_e
|
||||
|
||||
struct foot_pound_force_per_second : deduced_unit<foot_pound_force_per_second, dim_power, foot_pound_force, second> {};
|
||||
|
||||
struct horse_power : named_scaled_unit<horse_power, "hp", no_prefix, ratio<550>, foot_pound_force_per_second> {};
|
||||
|
||||
template<Unit U, Scalar Rep = double>
|
||||
using power = quantity<dim_power, U, Rep>;
|
||||
|
||||
@ -49,6 +51,10 @@ constexpr auto operator"" q_ft_pdl_per_s(long double l) { return power<foot_poun
|
||||
constexpr auto operator"" q_ft_lbf_per_s(unsigned long long l) { return power<foot_pound_force_per_second, std::int64_t>(l); }
|
||||
constexpr auto operator"" q_ft_lbf_per_s(long double l) { return power<foot_pound_force_per_second, long double>(l); }
|
||||
|
||||
|
||||
constexpr auto operator"" q_hp(unsigned long long l) { return power<horse_power, std::int64_t>(l); }
|
||||
constexpr auto operator"" q_hp(long double l) { return power<horse_power, long double>(l); }
|
||||
|
||||
} // namespace literals
|
||||
|
||||
} // namespace units::physical::fps
|
||||
|
@ -32,14 +32,15 @@ namespace units::physical::fps {
|
||||
|
||||
struct poundal_per_foot_sq : unit<poundal_per_foot_sq> {};
|
||||
|
||||
struct pound_force_per_foot_sq : named_scaled_unit<pound_force_per_foot_sq, "lbf ft2", si::prefix, ratio<32'174'049, 1'000'000>, poundal_per_foot_sq> {};
|
||||
|
||||
|
||||
struct dim_pressure : physical::dim_pressure<dim_pressure, poundal_per_foot_sq, dim_force, dim_area> {};
|
||||
|
||||
template<Unit U, Scalar Rep = double>
|
||||
using pressure = quantity<dim_pressure, U, Rep>;
|
||||
|
||||
struct pound_force_per_foot_sq : named_scaled_unit<pound_force_per_foot_sq, "lbf ft2", si::prefix, ratio<32'174'049, 1'000'000>, poundal_per_foot_sq> {};
|
||||
|
||||
// struct pound_force_per_foot_sq : named_deduced_unit<pound_force_per_foot_sq, dim_pressure, pound_force, square_ft> {};
|
||||
|
||||
struct pound_force_per_inch_sq : named_scaled_unit<pound_force_per_inch_sq, "psi", si::prefix, ratio<1, 144>, pound_force_per_foot_sq> {};
|
||||
|
||||
inline namespace literals {
|
||||
|
@ -35,12 +35,25 @@ struct dim_speed : physical::dim_speed<dim_speed, foot_per_second, dim_length, d
|
||||
template<Unit U, Scalar Rep = double>
|
||||
using speed = quantity<dim_speed, U, Rep>;
|
||||
|
||||
struct mile_per_hour : deduced_unit<mile_per_hour, dim_speed, mile, hour>{};
|
||||
|
||||
struct nautical_mile_per_hour : deduced_unit<nautical_mile_per_hour, dim_speed, nautical_mile, hour>{};
|
||||
|
||||
struct knot : alias_unit<nautical_mile_per_hour, "knot", si::prefix> {};
|
||||
|
||||
|
||||
inline namespace literals {
|
||||
|
||||
// cmps
|
||||
constexpr auto operator"" q_ft_per_s(unsigned long long l) { return speed<foot_per_second, std::int64_t>(l); }
|
||||
constexpr auto operator"" q_ft_per_s(long double l) { return speed<foot_per_second, long double>(l); }
|
||||
|
||||
constexpr auto operator"" q_mph(unsigned long long l) { return speed<mile_per_hour, std::int64_t>(l); }
|
||||
constexpr auto operator"" q_mph(long double l) { return speed<mile_per_hour, long double>(l); }
|
||||
|
||||
constexpr auto operator"" q_knot(unsigned long long l) { return speed<knot, std::int64_t>(l); }
|
||||
constexpr auto operator"" q_knot(long double l) { return speed<knot, long double>(l); }
|
||||
|
||||
|
||||
} // namespace literals
|
||||
|
||||
} // namespace units::physical::fps
|
||||
|
@ -29,6 +29,8 @@
|
||||
namespace units::physical::fps {
|
||||
|
||||
using si::second;
|
||||
using si::minute;
|
||||
using si::hour;
|
||||
|
||||
using si::dim_time;
|
||||
using si::time;
|
||||
|
Reference in New Issue
Block a user