PlasmaCalcs.hookups.muram.muram_direct_loader.MuramDirectLoader

class PlasmaCalcs.hookups.muram.muram_direct_loader.MuramDirectLoader(*, snap=None, snaps=None, **kw)

Bases: DirectLoader

manages loading data directly from bifrost output files.
__init__(*, snap=None, snaps=None, **kw)

Methods

__init__(*[, snap, snaps])

as_single_dimpoint([values, dims])

assign_dim_coords(array, *dims[, skip])

attach_extra_coords(arr)

check_pickle([x])

cls_help([qstr, only, tree, modules, ...])

cls_var_tree(var, *[, missing_ok])

copy()

current_n_dimpoints([dims])

current_n_existing_snaps()

dim_values([dims])

dims_apply(funcname, *args_func[, dims])

dims_get(attr[, dims])

direct_overrides_dynamic()

directly_loadable_vars([snap])

enumerate_dimpoints([dims, all])

existing_snaps()

get_behavior([keys])

get_first_dimpoint([dims, enumerate])

get_load_direct_maindims_var(var, *[, _match])

get_ncpu()

get_set_or_cached(var)

get_vars(vars, *args[, return_type, ...])

has_var(var)

help([qstr, only, tree, modules, signature, ...])

help_call_options([search])

help_quants_str([qstr, only, tree, modules, ...])

help_str([qstr, only])

iter_dimpoints([dims, all, restore, enumerate])

kw_call_options(*[, sorted])

load_across_dims(loader, *args_loader[, ...])

load_across_dims_implied_by(var, loader, ...)

load_direct(var, *args, **kw)

load_fromfile(fromfile_var, *args__None[, snap])

load_input(fromfile_var, *args, **kw)

maintaining_attrs(*attrs, **attrs_as_flags)

match_var(var, *[, check])

match_var_loading_dims(var, **kw_loading_dims)

match_var_result_dims(var, **kw_result_dims)

match_var_result_size(var, *[, maindims])

match_var_tree([var])

n_existing_snaps()

pop_dim_keys(kw)

quant_tree([var])

set_attrs(**attrs)

set_pop_dim_attrs(kw)

set_var(var, value[, behavior_attrs, ...])

set_var_internal(var, value, behavior_attrs)

snap_filepath([snap])

tree([var])

unset_var(var[, behavior_attrs, missing_ok])

unset_var_internal(var, behavior_attrs[, ...])

using_at_call_depth(depth, **attrs_and_values)

using_at_next_call_depth(**attrs_and_values)

using_attrs([attrs_as_dict, _unset_sentinel])

using_first_dimpoint([dims])

Attributes

KNOWN_PATTERNS

KNOWN_SETTERS

KNOWN_VARS

array_MBmax

assign_behavior_attrs

assign_behavior_attrs_max_call_depth

assign_behavior_attrs_skip_xr

assign_snap_along

assign_snap_coord

behavior

behavior_attrs

call_depth

call_depth_manager

cls_behavior_attrs

current_n_snap

data_array_dtype

data_array_nbytes

data_array_order

data_array_shape

data_array_size

dimensions

dims

direct_overrides

dirname

enable_fromfile

enumerate_snap

enumerate_snaps

extra_coords

get

iter_snap

iter_snaps

iter_snaps_partition

join_snaps

known_pattern

known_setter

known_var

maintaining

nGbytes

nMbytes

nbytes

ncoarse

ncpu

nondim_behavior_attrs

notes_dirname

print_freq

print_freq_explicit

set

setvar

setvars

snap

snap_dim

snap_is_iterable

snap_list

snap_type

snapdir

snaps

take_snap

take_snaps

timeout

title

toplevel_scale_coords

typevar_crash_if_nan

unique_notes_dirname

unset

using

