diff --git a/desc/coils.py b/desc/coils.py index f184365918..d8a84bbe1a 100644 --- a/desc/coils.py +++ b/desc/coils.py @@ -1,7 +1,7 @@ """Classes for magnetic field coils.""" import numbers -from abc import ABC +from abc import ABC, abstractmethod from collections.abc import MutableSequence import numpy as np @@ -16,10 +16,12 @@ tree_unstack, vmap, ) +from desc.basis import FourierSeries from desc.compute import get_params, rpz2xyz, rpz2xyz_vec, xyz2rpz, xyz2rpz_vec from desc.compute.geom_utils import reflection_matrix from desc.compute.utils import _compute as compute_fun from desc.compute.utils import safenorm +from desc.compute.utils import dot from desc.geometry import ( FourierPlanarCurve, FourierRZCurve, @@ -29,7 +31,7 @@ from desc.grid import LinearGrid from desc.magnetic_fields import _MagneticField from desc.optimizable import Optimizable, OptimizableCollection, optimizable_parameter -from desc.utils import equals, errorif, flatten_list, warnif +from desc.utils import copy_coeffs, equals, errorif, flatten_list, warnif @jit @@ -123,6 +125,172 @@ def biot_savart_quad(eval_pts, coil_pts, tangents, current): return B +@jit +def finite_build_regularization_rect(a, b): + """Computes the regularization term for a rectangular finite-build coil. + + The regularization term is used in the denominator of the regularized Biot-Savart + integral for the finite-build coil. This term ensures that the singularity at the coil + filament centerline is integrated correctly. The finite-build self-field is computed by + the procedure outlined in [1]. + + Parameters + ---------- + a : float + Coil cross section dimension 1 (Order does not matter) + b : float + Coil cross section dimension 2 + + Returns + ------- + float + Regularization term for the finite build Biot Savart denominator + + [1] Landreman et. al, "Efficient calculation of self magnetic field, self-force, + and self-inductance for electromagnetic coils. II. Rectangular cross-section" (2023) + """ + + k = -(a**4 - 6 * a**2 * b**2 + b**4) / (6 * a**2 * b**2) * jnp.log(a / b + b / a) + +b * b / (6 * a * a) * jnp.log(b / a) + +a * a / (6 * b * b) * jnp.log(a / b) + +(4.0 * b) / (3 * a) * jnp.arctan(a / b) + +(4.0 * a) / (3 * b) * jnp.arctan(b / a) + + delta = jnp.exp(-(25.0 / 6) + k) + + return a * b * delta + + +@jit +def biot_savart_quad_regularized(eval_pts, coil_pts, tangents, current, regularization): + """Regularized Biot-Savart law for filamentary coil using numerical quadrature. + + Parameters + ---------- + eval_pts : array-like shape(n,3) + Evaluation points in cartesian coordinates + coil_pts : array-like shape(m,3) + Points in cartesian space defining coil + tangents : array-like, shape(m,3) + Tangent vectors to the coil at coil_pts. If the curve is given + by x(s) with curve parameter s, coil_pts = x, tangents = dx/ds*ds where + ds is the spacing between points. + current : float + Current through the coil (in Amps). + regularization : float + Regularization term for the Biot Savart denominator + + Returns + ------- + B : ndarray, shape(n,3) + magnetic field in cartesian components at specified points + """ + + dl = tangents + R_vec = eval_pts[jnp.newaxis, :] - coil_pts[:, jnp.newaxis, :] + R_mag = jnp.linalg.norm(R_vec, axis=-1) + + vec = jnp.cross(dl[:, jnp.newaxis, :], R_vec, axis=-1) + denom = (R_mag**2 + regularization) ** (3 / 2) + + # 1e-7 == mu_0/(4 pi) + B = jnp.sum(1.0e-7 * current * vec / denom[:, :, None], axis=0) + return B + + +@jit +def biot_savart_quad_regularized_singularity_sub( + ds, + eval_pts, + coil_pts, + eval_angles, + coil_angles, + eval_prime, + coil_prime, + eval_prime_prime, + curvatures, + binormals, + current, + regularization, +): + """Regularized Biot-Savart law for filamentary coil using numerical quadrature. + Uses singularity subtraction method for coils outlined in [1]. Requires that the + evaluation points are on the coil centerline -- usually this means that eval_points = coil_points + and eval_angles = coil_angles, etc. + + Parameters + ---------- + ds : array-like shape(m,) + Spacing between points in the coil discretization + eval_pts : array-like shape(n,3) + Evaluation points in cartesian coordinates + coil_pts : array-like shape(m,3) + Points in cartesian space defining coil + eval_angles : array-like shape(n,) + Angles of the evaluation points (curve parameter s), in radians with a periodicity of 2*pi + coil_angles : array-like shape(m,) + Angles of the coil points (curve parameter s), in radians with a periodicity of 2*pi + eval_prime : array-like shape(n,3) + Derivative of the evaluation points with respect to the curve parameter, dx/ds for curve x(s) + coil_prime : array-like shape(m,3) + Derivative of the coil points with respect to the curve parameter, dx/ds for curve x(s) + eval_prime_prime : array-like shape(n,3) + Second derivative of the evaluation points with respect to the curve parameter, d^2x/ds^2 for curve x(s) + curvatures : array-like shape(n,) + Curvature of the coil centerline at the evaluation points + binormals : array-like shape(n,3) + Frenet-Serret binormal vectors at the evaluation points + current : float + Current through the coil (in Amps). + regularization : float + Regularization term for the Biot Savart denominator + + Returns + ------- + B : ndarray, shape(n,3) + magnetic field in cartesian components at specified points + + [1] Landreman et. al, "Efficient calculation of self magnetic field, self-force, + and self-inductance for electromagnetic coils. II. Rectangular cross-section" (2023) + """ + + R_vec = eval_pts[jnp.newaxis, :] - coil_pts[:, jnp.newaxis, :] + R_mag = safenorm(R_vec, axis=-1) #used because of potential singularity at R=0 if eval and coil points are the same + ds = ds[:, jnp.newaxis] + + vec = jnp.cross(coil_prime[:, jnp.newaxis, :], R_vec, axis=-1) + denom = (R_mag**2 + regularization) ** (3 / 2) / ds + + phi_diff = coil_angles[:, jnp.newaxis] - eval_angles[jnp.newaxis, :] + + eval_prime_squared = safenorm(eval_prime, axis=-1) ** 2 + + vec2 = ( + -jnp.cross(eval_prime, eval_prime_prime, axis=-1)[jnp.newaxis, :, :] + * (1 - jnp.cos(phi_diff))[:, :, jnp.newaxis] + ) + denom2 = ( + (2 - 2 * jnp.cos(phi_diff)) * eval_prime_squared[jnp.newaxis, :] + + regularization + ) ** (3 / 2) / ds + + B = jnp.sum( + vec / denom[:, :, jnp.newaxis] + vec2 / denom2[:, :, jnp.newaxis], axis=0 + ) + + B += ( + 0.5 + * curvatures[:, jnp.newaxis] + * binormals + * (-2 + jnp.log(64 * eval_prime_squared / regularization))[:, jnp.newaxis] + ) + + # 1e-7 == mu_0/(4 pi) + B = 1.0e-7 * current * B + + return B + + class _Coil(_MagneticField, Optimizable, ABC): """Base class representing a magnetic field coil. @@ -920,6 +1088,7 @@ def _check_type(coil0, coil): FourierXYZCoil: ["X_basis", "Y_basis", "Z_basis"], FourierPlanarCoil: ["r_basis"], SplineXYZCoil: ["method", "N", "knots"], + FourierPlanarFiniteBuildCoil: ["r_basis"], } for attr in attrs[coil0.__class__]: @@ -936,6 +1105,395 @@ def _check_type(coil0, coil): ) +class _FramedCoil(_Coil, Optimizable, ABC): + """Base class representing a magnetic field coil with a frame representing winding angle. + + Parameters + ---------- + alpha_n : array-like + Fourier coefficients for the winding angle alpha as a function of toroidal angle phi. + modes : array-like + Mode numbers associated with alpha_n. If not given defaults to [-n:n]. + """ + + _io_attrs_ = _Coil._io_attrs_ + ["_alpha_n", "_alpha_basis"] + + def __init__(self, alpha_n=[0, 0, 0], modes=None, *args, **kwargs): + + alpha_n = np.atleast_1d(alpha_n) + if modes is None: + modes = np.arange(-(alpha_n.size // 2), alpha_n.size // 2 + 1) + else: + modes = np.asarray(modes) + + assert issubclass(modes.dtype.type, np.integer) + + assert alpha_n.size == modes.size, "alpha_n and modes must be the same size" + + N = np.max(abs(modes)) + self._alpha_basis = FourierSeries(N, NFP=1, sym=False) + self._alpha_n = copy_coeffs(alpha_n, modes, self.alpha_basis.modes[:, 2]) + + super().__init__(*args, **kwargs) + + @optimizable_parameter + @property + def alpha_n(self): + """ndarray: Twist angle of the coil, represented as a fourier series.""" + return self._alpha_n + + @alpha_n.setter + def alpha_n(self, new): + if len(new) == self.alpha_basis.num_modes: + self._alpha_n = jnp.asarray(new) + else: + raise ValueError( + f"alpha_n should have the same size as the basis, got {len(new)} for " + + f"basis with {self.alpha_basis.num_modes} modes." + ) + + @property + def alpha_basis(self): + """Spectral basis for alpha Fourier series.""" + return self._alpha_basis + + @property + def alpha_N(self): + """Maximum mode number.""" + return max(self._alpha_basis.N) + + +class _FiniteBuildCoil(_FramedCoil, Optimizable, ABC): + """Base class representing a magnetic field coil with finite build dimensions. Implements the compute_self_field method. + + Subclasses should inherit from this class as well as a subclass of Coil. + + Parameters + ---------- + cross_section_dims : array-like + Dimensions of the coil cross section, with 1 or 2 dimensions depending on the cross section shape (circular or rectangular).\ + For circular cross sections, this should be a single value representing the radius.\ + For rectangular cross sections, this should be a 2-element array representing the dimensions in the p and q directions, respectively.\ + Refer to figure 3 in https://arxiv.org/pdf/2310.12087 for the p and q directions. + + cross_section_shape : str + Shape of the coil cross section, either 'circular' or 'rectangular'. + """ + + _io_attrs_ = ( + _FramedCoil._io_attrs_ + ["_cross_section_shape"] + ["_cross_section_dims"] + ) + + def __init__(self, cross_section_dims, cross_section_shape, *args, **kwargs): + if cross_section_shape == "circular": + assert ( + len(cross_section_dims) == 1 + ), "Circular cross section coils can only have one radius dimension" + elif cross_section_shape == "rectangular": + assert ( + len(cross_section_dims) == 2 + ), "Rectangular cross section coils can only have exactly two dimensions" + else: + raise ValueError( + "cross_section_shape must be 'circular' or 'rectangular', got " + f"{cross_section_shape}" + ) + self._cross_section_shape = cross_section_shape + self._cross_section_dims = cross_section_dims + super().__init__(*args, **kwargs) + + @optimizable_parameter + @property + def cross_section_dims(self): + """ndarray: Geometry of the coil, with 1 or 2 cross section dimensions depending on shape.""" + return self._cross_section_dims + + @cross_section_dims.setter + def cross_section_dims(self, new): + if self._cross_section_shape == "circular": + assert ( + len(new) == 1 + ), "Circular cross section coils can only have one radius dimension" + elif self._cross_section_shape == "rectangular": + assert ( + len(new) == 2 + ), "Rectangular cross section coils can only have exactly two dimensions" + self._cross_section_dims = new + + @property + def cross_section_shape(self): + """str: Shape of the coil cross section, either 'circular' or 'rectangular'.""" + return self._cross_section_shape + + def compute_self_field( + self, xsection_grid, centerline_grid=None, coil_frame=False, params=None + ): + """Compute the magnetic field from the coil on the coil itself, with a rectangular cross section. + A mask is returned to indicate which points are on the coil centerline, to allow for separate handling of the field on the centerline. + + Parameters + ---------- + xsection_grid : LinearGrid, int or None + Grid used to evaluate the field on the coil cross section. If an integer, uses that many equally spaced points in each dimension of the cross section. + If provided, must be a 2D grid with L and M dimensions corresponding to the cross section spacing desired with endpoint = True. + centerline_grid : LinearGrid or int, optional + Grid used to evaluate the coil centerline. If an integer, uses 2x that many equally spaced points in each dimension. + If provided, must be a 1D grid with N dimension corresponding to the centerline spacing desired. + coil_frame : bool, optional + Whether to compute the field in the t, p ,q coil frame. Default is False, which computes the field in the lab frame. + params : dict, optional + Parameters to pass to the coil object. + + Returns + ------- + field : ndarray, shape(n,3) + magnetic field at specified points, at a combination of the coil centerline and cross section grids. + positions : ndarray, shape(n,3) + positions of the field points in the lab frame, currently in X,Y,Z coordinates. + centerline_mask : ndarray, shape(n,) + boolean mask indicating whether the field point is on the coil centerline or not. + """ + + if self.cross_section_shape == "circular": + return self.compute_self_field_circ( + xsection_grid, centerline_grid, coil_frame, params + ) + if self.cross_section_shape == "rectangular": + return self.compute_self_field_rect( + xsection_grid, centerline_grid, coil_frame, params + ) + + def compute_self_field_rect( + self, xsection_grid, centerline_grid=None, coil_frame=False, params=None + ): + """ + # Compute the magnetic field from the coil on the coil itself, with a rectangular cross section. + #""" + + if params is None: + current = self.current + cross_section_dims = self.cross_section_dims + else: + current = params.get("current", self.current) + cross_section_dims = params.get( + "cross_section_dims", self.cross_section_dims + ) + + # set cross section grid if not provided for u,v cross sectional coordinates + # L has a doubled grid size to be consistent with how M and N work + if xsection_grid is None: + xsection_grid = LinearGrid(L=4, M=2, endpoint=True) + elif isinstance(xsection_grid, numbers.Integral): + xsection_grid = LinearGrid( + L=xsection_grid * 2, M=xsection_grid, endpoint=True + ) + elif isinstance(xsection_grid, LinearGrid) and not xsection_grid.endpoint: + raise ValueError( + "The cross section grid must have endpoint=True to compute the self field" + ) + else: + xsection_grid = ( + xsection_grid.copy() + ) # is this memory efficient? Don't want to mutate the input grid + + # set centerline grid if not provided for phi cross sectional coordinates + if centerline_grid is None: + centerline_grid = LinearGrid(N=50) + elif isinstance(centerline_grid, numbers.Integral): + centerline_grid = LinearGrid(N=centerline_grid) + + # validate the grid dimensions + if xsection_grid.N != 1: + raise ValueError("The cross section grid must have dimension N=1") + if centerline_grid.L != 1 or centerline_grid.M != 1: + raise ValueError("The centerline grid must have dimension L=1 and M=1") + + # expand the xsection grid to include the centerline grid dimensions + L = xsection_grid.L + M = xsection_grid.M + N = centerline_grid.N + xsection_grid.change_resolution(L, M, N) + + abdelta = finite_build_regularization_rect( + cross_section_dims[0], cross_section_dims[1] + ) + + # B_b and B_reg are only computed on the centerline + B_b_fb = self.compute("B_b_fb", grid=centerline_grid, params=params)["B_b_fb"] + + # compute regularized self field integral + data = self.compute( + ["x", "x_s", "x_ss", "ds", "s", "curvature", "frenet_binormal"], + grid=centerline_grid, + params=params, + basis="xyz", + ) + B_reg_fb = biot_savart_quad_regularized_singularity_sub( + data["ds"], + data["x"], + data["x"], + data["s"], + data["s"], + data["x_s"], + data["x_s"], + data["x_ss"], + data["curvature"], + data["frenet_binormal"], + current, + abdelta, + ) + + # get vector series along the coil centerlines + p_frame = self.compute("p_frame", grid=centerline_grid, params=params)[ + "p_frame" + ] + q_frame = self.compute("q_frame", grid=centerline_grid, params=params)[ + "q_frame" + ] + + # also need curvature parameters + curv1_frame = self.compute("curv1_frame", grid=centerline_grid, params=params)[ + "curv1_frame" + ] + curv2_frame = self.compute("curv2_frame", grid=centerline_grid, params=params)[ + "curv2_frame" + ] + + # expand the vector series to include the cross section dimensions + p_frame = xsection_grid.expand(p_frame, "zeta") + q_frame = xsection_grid.expand(q_frame, "zeta") + curv1_frame = xsection_grid.expand(curv1_frame, "zeta") + curv2_frame = xsection_grid.expand(curv2_frame, "zeta") + x_centerline = xsection_grid.expand( + data["x"], "zeta" + ) # needed to get lab frame coordinates of the coil points + B_b_fb = xsection_grid.expand(B_b_fb, "zeta") + B_reg_fb = xsection_grid.expand(B_reg_fb, "zeta") + + # pack the parameters for the self field computation + B_fb_params = { + "p_frame": p_frame, + "q_frame": q_frame, + "current": current, + "cross_section_dims": cross_section_dims, + "curv1_frame": curv1_frame, + "curv2_frame": curv2_frame, + "x_centerline": x_centerline, + } + B_fb_params = params | B_fb_params if params is not None else B_fb_params + + B_0_fb = compute_fun( + self, + "B_0_fb", + transforms={"grid": xsection_grid}, + params=B_fb_params, + profiles={}, + )["B_0_fb"] + B_kappa_fb = compute_fun( + self, + "B_kappa_fb", + transforms={"grid": xsection_grid}, + params=B_fb_params, + profiles={}, + )["B_kappa_fb"] + + B_self = B_0_fb + B_kappa_fb + B_b_fb + B_reg_fb + + # get position of field measurement points in lab frame + x_fb = compute_fun( + self, + "x_fb", + transforms={"grid": xsection_grid}, + params=B_fb_params, + profiles={}, + )["x_fb"] + + if coil_frame: # reproject the field to the t,p,q frame + t_frame = self.compute( + "centroid_tangent", grid=centerline_grid, params=params + )["centroid_tangent"] + t_frame = xsection_grid.expand(t_frame, "zeta") + + B_t = dot(B_self, t_frame) + B_p = dot(B_self, p_frame) + B_q = dot(B_self, q_frame) + B_self = jnp.stack((B_t, B_p, B_q), axis=-1) + + # find mask for the grid axis to prevent downstream singularities with biot savart + centerline_mask = jnp.zeros(len(xsection_grid.nodes), dtype=bool) + centerline_mask = centerline_mask.at[(L + 1) * (2 * M + 1) // 2 :: (L + 1) * (2 * M + 1)].set(True) + + return B_self, x_fb, centerline_mask + + def compute_self_field_circ( + self, xsection_grid, centerline_grid=None, coil_frame=False, params=None + ): + return NotImplementedError( + "Circular cross section self field not implemented yet" + ) + + +class FourierPlanarFiniteBuildCoil(_FiniteBuildCoil, FourierPlanarCoil): + """Coil that lies in a plane, with a finite cross section. + + Refer to FourierPlanarCoil for a description of the parameterization for the planar coil centerline. + In the case of rectangular cross sections, the coil cross section is assumed to remain aligned + with respect to the coil plane. The first dimension of the rectangular cross section is within the coil plane, + and the second dimension is in the coil plane normal direction. No twist angle is assumed for this coil. + + Parameters + ---------- + cross_section_dims : array-like + Dimensions of the coil cross section, with 1 or 2 dimensions depending on the cross section shape (circular or rectangular). + cross_section_shape : str + Shape of the coil cross section, either 'circular' or 'rectangular'. + current : float + Current through the coil, in Amperes. + center : array-like, shape(3,) + Coordinates of center of curve, in system determined by basis. + normal : array-like, shape(3,) + Components of normal vector to planar surface, in system determined by basis. + r_n : array-like + Fourier coefficients for radius from center as function of polar angle + modes : array-like + mode numbers associated with r_n + basis : {'xyz', 'rpz'} + Coordinate system for center and normal vectors. Default = 'xyz'. + name : str + Name for this coil. + """ + + _io_attrs_ = _FiniteBuildCoil._io_attrs_ + FourierPlanarCoil._io_attrs_ + + def __init__( + self, + cross_section_dims=[0.1], + cross_section_shape="circular", + current=1, + center=[10, 0, 0], + normal=[0, 1, 0], + r_n=2, + modes=None, + basis="xyz", + name="", + ): + alpha_n = [0, 0, 0] # by default, this coil has no twist + alpha_modes = None + super().__init__( + cross_section_dims, + cross_section_shape, + alpha_n, + alpha_modes, + current, + center, + normal, + r_n, + modes, + basis, + name, + ) + + class CoilSet(OptimizableCollection, _Coil, MutableSequence): """Set of coils of different geometry but shared parameterization and resolution. diff --git a/desc/compute/_curve.py b/desc/compute/_curve.py index 818da18092..d22b8119a3 100644 --- a/desc/compute/_curve.py +++ b/desc/compute/_curve.py @@ -1028,3 +1028,72 @@ def _length_SplineXYZCurve(params, transforms, profiles, data, **kwargs): # but also works if grid.endpoint is False data["length"] = jnp.sum(T * data["ds"]) return data + + +@register_compute_fun( + name="centroid_tangent", + label="\\mathbf{T}_{\\mathrm{Centroid}}", + units="~", + units_long="None", + description="Tangent unit vector to curve in centroid frame (see Singh et al. 2020, section 3.1)", + dim=3, + params=[], + transforms={}, + profiles=[], + coordinates="s", + data=["x_s"], + parameterization="desc.geometry.core.Curve", +) +def _centroid_tangent(params, transforms, profiles, data, **kwargs): + # this is defined identically to the Frenet-Serret tangent + data["centroid_tangent"] = ( + data["x_s"] / jnp.linalg.norm(data["x_s"], axis=-1)[:, None] + ) + return data + + +@register_compute_fun( + name="centroid_normal", + label="\\mathbf{N}_{\\mathrm{Centroid}}", + units="~", + units_long="None", + description="Normal unit vector to curve in centroid frame (see Singh et al. 2020, section 3.1)", + dim=3, + params=[], + transforms={}, + profiles=[], + coordinates="s", + data=["x", "center", "centroid_tangent"], + parameterization="desc.geometry.core.Curve", +) +def _centroid_normal(params, transforms, profiles, data, **kwargs): + delta = data["x"] - data["center"] # do I need to convert this to xyz? + delta_orth = ( + delta - dot(delta, data["centroid_tangent"])[:, None] * data["centroid_tangent"] + ) + delta_orth = delta_orth / jnp.linalg.norm(delta_orth, axis=-1)[:, None] + data["centroid_normal"] = delta_orth + + return data + + +@register_compute_fun( + name="centroid_binormal", + label="\\mathbf{B}_{\\mathrm{Centroid}}", + units="~", + units_long="None", + description="Binormal unit vector to curve in centroid frame (see Singh et al. 2020, section 3.1)", + dim=3, + params=[], + transforms={}, + profiles=[], + coordinates="s", + data=["centroid_tangent", "centroid_normal"], + parameterization="desc.geometry.core.Curve", +) +def _centroid_binormal(params, transforms, profiles, data, **kwargs): + data["centroid_binormal"] = cross( + data["centroid_tangent"], data["centroid_normal"] + ) # TODO: figure out if rotation is necessary for these unit vecs + + return data diff --git a/desc/compute/_field.py b/desc/compute/_field.py index eef1354e3d..26282f51a7 100644 --- a/desc/compute/_field.py +++ b/desc/compute/_field.py @@ -3516,3 +3516,323 @@ def _L_grad_B(params, transforms, profiles, data, **kwargs): def _K_vc(params, transforms, profiles, data, **kwargs): data["K_vc"] = cross(data["n_rho"], data["B"]) / mu_0 return data + + +@register_compute_fun( + name="p_frame", + label="\\mathbf{p}_{\\mathrm{Frame}}", + units="~", + units_long="None", + description="P unit vector for framed coil with arbitrary rotation fourier series", + dim=3, + params=["alpha_n"], + transforms={"alpha": [[0, 0, 0]]}, + profiles=[], + coordinates="s", + data=["centroid_normal", "centroid_binormal"], + parameterization="desc.coils._FramedCoil", +) +def _p_frame(params, transforms, profiles, data, **kwargs): + alpha = transforms["alpha"].transform( + params["alpha_n"], dz=0 + ) # TODO: check if this is right + + p_frame = ( + data["centroid_normal"] * jnp.cos(alpha)[:, jnp.newaxis] + + data["centroid_binormal"] * jnp.sin(alpha)[:, jnp.newaxis] + ) + + data["p_frame"] = p_frame + return data + + +@register_compute_fun( + name="q_frame", + label="\\mathbf{q}_{\\mathrm{Frame}}", + units="~", + units_long="None", + description="Q unit vector for framed coil with arbitrary rotation fourier series", + dim=3, + params=["alpha_n"], + transforms={"alpha": [[0, 0, 0]]}, + profiles=[], + coordinates="s", + data=["centroid_normal", "centroid_binormal"], + parameterization="desc.coils._FramedCoil", +) +def _q_frame(params, transforms, profiles, data, **kwargs): + alpha = transforms["alpha"].transform(params["alpha_n"], dz=0) + + q_frame = ( + -data["centroid_normal"] * jnp.sin(alpha)[:, jnp.newaxis] + + data["centroid_binormal"] * jnp.cos(alpha)[:, jnp.newaxis] + ) + + data["q_frame"] = q_frame + return data + + +@register_compute_fun( + name="curv1_frame", + label="\\kappa_{1}}_{\\mathrm{Frame}", + units="~", + units_long="None", + description="Curvature component in the p-vector direction for a rectangular cross section coil", + dim=1, + params=[], + transforms={}, + profiles=[], + coordinates="s", + data=["curvature", "frenet_normal", "p_frame"], + parameterization="desc.coils._FramedCoil", +) +def _curv1_frame(params, transforms, profiles, data, **kwargs): + data["curv1_frame"] = data["curvature"] * dot( + data["frenet_normal"], data["p_frame"] + ) + + return data + + +@register_compute_fun( + name="curv2_frame", + label="\\kappa_{2}}_{\\mathrm{Frame}", + units="~", + units_long="None", + description="Curvature component in the q-vector direction for a rectangular cross section coil", + dim=1, + params=[], + transforms={}, + profiles=[], + coordinates="s", + data=["curvature", "frenet_normal", "q_frame"], + parameterization="desc.coils._FramedCoil", +) +def _curv2_frame(params, transforms, profiles, data, **kwargs): + data["curv2_frame"] = data["curvature"] * dot( + data["frenet_normal"], data["q_frame"] + ) + + return data + + +@register_compute_fun( + name="u_fb", + label="u_{FB}", + units="", + units_long="", + description="U coordinate for finite build expansion", + dim=1, + params=[], + transforms={"grid": []}, + profiles=[], + coordinates="rt", # just two degrees of freedom + data=[], + parameterization="desc.coils._FiniteBuildCoil", +) +def _u_fb(params, transforms, profiles, data, **kwargs): + grid = transforms["grid"] + # TODO: check that grid is LinearGrid? + data["u_fb"] = ( + (grid.nodes[:, 0] - 0.5) / (0.5) * 0.999 + ) # rescale to [-0.999,0.999], as the finite build term is singular at the edge + return data + + +@register_compute_fun( + name="v_fb", + label="v_{FB}", + units="", + units_long="", + description="V coordinate for finite build expansion", + dim=1, + params=[], + transforms={"grid": []}, + profiles=[], + coordinates="rt", + data=[], + parameterization="desc.coils._FiniteBuildCoil", +) +def _v_fb(params, transforms, profiles, data, **kwargs): + grid = transforms["grid"] + # TODO: check that grid is LinearGrid? + data["v_fb"] = ( + (grid.nodes[:, 1] - jnp.pi) / (jnp.pi) * 0.999 + ) # rescale to [-0.999,0.999] + return data + + +@register_compute_fun( + name="B_0_fb", + label="B_{0,FB}", + units="T", + units_long="Tesla", + description="B_0 term in finite build expansion", + dim=3, + params=["p_frame", "q_frame", "current", "cross_section_dims"], + transforms={}, + profiles=[], + coordinates="rtz", + data=["u_fb", "v_fb"], + parameterization="desc.coils._FiniteBuildCoil", +) +def _B_0_fb(params, transforms, profiles, data, **kwargs): + # fed in externally + p_frame = params["p_frame"] + q_frame = params["q_frame"] + + # scalars + current = params["current"] + a = params["cross_section_dims"][0] + b = params["cross_section_dims"][1] + + # u and v are computed + u = data["u_fb"] + v = data["v_fb"] + + # add dimension to u and v to accomodate vectorized operations + u = u[:, jnp.newaxis] + v = v[:, jnp.newaxis] + + def G(x, y): + return y * jnp.arctan(x / y) + x / 2 * jnp.log(1 + (y / x) ** 2) + + data["B_0_fb"] = mu_0 * current/(4*jnp.pi*a*b) * ( (q_frame * G(b*(v+1), a*(u+1)) - p_frame * G(a*(u+1), b*(v+1))) + + (-1) * (q_frame * G(b*(v+1), a*(u-1)) - p_frame * G(a*(u-1), b*(v+1))) + + (-1) * (q_frame * G(b*(v-1), a*(u+1)) - p_frame * G(a*(u+1), b*(v-1))) + + (q_frame * G(b*(v-1), a*(u-1)) - p_frame * G(a*(u-1), b*(v-1)))) + + return data + + +@register_compute_fun( + name="B_kappa_fb", + label="B_{\\kappa,FB}", + units="T", + units_long="Tesla", + description="B_kappa term in finite build expansion", + dim=3, + params=[ + "p_frame", + "q_frame", + "current", + "cross_section_dims", + "curv1_frame", + "curv2_frame", + ], + transforms={}, + profiles=[], + coordinates="rtz", + data=["u_fb", "v_fb"], + parameterization="desc.coils._FiniteBuildCoil", +) +def _B_kappa_fb(params, transforms, profiles, data, **kwargs): + # fed in externally + p_frame = params["p_frame"] + q_frame = params["q_frame"] + curv1_frame = params["curv1_frame"] + curv2_frame = params["curv2_frame"] + + # scalars + current = params["current"] + a = params["cross_section_dims"][0] + b = params["cross_section_dims"][1] + + # u and v are computed + u = data["u_fb"] + v = data["v_fb"] + + # add dimension to scalars to accomodate vectorized operations + u = u[:, jnp.newaxis] + v = v[:, jnp.newaxis] + curv1_frame = curv1_frame[:, jnp.newaxis] + curv2_frame = curv2_frame[:, jnp.newaxis] + + def K(U,V): + return ((-2*U*V * (curv1_frame*q_frame-curv2_frame*p_frame) * jnp.log(a/b*U**2 + b/a*V**2) + + (curv2_frame*q_frame-curv1_frame*p_frame) * (a/b*U**2 + b/a*V**2) * jnp.log(a/b*U**2 + b/a*V**2) + + 4*a/b*curv2_frame*p_frame*U**2 * jnp.arctan(b*V/(a*U)) - + 4*b/a*curv1_frame*q_frame*V**2 * jnp.arctan(a*U/(b*V))) ) + + data["B_kappa_fb"] = mu_0 * current/(64*jnp.pi) * ( K(u+1, v+1) + K(u-1, v-1) + + (-1) * K(u-1, v+1) + (-1) * K(u+1, v-1)) + + return data + + +@register_compute_fun( + name="B_b_fb", + label="B_{b,FB}", + units="T", + units_long="Tesla", + description="B_b term in finite build expansion", + dim=3, + params=["current", "cross_section_dims"], + transforms={}, + profiles=[], + coordinates="r", + data=["curvature", "frenet_binormal"], + parameterization="desc.coils._FiniteBuildCoil", +) +def _B_b_fb(params, transforms, profiles, data, **kwargs): + # scalars, external + current = params["current"] + a = params["cross_section_dims"][0] + b = params["cross_section_dims"][1] + + # u and v are computed + curvature = data["curvature"][:, jnp.newaxis] + binormal = data["frenet_binormal"] + + k = -(a**4 - 6 * a**2 * b**2 + b**4) / (6 * a**2 * b**2) * jnp.log(a / b + b / a) + +b * b / (6 * a * a) * jnp.log(b / a) + +a * a / (6 * b * b) * jnp.log(a / b) + +(4.0 * b) / (3 * a) * jnp.arctan(a / b) + +(4.0 * a) / (3 * b) * jnp.arctan(b / a) + + delta = jnp.exp(-(25.0 / 6) + k) + + data["B_b_fb"] = mu_0 * current/(8*jnp.pi) * curvature * binormal * (4 + 2*jnp.log(2) + jnp.log(delta)) + + return data + +@register_compute_fun( + name="x_fb", + label="x_{FB}", + units="m", + units_long="meters", + description="Position vector in lab frame for finite build coil cross section", + dim=3, + params=[ + "p_frame", + "q_frame", + "cross_section_dims", + "x_centerline" + ], + transforms={}, + profiles=[], + coordinates="rtz", + data=["u_fb", "v_fb"], + parameterization="desc.coils._FiniteBuildCoil", +) +def _x_fb(params, transforms, profiles, data, **kwargs): + # fed in externally + p_frame = params["p_frame"] + q_frame = params["q_frame"] + x_centerline = params["x_centerline"] + + # scalars + a = params["cross_section_dims"][0] + b = params["cross_section_dims"][1] + + # u and v are computed + u = data["u_fb"] + v = data["v_fb"] + + # add dimension to scalars to accomodate vectorized operations + u = u[:, jnp.newaxis] + v = v[:, jnp.newaxis] + + data["x_fb"] = x_centerline + a * u * p_frame + b * v * q_frame + + return data diff --git a/desc/compute/data_index.py b/desc/compute/data_index.py index cf0a32714e..8af82333d0 100644 --- a/desc/compute/data_index.py +++ b/desc/compute/data_index.py @@ -246,6 +246,13 @@ def _decorator(func): "desc.geometry.curve.FourierPlanarCurve", "desc.geometry.core.Curve", ], + "desc.coils.FourierPlanarFiniteBuildCoil": [ + "desc.coils._FramedCoil", + "desc.coils._FiniteBuildCoil", + "desc.coils.FourierPlanarCoil", + "desc.geometry.curve.FourierPlanarCurve", + "desc.geometry.core.Curve", + ], "desc.magnetic_fields._current_potential.CurrentPotentialField": [ "desc.geometry.surface.FourierRZToroidalSurface", "desc.geometry.core.Surface", diff --git a/desc/objectives/__init__.py b/desc/objectives/__init__.py index 3ae2e59af0..0a0d2d5bac 100644 --- a/desc/objectives/__init__.py +++ b/desc/objectives/__init__.py @@ -10,6 +10,7 @@ PlasmaCoilSetMinDistance, QuadraticFlux, ToroidalFlux, + CoilSetMaxNormB, ) from ._equilibrium import ( CurrentDensity, diff --git a/desc/objectives/_coils.py b/desc/objectives/_coils.py index 62ef664622..fb9f613ab2 100644 --- a/desc/objectives/_coils.py +++ b/desc/objectives/_coils.py @@ -9,6 +9,8 @@ tree_leaves, tree_map, tree_unflatten, + scan, + tree_stack, ) from desc.compute import get_profiles, get_transforms, rpz2xyz from desc.compute.utils import _compute as compute_fun @@ -849,6 +851,200 @@ def body(k): return min_dist_per_coil +class CoilSetMaxNormB(_Objective): + """Target the maximum magnetic field magnetic field on coil for a given coilset. + Self field on the coil is computed with the finite build method, and field from other + coils on the coil is computed with the filamentary method. + + Will yield one value for each unique coil in the coilset, which is the maximum magnitude + of magnetic field on that coil. All coils in the coilset must inherit from _FiniteBuildCoil. + + Parameters + ---------- + coil : CoilSet + Coil(s) that are to be optimized. + target : float, ndarray, optional + Target value(s) of the objective. Only used if bounds is None. + Must be broadcastable to Objective.dim_f. If array, it has to + be flattened according to the number of inputs. + bounds : tuple of float, ndarray, optional + Lower and upper bounds on the objective. Overrides target. + Both bounds must be broadcastable to to Objective.dim_f + weight : float, ndarray, optional + Weighting to apply to the Objective, relative to other Objectives. + Must be broadcastable to to Objective.dim_f + normalize : bool, optional + Whether to compute the error in physical units or non-dimensionalize. + normalize_target : bool, optional + Whether target and bounds should be normalized before comparing to computed + values. If `normalize` is `True` and the target is in physical units, + this should also be set to True. + be set to True. + loss_function : {None, 'mean', 'min', 'max'}, optional + Loss function to apply to the objective values once computed. This loss function + is called on the raw compute value, before any shifting, scaling, or + normalization. Operates over all coils, not each individial coil. + deriv_mode : {"auto", "fwd", "rev"} + Specify how to compute jacobian matrix, either forward mode or reverse mode AD. + "auto" selects forward or reverse mode based on the size of the input and output + of the objective. Has no effect on self.grad or self.hess which always use + reverse mode and forward over reverse mode respectively. + xsection_grid : Grid, list, optional + Collocation grid used to discretize each coil cross section. Defaults to the default grid + for the given coil-type, see ``coils.py`` for more details. If a list, must have the + same structure as coils. + centerline_grid : Grid, list, optional + Collocation grid used to discretize each coil centerline. Defaults to the default grid + for the given coil-type, see ``coils.py`` and ``curve.py`` for more details. + If a list, must have the same structure as coils. + name : str, optional + Name of the objective function. + + """ + + _scalar = False + _units = "(T)" + _print_value_fmt = "Maximum field magnitude on coil: {:10.3e} " + + def __init__( + self, + coil, + target=None, + bounds=None, + weight=1, + normalize=True, + normalize_target=True, + loss_function=None, + deriv_mode="auto", + xsection_grid=None, + centerline_grid=None, + name="field magnitude on coil distance", + ): + from desc.coils import CoilSet, _FiniteBuildCoil + + if target is None and bounds is None: + bounds = (-0.0, 20.0) + + self._xsection_grid = xsection_grid + self._centerline_grid = centerline_grid + + errorif( + not type(coil) is CoilSet, + ValueError, + "coil must be of type CoilSet, not an individual Coil. Mixed coil sets are not supported.", + ) + errorif( + not all([isinstance(c, _FiniteBuildCoil) for c in coil.coils]), + ValueError, + "All coils in the CoilSet must inherit from _FiniteBuildCoil", + ) + super().__init__( + things=coil, + target=target, + bounds=bounds, + weight=weight, + normalize=normalize, + normalize_target=normalize_target, + loss_function=loss_function, + deriv_mode=deriv_mode, + name=name, + ) + + def build(self, use_jit=True, verbose=1): + """Build constant arrays. + + Parameters + ---------- + use_jit : bool, optional + Whether to just-in-time compile the objective and derivatives. + verbose : int, optional + Level of output. + + """ + coilset = self.things[0] + xsection_grid = self._xsection_grid or None + centerline_grid = self._centerline_grid or None + + self._dim_f = coilset.num_coils + self._constants = { + "coilset": coilset, + "xsection_grid": xsection_grid, + "centerline_grid": centerline_grid, + "quad_weights": 1.0, + } + + if self._normalize: + coils = tree_leaves(coilset, is_leaf=lambda x: not hasattr(x, "__len__")) + scales = [compute_scaling_factors(coil)["B"] for coil in coils] + self._normalization = np.mean( + scales + ) # mean centerline field strength of coils + + super().build(use_jit=use_jit, verbose=verbose) + + def compute(self, params, constants=None): + """Compute maximum field magnitude on each coil. + + Parameters + ---------- + params : dict + Dictionary of coilset degrees of freedom, eg CoilSet.params_dict + constants : dict + Dictionary of constant data, eg transforms, profiles etc. + Defaults to self._constants. + + Returns + ------- + f : array of floats + Maximum field on coil for each coil in the coilset. + + """ + if constants is None: + constants = self.constants + + def body(dummy, x): + # compute self field and other coil field to find maximum field magnitude on the coil k + coil = constants["coilset"][0] + self_field, quad_points, centerline_mask = coil.compute_self_field( + xsection_grid=constants["xsection_grid"], + centerline_grid=constants["centerline_grid"], + params=x, # just this coil's parameters + ) + + quad_points = jnp.where( + centerline_mask[:, None], 100, quad_points + ) # TODO: better way to do this + + # compute field from other coils and subtract the coil computation to prevent double counting + other_field = constants["coilset"].compute_magnetic_field( + quad_points, + params=params, # all coils' parameters + basis="xyz", + source_grid=constants["centerline_grid"], + ) + other_field -= coil.compute_magnetic_field( + quad_points, + params=x, + basis="xyz", + source_grid=constants["centerline_grid"], + ) + + total_field = self_field + other_field + total_field = jnp.where(centerline_mask[:, None], 0, total_field) + + field_mag = safenorm(total_field, axis=-1) + + # return maximum field magnitude on the coil. NaNs could be generated on the coil axis where the filament has a singularity + # in effect, the coil centerline points are not used in the field computation, which is ok since the field is not maximal on the coil axis + max_mag = jnp.max(field_mag, initial=0) + + return 0, max_mag + + _, max_field_per_coil = scan(body, 0, tree_stack(params)) + + return max_field_per_coil + + class PlasmaCoilSetMinDistance(_Objective): """Target the minimum distance between the plasma and coilset. diff --git a/desc/objectives/normalization.py b/desc/objectives/normalization.py index 255eb346f4..17086ad9e7 100644 --- a/desc/objectives/normalization.py +++ b/desc/objectives/normalization.py @@ -11,6 +11,7 @@ def compute_scaling_factors(thing): # local import to avoid circular import from desc.equilibrium import Equilibrium from desc.geometry import FourierRZToroidalSurface + from desc.coils import _Coil scales = {} @@ -69,6 +70,9 @@ def get_lowest_mode(basis, coeffs): elif isinstance(thing, Curve): scales["a"] = thing.compute("length")["length"] / (2 * np.pi) + + if isinstance(thing, _Coil): + scales["B"] = mu_0 * thing.current / (2 * scales["a"]) # field at center of equivalent loop # replace 0 scales to avoid normalizing by zero for scale in scales.keys(): diff --git a/docs/api.rst b/docs/api.rst index 3173f8b418..2f07140b4f 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -31,6 +31,7 @@ Coils desc.coils.FourierPlanarCoil desc.coils.MixedCoilSet desc.coils.SplineXYZCoil + desc.coils.FourierPlanarFiniteBuildCoil Compatibility ************* diff --git a/docs/api_fields.rst b/docs/api_fields.rst index 32b5cc572b..69294060a6 100644 --- a/docs/api_fields.rst +++ b/docs/api_fields.rst @@ -88,6 +88,7 @@ classes, can also use the same ``Curve`` conversion methods to convert between c desc.coils.FourierXYZCoil desc.coils.FourierPlanarCoil desc.coils.SplineXYZCoil + desc.coils.FourierPlanarFiniteBuildCoil There are also objects for holding a collection of coils with efficient methods for evaluating the combined field. A ``CoilSet`` must consist of members with the same diff --git a/finitebuildtest.ipynb b/finitebuildtest.ipynb new file mode 100644 index 0000000000..630547e9dc --- /dev/null +++ b/finitebuildtest.ipynb @@ -0,0 +1,4764 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "An NVIDIA GPU may be present on this machine, but a CUDA-enabled jaxlib is not installed. Falling back to cpu.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DESC version 0+untagged.9359.g6e2db0e.dirty,using JAX backend, jax version=0.4.31, jaxlib version=0.4.31, dtype=float64\n", + "Using device: CPU, with 11.36 GB available memory\n" + ] + } + ], + "source": [ + "from desc.coils import FourierPlanarFiniteBuildCoil\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "coil = FourierPlanarFiniteBuildCoil(center = [10,0,0], cross_section_dims=[0.1,0.2], r_n = 0.5, modes = [0], cross_section_shape= \"rectangular\", current = 1e6)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Array([[-2.53479632e-38, -7.87612863e-05, -4.82273786e-21]], dtype=float64)" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "coil.compute_magnetic_field([0,0,0], basis = \"xyz\")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2.957678999877364" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "field_array, field_positions = coil.compute_self_field(xsection_grid=1, coil_frame=True)\n", + "max_field = np.max(np.linalg.norm(field_array, axis=1))\n", + "max_field" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2.392891658173041" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "max_perp = np.max(np.abs(field_array[:,1]))\n", + "max_perp" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2.957678999877364" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "max_para = np.max(np.abs(field_array[:,2]))\n", + "max_para" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "marker": { + "color": [ + 1.7958459433403926, + 2.7755575630754895e-18, + -1.7958459433403926, + 2.3928916581730393, + 1.6516775203064935e-30, + -2.3928916581730393, + 1.6708713360076726, + -4.878909778839078e-18, + -1.6708713360076726, + 1.7958459433403928, + -1.1366165793625576e-17, + -1.7958459433403928, + 2.39289165817304, + -3.6379518155245366e-18, + -2.39289165817304, + 1.6708713360076732, + 5.21607721449679e-17, + -1.670871336007673, + 1.7958459433403926, + -2.29069485132415e-17, + -1.795845943340393, + 2.39289165817304, + -7.26559070109947e-18, + -2.39289165817304, + 1.6708713360076735, + -2.248039597768989e-19, + -1.6708713360076735, + 1.7958459433403926, + -3.3420971878937686e-17, + -1.7958459433403926, + 2.3928916581730397, + -1.0872593553374096e-17, + -2.3928916581730397, + 1.6708713360076726, + 2.8695788551913535e-17, + -1.6708713360076726, + 1.7958459433403933, + -4.386251007678781e-17, + -1.7958459433403935, + 2.3928916581730406, + -1.444861748799988e-17, + -2.39289165817304, + 1.6708713360076732, + -3.4100177166190415e-17, + -1.6708713360076735, + 1.7958459433403926, + -5.69634155944917e-17, + -1.7958459433403924, + 2.3928916581730397, + -1.7983291359979974e-17, + -2.3928916581730397, + 1.6708713360076728, + 2.5042040393960407e-17, + -1.6708713360076726, + 1.7958459433403926, + -6.83525720572427e-17, + -1.7958459433403924, + 2.39289165817304, + -2.146620896711388e-17, + -2.39289165817304, + 1.670871336007673, + 3.0993792777563816e-17, + -1.6708713360076728, + 1.7958459433403928, + -7.302771573592084e-17, + -1.7958459433403928, + 2.3928916581730397, + -2.4886924480419447e-17, + -2.3928916581730397, + 1.670871336007673, + 1.9064599290683378e-17, + -1.6708713360076728, + 1.7958459433403928, + -8.377856919600459e-17, + -1.7958459433403928, + 2.39289165817304, + -2.5584922986886555e-17, + -2.39289165817304, + 1.6708713360076728, + 1.485208549822308e-17, + -1.6708713360076728, + 1.7958459433403928, + -9.452051189545753e-17, + -1.7958459433403924, + 2.3928916581730393, + -2.855161214027676e-17, + -2.39289165817304, + 1.6708713360076726, + 5.292699903402519e-17, + -1.6708713360076723, + 1.7958459433403926, + -2.293611381498479e-17, + -1.7958459433403928, + 2.39289165817304, + -3.1435928434387906e-17, + -2.39289165817304, + 1.6708713360076728, + -9.38817893064878e-17, + -1.6708713360076728, + 1.7958459433403928, + -2.977537832989572e-17, + -1.7958459433403924, + 2.39289165817304, + -3.4228393676038044e-17, + -2.3928916581730397, + 1.6708713360076732, + -7.36870186445582e-17, + -1.6708713360076728, + 1.7958459433403924, + -2.980766049814969e-17, + -1.7958459433403924, + 2.3928916581730393, + -3.69194698883845e-17, + -2.3928916581730397, + 1.6708713360076728, + -3.4992149303262904e-17, + -1.6708713360076728, + 1.7958459433403924, + -4.3950554050276455e-17, + -1.7958459433403926, + 2.3928916581730397, + -3.949957422214374e-17, + -2.3928916581730393, + 1.6708713360076728, + -1.0674912242988755e-16, + -1.6708713360076728, + 1.7958459433403933, + -4.66427854930408e-17, + -1.795845943340393, + 2.3928916581730397, + -4.195909938627529e-17, + -2.39289165817304, + 1.6708713360076732, + -6.113106269312785e-17, + -1.6708713360076732, + 1.7958459433403928, + -4.893460376585247e-17, + -1.7958459433403928, + 2.3928916581730397, + -5.3209048075189484e-17, + -2.3928916581730397, + 1.6708713360076728, + -5.4840641708008657e-17, + -1.6708713360076728, + 1.795845943340393, + -5.464444804585293e-17, + -1.7958459433403933, + 2.39289165817304, + -5.579227142389174e-17, + -2.39289165817304, + 1.6708713360076732, + -2.2806449866165088e-17, + -1.6708713360076732, + 1.795845943340393, + -5.928318863260897e-17, + -1.795845943340393, + 2.39289165817304, + -5.819020455338369e-17, + -2.39289165817304, + 1.6708713360076732, + -2.954590403000182e-17, + -1.6708713360076732, + 1.7958459433403933, + -6.26778632231461e-17, + -1.7958459433403928, + 2.39289165817304, + -7.280376316144825e-17, + -2.39289165817304, + 1.6708713360076732, + -3.413090529300934e-17, + -1.6708713360076728, + 1.7958459433403928, + -6.38087143654653e-17, + -1.7958459433403928, + 2.39289165817304, + -7.476537867727823e-17, + -2.3928916581730406, + 1.6708713360076732, + -1.4368772973157838e-16, + -1.6708713360076732, + 1.7958459433403928, + -6.276903004343876e-17, + -1.7958459433403926, + 2.3928916581730397, + -7.646251851021057e-17, + -2.3928916581730397, + 1.6708713360076728, + -8.771003358882188e-17, + -1.6708713360076728, + 1.7958459433403924, + -4.7532648078710933e-17, + -1.7958459433403924, + 2.3928916581730397, + -7.78858602017519e-17, + -2.3928916581730397, + 1.6708713360076728, + -6.83330757536079e-17, + -1.6708713360076728, + 1.7958459433403924, + -6.744951892705885e-17, + -1.7958459433403922, + 2.3928916581730393, + -7.846942595022991e-17, + -2.39289165817304, + 1.6708713360076728, + -1.3115957509996095e-16, + -1.6708713360076726, + 1.7958459433403928, + -6.323588612630766e-17, + -1.7958459433403928, + 2.39289165817304, + -7.949018150663989e-17, + -2.39289165817304, + 1.6708713360076728, + -1.3474874112418835e-16, + -1.6708713360076728, + 1.7958459433403928, + -6.924804739911415e-17, + -1.7958459433403928, + 2.3928916581730397, + -8.010733728111748e-17, + -2.3928916581730397, + 1.6708713360076728, + -1.4133928706406735e-16, + -1.6708713360076728, + 1.7958459433403924, + -6.952883326970389e-17, + -1.7958459433403924, + 2.3928916581730397, + -8.061059145925219e-17, + -2.3928916581730397, + 1.6708713360076728, + -1.2720183483521042e-16, + -1.6708713360076726, + 1.7958459433403922, + -7.268278411120593e-17, + -1.7958459433403922, + 2.3928916581730393, + -8.088116229279986e-17, + -2.3928916581730393, + 1.6708713360076726, + -5.5400589185626855e-17, + -1.6708713360076726, + 1.7958459433403933, + -6.444305393708513e-17, + -1.7958459433403933, + 2.39289165817304, + -8.085447498629059e-17, + -2.39289165817304, + 1.6708713360076732, + -8.920483279192662e-17, + -1.6708713360076732, + 1.795845943340393, + -7.179856101038565e-17, + -1.795845943340393, + 2.39289165817304, + -8.051018501652548e-17, + -2.39289165817304, + 1.670871336007673, + -1.123657434085862e-16, + -1.6708713360076728, + 1.7958459433403926, + -7.156708160424847e-17, + -1.7958459433403926, + 2.3928916581730397, + -7.984538709635625e-17, + -2.3928916581730393, + 1.6708713360076728, + -1.294002759262483e-16, + -1.6708713360076728, + 1.7958459433403933, + -6.797841329896746e-17, + -1.795845943340393, + 2.3928916581730406, + -7.885850758459069e-17, + -2.3928916581730406, + 1.670871336007673, + -1.4032875194673643e-16, + -1.670871336007673, + 1.7958459433403926, + -6.251148816923776e-17, + -1.795845943340393, + 2.3928916581730393, + -7.949297116005542e-17, + -2.3928916581730393, + 1.6708713360076726, + -9.250119004541392e-17, + -1.670871336007673, + 1.7958459433403924, + -6.565155307576434e-17, + -1.7958459433403924, + 2.3928916581730397, + -7.818240652966514e-17, + -2.3928916581730397, + 1.6708713360076726, + -1.0466212290239267e-16, + -1.6708713360076726, + 1.795845943340392, + -5.65951236621252e-17, + -1.7958459433403924, + 2.3928916581730393, + -7.397113570605584e-17, + -2.3928916581730393, + 1.6708713360076723, + -1.0004405786714476e-16, + -1.6708713360076723, + 1.795845943340393, + -6.274064573579431e-17, + -1.795845943340393, + 2.39289165817304, + -6.221164632424028e-17, + -2.3928916581730397, + 1.670871336007673, + -5.413670237060912e-17, + -1.670871336007673, + 1.7958459433403926, + -5.454549158823373e-17, + -1.7958459433403926, + 2.3928916581730393, + -6.001798321366536e-17, + -2.3928916581730397, + 1.6708713360076728, + 3.282661897905893e-18, + -1.6708713360076728, + 1.7958459433403928, + -5.646700051540483e-17, + -1.7958459433403928, + 2.3928916581730397, + -5.755969850073429e-17, + -2.3928916581730393, + 1.6708713360076728, + -8.529370376556822e-17, + -1.6708713360076728, + 1.7958459433403933, + -5.4384647550463133e-17, + -1.7958459433403933, + 2.39289165817304, + -5.4844579615734306e-17, + -2.39289165817304, + 1.670871336007673, + -7.087964897464458e-17, + -1.6708713360076735, + 1.7958459433403928, + -3.6002393201882316e-17, + -1.7958459433403928, + 2.3928916581730397, + -4.4092775244870743e-17, + -2.3928916581730393, + 1.6708713360076728, + -6.244918746652741e-17, + -1.6708713360076728, + 1.7958459433403924, + -3.2948556513693656e-17, + -1.7958459433403924, + 2.3928916581730393, + -4.140040993419335e-17, + -2.3928916581730397, + 1.6708713360076728, + 1.867088592752744e-17, + -1.6708713360076723, + 1.7958459433403928, + -2.761576106958108e-17, + -1.7958459433403928, + 2.39289165817304, + -3.851193717668422e-17, + -2.39289165817304, + 1.6708713360076728, + -4.6459143961636763e-17, + -1.6708713360076728, + 1.7958459433403928, + -2.207217414117495e-17, + -1.7958459433403928, + 2.3928916581730397, + -3.543912109484429e-17, + -2.3928916581730397, + 1.670871336007673, + 4.143258324635591e-18, + -1.6708713360076732, + 1.7958459433403924, + -9.256822137782487e-17, + -1.7958459433403924, + 2.3928916581730393, + -3.2195035643837165e-17, + -2.392891658173039, + 1.6708713360076723, + 3.136462998393189e-17, + -1.6708713360076726, + 1.7958459433403924, + -8.475331011314187e-17, + -1.7958459433403922, + 2.392891658173039, + -2.8793999798723646e-17, + -2.392891658173039, + 1.6708713360076723, + 7.702712261433554e-17, + -1.6708713360076723, + 1.7958459433403926, + -7.78311500633916e-17, + -1.7958459433403926, + 2.3928916581730397, + -2.74354920706222e-17, + -2.3928916581730397, + 1.6708713360076728, + 3.568275537127089e-18, + -1.6708713360076728, + 1.7958459433403928, + -6.046298398804929e-17, + -1.7958459433403924, + 2.3928916581730397, + -2.3446570630355372e-17, + -2.39289165817304, + 1.670871336007673, + 6.77020621608509e-17, + -1.6708713360076728, + 1.7958459433403928, + -5.445148096374766e-17, + -1.7958459433403926, + 2.39289165817304, + -1.9343038624211212e-17, + -2.39289165817304, + 1.6708713360076728, + 4.266803370078065e-17, + -1.6708713360076723, + 1.7958459433403926, + -3.794479548752983e-17, + -1.7958459433403926, + 2.3928916581730397, + -1.5144512994136397e-17, + -2.39289165817304, + 1.6708713360076728, + 5.38573887731597e-17, + -1.6708713360076728, + 1.7958459433403926, + -3.0022306800805675e-17, + -1.7958459433403926, + 2.3928916581730397, + -1.0871333709582978e-17, + -2.3928916581730397, + 1.6708713360076728, + 2.514077595046479e-17, + -1.6708713360076728, + 1.7958459433403928, + -1.8096496048102708e-17, + -1.7958459433403926, + 2.3928916581730397, + -6.544413905692733e-18, + -2.39289165817304, + 1.6708713360076728, + -5.469170155299266e-17, + -1.670871336007673, + 1.7958459433403926, + -1.1559414484355349e-17, + -1.7958459433403926, + 2.39289165817304, + -2.1850820070142846e-18, + -2.39289165817304, + 1.6708713360076728, + -3.462941440897671e-17, + -1.6708713360076728, + 1.7958459433403926, + 4.625545774327253e-19, + -1.7958459433403926, + 2.39289165817304, + 2.185082007015635e-18, + -2.39289165817304, + 1.6708713360076728, + -3.8017560801491204e-17, + -1.6708713360076728, + 1.7958459433403928, + 1.8161152153247972e-17, + -1.7958459433403926, + 2.3928916581730397, + 6.544413905691254e-18, + -2.39289165817304, + 1.6708713360076728, + -6.480913645835548e-17, + -1.670871336007673, + 1.795845943340393, + 2.7333990098940893e-17, + -1.795845943340393, + 2.392891658173041, + 1.0871333709581595e-17, + -2.392891658173041, + 1.670871336007673, + 9.343887148281371e-18, + -1.670871336007673, + 1.7958459433403926, + 4.0504928053395366e-17, + -1.7958459433403926, + 2.3928916581730397, + 1.5144512994137792e-17, + -2.3928916581730397, + 1.6708713360076728, + 2.7418503912883536e-17, + -1.6708713360076728, + 1.7958459433403926, + 4.7215849175953145e-17, + -1.7958459433403924, + 2.39289165817304, + 1.9343038624212306e-17, + -2.39289165817304, + 1.6708713360076728, + 8.782431151128121e-18, + -1.6708713360076726, + 1.7958459433403926, + 6.069579545674812e-17, + -1.795845943340392, + 2.3928916581730393, + 2.344657063035354e-17, + -2.39289165817304, + 1.6708713360076726, + 2.721396639479099e-17, + -1.6708713360076723, + 1.7958459433403933, + 6.8538001857647e-17, + -1.7958459433403933, + 2.39289165817304, + 2.7435492070623083e-17, + -2.3928916581730406, + 1.6708713360076735, + -2.5877779459774327e-17, + -1.6708713360076735, + 1.7958459433403928, + 7.854700128628538e-17, + -1.7958459433403924, + 2.3928916581730397, + 2.8793999798724546e-17, + -2.3928916581730397, + 1.6708713360076726, + 1.0975298714307964e-17, + -1.6708713360076726, + 1.7958459433403926, + 9.426458740742894e-17, + -1.7958459433403926, + 2.3928916581730393, + 3.219503564383622e-17, + -2.3928916581730393, + 1.6708713360076728, + -2.9623503799260165e-17, + -1.6708713360076728, + 1.7958459433403928, + 2.6681753432871107e-17, + -1.7958459433403933, + 2.39289165817304, + 3.543912109484351e-17, + -2.39289165817304, + 1.6708713360076732, + 9.110042447476569e-17, + -1.6708713360076732, + 1.7958459433403933, + 2.7289751284192255e-17, + -1.7958459433403933, + 2.39289165817304, + 3.8511937176684975e-17, + -2.3928916581730406, + 1.6708713360076732, + 4.536847886220532e-17, + -1.6708713360076732, + 1.795845943340393, + 3.3858840309336294e-17, + -1.7958459433403928, + 2.39289165817304, + 4.140040993419359e-17, + -2.39289165817304, + 1.6708713360076732, + 1.2441548107850177e-16, + -1.6708713360076728, + 1.7958459433403924, + 4.3867879719227786e-17, + -1.7958459433403924, + 2.39289165817304, + 4.40927752448701e-17, + -2.3928916581730393, + 1.6708713360076726, + 5.812139299472983e-17, + -1.6708713360076726, + 1.7958459433403928, + 5.0465230215151094e-17, + -1.7958459433403926, + 2.3928916581730397, + 5.484457961573492e-17, + -2.3928916581730397, + 1.6708713360076723, + 7.962318535300291e-17, + -1.6708713360076728, + 1.7958459433403928, + 5.773105834582101e-17, + -1.7958459433403928, + 2.3928916581730393, + 5.755969850073387e-17, + -2.3928916581730393, + 1.6708713360076728, + 7.354580569722079e-17, + -1.6708713360076728, + 1.7958459433403928, + 5.980471431410409e-17, + -1.7958459433403928, + 2.39289165817304, + 6.00179832136657e-17, + -2.3928916581730397, + 1.6708713360076728, + 8.641583799422651e-17, + -1.6708713360076728, + 1.795845943340393, + 5.7273163326523e-17, + -1.795845943340393, + 2.39289165817304, + 6.221164632424002e-17, + -2.3928916581730397, + 1.6708713360076732, + 1.1376243693924947e-16, + -1.6708713360076732, + 1.7958459433403924, + 6.280039954453169e-17, + -1.7958459433403928, + 2.39289165817304, + 7.397113570605567e-17, + -2.3928916581730397, + 1.6708713360076728, + 7.385483125868097e-17, + -1.6708713360076728, + 1.7958459433403928, + 6.81859792189549e-17, + -1.7958459433403928, + 2.39289165817304, + 7.818240652966508e-17, + -2.39289165817304, + 1.6708713360076728, + 7.343070967462365e-17, + -1.6708713360076728, + 1.7958459433403926, + 6.535430875200652e-17, + -1.7958459433403928, + 2.3928916581730397, + 7.94929711600554e-17, + -2.3928916581730397, + 1.6708713360076728, + 8.558442483875683e-17, + -1.670871336007673, + 1.7958459433403924, + 6.532315473163676e-17, + -1.7958459433403924, + 2.3928916581730397, + 7.88585075845906e-17, + -2.39289165817304, + 1.6708713360076728, + 4.3967089857714955e-17, + -1.6708713360076728, + 1.7958459433403928, + 6.378678449633421e-17, + -1.7958459433403928, + 2.3928916581730397, + 7.984538709635635e-17, + -2.3928916581730397, + 1.6708713360076732, + 5.79063786899101e-17, + -1.670871336007673, + 1.7958459433403922, + 6.929978138850778e-17, + -1.7958459433403922, + 2.3928916581730397, + 8.051018501652538e-17, + -2.3928916581730393, + 1.6708713360076732, + 7.530276705048121e-17, + -1.6708713360076728, + 1.7958459433403928, + 6.440535764997097e-17, + -1.7958459433403928, + 2.39289165817304, + 8.085447498629066e-17, + -2.3928916581730397, + 1.6708713360076728, + 9.854652252672031e-17, + -1.6708713360076728, + 1.7958459433403924, + 6.158454510022339e-17, + -1.7958459433403924, + 2.3928916581730393, + 8.088116229279987e-17, + -2.3928916581730393, + 1.6708713360076728, + 1.3400931548478057e-16, + -1.6708713360076728, + 1.7958459433403924, + 6.397704057265974e-17, + -1.7958459433403924, + 2.3928916581730397, + 8.061059145925218e-17, + -2.3928916581730397, + 1.6708713360076728, + 6.217166664312609e-17, + -1.6708713360076726, + 1.7958459433403928, + 6.097348954857175e-17, + -1.7958459433403928, + 2.3928916581730397, + 8.010733728111751e-17, + -2.3928916581730397, + 1.6708713360076728, + 4.697537284922384e-17, + -1.6708713360076728, + 1.7958459433403928, + 7.157793142093452e-17, + -1.7958459433403928, + 2.39289165817304, + 7.949018150663994e-17, + -2.39289165817304, + 1.6708713360076728, + 6.316930923181583e-17, + -1.6708713360076728, + 1.7958459433403928, + 6.445182143469907e-17, + -1.7958459433403924, + 2.3928916581730397, + 7.846942595022994e-17, + -2.39289165817304, + 1.6708713360076728, + 5.2061274544949926e-17, + -1.6708713360076726, + 1.7958459433403928, + 4.271841027330078e-17, + -1.7958459433403928, + 2.39289165817304, + 7.788586020175188e-17, + -2.39289165817304, + 1.670871336007673, + 1.4712835977344005e-16, + -1.670871336007673, + 1.7958459433403924, + 6.192113415147833e-17, + -1.7958459433403922, + 2.3928916581730393, + 7.64625185102106e-17, + -2.3928916581730393, + 1.6708713360076723, + 9.072364107784907e-17, + -1.6708713360076723, + 1.7958459433403928, + 6.275653267911273e-17, + -1.7958459433403928, + 2.39289165817304, + 7.476537867727844e-17, + -2.3928916581730406, + 1.6708713360076732, + 2.689071518130734e-17, + -1.6708713360076732, + 1.7958459433403926, + 5.578874686710261e-17, + -1.7958459433403926, + 2.3928916581730397, + 7.280376316144807e-17, + -2.3928916581730397, + 1.6708713360076726, + 1.3102734691338286e-16, + -1.6708713360076723, + 1.7958459433403928, + 5.754661700179804e-17, + -1.7958459433403928, + 2.3928916581730397, + 5.819020455338399e-17, + -2.3928916581730397, + 1.670871336007673, + 1.295224766001732e-16, + -1.670871336007673, + 1.7958459433403928, + 5.464444804585254e-17, + -1.7958459433403928, + 2.39289165817304, + 5.579227142389137e-17, + -2.39289165817304, + 1.6708713360076728, + 1.2964752701478097e-16, + -1.6708713360076728, + 1.7958459433403928, + 5.694785488733462e-17, + -1.7958459433403928, + 2.39289165817304, + 5.3209048075189497e-17, + -2.39289165817304, + 1.6708713360076732, + 9.154561642000345e-17, + -1.670871336007673, + 1.795845943340393, + 5.055366529025021e-17, + -1.7958459433403928, + 2.39289165817304, + 4.1959099386275735e-17, + -2.39289165817304, + 1.6708713360076728, + 7.716687483288853e-17, + -1.6708713360076728, + 1.7958459433403928, + 4.883286739544944e-17, + -1.795845943340393, + 2.39289165817304, + 3.949957422214299e-17, + -2.39289165817304, + 1.6708713360076732, + 2.782429148089879e-17, + -1.6708713360076732, + 1.7958459433403928, + 3.075008192687269e-17, + -1.7958459433403928, + 2.3928916581730393, + 3.691946988838466e-17, + -2.39289165817304, + 1.670871336007673, + 6.498619653211957e-17, + -1.670871336007673, + 1.7958459433403924, + 2.538905072099992e-17, + -1.7958459433403922, + 2.3928916581730397, + 3.422839367603882e-17, + -2.3928916581730393, + 1.6708713360076728, + 7.336685943395704e-18, + -1.6708713360076726, + 1.7958459433403924, + 2.1318682525072117e-17, + -1.7958459433403924, + 2.3928916581730393, + 3.1435928434387055e-17, + -2.3928916581730397, + 1.6708713360076723, + -1.94221296205147e-17, + -1.6708713360076726, + 1.7958459433403924, + 9.055400742456788e-17, + -1.7958459433403922, + 2.3928916581730397, + 2.855161214027645e-17, + -2.3928916581730397, + 1.6708713360076726, + -2.2601368787195993e-17, + -1.6708713360076723, + 1.7958459433403924, + 8.66687766879207e-17, + -1.7958459433403924, + 2.3928916581730397, + 2.558492298688831e-17, + -2.3928916581730397, + 1.6708713360076728, + -5.683626756914648e-17, + -1.6708713360076728, + 1.7958459433403928, + 7.244230202911436e-17, + -1.7958459433403926, + 2.3928916581730397, + 2.4886924480417586e-17, + -2.3928916581730397, + 1.6708713360076732, + -4.187589210839806e-17, + -1.6708713360076728, + 1.7958459433403928, + 6.475601681171618e-17, + -1.7958459433403924, + 2.3928916581730397, + 2.1466208967114014e-17, + -2.3928916581730397, + 1.6708713360076728, + -2.1713208182102363e-17, + -1.6708713360076726, + 1.7958459433403922, + 6.066763218488298e-17, + -1.795845943340392, + 2.3928916581730397, + 1.7983291359982088e-17, + -2.3928916581730393, + 1.6708713360076726, + -1.8762860867304326e-17, + -1.6708713360076723, + 1.7958459433403926, + 4.706524865100081e-17, + -1.7958459433403928, + 2.3928916581730397, + 1.444861748799825e-17, + -2.3928916581730397, + 1.6708713360076728, + -6.950052596038045e-17, + -1.6708713360076732, + 1.7958459433403928, + 3.3034723025349967e-17, + -1.7958459433403926, + 2.3928916581730397, + 1.0872593553375952e-17, + -2.3928916581730397, + 1.6708713360076728, + 2.535911272864819e-18, + -1.6708713360076728, + 1.7958459433403922, + 1.800007616824223e-17, + -1.7958459433403924, + 2.3928916581730397, + 7.265590701096821e-18, + -2.3928916581730393, + 1.6708713360076726, + -1.6903395965469433e-17, + -1.6708713360076728, + 1.7958459433403926, + 1.414713902315336e-17, + -1.7958459433403926, + 2.3928916581730393, + 3.637951815523891e-18, + -2.3928916581730393, + 1.6708713360076728, + 4.3272701055184426e-17, + -1.6708713360076728 + ], + "colorbar": { + "title": { + "text": "Field Value" + } + }, + "colorscale": [ + [ + 0, + "#440154" + ], + [ + 0.1111111111111111, + "#482878" + ], + [ + 0.2222222222222222, + "#3e4989" + ], + [ + 0.3333333333333333, + "#31688e" + ], + [ + 0.4444444444444444, + "#26828e" + ], + [ + 0.5555555555555556, + "#1f9e89" + ], + [ + 0.6666666666666666, + "#35b779" + ], + [ + 0.7777777777777778, + "#6ece58" + ], + [ + 0.8888888888888888, + "#b5de2b" + ], + [ + 1, + "#fde725" + ] + ], + "size": 5 + }, + "mode": "markers", + "type": "scatter3d", + "x": [ + 10.4001, + 10.4001, + 10.4001, + 10.5, + 10.5, + 10.5, + 10.5999, + 10.5999, + 10.5999, + 10.39932604541315, + 10.39932604541315, + 10.39932604541315, + 10.499032798566796, + 10.499032798566796, + 10.499032798566796, + 10.598739551720442, + 10.598739551720442, + 10.598739551720442, + 10.397007175932547, + 10.397007175932547, + 10.397007175932547, + 10.496134936181639, + 10.496134936181639, + 10.496134936181639, + 10.59526269643073, + 10.59526269643073, + 10.59526269643073, + 10.393152362813726, + 10.393152362813726, + 10.393152362813726, + 10.491317624111131, + 10.491317624111131, + 10.491317624111131, + 10.589482885408536, + 10.589482885408536, + 10.589482885408536, + 10.387776519579786, + 10.387776519579786, + 10.387776519579786, + 10.484599499599833, + 10.484599499599833, + 10.484599499599833, + 10.58142247961988, + 10.58142247961988, + 10.58142247961988, + 10.380900444323844, + 10.380900444323844, + 10.380900444323844, + 10.476006553766364, + 10.476006553766364, + 10.476006553766364, + 10.571112663208885, + 10.571112663208885, + 10.571112663208885, + 10.372550739245273, + 10.372550739245273, + 10.372550739245273, + 10.46557203104883, + 10.46557203104883, + 10.46557203104883, + 10.558593322852385, + 10.558593322852385, + 10.558593322852385, + 10.362759707730946, + 10.362759707730946, + 10.362759707730946, + 10.453336300588536, + 10.453336300588536, + 10.453336300588536, + 10.543912893446125, + 10.543912893446125, + 10.543912893446125, + 10.351565229379718, + 10.351565229379718, + 10.351565229379718, + 10.439346700049635, + 10.439346700049635, + 10.439346700049635, + 10.527128170719552, + 10.527128170719552, + 10.527128170719552, + 10.339010613453608, + 10.339010613453608, + 10.339010613453608, + 10.42365735247889, + 10.42365735247889, + 10.42365735247889, + 10.50830409150417, + 10.50830409150417, + 10.50830409150417, + 10.325144431322682, + 10.325144431322682, + 10.325144431322682, + 10.406328956914125, + 10.406328956914125, + 10.406328956914125, + 10.487513482505568, + 10.487513482505568, + 10.487513482505568, + 10.310020328551866, + 10.310020328551866, + 10.310020328551866, + 10.387428553551445, + 10.387428553551445, + 10.387428553551445, + 10.464836778551023, + 10.464836778551023, + 10.464836778551023, + 10.29369681735666, + 10.29369681735666, + 10.29369681735666, + 10.36702926437973, + 10.36702926437973, + 10.36702926437973, + 10.4403617114028, + 10.4403617114028, + 10.4403617114028, + 10.276237050230757, + 10.276237050230757, + 10.276237050230757, + 10.345210010285873, + 10.345210010285873, + 10.345210010285873, + 10.41418297034099, + 10.41418297034099, + 10.41418297034099, + 10.257708575621304, + 10.257708575621304, + 10.257708575621304, + 10.3220552057252, + 10.3220552057252, + 10.3220552057252, + 10.386401835829094, + 10.386401835829094, + 10.386401835829094, + 10.238183076597094, + 10.238183076597094, + 10.238183076597094, + 10.297654432138334, + 10.297654432138334, + 10.297654432138334, + 10.357125787679573, + 10.357125787679573, + 10.357125787679573, + 10.217736093520687, + 10.217736093520687, + 10.217736093520687, + 10.272102091378013, + 10.272102091378013, + 10.272102091378013, + 10.32646808923534, + 10.32646808923534, + 10.32646808923534, + 10.196446731797426, + 10.196446731797426, + 10.196446731797426, + 10.245497040486661, + 10.245497040486661, + 10.245497040486661, + 10.294547349175897, + 10.294547349175897, + 10.294547349175897, + 10.174397355831996, + 10.174397355831996, + 10.174397355831996, + 10.217942209237686, + 10.217942209237686, + 10.217942209237686, + 10.261487062643376, + 10.261487062643376, + 10.261487062643376, + 10.151673270376536, + 10.151673270376536, + 10.151673270376536, + 10.18954420192019, + 10.18954420192019, + 10.18954420192019, + 10.227415133463845, + 10.227415133463845, + 10.227415133463845, + 10.12836239050313, + 10.12836239050313, + 10.12836239050313, + 10.160412884907684, + 10.160412884907684, + 10.160412884907684, + 10.192463379312239, + 10.192463379312239, + 10.192463379312239, + 10.104554901477465, + 10.104554901477465, + 10.104554901477465, + 10.13066096160643, + 10.13066096160643, + 10.13066096160643, + 10.156767021735396, + 10.156767021735396, + 10.156767021735396, + 10.080342909849572, + 10.080342909849572, + 10.080342909849572, + 10.100403536427859, + 10.100403536427859, + 10.100403536427859, + 10.120464163006146, + 10.120464163006146, + 10.120464163006146, + 10.055820087111464, + 10.055820087111464, + 10.055820087111464, + 10.069757669471961, + 10.069757669471961, + 10.069757669471961, + 10.08369525183246, + 10.08369525183246, + 10.08369525183246, + 10.031081307300331, + 10.031081307300331, + 10.031081307300331, + 10.038841923644503, + 10.038841923644503, + 10.038841923644503, + 10.046602539988674, + 10.046602539988674, + 10.046602539988674, + 10.006222279949332, + 10.006222279949332, + 10.006222279949332, + 10.007775905960175, + 10.007775905960175, + 10.007775905960175, + 10.009329531971018, + 10.009329531971018, + 10.009329531971018, + 9.981339179805994, + 9.981339179805994, + 9.981339179805994, + 9.976679804806292, + 9.976679804806292, + 9.976679804806292, + 9.972020429806589, + 9.972020429806589, + 9.972020429806589, + 9.9565282747508, + 9.9565282747508, + 9.9565282747508, + 9.945673924957262, + 9.945673924957262, + 9.945673924957262, + 9.934819575163724, + 9.934819575163724, + 9.934819575163724, + 9.93188555335547, + 9.93188555335547, + 9.93188555335547, + 9.914878222138801, + 9.914878222138801, + 9.914878222138801, + 9.897870890922134, + 9.897870890922134, + 9.897870890922134, + 9.907506353521802, + 9.907506353521802, + 9.907506353521802, + 9.884411838942516, + 9.884411838942516, + 9.884411838942516, + 9.86131732436323, + 9.86131732436323, + 9.86131732436323, + 9.883484993637877, + 9.883484993637877, + 9.883484993637877, + 9.854392643886374, + 9.854392643886374, + 9.854392643886374, + 9.825300294134871, + 9.825300294134871, + 9.825300294134871, + 9.859914407678525, + 9.859914407678525, + 9.859914407678525, + 9.824936775404305, + 9.824936775404305, + 9.824936775404305, + 9.789959143130085, + 9.789959143130085, + 9.789959143130085, + 9.83688578566183, + 9.83688578566183, + 9.83688578566183, + 9.796158192529155, + 9.796158192529155, + 9.796158192529155, + 9.755430599396481, + 9.755430599396481, + 9.755430599396481, + 9.814488220852672, + 9.814488220852672, + 9.814488220852672, + 9.768168234007337, + 9.768168234007337, + 9.768168234007337, + 9.721848247162002, + 9.721848247162002, + 9.721848247162002, + 9.79280836507818, + 9.79280836507818, + 9.79280836507818, + 9.741075187550837, + 9.741075187550837, + 9.741075187550837, + 9.689342010023495, + 9.689342010023495, + 9.689342010023495, + 9.771930093488665, + 9.771930093488665, + 9.771930093488665, + 9.714983870893109, + 9.714983870893109, + 9.714983870893109, + 9.658037648297553, + 9.658037648297553, + 9.658037648297553, + 9.751934180060944, + 9.751934180060944, + 9.751934180060944, + 9.689995226269613, + 9.689995226269613, + 9.689995226269613, + 9.62805627247828, + 9.62805627247828, + 9.62805627247828, + 9.732897985099516, + 9.732897985099516, + 9.732897985099516, + 9.666205929891923, + 9.666205929891923, + 9.666205929891923, + 9.59951387468433, + 9.59951387468433, + 9.59951387468433, + 9.714895155944584, + 9.714895155944584, + 9.714895155944584, + 9.643708017926247, + 9.643708017926247, + 9.643708017926247, + 9.572520879907911, + 9.572520879907911, + 9.572520879907911, + 9.697995342044782, + 9.697995342044782, + 9.697995342044782, + 9.622588530423371, + 9.622588530423371, + 9.622588530423371, + 9.54718171880196, + 9.54718171880196, + 9.54718171880196, + 9.682263925497013, + 9.682263925497013, + 9.682263925497013, + 9.602929174577623, + 9.602929174577623, + 9.602929174577623, + 9.523594423658233, + 9.523594423658233, + 9.523594423658233, + 9.667761768095804, + 9.667761768095804, + 9.667761768095804, + 9.584806008617601, + 9.584806008617601, + 9.584806008617601, + 9.501850249139398, + 9.501850249139398, + 9.501850249139398, + 9.654544975870845, + 9.654544975870845, + 9.654544975870845, + 9.568289147551669, + 9.568289147551669, + 9.568289147551669, + 9.482033319232492, + 9.482033319232492, + 9.482033319232492, + 9.642664682023666, + 9.642664682023666, + 9.642664682023666, + 9.553442491906605, + 9.553442491906605, + 9.553442491906605, + 9.464220301789544, + 9.464220301789544, + 9.464220301789544, + 9.632166849103207, + 9.632166849103207, + 9.632166849103207, + 9.540323480508881, + 9.540323480508881, + 9.540323480508881, + 9.448480111914556, + 9.448480111914556, + 9.448480111914556, + 9.623092091185658, + 9.623092091185658, + 9.623092091185658, + 9.528982868265006, + 9.528982868265006, + 9.528982868265006, + 9.434873645344354, + 9.434873645344354, + 9.434873645344354, + 9.615475516746471, + 9.615475516746471, + 9.615475516746471, + 9.519464529800638, + 9.519464529800638, + 9.519464529800638, + 9.423453542854805, + 9.423453542854805, + 9.423453542854805, + 9.609346592832502, + 9.609346592832502, + 9.609346592832502, + 9.511805289718197, + 9.511805289718197, + 9.511805289718197, + 9.414263986603892, + 9.414263986603892, + 9.414263986603892, + 9.604729031059723, + 9.604729031059723, + 9.604729031059723, + 9.506034780129621, + 9.506034780129621, + 9.506034780129621, + 9.40734052919952, + 9.40734052919952, + 9.40734052919952, + 9.601640695877597, + 9.601640695877597, + 9.601640695877597, + 9.502175326015491, + 9.502175326015491, + 9.502175326015491, + 9.402709956153386, + 9.402709956153386, + 9.402709956153386, + 9.600093535454976, + 9.600093535454976, + 9.600093535454976, + 9.500241858854006, + 9.500241858854006, + 9.500241858854006, + 9.400390182253036, + 9.400390182253036, + 9.400390182253036, + 9.600093535454976, + 9.600093535454976, + 9.600093535454976, + 9.500241858854006, + 9.500241858854006, + 9.500241858854006, + 9.400390182253036, + 9.400390182253036, + 9.400390182253036, + 9.601640695877597, + 9.601640695877597, + 9.601640695877597, + 9.502175326015491, + 9.502175326015491, + 9.502175326015491, + 9.402709956153386, + 9.402709956153386, + 9.402709956153386, + 9.604729031059723, + 9.604729031059723, + 9.604729031059723, + 9.506034780129621, + 9.506034780129621, + 9.506034780129621, + 9.40734052919952, + 9.40734052919952, + 9.40734052919952, + 9.609346592832502, + 9.609346592832502, + 9.609346592832502, + 9.511805289718197, + 9.511805289718197, + 9.511805289718197, + 9.414263986603892, + 9.414263986603892, + 9.414263986603892, + 9.615475516746471, + 9.615475516746471, + 9.615475516746471, + 9.519464529800638, + 9.519464529800638, + 9.519464529800638, + 9.423453542854805, + 9.423453542854805, + 9.423453542854805, + 9.623092091185658, + 9.623092091185658, + 9.623092091185658, + 9.528982868265006, + 9.528982868265006, + 9.528982868265006, + 9.434873645344354, + 9.434873645344354, + 9.434873645344354, + 9.632166849103207, + 9.632166849103207, + 9.632166849103207, + 9.540323480508881, + 9.540323480508881, + 9.540323480508881, + 9.448480111914556, + 9.448480111914556, + 9.448480111914556, + 9.642664682023666, + 9.642664682023666, + 9.642664682023666, + 9.553442491906605, + 9.553442491906605, + 9.553442491906605, + 9.464220301789544, + 9.464220301789544, + 9.464220301789544, + 9.654544975870845, + 9.654544975870845, + 9.654544975870845, + 9.568289147551669, + 9.568289147551669, + 9.568289147551669, + 9.482033319232492, + 9.482033319232492, + 9.482033319232492, + 9.667761768095804, + 9.667761768095804, + 9.667761768095804, + 9.584806008617601, + 9.584806008617601, + 9.584806008617601, + 9.501850249139398, + 9.501850249139398, + 9.501850249139398, + 9.682263925497015, + 9.682263925497015, + 9.682263925497015, + 9.602929174577623, + 9.602929174577623, + 9.602929174577623, + 9.523594423658231, + 9.523594423658231, + 9.523594423658231, + 9.697995342044782, + 9.697995342044782, + 9.697995342044782, + 9.622588530423371, + 9.622588530423371, + 9.622588530423371, + 9.54718171880196, + 9.54718171880196, + 9.54718171880196, + 9.714895155944584, + 9.714895155944584, + 9.714895155944584, + 9.643708017926247, + 9.643708017926247, + 9.643708017926247, + 9.572520879907911, + 9.572520879907911, + 9.572520879907911, + 9.732897985099516, + 9.732897985099516, + 9.732897985099516, + 9.666205929891923, + 9.666205929891923, + 9.666205929891923, + 9.59951387468433, + 9.59951387468433, + 9.59951387468433, + 9.751934180060944, + 9.751934180060944, + 9.751934180060944, + 9.689995226269613, + 9.689995226269613, + 9.689995226269613, + 9.62805627247828, + 9.62805627247828, + 9.62805627247828, + 9.771930093488665, + 9.771930093488665, + 9.771930093488665, + 9.714983870893109, + 9.714983870893109, + 9.714983870893109, + 9.658037648297553, + 9.658037648297553, + 9.658037648297553, + 9.79280836507818, + 9.79280836507818, + 9.79280836507818, + 9.741075187550837, + 9.741075187550837, + 9.741075187550837, + 9.689342010023495, + 9.689342010023495, + 9.689342010023495, + 9.814488220852672, + 9.814488220852672, + 9.814488220852672, + 9.768168234007337, + 9.768168234007337, + 9.768168234007337, + 9.721848247162002, + 9.721848247162002, + 9.721848247162002, + 9.83688578566183, + 9.83688578566183, + 9.83688578566183, + 9.796158192529155, + 9.796158192529155, + 9.796158192529155, + 9.755430599396481, + 9.755430599396481, + 9.755430599396481, + 9.859914407678525, + 9.859914407678525, + 9.859914407678525, + 9.824936775404305, + 9.824936775404305, + 9.824936775404305, + 9.789959143130085, + 9.789959143130085, + 9.789959143130085, + 9.883484993637877, + 9.883484993637877, + 9.883484993637877, + 9.854392643886374, + 9.854392643886374, + 9.854392643886374, + 9.825300294134871, + 9.825300294134871, + 9.825300294134871, + 9.907506353521802, + 9.907506353521802, + 9.907506353521802, + 9.884411838942516, + 9.884411838942516, + 9.884411838942516, + 9.86131732436323, + 9.86131732436323, + 9.86131732436323, + 9.93188555335547, + 9.93188555335547, + 9.93188555335547, + 9.914878222138801, + 9.914878222138801, + 9.914878222138801, + 9.897870890922134, + 9.897870890922134, + 9.897870890922134, + 9.9565282747508, + 9.9565282747508, + 9.9565282747508, + 9.945673924957262, + 9.945673924957262, + 9.945673924957262, + 9.934819575163724, + 9.934819575163724, + 9.934819575163724, + 9.981339179805994, + 9.981339179805994, + 9.981339179805994, + 9.976679804806292, + 9.976679804806292, + 9.976679804806292, + 9.972020429806589, + 9.972020429806589, + 9.972020429806589, + 10.006222279949332, + 10.006222279949332, + 10.006222279949332, + 10.007775905960175, + 10.007775905960175, + 10.007775905960175, + 10.009329531971018, + 10.009329531971018, + 10.009329531971018, + 10.031081307300331, + 10.031081307300331, + 10.031081307300331, + 10.038841923644503, + 10.038841923644503, + 10.038841923644503, + 10.046602539988674, + 10.046602539988674, + 10.046602539988674, + 10.055820087111464, + 10.055820087111464, + 10.055820087111464, + 10.069757669471961, + 10.069757669471961, + 10.069757669471961, + 10.08369525183246, + 10.08369525183246, + 10.08369525183246, + 10.080342909849572, + 10.080342909849572, + 10.080342909849572, + 10.100403536427859, + 10.100403536427859, + 10.100403536427859, + 10.120464163006146, + 10.120464163006146, + 10.120464163006146, + 10.104554901477465, + 10.104554901477465, + 10.104554901477465, + 10.13066096160643, + 10.13066096160643, + 10.13066096160643, + 10.156767021735396, + 10.156767021735396, + 10.156767021735396, + 10.12836239050313, + 10.12836239050313, + 10.12836239050313, + 10.160412884907684, + 10.160412884907684, + 10.160412884907684, + 10.192463379312239, + 10.192463379312239, + 10.192463379312239, + 10.151673270376536, + 10.151673270376536, + 10.151673270376536, + 10.18954420192019, + 10.18954420192019, + 10.18954420192019, + 10.227415133463845, + 10.227415133463845, + 10.227415133463845, + 10.174397355831996, + 10.174397355831996, + 10.174397355831996, + 10.217942209237686, + 10.217942209237686, + 10.217942209237686, + 10.261487062643376, + 10.261487062643376, + 10.261487062643376, + 10.196446731797426, + 10.196446731797426, + 10.196446731797426, + 10.245497040486661, + 10.245497040486661, + 10.245497040486661, + 10.294547349175897, + 10.294547349175897, + 10.294547349175897, + 10.217736093520687, + 10.217736093520687, + 10.217736093520687, + 10.272102091378013, + 10.272102091378013, + 10.272102091378013, + 10.32646808923534, + 10.32646808923534, + 10.32646808923534, + 10.238183076597094, + 10.238183076597094, + 10.238183076597094, + 10.297654432138334, + 10.297654432138334, + 10.297654432138334, + 10.357125787679573, + 10.357125787679573, + 10.357125787679573, + 10.257708575621304, + 10.257708575621304, + 10.257708575621304, + 10.3220552057252, + 10.3220552057252, + 10.3220552057252, + 10.386401835829094, + 10.386401835829094, + 10.386401835829094, + 10.276237050230757, + 10.276237050230757, + 10.276237050230757, + 10.345210010285873, + 10.345210010285873, + 10.345210010285873, + 10.41418297034099, + 10.41418297034099, + 10.41418297034099, + 10.29369681735666, + 10.29369681735666, + 10.29369681735666, + 10.36702926437973, + 10.36702926437973, + 10.36702926437973, + 10.4403617114028, + 10.4403617114028, + 10.4403617114028, + 10.310020328551866, + 10.310020328551866, + 10.310020328551866, + 10.387428553551445, + 10.387428553551445, + 10.387428553551445, + 10.464836778551023, + 10.464836778551023, + 10.464836778551023, + 10.325144431322682, + 10.325144431322682, + 10.325144431322682, + 10.406328956914125, + 10.406328956914125, + 10.406328956914125, + 10.487513482505568, + 10.487513482505568, + 10.487513482505568, + 10.339010613453608, + 10.339010613453608, + 10.339010613453608, + 10.42365735247889, + 10.42365735247889, + 10.42365735247889, + 10.50830409150417, + 10.50830409150417, + 10.50830409150417, + 10.351565229379718, + 10.351565229379718, + 10.351565229379718, + 10.439346700049635, + 10.439346700049635, + 10.439346700049635, + 10.527128170719552, + 10.527128170719552, + 10.527128170719552, + 10.362759707730946, + 10.362759707730946, + 10.362759707730946, + 10.453336300588536, + 10.453336300588536, + 10.453336300588536, + 10.543912893446125, + 10.543912893446125, + 10.543912893446125, + 10.372550739245273, + 10.372550739245273, + 10.372550739245273, + 10.46557203104883, + 10.46557203104883, + 10.46557203104883, + 10.558593322852385, + 10.558593322852385, + 10.558593322852385, + 10.380900444323844, + 10.380900444323844, + 10.380900444323844, + 10.476006553766364, + 10.476006553766364, + 10.476006553766364, + 10.571112663208885, + 10.571112663208885, + 10.571112663208885, + 10.387776519579786, + 10.387776519579786, + 10.387776519579786, + 10.484599499599833, + 10.484599499599833, + 10.484599499599833, + 10.58142247961988, + 10.58142247961988, + 10.58142247961988, + 10.393152362813726, + 10.393152362813726, + 10.393152362813726, + 10.491317624111131, + 10.491317624111131, + 10.491317624111131, + 10.589482885408536, + 10.589482885408536, + 10.589482885408536, + 10.397007175932547, + 10.397007175932547, + 10.397007175932547, + 10.496134936181639, + 10.496134936181639, + 10.496134936181639, + 10.59526269643073, + 10.59526269643073, + 10.59526269643073, + 10.39932604541315, + 10.39932604541315, + 10.39932604541315, + 10.499032798566796, + 10.499032798566796, + 10.499032798566796, + 10.598739551720442, + 10.598739551720442, + 10.598739551720442 + ], + "y": [ + 0.1998, + 0, + -0.1998, + 0.1998, + 0, + -0.1998, + 0.1998, + 0, + -0.1998, + 0.19980000000000006, + 1.450702801059566e-19, + -0.19980000000000006, + 0.19980000000000006, + 1.8129252700069492e-19, + -0.19980000000000006, + 0.19980000000000006, + 2.175147738954332e-19, + -0.19980000000000006, + 0.19980000000000006, + 2.8965926100479374e-19, + -0.19980000000000006, + 0.19980000000000006, + 3.6198358036090243e-19, + -0.19980000000000006, + 0.19980000000000006, + 4.343078997170112e-19, + -0.19980000000000006, + 0.1998, + 4.332864156350074e-19, + -0.1998, + 0.1998, + 5.414726513809125e-19, + -0.1998, + 0.1998, + 6.496588871268177e-19, + -0.1998, + 0.19980000000000006, + 5.754727705709151e-19, + -0.19980000000000006, + 0.19980000000000006, + 7.19161172920413e-19, + -0.19980000000000006, + 0.19980000000000006, + 8.62849575269911e-19, + -0.19980000000000006, + 0.1998, + 7.157417061015363e-19, + -0.1998, + 0.1998, + 8.944535192471057e-19, + -0.1998, + 0.1998, + 1.0731653323926751e-18, + -0.1998, + 0.1998, + 8.536197839395183e-19, + -0.1998, + 0.1998, + 1.0667580404142914e-18, + -0.1998, + 0.1998, + 1.2798962968890646e-18, + -0.1998, + 0.1998, + 9.886376112942632e-19, + -0.1998, + 0.1998, + 1.2354881420823046e-18, + -0.1998, + 0.1998, + 1.482338672870346e-18, + -0.1998, + 0.1998, + 1.120330749627117e-18, + -0.1998, + 0.1998, + 1.4000634211786038e-18, + -0.1998, + 0.1998, + 1.6797960927300907e-18, + -0.1998, + 0.1998, + 1.2482406758765826e-18, + -0.1998, + 0.1998, + 1.5599108671289488e-18, + -0.1998, + 0.1998, + 1.871581058381315e-18, + -0.1998, + 0.1998, + 1.3719158032915468e-18, + -0.1998, + 0.1998, + 1.7144661375800382e-18, + -0.1998, + 0.1998, + 2.0570164718685294e-18, + -0.1998, + 0.1998, + 1.4909125682346906e-18, + -0.1998, + 0.1998, + 1.8631749165642194e-18, + -0.1998, + 0.1998, + 2.235437264893748e-18, + -0.1998, + 0.19979999999999998, + 1.6047965884093472e-18, + -0.19979999999999998, + 0.19979999999999998, + 2.005494361921198e-18, + -0.19979999999999998, + 0.19979999999999998, + 2.4061921354330492e-18, + -0.19979999999999998, + 0.1998, + 1.7131438969152746e-18, + -0.1998, + 0.1998, + 2.140894647482222e-18, + -0.1998, + 0.1998, + 2.5686453980491694e-18, + -0.1998, + 0.19980000000000006, + 1.815542255346483e-18, + -0.19980000000000006, + 0.19980000000000006, + 2.2688606040320988e-18, + -0.19980000000000006, + 0.19980000000000006, + 2.7221789527177145e-18, + -0.19980000000000006, + 0.1998, + 1.9115925478029915e-18, + -0.1998, + 0.1998, + 2.3888934613883966e-18, + -0.1998, + 0.1998, + 2.8661943749738016e-18, + -0.1998, + 0.19980000000000006, + 2.00091025619638e-18, + -0.19980000000000006, + 0.19980000000000006, + 2.500512692072452e-18, + -0.19980000000000006, + 0.19980000000000006, + 3.0001151279485245e-18, + -0.19980000000000006, + 0.1998, + 2.0831270155860576e-18, + -0.1998, + 0.1998, + 2.603257954993826e-18, + -0.1998, + 0.1998, + 3.1233888944015942e-18, + -0.1998, + 0.19980000000000006, + 2.1578922464934815e-18, + -0.19980000000000006, + 0.19980000000000006, + 2.6966911353330193e-18, + -0.19980000000000006, + 0.19980000000000006, + 3.235490024172557e-18, + -0.19980000000000006, + 0.19980000000000006, + 2.224874859211764e-18, + -0.19980000000000006, + 0.19980000000000006, + 2.7803984743961105e-18, + -0.19980000000000006, + 0.19980000000000006, + 3.335922089580457e-18, + -0.19980000000000006, + 0.1998, + 2.283765023071832e-18, + -0.1998, + 0.1998, + 2.8539927806446293e-18, + -0.1998, + 0.1998, + 3.4242205382174264e-18, + -0.1998, + 0.1998, + 2.334275991459107e-18, + -0.1998, + 0.1998, + 2.9171157103962864e-18, + -0.1998, + 0.1998, + 3.499955429333466e-18, + -0.1998, + 0.1998, + 2.3761459711216853e-18, + -0.1998, + 0.1998, + 2.9694401038761354e-18, + -0.1998, + 0.1998, + 3.562734236630585e-18, + -0.1998, + 0.1998, + 2.40914002200013e-18, + -0.1998, + 0.1998, + 3.0106723594103096e-18, + -0.1998, + 0.1998, + 3.612204696820489e-18, + -0.1998, + 0.1998, + 2.433051971477665e-18, + -0.1998, + 0.1998, + 3.0405548256406705e-18, + -0.1998, + 0.1998, + 3.648057679803676e-18, + -0.1998, + 0.19980000000000006, + 2.4477063246393184e-18, + -0.19980000000000006, + 0.19980000000000006, + 3.0588681887519596e-18, + -0.19980000000000006, + 0.19980000000000006, + 3.6700300528646004e-18, + -0.19980000000000006, + 0.1998, + 2.4529601498896593e-18, + -0.1998, + 0.1998, + 3.065433828904848e-18, + -0.1998, + 0.1998, + 3.677907507920037e-18, + -0.1998, + 0.1998, + 2.4487049171656292e-18, + -0.1998, + 0.1998, + 3.0601161174276803e-18, + -0.1998, + 0.1998, + 3.671527317689731e-18, + -0.1998, + 0.19980000000000006, + 2.434868264054633e-18, + -0.19980000000000006, + 0.19980000000000006, + 3.042824623912312e-18, + -0.19980000000000006, + 0.19980000000000006, + 3.650780983769991e-18, + -0.19980000000000006, + 0.1998, + 2.411415663452989e-18, + -0.1998, + 0.1998, + 3.0135162002661694e-18, + -0.1998, + 0.1998, + 3.61561673707935e-18, + -0.1998, + 0.19980000000000006, + 2.37835196504338e-18, + -0.19980000000000006, + 0.19980000000000006, + 2.972196907077455e-18, + -0.19980000000000006, + 0.19980000000000006, + 3.56604184911153e-18, + -0.19980000000000006, + 0.1998, + 2.3357227819001683e-18, + -0.1998, + 0.1998, + 2.9189237464385987e-18, + -0.1998, + 0.1998, + 3.502124710977029e-18, + -0.1998, + 0.1998, + 2.283615693015119e-18, + -0.1998, + 0.1998, + 2.853806164727718e-18, + -0.1998, + 0.1998, + 3.4239966364403166e-18, + -0.1998, + 0.1998, + 2.2221612325357463e-18, + -0.1998, + 0.1998, + 2.7770072888474675e-18, + -0.1998, + 0.1998, + 3.3318533451591887e-18, + -0.1998, + 0.1998, + 2.15153363708012e-18, + -0.1998, + 0.1998, + 2.6887448601351157e-18, + -0.1998, + 0.1998, + 3.2259560831901113e-18, + -0.1998, + 0.1998, + 2.0719513236822514e-18, + -0.1998, + 0.1998, + 2.5892918316449015e-18, + -0.1998, + 0.1998, + 3.1066323396075516e-18, + -0.1998, + 0.1998, + 1.983677072764084e-18, + -0.1998, + 0.1998, + 2.4789765968059034e-18, + -0.1998, + 0.1998, + 2.9742761208477227e-18, + -0.1998, + 0.19980000000000006, + 1.887017893043176e-18, + -0.19980000000000006, + 0.19980000000000006, + 2.3581828205988215e-18, + -0.19980000000000006, + 0.19980000000000006, + 2.829347748154467e-18, + -0.19980000000000006, + 0.1998, + 1.7823245484687493e-18, + -0.1998, + 0.1998, + 2.227348848373838e-18, + -0.1998, + 0.1998, + 2.672373148278927e-18, + -0.1998, + 0.1998, + 1.6699907311142484e-18, + -0.1998, + 0.1998, + 2.086966672224756e-18, + -0.1998, + 0.1998, + 2.5039426133352636e-18, + -0.1998, + 0.1998, + 1.5504518684006155e-18, + -0.1998, + 0.1998, + 1.9375804403906735e-18, + -0.1998, + 0.1998, + 2.3247090123807315e-18, + -0.1998, + 0.1998, + 1.4241835580175896e-18, + -0.1998, + 0.1998, + 1.779784501396638e-18, + -0.1998, + 0.1998, + 2.1353854447756864e-18, + -0.1998, + 0.1998, + 1.2916996293661993e-18, + -0.1998, + 0.1998, + 1.614220981462381e-18, + -0.1998, + 0.1998, + 1.9367423335585626e-18, + -0.1998, + 0.19979999999999998, + 1.1535498361568037e-18, + -0.19979999999999998, + 0.19979999999999998, + 1.441576900970759e-18, + -0.19979999999999998, + 0.19979999999999998, + 1.7296039657847142e-18, + -0.19979999999999998, + 0.1998, + 1.0103171908397094e-18, + -0.1998, + 0.1998, + 1.2625808433388041e-18, + -0.1998, + 0.1998, + 1.5148444958378989e-18, + -0.1998, + 0.19980000000000006, + 8.626149576783317e-19, + -0.19980000000000006, + 0.19980000000000006, + 1.0779991972985889e-18, + -0.19980000000000006, + 0.19980000000000006, + 1.2933834369188461e-18, + -0.19980000000000006, + 0.1998, + 7.110833273463834e-19, + -0.1998, + 0.1998, + 8.886320011826818e-19, + -0.1998, + 0.1998, + 1.0661806750189802e-18, + -0.1998, + 0.1998, + 5.563858017822906e-19, + -0.1998, + 0.1998, + 6.953084251215821e-19, + -0.1998, + 0.1998, + 8.342310484608735e-19, + -0.1998, + 0.1998, + 3.9920532350606247e-19, + -0.1998, + 0.1998, + 4.988819338991048e-19, + -0.1998, + 0.1998, + 5.985585442921472e-19, + -0.1998, + 0.1998, + 2.402401885422662e-19, + -0.1998, + 0.1998, + 3.0022517938298623e-19, + -0.1998, + 0.1998, + 3.6021017022370626e-19, + -0.1998, + 0.1998, + 8.019978635358806e-20, + -0.1998, + 0.1998, + 1.0022467677279202e-19, + -0.1998, + 0.1998, + 1.2024956719199598e-19, + -0.1998, + 0.1998, + -8.019978635358628e-20, + -0.1998, + 0.1998, + -1.0022467677278979e-19, + -0.1998, + 0.1998, + -1.202495671919933e-19, + -0.1998, + 0.1998, + -2.4024018854226553e-19, + -0.1998, + 0.1998, + -3.0022517938298546e-19, + -0.1998, + 0.1998, + -3.602101702237054e-19, + -0.1998, + 0.19980000000000006, + -3.99205323506062e-19, + -0.19980000000000006, + 0.19980000000000006, + -4.988819338991041e-19, + -0.19980000000000006, + 0.19980000000000006, + -5.985585442921461e-19, + -0.19980000000000006, + 0.1998, + -5.56385801782289e-19, + -0.1998, + 0.1998, + -6.953084251215798e-19, + -0.1998, + 0.1998, + -8.342310484608705e-19, + -0.1998, + 0.19980000000000006, + -7.110833273463814e-19, + -0.19980000000000006, + 0.19980000000000006, + -8.886320011826797e-19, + -0.19980000000000006, + 0.19980000000000006, + -1.066180675018978e-18, + -0.19980000000000006, + 0.1998, + -8.626149576783313e-19, + -0.1998, + 0.1998, + -1.0779991972985881e-18, + -0.1998, + 0.1998, + -1.293383436918845e-18, + -0.1998, + 0.19980000000000006, + -1.010317190839708e-18, + -0.19980000000000006, + 0.19980000000000006, + -1.262580843338802e-18, + -0.19980000000000006, + 0.19980000000000006, + -1.514844495837896e-18, + -0.19980000000000006, + 0.1998, + -1.1535498361568024e-18, + -0.1998, + 0.1998, + -1.441576900970757e-18, + -0.1998, + 0.1998, + -1.7296039657847117e-18, + -0.1998, + 0.1998, + -1.291699629366199e-18, + -0.1998, + 0.1998, + -1.6142209814623802e-18, + -0.1998, + 0.1998, + -1.9367423335585615e-18, + -0.1998, + 0.1998, + -1.4241835580175896e-18, + -0.1998, + 0.1998, + -1.7797845013966372e-18, + -0.1998, + 0.1998, + -2.135385444775685e-18, + -0.1998, + 0.19980000000000006, + -1.5504518684006151e-18, + -0.19980000000000006, + 0.19980000000000006, + -1.9375804403906716e-18, + -0.19980000000000006, + 0.19980000000000006, + -2.324709012380728e-18, + -0.19980000000000006, + 0.19980000000000006, + -1.669990731114249e-18, + -0.19980000000000006, + 0.19980000000000006, + -2.0869666722247545e-18, + -0.19980000000000006, + 0.19980000000000006, + -2.50394261333526e-18, + -0.19980000000000006, + 0.19980000000000006, + -1.7823245484687493e-18, + -0.19980000000000006, + 0.19980000000000006, + -2.2273488483738374e-18, + -0.19980000000000006, + 0.19980000000000006, + -2.6723731482789255e-18, + -0.19980000000000006, + 0.1998, + -1.887017893043176e-18, + -0.1998, + 0.1998, + -2.3581828205988196e-18, + -0.1998, + 0.1998, + -2.8293477481544632e-18, + -0.1998, + 0.1998, + -1.983677072764084e-18, + -0.1998, + 0.1998, + -2.4789765968059026e-18, + -0.1998, + 0.1998, + -2.974276120847721e-18, + -0.1998, + 0.1998, + -2.0719513236822514e-18, + -0.1998, + 0.1998, + -2.5892918316449004e-18, + -0.1998, + 0.1998, + -3.1066323396075493e-18, + -0.1998, + 0.1998, + -2.1515336370801206e-18, + -0.1998, + 0.1998, + -2.6887448601351154e-18, + -0.1998, + 0.1998, + -3.22595608319011e-18, + -0.1998, + 0.1998, + -2.2221612325357467e-18, + -0.1998, + 0.1998, + -2.777007288847467e-18, + -0.1998, + 0.1998, + -3.3318533451591875e-18, + -0.1998, + 0.19980000000000006, + -2.28361569301512e-18, + -0.19980000000000006, + 0.19980000000000006, + -2.8538061647277174e-18, + -0.19980000000000006, + 0.19980000000000006, + -3.423996636440315e-18, + -0.19980000000000006, + 0.1998, + -2.3357227819001683e-18, + -0.1998, + 0.1998, + -2.918923746438598e-18, + -0.1998, + 0.1998, + -3.502124710977028e-18, + -0.1998, + 0.1998, + -2.3783519650433807e-18, + -0.1998, + 0.1998, + -2.9721969070774545e-18, + -0.1998, + 0.1998, + -3.566041849111528e-18, + -0.1998, + 0.1998, + -2.411415663452989e-18, + -0.1998, + 0.1998, + -3.0135162002661687e-18, + -0.1998, + 0.1998, + -3.615616737079348e-18, + -0.1998, + 0.1998, + -2.434868264054633e-18, + -0.1998, + 0.1998, + -3.042824623912312e-18, + -0.1998, + 0.1998, + -3.650780983769991e-18, + -0.1998, + 0.19980000000000006, + -2.448704917165629e-18, + -0.19980000000000006, + 0.19980000000000006, + -3.0601161174276795e-18, + -0.19980000000000006, + 0.19980000000000006, + -3.67152731768973e-18, + -0.19980000000000006, + 0.1998, + -2.4529601498896593e-18, + -0.1998, + 0.1998, + -3.065433828904848e-18, + -0.1998, + 0.1998, + -3.677907507920037e-18, + -0.1998, + 0.19980000000000006, + -2.4477063246393184e-18, + -0.19980000000000006, + 0.19980000000000006, + -3.0588681887519596e-18, + -0.19980000000000006, + 0.19980000000000006, + -3.670030052864601e-18, + -0.19980000000000006, + 0.1998, + -2.4330519714776644e-18, + -0.1998, + 0.1998, + -3.0405548256406705e-18, + -0.1998, + 0.1998, + -3.648057679803676e-18, + -0.1998, + 0.19980000000000006, + -2.409140022000129e-18, + -0.19980000000000006, + 0.19980000000000006, + -3.0106723594103096e-18, + -0.19980000000000006, + 0.19980000000000006, + -3.61220469682049e-18, + -0.19980000000000006, + 0.19980000000000006, + -2.376145971121685e-18, + -0.19980000000000006, + 0.19980000000000006, + -2.9694401038761354e-18, + -0.19980000000000006, + 0.19980000000000006, + -3.562734236630586e-18, + -0.19980000000000006, + 0.19980000000000006, + -2.3342759914591063e-18, + -0.19980000000000006, + 0.19980000000000006, + -2.9171157103962868e-18, + -0.19980000000000006, + 0.19980000000000006, + -3.499955429333467e-18, + -0.19980000000000006, + 0.1998, + -2.2837650230718313e-18, + -0.1998, + 0.1998, + -2.8539927806446297e-18, + -0.1998, + 0.1998, + -3.424220538217428e-18, + -0.1998, + 0.19980000000000006, + -2.2248748592117638e-18, + -0.19980000000000006, + 0.19980000000000006, + -2.7803984743961105e-18, + -0.19980000000000006, + 0.19980000000000006, + -3.3359220895804572e-18, + -0.19980000000000006, + 0.19980000000000006, + -2.157892246493481e-18, + -0.19980000000000006, + 0.19980000000000006, + -2.6966911353330205e-18, + -0.19980000000000006, + 0.19980000000000006, + -3.23549002417256e-18, + -0.19980000000000006, + 0.1998, + -2.0831270155860576e-18, + -0.1998, + 0.1998, + -2.6032579549938263e-18, + -0.1998, + 0.1998, + -3.123388894401595e-18, + -0.1998, + 0.1998, + -2.000910256196379e-18, + -0.1998, + 0.1998, + -2.5005126920724533e-18, + -0.1998, + 0.1998, + -3.0001151279485275e-18, + -0.1998, + 0.19980000000000006, + -1.9115925478029907e-18, + -0.19980000000000006, + 0.19980000000000006, + -2.3888934613883973e-18, + -0.19980000000000006, + 0.19980000000000006, + -2.866194374973804e-18, + -0.19980000000000006, + 0.1998, + -1.815542255346483e-18, + -0.1998, + 0.1998, + -2.2688606040320996e-18, + -0.1998, + 0.1998, + -2.722178952717716e-18, + -0.1998, + 0.19980000000000006, + -1.7131438969152744e-18, + -0.19980000000000006, + 0.19980000000000006, + -2.140894647482224e-18, + -0.19980000000000006, + 0.19980000000000006, + -2.5686453980491732e-18, + -0.19980000000000006, + 0.19980000000000006, + -1.6047965884093472e-18, + -0.19980000000000006, + 0.19980000000000006, + -2.0054943619211993e-18, + -0.19980000000000006, + 0.19980000000000006, + -2.4061921354330515e-18, + -0.19980000000000006, + 0.19979999999999998, + -1.4909125682346904e-18, + -0.19979999999999998, + 0.19979999999999998, + -1.86317491656422e-18, + -0.19979999999999998, + 0.19979999999999998, + -2.2354372648937497e-18, + -0.19979999999999998, + 0.19979999999999998, + -1.3719158032915474e-18, + -0.19979999999999998, + 0.19979999999999998, + -1.7144661375800401e-18, + -0.19979999999999998, + 0.19979999999999998, + -2.057016471868533e-18, + -0.19979999999999998, + 0.1998, + -1.2482406758765834e-18, + -0.1998, + 0.1998, + -1.55991086712895e-18, + -0.1998, + 0.1998, + -1.8715810583813166e-18, + -0.1998, + 0.1998, + -1.1203307496271174e-18, + -0.1998, + 0.1998, + -1.400063421178604e-18, + -0.1998, + 0.1998, + -1.6797960927300907e-18, + -0.1998, + 0.1998, + -9.88637611294264e-19, + -0.1998, + 0.1998, + -1.2354881420823065e-18, + -0.1998, + 0.1998, + -1.482338672870349e-18, + -0.1998, + 0.1998, + -8.536197839395187e-19, + -0.1998, + 0.1998, + -1.0667580404142924e-18, + -0.1998, + 0.1998, + -1.279896296889066e-18, + -0.1998, + 0.1998, + -7.157417061015361e-19, + -0.1998, + 0.1998, + -8.94453519247106e-19, + -0.1998, + 0.1998, + -1.0731653323926757e-18, + -0.1998, + 0.1998, + -5.754727705709163e-19, + -0.1998, + 0.1998, + -7.191611729204148e-19, + -0.1998, + 0.1998, + -8.628495752699132e-19, + -0.1998, + 0.1998, + -4.3328641563500816e-19, + -0.1998, + 0.1998, + -5.414726513809133e-19, + -0.1998, + 0.1998, + -6.496588871268184e-19, + -0.1998, + 0.1998, + -2.896592610047957e-19, + -0.1998, + 0.1998, + -3.6198358036090503e-19, + -0.1998, + 0.1998, + -4.343078997170143e-19, + -0.1998, + 0.1998, + -1.4507028010595793e-19, + -0.1998, + 0.1998, + -1.8129252700069658e-19, + -0.1998, + 0.1998, + -2.175147738954352e-19, + -0.1998 + ], + "z": [ + 1.2234221523482058e-17, + 0, + -1.2234221523482058e-17, + 1.2234221523482058e-17, + 0, + -1.2234221523482058e-17, + 1.2234221523482058e-17, + 0, + -1.2234221523482058e-17, + -0.024874071936335344, + -0.024874071936335358, + -0.02487407193633537, + -0.03108481871574025, + -0.031084818715740262, + -0.031084818715740276, + -0.03729556549514516, + -0.03729556549514517, + -0.037295565495145185, + -0.04965191092056505, + -0.04965191092056506, + -0.049651910920565076, + -0.062049376306629656, + -0.06204937630662967, + -0.06204937630662968, + -0.07444684169269426, + -0.07444684169269428, + -0.07444684169269429, + -0.07423765630718024, + -0.07423765630718025, + -0.07423765630718027, + -0.09277387691474662, + -0.09277387691474663, + -0.09277387691474664, + -0.111310097522313, + -0.11131009752231301, + -0.11131009752231302, + -0.09853619062348372, + -0.09853619062348373, + -0.09853619062348375, + -0.12313945341600066, + -0.12313945341600067, + -0.12313945341600069, + -0.14774271620851762, + -0.14774271620851762, + -0.14774271620851762, + -0.1224535075606137, + -0.12245350756061371, + -0.12245350756061373, + -0.15302862729394365, + -0.15302862729394365, + -0.15302862729394365, + -0.18360374702727358, + -0.18360374702727358, + -0.18360374702727358, + -0.14589707566569032, + -0.14589707566569032, + -0.14589707566569032, + -0.1823257631413276, + -0.1823257631413276, + -0.1823257631413276, + -0.21875445061696486, + -0.21875445061696486, + -0.21875445061696486, + -0.1687761963280311, + -0.1687761963280311, + -0.1687761963280311, + -0.21091751603103112, + -0.21091751603103112, + -0.21091751603103112, + -0.25305883573403115, + -0.25305883573403115, + -0.25305883573403115, + -0.19100235467445592, + -0.19100235467445592, + -0.19100235467445592, + -0.2386932700255635, + -0.2386932700255635, + -0.2386932700255635, + -0.2863841853766711, + -0.2863841853766711, + -0.2863841853766711, + -0.21248956201613572, + -0.21248956201613572, + -0.21248956201613572, + -0.2655455661286375, + -0.2655455661286375, + -0.2655455661286375, + -0.3186015702411393, + -0.3186015702411393, + -0.3186015702411393, + -0.23315468852212498, + -0.23315468852212498, + -0.23315468852212498, + -0.29137051802315045, + -0.29137051802315045, + -0.29137051802315045, + -0.34958634752417594, + -0.34958634752417594, + -0.34958634752417594, + -0.25291778483252797, + -0.25291778483252797, + -0.25291778483252797, + -0.31606821398716317, + -0.31606821398716317, + -0.31606821398716317, + -0.3792186431417984, + -0.3792186431417984, + -0.3792186431417984, + -0.271702391367041, + -0.271702391367041, + -0.271702391367041, + -0.33954310343294297, + -0.33954310343294297, + -0.33954310343294297, + -0.40738381549884495, + -0.40738381549884495, + -0.40738381549884495, + -0.28943583413221463, + -0.28943583413221463, + -0.28943583413221463, + -0.36170436657362487, + -0.36170436657362487, + -0.36170436657362487, + -0.4339728990150351, + -0.4339728990150351, + -0.4339728990150351, + -0.3060495058830165, + -0.3060495058830165, + -0.3060495058830165, + -0.3824662657873238, + -0.3824662657873238, + -0.3824662657873238, + -0.4588830256916311, + -0.4588830256916311, + -0.4588830256916311, + -0.3214791315509341, + -0.3214791315509341, + -0.3214791315509341, + -0.4017484773193378, + -0.4017484773193378, + -0.4017484773193378, + -0.48201782308774155, + -0.48201782308774155, + -0.48201782308774155, + -0.3356650169117283, + -0.3356650169117283, + -0.3356650169117283, + -0.4194764020391506, + -0.4194764020391506, + -0.4194764020391506, + -0.5032877871665729, + -0.5032877871665729, + -0.5032877871665729, + -0.34855227953079015, + -0.34855227953079015, + -0.34855227953079015, + -0.4355814540499752, + -0.4355814540499752, + -0.4355814540499752, + -0.5226106285691603, + -0.5226106285691603, + -0.5226106285691603, + -0.36009106109261885, + -0.36009106109261885, + -0.36009106109261885, + -0.450001326034265, + -0.450001326034265, + -0.450001326034265, + -0.5399115909759111, + -0.5399115909759111, + -0.5399115909759111, + -0.37023672029295834, + -0.37023672029295834, + -0.37023672029295834, + -0.46268023030862077, + -0.46268023030862077, + -0.46268023030862077, + -0.5551237403242832, + -0.5551237403242832, + -0.5551237403242832, + -0.37895000554733116, + -0.37895000554733116, + -0.37895000554733116, + -0.47356911465550006, + -0.47356911465550006, + -0.47356911465550006, + -0.568188223763669, + -0.568188223763669, + -0.568188223763669, + -0.3861972068477936, + -0.3861972068477936, + -0.3861972068477936, + -0.4826258520967178, + -0.4826258520967178, + -0.4826258520967178, + -0.5790544973456421, + -0.5790544973456421, + -0.5790544973456421, + -0.39195028618040756, + -0.39195028618040756, + -0.39195028618040756, + -0.4898154038745408, + -0.4898154038745408, + -0.4898154038745408, + -0.587680521568674, + -0.587680521568674, + -0.587680521568674, + -0.39618698599886976, + -0.39618698599886976, + -0.39618698599886976, + -0.49510995500983473, + -0.49510995500983473, + -0.49510995500983473, + -0.5940329240207998, + -0.5940329240207998, + -0.5940329240207998, + -0.3988909153346343, + -0.3988909153346343, + -0.3988909153346343, + -0.49848902191281463, + -0.49848902191281463, + -0.49848902191281463, + -0.598087128490995, + -0.598087128490995, + -0.598087128490995, + -0.40005161321038585, + -0.40005161321038585, + -0.40005161321038585, + -0.49993953163007476, + -0.49993953163007476, + -0.49993953163007476, + -0.5998274500497637, + -0.5998274500497637, + -0.5998274500497637, + -0.3996645891115286, + -0.3996645891115286, + -0.3996645891115286, + -0.4994558724213054, + -0.4994558724213054, + -0.4994558724213054, + -0.5992471557310822, + -0.5992471557310822, + -0.5992471557310822, + -0.39773134035911506, + -0.39773134035911506, + -0.39773134035911506, + -0.4970399154700263, + -0.4970399154700263, + -0.4970399154700263, + -0.5963484905809375, + -0.5963484905809375, + -0.5963484905809375, + -0.3942593463170014, + -0.3942593463170014, + -0.3942593463170014, + -0.49270100764434066, + -0.49270100764434066, + -0.49270100764434066, + -0.5911426689716799, + -0.5911426689716799, + -0.5911426689716799, + -0.38926203945564214, + -0.38926203945564214, + -0.38926203945564214, + -0.48645593533571874, + -0.48645593533571874, + -0.48645593533571874, + -0.5836498312157954, + -0.5836498312157954, + -0.5836498312157954, + -0.382758753384471, + -0.382758753384471, + -0.382758753384471, + -0.47832885951570986, + -0.47832885951570986, + -0.47832885951570986, + -0.5738989656469486, + -0.5738989656469486, + -0.5738989656469486, + -0.3747746480539224, + -0.3747746480539224, + -0.3747746480539224, + -0.46835122226183756, + -0.46835122226183756, + -0.46835122226183756, + -0.5619277964697527, + -0.5619277964697527, + -0.5619277964697527, + -0.3653406124164704, + -0.3653406124164704, + -0.3653406124164704, + -0.4565616251143094, + -0.4565616251143094, + -0.4565616251143094, + -0.5477826378121484, + -0.5477826378121484, + -0.5477826378121484, + -0.3544931449232728, + -0.3544931449232728, + -0.3544931449232728, + -0.44300567973415744, + -0.44300567973415744, + -0.44300567973415744, + -0.5315182145450421, + -0.5315182145450421, + -0.5315182145450421, + -0.34227421231875366, + -0.34227421231875366, + -0.34227421231875366, + -0.4277358314405819, + -0.4277358314405819, + -0.4277358314405819, + -0.5131974505624102, + -0.5131974505624102, + -0.5131974505624102, + -0.32873108727942235, + -0.32873108727942235, + -0.32873108727942235, + -0.4108111563102004, + -0.4108111563102004, + -0.4108111563102004, + -0.4928912253409784, + -0.4928912253409784, + -0.4928912253409784, + -0.31391616552507107, + -0.31391616552507107, + -0.31391616552507107, + -0.39229713262318305, + -0.39229713262318305, + -0.39229713262318305, + -0.47067809972129504, + -0.47067809972129504, + -0.47067809972129504, + -0.2978867631099143, + -0.2978867631099143, + -0.2978867631099143, + -0.37226538754050775, + -0.37226538754050775, + -0.37226538754050775, + -0.4466440119711012, + -0.4466440119711012, + -0.4466440119711012, + -0.28070489467790916, + -0.28070489467790916, + -0.28070489467790916, + -0.35079341999238833, + -0.35079341999238833, + -0.35079341999238833, + -0.4208819453068675, + -0.4208819453068675, + -0.4208819453068675, + -0.262437033540146, + -0.262437033540146, + -0.262437033540146, + -0.32796430084997, + -0.32796430084997, + -0.32796430084997, + -0.393491568159794, + -0.393491568159794, + -0.393491568159794, + -0.24315385450252083, + -0.24315385450252083, + -0.24315385450252083, + -0.303866351540266, + -0.303866351540266, + -0.303866351540266, + -0.36457884857801115, + -0.36457884857801115, + -0.36457884857801115, + -0.22292996043864097, + -0.22292996043864097, + -0.22292996043864097, + -0.2785928023477143, + -0.2785928023477143, + -0.2785928023477143, + -0.3342556442567876, + -0.3342556442567876, + -0.3342556442567876, + -0.20184359366580082, + -0.20184359366580082, + -0.20184359366580082, + -0.25224143172431995, + -0.25224143172431995, + -0.25224143172431995, + -0.30263926978283906, + -0.30263926978283906, + -0.30263926978283906, + -0.17997633324065518, + -0.17997633324065518, + -0.17997633324065518, + -0.22491418800381802, + -0.22491418800381802, + -0.22491418800381802, + -0.2698520427669808, + -0.2698520427669808, + -0.2698520427669808, + -0.15741277934569775, + -0.15741277934569775, + -0.15741277934569775, + -0.19671679498337635, + -0.19671679498337635, + -0.19671679498337635, + -0.23602081062105496, + -0.23602081062105496, + -0.23602081062105496, + -0.13424022598758978, + -0.13424022598758978, + -0.13424022598758978, + -0.1677583428987625, + -0.1677583428987625, + -0.1677583428987625, + -0.20127645980993525, + -0.20127645980993525, + -0.20127645980993525, + -0.11054832327360727, + -0.11054832327360728, + -0.1105483232736073, + -0.13815086637541524, + -0.13815086637541524, + -0.13815086637541524, + -0.1657534094772232, + -0.1657534094772232, + -0.1657534094772232, + -0.08642873057279117, + -0.08642873057279118, + -0.0864287305727912, + -0.1080089109882419, + -0.10800891098824192, + -0.10800891098824193, + -0.12958909140369265, + -0.12958909140369265, + -0.12958909140369265, + -0.061974761903655265, + -0.06197476190365528, + -0.06197476190365529, + -0.07744909010704233, + -0.07744909010704235, + -0.07744909010704236, + -0.0929234183104294, + -0.09292341831042941, + -0.09292341831042943, + -0.037281024920377076, + -0.03728102492037709, + -0.037281024920377104, + -0.04658963374203584, + -0.046589633742035855, + -0.04658963374203587, + -0.055898242563694606, + -0.05589824256369462, + -0.05589824256369463, + -0.01244305489416185, + -0.012443054894161863, + -0.012443054894161875, + -0.015549931134918586, + -0.015549931134918598, + -0.01554993113491861, + -0.01865680737567532, + -0.018656807375675336, + -0.01865680737567535, + 0.0124430548941616, + 0.012443054894161587, + 0.012443054894161575, + 0.015549931134918265, + 0.015549931134918253, + 0.015549931134918241, + 0.018656807375674933, + 0.01865680737567492, + 0.018656807375674905, + 0.03728102492037701, + 0.03728102492037699, + 0.03728102492037698, + 0.04658963374203575, + 0.04658963374203574, + 0.04658963374203572, + 0.055898242563694495, + 0.05589824256369448, + 0.05589824256369447, + 0.061974761903655196, + 0.06197476190365518, + 0.06197476190365517, + 0.07744909010704223, + 0.07744909010704222, + 0.0774490901070422, + 0.09292341831042927, + 0.09292341831042926, + 0.09292341831042925, + 0.08642873057279092, + 0.08642873057279091, + 0.0864287305727909, + 0.10800891098824159, + 0.10800891098824157, + 0.10800891098824156, + 0.12958909140369224, + 0.12958909140369224, + 0.12958909140369224, + 0.11054832327360702, + 0.110548323273607, + 0.11054832327360699, + 0.1381508663754149, + 0.1381508663754149, + 0.1381508663754149, + 0.1657534094772228, + 0.1657534094772228, + 0.1657534094772228, + 0.13424022598758967, + 0.13424022598758967, + 0.13424022598758967, + 0.1677583428987624, + 0.1677583428987624, + 0.1677583428987624, + 0.20127645980993514, + 0.20127645980993514, + 0.20127645980993514, + 0.1574127793456975, + 0.1574127793456975, + 0.1574127793456975, + 0.19671679498337605, + 0.19671679498337605, + 0.19671679498337605, + 0.2360208106210546, + 0.2360208106210546, + 0.2360208106210546, + 0.17997633324065493, + 0.17997633324065493, + 0.17997633324065493, + 0.2249141880038177, + 0.2249141880038177, + 0.2249141880038177, + 0.2698520427669805, + 0.2698520427669805, + 0.2698520427669805, + 0.20184359366580074, + 0.20184359366580074, + 0.20184359366580074, + 0.25224143172431984, + 0.25224143172431984, + 0.25224143172431984, + 0.30263926978283895, + 0.30263926978283895, + 0.30263926978283895, + 0.22292996043864088, + 0.22292996043864088, + 0.22292996043864088, + 0.27859280234771416, + 0.27859280234771416, + 0.27859280234771416, + 0.33425564425678744, + 0.33425564425678744, + 0.33425564425678744, + 0.2431538545025206, + 0.2431538545025206, + 0.2431538545025206, + 0.3038663515402657, + 0.3038663515402657, + 0.3038663515402657, + 0.3645788485780108, + 0.3645788485780108, + 0.3645788485780108, + 0.2624370335401458, + 0.2624370335401458, + 0.2624370335401458, + 0.3279643008499698, + 0.3279643008499698, + 0.3279643008499698, + 0.3934915681597938, + 0.3934915681597938, + 0.3934915681597938, + 0.28070489467790904, + 0.28070489467790904, + 0.28070489467790904, + 0.3507934199923882, + 0.3507934199923882, + 0.3507934199923882, + 0.4208819453068674, + 0.4208819453068674, + 0.4208819453068674, + 0.2978867631099141, + 0.2978867631099141, + 0.2978867631099141, + 0.3722653875405075, + 0.3722653875405075, + 0.3722653875405075, + 0.4466440119711009, + 0.4466440119711009, + 0.4466440119711009, + 0.31391616552507096, + 0.31391616552507096, + 0.31391616552507096, + 0.39229713262318294, + 0.39229713262318294, + 0.39229713262318294, + 0.47067809972129493, + 0.47067809972129493, + 0.47067809972129493, + 0.32873108727942213, + 0.32873108727942213, + 0.32873108727942213, + 0.41081115631020015, + 0.41081115631020015, + 0.41081115631020015, + 0.4928912253409782, + 0.4928912253409782, + 0.4928912253409782, + 0.3422742123187536, + 0.3422742123187536, + 0.3422742123187536, + 0.42773583144058186, + 0.42773583144058186, + 0.42773583144058186, + 0.5131974505624102, + 0.5131974505624102, + 0.5131974505624102, + 0.3544931449232727, + 0.3544931449232727, + 0.3544931449232727, + 0.4430056797341574, + 0.4430056797341574, + 0.4430056797341574, + 0.531518214545042, + 0.531518214545042, + 0.531518214545042, + 0.3653406124164703, + 0.3653406124164703, + 0.3653406124164703, + 0.4565616251143093, + 0.4565616251143093, + 0.4565616251143093, + 0.5477826378121483, + 0.5477826378121483, + 0.5477826378121483, + 0.3747746480539223, + 0.3747746480539223, + 0.3747746480539223, + 0.46835122226183745, + 0.46835122226183745, + 0.46835122226183745, + 0.5619277964697525, + 0.5619277964697525, + 0.5619277964697525, + 0.38275875338447096, + 0.38275875338447096, + 0.38275875338447096, + 0.47832885951570975, + 0.47832885951570975, + 0.47832885951570975, + 0.5738989656469485, + 0.5738989656469485, + 0.5738989656469485, + 0.3892620394556421, + 0.3892620394556421, + 0.3892620394556421, + 0.4864559353357187, + 0.4864559353357187, + 0.4864559353357187, + 0.5836498312157953, + 0.5836498312157953, + 0.5836498312157953, + 0.3942593463170014, + 0.3942593463170014, + 0.3942593463170014, + 0.49270100764434066, + 0.49270100764434066, + 0.49270100764434066, + 0.5911426689716799, + 0.5911426689716799, + 0.5911426689716799, + 0.39773134035911495, + 0.39773134035911495, + 0.39773134035911495, + 0.49703991547002624, + 0.49703991547002624, + 0.49703991547002624, + 0.5963484905809375, + 0.5963484905809375, + 0.5963484905809375, + 0.3996645891115286, + 0.3996645891115286, + 0.3996645891115286, + 0.4994558724213054, + 0.4994558724213054, + 0.4994558724213054, + 0.5992471557310822, + 0.5992471557310822, + 0.5992471557310822, + 0.40005161321038585, + 0.40005161321038585, + 0.40005161321038585, + 0.49993953163007476, + 0.49993953163007476, + 0.49993953163007476, + 0.5998274500497637, + 0.5998274500497637, + 0.5998274500497637, + 0.3988909153346343, + 0.3988909153346343, + 0.3988909153346343, + 0.4984890219128147, + 0.4984890219128147, + 0.4984890219128147, + 0.5980871284909951, + 0.5980871284909951, + 0.5980871284909951, + 0.39618698599886976, + 0.39618698599886976, + 0.39618698599886976, + 0.49510995500983473, + 0.49510995500983473, + 0.49510995500983473, + 0.5940329240207998, + 0.5940329240207998, + 0.5940329240207998, + 0.39195028618040756, + 0.39195028618040756, + 0.39195028618040756, + 0.4898154038745408, + 0.4898154038745408, + 0.4898154038745408, + 0.5876805215686741, + 0.5876805215686741, + 0.5876805215686741, + 0.38619720684779363, + 0.38619720684779363, + 0.38619720684779363, + 0.4826258520967179, + 0.4826258520967179, + 0.4826258520967179, + 0.5790544973456422, + 0.5790544973456422, + 0.5790544973456422, + 0.37895000554733116, + 0.37895000554733116, + 0.37895000554733116, + 0.4735691146555001, + 0.4735691146555001, + 0.4735691146555001, + 0.5681882237636691, + 0.5681882237636691, + 0.5681882237636691, + 0.37023672029295834, + 0.37023672029295834, + 0.37023672029295834, + 0.46268023030862077, + 0.46268023030862077, + 0.46268023030862077, + 0.5551237403242832, + 0.5551237403242832, + 0.5551237403242832, + 0.36009106109261896, + 0.36009106109261896, + 0.36009106109261896, + 0.4500013260342651, + 0.4500013260342651, + 0.4500013260342651, + 0.5399115909759113, + 0.5399115909759113, + 0.5399115909759113, + 0.3485522795307902, + 0.3485522795307902, + 0.3485522795307902, + 0.4355814540499753, + 0.4355814540499753, + 0.4355814540499753, + 0.5226106285691603, + 0.5226106285691603, + 0.5226106285691603, + 0.33566501691172845, + 0.33566501691172845, + 0.33566501691172845, + 0.4194764020391508, + 0.4194764020391508, + 0.4194764020391508, + 0.5032877871665732, + 0.5032877871665732, + 0.5032877871665732, + 0.3214791315509342, + 0.3214791315509342, + 0.3214791315509342, + 0.401748477319338, + 0.401748477319338, + 0.401748477319338, + 0.48201782308774177, + 0.48201782308774177, + 0.48201782308774177, + 0.3060495058830166, + 0.3060495058830166, + 0.3060495058830166, + 0.3824662657873239, + 0.3824662657873239, + 0.3824662657873239, + 0.4588830256916312, + 0.4588830256916312, + 0.4588830256916312, + 0.28943583413221485, + 0.28943583413221485, + 0.28943583413221485, + 0.36170436657362515, + 0.36170436657362515, + 0.36170436657362515, + 0.43397289901503544, + 0.43397289901503544, + 0.43397289901503544, + 0.2717023913670411, + 0.2717023913670411, + 0.2717023913670411, + 0.33954310343294314, + 0.33954310343294314, + 0.33954310343294314, + 0.40738381549884517, + 0.40738381549884517, + 0.40738381549884517, + 0.252917784832528, + 0.252917784832528, + 0.252917784832528, + 0.3160682139871633, + 0.3160682139871633, + 0.3160682139871633, + 0.37921864314179854, + 0.37921864314179854, + 0.37921864314179854, + 0.2331546885221252, + 0.2331546885221252, + 0.2331546885221252, + 0.2913705180231507, + 0.2913705180231507, + 0.2913705180231507, + 0.3495863475241762, + 0.3495863475241762, + 0.3495863475241762, + 0.2124895620161359, + 0.2124895620161359, + 0.2124895620161359, + 0.2655455661286377, + 0.2655455661286377, + 0.2655455661286377, + 0.31860157024113955, + 0.31860157024113955, + 0.31860157024113955, + 0.19100235467445598, + 0.19100235467445598, + 0.19100235467445598, + 0.23869327002556356, + 0.23869327002556356, + 0.23869327002556356, + 0.28638418537667115, + 0.28638418537667115, + 0.28638418537667115, + 0.16877619632803137, + 0.16877619632803137, + 0.16877619632803137, + 0.21091751603103145, + 0.21091751603103145, + 0.21091751603103145, + 0.25305883573403154, + 0.25305883573403154, + 0.25305883573403154, + 0.14589707566569046, + 0.14589707566569046, + 0.14589707566569046, + 0.18232576314132776, + 0.18232576314132776, + 0.18232576314132776, + 0.21875445061696505, + 0.21875445061696505, + 0.21875445061696505, + 0.12245350756061374, + 0.12245350756061373, + 0.12245350756061371, + 0.15302862729394368, + 0.15302862729394368, + 0.15302862729394368, + 0.1836037470272736, + 0.1836037470272736, + 0.1836037470272736, + 0.098536190623484, + 0.09853619062348398, + 0.09853619062348397, + 0.123139453416001, + 0.12313945341600098, + 0.12313945341600097, + 0.14774271620851798, + 0.14774271620851798, + 0.14774271620851798, + 0.07423765630718038, + 0.07423765630718036, + 0.07423765630718035, + 0.09277387691474678, + 0.09277387691474677, + 0.09277387691474676, + 0.11131009752231319, + 0.11131009752231318, + 0.11131009752231316, + 0.04965191092056542, + 0.04965191092056541, + 0.049651910920565395, + 0.06204937630663012, + 0.06204937630663011, + 0.06204937630663009, + 0.07444684169269482, + 0.0744468416926948, + 0.07444684169269479, + 0.024874071936335597, + 0.024874071936335583, + 0.02487407193633557, + 0.031084818715740557, + 0.031084818715740543, + 0.03108481871574053, + 0.03729556549514552, + 0.037295565495145504, + 0.03729556549514549 + ] + } + ], + "layout": { + "scene": { + "xaxis": { + "title": { + "text": "X" + } + }, + "yaxis": { + "title": { + "text": "Y" + } + }, + "zaxis": { + "title": { + "text": "Z" + } + } + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Magnetic Field Distribution" + } + } + }, + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import plotly.graph_objects as go\n", + "\n", + "# Extract x, y, z coordinates from field_positions\n", + "x = field_positions[:, 0]\n", + "y = field_positions[:, 1]\n", + "z = field_positions[:, 2]\n", + "\n", + "# Extract the field values\n", + "field_values = field_array[:, 1]\n", + "\n", + "# Create a 3D scatter plot\n", + "fig = go.Figure(data=[go.Scatter3d(\n", + " x=x,\n", + " y=y,\n", + " z=z,\n", + " mode='markers',\n", + " marker=dict(\n", + " size=5,\n", + " color=field_values,\n", + " colorscale='Viridis',\n", + " colorbar=dict(title='Field Value')\n", + " )\n", + ")])\n", + "\n", + "# Set plot title and axis labels\n", + "fig.update_layout(\n", + " title='Magnetic Field Distribution',\n", + " scene=dict(\n", + " xaxis_title='X',\n", + " yaxis_title='Y',\n", + " zaxis_title='Z'\n", + " )\n", + ")\n", + "\n", + "fig.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "desc-env", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}