[postprocessor] Ensure units are good in Q computation

This commit is contained in:
Noe Brucy
2021-02-10 10:10:22 +01:00
parent 92d6c66af5
commit 8dc436fba6
+40 -38
View File
@@ -840,61 +840,55 @@ class PostProcessor(HDF5Container):
dmap_jeans_ratio = dmap_jeans * 2 ** (dmap_levels) dmap_jeans_ratio = dmap_jeans * 2 ** (dmap_levels)
return dmap_jeans_ratio return dmap_jeans_ratio
def _toomreQ_disk(self, ax_los): def _omega_average(self, ax_los):
"""
Compute the Toomre Q parameter in a Keplerian disk
"""
# Operator to compute the angular speed times rho # Operator to compute the angular speed times rho
lbox = self.lbox
def omega_rho_func(dset): def omega_rho_func(dset):
pos = self.oct_getter_pos_disk(dset) pos = self.oct_getter_pos_disk(dset)
xx = pos[:, :, 0] xx = pos[:, :, 0] * lbox
yy = pos[:, :, 1] yy = pos[:, :, 1] * lbox
rc = np.sqrt(xx ** 2 + yy ** 2) # cylindrical radius rc2 = xx ** 2 + yy ** 2 # square of cylindrical radius
vx = dset["vel"][:, :, 0] vx = dset["vel"][:, :, 0]
vy = dset["vel"][:, :, 1] vy = dset["vel"][:, :, 1]
omega_rho = 1.0 / rc ** 2 omega_rho = dset["rho"]
omega_rho = omega_rho * dset["rho"]
vyx = vy * xx vyx = vy * xx
vxy = vx * yy vxy = vx * yy
omega_rho = omega_rho * (vyx - vxy) omega_rho = omega_rho * (vyx - vxy) / rc2
return omega_rho return omega_rho
# Operator to compute the angular speed # Operator to compute the angular speed
omega_op = FractionOperator( omega_unit = self._ro.info["unit_velocity"] / (
omega_rho_func, lambda dset: dset["rho"], 1.0 / self._ro.info["unit_time"] self._ro.info["unit_length"] / lbox
) )
omega_op = FractionOperator(
# Operator to compute the square of the sound speed omega_rho_func,
T_op = FractionOperator(
lambda dset: dset["P"],
lambda dset: dset["rho"], lambda dset: dset["rho"],
self._ro.info["unit_velocity"], omega_unit,
) )
# Ray tracer for the angular speed # Ray tracer for the angular speed
rt_omega = raytracing.RayTracer(self._amr, self._ro.info, omega_op) rt_omega = raytracing.RayTracer(self._amr, self._ro.info, omega_op)
# Ray tracer for the sound speed
if self.pp_params.pymses.fft:
rt_T = splatting.SplatterProcessor(
self._amr, self._ro.info, T_op, surf_qty=False
)
else:
rt_T = raytracing.RayTracer(self._amr, self._ro.info, T_op)
if not self.pp_params.pymses.multiprocessing: if not self.pp_params.pymses.multiprocessing:
rt_omega.disable_multiprocessing() rt_omega.disable_multiprocessing()
rt_T.disable_multiprocessing()
dmap_omega = rt_omega.process(self._cam[ax_los]) dmap_omega = rt_omega.process(self._cam[ax_los]).map.T
dmap_T = rt_T.process(self._cam[ax_los]) return dmap_omega
dmap_col = self.save.root.maps.coldens_z.read()
map_Q = ( def _toomreQ_disk(self, ax_los):
(self.lbox * np.sqrt(dmap_T.map.T)) """
* dmap_omega.map.T Compute the Toomre Q parameter in a Keplerian disk
/ (np.pi * self.G * dmap_col) """
)
# Get maps
dmap_cs2 = self.get_value("/maps/T_mwavg_z")
dmap_col = self.get_value("/maps/coldens_z")
dmap_omega = self.get_value("/maps/omega_mwavg_z")
# Compute Q
map_Q = (np.sqrt(dmap_cs2) * dmap_omega) / (np.pi * self.G * dmap_col)
return map_Q return map_Q
def _radial_bins(self, ax_los="z"): def _radial_bins(self, ax_los="z"):
@@ -1352,6 +1346,14 @@ class PostProcessor(HDF5Container):
"/maps", "/maps",
unit=self.info["unit_pressure"] / self.info["unit_density"], unit=self.info["unit_pressure"] / self.info["unit_density"],
), ),
"omega_mwavg": Rule(
self,
partial(self._omega_average),
"Ax mass-weighted averaged azimuthal of angular frequency",
"/maps",
unit=self.info["unit_velocity"]
/ (self.info["unit_length"] / self.lbox),
),
"alpha_disk": Rule( "alpha_disk": Rule(
self, self,
self._alpha_disk, self._alpha_disk,
@@ -1423,14 +1425,14 @@ class PostProcessor(HDF5Container):
"jeans": Rule( "jeans": Rule(
self, self,
self._jeans, self._jeans,
"Jeans lenght slice", "Jeans length slice",
"/maps", "/maps",
dependencies=["rho", "T"], dependencies=["rho", "T"],
), ),
"jeans_ratio": Rule( "jeans_ratio": Rule(
self, self,
self._jeans_ratio, self._jeans_ratio,
"Jeans' lenght divided by the max resolution", "Jeans' length divided by the max resolution",
"/maps", "/maps",
dependencies=["jeans", "levels"], dependencies=["jeans", "levels"],
), ),
@@ -1439,7 +1441,7 @@ class PostProcessor(HDF5Container):
self._toomreQ_disk, self._toomreQ_disk,
"Toomre Q parameter for a Keplerian disk", "Toomre Q parameter for a Keplerian disk",
"/maps", "/maps",
dependencies=["coldens"], dependencies=["coldens", "T_mwavg", "omega_mwavg"],
), ),
"sinks": Rule( "sinks": Rule(
self, self,