Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Integrate on boundary to compute length scale quantities #1094

Draft
wants to merge 47 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
56ead44
Merge branch 'fieldline_compute' into integrate_on_boundary
unalmis Jul 2, 2024
504cdfc
Merge branch 'fieldline_compute' into integrate_on_boundary
unalmis Jul 4, 2024
27a6fcb
Update master compute data with follog differences:
unalmis Jul 4, 2024
f1c7634
Add scaling by max(rho) information to description
unalmis Jul 4, 2024
2694e8c
Update master_compute_data from master
unalmis Jul 5, 2024
69fa9ce
Merge branch 'fieldline_compute' into integrate_on_boundary
unalmis Jul 5, 2024
93c710b
Remove unneeded resolution requirement from divergence theorems compu…
unalmis Jul 5, 2024
7970177
Merge branch 'fieldline_compute' into integrate_on_boundary
unalmis Jul 10, 2024
be11015
Make changes in light of https://github.com/PlasmaControl/DESC/issues…
unalmis Jul 11, 2024
80feb38
Merge branch 'fieldline_compute' into integrate_on_boundary
unalmis Jul 11, 2024
c31abcd
Fix math error in comment
unalmis Jul 12, 2024
acf0486
Update master compute data xyz: following changes
unalmis Jul 13, 2024
9974137
Merge branch 'fieldline_compute' into integrate_on_boundary
ddudt Jul 15, 2024
3ea229d
Merge branch 'master' into integrate_on_boundary
unalmis Jul 20, 2024
1f6c8ce
Loosen test tolerance for vmec comparison test for length scale quant…
unalmis Jul 20, 2024
8c778fa
Remove changes to adding_compute_funs.rst
unalmis Jul 20, 2024
5912c79
Fix bug in plot_1d
unalmis Jul 20, 2024
1659fc0
Fix test by suppressing warning
unalmis Jul 21, 2024
4222b74
Fix unrecognized char error since warnings doesn't recognize unicode
unalmis Jul 21, 2024
cf81a3c
Fix test that assumes S = S(r) instead of outermost
unalmis Jul 21, 2024
1bc81ae
Merge branch 'master' into integrate_on_boundary
unalmis Aug 21, 2024
b6bb3ce
Merge branch 'master' into integrate_on_boundary
unalmis Sep 4, 2024
167156f
Merge branch 'master' into integrate_on_boundary
unalmis Sep 16, 2024
780ddb3
clean up comment
unalmis Sep 16, 2024
a93b98b
Remove old code
unalmis Sep 17, 2024
66b402a
Merge branch 'master' into integrate_on_boundary
unalmis Sep 19, 2024
01e212f
Merge branch 'master' into integrate_on_boundary
unalmis Sep 30, 2024
d7c6d26
Merge branch 'master' into integrate_on_boundary
unalmis Oct 6, 2024
3fb1ccf
Merge branch 'master' into integrate_on_boundary
unalmis Oct 17, 2024
c21913e
Merge branch 'master' into integrate_on_boundary
unalmis Oct 18, 2024
6adaa96
Using grid requirement instead of warnings
unalmis Oct 20, 2024
cd2c25a
Merge branch 'grid_resolution_fix' into integrate_on_boundary
unalmis Oct 27, 2024
340f4a8
.
unalmis Oct 28, 2024
5914a8a
..
unalmis Oct 28, 2024
d88f47c
Merge branch 'master' into integrate_on_boundary
unalmis Oct 28, 2024
f23b97f
Merge branch 'master' into integrate_on_boundary
dpanici Nov 13, 2024
e8c8ca9
Merge branch 'master' into integrate_on_boundary
unalmis Dec 5, 2024
77c9992
Merge branch 'master' into integrate_on_boundary
unalmis Dec 6, 2024
cace498
Merge branch 'master' into integrate_on_boundary
unalmis Dec 11, 2024
c88a7a7
Merge branch 'master' into integrate_on_boundary
unalmis Dec 31, 2024
7cacd7e
Merge branch 'ku/bounce_alpha' into integrate_on_boundary
unalmis Dec 31, 2024
2771487
Mark todo as resolved
unalmis Dec 31, 2024
3e51e5c
Merge branch 'ku/bounce_alpha' into integrate_on_boundary
unalmis Jan 5, 2025
eb8b50c
Add docstring lost inold merge
unalmis Jan 5, 2025
fd8454f
Merge branch 'master' into integrate_on_boundary
unalmis Jan 8, 2025
9d6f4f2
Merge branch 'master' into integrate_on_boundary
dpanici Jan 15, 2025
7ee3fdb
Merge branch 'master' into integrate_on_boundary
unalmis Jan 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
359 changes: 252 additions & 107 deletions desc/compute/_geometry.py
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion desc/compute/_omnigenity.py
Original file line number Diff line number Diff line change
Expand Up @@ -345,7 +345,7 @@ def _sqrtg_B(params, transforms, profiles, data, **kwargs):
N_booz="int: Maximum toroidal mode number for Boozer harmonics. Default 2*eq.N",
)
def _B_mn(params, transforms, profiles, data, **kwargs):
norm = 2 ** (3 - jnp.sum((transforms["B"].basis.modes == 0), axis=1))
norm = 2 ** (3 - jnp.sum(transforms["B"].basis.modes == 0, axis=1))
grid = transforms["grid"]