property array_MBmax
UNSET, None, or number
maximum result size allowed, in Megabytes.
will raise a MemorySizeError if result size would be larger than this.
UNSET –> use DEFAULTS.ARRAY_MBYTES_MAX (default: 1000 MB).
None –> no limit.
Assumes that each result (at each dimpoint) will be the same size.
as_single_dimpoint(values=None, *, dims=None, **values_as_kw)
return DimPoint with values for dims, but raise DimensionValueError if any value is_iterable_dim.
values: None or dict
values to use for the dimpoint.
values will be joined with **values_as_kw; provided any of either will be equivalent.
E.g. can use values={‘fluid’: ‘e’} or use fluid=’e’.
if any are provided –> use values corresponding to self.{dim}=values[dim] for dim in dims.
else –> use values of self.{dim} for dim in dims. (equivalent: self.dims_apply(‘_as_single’, dims=dims))
dims: None or iterable of strs appearing in self.dimensions.keys()
dimensions to include.
None –> infer dimensions from keys of values (and values_as_kw).
if no values were provided (values=None, and empty values_as_kw),
use all dimensions from self.dimensions.keys().
additional kwargs provide other {dim: value} items.
Examples:
self.as_single_dimpoint() –> DimPoint({dim: self.{dim} for dim in self.dimensions})
self.as_single_dimpoint({‘fluid’: ‘e’}) –> DimPoint({‘fluid’: ‘e’})
self.as_single_dimpoint(fluid=’e’) –> DimPoint({‘fluid’: ‘e’})
self.as_single_dimpoint({‘fluid’: ‘e’}, snap=0) –> DimPoint({‘fluid’: ‘e’, ‘snap’: 0})
self.as_single_dimpoint(dims=[‘fluid’, ‘snap’]) –> DimPoint({‘fluid’: self.fluid, ‘snap’: self.snap})
property assign_behavior_attrs
whether to assign self.behavior values as attrs of result when calling self.
False –> don’t use self.behavior code architecture to assign attrs.
True –> equivalent to ‘nondefault’
‘nondefault’ –> self.behavior.assign_nondefault_attrs(result)
(for brevity, it does not assign behavior attrs with “default” value.)
‘all’ –> self.behavior.assign_attrs(result).
[EFF] only assigns attrs at call_depth >= self.assign_behavior_attrs_max_call_depth.
(default: only assigns attrs at call_depth=1, i.e. at top level.
property assign_behavior_attrs_max_call_depth
max call_depth at which to assign_behavior_attrs to result,
if self.assign_behavior_attrs indicates to assign behavior attrs.
default 1, i.e. only assign if at top level.
Use None to indicate “no max detph”.
property assign_behavior_attrs_skip_xr
whether to use include_xr=False if self.assign_behavior_attrs,
during self.behavior.assign_nondefault_attrs.
Use this if you want to assign behavior attrs EXCEPT array-valued behavior attrs.
assign_dim_coords(array, *dims, skip=[])
assign all dimensions in self as coords for array. (self.assign_{dim}_coord(array))
Assumes array is an xarray and does not have any dimensions in self.
(array is not edited directly; returns result of assigning coords.)
dims: iterable of dimensions in self
assign only these dimensions as coords. (use all dimensions if len(dims)==0)
skip: iterable of dimensions in self
do not assign these dimensions as coords.
property assign_snap_along
alias to self.snap_dim.assign_coord_along
property assign_snap_coord
alias to self.snap_dim.assign_coord
attach_extra_coords(arr)
attach any self.extra_coords to array arr but only if it is an xarray.DataArray or xarray.Dataset
property behavior
dict of {attr: self.attr} for attr in self.behavior_attrs. Note dims are separate;
dims go in behavior.dims. E.g. Behavior({‘units’:’si’,…}, dims={‘snap’:0,…}).
property behavior_attrs
list of attrs in self which control behavior of self.
Here, returns self.cls_behavior_attrs.
Subclasses could override if any behavior attrs are not known at the class-level,
e.g. if MySubclass’s list of behavior attrs varies between instances of MySubclass.
property call_depth
depth of the current call to self. depth = number of calls to self from within self.
E.g., call_depth while calculating gyrofrequency:
# call_depth == 0, for any code run here (outside any call to self).
self(‘gyrof’)
# call_depth == 1, for any code run here (inside ‘gyrof’ call but not inside deeper calls).
q = self(‘q’)
# call_depth == 2, for code inside ‘q’ call.
mod_B = self(‘mod_B’)
# call_depth == 2, for code inside ‘mod_B’ call.
self(‘B’)
# call_depth == 3, for code inside ‘B’ call.
m = self(‘m’)
# call_depth == 2, for code inside ‘m’ call.
result = q * mod_B / m
Cannot be set directly; can only be manipulated via self.call_depth_manager.
property call_depth_manager
stores the value of call_depth, and helps to manage attrs dependent on call_depth value.
check_pickle(x=None)
checks that self (or, x, if provided) is pickleable, by pickling then unpickling.
Returns result of unpickling. Useful for debugging.
classmethod cls_help(qstr=None, only=None, *, tree=None, modules=False, signature=False, doc=True, dense=False, print=True, **kw)
prints str for help with quants. Fails for any quants which depend on present values of a cls instance.
qstr: None or str
None –> tells info about this class & how to use this function.
in particular, tells that quants are stored cls.KNOWN_VARS and cls.KNOWN_PATTERNS,
and describes behavior of calling help with a string.
str –> return str for help with all quants related to str.
use empty str to get help for all quants.
only: None or str
None –> get help with all quantities related to qstr.
‘VARS’ or ‘vars’ –> only get help with KNOWN_VARS.
‘PATTERNS’ or ‘patterns’ –> only get help with KNOWN_PATTERNS.
‘TREE’ or ‘tree’ –> only get help with quantities in cls.cls_var_tree(str).
if provided when qstr is None, treat qstr as ‘’ instead.
tree: None or bool
How much help to give for quantities in cls.cls_var_tree(qstr).
False –> don’t even check cls.cls_var_tree(qstr).
True –> help for all quantities in cls.cls_var_tree.
None –> help for quantities in cls.cls_var_tree(qstr).flat_branches_until_vars()
i.e. patterns & vars in tree but ignore any nodes with LoadableVar ancestors.
e.g. qstr=’mean_mod_beta’ –> help with ‘mean_(.+)’, ‘mod_(.+)’, and ‘beta’,
but no help with dependencies of ‘beta’ (‘q’, ‘mod_B’, ‘m’).
modules: bool
Whether to include modules in result.
If True, result will be grouped into sections with modules written at top.
signature: signature: bool
whether to include line with signature in help string.
e.g. “help_str(f, *, module=True, signature=True, indent=None)”
doc: doc: bool
whether to include lines with docstring in help string.
e.g. “return str for help(f).” … and all the other docs in here.
dense: bool
Whether to reduce whitespace in result.
E.g. True –> no newlines between functions. False –> one newline between functions.
print: bool
whether to print the result. If False, return the result instead of printing.
classmethod cls_var_tree(var, *, missing_ok=False)
return QuantTree of MatchedQuantity objects from matching var and all dependencies,
using self.KNOWN_VARS and self.KNOWN_PATTERNS when searching for matches.
missing_ok: bool
whether to be lenient sometimes when missing details that would allow to fully determine deps.
see help(MatchedQuantity.dep_vars) for more details.
copy()
returns a deep copy of self.
[TODO] implement something less hacky than using the pickle module?
current_n_dimpoints(dims=None)
return number of points represented by current values of dims.
dims: None or iterable of strs appearing in self.dimensions.keys()
dimensions to consider. None –> use all dimensions.
E.g. current_n_dimpoints(self, dims=[‘fluid’, ‘snap’]) –> number of (fluid, snap) points;
e.g. 3 fluids and 2 snaps –> 6 points.
Note, for classes using maindims, maindims are not included in the number of dimpoints.
Equivalent to len(list(self.iter_dimpoints(dims=dims, current=True)))
current_n_existing_snaps()
returns number of existing snaps, out of all snaps at self.snap.
Equivalent to self.snap_dim.current_n_existing_for(self).
property current_n_snap
alias to self.snap_dim.current_n
property data_array_dtype
numpy dtype of each data array. default is np.dtype(‘float32’).
Used by np.memmap during self.load_fromfile.
property data_array_nbytes
number of bytes in each data array. (from data_array_size and data_array_dtype)
property data_array_order
ordering of data array axes: ‘F’ (Fortran) or ‘C’ (C order). Default ‘F’.
property data_array_shape
shape of each array of data stored in files. (‘N0’, ‘N1’, ‘N2’) from self.params.
Shape with (x, y, z) dimensions is some transposition of the result;
transpose order stored in ‘layout.order’ file, see also self.params[‘order’].
property data_array_size
array size (number of elements) of each data array. (from data_array_shape)
dim_values(dims=None)
return dict of current values for dimensions in self.
dims: None or iterable
if provided, only include these dimensions.

Equivalent: DimRegion(self.dims_get(‘v’, dims=dims))

property dimensions
dict of dimensions in self; {dimension name: Dimension object}.
e.g. {‘fluid’: self.fluid_dim, ‘snap’: self.snap_dim, …}.
property dims
return dict of current values for dimensions in self. Equivalent: self.dim_values()
dims_apply(funcname, *args_func, dims=None, **kw_func)
apply funcname to each dimension in self, with args_func and kw_func.
dims: None or iterable of strs
if provided, only apply to these dimensions.
See also: dims_get
dims_get(attr, dims=None)
return dict of {dim: getattr(self.dimensions[dim], attr) for dim in dims}.
dims: None or iterable
if provided, only include these dimensions.
See also: dims_apply
property direct_overrides
dict of {var: override} for all overrides of self which don’t depend on behavior_attrs of self.
For example, if user wants to set an override (or if setvars sets an override?), it will be here.
See also: self.direct_overrides_dynamic().
direct_overrides_dynamic()
returns dict of {var: override} for all overrides of self which depend on behavior_attrs of self.
directly_loadable_vars(snap=None)
return tuple of directly loadable variables for this snap.
snap: None, str, int, Snap, or iterable indicating multiple snaps.
None –> use self.snap.
multiple snaps –> return result if all snaps have same result, else crash.
property dirname
abspath to directory containing data for this DirectLoader.
property enable_fromfile
bool: whether self.load_fromfile is enabled during self.load_direct.
If False, raise QuantCalcError if load_direct can’t get value without load_fromfile().
enumerate_dimpoints(dims=None, *, all=False)
iterate through values of dims, yielding (idx, DimPoint) pairs.
idx is a dict of {dim: i} such that DimPoint values are {dim: dims[i] for dim,i in idx.items()}.
Also, during iteration, set self.{dim} = value, as with self.iter_dim.
Equivalent to self.iter_dimpoints(dims=dims, all=all, enumerate=True)
property enumerate_snap
alias to self.snap_dim.enumerate
property enumerate_snaps
alias to self.snap_dim.enumerate_values
existing_snaps()
return list of existing snaps. Equivalent to self.snaps.existing_snaps(self).
property extra_coords
dict of {coord_name: coord_value} to attach to outputs of self(var).
Useful if planning to join the output of self(var) with output from a different QuantityLoader.
E.g. self.extra_coords={‘run’: ‘run 0’} and other.extra_coords={‘run’: ‘run 1’},
then xr.concat([self(‘n’), other(‘n’)], ‘run’) gives ‘n’ from self AND other.
(this is nice if self and other have same values for dims. Otherwise, might struggle.)
property get
alias to __call__
get_behavior(keys=None)
return value of self.behavior.
keys: None or iterable
if provided, only include these attrs.
from nondim_behavior_attrs, or dims.
get_first_dimpoint(dims=None, *, enumerate=False)
return DimPoint taking the first value of each dim in self.dimensions.
dims: None or iterable of strs appearing in self.dimensions.keys()
dimensions to include. None –> use all dimensions.
enumerate: bool
whether to return (idx, DimPoint) instead of just DimPoint.
get_load_direct_maindims_var(var, *, _match=None)
load maindims var directly (from files, cache, or setvars; see self.load_direct()).
var should be name of a directly loadable var (see self.directly_loadable_vars()).
Output always uses ‘raw’ units, regardless of self.units,
but coords are in self.coords_units (default: same as self.units).
get_ncpu()
returns ncpu, but if None, return multiprocessing.cpu_count() instead.
(This is for convenience; using None will also work with any methods defined here.)
get_set_or_cached(var)
returns var if found in self.setvars or self.cache, with compatible behavior_attrs.
otherwise, raise CacheNotApplicableError.
if var is found in self.setvars and has relevant, but not matching behavior_attrs,
self.load_across_dims will be used to load the value.
get_vars(vars, *args, return_type='dataset', missing_vars=UNSET, **kw)
returns values of vars from self.
result is probably an xarray.Dataset, but not guaranteed; also depends on return_type.
Equivalent to self(vars, *args, return_type=’dataset’, **kw).
(Actually, self(vars, …) will call self.get_vars(vars, …).)
vars: iterable of strs
Names of the vars to load. [‘n’, ‘u’] for number density & velocity.
if any of these vars returns a return_type object, expand its keys,
e.g. if ‘myDSvar’ returns dataset with ‘myvar1’, ‘myvar2’,
then [‘n’, ‘myDSvar’] gives dataset with ‘n’, ‘myvar1’, ‘myvar2’.
return_type: ‘dataset’ or ‘dict’
if ‘dataset’, return result as xarray.Dataset.
the data_var names will be the same as the var names.
if ‘dict’, return result as dict of {var: value}.
missing_vars: UNSET, ‘ignore’, ‘warn’, or ‘raise’
what to do if any vars cause FormulaMissingError.
UNSET –> use self.missing_vars if it exists, else ‘raise’.
‘ignore’ –> ignore missing vars, and don’t include them in the result.
‘warn’ –> ignore missing vars, but print a warning.
‘raise’ –> raise FormulaMissingError if any vars are missing.
additional args & kwargs are passed to self(…).
has_var(var)
return whether self can load var. True if self.match_var(var) is found, else False.
Subclasses might override, to include checks for whether var can be loaded from data.
[TODO] also check if var in self.cache or self.setvars.
help(qstr=None, only=None, *, tree=None, modules=False, signature=False, doc=True, dense=False, print=True)
prints str for help with quants.
qstr: None or str
None –> tells info about this class & how to use this function.
in particular, tells that quants are stored cls.KNOWN_VARS and cls.KNOWN_PATTERNS,
and describes behavior of calling help with a string.
str –> return str for help with all quants related to str.
use empty str to get help for all quants.
only: None or str
None –> get help with all quantities related to qstr.
‘VARS’ or ‘vars’ –> only get help with KNOWN_VARS.
‘PATTERNS’ or ‘patterns’ –> only get help with KNOWN_PATTERNS.
‘TREE’ or ‘tree’ –> only get help with quantities in cls.cls_var_tree(str).
if provided when qstr is None, treat qstr as ‘’ instead.
tree: None or bool
How much help to give for quantities in cls.cls_var_tree(qstr).
False –> don’t even check cls.cls_var_tree(qstr).
True –> help for all quantities in cls.cls_var_tree.
None –> help for quantities in cls.cls_var_tree(qstr).flat_branches_until_vars()
i.e. patterns & vars in tree but ignore any nodes with LoadableVar ancestors.
e.g. qstr=’mean_mod_beta’ –> help with ‘mean_(.+)’, ‘mod_(.+)’, and ‘beta’,
but no help with dependencies of ‘beta’ (‘q’, ‘mod_B’, ‘m’).
modules: bool
Whether to include modules in result.
If True, result will be grouped into sections with modules written at top.
signature: signature: bool
whether to include line with signature in help string.
e.g. “help_str(f, *, module=True, signature=True, indent=None)”
doc: doc: bool
whether to include lines with docstring in help string.
e.g. “return str for help(f).” … and all the other docs in here.
dense: bool
Whether to reduce whitespace in result.
E.g. True –> no newlines between functions. False –> one newline between functions.
help_call_options(search=None)
prints help for kw_call_options.
if search is provided, only print help for keys containing search.
classmethod help_quants_str(qstr=None, only=None, *, tree=None, modules=True, signature=False, doc=True, dense=False, _instance=None)
returns str for help with quants.
qstr: None or str
None –> tells info about this class & how to use this function.
in particular, tells that quants are stored cls.KNOWN_VARS and cls.KNOWN_PATTERNS,
and describes behavior of calling help with a string.
str –> return str for help with all quants related to str.
use empty str to get help for all quants.
only: None or str
None –> get help with all quantities related to qstr.
‘VARS’ or ‘vars’ –> only get help with KNOWN_VARS.
‘PATTERNS’ or ‘patterns’ –> only get help with KNOWN_PATTERNS.
‘TREE’ or ‘tree’ –> only get help with quantities in cls.cls_var_tree(str).
if provided when qstr is None, treat qstr as ‘’ instead.
tree: None or bool
How much help to give for quantities in cls.cls_var_tree(qstr).
False –> don’t even check cls.cls_var_tree(qstr).
True –> help for all quantities in cls.cls_var_tree.
None –> help for quantities in cls.cls_var_tree(qstr).flat_branches_until_vars()
i.e. patterns & vars in tree but ignore any nodes with LoadableVar ancestors.
e.g. qstr=’mean_mod_beta’ –> help with ‘mean_(.+)’, ‘mod_(.+)’, and ‘beta’,
but no help with dependencies of ‘beta’ (‘q’, ‘mod_B’, ‘m’).
modules: bool
Whether to include modules in result.
If True, result will be grouped into sections with modules written at top.
signature: signature: bool
whether to include line with signature in help string.
e.g. “help_str(f, *, module=True, signature=True, indent=None)”
doc: doc: bool
whether to include lines with docstring in help string.
e.g. “return str for help(f).” … and all the other docs in here.
dense: bool
Whether to reduce whitespace in result.
E.g. True –> no newlines between functions. False –> one newline between functions.
_instance: None or QuantityLoader instance
if provided, use _instance.match_var_tree() instead of cls.cls_var_tree().
classmethod help_str(qstr=None, only=None, **kw)
returns cls.help_quants_str(qstr=qstr, only=only, **kw).
cls.help() calls help_str.
subclasses might overwrite help_str, but probably won’t touch help_quants_str.
iter_dimpoints(dims=None, *, all=False, restore=True, enumerate=False)
iterate through values of dims, returning DimPoints and setting dim values during iteration.
DimPoints are dicts of {dim: value} for dim in dims, where not is_iterable_dim(value).
Also, during iteration, set self.{dim} = value, as with self.iter_dim.
dims: None or iterable of strs appearing in self.dimensions.keys()
dimensions to consider. None –> use all dimensions.
all: bool
whether to iterate through all possible values, or only the current values.
False –> iterate through current values (e.g., self.snap, self.fluid, …).
similar to itertools.product(self.iter_snap(), self.iter_fluid(), …)
True –> iterate through all possible values (e.g., self.snaps, self.fluid, …)
similar to itertools.product(self.iter_snaps(), self.iter_fluids(), …)
Equivalent to all=False if all dims are set to None, e.g. self.snap=None, …
restore: bool
whether to restore original dim values after iteration.
enumerate: bool, default False
whether to yield indices too, i.e. (idx, DimPoint) instead of just DimPoint.
idx would be a dict of {dim: i} such that DimPoint values are {dim: dims[i] for dim,i in idx.items()}.
property iter_snap
alias to self.snap_dim.iter
property iter_snaps
alias to self.snap_dim.iter_values
property iter_snaps_partition
alias to self.snap_dim.iter_partition
property join_snaps
alias to self.snap_dim.join_along
kw_call_options(*, sorted=True)
returns list of kwarg names which can be used to set attrs self during self.__call__.
(see self.__call__ for more details).
Here, returns list(self.behavior_attrs) + list(self._extra_kw_for_quantity_loader_call)
load_across_dims(loader, *args_loader, dims=[], assign_coords=None, loader0=None, _shift_special={}, **kw_loader)
return loader(…), iterating & joining across each dimension.
loader: callable of (*args_loader, **kw_loader) -> xarray.DataArray.
will call loader to get result values at each combination of dims values in self.
(loader will probably depend on dims values from self.)
dims: iterable of strs or Dimension objects
load across these Dimensions.
loads across the current values (when this method was called) of each dimension,
not necessarily “all” values. (e.g., self.snap, not self.snaps)
str values –> use self.dimensions[d] (where d is a str in dims).
len(dims)==0 –> just return loader(var, *args_loader, **kw_loader).
While loading, set dim.loading=True for each dim.
assign_coords: None or bool, default None
whether to dim.assign_coord for each result of loader, for each dimension.
None –> assign coord only if dim.name not already in array.coords.
loader0: None or callable
if provided, use loader0 to get the first array, then use loader for the rest.
Internally the first array’s .coords and .attrs are used to label the result;
however all other arrays do not need to be converted to xarray.
_shift_special: UNSET or dict of (dimstr: list of special values)
workaround to encourage loader0 to be called on a “usual” case, not a special case.
if provided, and dimstr in dims, and d=self.dimensions[dimstr] has multiple values,
with special_value first, and at least one non-special value later, then
internally rearrange dim values order before loading,
then rearrange result back to original order (via indexing).
E.g. _shift_special=dict(snap=[INPUT_SNAP]) –> apply loader0 to the first non-INPUT_SNAP,
if there are any non-INPUT_SNAP snap values in snap, and ‘snap’ in dims.
— MULTIPROCESSING STRATEGY OPTIONS (from self) —
timeout: None or int
max duration, in seconds. Must be None or integer (due to limitations of signal.alarm method)
None –> no time limit.
Note: if time_limit is reached, will raise a TimeoutError and save the result so far.
(in this case, any not-yet-calculated values will each be RESULT_MISSING.)
# [TODO] make this happen, without making self un-picklable:
in case of crash, results so far can be found in self._latest_load_tasks.
Then possibly continued via:
results = self._latest_load_tasks(…, reset=False, skip_done=True)
result = self._load_across_dims_postprocess(results, dims, …)
# [TODO] if crashing and resuming is common, make that easier to do^
elf.timeout has not been set, use DEFAULTS.LOADING_TIMEOUT (default: None).
ncpu: None or int
max number of cpus to use for multiprocessing.
None –> use multiprocessing.cpu_count()
int –> use this value. if 0 or 1, do not use multiprocessing here.
Note: will actually use min(ncpu, number of calls to be made);
e.g. if ncpu=4 but len(arg_kw_tuples)=2, will only use 2 cpus.
elf.ncpu has not been set, use DEFAULTS.LOADING_NCPU (default: 1).
ncoarse: int
if >1, group tasks into groups of size ncoarse before performing them.
elf.ncoarse has not been set, use DEFAULTS.LOADING_NCOARSE (default: 1).
print_freq: None, or number (possibly negative or 0)
>0 –> Minimum number of seconds between progress updates.
=0 –> print every progress update.
<0 –> never print progress updates.
None –> use DEFAULTS.PROGRESS_UPDATES_PRINT_FREQ
elf.print_freq has not been set, infer from self.verbose if it exists,
use DEFAULTS.PROGRESS_UPDATES_PRINT_FREQ (default: 2).
additional args & kwargs are passed as loader(*args_loader, **kw_loader).
load_across_dims_implied_by(var, loader, *args_loader, assign_coords=None, _min_split=1, **kw_loader)
return loader(…), iterating & joining across each dimension implied by var.
Equivalent to self.load_across_dims(loader, …, dims=self.match_var_loading_dims(var)).
var: str
variable which implies dims to load across, via self.match_var_loading_dims(var).
loader: callable of (*args_loader, **kw_loader) -> xarray.DataArray.
will call loader to get result values at each combination of dims values in self.
(loader will probably depend on dims values from self.)
assign_coords: None or bool, default None
whether to dim.assign_coord for each result of loader, for each dimension.
None –> assign coord only if dim.name not already in array.coords.
_min_split: int, default 1
if an implied dim has current_n() < min_split, don’t load across it.
1 –> no minimum.
additional args & kwargs are passed as loader(*args_loader, **kw_loader).
load_direct(var, *args, **kw)
load var “directly”, either from a file, self.setvars, self.direct_overrides,
or via self.load_input() if self.snap is INPUT_SNAP.
Steps:
1) attempt to get var from cache or self.setvars.
[EFF] only tries this if we are not self._inside_quantity_loader_call_logic,
to avoid redundant calls to self.get_set_or_cached.
2) adjust var name if appropriate, via new_varname = self._var_for_load_fromfile(var).
if new_varname != old varname, attempt to get new_varname from cache or setvars.
3) if self.snap is INPUT_SNAP, return self.load_input(new_varname).
4) super().load_direct(adjusted_var, *args, **kw),
which will use self.load_fromfile(…) unless any overrides apply here.
load_fromfile(fromfile_var, *args__None, snap=None, **kw__None)
return numpy array of fromfile_var, loaded directly from file.
fromfile_var: str
the name of the variable to read, adjusted appropriately for loading fromfile.
E.g. use ‘result_prim_5’ not ‘bx’, to get magnetic field x-component.
See also: self._var_for_load_fromfile().
snap: None, str, int, or Snap
the snapshot number to load. if None, use self.snap.
load_input(fromfile_var, *args, **kw)
load value of fromfile_var but when self.snap is INPUT_SNAP.
[Not implemented for this subclass; loading direct when self.snap is INPUT_SNAP will crash]
(optional; subclass can override in order to implement INPUT_SNAP functionality.
see EppicCalculator.load_input() for an example.)
property maintaining
alias to maintaining_attrs
maintaining_attrs(*attrs, **attrs_as_flags)
returns context manager which restores attrs of self to their original values, upon exit.
E.g. maintaining_attrs(obj, ‘attr1’, ‘attr2’, attr3=True, attr4=False)
–> will restore upon exit, original values of obj.attr1, attr2, and attr3, but not attr4.
classmethod match_var(var, *, check=['KNOWN_VARS', 'KNOWN_PATTERNS'])
match var from cls.KNOWN_VARS or cls.KNOWN_PATTERNS, or raise FormulaMissingError.
returns result=MatchedQuantity(var, loadable, _match=_match) where:
loadable is the LoadableQuantity associated with this var,
_match is:
None, if var in cls.KNOWN_VARS;
re.fullmatch(pattern, var), if var matches any pattern in cls.KNOWN_PATTERNS.
if var matches multiple patterns, only the first matching pattern is used.
Uses MatchedVar if match from KNOWN_VARS, MatchedPattern if from KNOWN_PATTERNS.
(note that both MatchedVar and MatchedPattern subclass MatchedQuantity.)
check: str or list of str from [‘KNOWN_VARS’, ‘KNOWN_PATTERNS’]
where to check for matches. Default is to check KNOWN_VARS and KNOWN_PATTERNS.
E.g. to only check KNOWN_PATTERNS, use check=[‘KNOWN_PATTERNS’].
loadable and _match can be retrieved via result.loadable and result._match.
match_var_loading_dims(var, **kw_loading_dims)
return dims for loading var across.
Result will probably vary across these dims (but not guaranteed, if any dependency uses reduces_dims.)
These are all Dimension dims, not maindims. (E.g. ‘fluid’ and ‘snap’, but not ‘x’, ‘y’, ‘z’).

