PlasmaCalcs.quantities.patterns.fft_loader.FFTLoader

class PlasmaCalcs.quantities.patterns.fft_loader.FFTLoader

Bases: QuantityLoader

fft calculations, e.g. fft2, fft.
self.fft_dims controls which dims to take the fft over.
__init__()

Methods

__init__()

attach_extra_coords(arr)

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

cls_var_tree(var, *[, missing_ok])

copy()

direct_overrides_dynamic()

fftN(array[, dim, ds, slices])

fft_dims_for(array)

get_behavior([keys])

get_fft(var, *[, _match])

get_fft_with_dims(var, *[, _match])

get_ifft(var, *[, _match])

get_lowpass(var, *[, _match])

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])

ifftN(array[, dim, df, x0, ds])

ifft_dims_for(array)

kw_call_options(*[, sorted])

load_direct(var, *args, **kw)

load_fromfile(var, *args, **kw)

lowpass(array[, dim, keep, keep_r])

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])

quant_tree([var])

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

set_var_internal(var, value, behavior_attrs)

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])

Attributes

KNOWN_PATTERNS

KNOWN_SETTERS

KNOWN_VARS

assign_behavior_attrs

assign_behavior_attrs_max_call_depth

behavior

behavior_attrs

call_depth

call_depth_manager

cls_behavior_attrs

direct_overrides

enable_fromfile

extra_coords

fft

fft_dims

fft_half

fft_keep

fft_slices

fft_step

get

ifft

known_pattern

known_setter

known_var

lowpass_keep

maintaining

nondim_behavior_attrs

set

setvar

setvars

typevar_crash_if_nan

unset

using

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”.
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.
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?
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.
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().
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 fft
alias to fftN
fftN(array, dim=UNSET, ds=None, *, slices=UNSET, **kw_xarray_fftN)
xarray_fftN with defaults for dim & slices determined by self.fft_dims, self.fft_slices.
kwargs are passed to xarray_fftN. For convenience, docs for xarray_fftN are copied below.
xarray_fftN docs
—————-
calculates fft(array) along N dimensions.
shifts frequencies such that the 0-frequency is in the center.
replaces result dimensions & coordinates appropriately, to indicate which dims were fft’d.
dim: None, str, or iterable of strs
coordinates(s) to take fft over.
Can be pre-fft or post-fft names. (e.g. ‘x’, ‘freq_x’, ‘freqrad_x’, ‘k_x’)
promote_dim(array, coord) for any non-dimension coordinates, as needed.
None –> equivalent to array.dims
str –> just this coordinate.
iterable of strs –> just these coordinates.
ds: None, number, or dict of {dim: d}
spacing between elements of array (pre-transform), along each dim.
if number, use the same value for all dims.
if None, infer via array.coords[dim].diff(dim) for each dim
(requires evenly-spaced coordinates in dim; spacing checked with np.allclose)
rad: None or bool
whether to convert frequencies to “radians” by multiplying them by 2 * pi.
E.g., for fft in space, rad=False gives 1/wavelength; rad=True gives wavenumber k.
if None, infer from dim if any post-fft names provided, else default to False.
abs: bool
if True, return np.abs(result), instead.
slices: dict or FFTSlices
instructions for slicing the final result.
Can provide {cname: indexer} instructing to slice post-fft dimension
associated with cname, via indexer. (cname can be pre-fft or post-fft name.)
These understand fractional indexing: can provide a fractional value
between -1 and 1, to use that fraction of the length along the relevant dimension.
Can also provide keep, half, step, and/or missing_slices, here (Or, as kwargs).
(raise InputConflictError if any provided in both places and have conflicting values.)
See those kwargs for more details.
keep: None, True, dict, or number in 0 < keep <= 1
implies the fraction of each dimension to keep.
(ignored for any dimensions which already have a slice specified.)
e.g. keep=0.4 with length=1000 would result in slice(300, 700),
since that keeps 400 out of 1000 points, and is centered at 1000/2.
None –> ignored.
True –> use keep = DEFAULTS.FFT_KEEP (default: 0.4).
dict –> different value in each dimension;
keys can be pre-fft OR post-fft dimension names.
UNSET –> use None.
half: None, str, or iterable of strs
dimensions along which to keep only the right half of the result.
(ignored for any dimensions which already have a slice specified.)
None –> ignored.
str or iterable of strs –>can be pre-fft OR post-fft dimension name(s).
Applied after keep, e.g. keep=0.4, length=1000, half=’x’ –> slice(500, 700) for x.
UNSET –> use None.
step: None, dict, int, or non-integer between -1 and 1
step to take along each dim.
(ignored for any dimensions which already have a slice specified.)
fractional value –> use fraction of length (e.g. 0.01 –> 1% of dim length), min |step|=1.
negative –> reverses direction (and swaps start & stop for the slice)
None –> equivalent to using step=1.
dict –> different value in each dimension;
keys can be pre-fft OR post-fft dimension names.
UNSET –> use None.
missing_slices: ‘ignore’, ‘warn’, or ‘raise’
tells how to handle keys not matching any fft-related coordinate.
‘ignore’ –> silently ignore these keys. This is the default.
‘warn’ –> issue a warning.
‘raise’ –> raise an error.
UNSET –> use ‘ignore’
additional kwargs passed to np.fft.fftn.
returns result of fftn(…), shifted such that the 0-frequency is in the center,
and with the relevant dimensions renamed as specified.
property fft_dims
the dims over which to possibly apply fft (FFTLoader methods).
will only apply fft along these dims for an array if they actually appear in the array.
None –> use self.maindims. (this is the default.)
See also: self.fft_dims_for(array).
fft_dims_for(array)
return the dims over which to apply fft for this array.
This is the intersection of self.fft_dims and array.dims.
property fft_half
alias to self.fft_slices.half
property fft_keep
alias to self.fft_slices.keep
property fft_slices
the dict of indexers to apply to all fft results from self, by default.
keys can be a pre-fft or post-fft dimension name,
e.g. ‘x’ or ‘freq_x’ both lead to slicing of the result’s ‘freq_x’ dimension.
(note if rad=True it would be ‘k_x’ in the result, and ‘x’ would apply but not ‘freq_x’.)
all other keys (not a pre-fft or post-fft dimension name) are ignored.
values can be slice, int, iterable, or non-integer value between -1 and 1.
fractional values are interpreted as a fraction of the length of the corresponding dimension,
as per interprets_fractional_indexing. Negative fractions refer to distance from the end.
e.g., dict(x=slice(-0.3, None, 0.01), y=0.8), where x and y correspond to length 1000,
would be equivalent to dict(x=slice(-300, None, 10), y=800).
Can also have special keys (which apply to all fft dims without a specifically-related key):
keep: fraction of each dimension to keep,
e.g. keep=0.4 with length=1000 would result in slice(300, 700),
since that keeps 400 out of 1000 points, and is centered at 1000/2.