def fun(rho, theta_B, zeta_B, sqrtg_B, B):
Expand Down
18 changes: 14 additions & 4 deletions desc/equilibrium/equilibrium.py
Original file line number Diff line number Diff line change
Expand Up @@ -982,7 +982,6 @@ def need_src(name):
# Warn if best way to compute accurately is increasing resolution.
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adjusted logic to be more self-consistent. Will raise all warnings raised previously and covers some additional cases.

for dep in deps:
req = data_index[p][dep]["resolution_requirement"]
coords = data_index[p][dep]["coordinates"]
msg = lambda direction: (
f"Dependency {dep} may require more {direction}"
" resolution to compute accurately."
Expand All @@ -991,23 +990,34 @@ def need_src(name):
# if need more radial resolution
"r" in req and grid.L < self.L_grid
# and won't override grid to one with more radial resolution
and not (override_grid and coords in {"z", ""}),
and not (
override_grid and (is_1dz_tor_grid(dep) or is_0d_vol_grid(dep))
),
ResolutionWarning,
msg("radial") + f" got L_grid={grid.L} < {self._L_grid}.",
)
warnif(
# if need more poloidal resolution
"t" in req and grid.M < self.M_grid
# and won't override grid to one with more poloidal resolution
and not (override_grid and coords in {"r", "z", ""}),
and not (
override_grid
and (
is_1dr_rad_grid(dep)
or is_1dz_tor_grid(dep)
or is_0d_vol_grid(dep)
)
),
ResolutionWarning,
msg("poloidal") + f" got M_grid={grid.M} < {self._M_grid}.",
)
warnif(
# if need more toroidal resolution
"z" in req and grid.N < self.N_grid
# and won't override grid to one with more toroidal resolution
and not (override_grid and coords in {"r", ""}),
and not (
override_grid and (is_1dr_rad_grid(dep) or is_0d_vol_grid(dep))
),
ResolutionWarning,
msg("toroidal") + f" got N_grid={grid.N} < {self._N_grid}.",
)
Expand Down
36 changes: 25 additions & 11 deletions desc/grid.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,19 +66,19 @@ def _set_up(self):
del self._unique_theta_idx

def _enforce_symmetry(self):
"""Enforce stellarator symmetry.
"""Remove unnecessary nodes assuming poloidal symmetry.

1. Remove nodes with theta > pi.
2. Rescale theta spacing to preserve dtheta weight.
Need to rescale on each theta coordinate curve by a different factor.
dtheta should = 2π / number of nodes remaining on that theta curve.
Nodes on the symmetry line should not be rescaled.
1. Remove nodes with θ > π.
2. Rescale θ spacing to preserve weight.
Need to rescale on each θ coordinate curve by a different factor.
= 2π / number of nodes remaining on that θ curve.
Nodes on the symmetry line should not be rescaled.