Equivalent: self.match_var_tree(var).loading_dims(**kw_loading_dims)

match_var_result_dims(var, **kw_result_dims)
return dims which result of cls(var) will vary across.
These are all Dimension dims, not maindims. (E.g. ‘fluid’ and ‘snap’, but not ‘x’, ‘y’, ‘z’).

Equivalent: cls.match_var_tree(var).result_dims(**kw_result_dims)

match_var_result_size(var, *, maindims=True, **kw_result_dims)
return size (number of elements) which self(var) will have.
(Efficient; doesn’t actually get self(var).)
Depends on current values of relevant dims. (E.g., self.fluid, not self.fluids)
maindims: bool
if True, include maindims_shape when calculating size.
match_var_tree(var=UNSET, **kw_quant_tree_from_quantity_loader)
return QuantTree of MatchedQuantity objects from matching var and all dependencies,
using self.KNOWN_VARS and self.KNOWN_PATTERNS when searching for matches.
var must be provided; var=UNSET will raise an error (helpful if tried calling this as a classmethod).
See also: type(self).cls_var_tree, for the classmethod version of this function.
Most of the time it is possible to get tree without any details from self,
but sometimes not. e.g. when getting collision frequencies, self.fluid affects deps.
additional kwargs will be passed to QuantTree.from_quantity_loader(…),
which passes kwargs from self.kw_call_options() into self.using(**kw) while getting deps.
matched_pattern_cls

