From 1d87a0d5c8b6ec7ca2dbfb42af41091357679fe3 Mon Sep 17 00:00:00 2001 From: Tobias Hienzsch Date: Mon, 20 May 2024 20:28:54 +0200 Subject: [PATCH] Upgrade mp-units to v2.2.0 --- .github/workflows/build.yml | 16 ++--- conanfile.txt | 2 +- src/ra/acoustics/absorber/porous_absorber.cpp | 24 +++++--- src/ra/acoustics/absorber/porous_absorber.hpp | 21 ++++--- .../absorber/porous_absorber.test.cpp | 58 +++++-------------- src/ra/acoustics/air.cpp | 33 ++++++----- src/ra/acoustics/air.hpp | 24 ++++---- src/ra/acoustics/air.test.cpp | 28 ++++----- src/ra/generator/sweep.cpp | 4 +- src/ra/generator/sweep.hpp | 4 +- .../tabs/absorber_simulation_tab.cpp | 10 ++-- .../tabs/absorber_simulation_tab.hpp | 2 +- src/ra/raum_akustik/tabs/generator_tab.cpp | 4 +- .../tool/measurement_recorder.cpp | 4 +- src/ra/unit/frequency.cpp | 11 ++-- src/ra/unit/frequency.hpp | 14 +++-- src/ra/unit/frequency.test.cpp | 18 +++--- src/ra/unit/pressure.hpp | 7 ++- src/ra/unit/temperature.hpp | 10 ++-- 19 files changed, 146 insertions(+), 148 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1d526a3..41780f3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -45,7 +45,7 @@ jobs: - name: Windows os: windows-latest osx_target: "" - cxx_flags: "/EHsc /arch:AVX" + cxx_flags: "-march=x86-64-v2" steps: - name: Checkout code @@ -59,7 +59,7 @@ jobs: run: | sudo apt update -y sudo apt install -y libasound2-dev mesa-common-dev libx11-xcb-dev xorg-dev libx11-dev libxinerama-dev libxext-dev libfreetype6-dev libglu1-mesa-dev xvfb ninja-build ccache - pip3 install --user --upgrade conan + pip3 install --break-system-packages conan - name: Install dependencies (macOS) if: runner.os == 'macOS' @@ -73,17 +73,13 @@ jobs: pip3 install --upgrade conan - name: Install clang - if: runner.os == 'Linux' + if: runner.os != 'macOS' uses: egor-tensin/setup-clang@v1 - - name: Set up Visual Studio shell - if: runner.os == 'Windows' - uses: egor-tensin/vs-shell@v2 - with: - arch: x64 - - name: Setup conan - run: conan profile detect -f + run: | + conan profile detect -f + conan remote add conan-mpusz https://mpusz.jfrog.io/artifactory/api/conan/conan-oss - name: Install ccache uses: hendrikmuhs/ccache-action@main diff --git a/conanfile.txt b/conanfile.txt index 5993e03..d2d6a6d 100644 --- a/conanfile.txt +++ b/conanfile.txt @@ -1,6 +1,6 @@ [requires] catch2/3.6.0 -mp-units/0.8.0 +mp-units/2.2.0@mpusz/testing [options] diff --git a/src/ra/acoustics/absorber/porous_absorber.cpp b/src/ra/acoustics/absorber/porous_absorber.cpp index 3d1fca4..c0ff2e8 100644 --- a/src/ra/acoustics/absorber/porous_absorber.cpp +++ b/src/ra/acoustics/absorber/porous_absorber.cpp @@ -8,13 +8,15 @@ namespace ra { auto propertiesOfAbsorber( PorousAbsorberSpecs specs, AtmosphericEnvironment env, - si::frequency frequency, + quantity frequency, double angle ) -> PorousAbsorberProperties { + using namespace mp_units::si::unit_symbols; + auto const airDensity = densityOfAir(env.temperature, env.pressure); auto const airIm = impedanceOfAir(env.temperature, env.pressure); - auto const twoPiC = (2.0 * std::numbers::pi) / soundVelocity(env.temperature).number(); + auto const twoPiC = (2.0 * std::numbers::pi) / soundVelocity(env.temperature).numerical_value_in(m / s); auto const wn = detail::waveNumber(env.temperature, frequency); auto const nj = std::complex{0.0, -1.0}; @@ -22,7 +24,7 @@ auto propertiesOfAbsorber( { p.X = detail::delanyBazleyTerm(airDensity, frequency, specs.flowResisitivity); p.zca = airIm * std::complex{1 + 0.0571 * (std::pow(p.X, -0.754)), -0.087 * (std::pow(p.X, -0.732))}; - p.k = twoPiC * frequency.number() + p.k = twoPiC * frequency.numerical_value_in(Hz) * std::complex{1 + 0.0978 * std::pow(p.X, -0.7), -0.189 * std::pow(p.X, -0.595)}; p.ky = detail::yComponentOfWaveNumber(wn, angle); p.kx = std::sqrt((p.k * p.k) - std::pow(p.ky, 2)); @@ -62,21 +64,27 @@ auto propertiesOfAbsorber( namespace detail { -auto waveNumber(si::thermodynamic_temperature temperature, si::frequency frequency) -> double +auto waveNumber( + quantity temperature, + quantity frequency +) -> double { // 2p/l - return ((2.0 * std::numbers::pi) / soundVelocity(temperature).number()) * frequency.number(); + using namespace mp_units::si::unit_symbols; + return ((2.0 * std::numbers::pi) / soundVelocity(temperature).numerical_value_in(m / s)) + * frequency.numerical_value_in(Hz); } auto delanyBazleyTerm( - si::density airDensity, - si::frequency frequency, + quantity airDensity, + quantity frequency, double flowResistivity ) -> double { // Eq 5.11 + using namespace mp_units::si::unit_symbols; auto const tmp = (airDensity * frequency) / flowResistivity; - return tmp.number(); + return tmp.numerical_value_in((kg / m3) * Hz / one); } auto yComponentOfWaveNumber(double waveNumber, double angle) -> double diff --git a/src/ra/acoustics/absorber/porous_absorber.hpp b/src/ra/acoustics/absorber/porous_absorber.hpp index a092125..10da2b2 100644 --- a/src/ra/acoustics/absorber/porous_absorber.hpp +++ b/src/ra/acoustics/absorber/porous_absorber.hpp @@ -4,18 +4,19 @@ #include #include -#include +#include +#include #include namespace ra { -using namespace units::isq; +using namespace mp_units; struct AtmosphericEnvironment { - si::thermodynamic_temperature temperature{0}; - si::pressure pressure{0}; + quantity temperature{}; + quantity pressure{}; }; struct PorousAbsorberSpecs @@ -88,17 +89,19 @@ struct PorousAbsorberProperties [[nodiscard]] auto propertiesOfAbsorber( PorousAbsorberSpecs specs, AtmosphericEnvironment env, - si::frequency frequency, + quantity frequency, double angle ) -> PorousAbsorberProperties; namespace detail { -[[nodiscard]] auto -waveNumber(si::thermodynamic_temperature temperature, si::frequency frequency) -> double; +[[nodiscard]] auto waveNumber( + quantity temperature, + quantity frequency +) -> double; [[nodiscard]] auto delanyBazleyTerm( - si::density airDensity, - si::frequency frequency, + quantity airDensity, + quantity frequency, double flowResistivity ) -> double; [[nodiscard]] auto yComponentOfWaveNumber(double waveNumber, double angle) -> double; diff --git a/src/ra/acoustics/absorber/porous_absorber.test.cpp b/src/ra/acoustics/absorber/porous_absorber.test.cpp index d13cbc8..81cc356 100644 --- a/src/ra/acoustics/absorber/porous_absorber.test.cpp +++ b/src/ra/acoustics/absorber/porous_absorber.test.cpp @@ -12,8 +12,7 @@ TEST_CASE("RaumAkustik: propertiesOfAbsorber", "") { { - auto const props - = ra::propertiesOfAbsorber({100.0, 8'000.0, 100.0}, C20, ra::si::frequency{50.0}, 0.0); + auto const props = ra::propertiesOfAbsorber({100.0, 8'000.0, 100.0}, C20, 50.0 * ra::si::hertz, 0.0); REQUIRE(props.X == Catch::Approx(0.0075257395)); REQUIRE(props.zca.real() == Catch::Approx(1355.71904994104)); REQUIRE(props.zca.imag() == Catch::Approx(-1289.23418591288)); @@ -54,7 +53,7 @@ TEST_CASE("RaumAkustik: propertiesOfAbsorber", "") } { - auto const props = ra::propertiesOfAbsorber({100.0, 8'000.0}, C22, ra::si::frequency{50.0}, 0.0); + auto const props = ra::propertiesOfAbsorber({100.0, 8'000.0}, C22, 50.0 * ra::si::hertz, 0.0); REQUIRE(props.X == Catch::Approx(0.0074747434)); REQUIRE(props.zca.real() == Catch::Approx(1355.9444611324)); REQUIRE(props.zca.imag() == Catch::Approx(-1291.26947073563)); @@ -63,8 +62,7 @@ TEST_CASE("RaumAkustik: propertiesOfAbsorber", "") } { - auto const props - = ra::propertiesOfAbsorber({100.0, 8'000.0, 100.0}, C22, ra::si::frequency{50.0}, 15.0); + auto const props = ra::propertiesOfAbsorber({100.0, 8'000.0, 100.0}, C22, 50.0 * ra::si::hertz, 15.0); REQUIRE(props.X == Catch::Approx(0.0074747434)); REQUIRE(props.zca.real() == Catch::Approx(1355.9444611324)); REQUIRE(props.zca.imag() == Catch::Approx(-1291.26947073563)); @@ -75,31 +73,19 @@ TEST_CASE("RaumAkustik: propertiesOfAbsorber", "") TEST_CASE("RaumAkustik: detail::waveNumber", "") { - REQUIRE( - ra::detail::waveNumber(ra::celciusToKelvin(20.0), ra::si::frequency{50.0}) - == Catch::Approx(0.9149) - ); - REQUIRE( - ra::detail::waveNumber(ra::celciusToKelvin(22.0), ra::si::frequency{50.0}) - == Catch::Approx(0.9118) - ); + REQUIRE(ra::detail::waveNumber(ra::celciusToKelvin(20.0), 50.0 * ra::si::hertz) == Catch::Approx(0.9149)); + REQUIRE(ra::detail::waveNumber(ra::celciusToKelvin(22.0), 50.0 * ra::si::hertz) == Catch::Approx(0.9118)); } TEST_CASE("RaumAkustik: detail::delanyBazleyTerm", "") { { auto const density = ra::densityOfAir(ra::celciusToKelvin(20.0), ra::OneAtmosphere); - REQUIRE( - ra::detail::delanyBazleyTerm(density, ra::si::frequency{50.0}, 8'000.0) - == Catch::Approx(0.0075257395) - ); + REQUIRE(ra::detail::delanyBazleyTerm(density, 50.0 * ra::si::hertz, 8'000.0) == Catch::Approx(0.0075257395)); } { auto const density = ra::densityOfAir(ra::celciusToKelvin(22.0), ra::OneAtmosphere); - REQUIRE( - ra::detail::delanyBazleyTerm(density, ra::si::frequency{50.0}, 8'000.0) - == Catch::Approx(0.0074747434) - ); + REQUIRE(ra::detail::delanyBazleyTerm(density, 50.0 * ra::si::hertz, 8'000.0) == Catch::Approx(0.0074747434)); } } @@ -107,20 +93,18 @@ TEST_CASE("RaumAkustik: detail::yComponentOfWaveNumber", "") { using namespace ra::detail; REQUIRE( - yComponentOfWaveNumber(waveNumber(ra::celciusToKelvin(20.0), ra::si::frequency{50.0}), 0.0) - == Catch::Approx(0.0) + yComponentOfWaveNumber(waveNumber(ra::celciusToKelvin(20.0), 50.0 * ra::si::hertz), 0.0) == Catch::Approx(0.0) ); REQUIRE( - yComponentOfWaveNumber(waveNumber(ra::celciusToKelvin(22.0), ra::si::frequency{50.0}), 0.0) - == Catch::Approx(0.0) + yComponentOfWaveNumber(waveNumber(ra::celciusToKelvin(22.0), 50.0 * ra::si::hertz), 0.0) == Catch::Approx(0.0) ); REQUIRE( - yComponentOfWaveNumber(waveNumber(ra::celciusToKelvin(20.0), ra::si::frequency{50.0}), 15.0) + yComponentOfWaveNumber(waveNumber(ra::celciusToKelvin(20.0), 50.0 * ra::si::hertz), 15.0) == Catch::Approx(0.2367929161) ); REQUIRE( - yComponentOfWaveNumber(waveNumber(ra::celciusToKelvin(22.0), ra::si::frequency{50.0}), 15.0) + yComponentOfWaveNumber(waveNumber(ra::celciusToKelvin(22.0), 50.0 * ra::si::hertz), 15.0) == Catch::Approx(0.2359892724) ); } @@ -128,20 +112,8 @@ TEST_CASE("RaumAkustik: detail::yComponentOfWaveNumber", "") TEST_CASE("RaumAkustik: detail::angleOfPropagation", "") { auto const specs = ra::PorousAbsorberSpecs{100.0, 8'000.0}; - REQUIRE( - ra::propertiesOfAbsorber(specs, C20, ra::si::frequency{50.0}, 0.0).betaPorous - == Catch::Approx(0.0) - ); - REQUIRE( - ra::propertiesOfAbsorber(specs, C22, ra::si::frequency{50.0}, 0.0).betaPorous - == Catch::Approx(0.0) - ); - REQUIRE( - ra::propertiesOfAbsorber(specs, C20, ra::si::frequency{50.0}, 15.0).betaPorous - == Catch::Approx(2.8036973865) - ); - REQUIRE( - ra::propertiesOfAbsorber(specs, C22, ra::si::frequency{50.0}, 15.0).betaPorous - == Catch::Approx(2.7931256656) - ); + REQUIRE(ra::propertiesOfAbsorber(specs, C20, 50.0 * ra::si::hertz, 0.0).betaPorous == Catch::Approx(0.0)); + REQUIRE(ra::propertiesOfAbsorber(specs, C22, 50.0 * ra::si::hertz, 0.0).betaPorous == Catch::Approx(0.0)); + REQUIRE(ra::propertiesOfAbsorber(specs, C20, 50.0 * ra::si::hertz, 15.0).betaPorous == Catch::Approx(2.8036973865)); + REQUIRE(ra::propertiesOfAbsorber(specs, C22, 50.0 * ra::si::hertz, 15.0).betaPorous == Catch::Approx(2.7931256656)); } diff --git a/src/ra/acoustics/air.cpp b/src/ra/acoustics/air.cpp index bfb5c1a..a4a5019 100644 --- a/src/ra/acoustics/air.cpp +++ b/src/ra/acoustics/air.cpp @@ -1,30 +1,37 @@ #include "air.hpp" -#include - -#include +#include namespace ra { -auto densityOfAir(si::thermodynamic_temperature temp, si::pressure pressure) noexcept - -> si::density +auto densityOfAir( + quantity temp, + quantity pressure +) noexcept -> quantity { - static constexpr auto GasConstant = si::specific_heat_capacity{287.05}; + using namespace mp_units::si::unit_symbols; + + static constexpr auto GasConstant = 287.05 * J / (kg * K); return pressure / (GasConstant * temp); } -auto soundVelocity(si::thermodynamic_temperature temp) noexcept -> si::speed +auto soundVelocity(quantity temp +) noexcept -> quantity { + using namespace mp_units::si::unit_symbols; + static constexpr auto SpecificHeatRatio = 1.402; - static constexpr auto DensityAtZeroC = si::density{1.293}; - return sqrt((SpecificHeatRatio * OneAtmosphere) / DensityAtZeroC) - * sqrt(temp / si::thermodynamic_temperature{273.15}); + static constexpr auto DensityAtZeroC = 1.293 * si::kilogram / cubic(si::metre); + return sqrt((SpecificHeatRatio * OneAtmosphere) / DensityAtZeroC) * sqrt(temp / (273.15 * si::kelvin)); } -auto impedanceOfAir(si::thermodynamic_temperature temp, si::pressure pressure) noexcept - -> double +auto impedanceOfAir( + quantity temp, + quantity pressure +) noexcept -> double { + using namespace mp_units::si::unit_symbols; auto const i = soundVelocity(temp) * densityOfAir(temp, pressure); - return i.number(); + return i.numerical_value_in((m / s) * (kg / m3)); } } // namespace ra diff --git a/src/ra/acoustics/air.hpp b/src/ra/acoustics/air.hpp index 1b94b4e..f2af7b1 100644 --- a/src/ra/acoustics/air.hpp +++ b/src/ra/acoustics/air.hpp @@ -4,20 +4,22 @@ #include #include -#include -#include +#include +#include namespace ra { -using namespace units::isq; +using namespace mp_units; -[[nodiscard]] auto -densityOfAir(si::thermodynamic_temperature temperature, si::pressure pressure) noexcept - -> si::density; -[[nodiscard]] auto soundVelocity(si::thermodynamic_temperature temperature -) noexcept -> si::speed; -[[nodiscard]] auto -impedanceOfAir(si::thermodynamic_temperature temperature, si::pressure pressure) noexcept - -> double; +[[nodiscard]] auto densityOfAir( + quantity temperature, + quantity pressure +) noexcept -> quantity; +[[nodiscard]] auto soundVelocity(quantity temperature +) noexcept -> quantity; +[[nodiscard]] auto impedanceOfAir( + quantity temperature, + quantity pressure +) noexcept -> double; } // namespace ra diff --git a/src/ra/acoustics/air.test.cpp b/src/ra/acoustics/air.test.cpp index 3edb719..c28680d 100644 --- a/src/ra/acoustics/air.test.cpp +++ b/src/ra/acoustics/air.test.cpp @@ -6,30 +6,30 @@ TEST_CASE("RaumAkustik: densityOfAir", "") { - auto c20 = ra::si::thermodynamic_temperature{273.15 + 20.0}; - auto c22 = ra::si::thermodynamic_temperature{273.15 + 22.0}; + using namespace mp_units::si::unit_symbols; + + auto c20 = (273.15 + 20.0) * ra::si::kelvin; + auto c22 = (273.15 + 22.0) * ra::si::kelvin; auto p = ra::OneAtmosphere; - REQUIRE( - ra::densityOfAir(c20, p).number() - == Catch::Approx(ra::si::density{1.20412}.number()) - ); - REQUIRE( - ra::densityOfAir(c22, p).number() - == Catch::Approx(ra::si::density{1.19596}.number()) - ); + REQUIRE(ra::densityOfAir(c20, p).numerical_value_in(kg / m3) == Catch::Approx(1.20412)); + REQUIRE(ra::densityOfAir(c22, p).numerical_value_in(kg / m3) == Catch::Approx(1.19596)); } TEST_CASE("RaumAkustik: soundVelocity", "") { - REQUIRE(ra::soundVelocity(ra::celciusToKelvin(20.0)).number() == Catch::Approx(343.38)); - REQUIRE(ra::soundVelocity(ra::celciusToKelvin(22.0)).number() == Catch::Approx(344.55)); + using namespace mp_units::si::unit_symbols; + + REQUIRE(ra::soundVelocity(ra::celciusToKelvin(20.0)).numerical_value_in(m / s) == Catch::Approx(343.38)); + REQUIRE(ra::soundVelocity(ra::celciusToKelvin(22.0)).numerical_value_in(m / s) == Catch::Approx(344.55)); } TEST_CASE("RaumAkustik: impedanceOfAir", "") { - auto c20 = ra::si::thermodynamic_temperature{273.15 + 20.0}; - auto c22 = ra::si::thermodynamic_temperature{273.15 + 22.0}; + using namespace mp_units::si::unit_symbols; + + auto c20 = (273.15 + 20.0) * ra::si::kelvin; + auto c22 = (273.15 + 22.0) * ra::si::kelvin; auto p = ra::OneAtmosphere; REQUIRE(ra::impedanceOfAir(c20, p) == Catch::Approx(413.47)); REQUIRE(ra::impedanceOfAir(c22, p) == Catch::Approx(412.07)); diff --git a/src/ra/generator/sweep.cpp b/src/ra/generator/sweep.cpp index 1e0a688..84d0198 100644 --- a/src/ra/generator/sweep.cpp +++ b/src/ra/generator/sweep.cpp @@ -35,8 +35,8 @@ auto generate(SineSweep const& spec) -> std::vector }; auto const fs = spec.sampleRate; - auto const f1 = spec.from.number(); - auto const f2 = spec.to.number(); + auto const f1 = spec.from.numerical_value_in(si::hertz); + auto const f2 = spec.to.numerical_value_in(si::hertz); auto const numSamples = static_cast(std::chrono::duration_cast(spec.duration).count() * fs); auto buffer = std::vector(numSamples, 0.0F); diff --git a/src/ra/generator/sweep.hpp b/src/ra/generator/sweep.hpp index 43cff6e..7944142 100644 --- a/src/ra/generator/sweep.hpp +++ b/src/ra/generator/sweep.hpp @@ -15,8 +15,8 @@ enum struct SineSweepCurve struct SineSweep { - si::frequency from{20.0}; - si::frequency to{20'000.0}; + quantity from{20.0 * si::hertz}; + quantity to{20'000.0 * si::hertz}; SineSweepCurve curve{SineSweepCurve::Linear}; std::chrono::milliseconds duration{1'000}; double sampleRate{44'100.0}; diff --git a/src/ra/raum_akustik/tabs/absorber_simulation_tab.cpp b/src/ra/raum_akustik/tabs/absorber_simulation_tab.cpp index 6875fb6..6c278b9 100644 --- a/src/ra/raum_akustik/tabs/absorber_simulation_tab.cpp +++ b/src/ra/raum_akustik/tabs/absorber_simulation_tab.cpp @@ -5,9 +5,9 @@ namespace ra { namespace { -auto positionForFrequency(si::frequency const freq) noexcept -> double +auto positionForFrequency(quantity const freq) noexcept -> double { - return (std::log(freq.number() / 20.0) / std::numbers::ln2) / 10.0; + return (std::log(freq.numerical_value_in(si::hertz) / 20.0) / std::numbers::ln2) / 10.0; } } // namespace @@ -94,7 +94,7 @@ auto PorousAbsorberSimulationEditor::paint(juce::Graphics& g) -> void g.setColour(juce::Colours::grey.withAlpha(0.5F)); for (auto freq : std::array{31.25, 62.50, 125.0, 250.0, 500.0, 1'000.0, 2'000.0, 4'000.0, 8'000.0}) { - auto const freqPos = static_cast(positionForFrequency(si::frequency{freq})); + auto const freqPos = static_cast(positionForFrequency(freq * si::hertz)); auto const x = static_cast(_plotArea.getX()) + static_cast(_plotArea.getWidth()) * freqPos; auto const topY = static_cast(_plotArea.getY()); auto const bottomY = static_cast(_plotArea.getBottom()); @@ -171,7 +171,7 @@ auto PorousAbsorberSimulationEditor:: g.setFont(16.0F); if (columnId == 1) { - auto const frequency = juce::String{_props[static_cast(row)].first.number()}; + auto const frequency = juce::String{_props[static_cast(row)].first.numerical_value_in(si::hertz)}; g.drawText(frequency, 2, 0, width - 4, height, juce::Justification::centredLeft, true); } @@ -206,7 +206,7 @@ auto PorousAbsorberSimulationEditor::updateSimulation() -> void static_cast(_pressure) * OneAtmosphere, }; - auto const startFrequency = si::frequency{static_cast(_plotStartFrequency)}; + auto const startFrequency = static_cast(_plotStartFrequency) * si::hertz; auto const subDivisions = static_cast(_plotOctaveSubdivision); for (auto i{0}; i < static_cast(_plotNumPoints); ++i) { diff --git a/src/ra/raum_akustik/tabs/absorber_simulation_tab.hpp b/src/ra/raum_akustik/tabs/absorber_simulation_tab.hpp index d5080cb..01190cb 100644 --- a/src/ra/raum_akustik/tabs/absorber_simulation_tab.hpp +++ b/src/ra/raum_akustik/tabs/absorber_simulation_tab.hpp @@ -47,7 +47,7 @@ struct PorousAbsorberSimulationEditor final juce::CachedValue _plotStartFrequency{_valueTree, "plotStartFrequency", _undoManager}; juce::CachedValue _plotOctaveSubdivision{_valueTree, "plotOctaveSubdivision", _undoManager}; - std::vector, PorousAbsorberProperties>> _props; + std::vector, PorousAbsorberProperties>> _props; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PorousAbsorberSimulationEditor) // NOLINT }; diff --git a/src/ra/raum_akustik/tabs/generator_tab.cpp b/src/ra/raum_akustik/tabs/generator_tab.cpp index 5965cda..7bdde46 100644 --- a/src/ra/raum_akustik/tabs/generator_tab.cpp +++ b/src/ra/raum_akustik/tabs/generator_tab.cpp @@ -203,8 +203,8 @@ auto GeberatorEditor::resized() -> void auto GeberatorEditor::handleAsyncUpdate() -> void { // auto const spec = SineSweep{ - // .from = si::frequency{static_cast(_from)}, - // .to = si::frequency{static_cast(_to)}, + // .from = static_cast(_from)*si::hertz, + // .to = static_cast(_to)*si::hertz, // .curve = static_cast(_curve) ? SineSweepCurve::Logarithmic : SineSweepCurve::Linear, // .duration = std::chrono::milliseconds{juce::roundToInt(static_cast(_duration))}, // .sampleRate = static_cast(_sampleRate), diff --git a/src/ra/raum_akustik/tool/measurement_recorder.cpp b/src/ra/raum_akustik/tool/measurement_recorder.cpp index 3d4b011..72e6461 100644 --- a/src/ra/raum_akustik/tool/measurement_recorder.cpp +++ b/src/ra/raum_akustik/tool/measurement_recorder.cpp @@ -77,8 +77,8 @@ void MeasurementRecorder::audioDeviceAboutToStart(juce::AudioIODevice* device) _sampleRate = device->getCurrentSampleRate(); _sweep = generate(SineSweep{ - .from = si::frequency{20.0}, - .to = si::frequency{20'000.0}, + .from = 20.0 * si::hertz, + .to = 20'000.0 * si::hertz, .curve = SineSweepCurve::Logarithmic, .duration = std::chrono::milliseconds{10'000}, .sampleRate = _sampleRate, diff --git a/src/ra/unit/frequency.cpp b/src/ra/unit/frequency.cpp index 68a2fdd..e3befb2 100644 --- a/src/ra/unit/frequency.cpp +++ b/src/ra/unit/frequency.cpp @@ -7,15 +7,16 @@ namespace ra { -auto oactaveSubdivision(si::frequency start, double numSubdivisions, double index) - -> si::frequency +auto oactaveSubdivision(quantity start, double numSubdivisions, double index) + -> quantity { - return si::frequency{std::pow(2.0, std::log2(start.number()) + index / numSubdivisions)}; + return std::pow(2.0, std::log2(start.numerical_value_in(si::hertz)) + index / numSubdivisions) * si::hertz; } -auto toAngularVelocity(si::frequency hertz) -> si::angular_velocity +auto toAngularVelocity(quantity hertz +) -> quantity { static constexpr auto twoPi = std::numbers::pi * 2.0; - return si::angular_velocity{twoPi * hertz.number()}; + return twoPi * hertz.numerical_value_in(si::hertz) * si::radian / si::second; } } // namespace ra diff --git a/src/ra/unit/frequency.hpp b/src/ra/unit/frequency.hpp index a7d3841..1483f6c 100644 --- a/src/ra/unit/frequency.hpp +++ b/src/ra/unit/frequency.hpp @@ -1,13 +1,15 @@ #pragma once -#include -#include +#include +#include namespace ra { -using namespace units::isq; -[[nodiscard]] auto -oactaveSubdivision(si::frequency start, double numSubdivisions, double index) -> si::frequency; -[[nodiscard]] auto toAngularVelocity(si::frequency hertz) -> si::angular_velocity; +using namespace mp_units; + +[[nodiscard]] auto oactaveSubdivision(quantity start, double numSubdivisions, double index) + -> quantity; +[[nodiscard]] auto toAngularVelocity(quantity hertz +) -> quantity; } // namespace ra diff --git a/src/ra/unit/frequency.test.cpp b/src/ra/unit/frequency.test.cpp index c798726..37d622e 100644 --- a/src/ra/unit/frequency.test.cpp +++ b/src/ra/unit/frequency.test.cpp @@ -5,15 +5,19 @@ TEST_CASE("RaumAkustik: oactaveSubdivision", "") { - REQUIRE(ra::oactaveSubdivision(ra::si::frequency{50.0}, 6, 1).number() == Catch::Approx(56.1231024)); - REQUIRE(ra::oactaveSubdivision(ra::si::frequency{50.0}, 6, 2).number() == Catch::Approx(62.9960524)); + using namespace mp_units::si::unit_symbols; + + REQUIRE(ra::oactaveSubdivision(50.0 * Hz, 6, 1).numerical_value_in(Hz) == Catch::Approx(56.1231024)); + REQUIRE(ra::oactaveSubdivision(50.0 * Hz, 6, 2).numerical_value_in(Hz) == Catch::Approx(62.9960524)); } TEST_CASE("RaumAkustik: toAngularVelocity", "") { - REQUIRE(ra::toAngularVelocity(ra::si::frequency{0.0}).number() == Catch::Approx(0.0)); - REQUIRE(ra::toAngularVelocity(ra::si::frequency{50.0}).number() == Catch::Approx(314.15927)); - REQUIRE(ra::toAngularVelocity(ra::si::frequency{53.0}).number() == Catch::Approx(333.00882)); - REQUIRE(ra::toAngularVelocity(ra::si::frequency{56.0}).number() == Catch::Approx(351.85838)); - REQUIRE(ra::toAngularVelocity(ra::si::frequency{59.0}).number() == Catch::Approx(370.70793)); + using namespace mp_units::si::unit_symbols; + + REQUIRE(ra::toAngularVelocity(0.0 * Hz).numerical_value_in(rad / s) == Catch::Approx(0.0)); + REQUIRE(ra::toAngularVelocity(50.0 * Hz).numerical_value_in(rad / s) == Catch::Approx(314.15927)); + REQUIRE(ra::toAngularVelocity(53.0 * Hz).numerical_value_in(rad / s) == Catch::Approx(333.00882)); + REQUIRE(ra::toAngularVelocity(56.0 * Hz).numerical_value_in(rad / s) == Catch::Approx(351.85838)); + REQUIRE(ra::toAngularVelocity(59.0 * Hz).numerical_value_in(rad / s) == Catch::Approx(370.70793)); } diff --git a/src/ra/unit/pressure.hpp b/src/ra/unit/pressure.hpp index 0a3252e..84e6628 100644 --- a/src/ra/unit/pressure.hpp +++ b/src/ra/unit/pressure.hpp @@ -1,11 +1,12 @@ #pragma once -#include +#include +#include namespace ra { -using namespace units::isq; +using namespace mp_units; template -inline constexpr auto OneAtmosphere = si::pressure{T(101325.0)}; +inline constexpr QuantityOf auto OneAtmosphere = static_cast(101325.0) * si::pascal; } // namespace ra diff --git a/src/ra/unit/temperature.hpp b/src/ra/unit/temperature.hpp index 7d78e95..050b626 100644 --- a/src/ra/unit/temperature.hpp +++ b/src/ra/unit/temperature.hpp @@ -1,13 +1,15 @@ #pragma once -#include +#include +#include namespace ra { -using namespace units::isq; +using namespace mp_units; -[[nodiscard]] constexpr auto celciusToKelvin(double celcius) noexcept -> si::thermodynamic_temperature +[[nodiscard]] constexpr auto celciusToKelvin(double celcius +) noexcept -> quantity { - return si::thermodynamic_temperature{celcius + 273.15}; + return (celcius + 273.15) * si::kelvin; } } // namespace ra