"""
if not self.sym:
return
# indices where poloidal coordinate is off the symmetry line of
# poloidal coord=0 or pi
# poloidal coord=0 or π
off_sym_line_idx = self.nodes[:, 1] % np.pi != 0
__, inverse, off_sym_line_per_rho_surf_count = np.unique(
self.nodes[off_sym_line_idx, 0], return_inverse=True, return_counts=True
Expand Down Expand Up @@ -109,7 +109,7 @@ def _enforce_symmetry(self):
# The first two assumptions let _per_poloidal_curve = _per_rho_surf.
# The third assumption lets the scale factor be constant over a
# particular theta curve, so that each node in the open interval
# (0, pi) has its spacing scaled up by the same factor.
# (0, π) has its spacing scaled up by the same factor.
# Nodes at endpoints 0, π should not be scaled.
scale = off_sym_line_per_rho_surf_count / (
off_sym_line_per_rho_surf_count - to_delete_per_rho_surf_count
Expand Down Expand Up @@ -218,7 +218,13 @@ def NFP(self):

@property
def sym(self):
"""bool: True for stellarator symmetry, False otherwise."""
"""bool: True for poloidal symmetry, False otherwise.

If true, the poloidal domain of this grid is [0, π] ⊂ [0, 2π).
Note that this is distinct from stellarator symmetry.
Still, when stellarator symmetry exists, flux surface integrals and
volume integrals are invariant to this truncation.
"""
return self.__dict__.setdefault("_sym", False)

@property
Expand Down Expand Up @@ -945,7 +951,11 @@ class LinearGrid(_Grid):
Change this only if your nodes are placed within one field period
or should be interpreted as spanning one field period.
sym : bool
True for stellarator symmetry, False otherwise (Default = False).
Whether to truncate the poloidal domain to [0, π] ⊂ [0, 2π).
Note that this is distinct from stellarator symmetry.
Still, when stellarator symmetry exists, flux surface integrals and
volume integrals are invariant to this truncation, so setting this flag
to true will reduce memory consumption. (Default = False).
axis : bool
True to include a point at rho=0 (default), False for rho[0] = rho[1]/2.
endpoint : bool
Expand Down Expand Up @@ -1401,7 +1411,11 @@ class ConcentricGrid(_Grid):
NFP : int
number of field periods (Default = 1)
sym : bool
True for stellarator symmetry, False otherwise (Default = False)
Whether to truncate the poloidal domain to [0, π] ⊂ [0, 2π).
Note that this is distinct from stellarator symmetry.
Still, when stellarator symmetry exists, flux surface integrals and
volume integrals are invariant to this truncation, so setting this flag
to true will reduce memory consumption. (Default = False).
axis : bool
True to include the magnetic axis, False otherwise (Default = False)
node_pattern : {``'cheb1'``, ``'cheb2'``, ``'jacobi'``, ``linear``}
Expand Down
9 changes: 4 additions & 5 deletions desc/integrals/bounce_integral.py
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ class Bounce2D(Bounce):
# However, the basis for the latter are trigonometric functions with
# irrational frequencies, courtesy of the irrational rotational transform.
# Globally convergent root-finding schemes for that basis (at fixed α) are
# not known. The denominator of a close rational could be absorbed into the
# not efficient. The denominator of a close rational could be absorbed into the
# coordinate ϕ, but this balloons the frequency, and hence degree of the series.
#
# Quadrature is chosen over Runge-Kutta methods of the form
Expand Down Expand Up @@ -1211,10 +1211,9 @@ def integrate(
as the indices that correspond to that field line.
data : dict[str, jnp.ndarray]
Shape (num rho, num alpha, num zeta).
Real scalar-valued periodic functions in (θ, ζ) ∈ [0, 2π) × [0, 2π/NFP)
evaluated on the ``grid`` supplied to construct this object.
Use the method ``Bounce1D.reshape`` to reshape the data into the
expected shape.
Real scalar-valued functions evaluated on the ``grid`` supplied to
construct this object. Use the method ``Bounce1D.reshape`` to
reshape the data into the expected shape.
names : str or list[str]
Names in ``data`` to interpolate. Default is all keys in ``data``.
points : tuple[jnp.ndarray]
Expand Down
2 changes: 2 additions & 0 deletions desc/objectives/_geometry.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ def build(self, use_jit=True, verbose=1):
M=eq.M * 2,
N=eq.N * 2,
NFP=eq.NFP,
sym=False,
)
else:
grid = self._grid
Expand Down Expand Up @@ -242,6 +243,7 @@ def build(self, use_jit=True, verbose=1):
M=eq.M * 2,
N=eq.N * 2,
NFP=eq.NFP,
sym=False,
)
else:
grid = self._grid
Expand Down
1 change: 0 additions & 1 deletion desc/objectives/_neoclassical.py
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,6 @@ def compute(self, params, constants=None):
Effective ripple as a function of the flux surface label.

"""
# TODO (#1094)
if constants is None:
constants = self.constants
eq = self.things[0]
Expand Down
3 changes: 3 additions & 0 deletions desc/objectives/_stability.py
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,9 @@ def build(self, eq=None, use_jit=True, verbose=1):
iota_profiles = get_profiles(self._iota_keys, obj=eq, grid=iota_grid)
iota_transforms = get_transforms(self._iota_keys, obj=eq, grid=iota_grid)

