Organize in submodules

This commit is contained in:
Noe Brucy
2022-10-07 11:20:04 +02:00
parent 1f3b0762c9
commit 0d90179292
32 changed files with 231 additions and 510 deletions
View File
Binary file not shown.
+1 -1
View File
@@ -4,7 +4,7 @@ import numpy as np
from functools import partial from functools import partial
from baseprocessor import Rule from baseprocessor import Rule
import snapshotprocessor import snapshotprocessor
from mypool import MyPool from utils.mypool import MyPool
try: try:
from mpi4py.futures import MPIPoolExecutor from mpi4py.futures import MPIPoolExecutor
+13 -3
View File
@@ -10,11 +10,11 @@ from functools import partial
import numpy as np import numpy as np
import tables import tables
from tables import HDF5ExtError from tables import HDF5ExtError, NoSuchNodeError
from tables.registry import class_name_dict from tables.registry import class_name_dict
from params import default_params, load_params from utils.params import default_params, load_params
from units import U from utils.units import U
import sys import sys
import traceback import traceback
@@ -44,6 +44,7 @@ class Rule:
return self.process_fn(arg, **kwargs) return self.process_fn(arg, **kwargs)
else: else:
return self.process_fn(**kwargs) return self.process_fn(**kwargs)
class BaseProcessor: class BaseProcessor:
""" """
Base class for processors, should not be instanciated Base class for processors, should not be instanciated
@@ -292,8 +293,17 @@ class HDF5Container(BaseProcessor):
) )
else: else:
value = node.read() value = node.read()
if isinstance(unit, dict):
name = os.path.basename(node_name)
if name in unit:
unit = unit[name]
else:
unit = None
if not (unit is None or unit_old is None or unit_old == U.none): if not (unit is None or unit_old is None or unit_old == U.none):
value = value * unit_old.express(unit) value = value * unit_old.express(unit)
except NoSuchNodeError:
self.logger.error(f"The value {node_name} is node available", stack_info=True)
raise
finally: finally:
if not open_before: if not open_before:
self.close() self.close()
View File
+1 -1
View File
@@ -17,7 +17,7 @@ from scipy.stats import linregress
from skimage.draw import line from skimage.draw import line
from snapshotprocessor import SnapshotProcessor from snapshotprocessor import SnapshotProcessor
from params import default_params from utils.params import default_params
class DraggablePoint: class DraggablePoint:
View File
View File
View File
-101
View File
@@ -1,101 +0,0 @@
# coding: utf-8
import numpy as np
import pandas as pd
from plotter import U
import snapshotprocessor
mp = 1.4 * 1.66 * 10 ** (-24) * U.g
z0 = 150 * U.pc
sink_header = [
"Id",
"M",
"dmf",
"x",
"y",
"z",
"vx",
"vy",
"vz",
"rot_period",
"lx",
"ly",
"lz",
"acc_rate",
"acc_lum",
"age",
"int_lum",
"Teff",
]
def convert_coldens_s(n0):
return (np.sqrt(2 * np.pi) * mp * z0 * (n0 * U.cm ** (-3))).express(U.coldens)
convert_coldens = np.vectorize(convert_coldens_s)
def get_dispersion(dset, name):
"""
Compute dispersion from dset[name]
"""
vel = dset[name]
mass = dset["mass"]
mass_tot = np.sum(mass)
if mass_tot > 0:
mean = np.sum(mass * vel) / mass_tot
return np.sqrt(np.sum(mass * (vel - mean) ** 2) / mass_tot)
else:
return 0
def get_sinks(pp):
csv_name = f"{pp.path}/output_{pp.num:05}/sink_{pp.num:05}.csv"
return pd.read_csv(csv_name, header=None, names=sink_header)
def analyze_box(pp):
pp.cells["mass"] = snapshotprocessor.mass_func(pp.cells)
coldens = pp.get_value("/maps/coldens_z", unit=U.coldens)
sinks = get_sinks(pp)
sinks["mass"] = sinks.M
res = {}
dirs = ["x", "y", "z"]
res["time"] = pp.info["time"] * pp.info["unit_time"].express(U.Myr)
for i, dir in enumerate(dirs):
pp.cells[f"v{dir}"] = pp.cells["vel"][:, i]
res[f"sigma_{dir}"] = get_dispersion(pp.cells, f"v{dir}") * pp.info[
"unit_velocity"
].express(U.km_s)
res[f"sigma_sinks_{dir}"] = get_dispersion(sinks, f"v{dir}") * pp.info[
"unit_velocity"
].express(U.km_s)
res["coldens_mean"] = np.mean(coldens)
res["n0"] = pp.get_nml("cloud_params/dens0")
res["mass"] = np.sum(
pp.cells["mass"]
* (pp.info["unit_density"] * pp.info["unit_length"] ** 3).express(U.Msun)
)
res["coldens_initial"] = convert_coldens_s(res["n0"])
res["mass_initial"] = res["coldens_initial"] * 1e6
res["coldens_mean"] = np.mean(coldens)
res["coldens_beam"] = res["mass"] / (pp.info["unit_length"].express(U.pc)) ** 2
res["nsink"] = sinks.M.count()
res["mass_sink"] = np.sum(sinks.M)
return res
def load_wrapper(pp, fun):
"""
Wrapper to load_unload data and map function
"""
pp.load_cells(keys=["pos", "vel", "dx", "rho"])
pp.coldens("z")
res = fun(pp)
pp.unload_cells()
return res
def allinone(pp):
return load_wrapper(pp, analyze_box)
View File
View File
+1 -1
View File
@@ -9,7 +9,7 @@ import numpy as np
from plotter import Plotter, plt from plotter import Plotter, plt
from snapshotprocessor import SnapshotProcessor, get_time from snapshotprocessor import SnapshotProcessor, get_time
from studyprocessor import StudyProcessor from studyprocessor import StudyProcessor
from params import default_params, load_params from utils.params import default_params, load_params
fake_pp = SnapshotProcessor() fake_pp = SnapshotProcessor()
+7 -15
View File
@@ -36,12 +36,11 @@ except ModuleNotFoundError:
print("WARNING: no movie support (missing module moviepy)") print("WARNING: no movie support (missing module moviepy)")
from mpl_toolkits.axes_grid1.inset_locator import inset_axes from mpl_toolkits.axes_grid1.inset_locator import inset_axes
import pspec_read
from baseprocessor import Rule, BaseProcessor from baseprocessor import Rule, BaseProcessor
from aggregator import Aggregator from aggregator import Aggregator
from studyprocessor import StudyProcessor from studyprocessor import StudyProcessor
from run_selector import RunSelector from runselector import RunSelector
from units import U, unit_str, convert_exp from utils.units import U, unit_str, convert_exp
try: try:
import lic import lic
@@ -56,7 +55,7 @@ from astrophysix.simdm.experiment import (
ParameterVisibility, ParameterVisibility,
Simulation, Simulation,
) )
from ramses_astrophysix import ramses from galactica.ramses_astrophysix import ramses
filetype_from_ext = {ext: ft for ft in FileType for ext in ft.extension_list} filetype_from_ext = {ext: ft for ft in FileType for ext in ft.extension_list}
@@ -270,6 +269,7 @@ class Plotter(Aggregator, BaseProcessor):
self.nums, self.nums,
self.path_out, self.path_out,
self.params, self.params,
tag=tag,
unit_time=unit_time, unit_time=unit_time,
selector=self.selector, selector=self.selector,
) )
@@ -1434,15 +1434,6 @@ class Plotter(Aggregator, BaseProcessor):
if subname_y: if subname_y:
hdf5_y.close() hdf5_y.close()
def _pspec(self, name, **kwargs):
"""
Plot power spectrum (wrapper around pspec_read)
"""
del kwargs["run"]
file_pspec = self.current_processor.get_value("/hdf5/pspec")
num = self.current_processor.num
getattr(pspec_read, "pspec_" + name)(file_pspec, ".", num, **kwargs)
def _overlay_fit(self, x, y, yerr=None, kind="linear", label=None, **kwargs): def _overlay_fit(self, x, y, yerr=None, kind="linear", label=None, **kwargs):
""" """
Add an overlay : fit a curve, linear or powerlaw Add an overlay : fit a curve, linear or powerlaw
@@ -1527,7 +1518,7 @@ class Plotter(Aggregator, BaseProcessor):
This is where rules are defined This is where rules are defined
""" """
self.rules = { self.rules = {
"plot_arrays": PlotRule(lambda arg, **kwargs: self._plot(*arg, **kwargs), kind="comp" "plot_comp": PlotRule(lambda arg, **kwargs: self._plot(*arg, **kwargs), kind="comp"
), ),
"plot_run": PlotRule(lambda arg, **kwargs: self._plot(*arg, **kwargs), kind="run" "plot_run": PlotRule(lambda arg, **kwargs: self._plot(*arg, **kwargs), kind="run"
), ),
@@ -1674,7 +1665,6 @@ class Plotter(Aggregator, BaseProcessor):
"Density profile", "Density profile",
dependencies=["axis", "rho_prof"], dependencies=["axis", "rho_prof"],
), ),
"pspec": PlotRule(self, self._pspec, dependencies={"pspec": None}),
"sbeta": PlotRule( "sbeta": PlotRule(
partial( partial(
self._plot, self._plot,
@@ -1966,6 +1956,8 @@ class Plotter(Aggregator, BaseProcessor):
for name in ["time", "dt", "a", "mem_cells", "mem_parts"]: for name in ["time", "dt", "a", "mem_cells", "mem_parts"]:
self._gen_from_log("fine_step_from_log", name_y=name, name_x="fine_step") self._gen_from_log("fine_step_from_log", name_y=name, name_x="fine_step")
self._gen_from_log("SN_momentum_from_log", name_x="time", name_y="SN_momentum")
# Dict of overlays # Dict of overlays
self.overlays = { self.overlays = {
"g": partial(self._overlay_vector, "g"), "g": partial(self._overlay_vector, "g"),
-374
View File
@@ -1,374 +0,0 @@
from builtins import str
import matplotlib.pyplot as P
import numpy as np
import tables as T
################################################################
# 3D
################################################################
def pspec_rho(file, path_out, num, color="r", save=False, **kwargs):
h5f = T.open_file(file, mode="r")
group = h5f.get_node("/out_" + format(num, "05") + "/d3/rho")
kbins = h5f.get_node(group, "kbins").read()
pspec = h5f.get_node(group, "pspec").read()
h5f.close()
k = np.sqrt(kbins[1:] * kbins[:-1])
pspec = (k ** 2) * pspec
if save:
P.figure(figsize=(8, 8))
P.xlabel(r"$k$", fontsize=12)
P.ylabel(r"$k^2 \mathcal{P}(\rho)$", fontsize=12)
P.loglog(k, pspec, "-", color=color, **kwargs)
if save:
P.savefig(path_out + "pspec_rho_" + format(num, "05") + ".ps")
P.savefig(path_out + "pspec_rho_" + format(num, "05") + ".jpeg")
def pspec_B(file, path_out, num, color="r", save=False, **kwargs):
h5f = T.open_file(file, mode="r")
group = h5f.get_node("/out_" + format(num, "05") + "/d3/B")
kbins = h5f.get_node(group, "kbins").read()
pspec = h5f.get_node(group, "pspec").read()
h5f.close()
k = np.sqrt(kbins[1:] * kbins[:-1])
pspec = k ** 2 * pspec
if save:
P.figure(figsize=(8, 8))
P.xlabel(r"$k$", fontsize=12)
P.ylabel(r"$k^2 \mathcal{P}(B)$", fontsize=12)
P.loglog(k, pspec, "-", color=color, **kwargs)
if save:
P.savefig(path_out + "pspec_B_" + format(num, "05") + ".ps")
P.savefig(path_out + "pspec_B_" + format(num, "05") + ".jpeg")
def pspec_v(file, path_out, num, color="r", save=False, **kwargs):
h5f = T.open_file(file, mode="r")
group = h5f.get_node("/out_" + format(num, "05") + "/d3/v")
kbins = h5f.get_node(group, "kbins").read()
pspec = h5f.get_node(group, "pspec").read()
h5f.close()
k = np.sqrt(kbins[1:] * kbins[:-1])
pspec = k ** 4 * pspec
if save:
P.figure(figsize=(8, 8))
P.xlabel(r"$k$", fontsize=12)
P.ylabel(r"$k^4 \mathcal{P}(v)$", fontsize=12)
P.loglog(k, pspec, "-", color=color, **kwargs)
if save:
P.savefig(path_out + "pspec_v_" + format(num, "05") + ".ps")
P.savefig(path_out + "pspec_v_" + format(num, "05") + ".jpeg")
def pspec_vz(file, path_out, num, color="r", save=False, **kwargs):
h5f = T.open_file(file, mode="r")
group = h5f.get_node("/out_" + format(num, "05") + "/d3/vz")
kbins = h5f.get_node(group, "kbins").read()
pspec = h5f.get_node(group, "pspec").read()
h5f.close()
k = np.sqrt(kbins[1:] * kbins[:-1])
pspec = k ** 4 * pspec
if save:
P.figure(figsize=(8, 8))
P.xlabel(r"$k$", fontsize=12)
P.ylabel(r"$k^4 \mathcal{P}(vz)$", fontsize=12)
P.loglog(k, pspec, "-", color=color, **kwargs)
if save:
P.savefig(path_out + "pspec_vz_" + format(num, "05") + ".ps")
P.savefig(path_out + "pspec_vz_" + format(num, "05") + ".jpeg")
def pspec_cos(file, path_out, num, color="r", save=False, **kwargs):
h5f = T.open_file(file, mode="r")
group = h5f.get_node("/out_" + format(num, "05") + "/d3/cos_vB")
kbins = h5f.get_node(group, "kbins").read()
pspec = h5f.get_node(group, "pspec").read()
h5f.close()
k = np.sqrt(kbins[1:] * kbins[:-1])
pspec = k ** 2 * pspec
if save:
P.figure(figsize=(8, 8))
P.xlabel(r"$k$", fontsize=12)
P.ylabel(r"$k^2 \mathcal{P}(\cos(\vec{v}.\vec{B}))$", fontsize=12)
P.loglog(k, pspec, "-", color=color, **kwargs)
if save:
P.savefig(path_out + "pspec_cos_" + format(num, "05") + ".ps")
P.savefig(path_out + "pspec_cos_" + format(num, "05") + ".jpeg")
def pspec_logrho(file, path_out, num, color="r", save=False, **kwargs):
h5f = T.open_file(file, mode="r")
group = h5f.get_node("/out_" + format(num, "05") + "/d3/logrho")
kbins = h5f.get_node(group, "kbins").read()
pspec = h5f.get_node(group, "pspec").read()
h5f.close()
k = np.sqrt(kbins[1:] * kbins[:-1])
pspec = k ** 2 * pspec
if save:
P.figure(figsize=(8, 8))
P.xlabel(r"$k$", fontsize=12)
P.ylabel(r"$k^2 \mathcal{P}(\log(\rho))$", fontsize=12)
P.loglog(k, pspec, "-", color=color, **kwargs)
if save:
P.savefig(path_out + "pspec_logrho_" + format(num, "05") + ".ps")
P.savefig(path_out + "pspec_logrho_" + format(num, "05") + ".jpeg")
def pspec_kr(file, path_out, num, color="r", save=False, **kwargs):
h5f = T.open_file(file, mode="r")
group = h5f.get_node("/out_" + format(num, "05") + "/d3/kr")
kbins = h5f.get_node(group, "kbins").read()
pspec = h5f.get_node(group, "pspec").read()
h5f.close()
k = np.sqrt(kbins[1:] * kbins[:-1])
pspec = (k ** 4) * pspec
if save:
P.figure(figsize=(8, 8))
P.xlabel(r"$k$", fontsize=12)
P.ylabel(r"$k^4 \mathcal{P}(\rho^{1/3}v)$", fontsize=12)
P.loglog(k, pspec, "-", color=color, **kwargs)
if save:
P.savefig(path_out + "pspec_kr_" + format(num, "05") + ".ps")
P.savefig(path_out + "pspec_kr_" + format(num, "05") + ".jpeg")
def pspec_vc(file, path_out, num, color="r", save=False, **kwargs):
h5f = T.open_file(file, mode="r")
group = h5f.get_node("/out_" + format(num, "05") + "/d3/vc")
kbins = h5f.get_node(group, "kbins").read()
pspec = h5f.get_node(group, "pspec").read()
h5f.close()
k = np.sqrt(kbins[1:] * kbins[:-1])
pspec = (k ** 4) * pspec
if save:
P.figure(figsize=(8, 8))
P.xlabel(r"$k$", fontsize=12)
P.ylabel(r"$k^4 \mathcal{P}(v_c)$", fontsize=12)
P.loglog(k, pspec, "-", color=color, **kwargs)
if save:
P.savefig(path_out + "pspec_vc_" + format(num, "05") + ".ps")
P.savefig(path_out + "pspec_vc_" + format(num, "05") + ".jpeg")
def pspec_vs(file, path_out, num, color="r", save=False, **kwargs):
h5f = T.open_file(file, mode="r")
group = h5f.get_node("/out_" + format(num, "05") + "/d3/vs")
kbins = h5f.get_node(group, "kbins").read()
pspec = h5f.get_node(group, "pspec").read()
h5f.close()
k = np.sqrt(kbins[1:] * kbins[:-1])
pspec = (k ** 4) * pspec
if save:
P.figure(figsize=(8, 8))
P.xlabel(r"$k$", fontsize=12)
P.ylabel(r"$k^4 \mathcal{P}(v_s)$", fontsize=12)
P.loglog(k, pspec, "-", color=color, **kwargs)
if save:
P.savefig(path_out + "pspec_vs_" + format(num, "05") + ".ps")
P.savefig(path_out + "pspec_vs_" + format(num, "05") + ".jpeg")
###################################################################
# 2D
###################################################################
def pspec_rho_2D(file, path_out, num, plan, color="r", save=False, **kwargs):
h5f = T.open_file(file, mode="r")
group = h5f.get_node("/out_" + format(num, "05") + "/d2/rho")
kbins = h5f.get_node(group, "kbins_" + str(plan)).read()
pspec = h5f.get_node(group, "pspec_" + str(plan)).read()
h5f.close()
k = np.sqrt(kbins[1:] * kbins[:-1])
pspec = (k ** 1) * pspec
if save:
P.figure(figsize=(8, 8))
P.xlabel(r"$k$", fontsize=12)
P.ylabel(r"$k \mathcal{P}(\rho)$", fontsize=12)
P.loglog(k, pspec, "-", color=color, **kwargs)
if save:
P.savefig(path_out + "pspec_rho_2D_" + format(num, "05") + ".ps")
P.savefig(path_out + "pspec_rho_2D_" + format(num, "05") + ".jpeg")
def pspec_B_2D(file, path_out, num, plan, color="r", save=False, **kwargs):
h5f = T.open_file(file, mode="r")
group = h5f.get_node("/out_" + format(num, "05") + "/d2/B")
kbins = h5f.get_node(group, "kbins_" + str(plan)).read()
pspec = h5f.get_node(group, "pspec_" + str(plan)).read()
h5f.close()
k = np.sqrt(kbins[1:] * kbins[:-1])
pspec = k ** 1 * pspec
if save:
P.figure(figsize=(8, 8))
P.xlabel(r"$k$", fontsize=12)
P.ylabel(r"$k \mathcal{P}(B)$", fontsize=12)
P.loglog(k, pspec, "-", color=color, **kwargs)
if save:
P.savefig(path_out + "pspec_B_2D_" + format(num, "05") + ".ps")
P.savefig(path_out + "pspec_B_2D_" + format(num, "05") + ".jpeg")
def pspec_v_2D(file, path_out, num, plan, color="r", save=False, **kwargs):
h5f = T.open_file(file, mode="r")
group = h5f.get_node("/out_" + format(num, "05") + "/d2/v")
kbins = h5f.get_node(group, "kbins_" + str(plan)).read()
pspec = h5f.get_node(group, "pspec_" + str(plan)).read()
h5f.close()
k = np.sqrt(kbins[1:] * kbins[:-1])
pspec = k ** 3 * pspec
if save:
P.figure(figsize=(8, 8))
P.xlabel(r"$k$", fontsize=12)
P.ylabel(r"$k^3 \mathcal{P}(v)$", fontsize=12)
P.loglog(k, pspec, "-", color=color, **kwargs)
if save:
P.savefig(path_out + "pspec_v_2D_" + format(num, "05") + ".ps")
P.savefig(path_out + "pspec_v_2D_" + format(num, "05") + ".jpeg")
def pspec_vz_2D(file, path_out, num, plan, color="r", save=False, **kwargs):
h5f = T.open_file(file, mode="r")
group = h5f.get_node("/out_" + format(num, "05") + "/d2/vz")
kbins = h5f.get_node(group, "kbins_" + str(plan)).read()
pspec = h5f.get_node(group, "pspec_" + str(plan)).read()
h5f.close()
k = np.sqrt(kbins[1:] * kbins[:-1])
pspec = k ** 3 * pspec
if save:
P.figure(figsize=(8, 8))
P.xlabel(r"$k$", fontsize=12)
P.ylabel(r"$k^3 \mathcal{P}(v_z)$", fontsize=12)
P.loglog(k, pspec, "-", color=color, **kwargs)
if save:
P.savefig(path_out + "pspec_vz_2D_" + format(num, "05") + ".ps")
P.savefig(path_out + "pspec_vz_2D_" + format(num, "05") + ".jpeg")
def pspec_cos_2D(file, path_out, num, plan, color="r", save=False, **kwargs):
h5f = T.open_file(file, mode="r")
group = h5f.get_node("/out_" + format(num, "05") + "/d2/cos_vB")
kbins = h5f.get_node(group, "kbins_" + str(plan)).read()
pspec = h5f.get_node(group, "pspec_" + str(plan)).read()
h5f.close()
k = np.sqrt(kbins[1:] * kbins[:-1])
pspec = k * pspec
if save:
P.figure(figsize=(8, 8))
P.xlabel(r"$k$", fontsize=12)
P.ylabel(r"$k \mathcal{P}(\cos(\vec{v}.\vec{B}))$", fontsize=12)
P.loglog(k, pspec, "-", color=color, **kwargs)
if save:
P.savefig(path_out + "pspec_cos_2D_" + format(num, "05") + ".ps")
P.savefig(path_out + "pspec_cos_2D_" + format(num, "05") + ".jpeg")
def pspec_logrho_2D(file, path_out, num, plan, color="r", save=False, **kwargs):
h5f = T.open_file(file, mode="r")
group = h5f.get_node("/out_" + format(num, "05") + "/d2/logrho")
kbins = h5f.get_node(group, "kbins_" + str(plan)).read()
pspec = h5f.get_node(group, "pspec_" + str(plan)).read()
h5f.close()
k = np.sqrt(kbins[1:] * kbins[:-1])
pspec = k * pspec
if save:
P.figure(figsize=(8, 8))
P.xlabel(r"$k$", fontsize=12)
P.ylabel(r"$k \mathcal{P}(\log(\rho))$", fontsize=12)
P.loglog(k, pspec, "-", color=color, **kwargs)
if save:
P.savefig(path_out + "pspec_logrho_2D_" + format(num, "05") + ".ps")
P.savefig(path_out + "pspec_logrho_2D_" + format(num, "05") + ".jpeg")
def pspec_kr_2D(file, path_out, num, plan, color="r", save=False, **kwargs):
h5f = T.open_file(file, mode="r")
group = h5f.get_node("/out_" + format(num, "05") + "/d2/kr")
kbins = h5f.get_node(group, "kbins_" + str(plan)).read()
pspec = h5f.get_node(group, "pspec_" + str(plan)).read()
h5f.close()
k = np.sqrt(kbins[1:] * kbins[:-1])
pspec = (k ** 3) * pspec
if save:
P.figure(figsize=(8, 8))
P.xlabel(r"$k$", fontsize=12)
P.ylabel(r"$k^3 \mathcal{P}(\rho^{1/3}v)$", fontsize=12)
P.loglog(k, pspec, "-", color=color, **kwargs)
if save:
P.savefig(path_out + "pspec_kr_2D_" + format(num, "05") + ".ps")
P.savefig(path_out + "pspec_kr_2D_" + format(num, "05") + ".jpeg")
def pspec_vc_2D(file, path_out, num, plan, color="r", save=False, **kwargs):
h5f = T.open_file(file, mode="r")
group = h5f.get_node("/out_" + format(num, "05") + "/d2/vc")
kbins = h5f.get_node(group, "kbins_" + str(plan)).read()
pspec = h5f.get_node(group, "pspec_" + str(plan)).read()
h5f.close()
k = np.sqrt(kbins[1:] * kbins[:-1])
pspec = (k ** 3) * pspec
if save:
P.figure(figsize=(8, 8))
P.xlabel(r"$k$", fontsize=12)
P.ylabel(r"$k^3 \mathcal{P}(v_c)$", fontsize=12)
P.loglog(k, pspec, "-", color=color, **kwargs)
if save:
P.savefig(path_out + "pspec_vc_2D" + format(num, "05") + ".ps")
P.savefig(path_out + "pspec_vc_2D" + format(num, "05") + ".jpeg")
def pspec_vs_2D(file, path_out, num, plan, color="r", save=False, **kwargs):
h5f = T.open_file(file, mode="r")
group = h5f.get_node("/out_" + format(num, "05") + "/d2/vs")
kbins = h5f.get_node(group, "kbins_" + str(plan)).read()
pspec = h5f.get_node(group, "pspec_" + str(plan)).read()
h5f.close()
k = np.sqrt(kbins[1:] * kbins[:-1])
pspec = (k ** 3) * pspec
if save:
P.figure(figsize=(8, 8))
P.xlabel(r"$k$", fontsize=12)
P.ylabel(r"$k^3 \mathcal{P}(v_s)$", fontsize=12)
P.loglog(k, pspec, "-", color=color, **kwargs)
if save:
P.savefig(path_out + "pspec_vs_2D" + format(num, "05") + ".ps")
P.savefig(path_out + "pspec_vs_2D" + format(num, "05") + ".jpeg")
View File
View File
View File
+1 -1
View File
@@ -5,7 +5,7 @@
Select snaphots with a criterion Select snaphots with a criterion
""" """
from run_selector import RunSelector from runselector import RunSelector
from plotter import Plotter, U from plotter import Plotter, U
import os import os
+8 -8
View File
@@ -34,10 +34,10 @@ from pymses.sources.hop.hop import HOP
from fil_finder import FilFinder2D from fil_finder import FilFinder2D
from scipy import fft from scipy import fft
import pspec_new from scripts import pspec as pspec
from units import U from utils.units import U
from baseprocessor import ( from baseprocessor import (
HDF5Container, HDF5Container,
Rule, Rule,
@@ -48,7 +48,7 @@ from baseprocessor import (
oct_vect_getter, oct_vect_getter,
) )
from run_selector import RunSelector from runselector import RunSelector
# Getters # Getters
@@ -212,10 +212,10 @@ def pspec(map2D):
# Compute fft # Compute fft
fmap = fft.fft2(map2D) fmap = fft.fft2(map2D)
# Compute the power map from the fft # Compute the power map from the fft
pmap = pspec_new.pcube(fmap) pmap = pspec.pcube(fmap)
# Use the power map and the fft to compute the powerspectrum # Use the power map and the fft to compute the powerspectrum
# This is typically an histogram of k weighted by the fourier transform value # This is typically an histogram of k weighted by the fourier transform value
pspec, kbins, pspec2, fbins = pspec_new.pspectrum(pmap, kmap, kbins, 1, 0) pspec, kbins, pspec2, fbins = pspec.pspectrum(pmap, kmap, kbins, 1, 0)
# Return bin center and power spectrum # Return bin center and power spectrum
return 0.5 * (kbins[1:] + kbins[:-1]), pspec return 0.5 * (kbins[1:] + kbins[:-1]), pspec
@@ -1434,10 +1434,10 @@ class SnapshotProcessor(HDF5Container):
return {key: df[key].values for key in df} return {key: df[key].values for key in df}
def _pspec(self, overwrite_file=False, **kwargs): def pspec(self, overwrite_file=False, **kwargs):
outfile = self.pspec_filename outfile = self.pspec_filename
if overwrite_file or not os.path.exists(self.pspec_filename): if overwrite_file or not os.path.exists(self.pspec_filename):
pspec_new.pspec(repo=self.path, iouts=[self.num], outfile=outfile, **kwargs) pspec.pspec(repo=self.path, iouts=[self.num], outfile=outfile, **kwargs)
return np.array([self.pspec_filename]) return np.array([self.pspec_filename])
def _write_particles(self): def _write_particles(self):
@@ -1754,7 +1754,7 @@ class SnapshotProcessor(HDF5Container):
"vz_gas": "unit_velocity", "vz_gas": "unit_velocity",
}, },
), ),
"pspec": Rule(self._pspec, "Power spectrum", "/hdf5"), "pspec": Rule(self.pspec, "Power spectrum", "/hdf5"),
"write_particles": Rule(self._write_particles, "Particles file", "/hdf5" "write_particles": Rule(self._write_particles, "Particles file", "/hdf5"
), ),
"write_cells": Rule(self._write_cells, "Cells file", "/hdf5"), "write_cells": Rule(self._write_cells, "Cells file", "/hdf5"),
+37 -3
View File
@@ -12,9 +12,9 @@ from scipy.stats import linregress
from baseprocessor import Rule, HDF5Container from baseprocessor import Rule, HDF5Container
from aggregator import Aggregator from aggregator import Aggregator
from snapshotprocessor import SnapshotProcessor from snapshotprocessor import SnapshotProcessor
from run_selector import RunSelector from runselector import RunSelector
from params import default_params from utils.params import default_params
from units import U from utils.units import U
class StudyProcessor(Aggregator, HDF5Container): class StudyProcessor(Aggregator, HDF5Container):
@@ -452,6 +452,31 @@ class StudyProcessor(Aggregator, HDF5Container):
series["turb_energy"][run].append(np.nan) series["turb_energy"][run].append(np.nan)
return series return series
def _extract_SN_Mom_from_log(self, series, log_filename, run):
cmd_grep = f"grep -e 'SN momentum' -e 'Fine step' {log_filename}"
content = os.popen(cmd_grep).readlines()
block_err = []
time = 0
for i in range(0, len(content)):
try:
if content[i][1:5] == "Fine":
data = content[i].replace("=", " ").split()
time = np.float(data[4])
elif content[i][1:3] == "SN" :
series["time"][run].append(time)
series["SN_momentum"][run].append(np.float(content[i].split()[-1]))
else:
raise ValueError("Wrong start of line")
except (AssertionError, ValueError, IndexError):
block_err.append(i)
if len(block_err) > 0:
self.logger.warning(
f"Error encountered in parsing {log_filename} (grepped blocks {block_err})"
)
return series
def get_logs(self, run): def get_logs(self, run):
glob_str = f"{self.path}/{run}/{self.params.input.log_prefix}*" glob_str = f"{self.path}/{run}/{self.params.input.log_prefix}*"
logs = glob.glob(glob_str) logs = glob.glob(glob_str)
@@ -815,6 +840,15 @@ class StudyProcessor(Aggregator, HDF5Container):
"id": U.none, "id": U.none,
}, },
), ),
"SN_momentum_from_log": Rule(
partial(self._from_log, ["time", "SN_momentum"], self._extract_SN_Mom_from_log),
group="/series",
unit={"time": "unit_time", "SN_momentum" : {"unit_mass" : 1, "unit_velocity" : 1}},
description={
"time": "Time",
"SN_momentum": "Injected momentum",
},
),
"turb_power": Rule( "turb_power": Rule(
self._turb_power, self._turb_power,
group="/series/rms_from_log", group="/series/rms_from_log",
View File
+160
View File
@@ -0,0 +1,160 @@
"""
Toolbox for the TURBOX project (simulation part).
By Noé Brucy and Corentin Le Yuehlic, 2022
Compute and plot eta_d, from the slope of the logdensity power spectrum
"""
import numpy as np
from plotter import U
from baseprocessor import Rule
from matplotlib import pyplot as plt
import pandas as pd
import tables
from scipy.stats import linregress
def get_pspec(pp, field:str, dim:int=3):
"""Read power spectruù
Parameters
----------
pp : SnapshotProcessor
field : str
field to get
dim : int, optional
dimension (2 or 3), by default 3
Returns
-------
tupple (np.array, np.array)
wave number and correponding powers
"""
h5file = tables.File(pp.pspec_filename)
path = f"/out_{pp.num:05}/d{dim}/{field}"
node = h5file.get_node(path)
kbins = node.kbins.read()
pspec = node.pspec.read()
h5file.close()
k = (kbins[:-1] + kbins[1:]) / 2
return k, pspec
span_resolution = {
256: (0.8, 1.1),
512: (0.5, 1.7),
1024: (0.4, 1.7)
}
def get_slope(pp, field:str, resol:int, plotdebug:bool=False):
"""Get the slope of the Power specturm using linear regression in the selected range
Parameters
----------
pp : Snapshotprocessor
field : str
field name
resol : int
resolution (number of cells on 1 side of the simulation cube)
Returns
-------
tuple (float, float)
Slope, square value of the correlation coefficient
"""
# Trustworthy span od the power spectrum in log10(k) as a function of the resolution
logkmin, logkmax = span_resolution[resol]
k, power = get_pspec(pp, field)
logk, logpower = np.log10(k), np.log10(power)
mask = (logk >= logkmin) & (logk < logkmax)
results = linregress(logk[mask], logpower[mask])
if plotdebug:
plt.figure()
plt.plot(logk, logpower)
plt.plot(logk[mask], results.slope*logk[mask]+ results.intercept, lw=3, ls=":", color="k")
pp.logger.info(f"Fit results in get_slope({field}, {resol}): slope:{results.slope:.2f}, b:{results.intercept:.2f}, R2:{results.rvalue**2:.2f}")
if results.rvalue**2 < 0.8:
pp.logger.warning(f"Bad fit in get_slope({field}, {resol}) with {logkmin} <= logk < {logkmax}")
pp.logger.warning(f"log(k) is \n {logk[mask]}")
pp.logger.warning(f"log(power) is \n {logpower[mask]}")
return results.slope, results.intercept, results.rvalue**2
def build_suite(pl, redo=False, cs0=0.28834810480560674):
"""Compute an array of parameter for each run in the Plotter pl
Parameters
----------
pl : Plotter
redo : bool, optional
redo the comptutation of the velocity dispersion, by default False
cs0 : float, optional
Sound speed in the simulations, by default 0.28834810480560674
Returns
-------
pd.Dataframe
dataframe with the properties of the simulation
"""
df = dict()
df["snapshots"] = pl.nums.values()
df["n0"] = pl.study.get_nml("galbox_params/dens0").values()
df["turbinit"] = pl.study.get_nml("galbox_params/turb").values()
df["solver"] = pl.study.get_nml("hydro_params/riemann").values()
df["slope"] = pl.study.get_nml("hydro_params/slope_type").values()
df["res"] = pl.study.get_nml("amr_params/levelmin").values()
df["frms"] = pl.study.get_nml("turb_params/turb_rms").values()
df["seed"] = pl.study.get_nml("turb_params/turb_seed").values()
df["comp"] = pl.study.get_nml("turb_params/comp_frac").values()
df["L"] = pl.study.get_nml("amr_params/boxlen").values()
df["T_turb"] = (np.array(list(pl.study.get_nml("turb_params/turb_T").values()))
* pl.study.info["unit_time"].express(U.Myr))
df = pd.DataFrame(df, index=pl.runs)
if redo:
pl.study.avg_time_sigma("x", overwrite_dep=False)
pl.study.avg_time_sigma("y", overwrite_dep=False)
pl.study.avg_time_sigma("z", overwrite_dep=False)
pl.study.time(overwrite=True)
for ax in ["x", "y", "z"]:
df[f"sigma_{ax}"] = np.array(list(map(
lambda x : x.T[0],
[pl.study.get_value(f"/series/time_sigma_{ax}",
unit=U.km_s)[run] for run in pl.runs])))
df["sigma_all"] = df[f"sigma_x"]**2 + df[f"sigma_y"]**2 + df[f"sigma_z"]**2
df["sigma_all"] = list(map(np.sqrt, df["sigma_all"].values))
df["Mach_all"] = list(map(lambda v: v/cs0, df["sigma_all"].values))
df["time"] = list(map(lambda x : x.T[0],
[pl.study.get_value(f"/series/time", unit=U.Myr)[run]
for run in pl.runs]))
df["sigma"] = list(map(lambda l: np.mean(l), df["sigma_all"].values))
df["Mach"] = df["sigma"] / cs0
df["turnover"] = (df["L"] * U.pc.express(U.km) / (2 * df["sigma"]))* U.s.express(U.Myr)
return df
def rho_pdf(pp):
pp.load_cells()
rho = pp.cells["rho"] * pp.info["unit_density"].express(U.H_cc)
rho_0 = np.mean(rho)
print(rho_0)
s = np.log(rho/rho_0)
values, edges = np.histogram(s, bins=300, range=(-15, 11),
density=True)
pp.unload_cells()
centers = 0.5 * (edges[1:] + edges[:-1])
return (np.stack([values, centers]), {"logbins": True})
rule_pdf=Rule(rho_pdf, "Density PDF", name="rho_pdf", group="/hist")
def apply_rule_pdf(pp):
return pp.process(rule_pdf, pp, overwrite=True)
View File
View File
+1 -1
View File
@@ -33,7 +33,7 @@ def params_from_file(filename):
def default_params(): def default_params():
return params_from_file(_dir_path + "/params.yml") return params_from_file(_dir_path + "/../params.yml")
def load_params(filename): def load_params(filename):
View File