From c9b7de3b70298367aa427e81146c9f549480e960 Mon Sep 17 00:00:00 2001 From: Ray Speth Date: Sun, 18 Nov 2018 23:07:11 -0500 Subject: [PATCH] Add support for metric prefixes to class Units --- include/cantera/base/Units.h | 2 ++ src/base/Units.cpp | 35 +++++++++++++++++++++++++++++++++-- test/general/test_units.cpp | 8 ++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/include/cantera/base/Units.h b/include/cantera/base/Units.h index d573f83e0..b9fac71a5 100644 --- a/include/cantera/base/Units.h +++ b/include/cantera/base/Units.h @@ -79,6 +79,8 @@ private: * m*s^-2 * J/kg/K * + * Metric prefixes are recognized for all units, e.g. nm, hPa, mg, EJ, mL, kcal. + * * @ingroup inputfiles */ class UnitSystem diff --git a/src/base/Units.cpp b/src/base/Units.cpp index 010b3cea2..6d4a3e6d2 100644 --- a/src/base/Units.cpp +++ b/src/base/Units.cpp @@ -70,6 +70,27 @@ const std::map knownUnits{ {"coulomb", Units(1.0, 0, 0, 1, 0, 1)}, // A*s }; +const std::map prefixes{ + {"Y", 1e24}, + {"Z", 1e21}, + {"E", 1e18}, + {"P", 1e15}, + {"T", 1e12}, + {"G", 1e9}, + {"M", 1e6}, + {"k", 1e3}, + {"h", 1e2}, + {"d", 1e-1}, + {"c", 1e-2}, + {"m", 1e-3}, + {"u", 1e-6}, + {"n", 1e-9}, + {"p", 1e-12}, + {"f", 1e-15}, + {"a", 1e-18}, + {"z", 1e-21}, + {"y", 1e-24} +}; } namespace Cantera @@ -121,8 +142,18 @@ Units::Units(const std::string& name) // Incorporate the unit defined by the current group *this *= knownUnits.at(unit).pow(exponent); } else { - throw CanteraError("Units::Units(string)", - "Unknown unit '{}' in unit string '{}'", unit, name); + // See if the unit looks like a prefix + base unit + std::string prefix = unit.substr(0, 1); + std::string suffix = unit.substr(1); + if (prefixes.find(prefix) != prefixes.end() && + knownUnits.find(suffix) != knownUnits.end()) { + Units u = knownUnits.at(suffix); + u.scale(prefixes.at(prefix)); + *this *= u.pow(exponent); + } else { + throw CanteraError("Units::Units(string)", + "Unknown unit '{}' in unit string '{}'", unit, name); + } } start = stop+1; diff --git a/test/general/test_units.cpp b/test/general/test_units.cpp index 1853a0b0f..133c575c0 100644 --- a/test/general/test_units.cpp +++ b/test/general/test_units.cpp @@ -30,3 +30,11 @@ TEST(Units, basic_conversions) { EXPECT_DOUBLE_EQ(U.convert(2, "m^3", "l"), 2000); EXPECT_DOUBLE_EQ(U.convert(1, "atm", "Pa"), 101325); } + +TEST(Units, prefixes) { + UnitSystem U; + EXPECT_DOUBLE_EQ(U.convert(1.0, "MJ", "J"), 1e6); + EXPECT_DOUBLE_EQ(U.convert(1.0, "nm", "cm"), 1e-7); + EXPECT_DOUBLE_EQ(U.convert(1.0, "m^2", "cm^2"), 1e4); + EXPECT_DOUBLE_EQ(U.convert(1.0, "m/s", "km/hr"), 3.6); +}