alias of MatchedPattern

matched_var_cls

alias of MatchedVar

property nGbytes
number of gigabytes across all files in self.dirname (and subdirectories).
== self.nbytes / 1024**3
property nMbytes
number of megabytes across all files in self.dirname (and subdirectories).
== self.nbytes / 1024**2
n_existing_snaps()
returns number of existing snaps. Equivalent to self.snap_dim.n_existing_for(self).
property nbytes
number of bytes across all files in self.dirname (and subdirectories)
property ncoarse
int
if >1, group tasks into groups of size ncoarse before performing them.
property ncpu
None or int
max number of cpus to use for multiprocessing.
None –> use multiprocessing.cpu_count()
int –> use this value. if 0 or 1, do not use multiprocessing here.
Note: will actually use min(ncpu, number of calls to be made);
e.g. if ncpu=4 but len(arg_kw_tuples)=2, will only use 2 cpus.
see also: self.get_ncpu() to read actual number of cpus when self.ncpu is None.
property nondim_behavior_attrs
list of attrs in self which control behavior of self, but which are NOT in self.dimensions.
property notes_dirname
‘abspath to directory containing plots/notes for a DirectLoader.
Might be the same directory as self.dirname, but doesn’t need to be;
can explicitly set self.notes_dirname = value, if desired.
If not set, use notes_dirname == self.dirname,
unless self.dirname ends with one of the self._INDICATES_NOTES_DIRNAME options.
E.g. dirname == ‘path/to/dir0’ –> notes_dirname == ‘path/to/dir0’.
E.g. dirname == ‘path/to/dir1/_sim’ –> notes_dirname == ‘path/to/dir1’.
E.g. dirname == ‘path/to/dir1/_check0’ –> notes_dirname == ‘path/to/dir1’.
See also: self.unique_notes_dirname
pop_dim_keys(kw)
return ({key: kw.pop(key) for key in self.dimensions if key in kw}, kw).
property print_freq
None, or number (possibly negative or 0)
>0 –> Minimum number of seconds between progress updates.
=0 –> print every progress update.
<0 –> never print progress updates.
None –> use DEFAULTS.PROGRESS_UPDATES_PRINT_FREQ
property print_freq_explicit
like self.print_freq, but converts UNSET to value based on self.verbose,
UNSET –> result depends on self.verbose:
False or <=0 –> -1
True or (>=1 and <5) –> None
>=5 –> 0 (i.e. print every progress update)
if self.verbose doesn’t exist –> None
if result would be None, instead give DEFAULTS.PROGRESS_UPDATES_PRINT_FREQ.
quant_tree(var=UNSET, **kw_quant_tree_from_quantity_loader)
return QuantTree of MatchedQuantity objects from matching var and all dependencies,
using self.KNOWN_VARS and self.KNOWN_PATTERNS when searching for matches.
var must be provided; var=UNSET will raise an error (helpful if tried calling this as a classmethod).
See also: type(self).cls_var_tree, for the classmethod version of this function.
Most of the time it is possible to get tree without any details from self,
but sometimes not. e.g. when getting collision frequencies, self.fluid affects deps.
additional kwargs will be passed to QuantTree.from_quantity_loader(…),
which passes kwargs from self.kw_call_options() into self.using(**kw) while getting deps.
quant_tree_cls

