openPMD / openPMD/openPMD-api

First Pint Support

Open
#475 0 comments 0 reactions 0 assignees View on GitHub
frontend: Python3 good first issue help wanted
Dominant language
C++
Stars
161
Forks
59
Avg merge
2d 22h
Merged PRs (30d)
7

Description

Simple bindings to [pint](https://pint.readthedocs.io) would be wonderful for dimensional analysis or records.

as drafted [here](https://github.com/openPMD/openPMD-api/pull/473#discussion_r257466791)

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

```python
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
#
# ^-- access just like a regular dictionary

# create:
pint.context.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:

```python
{
'[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

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.