Skip to content

Instantly share code, notes, and snippets.

@jzuhone
Last active August 29, 2015 14:10
Show Gist options
  • Save jzuhone/0f392acff5192bc0796f to your computer and use it in GitHub Desktop.
Save jzuhone/0f392acff5192bc0796f to your computer and use it in GitHub Desktop.
yt plugins file
import numpy as np
from yt.units.unit_object import default_unit_registry
from yt.units import dimensions
from yt.utilities.physical_ratios import sec_per_day, sec_per_hr
from yt.units.yt_array import YTArray
grams_per_pound = 453.59237
cm_per_ft = 30.48
cm_per_mile = cm_per_ft*5280.0
cc_per_us_pint = 473.176473
erg_per_calorie = 4.184e7
standard_gravity_cgs = 980.665
erg_per_megaton_TNT = 4.184e22
# Misc units
default_unit_registry.add("revolution", 2.*np.pi, dimensions.angle)
default_unit_registry.add("tonne", 1.0e6, dimensions.mass)
default_unit_registry.add("L", 1000.0, dimensions.volume)
default_unit_registry.add("g_accel", standard_gravity_cgs, dimensions.acceleration)
default_unit_registry.add("megaton_TNT", erg_per_megaton_TNT, dimensions.energy)
default_unit_registry.add("cal", erg_per_calorie, dimensions.energy)
default_unit_registry.add("week", sec_per_day*7.0, dimensions.time)
# Imperial units
default_unit_registry.add("inch", cm_per_ft/12., dimensions.length)
default_unit_registry.add("yard", cm_per_ft*3., dimensions.length)
default_unit_registry.add("slug", grams_per_pound*standard_gravity_cgs/cm_per_ft,
dimensions.mass)
default_unit_registry.add("lbf", grams_per_pound*standard_gravity_cgs, dimensions.force)
default_unit_registry.add("lbm", grams_per_pound, dimensions.mass)
default_unit_registry.add("ton", grams_per_pound*2000.0, dimensions.mass)
default_unit_registry.add("oz", grams_per_pound/16.0, dimensions.mass)
default_unit_registry.add("mph", cm_per_mile/sec_per_hr, dimensions.velocity)
# US volumes
default_unit_registry.add("fl_oz_US", cc_per_us_pint/16.0, dimensions.volume)
default_unit_registry.add("cp_US", cc_per_us_pint/2.0, dimensions.volume)
default_unit_registry.add("pt_US", cc_per_us_pint, dimensions.volume)
default_unit_registry.add("qt_US", cc_per_us_pint*2.0, dimensions.volume)
default_unit_registry.add("gal_US", cc_per_us_pint*8.0, dimensions.volume)
def convert_to_sexagesimal(self):
if self.units.dimensions == dimensions.time:
decimal = self.in_units("s")
hr_unit = "hr"
min_unit = "min"
sec_unit = "s"
elif self.units.dimensions == dimensions.angle:
decimal = self.in_units("arcsec")
hr_unit = "deg"
min_unit = "arcmin"
sec_unit = "arcsec"
else:
raise RuntimeError("Must be a time or angle unit to convert to sexagesimal!")
minutes = np.floor(decimal.in_units(min_unit))
seconds = decimal-minutes.in_units(sec_unit)
hours = np.floor(minutes.in_units(hr_unit))
minutes -= hours.in_units(min_unit)
return (hours, minutes, seconds)
def convert_from_sexagesimal(cls, hms_tuple):
if len(hms_tuple) != 3:
raise RuntimeError("Tuple has incorrect units!")
hours, minutes, seconds = hms_tuple
if hours.units.dimensions == dimensions.time:
hr_unit = "hr"
min_unit = "min"
sec_unit = "sec"
elif hours.units.dimensions == dimensions.angle:
hr_unit = "deg"
min_unit = "arcmin"
sec_unit = "arcsec"
correct_units = str(hours.units) == hr_unit
correct_units = str(minutes.units) == min_unit and correct_units
correct_units = str(seconds.units) == sec_unit and correct_units
if not correct_units:
raise RuntimeError("Tuple with units %s, %s, %s cannot be converted!" %
(hours.units, minutes.units, seconds.units))
return cls((hours+minutes+seconds).in_units(hr_unit))
YTArray.convert_to_sexagesimal = convert_to_sexagesimal
YTArray.convert_from_sexagesimal = classmethod(convert_from_sexagesimal)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment