Skip to main content
`Ctrl`+`K`

# Physical Types

A physical type corresponds to physical quantities with dimensionally compatible units. For example, the physical type mass corresponds to physical quantities with units that can be converted to kilograms. Physical types are represented as instances of the |PhysicalType| class.

For a list of physical types, see `astropy.units.physical`.

## Accessing Physical Types

Using `get_physical_type()` lets us acquire |PhysicalType| instances from strings with a name of a physical type, units, |Quantity| instances, objects that can become quantities (e.g., numbers), and |PhysicalType| instances.

    >>> import astropy.units as u
    >>> u.get_physical_type('speed')  # from the name of a physical type
    PhysicalType({'speed', 'velocity'})
    >>> u.get_physical_type(u.meter)  # from a unit
    PhysicalType('length')
    >>> u.get_physical_type(1 * u.barn * u.Mpc)  # from a Quantity
    PhysicalType('volume')
    >>> u.get_physical_type(42)  # from a number
    PhysicalType('dimensionless')

The physical type of a unit can be accessed via its `physical_type` attribute:

    >>> u.coulomb.physical_type
    PhysicalType('electrical charge')
    >>> (u.meter ** 2).physical_type
    PhysicalType('area')

## Using Physical Types

An equality comparison between a |PhysicalType| and a string will return `True` if the string is a name of the |PhysicalType|:

    >>> acceleration = u.get_physical_type(u.m / u.s ** 2)
    >>> acceleration == 'acceleration'
    True

Some units may correspond to multiple physical types because compatible units can be used to quantify different phenomena:

    >>> u.get_physical_type('pressure')
    PhysicalType({'energy density', 'pressure', 'stress'})

We can iterate through the names of a |PhysicalType|:

    >>> for name in u.J.physical_type: print(name)
    energy
    torque
    work

We can test for membership or equality with a string that has the name of a |PhysicalType|:

    >>> 'energy' == u.J.physical_type
    True
    >>> 'work' in u.J.physical_type
    True

## Dimensional Analysis

|PhysicalType| instances support multiplication, division, and exponentiation. Because of this, they can be used for dimensional analysis:

    >>> length = u.get_physical_type('length')
    >>> time = u.get_physical_type('time')
    >>> length ** 2
    PhysicalType('area')
    >>> 1 / time
    PhysicalType('frequency')

Dimensional analysis can be performed between a |PhysicalType| and a unit or between a |PhysicalType| and a string with a name of a |PhysicalType|:

    >>> length ** 2 / u.s
    PhysicalType({'diffusivity', 'kinematic viscosity'})
    >>> length / 'time'
    PhysicalType({'speed', 'velocity'})