diff --git a/.gitignore b/.gitignore index 4485f2bcb..ff18e7a00 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,11 @@ venv tests.log /.pytest_cache +# Unit test / coverage reports +htmlcov/ +.coverage +.cache/ + # Installer files /installers/build /installers/dist diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e75be384f..b92d96596 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,7 +2,7 @@ default_install_hook_types: [pre-commit, pre-push] repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.14.1 + rev: v0.12.9 hooks: # Run the linter, applying any available fixes - id: ruff-check diff --git a/requirements.txt b/requirements.txt index 463703b10..64bfe29a4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,4 +16,4 @@ html5lib # Other stuff matplotlib -pre-commit +pre-commit \ No newline at end of file diff --git a/sasdata/ascii_reader_metadata.py b/sasdata/ascii_reader_metadata.py index 7a2fa01ad..850492a84 100644 --- a/sasdata/ascii_reader_metadata.py +++ b/sasdata/ascii_reader_metadata.py @@ -26,7 +26,7 @@ T = TypeVar('T') # TODO: There may be a better place for this. -pairings = {'I': 'dI', 'Q': 'dQ', 'Qx': 'dQx', 'Qy': 'dQy'} +pairings = {'I': 'dI', 'Q': 'dQ', 'Qx': 'dQx', 'Qy': 'dQy', 'Qz': 'dQz'} pairing_error = {value: key for key, value in pairings.items()} # Allows this to be bidirectional. bidirectional_pairings = pairings | pairing_error diff --git a/sasdata/checklist.txt b/sasdata/checklist.txt new file mode 100644 index 000000000..c25c7d895 --- /dev/null +++ b/sasdata/checklist.txt @@ -0,0 +1,3 @@ +Things to check once everything is in place: + +1) Do any centigrade fields read in incorrectly? \ No newline at end of file diff --git a/sasdata/data.py b/sasdata/data.py index fd294a432..73e64e612 100644 --- a/sasdata/data.py +++ b/sasdata/data.py @@ -39,7 +39,9 @@ def __init__( @property def ordinate(self) -> Quantity: match self.dataset_type: - case dataset_types.one_dim | dataset_types.two_dim: + case (dataset_types.one_dim | + dataset_types.two_dim | + dataset_types.angle_dim): return self._data_contents["I"] case dataset_types.sesans: return self._data_contents["Depolarisation"] @@ -69,7 +71,9 @@ def abscissae(self) -> Quantity: # TODO: Won't work when there's errors involved. On reflection, we # probably want to avoid creating a new Quantity but at the moment I # can't see a way around it. - return Quantity(data_contents, reference_data_content.units) + return Quantity(data_contents, reference_data_content.units, name=self._data_contents["Qx"].name, id_header=self._data_contents["Qx"]._id_header) + case dataset_types.angle_dim: + return self._data_contents["Phi"] case dataset_types.sesans: return self._data_contents["SpinEchoLength"] case _: @@ -148,3 +152,38 @@ def default(self, obj): } case _: return super().default(obj) + + +def sasdata_reader2D_converter(data2d: SasData | None = None) -> SasData: + """ + convert old 2d format opened by IhorReader or danse_reader + to new 2D SasData format + This is mainly used by the Readers + + :param data2d: SasData object with 2D arrays + :return: SasData object with 1D arrays + + """ + if data2d._data_contents["I"] is None or data2d.x_bins is None or data2d.y_bins is None: + raise ValueError("Can't convert this data: data=None...") + new_x = np.tile(data2d.x_bins, (len(data2d.y_bins), 1)) + new_y = np.tile(data2d.y_bins, (len(data2d.x_bins), 1)) + new_y = new_y.swapaxes(0, 1) + + new_data = data2d._data_contents["I"].value.flatten() + qx_data = new_x.flatten() + qy_data = new_y.flatten() + err_data = np.sqrt(data2d._data_contents["I"].variance.value) + if not data2d._data_contents["I"].has_variance or np.any(err_data <= 0): + new_err_data = np.sqrt(np.abs(new_data)) + else: + new_err_data = err_data.flatten() + mask = np.ones(len(new_data), dtype=bool) + + data2d._data_contents["I"].value = new_data + data2d._data_contents["I"].variance.value = new_err_data ** 2 + data2d._data_contents["Qx"].value = qx_data + data2d._data_contents["Qy"].value = qy_data + data2d.mask = mask + + return data2d diff --git a/sasdata/data_backing.py b/sasdata/data_backing.py index 8553cd5dd..210ac33ca 100644 --- a/sasdata/data_backing.py +++ b/sasdata/data_backing.py @@ -27,7 +27,7 @@ def summary(self, indent_amount: int = 0, indent: str = " ") -> str: s += f"{indent*(indent_amount+1)}{shorten_string(str(self.data))}\n" for key in self.attributes: value = self.attributes[key] - if isinstance(value, (Group | Dataset)): + if isinstance(value, (Group, Dataset)): value_string = value.summary(indent_amount+1, indent) else: value_string = f"{indent * (indent_amount+1)}{key}: {shorten_string(repr(value))}\n" diff --git a/sasdata/data_util/averaging.py b/sasdata/data_util/averaging.py index 2e9f0f1b0..6a1e4bed5 100644 --- a/sasdata/data_util/averaging.py +++ b/sasdata/data_util/averaging.py @@ -1,20 +1,21 @@ -""" -This module contains various data processors used by Sasview's slicers. -""" +"""This module contains various data processors used by Sasview's slicers.""" import math import numpy as np import numpy.typing as npt +from sasdata.data import SasData from sasdata.data_util.binning import DirectionalAverage from sasdata.data_util.interval import IntervalType from sasdata.data_util.roi import CartesianROI, PolarROI -from sasdata.dataloader.data_info import Data1D, Data2D +from sasdata.dataset_types import angle_dim, one_dim from sasdata.quantities.constants import Pi, TwoPi +from sasdata.quantities.quantity import Quantity +from sasdata.quantities.units import radians -def get_dq_data(data2d: Data2D) -> npt.NDArray[np.floating]: +def get_dq_data(data2d: SasData) -> npt.NDArray[np.floating]: """ Get the dq for resolution averaging The pinholes and det. pix contribution present @@ -23,32 +24,41 @@ def get_dq_data(data2d: Data2D) -> npt.NDArray[np.floating]: q = 0. Note This method works on only pinhole geometry. Extrapolate dqx(r) and dqy(phi) at q = 0, and take an average. """ - z_max = max(data2d.q_data) - z_min = min(data2d.q_data) - dqx_at_z_max = data2d.dqx_data[np.argmax(data2d.q_data)] - dqx_at_z_min = data2d.dqx_data[np.argmin(data2d.q_data)] - dqy_at_z_max = data2d.dqy_data[np.argmax(data2d.q_data)] - dqy_at_z_min = data2d.dqy_data[np.argmin(data2d.q_data)] + + q_data = np.sqrt(data2d._data_contents["Qx"].value**2 + data2d._data_contents["Qy"].value**2) + + z_max = np.max(q_data) + z_min = np.min(q_data) + + dqx_data = np.sqrt(data2d._data_contents["Qx"].variance.value) + dqy_data = np.sqrt(data2d._data_contents["Qy"].variance.value) + + dqx_at_z_max = dqx_data[np.argmax(q_data)] + dqx_at_z_min = dqx_data[np.argmin(q_data)] + dqy_at_z_max = dqy_data[np.argmax(q_data)] + dqy_at_z_min = dqy_data[np.argmin(q_data)] + # Find qdx at q = 0 dq_overlap_x = (dqx_at_z_min * z_max - dqx_at_z_max * z_min) / (z_max - z_min) # when extrapolation goes wrong - if dq_overlap_x > min(data2d.dqx_data): - dq_overlap_x = min(data2d.dqx_data) + if dq_overlap_x > np.min(dqx_data): + dq_overlap_x = np.min(dqx_data) dq_overlap_x *= dq_overlap_x # Find qdx at q = 0 dq_overlap_y = (dqy_at_z_min * z_max - dqy_at_z_max * z_min) / (z_max - z_min) # when extrapolation goes wrong - if dq_overlap_y > min(data2d.dqy_data): - dq_overlap_y = min(data2d.dqy_data) + if dq_overlap_y > np.min(dqy_data): + dq_overlap_y = np.min(dqy_data) # get dq at q=0. dq_overlap_y *= dq_overlap_y - dq_overlap = np.sqrt((dq_overlap_x + dq_overlap_y) / 2.0) + dq_overlap = np.sqrt(0.5 * (dq_overlap_x + dq_overlap_y)) # Final protection of dq if dq_overlap < 0: dq_overlap = dqy_at_z_min - dqx_data = data2d.dqx_data[np.isfinite(data2d.data)] - dqy_data = data2d.dqy_data[np.isfinite(data2d.data)] - dq_overlap + ordinate_mask = np.isfinite(data2d.ordinate.value) + dqx_data = dqx_data[ordinate_mask] + dqy_data = dqy_data[ordinate_mask] - dq_overlap # def; dqx_data = dq_r dqy_data = dq_phi # Convert dq 2D to 1D here dq_data = np.sqrt(dqx_data**2 + dqy_data**2) @@ -56,9 +66,7 @@ def get_dq_data(data2d: Data2D) -> npt.NDArray[np.floating]: class Boxsum(CartesianROI): - """ - Compute the sum of the intensity within a rectangular Region Of Interest. - """ + """Compute the sum of the intensity within a rectangular Region Of Interest.""" def __init__(self, qx_range: tuple[float, float] = (0.0, 0.0), qy_range: tuple[float, float] = (0.0, 0.0)) -> None: """ @@ -70,11 +78,11 @@ def __init__(self, qx_range: tuple[float, float] = (0.0, 0.0), qy_range: tuple[f """ super().__init__(qx_range=qx_range, qy_range=qy_range) - def __call__(self, data2d: Data2D) -> tuple[float, float, float]: + def __call__(self, data2d: SasData | None = None) -> tuple[float, float, float]: """ Coordinate data processing operations and return the results. - :param data2d: The Data2D object for which the sum is calculated. + :param data2d: The SasData object for which the sum is calculated. """ self.validate_and_assign_data(data2d) total_sum, error, count = self._sum() @@ -107,25 +115,22 @@ def _sum(self) -> tuple[float, float, float]: class Boxavg(Boxsum): - """ - Compute the average intensity within a rectangular Region Of Interest. - """ + """Compute the average intensity within a rectangular Region Of Interest.""" def __init__(self, qx_range: tuple[float, float] = (0.0, 0.0), qy_range: tuple[float, float] = (0.0, 0.0)) -> None: """ Set up the Region of Interest and its boundaries. - The units of these parameters are A^-1 :param qx_range: Bounds of the ROI along the Q_x direction. :param qy_range: Bounds of the ROI along the Q_y direction. """ super().__init__(qx_range=qx_range, qy_range=qy_range) - def __call__(self, data2d: Data2D) -> tuple[float, float]: + def __call__(self, data2d: SasData) -> tuple[float, float]: """ Coordinate data processing operations and return the results. - :param data2d: The Data2D object for which the average is calculated. + :param data2d: The SasData object for which the average is calculated. """ self.validate_and_assign_data(data2d) total_sum, error, count = super()._sum() @@ -138,7 +143,7 @@ class SlabX(CartesianROI): Average I(Q_x, Q_y) along the y direction (within a ROI), giving I(Q_x). This class is initialised by specifying the boundaries of the ROI and is - called by supplying a Data2D object. It returns a Data1D object. + called by supplying a SasData object. It returns a SasData object. The averaging process can also be thought of as projecting 2D -> 1D. There also exists the option to "fold" the ROI, where Q data on opposite @@ -157,7 +162,6 @@ def __init__( """ Set up the ROI boundaries, the binning of the output 1D data, and fold. - The units of these parameters are A^-1 :param qx_range: Bounds of the ROI along the Q_x direction. :param qy_range: Bounds of the ROI along the Q_y direction. :param nbins: The number of bins data is sorted into along Q_x. @@ -169,12 +173,12 @@ def __init__( self.fold: bool = fold self.base: float | None = base - def __call__(self, data2d: Data2D) -> Data1D: + def __call__(self, data2d: SasData | None = None) -> SasData: """ Compute the 1D average of 2D data, projecting along the Q_x axis. - :param data2d: The Data2D object for which the average is computed. - :return: Data1D object for plotting. + :param data2d: The SasData object for which the average is computed. + :return: SasData object for plotting. """ self.validate_and_assign_data(data2d) @@ -197,9 +201,14 @@ def __call__(self, data2d: Data2D) -> Data1D: nbins=self.nbins, base=self.base, ) + qx_data, intensity, error = directional_average(data=self.data, err_data=self.err_data) - return Data1D(x=qx_data, y=intensity, dy=error) + data_contents = { + "Q": Quantity(qx_data, data2d._data_contents["Qx"].units, None), + "I": Quantity(intensity, data2d.ordinate.units, error), + } + return SasData(f"{data2d.name}: Slab X Average", data_contents, one_dim, data2d.metadata) class SlabY(CartesianROI): @@ -207,7 +216,7 @@ class SlabY(CartesianROI): Average I(Q_x, Q_y) along the x direction (within a ROI), giving I(Q_y). This class is initialised by specifying the boundaries of the ROI and is - called by supplying a Data2D object. It returns a Data1D object. + called by supplying a SasData object. It returns a SasData object. The averaging process can also be thought of as projecting 2D -> 1D. There also exists the option to "fold" the ROI, where Q data on opposite @@ -226,7 +235,6 @@ def __init__( """ Set up the ROI boundaries, the binning of the output 1D data, and fold. - The units of these parameters are A^-1 :param qx_range: Bounds of the ROI along the Q_x direction. :param qy_range: Bounds of the ROI along the Q_y direction. :param qy_max: Upper bound of the ROI along the Q_y direction. @@ -239,12 +247,12 @@ def __init__( self.fold: bool = fold self.base: float | None = base - def __call__(self, data2d: Data2D) -> Data1D: + def __call__(self, data2d: SasData | None = None) -> SasData: """ Compute the 1D average of 2D data, projecting along the Q_y axis. - :param data2d: The Data2D object for which the average is computed. - :return: Data1D object for plotting. + :param data2d: The SasData object for which the average is computed. + :return: SasData object for plotting. """ self.validate_and_assign_data(data2d) @@ -269,7 +277,11 @@ def __call__(self, data2d: Data2D) -> Data1D: ) qy_data, intensity, error = directional_average(data=self.data, err_data=self.err_data) - return Data1D(x=qy_data, y=intensity, dy=error) + data_contents = { + "Q": Quantity(qy_data, data2d._data_contents["Qy"].units, None), + "I": Quantity(intensity, data2d.ordinate.units, error), + } + return SasData(f"{data2d.name}: Slab Y Average", data_contents, one_dim, data2d.metadata) class CircularAverage(PolarROI): @@ -279,7 +291,7 @@ class CircularAverage(PolarROI): This class is initialised by specifying lower and upper limits on the magnitude of Q values to consider during the averaging, though currently SasView always calls this class using the full range of data. When called, - this class is supplied with a Data2D object. It returns a Data1D object + this class is supplied with a SasData object. It returns a SasData object where intensity is given as a function of Q only. """ @@ -293,7 +305,6 @@ def __init__( """ Set up the lower and upper radial limits as well as the number of bins. - The units are A^-1 for the radial parameters. :param r_min: Lower limit for |Q| values to use during averaging. :param r_max: Upper limit for |Q| values to use during averaging. :param nbins: The number of bins data is sorted into along |Q| the axis @@ -302,43 +313,43 @@ def __init__( self.nbins: int = nbins self.base: float | None = base - def __call__(self, data2D: Data2D, ismask: bool = False) -> Data1D: + def __call__(self, data2D: SasData, ismask: bool = False) -> SasData: """ Perform circular averaging on the data. Uses DirectionalAverage for bin construction and weights, and computes dx (d_q) using get_dq_data averaged with those weights so behavior matches the legacy implementation. - :param data2D: Data2D object + :param data2D: SasData object :param ismask: If True, respect data2D.mask (skip masked points). If False, ignore mask. - :return: Data1D object with x (bin centers), y (intensity), dy and dx (if available) + :return: SasData object with x (bin centers), y (intensity), dy and dx (if available) """ # Work on unmasked finite arrays first (matches legacy filtering) - finite_mask = np.isfinite(data2D.data) + finite_mask = np.isfinite(data2D.ordinate.value) if not np.any(finite_mask): raise RuntimeError(f"Circular averaging: invalid q_data: {data2D.q_data}") - data_all = data2D.data[finite_mask] - q_all = data2D.q_data[finite_mask] - qx_all = data2D.qx_data[finite_mask] - qy_all = data2D.qy_data[finite_mask] - err_all = data2D.err_data[finite_mask] if data2D.err_data is not None else None - mask_all = data2D.mask[finite_mask] + data = data2D.ordinate.value[finite_mask] + qx = data2D._data_contents["Qx"].value[finite_mask] + qy = data2D._data_contents["Qy"].value[finite_mask] + q = np.sqrt(qx**2 + qy**2) + err = np.sqrt(data2D.ordinate.variance.value)[finite_mask] + mask = (data2D.mask if data2D.mask is not None else np.ones_like(data2D.ordinate.value, dtype=bool))[finite_mask] # Optional mask handling: legacy used an ismask flag to optionally skip masked points if ismask: - sel = mask_all + sel = mask else: - sel = np.ones_like(mask_all, dtype=bool) + sel = np.ones_like(mask, dtype=bool) # Selected arrays used for binning & averaging - major_axis = q_all[sel] - phi_axis = np.arctan2(qy_all[sel], qx_all[sel]) - data_vals = data_all[sel] - err_vals = err_all[sel] if err_all is not None else None + major_axis = q[sel] + phi_axis = np.arctan2(qy[sel], qx[sel]) + data_vals = data[sel] + err_vals = err[sel] # Prepare dq_data if available, aligned to the finite mask and selection dq_vals = None - if getattr(data2D, "dqx_data", None) is not None and getattr(data2D, "dqy_data", None) is not None: + if data2D._data_contents["Qx"].has_variance and data2D._data_contents["Qy"].has_variance: dq_full = get_dq_data(data2D) # already uses np.isfinite(data2D.data) dq_vals = dq_full[sel] @@ -350,7 +361,7 @@ def __call__(self, data2D: Data2D, ismask: bool = False) -> Data1D: minor_axis=phi_axis, lims=(major_lims, minor_lims), nbins=self.nbins, - base=self.base, + base=self.base ) # Compute weights, then produce averaged intensity/error via DirectionalAverage @@ -371,11 +382,16 @@ def __call__(self, data2D: Data2D, ismask: bool = False) -> Data1D: counts = np.sum(weights, axis=1) with np.errstate(divide="ignore", invalid="ignore"): dx_full = dq_weighted / counts - dx = dx_full[populated] + dQ = dx_full[populated] else: - dx = None + dQ = None + + data_contents = { + "Q": Quantity(x, data2D._data_contents["Qx"].units, dQ), + "I": Quantity(intensity, data2D.ordinate.units, error), + } + return SasData(f"{data2D.name}: Circular Average", data_contents, one_dim, data2D.metadata) - return Data1D(x=x, y=intensity, dy=error, dx=dx) class Ring(PolarROI): @@ -384,9 +400,8 @@ class Ring(PolarROI): This class is initialised by specifying lower and upper limits on the magnitude of Q values to consider during the averaging. When called, - this class is supplied with a Data2D object. It returns a Data1D object. - This Data1D object gives intensity as a function of the angle from the - positive x-axis, φ, only. + this class is supplied with a SasData object. It returns a SasData object + which gives intensity as a function of the angle from the positive x-axis, φ, only. """ def __init__( @@ -399,7 +414,6 @@ def __init__( """ Set up the lower and upper radial limits as well as the number of bins. - The units are A^-1 for the radial parameters. :param r_min: Lower limit for |Q| values to use during averaging. :param r_max: Upper limit for |Q| values to use during averaging. :param nbins: The number of bins data is sorted into along Phi the axis @@ -411,27 +425,32 @@ def __init__( self.nbins: int = nbins self.base: float | None = base - def __call__(self, data2D: Data2D) -> Data1D: + def __call__(self, data2D: SasData) -> SasData: """ Apply the ring to the data set. Returns the angular distribution for a given q range - :param data2D: Data2D object + :param data2D: SasData object - :return: Data1D object + :return: SasData object """ - if data2D.__class__.__name__ not in ["Data2D", "plottable_2D"]: - raise RuntimeError("Ring averaging only take plottable_2D objects") + if not isinstance(data2D, SasData): + msg = "Data supplied for ring averaging must be of type SasData." + raise RuntimeError(msg) + if not ("Qx" in data2D._data_contents and + "Qy" in data2D._data_contents): + msg = "SasData object for ring averaging must contain 'Qx' and 'Qy' data." + raise RuntimeError(msg) # Get data - data = data2D.data[np.isfinite(data2D.data)] - q_data = data2D.q_data[np.isfinite(data2D.data)] - err_data = None - if data2D.err_data is not None: - err_data = data2D.err_data[np.isfinite(data2D.data)] - qx_data = data2D.qx_data[np.isfinite(data2D.data)] - qy_data = data2D.qy_data[np.isfinite(data2D.data)] - mask_data = data2D.mask[np.isfinite(data2D.data)] + valid_data = np.isfinite(data2D.ordinate.value) + + data = data2D.ordinate.value[valid_data] + err_data = np.sqrt(data2D.ordinate.variance.value)[valid_data] + qx_data = data2D._data_contents["Qx"].value[valid_data] + qy_data = data2D._data_contents["Qy"].value[valid_data] + q_data = np.sqrt(qx_data ** 2 + qy_data ** 2) + mask_data = (data2D.mask if data2D.mask is not None else np.ones_like(data2D.ordinate.value, dtype=bool))[valid_data] # Set space for 1d outputs phi_bins = np.zeros(self.nbins) @@ -486,66 +505,11 @@ def __call__(self, data2D: Data2D) -> Data1D: msg = "Average Error: No points inside ROI to average..." raise ValueError(msg) - return Data1D(x=phi_values[idx], y=phi_bins[idx], dy=phi_err[idx]) - - ''' - def __call__(self, data2d: Data2D = None) -> Data1D: - """ - Compute the 1D average of 2D data, projecting along the Phi axis. - - :param data2d: The Data2D object for which the average is computed. - :return: Data1D object for plotting. - """ - self.validate_and_assign_data(data2d) - - # half-bin shift so the first bin is centered at zero - phi_shift = np.pi / self.nbins - shifted_phi = (self.phi_data +Pi+ phi_shift) % (TwoPi) - - self.phi_data=self.phi_data+Pi - self.phi_min = 0.0 - self.phi_max = TwoPi - - minor_lims = (self.r_min, self.r_max) - major_lims = (self.phi_min, self.phi_max) - - - # major_lims is None because a full-circle angular range is used - directional_average = DirectionalAverage(major_axis=shifted_phi, - minor_axis=self.q_data, - lims=(major_lims,minor_lims), - nbins=self.nbins, base=self.base) - # Reuse DirectionalAverage's weights, then compute the same sums/divisions - weights = directional_average.compute_weights() - - # Projected x values (averaged shifted phi per bin) -- not used as final x, - # but computed here to mirror DirectionalAverage internal behaviour. - x_axis_values = np.sum(weights * shifted_phi, axis=1) - - intensity = np.sum(weights * self.data, axis=1) - errs_squared = np.sum((weights * self.err_data) ** 2, axis=1) - - bin_counts = np.sum(weights, axis=1) - if not np.any(bin_counts > 0): - raise ValueError("Average Error: No bins inside ROI to average...") - - errors = np.sqrt(errs_squared) - - # Only compute divisions where bin_counts > 0 (others will become NaN/inf) - with np.errstate(divide='ignore', invalid='ignore'): - x_axis_values = x_axis_values / bin_counts - intensity = intensity / bin_counts - errors = errors / bin_counts - - # Legacy reported x values are the unshifted bin starts (i.e. 2*pi*i/nbins) - phi_values = np.linspace(0.0, TwoPi, self.nbins, endpoint=False) - - finite = np.isfinite(intensity) - if not finite.any(): - raise ValueError("Average Error: No points inside ROI to average...") - - return Data1D(x=phi_values[finite], y=intensity[finite], dy=errors[finite]) - ''' + data_contents = { + "Phi": Quantity(phi_values[idx], radians, None), + "I": Quantity(phi_bins[idx], data2D.ordinate.units, phi_err[idx]), + } + return SasData(f"{data2D.name}: Ring Average", data_contents, angle_dim, data2D.metadata) class SectorQ(PolarROI): @@ -566,8 +530,8 @@ class SectorQ(PolarROI): the data from the two regions are graphed separeately, with the secondary ROI data labelled using negative Q values. - When called, this class is supplied with a Data2D object. It returns a - Data1D object where intensity is given as a function of Q only. + When called, this class is supplied with a SasData object. It returns a + SasData object where intensity is given as a function of Q only. """ def __init__( @@ -582,9 +546,8 @@ def __init__( """ Set up the ROI boundaries, the binning of the output 1D data, and fold. - The units are A^-1 for radial parameters, and radians for anglar ones. :param r_range: Tuple (r_min, r_max) defining limits for |Q| values to use during averaging. - :param phi_range: Tuple (phi_min, phi_max) defining limits for φ in radians (in the primary ROI). + :param phi_range: Tuple (phi_min, phi_max) defining limits for φ in the primary ROI. :Defaults to full circle (0, 2*pi). :param nbins: The number of bins data is sorted into along the |Q| axis :param fold: Whether the primary and secondary ROIs should be folded @@ -596,12 +559,12 @@ def __init__( self.fold: bool = fold self.base: float | None = base - def __call__(self, data2d: Data2D) -> Data1D: + def __call__(self, data2d: SasData | None = None) -> SasData: """ Compute the 1D average of 2D data, projecting along the Q_y axis. - :param data2d: The Data2D object for which the average is computed. - :return: Data1D object for plotting. + :param data2d: The SasData object for which the average is computed. + :return: SasData object for plotting. """ self.validate_and_assign_data(data2d) @@ -643,8 +606,10 @@ def __call__(self, data2d: Data2D) -> Data1D: base=self.base, ) - primary_q, primary_I, primary_err = primary_region(data=self.data, err_data=self.err_data) - secondary_q, secondary_I, secondary_err = secondary_region(data=self.data, err_data=self.err_data) + primary_q, primary_I, primary_err = primary_region(data=self.data, + err_data=self.err_data) + secondary_q, secondary_I, secondary_err = secondary_region(data=self.data, + err_data=self.err_data) if self.fold: # Combining the two regions requires re-binning; the q value @@ -676,15 +641,22 @@ def __call__(self, data2d: Data2D) -> Data1D: finite = np.isfinite(average_intensity) - data1d = Data1D(x=combined_q[finite], y=average_intensity[finite], dy=combined_err[finite]) + data_contents = { + "Q": Quantity(combined_q[finite], data2d._data_contents["Qx"].units, None), + "I": Quantity(average_intensity[finite], data2d.ordinate.units, combined_err[finite]), + } else: # The secondary ROI is labelled with negative Q values. combined_q = np.append(np.flip(-1 * secondary_q), primary_q) combined_intensity = np.append(np.flip(secondary_I), primary_I) combined_error = np.append(np.flip(secondary_err), primary_err) - data1d = Data1D(x=combined_q, y=combined_intensity, dy=combined_error) - return data1d + data_contents = { + "Q": Quantity(combined_q, data2d._data_contents["Qx"].units, None), + "I": Quantity(combined_intensity, data2d.ordinate.units, combined_error), + } + + return SasData(f"{data2d.name}:SectorQ Average", data_contents, one_dim, data2d.metadata) class WedgeQ(PolarROI): @@ -696,9 +668,9 @@ class WedgeQ(PolarROI): the positive x-axis. This class is initialised by specifying lower and upper limits on both the - magnitude of Q and the angle φ. - When called, this class is supplied with a Data2D object. It returns a - Data1D object where intensity is given as a function of Q only. + magnitude of Q and the angle φ. When called, this class is supplied with a + SasData object. It returns a sasData object where intensity is given as a + function of Q only. """ def __init__( @@ -712,9 +684,8 @@ def __init__( """ Set up the ROI boundaries, and the binning of the output 1D data. - The units are A^-1 for radial parameters, and radians for anglar ones. :param r_range: Tuple (r_min, r_max) defining limits for |Q| values to use during averaging. - :param phi_range: Tuple (phi_min, phi_max) defining limits for φ in radians (in the primary ROI). + :param phi_range: Tuple (phi_min, phi_max) defining limits for φ in the primary ROI. :Defaults to full circle (0, 2*pi). :param nbins: The number of bins data is sorted into along the |Q| axis """ @@ -722,12 +693,12 @@ def __init__( self.nbins: int = nbins self.base: float | None = base - def __call__(self, data2d: Data2D) -> Data1D: + def __call__(self, data2d: SasData | None = None) -> SasData: """ Compute the 1D average of 2D data, projecting along the Q_y axis. - :param data2d: The Data2D object for which the average is computed. - :return: Data1D object for plotting. + :param data2d: The SasData object for which the average is computed. + :return: SasData object for plotting. """ self.validate_and_assign_data(data2d) @@ -764,9 +735,14 @@ def __call__(self, data2d: Data2D) -> Data1D: nbins=self.nbins, base=self.base, ) + q_data, intensity, error = directional_average(data=self.data, err_data=self.err_data) - return Data1D(x=q_data, y=intensity, dy=error) + data_contents = { + "Q": Quantity(q_data, data2d._data_contents["Qx"].units, None), + "I": Quantity(intensity, data2d.ordinate.units, error), + } + return SasData(f"{data2d.name}: Wedge Q Average", data_contents, one_dim, data2d.metadata) class WedgePhi(PolarROI): @@ -778,9 +754,8 @@ class WedgePhi(PolarROI): This class is initialised by specifying lower and upper limits on both the magnitude of Q and the angle φ, measured anticlockwise from the positive - x-axis. - When called, this class is supplied with a Data2D object. It returns a - Data1D object where intensity is given as a function of Q only. + x-axis. When called, this class is supplied with a SasData object. It returns + a SasData object where intensity is given as a function of φ only. """ def __init__( @@ -794,7 +769,6 @@ def __init__( """ Set up the ROI boundaries, and the binning of the output 1D data. - The units are A^-1 for radial parameters, and radians for anglar ones. :param r_range: Tuple (r_min, r_max) defining limits for |Q| values to use during averaging. :param phi_range: Tuple (phi_min, phi_max) defining angular bounds in radians. Defaults to full circle (0, 2*pi). @@ -805,12 +779,12 @@ def __init__( self.nbins: int = nbins self.base: float | None = base - def __call__(self, data2d: Data2D) -> Data1D: + def __call__(self, data2d: SasData | None = None) -> SasData: """ Compute the 1D average of 2D data, projecting along the Q_y axis. - :param data2d: The Data2D object for which the average is computed. - :return: Data1D object for plotting. + :param data2d: The SasData object for which the average is computed. + :return: SasData object for plotting. """ self.validate_and_assign_data(data2d) @@ -829,8 +803,8 @@ def __call__(self, data2d: Data2D) -> Data1D: # Remember to transform back afterward as we're plotting against phi. phi_offset = self.phi_min self.phi_min = 0.0 - self.phi_max = (self.phi_max - phi_offset) % (TwoPi) - self.phi_data = (self.phi_data - phi_offset) % (TwoPi) + self.phi_max = (self.phi_max - phi_offset) % TwoPi + self.phi_data = (self.phi_data - phi_offset) % TwoPi # Averaging takes place between angular and radial limits # When phi_max and phi_min have the same angle, ROI is a full circle. @@ -847,7 +821,7 @@ def __call__(self, data2d: Data2D) -> Data1D: nbins=self.nbins, base=self.base, ) - phi_data, intensity, error = directional_average(data=self.data, err_data=self.err_data) + _, intensity, error = directional_average(data=self.data, err_data=self.err_data) # Compute phi bin starts to match legacy behaviour (Ring / old SectorPhi) # phi_min has been normalized to 0 earlier; phi_offset stores original start. @@ -858,7 +832,7 @@ def __call__(self, data2d: Data2D) -> Data1D: full_phi = np.linspace(self.phi_min, self.phi_max, self.nbins, endpoint=False) # Shift back to original phi range - full_phi = (full_phi + phi_offset) % (TwoPi) + full_phi = (full_phi + phi_offset) % TwoPi # Determine which bins were populated using the weights (preserves full bin index space) weights = directional_average.compute_weights() @@ -872,21 +846,11 @@ def __call__(self, data2d: Data2D) -> Data1D: phi_centers = full_phi[populated] + directional_average.bin_widths[populated] / 2.0 # intensity and error returned by DirectionalAverage are already filtered to the populated/finite bins - return Data1D(x=phi_centers, y=intensity, dy=error) - - """ - # Convert angular data back to the original phi range - phi_data += phi_offset - # In the old manipulations.py, we also had this shift to plot the data - # at the centre of the bins. I'm not sure why it's only angular binning - # which gets this treatment. - # TODO: Update this once non-linear binning options are implemented - weights = directional_average.compute_weights() - populated = np.sum(weights, axis=1) > 0 - phi_data += directional_average.bin_widths[populated] / 2 - - return Data1D(x=phi_data, y=intensity, dy=error) - """ + data_contents = { + "Phi": Quantity(phi_centers, radians, None), + "I": Quantity(intensity, data2d.ordinate.units, error), + } + return SasData(f"{data2d.name}: Wedge Phi Average", data_contents, angle_dim, data2d.metadata) class SectorPhi(WedgePhi): @@ -915,23 +879,20 @@ def __init__( nbins: int = 100, ) -> None: # Forward to WedgePhi using the tuple-based it expects. - super().__init__(r_range=(r_min, r_max), phi_range=(phi_min, phi_max), center=center, nbins=nbins) - ################################################################################ class Ringcut(PolarROI): """ - Defines a ring on a 2D data set. - The ring is defined by r_min, r_max, and + Defines a ring on a 2D data set. The ring is defined by r_min, r_max, and the position of the center of the ring. - The data returned is the region inside the ring + The data returned is the region inside the ring. Phi_min and phi_max should be defined between 0 and 2*pi - in anti-clockwise starting from the x- axis on the left-hand side + in anti-clockwise starting from the x-axis on the left-hand side """ def __init__( @@ -942,19 +903,19 @@ def __init__( ) -> None: super().__init__(r_range, phi_range, center) - def __call__(self, data2D: Data2D) -> npt.NDArray[np.bool_]: + def __call__(self, data2D: SasData) -> npt.NDArray[np.bool_]: """ Apply the ring to the data set. - Returns the angular distribution for a given q range + Returns the angular distribution for a given q range. - :param data2D: Data2D object + :param data2D: SasData object :return: index array in the range """ - super().validate_and_assign_data(data2D) + self.validate_and_assign_data(data2D) # Calculate q_data using unmasked qx_data and qy_data - q_data = np.sqrt(data2D.qx_data * data2D.qx_data + data2D.qy_data * data2D.qy_data) + q_data = np.sqrt(self.qx_data**2 + self.qy_data**2) # check whether each data point is inside ROI out = (self.r_min <= q_data) & (self.r_max >= q_data) @@ -962,25 +923,23 @@ def __call__(self, data2D: Data2D) -> npt.NDArray[np.bool_]: class Boxcut(CartesianROI): - """ - Find a rectangular 2D region of interest. - """ + """Find a rectangular 2D region of interest.""" def __init__(self, qx_range: tuple[float, float] = (0.0, 0.0), qy_range: tuple[float, float] = (0.0, 0.0)) -> None: super().__init__(qx_range=qx_range, qy_range=qy_range) - def __call__(self, data2D: Data2D) -> npt.NDArray[np.bool_]: + def __call__(self, data2D: SasData) -> npt.NDArray[np.bool_]: """ - Find a rectangular 2D region of interest where data points inside the ROI are True, and False otherwise + Find a rectangular 2D region of interest where data points inside the ROI are True, and False otherwise. - :param data2D: Data2D object + :param data2D: SasData object :return: mask, 1d array (len = len(data)) """ - super().validate_and_assign_data(data2D) + self.validate_and_assign_data(data2D) # check whether each data point is inside ROI - outx = (self.qx_min <= data2D.qx_data) & (self.qx_max > data2D.qx_data) - outy = (self.qy_min <= data2D.qy_data) & (self.qy_max > data2D.qy_data) + outx = (self.qx_min <= self.qx_data) & (self.qx_max > self.qx_data) + outy = (self.qy_min <= self.qy_data) & (self.qy_max > self.qy_data) return outx & outy @@ -999,24 +958,22 @@ class Sectorcut(PolarROI): def __init__(self, phi_range: tuple[float, float] = (0.0, Pi), center: tuple[float, float] = (0.0, 0.0)) -> None: super().__init__(r_range=(0, np.inf), phi_range=phi_range, center=center) - def __call__(self, data2D: Data2D) -> npt.NDArray[np.bool_]: + def __call__(self, data2D: SasData) -> npt.NDArray[np.bool_]: """ - Find a rectangular 2D region of interest where data points inside the ROI are True, and False otherwise + Find a rectangular 2D region of interest where data points inside the ROI are True, and False otherwise - :param data2D: Data2D object + :param data2D: SasData object :return: mask, 1d array (len = len(data)) """ - super().validate_and_assign_data(data2D) + self.validate_and_assign_data(data2D) # Ensure unmasked data is used for the phi_data calculation to ensure data sizes match self.phi_data = np.arctan2(data2D.qy_data, data2D.qx_data) - # Calculate q_data using unmasked qx_data and qy_data to ensure data sizes match - q_data = np.sqrt(data2D.qx_data * data2D.qx_data + data2D.qy_data * data2D.qy_data) phi_offset = self.phi_min self.phi_min = 0.0 - self.phi_max = (self.phi_max - phi_offset) % (TwoPi) - self.phi_data = (self.phi_data - phi_offset) % (TwoPi) + self.phi_max = (self.phi_max - phi_offset) % TwoPi + self.phi_data = (self.phi_data - phi_offset) % TwoPi phi_shifted = self.phi_data - Pi # Determine angular bounds for both upper and lower half of image diff --git a/sasdata/data_util/binning.py b/sasdata/data_util/binning.py index fdacda103..737e8f044 100644 --- a/sasdata/data_util/binning.py +++ b/sasdata/data_util/binning.py @@ -11,7 +11,7 @@ class DirectionalAverage: Average along one coordinate axis of 2D data and return data for a 1D plot. This can also be thought of as a projection onto the major axis: 2D -> 1D. - This class operates on a decomposed Data2D object, and returns data needed + This class operates on a decomposed SasData object, and returns data needed to construct a Data1D object. The class is instantiated with two arrays of orthogonal coordinate data (depending on the coordinate system, these may have undergone some pre-processing) and two corresponding two-element @@ -20,7 +20,7 @@ class DirectionalAverage: the other is divided into bins and becomes the dependent variable of the eventual 1D plot. These are called the minor and major axes respectively. When a class instance is called, it is passed the intensity and error data - from the original Data2D object. These should not have undergone any + from the original SasData object. These should not have undergone any coordinate system dependent pre-processing. Note that the old version of manipulations.py had an option for logarithmic @@ -203,7 +203,7 @@ def __call__(self, data, err_data): """ Compute the directional average of the supplied intensity & error data. - :param data: intensity data from the origninal Data2D object. + :param data: intensity data from the original SasData object. :param err_data: the corresponding errors for the intensity data. """ weights = self.compute_weights() diff --git a/sasdata/data_util/manipulations.py b/sasdata/data_util/manipulations.py index b7d17f41c..491ebf45f 100644 --- a/sasdata/data_util/manipulations.py +++ b/sasdata/data_util/manipulations.py @@ -1,11 +1,11 @@ """ Data manipulations for 2D data sets. -Using the meta data information, various types of averaging are performed in Q-space +Using the meta data information, various types of averaging are performed in Q-space. To test this module use: ``` cd test -PYTHONPATH=../src/ python2 -m sasmanipulations.test.utest_averaging DataInfoTests.test_sectorphi_quarter +PYTHONPATH=../src/ python2 -m sasmanipulations.test.utest_averaging DataInfoTests.test_sectorphi_quarter ``` """ ##################################################################### @@ -23,6 +23,8 @@ import numpy as np +from sasdata.data import SasData + ################################################################################ # Backwards-compatible wrappers that delegate to the new implementations # in averaging.py. @@ -42,21 +44,41 @@ SlabY, WedgePhi, WedgeQ, + get_dq_data, ) -from sasdata.dataloader.data_info import Data1D, Data2D +from sasdata.dataloader.data_info import Data2D from sasdata.dataloader.data_info import reader2D_converter as _di_reader2D_converter +from sasdata.dataset_types import one_dim from sasdata.quantities.constants import Pi, TwoPi +from sasdata.quantities.quantity import Quantity warn("sasdata.data_util.manipulations is deprecated. Unless otherwise noted, update your import to " "sasdata.data_util.averaging.", DeprecationWarning, stacklevel=2) +def deduce_qz(qx: float, qy: float, wavelength: float) -> float: + """ + If you know qx, qy, and the wavelength, you can derive qz + + :param qx: qx [inverse length] + :param dy: qy [inverse length] + :param wavelength: neutron wavelength [length] + + :return: qz + """ + + k0 = 2*np.pi/wavelength + twotheta = np.arcsin((qx**2 + qy**2) / k0) + qz = (1 - np.cos(twotheta)) * k0 + return qz + + def position_and_wavelength_to_q(dx: float, dy: float, detector_distance: float, wavelength: float) -> float: """ - :param dx: x-distance from beam center [mm] - :param dy: y-distance from beam center [mm] - :param detector_distance: sample to detector distance [mm] - :param wavelength: neutron wavelength [nm] + :param dx: x-distance from beam center + :param dy: y-distance from beam center + :param detector_distance: sample to detector distance + :param wavelength: neutron wavelength :return: q-value at the given position """ # Distance from beam center in the plane of detector @@ -216,55 +238,13 @@ def get_pixel_fraction(q_max: float, q_00: float, q_01: float, q_10: float, q_11 return frac_max -def get_dq_data(data2d: Data2D) -> np.array: - ''' - Get the dq for resolution averaging - The pinholes and det. pix contribution present - in both direction of the 2D which must be subtracted when - converting to 1D: dq_overlap should be calculated ideally at - q = 0. Note This method works on only pinhole geometry. - Extrapolate dqx(r) and dqy(phi) at q = 0, and take an average. - ''' - z_max = max(data2d.q_data) - z_min = min(data2d.q_data) - dqx_at_z_max = data2d.dqx_data[np.argmax(data2d.q_data)] - dqx_at_z_min = data2d.dqx_data[np.argmin(data2d.q_data)] - dqy_at_z_max = data2d.dqy_data[np.argmax(data2d.q_data)] - dqy_at_z_min = data2d.dqy_data[np.argmin(data2d.q_data)] - # Find qdx at q = 0 - dq_overlap_x = (dqx_at_z_min * z_max - dqx_at_z_max * z_min) / (z_max - z_min) - # when extrapolation goes wrong - if dq_overlap_x > min(data2d.dqx_data): - dq_overlap_x = min(data2d.dqx_data) - dq_overlap_x *= dq_overlap_x - # Find qdx at q = 0 - dq_overlap_y = (dqy_at_z_min * z_max - dqy_at_z_max * z_min) / (z_max - z_min) - # when extrapolation goes wrong - if dq_overlap_y > min(data2d.dqy_data): - dq_overlap_y = min(data2d.dqy_data) - # get dq at q=0. - dq_overlap_y *= dq_overlap_y - - dq_overlap = np.sqrt((dq_overlap_x + dq_overlap_y) / 2.0) - # Final protection of dq - if dq_overlap < 0: - dq_overlap = dqy_at_z_min - dqx_data = data2d.dqx_data[np.isfinite(data2d.data)] - dqy_data = data2d.dqy_data[np.isfinite( - data2d.data)] - dq_overlap - # def; dqx_data = dq_r dqy_data = dq_phi - # Convert dq 2D to 1D here - dq_data = np.sqrt(dqx_data**2 + dqy_data**2) - return dq_data - ################################################################################ def reader2D_converter(data2d: Data2D | None = None) -> Data2D: """ - convert old 2d format opened by IhorReader or danse_reader - to new Data2D format - This is mainly used by the Readers + Convert old 2d format opened by IhorReader or danse_reader to new Data2D format. + This is mainly used by the Readers. :param data2d: 2d array of Data2D object :return: 1d arrays of Data2D object @@ -329,11 +309,11 @@ def __init__(self, x_min=0.0, x_max=0.0, y_min=0.0, y_max=0.0, bin_width=0.001, fold=False): if fold: # Set x_max based on which is further from Qx = 0 - x_max = max(abs(self.x_min),abs(self.x_max)) + x_max = max(abs(self.x_min), abs(self.x_max)) # Set x_min based on which is closer to Qx = 0, but will have different limits depending on whether # x_min and x_max are on the same side of Qx = 0 if self.x_min*self.x_max >= 0: # If on same side - x_min = min(abs(self.x_min),abs(self.x_max)) + x_min = min(abs(self.x_min), abs(self.x_max)) else: x_min = 0.0 @@ -341,8 +321,10 @@ def __init__(self, x_min=0.0, x_max=0.0, y_min=0.0, width = max(abs(x_max - x_min), 1e-12) nbins = int(math.ceil(width / abs(bin_width))) if bin_width != 0 else 1 self.nbins=nbins - super().__init__(qx_range=(x_min, x_max), qy_range=(y_min, y_max), - nbins=nbins, fold=fold) + super().__init__(qx_range=(x_min, x_max), + qy_range=(y_min, y_max), + nbins=nbins, + fold=fold) class SlabY(SlabY): @@ -353,11 +335,11 @@ def __init__(self, x_min=0.0, x_max=0.0, y_min=0.0, y_max=0.0, bin_width=0.001, fold=False): if fold: # Set y_max based on which is further from Qy = 0 - y_max = max(abs(self.y_min),abs(self.y_max)) + y_max = max(abs(self.y_min), abs(self.y_max)) # Set y_min based on which is closer to Qy = 0, but will have different limits depending on whether # y_min and y_max are on the same side of Qy = 0 if self.y_min*self.y_max >= 0: # If on same side - y_min = min(abs(self.y_min),abs(self.y_max)) + y_min = min(abs(self.y_min), abs(self.y_max)) else: y_min = 0.0 @@ -365,8 +347,10 @@ def __init__(self, x_min=0.0, x_max=0.0, y_min=0.0, height = max(abs(y_max - y_min), 1e-12) nbins = int(math.ceil(height / abs(bin_width))) if bin_width != 0 else 1 self.nbins=nbins - super().__init__(qx_range=(x_min, x_max), qy_range=(y_min, y_max), - nbins=nbins, fold=fold) + super().__init__(qx_range=(x_min, x_max), + qy_range=(y_min, y_max), + nbins=nbins, + fold=fold) ################################################################################ @@ -374,13 +358,11 @@ def __init__(self, x_min=0.0, x_max=0.0, y_min=0.0, class Boxsum(Boxsum): def __init__(self, x_min=0.0, x_max=0.0, y_min=0.0, y_max=0.0): - super().__init__(qx_range=(x_min, x_max), qy_range=(y_min, y_max)) class Boxavg(Boxavg): def __init__(self, x_min=0.0, x_max=0.0, y_min=0.0, y_max=0.0): - super().__init__(qx_range=(x_min, x_max), qy_range=(y_min, y_max)) ################################################################################ @@ -405,23 +387,22 @@ def __call__(self, data2D, ismask=False): """ Perform circular averaging on the data - :param data2D: Data2D object - :return: Data1D object + :param data2D: SasData object + :return: SasData object """ # Get data W/ finite values - data = data2D.data[np.isfinite(data2D.data)] - q_data = data2D.q_data[np.isfinite(data2D.data)] - err_data = None - if data2D.err_data is not None: - err_data = data2D.err_data[np.isfinite(data2D.data)] - mask_data = data2D.mask[np.isfinite(data2D.data)] + finite_mask = np.isfinite(data2D.ordinate.value) + data = data2D.ordinate.value[finite_mask] + q_data = np.sqrt(data2D._data_contents["Qx"].value**2 + data2D._data_contents["Qy"].value**2)[finite_mask] + err_data = np.sqrt(data2D.ordinate.variance.value)[finite_mask] + mask_data = (data2D.mask if data2D.mask is not None else np.ones_like(data2D.ordinate.value, dtype=bool))[finite_mask] dq_data = None - if data2D.dqx_data is not None and data2D.dqy_data is not None: + if data2D._data_contents["Qx"].has_variance and data2D._data_contents["Qy"].has_variance: dq_data = get_dq_data(data2D) if len(q_data) == 0: - msg = "Circular averaging: invalid q_data: %g" % data2D.q_data + msg = "Circular averaging: invalid q_data: %g" % q_data raise RuntimeError(msg) # Build array of Q intervals @@ -491,25 +472,26 @@ def __call__(self, data2D, ismask=False): idx = (np.isfinite(y)) & (np.isfinite(x)) if err_x is not None: - d_x = err_x[idx] / y_counts[idx] + dQ = err_x[idx] / y_counts[idx] else: - d_x = None + dQ = None if not idx.any(): msg = "Average Error: No points inside ROI to average..." raise ValueError(msg) - return Data1D(x=x[idx], y=y[idx], dy=err_y[idx], dx=d_x) + data_contents = { + "Q": Quantity(x[idx], data2D._data_contents["Qx"].units, dQ), + "I": Quantity(y[idx], data2D.ordinate.units, err_y[idx]), + } + return SasData("Circular Average", data_contents, one_dim, data2D.metadata) ################################################################################ class Ring(Ring): - """ - Wrapper for new Ring. - """ - + """Wrapper for new Ring.""" @property def nbins_phi(self): @@ -520,12 +502,9 @@ def nbins_phi(self, value): self.nbins = value def __init__(self, r_min=0.0, r_max=0.0, center_x=0.0, center_y=0.0, nbins=36): - - super().__init__( - r_range=(r_min, r_max), - center=(center_x, center_y), - nbins=nbins - ) + super().__init__(r_range=(r_min, r_max), + center=(center_x, center_y), + nbins=nbins) class _Sector: """ @@ -539,12 +518,10 @@ class _Sector: starting from the negative x-axis. """ - def __init__(self, r_min, r_max, phi_min=0, phi_max=2 * math.pi, nbins=20, - base=None): - ''' - :param base: must be a valid base for an algorithm, i.e., - a positive number - ''' + def __init__(self, r_min, r_max, phi_min=0, phi_max=2*math.pi, nbins=20, base=None): + """ + :param base: must be a valid base for an algorithm, i.e., a positive number + """ self.r_min = r_min self.r_max = r_max self.phi_min = phi_min @@ -559,26 +536,28 @@ def _agv(self, data2D, run='phi'): """ Perform sector averaging. - :param data2D: Data2D object - :param run: define the varying parameter ('phi' , or 'sector') + :param data2D: SasData object + :param run: define the varying parameter ('phi' or 'sector') - :return: Data1D object + :return: SasData object """ - if data2D.__class__.__name__ not in ["Data2D", "plottable_2D"]: - raise RuntimeError("Ring averaging only take plottable_2D objects") + if not ("Qx" in data2D._data_contents and + "Qy" in data2D._data_contents): + raise RuntimeError("For averaging the SasData object must contain 'Qx' and 'Qy' data.") # Get all the data & info - data = data2D.data[np.isfinite(data2D.data)] - q_data = data2D.q_data[np.isfinite(data2D.data)] - err_data=None - if data2D.err_data is not None: - err_data = data2D.err_data[np.isfinite(data2D.data)] - qx_data = data2D.qx_data[np.isfinite(data2D.data)] - qy_data = data2D.qy_data[np.isfinite(data2D.data)] - mask_data = data2D.mask[np.isfinite(data2D.data)] + finite_mask = np.isfinite(data2D.ordinate.value) + data = data2D.ordinate.value[finite_mask] + err_data = np.sqrt(data2D.ordinate.variance.value)[finite_mask] + qx_data = data2D._data_contents["Qx"].value[finite_mask] + qy_data = data2D._data_contents["Qy"].value[finite_mask] + q_data = np.sqrt(data2D._data_contents["Qx"].value ** 2 + + data2D._data_contents["Qy"].value ** 2 + )[finite_mask] + mask_data = (data2D.mask if data2D.mask is not None else np.ones_like(data2D.ordinate.value, dtype=bool))[finite_mask] dq_data = None - if data2D.dqx_data is not None and data2D.dqy_data is not None: + if data2D._data_contents["Qx"].has_variance and data2D._data_contents["Qy"].has_variance: dq_data = get_dq_data(data2D) # set space for 1d outputs @@ -736,13 +715,19 @@ def _agv(self, data2D, run='phi'): idx = (np.isfinite(y) & np.isfinite(y_err)) if x_err is not None: - d_x = x_err[idx] / y_counts[idx] + dQ = x_err[idx] / y_counts[idx] else: - d_x = None + dQ = None if not idx.any(): msg = "Average Error: No points inside sector of ROI to average..." raise ValueError(msg) - return Data1D(x=x[idx], y=y[idx], dy=y_err[idx], dx=d_x) + + data_contents = { + "Q": Quantity(x[idx], data2D._data_contents["Qx"].units, dQ), + "I": Quantity(y[idx], data2D.ordinate.units, y_err[idx]), + } + return SasData("agv", data_contents, one_dim, data2D.metadata) + class SectorPhi(_Sector): @@ -758,8 +743,8 @@ def __call__(self, data2D): """ Perform sector average and return I(phi). - :param data2D: Data2D object - :return: Data1D object + :param data2D: SasData object + :return: SasData object """ return self._agv(data2D, 'phi') @@ -781,38 +766,28 @@ def __call__(self, data2D): """ Perform sector average and return I(Q). - :param data2D: Data2D object + :param data2D: SasData object - :return: Data1D object + :return: SasData object """ return self._agv(data2D, 'sector') class WedgePhi(WedgePhi): - """ - Wrapper for new WedgePhi (behaviour matches legacy WedgePhi expectations). - """ + """Wrapper for new WedgePhi (behaviour matches legacy WedgePhi expectations).""" def __init__(self, r_min, r_max, phi_min=0, phi_max=TwoPi, center_x=0.0, center_y=0.0, nbins=10): - - super().__init__( - r_range=(r_min, r_max), - phi_range=(phi_min, phi_max), - center=(center_x, center_y), - nbins=nbins - ) + super().__init__(r_range=(r_min, r_max), + phi_range=(phi_min, phi_max), + center=(center_x, center_y), + nbins=nbins) class WedgeQ(WedgeQ): - """ - Wrapper for new WedgeQ (behaviour matches legacy WedgeQ expectations). - """ + """Wrapper for new WedgeQ (behaviour matches legacy WedgeQ expectations).""" def __init__(self, r_min, r_max, phi_min=0, phi_max=TwoPi, center_x=0.0, center_y=0.0, nbins=10): - - super().__init__( - r_range=(r_min, r_max), - phi_range=(phi_min, phi_max), - center=(center_x, center_y), - nbins=nbins - ) + super().__init__(r_range=(r_min, r_max), + phi_range=(phi_min, phi_max), + center=(center_x, center_y), + nbins=nbins) ################################################################################ @@ -820,12 +795,9 @@ def __init__(self, r_min, r_max, phi_min=0, phi_max=TwoPi, center_x=0.0, center_ class Ringcut(Ringcut): def __init__(self, r_min=0.0, r_max=0.0, center_x=0.0, center_y=0.0): # center_x, center_y ignored for compatibility - - super().__init__( - r_range=(r_min, r_max), - phi_range=(0.0, TwoPi), - center=(center_x, center_y) - ) + super().__init__(r_range=(r_min, r_max), + phi_range=(0.0, TwoPi), + center=(center_x, center_y)) ################################################################################ diff --git a/sasdata/data_util/nxsunit.py b/sasdata/data_util/nxsunit.py index a5c3ab536..2fa8891cb 100644 --- a/sasdata/data_util/nxsunit.py +++ b/sasdata/data_util/nxsunit.py @@ -51,8 +51,8 @@ __all__ = ['Converter', 'standardize_units'] T = TypeVar('T') ConversionType = float | tuple[float, float] -DIMENSIONS = {} # type: Dict[str, Dict[str, ConversionType]] -AMBIGUITIES = {} # type: Dict[str, str] +DIMENSIONS: dict[str, dict[str, ConversionType]] = {} +AMBIGUITIES: dict[str, str] = {} PREFIX = dict(peta=1e15, tera=1e12, giga=1e9, mega=1e6, kilo=1e3, deci=1e-1, centi=1e-2, milli=1e-3, mili=1e-3, micro=1e-6, nano=1e-9, pico=1e-12, femto=1e-15) SHORT_PREFIX = dict(P=1e15, T=1e12, G=1e9, M=1e6, k=1e3, d=1e-1, c=1e-2, m=1e-3, u=1e-6, n=1e-9, p=1e-12, f=1e-15) @@ -258,7 +258,7 @@ def _build_all_units(): # APS files may be using 'a.u.' for 'arbitrary units'. Other # facilities are leaving the units blank, using ??? or not even # writing the units attributes. - unknown = {} # type: Dict[str, ConversionType] + unknown: dict[str, ConversionType] = {} unknown.update( {'None': 1, '???': 1, '': 1, 'A.U.': 1, 'a.u.': 1, 'arbitrary': 1, 'arbitrary units': 1, 'Counts': 1, 'counts': 1, 'Cts': 1, 'cts': 1, 'unitless': 1, 'unknown': 1, 'Unknown': 1, 'Unk': 1} @@ -356,15 +356,15 @@ class Converter: value name. """ #: Name of the source units (km, Ang, us, ...) - _units = None # type: List[str] + _units: list[str] = None #: Type of the source units (distance, time, frequency, ...) - dimension = None # type: List[str] + dimension: list[str] = None #: Scale converter, mapping unit name to scale factor or (scale, offset) #: for temperature units. - scalemap = None # type: List[Dict[str, ConversionType]] + scalemap: list[dict[str, ConversionType]] = None #: Scale base for the source units - scalebase = None # type: float - scaleoffset = None # type: float + scalebase: float = None + scaleoffset: float = None @property def units(self) -> str: @@ -375,7 +375,7 @@ def units(self, unit: str): self._units = standardize_units(unit) def __init__(self, units: str | None = None, dimension: list[str] | None = None): - self.units = units if units is not None else 'a.u.' # type: str + self.units: str = units if units is not None else 'a.u.' # Lookup dimension if not given if dimension: diff --git a/sasdata/data_util/roi.py b/sasdata/data_util/roi.py index 73cee5c2d..3c386aac2 100644 --- a/sasdata/data_util/roi.py +++ b/sasdata/data_util/roi.py @@ -1,18 +1,18 @@ import numpy as np -from sasdata.dataloader.data_info import Data2D +from sasdata.data import SasData from sasdata.quantities.constants import TwoPi class GenericROI: """ - Base class used to set up the data from a Data2D object for processing. + Base class used to set up the data from a SasData object for processing. This class performs any coordinate system independent setup and validation. """ def __init__(self, center: tuple[float, float] = (0.0, 0.0)): """ - Assign the variables used to label the properties of the Data2D object. + Assign the variables used to label the properties of the SasData object. In classes inheriting from GenericROI, the variables used to define the boundaries of the Region Of Interest are also set up during __init__. @@ -26,106 +26,100 @@ def __init__(self, center: tuple[float, float] = (0.0, 0.0)): self.qx_data = None self.qy_data = None - def validate_and_assign_data(self, data2d: Data2D = None) -> None: + def validate_and_assign_data(self, data2d: SasData | None = None) -> None: """ Check that the data supplied is valid and assign data to variables. - This method must be executed before any further data processing happens + This method must be executed before any further data processing happens. - :param data2d: A Data2D object which is the target of a child class' + :param data2d: A SasData object which is the target of a child class' data manipulations. """ - # Check that the supplied data2d is valid and usable. - if not isinstance(data2d, Data2D): - msg = "Data supplied must be of type Data2D." + # Check that the supplied data is valid and usable. + if not isinstance(data2d, SasData): + msg = "Data supplied must be of type SasData." raise TypeError(msg) - if len(data2d.detector) > 1: - msg = f"Invalid number of detectors: {len(data2d.detector)}" + if not ("Qx" in data2d._data_contents and + "Qy" in data2d._data_contents): + msg = "SasData object must contain 'Qx' and 'Qy' data." + raise TypeError(msg) + if len(data2d.metadata.instrument.detector) > 1: + msg = (f"Invalid number of detectors: {len(data2d.metadata.instrument.detector)}." + "Cannot have more than 1 detector.") raise ValueError(msg) # Only use data which is finite and not masked off - valid_data = np.isfinite(data2d.data) & data2d.mask + if data2d.mask is not None: + valid_data = np.isfinite(data2d.ordinate.value) & data2d.mask + else: + valid_data = np.isfinite(data2d.ordinate.value) - # Assign properties of the Data2D object to variables for reference + # Assign properties of the SasData object to variables for reference # during data processing. - self.data = data2d.data[valid_data] - self.err_data = data2d.err_data[valid_data] + self.data = data2d.ordinate.value[valid_data] + self.err_data = np.sqrt(data2d.ordinate.variance.value)[valid_data] - self.qx_data = data2d.qx_data[valid_data]-self.center_x - self.qy_data = data2d.qy_data[valid_data]-self.center_y - self.q_data = np.sqrt(self.qx_data * self.qx_data + self.qy_data * self.qy_data) + self.qx_data = data2d._data_contents["Qx"].value[valid_data] - self.center_x + self.qy_data = data2d._data_contents["Qy"].value[valid_data] - self.center_y + self.q_data = np.sqrt(self.qx_data ** 2 + self.qy_data ** 2) # Compute phi in the legacy convention: atan2(qy,qx) + pi # (legacy code used this origin; keeping it here makes all polar - # averaging implementations agree and restores the tests). + # averaging implementations agree and restores the tests). self.phi_data = np.arctan2(self.qy_data, self.qx_data) + np.pi # No points should have zero error, if they do then assume the error is # the square root of the data. This code was added to replicate # previous functionality. It's a bit dodgy, so feel free to remove. - self.err_data[self.err_data == 0] = \ - np.sqrt(np.abs(self.data[self.err_data == 0])) + self.err_data[self.err_data == 0] = np.sqrt(np.abs(self.data[self.err_data == 0])) class CartesianROI(GenericROI): - """ - Base class for data manipulators with a Cartesian (rectangular) ROI. - """ + """Base class for data manipulators with a Cartesian (rectangular) ROI.""" def __init__(self, qx_range: tuple[float, float] = (0.0, 0.0), qy_range: tuple[float, float] = (0.0, 0.0)) -> None: """ - Assign the variables used to label the properties of the Data2D object. + Assign the variables used to label the properties of the SasData object. Also establish the upper and lower bounds defining the ROI. - The units of these parameters are A^-1 :param qx_range: Bounds of the ROI along the Q_x direction. :param qy_range: Bounds of the ROI along the Q_y direction. """ + super().__init__() qx_min, qx_max = qx_range qy_min, qy_max = qy_range - super().__init__() self.qx_min = qx_min self.qx_max = qx_max self.qy_min = qy_min self.qy_max = qy_max class PolarROI(GenericROI): - """ - Base class for data manipulators with a polar ROI. - """ + """Base class for data manipulators with a polar ROI.""" - def __init__(self, r_range: tuple[float, float], phi_range: tuple[float, float] = (0.0, TwoPi), center: tuple[float, float] = (0.0, 0.0)) -> None: + def __init__(self, + r_range: tuple[float, float], + phi_range: tuple[float, float] = (0.0, TwoPi), + center: tuple[float, float] = (0.0, 0.0) + ) -> None: """ - Assign the variables used to label the properties of the Data2D object. + Assign the variables used to label the properties of the SasData object. Also establish the upper and lower bounds defining the ROI. - The units are A^-1 for radial parameters, and radians for anglar ones. :param r_range: Tuple (r_min, r_max) defining limits for |Q| values to use during averaging. - :param phi_range: Tuple (phi_min, phi_max) defining limits for φ in radians (in the ROI). + :param phi_range: Tuple (phi_min, phi_max) defining limits for φ in the ROI. Note that Phi is measured anti-clockwise from the positive x-axis. """ - r_min, r_max = r_range - phi_min, phi_max = phi_range super().__init__(center = center) self.phi_data = None + r_min, r_max = r_range + phi_min, phi_max = phi_range + if r_min >= r_max: msg = "Minimum radius cannot be greater than maximum radius." raise ValueError(msg) - # Units A^-1 for radii, radians for angles + self.r_min = r_min self.r_max = r_max self.phi_min = phi_min self.phi_max = phi_max - - def validate_and_assign_data(self, data2d: Data2D = None) -> None: - """ - Check that the data supplied valid and assign data variables. - This method must be executed before any further data processing happens - - :param data2d: A Data2D object which is the target of a child class' - data manipulations. - """ - - # Most validation and pre-processing is taken care of by GenericROI. - super().validate_and_assign_data(data2d) diff --git a/sasdata/dataloader/data_info.py b/sasdata/dataloader/data_info.py index 8c3a199ed..95fcac281 100644 --- a/sasdata/dataloader/data_info.py +++ b/sasdata/dataloader/data_info.py @@ -768,7 +768,7 @@ def is_slit_smeared(self): :return: True is slit smearing info is present, False otherwise """ def _check(v): - return (isinstance(v.__class__ == list | np.ndarray) + return (isinstance(v.__class__, list | np.ndarray) and len(v) > 0 and min(v) > 0) return _check(self.dxl) or _check(self.dxw) diff --git a/sasdata/dataloader/readers/red2d_reader.py b/sasdata/dataloader/readers/red2d_reader.py index 3d468911d..d84af6155 100644 --- a/sasdata/dataloader/readers/red2d_reader.py +++ b/sasdata/dataloader/readers/red2d_reader.py @@ -82,7 +82,6 @@ def get_file_contents(self): wavelength = None distance = None - transmission = None pixel_x = None pixel_y = None diff --git a/sasdata/dataset_types.py b/sasdata/dataset_types.py index ffccd9653..fc1a3169b 100644 --- a/sasdata/dataset_types.py +++ b/sasdata/dataset_types.py @@ -27,19 +27,36 @@ class DatasetType: two_dim = DatasetType( name="2D I vs Q", required=["Qx", "Qy", "I"], - optional=["dQx", "dQy", "dI", "Qz", "ShadowFactor", "mask"], + optional=["dQx", "dQy", "dQz", "dI", "Qz", "ShadowFactor", "mask"], expected_orders=[ ["Qx", "Qy", "I"], ["Qx", "Qy", "I", "dI"], ["Qx", "Qy", "dQx", "dQy", "I", "dI"]]) +three_dim = DatasetType( + name="3D I vs Q", + required=["Qx", "Qy", "Qz", "I"], + optional=["dQx", "dQy", "dQz", "dI", "ShadowFactor", "mask"], + expected_orders=[ + ["Qx", "Qy", "Qz", "I"], + ["Qx", "Qy", "Qz", "I", "dI"], + ["Qx", "Qy", "Qz", "dQx", "dQy", "dQz", "I", "dI"]]) + +angle_dim = DatasetType( + name="I vs Phi", + required=["Phi", "I"], + optional=["dI", "dPhi", "Shadowfactor"], + expected_orders=[ + ["Phi", "I", "dI"], + ["Phi", "dPhi", "I", "dI"]]) + sesans = DatasetType( name="SESANS", required=["SpinEchoLength", "Depolarisation", "Wavelength"], optional=["Transmission", "Polarisation"], expected_orders=[["z", "G"]]) -dataset_types = {dataset.name for dataset in [one_dim, two_dim, sesans]} +dataset_types = {dataset.name for dataset in [one_dim, two_dim, angle_dim, sesans]} # diff --git a/sasdata/distributions.py b/sasdata/distributions.py new file mode 100644 index 000000000..6ad149e0e --- /dev/null +++ b/sasdata/distributions.py @@ -0,0 +1,11 @@ + + +class DistributionModel: + + + @property + def is_density(self) -> bool: + return False + + def standard_deviation(self) -> Quantity: + return NotImplementedError("Variance not implemented yet") diff --git a/sasdata/manual_tests/__init__.py b/sasdata/manual_tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/sasdata/manual_tests/interpolation.py b/sasdata/manual_tests/interpolation.py new file mode 100644 index 000000000..59d53815c --- /dev/null +++ b/sasdata/manual_tests/interpolation.py @@ -0,0 +1,43 @@ +import matplotlib.pyplot as plt +import numpy as np + +from sasdata.quantities import units +from sasdata.quantities.plotting import quantity_plot +from sasdata.quantities.quantity import NamedQuantity +from sasdata.transforms.rebinning import InterpolationOptions, calculate_interpolation_matrix_1d + + +def linear_interpolation_check(): + + for from_bins in [(-10, 10, 10), + (-10, 10, 1000), + (-15, 5, 10), + (15,5, 10)]: + for to_bins in [ + (-15, 0, 10), + (-15, 15, 10), + (0, 20, 100)]: + + plt.figure() + + x = NamedQuantity("x", np.linspace(*from_bins), units=units.meters) + y = x**2 + + quantity_plot(x, y) + + new_x = NamedQuantity("x_new", np.linspace(*to_bins), units=units.meters) + + rebin_mat = calculate_interpolation_matrix_1d(x, new_x, order=InterpolationOptions.LINEAR) + + new_y = y @ rebin_mat + + quantity_plot(new_x, new_y) + + print(new_y.history.summary()) + + plt.show() + + + + +linear_interpolation_check() diff --git a/sasdata/metadata.py b/sasdata/metadata.py index 588a4de76..d53c3102c 100644 --- a/sasdata/metadata.py +++ b/sasdata/metadata.py @@ -538,7 +538,7 @@ class Metadata: process: list[Process] sample: Sample | None instrument: Instrument | None - raw: MetaNode + raw: MetaNode | None def summary(self): run_string = str(self.run[0] if len(self.run) == 1 else self.run) @@ -567,6 +567,14 @@ def from_json(obj): raw=MetaNode.from_json(obj["raw"]), ) + @property + def id_header(self): + """Generate a header for used in the unique_id for datasets""" + title = "" + if self.title is not None: + title = self.title + return f"{title}:{",".join(self.run)}" + def as_h5(self, f: h5py.Group): """Export data onto an HDF5 group""" for idx, run in enumerate(self.run): diff --git a/sasdata/postprocess.py b/sasdata/postprocess.py new file mode 100644 index 000000000..1d7866098 --- /dev/null +++ b/sasdata/postprocess.py @@ -0,0 +1,57 @@ +""" + +Post processing for loaded files + +""" + +import numpy as np + +from sasdata.data import SasData + + +def fix_mantid_units_error(data: SasData) -> SasData: + pass + + + +def apply_fixes(data: SasData, mantid_unit_error=True): + if mantid_unit_error: + data = fix_mantid_units_error(data) + + return data + + +def deduce_qz(data: SasData): + """Calculates and appends Qz to SasData if Qx, Qy, and wavelength are all present""" + # if Qz is not already in the dataset, but Qx and Qy are + if 'Qz' not in data._data_contents and 'Qx' in data._data_contents and 'Qy' in data._data_contents: + # we start by making the approximation that qz=0 + data._data_contents['Qz'] = 0*data._data_contents['Qx'] + + # now check if metadata has wavelength information + wavelength = getattr( + getattr( + getattr( + getattr(data, "metadata", None), + "instrument", + None + ), + "source", + None + ), + "wavelength", + None + ) + + if wavelength is not None: + # we can deduce the value of qz from qx and qy + # if we have the wavelength + qx = data._data_contents['Qx'] + qy = data._data_contents['Qy'] + + # this is how you convert qx, qy, and wavelength to qz + k0 = 2*np.pi/wavelength + qz = k0-(k0**2-qx**2-qy**2)**(0.5) + + data._data_contents['Qz'] = qz + diff --git a/sasdata/quantities/_accessor_base.py b/sasdata/quantities/_accessor_base.py new file mode 100644 index 000000000..09a1b6e01 --- /dev/null +++ b/sasdata/quantities/_accessor_base.py @@ -0,0 +1,152 @@ +from typing import TypeVar + +import sasdata.quantities.units as units +from sasdata.data_backing import Dataset, Group +from sasdata.quantities.quantity import Quantity +from sasdata.quantities.unit_parser import parse_unit +from sasdata.quantities.units import Unit + + +# logger = logging.getLogger("Accessors") +class LoggerDummy: + def info(self, data): + print(data) +logger = LoggerDummy() + +DataType = TypeVar("DataType") +OutputType = TypeVar("OutputType") + + +class AccessorTarget: + def __init__(self, data: Group, verbose=False, prefix_tokens: tuple=()): + self._data = data + self.verbose = verbose + + self.prefix_tokens = list(prefix_tokens) + + def with_path_prefix(self, path_prexix: str): + """ Get an accessor that looks at a subtree of the metadata with the supplied prefix + + For example, accessors aiming at a.b, when the target it c.d will look at c.d.a.b + """ + return AccessorTarget(self._data, + verbose=self.verbose, + prefix_tokens=tuple(self.prefix_tokens + [path_prexix])) + + def get_value(self, path: str): + + tokens = self.prefix_tokens + path.split(".") + + if self.verbose: + logger.info(f"Finding: {path}") + logger.info(f"Full path: {tokens}") + + # Navigate the tree from the entry we need + + current_tree_position: Group | Dataset = self._data + + for token in tokens: + + options = token.split("|") + + if isinstance(current_tree_position, Group): + + found = False + for option in options: + if option in current_tree_position.children: + current_tree_position = current_tree_position.children[option] + found = True + + if self.verbose: + logger.info(f"Found option: {option}") + + if not found: + if self.verbose: + logger.info(f"Failed to find any of {options} on group {current_tree_position.name}. Options: " + + ",".join([key for key in current_tree_position.children])) + return None + + elif isinstance(current_tree_position, Dataset): + + found = False + for option in options: + if option in current_tree_position.attributes: + current_tree_position = current_tree_position.attributes[option] + found = True + + if self.verbose: + logger.info(f"Found option: {option}") + + if not found: + if self.verbose: + logger.info(f"Failed to find any of {options} on attribute {current_tree_position.name}. Options: " + + ",".join([key for key in current_tree_position.attributes])) + return None + + if self.verbose: + logger.info(f"Found value: {current_tree_position}") + + return current_tree_position.data + + + +class Accessor[DataType, OutputType]: + """ Base class """ + def __init__(self, target_object: AccessorTarget, value_target: str): + self.target_object = target_object + self.value_target = value_target + + @property + def value(self) -> OutputType | None: + return self.target_object.get_value(self.value_target) + +class StringAccessor(Accessor[str, str]): + """ String based fields """ + @property + def value(self) -> str | None: + return self.target_object.get_value(self.value_target) + +class FloatAccessor(Accessor[float, float]): + """ Float based fields """ + @property + def value(self) -> float | None: + return self.target_object.get_value(self.value_target) + + + + +class QuantityAccessor[DataType](Accessor[DataType, Quantity[DataType]]): + """ Base class for accessors that work with quantities that have units """ + def __init__(self, target_object: AccessorTarget, value_target: str, unit_target: str, default_unit=units.none): + super().__init__(target_object, value_target) + self._unit_target = unit_target + self.default_unit = default_unit + + def _numerical_part(self) -> DataType | None: + """ Numerical part of the data """ + return self.target_object.get_value(self.value_target) + + def _unit_part(self) -> str | None: + """ String form of units for the data """ + return self.target_object.get_value(self._unit_target) + + @property + def unit(self) -> Unit: + u = self._unit_part() + if u is None: + return self.default_unit + else: + return parse_unit(u) + + @property + def value(self) -> Quantity[DataType] | None: + if self._unit_part() is not None and self._numerical_part() is not None: + return Quantity(self._numerical_part(), self.unit) + return None + + @property + def quantity(self): + if self._unit_part() is not None and self._numerical_part() is not None: + return Quantity(self._numerical_part(), self.unit) + return None + diff --git a/sasdata/quantities/_autogen_warning.py b/sasdata/quantities/_autogen_warning.py deleted file mode 100644 index 9a8c9372e..000000000 --- a/sasdata/quantities/_autogen_warning.py +++ /dev/null @@ -1,79 +0,0 @@ -warning_text = """ - -This file is autogenerated! - -Do not edit by hand, instead edit the files that build it (%s) - - - - -DDDDDDDDDDDDD NNNNNNNN NNNNNNNN tttt -D::::::::::::DDD N:::::::N N::::::N ttt:::t -D:::::::::::::::DD N::::::::N N::::::N t:::::t -DDD:::::DDDDD:::::D N:::::::::N N::::::N t:::::t - D:::::D D:::::D ooooooooooo N::::::::::N N::::::N ooooooooooo ttttttt:::::ttttttt - D:::::D D:::::D oo:::::::::::oo N:::::::::::N N::::::N oo:::::::::::oo t:::::::::::::::::t - D:::::D D:::::Do:::::::::::::::o N:::::::N::::N N::::::No:::::::::::::::ot:::::::::::::::::t - D:::::D D:::::Do:::::ooooo:::::o N::::::N N::::N N::::::No:::::ooooo:::::otttttt:::::::tttttt - D:::::D D:::::Do::::o o::::o N::::::N N::::N:::::::No::::o o::::o t:::::t - D:::::D D:::::Do::::o o::::o N::::::N N:::::::::::No::::o o::::o t:::::t - D:::::D D:::::Do::::o o::::o N::::::N N::::::::::No::::o o::::o t:::::t - D:::::D D:::::D o::::o o::::o N::::::N N:::::::::No::::o o::::o t:::::t tttttt -DDD:::::DDDDD:::::D o:::::ooooo:::::o N::::::N N::::::::No:::::ooooo:::::o t::::::tttt:::::t -D:::::::::::::::DD o:::::::::::::::o N::::::N N:::::::No:::::::::::::::o tt::::::::::::::t -D::::::::::::DDD oo:::::::::::oo N::::::N N::::::N oo:::::::::::oo tt:::::::::::tt -DDDDDDDDDDDDD ooooooooooo NNNNNNNN NNNNNNN ooooooooooo ttttttttttt - - - - - - - - - dddddddd -EEEEEEEEEEEEEEEEEEEEEE d::::::d iiii tttt BBBBBBBBBBBBBBBBB -E::::::::::::::::::::E d::::::d i::::i ttt:::t B::::::::::::::::B -E::::::::::::::::::::E d::::::d iiii t:::::t B::::::BBBBBB:::::B -EE::::::EEEEEEEEE::::E d:::::d t:::::t BB:::::B B:::::B - E:::::E EEEEEE ddddddddd:::::d iiiiiiittttttt:::::ttttttt B::::B B:::::Byyyyyyy yyyyyyy - E:::::E dd::::::::::::::d i:::::it:::::::::::::::::t B::::B B:::::B y:::::y y:::::y - E::::::EEEEEEEEEE d::::::::::::::::d i::::it:::::::::::::::::t B::::BBBBBB:::::B y:::::y y:::::y - E:::::::::::::::E d:::::::ddddd:::::d i::::itttttt:::::::tttttt B:::::::::::::BB y:::::y y:::::y - E:::::::::::::::E d::::::d d:::::d i::::i t:::::t B::::BBBBBB:::::B y:::::y y:::::y - E::::::EEEEEEEEEE d:::::d d:::::d i::::i t:::::t B::::B B:::::B y:::::y y:::::y - E:::::E d:::::d d:::::d i::::i t:::::t B::::B B:::::B y:::::y:::::y - E:::::E EEEEEEd:::::d d:::::d i::::i t:::::t tttttt B::::B B:::::B y:::::::::y -EE::::::EEEEEEEE:::::Ed::::::ddddd::::::ddi::::::i t::::::tttt:::::t BB:::::BBBBBB::::::B y:::::::y -E::::::::::::::::::::E d:::::::::::::::::di::::::i tt::::::::::::::t B:::::::::::::::::B y:::::y -E::::::::::::::::::::E d:::::::::ddd::::di::::::i tt:::::::::::tt B::::::::::::::::B y:::::y -EEEEEEEEEEEEEEEEEEEEEE ddddddddd dddddiiiiiiii ttttttttttt BBBBBBBBBBBBBBBBB y:::::y - y:::::y - y:::::y - y:::::y - y:::::y - yyyyyyy - - - - dddddddd -HHHHHHHHH HHHHHHHHH d::::::d -H:::::::H H:::::::H d::::::d -H:::::::H H:::::::H d::::::d -HH::::::H H::::::HH d:::::d - H:::::H H:::::H aaaaaaaaaaaaa nnnn nnnnnnnn ddddddddd:::::d - H:::::H H:::::H a::::::::::::a n:::nn::::::::nn dd::::::::::::::d - H::::::HHHHH::::::H aaaaaaaaa:::::an::::::::::::::nn d::::::::::::::::d - H:::::::::::::::::H a::::ann:::::::::::::::nd:::::::ddddd:::::d - H:::::::::::::::::H aaaaaaa:::::a n:::::nnnn:::::nd::::::d d:::::d - H::::::HHHHH::::::H aa::::::::::::a n::::n n::::nd:::::d d:::::d - H:::::H H:::::H a::::aaaa::::::a n::::n n::::nd:::::d d:::::d - H:::::H H:::::H a::::a a:::::a n::::n n::::nd:::::d d:::::d -HH::::::H H::::::HHa::::a a:::::a n::::n n::::nd::::::ddddd::::::dd -H:::::::H H:::::::Ha:::::aaaa::::::a n::::n n::::n d:::::::::::::::::d -H:::::::H H:::::::H a::::::::::aa:::a n::::n n::::n d:::::::::ddd::::d -HHHHHHHHH HHHHHHHHH aaaaaaaaaa aaaa nnnnnn nnnnnn ddddddddd ddddd - - - -""" diff --git a/sasdata/quantities/_build_tables.py b/sasdata/quantities/_build_tables.py deleted file mode 100644 index ba07aee80..000000000 --- a/sasdata/quantities/_build_tables.py +++ /dev/null @@ -1,448 +0,0 @@ -""" -Builds a data file containing details of units -""" - -from collections import defaultdict, namedtuple - -import numpy as np -from _autogen_warning import warning_text -from _units_base import Dimensions - -Magnitude = namedtuple("Magnitude", ["symbol", "special_symbol", "latex_symbol", "name", "scale"]) - -bigger_magnitudes: list[Magnitude] = [ - Magnitude("E", None, None, "exa", 1e18), - Magnitude("P", None, None, "peta", 1e15), - Magnitude("T", None, None, "tera", 1e12), - Magnitude("G", None, None, "giga", 1e9), - Magnitude("M", None, None, "mega", 1e6), - Magnitude("k", None, None, "kilo", 1e3) ] - -smaller_magnitudes: list[Magnitude] = [ - Magnitude("m", None, None, "milli", 1e-3), - Magnitude("u", "µ", r"\mu", "micro", 1e-6), - Magnitude("n", None, None, "nano", 1e-9), - Magnitude("p", None, None, "pico", 1e-12), - Magnitude("f", None, None, "femto", 1e-15), - Magnitude("a", None, None, "atto", 1e-18)] - -unusual_magnitudes: list[Magnitude] = [ - Magnitude("d", None, None, "deci", 1e-1), - Magnitude("c", None, None, "centi", 1e-2) -] - -all_magnitudes = bigger_magnitudes + smaller_magnitudes - -UnitData = namedtuple("UnitData", ["symbol", "special_symbol", "latex_symbol", "singular", "plural", "scale", "length", "time", "mass", "current", "temperature", "moles_hint", "angle_hint", "magnitudes"]) - -# Length, time, mass, current, temperature -base_si_units = [ - UnitData("m", None, None, "meter", "meters", 1, 1, 0, 0, 0, 0, 0, 0, all_magnitudes + unusual_magnitudes), - UnitData("s", None, None, "second", "seconds", 1, 0, 1, 0, 0, 0, 0, 0, smaller_magnitudes), - UnitData("g", None, None, "gram", "grams", 1e-3, 0, 0, 1, 0, 0, 0, 0, all_magnitudes), - UnitData("A", None, None, "ampere", "amperes", 1, 0, 0, 0, 1, 0, 0, 0, all_magnitudes), - UnitData("K", None, None, "kelvin", "kelvin", 1, 0, 0, 0, 0, 1, 0, 0, all_magnitudes) ] - -derived_si_units = [ - UnitData("Hz", None, None, "hertz", "hertz", 1, 0, -1, 0, 0, 0, 0, 0, all_magnitudes), - UnitData("N", None, None, "newton", "newtons", 1, 1, -2, 1, 0, 0, 0, 0, all_magnitudes), - UnitData("Pa", None, None, "pascal", "pascals", 1, -1, -2, 1, 0, 0, 0, 0, all_magnitudes), - UnitData("J", None, None, "joule", "joules", 1, 2, -2, 1, 0, 0, 0, 0, all_magnitudes), - UnitData("W", None, None, "watt", "watts", 1, 2, -3, 1, 0, 0, 0, 0, all_magnitudes), - UnitData("C", None, None, "coulomb", "coulombs", 1, 0, 1, 0, 1, 0, 0, 0, all_magnitudes), - UnitData("V", None, None, "volts", "volts", 1, 2, -3, 1, -1, 0, 0, 0, all_magnitudes), - UnitData("Ohm", "Ω", r"\Omega", "ohm", "ohms", 1, 2, -3, 1, -2, 0, 0, 0, all_magnitudes), - UnitData("F", None, None, "farad", "farads", 1, -2, 4, -1, 2, 0, 0, 0, all_magnitudes), - UnitData("S", None, None, "siemens", "siemens", 1, -2, 3, -1, 2, 0, 0, 0, all_magnitudes), - UnitData("Wb", None, None, "weber", "webers", 1, 2, -2, 1, -1, 0, 0, 0, all_magnitudes), - UnitData("T", None, None, "tesla", "tesla", 1, 0, -2, 1, -1, 0, 0, 0, all_magnitudes), - UnitData("H", None, None, "henry", "henry", 1, 2, -2, 1, -2, 0, 0, 0, all_magnitudes), -] - -non_si_dimensioned_units: list[tuple[str, str | None, str, str, float, int, int, int, int, int, int, int, list]] = [ - UnitData("Ang", "Å", r"\AA", "angstrom", "angstroms", 1e-10, 1, 0, 0, 0, 0, 0, 0, []), - UnitData("micron", None, None, "micron", "microns", 1e-6, 1, 0, 0, 0, 0, 0, 0, []), - UnitData("min", None, None, "minute", "minutes", 60, 0, 1, 0, 0, 0, 0, 0, []), - UnitData("h", None, None, "hour", "hours", 3600, 0, 1, 0, 0, 0, 0, 0, []), - UnitData("d", None, None, "day", "days", 3600*24, 0, 1, 0, 0, 0, 0, 0, []), - UnitData("y", None, None, "year", "years", 3600*24*365.2425, 0, 1, 0, 0, 0, 0, 0, []), - UnitData("deg", None, None, "degree", "degrees", 180/np.pi, 0, 0, 0, 0, 0, 0, 1, []), - UnitData("rad", None, None, "radian", "radians", 1, 0, 0, 0, 0, 0, 0, 1, []), - UnitData("rot", None, None, "rotation", "rotations", 2*np.pi, 0, 0, 0, 0, 0, 0, 1, []), - UnitData("sr", None, None, "stradian", "stradians", 1, 0, 0, 0, 0, 0, 0, 2, []), - UnitData("l", None, None, "litre", "litres", 1e-3, 3, 0, 0, 0, 0, 0, 0, []), - UnitData("eV", None, None, "electronvolt", "electronvolts", 1.602176634e-19, 2, -2, 1, 0, 0, 0, 0, all_magnitudes), - UnitData("au", None, None, "atomic mass unit", "atomic mass units", 1.660538921e-27, 0, 0, 1, 0, 0, 0, 0, []), - UnitData("mol", None, None, "mole", "moles", 6.02214076e23, 0, 0, 0, 0, 0, 1, 0, smaller_magnitudes), - UnitData("kgForce", None, None, "kg force", "kg force", 9.80665, 1, -2, 1, 0, 0, 0, 0, []), - UnitData("C", None, None, "degree Celsius", "degrees Celsius", 1, 0, 0, 0, 0, 1, 0, 0, []), - UnitData("miles", None, None, "mile", "miles", 1760*3*0.3048, 1, 0, 0, 0, 0, 0, 0, []), - UnitData("yrd", None, None, "yard", "yards", 3*0.3048, 1, 0, 0, 0, 0, 0, 0, []), - UnitData("ft", None, None, "foot", "feet", 0.3048, 1, 0, 0, 0, 0, 0, 0, []), - UnitData("in", None, None, "inch", "inches", 0.0254, 1, 0, 0, 0, 0, 0, 0, []), - UnitData("lb", None, None, "pound", "pounds", 0.45359237, 0, 0, 1, 0, 0, 0, 0, []), - UnitData("lbf", None, None, "pound force", "pounds force", 4.448222, 1, -2, 1, 0, 0, 0, 0, []), - UnitData("oz", None, None, "ounce", "ounces", 0.45359237/16, 0, 0, 1, 0, 0, 0, 0, []), - UnitData("psi", None, None, "pound force per square inch", "pounds force per square inch", 4.448222/(0.0254**2), -1, -2, 1, 0, 0, 0, 0, []), -] - -non_si_dimensionless_units: list[tuple[str, str | None, str, str, float, int, int, int, int, int, int, int, list]] = [ - UnitData("none", None, None, "none", "none", 1, 0, 0, 0, 0, 0, 0, 0, []), - UnitData("percent", "%", r"\%", "percent", "percent", 0.01, 0, 0, 0, 0, 0, 0, 0, []) -] - -non_si_units = non_si_dimensioned_units + non_si_dimensionless_units - -# TODO: -# Add Hartree? Rydberg? Bohrs? -# Add CGS - -# Two stages of aliases, to make sure units don't get lost - -aliases_1 = { - "A": ["Amps", "amps"], - "C": ["Coulombs", "coulombs"] -} - -aliases_2 = { - "y": ["yr", "year"], - "d": ["day"], - "h": ["hr", "hour"], - "Ang": ["A", "Å"], - "au": ["amu"], - "percent": ["%"], - "deg": ["degr", "Deg", "degree", "degrees", "Degrees"], - "none": ["Counts", "counts", "cnts", "Cnts", "a.u.", "fraction", "Fraction"], - "K": ["C"] # Ugh, cansas -} - - - -all_units = base_si_units + derived_si_units + non_si_units - -encoding = "utf-8" - -def format_name(name: str): - return name.lower().replace(" ", "_") - -with open("units.py", 'w', encoding=encoding) as fid: - - # Write warning header - fid.write('"""'+(warning_text%"_build_tables.py, _units_base.py")+'"""') - - # Write in class definitions - fid.write("\n\n" - "#\n" - "# Included from _units_base.py\n" - "#\n\n") - - with open("_units_base.py") as base: - for line in base: - # unicode_superscript is a local module when called from - # _unit_tables.py but a submodule of sasdata.quantities - # when called from units.py. This condition patches the - # line when the copy is made. - if line.startswith("from unicode_superscript"): - fid.write(line.replace("from unicode_superscript", "from sasdata.quantities.unicode_superscript")) - else: - fid.write(line) - - # Write in unit definitions - fid.write("\n\n" - "#\n" - "# Specific units \n" - "#\n\n") - - symbol_lookup = {} - unit_types_temp = defaultdict(list) # Keep track of unit types - unit_types = defaultdict(list) - - for unit_def in all_units: - - formatted_plural = format_name(unit_def.plural) - formatted_singular = format_name(unit_def.singular) - - dimensions = Dimensions(unit_def.length, unit_def.time, unit_def.mass, unit_def.current, unit_def.temperature, unit_def.moles_hint, unit_def.angle_hint) - fid.write(f"{formatted_plural} = NamedUnit({unit_def.scale}, Dimensions({unit_def.length}, {unit_def.time}, {unit_def.mass}, {unit_def.current}, {unit_def.temperature}, {unit_def.moles_hint}, {unit_def.angle_hint})," - f"name='{formatted_plural}'," - f"ascii_symbol='{unit_def.symbol}'," - f"{'' if unit_def.latex_symbol is None else f"""latex_symbol=r'{unit_def.latex_symbol}',""" }" - f"symbol='{unit_def.symbol if unit_def.special_symbol is None else unit_def.special_symbol}')\n") - - symbol_lookup[unit_def.symbol] = formatted_plural - if unit_def.special_symbol is not None: - symbol_lookup[unit_def.special_symbol] = formatted_plural - - unit_types_temp[hash(dimensions)].append( - (unit_def.symbol, unit_def.special_symbol, formatted_singular, formatted_plural, unit_def.scale, dimensions)) - - unit_types[hash(dimensions)].append(formatted_plural) - - for mag in unit_def.magnitudes: - - # Work out the combined symbol, accounts for unicode or not - combined_special_symbol = (mag.symbol if mag.special_symbol is None else mag.special_symbol) + \ - (unit_def.symbol if unit_def.special_symbol is None else unit_def.special_symbol) - - combined_symbol = mag.symbol + unit_def.symbol - - # Combined unit name - combined_name_singular = f"{mag.name}{formatted_singular}" - combined_name_plural = f"{mag.name}{formatted_plural}" - - combined_scale = unit_def.scale * mag.scale - - latex_symbol = None - if unit_def.latex_symbol is not None and mag.latex_symbol is not None: - latex_symbol = f"{{{mag.latex_symbol}}}{unit_def.latex_symbol}" - elif unit_def.latex_symbol is not None: - latex_symbol = f"{mag.symbol}{unit_def.latex_symbol}" - elif mag.latex_symbol is not None: - latex_symbol = f"{{{mag.latex_symbol}}}{unit_def.symbol}" - - # Units - dimensions = Dimensions(unit_def.length, unit_def.time, unit_def.mass, unit_def.current, unit_def.temperature, unit_def.moles_hint, unit_def.angle_hint) - fid.write(f"{combined_name_plural} = NamedUnit({combined_scale}, " - f"Dimensions({unit_def.length}, {unit_def.time}, {unit_def.mass}, {unit_def.current}, {unit_def.temperature}, {unit_def.moles_hint}, {unit_def.angle_hint})," - f"name='{combined_name_plural}'," - f"ascii_symbol='{combined_symbol}'," - f"{'' if latex_symbol is None else f"""latex_symbol=r'{latex_symbol}',""" }" - f"symbol='{combined_special_symbol}')\n") - - symbol_lookup[combined_symbol] = combined_name_plural - symbol_lookup[combined_special_symbol] = combined_name_plural - - unit_types_temp[hash(dimensions)].append( - (combined_symbol, combined_special_symbol, combined_name_singular, - combined_name_plural, combined_scale, dimensions)) - - unit_types[hash(dimensions)].append(combined_name_plural) - - # - # Higher dimensioned types - # - - length_units = unit_types_temp[hash(Dimensions(length=1))] - time_units = unit_types_temp[hash(Dimensions(time=1))] - mass_units = unit_types_temp[hash(Dimensions(mass=1))] - amount_units = unit_types_temp[hash(Dimensions(moles_hint=1))] - - # Length based - for symbol, special_symbol, singular, plural, scale, _ in length_units: - for prefix, power, name, unicode_suffix in [ - ("square_", 2, plural, '²'), - ("cubic_", 3, plural, '³'), - ("per_", -1, singular, '⁻¹'), - ("per_square_", -2, singular,'⁻²'), - ("per_cubic_", -3, singular,'⁻³')]: - - dimensions = Dimensions(length=power) - unit_name = prefix + name - unit_special_symbol = (symbol if special_symbol is None else special_symbol) + unicode_suffix - unit_symbol = symbol + f"^{power}" - fid.write(f"{unit_name} = NamedUnit({scale**power}, Dimensions(length={power}), " - f"name='{unit_name}', " - f"ascii_symbol='{unit_symbol}', " - f"symbol='{unit_special_symbol}')\n") - - unit_types[hash(dimensions)].append(unit_name) - - # Speed and acceleration - for length_symbol, length_special_symbol, _, length_name, length_scale, _ in length_units: - for time_symbol, time_special_symbol, time_name, _, time_scale, _ in time_units: - speed_name = length_name + "_per_" + time_name - accel_name = length_name + "_per_square_" + time_name - - speed_dimensions = Dimensions(length=1, time=-1) - accel_dimensions = Dimensions(length=1, time=-2) - - length_special = length_special_symbol if length_special_symbol is not None else length_symbol - time_special = time_special_symbol if time_special_symbol is not None else time_symbol - - fid.write(f"{speed_name} " - f"= NamedUnit({length_scale / time_scale}, " - f"Dimensions(length=1, time=-1), " - f"name='{speed_name}', " - f"ascii_symbol='{length_symbol}/{time_symbol}', " - f"symbol='{length_special}{time_special}⁻¹')\n") - - fid.write(f"{accel_name} = NamedUnit({length_scale / time_scale**2}, " - f"Dimensions(length=1, time=-2), " - f"name='{accel_name}', " - f"ascii_symbol='{length_symbol}/{time_symbol}^2', " - f"symbol='{length_special}{time_special}⁻²')\n") - - unit_types[hash(speed_dimensions)].append(speed_name) - unit_types[hash(accel_dimensions)].append(accel_name) - - # Density - for length_symbol, length_special_symbol, length_name, _, length_scale, _ in length_units: - for mass_symbol, mass_special_symbol, _, mass_name, mass_scale, _ in mass_units: - - name = mass_name + "_per_cubic_" + length_name - - dimensions = Dimensions(length=-3, mass=1) - - mass_special = mass_symbol if mass_special_symbol is None else mass_special_symbol - length_special = length_symbol if length_special_symbol is None else length_special_symbol - - fid.write(f"{name} " - f"= NamedUnit({mass_scale / length_scale**3}, " - f"Dimensions(length=-3, mass=1), " - f"name='{name}', " - f"ascii_symbol='{mass_symbol} {length_symbol}^-3', " - f"symbol='{mass_special}{length_special}⁻³')\n") - - unit_types[hash(dimensions)].append(name) - - # Concentration - for length_symbol, length_special_symbol, length_name, _, length_scale, _ in length_units: - for amount_symbol, amount_special_symbol, _, amount_name, amount_scale, _ in amount_units: - - name = amount_name + "_per_cubic_" + length_name - - dimensions = Dimensions(length=-3, moles_hint=1) - - length_special = length_symbol if length_special_symbol is None else length_special_symbol - amount_special = amount_symbol if amount_special_symbol is None else amount_special_symbol - - fid.write(f"{name} " - f"= NamedUnit({amount_scale / length_scale**3}, " - f"Dimensions(length=-3, moles_hint=1), " - f"name='{name}', " - f"ascii_symbol='{amount_symbol} {length_symbol}^-3', " - f"symbol='{amount_special}{length_special}⁻³')\n") - - unit_types[hash(dimensions)].append(name) - - # TODO: Torque, Momentum, Entropy - - # - # Add aliases to symbol lookup table - # - - # Apply the alias transforms sequentially - for aliases in [aliases_1, aliases_2]: - for base_name in aliases: - alias_list = aliases[base_name] - for alias in alias_list: - symbol_lookup[alias] = symbol_lookup[base_name] - - # - # Write out the symbol lookup table - # - fid.write("\n#\n# Lookup table from symbols to units\n#\n\n") - fid.write("symbol_lookup = {\n") - for k in symbol_lookup: - if k != "none": - fid.write(f' "{k}": {symbol_lookup[k]},\n') - fid.write("}\n\n") - - # - # Collections of units by type - # - - dimension_names = [ - ("length", Dimensions(length=1)), - ("area", Dimensions(length=2)), - ("volume", Dimensions(length=3)), - ("inverse_length", Dimensions(length=-1)), - ("inverse_area", Dimensions(length=-2)), - ("inverse_volume", Dimensions(length=-3)), - ("time", Dimensions(time=1)), - ("rate", Dimensions(time=-1)), - ("speed", Dimensions(length=1, time=-1)), - ("acceleration", Dimensions(length=1, time=-2)), - ("density", Dimensions(length=-3, mass=1)), - ("force", Dimensions(1, -2, 1, 0, 0)), - ("pressure", Dimensions(-1, -2, 1, 0, 0)), - ("energy", Dimensions(2, -2, 1, 0, 0)), - ("power", Dimensions(2, -3, 1, 0, 0)), - ("charge", Dimensions(0, 1, 0, 1, 0)), - ("potential", Dimensions(2, -3, 1, -1, 0)), - ("resistance", Dimensions(2, -3, 1, -2, 0)), - ("capacitance", Dimensions(-2, 4, -1, 2, 0)), - ("conductance", Dimensions(-2, 3, -1, 2, 0)), - ("magnetic_flux", Dimensions(2, -2, 1, -1, 0)), - ("magnetic_flux_density", Dimensions(0, -2, 1, -1, 0)), - ("inductance", Dimensions(2, -2, 1, -2, 0)), - ("temperature", Dimensions(temperature=1)), - ("dimensionless", Dimensions()), - ("angle", Dimensions(angle_hint=1)), - ("solid_angle", Dimensions(angle_hint=2)), - ("amount", Dimensions(moles_hint=1)), - ("concentration", Dimensions(length=-3, moles_hint=1)), - ] - - fid.write("\n#\n# Units by type \n#\n\n") - - for dimension_name, dimensions in dimension_names: - - - fid.write(f"\n" - f"{dimension_name} = UnitGroup(\n" - f" name = '{dimension_name}', \n" - f" units = [\n") - - for unit_name in unit_types[hash(dimensions)]: - fid.write(" " + unit_name + ",\n") - - fid.write("])\n") - - - # List of dimensions - fid.write("\n\n") - fid.write("unit_group_names = [\n") - for dimension_name, _ in dimension_names: - fid.write(f" '{dimension_name}',\n") - fid.write("]\n\n") - - fid.write("unit_groups = {\n") - for dimension_name, _ in dimension_names: - fid.write(f" '{dimension_name}': {dimension_name},\n") - fid.write("}\n\n") - - -with open("accessors.py", 'w', encoding=encoding) as fid: - - - fid.write('"""'+(warning_text%"_build_tables.py, _accessor_base.py")+'"""\n\n') - - with open("_accessor_base.py") as base: - for line in base: - fid.write(line) - - for dimension_name, dimensions in dimension_names: - - accessor_name = dimension_name.capitalize().replace("_", "") + "Accessor" - - fid.write(f"\n" - f"class {accessor_name}[T](QuantityAccessor[T]):\n" - f" dimension_name = '{dimension_name}'\n" - f" \n") - - for unit_name in unit_types[hash(dimensions)]: - fid.write(f" @property\n" - f" def {unit_name}(self) -> T:\n" - f" quantity = self.quantity\n" - f" if quantity is None:\n" - f" return None\n" - f" else:\n" - f" return quantity.in_units_of(units.{unit_name})\n" - f"\n") - - fid.write("\n") - -with open("si.py", 'w') as fid: - - fid.write('"""'+(warning_text%"_build_tables.py")+'"""\n\n') - si_unit_names = [values.plural for values in base_si_units + derived_si_units if values.plural != "grams"] + ["kilograms"] - - for name in si_unit_names: - - fid.write(f"from sasdata.quantities.units import {name}\n") - - fid.write("\nall_si = [\n") - for name in si_unit_names: - fid.write(f" {name},\n") - fid.write("]\n") diff --git a/sasdata/quantities/_units_base.py b/sasdata/quantities/_units_base.py index 9e6401b53..d030fe299 100644 --- a/sasdata/quantities/_units_base.py +++ b/sasdata/quantities/_units_base.py @@ -1,11 +1,19 @@ -from collections.abc import Sequence -from dataclasses import dataclass +import re from fractions import Fraction from typing import Self import numpy as np -from unicode_superscript import int_as_unicode_superscript +_ascii_version = "0123456789-" +_unicode_version = "⁰¹²³⁴⁵⁶⁷⁸⁹⁻" + +def int_as_unicode_superscript(number: int): + string = str(number) + + for old, new in zip(_ascii_version, _unicode_version): + string = string.replace(old, new) + + return string class DimensionError(Exception): pass @@ -72,7 +80,7 @@ def __truediv__(self: Self, other: Self): def __pow__(self, power: int | float): - if not isinstance(power, (int | float)): + if not isinstance(power, (int, float)): return NotImplemented frac = Fraction(power).limit_denominator(500) # Probably way bigger than needed, 10 would probably be fine @@ -111,15 +119,15 @@ def __pow__(self, power: int | float): (self.moles_hint * numerator) // denominator, (self.angle_hint * numerator) // denominator) - def __eq__(self: Self, other: Self): + def __eq__(self: Self, other: object) -> bool: if isinstance(other, Dimensions): - return (self.length == other.length and - self.time == other.time and - self.mass == other.mass and - self.current == other.current and - self.temperature == other.temperature and - self.moles_hint == other.moles_hint and - self.angle_hint == other.angle_hint) + return (self.length == other.length + and self.time == other.time + and self.mass == other.mass + and self.current == other.current + and self.temperature == other.temperature + and self.moles_hint == other.moles_hint + and self.angle_hint == other.angle_hint) return NotImplemented @@ -210,9 +218,6 @@ def __init__(self, self.scale = si_scaling_factor self.dimensions = dimensions - def _components(self, tokens: Sequence["UnitToken"]): - pass - def __mul__(self: Self, other: "Unit"): if isinstance(other, Unit): return Unit(self.scale * other.scale, self.dimensions * other.dimensions) @@ -231,7 +236,7 @@ def __truediv__(self: Self, other: "Unit"): def __rtruediv__(self: Self, other: "Unit"): if isinstance(other, Unit): return Unit(other.scale / self.scale, other.dimensions / self.dimensions) - elif isinstance(other, (int | float)): + elif isinstance(other, (int, float)): return Unit(other / self.scale, self.dimensions ** -1) else: return NotImplemented @@ -246,17 +251,15 @@ def __pow__(self, power: int | float): def equivalent(self: Self, other: "Unit"): return self.dimensions == other.dimensions - def __eq__(self: Self, other: "Unit"): - return self.equivalent(other) and np.abs(np.log(self.scale/other.scale)) < 1e-5 + def __eq__(self: Self, other: object) -> bool: + if isinstance(other, Unit): + return self.equivalent(other) and np.abs(np.log(self.scale/other.scale)) < 1e-5 + return False def si_equivalent(self): """ Get the SI unit corresponding to this unit""" return Unit(1, self.dimensions) - def _format_unit(self, format_process: list["UnitFormatProcessor"]): - for processor in format_process: - pass - def __repr__(self): if self.scale == 1: # We're in SI @@ -265,9 +268,6 @@ def __repr__(self): else: return f"Unit[{self.scale}, {self.dimensions}]" - @staticmethod - def parse(unit_string: str) -> "Unit": - pass class NamedUnit(Unit): """ Units, but they have a name, and a symbol @@ -316,51 +316,201 @@ def startswith(self, prefix: str) -> bool: or (self.ascii_symbol is not None and self.ascii_symbol.lower().startswith(prefix)) \ or (self.symbol is not None and self.symbol.lower().startswith(prefix)) -# -# Parsing plan: -# Require unknown amounts of units to be explicitly positive or negative? -# -# +class UnknownUnit(NamedUnit): + """A unit for an unknown quantity + + While this library attempts to handle all known SI units, it is + likely that users will want to express quantities of arbitrary + units (for example, calculating donuts per person for a meeting). + The arbitrary unit allows for these unforseeable quantities.""" + + def __init__(self, + numerator: str | list[str] | dict[str, int | float], + denominator: None | list[str] | dict[str, int | float] = None): + if numerator is None: + return TypeError + self._numerator = UnknownUnit._parse_arg(numerator) + self._denominator = UnknownUnit._parse_arg(denominator) + self._unit = NamedUnit(1, Dimensions(), "") # Unitless + + super().__init__(si_scaling_factor=1, dimensions=self._unit.dimensions, symbol=self._name()) + + @staticmethod + def _parse_arg(arg: str | list[str] | dict[str, int | float] | None) -> dict[str, int | float]: + """Parse the different possibilities for constructor arguments + + Both the numerator and the denominator could be a string, a + list of strings, or a dict. Parse any of these values into a + dictionary of names and powers. + + """ + match arg: + case None: + return {} + case str(): + return {UnknownUnit._valid_name(arg): 1} + case list(): + result: dict[str, int | float] = {} + for key in arg: + if key in result: + result[key] += 1 + else: + UnknownUnit._valid_name(key) + result[key] = 1 + return result + case dict(): + for key in arg: + UnknownUnit._valid_name(key) + return arg + case _: + raise TypeError + + @staticmethod + def _valid_name(name: str) -> str: + """Confirms that the name of a unit is appropriate + + This mostly confirms that the unit does not contain math + operators that would act on other units, like / or ^ + """ + + if re.search(r"[*/^\s]", name): + raise RuntimeError(f'Unit name "{name}" contains invalid characters (*, /, ^, or whitespace)') + return name -@dataclass -class ProcessedUnitToken: - """ Mid processing representation of formatted units """ - base_string: str - exponent_string: str - latex_exponent_string: str - exponent: int + def _name(self): + num = [] + for key, value in self._numerator.items(): + if value == 1: + num.append(key) + else: + num.append(f"{key}^{value}") + den = [] + for key, value in self._denominator.items(): + den.append(f"{key}^{-value}") + num.sort() + den.sort() + return " ".join(num + den) + + def __eq__(self, other): + match other: + case UnknownUnit(): + return self._numerator == other._numerator and self._denominator == other._denominator and self._unit == other._unit + case Unit(): + return not self._numerator and not self._denominator and self._unit == other + case _: + return False + + + def __mul__(self: Self, other: "Unit"): + match other: + case UnknownUnit(): + num = dict(self._numerator) + for key in other._numerator: + if key in num: + num[key] += other._numerator[key] + else: + num[key] = other._numerator[key] + den = dict(self._denominator) + for key in other._denominator: + if key in den: + den[key] += other._denominator[key] + else: + den[key] = other._denominator[key] + result = UnknownUnit(num, den) + result._unit *= other._unit + return result._reduce() + case NamedUnit() | Unit() | int() | float(): + result = UnknownUnit(self._numerator, self._denominator) + result._unit *= other + return result + case _: + return NotImplemented -class UnitFormatProcessor: - """ Represents a step in the unit processing pipeline""" - def apply(self, scale, dimensions) -> tuple[ProcessedUnitToken, float, Dimensions]: - """ This will be called to deal with each processing stage""" + def __rmul__(self: Self, other): + return self * other -class RequiredUnitFormatProcessor(UnitFormatProcessor): - """ This unit is required to exist in the formatting """ - def __init__(self, unit: Unit, power: int = 1): - self.unit = unit - self.power = power - def apply(self, scale, dimensions) -> tuple[float, Dimensions, ProcessedUnitToken]: - new_scale = scale / (self.unit.scale * self.power) - new_dimensions = self.unit.dimensions / (dimensions**self.power) - token = ProcessedUnitToken(self.unit, self.power) + def __truediv__(self: Self, other: "Unit") -> "UnknownUnit": + match other: + case UnknownUnit(): + num = dict(self._numerator) + for key in other._denominator: + if key in num: + num[key] += other._denominator[key] + else: + num[key] = other._denominator[key] + den = dict(self._denominator) + for key in other._numerator: + if key in den: + den[key] += other._numerator[key] + else: + den[key] = other._numerator[key] + result = UnknownUnit(num, den) + result._unit /= other._unit + return result._reduce() + case NamedUnit() | Unit() | int() | float(): + result = UnknownUnit(self._numerator, self._denominator) + result._unit /= other + return result + case _: + return NotImplemented + + def __rtruediv__(self: Self, other: "Unit") -> "UnknownUnit": + return (self/other) ** -1 + + def __pow__(self, power: int | float) -> "UnknownUnit": + match power: + case int() | float(): + num = {key: value * power for key, value in self._numerator.items()} + den = {key: value * power for key, value in self._denominator.items()} + if power < 0: + num, den = den, num + num = {k: -v for k,v in num.items()} + den = {k: -v for k,v in den.items()} + + result = UnknownUnit(num, den) + result._unit = self._unit ** power + return result + case _: + return NotImplemented - return new_scale, new_dimensions, token + def equivalent(self: Self, other: "Unit"): + match other: + case UnknownUnit(): + return self._unit.equivalent(other._unit) and sorted(self._numerator) == sorted(other._numerator) and sorted(self._denominator) == sorted(other._denominator) + case _: + return False -class GreedyAbsDimensionUnitFormatProcessor(UnitFormatProcessor): - """ This processor minimises the dimensionality of the unit by multiplying by as many - units of the specified type as needed """ - def __init__(self, unit: Unit): - self.unit = unit + def _reduce(self): + """Remove redundant units""" + for k in self._denominator: + if k in self._numerator: + common = min(self._numerator[k], self._denominator[k]) + self._numerator[k] -= common + self._denominator[k] -= common + dead_nums = [k for k in self._numerator if self._numerator[k] == 0] + for k in dead_nums: + del self._numerator[k] + dead_dens = [k for k in self._denominator if self._denominator[k] == 0] + for k in dead_dens: + del self._denominator[k] + return self + + def __str__(self): + result = self._name() + if type(self._unit) is NamedUnit and self._unit.name.strip(): + result += f" {self._unit.name.strip()}" + if type(self._unit) is Unit and str(self._unit).strip(): + result += f" {str(self._unit).strip()}" + return result + + def __repr__(self): + return str(self) - def apply(self, scale, dimensions) -> tuple[ProcessedUnitToken, float, Dimensions]: - pass class UnitGroup: """ A group of units that all have the same dimensionality """ def __init__(self, name: str, units: list[NamedUnit]): self.name = name self.units = sorted(units, key=lambda unit: unit.scale) - diff --git a/sasdata/quantities/numerical_encoding.py b/sasdata/quantities/numerical_encoding.py index cab930d55..6e2e53265 100644 --- a/sasdata/quantities/numerical_encoding.py +++ b/sasdata/quantities/numerical_encoding.py @@ -1,72 +1,72 @@ -import base64 -import struct - -import numpy as np -from scipy.sparse import coo_array, coo_matrix, csc_array, csc_matrix, csr_array, csr_matrix - - -def numerical_encode(obj: int | float | np.ndarray | coo_matrix | coo_array | csr_matrix | csr_array | csc_matrix | csc_array): - - if isinstance(obj, int): - return {"type": "int", - "value": obj} - - elif isinstance(obj, float): - return {"type": "float", - "value": base64.b64encode(bytearray(struct.pack('d', obj))).decode("utf-8")} - - elif isinstance(obj, np.ndarray): - return { - "type": "numpy", - "value": base64.b64encode(obj.tobytes()).decode("utf-8"), - "dtype": obj.dtype.str, - "shape": list(obj.shape) - } - - elif isinstance(obj, (coo_matrix | coo_array | csr_matrix | csr_array | csc_matrix | csc_array)): - - output = { - "type": obj.__class__.__name__, # not robust to name changes, but more concise - "dtype": obj.dtype.str, - "shape": list(obj.shape) - } - - if isinstance(obj, (coo_array | coo_matrix)): - - output["data"] = numerical_encode(obj.data) - output["coords"] = [numerical_encode(coord) for coord in obj.coords] - - - elif isinstance(obj, (csr_array | csr_matrix)): - pass - - - elif isinstance(obj, (csc_array | csc_matrix)): - - pass - - - return output - - else: - raise TypeError(f"Cannot serialise object of type: {type(obj)}") - -def numerical_decode(data: dict[str, str | int | list[int]]) -> int | float | np.ndarray | coo_matrix | coo_array | csr_matrix | csr_array | csc_matrix | csc_array: - obj_type = data["type"] - - match obj_type: - case "int": - return int(data["value"]) - - case "float": - return struct.unpack('d', base64.b64decode(data["value"]))[0] - - case "numpy": - value = base64.b64decode(data["value"]) - dtype = np.dtype(data["dtype"]) - shape = tuple(data["shape"]) - return np.frombuffer(value, dtype=dtype).reshape(*shape) - - case _: - raise ValueError(f"Cannot decode objects of type '{obj_type}'") - +import base64 +import struct + +import numpy as np +from scipy.sparse import coo_array, coo_matrix, csc_array, csc_matrix, csr_array, csr_matrix + + +def numerical_encode(obj: int | float | np.ndarray | coo_matrix | coo_array | csr_matrix | csr_array | csc_matrix | csc_array): + + if isinstance(obj, int): + return {"type": "int", + "value": obj} + + elif isinstance(obj, float): + return {"type": "float", + "value": base64.b64encode(bytearray(struct.pack('d', obj))).decode("utf-8")} + + elif isinstance(obj, np.ndarray): + return { + "type": "numpy", + "value": base64.b64encode(obj.tobytes()).decode("utf-8"), + "dtype": obj.dtype.str, + "shape": list(obj.shape) + } + + elif isinstance(obj, (coo_matrix, coo_array, csr_matrix, csr_array, csc_matrix, csc_array)): + + output = { + "type": obj.__class__.__name__, # not robust to name changes, but more concise + "dtype": obj.dtype.str, + "shape": list(obj.shape) + } + + if isinstance(obj, (coo_array, coo_matrix)): + + output["data"] = numerical_encode(obj.data) + output["coords"] = [numerical_encode(coord) for coord in obj.coords] + + + elif isinstance(obj, (csr_array, csr_matrix)): + pass + + + elif isinstance(obj, (csc_array, csc_matrix)): + + pass + + + return output + + else: + raise TypeError(f"Cannot serialise object of type: {type(obj)}") + +def numerical_decode(data: dict[str, str | int | list[int]]) -> int | float | np.ndarray | coo_matrix | coo_array | csr_matrix | csr_array | csc_matrix | csc_array: + obj_type = data["type"] + + match obj_type: + case "int": + return int(data["value"]) + + case "float": + return struct.unpack('d', base64.b64decode(data["value"]))[0] + + case "numpy": + value = base64.b64decode(data["value"]) + dtype = np.dtype(data["dtype"]) + shape = tuple(data["shape"]) + return np.frombuffer(value, dtype=dtype).reshape(*shape) + + case _: + raise ValueError(f"Cannot decode objects of type '{obj_type}'") + diff --git a/sasdata/quantities/operations_examples.py b/sasdata/quantities/operations_examples.py new file mode 100644 index 000000000..29b50ccc0 --- /dev/null +++ b/sasdata/quantities/operations_examples.py @@ -0,0 +1,11 @@ +from sasdata.quantities.operations import Mul, Variable + +x = Variable("x") +y = Variable("y") +z = Variable("z") +f = Mul(Mul(x, y), z) + + +dfdx = f.derivative(x).derivative(y).derivative(z) + +print(dfdx.summary()) diff --git a/sasdata/quantities/plotting.py b/sasdata/quantities/plotting.py index b90f017c2..d4a99295c 100644 --- a/sasdata/quantities/plotting.py +++ b/sasdata/quantities/plotting.py @@ -1,23 +1,23 @@ -import matplotlib.pyplot as plt -from numpy.typing import ArrayLike - -from sasdata.quantities.quantity import NamedQuantity, Quantity - - -def quantity_plot(x: Quantity[ArrayLike], y: Quantity[ArrayLike], *args, **kwargs): - plt.plot(x.value, y.value, *args, **kwargs) - - x_name = x.name if isinstance(x, NamedQuantity) else "x" - y_name = y.name if isinstance(y, NamedQuantity) else "y" - - plt.xlabel(f"{x_name} / {x.units}") - plt.ylabel(f"{y_name} / {y.units}") - -def quantity_scatter(x: Quantity[ArrayLike], y: Quantity[ArrayLike], *args, **kwargs): - plt.scatter(x.value, y.value, *args, **kwargs) - - x_name = x.name if isinstance(x, NamedQuantity) else "x" - y_name = y.name if isinstance(y, NamedQuantity) else "y" - - plt.xlabel(f"{x_name} / {x.units}") - plt.ylabel(f"{y_name} / {y.units}") +import matplotlib.pyplot as plt +from numpy.typing import ArrayLike + +from sasdata.quantities.quantity import NamedQuantity, Quantity + + +def quantity_plot(x: Quantity[ArrayLike], y: Quantity[ArrayLike], *args, **kwargs): + plt.plot(x.value, y.value, *args, **kwargs) + + x_name = x.name if isinstance(x, NamedQuantity) else "x" + y_name = y.name if isinstance(y, NamedQuantity) else "y" + + plt.xlabel(f"{x_name} / {x.units}") + plt.ylabel(f"{y_name} / {y.units}") + +def quantity_scatter(x: Quantity[ArrayLike], y: Quantity[ArrayLike], *args, **kwargs): + plt.scatter(x.value, y.value, *args, **kwargs) + + x_name = x.name if isinstance(x, NamedQuantity) else "x" + y_name = y.name if isinstance(y, NamedQuantity) else "y" + + plt.xlabel(f"{x_name} / {x.units}") + plt.ylabel(f"{y_name} / {y.units}") diff --git a/sasdata/quantities/quantity.py b/sasdata/quantities/quantity.py index 7cc8f853e..f94fe96d5 100644 --- a/sasdata/quantities/quantity.py +++ b/sasdata/quantities/quantity.py @@ -1,5 +1,6 @@ import hashlib import json +import math from typing import Any, Self, TypeVar, Union import h5py @@ -14,36 +15,102 @@ T = TypeVar("T") +################### Quantity based operations, need to be here to avoid cyclic dependencies ##################### +def transpose(a: Union["Quantity[ArrayLike]", ArrayLike], axes: tuple | None = None): + """Transpose an array or an array based quantity, can also do reordering of axes""" + if isinstance(a, Quantity): + if axes is None: + return DerivedQuantity( + value=np.transpose(a.value, axes=axes), + units=a.units, + history=QuantityHistory.apply_operation(Transpose, a.history), + ) -################### Quantity based operations, need to be here to avoid cyclic dependencies ##################### + else: + return DerivedQuantity( + value=np.transpose(a.value, axes=axes), + units=a.units, + history=QuantityHistory.apply_operation(Transpose, a.history, axes=axes), + ) -def transpose(a: Union["Quantity[ArrayLike]", ArrayLike], axes: tuple | None = None): - """ Transpose an array or an array based quantity, can also do reordering of axes""" + else: + return np.transpose(a, axes=axes) + + +def trace(a: Union["Quantity[ArrayLike]", ArrayLike], offset: int = 0, axis1: int = 0, axis2: int = 1): + """Find the trace of an array or an array based quantity.""" if isinstance(a, Quantity): + return DerivedQuantity( + value=np.trace(a.value, offset, axis1, axis2), + units=a.units, + history=QuantityHistory.apply_operation(Trace, a.history, offset=offset, axis1=axis1, axis2=axis2), + ) + else: + return np.trace(a, offset, axis1, axis2) + + +def matinv(a: Union["Quantity[ArrayLike]", ArrayLike]): + """Find the inverse of a matrix.""" + if isinstance(a, Quantity): + return DerivedQuantity( + value=np.linalg.inv(a.value), + units=a.units, + history=QuantityHistory.apply_operation(MatInv, a.history), + ) + else: + return np.linalg.inv(a) + +def norm_1(a: Union["Quantity[ArrayLike]", ArrayLike], axes: int | tuple[int] | None = None): + """Caculate the 1-norm of an array or an array based quantity.""" + if isinstance(a, Quantity): if axes is None: - return DerivedQuantity(value=np.transpose(a.value, axes=axes), - units=a.units, - history=QuantityHistory.apply_operation(Transpose, a.history)) + return DerivedQuantity( + value=np.linalg.norm(a.value, ord=1, axes=axes), + units=a.units, + history=QuantityHistory.apply_operation(Norm_1, a.history), + ) else: - return DerivedQuantity(value=np.transpose(a.value, axes=axes), - units=a.units, - history=QuantityHistory.apply_operation(Transpose, a.history, axes=axes)) + return DerivedQuantity( + value=np.linalg.norm(a.value, ord=1, axes=axes), + units=a.units, + history=QuantityHistory.apply_operation(Norm_1, a.history, axes=axes), + ) else: - return np.transpose(a, axes=axes) + return np.linalg.norm(a.value, ord=1, axes=axes) + + +def norm_2(a: Union["Quantity[ArrayLike]", ArrayLike], axes: int | tuple[int] | None = None): + """Caculate the 2-norm of an array or an array based quantity.""" + if isinstance(a, Quantity): + if axes is None: + return DerivedQuantity( + value=np.linalg.norm(a.value, axes=axes), + units=a.units, + history=QuantityHistory.apply_operation(Norm_2, a.history), + ) + + else: + return DerivedQuantity( + value=np.linalg.norm(a.value, axes=axes), + units=a.units, + history=QuantityHistory.apply_operation(Norm_2, a.history, axes=axes), + ) + + else: + return np.linalg.norm(a.value, axes=axes) def dot(a: Union["Quantity[ArrayLike]", ArrayLike], b: Union["Quantity[ArrayLike]", ArrayLike]): - """ Dot product of two arrays or two array based quantities """ + """Dot product of two arrays or two array based quantities""" a_is_quantity = isinstance(a, Quantity) b_is_quantity = isinstance(b, Quantity) if a_is_quantity or b_is_quantity: - # If its only one of them that is a quantity, convert the other one if not a_is_quantity: @@ -55,13 +122,20 @@ def dot(a: Union["Quantity[ArrayLike]", ArrayLike], b: Union["Quantity[ArrayLike return DerivedQuantity( value=np.dot(a.value, b.value), units=a.units * b.units, - history=QuantityHistory.apply_operation(Dot, a.history, b.history)) + history=QuantityHistory.apply_operation(Dot, a.history, b.history), + ) else: return np.dot(a, b) -def tensordot(a: Union["Quantity[ArrayLike]", ArrayLike] | ArrayLike, b: Union["Quantity[ArrayLike]", ArrayLike], a_index: int, b_index: int): - """ Tensor dot product - equivalent to contracting two tensors, such as + +def tensordot( + a: Union["Quantity[ArrayLike]", ArrayLike] | ArrayLike, + b: Union["Quantity[ArrayLike]", ArrayLike], + a_index: int, + b_index: int, +): + """Tensor dot product - equivalent to contracting two tensors, such as A_{i0, i1, i2, i3...} and B_{j0, j1, j2...} @@ -77,7 +151,6 @@ def tensordot(a: Union["Quantity[ArrayLike]", ArrayLike] | ArrayLike, b: Union[" b_is_quantity = isinstance(b, Quantity) if a_is_quantity or b_is_quantity: - # If its only one of them that is a quantity, convert the other one if not a_is_quantity: @@ -89,12 +162,8 @@ def tensordot(a: Union["Quantity[ArrayLike]", ArrayLike] | ArrayLike, b: Union[" return DerivedQuantity( value=np.tensordot(a.value, b.value, axes=(a_index, b_index)), units=a.units * b.units, - history=QuantityHistory.apply_operation( - TensorDot, - a.history, - b.history, - a_index=a_index, - b_index=b_index)) + history=QuantityHistory.apply_operation(TensorDot, a.history, b.history, a_index=a_index, b_index=b_index), + ) else: return np.tensordot(a, b, axes=(a_index, b_index)) @@ -102,8 +171,9 @@ def tensordot(a: Union["Quantity[ArrayLike]", ArrayLike] | ArrayLike, b: Union[" ################### Operation Definitions ####################################### + def hash_and_name(hash_or_name: int | str): - """ Infer the name of a variable from a hash, or the hash from the name + """Infer the name of a variable from a hash, or the hash from the name Note: hash_and_name(hash_and_name(number)[1]) is not the identity however: hash_and_name(hash_and_name(number)) is @@ -127,34 +197,35 @@ def hash_and_name(hash_or_name: int | str): else: raise TypeError("Variable name_or_hash_value must be either str or int") -class Operation: +class Operation: serialisation_name = "unknown" - def summary(self, indent_amount: int = 0, indent: str=" "): - """ Summary of the operation tree""" - s = f"{indent_amount*indent}{self._summary_open()}(\n" + def summary(self, indent_amount: int = 0, indent: str = " "): + """Summary of the operation tree""" + + s = f"{indent_amount * indent}{self.__class__.__name__}(\n" for chunk in self._summary_components(): - s += chunk.summary(indent_amount+1, indent) + "\n" + s += chunk.summary(indent_amount + 1, indent) + "\n" - s += f"{indent_amount*indent})" + s += f"{indent_amount * indent})" return s - def _summary_open(self): - """ First line of summary """ def _summary_components(self) -> list["Operation"]: return [] - def evaluate(self, variables: dict[int, T]) -> T: - """ Evaluate this operation """ + def evaluate(self, variables: dict[int, T]) -> T: + """Evaluate this operation""" + pass def _derivative(self, hash_value: int) -> "Operation": - """ Get the derivative of this operation """ + """Get the derivative of this operation""" + pass def _clean(self): - """ Clean up this operation - i.e. remove silly things like 1*x """ + """Clean up this operation - i.e. remove silly things like 1*x""" return self def derivative(self, variable: Union[str, int, "Variable"], simplify=True): @@ -176,8 +247,7 @@ def derivative(self, variable: Union[str, int, "Variable"], simplify=True): # print(derivative.summary()) # Inefficient way of doing repeated simplification, but it will work - for i in range(100): # set max iterations - + for i in range(100): # set max iterations derivative = derivative._clean() # # print("-------------------") @@ -202,16 +272,14 @@ def deserialise(data: str) -> "Operation": @staticmethod def deserialise_json(json_data: dict) -> "Operation": - operation = json_data["operation"] parameters = json_data["parameters"] - cls = _serialisation_lookup[operation] + class_ = _serialisation_lookup[operation] try: - return cls._deserialise(parameters) - + return class_._deserialise(parameters) except NotImplementedError: - raise NotImplementedError(f"No method to deserialise {operation} with {parameters} (cls={cls})") + raise NotImplementedError(f"No method to deserialise {operation} with {parameters} (class={class_})") @staticmethod def _deserialise(parameters: dict) -> "Operation": @@ -221,25 +289,26 @@ def serialise(self) -> str: return json.dumps(self._serialise_json()) def _serialise_json(self) -> dict[str, Any]: - return {"operation": self.serialisation_name, - "parameters": self._serialise_parameters()} + return {"operation": self.serialisation_name, "parameters": self._serialise_parameters()} def _serialise_parameters(self) -> dict[str, Any]: - raise NotImplementedError("_serialise_parameters not implemented") + raise NotImplementedError("_serialise_parameters not implemented for this class") def __eq__(self, other: "Operation"): return NotImplemented + class ConstantBase(Operation): pass -class AdditiveIdentity(ConstantBase): +class AdditiveIdentity(ConstantBase): serialisation_name = "zero" + def evaluate(self, variables: dict[int, T]) -> T: return 0 - def _derivative(self, hash_value: int) -> Operation: + def _derivative(self, hash_value: int) -> "Operation": return AdditiveIdentity() @staticmethod @@ -249,8 +318,8 @@ def _deserialise(parameters: dict) -> "Operation": def _serialise_parameters(self) -> dict[str, Any]: return {} - def summary(self, indent_amount: int=0, indent=" "): - return f"{indent_amount*indent}0 [Add.Id.]" + def summary(self, indent_amount: int = 0, indent=" "): + return f"{indent_amount * indent}0 [Add.Id.]" def __eq__(self, other): if isinstance(other, AdditiveIdentity): @@ -262,9 +331,7 @@ def __eq__(self, other): return False - class MultiplicativeIdentity(ConstantBase): - serialisation_name = "one" def evaluate(self, variables: dict[int, T]) -> T: @@ -277,13 +344,11 @@ def _derivative(self, hash_value: int): def _deserialise(parameters: dict) -> "Operation": return MultiplicativeIdentity() - def _serialise_parameters(self) -> dict[str, Any]: return {} - - def summary(self, indent_amount: int=0, indent=" "): - return f"{indent_amount*indent}1 [Mul.Id.]" + def summary(self, indent_amount: int = 0, indent=" "): + return f"{indent_amount * indent}1 [Mul.Id.]" def __eq__(self, other): if isinstance(other, MultiplicativeIdentity): @@ -295,9 +360,37 @@ def __eq__(self, other): return False -class Constant(ConstantBase): +class MatrixIdentity(ConstantBase): + serialisation_name = "identity" + def __init__(self, size): + self.size = size + + def evaluate(self, variables: dict[int, T]) -> T: + return np.eye(self.size) + + def _derivative(self, hash_value: int): + return Constant(np.zeros((self.size, self.size))) + + @staticmethod + def _deserialise(parameters: dict) -> "Operation": + return MatrixIdentity(self.size) + + def _serialise_parameters(self) -> dict[str, Any]: + return {"size": numerical_encode(self.size)} + + def summary(self, indent_amount: int = 0, indent=" "): + return f"{indent_amount * indent}{self.size} [Matrix Id.]" + + def __eq__(self, other): + if isinstance(other, MatrixIdentity): + return self.size == other.size + return False + + +class Constant(ConstantBase): serialisation_name = "constant" + def __init__(self, value): self.value = value @@ -308,7 +401,6 @@ def _derivative(self, hash_value: int): return AdditiveIdentity() def _clean(self): - if self.value == 0: return AdditiveIdentity() @@ -323,12 +415,11 @@ def _deserialise(parameters: dict) -> "Operation": value = numerical_decode(parameters["value"]) return Constant(value) - def _serialise_parameters(self) -> dict[str, Any]: return {"value": numerical_encode(self.value)} - def summary(self, indent_amount: int=0, indent=" "): - return f"{indent_amount*indent}{self.value}" + def summary(self, indent_amount: int = 0, indent=" "): + return f"{indent_amount * indent}{self.value}" def __eq__(self, other): if isinstance(other, AdditiveIdentity): @@ -338,15 +429,14 @@ def __eq__(self, other): return self.value == 1 elif isinstance(other, Constant): - if other.value == self.value: - return True + return other.value == self.value return False class Variable(Operation): - serialisation_name = "variable" + def __init__(self, name_or_hash_value: int | str | tuple[int, str]): self.hash_value, self.name = hash_and_name(name_or_hash_value) @@ -370,35 +460,40 @@ def _deserialise(parameters: dict) -> "Operation": return Variable((hash_value, name)) def _serialise_parameters(self) -> dict[str, Any]: - return {"hash_value": self.hash_value, - "name": self.name} + return {"hash_value": self.hash_value, "name": self.name} - def summary(self, indent_amount: int = 0, indent: str=" "): - return f"{indent_amount*indent}{self.name}" + def summary(self, indent_amount: int = 0, indent: str = " "): + return f"{indent_amount * indent}{self.name}" def __eq__(self, other): if isinstance(other, Variable): return self.hash_value == other.hash_value - return False -class UnaryOperation(Operation): +class UnaryOperation(Operation): def __init__(self, a: Operation): self.a = a def _serialise_parameters(self) -> dict[str, Any]: return {"a": self.a._serialise_json()} + @classmethod + def _deserialise(cls, parameters: dict) -> "UnaryOperation": + return cls(Operation.deserialise_json(parameters["a"])) + def _summary_components(self) -> list["Operation"]: return [self.a] - + def __eq__(self, other): + if isinstance(other, self.__class__): + return self.a == other.a + return False class Neg(UnaryOperation): - serialisation_name = "neg" + def evaluate(self, variables: dict[int, T]) -> T: return -self.a.evaluate(variables) @@ -406,7 +501,6 @@ def _derivative(self, hash_value: int): return Neg(self.a._derivative(hash_value)) def _clean(self): - clean_a = self.a._clean() if isinstance(clean_a, Neg): @@ -419,25 +513,12 @@ def _clean(self): else: return Neg(clean_a) - @staticmethod - def _deserialise(parameters: dict) -> "Operation": - return Neg(Operation.deserialise_json(parameters["a"])) - - - def _summary_open(self): - return "Neg" - - def __eq__(self, other): - if isinstance(other, Neg): - return other.a == self.a - class Inv(UnaryOperation): - serialisation_name = "reciprocal" def evaluate(self, variables: dict[int, T]) -> T: - return 1/self.a.evaluate(variables) + return 1.0 / self.a.evaluate(variables) def _derivative(self, hash_value: int) -> Operation: return Neg(Div(self.a._derivative(hash_value), Mul(self.a, self.a))) @@ -446,7 +527,7 @@ def _clean(self): clean_a = self.a._clean() if isinstance(clean_a, Inv): - # Removes double negations + # Removes double inversions return clean_a.a elif isinstance(clean_a, Neg): @@ -455,23 +536,217 @@ def _clean(self): return Neg(Inv(clean_a.a)) elif isinstance(clean_a, Constant): - return Constant(1/clean_a.value)._clean() + return Constant(1.0 / clean_a.value)._clean() else: return Inv(clean_a) - @staticmethod - def _deserialise(parameters: dict) -> "Operation": - return Inv(Operation.deserialise_json(parameters["a"])) +class Ln(UnaryOperation): + serialisation_name = "ln" - def _summary_open(self): - return "Inv" + def evaluate(self, variables: dict[int, T]) -> T: + return math.log(self.a.evaluate(variables)) + def _derivative(self, hash_value: int) -> Operation: + return Div(self.a._derivative(hash_value), self.a) + + def _clean(self): + clean_a = self.a._clean() + + if isinstance(clean_a, Exp): + # Convert ln(exp(x)) to x + return clean_a.a + + elif isinstance(clean_a, MultiplicativeIdentity): + # Convert ln(1) to 0 + return AdditiveIdentity() + + elif clean_a == math.e: + # Convert ln(e) to 1 + return MultiplicativeIdentity() + + else: + return Ln(clean_a) + + +class Exp(UnaryOperation): + serialisation_name = "exp" + + def evaluate(self, variables: dict[int, T]) -> T: + return math.exp(self.a.evaluate(variables)) + + def _derivative(self, hash_value: int) -> Operation: + return Mul(self.a._derivative(hash_value), Exp(self.a)) + + def _clean(self): + clean_a = self.a._clean() + + if isinstance(clean_a, Ln): + # Convert exp(ln(x)) to x + return clean_a.a + + elif isinstance(clean_a, MultiplicativeIdentity): + # Convert e**1 to e + return math.e + + elif isinstance(clean_a, AdditiveIdentity): + # Convert e**0 to 1 + return 1 + + else: + return Exp(clean_a) + + +class Sin(UnaryOperation): + serialisation_name = "sin" + + def evaluate(self, variables: dict[int, T]) -> T: + return np.sin(self.a.evaluate(variables)) + + def _derivative(self, hash_value: int) -> Operation: + return Mul(self.a._derivative(hash_value), Cos(self.a)) + + def _clean(self): + clean_a = self.a._clean() + + if isinstance(clean_a, ArcSin): + return clean_a.a + + elif isinstance(clean_a, AdditiveIdentity): + # Convert sin(0) to 0 + return AdditiveIdentity() + + else: + return Sin(clean_a) + + +class ArcSin(UnaryOperation): + serialisation_name = "arcsin" + + def evaluate(self, variables: dict[int, T]) -> T: + return np.arcsin(self.a.evaluate(variables)) + + def _derivative(self, hash_value: int) -> Operation: + return Div(self.a._derivative(hash_value), Sqrt(Sub(MultiplicativeIdentity(), Mul(self.a, self.a)))) + + def _clean(self): + clean_a = self.a._clean() + + if isinstance(clean_a, Sin): + return clean_a.a + + elif isinstance(clean_a, AdditiveIdentity): + # Convert arcsin(0) to 0 + return AdditiveIdentity() + + elif isinstance(clean_a, MultiplicativeIdentity): + # Convert arcsin(1) to pi/2 + return Constant(0.5 * math.pi) + + else: + return ArcSin(clean_a) + + +class Cos(UnaryOperation): + serialisation_name = "cos" + + def evaluate(self, variables: dict[int, T]) -> T: + return np.cos(self.a.evaluate(variables)) + + def _derivative(self, hash_value: int) -> Operation: + return Mul(self.a._derivative(hash_value), Neg(Sin(self.a))) + + def _clean(self): + clean_a = self.a._clean() + + if isinstance(clean_a, ArcCos): + return clean_a.a + + elif isinstance(clean_a, AdditiveIdentity): + # Convert cos(0) to 1 + return MultiplicativeIdentity() + + else: + return Cos(clean_a) + + +class ArcCos(UnaryOperation): + serialisation_name = "arccos" + + def evaluate(self, variables: dict[int, T]) -> T: + return np.arccos(self.a.evaluate(variables)) + + def _derivative(self, hash_value: int) -> Operation: + return Neg(Div(self.a._derivative(hash_value), Sqrt(Sub(MultiplicativeIdentity(), Mul(self.a, self.a))))) + + def _clean(self): + clean_a = self.a._clean() + + if isinstance(clean_a, Cos): + return clean_a.a + + elif isinstance(clean_a, AdditiveIdentity): + # Convert arccos(0) to pi/2 + return Constant(0.5 * math.pi) + + elif isinstance(clean_a, MultiplicativeIdentity): + # Convert arccos(1) to 0 + return AdditiveIdentity() + + else: + return ArcCos(clean_a) + + +class Tan(UnaryOperation): + serialisation_name = "tan" + + def evaluate(self, variables: dict[int, T]) -> T: + return np.tan(self.a.evaluate(variables)) + + def _derivative(self, hash_value: int) -> Operation: + return Div(self.a._derivative(hash_value), Mul(Cos(self.a), Cos(self.a))) + + def _clean(self): + clean_a = self.a._clean() + + if isinstance(clean_a, ArcTan): + return clean_a.a + + elif isinstance(clean_a, AdditiveIdentity): + # Convert tan(0) to 0 + return AdditiveIdentity() + + else: + return Tan(clean_a) + + +class ArcTan(UnaryOperation): + serialisation_name = "arctan" + + def evaluate(self, variables: dict[int, T]) -> T: + return np.arctan(self.a.evaluate(variables)) + + def _derivative(self, hash_value: int) -> Operation: + return Div(self.a._derivative(hash_value), Add(MultiplicativeIdentity(), Mul(self.a, self.a))) + + def _clean(self): + clean_a = self.a._clean() + + if isinstance(clean_a, Tan): + return clean_a.a + + elif isinstance(clean_a, AdditiveIdentity): + # Convert arctan(0) to 0 + return AdditiveIdentity() + + elif isinstance(clean_a, MultiplicativeIdentity): + # Convert arctan(1) to pi/4 + return Constant(0.25 * math.pi) + + else: + return ArcTan(clean_a) - def __eq__(self, other): - if isinstance(other, Inv): - return other.a == self.a class BinaryOperation(Operation): def __init__(self, a: Operation, b: Operation): @@ -485,30 +760,28 @@ def _clean_ab(self, a, b): raise NotImplementedError("_clean_ab not implemented") def _serialise_parameters(self) -> dict[str, Any]: - return {"a": self.a._serialise_json(), - "b": self.b._serialise_json()} + return {"a": self.a._serialise_json(), "b": self.b._serialise_json()} + + @classmethod + def _deserialise(cls, parameters: dict) -> "BinaryOperation": + return cls(*BinaryOperation._deserialise_ab(parameters)) @staticmethod def _deserialise_ab(parameters) -> tuple[Operation, Operation]: - return (Operation.deserialise_json(parameters["a"]), - Operation.deserialise_json(parameters["b"])) - + return (Operation.deserialise_json(parameters["a"]), Operation.deserialise_json(parameters["b"])) def _summary_components(self) -> list["Operation"]: return [self.a, self.b] - def _self_cls(self) -> type: - """ Own class""" def __eq__(self, other): - if isinstance(other, self._self_cls()): - return other.a == self.a and self.b == other.b + if isinstance(other, self.__class__): + return self.a == other.a and self.b == other.b + return False -class Add(BinaryOperation): +class Add(BinaryOperation): serialisation_name = "add" - def _self_cls(self) -> type: - return Add def evaluate(self, variables: dict[int, T]) -> T: return self.a.evaluate(variables) + self.b.evaluate(variables) @@ -516,7 +789,6 @@ def _derivative(self, hash_value: int) -> Operation: return Add(self.a._derivative(hash_value), self.b._derivative(hash_value)) def _clean_ab(self, a, b): - if isinstance(a, AdditiveIdentity): # Convert 0 + b to b return b @@ -547,20 +819,10 @@ def _clean_ab(self, a, b): else: return Add(a, b) - @staticmethod - def _deserialise(parameters: dict) -> "Operation": - return Add(*BinaryOperation._deserialise_ab(parameters)) - - def _summary_open(self): - return "Add" class Sub(BinaryOperation): - serialisation_name = "sub" - - def _self_cls(self) -> type: - return Sub def evaluate(self, variables: dict[int, T]) -> T: return self.a.evaluate(variables) - self.b.evaluate(variables) @@ -598,21 +860,10 @@ def _clean_ab(self, a, b): else: return Sub(a, b) - @staticmethod - def _deserialise(parameters: dict) -> "Operation": - return Sub(*BinaryOperation._deserialise_ab(parameters)) - - - def _summary_open(self): - return "Sub" class Mul(BinaryOperation): - serialisation_name = "mul" - - def _self_cls(self) -> type: - return Mul def evaluate(self, variables: dict[int, T]) -> T: return self.a.evaluate(variables) * self.b.evaluate(variables) @@ -620,7 +871,6 @@ def _derivative(self, hash_value: int) -> Operation: return Add(Mul(self.a, self.b._derivative(hash_value)), Mul(self.a._derivative(hash_value), self.b)) def _clean_ab(self, a, b): - if isinstance(a, AdditiveIdentity) or isinstance(b, AdditiveIdentity): # Convert 0*b or a*0 to 0 return AdditiveIdentity() @@ -668,28 +918,17 @@ def _clean_ab(self, a, b): return Mul(a, b) - @staticmethod - def _deserialise(parameters: dict) -> "Operation": - return Mul(*BinaryOperation._deserialise_ab(parameters)) - - - def _summary_open(self): - return "Mul" - class Div(BinaryOperation): - serialisation_name = "div" - - def _self_cls(self) -> type: - return Div - def evaluate(self, variables: dict[int, T]) -> T: return self.a.evaluate(variables) / self.b.evaluate(variables) def _derivative(self, hash_value: int) -> Operation: - return Sub(Div(self.a.derivative(hash_value), self.b), - Div(Mul(self.a, self.b.derivative(hash_value)), Mul(self.b, self.b))) + return Div( + Sub(Mul(self.a.derivative(hash_value), self.b), Mul(self.a, self.b.derivative(hash_value))), + Mul(self.b, self.b), + ) def _clean_ab(self, a, b): if isinstance(a, AdditiveIdentity): @@ -708,7 +947,6 @@ def _clean_ab(self, a, b): # Convert constants "a"/"b" to "a/b" return Constant(self.a.evaluate({}) / self.b.evaluate({}))._clean() - elif isinstance(a, Inv) and isinstance(b, Inv): return Div(b.a, a.a) @@ -734,15 +972,56 @@ def _clean_ab(self, a, b): return Div(a, b) +class Log(Operation): + serialisation_name = "log" + + def __init__(self, a: Operation, base: float): + self.a = a + self.base = base + + def evaluate(self, variables: dict[int, T]) -> T: + return math.log(self.a.evaluate(variables), self.base) + + def _derivative(self, hash_value: int) -> Operation: + return Div(self.a.derivative(hash_value), Mul(self.a, Ln(Constant(self.base)))) + + def _clean_ab(self) -> Operation: + a = self.a._clean() + + if isinstance(a, MultiplicativeIdentity): + # Convert log(1) to 0 + return AdditiveIdentity() + + elif a == self.base: + # Convert log(base) to 1 + return MultiplicativeIdentity() + + else: + return Log(a, self.base) + + def _serialise_parameters(self) -> dict[str, Any]: + return {"a": Operation._serialise_json(self.a), "base": self.base} + @staticmethod def _deserialise(parameters: dict) -> "Operation": - return Div(*BinaryOperation._deserialise_ab(parameters)) + return Log(Operation.deserialise_json(parameters["a"]), parameters["base"]) - def _summary_open(self): - return "Div" + def summary(self, indent_amount: int = 0, indent=" "): + return ( + f"{indent_amount * indent}Log(\n" + + self.a.summary(indent_amount + 1, indent) + + "\n" + + f"{(indent_amount + 1) * indent}{self.base}\n" + + f"{indent_amount * indent})" + ) -class Pow(Operation): + def __eq__(self, other): + if isinstance(other, Log): + return self.a == other.a and self.base == other.base + return False + +class Pow(Operation): serialisation_name = "pow" def __init__(self, a: Operation, power: float): @@ -760,9 +1039,9 @@ def _derivative(self, hash_value: int) -> Operation: return self.a._derivative(hash_value) else: - return Mul(Constant(self.power), Mul(Pow(self.a, self.power-1), self.a._derivative(hash_value))) + return Mul(Constant(self.power), Mul(Pow(self.a, self.power - 1), self.a._derivative(hash_value))) - def _clean(self) -> Operation: + def _clean(self): a = self.a._clean() if self.power == 1: @@ -777,33 +1056,35 @@ def _clean(self) -> Operation: else: return Pow(a, self.power) - def _serialise_parameters(self) -> dict[str, Any]: - return {"a": Operation._serialise_json(self.a), - "power": self.power} + return {"a": Operation._serialise_json(self.a), "power": self.power} @staticmethod def _deserialise(parameters: dict) -> "Operation": return Pow(Operation.deserialise_json(parameters["a"]), parameters["power"]) - def summary(self, indent_amount: int=0, indent=" "): - return (f"{indent_amount*indent}Pow\n" + - self.a.summary(indent_amount+1, indent) + "\n" + - f"{(indent_amount+1)*indent}{self.power}\n" + - f"{indent_amount*indent})") + def summary(self, indent_amount: int = 0, indent=" "): + return ( + f"{indent_amount * indent}Pow(\n" + + self.a.summary(indent_amount + 1, indent) + + "\n" + + f"{(indent_amount + 1) * indent}{self.power}\n" + + f"{indent_amount * indent})" + ) def __eq__(self, other): if isinstance(other, Pow): return self.a == other.a and self.power == other.power - + return False # # Matrix operations # + class Transpose(Operation): - """ Transpose operation - as per numpy""" + """Transpose operation - as per numpy""" serialisation_name = "transpose" @@ -812,75 +1093,119 @@ def __init__(self, a: Operation, axes: tuple[int] | None = None): self.axes = axes def evaluate(self, variables: dict[int, T]) -> T: - return np.transpose(self.a.evaluate(variables)) + return np.transpose(self.a.evaluate(variables), self.axes) def _derivative(self, hash_value: int) -> Operation: - return Transpose(self.a.derivative(hash_value)) # TODO: Check! + return Transpose(self.a.derivative(hash_value), self.axes) # TODO: Check! def _clean(self): clean_a = self.a._clean() - return Transpose(clean_a) - + return Transpose(clean_a, self.axes) def _serialise_parameters(self) -> dict[str, Any]: if self.axes is None: - return { "a": self.a._serialise_json() } + return {"a": self.a._serialise_json()} else: - return { - "a": self.a._serialise_json(), - "axes": list(self.axes) - } - + return {"a": self.a._serialise_json(), "axes": list(self.axes)} @staticmethod def _deserialise(parameters: dict) -> "Operation": if "axes" in parameters: - return Transpose( - a=Operation.deserialise_json(parameters["a"]), - axes=tuple(parameters["axes"])) + return Transpose(a=Operation.deserialise_json(parameters["a"]), axes=tuple(parameters["axes"])) else: - return Transpose( - a=Operation.deserialise_json(parameters["a"])) - + return Transpose(a=Operation.deserialise_json(parameters["a"])) - def _summary_open(self): - return "Transpose" + def summary(self, indent_amount: int = 0, indent=" "): + if self.axes is None: + return ( + f"{indent_amount * indent}Transpose(\n" + + self.a.summary(indent_amount + 1, indent) + + "\n" + + f"{indent_amount * indent})" + ) + else: + return ( + f"{indent_amount * indent}Transpose(\n" + + self.a.summary(indent_amount + 1, indent) + + "\n" + + f"{(indent_amount + 1) * indent}{list(self.axes)}\n" + + f"{indent_amount * indent})" + ) def __eq__(self, other): if isinstance(other, Transpose): return other.a == self.a + return False -class Dot(BinaryOperation): - """ Dot product - backed by numpy's dot method""" +class Trace(Operation): + """Trace operation - as per numpy""" - serialisation_name = "dot" + serialisation_name = "trace" + + def __init__(self, a: Operation, offset: int = 0, axis1: int = 0, axis2: int = 1): + self.a = a + self.offset = offset + self.axis1 = axis1 + self.axis2 = axis2 def evaluate(self, variables: dict[int, T]) -> T: - return dot(self.a.evaluate(variables), self.b.evaluate(variables)) + return np.trace(self.a.evaluate(variables), self.offset, self.axis1, self.axis2) def _derivative(self, hash_value: int) -> Operation: - return Add( - Dot(self.a, - self.b._derivative(hash_value)), - Dot(self.a._derivative(hash_value), - self.b)) + return Trace(self.a.derivative(hash_value), self.offset, self.axis1, self.axis2) - def _clean_ab(self, a, b): - return Dot(a, b) # Do nothing for now + def _clean(self): + clean_a = self.a._clean() + return Trace(clean_a, self.offset, self.axis1, self.axis2) + def _serialise_parameters(self) -> dict[str, Any]: + return {"a": self.a._serialise_json(), "offset": self.offset, "axis1": self.axis1, "axis2": self.axis2} @staticmethod def _deserialise(parameters: dict) -> "Operation": - return Dot(*BinaryOperation._deserialise_ab(parameters)) + return Trace( + a=Operation.deserialise_json(parameters["a"]), + offset=parameters["offset"], + axis1=parameters["axis1"], + axis2=parameters["axis2"], + ) + + def summary(self, indent_amount: int = 0, indent=" "): + return ( + f"{indent_amount * indent}Trace(\n" + + self.a.summary(indent_amount + 1, indent) + + "\n" + + f"{(indent_amount + 1) * indent}{self.offset}\n" + + f"{(indent_amount + 1) * indent}{self.axis1}\n" + + f"{(indent_amount + 1) * indent}{self.axis2}\n" + + f"{indent_amount * indent})" + ) + + def __eq__(self, other): + if isinstance(other, Trace): + return other.a == self.a + return False + + +class Dot(BinaryOperation): + """Dot product - backed by numpy's dot method""" - def _summary_open(self): - return "Dot" + serialisation_name = "dot" + + def evaluate(self, variables: dict[int, T]) -> T: + return dot(self.a.evaluate(variables), self.b.evaluate(variables)) + + def _derivative(self, hash_value: int) -> Operation: + return Add(Dot(self.a, self.b._derivative(hash_value)), Dot(self.a._derivative(hash_value), self.b)) + + def _clean_ab(self, a, b): + return Dot(a, b) # Do nothing for now # TODO: Add to base operation class, and to quantities class MatMul(BinaryOperation): - """ Matrix multiplication, using __matmul__ dunder""" + """Matrix multiplication, using __matmul__ dunder""" serialisation_name = "matmul" @@ -888,14 +1213,9 @@ def evaluate(self, variables: dict[int, T]) -> T: return self.a.evaluate(variables) @ self.b.evaluate(variables) def _derivative(self, hash_value: int) -> Operation: - return Add( - MatMul(self.a, - self.b._derivative(hash_value)), - MatMul(self.a._derivative(hash_value), - self.b)) + return Add(MatMul(self.a, self.b._derivative(hash_value)), MatMul(self.a._derivative(hash_value), self.b)) def _clean_ab(self, a, b): - if isinstance(a, AdditiveIdentity) or isinstance(b, AdditiveIdentity): # Convert 0*b or a*0 to 0 return AdditiveIdentity() @@ -913,12 +1233,27 @@ def _clean_ab(self, a, b): return MatMul(a, b) - @staticmethod - def _deserialise(parameters: dict) -> "Operation": - return MatMul(*BinaryOperation._deserialise_ab(parameters)) +class MatInv(UnaryOperation): + """Matrix inversion, using numpy""" + + serialisation_name = "matinv" + + def evaluate(self, variables: dict[int, T]) -> T: + return np.linalg.inv(self.a.evaluate(variables)) + + def _derivative(self, hash_value: int) -> Operation: + return Neg(Matmul(MatMul(MatInv(self.a), self.a._derivative(hash_value)), MatInv(self.a))) + + def _clean(self): + clean_a = self.a._clean() + + if isinstance(clean_a, MatInv): + # Removes double inversions + return clean_a.a + + else: + return MatInv(clean_a) - def _summary_open(self): - return "MatMul" class TensorDot(Operation): serialisation_name = "tensor_product" @@ -932,39 +1267,173 @@ def __init__(self, a: Operation, b: Operation, a_index: int, b_index: int): def evaluate(self, variables: dict[int, T]) -> T: return tensordot(self.a, self.b, self.a_index, self.b_index) - def _serialise_parameters(self) -> dict[str, Any]: return { "a": self.a._serialise_json(), "b": self.b._serialise_json(), "a_index": self.a_index, - "b_index": self.b_index } + "b_index": self.b_index, + } @staticmethod def _deserialise(parameters: dict) -> "Operation": - return TensorDot(a = Operation.deserialise_json(parameters["a"]), - b = Operation.deserialise_json(parameters["b"]), - a_index=int(parameters["a_index"]), - b_index=int(parameters["b_index"])) + return TensorDot( + a=Operation.deserialise_json(parameters["a"]), + b=Operation.deserialise_json(parameters["b"]), + a_index=int(parameters["a_index"]), + b_index=int(parameters["b_index"]), + ) - def _summary_open(self): - return "TensorProduct" +class Norm_1(Operation): + """1-norm of a matrix from numpy""" -_serialisable_classes = [AdditiveIdentity, MultiplicativeIdentity, Constant, - Variable, - Neg, Inv, - Add, Sub, Mul, Div, Pow, - Transpose, Dot, MatMul, TensorDot] + serialisation_name = "norm_1" -_serialisation_lookup = {cls.serialisation_name: cls for cls in _serialisable_classes} + def __init__(self, a: Operation, axes: int | tuple[int] | None = None): + self.a = a + self.axes = axes + + def evaluate(self, variables: dict[int, T]) -> T: + return np.linalg.norm(self.a.evaluate(variables), ord=1, axis=self.axes) + + def _derivative(self, hash_value: int) -> Operation: + return np.sign(self.a) + + def _clean(self): + clean_a = self.a._clean() + return Norm_1(clean_a, self.axes) + + def _serialise_parameters(self) -> dict[str, Any]: + if self.axes is None: + return {"a": self.a._serialise_json()} + else: + return {"a": self.a._serialise_json(), "axes": list(self.axes)} + + @staticmethod + def _deserialise(parameters: dict) -> "Operation": + if "axes" in parameters: + return Norm_1(a=Operation.deserialise_json(parameters["a"]), axes=tuple(parameters["axes"])) + else: + return Norm_1(a=Operation.deserialise_json(parameters["a"])) + + def summary(self, indent_amount: int = 0, indent=" "): + if self.axes is None: + return ( + f"{indent_amount * indent}Norm_1(\n" + + self.a.summary(indent_amount + 1, indent) + + "\n" + + f"{indent_amount * indent})" + ) + else: + return ( + f"{indent_amount * indent}Norm_1(\n" + + self.a.summary(indent_amount + 1, indent) + + "\n" + + f"{(indent_amount + 1) * indent}{list(self.axes)}\n" + + f"{indent_amount * indent})" + ) + + def __eq__(self, other): + if isinstance(other, Norm_1): + return other.a == self.a + return False + + +class Norm_2(Operation): + """2-norm of a matrix from numpy""" + + serialisation_name = "norm_2" + + def __init__(self, a: Operation, axes: int | tuple[int] | None = None): + self.a = a + self.axes = axes + + def evaluate(self, variables: dict[int, T]) -> T: + return np.linalg.norm(self.a.evaluate(variables), axis=self.axes) + + def _derivative(self, hash_value: int) -> Operation: + return Transpose(Div(self.a, Norm_2(self.a, self.axes))) + + def _clean(self): + clean_a = self.a._clean() + return Norm_2(clean_a, self.axes) + + def _serialise_parameters(self) -> dict[str, Any]: + if self.axes is None: + return {"a": self.a._serialise_json()} + else: + return {"a": self.a._serialise_json(), "axes": list(self.axes)} + + @staticmethod + def _deserialise(parameters: dict) -> "Operation": + if "axes" in parameters: + return Norm_2(a=Operation.deserialise_json(parameters["a"]), axes=tuple(parameters["axes"])) + else: + return Norm_2(a=Operation.deserialise_json(parameters["a"])) + + def summary(self, indent_amount: int = 0, indent=" "): + if self.axes is None: + return ( + f"{indent_amount * indent}Norm_2(\n" + + self.a.summary(indent_amount + 1, indent) + + "\n" + + f"{indent_amount * indent})" + ) + else: + return ( + f"{indent_amount * indent}Norm_2(\n" + + self.a.summary(indent_amount + 1, indent) + + "\n" + + f"{(indent_amount + 1) * indent}{list(self.axes)}\n" + + f"{indent_amount * indent})" + ) + + def __eq__(self, other): + if isinstance(other, Norm_2): + return other.a == self.a + return False + + +_serialisable_classes = [ + AdditiveIdentity, + MultiplicativeIdentity, + Constant, + Variable, + Neg, + Inv, + Ln, + Exp, + Sin, + ArcSin, + Cos, + ArcCos, + Tan, + ArcTan, + Add, + Sub, + Mul, + Div, + Pow, + Log, + Transpose, + Trace, + Dot, + MatMul, + MatInv, + TensorDot, + Norm_1, + Norm_2, +] + +_serialisation_lookup = {class_.serialisation_name: class_ for class_ in _serialisable_classes} class UnitError(Exception): - """ Errors caused by unit specification not being correct """ + """Errors caused by unit specification not being correct""" -def hash_data_via_numpy(*data: ArrayLike): +def hash_data_via_numpy(*data: ArrayLike): md5_hash = hashlib.md5() for datum in data: @@ -975,7 +1444,6 @@ def hash_data_via_numpy(*data: ArrayLike): return int(md5_hash.hexdigest(), 16) - ##################################### # # # # @@ -987,12 +1455,11 @@ def hash_data_via_numpy(*data: ArrayLike): ##################################### - QuantityType = TypeVar("QuantityType") class QuantityHistory: - """ Class that holds the information for keeping track of operations done on quantities """ + """Class that holds the information for keeping track of operations done on quantities""" def __init__(self, operation_tree: Operation, references: dict[int, "Quantity"]): self.operation_tree = operation_tree @@ -1002,17 +1469,17 @@ def __init__(self, operation_tree: Operation, references: dict[int, "Quantity"]) self.si_reference_values = {key: self.references[key].in_si() for key in self.references} def jacobian(self) -> list[Operation]: - """ Derivative of this quantity's operation history with respect to each of the references """ + """Derivative of this quantity's operation history with respect to each of the references""" # Use the hash value to specify the variable of differentiation return [self.operation_tree.derivative(key) for key in self.reference_key_list] def _recalculate(self): - """ Recalculate the value of this object - primary use case is for testing """ + """Recalculate the value of this object - primary use case is for testing""" return self.operation_tree.evaluate(self.references) - def variance_propagate(self, quantity_units: Unit, covariances: dict[tuple[int, int]: "Quantity"] = {}): - """ Do standard error propagation to calculate the uncertainties associated with this quantity + def variance_propagate(self, quantity_units: Unit, covariances: dict[tuple[int, int] : "Quantity"] = {}): + """Do standard error propagation to calculate the uncertainties associated with this quantity :param quantity_units: units in which the output should be calculated :param covariances: off diagonal entries for the covariance matrix @@ -1036,15 +1503,16 @@ def variance_propagate(self, quantity_units: Unit, covariances: dict[tuple[int, return output - @staticmethod def variable(quantity: "Quantity"): - """ Create a history that starts with the provided data """ + """Create a history that starts with the provided data""" return QuantityHistory(Variable(quantity.hash_value), {quantity.hash_value: quantity}) @staticmethod - def apply_operation(operation: type[Operation], *histories: "QuantityHistory", **extra_parameters) -> "QuantityHistory": - """ Apply an operation to the history + def apply_operation( + operation: type[Operation], *histories: "QuantityHistory", **extra_parameters + ) -> "QuantityHistory": + """Apply an operation to the history This is slightly unsafe as it is possible to attempt to apply an n-ary operation to a number of trees other than n, but it is relatively concise. Because it is concise we'll go with this for now and see if it causes @@ -1060,21 +1528,20 @@ def apply_operation(operation: type[Operation], *histories: "QuantityHistory", * references.update(history.references) return QuantityHistory( - operation(*[history.operation_tree for history in histories], **extra_parameters), - references) + operation(*[history.operation_tree for history in histories], **extra_parameters), references + ) - def has_variance(self): + def has_error(self): for key in self.references: - if self.references[key].has_variance: + if self.references[key].has_error: return True return False def summary(self): - variable_strings = [self.references[key].string_repr for key in self.references] - s = "Variables: "+",".join(variable_strings) + s = "Variables: " + ",".join(variable_strings) s += "\n" s += self.operation_tree.summary() @@ -1082,14 +1549,15 @@ def summary(self): class Quantity[QuantityType]: - - - def __init__(self, - value: QuantityType, - units: Unit, - standard_error: QuantityType | None = None, - hash_seed = ""): - + def __init__( + self, + value: QuantityType, + units: Unit, + standard_error: QuantityType | None = None, + hash_seed="", + name="", + id_header="", + ): self.value = value """ Numerical value of this data, in the specified units""" @@ -1102,17 +1570,19 @@ def __init__(self, self.hash_value = -1 """ Hash based on value and uncertainty for data, -1 if it is a derived hash value """ - self._variance = None - """ Contains the variance if it is data driven """ + self._standard_error = standard_error + """ Contains the standard error if it is data driven """ if standard_error is None: self.hash_value = hash_data_via_numpy(hash_seed, value) else: - self._variance = standard_error ** 2 self.hash_value = hash_data_via_numpy(hash_seed, value, standard_error) self.history = QuantityHistory.variable(self) + self._id_header = id_header + self.name = name + # TODO: Adding this method as a temporary measure but we need a single # method that does this. def with_standard_error(self, standard_error: "Quantity"): @@ -1120,28 +1590,54 @@ def with_standard_error(self, standard_error: "Quantity"): return Quantity( value=self.value, units=self.units, - standard_error=standard_error.in_units_of(self.units),) + standard_error=standard_error.in_units_of(self.units), + name=self.name, + id_header=self._id_header, + ) else: - raise UnitError(f"Standard error units ({standard_error.units}) " - f"are not compatible with value units ({self.units})") + raise UnitError( + f"Standard error units ({standard_error.units}) are not compatible with value units ({self.units})" + ) @property - def has_variance(self): - return self._variance is not None + def has_error(self): + return self._standard_error is not None @property - def variance(self) -> "Quantity": - """ Get the variance of this object""" - if self._variance is None: - return Quantity(np.zeros_like(self.value), self.units**2) + def standard_error(self) -> "Quantity": + """Get the standard error of this object""" + if self.has_error: + return Quantity(self._standard_error, self.units, name=self.name, id_header=self._id_header) else: - return Quantity(self._variance, self.units**2) + return Quantity(np.zeros_like(self.value), self.units, name=self.name, id_header=self._id_header) - def standard_deviation(self) -> "Quantity": - return self.variance ** 0.5 + @property + def variance(self) -> "Quantity": + """Get the variance of this object""" + return self.standard_error**2 + + @property + def unique_id(self) -> str: + """Get a human readable unique id for a data set""" + return f"{self._id_header}:{self.name}:{self._base62_hash()}" + + def _base62_hash(self) -> str: + """Encode the hash_value in base62 for better readability""" + hashed = "" + current_hash = self.hash_value + while current_hash: + digit = current_hash % 62 + if digit < 10: + hashed = f"{digit}{hashed}" + elif digit < 36: + hashed = f"{chr(55 + digit)}{hashed}" + else: + hashed = f"{chr(61 + digit)}{hashed}" + current_hash = (current_hash - digit) // 62 + return hashed def in_units_of(self, units: Unit) -> QuantityType: - """ Get this quantity in other units """ + """Get this quantity in other units""" if self.units.equivalent(units): return (self.units.scale / units.scale) * self.value else: @@ -1149,13 +1645,16 @@ def in_units_of(self, units: Unit) -> QuantityType: def to_units_of(self, new_units: Unit) -> "Quantity[QuantityType]": new_value, new_error = self.in_units_of_with_standard_error(new_units) - return Quantity(value=new_value, - units=new_units, - standard_error=new_error, - hash_seed=self._hash_seed) + return Quantity( + value=new_value, + units=new_units, + standard_error=new_error, + hash_seed=self._hash_seed, + id_header=self._id_header, + ) def variance_in_units_of(self, units: Unit) -> QuantityType: - """ Get the variance of quantity in other units """ + """Get the variance of quantity in other units""" variance = self.variance if variance.units.equivalent(units): return (variance.units.scale / units.scale) * variance @@ -1167,17 +1666,15 @@ def in_si(self): return self.in_units_of(si_units) def in_units_of_with_standard_error(self, units): - variance = self.variance - units_squared = units**2 + standard_error = self.standard_error - if variance.units.equivalent(units_squared): - - return self.in_units_of(units), np.sqrt(self.variance.in_units_of(units_squared)) + if standard_error.units.equivalent(units): + return self.in_units_of(units), self.standard_error.in_units_of(units) else: - raise UnitError(f"Target units ({units}) not compatible with existing units ({variance.units}).") + raise UnitError(f"Target units ({units}) not compatible with existing units ({standard_error.units}).") def in_si_with_standard_error(self): - if self.has_variance: + if self.has_error: return self.in_units_of_with_standard_error(self.units.si_equivalent()) else: return self.in_si(), None @@ -1187,7 +1684,7 @@ def explicitly_formatted(self, unit_string: str) -> str: Performs any necessary unit conversions, but maintains the exact unit formatting provided by the user. This can be useful if you have a - power expressed in horsepower and you want it expressed as "745.7 N m/s" and not as "745.7 W". """ + power expressed in horsepower and you want it expressed as "745.7 N m/s" and not as "745.7 W".""" unit = parse_unit(unit_string) quantity = self.in_units_of(unit) return f"{quantity} {unit_string}" @@ -1195,128 +1692,103 @@ def explicitly_formatted(self, unit_string: str) -> str: def __eq__(self: Self, other: Self) -> bool | np.ndarray: return self.value == other.in_units_of(self.units) - - def __mul__(self: Self, other: ArrayLike | Self ) -> Self: + def __mul__(self: Self, other: ArrayLike | Self) -> Self: if isinstance(other, Quantity): return DerivedQuantity( self.value * other.value, self.units * other.units, - history=QuantityHistory.apply_operation(Mul, self.history, other.history)) + history=QuantityHistory.apply_operation(Mul, self.history, other.history), + ) else: - return DerivedQuantity(self.value * other, self.units, - QuantityHistory( - Mul( - self.history.operation_tree, - Constant(other)), - self.history.references)) + return DerivedQuantity( + self.value * other, + self.units, + QuantityHistory(Mul(self.history.operation_tree, Constant(other)), self.history.references), + ) def __rmul__(self: Self, other: ArrayLike | Self): if isinstance(other, Quantity): return DerivedQuantity( - other.value * self.value, - other.units * self.units, - history=QuantityHistory.apply_operation( - Mul, - other.history, - self.history)) + other.value * self.value, + other.units * self.units, + history=QuantityHistory.apply_operation(Mul, other.history, self.history), + ) else: - return DerivedQuantity(other * self.value, self.units, - QuantityHistory( - Mul( - Constant(other), - self.history.operation_tree), - self.history.references)) - + return DerivedQuantity( + other * self.value, + self.units, + QuantityHistory(Mul(Constant(other), self.history.operation_tree), self.history.references), + ) def __matmul__(self, other: ArrayLike | Self): if isinstance(other, Quantity): return DerivedQuantity( self.value @ other.value, self.units * other.units, - history=QuantityHistory.apply_operation( - MatMul, - self.history, - other.history)) + history=QuantityHistory.apply_operation(MatMul, self.history, other.history), + ) else: return DerivedQuantity( - self.value @ other, - self.units, - QuantityHistory( - MatMul( - self.history.operation_tree, - Constant(other)), - self.history.references)) + self.value @ other, + self.units, + QuantityHistory(MatMul(self.history.operation_tree, Constant(other)), self.history.references), + ) def __rmatmul__(self, other: ArrayLike | Self): if isinstance(other, Quantity): return DerivedQuantity( - other.value @ self.value, - other.units * self.units, - history=QuantityHistory.apply_operation( - MatMul, - other.history, - self.history)) + other.value @ self.value, + other.units * self.units, + history=QuantityHistory.apply_operation(MatMul, other.history, self.history), + ) else: - return DerivedQuantity(other @ self.value, self.units, - QuantityHistory( - MatMul( - Constant(other), - self.history.operation_tree), - self.history.references)) - + return DerivedQuantity( + other @ self.value, + self.units, + QuantityHistory(MatMul(Constant(other), self.history.operation_tree), self.history.references), + ) def __truediv__(self: Self, other: float | Self) -> Self: if isinstance(other, Quantity): return DerivedQuantity( - self.value / other.value, - self.units / other.units, - history=QuantityHistory.apply_operation( - Div, - self.history, - other.history)) + self.value / other.value, + self.units / other.units, + history=QuantityHistory.apply_operation(Div, self.history, other.history), + ) else: - return DerivedQuantity(self.value / other, self.units, - QuantityHistory( - Div( - Constant(other), - self.history.operation_tree), - self.history.references)) + return DerivedQuantity( + self.value / other, + self.units, + QuantityHistory(Div(Constant(other), self.history.operation_tree), self.history.references), + ) def __rtruediv__(self: Self, other: float | Self) -> Self: if isinstance(other, Quantity): return DerivedQuantity( - other.value / self.value, - other.units / self.units, - history=QuantityHistory.apply_operation( - Div, - other.history, - self.history - )) + other.value / self.value, + other.units / self.units, + history=QuantityHistory.apply_operation(Div, other.history, self.history), + ) else: return DerivedQuantity( - other / self.value, - self.units ** -1, - QuantityHistory( - Div( - Constant(other), - self.history.operation_tree), - self.history.references)) + other / self.value, + self.units**-1, + QuantityHistory(Div(Constant(other), self.history.operation_tree), self.history.references), + ) def __add__(self: Self, other: Self | ArrayLike) -> Self: if isinstance(other, Quantity): if self.units.equivalent(other.units): return DerivedQuantity( - self.value + (other.value * other.units.scale) / self.units.scale, - self.units, - QuantityHistory.apply_operation( - Add, - self.history, - other.history)) + self.value + (other.value * other.units.scale) / self.units.scale, + self.units, + QuantityHistory.apply_operation(Add, self.history, other.history), + ) else: raise UnitError(f"Units do not have the same dimensionality: {self.units} vs {other.units}") @@ -1326,11 +1798,7 @@ def __add__(self: Self, other: Self | ArrayLike) -> Self: # Don't need __radd__ because only quantity/quantity operations should be allowed def __neg__(self): - return DerivedQuantity(-self.value, self.units, - QuantityHistory.apply_operation( - Neg, - self.history - )) + return DerivedQuantity(-self.value, self.units, QuantityHistory.apply_operation(Neg, self.history)) def __sub__(self: Self, other: Self | ArrayLike) -> Self: return self + (-other) @@ -1339,18 +1807,15 @@ def __rsub__(self: Self, other: Self | ArrayLike) -> Self: return (-self) + other def __pow__(self: Self, other: int | float): - return DerivedQuantity(self.value ** other, - self.units ** other, - QuantityHistory( - Pow( - self.history.operation_tree, - other), - self.history.references)) + return DerivedQuantity( + self.value**other, + self.units**other, + QuantityHistory(Pow(self.history.operation_tree, other), self.history.references), + ) @staticmethod def _array_repr_format(arr: np.ndarray): - - """ Format the array """ + """Format the array""" order = len(arr.shape) reshaped = arr.reshape(-1) if len(reshaped) <= 2: @@ -1363,14 +1828,12 @@ def _array_repr_format(arr: np.ndarray): # else: # numbers = f"{reshaped[0]}, {reshaped[1]} ... {reshaped[-2]}, {reshaped[-1]}" - return "["*order + numbers + "]"*order + return "[" * order + numbers + "]" * order def __repr__(self): - if isinstance(self.units, NamedUnit): - value = self.value - error = self.standard_deviation().in_units_of(self.units) + error = self.standard_error.in_units_of(self.units) unit_string = self.units.symbol else: @@ -1381,12 +1844,12 @@ def __repr__(self): # Get the array in short form numeric_string = self._array_repr_format(value) - if self.has_variance: + if self.has_error: numeric_string += " ± " + self._array_repr_format(error) else: numeric_string = f"{value}" - if self.has_variance: + if self.has_error: numeric_string += f" ± {error}" return numeric_string + " " + unit_string @@ -1407,24 +1870,17 @@ def as_h5(self, group: h5py.Group, name: str): class NamedQuantity[QuantityType](Quantity[QuantityType]): - def __init__(self, - name: str, - value: QuantityType, - units: Unit, - standard_error: QuantityType | None = None): - - super().__init__(value, units, standard_error=standard_error, hash_seed=name) - self.name = name + def __init__( + self, name: str, value: QuantityType, units: Unit, standard_error: QuantityType | None = None, id_header="" + ): + super().__init__(value, units, standard_error=standard_error, hash_seed=name, name=name, id_header=id_header) def __repr__(self): return f"[{self.name}] " + super().__repr__() def to_units_of(self, new_units: Unit) -> "NamedQuantity[QuantityType]": new_value, new_error = self.in_units_of_with_standard_error(new_units) - return NamedQuantity(value=new_value, - units=new_units, - standard_error=new_error, - name=self.name) + return NamedQuantity(value=new_value, units=new_units, standard_error=new_error, name=self.name) def with_standard_error(self, standard_error: Quantity): if standard_error.units.equivalent(self.units): @@ -1432,40 +1888,39 @@ def with_standard_error(self, standard_error: Quantity): value=self.value, units=self.units, standard_error=standard_error.in_units_of(self.units), - name=self.name) + name=self.name, + id_header=self._id_header, + ) else: - raise UnitError(f"Standard error units ({standard_error.units}) " - f"are not compatible with value units ({self.units})") - + raise UnitError( + f"Standard error units ({standard_error.units}) are not compatible with value units ({self.units})" + ) @property def string_repr(self): return self.name + class DerivedQuantity[QuantityType](Quantity[QuantityType]): def __init__(self, value: QuantityType, units: Unit, history: QuantityHistory): super().__init__(value, units, standard_error=None) self.history = history self._variance_cache = None - self._has_variance = history.has_variance() - + self._has_error = history.has_error() def to_units_of(self, new_units: Unit) -> "Quantity[QuantityType]": # TODO: Lots of tests needed for this - return DerivedQuantity( - value=self.in_units_of(new_units), - units=new_units, - history=self.history) + return DerivedQuantity(value=self.in_units_of(new_units), units=new_units, history=self.history) @property - def has_variance(self): - return self._has_variance + def has_error(self): + return self._has_error @property - def variance(self) -> Quantity: + def standard_error(self) -> Quantity: if self._variance_cache is None: self._variance_cache = self.history.variance_propagate(self.units) - return self._variance_cache + return self._variance_cache**0.5 diff --git a/sasdata/quantities/quantity_examples.py b/sasdata/quantities/quantity_examples.py new file mode 100644 index 000000000..cc12640db --- /dev/null +++ b/sasdata/quantities/quantity_examples.py @@ -0,0 +1,8 @@ +from sasdata.quantities import units +from sasdata.quantities.quantity import NamedQuantity + +x = NamedQuantity("x", 1, units.meters, standard_error=1) +y = NamedQuantity("y", 1, units.decimeters, standard_error=1) + +print(x+y) +print((x+y).to_units_of(units.centimeters)) diff --git a/sasdata/quantities/si.py b/sasdata/quantities/si.py index 947cc4a11..9a21eaec3 100644 --- a/sasdata/quantities/si.py +++ b/sasdata/quantities/si.py @@ -1,83 +1,3 @@ -""" - -This file is autogenerated! - -Do not edit by hand, instead edit the files that build it (_build_tables.py) - - - - -DDDDDDDDDDDDD NNNNNNNN NNNNNNNN tttt -D::::::::::::DDD N:::::::N N::::::N ttt:::t -D:::::::::::::::DD N::::::::N N::::::N t:::::t -DDD:::::DDDDD:::::D N:::::::::N N::::::N t:::::t - D:::::D D:::::D ooooooooooo N::::::::::N N::::::N ooooooooooo ttttttt:::::ttttttt - D:::::D D:::::D oo:::::::::::oo N:::::::::::N N::::::N oo:::::::::::oo t:::::::::::::::::t - D:::::D D:::::Do:::::::::::::::o N:::::::N::::N N::::::No:::::::::::::::ot:::::::::::::::::t - D:::::D D:::::Do:::::ooooo:::::o N::::::N N::::N N::::::No:::::ooooo:::::otttttt:::::::tttttt - D:::::D D:::::Do::::o o::::o N::::::N N::::N:::::::No::::o o::::o t:::::t - D:::::D D:::::Do::::o o::::o N::::::N N:::::::::::No::::o o::::o t:::::t - D:::::D D:::::Do::::o o::::o N::::::N N::::::::::No::::o o::::o t:::::t - D:::::D D:::::D o::::o o::::o N::::::N N:::::::::No::::o o::::o t:::::t tttttt -DDD:::::DDDDD:::::D o:::::ooooo:::::o N::::::N N::::::::No:::::ooooo:::::o t::::::tttt:::::t -D:::::::::::::::DD o:::::::::::::::o N::::::N N:::::::No:::::::::::::::o tt::::::::::::::t -D::::::::::::DDD oo:::::::::::oo N::::::N N::::::N oo:::::::::::oo tt:::::::::::tt -DDDDDDDDDDDDD ooooooooooo NNNNNNNN NNNNNNN ooooooooooo ttttttttttt - - - - - - - - - dddddddd -EEEEEEEEEEEEEEEEEEEEEE d::::::d iiii tttt BBBBBBBBBBBBBBBBB -E::::::::::::::::::::E d::::::d i::::i ttt:::t B::::::::::::::::B -E::::::::::::::::::::E d::::::d iiii t:::::t B::::::BBBBBB:::::B -EE::::::EEEEEEEEE::::E d:::::d t:::::t BB:::::B B:::::B - E:::::E EEEEEE ddddddddd:::::d iiiiiiittttttt:::::ttttttt B::::B B:::::Byyyyyyy yyyyyyy - E:::::E dd::::::::::::::d i:::::it:::::::::::::::::t B::::B B:::::B y:::::y y:::::y - E::::::EEEEEEEEEE d::::::::::::::::d i::::it:::::::::::::::::t B::::BBBBBB:::::B y:::::y y:::::y - E:::::::::::::::E d:::::::ddddd:::::d i::::itttttt:::::::tttttt B:::::::::::::BB y:::::y y:::::y - E:::::::::::::::E d::::::d d:::::d i::::i t:::::t B::::BBBBBB:::::B y:::::y y:::::y - E::::::EEEEEEEEEE d:::::d d:::::d i::::i t:::::t B::::B B:::::B y:::::y y:::::y - E:::::E d:::::d d:::::d i::::i t:::::t B::::B B:::::B y:::::y:::::y - E:::::E EEEEEEd:::::d d:::::d i::::i t:::::t tttttt B::::B B:::::B y:::::::::y -EE::::::EEEEEEEE:::::Ed::::::ddddd::::::ddi::::::i t::::::tttt:::::t BB:::::BBBBBB::::::B y:::::::y -E::::::::::::::::::::E d:::::::::::::::::di::::::i tt::::::::::::::t B:::::::::::::::::B y:::::y -E::::::::::::::::::::E d:::::::::ddd::::di::::::i tt:::::::::::tt B::::::::::::::::B y:::::y -EEEEEEEEEEEEEEEEEEEEEE ddddddddd dddddiiiiiiii ttttttttttt BBBBBBBBBBBBBBBBB y:::::y - y:::::y - y:::::y - y:::::y - y:::::y - yyyyyyy - - - - dddddddd -HHHHHHHHH HHHHHHHHH d::::::d -H:::::::H H:::::::H d::::::d -H:::::::H H:::::::H d::::::d -HH::::::H H::::::HH d:::::d - H:::::H H:::::H aaaaaaaaaaaaa nnnn nnnnnnnn ddddddddd:::::d - H:::::H H:::::H a::::::::::::a n:::nn::::::::nn dd::::::::::::::d - H::::::HHHHH::::::H aaaaaaaaa:::::an::::::::::::::nn d::::::::::::::::d - H:::::::::::::::::H a::::ann:::::::::::::::nd:::::::ddddd:::::d - H:::::::::::::::::H aaaaaaa:::::a n:::::nnnn:::::nd::::::d d:::::d - H::::::HHHHH::::::H aa::::::::::::a n::::n n::::nd:::::d d:::::d - H:::::H H:::::H a::::aaaa::::::a n::::n n::::nd:::::d d:::::d - H:::::H H:::::H a::::a a:::::a n::::n n::::nd:::::d d:::::d -HH::::::H H::::::HHa::::a a:::::a n::::n n::::nd::::::ddddd::::::dd -H:::::::H H:::::::Ha:::::aaaa::::::a n::::n n::::n d:::::::::::::::::d -H:::::::H H:::::::H a::::::::::aa:::a n::::n n::::n d:::::::::ddd::::d -HHHHHHHHH HHHHHHHHH aaaaaaaaaa aaaa nnnnnn nnnnnn ddddddddd ddddd - - - -""" - from sasdata.quantities.units import ( amperes, coulombs, @@ -100,8 +20,9 @@ ) all_si = [ - meters, seconds, + meters, + kilograms, amperes, kelvin, hertz, @@ -117,5 +38,4 @@ webers, tesla, henry, - kilograms, ] diff --git a/sasdata/quantities/test_numerical_encoding.py b/sasdata/quantities/test_numerical_encoding.py new file mode 100644 index 000000000..b7fb7cfed --- /dev/null +++ b/sasdata/quantities/test_numerical_encoding.py @@ -0,0 +1,66 @@ +""" Tests for the encoding and decoding of numerical data""" + +import numpy as np +import pytest + +from sasdata.quantities.numerical_encoding import numerical_decode, numerical_encode + + +@pytest.mark.parametrize("value", [-100.0, -10.0, -1.0, 0.0, 0.5, 1.0, 10.0, 100.0, 1e100]) +def test_float_encode_decode(value: float): + + assert isinstance(value, float) # Make sure we have the right inputs + + encoded = numerical_encode(value) + decoded = numerical_decode(encoded) + + assert isinstance(decoded, float) + assert value == decoded + +@pytest.mark.parametrize("value", [-100, -10, -1, 0, 1, 10, 100, 1000000000000000000000000000000000]) +def test_int_encode_decode(value: int): + + assert isinstance(value, int) # Make sure we have the right inputs + + encoded = numerical_encode(value) + decoded = numerical_decode(encoded) + + assert isinstance(decoded, int) + assert value == decoded + +@pytest.mark.parametrize("shape", [ + (2,3,4), + (1,2), + (10,5,10), + (1,), + (4,), + (0, ) ]) +def test_numpy_float_encode_decode(shape): + np.random.seed(1776) + test_matrix = np.random.rand(*shape) + + encoded = numerical_encode(test_matrix) + decoded = numerical_decode(encoded) + + assert decoded.dtype == test_matrix.dtype + assert decoded.shape == test_matrix.shape + assert np.all(decoded == test_matrix) + +@pytest.mark.parametrize("dtype", [int, float, complex]) +def test_numpy_dtypes_encode_decode(dtype): + test_matrix = np.zeros((3,3), dtype=dtype) + + encoded = numerical_encode(test_matrix) + decoded = numerical_decode(encoded) + + assert decoded.dtype == test_matrix.dtype + +@pytest.mark.parametrize("dtype", [int, float, complex]) +@pytest.mark.parametrize("shape, n, m", [ + ((8, 8), (1,3,5),(2,5,7)), + ((6, 8), (1,0,5),(0,5,0)), + ((6, 1), (1, 0, 5), (0, 0, 0)), +]) +def test_coo_matrix_encode_decode(shape, n, m, dtype): + + values = np.arange(10) diff --git a/sasdata/quantities/unicode_superscript.py b/sasdata/quantities/unicode_superscript.py deleted file mode 100644 index 81f90f2d4..000000000 --- a/sasdata/quantities/unicode_superscript.py +++ /dev/null @@ -1,12 +0,0 @@ - -_ascii_version = "0123456789-" -_unicode_version = "⁰¹²³⁴⁵⁶⁷⁸⁹⁻" - -def int_as_unicode_superscript(number: int): - string = str(number) - - for old, new in zip(_ascii_version, _unicode_version): - string = string.replace(old, new) - - return string - diff --git a/sasdata/quantities/units.py b/sasdata/quantities/units.py index 7d03abda0..b47d6bf24 100644 --- a/sasdata/quantities/units.py +++ b/sasdata/quantities/units.py @@ -1,100 +1,28 @@ -""" - -This file is autogenerated! - -Do not edit by hand, instead edit the files that build it (_build_tables.py, _units_base.py) - - - - -DDDDDDDDDDDDD NNNNNNNN NNNNNNNN tttt -D::::::::::::DDD N:::::::N N::::::N ttt:::t -D:::::::::::::::DD N::::::::N N::::::N t:::::t -DDD:::::DDDDD:::::D N:::::::::N N::::::N t:::::t - D:::::D D:::::D ooooooooooo N::::::::::N N::::::N ooooooooooo ttttttt:::::ttttttt - D:::::D D:::::D oo:::::::::::oo N:::::::::::N N::::::N oo:::::::::::oo t:::::::::::::::::t - D:::::D D:::::Do:::::::::::::::o N:::::::N::::N N::::::No:::::::::::::::ot:::::::::::::::::t - D:::::D D:::::Do:::::ooooo:::::o N::::::N N::::N N::::::No:::::ooooo:::::otttttt:::::::tttttt - D:::::D D:::::Do::::o o::::o N::::::N N::::N:::::::No::::o o::::o t:::::t - D:::::D D:::::Do::::o o::::o N::::::N N:::::::::::No::::o o::::o t:::::t - D:::::D D:::::Do::::o o::::o N::::::N N::::::::::No::::o o::::o t:::::t - D:::::D D:::::D o::::o o::::o N::::::N N:::::::::No::::o o::::o t:::::t tttttt -DDD:::::DDDDD:::::D o:::::ooooo:::::o N::::::N N::::::::No:::::ooooo:::::o t::::::tttt:::::t -D:::::::::::::::DD o:::::::::::::::o N::::::N N:::::::No:::::::::::::::o tt::::::::::::::t -D::::::::::::DDD oo:::::::::::oo N::::::N N::::::N oo:::::::::::oo tt:::::::::::tt -DDDDDDDDDDDDD ooooooooooo NNNNNNNN NNNNNNN ooooooooooo ttttttttttt - - - - - - - - - dddddddd -EEEEEEEEEEEEEEEEEEEEEE d::::::d iiii tttt BBBBBBBBBBBBBBBBB -E::::::::::::::::::::E d::::::d i::::i ttt:::t B::::::::::::::::B -E::::::::::::::::::::E d::::::d iiii t:::::t B::::::BBBBBB:::::B -EE::::::EEEEEEEEE::::E d:::::d t:::::t BB:::::B B:::::B - E:::::E EEEEEE ddddddddd:::::d iiiiiiittttttt:::::ttttttt B::::B B:::::Byyyyyyy yyyyyyy - E:::::E dd::::::::::::::d i:::::it:::::::::::::::::t B::::B B:::::B y:::::y y:::::y - E::::::EEEEEEEEEE d::::::::::::::::d i::::it:::::::::::::::::t B::::BBBBBB:::::B y:::::y y:::::y - E:::::::::::::::E d:::::::ddddd:::::d i::::itttttt:::::::tttttt B:::::::::::::BB y:::::y y:::::y - E:::::::::::::::E d::::::d d:::::d i::::i t:::::t B::::BBBBBB:::::B y:::::y y:::::y - E::::::EEEEEEEEEE d:::::d d:::::d i::::i t:::::t B::::B B:::::B y:::::y y:::::y - E:::::E d:::::d d:::::d i::::i t:::::t B::::B B:::::B y:::::y:::::y - E:::::E EEEEEEd:::::d d:::::d i::::i t:::::t tttttt B::::B B:::::B y:::::::::y -EE::::::EEEEEEEE:::::Ed::::::ddddd::::::ddi::::::i t::::::tttt:::::t BB:::::BBBBBB::::::B y:::::::y -E::::::::::::::::::::E d:::::::::::::::::di::::::i tt::::::::::::::t B:::::::::::::::::B y:::::y -E::::::::::::::::::::E d:::::::::ddd::::di::::::i tt:::::::::::tt B::::::::::::::::B y:::::y -EEEEEEEEEEEEEEEEEEEEEE ddddddddd dddddiiiiiiii ttttttttttt BBBBBBBBBBBBBBBBB y:::::y - y:::::y - y:::::y - y:::::y - y:::::y - yyyyyyy - - - - dddddddd -HHHHHHHHH HHHHHHHHH d::::::d -H:::::::H H:::::::H d::::::d -H:::::::H H:::::::H d::::::d -HH::::::H H::::::HH d:::::d - H:::::H H:::::H aaaaaaaaaaaaa nnnn nnnnnnnn ddddddddd:::::d - H:::::H H:::::H a::::::::::::a n:::nn::::::::nn dd::::::::::::::d - H::::::HHHHH::::::H aaaaaaaaa:::::an::::::::::::::nn d::::::::::::::::d - H:::::::::::::::::H a::::ann:::::::::::::::nd:::::::ddddd:::::d - H:::::::::::::::::H aaaaaaa:::::a n:::::nnnn:::::nd::::::d d:::::d - H::::::HHHHH::::::H aa::::::::::::a n::::n n::::nd:::::d d:::::d - H:::::H H:::::H a::::aaaa::::::a n::::n n::::nd:::::d d:::::d - H:::::H H:::::H a::::a a:::::a n::::n n::::nd:::::d d:::::d -HH::::::H H::::::HHa::::a a:::::a n::::n n::::nd::::::ddddd::::::dd -H:::::::H H:::::::Ha:::::aaaa::::::a n::::n n::::n d:::::::::::::::::d -H:::::::H H:::::::H a::::::::::aa:::a n::::n n::::n d:::::::::ddd::::d -HHHHHHHHH HHHHHHHHH aaaaaaaaaa aaaa nnnnnn nnnnnn ddddddddd ddddd +import re +import sys +from collections import defaultdict, namedtuple +from fractions import Fraction +from typing import Self +import numpy as np +_ascii_version = "0123456789-" +_unicode_version = "⁰¹²³⁴⁵⁶⁷⁸⁹⁻" -""" -# -# Included from _units_base.py -# +def int_as_unicode_superscript(number: int): + string = str(number) -from collections.abc import Sequence -from dataclasses import dataclass -from fractions import Fraction -from typing import Self + for old, new in zip(_ascii_version, _unicode_version): + string = string.replace(old, new) -import numpy as np - -from sasdata.quantities.unicode_superscript import int_as_unicode_superscript + return string class DimensionError(Exception): pass + class Dimensions: """ @@ -105,14 +33,17 @@ class Dimensions: We do however track angle and amount, because its really useful for formatting units """ - def __init__(self, - length: int = 0, - time: int = 0, - mass: int = 0, - current: int = 0, - temperature: int = 0, - moles_hint: int = 0, - angle_hint: int = 0): + + def __init__( + self, + length: int = 0, + time: int = 0, + mass: int = 0, + current: int = 0, + temperature: int = 0, + moles_hint: int = 0, + angle_hint: int = 0, + ): self.length = length self.time = time @@ -124,8 +55,14 @@ def __init__(self, @property def is_dimensionless(self): - """ Is this dimension dimensionless (ignores moles_hint and angle_hint) """ - return self.length == 0 and self.time == 0 and self.mass == 0 and self.current == 0 and self.temperature == 0 + """Is this dimension dimensionless (ignores moles_hint and angle_hint)""" + return ( + self.length == 0 + and self.time == 0 + and self.mass == 0 + and self.current == 0 + and self.temperature == 0 + ) def __mul__(self: Self, other: Self): @@ -139,7 +76,8 @@ def __mul__(self: Self, other: Self): self.current + other.current, self.temperature + other.temperature, self.moles_hint + other.moles_hint, - self.angle_hint + other.angle_hint) + self.angle_hint + other.angle_hint, + ) def __truediv__(self: Self, other: Self): @@ -153,39 +91,56 @@ def __truediv__(self: Self, other: Self): self.current - other.current, self.temperature - other.temperature, self.moles_hint - other.moles_hint, - self.angle_hint - other.angle_hint) + self.angle_hint - other.angle_hint, + ) def __pow__(self, power: int | float): if not isinstance(power, (int, float)): return NotImplemented - frac = Fraction(power).limit_denominator(500) # Probably way bigger than needed, 10 would probably be fine + frac = Fraction(power).limit_denominator( + 500 + ) # Probably way bigger than needed, 10 would probably be fine denominator = frac.denominator numerator = frac.numerator # Throw errors if dimension is not a multiple of the denominator if self.length % denominator != 0: - raise DimensionError(f"Cannot apply power of {frac} to unit with length dimensionality {self.length}") + raise DimensionError( + f"Cannot apply power of {frac} to unit with length dimensionality {self.length}" + ) if self.time % denominator != 0: - raise DimensionError(f"Cannot apply power of {frac} to unit with time dimensionality {self.time}") + raise DimensionError( + f"Cannot apply power of {frac} to unit with time dimensionality {self.time}" + ) if self.mass % denominator != 0: - raise DimensionError(f"Cannot apply power of {frac} to unit with mass dimensionality {self.mass}") + raise DimensionError( + f"Cannot apply power of {frac} to unit with mass dimensionality {self.mass}" + ) if self.current % denominator != 0: - raise DimensionError(f"Cannot apply power of {frac} to unit with current dimensionality {self.current}") + raise DimensionError( + f"Cannot apply power of {frac} to unit with current dimensionality {self.current}" + ) if self.temperature % denominator != 0: - raise DimensionError(f"Cannot apply power of {frac} to unit with temperature dimensionality {self.temperature}") + raise DimensionError( + f"Cannot apply power of {frac} to unit with temperature dimensionality {self.temperature}" + ) if self.moles_hint % denominator != 0: - raise DimensionError(f"Cannot apply power of {frac} to unit with moles hint dimensionality of {self.moles_hint}") + raise DimensionError( + f"Cannot apply power of {frac} to unit with moles hint dimensionality of {self.moles_hint}" + ) if self.angle_hint % denominator != 0: - raise DimensionError(f"Cannot apply power of {frac} to unit with angle hint dimensionality of {self.angle_hint}") + raise DimensionError( + f"Cannot apply power of {frac} to unit with angle hint dimensionality of {self.angle_hint}" + ) return Dimensions( (self.length * numerator) // denominator, @@ -194,22 +149,25 @@ def __pow__(self, power: int | float): (self.current * numerator) // denominator, (self.temperature * numerator) // denominator, (self.moles_hint * numerator) // denominator, - (self.angle_hint * numerator) // denominator) + (self.angle_hint * numerator) // denominator, + ) - def __eq__(self: Self, other: Self): + def __eq__(self: Self, other: object) -> bool: if isinstance(other, Dimensions): - return (self.length == other.length and - self.time == other.time and - self.mass == other.mass and - self.current == other.current and - self.temperature == other.temperature and - self.moles_hint == other.moles_hint and - self.angle_hint == other.angle_hint) + return ( + self.length == other.length + and self.time == other.time + and self.mass == other.mass + and self.current == other.current + and self.temperature == other.temperature + and self.moles_hint == other.moles_hint + and self.angle_hint == other.angle_hint + ) return NotImplemented def __hash__(self): - """ Unique representation of units using Godel like encoding""" + """Unique representation of units using Godel like encoding""" two_powers = 0 if self.length < 0: @@ -233,9 +191,16 @@ def __hash__(self): if self.angle_hint < 0: two_powers += 64 - return 2**two_powers * 3**abs(self.length) * 5**abs(self.time) * \ - 7**abs(self.mass) * 11**abs(self.current) * 13**abs(self.temperature) * \ - 17**abs(self.moles_hint) * 19**abs(self.angle_hint) + return ( + 2**two_powers + * 3 ** abs(self.length) + * 5 ** abs(self.time) + * 7 ** abs(self.mass) + * 11 ** abs(self.current) + * 13 ** abs(self.temperature) + * 17 ** abs(self.moles_hint) + * 19 ** abs(self.angle_hint) + ) def __repr__(self): tokens = [] @@ -246,7 +211,8 @@ def __repr__(self): ("current", self.current), ("temperature", self.temperature), ("amount", self.moles_hint), - ("angle", self.angle_hint)]: + ("angle", self.angle_hint), + ]: if size == 0: pass @@ -255,7 +221,7 @@ def __repr__(self): else: tokens.append(f"{name}{int_as_unicode_superscript(size)}") - return ' '.join(tokens) + return " ".join(tokens) def si_repr(self): tokens = [] @@ -265,7 +231,8 @@ def si_repr(self): ("s", self.time), ("A", self.current), ("K", self.temperature), - ("mol", self.moles_hint)]: + ("mol", self.moles_hint), + ]: if size == 0: pass @@ -284,20 +251,15 @@ def si_repr(self): case _: tokens.append("rad" + int_as_unicode_superscript(self.angle_hint)) - return ''.join(tokens) + return "".join(tokens) class Unit: - def __init__(self, - si_scaling_factor: float, - dimensions: Dimensions): + def __init__(self, si_scaling_factor: float, dimensions: Dimensions): self.scale = si_scaling_factor self.dimensions = dimensions - def _components(self, tokens: Sequence["UnitToken"]): - pass - def __mul__(self: Self, other: "Unit"): if isinstance(other, Unit): return Unit(self.scale * other.scale, self.dimensions * other.dimensions) @@ -317,7 +279,7 @@ def __rtruediv__(self: Self, other: "Unit"): if isinstance(other, Unit): return Unit(other.scale / self.scale, other.dimensions / self.dimensions) elif isinstance(other, (int, float)): - return Unit(other / self.scale, self.dimensions ** -1) + return Unit(other / self.scale, self.dimensions**-1) else: return NotImplemented @@ -327,21 +289,21 @@ def __pow__(self, power: int | float): return Unit(self.scale**power, self.dimensions**power) - def equivalent(self: Self, other: "Unit"): return self.dimensions == other.dimensions - def __eq__(self: Self, other: "Unit"): - return self.equivalent(other) and np.abs(np.log(self.scale/other.scale)) < 1e-5 + def __eq__(self: Self, other: object) -> bool: + if isinstance(other, Unit): + return ( + self.equivalent(other) + and np.abs(np.log(self.scale / other.scale)) < 1e-5 + ) + return False def si_equivalent(self): - """ Get the SI unit corresponding to this unit""" + """Get the SI unit corresponding to this unit""" return Unit(1, self.dimensions) - def _format_unit(self, format_process: list["UnitFormatProcessor"]): - for processor in format_process: - pass - def __repr__(self): if self.scale == 1: # We're in SI @@ -350,12 +312,9 @@ def __repr__(self): else: return f"Unit[{self.scale}, {self.dimensions}]" - @staticmethod - def parse(unit_string: str) -> "Unit": - pass class NamedUnit(Unit): - """ Units, but they have a name, and a symbol + """Units, but they have a name, and a symbol :si_scaling_factor: Number of these units per SI equivalent :param dimensions: Dimensions object representing the dimensionality of these units @@ -363,13 +322,16 @@ class NamedUnit(Unit): :param ascii_symbol: Symbol for unit without unicode :param symbol: Unicode symbol """ - def __init__(self, - si_scaling_factor: float, - dimensions: Dimensions, - name: str | None = None, - ascii_symbol: str | None = None, - latex_symbol: str | None = None, - symbol: str | None = None): + + def __init__( + self, + si_scaling_factor: float, + dimensions: Dimensions, + name: str | None = None, + ascii_symbol: str | None = None, + latex_symbol: str | None = None, + symbol: str | None = None, + ): super().__init__(si_scaling_factor, dimensions) self.name = name @@ -384,3247 +346,909 @@ def __eq__(self, other): """Match other units exactly or match strings against ANY of our names""" match other: case str(): - return self.name == other or self.name == f"{other}s" or self.ascii_symbol == other or self.symbol == other + return ( + self.name == other + or self.name == f"{other}s" + or self.ascii_symbol == other + or self.symbol == other + ) case NamedUnit(): - return self.name == other.name \ - and self.ascii_symbol == other.ascii_symbol and self.symbol == other.symbol + return ( + self.name == other.name + and self.ascii_symbol == other.ascii_symbol + and self.symbol == other.symbol + ) case Unit(): - return self.equivalent(other) and np.abs(np.log(self.scale/other.scale)) < 1e-5 + return ( + self.equivalent(other) + and np.abs(np.log(self.scale / other.scale)) < 1e-5 + ) case _: return False - def startswith(self, prefix: str) -> bool: """Check if any representation of the unit begins with the prefix string""" prefix = prefix.lower() - return (self.name is not None and self.name.lower().startswith(prefix)) \ - or (self.ascii_symbol is not None and self.ascii_symbol.lower().startswith(prefix)) \ - or (self.symbol is not None and self.symbol.lower().startswith(prefix)) + return ( + (self.name is not None and self.name.lower().startswith(prefix)) + or ( + self.ascii_symbol is not None + and self.ascii_symbol.lower().startswith(prefix) + ) + or (self.symbol is not None and self.symbol.lower().startswith(prefix)) + ) + + +class UnknownUnit(NamedUnit): + """A unit for an unknown quantity + + While this library attempts to handle all known SI units, it is + likely that users will want to express quantities of arbitrary + units (for example, calculating donuts per person for a meeting). + The arbitrary unit allows for these unforseeable quantities.""" + + def __init__( + self, + numerator: str | list[str] | dict[str, int | float], + denominator: None | list[str] | dict[str, int | float] = None, + ): + if numerator is None: + return TypeError + self._numerator = UnknownUnit._parse_arg(numerator) + self._denominator = UnknownUnit._parse_arg(denominator) + self._unit = NamedUnit(1, Dimensions(), "") # Unitless + + super().__init__( + si_scaling_factor=1, dimensions=self._unit.dimensions, symbol=self._name() + ) -# -# Parsing plan: -# Require unknown amounts of units to be explicitly positive or negative? -# -# + @staticmethod + def _parse_arg( + arg: str | list[str] | dict[str, int | float] | None, + ) -> dict[str, int | float]: + """Parse the different possibilities for constructor arguments + + Both the numerator and the denominator could be a string, a + list of strings, or a dict. Parse any of these values into a + dictionary of names and powers. + + """ + match arg: + case None: + return {} + case str(): + return {UnknownUnit._valid_name(arg): 1} + case list(): + result: dict[str, int | float] = {} + for key in arg: + if key in result: + result[key] += 1 + else: + UnknownUnit._valid_name(key) + result[key] = 1 + return result + case dict(): + for key in arg: + UnknownUnit._valid_name(key) + return arg + case _: + raise TypeError + @staticmethod + def _valid_name(name: str) -> str: + """Confirms that the name of a unit is appropriate + This mostly confirms that the unit does not contain math + operators that would act on other units, like / or ^ + """ + + if re.search(r"[*/^\s]", name): + raise RuntimeError( + f'Unit name "{name}" contains invalid characters (*, /, ^, or whitespace)' + ) + + return name + + def _name(self): + num = [] + for key, value in self._numerator.items(): + if value == 1: + num.append(key) + else: + num.append(f"{key}^{value}") + den = [] + for key, value in self._denominator.items(): + den.append(f"{key}^{-value}") + num.sort() + den.sort() + return " ".join(num + den) + + def __eq__(self, other): + match other: + case UnknownUnit(): + return ( + self._numerator == other._numerator + and self._denominator == other._denominator + and self._unit == other._unit + ) + case Unit(): + return ( + not self._numerator + and not self._denominator + and self._unit == other + ) + case _: + return False + + def __mul__(self: Self, other: "Unit"): + match other: + case UnknownUnit(): + num = dict(self._numerator) + for key in other._numerator: + if key in num: + num[key] += other._numerator[key] + else: + num[key] = other._numerator[key] + den = dict(self._denominator) + for key in other._denominator: + if key in den: + den[key] += other._denominator[key] + else: + den[key] = other._denominator[key] + result = UnknownUnit(num, den) + result._unit *= other._unit + return result._reduce() + case NamedUnit() | Unit() | int() | float(): + result = UnknownUnit(self._numerator, self._denominator) + result._unit *= other + return result + case _: + return NotImplemented + + def __rmul__(self: Self, other): + return self * other + + def __truediv__(self: Self, other: "Unit") -> "UnknownUnit": + match other: + case UnknownUnit(): + num = dict(self._numerator) + for key in other._denominator: + if key in num: + num[key] += other._denominator[key] + else: + num[key] = other._denominator[key] + den = dict(self._denominator) + for key in other._numerator: + if key in den: + den[key] += other._numerator[key] + else: + den[key] = other._numerator[key] + result = UnknownUnit(num, den) + result._unit /= other._unit + return result._reduce() + case NamedUnit() | Unit() | int() | float(): + result = UnknownUnit(self._numerator, self._denominator) + result._unit /= other + return result + case _: + return NotImplemented + + def __rtruediv__(self: Self, other: "Unit") -> "UnknownUnit": + return (self / other) ** -1 + + def __pow__(self, power: int | float) -> "UnknownUnit": + match power: + case int() | float(): + num = {key: value * power for key, value in self._numerator.items()} + den = {key: value * power for key, value in self._denominator.items()} + if power < 0: + num, den = den, num + num = {k: -v for k, v in num.items()} + den = {k: -v for k, v in den.items()} + + result = UnknownUnit(num, den) + result._unit = self._unit**power + return result + case _: + return NotImplemented + + def equivalent(self: Self, other: "Unit"): + match other: + case UnknownUnit(): + return ( + self._unit.equivalent(other._unit) + and sorted(self._numerator) == sorted(other._numerator) + and sorted(self._denominator) == sorted(other._denominator) + ) + case _: + return False + + def _reduce(self): + """Remove redundant units""" + for k in self._denominator: + if k in self._numerator: + common = min(self._numerator[k], self._denominator[k]) + self._numerator[k] -= common + self._denominator[k] -= common + dead_nums = [k for k in self._numerator if self._numerator[k] == 0] + for k in dead_nums: + del self._numerator[k] + dead_dens = [k for k in self._denominator if self._denominator[k] == 0] + for k in dead_dens: + del self._denominator[k] + return self + + def __str__(self): + result = self._name() + if type(self._unit) is NamedUnit and self._unit.name.strip(): + result += f" {self._unit.name.strip()}" + if type(self._unit) is Unit and str(self._unit).strip(): + result += f" {str(self._unit).strip()}" + return result + + def __repr__(self): + return str(self) -@dataclass -class ProcessedUnitToken: - """ Mid processing representation of formatted units """ - base_string: str - exponent_string: str - latex_exponent_string: str - exponent: int - -class UnitFormatProcessor: - """ Represents a step in the unit processing pipeline""" - def apply(self, scale, dimensions) -> tuple[ProcessedUnitToken, float, Dimensions]: - """ This will be called to deal with each processing stage""" - -class RequiredUnitFormatProcessor(UnitFormatProcessor): - """ This unit is required to exist in the formatting """ - def __init__(self, unit: Unit, power: int = 1): - self.unit = unit - self.power = power - def apply(self, scale, dimensions) -> tuple[float, Dimensions, ProcessedUnitToken]: - new_scale = scale / (self.unit.scale * self.power) - new_dimensions = self.unit.dimensions / (dimensions**self.power) - token = ProcessedUnitToken(self.unit, self.power) - - return new_scale, new_dimensions, token -class GreedyAbsDimensionUnitFormatProcessor(UnitFormatProcessor): - """ This processor minimises the dimensionality of the unit by multiplying by as many - units of the specified type as needed """ - def __init__(self, unit: Unit): - self.unit = unit - - def apply(self, scale, dimensions) -> tuple[ProcessedUnitToken, float, Dimensions]: - pass - -class GreedyAbsDimensionUnitFormatProcessor(UnitFormatProcessor): - pass class UnitGroup: - """ A group of units that all have the same dimensionality """ + """A group of units that all have the same dimensionality""" + def __init__(self, name: str, units: list[NamedUnit]): self.name = name self.units = sorted(units, key=lambda unit: unit.scale) +Magnitude = namedtuple( + "Magnitude", ["symbol", "special_symbol", "latex_symbol", "name", "scale"] +) -# -# Specific units -# +bigger_magnitudes: list[Magnitude] = [ + Magnitude("E", None, None, "exa", 1e18), + Magnitude("P", None, None, "peta", 1e15), + Magnitude("T", None, None, "tera", 1e12), + Magnitude("G", None, None, "giga", 1e9), + Magnitude("M", None, None, "mega", 1e6), + Magnitude("k", None, None, "kilo", 1e3), +] -meters = NamedUnit(1, Dimensions(1, 0, 0, 0, 0, 0, 0),name='meters',ascii_symbol='m',symbol='m') -exameters = NamedUnit(1e+18, Dimensions(1, 0, 0, 0, 0, 0, 0),name='exameters',ascii_symbol='Em',symbol='Em') -petameters = NamedUnit(1000000000000000.0, Dimensions(1, 0, 0, 0, 0, 0, 0),name='petameters',ascii_symbol='Pm',symbol='Pm') -terameters = NamedUnit(1000000000000.0, Dimensions(1, 0, 0, 0, 0, 0, 0),name='terameters',ascii_symbol='Tm',symbol='Tm') -gigameters = NamedUnit(1000000000.0, Dimensions(1, 0, 0, 0, 0, 0, 0),name='gigameters',ascii_symbol='Gm',symbol='Gm') -megameters = NamedUnit(1000000.0, Dimensions(1, 0, 0, 0, 0, 0, 0),name='megameters',ascii_symbol='Mm',symbol='Mm') -kilometers = NamedUnit(1000.0, Dimensions(1, 0, 0, 0, 0, 0, 0),name='kilometers',ascii_symbol='km',symbol='km') -millimeters = NamedUnit(0.001, Dimensions(1, 0, 0, 0, 0, 0, 0),name='millimeters',ascii_symbol='mm',symbol='mm') -micrometers = NamedUnit(1e-06, Dimensions(1, 0, 0, 0, 0, 0, 0),name='micrometers',ascii_symbol='um',latex_symbol=r'{\mu}m',symbol='µm') -nanometers = NamedUnit(1e-09, Dimensions(1, 0, 0, 0, 0, 0, 0),name='nanometers',ascii_symbol='nm',symbol='nm') -picometers = NamedUnit(1e-12, Dimensions(1, 0, 0, 0, 0, 0, 0),name='picometers',ascii_symbol='pm',symbol='pm') -femtometers = NamedUnit(1e-15, Dimensions(1, 0, 0, 0, 0, 0, 0),name='femtometers',ascii_symbol='fm',symbol='fm') -attometers = NamedUnit(1e-18, Dimensions(1, 0, 0, 0, 0, 0, 0),name='attometers',ascii_symbol='am',symbol='am') -decimeters = NamedUnit(0.1, Dimensions(1, 0, 0, 0, 0, 0, 0),name='decimeters',ascii_symbol='dm',symbol='dm') -centimeters = NamedUnit(0.01, Dimensions(1, 0, 0, 0, 0, 0, 0),name='centimeters',ascii_symbol='cm',symbol='cm') -seconds = NamedUnit(1, Dimensions(0, 1, 0, 0, 0, 0, 0),name='seconds',ascii_symbol='s',symbol='s') -milliseconds = NamedUnit(0.001, Dimensions(0, 1, 0, 0, 0, 0, 0),name='milliseconds',ascii_symbol='ms',symbol='ms') -microseconds = NamedUnit(1e-06, Dimensions(0, 1, 0, 0, 0, 0, 0),name='microseconds',ascii_symbol='us',latex_symbol=r'{\mu}s',symbol='µs') -nanoseconds = NamedUnit(1e-09, Dimensions(0, 1, 0, 0, 0, 0, 0),name='nanoseconds',ascii_symbol='ns',symbol='ns') -picoseconds = NamedUnit(1e-12, Dimensions(0, 1, 0, 0, 0, 0, 0),name='picoseconds',ascii_symbol='ps',symbol='ps') -femtoseconds = NamedUnit(1e-15, Dimensions(0, 1, 0, 0, 0, 0, 0),name='femtoseconds',ascii_symbol='fs',symbol='fs') -attoseconds = NamedUnit(1e-18, Dimensions(0, 1, 0, 0, 0, 0, 0),name='attoseconds',ascii_symbol='as',symbol='as') -grams = NamedUnit(0.001, Dimensions(0, 0, 1, 0, 0, 0, 0),name='grams',ascii_symbol='g',symbol='g') -exagrams = NamedUnit(1000000000000000.0, Dimensions(0, 0, 1, 0, 0, 0, 0),name='exagrams',ascii_symbol='Eg',symbol='Eg') -petagrams = NamedUnit(1000000000000.0, Dimensions(0, 0, 1, 0, 0, 0, 0),name='petagrams',ascii_symbol='Pg',symbol='Pg') -teragrams = NamedUnit(1000000000.0, Dimensions(0, 0, 1, 0, 0, 0, 0),name='teragrams',ascii_symbol='Tg',symbol='Tg') -gigagrams = NamedUnit(1000000.0, Dimensions(0, 0, 1, 0, 0, 0, 0),name='gigagrams',ascii_symbol='Gg',symbol='Gg') -megagrams = NamedUnit(1000.0, Dimensions(0, 0, 1, 0, 0, 0, 0),name='megagrams',ascii_symbol='Mg',symbol='Mg') -kilograms = NamedUnit(1.0, Dimensions(0, 0, 1, 0, 0, 0, 0),name='kilograms',ascii_symbol='kg',symbol='kg') -milligrams = NamedUnit(1e-06, Dimensions(0, 0, 1, 0, 0, 0, 0),name='milligrams',ascii_symbol='mg',symbol='mg') -micrograms = NamedUnit(1e-09, Dimensions(0, 0, 1, 0, 0, 0, 0),name='micrograms',ascii_symbol='ug',latex_symbol=r'{\mu}g',symbol='µg') -nanograms = NamedUnit(1.0000000000000002e-12, Dimensions(0, 0, 1, 0, 0, 0, 0),name='nanograms',ascii_symbol='ng',symbol='ng') -picograms = NamedUnit(1e-15, Dimensions(0, 0, 1, 0, 0, 0, 0),name='picograms',ascii_symbol='pg',symbol='pg') -femtograms = NamedUnit(1e-18, Dimensions(0, 0, 1, 0, 0, 0, 0),name='femtograms',ascii_symbol='fg',symbol='fg') -attograms = NamedUnit(1.0000000000000001e-21, Dimensions(0, 0, 1, 0, 0, 0, 0),name='attograms',ascii_symbol='ag',symbol='ag') -amperes = NamedUnit(1, Dimensions(0, 0, 0, 1, 0, 0, 0),name='amperes',ascii_symbol='A',symbol='A') -exaamperes = NamedUnit(1e+18, Dimensions(0, 0, 0, 1, 0, 0, 0),name='exaamperes',ascii_symbol='EA',symbol='EA') -petaamperes = NamedUnit(1000000000000000.0, Dimensions(0, 0, 0, 1, 0, 0, 0),name='petaamperes',ascii_symbol='PA',symbol='PA') -teraamperes = NamedUnit(1000000000000.0, Dimensions(0, 0, 0, 1, 0, 0, 0),name='teraamperes',ascii_symbol='TA',symbol='TA') -gigaamperes = NamedUnit(1000000000.0, Dimensions(0, 0, 0, 1, 0, 0, 0),name='gigaamperes',ascii_symbol='GA',symbol='GA') -megaamperes = NamedUnit(1000000.0, Dimensions(0, 0, 0, 1, 0, 0, 0),name='megaamperes',ascii_symbol='MA',symbol='MA') -kiloamperes = NamedUnit(1000.0, Dimensions(0, 0, 0, 1, 0, 0, 0),name='kiloamperes',ascii_symbol='kA',symbol='kA') -milliamperes = NamedUnit(0.001, Dimensions(0, 0, 0, 1, 0, 0, 0),name='milliamperes',ascii_symbol='mA',symbol='mA') -microamperes = NamedUnit(1e-06, Dimensions(0, 0, 0, 1, 0, 0, 0),name='microamperes',ascii_symbol='uA',latex_symbol=r'{\mu}A',symbol='µA') -nanoamperes = NamedUnit(1e-09, Dimensions(0, 0, 0, 1, 0, 0, 0),name='nanoamperes',ascii_symbol='nA',symbol='nA') -picoamperes = NamedUnit(1e-12, Dimensions(0, 0, 0, 1, 0, 0, 0),name='picoamperes',ascii_symbol='pA',symbol='pA') -femtoamperes = NamedUnit(1e-15, Dimensions(0, 0, 0, 1, 0, 0, 0),name='femtoamperes',ascii_symbol='fA',symbol='fA') -attoamperes = NamedUnit(1e-18, Dimensions(0, 0, 0, 1, 0, 0, 0),name='attoamperes',ascii_symbol='aA',symbol='aA') -kelvin = NamedUnit(1, Dimensions(0, 0, 0, 0, 1, 0, 0),name='kelvin',ascii_symbol='K',symbol='K') -exakelvin = NamedUnit(1e+18, Dimensions(0, 0, 0, 0, 1, 0, 0),name='exakelvin',ascii_symbol='EK',symbol='EK') -petakelvin = NamedUnit(1000000000000000.0, Dimensions(0, 0, 0, 0, 1, 0, 0),name='petakelvin',ascii_symbol='PK',symbol='PK') -terakelvin = NamedUnit(1000000000000.0, Dimensions(0, 0, 0, 0, 1, 0, 0),name='terakelvin',ascii_symbol='TK',symbol='TK') -gigakelvin = NamedUnit(1000000000.0, Dimensions(0, 0, 0, 0, 1, 0, 0),name='gigakelvin',ascii_symbol='GK',symbol='GK') -megakelvin = NamedUnit(1000000.0, Dimensions(0, 0, 0, 0, 1, 0, 0),name='megakelvin',ascii_symbol='MK',symbol='MK') -kilokelvin = NamedUnit(1000.0, Dimensions(0, 0, 0, 0, 1, 0, 0),name='kilokelvin',ascii_symbol='kK',symbol='kK') -millikelvin = NamedUnit(0.001, Dimensions(0, 0, 0, 0, 1, 0, 0),name='millikelvin',ascii_symbol='mK',symbol='mK') -microkelvin = NamedUnit(1e-06, Dimensions(0, 0, 0, 0, 1, 0, 0),name='microkelvin',ascii_symbol='uK',latex_symbol=r'{\mu}K',symbol='µK') -nanokelvin = NamedUnit(1e-09, Dimensions(0, 0, 0, 0, 1, 0, 0),name='nanokelvin',ascii_symbol='nK',symbol='nK') -picokelvin = NamedUnit(1e-12, Dimensions(0, 0, 0, 0, 1, 0, 0),name='picokelvin',ascii_symbol='pK',symbol='pK') -femtokelvin = NamedUnit(1e-15, Dimensions(0, 0, 0, 0, 1, 0, 0),name='femtokelvin',ascii_symbol='fK',symbol='fK') -attokelvin = NamedUnit(1e-18, Dimensions(0, 0, 0, 0, 1, 0, 0),name='attokelvin',ascii_symbol='aK',symbol='aK') -hertz = NamedUnit(1, Dimensions(0, -1, 0, 0, 0, 0, 0),name='hertz',ascii_symbol='Hz',symbol='Hz') -exahertz = NamedUnit(1e+18, Dimensions(0, -1, 0, 0, 0, 0, 0),name='exahertz',ascii_symbol='EHz',symbol='EHz') -petahertz = NamedUnit(1000000000000000.0, Dimensions(0, -1, 0, 0, 0, 0, 0),name='petahertz',ascii_symbol='PHz',symbol='PHz') -terahertz = NamedUnit(1000000000000.0, Dimensions(0, -1, 0, 0, 0, 0, 0),name='terahertz',ascii_symbol='THz',symbol='THz') -gigahertz = NamedUnit(1000000000.0, Dimensions(0, -1, 0, 0, 0, 0, 0),name='gigahertz',ascii_symbol='GHz',symbol='GHz') -megahertz = NamedUnit(1000000.0, Dimensions(0, -1, 0, 0, 0, 0, 0),name='megahertz',ascii_symbol='MHz',symbol='MHz') -kilohertz = NamedUnit(1000.0, Dimensions(0, -1, 0, 0, 0, 0, 0),name='kilohertz',ascii_symbol='kHz',symbol='kHz') -millihertz = NamedUnit(0.001, Dimensions(0, -1, 0, 0, 0, 0, 0),name='millihertz',ascii_symbol='mHz',symbol='mHz') -microhertz = NamedUnit(1e-06, Dimensions(0, -1, 0, 0, 0, 0, 0),name='microhertz',ascii_symbol='uHz',latex_symbol=r'{\mu}Hz',symbol='µHz') -nanohertz = NamedUnit(1e-09, Dimensions(0, -1, 0, 0, 0, 0, 0),name='nanohertz',ascii_symbol='nHz',symbol='nHz') -picohertz = NamedUnit(1e-12, Dimensions(0, -1, 0, 0, 0, 0, 0),name='picohertz',ascii_symbol='pHz',symbol='pHz') -femtohertz = NamedUnit(1e-15, Dimensions(0, -1, 0, 0, 0, 0, 0),name='femtohertz',ascii_symbol='fHz',symbol='fHz') -attohertz = NamedUnit(1e-18, Dimensions(0, -1, 0, 0, 0, 0, 0),name='attohertz',ascii_symbol='aHz',symbol='aHz') -newtons = NamedUnit(1, Dimensions(1, -2, 1, 0, 0, 0, 0),name='newtons',ascii_symbol='N',symbol='N') -exanewtons = NamedUnit(1e+18, Dimensions(1, -2, 1, 0, 0, 0, 0),name='exanewtons',ascii_symbol='EN',symbol='EN') -petanewtons = NamedUnit(1000000000000000.0, Dimensions(1, -2, 1, 0, 0, 0, 0),name='petanewtons',ascii_symbol='PN',symbol='PN') -teranewtons = NamedUnit(1000000000000.0, Dimensions(1, -2, 1, 0, 0, 0, 0),name='teranewtons',ascii_symbol='TN',symbol='TN') -giganewtons = NamedUnit(1000000000.0, Dimensions(1, -2, 1, 0, 0, 0, 0),name='giganewtons',ascii_symbol='GN',symbol='GN') -meganewtons = NamedUnit(1000000.0, Dimensions(1, -2, 1, 0, 0, 0, 0),name='meganewtons',ascii_symbol='MN',symbol='MN') -kilonewtons = NamedUnit(1000.0, Dimensions(1, -2, 1, 0, 0, 0, 0),name='kilonewtons',ascii_symbol='kN',symbol='kN') -millinewtons = NamedUnit(0.001, Dimensions(1, -2, 1, 0, 0, 0, 0),name='millinewtons',ascii_symbol='mN',symbol='mN') -micronewtons = NamedUnit(1e-06, Dimensions(1, -2, 1, 0, 0, 0, 0),name='micronewtons',ascii_symbol='uN',latex_symbol=r'{\mu}N',symbol='µN') -nanonewtons = NamedUnit(1e-09, Dimensions(1, -2, 1, 0, 0, 0, 0),name='nanonewtons',ascii_symbol='nN',symbol='nN') -piconewtons = NamedUnit(1e-12, Dimensions(1, -2, 1, 0, 0, 0, 0),name='piconewtons',ascii_symbol='pN',symbol='pN') -femtonewtons = NamedUnit(1e-15, Dimensions(1, -2, 1, 0, 0, 0, 0),name='femtonewtons',ascii_symbol='fN',symbol='fN') -attonewtons = NamedUnit(1e-18, Dimensions(1, -2, 1, 0, 0, 0, 0),name='attonewtons',ascii_symbol='aN',symbol='aN') -pascals = NamedUnit(1, Dimensions(-1, -2, 1, 0, 0, 0, 0),name='pascals',ascii_symbol='Pa',symbol='Pa') -exapascals = NamedUnit(1e+18, Dimensions(-1, -2, 1, 0, 0, 0, 0),name='exapascals',ascii_symbol='EPa',symbol='EPa') -petapascals = NamedUnit(1000000000000000.0, Dimensions(-1, -2, 1, 0, 0, 0, 0),name='petapascals',ascii_symbol='PPa',symbol='PPa') -terapascals = NamedUnit(1000000000000.0, Dimensions(-1, -2, 1, 0, 0, 0, 0),name='terapascals',ascii_symbol='TPa',symbol='TPa') -gigapascals = NamedUnit(1000000000.0, Dimensions(-1, -2, 1, 0, 0, 0, 0),name='gigapascals',ascii_symbol='GPa',symbol='GPa') -megapascals = NamedUnit(1000000.0, Dimensions(-1, -2, 1, 0, 0, 0, 0),name='megapascals',ascii_symbol='MPa',symbol='MPa') -kilopascals = NamedUnit(1000.0, Dimensions(-1, -2, 1, 0, 0, 0, 0),name='kilopascals',ascii_symbol='kPa',symbol='kPa') -millipascals = NamedUnit(0.001, Dimensions(-1, -2, 1, 0, 0, 0, 0),name='millipascals',ascii_symbol='mPa',symbol='mPa') -micropascals = NamedUnit(1e-06, Dimensions(-1, -2, 1, 0, 0, 0, 0),name='micropascals',ascii_symbol='uPa',latex_symbol=r'{\mu}Pa',symbol='µPa') -nanopascals = NamedUnit(1e-09, Dimensions(-1, -2, 1, 0, 0, 0, 0),name='nanopascals',ascii_symbol='nPa',symbol='nPa') -picopascals = NamedUnit(1e-12, Dimensions(-1, -2, 1, 0, 0, 0, 0),name='picopascals',ascii_symbol='pPa',symbol='pPa') -femtopascals = NamedUnit(1e-15, Dimensions(-1, -2, 1, 0, 0, 0, 0),name='femtopascals',ascii_symbol='fPa',symbol='fPa') -attopascals = NamedUnit(1e-18, Dimensions(-1, -2, 1, 0, 0, 0, 0),name='attopascals',ascii_symbol='aPa',symbol='aPa') -joules = NamedUnit(1, Dimensions(2, -2, 1, 0, 0, 0, 0),name='joules',ascii_symbol='J',symbol='J') -exajoules = NamedUnit(1e+18, Dimensions(2, -2, 1, 0, 0, 0, 0),name='exajoules',ascii_symbol='EJ',symbol='EJ') -petajoules = NamedUnit(1000000000000000.0, Dimensions(2, -2, 1, 0, 0, 0, 0),name='petajoules',ascii_symbol='PJ',symbol='PJ') -terajoules = NamedUnit(1000000000000.0, Dimensions(2, -2, 1, 0, 0, 0, 0),name='terajoules',ascii_symbol='TJ',symbol='TJ') -gigajoules = NamedUnit(1000000000.0, Dimensions(2, -2, 1, 0, 0, 0, 0),name='gigajoules',ascii_symbol='GJ',symbol='GJ') -megajoules = NamedUnit(1000000.0, Dimensions(2, -2, 1, 0, 0, 0, 0),name='megajoules',ascii_symbol='MJ',symbol='MJ') -kilojoules = NamedUnit(1000.0, Dimensions(2, -2, 1, 0, 0, 0, 0),name='kilojoules',ascii_symbol='kJ',symbol='kJ') -millijoules = NamedUnit(0.001, Dimensions(2, -2, 1, 0, 0, 0, 0),name='millijoules',ascii_symbol='mJ',symbol='mJ') -microjoules = NamedUnit(1e-06, Dimensions(2, -2, 1, 0, 0, 0, 0),name='microjoules',ascii_symbol='uJ',latex_symbol=r'{\mu}J',symbol='µJ') -nanojoules = NamedUnit(1e-09, Dimensions(2, -2, 1, 0, 0, 0, 0),name='nanojoules',ascii_symbol='nJ',symbol='nJ') -picojoules = NamedUnit(1e-12, Dimensions(2, -2, 1, 0, 0, 0, 0),name='picojoules',ascii_symbol='pJ',symbol='pJ') -femtojoules = NamedUnit(1e-15, Dimensions(2, -2, 1, 0, 0, 0, 0),name='femtojoules',ascii_symbol='fJ',symbol='fJ') -attojoules = NamedUnit(1e-18, Dimensions(2, -2, 1, 0, 0, 0, 0),name='attojoules',ascii_symbol='aJ',symbol='aJ') -watts = NamedUnit(1, Dimensions(2, -3, 1, 0, 0, 0, 0),name='watts',ascii_symbol='W',symbol='W') -exawatts = NamedUnit(1e+18, Dimensions(2, -3, 1, 0, 0, 0, 0),name='exawatts',ascii_symbol='EW',symbol='EW') -petawatts = NamedUnit(1000000000000000.0, Dimensions(2, -3, 1, 0, 0, 0, 0),name='petawatts',ascii_symbol='PW',symbol='PW') -terawatts = NamedUnit(1000000000000.0, Dimensions(2, -3, 1, 0, 0, 0, 0),name='terawatts',ascii_symbol='TW',symbol='TW') -gigawatts = NamedUnit(1000000000.0, Dimensions(2, -3, 1, 0, 0, 0, 0),name='gigawatts',ascii_symbol='GW',symbol='GW') -megawatts = NamedUnit(1000000.0, Dimensions(2, -3, 1, 0, 0, 0, 0),name='megawatts',ascii_symbol='MW',symbol='MW') -kilowatts = NamedUnit(1000.0, Dimensions(2, -3, 1, 0, 0, 0, 0),name='kilowatts',ascii_symbol='kW',symbol='kW') -milliwatts = NamedUnit(0.001, Dimensions(2, -3, 1, 0, 0, 0, 0),name='milliwatts',ascii_symbol='mW',symbol='mW') -microwatts = NamedUnit(1e-06, Dimensions(2, -3, 1, 0, 0, 0, 0),name='microwatts',ascii_symbol='uW',latex_symbol=r'{\mu}W',symbol='µW') -nanowatts = NamedUnit(1e-09, Dimensions(2, -3, 1, 0, 0, 0, 0),name='nanowatts',ascii_symbol='nW',symbol='nW') -picowatts = NamedUnit(1e-12, Dimensions(2, -3, 1, 0, 0, 0, 0),name='picowatts',ascii_symbol='pW',symbol='pW') -femtowatts = NamedUnit(1e-15, Dimensions(2, -3, 1, 0, 0, 0, 0),name='femtowatts',ascii_symbol='fW',symbol='fW') -attowatts = NamedUnit(1e-18, Dimensions(2, -3, 1, 0, 0, 0, 0),name='attowatts',ascii_symbol='aW',symbol='aW') -coulombs = NamedUnit(1, Dimensions(0, 1, 0, 1, 0, 0, 0),name='coulombs',ascii_symbol='C',symbol='C') -exacoulombs = NamedUnit(1e+18, Dimensions(0, 1, 0, 1, 0, 0, 0),name='exacoulombs',ascii_symbol='EC',symbol='EC') -petacoulombs = NamedUnit(1000000000000000.0, Dimensions(0, 1, 0, 1, 0, 0, 0),name='petacoulombs',ascii_symbol='PC',symbol='PC') -teracoulombs = NamedUnit(1000000000000.0, Dimensions(0, 1, 0, 1, 0, 0, 0),name='teracoulombs',ascii_symbol='TC',symbol='TC') -gigacoulombs = NamedUnit(1000000000.0, Dimensions(0, 1, 0, 1, 0, 0, 0),name='gigacoulombs',ascii_symbol='GC',symbol='GC') -megacoulombs = NamedUnit(1000000.0, Dimensions(0, 1, 0, 1, 0, 0, 0),name='megacoulombs',ascii_symbol='MC',symbol='MC') -kilocoulombs = NamedUnit(1000.0, Dimensions(0, 1, 0, 1, 0, 0, 0),name='kilocoulombs',ascii_symbol='kC',symbol='kC') -millicoulombs = NamedUnit(0.001, Dimensions(0, 1, 0, 1, 0, 0, 0),name='millicoulombs',ascii_symbol='mC',symbol='mC') -microcoulombs = NamedUnit(1e-06, Dimensions(0, 1, 0, 1, 0, 0, 0),name='microcoulombs',ascii_symbol='uC',latex_symbol=r'{\mu}C',symbol='µC') -nanocoulombs = NamedUnit(1e-09, Dimensions(0, 1, 0, 1, 0, 0, 0),name='nanocoulombs',ascii_symbol='nC',symbol='nC') -picocoulombs = NamedUnit(1e-12, Dimensions(0, 1, 0, 1, 0, 0, 0),name='picocoulombs',ascii_symbol='pC',symbol='pC') -femtocoulombs = NamedUnit(1e-15, Dimensions(0, 1, 0, 1, 0, 0, 0),name='femtocoulombs',ascii_symbol='fC',symbol='fC') -attocoulombs = NamedUnit(1e-18, Dimensions(0, 1, 0, 1, 0, 0, 0),name='attocoulombs',ascii_symbol='aC',symbol='aC') -volts = NamedUnit(1, Dimensions(2, -3, 1, -1, 0, 0, 0),name='volts',ascii_symbol='V',symbol='V') -exavolts = NamedUnit(1e+18, Dimensions(2, -3, 1, -1, 0, 0, 0),name='exavolts',ascii_symbol='EV',symbol='EV') -petavolts = NamedUnit(1000000000000000.0, Dimensions(2, -3, 1, -1, 0, 0, 0),name='petavolts',ascii_symbol='PV',symbol='PV') -teravolts = NamedUnit(1000000000000.0, Dimensions(2, -3, 1, -1, 0, 0, 0),name='teravolts',ascii_symbol='TV',symbol='TV') -gigavolts = NamedUnit(1000000000.0, Dimensions(2, -3, 1, -1, 0, 0, 0),name='gigavolts',ascii_symbol='GV',symbol='GV') -megavolts = NamedUnit(1000000.0, Dimensions(2, -3, 1, -1, 0, 0, 0),name='megavolts',ascii_symbol='MV',symbol='MV') -kilovolts = NamedUnit(1000.0, Dimensions(2, -3, 1, -1, 0, 0, 0),name='kilovolts',ascii_symbol='kV',symbol='kV') -millivolts = NamedUnit(0.001, Dimensions(2, -3, 1, -1, 0, 0, 0),name='millivolts',ascii_symbol='mV',symbol='mV') -microvolts = NamedUnit(1e-06, Dimensions(2, -3, 1, -1, 0, 0, 0),name='microvolts',ascii_symbol='uV',latex_symbol=r'{\mu}V',symbol='µV') -nanovolts = NamedUnit(1e-09, Dimensions(2, -3, 1, -1, 0, 0, 0),name='nanovolts',ascii_symbol='nV',symbol='nV') -picovolts = NamedUnit(1e-12, Dimensions(2, -3, 1, -1, 0, 0, 0),name='picovolts',ascii_symbol='pV',symbol='pV') -femtovolts = NamedUnit(1e-15, Dimensions(2, -3, 1, -1, 0, 0, 0),name='femtovolts',ascii_symbol='fV',symbol='fV') -attovolts = NamedUnit(1e-18, Dimensions(2, -3, 1, -1, 0, 0, 0),name='attovolts',ascii_symbol='aV',symbol='aV') -ohms = NamedUnit(1, Dimensions(2, -3, 1, -2, 0, 0, 0),name='ohms',ascii_symbol='Ohm',latex_symbol=r'\Omega',symbol='Ω') -exaohms = NamedUnit(1e+18, Dimensions(2, -3, 1, -2, 0, 0, 0),name='exaohms',ascii_symbol='EOhm',latex_symbol=r'E\Omega',symbol='EΩ') -petaohms = NamedUnit(1000000000000000.0, Dimensions(2, -3, 1, -2, 0, 0, 0),name='petaohms',ascii_symbol='POhm',latex_symbol=r'P\Omega',symbol='PΩ') -teraohms = NamedUnit(1000000000000.0, Dimensions(2, -3, 1, -2, 0, 0, 0),name='teraohms',ascii_symbol='TOhm',latex_symbol=r'T\Omega',symbol='TΩ') -gigaohms = NamedUnit(1000000000.0, Dimensions(2, -3, 1, -2, 0, 0, 0),name='gigaohms',ascii_symbol='GOhm',latex_symbol=r'G\Omega',symbol='GΩ') -megaohms = NamedUnit(1000000.0, Dimensions(2, -3, 1, -2, 0, 0, 0),name='megaohms',ascii_symbol='MOhm',latex_symbol=r'M\Omega',symbol='MΩ') -kiloohms = NamedUnit(1000.0, Dimensions(2, -3, 1, -2, 0, 0, 0),name='kiloohms',ascii_symbol='kOhm',latex_symbol=r'k\Omega',symbol='kΩ') -milliohms = NamedUnit(0.001, Dimensions(2, -3, 1, -2, 0, 0, 0),name='milliohms',ascii_symbol='mOhm',latex_symbol=r'm\Omega',symbol='mΩ') -microohms = NamedUnit(1e-06, Dimensions(2, -3, 1, -2, 0, 0, 0),name='microohms',ascii_symbol='uOhm',latex_symbol=r'{\mu}\Omega',symbol='µΩ') -nanoohms = NamedUnit(1e-09, Dimensions(2, -3, 1, -2, 0, 0, 0),name='nanoohms',ascii_symbol='nOhm',latex_symbol=r'n\Omega',symbol='nΩ') -picoohms = NamedUnit(1e-12, Dimensions(2, -3, 1, -2, 0, 0, 0),name='picoohms',ascii_symbol='pOhm',latex_symbol=r'p\Omega',symbol='pΩ') -femtoohms = NamedUnit(1e-15, Dimensions(2, -3, 1, -2, 0, 0, 0),name='femtoohms',ascii_symbol='fOhm',latex_symbol=r'f\Omega',symbol='fΩ') -attoohms = NamedUnit(1e-18, Dimensions(2, -3, 1, -2, 0, 0, 0),name='attoohms',ascii_symbol='aOhm',latex_symbol=r'a\Omega',symbol='aΩ') -farads = NamedUnit(1, Dimensions(-2, 4, -1, 2, 0, 0, 0),name='farads',ascii_symbol='F',symbol='F') -exafarads = NamedUnit(1e+18, Dimensions(-2, 4, -1, 2, 0, 0, 0),name='exafarads',ascii_symbol='EF',symbol='EF') -petafarads = NamedUnit(1000000000000000.0, Dimensions(-2, 4, -1, 2, 0, 0, 0),name='petafarads',ascii_symbol='PF',symbol='PF') -terafarads = NamedUnit(1000000000000.0, Dimensions(-2, 4, -1, 2, 0, 0, 0),name='terafarads',ascii_symbol='TF',symbol='TF') -gigafarads = NamedUnit(1000000000.0, Dimensions(-2, 4, -1, 2, 0, 0, 0),name='gigafarads',ascii_symbol='GF',symbol='GF') -megafarads = NamedUnit(1000000.0, Dimensions(-2, 4, -1, 2, 0, 0, 0),name='megafarads',ascii_symbol='MF',symbol='MF') -kilofarads = NamedUnit(1000.0, Dimensions(-2, 4, -1, 2, 0, 0, 0),name='kilofarads',ascii_symbol='kF',symbol='kF') -millifarads = NamedUnit(0.001, Dimensions(-2, 4, -1, 2, 0, 0, 0),name='millifarads',ascii_symbol='mF',symbol='mF') -microfarads = NamedUnit(1e-06, Dimensions(-2, 4, -1, 2, 0, 0, 0),name='microfarads',ascii_symbol='uF',latex_symbol=r'{\mu}F',symbol='µF') -nanofarads = NamedUnit(1e-09, Dimensions(-2, 4, -1, 2, 0, 0, 0),name='nanofarads',ascii_symbol='nF',symbol='nF') -picofarads = NamedUnit(1e-12, Dimensions(-2, 4, -1, 2, 0, 0, 0),name='picofarads',ascii_symbol='pF',symbol='pF') -femtofarads = NamedUnit(1e-15, Dimensions(-2, 4, -1, 2, 0, 0, 0),name='femtofarads',ascii_symbol='fF',symbol='fF') -attofarads = NamedUnit(1e-18, Dimensions(-2, 4, -1, 2, 0, 0, 0),name='attofarads',ascii_symbol='aF',symbol='aF') -siemens = NamedUnit(1, Dimensions(-2, 3, -1, 2, 0, 0, 0),name='siemens',ascii_symbol='S',symbol='S') -exasiemens = NamedUnit(1e+18, Dimensions(-2, 3, -1, 2, 0, 0, 0),name='exasiemens',ascii_symbol='ES',symbol='ES') -petasiemens = NamedUnit(1000000000000000.0, Dimensions(-2, 3, -1, 2, 0, 0, 0),name='petasiemens',ascii_symbol='PS',symbol='PS') -terasiemens = NamedUnit(1000000000000.0, Dimensions(-2, 3, -1, 2, 0, 0, 0),name='terasiemens',ascii_symbol='TS',symbol='TS') -gigasiemens = NamedUnit(1000000000.0, Dimensions(-2, 3, -1, 2, 0, 0, 0),name='gigasiemens',ascii_symbol='GS',symbol='GS') -megasiemens = NamedUnit(1000000.0, Dimensions(-2, 3, -1, 2, 0, 0, 0),name='megasiemens',ascii_symbol='MS',symbol='MS') -kilosiemens = NamedUnit(1000.0, Dimensions(-2, 3, -1, 2, 0, 0, 0),name='kilosiemens',ascii_symbol='kS',symbol='kS') -millisiemens = NamedUnit(0.001, Dimensions(-2, 3, -1, 2, 0, 0, 0),name='millisiemens',ascii_symbol='mS',symbol='mS') -microsiemens = NamedUnit(1e-06, Dimensions(-2, 3, -1, 2, 0, 0, 0),name='microsiemens',ascii_symbol='uS',latex_symbol=r'{\mu}S',symbol='µS') -nanosiemens = NamedUnit(1e-09, Dimensions(-2, 3, -1, 2, 0, 0, 0),name='nanosiemens',ascii_symbol='nS',symbol='nS') -picosiemens = NamedUnit(1e-12, Dimensions(-2, 3, -1, 2, 0, 0, 0),name='picosiemens',ascii_symbol='pS',symbol='pS') -femtosiemens = NamedUnit(1e-15, Dimensions(-2, 3, -1, 2, 0, 0, 0),name='femtosiemens',ascii_symbol='fS',symbol='fS') -attosiemens = NamedUnit(1e-18, Dimensions(-2, 3, -1, 2, 0, 0, 0),name='attosiemens',ascii_symbol='aS',symbol='aS') -webers = NamedUnit(1, Dimensions(2, -2, 1, -1, 0, 0, 0),name='webers',ascii_symbol='Wb',symbol='Wb') -exawebers = NamedUnit(1e+18, Dimensions(2, -2, 1, -1, 0, 0, 0),name='exawebers',ascii_symbol='EWb',symbol='EWb') -petawebers = NamedUnit(1000000000000000.0, Dimensions(2, -2, 1, -1, 0, 0, 0),name='petawebers',ascii_symbol='PWb',symbol='PWb') -terawebers = NamedUnit(1000000000000.0, Dimensions(2, -2, 1, -1, 0, 0, 0),name='terawebers',ascii_symbol='TWb',symbol='TWb') -gigawebers = NamedUnit(1000000000.0, Dimensions(2, -2, 1, -1, 0, 0, 0),name='gigawebers',ascii_symbol='GWb',symbol='GWb') -megawebers = NamedUnit(1000000.0, Dimensions(2, -2, 1, -1, 0, 0, 0),name='megawebers',ascii_symbol='MWb',symbol='MWb') -kilowebers = NamedUnit(1000.0, Dimensions(2, -2, 1, -1, 0, 0, 0),name='kilowebers',ascii_symbol='kWb',symbol='kWb') -milliwebers = NamedUnit(0.001, Dimensions(2, -2, 1, -1, 0, 0, 0),name='milliwebers',ascii_symbol='mWb',symbol='mWb') -microwebers = NamedUnit(1e-06, Dimensions(2, -2, 1, -1, 0, 0, 0),name='microwebers',ascii_symbol='uWb',latex_symbol=r'{\mu}Wb',symbol='µWb') -nanowebers = NamedUnit(1e-09, Dimensions(2, -2, 1, -1, 0, 0, 0),name='nanowebers',ascii_symbol='nWb',symbol='nWb') -picowebers = NamedUnit(1e-12, Dimensions(2, -2, 1, -1, 0, 0, 0),name='picowebers',ascii_symbol='pWb',symbol='pWb') -femtowebers = NamedUnit(1e-15, Dimensions(2, -2, 1, -1, 0, 0, 0),name='femtowebers',ascii_symbol='fWb',symbol='fWb') -attowebers = NamedUnit(1e-18, Dimensions(2, -2, 1, -1, 0, 0, 0),name='attowebers',ascii_symbol='aWb',symbol='aWb') -tesla = NamedUnit(1, Dimensions(0, -2, 1, -1, 0, 0, 0),name='tesla',ascii_symbol='T',symbol='T') -exatesla = NamedUnit(1e+18, Dimensions(0, -2, 1, -1, 0, 0, 0),name='exatesla',ascii_symbol='ET',symbol='ET') -petatesla = NamedUnit(1000000000000000.0, Dimensions(0, -2, 1, -1, 0, 0, 0),name='petatesla',ascii_symbol='PT',symbol='PT') -teratesla = NamedUnit(1000000000000.0, Dimensions(0, -2, 1, -1, 0, 0, 0),name='teratesla',ascii_symbol='TT',symbol='TT') -gigatesla = NamedUnit(1000000000.0, Dimensions(0, -2, 1, -1, 0, 0, 0),name='gigatesla',ascii_symbol='GT',symbol='GT') -megatesla = NamedUnit(1000000.0, Dimensions(0, -2, 1, -1, 0, 0, 0),name='megatesla',ascii_symbol='MT',symbol='MT') -kilotesla = NamedUnit(1000.0, Dimensions(0, -2, 1, -1, 0, 0, 0),name='kilotesla',ascii_symbol='kT',symbol='kT') -millitesla = NamedUnit(0.001, Dimensions(0, -2, 1, -1, 0, 0, 0),name='millitesla',ascii_symbol='mT',symbol='mT') -microtesla = NamedUnit(1e-06, Dimensions(0, -2, 1, -1, 0, 0, 0),name='microtesla',ascii_symbol='uT',latex_symbol=r'{\mu}T',symbol='µT') -nanotesla = NamedUnit(1e-09, Dimensions(0, -2, 1, -1, 0, 0, 0),name='nanotesla',ascii_symbol='nT',symbol='nT') -picotesla = NamedUnit(1e-12, Dimensions(0, -2, 1, -1, 0, 0, 0),name='picotesla',ascii_symbol='pT',symbol='pT') -femtotesla = NamedUnit(1e-15, Dimensions(0, -2, 1, -1, 0, 0, 0),name='femtotesla',ascii_symbol='fT',symbol='fT') -attotesla = NamedUnit(1e-18, Dimensions(0, -2, 1, -1, 0, 0, 0),name='attotesla',ascii_symbol='aT',symbol='aT') -henry = NamedUnit(1, Dimensions(2, -2, 1, -2, 0, 0, 0),name='henry',ascii_symbol='H',symbol='H') -exahenry = NamedUnit(1e+18, Dimensions(2, -2, 1, -2, 0, 0, 0),name='exahenry',ascii_symbol='EH',symbol='EH') -petahenry = NamedUnit(1000000000000000.0, Dimensions(2, -2, 1, -2, 0, 0, 0),name='petahenry',ascii_symbol='PH',symbol='PH') -terahenry = NamedUnit(1000000000000.0, Dimensions(2, -2, 1, -2, 0, 0, 0),name='terahenry',ascii_symbol='TH',symbol='TH') -gigahenry = NamedUnit(1000000000.0, Dimensions(2, -2, 1, -2, 0, 0, 0),name='gigahenry',ascii_symbol='GH',symbol='GH') -megahenry = NamedUnit(1000000.0, Dimensions(2, -2, 1, -2, 0, 0, 0),name='megahenry',ascii_symbol='MH',symbol='MH') -kilohenry = NamedUnit(1000.0, Dimensions(2, -2, 1, -2, 0, 0, 0),name='kilohenry',ascii_symbol='kH',symbol='kH') -millihenry = NamedUnit(0.001, Dimensions(2, -2, 1, -2, 0, 0, 0),name='millihenry',ascii_symbol='mH',symbol='mH') -microhenry = NamedUnit(1e-06, Dimensions(2, -2, 1, -2, 0, 0, 0),name='microhenry',ascii_symbol='uH',latex_symbol=r'{\mu}H',symbol='µH') -nanohenry = NamedUnit(1e-09, Dimensions(2, -2, 1, -2, 0, 0, 0),name='nanohenry',ascii_symbol='nH',symbol='nH') -picohenry = NamedUnit(1e-12, Dimensions(2, -2, 1, -2, 0, 0, 0),name='picohenry',ascii_symbol='pH',symbol='pH') -femtohenry = NamedUnit(1e-15, Dimensions(2, -2, 1, -2, 0, 0, 0),name='femtohenry',ascii_symbol='fH',symbol='fH') -attohenry = NamedUnit(1e-18, Dimensions(2, -2, 1, -2, 0, 0, 0),name='attohenry',ascii_symbol='aH',symbol='aH') -angstroms = NamedUnit(1e-10, Dimensions(1, 0, 0, 0, 0, 0, 0),name='angstroms',ascii_symbol='Ang',latex_symbol=r'\AA',symbol='Å') -microns = NamedUnit(1e-06, Dimensions(1, 0, 0, 0, 0, 0, 0),name='microns',ascii_symbol='micron',symbol='micron') -minutes = NamedUnit(60, Dimensions(0, 1, 0, 0, 0, 0, 0),name='minutes',ascii_symbol='min',symbol='min') -hours = NamedUnit(3600, Dimensions(0, 1, 0, 0, 0, 0, 0),name='hours',ascii_symbol='h',symbol='h') -days = NamedUnit(86400, Dimensions(0, 1, 0, 0, 0, 0, 0),name='days',ascii_symbol='d',symbol='d') -years = NamedUnit(31556952.0, Dimensions(0, 1, 0, 0, 0, 0, 0),name='years',ascii_symbol='y',symbol='y') -degrees = NamedUnit(57.29577951308232, Dimensions(0, 0, 0, 0, 0, 0, 1),name='degrees',ascii_symbol='deg',symbol='deg') -radians = NamedUnit(1, Dimensions(0, 0, 0, 0, 0, 0, 1),name='radians',ascii_symbol='rad',symbol='rad') -rotations = NamedUnit(6.283185307179586, Dimensions(0, 0, 0, 0, 0, 0, 1),name='rotations',ascii_symbol='rot',symbol='rot') -stradians = NamedUnit(1, Dimensions(0, 0, 0, 0, 0, 0, 2),name='stradians',ascii_symbol='sr',symbol='sr') -litres = NamedUnit(0.001, Dimensions(3, 0, 0, 0, 0, 0, 0),name='litres',ascii_symbol='l',symbol='l') -electronvolts = NamedUnit(1.602176634e-19, Dimensions(2, -2, 1, 0, 0, 0, 0),name='electronvolts',ascii_symbol='eV',symbol='eV') -exaelectronvolts = NamedUnit(0.1602176634, Dimensions(2, -2, 1, 0, 0, 0, 0),name='exaelectronvolts',ascii_symbol='EeV',symbol='EeV') -petaelectronvolts = NamedUnit(0.0001602176634, Dimensions(2, -2, 1, 0, 0, 0, 0),name='petaelectronvolts',ascii_symbol='PeV',symbol='PeV') -teraelectronvolts = NamedUnit(1.602176634e-07, Dimensions(2, -2, 1, 0, 0, 0, 0),name='teraelectronvolts',ascii_symbol='TeV',symbol='TeV') -gigaelectronvolts = NamedUnit(1.6021766339999998e-10, Dimensions(2, -2, 1, 0, 0, 0, 0),name='gigaelectronvolts',ascii_symbol='GeV',symbol='GeV') -megaelectronvolts = NamedUnit(1.6021766339999998e-13, Dimensions(2, -2, 1, 0, 0, 0, 0),name='megaelectronvolts',ascii_symbol='MeV',symbol='MeV') -kiloelectronvolts = NamedUnit(1.602176634e-16, Dimensions(2, -2, 1, 0, 0, 0, 0),name='kiloelectronvolts',ascii_symbol='keV',symbol='keV') -millielectronvolts = NamedUnit(1.6021766339999998e-22, Dimensions(2, -2, 1, 0, 0, 0, 0),name='millielectronvolts',ascii_symbol='meV',symbol='meV') -microelectronvolts = NamedUnit(1.602176634e-25, Dimensions(2, -2, 1, 0, 0, 0, 0),name='microelectronvolts',ascii_symbol='ueV',latex_symbol=r'{\mu}eV',symbol='µeV') -nanoelectronvolts = NamedUnit(1.602176634e-28, Dimensions(2, -2, 1, 0, 0, 0, 0),name='nanoelectronvolts',ascii_symbol='neV',symbol='neV') -picoelectronvolts = NamedUnit(1.6021766339999998e-31, Dimensions(2, -2, 1, 0, 0, 0, 0),name='picoelectronvolts',ascii_symbol='peV',symbol='peV') -femtoelectronvolts = NamedUnit(1.602176634e-34, Dimensions(2, -2, 1, 0, 0, 0, 0),name='femtoelectronvolts',ascii_symbol='feV',symbol='feV') -attoelectronvolts = NamedUnit(1.602176634e-37, Dimensions(2, -2, 1, 0, 0, 0, 0),name='attoelectronvolts',ascii_symbol='aeV',symbol='aeV') -atomic_mass_units = NamedUnit(1.660538921e-27, Dimensions(0, 0, 1, 0, 0, 0, 0),name='atomic_mass_units',ascii_symbol='au',symbol='au') -moles = NamedUnit(6.02214076e+23, Dimensions(0, 0, 0, 0, 0, 1, 0),name='moles',ascii_symbol='mol',symbol='mol') -millimoles = NamedUnit(6.02214076e+20, Dimensions(0, 0, 0, 0, 0, 1, 0),name='millimoles',ascii_symbol='mmol',symbol='mmol') -micromoles = NamedUnit(6.02214076e+17, Dimensions(0, 0, 0, 0, 0, 1, 0),name='micromoles',ascii_symbol='umol',latex_symbol=r'{\mu}mol',symbol='µmol') -nanomoles = NamedUnit(602214076000000.0, Dimensions(0, 0, 0, 0, 0, 1, 0),name='nanomoles',ascii_symbol='nmol',symbol='nmol') -picomoles = NamedUnit(602214076000.0, Dimensions(0, 0, 0, 0, 0, 1, 0),name='picomoles',ascii_symbol='pmol',symbol='pmol') -femtomoles = NamedUnit(602214076.0, Dimensions(0, 0, 0, 0, 0, 1, 0),name='femtomoles',ascii_symbol='fmol',symbol='fmol') -attomoles = NamedUnit(602214.076, Dimensions(0, 0, 0, 0, 0, 1, 0),name='attomoles',ascii_symbol='amol',symbol='amol') -kg_force = NamedUnit(9.80665, Dimensions(1, -2, 1, 0, 0, 0, 0),name='kg_force',ascii_symbol='kgForce',symbol='kgForce') -degrees_celsius = NamedUnit(1, Dimensions(0, 0, 0, 0, 1, 0, 0),name='degrees_celsius',ascii_symbol='C',symbol='C') -miles = NamedUnit(1609.344, Dimensions(1, 0, 0, 0, 0, 0, 0),name='miles',ascii_symbol='miles',symbol='miles') -yards = NamedUnit(0.9144000000000001, Dimensions(1, 0, 0, 0, 0, 0, 0),name='yards',ascii_symbol='yrd',symbol='yrd') -feet = NamedUnit(0.3048, Dimensions(1, 0, 0, 0, 0, 0, 0),name='feet',ascii_symbol='ft',symbol='ft') -inches = NamedUnit(0.0254, Dimensions(1, 0, 0, 0, 0, 0, 0),name='inches',ascii_symbol='in',symbol='in') -pounds = NamedUnit(0.45359237, Dimensions(0, 0, 1, 0, 0, 0, 0),name='pounds',ascii_symbol='lb',symbol='lb') -pounds_force = NamedUnit(4.448222, Dimensions(1, -2, 1, 0, 0, 0, 0),name='pounds_force',ascii_symbol='lbf',symbol='lbf') -ounces = NamedUnit(0.028349523125, Dimensions(0, 0, 1, 0, 0, 0, 0),name='ounces',ascii_symbol='oz',symbol='oz') -pounds_force_per_square_inch = NamedUnit(6894.757889515779, Dimensions(-1, -2, 1, 0, 0, 0, 0),name='pounds_force_per_square_inch',ascii_symbol='psi',symbol='psi') -none = NamedUnit(1, Dimensions(0, 0, 0, 0, 0, 0, 0),name='none',ascii_symbol='none',symbol='none') -percent = NamedUnit(0.01, Dimensions(0, 0, 0, 0, 0, 0, 0),name='percent',ascii_symbol='percent',latex_symbol=r'\%',symbol='%') -square_meters = NamedUnit(1, Dimensions(length=2), name='square_meters', ascii_symbol='m^2', symbol='m²') -cubic_meters = NamedUnit(1, Dimensions(length=3), name='cubic_meters', ascii_symbol='m^3', symbol='m³') -per_meter = NamedUnit(1.0, Dimensions(length=-1), name='per_meter', ascii_symbol='m^-1', symbol='m⁻¹') -per_square_meter = NamedUnit(1.0, Dimensions(length=-2), name='per_square_meter', ascii_symbol='m^-2', symbol='m⁻²') -per_cubic_meter = NamedUnit(1.0, Dimensions(length=-3), name='per_cubic_meter', ascii_symbol='m^-3', symbol='m⁻³') -square_exameters = NamedUnit(1e+36, Dimensions(length=2), name='square_exameters', ascii_symbol='Em^2', symbol='Em²') -cubic_exameters = NamedUnit(1e+54, Dimensions(length=3), name='cubic_exameters', ascii_symbol='Em^3', symbol='Em³') -per_exameter = NamedUnit(1e-18, Dimensions(length=-1), name='per_exameter', ascii_symbol='Em^-1', symbol='Em⁻¹') -per_square_exameter = NamedUnit(1e-36, Dimensions(length=-2), name='per_square_exameter', ascii_symbol='Em^-2', symbol='Em⁻²') -per_cubic_exameter = NamedUnit(1e-54, Dimensions(length=-3), name='per_cubic_exameter', ascii_symbol='Em^-3', symbol='Em⁻³') -square_petameters = NamedUnit(1e+30, Dimensions(length=2), name='square_petameters', ascii_symbol='Pm^2', symbol='Pm²') -cubic_petameters = NamedUnit(1e+45, Dimensions(length=3), name='cubic_petameters', ascii_symbol='Pm^3', symbol='Pm³') -per_petameter = NamedUnit(1e-15, Dimensions(length=-1), name='per_petameter', ascii_symbol='Pm^-1', symbol='Pm⁻¹') -per_square_petameter = NamedUnit(1e-30, Dimensions(length=-2), name='per_square_petameter', ascii_symbol='Pm^-2', symbol='Pm⁻²') -per_cubic_petameter = NamedUnit(1e-45, Dimensions(length=-3), name='per_cubic_petameter', ascii_symbol='Pm^-3', symbol='Pm⁻³') -square_terameters = NamedUnit(1e+24, Dimensions(length=2), name='square_terameters', ascii_symbol='Tm^2', symbol='Tm²') -cubic_terameters = NamedUnit(1e+36, Dimensions(length=3), name='cubic_terameters', ascii_symbol='Tm^3', symbol='Tm³') -per_terameter = NamedUnit(1e-12, Dimensions(length=-1), name='per_terameter', ascii_symbol='Tm^-1', symbol='Tm⁻¹') -per_square_terameter = NamedUnit(1e-24, Dimensions(length=-2), name='per_square_terameter', ascii_symbol='Tm^-2', symbol='Tm⁻²') -per_cubic_terameter = NamedUnit(1e-36, Dimensions(length=-3), name='per_cubic_terameter', ascii_symbol='Tm^-3', symbol='Tm⁻³') -square_gigameters = NamedUnit(1e+18, Dimensions(length=2), name='square_gigameters', ascii_symbol='Gm^2', symbol='Gm²') -cubic_gigameters = NamedUnit(1e+27, Dimensions(length=3), name='cubic_gigameters', ascii_symbol='Gm^3', symbol='Gm³') -per_gigameter = NamedUnit(1e-09, Dimensions(length=-1), name='per_gigameter', ascii_symbol='Gm^-1', symbol='Gm⁻¹') -per_square_gigameter = NamedUnit(1e-18, Dimensions(length=-2), name='per_square_gigameter', ascii_symbol='Gm^-2', symbol='Gm⁻²') -per_cubic_gigameter = NamedUnit(1e-27, Dimensions(length=-3), name='per_cubic_gigameter', ascii_symbol='Gm^-3', symbol='Gm⁻³') -square_megameters = NamedUnit(1000000000000.0, Dimensions(length=2), name='square_megameters', ascii_symbol='Mm^2', symbol='Mm²') -cubic_megameters = NamedUnit(1e+18, Dimensions(length=3), name='cubic_megameters', ascii_symbol='Mm^3', symbol='Mm³') -per_megameter = NamedUnit(1e-06, Dimensions(length=-1), name='per_megameter', ascii_symbol='Mm^-1', symbol='Mm⁻¹') -per_square_megameter = NamedUnit(1e-12, Dimensions(length=-2), name='per_square_megameter', ascii_symbol='Mm^-2', symbol='Mm⁻²') -per_cubic_megameter = NamedUnit(1e-18, Dimensions(length=-3), name='per_cubic_megameter', ascii_symbol='Mm^-3', symbol='Mm⁻³') -square_kilometers = NamedUnit(1000000.0, Dimensions(length=2), name='square_kilometers', ascii_symbol='km^2', symbol='km²') -cubic_kilometers = NamedUnit(1000000000.0, Dimensions(length=3), name='cubic_kilometers', ascii_symbol='km^3', symbol='km³') -per_kilometer = NamedUnit(0.001, Dimensions(length=-1), name='per_kilometer', ascii_symbol='km^-1', symbol='km⁻¹') -per_square_kilometer = NamedUnit(1e-06, Dimensions(length=-2), name='per_square_kilometer', ascii_symbol='km^-2', symbol='km⁻²') -per_cubic_kilometer = NamedUnit(1e-09, Dimensions(length=-3), name='per_cubic_kilometer', ascii_symbol='km^-3', symbol='km⁻³') -square_millimeters = NamedUnit(1e-06, Dimensions(length=2), name='square_millimeters', ascii_symbol='mm^2', symbol='mm²') -cubic_millimeters = NamedUnit(1e-09, Dimensions(length=3), name='cubic_millimeters', ascii_symbol='mm^3', symbol='mm³') -per_millimeter = NamedUnit(1000.0, Dimensions(length=-1), name='per_millimeter', ascii_symbol='mm^-1', symbol='mm⁻¹') -per_square_millimeter = NamedUnit(1000000.0, Dimensions(length=-2), name='per_square_millimeter', ascii_symbol='mm^-2', symbol='mm⁻²') -per_cubic_millimeter = NamedUnit(999999999.9999999, Dimensions(length=-3), name='per_cubic_millimeter', ascii_symbol='mm^-3', symbol='mm⁻³') -square_micrometers = NamedUnit(1e-12, Dimensions(length=2), name='square_micrometers', ascii_symbol='um^2', symbol='µm²') -cubic_micrometers = NamedUnit(9.999999999999999e-19, Dimensions(length=3), name='cubic_micrometers', ascii_symbol='um^3', symbol='µm³') -per_micrometer = NamedUnit(1000000.0, Dimensions(length=-1), name='per_micrometer', ascii_symbol='um^-1', symbol='µm⁻¹') -per_square_micrometer = NamedUnit(1000000000000.0001, Dimensions(length=-2), name='per_square_micrometer', ascii_symbol='um^-2', symbol='µm⁻²') -per_cubic_micrometer = NamedUnit(1.0000000000000001e+18, Dimensions(length=-3), name='per_cubic_micrometer', ascii_symbol='um^-3', symbol='µm⁻³') -square_nanometers = NamedUnit(1e-18, Dimensions(length=2), name='square_nanometers', ascii_symbol='nm^2', symbol='nm²') -cubic_nanometers = NamedUnit(1.0000000000000002e-27, Dimensions(length=3), name='cubic_nanometers', ascii_symbol='nm^3', symbol='nm³') -per_nanometer = NamedUnit(999999999.9999999, Dimensions(length=-1), name='per_nanometer', ascii_symbol='nm^-1', symbol='nm⁻¹') -per_square_nanometer = NamedUnit(9.999999999999999e+17, Dimensions(length=-2), name='per_square_nanometer', ascii_symbol='nm^-2', symbol='nm⁻²') -per_cubic_nanometer = NamedUnit(9.999999999999999e+26, Dimensions(length=-3), name='per_cubic_nanometer', ascii_symbol='nm^-3', symbol='nm⁻³') -square_picometers = NamedUnit(1e-24, Dimensions(length=2), name='square_picometers', ascii_symbol='pm^2', symbol='pm²') -cubic_picometers = NamedUnit(1e-36, Dimensions(length=3), name='cubic_picometers', ascii_symbol='pm^3', symbol='pm³') -per_picometer = NamedUnit(1000000000000.0, Dimensions(length=-1), name='per_picometer', ascii_symbol='pm^-1', symbol='pm⁻¹') -per_square_picometer = NamedUnit(1e+24, Dimensions(length=-2), name='per_square_picometer', ascii_symbol='pm^-2', symbol='pm⁻²') -per_cubic_picometer = NamedUnit(1e+36, Dimensions(length=-3), name='per_cubic_picometer', ascii_symbol='pm^-3', symbol='pm⁻³') -square_femtometers = NamedUnit(1e-30, Dimensions(length=2), name='square_femtometers', ascii_symbol='fm^2', symbol='fm²') -cubic_femtometers = NamedUnit(1.0000000000000003e-45, Dimensions(length=3), name='cubic_femtometers', ascii_symbol='fm^3', symbol='fm³') -per_femtometer = NamedUnit(999999999999999.9, Dimensions(length=-1), name='per_femtometer', ascii_symbol='fm^-1', symbol='fm⁻¹') -per_square_femtometer = NamedUnit(9.999999999999999e+29, Dimensions(length=-2), name='per_square_femtometer', ascii_symbol='fm^-2', symbol='fm⁻²') -per_cubic_femtometer = NamedUnit(9.999999999999998e+44, Dimensions(length=-3), name='per_cubic_femtometer', ascii_symbol='fm^-3', symbol='fm⁻³') -square_attometers = NamedUnit(1.0000000000000001e-36, Dimensions(length=2), name='square_attometers', ascii_symbol='am^2', symbol='am²') -cubic_attometers = NamedUnit(1.0000000000000002e-54, Dimensions(length=3), name='cubic_attometers', ascii_symbol='am^3', symbol='am³') -per_attometer = NamedUnit(9.999999999999999e+17, Dimensions(length=-1), name='per_attometer', ascii_symbol='am^-1', symbol='am⁻¹') -per_square_attometer = NamedUnit(9.999999999999999e+35, Dimensions(length=-2), name='per_square_attometer', ascii_symbol='am^-2', symbol='am⁻²') -per_cubic_attometer = NamedUnit(9.999999999999997e+53, Dimensions(length=-3), name='per_cubic_attometer', ascii_symbol='am^-3', symbol='am⁻³') -square_decimeters = NamedUnit(0.010000000000000002, Dimensions(length=2), name='square_decimeters', ascii_symbol='dm^2', symbol='dm²') -cubic_decimeters = NamedUnit(0.0010000000000000002, Dimensions(length=3), name='cubic_decimeters', ascii_symbol='dm^3', symbol='dm³') -per_decimeter = NamedUnit(10.0, Dimensions(length=-1), name='per_decimeter', ascii_symbol='dm^-1', symbol='dm⁻¹') -per_square_decimeter = NamedUnit(99.99999999999999, Dimensions(length=-2), name='per_square_decimeter', ascii_symbol='dm^-2', symbol='dm⁻²') -per_cubic_decimeter = NamedUnit(999.9999999999999, Dimensions(length=-3), name='per_cubic_decimeter', ascii_symbol='dm^-3', symbol='dm⁻³') -square_centimeters = NamedUnit(0.0001, Dimensions(length=2), name='square_centimeters', ascii_symbol='cm^2', symbol='cm²') -cubic_centimeters = NamedUnit(1.0000000000000002e-06, Dimensions(length=3), name='cubic_centimeters', ascii_symbol='cm^3', symbol='cm³') -per_centimeter = NamedUnit(100.0, Dimensions(length=-1), name='per_centimeter', ascii_symbol='cm^-1', symbol='cm⁻¹') -per_square_centimeter = NamedUnit(10000.0, Dimensions(length=-2), name='per_square_centimeter', ascii_symbol='cm^-2', symbol='cm⁻²') -per_cubic_centimeter = NamedUnit(999999.9999999999, Dimensions(length=-3), name='per_cubic_centimeter', ascii_symbol='cm^-3', symbol='cm⁻³') -square_angstroms = NamedUnit(1.0000000000000001e-20, Dimensions(length=2), name='square_angstroms', ascii_symbol='Ang^2', symbol='Ų') -cubic_angstroms = NamedUnit(1e-30, Dimensions(length=3), name='cubic_angstroms', ascii_symbol='Ang^3', symbol='ų') -per_angstrom = NamedUnit(10000000000.0, Dimensions(length=-1), name='per_angstrom', ascii_symbol='Ang^-1', symbol='Å⁻¹') -per_square_angstrom = NamedUnit(1e+20, Dimensions(length=-2), name='per_square_angstrom', ascii_symbol='Ang^-2', symbol='Å⁻²') -per_cubic_angstrom = NamedUnit(9.999999999999999e+29, Dimensions(length=-3), name='per_cubic_angstrom', ascii_symbol='Ang^-3', symbol='Å⁻³') -square_microns = NamedUnit(1e-12, Dimensions(length=2), name='square_microns', ascii_symbol='micron^2', symbol='micron²') -cubic_microns = NamedUnit(9.999999999999999e-19, Dimensions(length=3), name='cubic_microns', ascii_symbol='micron^3', symbol='micron³') -per_micron = NamedUnit(1000000.0, Dimensions(length=-1), name='per_micron', ascii_symbol='micron^-1', symbol='micron⁻¹') -per_square_micron = NamedUnit(1000000000000.0001, Dimensions(length=-2), name='per_square_micron', ascii_symbol='micron^-2', symbol='micron⁻²') -per_cubic_micron = NamedUnit(1.0000000000000001e+18, Dimensions(length=-3), name='per_cubic_micron', ascii_symbol='micron^-3', symbol='micron⁻³') -square_miles = NamedUnit(2589988.110336, Dimensions(length=2), name='square_miles', ascii_symbol='miles^2', symbol='miles²') -cubic_miles = NamedUnit(4168181825.44058, Dimensions(length=3), name='cubic_miles', ascii_symbol='miles^3', symbol='miles³') -per_mile = NamedUnit(0.0006213711922373339, Dimensions(length=-1), name='per_mile', ascii_symbol='miles^-1', symbol='miles⁻¹') -per_square_mile = NamedUnit(3.861021585424458e-07, Dimensions(length=-2), name='per_square_mile', ascii_symbol='miles^-2', symbol='miles⁻²') -per_cubic_mile = NamedUnit(2.399127585789277e-10, Dimensions(length=-3), name='per_cubic_mile', ascii_symbol='miles^-3', symbol='miles⁻³') -square_yards = NamedUnit(0.8361273600000002, Dimensions(length=2), name='square_yards', ascii_symbol='yrd^2', symbol='yrd²') -cubic_yards = NamedUnit(0.7645548579840002, Dimensions(length=3), name='cubic_yards', ascii_symbol='yrd^3', symbol='yrd³') -per_yard = NamedUnit(1.0936132983377076, Dimensions(length=-1), name='per_yard', ascii_symbol='yrd^-1', symbol='yrd⁻¹') -per_square_yard = NamedUnit(1.19599004630108, Dimensions(length=-2), name='per_square_yard', ascii_symbol='yrd^-2', symbol='yrd⁻²') -per_cubic_yard = NamedUnit(1.3079506193143917, Dimensions(length=-3), name='per_cubic_yard', ascii_symbol='yrd^-3', symbol='yrd⁻³') -square_feet = NamedUnit(0.09290304, Dimensions(length=2), name='square_feet', ascii_symbol='ft^2', symbol='ft²') -cubic_feet = NamedUnit(0.028316846592000004, Dimensions(length=3), name='cubic_feet', ascii_symbol='ft^3', symbol='ft³') -per_foot = NamedUnit(3.280839895013123, Dimensions(length=-1), name='per_foot', ascii_symbol='ft^-1', symbol='ft⁻¹') -per_square_foot = NamedUnit(10.763910416709722, Dimensions(length=-2), name='per_square_foot', ascii_symbol='ft^-2', symbol='ft⁻²') -per_cubic_foot = NamedUnit(35.314666721488585, Dimensions(length=-3), name='per_cubic_foot', ascii_symbol='ft^-3', symbol='ft⁻³') -square_inches = NamedUnit(0.00064516, Dimensions(length=2), name='square_inches', ascii_symbol='in^2', symbol='in²') -cubic_inches = NamedUnit(1.6387064e-05, Dimensions(length=3), name='cubic_inches', ascii_symbol='in^3', symbol='in³') -per_inch = NamedUnit(39.37007874015748, Dimensions(length=-1), name='per_inch', ascii_symbol='in^-1', symbol='in⁻¹') -per_square_inch = NamedUnit(1550.0031000062002, Dimensions(length=-2), name='per_square_inch', ascii_symbol='in^-2', symbol='in⁻²') -per_cubic_inch = NamedUnit(61023.74409473229, Dimensions(length=-3), name='per_cubic_inch', ascii_symbol='in^-3', symbol='in⁻³') -meters_per_second = NamedUnit(1.0, Dimensions(length=1, time=-1), name='meters_per_second', ascii_symbol='m/s', symbol='ms⁻¹') -meters_per_square_second = NamedUnit(1.0, Dimensions(length=1, time=-2), name='meters_per_square_second', ascii_symbol='m/s^2', symbol='ms⁻²') -meters_per_millisecond = NamedUnit(1000.0, Dimensions(length=1, time=-1), name='meters_per_millisecond', ascii_symbol='m/ms', symbol='mms⁻¹') -meters_per_square_millisecond = NamedUnit(1000000.0, Dimensions(length=1, time=-2), name='meters_per_square_millisecond', ascii_symbol='m/ms^2', symbol='mms⁻²') -meters_per_microsecond = NamedUnit(1000000.0, Dimensions(length=1, time=-1), name='meters_per_microsecond', ascii_symbol='m/us', symbol='mµs⁻¹') -meters_per_square_microsecond = NamedUnit(1000000000000.0, Dimensions(length=1, time=-2), name='meters_per_square_microsecond', ascii_symbol='m/us^2', symbol='mµs⁻²') -meters_per_nanosecond = NamedUnit(999999999.9999999, Dimensions(length=1, time=-1), name='meters_per_nanosecond', ascii_symbol='m/ns', symbol='mns⁻¹') -meters_per_square_nanosecond = NamedUnit(9.999999999999999e+17, Dimensions(length=1, time=-2), name='meters_per_square_nanosecond', ascii_symbol='m/ns^2', symbol='mns⁻²') -meters_per_picosecond = NamedUnit(1000000000000.0, Dimensions(length=1, time=-1), name='meters_per_picosecond', ascii_symbol='m/ps', symbol='mps⁻¹') -meters_per_square_picosecond = NamedUnit(1.0000000000000001e+24, Dimensions(length=1, time=-2), name='meters_per_square_picosecond', ascii_symbol='m/ps^2', symbol='mps⁻²') -meters_per_femtosecond = NamedUnit(999999999999999.9, Dimensions(length=1, time=-1), name='meters_per_femtosecond', ascii_symbol='m/fs', symbol='mfs⁻¹') -meters_per_square_femtosecond = NamedUnit(9.999999999999999e+29, Dimensions(length=1, time=-2), name='meters_per_square_femtosecond', ascii_symbol='m/fs^2', symbol='mfs⁻²') -meters_per_attosecond = NamedUnit(9.999999999999999e+17, Dimensions(length=1, time=-1), name='meters_per_attosecond', ascii_symbol='m/as', symbol='mas⁻¹') -meters_per_square_attosecond = NamedUnit(9.999999999999999e+35, Dimensions(length=1, time=-2), name='meters_per_square_attosecond', ascii_symbol='m/as^2', symbol='mas⁻²') -meters_per_minute = NamedUnit(0.016666666666666666, Dimensions(length=1, time=-1), name='meters_per_minute', ascii_symbol='m/min', symbol='mmin⁻¹') -meters_per_square_minute = NamedUnit(0.0002777777777777778, Dimensions(length=1, time=-2), name='meters_per_square_minute', ascii_symbol='m/min^2', symbol='mmin⁻²') -meters_per_hour = NamedUnit(0.0002777777777777778, Dimensions(length=1, time=-1), name='meters_per_hour', ascii_symbol='m/h', symbol='mh⁻¹') -meters_per_square_hour = NamedUnit(7.71604938271605e-08, Dimensions(length=1, time=-2), name='meters_per_square_hour', ascii_symbol='m/h^2', symbol='mh⁻²') -meters_per_day = NamedUnit(1.1574074074074073e-05, Dimensions(length=1, time=-1), name='meters_per_day', ascii_symbol='m/d', symbol='md⁻¹') -meters_per_square_day = NamedUnit(1.3395919067215363e-10, Dimensions(length=1, time=-2), name='meters_per_square_day', ascii_symbol='m/d^2', symbol='md⁻²') -meters_per_year = NamedUnit(3.168873850681143e-08, Dimensions(length=1, time=-1), name='meters_per_year', ascii_symbol='m/y', symbol='my⁻¹') -meters_per_square_year = NamedUnit(1.0041761481530735e-15, Dimensions(length=1, time=-2), name='meters_per_square_year', ascii_symbol='m/y^2', symbol='my⁻²') -exameters_per_second = NamedUnit(1e+18, Dimensions(length=1, time=-1), name='exameters_per_second', ascii_symbol='Em/s', symbol='Ems⁻¹') -exameters_per_square_second = NamedUnit(1e+18, Dimensions(length=1, time=-2), name='exameters_per_square_second', ascii_symbol='Em/s^2', symbol='Ems⁻²') -exameters_per_millisecond = NamedUnit(1e+21, Dimensions(length=1, time=-1), name='exameters_per_millisecond', ascii_symbol='Em/ms', symbol='Emms⁻¹') -exameters_per_square_millisecond = NamedUnit(1e+24, Dimensions(length=1, time=-2), name='exameters_per_square_millisecond', ascii_symbol='Em/ms^2', symbol='Emms⁻²') -exameters_per_microsecond = NamedUnit(1e+24, Dimensions(length=1, time=-1), name='exameters_per_microsecond', ascii_symbol='Em/us', symbol='Emµs⁻¹') -exameters_per_square_microsecond = NamedUnit(1e+30, Dimensions(length=1, time=-2), name='exameters_per_square_microsecond', ascii_symbol='Em/us^2', symbol='Emµs⁻²') -exameters_per_nanosecond = NamedUnit(9.999999999999999e+26, Dimensions(length=1, time=-1), name='exameters_per_nanosecond', ascii_symbol='Em/ns', symbol='Emns⁻¹') -exameters_per_square_nanosecond = NamedUnit(9.999999999999999e+35, Dimensions(length=1, time=-2), name='exameters_per_square_nanosecond', ascii_symbol='Em/ns^2', symbol='Emns⁻²') -exameters_per_picosecond = NamedUnit(1e+30, Dimensions(length=1, time=-1), name='exameters_per_picosecond', ascii_symbol='Em/ps', symbol='Emps⁻¹') -exameters_per_square_picosecond = NamedUnit(1e+42, Dimensions(length=1, time=-2), name='exameters_per_square_picosecond', ascii_symbol='Em/ps^2', symbol='Emps⁻²') -exameters_per_femtosecond = NamedUnit(1e+33, Dimensions(length=1, time=-1), name='exameters_per_femtosecond', ascii_symbol='Em/fs', symbol='Emfs⁻¹') -exameters_per_square_femtosecond = NamedUnit(9.999999999999999e+47, Dimensions(length=1, time=-2), name='exameters_per_square_femtosecond', ascii_symbol='Em/fs^2', symbol='Emfs⁻²') -exameters_per_attosecond = NamedUnit(9.999999999999999e+35, Dimensions(length=1, time=-1), name='exameters_per_attosecond', ascii_symbol='Em/as', symbol='Emas⁻¹') -exameters_per_square_attosecond = NamedUnit(9.999999999999999e+53, Dimensions(length=1, time=-2), name='exameters_per_square_attosecond', ascii_symbol='Em/as^2', symbol='Emas⁻²') -exameters_per_minute = NamedUnit(1.6666666666666666e+16, Dimensions(length=1, time=-1), name='exameters_per_minute', ascii_symbol='Em/min', symbol='Emmin⁻¹') -exameters_per_square_minute = NamedUnit(277777777777777.78, Dimensions(length=1, time=-2), name='exameters_per_square_minute', ascii_symbol='Em/min^2', symbol='Emmin⁻²') -exameters_per_hour = NamedUnit(277777777777777.78, Dimensions(length=1, time=-1), name='exameters_per_hour', ascii_symbol='Em/h', symbol='Emh⁻¹') -exameters_per_square_hour = NamedUnit(77160493827.16049, Dimensions(length=1, time=-2), name='exameters_per_square_hour', ascii_symbol='Em/h^2', symbol='Emh⁻²') -exameters_per_day = NamedUnit(11574074074074.074, Dimensions(length=1, time=-1), name='exameters_per_day', ascii_symbol='Em/d', symbol='Emd⁻¹') -exameters_per_square_day = NamedUnit(133959190.67215364, Dimensions(length=1, time=-2), name='exameters_per_square_day', ascii_symbol='Em/d^2', symbol='Emd⁻²') -exameters_per_year = NamedUnit(31688738506.81143, Dimensions(length=1, time=-1), name='exameters_per_year', ascii_symbol='Em/y', symbol='Emy⁻¹') -exameters_per_square_year = NamedUnit(1004.1761481530735, Dimensions(length=1, time=-2), name='exameters_per_square_year', ascii_symbol='Em/y^2', symbol='Emy⁻²') -petameters_per_second = NamedUnit(1000000000000000.0, Dimensions(length=1, time=-1), name='petameters_per_second', ascii_symbol='Pm/s', symbol='Pms⁻¹') -petameters_per_square_second = NamedUnit(1000000000000000.0, Dimensions(length=1, time=-2), name='petameters_per_square_second', ascii_symbol='Pm/s^2', symbol='Pms⁻²') -petameters_per_millisecond = NamedUnit(1e+18, Dimensions(length=1, time=-1), name='petameters_per_millisecond', ascii_symbol='Pm/ms', symbol='Pmms⁻¹') -petameters_per_square_millisecond = NamedUnit(1e+21, Dimensions(length=1, time=-2), name='petameters_per_square_millisecond', ascii_symbol='Pm/ms^2', symbol='Pmms⁻²') -petameters_per_microsecond = NamedUnit(1e+21, Dimensions(length=1, time=-1), name='petameters_per_microsecond', ascii_symbol='Pm/us', symbol='Pmµs⁻¹') -petameters_per_square_microsecond = NamedUnit(1e+27, Dimensions(length=1, time=-2), name='petameters_per_square_microsecond', ascii_symbol='Pm/us^2', symbol='Pmµs⁻²') -petameters_per_nanosecond = NamedUnit(1e+24, Dimensions(length=1, time=-1), name='petameters_per_nanosecond', ascii_symbol='Pm/ns', symbol='Pmns⁻¹') -petameters_per_square_nanosecond = NamedUnit(1e+33, Dimensions(length=1, time=-2), name='petameters_per_square_nanosecond', ascii_symbol='Pm/ns^2', symbol='Pmns⁻²') -petameters_per_picosecond = NamedUnit(1e+27, Dimensions(length=1, time=-1), name='petameters_per_picosecond', ascii_symbol='Pm/ps', symbol='Pmps⁻¹') -petameters_per_square_picosecond = NamedUnit(1.0000000000000001e+39, Dimensions(length=1, time=-2), name='petameters_per_square_picosecond', ascii_symbol='Pm/ps^2', symbol='Pmps⁻²') -petameters_per_femtosecond = NamedUnit(9.999999999999999e+29, Dimensions(length=1, time=-1), name='petameters_per_femtosecond', ascii_symbol='Pm/fs', symbol='Pmfs⁻¹') -petameters_per_square_femtosecond = NamedUnit(1e+45, Dimensions(length=1, time=-2), name='petameters_per_square_femtosecond', ascii_symbol='Pm/fs^2', symbol='Pmfs⁻²') -petameters_per_attosecond = NamedUnit(1e+33, Dimensions(length=1, time=-1), name='petameters_per_attosecond', ascii_symbol='Pm/as', symbol='Pmas⁻¹') -petameters_per_square_attosecond = NamedUnit(9.999999999999998e+50, Dimensions(length=1, time=-2), name='petameters_per_square_attosecond', ascii_symbol='Pm/as^2', symbol='Pmas⁻²') -petameters_per_minute = NamedUnit(16666666666666.666, Dimensions(length=1, time=-1), name='petameters_per_minute', ascii_symbol='Pm/min', symbol='Pmmin⁻¹') -petameters_per_square_minute = NamedUnit(277777777777.7778, Dimensions(length=1, time=-2), name='petameters_per_square_minute', ascii_symbol='Pm/min^2', symbol='Pmmin⁻²') -petameters_per_hour = NamedUnit(277777777777.7778, Dimensions(length=1, time=-1), name='petameters_per_hour', ascii_symbol='Pm/h', symbol='Pmh⁻¹') -petameters_per_square_hour = NamedUnit(77160493.82716049, Dimensions(length=1, time=-2), name='petameters_per_square_hour', ascii_symbol='Pm/h^2', symbol='Pmh⁻²') -petameters_per_day = NamedUnit(11574074074.074074, Dimensions(length=1, time=-1), name='petameters_per_day', ascii_symbol='Pm/d', symbol='Pmd⁻¹') -petameters_per_square_day = NamedUnit(133959.19067215364, Dimensions(length=1, time=-2), name='petameters_per_square_day', ascii_symbol='Pm/d^2', symbol='Pmd⁻²') -petameters_per_year = NamedUnit(31688738.506811433, Dimensions(length=1, time=-1), name='petameters_per_year', ascii_symbol='Pm/y', symbol='Pmy⁻¹') -petameters_per_square_year = NamedUnit(1.0041761481530735, Dimensions(length=1, time=-2), name='petameters_per_square_year', ascii_symbol='Pm/y^2', symbol='Pmy⁻²') -terameters_per_second = NamedUnit(1000000000000.0, Dimensions(length=1, time=-1), name='terameters_per_second', ascii_symbol='Tm/s', symbol='Tms⁻¹') -terameters_per_square_second = NamedUnit(1000000000000.0, Dimensions(length=1, time=-2), name='terameters_per_square_second', ascii_symbol='Tm/s^2', symbol='Tms⁻²') -terameters_per_millisecond = NamedUnit(1000000000000000.0, Dimensions(length=1, time=-1), name='terameters_per_millisecond', ascii_symbol='Tm/ms', symbol='Tmms⁻¹') -terameters_per_square_millisecond = NamedUnit(1e+18, Dimensions(length=1, time=-2), name='terameters_per_square_millisecond', ascii_symbol='Tm/ms^2', symbol='Tmms⁻²') -terameters_per_microsecond = NamedUnit(1e+18, Dimensions(length=1, time=-1), name='terameters_per_microsecond', ascii_symbol='Tm/us', symbol='Tmµs⁻¹') -terameters_per_square_microsecond = NamedUnit(1e+24, Dimensions(length=1, time=-2), name='terameters_per_square_microsecond', ascii_symbol='Tm/us^2', symbol='Tmµs⁻²') -terameters_per_nanosecond = NamedUnit(1e+21, Dimensions(length=1, time=-1), name='terameters_per_nanosecond', ascii_symbol='Tm/ns', symbol='Tmns⁻¹') -terameters_per_square_nanosecond = NamedUnit(9.999999999999999e+29, Dimensions(length=1, time=-2), name='terameters_per_square_nanosecond', ascii_symbol='Tm/ns^2', symbol='Tmns⁻²') -terameters_per_picosecond = NamedUnit(1e+24, Dimensions(length=1, time=-1), name='terameters_per_picosecond', ascii_symbol='Tm/ps', symbol='Tmps⁻¹') -terameters_per_square_picosecond = NamedUnit(1e+36, Dimensions(length=1, time=-2), name='terameters_per_square_picosecond', ascii_symbol='Tm/ps^2', symbol='Tmps⁻²') -terameters_per_femtosecond = NamedUnit(9.999999999999999e+26, Dimensions(length=1, time=-1), name='terameters_per_femtosecond', ascii_symbol='Tm/fs', symbol='Tmfs⁻¹') -terameters_per_square_femtosecond = NamedUnit(9.999999999999999e+41, Dimensions(length=1, time=-2), name='terameters_per_square_femtosecond', ascii_symbol='Tm/fs^2', symbol='Tmfs⁻²') -terameters_per_attosecond = NamedUnit(9.999999999999999e+29, Dimensions(length=1, time=-1), name='terameters_per_attosecond', ascii_symbol='Tm/as', symbol='Tmas⁻¹') -terameters_per_square_attosecond = NamedUnit(9.999999999999999e+47, Dimensions(length=1, time=-2), name='terameters_per_square_attosecond', ascii_symbol='Tm/as^2', symbol='Tmas⁻²') -terameters_per_minute = NamedUnit(16666666666.666666, Dimensions(length=1, time=-1), name='terameters_per_minute', ascii_symbol='Tm/min', symbol='Tmmin⁻¹') -terameters_per_square_minute = NamedUnit(277777777.7777778, Dimensions(length=1, time=-2), name='terameters_per_square_minute', ascii_symbol='Tm/min^2', symbol='Tmmin⁻²') -terameters_per_hour = NamedUnit(277777777.7777778, Dimensions(length=1, time=-1), name='terameters_per_hour', ascii_symbol='Tm/h', symbol='Tmh⁻¹') -terameters_per_square_hour = NamedUnit(77160.49382716049, Dimensions(length=1, time=-2), name='terameters_per_square_hour', ascii_symbol='Tm/h^2', symbol='Tmh⁻²') -terameters_per_day = NamedUnit(11574074.074074075, Dimensions(length=1, time=-1), name='terameters_per_day', ascii_symbol='Tm/d', symbol='Tmd⁻¹') -terameters_per_square_day = NamedUnit(133.95919067215362, Dimensions(length=1, time=-2), name='terameters_per_square_day', ascii_symbol='Tm/d^2', symbol='Tmd⁻²') -terameters_per_year = NamedUnit(31688.73850681143, Dimensions(length=1, time=-1), name='terameters_per_year', ascii_symbol='Tm/y', symbol='Tmy⁻¹') -terameters_per_square_year = NamedUnit(0.0010041761481530736, Dimensions(length=1, time=-2), name='terameters_per_square_year', ascii_symbol='Tm/y^2', symbol='Tmy⁻²') -gigameters_per_second = NamedUnit(1000000000.0, Dimensions(length=1, time=-1), name='gigameters_per_second', ascii_symbol='Gm/s', symbol='Gms⁻¹') -gigameters_per_square_second = NamedUnit(1000000000.0, Dimensions(length=1, time=-2), name='gigameters_per_square_second', ascii_symbol='Gm/s^2', symbol='Gms⁻²') -gigameters_per_millisecond = NamedUnit(1000000000000.0, Dimensions(length=1, time=-1), name='gigameters_per_millisecond', ascii_symbol='Gm/ms', symbol='Gmms⁻¹') -gigameters_per_square_millisecond = NamedUnit(1000000000000000.0, Dimensions(length=1, time=-2), name='gigameters_per_square_millisecond', ascii_symbol='Gm/ms^2', symbol='Gmms⁻²') -gigameters_per_microsecond = NamedUnit(1000000000000000.0, Dimensions(length=1, time=-1), name='gigameters_per_microsecond', ascii_symbol='Gm/us', symbol='Gmµs⁻¹') -gigameters_per_square_microsecond = NamedUnit(1e+21, Dimensions(length=1, time=-2), name='gigameters_per_square_microsecond', ascii_symbol='Gm/us^2', symbol='Gmµs⁻²') -gigameters_per_nanosecond = NamedUnit(1e+18, Dimensions(length=1, time=-1), name='gigameters_per_nanosecond', ascii_symbol='Gm/ns', symbol='Gmns⁻¹') -gigameters_per_square_nanosecond = NamedUnit(9.999999999999999e+26, Dimensions(length=1, time=-2), name='gigameters_per_square_nanosecond', ascii_symbol='Gm/ns^2', symbol='Gmns⁻²') -gigameters_per_picosecond = NamedUnit(1e+21, Dimensions(length=1, time=-1), name='gigameters_per_picosecond', ascii_symbol='Gm/ps', symbol='Gmps⁻¹') -gigameters_per_square_picosecond = NamedUnit(1.0000000000000001e+33, Dimensions(length=1, time=-2), name='gigameters_per_square_picosecond', ascii_symbol='Gm/ps^2', symbol='Gmps⁻²') -gigameters_per_femtosecond = NamedUnit(1e+24, Dimensions(length=1, time=-1), name='gigameters_per_femtosecond', ascii_symbol='Gm/fs', symbol='Gmfs⁻¹') -gigameters_per_square_femtosecond = NamedUnit(1e+39, Dimensions(length=1, time=-2), name='gigameters_per_square_femtosecond', ascii_symbol='Gm/fs^2', symbol='Gmfs⁻²') -gigameters_per_attosecond = NamedUnit(9.999999999999999e+26, Dimensions(length=1, time=-1), name='gigameters_per_attosecond', ascii_symbol='Gm/as', symbol='Gmas⁻¹') -gigameters_per_square_attosecond = NamedUnit(1e+45, Dimensions(length=1, time=-2), name='gigameters_per_square_attosecond', ascii_symbol='Gm/as^2', symbol='Gmas⁻²') -gigameters_per_minute = NamedUnit(16666666.666666666, Dimensions(length=1, time=-1), name='gigameters_per_minute', ascii_symbol='Gm/min', symbol='Gmmin⁻¹') -gigameters_per_square_minute = NamedUnit(277777.77777777775, Dimensions(length=1, time=-2), name='gigameters_per_square_minute', ascii_symbol='Gm/min^2', symbol='Gmmin⁻²') -gigameters_per_hour = NamedUnit(277777.77777777775, Dimensions(length=1, time=-1), name='gigameters_per_hour', ascii_symbol='Gm/h', symbol='Gmh⁻¹') -gigameters_per_square_hour = NamedUnit(77.1604938271605, Dimensions(length=1, time=-2), name='gigameters_per_square_hour', ascii_symbol='Gm/h^2', symbol='Gmh⁻²') -gigameters_per_day = NamedUnit(11574.074074074075, Dimensions(length=1, time=-1), name='gigameters_per_day', ascii_symbol='Gm/d', symbol='Gmd⁻¹') -gigameters_per_square_day = NamedUnit(0.13395919067215364, Dimensions(length=1, time=-2), name='gigameters_per_square_day', ascii_symbol='Gm/d^2', symbol='Gmd⁻²') -gigameters_per_year = NamedUnit(31.688738506811433, Dimensions(length=1, time=-1), name='gigameters_per_year', ascii_symbol='Gm/y', symbol='Gmy⁻¹') -gigameters_per_square_year = NamedUnit(1.0041761481530736e-06, Dimensions(length=1, time=-2), name='gigameters_per_square_year', ascii_symbol='Gm/y^2', symbol='Gmy⁻²') -megameters_per_second = NamedUnit(1000000.0, Dimensions(length=1, time=-1), name='megameters_per_second', ascii_symbol='Mm/s', symbol='Mms⁻¹') -megameters_per_square_second = NamedUnit(1000000.0, Dimensions(length=1, time=-2), name='megameters_per_square_second', ascii_symbol='Mm/s^2', symbol='Mms⁻²') -megameters_per_millisecond = NamedUnit(1000000000.0, Dimensions(length=1, time=-1), name='megameters_per_millisecond', ascii_symbol='Mm/ms', symbol='Mmms⁻¹') -megameters_per_square_millisecond = NamedUnit(1000000000000.0, Dimensions(length=1, time=-2), name='megameters_per_square_millisecond', ascii_symbol='Mm/ms^2', symbol='Mmms⁻²') -megameters_per_microsecond = NamedUnit(1000000000000.0, Dimensions(length=1, time=-1), name='megameters_per_microsecond', ascii_symbol='Mm/us', symbol='Mmµs⁻¹') -megameters_per_square_microsecond = NamedUnit(1e+18, Dimensions(length=1, time=-2), name='megameters_per_square_microsecond', ascii_symbol='Mm/us^2', symbol='Mmµs⁻²') -megameters_per_nanosecond = NamedUnit(1000000000000000.0, Dimensions(length=1, time=-1), name='megameters_per_nanosecond', ascii_symbol='Mm/ns', symbol='Mmns⁻¹') -megameters_per_square_nanosecond = NamedUnit(1e+24, Dimensions(length=1, time=-2), name='megameters_per_square_nanosecond', ascii_symbol='Mm/ns^2', symbol='Mmns⁻²') -megameters_per_picosecond = NamedUnit(1e+18, Dimensions(length=1, time=-1), name='megameters_per_picosecond', ascii_symbol='Mm/ps', symbol='Mmps⁻¹') -megameters_per_square_picosecond = NamedUnit(1e+30, Dimensions(length=1, time=-2), name='megameters_per_square_picosecond', ascii_symbol='Mm/ps^2', symbol='Mmps⁻²') -megameters_per_femtosecond = NamedUnit(9.999999999999999e+20, Dimensions(length=1, time=-1), name='megameters_per_femtosecond', ascii_symbol='Mm/fs', symbol='Mmfs⁻¹') -megameters_per_square_femtosecond = NamedUnit(9.999999999999999e+35, Dimensions(length=1, time=-2), name='megameters_per_square_femtosecond', ascii_symbol='Mm/fs^2', symbol='Mmfs⁻²') -megameters_per_attosecond = NamedUnit(1e+24, Dimensions(length=1, time=-1), name='megameters_per_attosecond', ascii_symbol='Mm/as', symbol='Mmas⁻¹') -megameters_per_square_attosecond = NamedUnit(9.999999999999999e+41, Dimensions(length=1, time=-2), name='megameters_per_square_attosecond', ascii_symbol='Mm/as^2', symbol='Mmas⁻²') -megameters_per_minute = NamedUnit(16666.666666666668, Dimensions(length=1, time=-1), name='megameters_per_minute', ascii_symbol='Mm/min', symbol='Mmmin⁻¹') -megameters_per_square_minute = NamedUnit(277.77777777777777, Dimensions(length=1, time=-2), name='megameters_per_square_minute', ascii_symbol='Mm/min^2', symbol='Mmmin⁻²') -megameters_per_hour = NamedUnit(277.77777777777777, Dimensions(length=1, time=-1), name='megameters_per_hour', ascii_symbol='Mm/h', symbol='Mmh⁻¹') -megameters_per_square_hour = NamedUnit(0.07716049382716049, Dimensions(length=1, time=-2), name='megameters_per_square_hour', ascii_symbol='Mm/h^2', symbol='Mmh⁻²') -megameters_per_day = NamedUnit(11.574074074074074, Dimensions(length=1, time=-1), name='megameters_per_day', ascii_symbol='Mm/d', symbol='Mmd⁻¹') -megameters_per_square_day = NamedUnit(0.00013395919067215364, Dimensions(length=1, time=-2), name='megameters_per_square_day', ascii_symbol='Mm/d^2', symbol='Mmd⁻²') -megameters_per_year = NamedUnit(0.031688738506811434, Dimensions(length=1, time=-1), name='megameters_per_year', ascii_symbol='Mm/y', symbol='Mmy⁻¹') -megameters_per_square_year = NamedUnit(1.0041761481530736e-09, Dimensions(length=1, time=-2), name='megameters_per_square_year', ascii_symbol='Mm/y^2', symbol='Mmy⁻²') -kilometers_per_second = NamedUnit(1000.0, Dimensions(length=1, time=-1), name='kilometers_per_second', ascii_symbol='km/s', symbol='kms⁻¹') -kilometers_per_square_second = NamedUnit(1000.0, Dimensions(length=1, time=-2), name='kilometers_per_square_second', ascii_symbol='km/s^2', symbol='kms⁻²') -kilometers_per_millisecond = NamedUnit(1000000.0, Dimensions(length=1, time=-1), name='kilometers_per_millisecond', ascii_symbol='km/ms', symbol='kmms⁻¹') -kilometers_per_square_millisecond = NamedUnit(1000000000.0, Dimensions(length=1, time=-2), name='kilometers_per_square_millisecond', ascii_symbol='km/ms^2', symbol='kmms⁻²') -kilometers_per_microsecond = NamedUnit(1000000000.0, Dimensions(length=1, time=-1), name='kilometers_per_microsecond', ascii_symbol='km/us', symbol='kmµs⁻¹') -kilometers_per_square_microsecond = NamedUnit(1000000000000000.0, Dimensions(length=1, time=-2), name='kilometers_per_square_microsecond', ascii_symbol='km/us^2', symbol='kmµs⁻²') -kilometers_per_nanosecond = NamedUnit(999999999999.9999, Dimensions(length=1, time=-1), name='kilometers_per_nanosecond', ascii_symbol='km/ns', symbol='kmns⁻¹') -kilometers_per_square_nanosecond = NamedUnit(9.999999999999999e+20, Dimensions(length=1, time=-2), name='kilometers_per_square_nanosecond', ascii_symbol='km/ns^2', symbol='kmns⁻²') -kilometers_per_picosecond = NamedUnit(1000000000000000.0, Dimensions(length=1, time=-1), name='kilometers_per_picosecond', ascii_symbol='km/ps', symbol='kmps⁻¹') -kilometers_per_square_picosecond = NamedUnit(1e+27, Dimensions(length=1, time=-2), name='kilometers_per_square_picosecond', ascii_symbol='km/ps^2', symbol='kmps⁻²') -kilometers_per_femtosecond = NamedUnit(9.999999999999999e+17, Dimensions(length=1, time=-1), name='kilometers_per_femtosecond', ascii_symbol='km/fs', symbol='kmfs⁻¹') -kilometers_per_square_femtosecond = NamedUnit(1e+33, Dimensions(length=1, time=-2), name='kilometers_per_square_femtosecond', ascii_symbol='km/fs^2', symbol='kmfs⁻²') -kilometers_per_attosecond = NamedUnit(9.999999999999999e+20, Dimensions(length=1, time=-1), name='kilometers_per_attosecond', ascii_symbol='km/as', symbol='kmas⁻¹') -kilometers_per_square_attosecond = NamedUnit(1e+39, Dimensions(length=1, time=-2), name='kilometers_per_square_attosecond', ascii_symbol='km/as^2', symbol='kmas⁻²') -kilometers_per_minute = NamedUnit(16.666666666666668, Dimensions(length=1, time=-1), name='kilometers_per_minute', ascii_symbol='km/min', symbol='kmmin⁻¹') -kilometers_per_square_minute = NamedUnit(0.2777777777777778, Dimensions(length=1, time=-2), name='kilometers_per_square_minute', ascii_symbol='km/min^2', symbol='kmmin⁻²') -kilometers_per_hour = NamedUnit(0.2777777777777778, Dimensions(length=1, time=-1), name='kilometers_per_hour', ascii_symbol='km/h', symbol='kmh⁻¹') -kilometers_per_square_hour = NamedUnit(7.716049382716049e-05, Dimensions(length=1, time=-2), name='kilometers_per_square_hour', ascii_symbol='km/h^2', symbol='kmh⁻²') -kilometers_per_day = NamedUnit(0.011574074074074073, Dimensions(length=1, time=-1), name='kilometers_per_day', ascii_symbol='km/d', symbol='kmd⁻¹') -kilometers_per_square_day = NamedUnit(1.3395919067215364e-07, Dimensions(length=1, time=-2), name='kilometers_per_square_day', ascii_symbol='km/d^2', symbol='kmd⁻²') -kilometers_per_year = NamedUnit(3.168873850681143e-05, Dimensions(length=1, time=-1), name='kilometers_per_year', ascii_symbol='km/y', symbol='kmy⁻¹') -kilometers_per_square_year = NamedUnit(1.0041761481530736e-12, Dimensions(length=1, time=-2), name='kilometers_per_square_year', ascii_symbol='km/y^2', symbol='kmy⁻²') -millimeters_per_second = NamedUnit(0.001, Dimensions(length=1, time=-1), name='millimeters_per_second', ascii_symbol='mm/s', symbol='mms⁻¹') -millimeters_per_square_second = NamedUnit(0.001, Dimensions(length=1, time=-2), name='millimeters_per_square_second', ascii_symbol='mm/s^2', symbol='mms⁻²') -millimeters_per_millisecond = NamedUnit(1.0, Dimensions(length=1, time=-1), name='millimeters_per_millisecond', ascii_symbol='mm/ms', symbol='mmms⁻¹') -millimeters_per_square_millisecond = NamedUnit(1000.0000000000001, Dimensions(length=1, time=-2), name='millimeters_per_square_millisecond', ascii_symbol='mm/ms^2', symbol='mmms⁻²') -millimeters_per_microsecond = NamedUnit(1000.0000000000001, Dimensions(length=1, time=-1), name='millimeters_per_microsecond', ascii_symbol='mm/us', symbol='mmµs⁻¹') -millimeters_per_square_microsecond = NamedUnit(1000000000.0, Dimensions(length=1, time=-2), name='millimeters_per_square_microsecond', ascii_symbol='mm/us^2', symbol='mmµs⁻²') -millimeters_per_nanosecond = NamedUnit(1000000.0, Dimensions(length=1, time=-1), name='millimeters_per_nanosecond', ascii_symbol='mm/ns', symbol='mmns⁻¹') -millimeters_per_square_nanosecond = NamedUnit(1000000000000000.0, Dimensions(length=1, time=-2), name='millimeters_per_square_nanosecond', ascii_symbol='mm/ns^2', symbol='mmns⁻²') -millimeters_per_picosecond = NamedUnit(1000000000.0, Dimensions(length=1, time=-1), name='millimeters_per_picosecond', ascii_symbol='mm/ps', symbol='mmps⁻¹') -millimeters_per_square_picosecond = NamedUnit(1.0000000000000001e+21, Dimensions(length=1, time=-2), name='millimeters_per_square_picosecond', ascii_symbol='mm/ps^2', symbol='mmps⁻²') -millimeters_per_femtosecond = NamedUnit(1000000000000.0, Dimensions(length=1, time=-1), name='millimeters_per_femtosecond', ascii_symbol='mm/fs', symbol='mmfs⁻¹') -millimeters_per_square_femtosecond = NamedUnit(9.999999999999999e+26, Dimensions(length=1, time=-2), name='millimeters_per_square_femtosecond', ascii_symbol='mm/fs^2', symbol='mmfs⁻²') -millimeters_per_attosecond = NamedUnit(1000000000000000.0, Dimensions(length=1, time=-1), name='millimeters_per_attosecond', ascii_symbol='mm/as', symbol='mmas⁻¹') -millimeters_per_square_attosecond = NamedUnit(1e+33, Dimensions(length=1, time=-2), name='millimeters_per_square_attosecond', ascii_symbol='mm/as^2', symbol='mmas⁻²') -millimeters_per_minute = NamedUnit(1.6666666666666667e-05, Dimensions(length=1, time=-1), name='millimeters_per_minute', ascii_symbol='mm/min', symbol='mmmin⁻¹') -millimeters_per_square_minute = NamedUnit(2.7777777777777776e-07, Dimensions(length=1, time=-2), name='millimeters_per_square_minute', ascii_symbol='mm/min^2', symbol='mmmin⁻²') -millimeters_per_hour = NamedUnit(2.7777777777777776e-07, Dimensions(length=1, time=-1), name='millimeters_per_hour', ascii_symbol='mm/h', symbol='mmh⁻¹') -millimeters_per_square_hour = NamedUnit(7.716049382716049e-11, Dimensions(length=1, time=-2), name='millimeters_per_square_hour', ascii_symbol='mm/h^2', symbol='mmh⁻²') -millimeters_per_day = NamedUnit(1.1574074074074074e-08, Dimensions(length=1, time=-1), name='millimeters_per_day', ascii_symbol='mm/d', symbol='mmd⁻¹') -millimeters_per_square_day = NamedUnit(1.3395919067215364e-13, Dimensions(length=1, time=-2), name='millimeters_per_square_day', ascii_symbol='mm/d^2', symbol='mmd⁻²') -millimeters_per_year = NamedUnit(3.168873850681143e-11, Dimensions(length=1, time=-1), name='millimeters_per_year', ascii_symbol='mm/y', symbol='mmy⁻¹') -millimeters_per_square_year = NamedUnit(1.0041761481530737e-18, Dimensions(length=1, time=-2), name='millimeters_per_square_year', ascii_symbol='mm/y^2', symbol='mmy⁻²') -micrometers_per_second = NamedUnit(1e-06, Dimensions(length=1, time=-1), name='micrometers_per_second', ascii_symbol='um/s', symbol='µms⁻¹') -micrometers_per_square_second = NamedUnit(1e-06, Dimensions(length=1, time=-2), name='micrometers_per_square_second', ascii_symbol='um/s^2', symbol='µms⁻²') -micrometers_per_millisecond = NamedUnit(0.001, Dimensions(length=1, time=-1), name='micrometers_per_millisecond', ascii_symbol='um/ms', symbol='µmms⁻¹') -micrometers_per_square_millisecond = NamedUnit(1.0, Dimensions(length=1, time=-2), name='micrometers_per_square_millisecond', ascii_symbol='um/ms^2', symbol='µmms⁻²') -micrometers_per_microsecond = NamedUnit(1.0, Dimensions(length=1, time=-1), name='micrometers_per_microsecond', ascii_symbol='um/us', symbol='µmµs⁻¹') -micrometers_per_square_microsecond = NamedUnit(1000000.0, Dimensions(length=1, time=-2), name='micrometers_per_square_microsecond', ascii_symbol='um/us^2', symbol='µmµs⁻²') -micrometers_per_nanosecond = NamedUnit(999.9999999999999, Dimensions(length=1, time=-1), name='micrometers_per_nanosecond', ascii_symbol='um/ns', symbol='µmns⁻¹') -micrometers_per_square_nanosecond = NamedUnit(999999999999.9999, Dimensions(length=1, time=-2), name='micrometers_per_square_nanosecond', ascii_symbol='um/ns^2', symbol='µmns⁻²') -micrometers_per_picosecond = NamedUnit(1000000.0, Dimensions(length=1, time=-1), name='micrometers_per_picosecond', ascii_symbol='um/ps', symbol='µmps⁻¹') -micrometers_per_square_picosecond = NamedUnit(1e+18, Dimensions(length=1, time=-2), name='micrometers_per_square_picosecond', ascii_symbol='um/ps^2', symbol='µmps⁻²') -micrometers_per_femtosecond = NamedUnit(999999999.9999999, Dimensions(length=1, time=-1), name='micrometers_per_femtosecond', ascii_symbol='um/fs', symbol='µmfs⁻¹') -micrometers_per_square_femtosecond = NamedUnit(9.999999999999998e+23, Dimensions(length=1, time=-2), name='micrometers_per_square_femtosecond', ascii_symbol='um/fs^2', symbol='µmfs⁻²') -micrometers_per_attosecond = NamedUnit(999999999999.9999, Dimensions(length=1, time=-1), name='micrometers_per_attosecond', ascii_symbol='um/as', symbol='µmas⁻¹') -micrometers_per_square_attosecond = NamedUnit(9.999999999999999e+29, Dimensions(length=1, time=-2), name='micrometers_per_square_attosecond', ascii_symbol='um/as^2', symbol='µmas⁻²') -micrometers_per_minute = NamedUnit(1.6666666666666667e-08, Dimensions(length=1, time=-1), name='micrometers_per_minute', ascii_symbol='um/min', symbol='µmmin⁻¹') -micrometers_per_square_minute = NamedUnit(2.7777777777777777e-10, Dimensions(length=1, time=-2), name='micrometers_per_square_minute', ascii_symbol='um/min^2', symbol='µmmin⁻²') -micrometers_per_hour = NamedUnit(2.7777777777777777e-10, Dimensions(length=1, time=-1), name='micrometers_per_hour', ascii_symbol='um/h', symbol='µmh⁻¹') -micrometers_per_square_hour = NamedUnit(7.71604938271605e-14, Dimensions(length=1, time=-2), name='micrometers_per_square_hour', ascii_symbol='um/h^2', symbol='µmh⁻²') -micrometers_per_day = NamedUnit(1.1574074074074074e-11, Dimensions(length=1, time=-1), name='micrometers_per_day', ascii_symbol='um/d', symbol='µmd⁻¹') -micrometers_per_square_day = NamedUnit(1.3395919067215363e-16, Dimensions(length=1, time=-2), name='micrometers_per_square_day', ascii_symbol='um/d^2', symbol='µmd⁻²') -micrometers_per_year = NamedUnit(3.168873850681143e-14, Dimensions(length=1, time=-1), name='micrometers_per_year', ascii_symbol='um/y', symbol='µmy⁻¹') -micrometers_per_square_year = NamedUnit(1.0041761481530736e-21, Dimensions(length=1, time=-2), name='micrometers_per_square_year', ascii_symbol='um/y^2', symbol='µmy⁻²') -nanometers_per_second = NamedUnit(1e-09, Dimensions(length=1, time=-1), name='nanometers_per_second', ascii_symbol='nm/s', symbol='nms⁻¹') -nanometers_per_square_second = NamedUnit(1e-09, Dimensions(length=1, time=-2), name='nanometers_per_square_second', ascii_symbol='nm/s^2', symbol='nms⁻²') -nanometers_per_millisecond = NamedUnit(1e-06, Dimensions(length=1, time=-1), name='nanometers_per_millisecond', ascii_symbol='nm/ms', symbol='nmms⁻¹') -nanometers_per_square_millisecond = NamedUnit(0.001, Dimensions(length=1, time=-2), name='nanometers_per_square_millisecond', ascii_symbol='nm/ms^2', symbol='nmms⁻²') -nanometers_per_microsecond = NamedUnit(0.001, Dimensions(length=1, time=-1), name='nanometers_per_microsecond', ascii_symbol='nm/us', symbol='nmµs⁻¹') -nanometers_per_square_microsecond = NamedUnit(1000.0000000000001, Dimensions(length=1, time=-2), name='nanometers_per_square_microsecond', ascii_symbol='nm/us^2', symbol='nmµs⁻²') -nanometers_per_nanosecond = NamedUnit(1.0, Dimensions(length=1, time=-1), name='nanometers_per_nanosecond', ascii_symbol='nm/ns', symbol='nmns⁻¹') -nanometers_per_square_nanosecond = NamedUnit(1000000000.0, Dimensions(length=1, time=-2), name='nanometers_per_square_nanosecond', ascii_symbol='nm/ns^2', symbol='nmns⁻²') -nanometers_per_picosecond = NamedUnit(1000.0000000000001, Dimensions(length=1, time=-1), name='nanometers_per_picosecond', ascii_symbol='nm/ps', symbol='nmps⁻¹') -nanometers_per_square_picosecond = NamedUnit(1000000000000000.1, Dimensions(length=1, time=-2), name='nanometers_per_square_picosecond', ascii_symbol='nm/ps^2', symbol='nmps⁻²') -nanometers_per_femtosecond = NamedUnit(1000000.0, Dimensions(length=1, time=-1), name='nanometers_per_femtosecond', ascii_symbol='nm/fs', symbol='nmfs⁻¹') -nanometers_per_square_femtosecond = NamedUnit(1e+21, Dimensions(length=1, time=-2), name='nanometers_per_square_femtosecond', ascii_symbol='nm/fs^2', symbol='nmfs⁻²') -nanometers_per_attosecond = NamedUnit(1000000000.0, Dimensions(length=1, time=-1), name='nanometers_per_attosecond', ascii_symbol='nm/as', symbol='nmas⁻¹') -nanometers_per_square_attosecond = NamedUnit(1e+27, Dimensions(length=1, time=-2), name='nanometers_per_square_attosecond', ascii_symbol='nm/as^2', symbol='nmas⁻²') -nanometers_per_minute = NamedUnit(1.6666666666666667e-11, Dimensions(length=1, time=-1), name='nanometers_per_minute', ascii_symbol='nm/min', symbol='nmmin⁻¹') -nanometers_per_square_minute = NamedUnit(2.777777777777778e-13, Dimensions(length=1, time=-2), name='nanometers_per_square_minute', ascii_symbol='nm/min^2', symbol='nmmin⁻²') -nanometers_per_hour = NamedUnit(2.777777777777778e-13, Dimensions(length=1, time=-1), name='nanometers_per_hour', ascii_symbol='nm/h', symbol='nmh⁻¹') -nanometers_per_square_hour = NamedUnit(7.71604938271605e-17, Dimensions(length=1, time=-2), name='nanometers_per_square_hour', ascii_symbol='nm/h^2', symbol='nmh⁻²') -nanometers_per_day = NamedUnit(1.1574074074074075e-14, Dimensions(length=1, time=-1), name='nanometers_per_day', ascii_symbol='nm/d', symbol='nmd⁻¹') -nanometers_per_square_day = NamedUnit(1.3395919067215365e-19, Dimensions(length=1, time=-2), name='nanometers_per_square_day', ascii_symbol='nm/d^2', symbol='nmd⁻²') -nanometers_per_year = NamedUnit(3.1688738506811435e-17, Dimensions(length=1, time=-1), name='nanometers_per_year', ascii_symbol='nm/y', symbol='nmy⁻¹') -nanometers_per_square_year = NamedUnit(1.0041761481530737e-24, Dimensions(length=1, time=-2), name='nanometers_per_square_year', ascii_symbol='nm/y^2', symbol='nmy⁻²') -picometers_per_second = NamedUnit(1e-12, Dimensions(length=1, time=-1), name='picometers_per_second', ascii_symbol='pm/s', symbol='pms⁻¹') -picometers_per_square_second = NamedUnit(1e-12, Dimensions(length=1, time=-2), name='picometers_per_square_second', ascii_symbol='pm/s^2', symbol='pms⁻²') -picometers_per_millisecond = NamedUnit(1e-09, Dimensions(length=1, time=-1), name='picometers_per_millisecond', ascii_symbol='pm/ms', symbol='pmms⁻¹') -picometers_per_square_millisecond = NamedUnit(1e-06, Dimensions(length=1, time=-2), name='picometers_per_square_millisecond', ascii_symbol='pm/ms^2', symbol='pmms⁻²') -picometers_per_microsecond = NamedUnit(1e-06, Dimensions(length=1, time=-1), name='picometers_per_microsecond', ascii_symbol='pm/us', symbol='pmµs⁻¹') -picometers_per_square_microsecond = NamedUnit(1.0, Dimensions(length=1, time=-2), name='picometers_per_square_microsecond', ascii_symbol='pm/us^2', symbol='pmµs⁻²') -picometers_per_nanosecond = NamedUnit(0.001, Dimensions(length=1, time=-1), name='picometers_per_nanosecond', ascii_symbol='pm/ns', symbol='pmns⁻¹') -picometers_per_square_nanosecond = NamedUnit(999999.9999999999, Dimensions(length=1, time=-2), name='picometers_per_square_nanosecond', ascii_symbol='pm/ns^2', symbol='pmns⁻²') -picometers_per_picosecond = NamedUnit(1.0, Dimensions(length=1, time=-1), name='picometers_per_picosecond', ascii_symbol='pm/ps', symbol='pmps⁻¹') -picometers_per_square_picosecond = NamedUnit(1000000000000.0, Dimensions(length=1, time=-2), name='picometers_per_square_picosecond', ascii_symbol='pm/ps^2', symbol='pmps⁻²') -picometers_per_femtosecond = NamedUnit(999.9999999999999, Dimensions(length=1, time=-1), name='picometers_per_femtosecond', ascii_symbol='pm/fs', symbol='pmfs⁻¹') -picometers_per_square_femtosecond = NamedUnit(9.999999999999999e+17, Dimensions(length=1, time=-2), name='picometers_per_square_femtosecond', ascii_symbol='pm/fs^2', symbol='pmfs⁻²') -picometers_per_attosecond = NamedUnit(999999.9999999999, Dimensions(length=1, time=-1), name='picometers_per_attosecond', ascii_symbol='pm/as', symbol='pmas⁻¹') -picometers_per_square_attosecond = NamedUnit(9.999999999999998e+23, Dimensions(length=1, time=-2), name='picometers_per_square_attosecond', ascii_symbol='pm/as^2', symbol='pmas⁻²') -picometers_per_minute = NamedUnit(1.6666666666666667e-14, Dimensions(length=1, time=-1), name='picometers_per_minute', ascii_symbol='pm/min', symbol='pmmin⁻¹') -picometers_per_square_minute = NamedUnit(2.7777777777777775e-16, Dimensions(length=1, time=-2), name='picometers_per_square_minute', ascii_symbol='pm/min^2', symbol='pmmin⁻²') -picometers_per_hour = NamedUnit(2.7777777777777775e-16, Dimensions(length=1, time=-1), name='picometers_per_hour', ascii_symbol='pm/h', symbol='pmh⁻¹') -picometers_per_square_hour = NamedUnit(7.716049382716049e-20, Dimensions(length=1, time=-2), name='picometers_per_square_hour', ascii_symbol='pm/h^2', symbol='pmh⁻²') -picometers_per_day = NamedUnit(1.1574074074074074e-17, Dimensions(length=1, time=-1), name='picometers_per_day', ascii_symbol='pm/d', symbol='pmd⁻¹') -picometers_per_square_day = NamedUnit(1.3395919067215362e-22, Dimensions(length=1, time=-2), name='picometers_per_square_day', ascii_symbol='pm/d^2', symbol='pmd⁻²') -picometers_per_year = NamedUnit(3.168873850681143e-20, Dimensions(length=1, time=-1), name='picometers_per_year', ascii_symbol='pm/y', symbol='pmy⁻¹') -picometers_per_square_year = NamedUnit(1.0041761481530736e-27, Dimensions(length=1, time=-2), name='picometers_per_square_year', ascii_symbol='pm/y^2', symbol='pmy⁻²') -femtometers_per_second = NamedUnit(1e-15, Dimensions(length=1, time=-1), name='femtometers_per_second', ascii_symbol='fm/s', symbol='fms⁻¹') -femtometers_per_square_second = NamedUnit(1e-15, Dimensions(length=1, time=-2), name='femtometers_per_square_second', ascii_symbol='fm/s^2', symbol='fms⁻²') -femtometers_per_millisecond = NamedUnit(1e-12, Dimensions(length=1, time=-1), name='femtometers_per_millisecond', ascii_symbol='fm/ms', symbol='fmms⁻¹') -femtometers_per_square_millisecond = NamedUnit(1e-09, Dimensions(length=1, time=-2), name='femtometers_per_square_millisecond', ascii_symbol='fm/ms^2', symbol='fmms⁻²') -femtometers_per_microsecond = NamedUnit(1e-09, Dimensions(length=1, time=-1), name='femtometers_per_microsecond', ascii_symbol='fm/us', symbol='fmµs⁻¹') -femtometers_per_square_microsecond = NamedUnit(0.001, Dimensions(length=1, time=-2), name='femtometers_per_square_microsecond', ascii_symbol='fm/us^2', symbol='fmµs⁻²') -femtometers_per_nanosecond = NamedUnit(1e-06, Dimensions(length=1, time=-1), name='femtometers_per_nanosecond', ascii_symbol='fm/ns', symbol='fmns⁻¹') -femtometers_per_square_nanosecond = NamedUnit(1000.0, Dimensions(length=1, time=-2), name='femtometers_per_square_nanosecond', ascii_symbol='fm/ns^2', symbol='fmns⁻²') -femtometers_per_picosecond = NamedUnit(0.001, Dimensions(length=1, time=-1), name='femtometers_per_picosecond', ascii_symbol='fm/ps', symbol='fmps⁻¹') -femtometers_per_square_picosecond = NamedUnit(1000000000.0000001, Dimensions(length=1, time=-2), name='femtometers_per_square_picosecond', ascii_symbol='fm/ps^2', symbol='fmps⁻²') -femtometers_per_femtosecond = NamedUnit(1.0, Dimensions(length=1, time=-1), name='femtometers_per_femtosecond', ascii_symbol='fm/fs', symbol='fmfs⁻¹') -femtometers_per_square_femtosecond = NamedUnit(1000000000000000.0, Dimensions(length=1, time=-2), name='femtometers_per_square_femtosecond', ascii_symbol='fm/fs^2', symbol='fmfs⁻²') -femtometers_per_attosecond = NamedUnit(1000.0, Dimensions(length=1, time=-1), name='femtometers_per_attosecond', ascii_symbol='fm/as', symbol='fmas⁻¹') -femtometers_per_square_attosecond = NamedUnit(1e+21, Dimensions(length=1, time=-2), name='femtometers_per_square_attosecond', ascii_symbol='fm/as^2', symbol='fmas⁻²') -femtometers_per_minute = NamedUnit(1.6666666666666667e-17, Dimensions(length=1, time=-1), name='femtometers_per_minute', ascii_symbol='fm/min', symbol='fmmin⁻¹') -femtometers_per_square_minute = NamedUnit(2.777777777777778e-19, Dimensions(length=1, time=-2), name='femtometers_per_square_minute', ascii_symbol='fm/min^2', symbol='fmmin⁻²') -femtometers_per_hour = NamedUnit(2.777777777777778e-19, Dimensions(length=1, time=-1), name='femtometers_per_hour', ascii_symbol='fm/h', symbol='fmh⁻¹') -femtometers_per_square_hour = NamedUnit(7.71604938271605e-23, Dimensions(length=1, time=-2), name='femtometers_per_square_hour', ascii_symbol='fm/h^2', symbol='fmh⁻²') -femtometers_per_day = NamedUnit(1.1574074074074075e-20, Dimensions(length=1, time=-1), name='femtometers_per_day', ascii_symbol='fm/d', symbol='fmd⁻¹') -femtometers_per_square_day = NamedUnit(1.3395919067215364e-25, Dimensions(length=1, time=-2), name='femtometers_per_square_day', ascii_symbol='fm/d^2', symbol='fmd⁻²') -femtometers_per_year = NamedUnit(3.1688738506811434e-23, Dimensions(length=1, time=-1), name='femtometers_per_year', ascii_symbol='fm/y', symbol='fmy⁻¹') -femtometers_per_square_year = NamedUnit(1.0041761481530736e-30, Dimensions(length=1, time=-2), name='femtometers_per_square_year', ascii_symbol='fm/y^2', symbol='fmy⁻²') -attometers_per_second = NamedUnit(1e-18, Dimensions(length=1, time=-1), name='attometers_per_second', ascii_symbol='am/s', symbol='ams⁻¹') -attometers_per_square_second = NamedUnit(1e-18, Dimensions(length=1, time=-2), name='attometers_per_square_second', ascii_symbol='am/s^2', symbol='ams⁻²') -attometers_per_millisecond = NamedUnit(1e-15, Dimensions(length=1, time=-1), name='attometers_per_millisecond', ascii_symbol='am/ms', symbol='amms⁻¹') -attometers_per_square_millisecond = NamedUnit(1.0000000000000002e-12, Dimensions(length=1, time=-2), name='attometers_per_square_millisecond', ascii_symbol='am/ms^2', symbol='amms⁻²') -attometers_per_microsecond = NamedUnit(1.0000000000000002e-12, Dimensions(length=1, time=-1), name='attometers_per_microsecond', ascii_symbol='am/us', symbol='amµs⁻¹') -attometers_per_square_microsecond = NamedUnit(1.0000000000000002e-06, Dimensions(length=1, time=-2), name='attometers_per_square_microsecond', ascii_symbol='am/us^2', symbol='amµs⁻²') -attometers_per_nanosecond = NamedUnit(1e-09, Dimensions(length=1, time=-1), name='attometers_per_nanosecond', ascii_symbol='am/ns', symbol='amns⁻¹') -attometers_per_square_nanosecond = NamedUnit(1.0, Dimensions(length=1, time=-2), name='attometers_per_square_nanosecond', ascii_symbol='am/ns^2', symbol='amns⁻²') -attometers_per_picosecond = NamedUnit(1.0000000000000002e-06, Dimensions(length=1, time=-1), name='attometers_per_picosecond', ascii_symbol='am/ps', symbol='amps⁻¹') -attometers_per_square_picosecond = NamedUnit(1000000.0000000001, Dimensions(length=1, time=-2), name='attometers_per_square_picosecond', ascii_symbol='am/ps^2', symbol='amps⁻²') -attometers_per_femtosecond = NamedUnit(0.001, Dimensions(length=1, time=-1), name='attometers_per_femtosecond', ascii_symbol='am/fs', symbol='amfs⁻¹') -attometers_per_square_femtosecond = NamedUnit(1000000000000.0, Dimensions(length=1, time=-2), name='attometers_per_square_femtosecond', ascii_symbol='am/fs^2', symbol='amfs⁻²') -attometers_per_attosecond = NamedUnit(1.0, Dimensions(length=1, time=-1), name='attometers_per_attosecond', ascii_symbol='am/as', symbol='amas⁻¹') -attometers_per_square_attosecond = NamedUnit(1e+18, Dimensions(length=1, time=-2), name='attometers_per_square_attosecond', ascii_symbol='am/as^2', symbol='amas⁻²') -attometers_per_minute = NamedUnit(1.6666666666666668e-20, Dimensions(length=1, time=-1), name='attometers_per_minute', ascii_symbol='am/min', symbol='ammin⁻¹') -attometers_per_square_minute = NamedUnit(2.777777777777778e-22, Dimensions(length=1, time=-2), name='attometers_per_square_minute', ascii_symbol='am/min^2', symbol='ammin⁻²') -attometers_per_hour = NamedUnit(2.777777777777778e-22, Dimensions(length=1, time=-1), name='attometers_per_hour', ascii_symbol='am/h', symbol='amh⁻¹') -attometers_per_square_hour = NamedUnit(7.71604938271605e-26, Dimensions(length=1, time=-2), name='attometers_per_square_hour', ascii_symbol='am/h^2', symbol='amh⁻²') -attometers_per_day = NamedUnit(1.1574074074074075e-23, Dimensions(length=1, time=-1), name='attometers_per_day', ascii_symbol='am/d', symbol='amd⁻¹') -attometers_per_square_day = NamedUnit(1.3395919067215364e-28, Dimensions(length=1, time=-2), name='attometers_per_square_day', ascii_symbol='am/d^2', symbol='amd⁻²') -attometers_per_year = NamedUnit(3.1688738506811435e-26, Dimensions(length=1, time=-1), name='attometers_per_year', ascii_symbol='am/y', symbol='amy⁻¹') -attometers_per_square_year = NamedUnit(1.0041761481530737e-33, Dimensions(length=1, time=-2), name='attometers_per_square_year', ascii_symbol='am/y^2', symbol='amy⁻²') -decimeters_per_second = NamedUnit(0.1, Dimensions(length=1, time=-1), name='decimeters_per_second', ascii_symbol='dm/s', symbol='dms⁻¹') -decimeters_per_square_second = NamedUnit(0.1, Dimensions(length=1, time=-2), name='decimeters_per_square_second', ascii_symbol='dm/s^2', symbol='dms⁻²') -decimeters_per_millisecond = NamedUnit(100.0, Dimensions(length=1, time=-1), name='decimeters_per_millisecond', ascii_symbol='dm/ms', symbol='dmms⁻¹') -decimeters_per_square_millisecond = NamedUnit(100000.00000000001, Dimensions(length=1, time=-2), name='decimeters_per_square_millisecond', ascii_symbol='dm/ms^2', symbol='dmms⁻²') -decimeters_per_microsecond = NamedUnit(100000.00000000001, Dimensions(length=1, time=-1), name='decimeters_per_microsecond', ascii_symbol='dm/us', symbol='dmµs⁻¹') -decimeters_per_square_microsecond = NamedUnit(100000000000.0, Dimensions(length=1, time=-2), name='decimeters_per_square_microsecond', ascii_symbol='dm/us^2', symbol='dmµs⁻²') -decimeters_per_nanosecond = NamedUnit(100000000.0, Dimensions(length=1, time=-1), name='decimeters_per_nanosecond', ascii_symbol='dm/ns', symbol='dmns⁻¹') -decimeters_per_square_nanosecond = NamedUnit(1e+17, Dimensions(length=1, time=-2), name='decimeters_per_square_nanosecond', ascii_symbol='dm/ns^2', symbol='dmns⁻²') -decimeters_per_picosecond = NamedUnit(100000000000.0, Dimensions(length=1, time=-1), name='decimeters_per_picosecond', ascii_symbol='dm/ps', symbol='dmps⁻¹') -decimeters_per_square_picosecond = NamedUnit(1.0000000000000001e+23, Dimensions(length=1, time=-2), name='decimeters_per_square_picosecond', ascii_symbol='dm/ps^2', symbol='dmps⁻²') -decimeters_per_femtosecond = NamedUnit(100000000000000.0, Dimensions(length=1, time=-1), name='decimeters_per_femtosecond', ascii_symbol='dm/fs', symbol='dmfs⁻¹') -decimeters_per_square_femtosecond = NamedUnit(1e+29, Dimensions(length=1, time=-2), name='decimeters_per_square_femtosecond', ascii_symbol='dm/fs^2', symbol='dmfs⁻²') -decimeters_per_attosecond = NamedUnit(1e+17, Dimensions(length=1, time=-1), name='decimeters_per_attosecond', ascii_symbol='dm/as', symbol='dmas⁻¹') -decimeters_per_square_attosecond = NamedUnit(1e+35, Dimensions(length=1, time=-2), name='decimeters_per_square_attosecond', ascii_symbol='dm/as^2', symbol='dmas⁻²') -decimeters_per_minute = NamedUnit(0.0016666666666666668, Dimensions(length=1, time=-1), name='decimeters_per_minute', ascii_symbol='dm/min', symbol='dmmin⁻¹') -decimeters_per_square_minute = NamedUnit(2.777777777777778e-05, Dimensions(length=1, time=-2), name='decimeters_per_square_minute', ascii_symbol='dm/min^2', symbol='dmmin⁻²') -decimeters_per_hour = NamedUnit(2.777777777777778e-05, Dimensions(length=1, time=-1), name='decimeters_per_hour', ascii_symbol='dm/h', symbol='dmh⁻¹') -decimeters_per_square_hour = NamedUnit(7.71604938271605e-09, Dimensions(length=1, time=-2), name='decimeters_per_square_hour', ascii_symbol='dm/h^2', symbol='dmh⁻²') -decimeters_per_day = NamedUnit(1.1574074074074074e-06, Dimensions(length=1, time=-1), name='decimeters_per_day', ascii_symbol='dm/d', symbol='dmd⁻¹') -decimeters_per_square_day = NamedUnit(1.3395919067215364e-11, Dimensions(length=1, time=-2), name='decimeters_per_square_day', ascii_symbol='dm/d^2', symbol='dmd⁻²') -decimeters_per_year = NamedUnit(3.168873850681143e-09, Dimensions(length=1, time=-1), name='decimeters_per_year', ascii_symbol='dm/y', symbol='dmy⁻¹') -decimeters_per_square_year = NamedUnit(1.0041761481530736e-16, Dimensions(length=1, time=-2), name='decimeters_per_square_year', ascii_symbol='dm/y^2', symbol='dmy⁻²') -centimeters_per_second = NamedUnit(0.01, Dimensions(length=1, time=-1), name='centimeters_per_second', ascii_symbol='cm/s', symbol='cms⁻¹') -centimeters_per_square_second = NamedUnit(0.01, Dimensions(length=1, time=-2), name='centimeters_per_square_second', ascii_symbol='cm/s^2', symbol='cms⁻²') -centimeters_per_millisecond = NamedUnit(10.0, Dimensions(length=1, time=-1), name='centimeters_per_millisecond', ascii_symbol='cm/ms', symbol='cmms⁻¹') -centimeters_per_square_millisecond = NamedUnit(10000.0, Dimensions(length=1, time=-2), name='centimeters_per_square_millisecond', ascii_symbol='cm/ms^2', symbol='cmms⁻²') -centimeters_per_microsecond = NamedUnit(10000.0, Dimensions(length=1, time=-1), name='centimeters_per_microsecond', ascii_symbol='cm/us', symbol='cmµs⁻¹') -centimeters_per_square_microsecond = NamedUnit(10000000000.0, Dimensions(length=1, time=-2), name='centimeters_per_square_microsecond', ascii_symbol='cm/us^2', symbol='cmµs⁻²') -centimeters_per_nanosecond = NamedUnit(10000000.0, Dimensions(length=1, time=-1), name='centimeters_per_nanosecond', ascii_symbol='cm/ns', symbol='cmns⁻¹') -centimeters_per_square_nanosecond = NamedUnit(1e+16, Dimensions(length=1, time=-2), name='centimeters_per_square_nanosecond', ascii_symbol='cm/ns^2', symbol='cmns⁻²') -centimeters_per_picosecond = NamedUnit(10000000000.0, Dimensions(length=1, time=-1), name='centimeters_per_picosecond', ascii_symbol='cm/ps', symbol='cmps⁻¹') -centimeters_per_square_picosecond = NamedUnit(1e+22, Dimensions(length=1, time=-2), name='centimeters_per_square_picosecond', ascii_symbol='cm/ps^2', symbol='cmps⁻²') -centimeters_per_femtosecond = NamedUnit(10000000000000.0, Dimensions(length=1, time=-1), name='centimeters_per_femtosecond', ascii_symbol='cm/fs', symbol='cmfs⁻¹') -centimeters_per_square_femtosecond = NamedUnit(1e+28, Dimensions(length=1, time=-2), name='centimeters_per_square_femtosecond', ascii_symbol='cm/fs^2', symbol='cmfs⁻²') -centimeters_per_attosecond = NamedUnit(1e+16, Dimensions(length=1, time=-1), name='centimeters_per_attosecond', ascii_symbol='cm/as', symbol='cmas⁻¹') -centimeters_per_square_attosecond = NamedUnit(1e+34, Dimensions(length=1, time=-2), name='centimeters_per_square_attosecond', ascii_symbol='cm/as^2', symbol='cmas⁻²') -centimeters_per_minute = NamedUnit(0.00016666666666666666, Dimensions(length=1, time=-1), name='centimeters_per_minute', ascii_symbol='cm/min', symbol='cmmin⁻¹') -centimeters_per_square_minute = NamedUnit(2.777777777777778e-06, Dimensions(length=1, time=-2), name='centimeters_per_square_minute', ascii_symbol='cm/min^2', symbol='cmmin⁻²') -centimeters_per_hour = NamedUnit(2.777777777777778e-06, Dimensions(length=1, time=-1), name='centimeters_per_hour', ascii_symbol='cm/h', symbol='cmh⁻¹') -centimeters_per_square_hour = NamedUnit(7.71604938271605e-10, Dimensions(length=1, time=-2), name='centimeters_per_square_hour', ascii_symbol='cm/h^2', symbol='cmh⁻²') -centimeters_per_day = NamedUnit(1.1574074074074074e-07, Dimensions(length=1, time=-1), name='centimeters_per_day', ascii_symbol='cm/d', symbol='cmd⁻¹') -centimeters_per_square_day = NamedUnit(1.3395919067215364e-12, Dimensions(length=1, time=-2), name='centimeters_per_square_day', ascii_symbol='cm/d^2', symbol='cmd⁻²') -centimeters_per_year = NamedUnit(3.168873850681143e-10, Dimensions(length=1, time=-1), name='centimeters_per_year', ascii_symbol='cm/y', symbol='cmy⁻¹') -centimeters_per_square_year = NamedUnit(1.0041761481530737e-17, Dimensions(length=1, time=-2), name='centimeters_per_square_year', ascii_symbol='cm/y^2', symbol='cmy⁻²') -angstroms_per_second = NamedUnit(1e-10, Dimensions(length=1, time=-1), name='angstroms_per_second', ascii_symbol='Ang/s', symbol='Ås⁻¹') -angstroms_per_square_second = NamedUnit(1e-10, Dimensions(length=1, time=-2), name='angstroms_per_square_second', ascii_symbol='Ang/s^2', symbol='Ås⁻²') -angstroms_per_millisecond = NamedUnit(1e-07, Dimensions(length=1, time=-1), name='angstroms_per_millisecond', ascii_symbol='Ang/ms', symbol='Åms⁻¹') -angstroms_per_square_millisecond = NamedUnit(0.0001, Dimensions(length=1, time=-2), name='angstroms_per_square_millisecond', ascii_symbol='Ang/ms^2', symbol='Åms⁻²') -angstroms_per_microsecond = NamedUnit(0.0001, Dimensions(length=1, time=-1), name='angstroms_per_microsecond', ascii_symbol='Ang/us', symbol='ŵs⁻¹') -angstroms_per_square_microsecond = NamedUnit(100.0, Dimensions(length=1, time=-2), name='angstroms_per_square_microsecond', ascii_symbol='Ang/us^2', symbol='ŵs⁻²') -angstroms_per_nanosecond = NamedUnit(0.09999999999999999, Dimensions(length=1, time=-1), name='angstroms_per_nanosecond', ascii_symbol='Ang/ns', symbol='Åns⁻¹') -angstroms_per_square_nanosecond = NamedUnit(100000000.0, Dimensions(length=1, time=-2), name='angstroms_per_square_nanosecond', ascii_symbol='Ang/ns^2', symbol='Åns⁻²') -angstroms_per_picosecond = NamedUnit(100.0, Dimensions(length=1, time=-1), name='angstroms_per_picosecond', ascii_symbol='Ang/ps', symbol='Åps⁻¹') -angstroms_per_square_picosecond = NamedUnit(100000000000000.02, Dimensions(length=1, time=-2), name='angstroms_per_square_picosecond', ascii_symbol='Ang/ps^2', symbol='Åps⁻²') -angstroms_per_femtosecond = NamedUnit(100000.0, Dimensions(length=1, time=-1), name='angstroms_per_femtosecond', ascii_symbol='Ang/fs', symbol='Åfs⁻¹') -angstroms_per_square_femtosecond = NamedUnit(1e+20, Dimensions(length=1, time=-2), name='angstroms_per_square_femtosecond', ascii_symbol='Ang/fs^2', symbol='Åfs⁻²') -angstroms_per_attosecond = NamedUnit(100000000.0, Dimensions(length=1, time=-1), name='angstroms_per_attosecond', ascii_symbol='Ang/as', symbol='Åas⁻¹') -angstroms_per_square_attosecond = NamedUnit(9.999999999999999e+25, Dimensions(length=1, time=-2), name='angstroms_per_square_attosecond', ascii_symbol='Ang/as^2', symbol='Åas⁻²') -angstroms_per_minute = NamedUnit(1.6666666666666668e-12, Dimensions(length=1, time=-1), name='angstroms_per_minute', ascii_symbol='Ang/min', symbol='Åmin⁻¹') -angstroms_per_square_minute = NamedUnit(2.7777777777777778e-14, Dimensions(length=1, time=-2), name='angstroms_per_square_minute', ascii_symbol='Ang/min^2', symbol='Åmin⁻²') -angstroms_per_hour = NamedUnit(2.7777777777777778e-14, Dimensions(length=1, time=-1), name='angstroms_per_hour', ascii_symbol='Ang/h', symbol='Åh⁻¹') -angstroms_per_square_hour = NamedUnit(7.71604938271605e-18, Dimensions(length=1, time=-2), name='angstroms_per_square_hour', ascii_symbol='Ang/h^2', symbol='Åh⁻²') -angstroms_per_day = NamedUnit(1.1574074074074075e-15, Dimensions(length=1, time=-1), name='angstroms_per_day', ascii_symbol='Ang/d', symbol='Åd⁻¹') -angstroms_per_square_day = NamedUnit(1.3395919067215364e-20, Dimensions(length=1, time=-2), name='angstroms_per_square_day', ascii_symbol='Ang/d^2', symbol='Åd⁻²') -angstroms_per_year = NamedUnit(3.168873850681143e-18, Dimensions(length=1, time=-1), name='angstroms_per_year', ascii_symbol='Ang/y', symbol='Åy⁻¹') -angstroms_per_square_year = NamedUnit(1.0041761481530736e-25, Dimensions(length=1, time=-2), name='angstroms_per_square_year', ascii_symbol='Ang/y^2', symbol='Åy⁻²') -microns_per_second = NamedUnit(1e-06, Dimensions(length=1, time=-1), name='microns_per_second', ascii_symbol='micron/s', symbol='microns⁻¹') -microns_per_square_second = NamedUnit(1e-06, Dimensions(length=1, time=-2), name='microns_per_square_second', ascii_symbol='micron/s^2', symbol='microns⁻²') -microns_per_millisecond = NamedUnit(0.001, Dimensions(length=1, time=-1), name='microns_per_millisecond', ascii_symbol='micron/ms', symbol='micronms⁻¹') -microns_per_square_millisecond = NamedUnit(1.0, Dimensions(length=1, time=-2), name='microns_per_square_millisecond', ascii_symbol='micron/ms^2', symbol='micronms⁻²') -microns_per_microsecond = NamedUnit(1.0, Dimensions(length=1, time=-1), name='microns_per_microsecond', ascii_symbol='micron/us', symbol='micronµs⁻¹') -microns_per_square_microsecond = NamedUnit(1000000.0, Dimensions(length=1, time=-2), name='microns_per_square_microsecond', ascii_symbol='micron/us^2', symbol='micronµs⁻²') -microns_per_nanosecond = NamedUnit(999.9999999999999, Dimensions(length=1, time=-1), name='microns_per_nanosecond', ascii_symbol='micron/ns', symbol='micronns⁻¹') -microns_per_square_nanosecond = NamedUnit(999999999999.9999, Dimensions(length=1, time=-2), name='microns_per_square_nanosecond', ascii_symbol='micron/ns^2', symbol='micronns⁻²') -microns_per_picosecond = NamedUnit(1000000.0, Dimensions(length=1, time=-1), name='microns_per_picosecond', ascii_symbol='micron/ps', symbol='micronps⁻¹') -microns_per_square_picosecond = NamedUnit(1e+18, Dimensions(length=1, time=-2), name='microns_per_square_picosecond', ascii_symbol='micron/ps^2', symbol='micronps⁻²') -microns_per_femtosecond = NamedUnit(999999999.9999999, Dimensions(length=1, time=-1), name='microns_per_femtosecond', ascii_symbol='micron/fs', symbol='micronfs⁻¹') -microns_per_square_femtosecond = NamedUnit(9.999999999999998e+23, Dimensions(length=1, time=-2), name='microns_per_square_femtosecond', ascii_symbol='micron/fs^2', symbol='micronfs⁻²') -microns_per_attosecond = NamedUnit(999999999999.9999, Dimensions(length=1, time=-1), name='microns_per_attosecond', ascii_symbol='micron/as', symbol='micronas⁻¹') -microns_per_square_attosecond = NamedUnit(9.999999999999999e+29, Dimensions(length=1, time=-2), name='microns_per_square_attosecond', ascii_symbol='micron/as^2', symbol='micronas⁻²') -microns_per_minute = NamedUnit(1.6666666666666667e-08, Dimensions(length=1, time=-1), name='microns_per_minute', ascii_symbol='micron/min', symbol='micronmin⁻¹') -microns_per_square_minute = NamedUnit(2.7777777777777777e-10, Dimensions(length=1, time=-2), name='microns_per_square_minute', ascii_symbol='micron/min^2', symbol='micronmin⁻²') -microns_per_hour = NamedUnit(2.7777777777777777e-10, Dimensions(length=1, time=-1), name='microns_per_hour', ascii_symbol='micron/h', symbol='micronh⁻¹') -microns_per_square_hour = NamedUnit(7.71604938271605e-14, Dimensions(length=1, time=-2), name='microns_per_square_hour', ascii_symbol='micron/h^2', symbol='micronh⁻²') -microns_per_day = NamedUnit(1.1574074074074074e-11, Dimensions(length=1, time=-1), name='microns_per_day', ascii_symbol='micron/d', symbol='micrond⁻¹') -microns_per_square_day = NamedUnit(1.3395919067215363e-16, Dimensions(length=1, time=-2), name='microns_per_square_day', ascii_symbol='micron/d^2', symbol='micrond⁻²') -microns_per_year = NamedUnit(3.168873850681143e-14, Dimensions(length=1, time=-1), name='microns_per_year', ascii_symbol='micron/y', symbol='microny⁻¹') -microns_per_square_year = NamedUnit(1.0041761481530736e-21, Dimensions(length=1, time=-2), name='microns_per_square_year', ascii_symbol='micron/y^2', symbol='microny⁻²') -miles_per_second = NamedUnit(1609.344, Dimensions(length=1, time=-1), name='miles_per_second', ascii_symbol='miles/s', symbol='miless⁻¹') -miles_per_square_second = NamedUnit(1609.344, Dimensions(length=1, time=-2), name='miles_per_square_second', ascii_symbol='miles/s^2', symbol='miless⁻²') -miles_per_millisecond = NamedUnit(1609344.0, Dimensions(length=1, time=-1), name='miles_per_millisecond', ascii_symbol='miles/ms', symbol='milesms⁻¹') -miles_per_square_millisecond = NamedUnit(1609344000.0000002, Dimensions(length=1, time=-2), name='miles_per_square_millisecond', ascii_symbol='miles/ms^2', symbol='milesms⁻²') -miles_per_microsecond = NamedUnit(1609344000.0000002, Dimensions(length=1, time=-1), name='miles_per_microsecond', ascii_symbol='miles/us', symbol='milesµs⁻¹') -miles_per_square_microsecond = NamedUnit(1609344000000000.0, Dimensions(length=1, time=-2), name='miles_per_square_microsecond', ascii_symbol='miles/us^2', symbol='milesµs⁻²') -miles_per_nanosecond = NamedUnit(1609344000000.0, Dimensions(length=1, time=-1), name='miles_per_nanosecond', ascii_symbol='miles/ns', symbol='milesns⁻¹') -miles_per_square_nanosecond = NamedUnit(1.609344e+21, Dimensions(length=1, time=-2), name='miles_per_square_nanosecond', ascii_symbol='miles/ns^2', symbol='milesns⁻²') -miles_per_picosecond = NamedUnit(1609344000000000.0, Dimensions(length=1, time=-1), name='miles_per_picosecond', ascii_symbol='miles/ps', symbol='milesps⁻¹') -miles_per_square_picosecond = NamedUnit(1.609344e+27, Dimensions(length=1, time=-2), name='miles_per_square_picosecond', ascii_symbol='miles/ps^2', symbol='milesps⁻²') -miles_per_femtosecond = NamedUnit(1.609344e+18, Dimensions(length=1, time=-1), name='miles_per_femtosecond', ascii_symbol='miles/fs', symbol='milesfs⁻¹') -miles_per_square_femtosecond = NamedUnit(1.609344e+33, Dimensions(length=1, time=-2), name='miles_per_square_femtosecond', ascii_symbol='miles/fs^2', symbol='milesfs⁻²') -miles_per_attosecond = NamedUnit(1.609344e+21, Dimensions(length=1, time=-1), name='miles_per_attosecond', ascii_symbol='miles/as', symbol='milesas⁻¹') -miles_per_square_attosecond = NamedUnit(1.609344e+39, Dimensions(length=1, time=-2), name='miles_per_square_attosecond', ascii_symbol='miles/as^2', symbol='milesas⁻²') -miles_per_minute = NamedUnit(26.822400000000002, Dimensions(length=1, time=-1), name='miles_per_minute', ascii_symbol='miles/min', symbol='milesmin⁻¹') -miles_per_square_minute = NamedUnit(0.44704, Dimensions(length=1, time=-2), name='miles_per_square_minute', ascii_symbol='miles/min^2', symbol='milesmin⁻²') -miles_per_hour = NamedUnit(0.44704, Dimensions(length=1, time=-1), name='miles_per_hour', ascii_symbol='miles/h', symbol='milesh⁻¹') -miles_per_square_hour = NamedUnit(0.00012417777777777778, Dimensions(length=1, time=-2), name='miles_per_square_hour', ascii_symbol='miles/h^2', symbol='milesh⁻²') -miles_per_day = NamedUnit(0.018626666666666666, Dimensions(length=1, time=-1), name='miles_per_day', ascii_symbol='miles/d', symbol='milesd⁻¹') -miles_per_square_day = NamedUnit(2.1558641975308643e-07, Dimensions(length=1, time=-2), name='miles_per_square_day', ascii_symbol='miles/d^2', symbol='milesd⁻²') -miles_per_year = NamedUnit(5.099808118350594e-05, Dimensions(length=1, time=-1), name='miles_per_year', ascii_symbol='miles/y', symbol='milesy⁻¹') -miles_per_square_year = NamedUnit(1.61606485897326e-12, Dimensions(length=1, time=-2), name='miles_per_square_year', ascii_symbol='miles/y^2', symbol='milesy⁻²') -yards_per_second = NamedUnit(0.9144000000000001, Dimensions(length=1, time=-1), name='yards_per_second', ascii_symbol='yrd/s', symbol='yrds⁻¹') -yards_per_square_second = NamedUnit(0.9144000000000001, Dimensions(length=1, time=-2), name='yards_per_square_second', ascii_symbol='yrd/s^2', symbol='yrds⁻²') -yards_per_millisecond = NamedUnit(914.4000000000001, Dimensions(length=1, time=-1), name='yards_per_millisecond', ascii_symbol='yrd/ms', symbol='yrdms⁻¹') -yards_per_square_millisecond = NamedUnit(914400.0000000001, Dimensions(length=1, time=-2), name='yards_per_square_millisecond', ascii_symbol='yrd/ms^2', symbol='yrdms⁻²') -yards_per_microsecond = NamedUnit(914400.0000000001, Dimensions(length=1, time=-1), name='yards_per_microsecond', ascii_symbol='yrd/us', symbol='yrdµs⁻¹') -yards_per_square_microsecond = NamedUnit(914400000000.0001, Dimensions(length=1, time=-2), name='yards_per_square_microsecond', ascii_symbol='yrd/us^2', symbol='yrdµs⁻²') -yards_per_nanosecond = NamedUnit(914400000.0, Dimensions(length=1, time=-1), name='yards_per_nanosecond', ascii_symbol='yrd/ns', symbol='yrdns⁻¹') -yards_per_square_nanosecond = NamedUnit(9.144e+17, Dimensions(length=1, time=-2), name='yards_per_square_nanosecond', ascii_symbol='yrd/ns^2', symbol='yrdns⁻²') -yards_per_picosecond = NamedUnit(914400000000.0001, Dimensions(length=1, time=-1), name='yards_per_picosecond', ascii_symbol='yrd/ps', symbol='yrdps⁻¹') -yards_per_square_picosecond = NamedUnit(9.144000000000002e+23, Dimensions(length=1, time=-2), name='yards_per_square_picosecond', ascii_symbol='yrd/ps^2', symbol='yrdps⁻²') -yards_per_femtosecond = NamedUnit(914400000000000.0, Dimensions(length=1, time=-1), name='yards_per_femtosecond', ascii_symbol='yrd/fs', symbol='yrdfs⁻¹') -yards_per_square_femtosecond = NamedUnit(9.144e+29, Dimensions(length=1, time=-2), name='yards_per_square_femtosecond', ascii_symbol='yrd/fs^2', symbol='yrdfs⁻²') -yards_per_attosecond = NamedUnit(9.144e+17, Dimensions(length=1, time=-1), name='yards_per_attosecond', ascii_symbol='yrd/as', symbol='yrdas⁻¹') -yards_per_square_attosecond = NamedUnit(9.144e+35, Dimensions(length=1, time=-2), name='yards_per_square_attosecond', ascii_symbol='yrd/as^2', symbol='yrdas⁻²') -yards_per_minute = NamedUnit(0.015240000000000002, Dimensions(length=1, time=-1), name='yards_per_minute', ascii_symbol='yrd/min', symbol='yrdmin⁻¹') -yards_per_square_minute = NamedUnit(0.00025400000000000005, Dimensions(length=1, time=-2), name='yards_per_square_minute', ascii_symbol='yrd/min^2', symbol='yrdmin⁻²') -yards_per_hour = NamedUnit(0.00025400000000000005, Dimensions(length=1, time=-1), name='yards_per_hour', ascii_symbol='yrd/h', symbol='yrdh⁻¹') -yards_per_square_hour = NamedUnit(7.055555555555557e-08, Dimensions(length=1, time=-2), name='yards_per_square_hour', ascii_symbol='yrd/h^2', symbol='yrdh⁻²') -yards_per_day = NamedUnit(1.0583333333333334e-05, Dimensions(length=1, time=-1), name='yards_per_day', ascii_symbol='yrd/d', symbol='yrdd⁻¹') -yards_per_square_day = NamedUnit(1.224922839506173e-10, Dimensions(length=1, time=-2), name='yards_per_square_day', ascii_symbol='yrd/d^2', symbol='yrdd⁻²') -yards_per_year = NamedUnit(2.8976182490628376e-08, Dimensions(length=1, time=-1), name='yards_per_year', ascii_symbol='yrd/y', symbol='yrdy⁻¹') -yards_per_square_year = NamedUnit(9.182186698711705e-16, Dimensions(length=1, time=-2), name='yards_per_square_year', ascii_symbol='yrd/y^2', symbol='yrdy⁻²') -feet_per_second = NamedUnit(0.3048, Dimensions(length=1, time=-1), name='feet_per_second', ascii_symbol='ft/s', symbol='fts⁻¹') -feet_per_square_second = NamedUnit(0.3048, Dimensions(length=1, time=-2), name='feet_per_square_second', ascii_symbol='ft/s^2', symbol='fts⁻²') -feet_per_millisecond = NamedUnit(304.8, Dimensions(length=1, time=-1), name='feet_per_millisecond', ascii_symbol='ft/ms', symbol='ftms⁻¹') -feet_per_square_millisecond = NamedUnit(304800.00000000006, Dimensions(length=1, time=-2), name='feet_per_square_millisecond', ascii_symbol='ft/ms^2', symbol='ftms⁻²') -feet_per_microsecond = NamedUnit(304800.00000000006, Dimensions(length=1, time=-1), name='feet_per_microsecond', ascii_symbol='ft/us', symbol='ftµs⁻¹') -feet_per_square_microsecond = NamedUnit(304800000000.0, Dimensions(length=1, time=-2), name='feet_per_square_microsecond', ascii_symbol='ft/us^2', symbol='ftµs⁻²') -feet_per_nanosecond = NamedUnit(304800000.0, Dimensions(length=1, time=-1), name='feet_per_nanosecond', ascii_symbol='ft/ns', symbol='ftns⁻¹') -feet_per_square_nanosecond = NamedUnit(3.048e+17, Dimensions(length=1, time=-2), name='feet_per_square_nanosecond', ascii_symbol='ft/ns^2', symbol='ftns⁻²') -feet_per_picosecond = NamedUnit(304800000000.0, Dimensions(length=1, time=-1), name='feet_per_picosecond', ascii_symbol='ft/ps', symbol='ftps⁻¹') -feet_per_square_picosecond = NamedUnit(3.048e+23, Dimensions(length=1, time=-2), name='feet_per_square_picosecond', ascii_symbol='ft/ps^2', symbol='ftps⁻²') -feet_per_femtosecond = NamedUnit(304800000000000.0, Dimensions(length=1, time=-1), name='feet_per_femtosecond', ascii_symbol='ft/fs', symbol='ftfs⁻¹') -feet_per_square_femtosecond = NamedUnit(3.048e+29, Dimensions(length=1, time=-2), name='feet_per_square_femtosecond', ascii_symbol='ft/fs^2', symbol='ftfs⁻²') -feet_per_attosecond = NamedUnit(3.048e+17, Dimensions(length=1, time=-1), name='feet_per_attosecond', ascii_symbol='ft/as', symbol='ftas⁻¹') -feet_per_square_attosecond = NamedUnit(3.0479999999999997e+35, Dimensions(length=1, time=-2), name='feet_per_square_attosecond', ascii_symbol='ft/as^2', symbol='ftas⁻²') -feet_per_minute = NamedUnit(0.00508, Dimensions(length=1, time=-1), name='feet_per_minute', ascii_symbol='ft/min', symbol='ftmin⁻¹') -feet_per_square_minute = NamedUnit(8.466666666666667e-05, Dimensions(length=1, time=-2), name='feet_per_square_minute', ascii_symbol='ft/min^2', symbol='ftmin⁻²') -feet_per_hour = NamedUnit(8.466666666666667e-05, Dimensions(length=1, time=-1), name='feet_per_hour', ascii_symbol='ft/h', symbol='fth⁻¹') -feet_per_square_hour = NamedUnit(2.351851851851852e-08, Dimensions(length=1, time=-2), name='feet_per_square_hour', ascii_symbol='ft/h^2', symbol='fth⁻²') -feet_per_day = NamedUnit(3.527777777777778e-06, Dimensions(length=1, time=-1), name='feet_per_day', ascii_symbol='ft/d', symbol='ftd⁻¹') -feet_per_square_day = NamedUnit(4.083076131687243e-11, Dimensions(length=1, time=-2), name='feet_per_square_day', ascii_symbol='ft/d^2', symbol='ftd⁻²') -feet_per_year = NamedUnit(9.658727496876124e-09, Dimensions(length=1, time=-1), name='feet_per_year', ascii_symbol='ft/y', symbol='fty⁻¹') -feet_per_square_year = NamedUnit(3.060728899570568e-16, Dimensions(length=1, time=-2), name='feet_per_square_year', ascii_symbol='ft/y^2', symbol='fty⁻²') -inches_per_second = NamedUnit(0.0254, Dimensions(length=1, time=-1), name='inches_per_second', ascii_symbol='in/s', symbol='ins⁻¹') -inches_per_square_second = NamedUnit(0.0254, Dimensions(length=1, time=-2), name='inches_per_square_second', ascii_symbol='in/s^2', symbol='ins⁻²') -inches_per_millisecond = NamedUnit(25.4, Dimensions(length=1, time=-1), name='inches_per_millisecond', ascii_symbol='in/ms', symbol='inms⁻¹') -inches_per_square_millisecond = NamedUnit(25400.0, Dimensions(length=1, time=-2), name='inches_per_square_millisecond', ascii_symbol='in/ms^2', symbol='inms⁻²') -inches_per_microsecond = NamedUnit(25400.0, Dimensions(length=1, time=-1), name='inches_per_microsecond', ascii_symbol='in/us', symbol='inµs⁻¹') -inches_per_square_microsecond = NamedUnit(25400000000.0, Dimensions(length=1, time=-2), name='inches_per_square_microsecond', ascii_symbol='in/us^2', symbol='inµs⁻²') -inches_per_nanosecond = NamedUnit(25399999.999999996, Dimensions(length=1, time=-1), name='inches_per_nanosecond', ascii_symbol='in/ns', symbol='inns⁻¹') -inches_per_square_nanosecond = NamedUnit(2.5399999999999996e+16, Dimensions(length=1, time=-2), name='inches_per_square_nanosecond', ascii_symbol='in/ns^2', symbol='inns⁻²') -inches_per_picosecond = NamedUnit(25400000000.0, Dimensions(length=1, time=-1), name='inches_per_picosecond', ascii_symbol='in/ps', symbol='inps⁻¹') -inches_per_square_picosecond = NamedUnit(2.54e+22, Dimensions(length=1, time=-2), name='inches_per_square_picosecond', ascii_symbol='in/ps^2', symbol='inps⁻²') -inches_per_femtosecond = NamedUnit(25399999999999.996, Dimensions(length=1, time=-1), name='inches_per_femtosecond', ascii_symbol='in/fs', symbol='infs⁻¹') -inches_per_square_femtosecond = NamedUnit(2.54e+28, Dimensions(length=1, time=-2), name='inches_per_square_femtosecond', ascii_symbol='in/fs^2', symbol='infs⁻²') -inches_per_attosecond = NamedUnit(2.5399999999999996e+16, Dimensions(length=1, time=-1), name='inches_per_attosecond', ascii_symbol='in/as', symbol='inas⁻¹') -inches_per_square_attosecond = NamedUnit(2.5399999999999998e+34, Dimensions(length=1, time=-2), name='inches_per_square_attosecond', ascii_symbol='in/as^2', symbol='inas⁻²') -inches_per_minute = NamedUnit(0.00042333333333333334, Dimensions(length=1, time=-1), name='inches_per_minute', ascii_symbol='in/min', symbol='inmin⁻¹') -inches_per_square_minute = NamedUnit(7.055555555555555e-06, Dimensions(length=1, time=-2), name='inches_per_square_minute', ascii_symbol='in/min^2', symbol='inmin⁻²') -inches_per_hour = NamedUnit(7.055555555555555e-06, Dimensions(length=1, time=-1), name='inches_per_hour', ascii_symbol='in/h', symbol='inh⁻¹') -inches_per_square_hour = NamedUnit(1.9598765432098764e-09, Dimensions(length=1, time=-2), name='inches_per_square_hour', ascii_symbol='in/h^2', symbol='inh⁻²') -inches_per_day = NamedUnit(2.939814814814815e-07, Dimensions(length=1, time=-1), name='inches_per_day', ascii_symbol='in/d', symbol='ind⁻¹') -inches_per_square_day = NamedUnit(3.402563443072702e-12, Dimensions(length=1, time=-2), name='inches_per_square_day', ascii_symbol='in/d^2', symbol='ind⁻²') -inches_per_year = NamedUnit(8.048939580730103e-10, Dimensions(length=1, time=-1), name='inches_per_year', ascii_symbol='in/y', symbol='iny⁻¹') -inches_per_square_year = NamedUnit(2.550607416308807e-17, Dimensions(length=1, time=-2), name='inches_per_square_year', ascii_symbol='in/y^2', symbol='iny⁻²') -grams_per_cubic_meter = NamedUnit(0.001, Dimensions(length=-3, mass=1), name='grams_per_cubic_meter', ascii_symbol='g m^-3', symbol='gm⁻³') -exagrams_per_cubic_meter = NamedUnit(1000000000000000.0, Dimensions(length=-3, mass=1), name='exagrams_per_cubic_meter', ascii_symbol='Eg m^-3', symbol='Egm⁻³') -petagrams_per_cubic_meter = NamedUnit(1000000000000.0, Dimensions(length=-3, mass=1), name='petagrams_per_cubic_meter', ascii_symbol='Pg m^-3', symbol='Pgm⁻³') -teragrams_per_cubic_meter = NamedUnit(1000000000.0, Dimensions(length=-3, mass=1), name='teragrams_per_cubic_meter', ascii_symbol='Tg m^-3', symbol='Tgm⁻³') -gigagrams_per_cubic_meter = NamedUnit(1000000.0, Dimensions(length=-3, mass=1), name='gigagrams_per_cubic_meter', ascii_symbol='Gg m^-3', symbol='Ggm⁻³') -megagrams_per_cubic_meter = NamedUnit(1000.0, Dimensions(length=-3, mass=1), name='megagrams_per_cubic_meter', ascii_symbol='Mg m^-3', symbol='Mgm⁻³') -kilograms_per_cubic_meter = NamedUnit(1.0, Dimensions(length=-3, mass=1), name='kilograms_per_cubic_meter', ascii_symbol='kg m^-3', symbol='kgm⁻³') -milligrams_per_cubic_meter = NamedUnit(1e-06, Dimensions(length=-3, mass=1), name='milligrams_per_cubic_meter', ascii_symbol='mg m^-3', symbol='mgm⁻³') -micrograms_per_cubic_meter = NamedUnit(1e-09, Dimensions(length=-3, mass=1), name='micrograms_per_cubic_meter', ascii_symbol='ug m^-3', symbol='µgm⁻³') -nanograms_per_cubic_meter = NamedUnit(1.0000000000000002e-12, Dimensions(length=-3, mass=1), name='nanograms_per_cubic_meter', ascii_symbol='ng m^-3', symbol='ngm⁻³') -picograms_per_cubic_meter = NamedUnit(1e-15, Dimensions(length=-3, mass=1), name='picograms_per_cubic_meter', ascii_symbol='pg m^-3', symbol='pgm⁻³') -femtograms_per_cubic_meter = NamedUnit(1e-18, Dimensions(length=-3, mass=1), name='femtograms_per_cubic_meter', ascii_symbol='fg m^-3', symbol='fgm⁻³') -attograms_per_cubic_meter = NamedUnit(1.0000000000000001e-21, Dimensions(length=-3, mass=1), name='attograms_per_cubic_meter', ascii_symbol='ag m^-3', symbol='agm⁻³') -atomic_mass_units_per_cubic_meter = NamedUnit(1.660538921e-27, Dimensions(length=-3, mass=1), name='atomic_mass_units_per_cubic_meter', ascii_symbol='au m^-3', symbol='aum⁻³') -pounds_per_cubic_meter = NamedUnit(0.45359237, Dimensions(length=-3, mass=1), name='pounds_per_cubic_meter', ascii_symbol='lb m^-3', symbol='lbm⁻³') -ounces_per_cubic_meter = NamedUnit(0.028349523125, Dimensions(length=-3, mass=1), name='ounces_per_cubic_meter', ascii_symbol='oz m^-3', symbol='ozm⁻³') -grams_per_cubic_exameter = NamedUnit(1e-57, Dimensions(length=-3, mass=1), name='grams_per_cubic_exameter', ascii_symbol='g Em^-3', symbol='gEm⁻³') -exagrams_per_cubic_exameter = NamedUnit(1e-39, Dimensions(length=-3, mass=1), name='exagrams_per_cubic_exameter', ascii_symbol='Eg Em^-3', symbol='EgEm⁻³') -petagrams_per_cubic_exameter = NamedUnit(9.999999999999999e-43, Dimensions(length=-3, mass=1), name='petagrams_per_cubic_exameter', ascii_symbol='Pg Em^-3', symbol='PgEm⁻³') -teragrams_per_cubic_exameter = NamedUnit(1e-45, Dimensions(length=-3, mass=1), name='teragrams_per_cubic_exameter', ascii_symbol='Tg Em^-3', symbol='TgEm⁻³') -gigagrams_per_cubic_exameter = NamedUnit(1e-48, Dimensions(length=-3, mass=1), name='gigagrams_per_cubic_exameter', ascii_symbol='Gg Em^-3', symbol='GgEm⁻³') -megagrams_per_cubic_exameter = NamedUnit(9.999999999999999e-52, Dimensions(length=-3, mass=1), name='megagrams_per_cubic_exameter', ascii_symbol='Mg Em^-3', symbol='MgEm⁻³') -kilograms_per_cubic_exameter = NamedUnit(9.999999999999999e-55, Dimensions(length=-3, mass=1), name='kilograms_per_cubic_exameter', ascii_symbol='kg Em^-3', symbol='kgEm⁻³') -milligrams_per_cubic_exameter = NamedUnit(9.999999999999998e-61, Dimensions(length=-3, mass=1), name='milligrams_per_cubic_exameter', ascii_symbol='mg Em^-3', symbol='mgEm⁻³') -micrograms_per_cubic_exameter = NamedUnit(9.999999999999999e-64, Dimensions(length=-3, mass=1), name='micrograms_per_cubic_exameter', ascii_symbol='ug Em^-3', symbol='µgEm⁻³') -nanograms_per_cubic_exameter = NamedUnit(1.0000000000000001e-66, Dimensions(length=-3, mass=1), name='nanograms_per_cubic_exameter', ascii_symbol='ng Em^-3', symbol='ngEm⁻³') -picograms_per_cubic_exameter = NamedUnit(1e-69, Dimensions(length=-3, mass=1), name='picograms_per_cubic_exameter', ascii_symbol='pg Em^-3', symbol='pgEm⁻³') -femtograms_per_cubic_exameter = NamedUnit(1e-72, Dimensions(length=-3, mass=1), name='femtograms_per_cubic_exameter', ascii_symbol='fg Em^-3', symbol='fgEm⁻³') -attograms_per_cubic_exameter = NamedUnit(1e-75, Dimensions(length=-3, mass=1), name='attograms_per_cubic_exameter', ascii_symbol='ag Em^-3', symbol='agEm⁻³') -atomic_mass_units_per_cubic_exameter = NamedUnit(1.6605389209999996e-81, Dimensions(length=-3, mass=1), name='atomic_mass_units_per_cubic_exameter', ascii_symbol='au Em^-3', symbol='auEm⁻³') -pounds_per_cubic_exameter = NamedUnit(4.5359237e-55, Dimensions(length=-3, mass=1), name='pounds_per_cubic_exameter', ascii_symbol='lb Em^-3', symbol='lbEm⁻³') -ounces_per_cubic_exameter = NamedUnit(2.8349523125e-56, Dimensions(length=-3, mass=1), name='ounces_per_cubic_exameter', ascii_symbol='oz Em^-3', symbol='ozEm⁻³') -grams_per_cubic_petameter = NamedUnit(1.0000000000000001e-48, Dimensions(length=-3, mass=1), name='grams_per_cubic_petameter', ascii_symbol='g Pm^-3', symbol='gPm⁻³') -exagrams_per_cubic_petameter = NamedUnit(1e-30, Dimensions(length=-3, mass=1), name='exagrams_per_cubic_petameter', ascii_symbol='Eg Pm^-3', symbol='EgPm⁻³') -petagrams_per_cubic_petameter = NamedUnit(1e-33, Dimensions(length=-3, mass=1), name='petagrams_per_cubic_petameter', ascii_symbol='Pg Pm^-3', symbol='PgPm⁻³') -teragrams_per_cubic_petameter = NamedUnit(1.0000000000000001e-36, Dimensions(length=-3, mass=1), name='teragrams_per_cubic_petameter', ascii_symbol='Tg Pm^-3', symbol='TgPm⁻³') -gigagrams_per_cubic_petameter = NamedUnit(1.0000000000000001e-39, Dimensions(length=-3, mass=1), name='gigagrams_per_cubic_petameter', ascii_symbol='Gg Pm^-3', symbol='GgPm⁻³') -megagrams_per_cubic_petameter = NamedUnit(1e-42, Dimensions(length=-3, mass=1), name='megagrams_per_cubic_petameter', ascii_symbol='Mg Pm^-3', symbol='MgPm⁻³') -kilograms_per_cubic_petameter = NamedUnit(1.0000000000000001e-45, Dimensions(length=-3, mass=1), name='kilograms_per_cubic_petameter', ascii_symbol='kg Pm^-3', symbol='kgPm⁻³') -milligrams_per_cubic_petameter = NamedUnit(1e-51, Dimensions(length=-3, mass=1), name='milligrams_per_cubic_petameter', ascii_symbol='mg Pm^-3', symbol='mgPm⁻³') -micrograms_per_cubic_petameter = NamedUnit(1.0000000000000002e-54, Dimensions(length=-3, mass=1), name='micrograms_per_cubic_petameter', ascii_symbol='ug Pm^-3', symbol='µgPm⁻³') -nanograms_per_cubic_petameter = NamedUnit(1.0000000000000002e-57, Dimensions(length=-3, mass=1), name='nanograms_per_cubic_petameter', ascii_symbol='ng Pm^-3', symbol='ngPm⁻³') -picograms_per_cubic_petameter = NamedUnit(1.0000000000000001e-60, Dimensions(length=-3, mass=1), name='picograms_per_cubic_petameter', ascii_symbol='pg Pm^-3', symbol='pgPm⁻³') -femtograms_per_cubic_petameter = NamedUnit(1.0000000000000002e-63, Dimensions(length=-3, mass=1), name='femtograms_per_cubic_petameter', ascii_symbol='fg Pm^-3', symbol='fgPm⁻³') -attograms_per_cubic_petameter = NamedUnit(1.0000000000000001e-66, Dimensions(length=-3, mass=1), name='attograms_per_cubic_petameter', ascii_symbol='ag Pm^-3', symbol='agPm⁻³') -atomic_mass_units_per_cubic_petameter = NamedUnit(1.660538921e-72, Dimensions(length=-3, mass=1), name='atomic_mass_units_per_cubic_petameter', ascii_symbol='au Pm^-3', symbol='auPm⁻³') -pounds_per_cubic_petameter = NamedUnit(4.5359237000000005e-46, Dimensions(length=-3, mass=1), name='pounds_per_cubic_petameter', ascii_symbol='lb Pm^-3', symbol='lbPm⁻³') -ounces_per_cubic_petameter = NamedUnit(2.8349523125000003e-47, Dimensions(length=-3, mass=1), name='ounces_per_cubic_petameter', ascii_symbol='oz Pm^-3', symbol='ozPm⁻³') -grams_per_cubic_terameter = NamedUnit(1e-39, Dimensions(length=-3, mass=1), name='grams_per_cubic_terameter', ascii_symbol='g Tm^-3', symbol='gTm⁻³') -exagrams_per_cubic_terameter = NamedUnit(1e-21, Dimensions(length=-3, mass=1), name='exagrams_per_cubic_terameter', ascii_symbol='Eg Tm^-3', symbol='EgTm⁻³') -petagrams_per_cubic_terameter = NamedUnit(1e-24, Dimensions(length=-3, mass=1), name='petagrams_per_cubic_terameter', ascii_symbol='Pg Tm^-3', symbol='PgTm⁻³') -teragrams_per_cubic_terameter = NamedUnit(1e-27, Dimensions(length=-3, mass=1), name='teragrams_per_cubic_terameter', ascii_symbol='Tg Tm^-3', symbol='TgTm⁻³') -gigagrams_per_cubic_terameter = NamedUnit(9.999999999999999e-31, Dimensions(length=-3, mass=1), name='gigagrams_per_cubic_terameter', ascii_symbol='Gg Tm^-3', symbol='GgTm⁻³') -megagrams_per_cubic_terameter = NamedUnit(9.999999999999999e-34, Dimensions(length=-3, mass=1), name='megagrams_per_cubic_terameter', ascii_symbol='Mg Tm^-3', symbol='MgTm⁻³') -kilograms_per_cubic_terameter = NamedUnit(1e-36, Dimensions(length=-3, mass=1), name='kilograms_per_cubic_terameter', ascii_symbol='kg Tm^-3', symbol='kgTm⁻³') -milligrams_per_cubic_terameter = NamedUnit(9.999999999999999e-43, Dimensions(length=-3, mass=1), name='milligrams_per_cubic_terameter', ascii_symbol='mg Tm^-3', symbol='mgTm⁻³') -micrograms_per_cubic_terameter = NamedUnit(1e-45, Dimensions(length=-3, mass=1), name='micrograms_per_cubic_terameter', ascii_symbol='ug Tm^-3', symbol='µgTm⁻³') -nanograms_per_cubic_terameter = NamedUnit(1.0000000000000001e-48, Dimensions(length=-3, mass=1), name='nanograms_per_cubic_terameter', ascii_symbol='ng Tm^-3', symbol='ngTm⁻³') -picograms_per_cubic_terameter = NamedUnit(1e-51, Dimensions(length=-3, mass=1), name='picograms_per_cubic_terameter', ascii_symbol='pg Tm^-3', symbol='pgTm⁻³') -femtograms_per_cubic_terameter = NamedUnit(1e-54, Dimensions(length=-3, mass=1), name='femtograms_per_cubic_terameter', ascii_symbol='fg Tm^-3', symbol='fgTm⁻³') -attograms_per_cubic_terameter = NamedUnit(1.0000000000000001e-57, Dimensions(length=-3, mass=1), name='attograms_per_cubic_terameter', ascii_symbol='ag Tm^-3', symbol='agTm⁻³') -atomic_mass_units_per_cubic_terameter = NamedUnit(1.6605389209999997e-63, Dimensions(length=-3, mass=1), name='atomic_mass_units_per_cubic_terameter', ascii_symbol='au Tm^-3', symbol='auTm⁻³') -pounds_per_cubic_terameter = NamedUnit(4.5359237e-37, Dimensions(length=-3, mass=1), name='pounds_per_cubic_terameter', ascii_symbol='lb Tm^-3', symbol='lbTm⁻³') -ounces_per_cubic_terameter = NamedUnit(2.8349523125e-38, Dimensions(length=-3, mass=1), name='ounces_per_cubic_terameter', ascii_symbol='oz Tm^-3', symbol='ozTm⁻³') -grams_per_cubic_gigameter = NamedUnit(1e-30, Dimensions(length=-3, mass=1), name='grams_per_cubic_gigameter', ascii_symbol='g Gm^-3', symbol='gGm⁻³') -exagrams_per_cubic_gigameter = NamedUnit(1e-12, Dimensions(length=-3, mass=1), name='exagrams_per_cubic_gigameter', ascii_symbol='Eg Gm^-3', symbol='EgGm⁻³') -petagrams_per_cubic_gigameter = NamedUnit(1e-15, Dimensions(length=-3, mass=1), name='petagrams_per_cubic_gigameter', ascii_symbol='Pg Gm^-3', symbol='PgGm⁻³') -teragrams_per_cubic_gigameter = NamedUnit(1e-18, Dimensions(length=-3, mass=1), name='teragrams_per_cubic_gigameter', ascii_symbol='Tg Gm^-3', symbol='TgGm⁻³') -gigagrams_per_cubic_gigameter = NamedUnit(1e-21, Dimensions(length=-3, mass=1), name='gigagrams_per_cubic_gigameter', ascii_symbol='Gg Gm^-3', symbol='GgGm⁻³') -megagrams_per_cubic_gigameter = NamedUnit(1e-24, Dimensions(length=-3, mass=1), name='megagrams_per_cubic_gigameter', ascii_symbol='Mg Gm^-3', symbol='MgGm⁻³') -kilograms_per_cubic_gigameter = NamedUnit(1e-27, Dimensions(length=-3, mass=1), name='kilograms_per_cubic_gigameter', ascii_symbol='kg Gm^-3', symbol='kgGm⁻³') -milligrams_per_cubic_gigameter = NamedUnit(9.999999999999999e-34, Dimensions(length=-3, mass=1), name='milligrams_per_cubic_gigameter', ascii_symbol='mg Gm^-3', symbol='mgGm⁻³') -micrograms_per_cubic_gigameter = NamedUnit(1.0000000000000001e-36, Dimensions(length=-3, mass=1), name='micrograms_per_cubic_gigameter', ascii_symbol='ug Gm^-3', symbol='µgGm⁻³') -nanograms_per_cubic_gigameter = NamedUnit(1.0000000000000001e-39, Dimensions(length=-3, mass=1), name='nanograms_per_cubic_gigameter', ascii_symbol='ng Gm^-3', symbol='ngGm⁻³') -picograms_per_cubic_gigameter = NamedUnit(1e-42, Dimensions(length=-3, mass=1), name='picograms_per_cubic_gigameter', ascii_symbol='pg Gm^-3', symbol='pgGm⁻³') -femtograms_per_cubic_gigameter = NamedUnit(1e-45, Dimensions(length=-3, mass=1), name='femtograms_per_cubic_gigameter', ascii_symbol='fg Gm^-3', symbol='fgGm⁻³') -attograms_per_cubic_gigameter = NamedUnit(1.0000000000000001e-48, Dimensions(length=-3, mass=1), name='attograms_per_cubic_gigameter', ascii_symbol='ag Gm^-3', symbol='agGm⁻³') -atomic_mass_units_per_cubic_gigameter = NamedUnit(1.660538921e-54, Dimensions(length=-3, mass=1), name='atomic_mass_units_per_cubic_gigameter', ascii_symbol='au Gm^-3', symbol='auGm⁻³') -pounds_per_cubic_gigameter = NamedUnit(4.5359237e-28, Dimensions(length=-3, mass=1), name='pounds_per_cubic_gigameter', ascii_symbol='lb Gm^-3', symbol='lbGm⁻³') -ounces_per_cubic_gigameter = NamedUnit(2.8349523125e-29, Dimensions(length=-3, mass=1), name='ounces_per_cubic_gigameter', ascii_symbol='oz Gm^-3', symbol='ozGm⁻³') -grams_per_cubic_megameter = NamedUnit(1.0000000000000001e-21, Dimensions(length=-3, mass=1), name='grams_per_cubic_megameter', ascii_symbol='g Mm^-3', symbol='gMm⁻³') -exagrams_per_cubic_megameter = NamedUnit(0.001, Dimensions(length=-3, mass=1), name='exagrams_per_cubic_megameter', ascii_symbol='Eg Mm^-3', symbol='EgMm⁻³') -petagrams_per_cubic_megameter = NamedUnit(1e-06, Dimensions(length=-3, mass=1), name='petagrams_per_cubic_megameter', ascii_symbol='Pg Mm^-3', symbol='PgMm⁻³') -teragrams_per_cubic_megameter = NamedUnit(1e-09, Dimensions(length=-3, mass=1), name='teragrams_per_cubic_megameter', ascii_symbol='Tg Mm^-3', symbol='TgMm⁻³') -gigagrams_per_cubic_megameter = NamedUnit(1e-12, Dimensions(length=-3, mass=1), name='gigagrams_per_cubic_megameter', ascii_symbol='Gg Mm^-3', symbol='GgMm⁻³') -megagrams_per_cubic_megameter = NamedUnit(1e-15, Dimensions(length=-3, mass=1), name='megagrams_per_cubic_megameter', ascii_symbol='Mg Mm^-3', symbol='MgMm⁻³') -kilograms_per_cubic_megameter = NamedUnit(1e-18, Dimensions(length=-3, mass=1), name='kilograms_per_cubic_megameter', ascii_symbol='kg Mm^-3', symbol='kgMm⁻³') -milligrams_per_cubic_megameter = NamedUnit(1e-24, Dimensions(length=-3, mass=1), name='milligrams_per_cubic_megameter', ascii_symbol='mg Mm^-3', symbol='mgMm⁻³') -micrograms_per_cubic_megameter = NamedUnit(1e-27, Dimensions(length=-3, mass=1), name='micrograms_per_cubic_megameter', ascii_symbol='ug Mm^-3', symbol='µgMm⁻³') -nanograms_per_cubic_megameter = NamedUnit(1.0000000000000003e-30, Dimensions(length=-3, mass=1), name='nanograms_per_cubic_megameter', ascii_symbol='ng Mm^-3', symbol='ngMm⁻³') -picograms_per_cubic_megameter = NamedUnit(1e-33, Dimensions(length=-3, mass=1), name='picograms_per_cubic_megameter', ascii_symbol='pg Mm^-3', symbol='pgMm⁻³') -femtograms_per_cubic_megameter = NamedUnit(1.0000000000000001e-36, Dimensions(length=-3, mass=1), name='femtograms_per_cubic_megameter', ascii_symbol='fg Mm^-3', symbol='fgMm⁻³') -attograms_per_cubic_megameter = NamedUnit(1.0000000000000001e-39, Dimensions(length=-3, mass=1), name='attograms_per_cubic_megameter', ascii_symbol='ag Mm^-3', symbol='agMm⁻³') -atomic_mass_units_per_cubic_megameter = NamedUnit(1.6605389209999997e-45, Dimensions(length=-3, mass=1), name='atomic_mass_units_per_cubic_megameter', ascii_symbol='au Mm^-3', symbol='auMm⁻³') -pounds_per_cubic_megameter = NamedUnit(4.535923700000001e-19, Dimensions(length=-3, mass=1), name='pounds_per_cubic_megameter', ascii_symbol='lb Mm^-3', symbol='lbMm⁻³') -ounces_per_cubic_megameter = NamedUnit(2.8349523125000004e-20, Dimensions(length=-3, mass=1), name='ounces_per_cubic_megameter', ascii_symbol='oz Mm^-3', symbol='ozMm⁻³') -grams_per_cubic_kilometer = NamedUnit(1e-12, Dimensions(length=-3, mass=1), name='grams_per_cubic_kilometer', ascii_symbol='g km^-3', symbol='gkm⁻³') -exagrams_per_cubic_kilometer = NamedUnit(1000000.0, Dimensions(length=-3, mass=1), name='exagrams_per_cubic_kilometer', ascii_symbol='Eg km^-3', symbol='Egkm⁻³') -petagrams_per_cubic_kilometer = NamedUnit(1000.0, Dimensions(length=-3, mass=1), name='petagrams_per_cubic_kilometer', ascii_symbol='Pg km^-3', symbol='Pgkm⁻³') -teragrams_per_cubic_kilometer = NamedUnit(1.0, Dimensions(length=-3, mass=1), name='teragrams_per_cubic_kilometer', ascii_symbol='Tg km^-3', symbol='Tgkm⁻³') -gigagrams_per_cubic_kilometer = NamedUnit(0.001, Dimensions(length=-3, mass=1), name='gigagrams_per_cubic_kilometer', ascii_symbol='Gg km^-3', symbol='Ggkm⁻³') -megagrams_per_cubic_kilometer = NamedUnit(1e-06, Dimensions(length=-3, mass=1), name='megagrams_per_cubic_kilometer', ascii_symbol='Mg km^-3', symbol='Mgkm⁻³') -kilograms_per_cubic_kilometer = NamedUnit(1e-09, Dimensions(length=-3, mass=1), name='kilograms_per_cubic_kilometer', ascii_symbol='kg km^-3', symbol='kgkm⁻³') -milligrams_per_cubic_kilometer = NamedUnit(9.999999999999999e-16, Dimensions(length=-3, mass=1), name='milligrams_per_cubic_kilometer', ascii_symbol='mg km^-3', symbol='mgkm⁻³') -micrograms_per_cubic_kilometer = NamedUnit(1e-18, Dimensions(length=-3, mass=1), name='micrograms_per_cubic_kilometer', ascii_symbol='ug km^-3', symbol='µgkm⁻³') -nanograms_per_cubic_kilometer = NamedUnit(1.0000000000000001e-21, Dimensions(length=-3, mass=1), name='nanograms_per_cubic_kilometer', ascii_symbol='ng km^-3', symbol='ngkm⁻³') -picograms_per_cubic_kilometer = NamedUnit(1.0000000000000001e-24, Dimensions(length=-3, mass=1), name='picograms_per_cubic_kilometer', ascii_symbol='pg km^-3', symbol='pgkm⁻³') -femtograms_per_cubic_kilometer = NamedUnit(1e-27, Dimensions(length=-3, mass=1), name='femtograms_per_cubic_kilometer', ascii_symbol='fg km^-3', symbol='fgkm⁻³') -attograms_per_cubic_kilometer = NamedUnit(1e-30, Dimensions(length=-3, mass=1), name='attograms_per_cubic_kilometer', ascii_symbol='ag km^-3', symbol='agkm⁻³') -atomic_mass_units_per_cubic_kilometer = NamedUnit(1.6605389209999997e-36, Dimensions(length=-3, mass=1), name='atomic_mass_units_per_cubic_kilometer', ascii_symbol='au km^-3', symbol='aukm⁻³') -pounds_per_cubic_kilometer = NamedUnit(4.5359237000000004e-10, Dimensions(length=-3, mass=1), name='pounds_per_cubic_kilometer', ascii_symbol='lb km^-3', symbol='lbkm⁻³') -ounces_per_cubic_kilometer = NamedUnit(2.8349523125000003e-11, Dimensions(length=-3, mass=1), name='ounces_per_cubic_kilometer', ascii_symbol='oz km^-3', symbol='ozkm⁻³') -grams_per_cubic_millimeter = NamedUnit(1000000.0, Dimensions(length=-3, mass=1), name='grams_per_cubic_millimeter', ascii_symbol='g mm^-3', symbol='gmm⁻³') -exagrams_per_cubic_millimeter = NamedUnit(1e+24, Dimensions(length=-3, mass=1), name='exagrams_per_cubic_millimeter', ascii_symbol='Eg mm^-3', symbol='Egmm⁻³') -petagrams_per_cubic_millimeter = NamedUnit(1e+21, Dimensions(length=-3, mass=1), name='petagrams_per_cubic_millimeter', ascii_symbol='Pg mm^-3', symbol='Pgmm⁻³') -teragrams_per_cubic_millimeter = NamedUnit(1e+18, Dimensions(length=-3, mass=1), name='teragrams_per_cubic_millimeter', ascii_symbol='Tg mm^-3', symbol='Tgmm⁻³') -gigagrams_per_cubic_millimeter = NamedUnit(1000000000000000.0, Dimensions(length=-3, mass=1), name='gigagrams_per_cubic_millimeter', ascii_symbol='Gg mm^-3', symbol='Ggmm⁻³') -megagrams_per_cubic_millimeter = NamedUnit(999999999999.9999, Dimensions(length=-3, mass=1), name='megagrams_per_cubic_millimeter', ascii_symbol='Mg mm^-3', symbol='Mgmm⁻³') -kilograms_per_cubic_millimeter = NamedUnit(999999999.9999999, Dimensions(length=-3, mass=1), name='kilograms_per_cubic_millimeter', ascii_symbol='kg mm^-3', symbol='kgmm⁻³') -milligrams_per_cubic_millimeter = NamedUnit(999.9999999999999, Dimensions(length=-3, mass=1), name='milligrams_per_cubic_millimeter', ascii_symbol='mg mm^-3', symbol='mgmm⁻³') -micrograms_per_cubic_millimeter = NamedUnit(1.0, Dimensions(length=-3, mass=1), name='micrograms_per_cubic_millimeter', ascii_symbol='ug mm^-3', symbol='µgmm⁻³') -nanograms_per_cubic_millimeter = NamedUnit(0.001, Dimensions(length=-3, mass=1), name='nanograms_per_cubic_millimeter', ascii_symbol='ng mm^-3', symbol='ngmm⁻³') -picograms_per_cubic_millimeter = NamedUnit(1e-06, Dimensions(length=-3, mass=1), name='picograms_per_cubic_millimeter', ascii_symbol='pg mm^-3', symbol='pgmm⁻³') -femtograms_per_cubic_millimeter = NamedUnit(1e-09, Dimensions(length=-3, mass=1), name='femtograms_per_cubic_millimeter', ascii_symbol='fg mm^-3', symbol='fgmm⁻³') -attograms_per_cubic_millimeter = NamedUnit(1e-12, Dimensions(length=-3, mass=1), name='attograms_per_cubic_millimeter', ascii_symbol='ag mm^-3', symbol='agmm⁻³') -atomic_mass_units_per_cubic_millimeter = NamedUnit(1.6605389209999997e-18, Dimensions(length=-3, mass=1), name='atomic_mass_units_per_cubic_millimeter', ascii_symbol='au mm^-3', symbol='aumm⁻³') -pounds_per_cubic_millimeter = NamedUnit(453592370.0, Dimensions(length=-3, mass=1), name='pounds_per_cubic_millimeter', ascii_symbol='lb mm^-3', symbol='lbmm⁻³') -ounces_per_cubic_millimeter = NamedUnit(28349523.125, Dimensions(length=-3, mass=1), name='ounces_per_cubic_millimeter', ascii_symbol='oz mm^-3', symbol='ozmm⁻³') -grams_per_cubic_micrometer = NamedUnit(1000000000000000.1, Dimensions(length=-3, mass=1), name='grams_per_cubic_micrometer', ascii_symbol='g um^-3', symbol='gµm⁻³') -exagrams_per_cubic_micrometer = NamedUnit(1.0000000000000001e+33, Dimensions(length=-3, mass=1), name='exagrams_per_cubic_micrometer', ascii_symbol='Eg um^-3', symbol='Egµm⁻³') -petagrams_per_cubic_micrometer = NamedUnit(1.0000000000000002e+30, Dimensions(length=-3, mass=1), name='petagrams_per_cubic_micrometer', ascii_symbol='Pg um^-3', symbol='Pgµm⁻³') -teragrams_per_cubic_micrometer = NamedUnit(1.0000000000000002e+27, Dimensions(length=-3, mass=1), name='teragrams_per_cubic_micrometer', ascii_symbol='Tg um^-3', symbol='Tgµm⁻³') -gigagrams_per_cubic_micrometer = NamedUnit(1.0000000000000001e+24, Dimensions(length=-3, mass=1), name='gigagrams_per_cubic_micrometer', ascii_symbol='Gg um^-3', symbol='Ggµm⁻³') -megagrams_per_cubic_micrometer = NamedUnit(1.0000000000000001e+21, Dimensions(length=-3, mass=1), name='megagrams_per_cubic_micrometer', ascii_symbol='Mg um^-3', symbol='Mgµm⁻³') -kilograms_per_cubic_micrometer = NamedUnit(1.0000000000000001e+18, Dimensions(length=-3, mass=1), name='kilograms_per_cubic_micrometer', ascii_symbol='kg um^-3', symbol='kgµm⁻³') -milligrams_per_cubic_micrometer = NamedUnit(1000000000000.0001, Dimensions(length=-3, mass=1), name='milligrams_per_cubic_micrometer', ascii_symbol='mg um^-3', symbol='mgµm⁻³') -micrograms_per_cubic_micrometer = NamedUnit(1000000000.0000002, Dimensions(length=-3, mass=1), name='micrograms_per_cubic_micrometer', ascii_symbol='ug um^-3', symbol='µgµm⁻³') -nanograms_per_cubic_micrometer = NamedUnit(1000000.0000000003, Dimensions(length=-3, mass=1), name='nanograms_per_cubic_micrometer', ascii_symbol='ng um^-3', symbol='ngµm⁻³') -picograms_per_cubic_micrometer = NamedUnit(1000.0000000000002, Dimensions(length=-3, mass=1), name='picograms_per_cubic_micrometer', ascii_symbol='pg um^-3', symbol='pgµm⁻³') -femtograms_per_cubic_micrometer = NamedUnit(1.0000000000000002, Dimensions(length=-3, mass=1), name='femtograms_per_cubic_micrometer', ascii_symbol='fg um^-3', symbol='fgµm⁻³') -attograms_per_cubic_micrometer = NamedUnit(0.0010000000000000002, Dimensions(length=-3, mass=1), name='attograms_per_cubic_micrometer', ascii_symbol='ag um^-3', symbol='agµm⁻³') -atomic_mass_units_per_cubic_micrometer = NamedUnit(1.660538921e-09, Dimensions(length=-3, mass=1), name='atomic_mass_units_per_cubic_micrometer', ascii_symbol='au um^-3', symbol='auµm⁻³') -pounds_per_cubic_micrometer = NamedUnit(4.5359237000000006e+17, Dimensions(length=-3, mass=1), name='pounds_per_cubic_micrometer', ascii_symbol='lb um^-3', symbol='lbµm⁻³') -ounces_per_cubic_micrometer = NamedUnit(2.8349523125000004e+16, Dimensions(length=-3, mass=1), name='ounces_per_cubic_micrometer', ascii_symbol='oz um^-3', symbol='ozµm⁻³') -grams_per_cubic_nanometer = NamedUnit(9.999999999999998e+23, Dimensions(length=-3, mass=1), name='grams_per_cubic_nanometer', ascii_symbol='g nm^-3', symbol='gnm⁻³') -exagrams_per_cubic_nanometer = NamedUnit(9.999999999999997e+41, Dimensions(length=-3, mass=1), name='exagrams_per_cubic_nanometer', ascii_symbol='Eg nm^-3', symbol='Egnm⁻³') -petagrams_per_cubic_nanometer = NamedUnit(9.999999999999998e+38, Dimensions(length=-3, mass=1), name='petagrams_per_cubic_nanometer', ascii_symbol='Pg nm^-3', symbol='Pgnm⁻³') -teragrams_per_cubic_nanometer = NamedUnit(9.999999999999997e+35, Dimensions(length=-3, mass=1), name='teragrams_per_cubic_nanometer', ascii_symbol='Tg nm^-3', symbol='Tgnm⁻³') -gigagrams_per_cubic_nanometer = NamedUnit(9.999999999999998e+32, Dimensions(length=-3, mass=1), name='gigagrams_per_cubic_nanometer', ascii_symbol='Gg nm^-3', symbol='Ggnm⁻³') -megagrams_per_cubic_nanometer = NamedUnit(9.999999999999997e+29, Dimensions(length=-3, mass=1), name='megagrams_per_cubic_nanometer', ascii_symbol='Mg nm^-3', symbol='Mgnm⁻³') -kilograms_per_cubic_nanometer = NamedUnit(9.999999999999997e+26, Dimensions(length=-3, mass=1), name='kilograms_per_cubic_nanometer', ascii_symbol='kg nm^-3', symbol='kgnm⁻³') -milligrams_per_cubic_nanometer = NamedUnit(9.999999999999997e+20, Dimensions(length=-3, mass=1), name='milligrams_per_cubic_nanometer', ascii_symbol='mg nm^-3', symbol='mgnm⁻³') -micrograms_per_cubic_nanometer = NamedUnit(9.999999999999999e+17, Dimensions(length=-3, mass=1), name='micrograms_per_cubic_nanometer', ascii_symbol='ug nm^-3', symbol='µgnm⁻³') -nanograms_per_cubic_nanometer = NamedUnit(1000000000000000.0, Dimensions(length=-3, mass=1), name='nanograms_per_cubic_nanometer', ascii_symbol='ng nm^-3', symbol='ngnm⁻³') -picograms_per_cubic_nanometer = NamedUnit(999999999999.9999, Dimensions(length=-3, mass=1), name='picograms_per_cubic_nanometer', ascii_symbol='pg nm^-3', symbol='pgnm⁻³') -femtograms_per_cubic_nanometer = NamedUnit(999999999.9999999, Dimensions(length=-3, mass=1), name='femtograms_per_cubic_nanometer', ascii_symbol='fg nm^-3', symbol='fgnm⁻³') -attograms_per_cubic_nanometer = NamedUnit(999999.9999999999, Dimensions(length=-3, mass=1), name='attograms_per_cubic_nanometer', ascii_symbol='ag nm^-3', symbol='agnm⁻³') -atomic_mass_units_per_cubic_nanometer = NamedUnit(1.6605389209999994, Dimensions(length=-3, mass=1), name='atomic_mass_units_per_cubic_nanometer', ascii_symbol='au nm^-3', symbol='aunm⁻³') -pounds_per_cubic_nanometer = NamedUnit(4.535923699999999e+26, Dimensions(length=-3, mass=1), name='pounds_per_cubic_nanometer', ascii_symbol='lb nm^-3', symbol='lbnm⁻³') -ounces_per_cubic_nanometer = NamedUnit(2.8349523124999993e+25, Dimensions(length=-3, mass=1), name='ounces_per_cubic_nanometer', ascii_symbol='oz nm^-3', symbol='oznm⁻³') -grams_per_cubic_picometer = NamedUnit(1.0000000000000001e+33, Dimensions(length=-3, mass=1), name='grams_per_cubic_picometer', ascii_symbol='g pm^-3', symbol='gpm⁻³') -exagrams_per_cubic_picometer = NamedUnit(1e+51, Dimensions(length=-3, mass=1), name='exagrams_per_cubic_picometer', ascii_symbol='Eg pm^-3', symbol='Egpm⁻³') -petagrams_per_cubic_picometer = NamedUnit(1e+48, Dimensions(length=-3, mass=1), name='petagrams_per_cubic_picometer', ascii_symbol='Pg pm^-3', symbol='Pgpm⁻³') -teragrams_per_cubic_picometer = NamedUnit(1.0000000000000001e+45, Dimensions(length=-3, mass=1), name='teragrams_per_cubic_picometer', ascii_symbol='Tg pm^-3', symbol='Tgpm⁻³') -gigagrams_per_cubic_picometer = NamedUnit(1e+42, Dimensions(length=-3, mass=1), name='gigagrams_per_cubic_picometer', ascii_symbol='Gg pm^-3', symbol='Ggpm⁻³') -megagrams_per_cubic_picometer = NamedUnit(1.0000000000000001e+39, Dimensions(length=-3, mass=1), name='megagrams_per_cubic_picometer', ascii_symbol='Mg pm^-3', symbol='Mgpm⁻³') -kilograms_per_cubic_picometer = NamedUnit(1e+36, Dimensions(length=-3, mass=1), name='kilograms_per_cubic_picometer', ascii_symbol='kg pm^-3', symbol='kgpm⁻³') -milligrams_per_cubic_picometer = NamedUnit(1e+30, Dimensions(length=-3, mass=1), name='milligrams_per_cubic_picometer', ascii_symbol='mg pm^-3', symbol='mgpm⁻³') -micrograms_per_cubic_picometer = NamedUnit(1.0000000000000002e+27, Dimensions(length=-3, mass=1), name='micrograms_per_cubic_picometer', ascii_symbol='ug pm^-3', symbol='µgpm⁻³') -nanograms_per_cubic_picometer = NamedUnit(1.0000000000000003e+24, Dimensions(length=-3, mass=1), name='nanograms_per_cubic_picometer', ascii_symbol='ng pm^-3', symbol='ngpm⁻³') -picograms_per_cubic_picometer = NamedUnit(1.0000000000000001e+21, Dimensions(length=-3, mass=1), name='picograms_per_cubic_picometer', ascii_symbol='pg pm^-3', symbol='pgpm⁻³') -femtograms_per_cubic_picometer = NamedUnit(1.0000000000000001e+18, Dimensions(length=-3, mass=1), name='femtograms_per_cubic_picometer', ascii_symbol='fg pm^-3', symbol='fgpm⁻³') -attograms_per_cubic_picometer = NamedUnit(1000000000000000.1, Dimensions(length=-3, mass=1), name='attograms_per_cubic_picometer', ascii_symbol='ag pm^-3', symbol='agpm⁻³') -atomic_mass_units_per_cubic_picometer = NamedUnit(1660538921.0, Dimensions(length=-3, mass=1), name='atomic_mass_units_per_cubic_picometer', ascii_symbol='au pm^-3', symbol='aupm⁻³') -pounds_per_cubic_picometer = NamedUnit(4.5359237000000005e+35, Dimensions(length=-3, mass=1), name='pounds_per_cubic_picometer', ascii_symbol='lb pm^-3', symbol='lbpm⁻³') -ounces_per_cubic_picometer = NamedUnit(2.8349523125000003e+34, Dimensions(length=-3, mass=1), name='ounces_per_cubic_picometer', ascii_symbol='oz pm^-3', symbol='ozpm⁻³') -grams_per_cubic_femtometer = NamedUnit(9.999999999999997e+41, Dimensions(length=-3, mass=1), name='grams_per_cubic_femtometer', ascii_symbol='g fm^-3', symbol='gfm⁻³') -exagrams_per_cubic_femtometer = NamedUnit(9.999999999999998e+59, Dimensions(length=-3, mass=1), name='exagrams_per_cubic_femtometer', ascii_symbol='Eg fm^-3', symbol='Egfm⁻³') -petagrams_per_cubic_femtometer = NamedUnit(9.999999999999997e+56, Dimensions(length=-3, mass=1), name='petagrams_per_cubic_femtometer', ascii_symbol='Pg fm^-3', symbol='Pgfm⁻³') -teragrams_per_cubic_femtometer = NamedUnit(9.999999999999997e+53, Dimensions(length=-3, mass=1), name='teragrams_per_cubic_femtometer', ascii_symbol='Tg fm^-3', symbol='Tgfm⁻³') -gigagrams_per_cubic_femtometer = NamedUnit(9.999999999999997e+50, Dimensions(length=-3, mass=1), name='gigagrams_per_cubic_femtometer', ascii_symbol='Gg fm^-3', symbol='Ggfm⁻³') -megagrams_per_cubic_femtometer = NamedUnit(9.999999999999997e+47, Dimensions(length=-3, mass=1), name='megagrams_per_cubic_femtometer', ascii_symbol='Mg fm^-3', symbol='Mgfm⁻³') -kilograms_per_cubic_femtometer = NamedUnit(9.999999999999998e+44, Dimensions(length=-3, mass=1), name='kilograms_per_cubic_femtometer', ascii_symbol='kg fm^-3', symbol='kgfm⁻³') -milligrams_per_cubic_femtometer = NamedUnit(9.999999999999996e+38, Dimensions(length=-3, mass=1), name='milligrams_per_cubic_femtometer', ascii_symbol='mg fm^-3', symbol='mgfm⁻³') -micrograms_per_cubic_femtometer = NamedUnit(9.999999999999997e+35, Dimensions(length=-3, mass=1), name='micrograms_per_cubic_femtometer', ascii_symbol='ug fm^-3', symbol='µgfm⁻³') -nanograms_per_cubic_femtometer = NamedUnit(1e+33, Dimensions(length=-3, mass=1), name='nanograms_per_cubic_femtometer', ascii_symbol='ng fm^-3', symbol='ngfm⁻³') -picograms_per_cubic_femtometer = NamedUnit(9.999999999999997e+29, Dimensions(length=-3, mass=1), name='picograms_per_cubic_femtometer', ascii_symbol='pg fm^-3', symbol='pgfm⁻³') -femtograms_per_cubic_femtometer = NamedUnit(9.999999999999997e+26, Dimensions(length=-3, mass=1), name='femtograms_per_cubic_femtometer', ascii_symbol='fg fm^-3', symbol='fgfm⁻³') -attograms_per_cubic_femtometer = NamedUnit(9.999999999999998e+23, Dimensions(length=-3, mass=1), name='attograms_per_cubic_femtometer', ascii_symbol='ag fm^-3', symbol='agfm⁻³') -atomic_mass_units_per_cubic_femtometer = NamedUnit(1.6605389209999992e+18, Dimensions(length=-3, mass=1), name='atomic_mass_units_per_cubic_femtometer', ascii_symbol='au fm^-3', symbol='aufm⁻³') -pounds_per_cubic_femtometer = NamedUnit(4.5359236999999985e+44, Dimensions(length=-3, mass=1), name='pounds_per_cubic_femtometer', ascii_symbol='lb fm^-3', symbol='lbfm⁻³') -ounces_per_cubic_femtometer = NamedUnit(2.834952312499999e+43, Dimensions(length=-3, mass=1), name='ounces_per_cubic_femtometer', ascii_symbol='oz fm^-3', symbol='ozfm⁻³') -grams_per_cubic_attometer = NamedUnit(9.999999999999998e+50, Dimensions(length=-3, mass=1), name='grams_per_cubic_attometer', ascii_symbol='g am^-3', symbol='gam⁻³') -exagrams_per_cubic_attometer = NamedUnit(9.999999999999999e+68, Dimensions(length=-3, mass=1), name='exagrams_per_cubic_attometer', ascii_symbol='Eg am^-3', symbol='Egam⁻³') -petagrams_per_cubic_attometer = NamedUnit(9.999999999999998e+65, Dimensions(length=-3, mass=1), name='petagrams_per_cubic_attometer', ascii_symbol='Pg am^-3', symbol='Pgam⁻³') -teragrams_per_cubic_attometer = NamedUnit(9.999999999999999e+62, Dimensions(length=-3, mass=1), name='teragrams_per_cubic_attometer', ascii_symbol='Tg am^-3', symbol='Tgam⁻³') -gigagrams_per_cubic_attometer = NamedUnit(9.999999999999998e+59, Dimensions(length=-3, mass=1), name='gigagrams_per_cubic_attometer', ascii_symbol='Gg am^-3', symbol='Ggam⁻³') -megagrams_per_cubic_attometer = NamedUnit(9.999999999999999e+56, Dimensions(length=-3, mass=1), name='megagrams_per_cubic_attometer', ascii_symbol='Mg am^-3', symbol='Mgam⁻³') -kilograms_per_cubic_attometer = NamedUnit(9.999999999999999e+53, Dimensions(length=-3, mass=1), name='kilograms_per_cubic_attometer', ascii_symbol='kg am^-3', symbol='kgam⁻³') -milligrams_per_cubic_attometer = NamedUnit(9.999999999999997e+47, Dimensions(length=-3, mass=1), name='milligrams_per_cubic_attometer', ascii_symbol='mg am^-3', symbol='mgam⁻³') -micrograms_per_cubic_attometer = NamedUnit(1e+45, Dimensions(length=-3, mass=1), name='micrograms_per_cubic_attometer', ascii_symbol='ug am^-3', symbol='µgam⁻³') -nanograms_per_cubic_attometer = NamedUnit(1e+42, Dimensions(length=-3, mass=1), name='nanograms_per_cubic_attometer', ascii_symbol='ng am^-3', symbol='ngam⁻³') -picograms_per_cubic_attometer = NamedUnit(1e+39, Dimensions(length=-3, mass=1), name='picograms_per_cubic_attometer', ascii_symbol='pg am^-3', symbol='pgam⁻³') -femtograms_per_cubic_attometer = NamedUnit(9.999999999999999e+35, Dimensions(length=-3, mass=1), name='femtograms_per_cubic_attometer', ascii_symbol='fg am^-3', symbol='fgam⁻³') -attograms_per_cubic_attometer = NamedUnit(1e+33, Dimensions(length=-3, mass=1), name='attograms_per_cubic_attometer', ascii_symbol='ag am^-3', symbol='agam⁻³') -atomic_mass_units_per_cubic_attometer = NamedUnit(1.6605389209999997e+27, Dimensions(length=-3, mass=1), name='atomic_mass_units_per_cubic_attometer', ascii_symbol='au am^-3', symbol='auam⁻³') -pounds_per_cubic_attometer = NamedUnit(4.5359237e+53, Dimensions(length=-3, mass=1), name='pounds_per_cubic_attometer', ascii_symbol='lb am^-3', symbol='lbam⁻³') -ounces_per_cubic_attometer = NamedUnit(2.8349523125e+52, Dimensions(length=-3, mass=1), name='ounces_per_cubic_attometer', ascii_symbol='oz am^-3', symbol='ozam⁻³') -grams_per_cubic_decimeter = NamedUnit(0.9999999999999998, Dimensions(length=-3, mass=1), name='grams_per_cubic_decimeter', ascii_symbol='g dm^-3', symbol='gdm⁻³') -exagrams_per_cubic_decimeter = NamedUnit(9.999999999999997e+17, Dimensions(length=-3, mass=1), name='exagrams_per_cubic_decimeter', ascii_symbol='Eg dm^-3', symbol='Egdm⁻³') -petagrams_per_cubic_decimeter = NamedUnit(999999999999999.8, Dimensions(length=-3, mass=1), name='petagrams_per_cubic_decimeter', ascii_symbol='Pg dm^-3', symbol='Pgdm⁻³') -teragrams_per_cubic_decimeter = NamedUnit(999999999999.9998, Dimensions(length=-3, mass=1), name='teragrams_per_cubic_decimeter', ascii_symbol='Tg dm^-3', symbol='Tgdm⁻³') -gigagrams_per_cubic_decimeter = NamedUnit(999999999.9999998, Dimensions(length=-3, mass=1), name='gigagrams_per_cubic_decimeter', ascii_symbol='Gg dm^-3', symbol='Ggdm⁻³') -megagrams_per_cubic_decimeter = NamedUnit(999999.9999999998, Dimensions(length=-3, mass=1), name='megagrams_per_cubic_decimeter', ascii_symbol='Mg dm^-3', symbol='Mgdm⁻³') -kilograms_per_cubic_decimeter = NamedUnit(999.9999999999998, Dimensions(length=-3, mass=1), name='kilograms_per_cubic_decimeter', ascii_symbol='kg dm^-3', symbol='kgdm⁻³') -milligrams_per_cubic_decimeter = NamedUnit(0.0009999999999999998, Dimensions(length=-3, mass=1), name='milligrams_per_cubic_decimeter', ascii_symbol='mg dm^-3', symbol='mgdm⁻³') -micrograms_per_cubic_decimeter = NamedUnit(9.999999999999997e-07, Dimensions(length=-3, mass=1), name='micrograms_per_cubic_decimeter', ascii_symbol='ug dm^-3', symbol='µgdm⁻³') -nanograms_per_cubic_decimeter = NamedUnit(9.999999999999999e-10, Dimensions(length=-3, mass=1), name='nanograms_per_cubic_decimeter', ascii_symbol='ng dm^-3', symbol='ngdm⁻³') -picograms_per_cubic_decimeter = NamedUnit(9.999999999999998e-13, Dimensions(length=-3, mass=1), name='picograms_per_cubic_decimeter', ascii_symbol='pg dm^-3', symbol='pgdm⁻³') -femtograms_per_cubic_decimeter = NamedUnit(9.999999999999999e-16, Dimensions(length=-3, mass=1), name='femtograms_per_cubic_decimeter', ascii_symbol='fg dm^-3', symbol='fgdm⁻³') -attograms_per_cubic_decimeter = NamedUnit(9.999999999999999e-19, Dimensions(length=-3, mass=1), name='attograms_per_cubic_decimeter', ascii_symbol='ag dm^-3', symbol='agdm⁻³') -atomic_mass_units_per_cubic_decimeter = NamedUnit(1.6605389209999993e-24, Dimensions(length=-3, mass=1), name='atomic_mass_units_per_cubic_decimeter', ascii_symbol='au dm^-3', symbol='audm⁻³') -pounds_per_cubic_decimeter = NamedUnit(453.5923699999999, Dimensions(length=-3, mass=1), name='pounds_per_cubic_decimeter', ascii_symbol='lb dm^-3', symbol='lbdm⁻³') -ounces_per_cubic_decimeter = NamedUnit(28.349523124999994, Dimensions(length=-3, mass=1), name='ounces_per_cubic_decimeter', ascii_symbol='oz dm^-3', symbol='ozdm⁻³') -grams_per_cubic_centimeter = NamedUnit(999.9999999999999, Dimensions(length=-3, mass=1), name='grams_per_cubic_centimeter', ascii_symbol='g cm^-3', symbol='gcm⁻³') -exagrams_per_cubic_centimeter = NamedUnit(9.999999999999999e+20, Dimensions(length=-3, mass=1), name='exagrams_per_cubic_centimeter', ascii_symbol='Eg cm^-3', symbol='Egcm⁻³') -petagrams_per_cubic_centimeter = NamedUnit(9.999999999999999e+17, Dimensions(length=-3, mass=1), name='petagrams_per_cubic_centimeter', ascii_symbol='Pg cm^-3', symbol='Pgcm⁻³') -teragrams_per_cubic_centimeter = NamedUnit(999999999999999.9, Dimensions(length=-3, mass=1), name='teragrams_per_cubic_centimeter', ascii_symbol='Tg cm^-3', symbol='Tgcm⁻³') -gigagrams_per_cubic_centimeter = NamedUnit(999999999999.9999, Dimensions(length=-3, mass=1), name='gigagrams_per_cubic_centimeter', ascii_symbol='Gg cm^-3', symbol='Ggcm⁻³') -megagrams_per_cubic_centimeter = NamedUnit(999999999.9999999, Dimensions(length=-3, mass=1), name='megagrams_per_cubic_centimeter', ascii_symbol='Mg cm^-3', symbol='Mgcm⁻³') -kilograms_per_cubic_centimeter = NamedUnit(999999.9999999999, Dimensions(length=-3, mass=1), name='kilograms_per_cubic_centimeter', ascii_symbol='kg cm^-3', symbol='kgcm⁻³') -milligrams_per_cubic_centimeter = NamedUnit(0.9999999999999998, Dimensions(length=-3, mass=1), name='milligrams_per_cubic_centimeter', ascii_symbol='mg cm^-3', symbol='mgcm⁻³') -micrograms_per_cubic_centimeter = NamedUnit(0.0009999999999999998, Dimensions(length=-3, mass=1), name='micrograms_per_cubic_centimeter', ascii_symbol='ug cm^-3', symbol='µgcm⁻³') -nanograms_per_cubic_centimeter = NamedUnit(1e-06, Dimensions(length=-3, mass=1), name='nanograms_per_cubic_centimeter', ascii_symbol='ng cm^-3', symbol='ngcm⁻³') -picograms_per_cubic_centimeter = NamedUnit(9.999999999999999e-10, Dimensions(length=-3, mass=1), name='picograms_per_cubic_centimeter', ascii_symbol='pg cm^-3', symbol='pgcm⁻³') -femtograms_per_cubic_centimeter = NamedUnit(1e-12, Dimensions(length=-3, mass=1), name='femtograms_per_cubic_centimeter', ascii_symbol='fg cm^-3', symbol='fgcm⁻³') -attograms_per_cubic_centimeter = NamedUnit(9.999999999999999e-16, Dimensions(length=-3, mass=1), name='attograms_per_cubic_centimeter', ascii_symbol='ag cm^-3', symbol='agcm⁻³') -atomic_mass_units_per_cubic_centimeter = NamedUnit(1.6605389209999996e-21, Dimensions(length=-3, mass=1), name='atomic_mass_units_per_cubic_centimeter', ascii_symbol='au cm^-3', symbol='aucm⁻³') -pounds_per_cubic_centimeter = NamedUnit(453592.36999999994, Dimensions(length=-3, mass=1), name='pounds_per_cubic_centimeter', ascii_symbol='lb cm^-3', symbol='lbcm⁻³') -ounces_per_cubic_centimeter = NamedUnit(28349.523124999996, Dimensions(length=-3, mass=1), name='ounces_per_cubic_centimeter', ascii_symbol='oz cm^-3', symbol='ozcm⁻³') -grams_per_cubic_angstrom = NamedUnit(9.999999999999999e+26, Dimensions(length=-3, mass=1), name='grams_per_cubic_angstrom', ascii_symbol='g Ang^-3', symbol='gÅ⁻³') -exagrams_per_cubic_angstrom = NamedUnit(1e+45, Dimensions(length=-3, mass=1), name='exagrams_per_cubic_angstrom', ascii_symbol='Eg Ang^-3', symbol='EgÅ⁻³') -petagrams_per_cubic_angstrom = NamedUnit(9.999999999999999e+41, Dimensions(length=-3, mass=1), name='petagrams_per_cubic_angstrom', ascii_symbol='Pg Ang^-3', symbol='PgÅ⁻³') -teragrams_per_cubic_angstrom = NamedUnit(1e+39, Dimensions(length=-3, mass=1), name='teragrams_per_cubic_angstrom', ascii_symbol='Tg Ang^-3', symbol='TgÅ⁻³') -gigagrams_per_cubic_angstrom = NamedUnit(9.999999999999999e+35, Dimensions(length=-3, mass=1), name='gigagrams_per_cubic_angstrom', ascii_symbol='Gg Ang^-3', symbol='GgÅ⁻³') -megagrams_per_cubic_angstrom = NamedUnit(1e+33, Dimensions(length=-3, mass=1), name='megagrams_per_cubic_angstrom', ascii_symbol='Mg Ang^-3', symbol='MgÅ⁻³') -kilograms_per_cubic_angstrom = NamedUnit(9.999999999999999e+29, Dimensions(length=-3, mass=1), name='kilograms_per_cubic_angstrom', ascii_symbol='kg Ang^-3', symbol='kgÅ⁻³') -milligrams_per_cubic_angstrom = NamedUnit(9.999999999999998e+23, Dimensions(length=-3, mass=1), name='milligrams_per_cubic_angstrom', ascii_symbol='mg Ang^-3', symbol='mgÅ⁻³') -micrograms_per_cubic_angstrom = NamedUnit(1e+21, Dimensions(length=-3, mass=1), name='micrograms_per_cubic_angstrom', ascii_symbol='ug Ang^-3', symbol='µgÅ⁻³') -nanograms_per_cubic_angstrom = NamedUnit(1.0000000000000001e+18, Dimensions(length=-3, mass=1), name='nanograms_per_cubic_angstrom', ascii_symbol='ng Ang^-3', symbol='ngÅ⁻³') -picograms_per_cubic_angstrom = NamedUnit(1000000000000000.0, Dimensions(length=-3, mass=1), name='picograms_per_cubic_angstrom', ascii_symbol='pg Ang^-3', symbol='pgÅ⁻³') -femtograms_per_cubic_angstrom = NamedUnit(1000000000000.0, Dimensions(length=-3, mass=1), name='femtograms_per_cubic_angstrom', ascii_symbol='fg Ang^-3', symbol='fgÅ⁻³') -attograms_per_cubic_angstrom = NamedUnit(1000000000.0, Dimensions(length=-3, mass=1), name='attograms_per_cubic_angstrom', ascii_symbol='ag Ang^-3', symbol='agÅ⁻³') -atomic_mass_units_per_cubic_angstrom = NamedUnit(1660.5389209999996, Dimensions(length=-3, mass=1), name='atomic_mass_units_per_cubic_angstrom', ascii_symbol='au Ang^-3', symbol='auÅ⁻³') -pounds_per_cubic_angstrom = NamedUnit(4.5359237e+29, Dimensions(length=-3, mass=1), name='pounds_per_cubic_angstrom', ascii_symbol='lb Ang^-3', symbol='lbÅ⁻³') -ounces_per_cubic_angstrom = NamedUnit(2.8349523125e+28, Dimensions(length=-3, mass=1), name='ounces_per_cubic_angstrom', ascii_symbol='oz Ang^-3', symbol='ozÅ⁻³') -grams_per_cubic_micron = NamedUnit(1000000000000000.1, Dimensions(length=-3, mass=1), name='grams_per_cubic_micron', ascii_symbol='g micron^-3', symbol='gmicron⁻³') -exagrams_per_cubic_micron = NamedUnit(1.0000000000000001e+33, Dimensions(length=-3, mass=1), name='exagrams_per_cubic_micron', ascii_symbol='Eg micron^-3', symbol='Egmicron⁻³') -petagrams_per_cubic_micron = NamedUnit(1.0000000000000002e+30, Dimensions(length=-3, mass=1), name='petagrams_per_cubic_micron', ascii_symbol='Pg micron^-3', symbol='Pgmicron⁻³') -teragrams_per_cubic_micron = NamedUnit(1.0000000000000002e+27, Dimensions(length=-3, mass=1), name='teragrams_per_cubic_micron', ascii_symbol='Tg micron^-3', symbol='Tgmicron⁻³') -gigagrams_per_cubic_micron = NamedUnit(1.0000000000000001e+24, Dimensions(length=-3, mass=1), name='gigagrams_per_cubic_micron', ascii_symbol='Gg micron^-3', symbol='Ggmicron⁻³') -megagrams_per_cubic_micron = NamedUnit(1.0000000000000001e+21, Dimensions(length=-3, mass=1), name='megagrams_per_cubic_micron', ascii_symbol='Mg micron^-3', symbol='Mgmicron⁻³') -kilograms_per_cubic_micron = NamedUnit(1.0000000000000001e+18, Dimensions(length=-3, mass=1), name='kilograms_per_cubic_micron', ascii_symbol='kg micron^-3', symbol='kgmicron⁻³') -milligrams_per_cubic_micron = NamedUnit(1000000000000.0001, Dimensions(length=-3, mass=1), name='milligrams_per_cubic_micron', ascii_symbol='mg micron^-3', symbol='mgmicron⁻³') -micrograms_per_cubic_micron = NamedUnit(1000000000.0000002, Dimensions(length=-3, mass=1), name='micrograms_per_cubic_micron', ascii_symbol='ug micron^-3', symbol='µgmicron⁻³') -nanograms_per_cubic_micron = NamedUnit(1000000.0000000003, Dimensions(length=-3, mass=1), name='nanograms_per_cubic_micron', ascii_symbol='ng micron^-3', symbol='ngmicron⁻³') -picograms_per_cubic_micron = NamedUnit(1000.0000000000002, Dimensions(length=-3, mass=1), name='picograms_per_cubic_micron', ascii_symbol='pg micron^-3', symbol='pgmicron⁻³') -femtograms_per_cubic_micron = NamedUnit(1.0000000000000002, Dimensions(length=-3, mass=1), name='femtograms_per_cubic_micron', ascii_symbol='fg micron^-3', symbol='fgmicron⁻³') -attograms_per_cubic_micron = NamedUnit(0.0010000000000000002, Dimensions(length=-3, mass=1), name='attograms_per_cubic_micron', ascii_symbol='ag micron^-3', symbol='agmicron⁻³') -atomic_mass_units_per_cubic_micron = NamedUnit(1.660538921e-09, Dimensions(length=-3, mass=1), name='atomic_mass_units_per_cubic_micron', ascii_symbol='au micron^-3', symbol='aumicron⁻³') -pounds_per_cubic_micron = NamedUnit(4.5359237000000006e+17, Dimensions(length=-3, mass=1), name='pounds_per_cubic_micron', ascii_symbol='lb micron^-3', symbol='lbmicron⁻³') -ounces_per_cubic_micron = NamedUnit(2.8349523125000004e+16, Dimensions(length=-3, mass=1), name='ounces_per_cubic_micron', ascii_symbol='oz micron^-3', symbol='ozmicron⁻³') -grams_per_cubic_mile = NamedUnit(2.399127585789277e-13, Dimensions(length=-3, mass=1), name='grams_per_cubic_mile', ascii_symbol='g miles^-3', symbol='gmiles⁻³') -exagrams_per_cubic_mile = NamedUnit(239912.7585789277, Dimensions(length=-3, mass=1), name='exagrams_per_cubic_mile', ascii_symbol='Eg miles^-3', symbol='Egmiles⁻³') -petagrams_per_cubic_mile = NamedUnit(239.9127585789277, Dimensions(length=-3, mass=1), name='petagrams_per_cubic_mile', ascii_symbol='Pg miles^-3', symbol='Pgmiles⁻³') -teragrams_per_cubic_mile = NamedUnit(0.2399127585789277, Dimensions(length=-3, mass=1), name='teragrams_per_cubic_mile', ascii_symbol='Tg miles^-3', symbol='Tgmiles⁻³') -gigagrams_per_cubic_mile = NamedUnit(0.0002399127585789277, Dimensions(length=-3, mass=1), name='gigagrams_per_cubic_mile', ascii_symbol='Gg miles^-3', symbol='Ggmiles⁻³') -megagrams_per_cubic_mile = NamedUnit(2.399127585789277e-07, Dimensions(length=-3, mass=1), name='megagrams_per_cubic_mile', ascii_symbol='Mg miles^-3', symbol='Mgmiles⁻³') -kilograms_per_cubic_mile = NamedUnit(2.399127585789277e-10, Dimensions(length=-3, mass=1), name='kilograms_per_cubic_mile', ascii_symbol='kg miles^-3', symbol='kgmiles⁻³') -milligrams_per_cubic_mile = NamedUnit(2.399127585789277e-16, Dimensions(length=-3, mass=1), name='milligrams_per_cubic_mile', ascii_symbol='mg miles^-3', symbol='mgmiles⁻³') -micrograms_per_cubic_mile = NamedUnit(2.3991275857892774e-19, Dimensions(length=-3, mass=1), name='micrograms_per_cubic_mile', ascii_symbol='ug miles^-3', symbol='µgmiles⁻³') -nanograms_per_cubic_mile = NamedUnit(2.3991275857892774e-22, Dimensions(length=-3, mass=1), name='nanograms_per_cubic_mile', ascii_symbol='ng miles^-3', symbol='ngmiles⁻³') -picograms_per_cubic_mile = NamedUnit(2.399127585789277e-25, Dimensions(length=-3, mass=1), name='picograms_per_cubic_mile', ascii_symbol='pg miles^-3', symbol='pgmiles⁻³') -femtograms_per_cubic_mile = NamedUnit(2.3991275857892772e-28, Dimensions(length=-3, mass=1), name='femtograms_per_cubic_mile', ascii_symbol='fg miles^-3', symbol='fgmiles⁻³') -attograms_per_cubic_mile = NamedUnit(2.399127585789277e-31, Dimensions(length=-3, mass=1), name='attograms_per_cubic_mile', ascii_symbol='ag miles^-3', symbol='agmiles⁻³') -atomic_mass_units_per_cubic_mile = NamedUnit(3.98384473264786e-37, Dimensions(length=-3, mass=1), name='atomic_mass_units_per_cubic_mile', ascii_symbol='au miles^-3', symbol='aumiles⁻³') -pounds_per_cubic_mile = NamedUnit(1.0882259675705365e-10, Dimensions(length=-3, mass=1), name='pounds_per_cubic_mile', ascii_symbol='lb miles^-3', symbol='lbmiles⁻³') -ounces_per_cubic_mile = NamedUnit(6.801412297315853e-12, Dimensions(length=-3, mass=1), name='ounces_per_cubic_mile', ascii_symbol='oz miles^-3', symbol='ozmiles⁻³') -grams_per_cubic_yard = NamedUnit(0.0013079506193143919, Dimensions(length=-3, mass=1), name='grams_per_cubic_yard', ascii_symbol='g yrd^-3', symbol='gyrd⁻³') -exagrams_per_cubic_yard = NamedUnit(1307950619314391.8, Dimensions(length=-3, mass=1), name='exagrams_per_cubic_yard', ascii_symbol='Eg yrd^-3', symbol='Egyrd⁻³') -petagrams_per_cubic_yard = NamedUnit(1307950619314.3918, Dimensions(length=-3, mass=1), name='petagrams_per_cubic_yard', ascii_symbol='Pg yrd^-3', symbol='Pgyrd⁻³') -teragrams_per_cubic_yard = NamedUnit(1307950619.3143919, Dimensions(length=-3, mass=1), name='teragrams_per_cubic_yard', ascii_symbol='Tg yrd^-3', symbol='Tgyrd⁻³') -gigagrams_per_cubic_yard = NamedUnit(1307950.6193143919, Dimensions(length=-3, mass=1), name='gigagrams_per_cubic_yard', ascii_symbol='Gg yrd^-3', symbol='Ggyrd⁻³') -megagrams_per_cubic_yard = NamedUnit(1307.9506193143918, Dimensions(length=-3, mass=1), name='megagrams_per_cubic_yard', ascii_symbol='Mg yrd^-3', symbol='Mgyrd⁻³') -kilograms_per_cubic_yard = NamedUnit(1.3079506193143917, Dimensions(length=-3, mass=1), name='kilograms_per_cubic_yard', ascii_symbol='kg yrd^-3', symbol='kgyrd⁻³') -milligrams_per_cubic_yard = NamedUnit(1.3079506193143917e-06, Dimensions(length=-3, mass=1), name='milligrams_per_cubic_yard', ascii_symbol='mg yrd^-3', symbol='mgyrd⁻³') -micrograms_per_cubic_yard = NamedUnit(1.3079506193143919e-09, Dimensions(length=-3, mass=1), name='micrograms_per_cubic_yard', ascii_symbol='ug yrd^-3', symbol='µgyrd⁻³') -nanograms_per_cubic_yard = NamedUnit(1.307950619314392e-12, Dimensions(length=-3, mass=1), name='nanograms_per_cubic_yard', ascii_symbol='ng yrd^-3', symbol='ngyrd⁻³') -picograms_per_cubic_yard = NamedUnit(1.3079506193143919e-15, Dimensions(length=-3, mass=1), name='picograms_per_cubic_yard', ascii_symbol='pg yrd^-3', symbol='pgyrd⁻³') -femtograms_per_cubic_yard = NamedUnit(1.3079506193143918e-18, Dimensions(length=-3, mass=1), name='femtograms_per_cubic_yard', ascii_symbol='fg yrd^-3', symbol='fgyrd⁻³') -attograms_per_cubic_yard = NamedUnit(1.307950619314392e-21, Dimensions(length=-3, mass=1), name='attograms_per_cubic_yard', ascii_symbol='ag yrd^-3', symbol='agyrd⁻³') -atomic_mass_units_per_cubic_yard = NamedUnit(2.1719029101176016e-27, Dimensions(length=-3, mass=1), name='atomic_mass_units_per_cubic_yard', ascii_symbol='au yrd^-3', symbol='auyrd⁻³') -pounds_per_cubic_yard = NamedUnit(0.5932764212577828, Dimensions(length=-3, mass=1), name='pounds_per_cubic_yard', ascii_symbol='lb yrd^-3', symbol='lbyrd⁻³') -ounces_per_cubic_yard = NamedUnit(0.037079776328611425, Dimensions(length=-3, mass=1), name='ounces_per_cubic_yard', ascii_symbol='oz yrd^-3', symbol='ozyrd⁻³') -grams_per_cubic_foot = NamedUnit(0.035314666721488586, Dimensions(length=-3, mass=1), name='grams_per_cubic_foot', ascii_symbol='g ft^-3', symbol='gft⁻³') -exagrams_per_cubic_foot = NamedUnit(3.5314666721488584e+16, Dimensions(length=-3, mass=1), name='exagrams_per_cubic_foot', ascii_symbol='Eg ft^-3', symbol='Egft⁻³') -petagrams_per_cubic_foot = NamedUnit(35314666721488.586, Dimensions(length=-3, mass=1), name='petagrams_per_cubic_foot', ascii_symbol='Pg ft^-3', symbol='Pgft⁻³') -teragrams_per_cubic_foot = NamedUnit(35314666721.48859, Dimensions(length=-3, mass=1), name='teragrams_per_cubic_foot', ascii_symbol='Tg ft^-3', symbol='Tgft⁻³') -gigagrams_per_cubic_foot = NamedUnit(35314666.72148859, Dimensions(length=-3, mass=1), name='gigagrams_per_cubic_foot', ascii_symbol='Gg ft^-3', symbol='Ggft⁻³') -megagrams_per_cubic_foot = NamedUnit(35314.66672148858, Dimensions(length=-3, mass=1), name='megagrams_per_cubic_foot', ascii_symbol='Mg ft^-3', symbol='Mgft⁻³') -kilograms_per_cubic_foot = NamedUnit(35.314666721488585, Dimensions(length=-3, mass=1), name='kilograms_per_cubic_foot', ascii_symbol='kg ft^-3', symbol='kgft⁻³') -milligrams_per_cubic_foot = NamedUnit(3.5314666721488586e-05, Dimensions(length=-3, mass=1), name='milligrams_per_cubic_foot', ascii_symbol='mg ft^-3', symbol='mgft⁻³') -micrograms_per_cubic_foot = NamedUnit(3.5314666721488584e-08, Dimensions(length=-3, mass=1), name='micrograms_per_cubic_foot', ascii_symbol='ug ft^-3', symbol='µgft⁻³') -nanograms_per_cubic_foot = NamedUnit(3.531466672148859e-11, Dimensions(length=-3, mass=1), name='nanograms_per_cubic_foot', ascii_symbol='ng ft^-3', symbol='ngft⁻³') -picograms_per_cubic_foot = NamedUnit(3.531466672148859e-14, Dimensions(length=-3, mass=1), name='picograms_per_cubic_foot', ascii_symbol='pg ft^-3', symbol='pgft⁻³') -femtograms_per_cubic_foot = NamedUnit(3.5314666721488585e-17, Dimensions(length=-3, mass=1), name='femtograms_per_cubic_foot', ascii_symbol='fg ft^-3', symbol='fgft⁻³') -attograms_per_cubic_foot = NamedUnit(3.531466672148859e-20, Dimensions(length=-3, mass=1), name='attograms_per_cubic_foot', ascii_symbol='ag ft^-3', symbol='agft⁻³') -atomic_mass_units_per_cubic_foot = NamedUnit(5.864137857317526e-26, Dimensions(length=-3, mass=1), name='atomic_mass_units_per_cubic_foot', ascii_symbol='au ft^-3', symbol='auft⁻³') -pounds_per_cubic_foot = NamedUnit(16.018463373960138, Dimensions(length=-3, mass=1), name='pounds_per_cubic_foot', ascii_symbol='lb ft^-3', symbol='lbft⁻³') -ounces_per_cubic_foot = NamedUnit(1.0011539608725086, Dimensions(length=-3, mass=1), name='ounces_per_cubic_foot', ascii_symbol='oz ft^-3', symbol='ozft⁻³') -grams_per_cubic_inch = NamedUnit(61.02374409473229, Dimensions(length=-3, mass=1), name='grams_per_cubic_inch', ascii_symbol='g in^-3', symbol='gin⁻³') -exagrams_per_cubic_inch = NamedUnit(6.102374409473229e+19, Dimensions(length=-3, mass=1), name='exagrams_per_cubic_inch', ascii_symbol='Eg in^-3', symbol='Egin⁻³') -petagrams_per_cubic_inch = NamedUnit(6.102374409473229e+16, Dimensions(length=-3, mass=1), name='petagrams_per_cubic_inch', ascii_symbol='Pg in^-3', symbol='Pgin⁻³') -teragrams_per_cubic_inch = NamedUnit(61023744094732.29, Dimensions(length=-3, mass=1), name='teragrams_per_cubic_inch', ascii_symbol='Tg in^-3', symbol='Tgin⁻³') -gigagrams_per_cubic_inch = NamedUnit(61023744094.732285, Dimensions(length=-3, mass=1), name='gigagrams_per_cubic_inch', ascii_symbol='Gg in^-3', symbol='Ggin⁻³') -megagrams_per_cubic_inch = NamedUnit(61023744.094732285, Dimensions(length=-3, mass=1), name='megagrams_per_cubic_inch', ascii_symbol='Mg in^-3', symbol='Mgin⁻³') -kilograms_per_cubic_inch = NamedUnit(61023.74409473229, Dimensions(length=-3, mass=1), name='kilograms_per_cubic_inch', ascii_symbol='kg in^-3', symbol='kgin⁻³') -milligrams_per_cubic_inch = NamedUnit(0.06102374409473228, Dimensions(length=-3, mass=1), name='milligrams_per_cubic_inch', ascii_symbol='mg in^-3', symbol='mgin⁻³') -micrograms_per_cubic_inch = NamedUnit(6.102374409473229e-05, Dimensions(length=-3, mass=1), name='micrograms_per_cubic_inch', ascii_symbol='ug in^-3', symbol='µgin⁻³') -nanograms_per_cubic_inch = NamedUnit(6.10237440947323e-08, Dimensions(length=-3, mass=1), name='nanograms_per_cubic_inch', ascii_symbol='ng in^-3', symbol='ngin⁻³') -picograms_per_cubic_inch = NamedUnit(6.102374409473229e-11, Dimensions(length=-3, mass=1), name='picograms_per_cubic_inch', ascii_symbol='pg in^-3', symbol='pgin⁻³') -femtograms_per_cubic_inch = NamedUnit(6.10237440947323e-14, Dimensions(length=-3, mass=1), name='femtograms_per_cubic_inch', ascii_symbol='fg in^-3', symbol='fgin⁻³') -attograms_per_cubic_inch = NamedUnit(6.10237440947323e-17, Dimensions(length=-3, mass=1), name='attograms_per_cubic_inch', ascii_symbol='ag in^-3', symbol='agin⁻³') -atomic_mass_units_per_cubic_inch = NamedUnit(1.0133230217444687e-22, Dimensions(length=-3, mass=1), name='atomic_mass_units_per_cubic_inch', ascii_symbol='au in^-3', symbol='auin⁻³') -pounds_per_cubic_inch = NamedUnit(27679.904710203125, Dimensions(length=-3, mass=1), name='pounds_per_cubic_inch', ascii_symbol='lb in^-3', symbol='lbin⁻³') -ounces_per_cubic_inch = NamedUnit(1729.9940443876953, Dimensions(length=-3, mass=1), name='ounces_per_cubic_inch', ascii_symbol='oz in^-3', symbol='ozin⁻³') -moles_per_cubic_meter = NamedUnit(6.02214076e+23, Dimensions(length=-3, moles_hint=1), name='moles_per_cubic_meter', ascii_symbol='mol m^-3', symbol='molm⁻³') -millimoles_per_cubic_meter = NamedUnit(6.02214076e+20, Dimensions(length=-3, moles_hint=1), name='millimoles_per_cubic_meter', ascii_symbol='mmol m^-3', symbol='mmolm⁻³') -micromoles_per_cubic_meter = NamedUnit(6.02214076e+17, Dimensions(length=-3, moles_hint=1), name='micromoles_per_cubic_meter', ascii_symbol='umol m^-3', symbol='µmolm⁻³') -nanomoles_per_cubic_meter = NamedUnit(602214076000000.0, Dimensions(length=-3, moles_hint=1), name='nanomoles_per_cubic_meter', ascii_symbol='nmol m^-3', symbol='nmolm⁻³') -picomoles_per_cubic_meter = NamedUnit(602214076000.0, Dimensions(length=-3, moles_hint=1), name='picomoles_per_cubic_meter', ascii_symbol='pmol m^-3', symbol='pmolm⁻³') -femtomoles_per_cubic_meter = NamedUnit(602214076.0, Dimensions(length=-3, moles_hint=1), name='femtomoles_per_cubic_meter', ascii_symbol='fmol m^-3', symbol='fmolm⁻³') -attomoles_per_cubic_meter = NamedUnit(602214.076, Dimensions(length=-3, moles_hint=1), name='attomoles_per_cubic_meter', ascii_symbol='amol m^-3', symbol='amolm⁻³') -moles_per_cubic_exameter = NamedUnit(6.0221407599999995e-31, Dimensions(length=-3, moles_hint=1), name='moles_per_cubic_exameter', ascii_symbol='mol Em^-3', symbol='molEm⁻³') -millimoles_per_cubic_exameter = NamedUnit(6.02214076e-34, Dimensions(length=-3, moles_hint=1), name='millimoles_per_cubic_exameter', ascii_symbol='mmol Em^-3', symbol='mmolEm⁻³') -micromoles_per_cubic_exameter = NamedUnit(6.02214076e-37, Dimensions(length=-3, moles_hint=1), name='micromoles_per_cubic_exameter', ascii_symbol='umol Em^-3', symbol='µmolEm⁻³') -nanomoles_per_cubic_exameter = NamedUnit(6.022140759999999e-40, Dimensions(length=-3, moles_hint=1), name='nanomoles_per_cubic_exameter', ascii_symbol='nmol Em^-3', symbol='nmolEm⁻³') -picomoles_per_cubic_exameter = NamedUnit(6.022140759999999e-43, Dimensions(length=-3, moles_hint=1), name='picomoles_per_cubic_exameter', ascii_symbol='pmol Em^-3', symbol='pmolEm⁻³') -femtomoles_per_cubic_exameter = NamedUnit(6.02214076e-46, Dimensions(length=-3, moles_hint=1), name='femtomoles_per_cubic_exameter', ascii_symbol='fmol Em^-3', symbol='fmolEm⁻³') -attomoles_per_cubic_exameter = NamedUnit(6.022140759999999e-49, Dimensions(length=-3, moles_hint=1), name='attomoles_per_cubic_exameter', ascii_symbol='amol Em^-3', symbol='amolEm⁻³') -moles_per_cubic_petameter = NamedUnit(6.02214076e-22, Dimensions(length=-3, moles_hint=1), name='moles_per_cubic_petameter', ascii_symbol='mol Pm^-3', symbol='molPm⁻³') -millimoles_per_cubic_petameter = NamedUnit(6.0221407600000005e-25, Dimensions(length=-3, moles_hint=1), name='millimoles_per_cubic_petameter', ascii_symbol='mmol Pm^-3', symbol='mmolPm⁻³') -micromoles_per_cubic_petameter = NamedUnit(6.02214076e-28, Dimensions(length=-3, moles_hint=1), name='micromoles_per_cubic_petameter', ascii_symbol='umol Pm^-3', symbol='µmolPm⁻³') -nanomoles_per_cubic_petameter = NamedUnit(6.02214076e-31, Dimensions(length=-3, moles_hint=1), name='nanomoles_per_cubic_petameter', ascii_symbol='nmol Pm^-3', symbol='nmolPm⁻³') -picomoles_per_cubic_petameter = NamedUnit(6.0221407600000005e-34, Dimensions(length=-3, moles_hint=1), name='picomoles_per_cubic_petameter', ascii_symbol='pmol Pm^-3', symbol='pmolPm⁻³') -femtomoles_per_cubic_petameter = NamedUnit(6.022140760000001e-37, Dimensions(length=-3, moles_hint=1), name='femtomoles_per_cubic_petameter', ascii_symbol='fmol Pm^-3', symbol='fmolPm⁻³') -attomoles_per_cubic_petameter = NamedUnit(6.022140760000001e-40, Dimensions(length=-3, moles_hint=1), name='attomoles_per_cubic_petameter', ascii_symbol='amol Pm^-3', symbol='amolPm⁻³') -moles_per_cubic_terameter = NamedUnit(6.022140759999999e-13, Dimensions(length=-3, moles_hint=1), name='moles_per_cubic_terameter', ascii_symbol='mol Tm^-3', symbol='molTm⁻³') -millimoles_per_cubic_terameter = NamedUnit(6.02214076e-16, Dimensions(length=-3, moles_hint=1), name='millimoles_per_cubic_terameter', ascii_symbol='mmol Tm^-3', symbol='mmolTm⁻³') -micromoles_per_cubic_terameter = NamedUnit(6.02214076e-19, Dimensions(length=-3, moles_hint=1), name='micromoles_per_cubic_terameter', ascii_symbol='umol Tm^-3', symbol='µmolTm⁻³') -nanomoles_per_cubic_terameter = NamedUnit(6.02214076e-22, Dimensions(length=-3, moles_hint=1), name='nanomoles_per_cubic_terameter', ascii_symbol='nmol Tm^-3', symbol='nmolTm⁻³') -picomoles_per_cubic_terameter = NamedUnit(6.02214076e-25, Dimensions(length=-3, moles_hint=1), name='picomoles_per_cubic_terameter', ascii_symbol='pmol Tm^-3', symbol='pmolTm⁻³') -femtomoles_per_cubic_terameter = NamedUnit(6.02214076e-28, Dimensions(length=-3, moles_hint=1), name='femtomoles_per_cubic_terameter', ascii_symbol='fmol Tm^-3', symbol='fmolTm⁻³') -attomoles_per_cubic_terameter = NamedUnit(6.0221407599999995e-31, Dimensions(length=-3, moles_hint=1), name='attomoles_per_cubic_terameter', ascii_symbol='amol Tm^-3', symbol='amolTm⁻³') -moles_per_cubic_gigameter = NamedUnit(0.000602214076, Dimensions(length=-3, moles_hint=1), name='moles_per_cubic_gigameter', ascii_symbol='mol Gm^-3', symbol='molGm⁻³') -millimoles_per_cubic_gigameter = NamedUnit(6.022140760000001e-07, Dimensions(length=-3, moles_hint=1), name='millimoles_per_cubic_gigameter', ascii_symbol='mmol Gm^-3', symbol='mmolGm⁻³') -micromoles_per_cubic_gigameter = NamedUnit(6.02214076e-10, Dimensions(length=-3, moles_hint=1), name='micromoles_per_cubic_gigameter', ascii_symbol='umol Gm^-3', symbol='µmolGm⁻³') -nanomoles_per_cubic_gigameter = NamedUnit(6.02214076e-13, Dimensions(length=-3, moles_hint=1), name='nanomoles_per_cubic_gigameter', ascii_symbol='nmol Gm^-3', symbol='nmolGm⁻³') -picomoles_per_cubic_gigameter = NamedUnit(6.02214076e-16, Dimensions(length=-3, moles_hint=1), name='picomoles_per_cubic_gigameter', ascii_symbol='pmol Gm^-3', symbol='pmolGm⁻³') -femtomoles_per_cubic_gigameter = NamedUnit(6.02214076e-19, Dimensions(length=-3, moles_hint=1), name='femtomoles_per_cubic_gigameter', ascii_symbol='fmol Gm^-3', symbol='fmolGm⁻³') -attomoles_per_cubic_gigameter = NamedUnit(6.02214076e-22, Dimensions(length=-3, moles_hint=1), name='attomoles_per_cubic_gigameter', ascii_symbol='amol Gm^-3', symbol='amolGm⁻³') -moles_per_cubic_megameter = NamedUnit(602214.076, Dimensions(length=-3, moles_hint=1), name='moles_per_cubic_megameter', ascii_symbol='mol Mm^-3', symbol='molMm⁻³') -millimoles_per_cubic_megameter = NamedUnit(602.214076, Dimensions(length=-3, moles_hint=1), name='millimoles_per_cubic_megameter', ascii_symbol='mmol Mm^-3', symbol='mmolMm⁻³') -micromoles_per_cubic_megameter = NamedUnit(0.602214076, Dimensions(length=-3, moles_hint=1), name='micromoles_per_cubic_megameter', ascii_symbol='umol Mm^-3', symbol='µmolMm⁻³') -nanomoles_per_cubic_megameter = NamedUnit(0.000602214076, Dimensions(length=-3, moles_hint=1), name='nanomoles_per_cubic_megameter', ascii_symbol='nmol Mm^-3', symbol='nmolMm⁻³') -picomoles_per_cubic_megameter = NamedUnit(6.02214076e-07, Dimensions(length=-3, moles_hint=1), name='picomoles_per_cubic_megameter', ascii_symbol='pmol Mm^-3', symbol='pmolMm⁻³') -femtomoles_per_cubic_megameter = NamedUnit(6.02214076e-10, Dimensions(length=-3, moles_hint=1), name='femtomoles_per_cubic_megameter', ascii_symbol='fmol Mm^-3', symbol='fmolMm⁻³') -attomoles_per_cubic_megameter = NamedUnit(6.02214076e-13, Dimensions(length=-3, moles_hint=1), name='attomoles_per_cubic_megameter', ascii_symbol='amol Mm^-3', symbol='amolMm⁻³') -moles_per_cubic_kilometer = NamedUnit(602214076000000.0, Dimensions(length=-3, moles_hint=1), name='moles_per_cubic_kilometer', ascii_symbol='mol km^-3', symbol='molkm⁻³') -millimoles_per_cubic_kilometer = NamedUnit(602214076000.0, Dimensions(length=-3, moles_hint=1), name='millimoles_per_cubic_kilometer', ascii_symbol='mmol km^-3', symbol='mmolkm⁻³') -micromoles_per_cubic_kilometer = NamedUnit(602214076.0, Dimensions(length=-3, moles_hint=1), name='micromoles_per_cubic_kilometer', ascii_symbol='umol km^-3', symbol='µmolkm⁻³') -nanomoles_per_cubic_kilometer = NamedUnit(602214.076, Dimensions(length=-3, moles_hint=1), name='nanomoles_per_cubic_kilometer', ascii_symbol='nmol km^-3', symbol='nmolkm⁻³') -picomoles_per_cubic_kilometer = NamedUnit(602.214076, Dimensions(length=-3, moles_hint=1), name='picomoles_per_cubic_kilometer', ascii_symbol='pmol km^-3', symbol='pmolkm⁻³') -femtomoles_per_cubic_kilometer = NamedUnit(0.602214076, Dimensions(length=-3, moles_hint=1), name='femtomoles_per_cubic_kilometer', ascii_symbol='fmol km^-3', symbol='fmolkm⁻³') -attomoles_per_cubic_kilometer = NamedUnit(0.000602214076, Dimensions(length=-3, moles_hint=1), name='attomoles_per_cubic_kilometer', ascii_symbol='amol km^-3', symbol='amolkm⁻³') -moles_per_cubic_millimeter = NamedUnit(6.0221407599999995e+32, Dimensions(length=-3, moles_hint=1), name='moles_per_cubic_millimeter', ascii_symbol='mol mm^-3', symbol='molmm⁻³') -millimoles_per_cubic_millimeter = NamedUnit(6.02214076e+29, Dimensions(length=-3, moles_hint=1), name='millimoles_per_cubic_millimeter', ascii_symbol='mmol mm^-3', symbol='mmolmm⁻³') -micromoles_per_cubic_millimeter = NamedUnit(6.0221407599999996e+26, Dimensions(length=-3, moles_hint=1), name='micromoles_per_cubic_millimeter', ascii_symbol='umol mm^-3', symbol='µmolmm⁻³') -nanomoles_per_cubic_millimeter = NamedUnit(6.02214076e+23, Dimensions(length=-3, moles_hint=1), name='nanomoles_per_cubic_millimeter', ascii_symbol='nmol mm^-3', symbol='nmolmm⁻³') -picomoles_per_cubic_millimeter = NamedUnit(6.02214076e+20, Dimensions(length=-3, moles_hint=1), name='picomoles_per_cubic_millimeter', ascii_symbol='pmol mm^-3', symbol='pmolmm⁻³') -femtomoles_per_cubic_millimeter = NamedUnit(6.02214076e+17, Dimensions(length=-3, moles_hint=1), name='femtomoles_per_cubic_millimeter', ascii_symbol='fmol mm^-3', symbol='fmolmm⁻³') -attomoles_per_cubic_millimeter = NamedUnit(602214076000000.0, Dimensions(length=-3, moles_hint=1), name='attomoles_per_cubic_millimeter', ascii_symbol='amol mm^-3', symbol='amolmm⁻³') -moles_per_cubic_micrometer = NamedUnit(6.022140760000001e+41, Dimensions(length=-3, moles_hint=1), name='moles_per_cubic_micrometer', ascii_symbol='mol um^-3', symbol='molµm⁻³') -millimoles_per_cubic_micrometer = NamedUnit(6.022140760000001e+38, Dimensions(length=-3, moles_hint=1), name='millimoles_per_cubic_micrometer', ascii_symbol='mmol um^-3', symbol='mmolµm⁻³') -micromoles_per_cubic_micrometer = NamedUnit(6.0221407600000004e+35, Dimensions(length=-3, moles_hint=1), name='micromoles_per_cubic_micrometer', ascii_symbol='umol um^-3', symbol='µmolµm⁻³') -nanomoles_per_cubic_micrometer = NamedUnit(6.022140760000001e+32, Dimensions(length=-3, moles_hint=1), name='nanomoles_per_cubic_micrometer', ascii_symbol='nmol um^-3', symbol='nmolµm⁻³') -picomoles_per_cubic_micrometer = NamedUnit(6.022140760000001e+29, Dimensions(length=-3, moles_hint=1), name='picomoles_per_cubic_micrometer', ascii_symbol='pmol um^-3', symbol='pmolµm⁻³') -femtomoles_per_cubic_micrometer = NamedUnit(6.022140760000001e+26, Dimensions(length=-3, moles_hint=1), name='femtomoles_per_cubic_micrometer', ascii_symbol='fmol um^-3', symbol='fmolµm⁻³') -attomoles_per_cubic_micrometer = NamedUnit(6.0221407600000005e+23, Dimensions(length=-3, moles_hint=1), name='attomoles_per_cubic_micrometer', ascii_symbol='amol um^-3', symbol='amolµm⁻³') -moles_per_cubic_nanometer = NamedUnit(6.022140759999999e+50, Dimensions(length=-3, moles_hint=1), name='moles_per_cubic_nanometer', ascii_symbol='mol nm^-3', symbol='molnm⁻³') -millimoles_per_cubic_nanometer = NamedUnit(6.022140759999999e+47, Dimensions(length=-3, moles_hint=1), name='millimoles_per_cubic_nanometer', ascii_symbol='mmol nm^-3', symbol='mmolnm⁻³') -micromoles_per_cubic_nanometer = NamedUnit(6.022140759999999e+44, Dimensions(length=-3, moles_hint=1), name='micromoles_per_cubic_nanometer', ascii_symbol='umol nm^-3', symbol='µmolnm⁻³') -nanomoles_per_cubic_nanometer = NamedUnit(6.022140759999998e+41, Dimensions(length=-3, moles_hint=1), name='nanomoles_per_cubic_nanometer', ascii_symbol='nmol nm^-3', symbol='nmolnm⁻³') -picomoles_per_cubic_nanometer = NamedUnit(6.0221407599999985e+38, Dimensions(length=-3, moles_hint=1), name='picomoles_per_cubic_nanometer', ascii_symbol='pmol nm^-3', symbol='pmolnm⁻³') -femtomoles_per_cubic_nanometer = NamedUnit(6.022140759999999e+35, Dimensions(length=-3, moles_hint=1), name='femtomoles_per_cubic_nanometer', ascii_symbol='fmol nm^-3', symbol='fmolnm⁻³') -attomoles_per_cubic_nanometer = NamedUnit(6.022140759999999e+32, Dimensions(length=-3, moles_hint=1), name='attomoles_per_cubic_nanometer', ascii_symbol='amol nm^-3', symbol='amolnm⁻³') -moles_per_cubic_picometer = NamedUnit(6.0221407600000005e+59, Dimensions(length=-3, moles_hint=1), name='moles_per_cubic_picometer', ascii_symbol='mol pm^-3', symbol='molpm⁻³') -millimoles_per_cubic_picometer = NamedUnit(6.0221407600000005e+56, Dimensions(length=-3, moles_hint=1), name='millimoles_per_cubic_picometer', ascii_symbol='mmol pm^-3', symbol='mmolpm⁻³') -micromoles_per_cubic_picometer = NamedUnit(6.022140760000001e+53, Dimensions(length=-3, moles_hint=1), name='micromoles_per_cubic_picometer', ascii_symbol='umol pm^-3', symbol='µmolpm⁻³') -nanomoles_per_cubic_picometer = NamedUnit(6.0221407600000005e+50, Dimensions(length=-3, moles_hint=1), name='nanomoles_per_cubic_picometer', ascii_symbol='nmol pm^-3', symbol='nmolpm⁻³') -picomoles_per_cubic_picometer = NamedUnit(6.02214076e+47, Dimensions(length=-3, moles_hint=1), name='picomoles_per_cubic_picometer', ascii_symbol='pmol pm^-3', symbol='pmolpm⁻³') -femtomoles_per_cubic_picometer = NamedUnit(6.022140760000001e+44, Dimensions(length=-3, moles_hint=1), name='femtomoles_per_cubic_picometer', ascii_symbol='fmol pm^-3', symbol='fmolpm⁻³') -attomoles_per_cubic_picometer = NamedUnit(6.022140760000001e+41, Dimensions(length=-3, moles_hint=1), name='attomoles_per_cubic_picometer', ascii_symbol='amol pm^-3', symbol='amolpm⁻³') -moles_per_cubic_femtometer = NamedUnit(6.022140759999998e+68, Dimensions(length=-3, moles_hint=1), name='moles_per_cubic_femtometer', ascii_symbol='mol fm^-3', symbol='molfm⁻³') -millimoles_per_cubic_femtometer = NamedUnit(6.022140759999998e+65, Dimensions(length=-3, moles_hint=1), name='millimoles_per_cubic_femtometer', ascii_symbol='mmol fm^-3', symbol='mmolfm⁻³') -micromoles_per_cubic_femtometer = NamedUnit(6.022140759999999e+62, Dimensions(length=-3, moles_hint=1), name='micromoles_per_cubic_femtometer', ascii_symbol='umol fm^-3', symbol='µmolfm⁻³') -nanomoles_per_cubic_femtometer = NamedUnit(6.022140759999998e+59, Dimensions(length=-3, moles_hint=1), name='nanomoles_per_cubic_femtometer', ascii_symbol='nmol fm^-3', symbol='nmolfm⁻³') -picomoles_per_cubic_femtometer = NamedUnit(6.022140759999998e+56, Dimensions(length=-3, moles_hint=1), name='picomoles_per_cubic_femtometer', ascii_symbol='pmol fm^-3', symbol='pmolfm⁻³') -femtomoles_per_cubic_femtometer = NamedUnit(6.022140759999998e+53, Dimensions(length=-3, moles_hint=1), name='femtomoles_per_cubic_femtometer', ascii_symbol='fmol fm^-3', symbol='fmolfm⁻³') -attomoles_per_cubic_femtometer = NamedUnit(6.022140759999998e+50, Dimensions(length=-3, moles_hint=1), name='attomoles_per_cubic_femtometer', ascii_symbol='amol fm^-3', symbol='amolfm⁻³') -moles_per_cubic_attometer = NamedUnit(6.022140759999998e+77, Dimensions(length=-3, moles_hint=1), name='moles_per_cubic_attometer', ascii_symbol='mol am^-3', symbol='molam⁻³') -millimoles_per_cubic_attometer = NamedUnit(6.022140759999999e+74, Dimensions(length=-3, moles_hint=1), name='millimoles_per_cubic_attometer', ascii_symbol='mmol am^-3', symbol='mmolam⁻³') -micromoles_per_cubic_attometer = NamedUnit(6.022140759999999e+71, Dimensions(length=-3, moles_hint=1), name='micromoles_per_cubic_attometer', ascii_symbol='umol am^-3', symbol='µmolam⁻³') -nanomoles_per_cubic_attometer = NamedUnit(6.022140759999999e+68, Dimensions(length=-3, moles_hint=1), name='nanomoles_per_cubic_attometer', ascii_symbol='nmol am^-3', symbol='nmolam⁻³') -picomoles_per_cubic_attometer = NamedUnit(6.022140759999999e+65, Dimensions(length=-3, moles_hint=1), name='picomoles_per_cubic_attometer', ascii_symbol='pmol am^-3', symbol='pmolam⁻³') -femtomoles_per_cubic_attometer = NamedUnit(6.022140759999999e+62, Dimensions(length=-3, moles_hint=1), name='femtomoles_per_cubic_attometer', ascii_symbol='fmol am^-3', symbol='fmolam⁻³') -attomoles_per_cubic_attometer = NamedUnit(6.022140759999999e+59, Dimensions(length=-3, moles_hint=1), name='attomoles_per_cubic_attometer', ascii_symbol='amol am^-3', symbol='amolam⁻³') -moles_per_cubic_decimeter = NamedUnit(6.022140759999998e+26, Dimensions(length=-3, moles_hint=1), name='moles_per_cubic_decimeter', ascii_symbol='mol dm^-3', symbol='moldm⁻³') -millimoles_per_cubic_decimeter = NamedUnit(6.0221407599999985e+23, Dimensions(length=-3, moles_hint=1), name='millimoles_per_cubic_decimeter', ascii_symbol='mmol dm^-3', symbol='mmoldm⁻³') -micromoles_per_cubic_decimeter = NamedUnit(6.022140759999999e+20, Dimensions(length=-3, moles_hint=1), name='micromoles_per_cubic_decimeter', ascii_symbol='umol dm^-3', symbol='µmoldm⁻³') -nanomoles_per_cubic_decimeter = NamedUnit(6.022140759999999e+17, Dimensions(length=-3, moles_hint=1), name='nanomoles_per_cubic_decimeter', ascii_symbol='nmol dm^-3', symbol='nmoldm⁻³') -picomoles_per_cubic_decimeter = NamedUnit(602214075999999.9, Dimensions(length=-3, moles_hint=1), name='picomoles_per_cubic_decimeter', ascii_symbol='pmol dm^-3', symbol='pmoldm⁻³') -femtomoles_per_cubic_decimeter = NamedUnit(602214075999.9999, Dimensions(length=-3, moles_hint=1), name='femtomoles_per_cubic_decimeter', ascii_symbol='fmol dm^-3', symbol='fmoldm⁻³') -attomoles_per_cubic_decimeter = NamedUnit(602214075.9999999, Dimensions(length=-3, moles_hint=1), name='attomoles_per_cubic_decimeter', ascii_symbol='amol dm^-3', symbol='amoldm⁻³') -moles_per_cubic_centimeter = NamedUnit(6.022140759999999e+29, Dimensions(length=-3, moles_hint=1), name='moles_per_cubic_centimeter', ascii_symbol='mol cm^-3', symbol='molcm⁻³') -millimoles_per_cubic_centimeter = NamedUnit(6.022140759999999e+26, Dimensions(length=-3, moles_hint=1), name='millimoles_per_cubic_centimeter', ascii_symbol='mmol cm^-3', symbol='mmolcm⁻³') -micromoles_per_cubic_centimeter = NamedUnit(6.022140759999999e+23, Dimensions(length=-3, moles_hint=1), name='micromoles_per_cubic_centimeter', ascii_symbol='umol cm^-3', symbol='µmolcm⁻³') -nanomoles_per_cubic_centimeter = NamedUnit(6.022140759999999e+20, Dimensions(length=-3, moles_hint=1), name='nanomoles_per_cubic_centimeter', ascii_symbol='nmol cm^-3', symbol='nmolcm⁻³') -picomoles_per_cubic_centimeter = NamedUnit(6.022140759999999e+17, Dimensions(length=-3, moles_hint=1), name='picomoles_per_cubic_centimeter', ascii_symbol='pmol cm^-3', symbol='pmolcm⁻³') -femtomoles_per_cubic_centimeter = NamedUnit(602214075999999.9, Dimensions(length=-3, moles_hint=1), name='femtomoles_per_cubic_centimeter', ascii_symbol='fmol cm^-3', symbol='fmolcm⁻³') -attomoles_per_cubic_centimeter = NamedUnit(602214075999.9999, Dimensions(length=-3, moles_hint=1), name='attomoles_per_cubic_centimeter', ascii_symbol='amol cm^-3', symbol='amolcm⁻³') -moles_per_cubic_angstrom = NamedUnit(6.022140759999999e+53, Dimensions(length=-3, moles_hint=1), name='moles_per_cubic_angstrom', ascii_symbol='mol Ang^-3', symbol='molÅ⁻³') -millimoles_per_cubic_angstrom = NamedUnit(6.02214076e+50, Dimensions(length=-3, moles_hint=1), name='millimoles_per_cubic_angstrom', ascii_symbol='mmol Ang^-3', symbol='mmolÅ⁻³') -micromoles_per_cubic_angstrom = NamedUnit(6.022140759999999e+47, Dimensions(length=-3, moles_hint=1), name='micromoles_per_cubic_angstrom', ascii_symbol='umol Ang^-3', symbol='µmolÅ⁻³') -nanomoles_per_cubic_angstrom = NamedUnit(6.02214076e+44, Dimensions(length=-3, moles_hint=1), name='nanomoles_per_cubic_angstrom', ascii_symbol='nmol Ang^-3', symbol='nmolÅ⁻³') -picomoles_per_cubic_angstrom = NamedUnit(6.02214076e+41, Dimensions(length=-3, moles_hint=1), name='picomoles_per_cubic_angstrom', ascii_symbol='pmol Ang^-3', symbol='pmolÅ⁻³') -femtomoles_per_cubic_angstrom = NamedUnit(6.022140759999999e+38, Dimensions(length=-3, moles_hint=1), name='femtomoles_per_cubic_angstrom', ascii_symbol='fmol Ang^-3', symbol='fmolÅ⁻³') -attomoles_per_cubic_angstrom = NamedUnit(6.02214076e+35, Dimensions(length=-3, moles_hint=1), name='attomoles_per_cubic_angstrom', ascii_symbol='amol Ang^-3', symbol='amolÅ⁻³') -moles_per_cubic_micron = NamedUnit(6.022140760000001e+41, Dimensions(length=-3, moles_hint=1), name='moles_per_cubic_micron', ascii_symbol='mol micron^-3', symbol='molmicron⁻³') -millimoles_per_cubic_micron = NamedUnit(6.022140760000001e+38, Dimensions(length=-3, moles_hint=1), name='millimoles_per_cubic_micron', ascii_symbol='mmol micron^-3', symbol='mmolmicron⁻³') -micromoles_per_cubic_micron = NamedUnit(6.0221407600000004e+35, Dimensions(length=-3, moles_hint=1), name='micromoles_per_cubic_micron', ascii_symbol='umol micron^-3', symbol='µmolmicron⁻³') -nanomoles_per_cubic_micron = NamedUnit(6.022140760000001e+32, Dimensions(length=-3, moles_hint=1), name='nanomoles_per_cubic_micron', ascii_symbol='nmol micron^-3', symbol='nmolmicron⁻³') -picomoles_per_cubic_micron = NamedUnit(6.022140760000001e+29, Dimensions(length=-3, moles_hint=1), name='picomoles_per_cubic_micron', ascii_symbol='pmol micron^-3', symbol='pmolmicron⁻³') -femtomoles_per_cubic_micron = NamedUnit(6.022140760000001e+26, Dimensions(length=-3, moles_hint=1), name='femtomoles_per_cubic_micron', ascii_symbol='fmol micron^-3', symbol='fmolmicron⁻³') -attomoles_per_cubic_micron = NamedUnit(6.0221407600000005e+23, Dimensions(length=-3, moles_hint=1), name='attomoles_per_cubic_micron', ascii_symbol='amol micron^-3', symbol='amolmicron⁻³') -moles_per_cubic_mile = NamedUnit(144478840228220.0, Dimensions(length=-3, moles_hint=1), name='moles_per_cubic_mile', ascii_symbol='mol miles^-3', symbol='molmiles⁻³') -millimoles_per_cubic_mile = NamedUnit(144478840228.22003, Dimensions(length=-3, moles_hint=1), name='millimoles_per_cubic_mile', ascii_symbol='mmol miles^-3', symbol='mmolmiles⁻³') -micromoles_per_cubic_mile = NamedUnit(144478840.22822002, Dimensions(length=-3, moles_hint=1), name='micromoles_per_cubic_mile', ascii_symbol='umol miles^-3', symbol='µmolmiles⁻³') -nanomoles_per_cubic_mile = NamedUnit(144478.84022822, Dimensions(length=-3, moles_hint=1), name='nanomoles_per_cubic_mile', ascii_symbol='nmol miles^-3', symbol='nmolmiles⁻³') -picomoles_per_cubic_mile = NamedUnit(144.47884022822, Dimensions(length=-3, moles_hint=1), name='picomoles_per_cubic_mile', ascii_symbol='pmol miles^-3', symbol='pmolmiles⁻³') -femtomoles_per_cubic_mile = NamedUnit(0.14447884022822002, Dimensions(length=-3, moles_hint=1), name='femtomoles_per_cubic_mile', ascii_symbol='fmol miles^-3', symbol='fmolmiles⁻³') -attomoles_per_cubic_mile = NamedUnit(0.00014447884022822003, Dimensions(length=-3, moles_hint=1), name='attomoles_per_cubic_mile', ascii_symbol='amol miles^-3', symbol='amolmiles⁻³') -moles_per_cubic_yard = NamedUnit(7.876662736640442e+23, Dimensions(length=-3, moles_hint=1), name='moles_per_cubic_yard', ascii_symbol='mol yrd^-3', symbol='molyrd⁻³') -millimoles_per_cubic_yard = NamedUnit(7.876662736640442e+20, Dimensions(length=-3, moles_hint=1), name='millimoles_per_cubic_yard', ascii_symbol='mmol yrd^-3', symbol='mmolyrd⁻³') -micromoles_per_cubic_yard = NamedUnit(7.876662736640442e+17, Dimensions(length=-3, moles_hint=1), name='micromoles_per_cubic_yard', ascii_symbol='umol yrd^-3', symbol='µmolyrd⁻³') -nanomoles_per_cubic_yard = NamedUnit(787666273664044.2, Dimensions(length=-3, moles_hint=1), name='nanomoles_per_cubic_yard', ascii_symbol='nmol yrd^-3', symbol='nmolyrd⁻³') -picomoles_per_cubic_yard = NamedUnit(787666273664.0442, Dimensions(length=-3, moles_hint=1), name='picomoles_per_cubic_yard', ascii_symbol='pmol yrd^-3', symbol='pmolyrd⁻³') -femtomoles_per_cubic_yard = NamedUnit(787666273.6640443, Dimensions(length=-3, moles_hint=1), name='femtomoles_per_cubic_yard', ascii_symbol='fmol yrd^-3', symbol='fmolyrd⁻³') -attomoles_per_cubic_yard = NamedUnit(787666.2736640442, Dimensions(length=-3, moles_hint=1), name='attomoles_per_cubic_yard', ascii_symbol='amol yrd^-3', symbol='amolyrd⁻³') -moles_per_cubic_foot = NamedUnit(2.1266989388929195e+25, Dimensions(length=-3, moles_hint=1), name='moles_per_cubic_foot', ascii_symbol='mol ft^-3', symbol='molft⁻³') -millimoles_per_cubic_foot = NamedUnit(2.1266989388929197e+22, Dimensions(length=-3, moles_hint=1), name='millimoles_per_cubic_foot', ascii_symbol='mmol ft^-3', symbol='mmolft⁻³') -micromoles_per_cubic_foot = NamedUnit(2.1266989388929196e+19, Dimensions(length=-3, moles_hint=1), name='micromoles_per_cubic_foot', ascii_symbol='umol ft^-3', symbol='µmolft⁻³') -nanomoles_per_cubic_foot = NamedUnit(2.1266989388929196e+16, Dimensions(length=-3, moles_hint=1), name='nanomoles_per_cubic_foot', ascii_symbol='nmol ft^-3', symbol='nmolft⁻³') -picomoles_per_cubic_foot = NamedUnit(21266989388929.2, Dimensions(length=-3, moles_hint=1), name='picomoles_per_cubic_foot', ascii_symbol='pmol ft^-3', symbol='pmolft⁻³') -femtomoles_per_cubic_foot = NamedUnit(21266989388.9292, Dimensions(length=-3, moles_hint=1), name='femtomoles_per_cubic_foot', ascii_symbol='fmol ft^-3', symbol='fmolft⁻³') -attomoles_per_cubic_foot = NamedUnit(21266989.388929196, Dimensions(length=-3, moles_hint=1), name='attomoles_per_cubic_foot', ascii_symbol='amol ft^-3', symbol='amolft⁻³') -moles_per_cubic_inch = NamedUnit(3.6749357664069658e+28, Dimensions(length=-3, moles_hint=1), name='moles_per_cubic_inch', ascii_symbol='mol in^-3', symbol='molin⁻³') -millimoles_per_cubic_inch = NamedUnit(3.674935766406966e+25, Dimensions(length=-3, moles_hint=1), name='millimoles_per_cubic_inch', ascii_symbol='mmol in^-3', symbol='mmolin⁻³') -micromoles_per_cubic_inch = NamedUnit(3.674935766406966e+22, Dimensions(length=-3, moles_hint=1), name='micromoles_per_cubic_inch', ascii_symbol='umol in^-3', symbol='µmolin⁻³') -nanomoles_per_cubic_inch = NamedUnit(3.674935766406966e+19, Dimensions(length=-3, moles_hint=1), name='nanomoles_per_cubic_inch', ascii_symbol='nmol in^-3', symbol='nmolin⁻³') -picomoles_per_cubic_inch = NamedUnit(3.674935766406966e+16, Dimensions(length=-3, moles_hint=1), name='picomoles_per_cubic_inch', ascii_symbol='pmol in^-3', symbol='pmolin⁻³') -femtomoles_per_cubic_inch = NamedUnit(36749357664069.664, Dimensions(length=-3, moles_hint=1), name='femtomoles_per_cubic_inch', ascii_symbol='fmol in^-3', symbol='fmolin⁻³') -attomoles_per_cubic_inch = NamedUnit(36749357664.069664, Dimensions(length=-3, moles_hint=1), name='attomoles_per_cubic_inch', ascii_symbol='amol in^-3', symbol='amolin⁻³') +smaller_magnitudes: list[Magnitude] = [ + Magnitude("m", None, None, "milli", 1e-3), + Magnitude("u", "µ", r"\mu", "micro", 1e-6), + Magnitude("n", None, None, "nano", 1e-9), + Magnitude("p", None, None, "pico", 1e-12), + Magnitude("f", None, None, "femto", 1e-15), + Magnitude("a", None, None, "atto", 1e-18), +] -# -# Lookup table from symbols to units -# +unusual_magnitudes: list[Magnitude] = [ + Magnitude("d", None, None, "deci", 1e-1), + Magnitude("c", None, None, "centi", 1e-2), +] + +all_magnitudes = bigger_magnitudes + smaller_magnitudes + +UnitData = namedtuple( + "UnitData", + [ + "symbol", + "special_symbol", + "latex_symbol", + "singular", + "plural", + "scale", + "length", + "time", + "mass", + "current", + "temperature", + "moles_hint", + "angle_hint", + "magnitudes", + ], +) + +# Length, time, mass, current, temperature +base_si_units: list[UnitData] = [ + UnitData( + "m", + None, + None, + "meter", + "meters", + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + all_magnitudes + unusual_magnitudes, + ), + UnitData( + "s", None, None, "second", "seconds", 1, 0, 1, 0, 0, 0, 0, 0, smaller_magnitudes + ), + UnitData( + "g", None, None, "gram", "grams", 1e-3, 0, 0, 1, 0, 0, 0, 0, all_magnitudes + ), + UnitData( + "A", None, None, "ampere", "amperes", 1, 0, 0, 0, 1, 0, 0, 0, all_magnitudes + ), + UnitData( + "K", None, None, "kelvin", "kelvin", 1, 0, 0, 0, 0, 1, 0, 0, all_magnitudes + ), +] + +derived_si_units: list[UnitData] = [ + UnitData( + "Hz", None, None, "hertz", "hertz", 1, 0, -1, 0, 0, 0, 0, 0, all_magnitudes + ), + UnitData( + "N", None, None, "newton", "newtons", 1, 1, -2, 1, 0, 0, 0, 0, all_magnitudes + ), + UnitData( + "Pa", None, None, "pascal", "pascals", 1, -1, -2, 1, 0, 0, 0, 0, all_magnitudes + ), + UnitData( + "J", None, None, "joule", "joules", 1, 2, -2, 1, 0, 0, 0, 0, all_magnitudes + ), + UnitData("W", None, None, "watt", "watts", 1, 2, -3, 1, 0, 0, 0, 0, all_magnitudes), + UnitData( + "C", None, None, "coulomb", "coulombs", 1, 0, 1, 0, 1, 0, 0, 0, all_magnitudes + ), + UnitData( + "V", None, None, "volts", "volts", 1, 2, -3, 1, -1, 0, 0, 0, all_magnitudes + ), + UnitData( + "Ohm", "Ω", r"\Omega", "ohm", "ohms", 1, 2, -3, 1, -2, 0, 0, 0, all_magnitudes + ), + UnitData( + "F", None, None, "farad", "farads", 1, -2, 4, -1, 2, 0, 0, 0, all_magnitudes + ), + UnitData( + "S", None, None, "siemens", "siemens", 1, -2, 3, -1, 2, 0, 0, 0, all_magnitudes + ), + UnitData( + "Wb", None, None, "weber", "webers", 1, 2, -2, 1, -1, 0, 0, 0, all_magnitudes + ), + UnitData( + "T", None, None, "tesla", "tesla", 1, 0, -2, 1, -1, 0, 0, 0, all_magnitudes + ), + UnitData( + "H", None, None, "henry", "henry", 1, 2, -2, 1, -2, 0, 0, 0, all_magnitudes + ), +] + +non_si_dimensioned_units: list[UnitData] = [ + UnitData( + "Ang", "Å", r"\AA", "angstrom", "angstroms", 1e-10, 1, 0, 0, 0, 0, 0, 0, [] + ), + UnitData("micron", None, None, "micron", "microns", 1e-6, 1, 0, 0, 0, 0, 0, 0, []), + UnitData("min", None, None, "minute", "minutes", 60, 0, 1, 0, 0, 0, 0, 0, []), + UnitData( + "rpm", + None, + None, + "revolutions per minute", + "revolutions per minute", + 1 / 60, + 0, + -1, + 0, + 0, + 0, + 0, + 0, + [], + ), + UnitData("h", None, None, "hour", "hours", 3600, 0, 1, 0, 0, 0, 0, 0, []), + UnitData("d", None, None, "day", "days", 3600 * 24, 0, 1, 0, 0, 0, 0, 0, []), + UnitData( + "y", None, None, "year", "years", 3600 * 24 * 365.2425, 0, 1, 0, 0, 0, 0, 0, [] + ), + UnitData( + "deg", None, None, "degree", "degrees", 180 / np.pi, 0, 0, 0, 0, 0, 0, 1, [] + ), + UnitData("rad", None, None, "radian", "radians", 1, 0, 0, 0, 0, 0, 0, 1, []), + UnitData( + "rot", None, None, "rotation", "rotations", 2 * np.pi, 0, 0, 0, 0, 0, 0, 1, [] + ), + UnitData("sr", None, None, "stradian", "stradians", 1, 0, 0, 0, 0, 0, 0, 2, []), + UnitData("l", None, None, "litre", "litres", 1e-3, 3, 0, 0, 0, 0, 0, 0, []), + UnitData( + "eV", + None, + None, + "electronvolt", + "electronvolts", + 1.602176634e-19, + 2, + -2, + 1, + 0, + 0, + 0, + 0, + all_magnitudes, + ), + UnitData( + "au", + None, + None, + "atomic mass unit", + "atomic mass units", + 1.660538921e-27, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + [], + ), + UnitData( + "mol", + None, + None, + "mole", + "moles", + 6.02214076e23, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + smaller_magnitudes, + ), + UnitData( + "kgForce", None, None, "kg force", "kg force", 9.80665, 1, -2, 1, 0, 0, 0, 0, [] + ), + UnitData( + "C", None, None, "degree Celsius", "degrees Celsius", 1, 0, 0, 0, 0, 1, 0, 0, [] + ), + UnitData( + "miles", None, None, "mile", "miles", 1760 * 3 * 0.3048, 1, 0, 0, 0, 0, 0, 0, [] + ), + UnitData("yrd", None, None, "yard", "yards", 3 * 0.3048, 1, 0, 0, 0, 0, 0, 0, []), + UnitData("ft", None, None, "foot", "feet", 0.3048, 1, 0, 0, 0, 0, 0, 0, []), + UnitData("in", None, None, "inch", "inches", 0.0254, 1, 0, 0, 0, 0, 0, 0, []), + UnitData("lb", None, None, "pound", "pounds", 0.45359237, 0, 0, 1, 0, 0, 0, 0, []), + UnitData( + "lbf", + None, + None, + "pound force", + "pounds force", + 4.448222, + 1, + -2, + 1, + 0, + 0, + 0, + 0, + [], + ), + UnitData( + "oz", None, None, "ounce", "ounces", 0.45359237 / 16, 0, 0, 1, 0, 0, 0, 0, [] + ), + UnitData( + "psi", + None, + None, + "pound force per square inch", + "pounds force per square inch", + 4.448222 / (0.0254**2), + -1, + -2, + 1, + 0, + 0, + 0, + 0, + [], + ), +] + +non_si_dimensionless_units: list[UnitData] = [ + UnitData("none", None, None, "none", "none", 1, 0, 0, 0, 0, 0, 0, 0, []), + UnitData( + "percent", "%", r"\%", "percent", "percent", 0.01, 0, 0, 0, 0, 0, 0, 0, [] + ), +] -symbol_lookup = { - "m": meters, - "Em": exameters, - "Pm": petameters, - "Tm": terameters, - "Gm": gigameters, - "Mm": megameters, - "km": kilometers, - "mm": millimeters, - "um": micrometers, - "µm": micrometers, - "nm": nanometers, - "pm": picometers, - "fm": femtometers, - "am": attometers, - "dm": decimeters, - "cm": centimeters, - "s": seconds, - "ms": milliseconds, - "us": microseconds, - "µs": microseconds, - "ns": nanoseconds, - "ps": picoseconds, - "fs": femtoseconds, - "as": attoseconds, - "g": grams, - "Eg": exagrams, - "Pg": petagrams, - "Tg": teragrams, - "Gg": gigagrams, - "Mg": megagrams, - "kg": kilograms, - "mg": milligrams, - "ug": micrograms, - "µg": micrograms, - "ng": nanograms, - "pg": picograms, - "fg": femtograms, - "ag": attograms, - "A": angstroms, - "EA": exaamperes, - "PA": petaamperes, - "TA": teraamperes, - "GA": gigaamperes, - "MA": megaamperes, - "kA": kiloamperes, - "mA": milliamperes, - "uA": microamperes, - "µA": microamperes, - "nA": nanoamperes, - "pA": picoamperes, - "fA": femtoamperes, - "aA": attoamperes, - "K": kelvin, - "EK": exakelvin, - "PK": petakelvin, - "TK": terakelvin, - "GK": gigakelvin, - "MK": megakelvin, - "kK": kilokelvin, - "mK": millikelvin, - "uK": microkelvin, - "µK": microkelvin, - "nK": nanokelvin, - "pK": picokelvin, - "fK": femtokelvin, - "aK": attokelvin, - "Hz": hertz, - "EHz": exahertz, - "PHz": petahertz, - "THz": terahertz, - "GHz": gigahertz, - "MHz": megahertz, - "kHz": kilohertz, - "mHz": millihertz, - "uHz": microhertz, - "µHz": microhertz, - "nHz": nanohertz, - "pHz": picohertz, - "fHz": femtohertz, - "aHz": attohertz, - "N": newtons, - "EN": exanewtons, - "PN": petanewtons, - "TN": teranewtons, - "GN": giganewtons, - "MN": meganewtons, - "kN": kilonewtons, - "mN": millinewtons, - "uN": micronewtons, - "µN": micronewtons, - "nN": nanonewtons, - "pN": piconewtons, - "fN": femtonewtons, - "aN": attonewtons, - "Pa": pascals, - "EPa": exapascals, - "PPa": petapascals, - "TPa": terapascals, - "GPa": gigapascals, - "MPa": megapascals, - "kPa": kilopascals, - "mPa": millipascals, - "uPa": micropascals, - "µPa": micropascals, - "nPa": nanopascals, - "pPa": picopascals, - "fPa": femtopascals, - "aPa": attopascals, - "J": joules, - "EJ": exajoules, - "PJ": petajoules, - "TJ": terajoules, - "GJ": gigajoules, - "MJ": megajoules, - "kJ": kilojoules, - "mJ": millijoules, - "uJ": microjoules, - "µJ": microjoules, - "nJ": nanojoules, - "pJ": picojoules, - "fJ": femtojoules, - "aJ": attojoules, - "W": watts, - "EW": exawatts, - "PW": petawatts, - "TW": terawatts, - "GW": gigawatts, - "MW": megawatts, - "kW": kilowatts, - "mW": milliwatts, - "uW": microwatts, - "µW": microwatts, - "nW": nanowatts, - "pW": picowatts, - "fW": femtowatts, - "aW": attowatts, - "C": kelvin, - "EC": exacoulombs, - "PC": petacoulombs, - "TC": teracoulombs, - "GC": gigacoulombs, - "MC": megacoulombs, - "kC": kilocoulombs, - "mC": millicoulombs, - "uC": microcoulombs, - "µC": microcoulombs, - "nC": nanocoulombs, - "pC": picocoulombs, - "fC": femtocoulombs, - "aC": attocoulombs, - "V": volts, - "EV": exavolts, - "PV": petavolts, - "TV": teravolts, - "GV": gigavolts, - "MV": megavolts, - "kV": kilovolts, - "mV": millivolts, - "uV": microvolts, - "µV": microvolts, - "nV": nanovolts, - "pV": picovolts, - "fV": femtovolts, - "aV": attovolts, - "Ohm": ohms, - "Ω": ohms, - "EOhm": exaohms, - "EΩ": exaohms, - "POhm": petaohms, - "PΩ": petaohms, - "TOhm": teraohms, - "TΩ": teraohms, - "GOhm": gigaohms, - "GΩ": gigaohms, - "MOhm": megaohms, - "MΩ": megaohms, - "kOhm": kiloohms, - "kΩ": kiloohms, - "mOhm": milliohms, - "mΩ": milliohms, - "uOhm": microohms, - "µΩ": microohms, - "nOhm": nanoohms, - "nΩ": nanoohms, - "pOhm": picoohms, - "pΩ": picoohms, - "fOhm": femtoohms, - "fΩ": femtoohms, - "aOhm": attoohms, - "aΩ": attoohms, - "F": farads, - "EF": exafarads, - "PF": petafarads, - "TF": terafarads, - "GF": gigafarads, - "MF": megafarads, - "kF": kilofarads, - "mF": millifarads, - "uF": microfarads, - "µF": microfarads, - "nF": nanofarads, - "pF": picofarads, - "fF": femtofarads, - "aF": attofarads, - "S": siemens, - "ES": exasiemens, - "PS": petasiemens, - "TS": terasiemens, - "GS": gigasiemens, - "MS": megasiemens, - "kS": kilosiemens, - "mS": millisiemens, - "uS": microsiemens, - "µS": microsiemens, - "nS": nanosiemens, - "pS": picosiemens, - "fS": femtosiemens, - "aS": attosiemens, - "Wb": webers, - "EWb": exawebers, - "PWb": petawebers, - "TWb": terawebers, - "GWb": gigawebers, - "MWb": megawebers, - "kWb": kilowebers, - "mWb": milliwebers, - "uWb": microwebers, - "µWb": microwebers, - "nWb": nanowebers, - "pWb": picowebers, - "fWb": femtowebers, - "aWb": attowebers, - "T": tesla, - "ET": exatesla, - "PT": petatesla, - "TT": teratesla, - "GT": gigatesla, - "MT": megatesla, - "kT": kilotesla, - "mT": millitesla, - "uT": microtesla, - "µT": microtesla, - "nT": nanotesla, - "pT": picotesla, - "fT": femtotesla, - "aT": attotesla, - "H": henry, - "EH": exahenry, - "PH": petahenry, - "TH": terahenry, - "GH": gigahenry, - "MH": megahenry, - "kH": kilohenry, - "mH": millihenry, - "uH": microhenry, - "µH": microhenry, - "nH": nanohenry, - "pH": picohenry, - "fH": femtohenry, - "aH": attohenry, - "Ang": angstroms, - "Å": angstroms, - "micron": microns, - "min": minutes, - "h": hours, - "d": days, - "y": years, - "deg": degrees, - "rad": radians, - "rot": rotations, - "sr": stradians, - "l": litres, - "eV": electronvolts, - "EeV": exaelectronvolts, - "PeV": petaelectronvolts, - "TeV": teraelectronvolts, - "GeV": gigaelectronvolts, - "MeV": megaelectronvolts, - "keV": kiloelectronvolts, - "meV": millielectronvolts, - "ueV": microelectronvolts, - "µeV": microelectronvolts, - "neV": nanoelectronvolts, - "peV": picoelectronvolts, - "feV": femtoelectronvolts, - "aeV": attoelectronvolts, - "au": atomic_mass_units, - "mol": moles, - "mmol": millimoles, - "umol": micromoles, - "µmol": micromoles, - "nmol": nanomoles, - "pmol": picomoles, - "fmol": femtomoles, - "amol": attomoles, - "kgForce": kg_force, - "miles": miles, - "yrd": yards, - "ft": feet, - "in": inches, - "lb": pounds, - "lbf": pounds_force, - "oz": ounces, - "psi": pounds_force_per_square_inch, - "percent": percent, - "%": percent, - "Amps": amperes, - "amps": amperes, - "Coulombs": degrees_celsius, - "coulombs": degrees_celsius, - "yr": years, - "year": years, - "day": days, - "hr": hours, - "hour": hours, - "amu": atomic_mass_units, - "degr": degrees, - "Deg": degrees, - "degree": degrees, - "degrees": degrees, - "Degrees": degrees, - "Counts": none, - "counts": none, - "cnts": none, - "Cnts": none, - "a.u.": none, - "fraction": none, - "Fraction": none, +non_si_units: list[UnitData] = non_si_dimensioned_units + non_si_dimensionless_units + +# TODO: +# Add Hartree? Rydberg? Bohrs? +# Add CGS + +# Two stages of aliases, to make sure units don't get lost + +aliases_1 = {"A": ["Amps", "amps"], "C": ["Coulombs", "coulombs"]} + +aliases_2 = { + "y": ["yr", "year"], + "d": ["day"], + "h": ["hr", "hour"], + "Ang": ["A", "Å"], + "au": ["amu"], + "percent": ["%"], + "deg": ["degr", "Deg", "degree", "degrees", "Degrees"], + "none": ["Counts", "counts", "cnts", "Cnts", "a.u.", "fraction", "Fraction"], + "K": ["C"], # Ugh, cansas } +all_units: list[UnitData] = base_si_units + derived_si_units + non_si_units + +encoding = "utf-8" + + +def format_name(name: str): + return name.lower().replace(" ", "_") + + +this = sys.modules[__name__] + +### Begin live patching + +symbol_lookup: dict[str, NamedUnit] = {} +unit_types_temp = defaultdict(list) # Keep track of unit types +unit_types = defaultdict(list) + +for unit_def in all_units: + formatted_plural = format_name(unit_def.plural) + formatted_singular = format_name(unit_def.singular) + + dimensions = Dimensions( + unit_def.length, + unit_def.time, + unit_def.mass, + unit_def.current, + unit_def.temperature, + unit_def.moles_hint, + unit_def.angle_hint, + ) + current_unit = NamedUnit( + unit_def.scale, + Dimensions( + unit_def.length, + unit_def.time, + unit_def.mass, + unit_def.current, + unit_def.temperature, + unit_def.moles_hint, + unit_def.angle_hint, + ), + name=formatted_plural, + ascii_symbol=unit_def.symbol, + latex_symbol=unit_def.latex_symbol, + symbol=( + unit_def.symbol + if unit_def.special_symbol is None + else unit_def.special_symbol + ), + ) + setattr(this, formatted_plural, current_unit) + + symbol_lookup[unit_def.symbol] = current_unit + if unit_def.special_symbol is not None: + symbol_lookup[unit_def.special_symbol] = current_unit + + unit_types_temp[hash(dimensions)].append( + ( + unit_def.symbol, + unit_def.special_symbol, + formatted_singular, + formatted_plural, + unit_def.scale, + dimensions, + ) + ) + + unit_types[hash(dimensions)].append(formatted_plural) + + for mag in unit_def.magnitudes: + # Work out the combined symbol, accounts for unicode or not + combined_special_symbol = ( + mag.symbol if mag.special_symbol is None else mag.special_symbol + ) + ( + unit_def.symbol + if unit_def.special_symbol is None + else unit_def.special_symbol + ) + + combined_symbol = mag.symbol + unit_def.symbol + + # Combined unit name + combined_name_singular = f"{mag.name}{formatted_singular}" + combined_name_plural = f"{mag.name}{formatted_plural}" + + combined_scale = unit_def.scale * mag.scale + + latex_symbol = None + if unit_def.latex_symbol is not None and mag.latex_symbol is not None: + latex_symbol = f"{{{mag.latex_symbol}}}{unit_def.latex_symbol}" + elif unit_def.latex_symbol is not None: + latex_symbol = f"{mag.symbol}{unit_def.latex_symbol}" + elif mag.latex_symbol is not None: + latex_symbol = f"{{{mag.latex_symbol}}}{unit_def.symbol}" + + # Units + dimensions = Dimensions( + unit_def.length, + unit_def.time, + unit_def.mass, + unit_def.current, + unit_def.temperature, + unit_def.moles_hint, + unit_def.angle_hint, + ) + + current_unit = NamedUnit( + combined_scale, + Dimensions( + unit_def.length, + unit_def.time, + unit_def.mass, + unit_def.current, + unit_def.temperature, + unit_def.moles_hint, + unit_def.angle_hint, + ), + name=combined_name_plural, + ascii_symbol=combined_symbol, + latex_symbol=latex_symbol, + symbol=combined_special_symbol, + ) + setattr(this, combined_name_plural, current_unit) + + symbol_lookup[combined_symbol] = current_unit + symbol_lookup[combined_special_symbol] = current_unit + + unit_types_temp[hash(dimensions)].append( + ( + combined_symbol, + combined_special_symbol, + combined_name_singular, + combined_name_plural, + combined_scale, + dimensions, + ) + ) + + unit_types[hash(dimensions)].append(combined_name_plural) + + +# Higher dimensioned types +# + +length_units = unit_types_temp[hash(Dimensions(length=1))] +time_units = unit_types_temp[hash(Dimensions(time=1))] +mass_units = unit_types_temp[hash(Dimensions(mass=1))] +amount_units = unit_types_temp[hash(Dimensions(moles_hint=1))] + + +# Length based +for symbol, special_symbol, singular, plural, scale, _ in length_units: + for prefix, power, name, unicode_suffix in [ + ("square_", 2, plural, "²"), + ("cubic_", 3, plural, "³"), + ("per_", -1, singular, "⁻¹"), + ("per_square_", -2, singular, "⁻²"), + ("per_cubic_", -3, singular, "⁻³"), + ]: + dimensions = Dimensions(length=power) + unit_name = prefix + name + unit_special_symbol = ( + symbol if special_symbol is None else special_symbol + ) + unicode_suffix + unit_symbol = symbol + f"^{power}" + setattr( + this, + unit_name, + NamedUnit( + scale**power, + Dimensions(length=power), + name=unit_name, + ascii_symbol=unit_symbol, + symbol=unit_special_symbol, + ), + ) + + unit_types[hash(dimensions)].append(unit_name) + +# Speed and acceleration +for ( + length_symbol, + length_special_symbol, + _, + length_name, + length_scale, + _, +) in length_units: + for time_symbol, time_special_symbol, time_name, _, time_scale, _ in time_units: + speed_name = length_name + "_per_" + time_name + accel_name = length_name + "_per_square_" + time_name + + speed_dimensions = Dimensions(length=1, time=-1) + accel_dimensions = Dimensions(length=1, time=-2) + + length_special = ( + length_special_symbol + if length_special_symbol is not None + else length_symbol + ) + time_special = ( + time_special_symbol if time_special_symbol is not None else time_symbol + ) + + setattr( + this, + speed_name, + NamedUnit( + length_scale / time_scale, + Dimensions(length=1, time=-1), + name=speed_name, + ascii_symbol=f"{length_symbol}/{time_symbol}", + symbol=f"{length_special}{time_special}⁻¹", + ), + ) + setattr( + this, + accel_name, + NamedUnit( + length_scale / time_scale**2, + Dimensions(length=1, time=-2), + name=speed_name, + ascii_symbol=f"{length_symbol}/{time_symbol}^2", + symbol=f"{length_special}{time_special}⁻²", + ), + ) + + unit_types[hash(speed_dimensions)].append(speed_name) + unit_types[hash(accel_dimensions)].append(accel_name) + +# Density +for ( + length_symbol, + length_special_symbol, + length_name, + _, + length_scale, + _, +) in length_units: + for mass_symbol, mass_special_symbol, _, mass_name, mass_scale, _ in mass_units: + name = mass_name + "_per_cubic_" + length_name + + dimensions = Dimensions(length=-3, mass=1) + + mass_special = ( + mass_symbol if mass_special_symbol is None else mass_special_symbol + ) + length_special = ( + length_symbol if length_special_symbol is None else length_special_symbol + ) + + setattr( + this, + name, + NamedUnit( + mass_scale / length_scale**3, + Dimensions(length=-3, mass=1), + name=name, + ascii_symbol=f"{mass_symbol} {length_symbol}^-3", + symbol=f"{mass_special}{length_special}⁻³", + ), + ) + + unit_types[hash(dimensions)].append(name) + +# Concentration +for ( + length_symbol, + length_special_symbol, + length_name, + _, + length_scale, + _, +) in length_units: + for ( + amount_symbol, + amount_special_symbol, + _, + amount_name, + amount_scale, + _, + ) in amount_units: + name = amount_name + "_per_cubic_" + length_name + + dimensions = Dimensions(length=-3, moles_hint=1) + + length_special = ( + length_symbol if length_special_symbol is None else length_special_symbol + ) + amount_special = ( + amount_symbol if amount_special_symbol is None else amount_special_symbol + ) + + setattr( + this, + name, + NamedUnit( + amount_scale / length_scale**3, + Dimensions(length=-3, moles_hint=1), + name=name, + ascii_symbol=f"{amount_symbol} {length_symbol}^-3", + symbol=f"{amount_special}{length_special}⁻³", + ), + ) + + unit_types[hash(dimensions)].append(name) + +# TODO: Torque, Momentum, Entropy + # -# Units by type +# Add aliases to symbol lookup table # +# Apply the alias transforms sequentially +for aliases in [aliases_1, aliases_2]: + for base_name in aliases: + alias_list = aliases[base_name] + for alias in alias_list: + symbol_lookup[alias] = symbol_lookup[base_name] + +# +# Collections of units by type +# -length = UnitGroup( - name = 'length', - units = [ - meters, - exameters, - petameters, - terameters, - gigameters, - megameters, - kilometers, - millimeters, - micrometers, - nanometers, - picometers, - femtometers, - attometers, - decimeters, - centimeters, - angstroms, - microns, - miles, - yards, - feet, - inches, -]) - -area = UnitGroup( - name = 'area', - units = [ - square_meters, - square_exameters, - square_petameters, - square_terameters, - square_gigameters, - square_megameters, - square_kilometers, - square_millimeters, - square_micrometers, - square_nanometers, - square_picometers, - square_femtometers, - square_attometers, - square_decimeters, - square_centimeters, - square_angstroms, - square_microns, - square_miles, - square_yards, - square_feet, - square_inches, -]) - -volume = UnitGroup( - name = 'volume', - units = [ - litres, - cubic_meters, - cubic_exameters, - cubic_petameters, - cubic_terameters, - cubic_gigameters, - cubic_megameters, - cubic_kilometers, - cubic_millimeters, - cubic_micrometers, - cubic_nanometers, - cubic_picometers, - cubic_femtometers, - cubic_attometers, - cubic_decimeters, - cubic_centimeters, - cubic_angstroms, - cubic_microns, - cubic_miles, - cubic_yards, - cubic_feet, - cubic_inches, -]) - -inverse_length = UnitGroup( - name = 'inverse_length', - units = [ - per_meter, - per_exameter, - per_petameter, - per_terameter, - per_gigameter, - per_megameter, - per_kilometer, - per_millimeter, - per_micrometer, - per_nanometer, - per_picometer, - per_femtometer, - per_attometer, - per_decimeter, - per_centimeter, - per_angstrom, - per_micron, - per_mile, - per_yard, - per_foot, - per_inch, -]) - -inverse_area = UnitGroup( - name = 'inverse_area', - units = [ - per_square_meter, - per_square_exameter, - per_square_petameter, - per_square_terameter, - per_square_gigameter, - per_square_megameter, - per_square_kilometer, - per_square_millimeter, - per_square_micrometer, - per_square_nanometer, - per_square_picometer, - per_square_femtometer, - per_square_attometer, - per_square_decimeter, - per_square_centimeter, - per_square_angstrom, - per_square_micron, - per_square_mile, - per_square_yard, - per_square_foot, - per_square_inch, -]) - -inverse_volume = UnitGroup( - name = 'inverse_volume', - units = [ - per_cubic_meter, - per_cubic_exameter, - per_cubic_petameter, - per_cubic_terameter, - per_cubic_gigameter, - per_cubic_megameter, - per_cubic_kilometer, - per_cubic_millimeter, - per_cubic_micrometer, - per_cubic_nanometer, - per_cubic_picometer, - per_cubic_femtometer, - per_cubic_attometer, - per_cubic_decimeter, - per_cubic_centimeter, - per_cubic_angstrom, - per_cubic_micron, - per_cubic_mile, - per_cubic_yard, - per_cubic_foot, - per_cubic_inch, -]) - -time = UnitGroup( - name = 'time', - units = [ - seconds, - milliseconds, - microseconds, - nanoseconds, - picoseconds, - femtoseconds, - attoseconds, - minutes, - hours, - days, - years, -]) - -rate = UnitGroup( - name = 'rate', - units = [ - hertz, - exahertz, - petahertz, - terahertz, - gigahertz, - megahertz, - kilohertz, - millihertz, - microhertz, - nanohertz, - picohertz, - femtohertz, - attohertz, -]) - -speed = UnitGroup( - name = 'speed', - units = [ - meters_per_second, - meters_per_millisecond, - meters_per_microsecond, - meters_per_nanosecond, - meters_per_picosecond, - meters_per_femtosecond, - meters_per_attosecond, - meters_per_minute, - meters_per_hour, - meters_per_day, - meters_per_year, - exameters_per_second, - exameters_per_millisecond, - exameters_per_microsecond, - exameters_per_nanosecond, - exameters_per_picosecond, - exameters_per_femtosecond, - exameters_per_attosecond, - exameters_per_minute, - exameters_per_hour, - exameters_per_day, - exameters_per_year, - petameters_per_second, - petameters_per_millisecond, - petameters_per_microsecond, - petameters_per_nanosecond, - petameters_per_picosecond, - petameters_per_femtosecond, - petameters_per_attosecond, - petameters_per_minute, - petameters_per_hour, - petameters_per_day, - petameters_per_year, - terameters_per_second, - terameters_per_millisecond, - terameters_per_microsecond, - terameters_per_nanosecond, - terameters_per_picosecond, - terameters_per_femtosecond, - terameters_per_attosecond, - terameters_per_minute, - terameters_per_hour, - terameters_per_day, - terameters_per_year, - gigameters_per_second, - gigameters_per_millisecond, - gigameters_per_microsecond, - gigameters_per_nanosecond, - gigameters_per_picosecond, - gigameters_per_femtosecond, - gigameters_per_attosecond, - gigameters_per_minute, - gigameters_per_hour, - gigameters_per_day, - gigameters_per_year, - megameters_per_second, - megameters_per_millisecond, - megameters_per_microsecond, - megameters_per_nanosecond, - megameters_per_picosecond, - megameters_per_femtosecond, - megameters_per_attosecond, - megameters_per_minute, - megameters_per_hour, - megameters_per_day, - megameters_per_year, - kilometers_per_second, - kilometers_per_millisecond, - kilometers_per_microsecond, - kilometers_per_nanosecond, - kilometers_per_picosecond, - kilometers_per_femtosecond, - kilometers_per_attosecond, - kilometers_per_minute, - kilometers_per_hour, - kilometers_per_day, - kilometers_per_year, - millimeters_per_second, - millimeters_per_millisecond, - millimeters_per_microsecond, - millimeters_per_nanosecond, - millimeters_per_picosecond, - millimeters_per_femtosecond, - millimeters_per_attosecond, - millimeters_per_minute, - millimeters_per_hour, - millimeters_per_day, - millimeters_per_year, - micrometers_per_second, - micrometers_per_millisecond, - micrometers_per_microsecond, - micrometers_per_nanosecond, - micrometers_per_picosecond, - micrometers_per_femtosecond, - micrometers_per_attosecond, - micrometers_per_minute, - micrometers_per_hour, - micrometers_per_day, - micrometers_per_year, - nanometers_per_second, - nanometers_per_millisecond, - nanometers_per_microsecond, - nanometers_per_nanosecond, - nanometers_per_picosecond, - nanometers_per_femtosecond, - nanometers_per_attosecond, - nanometers_per_minute, - nanometers_per_hour, - nanometers_per_day, - nanometers_per_year, - picometers_per_second, - picometers_per_millisecond, - picometers_per_microsecond, - picometers_per_nanosecond, - picometers_per_picosecond, - picometers_per_femtosecond, - picometers_per_attosecond, - picometers_per_minute, - picometers_per_hour, - picometers_per_day, - picometers_per_year, - femtometers_per_second, - femtometers_per_millisecond, - femtometers_per_microsecond, - femtometers_per_nanosecond, - femtometers_per_picosecond, - femtometers_per_femtosecond, - femtometers_per_attosecond, - femtometers_per_minute, - femtometers_per_hour, - femtometers_per_day, - femtometers_per_year, - attometers_per_second, - attometers_per_millisecond, - attometers_per_microsecond, - attometers_per_nanosecond, - attometers_per_picosecond, - attometers_per_femtosecond, - attometers_per_attosecond, - attometers_per_minute, - attometers_per_hour, - attometers_per_day, - attometers_per_year, - decimeters_per_second, - decimeters_per_millisecond, - decimeters_per_microsecond, - decimeters_per_nanosecond, - decimeters_per_picosecond, - decimeters_per_femtosecond, - decimeters_per_attosecond, - decimeters_per_minute, - decimeters_per_hour, - decimeters_per_day, - decimeters_per_year, - centimeters_per_second, - centimeters_per_millisecond, - centimeters_per_microsecond, - centimeters_per_nanosecond, - centimeters_per_picosecond, - centimeters_per_femtosecond, - centimeters_per_attosecond, - centimeters_per_minute, - centimeters_per_hour, - centimeters_per_day, - centimeters_per_year, - angstroms_per_second, - angstroms_per_millisecond, - angstroms_per_microsecond, - angstroms_per_nanosecond, - angstroms_per_picosecond, - angstroms_per_femtosecond, - angstroms_per_attosecond, - angstroms_per_minute, - angstroms_per_hour, - angstroms_per_day, - angstroms_per_year, - microns_per_second, - microns_per_millisecond, - microns_per_microsecond, - microns_per_nanosecond, - microns_per_picosecond, - microns_per_femtosecond, - microns_per_attosecond, - microns_per_minute, - microns_per_hour, - microns_per_day, - microns_per_year, - miles_per_second, - miles_per_millisecond, - miles_per_microsecond, - miles_per_nanosecond, - miles_per_picosecond, - miles_per_femtosecond, - miles_per_attosecond, - miles_per_minute, - miles_per_hour, - miles_per_day, - miles_per_year, - yards_per_second, - yards_per_millisecond, - yards_per_microsecond, - yards_per_nanosecond, - yards_per_picosecond, - yards_per_femtosecond, - yards_per_attosecond, - yards_per_minute, - yards_per_hour, - yards_per_day, - yards_per_year, - feet_per_second, - feet_per_millisecond, - feet_per_microsecond, - feet_per_nanosecond, - feet_per_picosecond, - feet_per_femtosecond, - feet_per_attosecond, - feet_per_minute, - feet_per_hour, - feet_per_day, - feet_per_year, - inches_per_second, - inches_per_millisecond, - inches_per_microsecond, - inches_per_nanosecond, - inches_per_picosecond, - inches_per_femtosecond, - inches_per_attosecond, - inches_per_minute, - inches_per_hour, - inches_per_day, - inches_per_year, -]) - -acceleration = UnitGroup( - name = 'acceleration', - units = [ - meters_per_square_second, - meters_per_square_millisecond, - meters_per_square_microsecond, - meters_per_square_nanosecond, - meters_per_square_picosecond, - meters_per_square_femtosecond, - meters_per_square_attosecond, - meters_per_square_minute, - meters_per_square_hour, - meters_per_square_day, - meters_per_square_year, - exameters_per_square_second, - exameters_per_square_millisecond, - exameters_per_square_microsecond, - exameters_per_square_nanosecond, - exameters_per_square_picosecond, - exameters_per_square_femtosecond, - exameters_per_square_attosecond, - exameters_per_square_minute, - exameters_per_square_hour, - exameters_per_square_day, - exameters_per_square_year, - petameters_per_square_second, - petameters_per_square_millisecond, - petameters_per_square_microsecond, - petameters_per_square_nanosecond, - petameters_per_square_picosecond, - petameters_per_square_femtosecond, - petameters_per_square_attosecond, - petameters_per_square_minute, - petameters_per_square_hour, - petameters_per_square_day, - petameters_per_square_year, - terameters_per_square_second, - terameters_per_square_millisecond, - terameters_per_square_microsecond, - terameters_per_square_nanosecond, - terameters_per_square_picosecond, - terameters_per_square_femtosecond, - terameters_per_square_attosecond, - terameters_per_square_minute, - terameters_per_square_hour, - terameters_per_square_day, - terameters_per_square_year, - gigameters_per_square_second, - gigameters_per_square_millisecond, - gigameters_per_square_microsecond, - gigameters_per_square_nanosecond, - gigameters_per_square_picosecond, - gigameters_per_square_femtosecond, - gigameters_per_square_attosecond, - gigameters_per_square_minute, - gigameters_per_square_hour, - gigameters_per_square_day, - gigameters_per_square_year, - megameters_per_square_second, - megameters_per_square_millisecond, - megameters_per_square_microsecond, - megameters_per_square_nanosecond, - megameters_per_square_picosecond, - megameters_per_square_femtosecond, - megameters_per_square_attosecond, - megameters_per_square_minute, - megameters_per_square_hour, - megameters_per_square_day, - megameters_per_square_year, - kilometers_per_square_second, - kilometers_per_square_millisecond, - kilometers_per_square_microsecond, - kilometers_per_square_nanosecond, - kilometers_per_square_picosecond, - kilometers_per_square_femtosecond, - kilometers_per_square_attosecond, - kilometers_per_square_minute, - kilometers_per_square_hour, - kilometers_per_square_day, - kilometers_per_square_year, - millimeters_per_square_second, - millimeters_per_square_millisecond, - millimeters_per_square_microsecond, - millimeters_per_square_nanosecond, - millimeters_per_square_picosecond, - millimeters_per_square_femtosecond, - millimeters_per_square_attosecond, - millimeters_per_square_minute, - millimeters_per_square_hour, - millimeters_per_square_day, - millimeters_per_square_year, - micrometers_per_square_second, - micrometers_per_square_millisecond, - micrometers_per_square_microsecond, - micrometers_per_square_nanosecond, - micrometers_per_square_picosecond, - micrometers_per_square_femtosecond, - micrometers_per_square_attosecond, - micrometers_per_square_minute, - micrometers_per_square_hour, - micrometers_per_square_day, - micrometers_per_square_year, - nanometers_per_square_second, - nanometers_per_square_millisecond, - nanometers_per_square_microsecond, - nanometers_per_square_nanosecond, - nanometers_per_square_picosecond, - nanometers_per_square_femtosecond, - nanometers_per_square_attosecond, - nanometers_per_square_minute, - nanometers_per_square_hour, - nanometers_per_square_day, - nanometers_per_square_year, - picometers_per_square_second, - picometers_per_square_millisecond, - picometers_per_square_microsecond, - picometers_per_square_nanosecond, - picometers_per_square_picosecond, - picometers_per_square_femtosecond, - picometers_per_square_attosecond, - picometers_per_square_minute, - picometers_per_square_hour, - picometers_per_square_day, - picometers_per_square_year, - femtometers_per_square_second, - femtometers_per_square_millisecond, - femtometers_per_square_microsecond, - femtometers_per_square_nanosecond, - femtometers_per_square_picosecond, - femtometers_per_square_femtosecond, - femtometers_per_square_attosecond, - femtometers_per_square_minute, - femtometers_per_square_hour, - femtometers_per_square_day, - femtometers_per_square_year, - attometers_per_square_second, - attometers_per_square_millisecond, - attometers_per_square_microsecond, - attometers_per_square_nanosecond, - attometers_per_square_picosecond, - attometers_per_square_femtosecond, - attometers_per_square_attosecond, - attometers_per_square_minute, - attometers_per_square_hour, - attometers_per_square_day, - attometers_per_square_year, - decimeters_per_square_second, - decimeters_per_square_millisecond, - decimeters_per_square_microsecond, - decimeters_per_square_nanosecond, - decimeters_per_square_picosecond, - decimeters_per_square_femtosecond, - decimeters_per_square_attosecond, - decimeters_per_square_minute, - decimeters_per_square_hour, - decimeters_per_square_day, - decimeters_per_square_year, - centimeters_per_square_second, - centimeters_per_square_millisecond, - centimeters_per_square_microsecond, - centimeters_per_square_nanosecond, - centimeters_per_square_picosecond, - centimeters_per_square_femtosecond, - centimeters_per_square_attosecond, - centimeters_per_square_minute, - centimeters_per_square_hour, - centimeters_per_square_day, - centimeters_per_square_year, - angstroms_per_square_second, - angstroms_per_square_millisecond, - angstroms_per_square_microsecond, - angstroms_per_square_nanosecond, - angstroms_per_square_picosecond, - angstroms_per_square_femtosecond, - angstroms_per_square_attosecond, - angstroms_per_square_minute, - angstroms_per_square_hour, - angstroms_per_square_day, - angstroms_per_square_year, - microns_per_square_second, - microns_per_square_millisecond, - microns_per_square_microsecond, - microns_per_square_nanosecond, - microns_per_square_picosecond, - microns_per_square_femtosecond, - microns_per_square_attosecond, - microns_per_square_minute, - microns_per_square_hour, - microns_per_square_day, - microns_per_square_year, - miles_per_square_second, - miles_per_square_millisecond, - miles_per_square_microsecond, - miles_per_square_nanosecond, - miles_per_square_picosecond, - miles_per_square_femtosecond, - miles_per_square_attosecond, - miles_per_square_minute, - miles_per_square_hour, - miles_per_square_day, - miles_per_square_year, - yards_per_square_second, - yards_per_square_millisecond, - yards_per_square_microsecond, - yards_per_square_nanosecond, - yards_per_square_picosecond, - yards_per_square_femtosecond, - yards_per_square_attosecond, - yards_per_square_minute, - yards_per_square_hour, - yards_per_square_day, - yards_per_square_year, - feet_per_square_second, - feet_per_square_millisecond, - feet_per_square_microsecond, - feet_per_square_nanosecond, - feet_per_square_picosecond, - feet_per_square_femtosecond, - feet_per_square_attosecond, - feet_per_square_minute, - feet_per_square_hour, - feet_per_square_day, - feet_per_square_year, - inches_per_square_second, - inches_per_square_millisecond, - inches_per_square_microsecond, - inches_per_square_nanosecond, - inches_per_square_picosecond, - inches_per_square_femtosecond, - inches_per_square_attosecond, - inches_per_square_minute, - inches_per_square_hour, - inches_per_square_day, - inches_per_square_year, -]) - -density = UnitGroup( - name = 'density', - units = [ - grams_per_cubic_meter, - exagrams_per_cubic_meter, - petagrams_per_cubic_meter, - teragrams_per_cubic_meter, - gigagrams_per_cubic_meter, - megagrams_per_cubic_meter, - kilograms_per_cubic_meter, - milligrams_per_cubic_meter, - micrograms_per_cubic_meter, - nanograms_per_cubic_meter, - picograms_per_cubic_meter, - femtograms_per_cubic_meter, - attograms_per_cubic_meter, - atomic_mass_units_per_cubic_meter, - pounds_per_cubic_meter, - ounces_per_cubic_meter, - grams_per_cubic_exameter, - exagrams_per_cubic_exameter, - petagrams_per_cubic_exameter, - teragrams_per_cubic_exameter, - gigagrams_per_cubic_exameter, - megagrams_per_cubic_exameter, - kilograms_per_cubic_exameter, - milligrams_per_cubic_exameter, - micrograms_per_cubic_exameter, - nanograms_per_cubic_exameter, - picograms_per_cubic_exameter, - femtograms_per_cubic_exameter, - attograms_per_cubic_exameter, - atomic_mass_units_per_cubic_exameter, - pounds_per_cubic_exameter, - ounces_per_cubic_exameter, - grams_per_cubic_petameter, - exagrams_per_cubic_petameter, - petagrams_per_cubic_petameter, - teragrams_per_cubic_petameter, - gigagrams_per_cubic_petameter, - megagrams_per_cubic_petameter, - kilograms_per_cubic_petameter, - milligrams_per_cubic_petameter, - micrograms_per_cubic_petameter, - nanograms_per_cubic_petameter, - picograms_per_cubic_petameter, - femtograms_per_cubic_petameter, - attograms_per_cubic_petameter, - atomic_mass_units_per_cubic_petameter, - pounds_per_cubic_petameter, - ounces_per_cubic_petameter, - grams_per_cubic_terameter, - exagrams_per_cubic_terameter, - petagrams_per_cubic_terameter, - teragrams_per_cubic_terameter, - gigagrams_per_cubic_terameter, - megagrams_per_cubic_terameter, - kilograms_per_cubic_terameter, - milligrams_per_cubic_terameter, - micrograms_per_cubic_terameter, - nanograms_per_cubic_terameter, - picograms_per_cubic_terameter, - femtograms_per_cubic_terameter, - attograms_per_cubic_terameter, - atomic_mass_units_per_cubic_terameter, - pounds_per_cubic_terameter, - ounces_per_cubic_terameter, - grams_per_cubic_gigameter, - exagrams_per_cubic_gigameter, - petagrams_per_cubic_gigameter, - teragrams_per_cubic_gigameter, - gigagrams_per_cubic_gigameter, - megagrams_per_cubic_gigameter, - kilograms_per_cubic_gigameter, - milligrams_per_cubic_gigameter, - micrograms_per_cubic_gigameter, - nanograms_per_cubic_gigameter, - picograms_per_cubic_gigameter, - femtograms_per_cubic_gigameter, - attograms_per_cubic_gigameter, - atomic_mass_units_per_cubic_gigameter, - pounds_per_cubic_gigameter, - ounces_per_cubic_gigameter, - grams_per_cubic_megameter, - exagrams_per_cubic_megameter, - petagrams_per_cubic_megameter, - teragrams_per_cubic_megameter, - gigagrams_per_cubic_megameter, - megagrams_per_cubic_megameter, - kilograms_per_cubic_megameter, - milligrams_per_cubic_megameter, - micrograms_per_cubic_megameter, - nanograms_per_cubic_megameter, - picograms_per_cubic_megameter, - femtograms_per_cubic_megameter, - attograms_per_cubic_megameter, - atomic_mass_units_per_cubic_megameter, - pounds_per_cubic_megameter, - ounces_per_cubic_megameter, - grams_per_cubic_kilometer, - exagrams_per_cubic_kilometer, - petagrams_per_cubic_kilometer, - teragrams_per_cubic_kilometer, - gigagrams_per_cubic_kilometer, - megagrams_per_cubic_kilometer, - kilograms_per_cubic_kilometer, - milligrams_per_cubic_kilometer, - micrograms_per_cubic_kilometer, - nanograms_per_cubic_kilometer, - picograms_per_cubic_kilometer, - femtograms_per_cubic_kilometer, - attograms_per_cubic_kilometer, - atomic_mass_units_per_cubic_kilometer, - pounds_per_cubic_kilometer, - ounces_per_cubic_kilometer, - grams_per_cubic_millimeter, - exagrams_per_cubic_millimeter, - petagrams_per_cubic_millimeter, - teragrams_per_cubic_millimeter, - gigagrams_per_cubic_millimeter, - megagrams_per_cubic_millimeter, - kilograms_per_cubic_millimeter, - milligrams_per_cubic_millimeter, - micrograms_per_cubic_millimeter, - nanograms_per_cubic_millimeter, - picograms_per_cubic_millimeter, - femtograms_per_cubic_millimeter, - attograms_per_cubic_millimeter, - atomic_mass_units_per_cubic_millimeter, - pounds_per_cubic_millimeter, - ounces_per_cubic_millimeter, - grams_per_cubic_micrometer, - exagrams_per_cubic_micrometer, - petagrams_per_cubic_micrometer, - teragrams_per_cubic_micrometer, - gigagrams_per_cubic_micrometer, - megagrams_per_cubic_micrometer, - kilograms_per_cubic_micrometer, - milligrams_per_cubic_micrometer, - micrograms_per_cubic_micrometer, - nanograms_per_cubic_micrometer, - picograms_per_cubic_micrometer, - femtograms_per_cubic_micrometer, - attograms_per_cubic_micrometer, - atomic_mass_units_per_cubic_micrometer, - pounds_per_cubic_micrometer, - ounces_per_cubic_micrometer, - grams_per_cubic_nanometer, - exagrams_per_cubic_nanometer, - petagrams_per_cubic_nanometer, - teragrams_per_cubic_nanometer, - gigagrams_per_cubic_nanometer, - megagrams_per_cubic_nanometer, - kilograms_per_cubic_nanometer, - milligrams_per_cubic_nanometer, - micrograms_per_cubic_nanometer, - nanograms_per_cubic_nanometer, - picograms_per_cubic_nanometer, - femtograms_per_cubic_nanometer, - attograms_per_cubic_nanometer, - atomic_mass_units_per_cubic_nanometer, - pounds_per_cubic_nanometer, - ounces_per_cubic_nanometer, - grams_per_cubic_picometer, - exagrams_per_cubic_picometer, - petagrams_per_cubic_picometer, - teragrams_per_cubic_picometer, - gigagrams_per_cubic_picometer, - megagrams_per_cubic_picometer, - kilograms_per_cubic_picometer, - milligrams_per_cubic_picometer, - micrograms_per_cubic_picometer, - nanograms_per_cubic_picometer, - picograms_per_cubic_picometer, - femtograms_per_cubic_picometer, - attograms_per_cubic_picometer, - atomic_mass_units_per_cubic_picometer, - pounds_per_cubic_picometer, - ounces_per_cubic_picometer, - grams_per_cubic_femtometer, - exagrams_per_cubic_femtometer, - petagrams_per_cubic_femtometer, - teragrams_per_cubic_femtometer, - gigagrams_per_cubic_femtometer, - megagrams_per_cubic_femtometer, - kilograms_per_cubic_femtometer, - milligrams_per_cubic_femtometer, - micrograms_per_cubic_femtometer, - nanograms_per_cubic_femtometer, - picograms_per_cubic_femtometer, - femtograms_per_cubic_femtometer, - attograms_per_cubic_femtometer, - atomic_mass_units_per_cubic_femtometer, - pounds_per_cubic_femtometer, - ounces_per_cubic_femtometer, - grams_per_cubic_attometer, - exagrams_per_cubic_attometer, - petagrams_per_cubic_attometer, - teragrams_per_cubic_attometer, - gigagrams_per_cubic_attometer, - megagrams_per_cubic_attometer, - kilograms_per_cubic_attometer, - milligrams_per_cubic_attometer, - micrograms_per_cubic_attometer, - nanograms_per_cubic_attometer, - picograms_per_cubic_attometer, - femtograms_per_cubic_attometer, - attograms_per_cubic_attometer, - atomic_mass_units_per_cubic_attometer, - pounds_per_cubic_attometer, - ounces_per_cubic_attometer, - grams_per_cubic_decimeter, - exagrams_per_cubic_decimeter, - petagrams_per_cubic_decimeter, - teragrams_per_cubic_decimeter, - gigagrams_per_cubic_decimeter, - megagrams_per_cubic_decimeter, - kilograms_per_cubic_decimeter, - milligrams_per_cubic_decimeter, - micrograms_per_cubic_decimeter, - nanograms_per_cubic_decimeter, - picograms_per_cubic_decimeter, - femtograms_per_cubic_decimeter, - attograms_per_cubic_decimeter, - atomic_mass_units_per_cubic_decimeter, - pounds_per_cubic_decimeter, - ounces_per_cubic_decimeter, - grams_per_cubic_centimeter, - exagrams_per_cubic_centimeter, - petagrams_per_cubic_centimeter, - teragrams_per_cubic_centimeter, - gigagrams_per_cubic_centimeter, - megagrams_per_cubic_centimeter, - kilograms_per_cubic_centimeter, - milligrams_per_cubic_centimeter, - micrograms_per_cubic_centimeter, - nanograms_per_cubic_centimeter, - picograms_per_cubic_centimeter, - femtograms_per_cubic_centimeter, - attograms_per_cubic_centimeter, - atomic_mass_units_per_cubic_centimeter, - pounds_per_cubic_centimeter, - ounces_per_cubic_centimeter, - grams_per_cubic_angstrom, - exagrams_per_cubic_angstrom, - petagrams_per_cubic_angstrom, - teragrams_per_cubic_angstrom, - gigagrams_per_cubic_angstrom, - megagrams_per_cubic_angstrom, - kilograms_per_cubic_angstrom, - milligrams_per_cubic_angstrom, - micrograms_per_cubic_angstrom, - nanograms_per_cubic_angstrom, - picograms_per_cubic_angstrom, - femtograms_per_cubic_angstrom, - attograms_per_cubic_angstrom, - atomic_mass_units_per_cubic_angstrom, - pounds_per_cubic_angstrom, - ounces_per_cubic_angstrom, - grams_per_cubic_micron, - exagrams_per_cubic_micron, - petagrams_per_cubic_micron, - teragrams_per_cubic_micron, - gigagrams_per_cubic_micron, - megagrams_per_cubic_micron, - kilograms_per_cubic_micron, - milligrams_per_cubic_micron, - micrograms_per_cubic_micron, - nanograms_per_cubic_micron, - picograms_per_cubic_micron, - femtograms_per_cubic_micron, - attograms_per_cubic_micron, - atomic_mass_units_per_cubic_micron, - pounds_per_cubic_micron, - ounces_per_cubic_micron, - grams_per_cubic_mile, - exagrams_per_cubic_mile, - petagrams_per_cubic_mile, - teragrams_per_cubic_mile, - gigagrams_per_cubic_mile, - megagrams_per_cubic_mile, - kilograms_per_cubic_mile, - milligrams_per_cubic_mile, - micrograms_per_cubic_mile, - nanograms_per_cubic_mile, - picograms_per_cubic_mile, - femtograms_per_cubic_mile, - attograms_per_cubic_mile, - atomic_mass_units_per_cubic_mile, - pounds_per_cubic_mile, - ounces_per_cubic_mile, - grams_per_cubic_yard, - exagrams_per_cubic_yard, - petagrams_per_cubic_yard, - teragrams_per_cubic_yard, - gigagrams_per_cubic_yard, - megagrams_per_cubic_yard, - kilograms_per_cubic_yard, - milligrams_per_cubic_yard, - micrograms_per_cubic_yard, - nanograms_per_cubic_yard, - picograms_per_cubic_yard, - femtograms_per_cubic_yard, - attograms_per_cubic_yard, - atomic_mass_units_per_cubic_yard, - pounds_per_cubic_yard, - ounces_per_cubic_yard, - grams_per_cubic_foot, - exagrams_per_cubic_foot, - petagrams_per_cubic_foot, - teragrams_per_cubic_foot, - gigagrams_per_cubic_foot, - megagrams_per_cubic_foot, - kilograms_per_cubic_foot, - milligrams_per_cubic_foot, - micrograms_per_cubic_foot, - nanograms_per_cubic_foot, - picograms_per_cubic_foot, - femtograms_per_cubic_foot, - attograms_per_cubic_foot, - atomic_mass_units_per_cubic_foot, - pounds_per_cubic_foot, - ounces_per_cubic_foot, - grams_per_cubic_inch, - exagrams_per_cubic_inch, - petagrams_per_cubic_inch, - teragrams_per_cubic_inch, - gigagrams_per_cubic_inch, - megagrams_per_cubic_inch, - kilograms_per_cubic_inch, - milligrams_per_cubic_inch, - micrograms_per_cubic_inch, - nanograms_per_cubic_inch, - picograms_per_cubic_inch, - femtograms_per_cubic_inch, - attograms_per_cubic_inch, - atomic_mass_units_per_cubic_inch, - pounds_per_cubic_inch, - ounces_per_cubic_inch, -]) - -force = UnitGroup( - name = 'force', - units = [ - newtons, - exanewtons, - petanewtons, - teranewtons, - giganewtons, - meganewtons, - kilonewtons, - millinewtons, - micronewtons, - nanonewtons, - piconewtons, - femtonewtons, - attonewtons, - kg_force, - pounds_force, -]) - -pressure = UnitGroup( - name = 'pressure', - units = [ - pascals, - exapascals, - petapascals, - terapascals, - gigapascals, - megapascals, - kilopascals, - millipascals, - micropascals, - nanopascals, - picopascals, - femtopascals, - attopascals, - pounds_force_per_square_inch, -]) - -energy = UnitGroup( - name = 'energy', - units = [ - joules, - exajoules, - petajoules, - terajoules, - gigajoules, - megajoules, - kilojoules, - millijoules, - microjoules, - nanojoules, - picojoules, - femtojoules, - attojoules, - electronvolts, - exaelectronvolts, - petaelectronvolts, - teraelectronvolts, - gigaelectronvolts, - megaelectronvolts, - kiloelectronvolts, - millielectronvolts, - microelectronvolts, - nanoelectronvolts, - picoelectronvolts, - femtoelectronvolts, - attoelectronvolts, -]) - -power = UnitGroup( - name = 'power', - units = [ - watts, - exawatts, - petawatts, - terawatts, - gigawatts, - megawatts, - kilowatts, - milliwatts, - microwatts, - nanowatts, - picowatts, - femtowatts, - attowatts, -]) - -charge = UnitGroup( - name = 'charge', - units = [ - coulombs, - exacoulombs, - petacoulombs, - teracoulombs, - gigacoulombs, - megacoulombs, - kilocoulombs, - millicoulombs, - microcoulombs, - nanocoulombs, - picocoulombs, - femtocoulombs, - attocoulombs, -]) - -potential = UnitGroup( - name = 'potential', - units = [ - volts, - exavolts, - petavolts, - teravolts, - gigavolts, - megavolts, - kilovolts, - millivolts, - microvolts, - nanovolts, - picovolts, - femtovolts, - attovolts, -]) - -resistance = UnitGroup( - name = 'resistance', - units = [ - ohms, - exaohms, - petaohms, - teraohms, - gigaohms, - megaohms, - kiloohms, - milliohms, - microohms, - nanoohms, - picoohms, - femtoohms, - attoohms, -]) - -capacitance = UnitGroup( - name = 'capacitance', - units = [ - farads, - exafarads, - petafarads, - terafarads, - gigafarads, - megafarads, - kilofarads, - millifarads, - microfarads, - nanofarads, - picofarads, - femtofarads, - attofarads, -]) - -conductance = UnitGroup( - name = 'conductance', - units = [ - siemens, - exasiemens, - petasiemens, - terasiemens, - gigasiemens, - megasiemens, - kilosiemens, - millisiemens, - microsiemens, - nanosiemens, - picosiemens, - femtosiemens, - attosiemens, -]) - -magnetic_flux = UnitGroup( - name = 'magnetic_flux', - units = [ - webers, - exawebers, - petawebers, - terawebers, - gigawebers, - megawebers, - kilowebers, - milliwebers, - microwebers, - nanowebers, - picowebers, - femtowebers, - attowebers, -]) - -magnetic_flux_density = UnitGroup( - name = 'magnetic_flux_density', - units = [ - tesla, - exatesla, - petatesla, - teratesla, - gigatesla, - megatesla, - kilotesla, - millitesla, - microtesla, - nanotesla, - picotesla, - femtotesla, - attotesla, -]) - -inductance = UnitGroup( - name = 'inductance', - units = [ - henry, - exahenry, - petahenry, - terahenry, - gigahenry, - megahenry, - kilohenry, - millihenry, - microhenry, - nanohenry, - picohenry, - femtohenry, - attohenry, -]) - -temperature = UnitGroup( - name = 'temperature', - units = [ - kelvin, - exakelvin, - petakelvin, - terakelvin, - gigakelvin, - megakelvin, - kilokelvin, - millikelvin, - microkelvin, - nanokelvin, - picokelvin, - femtokelvin, - attokelvin, - degrees_celsius, -]) - -dimensionless = UnitGroup( - name = 'dimensionless', - units = [ - none, - percent, -]) - -angle = UnitGroup( - name = 'angle', - units = [ - degrees, - radians, - rotations, -]) - -solid_angle = UnitGroup( - name = 'solid_angle', - units = [ - stradians, -]) - -amount = UnitGroup( - name = 'amount', - units = [ - moles, - millimoles, - micromoles, - nanomoles, - picomoles, - femtomoles, - attomoles, -]) - -concentration = UnitGroup( - name = 'concentration', - units = [ - moles_per_cubic_meter, - millimoles_per_cubic_meter, - micromoles_per_cubic_meter, - nanomoles_per_cubic_meter, - picomoles_per_cubic_meter, - femtomoles_per_cubic_meter, - attomoles_per_cubic_meter, - moles_per_cubic_exameter, - millimoles_per_cubic_exameter, - micromoles_per_cubic_exameter, - nanomoles_per_cubic_exameter, - picomoles_per_cubic_exameter, - femtomoles_per_cubic_exameter, - attomoles_per_cubic_exameter, - moles_per_cubic_petameter, - millimoles_per_cubic_petameter, - micromoles_per_cubic_petameter, - nanomoles_per_cubic_petameter, - picomoles_per_cubic_petameter, - femtomoles_per_cubic_petameter, - attomoles_per_cubic_petameter, - moles_per_cubic_terameter, - millimoles_per_cubic_terameter, - micromoles_per_cubic_terameter, - nanomoles_per_cubic_terameter, - picomoles_per_cubic_terameter, - femtomoles_per_cubic_terameter, - attomoles_per_cubic_terameter, - moles_per_cubic_gigameter, - millimoles_per_cubic_gigameter, - micromoles_per_cubic_gigameter, - nanomoles_per_cubic_gigameter, - picomoles_per_cubic_gigameter, - femtomoles_per_cubic_gigameter, - attomoles_per_cubic_gigameter, - moles_per_cubic_megameter, - millimoles_per_cubic_megameter, - micromoles_per_cubic_megameter, - nanomoles_per_cubic_megameter, - picomoles_per_cubic_megameter, - femtomoles_per_cubic_megameter, - attomoles_per_cubic_megameter, - moles_per_cubic_kilometer, - millimoles_per_cubic_kilometer, - micromoles_per_cubic_kilometer, - nanomoles_per_cubic_kilometer, - picomoles_per_cubic_kilometer, - femtomoles_per_cubic_kilometer, - attomoles_per_cubic_kilometer, - moles_per_cubic_millimeter, - millimoles_per_cubic_millimeter, - micromoles_per_cubic_millimeter, - nanomoles_per_cubic_millimeter, - picomoles_per_cubic_millimeter, - femtomoles_per_cubic_millimeter, - attomoles_per_cubic_millimeter, - moles_per_cubic_micrometer, - millimoles_per_cubic_micrometer, - micromoles_per_cubic_micrometer, - nanomoles_per_cubic_micrometer, - picomoles_per_cubic_micrometer, - femtomoles_per_cubic_micrometer, - attomoles_per_cubic_micrometer, - moles_per_cubic_nanometer, - millimoles_per_cubic_nanometer, - micromoles_per_cubic_nanometer, - nanomoles_per_cubic_nanometer, - picomoles_per_cubic_nanometer, - femtomoles_per_cubic_nanometer, - attomoles_per_cubic_nanometer, - moles_per_cubic_picometer, - millimoles_per_cubic_picometer, - micromoles_per_cubic_picometer, - nanomoles_per_cubic_picometer, - picomoles_per_cubic_picometer, - femtomoles_per_cubic_picometer, - attomoles_per_cubic_picometer, - moles_per_cubic_femtometer, - millimoles_per_cubic_femtometer, - micromoles_per_cubic_femtometer, - nanomoles_per_cubic_femtometer, - picomoles_per_cubic_femtometer, - femtomoles_per_cubic_femtometer, - attomoles_per_cubic_femtometer, - moles_per_cubic_attometer, - millimoles_per_cubic_attometer, - micromoles_per_cubic_attometer, - nanomoles_per_cubic_attometer, - picomoles_per_cubic_attometer, - femtomoles_per_cubic_attometer, - attomoles_per_cubic_attometer, - moles_per_cubic_decimeter, - millimoles_per_cubic_decimeter, - micromoles_per_cubic_decimeter, - nanomoles_per_cubic_decimeter, - picomoles_per_cubic_decimeter, - femtomoles_per_cubic_decimeter, - attomoles_per_cubic_decimeter, - moles_per_cubic_centimeter, - millimoles_per_cubic_centimeter, - micromoles_per_cubic_centimeter, - nanomoles_per_cubic_centimeter, - picomoles_per_cubic_centimeter, - femtomoles_per_cubic_centimeter, - attomoles_per_cubic_centimeter, - moles_per_cubic_angstrom, - millimoles_per_cubic_angstrom, - micromoles_per_cubic_angstrom, - nanomoles_per_cubic_angstrom, - picomoles_per_cubic_angstrom, - femtomoles_per_cubic_angstrom, - attomoles_per_cubic_angstrom, - moles_per_cubic_micron, - millimoles_per_cubic_micron, - micromoles_per_cubic_micron, - nanomoles_per_cubic_micron, - picomoles_per_cubic_micron, - femtomoles_per_cubic_micron, - attomoles_per_cubic_micron, - moles_per_cubic_mile, - millimoles_per_cubic_mile, - micromoles_per_cubic_mile, - nanomoles_per_cubic_mile, - picomoles_per_cubic_mile, - femtomoles_per_cubic_mile, - attomoles_per_cubic_mile, - moles_per_cubic_yard, - millimoles_per_cubic_yard, - micromoles_per_cubic_yard, - nanomoles_per_cubic_yard, - picomoles_per_cubic_yard, - femtomoles_per_cubic_yard, - attomoles_per_cubic_yard, - moles_per_cubic_foot, - millimoles_per_cubic_foot, - micromoles_per_cubic_foot, - nanomoles_per_cubic_foot, - picomoles_per_cubic_foot, - femtomoles_per_cubic_foot, - attomoles_per_cubic_foot, - moles_per_cubic_inch, - millimoles_per_cubic_inch, - micromoles_per_cubic_inch, - nanomoles_per_cubic_inch, - picomoles_per_cubic_inch, - femtomoles_per_cubic_inch, - attomoles_per_cubic_inch, -]) - - -unit_group_names = [ - 'length', - 'area', - 'volume', - 'inverse_length', - 'inverse_area', - 'inverse_volume', - 'time', - 'rate', - 'speed', - 'acceleration', - 'density', - 'force', - 'pressure', - 'energy', - 'power', - 'charge', - 'potential', - 'resistance', - 'capacitance', - 'conductance', - 'magnetic_flux', - 'magnetic_flux_density', - 'inductance', - 'temperature', - 'dimensionless', - 'angle', - 'solid_angle', - 'amount', - 'concentration', +dimension_names = [ + ("length", Dimensions(length=1)), + ("area", Dimensions(length=2)), + ("volume", Dimensions(length=3)), + ("inverse_length", Dimensions(length=-1)), + ("inverse_area", Dimensions(length=-2)), + ("inverse_volume", Dimensions(length=-3)), + ("time", Dimensions(time=1)), + ("rate", Dimensions(time=-1)), + ("speed", Dimensions(length=1, time=-1)), + ("acceleration", Dimensions(length=1, time=-2)), + ("density", Dimensions(length=-3, mass=1)), + ("force", Dimensions(1, -2, 1, 0, 0)), + ("pressure", Dimensions(-1, -2, 1, 0, 0)), + ("energy", Dimensions(2, -2, 1, 0, 0)), + ("power", Dimensions(2, -3, 1, 0, 0)), + ("charge", Dimensions(0, 1, 0, 1, 0)), + ("potential", Dimensions(2, -3, 1, -1, 0)), + ("resistance", Dimensions(2, -3, 1, -2, 0)), + ("capacitance", Dimensions(-2, 4, -1, 2, 0)), + ("conductance", Dimensions(-2, 3, -1, 2, 0)), + ("magnetic_flux", Dimensions(2, -2, 1, -1, 0)), + ("magnetic_flux_density", Dimensions(0, -2, 1, -1, 0)), + ("inductance", Dimensions(2, -2, 1, -2, 0)), + ("temperature", Dimensions(temperature=1)), + ("dimensionless", Dimensions()), + ("angle", Dimensions(angle_hint=1)), + ("solid_angle", Dimensions(angle_hint=2)), + ("amount", Dimensions(moles_hint=1)), + ("concentration", Dimensions(length=-3, moles_hint=1)), ] -unit_groups = { - 'length': length, - 'area': area, - 'volume': volume, - 'inverse_length': inverse_length, - 'inverse_area': inverse_area, - 'inverse_volume': inverse_volume, - 'time': time, - 'rate': rate, - 'speed': speed, - 'acceleration': acceleration, - 'density': density, - 'force': force, - 'pressure': pressure, - 'energy': energy, - 'power': power, - 'charge': charge, - 'potential': potential, - 'resistance': resistance, - 'capacitance': capacitance, - 'conductance': conductance, - 'magnetic_flux': magnetic_flux, - 'magnetic_flux_density': magnetic_flux_density, - 'inductance': inductance, - 'temperature': temperature, - 'dimensionless': dimensionless, - 'angle': angle, - 'solid_angle': solid_angle, - 'amount': amount, - 'concentration': concentration, -} +for dimension_name, dimensions in dimension_names: + setattr( + this, + dimension_name, + UnitGroup( + name=dimension_name, + units=[getattr(this, x) for x in unit_types[hash(dimensions)]], + ), + ) + +setattr(this, "unit_group_names", [x for x, _ in dimension_names]) +setattr(this, "unit_groups", {x: getattr(this, x) for x, _ in dimension_names}) diff --git a/sasdata/refactor_roadmap.rst b/sasdata/refactor_roadmap.rst new file mode 100644 index 000000000..03d2ffb99 --- /dev/null +++ b/sasdata/refactor_roadmap.rst @@ -0,0 +1,92 @@ +* percentages updated last on 6th February 2026 + +SasData Side +============ + +* Load data into memory as SasData objects + + * From different sources + + * Text + * ASCII (95%) + * XML (95%) + * HDF5 (95%) + + * known mistakes (living object) + +* Have calculations of errors and tracking of objects + + * Low level implementation of error prop (95%) + * Linking of data (10%) + * Independent source identification (50%, but see above) + + * Make a decision (0%) + * Carefully document said decision (0%) + + * Units (95%) + + * Unit conversion (100%) + * Unit parsing (95%) + * Big file of useful units and not so useful units (80%) + * Printing units (95%) + + * Operations on Quantities + + * Arithmetic operations (95%) + * Special and not so special functions (90%) + * Linear algebra (30%) + +* Operation on datasets + + * Rebinning (60%) + * Slicing backend [integration] (see above) + * Adding extra annotations (0%) + +* Trends + + * Construct trend (70%) + * Interpolate axes (80%) + +* Save data + + * Into something readable (JSON) (95%) + * Into HDF5 (95%) + +Develop a Rigorous Testing Framework For Critical Objects +========================================================= + +Currently lots of tests, but we should be more systematic. + + + + +SasView Side (Integration) +========================== + +* ASCII loader interface (90%) +* Data explorer refactor (30%) + + * Represent data in GUI (85%) + * Represent plots in GUI (0%) + * Represent links between data in GUI (0%) + * Represent perspectives in GUI (0%) + * Represent trends in GUI (0%) + +* Trends + + * Suggest metadata (65%) + * Present options to user (0%) + +* Perspectives + + * Make them accept new data object (25%) + * Batch stuff should become trend stuff (0%) + +* Slicing + + * Refactor slicers for new backend (0%) + + +`_________|o=o\______` -> this way + + diff --git a/sasdata/sasdata_design_decisions.rst b/sasdata/sasdata_design_decisions.rst new file mode 100644 index 000000000..de674ba95 --- /dev/null +++ b/sasdata/sasdata_design_decisions.rst @@ -0,0 +1,57 @@ +SasData Refactor Principles +=========================== + + +Fundamental choices +------------------- + +1: Data is Immutable +==================== + +We want data to be cross referenced and keep track of important information about correlations. Furthermore, to follow +FAIR principles we want a record of this. + +It is very hard to do these things if we allow data to be mutable. This doesn't mean you can't copy the contents +of a data and change the copy, then make a new data object. + +2: Data is tracked +================== + +Again, within the SasData objects, operations are tracked. This allows use to propagate uncertainties correctly +and keep a FAIR record. + +3: Data objects are mostly agnostic to their contents +===================================================== + +To represent more general kinds of data in uniform way, we have data objects that don't specifically have q/I axes. +All axes are however named, and dimensionality is implicit. + +3b: Data types are "duck-typed" +=============================== + +The way whether we tell data is, for example, Q/I data is by checking the axes names, not by the class. + +Note: Some checks of this kind should probably be implemented as utility functions + +3c: Errors are bound to quantities +================================== + +Errors are bound to the quantities they correspond to, so for example, I and dI are held in a single object. + +Note: It is probably incorrect to associate Q and dQ like this, as they don't follow standard error propagation rules, +instead, use supplementary information. + + +4: Relationship to models is specified in the data class +======================================================== + +The processing steps needed to convert model outputs to something comparable to the data is included in the `modelling +requirements` section. Making use of this is optional. + + + +5: Trends +========= + +Have collections of SasData objects that can be treated together, e.g. as functions of some variable, field, concentration + diff --git a/sasdata/slicing/__init__.py b/sasdata/slicing/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/sasdata/slicing/geometry.py b/sasdata/slicing/geometry.py new file mode 100644 index 000000000..e69de29bb diff --git a/sasdata/slicing/meshes/__init__.py b/sasdata/slicing/meshes/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/sasdata/slicing/meshes/delaunay_mesh.py b/sasdata/slicing/meshes/delaunay_mesh.py new file mode 100644 index 000000000..d0c729a91 --- /dev/null +++ b/sasdata/slicing/meshes/delaunay_mesh.py @@ -0,0 +1,33 @@ +import numpy as np +from scipy.spatial import Delaunay + +from sasdata.slicing.meshes.mesh import Mesh + + +def delaunay_mesh(x, y) -> Mesh: + """ Create a triangulated mesh based on input points """ + + input_data = np.array((x, y)).T + delaunay = Delaunay(input_data) + + return Mesh(points=input_data, cells=delaunay.simplices) + + +if __name__ == "__main__": + import matplotlib.pyplot as plt + + points = np.random.random((100, 2)) + mesh = delaunay_mesh(points[:,0], points[:,1]) + mesh.show(actually_show=False) + + print(mesh.cells[50]) + + # pick random cell to show + for cell in mesh.cells_to_edges[10]: + a, b = mesh.edges[cell] + plt.plot( + [mesh.points[a][0], mesh.points[b][0]], + [mesh.points[a][1], mesh.points[b][1]], + color='r') + + plt.show() diff --git a/sasdata/slicing/meshes/mesh.py b/sasdata/slicing/meshes/mesh.py new file mode 100644 index 000000000..a3e8c0fa0 --- /dev/null +++ b/sasdata/slicing/meshes/mesh.py @@ -0,0 +1,240 @@ +from collections.abc import Sequence + +import matplotlib.pyplot as plt +import numpy as np +from matplotlib import cm +from matplotlib.collections import LineCollection + +from sasdata.slicing.meshes.util import closed_loop_edges + + +class Mesh: + def __init__(self, + points: np.ndarray, + cells: Sequence[Sequence[int]]): + + """ + Object representing a mesh. + + Parameters are the values: + mesh points + map from edge to points + map from cells to edges + + it is done this way to ensure a non-redundant representation of cells and edges, + however there are no checks for the topology of the mesh, this is assumed to be done by + whatever creates it. There are also no checks for ordering of cells. + + :param points: points in 2D forming vertices of the mesh + :param cells: ordered lists of indices of points forming each cell (face) + + """ + + self.points = points + self.cells = cells + + # Get edges + + edges = set() + for cell_index, cell in enumerate(cells): + + for a, b in closed_loop_edges(cell): + # make sure the representation is unique + if a > b: + edges.add((a, b)) + else: + edges.add((b, a)) + + self.edges = list(edges) + + # Associate edges with faces + + edge_lookup = {edge: i for i, edge in enumerate(self.edges)} + self.cells_to_edges = [] + self.cells_to_edges_signs = [] + + for cell in cells: + + this_cell_data = [] + this_sign_data = [] + + for a, b in closed_loop_edges(cell): + # make sure the representation is unique + if a > b: + this_cell_data.append(edge_lookup[(a, b)]) + this_sign_data.append(1) + else: + this_cell_data.append(edge_lookup[(b, a)]) + this_sign_data.append(-1) + + self.cells_to_edges.append(this_cell_data) + self.cells_to_edges_signs.append(this_sign_data) + + # Counts for elements + self.n_points = self.points.shape[0] + self.n_edges = len(self.edges) + self.n_cells = len(self.cells) + + # Areas + self._areas = None + + + @property + def areas(self): + """ Areas of cells """ + + if self._areas is None: + # Calculate areas + areas = [] + for cell in self.cells: + # Use triangle shoelace formula, basically calculate the + # determinant based on of triangles with one point at 0,0 + a_times_2 = 0.0 + for i1, i2 in closed_loop_edges(cell): + p1 = self.points[i1, :] + p2 = self.points[i2, :] + a_times_2 += p1[0]*p2[1] - p1[1]*p2[0] + + areas.append(0.5*np.abs(a_times_2)) + + # Save in cache + self._areas = np.array(areas) + + # Return cache + return self._areas + + + def show(self, actually_show=True, show_labels=False, **kwargs): + """ Show on a plot """ + ax = plt.gca() + segments = [[self.points[edge[0]], self.points[edge[1]]] for edge in self.edges] + line_collection = LineCollection(segments=segments, **kwargs) + ax.add_collection(line_collection) + + if show_labels: + text_color = kwargs["color"] if "color" in kwargs else 'k' + for i, cell in enumerate(self.cells): + xy = np.sum(self.points[cell, :], axis=0)/len(cell) + ax.text(xy[0], xy[1], str(i), horizontalalignment="center", verticalalignment="center", color=text_color) + + x_limits = [np.min(self.points[:,0]), np.max(self.points[:,0])] + y_limits = [np.min(self.points[:,1]), np.max(self.points[:,1])] + + plt.xlim(x_limits) + plt.ylim(y_limits) + + if actually_show: + plt.show() + + def locate_points(self, x: np.ndarray, y: np.ndarray): + """ Find the cells that contain the specified points""" + + x = x.reshape(-1) + y = y.reshape(-1) + + # The most simple implementation is not particularly fast, especially in python + # + # Less obvious, but hopefully faster strategy + # + # Ultimately, checking the inclusion of a point within a polygon + # requires checking the crossings of a half line with the polygon's + # edges. + # + # A fairly efficient thing to do is to check every edge for crossing + # the axis parallel lines x=point_x. + # Then these edges that cross can map back to the polygons they're in + # and a final check for inclusion can be done with the edge sign property + # and some explicit checking of the + # + # Basic idea is: + # 1) build a matrix for each point-edge pair + # True if the edge crosses the half-line above a point + # 2) for each cell get the winding number by evaluating the + # sum of the component edges, weighted 1/-1 according to direction + + + edges = np.array(self.edges) + + edge_xy_1 = self.points[edges[:, 0], :] + edge_xy_2 = self.points[edges[:, 1], :] + + edge_x_1 = edge_xy_1[:, 0] + edge_x_2 = edge_xy_2[:, 0] + + + + # Make an n_edges-by-n_inputs boolean matrix that indicates which of the + # edges cross x=points_x line + crossers = np.logical_xor( + edge_x_1.reshape(-1, 1) < x.reshape(1, -1), + edge_x_2.reshape(-1, 1) < x.reshape(1, -1)) + + # Calculate the gradients, some might be infs, but none that matter will be + # TODO: Disable warnings + gradients = (edge_xy_2[:, 1] - edge_xy_1[:, 1]) / (edge_xy_2[:, 0] - edge_xy_1[:, 0]) + + # Distance to crossing points edge 0 + delta_x = x.reshape(1, -1) - edge_x_1.reshape(-1, 1) + + # Signed distance from point to y (doesn't really matter which sign) + delta_y = gradients.reshape(-1, 1) * delta_x + edge_xy_1[:, 1:] - y.reshape(1, -1) + + score_matrix = np.logical_and(delta_y > 0, crossers) + + output = -np.ones(len(x), dtype=int) + for cell_index, (cell_edges, sign) in enumerate(zip(self.cells_to_edges, self.cells_to_edges_signs)): + cell_score = np.sum(score_matrix[cell_edges, :] * np.array(sign).reshape(-1, 1), axis=0) + points_in_cell = np.abs(cell_score) == 1 + output[points_in_cell] = cell_index + + return output + + def show_data(self, + data: np.ndarray, + cmap='winter', + mesh_color='white', + show_mesh=False, + actually_show=True, + density=False): + + """ Show with data """ + + colormap = cm.get_cmap(cmap, 256) + + data = data.reshape(-1) + + if density: + data = data / self.areas + + cmin = np.min(data) + cmax = np.max(data) + + color_index_map = np.array(255 * (data - cmin) / (cmax - cmin), dtype=int) + + for cell, color_index in zip(self.cells, color_index_map): + + color = colormap(color_index) + + plt.fill(self.points[cell, 0], self.points[cell, 1], color=color, edgecolor=None) + + if show_mesh: + self.show(actually_show=False, color=mesh_color) + + if actually_show: + self.show() + + +if __name__ == "__main__": + from test.slicers.meshes_for_testing import location_test_mesh, location_test_points_x, location_test_points_y + + cell_indices = location_test_mesh.locate_points(location_test_points_x, location_test_points_y) + + print(cell_indices) + + for i in range(location_test_mesh.n_cells): + inds = cell_indices == i + plt.scatter( + location_test_points_x.reshape(-1)[inds], + location_test_points_y.reshape(-1)[inds]) + + location_test_mesh.show() diff --git a/sasdata/slicing/meshes/meshmerge.py b/sasdata/slicing/meshes/meshmerge.py new file mode 100644 index 000000000..882699c0d --- /dev/null +++ b/sasdata/slicing/meshes/meshmerge.py @@ -0,0 +1,166 @@ +import time + +import numpy as np + +from sasdata.slicing.meshes.delaunay_mesh import delaunay_mesh +from sasdata.slicing.meshes.mesh import Mesh + + +def meshmerge(mesh_a: Mesh, mesh_b: Mesh) -> tuple[Mesh, np.ndarray, np.ndarray]: + """ Take two lists of polygons and find their intersections + + Polygons in each of the input variables should not overlap i.e. a point in space should be assignable to + at most one polygon in mesh_a and at most one polygon in mesh_b + + Mesh topology should be sensible, otherwise bad things might happen, also, the cells of the input meshes + must be in order (which is assumed by the mesh class constructor anyway). + + :returns: + 1) A triangulated mesh based on both sets of polygons together + 2) The indices of the mesh_a polygon that corresponds to each triangle, -1 for nothing + 3) The indices of the mesh_b polygon that corresponds to each triangle, -1 for nothing + + """ + + t0 = time.time() + + # Find intersections of all edges in mesh one with edges in mesh two + + # Fastest way might just be to calculate the intersections of all lines on edges, + # see whether we need filtering afterwards + + edges_a = np.array(mesh_a.edges, dtype=int) + edges_b = np.array(mesh_b.edges, dtype=int) + + edge_a_1 = mesh_a.points[edges_a[:, 0], :] + edge_a_2 = mesh_a.points[edges_a[:, 1], :] + edge_b_1 = mesh_b.points[edges_b[:, 0], :] + edge_b_2 = mesh_b.points[edges_b[:, 1], :] + + a_grid, b_grid = np.mgrid[0:mesh_a.n_edges, 0:mesh_b.n_edges] + a_grid = a_grid.reshape(-1) + b_grid = b_grid.reshape(-1) + + p1 = edge_a_1[a_grid, :] + p2 = edge_a_2[a_grid, :] + p3 = edge_b_1[b_grid, :] + p4 = edge_b_2[b_grid, :] + + # + # TODO: Investigate whether adding a bounding box check will help with speed, seems likely as most edges wont cross + # + + # + # Solve the equations + # + # z_a1 + s delta_z_a = z_b1 + t delta_z_b + # + # for z = (x, y) + # + + start_point_diff = p1 - p3 + + delta1 = p2 - p1 + delta3 = p4 - p3 + + deltas = np.concatenate(([-delta1], [delta3]), axis=0) + deltas = np.moveaxis(deltas, 0, 2) + + non_singular = np.linalg.det(deltas) != 0 + + st = np.linalg.solve( + deltas[non_singular], + # Reshape is required because solve accepts matrices of shape + # (M) or (..., M, K) for the second parameter, but ours shape + # is (..., M). We add an extra dimension to force our matrix + # into the shape (..., M, 1), which meets the expectations. + # + # + # Due to the reshaping work mentioned above, the final result + # has an extra element of length 1. We then index this extra + # dimension to get back to the result we wanted. + np.expand_dims(start_point_diff[non_singular], axis=2))[:, :, 0] + + # Find the points where s and t are in (0, 1) + + intersection_inds = np.logical_and( + np.logical_and(0 < st[:, 0], st[:, 0] < 1), # noqa SIM300 + np.logical_and(0 < st[:, 1], st[:, 1] < 1)) # noqa SIM300 + + start_points_for_intersections = p1[non_singular][intersection_inds, :] + deltas_for_intersections = delta1[non_singular][intersection_inds, :] + + points_to_add = start_points_for_intersections + st[intersection_inds, 0].reshape(-1,1) * deltas_for_intersections + + t1 = time.time() + print("Edge intersections:", t1 - t0) + + # Build list of all input points, in a way that we can check for coincident points + + + points = np.concatenate(( + mesh_a.points, + mesh_b.points, + points_to_add + )) + + + # Remove coincident points + + points = np.unique(points, axis=0) + + # Triangulate based on these intersections + + output_mesh = delaunay_mesh(points[:, 0], points[:, 1]) + + + t2 = time.time() + print("Delaunay:", t2 - t1) + + + # Find centroids of all output triangles, and find which source cells they belong to + + ## step 1) Assign -1 to all cells of original meshes + assignments_a = -np.ones(output_mesh.n_cells, dtype=int) + assignments_b = -np.ones(output_mesh.n_cells, dtype=int) + + ## step 2) Find centroids of triangulated mesh (just needs to be a point inside, but this is a good one) + centroids = [] + for cell in output_mesh.cells: + centroid = np.sum(output_mesh.points[cell, :]/3, axis=0) + centroids.append(centroid) + + centroids = np.array(centroids) + + t3 = time.time() + print("Centroids:", t3 - t2) + + + ## step 3) Find where points belong based on Mesh classes point location algorithm + + assignments_a = mesh_a.locate_points(centroids[:, 0], centroids[:, 1]) + assignments_b = mesh_b.locate_points(centroids[:, 0], centroids[:, 1]) + + t4 = time.time() + print("Assignments:", t4 - t3) + + return output_mesh, assignments_a, assignments_b + + +def main(): + from voronoi_mesh import voronoi_mesh + + n1 = 100 + n2 = 100 + + m1 = voronoi_mesh(np.random.random(n1), np.random.random(n1)) + m2 = voronoi_mesh(np.random.random(n2), np.random.random(n2)) + + + mesh, assignement1, assignement2 = meshmerge(m1, m2) + + mesh.show() + + +if __name__ == "__main__": + main() diff --git a/sasdata/slicing/meshes/util.py b/sasdata/slicing/meshes/util.py new file mode 100644 index 000000000..da5b6e370 --- /dev/null +++ b/sasdata/slicing/meshes/util.py @@ -0,0 +1,11 @@ +from collections.abc import Sequence +from typing import TypeVar + +T = TypeVar("T") + +def closed_loop_edges(values: Sequence[T]) -> tuple[T, T]: + """ Generator for a closed loop of edge pairs """ + for pair in zip(values, values[1:]): + yield pair + + yield values[-1], values[0] diff --git a/sasdata/slicing/meshes/voronoi_mesh.py b/sasdata/slicing/meshes/voronoi_mesh.py new file mode 100644 index 000000000..2f36d3780 --- /dev/null +++ b/sasdata/slicing/meshes/voronoi_mesh.py @@ -0,0 +1,96 @@ +import numpy as np +from scipy.spatial import Voronoi + +from sasdata.slicing.meshes.mesh import Mesh + + +def voronoi_mesh(x, y, debug_plot=False) -> Mesh: + """ Create a mesh based on a voronoi diagram of points """ + + input_data = np.array((x.reshape(-1), y.reshape(-1))).T + + # Need to make sure mesh covers a finite region, probably not important for + # much data stuff, but is important for plotting + # + # * We want the cells at the edge of the mesh to have a reasonable size, definitely not infinite + # * The exact size doesn't matter that much + # * It should work well with a grid, but also + # * ...it should be robust so that if the data isn't on a grid, it doesn't cause any serious problems + # + # Plan: Create a square border of points that are totally around the points, this is + # at the distance it would be if it was an extra row of grid points + # to do this we'll need + # 1) an estimate of the grid spacing + # 2) the bounding box of the grid + # + + + # Use the median area of finite voronoi cells as an estimate + voronoi = Voronoi(input_data) + finite_cells = [region for region in voronoi.regions if -1 not in region and len(region) > 0] + premesh = Mesh(points=voronoi.vertices, cells=finite_cells) + + area_spacing = np.median(premesh.areas) + gap = np.sqrt(area_spacing) + + # Bounding box is easy + x_min, y_min = np.min(input_data, axis=0) + x_max, y_max = np.max(input_data, axis=0) + + # Create a border + n_x = int(np.round((x_max - x_min)/gap)) + n_y = int(np.round((y_max - y_min)/gap)) + + top_bottom_xs = np.linspace(x_min - gap, x_max + gap, n_x + 3) + left_right_ys = np.linspace(y_min, y_max, n_y + 1) + + top = np.array([top_bottom_xs, (y_max + gap) * np.ones_like(top_bottom_xs)]) + bottom = np.array([top_bottom_xs, (y_min - gap) * np.ones_like(top_bottom_xs)]) + left = np.array([(x_min - gap) * np.ones_like(left_right_ys), left_right_ys]) + right = np.array([(x_max + gap) * np.ones_like(left_right_ys), left_right_ys]) + + added_points = np.concatenate((top, bottom, left, right), axis=1).T + + if debug_plot: + import matplotlib.pyplot as plt + plt.scatter(x, y) + plt.scatter(added_points[:, 0], added_points[:, 1]) + plt.show() + + new_points = np.concatenate((input_data, added_points), axis=0) + voronoi = Voronoi(new_points) + + # Remove the cells that correspond to the added edge points, + # Because the points on the edge of the square are (weakly) convex, these + # regions be infinite + + # finite_cells = [region for region in voronoi.regions if -1 not in region and len(region) > 0] + + # ... however, we can just use .region_points + input_regions = voronoi.point_region[:input_data.shape[0]] + cells = [voronoi.regions[region_index] for region_index in input_regions] + + return Mesh(points=voronoi.vertices, cells=cells) + + +def square_grid_check(): + values = np.linspace(-10, 10, 21) + x, y = np.meshgrid(values, values) + + mesh = voronoi_mesh(x, y) + + mesh.show(show_labels=True) + +def random_grid_check(): + import matplotlib.pyplot as plt + points = np.random.random((100, 2)) + mesh = voronoi_mesh(points[:, 0], points[:, 1], True) + mesh.show(actually_show=False) + plt.scatter(points[:, 0], points[:, 1]) + plt.show() + + +if __name__ == "__main__": + square_grid_check() + # random_grid_check() + diff --git a/sasdata/slicing/rebinning.py b/sasdata/slicing/rebinning.py new file mode 100644 index 000000000..060b2e0ca --- /dev/null +++ b/sasdata/slicing/rebinning.py @@ -0,0 +1,148 @@ +import time +from abc import ABC, abstractmethod +from dataclasses import dataclass + +import numpy as np + +from sasdata.slicing.meshes.mesh import Mesh +from sasdata.slicing.meshes.meshmerge import meshmerge +from sasdata.slicing.meshes.voronoi_mesh import voronoi_mesh + + +@dataclass +class CacheData: + """ Data cached for repeated calculations with the same coordinates """ + input_coordinates: np.ndarray # Input data + input_coordinates_mesh: Mesh # Mesh of the input data + merged_mesh_data: tuple[Mesh, np.ndarray, np.ndarray] # mesh information about the merging + + +class Rebinner(ABC): + + + def __init__(self): + """ Base class for rebinning methods""" + + self._bin_mesh_cache: Mesh | None = None # cached version of the output bin mesh + + # Output dependent caching + self._input_cache: CacheData | None = None + + + @abstractmethod + def _bin_coordinates(self) -> np.ndarray: + """ Coordinates for the output bins """ + + @abstractmethod + def _bin_mesh(self) -> Mesh: + """ Get the meshes used for binning """ + + @property + def allowable_orders(self) -> list[int]: + return [-1, 0, 1] + + @property + def bin_mesh(self) -> Mesh: + + if self._bin_mesh_cache is None: + bin_mesh = self._bin_mesh() + self._bin_mesh_cache = bin_mesh + + return self._bin_mesh_cache + + def _post_processing(self, coordinates, values) -> tuple[np.ndarray, np.ndarray]: + """ Perform post-processing on the mesh binned values """ + # Default is to do nothing, override if needed + return coordinates, values + + def _calculate(self, input_coordinates: np.ndarray, input_data: np.ndarray, order: int) -> np.ndarray: + """ Main calculation """ + + if order == -1: + # Construct the input output mapping just based on input points being the output cells, + # Equivalent to the original binning method + + mesh = self.bin_mesh + bin_identities = mesh.locate_points(input_coordinates[:,0], input_coordinates[:, 1]) + output_data = np.zeros(mesh.n_cells, dtype=float) + + for index, bin in enumerate(bin_identities): + if bin >= 0: + output_data[bin] += input_data[index] + + return output_data + + else: + # Use a mapping based on meshes + + # Either create de-cache the appropriate mesh + # Why not use a hash? Hashing takes time, equality checks are pretty fast, need to check equality + # when there is a hit anyway in case of very rare chance of collision, hits are the most common case, + # we want it to work 100% of the time, not 99.9999% + if self._input_cache is not None and np.all(self._input_cache.input_coordinates == input_coordinates): + + input_coordinate_mesh = self._input_cache.input_coordinates_mesh + merge_data = self._input_cache.merged_mesh_data + + else: + # Calculate mesh data + input_coordinate_mesh = voronoi_mesh(input_coordinates[:,0], input_coordinates[:, 1]) + self._data_mesh_cache = input_coordinate_mesh + + merge_data = meshmerge(self.bin_mesh, input_coordinate_mesh) + + # Cache mesh data + self._input_cache = CacheData( + input_coordinates=input_coordinates, + input_coordinates_mesh=input_coordinate_mesh, + merged_mesh_data=merge_data) + + merged_mesh, merged_to_output, merged_to_input = merge_data + + # Calculate values according to the order parameter + t0 = time.time() + if order == 0: + # Based on the overlap of cells only + + input_areas = input_coordinate_mesh.areas + output = np.zeros(self.bin_mesh.n_cells, dtype=float) + + for input_index, output_index, area in zip(merged_to_input, merged_to_output, merged_mesh.areas): + if input_index == -1 or output_index == -1: + # merged region does not correspond to anything of interest + continue + + output[output_index] += input_data[input_index] * area / input_areas[input_index] + + print("Main calc:", time.time() - t0) + + return output + + elif order == 1: + # Linear interpolation requires the following relationship with the data, + # as the input data is the total over the whole input cell, the linear + # interpolation requires continuity at the vertices, and a constraint on the + # integral. + # + # We can take each of the input points, and the associated values, and solve a system + # of linear equations that gives a total value. + + raise NotImplementedError("1st order (linear) interpolation currently not implemented") + + else: + raise ValueError(f"Expected order to be in {self.allowable_orders}, got {order}") + + def sum(self, x: np.ndarray, y: np.ndarray, data: np.ndarray, order: int = 0) -> np.ndarray: + """ Return the summed data in the output bins """ + return self._calculate(np.array((x.reshape(-1), y.reshape(-1))).T, data.reshape(-1), order) + + def error_propagate(self, input_coordinates: np.ndarray, data: np.ndarray, errors) -> np.ndarray: + raise NotImplementedError("Error propagation not implemented yet") + + def resolution_propagate(self, input_coordinates: np.ndarray, data: np.ndarray, errors) -> np.ndarray: + raise NotImplementedError("Resolution propagation not implemented yet") + + def average(self, x: np.ndarray, y: np.ndarray, data: np.ndarray, order: int = 0) -> np.ndarray: + """ Return the averaged data in the output bins """ + return self._calculate(np.array((x, y)).T, data.reshape(-1), order) / self.bin_mesh.areas + diff --git a/sasdata/slicing/sample_polygons.py b/sasdata/slicing/sample_polygons.py new file mode 100644 index 000000000..be54cd0a6 --- /dev/null +++ b/sasdata/slicing/sample_polygons.py @@ -0,0 +1,32 @@ +import numpy as np + + +def wedge(q0, q1, theta0, theta1, clockwise=False, n_points_per_degree=2): + + # Traverse a rectangle in curvilinear coordinates (q0, theta0), (q0, theta1), (q1, theta1), (q1, theta0) + if clockwise: + if theta1 > theta0: + theta0 += 2*np.pi + + else: + if theta0 > theta1: + theta1 += 2*np.pi + + subtended_angle = np.abs(theta1 - theta0) + n_points = int(subtended_angle*180*n_points_per_degree/np.pi)+1 + + angles = np.linspace(theta0, theta1, n_points) + + xs = np.concatenate((q0*np.cos(angles), q1*np.cos(angles[::-1]))) + ys = np.concatenate((q0*np.sin(angles), q1*np.sin(angles[::-1]))) + + return np.array((xs, ys)).T + + +if __name__ == "__main__": + import matplotlib.pyplot as plt + xy = wedge(0.3, 0.6, 2, 3) + + plt.plot(xy[:,0], xy[:,1]) + plt.show() + diff --git a/sasdata/slicing/slicer_demo.py b/sasdata/slicing/slicer_demo.py new file mode 100644 index 000000000..5626ded4d --- /dev/null +++ b/sasdata/slicing/slicer_demo.py @@ -0,0 +1,117 @@ +""" Dev docs: Demo to show the behaviour of the re-binning methods """ + +import matplotlib.pyplot as plt +import numpy as np + +from sasdata.slicing.meshes.voronoi_mesh import voronoi_mesh +from sasdata.slicing.slicers.AnularSector import AnularSector + +if __name__ == "__main__": + q_range = 1.5 + demo1 = True + demo2 = True + + # Demo of sums, annular sector over some not very circular data + + if demo1: + + x = (2 * q_range) * (np.random.random(400) - 0.5) + y = (2 * q_range) * (np.random.random(400) - 0.5) + + display_mesh = voronoi_mesh(x, y) + + + def lobe_test_function(x, y): + return 1 + np.sin(x*np.pi/q_range)*np.sin(y*np.pi/q_range) + + + random_lobe_data = lobe_test_function(x, y) + + plt.figure("Input Dataset 1") + display_mesh.show_data(random_lobe_data, actually_show=False) + + data_order_0 = [] + data_order_neg1 = [] + + sizes = np.linspace(0.1, 1, 100) + + for index, size in enumerate(sizes): + q0 = 0.75 - 0.6*size + q1 = 0.75 + 0.6*size + phi0 = np.pi/2 - size + phi1 = np.pi/2 + size + + rebinner = AnularSector(q0, q1, phi0, phi1) + + data_order_neg1.append(rebinner.sum(x, y, random_lobe_data, order=-1)) + data_order_0.append(rebinner.sum(x, y, random_lobe_data, order=0)) + + if index % 10 == 0: + plt.figure("Regions 1") + rebinner.bin_mesh.show(actually_show=False) + + plt.title("Regions") + + plt.figure("Sum of region, dataset 1") + + plt.plot(sizes, data_order_neg1) + plt.plot(sizes, data_order_0) + + plt.legend(["Order -1", "Order 0"]) + plt.title("Sum over region") + + + # Demo of averaging, annular sector over ring shaped data + + if demo2: + + x, y = np.meshgrid(np.linspace(-q_range, q_range, 41), np.linspace(-q_range, q_range, 41)) + x = x.reshape(-1) + y = y.reshape(-1) + + display_mesh = voronoi_mesh(x, y) + + + def ring_test_function(x, y): + r = np.sqrt(x**2 + y**2) + return np.log(np.sinc(r*1.5)**2) + + + grid_ring_data = ring_test_function(x, y) + + plt.figure("Input Dataset 2") + display_mesh.show_data(grid_ring_data, actually_show=False) + + data_order_0 = [] + data_order_neg1 = [] + + sizes = np.linspace(0.1, 1, 100) + + for index, size in enumerate(sizes): + q0 = 0.25 + q1 = 1.25 + + phi0 = np.pi/2 - size + phi1 = np.pi/2 + size + + rebinner = AnularSector(q0, q1, phi0, phi1) + + data_order_neg1.append(rebinner.average(x, y, grid_ring_data, order=-1)) + data_order_0.append(rebinner.average(x, y, grid_ring_data, order=0)) + + if index % 10 == 0: + plt.figure("Regions 2") + rebinner.bin_mesh.show(actually_show=False) + + plt.title("Regions") + + plt.figure("Average of region 2") + + plt.plot(sizes, data_order_neg1) + plt.plot(sizes, data_order_0) + + plt.legend(["Order -1", "Order 0"]) + plt.title("Sum over region") + + plt.show() + diff --git a/sasdata/slicing/slicers/AnularSector.py b/sasdata/slicing/slicers/AnularSector.py new file mode 100644 index 000000000..56ed5f262 --- /dev/null +++ b/sasdata/slicing/slicers/AnularSector.py @@ -0,0 +1,44 @@ +import numpy as np + +from sasdata.slicing.meshes.mesh import Mesh +from sasdata.slicing.rebinning import Rebinner + + +class AnularSector(Rebinner): + """ A single annular sector (wedge sum)""" + def __init__(self, q0: float, q1: float, phi0: float, phi1: float, points_per_degree: int=2): + super().__init__() + + self.q0 = q0 + self.q1 = q1 + self.phi0 = phi0 + self.phi1 = phi1 + + self.points_per_degree = points_per_degree + + def _bin_mesh(self) -> Mesh: + + n_points = np.max([int(1 + 180*self.points_per_degree*(self.phi1 - self.phi0) / np.pi), 2]) + + angles = np.linspace(self.phi0, self.phi1, n_points) + + row1 = self.q0 * np.array([np.cos(angles), np.sin(angles)]) + row2 = self.q1 * np.array([np.cos(angles), np.sin(angles)])[:, ::-1] + + points = np.concatenate((row1, row2), axis=1).T + + cells = [[i for i in range(2*n_points)]] + + return Mesh(points=points, cells=cells) + + def _bin_coordinates(self) -> np.ndarray: + return np.array([], dtype=float) + + +def main(): + """ Just show a random example""" + AnularSector(1, 2, 1, 2).bin_mesh.show() + + +if __name__ == "__main__": + main() diff --git a/sasdata/slicing/slicers/__init__.py b/sasdata/slicing/slicers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/sasdata/slicing/transforms.py b/sasdata/slicing/transforms.py new file mode 100644 index 000000000..724c53ff4 --- /dev/null +++ b/sasdata/slicing/transforms.py @@ -0,0 +1,58 @@ +import matplotlib.pyplot as plt +import numpy as np +from matplotlib import cm +from scipy.spatial import Voronoi + +if __name__ == "__main__": + # Some test data + + qx_base_values = np.linspace(-10, 10, 21) + qy_base_values = np.linspace(-10, 10, 21) + + qx, qy = np.meshgrid(qx_base_values, qy_base_values) + + include = np.logical_not((np.abs(qx) < 2) & (np.abs(qy) < 2)) + + qx = qx[include] + qy = qy[include] + + r = np.sqrt(qx**2 + qy**2) + + data = np.log((1+np.cos(3*r))*np.exp(-r*r)) + + colormap = cm.get_cmap('winter', 256) + + def get_data_mesh(x, y, data): + + input_data = np.array((x, y)).T + voronoi = Voronoi(input_data) + + # plt.scatter(voronoi.vertices[:,0], voronoi.vertices[:,1]) + # plt.scatter(voronoi.points[:,0], voronoi.points[:,1]) + + cmin = np.min(data) + cmax = np.max(data) + + color_index_map = np.array(255 * (data - cmin) / (cmax - cmin), dtype=int) + + for point_index, points in enumerate(voronoi.points): + + region_index = voronoi.point_region[point_index] + region = voronoi.regions[region_index] + + if len(region) > 0: + + if -1 in region: + + pass + + else: + + color = colormap(color_index_map[point_index]) + + circly = region + [region[0]] + plt.fill(voronoi.vertices[circly, 0], voronoi.vertices[circly, 1], color=color, edgecolor="white") + + plt.show() + + get_data_mesh(qx.reshape(-1), qy.reshape(-1), data) diff --git a/sasdata/temp_ascii_reader.py b/sasdata/temp_ascii_reader.py index d8f726f4f..96e8634bf 100644 --- a/sasdata/temp_ascii_reader.py +++ b/sasdata/temp_ascii_reader.py @@ -21,7 +21,7 @@ guess_starting_position, ) from sasdata.metadata import Metadata, MetaNode -from sasdata.quantities.quantity import Quantity +from sasdata.quantities.quantity import NamedQuantity, Quantity from sasdata.quantities.units import NamedUnit @@ -121,7 +121,7 @@ def split_line(separator_dict: dict[str, bool], line: str) -> list[str]: # TODO: Implement error handling. -def load_quantities(params: AsciiReaderParams, filename: str) -> dict[str, Quantity]: +def load_quantities(params: AsciiReaderParams, filename: str, metadata: Metadata) -> dict[str, Quantity]: """Load a list of quantities from the filename based on the params.""" with open(filename) as ascii_file: lines = ascii_file.readlines() @@ -146,7 +146,7 @@ def load_quantities(params: AsciiReaderParams, filename: str) -> dict[str, Quant print(f"Line {i + 1} skipped.") continue file_quantities = { - name: Quantity(arrays[i], unit) + name: NamedQuantity(name, arrays[i], unit, id_header=metadata.id_header) for i, (name, unit) in enumerate(params.columns_included) } return file_quantities @@ -194,7 +194,6 @@ def load_data(params: AsciiReaderParams) -> list[SasData]: list contained in the params.""" loaded_data: list[SasData] = [] for filename in params.filenames: - quantities = load_quantities(params, filename) raw_metadata = import_metadata( params.metadata.all_file_metadata(path.basename(filename)) ) @@ -207,6 +206,7 @@ def load_data(params: AsciiReaderParams) -> list[SasData]: process=None, raw=raw_metadata, ) + quantities = load_quantities(params, filename, metadata) data = SasData( path.basename(filename), merge_uncertainties(quantities), diff --git a/sasdata/temp_hdf5_reader.py b/sasdata/temp_hdf5_reader.py index 37a868d89..e439486ad 100644 --- a/sasdata/temp_hdf5_reader.py +++ b/sasdata/temp_hdf5_reader.py @@ -9,7 +9,7 @@ from sasdata.data import SasData from sasdata.data_backing import Dataset as SASDataDataset from sasdata.data_backing import Group as SASDataGroup -from sasdata.dataset_types import one_dim, two_dim +from sasdata.dataset_types import one_dim, three_dim, two_dim from sasdata.metadata import ( Aperture, BeamSize, @@ -33,15 +33,13 @@ test_file = "./example_data/2d_data/BAM_2D.h5" # test_file = "./example_data/2d_data/14250_2D_NoDetInfo_NXcanSAS_v3.h5" # test_file = "./example_data/2d_data/33837rear_2D_1.75_16.5_NXcanSAS_v3.h5" +test_file = "./test/sasdataloader/data/nxcansas_1Dand2D_multisasdata.h5" logger = logging.getLogger(__name__) def recurse_hdf5(hdf5_entry): if isinstance(hdf5_entry, HDF5Dataset): - # - # print(hdf5_entry.dtype) - # print(type(hdf5_entry.dtype)) attributes = {name: hdf5_entry.attrs[name] for name in hdf5_entry.attrs} @@ -62,7 +60,7 @@ def recurse_hdf5(hdf5_entry): elif isinstance(hdf5_entry, HDF5Group): return SASDataGroup( name=hdf5_entry.name, - children={key: recurse_hdf5(hdf5_entry[key]) for key in hdf5_entry}, + children={key: recurse_hdf5(hdf5_entry[key]) for key in hdf5_entry.keys()}, ) else: @@ -74,7 +72,7 @@ def recurse_hdf5(hdf5_entry): GET_UNITS_FROM_ELSEWHERE = units.meters -def connected_data(node: SASDataGroup, name_prefix="") -> dict[str, Quantity]: +def connected_data(node: SASDataGroup, name_prefix="", metadata=None) -> dict[str, Quantity]: """In the context of NeXus files, load a group of data entries that are organised together match up the units and errors with their values""" # Gather together data with its error terms @@ -91,9 +89,7 @@ def connected_data(node: SASDataGroup, name_prefix="") -> dict[str, Quantity]: else: units = GET_UNITS_FROM_ELSEWHERE - quantity = NamedQuantity( - name=name_prefix + child.name, value=child.data, units=units - ) + quantity = NamedQuantity(name=child.name, value=child.data, units=units, id_header=metadata.id_header) # Turns out people can't be trusted to use the same keys here if "uncertainty" in child.attributes or "uncertainties" in child.attributes: @@ -121,18 +117,89 @@ def connected_data(node: SASDataGroup, name_prefix="") -> dict[str, Quantity]: ### Begin metadata parsing code +def get_canSAS_class(node : HDF5Group) -> str | None: + # Check if attribute exists + if "canSAS_class" in node.attrs: + cls = node.attrs["canSAS_class"] + return cls + elif "NX_class" in node.attrs: + cls = node.attrs["NX_class"] + cls = NX2SAS_class(cls) + # note that sastransmission groups have a + # NX_class of NXdata but a canSAS_class of SAStransmission_spectrum + # which is ambiguous because then how can one tell if it is a SASdata + # or a SAStransmission_spectrum object from the NX_class? + if node.name.lower().startswith("sastransmission"): + cls = 'SAStransmission_spectrum' + return cls + + return None + +def NX2SAS_class(cls : str) -> str | None: + # converts NX class names to canSAS class names + mapping = { + "NXentry": "SASentry", + "NXdata": "SASdata", + "NXdetector": "SASdetector", + "NXinstrument": "SASinstrument", + "NXnote": "SASnote", + "NXprocess": "SASprocess", + "NXcollection": "SASprocessnote", + "NXsample": "SASsample", + "NXsource": "SASsource", + "NXaperture": "SASaperture", + "NXcollimator": "SAScollimation", + + "SASentry": "SASentry", + "SASdata": "SASdata", + "SASdetector": "SASdetector", + "SASinstrument": "SASinstrument", + "SASnote": "SASnote", + "SASprocess": "SASprocess", + "SASprocessnote": "SASprocessnote", + "SAStransmission_spectrum": "SAStransmission_spectrum", + "SASsample": "SASsample", + "SASsource": "SASsource", + "SASaperture": "SASaperture", + "SAScollimation": "SAScollimation", + } + if isinstance(cls, bytes): + cls = cls.decode() + return mapping.get(cls, None) + +def find_canSAS_key(node: HDF5Group, canSAS_class: str): + matches = [] + + for key, item in node.items(): + if item.attrs.get("canSAS_class") == canSAS_class: + matches.append(key) + + return matches + def parse_quantity(node : HDF5Group) -> Quantity[float]: - """Pull a single quantity with length units out of an HDF5 node""" - magnitude = node.astype(float)[0] + """Pull a single quantity with units out of an HDF5 node""" + magnitude = parse_float(node) unit = node.attrs["units"] return Quantity(magnitude, parse(unit)) def parse_string(node : HDF5Group) -> str: """Access string data from a node""" - return node.asstr()[0] + if node.shape == (): # scalar dataset + return node.asstr()[()] + else: # vector dataset + return node.asstr()[0] + +def parse_float(node: HDF5Group) -> float: + """Return the first element (or scalar) of a numeric dataset as float.""" + if node.shape == (): + return float(node[()].astype(str)) + else: + return float(node[0].astype(str)) -def opt_parse[T](node: HDF5Group, key: str, subparser: Callable[[HDF5Group], T]) -> T | None: +def opt_parse[T](node: HDF5Group, key: str, subparser: Callable[[HDF5Group], T], ignore_case=False) -> T | None: """Parse a subnode if it is present""" + if ignore_case: # ignore the case of the key + key = next((k for k in node.keys() if k.lower() == key.lower()), None) if key in node: return subparser(node[key]) return None @@ -144,7 +211,7 @@ def attr_parse(node: HDF5Group, key: str) -> str | None: return None -def parse_apterture(node : HDF5Group) -> Aperture: +def parse_aperture(node : HDF5Group) -> Aperture: distance = opt_parse(node, "distance", parse_quantity) name = attr_parse(node, "name") size = opt_parse(node, "size", parse_vec3) @@ -166,9 +233,13 @@ def parse_source(node : HDF5Group) -> Source: beam_shape = opt_parse(node, "beam_shape", parse_string) beam_size = opt_parse(node, "beam_size", parse_beam_size) wavelength = opt_parse(node, "wavelength", parse_quantity) + if wavelength is None: + wavelength = opt_parse(node, "incident_wavelength", parse_quantity) wavelength_min = opt_parse(node, "wavelength_min", parse_quantity) wavelength_max = opt_parse(node, "wavelength_max", parse_quantity) wavelength_spread = opt_parse(node, "wavelength_spread", parse_quantity) + if wavelength_spread is None: + wavelength_spread = opt_parse(node, "incident_wavelength_spread", parse_quantity) return Source( radiation=radiation, beam_shape=beam_shape, @@ -214,22 +285,37 @@ def parse_detector(node : HDF5Group) -> Detector: def parse_collimation(node : HDF5Group) -> Collimation: length = opt_parse(node, "length", parse_quantity) - return Collimation(length=length, apertures=[parse_apterture(node[ap]) - for ap in node if "aperture" in ap]) + + keys = find_canSAS_key(node, "SASaperture") + keys = list(keys) if keys is not None else [] # list([1,2,3]) returns [1,2,3] and list("string") returns ["string"] + apertures = [parse_aperture(node[p]) for p in keys] # Empty list of keys will give an empty collimations list + + return Collimation(length=length, apertures=apertures) def parse_instrument(node : HDF5Group) -> Instrument: + keys = find_canSAS_key(node, "SAScollimation") + keys = list(keys) if keys is not None else [] # list([1,2,3]) returns [1,2,3] and list("string") returns ["string"] + collimations = [parse_collimation(node[p]) for p in keys] # Empty list of keys will give an empty collimations list + + keys = find_canSAS_key(node, "SASdetector") + keys = list(keys) if keys is not None else [] # list([1,2,3]) returns [1,2,3] and list("string") returns ["string"] + detector = [parse_detector(node[p]) for p in keys] # Empty list of keys will give an empty collimations list + + keys = find_canSAS_key(node, "SASsource") + source = parse_source(node[keys[0]]) if keys is not None else None + return Instrument( - collimations= [parse_collimation(node[x]) for x in node if "collimation" in x], - detector=[parse_detector(node[d]) for d in node if "detector" in d], - source=parse_source(node["sassource"]), + collimations=collimations, + detector=detector, + source=source, ) def parse_sample(node : HDF5Group) -> Sample: name = attr_parse(node, "name") sample_id = opt_parse(node, "ID", parse_string) thickness = opt_parse(node, "thickness", parse_quantity) - transmission = opt_parse(node, "transmission", lambda n: float(n[0].astype(str))) + transmission = opt_parse(node, "transmission", parse_float) temperature = opt_parse(node, "temperature", parse_quantity) position = opt_parse(node, "position", parse_vec3) orientation = opt_parse(node, "orientation", parse_rot3) @@ -274,62 +360,82 @@ def load_raw(node: HDF5Group | HDF5Dataset) -> MetaNode: attrib = {a: node.attrs[a] for a in node.attrs} if (str(dt).startswith("|S")): if "units" in attrib: - contents = Quantity(float(node.asstr()[0]), parse(attrib["units"])) + contents = parse_string(node) else: - contents = node.asstr()[0] + contents = parse_string(node) else: if "units" in attrib and attrib["units"]: - contents = Quantity(node[:], parse(attrib["units"])) + data = node[()] if node.shape == () else node[:] + contents = Quantity(data, parse(attrib["units"]), id_header=node.name) else: - contents = node[:] + contents = node[()] if node.shape == () else node[:] return MetaNode(name=name, attrs=attrib, contents=contents) case _: raise RuntimeError(f"Cannot load raw data of type {type(node)}") def parse_metadata(node : HDF5Group) -> Metadata: - instrument = opt_parse(node, "sasinstrument", parse_instrument) - sample = opt_parse(node, "sassample", parse_sample) - process = [parse_process(node[p]) for p in node if "sasprocess" in p] + # parse the metadata groups + keys = find_canSAS_key(node, "SASinstrument") + keys = list(keys) if keys else [] # list([1,2,3]) returns [1,2,3] and list("string") returns ["string"] + instrument = parse_instrument(node[keys[0]]) if keys else None + + keys = find_canSAS_key(node, "SASsample") + keys = list(keys) if keys else [] # list([1,2,3]) returns [1,2,3] and list("string") returns ["string"] + sample = parse_sample(node[keys[0]]) if keys else None + + keys = find_canSAS_key(node, "SASprocess") + keys = list(keys) if keys else [] # list([1,2,3]) returns [1,2,3] and list("string") returns ["string"] + process = [parse_process(node[p]) for p in keys] # Empty list of keys will give an empty collimations list + + # parse the datasets title = opt_parse(node, "title", parse_string) run = [parse_string(node[r]) for r in node if "run" in r] definition = opt_parse(node, "definition", parse_string) - raw = load_raw(node) + + # load the entire node recursively into a raw object + raw = load_raw(node) + return Metadata(process=process, instrument=instrument, sample=sample, title=title, run=run, - raw=raw, - definition=definition) - -### End Metadata parsing code + definition=definition, + raw=raw) def load_data(filename: str) -> dict[str, SasData]: with h5py.File(filename, "r") as f: loaded_data: dict[str, SasData] = {} - for root_key in f: + for root_key in f.keys(): entry = f[root_key] + # if this is actually a SASentry + if not get_canSAS_class(entry) == 'SASentry': + continue data_contents : dict[str, Quantity] = {} - entry_keys = entry + entry_keys = entry.keys() - if not [k for k in entry if k.startswith("sasdata") or k.startswith("data")]: + if not [k for k in entry_keys if get_canSAS_class(entry[k])=='SASdata']: logger.warning("No sasdata or data key") logger.warning(f"Known keys: {[k for k in entry_keys]}") + metadata = parse_metadata(f[root_key]) + for key in entry_keys: component = entry[key] - lower_key = key.lower() - if lower_key.startswith("sasdata") or lower_key.startswith("data"): + if get_canSAS_class(entry[key])=='SASdata': datum = recurse_hdf5(component) - data_contents = connected_data(datum, str(filename)) + data_contents = connected_data(datum, str(filename), metadata) - metadata = parse_metadata(f[root_key]) - - dataset_type = two_dim if "Qy" in data_contents else one_dim + if "Qz" in data_contents: + dataset_type = three_dim + elif "Qy" in data_contents: + dataset_type = two_dim + else: + dataset_type = one_dim entry_key = entry.attrs["sasview_key"] if "sasview_key" in entry.attrs else root_key diff --git a/sasdata/temp_sesans_reader.py b/sasdata/temp_sesans_reader.py index fd480e40c..23d561593 100644 --- a/sasdata/temp_sesans_reader.py +++ b/sasdata/temp_sesans_reader.py @@ -166,7 +166,7 @@ def parse_data(lines: list[str], kvs: dict[str, str]) -> dict[str, Quantity]: for idx, v in enumerate(values): points[headers[idx]].append(float(v)) - for h in points: + for h in points.keys(): if h.endswith("_error") and h[:-6] in headers: # This was an error line continue diff --git a/sasdata/temp_xml_reader.py b/sasdata/temp_xml_reader.py index 2a15c251a..174fe7389 100644 --- a/sasdata/temp_xml_reader.py +++ b/sasdata/temp_xml_reader.py @@ -21,7 +21,7 @@ Source, Vec3, ) -from sasdata.quantities.quantity import Quantity +from sasdata.quantities.quantity import NamedQuantity, Quantity from sasdata.quantities.units import Unit from sasdata.quantities.units import none as unitless @@ -205,7 +205,7 @@ def parse_sample(node: etree._Element, version: str) -> Sample: ) -def parse_data(node: etree._Element, version: str) -> dict[str, Quantity]: +def parse_data(node: etree._Element, version: str, metadata: Metadata) -> dict[str, Quantity]: """Parse scattering data""" aos = [] keys = set() @@ -244,7 +244,7 @@ def parse_data(node: etree._Element, version: str) -> dict[str, Quantity]: result: dict[str, Quantity] = {} for k in keys: - result[k] = Quantity(np.array(soa[k]), us[k]) + result[k] = NamedQuantity(k, np.array(soa[k]), us[k], id_header=metadata.id_header) if k + "dev" in uncertainties: result[k] = result[k].with_standard_error( Quantity(np.array(soa[k + "dev"]), us[k + "dev"]) @@ -267,17 +267,18 @@ def load_raw(node: etree._Element, version: str) -> MetaNode: contents: Quantity[float] | str | list[MetaNode] = "" if nodes: contents = [load_raw(n, version) for n in nodes] - elif "unit" in attrib and attrib["unit"]: - value = parse_string(node, version) - if value: - try: - contents = Quantity(float(value), unit_parser.parse(attrib["unit"])) - except ValueError: + else: + if "unit" in attrib and attrib["unit"]: + value = parse_string(node, version) + if value: + try: + contents = Quantity(float(value), unit_parser.parse(attrib["unit"])) + except ValueError: + contents = value + else: contents = value else: - contents = value - else: - contents = parse_string(node, version) + contents = parse_string(node, version) return MetaNode(name=etree.QName(node).localname, attrs=attrib, contents=contents) @@ -322,7 +323,7 @@ def load_data(filename: str) -> dict[str, SasData]: datacount = 0 for n in entry.findall(f"{version}:SASdata", ns): datacount += 1 - data_set = parse_data(n, version) + data_set = parse_data(n, version, metadata) data = data_set break diff --git a/sasdata/transforms/NDrebin.py b/sasdata/transforms/NDrebin.py new file mode 100644 index 000000000..e5091a8e1 --- /dev/null +++ b/sasdata/transforms/NDrebin.py @@ -0,0 +1,522 @@ + + +import numpy as np +from numpy._typing import ArrayLike + +from sasdata.quantities.quantity import Quantity + + +class NDRebin: + """ + N-dimensional rebinning of data into regular bins, with optional + fractional binning and error propagation. + + Provide values at points with ND coordinates. + The coordinates may not be in a nice grid. + The data can be in any array shape. + + The coordinates are in the same shape plus one dimension, + preferably the first dimension, which is the ND coordinate + position + + Rebin that data into a regular grid. + + Note that this does lose some information from the underlying data, + as you are essentially averaging multiple measurements into one bin. + + Note that once can use this function to perform integrations over + one or more dimensions by setting the num_bins to 1 or the + step_size to infinity for one or more axes. The integration will + be performed from the lower to upper bound of that axis. + + Parameters + ---------- + data : Quantity[ArrayLike] + Data values in an Nd array. + coords : Quantity[ArrayLike] + The coordinates corresponding to each data point, same size of data + plus one more dimension with the same length as the + dimensionality of the space (Ndim) + data_errs : Quantity[ArrayLike], optional + Errors on data. Optional, the same size as data. + axes : ArrayLike | None = None + The axes of the coordinate system we are binning + into. Defaults to diagonal (e.g. (1,0,0), (0,1,0), and + (0,0,1) for 3D data). A list of Ndim element vectors + upper : ArrayLike | None = None + The upper limits along each axis. Defaults to the largest + values in the data if no limits are provided. + A 1D list of Ndims values. + lower : ArrayLike | None = None + The lower limits along each axis. Defaults to the smallest + values in the data if no limits are provided. + A 1D list of Ndims values. + step_size : ArrayLike | None = None + The size of steps along each axis. Supercedes + num_bins. A list of length Ndim. + num_bins : ArrayLike | None = None + The number of bins along each axis. Superceded by + step_size if step_size is provided. At least one of step_size + or num_bins must be provided. + fractional : bool = False + Whether to perform fractional binning or not. Defaults + to false. + -If false, measurements are binned into one bin, + the one they fall within. Roughly a "nearest neighbor" + approach. + -If true, fractional binning will be applied, where + the value of a measurement is distributed to its 2^Ndim + nearest neighbors weighted by proximity. For example, if + a point falls exactly between two bins, its value will be + given to both bins with 50% weight. This is roughly a + "linear interpolation" approach. Tends to do better at + reducing sharp peaks and edges if data is sampled unevenly. + However, this is roughly 2^Ndim times slower since you have + to address each bin 2^Ndim more times. + normalization : bool = True + Whether to normalize (average) the data or not. If false, + the data are just summed into each bin. If true, the weighted + average of all points added to a bin is computed. + + Attributes + ---------- + binned_data : + has size num_bins and is NDimensional, contains + the binned data + bin_centers_list : + is a list of 1D vectors, contains the + axes of the binned data. The coordinates of bin [i,j,k] + is given by + bin_centers_list[0][i]*axes[i]+bin_centers_list[1][j]*axes[j]+ + bin_centers_list[0][k]*axes[k] + binned_data_errs : + has size num_bins and is NDimensional, contains + the propagated errors of the binned_data + bins_list : + is a list of 1D vectors, is similar to bin_centers_list, + but instead contains the edges of the bins, so it is 1 longer + in each dimension + step_size : + is a list of Ndims numbers, contains the step size + along each dimension + num_bins : + is a list of Ndims numbers, contains the number + of bins along each dimension + + Methods + ------- + run(self): + Bin the data into the defined bins. + + Typical usage + ------------- + .. code-block:: + # test syntax 1 + Ndims = 4 + Nvals = int(1e4) + qmat = np.random.rand(Ndims, Nvals) + Imat = np.random.rand(Nvals) + + rebin = NDRebin(Imat, qmat, + step_size=0.1*np.random.rand(Ndims)+0.05, + lower=0.1*np.random.rand(Ndims)+0.0, + upper=0.1*np.random.rand(Ndims)+0.9) + rebin.run() + + Ibin = rebin.binned_data + qbin = rebin.bin_centers_list + + + # test syntax 2 + Ndims = 2 + Nvals = int(1e4) + qmat = np.random.rand(Ndims, 100, Nvals) + Imat = np.random.rand(100, Nvals) + Imat_errs = np.random.rand(100, Nvals) + + rebin = NDRebin(Imat, qmat, + data_errs = Imat_errs, + num_bins=[10,20], + axes = np.eye(2), + fractional=True) + rebin.run() + + Ibin = rebin.binned_data + qbin = rebin.bin_centers_list + Ibin_errs = rebin.binned_data_errs + bins_list = rebin.bins_list + step_size = rebin.step_size + num_bins = rebin.num_bins + """ + + def __init__( + self, + data: Quantity[ArrayLike], + coords: Quantity[ArrayLike], + data_errs: Quantity[ArrayLike] | None = None, + axes: ArrayLike | None = None, + upper: ArrayLike | None = None, + lower: ArrayLike | None = None, + step_size: ArrayLike | None = None, + num_bins: ArrayLike | None = None, + fractional: bool = False, + normalize: bool = True, + ): + self.data = data + self.coords = coords + self.data_errs = data_errs + self.axes = axes + self.upper = upper + self.lower = lower + self.step_size = step_size + self.num_bins = num_bins + self.fractional = fractional + self.normalize = normalize + + # Internal attributes initialised later + self.Nvals: int | None = None + self.Ndims: int | None = None + self.data_flat = None + self.errors_flat = None + self.coords_flat = None + self.bins_list = None + self.bin_centers_list = None + self.bin_inds = None + self.binned_data = None + self.binned_data_errs = None + self.n_samples = None + + self._prepared = False # flag to avoid double-prepare + + def __call__(self): + self.run() + + def run(self) -> None: + """Bin the data into the defined bins.""" + if not self._prepared: + self._prepare() + + if self.fractional: + self._calculate_fractional_bins() + else: + self._calculate_bins() + + self._norm_data() + + def _prepare(self) -> None: + """Compute derived quantities: shapes, flattened data, bins, indices.""" + if self._prepared: + return + + # check the size of the data and coords inputs + # and define Ndims and Nvals + self._check_data_coords() + + # flatten the input data and errors + self._check_data_errs() + + # flatten the coords + self._flatten_coords() + + # handle optional axes + if self.axes is None: + # make axes if not provided + self._make_axes() + else: + # project into specified axes + self._project_axes() + + # build the limits + self._build_limits() + + # make the bins + self._make_bins() + + # make the bin indices + self._create_bin_inds() + + self._prepared = True + + def _check_data_coords(self): + """Compute Nvals and Ndims and validate shapes.""" + # Identify number of points + self.Nvals = int(self.data.size) + + # Identify number of dimensions + Ndims = self.coords.size / self.Nvals + + # if Ndims is not an integer value we have a problem + if not float(Ndims).is_integer(): + raise ValueError("The coords have to have the same shape as " + "the data, plus one more dimension which is " + "length Ndims") + self.Ndims = int(Ndims) + + def _check_data_errs(self): + # flatten input data to 1D of length Nvals + self.data_flat = self.data.reshape(-1) + if self.data_errs is None: + self.errors_flat = 0*self.data_flat # no errors + else: + self.errors_flat = self.data_errs.reshape(-1) + + if self.errors_flat.shape != self.data_flat.shape: + raise ValueError("Data and errors have to have the same shape.") + + def _flatten_coords(self): + # if 1D, need to add a size 1 dimension index to coords + if self.Ndims == 1: + self.coords = self.coords.reshape(-1, 1) + + # check if the first axis of coords is the dimensions axis + if self.coords.shape[0] == self.Ndims: + # first check if it is the first axis + self.dim_axis = 0 + elif self.coords.shape[-1] == self.Ndims: + # now check if it is the last axis + self.dim_axis = -1 + else: + # search if any axis is size Ndims + self.dim_axis = next(i for i, s in enumerate(self.coords.shape) if s == self.Ndims) + + if not self.coords.shape[self.dim_axis] == self.Ndims: + raise ValueError("The coords have to have one dimension which is " + "the dimensionality of the space") + + # flatten coords to size Nvals x Ndims + moved = np.moveaxis(self.coords, self.dim_axis, 0) + self.coords_flat = moved.reshape(self.Ndims, -1).T + + def _make_axes(self): + # if axes are not provided, default to identity + if self.axes is None: + self.axes = np.eye(self.Ndims) + + def _project_axes(self): + # now project the data into the axes + self.axes_inv = np.linalg.inv(self.axes) + self.coords_flat = np.tensordot(self.coords_flat, self.axes_inv, axes=([1], [0])) + + def _build_limits(self): + # if limits were not provided, default to the min and max + # coord in each dimension + coords = self.coords_flat + mins = np.min(coords, axis=0) + maxs = np.max(coords, axis=0) + lower = mins if self.lower is None else self.lower + upper = maxs if self.upper is None else self.upper + + # if provided just one limit for 1D as a scalar, make it a list + # for formatting purposes + self.lower = np.atleast_1d(self.lower) + self.upper = np.atleast_1d(self.upper) + lower = np.atleast_1d(lower).astype(float, copy=True) + upper = np.atleast_1d(upper).astype(float, copy=True) + + # validate limits sizes + if lower.size != self.Ndims: + raise ValueError("Lower limits must be None or a 1D iterable of length Ndims.") + if upper.size != self.Ndims: + raise ValueError("Upper limits must be None or a 1D iterable of length Ndims.") + + # if individual limits are nan, inf, none, etc, replace with min/max + finite_lower = np.isfinite(lower) + finite_upper = np.isfinite(upper) + lower = np.where(finite_lower, lower, mins) + upper = np.where(finite_upper, upper, maxs) + + # if any of the limits are in the wrong order, flip them + self.lower = np.minimum(lower, upper) + self.upper = np.maximum(lower, upper) + + def _make_bins(self): + # bins_list is a Ndims long list of vectors which are the edges of + # each bin. Each vector is num_bins[i]+1 long + self.bins_list = [] + + # bin_centers_list is a Ndims long list of vectors which are the centers of + # each bin. Each vector is num_bins[i] long + self.bin_centers_list = [] + + # create the bins in each dimension + if self.step_size is None: + self._step_size_from_num_bins() + else: + self._num_bins_from_step_size() + + def _step_size_from_num_bins(self): + # if step_size was not specified, derive from num_bins + self.step_size = [] + # if provided just one num_bin for 1D as a scalar, make it a list + # for formatting purposes + self.num_bins = np.atleast_1d(self.num_bins) + if self.num_bins.size != self.Ndims: + raise ValueError("num_bins must be None or a 1D iterable of length Ndims.") + for ind in range(self.Ndims): + these_bins = np.linspace(self.lower[ind], self.upper[ind], self.num_bins[ind]+1) + these_centers = (these_bins[:-1] + these_bins[1:]) / 2.0 + this_step_size = these_bins[1] - these_bins[0] + + self.bins_list.append(these_bins) + self.bin_centers_list.append(these_centers) + self.step_size.append(this_step_size) + + def _num_bins_from_step_size(self): + # if num_bins was not specified, derive from step_size + self.num_bins = [] + # if provided just one step_size for 1D as a scalar, make it a list + # for formatting purposes + self.step_size = np.atleast_1d(self.step_size) + if self.step_size.size != self.Ndims: + raise ValueError("step_size must be None or a 1D iterable of length Ndims.") + for ind in range(self.Ndims): + if self.lower[ind] == self.upper[ind]: + # min and max of limits are the same, i.e. data has to be exactly this + these_bins = np.array([self.lower[ind], self.lower[ind]]) + else: + these_bins = np.arange(self.lower[ind], self.upper[ind], self.step_size[ind]) + if these_bins[-1] != self.upper[ind]: + these_bins = np.append(these_bins, self.upper[ind]) + these_centers = (these_bins[:-1] + these_bins[1:]) / 2.0 + this_num_bins = these_bins.size-1 + + self.bins_list.append(these_bins) + self.bin_centers_list.append(these_centers) + self.num_bins.append(this_num_bins) + + def _create_bin_inds(self): + # create the bin inds for each data point as a Nvals x Ndims long vector + self.bin_inds = np.zeros((self.Nvals, self.Ndims)) + for ind in range(self.Ndims): + this_min = self.bins_list[ind][0] + this_step = self.step_size[ind] + self.bin_inds[:, ind] = (self.coords_flat[:,ind] - this_min) / this_step + # any that are outside the bin limits should be removed + self.bin_inds[self.coords_flat[:, ind]< self.bins_list[ind][0], ind] = np.nan + self.bin_inds[self.coords_flat[:, ind]==self.bins_list[ind][-1], ind] = self.num_bins[ind]-1 + self.bin_inds[self.coords_flat[:, ind]> self.bins_list[ind][-1], ind] = np.nan + + def _calculate_bins(self): + # For readibility, this is a non-vector way of binning the data + # which in the following will be vectorized for efficiency: + # for ind in range(Nvals): + # this_bin_ind = bin_inds[ind,:] + # if not np.isnan(this_bin_ind).any(): + # this_bin_ind = this_bin_ind.astype(int) + # binned_data[*this_bin_ind] = binned_data[*this_bin_ind] + data_flat[ind] + # binned_data_errs[*this_bin_ind] = binned_data_errs[*this_bin_ind] + errors_flat[ind]**2 + # n_samples[*this_bin_ind] = n_samples[*this_bin_ind] + 1 + + + # and here is a vector equivalent + # ------------------------------------------------------------- + # Inputs: + # bin_inds : (Nvals, Ndims) array of indices, some rows may contain NaN + # data_flat : (Nvals,) values to accumulate + # errors_flat : (Nvals,) errors to accumulate (squared) + # binned_data : Ndims-dimensional array (output) + # binned_data_errs : Ndims-dimensional array (output) + # n_samples : Ndims-dimensional array (output) + # ------------------------------------------------------------- + + # 1. Identify valid rows (no NaNs) + valid = ~np.isnan(self.bin_inds).any(axis=1) + + # 2. Convert valid bins to integer indices + inds_int = self.bin_inds[valid].astype(int) + + # 3. Map multidimensional indices → flat indices + flat_idx = np.ravel_multi_index(inds_int.T, dims=self.num_bins) + + # 4. Use bincount to accumulate in a vectorized way + size = np.prod(self.num_bins) + + bd_sum = np.bincount(flat_idx, weights=self.data_flat[valid], minlength=size) + err_sum = np.bincount(flat_idx, weights=self.errors_flat[valid]**2, minlength=size) + ns_sum = np.bincount(flat_idx, minlength=size) + + # 5. Reshape and add into the original arrays + self.binned_data = bd_sum.reshape(self.num_bins) + self.binned_data_errs = err_sum.reshape(self.num_bins) + self.n_samples = ns_sum.reshape(self.num_bins) + + def _calculate_fractional_bins(self): + + # more convenient to work with half shifted inds + # bin_inds_frac for bin i is between i-0.5 and i+0.5 and the bin center + # is at i. + bin_inds_frac = self.bin_inds - 0.5 + + # 1. Identify valid rows (no NaNs) + valid = ~np.isnan(bin_inds_frac).any(axis=1) + valid_inds = bin_inds_frac[valid] + partial_weights = 1.-np.mod(valid_inds, 1) + data_valid = self.data_flat[valid] + errs_valid = self.errors_flat[valid] + + # In 1D, for a point at x between bin centers at x_i and x_{i+1}, + # wx_{i+1}=(x-x_i)/dx partial weight goes to bin i+1 + # and wx_i=1-w_{i+1} partial weight goes to bin i. + # bin_inds = (x-(x_1-dx/2))/dx = (x-x_1)/dx+0.5. Therefore + # bin_inds_frac = (x-x_1)/dx, so wx_{i+1} = mod(idx,1) and + # wx_i = 1-mod(idx,1) + + # for each dimension, double the amount of subpoints + for ind in range(self.Ndims): + # bins on the edge only go in one bin on that axis + edge_mask = np.logical_not( + np.logical_or(valid_inds[:, ind]<0, + valid_inds[:, ind]>self.num_bins[ind]-1) + ) + partial_weights[~edge_mask, ind] = 1.0 + # will be where the bin goes + arr_mod = valid_inds[edge_mask] + arr_mod[:, ind] += 1. + valid_inds = np.vstack([valid_inds, arr_mod]) + # how close it is to that bin + arr_mod = partial_weights[edge_mask] + arr_mod[:, ind] = 1. - arr_mod[:, ind] + partial_weights = np.vstack([partial_weights, arr_mod]) + # the value and uncertainty + data_valid = np.concatenate([data_valid, data_valid[edge_mask]]) + errs_valid = np.concatenate([errs_valid, errs_valid[edge_mask]]) + + # any bins that ended up outside just get clamped + for ind in range(self.Ndims): + valid_inds[valid_inds[:, ind]<0, ind] = 0 + valid_inds[valid_inds[:, ind]>self.num_bins[ind]-1, ind] = self.num_bins[ind]-1 + + # weights are the product of partial weights + weights = np.prod(partial_weights, axis=1) + + # 2. Convert valid bins to integer indices + inds_int = valid_inds.astype(int) + + # 3. Map multidimensional indices → flat indices + flat_idx = np.ravel_multi_index(inds_int.T, dims=self.num_bins) + + # 4. Use bincount to accumulate in a vectorized way + size = np.prod(self.num_bins) + + bd_sum = np.bincount(flat_idx, weights=weights*data_valid, minlength=size) + err_sum = np.bincount(flat_idx, weights=(weights**2)*(errs_valid**2), minlength=size) + ns_sum = np.bincount(flat_idx, weights=weights, minlength=size) + + # 5. Reshape and add into the original arrays + self.binned_data = bd_sum.reshape(self.num_bins) + self.binned_data_errs = err_sum.reshape(self.num_bins) + self.n_samples = ns_sum.reshape(self.num_bins) + + def _norm_data(self): + # normalize binned_data by the number of times sampled + with np.errstate(divide='ignore', invalid='ignore'): + if self.normalize: + self.binned_data = np.divide(self.binned_data, self.n_samples) + self.binned_data_errs = np.divide(np.sqrt(self.binned_data_errs), self.n_samples) + else: + self.binned_data_errs = np.sqrt(self.binned_data_errs) + + # any bins with no samples is nan + mask = self.n_samples == 0 + self.binned_data[mask] = np.nan + self.binned_data_errs[mask] = np.nan diff --git a/sasdata/transforms/post_process.py b/sasdata/transforms/post_process.py new file mode 100644 index 000000000..e69de29bb diff --git a/sasdata/transforms/rebinning.py b/sasdata/transforms/rebinning.py index 0e8c07e0d..dcb9a2ca6 100644 --- a/sasdata/transforms/rebinning.py +++ b/sasdata/transforms/rebinning.py @@ -1,261 +1,261 @@ -""" Algorithms for interpolation and rebinning """ - -from enum import Enum - -import numpy as np -from numpy._typing import ArrayLike -from scipy.sparse import coo_matrix - -from sasdata.quantities.quantity import Quantity - - -class InterpolationOptions(Enum): - NEAREST_NEIGHBOUR = 0 - LINEAR = 1 - CUBIC = 3 - -class InterpolationError(Exception): - """ We probably want to raise exceptions because interpolation is not appropriate/well-defined, - not the same as numerical issues that will raise ValueErrors""" - - -def calculate_interpolation_matrix_1d(input_axis: Quantity[ArrayLike], - output_axis: Quantity[ArrayLike], - mask: ArrayLike | None = None, - order: InterpolationOptions = InterpolationOptions.LINEAR, - is_density=False): - - """ Calculate the matrix that converts values recorded at points specified by input_axis to - values recorded at points specified by output_axis""" - - # We want the input values in terms of the output units, will implicitly check compatability - # TODO: incorporate mask - - working_units = output_axis.units - - input_x = input_axis.in_units_of(working_units) - output_x = output_axis.in_units_of(working_units) - - # Get the array indices that will map the array to a sorted one - input_sort = np.argsort(input_x) - output_sort = np.argsort(output_x) - - input_unsort = np.arange(len(input_x), dtype=int)[input_sort] - output_unsort = np.arange(len(output_x), dtype=int)[output_sort] - - sorted_in = input_x[input_sort] - sorted_out = output_x[output_sort] - - n_in = len(sorted_in) - n_out = len(sorted_out) - - conversion_matrix = None # output - - match order: - case InterpolationOptions.NEAREST_NEIGHBOUR: - - # COO Sparse matrix definition data - i_entries = [] - j_entries = [] - - crossing_points = 0.5*(sorted_out[1:] + sorted_out[:-1]) - - # Find the output values nearest to each of the input values - i=0 - for k, crossing_point in enumerate(crossing_points): - while i < n_in and sorted_in[i] < crossing_point: - i_entries.append(i) - j_entries.append(k) - i += 1 - - # All the rest in the last bin - while i < n_in: - i_entries.append(i) - j_entries.append(n_out-1) - i += 1 - - i_entries = input_unsort[np.array(i_entries, dtype=int)] - j_entries = output_unsort[np.array(j_entries, dtype=int)] - values = np.ones_like(i_entries, dtype=float) - - conversion_matrix = coo_matrix((values, (i_entries, j_entries)), shape=(n_in, n_out)) - - case InterpolationOptions.LINEAR: - - # Leverage existing linear interpolation methods to get the mapping - # do a linear interpolation on indices - # the floor should give the left bin - # the ceil should give the right bin - # the fractional part should give the relative weightings - - input_indices = np.arange(n_in, dtype=int) - output_indices = np.arange(n_out, dtype=int) - - fractional = np.interp(x=sorted_out, xp=sorted_in, fp=input_indices, left=0, right=n_in-1) - - left_bins = np.floor(fractional).astype(int) - right_bins = np.ceil(fractional).astype(int) - - right_weight = fractional % 1 - left_weight = 1 - right_weight - - # There *should* be no repeated entries for both i and j in the main part, but maybe at the ends - # If left bin is the same as right bin, then we only want one entry, and the weight should be 1 - - same = left_bins == right_bins - not_same = ~same - - same_bins = left_bins[same] # could equally be right bins, they're the same - - same_indices = output_indices[same] - not_same_indices = output_indices[not_same] - - j_entries_sorted = np.concatenate((same_indices, not_same_indices, not_same_indices)) - i_entries_sorted = np.concatenate((same_bins, left_bins[not_same], right_bins[not_same])) - - i_entries = input_unsort[i_entries_sorted] - j_entries = output_unsort[j_entries_sorted] - - # weights don't need to be unsorted # TODO: check this is right, it should become obvious if we use unsorted data - weights = np.concatenate((np.ones_like(same_bins, dtype=float), left_weight[not_same], right_weight[not_same])) - - conversion_matrix = coo_matrix((weights, (i_entries, j_entries)), shape=(n_in, n_out)) - - case InterpolationOptions.CUBIC: - # Cubic interpolation, much harder to implement because we can't just cheat and use numpy - - input_indices = np.arange(n_in, dtype=int) - output_indices = np.arange(n_out, dtype=int) - - # Find the location of the largest value in sorted_in that - # is less than every value of sorted_out - lower_bound = ( - np.sum(np.where(np.less.outer(sorted_in, sorted_out), 1, 0), axis=0) - 1 - ) - - # We're using the Finite Difference Cubic Hermite spline - # https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Interpolation_on_an_arbitrary_interval - # https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Finite_difference - - x1 = sorted_in[lower_bound] # xₖ on the wiki - x2 = sorted_in[lower_bound + 1] # xₖ₊₁ on the wiki - - x0 = sorted_in[lower_bound[lower_bound - 1 >= 0] - 1] # xpₖ₋₁ on the wiki - x0 = np.hstack([np.zeros(x1.size - x0.size), x0]) - - x3 = sorted_in[ - lower_bound[lower_bound + 2 < sorted_in.size] + 2 - ] # xₖ₊₂ on the wiki - x3 = np.hstack([x3, np.zeros(x2.size - x3.size)]) - - t = (sorted_out - x1) / (x2 - x1) # t on the wiki - - y0 = ( - -t * (x1 - x2) * (t**2 - 2 * t + 1) / (2 * x0 - 2 * x1) - ) # The coefficient to pₖ₋₁ on the wiki - y1 = ( - -t * (t**2 - 2 * t + 1) * (x0 - 2 * x1 + x2) - + (x0 - x1) * (3 * t**3 - 5 * t**2 + 2) - ) / (2 * (x0 - x1)) # The coefficient to pₖ - y2 = ( - t - * ( - -t * (t - 1) * (x1 - 2 * x2 + x3) - + (x2 - x3) * (-3 * t**2 + 4 * t + 1) - ) - / (2 * (x2 - x3)) - ) # The coefficient to pₗ₊₁ - y3 = t**2 * (t - 1) * (x1 - x2) / (2 * (x2 - x3)) # The coefficient to pₖ₊₂ - - conversion_matrix = np.zeros((n_in, n_out)) - - (row, column) = np.indices(conversion_matrix.shape) - - mask1 = row == lower_bound[column] - - conversion_matrix[np.roll(mask1, -1, axis=0)] = y0 - conversion_matrix[mask1] = y1 - conversion_matrix[np.roll(mask1, 1, axis=0)] = y2 - - # Special boundary condition for y3 - pick = np.roll(mask1, 2, axis=0) - pick[0:1, :] = 0 - if pick.any(): - conversion_matrix[pick] = y3 - - case _: - raise InterpolationError(f"Unsupported interpolation order: {order}") - - if mask is None: - return conversion_matrix, None - - else: - # Create a new mask - - # Convert to numerical values - # Conservative masking: anything touched by the previous mask is now masked - new_mask = (np.array(mask, dtype=float) @ conversion_matrix) != 0.0 - - return conversion_matrix, new_mask - - -def calculate_interpolation_matrix_2d_axis_axis(input_1: Quantity[ArrayLike], - input_2: Quantity[ArrayLike], - output_1: Quantity[ArrayLike], - output_2: Quantity[ArrayLike], - mask, - order: InterpolationOptions = InterpolationOptions.LINEAR, - is_density: bool = False): - - # This is just the same 1D matrices things - - match order: - case InterpolationOptions.NEAREST_NEIGHBOUR: - pass - - case InterpolationOptions.LINEAR: - pass - - case InterpolationOptions.CUBIC: - pass - - case _: - pass - - -def calculate_interpolation_matrix(input_axes: list[Quantity[ArrayLike]], - output_axes: list[Quantity[ArrayLike]], - data: ArrayLike | None = None, - mask: ArrayLike | None = None): - - # TODO: We probably should delete this, but lets keep it for now - - if len(input_axes) not in (1, 2): - raise InterpolationError("Interpolation is only supported for 1D and 2D data") - - if len(input_axes) == 1 and len(output_axes) == 1: - # Check for dimensionality - input_axis = input_axes[0] - output_axis = output_axes[0] - - if len(input_axis.value.shape) == 1: - if len(output_axis.value.shape) == 1: - calculate_interpolation_matrix_1d() - - if len(output_axes) != len(input_axes): - # Input or output axes might be 2D matrices - pass - - - -def rebin(data: Quantity[ArrayLike], - axes: list[Quantity[ArrayLike]], - new_axes: list[Quantity[ArrayLike]], - mask: ArrayLike | None = None, - interpolation_order: int = 1): - - """ This algorithm is only for operations that preserve dimensionality, - i.e. non-projective rebinning. - """ - - pass +""" Algorithms for interpolation and rebinning """ + +from enum import Enum + +import numpy as np +from numpy._typing import ArrayLike +from scipy.sparse import coo_matrix + +from sasdata.quantities.quantity import Quantity + + +class InterpolationOptions(Enum): + NEAREST_NEIGHBOUR = 0 + LINEAR = 1 + CUBIC = 3 + +class InterpolationError(Exception): + """ We probably want to raise exceptions because interpolation is not appropriate/well-defined, + not the same as numerical issues that will raise ValueErrors""" + + +def calculate_interpolation_matrix_1d(input_axis: Quantity[ArrayLike], + output_axis: Quantity[ArrayLike], + mask: ArrayLike | None = None, + order: InterpolationOptions = InterpolationOptions.LINEAR, + is_density=False): + + """ Calculate the matrix that converts values recorded at points specified by input_axis to + values recorded at points specified by output_axis""" + + # We want the input values in terms of the output units, will implicitly check compatability + # TODO: incorporate mask + + working_units = output_axis.units + + input_x = input_axis.in_units_of(working_units) + output_x = output_axis.in_units_of(working_units) + + # Get the array indices that will map the array to a sorted one + input_sort = np.argsort(input_x) + output_sort = np.argsort(output_x) + + input_unsort = np.arange(len(input_x), dtype=int)[input_sort] + output_unsort = np.arange(len(output_x), dtype=int)[output_sort] + + sorted_in = input_x[input_sort] + sorted_out = output_x[output_sort] + + n_in = len(sorted_in) + n_out = len(sorted_out) + + conversion_matrix = None # output + + match order: + case InterpolationOptions.NEAREST_NEIGHBOUR: + + # COO Sparse matrix definition data + i_entries = [] + j_entries = [] + + crossing_points = 0.5*(sorted_out[1:] + sorted_out[:-1]) + + # Find the output values nearest to each of the input values + i=0 + for k, crossing_point in enumerate(crossing_points): + while i < n_in and sorted_in[i] < crossing_point: + i_entries.append(i) + j_entries.append(k) + i += 1 + + # All the rest in the last bin + while i < n_in: + i_entries.append(i) + j_entries.append(n_out-1) + i += 1 + + i_entries = input_unsort[np.array(i_entries, dtype=int)] + j_entries = output_unsort[np.array(j_entries, dtype=int)] + values = np.ones_like(i_entries, dtype=float) + + conversion_matrix = coo_matrix((values, (i_entries, j_entries)), shape=(n_in, n_out)) + + case InterpolationOptions.LINEAR: + + # Leverage existing linear interpolation methods to get the mapping + # do a linear interpolation on indices + # the floor should give the left bin + # the ceil should give the right bin + # the fractional part should give the relative weightings + + input_indices = np.arange(n_in, dtype=int) + output_indices = np.arange(n_out, dtype=int) + + fractional = np.interp(x=sorted_out, xp=sorted_in, fp=input_indices, left=0, right=n_in-1) + + left_bins = np.floor(fractional).astype(int) + right_bins = np.ceil(fractional).astype(int) + + right_weight = fractional % 1 + left_weight = 1 - right_weight + + # There *should* be no repeated entries for both i and j in the main part, but maybe at the ends + # If left bin is the same as right bin, then we only want one entry, and the weight should be 1 + + same = left_bins == right_bins + not_same = ~same + + same_bins = left_bins[same] # could equally be right bins, they're the same + + same_indices = output_indices[same] + not_same_indices = output_indices[not_same] + + j_entries_sorted = np.concatenate((same_indices, not_same_indices, not_same_indices)) + i_entries_sorted = np.concatenate((same_bins, left_bins[not_same], right_bins[not_same])) + + i_entries = input_unsort[i_entries_sorted] + j_entries = output_unsort[j_entries_sorted] + + # weights don't need to be unsorted # TODO: check this is right, it should become obvious if we use unsorted data + weights = np.concatenate((np.ones_like(same_bins, dtype=float), left_weight[not_same], right_weight[not_same])) + + conversion_matrix = coo_matrix((weights, (i_entries, j_entries)), shape=(n_in, n_out)) + + case InterpolationOptions.CUBIC: + # Cubic interpolation, much harder to implement because we can't just cheat and use numpy + + input_indices = np.arange(n_in, dtype=int) + output_indices = np.arange(n_out, dtype=int) + + # Find the location of the largest value in sorted_in that + # is less than every value of sorted_out + lower_bound = ( + np.sum(np.where(np.less.outer(sorted_in, sorted_out), 1, 0), axis=0) - 1 + ) + + # We're using the Finite Difference Cubic Hermite spline + # https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Interpolation_on_an_arbitrary_interval + # https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Finite_difference + + x1 = sorted_in[lower_bound] # xₖ on the wiki + x2 = sorted_in[lower_bound + 1] # xₖ₊₁ on the wiki + + x0 = sorted_in[lower_bound[lower_bound - 1 >= 0] - 1] # xpₖ₋₁ on the wiki + x0 = np.hstack([np.zeros(x1.size - x0.size), x0]) + + x3 = sorted_in[ + lower_bound[lower_bound + 2 < sorted_in.size] + 2 + ] # xₖ₊₂ on the wiki + x3 = np.hstack([x3, np.zeros(x2.size - x3.size)]) + + t = (sorted_out - x1) / (x2 - x1) # t on the wiki + + y0 = ( + -t * (x1 - x2) * (t**2 - 2 * t + 1) / (2 * x0 - 2 * x1) + ) # The coefficient to pₖ₋₁ on the wiki + y1 = ( + -t * (t**2 - 2 * t + 1) * (x0 - 2 * x1 + x2) + + (x0 - x1) * (3 * t**3 - 5 * t**2 + 2) + ) / (2 * (x0 - x1)) # The coefficient to pₖ + y2 = ( + t + * ( + -t * (t - 1) * (x1 - 2 * x2 + x3) + + (x2 - x3) * (-3 * t**2 + 4 * t + 1) + ) + / (2 * (x2 - x3)) + ) # The coefficient to pₗ₊₁ + y3 = t**2 * (t - 1) * (x1 - x2) / (2 * (x2 - x3)) # The coefficient to pₖ₊₂ + + conversion_matrix = np.zeros((n_in, n_out)) + + (row, column) = np.indices(conversion_matrix.shape) + + mask1 = row == lower_bound[column] + + conversion_matrix[np.roll(mask1, -1, axis=0)] = y0 + conversion_matrix[mask1] = y1 + conversion_matrix[np.roll(mask1, 1, axis=0)] = y2 + + # Special boundary condition for y3 + pick = np.roll(mask1, 2, axis=0) + pick[0:1, :] = 0 + if pick.any(): + conversion_matrix[pick] = y3 + + case _: + raise InterpolationError(f"Unsupported interpolation order: {order}") + + if mask is None: + return conversion_matrix, None + + else: + # Create a new mask + + # Convert to numerical values + # Conservative masking: anything touched by the previous mask is now masked + new_mask = (np.array(mask, dtype=float) @ conversion_matrix) != 0.0 + + return conversion_matrix, new_mask + + +def calculate_interpolation_matrix_2d_axis_axis(input_1: Quantity[ArrayLike], + input_2: Quantity[ArrayLike], + output_1: Quantity[ArrayLike], + output_2: Quantity[ArrayLike], + mask, + order: InterpolationOptions = InterpolationOptions.LINEAR, + is_density: bool = False): + + # This is just the same 1D matrices things + + match order: + case InterpolationOptions.NEAREST_NEIGHBOUR: + pass + + case InterpolationOptions.LINEAR: + pass + + case InterpolationOptions.CUBIC: + pass + + case _: + pass + + +def calculate_interpolation_matrix(input_axes: list[Quantity[ArrayLike]], + output_axes: list[Quantity[ArrayLike]], + data: ArrayLike | None = None, + mask: ArrayLike | None = None): + + # TODO: We probably should delete this, but lets keep it for now + + if len(input_axes) not in (1, 2): + raise InterpolationError("Interpolation is only supported for 1D and 2D data") + + if len(input_axes) == 1 and len(output_axes) == 1: + # Check for dimensionality + input_axis = input_axes[0] + output_axis = output_axes[0] + + if len(input_axis.value.shape) == 1: + if len(output_axis.value.shape) == 1: + calculate_interpolation_matrix_1d() + + if len(output_axes) != len(input_axes): + # Input or output axes might be 2D matrices + pass + + + +def rebin(data: Quantity[ArrayLike], + axes: list[Quantity[ArrayLike]], + new_axes: list[Quantity[ArrayLike]], + mask: ArrayLike | None = None, + interpolation_order: int = 1): + + """ This algorithm is only for operations that preserve dimensionality, + i.e. non-projective rebinning. + """ + + pass diff --git a/sasdata/util.py b/sasdata/util.py new file mode 100644 index 000000000..8decc68be --- /dev/null +++ b/sasdata/util.py @@ -0,0 +1,18 @@ +from collections.abc import Callable +from typing import TypeVar + +T = TypeVar("T") + +def cache[T](fun: Callable[[], T]): + """ Decorator to store values """ + + cache_state = [False, None] + + def wrapper() -> T: + if not cache_state[0]: + cache_state[0] = True + cache_state[1] = fun() + + return cache_state[1] + + return wrapper diff --git a/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/10_1000_1340_10.csv b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/10_1000_1340_10.csv new file mode 100644 index 000000000..8e9c70665 --- /dev/null +++ b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/10_1000_1340_10.csv @@ -0,0 +1,105 @@ +3.624299999999999744e-02 7.295645247999999583e+01 1.637502872666669873e+01 +4.068929999999999769e-02 3.496757764333329987e+01 1.132330254166670080e+01 +4.510000000000000120e-02 2.871506291000000033e+01 8.366418418333330109e+00 +4.957960000000000145e-02 3.062621534000000167e+01 6.807088010000000189e+00 +5.414959999999999912e-02 1.698840335499999910e+01 5.315930135000000334e+00 +5.867460000000000037e-02 1.810732352000000134e+01 4.582343003333329889e+00 +6.313670000000000393e-02 1.758858145166669829e+01 3.753068668333329860e+00 +6.771770000000000567e-02 1.874808681500000063e+01 3.129801861666670071e+00 +7.237100000000000477e-02 1.219239694000000007e+01 2.701832888333330018e+00 +7.692330000000000001e-02 1.502033604000000011e+01 2.415586504999999828e+00 +8.164470000000000061e-02 1.051882241166670084e+01 2.003147743333329789e+00 +8.639470000000000482e-02 1.266539752666670005e+01 1.813845073333330005e+00 +9.106759999999999855e-02 1.164225125833329955e+01 1.590423455000000041e+00 +9.573710000000000553e-02 9.248378555000000389e+00 1.453449206666669991e+00 +1.004952999999999957e-01 1.082198768499999986e+01 1.296534581666670016e+00 +1.052397000000000055e-01 9.754544071666670035e+00 1.192202876666669908e+00 +1.099886000000000058e-01 9.770793396666670461e+00 1.074958141666670031e+00 +1.148422000000000054e-01 9.667035006666669261e+00 9.803857316666669819e-01 +1.197769999999999946e-01 8.381104240000000871e+00 8.964596183333329860e-01 +1.247698000000000002e-01 7.884219706666669936e+00 8.320707283333329540e-01 +1.298370000000000080e-01 8.175124921666670375e+00 7.497416000000000080e-01 +1.349077999999999944e-01 7.421197476666669957e+00 7.207336583333330271e-01 +1.399244000000000043e-01 8.545903931666670061e+00 6.648524133333330033e-01 +1.450733999999999913e-01 7.172791390000000433e+00 6.314494133333330428e-01 +1.502658000000000049e-01 6.110795001666669890e+00 5.924928833333330536e-01 +1.556062000000000001e-01 7.011488443333329990e+00 5.430119199999999813e-01 +1.572456999999999883e-01 7.121472013333329798e+00 1.740741033333330079e-01 +1.609471000000000096e-01 7.438929439999999893e+00 5.263131250000000483e-01 +1.661874999999999880e-01 6.540084590000000198e+00 4.946959550000000205e-01 +1.706292000000000086e-01 6.367655253333330378e+00 1.455746566666669961e-01 +1.715615000000000057e-01 6.476111691666670112e+00 4.707941449999999972e-01 +1.771270000000000067e-01 5.720913878333329983e+00 4.355610400000000104e-01 +1.827315999999999940e-01 6.117868691666670244e+00 4.186226383333330192e-01 +1.842428999999999872e-01 5.857041180000000402e+00 1.254778649999999940e-01 +1.883173999999999959e-01 5.849837826666670182e+00 4.069392433333329784e-01 +1.939794999999999991e-01 5.447672994999999574e+00 3.927526633333329742e-01 +1.982414999999999872e-01 5.391186461666669594e+00 1.085076650000000031e-01 +1.997663000000000078e-01 5.394637556666670442e+00 3.662608233333329855e-01 +2.055810999999999888e-01 5.784545713333329786e+00 3.603836316666669815e-01 +2.114655000000000007e-01 4.574601945000000391e+00 3.312713700000000094e-01 +2.120113000000000136e-01 5.084515549999999884e+00 9.927742500000000248e-02 +2.161903000000000019e-01 4.516358434999999893e+00 4.168106166666670220e-01 +2.259823999999999999e-01 4.782964421666670241e+00 8.791053666666670541e-02 +2.397845000000000115e-01 4.501217386666669817e+00 8.259429166666669431e-02 +2.537096999999999825e-01 4.179436571666670375e+00 7.562756833333329765e-02 +2.676275000000000182e-01 3.979478888333329856e+00 6.987285499999999761e-02 +2.817857999999999752e-01 3.702226940000000077e+00 6.482911333333329917e-02 +2.956398000000000081e-01 3.605992423333329810e+00 6.203536333333330155e-02 +3.099044000000000243e-01 3.377018353333329781e+00 5.670042833333330257e-02 +3.240645999999999805e-01 3.095807218333329836e+00 5.498817999999999762e-02 +3.388027000000000122e-01 2.841171323333330001e+00 4.897826333333329951e-02 +3.539140000000000064e-01 2.795649415000000193e+00 4.845330666666670255e-02 +3.687090000000000090e-01 2.622854690000000044e+00 4.475559833333329907e-02 +3.839813000000000254e-01 2.527809641666669993e+00 4.273165666666670082e-02 +3.988975000000000160e-01 2.232305030000000023e+00 4.094381166666669764e-02 +4.106734000000000218e-01 2.129986383333330124e+00 4.154637366666669857e-02 +4.136514000000000024e-01 2.084593566666669950e+00 3.891198166666669928e-02 +4.290628000000000219e-01 1.988620215000000080e+00 3.594587333333330165e-02 +4.295516999999999808e-01 1.964928603499999982e+00 3.519640899999999795e-02 +4.446014999999999828e-01 1.750614441666670018e+00 3.497378000000000292e-02 +4.466716000000000020e-01 1.709819834666669980e+00 3.112847050000000157e-02 +4.603325999999999807e-01 1.676685876666669905e+00 3.265084166666670090e-02 +4.685437000000000074e-01 1.638395569999999912e+00 3.101072850000000103e-02 +4.764860000000000206e-01 1.575855291666669933e+00 3.097528500000000171e-02 +4.834083000000000130e-01 1.443926158166670026e+00 2.913516383333330032e-02 +4.923204999999999942e-01 1.443778989999999984e+00 3.072023333333330150e-02 +5.046621000000000024e-01 1.382474827333330047e+00 2.709115466666670025e-02 +5.082708000000000226e-01 1.368563626666670086e+00 2.832584499999999880e-02 +5.230728999999999518e-01 1.117650907000000027e+00 2.515010599999999846e-02 +5.249162000000000550e-01 1.271594368333329950e+00 2.652784333333330080e-02 +5.416775999999999813e-01 1.132208539999999930e+00 2.601087833333329963e-02 +5.444001000000000534e-01 1.080469498666670081e+00 2.559191900000000117e-02 +5.583067999999999920e-01 1.032465565000000085e+00 2.510816333333330125e-02 +5.612614999999999688e-01 1.012286258500000091e+00 2.336018449999999885e-02 +5.753956999999999544e-01 9.763539783333330391e-01 2.332539999999999961e-02 +5.834072999999999620e-01 8.965217239999999643e-01 2.303063099999999933e-02 +5.927398999999999862e-01 9.096560916666670549e-01 2.248173499999999922e-02 +6.005747000000000169e-01 8.250965611666669641e-01 2.186496933333329992e-02 +6.099058000000000535e-01 8.168162183333329551e-01 2.170944500000000082e-02 +6.218546000000000351e-01 7.414260915000000507e-01 2.121375600000000028e-02 +6.275003000000000108e-01 7.444278466666669480e-01 2.046154333333330064e-02 +6.412082999999999533e-01 6.366966366666669819e-01 1.883217216666669899e-02 +6.447154999999999969e-01 6.422991433333330447e-01 2.075286000000000144e-02 +6.655497999999999692e-01 5.866493959999999896e-01 1.815403650000000160e-02 +6.843702000000000396e-01 5.515869356666670553e-01 2.025276583333330063e-02 +7.058105999999999547e-01 4.475886111666669831e-01 1.701240433333330027e-02 +7.258693999999999980e-01 4.775394179999999933e-01 1.840697383333329828e-02 +7.490480000000000471e-01 4.047520649999999942e-01 1.505153366666669990e-02 +7.720086999999999922e-01 3.731668894999999875e-01 1.706827766666670076e-02 +7.920989999999999975e-01 3.681129878333330163e-01 1.507231049999999996e-02 +8.155097999999999514e-01 3.208610430000000124e-01 1.529166149999999953e-02 +8.364475000000000104e-01 2.962226738333330056e-01 1.456896033333330079e-02 +8.619377000000000288e-01 2.765821119999999911e-01 1.371801400000000060e-02 +8.846403999999999934e-01 2.799105873333330163e-01 1.446314666666670065e-02 +9.081462000000000145e-01 2.318482950000000098e-01 1.260493333333330065e-02 +9.334447000000000161e-01 2.175556724999999914e-01 1.357374916666670081e-02 +9.551832000000000100e-01 1.903255399999999875e-01 1.273357800000000060e-02 +9.812971999999999806e-01 1.841620115000000002e-01 1.195187833333329931e-02 +1.006807800000000030e+00 1.608915558333330054e-01 1.233432733333329930e-02 +1.030406600000000061e+00 1.533644885000000069e-01 1.172346633333330029e-02 +1.057784300000000011e+00 1.661925581666670038e-01 1.091501716666670035e-02 +1.084600999999999926e+00 1.630933589999999933e-01 1.128103283333329980e-02 +1.109902299999999897e+00 1.327154809999999963e-01 1.088576583333330031e-02 +1.137751600000000085e+00 1.179623709999999964e-01 1.042595833333329926e-02 +1.166036300000000026e+00 1.293750036666669878e-01 1.024355400000000020e-02 \ No newline at end of file diff --git a/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/11_2000_1340_10.csv b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/11_2000_1340_10.csv new file mode 100644 index 000000000..bfbf36dcd --- /dev/null +++ b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/11_2000_1340_10.csv @@ -0,0 +1,105 @@ +3.625559999999999894e-02 4.452644707000000324e+01 1.628119149999999848e+01 +4.070349999999999663e-02 2.677295466333330154e+01 1.128515222166669929e+01 +4.511570000000000163e-02 2.350029203500000108e+01 8.338724138333329705e+00 +4.959680000000000338e-02 1.744413458166669884e+01 6.751264438333329565e+00 +5.416850000000000137e-02 9.909433441666669395e+00 5.280963783333329609e+00 +5.869510000000000005e-02 1.174714312999999954e+01 4.547423594999999708e+00 +6.315869999999999818e-02 1.312634901166670076e+01 3.725749208333330120e+00 +6.774130000000000429e-02 1.654730030333330149e+01 3.113655078333330106e+00 +7.239619999999999389e-02 7.792796271666669661e+00 2.672180411666670086e+00 +7.695009999999999351e-02 1.265325572666669984e+01 2.397233363333330036e+00 +8.167309999999999848e-02 6.069752713333330441e+00 1.971069876666670107e+00 +8.642469999999999319e-02 1.300927747833329917e+01 1.813635340000000040e+00 +9.109929999999999417e-02 9.757094948333330464e+00 1.573592551666670003e+00 +9.577040000000000552e-02 5.713518095000000407e+00 1.422093728333329921e+00 +1.005303000000000030e-01 7.313534973333330136e+00 1.265234731666670109e+00 +1.052763000000000032e-01 8.841184973333330532e+00 1.182077201666670074e+00 +1.100268999999999969e-01 7.404252198333329815e+00 1.051346621666670034e+00 +1.148821000000000009e-01 8.380590695000000423e+00 9.664303683333329564e-01 +1.198187000000000002e-01 7.413483668333330279e+00 8.855263516666670442e-01 +1.248133000000000020e-01 6.593134025000000342e+00 8.175650066666669824e-01 +1.298822000000000032e-01 6.731246111666670195e+00 7.333046399999999521e-01 +1.349548000000000136e-01 5.519098301666669926e+00 6.986229283333329487e-01 +1.399730999999999892e-01 7.581442331666670142e+00 6.528076566666669578e-01 +1.451239000000000001e-01 4.842304316666670161e+00 6.043489516666670225e-01 +1.503181000000000100e-01 5.135523888333329623e+00 5.802922499999999539e-01 +1.556604000000000043e-01 6.037988904999999740e+00 5.310080216666670516e-01 +1.573070000000000024e-01 6.020141886666669606e+00 1.700767950000000028e-01 +1.610031000000000101e-01 6.268605329999999753e+00 5.111983383333329467e-01 +1.662453999999999876e-01 5.536486726666669966e+00 4.815289200000000269e-01 +1.706957000000000058e-01 5.285752210000000062e+00 1.415798849999999887e-01 +1.716212000000000015e-01 5.016643598333329734e+00 4.522174083333330152e-01 +1.771887000000000045e-01 5.127789406666670047e+00 4.276572833333330270e-01 +1.827951999999999910e-01 5.311901800000000229e+00 4.077617766666670196e-01 +1.843146999999999980e-01 5.273006283333329769e+00 1.230909116666669967e-01 +1.883829999999999949e-01 4.028933333333330147e+00 3.832458766666669847e-01 +1.940469999999999973e-01 4.805727509999999647e+00 3.842635300000000198e-01 +1.983187999999999895e-01 4.783697818333330076e+00 1.059592133333329966e-01 +1.998358000000000079e-01 4.823453656666670142e+00 3.585670233333330126e-01 +2.056525999999999910e-01 4.659267076666670171e+00 3.454626916666669878e-01 +2.115392000000000106e-01 3.961550343333330115e+00 3.229926716666670083e-01 +2.120939000000000019e-01 4.350835990000000209e+00 9.606802500000000133e-02 +2.162656000000000023e-01 4.681036608333330129e+00 4.188060433333329891e-01 +2.260705000000000076e-01 4.224838659999999635e+00 8.541253666666670519e-02 +2.398779000000000050e-01 3.935926101666670007e+00 7.996145500000000073e-02 +2.538084999999999924e-01 3.694058728333330155e+00 7.335489833333329324e-02 +2.677318000000000198e-01 3.684019681666669932e+00 6.840629833333329579e-02 +2.818956000000000239e-01 3.452043701666669850e+00 6.355296333333329550e-02 +2.957549999999999901e-01 3.354666878333329993e+00 6.073878666666669701e-02 +3.100250999999999979e-01 3.092418856666669935e+00 5.527531000000000111e-02 +3.241909000000000041e-01 2.870290291666670157e+00 5.380070499999999728e-02 +3.389346999999999777e-01 2.729991994999999783e+00 4.836916333333329820e-02 +3.540519999999999778e-01 2.658729508333330216e+00 4.771163500000000224e-02 +3.688526999999999778e-01 2.488934241666670211e+00 4.403299000000000102e-02 +3.841308999999999974e-01 2.412009111666669980e+00 4.209804999999999797e-02 +3.990528999999999882e-01 2.203036439999999985e+00 4.070905166666669711e-02 +4.105667000000000066e-01 1.996977714666670067e+00 4.083280150000000164e-02 +4.138126999999999778e-01 2.043262161666670185e+00 3.862582833333329940e-02 +4.292300000000000004e-01 1.982205959999999934e+00 3.583282166666670182e-02 +4.294401999999999942e-01 1.834877223666669943e+00 3.458454216666669717e-02 +4.447747000000000228e-01 1.712660204999999936e+00 3.471672166666670001e-02 +4.465555999999999970e-01 1.615437673500000004e+00 3.068944266666669834e-02 +4.605119999999999769e-01 1.681440621666669966e+00 3.260043333333329657e-02 +4.684220000000000050e-01 1.529958281999999947e+00 3.049975383333329917e-02 +4.766716999999999760e-01 1.561241171666670091e+00 3.083583000000000157e-02 +4.832827000000000095e-01 1.369049060333330070e+00 2.875037449999999842e-02 +4.925123000000000140e-01 1.406416503333330015e+00 3.046807833333330107e-02 +5.045309999999999517e-01 1.316827885166669931e+00 2.677764066666669940e-02 +5.084689000000000014e-01 1.339987331666669945e+00 2.812536666666669988e-02 +5.229369999999999852e-01 1.082862526333330022e+00 2.496820599999999973e-02 +5.251208000000000542e-01 1.259172833333330077e+00 2.640966666666669932e-02 +5.418887000000000009e-01 1.134540908333329989e+00 2.596733000000000027e-02 +5.442586999999999842e-01 1.026980480500000015e+00 2.532101549999999854e-02 +5.585244000000000320e-01 1.057657990000000048e+00 2.518052499999999874e-02 +5.611156999999999950e-01 9.343203683333329845e-01 2.299225916666669881e-02 +5.756198999999999621e-01 9.598931866666670087e-01 2.319752666666670057e-02 +5.832557000000000436e-01 8.443178690000000541e-01 2.277228483333329848e-02 +5.929708999999999675e-01 9.115965033333329748e-01 2.244499833333329919e-02 +6.004186999999999719e-01 7.992612106666669991e-01 2.172028233333329894e-02 +6.101434999999999498e-01 8.528685350000000387e-01 2.184797833333329900e-02 +6.216930999999999985e-01 7.049236858333329803e-01 2.102741616666670144e-02 +6.277447999999999917e-01 7.853513183333330483e-01 2.062051499999999898e-02 +6.410417000000000476e-01 6.132204243333330140e-01 1.871036433333329863e-02 +6.449667999999999513e-01 7.011444599999999694e-01 2.101788333333329956e-02 +6.653769000000000489e-01 5.661603698333329548e-01 1.804829366666670099e-02 +6.841924999999999812e-01 5.085138883333329973e-01 2.002898349999999994e-02 +7.056272000000000100e-01 4.352650703333330040e-01 1.694186849999999855e-02 +7.256808000000000147e-01 4.355121908333329794e-01 1.820155999999999857e-02 +7.488534000000000024e-01 3.927147446666670039e-01 1.498729066666669961e-02 +7.718082000000000553e-01 3.535320510000000138e-01 1.696024266666670138e-02 +7.918933000000000222e-01 3.527103021666669891e-01 1.499266833333330086e-02 +8.152979999999999672e-01 3.240461856666669860e-01 1.528614783333329986e-02 +8.362302999999999820e-01 2.791947966666670222e-01 1.448550166666670060e-02 +8.617137999999999742e-01 2.463675190000000070e-01 1.359101549999999943e-02 +8.844106000000000467e-01 2.696912470000000228e-01 1.440389033333329925e-02 +9.079102999999999479e-01 2.246905299999999994e-01 1.256477649999999946e-02 +9.332021999999999817e-01 2.085629360000000043e-01 1.352310049999999944e-02 +9.549351000000000367e-01 1.738771078333329889e-01 1.265774100000000013e-02 +9.810423000000000338e-01 1.708308721666670082e-01 1.189189666666670003e-02 +1.006546299999999894e+00 1.505248680000000061e-01 1.228292216666669948e-02 +1.030138999999999916e+00 1.537520601666670095e-01 1.171224066666669977e-02 +1.057509599999999939e+00 1.534308791666670058e-01 1.086003916666669969e-02 +1.084319299999999986e+00 1.338797798333329903e-01 1.116524300000000004e-02 +1.109614000000000100e+00 1.189064603333330056e-01 1.082743033333329920e-02 +1.137456000000000023e+00 1.107916548333330031e-01 1.039160416666670000e-02 +1.165733499999999978e+00 1.125385351666669947e-01 1.017680349999999963e-02 \ No newline at end of file diff --git a/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/12_3000_1340_10.csv b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/12_3000_1340_10.csv new file mode 100644 index 000000000..9ae1c5f3e --- /dev/null +++ b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/12_3000_1340_10.csv @@ -0,0 +1,105 @@ +3.624610000000000332e-02 5.667029333499999666e+01 1.635708034166669833e+01 +4.069289999999999713e-02 2.663486052833329865e+01 1.131616966500000032e+01 +4.510390000000000232e-02 2.091145430999999988e+01 8.353784624999999409e+00 +4.958379999999999732e-02 1.655762528666669908e+01 6.766916158333329712e+00 +5.415430000000000244e-02 7.405398096666670149e+00 5.285856098333329811e+00 +5.867970000000000130e-02 1.609157327499999823e+01 4.579871853333330023e+00 +6.314219999999999555e-02 2.074624494500000083e+01 3.774208823333330187e+00 +6.772359999999999491e-02 1.622769223499999924e+01 3.121007619999999871e+00 +7.237720000000000264e-02 8.100976058333330343e+00 2.681633823333330113e+00 +7.692999999999999838e-02 7.297140411666670268e+00 2.370097993333330155e+00 +8.165179999999999660e-02 8.662000215000000836e+00 1.993900453333329992e+00 +8.640209999999999557e-02 1.195176863500000053e+01 1.811378463333330080e+00 +9.107550000000000368e-02 1.017929826333329935e+01 1.581605778333329937e+00 +9.574539999999999440e-02 8.299761948333330253e+00 1.447854706666670044e+00 +1.005039999999999961e-01 7.184010728333330320e+00 1.267957188333330043e+00 +1.052488000000000035e-01 7.705754226666670093e+00 1.175315996666669971e+00 +1.099981000000000014e-01 6.940137736666669888e+00 1.050239939999999983e+00 +1.148520999999999986e-01 7.227232895000000212e+00 9.582211533333330200e-01 +1.197872999999999993e-01 6.058664864999999899e+00 8.747766333333329980e-01 +1.247806000000000054e-01 5.235616768333329674e+00 8.060124016666669888e-01 +1.298481999999999970e-01 6.895559143333329644e+00 7.374701233333329498e-01 +1.349194999999999978e-01 5.596115646666669718e+00 7.017485283333330104e-01 +1.399364999999999915e-01 7.271002904999999572e+00 6.515097483333329720e-01 +1.450858999999999899e-01 5.001139740000000167e+00 6.081432883333329764e-01 +1.502787999999999902e-01 5.397041578333330314e+00 5.852662783333330010e-01 +1.556196999999999997e-01 5.201047356666670396e+00 5.230793849999999523e-01 +1.572660999999999920e-01 5.527525920000000426e+00 1.689539216666670063e-01 +1.609609999999999930e-01 6.050507654999999652e+00 5.103277550000000495e-01 +1.662019000000000135e-01 5.215723743333329665e+00 4.792083599999999999e-01 +1.706513000000000058e-01 5.031433279999999897e+00 1.411615750000000113e-01 +1.715762999999999872e-01 4.986483428333330359e+00 4.534299233333329848e-01 +1.771423000000000025e-01 5.106750501666669884e+00 4.289189133333329851e-01 +1.827474000000000043e-01 5.398633823333329751e+00 4.103611200000000236e-01 +1.842668000000000084e-01 4.914610723333329823e+00 1.221897900000000065e-01 +1.883336999999999928e-01 4.776135458333330419e+00 3.942386333333329773e-01 +1.939963000000000104e-01 4.310256373333330338e+00 3.794851616666670147e-01 +1.982673000000000074e-01 4.375084450000000125e+00 1.047416733333329936e-01 +1.997836000000000056e-01 4.425991520000000179e+00 3.548793383333330165e-01 +2.055989000000000011e-01 4.542295369999999721e+00 3.452195166666670034e-01 +2.114837999999999996e-01 4.392925553333330235e+00 3.296180283333329797e-01 +2.120387999999999995e-01 4.102498828333329683e+00 9.538819833333339604e-02 +2.162090000000000123e-01 4.067448908333330060e+00 4.099168333333330083e-01 +2.260118000000000127e-01 3.879140883333330070e+00 8.427184499999999800e-02 +2.398155999999999899e-01 3.717842756666669857e+00 7.930888666666670306e-02 +2.537425999999999848e-01 3.531988756666669893e+00 7.293178499999999898e-02 +2.676623000000000197e-01 3.501111030000000124e+00 6.786378666666670334e-02 +2.818223999999999729e-01 3.329498083333330083e+00 6.325724833333329356e-02 +2.956782000000000021e-01 3.079447669999999970e+00 5.969948499999999658e-02 +3.099446000000000145e-01 2.946954811666670171e+00 5.483356999999999815e-02 +3.241067000000000253e-01 2.705831398333330196e+00 5.323661166666669720e-02 +3.388467000000000007e-01 2.601996516666670090e+00 4.799289000000000333e-02 +3.539599999999999969e-01 2.517872383333330077e+00 4.725612833333329987e-02 +3.687568999999999986e-01 2.374362781666670141e+00 4.368410333333330037e-02 +3.840311000000000141e-01 2.195996148333330122e+00 4.125977166666670165e-02 +3.989493000000000067e-01 2.109030429999999789e+00 4.042385333333330111e-02 +4.107986000000000137e-01 1.888483604166669938e+00 4.043749766666669687e-02 +4.137051999999999952e-01 1.969810571666670063e+00 3.843483833333329741e-02 +4.291185000000000138e-01 1.859797011666669997e+00 3.539587999999999762e-02 +4.296826999999999730e-01 1.762954635166670059e+00 3.439219566666670141e-02 +4.446591999999999767e-01 1.624618943333330012e+00 3.443567000000000156e-02 +4.468077999999999772e-01 1.588049316333330019e+00 3.067751716666669917e-02 +4.603923999999999794e-01 1.585295316666669896e+00 3.227559333333329672e-02 +4.686866000000000088e-01 1.509168766666669992e+00 3.051112400000000058e-02 +4.765479000000000243e-01 1.429500135000000061e+00 3.031986666666669841e-02 +4.835556999999999772e-01 1.309360340500000053e+00 2.857159116666670162e-02 +4.923843999999999999e-01 1.363123808333329912e+00 3.037624166666669928e-02 +5.048160000000000425e-01 1.296483956833329954e+00 2.677855866666669846e-02 +5.083368000000000331e-01 1.254868451666669937e+00 2.782200166666669999e-02 +5.232324000000000419e-01 1.028253859833329953e+00 2.481625150000000071e-02 +5.249844000000000177e-01 1.223231273333329927e+00 2.634227000000000096e-02 +5.417480000000000073e-01 1.058531658333329961e+00 2.569255333333329838e-02 +5.445661000000000529e-01 1.022632484000000064e+00 2.537817800000000124e-02 +5.583793000000000228e-01 1.009770163333330029e+00 2.504100833333329848e-02 +5.614325999999999484e-01 9.522996788333329965e-01 2.313905700000000107e-02 +5.754704000000000486e-01 9.158985283333339611e-01 2.307270666666669939e-02 +5.835850999999999678e-01 8.544030651666669751e-01 2.288279616666670166e-02 +5.928168000000000326e-01 8.553651300000000290e-01 2.224781666666670113e-02 +6.007578000000000085e-01 7.747371155000000176e-01 2.167619850000000042e-02 +6.099849999999999994e-01 7.987110383333330121e-01 2.165553833333330042e-02 +6.220442000000000471e-01 6.615610463333330138e-01 2.089781950000000124e-02 +6.275817000000000201e-01 7.150054516666669580e-01 2.035196333333329916e-02 +6.414037999999999684e-01 6.088626698333330367e-01 1.874337833333329997e-02 +6.447992000000000168e-01 6.630811316666670452e-01 2.089752166666669977e-02 +6.657526999999999751e-01 5.716572943333330103e-01 1.811807299999999843e-02 +6.845788999999999902e-01 5.092866856666670161e-01 2.008440916666669879e-02 +7.060256999999999783e-01 4.113589818333330261e-01 1.688841199999999848e-02 +7.260906999999999778e-01 4.258370573333329911e-01 1.820484666666670123e-02 +7.492763000000000062e-01 3.814062795000000006e-01 1.498164383333329928e-02 +7.722440999999999889e-01 3.582434820000000020e-01 1.702263550000000097e-02 +7.923405000000000031e-01 3.290160251666670033e-01 1.493438950000000078e-02 +8.157583999999999946e-01 3.190799841666669967e-01 1.530228649999999975e-02 +8.367025000000000157e-01 2.762952625000000273e-01 1.450753649999999943e-02 +8.622005000000000363e-01 2.544186793333330088e-01 1.365137966666669922e-02 +8.849101000000000328e-01 2.424038613333329983e-01 1.432358516666669933e-02 +9.084231000000000389e-01 2.172930054999999971e-01 1.256612799999999933e-02 +9.337292000000000369e-01 2.202721591666670087e-01 1.359930866666670020e-02 +9.554743999999999460e-01 1.777866800000000025e-01 1.269970833333330072e-02 +9.815962999999999772e-01 1.676419470000000134e-01 1.190602366666669923e-02 +1.007114700000000029e+00 1.595580418333329975e-01 1.234223233333330005e-02 +1.030720700000000045e+00 1.541775503333329966e-01 1.173861049999999975e-02 +1.058106800000000014e+00 1.554276226666669869e-01 1.088984299999999975e-02 +1.084931700000000054e+00 1.440364893333329899e-01 1.122487333333329999e-02 +1.110240600000000022e+00 1.198653424999999995e-01 1.085281416666670010e-02 +1.138098400000000066e+00 1.211473946666670048e-01 1.044690799999999954e-02 +1.166391799999999979e+00 1.189307901666669942e-01 1.021903716666669980e-02 \ No newline at end of file diff --git a/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/13_8000_1340_10.csv b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/13_8000_1340_10.csv new file mode 100644 index 000000000..ee5f13e07 --- /dev/null +++ b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/13_8000_1340_10.csv @@ -0,0 +1,105 @@ +3.625239999999999713e-02 6.302187949999999717e+01 1.635904319500000170e+01 +4.070000000000000007e-02 2.785521429499999968e+01 1.130956581166669928e+01 +4.511180000000000051e-02 1.008215536333329965e+01 8.312546360000000689e+00 +4.959249999999999770e-02 1.581932412333330085e+01 6.758513281666670203e+00 +5.416379999999999806e-02 7.750620351666669627e+00 5.282679641666669923e+00 +5.868999999999999911e-02 1.257659237500000060e+01 4.560014873333329888e+00 +6.315320000000000655e-02 1.891331758666670027e+01 3.761777425000000008e+00 +6.773540000000000116e-02 1.328150150333330082e+01 3.102479755000000061e+00 +7.238989999999999314e-02 9.795755306666670492e+00 2.689289660000000026e+00 +7.694339999999999513e-02 1.021541878833330053e+01 2.386645821666669942e+00 +8.166600000000000248e-02 7.264236756666670125e+00 1.982897978333330036e+00 +8.641719999999999957e-02 9.727612021666670827e+00 1.793249476666670006e+00 +9.109140000000000292e-02 9.940133039999999198e+00 1.578285125000000066e+00 +9.576210000000000278e-02 5.869161616666669801e+00 1.426304660000000002e+00 +1.005216000000000026e-01 6.271050506666670188e+00 1.258989316666669911e+00 +1.052672000000000052e-01 4.575212496666670070e+00 1.144957958333330028e+00 +1.100174000000000013e-01 6.675946670000000083e+00 1.046739891666669919e+00 +1.148721999999999938e-01 4.569861300000000348e+00 9.307519933333330275e-01 +1.198083000000000065e-01 4.073412075000000243e+00 8.536948699999999945e-01 +1.248023999999999939e-01 5.517398765000000260e+00 8.081908083333330106e-01 +1.298709000000000113e-01 6.055929844999999645e+00 7.277152516666669513e-01 +1.349431000000000103e-01 4.214499321666670184e+00 6.853886750000000028e-01 +1.399610000000000021e-01 4.711855326666669619e+00 6.206856016666669751e-01 +1.451112999999999986e-01 4.280988370000000209e+00 5.992362466666669718e-01 +1.503050999999999970e-01 3.350940026666669791e+00 5.604130616666670450e-01 +1.556469000000000047e-01 4.037392881666669986e+00 5.086757983333329847e-01 +1.572660999999999920e-01 4.116049464999999685e+00 1.639383783333329958e-01 +1.609891999999999990e-01 4.767404383333330387e+00 4.936060199999999787e-01 +1.662309999999999899e-01 4.092517224999999925e+00 4.643677516666669947e-01 +1.706513000000000058e-01 3.775210913333329810e+00 1.365719850000000068e-01 +1.716062999999999894e-01 4.067082121666669714e+00 4.413313999999999848e-01 +1.771733000000000058e-01 3.397890750000000182e+00 4.070909349999999871e-01 +1.827794000000000085e-01 4.061001236666670344e+00 3.925402433333329832e-01 +1.842668000000000084e-01 3.799252254999999856e+00 1.178310383333329991e-01 +1.883665999999999952e-01 3.208655455000000156e+00 3.733191000000000148e-01 +1.940302000000000138e-01 3.206445976666670195e+00 3.650098783333329822e-01 +1.982673000000000074e-01 3.425276903333330125e+00 1.008325449999999956e-01 +1.998185000000000100e-01 3.354815260000000077e+00 3.406662516666669749e-01 +2.056348000000000065e-01 3.721227830000000125e+00 3.339491649999999923e-01 +2.115208000000000088e-01 3.612948971666670062e+00 3.193275150000000062e-01 +2.120387999999999995e-01 3.205896688333329969e+00 9.145261000000000362e-02 +2.162467999999999890e-01 3.645113248333330169e+00 4.021025750000000176e-01 +2.260118000000000127e-01 3.104582965000000083e+00 8.081593333333329798e-02 +2.398155999999999899e-01 3.037513673333330111e+00 7.613482000000000582e-02 +2.537425999999999848e-01 2.836682165000000033e+00 6.969811833333329487e-02 +2.676623000000000197e-01 2.819590748333329788e+00 6.462849833333329796e-02 +2.818223999999999729e-01 2.721404538333330070e+00 6.033223166666670106e-02 +2.956782000000000021e-01 2.736251186666669888e+00 5.799425166666669768e-02 +3.099446000000000145e-01 2.543946483333329844e+00 5.286760000000000070e-02 +3.241067000000000253e-01 2.287160831666669836e+00 5.112056499999999976e-02 +3.388467000000000007e-01 2.288673078333329780e+00 4.649771999999999933e-02 +3.539599999999999969e-01 2.199149091666670053e+00 4.568711999999999773e-02 +3.687568999999999986e-01 2.068072668333329922e+00 4.217328666666669834e-02 +3.840311000000000141e-01 1.969221529999999998e+00 4.012745166666670249e-02 +3.989493000000000067e-01 1.908232941666669902e+00 3.938963333333329875e-02 +4.107629999999999892e-01 1.727702871333330004e+00 3.958386533333330126e-02 +4.137051999999999952e-01 1.726875600000000066e+00 3.720425833333330240e-02 +4.291185000000000138e-01 1.581841901666670047e+00 3.398506666666670228e-02 +4.296455000000000135e-01 1.691278518333330094e+00 3.404221949999999830e-02 +4.446591999999999767e-01 1.488087740000000103e+00 3.374035333333329917e-02 +4.467690999999999746e-01 1.413946998166669911e+00 2.991126200000000096e-02 +4.603923999999999794e-01 1.391984139999999925e+00 3.130147333333330173e-02 +4.686460000000000070e-01 1.392956528666670080e+00 2.997462383333330052e-02 +4.765479000000000243e-01 1.301627080000000047e+00 2.965699000000000113e-02 +4.835137999999999936e-01 1.193676802499999967e+00 2.800566683333330018e-02 +4.923843999999999999e-01 1.242278698333330045e+00 2.973970833333329858e-02 +5.047722000000000042e-01 1.149708217833329993e+00 2.613050733333329920e-02 +5.083368000000000331e-01 1.161310218333329924e+00 2.733334000000000111e-02 +5.231871000000000160e-01 9.503032668333329935e-01 2.446244750000000148e-02 +5.249844000000000177e-01 1.102167341666669964e+00 2.571981833333330039e-02 +5.417480000000000073e-01 9.754589783333329489e-01 2.525416166666670167e-02 +5.445189000000000279e-01 9.366835949999999800e-01 2.497178450000000008e-02 +5.583793000000000228e-01 8.831162099999999571e-01 2.438054666666670048e-02 +5.613839000000000468e-01 8.824506341666670250e-01 2.281443349999999828e-02 +5.754704000000000486e-01 8.100822066666669707e-01 2.253018666666670167e-02 +5.835346000000000144e-01 7.776236106666669645e-01 2.252483566666670101e-02 +5.928168000000000326e-01 7.764561633333330049e-01 2.182597999999999830e-02 +6.007057000000000091e-01 6.983251131666670108e-01 2.131793766666669962e-02 +6.099849999999999994e-01 7.099790583333329685e-01 2.117932666666669933e-02 +6.219902999999999960e-01 6.466382168333330016e-01 2.081252199999999997e-02 +6.275817000000000201e-01 6.603706066666670260e-01 2.006477833333330033e-02 +6.413482000000000349e-01 5.710830485000000234e-01 1.856948533333329862e-02 +6.447992000000000168e-01 5.732715750000000332e-01 2.040912500000000018e-02 +6.656950000000000367e-01 5.203726888333329859e-01 1.789587166666670170e-02 +6.845196000000000058e-01 4.749653629999999738e-01 1.990720683333329841e-02 +7.059646000000000532e-01 3.822856073333329996e-01 1.675657983333329881e-02 +7.260278000000000009e-01 3.886542691666670102e-01 1.802539466666670115e-02 +7.492113999999999718e-01 3.564554191666670091e-01 1.487377883333330063e-02 +7.721772000000000080e-01 3.333074428333330230e-01 1.689668533333330003e-02 +7.922717999999999705e-01 3.187338046666670088e-01 1.488059016666670037e-02 +8.156877999999999629e-01 3.010368924999999862e-01 1.521491216666670011e-02 +8.366301000000000432e-01 2.406595508333330136e-01 1.435568400000000050e-02 +8.621258000000000532e-01 2.223576200000000058e-01 1.352156766666669924e-02 +8.848333999999999921e-01 2.207387865000000060e-01 1.422139816666669922e-02 +9.083444000000000518e-01 2.134049949999999862e-01 1.254214099999999971e-02 +9.336484000000000449e-01 1.885945263333330124e-01 1.346345033333330027e-02 +9.553916000000000075e-01 1.698076676666669949e-01 1.265998783333329922e-02 +9.815112999999999754e-01 1.668850050000000029e-01 1.189438716666670059e-02 +1.007027499999999964e+00 1.441018685000000077e-01 1.227580483333329947e-02 +1.030631400000000086e+00 1.406578583333329968e-01 1.168073399999999991e-02 +1.058015099999999986e+00 1.399035711666669901e-01 1.082874783333329961e-02 +1.084837700000000016e+00 1.486492919999999884e-01 1.123307866666669978e-02 +1.110144500000000090e+00 1.008698655000000027e-01 1.077987283333329931e-02 +1.137999800000000006e+00 1.027075286666670056e-01 1.037853683333330064e-02 +1.166290800000000072e+00 1.157098001666670012e-01 1.020088966666670045e-02 \ No newline at end of file diff --git a/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/1_0_1340_10.csv b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/1_0_1340_10.csv new file mode 100644 index 000000000..1c5c261ee --- /dev/null +++ b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/1_0_1340_10.csv @@ -0,0 +1,105 @@ +3.625239999999999713e-02 2.859171986188329811e+03 2.282233352000000082e+01 +4.070000000000000007e-02 1.037695935384999984e+03 1.390765389166669941e+01 +4.511180000000000051e-02 4.617414862783330136e+02 9.644274246666670436e+00 +4.959249999999999770e-02 2.830472148050000101e+02 7.651757100000000200e+00 +5.416379999999999806e-02 1.737180786733329967e+02 5.901133003333329796e+00 +5.868999999999999911e-02 1.284318533800000068e+02 5.055296333333330061e+00 +6.315320000000000655e-02 1.083304533916670067e+02 4.179970964999999872e+00 +6.773540000000000116e-02 8.164665742500000079e+01 3.449109084999999908e+00 +7.238989999999999314e-02 6.842710629666669320e+01 3.015091889999999886e+00 +7.694339999999999513e-02 6.503887503333329789e+01 2.712566869999999852e+00 +8.166600000000000248e-02 5.768616606333330310e+01 2.292022508333329878e+00 +8.641719999999999957e-02 4.726633163000000337e+01 2.052834279999999900e+00 +9.109140000000000292e-02 4.170182763166670270e+01 1.806841736666670029e+00 +9.576210000000000278e-02 3.278791741500000256e+01 1.635979810000000034e+00 +1.005216000000000026e-01 3.137094696333329935e+01 1.457612156666669989e+00 +1.052672000000000052e-01 2.858316747499999977e+01 1.352856671666669897e+00 +1.100174000000000013e-01 2.685582243333330155e+01 1.222659363333330029e+00 +1.148721999999999938e-01 2.463809722666670154e+01 1.115379456666669933e+00 +1.198083000000000065e-01 1.979913578000000030e+01 1.002652691666670037e+00 +1.248023999999999939e-01 1.884005529499999909e+01 9.371682333333329895e-01 +1.298709000000000113e-01 2.011378014833330141e+01 8.660532583333330203e-01 +1.349431000000000103e-01 1.548196221999999977e+01 8.040137483333329449e-01 +1.399610000000000021e-01 1.553817986500000004e+01 7.396018783333330182e-01 +1.451112999999999986e-01 1.380290046833330031e+01 7.008050850000000498e-01 +1.503050999999999970e-01 1.290957537833329916e+01 6.659874700000000258e-01 +1.556469000000000047e-01 1.188963399333329995e+01 5.958023666666669715e-01 +1.572456999999999883e-01 1.305280697499999931e+01 1.930089849999999940e-01 +1.609891999999999990e-01 1.134609165166670053e+01 5.714861916666670316e-01 +1.662309999999999899e-01 1.103891432833330022e+01 5.468199316666669807e-01 +1.706292000000000086e-01 1.121912493499999997e+01 1.614639983333329976e-01 +1.716062999999999894e-01 1.098087770333330049e+01 5.221648316666670508e-01 +1.771733000000000058e-01 9.846715853333330770e+00 4.826313150000000052e-01 +1.827794000000000085e-01 1.030369242166669963e+01 4.679303400000000002e-01 +1.842428999999999872e-01 9.629214631666670243e+00 1.387244099999999924e-01 +1.883665999999999952e-01 9.108624106666670883e+00 4.454082083333330000e-01 +1.940302000000000138e-01 8.056377178333329780e+00 4.232006716666670276e-01 +1.982414999999999872e-01 8.605072379999999299e+00 1.202604099999999981e-01 +1.998185000000000100e-01 8.229729869999999892e+00 3.995894999999999864e-01 +2.056348000000000065e-01 8.070094290000000115e+00 3.879820366666669740e-01 +2.115208000000000088e-01 7.741634115000000094e+00 3.686955350000000187e-01 +2.120113000000000136e-01 7.664225765000000301e+00 1.093220133333329958e-01 +2.162467999999999890e-01 7.363320653333330412e+00 4.626756216666669808e-01 +2.259823999999999999e-01 6.848802841666669750e+00 9.609777999999999376e-02 +2.397845000000000115e-01 6.337189861666669977e+00 9.020952999999999611e-02 +2.537096999999999825e-01 5.738702153333330003e+00 8.211384833333329469e-02 +2.676275000000000182e-01 5.346591223333329701e+00 7.572218666666670484e-02 +2.817857999999999752e-01 5.009933698333330021e+00 7.051459333333330581e-02 +2.956398000000000081e-01 4.597692046666669974e+00 6.646157833333329878e-02 +3.099044000000000243e-01 4.193400725000000051e+00 6.031815000000000093e-02 +3.240645999999999805e-01 3.804645918333330101e+00 5.825413166666670167e-02 +3.388027000000000122e-01 3.560888523333329836e+00 5.213344166666669666e-02 +3.539140000000000064e-01 3.375211385000000064e+00 5.107971833333330158e-02 +3.687090000000000090e-01 3.188264295000000192e+00 4.732182333333329743e-02 +3.839813000000000254e-01 2.892990108333330035e+00 4.441047333333329739e-02 +3.988975000000000160e-01 2.640608908333330174e+00 4.290645666666669661e-02 +4.106379000000000001e-01 2.501690660833329805e+00 4.331324033333330131e-02 +4.136514000000000024e-01 2.477246653333330162e+00 4.077528500000000139e-02 +4.290628000000000219e-01 2.358423203333329887e+00 3.769917166666669761e-02 +4.295145000000000213e-01 2.266923564999999918e+00 3.645828216666670285e-02 +4.446014999999999828e-01 2.023246533333329822e+00 3.627248666666670063e-02 +4.466328999999999994e-01 2.032174506166669836e+00 3.243397416666669864e-02 +4.603325999999999807e-01 1.951935533333329920e+00 3.395880333333330114e-02 +4.685032000000000085e-01 1.797322475499999905e+00 3.168831166666669780e-02 +4.764860000000000206e-01 1.814704324999999896e+00 3.212894000000000166e-02 +4.833663999999999739e-01 1.722621554333330085e+00 3.037123383333329915e-02 +4.923204999999999942e-01 1.658358661666669898e+00 3.178619500000000320e-02 +5.046184000000000225e-01 1.539108265666669917e+00 2.774163983333330016e-02 +5.082708000000000226e-01 1.547966548333330028e+00 2.920229666666670013e-02 +5.230276000000000369e-01 1.345057283333330078e+00 2.608127533333329945e-02 +5.249162000000000550e-01 1.417396718333330030e+00 2.724554333333329900e-02 +5.416775999999999813e-01 1.270799306666670070e+00 2.670250999999999875e-02 +5.443529999999999758e-01 1.250087865666670073e+00 2.633086933333329827e-02 +5.583067999999999920e-01 1.165305416666670091e+00 2.577655499999999961e-02 +5.612129000000000145e-01 1.147836548999999984e+00 2.393862083333329893e-02 +5.753956999999999544e-01 1.115183805000000028e+00 2.400332833333329932e-02 +5.833568000000000087e-01 1.044019996999999922e+00 2.366755300000000090e-02 +5.927398999999999862e-01 1.004017331666670065e+00 2.296542000000000028e-02 +6.005226999999999649e-01 9.482225546666670501e-01 2.240195116666670108e-02 +6.099058000000000535e-01 9.388455449999999480e-01 2.233828499999999939e-02 +6.218008000000000424e-01 8.511757086666670302e-01 2.168908733333330119e-02 +6.275003000000000108e-01 8.553386066666669452e-01 2.101305833333329959e-02 +6.411527999999999672e-01 7.761240236666669956e-01 1.940277716666670080e-02 +6.447154999999999969e-01 7.270576883333329521e-01 2.120466833333330137e-02 +6.654921999999999782e-01 7.007768106666669716e-01 1.861042133333330045e-02 +6.843110000000000026e-01 6.466361541666669766e-01 2.069310833333330019e-02 +7.057493999999999712e-01 5.771519323333329510e-01 1.752841666666669906e-02 +7.258065000000000211e-01 5.204018098333329512e-01 1.860044799999999859e-02 +7.489831000000000127e-01 4.984340896666670240e-01 1.540761000000000040e-02 +7.719418000000000113e-01 4.436713720000000083e-01 1.738589999999999927e-02 +7.920304000000000233e-01 4.316635041666669892e-01 1.532890283333330009e-02 +8.154392000000000307e-01 3.868879691666670118e-01 1.556857449999999969e-02 +8.363751000000000380e-01 3.670109628333330098e-01 1.484866983333330004e-02 +8.618630000000000457e-01 3.329731463333330255e-01 1.392995016666669951e-02 +8.845638000000000112e-01 3.302565831666670060e-01 1.467645416666669977e-02 +9.080675999999999748e-01 2.757098590000000016e-01 1.276754683333329934e-02 +9.333637999999999657e-01 2.804865558333329845e-01 1.382540016666669938e-02 +9.551005000000000189e-01 2.398962168333330092e-01 1.292395533333329932e-02 +9.812121999999999788e-01 2.360268241666670097e-01 1.213837400000000039e-02 +1.006720599999999965e+00 2.134167958333330062e-01 1.253179649999999930e-02 +1.030317399999999939e+00 2.102511210000000130e-01 1.193319533333330081e-02 +1.057692700000000041e+00 2.135461601666669984e-01 1.107935333333330032e-02 +1.084507099999999946e+00 1.969431385000000034e-01 1.140526600000000071e-02 +1.109806099999999907e+00 1.561050018333330069e-01 1.096976283333329916e-02 +1.137653000000000025e+00 1.629041234999999976e-01 1.057719600000000051e-02 +1.165935399999999955e+00 1.774132069999999894e-01 1.040658966666670009e-02 \ No newline at end of file diff --git a/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/2_20_1340_10.csv b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/2_20_1340_10.csv new file mode 100644 index 000000000..3fc895617 --- /dev/null +++ b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/2_20_1340_10.csv @@ -0,0 +1,105 @@ +3.623980000000000257e-02 4.717095203250000282e+02 1.736400694499999986e+01 +4.068580000000000113e-02 2.786014172683330230e+02 1.198827076999999974e+01 +4.509610000000000007e-02 1.807710803516669955e+02 8.834240069999999889e+00 +4.957530000000000270e-02 1.404167299050000111e+02 7.187393765000000379e+00 +5.414490000000000275e-02 1.070548824566670021e+02 5.660295944999999662e+00 +5.866960000000000230e-02 9.429733434666670178e+01 4.914365443333330141e+00 +6.313130000000000130e-02 8.753748113499999306e+01 4.086659178333330367e+00 +6.771190000000000542e-02 8.007891920833330346e+01 3.441741584999999937e+00 +7.236470000000000402e-02 5.999202779333329971e+01 2.970499293333329849e+00 +7.691660000000000164e-02 5.902839900166669906e+01 2.678938321666669786e+00 +8.163760000000000461e-02 4.960764509333330352e+01 2.245417474999999996e+00 +8.638719999999999732e-02 4.414010876166670272e+01 2.032560301666670011e+00 +9.105969999999999342e-02 4.256424763833329905e+01 1.812761751666670085e+00 +9.572880000000000278e-02 3.308233848333330229e+01 1.638201501666670001e+00 +1.004865999999999954e-01 2.810971494833329842e+01 1.433384486666670066e+00 +1.052305999999999936e-01 2.588485028666670118e+01 1.331128581666670030e+00 +1.099790999999999963e-01 2.266535039333329848e+01 1.188278135000000013e+00 +1.148321999999999954e-01 2.068870146000000076e+01 1.081535063333330049e+00 +1.197666000000000008e-01 1.976825064833330003e+01 1.002416109999999971e+00 +1.247589999999999949e-01 1.708519936000000072e+01 9.212166283333329542e-01 +1.298257999999999912e-01 1.961539944500000132e+01 8.615532866666669731e-01 +1.348960999999999910e-01 1.509279464499999968e+01 8.002327049999999886e-01 +1.399122999999999895e-01 1.461401991333329953e+01 7.302237983333329518e-01 +1.450607999999999898e-01 1.234817605166669985e+01 6.862621599999999544e-01 +1.502527999999999919e-01 1.236984282499999921e+01 6.604921383333329787e-01 +1.555927000000000004e-01 1.196552256666669933e+01 5.966093183333329719e-01 +1.572660999999999920e-01 1.278021405166670021e+01 1.919547649999999994e-01 +1.609331999999999985e-01 1.153752966666669977e+01 5.736198133333330063e-01 +1.661730999999999903e-01 1.078861117833329963e+01 5.440816866666670082e-01 +1.706513000000000058e-01 1.087118622666669943e+01 1.601861350000000073e-01 +1.715465999999999935e-01 9.877732214999999982e+00 5.101304616666669789e-01 +1.771117000000000108e-01 1.016148657499999963e+01 4.860413033333330080e-01 +1.827158000000000115e-01 1.012859923499999937e+01 4.659961616666670192e-01 +1.842668000000000084e-01 9.892309961666670759e+00 1.394281016666669981e-01 +1.883010999999999990e-01 9.370592901666670471e+00 4.483600366666670167e-01 +1.939626999999999879e-01 7.953713988333330320e+00 4.220674716666670268e-01 +1.982673000000000074e-01 8.536490116666669792e+00 1.198682733333329975e-01 +1.997490000000000099e-01 8.016174306666670191e+00 3.972042266666669930e-01 +2.055633000000000044e-01 7.936747634999999690e+00 3.864501066666670148e-01 +2.114472000000000018e-01 7.092097319999999705e+00 3.613801233333330254e-01 +2.120387999999999995e-01 7.719984431666669700e+00 1.093860133333330042e-01 +2.161715999999999915e-01 7.279911723333330364e+00 4.614210216666669861e-01 +2.260118000000000127e-01 6.899103116666670310e+00 9.616077666666669743e-02 +2.398155999999999899e-01 6.131303501666669931e+00 8.927448999999999801e-02 +2.537425999999999848e-01 5.657937448333330011e+00 8.168489666666670090e-02 +2.676623000000000197e-01 5.142021448333330191e+00 7.478100833333330144e-02 +2.818223999999999729e-01 4.914665098333330207e+00 7.002304500000000598e-02 +2.956782000000000021e-01 4.446721935000000236e+00 6.572301166666670580e-02 +3.099446000000000145e-01 4.282954679999999570e+00 6.061547666666670248e-02 +3.241067000000000253e-01 3.767117071666670203e+00 5.800978500000000121e-02 +3.388467000000000007e-01 3.499952983333329826e+00 5.180699999999999888e-02 +3.539599999999999969e-01 3.303444670000000194e+00 5.069738166666670071e-02 +3.687568999999999986e-01 2.950319708333330126e+00 4.620904333333329672e-02 +3.840311000000000141e-01 2.864367984999999894e+00 4.422433499999999656e-02 +3.989493000000000067e-01 2.552979848333329915e+00 4.244176999999999672e-02 +4.107629999999999892e-01 2.431688859833330163e+00 4.295243233333329719e-02 +4.137051999999999952e-01 2.340746346666669808e+00 4.009275166666669693e-02 +4.291185000000000138e-01 2.236674611666670032e+00 3.708904500000000104e-02 +4.296455000000000135e-01 2.145105044333329936e+00 3.592934700000000037e-02 +4.446591999999999767e-01 1.951663006666670030e+00 3.589577499999999782e-02 +4.467690999999999746e-01 1.941018092166669984e+00 3.204738566666669869e-02 +4.603923999999999794e-01 1.841567858333329921e+00 3.340552499999999841e-02 +4.686460000000000070e-01 1.795296687500000044e+00 3.165418133333330192e-02 +4.765479000000000243e-01 1.725552725000000009e+00 3.166947999999999985e-02 +4.835137999999999936e-01 1.648896234833330032e+00 3.002704050000000111e-02 +4.923843999999999999e-01 1.592235150000000043e+00 3.142748499999999806e-02 +5.047722000000000042e-01 1.524318554666669989e+00 2.765916716666669967e-02 +5.083368000000000331e-01 1.470192684999999999e+00 2.879683666666670028e-02 +5.231871000000000160e-01 1.276008043333330066e+00 2.578494833333330044e-02 +5.249844000000000177e-01 1.335736669999999959e+00 2.682150333333329847e-02 +5.417480000000000073e-01 1.255200871666670048e+00 2.659473333333330081e-02 +5.445189000000000279e-01 1.181751707666669926e+00 2.602010650000000092e-02 +5.583793000000000228e-01 1.119981195000000040e+00 2.552491833333329907e-02 +5.613839000000000468e-01 1.109540133333329903e+00 2.376074416666670158e-02 +5.754704000000000486e-01 1.035568078333330089e+00 2.359670999999999991e-02 +5.835346000000000144e-01 1.009673415166669974e+00 2.350527950000000019e-02 +5.928168000000000326e-01 9.958746566666669686e-01 2.289775833333329916e-02 +6.007057000000000091e-01 9.162153768333329840e-01 2.224946400000000005e-02 +6.099849999999999994e-01 8.912180400000000446e-01 2.207391333333329902e-02 +6.219902999999999960e-01 8.127960751666669648e-01 2.151158183333330004e-02 +6.275817000000000201e-01 8.004247816666669735e-01 2.072389499999999912e-02 +6.413482000000000349e-01 7.426332359999999744e-01 1.925514349999999861e-02 +6.447992000000000168e-01 7.076525866666669717e-01 2.108122000000000121e-02 +6.656950000000000367e-01 6.442563610000000551e-01 1.837696600000000152e-02 +6.845196000000000058e-01 6.085390748333330269e-01 2.050695833333330068e-02 +7.059646000000000532e-01 5.280073378333329792e-01 1.732566899999999840e-02 +7.260278000000000009e-01 5.220653703333330009e-01 1.859470200000000115e-02 +7.492113999999999718e-01 4.598426163333330097e-01 1.525465250000000023e-02 +7.721772000000000080e-01 4.332637708333330062e-01 1.732895283333329983e-02 +7.922717999999999705e-01 4.105990393333330268e-01 1.523655316666669944e-02 +8.156877999999999629e-01 3.602943534999999975e-01 1.545041316666669919e-02 +8.366301000000000432e-01 3.406887861666669792e-01 1.473824349999999957e-02 +8.621258000000000532e-01 3.067601776666670221e-01 1.382606316666670082e-02 +8.848333999999999921e-01 3.015524316666670090e-01 1.454982116666670051e-02 +9.083444000000000518e-01 2.607474308333330160e-01 1.270642616666669937e-02 +9.336484000000000449e-01 2.588003018333330241e-01 1.373286349999999940e-02 +9.553916000000000075e-01 2.226530176666670080e-01 1.285228899999999938e-02 +9.815112999999999754e-01 2.127235584999999929e-01 1.205009299999999957e-02 +1.007027499999999964e+00 2.082924603333330127e-01 1.250585733333330063e-02 +1.030631400000000086e+00 1.912464838333330086e-01 1.185822249999999960e-02 +1.058015099999999986e+00 1.948314409999999941e-01 1.101004149999999966e-02 +1.084837700000000016e+00 1.896849941666670092e-01 1.137308499999999979e-02 +1.110144500000000090e+00 1.497566153333330097e-01 1.094208966666669960e-02 +1.137999800000000006e+00 1.454676966666670068e-01 1.051448583333330043e-02 +1.166290800000000072e+00 1.467227160000000030e-01 1.029956333333329963e-02 \ No newline at end of file diff --git a/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/3_35_1340_10.csv b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/3_35_1340_10.csv new file mode 100644 index 000000000..5ef6a3266 --- /dev/null +++ b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/3_35_1340_10.csv @@ -0,0 +1,105 @@ +3.625239999999999713e-02 2.531792558183329902e+02 1.680830338499999854e+01 +4.070000000000000007e-02 1.901177223299999923e+02 1.173664666500000031e+01 +4.511180000000000051e-02 1.217924648083329942e+02 8.645296186666669769e+00 +4.959249999999999770e-02 1.094275780066670052e+02 7.073034475000000043e+00 +5.416379999999999806e-02 8.791320813333329909e+01 5.581711248333330211e+00 +5.868999999999999911e-02 8.309104453833330695e+01 4.860535583333329690e+00 +6.315320000000000655e-02 7.081360745666670198e+01 4.003961999999999577e+00 +6.773540000000000116e-02 6.343291181166669901e+01 3.355398363333330192e+00 +7.238989999999999314e-02 4.842191466166669755e+01 2.903796691666669982e+00 +7.694339999999999513e-02 4.694420552666669977e+01 2.605583116666669863e+00 +8.166600000000000248e-02 4.367521950333330238e+01 2.207077676666670207e+00 +8.641719999999999957e-02 3.957930205499999943e+01 1.999356729999999915e+00 +9.109140000000000292e-02 3.553857484166670133e+01 1.762052579999999979e+00 +9.576210000000000278e-02 2.783675838666669833e+01 1.597004463333330015e+00 +1.005216000000000026e-01 2.705964543666669897e+01 1.423240978333329965e+00 +1.052672000000000052e-01 2.262947438833329983e+01 1.302317253333330038e+00 +1.100174000000000013e-01 2.182584247666670052e+01 1.179366926666669979e+00 +1.148721999999999938e-01 2.121788853500000016e+01 1.084366495000000041e+00 +1.198083000000000065e-01 1.779511935000000022e+01 9.833421683333329888e-01 +1.248023999999999939e-01 1.651748253666670152e+01 9.145048883333329881e-01 +1.298709000000000113e-01 1.721928703000000027e+01 8.380137100000000228e-01 +1.349431000000000103e-01 1.436323046666669967e+01 7.917284633333330213e-01 +1.399610000000000021e-01 1.550343697666670018e+01 7.379972516666669646e-01 +1.451112999999999986e-01 1.303663926666670037e+01 6.920347900000000108e-01 +1.503050999999999970e-01 1.200503839166669984e+01 6.556345366666670449e-01 +1.556469000000000047e-01 1.229304255666670009e+01 5.989305183333329952e-01 +1.573070000000000024e-01 1.257057899666670053e+01 1.910309249999999903e-01 +1.609891999999999990e-01 1.193592632666669928e+01 5.769697900000000379e-01 +1.662309999999999899e-01 1.125234698666669964e+01 5.482133000000000145e-01 +1.706957000000000058e-01 1.058112505166669948e+01 1.590339783333329926e-01 +1.716062999999999894e-01 1.070644689999999954e+01 5.183003699999999547e-01 +1.771733000000000058e-01 9.479454351666669609e+00 4.778282466666670114e-01 +1.827794000000000085e-01 9.400985496666670826e+00 4.569814249999999967e-01 +1.843146999999999980e-01 9.549487438333329692e+00 1.380682866666670117e-01 +1.883665999999999952e-01 8.342261173333330504e+00 4.359566316666669827e-01 +1.940302000000000138e-01 8.124126898333329905e+00 4.232381216666670221e-01 +1.983187999999999895e-01 8.328415036666669380e+00 1.189532799999999946e-01 +1.998185000000000100e-01 8.328210934999999537e+00 3.999954083333330246e-01 +2.056348000000000065e-01 8.350671104999999983e+00 3.905236483333329733e-01 +2.115208000000000088e-01 6.929636241666670138e+00 3.588886250000000167e-01 +2.120939000000000019e-01 7.535892504999999630e+00 1.085254183333329986e-01 +2.162467999999999890e-01 7.407988318333329936e+00 4.625349066666670228e-01 +2.260705000000000076e-01 6.743451298333329902e+00 9.541167166666669752e-02 +2.398779000000000050e-01 6.099490819999999758e+00 8.899463999999999986e-02 +2.538084999999999924e-01 5.555039073333330357e+00 8.113394833333330280e-02 +2.677318000000000198e-01 5.152730110000000252e+00 7.469547999999999466e-02 +2.818956000000000239e-01 4.837557096666669665e+00 6.957829666666670576e-02 +2.957549999999999901e-01 4.369791838333330070e+00 6.527595833333330044e-02 +3.100250999999999979e-01 4.110463069999999774e+00 5.977720166666670304e-02 +3.241909000000000041e-01 3.813721606666669928e+00 5.811357666666670113e-02 +3.389346999999999777e-01 3.461479851666669827e+00 5.155417166666669687e-02 +3.540519999999999778e-01 3.230298750000000219e+00 5.028755499999999767e-02 +3.688526999999999778e-01 2.998165658333329819e+00 4.634052999999999783e-02 +3.841308999999999974e-01 2.784144708333330165e+00 4.378963833333329725e-02 +3.990528999999999882e-01 2.595613363333329815e+00 4.256657166666669850e-02 +4.108341999999999827e-01 2.335089765499999803e+00 4.258898366666669794e-02 +4.138126999999999778e-01 2.324415418333329875e+00 3.994880166666670007e-02 +4.292300000000000004e-01 2.216248561666669836e+00 3.693022666666669757e-02 +4.297198999999999880e-01 2.134554158666670087e+00 3.596130699999999791e-02 +4.447747000000000228e-01 1.890609146666669904e+00 3.555346833333330320e-02 +4.468464999999999798e-01 1.908117816499999897e+00 3.198120466666670020e-02 +4.605119999999999769e-01 1.871098863333330087e+00 3.348654166666670262e-02 +4.687272000000000105e-01 1.810652348333330108e+00 3.178039216666669886e-02 +4.766716999999999760e-01 1.698277889999999957e+00 3.148857166666670093e-02 +4.835976000000000163e-01 1.613169754500000108e+00 2.993151466666670035e-02 +4.925123000000000140e-01 1.548358499999999971e+00 3.116390166666669834e-02 +5.048597000000000223e-01 1.494630669833330039e+00 2.759253283333330115e-02 +5.084689000000000014e-01 1.491590500000000041e+00 2.885127333333329866e-02 +5.232776999999999568e-01 1.248566430833329965e+00 2.572220416666669979e-02 +5.251208000000000542e-01 1.383180581666670017e+00 2.700447666666670049e-02 +5.418887000000000009e-01 1.221960488333329931e+00 2.639246833333330072e-02 +5.446132999999999669e-01 1.208971178333329899e+00 2.618446533333329898e-02 +5.585244000000000320e-01 1.107120358333330001e+00 2.542247833333330029e-02 +5.614812000000000136e-01 1.085889866500000078e+00 2.370511449999999909e-02 +5.756198999999999621e-01 1.024119451666670066e+00 2.350574000000000066e-02 +5.836356999999999795e-01 9.666399098333330331e-01 2.336446566666669847e-02 +5.929708999999999675e-01 9.753983600000000198e-01 2.276144833333329856e-02 +6.008097999999999494e-01 8.857038164999999630e-01 2.215761016666669900e-02 +6.101434999999999498e-01 9.144217283333330171e-01 2.215592499999999992e-02 +6.220980999999999872e-01 8.054969749999999484e-01 2.151697083333330152e-02 +6.277447999999999917e-01 7.972735800000000372e-01 2.067797666666670170e-02 +6.414592999999999545e-01 7.033510668333330385e-01 1.912904316666669963e-02 +6.449667999999999513e-01 7.010848466666670387e-01 2.101707333333329916e-02 +6.658104000000000244e-01 6.363828563333330246e-01 1.837497983333330129e-02 +6.846381999999999746e-01 5.758642446666669690e-01 2.039069533333329881e-02 +7.060868999999999618e-01 5.109788090000000338e-01 1.728495966666670006e-02 +7.261535999999999547e-01 4.885223020000000194e-01 1.847847583333329935e-02 +7.493412999999999879e-01 4.387949984999999775e-01 1.519840233333329994e-02 +7.723109999999999697e-01 3.923397161666670185e-01 1.717436333333329998e-02 +7.924090999999999774e-01 3.993512075000000272e-01 1.521433699999999965e-02 +8.158290999999999737e-01 3.564691013333329828e-01 1.545670316666669999e-02 +8.367750000000000465e-01 3.230009236666669947e-01 1.469029500000000078e-02 +8.622752000000000194e-01 2.878051181666669844e-01 1.377513966666669976e-02 +8.849867000000000150e-01 2.848005155000000177e-01 1.450056933333329981e-02 +9.085018000000000260e-01 2.630901753333330095e-01 1.273161166666669959e-02 +9.338100999999999763e-01 2.556641304999999753e-01 1.373873700000000087e-02 +9.555571000000000481e-01 2.110106781666669928e-01 1.282516266666670034e-02 +9.816814000000000373e-01 1.989191335000000116e-01 1.201689483333330012e-02 +1.007201999999999931e+00 1.798726026666669919e-01 1.241756500000000020e-02 +1.030810000000000004e+00 1.697684260000000001e-01 1.179553216666670047e-02 +1.058198500000000042e+00 1.911874938333329998e-01 1.101163099999999916e-02 +1.085025700000000093e+00 1.546144220000000014e-01 1.126302133333329999e-02 +1.110336800000000013e+00 1.274498698333330071e-01 1.087918116666669946e-02 +1.138196999999999903e+00 1.312019681666669879e-01 1.048030450000000079e-02 +1.166492899999999944e+00 1.202452754999999984e-01 1.022370933333329943e-02 \ No newline at end of file diff --git a/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/4_50_1340_10.csv b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/4_50_1340_10.csv new file mode 100644 index 000000000..51227d3b8 --- /dev/null +++ b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/4_50_1340_10.csv @@ -0,0 +1,105 @@ +3.624299999999999744e-02 2.421839941750000094e+02 1.681259771499999900e+01 +4.068929999999999769e-02 1.253477160583330061e+02 1.158261931833330038e+01 +4.510000000000000120e-02 1.038159109083329952e+02 8.606540843333329249e+00 +4.957960000000000145e-02 9.508877155000000414e+01 7.037626288333330038e+00 +5.414959999999999912e-02 7.142443308833330207e+01 5.530319266666669620e+00 +5.867460000000000037e-02 6.747951957166669956e+01 4.803320423333330424e+00 +6.313670000000000393e-02 6.491403129500000091e+01 3.984481885000000112e+00 +6.771770000000000567e-02 5.688806046833330043e+01 3.329560004999999823e+00 +7.237100000000000477e-02 4.031379161166670144e+01 2.864987329999999943e+00 +7.692330000000000001e-02 4.363721252500000247e+01 2.591659659999999921e+00 +8.164470000000000061e-02 3.499940050499999700e+01 2.159604903333330217e+00 +8.639470000000000482e-02 3.331168452000000002e+01 1.961486934999999932e+00 +9.106759999999999855e-02 3.141853618500000067e+01 1.737193953333330043e+00 +9.573710000000000553e-02 2.514925802833329982e+01 1.580249494999999893e+00 +1.004952999999999957e-01 2.418445705499999931e+01 1.404480071666670105e+00 +1.052397000000000055e-01 2.311071394833329862e+01 1.309208076666670051e+00 +1.099886000000000058e-01 2.234431306333329914e+01 1.186371084999999992e+00 +1.148422000000000054e-01 2.015011891333330141e+01 1.077548355000000013e+00 +1.197769999999999946e-01 1.762490517499999854e+01 9.840672733333329925e-01 +1.247698000000000002e-01 1.703488854000000075e+01 9.213895800000000413e-01 +1.298370000000000080e-01 1.644401272166669870e+01 8.327218266666670532e-01 +1.349077999999999944e-01 1.614025673666670002e+01 8.110203433333329492e-01 +1.399244000000000043e-01 1.432045983666669997e+01 7.277294366666670067e-01 +1.450733999999999913e-01 1.348007003166670081e+01 6.981156733333330200e-01 +1.502658000000000049e-01 1.217057146500000009e+01 6.589065133333330548e-01 +1.556062000000000001e-01 1.311354035333330081e+01 6.087518283333329672e-01 +1.573412999999999895e-01 1.262766263333329952e+01 1.918068450000000036e-01 +1.609471000000000096e-01 1.195521582166669994e+01 5.786270049999999721e-01 +1.661874999999999880e-01 1.070419187999999977e+01 5.435432616666669992e-01 +1.707328999999999930e-01 1.060603477499999947e+01 1.596232366666670011e-01 +1.715615000000000057e-01 1.106375028666669991e+01 5.234683166666670440e-01 +1.771270000000000067e-01 9.097135046666670277e+00 4.748174949999999783e-01 +1.827315999999999940e-01 9.232441778333329907e+00 4.562185283333329844e-01 +1.843548999999999882e-01 9.582483613333330652e+00 1.386399050000000077e-01 +1.883173999999999959e-01 9.681451038333330317e+00 4.521609416666669823e-01 +1.939794999999999991e-01 8.227612430000000643e+00 4.254379616666669750e-01 +1.983621000000000134e-01 8.295318078333329126e+00 1.192443799999999970e-01 +1.997663000000000078e-01 8.131970284999999521e+00 3.988034016666670012e-01 +2.055810999999999888e-01 7.142658796666670362e+00 3.773835349999999922e-01 +2.114655000000000007e-01 7.164933761666669731e+00 3.624743966666669759e-01 +2.121402000000000010e-01 7.387669431666670228e+00 1.083523799999999981e-01 +2.161903000000000019e-01 6.864321103333329788e+00 4.553583783333329804e-01 +2.261198000000000097e-01 6.847039901666669870e+00 9.614554833333330275e-02 +2.399302000000000101e-01 6.151464958333329847e+00 8.952354166666670610e-02 +2.538638999999999757e-01 5.563245829999999614e+00 8.146051666666670465e-02 +2.677901999999999783e-01 5.162996156666669556e+00 7.501275500000000040e-02 +2.819571000000000160e-01 4.731078383333329640e+00 6.938886333333330048e-02 +2.958196000000000159e-01 4.470382223333330352e+00 6.595420000000000449e-02 +3.100928000000000018e-01 4.071269568333329758e+00 5.983178000000000107e-02 +3.242616999999999861e-01 3.818289136666670025e+00 5.835058500000000342e-02 +3.390086999999999962e-01 3.464278166666669989e+00 5.175618166666669934e-02 +3.541291999999999773e-01 3.297458013333330218e+00 5.076983000000000190e-02 +3.689332000000000167e-01 3.070901008333330129e+00 4.683460500000000137e-02 +3.842147000000000201e-01 2.769801061666670172e+00 4.388707166666670073e-02 +3.991399999999999948e-01 2.510583560000000158e+00 4.232430333333329908e-02 +4.106022999999999756e-01 2.374815773499999949e+00 4.286182233333329927e-02 +4.139030000000000209e-01 2.373871081666670158e+00 4.032223833333330176e-02 +4.293236999999999748e-01 2.231085370000000179e+00 3.713437166666670036e-02 +4.294773000000000063e-01 2.156539414333329852e+00 3.612328016666670194e-02 +4.448717999999999839e-01 1.876962131666670031e+00 3.561285166666670193e-02 +4.465942999999999996e-01 1.963582529333329996e+00 3.226501116666669750e-02 +4.606124999999999803e-01 1.886281606666670108e+00 3.367513833333329876e-02 +4.684626000000000068e-01 1.795604685000000034e+00 3.177854483333329705e-02 +4.767757000000000245e-01 1.729912848333329922e+00 3.174894833333329752e-02 +4.833245999999999931e-01 1.643333701666670033e+00 3.012282700000000132e-02 +4.926197999999999966e-01 1.601281793333330095e+00 3.152871666666669931e-02 +5.045747000000000426e-01 1.513868059666670041e+00 2.772222300000000070e-02 +5.085798000000000263e-01 1.480025179999999940e+00 2.889593166666670071e-02 +5.229823000000000111e-01 1.292098316666669966e+00 2.594417883333329997e-02 +5.252354000000000189e-01 1.389690103333329985e+00 2.712855999999999948e-02 +5.420070000000000165e-01 1.207626951666670001e+00 2.641061333333330138e-02 +5.443057999999999508e-01 1.171074812333330106e+00 2.606778300000000062e-02 +5.586463000000000401e-01 1.131968480000000055e+00 2.562754666666669859e-02 +5.611642999999999493e-01 1.119771183833329964e+00 2.388942000000000149e-02 +5.757455000000000211e-01 1.050324178333329916e+00 2.370775166666670014e-02 +5.833063000000000553e-01 9.890430198333329814e-01 2.349970633333330061e-02 +5.931003000000000247e-01 9.529422783333330038e-01 2.272385333333330065e-02 +6.004707000000000239e-01 9.087951714999999986e-01 2.229426183333330092e-02 +6.102765999999999469e-01 8.968441200000000224e-01 2.213925333333329956e-02 +6.217470000000000496e-01 8.116193323333330545e-01 2.157820200000000119e-02 +6.278818000000000454e-01 7.745292049999999984e-01 2.063141833333330052e-02 +6.410972000000000337e-01 7.304547335000000086e-01 1.926881999999999900e-02 +6.451074999999999449e-01 7.030634049999999746e-01 2.109099333333330079e-02 +6.654345000000000399e-01 6.451808323333330097e-01 1.843812350000000044e-02 +6.842517000000000182e-01 5.969281796666670026e-01 2.051784966666669874e-02 +7.056883000000000461e-01 4.875458616666670242e-01 1.721726566666669997e-02 +7.257436999999999916e-01 5.206052460000000215e-01 1.864389433333329960e-02 +7.489183000000000368e-01 4.716855048333329914e-01 1.534349166666670004e-02 +7.718749999999999778e-01 3.996116843333329949e-01 1.723059933333330115e-02 +7.919618000000000491e-01 3.949704010000000265e-01 1.521841983333330033e-02 +8.153685999999999989e-01 3.711572033333330189e-01 1.553813883333329988e-02 +8.363026999999999544e-01 3.373120053333329982e-01 1.476541233333330053e-02 +8.617884000000000100e-01 3.012111169999999727e-01 1.384248800000000001e-02 +8.844872000000000289e-01 3.093801609999999869e-01 1.462152149999999991e-02 +9.079890000000000461e-01 2.725293346666670113e-01 1.278188633333329945e-02 +9.332829999999999737e-01 2.562172424999999976e-01 1.375849099999999943e-02 +9.550178000000000278e-01 2.195073688333329942e-01 1.287299783333330054e-02 +9.811271999999999771e-01 1.993873673333330099e-01 1.203331399999999982e-02 +1.006633399999999900e+00 1.965978770000000042e-01 1.249421516666670076e-02 +1.030228200000000038e+00 1.888581198333330047e-01 1.187900783333330039e-02 +1.057601100000000072e+00 2.019180355000000093e-01 1.106158266666669963e-02 +1.084413199999999966e+00 1.710308969999999873e-01 1.133507299999999933e-02 +1.109710100000000033e+00 1.385269876666669897e-01 1.092970799999999978e-02 +1.137554500000000024e+00 1.323425321666669985e-01 1.049619949999999920e-02 +1.165834400000000048e+00 1.352444690000000060e-01 1.028587266666670073e-02 \ No newline at end of file diff --git a/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/5_75_1340_10.csv b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/5_75_1340_10.csv new file mode 100644 index 000000000..e4a5c8ff1 --- /dev/null +++ b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/5_75_1340_10.csv @@ -0,0 +1,105 @@ +3.623830000000000107e-02 1.262534512933330006e+02 1.649893105666669868e+01 +4.068399999999999794e-02 1.096408472683330046e+02 1.152156481833329948e+01 +4.509420000000000095e-02 6.843298548666669490e+01 8.484508865000000455e+00 +4.957310000000000189e-02 5.337196919333329959e+01 6.882409771666670117e+00 +5.414259999999999906e-02 4.824018401499999698e+01 5.433445991666670416e+00 +5.866699999999999693e-02 4.665372951666670076e+01 4.705492196666670068e+00 +6.312850000000000406e-02 5.221271013999999866e+01 3.917987768333329957e+00 +6.770890000000000242e-02 4.827582027833329903e+01 3.280544881666669799e+00 +7.236159999999999815e-02 3.618855914666669804e+01 2.837183351666670017e+00 +7.691330000000000389e-02 3.079150051333330040e+01 2.510836073333329921e+00 +8.163410000000000111e-02 3.296728457500000076e+01 2.143401925000000041e+00 +8.638339999999999907e-02 3.069841431000000043e+01 1.940150145000000048e+00 +9.105580000000000618e-02 2.710592771666669876e+01 1.703459686666670025e+00 +9.572469999999999590e-02 2.329590637833329936e+01 1.563327263333329942e+00 +1.004822999999999966e-01 2.091072460333329985e+01 1.376591528333330094e+00 +1.052260000000000001e-01 1.912562908333330114e+01 1.273402691666670083e+00 +1.099742999999999971e-01 1.787115249333330169e+01 1.146192773333329917e+00 +1.148272999999999933e-01 1.794118791666669921e+01 1.055988855000000060e+00 +1.197614000000000040e-01 1.653599519333329937e+01 9.723875616666669552e-01 +1.247536000000000062e-01 1.582743532666670028e+01 9.084356083333330334e-01 +1.298200999999999938e-01 1.478155951166669979e+01 8.152435350000000192e-01 +1.348902999999999908e-01 1.334408521333329922e+01 7.818770066666670404e-01 +1.399062000000000083e-01 1.377281605666670039e+01 7.205883533333330426e-01 +1.450545000000000029e-01 1.181691977333330001e+01 6.799812333333330461e-01 +1.502462999999999993e-01 1.213584320000000005e+01 6.572146300000000219e-01 +1.555860000000000021e-01 1.192358865166669979e+01 5.953690533333330093e-01 +1.572933999999999999e-01 1.181612013833330010e+01 1.889312700000000123e-01 +1.609261999999999915e-01 1.175466066000000076e+01 5.752044899999999572e-01 +1.661659000000000053e-01 1.042143580833329963e+01 5.392668716666669804e-01 +1.706808999999999965e-01 1.011778497999999971e+01 1.577585016666669948e-01 +1.715392000000000028e-01 9.758357795000000223e+00 5.081139666666669719e-01 +1.771040000000000114e-01 8.903400566666670457e+00 4.716962699999999731e-01 +1.827079000000000064e-01 9.178007346666669619e+00 4.546196783333329994e-01 +1.842987000000000097e-01 9.009516103333330861e+00 1.364224366666670074e-01 +1.882929000000000130e-01 8.406366826666669567e+00 4.368516150000000264e-01 +1.939542999999999962e-01 7.892936534999999587e+00 4.208100816666670019e-01 +1.983015999999999945e-01 7.968528981666669786e+00 1.178380566666669960e-01 +1.997403000000000095e-01 7.734987613333330181e+00 3.934730833333329736e-01 +2.055543999999999982e-01 7.979108915000000302e+00 3.863922049999999886e-01 +2.114380999999999899e-01 6.834691483333330098e+00 3.579354766666669740e-01 +2.120755000000000001e-01 7.473622876666669690e+00 1.084324933333330049e-01 +2.161621999999999988e-01 6.843431601666670083e+00 4.540542233333330069e-01 +2.260508999999999991e-01 6.624537448333329692e+00 9.508442500000000019e-02 +2.398570999999999898e-01 6.030806045000000282e+00 8.883706333333329930e-02 +2.537865999999999733e-01 5.548485336666669987e+00 8.121552666666670417e-02 +2.677086000000000188e-01 5.056279183333329819e+00 7.439664999999999473e-02 +2.818711999999999884e-01 4.746517688333329765e+00 6.929181333333329917e-02 +2.957293999999999756e-01 4.360488485000000303e+00 6.532353000000000465e-02 +3.099983000000000044e-01 4.042259101666670240e+00 5.956615500000000257e-02 +3.241628999999999761e-01 3.667612291666670021e+00 5.754424666666670130e-02 +3.389054000000000233e-01 3.392261260000000167e+00 5.132888666666669819e-02 +3.540212999999999832e-01 3.153369070000000107e+00 5.001504333333330055e-02 +3.688208000000000042e-01 2.957433689999999782e+00 4.622241666666670329e-02 +3.840975999999999835e-01 2.782086464999999897e+00 4.383930500000000202e-02 +3.990183999999999953e-01 2.497954614999999823e+00 4.216718166666669904e-02 +4.106379000000000001e-01 2.347253106833329994e+00 4.254085666666670290e-02 +4.137768000000000002e-01 2.313526113333329803e+00 3.995030166666670157e-02 +4.291927999999999854e-01 2.205677500000000180e+00 3.693004333333330114e-02 +4.295145000000000213e-01 2.125140473833329935e+00 3.583346700000000079e-02 +4.447362000000000259e-01 1.900926653333329996e+00 3.564656666666669860e-02 +4.466328999999999994e-01 1.939722618500000051e+00 3.202840516666669718e-02 +4.604721999999999982e-01 1.890633683333329929e+00 3.361991000000000285e-02 +4.685032000000000085e-01 1.753475375666670111e+00 3.146806816666670309e-02 +4.766304000000000096e-01 1.692544018333330014e+00 3.150160500000000197e-02 +4.833663999999999739e-01 1.571138671166669942e+00 2.967553150000000126e-02 +4.924697000000000102e-01 1.562743266666670072e+00 3.127265833333330025e-02 +5.046184000000000225e-01 1.517538195333330009e+00 2.762060549999999920e-02 +5.084248000000000101e-01 1.452519751666669912e+00 2.870172666666670133e-02 +5.230276000000000369e-01 1.280607860833330003e+00 2.579378549999999937e-02 +5.250753000000000226e-01 1.364635400000000054e+00 2.694985833333329861e-02 +5.418418000000000401e-01 1.180339848333330055e+00 2.622176999999999841e-02 +5.443529999999999758e-01 1.172893769833329936e+00 2.597214383333330129e-02 +5.584759999999999724e-01 1.116791568333330043e+00 2.550004666666669945e-02 +5.612129000000000145e-01 1.071752901666670033e+00 2.359418099999999879e-02 +5.755700000000000260e-01 1.003165499999999932e+00 2.343291166666670172e-02 +5.833568000000000087e-01 9.490407108333329678e-01 2.324037416666669895e-02 +5.929195000000000437e-01 9.286979850000000036e-01 2.255620333333329883e-02 +6.005226999999999649e-01 8.938147573333330431e-01 2.214501316666669939e-02 +6.100906000000000384e-01 8.779068549999999860e-01 2.199904499999999832e-02 +6.218008000000000424e-01 8.078191183333329750e-01 2.148254866666670163e-02 +6.276903999999999817e-01 7.890844949999999969e-01 2.066168499999999908e-02 +6.411527999999999672e-01 6.990414535000000207e-01 1.907308200000000162e-02 +6.449108999999999536e-01 7.027759316666669642e-01 2.104888333333329933e-02 +6.654921999999999782e-01 6.693195063333330364e-01 1.846815400000000051e-02 +6.843110000000000026e-01 5.654079498333329790e-01 2.030432683333329921e-02 +7.057493999999999712e-01 4.733216641666669888e-01 1.710506283333329894e-02 +7.258065000000000211e-01 4.881572298333329840e-01 1.844279849999999957e-02 +7.489831000000000127e-01 4.439720878333329734e-01 1.519038399999999948e-02 +7.719418000000000113e-01 4.063687451666669892e-01 1.720554133333329974e-02 +7.920304000000000233e-01 4.025809184999999957e-01 1.519988700000000047e-02 +8.154392000000000307e-01 3.522328571666670238e-01 1.541253149999999988e-02 +8.363751000000000380e-01 3.005755748333330257e-01 1.457862766666669953e-02 +8.618630000000000457e-01 2.801856756666670223e-01 1.372444566666669932e-02 +8.845638000000000112e-01 3.046253318333330129e-01 1.455751649999999925e-02 +9.080675999999999748e-01 2.540008221666669730e-01 1.267830250000000041e-02 +9.333637999999999657e-01 2.481020686666670083e-01 1.368678783333330054e-02 +9.551005000000000189e-01 1.938199579999999866e-01 1.274076333333330063e-02 +9.812121999999999788e-01 1.905731619999999904e-01 1.196892649999999926e-02 +1.006720599999999965e+00 1.784818836666670072e-01 1.239337400000000040e-02 +1.030317399999999939e+00 1.750911911666669929e-01 1.179671083333330012e-02 +1.057692700000000041e+00 1.705610396666669970e-01 1.092493383333329945e-02 +1.084507099999999946e+00 1.719191243333330066e-01 1.130716749999999965e-02 +1.109806099999999907e+00 1.366376699999999889e-01 1.089438483333329995e-02 +1.137653000000000025e+00 1.239800338333330032e-01 1.044124700000000072e-02 +1.165935399999999955e+00 1.310211675000000076e-01 1.024458533333330069e-02 \ No newline at end of file diff --git a/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/6_100_1340_10.csv b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/6_100_1340_10.csv new file mode 100644 index 000000000..2b03b80a5 --- /dev/null +++ b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/6_100_1340_10.csv @@ -0,0 +1,105 @@ +3.625239999999999713e-02 1.213206534416670053e+02 1.651067908166670151e+01 +4.070000000000000007e-02 8.158564289333330066e+01 1.146150313666669973e+01 +4.511180000000000051e-02 6.728303165833330013e+01 8.493610868333329122e+00 +4.959249999999999770e-02 5.609321657833329766e+01 6.902234358333330100e+00 +5.416379999999999806e-02 4.208391674666670212e+01 5.417946521666669568e+00 +5.868999999999999911e-02 4.572918046833329697e+01 4.708583066666670369e+00 +6.315320000000000655e-02 4.506950746166670285e+01 3.890110903333329873e+00 +6.773540000000000116e-02 3.932771859999999720e+01 3.240109296666669803e+00 +7.238989999999999314e-02 3.425092975666670014e+01 2.830867521666669884e+00 +7.694339999999999513e-02 2.785716006499999864e+01 2.497106951666669961e+00 +8.166600000000000248e-02 2.647316349333329910e+01 2.106834523333330100e+00 +8.641719999999999957e-02 2.865549820000000025e+01 1.929370503333329934e+00 +9.109140000000000292e-02 2.617781355833329826e+01 1.699746431666669944e+00 +9.576210000000000278e-02 2.262414874833330103e+01 1.560889624999999947e+00 +1.005216000000000026e-01 2.072404344833330114e+01 1.377539340000000001e+00 +1.052672000000000052e-01 1.924028949499999896e+01 1.276625569999999987e+00 +1.100174000000000013e-01 1.836748323999999855e+01 1.152518286666670111e+00 +1.148721999999999938e-01 1.699007782666669897e+01 1.049408108333329981e+00 +1.198083000000000065e-01 1.493712180833330017e+01 9.595881783333329862e-01 +1.248023999999999939e-01 1.484142020166670051e+01 9.009069050000000356e-01 +1.298709000000000113e-01 1.473895257666669956e+01 8.163899350000000110e-01 +1.349431000000000103e-01 1.308340819666669930e+01 7.807371766666669766e-01 +1.399610000000000021e-01 1.350568340499999920e+01 7.192249033333329988e-01 +1.451112999999999986e-01 1.173611615333330072e+01 6.804578466666669767e-01 +1.503050999999999970e-01 1.154060497666669960e+01 6.523238550000000080e-01 +1.556469000000000047e-01 1.191625231333330071e+01 5.964806683333330195e-01 +1.573344999999999883e-01 1.139197852166670089e+01 1.879402166666669927e-01 +1.609891999999999990e-01 1.125507998666670062e+01 5.708663616666670437e-01 +1.662309999999999899e-01 1.041113468166670053e+01 5.402433599999999503e-01 +1.707255000000000023e-01 1.013307594333329931e+01 1.580824633333330065e-01 +1.716062999999999894e-01 9.500610554999999735e+00 5.062648633333329817e-01 +1.771733000000000058e-01 8.706795813333329193e+00 4.704599616666669815e-01 +1.827794000000000085e-01 9.156035623333330875e+00 4.553047450000000107e-01 +1.843469000000000080e-01 9.118870355000000316e+00 1.370399833333330042e-01 +1.883665999999999952e-01 7.952454938333329615e+00 4.325042000000000053e-01 +1.940302000000000138e-01 8.034647969999999972e+00 4.232443883333329993e-01 +1.983534999999999882e-01 8.119139649999999264e+00 1.185909816666669975e-01 +1.998185000000000100e-01 7.527596430000000005e+00 3.919050766666670182e-01 +2.056348000000000065e-01 7.553855535000000287e+00 3.822255366666669762e-01 +2.115208000000000088e-01 6.617426820000000376e+00 3.561540533333329983e-01 +2.121309999999999862e-01 7.390867828333330003e+00 1.083323783333329932e-01 +2.162467999999999890e-01 6.635593964999999983e+00 4.517541333333329745e-01 +2.261101000000000083e-01 6.488236141666670065e+00 9.474941333333329607e-02 +2.399198999999999915e-01 5.939089416666670118e+00 8.864513000000000253e-02 +2.538528999999999924e-01 5.445706584999999933e+00 8.096326333333329905e-02 +2.677785999999999778e-01 5.020975218333330048e+00 7.440106833333330616e-02 +2.819448999999999983e-01 4.782109235000000069e+00 6.958310166666670238e-02 +2.958067999999999809e-01 4.377367741666669865e+00 6.553075166666670615e-02 +3.100794000000000050e-01 4.070373518333330054e+00 5.980910666666670178e-02 +3.242476000000000247e-01 3.688249826666670117e+00 5.775312500000000238e-02 +3.389940000000000175e-01 3.411490240000000007e+00 5.151532000000000333e-02 +3.541138999999999815e-01 3.221007965000000084e+00 5.041618500000000225e-02 +3.689172000000000007e-01 2.942401639999999929e+00 4.624927499999999941e-02 +3.841980999999999868e-01 2.767105533333329870e+00 4.386071833333329839e-02 +3.991226999999999969e-01 2.564823933333329808e+00 4.256582833333329846e-02 +4.106734000000000218e-01 2.300881685499999829e+00 4.238948299999999864e-02 +4.138850000000000029e-01 2.413576710000000070e+00 4.049426666666670199e-02 +4.293050999999999950e-01 2.233726248333329778e+00 3.713503166666669991e-02 +4.295516999999999808e-01 2.156876818999999834e+00 3.601888033333330158e-02 +4.448524999999999840e-01 1.902652508333330106e+00 3.572283666666670188e-02 +4.466716000000000020e-01 1.934442038833330102e+00 3.205653166666670023e-02 +4.605926000000000187e-01 1.874115690000000001e+00 3.360869833333329781e-02 +4.685437000000000074e-01 1.737730488500000003e+00 3.144913299999999717e-02 +4.767550999999999872e-01 1.772107871666670054e+00 3.193823833333329920e-02 +4.834083000000000130e-01 1.581873448666669901e+00 2.976716433333330067e-02 +4.925984999999999947e-01 1.570737606666670061e+00 3.137136000000000091e-02 +5.046621000000000024e-01 1.492830698499999942e+00 2.756047650000000016e-02 +5.085577999999999488e-01 1.485373084999999982e+00 2.891283166666670096e-02 +5.230728999999999518e-01 1.159546245333330061e+00 2.533816566666670031e-02 +5.252126000000000294e-01 1.354185358333330091e+00 2.695080999999999866e-02 +5.419834999999999514e-01 1.186315898333329955e+00 2.629908666666670031e-02 +5.444001000000000534e-01 1.201936935333330014e+00 2.613158683333329999e-02 +5.586221000000000103e-01 1.109243371666670086e+00 2.550917499999999852e-02 +5.612614999999999688e-01 1.098874749833330000e+00 2.373973216666670077e-02 +5.757206000000000268e-01 1.029040688333330067e+00 2.359920000000000073e-02 +5.834072999999999620e-01 9.811238644999999980e-01 2.340685516666669852e-02 +5.930746000000000073e-01 9.534806916666670462e-01 2.272023833333329870e-02 +6.005747000000000169e-01 8.956047156666669951e-01 2.218217800000000031e-02 +6.102501999999999649e-01 8.805252883333329894e-01 2.205115333333329888e-02 +6.218546000000000351e-01 8.076579554999999688e-01 2.150926133333330020e-02 +6.278546000000000404e-01 8.143317416666669972e-01 2.081983000000000097e-02 +6.412082999999999533e-01 7.185076576666670212e-01 1.917512450000000146e-02 +6.450795999999999752e-01 7.187583950000000499e-01 2.116659499999999985e-02 +6.655497999999999692e-01 6.417931828333329758e-01 1.838261283333330123e-02 +6.843702000000000396e-01 5.677104609999999996e-01 2.033867249999999835e-02 +7.058105999999999547e-01 5.146355146666670155e-01 1.728668516666670082e-02 +7.258693999999999980e-01 5.183306771666670310e-01 1.859332783333330144e-02 +7.490480000000000471e-01 4.413184218333329745e-01 1.519721516666669957e-02 +7.720086999999999922e-01 4.069291728333330194e-01 1.722663266666669968e-02 +7.920989999999999975e-01 3.912903401666669723e-01 1.517220816666670080e-02 +8.155097999999999514e-01 3.620392363333330144e-01 1.546880433333329939e-02 +8.364475000000000104e-01 3.218374210000000124e-01 1.467598383333330002e-02 +8.619377000000000288e-01 2.793489951666670024e-01 1.373524349999999915e-02 +8.846403999999999934e-01 2.729738648333330242e-01 1.444214883333330007e-02 +9.081462000000000145e-01 2.731246803333329809e-01 1.275928200000000026e-02 +9.334447000000000161e-01 2.513956430000000020e-01 1.371339566666670076e-02 +9.551832000000000100e-01 2.075616728333329886e-01 1.280443116666669934e-02 +9.812971999999999806e-01 2.026315226666670077e-01 1.202260966666669935e-02 +1.006807800000000030e+00 1.715856353333329865e-01 1.237966916666670067e-02 +1.030406600000000061e+00 1.813217336666670121e-01 1.183022066666669994e-02 +1.057784300000000011e+00 1.874246033333329953e-01 1.099227083333330010e-02 +1.084600999999999926e+00 1.682342156666669919e-01 1.130467983333329970e-02 +1.109902299999999897e+00 1.305937931666669993e-01 1.088363799999999930e-02 +1.137751600000000085e+00 1.264251891666670069e-01 1.045857849999999936e-02 +1.166036300000000026e+00 1.206125236666669986e-01 1.021913349999999977e-02 \ No newline at end of file diff --git a/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/7_200_1340_10.csv b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/7_200_1340_10.csv new file mode 100644 index 000000000..e8e9c9a0b --- /dev/null +++ b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/7_200_1340_10.csv @@ -0,0 +1,105 @@ +3.625239999999999713e-02 8.265676436333329491e+01 1.638320715333329858e+01 +4.070000000000000007e-02 5.464383480166669926e+01 1.136626790833330070e+01 +4.511180000000000051e-02 2.996549328500000087e+01 8.362137733333330658e+00 +4.959249999999999770e-02 3.902000664833330035e+01 6.829579628333330099e+00 +5.416379999999999806e-02 2.960868386499999971e+01 5.359635035000000158e+00 +5.868999999999999911e-02 2.775202533166670094e+01 4.620562245000000345e+00 +6.315320000000000655e-02 2.923420741833329828e+01 3.806268636666669813e+00 +6.773540000000000116e-02 2.925570898666670061e+01 3.181662941666670186e+00 +7.238989999999999314e-02 2.438109743166669929e+01 2.769415394999999780e+00 +7.694339999999999513e-02 2.082174377999999848e+01 2.449056793333329818e+00 +8.166600000000000248e-02 2.093264007666670068e+01 2.067833788333329981e+00 +8.641719999999999957e-02 2.065156679166669917e+01 1.869354308333329939e+00 +9.109140000000000292e-02 2.096371475999999845e+01 1.658336066666669995e+00 +9.576210000000000278e-02 1.686565956500000141e+01 1.512923419999999908e+00 +1.005216000000000026e-01 1.674424940666670025e+01 1.343149441666670052e+00 +1.052672000000000052e-01 1.453594207833329932e+01 1.233355748333329949e+00 +1.100174000000000013e-01 1.743436942499999986e+01 1.141890178333329953e+00 +1.148721999999999938e-01 1.514907325499999935e+01 1.030380964999999982e+00 +1.198083000000000065e-01 1.335097668833330076e+01 9.427780516666669497e-01 +1.248023999999999939e-01 1.334016233833330034e+01 8.846290449999999472e-01 +1.298709000000000113e-01 1.370878951499999943e+01 8.044898483333330352e-01 +1.349431000000000103e-01 1.169732300833329930e+01 7.648545733333329544e-01 +1.399610000000000021e-01 1.178831958166670013e+01 6.994071549999999471e-01 +1.451112999999999986e-01 1.065116290166669977e+01 6.676857533333330208e-01 +1.503050999999999970e-01 9.325193926666669242e+00 6.273500633333329857e-01 +1.556469000000000047e-01 1.029459589333329994e+01 5.781039766666670188e-01 +1.572456999999999883e-01 1.000640059000000015e+01 1.830944850000000013e-01 +1.609891999999999990e-01 1.045812633999999974e+01 5.605480683333330383e-01 +1.662309999999999899e-01 9.379805284999999770e+00 5.273011283333329802e-01 +1.706292000000000086e-01 9.152038171666669442e+00 1.545153300000000063e-01 +1.716062999999999894e-01 9.072271783333329509e+00 5.002084749999999858e-01 +1.771733000000000058e-01 8.299759079999999400e+00 4.647556766666670058e-01 +1.827794000000000085e-01 8.918414625000000484e+00 4.514085349999999996e-01 +1.842428999999999872e-01 8.303275895000000517e+00 1.338776349999999948e-01 +1.883665999999999952e-01 8.087114149999999668e+00 4.329608600000000029e-01 +1.940302000000000138e-01 6.940626968333329927e+00 4.097805333333329747e-01 +1.982414999999999872e-01 7.399220633333330355e+00 1.156899150000000043e-01 +1.998185000000000100e-01 7.671813116666670318e+00 3.925434549999999856e-01 +2.056348000000000065e-01 7.058416683333329722e+00 3.753756766666669908e-01 +2.115208000000000088e-01 6.186979153333330039e+00 3.502447450000000240e-01 +2.120113000000000136e-01 6.509825833333329648e+00 1.046767516666669978e-01 +2.162467999999999890e-01 6.237968744999999871e+00 4.443455150000000242e-01 +2.259823999999999999e-01 6.054194650000000344e+00 9.278840666666669790e-02 +2.397845000000000115e-01 5.564811654999999746e+00 8.685724833333340056e-02 +2.537096999999999825e-01 5.167096618333330227e+00 7.958348833333329930e-02 +2.676275000000000182e-01 4.857346653333330266e+00 7.348198000000000230e-02 +2.817857999999999752e-01 4.540460176666670122e+00 6.833893833333329337e-02 +2.956398000000000081e-01 4.237780543333330208e+00 6.471250666666669704e-02 +3.099044000000000243e-01 3.935048769999999863e+00 5.903304000000000190e-02 +3.240645999999999805e-01 3.478254921666669830e+00 5.662396666666669881e-02 +3.388027000000000122e-01 3.303115776666670111e+00 5.088800999999999741e-02 +3.539140000000000064e-01 3.111107356666670043e+00 4.976782999999999901e-02 +3.687090000000000090e-01 2.860701315000000022e+00 4.573441000000000312e-02 +3.839813000000000254e-01 2.699693565000000017e+00 4.341666500000000012e-02 +3.988975000000000160e-01 2.495346641666670084e+00 4.210437499999999944e-02 +4.106734000000000218e-01 2.304978501333330154e+00 4.227540733333329942e-02 +4.136514000000000024e-01 2.281161938333330141e+00 3.975256666666669714e-02 +4.290628000000000219e-01 2.190969609999999790e+00 3.681797500000000278e-02 +4.295516999999999808e-01 2.110397390999999789e+00 3.571657216666670326e-02 +4.446014999999999828e-01 1.879588453333330023e+00 3.550642500000000118e-02 +4.466716000000000020e-01 1.816268564666670082e+00 3.148649049999999866e-02 +4.603325999999999807e-01 1.793649588333330103e+00 3.313105499999999953e-02 +4.685437000000000074e-01 1.770170460833329962e+00 3.148902633333330175e-02 +4.764860000000000206e-01 1.682140176666669928e+00 3.141608500000000331e-02 +4.834083000000000130e-01 1.536765404999999918e+00 2.947832866666669910e-02 +4.923204999999999942e-01 1.511959243333329983e+00 3.099057499999999937e-02 +5.046621000000000024e-01 1.465441131499999994e+00 2.736933133333329868e-02 +5.082708000000000226e-01 1.365583310000000106e+00 2.825172333333330135e-02 +5.230728999999999518e-01 1.154780808166669948e+00 2.524863800000000033e-02 +5.249162000000000550e-01 1.329800611666670074e+00 2.675280666666670151e-02 +5.416775999999999813e-01 1.188958583333330044e+00 2.623523499999999911e-02 +5.444001000000000534e-01 1.154485974333330001e+00 2.585743066666670170e-02 +5.583067999999999920e-01 1.077189841666670089e+00 2.527868166666669830e-02 +5.612614999999999688e-01 1.051792144833330056e+00 2.347724083333330158e-02 +5.753956999999999544e-01 1.014095294999999952e+00 2.346036166666670003e-02 +5.834072999999999620e-01 9.588631039999999661e-01 2.325032483333330097e-02 +5.927398999999999862e-01 9.388917833333330076e-01 2.258296499999999998e-02 +6.005747000000000169e-01 8.756694673333329515e-01 2.203778849999999886e-02 +6.099058000000000535e-01 8.473022983333330371e-01 2.182166666666670099e-02 +6.218546000000000351e-01 7.881510335000000422e-01 2.137202599999999883e-02 +6.275003000000000108e-01 7.785123416666670515e-01 2.058900166666670015e-02 +6.412082999999999533e-01 7.088910750000000371e-01 1.908878433333329946e-02 +6.447154999999999969e-01 6.898300916666669780e-01 2.096122833333330035e-02 +6.655497999999999692e-01 6.325061706666670336e-01 1.830133016666669887e-02 +6.843702000000000396e-01 5.535274884999999978e-01 2.022582083333330019e-02 +7.058105999999999547e-01 4.772884753333330177e-01 1.710068249999999873e-02 +7.258693999999999980e-01 4.794482545000000040e-01 1.838371499999999839e-02 +7.490480000000000471e-01 4.303608649999999813e-01 1.512209783333329921e-02 +7.720086999999999922e-01 3.958678310000000033e-01 1.713988450000000080e-02 +7.920989999999999975e-01 3.804415833333329999e-01 1.509590366666670007e-02 +8.155097999999999514e-01 3.391658666666669819e-01 1.534219399999999997e-02 +8.364475000000000104e-01 2.920511656666670008e-01 1.453006433333330072e-02 +8.619377000000000288e-01 2.768105268333330149e-01 1.369777266666669970e-02 +8.846403999999999934e-01 2.773741731666670152e-01 1.443021766666669967e-02 +9.081462000000000145e-01 2.284839270000000033e-01 1.257401600000000036e-02 +9.334447000000000161e-01 2.262680790000000108e-01 1.358766933333330033e-02 +9.551832000000000100e-01 2.014745451666669906e-01 1.275664699999999943e-02 +9.812971999999999806e-01 1.828399243333329871e-01 1.193000216666669985e-02 +1.006807800000000030e+00 1.768480391666669982e-01 1.237525766666669989e-02 +1.030406600000000061e+00 1.607457411666670111e-01 1.173357283333329934e-02 +1.057784300000000011e+00 1.603443938333329877e-01 1.087976483333330004e-02 +1.084600999999999926e+00 1.672401265000000026e-01 1.127955949999999950e-02 +1.109902299999999897e+00 1.308651896666669923e-01 1.086452716666670010e-02 +1.137751600000000085e+00 1.208445169999999985e-01 1.042120399999999988e-02 +1.166036300000000026e+00 1.219414448333329959e-01 1.020481383333330001e-02 \ No newline at end of file diff --git a/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/8_300_1340_10.csv b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/8_300_1340_10.csv new file mode 100644 index 000000000..c576fb9ba --- /dev/null +++ b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/8_300_1340_10.csv @@ -0,0 +1,105 @@ +3.625710000000000044e-02 7.586499487000000386e+01 1.637401323166670153e+01 +4.070529999999999982e-02 4.481643682666670259e+01 1.134473448500000003e+01 +4.511769999999999670e-02 3.187475403666670104e+01 8.372120233333330219e+00 +4.959899999999999726e-02 2.997679580000000144e+01 6.801308398333329563e+00 +5.417079999999999812e-02 2.394855565499999983e+01 5.340431286666669664e+00 +5.869760000000000255e-02 2.142582576833330066e+01 4.594792676666670239e+00 +6.316149999999999542e-02 3.089957102166669856e+01 3.816311058333329953e+00 +6.774429999999999341e-02 2.654007947166670078e+01 3.169185818333330129e+00 +7.239929999999999977e-02 1.943375908333329960e+01 2.742530958333329938e+00 +7.695340000000000513e-02 1.976728253666669843e+01 2.443851029999999813e+00 +8.167670000000000485e-02 1.925900297000000094e+01 2.058348746666669893e+00 +8.642850000000000532e-02 1.891829230833329945e+01 1.858069830000000033e+00 +9.110319999999999530e-02 1.827805419833330092e+01 1.639507476666669961e+00 +9.577460000000000140e-02 1.569160155166670023e+01 1.504524439999999963e+00 +1.005346000000000017e-01 1.326347007166669911e+01 1.315847523333329994e+00 +1.052808999999999967e-01 1.528716061000000082e+01 1.240626203333329958e+00 +1.100316999999999962e-01 1.357029930000000029e+01 1.108701733333329997e+00 +1.148871000000000059e-01 1.268526336333330029e+01 1.008324261666670107e+00 +1.198237999999999942e-01 1.157206131499999913e+01 9.266636050000000013e-01 +1.248187000000000046e-01 1.139260776499999928e+01 8.664271866666669597e-01 +1.298877999999999977e-01 1.288652256499999993e+01 7.969746983333330093e-01 +1.349605999999999861e-01 1.079102049499999971e+01 7.560191466666670301e-01 +1.399791999999999981e-01 1.105679143000000053e+01 6.920319183333329960e-01 +1.451301000000000119e-01 1.044385611833330074e+01 6.659680816666669889e-01 +1.503246000000000027e-01 9.389620521666669717e+00 6.284466633333329888e-01 +1.556671000000000027e-01 9.365269319999999453e+00 5.685768949999999711e-01 +1.572933999999999999e-01 9.202126339999999516e+00 1.807199866666669985e-01 +1.610100999999999893e-01 9.725111731666670423e+00 5.526473100000000027e-01 +1.662526000000000004e-01 8.453553321666669618e+00 5.170390433333329483e-01 +1.706808999999999965e-01 8.508661829999999426e+00 1.525917300000000087e-01 +1.716285999999999923e-01 8.248625778333330771e+00 4.912094450000000223e-01 +1.771963000000000010e-01 7.860151886666669974e+00 4.601271083333329792e-01 +1.828030999999999962e-01 8.179063558333330874e+00 4.431557566666670112e-01 +1.842987000000000097e-01 7.789301021666670266e+00 1.322509683333329966e-01 +1.883911000000000058e-01 7.284922560000000047e+00 4.239183200000000151e-01 +1.940553999999999890e-01 6.860865920000000173e+00 4.091373166666669725e-01 +1.983015999999999945e-01 6.984366938333329777e+00 1.143283233333329957e-01 +1.998445000000000082e-01 7.321059296666669880e+00 3.888106266666669919e-01 +2.056614999999999971e-01 6.516638536666669701e+00 3.691254600000000163e-01 +2.115482999999999947e-01 5.813378858333329902e+00 3.460794933333329881e-01 +2.120755000000000001e-01 6.410695145000000039e+00 1.044179233333329959e-01 +2.162748999999999922e-01 6.046752721666670105e+00 4.416217800000000193e-01 +2.260508999999999991e-01 5.970100884999999913e+00 9.257100833333330170e-02 +2.398570999999999898e-01 5.328183368333330172e+00 8.599138666666669706e-02 +2.537865999999999733e-01 5.025059630000000332e+00 7.909936500000000481e-02 +2.677086000000000188e-01 4.638679231666669622e+00 7.265197833333329747e-02 +2.818711999999999884e-01 4.320586221666670390e+00 6.748263000000000178e-02 +2.957293999999999756e-01 4.003143766666670267e+00 6.376038000000000538e-02 +3.099983000000000044e-01 3.820362695000000031e+00 5.861029000000000239e-02 +3.241628999999999761e-01 3.476478435000000200e+00 5.668581000000000314e-02 +3.389054000000000233e-01 3.203212216666670109e+00 5.052067666666670148e-02 +3.540212999999999832e-01 3.082675891666669887e+00 4.970334166666669912e-02 +3.688208000000000042e-01 2.852994409999999981e+00 4.575685000000000169e-02 +3.840975999999999835e-01 2.619206445000000105e+00 4.310591500000000159e-02 +3.990183999999999953e-01 2.447015261666670050e+00 4.192961333333330293e-02 +4.106022999999999756e-01 2.250148667666670210e+00 4.208387400000000028e-02 +4.137768000000000002e-01 2.199470903333330174e+00 3.941821333333329902e-02 +4.291927999999999854e-01 2.152990283333330090e+00 3.668624166666670239e-02 +4.294773000000000063e-01 2.066339865166670009e+00 3.559078633333329772e-02 +4.447362000000000259e-01 1.856158275000000080e+00 3.543832166666670280e-02 +4.465942999999999996e-01 1.863514126000000104e+00 3.172593550000000345e-02 +4.604721999999999982e-01 1.785743791666670077e+00 3.313367500000000132e-02 +4.684626000000000068e-01 1.701883971166670007e+00 3.125393900000000141e-02 +4.766304000000000096e-01 1.673134868333330028e+00 3.141082333333330284e-02 +4.833245999999999931e-01 1.561424375333329895e+00 2.963426116666669982e-02 +4.924697000000000102e-01 1.528741043333329941e+00 3.110879000000000075e-02 +5.045747000000000426e-01 1.440318964999999896e+00 2.730927600000000038e-02 +5.084248000000000101e-01 1.414442154999999923e+00 2.852017166666670142e-02 +5.229823000000000111e-01 1.195010044500000035e+00 2.544837383333330150e-02 +5.250753000000000226e-01 1.305492214999999900e+00 2.666661666666670163e-02 +5.418418000000000401e-01 1.152673440000000049e+00 2.608773333333330030e-02 +5.443057999999999508e-01 1.145610492499999911e+00 2.585580999999999990e-02 +5.584759999999999724e-01 1.067225758333329999e+00 2.525753999999999846e-02 +5.611642999999999493e-01 1.067666433166670092e+00 2.357715833333329930e-02 +5.755700000000000260e-01 1.029394661666670041e+00 2.355942499999999842e-02 +5.833063000000000553e-01 9.377488744999999959e-01 2.319254466666669998e-02 +5.929195000000000437e-01 9.657185166666669707e-01 2.274125999999999925e-02 +6.004707000000000239e-01 8.602252591666670334e-01 2.200228683333330104e-02 +6.100906000000000384e-01 8.435776883333330201e-01 2.182633499999999879e-02 +6.217470000000000496e-01 7.760975660000000165e-01 2.134885499999999992e-02 +6.276903999999999817e-01 7.741666183333330009e-01 2.058969000000000077e-02 +6.410972000000000337e-01 7.019246166666669451e-01 1.908517183333329967e-02 +6.449108999999999536e-01 6.851353900000000108e-01 2.095862666666669857e-02 +6.654345000000000399e-01 5.961630181666669470e-01 1.818150283333330036e-02 +6.842517000000000182e-01 5.507593983333329835e-01 2.023759049999999948e-02 +7.056883000000000461e-01 4.903288296666670210e-01 1.717216466666670119e-02 +7.257436999999999916e-01 4.865799499999999833e-01 1.843612033333329875e-02 +7.489183000000000368e-01 4.252237993333329857e-01 1.512044316666670031e-02 +7.718749999999999778e-01 3.910920323333330062e-01 1.713838283333329882e-02 +7.919618000000000491e-01 3.921714671666670093e-01 1.515910683333330025e-02 +8.153685999999999989e-01 3.357406613333330236e-01 1.534501599999999952e-02 +8.363026999999999544e-01 3.075498956666670169e-01 1.460560383333329992e-02 +8.617884000000000100e-01 2.857851470000000171e-01 1.374501849999999921e-02 +8.844872000000000289e-01 2.740424961666669823e-01 1.443190633333329975e-02 +9.079890000000000461e-01 2.574230581666669959e-01 1.269050000000000039e-02 +9.332829999999999737e-01 2.258197691666669893e-01 1.359980449999999980e-02 +9.550178000000000278e-01 1.934376846666669980e-01 1.273933533333329940e-02 +9.811271999999999771e-01 1.665732448333329951e-01 1.188447333333329976e-02 +1.006633399999999900e+00 1.640185443333329884e-01 1.234030849999999922e-02 +1.030228200000000038e+00 1.357939996666669979e-01 1.165456533333330061e-02 +1.057601100000000072e+00 1.607766528333330058e-01 1.089187166666670016e-02 +1.084413199999999966e+00 1.505459054999999935e-01 1.123158833333329915e-02 +1.109710100000000033e+00 1.282342724999999961e-01 1.086581349999999994e-02 +1.137554500000000024e+00 1.161345933333329944e-01 1.041549200000000015e-02 +1.165834400000000048e+00 1.239725849999999963e-01 1.022116500000000081e-02 \ No newline at end of file diff --git a/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/9_600_1340_10.csv b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/9_600_1340_10.csv new file mode 100644 index 000000000..c869ca7de --- /dev/null +++ b/test/mumag/FeNiB_perpendicular_Bersweiler_et_al/9_600_1340_10.csv @@ -0,0 +1,105 @@ +3.625239999999999713e-02 5.114892415500000311e+01 1.631213251166670020e+01 +4.070000000000000007e-02 4.576787608166669941e+01 1.134772132833330005e+01 +4.511180000000000051e-02 4.331816215999999997e+01 8.407984515000000769e+00 +4.959249999999999770e-02 2.519454865000000154e+01 6.784784965000000057e+00 +5.416379999999999806e-02 1.407789967999999980e+01 5.302135776666670353e+00 +5.868999999999999911e-02 1.337527417166669963e+01 4.558895663333330184e+00 +6.315320000000000655e-02 2.088227957833329995e+01 3.767553325000000175e+00 +6.773540000000000116e-02 2.352067832833330030e+01 3.153463791666669902e+00 +7.238989999999999314e-02 1.459065788833330046e+01 2.714546644999999980e+00 +7.694339999999999513e-02 1.643097480333329941e+01 2.423213508333330157e+00 +8.166600000000000248e-02 1.564276924666670077e+01 2.035339249999999822e+00 +8.641719999999999957e-02 1.609254856500000130e+01 1.837833853333330048e+00 +9.109140000000000292e-02 1.279946007166670086e+01 1.598433549999999981e+00 +9.576210000000000278e-02 1.168004799999999932e+01 1.472505774999999906e+00 +1.005216000000000026e-01 1.239115217500000021e+01 1.308776653333330042e+00 +1.052672000000000052e-01 1.104442360666669920e+01 1.203200884999999998e+00 +1.100174000000000013e-01 1.264824788499999997e+01 1.100505863333330003e+00 +1.148721999999999938e-01 1.068150069333329988e+01 9.895295950000000396e-01 +1.198083000000000065e-01 1.062919121333329997e+01 9.177280949999999660e-01 +1.248023999999999939e-01 8.480228023333330256e+00 8.376397483333329896e-01 +1.298709000000000113e-01 1.054387282333330056e+01 7.736622133333329598e-01 +1.349431000000000103e-01 8.823326103333329229e+00 7.353996000000000421e-01 +1.399610000000000021e-01 9.107303678333330765e+00 6.707318450000000487e-01 +1.451112999999999986e-01 7.568946575000000010e+00 6.354211899999999691e-01 +1.503050999999999970e-01 7.486937655000000191e+00 6.076642716666670330e-01 +1.556469000000000047e-01 8.316071640000000542e+00 5.572019216666670438e-01 +1.572933999999999999e-01 8.082806423333330770e+00 1.772221983333329975e-01 +1.609891999999999990e-01 8.406204656666670161e+00 5.374420016666670019e-01 +1.662309999999999899e-01 7.305961626666669595e+00 5.035922400000000243e-01 +1.706808999999999965e-01 7.409980823333330413e+00 1.490785450000000067e-01 +1.716062999999999894e-01 7.126663556666669841e+00 4.782201200000000263e-01 +1.771733000000000058e-01 6.104670323333330373e+00 4.398585833333329975e-01 +1.827794000000000085e-01 6.314649313333330127e+00 4.207942599999999755e-01 +1.842987000000000097e-01 6.985669296666669581e+00 1.295300000000000062e-01 +1.883665999999999952e-01 7.196837438333330006e+00 4.229003000000000068e-01 +1.940302000000000138e-01 5.456149725000000394e+00 3.926154199999999928e-01 +1.983015999999999945e-01 6.101519538333329606e+00 1.111746183333330029e-01 +1.998185000000000100e-01 6.715507050000000255e+00 3.818104066666669905e-01 +2.056348000000000065e-01 5.954089436666669677e+00 3.622545733333329965e-01 +2.115208000000000088e-01 5.823000606666670187e+00 3.462099583333330122e-01 +2.120755000000000001e-01 5.689073146666670411e+00 1.016859966666670001e-01 +2.162467999999999890e-01 5.274567024999999632e+00 4.291691899999999782e-01 +2.260508999999999991e-01 5.306054011666669901e+00 9.002336499999999408e-02 +2.398570999999999898e-01 4.872989734999999989e+00 8.416759833333330165e-02 +2.537865999999999733e-01 4.590923198333330291e+00 7.736351666666670124e-02 +2.677086000000000188e-01 4.288802803333330083e+00 7.121471833333330170e-02 +2.818711999999999884e-01 4.093612151666669696e+00 6.655526166666669852e-02 +2.957293999999999756e-01 3.790488160000000217e+00 6.286535166666669394e-02 +3.099983000000000044e-01 3.646502630000000078e+00 5.789795166666669712e-02 +3.241628999999999761e-01 3.269809508333330061e+00 5.578990999999999811e-02 +3.389054000000000233e-01 3.057003066666669877e+00 4.992672166666670130e-02 +3.540212999999999832e-01 3.010102380000000188e+00 4.942106333333329965e-02 +3.688208000000000042e-01 2.669906414999999811e+00 4.496581333333329877e-02 +3.840975999999999835e-01 2.619258584999999862e+00 4.314465499999999704e-02 +3.990183999999999953e-01 2.335828473333330102e+00 4.143680999999999753e-02 +4.106379000000000001e-01 2.148179208166669962e+00 4.160297799999999879e-02 +4.137768000000000002e-01 2.129094906666670006e+00 3.911823833333329808e-02 +4.291927999999999854e-01 2.070782439999999891e+00 3.633175833333329718e-02 +4.295145000000000213e-01 2.006558257333329820e+00 3.534480766666669993e-02 +4.447362000000000259e-01 1.796411879999999961e+00 3.518650999999999723e-02 +4.466328999999999994e-01 1.795892682000000073e+00 3.145603500000000025e-02 +4.604721999999999982e-01 1.744876515000000072e+00 3.296921333333330262e-02 +4.685032000000000085e-01 1.640983006833329982e+00 3.099933850000000102e-02 +4.766304000000000096e-01 1.643527214999999986e+00 3.129624333333329983e-02 +4.833663999999999739e-01 1.494623838666669924e+00 2.933965966666670158e-02 +4.924697000000000102e-01 1.485128543333330109e+00 3.092004166666669981e-02 +5.046184000000000225e-01 1.428664912499999939e+00 2.726148050000000087e-02 +5.084248000000000101e-01 1.392996424999999983e+00 2.844018666666670025e-02 +5.230276000000000369e-01 1.160762609500000098e+00 2.531033383333329903e-02 +5.250753000000000226e-01 1.272159111666669951e+00 2.652694499999999969e-02 +5.418418000000000401e-01 1.157124196666670102e+00 2.613007999999999997e-02 +5.443529999999999758e-01 1.137421045666670016e+00 2.582160033333329857e-02 +5.584759999999999724e-01 1.068463686666669910e+00 2.528335666666670090e-02 +5.612129000000000145e-01 1.030207043666669930e+00 2.342105016666670009e-02 +5.755700000000000260e-01 9.590708749999999894e-01 2.323855999999999838e-02 +5.833568000000000087e-01 9.226566683333330410e-01 2.312843766666669923e-02 +5.929195000000000437e-01 9.361494049999999900e-01 2.261169999999999847e-02 +6.005226999999999649e-01 8.377321681666669573e-01 2.190618299999999921e-02 +6.100906000000000384e-01 8.074355933333330348e-01 2.165867833333329912e-02 +6.218008000000000424e-01 7.338905468333329907e-01 2.116956166666670094e-02 +6.276903999999999817e-01 7.588048750000000453e-01 2.052974999999999939e-02 +6.411527999999999672e-01 6.602236648333329461e-01 1.891721183333330142e-02 +6.449108999999999536e-01 6.976061483333330093e-01 2.103810166666670103e-02 +6.654921999999999782e-01 5.868389913333329488e-01 1.814479133333329886e-02 +6.843110000000000026e-01 5.442379206666669855e-01 2.020865366666670104e-02 +7.057493999999999712e-01 4.561023925000000090e-01 1.703726683333330050e-02 +7.258065000000000211e-01 4.680557555000000036e-01 1.835656600000000124e-02 +7.489831000000000127e-01 4.286472281666670048e-01 1.513358700000000043e-02 +7.719418000000000113e-01 3.942902281666669784e-01 1.715291783333329836e-02 +7.920304000000000233e-01 3.917498161666669865e-01 1.515774683333329965e-02 +8.154392000000000307e-01 3.437863165000000221e-01 1.537817166666670052e-02 +8.363751000000000380e-01 2.882515494999999817e-01 1.453092849999999998e-02 +8.618630000000000457e-01 2.511196196666670155e-01 1.361783299999999933e-02 +8.845638000000000112e-01 2.644882184999999830e-01 1.439263916666670001e-02 +9.080675999999999748e-01 2.444909116666670046e-01 1.264447816666670020e-02 +9.333637999999999657e-01 2.291532736666669900e-01 1.361314100000000048e-02 +9.551005000000000189e-01 1.942403736666669933e-01 1.274254833333329957e-02 +9.812121999999999788e-01 1.854263468333330056e-01 1.195107366666670057e-02 +1.006720599999999965e+00 1.833105325000000119e-01 1.241118433333330065e-02 +1.030317399999999939e+00 1.560276093333330116e-01 1.172809033333330024e-02 +1.057692700000000041e+00 1.687616888333330067e-01 1.091902633333330028e-02 +1.084507099999999946e+00 1.609880563333329906e-01 1.126864266666669986e-02 +1.109806099999999907e+00 1.237764021666669934e-01 1.085079116666669979e-02 +1.137653000000000025e+00 1.252411816666670064e-01 1.044549983333330039e-02 +1.165935399999999955e+00 1.143170270000000016e-01 1.018908599999999998e-02 \ No newline at end of file diff --git a/test/mumag/Nanoperm_perpendicular_Honecker_et_al/1_33_1640_22.874115.csv b/test/mumag/Nanoperm_perpendicular_Honecker_et_al/1_33_1640_22.874115.csv index 92b38bcf5..160f11da2 100644 --- a/test/mumag/Nanoperm_perpendicular_Honecker_et_al/1_33_1640_22.874115.csv +++ b/test/mumag/Nanoperm_perpendicular_Honecker_et_al/1_33_1640_22.874115.csv @@ -1,60 +1,60 @@ -2.732000000000000053e-02 5.247581629999999677e+03 5.122294999999999732e+01 -3.090999999999999998e-02 3.911350339999999960e+03 4.422301999999999822e+01 -3.452999999999999819e-02 2.897911560000000009e+03 3.806515000000000271e+01 -3.812999999999999723e-02 2.151411560000000009e+03 3.279795000000000016e+01 -4.173999999999999932e-02 1.629610879999999952e+03 2.854479999999999862e+01 -4.542999999999999816e-02 1.229812930000000051e+03 2.479730999999999952e+01 -4.646000000000000130e-02 1.191418850000000020e+03 2.440716000000000108e+01 -4.909000000000000169e-02 9.198557799999999816e+02 2.144593000000000060e+01 -5.254999999999999949e-02 7.981839199999999437e+02 1.997728999999999999e+01 -5.270999999999999991e-02 7.205761899999999969e+02 1.898125999999999891e+01 -5.630999999999999894e-02 5.509914999999999736e+02 1.659806000000000026e+01 -5.870999999999999830e-02 5.012570499999999925e+02 1.583125000000000071e+01 -5.988000000000000267e-02 4.332142900000000054e+02 1.471757999999999988e+01 -6.353999999999999926e-02 3.420333299999999781e+02 1.307732999999999990e+01 -6.482999999999999874e-02 3.398080699999999865e+02 1.303472000000000008e+01 -6.716999999999999360e-02 2.726683699999999817e+02 1.167622000000000071e+01 -7.073000000000000120e-02 2.204248299999999858e+02 1.049821000000000026e+01 -7.095999999999999530e-02 2.235476199999999949e+02 1.057230999999999987e+01 -7.434999999999999942e-02 1.760958799999999940e+02 9.383390000000000342e+00 -7.724000000000000310e-02 1.542382200000000125e+02 8.781750000000000611e+00 -7.799999999999999989e-02 1.457825499999999863e+02 8.537639999999999674e+00 -8.164000000000000423e-02 1.201677600000000012e+02 7.751380000000000159e+00 -8.346000000000000640e-02 1.089934400000000068e+02 7.382189999999999586e+00 -8.525000000000000633e-02 9.836262000000000683e+01 7.012940000000000396e+00 -8.881999999999999618e-02 8.192439000000000249e+01 6.400170000000000137e+00 -8.962000000000000521e-02 7.733648999999999774e+01 6.218379999999999797e+00 -9.572999999999999565e-02 5.882012000000000285e+01 5.423099999999999810e+00 -1.018000000000000016e-01 4.406902000000000186e+01 4.694090000000000096e+00 -1.080300000000000010e-01 3.487624000000000279e+01 4.175900000000000389e+00 -1.141999999999999960e-01 2.769241999999999848e+01 3.721049999999999969e+00 -1.202399999999999997e-01 2.227824000000000026e+01 3.337530000000000108e+00 -1.263900000000000023e-01 1.858717000000000041e+01 3.048540000000000028e+00 -1.325999999999999956e-01 1.587791999999999959e+01 2.817619999999999791e+00 -1.388199999999999990e-01 1.416899000000000086e+01 2.661669999999999980e+00 -1.449499999999999955e-01 1.174597999999999942e+01 2.423430000000000195e+00 -1.509900000000000131e-01 1.047161000000000008e+01 2.288190000000000168e+00 -1.571599999999999941e-01 9.681599999999999540e+00 2.200180000000000025e+00 -1.633799999999999975e-01 8.894579999999999487e+00 2.108859999999999957e+00 -1.695599999999999885e-01 8.317479999999999762e+00 2.039299999999999891e+00 -1.756800000000000028e-01 7.913870000000000182e+00 1.989200000000000079e+00 -1.818599999999999939e-01 7.771530000000000271e+00 1.971230000000000038e+00 -1.880699999999999872e-01 7.882909999999999862e+00 1.985309999999999908e+00 -1.941799999999999915e-01 7.707720000000000127e+00 1.963130000000000042e+00 -2.002800000000000136e-01 7.676859999999999573e+00 1.959189999999999987e+00 -2.064199999999999924e-01 7.872259999999999813e+00 1.983970000000000011e+00 -2.126000000000000112e-01 7.870400000000000063e+00 1.983729999999999993e+00 -2.187500000000000000e-01 7.977940000000000254e+00 1.997239999999999904e+00 -2.248699999999999866e-01 8.152039999999999509e+00 2.018920000000000048e+00 -2.310500000000000054e-01 8.298420000000000130e+00 2.036960000000000104e+00 -2.372700000000000087e-01 8.716689999999999827e+00 2.087660000000000071e+00 -2.434399999999999897e-01 8.782600000000000406e+00 2.095540000000000180e+00 -2.495600000000000041e-01 8.933479999999999421e+00 2.113469999999999960e+00 -2.556899999999999729e-01 9.374109999999999943e+00 2.164960000000000218e+00 -2.618500000000000272e-01 9.457430000000000447e+00 2.174560000000000048e+00 -2.680500000000000105e-01 9.702469999999999928e+00 2.202550000000000008e+00 -2.742100000000000093e-01 9.923930000000000362e+00 2.227549999999999919e+00 -2.802999999999999936e-01 1.008966000000000030e+01 2.246070000000000011e+00 -2.864599999999999924e-01 1.031367999999999974e+01 2.270869999999999944e+00 -2.926699999999999857e-01 1.058960000000000079e+01 2.301039999999999974e+00 +2.732000000000000053e-02 5.247581629999999677e+03 5.122294999999999732e+01 +3.090999999999999998e-02 3.911350339999999960e+03 4.422301999999999822e+01 +3.452999999999999819e-02 2.897911560000000009e+03 3.806515000000000271e+01 +3.812999999999999723e-02 2.151411560000000009e+03 3.279795000000000016e+01 +4.173999999999999932e-02 1.629610879999999952e+03 2.854479999999999862e+01 +4.542999999999999816e-02 1.229812930000000051e+03 2.479730999999999952e+01 +4.646000000000000130e-02 1.191418850000000020e+03 2.440716000000000108e+01 +4.909000000000000169e-02 9.198557799999999816e+02 2.144593000000000060e+01 +5.254999999999999949e-02 7.981839199999999437e+02 1.997728999999999999e+01 +5.270999999999999991e-02 7.205761899999999969e+02 1.898125999999999891e+01 +5.630999999999999894e-02 5.509914999999999736e+02 1.659806000000000026e+01 +5.870999999999999830e-02 5.012570499999999925e+02 1.583125000000000071e+01 +5.988000000000000267e-02 4.332142900000000054e+02 1.471757999999999988e+01 +6.353999999999999926e-02 3.420333299999999781e+02 1.307732999999999990e+01 +6.482999999999999874e-02 3.398080699999999865e+02 1.303472000000000008e+01 +6.716999999999999360e-02 2.726683699999999817e+02 1.167622000000000071e+01 +7.073000000000000120e-02 2.204248299999999858e+02 1.049821000000000026e+01 +7.095999999999999530e-02 2.235476199999999949e+02 1.057230999999999987e+01 +7.434999999999999942e-02 1.760958799999999940e+02 9.383390000000000342e+00 +7.724000000000000310e-02 1.542382200000000125e+02 8.781750000000000611e+00 +7.799999999999999989e-02 1.457825499999999863e+02 8.537639999999999674e+00 +8.164000000000000423e-02 1.201677600000000012e+02 7.751380000000000159e+00 +8.346000000000000640e-02 1.089934400000000068e+02 7.382189999999999586e+00 +8.525000000000000633e-02 9.836262000000000683e+01 7.012940000000000396e+00 +8.881999999999999618e-02 8.192439000000000249e+01 6.400170000000000137e+00 +8.962000000000000521e-02 7.733648999999999774e+01 6.218379999999999797e+00 +9.572999999999999565e-02 5.882012000000000285e+01 5.423099999999999810e+00 +1.018000000000000016e-01 4.406902000000000186e+01 4.694090000000000096e+00 +1.080300000000000010e-01 3.487624000000000279e+01 4.175900000000000389e+00 +1.141999999999999960e-01 2.769241999999999848e+01 3.721049999999999969e+00 +1.202399999999999997e-01 2.227824000000000026e+01 3.337530000000000108e+00 +1.263900000000000023e-01 1.858717000000000041e+01 3.048540000000000028e+00 +1.325999999999999956e-01 1.587791999999999959e+01 2.817619999999999791e+00 +1.388199999999999990e-01 1.416899000000000086e+01 2.661669999999999980e+00 +1.449499999999999955e-01 1.174597999999999942e+01 2.423430000000000195e+00 +1.509900000000000131e-01 1.047161000000000008e+01 2.288190000000000168e+00 +1.571599999999999941e-01 9.681599999999999540e+00 2.200180000000000025e+00 +1.633799999999999975e-01 8.894579999999999487e+00 2.108859999999999957e+00 +1.695599999999999885e-01 8.317479999999999762e+00 2.039299999999999891e+00 +1.756800000000000028e-01 7.913870000000000182e+00 1.989200000000000079e+00 +1.818599999999999939e-01 7.771530000000000271e+00 1.971230000000000038e+00 +1.880699999999999872e-01 7.882909999999999862e+00 1.985309999999999908e+00 +1.941799999999999915e-01 7.707720000000000127e+00 1.963130000000000042e+00 +2.002800000000000136e-01 7.676859999999999573e+00 1.959189999999999987e+00 +2.064199999999999924e-01 7.872259999999999813e+00 1.983970000000000011e+00 +2.126000000000000112e-01 7.870400000000000063e+00 1.983729999999999993e+00 +2.187500000000000000e-01 7.977940000000000254e+00 1.997239999999999904e+00 +2.248699999999999866e-01 8.152039999999999509e+00 2.018920000000000048e+00 +2.310500000000000054e-01 8.298420000000000130e+00 2.036960000000000104e+00 +2.372700000000000087e-01 8.716689999999999827e+00 2.087660000000000071e+00 +2.434399999999999897e-01 8.782600000000000406e+00 2.095540000000000180e+00 +2.495600000000000041e-01 8.933479999999999421e+00 2.113469999999999960e+00 +2.556899999999999729e-01 9.374109999999999943e+00 2.164960000000000218e+00 +2.618500000000000272e-01 9.457430000000000447e+00 2.174560000000000048e+00 +2.680500000000000105e-01 9.702469999999999928e+00 2.202550000000000008e+00 +2.742100000000000093e-01 9.923930000000000362e+00 2.227549999999999919e+00 +2.802999999999999936e-01 1.008966000000000030e+01 2.246070000000000011e+00 +2.864599999999999924e-01 1.031367999999999974e+01 2.270869999999999944e+00 +2.926699999999999857e-01 1.058960000000000079e+01 2.301039999999999974e+00 2.988199999999999745e-01 1.062256999999999962e+01 2.304619999999999891e+00 \ No newline at end of file diff --git a/test/mumag/Nanoperm_perpendicular_Honecker_et_al/2_42_1640_23.456895.csv b/test/mumag/Nanoperm_perpendicular_Honecker_et_al/2_42_1640_23.456895.csv index 831fa6a9d..80562dff5 100644 --- a/test/mumag/Nanoperm_perpendicular_Honecker_et_al/2_42_1640_23.456895.csv +++ b/test/mumag/Nanoperm_perpendicular_Honecker_et_al/2_42_1640_23.456895.csv @@ -1,60 +1,60 @@ -2.732000000000000053e-02 3.883615650000000187e+03 4.406595000000000084e+01 -3.090000000000000038e-02 3.072013609999999971e+03 3.919192000000000320e+01 -3.452999999999999819e-02 2.355659860000000208e+03 3.431953000000000031e+01 -3.812999999999999723e-02 1.806985030000000052e+03 3.005815000000000126e+01 -4.173999999999999932e-02 1.389839799999999968e+03 2.636132999999999882e+01 -4.542000000000000204e-02 1.072684349999999995e+03 2.315906000000000020e+01 -4.644000000000000211e-02 9.624380499999999756e+02 2.193669999999999831e+01 -4.907999999999999863e-02 8.065360500000000457e+02 2.008153000000000077e+01 -5.253000000000000030e-02 6.666923000000000457e+02 1.825777000000000072e+01 -5.270999999999999991e-02 6.432540800000000445e+02 1.793395999999999901e+01 -5.630000000000000282e-02 4.985809499999999730e+02 1.578894000000000020e+01 -5.868999999999999911e-02 4.290448299999999904e+02 1.464658000000000015e+01 -5.986999999999999961e-02 3.918163299999999936e+02 1.399671999999999983e+01 -6.353000000000000314e-02 3.098850299999999720e+02 1.244758999999999993e+01 -6.481000000000000649e-02 2.946982499999999732e+02 1.213874000000000031e+01 -6.715999999999999748e-02 2.516384400000000028e+02 1.121692000000000000e+01 -7.072000000000000508e-02 2.028407500000000141e+02 1.007076999999999956e+01 -7.094000000000000306e-02 1.948358800000000031e+02 9.870050000000000878e+00 -7.434000000000000330e-02 1.633427599999999984e+02 9.037219999999999587e+00 -7.721000000000000085e-02 1.371933899999999937e+02 8.282310000000000727e+00 -7.799000000000000377e-02 1.347819700000000012e+02 8.209199999999999164e+00 -8.162999999999999423e-02 1.123165999999999940e+02 7.493879999999999875e+00 -8.343000000000000416e-02 9.602442000000000633e+01 6.929079999999999906e+00 -8.523999999999999633e-02 9.249591999999999814e+01 6.800589999999999691e+00 -8.880000000000000393e-02 7.934887999999999408e+01 6.298759999999999692e+00 -8.959000000000000297e-02 7.016214999999999691e+01 5.922930000000000028e+00 -9.568999999999999728e-02 5.357988000000000284e+01 5.175900000000000389e+00 -1.017699999999999994e-01 4.050641000000000247e+01 4.500359999999999694e+00 -1.079900000000000027e-01 3.194395000000000095e+01 3.996500000000000163e+00 -1.141599999999999976e-01 2.563089000000000084e+01 3.579870000000000108e+00 -1.202000000000000013e-01 2.144641999999999982e+01 3.274630000000000152e+00 -1.263499999999999901e-01 1.696240999999999843e+01 2.912249999999999783e+00 -1.325600000000000112e-01 1.453672000000000075e+01 2.695990000000000109e+00 -1.387700000000000045e-01 1.265718999999999994e+01 2.515670000000000073e+00 -1.449000000000000010e-01 1.114897000000000027e+01 2.361029999999999962e+00 -1.509399999999999908e-01 1.005156999999999989e+01 2.241830000000000211e+00 -1.571099999999999997e-01 9.313710000000000377e+00 2.157970000000000166e+00 -1.633300000000000030e-01 8.668530000000000513e+00 2.081890000000000018e+00 -1.695099999999999940e-01 7.810069999999999624e+00 1.976120000000000099e+00 -1.756300000000000083e-01 7.695079999999999920e+00 1.961519999999999930e+00 -1.817999999999999894e-01 7.222220000000000084e+00 1.900290000000000035e+00 -1.880100000000000104e-01 7.386999999999999567e+00 1.921850000000000058e+00 -1.941199999999999870e-01 7.239320000000000199e+00 1.902539999999999898e+00 -2.002200000000000091e-01 7.279099999999999682e+00 1.907759999999999900e+00 -2.063500000000000056e-01 7.406340000000000146e+00 1.924360000000000070e+00 -2.125299999999999967e-01 7.439199999999999591e+00 1.928630000000000067e+00 -2.186800000000000133e-01 7.556879999999999598e+00 1.943820000000000103e+00 -2.247899999999999898e-01 7.730520000000000280e+00 1.966029999999999944e+00 -2.309799999999999909e-01 8.106099999999999639e+00 2.013220000000000010e+00 -2.371999999999999942e-01 8.398609999999999687e+00 2.049220000000000041e+00 -2.433599999999999930e-01 8.171440000000000481e+00 2.021319999999999784e+00 -2.494800000000000073e-01 8.478289999999999438e+00 2.058920000000000083e+00 -2.556100000000000039e-01 8.796279999999999433e+00 2.097170000000000201e+00 -2.617700000000000027e-01 8.973420000000000840e+00 2.118189999999999795e+00 -2.679699999999999860e-01 9.270730000000000359e+00 2.152989999999999959e+00 -2.741299999999999848e-01 9.463879999999999626e+00 2.175300000000000011e+00 -2.802100000000000146e-01 9.409150000000000347e+00 2.169000000000000039e+00 -2.863700000000000134e-01 9.709509999999999863e+00 2.203349999999999920e+00 -2.925800000000000067e-01 9.851300000000000168e+00 2.219380000000000130e+00 +2.732000000000000053e-02 3.883615650000000187e+03 4.406595000000000084e+01 +3.090000000000000038e-02 3.072013609999999971e+03 3.919192000000000320e+01 +3.452999999999999819e-02 2.355659860000000208e+03 3.431953000000000031e+01 +3.812999999999999723e-02 1.806985030000000052e+03 3.005815000000000126e+01 +4.173999999999999932e-02 1.389839799999999968e+03 2.636132999999999882e+01 +4.542000000000000204e-02 1.072684349999999995e+03 2.315906000000000020e+01 +4.644000000000000211e-02 9.624380499999999756e+02 2.193669999999999831e+01 +4.907999999999999863e-02 8.065360500000000457e+02 2.008153000000000077e+01 +5.253000000000000030e-02 6.666923000000000457e+02 1.825777000000000072e+01 +5.270999999999999991e-02 6.432540800000000445e+02 1.793395999999999901e+01 +5.630000000000000282e-02 4.985809499999999730e+02 1.578894000000000020e+01 +5.868999999999999911e-02 4.290448299999999904e+02 1.464658000000000015e+01 +5.986999999999999961e-02 3.918163299999999936e+02 1.399671999999999983e+01 +6.353000000000000314e-02 3.098850299999999720e+02 1.244758999999999993e+01 +6.481000000000000649e-02 2.946982499999999732e+02 1.213874000000000031e+01 +6.715999999999999748e-02 2.516384400000000028e+02 1.121692000000000000e+01 +7.072000000000000508e-02 2.028407500000000141e+02 1.007076999999999956e+01 +7.094000000000000306e-02 1.948358800000000031e+02 9.870050000000000878e+00 +7.434000000000000330e-02 1.633427599999999984e+02 9.037219999999999587e+00 +7.721000000000000085e-02 1.371933899999999937e+02 8.282310000000000727e+00 +7.799000000000000377e-02 1.347819700000000012e+02 8.209199999999999164e+00 +8.162999999999999423e-02 1.123165999999999940e+02 7.493879999999999875e+00 +8.343000000000000416e-02 9.602442000000000633e+01 6.929079999999999906e+00 +8.523999999999999633e-02 9.249591999999999814e+01 6.800589999999999691e+00 +8.880000000000000393e-02 7.934887999999999408e+01 6.298759999999999692e+00 +8.959000000000000297e-02 7.016214999999999691e+01 5.922930000000000028e+00 +9.568999999999999728e-02 5.357988000000000284e+01 5.175900000000000389e+00 +1.017699999999999994e-01 4.050641000000000247e+01 4.500359999999999694e+00 +1.079900000000000027e-01 3.194395000000000095e+01 3.996500000000000163e+00 +1.141599999999999976e-01 2.563089000000000084e+01 3.579870000000000108e+00 +1.202000000000000013e-01 2.144641999999999982e+01 3.274630000000000152e+00 +1.263499999999999901e-01 1.696240999999999843e+01 2.912249999999999783e+00 +1.325600000000000112e-01 1.453672000000000075e+01 2.695990000000000109e+00 +1.387700000000000045e-01 1.265718999999999994e+01 2.515670000000000073e+00 +1.449000000000000010e-01 1.114897000000000027e+01 2.361029999999999962e+00 +1.509399999999999908e-01 1.005156999999999989e+01 2.241830000000000211e+00 +1.571099999999999997e-01 9.313710000000000377e+00 2.157970000000000166e+00 +1.633300000000000030e-01 8.668530000000000513e+00 2.081890000000000018e+00 +1.695099999999999940e-01 7.810069999999999624e+00 1.976120000000000099e+00 +1.756300000000000083e-01 7.695079999999999920e+00 1.961519999999999930e+00 +1.817999999999999894e-01 7.222220000000000084e+00 1.900290000000000035e+00 +1.880100000000000104e-01 7.386999999999999567e+00 1.921850000000000058e+00 +1.941199999999999870e-01 7.239320000000000199e+00 1.902539999999999898e+00 +2.002200000000000091e-01 7.279099999999999682e+00 1.907759999999999900e+00 +2.063500000000000056e-01 7.406340000000000146e+00 1.924360000000000070e+00 +2.125299999999999967e-01 7.439199999999999591e+00 1.928630000000000067e+00 +2.186800000000000133e-01 7.556879999999999598e+00 1.943820000000000103e+00 +2.247899999999999898e-01 7.730520000000000280e+00 1.966029999999999944e+00 +2.309799999999999909e-01 8.106099999999999639e+00 2.013220000000000010e+00 +2.371999999999999942e-01 8.398609999999999687e+00 2.049220000000000041e+00 +2.433599999999999930e-01 8.171440000000000481e+00 2.021319999999999784e+00 +2.494800000000000073e-01 8.478289999999999438e+00 2.058920000000000083e+00 +2.556100000000000039e-01 8.796279999999999433e+00 2.097170000000000201e+00 +2.617700000000000027e-01 8.973420000000000840e+00 2.118189999999999795e+00 +2.679699999999999860e-01 9.270730000000000359e+00 2.152989999999999959e+00 +2.741299999999999848e-01 9.463879999999999626e+00 2.175300000000000011e+00 +2.802100000000000146e-01 9.409150000000000347e+00 2.169000000000000039e+00 +2.863700000000000134e-01 9.709509999999999863e+00 2.203349999999999920e+00 +2.925800000000000067e-01 9.851300000000000168e+00 2.219380000000000130e+00 2.987299999999999955e-01 9.904920000000000613e+00 2.225410000000000110e+00 \ No newline at end of file diff --git a/test/mumag/Nanoperm_perpendicular_Honecker_et_al/3_61_1640_23.748285.csv b/test/mumag/Nanoperm_perpendicular_Honecker_et_al/3_61_1640_23.748285.csv index 59e4cde42..6e68726d8 100644 --- a/test/mumag/Nanoperm_perpendicular_Honecker_et_al/3_61_1640_23.748285.csv +++ b/test/mumag/Nanoperm_perpendicular_Honecker_et_al/3_61_1640_23.748285.csv @@ -1,60 +1,60 @@ -2.732000000000000053e-02 2.792353740000000016e+03 3.736545000000000272e+01 -3.090000000000000038e-02 2.271702040000000125e+03 3.370239000000000118e+01 -3.452000000000000207e-02 1.788897279999999910e+03 2.990733000000000175e+01 -3.812000000000000111e-02 1.407023470000000088e+03 2.652380000000000138e+01 -4.173000000000000320e-02 1.095009520000000066e+03 2.339882000000000062e+01 -4.542000000000000204e-02 8.376734699999999521e+02 2.046549999999999869e+01 -4.644000000000000211e-02 7.836296200000000454e+02 1.979430999999999941e+01 -4.907000000000000250e-02 6.414952399999999670e+02 1.790943000000000040e+01 -5.253000000000000030e-02 5.516777200000000221e+02 1.660839999999999961e+01 -5.269999999999999685e-02 5.141714299999999866e+02 1.603388999999999953e+01 -5.628999999999999976e-02 3.988418399999999906e+02 1.412165000000000070e+01 -5.868999999999999911e-02 3.579082799999999907e+02 1.337737000000000087e+01 -5.985999999999999654e-02 3.164397999999999911e+02 1.257854999999999990e+01 -6.351999999999999313e-02 2.486343500000000120e+02 1.114976000000000056e+01 -6.481000000000000649e-02 2.482066299999999899e+02 1.114016999999999946e+01 -6.715000000000000135e-02 2.006787799999999891e+02 1.001695999999999920e+01 -7.070999999999999508e-02 1.657927200000000028e+02 9.104739999999999611e+00 -7.094000000000000306e-02 1.667760000000000105e+02 9.131700000000000372e+00 -7.431999999999999718e-02 1.326982299999999952e+02 8.145500000000000185e+00 -7.721000000000000085e-02 1.181177100000000024e+02 7.684980000000000366e+00 -7.796999999999999764e-02 1.108474499999999949e+02 7.444709999999999717e+00 -8.161999999999999811e-02 9.087302999999999997e+01 6.740660000000000096e+00 -8.343000000000000416e-02 8.290343000000000018e+01 6.438299999999999912e+00 -8.522000000000000408e-02 7.588799000000000206e+01 6.159869999999999735e+00 -8.878999999999999393e-02 6.486343999999999710e+01 5.694890000000000008e+00 -8.959000000000000297e-02 6.133471999999999724e+01 5.537810000000000343e+00 -9.568999999999999728e-02 4.711737999999999715e+01 4.853729999999999656e+00 -1.017699999999999994e-01 3.554666000000000281e+01 4.215840000000000032e+00 -1.079900000000000027e-01 2.833098000000000027e+01 3.763710000000000111e+00 -1.141599999999999976e-01 2.318925000000000125e+01 3.405089999999999950e+00 -1.202000000000000013e-01 1.876435000000000031e+01 3.063029999999999919e+00 -1.263499999999999901e-01 1.568601999999999919e+01 2.800539999999999807e+00 -1.325600000000000112e-01 1.346410000000000018e+01 2.594619999999999926e+00 -1.387700000000000045e-01 1.173840000000000039e+01 2.422639999999999905e+00 -1.449000000000000010e-01 1.054757999999999996e+01 2.296469999999999789e+00 -1.509399999999999908e-01 9.084839999999999804e+00 2.131299999999999972e+00 -1.571099999999999997e-01 8.239589999999999748e+00 2.029729999999999812e+00 -1.633300000000000030e-01 7.767660000000000231e+00 1.970739999999999936e+00 -1.695099999999999940e-01 7.631929999999999659e+00 1.953449999999999909e+00 -1.756300000000000083e-01 7.253739999999999633e+00 1.904430000000000067e+00 -1.817999999999999894e-01 6.968580000000000219e+00 1.866630000000000011e+00 -1.880100000000000104e-01 7.029829999999999579e+00 1.874810000000000088e+00 -1.941199999999999870e-01 6.805609999999999715e+00 1.844670000000000032e+00 -2.002200000000000091e-01 7.007130000000000081e+00 1.871779999999999999e+00 -2.063500000000000056e-01 7.083709999999999951e+00 1.881979999999999986e+00 -2.125299999999999967e-01 6.971890000000000143e+00 1.867070000000000007e+00 -2.186800000000000133e-01 7.549360000000000070e+00 1.942849999999999966e+00 -2.247899999999999898e-01 7.451310000000000322e+00 1.930199999999999916e+00 -2.309799999999999909e-01 7.449589999999999712e+00 1.929969999999999963e+00 -2.371999999999999942e-01 7.776720000000000077e+00 1.971889999999999921e+00 -2.433599999999999930e-01 8.157130000000000436e+00 2.019550000000000178e+00 -2.494800000000000073e-01 8.339280000000000470e+00 2.041970000000000063e+00 -2.556100000000000039e-01 8.448100000000000165e+00 2.055250000000000021e+00 -2.617700000000000027e-01 8.746420000000000528e+00 2.091219999999999857e+00 -2.679699999999999860e-01 9.040720000000000312e+00 2.126110000000000166e+00 -2.741299999999999848e-01 9.130409999999999471e+00 2.136629999999999807e+00 -2.802100000000000146e-01 9.247719999999999274e+00 2.150319999999999787e+00 -2.863700000000000134e-01 9.291150000000000020e+00 2.155359999999999943e+00 -2.925800000000000067e-01 9.640140000000000597e+00 2.195469999999999811e+00 +2.732000000000000053e-02 2.792353740000000016e+03 3.736545000000000272e+01 +3.090000000000000038e-02 2.271702040000000125e+03 3.370239000000000118e+01 +3.452000000000000207e-02 1.788897279999999910e+03 2.990733000000000175e+01 +3.812000000000000111e-02 1.407023470000000088e+03 2.652380000000000138e+01 +4.173000000000000320e-02 1.095009520000000066e+03 2.339882000000000062e+01 +4.542000000000000204e-02 8.376734699999999521e+02 2.046549999999999869e+01 +4.644000000000000211e-02 7.836296200000000454e+02 1.979430999999999941e+01 +4.907000000000000250e-02 6.414952399999999670e+02 1.790943000000000040e+01 +5.253000000000000030e-02 5.516777200000000221e+02 1.660839999999999961e+01 +5.269999999999999685e-02 5.141714299999999866e+02 1.603388999999999953e+01 +5.628999999999999976e-02 3.988418399999999906e+02 1.412165000000000070e+01 +5.868999999999999911e-02 3.579082799999999907e+02 1.337737000000000087e+01 +5.985999999999999654e-02 3.164397999999999911e+02 1.257854999999999990e+01 +6.351999999999999313e-02 2.486343500000000120e+02 1.114976000000000056e+01 +6.481000000000000649e-02 2.482066299999999899e+02 1.114016999999999946e+01 +6.715000000000000135e-02 2.006787799999999891e+02 1.001695999999999920e+01 +7.070999999999999508e-02 1.657927200000000028e+02 9.104739999999999611e+00 +7.094000000000000306e-02 1.667760000000000105e+02 9.131700000000000372e+00 +7.431999999999999718e-02 1.326982299999999952e+02 8.145500000000000185e+00 +7.721000000000000085e-02 1.181177100000000024e+02 7.684980000000000366e+00 +7.796999999999999764e-02 1.108474499999999949e+02 7.444709999999999717e+00 +8.161999999999999811e-02 9.087302999999999997e+01 6.740660000000000096e+00 +8.343000000000000416e-02 8.290343000000000018e+01 6.438299999999999912e+00 +8.522000000000000408e-02 7.588799000000000206e+01 6.159869999999999735e+00 +8.878999999999999393e-02 6.486343999999999710e+01 5.694890000000000008e+00 +8.959000000000000297e-02 6.133471999999999724e+01 5.537810000000000343e+00 +9.568999999999999728e-02 4.711737999999999715e+01 4.853729999999999656e+00 +1.017699999999999994e-01 3.554666000000000281e+01 4.215840000000000032e+00 +1.079900000000000027e-01 2.833098000000000027e+01 3.763710000000000111e+00 +1.141599999999999976e-01 2.318925000000000125e+01 3.405089999999999950e+00 +1.202000000000000013e-01 1.876435000000000031e+01 3.063029999999999919e+00 +1.263499999999999901e-01 1.568601999999999919e+01 2.800539999999999807e+00 +1.325600000000000112e-01 1.346410000000000018e+01 2.594619999999999926e+00 +1.387700000000000045e-01 1.173840000000000039e+01 2.422639999999999905e+00 +1.449000000000000010e-01 1.054757999999999996e+01 2.296469999999999789e+00 +1.509399999999999908e-01 9.084839999999999804e+00 2.131299999999999972e+00 +1.571099999999999997e-01 8.239589999999999748e+00 2.029729999999999812e+00 +1.633300000000000030e-01 7.767660000000000231e+00 1.970739999999999936e+00 +1.695099999999999940e-01 7.631929999999999659e+00 1.953449999999999909e+00 +1.756300000000000083e-01 7.253739999999999633e+00 1.904430000000000067e+00 +1.817999999999999894e-01 6.968580000000000219e+00 1.866630000000000011e+00 +1.880100000000000104e-01 7.029829999999999579e+00 1.874810000000000088e+00 +1.941199999999999870e-01 6.805609999999999715e+00 1.844670000000000032e+00 +2.002200000000000091e-01 7.007130000000000081e+00 1.871779999999999999e+00 +2.063500000000000056e-01 7.083709999999999951e+00 1.881979999999999986e+00 +2.125299999999999967e-01 6.971890000000000143e+00 1.867070000000000007e+00 +2.186800000000000133e-01 7.549360000000000070e+00 1.942849999999999966e+00 +2.247899999999999898e-01 7.451310000000000322e+00 1.930199999999999916e+00 +2.309799999999999909e-01 7.449589999999999712e+00 1.929969999999999963e+00 +2.371999999999999942e-01 7.776720000000000077e+00 1.971889999999999921e+00 +2.433599999999999930e-01 8.157130000000000436e+00 2.019550000000000178e+00 +2.494800000000000073e-01 8.339280000000000470e+00 2.041970000000000063e+00 +2.556100000000000039e-01 8.448100000000000165e+00 2.055250000000000021e+00 +2.617700000000000027e-01 8.746420000000000528e+00 2.091219999999999857e+00 +2.679699999999999860e-01 9.040720000000000312e+00 2.126110000000000166e+00 +2.741299999999999848e-01 9.130409999999999471e+00 2.136629999999999807e+00 +2.802100000000000146e-01 9.247719999999999274e+00 2.150319999999999787e+00 +2.863700000000000134e-01 9.291150000000000020e+00 2.155359999999999943e+00 +2.925800000000000067e-01 9.640140000000000597e+00 2.195469999999999811e+00 2.987299999999999955e-01 9.537290000000000489e+00 2.183720000000000105e+00 \ No newline at end of file diff --git a/test/mumag/Nanoperm_perpendicular_Honecker_et_al/4_103_1640_24.039675.csv b/test/mumag/Nanoperm_perpendicular_Honecker_et_al/4_103_1640_24.039675.csv index daf8f80a8..c33506202 100644 --- a/test/mumag/Nanoperm_perpendicular_Honecker_et_al/4_103_1640_24.039675.csv +++ b/test/mumag/Nanoperm_perpendicular_Honecker_et_al/4_103_1640_24.039675.csv @@ -1,60 +1,60 @@ -2.733000000000000013e-02 2.320909860000000208e+03 3.406544999999999845e+01 -3.090999999999999998e-02 1.910828909999999951e+03 3.090978000000000137e+01 -3.454000000000000126e-02 1.519815650000000005e+03 2.756643000000000043e+01 -3.814000000000000029e-02 1.188850680000000011e+03 2.438083999999999918e+01 -4.175000000000000239e-02 9.312768700000000308e+02 2.157865999999999929e+01 -4.544000000000000122e-02 7.201697299999999586e+02 1.897589999999999932e+01 -4.646000000000000130e-02 6.728012599999999566e+02 1.834122999999999948e+01 -4.909999999999999781e-02 5.453608799999999519e+02 1.651304000000000016e+01 -5.256000000000000255e-02 4.724414499999999748e+02 1.536946999999999974e+01 -5.272000000000000297e-02 4.318700699999999983e+02 1.469472999999999985e+01 -5.632000000000000201e-02 3.382353699999999890e+02 1.300453000000000081e+01 -5.870999999999999830e-02 3.073326000000000136e+02 1.239621999999999957e+01 -5.988999999999999879e-02 2.634156100000000151e+02 1.147639999999999993e+01 -6.356000000000000538e-02 2.076918699999999944e+02 1.019048000000000087e+01 -6.483999999999999486e-02 2.125336499999999944e+02 1.030857999999999919e+01 -6.718999999999999972e-02 1.688028199999999970e+02 9.187020000000000408e+00 -7.073999999999999733e-02 1.362696899999999971e+02 8.254379999999999384e+00 -7.097000000000000530e-02 1.410024300000000039e+02 8.396499999999999631e+00 -7.435999999999999555e-02 1.127603699999999947e+02 7.508670000000000400e+00 -7.724999999999999922e-02 9.965560999999999581e+01 7.058880000000000265e+00 -7.800999999999999601e-02 9.194693999999999789e+01 6.780369999999999564e+00 -8.165999999999999648e-02 7.522768999999999551e+01 6.133009999999999629e+00 -8.347000000000000253e-02 7.049939999999999429e+01 5.937149999999999928e+00 -8.526000000000000245e-02 6.411020000000000607e+01 5.661719999999999864e+00 -8.883000000000000618e-02 5.376234999999999786e+01 5.184709999999999930e+00 -8.963000000000000134e-02 5.217504000000000275e+01 5.107590000000000074e+00 -9.574000000000000565e-02 4.054399999999999693e+01 4.502439999999999998e+00 -1.018199999999999938e-01 3.096013999999999911e+01 3.934470000000000134e+00 -1.080399999999999971e-01 2.426012000000000057e+01 3.482819999999999805e+00 -1.142200000000000021e-01 1.991522000000000148e+01 3.155569999999999986e+00 -1.202600000000000058e-01 1.696463999999999928e+01 2.912440000000000140e+00 -1.264099999999999946e-01 1.406012999999999913e+01 2.651429999999999954e+00 -1.326199999999999879e-01 1.186475000000000080e+01 2.435649999999999871e+00 -1.388300000000000090e-01 1.075843000000000060e+01 2.319310000000000205e+00 -1.449699999999999878e-01 9.447770000000000223e+00 2.173449999999999882e+00 -1.510100000000000053e-01 8.521739999999999426e+00 2.064189999999999969e+00 -1.571799999999999864e-01 7.782460000000000377e+00 1.972620000000000040e+00 -1.634099999999999997e-01 7.576889999999999681e+00 1.946390000000000065e+00 -1.695800000000000085e-01 7.175270000000000259e+00 1.894109999999999960e+00 -1.756999999999999951e-01 6.609770000000000145e+00 1.817930000000000046e+00 -1.818799999999999861e-01 6.690150000000000041e+00 1.828950000000000076e+00 -1.880999999999999894e-01 6.763010000000000410e+00 1.838889999999999914e+00 -1.942000000000000115e-01 6.479930000000000412e+00 1.799989999999999979e+00 -2.003099999999999881e-01 6.931930000000000369e+00 1.861709999999999976e+00 -2.064499999999999946e-01 7.058690000000000353e+00 1.878649999999999931e+00 -2.126300000000000134e-01 6.966739999999999711e+00 1.866379999999999928e+00 -2.187699999999999922e-01 7.155350000000000321e+00 1.891469999999999985e+00 -2.248999999999999888e-01 7.328820000000000334e+00 1.914260000000000073e+00 -2.310800000000000076e-01 7.623789999999999623e+00 1.952409999999999979e+00 -2.373000000000000109e-01 7.870739999999999625e+00 1.983780000000000099e+00 -2.434699999999999920e-01 7.865639999999999965e+00 1.983130000000000059e+00 -2.495900000000000063e-01 8.081390000000000740e+00 2.010149999999999881e+00 -2.557300000000000129e-01 8.480309999999999349e+00 2.059159999999999879e+00 -2.618900000000000117e-01 8.708700000000000330e+00 2.086710000000000065e+00 -2.680899999999999950e-01 8.823320000000000718e+00 2.100389999999999979e+00 -2.742499999999999938e-01 9.030450000000000088e+00 2.124909999999999854e+00 -2.803300000000000236e-01 9.222670000000000812e+00 2.147400000000000198e+00 -2.864999999999999769e-01 9.345430000000000348e+00 2.161649999999999849e+00 -2.927100000000000257e-01 9.660539999999999239e+00 2.197789999999999910e+00 +2.733000000000000013e-02 2.320909860000000208e+03 3.406544999999999845e+01 +3.090999999999999998e-02 1.910828909999999951e+03 3.090978000000000137e+01 +3.454000000000000126e-02 1.519815650000000005e+03 2.756643000000000043e+01 +3.814000000000000029e-02 1.188850680000000011e+03 2.438083999999999918e+01 +4.175000000000000239e-02 9.312768700000000308e+02 2.157865999999999929e+01 +4.544000000000000122e-02 7.201697299999999586e+02 1.897589999999999932e+01 +4.646000000000000130e-02 6.728012599999999566e+02 1.834122999999999948e+01 +4.909999999999999781e-02 5.453608799999999519e+02 1.651304000000000016e+01 +5.256000000000000255e-02 4.724414499999999748e+02 1.536946999999999974e+01 +5.272000000000000297e-02 4.318700699999999983e+02 1.469472999999999985e+01 +5.632000000000000201e-02 3.382353699999999890e+02 1.300453000000000081e+01 +5.870999999999999830e-02 3.073326000000000136e+02 1.239621999999999957e+01 +5.988999999999999879e-02 2.634156100000000151e+02 1.147639999999999993e+01 +6.356000000000000538e-02 2.076918699999999944e+02 1.019048000000000087e+01 +6.483999999999999486e-02 2.125336499999999944e+02 1.030857999999999919e+01 +6.718999999999999972e-02 1.688028199999999970e+02 9.187020000000000408e+00 +7.073999999999999733e-02 1.362696899999999971e+02 8.254379999999999384e+00 +7.097000000000000530e-02 1.410024300000000039e+02 8.396499999999999631e+00 +7.435999999999999555e-02 1.127603699999999947e+02 7.508670000000000400e+00 +7.724999999999999922e-02 9.965560999999999581e+01 7.058880000000000265e+00 +7.800999999999999601e-02 9.194693999999999789e+01 6.780369999999999564e+00 +8.165999999999999648e-02 7.522768999999999551e+01 6.133009999999999629e+00 +8.347000000000000253e-02 7.049939999999999429e+01 5.937149999999999928e+00 +8.526000000000000245e-02 6.411020000000000607e+01 5.661719999999999864e+00 +8.883000000000000618e-02 5.376234999999999786e+01 5.184709999999999930e+00 +8.963000000000000134e-02 5.217504000000000275e+01 5.107590000000000074e+00 +9.574000000000000565e-02 4.054399999999999693e+01 4.502439999999999998e+00 +1.018199999999999938e-01 3.096013999999999911e+01 3.934470000000000134e+00 +1.080399999999999971e-01 2.426012000000000057e+01 3.482819999999999805e+00 +1.142200000000000021e-01 1.991522000000000148e+01 3.155569999999999986e+00 +1.202600000000000058e-01 1.696463999999999928e+01 2.912440000000000140e+00 +1.264099999999999946e-01 1.406012999999999913e+01 2.651429999999999954e+00 +1.326199999999999879e-01 1.186475000000000080e+01 2.435649999999999871e+00 +1.388300000000000090e-01 1.075843000000000060e+01 2.319310000000000205e+00 +1.449699999999999878e-01 9.447770000000000223e+00 2.173449999999999882e+00 +1.510100000000000053e-01 8.521739999999999426e+00 2.064189999999999969e+00 +1.571799999999999864e-01 7.782460000000000377e+00 1.972620000000000040e+00 +1.634099999999999997e-01 7.576889999999999681e+00 1.946390000000000065e+00 +1.695800000000000085e-01 7.175270000000000259e+00 1.894109999999999960e+00 +1.756999999999999951e-01 6.609770000000000145e+00 1.817930000000000046e+00 +1.818799999999999861e-01 6.690150000000000041e+00 1.828950000000000076e+00 +1.880999999999999894e-01 6.763010000000000410e+00 1.838889999999999914e+00 +1.942000000000000115e-01 6.479930000000000412e+00 1.799989999999999979e+00 +2.003099999999999881e-01 6.931930000000000369e+00 1.861709999999999976e+00 +2.064499999999999946e-01 7.058690000000000353e+00 1.878649999999999931e+00 +2.126300000000000134e-01 6.966739999999999711e+00 1.866379999999999928e+00 +2.187699999999999922e-01 7.155350000000000321e+00 1.891469999999999985e+00 +2.248999999999999888e-01 7.328820000000000334e+00 1.914260000000000073e+00 +2.310800000000000076e-01 7.623789999999999623e+00 1.952409999999999979e+00 +2.373000000000000109e-01 7.870739999999999625e+00 1.983780000000000099e+00 +2.434699999999999920e-01 7.865639999999999965e+00 1.983130000000000059e+00 +2.495900000000000063e-01 8.081390000000000740e+00 2.010149999999999881e+00 +2.557300000000000129e-01 8.480309999999999349e+00 2.059159999999999879e+00 +2.618900000000000117e-01 8.708700000000000330e+00 2.086710000000000065e+00 +2.680899999999999950e-01 8.823320000000000718e+00 2.100389999999999979e+00 +2.742499999999999938e-01 9.030450000000000088e+00 2.124909999999999854e+00 +2.803300000000000236e-01 9.222670000000000812e+00 2.147400000000000198e+00 +2.864999999999999769e-01 9.345430000000000348e+00 2.161649999999999849e+00 +2.927100000000000257e-01 9.660539999999999239e+00 2.197789999999999910e+00 2.988600000000000145e-01 9.559969999999999857e+00 2.186319999999999819e+00 \ No newline at end of file diff --git a/test/mumag/Nanoperm_perpendicular_Honecker_et_al/5_312_1640_24.331065.csv b/test/mumag/Nanoperm_perpendicular_Honecker_et_al/5_312_1640_24.331065.csv index 2f696f3b5..17968ec9e 100644 --- a/test/mumag/Nanoperm_perpendicular_Honecker_et_al/5_312_1640_24.331065.csv +++ b/test/mumag/Nanoperm_perpendicular_Honecker_et_al/5_312_1640_24.331065.csv @@ -1,60 +1,60 @@ -2.733000000000000013e-02 1.791495509999999967e+03 2.992905000000000015e+01 -3.091999999999999957e-02 1.477992469999999912e+03 2.718449000000000026e+01 -3.454000000000000126e-02 1.172791189999999915e+03 2.421561000000000163e+01 -3.814000000000000029e-02 9.196233300000000099e+02 2.144322000000000017e+01 -4.175000000000000239e-02 7.160111200000000053e+02 1.892102999999999824e+01 -4.544000000000000122e-02 5.391461900000000469e+02 1.641867999999999839e+01 -4.646000000000000130e-02 4.929036699999999769e+02 1.569877999999999929e+01 -4.909999999999999781e-02 4.129331099999999992e+02 1.436894000000000027e+01 -5.256000000000000255e-02 3.482022600000000239e+02 1.319473999999999947e+01 -5.272999999999999909e-02 3.242194700000000012e+02 1.273222999999999949e+01 -5.632000000000000201e-02 2.454095199999999863e+02 1.107722000000000051e+01 -5.870999999999999830e-02 2.218204599999999971e+02 1.053139000000000003e+01 -5.990000000000000185e-02 1.931666899999999885e+02 9.827680000000000859e+00 -6.356000000000000538e-02 1.505020900000000097e+02 8.674739999999999895e+00 -6.483999999999999486e-02 1.511605900000000133e+02 8.693690000000000140e+00 -6.718999999999999972e-02 1.202856799999999993e+02 7.755180000000000184e+00 -7.074999999999999345e-02 9.616129999999999711e+01 6.934020000000000294e+00 -7.097000000000000530e-02 9.870516999999999541e+01 7.025140000000000384e+00 -7.435999999999999555e-02 7.818730999999999653e+01 6.252489999999999881e+00 -7.724999999999999922e-02 6.837958000000000425e+01 5.847199999999999953e+00 -7.802000000000000601e-02 6.371482000000000312e+01 5.644239999999999924e+00 -8.165999999999999648e-02 5.179379999999999740e+01 5.088899999999999757e+00 -8.347000000000000253e-02 4.836007000000000033e+01 4.917320000000000135e+00 -8.526999999999999857e-02 4.457972000000000179e+01 4.721210000000000129e+00 -8.884000000000000230e-02 3.751116999999999990e+01 4.330770000000000231e+00 -8.963000000000000134e-02 3.544118999999999886e+01 4.209579999999999878e+00 -9.574000000000000565e-02 2.739192999999999856e+01 3.700810000000000155e+00 -1.018199999999999938e-01 2.084316000000000102e+01 3.228250000000000064e+00 -1.080399999999999971e-01 1.702296000000000120e+01 2.917440000000000033e+00 -1.142200000000000021e-01 1.391883999999999943e+01 2.638069999999999915e+00 -1.202600000000000058e-01 1.148202000000000034e+01 2.396040000000000170e+00 -1.264099999999999946e-01 9.887589999999999435e+00 2.223460000000000214e+00 -1.326199999999999879e-01 8.618710000000000093e+00 2.075899999999999856e+00 -1.388300000000000090e-01 7.875820000000000043e+00 1.984420000000000073e+00 -1.449699999999999878e-01 7.119869999999999699e+00 1.886779999999999902e+00 -1.510100000000000053e-01 6.691399999999999793e+00 1.829129999999999923e+00 -1.571799999999999864e-01 6.133020000000000138e+00 1.751139999999999919e+00 -1.634099999999999997e-01 5.984770000000000145e+00 1.729850000000000110e+00 -1.695800000000000085e-01 5.802669999999999995e+00 1.703330000000000011e+00 -1.756999999999999951e-01 5.772070000000000256e+00 1.698830000000000062e+00 -1.818799999999999861e-01 5.866640000000000299e+00 1.712690000000000046e+00 -1.880999999999999894e-01 5.880740000000000300e+00 1.714749999999999996e+00 -1.942000000000000115e-01 5.856810000000000294e+00 1.711260000000000003e+00 -2.003099999999999881e-01 6.138060000000000294e+00 1.751870000000000038e+00 -2.064499999999999946e-01 6.406990000000000407e+00 1.789830000000000032e+00 -2.126300000000000134e-01 6.462060000000000137e+00 1.797509999999999941e+00 -2.187699999999999922e-01 6.501079999999999970e+00 1.802929999999999922e+00 -2.248999999999999888e-01 6.991179999999999950e+00 1.869650000000000034e+00 -2.310800000000000076e-01 7.014639999999999986e+00 1.872779999999999889e+00 -2.373000000000000109e-01 7.136879999999999669e+00 1.889029999999999987e+00 -2.434699999999999920e-01 7.547889999999999766e+00 1.942660000000000053e+00 -2.495900000000000063e-01 7.608620000000000161e+00 1.950460000000000083e+00 -2.557300000000000129e-01 7.913459999999999717e+00 1.989149999999999974e+00 -2.618900000000000117e-01 8.245919999999999916e+00 2.030510000000000037e+00 -2.680899999999999950e-01 8.604509999999999437e+00 2.074190000000000200e+00 -2.742499999999999938e-01 8.711750000000000327e+00 2.087070000000000203e+00 -2.803300000000000236e-01 8.863739999999999952e+00 2.105199999999999960e+00 -2.864999999999999769e-01 8.911099999999999355e+00 2.110819999999999919e+00 -2.927100000000000257e-01 9.338430000000000675e+00 2.160839999999999872e+00 +2.733000000000000013e-02 1.791495509999999967e+03 2.992905000000000015e+01 +3.091999999999999957e-02 1.477992469999999912e+03 2.718449000000000026e+01 +3.454000000000000126e-02 1.172791189999999915e+03 2.421561000000000163e+01 +3.814000000000000029e-02 9.196233300000000099e+02 2.144322000000000017e+01 +4.175000000000000239e-02 7.160111200000000053e+02 1.892102999999999824e+01 +4.544000000000000122e-02 5.391461900000000469e+02 1.641867999999999839e+01 +4.646000000000000130e-02 4.929036699999999769e+02 1.569877999999999929e+01 +4.909999999999999781e-02 4.129331099999999992e+02 1.436894000000000027e+01 +5.256000000000000255e-02 3.482022600000000239e+02 1.319473999999999947e+01 +5.272999999999999909e-02 3.242194700000000012e+02 1.273222999999999949e+01 +5.632000000000000201e-02 2.454095199999999863e+02 1.107722000000000051e+01 +5.870999999999999830e-02 2.218204599999999971e+02 1.053139000000000003e+01 +5.990000000000000185e-02 1.931666899999999885e+02 9.827680000000000859e+00 +6.356000000000000538e-02 1.505020900000000097e+02 8.674739999999999895e+00 +6.483999999999999486e-02 1.511605900000000133e+02 8.693690000000000140e+00 +6.718999999999999972e-02 1.202856799999999993e+02 7.755180000000000184e+00 +7.074999999999999345e-02 9.616129999999999711e+01 6.934020000000000294e+00 +7.097000000000000530e-02 9.870516999999999541e+01 7.025140000000000384e+00 +7.435999999999999555e-02 7.818730999999999653e+01 6.252489999999999881e+00 +7.724999999999999922e-02 6.837958000000000425e+01 5.847199999999999953e+00 +7.802000000000000601e-02 6.371482000000000312e+01 5.644239999999999924e+00 +8.165999999999999648e-02 5.179379999999999740e+01 5.088899999999999757e+00 +8.347000000000000253e-02 4.836007000000000033e+01 4.917320000000000135e+00 +8.526999999999999857e-02 4.457972000000000179e+01 4.721210000000000129e+00 +8.884000000000000230e-02 3.751116999999999990e+01 4.330770000000000231e+00 +8.963000000000000134e-02 3.544118999999999886e+01 4.209579999999999878e+00 +9.574000000000000565e-02 2.739192999999999856e+01 3.700810000000000155e+00 +1.018199999999999938e-01 2.084316000000000102e+01 3.228250000000000064e+00 +1.080399999999999971e-01 1.702296000000000120e+01 2.917440000000000033e+00 +1.142200000000000021e-01 1.391883999999999943e+01 2.638069999999999915e+00 +1.202600000000000058e-01 1.148202000000000034e+01 2.396040000000000170e+00 +1.264099999999999946e-01 9.887589999999999435e+00 2.223460000000000214e+00 +1.326199999999999879e-01 8.618710000000000093e+00 2.075899999999999856e+00 +1.388300000000000090e-01 7.875820000000000043e+00 1.984420000000000073e+00 +1.449699999999999878e-01 7.119869999999999699e+00 1.886779999999999902e+00 +1.510100000000000053e-01 6.691399999999999793e+00 1.829129999999999923e+00 +1.571799999999999864e-01 6.133020000000000138e+00 1.751139999999999919e+00 +1.634099999999999997e-01 5.984770000000000145e+00 1.729850000000000110e+00 +1.695800000000000085e-01 5.802669999999999995e+00 1.703330000000000011e+00 +1.756999999999999951e-01 5.772070000000000256e+00 1.698830000000000062e+00 +1.818799999999999861e-01 5.866640000000000299e+00 1.712690000000000046e+00 +1.880999999999999894e-01 5.880740000000000300e+00 1.714749999999999996e+00 +1.942000000000000115e-01 5.856810000000000294e+00 1.711260000000000003e+00 +2.003099999999999881e-01 6.138060000000000294e+00 1.751870000000000038e+00 +2.064499999999999946e-01 6.406990000000000407e+00 1.789830000000000032e+00 +2.126300000000000134e-01 6.462060000000000137e+00 1.797509999999999941e+00 +2.187699999999999922e-01 6.501079999999999970e+00 1.802929999999999922e+00 +2.248999999999999888e-01 6.991179999999999950e+00 1.869650000000000034e+00 +2.310800000000000076e-01 7.014639999999999986e+00 1.872779999999999889e+00 +2.373000000000000109e-01 7.136879999999999669e+00 1.889029999999999987e+00 +2.434699999999999920e-01 7.547889999999999766e+00 1.942660000000000053e+00 +2.495900000000000063e-01 7.608620000000000161e+00 1.950460000000000083e+00 +2.557300000000000129e-01 7.913459999999999717e+00 1.989149999999999974e+00 +2.618900000000000117e-01 8.245919999999999916e+00 2.030510000000000037e+00 +2.680899999999999950e-01 8.604509999999999437e+00 2.074190000000000200e+00 +2.742499999999999938e-01 8.711750000000000327e+00 2.087070000000000203e+00 +2.803300000000000236e-01 8.863739999999999952e+00 2.105199999999999960e+00 +2.864999999999999769e-01 8.911099999999999355e+00 2.110819999999999919e+00 +2.927100000000000257e-01 9.338430000000000675e+00 2.160839999999999872e+00 2.988600000000000145e-01 9.385640000000000427e+00 2.166290000000000049e+00 \ No newline at end of file diff --git a/test/mumag/Nanoperm_perpendicular_Honecker_et_al/6_1270_1640_24.331065.csv b/test/mumag/Nanoperm_perpendicular_Honecker_et_al/6_1270_1640_24.331065.csv index e7dfab999..72272ed89 100644 --- a/test/mumag/Nanoperm_perpendicular_Honecker_et_al/6_1270_1640_24.331065.csv +++ b/test/mumag/Nanoperm_perpendicular_Honecker_et_al/6_1270_1640_24.331065.csv @@ -1,60 +1,60 @@ -2.732000000000000053e-02 1.517870979999999918e+03 2.754878000000000071e+01 -3.090999999999999998e-02 1.252144950000000108e+03 2.502143999999999835e+01 -3.452999999999999819e-02 9.849326300000000174e+02 2.219157999999999831e+01 -3.812999999999999723e-02 7.635778900000000249e+02 1.953941999999999979e+01 -4.173999999999999932e-02 5.910564900000000534e+02 1.719093000000000160e+01 -4.542999999999999816e-02 4.454160299999999779e+02 1.492340000000000089e+01 -4.644000000000000211e-02 4.097451399999999921e+02 1.431337000000000081e+01 -4.907999999999999863e-02 3.412573399999999992e+02 1.306249000000000038e+01 -5.254000000000000337e-02 2.833860500000000116e+02 1.190348999999999968e+01 -5.270999999999999991e-02 2.587516299999999774e+02 1.137434999999999974e+01 -5.630000000000000282e-02 1.972410900000000140e+02 9.930790000000000006e+00 -5.868999999999999911e-02 1.820288400000000024e+02 9.540150000000000574e+00 -5.988000000000000267e-02 1.548462399999999946e+02 8.799039999999999750e+00 -6.353999999999999926e-02 1.208091600000000057e+02 7.772039999999999615e+00 -6.481000000000000649e-02 1.228846300000000014e+02 7.838510000000000311e+00 -6.716999999999999360e-02 9.485747999999999536e+01 6.886849999999999916e+00 -7.072000000000000508e-02 7.616365000000000407e+01 6.171050000000000146e+00 -7.094999999999999918e-02 7.959243999999999630e+01 6.308419999999999916e+00 -7.434000000000000330e-02 6.139544999999999675e+01 5.540549999999999642e+00 -7.721999999999999698e-02 5.528307999999999822e+01 5.257520000000000415e+00 -7.799000000000000377e-02 5.105310999999999666e+01 5.052380000000000315e+00 -8.164000000000000423e-02 4.131436000000000064e+01 4.545020000000000060e+00 -8.343000000000000416e-02 3.883191999999999666e+01 4.406349999999999767e+00 -8.523999999999999633e-02 3.386838999999999800e+01 4.115120000000000111e+00 -8.881000000000000005e-02 2.873742000000000019e+01 3.790610000000000035e+00 -8.959999999999999909e-02 2.744166999999999845e+01 3.704159999999999897e+00 -9.569999999999999341e-02 2.114314999999999856e+01 3.251399999999999846e+00 -1.017799999999999955e-01 1.639198000000000022e+01 2.862859999999999960e+00 -1.079999999999999988e-01 1.302345000000000041e+01 2.551810000000000134e+00 -1.141699999999999937e-01 1.067233000000000054e+01 2.310010000000000119e+00 -1.202099999999999974e-01 8.927680000000000504e+00 2.112779999999999880e+00 -1.263600000000000001e-01 7.691300000000000026e+00 1.961030000000000051e+00 -1.325600000000000112e-01 6.633219999999999672e+00 1.821159999999999890e+00 -1.387799999999999867e-01 6.187759999999999927e+00 1.758939999999999948e+00 -1.449100000000000110e-01 5.397269999999999790e+00 1.642749999999999932e+00 -1.509500000000000008e-01 5.127299999999999969e+00 1.601140000000000008e+00 -1.571200000000000097e-01 4.947350000000000136e+00 1.572789999999999910e+00 -1.633400000000000130e-01 4.791970000000000063e+00 1.547900000000000054e+00 -1.695200000000000040e-01 4.839830000000000076e+00 1.555609999999999937e+00 -1.756399999999999906e-01 4.855599999999999916e+00 1.558140000000000081e+00 -1.818099999999999994e-01 4.971189999999999998e+00 1.576580000000000092e+00 -1.880199999999999927e-01 4.996179999999999843e+00 1.580540000000000056e+00 -1.941299999999999970e-01 5.231489999999999974e+00 1.617329999999999934e+00 -2.002299999999999913e-01 5.461660000000000181e+00 1.652519999999999989e+00 -2.063699999999999979e-01 5.566430000000000433e+00 1.668299999999999894e+00 -2.125400000000000067e-01 5.749649999999999928e+00 1.695529999999999982e+00 -2.186899999999999955e-01 5.962720000000000020e+00 1.726660000000000084e+00 -2.248100000000000098e-01 6.366220000000000212e+00 1.784129999999999994e+00 -2.309900000000000009e-01 6.576419999999999710e+00 1.813339999999999952e+00 -2.372100000000000042e-01 6.993730000000000224e+00 1.869990000000000041e+00 -2.433800000000000130e-01 7.112300000000000288e+00 1.885780000000000012e+00 -2.494999999999999996e-01 7.346860000000000390e+00 1.916619999999999990e+00 -2.556300000000000239e-01 7.629410000000000025e+00 1.953130000000000033e+00 -2.617900000000000227e-01 7.827810000000000379e+00 1.978359999999999896e+00 -2.679900000000000060e-01 8.252810000000000201e+00 2.031359999999999832e+00 -2.741399999999999948e-01 8.304840000000000444e+00 2.037749999999999950e+00 -2.802200000000000246e-01 8.705450000000000799e+00 2.086320000000000174e+00 -2.863899999999999779e-01 8.881330000000000169e+00 2.107289999999999885e+00 -2.926000000000000267e-01 9.112230000000000274e+00 2.134510000000000129e+00 -2.987500000000000155e-01 9.303969999999999629e+00 2.156849999999999934e+00 +2.732000000000000053e-02 1.517870979999999918e+03 2.754878000000000071e+01 +3.090999999999999998e-02 1.252144950000000108e+03 2.502143999999999835e+01 +3.452999999999999819e-02 9.849326300000000174e+02 2.219157999999999831e+01 +3.812999999999999723e-02 7.635778900000000249e+02 1.953941999999999979e+01 +4.173999999999999932e-02 5.910564900000000534e+02 1.719093000000000160e+01 +4.542999999999999816e-02 4.454160299999999779e+02 1.492340000000000089e+01 +4.644000000000000211e-02 4.097451399999999921e+02 1.431337000000000081e+01 +4.907999999999999863e-02 3.412573399999999992e+02 1.306249000000000038e+01 +5.254000000000000337e-02 2.833860500000000116e+02 1.190348999999999968e+01 +5.270999999999999991e-02 2.587516299999999774e+02 1.137434999999999974e+01 +5.630000000000000282e-02 1.972410900000000140e+02 9.930790000000000006e+00 +5.868999999999999911e-02 1.820288400000000024e+02 9.540150000000000574e+00 +5.988000000000000267e-02 1.548462399999999946e+02 8.799039999999999750e+00 +6.353999999999999926e-02 1.208091600000000057e+02 7.772039999999999615e+00 +6.481000000000000649e-02 1.228846300000000014e+02 7.838510000000000311e+00 +6.716999999999999360e-02 9.485747999999999536e+01 6.886849999999999916e+00 +7.072000000000000508e-02 7.616365000000000407e+01 6.171050000000000146e+00 +7.094999999999999918e-02 7.959243999999999630e+01 6.308419999999999916e+00 +7.434000000000000330e-02 6.139544999999999675e+01 5.540549999999999642e+00 +7.721999999999999698e-02 5.528307999999999822e+01 5.257520000000000415e+00 +7.799000000000000377e-02 5.105310999999999666e+01 5.052380000000000315e+00 +8.164000000000000423e-02 4.131436000000000064e+01 4.545020000000000060e+00 +8.343000000000000416e-02 3.883191999999999666e+01 4.406349999999999767e+00 +8.523999999999999633e-02 3.386838999999999800e+01 4.115120000000000111e+00 +8.881000000000000005e-02 2.873742000000000019e+01 3.790610000000000035e+00 +8.959999999999999909e-02 2.744166999999999845e+01 3.704159999999999897e+00 +9.569999999999999341e-02 2.114314999999999856e+01 3.251399999999999846e+00 +1.017799999999999955e-01 1.639198000000000022e+01 2.862859999999999960e+00 +1.079999999999999988e-01 1.302345000000000041e+01 2.551810000000000134e+00 +1.141699999999999937e-01 1.067233000000000054e+01 2.310010000000000119e+00 +1.202099999999999974e-01 8.927680000000000504e+00 2.112779999999999880e+00 +1.263600000000000001e-01 7.691300000000000026e+00 1.961030000000000051e+00 +1.325600000000000112e-01 6.633219999999999672e+00 1.821159999999999890e+00 +1.387799999999999867e-01 6.187759999999999927e+00 1.758939999999999948e+00 +1.449100000000000110e-01 5.397269999999999790e+00 1.642749999999999932e+00 +1.509500000000000008e-01 5.127299999999999969e+00 1.601140000000000008e+00 +1.571200000000000097e-01 4.947350000000000136e+00 1.572789999999999910e+00 +1.633400000000000130e-01 4.791970000000000063e+00 1.547900000000000054e+00 +1.695200000000000040e-01 4.839830000000000076e+00 1.555609999999999937e+00 +1.756399999999999906e-01 4.855599999999999916e+00 1.558140000000000081e+00 +1.818099999999999994e-01 4.971189999999999998e+00 1.576580000000000092e+00 +1.880199999999999927e-01 4.996179999999999843e+00 1.580540000000000056e+00 +1.941299999999999970e-01 5.231489999999999974e+00 1.617329999999999934e+00 +2.002299999999999913e-01 5.461660000000000181e+00 1.652519999999999989e+00 +2.063699999999999979e-01 5.566430000000000433e+00 1.668299999999999894e+00 +2.125400000000000067e-01 5.749649999999999928e+00 1.695529999999999982e+00 +2.186899999999999955e-01 5.962720000000000020e+00 1.726660000000000084e+00 +2.248100000000000098e-01 6.366220000000000212e+00 1.784129999999999994e+00 +2.309900000000000009e-01 6.576419999999999710e+00 1.813339999999999952e+00 +2.372100000000000042e-01 6.993730000000000224e+00 1.869990000000000041e+00 +2.433800000000000130e-01 7.112300000000000288e+00 1.885780000000000012e+00 +2.494999999999999996e-01 7.346860000000000390e+00 1.916619999999999990e+00 +2.556300000000000239e-01 7.629410000000000025e+00 1.953130000000000033e+00 +2.617900000000000227e-01 7.827810000000000379e+00 1.978359999999999896e+00 +2.679900000000000060e-01 8.252810000000000201e+00 2.031359999999999832e+00 +2.741399999999999948e-01 8.304840000000000444e+00 2.037749999999999950e+00 +2.802200000000000246e-01 8.705450000000000799e+00 2.086320000000000174e+00 +2.863899999999999779e-01 8.881330000000000169e+00 2.107289999999999885e+00 +2.926000000000000267e-01 9.112230000000000274e+00 2.134510000000000129e+00 +2.987500000000000155e-01 9.303969999999999629e+00 2.156849999999999934e+00 diff --git a/test/mumag/NdFeB_parallel_Bick_et_al/1_8000_1600_1070.csv b/test/mumag/NdFeB_parallel_Bick_et_al/1_8000_1600_1070.csv new file mode 100644 index 000000000..efaf03f7e --- /dev/null +++ b/test/mumag/NdFeB_parallel_Bick_et_al/1_8000_1600_1070.csv @@ -0,0 +1,53 @@ +0.02466 11161.7 105.066 +0.02779 8582.24 78.8702 +0.03118 6929.14 63.4309 +0.03472 5567.83 52.0489 +0.03798 4896.87 48.9428 +0.04103 4301.45 44.2537 +0.04439 3931.56 35.32 +0.04789 3532.24 33.8506 +0.05145 3225.93 29.1479 +0.05487 3001.52 30.0366 +0.05809 2808.67 26.8966 +0.06147 2656.59 24.6464 +0.06487 2544.49 24.3544 +0.06823 2417.04 22.1946 +0.07159 2285.04 21.753 +0.07491 2209.24 20.4624 +0.07817 2057.47 19.703 +0.08149 2022.7 18.6311 +0.08492 1895.55 17.4353 +0.08832 1842.28 17.2068 +0.09171 1764.56 16.4013 +0.09497 1702.47 16.2564 +0.09818 1650.68 15.7993 +0.10176 1598.61 13.5448 +0.10537 1517.07 14.6455 +0.10864 1470.19 13.6872 +0.11191 1422.64 13.7771 +0.11529 1373.82 12.5952 +0.11874 1333.67 12.468 +0.12204 1309.38 12.7116 +0.1253 1256.04 11.6755 +0.12868 1224.03 11.535 +0.13213 1180.94 10.9145 +0.13557 1163.16 10.9427 +0.13878 1135.89 11.2995 +0.14204 1129.91 10.3422 +0.14544 1101.7 10.3463 +0.14888 1050.46 9.68171 +0.1523 1034.3 9.79525 +0.15558 1022.51 9.86417 +0.15895 1003.15 9.06883 +0.16231 984.02 9.61305 +0.16567 956.076 8.69603 +0.16916 941.039 8.81872 +0.17256 914.22 8.5457 +0.1759 903.557 8.49062 +0.1792 862.822 8.49027 +0.18246 857.39 8.12443 +0.18596 822.372 7.58423 +0.18945 803.539 7.77639 +0.19275 787.933 7.6279 +0.19605 759.06 7.64242 +0.1993 746.444 7.32989 diff --git a/test/mumag/NdFeB_parallel_Bick_et_al/2_10000_1600_1070.csv b/test/mumag/NdFeB_parallel_Bick_et_al/2_10000_1600_1070.csv new file mode 100644 index 000000000..ede4f8121 --- /dev/null +++ b/test/mumag/NdFeB_parallel_Bick_et_al/2_10000_1600_1070.csv @@ -0,0 +1,53 @@ +0.02466 9785.87 100.498 +0.02779 7387.61 74.8808 +0.03118 5638.9 58.6706 +0.03472 4473.77 47.7572 +0.03797 3723.19 43.7134 +0.04102 3256.4 39.3915 +0.04439 2850.7 30.7019 +0.04789 2561.59 29.3595 +0.05145 2280.01 24.9612 +0.05487 2158.85 25.8372 +0.05809 1997.24 23.0262 +0.06147 1891.61 21.0832 +0.06486 1796.03 20.6896 +0.06823 1698.02 18.8045 +0.07158 1613.84 18.4277 +0.0749 1560.07 17.3367 +0.07817 1481.58 16.8421 +0.08149 1400.5 15.6189 +0.08492 1362.71 14.8771 +0.08832 1326.21 14.6884 +0.09171 1308.1 14.1935 +0.09497 1238.48 13.9232 +0.09817 1217.12 13.6217 +0.10176 1182.01 11.7148 +0.10536 1125.29 12.6688 +0.10863 1086.39 11.8029 +0.1119 1069.27 11.9783 +0.11528 1037.53 10.9946 +0.11874 1000.25 10.8391 +0.12203 1030.21 11.3207 +0.12529 996.562 10.4091 +0.12867 937.635 10.1418 +0.13213 932.787 9.7458 +0.13557 936.093 9.83598 +0.13878 902.903 10.118 +0.14204 895.331 9.2379 +0.14544 894.523 9.3444 +0.14887 873.213 8.84172 +0.15229 870.028 8.99453 +0.15558 846.466 8.9992 +0.15895 842.358 8.32813 +0.1623 809.53 8.74144 +0.16566 822.783 8.08431 +0.16915 792.943 8.10552 +0.17255 774.308 7.87783 +0.1759 781.539 7.90816 +0.17919 756.562 7.97296 +0.18245 745.925 7.59066 +0.18596 725.982 7.13904 +0.18944 711.483 7.3287 +0.19275 709.157 7.24903 +0.19604 677.704 7.2411 +0.19929 659.648 6.90112 diff --git a/test/mumag/NdFeB_parallel_Bick_et_al/3_12000_1600_1070.csv b/test/mumag/NdFeB_parallel_Bick_et_al/3_12000_1600_1070.csv new file mode 100644 index 000000000..1c96f3d5f --- /dev/null +++ b/test/mumag/NdFeB_parallel_Bick_et_al/3_12000_1600_1070.csv @@ -0,0 +1,53 @@ +0.02467 9119.79 98.2483 +0.02779 6716.34 72.6007 +0.03118 4992.66 56.2161 +0.03472 3831.98 45.1388 +0.03798 3145.6 40.9924 +0.04103 2635.02 36.2785 +0.0444 2353.33 28.4064 +0.04789 2051.02 26.7601 +0.05146 1820.51 22.7202 +0.05487 1702.5 23.3101 +0.0581 1582.43 20.8224 +0.06148 1455.78 18.7977 +0.06487 1396.8 18.5029 +0.06824 1347.58 16.9495 +0.07159 1258.02 16.4371 +0.07491 1231.28 15.5554 +0.07818 1164.47 15.0776 +0.0815 1146.97 14.2378 +0.08493 1109.77 13.533 +0.08833 1040.08 13.1167 +0.09172 1030.03 12.6919 +0.09498 996.502 12.5769 +0.09819 973.153 12.2625 +0.10178 933.855 10.4847 +0.10538 941.324 11.6421 +0.10865 891.14 10.747 +0.11192 890.927 10.9919 +0.1153 863.999 10.0862 +0.11876 860.652 10.1051 +0.12205 833.905 10.2392 +0.12531 831.414 9.54046 +0.12869 796.354 9.38666 +0.13215 809.376 9.11842 +0.13559 805.133 9.14629 +0.1388 791.474 9.50691 +0.14205 787.287 8.69915 +0.14546 761.22 8.65866 +0.1489 779.201 8.38098 +0.15232 771.323 8.50152 +0.1556 748.08 8.49235 +0.15897 748.238 7.8713 +0.16233 756.864 8.48551 +0.16569 723.545 7.61209 +0.16918 723.039 7.76626 +0.17258 714.249 7.58349 +0.17592 707.068 7.55031 +0.17922 695.999 7.67253 +0.18248 687.854 7.31121 +0.18599 672.503 6.89206 +0.18947 656.046 7.05985 +0.19277 644.64 6.93548 +0.19607 633.62 7.0287 +0.19932 617.369 6.7009 diff --git a/test/mumag/NdFeB_parallel_Bick_et_al/4_14000_1600_1070.csv b/test/mumag/NdFeB_parallel_Bick_et_al/4_14000_1600_1070.csv new file mode 100644 index 000000000..e349acefe --- /dev/null +++ b/test/mumag/NdFeB_parallel_Bick_et_al/4_14000_1600_1070.csv @@ -0,0 +1,53 @@ +0.02466 8578.27 96.3713 +0.02778 6201.5 70.6884 +0.03117 4666.55 54.9081 +0.03471 3532.71 43.8556 +0.03797 2779.72 39.1195 +0.04102 2401.14 35.0436 +0.04438 2010.93 26.6446 +0.04788 1789.13 25.3004 +0.05144 1629 21.7057 +0.05485 1414.39 21.5471 +0.05808 1338.47 19.3969 +0.06145 1255.55 17.6425 +0.06485 1194.78 17.2789 +0.06822 1131.88 15.6792 +0.07157 1093.29 15.4062 +0.07489 1076.75 14.6325 +0.07815 990.83 13.9891 +0.08147 993.984 13.3123 +0.0849 949.429 12.5828 +0.0883 906.082 12.3081 +0.09169 901.543 11.9196 +0.09495 883.023 11.8721 +0.09815 842.784 11.4424 +0.10174 819.526 9.8676 +0.10534 802.736 10.7893 +0.10861 795.767 10.1828 +0.11188 791.163 10.3837 +0.11526 783.07 9.63416 +0.11872 771.734 9.59199 +0.12201 755.014 9.75865 +0.12527 763.25 9.14929 +0.12865 738.983 9.05459 +0.1321 735.65 8.71334 +0.13554 713.743 8.62175 +0.13875 720.548 9.08471 +0.142 726.975 8.37203 +0.14541 705.893 8.34698 +0.14884 717.099 8.0504 +0.15226 709.825 8.16294 +0.15554 709.595 8.27884 +0.15891 699.293 7.61937 +0.16227 704.678 8.19256 +0.16563 698.926 7.48706 +0.16912 685.563 7.56396 +0.17251 673.043 7.36594 +0.17586 671.398 7.36238 +0.17915 664.082 7.50135 +0.18241 667.157 7.20373 +0.18592 646.099 6.75787 +0.1894 640.973 6.98357 +0.1927 634.489 6.88246 +0.196 608.639 6.89728 +0.19924 599.163 6.60299 diff --git a/test/mumag/NdFeB_parallel_Bick_et_al/5_16000_1600_1070.csv b/test/mumag/NdFeB_parallel_Bick_et_al/5_16000_1600_1070.csv new file mode 100644 index 000000000..03d157c58 --- /dev/null +++ b/test/mumag/NdFeB_parallel_Bick_et_al/5_16000_1600_1070.csv @@ -0,0 +1,53 @@ +0.02466 8403.24 95.8365 +0.02779 5866.26 69.5434 +0.03118 4356.78 53.6923 +0.03472 3299.25 42.8649 +0.03798 2597.38 38.2386 +0.04103 2129.79 33.557 +0.04439 1878.69 25.9888 +0.04789 1624.61 24.3861 +0.05145 1439.52 20.6737 +0.05487 1263.65 20.5759 +0.05809 1171.99 18.386 +0.06147 1079.56 16.577 +0.06487 1041.15 16.3129 +0.06823 1001.7 14.8847 +0.07159 961.645 14.563 +0.07491 923.442 13.6706 +0.07817 896.915 13.3973 +0.08149 883.652 12.6286 +0.08492 862.753 12.0581 +0.08832 824.722 11.795 +0.09171 784.35 11.1756 +0.09497 769.294 11.1579 +0.09818 755.349 10.8901 +0.10176 749.016 9.48228 +0.10537 742.393 10.4072 +0.10864 731.812 9.80011 +0.11191 725.902 9.97489 +0.11529 687.755 9.06119 +0.11874 695.826 9.13917 +0.12204 706.826 9.47552 +0.1253 686.062 8.69528 +0.12868 672.907 8.67583 +0.13213 693.14 8.48682 +0.13557 670.728 8.38538 +0.13878 665.705 8.76139 +0.14204 671.833 8.08011 +0.14544 675.608 8.18129 +0.14888 672.094 7.81614 +0.1523 674.683 7.97469 +0.15558 656.506 7.99112 +0.15895 676.236 7.50792 +0.16231 665.98 7.99164 +0.16567 649.237 7.2359 +0.16916 663.887 7.46039 +0.17256 654.732 7.28088 +0.1759 649.138 7.26044 +0.1792 637.918 7.36805 +0.18246 634.954 7.04588 +0.18596 615.952 6.61209 +0.18945 606.075 6.80618 +0.19275 602.38 6.72418 +0.19605 583.877 6.77081 +0.1993 592.832 6.58159 diff --git a/test/quantities/utest_math_operations.py b/test/quantities/utest_math_operations.py index 13fb27aa4..11d0b11b3 100644 --- a/test/quantities/utest_math_operations.py +++ b/test/quantities/utest_math_operations.py @@ -1,152 +1,164 @@ -""" Tests for math operations """ - -import numpy as np -import pytest - -from sasdata.quantities import units -from sasdata.quantities.quantity import NamedQuantity, tensordot, transpose - -order_list = [ - [0, 1, 2, 3], - [0, 2, 1], - [1, 0], - [0, 1], - [2, 0, 1], - [3, 1, 2, 0] -] - -@pytest.mark.parametrize("order", order_list) -def test_transpose_raw(order: list[int]): - """ Check that the transpose operation changes the order of indices correctly - uses sizes as way of tracking""" - - input_shape = tuple([i+1 for i in range(len(order))]) - expected_shape = tuple([i+1 for i in order]) - - input_mat = np.zeros(input_shape) - - measured_mat = transpose(input_mat, axes=tuple(order)) - - assert measured_mat.shape == expected_shape - - -@pytest.mark.parametrize("order", order_list) -def test_transpose_raw_with_quantity(order: list[int]): - """ Check that the transpose operation changes the order of indices correctly - uses sizes as way of tracking""" - input_shape = tuple([i + 1 for i in range(len(order))]) - expected_shape = tuple([i + 1 for i in order]) - - input_mat = NamedQuantity("testmat", np.zeros(input_shape), units=units.none) - - measured_mat = transpose(input_mat, axes=tuple(order)) - - assert measured_mat.value.shape == expected_shape - - -rng_seed = 1979 -tensor_product_with_identity_sizes = (4,6,5) - -@pytest.mark.parametrize("index, size", [tup for tup in enumerate(tensor_product_with_identity_sizes)]) -def test_tensor_product_with_identity_quantities(index, size): - """ Check the correctness of the tensor product by multiplying by the identity (quantity, quantity)""" - np.random.seed(rng_seed) - - x = NamedQuantity("x", np.random.rand(*tensor_product_with_identity_sizes), units=units.meters) - y = NamedQuantity("y", np.eye(size), units.seconds) - - z = tensordot(x, y, index, 0) - - # Check units - assert z.units == units.meters * units.seconds - - # Expected sizes - last index gets moved to end - output_order = [i for i in (0, 1, 2) if i != index] + [index] - output_sizes = [tensor_product_with_identity_sizes[i] for i in output_order] - - assert z.value.shape == tuple(output_sizes) - - # Restore original order and check - reverse_order = [-1, -1, -1] - for to_index, from_index in enumerate(output_order): - reverse_order[from_index] = to_index - - z_reordered = transpose(z, axes = tuple(reverse_order)) - - assert z_reordered.value.shape == tensor_product_with_identity_sizes - - # Check values - - mat_in = x.in_si() - mat_out = transpose(z, axes=tuple(reverse_order)).in_si() - - assert np.all(np.abs(mat_in - mat_out) < 1e-10) - - -@pytest.mark.parametrize("index, size", [tup for tup in enumerate(tensor_product_with_identity_sizes)]) -def test_tensor_product_with_identity_quantity_matrix(index, size): - """ Check the correctness of the tensor product by multiplying by the identity (quantity, matrix)""" - np.random.seed(rng_seed) - - x = NamedQuantity("x", np.random.rand(*tensor_product_with_identity_sizes), units.meters) - y = np.eye(size) - - z = tensordot(x, y, index, 0) - - assert z.units == units.meters - - # Expected sizes - last index gets moved to end - output_order = [i for i in (0, 1, 2) if i != index] + [index] - output_sizes = [tensor_product_with_identity_sizes[i] for i in output_order] - - assert z.value.shape == tuple(output_sizes) - - # Restore original order and check - reverse_order = [-1, -1, -1] - for to_index, from_index in enumerate(output_order): - reverse_order[from_index] = to_index - - z_reordered = transpose(z, axes = tuple(reverse_order)) - - assert z_reordered.value.shape == tensor_product_with_identity_sizes - - # Check values - - mat_in = x.in_si() - mat_out = transpose(z, axes=tuple(reverse_order)).in_si() - - assert np.all(np.abs(mat_in - mat_out) < 1e-10) - - -@pytest.mark.parametrize("index, size", [tup for tup in enumerate(tensor_product_with_identity_sizes)]) -def test_tensor_product_with_identity_matrix_quantity(index, size): - """ Check the correctness of the tensor product by multiplying by the identity (matrix, quantity)""" - np.random.seed(rng_seed) - - x = np.random.rand(*tensor_product_with_identity_sizes) - y = NamedQuantity("y", np.eye(size), units.seconds) - - z = tensordot(x, y, index, 0) - - assert z.units == units.seconds - - - # Expected sizes - last index gets moved to end - output_order = [i for i in (0, 1, 2) if i != index] + [index] - output_sizes = [tensor_product_with_identity_sizes[i] for i in output_order] - - assert z.value.shape == tuple(output_sizes) - - # Restore original order and check - reverse_order = [-1, -1, -1] - for to_index, from_index in enumerate(output_order): - reverse_order[from_index] = to_index - - z_reordered = transpose(z, axes = tuple(reverse_order)) - - assert z_reordered.value.shape == tensor_product_with_identity_sizes - - # Check values - - mat_in = x - mat_out = transpose(z, axes=tuple(reverse_order)).in_si() - - assert np.all(np.abs(mat_in - mat_out) < 1e-10) +"""Tests for math operations""" + +import numpy as np +import pytest + +from sasdata.quantities import units +from sasdata.quantities.quantity import NamedQuantity, matinv, tensordot, trace, transpose + +order_list = [[0, 1, 2, 3], [0, 2, 1], [1, 0], [0, 1], [2, 0, 1], [3, 1, 2, 0]] + + +@pytest.mark.parametrize("order", order_list) +def test_transpose(order: list[int]): + """Check that the transpose operation changes the order of indices correctly for raw data and quantities - uses sizes as way of tracking""" + + input_shape = tuple([i + 1 for i in range(len(order))]) + expected_shape = tuple([i + 1 for i in order]) + + input_mat = np.zeros(input_shape) + input_quantity = NamedQuantity("testmat", np.zeros(input_shape), units=units.none) + + measured_mat = transpose(input_mat, axes=tuple(order)) + measured_quantity = transpose(input_quantity, axes=tuple(order)) + + assert measured_mat.shape == expected_shape + assert measured_quantity.value.shape == expected_shape + + +@pytest.mark.parametrize( + "matrix, offset, expected_trace", + [ + (np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), 0, 15), + (np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), 1, 8), + (np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), 2, 3), + (np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), -1, 12), + ], +) +def test_trace_offset(matrix, offset, expected_trace): + """Check that the trace operation correctly identifies the offset value for raw data and quantities.""" + assert (trace(matrix, offset=offset) == expected_trace).all() + assert (trace(NamedQuantity("testmat", matrix, units=units.none), offset).value == expected_trace).all() + + +@pytest.mark.parametrize( + "matrix, axis1, axis2, expected_trace", + [ + (np.array([[[1, 2], [3, 4]], [[1, 2], [3, 4]], [[1, 2], [3, 4]]]), 0, 1, np.array([4, 6])), + (np.array([[[1, 2], [3, 4]], [[1, 2], [3, 4]], [[1, 2], [3, 4]]]), 1, 2, np.array([5, 5, 5])), + (np.array([[[1, 2], [3, 4]], [[1, 2], [3, 4]], [[1, 2], [3, 4]]]), 0, 2, np.array([3, 7])), + ], +) +def test_trace_axes(matrix, axis1, axis2, expected_trace): + """Check that the trace operation correctly identifies the offset value for raw data and quantities.""" + assert (trace(matrix, axis1=axis1, axis2=axis2) == expected_trace).all() + assert ( + trace(NamedQuantity("testmat", matrix, units=units.none), axis1=axis1, axis2=axis2).value == expected_trace + ).all() + + +@pytest.mark.parametrize( + "matrix, expected_inverse", + [ + (np.array([[1]]), np.array([[1]])), + (np.array([[-2.0, 1.0], [1.5, -0.5]]), np.array([[1, 2], [3, 4]])), + ], +) +def test_inverse(matrix, expected_inverse): + """Check that the matinv operation correctly inverse for raw data and quantities.""" + print(matinv(matrix)) + print(expected_inverse) + assert (matinv(matrix) == expected_inverse).all() + assert (matinv(NamedQuantity("testmat", matrix, units=units.none)).value == expected_inverse).all() + + +rng_seed = 1979 +tensor_product_with_identity_sizes = (4, 6, 5) + + +@pytest.mark.parametrize( + "x, x_unit", + [ + (NamedQuantity("x", np.random.rand(*tensor_product_with_identity_sizes), units=units.meters), units.meters), + ((np.random.rand(*tensor_product_with_identity_sizes), units.none)), + ], +) +@pytest.mark.parametrize("index, size", [tup for tup in enumerate(tensor_product_with_identity_sizes)]) +def test_tensor_product_with_identity_quantities(x, x_unit, index, size): + """Check the correctness of the tensor product by multiplying by the identity (quantity, quantity)""" + np.random.seed(rng_seed) + y = NamedQuantity("y", np.eye(size), units.seconds) + + z = tensordot(x, y, index, 0) + + # Check units + assert z.units == x_unit * units.seconds + + # Expected sizes - last index gets moved to end + output_order = [i for i in (0, 1, 2) if i != index] + [index] + output_sizes = [tensor_product_with_identity_sizes[i] for i in output_order] + + assert z.value.shape == tuple(output_sizes) + + # Restore original order and check + reverse_order = [-1, -1, -1] + for to_index, from_index in enumerate(output_order): + reverse_order[from_index] = to_index + + z_reordered = transpose(z, axes=tuple(reverse_order)) + + assert z_reordered.value.shape == tensor_product_with_identity_sizes + + # Check values + + try: + mat_in = x.in_si() + except AttributeError: + mat_in = x + + mat_out = transpose(z, axes=tuple(reverse_order)).in_si() + + assert np.all(np.abs(mat_in - mat_out) < 1e-10) + + +@pytest.mark.parametrize( + "x, x_unit", + [ + (NamedQuantity("x", np.random.rand(*tensor_product_with_identity_sizes), units=units.meters), units.meters), + ], +) +@pytest.mark.parametrize("index, size", [tup for tup in enumerate(tensor_product_with_identity_sizes)]) +def test_tensor_product_with_identity_quantity_matrix(x, x_unit, index, size): + """Check the correctness of the tensor product by multiplying by the identity (quantity, matrix)""" + np.random.seed(rng_seed) + y = np.eye(size) + + z = tensordot(x, y, index, 0) + + assert z.units == x_unit + + # Expected sizes - last index gets moved to end + output_order = [i for i in (0, 1, 2) if i != index] + [index] + output_sizes = [tensor_product_with_identity_sizes[i] for i in output_order] + + assert z.value.shape == tuple(output_sizes) + + # Restore original order and check + reverse_order = [-1, -1, -1] + for to_index, from_index in enumerate(output_order): + reverse_order[from_index] = to_index + + z_reordered = transpose(z, axes=tuple(reverse_order)) + + assert z_reordered.value.shape == tensor_product_with_identity_sizes + + # Check values + + try: + mat_in = x.in_si() + except AttributeError: + mat_in = x + + mat_out = transpose(z, axes=tuple(reverse_order)).in_si() + + assert np.all(np.abs(mat_in - mat_out) < 1e-10) diff --git a/test/quantities/utest_operations.py b/test/quantities/utest_operations.py index 2bfc400a4..77a9faa54 100644 --- a/test/quantities/utest_operations.py +++ b/test/quantities/utest_operations.py @@ -1,36 +1,82 @@ +import math + +import numpy as np import pytest from sasdata.quantities.quantity import ( Add, AdditiveIdentity, + ArcCos, + ArcSin, + ArcTan, Constant, + Cos, Div, + Dot, + Exp, Inv, + Ln, + Log, + MatInv, + MatMul, + MatrixIdentity, Mul, MultiplicativeIdentity, Neg, + Norm_1, + Norm_2, Operation, Pow, + Sin, Sub, + Tan, + Trace, + Transpose, Variable, ) -operation_with_everything = \ - Div( - Pow( - Mul( - Sub( - Add( - Neg(Inv(MultiplicativeIdentity())), - Variable("x")), - Constant(7)), - AdditiveIdentity()), - 2), - Variable("y")) +x = Variable("x") +y = Variable("y") +z = Variable("z") -def test_serialise_deserialise(): - print(operation_with_everything._serialise_json()) +operation_with_everything = Div( + Pow( + Mul( + Sub(Add(Neg(Inv(MultiplicativeIdentity())), Ln(Transpose(x))), Log(Constant(7), 2)), + AdditiveIdentity(), + ), + 2, + ), + y, +) + + +@pytest.fixture(params=[Inv, Exp, Ln, MatInv, Neg, Sin, ArcSin, Cos, ArcCos, Tan, ArcTan, Transpose]) +def unary_operation(request): + return request.param(x) + + +@pytest.fixture(params=[Add, Div, Dot, MatMul, Mul, Sub]) +def binary_operation(request): + return request.param(x, y) + + +@pytest.fixture(params=[Log, Pow]) +def log_pow_operation(request): + return request.param(x, 2) + + +@pytest.fixture(params=[Transpose, Norm_1, Norm_2]) +def axis_operation(request): + return request.param(x, (0,)) + +@pytest.fixture(params=[Transpose, Norm_1, Norm_2]) +def axis_none_operation(request): + return request.param(x, None) + + +def test_serialise_deserialise(): serialised = operation_with_everything.serialise() deserialised = Operation.deserialise(serialised) reserialised = deserialised.serialise() @@ -38,41 +84,259 @@ def test_serialise_deserialise(): assert serialised == reserialised -@pytest.mark.parametrize("op, a, b, result", [ - (Add, 1, 1, 2), - (Add, 7, 8, 15), - (Sub, 1, 1, 0), - (Sub, 7, 8, -1), - (Mul, 1, 1, 1), - (Mul, 7, 8, 56), - (Div, 1, 1, 1), - (Div, 7, 8, 7/8), - (Pow, 1, 1, 1), - (Pow, 7, 2, 49)]) +def test_unary_serialise_deserialise(unary_operation): + serialised = unary_operation.serialise() + deserialised = Operation.deserialise(serialised) + reserialised = deserialised.serialise() + + assert serialised == reserialised + + +def test_binary_serialise_deserialise(binary_operation): + serialised = binary_operation.serialise() + deserialised = Operation.deserialise(serialised) + reserialised = deserialised.serialise() + + assert serialised == reserialised + + +def test_log_pow_serialise_deserialise(log_pow_operation): + serialised = log_pow_operation.serialise() + deserialised = Operation.deserialise(serialised) + reserialised = deserialised.serialise() + + assert serialised == reserialised + + +def test_axis_serialise_deserialise(axis_operation): + serialised = axis_operation.serialise() + deserialised = Operation.deserialise(serialised) + reserialised = deserialised.serialise() + + assert serialised == reserialised + + +def test_axis_none_serialise_deserialise(axis_none_operation): + serialised = axis_none_operation.serialise() + deserialised = Operation.deserialise(serialised) + reserialised = deserialised.serialise() + + assert serialised == reserialised + + +def test_trace_serialise_deserialise(): + serialised = Trace(x).serialise() + deserialised = Operation.deserialise(serialised) + reserialised = deserialised.serialise() + + assert serialised == reserialised + + +@pytest.mark.parametrize( + "op, summary", + [(AdditiveIdentity, "0 [Add.Id.]"), (MultiplicativeIdentity, "1 [Mul.Id.]"), (Operation, "Operation(\n)")], +) +def test_summary(op, summary): + f = op() + assert f.summary() == summary + + +def test_matrix_id_summary(): + f = MatrixIdentity(1) + assert f.summary() == "1 [Matrix Id.]" + + +def test_variable_summary(): + assert x.summary() == "x" + + +def test_unary_summary(unary_operation): + assert unary_operation.summary() == f"{unary_operation.__class__.__name__}(\n x\n)" + + +def test_binary_summary(binary_operation): + assert binary_operation.summary() == f"{binary_operation.__class__.__name__}(\n x\n y\n)" + + +def test_log_pow_summary(log_pow_operation): + assert log_pow_operation.summary() == f"{log_pow_operation.__class__.__name__}(\n x\n 2\n)" + + +def test_axis_summary(axis_operation): + assert axis_operation.summary() == f"{axis_operation.__class__.__name__}(\n x\n [0]\n)" + + +def test_axis_none_summary(axis_none_operation): + assert axis_none_operation.summary() == f"{axis_none_operation.__class__.__name__}(\n x\n)" + + +def test_trace_summary(): + op = Trace(x) + assert op.summary() == f"{op.__class__.__name__}(\n x\n 0\n 0\n 1\n)" + + +@pytest.mark.parametrize("op, result", [(AdditiveIdentity, 0), (MultiplicativeIdentity, 1), (Operation, None)]) +def test_evaluation(op, result): + f = op() + assert f.evaluate({}) == result + + +@pytest.mark.parametrize( + "op, a, result", + [ + (Neg, 1, -1), + (Neg, -7, 7), + (Inv, 2, 0.5), + (Inv, 0.125, 8), + (Exp, 1, math.e), + (Exp, math.log(5.0), pytest.approx(5.0)), + (Ln, np.sqrt(math.e), 0.5), + (Ln, math.e**5, pytest.approx(5.0)), + (Sin, math.pi / 6.0, pytest.approx(0.5)), + (Sin, 0.5 * math.pi, pytest.approx(1.0)), + (Cos, 0.0, pytest.approx(1.0)), + (Cos, math.pi / 3.0, pytest.approx(0.5)), + (Tan, 0.0, pytest.approx(0.0)), + (Tan, 0.25 * math.pi, pytest.approx(1.0)), + (ArcSin, 1.0, 0.5 * math.pi), + (ArcSin, -1.0, -0.5 * math.pi), + (ArcCos, 1.0, 0.0), + (ArcCos, -1.0, math.pi), + (ArcTan, 0.0, 0.0), + (ArcTan, -1.0, -0.25 * math.pi), + (Trace, np.array([[1, 2], [3, 4]]), pytest.approx(5.0)), + (Trace, np.array([[1, 4, 1], [2, 4, 2], [3, 4, 3]]), pytest.approx(8.0)), + ], +) +def test_unary_evaluation(op, a, result): + f = op(Constant(a)) + assert f.evaluate({}) == result + + +@pytest.mark.parametrize( + "op, a, b, result", + [ + (Add, 1, 1, 2), + (Add, 7, 8, 15), + (Sub, 1, 1, 0), + (Sub, 7, 8, -1), + (Mul, 1, 1, 1), + (Mul, 7, 8, 56), + (Div, 1, 1, 1), + (Div, 7, 8, 7.0 / 8.0), + (Dot, [1, 2], [2, 1], 4), + (Dot, [7, 8], [8, 7], 112), + (Pow, 1, 1, 1), + (Pow, 7, 2, 49), + (Log, 100, 10, 2), + (Log, 256, 2, 8), + ], +) def test_binary_evaluation(op, a, b, result): - f = op(Constant(a), b if op == Pow else Constant(b)) + f = op(Constant(a), b if op == Log or op == Pow else Constant(b)) assert f.evaluate({}) == result -x = Variable("x") -y = Variable("y") -z = Variable("z") -@pytest.mark.parametrize("x_over_x", [ - Div(x,x), - Mul(Inv(x), x), - Mul(x, Inv(x)), -]) -def test_dx_over_x_by_dx_should_be_zero(x_over_x): +@pytest.mark.parametrize( + "op, a, b, result", + [ + (MatMul, np.array([[1, 1], [1, 1]]), np.array([[1, 1], [1, 1]]), np.array([[2, 2], [2, 2]])), + (MatMul, np.array([[7, 7], [7, 7]]), np.array([[8, 8], [8, 8]]), np.array([[112, 112], [112, 112]])), + ], +) +def test_matmul_evaluation(op, a, b, result): + f = op(Constant(a), Constant(b)) + assert (f.evaluate({}) == result).all() - dfdx = x_over_x.derivative(x) - print(dfdx.summary()) +@pytest.mark.parametrize( + "op, a, result", + [ + (Transpose, np.array([[1, 2]]), np.array([[1], [2]])), + (Transpose, [[1, 2], [3, 4]], [[1, 3], [2, 4]]), + (Norm_1, [[1, 2], [3, 4]], np.float64(6.0)), + (Norm_2, [[1, 2], [3, 4]], np.float64(np.sqrt(30.0))), + (Norm_2, [[1.0, 2.5], [3.0, 4.0]], np.float64(np.sqrt(32.25))), + ], +) +def test_axis_none_evaluation(op, a, result): + f = op(Constant(a)) + assert (f.evaluate({}) == result).all() + +@pytest.mark.parametrize( + "op, a, axes, result", + [ + (Transpose, [[1, 2], [3, 4]], (1, 0), [[1, 3], [2, 4]]), + (Norm_1, np.array([[1, 2], [3, 4]]), 1, np.array([3.0, 7.0])), + (Norm_2, np.array([[1, 2], [3, 4]]), 1, np.array([np.sqrt(5.0), 5.0])), + ], +) +def test_axis_evaluation(op, a, axes, result): + f = op(Constant(a), axes=axes) + assert (f.evaluate({}) == result).all() + + +@pytest.mark.parametrize( + "op, result", + [(AdditiveIdentity, AdditiveIdentity()), (MultiplicativeIdentity, AdditiveIdentity()), (Operation, None)], +) +def test_derivative(op, result): + f = op() + assert f.derivative(x, simplify=False) == result + + +@pytest.mark.parametrize( + "op", + [ + (Neg(Neg(x))), + (Inv(Inv(x))), + (MatInv(MatInv(x))), + ], +) +def test_clean_double_applications(op): + assert op._clean() == x + + +@pytest.mark.parametrize( + "op", + [ + (Exp(Ln(x))), + (Ln(Exp(x))), + ], +) +def test_clean_exp_ln_functions(op): + assert op._clean() == x + + +@pytest.mark.parametrize( + "op", + [ + (Sin(ArcSin(x))), + (Cos(ArcCos(x))), + (Tan(ArcTan(x))), + (ArcSin(Sin(x))), + (ArcCos(Cos(x))), + (ArcTan(Tan(x))), + ], +) +def test_clean_trig_functions(op): + assert op._clean() == x + + +@pytest.mark.parametrize( + "x_over_x", + [ + Div(x, x), + Mul(Inv(x), x), + Mul(x, Inv(x)), + ], +) +def test_dx_over_x_by_dx_should_be_zero(x_over_x): + dfdx = x_over_x.derivative(x) assert dfdx == AdditiveIdentity() def test_d_xyz_by_components_should_be_1(): f = Mul(Mul(x, y), z) assert f.derivative(x).derivative(y).derivative(z) == MultiplicativeIdentity() - - diff --git a/test/quantities/utest_quantities.py b/test/quantities/utest_quantities.py index fed48f808..7edfd14df 100644 --- a/test/quantities/utest_quantities.py +++ b/test/quantities/utest_quantities.py @@ -122,7 +122,7 @@ def test_conversion_errors(unit_1, unit_2): else: with pytest.raises(UnitError): - Quantity(1, units.seconds).in_units_of(units.meters) + Quantity(1, unit_1).in_units_of(unit_2) @pytest.mark.quantity diff --git a/test/quantities/utest_units.py b/test/quantities/utest_units.py index 3bc775313..c0d11b81a 100644 --- a/test/quantities/utest_units.py +++ b/test/quantities/utest_units.py @@ -1,72 +1,132 @@ import math -import sasdata.quantities.units as units -from sasdata.quantities.units import Unit - - -class EqualUnits: - def __init__(self, test_name: str, *units): - self.test_name = "Equality: " + test_name - self.units: list[Unit] = list(units) - - def run_test(self): - for i, unit_1 in enumerate(self.units): - for unit_2 in self.units[i + 1 :]: - assert unit_1.equivalent(unit_2), "Units should be equivalent" - assert unit_1 == unit_2, "Units should be equal" - - -class EquivalentButUnequalUnits: - def __init__(self, test_name: str, *units): - self.test_name = "Equivalence: " + test_name - self.units: list[Unit] = list(units) - - def run_test(self): - for i, unit_1 in enumerate(self.units): - for unit_2 in self.units[i + 1 :]: - assert unit_1.equivalent(unit_2), "Units should be equivalent" - assert unit_1 != unit_2, "Units should not be equal" - - -class DissimilarUnits: - def __init__(self, test_name: str, *units): - self.test_name = "Dissimilar: " + test_name - self.units: list[Unit] = list(units) - - def run_test(self): - for i, unit_1 in enumerate(self.units): - for unit_2 in self.units[i + 1 :]: - assert not unit_1.equivalent(unit_2), "Units should not be equivalent" - +import pytest -tests = [ - - EqualUnits("Pressure", - units.pascals, - units.newtons / units.meters ** 2, - units.micronewtons * units.millimeters ** -2), - - EqualUnits("Resistance", - units.ohms, - units.volts / units.amperes, - 1e-3/units.millisiemens), - - EquivalentButUnequalUnits("Angular frequency", - units.rotations / units.minutes, - units.degrees * units.hertz), - - EqualUnits("Angular frequency", - (units.rotations/units.minutes ), - (units.radians*units.hertz) * 2 * math.pi/60.0), - - DissimilarUnits("Frequency and Angular frequency", - (units.rotations/units.minutes), - (units.hertz)), - - -] - - -for test in tests: - print(test.test_name) - test.run_test() +import sasdata.quantities.units as units +from sasdata.quantities.units import UnknownUnit + +EQUAL_TERMS = { + "Pressure": [units.pascals, units.newtons / units.meters**2, units.micronewtons * units.millimeters**-2], + "Resistance": [units.ohms, units.volts / units.amperes, 1e-3 / units.millisiemens], + "Angular frequency": [(units.rotations / units.minutes), (units.radians * units.hertz) * 2 * math.pi / 60.0], + "Unknown Units": [UnknownUnit("Pizzas"), UnknownUnit(["Pizzas"])], + "Unknown Fractional Units": [ + UnknownUnit("Slices", denominator=["Pizzas"]), + UnknownUnit(["Slices"], denominator=["Pizzas"]), + ], + "Unknown Multiplication": [ + UnknownUnit("Pizzas") * UnknownUnit("People"), + UnknownUnit(["Pizzas", "People"]), + ], + "Unknown Multiplication with Units": [ + UnknownUnit("Pizzas") * units.meters, + units.meters * UnknownUnit(["Pizzas"]), + ], + "Unknown Power": [ + UnknownUnit(["Slices"], denominator=["Pizza"]) * UnknownUnit(["Slices"], denominator=["Pizza"]), + UnknownUnit(["Slices"], denominator=["Pizza"]) ** 2, + ], + "Unknown Fractional Power": [ + UnknownUnit(["Pizza", "Pizza", "Pizza"]), + UnknownUnit(["Pizza", "Pizza"]) ** 1.5, + ], + "Unknown Division": [ + UnknownUnit("Slices") / UnknownUnit("Pizza"), + UnknownUnit(["Slices"], denominator=["Pizza"]), + (1 / UnknownUnit("Pizza")) * UnknownUnit("Slices"), + 1 / (UnknownUnit("Pizza") / UnknownUnit("Slices")), + ], + "Unknown Complicated Math": [ + (UnknownUnit("Slices") / UnknownUnit("Person")) + / (UnknownUnit("Slices") / UnknownUnit("Pizzas")) + * UnknownUnit("Person"), + UnknownUnit("Pizzas"), + ], +} + + +@pytest.fixture(params=EQUAL_TERMS) +def equal_term(request): + return EQUAL_TERMS[request.param] + + +def test_unit_equality(equal_term): + for i, unit_1 in enumerate(equal_term): + for unit_2 in equal_term[i + 1 :]: + assert unit_1.equivalent(unit_2), "Units should be equivalent" + assert unit_1 == unit_2, "Units should be equal" + + +EQUIVALENT_TERMS = { + "Angular frequency": [units.rotations / units.minutes, units.degrees * units.hertz], +} + + +@pytest.fixture(params=EQUIVALENT_TERMS) +def equivalent_term(request): + return EQUIVALENT_TERMS[request.param] + + +def test_unit_equivalent(equivalent_term): + units = equivalent_term + for i, unit_1 in enumerate(units): + for unit_2 in units[i + 1 :]: + assert unit_1.equivalent(unit_2), "Units should be equivalent" + assert unit_1 != unit_2, "Units not should be equal" + + +DISSIMILAR_TERMS = { + "Frequency and Angular frequency": [(units.rotations / units.minutes), (units.hertz)], + "Different Unknown Units": [UnknownUnit("Pizzas"), UnknownUnit(["Donuts"])], + "Unknown Multiplication with Units": [ + UnknownUnit("Pizzas") * units.meters, + units.seconds * UnknownUnit(["Pizzas"]), + ], +} + + +@pytest.fixture(params=DISSIMILAR_TERMS) +def dissimilar_term(request): + return DISSIMILAR_TERMS[request.param] + + +def test_unit_dissimilar(dissimilar_term): + units = dissimilar_term + for i, unit_1 in enumerate(units): + for unit_2 in units[i + 1:]: + assert not unit_1.equivalent(unit_2), "Units should not be equivalent" + + +def test_unit_operations(): + pizza = UnknownUnit(["Pizza"]) + slice = UnknownUnit("Slice") + pineapple = UnknownUnit("Pineapple") + pie = UnknownUnit("Pie") + empty = UnknownUnit([]) + + with pytest.raises(RuntimeError): + UnknownUnit("a/b") + with pytest.raises(RuntimeError): + UnknownUnit(["a^b"]) + with pytest.raises(RuntimeError): + UnknownUnit({"a b": 1}) + with pytest.raises(RuntimeError): + UnknownUnit("a", {"a*b": 1}) + with pytest.raises(RuntimeError): + UnknownUnit("a", ["a^b"]) + with pytest.raises(RuntimeError): + UnknownUnit("a", "a/b") + + assert str(empty) == "" + + assert str(pizza) == "Pizza" + assert str(pizza * pineapple) == "Pineapple Pizza" + assert str(pizza * pizza) == "Pizza^2" + + assert str(1 / pizza) == "Pizza^-1" + assert str(1 / pizza / pineapple) == "Pineapple^-1 Pizza^-1" + assert str(slice / pizza) == "Slice Pizza^-1" + assert str(slice / pizza / pineapple) == "Slice Pineapple^-1 Pizza^-1" + assert str((slice / pizza) ** 2) == "Slice^2 Pizza^-2" + + assert str(pie**0.5) == "Pie^0.5" # A valid unit, because pie are square diff --git a/test/sasdataloader/data/1_33_1640_22.874115.csv b/test/sasdataloader/data/1_33_1640_22.874115.csv index 92b38bcf5..160f11da2 100644 --- a/test/sasdataloader/data/1_33_1640_22.874115.csv +++ b/test/sasdataloader/data/1_33_1640_22.874115.csv @@ -1,60 +1,60 @@ -2.732000000000000053e-02 5.247581629999999677e+03 5.122294999999999732e+01 -3.090999999999999998e-02 3.911350339999999960e+03 4.422301999999999822e+01 -3.452999999999999819e-02 2.897911560000000009e+03 3.806515000000000271e+01 -3.812999999999999723e-02 2.151411560000000009e+03 3.279795000000000016e+01 -4.173999999999999932e-02 1.629610879999999952e+03 2.854479999999999862e+01 -4.542999999999999816e-02 1.229812930000000051e+03 2.479730999999999952e+01 -4.646000000000000130e-02 1.191418850000000020e+03 2.440716000000000108e+01 -4.909000000000000169e-02 9.198557799999999816e+02 2.144593000000000060e+01 -5.254999999999999949e-02 7.981839199999999437e+02 1.997728999999999999e+01 -5.270999999999999991e-02 7.205761899999999969e+02 1.898125999999999891e+01 -5.630999999999999894e-02 5.509914999999999736e+02 1.659806000000000026e+01 -5.870999999999999830e-02 5.012570499999999925e+02 1.583125000000000071e+01 -5.988000000000000267e-02 4.332142900000000054e+02 1.471757999999999988e+01 -6.353999999999999926e-02 3.420333299999999781e+02 1.307732999999999990e+01 -6.482999999999999874e-02 3.398080699999999865e+02 1.303472000000000008e+01 -6.716999999999999360e-02 2.726683699999999817e+02 1.167622000000000071e+01 -7.073000000000000120e-02 2.204248299999999858e+02 1.049821000000000026e+01 -7.095999999999999530e-02 2.235476199999999949e+02 1.057230999999999987e+01 -7.434999999999999942e-02 1.760958799999999940e+02 9.383390000000000342e+00 -7.724000000000000310e-02 1.542382200000000125e+02 8.781750000000000611e+00 -7.799999999999999989e-02 1.457825499999999863e+02 8.537639999999999674e+00 -8.164000000000000423e-02 1.201677600000000012e+02 7.751380000000000159e+00 -8.346000000000000640e-02 1.089934400000000068e+02 7.382189999999999586e+00 -8.525000000000000633e-02 9.836262000000000683e+01 7.012940000000000396e+00 -8.881999999999999618e-02 8.192439000000000249e+01 6.400170000000000137e+00 -8.962000000000000521e-02 7.733648999999999774e+01 6.218379999999999797e+00 -9.572999999999999565e-02 5.882012000000000285e+01 5.423099999999999810e+00 -1.018000000000000016e-01 4.406902000000000186e+01 4.694090000000000096e+00 -1.080300000000000010e-01 3.487624000000000279e+01 4.175900000000000389e+00 -1.141999999999999960e-01 2.769241999999999848e+01 3.721049999999999969e+00 -1.202399999999999997e-01 2.227824000000000026e+01 3.337530000000000108e+00 -1.263900000000000023e-01 1.858717000000000041e+01 3.048540000000000028e+00 -1.325999999999999956e-01 1.587791999999999959e+01 2.817619999999999791e+00 -1.388199999999999990e-01 1.416899000000000086e+01 2.661669999999999980e+00 -1.449499999999999955e-01 1.174597999999999942e+01 2.423430000000000195e+00 -1.509900000000000131e-01 1.047161000000000008e+01 2.288190000000000168e+00 -1.571599999999999941e-01 9.681599999999999540e+00 2.200180000000000025e+00 -1.633799999999999975e-01 8.894579999999999487e+00 2.108859999999999957e+00 -1.695599999999999885e-01 8.317479999999999762e+00 2.039299999999999891e+00 -1.756800000000000028e-01 7.913870000000000182e+00 1.989200000000000079e+00 -1.818599999999999939e-01 7.771530000000000271e+00 1.971230000000000038e+00 -1.880699999999999872e-01 7.882909999999999862e+00 1.985309999999999908e+00 -1.941799999999999915e-01 7.707720000000000127e+00 1.963130000000000042e+00 -2.002800000000000136e-01 7.676859999999999573e+00 1.959189999999999987e+00 -2.064199999999999924e-01 7.872259999999999813e+00 1.983970000000000011e+00 -2.126000000000000112e-01 7.870400000000000063e+00 1.983729999999999993e+00 -2.187500000000000000e-01 7.977940000000000254e+00 1.997239999999999904e+00 -2.248699999999999866e-01 8.152039999999999509e+00 2.018920000000000048e+00 -2.310500000000000054e-01 8.298420000000000130e+00 2.036960000000000104e+00 -2.372700000000000087e-01 8.716689999999999827e+00 2.087660000000000071e+00 -2.434399999999999897e-01 8.782600000000000406e+00 2.095540000000000180e+00 -2.495600000000000041e-01 8.933479999999999421e+00 2.113469999999999960e+00 -2.556899999999999729e-01 9.374109999999999943e+00 2.164960000000000218e+00 -2.618500000000000272e-01 9.457430000000000447e+00 2.174560000000000048e+00 -2.680500000000000105e-01 9.702469999999999928e+00 2.202550000000000008e+00 -2.742100000000000093e-01 9.923930000000000362e+00 2.227549999999999919e+00 -2.802999999999999936e-01 1.008966000000000030e+01 2.246070000000000011e+00 -2.864599999999999924e-01 1.031367999999999974e+01 2.270869999999999944e+00 -2.926699999999999857e-01 1.058960000000000079e+01 2.301039999999999974e+00 +2.732000000000000053e-02 5.247581629999999677e+03 5.122294999999999732e+01 +3.090999999999999998e-02 3.911350339999999960e+03 4.422301999999999822e+01 +3.452999999999999819e-02 2.897911560000000009e+03 3.806515000000000271e+01 +3.812999999999999723e-02 2.151411560000000009e+03 3.279795000000000016e+01 +4.173999999999999932e-02 1.629610879999999952e+03 2.854479999999999862e+01 +4.542999999999999816e-02 1.229812930000000051e+03 2.479730999999999952e+01 +4.646000000000000130e-02 1.191418850000000020e+03 2.440716000000000108e+01 +4.909000000000000169e-02 9.198557799999999816e+02 2.144593000000000060e+01 +5.254999999999999949e-02 7.981839199999999437e+02 1.997728999999999999e+01 +5.270999999999999991e-02 7.205761899999999969e+02 1.898125999999999891e+01 +5.630999999999999894e-02 5.509914999999999736e+02 1.659806000000000026e+01 +5.870999999999999830e-02 5.012570499999999925e+02 1.583125000000000071e+01 +5.988000000000000267e-02 4.332142900000000054e+02 1.471757999999999988e+01 +6.353999999999999926e-02 3.420333299999999781e+02 1.307732999999999990e+01 +6.482999999999999874e-02 3.398080699999999865e+02 1.303472000000000008e+01 +6.716999999999999360e-02 2.726683699999999817e+02 1.167622000000000071e+01 +7.073000000000000120e-02 2.204248299999999858e+02 1.049821000000000026e+01 +7.095999999999999530e-02 2.235476199999999949e+02 1.057230999999999987e+01 +7.434999999999999942e-02 1.760958799999999940e+02 9.383390000000000342e+00 +7.724000000000000310e-02 1.542382200000000125e+02 8.781750000000000611e+00 +7.799999999999999989e-02 1.457825499999999863e+02 8.537639999999999674e+00 +8.164000000000000423e-02 1.201677600000000012e+02 7.751380000000000159e+00 +8.346000000000000640e-02 1.089934400000000068e+02 7.382189999999999586e+00 +8.525000000000000633e-02 9.836262000000000683e+01 7.012940000000000396e+00 +8.881999999999999618e-02 8.192439000000000249e+01 6.400170000000000137e+00 +8.962000000000000521e-02 7.733648999999999774e+01 6.218379999999999797e+00 +9.572999999999999565e-02 5.882012000000000285e+01 5.423099999999999810e+00 +1.018000000000000016e-01 4.406902000000000186e+01 4.694090000000000096e+00 +1.080300000000000010e-01 3.487624000000000279e+01 4.175900000000000389e+00 +1.141999999999999960e-01 2.769241999999999848e+01 3.721049999999999969e+00 +1.202399999999999997e-01 2.227824000000000026e+01 3.337530000000000108e+00 +1.263900000000000023e-01 1.858717000000000041e+01 3.048540000000000028e+00 +1.325999999999999956e-01 1.587791999999999959e+01 2.817619999999999791e+00 +1.388199999999999990e-01 1.416899000000000086e+01 2.661669999999999980e+00 +1.449499999999999955e-01 1.174597999999999942e+01 2.423430000000000195e+00 +1.509900000000000131e-01 1.047161000000000008e+01 2.288190000000000168e+00 +1.571599999999999941e-01 9.681599999999999540e+00 2.200180000000000025e+00 +1.633799999999999975e-01 8.894579999999999487e+00 2.108859999999999957e+00 +1.695599999999999885e-01 8.317479999999999762e+00 2.039299999999999891e+00 +1.756800000000000028e-01 7.913870000000000182e+00 1.989200000000000079e+00 +1.818599999999999939e-01 7.771530000000000271e+00 1.971230000000000038e+00 +1.880699999999999872e-01 7.882909999999999862e+00 1.985309999999999908e+00 +1.941799999999999915e-01 7.707720000000000127e+00 1.963130000000000042e+00 +2.002800000000000136e-01 7.676859999999999573e+00 1.959189999999999987e+00 +2.064199999999999924e-01 7.872259999999999813e+00 1.983970000000000011e+00 +2.126000000000000112e-01 7.870400000000000063e+00 1.983729999999999993e+00 +2.187500000000000000e-01 7.977940000000000254e+00 1.997239999999999904e+00 +2.248699999999999866e-01 8.152039999999999509e+00 2.018920000000000048e+00 +2.310500000000000054e-01 8.298420000000000130e+00 2.036960000000000104e+00 +2.372700000000000087e-01 8.716689999999999827e+00 2.087660000000000071e+00 +2.434399999999999897e-01 8.782600000000000406e+00 2.095540000000000180e+00 +2.495600000000000041e-01 8.933479999999999421e+00 2.113469999999999960e+00 +2.556899999999999729e-01 9.374109999999999943e+00 2.164960000000000218e+00 +2.618500000000000272e-01 9.457430000000000447e+00 2.174560000000000048e+00 +2.680500000000000105e-01 9.702469999999999928e+00 2.202550000000000008e+00 +2.742100000000000093e-01 9.923930000000000362e+00 2.227549999999999919e+00 +2.802999999999999936e-01 1.008966000000000030e+01 2.246070000000000011e+00 +2.864599999999999924e-01 1.031367999999999974e+01 2.270869999999999944e+00 +2.926699999999999857e-01 1.058960000000000079e+01 2.301039999999999974e+00 2.988199999999999745e-01 1.062256999999999962e+01 2.304619999999999891e+00 \ No newline at end of file diff --git a/test/sasdataloader/data/2_42_1640_23.456895.csv b/test/sasdataloader/data/2_42_1640_23.456895.csv index 831fa6a9d..80562dff5 100644 --- a/test/sasdataloader/data/2_42_1640_23.456895.csv +++ b/test/sasdataloader/data/2_42_1640_23.456895.csv @@ -1,60 +1,60 @@ -2.732000000000000053e-02 3.883615650000000187e+03 4.406595000000000084e+01 -3.090000000000000038e-02 3.072013609999999971e+03 3.919192000000000320e+01 -3.452999999999999819e-02 2.355659860000000208e+03 3.431953000000000031e+01 -3.812999999999999723e-02 1.806985030000000052e+03 3.005815000000000126e+01 -4.173999999999999932e-02 1.389839799999999968e+03 2.636132999999999882e+01 -4.542000000000000204e-02 1.072684349999999995e+03 2.315906000000000020e+01 -4.644000000000000211e-02 9.624380499999999756e+02 2.193669999999999831e+01 -4.907999999999999863e-02 8.065360500000000457e+02 2.008153000000000077e+01 -5.253000000000000030e-02 6.666923000000000457e+02 1.825777000000000072e+01 -5.270999999999999991e-02 6.432540800000000445e+02 1.793395999999999901e+01 -5.630000000000000282e-02 4.985809499999999730e+02 1.578894000000000020e+01 -5.868999999999999911e-02 4.290448299999999904e+02 1.464658000000000015e+01 -5.986999999999999961e-02 3.918163299999999936e+02 1.399671999999999983e+01 -6.353000000000000314e-02 3.098850299999999720e+02 1.244758999999999993e+01 -6.481000000000000649e-02 2.946982499999999732e+02 1.213874000000000031e+01 -6.715999999999999748e-02 2.516384400000000028e+02 1.121692000000000000e+01 -7.072000000000000508e-02 2.028407500000000141e+02 1.007076999999999956e+01 -7.094000000000000306e-02 1.948358800000000031e+02 9.870050000000000878e+00 -7.434000000000000330e-02 1.633427599999999984e+02 9.037219999999999587e+00 -7.721000000000000085e-02 1.371933899999999937e+02 8.282310000000000727e+00 -7.799000000000000377e-02 1.347819700000000012e+02 8.209199999999999164e+00 -8.162999999999999423e-02 1.123165999999999940e+02 7.493879999999999875e+00 -8.343000000000000416e-02 9.602442000000000633e+01 6.929079999999999906e+00 -8.523999999999999633e-02 9.249591999999999814e+01 6.800589999999999691e+00 -8.880000000000000393e-02 7.934887999999999408e+01 6.298759999999999692e+00 -8.959000000000000297e-02 7.016214999999999691e+01 5.922930000000000028e+00 -9.568999999999999728e-02 5.357988000000000284e+01 5.175900000000000389e+00 -1.017699999999999994e-01 4.050641000000000247e+01 4.500359999999999694e+00 -1.079900000000000027e-01 3.194395000000000095e+01 3.996500000000000163e+00 -1.141599999999999976e-01 2.563089000000000084e+01 3.579870000000000108e+00 -1.202000000000000013e-01 2.144641999999999982e+01 3.274630000000000152e+00 -1.263499999999999901e-01 1.696240999999999843e+01 2.912249999999999783e+00 -1.325600000000000112e-01 1.453672000000000075e+01 2.695990000000000109e+00 -1.387700000000000045e-01 1.265718999999999994e+01 2.515670000000000073e+00 -1.449000000000000010e-01 1.114897000000000027e+01 2.361029999999999962e+00 -1.509399999999999908e-01 1.005156999999999989e+01 2.241830000000000211e+00 -1.571099999999999997e-01 9.313710000000000377e+00 2.157970000000000166e+00 -1.633300000000000030e-01 8.668530000000000513e+00 2.081890000000000018e+00 -1.695099999999999940e-01 7.810069999999999624e+00 1.976120000000000099e+00 -1.756300000000000083e-01 7.695079999999999920e+00 1.961519999999999930e+00 -1.817999999999999894e-01 7.222220000000000084e+00 1.900290000000000035e+00 -1.880100000000000104e-01 7.386999999999999567e+00 1.921850000000000058e+00 -1.941199999999999870e-01 7.239320000000000199e+00 1.902539999999999898e+00 -2.002200000000000091e-01 7.279099999999999682e+00 1.907759999999999900e+00 -2.063500000000000056e-01 7.406340000000000146e+00 1.924360000000000070e+00 -2.125299999999999967e-01 7.439199999999999591e+00 1.928630000000000067e+00 -2.186800000000000133e-01 7.556879999999999598e+00 1.943820000000000103e+00 -2.247899999999999898e-01 7.730520000000000280e+00 1.966029999999999944e+00 -2.309799999999999909e-01 8.106099999999999639e+00 2.013220000000000010e+00 -2.371999999999999942e-01 8.398609999999999687e+00 2.049220000000000041e+00 -2.433599999999999930e-01 8.171440000000000481e+00 2.021319999999999784e+00 -2.494800000000000073e-01 8.478289999999999438e+00 2.058920000000000083e+00 -2.556100000000000039e-01 8.796279999999999433e+00 2.097170000000000201e+00 -2.617700000000000027e-01 8.973420000000000840e+00 2.118189999999999795e+00 -2.679699999999999860e-01 9.270730000000000359e+00 2.152989999999999959e+00 -2.741299999999999848e-01 9.463879999999999626e+00 2.175300000000000011e+00 -2.802100000000000146e-01 9.409150000000000347e+00 2.169000000000000039e+00 -2.863700000000000134e-01 9.709509999999999863e+00 2.203349999999999920e+00 -2.925800000000000067e-01 9.851300000000000168e+00 2.219380000000000130e+00 +2.732000000000000053e-02 3.883615650000000187e+03 4.406595000000000084e+01 +3.090000000000000038e-02 3.072013609999999971e+03 3.919192000000000320e+01 +3.452999999999999819e-02 2.355659860000000208e+03 3.431953000000000031e+01 +3.812999999999999723e-02 1.806985030000000052e+03 3.005815000000000126e+01 +4.173999999999999932e-02 1.389839799999999968e+03 2.636132999999999882e+01 +4.542000000000000204e-02 1.072684349999999995e+03 2.315906000000000020e+01 +4.644000000000000211e-02 9.624380499999999756e+02 2.193669999999999831e+01 +4.907999999999999863e-02 8.065360500000000457e+02 2.008153000000000077e+01 +5.253000000000000030e-02 6.666923000000000457e+02 1.825777000000000072e+01 +5.270999999999999991e-02 6.432540800000000445e+02 1.793395999999999901e+01 +5.630000000000000282e-02 4.985809499999999730e+02 1.578894000000000020e+01 +5.868999999999999911e-02 4.290448299999999904e+02 1.464658000000000015e+01 +5.986999999999999961e-02 3.918163299999999936e+02 1.399671999999999983e+01 +6.353000000000000314e-02 3.098850299999999720e+02 1.244758999999999993e+01 +6.481000000000000649e-02 2.946982499999999732e+02 1.213874000000000031e+01 +6.715999999999999748e-02 2.516384400000000028e+02 1.121692000000000000e+01 +7.072000000000000508e-02 2.028407500000000141e+02 1.007076999999999956e+01 +7.094000000000000306e-02 1.948358800000000031e+02 9.870050000000000878e+00 +7.434000000000000330e-02 1.633427599999999984e+02 9.037219999999999587e+00 +7.721000000000000085e-02 1.371933899999999937e+02 8.282310000000000727e+00 +7.799000000000000377e-02 1.347819700000000012e+02 8.209199999999999164e+00 +8.162999999999999423e-02 1.123165999999999940e+02 7.493879999999999875e+00 +8.343000000000000416e-02 9.602442000000000633e+01 6.929079999999999906e+00 +8.523999999999999633e-02 9.249591999999999814e+01 6.800589999999999691e+00 +8.880000000000000393e-02 7.934887999999999408e+01 6.298759999999999692e+00 +8.959000000000000297e-02 7.016214999999999691e+01 5.922930000000000028e+00 +9.568999999999999728e-02 5.357988000000000284e+01 5.175900000000000389e+00 +1.017699999999999994e-01 4.050641000000000247e+01 4.500359999999999694e+00 +1.079900000000000027e-01 3.194395000000000095e+01 3.996500000000000163e+00 +1.141599999999999976e-01 2.563089000000000084e+01 3.579870000000000108e+00 +1.202000000000000013e-01 2.144641999999999982e+01 3.274630000000000152e+00 +1.263499999999999901e-01 1.696240999999999843e+01 2.912249999999999783e+00 +1.325600000000000112e-01 1.453672000000000075e+01 2.695990000000000109e+00 +1.387700000000000045e-01 1.265718999999999994e+01 2.515670000000000073e+00 +1.449000000000000010e-01 1.114897000000000027e+01 2.361029999999999962e+00 +1.509399999999999908e-01 1.005156999999999989e+01 2.241830000000000211e+00 +1.571099999999999997e-01 9.313710000000000377e+00 2.157970000000000166e+00 +1.633300000000000030e-01 8.668530000000000513e+00 2.081890000000000018e+00 +1.695099999999999940e-01 7.810069999999999624e+00 1.976120000000000099e+00 +1.756300000000000083e-01 7.695079999999999920e+00 1.961519999999999930e+00 +1.817999999999999894e-01 7.222220000000000084e+00 1.900290000000000035e+00 +1.880100000000000104e-01 7.386999999999999567e+00 1.921850000000000058e+00 +1.941199999999999870e-01 7.239320000000000199e+00 1.902539999999999898e+00 +2.002200000000000091e-01 7.279099999999999682e+00 1.907759999999999900e+00 +2.063500000000000056e-01 7.406340000000000146e+00 1.924360000000000070e+00 +2.125299999999999967e-01 7.439199999999999591e+00 1.928630000000000067e+00 +2.186800000000000133e-01 7.556879999999999598e+00 1.943820000000000103e+00 +2.247899999999999898e-01 7.730520000000000280e+00 1.966029999999999944e+00 +2.309799999999999909e-01 8.106099999999999639e+00 2.013220000000000010e+00 +2.371999999999999942e-01 8.398609999999999687e+00 2.049220000000000041e+00 +2.433599999999999930e-01 8.171440000000000481e+00 2.021319999999999784e+00 +2.494800000000000073e-01 8.478289999999999438e+00 2.058920000000000083e+00 +2.556100000000000039e-01 8.796279999999999433e+00 2.097170000000000201e+00 +2.617700000000000027e-01 8.973420000000000840e+00 2.118189999999999795e+00 +2.679699999999999860e-01 9.270730000000000359e+00 2.152989999999999959e+00 +2.741299999999999848e-01 9.463879999999999626e+00 2.175300000000000011e+00 +2.802100000000000146e-01 9.409150000000000347e+00 2.169000000000000039e+00 +2.863700000000000134e-01 9.709509999999999863e+00 2.203349999999999920e+00 +2.925800000000000067e-01 9.851300000000000168e+00 2.219380000000000130e+00 2.987299999999999955e-01 9.904920000000000613e+00 2.225410000000000110e+00 \ No newline at end of file diff --git a/test/sasdataloader/data/3_61_1640_23.748285.csv b/test/sasdataloader/data/3_61_1640_23.748285.csv index 59e4cde42..6e68726d8 100644 --- a/test/sasdataloader/data/3_61_1640_23.748285.csv +++ b/test/sasdataloader/data/3_61_1640_23.748285.csv @@ -1,60 +1,60 @@ -2.732000000000000053e-02 2.792353740000000016e+03 3.736545000000000272e+01 -3.090000000000000038e-02 2.271702040000000125e+03 3.370239000000000118e+01 -3.452000000000000207e-02 1.788897279999999910e+03 2.990733000000000175e+01 -3.812000000000000111e-02 1.407023470000000088e+03 2.652380000000000138e+01 -4.173000000000000320e-02 1.095009520000000066e+03 2.339882000000000062e+01 -4.542000000000000204e-02 8.376734699999999521e+02 2.046549999999999869e+01 -4.644000000000000211e-02 7.836296200000000454e+02 1.979430999999999941e+01 -4.907000000000000250e-02 6.414952399999999670e+02 1.790943000000000040e+01 -5.253000000000000030e-02 5.516777200000000221e+02 1.660839999999999961e+01 -5.269999999999999685e-02 5.141714299999999866e+02 1.603388999999999953e+01 -5.628999999999999976e-02 3.988418399999999906e+02 1.412165000000000070e+01 -5.868999999999999911e-02 3.579082799999999907e+02 1.337737000000000087e+01 -5.985999999999999654e-02 3.164397999999999911e+02 1.257854999999999990e+01 -6.351999999999999313e-02 2.486343500000000120e+02 1.114976000000000056e+01 -6.481000000000000649e-02 2.482066299999999899e+02 1.114016999999999946e+01 -6.715000000000000135e-02 2.006787799999999891e+02 1.001695999999999920e+01 -7.070999999999999508e-02 1.657927200000000028e+02 9.104739999999999611e+00 -7.094000000000000306e-02 1.667760000000000105e+02 9.131700000000000372e+00 -7.431999999999999718e-02 1.326982299999999952e+02 8.145500000000000185e+00 -7.721000000000000085e-02 1.181177100000000024e+02 7.684980000000000366e+00 -7.796999999999999764e-02 1.108474499999999949e+02 7.444709999999999717e+00 -8.161999999999999811e-02 9.087302999999999997e+01 6.740660000000000096e+00 -8.343000000000000416e-02 8.290343000000000018e+01 6.438299999999999912e+00 -8.522000000000000408e-02 7.588799000000000206e+01 6.159869999999999735e+00 -8.878999999999999393e-02 6.486343999999999710e+01 5.694890000000000008e+00 -8.959000000000000297e-02 6.133471999999999724e+01 5.537810000000000343e+00 -9.568999999999999728e-02 4.711737999999999715e+01 4.853729999999999656e+00 -1.017699999999999994e-01 3.554666000000000281e+01 4.215840000000000032e+00 -1.079900000000000027e-01 2.833098000000000027e+01 3.763710000000000111e+00 -1.141599999999999976e-01 2.318925000000000125e+01 3.405089999999999950e+00 -1.202000000000000013e-01 1.876435000000000031e+01 3.063029999999999919e+00 -1.263499999999999901e-01 1.568601999999999919e+01 2.800539999999999807e+00 -1.325600000000000112e-01 1.346410000000000018e+01 2.594619999999999926e+00 -1.387700000000000045e-01 1.173840000000000039e+01 2.422639999999999905e+00 -1.449000000000000010e-01 1.054757999999999996e+01 2.296469999999999789e+00 -1.509399999999999908e-01 9.084839999999999804e+00 2.131299999999999972e+00 -1.571099999999999997e-01 8.239589999999999748e+00 2.029729999999999812e+00 -1.633300000000000030e-01 7.767660000000000231e+00 1.970739999999999936e+00 -1.695099999999999940e-01 7.631929999999999659e+00 1.953449999999999909e+00 -1.756300000000000083e-01 7.253739999999999633e+00 1.904430000000000067e+00 -1.817999999999999894e-01 6.968580000000000219e+00 1.866630000000000011e+00 -1.880100000000000104e-01 7.029829999999999579e+00 1.874810000000000088e+00 -1.941199999999999870e-01 6.805609999999999715e+00 1.844670000000000032e+00 -2.002200000000000091e-01 7.007130000000000081e+00 1.871779999999999999e+00 -2.063500000000000056e-01 7.083709999999999951e+00 1.881979999999999986e+00 -2.125299999999999967e-01 6.971890000000000143e+00 1.867070000000000007e+00 -2.186800000000000133e-01 7.549360000000000070e+00 1.942849999999999966e+00 -2.247899999999999898e-01 7.451310000000000322e+00 1.930199999999999916e+00 -2.309799999999999909e-01 7.449589999999999712e+00 1.929969999999999963e+00 -2.371999999999999942e-01 7.776720000000000077e+00 1.971889999999999921e+00 -2.433599999999999930e-01 8.157130000000000436e+00 2.019550000000000178e+00 -2.494800000000000073e-01 8.339280000000000470e+00 2.041970000000000063e+00 -2.556100000000000039e-01 8.448100000000000165e+00 2.055250000000000021e+00 -2.617700000000000027e-01 8.746420000000000528e+00 2.091219999999999857e+00 -2.679699999999999860e-01 9.040720000000000312e+00 2.126110000000000166e+00 -2.741299999999999848e-01 9.130409999999999471e+00 2.136629999999999807e+00 -2.802100000000000146e-01 9.247719999999999274e+00 2.150319999999999787e+00 -2.863700000000000134e-01 9.291150000000000020e+00 2.155359999999999943e+00 -2.925800000000000067e-01 9.640140000000000597e+00 2.195469999999999811e+00 +2.732000000000000053e-02 2.792353740000000016e+03 3.736545000000000272e+01 +3.090000000000000038e-02 2.271702040000000125e+03 3.370239000000000118e+01 +3.452000000000000207e-02 1.788897279999999910e+03 2.990733000000000175e+01 +3.812000000000000111e-02 1.407023470000000088e+03 2.652380000000000138e+01 +4.173000000000000320e-02 1.095009520000000066e+03 2.339882000000000062e+01 +4.542000000000000204e-02 8.376734699999999521e+02 2.046549999999999869e+01 +4.644000000000000211e-02 7.836296200000000454e+02 1.979430999999999941e+01 +4.907000000000000250e-02 6.414952399999999670e+02 1.790943000000000040e+01 +5.253000000000000030e-02 5.516777200000000221e+02 1.660839999999999961e+01 +5.269999999999999685e-02 5.141714299999999866e+02 1.603388999999999953e+01 +5.628999999999999976e-02 3.988418399999999906e+02 1.412165000000000070e+01 +5.868999999999999911e-02 3.579082799999999907e+02 1.337737000000000087e+01 +5.985999999999999654e-02 3.164397999999999911e+02 1.257854999999999990e+01 +6.351999999999999313e-02 2.486343500000000120e+02 1.114976000000000056e+01 +6.481000000000000649e-02 2.482066299999999899e+02 1.114016999999999946e+01 +6.715000000000000135e-02 2.006787799999999891e+02 1.001695999999999920e+01 +7.070999999999999508e-02 1.657927200000000028e+02 9.104739999999999611e+00 +7.094000000000000306e-02 1.667760000000000105e+02 9.131700000000000372e+00 +7.431999999999999718e-02 1.326982299999999952e+02 8.145500000000000185e+00 +7.721000000000000085e-02 1.181177100000000024e+02 7.684980000000000366e+00 +7.796999999999999764e-02 1.108474499999999949e+02 7.444709999999999717e+00 +8.161999999999999811e-02 9.087302999999999997e+01 6.740660000000000096e+00 +8.343000000000000416e-02 8.290343000000000018e+01 6.438299999999999912e+00 +8.522000000000000408e-02 7.588799000000000206e+01 6.159869999999999735e+00 +8.878999999999999393e-02 6.486343999999999710e+01 5.694890000000000008e+00 +8.959000000000000297e-02 6.133471999999999724e+01 5.537810000000000343e+00 +9.568999999999999728e-02 4.711737999999999715e+01 4.853729999999999656e+00 +1.017699999999999994e-01 3.554666000000000281e+01 4.215840000000000032e+00 +1.079900000000000027e-01 2.833098000000000027e+01 3.763710000000000111e+00 +1.141599999999999976e-01 2.318925000000000125e+01 3.405089999999999950e+00 +1.202000000000000013e-01 1.876435000000000031e+01 3.063029999999999919e+00 +1.263499999999999901e-01 1.568601999999999919e+01 2.800539999999999807e+00 +1.325600000000000112e-01 1.346410000000000018e+01 2.594619999999999926e+00 +1.387700000000000045e-01 1.173840000000000039e+01 2.422639999999999905e+00 +1.449000000000000010e-01 1.054757999999999996e+01 2.296469999999999789e+00 +1.509399999999999908e-01 9.084839999999999804e+00 2.131299999999999972e+00 +1.571099999999999997e-01 8.239589999999999748e+00 2.029729999999999812e+00 +1.633300000000000030e-01 7.767660000000000231e+00 1.970739999999999936e+00 +1.695099999999999940e-01 7.631929999999999659e+00 1.953449999999999909e+00 +1.756300000000000083e-01 7.253739999999999633e+00 1.904430000000000067e+00 +1.817999999999999894e-01 6.968580000000000219e+00 1.866630000000000011e+00 +1.880100000000000104e-01 7.029829999999999579e+00 1.874810000000000088e+00 +1.941199999999999870e-01 6.805609999999999715e+00 1.844670000000000032e+00 +2.002200000000000091e-01 7.007130000000000081e+00 1.871779999999999999e+00 +2.063500000000000056e-01 7.083709999999999951e+00 1.881979999999999986e+00 +2.125299999999999967e-01 6.971890000000000143e+00 1.867070000000000007e+00 +2.186800000000000133e-01 7.549360000000000070e+00 1.942849999999999966e+00 +2.247899999999999898e-01 7.451310000000000322e+00 1.930199999999999916e+00 +2.309799999999999909e-01 7.449589999999999712e+00 1.929969999999999963e+00 +2.371999999999999942e-01 7.776720000000000077e+00 1.971889999999999921e+00 +2.433599999999999930e-01 8.157130000000000436e+00 2.019550000000000178e+00 +2.494800000000000073e-01 8.339280000000000470e+00 2.041970000000000063e+00 +2.556100000000000039e-01 8.448100000000000165e+00 2.055250000000000021e+00 +2.617700000000000027e-01 8.746420000000000528e+00 2.091219999999999857e+00 +2.679699999999999860e-01 9.040720000000000312e+00 2.126110000000000166e+00 +2.741299999999999848e-01 9.130409999999999471e+00 2.136629999999999807e+00 +2.802100000000000146e-01 9.247719999999999274e+00 2.150319999999999787e+00 +2.863700000000000134e-01 9.291150000000000020e+00 2.155359999999999943e+00 +2.925800000000000067e-01 9.640140000000000597e+00 2.195469999999999811e+00 2.987299999999999955e-01 9.537290000000000489e+00 2.183720000000000105e+00 \ No newline at end of file diff --git a/test/sasdataloader/data/4_103_1640_24.039675.csv b/test/sasdataloader/data/4_103_1640_24.039675.csv index daf8f80a8..c33506202 100644 --- a/test/sasdataloader/data/4_103_1640_24.039675.csv +++ b/test/sasdataloader/data/4_103_1640_24.039675.csv @@ -1,60 +1,60 @@ -2.733000000000000013e-02 2.320909860000000208e+03 3.406544999999999845e+01 -3.090999999999999998e-02 1.910828909999999951e+03 3.090978000000000137e+01 -3.454000000000000126e-02 1.519815650000000005e+03 2.756643000000000043e+01 -3.814000000000000029e-02 1.188850680000000011e+03 2.438083999999999918e+01 -4.175000000000000239e-02 9.312768700000000308e+02 2.157865999999999929e+01 -4.544000000000000122e-02 7.201697299999999586e+02 1.897589999999999932e+01 -4.646000000000000130e-02 6.728012599999999566e+02 1.834122999999999948e+01 -4.909999999999999781e-02 5.453608799999999519e+02 1.651304000000000016e+01 -5.256000000000000255e-02 4.724414499999999748e+02 1.536946999999999974e+01 -5.272000000000000297e-02 4.318700699999999983e+02 1.469472999999999985e+01 -5.632000000000000201e-02 3.382353699999999890e+02 1.300453000000000081e+01 -5.870999999999999830e-02 3.073326000000000136e+02 1.239621999999999957e+01 -5.988999999999999879e-02 2.634156100000000151e+02 1.147639999999999993e+01 -6.356000000000000538e-02 2.076918699999999944e+02 1.019048000000000087e+01 -6.483999999999999486e-02 2.125336499999999944e+02 1.030857999999999919e+01 -6.718999999999999972e-02 1.688028199999999970e+02 9.187020000000000408e+00 -7.073999999999999733e-02 1.362696899999999971e+02 8.254379999999999384e+00 -7.097000000000000530e-02 1.410024300000000039e+02 8.396499999999999631e+00 -7.435999999999999555e-02 1.127603699999999947e+02 7.508670000000000400e+00 -7.724999999999999922e-02 9.965560999999999581e+01 7.058880000000000265e+00 -7.800999999999999601e-02 9.194693999999999789e+01 6.780369999999999564e+00 -8.165999999999999648e-02 7.522768999999999551e+01 6.133009999999999629e+00 -8.347000000000000253e-02 7.049939999999999429e+01 5.937149999999999928e+00 -8.526000000000000245e-02 6.411020000000000607e+01 5.661719999999999864e+00 -8.883000000000000618e-02 5.376234999999999786e+01 5.184709999999999930e+00 -8.963000000000000134e-02 5.217504000000000275e+01 5.107590000000000074e+00 -9.574000000000000565e-02 4.054399999999999693e+01 4.502439999999999998e+00 -1.018199999999999938e-01 3.096013999999999911e+01 3.934470000000000134e+00 -1.080399999999999971e-01 2.426012000000000057e+01 3.482819999999999805e+00 -1.142200000000000021e-01 1.991522000000000148e+01 3.155569999999999986e+00 -1.202600000000000058e-01 1.696463999999999928e+01 2.912440000000000140e+00 -1.264099999999999946e-01 1.406012999999999913e+01 2.651429999999999954e+00 -1.326199999999999879e-01 1.186475000000000080e+01 2.435649999999999871e+00 -1.388300000000000090e-01 1.075843000000000060e+01 2.319310000000000205e+00 -1.449699999999999878e-01 9.447770000000000223e+00 2.173449999999999882e+00 -1.510100000000000053e-01 8.521739999999999426e+00 2.064189999999999969e+00 -1.571799999999999864e-01 7.782460000000000377e+00 1.972620000000000040e+00 -1.634099999999999997e-01 7.576889999999999681e+00 1.946390000000000065e+00 -1.695800000000000085e-01 7.175270000000000259e+00 1.894109999999999960e+00 -1.756999999999999951e-01 6.609770000000000145e+00 1.817930000000000046e+00 -1.818799999999999861e-01 6.690150000000000041e+00 1.828950000000000076e+00 -1.880999999999999894e-01 6.763010000000000410e+00 1.838889999999999914e+00 -1.942000000000000115e-01 6.479930000000000412e+00 1.799989999999999979e+00 -2.003099999999999881e-01 6.931930000000000369e+00 1.861709999999999976e+00 -2.064499999999999946e-01 7.058690000000000353e+00 1.878649999999999931e+00 -2.126300000000000134e-01 6.966739999999999711e+00 1.866379999999999928e+00 -2.187699999999999922e-01 7.155350000000000321e+00 1.891469999999999985e+00 -2.248999999999999888e-01 7.328820000000000334e+00 1.914260000000000073e+00 -2.310800000000000076e-01 7.623789999999999623e+00 1.952409999999999979e+00 -2.373000000000000109e-01 7.870739999999999625e+00 1.983780000000000099e+00 -2.434699999999999920e-01 7.865639999999999965e+00 1.983130000000000059e+00 -2.495900000000000063e-01 8.081390000000000740e+00 2.010149999999999881e+00 -2.557300000000000129e-01 8.480309999999999349e+00 2.059159999999999879e+00 -2.618900000000000117e-01 8.708700000000000330e+00 2.086710000000000065e+00 -2.680899999999999950e-01 8.823320000000000718e+00 2.100389999999999979e+00 -2.742499999999999938e-01 9.030450000000000088e+00 2.124909999999999854e+00 -2.803300000000000236e-01 9.222670000000000812e+00 2.147400000000000198e+00 -2.864999999999999769e-01 9.345430000000000348e+00 2.161649999999999849e+00 -2.927100000000000257e-01 9.660539999999999239e+00 2.197789999999999910e+00 +2.733000000000000013e-02 2.320909860000000208e+03 3.406544999999999845e+01 +3.090999999999999998e-02 1.910828909999999951e+03 3.090978000000000137e+01 +3.454000000000000126e-02 1.519815650000000005e+03 2.756643000000000043e+01 +3.814000000000000029e-02 1.188850680000000011e+03 2.438083999999999918e+01 +4.175000000000000239e-02 9.312768700000000308e+02 2.157865999999999929e+01 +4.544000000000000122e-02 7.201697299999999586e+02 1.897589999999999932e+01 +4.646000000000000130e-02 6.728012599999999566e+02 1.834122999999999948e+01 +4.909999999999999781e-02 5.453608799999999519e+02 1.651304000000000016e+01 +5.256000000000000255e-02 4.724414499999999748e+02 1.536946999999999974e+01 +5.272000000000000297e-02 4.318700699999999983e+02 1.469472999999999985e+01 +5.632000000000000201e-02 3.382353699999999890e+02 1.300453000000000081e+01 +5.870999999999999830e-02 3.073326000000000136e+02 1.239621999999999957e+01 +5.988999999999999879e-02 2.634156100000000151e+02 1.147639999999999993e+01 +6.356000000000000538e-02 2.076918699999999944e+02 1.019048000000000087e+01 +6.483999999999999486e-02 2.125336499999999944e+02 1.030857999999999919e+01 +6.718999999999999972e-02 1.688028199999999970e+02 9.187020000000000408e+00 +7.073999999999999733e-02 1.362696899999999971e+02 8.254379999999999384e+00 +7.097000000000000530e-02 1.410024300000000039e+02 8.396499999999999631e+00 +7.435999999999999555e-02 1.127603699999999947e+02 7.508670000000000400e+00 +7.724999999999999922e-02 9.965560999999999581e+01 7.058880000000000265e+00 +7.800999999999999601e-02 9.194693999999999789e+01 6.780369999999999564e+00 +8.165999999999999648e-02 7.522768999999999551e+01 6.133009999999999629e+00 +8.347000000000000253e-02 7.049939999999999429e+01 5.937149999999999928e+00 +8.526000000000000245e-02 6.411020000000000607e+01 5.661719999999999864e+00 +8.883000000000000618e-02 5.376234999999999786e+01 5.184709999999999930e+00 +8.963000000000000134e-02 5.217504000000000275e+01 5.107590000000000074e+00 +9.574000000000000565e-02 4.054399999999999693e+01 4.502439999999999998e+00 +1.018199999999999938e-01 3.096013999999999911e+01 3.934470000000000134e+00 +1.080399999999999971e-01 2.426012000000000057e+01 3.482819999999999805e+00 +1.142200000000000021e-01 1.991522000000000148e+01 3.155569999999999986e+00 +1.202600000000000058e-01 1.696463999999999928e+01 2.912440000000000140e+00 +1.264099999999999946e-01 1.406012999999999913e+01 2.651429999999999954e+00 +1.326199999999999879e-01 1.186475000000000080e+01 2.435649999999999871e+00 +1.388300000000000090e-01 1.075843000000000060e+01 2.319310000000000205e+00 +1.449699999999999878e-01 9.447770000000000223e+00 2.173449999999999882e+00 +1.510100000000000053e-01 8.521739999999999426e+00 2.064189999999999969e+00 +1.571799999999999864e-01 7.782460000000000377e+00 1.972620000000000040e+00 +1.634099999999999997e-01 7.576889999999999681e+00 1.946390000000000065e+00 +1.695800000000000085e-01 7.175270000000000259e+00 1.894109999999999960e+00 +1.756999999999999951e-01 6.609770000000000145e+00 1.817930000000000046e+00 +1.818799999999999861e-01 6.690150000000000041e+00 1.828950000000000076e+00 +1.880999999999999894e-01 6.763010000000000410e+00 1.838889999999999914e+00 +1.942000000000000115e-01 6.479930000000000412e+00 1.799989999999999979e+00 +2.003099999999999881e-01 6.931930000000000369e+00 1.861709999999999976e+00 +2.064499999999999946e-01 7.058690000000000353e+00 1.878649999999999931e+00 +2.126300000000000134e-01 6.966739999999999711e+00 1.866379999999999928e+00 +2.187699999999999922e-01 7.155350000000000321e+00 1.891469999999999985e+00 +2.248999999999999888e-01 7.328820000000000334e+00 1.914260000000000073e+00 +2.310800000000000076e-01 7.623789999999999623e+00 1.952409999999999979e+00 +2.373000000000000109e-01 7.870739999999999625e+00 1.983780000000000099e+00 +2.434699999999999920e-01 7.865639999999999965e+00 1.983130000000000059e+00 +2.495900000000000063e-01 8.081390000000000740e+00 2.010149999999999881e+00 +2.557300000000000129e-01 8.480309999999999349e+00 2.059159999999999879e+00 +2.618900000000000117e-01 8.708700000000000330e+00 2.086710000000000065e+00 +2.680899999999999950e-01 8.823320000000000718e+00 2.100389999999999979e+00 +2.742499999999999938e-01 9.030450000000000088e+00 2.124909999999999854e+00 +2.803300000000000236e-01 9.222670000000000812e+00 2.147400000000000198e+00 +2.864999999999999769e-01 9.345430000000000348e+00 2.161649999999999849e+00 +2.927100000000000257e-01 9.660539999999999239e+00 2.197789999999999910e+00 2.988600000000000145e-01 9.559969999999999857e+00 2.186319999999999819e+00 \ No newline at end of file diff --git a/test/sasdataloader/data/5_312_1640_24.331065.csv b/test/sasdataloader/data/5_312_1640_24.331065.csv index 2f696f3b5..17968ec9e 100644 --- a/test/sasdataloader/data/5_312_1640_24.331065.csv +++ b/test/sasdataloader/data/5_312_1640_24.331065.csv @@ -1,60 +1,60 @@ -2.733000000000000013e-02 1.791495509999999967e+03 2.992905000000000015e+01 -3.091999999999999957e-02 1.477992469999999912e+03 2.718449000000000026e+01 -3.454000000000000126e-02 1.172791189999999915e+03 2.421561000000000163e+01 -3.814000000000000029e-02 9.196233300000000099e+02 2.144322000000000017e+01 -4.175000000000000239e-02 7.160111200000000053e+02 1.892102999999999824e+01 -4.544000000000000122e-02 5.391461900000000469e+02 1.641867999999999839e+01 -4.646000000000000130e-02 4.929036699999999769e+02 1.569877999999999929e+01 -4.909999999999999781e-02 4.129331099999999992e+02 1.436894000000000027e+01 -5.256000000000000255e-02 3.482022600000000239e+02 1.319473999999999947e+01 -5.272999999999999909e-02 3.242194700000000012e+02 1.273222999999999949e+01 -5.632000000000000201e-02 2.454095199999999863e+02 1.107722000000000051e+01 -5.870999999999999830e-02 2.218204599999999971e+02 1.053139000000000003e+01 -5.990000000000000185e-02 1.931666899999999885e+02 9.827680000000000859e+00 -6.356000000000000538e-02 1.505020900000000097e+02 8.674739999999999895e+00 -6.483999999999999486e-02 1.511605900000000133e+02 8.693690000000000140e+00 -6.718999999999999972e-02 1.202856799999999993e+02 7.755180000000000184e+00 -7.074999999999999345e-02 9.616129999999999711e+01 6.934020000000000294e+00 -7.097000000000000530e-02 9.870516999999999541e+01 7.025140000000000384e+00 -7.435999999999999555e-02 7.818730999999999653e+01 6.252489999999999881e+00 -7.724999999999999922e-02 6.837958000000000425e+01 5.847199999999999953e+00 -7.802000000000000601e-02 6.371482000000000312e+01 5.644239999999999924e+00 -8.165999999999999648e-02 5.179379999999999740e+01 5.088899999999999757e+00 -8.347000000000000253e-02 4.836007000000000033e+01 4.917320000000000135e+00 -8.526999999999999857e-02 4.457972000000000179e+01 4.721210000000000129e+00 -8.884000000000000230e-02 3.751116999999999990e+01 4.330770000000000231e+00 -8.963000000000000134e-02 3.544118999999999886e+01 4.209579999999999878e+00 -9.574000000000000565e-02 2.739192999999999856e+01 3.700810000000000155e+00 -1.018199999999999938e-01 2.084316000000000102e+01 3.228250000000000064e+00 -1.080399999999999971e-01 1.702296000000000120e+01 2.917440000000000033e+00 -1.142200000000000021e-01 1.391883999999999943e+01 2.638069999999999915e+00 -1.202600000000000058e-01 1.148202000000000034e+01 2.396040000000000170e+00 -1.264099999999999946e-01 9.887589999999999435e+00 2.223460000000000214e+00 -1.326199999999999879e-01 8.618710000000000093e+00 2.075899999999999856e+00 -1.388300000000000090e-01 7.875820000000000043e+00 1.984420000000000073e+00 -1.449699999999999878e-01 7.119869999999999699e+00 1.886779999999999902e+00 -1.510100000000000053e-01 6.691399999999999793e+00 1.829129999999999923e+00 -1.571799999999999864e-01 6.133020000000000138e+00 1.751139999999999919e+00 -1.634099999999999997e-01 5.984770000000000145e+00 1.729850000000000110e+00 -1.695800000000000085e-01 5.802669999999999995e+00 1.703330000000000011e+00 -1.756999999999999951e-01 5.772070000000000256e+00 1.698830000000000062e+00 -1.818799999999999861e-01 5.866640000000000299e+00 1.712690000000000046e+00 -1.880999999999999894e-01 5.880740000000000300e+00 1.714749999999999996e+00 -1.942000000000000115e-01 5.856810000000000294e+00 1.711260000000000003e+00 -2.003099999999999881e-01 6.138060000000000294e+00 1.751870000000000038e+00 -2.064499999999999946e-01 6.406990000000000407e+00 1.789830000000000032e+00 -2.126300000000000134e-01 6.462060000000000137e+00 1.797509999999999941e+00 -2.187699999999999922e-01 6.501079999999999970e+00 1.802929999999999922e+00 -2.248999999999999888e-01 6.991179999999999950e+00 1.869650000000000034e+00 -2.310800000000000076e-01 7.014639999999999986e+00 1.872779999999999889e+00 -2.373000000000000109e-01 7.136879999999999669e+00 1.889029999999999987e+00 -2.434699999999999920e-01 7.547889999999999766e+00 1.942660000000000053e+00 -2.495900000000000063e-01 7.608620000000000161e+00 1.950460000000000083e+00 -2.557300000000000129e-01 7.913459999999999717e+00 1.989149999999999974e+00 -2.618900000000000117e-01 8.245919999999999916e+00 2.030510000000000037e+00 -2.680899999999999950e-01 8.604509999999999437e+00 2.074190000000000200e+00 -2.742499999999999938e-01 8.711750000000000327e+00 2.087070000000000203e+00 -2.803300000000000236e-01 8.863739999999999952e+00 2.105199999999999960e+00 -2.864999999999999769e-01 8.911099999999999355e+00 2.110819999999999919e+00 -2.927100000000000257e-01 9.338430000000000675e+00 2.160839999999999872e+00 +2.733000000000000013e-02 1.791495509999999967e+03 2.992905000000000015e+01 +3.091999999999999957e-02 1.477992469999999912e+03 2.718449000000000026e+01 +3.454000000000000126e-02 1.172791189999999915e+03 2.421561000000000163e+01 +3.814000000000000029e-02 9.196233300000000099e+02 2.144322000000000017e+01 +4.175000000000000239e-02 7.160111200000000053e+02 1.892102999999999824e+01 +4.544000000000000122e-02 5.391461900000000469e+02 1.641867999999999839e+01 +4.646000000000000130e-02 4.929036699999999769e+02 1.569877999999999929e+01 +4.909999999999999781e-02 4.129331099999999992e+02 1.436894000000000027e+01 +5.256000000000000255e-02 3.482022600000000239e+02 1.319473999999999947e+01 +5.272999999999999909e-02 3.242194700000000012e+02 1.273222999999999949e+01 +5.632000000000000201e-02 2.454095199999999863e+02 1.107722000000000051e+01 +5.870999999999999830e-02 2.218204599999999971e+02 1.053139000000000003e+01 +5.990000000000000185e-02 1.931666899999999885e+02 9.827680000000000859e+00 +6.356000000000000538e-02 1.505020900000000097e+02 8.674739999999999895e+00 +6.483999999999999486e-02 1.511605900000000133e+02 8.693690000000000140e+00 +6.718999999999999972e-02 1.202856799999999993e+02 7.755180000000000184e+00 +7.074999999999999345e-02 9.616129999999999711e+01 6.934020000000000294e+00 +7.097000000000000530e-02 9.870516999999999541e+01 7.025140000000000384e+00 +7.435999999999999555e-02 7.818730999999999653e+01 6.252489999999999881e+00 +7.724999999999999922e-02 6.837958000000000425e+01 5.847199999999999953e+00 +7.802000000000000601e-02 6.371482000000000312e+01 5.644239999999999924e+00 +8.165999999999999648e-02 5.179379999999999740e+01 5.088899999999999757e+00 +8.347000000000000253e-02 4.836007000000000033e+01 4.917320000000000135e+00 +8.526999999999999857e-02 4.457972000000000179e+01 4.721210000000000129e+00 +8.884000000000000230e-02 3.751116999999999990e+01 4.330770000000000231e+00 +8.963000000000000134e-02 3.544118999999999886e+01 4.209579999999999878e+00 +9.574000000000000565e-02 2.739192999999999856e+01 3.700810000000000155e+00 +1.018199999999999938e-01 2.084316000000000102e+01 3.228250000000000064e+00 +1.080399999999999971e-01 1.702296000000000120e+01 2.917440000000000033e+00 +1.142200000000000021e-01 1.391883999999999943e+01 2.638069999999999915e+00 +1.202600000000000058e-01 1.148202000000000034e+01 2.396040000000000170e+00 +1.264099999999999946e-01 9.887589999999999435e+00 2.223460000000000214e+00 +1.326199999999999879e-01 8.618710000000000093e+00 2.075899999999999856e+00 +1.388300000000000090e-01 7.875820000000000043e+00 1.984420000000000073e+00 +1.449699999999999878e-01 7.119869999999999699e+00 1.886779999999999902e+00 +1.510100000000000053e-01 6.691399999999999793e+00 1.829129999999999923e+00 +1.571799999999999864e-01 6.133020000000000138e+00 1.751139999999999919e+00 +1.634099999999999997e-01 5.984770000000000145e+00 1.729850000000000110e+00 +1.695800000000000085e-01 5.802669999999999995e+00 1.703330000000000011e+00 +1.756999999999999951e-01 5.772070000000000256e+00 1.698830000000000062e+00 +1.818799999999999861e-01 5.866640000000000299e+00 1.712690000000000046e+00 +1.880999999999999894e-01 5.880740000000000300e+00 1.714749999999999996e+00 +1.942000000000000115e-01 5.856810000000000294e+00 1.711260000000000003e+00 +2.003099999999999881e-01 6.138060000000000294e+00 1.751870000000000038e+00 +2.064499999999999946e-01 6.406990000000000407e+00 1.789830000000000032e+00 +2.126300000000000134e-01 6.462060000000000137e+00 1.797509999999999941e+00 +2.187699999999999922e-01 6.501079999999999970e+00 1.802929999999999922e+00 +2.248999999999999888e-01 6.991179999999999950e+00 1.869650000000000034e+00 +2.310800000000000076e-01 7.014639999999999986e+00 1.872779999999999889e+00 +2.373000000000000109e-01 7.136879999999999669e+00 1.889029999999999987e+00 +2.434699999999999920e-01 7.547889999999999766e+00 1.942660000000000053e+00 +2.495900000000000063e-01 7.608620000000000161e+00 1.950460000000000083e+00 +2.557300000000000129e-01 7.913459999999999717e+00 1.989149999999999974e+00 +2.618900000000000117e-01 8.245919999999999916e+00 2.030510000000000037e+00 +2.680899999999999950e-01 8.604509999999999437e+00 2.074190000000000200e+00 +2.742499999999999938e-01 8.711750000000000327e+00 2.087070000000000203e+00 +2.803300000000000236e-01 8.863739999999999952e+00 2.105199999999999960e+00 +2.864999999999999769e-01 8.911099999999999355e+00 2.110819999999999919e+00 +2.927100000000000257e-01 9.338430000000000675e+00 2.160839999999999872e+00 2.988600000000000145e-01 9.385640000000000427e+00 2.166290000000000049e+00 \ No newline at end of file diff --git a/test/sasdataloader/data/6_1270_1640_24.331065.csv b/test/sasdataloader/data/6_1270_1640_24.331065.csv index e7dfab999..72272ed89 100644 --- a/test/sasdataloader/data/6_1270_1640_24.331065.csv +++ b/test/sasdataloader/data/6_1270_1640_24.331065.csv @@ -1,60 +1,60 @@ -2.732000000000000053e-02 1.517870979999999918e+03 2.754878000000000071e+01 -3.090999999999999998e-02 1.252144950000000108e+03 2.502143999999999835e+01 -3.452999999999999819e-02 9.849326300000000174e+02 2.219157999999999831e+01 -3.812999999999999723e-02 7.635778900000000249e+02 1.953941999999999979e+01 -4.173999999999999932e-02 5.910564900000000534e+02 1.719093000000000160e+01 -4.542999999999999816e-02 4.454160299999999779e+02 1.492340000000000089e+01 -4.644000000000000211e-02 4.097451399999999921e+02 1.431337000000000081e+01 -4.907999999999999863e-02 3.412573399999999992e+02 1.306249000000000038e+01 -5.254000000000000337e-02 2.833860500000000116e+02 1.190348999999999968e+01 -5.270999999999999991e-02 2.587516299999999774e+02 1.137434999999999974e+01 -5.630000000000000282e-02 1.972410900000000140e+02 9.930790000000000006e+00 -5.868999999999999911e-02 1.820288400000000024e+02 9.540150000000000574e+00 -5.988000000000000267e-02 1.548462399999999946e+02 8.799039999999999750e+00 -6.353999999999999926e-02 1.208091600000000057e+02 7.772039999999999615e+00 -6.481000000000000649e-02 1.228846300000000014e+02 7.838510000000000311e+00 -6.716999999999999360e-02 9.485747999999999536e+01 6.886849999999999916e+00 -7.072000000000000508e-02 7.616365000000000407e+01 6.171050000000000146e+00 -7.094999999999999918e-02 7.959243999999999630e+01 6.308419999999999916e+00 -7.434000000000000330e-02 6.139544999999999675e+01 5.540549999999999642e+00 -7.721999999999999698e-02 5.528307999999999822e+01 5.257520000000000415e+00 -7.799000000000000377e-02 5.105310999999999666e+01 5.052380000000000315e+00 -8.164000000000000423e-02 4.131436000000000064e+01 4.545020000000000060e+00 -8.343000000000000416e-02 3.883191999999999666e+01 4.406349999999999767e+00 -8.523999999999999633e-02 3.386838999999999800e+01 4.115120000000000111e+00 -8.881000000000000005e-02 2.873742000000000019e+01 3.790610000000000035e+00 -8.959999999999999909e-02 2.744166999999999845e+01 3.704159999999999897e+00 -9.569999999999999341e-02 2.114314999999999856e+01 3.251399999999999846e+00 -1.017799999999999955e-01 1.639198000000000022e+01 2.862859999999999960e+00 -1.079999999999999988e-01 1.302345000000000041e+01 2.551810000000000134e+00 -1.141699999999999937e-01 1.067233000000000054e+01 2.310010000000000119e+00 -1.202099999999999974e-01 8.927680000000000504e+00 2.112779999999999880e+00 -1.263600000000000001e-01 7.691300000000000026e+00 1.961030000000000051e+00 -1.325600000000000112e-01 6.633219999999999672e+00 1.821159999999999890e+00 -1.387799999999999867e-01 6.187759999999999927e+00 1.758939999999999948e+00 -1.449100000000000110e-01 5.397269999999999790e+00 1.642749999999999932e+00 -1.509500000000000008e-01 5.127299999999999969e+00 1.601140000000000008e+00 -1.571200000000000097e-01 4.947350000000000136e+00 1.572789999999999910e+00 -1.633400000000000130e-01 4.791970000000000063e+00 1.547900000000000054e+00 -1.695200000000000040e-01 4.839830000000000076e+00 1.555609999999999937e+00 -1.756399999999999906e-01 4.855599999999999916e+00 1.558140000000000081e+00 -1.818099999999999994e-01 4.971189999999999998e+00 1.576580000000000092e+00 -1.880199999999999927e-01 4.996179999999999843e+00 1.580540000000000056e+00 -1.941299999999999970e-01 5.231489999999999974e+00 1.617329999999999934e+00 -2.002299999999999913e-01 5.461660000000000181e+00 1.652519999999999989e+00 -2.063699999999999979e-01 5.566430000000000433e+00 1.668299999999999894e+00 -2.125400000000000067e-01 5.749649999999999928e+00 1.695529999999999982e+00 -2.186899999999999955e-01 5.962720000000000020e+00 1.726660000000000084e+00 -2.248100000000000098e-01 6.366220000000000212e+00 1.784129999999999994e+00 -2.309900000000000009e-01 6.576419999999999710e+00 1.813339999999999952e+00 -2.372100000000000042e-01 6.993730000000000224e+00 1.869990000000000041e+00 -2.433800000000000130e-01 7.112300000000000288e+00 1.885780000000000012e+00 -2.494999999999999996e-01 7.346860000000000390e+00 1.916619999999999990e+00 -2.556300000000000239e-01 7.629410000000000025e+00 1.953130000000000033e+00 -2.617900000000000227e-01 7.827810000000000379e+00 1.978359999999999896e+00 -2.679900000000000060e-01 8.252810000000000201e+00 2.031359999999999832e+00 -2.741399999999999948e-01 8.304840000000000444e+00 2.037749999999999950e+00 -2.802200000000000246e-01 8.705450000000000799e+00 2.086320000000000174e+00 -2.863899999999999779e-01 8.881330000000000169e+00 2.107289999999999885e+00 -2.926000000000000267e-01 9.112230000000000274e+00 2.134510000000000129e+00 -2.987500000000000155e-01 9.303969999999999629e+00 2.156849999999999934e+00 +2.732000000000000053e-02 1.517870979999999918e+03 2.754878000000000071e+01 +3.090999999999999998e-02 1.252144950000000108e+03 2.502143999999999835e+01 +3.452999999999999819e-02 9.849326300000000174e+02 2.219157999999999831e+01 +3.812999999999999723e-02 7.635778900000000249e+02 1.953941999999999979e+01 +4.173999999999999932e-02 5.910564900000000534e+02 1.719093000000000160e+01 +4.542999999999999816e-02 4.454160299999999779e+02 1.492340000000000089e+01 +4.644000000000000211e-02 4.097451399999999921e+02 1.431337000000000081e+01 +4.907999999999999863e-02 3.412573399999999992e+02 1.306249000000000038e+01 +5.254000000000000337e-02 2.833860500000000116e+02 1.190348999999999968e+01 +5.270999999999999991e-02 2.587516299999999774e+02 1.137434999999999974e+01 +5.630000000000000282e-02 1.972410900000000140e+02 9.930790000000000006e+00 +5.868999999999999911e-02 1.820288400000000024e+02 9.540150000000000574e+00 +5.988000000000000267e-02 1.548462399999999946e+02 8.799039999999999750e+00 +6.353999999999999926e-02 1.208091600000000057e+02 7.772039999999999615e+00 +6.481000000000000649e-02 1.228846300000000014e+02 7.838510000000000311e+00 +6.716999999999999360e-02 9.485747999999999536e+01 6.886849999999999916e+00 +7.072000000000000508e-02 7.616365000000000407e+01 6.171050000000000146e+00 +7.094999999999999918e-02 7.959243999999999630e+01 6.308419999999999916e+00 +7.434000000000000330e-02 6.139544999999999675e+01 5.540549999999999642e+00 +7.721999999999999698e-02 5.528307999999999822e+01 5.257520000000000415e+00 +7.799000000000000377e-02 5.105310999999999666e+01 5.052380000000000315e+00 +8.164000000000000423e-02 4.131436000000000064e+01 4.545020000000000060e+00 +8.343000000000000416e-02 3.883191999999999666e+01 4.406349999999999767e+00 +8.523999999999999633e-02 3.386838999999999800e+01 4.115120000000000111e+00 +8.881000000000000005e-02 2.873742000000000019e+01 3.790610000000000035e+00 +8.959999999999999909e-02 2.744166999999999845e+01 3.704159999999999897e+00 +9.569999999999999341e-02 2.114314999999999856e+01 3.251399999999999846e+00 +1.017799999999999955e-01 1.639198000000000022e+01 2.862859999999999960e+00 +1.079999999999999988e-01 1.302345000000000041e+01 2.551810000000000134e+00 +1.141699999999999937e-01 1.067233000000000054e+01 2.310010000000000119e+00 +1.202099999999999974e-01 8.927680000000000504e+00 2.112779999999999880e+00 +1.263600000000000001e-01 7.691300000000000026e+00 1.961030000000000051e+00 +1.325600000000000112e-01 6.633219999999999672e+00 1.821159999999999890e+00 +1.387799999999999867e-01 6.187759999999999927e+00 1.758939999999999948e+00 +1.449100000000000110e-01 5.397269999999999790e+00 1.642749999999999932e+00 +1.509500000000000008e-01 5.127299999999999969e+00 1.601140000000000008e+00 +1.571200000000000097e-01 4.947350000000000136e+00 1.572789999999999910e+00 +1.633400000000000130e-01 4.791970000000000063e+00 1.547900000000000054e+00 +1.695200000000000040e-01 4.839830000000000076e+00 1.555609999999999937e+00 +1.756399999999999906e-01 4.855599999999999916e+00 1.558140000000000081e+00 +1.818099999999999994e-01 4.971189999999999998e+00 1.576580000000000092e+00 +1.880199999999999927e-01 4.996179999999999843e+00 1.580540000000000056e+00 +1.941299999999999970e-01 5.231489999999999974e+00 1.617329999999999934e+00 +2.002299999999999913e-01 5.461660000000000181e+00 1.652519999999999989e+00 +2.063699999999999979e-01 5.566430000000000433e+00 1.668299999999999894e+00 +2.125400000000000067e-01 5.749649999999999928e+00 1.695529999999999982e+00 +2.186899999999999955e-01 5.962720000000000020e+00 1.726660000000000084e+00 +2.248100000000000098e-01 6.366220000000000212e+00 1.784129999999999994e+00 +2.309900000000000009e-01 6.576419999999999710e+00 1.813339999999999952e+00 +2.372100000000000042e-01 6.993730000000000224e+00 1.869990000000000041e+00 +2.433800000000000130e-01 7.112300000000000288e+00 1.885780000000000012e+00 +2.494999999999999996e-01 7.346860000000000390e+00 1.916619999999999990e+00 +2.556300000000000239e-01 7.629410000000000025e+00 1.953130000000000033e+00 +2.617900000000000227e-01 7.827810000000000379e+00 1.978359999999999896e+00 +2.679900000000000060e-01 8.252810000000000201e+00 2.031359999999999832e+00 +2.741399999999999948e-01 8.304840000000000444e+00 2.037749999999999950e+00 +2.802200000000000246e-01 8.705450000000000799e+00 2.086320000000000174e+00 +2.863899999999999779e-01 8.881330000000000169e+00 2.107289999999999885e+00 +2.926000000000000267e-01 9.112230000000000274e+00 2.134510000000000129e+00 +2.987500000000000155e-01 9.303969999999999629e+00 2.156849999999999934e+00 diff --git a/test/sasdataloader/data/nxcansas_1Dand2D_multisasdata.h5 b/test/sasdataloader/data/nxcansas_1Dand2D_multisasdata.h5 index 4002fcb7c..125c90633 100644 Binary files a/test/sasdataloader/data/nxcansas_1Dand2D_multisasdata.h5 and b/test/sasdataloader/data/nxcansas_1Dand2D_multisasdata.h5 differ diff --git a/test/sasdataloader/data/nxcansas_1Dand2D_multisasentry.h5 b/test/sasdataloader/data/nxcansas_1Dand2D_multisasentry.h5 index 220ae520b..fdce32035 100644 Binary files a/test/sasdataloader/data/nxcansas_1Dand2D_multisasentry.h5 and b/test/sasdataloader/data/nxcansas_1Dand2D_multisasentry.h5 differ diff --git a/test/sasdataloader/data/nxcansas_1Dand2D_multisasentry_multisasdata.h5 b/test/sasdataloader/data/nxcansas_1Dand2D_multisasentry_multisasdata.h5 index 917a5f4f9..fee4255d5 100644 Binary files a/test/sasdataloader/data/nxcansas_1Dand2D_multisasentry_multisasdata.h5 and b/test/sasdataloader/data/nxcansas_1Dand2D_multisasentry_multisasdata.h5 differ diff --git a/test/sasdataloader/reference/nxcansas_1Dand2D_multisasdata.txt b/test/sasdataloader/reference/nxcansas_1Dand2D_multisasdata.txt index 8f13d2536..ad56786dd 100644 --- a/test/sasdataloader/reference/nxcansas_1Dand2D_multisasdata.txt +++ b/test/sasdataloader/reference/nxcansas_1Dand2D_multisasdata.txt @@ -23,7 +23,7 @@ Collimation: Length: None Detector: Name: front-detector - Distance: 2845.260009765625 mm + Distance: 2845.26 mm Offset: None Orientation: None Beam center: None @@ -31,7 +31,7 @@ Detector: Slit length: None Detector: Name: rear-detector - Distance: 4385.27978515625 mm + Distance: 4385.28 mm Offset: None Orientation: None Beam center: None diff --git a/test/sasdataloader/reference/nxcansas_1Dand2D_multisasentry.txt b/test/sasdataloader/reference/nxcansas_1Dand2D_multisasentry.txt index 3d375dcf7..9353db922 100644 --- a/test/sasdataloader/reference/nxcansas_1Dand2D_multisasentry.txt +++ b/test/sasdataloader/reference/nxcansas_1Dand2D_multisasentry.txt @@ -23,7 +23,7 @@ Collimation: Length: None Detector: Name: front-detector - Distance: 2845.260009765625 mm + Distance: 2845.26 mm Offset: None Orientation: None Beam center: None @@ -31,7 +31,7 @@ Detector: Slit length: None Detector: Name: rear-detector - Distance: 4385.27978515625 mm + Distance: 4385.28 mm Offset: None Orientation: None Beam center: None @@ -70,7 +70,7 @@ Collimation: Length: None Detector: Name: front-detector - Distance: 2845.260009765625 mm + Distance: 2845.26 mm Offset: None Orientation: None Beam center: None @@ -78,7 +78,7 @@ Detector: Slit length: None Detector: Name: rear-detector - Distance: 4385.27978515625 mm + Distance: 4385.28 mm Offset: None Orientation: None Beam center: None diff --git a/test/sasdataloader/utest_data_names.py b/test/sasdataloader/utest_data_names.py new file mode 100644 index 000000000..11dcb6773 --- /dev/null +++ b/test/sasdataloader/utest_data_names.py @@ -0,0 +1,43 @@ +""" +Tests for generation of unique, but reproducible, names for data quantities +""" + +import os + +import pytest + +from sasdata.data import SasData +from sasdata.temp_ascii_reader import load_data_default_params +from sasdata.temp_hdf5_reader import load_data as hdf_load_data +from sasdata.temp_xml_reader import load_data as xml_load_data + + +def local_load(path: str) -> SasData: + """Get local file path""" + base = os.path.join(os.path.dirname(__file__), path) + if os.path.exists(f"{base}.h5"): + return hdf_load_data(f"{base}.h5").values() + if os.path.exists(f"{base}.xml"): + return xml_load_data(f"{base}.xml").values() + if os.path.exists(f"{base}.txt"): + return load_data_default_params(f"{base}.txt") + assert False + + +test_file_names = [ + ("ascii_test_1", "::Q:3KrS58TPgclJ1rgyr0VQp3"), + ("ISIS_1_1", "TK49 c10_SANS:79680:Q:4TghWEoJi6xxhyeDXhS751"), + ("cansas1d", "Test title:1234:Q:440tNBqdx9jvci6CgjmrmD"), + ("MAR07232_rest", "MAR07232_rest_out.dat:2:/sasentry01/sasdata01/Qx:2Y0qTTb054KSJnJaJv0rFl"), + ("simpleexamplefile", "::/sasentry01/sasdata01/Q:uoHMeB8mukElC1uLCy7Sd"), +] + + +@pytest.mark.names +@pytest.mark.parametrize("x", test_file_names) +def test_quantity_name(x): + (f, expected) = x + data = [v for v in local_load(f"data/{f}")][0] + if data.metadata.title is not None: + assert data.abscissae.unique_id.startswith(data.metadata.title) + assert data.abscissae.unique_id == expected diff --git a/test/sasdataloader/utest_sasdataload.py b/test/sasdataloader/utest_sasdataload.py index 735904352..97cf14e0a 100644 --- a/test/sasdataloader/utest_sasdataload.py +++ b/test/sasdataloader/utest_sasdataload.py @@ -393,7 +393,7 @@ def test_load_file(test_case: BaseTestCase): for index, values in expected.items(): for column, expected_value in values.items(): if is_uncertainty(column): - assert loaded._data_contents[column[1::]]._variance[index] == pytest.approx(expected_value**2) + assert loaded._data_contents[column[1::]]._standard_error[index] == pytest.approx(expected_value) else: assert loaded._data_contents[column].value[index] == pytest.approx(expected_value) diff --git a/test/sasmanipulations/helper.py b/test/sasmanipulations/helper.py index 21d0a288b..cc1c8025b 100644 --- a/test/sasmanipulations/helper.py +++ b/test/sasmanipulations/helper.py @@ -4,35 +4,41 @@ import numpy as np from scipy import integrate -from sasdata.dataloader import data_info +from sasdata.data import SasData +from sasdata.dataset_types import two_dim +from sasdata.metadata import Instrument, Metadata, Source from sasdata.quantities.constants import TwoPi +from sasdata.quantities.quantity import Quantity +from sasdata.quantities.units import angstroms, per_angstrom, per_centimeter def make_dd_from_func(func, matrix_size=201): """ - Create a MatrixToData2D from a function of (x, y). Returns the MatrixToData2D - instance and matrix_size for convenience. + Create a MatrixToSasData from a function of (x, y). + Returns the MatrixToSasData instance and matrix_size for convenience. func should accept (x, y) meshgrid arrays and return a 2D array. """ x, y = np.meshgrid(np.linspace(-1, 1, matrix_size), np.linspace(-1, 1, matrix_size)) mat = func(x, y) - return MatrixToData2D(data2d=mat), matrix_size + return MatrixToSasData(data2d=mat), matrix_size def make_uniform_dd(shape=(100, 100), value=1.0): mat = np.full(shape, value, dtype=float) - return MatrixToData2D(data2d=mat) + return MatrixToSasData(data2d=mat) def integrate_1d_output(output, method="simpson"): """ Integrate output from an averager consistently. - - If output is a Data1D-like object with .x and .y -> integrate y(x) + - If output is a SasData-like object with "Q" and "I" -> integrate I(Q) - If output is a tuple (result, error[, npoints]) -> return numeric result """ - if hasattr(output, "x") and hasattr(output, "y"): + if (hasattr(output, "_data_contents") and + "Q" in output._data_contents and + "I" in output._data_contents): if method == "trapezoid": - return integrate.trapezoid(output.y, output.x) - return integrate.simpson(output.y, output.x) + return integrate.trapezoid(output._data_contents["I"].value, output._data_contents["Q"].value) + return integrate.simpson(output._data_contents["I"].value, output._data_contents["Q"].value) if isinstance(output, tuple) and len(output) >= 1: return output[0] raise TypeError("Unsupported averager output type: %r" % type(output)) @@ -53,13 +59,13 @@ def expected_slaby_area(qx_min, qx_max, qy_min, qy_max): return x_part_avg * y_part_integ def make_uniform_dd(shape=(100, 100), value=1.0): - """Convenience for tests that need a constant matrix Data2D.""" + """Convenience for tests that need a constant matrix SasData.""" mat = np.full(shape, value, dtype=float) - return MatrixToData2D(data2d=mat) + return MatrixToSasData(data2d=mat) def run_and_integrate(averager, dd, integrator="simpson"): """ - Run an averager (callable) with a Data2D container returned by MatrixToData2D + Run an averager (callable) with a SasData container returned by MatrixToSasData and return the integrated result (scalar area / sum) consistently. """ out = averager(dd.data) @@ -90,9 +96,9 @@ def expected_boxavg_and_err(matrix, slice_rows=None, slice_cols=None): return avg, err -class MatrixToData2D: +class MatrixToSasData: """ - Create Data2D objects from supplied 2D arrays of data. + Create 2D SasData objects from supplied 2D arrays of data. Error data can also be included. Adapted from sasdata.data_util.manipulations.reader_2D_converter @@ -105,18 +111,43 @@ def __init__(self, data2d=None, err_data=None): # qmax can be any number, 1 just makes things simple. self.qmax = 1 - # Creating a Data2D object to use for testing the averagers. - self.data = data_info.Data2D(data=data_flat, err_data=err_flat, - qx_data=qx_data, qy_data=qy_data, - q_data=q_data, mask=mask) + + # Create a SasData object to use for testing the averagers. + data_contents = { + "Qx": Quantity(qx_data, per_angstrom), + "Qy": Quantity(qy_data, per_angstrom), + "I": Quantity(data_flat, per_centimeter), + "dI": Quantity(err_flat, per_centimeter) + } + + wavelength = Quantity(1., angstroms) + source = Source(radiation=None, + beam_shape=None, + beam_size=None, + wavelength=wavelength, + wavelength_max=None, + wavelength_min=None, + wavelength_spread=None) + instrument = Instrument(collimations=[], + source=source, + detector=[]) + metadata=Metadata(title=None, + run=[], + definition=None, + process=[], + sample=None, + instrument=instrument, + raw=None) + + self.data = SasData("Matrix Data", data_contents, two_dim, metadata) def _validate_and_convert_inputs(self, data2d, err_data): """Validate inputs and coerce to numpy arrays. Returns (matrix, err_data_or_None).""" if data2d is None: - raise ValueError("Data must be supplied to convert to Data2D") + raise ValueError("Data must be supplied to convert to SasData") matrix = np.asarray(data2d) if matrix.ndim != 2: - raise ValueError("Supplied array must have 2 dimensions to convert to Data2D") + raise ValueError("Supplied array must have 2 dimensions to convert to SasData") if err_data is not None: err_arr = np.asarray(err_data) @@ -133,16 +164,6 @@ def _compute_bins(self, matrix_shape): qx_bins = np.linspace(start=-1 * 1, stop=1, num=cols, endpoint=True) qy_bins = np.linspace(start=-1 * 1, stop=1, num=rows, endpoint=True) return qx_bins, qy_bins - # qmax can be any number, 1 just makes things simple. - self.qmax = 1 - qx_bins = np.linspace(start=-1 * self.qmax, - stop=self.qmax, - num=matrix.shape[1], - endpoint=True) - qy_bins = np.linspace(start=-1 * self.qmax, - stop=self.qmax, - num=matrix.shape[0], - endpoint=True) def _build_flat_arrays(self, matrix, err_arr, qx_bins, qy_bins): """Flatten matrix and build qx, qy, q arrays plus mask and error handling.""" diff --git a/test/sasmanipulations/utest_averaging.py b/test/sasmanipulations/utest_averaging.py index c8281f6ee..5b6b02eaa 100644 --- a/test/sasmanipulations/utest_averaging.py +++ b/test/sasmanipulations/utest_averaging.py @@ -3,7 +3,7 @@ import numpy as np -import sasdata.dataloader.data_info as data_info +from sasdata.data import SasData, sasdata_reader2D_converter from sasdata.data_util.manipulations import ( Boxavg, Boxsum, @@ -14,10 +14,14 @@ SlabX, SlabY, position_and_wavelength_to_q, - reader2D_converter, ) -from sasdata.dataloader.loader import Loader +from sasdata.dataset_types import two_dim +from sasdata.metadata import Detector, Instrument, Metadata, Source, Vec3 from sasdata.quantities.constants import Pi, TwoPi +from sasdata.quantities.quantity import Quantity +from sasdata.quantities.units import angstroms, millimeters, none, per_angstrom, per_centimeter +from sasdata.temp_ascii_reader import load_data_default_params as ascii_load_data +from sasdata.temp_hdf5_reader import load_data as hdf_load_data def find(filename): @@ -25,9 +29,7 @@ def find(filename): class Averaging(unittest.TestCase): - """ - Test averaging manipulations on a flat distribution - """ + """Test averaging manipulations on a flat distribution.""" def setUp(self): """ @@ -37,25 +39,45 @@ def setUp(self): x_0 = np.ones([100, 100]) dx_0 = np.ones([100, 100]) - self.data = data_info.Data2D(data=x_0, err_data=dx_0) - detector = data_info.Detector() - detector.distance = 1000.0 # mm - detector.pixel_size.x = 1.0 # mm - detector.pixel_size.y = 1.0 # mm - - # center in pixel position = (len(x_0)-1)/2 - detector.beam_center.x = (len(x_0) - 1) / 2 # pixel number - detector.beam_center.y = (len(x_0) - 1) / 2 # pixel number - self.data.detector.append(detector) - - source = data_info.Source() - source.wavelength = 10.0 # A - self.data.source = source + data_contents = { + "Qx": Quantity(np.arange(100), per_angstrom), + "Qy": Quantity(np.arange(100), per_angstrom), + "I": Quantity(x_0, per_centimeter), + "dI": Quantity(dx_0, per_centimeter) + } + + wavelength = Quantity(10.0, angstroms) + source = Source(radiation=None, + beam_shape=None, + beam_size=None, + wavelength=wavelength, + wavelength_max=None, + wavelength_min=None, + wavelength_spread=None) + detector = Detector(name = None, + distance = Quantity(1000.0, millimeters), + offset = None, + orientation = None, + beam_center = Vec3(x=Quantity(0.5 * (len(x_0) - 1), none), y=Quantity(0.5 * (len(x_0) - 1), none), z=None), + pixel_size = Vec3(x=Quantity(1.0, millimeters), y=Quantity(1.0, millimeters), z=None), + slit_length = None) + instrument = Instrument(collimations=[], + source=source, + detector=[detector]) + metadata=Metadata(title=None, + run=[], + definition=None, + process=[], + sample=None, + instrument=instrument, + raw=None) + + self.data = SasData("Test Averaging", data_contents, two_dim, metadata) # get_q(dx, dy, det_dist, wavelength) where units are mm,mm,mm,and A # respectively. - self.qmin = position_and_wavelength_to_q(1.0, 1.0, detector.distance, source.wavelength) - self.qmax = position_and_wavelength_to_q(49.5, 49.5, detector.distance, source.wavelength) + self.qmin = position_and_wavelength_to_q(1.0, 1.0, detector.distance.value, source.wavelength.value) + self.qmax = position_and_wavelength_to_q(49.5, 49.5, detector.distance.value, source.wavelength.value) self.qstep = len(x_0) x = np.linspace(start=-1 * self.qmax, @@ -68,35 +90,31 @@ def setUp(self): endpoint=True) self.data.x_bins = x self.data.y_bins = y - self.data = reader2D_converter(self.data) + self.data = sasdata_reader2D_converter(self.data) def test_ring_flat_distribution(self): - """ - Test ring averaging - """ - r = Ring(r_min=2 * self.qmin, r_max=5 * self.qmin, - center_x=self.data.detector[0].beam_center.x, - center_y=self.data.detector[0].beam_center.y) + """Test ring averaging.""" + r = Ring(r_min=2*self.qmin, + r_max=5*self.qmin, + center_x=self.data.metadata.instrument.detector[0].beam_center.x.value, + center_y=self.data.metadata.instrument.detector[0].beam_center.y.value) r.nbins_phi = 20 o = r(self.data) for i in range(20): - self.assertEqual(o.y[i], 1.0) + self.assertEqual(o._data_contents["I"].value[i], 1.0) def test_sectorphi_full(self): - """ - Test sector averaging - """ + """Test sector averaging.""" r = SectorPhi(r_min=self.qmin, r_max=3 * self.qmin, phi_min=0, phi_max=TwoPi) r.nbins_phi = 20 o = r(self.data) for i in range(7): - self.assertEqual(o.y[i], 1.0) + self.assertEqual(o._data_contents["I"].value[i], 1.0) def test_sectorphi_partial(self): - """ - """ + """Test sector averaging.""" phi_max = Pi * 1.5 r = SectorPhi(r_min=self.qmin, r_max=3 * self.qmin, phi_min=0, phi_max=phi_max) @@ -105,36 +123,42 @@ def test_sectorphi_partial(self): o = r(self.data) self.assertEqual(r.phi_max, phi_max) for i in range(17): - self.assertEqual(o.y[i], 1.0) + self.assertEqual(o._data_contents["I"].value[i], 1.0) class DataInfoTests(unittest.TestCase): def setUp(self): filepath = find('MAR07232_rest.h5') - self.data_list = Loader().load(filepath) - self.data = self.data_list[0] + data_dict = hdf_load_data(filepath) + self.data = data_dict['sasentry01'] def test_ring(self): - """ - Test ring averaging - """ + """Test ring averaging.""" + if beam_center := self.data.metadata.instrument.detector[0].beam_center: + center_x = beam_center.x.value + center_y = beam_center.y.value + else: + center_x = 0.0 + center_y = 0.0 + r = Ring(r_min=.005, r_max=.01, - center_x=self.data.detector[0].beam_center.x, - center_y=self.data.detector[0].beam_center.y, + center_x=center_x, + center_y=center_y, nbins=20) r.nbins_phi = 20 o = r(self.data) filepath = find('ring_testdata.txt') - answer_list = Loader().load(filepath) + answer_list = ascii_load_data(filepath) answer = answer_list[0] self.assertEqual(len(answer_list), 1) for i in range(r.nbins_phi - 1): - self.assertAlmostEqual(o.x[i + 1], answer.x[i], 4) - self.assertAlmostEqual(o.y[i + 1], answer.y[i], 4) - self.assertAlmostEqual(o.dy[i + 1], answer.dy[i], 4) + # Current ascii reader implementation assumes file data is "one_dim" + self.assertAlmostEqual(o._data_contents["Phi"].value[i], answer._data_contents["Q"].value[i], 4) + self.assertAlmostEqual(o._data_contents["I"].value[i], answer._data_contents["I"].value[i], 4) + self.assertAlmostEqual(o._data_contents["I"].variance.value[i], answer._data_contents["I"].variance.value[i], 4) def test_circularavg(self): """ @@ -148,11 +172,11 @@ def test_circularavg(self): o = r(self.data) filepath = find('avg_testdata.txt') - answer = Loader().load(filepath)[0] + answer = ascii_load_data(filepath)[0] for i in range(r.nbins_phi): - self.assertAlmostEqual(o.x[i], answer.x[i], delta=1e-4) - self.assertAlmostEqual(o.y[i], answer.y[i], delta=1e-4) - self.assertAlmostEqual(o.dy[i], answer.dy[i],delta=1e-4) + self.assertAlmostEqual(o._data_contents["Q"].value[i], answer._data_contents["Q"].value[i], delta=1e-4) + self.assertAlmostEqual(o._data_contents["I"].value[i], answer._data_contents["I"].value[i], delta=1e-4) + self.assertAlmostEqual(o._data_contents["I"].variance.value[i], answer._data_contents["I"].variance.value[i], delta=1e-4) def test_box(self): """ @@ -183,11 +207,11 @@ def test_slabX(self): o = r(self.data) filepath = find('slabx_testdata.txt') - answer = Loader().load(filepath)[0] - for i in range(len(o.x)): - self.assertAlmostEqual(o.x[i], answer.x[i], 4) - self.assertAlmostEqual(o.y[i], answer.y[i], 4) - self.assertAlmostEqual(o.dy[i], answer.dy[i], 4) + answer = ascii_load_data(filepath)[0] + for i in range(len(o._data_contents["Q"].value)): + self.assertAlmostEqual(o._data_contents["Q"].value[i], answer._data_contents["Q"].value[i], 4) + self.assertAlmostEqual(o._data_contents["I"].value[i], answer._data_contents["I"].value[i], 4) + self.assertAlmostEqual(o._data_contents["I"].variance.value[i], answer._data_contents["I"].variance.value[i], 4) def test_slabY(self): """ @@ -201,11 +225,11 @@ def test_slabY(self): o = r(self.data) filepath = find('slaby_testdata.txt') - answer = Loader().load(filepath)[0] - for i in range(len(o.x)): - self.assertAlmostEqual(o.x[i], answer.x[i], 4) - self.assertAlmostEqual(o.y[i], answer.y[i], 4) - self.assertAlmostEqual(o.dy[i], answer.dy[i], 4) + answer = ascii_load_data(filepath)[0] + for i in range(len(o._data_contents["Q"].value)): + self.assertAlmostEqual(o._data_contents["Q"].value[i], answer._data_contents["Q"].value[i], 4) + self.assertAlmostEqual(o._data_contents["I"].value[i], answer._data_contents["I"].value[i], 4) + self.assertAlmostEqual(o._data_contents["I"].variance.value[i], answer._data_contents["I"].variance.value[i], 4) def test_sectorphi_full(self): """ @@ -227,11 +251,11 @@ def test_sectorphi_full(self): o = r(self.data) filepath = find('ring_testdata.txt') - answer = Loader().load(filepath)[0] - for i in range(len(o.x)): - self.assertAlmostEqual(o.x[i], answer.x[i], 4) - self.assertAlmostEqual(o.y[i], answer.y[i], 4) - self.assertAlmostEqual(o.dy[i], answer.dy[i], 4) + answer = ascii_load_data(filepath)[0] + for i in range(len(o._data_contents["Q"].value)-1): + self.assertAlmostEqual(o._data_contents["Q"].value[i], answer._data_contents["Q"].value[i+1], 4) + self.assertAlmostEqual(o._data_contents["I"].value[i], answer._data_contents["I"].value[i+1], 4) + self.assertAlmostEqual(o._data_contents["I"].variance.value[i], answer._data_contents["I"].variance.value[i+1], 4) def test_sectorphi_quarter(self): """ @@ -244,11 +268,11 @@ def test_sectorphi_quarter(self): o = r(self.data) filepath = find('sectorphi_testdata.txt') - answer = Loader().load(filepath)[0] - for i in range(len(o.x)): - self.assertAlmostEqual(o.x[i], answer.x[i], 4) - self.assertAlmostEqual(o.y[i], answer.y[i], 4) - self.assertAlmostEqual(o.dy[i], answer.dy[i], 4) + answer = ascii_load_data(filepath)[0] + for i in range(len(o._data_contents["Q"].value)): + self.assertAlmostEqual(o._data_contents["Q"].value[i], answer._data_contents["Q"].value[i], 4) + self.assertAlmostEqual(o._data_contents["I"].value[i], answer._data_contents["I"].value[i], 4) + self.assertAlmostEqual(o._data_contents["I"].variance.value[i], answer._data_contents["I"].variance.value[i], 4) def test_sectorq_full(self): """ @@ -261,11 +285,11 @@ def test_sectorq_full(self): o = r(self.data) filepath = find('sectorq_testdata.txt') - answer = Loader().load(filepath)[0] - for i in range(len(o.x)): - self.assertAlmostEqual(o.x[i], answer.x[i], 4) - self.assertAlmostEqual(o.y[i], answer.y[i], 4) - self.assertAlmostEqual(o.dy[i], answer.dy[i], 4) + answer = ascii_load_data(filepath)[0] + for i in range(len(o._data_contents["Q"].value)): + self.assertAlmostEqual(o._data_contents["Q"].value[i], answer._data_contents["Q"].value[i], 4) + self.assertAlmostEqual(o._data_contents["I"].value[i], answer._data_contents["I"].value[i], 4) + self.assertAlmostEqual(o._data_contents["I"].variance.value[i], answer._data_contents["I"].variance.value[i], 4) def test_sectorq_log(self): """ @@ -278,8 +302,8 @@ def test_sectorq_log(self): o = r(self.data) expected_binning = np.logspace(np.log10(0.005), np.log10(0.01), 20, base=10) - for i in range(len(o.x)): - self.assertAlmostEqual(o.x[i], expected_binning[i], 3) + for i in range(len(o._data_contents["Q"].value)): + self.assertAlmostEqual(o._data_contents["Q"].value[i], expected_binning[i], 3) # TODO: Test for Y values (o.y) # print len(self.data.x_bins) diff --git a/test/sasmanipulations/utest_averaging_box.py b/test/sasmanipulations/utest_averaging_box.py index f3b4ec4a4..806d5ccad 100644 --- a/test/sasmanipulations/utest_averaging_box.py +++ b/test/sasmanipulations/utest_averaging_box.py @@ -6,9 +6,9 @@ import numpy as np from sasdata.data_util.averaging import Boxavg, Boxsum -from sasdata.dataloader import data_info +from sasdata.metadata import Detector from test.sasmanipulations.helper import ( - MatrixToData2D, + MatrixToSasData, expected_boxavg_and_err, expected_boxsum_and_err, make_uniform_dd, @@ -43,10 +43,18 @@ def test_boxsum_multiple_detectors(self): Test Boxsum raises an error when there are multiple detectors. """ dd = make_uniform_dd((100, 100), value=1.0) - detector1 = data_info.Detector() - detector2 = data_info.Detector() - dd.data.detector.append(detector1) - dd.data.detector.append(detector2) + + detector = Detector( + name = None, + distance = None, + offset = None, + orientation = None, + beam_center = None, + pixel_size = None, + slit_length = None) + + dd.data.metadata.instrument.detector.append(detector) + dd.data.metadata.instrument.detector.append(detector) box_object = Boxsum() self.assertRaises(ValueError, box_object, dd.data) @@ -58,7 +66,7 @@ def test_boxsum_total(self): # Creating a 100x100 matrix for a distribution which is flat in y # and linear in x. test_data = np.tile(np.arange(100), (100, 1)) - dd = MatrixToData2D(data2d=test_data) + dd = MatrixToSasData(data2d=test_data) box_object = Boxsum(qx_range=(-1 * dd.qmax, dd.qmax), qy_range=(-1 * dd.qmax, dd.qmax)) result, error, npoints = box_object(dd.data) @@ -74,7 +82,7 @@ def test_boxsum_subset_total(self): # Creating a 100x100 matrix for a distribution which is flat in y # and linear in x. test_data = np.tile(np.arange(100), (100, 1)) - dd = MatrixToData2D(data2d=test_data) + dd = MatrixToSasData(data2d=test_data) # region corresponds to central 50x50 in original test box_object = Boxsum(qx_range=(-0.5 * dd.qmax, 0.5 * dd.qmax), qy_range=(-0.5 * dd.qmax, 0.5 * dd.qmax)) @@ -91,7 +99,7 @@ def test_boxsum_zero_sum(self): """ test_data = np.ones([100, 100]) test_data[25:75, 25:75] = 0 - dd = MatrixToData2D(data2d=test_data) + dd = MatrixToSasData(data2d=test_data) box_object = Boxsum(qx_range=(-0.5 * dd.qmax, 0.5 * dd.qmax), qy_range=(-0.5 * dd.qmax, 0.5 * dd.qmax)) result, error, npoints = box_object(dd.data) @@ -127,10 +135,18 @@ def test_boxavg_multiple_detectors(self): Test Boxavg raises an error when there are multiple detectors. """ dd = make_uniform_dd((100, 100), value=1.0) - detector1 = data_info.Detector() - detector2 = data_info.Detector() - dd.data.detector.append(detector1) - dd.data.detector.append(detector2) + + detector = Detector( + name = None, + distance = None, + offset = None, + orientation = None, + beam_center = None, + pixel_size = None, + slit_length = None) + + dd.data.metadata.instrument.detector.append(detector) + dd.data.metadata.instrument.detector.append(detector) box_object = Boxavg() self.assertRaises(ValueError, box_object, dd.data) @@ -142,7 +158,7 @@ def test_boxavg_total(self): # Creating a 100x100 matrix for a distribution which is flat in y # and linear in x. test_data = np.tile(np.arange(100), (100, 1)) - dd = MatrixToData2D(data2d=test_data) + dd = MatrixToSasData(data2d=test_data) box_object = Boxavg(qx_range=(-1 * dd.qmax, dd.qmax), qy_range=(-1 * dd.qmax, dd.qmax)) result, error = box_object(dd.data) @@ -158,7 +174,7 @@ def test_boxavg_subset_total(self): # Creating a 100x100 matrix for a distribution which is flat in y # and linear in x. test_data = np.tile(np.arange(100), (100, 1)) - dd = MatrixToData2D(data2d=test_data) + dd = MatrixToSasData(data2d=test_data) box_object = Boxavg(qx_range=(-0.5 * dd.qmax, 0.5 * dd.qmax), qy_range=(-0.5 * dd.qmax, 0.5 * dd.qmax)) result, error = box_object(dd.data) @@ -175,7 +191,7 @@ def test_boxavg_zero_average(self): test_data = np.ones([100, 100]) # Make a hole in the middle with zeros test_data[25:75, 25:75] = np.zeros([50, 50]) - dd = MatrixToData2D(data2d=test_data) + dd = MatrixToSasData(data2d=test_data) box_object = Boxavg(qx_range=(-0.5 * dd.qmax, 0.5 * dd.qmax), qy_range=(-0.5 * dd.qmax, 0.5 * dd.qmax)) result, error = box_object(dd.data) diff --git a/test/sasmanipulations/utest_averaging_circle.py b/test/sasmanipulations/utest_averaging_circle.py index 36723c203..adcecb2a2 100644 --- a/test/sasmanipulations/utest_averaging_circle.py +++ b/test/sasmanipulations/utest_averaging_circle.py @@ -8,7 +8,7 @@ from sasdata.data_util.averaging import CircularAverage, Ring, SectorQ, WedgePhi, WedgeQ from sasdata.quantities.constants import Pi -from test.sasmanipulations.helper import CircularTestingMatrix, MatrixToData2D +from test.sasmanipulations.helper import CircularTestingMatrix, MatrixToSasData # TODO - also check the errors are being calculated correctly @@ -56,7 +56,7 @@ def test_circularaverage_check_q_data(self): Check CircularAverage ensures the data supplied has `q_data` populated """ # test_data = np.ones([100, 100]) - # averager_data = DataMatrixToData2D(test_data) + # averager_data = DataMatrixToSasData(test_data) # # Overwrite q_data so it's empty # averager_data.data.q_data = np.array([]) # circ_object = CircularAverage() @@ -76,7 +76,7 @@ def test_circularaverage_no_points_to_average(self): Test CircularAverage raises ValueError when the ROI contains no data """ test_data = np.ones([100, 100]) - averager_data = MatrixToData2D(test_data) + averager_data = MatrixToSasData(test_data) # Region of interest well outside region with data circ_object = CircularAverage(r_range=(2 * averager_data.qmax,3 * averager_data.qmax)) @@ -88,7 +88,7 @@ def test_circularaverage_averages_circularly(self): """ test_data = CircularTestingMatrix(frequency=2, matrix_size=201, major_axis='Q') - averager_data = MatrixToData2D(test_data.matrix) + averager_data = MatrixToSasData(test_data.matrix) # Test the ability to average over a subsection of the data r_min = averager_data.qmax * 0.25 @@ -99,7 +99,7 @@ def test_circularaverage_averages_circularly(self): data1d = circ_object(averager_data.data) expected_area = test_data.area_under_region(r_min=r_min, r_max=r_max) - actual_area = integrate.trapezoid(data1d.y, data1d.x) + actual_area = integrate.trapezoid(data1d._data_contents["I"].value, data1d._data_contents["Q"].value) # This used to be able to pass with a precision of 3 d.p. with the old # manipulations.py - I'm not sure why it doesn't anymore. @@ -146,7 +146,7 @@ def test_ring_no_points_to_average(self): Test Ring raises ValueError when the ROI contains no data """ test_data = np.ones([100, 100]) - averager_data = MatrixToData2D(test_data) + averager_data = MatrixToSasData(test_data) # Region of interest well outside region with data ring_object = Ring(r_range=(2 * averager_data.qmax, 3 * averager_data.qmax)) @@ -158,7 +158,7 @@ def test_ring_averages_azimuthally(self): """ test_data = CircularTestingMatrix(frequency=1, matrix_size=201, major_axis='Phi') - averager_data = MatrixToData2D(test_data.matrix) + averager_data = MatrixToSasData(test_data.matrix) # Test the ability to average over a subsection of the data r_min = 0.25 * averager_data.qmax @@ -169,7 +169,7 @@ def test_ring_averages_azimuthally(self): data1d = ring_object(averager_data.data) expected_area = test_data.area_under_region(r_min=r_min, r_max=r_max) - actual_area = integrate.simpson(data1d.y, data1d.x) + actual_area = integrate.simpson(data1d._data_contents["I"].value, data1d._data_contents["Phi"].value) self.assertAlmostEqual(actual_area, expected_area, 1) @@ -219,13 +219,13 @@ def test_sectorq_averaging_without_fold(self): """ test_data = CircularTestingMatrix(frequency=1, matrix_size=201, major_axis='Q') - averager_data = MatrixToData2D(test_data.matrix) + averager_data = MatrixToSasData(test_data.matrix) r_min = 0 r_max = 0.9 * averager_data.qmax - phi_min = Pi/6 - phi_max = 5*Pi/6 - nbins = int(test_data.matrix_size * np.sqrt(2)/4) # usually reliable + phi_min = Pi / 6.0 + phi_max = 5.0 * Pi / 6.0 + nbins = int(0.25 * test_data.matrix_size * np.sqrt(2)) # usually reliable wedge_object = SectorQ(r_range=(r_min, r_max), phi_range=(phi_min,phi_max), nbins=nbins) # Explicitly set fold to False - results span full +/- range @@ -241,7 +241,7 @@ def test_sectorq_averaging_without_fold(self): expected_area += test_data.area_under_region(r_min=r_min, r_max=r_max, phi_min=phi_min+Pi, phi_max=phi_max+Pi) - actual_area = integrate.simpson(data1d.y, data1d.x) + actual_area = integrate.simpson(data1d._data_contents["I"].value, data1d._data_contents["Q"].value) self.assertAlmostEqual(actual_area, expected_area, 1) @@ -252,13 +252,13 @@ def test_sectorq_averaging_with_fold(self): """ test_data = CircularTestingMatrix(frequency=1, matrix_size=201, major_axis='Q') - averager_data = MatrixToData2D(test_data.matrix) + averager_data = MatrixToSasData(test_data.matrix) r_min = 0 r_max = 0.9 * averager_data.qmax - phi_min = Pi/6 - phi_max = 5*Pi/6 - nbins = int(test_data.matrix_size * np.sqrt(2)/4) # usually reliable + phi_min = Pi / 6.0 + phi_max = 5.0 * Pi / 6.0 + nbins = int(0.25 * test_data.matrix_size * np.sqrt(2)) # usually reliable wedge_object = SectorQ(r_range=(r_min, r_max), phi_range=(phi_min,phi_max), nbins=nbins) # Explicitly set fold to True - points either side of 0,0 are averaged @@ -275,7 +275,7 @@ def test_sectorq_averaging_with_fold(self): phi_min=phi_min+Pi, phi_max=phi_max+Pi) expected_area /= 2 - actual_area = integrate.simpson(data1d.y, data1d.x) + actual_area = integrate.simpson(data1d._data_contents["I"].value, data1d._data_contents["Q"].value) self.assertAlmostEqual(actual_area, expected_area, 1) @@ -313,21 +313,20 @@ def test_wedgeq_averaging(self): """ test_data = CircularTestingMatrix(frequency=3, matrix_size=201, major_axis='Q') - averager_data = MatrixToData2D(test_data.matrix) + averager_data = MatrixToSasData(test_data.matrix) r_min = 0.1 * averager_data.qmax r_max = 0.9 * averager_data.qmax - phi_min = Pi/6 - phi_max = 5*Pi/6 + phi_min = Pi / 6.0 + phi_max = 5.0 * Pi / 6.0 nbins = int(test_data.matrix_size * np.sqrt(2)/4) # usually reliable wedge_object = WedgeQ(r_range=(r_min, r_max), phi_range=(phi_min,phi_max), nbins=nbins) data1d = wedge_object(averager_data.data) expected_area = test_data.area_under_region(r_min=r_min, r_max=r_max, - phi_min=phi_min, - phi_max=phi_max) - actual_area = integrate.simpson(data1d.y, data1d.x) + phi_min=phi_min, phi_max=phi_max) + actual_area = integrate.simpson(data1d._data_contents["I"].value, data1d._data_contents["Q"].value) self.assertAlmostEqual(actual_area, expected_area, 1) @@ -351,8 +350,6 @@ def test_wedgephi_init(self): nbins = 100 # base = 10 - # wedge_object = WedgePhi(r_min=r_min, r_max=r_max, phi_min=phi_min, - # phi_max=phi_max, nbins=nbins, base=base) wedge_object = WedgePhi(r_range=(r_min, r_max), phi_range=(phi_min,phi_max), nbins=nbins) self.assertEqual(wedge_object.r_min, r_min) @@ -376,21 +373,21 @@ def test_wedgephi_averaging(self): """ test_data = CircularTestingMatrix(frequency=1, matrix_size=201, major_axis='Phi') - averager_data = MatrixToData2D(test_data.matrix) + averager_data = MatrixToSasData(test_data.matrix) r_min = 0.1 * averager_data.qmax r_max = 0.9 * averager_data.qmax - phi_min = Pi/6 - phi_max = 5*Pi/6 - nbins = int(test_data.matrix_size * np.sqrt(2)/4) # usually reliable + phi_min = Pi / 6.0 + phi_max = 5.0 * Pi / 6.0 + nbins = int(0.25 *test_data.matrix_size * np.sqrt(2)) # usually reliable wedge_object = WedgePhi(r_range=(r_min, r_max), phi_range=(phi_min,phi_max), nbins=nbins) data1d = wedge_object(averager_data.data) expected_area = test_data.area_under_region(r_min=r_min, r_max=r_max, - phi_min=phi_min, - phi_max=phi_max) - actual_area = integrate.simpson(data1d.y, data1d.x) + phi_min=phi_min, phi_max=phi_max) + + actual_area = integrate.simpson(data1d._data_contents["I"].value, data1d._data_contents["Phi"].value) self.assertAlmostEqual(actual_area, expected_area, 1) diff --git a/test/sasmanipulations/utest_averaging_directional.py b/test/sasmanipulations/utest_averaging_directional.py index 7d8dc5174..7fbb5607c 100644 --- a/test/sasmanipulations/utest_averaging_directional.py +++ b/test/sasmanipulations/utest_averaging_directional.py @@ -9,7 +9,7 @@ import numpy as np from sasdata.data_util.binning import DirectionalAverage -from test.sasmanipulations.helper import MatrixToData2D +from test.sasmanipulations.helper import MatrixToSasData # TODO - also check the errors are being calculated correctly @@ -73,7 +73,7 @@ def setUp(self): x, y = np.meshgrid(self.qx_data, self.qy_data) # quadratic in x, linear in y data = x * x * y - self.data2d = MatrixToData2D(data) + self.data2d = MatrixToSasData(data) # ROI is the first quadrant only. Same limits for both axes. self.lims = (0.0, 1.0) @@ -85,9 +85,10 @@ def setUp(self): self.bin_width = (self.lims[1] - self.lims[0]) / self.nbins self.directional_average = \ - DirectionalAverage(major_axis=self.data2d.data.qx_data, - minor_axis=self.data2d.data.qy_data, - lims=(self.lims,self.lims), nbins=self.nbins) + DirectionalAverage(major_axis=self.data2d.data._data_contents["Qx"].value, + minor_axis=self.data2d.data._data_contents["Qy"].value, + lims=(self.lims,self.lims), + nbins=self.nbins) def test_bin_width(self): """ @@ -140,8 +141,8 @@ def test_directional_averaging(self): the bins. """ x_axis_values, intensity, errors = \ - self.directional_average(data=self.data2d.data.data, - err_data=self.data2d.data.err_data) + self.directional_average(data=self.data2d.data._data_contents["I"].value, + err_data=self.data2d.data._data_contents["dI"].value) expected_x = self.qx_data[self.in_roi] expected_intensity = np.mean(self.qy_data[self.in_roi]) * expected_x**2 @@ -156,8 +157,10 @@ def test_no_points_in_roi(self): # move the region of interest to outside the range of the data self.directional_average.major_lims = (2, 3) self.directional_average.minor_lims = (2, 3) - self.assertRaises(ValueError, self.directional_average, - self.data2d.data.data, self.data2d.data.err_data) + self.assertRaises(ValueError, + self.directional_average, + self.data2d.data._data_contents["I"].value, + self.data2d.data._data_contents["dI"].value) if __name__ == '__main__': unittest.main() diff --git a/test/sasmanipulations/utest_averaging_slab.py b/test/sasmanipulations/utest_averaging_slab.py index da6485867..b1a701dc1 100644 --- a/test/sasmanipulations/utest_averaging_slab.py +++ b/test/sasmanipulations/utest_averaging_slab.py @@ -6,9 +6,9 @@ import numpy as np from sasdata.data_util.averaging import SlabX, SlabY -from sasdata.dataloader import data_info +from sasdata.metadata import Detector from test.sasmanipulations.helper import ( - MatrixToData2D, + MatrixToSasData, expected_slabx_area, expected_slaby_area, integrate_1d_output, @@ -47,11 +47,19 @@ def test_slabx_multiple_detectors(self): """ Test that SlabX raises an error when there are multiple detectors """ - averager_data = MatrixToData2D(np.ones([100, 100])) - detector1 = data_info.Detector() - detector2 = data_info.Detector() - averager_data.data.detector.append(detector1) - averager_data.data.detector.append(detector2) + averager_data = MatrixToSasData(np.ones([100, 100])) + + detector = Detector( + name = None, + distance = None, + offset = None, + orientation = None, + beam_center = None, + pixel_size = None, + slit_length = None) + + averager_data.data.metadata.instrument.detector.append(detector) + averager_data.data.metadata.instrument.detector.append(detector) slab_object = SlabX() self.assertRaises(ValueError, slab_object, averager_data.data) @@ -61,7 +69,7 @@ def test_slabx_no_points_to_average(self): Test SlabX raises ValueError when the ROI contains no data """ test_data = np.ones([100, 100]) - averager_data = MatrixToData2D(data2d=test_data) + averager_data = MatrixToSasData(data2d=test_data) # Region of interest well outside region with data qx_min = 2 * averager_data.qmax @@ -155,11 +163,20 @@ def test_slaby_multiple_detectors(self): """ Test that SlabY raises an error when there are multiple detectors """ - averager_data = MatrixToData2D(np.ones([100, 100])) - detector1 = data_info.Detector() - detector2 = data_info.Detector() - averager_data.data.detector.append(detector1) - averager_data.data.detector.append(detector2) + averager_data = MatrixToSasData(np.ones([100, 100])) + + detector = Detector( + name = None, + distance = None, + offset = None, + orientation = None, + beam_center = None, + pixel_size = None, + slit_length = None) + + averager_data.data.metadata.instrument.detector.append(detector) + averager_data.data.metadata.instrument.detector.append(detector) + slab_object = SlabY() self.assertRaises(ValueError, slab_object, averager_data.data) @@ -168,7 +185,7 @@ def test_slaby_no_points_to_average(self): Test SlabY raises ValueError when the ROI contains no data """ test_data = np.ones([100, 100]) - averager_data = MatrixToData2D(data2d=test_data) + averager_data = MatrixToSasData(data2d=test_data) # Region of interest well outside region with data qx_min = 2 * averager_data.qmax diff --git a/test/slicers/__init__.py b/test/slicers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/test/slicers/meshes_for_testing.py b/test/slicers/meshes_for_testing.py new file mode 100644 index 000000000..7e39ec75c --- /dev/null +++ b/test/slicers/meshes_for_testing.py @@ -0,0 +1,115 @@ +""" +Meshes used in testing along with some expected values +""" + +import numpy as np + +from sasdata.slicing.meshes.mesh import Mesh +from sasdata.slicing.meshes.meshmerge import meshmerge +from sasdata.slicing.meshes.voronoi_mesh import voronoi_mesh + +coords = np.arange(-4, 5) +grid_mesh = voronoi_mesh(*np.meshgrid(coords, coords)) + + +item_1 = np.array([ + [-3.5, -0.5], + [-0.5, 3.5], + [ 0.5, 3.5], + [ 3.5, -0.5], + [ 0.0, 1.5]], dtype=float) + +item_2 = np.array([ + [-1.0, -2.0], + [-2.0, -2.0], + [-2.0, -1.0], + [-1.0, -1.0]], dtype=float) + +mesh_points = np.concatenate((item_1, item_2), axis=0) +cells = [[0,1,2,3,4],[5,6,7,8]] + +shape_mesh = Mesh(mesh_points, cells) + +# Subset of the mappings that meshmerge should include +# This can be read off the plots generated below + + +expected_shape_mappings = [ + (100, -1), + (152, -1), + (141, -1), + (172, -1), + (170, -1), + (0, -1), + (1, -1), + (8, 0), + (9, 0), + (37, 0), + (83, 0), + (190, 1), + (186, 1), + (189, 1), + (193, 1) +] + +expected_grid_mappings = [ + (89, 0), + (90, 1), + (148, 16), + (175, 35), + (60, 47), + (44, 47), + (80, 60) +] + +# +# Mesh location tests +# + +location_test_mesh_points = np.array([ + [0, 0], # 0 + [0, 1], # 1 + [0, 2], # 2 + [1, 0], # 3 + [1, 1], # 4 + [1, 2], # 5 + [2, 0], # 6 + [2, 1], # 7 + [2, 2]], dtype=float) + +location_test_mesh_cells = [ + [0, 1, 4, 3], + [1, 2, 5, 4], + [3, 4, 7, 6], + [4, 5, 8, 7]] + +location_test_mesh = Mesh(location_test_mesh_points, location_test_mesh_cells) + +test_coords = 0.25 + 0.5*np.arange(4) +location_test_points_x, location_test_points_y = np.meshgrid(test_coords, test_coords) + +if __name__ == "__main__": + + import matplotlib.pyplot as plt + + combined_mesh, _, _ = meshmerge(grid_mesh, shape_mesh) + + plt.figure() + combined_mesh.show(actually_show=False, show_labels=True, color='k') + grid_mesh.show(actually_show=False, show_labels=True, color='r') + + plt.xlim([-5, 5]) + plt.ylim([-5, 5]) + + plt.figure() + combined_mesh.show(actually_show=False, show_labels=True, color='k') + shape_mesh.show(actually_show=False, show_labels=True, color='r') + + plt.xlim([-5, 5]) + plt.ylim([-5, 5]) + + plt.figure() + location_test_mesh.show(actually_show=False, show_labels=True) + plt.scatter(location_test_points_x, location_test_points_y) + + plt.show() diff --git a/test/slicers/utest_meshmerge.py b/test/slicers/utest_meshmerge.py new file mode 100644 index 000000000..a4a1645c2 --- /dev/null +++ b/test/slicers/utest_meshmerge.py @@ -0,0 +1,31 @@ +""" +Tests for mesh merging operations. + +It's pretty hard to test componentwise, but we can do some tests of the general behaviour +""" + +from sasdata.slicing.meshes.meshmerge import meshmerge +from test.slicers.meshes_for_testing import expected_grid_mappings, expected_shape_mappings, grid_mesh, shape_mesh + + +def test_meshmerge_mappings(): + """ Test the output of meshmerge is correct + + IMPORTANT IF TESTS FAIL!!!... The docs for scipy.spatial.Voronoi and Delaunay + say that the ordering of faces might depend on machine precession. Thus, these + tests might not be reliable... we'll see how they play out + """ + + import sys + if sys.platform == "darwin": + # It does indeed rely on machine precision, only run on windows and linux + return + + combined_mesh, grid_mappings, shape_mappings = meshmerge(grid_mesh, shape_mesh) + + for triangle_cell, grid_cell in expected_grid_mappings: + assert grid_mappings[triangle_cell] == grid_cell + + for triangle_cell, shape_cell in expected_shape_mappings: + assert shape_mappings[triangle_cell] == shape_cell + diff --git a/test/slicers/utest_point_assignment.py b/test/slicers/utest_point_assignment.py new file mode 100644 index 000000000..a82f1c790 --- /dev/null +++ b/test/slicers/utest_point_assignment.py @@ -0,0 +1,5 @@ + + + +def test_location_assignment(): + pass diff --git a/test/transforms/utest_NDrebin.py b/test/transforms/utest_NDrebin.py new file mode 100644 index 000000000..e5365a95d --- /dev/null +++ b/test/transforms/utest_NDrebin.py @@ -0,0 +1,272 @@ +import time + +import numpy as np +from matplotlib import pyplot as plt + +from sasdata.transforms.NDrebin import NDRebin + + +def test_1D_exact(show_plots: bool): + # Parameters for the Gaussian function + mu = 0.0 # Mean + sigma = 1.0 # Standard deviation + + # fiducial + xreal = np.linspace(-5, 5, 11) + Ireal = np.exp(-((xreal - mu) ** 2) / (2 * sigma ** 2)) / (sigma * np.sqrt(2 * np.pi)) + + # rebin to the exact same bins + rebin = NDRebin(Ireal, xreal, + lower=-5.5, upper=5.5, num_bins=11) + rebin.run() + Ibin = rebin.binned_data + qbin = rebin.bin_centers_list + + assert all(Ibin == Ireal) + assert all(qbin[0] == xreal) + + # Plot + if show_plots: + plt.figure() + plt.plot(qbin[0], Ibin, 'o', linewidth=2, label='bin') + plt.plot(xreal, Ireal, 'k-', linewidth=2, label='exact') + + plt.xlabel('x') + plt.ylabel('I') + plt.legend() + plt.tight_layout() + plt.show() + + + # rebin to the exact same bins with fractional + rebin = NDRebin(Ireal, xreal, + lower=-5.5, upper=5.5, num_bins=11, fractional=True) + rebin.run() + Ibin = rebin.binned_data + qbin = rebin.bin_centers_list + + assert all(Ibin == Ireal) + + # Plot + if show_plots: + plt.figure() + plt.plot(qbin[0], Ibin, 'o', linewidth=2, label='fractional bin') + plt.plot(xreal, Ireal, 'k-', linewidth=2, label='exact') + + plt.xlabel('x') + plt.ylabel('I') + plt.legend() + plt.tight_layout() + plt.show() + + + +def test_2D(show_plots: bool): + # Parameters of the 2D Gaussian + mu = np.array([0.15, 0.0, 0.0]) # Mean vector + sigma = np.array([0.015, 0.055, 0.05]) # Std dev in x and y + noise = 0. + SDD = 2.7 + k_0 = 2*np.pi/5 + pix_x = 1./128. + pix_y = 1./128. + + # Generate our 2D detector grid + x = np.arange(-64,64)*pix_x + y = np.arange(-64,64)*pix_y + + [xmesh, ymesh] = np.meshgrid(x, y) + + # calculate qx, qy, qz + qx = k_0*xmesh/np.sqrt(xmesh**2+ymesh**2+SDD**2) + qy = k_0*ymesh/np.sqrt(xmesh**2+ymesh**2+SDD**2) + qz = k_0-k_0*SDD/np.sqrt(xmesh**2+ymesh**2+SDD**2) + + # qmat + qmat0 = np.stack([qx,qy,qz], axis=2) + + # now rotate about y + angle_list = np.pi/180*np.linspace(-15,15,int(30/.25)) + qmat = np.zeros((len(x), len(y), len(angle_list), 3)) + for ind in range(len(angle_list)): + new_qmat = np.copy(qmat0) + new_qmat[:,:,0] = np.cos(angle_list[ind])*qmat0[:,:,0] - \ + np.sin(angle_list[ind])*qmat0[:,:,2] + new_qmat[:,:,2] = np.sin(angle_list[ind])*qmat0[:,:,0] + \ + np.cos(angle_list[ind])*qmat0[:,:,2] + qmat[:,:,ind,:] = qmat0 + + + # Evaluate Gaussian: + # G(x,y) = (1/(2πσxσy)) * exp(-[(x-μx)^2/(2σx^2) + (y-μy)^2/(2σy^2)]) + I_2D = ( + np.exp( + -((qmat[:,:,:,0] - mu[0])**2) / (2 * sigma[0]**2) + -((qmat[:,:,:,1] - mu[1])**2) / (2 * sigma[1]**2) + -((qmat[:,:,:,2] - mu[2])**2) / (2 * sigma[2]**2) + ) / + (2 * np.pi * sigma[0] * sigma[1] * sigma[2]) + ) + + # Add uniform noise + I_2D = I_2D - noise + 2 * noise * np.random.rand(*I_2D.shape) + + # Rebin in 2D. + # You can choose finite steps for both x and y depending on how you want bins defined. + start = time.perf_counter() + rebin = NDRebin(I_2D, qmat, + step_size=[0.006, 0.006, np.inf]) + rebin.run() + Ibin = rebin.binned_data + qbin = rebin.bin_centers_list + end = time.perf_counter() + print(f"Computed {qmat.size/3} points in {end - start:.6f} seconds") + + start = time.perf_counter() + rebin = NDRebin(I_2D, qmat, + step_size=[0.0035, 0.0035, np.inf], + fractional=True) + rebin.run() + Ibin2 = rebin.binned_data + qbin2 = rebin.bin_centers_list + end = time.perf_counter() + print(f"Computed {qmat.size/3} points with fractional binning in {end - start:.6f} seconds") + + + if show_plots: + # Fiducial 2D + [xmesh, ymesh] = np.meshgrid(qbin2[0], qbin2[1]) + Ireal = ( + np.exp( + -((xmesh - mu[0])**2) / (2 * sigma[0]**2) + -((ymesh - mu[1])**2) / (2 * sigma[1]**2) + ) / + (2 * np.pi * sigma[0] * sigma[1]) + ) + + # Plot a 1D slice of the binned data along x (y bins aggregated) + plt.figure(figsize=(4,8)) + + plt.subplot(3, 1, 1) + plt.pcolormesh(qbin[0], qbin[1], np.squeeze(Ibin.T), shading='nearest') + plt.xlabel('x') + plt.ylabel('y') + plt.title('sum') + plt.colorbar() + plt.tight_layout() + + plt.subplot(3, 1, 2) + plt.pcolormesh(qbin2[0], qbin2[1], np.squeeze(Ibin2.T), shading='nearest') + plt.xlabel('x') + plt.ylabel('y') + plt.title('sum') + plt.colorbar() + plt.tight_layout() + + plt.subplot(3, 1, 3) + plt.pcolormesh(xmesh, ymesh, Ireal, shading='nearest') + plt.xlabel('x') + plt.ylabel('y') + plt.title('real') + plt.colorbar() + plt.tight_layout() + plt.show() + + +def test_syntax(): + # test syntax + Ndims = 4 + Nvals = int(1e4) + qmat = np.random.rand(Ndims, Nvals) + Imat = np.random.rand(Nvals) + + rebin = NDRebin(Imat, qmat, + step_size=0.1*np.random.rand(Ndims)+0.05, + lower=0.1*np.random.rand(Ndims)+0.0, + upper=0.1*np.random.rand(Ndims)+0.9) + rebin.run() + Ibin = rebin.binned_data + qbin = rebin.bin_centers_list + + + # test syntax + Ndims = 2 + Nvals = int(1e4) + qmat = np.random.rand(Ndims, 100, Nvals) + Imat = np.random.rand(100, Nvals) + Imat_errs = np.random.rand(100, Nvals) + + rebin = NDRebin(Imat, qmat, + data_errs = Imat_errs, + num_bins=[10,20], + axes = np.eye(2), + fractional=True) + rebin.run() + Ibin = rebin.binned_data + qbin = rebin.bin_centers_list + Ibin_errs = rebin.binned_data_errs + bins_list = rebin.bins_list + step_size = rebin.step_size + num_bins = rebin.num_bins + + +# test ND gaussian +def test_ND(): + Ndims = 4 + mu = np.zeros(Ndims) # Mean vector + sigma = np.random.rand(Ndims) # Std dev in x and y + noise = 0.1 + Nvals = int(1e6) + + # Generate random points (x, y) in a 2D square + qmat = -5 + 10 * np.random.rand(Ndims, Nvals) + + # Evaluate 2D Gaussian: + # G(x,y) = (1/(2πσxσy)) * exp(-[(x-μx)^2/(2σx^2) + (y-μy)^2/(2σy^2)]) + exp_op = np.zeros(Nvals) + sigma_tot = 1 + for ind in range(Ndims): + exp_op = exp_op -((qmat[ind,:] - mu[ind])**2) / (2 * sigma[ind]**2) + sigma_tot = sigma_tot * sigma[ind] + I_ND = ( + np.exp(exp_op) / + (2 * np.pi * sigma_tot) + ) + + # Add uniform noise + I_ND = I_ND - noise + 2 * noise * np.random.rand(1,Nvals) + + # Rebin in 2D. + # You can choose finite steps for both x and y depending on how you want bins defined. + start = time.perf_counter() + rebin = NDRebin(I_ND, qmat, + step_size=0.2*np.random.rand(Ndims)+0.1, + lower=[1,2,3,0], + upper=[9,8,7,9.5] + ) + rebin.run() + Ibin = rebin.binned_data + qbin = rebin.bin_centers_list + end = time.perf_counter() + print(f"Computed {Nvals} points in {end - start:.6f} seconds") + + start = time.perf_counter() + rebin = NDRebin(I_ND, qmat, + step_size=0.2*np.random.rand(Ndims)+0.1, + lower=[1,2,3,0], + upper=[9,8,7,9.5], + fractional=True + ) + rebin.run() + Ibin = rebin.binned_data + qbin = rebin.bin_centers_list + end = time.perf_counter() + print(f"Computed {Nvals} points with fractional binning in {end - start:.6f} seconds") + + + +if __name__ == "__main__": + test_1D_exact(show_plots=True) + test_2D(show_plots=True) + test_syntax() + test_ND() diff --git a/test/transforms/utest_interpolation.py b/test/transforms/utest_interpolation.py index bfb0e54a3..9ac701ceb 100644 --- a/test/transforms/utest_interpolation.py +++ b/test/transforms/utest_interpolation.py @@ -1,101 +1,101 @@ -from collections.abc import Callable - -import numpy as np -import pytest -from matplotlib import pyplot as plt -from numpy.typing import ArrayLike - -from sasdata.quantities import units -from sasdata.quantities.plotting import quantity_plot -from sasdata.quantities.quantity import NamedQuantity, Quantity -from sasdata.transforms.rebinning import InterpolationOptions, calculate_interpolation_matrix_1d - -test_functions = [ - lambda x: x**2, - lambda x: 2*x, - lambda x: x**3 -] - -test_interpolation_orders = [ - InterpolationOptions.LINEAR, - InterpolationOptions.CUBIC -] - - -@pytest.mark.parametrize("fun", test_functions) -@pytest.mark.parametrize("order", test_interpolation_orders) -def test_interpolate_matrix_inside(fun: Callable[[Quantity[ArrayLike]], Quantity[ArrayLike]], order: InterpolationOptions, show_plots: bool): - original_points = NamedQuantity("x_base", np.linspace(-10,10, 31), units.meters) - test_points = NamedQuantity("x_test", np.linspace(-5, 5, 11), units.meters) - - - mapping, _ = calculate_interpolation_matrix_1d(original_points, test_points, order=order) - - y_original = fun(original_points) - y_test = y_original @ mapping - y_expected = fun(test_points) - - test_units = y_expected.units - - y_values_test = y_test.in_units_of(test_units) - y_values_expected = y_expected.in_units_of(test_units) - - if show_plots: - print(y_values_test) - print(y_values_expected) - - quantity_plot(original_points, y_original) - quantity_plot(test_points, y_test) - quantity_plot(test_points, y_expected) - plt.show() - - assert len(y_values_test) == len(y_values_expected) - - for t, e in zip(y_values_test, y_values_expected): - assert t == pytest.approx(e, abs=2) - - -@pytest.mark.parametrize("fun", test_functions) -@pytest.mark.parametrize("order", test_interpolation_orders) -def test_interpolate_different_units(fun: Callable[[Quantity[ArrayLike]], Quantity[ArrayLike]], order: InterpolationOptions, show_plots: bool): - original_points = NamedQuantity("x_base", np.linspace(-10,10, 107), units.meters) - test_points = NamedQuantity("x_test", np.linspace(-5000, 5000, 11), units.millimeters) - - mapping, _ = calculate_interpolation_matrix_1d(original_points, test_points, order=order) - - y_original = fun(original_points) - y_test = y_original @ mapping - y_expected = fun(test_points) - - test_units = y_expected.units - - y_values_test = y_test.in_units_of(test_units) - y_values_expected = y_expected.in_units_of(test_units) - - if show_plots: - print(y_values_test) - print(y_test.in_si()) - print(y_values_expected) - - plt.plot(original_points.in_si(), y_original.in_si()) - plt.plot(test_points.in_si(), y_test.in_si(), "x") - plt.plot(test_points.in_si(), y_expected.in_si(), "o") - plt.show() - - assert len(y_values_test) == len(y_values_expected) - - for t, e in zip(y_values_test, y_values_expected): - assert t == pytest.approx(e, rel=5e-2) - -@pytest.mark.parametrize("order", test_interpolation_orders) -def test_linear(order: InterpolationOptions): - """ Test linear interpolation between two points""" - x_and_y = NamedQuantity("x_base", np.linspace(-10, 10, 2), units.meters) - new_x = NamedQuantity("x_test", np.linspace(-5000, 5000, 101), units.millimeters) - - mapping, _ = calculate_interpolation_matrix_1d(x_and_y, new_x, order=order) - - linear_points = x_and_y @ mapping - - for t, e in zip(new_x.in_si(), linear_points.in_si()): - assert t == pytest.approx(e, rel=1e-3) +from collections.abc import Callable + +import numpy as np +import pytest +from matplotlib import pyplot as plt +from numpy.typing import ArrayLike + +from sasdata.quantities import units +from sasdata.quantities.plotting import quantity_plot +from sasdata.quantities.quantity import NamedQuantity, Quantity +from sasdata.transforms.rebinning import InterpolationOptions, calculate_interpolation_matrix_1d + +test_functions = [ + lambda x: x**2, + lambda x: 2*x, + lambda x: x**3 +] + +test_interpolation_orders = [ + InterpolationOptions.LINEAR, + InterpolationOptions.CUBIC +] + + +@pytest.mark.parametrize("fun", test_functions) +@pytest.mark.parametrize("order", test_interpolation_orders) +def test_interpolate_matrix_inside(fun: Callable[[Quantity[ArrayLike]], Quantity[ArrayLike]], order: InterpolationOptions, show_plots: bool): + original_points = NamedQuantity("x_base", np.linspace(-10,10, 31), units.meters) + test_points = NamedQuantity("x_test", np.linspace(-5, 5, 11), units.meters) + + + mapping, _ = calculate_interpolation_matrix_1d(original_points, test_points, order=order) + + y_original = fun(original_points) + y_test = y_original @ mapping + y_expected = fun(test_points) + + test_units = y_expected.units + + y_values_test = y_test.in_units_of(test_units) + y_values_expected = y_expected.in_units_of(test_units) + + if show_plots: + print(y_values_test) + print(y_values_expected) + + quantity_plot(original_points, y_original) + quantity_plot(test_points, y_test) + quantity_plot(test_points, y_expected) + plt.show() + + assert len(y_values_test) == len(y_values_expected) + + for t, e in zip(y_values_test, y_values_expected): + assert t == pytest.approx(e, abs=2) + + +@pytest.mark.parametrize("fun", test_functions) +@pytest.mark.parametrize("order", test_interpolation_orders) +def test_interpolate_different_units(fun: Callable[[Quantity[ArrayLike]], Quantity[ArrayLike]], order: InterpolationOptions, show_plots: bool): + original_points = NamedQuantity("x_base", np.linspace(-10,10, 107), units.meters) + test_points = NamedQuantity("x_test", np.linspace(-5000, 5000, 11), units.millimeters) + + mapping, _ = calculate_interpolation_matrix_1d(original_points, test_points, order=order) + + y_original = fun(original_points) + y_test = y_original @ mapping + y_expected = fun(test_points) + + test_units = y_expected.units + + y_values_test = y_test.in_units_of(test_units) + y_values_expected = y_expected.in_units_of(test_units) + + if show_plots: + print(y_values_test) + print(y_test.in_si()) + print(y_values_expected) + + plt.plot(original_points.in_si(), y_original.in_si()) + plt.plot(test_points.in_si(), y_test.in_si(), "x") + plt.plot(test_points.in_si(), y_expected.in_si(), "o") + plt.show() + + assert len(y_values_test) == len(y_values_expected) + + for t, e in zip(y_values_test, y_values_expected): + assert t == pytest.approx(e, rel=5e-2) + +@pytest.mark.parametrize("order", test_interpolation_orders) +def test_linear(order: InterpolationOptions): + """ Test linear interpolation between two points""" + x_and_y = NamedQuantity("x_base", np.linspace(-10, 10, 2), units.meters) + new_x = NamedQuantity("x_test", np.linspace(-5000, 5000, 101), units.millimeters) + + mapping, _ = calculate_interpolation_matrix_1d(x_and_y, new_x, order=order) + + linear_points = x_and_y @ mapping + + for t, e in zip(new_x.in_si(), linear_points.in_si()): + assert t == pytest.approx(e, rel=1e-3) diff --git a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/10_1000_1340_10.csv b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/10_1000_1340_10.csv index 65305e2ab..8e9c70665 100644 --- a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/10_1000_1340_10.csv +++ b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/10_1000_1340_10.csv @@ -1,105 +1,105 @@ -3.624299999999999744e-02 7.295645247999999583e+01 1.637502872666669873e+01 -4.068929999999999769e-02 3.496757764333329987e+01 1.132330254166670080e+01 -4.510000000000000120e-02 2.871506291000000033e+01 8.366418418333330109e+00 -4.957960000000000145e-02 3.062621534000000167e+01 6.807088010000000189e+00 -5.414959999999999912e-02 1.698840335499999910e+01 5.315930135000000334e+00 -5.867460000000000037e-02 1.810732352000000134e+01 4.582343003333329889e+00 -6.313670000000000393e-02 1.758858145166669829e+01 3.753068668333329860e+00 -6.771770000000000567e-02 1.874808681500000063e+01 3.129801861666670071e+00 -7.237100000000000477e-02 1.219239694000000007e+01 2.701832888333330018e+00 -7.692330000000000001e-02 1.502033604000000011e+01 2.415586504999999828e+00 -8.164470000000000061e-02 1.051882241166670084e+01 2.003147743333329789e+00 -8.639470000000000482e-02 1.266539752666670005e+01 1.813845073333330005e+00 -9.106759999999999855e-02 1.164225125833329955e+01 1.590423455000000041e+00 -9.573710000000000553e-02 9.248378555000000389e+00 1.453449206666669991e+00 -1.004952999999999957e-01 1.082198768499999986e+01 1.296534581666670016e+00 -1.052397000000000055e-01 9.754544071666670035e+00 1.192202876666669908e+00 -1.099886000000000058e-01 9.770793396666670461e+00 1.074958141666670031e+00 -1.148422000000000054e-01 9.667035006666669261e+00 9.803857316666669819e-01 -1.197769999999999946e-01 8.381104240000000871e+00 8.964596183333329860e-01 -1.247698000000000002e-01 7.884219706666669936e+00 8.320707283333329540e-01 -1.298370000000000080e-01 8.175124921666670375e+00 7.497416000000000080e-01 -1.349077999999999944e-01 7.421197476666669957e+00 7.207336583333330271e-01 -1.399244000000000043e-01 8.545903931666670061e+00 6.648524133333330033e-01 -1.450733999999999913e-01 7.172791390000000433e+00 6.314494133333330428e-01 -1.502658000000000049e-01 6.110795001666669890e+00 5.924928833333330536e-01 -1.556062000000000001e-01 7.011488443333329990e+00 5.430119199999999813e-01 -1.572456999999999883e-01 7.121472013333329798e+00 1.740741033333330079e-01 -1.609471000000000096e-01 7.438929439999999893e+00 5.263131250000000483e-01 -1.661874999999999880e-01 6.540084590000000198e+00 4.946959550000000205e-01 -1.706292000000000086e-01 6.367655253333330378e+00 1.455746566666669961e-01 -1.715615000000000057e-01 6.476111691666670112e+00 4.707941449999999972e-01 -1.771270000000000067e-01 5.720913878333329983e+00 4.355610400000000104e-01 -1.827315999999999940e-01 6.117868691666670244e+00 4.186226383333330192e-01 -1.842428999999999872e-01 5.857041180000000402e+00 1.254778649999999940e-01 -1.883173999999999959e-01 5.849837826666670182e+00 4.069392433333329784e-01 -1.939794999999999991e-01 5.447672994999999574e+00 3.927526633333329742e-01 -1.982414999999999872e-01 5.391186461666669594e+00 1.085076650000000031e-01 -1.997663000000000078e-01 5.394637556666670442e+00 3.662608233333329855e-01 -2.055810999999999888e-01 5.784545713333329786e+00 3.603836316666669815e-01 -2.114655000000000007e-01 4.574601945000000391e+00 3.312713700000000094e-01 -2.120113000000000136e-01 5.084515549999999884e+00 9.927742500000000248e-02 -2.161903000000000019e-01 4.516358434999999893e+00 4.168106166666670220e-01 -2.259823999999999999e-01 4.782964421666670241e+00 8.791053666666670541e-02 -2.397845000000000115e-01 4.501217386666669817e+00 8.259429166666669431e-02 -2.537096999999999825e-01 4.179436571666670375e+00 7.562756833333329765e-02 -2.676275000000000182e-01 3.979478888333329856e+00 6.987285499999999761e-02 -2.817857999999999752e-01 3.702226940000000077e+00 6.482911333333329917e-02 -2.956398000000000081e-01 3.605992423333329810e+00 6.203536333333330155e-02 -3.099044000000000243e-01 3.377018353333329781e+00 5.670042833333330257e-02 -3.240645999999999805e-01 3.095807218333329836e+00 5.498817999999999762e-02 -3.388027000000000122e-01 2.841171323333330001e+00 4.897826333333329951e-02 -3.539140000000000064e-01 2.795649415000000193e+00 4.845330666666670255e-02 -3.687090000000000090e-01 2.622854690000000044e+00 4.475559833333329907e-02 -3.839813000000000254e-01 2.527809641666669993e+00 4.273165666666670082e-02 -3.988975000000000160e-01 2.232305030000000023e+00 4.094381166666669764e-02 -4.106734000000000218e-01 2.129986383333330124e+00 4.154637366666669857e-02 -4.136514000000000024e-01 2.084593566666669950e+00 3.891198166666669928e-02 -4.290628000000000219e-01 1.988620215000000080e+00 3.594587333333330165e-02 -4.295516999999999808e-01 1.964928603499999982e+00 3.519640899999999795e-02 -4.446014999999999828e-01 1.750614441666670018e+00 3.497378000000000292e-02 -4.466716000000000020e-01 1.709819834666669980e+00 3.112847050000000157e-02 -4.603325999999999807e-01 1.676685876666669905e+00 3.265084166666670090e-02 -4.685437000000000074e-01 1.638395569999999912e+00 3.101072850000000103e-02 -4.764860000000000206e-01 1.575855291666669933e+00 3.097528500000000171e-02 -4.834083000000000130e-01 1.443926158166670026e+00 2.913516383333330032e-02 -4.923204999999999942e-01 1.443778989999999984e+00 3.072023333333330150e-02 -5.046621000000000024e-01 1.382474827333330047e+00 2.709115466666670025e-02 -5.082708000000000226e-01 1.368563626666670086e+00 2.832584499999999880e-02 -5.230728999999999518e-01 1.117650907000000027e+00 2.515010599999999846e-02 -5.249162000000000550e-01 1.271594368333329950e+00 2.652784333333330080e-02 -5.416775999999999813e-01 1.132208539999999930e+00 2.601087833333329963e-02 -5.444001000000000534e-01 1.080469498666670081e+00 2.559191900000000117e-02 -5.583067999999999920e-01 1.032465565000000085e+00 2.510816333333330125e-02 -5.612614999999999688e-01 1.012286258500000091e+00 2.336018449999999885e-02 -5.753956999999999544e-01 9.763539783333330391e-01 2.332539999999999961e-02 -5.834072999999999620e-01 8.965217239999999643e-01 2.303063099999999933e-02 -5.927398999999999862e-01 9.096560916666670549e-01 2.248173499999999922e-02 -6.005747000000000169e-01 8.250965611666669641e-01 2.186496933333329992e-02 -6.099058000000000535e-01 8.168162183333329551e-01 2.170944500000000082e-02 -6.218546000000000351e-01 7.414260915000000507e-01 2.121375600000000028e-02 -6.275003000000000108e-01 7.444278466666669480e-01 2.046154333333330064e-02 -6.412082999999999533e-01 6.366966366666669819e-01 1.883217216666669899e-02 -6.447154999999999969e-01 6.422991433333330447e-01 2.075286000000000144e-02 -6.655497999999999692e-01 5.866493959999999896e-01 1.815403650000000160e-02 -6.843702000000000396e-01 5.515869356666670553e-01 2.025276583333330063e-02 -7.058105999999999547e-01 4.475886111666669831e-01 1.701240433333330027e-02 -7.258693999999999980e-01 4.775394179999999933e-01 1.840697383333329828e-02 -7.490480000000000471e-01 4.047520649999999942e-01 1.505153366666669990e-02 -7.720086999999999922e-01 3.731668894999999875e-01 1.706827766666670076e-02 -7.920989999999999975e-01 3.681129878333330163e-01 1.507231049999999996e-02 -8.155097999999999514e-01 3.208610430000000124e-01 1.529166149999999953e-02 -8.364475000000000104e-01 2.962226738333330056e-01 1.456896033333330079e-02 -8.619377000000000288e-01 2.765821119999999911e-01 1.371801400000000060e-02 -8.846403999999999934e-01 2.799105873333330163e-01 1.446314666666670065e-02 -9.081462000000000145e-01 2.318482950000000098e-01 1.260493333333330065e-02 -9.334447000000000161e-01 2.175556724999999914e-01 1.357374916666670081e-02 -9.551832000000000100e-01 1.903255399999999875e-01 1.273357800000000060e-02 -9.812971999999999806e-01 1.841620115000000002e-01 1.195187833333329931e-02 -1.006807800000000030e+00 1.608915558333330054e-01 1.233432733333329930e-02 -1.030406600000000061e+00 1.533644885000000069e-01 1.172346633333330029e-02 -1.057784300000000011e+00 1.661925581666670038e-01 1.091501716666670035e-02 -1.084600999999999926e+00 1.630933589999999933e-01 1.128103283333329980e-02 -1.109902299999999897e+00 1.327154809999999963e-01 1.088576583333330031e-02 -1.137751600000000085e+00 1.179623709999999964e-01 1.042595833333329926e-02 +3.624299999999999744e-02 7.295645247999999583e+01 1.637502872666669873e+01 +4.068929999999999769e-02 3.496757764333329987e+01 1.132330254166670080e+01 +4.510000000000000120e-02 2.871506291000000033e+01 8.366418418333330109e+00 +4.957960000000000145e-02 3.062621534000000167e+01 6.807088010000000189e+00 +5.414959999999999912e-02 1.698840335499999910e+01 5.315930135000000334e+00 +5.867460000000000037e-02 1.810732352000000134e+01 4.582343003333329889e+00 +6.313670000000000393e-02 1.758858145166669829e+01 3.753068668333329860e+00 +6.771770000000000567e-02 1.874808681500000063e+01 3.129801861666670071e+00 +7.237100000000000477e-02 1.219239694000000007e+01 2.701832888333330018e+00 +7.692330000000000001e-02 1.502033604000000011e+01 2.415586504999999828e+00 +8.164470000000000061e-02 1.051882241166670084e+01 2.003147743333329789e+00 +8.639470000000000482e-02 1.266539752666670005e+01 1.813845073333330005e+00 +9.106759999999999855e-02 1.164225125833329955e+01 1.590423455000000041e+00 +9.573710000000000553e-02 9.248378555000000389e+00 1.453449206666669991e+00 +1.004952999999999957e-01 1.082198768499999986e+01 1.296534581666670016e+00 +1.052397000000000055e-01 9.754544071666670035e+00 1.192202876666669908e+00 +1.099886000000000058e-01 9.770793396666670461e+00 1.074958141666670031e+00 +1.148422000000000054e-01 9.667035006666669261e+00 9.803857316666669819e-01 +1.197769999999999946e-01 8.381104240000000871e+00 8.964596183333329860e-01 +1.247698000000000002e-01 7.884219706666669936e+00 8.320707283333329540e-01 +1.298370000000000080e-01 8.175124921666670375e+00 7.497416000000000080e-01 +1.349077999999999944e-01 7.421197476666669957e+00 7.207336583333330271e-01 +1.399244000000000043e-01 8.545903931666670061e+00 6.648524133333330033e-01 +1.450733999999999913e-01 7.172791390000000433e+00 6.314494133333330428e-01 +1.502658000000000049e-01 6.110795001666669890e+00 5.924928833333330536e-01 +1.556062000000000001e-01 7.011488443333329990e+00 5.430119199999999813e-01 +1.572456999999999883e-01 7.121472013333329798e+00 1.740741033333330079e-01 +1.609471000000000096e-01 7.438929439999999893e+00 5.263131250000000483e-01 +1.661874999999999880e-01 6.540084590000000198e+00 4.946959550000000205e-01 +1.706292000000000086e-01 6.367655253333330378e+00 1.455746566666669961e-01 +1.715615000000000057e-01 6.476111691666670112e+00 4.707941449999999972e-01 +1.771270000000000067e-01 5.720913878333329983e+00 4.355610400000000104e-01 +1.827315999999999940e-01 6.117868691666670244e+00 4.186226383333330192e-01 +1.842428999999999872e-01 5.857041180000000402e+00 1.254778649999999940e-01 +1.883173999999999959e-01 5.849837826666670182e+00 4.069392433333329784e-01 +1.939794999999999991e-01 5.447672994999999574e+00 3.927526633333329742e-01 +1.982414999999999872e-01 5.391186461666669594e+00 1.085076650000000031e-01 +1.997663000000000078e-01 5.394637556666670442e+00 3.662608233333329855e-01 +2.055810999999999888e-01 5.784545713333329786e+00 3.603836316666669815e-01 +2.114655000000000007e-01 4.574601945000000391e+00 3.312713700000000094e-01 +2.120113000000000136e-01 5.084515549999999884e+00 9.927742500000000248e-02 +2.161903000000000019e-01 4.516358434999999893e+00 4.168106166666670220e-01 +2.259823999999999999e-01 4.782964421666670241e+00 8.791053666666670541e-02 +2.397845000000000115e-01 4.501217386666669817e+00 8.259429166666669431e-02 +2.537096999999999825e-01 4.179436571666670375e+00 7.562756833333329765e-02 +2.676275000000000182e-01 3.979478888333329856e+00 6.987285499999999761e-02 +2.817857999999999752e-01 3.702226940000000077e+00 6.482911333333329917e-02 +2.956398000000000081e-01 3.605992423333329810e+00 6.203536333333330155e-02 +3.099044000000000243e-01 3.377018353333329781e+00 5.670042833333330257e-02 +3.240645999999999805e-01 3.095807218333329836e+00 5.498817999999999762e-02 +3.388027000000000122e-01 2.841171323333330001e+00 4.897826333333329951e-02 +3.539140000000000064e-01 2.795649415000000193e+00 4.845330666666670255e-02 +3.687090000000000090e-01 2.622854690000000044e+00 4.475559833333329907e-02 +3.839813000000000254e-01 2.527809641666669993e+00 4.273165666666670082e-02 +3.988975000000000160e-01 2.232305030000000023e+00 4.094381166666669764e-02 +4.106734000000000218e-01 2.129986383333330124e+00 4.154637366666669857e-02 +4.136514000000000024e-01 2.084593566666669950e+00 3.891198166666669928e-02 +4.290628000000000219e-01 1.988620215000000080e+00 3.594587333333330165e-02 +4.295516999999999808e-01 1.964928603499999982e+00 3.519640899999999795e-02 +4.446014999999999828e-01 1.750614441666670018e+00 3.497378000000000292e-02 +4.466716000000000020e-01 1.709819834666669980e+00 3.112847050000000157e-02 +4.603325999999999807e-01 1.676685876666669905e+00 3.265084166666670090e-02 +4.685437000000000074e-01 1.638395569999999912e+00 3.101072850000000103e-02 +4.764860000000000206e-01 1.575855291666669933e+00 3.097528500000000171e-02 +4.834083000000000130e-01 1.443926158166670026e+00 2.913516383333330032e-02 +4.923204999999999942e-01 1.443778989999999984e+00 3.072023333333330150e-02 +5.046621000000000024e-01 1.382474827333330047e+00 2.709115466666670025e-02 +5.082708000000000226e-01 1.368563626666670086e+00 2.832584499999999880e-02 +5.230728999999999518e-01 1.117650907000000027e+00 2.515010599999999846e-02 +5.249162000000000550e-01 1.271594368333329950e+00 2.652784333333330080e-02 +5.416775999999999813e-01 1.132208539999999930e+00 2.601087833333329963e-02 +5.444001000000000534e-01 1.080469498666670081e+00 2.559191900000000117e-02 +5.583067999999999920e-01 1.032465565000000085e+00 2.510816333333330125e-02 +5.612614999999999688e-01 1.012286258500000091e+00 2.336018449999999885e-02 +5.753956999999999544e-01 9.763539783333330391e-01 2.332539999999999961e-02 +5.834072999999999620e-01 8.965217239999999643e-01 2.303063099999999933e-02 +5.927398999999999862e-01 9.096560916666670549e-01 2.248173499999999922e-02 +6.005747000000000169e-01 8.250965611666669641e-01 2.186496933333329992e-02 +6.099058000000000535e-01 8.168162183333329551e-01 2.170944500000000082e-02 +6.218546000000000351e-01 7.414260915000000507e-01 2.121375600000000028e-02 +6.275003000000000108e-01 7.444278466666669480e-01 2.046154333333330064e-02 +6.412082999999999533e-01 6.366966366666669819e-01 1.883217216666669899e-02 +6.447154999999999969e-01 6.422991433333330447e-01 2.075286000000000144e-02 +6.655497999999999692e-01 5.866493959999999896e-01 1.815403650000000160e-02 +6.843702000000000396e-01 5.515869356666670553e-01 2.025276583333330063e-02 +7.058105999999999547e-01 4.475886111666669831e-01 1.701240433333330027e-02 +7.258693999999999980e-01 4.775394179999999933e-01 1.840697383333329828e-02 +7.490480000000000471e-01 4.047520649999999942e-01 1.505153366666669990e-02 +7.720086999999999922e-01 3.731668894999999875e-01 1.706827766666670076e-02 +7.920989999999999975e-01 3.681129878333330163e-01 1.507231049999999996e-02 +8.155097999999999514e-01 3.208610430000000124e-01 1.529166149999999953e-02 +8.364475000000000104e-01 2.962226738333330056e-01 1.456896033333330079e-02 +8.619377000000000288e-01 2.765821119999999911e-01 1.371801400000000060e-02 +8.846403999999999934e-01 2.799105873333330163e-01 1.446314666666670065e-02 +9.081462000000000145e-01 2.318482950000000098e-01 1.260493333333330065e-02 +9.334447000000000161e-01 2.175556724999999914e-01 1.357374916666670081e-02 +9.551832000000000100e-01 1.903255399999999875e-01 1.273357800000000060e-02 +9.812971999999999806e-01 1.841620115000000002e-01 1.195187833333329931e-02 +1.006807800000000030e+00 1.608915558333330054e-01 1.233432733333329930e-02 +1.030406600000000061e+00 1.533644885000000069e-01 1.172346633333330029e-02 +1.057784300000000011e+00 1.661925581666670038e-01 1.091501716666670035e-02 +1.084600999999999926e+00 1.630933589999999933e-01 1.128103283333329980e-02 +1.109902299999999897e+00 1.327154809999999963e-01 1.088576583333330031e-02 +1.137751600000000085e+00 1.179623709999999964e-01 1.042595833333329926e-02 1.166036300000000026e+00 1.293750036666669878e-01 1.024355400000000020e-02 \ No newline at end of file diff --git a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/11_2000_1340_10.csv b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/11_2000_1340_10.csv index 96a87d0fe..bfbf36dcd 100644 --- a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/11_2000_1340_10.csv +++ b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/11_2000_1340_10.csv @@ -1,105 +1,105 @@ -3.625559999999999894e-02 4.452644707000000324e+01 1.628119149999999848e+01 -4.070349999999999663e-02 2.677295466333330154e+01 1.128515222166669929e+01 -4.511570000000000163e-02 2.350029203500000108e+01 8.338724138333329705e+00 -4.959680000000000338e-02 1.744413458166669884e+01 6.751264438333329565e+00 -5.416850000000000137e-02 9.909433441666669395e+00 5.280963783333329609e+00 -5.869510000000000005e-02 1.174714312999999954e+01 4.547423594999999708e+00 -6.315869999999999818e-02 1.312634901166670076e+01 3.725749208333330120e+00 -6.774130000000000429e-02 1.654730030333330149e+01 3.113655078333330106e+00 -7.239619999999999389e-02 7.792796271666669661e+00 2.672180411666670086e+00 -7.695009999999999351e-02 1.265325572666669984e+01 2.397233363333330036e+00 -8.167309999999999848e-02 6.069752713333330441e+00 1.971069876666670107e+00 -8.642469999999999319e-02 1.300927747833329917e+01 1.813635340000000040e+00 -9.109929999999999417e-02 9.757094948333330464e+00 1.573592551666670003e+00 -9.577040000000000552e-02 5.713518095000000407e+00 1.422093728333329921e+00 -1.005303000000000030e-01 7.313534973333330136e+00 1.265234731666670109e+00 -1.052763000000000032e-01 8.841184973333330532e+00 1.182077201666670074e+00 -1.100268999999999969e-01 7.404252198333329815e+00 1.051346621666670034e+00 -1.148821000000000009e-01 8.380590695000000423e+00 9.664303683333329564e-01 -1.198187000000000002e-01 7.413483668333330279e+00 8.855263516666670442e-01 -1.248133000000000020e-01 6.593134025000000342e+00 8.175650066666669824e-01 -1.298822000000000032e-01 6.731246111666670195e+00 7.333046399999999521e-01 -1.349548000000000136e-01 5.519098301666669926e+00 6.986229283333329487e-01 -1.399730999999999892e-01 7.581442331666670142e+00 6.528076566666669578e-01 -1.451239000000000001e-01 4.842304316666670161e+00 6.043489516666670225e-01 -1.503181000000000100e-01 5.135523888333329623e+00 5.802922499999999539e-01 -1.556604000000000043e-01 6.037988904999999740e+00 5.310080216666670516e-01 -1.573070000000000024e-01 6.020141886666669606e+00 1.700767950000000028e-01 -1.610031000000000101e-01 6.268605329999999753e+00 5.111983383333329467e-01 -1.662453999999999876e-01 5.536486726666669966e+00 4.815289200000000269e-01 -1.706957000000000058e-01 5.285752210000000062e+00 1.415798849999999887e-01 -1.716212000000000015e-01 5.016643598333329734e+00 4.522174083333330152e-01 -1.771887000000000045e-01 5.127789406666670047e+00 4.276572833333330270e-01 -1.827951999999999910e-01 5.311901800000000229e+00 4.077617766666670196e-01 -1.843146999999999980e-01 5.273006283333329769e+00 1.230909116666669967e-01 -1.883829999999999949e-01 4.028933333333330147e+00 3.832458766666669847e-01 -1.940469999999999973e-01 4.805727509999999647e+00 3.842635300000000198e-01 -1.983187999999999895e-01 4.783697818333330076e+00 1.059592133333329966e-01 -1.998358000000000079e-01 4.823453656666670142e+00 3.585670233333330126e-01 -2.056525999999999910e-01 4.659267076666670171e+00 3.454626916666669878e-01 -2.115392000000000106e-01 3.961550343333330115e+00 3.229926716666670083e-01 -2.120939000000000019e-01 4.350835990000000209e+00 9.606802500000000133e-02 -2.162656000000000023e-01 4.681036608333330129e+00 4.188060433333329891e-01 -2.260705000000000076e-01 4.224838659999999635e+00 8.541253666666670519e-02 -2.398779000000000050e-01 3.935926101666670007e+00 7.996145500000000073e-02 -2.538084999999999924e-01 3.694058728333330155e+00 7.335489833333329324e-02 -2.677318000000000198e-01 3.684019681666669932e+00 6.840629833333329579e-02 -2.818956000000000239e-01 3.452043701666669850e+00 6.355296333333329550e-02 -2.957549999999999901e-01 3.354666878333329993e+00 6.073878666666669701e-02 -3.100250999999999979e-01 3.092418856666669935e+00 5.527531000000000111e-02 -3.241909000000000041e-01 2.870290291666670157e+00 5.380070499999999728e-02 -3.389346999999999777e-01 2.729991994999999783e+00 4.836916333333329820e-02 -3.540519999999999778e-01 2.658729508333330216e+00 4.771163500000000224e-02 -3.688526999999999778e-01 2.488934241666670211e+00 4.403299000000000102e-02 -3.841308999999999974e-01 2.412009111666669980e+00 4.209804999999999797e-02 -3.990528999999999882e-01 2.203036439999999985e+00 4.070905166666669711e-02 -4.105667000000000066e-01 1.996977714666670067e+00 4.083280150000000164e-02 -4.138126999999999778e-01 2.043262161666670185e+00 3.862582833333329940e-02 -4.292300000000000004e-01 1.982205959999999934e+00 3.583282166666670182e-02 -4.294401999999999942e-01 1.834877223666669943e+00 3.458454216666669717e-02 -4.447747000000000228e-01 1.712660204999999936e+00 3.471672166666670001e-02 -4.465555999999999970e-01 1.615437673500000004e+00 3.068944266666669834e-02 -4.605119999999999769e-01 1.681440621666669966e+00 3.260043333333329657e-02 -4.684220000000000050e-01 1.529958281999999947e+00 3.049975383333329917e-02 -4.766716999999999760e-01 1.561241171666670091e+00 3.083583000000000157e-02 -4.832827000000000095e-01 1.369049060333330070e+00 2.875037449999999842e-02 -4.925123000000000140e-01 1.406416503333330015e+00 3.046807833333330107e-02 -5.045309999999999517e-01 1.316827885166669931e+00 2.677764066666669940e-02 -5.084689000000000014e-01 1.339987331666669945e+00 2.812536666666669988e-02 -5.229369999999999852e-01 1.082862526333330022e+00 2.496820599999999973e-02 -5.251208000000000542e-01 1.259172833333330077e+00 2.640966666666669932e-02 -5.418887000000000009e-01 1.134540908333329989e+00 2.596733000000000027e-02 -5.442586999999999842e-01 1.026980480500000015e+00 2.532101549999999854e-02 -5.585244000000000320e-01 1.057657990000000048e+00 2.518052499999999874e-02 -5.611156999999999950e-01 9.343203683333329845e-01 2.299225916666669881e-02 -5.756198999999999621e-01 9.598931866666670087e-01 2.319752666666670057e-02 -5.832557000000000436e-01 8.443178690000000541e-01 2.277228483333329848e-02 -5.929708999999999675e-01 9.115965033333329748e-01 2.244499833333329919e-02 -6.004186999999999719e-01 7.992612106666669991e-01 2.172028233333329894e-02 -6.101434999999999498e-01 8.528685350000000387e-01 2.184797833333329900e-02 -6.216930999999999985e-01 7.049236858333329803e-01 2.102741616666670144e-02 -6.277447999999999917e-01 7.853513183333330483e-01 2.062051499999999898e-02 -6.410417000000000476e-01 6.132204243333330140e-01 1.871036433333329863e-02 -6.449667999999999513e-01 7.011444599999999694e-01 2.101788333333329956e-02 -6.653769000000000489e-01 5.661603698333329548e-01 1.804829366666670099e-02 -6.841924999999999812e-01 5.085138883333329973e-01 2.002898349999999994e-02 -7.056272000000000100e-01 4.352650703333330040e-01 1.694186849999999855e-02 -7.256808000000000147e-01 4.355121908333329794e-01 1.820155999999999857e-02 -7.488534000000000024e-01 3.927147446666670039e-01 1.498729066666669961e-02 -7.718082000000000553e-01 3.535320510000000138e-01 1.696024266666670138e-02 -7.918933000000000222e-01 3.527103021666669891e-01 1.499266833333330086e-02 -8.152979999999999672e-01 3.240461856666669860e-01 1.528614783333329986e-02 -8.362302999999999820e-01 2.791947966666670222e-01 1.448550166666670060e-02 -8.617137999999999742e-01 2.463675190000000070e-01 1.359101549999999943e-02 -8.844106000000000467e-01 2.696912470000000228e-01 1.440389033333329925e-02 -9.079102999999999479e-01 2.246905299999999994e-01 1.256477649999999946e-02 -9.332021999999999817e-01 2.085629360000000043e-01 1.352310049999999944e-02 -9.549351000000000367e-01 1.738771078333329889e-01 1.265774100000000013e-02 -9.810423000000000338e-01 1.708308721666670082e-01 1.189189666666670003e-02 -1.006546299999999894e+00 1.505248680000000061e-01 1.228292216666669948e-02 -1.030138999999999916e+00 1.537520601666670095e-01 1.171224066666669977e-02 -1.057509599999999939e+00 1.534308791666670058e-01 1.086003916666669969e-02 -1.084319299999999986e+00 1.338797798333329903e-01 1.116524300000000004e-02 -1.109614000000000100e+00 1.189064603333330056e-01 1.082743033333329920e-02 -1.137456000000000023e+00 1.107916548333330031e-01 1.039160416666670000e-02 +3.625559999999999894e-02 4.452644707000000324e+01 1.628119149999999848e+01 +4.070349999999999663e-02 2.677295466333330154e+01 1.128515222166669929e+01 +4.511570000000000163e-02 2.350029203500000108e+01 8.338724138333329705e+00 +4.959680000000000338e-02 1.744413458166669884e+01 6.751264438333329565e+00 +5.416850000000000137e-02 9.909433441666669395e+00 5.280963783333329609e+00 +5.869510000000000005e-02 1.174714312999999954e+01 4.547423594999999708e+00 +6.315869999999999818e-02 1.312634901166670076e+01 3.725749208333330120e+00 +6.774130000000000429e-02 1.654730030333330149e+01 3.113655078333330106e+00 +7.239619999999999389e-02 7.792796271666669661e+00 2.672180411666670086e+00 +7.695009999999999351e-02 1.265325572666669984e+01 2.397233363333330036e+00 +8.167309999999999848e-02 6.069752713333330441e+00 1.971069876666670107e+00 +8.642469999999999319e-02 1.300927747833329917e+01 1.813635340000000040e+00 +9.109929999999999417e-02 9.757094948333330464e+00 1.573592551666670003e+00 +9.577040000000000552e-02 5.713518095000000407e+00 1.422093728333329921e+00 +1.005303000000000030e-01 7.313534973333330136e+00 1.265234731666670109e+00 +1.052763000000000032e-01 8.841184973333330532e+00 1.182077201666670074e+00 +1.100268999999999969e-01 7.404252198333329815e+00 1.051346621666670034e+00 +1.148821000000000009e-01 8.380590695000000423e+00 9.664303683333329564e-01 +1.198187000000000002e-01 7.413483668333330279e+00 8.855263516666670442e-01 +1.248133000000000020e-01 6.593134025000000342e+00 8.175650066666669824e-01 +1.298822000000000032e-01 6.731246111666670195e+00 7.333046399999999521e-01 +1.349548000000000136e-01 5.519098301666669926e+00 6.986229283333329487e-01 +1.399730999999999892e-01 7.581442331666670142e+00 6.528076566666669578e-01 +1.451239000000000001e-01 4.842304316666670161e+00 6.043489516666670225e-01 +1.503181000000000100e-01 5.135523888333329623e+00 5.802922499999999539e-01 +1.556604000000000043e-01 6.037988904999999740e+00 5.310080216666670516e-01 +1.573070000000000024e-01 6.020141886666669606e+00 1.700767950000000028e-01 +1.610031000000000101e-01 6.268605329999999753e+00 5.111983383333329467e-01 +1.662453999999999876e-01 5.536486726666669966e+00 4.815289200000000269e-01 +1.706957000000000058e-01 5.285752210000000062e+00 1.415798849999999887e-01 +1.716212000000000015e-01 5.016643598333329734e+00 4.522174083333330152e-01 +1.771887000000000045e-01 5.127789406666670047e+00 4.276572833333330270e-01 +1.827951999999999910e-01 5.311901800000000229e+00 4.077617766666670196e-01 +1.843146999999999980e-01 5.273006283333329769e+00 1.230909116666669967e-01 +1.883829999999999949e-01 4.028933333333330147e+00 3.832458766666669847e-01 +1.940469999999999973e-01 4.805727509999999647e+00 3.842635300000000198e-01 +1.983187999999999895e-01 4.783697818333330076e+00 1.059592133333329966e-01 +1.998358000000000079e-01 4.823453656666670142e+00 3.585670233333330126e-01 +2.056525999999999910e-01 4.659267076666670171e+00 3.454626916666669878e-01 +2.115392000000000106e-01 3.961550343333330115e+00 3.229926716666670083e-01 +2.120939000000000019e-01 4.350835990000000209e+00 9.606802500000000133e-02 +2.162656000000000023e-01 4.681036608333330129e+00 4.188060433333329891e-01 +2.260705000000000076e-01 4.224838659999999635e+00 8.541253666666670519e-02 +2.398779000000000050e-01 3.935926101666670007e+00 7.996145500000000073e-02 +2.538084999999999924e-01 3.694058728333330155e+00 7.335489833333329324e-02 +2.677318000000000198e-01 3.684019681666669932e+00 6.840629833333329579e-02 +2.818956000000000239e-01 3.452043701666669850e+00 6.355296333333329550e-02 +2.957549999999999901e-01 3.354666878333329993e+00 6.073878666666669701e-02 +3.100250999999999979e-01 3.092418856666669935e+00 5.527531000000000111e-02 +3.241909000000000041e-01 2.870290291666670157e+00 5.380070499999999728e-02 +3.389346999999999777e-01 2.729991994999999783e+00 4.836916333333329820e-02 +3.540519999999999778e-01 2.658729508333330216e+00 4.771163500000000224e-02 +3.688526999999999778e-01 2.488934241666670211e+00 4.403299000000000102e-02 +3.841308999999999974e-01 2.412009111666669980e+00 4.209804999999999797e-02 +3.990528999999999882e-01 2.203036439999999985e+00 4.070905166666669711e-02 +4.105667000000000066e-01 1.996977714666670067e+00 4.083280150000000164e-02 +4.138126999999999778e-01 2.043262161666670185e+00 3.862582833333329940e-02 +4.292300000000000004e-01 1.982205959999999934e+00 3.583282166666670182e-02 +4.294401999999999942e-01 1.834877223666669943e+00 3.458454216666669717e-02 +4.447747000000000228e-01 1.712660204999999936e+00 3.471672166666670001e-02 +4.465555999999999970e-01 1.615437673500000004e+00 3.068944266666669834e-02 +4.605119999999999769e-01 1.681440621666669966e+00 3.260043333333329657e-02 +4.684220000000000050e-01 1.529958281999999947e+00 3.049975383333329917e-02 +4.766716999999999760e-01 1.561241171666670091e+00 3.083583000000000157e-02 +4.832827000000000095e-01 1.369049060333330070e+00 2.875037449999999842e-02 +4.925123000000000140e-01 1.406416503333330015e+00 3.046807833333330107e-02 +5.045309999999999517e-01 1.316827885166669931e+00 2.677764066666669940e-02 +5.084689000000000014e-01 1.339987331666669945e+00 2.812536666666669988e-02 +5.229369999999999852e-01 1.082862526333330022e+00 2.496820599999999973e-02 +5.251208000000000542e-01 1.259172833333330077e+00 2.640966666666669932e-02 +5.418887000000000009e-01 1.134540908333329989e+00 2.596733000000000027e-02 +5.442586999999999842e-01 1.026980480500000015e+00 2.532101549999999854e-02 +5.585244000000000320e-01 1.057657990000000048e+00 2.518052499999999874e-02 +5.611156999999999950e-01 9.343203683333329845e-01 2.299225916666669881e-02 +5.756198999999999621e-01 9.598931866666670087e-01 2.319752666666670057e-02 +5.832557000000000436e-01 8.443178690000000541e-01 2.277228483333329848e-02 +5.929708999999999675e-01 9.115965033333329748e-01 2.244499833333329919e-02 +6.004186999999999719e-01 7.992612106666669991e-01 2.172028233333329894e-02 +6.101434999999999498e-01 8.528685350000000387e-01 2.184797833333329900e-02 +6.216930999999999985e-01 7.049236858333329803e-01 2.102741616666670144e-02 +6.277447999999999917e-01 7.853513183333330483e-01 2.062051499999999898e-02 +6.410417000000000476e-01 6.132204243333330140e-01 1.871036433333329863e-02 +6.449667999999999513e-01 7.011444599999999694e-01 2.101788333333329956e-02 +6.653769000000000489e-01 5.661603698333329548e-01 1.804829366666670099e-02 +6.841924999999999812e-01 5.085138883333329973e-01 2.002898349999999994e-02 +7.056272000000000100e-01 4.352650703333330040e-01 1.694186849999999855e-02 +7.256808000000000147e-01 4.355121908333329794e-01 1.820155999999999857e-02 +7.488534000000000024e-01 3.927147446666670039e-01 1.498729066666669961e-02 +7.718082000000000553e-01 3.535320510000000138e-01 1.696024266666670138e-02 +7.918933000000000222e-01 3.527103021666669891e-01 1.499266833333330086e-02 +8.152979999999999672e-01 3.240461856666669860e-01 1.528614783333329986e-02 +8.362302999999999820e-01 2.791947966666670222e-01 1.448550166666670060e-02 +8.617137999999999742e-01 2.463675190000000070e-01 1.359101549999999943e-02 +8.844106000000000467e-01 2.696912470000000228e-01 1.440389033333329925e-02 +9.079102999999999479e-01 2.246905299999999994e-01 1.256477649999999946e-02 +9.332021999999999817e-01 2.085629360000000043e-01 1.352310049999999944e-02 +9.549351000000000367e-01 1.738771078333329889e-01 1.265774100000000013e-02 +9.810423000000000338e-01 1.708308721666670082e-01 1.189189666666670003e-02 +1.006546299999999894e+00 1.505248680000000061e-01 1.228292216666669948e-02 +1.030138999999999916e+00 1.537520601666670095e-01 1.171224066666669977e-02 +1.057509599999999939e+00 1.534308791666670058e-01 1.086003916666669969e-02 +1.084319299999999986e+00 1.338797798333329903e-01 1.116524300000000004e-02 +1.109614000000000100e+00 1.189064603333330056e-01 1.082743033333329920e-02 +1.137456000000000023e+00 1.107916548333330031e-01 1.039160416666670000e-02 1.165733499999999978e+00 1.125385351666669947e-01 1.017680349999999963e-02 \ No newline at end of file diff --git a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/12_3000_1340_10.csv b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/12_3000_1340_10.csv index cb7796b60..9ae1c5f3e 100644 --- a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/12_3000_1340_10.csv +++ b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/12_3000_1340_10.csv @@ -1,105 +1,105 @@ -3.624610000000000332e-02 5.667029333499999666e+01 1.635708034166669833e+01 -4.069289999999999713e-02 2.663486052833329865e+01 1.131616966500000032e+01 -4.510390000000000232e-02 2.091145430999999988e+01 8.353784624999999409e+00 -4.958379999999999732e-02 1.655762528666669908e+01 6.766916158333329712e+00 -5.415430000000000244e-02 7.405398096666670149e+00 5.285856098333329811e+00 -5.867970000000000130e-02 1.609157327499999823e+01 4.579871853333330023e+00 -6.314219999999999555e-02 2.074624494500000083e+01 3.774208823333330187e+00 -6.772359999999999491e-02 1.622769223499999924e+01 3.121007619999999871e+00 -7.237720000000000264e-02 8.100976058333330343e+00 2.681633823333330113e+00 -7.692999999999999838e-02 7.297140411666670268e+00 2.370097993333330155e+00 -8.165179999999999660e-02 8.662000215000000836e+00 1.993900453333329992e+00 -8.640209999999999557e-02 1.195176863500000053e+01 1.811378463333330080e+00 -9.107550000000000368e-02 1.017929826333329935e+01 1.581605778333329937e+00 -9.574539999999999440e-02 8.299761948333330253e+00 1.447854706666670044e+00 -1.005039999999999961e-01 7.184010728333330320e+00 1.267957188333330043e+00 -1.052488000000000035e-01 7.705754226666670093e+00 1.175315996666669971e+00 -1.099981000000000014e-01 6.940137736666669888e+00 1.050239939999999983e+00 -1.148520999999999986e-01 7.227232895000000212e+00 9.582211533333330200e-01 -1.197872999999999993e-01 6.058664864999999899e+00 8.747766333333329980e-01 -1.247806000000000054e-01 5.235616768333329674e+00 8.060124016666669888e-01 -1.298481999999999970e-01 6.895559143333329644e+00 7.374701233333329498e-01 -1.349194999999999978e-01 5.596115646666669718e+00 7.017485283333330104e-01 -1.399364999999999915e-01 7.271002904999999572e+00 6.515097483333329720e-01 -1.450858999999999899e-01 5.001139740000000167e+00 6.081432883333329764e-01 -1.502787999999999902e-01 5.397041578333330314e+00 5.852662783333330010e-01 -1.556196999999999997e-01 5.201047356666670396e+00 5.230793849999999523e-01 -1.572660999999999920e-01 5.527525920000000426e+00 1.689539216666670063e-01 -1.609609999999999930e-01 6.050507654999999652e+00 5.103277550000000495e-01 -1.662019000000000135e-01 5.215723743333329665e+00 4.792083599999999999e-01 -1.706513000000000058e-01 5.031433279999999897e+00 1.411615750000000113e-01 -1.715762999999999872e-01 4.986483428333330359e+00 4.534299233333329848e-01 -1.771423000000000025e-01 5.106750501666669884e+00 4.289189133333329851e-01 -1.827474000000000043e-01 5.398633823333329751e+00 4.103611200000000236e-01 -1.842668000000000084e-01 4.914610723333329823e+00 1.221897900000000065e-01 -1.883336999999999928e-01 4.776135458333330419e+00 3.942386333333329773e-01 -1.939963000000000104e-01 4.310256373333330338e+00 3.794851616666670147e-01 -1.982673000000000074e-01 4.375084450000000125e+00 1.047416733333329936e-01 -1.997836000000000056e-01 4.425991520000000179e+00 3.548793383333330165e-01 -2.055989000000000011e-01 4.542295369999999721e+00 3.452195166666670034e-01 -2.114837999999999996e-01 4.392925553333330235e+00 3.296180283333329797e-01 -2.120387999999999995e-01 4.102498828333329683e+00 9.538819833333339604e-02 -2.162090000000000123e-01 4.067448908333330060e+00 4.099168333333330083e-01 -2.260118000000000127e-01 3.879140883333330070e+00 8.427184499999999800e-02 -2.398155999999999899e-01 3.717842756666669857e+00 7.930888666666670306e-02 -2.537425999999999848e-01 3.531988756666669893e+00 7.293178499999999898e-02 -2.676623000000000197e-01 3.501111030000000124e+00 6.786378666666670334e-02 -2.818223999999999729e-01 3.329498083333330083e+00 6.325724833333329356e-02 -2.956782000000000021e-01 3.079447669999999970e+00 5.969948499999999658e-02 -3.099446000000000145e-01 2.946954811666670171e+00 5.483356999999999815e-02 -3.241067000000000253e-01 2.705831398333330196e+00 5.323661166666669720e-02 -3.388467000000000007e-01 2.601996516666670090e+00 4.799289000000000333e-02 -3.539599999999999969e-01 2.517872383333330077e+00 4.725612833333329987e-02 -3.687568999999999986e-01 2.374362781666670141e+00 4.368410333333330037e-02 -3.840311000000000141e-01 2.195996148333330122e+00 4.125977166666670165e-02 -3.989493000000000067e-01 2.109030429999999789e+00 4.042385333333330111e-02 -4.107986000000000137e-01 1.888483604166669938e+00 4.043749766666669687e-02 -4.137051999999999952e-01 1.969810571666670063e+00 3.843483833333329741e-02 -4.291185000000000138e-01 1.859797011666669997e+00 3.539587999999999762e-02 -4.296826999999999730e-01 1.762954635166670059e+00 3.439219566666670141e-02 -4.446591999999999767e-01 1.624618943333330012e+00 3.443567000000000156e-02 -4.468077999999999772e-01 1.588049316333330019e+00 3.067751716666669917e-02 -4.603923999999999794e-01 1.585295316666669896e+00 3.227559333333329672e-02 -4.686866000000000088e-01 1.509168766666669992e+00 3.051112400000000058e-02 -4.765479000000000243e-01 1.429500135000000061e+00 3.031986666666669841e-02 -4.835556999999999772e-01 1.309360340500000053e+00 2.857159116666670162e-02 -4.923843999999999999e-01 1.363123808333329912e+00 3.037624166666669928e-02 -5.048160000000000425e-01 1.296483956833329954e+00 2.677855866666669846e-02 -5.083368000000000331e-01 1.254868451666669937e+00 2.782200166666669999e-02 -5.232324000000000419e-01 1.028253859833329953e+00 2.481625150000000071e-02 -5.249844000000000177e-01 1.223231273333329927e+00 2.634227000000000096e-02 -5.417480000000000073e-01 1.058531658333329961e+00 2.569255333333329838e-02 -5.445661000000000529e-01 1.022632484000000064e+00 2.537817800000000124e-02 -5.583793000000000228e-01 1.009770163333330029e+00 2.504100833333329848e-02 -5.614325999999999484e-01 9.522996788333329965e-01 2.313905700000000107e-02 -5.754704000000000486e-01 9.158985283333339611e-01 2.307270666666669939e-02 -5.835850999999999678e-01 8.544030651666669751e-01 2.288279616666670166e-02 -5.928168000000000326e-01 8.553651300000000290e-01 2.224781666666670113e-02 -6.007578000000000085e-01 7.747371155000000176e-01 2.167619850000000042e-02 -6.099849999999999994e-01 7.987110383333330121e-01 2.165553833333330042e-02 -6.220442000000000471e-01 6.615610463333330138e-01 2.089781950000000124e-02 -6.275817000000000201e-01 7.150054516666669580e-01 2.035196333333329916e-02 -6.414037999999999684e-01 6.088626698333330367e-01 1.874337833333329997e-02 -6.447992000000000168e-01 6.630811316666670452e-01 2.089752166666669977e-02 -6.657526999999999751e-01 5.716572943333330103e-01 1.811807299999999843e-02 -6.845788999999999902e-01 5.092866856666670161e-01 2.008440916666669879e-02 -7.060256999999999783e-01 4.113589818333330261e-01 1.688841199999999848e-02 -7.260906999999999778e-01 4.258370573333329911e-01 1.820484666666670123e-02 -7.492763000000000062e-01 3.814062795000000006e-01 1.498164383333329928e-02 -7.722440999999999889e-01 3.582434820000000020e-01 1.702263550000000097e-02 -7.923405000000000031e-01 3.290160251666670033e-01 1.493438950000000078e-02 -8.157583999999999946e-01 3.190799841666669967e-01 1.530228649999999975e-02 -8.367025000000000157e-01 2.762952625000000273e-01 1.450753649999999943e-02 -8.622005000000000363e-01 2.544186793333330088e-01 1.365137966666669922e-02 -8.849101000000000328e-01 2.424038613333329983e-01 1.432358516666669933e-02 -9.084231000000000389e-01 2.172930054999999971e-01 1.256612799999999933e-02 -9.337292000000000369e-01 2.202721591666670087e-01 1.359930866666670020e-02 -9.554743999999999460e-01 1.777866800000000025e-01 1.269970833333330072e-02 -9.815962999999999772e-01 1.676419470000000134e-01 1.190602366666669923e-02 -1.007114700000000029e+00 1.595580418333329975e-01 1.234223233333330005e-02 -1.030720700000000045e+00 1.541775503333329966e-01 1.173861049999999975e-02 -1.058106800000000014e+00 1.554276226666669869e-01 1.088984299999999975e-02 -1.084931700000000054e+00 1.440364893333329899e-01 1.122487333333329999e-02 -1.110240600000000022e+00 1.198653424999999995e-01 1.085281416666670010e-02 -1.138098400000000066e+00 1.211473946666670048e-01 1.044690799999999954e-02 +3.624610000000000332e-02 5.667029333499999666e+01 1.635708034166669833e+01 +4.069289999999999713e-02 2.663486052833329865e+01 1.131616966500000032e+01 +4.510390000000000232e-02 2.091145430999999988e+01 8.353784624999999409e+00 +4.958379999999999732e-02 1.655762528666669908e+01 6.766916158333329712e+00 +5.415430000000000244e-02 7.405398096666670149e+00 5.285856098333329811e+00 +5.867970000000000130e-02 1.609157327499999823e+01 4.579871853333330023e+00 +6.314219999999999555e-02 2.074624494500000083e+01 3.774208823333330187e+00 +6.772359999999999491e-02 1.622769223499999924e+01 3.121007619999999871e+00 +7.237720000000000264e-02 8.100976058333330343e+00 2.681633823333330113e+00 +7.692999999999999838e-02 7.297140411666670268e+00 2.370097993333330155e+00 +8.165179999999999660e-02 8.662000215000000836e+00 1.993900453333329992e+00 +8.640209999999999557e-02 1.195176863500000053e+01 1.811378463333330080e+00 +9.107550000000000368e-02 1.017929826333329935e+01 1.581605778333329937e+00 +9.574539999999999440e-02 8.299761948333330253e+00 1.447854706666670044e+00 +1.005039999999999961e-01 7.184010728333330320e+00 1.267957188333330043e+00 +1.052488000000000035e-01 7.705754226666670093e+00 1.175315996666669971e+00 +1.099981000000000014e-01 6.940137736666669888e+00 1.050239939999999983e+00 +1.148520999999999986e-01 7.227232895000000212e+00 9.582211533333330200e-01 +1.197872999999999993e-01 6.058664864999999899e+00 8.747766333333329980e-01 +1.247806000000000054e-01 5.235616768333329674e+00 8.060124016666669888e-01 +1.298481999999999970e-01 6.895559143333329644e+00 7.374701233333329498e-01 +1.349194999999999978e-01 5.596115646666669718e+00 7.017485283333330104e-01 +1.399364999999999915e-01 7.271002904999999572e+00 6.515097483333329720e-01 +1.450858999999999899e-01 5.001139740000000167e+00 6.081432883333329764e-01 +1.502787999999999902e-01 5.397041578333330314e+00 5.852662783333330010e-01 +1.556196999999999997e-01 5.201047356666670396e+00 5.230793849999999523e-01 +1.572660999999999920e-01 5.527525920000000426e+00 1.689539216666670063e-01 +1.609609999999999930e-01 6.050507654999999652e+00 5.103277550000000495e-01 +1.662019000000000135e-01 5.215723743333329665e+00 4.792083599999999999e-01 +1.706513000000000058e-01 5.031433279999999897e+00 1.411615750000000113e-01 +1.715762999999999872e-01 4.986483428333330359e+00 4.534299233333329848e-01 +1.771423000000000025e-01 5.106750501666669884e+00 4.289189133333329851e-01 +1.827474000000000043e-01 5.398633823333329751e+00 4.103611200000000236e-01 +1.842668000000000084e-01 4.914610723333329823e+00 1.221897900000000065e-01 +1.883336999999999928e-01 4.776135458333330419e+00 3.942386333333329773e-01 +1.939963000000000104e-01 4.310256373333330338e+00 3.794851616666670147e-01 +1.982673000000000074e-01 4.375084450000000125e+00 1.047416733333329936e-01 +1.997836000000000056e-01 4.425991520000000179e+00 3.548793383333330165e-01 +2.055989000000000011e-01 4.542295369999999721e+00 3.452195166666670034e-01 +2.114837999999999996e-01 4.392925553333330235e+00 3.296180283333329797e-01 +2.120387999999999995e-01 4.102498828333329683e+00 9.538819833333339604e-02 +2.162090000000000123e-01 4.067448908333330060e+00 4.099168333333330083e-01 +2.260118000000000127e-01 3.879140883333330070e+00 8.427184499999999800e-02 +2.398155999999999899e-01 3.717842756666669857e+00 7.930888666666670306e-02 +2.537425999999999848e-01 3.531988756666669893e+00 7.293178499999999898e-02 +2.676623000000000197e-01 3.501111030000000124e+00 6.786378666666670334e-02 +2.818223999999999729e-01 3.329498083333330083e+00 6.325724833333329356e-02 +2.956782000000000021e-01 3.079447669999999970e+00 5.969948499999999658e-02 +3.099446000000000145e-01 2.946954811666670171e+00 5.483356999999999815e-02 +3.241067000000000253e-01 2.705831398333330196e+00 5.323661166666669720e-02 +3.388467000000000007e-01 2.601996516666670090e+00 4.799289000000000333e-02 +3.539599999999999969e-01 2.517872383333330077e+00 4.725612833333329987e-02 +3.687568999999999986e-01 2.374362781666670141e+00 4.368410333333330037e-02 +3.840311000000000141e-01 2.195996148333330122e+00 4.125977166666670165e-02 +3.989493000000000067e-01 2.109030429999999789e+00 4.042385333333330111e-02 +4.107986000000000137e-01 1.888483604166669938e+00 4.043749766666669687e-02 +4.137051999999999952e-01 1.969810571666670063e+00 3.843483833333329741e-02 +4.291185000000000138e-01 1.859797011666669997e+00 3.539587999999999762e-02 +4.296826999999999730e-01 1.762954635166670059e+00 3.439219566666670141e-02 +4.446591999999999767e-01 1.624618943333330012e+00 3.443567000000000156e-02 +4.468077999999999772e-01 1.588049316333330019e+00 3.067751716666669917e-02 +4.603923999999999794e-01 1.585295316666669896e+00 3.227559333333329672e-02 +4.686866000000000088e-01 1.509168766666669992e+00 3.051112400000000058e-02 +4.765479000000000243e-01 1.429500135000000061e+00 3.031986666666669841e-02 +4.835556999999999772e-01 1.309360340500000053e+00 2.857159116666670162e-02 +4.923843999999999999e-01 1.363123808333329912e+00 3.037624166666669928e-02 +5.048160000000000425e-01 1.296483956833329954e+00 2.677855866666669846e-02 +5.083368000000000331e-01 1.254868451666669937e+00 2.782200166666669999e-02 +5.232324000000000419e-01 1.028253859833329953e+00 2.481625150000000071e-02 +5.249844000000000177e-01 1.223231273333329927e+00 2.634227000000000096e-02 +5.417480000000000073e-01 1.058531658333329961e+00 2.569255333333329838e-02 +5.445661000000000529e-01 1.022632484000000064e+00 2.537817800000000124e-02 +5.583793000000000228e-01 1.009770163333330029e+00 2.504100833333329848e-02 +5.614325999999999484e-01 9.522996788333329965e-01 2.313905700000000107e-02 +5.754704000000000486e-01 9.158985283333339611e-01 2.307270666666669939e-02 +5.835850999999999678e-01 8.544030651666669751e-01 2.288279616666670166e-02 +5.928168000000000326e-01 8.553651300000000290e-01 2.224781666666670113e-02 +6.007578000000000085e-01 7.747371155000000176e-01 2.167619850000000042e-02 +6.099849999999999994e-01 7.987110383333330121e-01 2.165553833333330042e-02 +6.220442000000000471e-01 6.615610463333330138e-01 2.089781950000000124e-02 +6.275817000000000201e-01 7.150054516666669580e-01 2.035196333333329916e-02 +6.414037999999999684e-01 6.088626698333330367e-01 1.874337833333329997e-02 +6.447992000000000168e-01 6.630811316666670452e-01 2.089752166666669977e-02 +6.657526999999999751e-01 5.716572943333330103e-01 1.811807299999999843e-02 +6.845788999999999902e-01 5.092866856666670161e-01 2.008440916666669879e-02 +7.060256999999999783e-01 4.113589818333330261e-01 1.688841199999999848e-02 +7.260906999999999778e-01 4.258370573333329911e-01 1.820484666666670123e-02 +7.492763000000000062e-01 3.814062795000000006e-01 1.498164383333329928e-02 +7.722440999999999889e-01 3.582434820000000020e-01 1.702263550000000097e-02 +7.923405000000000031e-01 3.290160251666670033e-01 1.493438950000000078e-02 +8.157583999999999946e-01 3.190799841666669967e-01 1.530228649999999975e-02 +8.367025000000000157e-01 2.762952625000000273e-01 1.450753649999999943e-02 +8.622005000000000363e-01 2.544186793333330088e-01 1.365137966666669922e-02 +8.849101000000000328e-01 2.424038613333329983e-01 1.432358516666669933e-02 +9.084231000000000389e-01 2.172930054999999971e-01 1.256612799999999933e-02 +9.337292000000000369e-01 2.202721591666670087e-01 1.359930866666670020e-02 +9.554743999999999460e-01 1.777866800000000025e-01 1.269970833333330072e-02 +9.815962999999999772e-01 1.676419470000000134e-01 1.190602366666669923e-02 +1.007114700000000029e+00 1.595580418333329975e-01 1.234223233333330005e-02 +1.030720700000000045e+00 1.541775503333329966e-01 1.173861049999999975e-02 +1.058106800000000014e+00 1.554276226666669869e-01 1.088984299999999975e-02 +1.084931700000000054e+00 1.440364893333329899e-01 1.122487333333329999e-02 +1.110240600000000022e+00 1.198653424999999995e-01 1.085281416666670010e-02 +1.138098400000000066e+00 1.211473946666670048e-01 1.044690799999999954e-02 1.166391799999999979e+00 1.189307901666669942e-01 1.021903716666669980e-02 \ No newline at end of file diff --git a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/13_8000_1340_10.csv b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/13_8000_1340_10.csv index 1161fab16..ee5f13e07 100644 --- a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/13_8000_1340_10.csv +++ b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/13_8000_1340_10.csv @@ -1,105 +1,105 @@ -3.625239999999999713e-02 6.302187949999999717e+01 1.635904319500000170e+01 -4.070000000000000007e-02 2.785521429499999968e+01 1.130956581166669928e+01 -4.511180000000000051e-02 1.008215536333329965e+01 8.312546360000000689e+00 -4.959249999999999770e-02 1.581932412333330085e+01 6.758513281666670203e+00 -5.416379999999999806e-02 7.750620351666669627e+00 5.282679641666669923e+00 -5.868999999999999911e-02 1.257659237500000060e+01 4.560014873333329888e+00 -6.315320000000000655e-02 1.891331758666670027e+01 3.761777425000000008e+00 -6.773540000000000116e-02 1.328150150333330082e+01 3.102479755000000061e+00 -7.238989999999999314e-02 9.795755306666670492e+00 2.689289660000000026e+00 -7.694339999999999513e-02 1.021541878833330053e+01 2.386645821666669942e+00 -8.166600000000000248e-02 7.264236756666670125e+00 1.982897978333330036e+00 -8.641719999999999957e-02 9.727612021666670827e+00 1.793249476666670006e+00 -9.109140000000000292e-02 9.940133039999999198e+00 1.578285125000000066e+00 -9.576210000000000278e-02 5.869161616666669801e+00 1.426304660000000002e+00 -1.005216000000000026e-01 6.271050506666670188e+00 1.258989316666669911e+00 -1.052672000000000052e-01 4.575212496666670070e+00 1.144957958333330028e+00 -1.100174000000000013e-01 6.675946670000000083e+00 1.046739891666669919e+00 -1.148721999999999938e-01 4.569861300000000348e+00 9.307519933333330275e-01 -1.198083000000000065e-01 4.073412075000000243e+00 8.536948699999999945e-01 -1.248023999999999939e-01 5.517398765000000260e+00 8.081908083333330106e-01 -1.298709000000000113e-01 6.055929844999999645e+00 7.277152516666669513e-01 -1.349431000000000103e-01 4.214499321666670184e+00 6.853886750000000028e-01 -1.399610000000000021e-01 4.711855326666669619e+00 6.206856016666669751e-01 -1.451112999999999986e-01 4.280988370000000209e+00 5.992362466666669718e-01 -1.503050999999999970e-01 3.350940026666669791e+00 5.604130616666670450e-01 -1.556469000000000047e-01 4.037392881666669986e+00 5.086757983333329847e-01 -1.572660999999999920e-01 4.116049464999999685e+00 1.639383783333329958e-01 -1.609891999999999990e-01 4.767404383333330387e+00 4.936060199999999787e-01 -1.662309999999999899e-01 4.092517224999999925e+00 4.643677516666669947e-01 -1.706513000000000058e-01 3.775210913333329810e+00 1.365719850000000068e-01 -1.716062999999999894e-01 4.067082121666669714e+00 4.413313999999999848e-01 -1.771733000000000058e-01 3.397890750000000182e+00 4.070909349999999871e-01 -1.827794000000000085e-01 4.061001236666670344e+00 3.925402433333329832e-01 -1.842668000000000084e-01 3.799252254999999856e+00 1.178310383333329991e-01 -1.883665999999999952e-01 3.208655455000000156e+00 3.733191000000000148e-01 -1.940302000000000138e-01 3.206445976666670195e+00 3.650098783333329822e-01 -1.982673000000000074e-01 3.425276903333330125e+00 1.008325449999999956e-01 -1.998185000000000100e-01 3.354815260000000077e+00 3.406662516666669749e-01 -2.056348000000000065e-01 3.721227830000000125e+00 3.339491649999999923e-01 -2.115208000000000088e-01 3.612948971666670062e+00 3.193275150000000062e-01 -2.120387999999999995e-01 3.205896688333329969e+00 9.145261000000000362e-02 -2.162467999999999890e-01 3.645113248333330169e+00 4.021025750000000176e-01 -2.260118000000000127e-01 3.104582965000000083e+00 8.081593333333329798e-02 -2.398155999999999899e-01 3.037513673333330111e+00 7.613482000000000582e-02 -2.537425999999999848e-01 2.836682165000000033e+00 6.969811833333329487e-02 -2.676623000000000197e-01 2.819590748333329788e+00 6.462849833333329796e-02 -2.818223999999999729e-01 2.721404538333330070e+00 6.033223166666670106e-02 -2.956782000000000021e-01 2.736251186666669888e+00 5.799425166666669768e-02 -3.099446000000000145e-01 2.543946483333329844e+00 5.286760000000000070e-02 -3.241067000000000253e-01 2.287160831666669836e+00 5.112056499999999976e-02 -3.388467000000000007e-01 2.288673078333329780e+00 4.649771999999999933e-02 -3.539599999999999969e-01 2.199149091666670053e+00 4.568711999999999773e-02 -3.687568999999999986e-01 2.068072668333329922e+00 4.217328666666669834e-02 -3.840311000000000141e-01 1.969221529999999998e+00 4.012745166666670249e-02 -3.989493000000000067e-01 1.908232941666669902e+00 3.938963333333329875e-02 -4.107629999999999892e-01 1.727702871333330004e+00 3.958386533333330126e-02 -4.137051999999999952e-01 1.726875600000000066e+00 3.720425833333330240e-02 -4.291185000000000138e-01 1.581841901666670047e+00 3.398506666666670228e-02 -4.296455000000000135e-01 1.691278518333330094e+00 3.404221949999999830e-02 -4.446591999999999767e-01 1.488087740000000103e+00 3.374035333333329917e-02 -4.467690999999999746e-01 1.413946998166669911e+00 2.991126200000000096e-02 -4.603923999999999794e-01 1.391984139999999925e+00 3.130147333333330173e-02 -4.686460000000000070e-01 1.392956528666670080e+00 2.997462383333330052e-02 -4.765479000000000243e-01 1.301627080000000047e+00 2.965699000000000113e-02 -4.835137999999999936e-01 1.193676802499999967e+00 2.800566683333330018e-02 -4.923843999999999999e-01 1.242278698333330045e+00 2.973970833333329858e-02 -5.047722000000000042e-01 1.149708217833329993e+00 2.613050733333329920e-02 -5.083368000000000331e-01 1.161310218333329924e+00 2.733334000000000111e-02 -5.231871000000000160e-01 9.503032668333329935e-01 2.446244750000000148e-02 -5.249844000000000177e-01 1.102167341666669964e+00 2.571981833333330039e-02 -5.417480000000000073e-01 9.754589783333329489e-01 2.525416166666670167e-02 -5.445189000000000279e-01 9.366835949999999800e-01 2.497178450000000008e-02 -5.583793000000000228e-01 8.831162099999999571e-01 2.438054666666670048e-02 -5.613839000000000468e-01 8.824506341666670250e-01 2.281443349999999828e-02 -5.754704000000000486e-01 8.100822066666669707e-01 2.253018666666670167e-02 -5.835346000000000144e-01 7.776236106666669645e-01 2.252483566666670101e-02 -5.928168000000000326e-01 7.764561633333330049e-01 2.182597999999999830e-02 -6.007057000000000091e-01 6.983251131666670108e-01 2.131793766666669962e-02 -6.099849999999999994e-01 7.099790583333329685e-01 2.117932666666669933e-02 -6.219902999999999960e-01 6.466382168333330016e-01 2.081252199999999997e-02 -6.275817000000000201e-01 6.603706066666670260e-01 2.006477833333330033e-02 -6.413482000000000349e-01 5.710830485000000234e-01 1.856948533333329862e-02 -6.447992000000000168e-01 5.732715750000000332e-01 2.040912500000000018e-02 -6.656950000000000367e-01 5.203726888333329859e-01 1.789587166666670170e-02 -6.845196000000000058e-01 4.749653629999999738e-01 1.990720683333329841e-02 -7.059646000000000532e-01 3.822856073333329996e-01 1.675657983333329881e-02 -7.260278000000000009e-01 3.886542691666670102e-01 1.802539466666670115e-02 -7.492113999999999718e-01 3.564554191666670091e-01 1.487377883333330063e-02 -7.721772000000000080e-01 3.333074428333330230e-01 1.689668533333330003e-02 -7.922717999999999705e-01 3.187338046666670088e-01 1.488059016666670037e-02 -8.156877999999999629e-01 3.010368924999999862e-01 1.521491216666670011e-02 -8.366301000000000432e-01 2.406595508333330136e-01 1.435568400000000050e-02 -8.621258000000000532e-01 2.223576200000000058e-01 1.352156766666669924e-02 -8.848333999999999921e-01 2.207387865000000060e-01 1.422139816666669922e-02 -9.083444000000000518e-01 2.134049949999999862e-01 1.254214099999999971e-02 -9.336484000000000449e-01 1.885945263333330124e-01 1.346345033333330027e-02 -9.553916000000000075e-01 1.698076676666669949e-01 1.265998783333329922e-02 -9.815112999999999754e-01 1.668850050000000029e-01 1.189438716666670059e-02 -1.007027499999999964e+00 1.441018685000000077e-01 1.227580483333329947e-02 -1.030631400000000086e+00 1.406578583333329968e-01 1.168073399999999991e-02 -1.058015099999999986e+00 1.399035711666669901e-01 1.082874783333329961e-02 -1.084837700000000016e+00 1.486492919999999884e-01 1.123307866666669978e-02 -1.110144500000000090e+00 1.008698655000000027e-01 1.077987283333329931e-02 -1.137999800000000006e+00 1.027075286666670056e-01 1.037853683333330064e-02 +3.625239999999999713e-02 6.302187949999999717e+01 1.635904319500000170e+01 +4.070000000000000007e-02 2.785521429499999968e+01 1.130956581166669928e+01 +4.511180000000000051e-02 1.008215536333329965e+01 8.312546360000000689e+00 +4.959249999999999770e-02 1.581932412333330085e+01 6.758513281666670203e+00 +5.416379999999999806e-02 7.750620351666669627e+00 5.282679641666669923e+00 +5.868999999999999911e-02 1.257659237500000060e+01 4.560014873333329888e+00 +6.315320000000000655e-02 1.891331758666670027e+01 3.761777425000000008e+00 +6.773540000000000116e-02 1.328150150333330082e+01 3.102479755000000061e+00 +7.238989999999999314e-02 9.795755306666670492e+00 2.689289660000000026e+00 +7.694339999999999513e-02 1.021541878833330053e+01 2.386645821666669942e+00 +8.166600000000000248e-02 7.264236756666670125e+00 1.982897978333330036e+00 +8.641719999999999957e-02 9.727612021666670827e+00 1.793249476666670006e+00 +9.109140000000000292e-02 9.940133039999999198e+00 1.578285125000000066e+00 +9.576210000000000278e-02 5.869161616666669801e+00 1.426304660000000002e+00 +1.005216000000000026e-01 6.271050506666670188e+00 1.258989316666669911e+00 +1.052672000000000052e-01 4.575212496666670070e+00 1.144957958333330028e+00 +1.100174000000000013e-01 6.675946670000000083e+00 1.046739891666669919e+00 +1.148721999999999938e-01 4.569861300000000348e+00 9.307519933333330275e-01 +1.198083000000000065e-01 4.073412075000000243e+00 8.536948699999999945e-01 +1.248023999999999939e-01 5.517398765000000260e+00 8.081908083333330106e-01 +1.298709000000000113e-01 6.055929844999999645e+00 7.277152516666669513e-01 +1.349431000000000103e-01 4.214499321666670184e+00 6.853886750000000028e-01 +1.399610000000000021e-01 4.711855326666669619e+00 6.206856016666669751e-01 +1.451112999999999986e-01 4.280988370000000209e+00 5.992362466666669718e-01 +1.503050999999999970e-01 3.350940026666669791e+00 5.604130616666670450e-01 +1.556469000000000047e-01 4.037392881666669986e+00 5.086757983333329847e-01 +1.572660999999999920e-01 4.116049464999999685e+00 1.639383783333329958e-01 +1.609891999999999990e-01 4.767404383333330387e+00 4.936060199999999787e-01 +1.662309999999999899e-01 4.092517224999999925e+00 4.643677516666669947e-01 +1.706513000000000058e-01 3.775210913333329810e+00 1.365719850000000068e-01 +1.716062999999999894e-01 4.067082121666669714e+00 4.413313999999999848e-01 +1.771733000000000058e-01 3.397890750000000182e+00 4.070909349999999871e-01 +1.827794000000000085e-01 4.061001236666670344e+00 3.925402433333329832e-01 +1.842668000000000084e-01 3.799252254999999856e+00 1.178310383333329991e-01 +1.883665999999999952e-01 3.208655455000000156e+00 3.733191000000000148e-01 +1.940302000000000138e-01 3.206445976666670195e+00 3.650098783333329822e-01 +1.982673000000000074e-01 3.425276903333330125e+00 1.008325449999999956e-01 +1.998185000000000100e-01 3.354815260000000077e+00 3.406662516666669749e-01 +2.056348000000000065e-01 3.721227830000000125e+00 3.339491649999999923e-01 +2.115208000000000088e-01 3.612948971666670062e+00 3.193275150000000062e-01 +2.120387999999999995e-01 3.205896688333329969e+00 9.145261000000000362e-02 +2.162467999999999890e-01 3.645113248333330169e+00 4.021025750000000176e-01 +2.260118000000000127e-01 3.104582965000000083e+00 8.081593333333329798e-02 +2.398155999999999899e-01 3.037513673333330111e+00 7.613482000000000582e-02 +2.537425999999999848e-01 2.836682165000000033e+00 6.969811833333329487e-02 +2.676623000000000197e-01 2.819590748333329788e+00 6.462849833333329796e-02 +2.818223999999999729e-01 2.721404538333330070e+00 6.033223166666670106e-02 +2.956782000000000021e-01 2.736251186666669888e+00 5.799425166666669768e-02 +3.099446000000000145e-01 2.543946483333329844e+00 5.286760000000000070e-02 +3.241067000000000253e-01 2.287160831666669836e+00 5.112056499999999976e-02 +3.388467000000000007e-01 2.288673078333329780e+00 4.649771999999999933e-02 +3.539599999999999969e-01 2.199149091666670053e+00 4.568711999999999773e-02 +3.687568999999999986e-01 2.068072668333329922e+00 4.217328666666669834e-02 +3.840311000000000141e-01 1.969221529999999998e+00 4.012745166666670249e-02 +3.989493000000000067e-01 1.908232941666669902e+00 3.938963333333329875e-02 +4.107629999999999892e-01 1.727702871333330004e+00 3.958386533333330126e-02 +4.137051999999999952e-01 1.726875600000000066e+00 3.720425833333330240e-02 +4.291185000000000138e-01 1.581841901666670047e+00 3.398506666666670228e-02 +4.296455000000000135e-01 1.691278518333330094e+00 3.404221949999999830e-02 +4.446591999999999767e-01 1.488087740000000103e+00 3.374035333333329917e-02 +4.467690999999999746e-01 1.413946998166669911e+00 2.991126200000000096e-02 +4.603923999999999794e-01 1.391984139999999925e+00 3.130147333333330173e-02 +4.686460000000000070e-01 1.392956528666670080e+00 2.997462383333330052e-02 +4.765479000000000243e-01 1.301627080000000047e+00 2.965699000000000113e-02 +4.835137999999999936e-01 1.193676802499999967e+00 2.800566683333330018e-02 +4.923843999999999999e-01 1.242278698333330045e+00 2.973970833333329858e-02 +5.047722000000000042e-01 1.149708217833329993e+00 2.613050733333329920e-02 +5.083368000000000331e-01 1.161310218333329924e+00 2.733334000000000111e-02 +5.231871000000000160e-01 9.503032668333329935e-01 2.446244750000000148e-02 +5.249844000000000177e-01 1.102167341666669964e+00 2.571981833333330039e-02 +5.417480000000000073e-01 9.754589783333329489e-01 2.525416166666670167e-02 +5.445189000000000279e-01 9.366835949999999800e-01 2.497178450000000008e-02 +5.583793000000000228e-01 8.831162099999999571e-01 2.438054666666670048e-02 +5.613839000000000468e-01 8.824506341666670250e-01 2.281443349999999828e-02 +5.754704000000000486e-01 8.100822066666669707e-01 2.253018666666670167e-02 +5.835346000000000144e-01 7.776236106666669645e-01 2.252483566666670101e-02 +5.928168000000000326e-01 7.764561633333330049e-01 2.182597999999999830e-02 +6.007057000000000091e-01 6.983251131666670108e-01 2.131793766666669962e-02 +6.099849999999999994e-01 7.099790583333329685e-01 2.117932666666669933e-02 +6.219902999999999960e-01 6.466382168333330016e-01 2.081252199999999997e-02 +6.275817000000000201e-01 6.603706066666670260e-01 2.006477833333330033e-02 +6.413482000000000349e-01 5.710830485000000234e-01 1.856948533333329862e-02 +6.447992000000000168e-01 5.732715750000000332e-01 2.040912500000000018e-02 +6.656950000000000367e-01 5.203726888333329859e-01 1.789587166666670170e-02 +6.845196000000000058e-01 4.749653629999999738e-01 1.990720683333329841e-02 +7.059646000000000532e-01 3.822856073333329996e-01 1.675657983333329881e-02 +7.260278000000000009e-01 3.886542691666670102e-01 1.802539466666670115e-02 +7.492113999999999718e-01 3.564554191666670091e-01 1.487377883333330063e-02 +7.721772000000000080e-01 3.333074428333330230e-01 1.689668533333330003e-02 +7.922717999999999705e-01 3.187338046666670088e-01 1.488059016666670037e-02 +8.156877999999999629e-01 3.010368924999999862e-01 1.521491216666670011e-02 +8.366301000000000432e-01 2.406595508333330136e-01 1.435568400000000050e-02 +8.621258000000000532e-01 2.223576200000000058e-01 1.352156766666669924e-02 +8.848333999999999921e-01 2.207387865000000060e-01 1.422139816666669922e-02 +9.083444000000000518e-01 2.134049949999999862e-01 1.254214099999999971e-02 +9.336484000000000449e-01 1.885945263333330124e-01 1.346345033333330027e-02 +9.553916000000000075e-01 1.698076676666669949e-01 1.265998783333329922e-02 +9.815112999999999754e-01 1.668850050000000029e-01 1.189438716666670059e-02 +1.007027499999999964e+00 1.441018685000000077e-01 1.227580483333329947e-02 +1.030631400000000086e+00 1.406578583333329968e-01 1.168073399999999991e-02 +1.058015099999999986e+00 1.399035711666669901e-01 1.082874783333329961e-02 +1.084837700000000016e+00 1.486492919999999884e-01 1.123307866666669978e-02 +1.110144500000000090e+00 1.008698655000000027e-01 1.077987283333329931e-02 +1.137999800000000006e+00 1.027075286666670056e-01 1.037853683333330064e-02 1.166290800000000072e+00 1.157098001666670012e-01 1.020088966666670045e-02 \ No newline at end of file diff --git a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/1_0_1340_10.csv b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/1_0_1340_10.csv index 741887c08..1c5c261ee 100644 --- a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/1_0_1340_10.csv +++ b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/1_0_1340_10.csv @@ -1,105 +1,105 @@ -3.625239999999999713e-02 2.859171986188329811e+03 2.282233352000000082e+01 -4.070000000000000007e-02 1.037695935384999984e+03 1.390765389166669941e+01 -4.511180000000000051e-02 4.617414862783330136e+02 9.644274246666670436e+00 -4.959249999999999770e-02 2.830472148050000101e+02 7.651757100000000200e+00 -5.416379999999999806e-02 1.737180786733329967e+02 5.901133003333329796e+00 -5.868999999999999911e-02 1.284318533800000068e+02 5.055296333333330061e+00 -6.315320000000000655e-02 1.083304533916670067e+02 4.179970964999999872e+00 -6.773540000000000116e-02 8.164665742500000079e+01 3.449109084999999908e+00 -7.238989999999999314e-02 6.842710629666669320e+01 3.015091889999999886e+00 -7.694339999999999513e-02 6.503887503333329789e+01 2.712566869999999852e+00 -8.166600000000000248e-02 5.768616606333330310e+01 2.292022508333329878e+00 -8.641719999999999957e-02 4.726633163000000337e+01 2.052834279999999900e+00 -9.109140000000000292e-02 4.170182763166670270e+01 1.806841736666670029e+00 -9.576210000000000278e-02 3.278791741500000256e+01 1.635979810000000034e+00 -1.005216000000000026e-01 3.137094696333329935e+01 1.457612156666669989e+00 -1.052672000000000052e-01 2.858316747499999977e+01 1.352856671666669897e+00 -1.100174000000000013e-01 2.685582243333330155e+01 1.222659363333330029e+00 -1.148721999999999938e-01 2.463809722666670154e+01 1.115379456666669933e+00 -1.198083000000000065e-01 1.979913578000000030e+01 1.002652691666670037e+00 -1.248023999999999939e-01 1.884005529499999909e+01 9.371682333333329895e-01 -1.298709000000000113e-01 2.011378014833330141e+01 8.660532583333330203e-01 -1.349431000000000103e-01 1.548196221999999977e+01 8.040137483333329449e-01 -1.399610000000000021e-01 1.553817986500000004e+01 7.396018783333330182e-01 -1.451112999999999986e-01 1.380290046833330031e+01 7.008050850000000498e-01 -1.503050999999999970e-01 1.290957537833329916e+01 6.659874700000000258e-01 -1.556469000000000047e-01 1.188963399333329995e+01 5.958023666666669715e-01 -1.572456999999999883e-01 1.305280697499999931e+01 1.930089849999999940e-01 -1.609891999999999990e-01 1.134609165166670053e+01 5.714861916666670316e-01 -1.662309999999999899e-01 1.103891432833330022e+01 5.468199316666669807e-01 -1.706292000000000086e-01 1.121912493499999997e+01 1.614639983333329976e-01 -1.716062999999999894e-01 1.098087770333330049e+01 5.221648316666670508e-01 -1.771733000000000058e-01 9.846715853333330770e+00 4.826313150000000052e-01 -1.827794000000000085e-01 1.030369242166669963e+01 4.679303400000000002e-01 -1.842428999999999872e-01 9.629214631666670243e+00 1.387244099999999924e-01 -1.883665999999999952e-01 9.108624106666670883e+00 4.454082083333330000e-01 -1.940302000000000138e-01 8.056377178333329780e+00 4.232006716666670276e-01 -1.982414999999999872e-01 8.605072379999999299e+00 1.202604099999999981e-01 -1.998185000000000100e-01 8.229729869999999892e+00 3.995894999999999864e-01 -2.056348000000000065e-01 8.070094290000000115e+00 3.879820366666669740e-01 -2.115208000000000088e-01 7.741634115000000094e+00 3.686955350000000187e-01 -2.120113000000000136e-01 7.664225765000000301e+00 1.093220133333329958e-01 -2.162467999999999890e-01 7.363320653333330412e+00 4.626756216666669808e-01 -2.259823999999999999e-01 6.848802841666669750e+00 9.609777999999999376e-02 -2.397845000000000115e-01 6.337189861666669977e+00 9.020952999999999611e-02 -2.537096999999999825e-01 5.738702153333330003e+00 8.211384833333329469e-02 -2.676275000000000182e-01 5.346591223333329701e+00 7.572218666666670484e-02 -2.817857999999999752e-01 5.009933698333330021e+00 7.051459333333330581e-02 -2.956398000000000081e-01 4.597692046666669974e+00 6.646157833333329878e-02 -3.099044000000000243e-01 4.193400725000000051e+00 6.031815000000000093e-02 -3.240645999999999805e-01 3.804645918333330101e+00 5.825413166666670167e-02 -3.388027000000000122e-01 3.560888523333329836e+00 5.213344166666669666e-02 -3.539140000000000064e-01 3.375211385000000064e+00 5.107971833333330158e-02 -3.687090000000000090e-01 3.188264295000000192e+00 4.732182333333329743e-02 -3.839813000000000254e-01 2.892990108333330035e+00 4.441047333333329739e-02 -3.988975000000000160e-01 2.640608908333330174e+00 4.290645666666669661e-02 -4.106379000000000001e-01 2.501690660833329805e+00 4.331324033333330131e-02 -4.136514000000000024e-01 2.477246653333330162e+00 4.077528500000000139e-02 -4.290628000000000219e-01 2.358423203333329887e+00 3.769917166666669761e-02 -4.295145000000000213e-01 2.266923564999999918e+00 3.645828216666670285e-02 -4.446014999999999828e-01 2.023246533333329822e+00 3.627248666666670063e-02 -4.466328999999999994e-01 2.032174506166669836e+00 3.243397416666669864e-02 -4.603325999999999807e-01 1.951935533333329920e+00 3.395880333333330114e-02 -4.685032000000000085e-01 1.797322475499999905e+00 3.168831166666669780e-02 -4.764860000000000206e-01 1.814704324999999896e+00 3.212894000000000166e-02 -4.833663999999999739e-01 1.722621554333330085e+00 3.037123383333329915e-02 -4.923204999999999942e-01 1.658358661666669898e+00 3.178619500000000320e-02 -5.046184000000000225e-01 1.539108265666669917e+00 2.774163983333330016e-02 -5.082708000000000226e-01 1.547966548333330028e+00 2.920229666666670013e-02 -5.230276000000000369e-01 1.345057283333330078e+00 2.608127533333329945e-02 -5.249162000000000550e-01 1.417396718333330030e+00 2.724554333333329900e-02 -5.416775999999999813e-01 1.270799306666670070e+00 2.670250999999999875e-02 -5.443529999999999758e-01 1.250087865666670073e+00 2.633086933333329827e-02 -5.583067999999999920e-01 1.165305416666670091e+00 2.577655499999999961e-02 -5.612129000000000145e-01 1.147836548999999984e+00 2.393862083333329893e-02 -5.753956999999999544e-01 1.115183805000000028e+00 2.400332833333329932e-02 -5.833568000000000087e-01 1.044019996999999922e+00 2.366755300000000090e-02 -5.927398999999999862e-01 1.004017331666670065e+00 2.296542000000000028e-02 -6.005226999999999649e-01 9.482225546666670501e-01 2.240195116666670108e-02 -6.099058000000000535e-01 9.388455449999999480e-01 2.233828499999999939e-02 -6.218008000000000424e-01 8.511757086666670302e-01 2.168908733333330119e-02 -6.275003000000000108e-01 8.553386066666669452e-01 2.101305833333329959e-02 -6.411527999999999672e-01 7.761240236666669956e-01 1.940277716666670080e-02 -6.447154999999999969e-01 7.270576883333329521e-01 2.120466833333330137e-02 -6.654921999999999782e-01 7.007768106666669716e-01 1.861042133333330045e-02 -6.843110000000000026e-01 6.466361541666669766e-01 2.069310833333330019e-02 -7.057493999999999712e-01 5.771519323333329510e-01 1.752841666666669906e-02 -7.258065000000000211e-01 5.204018098333329512e-01 1.860044799999999859e-02 -7.489831000000000127e-01 4.984340896666670240e-01 1.540761000000000040e-02 -7.719418000000000113e-01 4.436713720000000083e-01 1.738589999999999927e-02 -7.920304000000000233e-01 4.316635041666669892e-01 1.532890283333330009e-02 -8.154392000000000307e-01 3.868879691666670118e-01 1.556857449999999969e-02 -8.363751000000000380e-01 3.670109628333330098e-01 1.484866983333330004e-02 -8.618630000000000457e-01 3.329731463333330255e-01 1.392995016666669951e-02 -8.845638000000000112e-01 3.302565831666670060e-01 1.467645416666669977e-02 -9.080675999999999748e-01 2.757098590000000016e-01 1.276754683333329934e-02 -9.333637999999999657e-01 2.804865558333329845e-01 1.382540016666669938e-02 -9.551005000000000189e-01 2.398962168333330092e-01 1.292395533333329932e-02 -9.812121999999999788e-01 2.360268241666670097e-01 1.213837400000000039e-02 -1.006720599999999965e+00 2.134167958333330062e-01 1.253179649999999930e-02 -1.030317399999999939e+00 2.102511210000000130e-01 1.193319533333330081e-02 -1.057692700000000041e+00 2.135461601666669984e-01 1.107935333333330032e-02 -1.084507099999999946e+00 1.969431385000000034e-01 1.140526600000000071e-02 -1.109806099999999907e+00 1.561050018333330069e-01 1.096976283333329916e-02 -1.137653000000000025e+00 1.629041234999999976e-01 1.057719600000000051e-02 +3.625239999999999713e-02 2.859171986188329811e+03 2.282233352000000082e+01 +4.070000000000000007e-02 1.037695935384999984e+03 1.390765389166669941e+01 +4.511180000000000051e-02 4.617414862783330136e+02 9.644274246666670436e+00 +4.959249999999999770e-02 2.830472148050000101e+02 7.651757100000000200e+00 +5.416379999999999806e-02 1.737180786733329967e+02 5.901133003333329796e+00 +5.868999999999999911e-02 1.284318533800000068e+02 5.055296333333330061e+00 +6.315320000000000655e-02 1.083304533916670067e+02 4.179970964999999872e+00 +6.773540000000000116e-02 8.164665742500000079e+01 3.449109084999999908e+00 +7.238989999999999314e-02 6.842710629666669320e+01 3.015091889999999886e+00 +7.694339999999999513e-02 6.503887503333329789e+01 2.712566869999999852e+00 +8.166600000000000248e-02 5.768616606333330310e+01 2.292022508333329878e+00 +8.641719999999999957e-02 4.726633163000000337e+01 2.052834279999999900e+00 +9.109140000000000292e-02 4.170182763166670270e+01 1.806841736666670029e+00 +9.576210000000000278e-02 3.278791741500000256e+01 1.635979810000000034e+00 +1.005216000000000026e-01 3.137094696333329935e+01 1.457612156666669989e+00 +1.052672000000000052e-01 2.858316747499999977e+01 1.352856671666669897e+00 +1.100174000000000013e-01 2.685582243333330155e+01 1.222659363333330029e+00 +1.148721999999999938e-01 2.463809722666670154e+01 1.115379456666669933e+00 +1.198083000000000065e-01 1.979913578000000030e+01 1.002652691666670037e+00 +1.248023999999999939e-01 1.884005529499999909e+01 9.371682333333329895e-01 +1.298709000000000113e-01 2.011378014833330141e+01 8.660532583333330203e-01 +1.349431000000000103e-01 1.548196221999999977e+01 8.040137483333329449e-01 +1.399610000000000021e-01 1.553817986500000004e+01 7.396018783333330182e-01 +1.451112999999999986e-01 1.380290046833330031e+01 7.008050850000000498e-01 +1.503050999999999970e-01 1.290957537833329916e+01 6.659874700000000258e-01 +1.556469000000000047e-01 1.188963399333329995e+01 5.958023666666669715e-01 +1.572456999999999883e-01 1.305280697499999931e+01 1.930089849999999940e-01 +1.609891999999999990e-01 1.134609165166670053e+01 5.714861916666670316e-01 +1.662309999999999899e-01 1.103891432833330022e+01 5.468199316666669807e-01 +1.706292000000000086e-01 1.121912493499999997e+01 1.614639983333329976e-01 +1.716062999999999894e-01 1.098087770333330049e+01 5.221648316666670508e-01 +1.771733000000000058e-01 9.846715853333330770e+00 4.826313150000000052e-01 +1.827794000000000085e-01 1.030369242166669963e+01 4.679303400000000002e-01 +1.842428999999999872e-01 9.629214631666670243e+00 1.387244099999999924e-01 +1.883665999999999952e-01 9.108624106666670883e+00 4.454082083333330000e-01 +1.940302000000000138e-01 8.056377178333329780e+00 4.232006716666670276e-01 +1.982414999999999872e-01 8.605072379999999299e+00 1.202604099999999981e-01 +1.998185000000000100e-01 8.229729869999999892e+00 3.995894999999999864e-01 +2.056348000000000065e-01 8.070094290000000115e+00 3.879820366666669740e-01 +2.115208000000000088e-01 7.741634115000000094e+00 3.686955350000000187e-01 +2.120113000000000136e-01 7.664225765000000301e+00 1.093220133333329958e-01 +2.162467999999999890e-01 7.363320653333330412e+00 4.626756216666669808e-01 +2.259823999999999999e-01 6.848802841666669750e+00 9.609777999999999376e-02 +2.397845000000000115e-01 6.337189861666669977e+00 9.020952999999999611e-02 +2.537096999999999825e-01 5.738702153333330003e+00 8.211384833333329469e-02 +2.676275000000000182e-01 5.346591223333329701e+00 7.572218666666670484e-02 +2.817857999999999752e-01 5.009933698333330021e+00 7.051459333333330581e-02 +2.956398000000000081e-01 4.597692046666669974e+00 6.646157833333329878e-02 +3.099044000000000243e-01 4.193400725000000051e+00 6.031815000000000093e-02 +3.240645999999999805e-01 3.804645918333330101e+00 5.825413166666670167e-02 +3.388027000000000122e-01 3.560888523333329836e+00 5.213344166666669666e-02 +3.539140000000000064e-01 3.375211385000000064e+00 5.107971833333330158e-02 +3.687090000000000090e-01 3.188264295000000192e+00 4.732182333333329743e-02 +3.839813000000000254e-01 2.892990108333330035e+00 4.441047333333329739e-02 +3.988975000000000160e-01 2.640608908333330174e+00 4.290645666666669661e-02 +4.106379000000000001e-01 2.501690660833329805e+00 4.331324033333330131e-02 +4.136514000000000024e-01 2.477246653333330162e+00 4.077528500000000139e-02 +4.290628000000000219e-01 2.358423203333329887e+00 3.769917166666669761e-02 +4.295145000000000213e-01 2.266923564999999918e+00 3.645828216666670285e-02 +4.446014999999999828e-01 2.023246533333329822e+00 3.627248666666670063e-02 +4.466328999999999994e-01 2.032174506166669836e+00 3.243397416666669864e-02 +4.603325999999999807e-01 1.951935533333329920e+00 3.395880333333330114e-02 +4.685032000000000085e-01 1.797322475499999905e+00 3.168831166666669780e-02 +4.764860000000000206e-01 1.814704324999999896e+00 3.212894000000000166e-02 +4.833663999999999739e-01 1.722621554333330085e+00 3.037123383333329915e-02 +4.923204999999999942e-01 1.658358661666669898e+00 3.178619500000000320e-02 +5.046184000000000225e-01 1.539108265666669917e+00 2.774163983333330016e-02 +5.082708000000000226e-01 1.547966548333330028e+00 2.920229666666670013e-02 +5.230276000000000369e-01 1.345057283333330078e+00 2.608127533333329945e-02 +5.249162000000000550e-01 1.417396718333330030e+00 2.724554333333329900e-02 +5.416775999999999813e-01 1.270799306666670070e+00 2.670250999999999875e-02 +5.443529999999999758e-01 1.250087865666670073e+00 2.633086933333329827e-02 +5.583067999999999920e-01 1.165305416666670091e+00 2.577655499999999961e-02 +5.612129000000000145e-01 1.147836548999999984e+00 2.393862083333329893e-02 +5.753956999999999544e-01 1.115183805000000028e+00 2.400332833333329932e-02 +5.833568000000000087e-01 1.044019996999999922e+00 2.366755300000000090e-02 +5.927398999999999862e-01 1.004017331666670065e+00 2.296542000000000028e-02 +6.005226999999999649e-01 9.482225546666670501e-01 2.240195116666670108e-02 +6.099058000000000535e-01 9.388455449999999480e-01 2.233828499999999939e-02 +6.218008000000000424e-01 8.511757086666670302e-01 2.168908733333330119e-02 +6.275003000000000108e-01 8.553386066666669452e-01 2.101305833333329959e-02 +6.411527999999999672e-01 7.761240236666669956e-01 1.940277716666670080e-02 +6.447154999999999969e-01 7.270576883333329521e-01 2.120466833333330137e-02 +6.654921999999999782e-01 7.007768106666669716e-01 1.861042133333330045e-02 +6.843110000000000026e-01 6.466361541666669766e-01 2.069310833333330019e-02 +7.057493999999999712e-01 5.771519323333329510e-01 1.752841666666669906e-02 +7.258065000000000211e-01 5.204018098333329512e-01 1.860044799999999859e-02 +7.489831000000000127e-01 4.984340896666670240e-01 1.540761000000000040e-02 +7.719418000000000113e-01 4.436713720000000083e-01 1.738589999999999927e-02 +7.920304000000000233e-01 4.316635041666669892e-01 1.532890283333330009e-02 +8.154392000000000307e-01 3.868879691666670118e-01 1.556857449999999969e-02 +8.363751000000000380e-01 3.670109628333330098e-01 1.484866983333330004e-02 +8.618630000000000457e-01 3.329731463333330255e-01 1.392995016666669951e-02 +8.845638000000000112e-01 3.302565831666670060e-01 1.467645416666669977e-02 +9.080675999999999748e-01 2.757098590000000016e-01 1.276754683333329934e-02 +9.333637999999999657e-01 2.804865558333329845e-01 1.382540016666669938e-02 +9.551005000000000189e-01 2.398962168333330092e-01 1.292395533333329932e-02 +9.812121999999999788e-01 2.360268241666670097e-01 1.213837400000000039e-02 +1.006720599999999965e+00 2.134167958333330062e-01 1.253179649999999930e-02 +1.030317399999999939e+00 2.102511210000000130e-01 1.193319533333330081e-02 +1.057692700000000041e+00 2.135461601666669984e-01 1.107935333333330032e-02 +1.084507099999999946e+00 1.969431385000000034e-01 1.140526600000000071e-02 +1.109806099999999907e+00 1.561050018333330069e-01 1.096976283333329916e-02 +1.137653000000000025e+00 1.629041234999999976e-01 1.057719600000000051e-02 1.165935399999999955e+00 1.774132069999999894e-01 1.040658966666670009e-02 \ No newline at end of file diff --git a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/2_20_1340_10.csv b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/2_20_1340_10.csv index a4e026fba..3fc895617 100644 --- a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/2_20_1340_10.csv +++ b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/2_20_1340_10.csv @@ -1,105 +1,105 @@ -3.623980000000000257e-02 4.717095203250000282e+02 1.736400694499999986e+01 -4.068580000000000113e-02 2.786014172683330230e+02 1.198827076999999974e+01 -4.509610000000000007e-02 1.807710803516669955e+02 8.834240069999999889e+00 -4.957530000000000270e-02 1.404167299050000111e+02 7.187393765000000379e+00 -5.414490000000000275e-02 1.070548824566670021e+02 5.660295944999999662e+00 -5.866960000000000230e-02 9.429733434666670178e+01 4.914365443333330141e+00 -6.313130000000000130e-02 8.753748113499999306e+01 4.086659178333330367e+00 -6.771190000000000542e-02 8.007891920833330346e+01 3.441741584999999937e+00 -7.236470000000000402e-02 5.999202779333329971e+01 2.970499293333329849e+00 -7.691660000000000164e-02 5.902839900166669906e+01 2.678938321666669786e+00 -8.163760000000000461e-02 4.960764509333330352e+01 2.245417474999999996e+00 -8.638719999999999732e-02 4.414010876166670272e+01 2.032560301666670011e+00 -9.105969999999999342e-02 4.256424763833329905e+01 1.812761751666670085e+00 -9.572880000000000278e-02 3.308233848333330229e+01 1.638201501666670001e+00 -1.004865999999999954e-01 2.810971494833329842e+01 1.433384486666670066e+00 -1.052305999999999936e-01 2.588485028666670118e+01 1.331128581666670030e+00 -1.099790999999999963e-01 2.266535039333329848e+01 1.188278135000000013e+00 -1.148321999999999954e-01 2.068870146000000076e+01 1.081535063333330049e+00 -1.197666000000000008e-01 1.976825064833330003e+01 1.002416109999999971e+00 -1.247589999999999949e-01 1.708519936000000072e+01 9.212166283333329542e-01 -1.298257999999999912e-01 1.961539944500000132e+01 8.615532866666669731e-01 -1.348960999999999910e-01 1.509279464499999968e+01 8.002327049999999886e-01 -1.399122999999999895e-01 1.461401991333329953e+01 7.302237983333329518e-01 -1.450607999999999898e-01 1.234817605166669985e+01 6.862621599999999544e-01 -1.502527999999999919e-01 1.236984282499999921e+01 6.604921383333329787e-01 -1.555927000000000004e-01 1.196552256666669933e+01 5.966093183333329719e-01 -1.572660999999999920e-01 1.278021405166670021e+01 1.919547649999999994e-01 -1.609331999999999985e-01 1.153752966666669977e+01 5.736198133333330063e-01 -1.661730999999999903e-01 1.078861117833329963e+01 5.440816866666670082e-01 -1.706513000000000058e-01 1.087118622666669943e+01 1.601861350000000073e-01 -1.715465999999999935e-01 9.877732214999999982e+00 5.101304616666669789e-01 -1.771117000000000108e-01 1.016148657499999963e+01 4.860413033333330080e-01 -1.827158000000000115e-01 1.012859923499999937e+01 4.659961616666670192e-01 -1.842668000000000084e-01 9.892309961666670759e+00 1.394281016666669981e-01 -1.883010999999999990e-01 9.370592901666670471e+00 4.483600366666670167e-01 -1.939626999999999879e-01 7.953713988333330320e+00 4.220674716666670268e-01 -1.982673000000000074e-01 8.536490116666669792e+00 1.198682733333329975e-01 -1.997490000000000099e-01 8.016174306666670191e+00 3.972042266666669930e-01 -2.055633000000000044e-01 7.936747634999999690e+00 3.864501066666670148e-01 -2.114472000000000018e-01 7.092097319999999705e+00 3.613801233333330254e-01 -2.120387999999999995e-01 7.719984431666669700e+00 1.093860133333330042e-01 -2.161715999999999915e-01 7.279911723333330364e+00 4.614210216666669861e-01 -2.260118000000000127e-01 6.899103116666670310e+00 9.616077666666669743e-02 -2.398155999999999899e-01 6.131303501666669931e+00 8.927448999999999801e-02 -2.537425999999999848e-01 5.657937448333330011e+00 8.168489666666670090e-02 -2.676623000000000197e-01 5.142021448333330191e+00 7.478100833333330144e-02 -2.818223999999999729e-01 4.914665098333330207e+00 7.002304500000000598e-02 -2.956782000000000021e-01 4.446721935000000236e+00 6.572301166666670580e-02 -3.099446000000000145e-01 4.282954679999999570e+00 6.061547666666670248e-02 -3.241067000000000253e-01 3.767117071666670203e+00 5.800978500000000121e-02 -3.388467000000000007e-01 3.499952983333329826e+00 5.180699999999999888e-02 -3.539599999999999969e-01 3.303444670000000194e+00 5.069738166666670071e-02 -3.687568999999999986e-01 2.950319708333330126e+00 4.620904333333329672e-02 -3.840311000000000141e-01 2.864367984999999894e+00 4.422433499999999656e-02 -3.989493000000000067e-01 2.552979848333329915e+00 4.244176999999999672e-02 -4.107629999999999892e-01 2.431688859833330163e+00 4.295243233333329719e-02 -4.137051999999999952e-01 2.340746346666669808e+00 4.009275166666669693e-02 -4.291185000000000138e-01 2.236674611666670032e+00 3.708904500000000104e-02 -4.296455000000000135e-01 2.145105044333329936e+00 3.592934700000000037e-02 -4.446591999999999767e-01 1.951663006666670030e+00 3.589577499999999782e-02 -4.467690999999999746e-01 1.941018092166669984e+00 3.204738566666669869e-02 -4.603923999999999794e-01 1.841567858333329921e+00 3.340552499999999841e-02 -4.686460000000000070e-01 1.795296687500000044e+00 3.165418133333330192e-02 -4.765479000000000243e-01 1.725552725000000009e+00 3.166947999999999985e-02 -4.835137999999999936e-01 1.648896234833330032e+00 3.002704050000000111e-02 -4.923843999999999999e-01 1.592235150000000043e+00 3.142748499999999806e-02 -5.047722000000000042e-01 1.524318554666669989e+00 2.765916716666669967e-02 -5.083368000000000331e-01 1.470192684999999999e+00 2.879683666666670028e-02 -5.231871000000000160e-01 1.276008043333330066e+00 2.578494833333330044e-02 -5.249844000000000177e-01 1.335736669999999959e+00 2.682150333333329847e-02 -5.417480000000000073e-01 1.255200871666670048e+00 2.659473333333330081e-02 -5.445189000000000279e-01 1.181751707666669926e+00 2.602010650000000092e-02 -5.583793000000000228e-01 1.119981195000000040e+00 2.552491833333329907e-02 -5.613839000000000468e-01 1.109540133333329903e+00 2.376074416666670158e-02 -5.754704000000000486e-01 1.035568078333330089e+00 2.359670999999999991e-02 -5.835346000000000144e-01 1.009673415166669974e+00 2.350527950000000019e-02 -5.928168000000000326e-01 9.958746566666669686e-01 2.289775833333329916e-02 -6.007057000000000091e-01 9.162153768333329840e-01 2.224946400000000005e-02 -6.099849999999999994e-01 8.912180400000000446e-01 2.207391333333329902e-02 -6.219902999999999960e-01 8.127960751666669648e-01 2.151158183333330004e-02 -6.275817000000000201e-01 8.004247816666669735e-01 2.072389499999999912e-02 -6.413482000000000349e-01 7.426332359999999744e-01 1.925514349999999861e-02 -6.447992000000000168e-01 7.076525866666669717e-01 2.108122000000000121e-02 -6.656950000000000367e-01 6.442563610000000551e-01 1.837696600000000152e-02 -6.845196000000000058e-01 6.085390748333330269e-01 2.050695833333330068e-02 -7.059646000000000532e-01 5.280073378333329792e-01 1.732566899999999840e-02 -7.260278000000000009e-01 5.220653703333330009e-01 1.859470200000000115e-02 -7.492113999999999718e-01 4.598426163333330097e-01 1.525465250000000023e-02 -7.721772000000000080e-01 4.332637708333330062e-01 1.732895283333329983e-02 -7.922717999999999705e-01 4.105990393333330268e-01 1.523655316666669944e-02 -8.156877999999999629e-01 3.602943534999999975e-01 1.545041316666669919e-02 -8.366301000000000432e-01 3.406887861666669792e-01 1.473824349999999957e-02 -8.621258000000000532e-01 3.067601776666670221e-01 1.382606316666670082e-02 -8.848333999999999921e-01 3.015524316666670090e-01 1.454982116666670051e-02 -9.083444000000000518e-01 2.607474308333330160e-01 1.270642616666669937e-02 -9.336484000000000449e-01 2.588003018333330241e-01 1.373286349999999940e-02 -9.553916000000000075e-01 2.226530176666670080e-01 1.285228899999999938e-02 -9.815112999999999754e-01 2.127235584999999929e-01 1.205009299999999957e-02 -1.007027499999999964e+00 2.082924603333330127e-01 1.250585733333330063e-02 -1.030631400000000086e+00 1.912464838333330086e-01 1.185822249999999960e-02 -1.058015099999999986e+00 1.948314409999999941e-01 1.101004149999999966e-02 -1.084837700000000016e+00 1.896849941666670092e-01 1.137308499999999979e-02 -1.110144500000000090e+00 1.497566153333330097e-01 1.094208966666669960e-02 -1.137999800000000006e+00 1.454676966666670068e-01 1.051448583333330043e-02 +3.623980000000000257e-02 4.717095203250000282e+02 1.736400694499999986e+01 +4.068580000000000113e-02 2.786014172683330230e+02 1.198827076999999974e+01 +4.509610000000000007e-02 1.807710803516669955e+02 8.834240069999999889e+00 +4.957530000000000270e-02 1.404167299050000111e+02 7.187393765000000379e+00 +5.414490000000000275e-02 1.070548824566670021e+02 5.660295944999999662e+00 +5.866960000000000230e-02 9.429733434666670178e+01 4.914365443333330141e+00 +6.313130000000000130e-02 8.753748113499999306e+01 4.086659178333330367e+00 +6.771190000000000542e-02 8.007891920833330346e+01 3.441741584999999937e+00 +7.236470000000000402e-02 5.999202779333329971e+01 2.970499293333329849e+00 +7.691660000000000164e-02 5.902839900166669906e+01 2.678938321666669786e+00 +8.163760000000000461e-02 4.960764509333330352e+01 2.245417474999999996e+00 +8.638719999999999732e-02 4.414010876166670272e+01 2.032560301666670011e+00 +9.105969999999999342e-02 4.256424763833329905e+01 1.812761751666670085e+00 +9.572880000000000278e-02 3.308233848333330229e+01 1.638201501666670001e+00 +1.004865999999999954e-01 2.810971494833329842e+01 1.433384486666670066e+00 +1.052305999999999936e-01 2.588485028666670118e+01 1.331128581666670030e+00 +1.099790999999999963e-01 2.266535039333329848e+01 1.188278135000000013e+00 +1.148321999999999954e-01 2.068870146000000076e+01 1.081535063333330049e+00 +1.197666000000000008e-01 1.976825064833330003e+01 1.002416109999999971e+00 +1.247589999999999949e-01 1.708519936000000072e+01 9.212166283333329542e-01 +1.298257999999999912e-01 1.961539944500000132e+01 8.615532866666669731e-01 +1.348960999999999910e-01 1.509279464499999968e+01 8.002327049999999886e-01 +1.399122999999999895e-01 1.461401991333329953e+01 7.302237983333329518e-01 +1.450607999999999898e-01 1.234817605166669985e+01 6.862621599999999544e-01 +1.502527999999999919e-01 1.236984282499999921e+01 6.604921383333329787e-01 +1.555927000000000004e-01 1.196552256666669933e+01 5.966093183333329719e-01 +1.572660999999999920e-01 1.278021405166670021e+01 1.919547649999999994e-01 +1.609331999999999985e-01 1.153752966666669977e+01 5.736198133333330063e-01 +1.661730999999999903e-01 1.078861117833329963e+01 5.440816866666670082e-01 +1.706513000000000058e-01 1.087118622666669943e+01 1.601861350000000073e-01 +1.715465999999999935e-01 9.877732214999999982e+00 5.101304616666669789e-01 +1.771117000000000108e-01 1.016148657499999963e+01 4.860413033333330080e-01 +1.827158000000000115e-01 1.012859923499999937e+01 4.659961616666670192e-01 +1.842668000000000084e-01 9.892309961666670759e+00 1.394281016666669981e-01 +1.883010999999999990e-01 9.370592901666670471e+00 4.483600366666670167e-01 +1.939626999999999879e-01 7.953713988333330320e+00 4.220674716666670268e-01 +1.982673000000000074e-01 8.536490116666669792e+00 1.198682733333329975e-01 +1.997490000000000099e-01 8.016174306666670191e+00 3.972042266666669930e-01 +2.055633000000000044e-01 7.936747634999999690e+00 3.864501066666670148e-01 +2.114472000000000018e-01 7.092097319999999705e+00 3.613801233333330254e-01 +2.120387999999999995e-01 7.719984431666669700e+00 1.093860133333330042e-01 +2.161715999999999915e-01 7.279911723333330364e+00 4.614210216666669861e-01 +2.260118000000000127e-01 6.899103116666670310e+00 9.616077666666669743e-02 +2.398155999999999899e-01 6.131303501666669931e+00 8.927448999999999801e-02 +2.537425999999999848e-01 5.657937448333330011e+00 8.168489666666670090e-02 +2.676623000000000197e-01 5.142021448333330191e+00 7.478100833333330144e-02 +2.818223999999999729e-01 4.914665098333330207e+00 7.002304500000000598e-02 +2.956782000000000021e-01 4.446721935000000236e+00 6.572301166666670580e-02 +3.099446000000000145e-01 4.282954679999999570e+00 6.061547666666670248e-02 +3.241067000000000253e-01 3.767117071666670203e+00 5.800978500000000121e-02 +3.388467000000000007e-01 3.499952983333329826e+00 5.180699999999999888e-02 +3.539599999999999969e-01 3.303444670000000194e+00 5.069738166666670071e-02 +3.687568999999999986e-01 2.950319708333330126e+00 4.620904333333329672e-02 +3.840311000000000141e-01 2.864367984999999894e+00 4.422433499999999656e-02 +3.989493000000000067e-01 2.552979848333329915e+00 4.244176999999999672e-02 +4.107629999999999892e-01 2.431688859833330163e+00 4.295243233333329719e-02 +4.137051999999999952e-01 2.340746346666669808e+00 4.009275166666669693e-02 +4.291185000000000138e-01 2.236674611666670032e+00 3.708904500000000104e-02 +4.296455000000000135e-01 2.145105044333329936e+00 3.592934700000000037e-02 +4.446591999999999767e-01 1.951663006666670030e+00 3.589577499999999782e-02 +4.467690999999999746e-01 1.941018092166669984e+00 3.204738566666669869e-02 +4.603923999999999794e-01 1.841567858333329921e+00 3.340552499999999841e-02 +4.686460000000000070e-01 1.795296687500000044e+00 3.165418133333330192e-02 +4.765479000000000243e-01 1.725552725000000009e+00 3.166947999999999985e-02 +4.835137999999999936e-01 1.648896234833330032e+00 3.002704050000000111e-02 +4.923843999999999999e-01 1.592235150000000043e+00 3.142748499999999806e-02 +5.047722000000000042e-01 1.524318554666669989e+00 2.765916716666669967e-02 +5.083368000000000331e-01 1.470192684999999999e+00 2.879683666666670028e-02 +5.231871000000000160e-01 1.276008043333330066e+00 2.578494833333330044e-02 +5.249844000000000177e-01 1.335736669999999959e+00 2.682150333333329847e-02 +5.417480000000000073e-01 1.255200871666670048e+00 2.659473333333330081e-02 +5.445189000000000279e-01 1.181751707666669926e+00 2.602010650000000092e-02 +5.583793000000000228e-01 1.119981195000000040e+00 2.552491833333329907e-02 +5.613839000000000468e-01 1.109540133333329903e+00 2.376074416666670158e-02 +5.754704000000000486e-01 1.035568078333330089e+00 2.359670999999999991e-02 +5.835346000000000144e-01 1.009673415166669974e+00 2.350527950000000019e-02 +5.928168000000000326e-01 9.958746566666669686e-01 2.289775833333329916e-02 +6.007057000000000091e-01 9.162153768333329840e-01 2.224946400000000005e-02 +6.099849999999999994e-01 8.912180400000000446e-01 2.207391333333329902e-02 +6.219902999999999960e-01 8.127960751666669648e-01 2.151158183333330004e-02 +6.275817000000000201e-01 8.004247816666669735e-01 2.072389499999999912e-02 +6.413482000000000349e-01 7.426332359999999744e-01 1.925514349999999861e-02 +6.447992000000000168e-01 7.076525866666669717e-01 2.108122000000000121e-02 +6.656950000000000367e-01 6.442563610000000551e-01 1.837696600000000152e-02 +6.845196000000000058e-01 6.085390748333330269e-01 2.050695833333330068e-02 +7.059646000000000532e-01 5.280073378333329792e-01 1.732566899999999840e-02 +7.260278000000000009e-01 5.220653703333330009e-01 1.859470200000000115e-02 +7.492113999999999718e-01 4.598426163333330097e-01 1.525465250000000023e-02 +7.721772000000000080e-01 4.332637708333330062e-01 1.732895283333329983e-02 +7.922717999999999705e-01 4.105990393333330268e-01 1.523655316666669944e-02 +8.156877999999999629e-01 3.602943534999999975e-01 1.545041316666669919e-02 +8.366301000000000432e-01 3.406887861666669792e-01 1.473824349999999957e-02 +8.621258000000000532e-01 3.067601776666670221e-01 1.382606316666670082e-02 +8.848333999999999921e-01 3.015524316666670090e-01 1.454982116666670051e-02 +9.083444000000000518e-01 2.607474308333330160e-01 1.270642616666669937e-02 +9.336484000000000449e-01 2.588003018333330241e-01 1.373286349999999940e-02 +9.553916000000000075e-01 2.226530176666670080e-01 1.285228899999999938e-02 +9.815112999999999754e-01 2.127235584999999929e-01 1.205009299999999957e-02 +1.007027499999999964e+00 2.082924603333330127e-01 1.250585733333330063e-02 +1.030631400000000086e+00 1.912464838333330086e-01 1.185822249999999960e-02 +1.058015099999999986e+00 1.948314409999999941e-01 1.101004149999999966e-02 +1.084837700000000016e+00 1.896849941666670092e-01 1.137308499999999979e-02 +1.110144500000000090e+00 1.497566153333330097e-01 1.094208966666669960e-02 +1.137999800000000006e+00 1.454676966666670068e-01 1.051448583333330043e-02 1.166290800000000072e+00 1.467227160000000030e-01 1.029956333333329963e-02 \ No newline at end of file diff --git a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/3_35_1340_10.csv b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/3_35_1340_10.csv index 98341d530..5ef6a3266 100644 --- a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/3_35_1340_10.csv +++ b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/3_35_1340_10.csv @@ -1,105 +1,105 @@ -3.625239999999999713e-02 2.531792558183329902e+02 1.680830338499999854e+01 -4.070000000000000007e-02 1.901177223299999923e+02 1.173664666500000031e+01 -4.511180000000000051e-02 1.217924648083329942e+02 8.645296186666669769e+00 -4.959249999999999770e-02 1.094275780066670052e+02 7.073034475000000043e+00 -5.416379999999999806e-02 8.791320813333329909e+01 5.581711248333330211e+00 -5.868999999999999911e-02 8.309104453833330695e+01 4.860535583333329690e+00 -6.315320000000000655e-02 7.081360745666670198e+01 4.003961999999999577e+00 -6.773540000000000116e-02 6.343291181166669901e+01 3.355398363333330192e+00 -7.238989999999999314e-02 4.842191466166669755e+01 2.903796691666669982e+00 -7.694339999999999513e-02 4.694420552666669977e+01 2.605583116666669863e+00 -8.166600000000000248e-02 4.367521950333330238e+01 2.207077676666670207e+00 -8.641719999999999957e-02 3.957930205499999943e+01 1.999356729999999915e+00 -9.109140000000000292e-02 3.553857484166670133e+01 1.762052579999999979e+00 -9.576210000000000278e-02 2.783675838666669833e+01 1.597004463333330015e+00 -1.005216000000000026e-01 2.705964543666669897e+01 1.423240978333329965e+00 -1.052672000000000052e-01 2.262947438833329983e+01 1.302317253333330038e+00 -1.100174000000000013e-01 2.182584247666670052e+01 1.179366926666669979e+00 -1.148721999999999938e-01 2.121788853500000016e+01 1.084366495000000041e+00 -1.198083000000000065e-01 1.779511935000000022e+01 9.833421683333329888e-01 -1.248023999999999939e-01 1.651748253666670152e+01 9.145048883333329881e-01 -1.298709000000000113e-01 1.721928703000000027e+01 8.380137100000000228e-01 -1.349431000000000103e-01 1.436323046666669967e+01 7.917284633333330213e-01 -1.399610000000000021e-01 1.550343697666670018e+01 7.379972516666669646e-01 -1.451112999999999986e-01 1.303663926666670037e+01 6.920347900000000108e-01 -1.503050999999999970e-01 1.200503839166669984e+01 6.556345366666670449e-01 -1.556469000000000047e-01 1.229304255666670009e+01 5.989305183333329952e-01 -1.573070000000000024e-01 1.257057899666670053e+01 1.910309249999999903e-01 -1.609891999999999990e-01 1.193592632666669928e+01 5.769697900000000379e-01 -1.662309999999999899e-01 1.125234698666669964e+01 5.482133000000000145e-01 -1.706957000000000058e-01 1.058112505166669948e+01 1.590339783333329926e-01 -1.716062999999999894e-01 1.070644689999999954e+01 5.183003699999999547e-01 -1.771733000000000058e-01 9.479454351666669609e+00 4.778282466666670114e-01 -1.827794000000000085e-01 9.400985496666670826e+00 4.569814249999999967e-01 -1.843146999999999980e-01 9.549487438333329692e+00 1.380682866666670117e-01 -1.883665999999999952e-01 8.342261173333330504e+00 4.359566316666669827e-01 -1.940302000000000138e-01 8.124126898333329905e+00 4.232381216666670221e-01 -1.983187999999999895e-01 8.328415036666669380e+00 1.189532799999999946e-01 -1.998185000000000100e-01 8.328210934999999537e+00 3.999954083333330246e-01 -2.056348000000000065e-01 8.350671104999999983e+00 3.905236483333329733e-01 -2.115208000000000088e-01 6.929636241666670138e+00 3.588886250000000167e-01 -2.120939000000000019e-01 7.535892504999999630e+00 1.085254183333329986e-01 -2.162467999999999890e-01 7.407988318333329936e+00 4.625349066666670228e-01 -2.260705000000000076e-01 6.743451298333329902e+00 9.541167166666669752e-02 -2.398779000000000050e-01 6.099490819999999758e+00 8.899463999999999986e-02 -2.538084999999999924e-01 5.555039073333330357e+00 8.113394833333330280e-02 -2.677318000000000198e-01 5.152730110000000252e+00 7.469547999999999466e-02 -2.818956000000000239e-01 4.837557096666669665e+00 6.957829666666670576e-02 -2.957549999999999901e-01 4.369791838333330070e+00 6.527595833333330044e-02 -3.100250999999999979e-01 4.110463069999999774e+00 5.977720166666670304e-02 -3.241909000000000041e-01 3.813721606666669928e+00 5.811357666666670113e-02 -3.389346999999999777e-01 3.461479851666669827e+00 5.155417166666669687e-02 -3.540519999999999778e-01 3.230298750000000219e+00 5.028755499999999767e-02 -3.688526999999999778e-01 2.998165658333329819e+00 4.634052999999999783e-02 -3.841308999999999974e-01 2.784144708333330165e+00 4.378963833333329725e-02 -3.990528999999999882e-01 2.595613363333329815e+00 4.256657166666669850e-02 -4.108341999999999827e-01 2.335089765499999803e+00 4.258898366666669794e-02 -4.138126999999999778e-01 2.324415418333329875e+00 3.994880166666670007e-02 -4.292300000000000004e-01 2.216248561666669836e+00 3.693022666666669757e-02 -4.297198999999999880e-01 2.134554158666670087e+00 3.596130699999999791e-02 -4.447747000000000228e-01 1.890609146666669904e+00 3.555346833333330320e-02 -4.468464999999999798e-01 1.908117816499999897e+00 3.198120466666670020e-02 -4.605119999999999769e-01 1.871098863333330087e+00 3.348654166666670262e-02 -4.687272000000000105e-01 1.810652348333330108e+00 3.178039216666669886e-02 -4.766716999999999760e-01 1.698277889999999957e+00 3.148857166666670093e-02 -4.835976000000000163e-01 1.613169754500000108e+00 2.993151466666670035e-02 -4.925123000000000140e-01 1.548358499999999971e+00 3.116390166666669834e-02 -5.048597000000000223e-01 1.494630669833330039e+00 2.759253283333330115e-02 -5.084689000000000014e-01 1.491590500000000041e+00 2.885127333333329866e-02 -5.232776999999999568e-01 1.248566430833329965e+00 2.572220416666669979e-02 -5.251208000000000542e-01 1.383180581666670017e+00 2.700447666666670049e-02 -5.418887000000000009e-01 1.221960488333329931e+00 2.639246833333330072e-02 -5.446132999999999669e-01 1.208971178333329899e+00 2.618446533333329898e-02 -5.585244000000000320e-01 1.107120358333330001e+00 2.542247833333330029e-02 -5.614812000000000136e-01 1.085889866500000078e+00 2.370511449999999909e-02 -5.756198999999999621e-01 1.024119451666670066e+00 2.350574000000000066e-02 -5.836356999999999795e-01 9.666399098333330331e-01 2.336446566666669847e-02 -5.929708999999999675e-01 9.753983600000000198e-01 2.276144833333329856e-02 -6.008097999999999494e-01 8.857038164999999630e-01 2.215761016666669900e-02 -6.101434999999999498e-01 9.144217283333330171e-01 2.215592499999999992e-02 -6.220980999999999872e-01 8.054969749999999484e-01 2.151697083333330152e-02 -6.277447999999999917e-01 7.972735800000000372e-01 2.067797666666670170e-02 -6.414592999999999545e-01 7.033510668333330385e-01 1.912904316666669963e-02 -6.449667999999999513e-01 7.010848466666670387e-01 2.101707333333329916e-02 -6.658104000000000244e-01 6.363828563333330246e-01 1.837497983333330129e-02 -6.846381999999999746e-01 5.758642446666669690e-01 2.039069533333329881e-02 -7.060868999999999618e-01 5.109788090000000338e-01 1.728495966666670006e-02 -7.261535999999999547e-01 4.885223020000000194e-01 1.847847583333329935e-02 -7.493412999999999879e-01 4.387949984999999775e-01 1.519840233333329994e-02 -7.723109999999999697e-01 3.923397161666670185e-01 1.717436333333329998e-02 -7.924090999999999774e-01 3.993512075000000272e-01 1.521433699999999965e-02 -8.158290999999999737e-01 3.564691013333329828e-01 1.545670316666669999e-02 -8.367750000000000465e-01 3.230009236666669947e-01 1.469029500000000078e-02 -8.622752000000000194e-01 2.878051181666669844e-01 1.377513966666669976e-02 -8.849867000000000150e-01 2.848005155000000177e-01 1.450056933333329981e-02 -9.085018000000000260e-01 2.630901753333330095e-01 1.273161166666669959e-02 -9.338100999999999763e-01 2.556641304999999753e-01 1.373873700000000087e-02 -9.555571000000000481e-01 2.110106781666669928e-01 1.282516266666670034e-02 -9.816814000000000373e-01 1.989191335000000116e-01 1.201689483333330012e-02 -1.007201999999999931e+00 1.798726026666669919e-01 1.241756500000000020e-02 -1.030810000000000004e+00 1.697684260000000001e-01 1.179553216666670047e-02 -1.058198500000000042e+00 1.911874938333329998e-01 1.101163099999999916e-02 -1.085025700000000093e+00 1.546144220000000014e-01 1.126302133333329999e-02 -1.110336800000000013e+00 1.274498698333330071e-01 1.087918116666669946e-02 -1.138196999999999903e+00 1.312019681666669879e-01 1.048030450000000079e-02 +3.625239999999999713e-02 2.531792558183329902e+02 1.680830338499999854e+01 +4.070000000000000007e-02 1.901177223299999923e+02 1.173664666500000031e+01 +4.511180000000000051e-02 1.217924648083329942e+02 8.645296186666669769e+00 +4.959249999999999770e-02 1.094275780066670052e+02 7.073034475000000043e+00 +5.416379999999999806e-02 8.791320813333329909e+01 5.581711248333330211e+00 +5.868999999999999911e-02 8.309104453833330695e+01 4.860535583333329690e+00 +6.315320000000000655e-02 7.081360745666670198e+01 4.003961999999999577e+00 +6.773540000000000116e-02 6.343291181166669901e+01 3.355398363333330192e+00 +7.238989999999999314e-02 4.842191466166669755e+01 2.903796691666669982e+00 +7.694339999999999513e-02 4.694420552666669977e+01 2.605583116666669863e+00 +8.166600000000000248e-02 4.367521950333330238e+01 2.207077676666670207e+00 +8.641719999999999957e-02 3.957930205499999943e+01 1.999356729999999915e+00 +9.109140000000000292e-02 3.553857484166670133e+01 1.762052579999999979e+00 +9.576210000000000278e-02 2.783675838666669833e+01 1.597004463333330015e+00 +1.005216000000000026e-01 2.705964543666669897e+01 1.423240978333329965e+00 +1.052672000000000052e-01 2.262947438833329983e+01 1.302317253333330038e+00 +1.100174000000000013e-01 2.182584247666670052e+01 1.179366926666669979e+00 +1.148721999999999938e-01 2.121788853500000016e+01 1.084366495000000041e+00 +1.198083000000000065e-01 1.779511935000000022e+01 9.833421683333329888e-01 +1.248023999999999939e-01 1.651748253666670152e+01 9.145048883333329881e-01 +1.298709000000000113e-01 1.721928703000000027e+01 8.380137100000000228e-01 +1.349431000000000103e-01 1.436323046666669967e+01 7.917284633333330213e-01 +1.399610000000000021e-01 1.550343697666670018e+01 7.379972516666669646e-01 +1.451112999999999986e-01 1.303663926666670037e+01 6.920347900000000108e-01 +1.503050999999999970e-01 1.200503839166669984e+01 6.556345366666670449e-01 +1.556469000000000047e-01 1.229304255666670009e+01 5.989305183333329952e-01 +1.573070000000000024e-01 1.257057899666670053e+01 1.910309249999999903e-01 +1.609891999999999990e-01 1.193592632666669928e+01 5.769697900000000379e-01 +1.662309999999999899e-01 1.125234698666669964e+01 5.482133000000000145e-01 +1.706957000000000058e-01 1.058112505166669948e+01 1.590339783333329926e-01 +1.716062999999999894e-01 1.070644689999999954e+01 5.183003699999999547e-01 +1.771733000000000058e-01 9.479454351666669609e+00 4.778282466666670114e-01 +1.827794000000000085e-01 9.400985496666670826e+00 4.569814249999999967e-01 +1.843146999999999980e-01 9.549487438333329692e+00 1.380682866666670117e-01 +1.883665999999999952e-01 8.342261173333330504e+00 4.359566316666669827e-01 +1.940302000000000138e-01 8.124126898333329905e+00 4.232381216666670221e-01 +1.983187999999999895e-01 8.328415036666669380e+00 1.189532799999999946e-01 +1.998185000000000100e-01 8.328210934999999537e+00 3.999954083333330246e-01 +2.056348000000000065e-01 8.350671104999999983e+00 3.905236483333329733e-01 +2.115208000000000088e-01 6.929636241666670138e+00 3.588886250000000167e-01 +2.120939000000000019e-01 7.535892504999999630e+00 1.085254183333329986e-01 +2.162467999999999890e-01 7.407988318333329936e+00 4.625349066666670228e-01 +2.260705000000000076e-01 6.743451298333329902e+00 9.541167166666669752e-02 +2.398779000000000050e-01 6.099490819999999758e+00 8.899463999999999986e-02 +2.538084999999999924e-01 5.555039073333330357e+00 8.113394833333330280e-02 +2.677318000000000198e-01 5.152730110000000252e+00 7.469547999999999466e-02 +2.818956000000000239e-01 4.837557096666669665e+00 6.957829666666670576e-02 +2.957549999999999901e-01 4.369791838333330070e+00 6.527595833333330044e-02 +3.100250999999999979e-01 4.110463069999999774e+00 5.977720166666670304e-02 +3.241909000000000041e-01 3.813721606666669928e+00 5.811357666666670113e-02 +3.389346999999999777e-01 3.461479851666669827e+00 5.155417166666669687e-02 +3.540519999999999778e-01 3.230298750000000219e+00 5.028755499999999767e-02 +3.688526999999999778e-01 2.998165658333329819e+00 4.634052999999999783e-02 +3.841308999999999974e-01 2.784144708333330165e+00 4.378963833333329725e-02 +3.990528999999999882e-01 2.595613363333329815e+00 4.256657166666669850e-02 +4.108341999999999827e-01 2.335089765499999803e+00 4.258898366666669794e-02 +4.138126999999999778e-01 2.324415418333329875e+00 3.994880166666670007e-02 +4.292300000000000004e-01 2.216248561666669836e+00 3.693022666666669757e-02 +4.297198999999999880e-01 2.134554158666670087e+00 3.596130699999999791e-02 +4.447747000000000228e-01 1.890609146666669904e+00 3.555346833333330320e-02 +4.468464999999999798e-01 1.908117816499999897e+00 3.198120466666670020e-02 +4.605119999999999769e-01 1.871098863333330087e+00 3.348654166666670262e-02 +4.687272000000000105e-01 1.810652348333330108e+00 3.178039216666669886e-02 +4.766716999999999760e-01 1.698277889999999957e+00 3.148857166666670093e-02 +4.835976000000000163e-01 1.613169754500000108e+00 2.993151466666670035e-02 +4.925123000000000140e-01 1.548358499999999971e+00 3.116390166666669834e-02 +5.048597000000000223e-01 1.494630669833330039e+00 2.759253283333330115e-02 +5.084689000000000014e-01 1.491590500000000041e+00 2.885127333333329866e-02 +5.232776999999999568e-01 1.248566430833329965e+00 2.572220416666669979e-02 +5.251208000000000542e-01 1.383180581666670017e+00 2.700447666666670049e-02 +5.418887000000000009e-01 1.221960488333329931e+00 2.639246833333330072e-02 +5.446132999999999669e-01 1.208971178333329899e+00 2.618446533333329898e-02 +5.585244000000000320e-01 1.107120358333330001e+00 2.542247833333330029e-02 +5.614812000000000136e-01 1.085889866500000078e+00 2.370511449999999909e-02 +5.756198999999999621e-01 1.024119451666670066e+00 2.350574000000000066e-02 +5.836356999999999795e-01 9.666399098333330331e-01 2.336446566666669847e-02 +5.929708999999999675e-01 9.753983600000000198e-01 2.276144833333329856e-02 +6.008097999999999494e-01 8.857038164999999630e-01 2.215761016666669900e-02 +6.101434999999999498e-01 9.144217283333330171e-01 2.215592499999999992e-02 +6.220980999999999872e-01 8.054969749999999484e-01 2.151697083333330152e-02 +6.277447999999999917e-01 7.972735800000000372e-01 2.067797666666670170e-02 +6.414592999999999545e-01 7.033510668333330385e-01 1.912904316666669963e-02 +6.449667999999999513e-01 7.010848466666670387e-01 2.101707333333329916e-02 +6.658104000000000244e-01 6.363828563333330246e-01 1.837497983333330129e-02 +6.846381999999999746e-01 5.758642446666669690e-01 2.039069533333329881e-02 +7.060868999999999618e-01 5.109788090000000338e-01 1.728495966666670006e-02 +7.261535999999999547e-01 4.885223020000000194e-01 1.847847583333329935e-02 +7.493412999999999879e-01 4.387949984999999775e-01 1.519840233333329994e-02 +7.723109999999999697e-01 3.923397161666670185e-01 1.717436333333329998e-02 +7.924090999999999774e-01 3.993512075000000272e-01 1.521433699999999965e-02 +8.158290999999999737e-01 3.564691013333329828e-01 1.545670316666669999e-02 +8.367750000000000465e-01 3.230009236666669947e-01 1.469029500000000078e-02 +8.622752000000000194e-01 2.878051181666669844e-01 1.377513966666669976e-02 +8.849867000000000150e-01 2.848005155000000177e-01 1.450056933333329981e-02 +9.085018000000000260e-01 2.630901753333330095e-01 1.273161166666669959e-02 +9.338100999999999763e-01 2.556641304999999753e-01 1.373873700000000087e-02 +9.555571000000000481e-01 2.110106781666669928e-01 1.282516266666670034e-02 +9.816814000000000373e-01 1.989191335000000116e-01 1.201689483333330012e-02 +1.007201999999999931e+00 1.798726026666669919e-01 1.241756500000000020e-02 +1.030810000000000004e+00 1.697684260000000001e-01 1.179553216666670047e-02 +1.058198500000000042e+00 1.911874938333329998e-01 1.101163099999999916e-02 +1.085025700000000093e+00 1.546144220000000014e-01 1.126302133333329999e-02 +1.110336800000000013e+00 1.274498698333330071e-01 1.087918116666669946e-02 +1.138196999999999903e+00 1.312019681666669879e-01 1.048030450000000079e-02 1.166492899999999944e+00 1.202452754999999984e-01 1.022370933333329943e-02 \ No newline at end of file diff --git a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/4_50_1340_10.csv b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/4_50_1340_10.csv index 2dcce686f..51227d3b8 100644 --- a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/4_50_1340_10.csv +++ b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/4_50_1340_10.csv @@ -1,105 +1,105 @@ -3.624299999999999744e-02 2.421839941750000094e+02 1.681259771499999900e+01 -4.068929999999999769e-02 1.253477160583330061e+02 1.158261931833330038e+01 -4.510000000000000120e-02 1.038159109083329952e+02 8.606540843333329249e+00 -4.957960000000000145e-02 9.508877155000000414e+01 7.037626288333330038e+00 -5.414959999999999912e-02 7.142443308833330207e+01 5.530319266666669620e+00 -5.867460000000000037e-02 6.747951957166669956e+01 4.803320423333330424e+00 -6.313670000000000393e-02 6.491403129500000091e+01 3.984481885000000112e+00 -6.771770000000000567e-02 5.688806046833330043e+01 3.329560004999999823e+00 -7.237100000000000477e-02 4.031379161166670144e+01 2.864987329999999943e+00 -7.692330000000000001e-02 4.363721252500000247e+01 2.591659659999999921e+00 -8.164470000000000061e-02 3.499940050499999700e+01 2.159604903333330217e+00 -8.639470000000000482e-02 3.331168452000000002e+01 1.961486934999999932e+00 -9.106759999999999855e-02 3.141853618500000067e+01 1.737193953333330043e+00 -9.573710000000000553e-02 2.514925802833329982e+01 1.580249494999999893e+00 -1.004952999999999957e-01 2.418445705499999931e+01 1.404480071666670105e+00 -1.052397000000000055e-01 2.311071394833329862e+01 1.309208076666670051e+00 -1.099886000000000058e-01 2.234431306333329914e+01 1.186371084999999992e+00 -1.148422000000000054e-01 2.015011891333330141e+01 1.077548355000000013e+00 -1.197769999999999946e-01 1.762490517499999854e+01 9.840672733333329925e-01 -1.247698000000000002e-01 1.703488854000000075e+01 9.213895800000000413e-01 -1.298370000000000080e-01 1.644401272166669870e+01 8.327218266666670532e-01 -1.349077999999999944e-01 1.614025673666670002e+01 8.110203433333329492e-01 -1.399244000000000043e-01 1.432045983666669997e+01 7.277294366666670067e-01 -1.450733999999999913e-01 1.348007003166670081e+01 6.981156733333330200e-01 -1.502658000000000049e-01 1.217057146500000009e+01 6.589065133333330548e-01 -1.556062000000000001e-01 1.311354035333330081e+01 6.087518283333329672e-01 -1.573412999999999895e-01 1.262766263333329952e+01 1.918068450000000036e-01 -1.609471000000000096e-01 1.195521582166669994e+01 5.786270049999999721e-01 -1.661874999999999880e-01 1.070419187999999977e+01 5.435432616666669992e-01 -1.707328999999999930e-01 1.060603477499999947e+01 1.596232366666670011e-01 -1.715615000000000057e-01 1.106375028666669991e+01 5.234683166666670440e-01 -1.771270000000000067e-01 9.097135046666670277e+00 4.748174949999999783e-01 -1.827315999999999940e-01 9.232441778333329907e+00 4.562185283333329844e-01 -1.843548999999999882e-01 9.582483613333330652e+00 1.386399050000000077e-01 -1.883173999999999959e-01 9.681451038333330317e+00 4.521609416666669823e-01 -1.939794999999999991e-01 8.227612430000000643e+00 4.254379616666669750e-01 -1.983621000000000134e-01 8.295318078333329126e+00 1.192443799999999970e-01 -1.997663000000000078e-01 8.131970284999999521e+00 3.988034016666670012e-01 -2.055810999999999888e-01 7.142658796666670362e+00 3.773835349999999922e-01 -2.114655000000000007e-01 7.164933761666669731e+00 3.624743966666669759e-01 -2.121402000000000010e-01 7.387669431666670228e+00 1.083523799999999981e-01 -2.161903000000000019e-01 6.864321103333329788e+00 4.553583783333329804e-01 -2.261198000000000097e-01 6.847039901666669870e+00 9.614554833333330275e-02 -2.399302000000000101e-01 6.151464958333329847e+00 8.952354166666670610e-02 -2.538638999999999757e-01 5.563245829999999614e+00 8.146051666666670465e-02 -2.677901999999999783e-01 5.162996156666669556e+00 7.501275500000000040e-02 -2.819571000000000160e-01 4.731078383333329640e+00 6.938886333333330048e-02 -2.958196000000000159e-01 4.470382223333330352e+00 6.595420000000000449e-02 -3.100928000000000018e-01 4.071269568333329758e+00 5.983178000000000107e-02 -3.242616999999999861e-01 3.818289136666670025e+00 5.835058500000000342e-02 -3.390086999999999962e-01 3.464278166666669989e+00 5.175618166666669934e-02 -3.541291999999999773e-01 3.297458013333330218e+00 5.076983000000000190e-02 -3.689332000000000167e-01 3.070901008333330129e+00 4.683460500000000137e-02 -3.842147000000000201e-01 2.769801061666670172e+00 4.388707166666670073e-02 -3.991399999999999948e-01 2.510583560000000158e+00 4.232430333333329908e-02 -4.106022999999999756e-01 2.374815773499999949e+00 4.286182233333329927e-02 -4.139030000000000209e-01 2.373871081666670158e+00 4.032223833333330176e-02 -4.293236999999999748e-01 2.231085370000000179e+00 3.713437166666670036e-02 -4.294773000000000063e-01 2.156539414333329852e+00 3.612328016666670194e-02 -4.448717999999999839e-01 1.876962131666670031e+00 3.561285166666670193e-02 -4.465942999999999996e-01 1.963582529333329996e+00 3.226501116666669750e-02 -4.606124999999999803e-01 1.886281606666670108e+00 3.367513833333329876e-02 -4.684626000000000068e-01 1.795604685000000034e+00 3.177854483333329705e-02 -4.767757000000000245e-01 1.729912848333329922e+00 3.174894833333329752e-02 -4.833245999999999931e-01 1.643333701666670033e+00 3.012282700000000132e-02 -4.926197999999999966e-01 1.601281793333330095e+00 3.152871666666669931e-02 -5.045747000000000426e-01 1.513868059666670041e+00 2.772222300000000070e-02 -5.085798000000000263e-01 1.480025179999999940e+00 2.889593166666670071e-02 -5.229823000000000111e-01 1.292098316666669966e+00 2.594417883333329997e-02 -5.252354000000000189e-01 1.389690103333329985e+00 2.712855999999999948e-02 -5.420070000000000165e-01 1.207626951666670001e+00 2.641061333333330138e-02 -5.443057999999999508e-01 1.171074812333330106e+00 2.606778300000000062e-02 -5.586463000000000401e-01 1.131968480000000055e+00 2.562754666666669859e-02 -5.611642999999999493e-01 1.119771183833329964e+00 2.388942000000000149e-02 -5.757455000000000211e-01 1.050324178333329916e+00 2.370775166666670014e-02 -5.833063000000000553e-01 9.890430198333329814e-01 2.349970633333330061e-02 -5.931003000000000247e-01 9.529422783333330038e-01 2.272385333333330065e-02 -6.004707000000000239e-01 9.087951714999999986e-01 2.229426183333330092e-02 -6.102765999999999469e-01 8.968441200000000224e-01 2.213925333333329956e-02 -6.217470000000000496e-01 8.116193323333330545e-01 2.157820200000000119e-02 -6.278818000000000454e-01 7.745292049999999984e-01 2.063141833333330052e-02 -6.410972000000000337e-01 7.304547335000000086e-01 1.926881999999999900e-02 -6.451074999999999449e-01 7.030634049999999746e-01 2.109099333333330079e-02 -6.654345000000000399e-01 6.451808323333330097e-01 1.843812350000000044e-02 -6.842517000000000182e-01 5.969281796666670026e-01 2.051784966666669874e-02 -7.056883000000000461e-01 4.875458616666670242e-01 1.721726566666669997e-02 -7.257436999999999916e-01 5.206052460000000215e-01 1.864389433333329960e-02 -7.489183000000000368e-01 4.716855048333329914e-01 1.534349166666670004e-02 -7.718749999999999778e-01 3.996116843333329949e-01 1.723059933333330115e-02 -7.919618000000000491e-01 3.949704010000000265e-01 1.521841983333330033e-02 -8.153685999999999989e-01 3.711572033333330189e-01 1.553813883333329988e-02 -8.363026999999999544e-01 3.373120053333329982e-01 1.476541233333330053e-02 -8.617884000000000100e-01 3.012111169999999727e-01 1.384248800000000001e-02 -8.844872000000000289e-01 3.093801609999999869e-01 1.462152149999999991e-02 -9.079890000000000461e-01 2.725293346666670113e-01 1.278188633333329945e-02 -9.332829999999999737e-01 2.562172424999999976e-01 1.375849099999999943e-02 -9.550178000000000278e-01 2.195073688333329942e-01 1.287299783333330054e-02 -9.811271999999999771e-01 1.993873673333330099e-01 1.203331399999999982e-02 -1.006633399999999900e+00 1.965978770000000042e-01 1.249421516666670076e-02 -1.030228200000000038e+00 1.888581198333330047e-01 1.187900783333330039e-02 -1.057601100000000072e+00 2.019180355000000093e-01 1.106158266666669963e-02 -1.084413199999999966e+00 1.710308969999999873e-01 1.133507299999999933e-02 -1.109710100000000033e+00 1.385269876666669897e-01 1.092970799999999978e-02 -1.137554500000000024e+00 1.323425321666669985e-01 1.049619949999999920e-02 +3.624299999999999744e-02 2.421839941750000094e+02 1.681259771499999900e+01 +4.068929999999999769e-02 1.253477160583330061e+02 1.158261931833330038e+01 +4.510000000000000120e-02 1.038159109083329952e+02 8.606540843333329249e+00 +4.957960000000000145e-02 9.508877155000000414e+01 7.037626288333330038e+00 +5.414959999999999912e-02 7.142443308833330207e+01 5.530319266666669620e+00 +5.867460000000000037e-02 6.747951957166669956e+01 4.803320423333330424e+00 +6.313670000000000393e-02 6.491403129500000091e+01 3.984481885000000112e+00 +6.771770000000000567e-02 5.688806046833330043e+01 3.329560004999999823e+00 +7.237100000000000477e-02 4.031379161166670144e+01 2.864987329999999943e+00 +7.692330000000000001e-02 4.363721252500000247e+01 2.591659659999999921e+00 +8.164470000000000061e-02 3.499940050499999700e+01 2.159604903333330217e+00 +8.639470000000000482e-02 3.331168452000000002e+01 1.961486934999999932e+00 +9.106759999999999855e-02 3.141853618500000067e+01 1.737193953333330043e+00 +9.573710000000000553e-02 2.514925802833329982e+01 1.580249494999999893e+00 +1.004952999999999957e-01 2.418445705499999931e+01 1.404480071666670105e+00 +1.052397000000000055e-01 2.311071394833329862e+01 1.309208076666670051e+00 +1.099886000000000058e-01 2.234431306333329914e+01 1.186371084999999992e+00 +1.148422000000000054e-01 2.015011891333330141e+01 1.077548355000000013e+00 +1.197769999999999946e-01 1.762490517499999854e+01 9.840672733333329925e-01 +1.247698000000000002e-01 1.703488854000000075e+01 9.213895800000000413e-01 +1.298370000000000080e-01 1.644401272166669870e+01 8.327218266666670532e-01 +1.349077999999999944e-01 1.614025673666670002e+01 8.110203433333329492e-01 +1.399244000000000043e-01 1.432045983666669997e+01 7.277294366666670067e-01 +1.450733999999999913e-01 1.348007003166670081e+01 6.981156733333330200e-01 +1.502658000000000049e-01 1.217057146500000009e+01 6.589065133333330548e-01 +1.556062000000000001e-01 1.311354035333330081e+01 6.087518283333329672e-01 +1.573412999999999895e-01 1.262766263333329952e+01 1.918068450000000036e-01 +1.609471000000000096e-01 1.195521582166669994e+01 5.786270049999999721e-01 +1.661874999999999880e-01 1.070419187999999977e+01 5.435432616666669992e-01 +1.707328999999999930e-01 1.060603477499999947e+01 1.596232366666670011e-01 +1.715615000000000057e-01 1.106375028666669991e+01 5.234683166666670440e-01 +1.771270000000000067e-01 9.097135046666670277e+00 4.748174949999999783e-01 +1.827315999999999940e-01 9.232441778333329907e+00 4.562185283333329844e-01 +1.843548999999999882e-01 9.582483613333330652e+00 1.386399050000000077e-01 +1.883173999999999959e-01 9.681451038333330317e+00 4.521609416666669823e-01 +1.939794999999999991e-01 8.227612430000000643e+00 4.254379616666669750e-01 +1.983621000000000134e-01 8.295318078333329126e+00 1.192443799999999970e-01 +1.997663000000000078e-01 8.131970284999999521e+00 3.988034016666670012e-01 +2.055810999999999888e-01 7.142658796666670362e+00 3.773835349999999922e-01 +2.114655000000000007e-01 7.164933761666669731e+00 3.624743966666669759e-01 +2.121402000000000010e-01 7.387669431666670228e+00 1.083523799999999981e-01 +2.161903000000000019e-01 6.864321103333329788e+00 4.553583783333329804e-01 +2.261198000000000097e-01 6.847039901666669870e+00 9.614554833333330275e-02 +2.399302000000000101e-01 6.151464958333329847e+00 8.952354166666670610e-02 +2.538638999999999757e-01 5.563245829999999614e+00 8.146051666666670465e-02 +2.677901999999999783e-01 5.162996156666669556e+00 7.501275500000000040e-02 +2.819571000000000160e-01 4.731078383333329640e+00 6.938886333333330048e-02 +2.958196000000000159e-01 4.470382223333330352e+00 6.595420000000000449e-02 +3.100928000000000018e-01 4.071269568333329758e+00 5.983178000000000107e-02 +3.242616999999999861e-01 3.818289136666670025e+00 5.835058500000000342e-02 +3.390086999999999962e-01 3.464278166666669989e+00 5.175618166666669934e-02 +3.541291999999999773e-01 3.297458013333330218e+00 5.076983000000000190e-02 +3.689332000000000167e-01 3.070901008333330129e+00 4.683460500000000137e-02 +3.842147000000000201e-01 2.769801061666670172e+00 4.388707166666670073e-02 +3.991399999999999948e-01 2.510583560000000158e+00 4.232430333333329908e-02 +4.106022999999999756e-01 2.374815773499999949e+00 4.286182233333329927e-02 +4.139030000000000209e-01 2.373871081666670158e+00 4.032223833333330176e-02 +4.293236999999999748e-01 2.231085370000000179e+00 3.713437166666670036e-02 +4.294773000000000063e-01 2.156539414333329852e+00 3.612328016666670194e-02 +4.448717999999999839e-01 1.876962131666670031e+00 3.561285166666670193e-02 +4.465942999999999996e-01 1.963582529333329996e+00 3.226501116666669750e-02 +4.606124999999999803e-01 1.886281606666670108e+00 3.367513833333329876e-02 +4.684626000000000068e-01 1.795604685000000034e+00 3.177854483333329705e-02 +4.767757000000000245e-01 1.729912848333329922e+00 3.174894833333329752e-02 +4.833245999999999931e-01 1.643333701666670033e+00 3.012282700000000132e-02 +4.926197999999999966e-01 1.601281793333330095e+00 3.152871666666669931e-02 +5.045747000000000426e-01 1.513868059666670041e+00 2.772222300000000070e-02 +5.085798000000000263e-01 1.480025179999999940e+00 2.889593166666670071e-02 +5.229823000000000111e-01 1.292098316666669966e+00 2.594417883333329997e-02 +5.252354000000000189e-01 1.389690103333329985e+00 2.712855999999999948e-02 +5.420070000000000165e-01 1.207626951666670001e+00 2.641061333333330138e-02 +5.443057999999999508e-01 1.171074812333330106e+00 2.606778300000000062e-02 +5.586463000000000401e-01 1.131968480000000055e+00 2.562754666666669859e-02 +5.611642999999999493e-01 1.119771183833329964e+00 2.388942000000000149e-02 +5.757455000000000211e-01 1.050324178333329916e+00 2.370775166666670014e-02 +5.833063000000000553e-01 9.890430198333329814e-01 2.349970633333330061e-02 +5.931003000000000247e-01 9.529422783333330038e-01 2.272385333333330065e-02 +6.004707000000000239e-01 9.087951714999999986e-01 2.229426183333330092e-02 +6.102765999999999469e-01 8.968441200000000224e-01 2.213925333333329956e-02 +6.217470000000000496e-01 8.116193323333330545e-01 2.157820200000000119e-02 +6.278818000000000454e-01 7.745292049999999984e-01 2.063141833333330052e-02 +6.410972000000000337e-01 7.304547335000000086e-01 1.926881999999999900e-02 +6.451074999999999449e-01 7.030634049999999746e-01 2.109099333333330079e-02 +6.654345000000000399e-01 6.451808323333330097e-01 1.843812350000000044e-02 +6.842517000000000182e-01 5.969281796666670026e-01 2.051784966666669874e-02 +7.056883000000000461e-01 4.875458616666670242e-01 1.721726566666669997e-02 +7.257436999999999916e-01 5.206052460000000215e-01 1.864389433333329960e-02 +7.489183000000000368e-01 4.716855048333329914e-01 1.534349166666670004e-02 +7.718749999999999778e-01 3.996116843333329949e-01 1.723059933333330115e-02 +7.919618000000000491e-01 3.949704010000000265e-01 1.521841983333330033e-02 +8.153685999999999989e-01 3.711572033333330189e-01 1.553813883333329988e-02 +8.363026999999999544e-01 3.373120053333329982e-01 1.476541233333330053e-02 +8.617884000000000100e-01 3.012111169999999727e-01 1.384248800000000001e-02 +8.844872000000000289e-01 3.093801609999999869e-01 1.462152149999999991e-02 +9.079890000000000461e-01 2.725293346666670113e-01 1.278188633333329945e-02 +9.332829999999999737e-01 2.562172424999999976e-01 1.375849099999999943e-02 +9.550178000000000278e-01 2.195073688333329942e-01 1.287299783333330054e-02 +9.811271999999999771e-01 1.993873673333330099e-01 1.203331399999999982e-02 +1.006633399999999900e+00 1.965978770000000042e-01 1.249421516666670076e-02 +1.030228200000000038e+00 1.888581198333330047e-01 1.187900783333330039e-02 +1.057601100000000072e+00 2.019180355000000093e-01 1.106158266666669963e-02 +1.084413199999999966e+00 1.710308969999999873e-01 1.133507299999999933e-02 +1.109710100000000033e+00 1.385269876666669897e-01 1.092970799999999978e-02 +1.137554500000000024e+00 1.323425321666669985e-01 1.049619949999999920e-02 1.165834400000000048e+00 1.352444690000000060e-01 1.028587266666670073e-02 \ No newline at end of file diff --git a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/5_75_1340_10.csv b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/5_75_1340_10.csv index 8ef596703..e4a5c8ff1 100644 --- a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/5_75_1340_10.csv +++ b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/5_75_1340_10.csv @@ -1,105 +1,105 @@ -3.623830000000000107e-02 1.262534512933330006e+02 1.649893105666669868e+01 -4.068399999999999794e-02 1.096408472683330046e+02 1.152156481833329948e+01 -4.509420000000000095e-02 6.843298548666669490e+01 8.484508865000000455e+00 -4.957310000000000189e-02 5.337196919333329959e+01 6.882409771666670117e+00 -5.414259999999999906e-02 4.824018401499999698e+01 5.433445991666670416e+00 -5.866699999999999693e-02 4.665372951666670076e+01 4.705492196666670068e+00 -6.312850000000000406e-02 5.221271013999999866e+01 3.917987768333329957e+00 -6.770890000000000242e-02 4.827582027833329903e+01 3.280544881666669799e+00 -7.236159999999999815e-02 3.618855914666669804e+01 2.837183351666670017e+00 -7.691330000000000389e-02 3.079150051333330040e+01 2.510836073333329921e+00 -8.163410000000000111e-02 3.296728457500000076e+01 2.143401925000000041e+00 -8.638339999999999907e-02 3.069841431000000043e+01 1.940150145000000048e+00 -9.105580000000000618e-02 2.710592771666669876e+01 1.703459686666670025e+00 -9.572469999999999590e-02 2.329590637833329936e+01 1.563327263333329942e+00 -1.004822999999999966e-01 2.091072460333329985e+01 1.376591528333330094e+00 -1.052260000000000001e-01 1.912562908333330114e+01 1.273402691666670083e+00 -1.099742999999999971e-01 1.787115249333330169e+01 1.146192773333329917e+00 -1.148272999999999933e-01 1.794118791666669921e+01 1.055988855000000060e+00 -1.197614000000000040e-01 1.653599519333329937e+01 9.723875616666669552e-01 -1.247536000000000062e-01 1.582743532666670028e+01 9.084356083333330334e-01 -1.298200999999999938e-01 1.478155951166669979e+01 8.152435350000000192e-01 -1.348902999999999908e-01 1.334408521333329922e+01 7.818770066666670404e-01 -1.399062000000000083e-01 1.377281605666670039e+01 7.205883533333330426e-01 -1.450545000000000029e-01 1.181691977333330001e+01 6.799812333333330461e-01 -1.502462999999999993e-01 1.213584320000000005e+01 6.572146300000000219e-01 -1.555860000000000021e-01 1.192358865166669979e+01 5.953690533333330093e-01 -1.572933999999999999e-01 1.181612013833330010e+01 1.889312700000000123e-01 -1.609261999999999915e-01 1.175466066000000076e+01 5.752044899999999572e-01 -1.661659000000000053e-01 1.042143580833329963e+01 5.392668716666669804e-01 -1.706808999999999965e-01 1.011778497999999971e+01 1.577585016666669948e-01 -1.715392000000000028e-01 9.758357795000000223e+00 5.081139666666669719e-01 -1.771040000000000114e-01 8.903400566666670457e+00 4.716962699999999731e-01 -1.827079000000000064e-01 9.178007346666669619e+00 4.546196783333329994e-01 -1.842987000000000097e-01 9.009516103333330861e+00 1.364224366666670074e-01 -1.882929000000000130e-01 8.406366826666669567e+00 4.368516150000000264e-01 -1.939542999999999962e-01 7.892936534999999587e+00 4.208100816666670019e-01 -1.983015999999999945e-01 7.968528981666669786e+00 1.178380566666669960e-01 -1.997403000000000095e-01 7.734987613333330181e+00 3.934730833333329736e-01 -2.055543999999999982e-01 7.979108915000000302e+00 3.863922049999999886e-01 -2.114380999999999899e-01 6.834691483333330098e+00 3.579354766666669740e-01 -2.120755000000000001e-01 7.473622876666669690e+00 1.084324933333330049e-01 -2.161621999999999988e-01 6.843431601666670083e+00 4.540542233333330069e-01 -2.260508999999999991e-01 6.624537448333329692e+00 9.508442500000000019e-02 -2.398570999999999898e-01 6.030806045000000282e+00 8.883706333333329930e-02 -2.537865999999999733e-01 5.548485336666669987e+00 8.121552666666670417e-02 -2.677086000000000188e-01 5.056279183333329819e+00 7.439664999999999473e-02 -2.818711999999999884e-01 4.746517688333329765e+00 6.929181333333329917e-02 -2.957293999999999756e-01 4.360488485000000303e+00 6.532353000000000465e-02 -3.099983000000000044e-01 4.042259101666670240e+00 5.956615500000000257e-02 -3.241628999999999761e-01 3.667612291666670021e+00 5.754424666666670130e-02 -3.389054000000000233e-01 3.392261260000000167e+00 5.132888666666669819e-02 -3.540212999999999832e-01 3.153369070000000107e+00 5.001504333333330055e-02 -3.688208000000000042e-01 2.957433689999999782e+00 4.622241666666670329e-02 -3.840975999999999835e-01 2.782086464999999897e+00 4.383930500000000202e-02 -3.990183999999999953e-01 2.497954614999999823e+00 4.216718166666669904e-02 -4.106379000000000001e-01 2.347253106833329994e+00 4.254085666666670290e-02 -4.137768000000000002e-01 2.313526113333329803e+00 3.995030166666670157e-02 -4.291927999999999854e-01 2.205677500000000180e+00 3.693004333333330114e-02 -4.295145000000000213e-01 2.125140473833329935e+00 3.583346700000000079e-02 -4.447362000000000259e-01 1.900926653333329996e+00 3.564656666666669860e-02 -4.466328999999999994e-01 1.939722618500000051e+00 3.202840516666669718e-02 -4.604721999999999982e-01 1.890633683333329929e+00 3.361991000000000285e-02 -4.685032000000000085e-01 1.753475375666670111e+00 3.146806816666670309e-02 -4.766304000000000096e-01 1.692544018333330014e+00 3.150160500000000197e-02 -4.833663999999999739e-01 1.571138671166669942e+00 2.967553150000000126e-02 -4.924697000000000102e-01 1.562743266666670072e+00 3.127265833333330025e-02 -5.046184000000000225e-01 1.517538195333330009e+00 2.762060549999999920e-02 -5.084248000000000101e-01 1.452519751666669912e+00 2.870172666666670133e-02 -5.230276000000000369e-01 1.280607860833330003e+00 2.579378549999999937e-02 -5.250753000000000226e-01 1.364635400000000054e+00 2.694985833333329861e-02 -5.418418000000000401e-01 1.180339848333330055e+00 2.622176999999999841e-02 -5.443529999999999758e-01 1.172893769833329936e+00 2.597214383333330129e-02 -5.584759999999999724e-01 1.116791568333330043e+00 2.550004666666669945e-02 -5.612129000000000145e-01 1.071752901666670033e+00 2.359418099999999879e-02 -5.755700000000000260e-01 1.003165499999999932e+00 2.343291166666670172e-02 -5.833568000000000087e-01 9.490407108333329678e-01 2.324037416666669895e-02 -5.929195000000000437e-01 9.286979850000000036e-01 2.255620333333329883e-02 -6.005226999999999649e-01 8.938147573333330431e-01 2.214501316666669939e-02 -6.100906000000000384e-01 8.779068549999999860e-01 2.199904499999999832e-02 -6.218008000000000424e-01 8.078191183333329750e-01 2.148254866666670163e-02 -6.276903999999999817e-01 7.890844949999999969e-01 2.066168499999999908e-02 -6.411527999999999672e-01 6.990414535000000207e-01 1.907308200000000162e-02 -6.449108999999999536e-01 7.027759316666669642e-01 2.104888333333329933e-02 -6.654921999999999782e-01 6.693195063333330364e-01 1.846815400000000051e-02 -6.843110000000000026e-01 5.654079498333329790e-01 2.030432683333329921e-02 -7.057493999999999712e-01 4.733216641666669888e-01 1.710506283333329894e-02 -7.258065000000000211e-01 4.881572298333329840e-01 1.844279849999999957e-02 -7.489831000000000127e-01 4.439720878333329734e-01 1.519038399999999948e-02 -7.719418000000000113e-01 4.063687451666669892e-01 1.720554133333329974e-02 -7.920304000000000233e-01 4.025809184999999957e-01 1.519988700000000047e-02 -8.154392000000000307e-01 3.522328571666670238e-01 1.541253149999999988e-02 -8.363751000000000380e-01 3.005755748333330257e-01 1.457862766666669953e-02 -8.618630000000000457e-01 2.801856756666670223e-01 1.372444566666669932e-02 -8.845638000000000112e-01 3.046253318333330129e-01 1.455751649999999925e-02 -9.080675999999999748e-01 2.540008221666669730e-01 1.267830250000000041e-02 -9.333637999999999657e-01 2.481020686666670083e-01 1.368678783333330054e-02 -9.551005000000000189e-01 1.938199579999999866e-01 1.274076333333330063e-02 -9.812121999999999788e-01 1.905731619999999904e-01 1.196892649999999926e-02 -1.006720599999999965e+00 1.784818836666670072e-01 1.239337400000000040e-02 -1.030317399999999939e+00 1.750911911666669929e-01 1.179671083333330012e-02 -1.057692700000000041e+00 1.705610396666669970e-01 1.092493383333329945e-02 -1.084507099999999946e+00 1.719191243333330066e-01 1.130716749999999965e-02 -1.109806099999999907e+00 1.366376699999999889e-01 1.089438483333329995e-02 -1.137653000000000025e+00 1.239800338333330032e-01 1.044124700000000072e-02 +3.623830000000000107e-02 1.262534512933330006e+02 1.649893105666669868e+01 +4.068399999999999794e-02 1.096408472683330046e+02 1.152156481833329948e+01 +4.509420000000000095e-02 6.843298548666669490e+01 8.484508865000000455e+00 +4.957310000000000189e-02 5.337196919333329959e+01 6.882409771666670117e+00 +5.414259999999999906e-02 4.824018401499999698e+01 5.433445991666670416e+00 +5.866699999999999693e-02 4.665372951666670076e+01 4.705492196666670068e+00 +6.312850000000000406e-02 5.221271013999999866e+01 3.917987768333329957e+00 +6.770890000000000242e-02 4.827582027833329903e+01 3.280544881666669799e+00 +7.236159999999999815e-02 3.618855914666669804e+01 2.837183351666670017e+00 +7.691330000000000389e-02 3.079150051333330040e+01 2.510836073333329921e+00 +8.163410000000000111e-02 3.296728457500000076e+01 2.143401925000000041e+00 +8.638339999999999907e-02 3.069841431000000043e+01 1.940150145000000048e+00 +9.105580000000000618e-02 2.710592771666669876e+01 1.703459686666670025e+00 +9.572469999999999590e-02 2.329590637833329936e+01 1.563327263333329942e+00 +1.004822999999999966e-01 2.091072460333329985e+01 1.376591528333330094e+00 +1.052260000000000001e-01 1.912562908333330114e+01 1.273402691666670083e+00 +1.099742999999999971e-01 1.787115249333330169e+01 1.146192773333329917e+00 +1.148272999999999933e-01 1.794118791666669921e+01 1.055988855000000060e+00 +1.197614000000000040e-01 1.653599519333329937e+01 9.723875616666669552e-01 +1.247536000000000062e-01 1.582743532666670028e+01 9.084356083333330334e-01 +1.298200999999999938e-01 1.478155951166669979e+01 8.152435350000000192e-01 +1.348902999999999908e-01 1.334408521333329922e+01 7.818770066666670404e-01 +1.399062000000000083e-01 1.377281605666670039e+01 7.205883533333330426e-01 +1.450545000000000029e-01 1.181691977333330001e+01 6.799812333333330461e-01 +1.502462999999999993e-01 1.213584320000000005e+01 6.572146300000000219e-01 +1.555860000000000021e-01 1.192358865166669979e+01 5.953690533333330093e-01 +1.572933999999999999e-01 1.181612013833330010e+01 1.889312700000000123e-01 +1.609261999999999915e-01 1.175466066000000076e+01 5.752044899999999572e-01 +1.661659000000000053e-01 1.042143580833329963e+01 5.392668716666669804e-01 +1.706808999999999965e-01 1.011778497999999971e+01 1.577585016666669948e-01 +1.715392000000000028e-01 9.758357795000000223e+00 5.081139666666669719e-01 +1.771040000000000114e-01 8.903400566666670457e+00 4.716962699999999731e-01 +1.827079000000000064e-01 9.178007346666669619e+00 4.546196783333329994e-01 +1.842987000000000097e-01 9.009516103333330861e+00 1.364224366666670074e-01 +1.882929000000000130e-01 8.406366826666669567e+00 4.368516150000000264e-01 +1.939542999999999962e-01 7.892936534999999587e+00 4.208100816666670019e-01 +1.983015999999999945e-01 7.968528981666669786e+00 1.178380566666669960e-01 +1.997403000000000095e-01 7.734987613333330181e+00 3.934730833333329736e-01 +2.055543999999999982e-01 7.979108915000000302e+00 3.863922049999999886e-01 +2.114380999999999899e-01 6.834691483333330098e+00 3.579354766666669740e-01 +2.120755000000000001e-01 7.473622876666669690e+00 1.084324933333330049e-01 +2.161621999999999988e-01 6.843431601666670083e+00 4.540542233333330069e-01 +2.260508999999999991e-01 6.624537448333329692e+00 9.508442500000000019e-02 +2.398570999999999898e-01 6.030806045000000282e+00 8.883706333333329930e-02 +2.537865999999999733e-01 5.548485336666669987e+00 8.121552666666670417e-02 +2.677086000000000188e-01 5.056279183333329819e+00 7.439664999999999473e-02 +2.818711999999999884e-01 4.746517688333329765e+00 6.929181333333329917e-02 +2.957293999999999756e-01 4.360488485000000303e+00 6.532353000000000465e-02 +3.099983000000000044e-01 4.042259101666670240e+00 5.956615500000000257e-02 +3.241628999999999761e-01 3.667612291666670021e+00 5.754424666666670130e-02 +3.389054000000000233e-01 3.392261260000000167e+00 5.132888666666669819e-02 +3.540212999999999832e-01 3.153369070000000107e+00 5.001504333333330055e-02 +3.688208000000000042e-01 2.957433689999999782e+00 4.622241666666670329e-02 +3.840975999999999835e-01 2.782086464999999897e+00 4.383930500000000202e-02 +3.990183999999999953e-01 2.497954614999999823e+00 4.216718166666669904e-02 +4.106379000000000001e-01 2.347253106833329994e+00 4.254085666666670290e-02 +4.137768000000000002e-01 2.313526113333329803e+00 3.995030166666670157e-02 +4.291927999999999854e-01 2.205677500000000180e+00 3.693004333333330114e-02 +4.295145000000000213e-01 2.125140473833329935e+00 3.583346700000000079e-02 +4.447362000000000259e-01 1.900926653333329996e+00 3.564656666666669860e-02 +4.466328999999999994e-01 1.939722618500000051e+00 3.202840516666669718e-02 +4.604721999999999982e-01 1.890633683333329929e+00 3.361991000000000285e-02 +4.685032000000000085e-01 1.753475375666670111e+00 3.146806816666670309e-02 +4.766304000000000096e-01 1.692544018333330014e+00 3.150160500000000197e-02 +4.833663999999999739e-01 1.571138671166669942e+00 2.967553150000000126e-02 +4.924697000000000102e-01 1.562743266666670072e+00 3.127265833333330025e-02 +5.046184000000000225e-01 1.517538195333330009e+00 2.762060549999999920e-02 +5.084248000000000101e-01 1.452519751666669912e+00 2.870172666666670133e-02 +5.230276000000000369e-01 1.280607860833330003e+00 2.579378549999999937e-02 +5.250753000000000226e-01 1.364635400000000054e+00 2.694985833333329861e-02 +5.418418000000000401e-01 1.180339848333330055e+00 2.622176999999999841e-02 +5.443529999999999758e-01 1.172893769833329936e+00 2.597214383333330129e-02 +5.584759999999999724e-01 1.116791568333330043e+00 2.550004666666669945e-02 +5.612129000000000145e-01 1.071752901666670033e+00 2.359418099999999879e-02 +5.755700000000000260e-01 1.003165499999999932e+00 2.343291166666670172e-02 +5.833568000000000087e-01 9.490407108333329678e-01 2.324037416666669895e-02 +5.929195000000000437e-01 9.286979850000000036e-01 2.255620333333329883e-02 +6.005226999999999649e-01 8.938147573333330431e-01 2.214501316666669939e-02 +6.100906000000000384e-01 8.779068549999999860e-01 2.199904499999999832e-02 +6.218008000000000424e-01 8.078191183333329750e-01 2.148254866666670163e-02 +6.276903999999999817e-01 7.890844949999999969e-01 2.066168499999999908e-02 +6.411527999999999672e-01 6.990414535000000207e-01 1.907308200000000162e-02 +6.449108999999999536e-01 7.027759316666669642e-01 2.104888333333329933e-02 +6.654921999999999782e-01 6.693195063333330364e-01 1.846815400000000051e-02 +6.843110000000000026e-01 5.654079498333329790e-01 2.030432683333329921e-02 +7.057493999999999712e-01 4.733216641666669888e-01 1.710506283333329894e-02 +7.258065000000000211e-01 4.881572298333329840e-01 1.844279849999999957e-02 +7.489831000000000127e-01 4.439720878333329734e-01 1.519038399999999948e-02 +7.719418000000000113e-01 4.063687451666669892e-01 1.720554133333329974e-02 +7.920304000000000233e-01 4.025809184999999957e-01 1.519988700000000047e-02 +8.154392000000000307e-01 3.522328571666670238e-01 1.541253149999999988e-02 +8.363751000000000380e-01 3.005755748333330257e-01 1.457862766666669953e-02 +8.618630000000000457e-01 2.801856756666670223e-01 1.372444566666669932e-02 +8.845638000000000112e-01 3.046253318333330129e-01 1.455751649999999925e-02 +9.080675999999999748e-01 2.540008221666669730e-01 1.267830250000000041e-02 +9.333637999999999657e-01 2.481020686666670083e-01 1.368678783333330054e-02 +9.551005000000000189e-01 1.938199579999999866e-01 1.274076333333330063e-02 +9.812121999999999788e-01 1.905731619999999904e-01 1.196892649999999926e-02 +1.006720599999999965e+00 1.784818836666670072e-01 1.239337400000000040e-02 +1.030317399999999939e+00 1.750911911666669929e-01 1.179671083333330012e-02 +1.057692700000000041e+00 1.705610396666669970e-01 1.092493383333329945e-02 +1.084507099999999946e+00 1.719191243333330066e-01 1.130716749999999965e-02 +1.109806099999999907e+00 1.366376699999999889e-01 1.089438483333329995e-02 +1.137653000000000025e+00 1.239800338333330032e-01 1.044124700000000072e-02 1.165935399999999955e+00 1.310211675000000076e-01 1.024458533333330069e-02 \ No newline at end of file diff --git a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/6_100_1340_10.csv b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/6_100_1340_10.csv index 4f571dd57..2b03b80a5 100644 --- a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/6_100_1340_10.csv +++ b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/6_100_1340_10.csv @@ -1,105 +1,105 @@ -3.625239999999999713e-02 1.213206534416670053e+02 1.651067908166670151e+01 -4.070000000000000007e-02 8.158564289333330066e+01 1.146150313666669973e+01 -4.511180000000000051e-02 6.728303165833330013e+01 8.493610868333329122e+00 -4.959249999999999770e-02 5.609321657833329766e+01 6.902234358333330100e+00 -5.416379999999999806e-02 4.208391674666670212e+01 5.417946521666669568e+00 -5.868999999999999911e-02 4.572918046833329697e+01 4.708583066666670369e+00 -6.315320000000000655e-02 4.506950746166670285e+01 3.890110903333329873e+00 -6.773540000000000116e-02 3.932771859999999720e+01 3.240109296666669803e+00 -7.238989999999999314e-02 3.425092975666670014e+01 2.830867521666669884e+00 -7.694339999999999513e-02 2.785716006499999864e+01 2.497106951666669961e+00 -8.166600000000000248e-02 2.647316349333329910e+01 2.106834523333330100e+00 -8.641719999999999957e-02 2.865549820000000025e+01 1.929370503333329934e+00 -9.109140000000000292e-02 2.617781355833329826e+01 1.699746431666669944e+00 -9.576210000000000278e-02 2.262414874833330103e+01 1.560889624999999947e+00 -1.005216000000000026e-01 2.072404344833330114e+01 1.377539340000000001e+00 -1.052672000000000052e-01 1.924028949499999896e+01 1.276625569999999987e+00 -1.100174000000000013e-01 1.836748323999999855e+01 1.152518286666670111e+00 -1.148721999999999938e-01 1.699007782666669897e+01 1.049408108333329981e+00 -1.198083000000000065e-01 1.493712180833330017e+01 9.595881783333329862e-01 -1.248023999999999939e-01 1.484142020166670051e+01 9.009069050000000356e-01 -1.298709000000000113e-01 1.473895257666669956e+01 8.163899350000000110e-01 -1.349431000000000103e-01 1.308340819666669930e+01 7.807371766666669766e-01 -1.399610000000000021e-01 1.350568340499999920e+01 7.192249033333329988e-01 -1.451112999999999986e-01 1.173611615333330072e+01 6.804578466666669767e-01 -1.503050999999999970e-01 1.154060497666669960e+01 6.523238550000000080e-01 -1.556469000000000047e-01 1.191625231333330071e+01 5.964806683333330195e-01 -1.573344999999999883e-01 1.139197852166670089e+01 1.879402166666669927e-01 -1.609891999999999990e-01 1.125507998666670062e+01 5.708663616666670437e-01 -1.662309999999999899e-01 1.041113468166670053e+01 5.402433599999999503e-01 -1.707255000000000023e-01 1.013307594333329931e+01 1.580824633333330065e-01 -1.716062999999999894e-01 9.500610554999999735e+00 5.062648633333329817e-01 -1.771733000000000058e-01 8.706795813333329193e+00 4.704599616666669815e-01 -1.827794000000000085e-01 9.156035623333330875e+00 4.553047450000000107e-01 -1.843469000000000080e-01 9.118870355000000316e+00 1.370399833333330042e-01 -1.883665999999999952e-01 7.952454938333329615e+00 4.325042000000000053e-01 -1.940302000000000138e-01 8.034647969999999972e+00 4.232443883333329993e-01 -1.983534999999999882e-01 8.119139649999999264e+00 1.185909816666669975e-01 -1.998185000000000100e-01 7.527596430000000005e+00 3.919050766666670182e-01 -2.056348000000000065e-01 7.553855535000000287e+00 3.822255366666669762e-01 -2.115208000000000088e-01 6.617426820000000376e+00 3.561540533333329983e-01 -2.121309999999999862e-01 7.390867828333330003e+00 1.083323783333329932e-01 -2.162467999999999890e-01 6.635593964999999983e+00 4.517541333333329745e-01 -2.261101000000000083e-01 6.488236141666670065e+00 9.474941333333329607e-02 -2.399198999999999915e-01 5.939089416666670118e+00 8.864513000000000253e-02 -2.538528999999999924e-01 5.445706584999999933e+00 8.096326333333329905e-02 -2.677785999999999778e-01 5.020975218333330048e+00 7.440106833333330616e-02 -2.819448999999999983e-01 4.782109235000000069e+00 6.958310166666670238e-02 -2.958067999999999809e-01 4.377367741666669865e+00 6.553075166666670615e-02 -3.100794000000000050e-01 4.070373518333330054e+00 5.980910666666670178e-02 -3.242476000000000247e-01 3.688249826666670117e+00 5.775312500000000238e-02 -3.389940000000000175e-01 3.411490240000000007e+00 5.151532000000000333e-02 -3.541138999999999815e-01 3.221007965000000084e+00 5.041618500000000225e-02 -3.689172000000000007e-01 2.942401639999999929e+00 4.624927499999999941e-02 -3.841980999999999868e-01 2.767105533333329870e+00 4.386071833333329839e-02 -3.991226999999999969e-01 2.564823933333329808e+00 4.256582833333329846e-02 -4.106734000000000218e-01 2.300881685499999829e+00 4.238948299999999864e-02 -4.138850000000000029e-01 2.413576710000000070e+00 4.049426666666670199e-02 -4.293050999999999950e-01 2.233726248333329778e+00 3.713503166666669991e-02 -4.295516999999999808e-01 2.156876818999999834e+00 3.601888033333330158e-02 -4.448524999999999840e-01 1.902652508333330106e+00 3.572283666666670188e-02 -4.466716000000000020e-01 1.934442038833330102e+00 3.205653166666670023e-02 -4.605926000000000187e-01 1.874115690000000001e+00 3.360869833333329781e-02 -4.685437000000000074e-01 1.737730488500000003e+00 3.144913299999999717e-02 -4.767550999999999872e-01 1.772107871666670054e+00 3.193823833333329920e-02 -4.834083000000000130e-01 1.581873448666669901e+00 2.976716433333330067e-02 -4.925984999999999947e-01 1.570737606666670061e+00 3.137136000000000091e-02 -5.046621000000000024e-01 1.492830698499999942e+00 2.756047650000000016e-02 -5.085577999999999488e-01 1.485373084999999982e+00 2.891283166666670096e-02 -5.230728999999999518e-01 1.159546245333330061e+00 2.533816566666670031e-02 -5.252126000000000294e-01 1.354185358333330091e+00 2.695080999999999866e-02 -5.419834999999999514e-01 1.186315898333329955e+00 2.629908666666670031e-02 -5.444001000000000534e-01 1.201936935333330014e+00 2.613158683333329999e-02 -5.586221000000000103e-01 1.109243371666670086e+00 2.550917499999999852e-02 -5.612614999999999688e-01 1.098874749833330000e+00 2.373973216666670077e-02 -5.757206000000000268e-01 1.029040688333330067e+00 2.359920000000000073e-02 -5.834072999999999620e-01 9.811238644999999980e-01 2.340685516666669852e-02 -5.930746000000000073e-01 9.534806916666670462e-01 2.272023833333329870e-02 -6.005747000000000169e-01 8.956047156666669951e-01 2.218217800000000031e-02 -6.102501999999999649e-01 8.805252883333329894e-01 2.205115333333329888e-02 -6.218546000000000351e-01 8.076579554999999688e-01 2.150926133333330020e-02 -6.278546000000000404e-01 8.143317416666669972e-01 2.081983000000000097e-02 -6.412082999999999533e-01 7.185076576666670212e-01 1.917512450000000146e-02 -6.450795999999999752e-01 7.187583950000000499e-01 2.116659499999999985e-02 -6.655497999999999692e-01 6.417931828333329758e-01 1.838261283333330123e-02 -6.843702000000000396e-01 5.677104609999999996e-01 2.033867249999999835e-02 -7.058105999999999547e-01 5.146355146666670155e-01 1.728668516666670082e-02 -7.258693999999999980e-01 5.183306771666670310e-01 1.859332783333330144e-02 -7.490480000000000471e-01 4.413184218333329745e-01 1.519721516666669957e-02 -7.720086999999999922e-01 4.069291728333330194e-01 1.722663266666669968e-02 -7.920989999999999975e-01 3.912903401666669723e-01 1.517220816666670080e-02 -8.155097999999999514e-01 3.620392363333330144e-01 1.546880433333329939e-02 -8.364475000000000104e-01 3.218374210000000124e-01 1.467598383333330002e-02 -8.619377000000000288e-01 2.793489951666670024e-01 1.373524349999999915e-02 -8.846403999999999934e-01 2.729738648333330242e-01 1.444214883333330007e-02 -9.081462000000000145e-01 2.731246803333329809e-01 1.275928200000000026e-02 -9.334447000000000161e-01 2.513956430000000020e-01 1.371339566666670076e-02 -9.551832000000000100e-01 2.075616728333329886e-01 1.280443116666669934e-02 -9.812971999999999806e-01 2.026315226666670077e-01 1.202260966666669935e-02 -1.006807800000000030e+00 1.715856353333329865e-01 1.237966916666670067e-02 -1.030406600000000061e+00 1.813217336666670121e-01 1.183022066666669994e-02 -1.057784300000000011e+00 1.874246033333329953e-01 1.099227083333330010e-02 -1.084600999999999926e+00 1.682342156666669919e-01 1.130467983333329970e-02 -1.109902299999999897e+00 1.305937931666669993e-01 1.088363799999999930e-02 -1.137751600000000085e+00 1.264251891666670069e-01 1.045857849999999936e-02 +3.625239999999999713e-02 1.213206534416670053e+02 1.651067908166670151e+01 +4.070000000000000007e-02 8.158564289333330066e+01 1.146150313666669973e+01 +4.511180000000000051e-02 6.728303165833330013e+01 8.493610868333329122e+00 +4.959249999999999770e-02 5.609321657833329766e+01 6.902234358333330100e+00 +5.416379999999999806e-02 4.208391674666670212e+01 5.417946521666669568e+00 +5.868999999999999911e-02 4.572918046833329697e+01 4.708583066666670369e+00 +6.315320000000000655e-02 4.506950746166670285e+01 3.890110903333329873e+00 +6.773540000000000116e-02 3.932771859999999720e+01 3.240109296666669803e+00 +7.238989999999999314e-02 3.425092975666670014e+01 2.830867521666669884e+00 +7.694339999999999513e-02 2.785716006499999864e+01 2.497106951666669961e+00 +8.166600000000000248e-02 2.647316349333329910e+01 2.106834523333330100e+00 +8.641719999999999957e-02 2.865549820000000025e+01 1.929370503333329934e+00 +9.109140000000000292e-02 2.617781355833329826e+01 1.699746431666669944e+00 +9.576210000000000278e-02 2.262414874833330103e+01 1.560889624999999947e+00 +1.005216000000000026e-01 2.072404344833330114e+01 1.377539340000000001e+00 +1.052672000000000052e-01 1.924028949499999896e+01 1.276625569999999987e+00 +1.100174000000000013e-01 1.836748323999999855e+01 1.152518286666670111e+00 +1.148721999999999938e-01 1.699007782666669897e+01 1.049408108333329981e+00 +1.198083000000000065e-01 1.493712180833330017e+01 9.595881783333329862e-01 +1.248023999999999939e-01 1.484142020166670051e+01 9.009069050000000356e-01 +1.298709000000000113e-01 1.473895257666669956e+01 8.163899350000000110e-01 +1.349431000000000103e-01 1.308340819666669930e+01 7.807371766666669766e-01 +1.399610000000000021e-01 1.350568340499999920e+01 7.192249033333329988e-01 +1.451112999999999986e-01 1.173611615333330072e+01 6.804578466666669767e-01 +1.503050999999999970e-01 1.154060497666669960e+01 6.523238550000000080e-01 +1.556469000000000047e-01 1.191625231333330071e+01 5.964806683333330195e-01 +1.573344999999999883e-01 1.139197852166670089e+01 1.879402166666669927e-01 +1.609891999999999990e-01 1.125507998666670062e+01 5.708663616666670437e-01 +1.662309999999999899e-01 1.041113468166670053e+01 5.402433599999999503e-01 +1.707255000000000023e-01 1.013307594333329931e+01 1.580824633333330065e-01 +1.716062999999999894e-01 9.500610554999999735e+00 5.062648633333329817e-01 +1.771733000000000058e-01 8.706795813333329193e+00 4.704599616666669815e-01 +1.827794000000000085e-01 9.156035623333330875e+00 4.553047450000000107e-01 +1.843469000000000080e-01 9.118870355000000316e+00 1.370399833333330042e-01 +1.883665999999999952e-01 7.952454938333329615e+00 4.325042000000000053e-01 +1.940302000000000138e-01 8.034647969999999972e+00 4.232443883333329993e-01 +1.983534999999999882e-01 8.119139649999999264e+00 1.185909816666669975e-01 +1.998185000000000100e-01 7.527596430000000005e+00 3.919050766666670182e-01 +2.056348000000000065e-01 7.553855535000000287e+00 3.822255366666669762e-01 +2.115208000000000088e-01 6.617426820000000376e+00 3.561540533333329983e-01 +2.121309999999999862e-01 7.390867828333330003e+00 1.083323783333329932e-01 +2.162467999999999890e-01 6.635593964999999983e+00 4.517541333333329745e-01 +2.261101000000000083e-01 6.488236141666670065e+00 9.474941333333329607e-02 +2.399198999999999915e-01 5.939089416666670118e+00 8.864513000000000253e-02 +2.538528999999999924e-01 5.445706584999999933e+00 8.096326333333329905e-02 +2.677785999999999778e-01 5.020975218333330048e+00 7.440106833333330616e-02 +2.819448999999999983e-01 4.782109235000000069e+00 6.958310166666670238e-02 +2.958067999999999809e-01 4.377367741666669865e+00 6.553075166666670615e-02 +3.100794000000000050e-01 4.070373518333330054e+00 5.980910666666670178e-02 +3.242476000000000247e-01 3.688249826666670117e+00 5.775312500000000238e-02 +3.389940000000000175e-01 3.411490240000000007e+00 5.151532000000000333e-02 +3.541138999999999815e-01 3.221007965000000084e+00 5.041618500000000225e-02 +3.689172000000000007e-01 2.942401639999999929e+00 4.624927499999999941e-02 +3.841980999999999868e-01 2.767105533333329870e+00 4.386071833333329839e-02 +3.991226999999999969e-01 2.564823933333329808e+00 4.256582833333329846e-02 +4.106734000000000218e-01 2.300881685499999829e+00 4.238948299999999864e-02 +4.138850000000000029e-01 2.413576710000000070e+00 4.049426666666670199e-02 +4.293050999999999950e-01 2.233726248333329778e+00 3.713503166666669991e-02 +4.295516999999999808e-01 2.156876818999999834e+00 3.601888033333330158e-02 +4.448524999999999840e-01 1.902652508333330106e+00 3.572283666666670188e-02 +4.466716000000000020e-01 1.934442038833330102e+00 3.205653166666670023e-02 +4.605926000000000187e-01 1.874115690000000001e+00 3.360869833333329781e-02 +4.685437000000000074e-01 1.737730488500000003e+00 3.144913299999999717e-02 +4.767550999999999872e-01 1.772107871666670054e+00 3.193823833333329920e-02 +4.834083000000000130e-01 1.581873448666669901e+00 2.976716433333330067e-02 +4.925984999999999947e-01 1.570737606666670061e+00 3.137136000000000091e-02 +5.046621000000000024e-01 1.492830698499999942e+00 2.756047650000000016e-02 +5.085577999999999488e-01 1.485373084999999982e+00 2.891283166666670096e-02 +5.230728999999999518e-01 1.159546245333330061e+00 2.533816566666670031e-02 +5.252126000000000294e-01 1.354185358333330091e+00 2.695080999999999866e-02 +5.419834999999999514e-01 1.186315898333329955e+00 2.629908666666670031e-02 +5.444001000000000534e-01 1.201936935333330014e+00 2.613158683333329999e-02 +5.586221000000000103e-01 1.109243371666670086e+00 2.550917499999999852e-02 +5.612614999999999688e-01 1.098874749833330000e+00 2.373973216666670077e-02 +5.757206000000000268e-01 1.029040688333330067e+00 2.359920000000000073e-02 +5.834072999999999620e-01 9.811238644999999980e-01 2.340685516666669852e-02 +5.930746000000000073e-01 9.534806916666670462e-01 2.272023833333329870e-02 +6.005747000000000169e-01 8.956047156666669951e-01 2.218217800000000031e-02 +6.102501999999999649e-01 8.805252883333329894e-01 2.205115333333329888e-02 +6.218546000000000351e-01 8.076579554999999688e-01 2.150926133333330020e-02 +6.278546000000000404e-01 8.143317416666669972e-01 2.081983000000000097e-02 +6.412082999999999533e-01 7.185076576666670212e-01 1.917512450000000146e-02 +6.450795999999999752e-01 7.187583950000000499e-01 2.116659499999999985e-02 +6.655497999999999692e-01 6.417931828333329758e-01 1.838261283333330123e-02 +6.843702000000000396e-01 5.677104609999999996e-01 2.033867249999999835e-02 +7.058105999999999547e-01 5.146355146666670155e-01 1.728668516666670082e-02 +7.258693999999999980e-01 5.183306771666670310e-01 1.859332783333330144e-02 +7.490480000000000471e-01 4.413184218333329745e-01 1.519721516666669957e-02 +7.720086999999999922e-01 4.069291728333330194e-01 1.722663266666669968e-02 +7.920989999999999975e-01 3.912903401666669723e-01 1.517220816666670080e-02 +8.155097999999999514e-01 3.620392363333330144e-01 1.546880433333329939e-02 +8.364475000000000104e-01 3.218374210000000124e-01 1.467598383333330002e-02 +8.619377000000000288e-01 2.793489951666670024e-01 1.373524349999999915e-02 +8.846403999999999934e-01 2.729738648333330242e-01 1.444214883333330007e-02 +9.081462000000000145e-01 2.731246803333329809e-01 1.275928200000000026e-02 +9.334447000000000161e-01 2.513956430000000020e-01 1.371339566666670076e-02 +9.551832000000000100e-01 2.075616728333329886e-01 1.280443116666669934e-02 +9.812971999999999806e-01 2.026315226666670077e-01 1.202260966666669935e-02 +1.006807800000000030e+00 1.715856353333329865e-01 1.237966916666670067e-02 +1.030406600000000061e+00 1.813217336666670121e-01 1.183022066666669994e-02 +1.057784300000000011e+00 1.874246033333329953e-01 1.099227083333330010e-02 +1.084600999999999926e+00 1.682342156666669919e-01 1.130467983333329970e-02 +1.109902299999999897e+00 1.305937931666669993e-01 1.088363799999999930e-02 +1.137751600000000085e+00 1.264251891666670069e-01 1.045857849999999936e-02 1.166036300000000026e+00 1.206125236666669986e-01 1.021913349999999977e-02 \ No newline at end of file diff --git a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/7_200_1340_10.csv b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/7_200_1340_10.csv index 69ff8c3df..e8e9c9a0b 100644 --- a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/7_200_1340_10.csv +++ b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/7_200_1340_10.csv @@ -1,105 +1,105 @@ -3.625239999999999713e-02 8.265676436333329491e+01 1.638320715333329858e+01 -4.070000000000000007e-02 5.464383480166669926e+01 1.136626790833330070e+01 -4.511180000000000051e-02 2.996549328500000087e+01 8.362137733333330658e+00 -4.959249999999999770e-02 3.902000664833330035e+01 6.829579628333330099e+00 -5.416379999999999806e-02 2.960868386499999971e+01 5.359635035000000158e+00 -5.868999999999999911e-02 2.775202533166670094e+01 4.620562245000000345e+00 -6.315320000000000655e-02 2.923420741833329828e+01 3.806268636666669813e+00 -6.773540000000000116e-02 2.925570898666670061e+01 3.181662941666670186e+00 -7.238989999999999314e-02 2.438109743166669929e+01 2.769415394999999780e+00 -7.694339999999999513e-02 2.082174377999999848e+01 2.449056793333329818e+00 -8.166600000000000248e-02 2.093264007666670068e+01 2.067833788333329981e+00 -8.641719999999999957e-02 2.065156679166669917e+01 1.869354308333329939e+00 -9.109140000000000292e-02 2.096371475999999845e+01 1.658336066666669995e+00 -9.576210000000000278e-02 1.686565956500000141e+01 1.512923419999999908e+00 -1.005216000000000026e-01 1.674424940666670025e+01 1.343149441666670052e+00 -1.052672000000000052e-01 1.453594207833329932e+01 1.233355748333329949e+00 -1.100174000000000013e-01 1.743436942499999986e+01 1.141890178333329953e+00 -1.148721999999999938e-01 1.514907325499999935e+01 1.030380964999999982e+00 -1.198083000000000065e-01 1.335097668833330076e+01 9.427780516666669497e-01 -1.248023999999999939e-01 1.334016233833330034e+01 8.846290449999999472e-01 -1.298709000000000113e-01 1.370878951499999943e+01 8.044898483333330352e-01 -1.349431000000000103e-01 1.169732300833329930e+01 7.648545733333329544e-01 -1.399610000000000021e-01 1.178831958166670013e+01 6.994071549999999471e-01 -1.451112999999999986e-01 1.065116290166669977e+01 6.676857533333330208e-01 -1.503050999999999970e-01 9.325193926666669242e+00 6.273500633333329857e-01 -1.556469000000000047e-01 1.029459589333329994e+01 5.781039766666670188e-01 -1.572456999999999883e-01 1.000640059000000015e+01 1.830944850000000013e-01 -1.609891999999999990e-01 1.045812633999999974e+01 5.605480683333330383e-01 -1.662309999999999899e-01 9.379805284999999770e+00 5.273011283333329802e-01 -1.706292000000000086e-01 9.152038171666669442e+00 1.545153300000000063e-01 -1.716062999999999894e-01 9.072271783333329509e+00 5.002084749999999858e-01 -1.771733000000000058e-01 8.299759079999999400e+00 4.647556766666670058e-01 -1.827794000000000085e-01 8.918414625000000484e+00 4.514085349999999996e-01 -1.842428999999999872e-01 8.303275895000000517e+00 1.338776349999999948e-01 -1.883665999999999952e-01 8.087114149999999668e+00 4.329608600000000029e-01 -1.940302000000000138e-01 6.940626968333329927e+00 4.097805333333329747e-01 -1.982414999999999872e-01 7.399220633333330355e+00 1.156899150000000043e-01 -1.998185000000000100e-01 7.671813116666670318e+00 3.925434549999999856e-01 -2.056348000000000065e-01 7.058416683333329722e+00 3.753756766666669908e-01 -2.115208000000000088e-01 6.186979153333330039e+00 3.502447450000000240e-01 -2.120113000000000136e-01 6.509825833333329648e+00 1.046767516666669978e-01 -2.162467999999999890e-01 6.237968744999999871e+00 4.443455150000000242e-01 -2.259823999999999999e-01 6.054194650000000344e+00 9.278840666666669790e-02 -2.397845000000000115e-01 5.564811654999999746e+00 8.685724833333340056e-02 -2.537096999999999825e-01 5.167096618333330227e+00 7.958348833333329930e-02 -2.676275000000000182e-01 4.857346653333330266e+00 7.348198000000000230e-02 -2.817857999999999752e-01 4.540460176666670122e+00 6.833893833333329337e-02 -2.956398000000000081e-01 4.237780543333330208e+00 6.471250666666669704e-02 -3.099044000000000243e-01 3.935048769999999863e+00 5.903304000000000190e-02 -3.240645999999999805e-01 3.478254921666669830e+00 5.662396666666669881e-02 -3.388027000000000122e-01 3.303115776666670111e+00 5.088800999999999741e-02 -3.539140000000000064e-01 3.111107356666670043e+00 4.976782999999999901e-02 -3.687090000000000090e-01 2.860701315000000022e+00 4.573441000000000312e-02 -3.839813000000000254e-01 2.699693565000000017e+00 4.341666500000000012e-02 -3.988975000000000160e-01 2.495346641666670084e+00 4.210437499999999944e-02 -4.106734000000000218e-01 2.304978501333330154e+00 4.227540733333329942e-02 -4.136514000000000024e-01 2.281161938333330141e+00 3.975256666666669714e-02 -4.290628000000000219e-01 2.190969609999999790e+00 3.681797500000000278e-02 -4.295516999999999808e-01 2.110397390999999789e+00 3.571657216666670326e-02 -4.446014999999999828e-01 1.879588453333330023e+00 3.550642500000000118e-02 -4.466716000000000020e-01 1.816268564666670082e+00 3.148649049999999866e-02 -4.603325999999999807e-01 1.793649588333330103e+00 3.313105499999999953e-02 -4.685437000000000074e-01 1.770170460833329962e+00 3.148902633333330175e-02 -4.764860000000000206e-01 1.682140176666669928e+00 3.141608500000000331e-02 -4.834083000000000130e-01 1.536765404999999918e+00 2.947832866666669910e-02 -4.923204999999999942e-01 1.511959243333329983e+00 3.099057499999999937e-02 -5.046621000000000024e-01 1.465441131499999994e+00 2.736933133333329868e-02 -5.082708000000000226e-01 1.365583310000000106e+00 2.825172333333330135e-02 -5.230728999999999518e-01 1.154780808166669948e+00 2.524863800000000033e-02 -5.249162000000000550e-01 1.329800611666670074e+00 2.675280666666670151e-02 -5.416775999999999813e-01 1.188958583333330044e+00 2.623523499999999911e-02 -5.444001000000000534e-01 1.154485974333330001e+00 2.585743066666670170e-02 -5.583067999999999920e-01 1.077189841666670089e+00 2.527868166666669830e-02 -5.612614999999999688e-01 1.051792144833330056e+00 2.347724083333330158e-02 -5.753956999999999544e-01 1.014095294999999952e+00 2.346036166666670003e-02 -5.834072999999999620e-01 9.588631039999999661e-01 2.325032483333330097e-02 -5.927398999999999862e-01 9.388917833333330076e-01 2.258296499999999998e-02 -6.005747000000000169e-01 8.756694673333329515e-01 2.203778849999999886e-02 -6.099058000000000535e-01 8.473022983333330371e-01 2.182166666666670099e-02 -6.218546000000000351e-01 7.881510335000000422e-01 2.137202599999999883e-02 -6.275003000000000108e-01 7.785123416666670515e-01 2.058900166666670015e-02 -6.412082999999999533e-01 7.088910750000000371e-01 1.908878433333329946e-02 -6.447154999999999969e-01 6.898300916666669780e-01 2.096122833333330035e-02 -6.655497999999999692e-01 6.325061706666670336e-01 1.830133016666669887e-02 -6.843702000000000396e-01 5.535274884999999978e-01 2.022582083333330019e-02 -7.058105999999999547e-01 4.772884753333330177e-01 1.710068249999999873e-02 -7.258693999999999980e-01 4.794482545000000040e-01 1.838371499999999839e-02 -7.490480000000000471e-01 4.303608649999999813e-01 1.512209783333329921e-02 -7.720086999999999922e-01 3.958678310000000033e-01 1.713988450000000080e-02 -7.920989999999999975e-01 3.804415833333329999e-01 1.509590366666670007e-02 -8.155097999999999514e-01 3.391658666666669819e-01 1.534219399999999997e-02 -8.364475000000000104e-01 2.920511656666670008e-01 1.453006433333330072e-02 -8.619377000000000288e-01 2.768105268333330149e-01 1.369777266666669970e-02 -8.846403999999999934e-01 2.773741731666670152e-01 1.443021766666669967e-02 -9.081462000000000145e-01 2.284839270000000033e-01 1.257401600000000036e-02 -9.334447000000000161e-01 2.262680790000000108e-01 1.358766933333330033e-02 -9.551832000000000100e-01 2.014745451666669906e-01 1.275664699999999943e-02 -9.812971999999999806e-01 1.828399243333329871e-01 1.193000216666669985e-02 -1.006807800000000030e+00 1.768480391666669982e-01 1.237525766666669989e-02 -1.030406600000000061e+00 1.607457411666670111e-01 1.173357283333329934e-02 -1.057784300000000011e+00 1.603443938333329877e-01 1.087976483333330004e-02 -1.084600999999999926e+00 1.672401265000000026e-01 1.127955949999999950e-02 -1.109902299999999897e+00 1.308651896666669923e-01 1.086452716666670010e-02 -1.137751600000000085e+00 1.208445169999999985e-01 1.042120399999999988e-02 +3.625239999999999713e-02 8.265676436333329491e+01 1.638320715333329858e+01 +4.070000000000000007e-02 5.464383480166669926e+01 1.136626790833330070e+01 +4.511180000000000051e-02 2.996549328500000087e+01 8.362137733333330658e+00 +4.959249999999999770e-02 3.902000664833330035e+01 6.829579628333330099e+00 +5.416379999999999806e-02 2.960868386499999971e+01 5.359635035000000158e+00 +5.868999999999999911e-02 2.775202533166670094e+01 4.620562245000000345e+00 +6.315320000000000655e-02 2.923420741833329828e+01 3.806268636666669813e+00 +6.773540000000000116e-02 2.925570898666670061e+01 3.181662941666670186e+00 +7.238989999999999314e-02 2.438109743166669929e+01 2.769415394999999780e+00 +7.694339999999999513e-02 2.082174377999999848e+01 2.449056793333329818e+00 +8.166600000000000248e-02 2.093264007666670068e+01 2.067833788333329981e+00 +8.641719999999999957e-02 2.065156679166669917e+01 1.869354308333329939e+00 +9.109140000000000292e-02 2.096371475999999845e+01 1.658336066666669995e+00 +9.576210000000000278e-02 1.686565956500000141e+01 1.512923419999999908e+00 +1.005216000000000026e-01 1.674424940666670025e+01 1.343149441666670052e+00 +1.052672000000000052e-01 1.453594207833329932e+01 1.233355748333329949e+00 +1.100174000000000013e-01 1.743436942499999986e+01 1.141890178333329953e+00 +1.148721999999999938e-01 1.514907325499999935e+01 1.030380964999999982e+00 +1.198083000000000065e-01 1.335097668833330076e+01 9.427780516666669497e-01 +1.248023999999999939e-01 1.334016233833330034e+01 8.846290449999999472e-01 +1.298709000000000113e-01 1.370878951499999943e+01 8.044898483333330352e-01 +1.349431000000000103e-01 1.169732300833329930e+01 7.648545733333329544e-01 +1.399610000000000021e-01 1.178831958166670013e+01 6.994071549999999471e-01 +1.451112999999999986e-01 1.065116290166669977e+01 6.676857533333330208e-01 +1.503050999999999970e-01 9.325193926666669242e+00 6.273500633333329857e-01 +1.556469000000000047e-01 1.029459589333329994e+01 5.781039766666670188e-01 +1.572456999999999883e-01 1.000640059000000015e+01 1.830944850000000013e-01 +1.609891999999999990e-01 1.045812633999999974e+01 5.605480683333330383e-01 +1.662309999999999899e-01 9.379805284999999770e+00 5.273011283333329802e-01 +1.706292000000000086e-01 9.152038171666669442e+00 1.545153300000000063e-01 +1.716062999999999894e-01 9.072271783333329509e+00 5.002084749999999858e-01 +1.771733000000000058e-01 8.299759079999999400e+00 4.647556766666670058e-01 +1.827794000000000085e-01 8.918414625000000484e+00 4.514085349999999996e-01 +1.842428999999999872e-01 8.303275895000000517e+00 1.338776349999999948e-01 +1.883665999999999952e-01 8.087114149999999668e+00 4.329608600000000029e-01 +1.940302000000000138e-01 6.940626968333329927e+00 4.097805333333329747e-01 +1.982414999999999872e-01 7.399220633333330355e+00 1.156899150000000043e-01 +1.998185000000000100e-01 7.671813116666670318e+00 3.925434549999999856e-01 +2.056348000000000065e-01 7.058416683333329722e+00 3.753756766666669908e-01 +2.115208000000000088e-01 6.186979153333330039e+00 3.502447450000000240e-01 +2.120113000000000136e-01 6.509825833333329648e+00 1.046767516666669978e-01 +2.162467999999999890e-01 6.237968744999999871e+00 4.443455150000000242e-01 +2.259823999999999999e-01 6.054194650000000344e+00 9.278840666666669790e-02 +2.397845000000000115e-01 5.564811654999999746e+00 8.685724833333340056e-02 +2.537096999999999825e-01 5.167096618333330227e+00 7.958348833333329930e-02 +2.676275000000000182e-01 4.857346653333330266e+00 7.348198000000000230e-02 +2.817857999999999752e-01 4.540460176666670122e+00 6.833893833333329337e-02 +2.956398000000000081e-01 4.237780543333330208e+00 6.471250666666669704e-02 +3.099044000000000243e-01 3.935048769999999863e+00 5.903304000000000190e-02 +3.240645999999999805e-01 3.478254921666669830e+00 5.662396666666669881e-02 +3.388027000000000122e-01 3.303115776666670111e+00 5.088800999999999741e-02 +3.539140000000000064e-01 3.111107356666670043e+00 4.976782999999999901e-02 +3.687090000000000090e-01 2.860701315000000022e+00 4.573441000000000312e-02 +3.839813000000000254e-01 2.699693565000000017e+00 4.341666500000000012e-02 +3.988975000000000160e-01 2.495346641666670084e+00 4.210437499999999944e-02 +4.106734000000000218e-01 2.304978501333330154e+00 4.227540733333329942e-02 +4.136514000000000024e-01 2.281161938333330141e+00 3.975256666666669714e-02 +4.290628000000000219e-01 2.190969609999999790e+00 3.681797500000000278e-02 +4.295516999999999808e-01 2.110397390999999789e+00 3.571657216666670326e-02 +4.446014999999999828e-01 1.879588453333330023e+00 3.550642500000000118e-02 +4.466716000000000020e-01 1.816268564666670082e+00 3.148649049999999866e-02 +4.603325999999999807e-01 1.793649588333330103e+00 3.313105499999999953e-02 +4.685437000000000074e-01 1.770170460833329962e+00 3.148902633333330175e-02 +4.764860000000000206e-01 1.682140176666669928e+00 3.141608500000000331e-02 +4.834083000000000130e-01 1.536765404999999918e+00 2.947832866666669910e-02 +4.923204999999999942e-01 1.511959243333329983e+00 3.099057499999999937e-02 +5.046621000000000024e-01 1.465441131499999994e+00 2.736933133333329868e-02 +5.082708000000000226e-01 1.365583310000000106e+00 2.825172333333330135e-02 +5.230728999999999518e-01 1.154780808166669948e+00 2.524863800000000033e-02 +5.249162000000000550e-01 1.329800611666670074e+00 2.675280666666670151e-02 +5.416775999999999813e-01 1.188958583333330044e+00 2.623523499999999911e-02 +5.444001000000000534e-01 1.154485974333330001e+00 2.585743066666670170e-02 +5.583067999999999920e-01 1.077189841666670089e+00 2.527868166666669830e-02 +5.612614999999999688e-01 1.051792144833330056e+00 2.347724083333330158e-02 +5.753956999999999544e-01 1.014095294999999952e+00 2.346036166666670003e-02 +5.834072999999999620e-01 9.588631039999999661e-01 2.325032483333330097e-02 +5.927398999999999862e-01 9.388917833333330076e-01 2.258296499999999998e-02 +6.005747000000000169e-01 8.756694673333329515e-01 2.203778849999999886e-02 +6.099058000000000535e-01 8.473022983333330371e-01 2.182166666666670099e-02 +6.218546000000000351e-01 7.881510335000000422e-01 2.137202599999999883e-02 +6.275003000000000108e-01 7.785123416666670515e-01 2.058900166666670015e-02 +6.412082999999999533e-01 7.088910750000000371e-01 1.908878433333329946e-02 +6.447154999999999969e-01 6.898300916666669780e-01 2.096122833333330035e-02 +6.655497999999999692e-01 6.325061706666670336e-01 1.830133016666669887e-02 +6.843702000000000396e-01 5.535274884999999978e-01 2.022582083333330019e-02 +7.058105999999999547e-01 4.772884753333330177e-01 1.710068249999999873e-02 +7.258693999999999980e-01 4.794482545000000040e-01 1.838371499999999839e-02 +7.490480000000000471e-01 4.303608649999999813e-01 1.512209783333329921e-02 +7.720086999999999922e-01 3.958678310000000033e-01 1.713988450000000080e-02 +7.920989999999999975e-01 3.804415833333329999e-01 1.509590366666670007e-02 +8.155097999999999514e-01 3.391658666666669819e-01 1.534219399999999997e-02 +8.364475000000000104e-01 2.920511656666670008e-01 1.453006433333330072e-02 +8.619377000000000288e-01 2.768105268333330149e-01 1.369777266666669970e-02 +8.846403999999999934e-01 2.773741731666670152e-01 1.443021766666669967e-02 +9.081462000000000145e-01 2.284839270000000033e-01 1.257401600000000036e-02 +9.334447000000000161e-01 2.262680790000000108e-01 1.358766933333330033e-02 +9.551832000000000100e-01 2.014745451666669906e-01 1.275664699999999943e-02 +9.812971999999999806e-01 1.828399243333329871e-01 1.193000216666669985e-02 +1.006807800000000030e+00 1.768480391666669982e-01 1.237525766666669989e-02 +1.030406600000000061e+00 1.607457411666670111e-01 1.173357283333329934e-02 +1.057784300000000011e+00 1.603443938333329877e-01 1.087976483333330004e-02 +1.084600999999999926e+00 1.672401265000000026e-01 1.127955949999999950e-02 +1.109902299999999897e+00 1.308651896666669923e-01 1.086452716666670010e-02 +1.137751600000000085e+00 1.208445169999999985e-01 1.042120399999999988e-02 1.166036300000000026e+00 1.219414448333329959e-01 1.020481383333330001e-02 \ No newline at end of file diff --git a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/8_300_1340_10.csv b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/8_300_1340_10.csv index c61ec5437..c576fb9ba 100644 --- a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/8_300_1340_10.csv +++ b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/8_300_1340_10.csv @@ -1,105 +1,105 @@ -3.625710000000000044e-02 7.586499487000000386e+01 1.637401323166670153e+01 -4.070529999999999982e-02 4.481643682666670259e+01 1.134473448500000003e+01 -4.511769999999999670e-02 3.187475403666670104e+01 8.372120233333330219e+00 -4.959899999999999726e-02 2.997679580000000144e+01 6.801308398333329563e+00 -5.417079999999999812e-02 2.394855565499999983e+01 5.340431286666669664e+00 -5.869760000000000255e-02 2.142582576833330066e+01 4.594792676666670239e+00 -6.316149999999999542e-02 3.089957102166669856e+01 3.816311058333329953e+00 -6.774429999999999341e-02 2.654007947166670078e+01 3.169185818333330129e+00 -7.239929999999999977e-02 1.943375908333329960e+01 2.742530958333329938e+00 -7.695340000000000513e-02 1.976728253666669843e+01 2.443851029999999813e+00 -8.167670000000000485e-02 1.925900297000000094e+01 2.058348746666669893e+00 -8.642850000000000532e-02 1.891829230833329945e+01 1.858069830000000033e+00 -9.110319999999999530e-02 1.827805419833330092e+01 1.639507476666669961e+00 -9.577460000000000140e-02 1.569160155166670023e+01 1.504524439999999963e+00 -1.005346000000000017e-01 1.326347007166669911e+01 1.315847523333329994e+00 -1.052808999999999967e-01 1.528716061000000082e+01 1.240626203333329958e+00 -1.100316999999999962e-01 1.357029930000000029e+01 1.108701733333329997e+00 -1.148871000000000059e-01 1.268526336333330029e+01 1.008324261666670107e+00 -1.198237999999999942e-01 1.157206131499999913e+01 9.266636050000000013e-01 -1.248187000000000046e-01 1.139260776499999928e+01 8.664271866666669597e-01 -1.298877999999999977e-01 1.288652256499999993e+01 7.969746983333330093e-01 -1.349605999999999861e-01 1.079102049499999971e+01 7.560191466666670301e-01 -1.399791999999999981e-01 1.105679143000000053e+01 6.920319183333329960e-01 -1.451301000000000119e-01 1.044385611833330074e+01 6.659680816666669889e-01 -1.503246000000000027e-01 9.389620521666669717e+00 6.284466633333329888e-01 -1.556671000000000027e-01 9.365269319999999453e+00 5.685768949999999711e-01 -1.572933999999999999e-01 9.202126339999999516e+00 1.807199866666669985e-01 -1.610100999999999893e-01 9.725111731666670423e+00 5.526473100000000027e-01 -1.662526000000000004e-01 8.453553321666669618e+00 5.170390433333329483e-01 -1.706808999999999965e-01 8.508661829999999426e+00 1.525917300000000087e-01 -1.716285999999999923e-01 8.248625778333330771e+00 4.912094450000000223e-01 -1.771963000000000010e-01 7.860151886666669974e+00 4.601271083333329792e-01 -1.828030999999999962e-01 8.179063558333330874e+00 4.431557566666670112e-01 -1.842987000000000097e-01 7.789301021666670266e+00 1.322509683333329966e-01 -1.883911000000000058e-01 7.284922560000000047e+00 4.239183200000000151e-01 -1.940553999999999890e-01 6.860865920000000173e+00 4.091373166666669725e-01 -1.983015999999999945e-01 6.984366938333329777e+00 1.143283233333329957e-01 -1.998445000000000082e-01 7.321059296666669880e+00 3.888106266666669919e-01 -2.056614999999999971e-01 6.516638536666669701e+00 3.691254600000000163e-01 -2.115482999999999947e-01 5.813378858333329902e+00 3.460794933333329881e-01 -2.120755000000000001e-01 6.410695145000000039e+00 1.044179233333329959e-01 -2.162748999999999922e-01 6.046752721666670105e+00 4.416217800000000193e-01 -2.260508999999999991e-01 5.970100884999999913e+00 9.257100833333330170e-02 -2.398570999999999898e-01 5.328183368333330172e+00 8.599138666666669706e-02 -2.537865999999999733e-01 5.025059630000000332e+00 7.909936500000000481e-02 -2.677086000000000188e-01 4.638679231666669622e+00 7.265197833333329747e-02 -2.818711999999999884e-01 4.320586221666670390e+00 6.748263000000000178e-02 -2.957293999999999756e-01 4.003143766666670267e+00 6.376038000000000538e-02 -3.099983000000000044e-01 3.820362695000000031e+00 5.861029000000000239e-02 -3.241628999999999761e-01 3.476478435000000200e+00 5.668581000000000314e-02 -3.389054000000000233e-01 3.203212216666670109e+00 5.052067666666670148e-02 -3.540212999999999832e-01 3.082675891666669887e+00 4.970334166666669912e-02 -3.688208000000000042e-01 2.852994409999999981e+00 4.575685000000000169e-02 -3.840975999999999835e-01 2.619206445000000105e+00 4.310591500000000159e-02 -3.990183999999999953e-01 2.447015261666670050e+00 4.192961333333330293e-02 -4.106022999999999756e-01 2.250148667666670210e+00 4.208387400000000028e-02 -4.137768000000000002e-01 2.199470903333330174e+00 3.941821333333329902e-02 -4.291927999999999854e-01 2.152990283333330090e+00 3.668624166666670239e-02 -4.294773000000000063e-01 2.066339865166670009e+00 3.559078633333329772e-02 -4.447362000000000259e-01 1.856158275000000080e+00 3.543832166666670280e-02 -4.465942999999999996e-01 1.863514126000000104e+00 3.172593550000000345e-02 -4.604721999999999982e-01 1.785743791666670077e+00 3.313367500000000132e-02 -4.684626000000000068e-01 1.701883971166670007e+00 3.125393900000000141e-02 -4.766304000000000096e-01 1.673134868333330028e+00 3.141082333333330284e-02 -4.833245999999999931e-01 1.561424375333329895e+00 2.963426116666669982e-02 -4.924697000000000102e-01 1.528741043333329941e+00 3.110879000000000075e-02 -5.045747000000000426e-01 1.440318964999999896e+00 2.730927600000000038e-02 -5.084248000000000101e-01 1.414442154999999923e+00 2.852017166666670142e-02 -5.229823000000000111e-01 1.195010044500000035e+00 2.544837383333330150e-02 -5.250753000000000226e-01 1.305492214999999900e+00 2.666661666666670163e-02 -5.418418000000000401e-01 1.152673440000000049e+00 2.608773333333330030e-02 -5.443057999999999508e-01 1.145610492499999911e+00 2.585580999999999990e-02 -5.584759999999999724e-01 1.067225758333329999e+00 2.525753999999999846e-02 -5.611642999999999493e-01 1.067666433166670092e+00 2.357715833333329930e-02 -5.755700000000000260e-01 1.029394661666670041e+00 2.355942499999999842e-02 -5.833063000000000553e-01 9.377488744999999959e-01 2.319254466666669998e-02 -5.929195000000000437e-01 9.657185166666669707e-01 2.274125999999999925e-02 -6.004707000000000239e-01 8.602252591666670334e-01 2.200228683333330104e-02 -6.100906000000000384e-01 8.435776883333330201e-01 2.182633499999999879e-02 -6.217470000000000496e-01 7.760975660000000165e-01 2.134885499999999992e-02 -6.276903999999999817e-01 7.741666183333330009e-01 2.058969000000000077e-02 -6.410972000000000337e-01 7.019246166666669451e-01 1.908517183333329967e-02 -6.449108999999999536e-01 6.851353900000000108e-01 2.095862666666669857e-02 -6.654345000000000399e-01 5.961630181666669470e-01 1.818150283333330036e-02 -6.842517000000000182e-01 5.507593983333329835e-01 2.023759049999999948e-02 -7.056883000000000461e-01 4.903288296666670210e-01 1.717216466666670119e-02 -7.257436999999999916e-01 4.865799499999999833e-01 1.843612033333329875e-02 -7.489183000000000368e-01 4.252237993333329857e-01 1.512044316666670031e-02 -7.718749999999999778e-01 3.910920323333330062e-01 1.713838283333329882e-02 -7.919618000000000491e-01 3.921714671666670093e-01 1.515910683333330025e-02 -8.153685999999999989e-01 3.357406613333330236e-01 1.534501599999999952e-02 -8.363026999999999544e-01 3.075498956666670169e-01 1.460560383333329992e-02 -8.617884000000000100e-01 2.857851470000000171e-01 1.374501849999999921e-02 -8.844872000000000289e-01 2.740424961666669823e-01 1.443190633333329975e-02 -9.079890000000000461e-01 2.574230581666669959e-01 1.269050000000000039e-02 -9.332829999999999737e-01 2.258197691666669893e-01 1.359980449999999980e-02 -9.550178000000000278e-01 1.934376846666669980e-01 1.273933533333329940e-02 -9.811271999999999771e-01 1.665732448333329951e-01 1.188447333333329976e-02 -1.006633399999999900e+00 1.640185443333329884e-01 1.234030849999999922e-02 -1.030228200000000038e+00 1.357939996666669979e-01 1.165456533333330061e-02 -1.057601100000000072e+00 1.607766528333330058e-01 1.089187166666670016e-02 -1.084413199999999966e+00 1.505459054999999935e-01 1.123158833333329915e-02 -1.109710100000000033e+00 1.282342724999999961e-01 1.086581349999999994e-02 -1.137554500000000024e+00 1.161345933333329944e-01 1.041549200000000015e-02 +3.625710000000000044e-02 7.586499487000000386e+01 1.637401323166670153e+01 +4.070529999999999982e-02 4.481643682666670259e+01 1.134473448500000003e+01 +4.511769999999999670e-02 3.187475403666670104e+01 8.372120233333330219e+00 +4.959899999999999726e-02 2.997679580000000144e+01 6.801308398333329563e+00 +5.417079999999999812e-02 2.394855565499999983e+01 5.340431286666669664e+00 +5.869760000000000255e-02 2.142582576833330066e+01 4.594792676666670239e+00 +6.316149999999999542e-02 3.089957102166669856e+01 3.816311058333329953e+00 +6.774429999999999341e-02 2.654007947166670078e+01 3.169185818333330129e+00 +7.239929999999999977e-02 1.943375908333329960e+01 2.742530958333329938e+00 +7.695340000000000513e-02 1.976728253666669843e+01 2.443851029999999813e+00 +8.167670000000000485e-02 1.925900297000000094e+01 2.058348746666669893e+00 +8.642850000000000532e-02 1.891829230833329945e+01 1.858069830000000033e+00 +9.110319999999999530e-02 1.827805419833330092e+01 1.639507476666669961e+00 +9.577460000000000140e-02 1.569160155166670023e+01 1.504524439999999963e+00 +1.005346000000000017e-01 1.326347007166669911e+01 1.315847523333329994e+00 +1.052808999999999967e-01 1.528716061000000082e+01 1.240626203333329958e+00 +1.100316999999999962e-01 1.357029930000000029e+01 1.108701733333329997e+00 +1.148871000000000059e-01 1.268526336333330029e+01 1.008324261666670107e+00 +1.198237999999999942e-01 1.157206131499999913e+01 9.266636050000000013e-01 +1.248187000000000046e-01 1.139260776499999928e+01 8.664271866666669597e-01 +1.298877999999999977e-01 1.288652256499999993e+01 7.969746983333330093e-01 +1.349605999999999861e-01 1.079102049499999971e+01 7.560191466666670301e-01 +1.399791999999999981e-01 1.105679143000000053e+01 6.920319183333329960e-01 +1.451301000000000119e-01 1.044385611833330074e+01 6.659680816666669889e-01 +1.503246000000000027e-01 9.389620521666669717e+00 6.284466633333329888e-01 +1.556671000000000027e-01 9.365269319999999453e+00 5.685768949999999711e-01 +1.572933999999999999e-01 9.202126339999999516e+00 1.807199866666669985e-01 +1.610100999999999893e-01 9.725111731666670423e+00 5.526473100000000027e-01 +1.662526000000000004e-01 8.453553321666669618e+00 5.170390433333329483e-01 +1.706808999999999965e-01 8.508661829999999426e+00 1.525917300000000087e-01 +1.716285999999999923e-01 8.248625778333330771e+00 4.912094450000000223e-01 +1.771963000000000010e-01 7.860151886666669974e+00 4.601271083333329792e-01 +1.828030999999999962e-01 8.179063558333330874e+00 4.431557566666670112e-01 +1.842987000000000097e-01 7.789301021666670266e+00 1.322509683333329966e-01 +1.883911000000000058e-01 7.284922560000000047e+00 4.239183200000000151e-01 +1.940553999999999890e-01 6.860865920000000173e+00 4.091373166666669725e-01 +1.983015999999999945e-01 6.984366938333329777e+00 1.143283233333329957e-01 +1.998445000000000082e-01 7.321059296666669880e+00 3.888106266666669919e-01 +2.056614999999999971e-01 6.516638536666669701e+00 3.691254600000000163e-01 +2.115482999999999947e-01 5.813378858333329902e+00 3.460794933333329881e-01 +2.120755000000000001e-01 6.410695145000000039e+00 1.044179233333329959e-01 +2.162748999999999922e-01 6.046752721666670105e+00 4.416217800000000193e-01 +2.260508999999999991e-01 5.970100884999999913e+00 9.257100833333330170e-02 +2.398570999999999898e-01 5.328183368333330172e+00 8.599138666666669706e-02 +2.537865999999999733e-01 5.025059630000000332e+00 7.909936500000000481e-02 +2.677086000000000188e-01 4.638679231666669622e+00 7.265197833333329747e-02 +2.818711999999999884e-01 4.320586221666670390e+00 6.748263000000000178e-02 +2.957293999999999756e-01 4.003143766666670267e+00 6.376038000000000538e-02 +3.099983000000000044e-01 3.820362695000000031e+00 5.861029000000000239e-02 +3.241628999999999761e-01 3.476478435000000200e+00 5.668581000000000314e-02 +3.389054000000000233e-01 3.203212216666670109e+00 5.052067666666670148e-02 +3.540212999999999832e-01 3.082675891666669887e+00 4.970334166666669912e-02 +3.688208000000000042e-01 2.852994409999999981e+00 4.575685000000000169e-02 +3.840975999999999835e-01 2.619206445000000105e+00 4.310591500000000159e-02 +3.990183999999999953e-01 2.447015261666670050e+00 4.192961333333330293e-02 +4.106022999999999756e-01 2.250148667666670210e+00 4.208387400000000028e-02 +4.137768000000000002e-01 2.199470903333330174e+00 3.941821333333329902e-02 +4.291927999999999854e-01 2.152990283333330090e+00 3.668624166666670239e-02 +4.294773000000000063e-01 2.066339865166670009e+00 3.559078633333329772e-02 +4.447362000000000259e-01 1.856158275000000080e+00 3.543832166666670280e-02 +4.465942999999999996e-01 1.863514126000000104e+00 3.172593550000000345e-02 +4.604721999999999982e-01 1.785743791666670077e+00 3.313367500000000132e-02 +4.684626000000000068e-01 1.701883971166670007e+00 3.125393900000000141e-02 +4.766304000000000096e-01 1.673134868333330028e+00 3.141082333333330284e-02 +4.833245999999999931e-01 1.561424375333329895e+00 2.963426116666669982e-02 +4.924697000000000102e-01 1.528741043333329941e+00 3.110879000000000075e-02 +5.045747000000000426e-01 1.440318964999999896e+00 2.730927600000000038e-02 +5.084248000000000101e-01 1.414442154999999923e+00 2.852017166666670142e-02 +5.229823000000000111e-01 1.195010044500000035e+00 2.544837383333330150e-02 +5.250753000000000226e-01 1.305492214999999900e+00 2.666661666666670163e-02 +5.418418000000000401e-01 1.152673440000000049e+00 2.608773333333330030e-02 +5.443057999999999508e-01 1.145610492499999911e+00 2.585580999999999990e-02 +5.584759999999999724e-01 1.067225758333329999e+00 2.525753999999999846e-02 +5.611642999999999493e-01 1.067666433166670092e+00 2.357715833333329930e-02 +5.755700000000000260e-01 1.029394661666670041e+00 2.355942499999999842e-02 +5.833063000000000553e-01 9.377488744999999959e-01 2.319254466666669998e-02 +5.929195000000000437e-01 9.657185166666669707e-01 2.274125999999999925e-02 +6.004707000000000239e-01 8.602252591666670334e-01 2.200228683333330104e-02 +6.100906000000000384e-01 8.435776883333330201e-01 2.182633499999999879e-02 +6.217470000000000496e-01 7.760975660000000165e-01 2.134885499999999992e-02 +6.276903999999999817e-01 7.741666183333330009e-01 2.058969000000000077e-02 +6.410972000000000337e-01 7.019246166666669451e-01 1.908517183333329967e-02 +6.449108999999999536e-01 6.851353900000000108e-01 2.095862666666669857e-02 +6.654345000000000399e-01 5.961630181666669470e-01 1.818150283333330036e-02 +6.842517000000000182e-01 5.507593983333329835e-01 2.023759049999999948e-02 +7.056883000000000461e-01 4.903288296666670210e-01 1.717216466666670119e-02 +7.257436999999999916e-01 4.865799499999999833e-01 1.843612033333329875e-02 +7.489183000000000368e-01 4.252237993333329857e-01 1.512044316666670031e-02 +7.718749999999999778e-01 3.910920323333330062e-01 1.713838283333329882e-02 +7.919618000000000491e-01 3.921714671666670093e-01 1.515910683333330025e-02 +8.153685999999999989e-01 3.357406613333330236e-01 1.534501599999999952e-02 +8.363026999999999544e-01 3.075498956666670169e-01 1.460560383333329992e-02 +8.617884000000000100e-01 2.857851470000000171e-01 1.374501849999999921e-02 +8.844872000000000289e-01 2.740424961666669823e-01 1.443190633333329975e-02 +9.079890000000000461e-01 2.574230581666669959e-01 1.269050000000000039e-02 +9.332829999999999737e-01 2.258197691666669893e-01 1.359980449999999980e-02 +9.550178000000000278e-01 1.934376846666669980e-01 1.273933533333329940e-02 +9.811271999999999771e-01 1.665732448333329951e-01 1.188447333333329976e-02 +1.006633399999999900e+00 1.640185443333329884e-01 1.234030849999999922e-02 +1.030228200000000038e+00 1.357939996666669979e-01 1.165456533333330061e-02 +1.057601100000000072e+00 1.607766528333330058e-01 1.089187166666670016e-02 +1.084413199999999966e+00 1.505459054999999935e-01 1.123158833333329915e-02 +1.109710100000000033e+00 1.282342724999999961e-01 1.086581349999999994e-02 +1.137554500000000024e+00 1.161345933333329944e-01 1.041549200000000015e-02 1.165834400000000048e+00 1.239725849999999963e-01 1.022116500000000081e-02 \ No newline at end of file diff --git a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/9_600_1340_10.csv b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/9_600_1340_10.csv index c04b643c3..c869ca7de 100644 --- a/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/9_600_1340_10.csv +++ b/test/trend_test_data/FeNiB_perpendicular_Bersweiler_et_al/9_600_1340_10.csv @@ -1,105 +1,105 @@ -3.625239999999999713e-02 5.114892415500000311e+01 1.631213251166670020e+01 -4.070000000000000007e-02 4.576787608166669941e+01 1.134772132833330005e+01 -4.511180000000000051e-02 4.331816215999999997e+01 8.407984515000000769e+00 -4.959249999999999770e-02 2.519454865000000154e+01 6.784784965000000057e+00 -5.416379999999999806e-02 1.407789967999999980e+01 5.302135776666670353e+00 -5.868999999999999911e-02 1.337527417166669963e+01 4.558895663333330184e+00 -6.315320000000000655e-02 2.088227957833329995e+01 3.767553325000000175e+00 -6.773540000000000116e-02 2.352067832833330030e+01 3.153463791666669902e+00 -7.238989999999999314e-02 1.459065788833330046e+01 2.714546644999999980e+00 -7.694339999999999513e-02 1.643097480333329941e+01 2.423213508333330157e+00 -8.166600000000000248e-02 1.564276924666670077e+01 2.035339249999999822e+00 -8.641719999999999957e-02 1.609254856500000130e+01 1.837833853333330048e+00 -9.109140000000000292e-02 1.279946007166670086e+01 1.598433549999999981e+00 -9.576210000000000278e-02 1.168004799999999932e+01 1.472505774999999906e+00 -1.005216000000000026e-01 1.239115217500000021e+01 1.308776653333330042e+00 -1.052672000000000052e-01 1.104442360666669920e+01 1.203200884999999998e+00 -1.100174000000000013e-01 1.264824788499999997e+01 1.100505863333330003e+00 -1.148721999999999938e-01 1.068150069333329988e+01 9.895295950000000396e-01 -1.198083000000000065e-01 1.062919121333329997e+01 9.177280949999999660e-01 -1.248023999999999939e-01 8.480228023333330256e+00 8.376397483333329896e-01 -1.298709000000000113e-01 1.054387282333330056e+01 7.736622133333329598e-01 -1.349431000000000103e-01 8.823326103333329229e+00 7.353996000000000421e-01 -1.399610000000000021e-01 9.107303678333330765e+00 6.707318450000000487e-01 -1.451112999999999986e-01 7.568946575000000010e+00 6.354211899999999691e-01 -1.503050999999999970e-01 7.486937655000000191e+00 6.076642716666670330e-01 -1.556469000000000047e-01 8.316071640000000542e+00 5.572019216666670438e-01 -1.572933999999999999e-01 8.082806423333330770e+00 1.772221983333329975e-01 -1.609891999999999990e-01 8.406204656666670161e+00 5.374420016666670019e-01 -1.662309999999999899e-01 7.305961626666669595e+00 5.035922400000000243e-01 -1.706808999999999965e-01 7.409980823333330413e+00 1.490785450000000067e-01 -1.716062999999999894e-01 7.126663556666669841e+00 4.782201200000000263e-01 -1.771733000000000058e-01 6.104670323333330373e+00 4.398585833333329975e-01 -1.827794000000000085e-01 6.314649313333330127e+00 4.207942599999999755e-01 -1.842987000000000097e-01 6.985669296666669581e+00 1.295300000000000062e-01 -1.883665999999999952e-01 7.196837438333330006e+00 4.229003000000000068e-01 -1.940302000000000138e-01 5.456149725000000394e+00 3.926154199999999928e-01 -1.983015999999999945e-01 6.101519538333329606e+00 1.111746183333330029e-01 -1.998185000000000100e-01 6.715507050000000255e+00 3.818104066666669905e-01 -2.056348000000000065e-01 5.954089436666669677e+00 3.622545733333329965e-01 -2.115208000000000088e-01 5.823000606666670187e+00 3.462099583333330122e-01 -2.120755000000000001e-01 5.689073146666670411e+00 1.016859966666670001e-01 -2.162467999999999890e-01 5.274567024999999632e+00 4.291691899999999782e-01 -2.260508999999999991e-01 5.306054011666669901e+00 9.002336499999999408e-02 -2.398570999999999898e-01 4.872989734999999989e+00 8.416759833333330165e-02 -2.537865999999999733e-01 4.590923198333330291e+00 7.736351666666670124e-02 -2.677086000000000188e-01 4.288802803333330083e+00 7.121471833333330170e-02 -2.818711999999999884e-01 4.093612151666669696e+00 6.655526166666669852e-02 -2.957293999999999756e-01 3.790488160000000217e+00 6.286535166666669394e-02 -3.099983000000000044e-01 3.646502630000000078e+00 5.789795166666669712e-02 -3.241628999999999761e-01 3.269809508333330061e+00 5.578990999999999811e-02 -3.389054000000000233e-01 3.057003066666669877e+00 4.992672166666670130e-02 -3.540212999999999832e-01 3.010102380000000188e+00 4.942106333333329965e-02 -3.688208000000000042e-01 2.669906414999999811e+00 4.496581333333329877e-02 -3.840975999999999835e-01 2.619258584999999862e+00 4.314465499999999704e-02 -3.990183999999999953e-01 2.335828473333330102e+00 4.143680999999999753e-02 -4.106379000000000001e-01 2.148179208166669962e+00 4.160297799999999879e-02 -4.137768000000000002e-01 2.129094906666670006e+00 3.911823833333329808e-02 -4.291927999999999854e-01 2.070782439999999891e+00 3.633175833333329718e-02 -4.295145000000000213e-01 2.006558257333329820e+00 3.534480766666669993e-02 -4.447362000000000259e-01 1.796411879999999961e+00 3.518650999999999723e-02 -4.466328999999999994e-01 1.795892682000000073e+00 3.145603500000000025e-02 -4.604721999999999982e-01 1.744876515000000072e+00 3.296921333333330262e-02 -4.685032000000000085e-01 1.640983006833329982e+00 3.099933850000000102e-02 -4.766304000000000096e-01 1.643527214999999986e+00 3.129624333333329983e-02 -4.833663999999999739e-01 1.494623838666669924e+00 2.933965966666670158e-02 -4.924697000000000102e-01 1.485128543333330109e+00 3.092004166666669981e-02 -5.046184000000000225e-01 1.428664912499999939e+00 2.726148050000000087e-02 -5.084248000000000101e-01 1.392996424999999983e+00 2.844018666666670025e-02 -5.230276000000000369e-01 1.160762609500000098e+00 2.531033383333329903e-02 -5.250753000000000226e-01 1.272159111666669951e+00 2.652694499999999969e-02 -5.418418000000000401e-01 1.157124196666670102e+00 2.613007999999999997e-02 -5.443529999999999758e-01 1.137421045666670016e+00 2.582160033333329857e-02 -5.584759999999999724e-01 1.068463686666669910e+00 2.528335666666670090e-02 -5.612129000000000145e-01 1.030207043666669930e+00 2.342105016666670009e-02 -5.755700000000000260e-01 9.590708749999999894e-01 2.323855999999999838e-02 -5.833568000000000087e-01 9.226566683333330410e-01 2.312843766666669923e-02 -5.929195000000000437e-01 9.361494049999999900e-01 2.261169999999999847e-02 -6.005226999999999649e-01 8.377321681666669573e-01 2.190618299999999921e-02 -6.100906000000000384e-01 8.074355933333330348e-01 2.165867833333329912e-02 -6.218008000000000424e-01 7.338905468333329907e-01 2.116956166666670094e-02 -6.276903999999999817e-01 7.588048750000000453e-01 2.052974999999999939e-02 -6.411527999999999672e-01 6.602236648333329461e-01 1.891721183333330142e-02 -6.449108999999999536e-01 6.976061483333330093e-01 2.103810166666670103e-02 -6.654921999999999782e-01 5.868389913333329488e-01 1.814479133333329886e-02 -6.843110000000000026e-01 5.442379206666669855e-01 2.020865366666670104e-02 -7.057493999999999712e-01 4.561023925000000090e-01 1.703726683333330050e-02 -7.258065000000000211e-01 4.680557555000000036e-01 1.835656600000000124e-02 -7.489831000000000127e-01 4.286472281666670048e-01 1.513358700000000043e-02 -7.719418000000000113e-01 3.942902281666669784e-01 1.715291783333329836e-02 -7.920304000000000233e-01 3.917498161666669865e-01 1.515774683333329965e-02 -8.154392000000000307e-01 3.437863165000000221e-01 1.537817166666670052e-02 -8.363751000000000380e-01 2.882515494999999817e-01 1.453092849999999998e-02 -8.618630000000000457e-01 2.511196196666670155e-01 1.361783299999999933e-02 -8.845638000000000112e-01 2.644882184999999830e-01 1.439263916666670001e-02 -9.080675999999999748e-01 2.444909116666670046e-01 1.264447816666670020e-02 -9.333637999999999657e-01 2.291532736666669900e-01 1.361314100000000048e-02 -9.551005000000000189e-01 1.942403736666669933e-01 1.274254833333329957e-02 -9.812121999999999788e-01 1.854263468333330056e-01 1.195107366666670057e-02 -1.006720599999999965e+00 1.833105325000000119e-01 1.241118433333330065e-02 -1.030317399999999939e+00 1.560276093333330116e-01 1.172809033333330024e-02 -1.057692700000000041e+00 1.687616888333330067e-01 1.091902633333330028e-02 -1.084507099999999946e+00 1.609880563333329906e-01 1.126864266666669986e-02 -1.109806099999999907e+00 1.237764021666669934e-01 1.085079116666669979e-02 -1.137653000000000025e+00 1.252411816666670064e-01 1.044549983333330039e-02 +3.625239999999999713e-02 5.114892415500000311e+01 1.631213251166670020e+01 +4.070000000000000007e-02 4.576787608166669941e+01 1.134772132833330005e+01 +4.511180000000000051e-02 4.331816215999999997e+01 8.407984515000000769e+00 +4.959249999999999770e-02 2.519454865000000154e+01 6.784784965000000057e+00 +5.416379999999999806e-02 1.407789967999999980e+01 5.302135776666670353e+00 +5.868999999999999911e-02 1.337527417166669963e+01 4.558895663333330184e+00 +6.315320000000000655e-02 2.088227957833329995e+01 3.767553325000000175e+00 +6.773540000000000116e-02 2.352067832833330030e+01 3.153463791666669902e+00 +7.238989999999999314e-02 1.459065788833330046e+01 2.714546644999999980e+00 +7.694339999999999513e-02 1.643097480333329941e+01 2.423213508333330157e+00 +8.166600000000000248e-02 1.564276924666670077e+01 2.035339249999999822e+00 +8.641719999999999957e-02 1.609254856500000130e+01 1.837833853333330048e+00 +9.109140000000000292e-02 1.279946007166670086e+01 1.598433549999999981e+00 +9.576210000000000278e-02 1.168004799999999932e+01 1.472505774999999906e+00 +1.005216000000000026e-01 1.239115217500000021e+01 1.308776653333330042e+00 +1.052672000000000052e-01 1.104442360666669920e+01 1.203200884999999998e+00 +1.100174000000000013e-01 1.264824788499999997e+01 1.100505863333330003e+00 +1.148721999999999938e-01 1.068150069333329988e+01 9.895295950000000396e-01 +1.198083000000000065e-01 1.062919121333329997e+01 9.177280949999999660e-01 +1.248023999999999939e-01 8.480228023333330256e+00 8.376397483333329896e-01 +1.298709000000000113e-01 1.054387282333330056e+01 7.736622133333329598e-01 +1.349431000000000103e-01 8.823326103333329229e+00 7.353996000000000421e-01 +1.399610000000000021e-01 9.107303678333330765e+00 6.707318450000000487e-01 +1.451112999999999986e-01 7.568946575000000010e+00 6.354211899999999691e-01 +1.503050999999999970e-01 7.486937655000000191e+00 6.076642716666670330e-01 +1.556469000000000047e-01 8.316071640000000542e+00 5.572019216666670438e-01 +1.572933999999999999e-01 8.082806423333330770e+00 1.772221983333329975e-01 +1.609891999999999990e-01 8.406204656666670161e+00 5.374420016666670019e-01 +1.662309999999999899e-01 7.305961626666669595e+00 5.035922400000000243e-01 +1.706808999999999965e-01 7.409980823333330413e+00 1.490785450000000067e-01 +1.716062999999999894e-01 7.126663556666669841e+00 4.782201200000000263e-01 +1.771733000000000058e-01 6.104670323333330373e+00 4.398585833333329975e-01 +1.827794000000000085e-01 6.314649313333330127e+00 4.207942599999999755e-01 +1.842987000000000097e-01 6.985669296666669581e+00 1.295300000000000062e-01 +1.883665999999999952e-01 7.196837438333330006e+00 4.229003000000000068e-01 +1.940302000000000138e-01 5.456149725000000394e+00 3.926154199999999928e-01 +1.983015999999999945e-01 6.101519538333329606e+00 1.111746183333330029e-01 +1.998185000000000100e-01 6.715507050000000255e+00 3.818104066666669905e-01 +2.056348000000000065e-01 5.954089436666669677e+00 3.622545733333329965e-01 +2.115208000000000088e-01 5.823000606666670187e+00 3.462099583333330122e-01 +2.120755000000000001e-01 5.689073146666670411e+00 1.016859966666670001e-01 +2.162467999999999890e-01 5.274567024999999632e+00 4.291691899999999782e-01 +2.260508999999999991e-01 5.306054011666669901e+00 9.002336499999999408e-02 +2.398570999999999898e-01 4.872989734999999989e+00 8.416759833333330165e-02 +2.537865999999999733e-01 4.590923198333330291e+00 7.736351666666670124e-02 +2.677086000000000188e-01 4.288802803333330083e+00 7.121471833333330170e-02 +2.818711999999999884e-01 4.093612151666669696e+00 6.655526166666669852e-02 +2.957293999999999756e-01 3.790488160000000217e+00 6.286535166666669394e-02 +3.099983000000000044e-01 3.646502630000000078e+00 5.789795166666669712e-02 +3.241628999999999761e-01 3.269809508333330061e+00 5.578990999999999811e-02 +3.389054000000000233e-01 3.057003066666669877e+00 4.992672166666670130e-02 +3.540212999999999832e-01 3.010102380000000188e+00 4.942106333333329965e-02 +3.688208000000000042e-01 2.669906414999999811e+00 4.496581333333329877e-02 +3.840975999999999835e-01 2.619258584999999862e+00 4.314465499999999704e-02 +3.990183999999999953e-01 2.335828473333330102e+00 4.143680999999999753e-02 +4.106379000000000001e-01 2.148179208166669962e+00 4.160297799999999879e-02 +4.137768000000000002e-01 2.129094906666670006e+00 3.911823833333329808e-02 +4.291927999999999854e-01 2.070782439999999891e+00 3.633175833333329718e-02 +4.295145000000000213e-01 2.006558257333329820e+00 3.534480766666669993e-02 +4.447362000000000259e-01 1.796411879999999961e+00 3.518650999999999723e-02 +4.466328999999999994e-01 1.795892682000000073e+00 3.145603500000000025e-02 +4.604721999999999982e-01 1.744876515000000072e+00 3.296921333333330262e-02 +4.685032000000000085e-01 1.640983006833329982e+00 3.099933850000000102e-02 +4.766304000000000096e-01 1.643527214999999986e+00 3.129624333333329983e-02 +4.833663999999999739e-01 1.494623838666669924e+00 2.933965966666670158e-02 +4.924697000000000102e-01 1.485128543333330109e+00 3.092004166666669981e-02 +5.046184000000000225e-01 1.428664912499999939e+00 2.726148050000000087e-02 +5.084248000000000101e-01 1.392996424999999983e+00 2.844018666666670025e-02 +5.230276000000000369e-01 1.160762609500000098e+00 2.531033383333329903e-02 +5.250753000000000226e-01 1.272159111666669951e+00 2.652694499999999969e-02 +5.418418000000000401e-01 1.157124196666670102e+00 2.613007999999999997e-02 +5.443529999999999758e-01 1.137421045666670016e+00 2.582160033333329857e-02 +5.584759999999999724e-01 1.068463686666669910e+00 2.528335666666670090e-02 +5.612129000000000145e-01 1.030207043666669930e+00 2.342105016666670009e-02 +5.755700000000000260e-01 9.590708749999999894e-01 2.323855999999999838e-02 +5.833568000000000087e-01 9.226566683333330410e-01 2.312843766666669923e-02 +5.929195000000000437e-01 9.361494049999999900e-01 2.261169999999999847e-02 +6.005226999999999649e-01 8.377321681666669573e-01 2.190618299999999921e-02 +6.100906000000000384e-01 8.074355933333330348e-01 2.165867833333329912e-02 +6.218008000000000424e-01 7.338905468333329907e-01 2.116956166666670094e-02 +6.276903999999999817e-01 7.588048750000000453e-01 2.052974999999999939e-02 +6.411527999999999672e-01 6.602236648333329461e-01 1.891721183333330142e-02 +6.449108999999999536e-01 6.976061483333330093e-01 2.103810166666670103e-02 +6.654921999999999782e-01 5.868389913333329488e-01 1.814479133333329886e-02 +6.843110000000000026e-01 5.442379206666669855e-01 2.020865366666670104e-02 +7.057493999999999712e-01 4.561023925000000090e-01 1.703726683333330050e-02 +7.258065000000000211e-01 4.680557555000000036e-01 1.835656600000000124e-02 +7.489831000000000127e-01 4.286472281666670048e-01 1.513358700000000043e-02 +7.719418000000000113e-01 3.942902281666669784e-01 1.715291783333329836e-02 +7.920304000000000233e-01 3.917498161666669865e-01 1.515774683333329965e-02 +8.154392000000000307e-01 3.437863165000000221e-01 1.537817166666670052e-02 +8.363751000000000380e-01 2.882515494999999817e-01 1.453092849999999998e-02 +8.618630000000000457e-01 2.511196196666670155e-01 1.361783299999999933e-02 +8.845638000000000112e-01 2.644882184999999830e-01 1.439263916666670001e-02 +9.080675999999999748e-01 2.444909116666670046e-01 1.264447816666670020e-02 +9.333637999999999657e-01 2.291532736666669900e-01 1.361314100000000048e-02 +9.551005000000000189e-01 1.942403736666669933e-01 1.274254833333329957e-02 +9.812121999999999788e-01 1.854263468333330056e-01 1.195107366666670057e-02 +1.006720599999999965e+00 1.833105325000000119e-01 1.241118433333330065e-02 +1.030317399999999939e+00 1.560276093333330116e-01 1.172809033333330024e-02 +1.057692700000000041e+00 1.687616888333330067e-01 1.091902633333330028e-02 +1.084507099999999946e+00 1.609880563333329906e-01 1.126864266666669986e-02 +1.109806099999999907e+00 1.237764021666669934e-01 1.085079116666669979e-02 +1.137653000000000025e+00 1.252411816666670064e-01 1.044549983333330039e-02 1.165935399999999955e+00 1.143170270000000016e-01 1.018908599999999998e-02 \ No newline at end of file diff --git a/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/1_33_1640_22.874115.csv b/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/1_33_1640_22.874115.csv index 92b38bcf5..160f11da2 100644 --- a/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/1_33_1640_22.874115.csv +++ b/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/1_33_1640_22.874115.csv @@ -1,60 +1,60 @@ -2.732000000000000053e-02 5.247581629999999677e+03 5.122294999999999732e+01 -3.090999999999999998e-02 3.911350339999999960e+03 4.422301999999999822e+01 -3.452999999999999819e-02 2.897911560000000009e+03 3.806515000000000271e+01 -3.812999999999999723e-02 2.151411560000000009e+03 3.279795000000000016e+01 -4.173999999999999932e-02 1.629610879999999952e+03 2.854479999999999862e+01 -4.542999999999999816e-02 1.229812930000000051e+03 2.479730999999999952e+01 -4.646000000000000130e-02 1.191418850000000020e+03 2.440716000000000108e+01 -4.909000000000000169e-02 9.198557799999999816e+02 2.144593000000000060e+01 -5.254999999999999949e-02 7.981839199999999437e+02 1.997728999999999999e+01 -5.270999999999999991e-02 7.205761899999999969e+02 1.898125999999999891e+01 -5.630999999999999894e-02 5.509914999999999736e+02 1.659806000000000026e+01 -5.870999999999999830e-02 5.012570499999999925e+02 1.583125000000000071e+01 -5.988000000000000267e-02 4.332142900000000054e+02 1.471757999999999988e+01 -6.353999999999999926e-02 3.420333299999999781e+02 1.307732999999999990e+01 -6.482999999999999874e-02 3.398080699999999865e+02 1.303472000000000008e+01 -6.716999999999999360e-02 2.726683699999999817e+02 1.167622000000000071e+01 -7.073000000000000120e-02 2.204248299999999858e+02 1.049821000000000026e+01 -7.095999999999999530e-02 2.235476199999999949e+02 1.057230999999999987e+01 -7.434999999999999942e-02 1.760958799999999940e+02 9.383390000000000342e+00 -7.724000000000000310e-02 1.542382200000000125e+02 8.781750000000000611e+00 -7.799999999999999989e-02 1.457825499999999863e+02 8.537639999999999674e+00 -8.164000000000000423e-02 1.201677600000000012e+02 7.751380000000000159e+00 -8.346000000000000640e-02 1.089934400000000068e+02 7.382189999999999586e+00 -8.525000000000000633e-02 9.836262000000000683e+01 7.012940000000000396e+00 -8.881999999999999618e-02 8.192439000000000249e+01 6.400170000000000137e+00 -8.962000000000000521e-02 7.733648999999999774e+01 6.218379999999999797e+00 -9.572999999999999565e-02 5.882012000000000285e+01 5.423099999999999810e+00 -1.018000000000000016e-01 4.406902000000000186e+01 4.694090000000000096e+00 -1.080300000000000010e-01 3.487624000000000279e+01 4.175900000000000389e+00 -1.141999999999999960e-01 2.769241999999999848e+01 3.721049999999999969e+00 -1.202399999999999997e-01 2.227824000000000026e+01 3.337530000000000108e+00 -1.263900000000000023e-01 1.858717000000000041e+01 3.048540000000000028e+00 -1.325999999999999956e-01 1.587791999999999959e+01 2.817619999999999791e+00 -1.388199999999999990e-01 1.416899000000000086e+01 2.661669999999999980e+00 -1.449499999999999955e-01 1.174597999999999942e+01 2.423430000000000195e+00 -1.509900000000000131e-01 1.047161000000000008e+01 2.288190000000000168e+00 -1.571599999999999941e-01 9.681599999999999540e+00 2.200180000000000025e+00 -1.633799999999999975e-01 8.894579999999999487e+00 2.108859999999999957e+00 -1.695599999999999885e-01 8.317479999999999762e+00 2.039299999999999891e+00 -1.756800000000000028e-01 7.913870000000000182e+00 1.989200000000000079e+00 -1.818599999999999939e-01 7.771530000000000271e+00 1.971230000000000038e+00 -1.880699999999999872e-01 7.882909999999999862e+00 1.985309999999999908e+00 -1.941799999999999915e-01 7.707720000000000127e+00 1.963130000000000042e+00 -2.002800000000000136e-01 7.676859999999999573e+00 1.959189999999999987e+00 -2.064199999999999924e-01 7.872259999999999813e+00 1.983970000000000011e+00 -2.126000000000000112e-01 7.870400000000000063e+00 1.983729999999999993e+00 -2.187500000000000000e-01 7.977940000000000254e+00 1.997239999999999904e+00 -2.248699999999999866e-01 8.152039999999999509e+00 2.018920000000000048e+00 -2.310500000000000054e-01 8.298420000000000130e+00 2.036960000000000104e+00 -2.372700000000000087e-01 8.716689999999999827e+00 2.087660000000000071e+00 -2.434399999999999897e-01 8.782600000000000406e+00 2.095540000000000180e+00 -2.495600000000000041e-01 8.933479999999999421e+00 2.113469999999999960e+00 -2.556899999999999729e-01 9.374109999999999943e+00 2.164960000000000218e+00 -2.618500000000000272e-01 9.457430000000000447e+00 2.174560000000000048e+00 -2.680500000000000105e-01 9.702469999999999928e+00 2.202550000000000008e+00 -2.742100000000000093e-01 9.923930000000000362e+00 2.227549999999999919e+00 -2.802999999999999936e-01 1.008966000000000030e+01 2.246070000000000011e+00 -2.864599999999999924e-01 1.031367999999999974e+01 2.270869999999999944e+00 -2.926699999999999857e-01 1.058960000000000079e+01 2.301039999999999974e+00 +2.732000000000000053e-02 5.247581629999999677e+03 5.122294999999999732e+01 +3.090999999999999998e-02 3.911350339999999960e+03 4.422301999999999822e+01 +3.452999999999999819e-02 2.897911560000000009e+03 3.806515000000000271e+01 +3.812999999999999723e-02 2.151411560000000009e+03 3.279795000000000016e+01 +4.173999999999999932e-02 1.629610879999999952e+03 2.854479999999999862e+01 +4.542999999999999816e-02 1.229812930000000051e+03 2.479730999999999952e+01 +4.646000000000000130e-02 1.191418850000000020e+03 2.440716000000000108e+01 +4.909000000000000169e-02 9.198557799999999816e+02 2.144593000000000060e+01 +5.254999999999999949e-02 7.981839199999999437e+02 1.997728999999999999e+01 +5.270999999999999991e-02 7.205761899999999969e+02 1.898125999999999891e+01 +5.630999999999999894e-02 5.509914999999999736e+02 1.659806000000000026e+01 +5.870999999999999830e-02 5.012570499999999925e+02 1.583125000000000071e+01 +5.988000000000000267e-02 4.332142900000000054e+02 1.471757999999999988e+01 +6.353999999999999926e-02 3.420333299999999781e+02 1.307732999999999990e+01 +6.482999999999999874e-02 3.398080699999999865e+02 1.303472000000000008e+01 +6.716999999999999360e-02 2.726683699999999817e+02 1.167622000000000071e+01 +7.073000000000000120e-02 2.204248299999999858e+02 1.049821000000000026e+01 +7.095999999999999530e-02 2.235476199999999949e+02 1.057230999999999987e+01 +7.434999999999999942e-02 1.760958799999999940e+02 9.383390000000000342e+00 +7.724000000000000310e-02 1.542382200000000125e+02 8.781750000000000611e+00 +7.799999999999999989e-02 1.457825499999999863e+02 8.537639999999999674e+00 +8.164000000000000423e-02 1.201677600000000012e+02 7.751380000000000159e+00 +8.346000000000000640e-02 1.089934400000000068e+02 7.382189999999999586e+00 +8.525000000000000633e-02 9.836262000000000683e+01 7.012940000000000396e+00 +8.881999999999999618e-02 8.192439000000000249e+01 6.400170000000000137e+00 +8.962000000000000521e-02 7.733648999999999774e+01 6.218379999999999797e+00 +9.572999999999999565e-02 5.882012000000000285e+01 5.423099999999999810e+00 +1.018000000000000016e-01 4.406902000000000186e+01 4.694090000000000096e+00 +1.080300000000000010e-01 3.487624000000000279e+01 4.175900000000000389e+00 +1.141999999999999960e-01 2.769241999999999848e+01 3.721049999999999969e+00 +1.202399999999999997e-01 2.227824000000000026e+01 3.337530000000000108e+00 +1.263900000000000023e-01 1.858717000000000041e+01 3.048540000000000028e+00 +1.325999999999999956e-01 1.587791999999999959e+01 2.817619999999999791e+00 +1.388199999999999990e-01 1.416899000000000086e+01 2.661669999999999980e+00 +1.449499999999999955e-01 1.174597999999999942e+01 2.423430000000000195e+00 +1.509900000000000131e-01 1.047161000000000008e+01 2.288190000000000168e+00 +1.571599999999999941e-01 9.681599999999999540e+00 2.200180000000000025e+00 +1.633799999999999975e-01 8.894579999999999487e+00 2.108859999999999957e+00 +1.695599999999999885e-01 8.317479999999999762e+00 2.039299999999999891e+00 +1.756800000000000028e-01 7.913870000000000182e+00 1.989200000000000079e+00 +1.818599999999999939e-01 7.771530000000000271e+00 1.971230000000000038e+00 +1.880699999999999872e-01 7.882909999999999862e+00 1.985309999999999908e+00 +1.941799999999999915e-01 7.707720000000000127e+00 1.963130000000000042e+00 +2.002800000000000136e-01 7.676859999999999573e+00 1.959189999999999987e+00 +2.064199999999999924e-01 7.872259999999999813e+00 1.983970000000000011e+00 +2.126000000000000112e-01 7.870400000000000063e+00 1.983729999999999993e+00 +2.187500000000000000e-01 7.977940000000000254e+00 1.997239999999999904e+00 +2.248699999999999866e-01 8.152039999999999509e+00 2.018920000000000048e+00 +2.310500000000000054e-01 8.298420000000000130e+00 2.036960000000000104e+00 +2.372700000000000087e-01 8.716689999999999827e+00 2.087660000000000071e+00 +2.434399999999999897e-01 8.782600000000000406e+00 2.095540000000000180e+00 +2.495600000000000041e-01 8.933479999999999421e+00 2.113469999999999960e+00 +2.556899999999999729e-01 9.374109999999999943e+00 2.164960000000000218e+00 +2.618500000000000272e-01 9.457430000000000447e+00 2.174560000000000048e+00 +2.680500000000000105e-01 9.702469999999999928e+00 2.202550000000000008e+00 +2.742100000000000093e-01 9.923930000000000362e+00 2.227549999999999919e+00 +2.802999999999999936e-01 1.008966000000000030e+01 2.246070000000000011e+00 +2.864599999999999924e-01 1.031367999999999974e+01 2.270869999999999944e+00 +2.926699999999999857e-01 1.058960000000000079e+01 2.301039999999999974e+00 2.988199999999999745e-01 1.062256999999999962e+01 2.304619999999999891e+00 \ No newline at end of file diff --git a/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/2_42_1640_23.456895.csv b/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/2_42_1640_23.456895.csv index 831fa6a9d..80562dff5 100644 --- a/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/2_42_1640_23.456895.csv +++ b/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/2_42_1640_23.456895.csv @@ -1,60 +1,60 @@ -2.732000000000000053e-02 3.883615650000000187e+03 4.406595000000000084e+01 -3.090000000000000038e-02 3.072013609999999971e+03 3.919192000000000320e+01 -3.452999999999999819e-02 2.355659860000000208e+03 3.431953000000000031e+01 -3.812999999999999723e-02 1.806985030000000052e+03 3.005815000000000126e+01 -4.173999999999999932e-02 1.389839799999999968e+03 2.636132999999999882e+01 -4.542000000000000204e-02 1.072684349999999995e+03 2.315906000000000020e+01 -4.644000000000000211e-02 9.624380499999999756e+02 2.193669999999999831e+01 -4.907999999999999863e-02 8.065360500000000457e+02 2.008153000000000077e+01 -5.253000000000000030e-02 6.666923000000000457e+02 1.825777000000000072e+01 -5.270999999999999991e-02 6.432540800000000445e+02 1.793395999999999901e+01 -5.630000000000000282e-02 4.985809499999999730e+02 1.578894000000000020e+01 -5.868999999999999911e-02 4.290448299999999904e+02 1.464658000000000015e+01 -5.986999999999999961e-02 3.918163299999999936e+02 1.399671999999999983e+01 -6.353000000000000314e-02 3.098850299999999720e+02 1.244758999999999993e+01 -6.481000000000000649e-02 2.946982499999999732e+02 1.213874000000000031e+01 -6.715999999999999748e-02 2.516384400000000028e+02 1.121692000000000000e+01 -7.072000000000000508e-02 2.028407500000000141e+02 1.007076999999999956e+01 -7.094000000000000306e-02 1.948358800000000031e+02 9.870050000000000878e+00 -7.434000000000000330e-02 1.633427599999999984e+02 9.037219999999999587e+00 -7.721000000000000085e-02 1.371933899999999937e+02 8.282310000000000727e+00 -7.799000000000000377e-02 1.347819700000000012e+02 8.209199999999999164e+00 -8.162999999999999423e-02 1.123165999999999940e+02 7.493879999999999875e+00 -8.343000000000000416e-02 9.602442000000000633e+01 6.929079999999999906e+00 -8.523999999999999633e-02 9.249591999999999814e+01 6.800589999999999691e+00 -8.880000000000000393e-02 7.934887999999999408e+01 6.298759999999999692e+00 -8.959000000000000297e-02 7.016214999999999691e+01 5.922930000000000028e+00 -9.568999999999999728e-02 5.357988000000000284e+01 5.175900000000000389e+00 -1.017699999999999994e-01 4.050641000000000247e+01 4.500359999999999694e+00 -1.079900000000000027e-01 3.194395000000000095e+01 3.996500000000000163e+00 -1.141599999999999976e-01 2.563089000000000084e+01 3.579870000000000108e+00 -1.202000000000000013e-01 2.144641999999999982e+01 3.274630000000000152e+00 -1.263499999999999901e-01 1.696240999999999843e+01 2.912249999999999783e+00 -1.325600000000000112e-01 1.453672000000000075e+01 2.695990000000000109e+00 -1.387700000000000045e-01 1.265718999999999994e+01 2.515670000000000073e+00 -1.449000000000000010e-01 1.114897000000000027e+01 2.361029999999999962e+00 -1.509399999999999908e-01 1.005156999999999989e+01 2.241830000000000211e+00 -1.571099999999999997e-01 9.313710000000000377e+00 2.157970000000000166e+00 -1.633300000000000030e-01 8.668530000000000513e+00 2.081890000000000018e+00 -1.695099999999999940e-01 7.810069999999999624e+00 1.976120000000000099e+00 -1.756300000000000083e-01 7.695079999999999920e+00 1.961519999999999930e+00 -1.817999999999999894e-01 7.222220000000000084e+00 1.900290000000000035e+00 -1.880100000000000104e-01 7.386999999999999567e+00 1.921850000000000058e+00 -1.941199999999999870e-01 7.239320000000000199e+00 1.902539999999999898e+00 -2.002200000000000091e-01 7.279099999999999682e+00 1.907759999999999900e+00 -2.063500000000000056e-01 7.406340000000000146e+00 1.924360000000000070e+00 -2.125299999999999967e-01 7.439199999999999591e+00 1.928630000000000067e+00 -2.186800000000000133e-01 7.556879999999999598e+00 1.943820000000000103e+00 -2.247899999999999898e-01 7.730520000000000280e+00 1.966029999999999944e+00 -2.309799999999999909e-01 8.106099999999999639e+00 2.013220000000000010e+00 -2.371999999999999942e-01 8.398609999999999687e+00 2.049220000000000041e+00 -2.433599999999999930e-01 8.171440000000000481e+00 2.021319999999999784e+00 -2.494800000000000073e-01 8.478289999999999438e+00 2.058920000000000083e+00 -2.556100000000000039e-01 8.796279999999999433e+00 2.097170000000000201e+00 -2.617700000000000027e-01 8.973420000000000840e+00 2.118189999999999795e+00 -2.679699999999999860e-01 9.270730000000000359e+00 2.152989999999999959e+00 -2.741299999999999848e-01 9.463879999999999626e+00 2.175300000000000011e+00 -2.802100000000000146e-01 9.409150000000000347e+00 2.169000000000000039e+00 -2.863700000000000134e-01 9.709509999999999863e+00 2.203349999999999920e+00 -2.925800000000000067e-01 9.851300000000000168e+00 2.219380000000000130e+00 +2.732000000000000053e-02 3.883615650000000187e+03 4.406595000000000084e+01 +3.090000000000000038e-02 3.072013609999999971e+03 3.919192000000000320e+01 +3.452999999999999819e-02 2.355659860000000208e+03 3.431953000000000031e+01 +3.812999999999999723e-02 1.806985030000000052e+03 3.005815000000000126e+01 +4.173999999999999932e-02 1.389839799999999968e+03 2.636132999999999882e+01 +4.542000000000000204e-02 1.072684349999999995e+03 2.315906000000000020e+01 +4.644000000000000211e-02 9.624380499999999756e+02 2.193669999999999831e+01 +4.907999999999999863e-02 8.065360500000000457e+02 2.008153000000000077e+01 +5.253000000000000030e-02 6.666923000000000457e+02 1.825777000000000072e+01 +5.270999999999999991e-02 6.432540800000000445e+02 1.793395999999999901e+01 +5.630000000000000282e-02 4.985809499999999730e+02 1.578894000000000020e+01 +5.868999999999999911e-02 4.290448299999999904e+02 1.464658000000000015e+01 +5.986999999999999961e-02 3.918163299999999936e+02 1.399671999999999983e+01 +6.353000000000000314e-02 3.098850299999999720e+02 1.244758999999999993e+01 +6.481000000000000649e-02 2.946982499999999732e+02 1.213874000000000031e+01 +6.715999999999999748e-02 2.516384400000000028e+02 1.121692000000000000e+01 +7.072000000000000508e-02 2.028407500000000141e+02 1.007076999999999956e+01 +7.094000000000000306e-02 1.948358800000000031e+02 9.870050000000000878e+00 +7.434000000000000330e-02 1.633427599999999984e+02 9.037219999999999587e+00 +7.721000000000000085e-02 1.371933899999999937e+02 8.282310000000000727e+00 +7.799000000000000377e-02 1.347819700000000012e+02 8.209199999999999164e+00 +8.162999999999999423e-02 1.123165999999999940e+02 7.493879999999999875e+00 +8.343000000000000416e-02 9.602442000000000633e+01 6.929079999999999906e+00 +8.523999999999999633e-02 9.249591999999999814e+01 6.800589999999999691e+00 +8.880000000000000393e-02 7.934887999999999408e+01 6.298759999999999692e+00 +8.959000000000000297e-02 7.016214999999999691e+01 5.922930000000000028e+00 +9.568999999999999728e-02 5.357988000000000284e+01 5.175900000000000389e+00 +1.017699999999999994e-01 4.050641000000000247e+01 4.500359999999999694e+00 +1.079900000000000027e-01 3.194395000000000095e+01 3.996500000000000163e+00 +1.141599999999999976e-01 2.563089000000000084e+01 3.579870000000000108e+00 +1.202000000000000013e-01 2.144641999999999982e+01 3.274630000000000152e+00 +1.263499999999999901e-01 1.696240999999999843e+01 2.912249999999999783e+00 +1.325600000000000112e-01 1.453672000000000075e+01 2.695990000000000109e+00 +1.387700000000000045e-01 1.265718999999999994e+01 2.515670000000000073e+00 +1.449000000000000010e-01 1.114897000000000027e+01 2.361029999999999962e+00 +1.509399999999999908e-01 1.005156999999999989e+01 2.241830000000000211e+00 +1.571099999999999997e-01 9.313710000000000377e+00 2.157970000000000166e+00 +1.633300000000000030e-01 8.668530000000000513e+00 2.081890000000000018e+00 +1.695099999999999940e-01 7.810069999999999624e+00 1.976120000000000099e+00 +1.756300000000000083e-01 7.695079999999999920e+00 1.961519999999999930e+00 +1.817999999999999894e-01 7.222220000000000084e+00 1.900290000000000035e+00 +1.880100000000000104e-01 7.386999999999999567e+00 1.921850000000000058e+00 +1.941199999999999870e-01 7.239320000000000199e+00 1.902539999999999898e+00 +2.002200000000000091e-01 7.279099999999999682e+00 1.907759999999999900e+00 +2.063500000000000056e-01 7.406340000000000146e+00 1.924360000000000070e+00 +2.125299999999999967e-01 7.439199999999999591e+00 1.928630000000000067e+00 +2.186800000000000133e-01 7.556879999999999598e+00 1.943820000000000103e+00 +2.247899999999999898e-01 7.730520000000000280e+00 1.966029999999999944e+00 +2.309799999999999909e-01 8.106099999999999639e+00 2.013220000000000010e+00 +2.371999999999999942e-01 8.398609999999999687e+00 2.049220000000000041e+00 +2.433599999999999930e-01 8.171440000000000481e+00 2.021319999999999784e+00 +2.494800000000000073e-01 8.478289999999999438e+00 2.058920000000000083e+00 +2.556100000000000039e-01 8.796279999999999433e+00 2.097170000000000201e+00 +2.617700000000000027e-01 8.973420000000000840e+00 2.118189999999999795e+00 +2.679699999999999860e-01 9.270730000000000359e+00 2.152989999999999959e+00 +2.741299999999999848e-01 9.463879999999999626e+00 2.175300000000000011e+00 +2.802100000000000146e-01 9.409150000000000347e+00 2.169000000000000039e+00 +2.863700000000000134e-01 9.709509999999999863e+00 2.203349999999999920e+00 +2.925800000000000067e-01 9.851300000000000168e+00 2.219380000000000130e+00 2.987299999999999955e-01 9.904920000000000613e+00 2.225410000000000110e+00 \ No newline at end of file diff --git a/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/3_61_1640_23.748285.csv b/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/3_61_1640_23.748285.csv index 59e4cde42..6e68726d8 100644 --- a/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/3_61_1640_23.748285.csv +++ b/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/3_61_1640_23.748285.csv @@ -1,60 +1,60 @@ -2.732000000000000053e-02 2.792353740000000016e+03 3.736545000000000272e+01 -3.090000000000000038e-02 2.271702040000000125e+03 3.370239000000000118e+01 -3.452000000000000207e-02 1.788897279999999910e+03 2.990733000000000175e+01 -3.812000000000000111e-02 1.407023470000000088e+03 2.652380000000000138e+01 -4.173000000000000320e-02 1.095009520000000066e+03 2.339882000000000062e+01 -4.542000000000000204e-02 8.376734699999999521e+02 2.046549999999999869e+01 -4.644000000000000211e-02 7.836296200000000454e+02 1.979430999999999941e+01 -4.907000000000000250e-02 6.414952399999999670e+02 1.790943000000000040e+01 -5.253000000000000030e-02 5.516777200000000221e+02 1.660839999999999961e+01 -5.269999999999999685e-02 5.141714299999999866e+02 1.603388999999999953e+01 -5.628999999999999976e-02 3.988418399999999906e+02 1.412165000000000070e+01 -5.868999999999999911e-02 3.579082799999999907e+02 1.337737000000000087e+01 -5.985999999999999654e-02 3.164397999999999911e+02 1.257854999999999990e+01 -6.351999999999999313e-02 2.486343500000000120e+02 1.114976000000000056e+01 -6.481000000000000649e-02 2.482066299999999899e+02 1.114016999999999946e+01 -6.715000000000000135e-02 2.006787799999999891e+02 1.001695999999999920e+01 -7.070999999999999508e-02 1.657927200000000028e+02 9.104739999999999611e+00 -7.094000000000000306e-02 1.667760000000000105e+02 9.131700000000000372e+00 -7.431999999999999718e-02 1.326982299999999952e+02 8.145500000000000185e+00 -7.721000000000000085e-02 1.181177100000000024e+02 7.684980000000000366e+00 -7.796999999999999764e-02 1.108474499999999949e+02 7.444709999999999717e+00 -8.161999999999999811e-02 9.087302999999999997e+01 6.740660000000000096e+00 -8.343000000000000416e-02 8.290343000000000018e+01 6.438299999999999912e+00 -8.522000000000000408e-02 7.588799000000000206e+01 6.159869999999999735e+00 -8.878999999999999393e-02 6.486343999999999710e+01 5.694890000000000008e+00 -8.959000000000000297e-02 6.133471999999999724e+01 5.537810000000000343e+00 -9.568999999999999728e-02 4.711737999999999715e+01 4.853729999999999656e+00 -1.017699999999999994e-01 3.554666000000000281e+01 4.215840000000000032e+00 -1.079900000000000027e-01 2.833098000000000027e+01 3.763710000000000111e+00 -1.141599999999999976e-01 2.318925000000000125e+01 3.405089999999999950e+00 -1.202000000000000013e-01 1.876435000000000031e+01 3.063029999999999919e+00 -1.263499999999999901e-01 1.568601999999999919e+01 2.800539999999999807e+00 -1.325600000000000112e-01 1.346410000000000018e+01 2.594619999999999926e+00 -1.387700000000000045e-01 1.173840000000000039e+01 2.422639999999999905e+00 -1.449000000000000010e-01 1.054757999999999996e+01 2.296469999999999789e+00 -1.509399999999999908e-01 9.084839999999999804e+00 2.131299999999999972e+00 -1.571099999999999997e-01 8.239589999999999748e+00 2.029729999999999812e+00 -1.633300000000000030e-01 7.767660000000000231e+00 1.970739999999999936e+00 -1.695099999999999940e-01 7.631929999999999659e+00 1.953449999999999909e+00 -1.756300000000000083e-01 7.253739999999999633e+00 1.904430000000000067e+00 -1.817999999999999894e-01 6.968580000000000219e+00 1.866630000000000011e+00 -1.880100000000000104e-01 7.029829999999999579e+00 1.874810000000000088e+00 -1.941199999999999870e-01 6.805609999999999715e+00 1.844670000000000032e+00 -2.002200000000000091e-01 7.007130000000000081e+00 1.871779999999999999e+00 -2.063500000000000056e-01 7.083709999999999951e+00 1.881979999999999986e+00 -2.125299999999999967e-01 6.971890000000000143e+00 1.867070000000000007e+00 -2.186800000000000133e-01 7.549360000000000070e+00 1.942849999999999966e+00 -2.247899999999999898e-01 7.451310000000000322e+00 1.930199999999999916e+00 -2.309799999999999909e-01 7.449589999999999712e+00 1.929969999999999963e+00 -2.371999999999999942e-01 7.776720000000000077e+00 1.971889999999999921e+00 -2.433599999999999930e-01 8.157130000000000436e+00 2.019550000000000178e+00 -2.494800000000000073e-01 8.339280000000000470e+00 2.041970000000000063e+00 -2.556100000000000039e-01 8.448100000000000165e+00 2.055250000000000021e+00 -2.617700000000000027e-01 8.746420000000000528e+00 2.091219999999999857e+00 -2.679699999999999860e-01 9.040720000000000312e+00 2.126110000000000166e+00 -2.741299999999999848e-01 9.130409999999999471e+00 2.136629999999999807e+00 -2.802100000000000146e-01 9.247719999999999274e+00 2.150319999999999787e+00 -2.863700000000000134e-01 9.291150000000000020e+00 2.155359999999999943e+00 -2.925800000000000067e-01 9.640140000000000597e+00 2.195469999999999811e+00 +2.732000000000000053e-02 2.792353740000000016e+03 3.736545000000000272e+01 +3.090000000000000038e-02 2.271702040000000125e+03 3.370239000000000118e+01 +3.452000000000000207e-02 1.788897279999999910e+03 2.990733000000000175e+01 +3.812000000000000111e-02 1.407023470000000088e+03 2.652380000000000138e+01 +4.173000000000000320e-02 1.095009520000000066e+03 2.339882000000000062e+01 +4.542000000000000204e-02 8.376734699999999521e+02 2.046549999999999869e+01 +4.644000000000000211e-02 7.836296200000000454e+02 1.979430999999999941e+01 +4.907000000000000250e-02 6.414952399999999670e+02 1.790943000000000040e+01 +5.253000000000000030e-02 5.516777200000000221e+02 1.660839999999999961e+01 +5.269999999999999685e-02 5.141714299999999866e+02 1.603388999999999953e+01 +5.628999999999999976e-02 3.988418399999999906e+02 1.412165000000000070e+01 +5.868999999999999911e-02 3.579082799999999907e+02 1.337737000000000087e+01 +5.985999999999999654e-02 3.164397999999999911e+02 1.257854999999999990e+01 +6.351999999999999313e-02 2.486343500000000120e+02 1.114976000000000056e+01 +6.481000000000000649e-02 2.482066299999999899e+02 1.114016999999999946e+01 +6.715000000000000135e-02 2.006787799999999891e+02 1.001695999999999920e+01 +7.070999999999999508e-02 1.657927200000000028e+02 9.104739999999999611e+00 +7.094000000000000306e-02 1.667760000000000105e+02 9.131700000000000372e+00 +7.431999999999999718e-02 1.326982299999999952e+02 8.145500000000000185e+00 +7.721000000000000085e-02 1.181177100000000024e+02 7.684980000000000366e+00 +7.796999999999999764e-02 1.108474499999999949e+02 7.444709999999999717e+00 +8.161999999999999811e-02 9.087302999999999997e+01 6.740660000000000096e+00 +8.343000000000000416e-02 8.290343000000000018e+01 6.438299999999999912e+00 +8.522000000000000408e-02 7.588799000000000206e+01 6.159869999999999735e+00 +8.878999999999999393e-02 6.486343999999999710e+01 5.694890000000000008e+00 +8.959000000000000297e-02 6.133471999999999724e+01 5.537810000000000343e+00 +9.568999999999999728e-02 4.711737999999999715e+01 4.853729999999999656e+00 +1.017699999999999994e-01 3.554666000000000281e+01 4.215840000000000032e+00 +1.079900000000000027e-01 2.833098000000000027e+01 3.763710000000000111e+00 +1.141599999999999976e-01 2.318925000000000125e+01 3.405089999999999950e+00 +1.202000000000000013e-01 1.876435000000000031e+01 3.063029999999999919e+00 +1.263499999999999901e-01 1.568601999999999919e+01 2.800539999999999807e+00 +1.325600000000000112e-01 1.346410000000000018e+01 2.594619999999999926e+00 +1.387700000000000045e-01 1.173840000000000039e+01 2.422639999999999905e+00 +1.449000000000000010e-01 1.054757999999999996e+01 2.296469999999999789e+00 +1.509399999999999908e-01 9.084839999999999804e+00 2.131299999999999972e+00 +1.571099999999999997e-01 8.239589999999999748e+00 2.029729999999999812e+00 +1.633300000000000030e-01 7.767660000000000231e+00 1.970739999999999936e+00 +1.695099999999999940e-01 7.631929999999999659e+00 1.953449999999999909e+00 +1.756300000000000083e-01 7.253739999999999633e+00 1.904430000000000067e+00 +1.817999999999999894e-01 6.968580000000000219e+00 1.866630000000000011e+00 +1.880100000000000104e-01 7.029829999999999579e+00 1.874810000000000088e+00 +1.941199999999999870e-01 6.805609999999999715e+00 1.844670000000000032e+00 +2.002200000000000091e-01 7.007130000000000081e+00 1.871779999999999999e+00 +2.063500000000000056e-01 7.083709999999999951e+00 1.881979999999999986e+00 +2.125299999999999967e-01 6.971890000000000143e+00 1.867070000000000007e+00 +2.186800000000000133e-01 7.549360000000000070e+00 1.942849999999999966e+00 +2.247899999999999898e-01 7.451310000000000322e+00 1.930199999999999916e+00 +2.309799999999999909e-01 7.449589999999999712e+00 1.929969999999999963e+00 +2.371999999999999942e-01 7.776720000000000077e+00 1.971889999999999921e+00 +2.433599999999999930e-01 8.157130000000000436e+00 2.019550000000000178e+00 +2.494800000000000073e-01 8.339280000000000470e+00 2.041970000000000063e+00 +2.556100000000000039e-01 8.448100000000000165e+00 2.055250000000000021e+00 +2.617700000000000027e-01 8.746420000000000528e+00 2.091219999999999857e+00 +2.679699999999999860e-01 9.040720000000000312e+00 2.126110000000000166e+00 +2.741299999999999848e-01 9.130409999999999471e+00 2.136629999999999807e+00 +2.802100000000000146e-01 9.247719999999999274e+00 2.150319999999999787e+00 +2.863700000000000134e-01 9.291150000000000020e+00 2.155359999999999943e+00 +2.925800000000000067e-01 9.640140000000000597e+00 2.195469999999999811e+00 2.987299999999999955e-01 9.537290000000000489e+00 2.183720000000000105e+00 \ No newline at end of file diff --git a/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/4_103_1640_24.039675.csv b/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/4_103_1640_24.039675.csv index daf8f80a8..c33506202 100644 --- a/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/4_103_1640_24.039675.csv +++ b/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/4_103_1640_24.039675.csv @@ -1,60 +1,60 @@ -2.733000000000000013e-02 2.320909860000000208e+03 3.406544999999999845e+01 -3.090999999999999998e-02 1.910828909999999951e+03 3.090978000000000137e+01 -3.454000000000000126e-02 1.519815650000000005e+03 2.756643000000000043e+01 -3.814000000000000029e-02 1.188850680000000011e+03 2.438083999999999918e+01 -4.175000000000000239e-02 9.312768700000000308e+02 2.157865999999999929e+01 -4.544000000000000122e-02 7.201697299999999586e+02 1.897589999999999932e+01 -4.646000000000000130e-02 6.728012599999999566e+02 1.834122999999999948e+01 -4.909999999999999781e-02 5.453608799999999519e+02 1.651304000000000016e+01 -5.256000000000000255e-02 4.724414499999999748e+02 1.536946999999999974e+01 -5.272000000000000297e-02 4.318700699999999983e+02 1.469472999999999985e+01 -5.632000000000000201e-02 3.382353699999999890e+02 1.300453000000000081e+01 -5.870999999999999830e-02 3.073326000000000136e+02 1.239621999999999957e+01 -5.988999999999999879e-02 2.634156100000000151e+02 1.147639999999999993e+01 -6.356000000000000538e-02 2.076918699999999944e+02 1.019048000000000087e+01 -6.483999999999999486e-02 2.125336499999999944e+02 1.030857999999999919e+01 -6.718999999999999972e-02 1.688028199999999970e+02 9.187020000000000408e+00 -7.073999999999999733e-02 1.362696899999999971e+02 8.254379999999999384e+00 -7.097000000000000530e-02 1.410024300000000039e+02 8.396499999999999631e+00 -7.435999999999999555e-02 1.127603699999999947e+02 7.508670000000000400e+00 -7.724999999999999922e-02 9.965560999999999581e+01 7.058880000000000265e+00 -7.800999999999999601e-02 9.194693999999999789e+01 6.780369999999999564e+00 -8.165999999999999648e-02 7.522768999999999551e+01 6.133009999999999629e+00 -8.347000000000000253e-02 7.049939999999999429e+01 5.937149999999999928e+00 -8.526000000000000245e-02 6.411020000000000607e+01 5.661719999999999864e+00 -8.883000000000000618e-02 5.376234999999999786e+01 5.184709999999999930e+00 -8.963000000000000134e-02 5.217504000000000275e+01 5.107590000000000074e+00 -9.574000000000000565e-02 4.054399999999999693e+01 4.502439999999999998e+00 -1.018199999999999938e-01 3.096013999999999911e+01 3.934470000000000134e+00 -1.080399999999999971e-01 2.426012000000000057e+01 3.482819999999999805e+00 -1.142200000000000021e-01 1.991522000000000148e+01 3.155569999999999986e+00 -1.202600000000000058e-01 1.696463999999999928e+01 2.912440000000000140e+00 -1.264099999999999946e-01 1.406012999999999913e+01 2.651429999999999954e+00 -1.326199999999999879e-01 1.186475000000000080e+01 2.435649999999999871e+00 -1.388300000000000090e-01 1.075843000000000060e+01 2.319310000000000205e+00 -1.449699999999999878e-01 9.447770000000000223e+00 2.173449999999999882e+00 -1.510100000000000053e-01 8.521739999999999426e+00 2.064189999999999969e+00 -1.571799999999999864e-01 7.782460000000000377e+00 1.972620000000000040e+00 -1.634099999999999997e-01 7.576889999999999681e+00 1.946390000000000065e+00 -1.695800000000000085e-01 7.175270000000000259e+00 1.894109999999999960e+00 -1.756999999999999951e-01 6.609770000000000145e+00 1.817930000000000046e+00 -1.818799999999999861e-01 6.690150000000000041e+00 1.828950000000000076e+00 -1.880999999999999894e-01 6.763010000000000410e+00 1.838889999999999914e+00 -1.942000000000000115e-01 6.479930000000000412e+00 1.799989999999999979e+00 -2.003099999999999881e-01 6.931930000000000369e+00 1.861709999999999976e+00 -2.064499999999999946e-01 7.058690000000000353e+00 1.878649999999999931e+00 -2.126300000000000134e-01 6.966739999999999711e+00 1.866379999999999928e+00 -2.187699999999999922e-01 7.155350000000000321e+00 1.891469999999999985e+00 -2.248999999999999888e-01 7.328820000000000334e+00 1.914260000000000073e+00 -2.310800000000000076e-01 7.623789999999999623e+00 1.952409999999999979e+00 -2.373000000000000109e-01 7.870739999999999625e+00 1.983780000000000099e+00 -2.434699999999999920e-01 7.865639999999999965e+00 1.983130000000000059e+00 -2.495900000000000063e-01 8.081390000000000740e+00 2.010149999999999881e+00 -2.557300000000000129e-01 8.480309999999999349e+00 2.059159999999999879e+00 -2.618900000000000117e-01 8.708700000000000330e+00 2.086710000000000065e+00 -2.680899999999999950e-01 8.823320000000000718e+00 2.100389999999999979e+00 -2.742499999999999938e-01 9.030450000000000088e+00 2.124909999999999854e+00 -2.803300000000000236e-01 9.222670000000000812e+00 2.147400000000000198e+00 -2.864999999999999769e-01 9.345430000000000348e+00 2.161649999999999849e+00 -2.927100000000000257e-01 9.660539999999999239e+00 2.197789999999999910e+00 +2.733000000000000013e-02 2.320909860000000208e+03 3.406544999999999845e+01 +3.090999999999999998e-02 1.910828909999999951e+03 3.090978000000000137e+01 +3.454000000000000126e-02 1.519815650000000005e+03 2.756643000000000043e+01 +3.814000000000000029e-02 1.188850680000000011e+03 2.438083999999999918e+01 +4.175000000000000239e-02 9.312768700000000308e+02 2.157865999999999929e+01 +4.544000000000000122e-02 7.201697299999999586e+02 1.897589999999999932e+01 +4.646000000000000130e-02 6.728012599999999566e+02 1.834122999999999948e+01 +4.909999999999999781e-02 5.453608799999999519e+02 1.651304000000000016e+01 +5.256000000000000255e-02 4.724414499999999748e+02 1.536946999999999974e+01 +5.272000000000000297e-02 4.318700699999999983e+02 1.469472999999999985e+01 +5.632000000000000201e-02 3.382353699999999890e+02 1.300453000000000081e+01 +5.870999999999999830e-02 3.073326000000000136e+02 1.239621999999999957e+01 +5.988999999999999879e-02 2.634156100000000151e+02 1.147639999999999993e+01 +6.356000000000000538e-02 2.076918699999999944e+02 1.019048000000000087e+01 +6.483999999999999486e-02 2.125336499999999944e+02 1.030857999999999919e+01 +6.718999999999999972e-02 1.688028199999999970e+02 9.187020000000000408e+00 +7.073999999999999733e-02 1.362696899999999971e+02 8.254379999999999384e+00 +7.097000000000000530e-02 1.410024300000000039e+02 8.396499999999999631e+00 +7.435999999999999555e-02 1.127603699999999947e+02 7.508670000000000400e+00 +7.724999999999999922e-02 9.965560999999999581e+01 7.058880000000000265e+00 +7.800999999999999601e-02 9.194693999999999789e+01 6.780369999999999564e+00 +8.165999999999999648e-02 7.522768999999999551e+01 6.133009999999999629e+00 +8.347000000000000253e-02 7.049939999999999429e+01 5.937149999999999928e+00 +8.526000000000000245e-02 6.411020000000000607e+01 5.661719999999999864e+00 +8.883000000000000618e-02 5.376234999999999786e+01 5.184709999999999930e+00 +8.963000000000000134e-02 5.217504000000000275e+01 5.107590000000000074e+00 +9.574000000000000565e-02 4.054399999999999693e+01 4.502439999999999998e+00 +1.018199999999999938e-01 3.096013999999999911e+01 3.934470000000000134e+00 +1.080399999999999971e-01 2.426012000000000057e+01 3.482819999999999805e+00 +1.142200000000000021e-01 1.991522000000000148e+01 3.155569999999999986e+00 +1.202600000000000058e-01 1.696463999999999928e+01 2.912440000000000140e+00 +1.264099999999999946e-01 1.406012999999999913e+01 2.651429999999999954e+00 +1.326199999999999879e-01 1.186475000000000080e+01 2.435649999999999871e+00 +1.388300000000000090e-01 1.075843000000000060e+01 2.319310000000000205e+00 +1.449699999999999878e-01 9.447770000000000223e+00 2.173449999999999882e+00 +1.510100000000000053e-01 8.521739999999999426e+00 2.064189999999999969e+00 +1.571799999999999864e-01 7.782460000000000377e+00 1.972620000000000040e+00 +1.634099999999999997e-01 7.576889999999999681e+00 1.946390000000000065e+00 +1.695800000000000085e-01 7.175270000000000259e+00 1.894109999999999960e+00 +1.756999999999999951e-01 6.609770000000000145e+00 1.817930000000000046e+00 +1.818799999999999861e-01 6.690150000000000041e+00 1.828950000000000076e+00 +1.880999999999999894e-01 6.763010000000000410e+00 1.838889999999999914e+00 +1.942000000000000115e-01 6.479930000000000412e+00 1.799989999999999979e+00 +2.003099999999999881e-01 6.931930000000000369e+00 1.861709999999999976e+00 +2.064499999999999946e-01 7.058690000000000353e+00 1.878649999999999931e+00 +2.126300000000000134e-01 6.966739999999999711e+00 1.866379999999999928e+00 +2.187699999999999922e-01 7.155350000000000321e+00 1.891469999999999985e+00 +2.248999999999999888e-01 7.328820000000000334e+00 1.914260000000000073e+00 +2.310800000000000076e-01 7.623789999999999623e+00 1.952409999999999979e+00 +2.373000000000000109e-01 7.870739999999999625e+00 1.983780000000000099e+00 +2.434699999999999920e-01 7.865639999999999965e+00 1.983130000000000059e+00 +2.495900000000000063e-01 8.081390000000000740e+00 2.010149999999999881e+00 +2.557300000000000129e-01 8.480309999999999349e+00 2.059159999999999879e+00 +2.618900000000000117e-01 8.708700000000000330e+00 2.086710000000000065e+00 +2.680899999999999950e-01 8.823320000000000718e+00 2.100389999999999979e+00 +2.742499999999999938e-01 9.030450000000000088e+00 2.124909999999999854e+00 +2.803300000000000236e-01 9.222670000000000812e+00 2.147400000000000198e+00 +2.864999999999999769e-01 9.345430000000000348e+00 2.161649999999999849e+00 +2.927100000000000257e-01 9.660539999999999239e+00 2.197789999999999910e+00 2.988600000000000145e-01 9.559969999999999857e+00 2.186319999999999819e+00 \ No newline at end of file diff --git a/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/5_312_1640_24.331065.csv b/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/5_312_1640_24.331065.csv index 2f696f3b5..17968ec9e 100644 --- a/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/5_312_1640_24.331065.csv +++ b/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/5_312_1640_24.331065.csv @@ -1,60 +1,60 @@ -2.733000000000000013e-02 1.791495509999999967e+03 2.992905000000000015e+01 -3.091999999999999957e-02 1.477992469999999912e+03 2.718449000000000026e+01 -3.454000000000000126e-02 1.172791189999999915e+03 2.421561000000000163e+01 -3.814000000000000029e-02 9.196233300000000099e+02 2.144322000000000017e+01 -4.175000000000000239e-02 7.160111200000000053e+02 1.892102999999999824e+01 -4.544000000000000122e-02 5.391461900000000469e+02 1.641867999999999839e+01 -4.646000000000000130e-02 4.929036699999999769e+02 1.569877999999999929e+01 -4.909999999999999781e-02 4.129331099999999992e+02 1.436894000000000027e+01 -5.256000000000000255e-02 3.482022600000000239e+02 1.319473999999999947e+01 -5.272999999999999909e-02 3.242194700000000012e+02 1.273222999999999949e+01 -5.632000000000000201e-02 2.454095199999999863e+02 1.107722000000000051e+01 -5.870999999999999830e-02 2.218204599999999971e+02 1.053139000000000003e+01 -5.990000000000000185e-02 1.931666899999999885e+02 9.827680000000000859e+00 -6.356000000000000538e-02 1.505020900000000097e+02 8.674739999999999895e+00 -6.483999999999999486e-02 1.511605900000000133e+02 8.693690000000000140e+00 -6.718999999999999972e-02 1.202856799999999993e+02 7.755180000000000184e+00 -7.074999999999999345e-02 9.616129999999999711e+01 6.934020000000000294e+00 -7.097000000000000530e-02 9.870516999999999541e+01 7.025140000000000384e+00 -7.435999999999999555e-02 7.818730999999999653e+01 6.252489999999999881e+00 -7.724999999999999922e-02 6.837958000000000425e+01 5.847199999999999953e+00 -7.802000000000000601e-02 6.371482000000000312e+01 5.644239999999999924e+00 -8.165999999999999648e-02 5.179379999999999740e+01 5.088899999999999757e+00 -8.347000000000000253e-02 4.836007000000000033e+01 4.917320000000000135e+00 -8.526999999999999857e-02 4.457972000000000179e+01 4.721210000000000129e+00 -8.884000000000000230e-02 3.751116999999999990e+01 4.330770000000000231e+00 -8.963000000000000134e-02 3.544118999999999886e+01 4.209579999999999878e+00 -9.574000000000000565e-02 2.739192999999999856e+01 3.700810000000000155e+00 -1.018199999999999938e-01 2.084316000000000102e+01 3.228250000000000064e+00 -1.080399999999999971e-01 1.702296000000000120e+01 2.917440000000000033e+00 -1.142200000000000021e-01 1.391883999999999943e+01 2.638069999999999915e+00 -1.202600000000000058e-01 1.148202000000000034e+01 2.396040000000000170e+00 -1.264099999999999946e-01 9.887589999999999435e+00 2.223460000000000214e+00 -1.326199999999999879e-01 8.618710000000000093e+00 2.075899999999999856e+00 -1.388300000000000090e-01 7.875820000000000043e+00 1.984420000000000073e+00 -1.449699999999999878e-01 7.119869999999999699e+00 1.886779999999999902e+00 -1.510100000000000053e-01 6.691399999999999793e+00 1.829129999999999923e+00 -1.571799999999999864e-01 6.133020000000000138e+00 1.751139999999999919e+00 -1.634099999999999997e-01 5.984770000000000145e+00 1.729850000000000110e+00 -1.695800000000000085e-01 5.802669999999999995e+00 1.703330000000000011e+00 -1.756999999999999951e-01 5.772070000000000256e+00 1.698830000000000062e+00 -1.818799999999999861e-01 5.866640000000000299e+00 1.712690000000000046e+00 -1.880999999999999894e-01 5.880740000000000300e+00 1.714749999999999996e+00 -1.942000000000000115e-01 5.856810000000000294e+00 1.711260000000000003e+00 -2.003099999999999881e-01 6.138060000000000294e+00 1.751870000000000038e+00 -2.064499999999999946e-01 6.406990000000000407e+00 1.789830000000000032e+00 -2.126300000000000134e-01 6.462060000000000137e+00 1.797509999999999941e+00 -2.187699999999999922e-01 6.501079999999999970e+00 1.802929999999999922e+00 -2.248999999999999888e-01 6.991179999999999950e+00 1.869650000000000034e+00 -2.310800000000000076e-01 7.014639999999999986e+00 1.872779999999999889e+00 -2.373000000000000109e-01 7.136879999999999669e+00 1.889029999999999987e+00 -2.434699999999999920e-01 7.547889999999999766e+00 1.942660000000000053e+00 -2.495900000000000063e-01 7.608620000000000161e+00 1.950460000000000083e+00 -2.557300000000000129e-01 7.913459999999999717e+00 1.989149999999999974e+00 -2.618900000000000117e-01 8.245919999999999916e+00 2.030510000000000037e+00 -2.680899999999999950e-01 8.604509999999999437e+00 2.074190000000000200e+00 -2.742499999999999938e-01 8.711750000000000327e+00 2.087070000000000203e+00 -2.803300000000000236e-01 8.863739999999999952e+00 2.105199999999999960e+00 -2.864999999999999769e-01 8.911099999999999355e+00 2.110819999999999919e+00 -2.927100000000000257e-01 9.338430000000000675e+00 2.160839999999999872e+00 +2.733000000000000013e-02 1.791495509999999967e+03 2.992905000000000015e+01 +3.091999999999999957e-02 1.477992469999999912e+03 2.718449000000000026e+01 +3.454000000000000126e-02 1.172791189999999915e+03 2.421561000000000163e+01 +3.814000000000000029e-02 9.196233300000000099e+02 2.144322000000000017e+01 +4.175000000000000239e-02 7.160111200000000053e+02 1.892102999999999824e+01 +4.544000000000000122e-02 5.391461900000000469e+02 1.641867999999999839e+01 +4.646000000000000130e-02 4.929036699999999769e+02 1.569877999999999929e+01 +4.909999999999999781e-02 4.129331099999999992e+02 1.436894000000000027e+01 +5.256000000000000255e-02 3.482022600000000239e+02 1.319473999999999947e+01 +5.272999999999999909e-02 3.242194700000000012e+02 1.273222999999999949e+01 +5.632000000000000201e-02 2.454095199999999863e+02 1.107722000000000051e+01 +5.870999999999999830e-02 2.218204599999999971e+02 1.053139000000000003e+01 +5.990000000000000185e-02 1.931666899999999885e+02 9.827680000000000859e+00 +6.356000000000000538e-02 1.505020900000000097e+02 8.674739999999999895e+00 +6.483999999999999486e-02 1.511605900000000133e+02 8.693690000000000140e+00 +6.718999999999999972e-02 1.202856799999999993e+02 7.755180000000000184e+00 +7.074999999999999345e-02 9.616129999999999711e+01 6.934020000000000294e+00 +7.097000000000000530e-02 9.870516999999999541e+01 7.025140000000000384e+00 +7.435999999999999555e-02 7.818730999999999653e+01 6.252489999999999881e+00 +7.724999999999999922e-02 6.837958000000000425e+01 5.847199999999999953e+00 +7.802000000000000601e-02 6.371482000000000312e+01 5.644239999999999924e+00 +8.165999999999999648e-02 5.179379999999999740e+01 5.088899999999999757e+00 +8.347000000000000253e-02 4.836007000000000033e+01 4.917320000000000135e+00 +8.526999999999999857e-02 4.457972000000000179e+01 4.721210000000000129e+00 +8.884000000000000230e-02 3.751116999999999990e+01 4.330770000000000231e+00 +8.963000000000000134e-02 3.544118999999999886e+01 4.209579999999999878e+00 +9.574000000000000565e-02 2.739192999999999856e+01 3.700810000000000155e+00 +1.018199999999999938e-01 2.084316000000000102e+01 3.228250000000000064e+00 +1.080399999999999971e-01 1.702296000000000120e+01 2.917440000000000033e+00 +1.142200000000000021e-01 1.391883999999999943e+01 2.638069999999999915e+00 +1.202600000000000058e-01 1.148202000000000034e+01 2.396040000000000170e+00 +1.264099999999999946e-01 9.887589999999999435e+00 2.223460000000000214e+00 +1.326199999999999879e-01 8.618710000000000093e+00 2.075899999999999856e+00 +1.388300000000000090e-01 7.875820000000000043e+00 1.984420000000000073e+00 +1.449699999999999878e-01 7.119869999999999699e+00 1.886779999999999902e+00 +1.510100000000000053e-01 6.691399999999999793e+00 1.829129999999999923e+00 +1.571799999999999864e-01 6.133020000000000138e+00 1.751139999999999919e+00 +1.634099999999999997e-01 5.984770000000000145e+00 1.729850000000000110e+00 +1.695800000000000085e-01 5.802669999999999995e+00 1.703330000000000011e+00 +1.756999999999999951e-01 5.772070000000000256e+00 1.698830000000000062e+00 +1.818799999999999861e-01 5.866640000000000299e+00 1.712690000000000046e+00 +1.880999999999999894e-01 5.880740000000000300e+00 1.714749999999999996e+00 +1.942000000000000115e-01 5.856810000000000294e+00 1.711260000000000003e+00 +2.003099999999999881e-01 6.138060000000000294e+00 1.751870000000000038e+00 +2.064499999999999946e-01 6.406990000000000407e+00 1.789830000000000032e+00 +2.126300000000000134e-01 6.462060000000000137e+00 1.797509999999999941e+00 +2.187699999999999922e-01 6.501079999999999970e+00 1.802929999999999922e+00 +2.248999999999999888e-01 6.991179999999999950e+00 1.869650000000000034e+00 +2.310800000000000076e-01 7.014639999999999986e+00 1.872779999999999889e+00 +2.373000000000000109e-01 7.136879999999999669e+00 1.889029999999999987e+00 +2.434699999999999920e-01 7.547889999999999766e+00 1.942660000000000053e+00 +2.495900000000000063e-01 7.608620000000000161e+00 1.950460000000000083e+00 +2.557300000000000129e-01 7.913459999999999717e+00 1.989149999999999974e+00 +2.618900000000000117e-01 8.245919999999999916e+00 2.030510000000000037e+00 +2.680899999999999950e-01 8.604509999999999437e+00 2.074190000000000200e+00 +2.742499999999999938e-01 8.711750000000000327e+00 2.087070000000000203e+00 +2.803300000000000236e-01 8.863739999999999952e+00 2.105199999999999960e+00 +2.864999999999999769e-01 8.911099999999999355e+00 2.110819999999999919e+00 +2.927100000000000257e-01 9.338430000000000675e+00 2.160839999999999872e+00 2.988600000000000145e-01 9.385640000000000427e+00 2.166290000000000049e+00 \ No newline at end of file diff --git a/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/6_1270_1640_24.331065.csv b/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/6_1270_1640_24.331065.csv index e7dfab999..72272ed89 100644 --- a/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/6_1270_1640_24.331065.csv +++ b/test/trend_test_data/Nanoperm_perpendicular_Honecker_et_al/6_1270_1640_24.331065.csv @@ -1,60 +1,60 @@ -2.732000000000000053e-02 1.517870979999999918e+03 2.754878000000000071e+01 -3.090999999999999998e-02 1.252144950000000108e+03 2.502143999999999835e+01 -3.452999999999999819e-02 9.849326300000000174e+02 2.219157999999999831e+01 -3.812999999999999723e-02 7.635778900000000249e+02 1.953941999999999979e+01 -4.173999999999999932e-02 5.910564900000000534e+02 1.719093000000000160e+01 -4.542999999999999816e-02 4.454160299999999779e+02 1.492340000000000089e+01 -4.644000000000000211e-02 4.097451399999999921e+02 1.431337000000000081e+01 -4.907999999999999863e-02 3.412573399999999992e+02 1.306249000000000038e+01 -5.254000000000000337e-02 2.833860500000000116e+02 1.190348999999999968e+01 -5.270999999999999991e-02 2.587516299999999774e+02 1.137434999999999974e+01 -5.630000000000000282e-02 1.972410900000000140e+02 9.930790000000000006e+00 -5.868999999999999911e-02 1.820288400000000024e+02 9.540150000000000574e+00 -5.988000000000000267e-02 1.548462399999999946e+02 8.799039999999999750e+00 -6.353999999999999926e-02 1.208091600000000057e+02 7.772039999999999615e+00 -6.481000000000000649e-02 1.228846300000000014e+02 7.838510000000000311e+00 -6.716999999999999360e-02 9.485747999999999536e+01 6.886849999999999916e+00 -7.072000000000000508e-02 7.616365000000000407e+01 6.171050000000000146e+00 -7.094999999999999918e-02 7.959243999999999630e+01 6.308419999999999916e+00 -7.434000000000000330e-02 6.139544999999999675e+01 5.540549999999999642e+00 -7.721999999999999698e-02 5.528307999999999822e+01 5.257520000000000415e+00 -7.799000000000000377e-02 5.105310999999999666e+01 5.052380000000000315e+00 -8.164000000000000423e-02 4.131436000000000064e+01 4.545020000000000060e+00 -8.343000000000000416e-02 3.883191999999999666e+01 4.406349999999999767e+00 -8.523999999999999633e-02 3.386838999999999800e+01 4.115120000000000111e+00 -8.881000000000000005e-02 2.873742000000000019e+01 3.790610000000000035e+00 -8.959999999999999909e-02 2.744166999999999845e+01 3.704159999999999897e+00 -9.569999999999999341e-02 2.114314999999999856e+01 3.251399999999999846e+00 -1.017799999999999955e-01 1.639198000000000022e+01 2.862859999999999960e+00 -1.079999999999999988e-01 1.302345000000000041e+01 2.551810000000000134e+00 -1.141699999999999937e-01 1.067233000000000054e+01 2.310010000000000119e+00 -1.202099999999999974e-01 8.927680000000000504e+00 2.112779999999999880e+00 -1.263600000000000001e-01 7.691300000000000026e+00 1.961030000000000051e+00 -1.325600000000000112e-01 6.633219999999999672e+00 1.821159999999999890e+00 -1.387799999999999867e-01 6.187759999999999927e+00 1.758939999999999948e+00 -1.449100000000000110e-01 5.397269999999999790e+00 1.642749999999999932e+00 -1.509500000000000008e-01 5.127299999999999969e+00 1.601140000000000008e+00 -1.571200000000000097e-01 4.947350000000000136e+00 1.572789999999999910e+00 -1.633400000000000130e-01 4.791970000000000063e+00 1.547900000000000054e+00 -1.695200000000000040e-01 4.839830000000000076e+00 1.555609999999999937e+00 -1.756399999999999906e-01 4.855599999999999916e+00 1.558140000000000081e+00 -1.818099999999999994e-01 4.971189999999999998e+00 1.576580000000000092e+00 -1.880199999999999927e-01 4.996179999999999843e+00 1.580540000000000056e+00 -1.941299999999999970e-01 5.231489999999999974e+00 1.617329999999999934e+00 -2.002299999999999913e-01 5.461660000000000181e+00 1.652519999999999989e+00 -2.063699999999999979e-01 5.566430000000000433e+00 1.668299999999999894e+00 -2.125400000000000067e-01 5.749649999999999928e+00 1.695529999999999982e+00 -2.186899999999999955e-01 5.962720000000000020e+00 1.726660000000000084e+00 -2.248100000000000098e-01 6.366220000000000212e+00 1.784129999999999994e+00 -2.309900000000000009e-01 6.576419999999999710e+00 1.813339999999999952e+00 -2.372100000000000042e-01 6.993730000000000224e+00 1.869990000000000041e+00 -2.433800000000000130e-01 7.112300000000000288e+00 1.885780000000000012e+00 -2.494999999999999996e-01 7.346860000000000390e+00 1.916619999999999990e+00 -2.556300000000000239e-01 7.629410000000000025e+00 1.953130000000000033e+00 -2.617900000000000227e-01 7.827810000000000379e+00 1.978359999999999896e+00 -2.679900000000000060e-01 8.252810000000000201e+00 2.031359999999999832e+00 -2.741399999999999948e-01 8.304840000000000444e+00 2.037749999999999950e+00 -2.802200000000000246e-01 8.705450000000000799e+00 2.086320000000000174e+00 -2.863899999999999779e-01 8.881330000000000169e+00 2.107289999999999885e+00 -2.926000000000000267e-01 9.112230000000000274e+00 2.134510000000000129e+00 -2.987500000000000155e-01 9.303969999999999629e+00 2.156849999999999934e+00 +2.732000000000000053e-02 1.517870979999999918e+03 2.754878000000000071e+01 +3.090999999999999998e-02 1.252144950000000108e+03 2.502143999999999835e+01 +3.452999999999999819e-02 9.849326300000000174e+02 2.219157999999999831e+01 +3.812999999999999723e-02 7.635778900000000249e+02 1.953941999999999979e+01 +4.173999999999999932e-02 5.910564900000000534e+02 1.719093000000000160e+01 +4.542999999999999816e-02 4.454160299999999779e+02 1.492340000000000089e+01 +4.644000000000000211e-02 4.097451399999999921e+02 1.431337000000000081e+01 +4.907999999999999863e-02 3.412573399999999992e+02 1.306249000000000038e+01 +5.254000000000000337e-02 2.833860500000000116e+02 1.190348999999999968e+01 +5.270999999999999991e-02 2.587516299999999774e+02 1.137434999999999974e+01 +5.630000000000000282e-02 1.972410900000000140e+02 9.930790000000000006e+00 +5.868999999999999911e-02 1.820288400000000024e+02 9.540150000000000574e+00 +5.988000000000000267e-02 1.548462399999999946e+02 8.799039999999999750e+00 +6.353999999999999926e-02 1.208091600000000057e+02 7.772039999999999615e+00 +6.481000000000000649e-02 1.228846300000000014e+02 7.838510000000000311e+00 +6.716999999999999360e-02 9.485747999999999536e+01 6.886849999999999916e+00 +7.072000000000000508e-02 7.616365000000000407e+01 6.171050000000000146e+00 +7.094999999999999918e-02 7.959243999999999630e+01 6.308419999999999916e+00 +7.434000000000000330e-02 6.139544999999999675e+01 5.540549999999999642e+00 +7.721999999999999698e-02 5.528307999999999822e+01 5.257520000000000415e+00 +7.799000000000000377e-02 5.105310999999999666e+01 5.052380000000000315e+00 +8.164000000000000423e-02 4.131436000000000064e+01 4.545020000000000060e+00 +8.343000000000000416e-02 3.883191999999999666e+01 4.406349999999999767e+00 +8.523999999999999633e-02 3.386838999999999800e+01 4.115120000000000111e+00 +8.881000000000000005e-02 2.873742000000000019e+01 3.790610000000000035e+00 +8.959999999999999909e-02 2.744166999999999845e+01 3.704159999999999897e+00 +9.569999999999999341e-02 2.114314999999999856e+01 3.251399999999999846e+00 +1.017799999999999955e-01 1.639198000000000022e+01 2.862859999999999960e+00 +1.079999999999999988e-01 1.302345000000000041e+01 2.551810000000000134e+00 +1.141699999999999937e-01 1.067233000000000054e+01 2.310010000000000119e+00 +1.202099999999999974e-01 8.927680000000000504e+00 2.112779999999999880e+00 +1.263600000000000001e-01 7.691300000000000026e+00 1.961030000000000051e+00 +1.325600000000000112e-01 6.633219999999999672e+00 1.821159999999999890e+00 +1.387799999999999867e-01 6.187759999999999927e+00 1.758939999999999948e+00 +1.449100000000000110e-01 5.397269999999999790e+00 1.642749999999999932e+00 +1.509500000000000008e-01 5.127299999999999969e+00 1.601140000000000008e+00 +1.571200000000000097e-01 4.947350000000000136e+00 1.572789999999999910e+00 +1.633400000000000130e-01 4.791970000000000063e+00 1.547900000000000054e+00 +1.695200000000000040e-01 4.839830000000000076e+00 1.555609999999999937e+00 +1.756399999999999906e-01 4.855599999999999916e+00 1.558140000000000081e+00 +1.818099999999999994e-01 4.971189999999999998e+00 1.576580000000000092e+00 +1.880199999999999927e-01 4.996179999999999843e+00 1.580540000000000056e+00 +1.941299999999999970e-01 5.231489999999999974e+00 1.617329999999999934e+00 +2.002299999999999913e-01 5.461660000000000181e+00 1.652519999999999989e+00 +2.063699999999999979e-01 5.566430000000000433e+00 1.668299999999999894e+00 +2.125400000000000067e-01 5.749649999999999928e+00 1.695529999999999982e+00 +2.186899999999999955e-01 5.962720000000000020e+00 1.726660000000000084e+00 +2.248100000000000098e-01 6.366220000000000212e+00 1.784129999999999994e+00 +2.309900000000000009e-01 6.576419999999999710e+00 1.813339999999999952e+00 +2.372100000000000042e-01 6.993730000000000224e+00 1.869990000000000041e+00 +2.433800000000000130e-01 7.112300000000000288e+00 1.885780000000000012e+00 +2.494999999999999996e-01 7.346860000000000390e+00 1.916619999999999990e+00 +2.556300000000000239e-01 7.629410000000000025e+00 1.953130000000000033e+00 +2.617900000000000227e-01 7.827810000000000379e+00 1.978359999999999896e+00 +2.679900000000000060e-01 8.252810000000000201e+00 2.031359999999999832e+00 +2.741399999999999948e-01 8.304840000000000444e+00 2.037749999999999950e+00 +2.802200000000000246e-01 8.705450000000000799e+00 2.086320000000000174e+00 +2.863899999999999779e-01 8.881330000000000169e+00 2.107289999999999885e+00 +2.926000000000000267e-01 9.112230000000000274e+00 2.134510000000000129e+00 +2.987500000000000155e-01 9.303969999999999629e+00 2.156849999999999934e+00 diff --git a/test/trend_test_data/NdFeB_parallel_Bick_et_al/1_8000_1600_1070.csv b/test/trend_test_data/NdFeB_parallel_Bick_et_al/1_8000_1600_1070.csv index 48bb9bce9..efaf03f7e 100644 --- a/test/trend_test_data/NdFeB_parallel_Bick_et_al/1_8000_1600_1070.csv +++ b/test/trend_test_data/NdFeB_parallel_Bick_et_al/1_8000_1600_1070.csv @@ -1,53 +1,53 @@ -0.02466 11161.7 105.066 -0.02779 8582.24 78.8702 -0.03118 6929.14 63.4309 -0.03472 5567.83 52.0489 -0.03798 4896.87 48.9428 -0.04103 4301.45 44.2537 -0.04439 3931.56 35.32 -0.04789 3532.24 33.8506 -0.05145 3225.93 29.1479 -0.05487 3001.52 30.0366 -0.05809 2808.67 26.8966 -0.06147 2656.59 24.6464 -0.06487 2544.49 24.3544 -0.06823 2417.04 22.1946 -0.07159 2285.04 21.753 -0.07491 2209.24 20.4624 -0.07817 2057.47 19.703 -0.08149 2022.7 18.6311 -0.08492 1895.55 17.4353 -0.08832 1842.28 17.2068 -0.09171 1764.56 16.4013 -0.09497 1702.47 16.2564 -0.09818 1650.68 15.7993 -0.10176 1598.61 13.5448 -0.10537 1517.07 14.6455 -0.10864 1470.19 13.6872 -0.11191 1422.64 13.7771 -0.11529 1373.82 12.5952 -0.11874 1333.67 12.468 -0.12204 1309.38 12.7116 -0.1253 1256.04 11.6755 -0.12868 1224.03 11.535 -0.13213 1180.94 10.9145 -0.13557 1163.16 10.9427 -0.13878 1135.89 11.2995 -0.14204 1129.91 10.3422 -0.14544 1101.7 10.3463 -0.14888 1050.46 9.68171 -0.1523 1034.3 9.79525 -0.15558 1022.51 9.86417 -0.15895 1003.15 9.06883 -0.16231 984.02 9.61305 -0.16567 956.076 8.69603 -0.16916 941.039 8.81872 -0.17256 914.22 8.5457 -0.1759 903.557 8.49062 -0.1792 862.822 8.49027 -0.18246 857.39 8.12443 -0.18596 822.372 7.58423 -0.18945 803.539 7.77639 -0.19275 787.933 7.6279 -0.19605 759.06 7.64242 -0.1993 746.444 7.32989 +0.02466 11161.7 105.066 +0.02779 8582.24 78.8702 +0.03118 6929.14 63.4309 +0.03472 5567.83 52.0489 +0.03798 4896.87 48.9428 +0.04103 4301.45 44.2537 +0.04439 3931.56 35.32 +0.04789 3532.24 33.8506 +0.05145 3225.93 29.1479 +0.05487 3001.52 30.0366 +0.05809 2808.67 26.8966 +0.06147 2656.59 24.6464 +0.06487 2544.49 24.3544 +0.06823 2417.04 22.1946 +0.07159 2285.04 21.753 +0.07491 2209.24 20.4624 +0.07817 2057.47 19.703 +0.08149 2022.7 18.6311 +0.08492 1895.55 17.4353 +0.08832 1842.28 17.2068 +0.09171 1764.56 16.4013 +0.09497 1702.47 16.2564 +0.09818 1650.68 15.7993 +0.10176 1598.61 13.5448 +0.10537 1517.07 14.6455 +0.10864 1470.19 13.6872 +0.11191 1422.64 13.7771 +0.11529 1373.82 12.5952 +0.11874 1333.67 12.468 +0.12204 1309.38 12.7116 +0.1253 1256.04 11.6755 +0.12868 1224.03 11.535 +0.13213 1180.94 10.9145 +0.13557 1163.16 10.9427 +0.13878 1135.89 11.2995 +0.14204 1129.91 10.3422 +0.14544 1101.7 10.3463 +0.14888 1050.46 9.68171 +0.1523 1034.3 9.79525 +0.15558 1022.51 9.86417 +0.15895 1003.15 9.06883 +0.16231 984.02 9.61305 +0.16567 956.076 8.69603 +0.16916 941.039 8.81872 +0.17256 914.22 8.5457 +0.1759 903.557 8.49062 +0.1792 862.822 8.49027 +0.18246 857.39 8.12443 +0.18596 822.372 7.58423 +0.18945 803.539 7.77639 +0.19275 787.933 7.6279 +0.19605 759.06 7.64242 +0.1993 746.444 7.32989 diff --git a/test/trend_test_data/NdFeB_parallel_Bick_et_al/2_10000_1600_1070.csv b/test/trend_test_data/NdFeB_parallel_Bick_et_al/2_10000_1600_1070.csv index 2464d9ffa..ede4f8121 100644 --- a/test/trend_test_data/NdFeB_parallel_Bick_et_al/2_10000_1600_1070.csv +++ b/test/trend_test_data/NdFeB_parallel_Bick_et_al/2_10000_1600_1070.csv @@ -1,53 +1,53 @@ -0.02466 9785.87 100.498 -0.02779 7387.61 74.8808 -0.03118 5638.9 58.6706 -0.03472 4473.77 47.7572 -0.03797 3723.19 43.7134 -0.04102 3256.4 39.3915 -0.04439 2850.7 30.7019 -0.04789 2561.59 29.3595 -0.05145 2280.01 24.9612 -0.05487 2158.85 25.8372 -0.05809 1997.24 23.0262 -0.06147 1891.61 21.0832 -0.06486 1796.03 20.6896 -0.06823 1698.02 18.8045 -0.07158 1613.84 18.4277 -0.0749 1560.07 17.3367 -0.07817 1481.58 16.8421 -0.08149 1400.5 15.6189 -0.08492 1362.71 14.8771 -0.08832 1326.21 14.6884 -0.09171 1308.1 14.1935 -0.09497 1238.48 13.9232 -0.09817 1217.12 13.6217 -0.10176 1182.01 11.7148 -0.10536 1125.29 12.6688 -0.10863 1086.39 11.8029 -0.1119 1069.27 11.9783 -0.11528 1037.53 10.9946 -0.11874 1000.25 10.8391 -0.12203 1030.21 11.3207 -0.12529 996.562 10.4091 -0.12867 937.635 10.1418 -0.13213 932.787 9.7458 -0.13557 936.093 9.83598 -0.13878 902.903 10.118 -0.14204 895.331 9.2379 -0.14544 894.523 9.3444 -0.14887 873.213 8.84172 -0.15229 870.028 8.99453 -0.15558 846.466 8.9992 -0.15895 842.358 8.32813 -0.1623 809.53 8.74144 -0.16566 822.783 8.08431 -0.16915 792.943 8.10552 -0.17255 774.308 7.87783 -0.1759 781.539 7.90816 -0.17919 756.562 7.97296 -0.18245 745.925 7.59066 -0.18596 725.982 7.13904 -0.18944 711.483 7.3287 -0.19275 709.157 7.24903 -0.19604 677.704 7.2411 -0.19929 659.648 6.90112 +0.02466 9785.87 100.498 +0.02779 7387.61 74.8808 +0.03118 5638.9 58.6706 +0.03472 4473.77 47.7572 +0.03797 3723.19 43.7134 +0.04102 3256.4 39.3915 +0.04439 2850.7 30.7019 +0.04789 2561.59 29.3595 +0.05145 2280.01 24.9612 +0.05487 2158.85 25.8372 +0.05809 1997.24 23.0262 +0.06147 1891.61 21.0832 +0.06486 1796.03 20.6896 +0.06823 1698.02 18.8045 +0.07158 1613.84 18.4277 +0.0749 1560.07 17.3367 +0.07817 1481.58 16.8421 +0.08149 1400.5 15.6189 +0.08492 1362.71 14.8771 +0.08832 1326.21 14.6884 +0.09171 1308.1 14.1935 +0.09497 1238.48 13.9232 +0.09817 1217.12 13.6217 +0.10176 1182.01 11.7148 +0.10536 1125.29 12.6688 +0.10863 1086.39 11.8029 +0.1119 1069.27 11.9783 +0.11528 1037.53 10.9946 +0.11874 1000.25 10.8391 +0.12203 1030.21 11.3207 +0.12529 996.562 10.4091 +0.12867 937.635 10.1418 +0.13213 932.787 9.7458 +0.13557 936.093 9.83598 +0.13878 902.903 10.118 +0.14204 895.331 9.2379 +0.14544 894.523 9.3444 +0.14887 873.213 8.84172 +0.15229 870.028 8.99453 +0.15558 846.466 8.9992 +0.15895 842.358 8.32813 +0.1623 809.53 8.74144 +0.16566 822.783 8.08431 +0.16915 792.943 8.10552 +0.17255 774.308 7.87783 +0.1759 781.539 7.90816 +0.17919 756.562 7.97296 +0.18245 745.925 7.59066 +0.18596 725.982 7.13904 +0.18944 711.483 7.3287 +0.19275 709.157 7.24903 +0.19604 677.704 7.2411 +0.19929 659.648 6.90112 diff --git a/test/trend_test_data/NdFeB_parallel_Bick_et_al/3_12000_1600_1070.csv b/test/trend_test_data/NdFeB_parallel_Bick_et_al/3_12000_1600_1070.csv index 517a96859..1c96f3d5f 100644 --- a/test/trend_test_data/NdFeB_parallel_Bick_et_al/3_12000_1600_1070.csv +++ b/test/trend_test_data/NdFeB_parallel_Bick_et_al/3_12000_1600_1070.csv @@ -1,53 +1,53 @@ -0.02467 9119.79 98.2483 -0.02779 6716.34 72.6007 -0.03118 4992.66 56.2161 -0.03472 3831.98 45.1388 -0.03798 3145.6 40.9924 -0.04103 2635.02 36.2785 -0.0444 2353.33 28.4064 -0.04789 2051.02 26.7601 -0.05146 1820.51 22.7202 -0.05487 1702.5 23.3101 -0.0581 1582.43 20.8224 -0.06148 1455.78 18.7977 -0.06487 1396.8 18.5029 -0.06824 1347.58 16.9495 -0.07159 1258.02 16.4371 -0.07491 1231.28 15.5554 -0.07818 1164.47 15.0776 -0.0815 1146.97 14.2378 -0.08493 1109.77 13.533 -0.08833 1040.08 13.1167 -0.09172 1030.03 12.6919 -0.09498 996.502 12.5769 -0.09819 973.153 12.2625 -0.10178 933.855 10.4847 -0.10538 941.324 11.6421 -0.10865 891.14 10.747 -0.11192 890.927 10.9919 -0.1153 863.999 10.0862 -0.11876 860.652 10.1051 -0.12205 833.905 10.2392 -0.12531 831.414 9.54046 -0.12869 796.354 9.38666 -0.13215 809.376 9.11842 -0.13559 805.133 9.14629 -0.1388 791.474 9.50691 -0.14205 787.287 8.69915 -0.14546 761.22 8.65866 -0.1489 779.201 8.38098 -0.15232 771.323 8.50152 -0.1556 748.08 8.49235 -0.15897 748.238 7.8713 -0.16233 756.864 8.48551 -0.16569 723.545 7.61209 -0.16918 723.039 7.76626 -0.17258 714.249 7.58349 -0.17592 707.068 7.55031 -0.17922 695.999 7.67253 -0.18248 687.854 7.31121 -0.18599 672.503 6.89206 -0.18947 656.046 7.05985 -0.19277 644.64 6.93548 -0.19607 633.62 7.0287 -0.19932 617.369 6.7009 +0.02467 9119.79 98.2483 +0.02779 6716.34 72.6007 +0.03118 4992.66 56.2161 +0.03472 3831.98 45.1388 +0.03798 3145.6 40.9924 +0.04103 2635.02 36.2785 +0.0444 2353.33 28.4064 +0.04789 2051.02 26.7601 +0.05146 1820.51 22.7202 +0.05487 1702.5 23.3101 +0.0581 1582.43 20.8224 +0.06148 1455.78 18.7977 +0.06487 1396.8 18.5029 +0.06824 1347.58 16.9495 +0.07159 1258.02 16.4371 +0.07491 1231.28 15.5554 +0.07818 1164.47 15.0776 +0.0815 1146.97 14.2378 +0.08493 1109.77 13.533 +0.08833 1040.08 13.1167 +0.09172 1030.03 12.6919 +0.09498 996.502 12.5769 +0.09819 973.153 12.2625 +0.10178 933.855 10.4847 +0.10538 941.324 11.6421 +0.10865 891.14 10.747 +0.11192 890.927 10.9919 +0.1153 863.999 10.0862 +0.11876 860.652 10.1051 +0.12205 833.905 10.2392 +0.12531 831.414 9.54046 +0.12869 796.354 9.38666 +0.13215 809.376 9.11842 +0.13559 805.133 9.14629 +0.1388 791.474 9.50691 +0.14205 787.287 8.69915 +0.14546 761.22 8.65866 +0.1489 779.201 8.38098 +0.15232 771.323 8.50152 +0.1556 748.08 8.49235 +0.15897 748.238 7.8713 +0.16233 756.864 8.48551 +0.16569 723.545 7.61209 +0.16918 723.039 7.76626 +0.17258 714.249 7.58349 +0.17592 707.068 7.55031 +0.17922 695.999 7.67253 +0.18248 687.854 7.31121 +0.18599 672.503 6.89206 +0.18947 656.046 7.05985 +0.19277 644.64 6.93548 +0.19607 633.62 7.0287 +0.19932 617.369 6.7009 diff --git a/test/trend_test_data/NdFeB_parallel_Bick_et_al/4_14000_1600_1070.csv b/test/trend_test_data/NdFeB_parallel_Bick_et_al/4_14000_1600_1070.csv index 838f64e5b..e349acefe 100644 --- a/test/trend_test_data/NdFeB_parallel_Bick_et_al/4_14000_1600_1070.csv +++ b/test/trend_test_data/NdFeB_parallel_Bick_et_al/4_14000_1600_1070.csv @@ -1,53 +1,53 @@ -0.02466 8578.27 96.3713 -0.02778 6201.5 70.6884 -0.03117 4666.55 54.9081 -0.03471 3532.71 43.8556 -0.03797 2779.72 39.1195 -0.04102 2401.14 35.0436 -0.04438 2010.93 26.6446 -0.04788 1789.13 25.3004 -0.05144 1629 21.7057 -0.05485 1414.39 21.5471 -0.05808 1338.47 19.3969 -0.06145 1255.55 17.6425 -0.06485 1194.78 17.2789 -0.06822 1131.88 15.6792 -0.07157 1093.29 15.4062 -0.07489 1076.75 14.6325 -0.07815 990.83 13.9891 -0.08147 993.984 13.3123 -0.0849 949.429 12.5828 -0.0883 906.082 12.3081 -0.09169 901.543 11.9196 -0.09495 883.023 11.8721 -0.09815 842.784 11.4424 -0.10174 819.526 9.8676 -0.10534 802.736 10.7893 -0.10861 795.767 10.1828 -0.11188 791.163 10.3837 -0.11526 783.07 9.63416 -0.11872 771.734 9.59199 -0.12201 755.014 9.75865 -0.12527 763.25 9.14929 -0.12865 738.983 9.05459 -0.1321 735.65 8.71334 -0.13554 713.743 8.62175 -0.13875 720.548 9.08471 -0.142 726.975 8.37203 -0.14541 705.893 8.34698 -0.14884 717.099 8.0504 -0.15226 709.825 8.16294 -0.15554 709.595 8.27884 -0.15891 699.293 7.61937 -0.16227 704.678 8.19256 -0.16563 698.926 7.48706 -0.16912 685.563 7.56396 -0.17251 673.043 7.36594 -0.17586 671.398 7.36238 -0.17915 664.082 7.50135 -0.18241 667.157 7.20373 -0.18592 646.099 6.75787 -0.1894 640.973 6.98357 -0.1927 634.489 6.88246 -0.196 608.639 6.89728 -0.19924 599.163 6.60299 +0.02466 8578.27 96.3713 +0.02778 6201.5 70.6884 +0.03117 4666.55 54.9081 +0.03471 3532.71 43.8556 +0.03797 2779.72 39.1195 +0.04102 2401.14 35.0436 +0.04438 2010.93 26.6446 +0.04788 1789.13 25.3004 +0.05144 1629 21.7057 +0.05485 1414.39 21.5471 +0.05808 1338.47 19.3969 +0.06145 1255.55 17.6425 +0.06485 1194.78 17.2789 +0.06822 1131.88 15.6792 +0.07157 1093.29 15.4062 +0.07489 1076.75 14.6325 +0.07815 990.83 13.9891 +0.08147 993.984 13.3123 +0.0849 949.429 12.5828 +0.0883 906.082 12.3081 +0.09169 901.543 11.9196 +0.09495 883.023 11.8721 +0.09815 842.784 11.4424 +0.10174 819.526 9.8676 +0.10534 802.736 10.7893 +0.10861 795.767 10.1828 +0.11188 791.163 10.3837 +0.11526 783.07 9.63416 +0.11872 771.734 9.59199 +0.12201 755.014 9.75865 +0.12527 763.25 9.14929 +0.12865 738.983 9.05459 +0.1321 735.65 8.71334 +0.13554 713.743 8.62175 +0.13875 720.548 9.08471 +0.142 726.975 8.37203 +0.14541 705.893 8.34698 +0.14884 717.099 8.0504 +0.15226 709.825 8.16294 +0.15554 709.595 8.27884 +0.15891 699.293 7.61937 +0.16227 704.678 8.19256 +0.16563 698.926 7.48706 +0.16912 685.563 7.56396 +0.17251 673.043 7.36594 +0.17586 671.398 7.36238 +0.17915 664.082 7.50135 +0.18241 667.157 7.20373 +0.18592 646.099 6.75787 +0.1894 640.973 6.98357 +0.1927 634.489 6.88246 +0.196 608.639 6.89728 +0.19924 599.163 6.60299 diff --git a/test/trend_test_data/NdFeB_parallel_Bick_et_al/5_16000_1600_1070.csv b/test/trend_test_data/NdFeB_parallel_Bick_et_al/5_16000_1600_1070.csv index ebbe41831..03d157c58 100644 --- a/test/trend_test_data/NdFeB_parallel_Bick_et_al/5_16000_1600_1070.csv +++ b/test/trend_test_data/NdFeB_parallel_Bick_et_al/5_16000_1600_1070.csv @@ -1,53 +1,53 @@ -0.02466 8403.24 95.8365 -0.02779 5866.26 69.5434 -0.03118 4356.78 53.6923 -0.03472 3299.25 42.8649 -0.03798 2597.38 38.2386 -0.04103 2129.79 33.557 -0.04439 1878.69 25.9888 -0.04789 1624.61 24.3861 -0.05145 1439.52 20.6737 -0.05487 1263.65 20.5759 -0.05809 1171.99 18.386 -0.06147 1079.56 16.577 -0.06487 1041.15 16.3129 -0.06823 1001.7 14.8847 -0.07159 961.645 14.563 -0.07491 923.442 13.6706 -0.07817 896.915 13.3973 -0.08149 883.652 12.6286 -0.08492 862.753 12.0581 -0.08832 824.722 11.795 -0.09171 784.35 11.1756 -0.09497 769.294 11.1579 -0.09818 755.349 10.8901 -0.10176 749.016 9.48228 -0.10537 742.393 10.4072 -0.10864 731.812 9.80011 -0.11191 725.902 9.97489 -0.11529 687.755 9.06119 -0.11874 695.826 9.13917 -0.12204 706.826 9.47552 -0.1253 686.062 8.69528 -0.12868 672.907 8.67583 -0.13213 693.14 8.48682 -0.13557 670.728 8.38538 -0.13878 665.705 8.76139 -0.14204 671.833 8.08011 -0.14544 675.608 8.18129 -0.14888 672.094 7.81614 -0.1523 674.683 7.97469 -0.15558 656.506 7.99112 -0.15895 676.236 7.50792 -0.16231 665.98 7.99164 -0.16567 649.237 7.2359 -0.16916 663.887 7.46039 -0.17256 654.732 7.28088 -0.1759 649.138 7.26044 -0.1792 637.918 7.36805 -0.18246 634.954 7.04588 -0.18596 615.952 6.61209 -0.18945 606.075 6.80618 -0.19275 602.38 6.72418 -0.19605 583.877 6.77081 -0.1993 592.832 6.58159 +0.02466 8403.24 95.8365 +0.02779 5866.26 69.5434 +0.03118 4356.78 53.6923 +0.03472 3299.25 42.8649 +0.03798 2597.38 38.2386 +0.04103 2129.79 33.557 +0.04439 1878.69 25.9888 +0.04789 1624.61 24.3861 +0.05145 1439.52 20.6737 +0.05487 1263.65 20.5759 +0.05809 1171.99 18.386 +0.06147 1079.56 16.577 +0.06487 1041.15 16.3129 +0.06823 1001.7 14.8847 +0.07159 961.645 14.563 +0.07491 923.442 13.6706 +0.07817 896.915 13.3973 +0.08149 883.652 12.6286 +0.08492 862.753 12.0581 +0.08832 824.722 11.795 +0.09171 784.35 11.1756 +0.09497 769.294 11.1579 +0.09818 755.349 10.8901 +0.10176 749.016 9.48228 +0.10537 742.393 10.4072 +0.10864 731.812 9.80011 +0.11191 725.902 9.97489 +0.11529 687.755 9.06119 +0.11874 695.826 9.13917 +0.12204 706.826 9.47552 +0.1253 686.062 8.69528 +0.12868 672.907 8.67583 +0.13213 693.14 8.48682 +0.13557 670.728 8.38538 +0.13878 665.705 8.76139 +0.14204 671.833 8.08011 +0.14544 675.608 8.18129 +0.14888 672.094 7.81614 +0.1523 674.683 7.97469 +0.15558 656.506 7.99112 +0.15895 676.236 7.50792 +0.16231 665.98 7.99164 +0.16567 649.237 7.2359 +0.16916 663.887 7.46039 +0.17256 654.732 7.28088 +0.1759 649.138 7.26044 +0.1792 637.918 7.36805 +0.18246 634.954 7.04588 +0.18596 615.952 6.61209 +0.18945 606.075 6.80618 +0.19275 602.38 6.72418 +0.19605 583.877 6.77081 +0.1993 592.832 6.58159 diff --git a/test/utest_new_sasdata.py b/test/utest_new_sasdata.py index 16665c20f..5ee073b32 100644 --- a/test/utest_new_sasdata.py +++ b/test/utest_new_sasdata.py @@ -2,9 +2,12 @@ from sasdata.data import SasData from sasdata.data_backing import Group -from sasdata.dataset_types import one_dim, two_dim +from sasdata.dataset_types import angle_dim, one_dim, three_dim, two_dim +from sasdata.metadata import Instrument, Metadata, Source +from sasdata.postprocess import deduce_qz +from sasdata.quantities.constants import Pi from sasdata.quantities.quantity import Quantity -from sasdata.quantities.units import per_angstrom, per_centimeter +from sasdata.quantities.units import angstroms, per_angstrom, per_centimeter, radians def test_1d(): @@ -46,3 +49,77 @@ def test_2d(): assert all(data.ordinate.value == np.array(i)) assert (data.abscissae.value == np.array([[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]])).all().all() + +def test_3d(): + # test base 3D class + qx = [1, 1, 1, 2, 2, 2, 3, 3, 3] + qy = [1, 2, 3, 1, 2, 3, 1, 2, 3] + qz = [0, 1, 0, 1, 0, 1, 0, 1, 0] + i = [1, 2, 3] + + qx_quantity = Quantity(np.array(qx), per_angstrom) + qy_quantity = Quantity(np.array(qy), per_angstrom) + qz_quantity = Quantity(np.array(qz), per_angstrom) + i_quantity = Quantity(np.array(i), per_centimeter) + + data_contents = { + 'Qx': qx_quantity, + 'Qy': qy_quantity, + 'Qz': qz_quantity, + 'I': i_quantity + } + + data = SasData('TestData', data_contents, three_dim, Group('root', {}), True) + + assert (data._data_contents['Qx'].value == np.array(qx)).all() + + + + # test autogenerated qz from qx, qy, and wavelength + wavelength = Quantity(1., angstroms) + source = Source(radiation=None, + beam_shape=None, + beam_size=None, + wavelength=wavelength, + wavelength_max=None, + wavelength_min=None, + wavelength_spread=None) + instrument = Instrument(collimations=[], + source=source, + detector=[]) + metadata=Metadata(title=None, + run=[], + definition=None, + process=[], + sample=None, + instrument=instrument, + raw=None) + + data_contents = { + 'Qx': qx_quantity, + 'Qy': qy_quantity, + 'I': i_quantity + } + + data = SasData('TestData', data_contents, two_dim, metadata, True) + + deduce_qz(data) + + assert (data._data_contents['Qz'].value != (0*data._data_contents['Qx'].value)).all() + +def test_angle(): + phi = [0.4 * Pi, 0.8 * Pi, 1.2 * Pi, 1.6 * Pi, 2 * Pi] + i = [5, 4, 3, 2, 1] + + phi_quantity = Quantity(np.array(phi), radians) + i_quantity = Quantity(np.array(i), per_centimeter) + + data_contents = { + 'Phi': phi_quantity, + 'I': i_quantity + } + + data = SasData('TestData', data_contents, angle_dim, Group('root', {}), True) + + assert all(data.abscissae.value == np.array(phi)) + assert all(data.ordinate.value == np.array(i)) diff --git a/tox.ini b/tox.ini new file mode 100644 index 000000000..54dfeb507 --- /dev/null +++ b/tox.ini @@ -0,0 +1,3 @@ +[pycodestyle] +max-line-length = 120 +ignore = E501,W503 \ No newline at end of file