def ureg(**defaults): if ureg_singleton.ureg is None: u = ureg_singleton.ureg = UnitRegistry() else: return ureg_singleton.ureg u.define('Msun = 1.99885e30kg') u.define("hubble = [hubbli]") u.define("scalefactor = [scalefactori]") u.define('gmass = 1e10 Msun/hubble') u.define('cmass = Msun/hubble') u.define('clength = kpc/hubble*scalefactor') u.define('glength = clength') u.define('cvelocity = scalefactor*km/s') u.define('gvelocity_a = (scalefactor**0.5)km/s') u.define('gvelocity_noa = km/s') c = Context('comoving', defaults={"hubble": None, "scalefactor": None}) def f_1(u, v, hubble=None, scalefactor=None): m = v.to(u.clength).magnitude if hubble is not None and scalefactor is not None: return u.kpc * m * scalefactor / hubble else: raise Exception("hubble=%s, scalefactor=%s" % (str(hubble), str(scalefactor))) def g_1(u, v, hubble=None, scalefactor=None): m = v.to(u.cmass).magnitude if hubble is not None: return u.Msun * m / hubble else: raise Exception("hubble=%s " % (str(hubble))) def f_2(u, v, hubble=None, scalefactor=None): m = v.to(u.kpc).magnitude if hubble is not None and scalefactor is not None: return u.clength / scalefactor * hubble else: raise Exception("hubble=%s, scalefactor=%s" % (str(hubble), str(scalefactor))) c.add_transformation('[length] * [scalefactori] / [hubbli]', '[length]', f_1) c.add_transformation('[length]', '[length] * [scalefactori] / [hubbli]', f_2) c.add_transformation('[mass] / [hubbli]', '[mass]', g_1) u.add_context(c) #if(len(defaults)>0): # u.enable_contexts(c,**defaults) u.enable_contexts(c, hubble=.704) return u
# -*- coding: utf-8 -*- """Various units-related things This module has a soft dependency on the pint units library. Please import this module only conditionally or only if you can accept a pint dependency. """ from pint import (UnitRegistry, Context) ureg = UnitRegistry() ureg.define("micro- = 1e-6 = µ-") # aid conversion between different radiance units sp2 = Context("radiance") sp2.add_transformation( "[length] * [mass] / [time] ** 3", "[mass] / [time] ** 2", lambda ureg, x: x / ureg.speed_of_light) sp2.add_transformation( "[mass] / [time] ** 2", "[length] * [mass] / [time] ** 3", lambda ureg, x: x * ureg.speed_of_light) ureg.add_context(sp2) radiance_units = { "si": ureg.W / (ureg.m**2 * ureg.sr * ureg.Hz), "ir": ureg.mW / (ureg.m**2 * ureg.sr * (1 / ureg.cm))}
def set_nmr_context(larmor): """ Set a NMR context relative to the given Larmor frequency. Parameters ---------- larmor : |Quantity| or float The Larmor frequency of the current nucleus. If it is not a quantity it is assumed to be given in MHz. Examples -------- First we set the NMR context, >>> from spectrochempy.core.units import ur, set_nmr_context >>> >>> set_nmr_context(104.3 * ur.MHz) then, we can use the context as follow >>> fhz = 10000 * ur.Hz >>> with ur.context('nmr'): ... fppm = fhz.to('ppm') >>> print("{:~.3f}".format(fppm)) 95.877 ppm or in the opposite direction >>> with ur.context('nmr'): ... fhz = fppm.to('kHz') >>> print("{:~.3f}".format(fhz)) 10.000 kHz Now we update the context : >>> with ur.context('nmr', larmor=100. * ur.MHz): ... fppm = fhz.to('ppm') >>> print("{:~.3f}".format(fppm)) 100.000 ppm >>> set_nmr_context(75 * ur.MHz) >>> fhz = 10000 * ur.Hz >>> with ur.context('nmr'): ... fppm = fhz.to('ppm') >>> print("{:~.3f}".format(fppm)) 133.333 ppm """ if not isinstance(larmor, U_.Quantity): larmor = larmor * U_.MHz if "nmr" not in list(U_._contexts.keys()): c = Context("nmr", defaults={"larmor": larmor}) c.add_transformation( "[]", "[frequency]", lambda U_, x, **kwargs: x * kwargs.get("larmor") / 1.0e6, ) c.add_transformation( "[frequency]", "[]", lambda U_, x, **kwargs: x * 1.0e6 / kwargs.get("larmor"), ) U_.add_context(c) else: c = U_._contexts["nmr"] c.defaults["larmor"] = larmor
from pint import (UnitRegistry, Context) __all__ = [ 'ureg', 'radiance_units', ] ureg = UnitRegistry() ureg.define("micro- = 1e-6 = µ-") # aid conversion between different radiance units sp2 = Context("radiance") # specrad per frequency → specrad per wavenumber sp2.add_transformation( "[length] * [mass] / [time] ** 3", "[mass] / [time] ** 2", lambda ureg, x, **kwargs: x / ureg.speed_of_light) # specrad per wavenumber → specrad per frequency sp2.add_transformation( "[mass] / [time] ** 2", "[length] * [mass] / [time] ** 3", lambda ureg, x, **kwargs: x * ureg.speed_of_light) #sp2.add_transformation( # "[mass] / ([length] * [time] ** 3)", # "[length] * [mass] / [time] ** 3", # lambda ureg, x, **kwargs: ) def _R_to_bt(ureg, R, srf): """For use by pint, do not call directly, use q.to or SRF class.""" if srf.lookup_table is None: srf.make_lookup_table() return ureg.Quantity(srf.L_to_T(R), 'K')
# -*- coding: utf-8 -*- """ Created on Fri Jul 29 11:15:57 2016 @author: Arno Rehn """ from pint import Context from common import ureg # Create and enable a THz-TDS context where we can convert times to lengths # and vice-versa thz_context = Context('terahertz') thz_context.add_transformation('[time]', '[length]', lambda ureg, x: ureg.speed_of_light * x / 2) thz_context.add_transformation('[length]', '[time]', lambda ureg, x: 2 * x / ureg.speed_of_light) thz_context.add_transformation('', '[length]/[time]', lambda ureg, x: ureg.speed_of_light * x / 2) thz_context.add_transformation('[length]/[time]', '', lambda ureg, x: 2 * x / ureg.speed_of_light) ureg.add_context(thz_context) ureg.enable_contexts('terahertz')
def set_nmr_context(larmor): """ Set a NMR context relative to the given Larmor frequency Parameters ---------- larmor : Quantity or float The Larmor frequency of the current nucleus. If it is not a quantity it is assumed to be given in MHz Examples -------- First we set the NMR context, >>> set_nmr_context(104.3 * U_.MHz) then, we can use the context as follow : >>> fhz = 10000 * U_.Hz >>> with U_.context('nmr'): ... fppm = fhz.to('ppm') >>> print("{:~.3f}".format(fppm)) 95.877 ppm or in the opposite direction >>> with U_.context('nmr'): ... fhz = fppm.to('kHz') >>> print("{:~.3f}".format(fhz)) 10.000 kHz Now we update the context : >>> with U_.context('nmr', larmor=100. * U_.MHz): ... fppm = fhz.to('ppm') >>> print("{:~.3f}".format(fppm)) 100.000 ppm >>> set_nmr_context(75 * U_.MHz) >>> fhz = 10000 * U_.Hz >>> with U_.context('nmr'): ... fppm = fhz.to('ppm') >>> print("{:~.3f}".format(fppm)) 133.333 ppm """ if not isinstance(larmor, U_.Quantity): larmor = larmor * U_.MHz if 'nmr' not in list(U_._contexts.keys()): c = Context('nmr', defaults={'larmor': larmor}) c.add_transformation('[]', '[frequency]', lambda U_, x, **kwargs: x * kwargs.get('larmor') / 1.e6) c.add_transformation('[frequency]', '[]', lambda U_, x, **kwargs: x * 1.e6 / kwargs.get('larmor')) U_.add_context(c) else: c = U_._contexts['nmr'] c.defaults['larmor'] = larmor
unit_registry.define("d = day") unit_registry.define("degreeC = degC") unit_registry.define("degreeF = degF") unit_registry.define( "kt = 1000 * t") # since kt is used for "knot" in the defaults unit_registry.define("ppt = [concentrations]") unit_registry.define("ppb = 1000 * ppt") unit_registry.define("ppm = 1000 * ppb") # Contexts: _c = Context("AR4GWP12") _c.add_transformation( "[carbon]", "[nitrogen]", lambda unit_registry, x: 20 * unit_registry.N * x / unit_registry.C, ) _c.add_transformation( "[nitrogen]", "[carbon]", lambda unit_registry, x: x * unit_registry.C / unit_registry.N / 20, ) unit_registry.add_context(_c) _ch4_context = Context("CH4_conversions") _ch4_context.add_transformation( "[carbon]", "[methane]", lambda unit_registry, x: 16 / 12 * unit_registry.CH4 * x / unit_registry.C, )