From 8b4444e4325837e44be3a3978aa63f4e9484630b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20A=2E=20Michel=C3=A9n=20Str=C3=B6fer?= Date: Tue, 4 Jul 2023 13:04:39 -0600 Subject: [PATCH] include spatial frequency in Periodic() --- src/DimensionfulAngles.jl | 10 ++++++--- src/derived.jl | 27 +++++++++++++++++++++-- test/test_core_package.jl | 45 +++++++++++++++++++++++++++++++++++---- 3 files changed, 73 insertions(+), 9 deletions(-) diff --git a/src/DimensionfulAngles.jl b/src/DimensionfulAngles.jl index 9273326..d1efb79 100644 --- a/src/DimensionfulAngles.jl +++ b/src/DimensionfulAngles.jl @@ -28,9 +28,10 @@ module DimensionfulAngles # using Base: Base # extend: see `base.jl` for full list of functions extended using Unitful: Unitful # extend: has_unit_spacing, -using Unitful: minute, promotion, rad, s, 𝐓 -using Unitful: Dimension, DimensionlessQuantity, Frequency, FrequencyFreeUnits, MixedUnits -using Unitful: NoDims, NoUnits, Number, Quantity, Time, Unitlike, Unit, Units +using Unitful: minute, promotion, rad, s, 𝐓, 𝐋 +using Unitful: Dimension, DimensionlessQuantity, Frequency, FrequencyFreeUnits, Length +using Unitful: MixedUnits, NoDims, NoUnits, Number, Quantity, Time, Unitlike, Unit, Units +using Unitful: Wavenumber using Unitful: @dimension, @refunit, @derived_dimension, @unit using Unitful: dimension, register, uconvert, unit, ustrip using UnitfulEquivalences: Equivalence, @eqrelation @@ -43,6 +44,9 @@ export sexagesimal, show_sexagesimal # export SolidAngle, SolidAngleUnits, SolidAngleFreeUnits # export AngularVelocity, AngularVelocityUnits, AngularVelocityFreeUnits # export AngularAcceleration, AngularAccelerationUnits, AngularAccelerationFreeUnits +# export AngularPeriod, AngularPeriodUnits, AngularPeriodFreeUnits +# export AngularWavenumber, AngularWavenumberUnits, AngularWavenumberUnits +# export AngularWavelength, AngularWavelengthUnits, AngularWavelengthFreeUnits """ 𝐀 diff --git a/src/derived.jl b/src/derived.jl index 3f1b5ec..da8d7fe 100644 --- a/src/derived.jl +++ b/src/derived.jl @@ -50,6 +50,12 @@ See also [`DimensionfulAngles.radᵃ`](@ref). """ @unit rpmᵃ "rps" RevolutionsPerMinuteᵃ (1turnᵃ/minute) false +# Angular wavenumber, angular wavelength, angular period +@derived_dimension AngularWavenumber (𝐀*𝐋^-1) true +@derived_dimension AngularWavelength (𝐋*𝐀^-1) true +@derived_dimension AngularPeriod (𝐓*𝐀^-1) true + +# periodic equivalence for both temporal and spatial frequency """ Periodic() @@ -76,10 +82,27 @@ julia> uconvert(u"radᵃ/s", 1u"Hz", Periodic()) ``` """ struct Periodic <: Equivalence end +# temporal @eqrelation Periodic (AngularVelocity / Frequency = 2π * radᵃ) @eqrelation Periodic (Frequency * Time = 1) @eqrelation Periodic (AngularVelocity * Time = 2π * radᵃ) -# so that it defaults to `uconvert` behavior -@eqrelation Periodic (AngularVelocity / AngularVelocity = 1) +@eqrelation Periodic (AngularVelocity * AngularPeriod = 1) +@eqrelation Periodic (Time / AngularPeriod = 2π * radᵃ) +@eqrelation Periodic (AngularPeriod * Frequency = 1/(2π * radᵃ)) +# spatial +@eqrelation Periodic (AngularWavenumber / Wavenumber = 2π * radᵃ) +@eqrelation Periodic (Wavenumber * Length = 1) +@eqrelation Periodic (AngularWavenumber * Length = 2π * radᵃ) +@eqrelation Periodic (AngularWavenumber * AngularWavelength = 1) +@eqrelation Periodic (Length / AngularWavelength = 2π * radᵃ) +@eqrelation Periodic (AngularWavelength * Wavenumber = 1/(2π * radᵃ)) +# default to `uconvert` behavior, temporal @eqrelation Periodic (Frequency / Frequency = 1) @eqrelation Periodic (Time / Time = 1) +@eqrelation Periodic (AngularVelocity / AngularVelocity = 1) +@eqrelation Periodic (AngularPeriod / AngularPeriod = 1) +# default to `uconvert` behavior, spatial +@eqrelation Periodic (Wavenumber / Wavenumber = 1) +@eqrelation Periodic (Length / Length = 1) +@eqrelation Periodic (AngularWavenumber / AngularWavenumber = 1) +@eqrelation Periodic (AngularWavelength / AngularWavelength = 1) diff --git a/test/test_core_package.jl b/test/test_core_package.jl index 2e506d7..96a81bd 100644 --- a/test/test_core_package.jl +++ b/test/test_core_package.jl @@ -1,5 +1,5 @@ using Test, DimensionfulAngles, Unitful -using Unitful: 𝐓, FreeUnits, Units +using Unitful: 𝐓, 𝐋, FreeUnits, Units using DimensionfulAngles: 𝐀 function test_uamacro(unit::Symbol) @@ -125,16 +125,53 @@ end test_uamacro(:rpm) @test isa(1u"radᵃ/s^2", DimensionfulAngles.AngularAcceleration) - # periodic + # angular wavenumber, angular wavelength, angular period + @test typeof(DimensionfulAngles.AngularWavenumber) === UnionAll + @test DimensionfulAngles.AngularWavenumberFreeUnits === FreeUnits{U, 𝐀 * 𝐋^-1} where {U} + @test DimensionfulAngles.AngularWavenumberUnits === Units{U, 𝐀 * 𝐋^-1} where {U} + + @test typeof(DimensionfulAngles.AngularWavelength) === UnionAll + @test DimensionfulAngles.AngularWavelengthFreeUnits === FreeUnits{U, 𝐀^-1 * 𝐋} where {U} + @test DimensionfulAngles.AngularWavelengthUnits === Units{U, 𝐀^-1 * 𝐋} where {U} + + @test typeof(DimensionfulAngles.AngularPeriod) === UnionAll + @test DimensionfulAngles.AngularPeriodFreeUnits === FreeUnits{U, 𝐀^-1 * 𝐓} where {U} + @test DimensionfulAngles.AngularPeriodUnits === Units{U, 𝐀^-1 * 𝐓} where {U} + + # periodic: temporal @test uconvert(u"radᵃ/s", 1u"Hz", Periodic()) ≈ (2π)u"radᵃ/s" @test uconvert(u"Hz", 1u"radᵃ/s", Periodic()) ≈ (1 / 2π)u"Hz" @test uconvert(u"Hz", 10u"s", Periodic()) ≈ 0.1u"Hz" @test uconvert(u"s", 10u"Hz", Periodic()) ≈ 0.1u"s" @test uconvert(u"s", 2u"radᵃ/s", Periodic()) ≈ (π)u"s" @test uconvert(u"radᵃ/s", (π)u"s", Periodic()) ≈ 2u"radᵃ/s" - @test uconvert(u"radᵃ/s", 10u"radᵃ/s", Periodic()) ≈ 10u"radᵃ/s" - @test uconvert(u"1/s", 10u"1/s", Periodic()) ≈ 10u"1/s" + @test uconvert(u"s/radᵃ", 10u"radᵃ/s", Periodic()) ≈ 0.1u"s/radᵃ" + @test uconvert(u"radᵃ/s", 10u"s/radᵃ", Periodic()) ≈ 0.1u"radᵃ/s" + @test uconvert(u"s/radᵃ", 1u"s", Periodic()) ≈ (1 / 2π)u"s/radᵃ" + @test uconvert(u"s", 1u"s/radᵃ", Periodic()) ≈ (2π)u"s" + @test uconvert(u"s/radᵃ", 1u"Hz", Periodic()) ≈ (1 / 2π)u"s/radᵃ" + @test uconvert(u"Hz", 1u"s/radᵃ", Periodic()) ≈ (1 / 2π)u"Hz" + @test uconvert(u"Hz", 10u"Hz", Periodic()) ≈ 10u"1/s" @test uconvert(u"s", 10u"s", Periodic()) ≈ 10u"s" + @test uconvert(u"radᵃ/s", 10u"radᵃ/s", Periodic()) ≈ 10u"radᵃ/s" + @test uconvert(u"s/radᵃ", 10u"s/radᵃ", Periodic()) ≈ 10u"s/radᵃ" + # periodic: spatial + @test uconvert(u"radᵃ/m", 1u"1/m", Periodic()) ≈ (2π)u"radᵃ/m" + @test uconvert(u"m^-1", 1u"radᵃ/m", Periodic()) ≈ (1 / 2π)u"1/m" + @test uconvert(u"m^-1", 10u"m", Periodic()) ≈ 0.1u"1/m" + @test uconvert(u"m", 10u"m^-1", Periodic()) ≈ 0.1u"m" + @test uconvert(u"m", 2u"radᵃ/m", Periodic()) ≈ (π)u"m" + @test uconvert(u"radᵃ/m", (π)u"m", Periodic()) ≈ 2u"radᵃ/m" + @test uconvert(u"m/radᵃ", 10u"radᵃ/m", Periodic()) ≈ 0.1u"m/radᵃ" + @test uconvert(u"radᵃ/m", 10u"m/radᵃ", Periodic()) ≈ 0.1u"radᵃ/m" + @test uconvert(u"m/radᵃ", 1u"m", Periodic()) ≈ (1 / 2π)u"m/radᵃ" + @test uconvert(u"m", 1u"m/radᵃ", Periodic()) ≈ (2π)u"m" + @test uconvert(u"m/radᵃ", 1u"m^-1", Periodic()) ≈ (1 / 2π)u"m/radᵃ" + @test uconvert(u"m^-1", 1u"m/radᵃ", Periodic()) ≈ (1 / 2π)u"1/m" + @test uconvert(u"m^-1", 10u"m^-1", Periodic()) ≈ 10u"1/m" + @test uconvert(u"m", 10u"m", Periodic()) ≈ 10u"m" + @test uconvert(u"radᵃ/m", 10u"radᵃ/m", Periodic()) ≈ 10u"radᵃ/m" + @test uconvert(u"m/radᵃ", 10u"m/radᵃ", Periodic()) ≈ 10u"m/radᵃ" end @testset "DefaultSymbols" begin