openPMD/openPMD-api

First Pint Support

Aberta

#475 aberto em 16 de fev. de 2019

 (0 comentário) (0 reação) (0 responsável)C++ (57 forks)auto 404
frontend: Python3good first issuehelp wanted

Métricas do repositório

Stars
 (160 estrelas)
Métricas de merge de PR
 (Métricas PR pendentes)

Description

Simple bindings to pint would be wonderful for dimensional analysis or records.

as drafted here

TODO: add pretty handlers, maybe some lookup DBs for typical quanitites, make useful.

import pint

ureg = pint.UnitRegistry()

# [E] = M L^2 T^-3 I^-1
E_pint = 1 * E_unitDim[api.Unit_Dimension.L] * ureg.m + \
E_unitDim[api.Unit_Dimension.M] * ureg.kg + \
E_unitDim[api.Unit_Dimension.T] * ureg.s + \
E_unitDim[api.Unit_Dimension.I] * ureg.A + \
E_unitDim[api.Unit_Dimension.theta] * ureg.K + \
E_unitDim[api.Unit_Dimension.N] * ureg.mol + \
E_unitDim[api.Unit_Dimension.J] * ureg.cd

# length L, mass M, time T, electric current I, thermodynamic temperature theta, amount of substance N, luminous intensity J

E_pint.check('[length]')
# False
E_pint.check('[length] * [mass] / [current] / [time]^3')
# True
E_pint.check('V/m')
# True

E_x.dimensionality
# <UnitsContainer({'[current]': -1.0, '[length]': 1.0, '[mass]': 1.0, '[time]': -3.0})>
# ^-- access just like a regular dictionary

# create:
pint.context.UnitsContainer({'[current]': -1.0, '[length]': 1.0, '[mass]': 1.0, '[time]': -3.0})
# <UnitsContainer({'[current]': -1.0, '[length]': 1.0, '[mass]': 1.0, '[time]': -3.0})>

As a first step, RecordComponent.unit_dimension should probably just return a dictionary that fits exactly those pint defaults:

{
  '[length]': L,
  '[mass]': M,
  '[time]': T,
  '[current]': I,
  '[temperature]': theta,
  '[substance]': N,
  '[luminosity]': J
}

# easy to pass:
pint.context.UnitsContainer(E_x.unit_dimensions)

https://github.com/hgrecco/pint/blob/master/pint/default_en.txt https://github.com/hgrecco/pint/blob/master/pint/babel_names.py

Guia do colaborador