Для конвертации единиц измерения физических величин будем использовать пакет Pint. Устанавливается Pint вводом в терминале команды
pip install pint
или для окружения Anaconda
conda install -c conda-forge pint
С помощью Pint можно, например, складывать друг с другом сантиметры, километры, футы и получать правильный результат.
Вычислим 1000 см + 0,1 км + 10 футов
>>># Импортируем класс, работающий с единицами измерения
>>>from pint import UnitRegistry
>>># Создаём экземпляр класса, работающего с единицами измерения
>>>ureg = UnitRegistry()
>>>L = 1000 * ureg['cm'] + 0.1 * ureg['km'] + 10 * ureg['foot']
>>>L
11304.8 centimeter
Возможности Pint описаны в [2] и [3], здесь мы рассмотрим только метод to предназначенный для конвертирования единиц измерения физических величин.
Для того чтобы перевести найденную выше величину L в ярды нужно выполнить команду
>>>L.to('yd')
123.63079615048119 yard
>>># Перевод в метры
>>>L.to('m')
113.048 meter
Для того чтобы узнать как в пакете Pint обозначаются размерности необходимо открыть файл default_en.txt (скачать), находящийся в каталоге, в котором установлен пакет Pint. Расположение данного каталога можно узнать с помощью команды в терминале
pip show pint
Рассмотрим раздел файла, посвящённый давлению.
# Pressure
[pressure] = [force] / [area]
pascal = newton / meter ** 2 = Pa = Па
barye = dyne / centimeter ** 2 = Ba = barie = barad = barrie = baryd
bar = 1e5 * pascal = бар
technical_atmosphere = kilogram * g_0 / centimeter ** 2 = at = кгс_на_см2
torr = atm / 760
pound_force_per_square_inch = force_pound / inch ** 2 = psi
kip_per_square_inch = kip / inch ** 2 = ksi
millimeter_Hg = millimeter * Hg * g_0 = mmHg = mm_Hg = millimeter_Hg_0C = мм_рт_ст
centimeter_Hg = centimeter * Hg * g_0 = cmHg = cm_Hg = centimeter_Hg_0C
inch_Hg = inch * Hg * g_0 = inHg = in_Hg = inch_Hg_32F
inch_Hg_60F = inch * Hg_60F * g_0
inch_H2O_39F = inch * water_39F * g_0
inch_H2O_60F = inch * water_60F * g_0
foot_H2O = foot * water * g_0 = ftH2O = feet_H2O
centimeter_H2O = centimeter * water * g_0 = cmH2O = cm_H2O
sound_pressure_level = 20e-6 * pascal = SPL
Каждая размерность описывается одной строкой. В качестве размерности величины можно использовать любое прописанное в строке обозначение, включая формулы (правда не все - при использовании, например, '1e5 * pascal' возникает ошибка, скорее всего из-за присутствующего в формуле умножения на число). Так же можно добавлять свои обозначения, что я и сделал для pascal (добавил в конец соответствующей строки ' = Па'), bar (бар), technical_atmosphere (кгс_на_см2) и millimeter_Hg (мм_рт_ст).
>>># Присвоим величине p значение 101325 размерностью Па
>>>p = 101325 * ureg['Па'] # стандартная атмосфера
>>># Перевод величины p в размерность кгс/см2
>>>p.to('кгс_на_см2')
1.033227452799886 technical_atmosphere
>>># Перевод величины p в размерность мм.рт.ст.
>>>p.to('мм_рт_ст')
759.9998917256115 millimeter_Hg
>>># Перевод величины p в размерность бар
>>>p.to('бар')
1.01325 bar
Так же в файле default_en.txt есть раздел #### PREFIXES ####, в котором приведён перечень приставок для десятичных дольных и кратных единиц (микро, санти, кило, гига и т.п.). Их тоже можно русифицировать, добавив в конец строки знак "равно" и русское обозначение со знаком "минус" справа от него.
kilo- = 1e3 = k- = к-
mega- = 1e6 = M- = М-
giga- = 1e9 = G- = Г-
# Перевод величины p в размерность кПа
>>> p.to('кПа')
101.325 kilopascal
Переведём КПД в удельный расход тепловой энергии на выработку электроэнергии (heat rate), предварительно русифицировав следующие размерности:
hour = 60 * minute = h = hr = ч
joule = newton * meter = J = Дж
watt_hour = watt * hour = Wh = watthour = Вт_ч
>>>КПД = 0.35 * ureg[''] # КПД безразмерная величина (dimensionless)
>>>hr = КПД.to('кДж/кВт_ч') # перевод в heat rate
>>>hr
1260.0 kilojoule/kilowatt_hour
>>>hr.to('') # перевод heat rate в КПД
0.35 dimensionless
Для извлечения из величины его значения следует обратиться к свойству объекта magnitude.
>>>p.magnitude # значение величины p
101325
>>>type(p.magnitude) # тип значения величины p
int
>>>type(hr.magnitude) # тип значения величины heat rate
float
Добавим в Pint возможность переводить давление в размерность пуд-сила на квадратный аршин. Сначала нужно определить размерности пуд и аршин. Для этого в раздел #### UNIT GROUPS #### файла default_en.txt добавим следующие строки:
@group СтарорусскаяСистемаМер
пуд = 16.3805 * kilogram
аршин = 0.7112 * meter = арш
@end
Скорее всего определение новых размерностей можно добавлять в любой раздел, но лучше придерживаться логики разработчиков. Сохраняем файл и проверяем новые единицы измерения.
>>>ureg['пуд'].to('kg')
16.3805 kilogram
>>>ureg['арш'].to('m')
0.7112 meter
Теперь в раздел # Pressure добавим новую единицу измерения давления - пнка (пуд-сила на квадратный аршин)
пнка = пуд * g_0 / аршин ** 2
где g_0 - это ускорение, обусловленное гравитацией или ускорение свободного падения (уже определена в Pint).
>>>ureg['g_0'].to('m/s**2')
9.80665 meter/second2
>>># Сила тяжести (вес) 1 кг
>>>(ureg['kg'] * ureg['g_0']).to('newton')
9.80665 newton
Используемые Pint константы приведены в файле constants_en.txt (скачать)
>>># Выразим стандартную атмосферу в пнка
>>>p.to('пнка')
319.04524671623307 пнка
Для проверки найденного значения определим давление одного пуда на квадратный аршин в Па и умножим его на значение величины p (стандартная атмосфера), выраженной в пнка. В результате должна получиться стандартная атмосфера в Па.
>>>16.3805 * 9.80665 / 0.7112 / 0.7112 * p.to('пнка').magnitude
101325.00000000001
>>>p # Стандартная атмосфера
101325 pascal
В более удобочитаемом виде (в формате Jupyter Notebook) данная статья размещена здесь.
Ссылки
2. Применение языка Python в инженерной практике. Часть 1 — обзор модуля Pint