# TODO: Generalize balloning stabilty funs to multiple flux surfaces,
# include last closed flux surface requirement, and remove quadrature
# transforms.
# Separate grid to calculate the right length scale for normalization
len_grid = QuadratureGrid(L=eq.L, M=eq.M, N=eq.N, NFP=eq.NFP)

Expand Down
103 changes: 46 additions & 57 deletions desc/plotting.py
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These changes were made to pass the elongation test after relaxing the dependencies of a_major/a_minor to resolution_requirement=t from rt since we only need rho near the surface.

Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
from matplotlib import cycler, rcParams
from mpl_toolkits.axes_grid1 import make_axes_locatable
from pylatexenc.latex2text import LatexNodes2Text
from termcolor import colored

from desc.backend import sign
from desc.basis import fourier, zernike_radial_poly
Expand Down Expand Up @@ -187,15 +186,12 @@
return plt.gcf(), ax
else:
ax = np.atleast_1d(ax)
if isinstance(ax.flatten()[0], matplotlib.axes.Axes):
return plt.gcf(), ax
else:
raise TypeError(
colored(
"ax argument must be None or an axis instance or array of axes",
"red",
)
)
errorif(

Check warning on line 189 in desc/plotting.py

View check run for this annotation

Codecov / codecov/patch

desc/plotting.py#L189

Added line #L189 was not covered by tests
not isinstance(ax.flatten()[0], matplotlib.axes.Axes),
TypeError,
"ax argument must be None or an axis instance or array of axes",
)
return plt.gcf(), ax

Check warning on line 194 in desc/plotting.py

View check run for this annotation

Codecov / codecov/patch

desc/plotting.py#L194

Added line #L194 was not covered by tests


def _get_grid(**kwargs):
Expand Down Expand Up @@ -278,11 +274,10 @@