alias of QuantTree

property set
alias to set_var
set_attrs(**attrs)
sets these attrs in self.
set_pop_dim_attrs(kw)
set self.{key} = kw.pop(key) for each key in self.dimensions if key in kw.
set_var(var, value, behavior_attrs=None, forall=[], *, ukey=None, forced=False, **kw_using)
set var in self. When later doing self(var) to get var, return the set value,
but only if self.behavior is compatible with the relevant parts of self.behavior when var was set.
This function will use, if it exists:
self.KNOWN_SETTERS[var](self, value, behavior_attrs, forall=forall)
Otherwise, calls:
self.set_var_internal(var, value, self.behavior_attrs, forall=forall)
var: str
the var to set in self.
value: number, xarray, iterable or 1D array, array with shape matching self.maindims_shape.
the value to set var to.
number –> set var to this number.
xarray –> set var to this xarray.
[TODO](not yet implemented) iterable or 1D array –> set var to these values along dim=’testing’.
[TODO](not yet implemented) array with shape matching self.maindims_shape –> set var to this array.
behavior_attrs: None or list
tells which attrs from self control behavior of the set var.
The set var will only be retrieved when behavior_attrs of self are compatible.
E.g. set_var(‘n’, [‘fluid’, ‘snap’]) –> saves ‘n’ in cache with current fluid & snap.
Will only load ‘n’ if self.fluid and self.snap == cached fluid and snap for ‘n’.
if var in self.KNOWN_SETTERS, cannot provide behavior_attrs here.
else, use self.behavior_attrs if None.
forall: list of strings
if provided, tells which attrs of self do NOT control the behavior of the set var.
E.g. forall=[‘snap’] –> ‘snap’ will NOT be included in behavior_attrs.
(anything in behavior_attrs AND forall will be removed from the final behavior_attrs)
ukey: None or str
if provided, tells string to give to UnitsManager when converting value’s units.
When ukey is known, setting value in any unit system will enable to read it in all unit systems.
E.g. set_var(‘n’, 1e10, …, ukey=’n’, units=’si’)
–> self(‘n’, units=’raw’) == self(‘n’, units=’si’) * self.u(‘u’, ‘raw’, convert_from=’si’)
if not provided, value will be associated with current unit system;
attempted to read value in any other unit system will not used the cached value set here.
E.g. set_var(‘u’, 1e10, …, units=’si’) # ukey not provided
–> self(‘u’, units=’raw’) –> uses self’s other logic for getting ‘u’, not from setvars.
note: if provided, ‘units’ will be added to behavior_attrs if not already in there.
forced: bool, default True
handles the case where self.KNOWN_SETTERS[var] doesn’t exist. In that case…
True –> set var in self, anyway.
False –> crash; raise FormulaMissingError
additional kwargs, if provided, go to self.using(**kw) during the operation.
returns list of set quantities.
set_var_internal(var, value, behavior_attrs, forall=[], *, ukey=None)
set var in self. KNOWN_SETTERS functions may wish to use this method.
(KNOWN_SETTERS functions should NOT use self.set_var, to avoid recursion issue.)
This function has the internal logic for self.set_var;
set_var calls set_var_internal when self.KNOWN_SETTERS[var] not provided.
var: str
the var to set in self.
value: number, xarray, iterable or 1D array, array with shape matching self.maindims_shape.
the value to set var to. See help(self.set_var) for more info.
behavior_attrs: list of strings
the behavior attrs relevant to setting this var;
getting var only gives value when current behavior attrs values are compatible with the cached ones.
forall: list of strings
if provided, tells which behavior attrs do NOT control the behavior of the set var.
e.g. behavior_attrs=[‘snap’, ‘fluid’], forall=[‘snap’] –> use [‘fluid’], only.
ukey: None or str
if provided, tells string to give to UnitsManager when converting value’s units;
when ukey is provided, can retrieve value in any unit system (probably ‘si’ or ‘raw’).
when ukey not provided, if ‘units’ in used behavior attrs, can only retrieve value in that unit system.
property setvar
alias to set_var
property setvars
VarCache of vars set via self.set_var(). Returns these values when appropriate,
i.e. whenever self.behavior is compatible with the behavior in the cache.
To empty the cache, use self.setvars.clear() to empty the cache.
property snap
alias to self.snap_dim.v
property snap_dim
snap dimension for SnapHaver.
snap_dim_cls

