Need
Okay, I have read my data quite easily. What are the units of these data ? How do I convert them into human-readable units ?
Example : From a RAMSES hydro simulation, I want to convert my density field unit into the H/cc unit.
In pymses, a specific module has been designed for this purpose : constants.
It contains a bunch of useful dimensional physical constants (expressed in ISU) which you can use for unit conversion factors computation, adimensionality tests, etc.
from pymses.utils import constants as C
print C.kpc
Out:(3.085677e+19 m)
print C.Msun
Out:(1.9889e+30 kg)
Each constant is an Unit instance, on which you can call the express() method to convert this constant into another dimension-compatible constant. If the dimensions are not compatible, a ValueError will be raised
factor = C.kpc.express(C.ly)
print "1 kpc = %f ly"%factor
Out:1 kpc = 3261.563163 ly
print C.Msun.express(C.km)
Out:ValueError: Incompatible dimensions between (1.9889e+30 kg) and (1000.0 m)
Basic operations between these constants are enabled
unit_density = 1.0E9 * C.Msun / C.kpc**3
print "1Msun/kpc**3 = %f H/cc"%unit_density.express(C.H_cc)
Out:1Msun/kpc**3 = 30.993246 H/cc
The units of each RAMSES output data are read from the output info file. You can manipulate the values of these units by using the info parameter (see RAMSES output selection)
ro = RamsesOutput("/data/simu/outputs", 10)
ro.info
Out:{'H0': 1.0,
'aexp': 1.0,
'boxlen': 200.0,
'dom_decomp': <pymses.sources.ramses.hilbert.HilbertDomainDecomp object at 0x9df0aac>,
'levelmax': 14,
'levelmin': 7,
'ncpu': 64,
'ndim': 3,
'ngridmax': 1000000,
'nstep_coarse': 1200,
'omega_b': 0.0,
'omega_k': 0.0,
'omega_l': 0.0,
'omega_m': 1.0,
'time': 10.724764558171801,
'unit_density': (6.77025430199e-20 m^-3.kg),
'unit_length': (6.17135516256e+21 m),
'unit_mass': (1.9891e+39 kg),
'unit_pressure': (2.91283226304e-10 m^-1.kg.s^-2),
'unit_temperature': (517290.92492 K),
'unit_time': (4.70430312424e+14 s),
'unit_velocity': (65592.6605874 m.s^-1)}
Assuming you already have sampled the AMR density field of this output into a pdset PointDataset containing all your sampling points (see AMR field point-sampling), you can convert your density field (in code unit) into the unit of your choice:
rho_field_H_cc = pdset["rho"] * ro.info["unit_density"].express(C.H_cc)
Warning
You must take care of manipulating RAMSES data in an unit-coherent way !!!
Good:
info = ro.info # Density rho_H_cc = rho_ramses * info["unit_density"].express(C.H_cc) # Mass part_mass_Msun = part_mass * info["unit_mass"].express(C.Msun) # Kinetic energy factor = (info["unit_mass"] * info["unit_velocity"]**2).express(C.J) kin_energy_J = part_mass * part_vel**2 * factorNot so good:
info = ro.info # Density factor = (info["unit_mass"] / info["unit_length"]**3).express(C.H_cc) rho_H_cc = rho_ramses * factor # Mass factor = (info["unit_density"]*info["unit_length"]**3).express(C.Msun) part_mass_Msun = part_mass * factor # Kinetic energy factor = (info["unit_pressure"] * info["unit_length"]**3).express(C.J) kin_energy_J = part_mass * part_vel**2 * factor