"""
parameterization = _parse_parameterization(eq)
if name not in data_index[parameterization]:
raise ValueError(
f"Unrecognized value '{name}' for "
+ f"parameterization {parameterization}."
)
errorif(

Check warning on line 277 in desc/plotting.py

View check run for this annotation

Codecov / codecov/patch

desc/plotting.py#L277

Added line #L277 was not covered by tests
name not in data_index[parameterization],
msg=f"Unrecognized value '{name}' for parameterization {parameterization}.",
)
assert component in [
None,
"R",
Expand All @@ -294,9 +289,7 @@

label = data_index[parameterization][name]["label"]

with warnings.catch_warnings():
warnings.simplefilter("ignore")
data = eq.compute(name, grid=grid)[name]
data = eq.compute(name, grid=grid)[name]

Check warning on line 292 in desc/plotting.py

View check run for this annotation

Codecov / codecov/patch

desc/plotting.py#L292

Added line #L292 was not covered by tests

if data_index[parameterization][name]["dim"] > 1:
if component is None:
Expand Down Expand Up @@ -520,47 +513,50 @@
grid_kwargs = {"L": default_L, "N": default_N, "NFP": NFP}
grid = _get_grid(**grid_kwargs)
plot_axes = _get_plot_axes(grid)

data, ylabel = _compute(

Check warning on line 517 in desc/plotting.py

View check run for this annotation

Codecov / codecov/patch

desc/plotting.py#L517

Added line #L517 was not covered by tests
eq, name, grid, kwargs.pop("component", None), reshape=False
)

# reshape data to 1D
if len(plot_axes) != 1:
return ValueError(colored("Grid must be 1D", "red"))
surface_label = {"r": "rho", "t": "theta", "z": "zeta"}.get(

Check warning on line 523 in desc/plotting.py

View check run for this annotation

Codecov / codecov/patch

desc/plotting.py#L523

Added line #L523 was not covered by tests
data_index[parameterization][name]["coordinates"], None
)
axis = {"r": 0, "t": 1, "z": 2}.get(

Check warning on line 526 in desc/plotting.py

View check run for this annotation

Codecov / codecov/patch

desc/plotting.py#L526

Added line #L526 was not covered by tests
data_index[parameterization][name]["coordinates"], None
)
errorif(

Check warning on line 529 in desc/plotting.py

View check run for this annotation

Codecov / codecov/patch

desc/plotting.py#L529

Added line #L529 was not covered by tests
surface_label is None or axis is None,
NotImplementedError,
msg="Grid must be 1D",
)
data = grid.compress(data, surface_label=surface_label)
nodes = grid.compress(grid.nodes[:, axis], surface_label=surface_label)

Check warning on line 535 in desc/plotting.py

View check run for this annotation

Codecov / codecov/patch

desc/plotting.py#L534-L535

Added lines #L534 - L535 were not covered by tests
else:
axis = plot_axes[0]
data = data.ravel()
nodes = grid.nodes[:, axis]

Check warning on line 539 in desc/plotting.py

View check run for this annotation

Codecov / codecov/patch

desc/plotting.py#L537-L539

Added lines #L537 - L539 were not covered by tests

data, ylabel = _compute(eq, name, grid, kwargs.pop("component", None))
label = kwargs.pop("label", None)

fig, ax = _format_ax(ax, figsize=kwargs.pop("figsize", None))

# reshape data to 1D
data = data.flatten()
linecolor = kwargs.pop("linecolor", colorblind_colors[0])
ls = kwargs.pop("ls", "-")
lw = kwargs.pop("lw", 1)
if log:
data = np.abs(data) # ensure data is positive for log plot
ax.semilogy(
grid.nodes[:, plot_axes[0]],
data,
label=label,
color=linecolor,
ls=ls,
lw=lw,
)
ax.semilogy(nodes, data, label=label, color=linecolor, ls=ls, lw=lw)

Check warning on line 548 in desc/plotting.py

View check run for this annotation

Codecov / codecov/patch

desc/plotting.py#L548

Added line #L548 was not covered by tests
else:
ax.plot(
grid.nodes[:, plot_axes[0]],
data,
label=label,
color=linecolor,
ls=ls,
lw=lw,
)
ax.plot(nodes, data, label=label, color=linecolor, ls=ls, lw=lw)

Check warning on line 550 in desc/plotting.py

View check run for this annotation

Codecov / codecov/patch

desc/plotting.py#L550

Added line #L550 was not covered by tests
xlabel_fontsize = kwargs.pop("xlabel_fontsize", None)
ylabel_fontsize = kwargs.pop("ylabel_fontsize", None)

assert len(kwargs) == 0, f"plot_1d got unexpected keyword argument: {kwargs.keys()}"
xlabel = _AXIS_LABELS_RTZ[plot_axes[0]]
xlabel = _AXIS_LABELS_RTZ[axis]

Check warning on line 555 in desc/plotting.py

View check run for this annotation

Codecov / codecov/patch

desc/plotting.py#L555

Added line #L555 was not covered by tests
ax.set_xlabel(xlabel, fontsize=xlabel_fontsize)
ax.set_ylabel(ylabel, fontsize=ylabel_fontsize)
_set_tight_layout(fig)
plot_data = {xlabel.strip("$").strip("\\"): grid.nodes[:, plot_axes[0]], name: data}
plot_data = {xlabel.strip("$").strip("\\"): nodes, name: data}

Check warning on line 559 in desc/plotting.py

View check run for this annotation

Codecov / codecov/patch

desc/plotting.py#L559

Added line #L559 was not covered by tests

if label is not None:
ax.legend()
Expand Down Expand Up @@ -641,8 +637,7 @@
grid_kwargs = {"M": 33, "N": 33, "NFP": eq.NFP, "axis": False}
grid = _get_grid(**grid_kwargs)
plot_axes = _get_plot_axes(grid)
if len(plot_axes) != 2:
return ValueError(colored("Grid must be 2D", "red"))
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(should be raising not returning error)

errorif(len(plot_axes) != 2, msg="Grid must be 2D")

Check warning on line 640 in desc/plotting.py

View check run for this annotation

Codecov / codecov/patch

desc/plotting.py#L640

Added line #L640 was not covered by tests
component = kwargs.pop("component", None)
if name != "B*n":
data, label = _compute(
Expand All @@ -655,14 +650,12 @@
field = kwargs.pop("field", None)
errorif(
field is None,
ValueError,
"If B*n is entered as the variable to plot, a magnetic field"
msg="If B*n is entered as the variable to plot, a magnetic field"
" must be provided.",
)
errorif(
not np.all(np.isclose(grid.nodes[:, 0], 1)),
ValueError,
"If B*n is entered as the variable to plot, "
msg="If B*n is entered as the variable to plot, "
"the grid nodes must be at rho=1.",
)

Expand Down Expand Up @@ -947,14 +940,12 @@
field = kwargs.pop("field", None)
errorif(
field is None,
ValueError,
"If B*n is entered as the variable to plot, a magnetic field"
msg="If B*n is entered as the variable to plot, a magnetic field"
" must be provided.",
)
errorif(
not np.all(np.isclose(grid.nodes[:, 0], 1)),
ValueError,
"If B*n is entered as the variable to plot, "
msg="If B*n is entered as the variable to plot, "
"the grid nodes must be at rho=1.",
)

Expand Down Expand Up @@ -985,8 +976,7 @@

errorif(
len(kwargs) != 0,
ValueError,
f"plot_3d got unexpected keyword argument: {kwargs.keys()}",
msg=f"plot_3d got unexpected keyword argument: {kwargs.keys()}",
)
with warnings.catch_warnings():
warnings.simplefilter("ignore")
Expand Down Expand Up @@ -2497,8 +2487,7 @@
showaxislabels = kwargs.pop("showaxislabels", True)
errorif(
len(kwargs) != 0,
ValueError,
f"plot_coils got unexpected keyword argument: {kwargs.keys()}",
msg=f"plot_coils got unexpected keyword argument: {kwargs.keys()}",
)
errorif(
not isinstance(coils, _Coil),
Expand Down Expand Up @@ -2925,7 +2914,7 @@
iota = grid_compute.compress(data["iota"])
else: # OmnigenousField
iota = kwargs.pop("iota", None)
errorif(iota is None, ValueError, "iota must be supplied for OmnigenousField")
errorif(iota is None, msg="iota must be supplied for OmnigenousField")

Check warning on line 2917 in desc/plotting.py

View check run for this annotation

Codecov / codecov/patch

desc/plotting.py#L2917

Added line #L2917 was not covered by tests
with warnings.catch_warnings():
warnings.simplefilter("ignore")
data = thing.compute(
Expand Down
Loading
Loading