def test_multiplication(): """ Multiply two units. """ msun_mks = mass_sun_kg pc_mks = m_per_pc # Create symbols msun_sym = Symbol("Msun", positive=True) pc_sym = Symbol("pc", positive=True) s_sym = Symbol("s", positive=True) # Create units u1 = Unit("Msun") u2 = Unit("pc") # Mul operation u3 = u1 * u2 assert u3.expr == msun_sym * pc_sym assert_allclose_units(u3.base_value, msun_mks * pc_mks, 1e-12) assert u3.dimensions == mass * length # Pow and Mul operations u4 = Unit("pc**2") u5 = Unit("Msun * s") u6 = u4 * u5 assert u6.expr == pc_sym**2 * msun_sym * s_sym assert_allclose_units(u6.base_value, pc_mks**2 * msun_mks, 1e-12) assert u6.dimensions == length**2 * mass * time
def test_base_equivalent(): """ Check base equivalent of a unit. """ Msun_mks = mass_sun_kg Mpc_mks = m_per_mpc u1 = Unit("Msun * Mpc**-3") u2 = Unit("kg * m**-3") u3 = u1.get_base_equivalent() assert u2.expr == u3.expr assert u2 == u3 assert_allclose_units(u1.base_value, Msun_mks / Mpc_mks**3, 1e-12) assert u2.base_value == 1 assert u3.base_value == 1 mass_density = mass / length**3 assert u1.dimensions == mass_density assert u2.dimensions == mass_density assert u3.dimensions == mass_density assert_allclose_units( u1.get_conversion_factor(u3)[0], Msun_mks / Mpc_mks**3, 1e-12) with pytest.raises(UnitConversionError): u1.get_conversion_factor(Unit('m')) with pytest.raises(UnitConversionError): u1.get_conversion_factor(Unit('degF'))
def test_create_from_expr(): """ Create units from sympy Exprs and check attributes. """ pc_mks = m_per_pc yr_mks = sec_per_year # Symbol expr s1 = Symbol("pc", positive=True) s2 = Symbol("yr", positive=True) # Mul expr s3 = s1 * s2 # Pow expr s4 = s1**2 * s2**(-1) u1 = Unit(s1) u2 = Unit(s2) u3 = Unit(s3) u4 = Unit(s4) assert u1.expr == s1 assert u2.expr == s2 assert u3.expr == s3 assert u4.expr == s4 assert_allclose_units(u1.base_value, pc_mks, 1e-12) assert_allclose_units(u2.base_value, yr_mks, 1e-12) assert_allclose_units(u3.base_value, pc_mks * yr_mks, 1e-12) assert_allclose_units(u4.base_value, pc_mks**2 / yr_mks, 1e-12) assert u1.dimensions == length assert u2.dimensions == time assert u3.dimensions == length * time assert u4.dimensions == length**2 / time
def test_create_with_duplicate_dimensions(): """ Create units with overlapping dimensions. Ex: km/Mpc. """ u1 = Unit("J * s**-1") u2 = Unit("km/s/Mpc") km_mks = m_per_km Mpc_mks = m_per_mpc assert u1.base_value == 1 assert u1.dimensions == power assert_allclose_units(u2.base_value, km_mks / Mpc_mks, 1e-12) assert u2.dimensions == rate
def test_base_equivalent(): """ Check base equivalent of a unit. """ Msun_mks = mass_sun_kg Mpc_mks = m_per_mpc u1 = Unit("Msun * Mpc**-3") u2 = Unit("kg * m**-3") u3 = u1.get_base_equivalent() assert u2.expr == u3.expr assert u2 == u3 assert_allclose_units(u1.base_value, Msun_mks / Mpc_mks ** 3, 1e-12) assert u2.base_value == 1 assert u3.base_value == 1 mass_density = mass / length ** 3 assert u1.dimensions == mass_density assert u2.dimensions == mass_density assert u3.dimensions == mass_density assert_allclose_units( u1.get_conversion_factor(u3)[0], Msun_mks / Mpc_mks ** 3, 1e-12 ) with pytest.raises(UnitConversionError): u1.get_conversion_factor(Unit("m")) with pytest.raises(UnitConversionError): u1.get_conversion_factor(Unit("degF")) reg = UnitRegistry(unit_system=cgs_unit_system) u = Unit("kg", registry=reg) assert u.get_base_equivalent() == Unit("g") u = Unit("kg") assert u.get_base_equivalent() == Unit("kg") u = Unit("A") assert u.get_base_equivalent(unit_system="mks") == Unit("A")
def test_power(): """ Take units to some power. """ from sympy import nsimplify pc_mks = m_per_pc mK_mks = 1e-3 u1_dims = mass * length**2 * time**-3 * temperature**4 u1 = Unit("kg * pc**2 * s**-3 * mK**4") u2 = u1**2 assert u2.dimensions == u1_dims**2 assert_allclose_units(u2.base_value, (pc_mks**2 * mK_mks**4)**2, 1e-12) u3 = u1**(-1.0 / 3) assert u3.dimensions == nsimplify(u1_dims**(-1.0 / 3)) assert_allclose_units(u3.base_value, (pc_mks**2 * mK_mks**4)**(-1.0 / 3), 1e-12)
def test_division(): """ Divide two units. """ pc_mks = m_per_pc km_mks = m_per_km # Create symbols pc_sym = Symbol("pc", positive=True) km_sym = Symbol("km", positive=True) s_sym = Symbol("s", positive=True) # Create units u1 = Unit("pc") u2 = Unit("km * s") u3 = u1 / u2 assert u3.expr == pc_sym / (km_sym * s_sym) assert_allclose_units(u3.base_value, pc_mks / km_mks, 1e-12) assert u3.dimensions == 1 / time