alias of SnapDimension

snap_filepath(snap=None)
convert snap to full file path for this snap, i.e. to the Header.NNN file.
property snap_is_iterable
alias to self.snap_dim.is_iterable
property snap_list
alias to self.snap_dim.list
property snap_type
alias to self.snap_dim.get_type
property snapdir
directory containing the snapshot files.
Here, gives self.dirname, because Muram outputs are stored at top-level of directory.
property snaps
alias to self.snap_dim.values
property take_snap
alias to self.snap_dim.take
property take_snaps
alias to self.snap_dim.take_along
property timeout
None or int
max duration, in seconds. Must be None or integer (due to limitations of signal.alarm method)
None –> no time limit.
Note: if time_limit is reached, will raise a TimeoutError and save the result so far.
(in this case, any not-yet-calculated values will each be RESULT_MISSING.)
property title
title to help distinguish this calculator from others.
E.g. might want to add self.title to plots.
Default: os.path.basename(self.dirname) if self.notes_dirname == self.dirname,
else basename(self.notes_dirname) + basename(self.dirname),
except skip basename(self.dirname) if ‘_sim’.
Examples of default behavior:
‘/path/to/dir0’ –> ‘dir0’.
‘/path/to/dir1/_sim’ –> ‘dir1’.
‘/path/to/dir1/_check0’ –> ‘dir1_check0’.
property toplevel_scale_coords
dict of {coord_name: coord_scaling} to apply to top-level outputs of self(var).
(Never applies to internal calls of self(var), only applies at self.call_depth==1.)
Useful if making plots and want to scale coords by some factor.
E.g., self.toplevel_scale_coords = {‘t’: 1000} to convert s to ms.