half: dimension(s) along which to keep only the right half of the result. step: slice step. Can also be fractional to use fraction of dimension length.

For more help on special keys, see help(self._fft_slices_cls) or help(FFTSlices)
property fft_step
alias to self.fft_slices.step
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_fft(var, *, _match=None)
N-dimensional fft. fft(var). Applied along all fft_dims in array.
self.get(‘[rad]fft[N]_[var]’), where [rad]=’rad’ or ‘’, and [N]=any integer or ‘’
E.g. ‘fft_var’, ‘radfft_var’, ‘fft1_var’, ‘fft2_var’, ‘radfft1_var’, ‘radfft2_var’.
‘rad’ –> multiply result’s frequency coordinates by 2 * pi.
(array values will be the same either way, but coordinates will be different.)
N provided –> fft must be along exactly this many dimensions, else crash with DimensionError.
E.g. N=2 means self(array) must have exactly 2 dims which are also in self.fft_dims.
Feel free to separately self.fft_dims, or enter it as a kwarg via self(…, fft_dims=…).
get_fft_with_dims(var, *, _match=None)
N-dimensional fft. fft(var). Applied along the indicated dims.
self.get(‘([rad]fft[dims]_[var]’), where [rad]=’rad’ or ‘’, and [dims]=any combination of xyzt.
E.g. ‘fftx_var’, ‘fftt_var’, ‘fftyz_var’, ‘radfftxy_var’, ‘fftzyt_var’, ‘radfftyzt_var’.
‘rad’ –> multiply result’s frequency coordinates by 2 * pi.
(array values will be the same either way, but coordinates will be different.)
get_ifft(var, *, _match=None)
N-dimensional ifft. ifft(var). Applied along all fft_dims in array.
self.get(‘ifft[N]_[var]’), where [N]=any integer or ‘’
E.g. ‘ifft_var’, ‘ifft1_var’, ‘ifft2_var’.
N provided –> ifft must be along exactly this many dimensions, else crash with DimensionError.
E.g. N=2 means self(array) must have exactly 2 dims which are also in self.fft_dims.
Feel free to separately self.fft_dims, or enter it as a kwarg via self(…, fft_dims=…).
get_lowpass(var, *, _match=None)
lowpass filter across self.fft_dims; keep low frequencies, zero high frequencies.
ifft(fft(self(var) * filter), where filter = 1 for low frequencies, 0 for high frequencies.
fraction of each fft’d dimension to keep is determined by self.lowpass_keep.
Default is DEFAULTS.LOWPASS_KEEP (default: 0.4).
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.
property ifft
alias to ifftN
ifftN(array, dim=UNSET, df=None, *, x0=0, ds=None, **kw_xarray_ifftN)
xarray_ifftN with defaults for dim determined by self.fft_dims.
kwargs are passed to xarray_ifftN. For convenience, docs for xarray_ifftN are copied below.
xarray_ifftN docs
—————–
calculates ifft(array) along N dimensions.
shifts positions such that the 0-position is in the center.
replaces result dimensions & coordinates appropriately, to indicate which dims were ifft’d.
For convenience, all coordinate names can be pre-fft OR post-fft names,
e.g. ‘x’, ‘freq_x’, ‘freqrad_x’, or ‘k_x’.
“post-fft” names look like ‘freq_dim’, ‘freqrad_dim’,
or any value in DEFAULTS.FFT_FREQ_RAD_DIMNAMES.values(), e.g. ‘k_x’.
Caution: ifft(fft(arr)) == arr only approximately, due to floating point rounding errors.
Can at least ensure coordinate alignment by providing ds during ifft(fft(arr), ds=…)
dim: None, str, or iterable of strs
coordinates(s) of array to take ifft over.
promote_dim(array, coord) for any non-dimension coordinates, as needed.
None –> equivalent to array.dims
df: None, number, or dict of {dim: d}
spacing between elements of array (in frequency-space).
None –> infer from ds if provided, else infer from array.
number –> use this as df for all dims.
rad: None or bool
if True, interpret frequency-spacing (df) like it is “in radians”,
dividing it by 2 * pi before converting to position-space.
None –> infer rad from names of the dims being ifft’d.
ds: None, number, or dict of {dim: d}
spacing between elements of result (in position-space), along dims from result.
number –> use this as ds for all dims.
None –> infer from df if provided, else infer from array.
Note: provide ds to guarantee ifft(fft(arr)) == arr, exactly;
otherwise position coords might include small rounding errors.
x0: None, number, or dict of {dim: value}
if provided, alter position-space coordinates by adding a constant offset,
such that the 0’th position for each dim equals x0[dim].
number –> apply the same number to all dims.
iterable –> use these numbers; kwarg dim must also be provided as an iterable of strs.
dict –> dict of {dim: x0} specifying the value associated with each dim
ifft_dims_for(array)
return dims over which to apply ifft for this array.
This is the self.fft_dims which correspond to dims in array.dims,
though not via exact match.
E.g. ‘freq_x’ or ‘k_x’ in array.dims, if ‘x’ in fft_dims.
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_direct(var, *args, **kw)
load var “directly”, from some source which is not known by the main part of PlasmaCalcs.
Attempt the following, returning the first successful attempt:
- return self.direct_overrides[var](self, *args, **kw).
- return self.direct_overrides_dynamic()[var](self, *args, **kw).
- use self.load_fromfile.
return the result (probably a numpy array, but not guaranteed).
Examples:
load Bx directly from a file
load n for H+, using a different module which somehow gives nH+
(PlasmaCalcs doesn’t need to know where the value came from.)
if used an override, instead of loading from file,
set self._load_direct_used_override = var.
Otherwise, set it to None.
This might be used, e.g., to determine if the output came directly from a file or not.
load_fromfile(var, *args, **kw)
load var directly from a file. Other methods should usually use load_direct, instead.
the implementation here just raises LoadingNotImplementedError;
subclasses should implement this method in order to load any values from files.
lowpass(array, dim=UNSET, keep=UNSET, *, keep_r=UNSET, **kw_xarray_lowpass)
xarray_lowpass with defaults for dim & keep determined by self.fft_dims, self.lowpass_keep.
kwargs are passed to xarray_lowpass. For convenience, docs for xarray_lowpass are copied below.
xarray_lowpass docs
——————-
return array after putting it through a lowpass filter using fft & ifft.
This is equivalent to ifft(fft(array) * filter), where filter is 0 at all “large” frequency values.
“large” is determined by keep & r; see below.
dim: None or iterable or strs
coordinates to apply lowpass filter over. If None, use all array.dims.
promote_dim(array, coord) for any non-dimension coordinates, as needed.
keep: UNSET, True, dict, or number between 0 < keep <= 1
fraction of frequencies to keep, along each dim.
(Must provide this or keep_r but not both.)
True –> use DEFAULTS.FFT_LOWPASS_KEEP.
number –> use this value for all dims.
keep_r: UNSET, True, or number between 0 < keep <= 1
radius of N-sphere to keep in normalized frequency-space,
normalized such that max(frequencies)==1 along each dim.
All values outside of this N-sphere will be set to 0.
Similar to keep, but here use an N-sphere instead of an N-cube.
(Must provide this or keep but not both.)
True –> use DEFAULTS.FFT_LOWPASS_KEEP.
[TODO] more options than just spherical? (e.g. ellipsoid)
ds: None, number, or dict of {dim: d}
spacing between elements of array along each dim.
number –> use the same value for all dims.
None –> infer via array.coords[dim].diff(dim) for each dim
(requires evenly-spaced coordinates in dim; spacing checked with np.allclose)
real: None or bool
whether to return np.real(ifft) instead of just ifft (which might have imaginary part)
None –> infer from array. Use True if np.all(np.isreal(array)), else False.
return_fft: bool
whether to return (result, masked fft) instead of just result.
mainly intended for debugging purposes.
property lowpass_keep
the default value for “keep” in self.lowpass. 0 < lowpass_keep <= 1.
Or, can be a dict of {dim: keep} pairs, to use different keep for different dims.
To use keep_r instead of keep, call lowpass directly and enter keep_r there.
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 nondim_behavior_attrs
list of attrs in self which control behavior of self, but which are NOT in self.dimensions.
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_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.
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 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.