Correct bugs, add extractor for turb_rms

This commit is contained in:
Noe Brucy
2019-12-05 10:52:18 +01:00
parent 7d5aa9d911
commit 10600f53df
3 changed files with 73 additions and 32 deletions
+12 -1
View File
@@ -680,6 +680,17 @@ class Plotter(Aggregator, BaseProcessor):
kind="series", kind="series",
dependencies=["issfr"], dependencies=["issfr"],
), ),
"turb_rms": PlotRule(
self,
partial(
self._plot,
"/series/rms_from_log/time",
"/series/rms_from_log/turb_rms",
xunit=cst.Myr,
),
kind="series",
dependencies=["rms_from_log"],
),
"sigma": PlotRule( "sigma": PlotRule(
self, self,
partial( partial(
@@ -691,7 +702,7 @@ class Plotter(Aggregator, BaseProcessor):
yunit=cst.km_s, yunit=cst.km_s,
), ),
kind="comp", kind="comp",
dependencies=["time", "time_sigma"], dependencies=["time_sigma"],
), ),
"plot": PlotRule( "plot": PlotRule(
self, lambda arg, **kwargs: self._plot(*arg, **kwargs), kind="comp" self, lambda arg, **kwargs: self._plot(*arg, **kwargs), kind="comp"
+51 -14
View File
@@ -20,7 +20,7 @@ from pymses.analysis import ScalarOperator, FractionOperator, MaxLevelOperator
from mypool import MyPool as Pool from mypool import MyPool as Pool
from functools import partial from functools import partial
from abc import ABCMeta, abstractmethod from abc import ABCMeta, abstractmethod
import contextlib
import bunch import bunch
from run_selector import * from run_selector import *
@@ -77,7 +77,7 @@ class BaseProcessor:
__metaclass__ = ABCMeta __metaclass__ = ABCMeta
log_id = "" log_id = ""
rules = dict() rules = {}
solve_self_dep = True solve_self_dep = True
def __init__(self, path, path_out=None, pp_params=None, tag=None): def __init__(self, path, path_out=None, pp_params=None, tag=None):
@@ -98,6 +98,7 @@ class BaseProcessor:
self.path_out = path_out self.path_out = path_out
def _log(self, string, status=""): def _log(self, string, status=""):
if self.pp_params.process.verbose:
if len(status) > 0: if len(status) > 0:
print(status + ": " + self.log_id + string) print(status + ": " + self.log_id + string)
else: else:
@@ -165,7 +166,7 @@ class BaseProcessor:
def _not_self_dep(self, name, dep, dep_arg, overwrite, **kwargs): def _not_self_dep(self, name, dep, dep_arg, overwrite, **kwargs):
self._log("Dependency {} for {} is unknown".format(dep, name), "ERROR") self._log("Dependency {} for {} is unknown".format(dep, name), "ERROR")
def _check_existing(self, overwrite, name_full): def _needs_computation(self, overwrite, name_full):
return overwrite or not (name_full in self.save) return overwrite or not (name_full in self.save)
def _process_rule(self, name, rule, arg, overwrite=False, **kwargs): def _process_rule(self, name, rule, arg, overwrite=False, **kwargs):
@@ -176,7 +177,7 @@ class BaseProcessor:
if rule.is_valid(arg): if rule.is_valid(arg):
if not name_full in self.just_done: if not name_full in self.just_done:
if self._check_existing(overwrite, name_full): if self._needs_computation(overwrite, name_full):
self._log("Processing {}".format(name_full)) self._log("Processing {}".format(name_full))
data = rule.process(arg, **kwargs) data = rule.process(arg, **kwargs)
self._save_data(name_full, data, rule.description, rule.unit) self._save_data(name_full, data, rule.description, rule.unit)
@@ -278,7 +279,7 @@ class HDF5Container(BaseProcessor):
try: try:
node = self.save.get_node(node_name) node = self.save.get_node(node_name)
if node._v_attrs.CLASS == "GROUP": if node._v_attrs.CLASS == "GROUP":
value = dict() value = {}
for child_name in node._v_children: for child_name in node._v_children:
value[child_name] = self.get_value(node_name + "/" + child_name) value[child_name] = self.get_value(node_name + "/" + child_name)
else: else:
@@ -353,7 +354,7 @@ class PostProcessor(HDF5Container):
path=None, path=None,
num=None, num=None,
path_out=None, path_out=None,
pp_params=default_params(), pp_params=None,
tag=None, tag=None,
variables=["rho", "vel", "Br", "Bl", "P", "g", "phi"], variables=["rho", "vel", "Br", "Bl", "P", "g", "phi"],
): ):
@@ -364,8 +365,8 @@ class PostProcessor(HDF5Container):
super(PostProcessor, self).__init__(path, path_out, pp_params, tag) super(PostProcessor, self).__init__(path, path_out, pp_params, tag)
# Open outfile # Open outfile
if not pp_params.out.tag == "": if not self.pp_params.out.tag == "":
tag_name = pp_params.out.tag + "_" tag_name = self.pp_params.out.tag + "_"
else: else:
tag_name = "" tag_name = ""
@@ -426,7 +427,7 @@ class PostProcessor(HDF5Container):
self.save.root.maps._v_attrs.im_extent = im_extent self.save.root.maps._v_attrs.im_extent = im_extent
# Initialize cameras # Initialize cameras
self._cam = dict() self._cam = {}
for ax_los in self._ax_nb: # los = line of sight for ax_los in self._ax_nb: # los = line of sight
ax_h = self._axes_h[ax_los] ax_h = self._axes_h[ax_los]
ax_v = self._axes_v[ax_los] ax_v = self._axes_v[ax_los]
@@ -463,8 +464,15 @@ class PostProcessor(HDF5Container):
self.label = self.run self.label = self.run
self.save.root._v_attrs.label = self.label self.save.root._v_attrs.label = self.label
# def open_pymlog(self):
# if self.pp_params.pymses.verbose:
# return sys.stdout
# else:
# return open(os.devnull, "w")
def load_cells(self): def load_cells(self):
if not self.cells_loaded: if not self.cells_loaded:
# with self.open_pymlog() as f, contextlib.redirect_stdout(f):
cell_source = CellsToPoints(self._amr) cell_source = CellsToPoints(self._amr)
self.cells = cell_source.flatten() self.cells = cell_source.flatten()
self.cells_loaded = True self.cells_loaded = True
@@ -1022,18 +1030,30 @@ class Comparator(Aggregator, HDF5Container):
# Define rules # Define rules
self.def_rules() self.def_rules()
def _check_existing(self, overwrite, name_full): def _needs_computation(self, overwrite, name_full):
"""
Returns True if a new computation of the rule is needed
"""
if overwrite or not (name_full in self.save): if overwrite or not (name_full in self.save):
return True return True
elif not "runs" in self.save.get_node(name_full)._v_attrs: elif not "nums" in self.save.get_node(name_full)._v_attrs:
return True return True
else: else:
saved_runs = self.save.get_node(name_full)._v_attrs.runs saved_nums = self.save.get_node(name_full)._v_attrs.nums
return len([run for run in self.runs if not run in saved_runs]) == 0 missing_runs = len([run for run in self.nums if not run in saved_nums]) > 0
missing_nums = missing_runs and all(
[
len([num for num in self.nums[run] if not num in saved_nums[run]])
> 0
for run in self.nums
if run in saved_nums
]
)
return missing_nums
def _save_data(self, name_full, data, description, unit): def _save_data(self, name_full, data, description, unit):
super(Comparator, self)._save_data(name_full, data, description, unit) super(Comparator, self)._save_data(name_full, data, description, unit)
self.save.get_node(name_full)._v_attrs.runs = self.runs self.save.get_node(name_full)._v_attrs.nums = self.nums
def _time_series(self, getter): def _time_series(self, getter):
series = {} series = {}
@@ -1122,6 +1142,14 @@ class Comparator(Aggregator, HDF5Container):
series["sfr"][run].append(sfr) series["sfr"][run].append(sfr)
return series return series
def _extract_rms_from_log(self, series, log_filename, run):
cmd_grep = "grep 'turbulent rms' {} -B 1".format(log_filename)
content = os.popen(cmd_grep).readlines()
for i in range(0, len(content), 3):
series["time"][run].append(np.float(content[i].split("=")[2].split()[0]))
series["turb_rms"][run].append(np.float(content[i + 1].split(":")[1]))
return series
def _from_log(self, keys, extractor): def _from_log(self, keys, extractor):
nums = self.nums nums = self.nums
@@ -1265,6 +1293,15 @@ class Comparator(Aggregator, HDF5Container):
"sfr": "Averaged surfacic star formation rate", "sfr": "Averaged surfacic star formation rate",
}, },
), ),
"rms_from_log": Rule(
self,
partial(
self._from_log, ["time", "turb_rms"], self._extract_rms_from_log
),
group="/series",
unit={"time": self.info["unit_time"], "turb_rms": cst.none},
description={"time": "Time", "turb_rms": "Computed turbulent RMS"},
),
# Read from outputs # Read from outputs
"time": Rule( "time": Rule(
self, self,
+6 -13
View File
@@ -14,7 +14,6 @@ class RunSelector:
in_runs=None, in_runs=None,
in_nums="all", in_nums="all",
pp_params=default_params(), pp_params=default_params(),
number_run="[0-9]*_",
name_run="*", name_run="*",
namelist_cond={}, namelist_cond={},
sort_run_by=None, sort_run_by=None,
@@ -25,9 +24,7 @@ class RunSelector:
self.pp_params = pp_params self.pp_params = pp_params
self.namelist = {} self.namelist = {}
self.runs = self.get_runs( self.runs = self.get_runs(in_runs, name_run, namelist_cond, sort_run_by)
in_runs, number_run, name_run, namelist_cond, sort_run_by
)
self.info = {} self.info = {}
for run in self.runs: for run in self.runs:
@@ -54,14 +51,7 @@ class RunSelector:
res = res[key] res = res[key]
return res return res
def get_runs( def get_runs(self, in_runs=None, name_run="*", namelist_cond={}, sort_run_by=None):
self,
in_runs=None,
number_run="[0-9]*_",
name_run="*",
namelist_cond={},
sort_run_by=None,
):
def try_load_nml(run): def try_load_nml(run):
try: try:
self.namelist[run] = self.load_namelist(run) self.namelist[run] = self.load_namelist(run)
@@ -71,7 +61,8 @@ class RunSelector:
return success return success
runs = map( runs = map(
os.path.basename, glob.glob(self.path_in + "/" + number_run + name_run) os.path.basename,
filter(os.path.isdir, glob.glob(self.path_in + "/" + name_run)),
) )
if not in_runs is None: if not in_runs is None:
runs = filter(lambda n: n in runs, in_runs) runs = filter(lambda n: n in runs, in_runs)
@@ -140,6 +131,8 @@ class RunSelector:
) )
nums = map(lambda n: int(n.split("/")[-1].split("_")[1]), names) nums = map(lambda n: int(n.split("/")[-1].split("_")[1]), names)
if type(in_nums) == int:
in_nums = [in_nums]
if type(in_nums) == list: if type(in_nums) == list:
nums = filter(lambda n: n in nums, in_nums) nums = filter(lambda n: n in nums, in_nums)