CAUTION: coord units labels will remain unaffected.

tree(var=UNSET, **kw_quant_tree_from_quantity_loader)
return QuantTree of MatchedQuantity objects from matching var and all dependencies,
using self.KNOWN_VARS and self.KNOWN_PATTERNS when searching for matches.
var must be provided; var=UNSET will raise an error (helpful if tried calling this as a classmethod).
See also: type(self).cls_var_tree, for the classmethod version of this function.
Most of the time it is possible to get tree without any details from self,
but sometimes not. e.g. when getting collision frequencies, self.fluid affects deps.
additional kwargs will be passed to QuantTree.from_quantity_loader(…),
which passes kwargs from self.kw_call_options() into self.using(**kw) while getting deps.
property typevar_crash_if_nan
bool. whether to crash methods if typevar output would be ‘nan’.
False –> return NaN when typevar gives ‘nan’, instead of crashing.
“typevar” here refers to any var used for checking which formula to use, from various options,
e.g. ‘ntype’ in MhdMultifluidLoader or ‘ionfrac_type’ in MhdIonizationLoader.
The relevant methods can check if self.typevar_crash_if_nan before returning a ‘nan’ result.
property unique_notes_dirname
abspath to directory containing plots/notes for a DirectLoader,
probably not shared by DirectLoaders corresponding to any other data.
(E.g. if
Might be the same directory as self.dirname, but doesn’t need to be;
can explicitly set self.notes_dirname = value, if desired.
If not set, use unique_notes_dirname = self.dirname,
unless dirname ends with one of the self._INDICATES_UNIQUE_NOTES_DIRNAME options.
E.g. dirname == ‘path/to/dir0’ –> unique_notes_dirname == ‘path/to/dir0’.
E.g. dirname == ‘path/to/dir1/_sim’ –> unique_notes_dirname == ‘path/to/dir1’.
E.g. dirname == ‘path/to/dir1/_check0’ –> unique_notes_dirname == ‘path/to/dir1/_check0’.
See also: self.notes_dirname
property unset
alias to unset_var
unset_var(var, behavior_attrs=[], *, missing_ok=True, **kw_using)
remove var from self.setvars (but only at values stored with relevant behavior).
[TODO] define rules for which vars unset which other vars…
e.g. for eppic right now, set_var(‘n’) sets ‘den’ but not ‘n’;
unset_var(‘n’) unsets nothing… but should probably alias to unset_var(‘den’).
behavior_attrs: list of strings
only remove cached values where self.behavior matches cached behavior for these attrs.
if empty, remove all cached values for var, regardless of associated behavior.
missing_ok: bool
whether it is okay for there to be zero matching cached values for var.
raise CacheNotApplicableError if missing_ok=False when there are no matching cached values.
additional kwargs, if provided, go to self.using(**kw) during the operation.
return list of CachedQuantity objects which were removed from self.setvars.
unset_var_internal(var, behavior_attrs, forall=[], *, ukey=None, missing_ok=True)
unset var from self.setvars.
KNOWN_SETTERS functions may wish to use this method, to unset dependent values.
E.g. if u depends on n, and n is changed, may wish to unset the value of u.
behavior_attrs: list of strings
the behavior attrs relevant to setting this var.
forall: list of strings
if provided, tells which behavior attrs to ignore when unsetting the var.
ukey: None or string
if provided, ignore ‘units’ behavior attr when unsetting the var
(due to assuming that ukey was provided when setting the var,
hence that the set var could be retrieved in any units system)
missing_ok: bool
whether it is okay for there to be zero matching cached values for var.
raise CacheNotApplicableError if missing_ok=False when there are no matching cached values.
return list of CachedQuantity objects which were removed from self.setvars.
property using
alias to using_attrs
using_at_call_depth(depth, **attrs_and_values)
context manager for setting attrs_and_values but only while call_depth == depth.
E.g.:
with self.using_at_call_depth(3, verbose=3):
self(‘sgyrof’)
# while self.call_depth == 3 inside of this ‘with’ block, uses self.verbose=3.
# but everywhere else, uses original value of verbose.
# assuming originally verbose=False (or unset), this example will print:
| | (call_depth=2) get var=’q’
| | (call_depth=2) get var=’mod_B’
| | (call_depth=2) get var=’m’
# compare this to simply using self.verbose=3, which would print:
| (call_depth=1) get var=’sgyrof’
| | (call_depth=2) get var=’q’
| | (call_depth=2) get var=’mod_B’
| | | (call_depth=3) get var=’B_dot_B’
| | | | (call_depth=4) get var=’B_xyz’
| | | | | (call_depth=5) get var=’B’
| | (call_depth=2) get var=’m’
Equivalent to self.call_depth_manager.using_obj_attrs_at(depth, **attrs_and_values)
using_at_next_call_depth(**attrs_and_values)
context manager for setting attrs_and_values but only while call_depth == self.call_depth + 1
Equivalent to self.using_at_call_depth(self.call_depth + 1, **attrs_and_values).
(Also equivalent to self.call_depth_manager.using_obj_attrs_at_next(**attrs_and_values).)
using_attrs(attrs_as_dict={}, _unset_sentinel=ATTR_UNSET, **attrs_and_values)
returns context manager which sets attrs of obj upon entry; restores original values upon exit.
_unset_sentinel: any value, default ATTR_UNSET
upon entry, delete any attrs with value _unset_sentinel (compared via ‘is’).
E.g. using_attrs(obj, _unset_sentinel=None, x=None) –> del obj.x upon entry.
using_first_dimpoint(dims=None)
return context manager which sets dimensions to their first values (when called); restore original on exit.
Useful for testing a single code at a single dimpoint without needing to set each dimension individually.
dims: None or iterable of strs appearing in self.dimensions.keys()
dimensions to include. None –> use all dimensions.