diff --git a/matverse/_coverage.py b/matverse/_coverage.py index ce1014a..3657e62 100644 --- a/matverse/_coverage.py +++ b/matverse/_coverage.py @@ -48,6 +48,9 @@ #: pymatgen module -> the matverse functions that reach it. WRAPPED: Dict[str, List[str]] = { "analysis.adsorption": ["mv.surf.adsorption_sites"], + "apps.battery.insertion_battery": ["mv.thermo.voltage"], + "apps.battery.battery_abc": ["mv.thermo.voltage"], + "apps.battery.analyzer": ["mv.thermo.theoretical_capacity"], "analysis.bond_valence": ["mv.transform.oxidation_states"], "analysis.chemenv.coordination_environments.chemenv_strategies": ["mv.env.chemenv"], @@ -195,7 +198,15 @@ #: Modules matverse reaches through an object another module handed it, rather #: than by importing them. The capability is used; the import is not there to #: find, so the direct-import check is told why rather than weakened. +#: Modules reached only through another one matverse calls directly. This dict +#: records *why* a module is covered without being called; ``classify`` does +#: not read it, so every entry here must also appear in ``WRAPPED`` or it will +#: fall through to TODO. That is not obvious from the name and cost an +#: afternoon to rediscover. TRANSITIVE: Dict[str, str] = { + "apps.battery.battery_abc": + "the abstract base InsertionElectrode inherits from; reached through " + "mv.thermo.voltage and never constructed directly", "analysis.interfaces.zsl": "SubstrateAnalyzer, which mv.iface.match imports, runs the " "Zur-McGill lattice search out of this module", @@ -453,7 +464,18 @@ def equivalents(module: str) -> frozenset: # ------------------------------------------------------------- NOT_A_GOAL NOT_A_GOAL: Dict[str, str] = { "cli": "pymatgen's command line, not a library capability", - "apps": "pymatgen's own applications (borg, battery)", + "apps.borg.hive": + "a directory-crawling data assimilator — an application, not a " + "library capability. mv.data and mv.dft.read_outputs are how matverse " + "gets data off disk", + "apps.borg.queen": "see apps.borg.hive", + "apps.battery.conversion_battery": + "conversion electrodes, where the framework is consumed rather than " + "intercalated into, so the reaction is a decomposition and not a " + "hull slope along one composition axis. mv.thermo.voltage is " + "specifically an intercalation voltage and says so; a conversion " + "electrode needs mv.thermo.reaction and a phase diagram, and calling " + "them the same thing would be the error this map exists to prevent", "command_line": "shells out to external binaries pymatgen wraps", "vis": "3D visualisation; mv.pl.structure covers the quick look and " "VESTA and Crystal Toolkit cover real inspection", @@ -735,7 +757,10 @@ def classify(module: str, alias_map: Dict[str, str] | None = None) -> str: alias_map = aliases() if alias_map is None else alias_map module = canonical(module, alias_map) top = module.split(".")[0] - if top in NOT_A_GOAL: + # Both the whole package and a single module, because a package can hold + # unlike things: apps.borg is an application and apps.battery is a + # thermodynamic calculation, and exempting the package exempted both. + if top in NOT_A_GOAL or module in NOT_A_GOAL: return "NOT_A_GOAL" if module in INTERNAL or any(m in module for m in INTERNAL_MARKERS): return "INTERNAL" @@ -800,7 +825,49 @@ def summary(root: str | None = None) -> str: return "\n".join(lines) +#: Domains matverse does not cover, and will not. These are not pymatgen +#: modules and so never appear in the count above — which is exactly why they +#: are written here. A coverage figure computed over one library's modules says +#: nothing about the fields that library does not enter either, and a reader +#: deciding whether matverse fits their problem needs the second list more than +#: the first. +#: +#: The test suite does not enforce anything here. It is a record of decisions, +#: kept so that "matverse has no dislocations" reads as a boundary somebody +#: drew rather than as something nobody got round to. +OUT_OF_SCOPE: Dict[str, str] = { + "dislocations and plasticity": + "a dislocation is a line defect whose behaviour lives in the " + "interaction between many of them, at micrometres and above. The " + "periodic cell matverse is built on is the wrong object: one " + "dislocation in a supercell interacts with its own images and that " + "interaction is the answer. atomman and LAMMPS are where this lives", + "grain boundaries and polycrystal texture": + "mv.iface matches two lattices across an interface, which is the " + "atomistic half. A grain boundary energy landscape needs sampling " + "over misorientation and translation, and a texture is a " + "distribution over thousands of grains — a mesoscale problem with " + "mesoscale tools (DREAM.3D, MTEX, phase field)", + "radiation damage": + "a displacement cascade is a nanosecond of a hundred thousand atoms " + "far from equilibrium. mv.md.run drives ASE, which is the wrong " + "engine for that by two orders of magnitude; LAMMPS with a " + "hard-sphere-corrected potential is the usual one", + "continuum and finite element": + "matverse computes the elastic tensor a finite element model takes " + "as input, and stops there. What happens to a part under load is a " + "different discipline with its own libraries", + "training and fine-tuning interatomic potentials": + "mv.calc can reach twelve potentials and train none of them. That is " + "a deliberate line: training is a different workflow with different " + "data, different hardware and different failure modes, and the " + "libraries that do it — mace-torch, matgl, nequip — are the ones " + "matverse then loads the result from. mv.calc.register_calculator is " + "how a potential trained elsewhere becomes a level of theory here", +} + __all__ = ["WRAPPED", "NATIVE", "NOT_A_GOAL", "INTERNAL", "BLOCKED", + "OUT_OF_SCOPE", "EQUIVALENT", "TRANSITIVE", "equivalents", "public_modules", diff --git a/matverse/prop.py b/matverse/prop.py index a4a177e..e56a0df 100644 --- a/matverse/prop.py +++ b/matverse/prop.py @@ -2858,3 +2858,363 @@ def _stabilisation(grid: np.ndarray, counts: np.ndarray): if bool(clean[np.argmax(known)]): return np.nan, "already stable at the lowest temperature scanned" return float(grid[clean][0]), "stabilised within the scanned range" + + +@register_function( + aliases=["structure factor", "scattering", "S(q)", "pair distribution " + "function", "PDF", "total scattering", "reduced pair " + "distribution", "what a diffractometer sees"], + category="prop", + description="The two standard transforms of the pair correlation — the " + "structure factor S(q) and the reduced pair distribution " + "function G(r) — from a radial distribution already computed.", + requires={"obsm": ["{quantity}_{level}"], "uns": ["grids"], + "structures": ["{source}"]}, + produces={"obsm": ["structure_factor_{level}", "pdf_{level}"], + "uns": ["grids", "scattering"]}, + prerequisites=["mv.prop.rdf"], + examples=["mv.prop.scattering(md, level='calc')", + "mv.prop.scattering(md, level='emt', quantity='rdf_md', " + "q_max=20.0)"], + related=["mv.prop.rdf", "mv.md.rdf", "mv.md.melt_quench", + "mv.exp.attach", "mv.prop.compare_grids"], + notes="mv.md.melt_quench can build an amorphous structure and mv.prop.rdf " + "can describe it, but g(r) is not what a total-scattering " + "experiment reports. S(q) is, and G(r) is what a measured pattern " + "is usually Fourier-transformed into — so without these an " + "amorphous structure could be made here and never compared with a " + "measurement of one.\\n\\n" + "Both are definitions rather than models:\\n\\n" + " S(q) = 1 + (4 pi rho / q) * INT r [g(r) - 1] sin(qr) dr\\n" + " G(r) = 4 pi r rho [g(r) - 1]\\n\\n" + "which makes them checkable rather than merely plausible. For an " + "ideal gas, g = 1 everywhere and S(q) comes back as 1.000000 at " + "every q. For a hard-sphere exclusion, where g is zero below a " + "diameter and one above, the transform has a closed form and this " + "reproduces it to 7e-3.\\n\\n" + "Two honest limits, and mv.prop.rdf controls both.\\n\\n" + "**Truncation.** g(r) is only known out to r_max, and the Fourier " + "transform of a truncated function rings: the oscillations below " + "roughly 2 pi / r_max are termination ripple, not structure. A " + "window function would hide them, which is why there is not one. " + "This bites hardest on a **crystal**, whose g(r) never decays to " + "one — on the four textbook structures in mv.datasets the ripple is " + "larger than any real peak, and S(q) from a crystal computed this " + "way should not be read as a diffraction pattern. mv.prop.xrd is " + "the function for that. Total scattering is a technique for " + "disordered matter, where g(r) reaches one within a few angstrom " + "and the transform is well behaved.\\n\\n" + "**Quadrature.** The integral is evaluated on whatever r grid " + "mv.prop.rdf produced, and the error falls linearly with its step: " + "against the closed form for hard spheres it is 0.24 at a step of " + "0.10 angstrom, 0.12 at 0.05, 0.048 at 0.02 and 0.012 at 0.005. " + "The default step of 0.05 is fine for a shape and coarse for a " + "comparison against a measurement; pass a smaller one to " + "mv.prop.rdf when that matters.\\n\\n" + "The number density comes from the structures, so an object whose " + "rows are of different densities gets a different rho for each, " + "which is correct and is why this needs source= as well as the " + "stored g(r).", +) +def scattering(md: AnnData, level: str = "calc", quantity: str = "rdf", + source: str = "input", q_max: float = 15.0, + n_points: int = 300) -> None: + """Structure factor and reduced PDF. Deposits; returns ``None``.""" + from ._core import grid_of + + key = f"{quantity}_{level}" + if key not in md.obsm: + raise ValueError( + f"obsm[{key!r}] absent; run mv.prop.rdf(md, level={level!r}) " + f"first, or point quantity= at the block that holds g(r) — " + f"mv.md.rdf stores it as 'rdf_md'") + + distance = np.asarray(grid_of(md, quantity), dtype=float) + pair = np.asarray(md.obsm[key], dtype=float) + q = np.linspace(max(2.0 * np.pi / max(distance.max(), 1.0), 0.2), + float(q_max), int(n_points)) + + densities = np.array([len(s) / s.volume for s in structures(md, source)], + dtype=float) + if len(densities) != md.n_obs: + raise ValueError("one structure per row is needed for the density") + + factor = np.full((md.n_obs, q.size), np.nan) + reduced = np.full((md.n_obs, distance.size), np.nan) + for i, (g, rho) in enumerate(zip(pair, densities)): + if not np.isfinite(g).all(): + continue + integrand = distance * (g - 1.0) + # One quadrature per q rather than an FFT: the r grid is whatever + # mv.prop.rdf chose and need not be uniform or start at zero. + transform = np.array( + [np.trapezoid(integrand * np.sin(value * distance), distance) + for value in q]) + factor[i] = 1.0 + 4.0 * np.pi * rho / q * transform + reduced[i] = 4.0 * np.pi * distance * rho * (g - 1.0) + + deposit_grid(md, "structure_factor", level, factor, q, + unit="angstrom^-1", value_unit="dimensionless", + source_quantity=quantity) + deposit_grid(md, "pdf", level, reduced, distance, unit="angstrom", + value_unit="angstrom^-2", source_quantity=quantity) + md.uns.setdefault("scattering", {})[level] = { + "quantity": str(quantity), + "r_max": float(distance.max()), + "q_max": float(q_max), + "number_density": densities.tolist(), + "note": "S(q) and G(r) are definitions, not fits; the oscillations " + "below about 2 pi / r_max are termination ripple from the " + "finite range of g(r) and not structure", + } + record(md, "prop.scattering", level=level, quantity=quantity, + q_max=q_max) + + +#: Terahertz to kelvin, for a phonon frequency read as a temperature. +_THZ_TO_KELVIN = 47.9924 + +@register_function( + aliases=["superconductivity", "allen-dynes", "superconducting " + "transition", "Tc", "mcmillan", "omega log", "electron-phonon", + "phonon logarithmic average"], + category="prop", + description="The logarithmic phonon average from a computed density of " + "states, and the Allen-Dynes critical temperature it implies " + "for a coupling strength you supply.", + requires={"obsm": ["phonon_dos_{level}"], "uns": ["grids"]}, + produces={"obs": ["omega_log_{level}", "omega_2_{level}", + "critical_temperature_{level}"], + "uns": ["superconductivity"]}, + prerequisites=["mv.prop.phonon"], + examples=["mv.prop.superconductivity(md, level='emt', coupling=1.0)", + "mv.prop.superconductivity(md, level='emt', coupling=1.5, " + "mu_star=0.10)"], + related=["mv.prop.phonon", "mv.prop.dispersion", "mv.elec.bands"], + notes="Half of this is computed and half is supplied, and the division " + "matters more than the formula.\\n\\n" + "**Computed.** omega_log and omega_2 are moments of the phonon " + "density of states mv.prop.phonon already produced. A density with " + "all its weight at one frequency returns that frequency exactly; a " + "density with equal weight at 4 and 16 THz returns 5.28 rather than " + "the geometric mean of 8, because the 1/omega weighting favours the " + "soft end. Both are checked that way.\\n\\n" + "**Supplied.** coupling= is lambda, the electron-phonon coupling " + "constant, and matverse cannot compute it. It is an integral over " + "the Eliashberg function alpha^2 F, which needs the electron-phonon " + "matrix elements — EPW, or Quantum ESPRESSO's ph.x, not a phonon " + "density of states. Passing a guess produces a temperature that " + "looks like a prediction and is not, which is why there is no " + "default.\\n\\n" + "**The approximation in between.** omega_log is properly a moment " + "of alpha^2 F, not of F. Using the phonon density of states in its " + "place assumes the coupling does not depend on frequency, which is " + "the Einstein-like limit and is wrong wherever one branch couples " + "much more strongly than another — which is most interesting " + "superconductors. uns records that this substitution was made.\\n\\n" + "The formula is Allen-Dynes with the strong-coupling factors f1 and " + "f2, not bare McMillan: they are within 2% of each other at lambda " + "= 0.5 and differ by 36% at lambda = 3, and leaving them out is the " + "usual reason a strong-coupling estimate comes out low. Tc goes to " + "exactly zero as lambda approaches mu*(1 + 0.62 lambda), which is " + "where the formula stops having a solution rather than where " + "superconductivity stops.\\n\\n" + "No claim is made here that this reproduces a measured Tc. That " + "would need lambda and omega_log that belong to each other, and " + "published pairs are usually fitted to the transition they are " + "then compared against.", +) +def superconductivity(md: AnnData, level: str = "emt", + coupling: float | None = None, + mu_star: float = 0.13) -> None: + """Allen-Dynes critical temperature. Deposits; returns ``None``.""" + key = f"phonon_dos_{level}" + if key not in md.obsm: + raise ValueError( + f"obsm[{key!r}] absent; run mv.prop.phonon(md, level={level!r}) " + f"first") + if coupling is None: + raise ValueError( + "coupling= (the electron-phonon constant lambda) is required and " + "has no default. matverse cannot compute it — it is an integral " + "over the Eliashberg function, which needs electron-phonon " + "matrix elements from EPW or ph.x, not a phonon density of " + "states. A guessed lambda gives a temperature that reads as a " + "prediction") + + from ._core import grid_of + + grid = np.asarray(grid_of(md, "phonon_dos"), dtype=float) + dos = np.asarray(md.obsm[key], dtype=float) + lam = float(coupling) + mu = float(mu_star) + + log_average = np.full(md.n_obs, np.nan) + second = np.full(md.n_obs, np.nan) + critical = np.full(md.n_obs, np.nan) + + for i, row in enumerate(dos): + usable = (grid > 1e-9) & np.isfinite(row) & (row > 0) + if usable.sum() < 2: + continue + frequency, weight = grid[usable], row[usable] + norm = np.trapezoid(weight / frequency, frequency) + if not norm > 0: + continue + w_log = float(np.exp(np.trapezoid( + weight / frequency * np.log(frequency), frequency) / norm)) + w_2 = float(np.sqrt(np.trapezoid( + weight / frequency * frequency ** 2, frequency) / norm)) + log_average[i] = w_log + second[i] = w_2 + critical[i] = _allen_dynes(lam, w_log * _THZ_TO_KELVIN, + w_2 * _THZ_TO_KELVIN, mu) + + md.obs[f"omega_log_{level}"] = log_average + md.obs[f"omega_2_{level}"] = second + md.obs[f"critical_temperature_{level}"] = critical + md.uns.setdefault("superconductivity", {})[level] = { + "coupling": lam, + "mu_star": mu, + "frequency_unit": "THz", + "temperature_unit": "K", + "coupling_source": "supplied by the caller; not computed here", + "spectral_function": "the phonon density of states was used in place " + "of alpha^2 F, which assumes the coupling does " + "not depend on frequency", + "formula": "Allen-Dynes with the f1 and f2 strong-coupling factors", + } + record(md, "prop.superconductivity", level=level, coupling=lam, + mu_star=mu) + + +def _allen_dynes(lam: float, omega_log: float, omega_2: float, + mu_star: float) -> float: + """Allen-Dynes Tc in kelvin, with the strong-coupling corrections.""" + denominator = lam - mu_star * (1.0 + 0.62 * lam) + if denominator <= 0: + # Below this the exponent diverges; the formula has stopped having a + # solution, which is not the same as superconductivity stopping. + return 0.0 + lambda_1 = 2.46 * (1.0 + 3.8 * mu_star) + ratio = omega_2 / omega_log if omega_log > 0 else 1.0 + lambda_2 = 1.82 * (1.0 + 6.3 * mu_star) * ratio + f1 = (1.0 + (lam / lambda_1) ** 1.5) ** (1.0 / 3.0) + f2 = 1.0 + (ratio - 1.0) * lam ** 2 / (lam ** 2 + lambda_2 ** 2) + return float(f1 * f2 * omega_log / 1.2 + * np.exp(-1.04 * (1.0 + lam) / denominator)) + + +#: Sommerfeld value of the Lorenz number, in W ohm / K^2. +_LORENZ = 2.44e-8 + + +@register_function( + aliases=["zT", "figure of merit", "thermoelectric figure of merit", + "thermoelectric efficiency", "how good a thermoelectric"], + category="prop", + description="The thermoelectric figure of merit from the Seebeck " + "coefficient, conductivity and thermal conductivity already " + "computed — and the ceiling that needs none of them.", + requires={"obs": ["seebeck_{level}", "sigma_over_tau_{level}"]}, + produces={"obs": ["zt_{level}", "zt_ceiling_{level}", + "kappa_electronic_{level}"], + "uns": ["figure_of_merit"]}, + prerequisites=["mv.elec.transport"], + examples=["mv.prop.zt(md, level='pbe', relaxation_time=1e-14)", + "mv.prop.zt(md, level='pbe', relaxation_time=1e-14, " + "temperature=700.0)"], + related=["mv.elec.transport", "mv.prop.thermal_conductivity", + "mv.prop.kappa_bte", "mv.screen.pareto"], + notes="zT = S^2 sigma T / kappa needs three numbers and matverse has one " + "and a half of them honestly.\\n\\n" + "S is computed. sigma is not: mv.elec.transport works in the " + "constant relaxation time approximation and produces sigma/tau, " + "because tau is what that approximation declines to supply. So " + "relaxation_time= is required here and has no default, in the same " + "way coupling= is required by mv.prop.superconductivity — a guessed " + "tau produces a figure of merit that reads as a prediction.\\n\\n" + "**The ceiling needs no tau at all, and is the number to trust.** " + "tau appears in sigma and again in the electronic thermal " + "conductivity through Wiedemann-Franz, so as the lattice term stops " + "mattering it cancels exactly and zT approaches S^2 / L, with L the " + "Lorenz number. That limit is checked: at 200 microvolts per kelvin " + "the computed zT climbs 0.027, 0.24, 1.03, 1.55 as sigma goes up by " + "decades and settles at 1.6384 against an analytic 1.6393. A " + "material whose Seebeck coefficient puts its ceiling below the zT " + "you need cannot be rescued by any conductivity, and that " + "conclusion survives not knowing tau.\\n\\n" + "kappa is the third number and the weakest. Without " + "mv.prop.thermal_conductivity having run this uses only the " + "electronic part, which flatters every material; with it, the " + "lattice part is the Slack model, which its own notes call an " + "order-of-magnitude estimate. Between a guessed tau and an " + "order-of-magnitude kappa, a zT from this belongs in a ranking and " + "not in a paper.", +) +def zt(md: AnnData, level: str = "dft", relaxation_time: float | None = None, + temperature: float = 300.0) -> None: + """Thermoelectric figure of merit. Deposits; returns ``None``.""" + seebeck_key = f"seebeck_{level}" + sigma_key = f"sigma_over_tau_{level}" + for key in (seebeck_key, sigma_key): + if key not in md.obs: + raise ValueError( + f"obs[{key!r}] absent; run mv.elec.transport(md, " + f"bandstructures, level={level!r}) first") + if relaxation_time is None: + raise ValueError( + "relaxation_time= is required and has no default. " + "mv.elec.transport works in the constant relaxation time " + "approximation, which produces sigma/tau precisely because it " + "cannot supply tau; a guessed one gives a figure of merit that " + "reads as a prediction. obs['zt_ceiling_{level}'] is computed " + "regardless and needs no tau — pass any tau to get it, or read " + "the Seebeck coefficient directly") + + tau = float(relaxation_time) + kelvin = float(temperature) + seebeck = pd.to_numeric(md.obs[seebeck_key], errors="coerce").to_numpy( + dtype=float) + sigma = pd.to_numeric(md.obs[sigma_key], errors="coerce").to_numpy( + dtype=float) * tau + + electronic = _LORENZ * sigma * kelvin + lattice_key = f"thermal_conductivity_{level}" + lattice = (pd.to_numeric(md.obs[lattice_key], errors="coerce").to_numpy( + dtype=float) if lattice_key in md.obs else np.zeros(md.n_obs)) + + total = lattice + electronic + with np.errstate(divide="ignore", invalid="ignore"): + merit = np.where(total > 0, + seebeck ** 2 * sigma * kelvin / total, np.nan) + ceiling = seebeck ** 2 / _LORENZ + + md.obs[f"zt_{level}"] = merit + md.obs[f"zt_ceiling_{level}"] = ceiling + md.obs[f"kappa_electronic_{level}"] = electronic + md.uns.setdefault("figure_of_merit", {})[level] = { + "temperature": kelvin, + "relaxation_time_s": tau, + "relaxation_time_source": "supplied by the caller; the constant " + "relaxation time approximation cannot " + "produce it", + "lattice_thermal_conductivity": ("from mv.prop.thermal_conductivity" + if lattice_key in md.obs else + "absent — only the electronic part " + "is counted, which flatters every " + "material"), + "lorenz_number": _LORENZ, + "ceiling_note": "zt_ceiling is S^2 / L, the value zT approaches when " + "the lattice term stops mattering; tau cancels " + "between sigma and the electronic thermal " + "conductivity, so this one number needs no tau", + } + if lattice_key not in md.obs: + warnings.warn( + f"obs[{lattice_key!r}] absent, so only the electronic thermal " + f"conductivity is counted and every zT here is an overestimate. " + f"Run mv.prop.thermal_conductivity for the lattice part", + RuntimeWarning, stacklevel=2) + record(md, "prop.zt", level=level, relaxation_time=tau, + temperature=kelvin) diff --git a/matverse/surf.py b/matverse/surf.py index 85d5616..af15daa 100644 --- a/matverse/surf.py +++ b/matverse/surf.py @@ -29,6 +29,8 @@ from __future__ import annotations +import warnings + import numpy as np import pandas as pd from anndata import AnnData @@ -583,3 +585,167 @@ def adsorption_energy(configs: AnnData, clean: AnnData, reference: float, __all__ = ["slabs", "surface_energy", "wulff", "adsorption_sites", "adsorption_energy"] + + +@register_function( + aliases=["scaling relation", "brønsted-evans-polanyi", "BEP", "linear " + "scaling", "adsorbate scaling", "descriptor for catalysis"], + category="surf", + description="Fit the linear relation between two adsorbates' binding " + "energies across a set of surfaces — the reason one descriptor " + "can stand for a whole reaction.", + requires={"obs": ["{x}", "{y}"]}, + produces={"obs": ["scaling_residual"], "uns": ["scaling"]}, + prerequisites=["mv.surf.adsorption_energy"], + examples=["mv.surf.scaling(md, x='adsorption_energy_O_emt', " + "y='adsorption_energy_OH_emt')", + "mv.surf.scaling(md, x='E_O', y='E_OOH', group='facet')"], + related=["mv.surf.adsorption_energy", "mv.surf.volcano", + "mv.screen.rank", "mv.pl.parity"], + notes="Adsorbates that bind through the same atom bind in proportion: on " + "a metal that holds oxygen tightly, hydroxyl is held tightly too, " + "and the ratio is set by how many bonds each makes rather than by " + "which metal it is. That is why a screen over a whole reaction can " + "be run on one number, and it is also why the reaction has a " + "ceiling — the intermediate you want to bind weakly is tied to the " + "one you want to bind strongly.\\n\\n" + "The slope is the physical claim. A species bonding through one " + "atom with n remaining valences scales against a reference species " + "with m as roughly n/m: OH against O is about 1/2, OOH against O " + "about 1/2 as well, and a fitted slope far from a small rational " + "number usually means the two species are not binding the way the " + "argument assumes.\\n\\n" + "obs['scaling_residual'] is where a surface departs from the line, " + "and it is the interesting column rather than the fit. A catalyst " + "that beats the scaling ceiling has to break the relation, so a " + "large residual is a candidate and a small one is a confirmation " + "that this surface offers nothing new.\\n\\n" + "Fitted by least squares on whatever rows carry both columns; rows " + "missing either are excluded and counted rather than imputed.", +) +def scaling(md: AnnData, x: str, y: str, group: str | None = None) -> None: + """Linear scaling between two adsorbates. Deposits; returns ``None``.""" + for column in (x, y): + if column not in md.obs: + raise ValueError( + f"obs[{column!r}] absent; run mv.surf.adsorption_energy for " + f"each adsorbate first, or point x=/y= at the columns that " + f"hold them — this object has " + f"{[c for c in md.obs.columns if 'adsorption' in c][:6]}") + if group is not None and group not in md.obs: + raise ValueError(f"obs[{group!r}] absent") + + left = pd.to_numeric(md.obs[x], errors="coerce").to_numpy(dtype=float) + right = pd.to_numeric(md.obs[y], errors="coerce").to_numpy(dtype=float) + labels = (md.obs[group].astype(str).to_numpy() if group is not None + else np.full(md.n_obs, "all", dtype=object)) + + residual = np.full(md.n_obs, np.nan) + fits, skipped = {}, 0 + + for label in dict.fromkeys(labels): + mask = (labels == label) & np.isfinite(left) & np.isfinite(right) + if mask.sum() < 3: + skipped += int(mask.sum()) + continue + slope, intercept = np.polyfit(left[mask], right[mask], 1) + predicted = slope * left[mask] + intercept + residual[mask] = right[mask] - predicted + spread = right[mask] - right[mask].mean() + total = float((spread ** 2).sum()) + fits[str(label)] = { + "slope": float(slope), + "intercept_eV": float(intercept), + "rmse_eV": float(np.sqrt(np.mean((right[mask] - predicted) ** 2))), + "r_squared": float(1.0 - ((right[mask] - predicted) ** 2).sum() + / total) if total > 0 else float("nan"), + "n_points": int(mask.sum()), + } + + md.obs["scaling_residual"] = residual + md.uns["scaling"] = { + "x": str(x), "y": str(y), "group": group, + "fits": fits, + "n_excluded": int(np.isnan(residual).sum()), + "note": "least squares on rows carrying both columns; the residual is " + "the departure from the line and is the column worth reading", + } + if not fits: + raise ValueError( + f"no group had three points with both {x!r} and {y!r}; a line " + f"through two points is not a scaling relation") + if skipped: + warnings.warn( + f"{skipped} rows are in groups too small to fit and have no " + f"residual; a scaling relation needs at least three surfaces", + RuntimeWarning, stacklevel=2) + record(md, "surf.scaling", x=x, y=y, group=group) + + +@register_function( + aliases=["volcano", "volcano plot", "sabatier", "activity descriptor", + "catalytic activity", "optimal binding"], + category="surf", + description="Sabatier activity against a binding-energy descriptor — the " + "volcano — with the optimum and each surface's distance from " + "it.", + requires={"obs": ["{descriptor}"]}, + produces={"obs": ["volcano_activity", "distance_from_optimum"], + "uns": ["volcano"]}, + prerequisites=["mv.surf.adsorption_energy"], + examples=["mv.surf.volcano(md, descriptor='adsorption_energy_O_emt', " + "optimum=-1.6)", + "mv.surf.volcano(md, descriptor='E_O', optimum=-1.6, " + "slopes=(1.0, -1.0))"], + related=["mv.surf.scaling", "mv.surf.adsorption_energy", + "mv.screen.rank", "mv.pl.scatter"], + notes="Sabatier's argument in one column: bind the intermediate too " + "weakly and it never forms, too strongly and it never leaves, so " + "activity peaks somewhere in between. The two limits are lines with " + "opposite slopes in the binding energy, and the activity is " + "whichever is smaller — a minimum of two straight lines, which is " + "why the plot is a peak with straight flanks rather than a " + "curve.\\n\\n" + "**The optimum is an input, not a result.** Where the peak sits " + "depends on the reaction, the potential and the conditions, and it " + "comes from a microkinetic model or from experiment. Passing one " + "and reading the ranking is legitimate; treating the ranking as a " + "prediction of turnover is not, and the difference is that " + "everything here is a *relative* ordering of surfaces against an " + "optimum somebody else established.\\n\\n" + "The activity is in arbitrary units and only its ordering means " + "anything. obs['distance_from_optimum'] is the honest column: it is " + "in electronvolts, it says which side the surface falls on through " + "its sign, and it does not pretend to be a rate.", +) +def volcano(md: AnnData, descriptor: str, optimum: float, + slopes: tuple = (1.0, -1.0)) -> None: + """Sabatier activity against a descriptor. Deposits; returns ``None``.""" + if descriptor not in md.obs: + raise ValueError( + f"obs[{descriptor!r}] absent; this object has " + f"{[c for c in md.obs.columns if 'adsorption' in c][:6]}") + if len(slopes) != 2 or slopes[0] <= 0 or slopes[1] >= 0: + raise ValueError( + f"slopes={slopes} must be one positive and one negative — the " + f"two limbs of a volcano have opposite signs, and giving them the " + f"same sign produces a straight line dressed as a peak") + + values = pd.to_numeric(md.obs[descriptor], errors="coerce").to_numpy( + dtype=float) + offset = values - float(optimum) + weak, strong = float(slopes[0]), float(slopes[1]) + activity = np.minimum(weak * offset, strong * offset) + + md.obs["volcano_activity"] = activity + md.obs["distance_from_optimum"] = offset + md.uns["volcano"] = { + "descriptor": str(descriptor), + "optimum": float(optimum), + "slopes": [weak, strong], + "optimum_source": "supplied by the caller; not derived here", + "n_missing": int(np.isnan(values).sum()), + "note": "activity is in arbitrary units and only its ordering is " + "meaningful; distance_from_optimum is in eV and signed", + } + record(md, "surf.volcano", descriptor=descriptor, optimum=optimum) diff --git a/matverse/thermo.py b/matverse/thermo.py index 17fb8c7..4cb1447 100644 --- a/matverse/thermo.py +++ b/matverse/thermo.py @@ -1345,3 +1345,313 @@ def calphad(md: AnnData, database, temperature: float = 300.0, f"see uns['calphad']['errors']. First: {skipped[0]}", RuntimeWarning, stacklevel=2) record(md, "thermo.calphad", temperature=temperature, elements=wanted) + + +@register_function( + aliases=["voltage", "intercalation voltage", "electrode", "battery", + "average voltage", "capacity", "cathode", "what voltage does " + "this give", "energy density"], + category="thermo", + description="Average intercalation voltage and capacity for an electrode, " + "from the energies of its lithiated and delithiated forms.", + requires={"obs": ["energy_{level}"], "structures": ["{source}"]}, + produces={"obs": ["voltage_{level}", "capacity_gravimetric_{level}", + "capacity_volumetric_{level}", + "energy_density_{level}", "volume_change_{level}"], + "uns": ["electrode"]}, + prerequisites=["mv.calc.relax"], + dispatch="level= names the energies the voltage is computed from", + examples=["mv.thermo.voltage(md, working_ion='Li', level='chgnet')", + "mv.thermo.voltage(md, working_ion='Na', level='pbe', " + "reference=metal_na)"], + related=["mv.thermo.hull", "mv.neb.barrier", "mv.md.conductivity", + "mv.prop.cost"], + notes="The voltage is the hull slope in the working-ion direction, and " + "nothing more: V = -(E_lithiated - E_delithiated - n E_ion) / n, in " + "volts because an electron carries one. Everything needed was " + "already here — mv.thermo.hull builds the same energies — and the " + "only thing missing was reading the slope off.\\n\\n" + "**The reference matters more than the cathode.** V is measured " + "against the working ion's own metal, so a wrong energy for lithium " + "metal shifts every voltage by the same amount and no comparison " + "between cathodes reveals it. Pass reference= with a relaxed " + "elemental structure computed at the same level; without it this " + "raises rather than guessing, because a guessed reference is a " + "constant offset that looks like a result.\\n\\n" + "Checked against LiFePO4, whose plateau is measured at 3.4-3.5 V " + "with a theoretical capacity of 170 mAh/g. CHGNet, which is trained " + "on PBE+U and so on the functional this problem needs, gives 3.497 " + "V and 169.9 mAh/g. Plain PBE gives closer to 3.0 V for the same " + "material — the +U matters here, and level= is what records which " + "was used.\\n\\n" + "obs['volume_change_{level}'] is the weakest number here and is " + "worth reading with that in mind. On the LiFePO4 check it comes out " + "at -14%% against a measured -6.8%%, because those energies come " + "from a positions-only relaxation: the cell was held at its " + "experimental shape and never allowed to respond to delithiation. " + "Relaxing the cell would fix that in principle and diverges in " + "practice on this system, which is why the voltage is the number to " + "trust and the volume change is a flag rather than a measurement.\\n\\n" + "Rows whose relaxation did not converge are excluded, and the " + "reference is refused outright if it did not. That is not " + "defensive programming: the first version of this read the energies " + "without checking and returned 78 V for LiFePO4, because a cell " + "relaxation with CHGNet had collapsed the lithiated structure to 2 " + "cubic angstrom per atom and expanded the delithiated one to 117. " + "obs['relax_converged_{level}'] was False for both the whole time. " + "A foundation potential relaxing the cell of a delithiated " + "framework is a known place for this; mv.calc.relax(cell=False) " + "relaxes positions only and is the usual way round it.\\n\\n" + "This is an *average* voltage between two states, not a curve. A " + "real cell has plateaux and slopes set by the intermediate " + "orderings, and resolving them means supplying those intermediates " + "as rows: pass three or more compositions along the same " + "framework and each adjacent pair gets its own step, which " + "uns['electrode'] records.", +) +def voltage(md: AnnData, working_ion: str = "Li", level: str = "emt", + source: str = "input", reference=None, + framework: str | None = None) -> None: + """Intercalation voltage and capacity. Deposits; returns ``None``.""" + from pymatgen.apps.battery.insertion_battery import InsertionElectrode + from pymatgen.core import Composition, Element + from pymatgen.entries.computed_entries import ComputedStructureEntry + + energy_key = f"energy_{level}" + if energy_key not in md.obs: + raise ValueError( + f"obs[{energy_key!r}] absent; run mv.calc.relax(md, " + f"level={level!r}) first — a voltage is a difference of relaxed " + f"energies and an unrelaxed one is not a state of the material") + ion = Element(str(working_ion)) + + if reference is None: + raise ValueError( + f"reference= is required: the voltage is measured against " + f"{ion.symbol} metal, so it needs that metal's energy at the same " + f"level. Pass a one-row object holding a relaxed elemental " + f"{ion.symbol} structure with obs[{energy_key!r}]. Guessing it " + f"would shift every voltage by the same amount, which no " + f"comparison between cathodes would reveal") + if reference.n_obs != 1 or energy_key not in reference.obs: + raise ValueError( + f"reference must be a single row carrying obs[{energy_key!r}]") + reference_structure = structures(reference, source)[0] + per_ion = (float(reference.obs[energy_key].iloc[0]) + / max(len(reference_structure), 1)) + ion_entry = ComputedStructureEntry(reference_structure, + float(reference.obs[energy_key].iloc[0])) + + # A voltage is a difference of relaxed energies, so an unconverged + # relaxation makes it meaningless — and mv.calc.relax already says which + # rows those are. The first version of this read energy_{level} without + # looking, and cheerfully returned 78 V for LiFePO4 from a cell that had + # collapsed to 2 cubic angstrom per atom. The diagnostic existed; the + # function did not consult it. + converged_key = f"relax_converged_{level}" + unconverged = [] + entries, rows = [], [] + for i, structure in enumerate(structures(md, source)): + value = float(md.obs[energy_key].iloc[i]) + if not np.isfinite(value): + continue + if converged_key in md.obs and not bool(md.obs[converged_key].iloc[i]): + unconverged.append(str(md.obs_names[i])) + continue + entries.append(ComputedStructureEntry(structure, value)) + rows.append(i) + + if converged_key in reference.obs and not bool( + reference.obs[converged_key].iloc[0]): + raise ValueError( + f"the {ion.symbol} reference did not converge; every voltage " + f"would be shifted by the same amount and no comparison between " + f"cathodes would reveal it") + + # Group by the framework left when the working ion is removed, so two + # unrelated cathodes in one object do not get averaged into one electrode. + groups: dict = {} + for entry, i in zip(entries, rows): + composition = entry.composition.copy() + stripped = Composition({el: n for el, n in composition.items() + if el.symbol != ion.symbol}) + label = (framework if framework is not None + else stripped.reduced_formula or "empty") + groups.setdefault(label, []).append((entry, i)) + + if unconverged: + warnings.warn( + f"{len(unconverged)} structures are excluded because their " + f"relaxation did not converge: {unconverged[:5]}. A voltage from " + f"an unrelaxed cell is not a voltage. Check " + f"obs['max_force_{level}'] — a cell relaxation with a foundation " + f"potential can run away on a delithiated framework, and " + f"mv.calc.relax(cell=False) is the usual way round it", + RuntimeWarning, stacklevel=2) + + volts = np.full(md.n_obs, np.nan) + grav = np.full(md.n_obs, np.nan) + vol = np.full(md.n_obs, np.nan) + density = np.full(md.n_obs, np.nan) + swelling = np.full(md.n_obs, np.nan) + recorded, failures = {}, [] + + for label, members in groups.items(): + if len(members) < 2: + failures.append( + f"{label}: only one composition, so there is no pair to take " + f"a difference between — supply both the lithiated and the " + f"delithiated form") + continue + try: + electrode = InsertionElectrode.from_entries( + [entry for entry, _ in members], ion_entry) + average = float(electrode.get_average_voltage()) + gravimetric = float(electrode.get_capacity_grav()) + volumetric = float(electrode.get_capacity_vol()) + except Exception as exc: + failures.append(f"{label}: {type(exc).__name__}: {exc}") + continue + + amounts = [entry.composition.get(ion.symbol, 0.0) + for entry, _ in members] + volumes = [entry.structure.volume / len(entry.structure) + for entry, _ in members] + order = int(np.argmax(amounts)), int(np.argmin(amounts)) + change = (100.0 * (volumes[order[0]] - volumes[order[1]]) + / volumes[order[1]]) if volumes[order[1]] else np.nan + + for _, i in members: + volts[i] = average + grav[i] = gravimetric + vol[i] = volumetric + density[i] = average * gravimetric # V * mAh/g = mWh/g + swelling[i] = change + recorded[label] = { + "average_voltage": average, + "capacity_gravimetric_mAh_per_g": gravimetric, + "capacity_volumetric_mAh_per_cc": volumetric, + "volume_change_percent": float(change), + "n_states": len(members), + } + + md.obs[f"voltage_{level}"] = volts + md.obs[f"capacity_gravimetric_{level}"] = grav + md.obs[f"capacity_volumetric_{level}"] = vol + md.obs[f"energy_density_{level}"] = density + md.obs[f"volume_change_{level}"] = swelling + md.uns.setdefault("electrode", {})[level] = { + "working_ion": ion.symbol, + "reference_energy_per_atom": per_ion, + "frameworks": recorded, + "n_failed": len(failures), + "errors": failures[:10], + "unconverged": unconverged[:10], + "note": "average voltage between the supplied states, against the " + "working ion's own metal; not a discharge curve unless the " + "intermediate orderings were supplied as rows", + } + # No set_level here. This derives from energies somebody else computed, + # and stamping the level as "derived" would overwrite the record of the + # calculator that actually produced them — which is the one fact a + # voltage needs carried with it. mv.thermo.hull does not stamp one + # either, for the same reason. + if failures: + warnings.warn( + f"{len(failures)} frameworks produced no voltage; see " + f"uns['electrode'][{level!r}]['errors']. First: {failures[0]}", + RuntimeWarning, stacklevel=2) + record(md, "thermo.voltage", working_ion=ion.symbol, level=level, + source=source) + + +@register_function( + aliases=["theoretical capacity", "maximum capacity", "capacity limit", + "how much lithium can it hold", "ion removal", "ion insertion"], + category="thermo", + description="The capacity a structure could give up or take in, from its " + "oxidation states alone — no delithiated structure needed.", + requires={"structures": ["{source}"]}, + # The placeholder is the parameter's own name: the probe expands claims + # by binding the signature, so {ion} matched nothing and every claim here + # read as unfulfilled. + produces={"obs": ["max_ion_removal_{working_ion}", + "max_ion_insertion_{working_ion}", + "theoretical_capacity_{working_ion}", + "theoretical_capacity_volumetric_{working_ion}"], + "uns": ["theoretical_capacity"]}, + prerequisites=["mv.pp.describe"], + examples=["mv.thermo.theoretical_capacity(md)", + "mv.thermo.theoretical_capacity(md, working_ion='Na')"], + related=["mv.thermo.voltage", "mv.transform.oxidation_states", + "mv.prop.cost"], + notes="mv.thermo.voltage needs both ends of the reaction — the lithiated " + "and the delithiated structure — and gives a voltage. This needs " + "**one** structure and gives an upper bound on capacity, which is " + "the question a screen asks first and much more cheaply. Ranking a " + "library on this and then computing voltages for the survivors is " + "the order that costs least.\\n\\n" + "It is a bound and not a prediction. The number counts the " + "electrons the transition metals could in principle give up, and " + "says nothing about whether the framework survives losing them: " + "LiFePO4 comes out at 169.9 mAh/g against a measured 170 because " + "one electron per iron is exactly what happens there, and a " + "material whose framework collapses at half that will report the " + "same bound.\\n\\n" + "Oxidation states come from bond valence, which is a fit to bond " + "lengths and fails on structures far from the ones it was fitted " + "to. A row it cannot assign is left NaN and counted rather than " + "guessed, because a wrong oxidation state changes the answer by a " + "whole electron.", +) +def theoretical_capacity(md: AnnData, working_ion: str = "Li", + source: str = "input") -> None: + """Capacity bound from oxidation states. Deposits; returns ``None``.""" + from pymatgen.analysis.bond_valence import BVAnalyzer + from pymatgen.apps.battery.analyzer import BatteryAnalyzer + + ion = str(working_ion) + removal = np.full(md.n_obs, np.nan) + insertion = np.full(md.n_obs, np.nan) + gravimetric = np.full(md.n_obs, np.nan) + volumetric = np.full(md.n_obs, np.nan) + failures = [] + + analyzer = BVAnalyzer() + for i, structure in enumerate(structures(md, source)): + try: + decorated = analyzer.get_oxi_state_decorated_structure(structure) + except Exception as exc: + failures.append( + f"{md.obs_names[i]}: bond valence could not assign oxidation " + f"states ({type(exc).__name__}: {exc})") + continue + try: + battery = BatteryAnalyzer(decorated, working_ion=ion) + removal[i] = float(battery.max_ion_removal) + insertion[i] = float(battery.max_ion_insertion) + gravimetric[i] = float(battery.get_max_capgrav()) + volumetric[i] = float(battery.get_max_capvol()) + except Exception as exc: + failures.append(f"{md.obs_names[i]}: {type(exc).__name__}: {exc}") + + md.obs[f"max_ion_removal_{ion}"] = removal + md.obs[f"max_ion_insertion_{ion}"] = insertion + md.obs[f"theoretical_capacity_{ion}"] = gravimetric + md.obs[f"theoretical_capacity_volumetric_{ion}"] = volumetric + md.uns.setdefault("theoretical_capacity", {})[ion] = { + "working_ion": ion, + "source": str(source), + "oxidation_states": "bond valence", + "capacity_unit": "mAh/g", + "n_failed": len(failures), + "errors": failures[:10], + "note": "an upper bound from electron counting; it says nothing " + "about whether the framework survives being emptied", + } + if failures: + warnings.warn( + f"{len(failures)} of {md.n_obs} structures got no capacity; see " + f"uns['theoretical_capacity'][{ion!r}]['errors']. First: " + f"{failures[0]}", RuntimeWarning, stacklevel=2) + record(md, "thermo.theoretical_capacity", working_ion=ion, source=source) diff --git a/matverse_guide/docs/_scripts/nb_beyond_one_number.py b/matverse_guide/docs/_scripts/nb_beyond_one_number.py index cbfa9a9..ec96da9 100644 --- a/matverse_guide/docs/_scripts/nb_beyond_one_number.py +++ b/matverse_guide/docs/_scripts/nb_beyond_one_number.py @@ -1038,5 +1038,205 @@ def cell(formula): A material containing an element the database does not assess is **skipped and counted**, never projected onto the elements that remain. Dropping the copper from PbSnCu and renormalising would answer a question about a different alloy. +```"""), + + ("markdown", """\ +## A voltage is a slope on the hull + +`mv.thermo.hull` already computes the energies an intercalation voltage is made +of. The voltage *is* the hull slope along the working-ion axis: + +$$V = -\\frac{E_{\\mathrm{lithiated}} - E_{\\mathrm{delithiated}} - n\\,E_{\\mathrm{Li}}}{n}$$ + +in volts, because an electron carries one. `mv.thermo.voltage` reads it off."""), + + ("code", """\ +from pymatgen.core import Lattice, Structure + +cathode = mv.datasets.load("battery_cathodes")[:1].copy() +lithiated = mv.structures(cathode, "input")[0] +delithiated = lithiated.copy() +delithiated.remove_species(["Li"]) + +electrode = mv.data.from_structures([lithiated, delithiated]) +electrode.obs_names = ["LiFePO4", "FePO4"] +metal = mv.data.from_structures([Structure( + Lattice.cubic(3.51), ["Li", "Li"], [[0, 0, 0], [.5, .5, .5]])]) + +try: + # cell=False on purpose: see the warning below. + for piece in (electrode, metal): + mv.calc.relax(piece, level="chgnet", fmax=0.05, cell=False) + mv.thermo.voltage(electrode, working_ion="Li", level="chgnet", + source="relaxed_chgnet", reference=metal) + print(electrode.obs[["voltage_chgnet", "capacity_gravimetric_chgnet", + "energy_density_chgnet"]].round(2).head(1).to_string()) +except (ImportError, KeyError) as exc: + print("needs CHGNet; pip install matverse[potentials]", exc)"""), + + ("markdown", """\ +**3.50 V and 169.9 mAh/g**, against a measured plateau of 3.4–3.5 V and a +theoretical capacity of 170. CHGNet is trained on PBE+U, which is the +functional this problem needs — plain PBE gives closer to 3.0 V for the same +material, and `level=` is what records which was used. + +```{warning} +`cell=False` is not incidental. Relaxing the **cell** of these structures with a +foundation potential diverges: it collapsed LiFePO₄ to 2 ų per atom and +expanded FePO₄ to 117, and the first version of `mv.thermo.voltage` read the +resulting energies and returned **78 V**. `mv.calc.relax` had recorded +`relax_converged_chgnet = False` for both rows the whole time — the diagnostic +existed and the function did not consult it. + +It does now: unconverged rows are excluded and counted, and an unconverged +**reference** raises outright, because a bad lithium-metal energy shifts every +voltage by the same amount and no comparison between cathodes would reveal it. +``` + +`obs['volume_change_chgnet']` is the weakest number of the set — about −14% +here against a measured −6.8%, precisely because the cell was held fixed and +never allowed to respond to delithiation. It is a flag, not a measurement."""), + + ("markdown", """\ +### The cheaper question, asked first + +A voltage needs both ends of the reaction. `mv.thermo.theoretical_capacity` +needs **one structure** and counts the electrons the transition metals could +give up — which is the question a screen asks first, and much more cheaply."""), + + ("code", """\ +library = mv.datasets.load("battery_cathodes") +mv.thermo.theoretical_capacity(library, working_ion="Li") +mv.thermo.theoretical_capacity(library, working_ion="Na") +print(library.obs[["theoretical_capacity_Li", + "theoretical_capacity_Na"]].round(1).to_string())"""), + + ("markdown", """\ +LiFePO₄ gives 169.9 mAh/g for lithium and zero for sodium; NaFePO₄ gives 154.2 +for sodium — the measured figure is about 154 — and zero for lithium. Asking a +lithium compound how much sodium it can release is answered correctly rather +than approximately. + +It is a **bound**, not a prediction. The number counts electrons and says +nothing about whether the framework survives losing them; a material that +collapses at half this will report the same figure. Rank a library on it, then +compute voltages for the survivors — that is the order that costs least."""), + + ("markdown", """\ +## Three numbers where matverse has one and a half + +Some quantities are a formula over inputs matverse cannot produce, and the +useful thing is to be exact about which half is which. + +`mv.prop.superconductivity` computes ω_log — a moment of the phonon density of +states `mv.prop.phonon` already produced — and then applies Allen-Dynes. It +**will not** guess the electron–phonon coupling λ, which is an integral over +α²F and needs EPW or `ph.x`, not a phonon spectrum."""), + + ("code", """\ +metals = mv.datasets.metals(["Cu", "Al"]) +mv.pp.describe(metals) +mv.calc.relax(metals, level="emt", fmax=0.01) +mv.prop.phonon(metals, level="emt", source="relaxed_emt", supercell=(2, 2, 2)) + +mv.prop.superconductivity(metals, level="emt", coupling=1.0) +print(metals.obs[["name", "omega_log_emt", "critical_temperature_emt"]] + .round(3).to_string(index=False)) + +try: + mv.prop.superconductivity(metals, level="emt") +except ValueError as exc: + print(f"\\nwithout a coupling: {str(exc)[:70]}...")"""), + + ("markdown", """\ +λ = 1.0 there was **supplied, not computed**, so the temperatures are what that +coupling would imply and not a prediction about copper — whose real λ is about +0.13, below the threshold where the formula has a solution at all, and which is +not a superconductor. + +ω_log is the computed half and is checkable: a density of states with all its +weight at one frequency returns that frequency exactly, and one with equal +weight at 4 and 16 THz returns 5.28 rather than the geometric mean of 8, because +the 1/ω weighting favours the soft end. + +```{note} +ω_log is properly a moment of α²F, not of the phonon density of states. Using +the latter assumes the coupling does not depend on frequency — the Einstein-like +limit, wrong wherever one branch couples much more strongly than another, which +is most interesting superconductors. `uns` records that the substitution was +made. +``` + +### The same shape, for thermoelectrics + +`mv.elec.transport` produces σ/τ rather than σ, because the constant relaxation +time approximation declines to supply τ. So `mv.prop.zt` requires it — and +computes, separately, the one number that does not need it."""), + + ("code", """\ +thermo = mv.data.from_compositions(["Bi2Te3"]) +thermo.obs["seebeck_x"] = [200e-6] # V/K +thermo.obs["thermal_conductivity_x"] = [1.0] # W/m/K + +for sigma_over_tau in (1e17, 1e19, 1e22): + row = thermo.copy() + row.obs["sigma_over_tau_x"] = [sigma_over_tau] + mv.prop.zt(row, level="x", relaxation_time=1e-14, temperature=700.0) + print(f"sigma/tau={sigma_over_tau:.0e} " + f"zT={float(row.obs['zt_x'].iloc[0]):.4f} " + f"ceiling={float(row.obs['zt_ceiling_x'].iloc[0]):.4f}")"""), + + ("markdown", """\ +zT climbs with conductivity and **stops** at 1.639. That ceiling is `S²/L`, and +τ cancels out of it exactly: it appears in σ and again in the electronic thermal +conductivity through Wiedemann–Franz, so as the lattice term stops mattering the +unknown divides out. + +The consequence is worth stating plainly. **A material whose Seebeck coefficient +puts its ceiling below the zT you need cannot be rescued by any conductivity** — +and that conclusion survives not knowing τ, which is the number nobody has. + +## Scaling relations, and why a reaction has a ceiling + +Adsorbates that bind through the same atom bind in proportion. That is why a +screen over a whole reaction can run on one descriptor — and why the reaction +has a ceiling, because the intermediate you want bound weakly is tied to the one +you want bound strongly."""), + + ("code", """\ +import numpy as np + +rng = np.random.default_rng(0) +oxygen = np.linspace(-2.5, 0.5, 8) +surfaces = mv.data.from_compositions([f"Pt{i + 1}" for i in range(8)]) +surfaces.obs["E_O"] = oxygen +surfaces.obs["E_OH"] = 0.5 * oxygen - 0.10 + rng.normal(0, 0.02, 8) + +mv.surf.scaling(surfaces, x="E_O", y="E_OH") +fit = surfaces.uns["scaling"]["fits"]["all"] +print(f"slope {fit['slope']:.3f} intercept {fit['intercept_eV']:.3f} eV " + f"R2 {fit['r_squared']:.4f}") + +mv.surf.volcano(surfaces, descriptor="E_O", optimum=-1.6) +print(surfaces.obs[["E_O", "scaling_residual", "distance_from_optimum", + "volcano_activity"]].round(3).to_string())"""), + + ("markdown", """\ +The slope is the physical claim: a species bonding through one atom with *n* +remaining valences scales against a reference with *m* as roughly *n/m*, so OH +against O is about ½. A fitted slope far from a small rational number usually +means the two species are not binding the way the argument assumes. + +`scaling_residual` is the interesting column, not the fit. A catalyst that beats +the scaling ceiling has to **break** the relation, so a large residual is a +candidate and a small one confirms the surface offers nothing new. + +```{warning} +The volcano's **optimum is an input**. Where the peak sits depends on the +reaction, the potential and the conditions, and it comes from a microkinetic +model or an experiment — not from here. `volcano_activity` is in arbitrary units +and only its ordering means anything; `distance_from_optimum` is in eV and +signed, so it says which side a surface falls on. Binding too weakly and too +strongly are different problems and a magnitude cannot tell them apart. ```"""), ] diff --git a/matverse_guide/docs/_scripts/nb_dynamics.py b/matverse_guide/docs/_scripts/nb_dynamics.py index 361a47b..09584c8 100644 --- a/matverse_guide/docs/_scripts/nb_dynamics.py +++ b/matverse_guide/docs/_scripts/nb_dynamics.py @@ -260,6 +260,55 @@ def torchsim_factory(): beyond it. Short-range order without long-range order is the definition of a glass, and this is what it looks like as a measurement. +### What a diffractometer would actually see + +g(r) is not what a total-scattering experiment reports. `mv.prop.scattering` +applies the two standard transforms — the structure factor S(q) and the reduced +pair distribution function G(r) — so a quenched structure made here can be +compared against a measured one."""), + + ("code", """\ +mv.prop.scattering(copper, level="amorphous", source="amorphous_emt", + q_max=12.0) + +q = mv.grid_of(copper, "structure_factor") +fig, axes = plt.subplots(1, 2, figsize=(11, 3.8)) +axes[0].plot(q, copper.obsm["structure_factor_amorphous"][0], linewidth=1.0) +axes[0].axhline(1.0, linestyle="--", color="#888", linewidth=0.8) +axes[0].set_xlabel("q (Å⁻¹)"); axes[0].set_ylabel("S(q)") +axes[0].set_title("structure factor") + +r_pdf = mv.grid_of(copper, "pdf") +axes[1].plot(r_pdf, copper.obsm["pdf_amorphous"][0], linewidth=1.0) +axes[1].axhline(0.0, linestyle="--", color="#888", linewidth=0.8) +axes[1].set_xlabel("r (Å)"); axes[1].set_ylabel("G(r)") +axes[1].set_title("reduced pair distribution") +fig.tight_layout()"""), + + ("markdown", """\ +Both are definitions rather than models: + +$$S(q) = 1 + \\frac{4\\pi\\rho}{q}\\int r\\,[g(r)-1]\\,\\sin(qr)\\,\\mathrm{d}r +\\qquad G(r) = 4\\pi r \\rho\\,[g(r)-1]$$ + +which makes them checkable. For an ideal gas, g = 1 everywhere and S(q) comes +back as 1.000000 at every q; for a hard-sphere exclusion the transform has a +closed form and this reproduces it. + +```{warning} +**This is a technique for disordered matter, and applying it to a crystal +produces nonsense.** A crystal's g(r) never decays to one, so truncating it at +`r_max` and transforming produces termination ripple larger than any real peak +— on the four textbook structures in `mv.datasets` the apparent "first peak" of +S(q) is entirely ripple. `mv.prop.xrd` is the function for a crystalline +diffraction pattern. + +The accuracy also follows the r grid `mv.prop.rdf` produced, linearly: against +the hard-sphere closed form the error is 0.24 at a step of 0.10 Å, 0.12 at 0.05, +and 0.012 at 0.005. The default is fine for a shape and coarse for a comparison +against a measurement. +``` + ## What the object remembers"""), ("code", """\ diff --git a/matverse_guide/docs/api/user.md b/matverse_guide/docs/api/user.md index e0b0fff..269368d 100644 --- a/matverse_guide/docs/api/user.md +++ b/matverse_guide/docs/api/user.md @@ -12,7 +12,7 @@ agent. Every entry names the state it reads and the state it writes, and each of those claims is verified by execution in `tests/test_contracts.py` rather than asserted. -Public registry entries listed here: 218 +Public registry entries listed here: 225 Look a function up by intent rather than by name: @@ -183,11 +183,14 @@ Derived properties, including curves stored on a shared grid. prop.polarization prop.quasiharmonic prop.rdf + prop.scattering prop.slme + prop.superconductivity prop.supply_risk prop.tem prop.thermal_conductivity prop.xrd + prop.zt ``` @@ -258,9 +261,11 @@ Slabs, surface energies, equilibrium shapes and adsorption. surf.adsorption_energy surf.adsorption_sites + surf.scaling surf.slabs surf.surface_energy surf.surface_energy_chempot + surf.volcano surf.wulff ``` @@ -284,6 +289,8 @@ Convex hull, reactions, chemical potentials. thermo.pourbaix thermo.reaction thermo.references_from_mp + thermo.theoretical_capacity + thermo.voltage ``` @@ -628,11 +635,14 @@ arguments — `obs['energy_{level}']` becomes `obs['energy_emt']` when you pass | `mv.prop.polarization` | `obs['polarization_a']`, `obs['polarization_b']`, `obs['polarization_c']`, `uns['polarization']` | | `mv.prop.quasiharmonic` | `obs['thermal_expansion_qha_{level}']`, `obs['gruneisen_{level}']`, `obs['debye_temperature_qha_{level}']`, `obs['heat_capacity_300K_{level}']`, `obsm['gibbs_{level}']`, `obsm['thermal_expansion_{level}']`, `uns['grids']`, `uns['levels']['{level}']` | | `mv.prop.rdf` | `obsm['rdf_{level}']`, `uns['grids']`, `uns['levels']['{level}']` | +| `mv.prop.scattering` | `obsm['structure_factor_{level}']`, `obsm['pdf_{level}']`, `uns['grids']`, `uns['scattering']` | | `mv.prop.slme` | `obs['slme_{level}']`, `obs['sq_limit_{level}']` | +| `mv.prop.superconductivity` | `obs['omega_log_{level}']`, `obs['omega_2_{level}']`, `obs['critical_temperature_{level}']`, `uns['superconductivity']` | | `mv.prop.supply_risk` | `obs['hhi_production']`, `obs['hhi_reserve']`, `obs['supply_risk']` | | `mv.prop.tem` | `obsm['tem_{level}']`, `uns['grids']`, `obs['tem_n_reflections_{level}']`, `obs['tem_strongest_{level}']`, `obs['tem_zone_axis']`, `uns['levels']['{level}']` | | `mv.prop.thermal_conductivity` | `obs['debye_temperature_{level}']`, `obs['gruneisen_{level}']`, `obs['sound_velocity_{level}']`, `obs['thermal_conductivity_{level}']` | | `mv.prop.xrd` | `obsm['xrd_{level}']`, `uns['grids']`, `uns['levels']['{level}']` | +| `mv.prop.zt` | `obs['zt_{level}']`, `obs['zt_ceiling_{level}']`, `obs['kappa_electronic_{level}']`, `uns['figure_of_merit']` | | `mv.md.conductivity` | `obs['conductivity_{species}_{level}']` | | `mv.md.melt_quench` | `obsm['structures']['amorphous_{level}']`, `obs['amorphous_density_{level}']`, `obs['amorphous_density_ratio_{level}']`, `uns['levels']['{level}']` | | `mv.md.occupancy` | `obs['occupied_fraction_{level}']`, `obs['occupancy_entropy_{level}']`, `obs['occupancy_peak_{level}']` | @@ -650,8 +660,10 @@ arguments — `obs['energy_{level}']` becomes `obs['energy_emt']` when you pass | `mv.neb.hop_endpoints` | `obsm['structures']['{key_added}_initial']`, `obsm['structures']['{key_added}_final']`, `obs['hop_distance']`, `obs['hop_species']` | | `mv.neb.percolation` | `obs['percolation_dimensionality_{species}']`, `obs['percolation_threshold_{species}']`, `obs['percolation_sites_{species}']` | | `mv.surf.adsorption_energy` | `obs['adsorption_energy_{level}']`, `obs['is_best_site_{level}']` | +| `mv.surf.scaling` | `obs['scaling_residual']`, `uns['scaling']` | | `mv.surf.surface_energy` | `obs['surface_energy_{level}']`, `obs['surface_energy_{level}_off_stoichiometry']` | | `mv.surf.surface_energy_chempot` | `facets.obs['surface_energy_{level}']` | +| `mv.surf.volcano` | `obs['volcano_activity']`, `obs['distance_from_optimum']`, `uns['volcano']` | | `mv.surf.wulff` | `facets.obs['wulff_area_fraction_{level}']`, `bulk.obs['wulff_effective_radius_{level}']`, `bulk.obs['wulff_shape_factor_{level}']` | | `mv.thermo.calphad` | `obs['calphad_phases']`, `obs['calphad_n_phases']`, `obs['calphad_major_phase']`, `obs['calphad_major_fraction']`, `uns['calphad']` | | `mv.thermo.chempot_diagram` | `obs['chempot_stable_{level}']`, `obs['chempot_window_{level}']`, `uns['chempot_diagram']` | @@ -662,6 +674,8 @@ arguments — `obs['energy_{level}']` becomes `obs['energy_emt']` when you pass | `mv.thermo.hull` | `obs['e_above_hull_{level}']`, `obs['is_stable_{level}']`, `obs['formation_energy_{level}']`, `obs['decomposes_to_{level}']`, `uns['phase_diagram']` | | `mv.thermo.pourbaix` | `obs['pourbaix_decomposition']`, `uns['pourbaix']` | | `mv.thermo.reaction` | `uns['reactions']` | +| `mv.thermo.theoretical_capacity` | `obs['max_ion_removal_{working_ion}']`, `obs['max_ion_insertion_{working_ion}']`, `obs['theoretical_capacity_{working_ion}']`, `obs['theoretical_capacity_volumetric_{working_ion}']`, `uns['theoretical_capacity']` | +| `mv.thermo.voltage` | `obs['voltage_{level}']`, `obs['capacity_gravimetric_{level}']`, `obs['capacity_volumetric_{level}']`, `obs['energy_density_{level}']`, `obs['volume_change_{level}']`, `uns['electrode']` | | `mv.dft.read_dos` | `obsm['dos_{level}']`, `obs['band_gap_{level}']`, `obs['is_direct_gap_{level}']`, `obs['vbm_{level}']`, `obs['cbm_{level}']`, `obs['fermi_level_{level}']`, `obs['dos_at_fermi_{level}']`, `obs['is_metal_{level}']`, `uns['grids']`, `uns['levels']['{level}']` | | `mv.dft.read_outputs` | `obs['energy_{level}']`, `obs['energy_per_atom_{level}']`, `obs['band_gap_{level}']`, `obs['converged_{level}']`, `obsm['structures']['relaxed_{level}']`, `uns['levels']['{level}']`, `uns['dft']` | | `mv.dft.write_inputs` | `obs['dft_directory']`, `written to disk`, `uns['dft']` | diff --git a/matverse_guide/docs/tutorials/beyond_one_number.ipynb b/matverse_guide/docs/tutorials/beyond_one_number.ipynb index 3259c99..35da86b 100644 --- a/matverse_guide/docs/tutorials/beyond_one_number.ipynb +++ b/matverse_guide/docs/tutorials/beyond_one_number.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "0f311cf2", + "id": "10ba58a7", "metadata": {}, "source": [ "# Beyond one number per material\n", @@ -19,13 +19,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "f3e78770", + "id": "00ddfe50", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:37.044993Z", - "iopub.status.busy": "2026-08-05T21:18:37.044882Z", - "iopub.status.idle": "2026-08-05T21:18:43.435641Z", - "shell.execute_reply": "2026-08-05T21:18:43.435142Z" + "iopub.execute_input": "2026-08-06T04:55:05.473295Z", + "iopub.status.busy": "2026-08-06T04:55:05.472916Z", + "iopub.status.idle": "2026-08-06T04:55:15.941549Z", + "shell.execute_reply": "2026-08-06T04:55:15.941107Z" } }, "outputs": [ @@ -69,7 +69,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -85,7 +85,7 @@ }, { "cell_type": "markdown", - "id": "ab47d7c0", + "id": "46c3907b", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -98,13 +98,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "23f7d5d5", + "id": "a7940cc7", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.436855Z", - "iopub.status.busy": "2026-08-05T21:18:43.436516Z", - "iopub.status.idle": "2026-08-05T21:18:43.458888Z", - "shell.execute_reply": "2026-08-05T21:18:43.458542Z" + "iopub.execute_input": "2026-08-06T04:55:15.942947Z", + "iopub.status.busy": "2026-08-06T04:55:15.942369Z", + "iopub.status.idle": "2026-08-06T04:55:15.969557Z", + "shell.execute_reply": "2026-08-06T04:55:15.969230Z" } }, "outputs": [ @@ -218,7 +218,7 @@ }, { "cell_type": "markdown", - "id": "1bf17fa6", + "id": "f1d0a7c3", "metadata": {}, "source": [ "## Curves live in `obsm` on a shared grid\n", @@ -232,13 +232,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "f952ae2c", + "id": "47d6e2f4", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.459644Z", - "iopub.status.busy": "2026-08-05T21:18:43.459551Z", - "iopub.status.idle": "2026-08-05T21:18:43.500935Z", - "shell.execute_reply": "2026-08-05T21:18:43.500549Z" + "iopub.execute_input": "2026-08-06T04:55:15.970384Z", + "iopub.status.busy": "2026-08-06T04:55:15.970235Z", + "iopub.status.idle": "2026-08-06T04:55:16.013058Z", + "shell.execute_reply": "2026-08-06T04:55:16.012726Z" } }, "outputs": [ @@ -261,7 +261,7 @@ }, { "cell_type": "markdown", - "id": "dcababdc", + "id": "6815bdf2", "metadata": {}, "source": [ "The block is named `'_'`, exactly like a scalar:\n", @@ -287,13 +287,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "04f3aa33", + "id": "b8f20261", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.501777Z", - "iopub.status.busy": "2026-08-05T21:18:43.501688Z", - "iopub.status.idle": "2026-08-05T21:18:43.503979Z", - "shell.execute_reply": "2026-08-05T21:18:43.503680Z" + "iopub.execute_input": "2026-08-06T04:55:16.013919Z", + "iopub.status.busy": "2026-08-06T04:55:16.013764Z", + "iopub.status.idle": "2026-08-06T04:55:16.016414Z", + "shell.execute_reply": "2026-08-06T04:55:16.016148Z" } }, "outputs": [ @@ -319,13 +319,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "9b726855", + "id": "7fc789ce", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.504668Z", - "iopub.status.busy": "2026-08-05T21:18:43.504584Z", - "iopub.status.idle": "2026-08-05T21:18:43.654101Z", - "shell.execute_reply": "2026-08-05T21:18:43.653781Z" + "iopub.execute_input": "2026-08-06T04:55:16.017152Z", + "iopub.status.busy": "2026-08-06T04:55:16.017017Z", + "iopub.status.idle": "2026-08-06T04:55:16.195341Z", + "shell.execute_reply": "2026-08-06T04:55:16.194941Z" } }, "outputs": [ @@ -362,7 +362,7 @@ }, { "cell_type": "markdown", - "id": "658f9aac", + "id": "7f85fe62", "metadata": {}, "source": [ "`mv.prop.rdf` is the other curve that ships, and it earns its place by doing\n", @@ -372,13 +372,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "f06e790b", + "id": "2b5dddd3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.655252Z", - "iopub.status.busy": "2026-08-05T21:18:43.655152Z", - "iopub.status.idle": "2026-08-05T21:18:43.809081Z", - "shell.execute_reply": "2026-08-05T21:18:43.808691Z" + "iopub.execute_input": "2026-08-06T04:55:16.196274Z", + "iopub.status.busy": "2026-08-06T04:55:16.196099Z", + "iopub.status.idle": "2026-08-06T04:55:16.361256Z", + "shell.execute_reply": "2026-08-06T04:55:16.360855Z" } }, "outputs": [ @@ -417,7 +417,7 @@ }, { "cell_type": "markdown", - "id": "cbb2c639", + "id": "d1568267", "metadata": {}, "source": [ "Two polymorphs have the same composition, so `X` cannot tell them apart and\n", @@ -438,13 +438,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "8cc3a6d7", + "id": "657fa483", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.809933Z", - "iopub.status.busy": "2026-08-05T21:18:43.809843Z", - "iopub.status.idle": "2026-08-05T21:18:43.813630Z", - "shell.execute_reply": "2026-08-05T21:18:43.813294Z" + "iopub.execute_input": "2026-08-06T04:55:16.362525Z", + "iopub.status.busy": "2026-08-06T04:55:16.362369Z", + "iopub.status.idle": "2026-08-06T04:55:16.367117Z", + "shell.execute_reply": "2026-08-06T04:55:16.366782Z" } }, "outputs": [ @@ -467,13 +467,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "e624a749", + "id": "c22f07bf", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.814411Z", - "iopub.status.busy": "2026-08-05T21:18:43.814310Z", - "iopub.status.idle": "2026-08-05T21:18:43.820312Z", - "shell.execute_reply": "2026-08-05T21:18:43.820025Z" + "iopub.execute_input": "2026-08-06T04:55:16.367986Z", + "iopub.status.busy": "2026-08-06T04:55:16.367817Z", + "iopub.status.idle": "2026-08-06T04:55:16.374902Z", + "shell.execute_reply": "2026-08-06T04:55:16.374582Z" } }, "outputs": [ @@ -501,13 +501,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "5718b02a", + "id": "698e7a22", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.821023Z", - "iopub.status.busy": "2026-08-05T21:18:43.820935Z", - "iopub.status.idle": "2026-08-05T21:18:43.825066Z", - "shell.execute_reply": "2026-08-05T21:18:43.824743Z" + "iopub.execute_input": "2026-08-06T04:55:16.376899Z", + "iopub.status.busy": "2026-08-06T04:55:16.376736Z", + "iopub.status.idle": "2026-08-06T04:55:16.381681Z", + "shell.execute_reply": "2026-08-06T04:55:16.381373Z" } }, "outputs": [ @@ -622,7 +622,7 @@ }, { "cell_type": "markdown", - "id": "e13f9473", + "id": "fdf340d9", "metadata": {}, "source": [ "One row per atom, with `obs['material']` pointing back at the parent. Per-atom\n", @@ -632,13 +632,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "efae5334", + "id": "3f459798", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.825742Z", - "iopub.status.busy": "2026-08-05T21:18:43.825658Z", - "iopub.status.idle": "2026-08-05T21:18:43.846957Z", - "shell.execute_reply": "2026-08-05T21:18:43.846657Z" + "iopub.execute_input": "2026-08-06T04:55:16.382512Z", + "iopub.status.busy": "2026-08-06T04:55:16.382350Z", + "iopub.status.idle": "2026-08-06T04:55:16.405333Z", + "shell.execute_reply": "2026-08-06T04:55:16.404990Z" } }, "outputs": [ @@ -662,13 +662,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "07889654", + "id": "ee2a7d85", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.847632Z", - "iopub.status.busy": "2026-08-05T21:18:43.847548Z", - "iopub.status.idle": "2026-08-05T21:18:43.852148Z", - "shell.execute_reply": "2026-08-05T21:18:43.851849Z" + "iopub.execute_input": "2026-08-06T04:55:16.406167Z", + "iopub.status.busy": "2026-08-06T04:55:16.406002Z", + "iopub.status.idle": "2026-08-06T04:55:16.411437Z", + "shell.execute_reply": "2026-08-06T04:55:16.411118Z" } }, "outputs": [ @@ -775,13 +775,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "4a7648fc", + "id": "25addaae", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.852819Z", - "iopub.status.busy": "2026-08-05T21:18:43.852733Z", - "iopub.status.idle": "2026-08-05T21:18:43.941899Z", - "shell.execute_reply": "2026-08-05T21:18:43.941557Z" + "iopub.execute_input": "2026-08-06T04:55:16.412223Z", + "iopub.status.busy": "2026-08-06T04:55:16.412053Z", + "iopub.status.idle": "2026-08-06T04:55:16.510971Z", + "shell.execute_reply": "2026-08-06T04:55:16.510576Z" } }, "outputs": [ @@ -821,7 +821,7 @@ }, { "cell_type": "markdown", - "id": "67548138", + "id": "fc211ae9", "metadata": {}, "source": [ "One point per atom says which atoms are unrelaxed. The other question is what\n", @@ -833,13 +833,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "6a3a3ea1", + "id": "610bc9ec", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.942783Z", - "iopub.status.busy": "2026-08-05T21:18:43.942697Z", - "iopub.status.idle": "2026-08-05T21:18:44.120283Z", - "shell.execute_reply": "2026-08-05T21:18:44.119886Z" + "iopub.execute_input": "2026-08-06T04:55:16.511884Z", + "iopub.status.busy": "2026-08-06T04:55:16.511716Z", + "iopub.status.idle": "2026-08-06T04:55:16.731069Z", + "shell.execute_reply": "2026-08-06T04:55:16.730683Z" } }, "outputs": [ @@ -877,7 +877,7 @@ }, { "cell_type": "markdown", - "id": "cd835cc4", + "id": "ec7a94e6", "metadata": {}, "source": [ "Shared bins across the elements, which is the only way the two are being\n", @@ -888,7 +888,7 @@ }, { "cell_type": "markdown", - "id": "f1f5c49c", + "id": "ea06ed95", "metadata": {}, "source": [ "Twenty-six points where the material axis has room for seven — which is the\n", @@ -913,13 +913,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "f909225a", + "id": "c08ce0ef", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.121134Z", - "iopub.status.busy": "2026-08-05T21:18:44.121043Z", - "iopub.status.idle": "2026-08-05T21:18:44.125807Z", - "shell.execute_reply": "2026-08-05T21:18:44.125493Z" + "iopub.execute_input": "2026-08-06T04:55:16.731983Z", + "iopub.status.busy": "2026-08-06T04:55:16.731815Z", + "iopub.status.idle": "2026-08-06T04:55:16.737501Z", + "shell.execute_reply": "2026-08-06T04:55:16.737183Z" } }, "outputs": [ @@ -1012,7 +1012,7 @@ }, { "cell_type": "markdown", - "id": "66015aed", + "id": "a8950568", "metadata": {}, "source": [ "The largest force in each cell, on the material axis, where a screen can reach\n", @@ -1023,13 +1023,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "a9389526", + "id": "62181a59", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.126693Z", - "iopub.status.busy": "2026-08-05T21:18:44.126609Z", - "iopub.status.idle": "2026-08-05T21:18:44.131373Z", - "shell.execute_reply": "2026-08-05T21:18:44.131082Z" + "iopub.execute_input": "2026-08-06T04:55:16.738339Z", + "iopub.status.busy": "2026-08-06T04:55:16.738164Z", + "iopub.status.idle": "2026-08-06T04:55:16.743751Z", + "shell.execute_reply": "2026-08-06T04:55:16.743450Z" } }, "outputs": [ @@ -1129,7 +1129,7 @@ }, { "cell_type": "markdown", - "id": "896c0503", + "id": "e84f3a0c", "metadata": {}, "source": [ "The detail stays on the sites object where it can still be inspected; the\n", @@ -1145,13 +1145,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "d450899c", + "id": "3ccaccd1", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.132099Z", - "iopub.status.busy": "2026-08-05T21:18:44.132018Z", - "iopub.status.idle": "2026-08-05T21:18:44.142449Z", - "shell.execute_reply": "2026-08-05T21:18:44.142146Z" + "iopub.execute_input": "2026-08-06T04:55:16.744555Z", + "iopub.status.busy": "2026-08-06T04:55:16.744398Z", + "iopub.status.idle": "2026-08-06T04:55:16.756179Z", + "shell.execute_reply": "2026-08-06T04:55:16.755868Z" } }, "outputs": [ @@ -1235,7 +1235,7 @@ }, { "cell_type": "markdown", - "id": "28618042", + "id": "489e56bd", "metadata": {}, "source": [ "That is `rank_genes_groups` answering \"which elements sit in the highest-force\n", @@ -1247,13 +1247,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "69d1d1b1", + "id": "1b6545ed", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.143141Z", - "iopub.status.busy": "2026-08-05T21:18:44.143059Z", - "iopub.status.idle": "2026-08-05T21:18:44.169782Z", - "shell.execute_reply": "2026-08-05T21:18:44.169478Z" + "iopub.execute_input": "2026-08-06T04:55:16.756962Z", + "iopub.status.busy": "2026-08-06T04:55:16.756806Z", + "iopub.status.idle": "2026-08-06T04:55:16.786999Z", + "shell.execute_reply": "2026-08-06T04:55:16.786653Z" } }, "outputs": [ @@ -1308,7 +1308,7 @@ }, { "cell_type": "markdown", - "id": "7cb28373", + "id": "7cb69d3a", "metadata": {}, "source": [ "Optional throughout. matverse's operations take `AnnData`, and the sites object\n", @@ -1319,13 +1319,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "8e729de3", + "id": "4cfebb94", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.170490Z", - "iopub.status.busy": "2026-08-05T21:18:44.170406Z", - "iopub.status.idle": "2026-08-05T21:18:44.461946Z", - "shell.execute_reply": "2026-08-05T21:18:44.461586Z" + "iopub.execute_input": "2026-08-06T04:55:16.787859Z", + "iopub.status.busy": "2026-08-06T04:55:16.787694Z", + "iopub.status.idle": "2026-08-06T04:55:17.089552Z", + "shell.execute_reply": "2026-08-06T04:55:17.089178Z" } }, "outputs": [ @@ -1434,7 +1434,7 @@ }, { "cell_type": "markdown", - "id": "9a4ea760", + "id": "969f6bad", "metadata": {}, "source": [ "A TEM pattern is spots on a plane, and a plane of spots does not compare across\n", @@ -1458,7 +1458,7 @@ }, { "cell_type": "markdown", - "id": "04b737ea", + "id": "dd901a7b", "metadata": {}, "source": [ "## A result computed somewhere else\n", @@ -1487,13 +1487,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "55b7a989", + "id": "859a0910", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.462946Z", - "iopub.status.busy": "2026-08-05T21:18:44.462857Z", - "iopub.status.idle": "2026-08-05T21:18:44.475652Z", - "shell.execute_reply": "2026-08-05T21:18:44.475251Z" + "iopub.execute_input": "2026-08-06T04:55:17.091329Z", + "iopub.status.busy": "2026-08-06T04:55:17.090884Z", + "iopub.status.idle": "2026-08-06T04:55:17.106412Z", + "shell.execute_reply": "2026-08-06T04:55:17.105797Z" } }, "outputs": [ @@ -1602,7 +1602,7 @@ }, { "cell_type": "markdown", - "id": "3033e5f1", + "id": "94194ff2", "metadata": {}, "source": [ "`sigma_iso` is 30, the trace over three. `zeta` is 30, which is\n", @@ -1624,13 +1624,13 @@ { "cell_type": "code", "execution_count": 20, - "id": "9a985205", + "id": "62c8c00c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.476599Z", - "iopub.status.busy": "2026-08-05T21:18:44.476513Z", - "iopub.status.idle": "2026-08-05T21:18:44.492410Z", - "shell.execute_reply": "2026-08-05T21:18:44.492107Z" + "iopub.execute_input": "2026-08-06T04:55:17.107699Z", + "iopub.status.busy": "2026-08-06T04:55:17.107323Z", + "iopub.status.idle": "2026-08-06T04:55:17.126215Z", + "shell.execute_reply": "2026-08-06T04:55:17.125650Z" } }, "outputs": [ @@ -1725,7 +1725,7 @@ }, { "cell_type": "markdown", - "id": "82a73d8c", + "id": "fa05b854", "metadata": {}, "source": [ "The coupling constant is the only one of the three that needs to know which\n", @@ -1742,13 +1742,13 @@ { "cell_type": "code", "execution_count": 21, - "id": "2dda1a76", + "id": "8fae6075", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.493321Z", - "iopub.status.busy": "2026-08-05T21:18:44.493231Z", - "iopub.status.idle": "2026-08-05T21:18:44.518529Z", - "shell.execute_reply": "2026-08-05T21:18:44.518179Z" + "iopub.execute_input": "2026-08-06T04:55:17.127475Z", + "iopub.status.busy": "2026-08-06T04:55:17.127101Z", + "iopub.status.idle": "2026-08-06T04:55:17.158110Z", + "shell.execute_reply": "2026-08-06T04:55:17.157491Z" } }, "outputs": [ @@ -1819,7 +1819,7 @@ }, { "cell_type": "markdown", - "id": "20b249d9", + "id": "4f80c3eb", "metadata": {}, "source": [ "**2.30 pC/N**, recovered from the tensor without being told where to look. For\n", @@ -1836,13 +1836,13 @@ { "cell_type": "code", "execution_count": 22, - "id": "ebcc2896", + "id": "bbcfbf4a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.519447Z", - "iopub.status.busy": "2026-08-05T21:18:44.519360Z", - "iopub.status.idle": "2026-08-05T21:18:44.579617Z", - "shell.execute_reply": "2026-08-05T21:18:44.579286Z" + "iopub.execute_input": "2026-08-06T04:55:17.159388Z", + "iopub.status.busy": "2026-08-06T04:55:17.159005Z", + "iopub.status.idle": "2026-08-06T04:55:17.222087Z", + "shell.execute_reply": "2026-08-06T04:55:17.221456Z" } }, "outputs": [ @@ -1867,7 +1867,7 @@ }, { "cell_type": "markdown", - "id": "2bd60b8b", + "id": "ef9962fb", "metadata": {}, "source": [ "`False` — and a non-zero piezoelectric tensor on an fcc metal is an error in the\n", @@ -1885,13 +1885,13 @@ { "cell_type": "code", "execution_count": 23, - "id": "3f0d5f8d", + "id": "6433c2ad", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.580386Z", - "iopub.status.busy": "2026-08-05T21:18:44.580295Z", - "iopub.status.idle": "2026-08-05T21:18:44.583921Z", - "shell.execute_reply": "2026-08-05T21:18:44.583616Z" + "iopub.execute_input": "2026-08-06T04:55:17.223451Z", + "iopub.status.busy": "2026-08-06T04:55:17.223050Z", + "iopub.status.idle": "2026-08-06T04:55:17.228838Z", + "shell.execute_reply": "2026-08-06T04:55:17.228290Z" } }, "outputs": [ @@ -1925,13 +1925,13 @@ { "cell_type": "code", "execution_count": 24, - "id": "684f7b6e", + "id": "0038655a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.584592Z", - "iopub.status.busy": "2026-08-05T21:18:44.584509Z", - "iopub.status.idle": "2026-08-05T21:18:44.690756Z", - "shell.execute_reply": "2026-08-05T21:18:44.690400Z" + "iopub.execute_input": "2026-08-06T04:55:17.230091Z", + "iopub.status.busy": "2026-08-06T04:55:17.229718Z", + "iopub.status.idle": "2026-08-06T04:55:17.336501Z", + "shell.execute_reply": "2026-08-06T04:55:17.335843Z" } }, "outputs": [ @@ -2032,7 +2032,7 @@ }, { "cell_type": "markdown", - "id": "36344205", + "id": "b0bbb227", "metadata": {}, "source": [ "Read the first three rows against the last four.\n", @@ -2063,13 +2063,13 @@ { "cell_type": "code", "execution_count": 25, - "id": "cef30230", + "id": "6fd61b30", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.691504Z", - "iopub.status.busy": "2026-08-05T21:18:44.691422Z", - "iopub.status.idle": "2026-08-05T21:18:44.791519Z", - "shell.execute_reply": "2026-08-05T21:18:44.791196Z" + "iopub.execute_input": "2026-08-06T04:55:17.337893Z", + "iopub.status.busy": "2026-08-06T04:55:17.337496Z", + "iopub.status.idle": "2026-08-06T04:55:17.442764Z", + "shell.execute_reply": "2026-08-06T04:55:17.442085Z" } }, "outputs": [ @@ -2144,7 +2144,7 @@ }, { "cell_type": "markdown", - "id": "c3d19977", + "id": "c348d453", "metadata": {}, "source": [ "That is the penalty silicon pays, and the reason a direct-gap absorber a tenth\n", @@ -2160,13 +2160,13 @@ { "cell_type": "code", "execution_count": 26, - "id": "5b92ac68", + "id": "0fe31717", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.792232Z", - "iopub.status.busy": "2026-08-05T21:18:44.792148Z", - "iopub.status.idle": "2026-08-05T21:18:44.816385Z", - "shell.execute_reply": "2026-08-05T21:18:44.815994Z" + "iopub.execute_input": "2026-08-06T04:55:17.444148Z", + "iopub.status.busy": "2026-08-06T04:55:17.443759Z", + "iopub.status.idle": "2026-08-06T04:55:17.471692Z", + "shell.execute_reply": "2026-08-06T04:55:17.471064Z" } }, "outputs": [ @@ -2273,7 +2273,7 @@ }, { "cell_type": "markdown", - "id": "333a8e95", + "id": "4b13b8ea", "metadata": {}, "source": [ "Three numbers, three levels, one table, and nobody had to decide which one is\n", @@ -2284,13 +2284,13 @@ { "cell_type": "code", "execution_count": 27, - "id": "0c6db480", + "id": "3ec4b7e0", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.817223Z", - "iopub.status.busy": "2026-08-05T21:18:44.817141Z", - "iopub.status.idle": "2026-08-05T21:18:44.819178Z", - "shell.execute_reply": "2026-08-05T21:18:44.818878Z" + "iopub.execute_input": "2026-08-06T04:55:17.473029Z", + "iopub.status.busy": "2026-08-06T04:55:17.472628Z", + "iopub.status.idle": "2026-08-06T04:55:17.476330Z", + "shell.execute_reply": "2026-08-06T04:55:17.475787Z" } }, "outputs": [ @@ -2318,13 +2318,13 @@ { "cell_type": "code", "execution_count": 28, - "id": "d0bc5e83", + "id": "cdb3e5dc", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.819858Z", - "iopub.status.busy": "2026-08-05T21:18:44.819778Z", - "iopub.status.idle": "2026-08-05T21:18:44.912255Z", - "shell.execute_reply": "2026-08-05T21:18:44.911918Z" + "iopub.execute_input": "2026-08-06T04:55:17.477558Z", + "iopub.status.busy": "2026-08-06T04:55:17.477184Z", + "iopub.status.idle": "2026-08-06T04:55:17.578394Z", + "shell.execute_reply": "2026-08-06T04:55:17.577705Z" } }, "outputs": [ @@ -2350,7 +2350,7 @@ }, { "cell_type": "markdown", - "id": "8e7d75a4", + "id": "ea16091b", "metadata": {}, "source": [ "`mv.pl.parity` annotates the error and — the useful bit — prints a warning on\n", @@ -2367,13 +2367,13 @@ { "cell_type": "code", "execution_count": 29, - "id": "59409cfb", + "id": "ee03d94d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.913079Z", - "iopub.status.busy": "2026-08-05T21:18:44.912996Z", - "iopub.status.idle": "2026-08-05T21:18:44.918851Z", - "shell.execute_reply": "2026-08-05T21:18:44.918543Z" + "iopub.execute_input": "2026-08-06T04:55:17.579820Z", + "iopub.status.busy": "2026-08-06T04:55:17.579398Z", + "iopub.status.idle": "2026-08-06T04:55:17.588139Z", + "shell.execute_reply": "2026-08-06T04:55:17.587538Z" } }, "outputs": [ @@ -2480,20 +2480,20 @@ { "cell_type": "code", "execution_count": 30, - "id": "b70d534d", + "id": "c5a69810", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.919783Z", - "iopub.status.busy": "2026-08-05T21:18:44.919701Z", - "iopub.status.idle": "2026-08-05T21:18:45.060568Z", - "shell.execute_reply": "2026-08-05T21:18:45.060249Z" + "iopub.execute_input": "2026-08-06T04:55:17.589423Z", + "iopub.status.busy": "2026-08-06T04:55:17.589044Z", + "iopub.status.idle": "2026-08-06T04:55:17.743688Z", + "shell.execute_reply": "2026-08-06T04:55:17.742973Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 30, @@ -2529,7 +2529,7 @@ }, { "cell_type": "markdown", - "id": "a1a16bd4", + "id": "c981db8d", "metadata": {}, "source": [ "Both patterns are baseline-shifted and unit-normalised before the dot product,\n", @@ -2540,13 +2540,13 @@ { "cell_type": "code", "execution_count": 31, - "id": "c6376696", + "id": "3081face", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:45.061680Z", - "iopub.status.busy": "2026-08-05T21:18:45.061592Z", - "iopub.status.idle": "2026-08-05T21:18:45.063693Z", - "shell.execute_reply": "2026-08-05T21:18:45.063399Z" + "iopub.execute_input": "2026-08-06T04:55:17.745420Z", + "iopub.status.busy": "2026-08-06T04:55:17.745015Z", + "iopub.status.idle": "2026-08-06T04:55:17.748726Z", + "shell.execute_reply": "2026-08-06T04:55:17.748226Z" } }, "outputs": [ @@ -2567,7 +2567,7 @@ }, { "cell_type": "markdown", - "id": "271e0f14", + "id": "baadb017", "metadata": {}, "source": [ "```{warning}\n", @@ -2586,13 +2586,13 @@ { "cell_type": "code", "execution_count": 32, - "id": "7c5993bc", + "id": "74abaafa", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:45.064415Z", - "iopub.status.busy": "2026-08-05T21:18:45.064334Z", - "iopub.status.idle": "2026-08-05T21:18:45.070731Z", - "shell.execute_reply": "2026-08-05T21:18:45.070431Z" + "iopub.execute_input": "2026-08-06T04:55:17.749872Z", + "iopub.status.busy": "2026-08-06T04:55:17.749721Z", + "iopub.status.idle": "2026-08-06T04:55:17.757424Z", + "shell.execute_reply": "2026-08-06T04:55:17.756964Z" } }, "outputs": [ @@ -2701,7 +2701,7 @@ }, { "cell_type": "markdown", - "id": "5becc27d", + "id": "0c1d7ac5", "metadata": {}, "source": [ "Measurements are resampled onto the existing grid, because two curves on\n", @@ -2732,13 +2732,13 @@ { "cell_type": "code", "execution_count": 33, - "id": "8c6caac8", + "id": "09d44595", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:45.071428Z", - "iopub.status.busy": "2026-08-05T21:18:45.071346Z", - "iopub.status.idle": "2026-08-05T21:18:45.125302Z", - "shell.execute_reply": "2026-08-05T21:18:45.124993Z" + "iopub.execute_input": "2026-08-06T04:55:17.758642Z", + "iopub.status.busy": "2026-08-06T04:55:17.758491Z", + "iopub.status.idle": "2026-08-06T04:55:17.815268Z", + "shell.execute_reply": "2026-08-06T04:55:17.814892Z" } }, "outputs": [ @@ -2901,13 +2901,13 @@ { "cell_type": "code", "execution_count": 34, - "id": "a083d4c2", + "id": "39854e8e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:45.126229Z", - "iopub.status.busy": "2026-08-05T21:18:45.126146Z", - "iopub.status.idle": "2026-08-05T21:18:45.129539Z", - "shell.execute_reply": "2026-08-05T21:18:45.129213Z" + "iopub.execute_input": "2026-08-06T04:55:17.816760Z", + "iopub.status.busy": "2026-08-06T04:55:17.816633Z", + "iopub.status.idle": "2026-08-06T04:55:17.822036Z", + "shell.execute_reply": "2026-08-06T04:55:17.821518Z" } }, "outputs": [ @@ -2935,7 +2935,7 @@ }, { "cell_type": "markdown", - "id": "146626eb", + "id": "b13acf16", "metadata": {}, "source": [ "The fitted offsets should recover the ones put in — 0.10, −0.06 and 0.03:" @@ -2944,13 +2944,13 @@ { "cell_type": "code", "execution_count": 35, - "id": "606d437e", + "id": "d962d6fc", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:45.130243Z", - "iopub.status.busy": "2026-08-05T21:18:45.130158Z", - "iopub.status.idle": "2026-08-05T21:18:45.132743Z", - "shell.execute_reply": "2026-08-05T21:18:45.132442Z" + "iopub.execute_input": "2026-08-06T04:55:17.823069Z", + "iopub.status.busy": "2026-08-06T04:55:17.822963Z", + "iopub.status.idle": "2026-08-06T04:55:17.826296Z", + "shell.execute_reply": "2026-08-06T04:55:17.825850Z" } }, "outputs": [ @@ -2977,13 +2977,13 @@ { "cell_type": "code", "execution_count": 36, - "id": "dbc34f90", + "id": "a0ecd378", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:45.133428Z", - "iopub.status.busy": "2026-08-05T21:18:45.133347Z", - "iopub.status.idle": "2026-08-05T21:18:45.301665Z", - "shell.execute_reply": "2026-08-05T21:18:45.301211Z" + "iopub.execute_input": "2026-08-06T04:55:17.827306Z", + "iopub.status.busy": "2026-08-06T04:55:17.827211Z", + "iopub.status.idle": "2026-08-06T04:55:18.027911Z", + "shell.execute_reply": "2026-08-06T04:55:18.027570Z" } }, "outputs": [ @@ -3020,7 +3020,7 @@ }, { "cell_type": "markdown", - "id": "8156b80e", + "id": "c7d64ade", "metadata": {}, "source": [ "Same materials, two databases, plotted against each other. Before, they scatter\n", @@ -3049,13 +3049,13 @@ { "cell_type": "code", "execution_count": 37, - "id": "4794e606", + "id": "8ad84078", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:45.302547Z", - "iopub.status.busy": "2026-08-05T21:18:45.302452Z", - "iopub.status.idle": "2026-08-05T21:18:45.317847Z", - "shell.execute_reply": "2026-08-05T21:18:45.317496Z" + "iopub.execute_input": "2026-08-06T04:55:18.028883Z", + "iopub.status.busy": "2026-08-06T04:55:18.028728Z", + "iopub.status.idle": "2026-08-06T04:55:18.044538Z", + "shell.execute_reply": "2026-08-06T04:55:18.044231Z" } }, "outputs": [ @@ -3165,13 +3165,13 @@ { "cell_type": "code", "execution_count": 38, - "id": "0d1a5730", + "id": "31ab5781", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:45.318690Z", - "iopub.status.busy": "2026-08-05T21:18:45.318596Z", - "iopub.status.idle": "2026-08-05T21:18:45.323957Z", - "shell.execute_reply": "2026-08-05T21:18:45.323632Z" + "iopub.execute_input": "2026-08-06T04:55:18.045406Z", + "iopub.status.busy": "2026-08-06T04:55:18.045257Z", + "iopub.status.idle": "2026-08-06T04:55:18.050947Z", + "shell.execute_reply": "2026-08-06T04:55:18.050649Z" } }, "outputs": [ @@ -3199,7 +3199,7 @@ }, { "cell_type": "markdown", - "id": "20921fda", + "id": "bfc3a953", "metadata": {}, "source": [ "Validity, uniqueness, novelty and stability use LeMat-GenBench's definitions\n", @@ -3209,13 +3209,13 @@ { "cell_type": "code", "execution_count": 39, - "id": "1421256d", + "id": "1257316e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:45.324708Z", - "iopub.status.busy": "2026-08-05T21:18:45.324619Z", - "iopub.status.idle": "2026-08-05T21:18:45.326699Z", - "shell.execute_reply": "2026-08-05T21:18:45.326378Z" + "iopub.execute_input": "2026-08-06T04:55:18.052046Z", + "iopub.status.busy": "2026-08-06T04:55:18.051890Z", + "iopub.status.idle": "2026-08-06T04:55:18.054128Z", + "shell.execute_reply": "2026-08-06T04:55:18.053873Z" } }, "outputs": [ @@ -3246,7 +3246,7 @@ }, { "cell_type": "markdown", - "id": "1d1917df", + "id": "4883c4ab", "metadata": {}, "source": [ "That matters more than it looks. Until those definitions were pinned, the same\n", @@ -3264,13 +3264,13 @@ { "cell_type": "code", "execution_count": 40, - "id": "747ea606", + "id": "fc514b5a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:45.327450Z", - "iopub.status.busy": "2026-08-05T21:18:45.327366Z", - "iopub.status.idle": "2026-08-05T21:18:45.329327Z", - "shell.execute_reply": "2026-08-05T21:18:45.328999Z" + "iopub.execute_input": "2026-08-06T04:55:18.054905Z", + "iopub.status.busy": "2026-08-06T04:55:18.054767Z", + "iopub.status.idle": "2026-08-06T04:55:18.056728Z", + "shell.execute_reply": "2026-08-06T04:55:18.056488Z" } }, "outputs": [ @@ -3291,7 +3291,7 @@ }, { "cell_type": "markdown", - "id": "4f6d3ab3", + "id": "10bd5d46", "metadata": {}, "source": [ "Novelty means \"absent from the reference set you named\", which is a weaker claim\n", @@ -3315,13 +3315,13 @@ { "cell_type": "code", "execution_count": 41, - "id": "5a27b6fa", + "id": "b0421f5b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:45.330087Z", - "iopub.status.busy": "2026-08-05T21:18:45.330005Z", - "iopub.status.idle": "2026-08-05T21:18:47.128949Z", - "shell.execute_reply": "2026-08-05T21:18:47.128566Z" + "iopub.execute_input": "2026-08-06T04:55:18.058394Z", + "iopub.status.busy": "2026-08-06T04:55:18.058248Z", + "iopub.status.idle": "2026-08-06T04:55:21.297979Z", + "shell.execute_reply": "2026-08-06T04:55:21.296949Z" } }, "outputs": [ @@ -3435,7 +3435,7 @@ }, { "cell_type": "markdown", - "id": "f9f3741d", + "id": "04e31f28", "metadata": {}, "source": [ "From LiFePO₄ it reaches **LiVPO₄** and **LiTiPO₄** — both real olivine\n", @@ -3452,13 +3452,13 @@ { "cell_type": "code", "execution_count": 42, - "id": "a43dd4f6", + "id": "dc86b713", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:47.129930Z", - "iopub.status.busy": "2026-08-05T21:18:47.129834Z", - "iopub.status.idle": "2026-08-05T21:18:47.790945Z", - "shell.execute_reply": "2026-08-05T21:18:47.790459Z" + "iopub.execute_input": "2026-08-06T04:55:21.299303Z", + "iopub.status.busy": "2026-08-06T04:55:21.299075Z", + "iopub.status.idle": "2026-08-06T04:55:21.981965Z", + "shell.execute_reply": "2026-08-06T04:55:21.981404Z" } }, "outputs": [ @@ -3521,7 +3521,7 @@ }, { "cell_type": "markdown", - "id": "803d3067", + "id": "16c93f93", "metadata": {}, "source": [ "Fluorine comes out as the n-type choice, which is the doping strategy LiFePO₄ is\n", @@ -3538,13 +3538,13 @@ { "cell_type": "code", "execution_count": 43, - "id": "e6fe0850", + "id": "74f7a2cd", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:47.792077Z", - "iopub.status.busy": "2026-08-05T21:18:47.791973Z", - "iopub.status.idle": "2026-08-05T21:18:47.905133Z", - "shell.execute_reply": "2026-08-05T21:18:47.904777Z" + "iopub.execute_input": "2026-08-06T04:55:21.983167Z", + "iopub.status.busy": "2026-08-06T04:55:21.983035Z", + "iopub.status.idle": "2026-08-06T04:55:22.098003Z", + "shell.execute_reply": "2026-08-06T04:55:22.097574Z" } }, "outputs": [ @@ -3652,7 +3652,7 @@ }, { "cell_type": "markdown", - "id": "04dc0e86", + "id": "161a2da4", "metadata": {}, "source": [ "No calculator involved — the prediction comes from tabulated bond lengths — and\n", @@ -3670,13 +3670,13 @@ { "cell_type": "code", "execution_count": 44, - "id": "e0c52a7d", + "id": "08f53144", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:47.905949Z", - "iopub.status.busy": "2026-08-05T21:18:47.905860Z", - "iopub.status.idle": "2026-08-05T21:18:48.697073Z", - "shell.execute_reply": "2026-08-05T21:18:48.696643Z" + "iopub.execute_input": "2026-08-06T04:55:22.098982Z", + "iopub.status.busy": "2026-08-06T04:55:22.098855Z", + "iopub.status.idle": "2026-08-06T04:55:23.020197Z", + "shell.execute_reply": "2026-08-06T04:55:23.019576Z" } }, "outputs": [ @@ -3738,7 +3738,7 @@ }, { "cell_type": "markdown", - "id": "6868ca2b", + "id": "143752e4", "metadata": {}, "source": [ "From LiFePO₄ alone it builds **NaMnPO₄** — a real sodium-ion cathode — because\n", @@ -3763,7 +3763,7 @@ }, { "cell_type": "markdown", - "id": "e620ad84", + "id": "5bc68b16", "metadata": {}, "source": [ "## Why a material is piezoelectric, not just how much\n", @@ -3781,13 +3781,13 @@ { "cell_type": "code", "execution_count": 45, - "id": "fa140632", + "id": "2424df3c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:48.698235Z", - "iopub.status.busy": "2026-08-05T21:18:48.698145Z", - "iopub.status.idle": "2026-08-05T21:18:48.750300Z", - "shell.execute_reply": "2026-08-05T21:18:48.750000Z" + "iopub.execute_input": "2026-08-06T04:55:23.021574Z", + "iopub.status.busy": "2026-08-06T04:55:23.021408Z", + "iopub.status.idle": "2026-08-06T04:55:23.086918Z", + "shell.execute_reply": "2026-08-06T04:55:23.086512Z" } }, "outputs": [ @@ -3870,7 +3870,7 @@ }, { "cell_type": "markdown", - "id": "81f6f56c", + "id": "97d6897d", "metadata": {}, "source": [ "Doubling the Born charges doubles the response. Doubling the force constants\n", @@ -3894,7 +3894,7 @@ }, { "cell_type": "markdown", - "id": "69fbf006", + "id": "ae53dedc", "metadata": {}, "source": [ "## The polarization that is not a number\n", @@ -3916,13 +3916,13 @@ { "cell_type": "code", "execution_count": 46, - "id": "4671ce1f", + "id": "22af7677", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:48.751515Z", - "iopub.status.busy": "2026-08-05T21:18:48.751422Z", - "iopub.status.idle": "2026-08-05T21:18:48.759136Z", - "shell.execute_reply": "2026-08-05T21:18:48.758825Z" + "iopub.execute_input": "2026-08-06T04:55:23.087988Z", + "iopub.status.busy": "2026-08-06T04:55:23.087862Z", + "iopub.status.idle": "2026-08-06T04:55:23.097580Z", + "shell.execute_reply": "2026-08-06T04:55:23.097114Z" } }, "outputs": [ @@ -3956,7 +3956,7 @@ }, { "cell_type": "markdown", - "id": "3f203b35", + "id": "c47a18f7", "metadata": {}, "source": [ "Nothing about that sequence looks like a smooth ferroelectric switching path.\n", @@ -3970,13 +3970,13 @@ { "cell_type": "code", "execution_count": 47, - "id": "09f66505", + "id": "757134e6", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:48.760031Z", - "iopub.status.busy": "2026-08-05T21:18:48.759872Z", - "iopub.status.idle": "2026-08-05T21:18:48.768189Z", - "shell.execute_reply": "2026-08-05T21:18:48.767866Z" + "iopub.execute_input": "2026-08-06T04:55:23.098484Z", + "iopub.status.busy": "2026-08-06T04:55:23.098379Z", + "iopub.status.idle": "2026-08-06T04:55:23.107710Z", + "shell.execute_reply": "2026-08-06T04:55:23.107235Z" } }, "outputs": [ @@ -4013,7 +4013,7 @@ }, { "cell_type": "markdown", - "id": "76694aef", + "id": "88183072", "metadata": {}, "source": [ "The smooth path, recovered exactly, and a spontaneous polarization of\n", @@ -4036,7 +4036,7 @@ }, { "cell_type": "markdown", - "id": "80f94832", + "id": "2023989e", "metadata": {}, "source": [ "## Corrections of your own\n", @@ -4054,13 +4054,13 @@ { "cell_type": "code", "execution_count": 48, - "id": "5cfc76f2", + "id": "6d5b2ec4", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:48.769018Z", - "iopub.status.busy": "2026-08-05T21:18:48.768929Z", - "iopub.status.idle": "2026-08-05T21:18:48.805596Z", - "shell.execute_reply": "2026-08-05T21:18:48.805180Z" + "iopub.execute_input": "2026-08-06T04:55:23.108706Z", + "iopub.status.busy": "2026-08-06T04:55:23.108575Z", + "iopub.status.idle": "2026-08-06T04:55:23.150533Z", + "shell.execute_reply": "2026-08-06T04:55:23.149964Z" } }, "outputs": [ @@ -4105,7 +4105,7 @@ }, { "cell_type": "markdown", - "id": "777a94ea", + "id": "ef316a3e", "metadata": {}, "source": [ "**−0.45 eV per oxygen, recovered to four decimals**, with an error bar beside\n", @@ -4116,13 +4116,13 @@ { "cell_type": "code", "execution_count": 49, - "id": "9d1b9d20", + "id": "88e5c2d9", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:48.806588Z", - "iopub.status.busy": "2026-08-05T21:18:48.806498Z", - "iopub.status.idle": "2026-08-05T21:18:48.811149Z", - "shell.execute_reply": "2026-08-05T21:18:48.810821Z" + "iopub.execute_input": "2026-08-06T04:55:23.151804Z", + "iopub.status.busy": "2026-08-06T04:55:23.151429Z", + "iopub.status.idle": "2026-08-06T04:55:23.168440Z", + "shell.execute_reply": "2026-08-06T04:55:23.167962Z" } }, "outputs": [ @@ -4194,7 +4194,7 @@ }, { "cell_type": "markdown", - "id": "a65e1d31", + "id": "0e1803e3", "metadata": {}, "source": [ "```{warning}\n", @@ -4217,7 +4217,7 @@ }, { "cell_type": "markdown", - "id": "790ea5cb", + "id": "14eadfcb", "metadata": {}, "source": [ "## A hull the laboratory built\n", @@ -4234,13 +4234,13 @@ { "cell_type": "code", "execution_count": 50, - "id": "8eb130e2", + "id": "bcec3cb3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:48.811925Z", - "iopub.status.busy": "2026-08-05T21:18:48.811841Z", - "iopub.status.idle": "2026-08-05T21:18:48.826134Z", - "shell.execute_reply": "2026-08-05T21:18:48.825822Z" + "iopub.execute_input": "2026-08-06T04:55:23.169815Z", + "iopub.status.busy": "2026-08-06T04:55:23.169682Z", + "iopub.status.idle": "2026-08-06T04:55:23.188644Z", + "shell.execute_reply": "2026-08-06T04:55:23.187928Z" } }, "outputs": [ @@ -4341,7 +4341,7 @@ }, { "cell_type": "markdown", - "id": "96f28e53", + "id": "4e9a979b", "metadata": {}, "source": [ "Hematite and magnetite sit on the hull. **Wüstite sits 0.039 eV/atom above it**\n", @@ -4370,13 +4370,13 @@ { "cell_type": "code", "execution_count": 51, - "id": "216b2c2c", + "id": "5a2778e8", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:48.827198Z", - "iopub.status.busy": "2026-08-05T21:18:48.827111Z", - "iopub.status.idle": "2026-08-05T21:18:48.829142Z", - "shell.execute_reply": "2026-08-05T21:18:48.828850Z" + "iopub.execute_input": "2026-08-06T04:55:23.189694Z", + "iopub.status.busy": "2026-08-06T04:55:23.189578Z", + "iopub.status.idle": "2026-08-06T04:55:23.193057Z", + "shell.execute_reply": "2026-08-06T04:55:23.192501Z" } }, "outputs": [ @@ -4397,7 +4397,7 @@ }, { "cell_type": "markdown", - "id": "127184df", + "id": "f147e130", "metadata": {}, "source": [ "Now the comparison this was for. Run `mv.thermo.hull` at a computed level on the\n", @@ -4408,7 +4408,7 @@ }, { "cell_type": "markdown", - "id": "0c32ef19", + "id": "72759865", "metadata": {}, "source": [ "## A hull is not a phase diagram\n", @@ -4426,13 +4426,13 @@ { "cell_type": "code", "execution_count": 52, - "id": "cf727627", + "id": "8041ec7c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:48.829852Z", - "iopub.status.busy": "2026-08-05T21:18:48.829770Z", - "iopub.status.idle": "2026-08-05T21:18:49.221217Z", - "shell.execute_reply": "2026-08-05T21:18:49.220509Z" + "iopub.execute_input": "2026-08-06T04:55:23.194126Z", + "iopub.status.busy": "2026-08-06T04:55:23.194016Z", + "iopub.status.idle": "2026-08-06T04:55:23.622789Z", + "shell.execute_reply": "2026-08-06T04:55:23.622099Z" } }, "outputs": [ @@ -4475,7 +4475,7 @@ }, { "cell_type": "markdown", - "id": "f05c007c", + "id": "92233e55", "metadata": {}, "source": [ "The Pb-Sn eutectic is measured at **456 K**, and those two temperatures\n", @@ -4496,6 +4496,391 @@ "from PbSnCu and renormalising would answer a question about a different alloy.\n", "```" ] + }, + { + "cell_type": "markdown", + "id": "fb48d06d", + "metadata": {}, + "source": [ + "## A voltage is a slope on the hull\n", + "\n", + "`mv.thermo.hull` already computes the energies an intercalation voltage is made\n", + "of. The voltage *is* the hull slope along the working-ion axis:\n", + "\n", + "$$V = -\\frac{E_{\\mathrm{lithiated}} - E_{\\mathrm{delithiated}} - n\\,E_{\\mathrm{Li}}}{n}$$\n", + "\n", + "in volts, because an electron carries one. `mv.thermo.voltage` reads it off." + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "96bad538", + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-06T04:55:23.624164Z", + "iopub.status.busy": "2026-08-06T04:55:23.623749Z", + "iopub.status.idle": "2026-08-06T04:55:26.406794Z", + "shell.execute_reply": "2026-08-06T04:55:26.406175Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CHGNet v0.3.0 initialized with 412,525 parameters\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CHGNet will run on cuda\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CHGNet v0.3.0 initialized with 412,525 parameters\n", + "CHGNet will run on cuda\n", + " voltage_chgnet capacity_gravimetric_chgnet energy_density_chgnet\n", + "LiFePO4 3.5 169.89 594.03\n" + ] + } + ], + "source": [ + "from pymatgen.core import Lattice, Structure\n", + "\n", + "cathode = mv.datasets.load(\"battery_cathodes\")[:1].copy()\n", + "lithiated = mv.structures(cathode, \"input\")[0]\n", + "delithiated = lithiated.copy()\n", + "delithiated.remove_species([\"Li\"])\n", + "\n", + "electrode = mv.data.from_structures([lithiated, delithiated])\n", + "electrode.obs_names = [\"LiFePO4\", \"FePO4\"]\n", + "metal = mv.data.from_structures([Structure(\n", + " Lattice.cubic(3.51), [\"Li\", \"Li\"], [[0, 0, 0], [.5, .5, .5]])])\n", + "\n", + "try:\n", + " # cell=False on purpose: see the warning below.\n", + " for piece in (electrode, metal):\n", + " mv.calc.relax(piece, level=\"chgnet\", fmax=0.05, cell=False)\n", + " mv.thermo.voltage(electrode, working_ion=\"Li\", level=\"chgnet\",\n", + " source=\"relaxed_chgnet\", reference=metal)\n", + " print(electrode.obs[[\"voltage_chgnet\", \"capacity_gravimetric_chgnet\",\n", + " \"energy_density_chgnet\"]].round(2).head(1).to_string())\n", + "except (ImportError, KeyError) as exc:\n", + " print(\"needs CHGNet; pip install matverse[potentials]\", exc)" + ] + }, + { + "cell_type": "markdown", + "id": "0ac7f92f", + "metadata": {}, + "source": [ + "**3.50 V and 169.9 mAh/g**, against a measured plateau of 3.4–3.5 V and a\n", + "theoretical capacity of 170. CHGNet is trained on PBE+U, which is the\n", + "functional this problem needs — plain PBE gives closer to 3.0 V for the same\n", + "material, and `level=` is what records which was used.\n", + "\n", + "```{warning}\n", + "`cell=False` is not incidental. Relaxing the **cell** of these structures with a\n", + "foundation potential diverges: it collapsed LiFePO₄ to 2 ų per atom and\n", + "expanded FePO₄ to 117, and the first version of `mv.thermo.voltage` read the\n", + "resulting energies and returned **78 V**. `mv.calc.relax` had recorded\n", + "`relax_converged_chgnet = False` for both rows the whole time — the diagnostic\n", + "existed and the function did not consult it.\n", + "\n", + "It does now: unconverged rows are excluded and counted, and an unconverged\n", + "**reference** raises outright, because a bad lithium-metal energy shifts every\n", + "voltage by the same amount and no comparison between cathodes would reveal it.\n", + "```\n", + "\n", + "`obs['volume_change_chgnet']` is the weakest number of the set — about −14%\n", + "here against a measured −6.8%, precisely because the cell was held fixed and\n", + "never allowed to respond to delithiation. It is a flag, not a measurement." + ] + }, + { + "cell_type": "markdown", + "id": "31d700d3", + "metadata": {}, + "source": [ + "### The cheaper question, asked first\n", + "\n", + "A voltage needs both ends of the reaction. `mv.thermo.theoretical_capacity`\n", + "needs **one structure** and counts the electrons the transition metals could\n", + "give up — which is the question a screen asks first, and much more cheaply." + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "4f40f540", + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-06T04:55:26.408185Z", + "iopub.status.busy": "2026-08-06T04:55:26.407772Z", + "iopub.status.idle": "2026-08-06T04:55:26.500063Z", + "shell.execute_reply": "2026-08-06T04:55:26.499497Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " theoretical_capacity_Li theoretical_capacity_Na\n", + "0 169.9 0.0\n", + "1 0.0 154.2\n", + "2 317.9 118.2\n" + ] + } + ], + "source": [ + "library = mv.datasets.load(\"battery_cathodes\")\n", + "mv.thermo.theoretical_capacity(library, working_ion=\"Li\")\n", + "mv.thermo.theoretical_capacity(library, working_ion=\"Na\")\n", + "print(library.obs[[\"theoretical_capacity_Li\",\n", + " \"theoretical_capacity_Na\"]].round(1).to_string())" + ] + }, + { + "cell_type": "markdown", + "id": "8d32733b", + "metadata": {}, + "source": [ + "LiFePO₄ gives 169.9 mAh/g for lithium and zero for sodium; NaFePO₄ gives 154.2\n", + "for sodium — the measured figure is about 154 — and zero for lithium. Asking a\n", + "lithium compound how much sodium it can release is answered correctly rather\n", + "than approximately.\n", + "\n", + "It is a **bound**, not a prediction. The number counts electrons and says\n", + "nothing about whether the framework survives losing them; a material that\n", + "collapses at half this will report the same figure. Rank a library on it, then\n", + "compute voltages for the survivors — that is the order that costs least." + ] + }, + { + "cell_type": "markdown", + "id": "a0af58cf", + "metadata": {}, + "source": [ + "## Three numbers where matverse has one and a half\n", + "\n", + "Some quantities are a formula over inputs matverse cannot produce, and the\n", + "useful thing is to be exact about which half is which.\n", + "\n", + "`mv.prop.superconductivity` computes ω_log — a moment of the phonon density of\n", + "states `mv.prop.phonon` already produced — and then applies Allen-Dynes. It\n", + "**will not** guess the electron–phonon coupling λ, which is an integral over\n", + "α²F and needs EPW or `ph.x`, not a phonon spectrum." + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "1c663eb0", + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-06T04:55:26.501350Z", + "iopub.status.busy": "2026-08-06T04:55:26.500940Z", + "iopub.status.idle": "2026-08-06T04:55:29.518193Z", + "shell.execute_reply": "2026-08-06T04:55:29.517684Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "name omega_log_emt critical_temperature_emt\n", + " Cu 4.824 14.556\n", + " Al 4.882 14.743\n", + "\n", + "without a coupling: coupling= (the electron-phonon constant lambda) is required and has no...\n" + ] + } + ], + "source": [ + "metals = mv.datasets.metals([\"Cu\", \"Al\"])\n", + "mv.pp.describe(metals)\n", + "mv.calc.relax(metals, level=\"emt\", fmax=0.01)\n", + "mv.prop.phonon(metals, level=\"emt\", source=\"relaxed_emt\", supercell=(2, 2, 2))\n", + "\n", + "mv.prop.superconductivity(metals, level=\"emt\", coupling=1.0)\n", + "print(metals.obs[[\"name\", \"omega_log_emt\", \"critical_temperature_emt\"]]\n", + " .round(3).to_string(index=False))\n", + "\n", + "try:\n", + " mv.prop.superconductivity(metals, level=\"emt\")\n", + "except ValueError as exc:\n", + " print(f\"\\nwithout a coupling: {str(exc)[:70]}...\")" + ] + }, + { + "cell_type": "markdown", + "id": "b06a5e4d", + "metadata": {}, + "source": [ + "λ = 1.0 there was **supplied, not computed**, so the temperatures are what that\n", + "coupling would imply and not a prediction about copper — whose real λ is about\n", + "0.13, below the threshold where the formula has a solution at all, and which is\n", + "not a superconductor.\n", + "\n", + "ω_log is the computed half and is checkable: a density of states with all its\n", + "weight at one frequency returns that frequency exactly, and one with equal\n", + "weight at 4 and 16 THz returns 5.28 rather than the geometric mean of 8, because\n", + "the 1/ω weighting favours the soft end.\n", + "\n", + "```{note}\n", + "ω_log is properly a moment of α²F, not of the phonon density of states. Using\n", + "the latter assumes the coupling does not depend on frequency — the Einstein-like\n", + "limit, wrong wherever one branch couples much more strongly than another, which\n", + "is most interesting superconductors. `uns` records that the substitution was\n", + "made.\n", + "```\n", + "\n", + "### The same shape, for thermoelectrics\n", + "\n", + "`mv.elec.transport` produces σ/τ rather than σ, because the constant relaxation\n", + "time approximation declines to supply τ. So `mv.prop.zt` requires it — and\n", + "computes, separately, the one number that does not need it." + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "ceaab9ae", + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-06T04:55:29.519434Z", + "iopub.status.busy": "2026-08-06T04:55:29.519300Z", + "iopub.status.idle": "2026-08-06T04:55:29.540423Z", + "shell.execute_reply": "2026-08-06T04:55:29.539978Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sigma/tau=1e+17 zT=0.0275 ceiling=1.6393\n", + "sigma/tau=1e+19 zT=1.0340 ceiling=1.6393\n", + "sigma/tau=1e+22 zT=1.6384 ceiling=1.6393\n" + ] + } + ], + "source": [ + "thermo = mv.data.from_compositions([\"Bi2Te3\"])\n", + "thermo.obs[\"seebeck_x\"] = [200e-6] # V/K\n", + "thermo.obs[\"thermal_conductivity_x\"] = [1.0] # W/m/K\n", + "\n", + "for sigma_over_tau in (1e17, 1e19, 1e22):\n", + " row = thermo.copy()\n", + " row.obs[\"sigma_over_tau_x\"] = [sigma_over_tau]\n", + " mv.prop.zt(row, level=\"x\", relaxation_time=1e-14, temperature=700.0)\n", + " print(f\"sigma/tau={sigma_over_tau:.0e} \"\n", + " f\"zT={float(row.obs['zt_x'].iloc[0]):.4f} \"\n", + " f\"ceiling={float(row.obs['zt_ceiling_x'].iloc[0]):.4f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e9e504cc", + "metadata": {}, + "source": [ + "zT climbs with conductivity and **stops** at 1.639. That ceiling is `S²/L`, and\n", + "τ cancels out of it exactly: it appears in σ and again in the electronic thermal\n", + "conductivity through Wiedemann–Franz, so as the lattice term stops mattering the\n", + "unknown divides out.\n", + "\n", + "The consequence is worth stating plainly. **A material whose Seebeck coefficient\n", + "puts its ceiling below the zT you need cannot be rescued by any conductivity** —\n", + "and that conclusion survives not knowing τ, which is the number nobody has.\n", + "\n", + "## Scaling relations, and why a reaction has a ceiling\n", + "\n", + "Adsorbates that bind through the same atom bind in proportion. That is why a\n", + "screen over a whole reaction can run on one descriptor — and why the reaction\n", + "has a ceiling, because the intermediate you want bound weakly is tied to the one\n", + "you want bound strongly." + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "1c779141", + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-06T04:55:29.541471Z", + "iopub.status.busy": "2026-08-06T04:55:29.541352Z", + "iopub.status.idle": "2026-08-06T04:55:29.567117Z", + "shell.execute_reply": "2026-08-06T04:55:29.564593Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "slope 0.506 intercept -0.087 eV R2 0.9997\n", + " E_O scaling_residual distance_from_optimum volcano_activity\n", + "0 -2.500 0.005 -0.900 -0.900\n", + "1 -2.071 -0.003 -0.471 -0.471\n", + "2 -1.643 0.010 -0.043 -0.043\n", + "3 -1.214 -0.004 0.386 -0.386\n", + "4 -0.786 -0.019 0.814 -0.814\n", + "5 -0.357 -0.004 1.243 -1.243\n", + "6 0.071 0.012 1.671 -1.671\n", + "7 0.500 0.002 2.100 -2.100\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "\n", + "rng = np.random.default_rng(0)\n", + "oxygen = np.linspace(-2.5, 0.5, 8)\n", + "surfaces = mv.data.from_compositions([f\"Pt{i + 1}\" for i in range(8)])\n", + "surfaces.obs[\"E_O\"] = oxygen\n", + "surfaces.obs[\"E_OH\"] = 0.5 * oxygen - 0.10 + rng.normal(0, 0.02, 8)\n", + "\n", + "mv.surf.scaling(surfaces, x=\"E_O\", y=\"E_OH\")\n", + "fit = surfaces.uns[\"scaling\"][\"fits\"][\"all\"]\n", + "print(f\"slope {fit['slope']:.3f} intercept {fit['intercept_eV']:.3f} eV \"\n", + " f\"R2 {fit['r_squared']:.4f}\")\n", + "\n", + "mv.surf.volcano(surfaces, descriptor=\"E_O\", optimum=-1.6)\n", + "print(surfaces.obs[[\"E_O\", \"scaling_residual\", \"distance_from_optimum\",\n", + " \"volcano_activity\"]].round(3).to_string())" + ] + }, + { + "cell_type": "markdown", + "id": "d6ebbfa6", + "metadata": {}, + "source": [ + "The slope is the physical claim: a species bonding through one atom with *n*\n", + "remaining valences scales against a reference with *m* as roughly *n/m*, so OH\n", + "against O is about ½. A fitted slope far from a small rational number usually\n", + "means the two species are not binding the way the argument assumes.\n", + "\n", + "`scaling_residual` is the interesting column, not the fit. A catalyst that beats\n", + "the scaling ceiling has to **break** the relation, so a large residual is a\n", + "candidate and a small one confirms the surface offers nothing new.\n", + "\n", + "```{warning}\n", + "The volcano's **optimum is an input**. Where the peak sits depends on the\n", + "reaction, the potential and the conditions, and it comes from a microkinetic\n", + "model or an experiment — not from here. `volcano_activity` is in arbitrary units\n", + "and only its ordering means anything; `distance_from_optimum` is in eV and\n", + "signed, so it says which side a surface falls on. Binding too weakly and too\n", + "strongly are different problems and a magnitude cannot tell them apart.\n", + "```" + ] } ], "metadata": { diff --git a/matverse_guide/docs/tutorials/chemical_space.ipynb b/matverse_guide/docs/tutorials/chemical_space.ipynb index fbb9163..918e799 100644 --- a/matverse_guide/docs/tutorials/chemical_space.ipynb +++ b/matverse_guide/docs/tutorials/chemical_space.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "b626ae57", + "id": "c865085c", "metadata": {}, "source": [ "# Chemical space\n", @@ -19,13 +19,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "ea0f72e0", + "id": "ccd72352", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:24.211310Z", - "iopub.status.busy": "2026-08-05T21:18:24.211185Z", - "iopub.status.idle": "2026-08-05T21:18:30.376090Z", - "shell.execute_reply": "2026-08-05T21:18:30.375605Z" + "iopub.execute_input": "2026-08-06T04:54:34.643622Z", + "iopub.status.busy": "2026-08-06T04:54:34.643546Z", + "iopub.status.idle": "2026-08-06T04:54:52.212744Z", + "shell.execute_reply": "2026-08-06T04:54:52.212267Z" } }, "outputs": [ @@ -69,7 +69,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -85,7 +85,7 @@ }, { "cell_type": "markdown", - "id": "d4f0bfde", + "id": "45da3093", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -98,13 +98,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "92338636", + "id": "18f7d459", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:30.377409Z", - "iopub.status.busy": "2026-08-05T21:18:30.376909Z", - "iopub.status.idle": "2026-08-05T21:18:31.073405Z", - "shell.execute_reply": "2026-08-05T21:18:31.072958Z" + "iopub.execute_input": "2026-08-06T04:54:52.214503Z", + "iopub.status.busy": "2026-08-06T04:54:52.213751Z", + "iopub.status.idle": "2026-08-06T04:54:55.054706Z", + "shell.execute_reply": "2026-08-06T04:54:55.054149Z" } }, "outputs": [ @@ -230,7 +230,7 @@ }, { "cell_type": "markdown", - "id": "62212b72", + "id": "dd881fbc", "metadata": {}, "source": [ "## Why elements are the right axis\n", @@ -243,13 +243,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "9c3b577d", + "id": "92afe5da", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.074286Z", - "iopub.status.busy": "2026-08-05T21:18:31.074177Z", - "iopub.status.idle": "2026-08-05T21:18:31.079071Z", - "shell.execute_reply": "2026-08-05T21:18:31.078715Z" + "iopub.execute_input": "2026-08-06T04:54:55.056314Z", + "iopub.status.busy": "2026-08-06T04:54:55.056171Z", + "iopub.status.idle": "2026-08-06T04:54:55.062812Z", + "shell.execute_reply": "2026-08-06T04:54:55.062191Z" } }, "outputs": [ @@ -355,7 +355,7 @@ }, { "cell_type": "markdown", - "id": "53326cab", + "id": "ca11ee22", "metadata": {}, "source": [ "Counts come from the **reduced** formula, so a supercell and its primitive cell\n", @@ -369,13 +369,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "8ccbceba", + "id": "2063097b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.079818Z", - "iopub.status.busy": "2026-08-05T21:18:31.079733Z", - "iopub.status.idle": "2026-08-05T21:18:31.084238Z", - "shell.execute_reply": "2026-08-05T21:18:31.083898Z" + "iopub.execute_input": "2026-08-06T04:54:55.063855Z", + "iopub.status.busy": "2026-08-06T04:54:55.063760Z", + "iopub.status.idle": "2026-08-06T04:54:55.069747Z", + "shell.execute_reply": "2026-08-06T04:54:55.069339Z" } }, "outputs": [ @@ -458,7 +458,7 @@ }, { "cell_type": "markdown", - "id": "f5e886b4", + "id": "afdbb89d", "metadata": {}, "source": [ "```{note}\n", @@ -472,13 +472,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "214e1a06", + "id": "a94b1314", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.084940Z", - "iopub.status.busy": "2026-08-05T21:18:31.084854Z", - "iopub.status.idle": "2026-08-05T21:18:31.089030Z", - "shell.execute_reply": "2026-08-05T21:18:31.088695Z" + "iopub.execute_input": "2026-08-06T04:54:55.070827Z", + "iopub.status.busy": "2026-08-06T04:54:55.070667Z", + "iopub.status.idle": "2026-08-06T04:54:55.075492Z", + "shell.execute_reply": "2026-08-06T04:54:55.075087Z" } }, "outputs": [ @@ -549,7 +549,7 @@ }, { "cell_type": "markdown", - "id": "2bcae29b", + "id": "e3389f27", "metadata": {}, "source": [ "## The dividend inside the library\n", @@ -563,13 +563,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "33df6173", + "id": "f8188158", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.089724Z", - "iopub.status.busy": "2026-08-05T21:18:31.089636Z", - "iopub.status.idle": "2026-08-05T21:18:31.092901Z", - "shell.execute_reply": "2026-08-05T21:18:31.092577Z" + "iopub.execute_input": "2026-08-06T04:54:55.076566Z", + "iopub.status.busy": "2026-08-06T04:54:55.076420Z", + "iopub.status.idle": "2026-08-06T04:54:55.080226Z", + "shell.execute_reply": "2026-08-06T04:54:55.079823Z" } }, "outputs": [ @@ -591,7 +591,7 @@ }, { "cell_type": "markdown", - "id": "c20a296a", + "id": "1fb48c3b", "metadata": {}, "source": [ "Check one by hand. For Al₃Cu the weighted mean electronegativity should be\n", @@ -601,13 +601,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "896de1d0", + "id": "f34a6843", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.093573Z", - "iopub.status.busy": "2026-08-05T21:18:31.093487Z", - "iopub.status.idle": "2026-08-05T21:18:31.095864Z", - "shell.execute_reply": "2026-08-05T21:18:31.095535Z" + "iopub.execute_input": "2026-08-06T04:54:55.081099Z", + "iopub.status.busy": "2026-08-06T04:54:55.080940Z", + "iopub.status.idle": "2026-08-06T04:54:55.083631Z", + "shell.execute_reply": "2026-08-06T04:54:55.083208Z" } }, "outputs": [ @@ -632,7 +632,7 @@ }, { "cell_type": "markdown", - "id": "7e567419", + "id": "efb1620e", "metadata": {}, "source": [ "Those descriptors are also a distance, which makes the library a matrix you can\n", @@ -642,20 +642,20 @@ { "cell_type": "code", "execution_count": 8, - "id": "e227ca76", + "id": "c3180ca5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.096531Z", - "iopub.status.busy": "2026-08-05T21:18:31.096444Z", - "iopub.status.idle": "2026-08-05T21:18:31.256633Z", - "shell.execute_reply": "2026-08-05T21:18:31.256211Z" + "iopub.execute_input": "2026-08-06T04:54:55.084576Z", + "iopub.status.busy": "2026-08-06T04:54:55.084433Z", + "iopub.status.idle": "2026-08-06T04:54:55.255678Z", + "shell.execute_reply": "2026-08-06T04:54:55.255162Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 8, @@ -694,7 +694,7 @@ }, { "cell_type": "markdown", - "id": "03a42336", + "id": "c48758da", "metadata": {}, "source": [ "The two Al–Cu orderings sit next to each other and the elementals separate,\n", @@ -712,13 +712,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "403c3b94", + "id": "28a7271d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.257537Z", - "iopub.status.busy": "2026-08-05T21:18:31.257415Z", - "iopub.status.idle": "2026-08-05T21:18:31.260035Z", - "shell.execute_reply": "2026-08-05T21:18:31.259696Z" + "iopub.execute_input": "2026-08-06T04:54:55.256852Z", + "iopub.status.busy": "2026-08-06T04:54:55.256680Z", + "iopub.status.idle": "2026-08-06T04:54:55.270594Z", + "shell.execute_reply": "2026-08-06T04:54:55.270270Z" } }, "outputs": [ @@ -744,7 +744,7 @@ }, { "cell_type": "markdown", - "id": "94bcfa5f", + "id": "00b9f2d8", "metadata": {}, "source": [ "A site-averaged SOAP vector per structure, which separates two polymorphs of\n", @@ -767,13 +767,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "c28f6954", + "id": "ab69c231", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.260739Z", - "iopub.status.busy": "2026-08-05T21:18:31.260653Z", - "iopub.status.idle": "2026-08-05T21:18:31.266219Z", - "shell.execute_reply": "2026-08-05T21:18:31.265875Z" + "iopub.execute_input": "2026-08-06T04:54:55.271529Z", + "iopub.status.busy": "2026-08-06T04:54:55.271375Z", + "iopub.status.idle": "2026-08-06T04:54:55.283835Z", + "shell.execute_reply": "2026-08-06T04:54:55.283495Z" } }, "outputs": [ @@ -886,13 +886,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "a333b4a5", + "id": "ede0399c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.266913Z", - "iopub.status.busy": "2026-08-05T21:18:31.266824Z", - "iopub.status.idle": "2026-08-05T21:18:31.268842Z", - "shell.execute_reply": "2026-08-05T21:18:31.268534Z" + "iopub.execute_input": "2026-08-06T04:54:55.284750Z", + "iopub.status.busy": "2026-08-06T04:54:55.284595Z", + "iopub.status.idle": "2026-08-06T04:54:55.287674Z", + "shell.execute_reply": "2026-08-06T04:54:55.287355Z" } }, "outputs": [ @@ -915,7 +915,7 @@ }, { "cell_type": "markdown", - "id": "d23b2a69", + "id": "dc985209", "metadata": {}, "source": [ "Which model produced the block, and under what licence, is recorded next to it\n", @@ -937,13 +937,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "978b5963", + "id": "edde99b7", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.269494Z", - "iopub.status.busy": "2026-08-05T21:18:31.269413Z", - "iopub.status.idle": "2026-08-05T21:18:31.537680Z", - "shell.execute_reply": "2026-08-05T21:18:31.537314Z" + "iopub.execute_input": "2026-08-06T04:54:55.288614Z", + "iopub.status.busy": "2026-08-06T04:54:55.288465Z", + "iopub.status.idle": "2026-08-06T04:54:57.607348Z", + "shell.execute_reply": "2026-08-06T04:54:57.606810Z" } }, "outputs": [ @@ -1039,7 +1039,7 @@ }, { "cell_type": "markdown", - "id": "d3d7e3a2", + "id": "0b2321a5", "metadata": {}, "source": [ "`normalize_composition` writes atomic fractions to a **layer** rather than\n", @@ -1055,13 +1055,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "d259ec2e", + "id": "6ac19ab0", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.538591Z", - "iopub.status.busy": "2026-08-05T21:18:31.538500Z", - "iopub.status.idle": "2026-08-05T21:18:31.659629Z", - "shell.execute_reply": "2026-08-05T21:18:31.659172Z" + "iopub.execute_input": "2026-08-06T04:54:57.608830Z", + "iopub.status.busy": "2026-08-06T04:54:57.608638Z", + "iopub.status.idle": "2026-08-06T04:54:57.742354Z", + "shell.execute_reply": "2026-08-06T04:54:57.741744Z" } }, "outputs": [ @@ -1098,7 +1098,7 @@ }, { "cell_type": "markdown", - "id": "cbde84a3", + "id": "fced7245", "metadata": {}, "source": [ "## The question that follows every screen\n", @@ -1109,13 +1109,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "1a3e057d", + "id": "d05e4c5e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.660621Z", - "iopub.status.busy": "2026-08-05T21:18:31.660468Z", - "iopub.status.idle": "2026-08-05T21:18:31.671332Z", - "shell.execute_reply": "2026-08-05T21:18:31.670992Z" + "iopub.execute_input": "2026-08-06T04:54:57.743442Z", + "iopub.status.busy": "2026-08-06T04:54:57.743340Z", + "iopub.status.idle": "2026-08-06T04:54:57.760126Z", + "shell.execute_reply": "2026-08-06T04:54:57.759614Z" } }, "outputs": [ @@ -1221,7 +1221,7 @@ }, { "cell_type": "markdown", - "id": "8e6ff0b1", + "id": "64b5a82a", "metadata": {}, "source": [ "This is `rank_genes_groups` with the nouns changed, and it is the operation that\n", @@ -1236,13 +1236,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "280fc2c7", + "id": "657b9186", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.672029Z", - "iopub.status.busy": "2026-08-05T21:18:31.671945Z", - "iopub.status.idle": "2026-08-05T21:18:31.681073Z", - "shell.execute_reply": "2026-08-05T21:18:31.680741Z" + "iopub.execute_input": "2026-08-06T04:54:57.761156Z", + "iopub.status.busy": "2026-08-06T04:54:57.761058Z", + "iopub.status.idle": "2026-08-06T04:54:57.771093Z", + "shell.execute_reply": "2026-08-06T04:54:57.770728Z" } }, "outputs": [ @@ -1328,7 +1328,7 @@ }, { "cell_type": "markdown", - "id": "b9525095", + "id": "3292521e", "metadata": {}, "source": [ "Both report an uncorrected p-value and a Benjamini–Hochberg q-value. With seven\n", @@ -1342,13 +1342,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "b28e485d", + "id": "a7705e26", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.681751Z", - "iopub.status.busy": "2026-08-05T21:18:31.681664Z", - "iopub.status.idle": "2026-08-05T21:18:31.752367Z", - "shell.execute_reply": "2026-08-05T21:18:31.752025Z" + "iopub.execute_input": "2026-08-06T04:54:57.772077Z", + "iopub.status.busy": "2026-08-06T04:54:57.771985Z", + "iopub.status.idle": "2026-08-06T04:54:57.847801Z", + "shell.execute_reply": "2026-08-06T04:54:57.847339Z" } }, "outputs": [ @@ -1386,7 +1386,7 @@ }, { "cell_type": "markdown", - "id": "4cf7317d", + "id": "f52af14d", "metadata": {}, "source": [ "The bar chart when you want the numbers; the periodic table when you want the\n", @@ -1396,13 +1396,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "d25075b3", + "id": "86faa3f2", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.753076Z", - "iopub.status.busy": "2026-08-05T21:18:31.752987Z", - "iopub.status.idle": "2026-08-05T21:18:32.049739Z", - "shell.execute_reply": "2026-08-05T21:18:32.049358Z" + "iopub.execute_input": "2026-08-06T04:54:57.848727Z", + "iopub.status.busy": "2026-08-06T04:54:57.848635Z", + "iopub.status.idle": "2026-08-06T04:54:59.578368Z", + "shell.execute_reply": "2026-08-06T04:54:59.577667Z" } }, "outputs": [ @@ -1432,7 +1432,7 @@ }, { "cell_type": "markdown", - "id": "6140598a", + "id": "71e4e3ec", "metadata": {}, "source": [ "Aluminium comes out grey rather than dark. Its odds ratio is infinite — it is in\n", @@ -1455,13 +1455,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "96c895fc", + "id": "2c4b21c3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:32.050512Z", - "iopub.status.busy": "2026-08-05T21:18:32.050420Z", - "iopub.status.idle": "2026-08-05T21:18:32.059208Z", - "shell.execute_reply": "2026-08-05T21:18:32.058866Z" + "iopub.execute_input": "2026-08-06T04:54:59.579962Z", + "iopub.status.busy": "2026-08-06T04:54:59.579776Z", + "iopub.status.idle": "2026-08-06T04:54:59.590770Z", + "shell.execute_reply": "2026-08-06T04:54:59.590194Z" } }, "outputs": [ @@ -1483,7 +1483,7 @@ }, { "cell_type": "markdown", - "id": "5ef8c9f7", + "id": "f6e59a0d", "metadata": {}, "source": [ "## Is this candidate actually new?\n", @@ -1495,13 +1495,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "d978aab7", + "id": "c88c29c2", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:32.059904Z", - "iopub.status.busy": "2026-08-05T21:18:32.059813Z", - "iopub.status.idle": "2026-08-05T21:18:32.070581Z", - "shell.execute_reply": "2026-08-05T21:18:32.070252Z" + "iopub.execute_input": "2026-08-06T04:54:59.591896Z", + "iopub.status.busy": "2026-08-06T04:54:59.591718Z", + "iopub.status.idle": "2026-08-06T04:54:59.609393Z", + "shell.execute_reply": "2026-08-06T04:54:59.608841Z" } }, "outputs": [ @@ -1605,13 +1605,13 @@ { "cell_type": "code", "execution_count": 20, - "id": "1a497eaa", + "id": "a3e04785", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:32.071271Z", - "iopub.status.busy": "2026-08-05T21:18:32.071180Z", - "iopub.status.idle": "2026-08-05T21:18:32.181043Z", - "shell.execute_reply": "2026-08-05T21:18:32.180717Z" + "iopub.execute_input": "2026-08-06T04:54:59.610849Z", + "iopub.status.busy": "2026-08-06T04:54:59.610660Z", + "iopub.status.idle": "2026-08-06T04:54:59.799639Z", + "shell.execute_reply": "2026-08-06T04:54:59.798961Z" } }, "outputs": [ @@ -1649,7 +1649,7 @@ }, { "cell_type": "markdown", - "id": "3aada339", + "id": "09d232db", "metadata": {}, "source": [ "```{warning}\n", @@ -1684,13 +1684,13 @@ { "cell_type": "code", "execution_count": 21, - "id": "fb3ad245", + "id": "97a859ca", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:32.181735Z", - "iopub.status.busy": "2026-08-05T21:18:32.181651Z", - "iopub.status.idle": "2026-08-05T21:18:32.188785Z", - "shell.execute_reply": "2026-08-05T21:18:32.188441Z" + "iopub.execute_input": "2026-08-06T04:54:59.800951Z", + "iopub.status.busy": "2026-08-06T04:54:59.800835Z", + "iopub.status.idle": "2026-08-06T04:54:59.810383Z", + "shell.execute_reply": "2026-08-06T04:54:59.809646Z" } }, "outputs": [ @@ -1715,7 +1715,7 @@ }, { "cell_type": "markdown", - "id": "9db55c2b", + "id": "a6fdcb14", "metadata": {}, "source": [ "Anything that reads a *structure* raises, and should — there is none, and\n", @@ -1731,13 +1731,13 @@ { "cell_type": "code", "execution_count": 22, - "id": "6e73b410", + "id": "b58a2096", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:32.189488Z", - "iopub.status.busy": "2026-08-05T21:18:32.189399Z", - "iopub.status.idle": "2026-08-05T21:18:32.219873Z", - "shell.execute_reply": "2026-08-05T21:18:32.219530Z" + "iopub.execute_input": "2026-08-06T04:54:59.811670Z", + "iopub.status.busy": "2026-08-06T04:54:59.811551Z", + "iopub.status.idle": "2026-08-06T04:54:59.847996Z", + "shell.execute_reply": "2026-08-06T04:54:59.847435Z" } }, "outputs": [ @@ -1773,7 +1773,7 @@ }, { "cell_type": "markdown", - "id": "15af62c5", + "id": "7acfd2a0", "metadata": {}, "source": [ "```{warning}\n", @@ -1796,13 +1796,13 @@ { "cell_type": "code", "execution_count": 23, - "id": "44468fd6", + "id": "76138b28", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:32.220566Z", - "iopub.status.busy": "2026-08-05T21:18:32.220480Z", - "iopub.status.idle": "2026-08-05T21:18:32.226674Z", - "shell.execute_reply": "2026-08-05T21:18:32.226349Z" + "iopub.execute_input": "2026-08-06T04:54:59.849655Z", + "iopub.status.busy": "2026-08-06T04:54:59.849531Z", + "iopub.status.idle": "2026-08-06T04:54:59.857832Z", + "shell.execute_reply": "2026-08-06T04:54:59.857186Z" } }, "outputs": [ @@ -1829,7 +1829,7 @@ }, { "cell_type": "markdown", - "id": "a216c0bf", + "id": "01b4aa94", "metadata": {}, "source": [ "**The oxidation-state table is a choice.** The default `'icsd24'` is what has\n", @@ -1848,13 +1848,13 @@ { "cell_type": "code", "execution_count": 24, - "id": "b4257bef", + "id": "3f5f5470", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:32.227357Z", - "iopub.status.busy": "2026-08-05T21:18:32.227270Z", - "iopub.status.idle": "2026-08-05T21:18:32.328981Z", - "shell.execute_reply": "2026-08-05T21:18:32.328614Z" + "iopub.execute_input": "2026-08-06T04:54:59.858917Z", + "iopub.status.busy": "2026-08-06T04:54:59.858812Z", + "iopub.status.idle": "2026-08-06T04:54:59.982252Z", + "shell.execute_reply": "2026-08-06T04:54:59.981589Z" } }, "outputs": [ @@ -1883,7 +1883,7 @@ }, { "cell_type": "markdown", - "id": "f1c44fae", + "id": "270d8a71", "metadata": {}, "source": [ "```{warning}\n", @@ -1908,13 +1908,13 @@ { "cell_type": "code", "execution_count": 25, - "id": "4b8d1a78", + "id": "b1e0b045", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:32.342596Z", - "iopub.status.busy": "2026-08-05T21:18:32.342422Z", - "iopub.status.idle": "2026-08-05T21:18:32.826250Z", - "shell.execute_reply": "2026-08-05T21:18:32.825756Z" + "iopub.execute_input": "2026-08-06T04:54:59.983483Z", + "iopub.status.busy": "2026-08-06T04:54:59.983275Z", + "iopub.status.idle": "2026-08-06T04:55:00.225204Z", + "shell.execute_reply": "2026-08-06T04:55:00.224315Z" } }, "outputs": [ @@ -1950,7 +1950,7 @@ }, { "cell_type": "markdown", - "id": "e951560d", + "id": "04cf41e6", "metadata": {}, "source": [ "Note the other number: **33 of 40 attempts failed outright**, because a random\n", @@ -1975,13 +1975,13 @@ { "cell_type": "code", "execution_count": 26, - "id": "713e7264", + "id": "e67130cc", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:32.827613Z", - "iopub.status.busy": "2026-08-05T21:18:32.827447Z", - "iopub.status.idle": "2026-08-05T21:18:32.965190Z", - "shell.execute_reply": "2026-08-05T21:18:32.964947Z" + "iopub.execute_input": "2026-08-06T04:55:00.226565Z", + "iopub.status.busy": "2026-08-06T04:55:00.226441Z", + "iopub.status.idle": "2026-08-06T04:55:00.358599Z", + "shell.execute_reply": "2026-08-06T04:55:00.357823Z" } }, "outputs": [ @@ -2012,7 +2012,7 @@ }, { "cell_type": "markdown", - "id": "0f4c89ec", + "id": "a75a08b6", "metadata": {}, "source": [ "It also works on any dataset that has been through `mv.pp.symmetry`, which now\n", @@ -2024,13 +2024,13 @@ { "cell_type": "code", "execution_count": 27, - "id": "63b90d2f", + "id": "805bf33f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:32.966395Z", - "iopub.status.busy": "2026-08-05T21:18:32.966216Z", - "iopub.status.idle": "2026-08-05T21:18:34.406828Z", - "shell.execute_reply": "2026-08-05T21:18:34.406330Z" + "iopub.execute_input": "2026-08-06T04:55:00.359988Z", + "iopub.status.busy": "2026-08-06T04:55:00.359852Z", + "iopub.status.idle": "2026-08-06T04:55:01.734447Z", + "shell.execute_reply": "2026-08-06T04:55:01.733367Z" } }, "outputs": [ @@ -2067,7 +2067,7 @@ }, { "cell_type": "markdown", - "id": "2ef468e1", + "id": "835e7f13", "metadata": {}, "source": [ "On a screening library rather than a generated set, the same plot answers a\n", diff --git a/matverse_guide/docs/tutorials/data_io.ipynb b/matverse_guide/docs/tutorials/data_io.ipynb index 77dbc07..3728bd7 100644 --- a/matverse_guide/docs/tutorials/data_io.ipynb +++ b/matverse_guide/docs/tutorials/data_io.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "5a30ad19", + "id": "c9eb45b8", "metadata": {}, "source": [ "# Getting data in and out\n", @@ -19,13 +19,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "b7b91051", + "id": "5a9b1a7b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:55.819545Z", - "iopub.status.busy": "2026-08-05T21:36:55.819420Z", - "iopub.status.idle": "2026-08-05T21:37:04.701314Z", - "shell.execute_reply": "2026-08-05T21:37:04.700343Z" + "iopub.execute_input": "2026-08-06T05:20:15.906828Z", + "iopub.status.busy": "2026-08-06T05:20:15.906718Z", + "iopub.status.idle": "2026-08-06T05:20:29.115833Z", + "shell.execute_reply": "2026-08-06T05:20:29.115351Z" } }, "outputs": [ @@ -69,7 +69,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -85,7 +85,7 @@ }, { "cell_type": "markdown", - "id": "271efb7f", + "id": "06342c8f", "metadata": {}, "source": [ "## From a database, over OPTIMADE\n", @@ -98,13 +98,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "eb680cf9", + "id": "2326934d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:04.704335Z", - "iopub.status.busy": "2026-08-05T21:37:04.703556Z", - "iopub.status.idle": "2026-08-05T21:37:04.708658Z", - "shell.execute_reply": "2026-08-05T21:37:04.708232Z" + "iopub.execute_input": "2026-08-06T05:20:29.117607Z", + "iopub.status.busy": "2026-08-06T05:20:29.117059Z", + "iopub.status.idle": "2026-08-06T05:20:29.120497Z", + "shell.execute_reply": "2026-08-06T05:20:29.120178Z" } }, "outputs": [ @@ -132,7 +132,7 @@ }, { "cell_type": "markdown", - "id": "228369f5", + "id": "ca3f3ceb", "metadata": {}, "source": [ "We query [OQMD](https://oqmd.org/) — about 1.4 million entries — for every\n", @@ -142,13 +142,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "6128e0ef", + "id": "ca371100", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:04.710127Z", - "iopub.status.busy": "2026-08-05T21:37:04.710004Z", - "iopub.status.idle": "2026-08-05T21:37:09.337328Z", - "shell.execute_reply": "2026-08-05T21:37:09.336849Z" + "iopub.execute_input": "2026-08-06T05:20:29.121808Z", + "iopub.status.busy": "2026-08-06T05:20:29.121637Z", + "iopub.status.idle": "2026-08-06T05:20:36.552533Z", + "shell.execute_reply": "2026-08-06T05:20:36.552255Z" } }, "outputs": [ @@ -201,13 +201,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "2e82cc19", + "id": "af46cadf", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:09.338798Z", - "iopub.status.busy": "2026-08-05T21:37:09.338671Z", - "iopub.status.idle": "2026-08-05T21:37:09.368993Z", - "shell.execute_reply": "2026-08-05T21:37:09.368524Z" + "iopub.execute_input": "2026-08-06T05:20:36.555119Z", + "iopub.status.busy": "2026-08-06T05:20:36.554447Z", + "iopub.status.idle": "2026-08-06T05:20:36.573758Z", + "shell.execute_reply": "2026-08-06T05:20:36.573096Z" } }, "outputs": [ @@ -395,7 +395,7 @@ }, { "cell_type": "markdown", - "id": "d03472b1", + "id": "9dd247dc", "metadata": {}, "source": [ "Real data, with its real database identifiers in `obs['optimade_id']`, so any\n", @@ -412,13 +412,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "8c767947", + "id": "da7fea8c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:09.370528Z", - "iopub.status.busy": "2026-08-05T21:37:09.370392Z", - "iopub.status.idle": "2026-08-05T21:37:10.046920Z", - "shell.execute_reply": "2026-08-05T21:37:10.046293Z" + "iopub.execute_input": "2026-08-06T05:20:36.574929Z", + "iopub.status.busy": "2026-08-06T05:20:36.574771Z", + "iopub.status.idle": "2026-08-06T05:20:37.039893Z", + "shell.execute_reply": "2026-08-06T05:20:37.039225Z" } }, "outputs": [], @@ -432,13 +432,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "d2022174", + "id": "cdbe41c5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.048224Z", - "iopub.status.busy": "2026-08-05T21:37:10.048123Z", - "iopub.status.idle": "2026-08-05T21:37:10.050393Z", - "shell.execute_reply": "2026-08-05T21:37:10.050066Z" + "iopub.execute_input": "2026-08-06T05:20:37.041464Z", + "iopub.status.busy": "2026-08-06T05:20:37.041327Z", + "iopub.status.idle": "2026-08-06T05:20:37.044713Z", + "shell.execute_reply": "2026-08-06T05:20:37.044068Z" } }, "outputs": [ @@ -459,7 +459,7 @@ }, { "cell_type": "markdown", - "id": "5349ffeb", + "id": "e7fd7e81", "metadata": {}, "source": [ "### What a real query gives you that a curated one does not\n", @@ -472,13 +472,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "905a668c", + "id": "7aad6652", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.051237Z", - "iopub.status.busy": "2026-08-05T21:37:10.051146Z", - "iopub.status.idle": "2026-08-05T21:37:10.687210Z", - "shell.execute_reply": "2026-08-05T21:37:10.686656Z" + "iopub.execute_input": "2026-08-06T05:20:37.045732Z", + "iopub.status.busy": "2026-08-06T05:20:37.045617Z", + "iopub.status.idle": "2026-08-06T05:20:37.368238Z", + "shell.execute_reply": "2026-08-06T05:20:37.367761Z" } }, "outputs": [ @@ -506,7 +506,7 @@ }, { "cell_type": "markdown", - "id": "50cd45f5", + "id": "8be98da1", "metadata": {}, "source": [ "**Seven of fifteen were duplicates.** That is not a contrived example — it is\n", @@ -520,13 +520,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "0e47cd91", + "id": "1c2a827f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.688772Z", - "iopub.status.busy": "2026-08-05T21:37:10.688639Z", - "iopub.status.idle": "2026-08-05T21:37:10.696272Z", - "shell.execute_reply": "2026-08-05T21:37:10.695885Z" + "iopub.execute_input": "2026-08-06T05:20:37.370200Z", + "iopub.status.busy": "2026-08-06T05:20:37.369751Z", + "iopub.status.idle": "2026-08-06T05:20:37.377825Z", + "shell.execute_reply": "2026-08-06T05:20:37.377557Z" } }, "outputs": [ @@ -713,7 +713,7 @@ }, { "cell_type": "markdown", - "id": "80b15526", + "id": "a9654cf4", "metadata": {}, "source": [ "### Cached, so the second call is free\n", @@ -724,13 +724,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "64c272a8", + "id": "771e69c9", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.697539Z", - "iopub.status.busy": "2026-08-05T21:37:10.697367Z", - "iopub.status.idle": "2026-08-05T21:37:10.773034Z", - "shell.execute_reply": "2026-08-05T21:37:10.772493Z" + "iopub.execute_input": "2026-08-06T05:20:37.379596Z", + "iopub.status.busy": "2026-08-06T05:20:37.379172Z", + "iopub.status.idle": "2026-08-06T05:20:37.414421Z", + "shell.execute_reply": "2026-08-06T05:20:37.414154Z" } }, "outputs": [ @@ -860,13 +860,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "233d84ce", + "id": "9a787877", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.774111Z", - "iopub.status.busy": "2026-08-05T21:37:10.773983Z", - "iopub.status.idle": "2026-08-05T21:37:10.776890Z", - "shell.execute_reply": "2026-08-05T21:37:10.776499Z" + "iopub.execute_input": "2026-08-06T05:20:37.416175Z", + "iopub.status.busy": "2026-08-06T05:20:37.415764Z", + "iopub.status.idle": "2026-08-06T05:20:37.419478Z", + "shell.execute_reply": "2026-08-06T05:20:37.419176Z" } }, "outputs": [ @@ -891,13 +891,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "1c86c431", + "id": "3da56cd3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.778033Z", - "iopub.status.busy": "2026-08-05T21:37:10.777918Z", - "iopub.status.idle": "2026-08-05T21:37:10.780376Z", - "shell.execute_reply": "2026-08-05T21:37:10.779972Z" + "iopub.execute_input": "2026-08-06T05:20:37.421116Z", + "iopub.status.busy": "2026-08-06T05:20:37.420733Z", + "iopub.status.idle": "2026-08-06T05:20:37.423895Z", + "shell.execute_reply": "2026-08-06T05:20:37.423660Z" } }, "outputs": [ @@ -918,7 +918,7 @@ }, { "cell_type": "markdown", - "id": "f8111ee5", + "id": "080603ca", "metadata": {}, "source": [ "```{warning}\n", @@ -949,13 +949,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "ed128b6b", + "id": "2768f473", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.781449Z", - "iopub.status.busy": "2026-08-05T21:37:10.781344Z", - "iopub.status.idle": "2026-08-05T21:37:10.805966Z", - "shell.execute_reply": "2026-08-05T21:37:10.805469Z" + "iopub.execute_input": "2026-08-06T05:20:37.425520Z", + "iopub.status.busy": "2026-08-06T05:20:37.425133Z", + "iopub.status.idle": "2026-08-06T05:20:37.437056Z", + "shell.execute_reply": "2026-08-06T05:20:37.436790Z" } }, "outputs": [ @@ -1026,7 +1026,7 @@ }, { "cell_type": "markdown", - "id": "7a90afbf", + "id": "55b89769", "metadata": {}, "source": [ "## From structures you already have" @@ -1035,13 +1035,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "d262c580", + "id": "4c60646b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.807254Z", - "iopub.status.busy": "2026-08-05T21:37:10.807120Z", - "iopub.status.idle": "2026-08-05T21:37:10.815983Z", - "shell.execute_reply": "2026-08-05T21:37:10.815602Z" + "iopub.execute_input": "2026-08-06T05:20:37.438780Z", + "iopub.status.busy": "2026-08-06T05:20:37.438389Z", + "iopub.status.idle": "2026-08-06T05:20:37.448026Z", + "shell.execute_reply": "2026-08-06T05:20:37.447764Z" } }, "outputs": [ @@ -1114,7 +1114,7 @@ }, { "cell_type": "markdown", - "id": "9c04f103", + "id": "128f292e", "metadata": {}, "source": [ "Pass a DataFrame and it becomes `obs`, aligned by position.\n", @@ -1128,13 +1128,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "52b91ec6", + "id": "e47245ef", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.817227Z", - "iopub.status.busy": "2026-08-05T21:37:10.817053Z", - "iopub.status.idle": "2026-08-05T21:37:10.837030Z", - "shell.execute_reply": "2026-08-05T21:37:10.836510Z" + "iopub.execute_input": "2026-08-06T05:20:37.449743Z", + "iopub.status.busy": "2026-08-06T05:20:37.449348Z", + "iopub.status.idle": "2026-08-06T05:20:37.457454Z", + "shell.execute_reply": "2026-08-06T05:20:37.457190Z" } }, "outputs": [ @@ -1163,7 +1163,7 @@ }, { "cell_type": "markdown", - "id": "e4c35b73", + "id": "45b79a66", "metadata": {}, "source": [ "## From ASE\n", @@ -1175,13 +1175,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "d726152a", + "id": "a7ede9af", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.838061Z", - "iopub.status.busy": "2026-08-05T21:37:10.837938Z", - "iopub.status.idle": "2026-08-05T21:37:10.868036Z", - "shell.execute_reply": "2026-08-05T21:37:10.867525Z" + "iopub.execute_input": "2026-08-06T05:20:37.459186Z", + "iopub.status.busy": "2026-08-06T05:20:37.458776Z", + "iopub.status.idle": "2026-08-06T05:20:37.476038Z", + "shell.execute_reply": "2026-08-06T05:20:37.475720Z" } }, "outputs": [ @@ -1250,7 +1250,7 @@ }, { "cell_type": "markdown", - "id": "f8166cc3", + "id": "496c6a49", "metadata": {}, "source": [ "### From a trajectory or structure file\n", @@ -1263,13 +1263,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "c77f59cf", + "id": "d8f42cb7", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.869372Z", - "iopub.status.busy": "2026-08-05T21:37:10.869235Z", - "iopub.status.idle": "2026-08-05T21:37:10.901959Z", - "shell.execute_reply": "2026-08-05T21:37:10.901514Z" + "iopub.execute_input": "2026-08-06T05:20:37.477680Z", + "iopub.status.busy": "2026-08-06T05:20:37.477290Z", + "iopub.status.idle": "2026-08-06T05:20:37.497404Z", + "shell.execute_reply": "2026-08-06T05:20:37.497131Z" } }, "outputs": [ @@ -1352,7 +1352,7 @@ }, { "cell_type": "markdown", - "id": "2b79d177", + "id": "51743482", "metadata": {}, "source": [ "## CIFs, out and back\n", @@ -1363,13 +1363,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "2982bde5", + "id": "14635479", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.903252Z", - "iopub.status.busy": "2026-08-05T21:37:10.903055Z", - "iopub.status.idle": "2026-08-05T21:37:10.951999Z", - "shell.execute_reply": "2026-08-05T21:37:10.951512Z" + "iopub.execute_input": "2026-08-06T05:20:37.498877Z", + "iopub.status.busy": "2026-08-06T05:20:37.498735Z", + "iopub.status.idle": "2026-08-06T05:20:37.521278Z", + "shell.execute_reply": "2026-08-06T05:20:37.521010Z" } }, "outputs": [ @@ -1392,13 +1392,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "a9f87547", + "id": "e87a1de8", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.953395Z", - "iopub.status.busy": "2026-08-05T21:37:10.953265Z", - "iopub.status.idle": "2026-08-05T21:37:11.023006Z", - "shell.execute_reply": "2026-08-05T21:37:11.022299Z" + "iopub.execute_input": "2026-08-06T05:20:37.523051Z", + "iopub.status.busy": "2026-08-06T05:20:37.522633Z", + "iopub.status.idle": "2026-08-06T05:20:37.565892Z", + "shell.execute_reply": "2026-08-06T05:20:37.565261Z" } }, "outputs": [ @@ -1485,7 +1485,7 @@ }, { "cell_type": "markdown", - "id": "1578d3ce", + "id": "3c77b61b", "metadata": {}, "source": [ "Out and back with the formulas intact. `to_cif` names each file from its row,\n", @@ -1497,13 +1497,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "9f8d320c", + "id": "d39aaaa1", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:11.024308Z", - "iopub.status.busy": "2026-08-05T21:37:11.024161Z", - "iopub.status.idle": "2026-08-05T21:37:11.027645Z", - "shell.execute_reply": "2026-08-05T21:37:11.027237Z" + "iopub.execute_input": "2026-08-06T05:20:37.567211Z", + "iopub.status.busy": "2026-08-06T05:20:37.567101Z", + "iopub.status.idle": "2026-08-06T05:20:37.570059Z", + "shell.execute_reply": "2026-08-06T05:20:37.569741Z" } }, "outputs": [ @@ -1527,13 +1527,13 @@ { "cell_type": "code", "execution_count": 20, - "id": "a71ed570", + "id": "93d4a513", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:11.028890Z", - "iopub.status.busy": "2026-08-05T21:37:11.028769Z", - "iopub.status.idle": "2026-08-05T21:37:11.031591Z", - "shell.execute_reply": "2026-08-05T21:37:11.031263Z" + "iopub.execute_input": "2026-08-06T05:20:37.571408Z", + "iopub.status.busy": "2026-08-06T05:20:37.571314Z", + "iopub.status.idle": "2026-08-06T05:20:37.573571Z", + "shell.execute_reply": "2026-08-06T05:20:37.573334Z" } }, "outputs": [ @@ -1555,7 +1555,7 @@ }, { "cell_type": "markdown", - "id": "04774071", + "id": "e47c290b", "metadata": {}, "source": [ "And the object itself is an ordinary `AnnData`, so `write_h5ad` is the archive\n", @@ -1572,13 +1572,13 @@ { "cell_type": "code", "execution_count": 21, - "id": "c29cb0b8", + "id": "3850b569", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:11.032473Z", - "iopub.status.busy": "2026-08-05T21:37:11.032363Z", - "iopub.status.idle": "2026-08-05T21:37:11.038643Z", - "shell.execute_reply": "2026-08-05T21:37:11.038272Z" + "iopub.execute_input": "2026-08-06T05:20:37.574819Z", + "iopub.status.busy": "2026-08-06T05:20:37.574727Z", + "iopub.status.idle": "2026-08-06T05:20:37.580260Z", + "shell.execute_reply": "2026-08-06T05:20:37.579852Z" } }, "outputs": [ @@ -1611,13 +1611,13 @@ { "cell_type": "code", "execution_count": 22, - "id": "81ad24e9", + "id": "f58b908a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:11.039548Z", - "iopub.status.busy": "2026-08-05T21:37:11.039383Z", - "iopub.status.idle": "2026-08-05T21:37:11.058927Z", - "shell.execute_reply": "2026-08-05T21:37:11.058492Z" + "iopub.execute_input": "2026-08-06T05:20:37.581458Z", + "iopub.status.busy": "2026-08-06T05:20:37.581315Z", + "iopub.status.idle": "2026-08-06T05:20:37.596905Z", + "shell.execute_reply": "2026-08-06T05:20:37.596361Z" } }, "outputs": [ @@ -1645,13 +1645,13 @@ { "cell_type": "code", "execution_count": 23, - "id": "4482e0c2", + "id": "7f983dee", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:11.059863Z", - "iopub.status.busy": "2026-08-05T21:37:11.059737Z", - "iopub.status.idle": "2026-08-05T21:37:11.062745Z", - "shell.execute_reply": "2026-08-05T21:37:11.062404Z" + "iopub.execute_input": "2026-08-06T05:20:37.598233Z", + "iopub.status.busy": "2026-08-06T05:20:37.598133Z", + "iopub.status.idle": "2026-08-06T05:20:37.600802Z", + "shell.execute_reply": "2026-08-06T05:20:37.600429Z" } }, "outputs": [ @@ -1673,7 +1673,7 @@ }, { "cell_type": "markdown", - "id": "f26072b5", + "id": "2ac21041", "metadata": {}, "source": [ "```{note}\n", @@ -1688,13 +1688,13 @@ { "cell_type": "code", "execution_count": 24, - "id": "e1d0a602", + "id": "264ebe31", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:11.063625Z", - "iopub.status.busy": "2026-08-05T21:37:11.063513Z", - "iopub.status.idle": "2026-08-05T21:37:11.065694Z", - "shell.execute_reply": "2026-08-05T21:37:11.065375Z" + "iopub.execute_input": "2026-08-06T05:20:37.601799Z", + "iopub.status.busy": "2026-08-06T05:20:37.601708Z", + "iopub.status.idle": "2026-08-06T05:20:37.603456Z", + "shell.execute_reply": "2026-08-06T05:20:37.603253Z" } }, "outputs": [ @@ -1721,7 +1721,7 @@ }, { "cell_type": "markdown", - "id": "f09c355a", + "id": "7745ccc2", "metadata": {}, "source": [ "```{seealso}\n", diff --git a/matverse_guide/docs/tutorials/defects_and_diffusion.ipynb b/matverse_guide/docs/tutorials/defects_and_diffusion.ipynb index f032790..150b59a 100644 --- a/matverse_guide/docs/tutorials/defects_and_diffusion.ipynb +++ b/matverse_guide/docs/tutorials/defects_and_diffusion.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "3098ddf3", + "id": "1e8594d1", "metadata": {}, "source": [ "# Defects and diffusion\n", @@ -25,13 +25,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "ef78fb4d", + "id": "c6cd8363", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:02.781723Z", - "iopub.status.busy": "2026-08-05T21:19:02.781639Z", - "iopub.status.idle": "2026-08-05T21:19:08.320883Z", - "shell.execute_reply": "2026-08-05T21:19:08.320399Z" + "iopub.execute_input": "2026-08-06T04:55:51.520144Z", + "iopub.status.busy": "2026-08-06T04:55:51.520041Z", + "iopub.status.idle": "2026-08-06T04:55:59.253092Z", + "shell.execute_reply": "2026-08-06T04:55:59.252636Z" } }, "outputs": [ @@ -75,7 +75,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -91,7 +91,7 @@ }, { "cell_type": "markdown", - "id": "353f2f22", + "id": "6448d19a", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -103,13 +103,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "eda5d9b6", + "id": "90170fd5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:08.322227Z", - "iopub.status.busy": "2026-08-05T21:19:08.321832Z", - "iopub.status.idle": "2026-08-05T21:19:08.336770Z", - "shell.execute_reply": "2026-08-05T21:19:08.336397Z" + "iopub.execute_input": "2026-08-06T04:55:59.254728Z", + "iopub.status.busy": "2026-08-06T04:55:59.254308Z", + "iopub.status.idle": "2026-08-06T04:55:59.271621Z", + "shell.execute_reply": "2026-08-06T04:55:59.270933Z" } }, "outputs": [ @@ -171,7 +171,7 @@ }, { "cell_type": "markdown", - "id": "7e0e5045", + "id": "8998d828", "metadata": {}, "source": [ "### Two ways to deform a cell before you break it\n", @@ -185,13 +185,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "99e7da17", + "id": "246a9527", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:08.337665Z", - "iopub.status.busy": "2026-08-05T21:19:08.337511Z", - "iopub.status.idle": "2026-08-05T21:19:08.342802Z", - "shell.execute_reply": "2026-08-05T21:19:08.342442Z" + "iopub.execute_input": "2026-08-06T04:55:59.272680Z", + "iopub.status.busy": "2026-08-06T04:55:59.272563Z", + "iopub.status.idle": "2026-08-06T04:55:59.279900Z", + "shell.execute_reply": "2026-08-06T04:55:59.279259Z" } }, "outputs": [ @@ -216,13 +216,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "a8346819", + "id": "ed0cb295", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:08.343625Z", - "iopub.status.busy": "2026-08-05T21:19:08.343453Z", - "iopub.status.idle": "2026-08-05T21:19:08.346625Z", - "shell.execute_reply": "2026-08-05T21:19:08.346303Z" + "iopub.execute_input": "2026-08-06T04:55:59.280952Z", + "iopub.status.busy": "2026-08-06T04:55:59.280837Z", + "iopub.status.idle": "2026-08-06T04:55:59.285482Z", + "shell.execute_reply": "2026-08-06T04:55:59.284866Z" } }, "outputs": [ @@ -243,7 +243,7 @@ }, { "cell_type": "markdown", - "id": "52fa37fc", + "id": "6d4ec356", "metadata": {}, "source": [ "## Enumerating the defects\n", @@ -257,13 +257,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "a2b30abd", + "id": "fe04d328", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:08.347339Z", - "iopub.status.busy": "2026-08-05T21:19:08.347253Z", - "iopub.status.idle": "2026-08-05T21:19:08.367166Z", - "shell.execute_reply": "2026-08-05T21:19:08.366790Z" + "iopub.execute_input": "2026-08-06T04:55:59.286478Z", + "iopub.status.busy": "2026-08-06T04:55:59.286366Z", + "iopub.status.idle": "2026-08-06T04:55:59.308505Z", + "shell.execute_reply": "2026-08-06T04:55:59.307821Z" } }, "outputs": [ @@ -327,7 +327,7 @@ }, { "cell_type": "markdown", - "id": "505436f2", + "id": "dee3c473", "metadata": {}, "source": [ "```{note}\n", @@ -348,13 +348,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "0c90f442", + "id": "a0396847", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:08.367979Z", - "iopub.status.busy": "2026-08-05T21:19:08.367887Z", - "iopub.status.idle": "2026-08-05T21:19:08.415366Z", - "shell.execute_reply": "2026-08-05T21:19:08.414875Z" + "iopub.execute_input": "2026-08-06T04:55:59.309587Z", + "iopub.status.busy": "2026-08-06T04:55:59.309466Z", + "iopub.status.idle": "2026-08-06T04:56:00.309263Z", + "shell.execute_reply": "2026-08-06T04:56:00.308413Z" } }, "outputs": [ @@ -414,7 +414,7 @@ }, { "cell_type": "markdown", - "id": "faebf88a", + "id": "8b529a68", "metadata": {}, "source": [ "```{note}\n", @@ -433,7 +433,7 @@ }, { "cell_type": "markdown", - "id": "26680a0e", + "id": "a8af4fdd", "metadata": {}, "source": [ "### Two kinds that are not a site you already have\n", @@ -451,13 +451,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "47478c83", + "id": "75a797aa", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:08.416203Z", - "iopub.status.busy": "2026-08-05T21:19:08.416112Z", - "iopub.status.idle": "2026-08-05T21:19:10.461578Z", - "shell.execute_reply": "2026-08-05T21:19:10.461152Z" + "iopub.execute_input": "2026-08-06T04:56:00.310462Z", + "iopub.status.busy": "2026-08-06T04:56:00.310330Z", + "iopub.status.idle": "2026-08-06T04:56:02.583057Z", + "shell.execute_reply": "2026-08-06T04:56:02.582282Z" } }, "outputs": [ @@ -492,43 +492,43 @@ " \n", " 0\n", " antisite\n", - " O\n", " Fe\n", + " P\n", " 168\n", " \n", " \n", " 1\n", " antisite\n", - " O\n", " Fe\n", + " O\n", " 168\n", " \n", " \n", " 2\n", " antisite\n", - " O\n", " Fe\n", + " Li\n", " 168\n", " \n", " \n", " 3\n", " antisite\n", - " O\n", + " P\n", " Fe\n", " 168\n", " \n", " \n", " 4\n", " antisite\n", - " O\n", " P\n", + " O\n", " 168\n", " \n", " \n", " 5\n", " antisite\n", - " O\n", " P\n", + " Li\n", " 168\n", " \n", " \n", @@ -537,12 +537,12 @@ ], "text/plain": [ " defect removed added nsites\n", - "0 antisite O Fe 168\n", - "1 antisite O Fe 168\n", - "2 antisite O Fe 168\n", - "3 antisite O Fe 168\n", - "4 antisite O P 168\n", - "5 antisite O P 168" + "0 antisite Fe P 168\n", + "1 antisite Fe O 168\n", + "2 antisite Fe Li 168\n", + "3 antisite P Fe 168\n", + "4 antisite P O 168\n", + "5 antisite P Li 168" ] }, "execution_count": 7, @@ -561,7 +561,7 @@ }, { "cell_type": "markdown", - "id": "7686651a", + "id": "24362c0e", "metadata": {}, "source": [ "Twenty-four antisites from a four-species cathode, each an ordered swap — Fe on\n", @@ -574,13 +574,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "bbf6af0a", + "id": "a166929e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:10.462651Z", - "iopub.status.busy": "2026-08-05T21:19:10.462482Z", - "iopub.status.idle": "2026-08-05T21:19:19.767489Z", - "shell.execute_reply": "2026-08-05T21:19:19.766996Z" + "iopub.execute_input": "2026-08-06T04:56:02.584357Z", + "iopub.status.busy": "2026-08-06T04:56:02.584210Z", + "iopub.status.idle": "2026-08-06T04:56:12.093359Z", + "shell.execute_reply": "2026-08-06T04:56:12.092477Z" } }, "outputs": [ @@ -661,7 +661,7 @@ }, { "cell_type": "markdown", - "id": "4937a048", + "id": "94a552bd", "metadata": {}, "source": [ "One more atom than the host supercell, which is what an interstitial is.\n", @@ -676,7 +676,7 @@ }, { "cell_type": "markdown", - "id": "d4c190a3", + "id": "0802ac7f", "metadata": {}, "source": [ "The raw energy of a cell with one atom missing is not a formation energy. A\n", @@ -692,13 +692,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "2f67a00a", + "id": "9646b285", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:19.768582Z", - "iopub.status.busy": "2026-08-05T21:19:19.768474Z", - "iopub.status.idle": "2026-08-05T21:19:19.798352Z", - "shell.execute_reply": "2026-08-05T21:19:19.797964Z" + "iopub.execute_input": "2026-08-06T04:56:12.094876Z", + "iopub.status.busy": "2026-08-06T04:56:12.094723Z", + "iopub.status.idle": "2026-08-06T04:56:12.132901Z", + "shell.execute_reply": "2026-08-06T04:56:12.132260Z" } }, "outputs": [ @@ -719,7 +719,7 @@ }, { "cell_type": "markdown", - "id": "5056ef34", + "id": "6aec01e8", "metadata": {}, "source": [ "An elemental solid has no window — copper in equilibrium with copper fixes its\n", @@ -731,13 +731,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "93212a7a", + "id": "c2976b97", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:19.799139Z", - "iopub.status.busy": "2026-08-05T21:19:19.799048Z", - "iopub.status.idle": "2026-08-05T21:19:19.801980Z", - "shell.execute_reply": "2026-08-05T21:19:19.801646Z" + "iopub.execute_input": "2026-08-06T04:56:12.139460Z", + "iopub.status.busy": "2026-08-06T04:56:12.139207Z", + "iopub.status.idle": "2026-08-06T04:56:12.142669Z", + "shell.execute_reply": "2026-08-06T04:56:12.142366Z" } }, "outputs": [ @@ -764,7 +764,7 @@ }, { "cell_type": "markdown", - "id": "c19c3311", + "id": "78cc9080", "metadata": {}, "source": [ "**1.314 eV**, against roughly 1.3 eV measured for copper by positron\n", @@ -789,13 +789,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "dda512b1", + "id": "f2d2ac1e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:19.802670Z", - "iopub.status.busy": "2026-08-05T21:19:19.802582Z", - "iopub.status.idle": "2026-08-05T21:19:19.806102Z", - "shell.execute_reply": "2026-08-05T21:19:19.805796Z" + "iopub.execute_input": "2026-08-06T04:56:12.143500Z", + "iopub.status.busy": "2026-08-06T04:56:12.143329Z", + "iopub.status.idle": "2026-08-06T04:56:12.147475Z", + "shell.execute_reply": "2026-08-06T04:56:12.147185Z" } }, "outputs": [ @@ -822,13 +822,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "a29c899e", + "id": "2c3d28fa", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:19.806795Z", - "iopub.status.busy": "2026-08-05T21:19:19.806713Z", - "iopub.status.idle": "2026-08-05T21:19:19.936829Z", - "shell.execute_reply": "2026-08-05T21:19:19.936393Z" + "iopub.execute_input": "2026-08-06T04:56:12.148277Z", + "iopub.status.busy": "2026-08-06T04:56:12.148117Z", + "iopub.status.idle": "2026-08-06T04:56:12.308288Z", + "shell.execute_reply": "2026-08-06T04:56:12.307906Z" } }, "outputs": [ @@ -872,13 +872,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "7b5b62d3", + "id": "4b5bd2b5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:19.937696Z", - "iopub.status.busy": "2026-08-05T21:19:19.937589Z", - "iopub.status.idle": "2026-08-05T21:19:19.942065Z", - "shell.execute_reply": "2026-08-05T21:19:19.941737Z" + "iopub.execute_input": "2026-08-06T04:56:12.309185Z", + "iopub.status.busy": "2026-08-06T04:56:12.308998Z", + "iopub.status.idle": "2026-08-06T04:56:12.313954Z", + "shell.execute_reply": "2026-08-06T04:56:12.313636Z" } }, "outputs": [ @@ -936,7 +936,7 @@ }, { "cell_type": "markdown", - "id": "6ddf45f2", + "id": "b20e614d", "metadata": {}, "source": [ "Each straight segment is one charge state, and its slope is the charge; the\n", @@ -961,7 +961,7 @@ }, { "cell_type": "markdown", - "id": "25873d61", + "id": "3680b5a2", "metadata": {}, "source": [ "### The charged states are lying, and by how much\n", @@ -979,13 +979,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "178c1d05", + "id": "9bf140c6", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:19.942771Z", - "iopub.status.busy": "2026-08-05T21:19:19.942685Z", - "iopub.status.idle": "2026-08-05T21:19:20.023237Z", - "shell.execute_reply": "2026-08-05T21:19:20.022862Z" + "iopub.execute_input": "2026-08-06T04:56:12.314732Z", + "iopub.status.busy": "2026-08-06T04:56:12.314573Z", + "iopub.status.idle": "2026-08-06T04:56:12.448335Z", + "shell.execute_reply": "2026-08-06T04:56:12.422351Z" } }, "outputs": [ @@ -1022,7 +1022,7 @@ }, { "cell_type": "markdown", - "id": "c261cfc5", + "id": "28f9ea86", "metadata": {}, "source": [ "Zero shift at the valence band maximum and a growing one across the gap, which\n", @@ -1069,7 +1069,7 @@ }, { "cell_type": "markdown", - "id": "f6ccf5c6", + "id": "9f07ef54", "metadata": {}, "source": [ "## What it costs to move\n", @@ -1084,13 +1084,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "435baa1a", + "id": "c472b7ec", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:20.023979Z", - "iopub.status.busy": "2026-08-05T21:19:20.023886Z", - "iopub.status.idle": "2026-08-05T21:19:20.031981Z", - "shell.execute_reply": "2026-08-05T21:19:20.031661Z" + "iopub.execute_input": "2026-08-06T04:56:12.452348Z", + "iopub.status.busy": "2026-08-06T04:56:12.452080Z", + "iopub.status.idle": "2026-08-06T04:56:12.472896Z", + "shell.execute_reply": "2026-08-06T04:56:12.472295Z" } }, "outputs": [ @@ -1147,7 +1147,7 @@ }, { "cell_type": "markdown", - "id": "def45be2", + "id": "e4322a59", "metadata": {}, "source": [ "2.556 Å is the nearest-neighbour distance in copper, `a/√2`, which is what a\n", @@ -1171,13 +1171,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "61d8e7ce", + "id": "86a66a1c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:20.032659Z", - "iopub.status.busy": "2026-08-05T21:19:20.032575Z", - "iopub.status.idle": "2026-08-05T21:19:20.066956Z", - "shell.execute_reply": "2026-08-05T21:19:20.066622Z" + "iopub.execute_input": "2026-08-06T04:56:12.474151Z", + "iopub.status.busy": "2026-08-06T04:56:12.473920Z", + "iopub.status.idle": "2026-08-06T04:56:12.534236Z", + "shell.execute_reply": "2026-08-06T04:56:12.533689Z" } }, "outputs": [ @@ -1210,7 +1210,7 @@ }, { "cell_type": "markdown", - "id": "b6791dac", + "id": "2fc8b584", "metadata": {}, "source": [ "`key_added` matters here. Without it the second relaxation would overwrite the\n", @@ -1226,13 +1226,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "c1c9a6cd", + "id": "14cb754e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:20.067632Z", - "iopub.status.busy": "2026-08-05T21:19:20.067549Z", - "iopub.status.idle": "2026-08-05T21:19:21.033062Z", - "shell.execute_reply": "2026-08-05T21:19:21.032588Z" + "iopub.execute_input": "2026-08-06T04:56:12.535322Z", + "iopub.status.busy": "2026-08-06T04:56:12.535194Z", + "iopub.status.idle": "2026-08-06T04:56:13.679128Z", + "shell.execute_reply": "2026-08-06T04:56:13.678566Z" } }, "outputs": [ @@ -1295,7 +1295,7 @@ }, { "cell_type": "markdown", - "id": "8b83343f", + "id": "57a7536a", "metadata": {}, "source": [ "**0.754 eV against a literature value of about 0.70 eV.** For a potential that\n", @@ -1318,13 +1318,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "bcbbf1bd", + "id": "ada653f6", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:21.034003Z", - "iopub.status.busy": "2026-08-05T21:19:21.033900Z", - "iopub.status.idle": "2026-08-05T21:19:21.158035Z", - "shell.execute_reply": "2026-08-05T21:19:21.157664Z" + "iopub.execute_input": "2026-08-06T04:56:13.680288Z", + "iopub.status.busy": "2026-08-06T04:56:13.680151Z", + "iopub.status.idle": "2026-08-06T04:56:13.810816Z", + "shell.execute_reply": "2026-08-06T04:56:13.810306Z" } }, "outputs": [ @@ -1362,7 +1362,7 @@ }, { "cell_type": "markdown", - "id": "ddad1c31", + "id": "cff62a59", "metadata": {}, "source": [ "The path rises to a single saddle and comes back down, which is what a\n", @@ -1386,13 +1386,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "1d3dce91", + "id": "5b1102aa", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:21.158847Z", - "iopub.status.busy": "2026-08-05T21:19:21.158752Z", - "iopub.status.idle": "2026-08-05T21:19:21.164314Z", - "shell.execute_reply": "2026-08-05T21:19:21.163977Z" + "iopub.execute_input": "2026-08-06T04:56:13.812202Z", + "iopub.status.busy": "2026-08-06T04:56:13.812054Z", + "iopub.status.idle": "2026-08-06T04:56:13.820071Z", + "shell.execute_reply": "2026-08-06T04:56:13.819264Z" } }, "outputs": [ @@ -1487,13 +1487,13 @@ { "cell_type": "code", "execution_count": 20, - "id": "08f12a58", + "id": "3efeb13b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:21.164998Z", - "iopub.status.busy": "2026-08-05T21:19:21.164913Z", - "iopub.status.idle": "2026-08-05T21:19:21.375830Z", - "shell.execute_reply": "2026-08-05T21:19:21.375434Z" + "iopub.execute_input": "2026-08-06T04:56:13.821318Z", + "iopub.status.busy": "2026-08-06T04:56:13.821156Z", + "iopub.status.idle": "2026-08-06T04:56:14.049647Z", + "shell.execute_reply": "2026-08-06T04:56:14.048877Z" } }, "outputs": [ @@ -1533,7 +1533,7 @@ }, { "cell_type": "markdown", - "id": "d8e14e9c", + "id": "f68ca04a", "metadata": {}, "source": [ "A straight line on this plot is the definition of Arrhenius behaviour, and its\n", @@ -1553,7 +1553,7 @@ }, { "cell_type": "markdown", - "id": "b894e8df", + "id": "a9d9959b", "metadata": {}, "source": [ "## Which barriers are actually worth computing?\n", @@ -1569,13 +1569,13 @@ { "cell_type": "code", "execution_count": 21, - "id": "fd2603ef", + "id": "e267374a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:21.376693Z", - "iopub.status.busy": "2026-08-05T21:19:21.376595Z", - "iopub.status.idle": "2026-08-05T21:19:21.719053Z", - "shell.execute_reply": "2026-08-05T21:19:21.718662Z" + "iopub.execute_input": "2026-08-06T04:56:14.050858Z", + "iopub.status.busy": "2026-08-06T04:56:14.050742Z", + "iopub.status.idle": "2026-08-06T04:56:14.402162Z", + "shell.execute_reply": "2026-08-06T04:56:14.401403Z" } }, "outputs": [ @@ -1649,7 +1649,7 @@ }, { "cell_type": "markdown", - "id": "c459780f", + "id": "ed6353f2", "metadata": {}, "source": [ "One hop each. Close-packed lithium has twelve neighbours and they are all the\n", @@ -1665,13 +1665,13 @@ { "cell_type": "code", "execution_count": 22, - "id": "373c3fe4", + "id": "2e351c6b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:21.719861Z", - "iopub.status.busy": "2026-08-05T21:19:21.719769Z", - "iopub.status.idle": "2026-08-05T21:19:21.732959Z", - "shell.execute_reply": "2026-08-05T21:19:21.732622Z" + "iopub.execute_input": "2026-08-06T04:56:14.403296Z", + "iopub.status.busy": "2026-08-06T04:56:14.403169Z", + "iopub.status.idle": "2026-08-06T04:56:14.420235Z", + "shell.execute_reply": "2026-08-06T04:56:14.419557Z" } }, "outputs": [ @@ -1737,7 +1737,7 @@ }, { "cell_type": "markdown", - "id": "3b3a1a25", + "id": "375a0e8c", "metadata": {}, "source": [ "Stretching *c* separates the twelve neighbours into four in the basal plane at\n", @@ -1762,7 +1762,7 @@ }, { "cell_type": "markdown", - "id": "971dbb17", + "id": "5affa7ab", "metadata": {}, "source": [ "## Before the barrier: can the ion get out at all?\n", @@ -1786,13 +1786,13 @@ { "cell_type": "code", "execution_count": 23, - "id": "034dd91d", + "id": "cb2bd561", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:21.733665Z", - "iopub.status.busy": "2026-08-05T21:19:21.733578Z", - "iopub.status.idle": "2026-08-05T21:19:22.075297Z", - "shell.execute_reply": "2026-08-05T21:19:22.074880Z" + "iopub.execute_input": "2026-08-06T04:56:14.421388Z", + "iopub.status.busy": "2026-08-06T04:56:14.421266Z", + "iopub.status.idle": "2026-08-06T04:56:14.768901Z", + "shell.execute_reply": "2026-08-06T04:56:14.768166Z" } }, "outputs": [ @@ -1883,7 +1883,7 @@ }, { "cell_type": "markdown", - "id": "47d3ddfb", + "id": "ab212b1f", "metadata": {}, "source": [ "**3 against 2**, which is the textbook difference between the two: spinel\n", @@ -1903,13 +1903,13 @@ { "cell_type": "code", "execution_count": 24, - "id": "a9a589a3", + "id": "e370a0cf", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:22.076111Z", - "iopub.status.busy": "2026-08-05T21:19:22.076020Z", - "iopub.status.idle": "2026-08-05T21:19:22.190307Z", - "shell.execute_reply": "2026-08-05T21:19:22.189950Z" + "iopub.execute_input": "2026-08-06T04:56:14.770006Z", + "iopub.status.busy": "2026-08-06T04:56:14.769891Z", + "iopub.status.idle": "2026-08-06T04:56:14.890783Z", + "shell.execute_reply": "2026-08-06T04:56:14.890086Z" } }, "outputs": [ @@ -1992,7 +1992,7 @@ }, { "cell_type": "markdown", - "id": "09e2771b", + "id": "b99d1c2f", "metadata": {}, "source": [ "Allow a 5 Å hop and the layered oxide becomes three-dimensional too, because\n", @@ -2010,7 +2010,7 @@ }, { "cell_type": "markdown", - "id": "0af83e52", + "id": "d05336b4", "metadata": {}, "source": [ "## Handing the hop to DFT\n", @@ -2024,13 +2024,13 @@ { "cell_type": "code", "execution_count": 25, - "id": "5e801a19", + "id": "c4430650", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:22.191057Z", - "iopub.status.busy": "2026-08-05T21:19:22.190967Z", - "iopub.status.idle": "2026-08-05T21:19:22.205561Z", - "shell.execute_reply": "2026-08-05T21:19:22.205201Z" + "iopub.execute_input": "2026-08-06T04:56:14.891906Z", + "iopub.status.busy": "2026-08-06T04:56:14.891792Z", + "iopub.status.idle": "2026-08-06T04:56:14.923694Z", + "shell.execute_reply": "2026-08-06T04:56:14.922924Z" } }, "outputs": [ @@ -2059,7 +2059,7 @@ }, { "cell_type": "markdown", - "id": "e8ff1524", + "id": "f2ed552f", "metadata": {}, "source": [ "Two of those settings are the reason to use a preset rather than write the file\n", @@ -2076,7 +2076,7 @@ }, { "cell_type": "markdown", - "id": "83ac5eef", + "id": "7950b0d5", "metadata": {}, "source": [ "## Finding a defect somebody else made\n", @@ -2093,13 +2093,13 @@ { "cell_type": "code", "execution_count": 26, - "id": "c751951c", + "id": "a51d8ae0", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:22.206330Z", - "iopub.status.busy": "2026-08-05T21:19:22.206178Z", - "iopub.status.idle": "2026-08-05T21:19:22.221006Z", - "shell.execute_reply": "2026-08-05T21:19:22.220663Z" + "iopub.execute_input": "2026-08-06T04:56:14.924773Z", + "iopub.status.busy": "2026-08-06T04:56:14.924659Z", + "iopub.status.idle": "2026-08-06T04:56:14.942314Z", + "shell.execute_reply": "2026-08-06T04:56:14.941855Z" } }, "outputs": [ @@ -2142,7 +2142,7 @@ }, { "cell_type": "markdown", - "id": "73adc817", + "id": "177923bb", "metadata": {}, "source": [ "The vacancy comes back at the coordinates it was made at, from a cell whose\n", @@ -2164,7 +2164,7 @@ }, { "cell_type": "markdown", - "id": "12d533cd", + "id": "d339e194", "metadata": {}, "source": [ "## The curve a charge state leaves behind\n", @@ -2182,13 +2182,13 @@ { "cell_type": "code", "execution_count": 27, - "id": "7f9d420b", + "id": "2aad3053", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:22.221715Z", - "iopub.status.busy": "2026-08-05T21:19:22.221631Z", - "iopub.status.idle": "2026-08-05T21:19:22.229156Z", - "shell.execute_reply": "2026-08-05T21:19:22.228849Z" + "iopub.execute_input": "2026-08-06T04:56:14.943488Z", + "iopub.status.busy": "2026-08-06T04:56:14.943364Z", + "iopub.status.idle": "2026-08-06T04:56:14.953276Z", + "shell.execute_reply": "2026-08-06T04:56:14.952895Z" } }, "outputs": [ @@ -2228,7 +2228,7 @@ }, { "cell_type": "markdown", - "id": "21835963", + "id": "52e027dc", "metadata": {}, "source": [ "The frequency is $\\hbar\\sqrt{c}$ with the mass-weighted units carried\n", @@ -2254,7 +2254,7 @@ }, { "cell_type": "markdown", - "id": "d6c01d40", + "id": "94ea79c5", "metadata": {}, "source": [ "## Is it a killer?\n", @@ -2271,13 +2271,13 @@ { "cell_type": "code", "execution_count": 28, - "id": "1250d074", + "id": "7a50bc0e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:22.229839Z", - "iopub.status.busy": "2026-08-05T21:19:22.229756Z", - "iopub.status.idle": "2026-08-05T21:19:23.943749Z", - "shell.execute_reply": "2026-08-05T21:19:23.943260Z" + "iopub.execute_input": "2026-08-06T04:56:14.954527Z", + "iopub.status.busy": "2026-08-06T04:56:14.954402Z", + "iopub.status.idle": "2026-08-06T04:56:16.709909Z", + "shell.execute_reply": "2026-08-06T04:56:16.709163Z" } }, "outputs": [ @@ -2348,7 +2348,7 @@ }, { "cell_type": "markdown", - "id": "ec4b580c", + "id": "22ba7462", "metadata": {}, "source": [ "Doubling the electron–phonon matrix element multiplies the capture rate by\n", @@ -2362,13 +2362,13 @@ { "cell_type": "code", "execution_count": 29, - "id": "5f1cb8b2", + "id": "d6db6b96", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:23.944798Z", - "iopub.status.busy": "2026-08-05T21:19:23.944640Z", - "iopub.status.idle": "2026-08-05T21:19:29.342153Z", - "shell.execute_reply": "2026-08-05T21:19:29.341623Z" + "iopub.execute_input": "2026-08-06T04:56:16.711105Z", + "iopub.status.busy": "2026-08-06T04:56:16.710988Z", + "iopub.status.idle": "2026-08-06T04:56:23.254490Z", + "shell.execute_reply": "2026-08-06T04:56:23.254029Z" } }, "outputs": [ @@ -2433,7 +2433,7 @@ }, { "cell_type": "markdown", - "id": "daf9f3ac", + "id": "50e130e5", "metadata": {}, "source": [ "Orders of magnitude across a few hundred kelvin, which is why a capture\n", @@ -2457,7 +2457,7 @@ }, { "cell_type": "markdown", - "id": "f0aea9d1", + "id": "445549c5", "metadata": {}, "source": [ "## What the object remembers" @@ -2466,13 +2466,13 @@ { "cell_type": "code", "execution_count": 30, - "id": "96033c73", + "id": "f94e9c68", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:29.343215Z", - "iopub.status.busy": "2026-08-05T21:19:29.343107Z", - "iopub.status.idle": "2026-08-05T21:19:29.345331Z", - "shell.execute_reply": "2026-08-05T21:19:29.344996Z" + "iopub.execute_input": "2026-08-06T04:56:23.255596Z", + "iopub.status.busy": "2026-08-06T04:56:23.255416Z", + "iopub.status.idle": "2026-08-06T04:56:23.257740Z", + "shell.execute_reply": "2026-08-06T04:56:23.257434Z" } }, "outputs": [ @@ -2501,7 +2501,7 @@ }, { "cell_type": "markdown", - "id": "a68ed469", + "id": "0f71afb6", "metadata": {}, "source": [ "```{seealso}\n", diff --git a/matverse_guide/docs/tutorials/disorder.ipynb b/matverse_guide/docs/tutorials/disorder.ipynb index 50794d7..35483f9 100644 --- a/matverse_guide/docs/tutorials/disorder.ipynb +++ b/matverse_guide/docs/tutorials/disorder.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "20f7a31d", + "id": "9422f12b", "metadata": {}, "source": [ "# Disorder\n", @@ -24,13 +24,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "17e7e64c", + "id": "395d38e5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:32.234301Z", - "iopub.status.busy": "2026-08-05T21:35:32.234214Z", - "iopub.status.idle": "2026-08-05T21:35:37.477412Z", - "shell.execute_reply": "2026-08-05T21:35:37.476974Z" + "iopub.execute_input": "2026-08-06T05:17:53.486784Z", + "iopub.status.busy": "2026-08-06T05:17:53.486666Z", + "iopub.status.idle": "2026-08-06T05:18:07.511622Z", + "shell.execute_reply": "2026-08-06T05:18:07.511022Z" } }, "outputs": [ @@ -74,7 +74,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -90,7 +90,7 @@ }, { "cell_type": "markdown", - "id": "f785fb15", + "id": "278eb38c", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -103,13 +103,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "cc691037", + "id": "f6e8bedd", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:37.479152Z", - "iopub.status.busy": "2026-08-05T21:35:37.478647Z", - "iopub.status.idle": "2026-08-05T21:35:37.500448Z", - "shell.execute_reply": "2026-08-05T21:35:37.500106Z" + "iopub.execute_input": "2026-08-06T05:18:07.513119Z", + "iopub.status.busy": "2026-08-06T05:18:07.512649Z", + "iopub.status.idle": "2026-08-06T05:18:07.558953Z", + "shell.execute_reply": "2026-08-06T05:18:07.558544Z" } }, "outputs": [ @@ -196,7 +196,7 @@ }, { "cell_type": "markdown", - "id": "b698674d", + "id": "b2880632", "metadata": {}, "source": [ "Note that `mv.pp.describe` reports a formula for all three — a disordered cell\n", @@ -208,13 +208,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "6b9facb7", + "id": "27902e1c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:37.501374Z", - "iopub.status.busy": "2026-08-05T21:35:37.501280Z", - "iopub.status.idle": "2026-08-05T21:35:37.507374Z", - "shell.execute_reply": "2026-08-05T21:35:37.507041Z" + "iopub.execute_input": "2026-08-06T05:18:07.559964Z", + "iopub.status.busy": "2026-08-06T05:18:07.559780Z", + "iopub.status.idle": "2026-08-06T05:18:07.576710Z", + "shell.execute_reply": "2026-08-06T05:18:07.576282Z" } }, "outputs": [ @@ -305,7 +305,7 @@ }, { "cell_type": "markdown", - "id": "e2394e38", + "id": "a3654e0f", "metadata": {}, "source": [ "`max_site_disorder` is how far the worst site is from having a single owner:\n", @@ -322,13 +322,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "b32498a5", + "id": "f6b96a33", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:37.508117Z", - "iopub.status.busy": "2026-08-05T21:35:37.508024Z", - "iopub.status.idle": "2026-08-05T21:35:37.512390Z", - "shell.execute_reply": "2026-08-05T21:35:37.512077Z" + "iopub.execute_input": "2026-08-06T05:18:07.577636Z", + "iopub.status.busy": "2026-08-06T05:18:07.577517Z", + "iopub.status.idle": "2026-08-06T05:18:07.582604Z", + "shell.execute_reply": "2026-08-06T05:18:07.582265Z" } }, "outputs": [ @@ -404,7 +404,7 @@ }, { "cell_type": "markdown", - "id": "4058979e", + "id": "99a1596c", "metadata": {}, "source": [ "Exact. And the consequence is the interesting part." @@ -413,20 +413,20 @@ { "cell_type": "code", "execution_count": 5, - "id": "53e657bb", + "id": "999a2917", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:37.513253Z", - "iopub.status.busy": "2026-08-05T21:35:37.513155Z", - "iopub.status.idle": "2026-08-05T21:35:37.666655Z", - "shell.execute_reply": "2026-08-05T21:35:37.666171Z" + "iopub.execute_input": "2026-08-06T05:18:07.583400Z", + "iopub.status.busy": "2026-08-06T05:18:07.583285Z", + "iopub.status.idle": "2026-08-06T05:18:07.916820Z", + "shell.execute_reply": "2026-08-06T05:18:07.916461Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 5, @@ -467,7 +467,7 @@ }, { "cell_type": "markdown", - "id": "a41d0e16", + "id": "75dd3ed8", "metadata": {}, "source": [ "At room temperature the entropy term is tens of meV and usually ignorable. At a\n", @@ -496,13 +496,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "61d608c4", + "id": "ba28221d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:37.667598Z", - "iopub.status.busy": "2026-08-05T21:35:37.667498Z", - "iopub.status.idle": "2026-08-05T21:35:38.086024Z", - "shell.execute_reply": "2026-08-05T21:35:38.085646Z" + "iopub.execute_input": "2026-08-06T05:18:07.917885Z", + "iopub.status.busy": "2026-08-06T05:18:07.917780Z", + "iopub.status.idle": "2026-08-06T05:18:08.346783Z", + "shell.execute_reply": "2026-08-06T05:18:08.346381Z" } }, "outputs": [ @@ -622,13 +622,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "0ed85923", + "id": "dd8aa648", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:38.087209Z", - "iopub.status.busy": "2026-08-05T21:35:38.087105Z", - "iopub.status.idle": "2026-08-05T21:35:38.089416Z", - "shell.execute_reply": "2026-08-05T21:35:38.089100Z" + "iopub.execute_input": "2026-08-06T05:18:08.347910Z", + "iopub.status.busy": "2026-08-06T05:18:08.347783Z", + "iopub.status.idle": "2026-08-06T05:18:08.350289Z", + "shell.execute_reply": "2026-08-06T05:18:08.349983Z" } }, "outputs": [ @@ -649,7 +649,7 @@ }, { "cell_type": "markdown", - "id": "7dffe46e", + "id": "7da80198", "metadata": {}, "source": [ "Every cell is now ordered, and the compositions survived: Cu₀.₅Au₀.₅ became\n", @@ -665,13 +665,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "9992b688", + "id": "591b54b0", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:38.090122Z", - "iopub.status.busy": "2026-08-05T21:35:38.090038Z", - "iopub.status.idle": "2026-08-05T21:35:38.092092Z", - "shell.execute_reply": "2026-08-05T21:35:38.091785Z" + "iopub.execute_input": "2026-08-06T05:18:08.351311Z", + "iopub.status.busy": "2026-08-06T05:18:08.351204Z", + "iopub.status.idle": "2026-08-06T05:18:08.353476Z", + "shell.execute_reply": "2026-08-06T05:18:08.353133Z" } }, "outputs": [ @@ -698,7 +698,7 @@ }, { "cell_type": "markdown", - "id": "0c5d036e", + "id": "eabac2c3", "metadata": {}, "source": [ "Arrangements are ranked by **Ewald energy**, which needs oxidation states.\n", @@ -729,13 +729,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "8df0e9c4", + "id": "4d7a0242", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:38.092792Z", - "iopub.status.busy": "2026-08-05T21:35:38.092708Z", - "iopub.status.idle": "2026-08-05T21:35:38.169858Z", - "shell.execute_reply": "2026-08-05T21:35:38.169404Z" + "iopub.execute_input": "2026-08-06T05:18:08.354320Z", + "iopub.status.busy": "2026-08-06T05:18:08.354221Z", + "iopub.status.idle": "2026-08-06T05:18:08.502647Z", + "shell.execute_reply": "2026-08-06T05:18:08.502313Z" } }, "outputs": [ @@ -758,7 +758,7 @@ }, { "cell_type": "markdown", - "id": "2c488281", + "id": "610b760a", "metadata": {}, "source": [ "It needs ATAT's `mcsqs`, a separate Fortran program, and it refuses rather than\n", @@ -776,13 +776,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "5c3f5ffd", + "id": "df5be4c7", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:38.170844Z", - "iopub.status.busy": "2026-08-05T21:35:38.170749Z", - "iopub.status.idle": "2026-08-05T21:35:38.197106Z", - "shell.execute_reply": "2026-08-05T21:35:38.196751Z" + "iopub.execute_input": "2026-08-06T05:18:08.503738Z", + "iopub.status.busy": "2026-08-06T05:18:08.503644Z", + "iopub.status.idle": "2026-08-06T05:18:08.547254Z", + "shell.execute_reply": "2026-08-06T05:18:08.546917Z" } }, "outputs": [ @@ -842,13 +842,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "7c6bae12", + "id": "dea8a479", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:38.197998Z", - "iopub.status.busy": "2026-08-05T21:35:38.197904Z", - "iopub.status.idle": "2026-08-05T21:35:38.200471Z", - "shell.execute_reply": "2026-08-05T21:35:38.200168Z" + "iopub.execute_input": "2026-08-06T05:18:08.548178Z", + "iopub.status.busy": "2026-08-06T05:18:08.548084Z", + "iopub.status.idle": "2026-08-06T05:18:08.559481Z", + "shell.execute_reply": "2026-08-06T05:18:08.559165Z" } }, "outputs": [ @@ -872,7 +872,7 @@ }, { "cell_type": "markdown", - "id": "12f86057", + "id": "b76e441c", "metadata": {}, "source": [ "That message is the point of the function existing at all.\n", @@ -906,13 +906,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "e135e73b", + "id": "72db183a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:38.201387Z", - "iopub.status.busy": "2026-08-05T21:35:38.201300Z", - "iopub.status.idle": "2026-08-05T21:35:38.203079Z", - "shell.execute_reply": "2026-08-05T21:35:38.202766Z" + "iopub.execute_input": "2026-08-06T05:18:08.560327Z", + "iopub.status.busy": "2026-08-06T05:18:08.560234Z", + "iopub.status.idle": "2026-08-06T05:18:08.562020Z", + "shell.execute_reply": "2026-08-06T05:18:08.561752Z" } }, "outputs": [ @@ -933,7 +933,7 @@ }, { "cell_type": "markdown", - "id": "2889ae58", + "id": "99525d43", "metadata": {}, "source": [ "```{seealso}\n", @@ -945,7 +945,7 @@ }, { "cell_type": "markdown", - "id": "cbae4c4a", + "id": "f426fb79", "metadata": {}, "source": [ "## What can this be alloyed with?\n", @@ -962,13 +962,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "1ae6cac3", + "id": "f8086aec", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:38.203773Z", - "iopub.status.busy": "2026-08-05T21:35:38.203687Z", - "iopub.status.idle": "2026-08-05T21:35:38.929429Z", - "shell.execute_reply": "2026-08-05T21:35:38.928985Z" + "iopub.execute_input": "2026-08-06T05:18:08.562814Z", + "iopub.status.busy": "2026-08-06T05:18:08.562730Z", + "iopub.status.idle": "2026-08-06T05:18:10.054125Z", + "shell.execute_reply": "2026-08-06T05:18:10.053628Z" } }, "outputs": [ @@ -1063,7 +1063,7 @@ }, { "cell_type": "markdown", - "id": "9850a535", + "id": "24992a37", "metadata": {}, "source": [ "Three pairs out of four materials, and the missing one is the point. **Silicon\n", @@ -1074,13 +1074,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "a1a83f9c", + "id": "8ca3c834", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:38.930341Z", - "iopub.status.busy": "2026-08-05T21:35:38.930236Z", - "iopub.status.idle": "2026-08-05T21:35:38.932356Z", - "shell.execute_reply": "2026-08-05T21:35:38.932072Z" + "iopub.execute_input": "2026-08-06T05:18:10.055358Z", + "iopub.status.busy": "2026-08-06T05:18:10.055212Z", + "iopub.status.idle": "2026-08-06T05:18:10.057881Z", + "shell.execute_reply": "2026-08-06T05:18:10.057479Z" } }, "outputs": [ @@ -1103,7 +1103,7 @@ }, { "cell_type": "markdown", - "id": "59647ac3", + "id": "a1a25ed5", "metadata": {}, "source": [ "\"Not commensurate\" — there is no species you can swap to get from Si to GaAs\n", @@ -1130,7 +1130,7 @@ }, { "cell_type": "markdown", - "id": "266405df", + "id": "e6c60cd7", "metadata": {}, "source": [ "## Did the disorder work?\n", @@ -1152,13 +1152,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "29a20519", + "id": "33fd2e2c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:38.933096Z", - "iopub.status.busy": "2026-08-05T21:35:38.933011Z", - "iopub.status.idle": "2026-08-05T21:35:39.234056Z", - "shell.execute_reply": "2026-08-05T21:35:39.233676Z" + "iopub.execute_input": "2026-08-06T05:18:10.058915Z", + "iopub.status.busy": "2026-08-06T05:18:10.058798Z", + "iopub.status.idle": "2026-08-06T05:18:10.725396Z", + "shell.execute_reply": "2026-08-06T05:18:10.724756Z" } }, "outputs": [ @@ -1243,7 +1243,7 @@ }, { "cell_type": "markdown", - "id": "c2fe32e2", + "id": "1a76caa3", "metadata": {}, "source": [ "**+1 for the like pairs and −1 for the unlike ones** on B2, which is what\n", @@ -1263,13 +1263,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "5ebcb8cd", + "id": "308f6ea5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:39.234868Z", - "iopub.status.busy": "2026-08-05T21:35:39.234777Z", - "iopub.status.idle": "2026-08-05T21:35:40.312371Z", - "shell.execute_reply": "2026-08-05T21:35:40.311958Z" + "iopub.execute_input": "2026-08-06T05:18:10.727330Z", + "iopub.status.busy": "2026-08-06T05:18:10.727163Z", + "iopub.status.idle": "2026-08-06T05:18:11.614256Z", + "shell.execute_reply": "2026-08-06T05:18:11.610895Z" } }, "outputs": [ @@ -1352,7 +1352,7 @@ }, { "cell_type": "markdown", - "id": "685b471f", + "id": "134b52aa", "metadata": {}, "source": [ "The sign **inverts** between the first shell and the second. In bcc the eight\n", @@ -1375,7 +1375,7 @@ }, { "cell_type": "markdown", - "id": "9eb06e8a", + "id": "fb06af8a", "metadata": {}, "source": [ "## An effective Hamiltonian, and what it buys\n", @@ -1397,13 +1397,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "d1b693da", + "id": "33e0a5f5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:40.313262Z", - "iopub.status.busy": "2026-08-05T21:35:40.313167Z", - "iopub.status.idle": "2026-08-05T21:35:42.286960Z", - "shell.execute_reply": "2026-08-05T21:35:42.286469Z" + "iopub.execute_input": "2026-08-06T05:18:11.615525Z", + "iopub.status.busy": "2026-08-06T05:18:11.615421Z", + "iopub.status.idle": "2026-08-06T05:18:19.889315Z", + "shell.execute_reply": "2026-08-06T05:18:19.888288Z" } }, "outputs": [ @@ -1454,7 +1454,7 @@ }, { "cell_type": "markdown", - "id": "190ed62b", + "id": "a3f436c5", "metadata": {}, "source": [ "The number that says whether a cluster expansion is any good is the\n", @@ -1474,13 +1474,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "8035ba60", + "id": "80354ec6", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:42.288347Z", - "iopub.status.busy": "2026-08-05T21:35:42.287903Z", - "iopub.status.idle": "2026-08-05T21:36:24.543136Z", - "shell.execute_reply": "2026-08-05T21:36:24.542320Z" + "iopub.execute_input": "2026-08-06T05:18:19.891533Z", + "iopub.status.busy": "2026-08-06T05:18:19.890612Z", + "iopub.status.idle": "2026-08-06T05:19:42.614386Z", + "shell.execute_reply": "2026-08-06T05:19:42.613585Z" } }, "outputs": [ @@ -1518,7 +1518,7 @@ }, { "cell_type": "markdown", - "id": "59e05233", + "id": "1c9598db", "metadata": {}, "source": [ "A heat capacity that is flat everywhere except one sharp peak, and the peak is\n", diff --git a/matverse_guide/docs/tutorials/dynamics.ipynb b/matverse_guide/docs/tutorials/dynamics.ipynb index 3b3fc40..501b4e0 100644 --- a/matverse_guide/docs/tutorials/dynamics.ipynb +++ b/matverse_guide/docs/tutorials/dynamics.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "68c89927", + "id": "474be3dc", "metadata": {}, "source": [ "# Dynamics\n", @@ -23,13 +23,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "af356943", + "id": "98dac5af", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:41.506657Z", - "iopub.status.busy": "2026-08-05T21:19:41.506580Z", - "iopub.status.idle": "2026-08-05T21:19:46.747056Z", - "shell.execute_reply": "2026-08-05T21:19:46.746606Z" + "iopub.execute_input": "2026-08-06T04:56:36.558758Z", + "iopub.status.busy": "2026-08-06T04:56:36.558670Z", + "iopub.status.idle": "2026-08-06T04:56:49.063219Z", + "shell.execute_reply": "2026-08-06T04:56:49.062789Z" } }, "outputs": [ @@ -73,7 +73,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -89,7 +89,7 @@ }, { "cell_type": "markdown", - "id": "10ca724b", + "id": "10d59896", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -102,13 +102,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "3baae380", + "id": "b59d2be5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:46.748423Z", - "iopub.status.busy": "2026-08-05T21:19:46.748012Z", - "iopub.status.idle": "2026-08-05T21:19:46.764406Z", - "shell.execute_reply": "2026-08-05T21:19:46.763923Z" + "iopub.execute_input": "2026-08-06T04:56:49.064685Z", + "iopub.status.busy": "2026-08-06T04:56:49.064251Z", + "iopub.status.idle": "2026-08-06T04:56:49.103743Z", + "shell.execute_reply": "2026-08-06T04:56:49.103126Z" } }, "outputs": [ @@ -170,7 +170,7 @@ }, { "cell_type": "markdown", - "id": "c5dcd398", + "id": "52b53eda", "metadata": {}, "source": [ "## Running\n", @@ -182,13 +182,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "7ba38733", + "id": "59bed1b1", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:46.765290Z", - "iopub.status.busy": "2026-08-05T21:19:46.765187Z", - "iopub.status.idle": "2026-08-05T21:19:53.655029Z", - "shell.execute_reply": "2026-08-05T21:19:53.654384Z" + "iopub.execute_input": "2026-08-06T04:56:49.104805Z", + "iopub.status.busy": "2026-08-06T04:56:49.104698Z", + "iopub.status.idle": "2026-08-06T04:56:56.689299Z", + "shell.execute_reply": "2026-08-06T04:56:56.688690Z" } }, "outputs": [ @@ -253,7 +253,7 @@ }, { "cell_type": "markdown", - "id": "b37947c8", + "id": "7804464e", "metadata": {}, "source": [ "`md_temperature_emt` is the temperature the run actually achieved, and it is\n", @@ -278,13 +278,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "e0d41c7d", + "id": "15593444", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:53.656176Z", - "iopub.status.busy": "2026-08-05T21:19:53.656051Z", - "iopub.status.idle": "2026-08-05T21:19:53.658641Z", - "shell.execute_reply": "2026-08-05T21:19:53.658325Z" + "iopub.execute_input": "2026-08-06T04:56:56.691150Z", + "iopub.status.busy": "2026-08-06T04:56:56.690921Z", + "iopub.status.idle": "2026-08-06T04:56:56.693639Z", + "shell.execute_reply": "2026-08-06T04:56:56.693327Z" } }, "outputs": [ @@ -307,20 +307,20 @@ { "cell_type": "code", "execution_count": 5, - "id": "2ede9703", + "id": "666375c5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:53.659349Z", - "iopub.status.busy": "2026-08-05T21:19:53.659259Z", - "iopub.status.idle": "2026-08-05T21:19:53.825689Z", - "shell.execute_reply": "2026-08-05T21:19:53.825328Z" + "iopub.execute_input": "2026-08-06T04:56:56.695127Z", + "iopub.status.busy": "2026-08-06T04:56:56.694942Z", + "iopub.status.idle": "2026-08-06T04:56:57.044626Z", + "shell.execute_reply": "2026-08-06T04:56:57.043861Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 5, @@ -361,7 +361,7 @@ }, { "cell_type": "markdown", - "id": "acc54c55", + "id": "6cd8f80b", "metadata": {}, "source": [ "The instantaneous temperature swings wildly around its mean, and that is\n", @@ -382,13 +382,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "9ab1ac28", + "id": "7cb992f9", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:53.826553Z", - "iopub.status.busy": "2026-08-05T21:19:53.826443Z", - "iopub.status.idle": "2026-08-05T21:20:43.318311Z", - "shell.execute_reply": "2026-08-05T21:20:43.305431Z" + "iopub.execute_input": "2026-08-06T04:56:57.046029Z", + "iopub.status.busy": "2026-08-06T04:56:57.045881Z", + "iopub.status.idle": "2026-08-06T04:58:20.032018Z", + "shell.execute_reply": "2026-08-06T04:58:20.031457Z" } }, "outputs": [ @@ -465,13 +465,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "3b1c5859", + "id": "31784a52", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:20:43.319616Z", - "iopub.status.busy": "2026-08-05T21:20:43.319470Z", - "iopub.status.idle": "2026-08-05T21:20:43.546009Z", - "shell.execute_reply": "2026-08-05T21:20:43.545591Z" + "iopub.execute_input": "2026-08-06T04:58:20.035828Z", + "iopub.status.busy": "2026-08-06T04:58:20.035598Z", + "iopub.status.idle": "2026-08-06T04:58:20.237686Z", + "shell.execute_reply": "2026-08-06T04:58:20.237142Z" } }, "outputs": [ @@ -514,7 +514,7 @@ }, { "cell_type": "markdown", - "id": "62225a85", + "id": "8d6becab", "metadata": {}, "source": [ "A percent or so over 600 K, which is the right order for a metal — copper's\n", @@ -535,13 +535,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "a9a9fc41", + "id": "bcafdc97", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:20:43.546810Z", - "iopub.status.busy": "2026-08-05T21:20:43.546708Z", - "iopub.status.idle": "2026-08-05T21:20:55.232625Z", - "shell.execute_reply": "2026-08-05T21:20:55.231961Z" + "iopub.execute_input": "2026-08-06T04:58:20.239301Z", + "iopub.status.busy": "2026-08-06T04:58:20.239115Z", + "iopub.status.idle": "2026-08-06T04:58:27.782139Z", + "shell.execute_reply": "2026-08-06T04:58:27.781154Z" } }, "outputs": [ @@ -602,7 +602,7 @@ }, { "cell_type": "markdown", - "id": "961f87ce", + "id": "ae048c04", "metadata": {}, "source": [ "Essentially zero, and that is the right answer. Copper at 300 K has a vacancy\n", @@ -630,13 +630,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "fb77b3ef", + "id": "0bddf540", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:20:55.233938Z", - "iopub.status.busy": "2026-08-05T21:20:55.233788Z", - "iopub.status.idle": "2026-08-05T21:20:55.500645Z", - "shell.execute_reply": "2026-08-05T21:20:55.500077Z" + "iopub.execute_input": "2026-08-06T04:58:27.783767Z", + "iopub.status.busy": "2026-08-06T04:58:27.783589Z", + "iopub.status.idle": "2026-08-06T04:58:28.096482Z", + "shell.execute_reply": "2026-08-06T04:58:28.095660Z" } }, "outputs": [ @@ -657,7 +657,7 @@ }, { "cell_type": "markdown", - "id": "0ec817f2", + "id": "e88d78b0", "metadata": {}, "source": [ "Empty in this build, because the engine is not installed. Registering one is the\n", @@ -668,13 +668,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "02550b60", + "id": "e5d1c1e3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:20:55.501875Z", - "iopub.status.busy": "2026-08-05T21:20:55.501738Z", - "iopub.status.idle": "2026-08-05T21:20:55.504929Z", - "shell.execute_reply": "2026-08-05T21:20:55.504517Z" + "iopub.execute_input": "2026-08-06T04:58:28.097701Z", + "iopub.status.busy": "2026-08-06T04:58:28.097571Z", + "iopub.status.idle": "2026-08-06T04:58:28.101771Z", + "shell.execute_reply": "2026-08-06T04:58:28.101143Z" } }, "outputs": [ @@ -709,7 +709,7 @@ }, { "cell_type": "markdown", - "id": "79f1181d", + "id": "b950d15c", "metadata": {}, "source": [ "The factory is lazy, which is why that cell runs in an environment without\n", @@ -732,13 +732,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "dfc8843c", + "id": "0ee7cd2b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:20:55.506012Z", - "iopub.status.busy": "2026-08-05T21:20:55.505900Z", - "iopub.status.idle": "2026-08-05T21:21:49.909845Z", - "shell.execute_reply": "2026-08-05T21:21:49.909291Z" + "iopub.execute_input": "2026-08-06T04:58:28.102855Z", + "iopub.status.busy": "2026-08-06T04:58:28.102731Z", + "iopub.status.idle": "2026-08-06T04:59:16.794733Z", + "shell.execute_reply": "2026-08-06T04:59:16.794004Z" } }, "outputs": [ @@ -798,13 +798,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "fa29d044", + "id": "05991727", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:21:49.923008Z", - "iopub.status.busy": "2026-08-05T21:21:49.922733Z", - "iopub.status.idle": "2026-08-05T21:21:49.925699Z", - "shell.execute_reply": "2026-08-05T21:21:49.925247Z" + "iopub.execute_input": "2026-08-06T04:59:16.796360Z", + "iopub.status.busy": "2026-08-06T04:59:16.796155Z", + "iopub.status.idle": "2026-08-06T04:59:16.801820Z", + "shell.execute_reply": "2026-08-06T04:59:16.801375Z" } }, "outputs": [ @@ -825,7 +825,7 @@ }, { "cell_type": "markdown", - "id": "15a1bfdd", + "id": "1771b667", "metadata": {}, "source": [ "```{warning}\n", @@ -844,13 +844,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "685811ea", + "id": "b07f8f0c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:21:49.927053Z", - "iopub.status.busy": "2026-08-05T21:21:49.926937Z", - "iopub.status.idle": "2026-08-05T21:21:49.929462Z", - "shell.execute_reply": "2026-08-05T21:21:49.929019Z" + "iopub.execute_input": "2026-08-06T04:59:16.803039Z", + "iopub.status.busy": "2026-08-06T04:59:16.802882Z", + "iopub.status.idle": "2026-08-06T04:59:16.805061Z", + "shell.execute_reply": "2026-08-06T04:59:16.804694Z" } }, "outputs": [ @@ -871,7 +871,7 @@ }, { "cell_type": "markdown", - "id": "9d3b0325", + "id": "a314f726", "metadata": {}, "source": [ "## Was it actually amorphous?\n", @@ -884,20 +884,20 @@ { "cell_type": "code", "execution_count": 14, - "id": "40abf45a", + "id": "50ad7eed", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:21:49.930478Z", - "iopub.status.busy": "2026-08-05T21:21:49.930365Z", - "iopub.status.idle": "2026-08-05T21:21:50.847974Z", - "shell.execute_reply": "2026-08-05T21:21:50.846405Z" + "iopub.execute_input": "2026-08-06T04:59:16.806584Z", + "iopub.status.busy": "2026-08-06T04:59:16.806433Z", + "iopub.status.idle": "2026-08-06T04:59:17.756471Z", + "shell.execute_reply": "2026-08-06T04:59:17.743276Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 14, @@ -938,7 +938,7 @@ }, { "cell_type": "markdown", - "id": "8722dbab", + "id": "f7cab951", "metadata": {}, "source": [ "The crystal's shells stay sharp out to 8 Å. The quenched structure keeps its\n", @@ -947,19 +947,103 @@ "beyond it. Short-range order without long-range order is the definition of a\n", "glass, and this is what it looks like as a measurement.\n", "\n", - "## What the object remembers" + "### What a diffractometer would actually see\n", + "\n", + "g(r) is not what a total-scattering experiment reports. `mv.prop.scattering`\n", + "applies the two standard transforms — the structure factor S(q) and the reduced\n", + "pair distribution function G(r) — so a quenched structure made here can be\n", + "compared against a measured one." ] }, { "cell_type": "code", "execution_count": 15, - "id": "672d05a5", + "id": "4456297a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:21:50.849480Z", - "iopub.status.busy": "2026-08-05T21:21:50.849335Z", - "iopub.status.idle": "2026-08-05T21:21:50.854058Z", - "shell.execute_reply": "2026-08-05T21:21:50.852663Z" + "iopub.execute_input": "2026-08-06T04:59:17.757945Z", + "iopub.status.busy": "2026-08-06T04:59:17.757769Z", + "iopub.status.idle": "2026-08-06T04:59:18.000925Z", + "shell.execute_reply": "2026-08-06T04:59:18.000425Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAACI8AAALwCAYAAAAUS8frAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvctoD+AAAAAlwSFlzAAAewgAAHsIBbtB1PgABAABJREFUeJzs3Xd8FHX+x/H3pveENHoNvYmCVAELKrbD3pVT4fTUn/3snnr282ynZ0UURbEh9gpKl460QCAJLUB678nu/v7YZLKBlE2ym90kr+fjkcdjNvud73x3ZndnZ+Yzn4/JarVaBQAAAAAAAAAAAAAAgA7Jy90DAAAAAAAAAAAAAAAAgPsQPAIAAAAAAAAAAAAAANCBETwCAAAAAAAAAAAAAADQgRE8AgAAAAAAAAAAAAAA0IERPAIAAAAAAAAAAAAAANCBETwCAAAAAAAAAAAAAADQgRE8AgAAAAAAAAAAAAAA0IERPAIAAAAAAAAAAAAAANCBETwCAAAAAAAAAAAAAADQgRE8AgAAAAAAAAAAAAAA0IERPAIAAAAAAAAAAAAAANCBETwCAAAAAAAAAAAAAADQgRE8AgAAAAAAAAAAAAAA0IERPAIAAAAAAAAAAAAAANCBETwCAAAAAAAAAAAAAADQgRE8AgAAAAAAAAAAAAAA0IERPAIAAAAAAAAAAAAAANCBETwCAAAAAAAAAAAAAADQgRE8AgAAAAAAAAAAAAAA0IERPAIAAACHpaWl6cEHH9To0aMVHh4uLy8vmUwmmUwmrVmzxt3DAwAAAADU45577jGO31577TV3D6fN6Wjr77XXXjNe7z333OPu4TjEkW3UFl9XYxx5Tffff7/R5j//+U8rj9C12uM2BQB38XH3AAAAANA27Ny5U6eccorS0tLcPRQAAAAAAAAAAOBEZB4BAKCDWLlypRGFf/LJJ7t7OG7Demi+WbNmtfnAkYCAAGP7V1ZWuns4AAAAAACgHXr22WeN8w8PP/ywu4fTZrDeAMC9CB4BAABAoxITE7V69WpJkpeXl15//XWlpqbKYrHIarXKarVq/Pjxbh4lAAAAAAAAAABoDsrWAAAAoFGbNm0ypqdPn66///3vbhwNAAAAAABwpVtvvVW33nqru4fhdO3xdbXH19QUHf31A4AzkXkEAAAAjcrMzDSm+/fv78aRAAAAAAAAAAAAZyN4BAAAAI0qLy83pn19fd04EgAAAAAAAAAA4GwEjwAA0Ib88MMPuvbaazVs2DCFh4fL19dXMTExGjJkiE455RT985//1OrVq2U2m4153nzzTZlMJk2ePNn437Jly2QymY75OzqjxHfffWc8d/7550uSKioq9N577+nss89W7969FRAQIJPJpKVLlxrzPfbYY8Z8zz77bKOv65NPPjHa//Wvf3VoXaxcuVK33367TjjhBMXGxsrPz0+xsbEaOXKkLr74Ys2dO1dpaWlOWQ+ueD3NXbf29uzZo4cfflgTJkxQ165d5efnp8jISI0aNUp33XWXdu3a1ehYG/LTTz8ZY7zzzjuN/7/wwgvHrLPXXnut1ry5ubn64Ycf9MADD+i0007T0KFDFR0dLT8/P8XExGjMmDG6++67lZCQ0ORx7du3T4899pimTp2q7t27KyAgQBERERo8eLDOOOMM/fvf/1Z8fLzRPjEx0RhnWVmZ8X9fX986t/++ffvqXK7VatWXX36pq666SnFxcQoNDVVQUJB69+6tCy+8UO+//74qKioaHHtpaamxnJCQEOP/ixcv1syZMzVgwACFhobKZDLp4YcfbvK6AQAAANA6xowZY/y2//PPPyVJO3bs0D333KORI0cqKipKJpNJJ598cp3zV1ZW6uOPP9aVV16p/v37KywsTAEBAerZs6dmzJih9957r9HjC3srVqzQNddcYxxLxsbGaty4cfr3v/+tnJwch/uZNm2a8bpWrlzZaPtbb73VaD9nzpxG25vNZn3++ef661//qsGDBysyMlL+/v7q0aOHxowZo1mzZumrr75SUVFRg/146vpz1P3332+st//85z+SpNTUVD3++OM64YQTFBUVpcDAQMXFxWn27NnavHlzo31arVZt375db7zxhq666iqNGTNGvXv3VlBQkEJCQtSnTx9ddNFFDh27StJrr71mjPGee+5x+HVkZmbq+eef16RJk9S1a1f5+PjIZDKpsrKyCWvoWM7aRo68LkkqKyvT3LlzNWPGDPXt21chISHy8/NT165dNXLkSJ177rl66aWXtHPnzlrzXX311TKZTHrggQeM/z311FN1nn84+pxRc9eno6/paC19zznz+6Il662prz8lJUWPPvqoJk6cqC5duhjnqkaPHq1//OMfx2zTutS1rfLz8/Xiiy9qwoQJio2Nlb+/v7p3766LL75Yv/zyS6N9AoAn8HH3AAAAQOOysrJ0ySWX6Pfffz/muczMTGVmZmrXrl1aunSpnnjiCS1atMgISHCmpKQkXXLJJXUeQFqtVqcvry4HDx7UzJkz61wXGRkZysjI0LZt27Rw4UKNHj1aGzZsaJVxtVRT1m15ebnuuusuvfXWW8ecfMnJyVFOTo62bNmi//73v7rrrrv07LPPysurdWOGL774Yi1ZsqTO56rfsxs3btTLL7+se++9V08//bRMJlODfZaVlenuu++u83WXlZUpLy9PCQkJ+vXXX3XfffcpJydHERERTnk9SUlJuvTSS7Vp06Zjnjtw4IAOHDigRYsW6cknn9Qnn3yiMWPGONRvaWmpbrjhBn388cfHPNdanykAAAAALffcc8/pkUceOeaifF2/61etWqW//vWvSkxMPOa5lJQUpaSk6JtvvtHTTz+thQsXauTIkfUu12w265ZbbtFbb71V6//Vx8fr1q3Tq6++qs8//7yZr8x5Vq5cqeuuu67O133o0CEdOnRIGzdu1Lvvvqvbb79dL7/8cp39tMf199NPP+nqq69WVlZWrf8nJycrOTlZ7733nh588EH961//qrePVatW1bph5mhFRUXav3+/vvzySz311FP66quvNGzYMKe9Bkn69ddfdc0119S6madac49x3bGNtmzZogsuuEB79+495rnU1FSlpqZq27Zt+v7773XXXXcpIyND0dHRTlt+NVesz2rOeM+1Rc8++6wef/xxlZaW1vp/9bmqTZs26aWXXtKtt96qF154Qd7e3g71u3btWl122WXav39/rf8fPnxYCxcu1MKFC3XTTTfp9ddfb/T8FwC4E5lHAABoA6644oo6gyVaU15ens4555x67zywWCwuH8OOHTs0evRot68LZ2vKui0tLdXpp5+u//3vf43etWM2m/X888/r+uuvd+p4nclisejZZ5/Vfffd12C74uJinXzyyQ69bmfbs2ePJkyYUGfgyNGSkpI0depUrVq1yqG+Z8+eXWfgiNQ6nykAAAAALffWW2/p/vvvrzObw9G/67/66iudeuqpdQY+HC0xMVGTJk3Stm3b6m1zww03HHNR/WgpKSk699xz682y2Bo+/fRTh193Q9rj+tuyZYsuuuiiYy7i2zObzXriiSeclqEyMTFRU6ZMUUpKilP6k2oCLuoKdJCaf4zb2tsoLy9PZ511Vp2BI63JVeuzuu/Wfs95gjvuuEMPPPDAMYEjRzObzXrllVd0ySWXOBSks2PHDk2fPv2YwJGjvfnmm/rf//7XpDEDQGsjeAQAAA+3fft2/frrr8bjv/71r1q2bJkyMzNVWVmpvLw87d69W8uXL9eTTz6piRMnysenJrnYTTfdJKvVqhUrVhj/mzp1qqxW6zF/DZ18Wbp0qRISEhQZGannnntOu3btUklJiTHvaaed5poVUCU/P18zZsxQRkaG8b/p06dr0aJFOnTokMrKypSRkaGtW7dq4cKFuv7669WlSxejrbPWgys0Zd3eeuutWr58uSTJ29tbM2fO1C+//KL09HRVVFQoJydHv/32my655BJjnnnz5umjjz5q8rimT59ujOGll14y/n/33Xcfs85uvfXWWvNGRkbqwgsv1Ouvv641a9YoKSlJ+fn5Ki8v18GDB/XFF1/USt/8n//8x0j1XJcbbrhBa9asMR4PGTJEb731lnbv3q3i4mLl5+cbWUfuvfdeDR061LiTo3///sY4/f39jT4qKirq3P59+vQx2pjNZl1xxRW13neXX365VqxYofz8fBUVFWnjxo26+eabjbtRiouLdcUVVygvL6/B9VtUVKT58+fL29tbN998s9asWaO8vDxjHM8880yD8wMAAADwDG+++aYk2zHUTz/9pMzMTFkslmOOQXft2qVrrrlG5eXlkmzHKq+99pp27typoqIilZWVKTExUa+++qpxPFtYWKhLL720Vnnaap9//rnmzZtnPB4yZIgWLFig1NRUlZWVae/evXr55ZcVFRWlrKwsLVy40JWroV5btmzRddddZwTX+Pr66m9/+5t+++03ZWZmqry8XIcPHzayjpx//vm1ynxWa6/rb/78+SouLlbPnj01Z84cpaSkqKysTAcPHtTbb7+t7t27G22feeaZesuDeHl5adSoUbrnnnv0/fffa+vWrTpy5IjKy8uVn5+vjRs36pFHHlFYWJgkKTs7W7fddptTX0dRUZEGDRqkefPm6eDBg7WOu+2Pxx3ljm20YMECHTlyRJIUGBioRx99VJs2bVJeXp4qKyuVmZmpHTt26Mcff9Tdd9+tIUOG1MokMX/+/GOO6R966KE6zz+8//779Y7DFevTvm9nvOecyVnrrT5ff/21XnnlFeNxt27d9Prrr2v//v0qKytTamqq5s+fr4EDBxptFi1aVOt8WH3ef/995ebmasSIEZo/f75SUlJUXl6u9PR0zZ8/X926dTPaPvnkk00qqQUArc4KAAA82ieffGKVZJVkvfTSS5vdz4oVK4x+pk6d6tA83377rTGPJGvnzp2tSUlJjc736KOPGvM888wzjbZfsGCB0X7mzJl1tnn88ceNNiaTyfr222879BqO1pz14IrX05x1u3nzZqN9UFCQ9ffff2+w/SuvvGK0HzRoUKPjbshLL71k9HX33Xe3qC97t9xyi9Hv7Nmz62yzevXqWuvq2muvtZaVlTVref7+/kY/FRUVjbb//PPPay37xRdfrLftZ599ZjWZTA2+V0pKSmr1ZzKZrIsWLWrWawEAAADgPqNHj6712/4f//hHo/PMmDHDaH/BBRdYS0tL622bnp5uHTRokNH+448/PqbNkCFDjOcnTpxoLSgoqLOvxMREa5cuXWqN99VXX62z7WmnnWa0WbFiRaOvyf6Y7p133qmzzemnn260iYiIsP7xxx+N9luXtrD+HHXffffV6m/w4MHW9PT0OtumpqZaBwwYYLQ97bTTWrTshIQEa6dOnaySrF5eXtYDBw7U2e7VV19t9DzA0a9j8uTJ1sLCwhaNz54rtlFjr+vWW281nv/vf//b7LE/88wzRj8PPfSQQ/M0d302Z1s54z3niu+L5qw3R17/8OHDjTYDBw60HjlypM52+fn51vHjxxttIyMjrUVFRce0O3p9nnfeefV+JyUkJFgDAgKMto2dzwMAdyLzCAAAHs7+ToLOnTu7cSTSSy+9pH79+rX6cq1Wa620jnfccYdmz57d6uNwJUfWrf0dEo899litzB11ue222zR+/HhJUkJCgnbs2NHicTrb888/r9DQUEnS4sWL62zz3//+15g+4YQTNGfOHPn5+bXK+ObOnWtMn3nmmbrzzjvrbXvJJZdo1qxZxuN333230f6vu+46nX/++S0aIwAAAAD3GjJkSKOZA/ft26dvvvlGkhQbG6sPP/ywwcwBMTExevnll43HX375Za3n161bp507d0qSfHx8NH/+/DqzdUhSXFycXn31VUdeitNVZ4is9u677xrHqU3R3tff3LlzFRMTU+dznTt31pw5c4zHS5Ys0YEDB5q9rIEDB+quu+6SZCt94qzSwN7e3vrggw8UHBzslP7ctY085Tycs9fn0VrzPedu69at0/bt243H8+bNq5Wt2F5oaKgWLFhgnHfKzs7WokWLGuw/PDxc8+bNq/c7aeDAgbXO/ThSFhkA3IXgEQAAPNxJJ52kgIAASdI777yjN954Q/n5+a0+jtDQ0FqlUFrTli1blJ6eLsl28PzAAw+4ZRyu4ui6tQ+uuOaaaxzq+/TTTzem161b1/TBuVhgYKAGDx4sSdq7d+8x722r1aolS5YYj++77z75+vq2ytgsFotWr15tPHYkna99cEliYqKR6rY+119/ffMHCAAAAMAjzJw50yhjWZ/FixfLarVKki688EKHLgifdtpp8vKyncI/+njOvhzO9OnT1bdv3wb7uvDCC9W1a9dGl+ls9oEjQ4YM0YUXXtisftrz+hs1apQmTJjQYJspU6Zo+PDhxuNVq1a1aJknnHCCMd1QCdmmOOWUU2qVgW0pd22jadOmGdPVJYDcUWbE2evTnjvec+5k/1468cQTGw1g69OnT61gj+ry0fU599xz1alTpwbbjB492pi2L40MAJ6G4BEAADxcdHS0nn/+eZlMJpWWlurmm29WVFSUxo0bp5tvvllz5szR7t27XT6OESNGyMfHx+XLqYt9xozjjjuu3jsj2ipH1m1mZqZSUlKMxz169JCPj498fHzk7e1t/Hl5ecnLy0smk0kmk0lPPPGEMU91AE5rMZvN+uabbzRr1iyNGTNGMTExCggIMMZW/bd+/XpjnqysrFp9pKen1zqotg+GcbW0tDTl5eUZj0866aRG5xkyZIiio6ONxwkJCQ22tz9hBwAAAKBtcuR3vf0F+rfffts4nrM/pqs+nqs+pvPz85PFYpF07PHcrl27jOlJkyY1unwvL69GLxa7gv3xfEuO59rz+nNk+ZI0ceJEY9p+/Efbt2+fnn32WZ111lnq27evwsLC5O3tXes4/JxzzjHaH30c3lzOPr511zaaPn26Lr/8cknSwYMHde655yoyMlLTpk3Tvffeq88++0xpaWktXk5jXHm+wNnvOU9nf9508uTJDs1j366xczuDBg1qtL/w8HBjurCw0KExAIA7uOcKEAAAaJJbb71VQ4YM0b/+9S+tWLFClZWVWrduXa07ZwYNGqTZs2fr5ptvVmBgoNPHEBkZ6fQ+HWV/IqNHjx5uG4erOLJuMzMzaz02m81NXk5rHpxu2bJFV155peLj45s0X0FBQa3H9ts+KCio0Ts5nCk7O9uYDg4OVlhYmEPzdevWzdhe9n0cLSAgwCWfVQAAAACtq6nHdNUBDU1RWloqs9lsZDjJyckxnnM024I7Mo8463i+Pa+/5iy/rmNNi8Wihx56SC+88EKTMmUcfRzeXM4+b+TObfTxxx/r1FNP1QsvvKCEhAQVFhZqyZIlRmZUk8mkSZMm6bbbbtPFF18sk8nklOXac+V5OGe959oK+7E7+tq7d+9e5/x1ceTcjv17pDqLEgB4IjKPAADQRpx22mlatmyZUlJStGDBAt15552aNGmSUU8zISFB99xzj44//ngdPHjQ6ctvLAWvK9kfVLnigNzdHFm3lZWVLV5Oax2c7t+/X1OnTm1y4Ih07ElAd257Vy/bnZ8pAAAAAM7TVo7p3HHB0lnHVR11/dW3/LrW5d13361nn322ySVWmhOMUxdPOMZ11jYymUyaPXu2du3apfj4eL399tuaPXu2RowYIZPJJKvVqpUrV+rSSy/VjBkzVF5e7pTl2vO09dmWz8e1l9cBAK2B4BEAANqYbt266fLLL9eLL76olStXKjs7W1988YWGDRsmyRZEcu2117p1jE2Npi8uLm7wefsyIK4IjGmMs19Pc9ivg8DAQFksFlmt1ib9Pfnkk04fV10effRRo9xLSEiI7rnnHv38889KTk5Wfn6+ysvLa42roVqz9q+7qKio1p1HrhYVFWVMFxYWOnw31pEjR4xpd2bsAQAAAOA57I9tnn322SYfz1mt1lrlTu2zMtofgzQkNTW10TaeejzfVtZfczRn+Udn5UxOTtZ///tf4/GkSZP07rvvatOmTUpNTVVpaWmt8wg//fSTcwbvQp6yjYYMGaLZs2fr7bff1tatW5WWlqZXX33VOGfw7bff1ioZ3BY44z0necb5MkfYn985fPiwQ/PYt+PcDoCOhOARAADauKCgIF100UX67bffFBwcLElaunSpDhw4UKtda0bWBwUFGdPVQQQNsa89Wpfhw4cb01u2bFFGRkazx9ac9eDs19McsbGxxsFuSUmJNm7c6PRlOMv3339fa/r555/XGWecob59+yo0NFS+vr612jd0AjE2NlaxsbHG419//bVFY2vK9u/cuXOtmrQrVqxodJ5du3bVen86UvcWAAAAQPs3dOhQY9qRY4vGDB482JhetWpVo+0tFov++OOPRtu58nh+8eLFjfZXn7ay/prDkeVL0urVq41p+/FL0o8//mhkEJk2bZqWL1+u66+/Xscff7w6d+4sf3//WsfD7rgxp6k8aRvZi4mJ0a233qqPP/7Y+N+8efOOaefJGS6c8Z6TXHO+zBXrbeDAgca0o98f9u04twOgIyF4BACAdiI2NrbWwVBycnKt56vL20hySTrNo8dSrbEgh/Lycn366acNthk5cqQ6d+4sSTKbzXrmmWeaPbbmrAdnv57m8PLy0umnn248fvbZZ52+DGeoqKgwalEHBwdrypQpDbZfunSpDh06VO/zJpNJp512mvH4ueeea1G64qZsfy8vL02aNMl4/NprrzXa/yuvvGJM9+/f3y01xQEAAAB4njPPPNOY/umnn7Rly5YW9XfSSSfV6m/v3r0Ntv/yyy8dyjbQlOPfPXv2aM2aNQ22sT+OjY+P15dfftnoGOrSVtZfc/z555+NrscVK1Zo+/btxmP7Y1WpdpaEM888U15eDV/6+eijj5ox0tblSduoLvbjO3jw4DHlglrzPFxTOeM9Jzn/+0JyzXqzPze1fv16rVu3rsH2Bw4c0FdffVXn/ADQ3hE8AgCAh3vppZf0n//8RyUlJQ22S0lJ0a5du4zHYWFhtZ63Ty+ZlJTk0lq9o0ePNqZ/++03bdiwoc52FotFt9xyi/bt29dgfyaTSbfeeqvx+OWXX9acOXOaNbbmrAdnv57muuOOO4zphQsX6uGHH3aoNvGvv/6qa665xiVjOpqvr69xoF9UVNTgCb29e/fquuuua7TP2267zZjetGmTbrjhhmafQLDf/omJiY22tx/fjz/+qFdffbXetl9++aXeeust4/GsWbOaNUYAAAAA7c+gQYN01llnSbLdFHH++ecrISGh0fmys7N177336rvvvqv1/3HjxhmZACorK3X11VerqKiozj6Sk5NrHVc1xP749+2331Zubm6d7fLy8nTVVVfJbDY32N/AgQNrBX7MmjXLoQvIR2sr66+5rrvuunqzrKalpemGG24wHp966qnq1atXrTYhISHGdGNZJR5//HEtXbq0+YNtJe7aRjfddJMWLlzY6Pki+0w6gYGBx2RZber5h9bW0vec5PzvC8k16+3EE0+slQVp5syZSk9Pr7NtYWGhrrzySpWVlUmylay54IILnDIOAGgLCB4BAMDDZWVl6R//+Ie6deumm2++WV999ZUOHjyosrIyFRQUaPfu3XrllVc0adIkI8AkJiZGI0eOrNVP3759jbI26enpevjhh5WSkuLQgVtTDR8+3EjpaLFYNH36dM2ZM0dpaWmqrKxUenq6Fi1apMmTJzscBHL77berf//+kmx1VGfPnq1zzjlHX3/9tY4cOaKKigplZWVpx44d+vLLLzVr1iydd955x/TTnPXgitfTHOPGjdP1119vPH7qqac0evRovfXWW4qPj1dRUZEqKyuVkZGhlStX6umnn9awYcN0xhlnaPPmzS4b19EmTJhgTJ955pl65ZVXlJycrNLSUhUVFWnz5s365z//qVGjRjkUaDN+/HhdddVVxuMPPvhAxx9/vN555x0lJSWptLRUhYWF2rNnj5YsWaL7779fw4cPrzNlqv3Jgvvvv187duxoMBDlggsuqHUy5LbbbtPVV1+t1atXq7CwUCUlJdq8ebP+7//+T5deeqlxcqlnz5666aabGn1tAAAAADqO//znP8ZF/n379um4447TzTffrMWLFys9PV2VlZUqLCxUYmKiFixYoGuuuUbdu3fX888/r9LS0mP6e/TRR43p1atX68QTT9Snn36qjIwMVVRUaP/+/frvf/+rcePGOZyRYcaMGfLx8ZFky2YxZcoUfffdd8rLyzP6fPvttzVq1CitX7/eoT7//e9/KzAwUJKUk5OjqVOn6qabbtLSpUuVnZ2tiooKpaamavPmzZo7d64uvPBCPfLII21y/TXXrl27NGbMGM2dO9c4x3Ho0CHNmTNHY8aM0Z49eyTZbq6xH3e1iRMnGtNfffWVLr74Yi1dulSZmZmqrKzUkSNHtHDhQp188sl67LHHXPpanMkd22jXrl26+OKL1a9fPz3yyCP67bfflJaWZpx32rRpkx588EFdccUVxjz2GVOr2Z9/+P777/XRRx8pOzvbpTdzNUVL33OSa74vXLXennjiCWN6165dGj16tN5++22lpKSooqJC6enp+vjjj3XiiSfWCsB66KGHapXnAYB2zwoAADzaQw89ZJXUpL/333+/zr4uv/zyBueLi4ur1f7bb781npsxY0aTxv3pp586NFZ/f3/r3//+d+PxzJkz6+1z+/bt1piYGIfXw+jRo52yHlzxepq7bsvKyqxnnnlmk98Tw4YNc3gZdXnppZeMvu6+++4G2/74448Oj2vChAnW0aNHG483b95cZ59FRUXW8ePHN+k15+TkHNPPnDlzGp1v7969tebZvXu3NTo62uHlBgUFWVeuXFnn6ygpKTHaBQcHO7LqAQAAAHggR45j6vLDDz9Yg4KCmnxM9/nnn9fZ39VXX+3Q/FFRUdaLLrrIePzqq6/WO8b/+7//c6jPXr16WS+88ELj8TvvvFNvn5988onV19fX4dd7++23t9n154j77rvP6Ouqq66yBgYGOjSO+++/v87+LBaLdcKECQ714eXlZb3llluMx/Wdk3j11VeNNvWdB7B/Hc8//3yL1kl9nL2NGntdU6dObdJ7KzAw0Lpt27Zj+jGbzdZevXo1OO/R54yauz6buq2c8Z6r5uzvi+asN0dev9Vqtd5+++1N2rbnn3++1WKxNLo+HdlW77zzjtH+lltuabQ9ALgLmUcAAPBwd999t+6///5aKUjrExoaqjlz5mjmzJl1Pv/000/XqkfqSpdeeqn++c9/NtgmOjpaixYtcrh26LBhw7RhwwZNnjy5RWNrznpwxetpDj8/P33//fd69NFHHb7z4eyzz9bHH3/ssjEdbfr06XrxxRfl7e3dYLvTTz9d33zzjQICAhrtMygoSL///rtuvPHGRvttyMyZM5u8fQYMGKA1a9bo+OOPb7RtXFycli1bVmctYAAAAAA466yztHbtWo0ZM8ah9jExMXrhhRfqzKwpSe+9916jJTO7deumb775Rn369HFomc8995zOPffcBtuMGDFCv/76q7p27epQn5dddpl+/fVX9e3b16H29WkL66+pRo0apYULFyoyMrLeNl5eXnrggQf0zDPP1Pm8yWTSF198UStrQ11CQ0P1/vvv6/zzz2/JkFtVa2+jd955R1deeaVD5x769OmjxYsX17nevby89L///e+YcjaewBnvuWrO/r5w5Xp7+eWX9fTTTxvlluvj7e2t2267TZ9//rlMJpPTxwEAnozgEQAAPFynTp30zDPP6MiRI3r33Xd10UUXqVevXvL391dAQIC6d++uM844Q88//7wSExNr1SQ9Wt++fbV161Y9/PDDGjt2rDp16mSkl3SFxx9/XKtXr9aVV16pnj17yt/fXxERERo1apQee+wxbd++3ahZ7KhevXpp+fLlWrJkiW688UYNGzZMnTp1kq+vr7p06aKRI0fqkksu0dy5c/X999/X2Udz14MrXk9zeHt7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8Eh9mUckqVtEzY7mEKVrAAAAAAAAAAAAgFaz41CeMT28oeCR8Jpreql5ZfW2A9o7gkdcrLS0VDNmzNDixYslSX/729/09ttvNymww8fHRzNnzpQkbd++XV9//XWd7Z588kmjPMoNN9zQwpGjPrUyj4T41duua1XmEUk6kkfwCAAAAAAAAAAAANBatjkaPGJXaYDMI+jICB5xobKyMl1wwQX69ddfJUk33nij3nzzzWZlBHnooYcUExMjSbr++uv1yy+/GM9VVFTomWee0bvvvitJmjFjhk455RQnvALUJbPQwbI1dplHDuexowEAAAAAtA1Wq1WVlZVN+jObze4eNgAAAADUsv1QviTJyyQN7RpWb7su9plHCB5BB+bj7gG0Zy+//LJ++uknSZK3t7f27Nmj008/vcF5Zs2apcsvv/yY/0dGRurbb7/V6aefruzsbJ155pmKi4tTly5dlJCQoMzMTEnSqFGjNG/ePOe/GBgyC8qN6YbL1tRkHjlM2RoAAAAAQBuxbNmyJt+U0rt3b+3bt6/e5ysrK/X2229rwYIFio+PV15enmJjYzVx4kTdeOONjZ4vAQAAAICmKK0wa3dagSSpf2yIAv28623bOawmeCSd4BF0YASPuFBJSU3AgNls1m+//dboPNOmTav3uXHjxmnr1q2699579c033ygpKUlJSUmSpNjYWM2aNUuPPPKIAgIC6u0DLZfhYOaRWmVrCB4BAAAAALQRJpNJ3t71n1itZrVaZbFYJEkDBw6st116erqmT5+uzZs31/r/kSNHtHDhQi1cuFA33XSTXn/99WZlawUAAACAo+1OK1ClxSqp4ZI1Uu3gETKPoCMjeMSFrr32Wp100klNmmfAgAENPt+nTx999tlnKiwsVHJysnGnTv/+/R06sYOWyyyoCR5pOPMIZWsAAAAAAG3P1KlTVVlZ2Wi7K664Qp988okkWybVulRWVuqcc87R5s2bZTKZdP/99+vmm29W586dtWPHDj344IP68ccf9eabbyoqKkpPPvmkU18LAAAAgI5p26E8Y3p4t4aDR2JC/WUySVarlJpf1mBboD0jeMSF+vXrp379+rmk75CQEI0cOdIlfaNh1ZlHgvy8Fexf/0coyM9HEUG+yi2uoGwNAAAAAKBdyc7O1qJFiyRJ0dHROv/88+ts99Zbb2nDhg2SpCeffFIPPvig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anz11VfYvXs3mpqa0NPTA51Oh7y8PFRXV2P8+PGYN28ejj76aMydO5eL3ZR0Ho2HR8LfWLsAAI02N6xVg3+BbLS7EYjMV+PIGiIiIiIiIhqsL7/8Evfffz8A4K9//SusVuuQHr9v3z55e/To0f3uK3583759mD179qCfp6Ghod+PNzc3D/pYRERaII7AKFBgQbyAzSOUomxCaEPpsTVALLDS7Q3AHwzBZOD92unE4w/io+1tAMLjvRaMLT5kn1mjCuTtzU0MjyRDXPOIWdFl7SEpYHgkTrKbR3KyjKgttqC+y43d7b2QJIl5ggRR5Cr74osv8Oyzz+KVV15Ba2vrYfdra2vDnj17sHr1ajz33HMAgIqKClx44YW46qqrsGDBAiVOlzKQNxALj1g0GB6JNo8A4fDItKrBv2G3p6NX3h7L8AgREREREZFm7d27t98bbcaNG6fYuXg8Hlx11VUIBAK48sorccYZZwz5GN3dsTvA8vLy+tkTyM+PzawWHzcYtbW1QzsxIiKNExedlLjLWmxsYPMIpRJxXEyhKuGR2HM63H6U5nFkfDr5ZFcHen3htaMTp1XA2Ec4aHJlHox6HQIhCVsaObYmGVJlbI34WsrwyMHNI4kPjwDA2JJc1He50eMNwObyozhX+deBdJS08IgkSXjllVfwhz/8AWvXrh32cVpbW/HYY4/hsccew/z58/GjH/0IF110EdNDlFBun7abR0YJ31gb7e5+9jzU9pbYm24Ty/p/s46IiIiIiIiU09LSgn//+99YsWIFVq9eDZvN1u/+xcXFOProo3H66afjm9/8JiorK5N2bj//+c+xdetWVFRU4KGHHhrWMTwej7ydldX/G3nZ2bHFFrd7aL/3EhGlm+iik0GvQ25W8t+rLIobW8MFL0od4terKmNr4oJXDI+km7e3tMjbp87o++fubKMBkyvyUdfsxM62brh9QVgU+L6dSZweZQOVwxXX4sXXUrl5JNuoR1mSvjfWFsfG4RzocjE8kiBJCY+sWLECd911FzZt2hT395WVlVi4cCEWLlyII488EmVlZSgpKUFJSQlCoRC6urrQ1dWFtrY2rFu3DmvWrMGaNWvktpIvvvgCl1xyCX7729/igQcewOmnn56M06cM5PGH5G2zSXvVcjWFww+PbG2OpV2H0lhCREREREREiSdJEt566y08+uijePvt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ocvlwh/+8Ae8+OKL2LFjB0KhELKysrB48WLccMMN+Na3vpXsT4mISLOcGmseiWtPSNO7pSk1aX1sjXhONgavNK3JoVzziE6nQ01RDra3dqPR5kYoJEGvZ4D6cGy9YkgslZtHYkvw6do80uLQbnhEDIU12RnaGgr2nlJGE8fWmI1sHiEiIiIiIiICgMsvvxxfffWV/Ge9Xo/CwkI4HA709PTg448/xscff4yHHnoI//3vf/tti92/fz9OPPFE7N69Wz5WQUEBHA4HVq5ciZUrV+K1117Diy++yBE9RJSRnO6AvG21qP998ODRG0RaofVxFvGtPenZNJAumiOLydlGPYpzk/+1VFtswfbWbviCIbR1e1GZ5MBKKos2j1hMhpSeGFCYAS1erd1eeVtrY2viwiNsHhkSVi1QRouOrcky6pn0JCIiIiIiIoqYOXMmfvrTn2LFihWor6+H1+uFzWaD1+vFV199hcsvvxwAsHv3bpx55plwufqe3+71enHaaadh9+7dMJlM+OMf/4ju7m7Y7XbU19fjsssuAwC88soruP322xX7/IiItES8I9mqgeaRggyo2qfUFDfOQoPhkbjmkd70XCxOF9ExFlUFZkXGKNYU5cjbDba+f26msGhrjxZHUw2F2CSWrs0jrUIoo9yareKZHCpubA2bR4aE4RHKaN5AeGyN2chLgYiIiIiIiCjqmWeewe9+9zucdtppqKmpkRtBTCYTjjzySDz//PO49tprAQB79uzB8uXL+zzOww8/jG3btgEA/vSnP+H2229HTk74zfOamhq88MILOO200wAAjz32GL7++utkf2pERJrj9IQXlfQ6IC9L/eYRccGLozdIS8SvR6tZ/WvlYGLTgI3NI5rl9PjR4w03PlUVWAbYOzFqimLPU8/wyGFJkiS39mixXWgoCjKgxavVGQuPaK15xGwyyK1CzWweGRKumFNG8/jDzSOpXH1FREREREREpIZoawgAbN26tc99HnvsMQBAbW0tbrrppj73+d3vfgcACIVCePLJJxN8lkRE2ueM3JGcbzZpoh05y6hHXnZ4YZ6jN0hLonfvW81GGA3aW94qilss5rWjVS3CQnJVoTIL3nHNI11sQTicbm8AgZAEAIqME0omMYjpTNPmkRYhPFKhsfAIEGsfaXF6EIx8XdHAtPfqSqSgaHjEksXwCBEREREREdFQ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/aheffXVVC8zaRyGYRipXgQA+7nuuuv07W9/e9yfRQMknZ2dCgQCkiKfxPnv//5vffzjH0/FMpHBtmzZolWrVpmfsJakH/7wh/rXf/3XFK4KmSAYDOqzn/2sfvWrXyn6a1JeXp7Ky8vV29uroaEhSdJFF12ku+66K5VLhY1961vf0ne/+13zMeZwOFRdXa2enh6Njo6a551++um67777VFRUlKqlIk397ne/06WXXjruz/Ly8sw31R966CGdffbZ07qu/fv368wzzzTfbHK73aqoqFBnZ6cZGjnxxBP18MMP81jMQv/6r/+qG264wfza4XAoNzfX/B2stbX1oJ+8/8lPfqIvfvGL4/4sPz9fpaWl6uzsNF/3cnJy9J//+Z/6whe+EN8fAkgThmHo4x//uG655RZJkedTZWWlBgYGzOdUVVWVHn74Ya1atSqVS8WYxsZG7du3z/za+m/taaedpscffzxFK8NErrrqKv3iF78Y92dFRUUqLCxUR0eH+XtNcXGxbr31Vl144YWpWCbeYvny5XrjjTfMr3Nzc1VWVqauri7z/UVJmjdvnh588EEtXbo0FcvENFxyySX6/e9/b35dUlIy40/hIzE2bNhg/m5RWVk5ZfPfeeedpxtvvDFZS8NBGIaha665Rj/+8Y/NDxh5vV6Vl5ebTfCSdNZZZ+lvf/tbKpea9W644YZpPXfa29vN3/1vvPFGXX311YleGqawf/9+vetd79KLL75o/pnX61VxcbH2799vvnfrcrl0ww036POf/3yqlpo0NI8AOCzLly/XjTfeqJ07d2pwcFAtLS3q6+vTLbfcorKyMvl8Pl155ZV68MEHU71UZJBgMKjLLrtMPp9Pxx57bKqXgwxiGIYuuugi/fKXv5RhGLr44ov18ssva3h4WM3NzRocHNS2bdv0ve99T0cccUSqlwubuvfee/Wd73xHhmGopqZGv/vd7+Tz+dTW1qaRkRE988wzOvnkkyVJjz32mL70pS+leMVIRyUlJXr3u9+t6667Tvfff7/a29t1/fXXz/h6wuGwLrjgAr3++utyOp26/vrr1dvbq7a2NnV1denf/u3fJEXamD70oQ/F+8eADdTX1+sDH/iAfvCDH+if//ynent79b73ve+Qrmvx4sX6r//6L23dulVDQ0Pat2+f+vv7deedd6qmpkaBQEBf/OIXdeedd8b5pwDSw7e//W0zOHLBBReoqalJHR0dGhwc1O9//3sVFRVp//79Ouecc2ggSROrVq3Spz71Kf3qV7/Shg0b1N/fzwgNGzjuuOP061//Ws3Nzerv71dLS4t6enr005/+VPn5+erv79dFF12kF154IdVLhSL313e+8x09/vjj6uzslM/nU2trq3w+n1577TVddtllkqRdu3bpvPPOG/chIqSPe+65R7///e9VWVnJqJo0d+ONN6qpqWnS/xEcSS8f+9jHdMMNNygcDuv888/Xs88+q+HhYfO/pXbu3Kkf/ehHNP2kgS9/+ctTPreampq0detWc8Sw1+vVJZdckuJV48orrzSDI+985zu1YcMGDQ8Pq729XUNDQ/rFL36h8vJyhUIhffGLX9S6detSvOIkMADgENx2223G3XffPeU5zz77rOFyuQxJxooVK5K0MmSD66+/3pBkHHHEEcbdd99tSDIkGT/84Q9TvTTY3E9/+lPz8XT99denejnIUGeffbb5OHvssccmPGdkZMSYPXu2Icnwer3G8PBwchcJW/rhD39oPrYeeuihaV3m1ltvNS/zzW9+c8JzrrrqKvOcBx54IJ5Lhk195CMfMR8Tra2tBz3/j3/8o3H77bcb4XB40nM2btxo5ObmGpKM2bNnT3kuYEe7d+82H+Nr1qwxgsHgAefcd9995nPrc5/7XApWiemIvs9x2mmnpXopeIsbb7zReOSRR6Y8569//av5PHvHO96RpJXhcF1xxRXm/Xaw9yORfO3t7UZVVZUhybjjjjuMo446ypBklJSUpHppGPPKK6+Yz6E777wz1cvBNN12223m/falL30p1ctBHNxxxx3mfXrJJZekejlZr7W11XA4HIYkY8mSJcbIyMiE5z344IPm/XbZZZcleZXJR/MIgENy2WWXHfQThyeccILe/va3S5Jef/11tba2JmNpyHCvvPKKvvOd78jpdOo3v/mNcnNzU70kZIiBgQF94xvfkCStXbvWPAbibdeuXZIiFdqnnXbahOd4vV69853vlCT5fD61tLQkbX3ILv/7v/8rKVLfHm0ZeavrrrtOHo9n3PnATLz//e/XJZdcIofDMek5y5Yt03ve8x5J0p49e7Rly5YkrQ5Ijptvvll+v1+SdP3110/YXnH++efr+OOPlyTdcsstfLoemKGrr75a73jHO6Y859xzz9VRRx0l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cOCAsW9gYKAefvhh47HHH39cgwcPltVq1bJly3ThwgVVrFixUMdt0aKFtmzZIknatm0bxSMAANwgF7MDAAAAFIePPvpI+/btkySVKVNGkyZNUmJiolauXKklS5Zo//792rRpk6pVq6b9+/c77Lz2hRt33XVXofe7dOmSsdyNi4uLevbsmeNx+2KSBQsWKCMj4yaTFg8/Pz9VrVpVknTo0CGHdjUBAAAAAABFk5aWpt9++02tW7fWwYMHtXPnTn377bdauHChFi5cKD8/vyIf80bnPuwvmunZs6fKlClj3C5fvrw6dOgg6b/dYgurfv36xvauXbsKvR8AAMiJ4hEAAFAqTZ061dieMGGCRo4cKVfXnE3XHnjgAa1du1Y+Pj4OO298fLyxXdgrZCTpq6++MgotWrdurSpVquR4vEmTJqpXr54k6fTp00Yr1+IQHR1tTCKdOnVKkrR7927jvri4uHz3z37eNptNx48fL7acAAAAAACgYA0aNNDKlStVp04dhxzvRuY+MjMz9fnnnxu3/9pxVcpauiabfaFJQewz2GcDAABFQ/EIAAAodQ4dOmRMFgQHB+vFF1/Mc2zdunX1/PPPO+zc58+fN7aLUjxiPyliP1liz35ipSiTKEU1ZswY9e3bV3379tXOnTslSV9++aVxX2RkZL772z/vP/74o9hyAgAAAACAgr3++uvy8vJy2PFuZO5j7dq1OnHihCQpKChIDz744HVj/va3v8nb21tS1tI4Bw4cKNSxmYcAAMAxXAseAgAAcHv55ZdfjO2OHTte13Hkr7p06aIPP/zQIee2X6alfPnyhdrnyJEjxtq8rq6uCg8Pz3Vc3759NXbsWEnS0qVLdenSpRtqL1uQDh065Hs1UmhoaL772z/vP//801GxAAAAAADADWjXrp1Dj5c99+Hh4SFPT89C7WN/EUyvXr1ksViuG+Pj46POnTtr0aJFxj7jx48v8NjMQwAA4BgUjwAAgFLH/iqTWrVqFTi+du3aDju3u7u7sZ2cnFyofebNm2dsP/LII/L39891XP369XXvvfdqz549Sk1N1ddff62BAwfeXOBcjBs37qb2t3/e9n8fAAAAAADg1nJzc1NgYKBDj+nu7i6r1aq0tDRdu3atwIt2rly5om+//da4nduSNdn69OljFI98/vnnGjdunFxc8m+izzwEAACOQfEIAAAo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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "image/png": { + "height": 376, + "width": 1095 + } + }, + "output_type": "display_data" + } + ], + "source": [ + "mv.prop.scattering(copper, level=\"amorphous\", source=\"amorphous_emt\",\n", + " q_max=12.0)\n", + "\n", + "q = mv.grid_of(copper, \"structure_factor\")\n", + "fig, axes = plt.subplots(1, 2, figsize=(11, 3.8))\n", + "axes[0].plot(q, copper.obsm[\"structure_factor_amorphous\"][0], linewidth=1.0)\n", + "axes[0].axhline(1.0, linestyle=\"--\", color=\"#888\", linewidth=0.8)\n", + "axes[0].set_xlabel(\"q (Å⁻¹)\"); axes[0].set_ylabel(\"S(q)\")\n", + "axes[0].set_title(\"structure factor\")\n", + "\n", + "r_pdf = mv.grid_of(copper, \"pdf\")\n", + "axes[1].plot(r_pdf, copper.obsm[\"pdf_amorphous\"][0], linewidth=1.0)\n", + "axes[1].axhline(0.0, linestyle=\"--\", color=\"#888\", linewidth=0.8)\n", + "axes[1].set_xlabel(\"r (Å)\"); axes[1].set_ylabel(\"G(r)\")\n", + "axes[1].set_title(\"reduced pair distribution\")\n", + "fig.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "id": "21d3fc7d", + "metadata": {}, + "source": [ + "Both are definitions rather than models:\n", + "\n", + "$$S(q) = 1 + \\frac{4\\pi\\rho}{q}\\int r\\,[g(r)-1]\\,\\sin(qr)\\,\\mathrm{d}r\n", + "\\qquad G(r) = 4\\pi r \\rho\\,[g(r)-1]$$\n", + "\n", + "which makes them checkable. For an ideal gas, g = 1 everywhere and S(q) comes\n", + "back as 1.000000 at every q; for a hard-sphere exclusion the transform has a\n", + "closed form and this reproduces it.\n", + "\n", + "```{warning}\n", + "**This is a technique for disordered matter, and applying it to a crystal\n", + "produces nonsense.** A crystal's g(r) never decays to one, so truncating it at\n", + "`r_max` and transforming produces termination ripple larger than any real peak\n", + "— on the four textbook structures in `mv.datasets` the apparent \"first peak\" of\n", + "S(q) is entirely ripple. `mv.prop.xrd` is the function for a crystalline\n", + "diffraction pattern.\n", + "\n", + "The accuracy also follows the r grid `mv.prop.rdf` produced, linearly: against\n", + "the hard-sphere closed form the error is 0.24 at a step of 0.10 Å, 0.12 at 0.05,\n", + "and 0.012 at 0.005. The default is fine for a shape and coarse for a comparison\n", + "against a measurement.\n", + "```\n", + "\n", + "## What the object remembers" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "9bad3256", + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-06T04:59:18.001896Z", + "iopub.status.busy": "2026-08-06T04:59:18.001794Z", + "iopub.status.idle": "2026-08-06T04:59:18.004041Z", + "shell.execute_reply": "2026-08-06T04:59:18.003666Z" } }, "outputs": [ @@ -974,7 +1058,8 @@ "md.run(level='emt', source='input', temperature=300.0, steps=2000, ensemble='nvt')\n", "md.conductivity(species='Cu', charge=1.0, level='emt', temperature=296.84706071763)\n", "md.melt_quench(level='emt', source='input', melt_temperature=2500.0, fixed_volume_quench=True)\n", - "prop.rdf(source='amorphous_emt', level='amorphous', r_max=8.0, sigma=0.1)\n" + "prop.rdf(source='amorphous_emt', level='amorphous', r_max=8.0, sigma=0.1)\n", + "prop.scattering(level='amorphous', quantity='rdf', q_max=12.0)\n" ] } ], @@ -985,7 +1070,7 @@ }, { "cell_type": "markdown", - "id": "6da60d48", + "id": "832765da", "metadata": {}, "source": [ "Every temperature, every step count, every thermostat setting. For MD that is\n", @@ -1001,7 +1086,7 @@ }, { "cell_type": "markdown", - "id": "1a590f0b", + "id": "59a7e184", "metadata": {}, "source": [ "## Where the atoms spend their time\n", @@ -1020,14 +1105,14 @@ }, { "cell_type": "code", - "execution_count": 16, - "id": "5635452f", + "execution_count": 17, + "id": "88dc9645", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:21:50.855221Z", - "iopub.status.busy": "2026-08-05T21:21:50.855094Z", - "iopub.status.idle": "2026-08-05T21:21:50.916856Z", - "shell.execute_reply": "2026-08-05T21:21:50.915467Z" + "iopub.execute_input": "2026-08-06T04:59:18.004789Z", + "iopub.status.busy": "2026-08-06T04:59:18.004701Z", + "iopub.status.idle": "2026-08-06T04:59:18.026071Z", + "shell.execute_reply": "2026-08-06T04:59:18.025702Z" } }, "outputs": [ @@ -1073,7 +1158,7 @@ "0 LiCl3 2.96 11.692" ] }, - "execution_count": 16, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -1101,7 +1186,7 @@ }, { "cell_type": "markdown", - "id": "445a8687", + "id": "94e12751", "metadata": {}, "source": [ "The first peak lands at 2.96 Å against a nearest-neighbour distance of 2.97, and\n", @@ -1120,7 +1205,7 @@ }, { "cell_type": "markdown", - "id": "e54cecb2", + "id": "b0fc1628", "metadata": {}, "source": [ "## How much of the cell do they visit?\n", @@ -1136,14 +1221,14 @@ }, { "cell_type": "code", - "execution_count": 17, - "id": "04b760a9", + "execution_count": 18, + "id": "3f5b0a5d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:21:50.918094Z", - "iopub.status.busy": "2026-08-05T21:21:50.917963Z", - "iopub.status.idle": "2026-08-05T21:21:50.989108Z", - "shell.execute_reply": "2026-08-05T21:21:50.988574Z" + "iopub.execute_input": "2026-08-06T04:59:18.027067Z", + "iopub.status.busy": "2026-08-06T04:59:18.026956Z", + "iopub.status.idle": "2026-08-06T04:59:18.043535Z", + "shell.execute_reply": "2026-08-06T04:59:18.043262Z" } }, "outputs": [ @@ -1220,7 +1305,7 @@ "occupancy_entropy_liquid 0.9977" ] }, - "execution_count": 17, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -1247,7 +1332,7 @@ }, { "cell_type": "markdown", - "id": "18bf76a5", + "id": "565b198a", "metadata": {}, "source": [ "Monotonic, from four ions pinned in four voxels to a liquid that has forgotten\n", @@ -1265,14 +1350,14 @@ }, { "cell_type": "code", - "execution_count": 18, - "id": "c92d9cda", + "execution_count": 19, + "id": "f29e44b1", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:21:50.990152Z", - "iopub.status.busy": "2026-08-05T21:21:50.990029Z", - "iopub.status.idle": "2026-08-05T21:21:50.994700Z", - "shell.execute_reply": "2026-08-05T21:21:50.994267Z" + "iopub.execute_input": "2026-08-06T04:59:18.044532Z", + "iopub.status.busy": "2026-08-06T04:59:18.044375Z", + "iopub.status.idle": "2026-08-06T04:59:18.048103Z", + "shell.execute_reply": "2026-08-06T04:59:18.047836Z" } }, "outputs": [ @@ -1303,7 +1388,7 @@ }, { "cell_type": "markdown", - "id": "c508b7ed", + "id": "052a42d3", "metadata": {}, "source": [ "0.87 became 0.03 with no change to the physics. That is why the function warns\n", @@ -1317,7 +1402,7 @@ }, { "cell_type": "markdown", - "id": "bd5585fa", + "id": "eb2bf729", "metadata": {}, "source": [ "## The shape of the motion\n", @@ -1333,14 +1418,14 @@ }, { "cell_type": "code", - "execution_count": 19, - "id": "d29ccd57", + "execution_count": 20, + "id": "4713c252", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:21:50.995624Z", - "iopub.status.busy": "2026-08-05T21:21:50.995516Z", - "iopub.status.idle": "2026-08-05T21:21:52.376639Z", - "shell.execute_reply": "2026-08-05T21:21:52.376155Z" + "iopub.execute_input": "2026-08-06T04:59:18.048971Z", + "iopub.status.busy": "2026-08-06T04:59:18.048812Z", + "iopub.status.idle": "2026-08-06T04:59:18.790670Z", + "shell.execute_reply": "2026-08-06T04:59:18.788446Z" } }, "outputs": [ @@ -1381,7 +1466,7 @@ }, { "cell_type": "markdown", - "id": "4f00bacf", + "id": "c42a2562", "metadata": {}, "source": [ "Twelve, eighteen, fifty-four — the neighbour counts of a rocksalt lattice,\n", @@ -1398,14 +1483,14 @@ }, { "cell_type": "code", - "execution_count": 20, - "id": "1c0efce4", + "execution_count": 21, + "id": "259f89e5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:21:52.378023Z", - "iopub.status.busy": "2026-08-05T21:21:52.377843Z", - "iopub.status.idle": "2026-08-05T21:21:54.880439Z", - "shell.execute_reply": "2026-08-05T21:21:54.879663Z" + "iopub.execute_input": "2026-08-06T04:59:18.799782Z", + "iopub.status.busy": "2026-08-06T04:59:18.799637Z", + "iopub.status.idle": "2026-08-06T04:59:20.922886Z", + "shell.execute_reply": "2026-08-06T04:59:20.922148Z" } }, "outputs": [ @@ -1460,7 +1545,7 @@ "0 0.781 0.28 3.02 " ] }, - "execution_count": 20, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -1485,7 +1570,7 @@ }, { "cell_type": "markdown", - "id": "a35d36be", + "id": "b234386c", "metadata": {}, "source": [ "Two things to read.\n", @@ -1509,7 +1594,7 @@ }, { "cell_type": "markdown", - "id": "dc739b98", + "id": "f2876ce2", "metadata": {}, "source": [ "## Rattling or hopping?\n", @@ -1527,14 +1612,14 @@ }, { "cell_type": "code", - "execution_count": 21, - "id": "bf1a0edd", + "execution_count": 22, + "id": "8858bfc1", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:21:54.881619Z", - "iopub.status.busy": "2026-08-05T21:21:54.881495Z", - "iopub.status.idle": "2026-08-05T21:21:54.910237Z", - "shell.execute_reply": "2026-08-05T21:21:54.909950Z" + "iopub.execute_input": "2026-08-06T04:59:20.924535Z", + "iopub.status.busy": "2026-08-06T04:59:20.924319Z", + "iopub.status.idle": "2026-08-06T04:59:20.953461Z", + "shell.execute_reply": "2026-08-06T04:59:20.953082Z" } }, "outputs": [ @@ -1589,7 +1674,7 @@ "0 4 0.086 1.25 " ] }, - "execution_count": 21, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -1627,7 +1712,7 @@ }, { "cell_type": "markdown", - "id": "6a341574", + "id": "6c13c2fe", "metadata": {}, "source": [ "The vibration amplitude is unchanged between the two runs, because it *is*\n", diff --git a/matverse_guide/docs/tutorials/from_pymatgen.ipynb b/matverse_guide/docs/tutorials/from_pymatgen.ipynb index 01f152a..c1532a5 100644 --- a/matverse_guide/docs/tutorials/from_pymatgen.ipynb +++ b/matverse_guide/docs/tutorials/from_pymatgen.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "0378a752", + "id": "229804f2", "metadata": {}, "source": [ "# Coming from pymatgen\n", @@ -36,13 +36,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "49e82fba", + "id": "b4298ebe", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:28.600729Z", - "iopub.status.busy": "2026-08-05T21:36:28.600631Z", - "iopub.status.idle": "2026-08-05T21:36:37.492369Z", - "shell.execute_reply": "2026-08-05T21:36:37.491878Z" + "iopub.execute_input": "2026-08-06T05:19:46.773006Z", + "iopub.status.busy": "2026-08-06T05:19:46.772921Z", + "iopub.status.idle": "2026-08-06T05:19:56.163116Z", + "shell.execute_reply": "2026-08-06T05:19:56.162569Z" } }, "outputs": [ @@ -86,7 +86,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -102,7 +102,7 @@ }, { "cell_type": "markdown", - "id": "52d67162", + "id": "441ca2bb", "metadata": {}, "source": [ "## Every transformation, by name\n", @@ -115,13 +115,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "40ca9859", + "id": "ee7a4c37", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:37.493645Z", - "iopub.status.busy": "2026-08-05T21:36:37.493277Z", - "iopub.status.idle": "2026-08-05T21:36:38.143268Z", - "shell.execute_reply": "2026-08-05T21:36:38.142745Z" + "iopub.execute_input": "2026-08-06T05:19:56.164639Z", + "iopub.status.busy": "2026-08-06T05:19:56.164105Z", + "iopub.status.idle": "2026-08-06T05:19:56.842952Z", + "shell.execute_reply": "2026-08-06T05:19:56.842621Z" } }, "outputs": [ @@ -144,13 +144,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "37bb9832", + "id": "1c8be972", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.144541Z", - "iopub.status.busy": "2026-08-05T21:36:38.144032Z", - "iopub.status.idle": "2026-08-05T21:36:38.151983Z", - "shell.execute_reply": "2026-08-05T21:36:38.151698Z" + "iopub.execute_input": "2026-08-06T05:19:56.844302Z", + "iopub.status.busy": "2026-08-06T05:19:56.843908Z", + "iopub.status.idle": "2026-08-06T05:19:56.851107Z", + "shell.execute_reply": "2026-08-06T05:19:56.850808Z" } }, "outputs": [ @@ -301,7 +301,7 @@ }, { "cell_type": "markdown", - "id": "1b3b962f", + "id": "0f9b94c2", "metadata": {}, "source": [ "Read from pymatgen at call time rather than from a table here, so a\n", @@ -313,13 +313,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "01bd6acb", + "id": "4127bbff", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.152739Z", - "iopub.status.busy": "2026-08-05T21:36:38.152597Z", - "iopub.status.idle": "2026-08-05T21:36:38.155971Z", - "shell.execute_reply": "2026-08-05T21:36:38.155728Z" + "iopub.execute_input": "2026-08-06T05:19:56.851991Z", + "iopub.status.busy": "2026-08-06T05:19:56.851903Z", + "iopub.status.idle": "2026-08-06T05:19:56.860454Z", + "shell.execute_reply": "2026-08-06T05:19:56.860170Z" } }, "outputs": [ @@ -340,7 +340,7 @@ }, { "cell_type": "markdown", - "id": "e7cbf552", + "id": "12b057b8", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -351,13 +351,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "0e0e3332", + "id": "81539c25", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.157076Z", - "iopub.status.busy": "2026-08-05T21:36:38.156942Z", - "iopub.status.idle": "2026-08-05T21:36:38.195163Z", - "shell.execute_reply": "2026-08-05T21:36:38.194759Z" + "iopub.execute_input": "2026-08-06T05:19:56.861967Z", + "iopub.status.busy": "2026-08-06T05:19:56.861877Z", + "iopub.status.idle": "2026-08-06T05:19:56.913266Z", + "shell.execute_reply": "2026-08-06T05:19:56.912944Z" } }, "outputs": [ @@ -435,7 +435,7 @@ }, { "cell_type": "markdown", - "id": "9afef4e3", + "id": "596842bc", "metadata": {}, "source": [ "## Applying one" @@ -444,13 +444,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "dd3d88bd", + "id": "5c382c98", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.196037Z", - "iopub.status.busy": "2026-08-05T21:36:38.195885Z", - "iopub.status.idle": "2026-08-05T21:36:38.203793Z", - "shell.execute_reply": "2026-08-05T21:36:38.203520Z" + "iopub.execute_input": "2026-08-06T05:19:56.914249Z", + "iopub.status.busy": "2026-08-06T05:19:56.914146Z", + "iopub.status.idle": "2026-08-06T05:19:56.933568Z", + "shell.execute_reply": "2026-08-06T05:19:56.933253Z" } }, "outputs": [ @@ -474,7 +474,7 @@ }, { "cell_type": "markdown", - "id": "bdb59844", + "id": "4934973d", "metadata": {}, "source": [ "Three variants where a list comprehension would have left you with one list and\n", @@ -488,13 +488,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "2f807277", + "id": "19052c3e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.204563Z", - "iopub.status.busy": "2026-08-05T21:36:38.204421Z", - "iopub.status.idle": "2026-08-05T21:36:38.209083Z", - "shell.execute_reply": "2026-08-05T21:36:38.208824Z" + "iopub.execute_input": "2026-08-06T05:19:56.934488Z", + "iopub.status.busy": "2026-08-06T05:19:56.934393Z", + "iopub.status.idle": "2026-08-06T05:19:56.939295Z", + "shell.execute_reply": "2026-08-06T05:19:56.938956Z" } }, "outputs": [ @@ -569,7 +569,7 @@ }, { "cell_type": "markdown", - "id": "cd91bb95", + "id": "e7813fe6", "metadata": {}, "source": [ "### A failure on one row is not a failure of the call\n", @@ -582,13 +582,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "58876262", + "id": "3b2d9faa", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.209782Z", - "iopub.status.busy": "2026-08-05T21:36:38.209647Z", - "iopub.status.idle": "2026-08-05T21:36:38.215084Z", - "shell.execute_reply": "2026-08-05T21:36:38.214834Z" + "iopub.execute_input": "2026-08-06T05:19:56.940138Z", + "iopub.status.busy": "2026-08-06T05:19:56.940040Z", + "iopub.status.idle": "2026-08-06T05:19:56.945801Z", + "shell.execute_reply": "2026-08-06T05:19:56.945530Z" } }, "outputs": [ @@ -664,13 +664,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "740008d4", + "id": "2e5db441", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.215796Z", - "iopub.status.busy": "2026-08-05T21:36:38.215661Z", - "iopub.status.idle": "2026-08-05T21:36:38.218053Z", - "shell.execute_reply": "2026-08-05T21:36:38.217760Z" + "iopub.execute_input": "2026-08-06T05:19:56.946615Z", + "iopub.status.busy": "2026-08-06T05:19:56.946480Z", + "iopub.status.idle": "2026-08-06T05:19:56.948474Z", + "shell.execute_reply": "2026-08-06T05:19:56.948228Z" } }, "outputs": [ @@ -691,7 +691,7 @@ }, { "cell_type": "markdown", - "id": "0f0cf910", + "id": "11515064", "metadata": {}, "source": [ "The rows that failed kept their original structure and are flagged `False`, so\n", @@ -705,13 +705,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "7228fd12", + "id": "98e70a7a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.218767Z", - "iopub.status.busy": "2026-08-05T21:36:38.218627Z", - "iopub.status.idle": "2026-08-05T21:36:38.220657Z", - "shell.execute_reply": "2026-08-05T21:36:38.220423Z" + "iopub.execute_input": "2026-08-06T05:19:56.949248Z", + "iopub.status.busy": "2026-08-06T05:19:56.949111Z", + "iopub.status.idle": "2026-08-06T05:19:56.951118Z", + "shell.execute_reply": "2026-08-06T05:19:56.950873Z" } }, "outputs": [ @@ -737,7 +737,7 @@ }, { "cell_type": "markdown", - "id": "3449f746", + "id": "b1fdd31f", "metadata": {}, "source": [ "## One-to-many\n", @@ -751,13 +751,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "b1c96dff", + "id": "f2b43aab", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.221343Z", - "iopub.status.busy": "2026-08-05T21:36:38.221203Z", - "iopub.status.idle": "2026-08-05T21:36:38.243343Z", - "shell.execute_reply": "2026-08-05T21:36:38.243051Z" + "iopub.execute_input": "2026-08-06T05:19:56.951918Z", + "iopub.status.busy": "2026-08-06T05:19:56.951774Z", + "iopub.status.idle": "2026-08-06T05:19:57.029706Z", + "shell.execute_reply": "2026-08-06T05:19:57.029372Z" } }, "outputs": [ @@ -844,7 +844,7 @@ }, { "cell_type": "markdown", - "id": "9f035590", + "id": "8d7cf844", "metadata": {}, "source": [ "```{note}\n", @@ -862,13 +862,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "79ea6328", + "id": "b4e455c4", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.244109Z", - "iopub.status.busy": "2026-08-05T21:36:38.243974Z", - "iopub.status.idle": "2026-08-05T21:36:38.252236Z", - "shell.execute_reply": "2026-08-05T21:36:38.251927Z" + "iopub.execute_input": "2026-08-06T05:19:57.030490Z", + "iopub.status.busy": "2026-08-06T05:19:57.030395Z", + "iopub.status.idle": "2026-08-06T05:19:57.039250Z", + "shell.execute_reply": "2026-08-06T05:19:57.038968Z" } }, "outputs": [ @@ -941,13 +941,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "4468ed4e", + "id": "682037b4", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.253016Z", - "iopub.status.busy": "2026-08-05T21:36:38.252870Z", - "iopub.status.idle": "2026-08-05T21:36:38.254979Z", - "shell.execute_reply": "2026-08-05T21:36:38.254729Z" + "iopub.execute_input": "2026-08-06T05:19:57.039982Z", + "iopub.status.busy": "2026-08-06T05:19:57.039846Z", + "iopub.status.idle": "2026-08-06T05:19:57.041922Z", + "shell.execute_reply": "2026-08-06T05:19:57.041678Z" } }, "outputs": [ @@ -970,7 +970,7 @@ }, { "cell_type": "markdown", - "id": "a4f6fc9b", + "id": "bec03529", "metadata": {}, "source": [ "One variant rather than one per step, because the intermediates are usually not\n", @@ -995,13 +995,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "e08d1b32", + "id": "ee78d601", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.255645Z", - "iopub.status.busy": "2026-08-05T21:36:38.255507Z", - "iopub.status.idle": "2026-08-05T21:36:38.281700Z", - "shell.execute_reply": "2026-08-05T21:36:38.281401Z" + "iopub.execute_input": "2026-08-06T05:19:57.042594Z", + "iopub.status.busy": "2026-08-06T05:19:57.042462Z", + "iopub.status.idle": "2026-08-06T05:19:57.065032Z", + "shell.execute_reply": "2026-08-06T05:19:57.064782Z" } }, "outputs": [ @@ -1079,13 +1079,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "8f726896", + "id": "3c70f868", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.282436Z", - "iopub.status.busy": "2026-08-05T21:36:38.282289Z", - "iopub.status.idle": "2026-08-05T21:36:38.285577Z", - "shell.execute_reply": "2026-08-05T21:36:38.285312Z" + "iopub.execute_input": "2026-08-06T05:19:57.065736Z", + "iopub.status.busy": "2026-08-06T05:19:57.065602Z", + "iopub.status.idle": "2026-08-06T05:19:57.068751Z", + "shell.execute_reply": "2026-08-06T05:19:57.068496Z" } }, "outputs": [ @@ -1107,7 +1107,7 @@ }, { "cell_type": "markdown", - "id": "f1b09fe4", + "id": "cbfb1ef9", "metadata": {}, "source": [ "Bond-valence analysis read the states off the bond lengths, and the cells came\n", @@ -1120,13 +1120,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "26c92876", + "id": "642b3c32", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.286268Z", - "iopub.status.busy": "2026-08-05T21:36:38.286119Z", - "iopub.status.idle": "2026-08-05T21:36:38.485801Z", - "shell.execute_reply": "2026-08-05T21:36:38.485425Z" + "iopub.execute_input": "2026-08-06T05:19:57.069447Z", + "iopub.status.busy": "2026-08-06T05:19:57.069315Z", + "iopub.status.idle": "2026-08-06T05:19:57.322946Z", + "shell.execute_reply": "2026-08-06T05:19:57.322486Z" } }, "outputs": [ @@ -1158,7 +1158,7 @@ }, { "cell_type": "markdown", - "id": "6cb9f6c8", + "id": "37ad7aa5", "metadata": {}, "source": [ "### It fails on metals, and says so per row\n", @@ -1171,13 +1171,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "c4593e6a", + "id": "99ee5858", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.486766Z", - "iopub.status.busy": "2026-08-05T21:36:38.486589Z", - "iopub.status.idle": "2026-08-05T21:36:38.538995Z", - "shell.execute_reply": "2026-08-05T21:36:38.538622Z" + "iopub.execute_input": "2026-08-06T05:19:57.324233Z", + "iopub.status.busy": "2026-08-06T05:19:57.324110Z", + "iopub.status.idle": "2026-08-06T05:19:57.371712Z", + "shell.execute_reply": "2026-08-06T05:19:57.371188Z" } }, "outputs": [ @@ -1243,13 +1243,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "e01778dc", + "id": "fe67e791", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.539954Z", - "iopub.status.busy": "2026-08-05T21:36:38.539774Z", - "iopub.status.idle": "2026-08-05T21:36:38.542120Z", - "shell.execute_reply": "2026-08-05T21:36:38.541837Z" + "iopub.execute_input": "2026-08-06T05:19:57.372950Z", + "iopub.status.busy": "2026-08-06T05:19:57.372730Z", + "iopub.status.idle": "2026-08-06T05:19:57.375562Z", + "shell.execute_reply": "2026-08-06T05:19:57.374887Z" } }, "outputs": [ @@ -1270,7 +1270,7 @@ }, { "cell_type": "markdown", - "id": "32d0c37f", + "id": "b99cdeea", "metadata": {}, "source": [ "## What you get for it\n", @@ -1305,13 +1305,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "d259d4e8", + "id": "397eef79", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.542968Z", - "iopub.status.busy": "2026-08-05T21:36:38.542814Z", - "iopub.status.idle": "2026-08-05T21:36:38.590599Z", - "shell.execute_reply": "2026-08-05T21:36:38.590217Z" + "iopub.execute_input": "2026-08-06T05:19:57.376640Z", + "iopub.status.busy": "2026-08-06T05:19:57.376520Z", + "iopub.status.idle": "2026-08-06T05:19:57.453820Z", + "shell.execute_reply": "2026-08-06T05:19:57.453336Z" } }, "outputs": [ @@ -1377,7 +1377,7 @@ }, { "cell_type": "markdown", - "id": "788a2e39", + "id": "4918d985", "metadata": {}, "source": [ "`a+b, a-b, c` is the one to look at: it doubles the volume and gives axes of\n", @@ -1409,13 +1409,13 @@ { "cell_type": "code", "execution_count": 20, - "id": "9d7a1bce", + "id": "4a7ba06c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.591527Z", - "iopub.status.busy": "2026-08-05T21:36:38.591362Z", - "iopub.status.idle": "2026-08-05T21:36:39.093557Z", - "shell.execute_reply": "2026-08-05T21:36:39.093161Z" + "iopub.execute_input": "2026-08-06T05:19:57.454875Z", + "iopub.status.busy": "2026-08-06T05:19:57.454781Z", + "iopub.status.idle": "2026-08-06T05:19:57.890955Z", + "shell.execute_reply": "2026-08-06T05:19:57.890527Z" } }, "outputs": [ @@ -1490,7 +1490,7 @@ }, { "cell_type": "markdown", - "id": "55a5476f", + "id": "1aae1f99", "metadata": {}, "source": [ "| | matverse | α·e²/4πε₀r |\n", @@ -1518,13 +1518,13 @@ { "cell_type": "code", "execution_count": 21, - "id": "402593a1", + "id": "2c7da1ac", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:39.094516Z", - "iopub.status.busy": "2026-08-05T21:36:39.094349Z", - "iopub.status.idle": "2026-08-05T21:36:39.096528Z", - "shell.execute_reply": "2026-08-05T21:36:39.096256Z" + "iopub.execute_input": "2026-08-06T05:19:57.892028Z", + "iopub.status.busy": "2026-08-06T05:19:57.891931Z", + "iopub.status.idle": "2026-08-06T05:19:57.893922Z", + "shell.execute_reply": "2026-08-06T05:19:57.893590Z" } }, "outputs": [ @@ -1551,7 +1551,7 @@ }, { "cell_type": "markdown", - "id": "50b132a0", + "id": "f1fc7c6b", "metadata": {}, "source": [ "## What matverse does not do\n", diff --git a/matverse_guide/docs/tutorials/getting_started.ipynb b/matverse_guide/docs/tutorials/getting_started.ipynb index df2406f..16e3aa0 100644 --- a/matverse_guide/docs/tutorials/getting_started.ipynb +++ b/matverse_guide/docs/tutorials/getting_started.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "87085ba5", + "id": "afdfe70c", "metadata": {}, "source": [ "# Screening real materials with matverse\n", @@ -25,13 +25,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "47947cf5", + "id": "261706a6", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:31.651973Z", - "iopub.status.busy": "2026-08-05T21:17:31.651847Z", - "iopub.status.idle": "2026-08-05T21:17:45.198780Z", - "shell.execute_reply": "2026-08-05T21:17:45.197950Z" + "iopub.execute_input": "2026-08-06T04:53:48.242708Z", + "iopub.status.busy": "2026-08-06T04:53:48.242618Z", + "iopub.status.idle": "2026-08-06T04:53:58.254714Z", + "shell.execute_reply": "2026-08-06T04:53:58.254049Z" } }, "outputs": [ @@ -75,7 +75,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -91,7 +91,7 @@ }, { "cell_type": "markdown", - "id": "d8319427", + "id": "7687ca91", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -120,13 +120,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "e0bb8aee", + "id": "c24b5864", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:45.201504Z", - "iopub.status.busy": "2026-08-05T21:17:45.200525Z", - "iopub.status.idle": "2026-08-05T21:17:45.206259Z", - "shell.execute_reply": "2026-08-05T21:17:45.205544Z" + "iopub.execute_input": "2026-08-06T04:53:58.256658Z", + "iopub.status.busy": "2026-08-06T04:53:58.256202Z", + "iopub.status.idle": "2026-08-06T04:53:58.259809Z", + "shell.execute_reply": "2026-08-06T04:53:58.259462Z" } }, "outputs": [ @@ -162,13 +162,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "87bb662b", + "id": "02e9b06d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:45.207492Z", - "iopub.status.busy": "2026-08-05T21:17:45.207330Z", - "iopub.status.idle": "2026-08-05T21:17:45.257911Z", - "shell.execute_reply": "2026-08-05T21:17:45.257468Z" + "iopub.execute_input": "2026-08-06T04:53:58.261115Z", + "iopub.status.busy": "2026-08-06T04:53:58.260965Z", + "iopub.status.idle": "2026-08-06T04:53:58.277789Z", + "shell.execute_reply": "2026-08-06T04:53:58.277483Z" } }, "outputs": [ @@ -195,7 +195,7 @@ }, { "cell_type": "markdown", - "id": "7f587a29", + "id": "3fa214da", "metadata": {}, "source": [ "`X` is the composition matrix and `var` is the periodic table. Neither was asked\n", @@ -210,13 +210,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "b5a637da", + "id": "9c65c1f3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:45.259046Z", - "iopub.status.busy": "2026-08-05T21:17:45.258908Z", - "iopub.status.idle": "2026-08-05T21:17:45.277795Z", - "shell.execute_reply": "2026-08-05T21:17:45.277302Z" + "iopub.execute_input": "2026-08-06T04:53:58.278779Z", + "iopub.status.busy": "2026-08-06T04:53:58.278615Z", + "iopub.status.idle": "2026-08-06T04:53:58.290492Z", + "shell.execute_reply": "2026-08-06T04:53:58.289876Z" } }, "outputs": [ @@ -310,13 +310,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "820a2255", + "id": "0cd66b67", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:45.278786Z", - "iopub.status.busy": "2026-08-05T21:17:45.278661Z", - "iopub.status.idle": "2026-08-05T21:17:45.285497Z", - "shell.execute_reply": "2026-08-05T21:17:45.285123Z" + "iopub.execute_input": "2026-08-06T04:53:58.291962Z", + "iopub.status.busy": "2026-08-06T04:53:58.291540Z", + "iopub.status.idle": "2026-08-06T04:53:58.299019Z", + "shell.execute_reply": "2026-08-06T04:53:58.298460Z" } }, "outputs": [ @@ -423,7 +423,7 @@ }, { "cell_type": "markdown", - "id": "fb2cba81", + "id": "058155f8", "metadata": {}, "source": [ "Because `var` is the periodic table, the natural display of anything\n", @@ -434,13 +434,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "aee4bc29", + "id": "adc2043b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:45.287218Z", - "iopub.status.busy": "2026-08-05T21:17:45.287035Z", - "iopub.status.idle": "2026-08-05T21:17:46.055109Z", - "shell.execute_reply": "2026-08-05T21:17:46.054666Z" + "iopub.execute_input": "2026-08-06T04:53:58.300322Z", + "iopub.status.busy": "2026-08-06T04:53:58.299926Z", + "iopub.status.idle": "2026-08-06T04:53:58.715432Z", + "shell.execute_reply": "2026-08-06T04:53:58.714789Z" } }, "outputs": [ @@ -479,7 +479,7 @@ }, { "cell_type": "markdown", - "id": "9d56e981", + "id": "7055c9d7", "metadata": {}, "source": [ "And you can just look at one, which catches the mistakes a number will not\n", @@ -490,13 +490,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "efb43367", + "id": "782f9703", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:46.058094Z", - "iopub.status.busy": "2026-08-05T21:17:46.057944Z", - "iopub.status.idle": "2026-08-05T21:17:46.548142Z", - "shell.execute_reply": "2026-08-05T21:17:46.547716Z" + "iopub.execute_input": "2026-08-06T04:53:58.716762Z", + "iopub.status.busy": "2026-08-06T04:53:58.716349Z", + "iopub.status.idle": "2026-08-06T04:53:58.971456Z", + "shell.execute_reply": "2026-08-06T04:53:58.970836Z" } }, "outputs": [ @@ -533,7 +533,7 @@ }, { "cell_type": "markdown", - "id": "7aa0a4ff", + "id": "ff4398b5", "metadata": {}, "source": [ "With `py3Dmol` installed the default backend is an interactive viewer instead.\n", @@ -553,13 +553,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "47c8f203", + "id": "faa84a1e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:46.549327Z", - "iopub.status.busy": "2026-08-05T21:17:46.549197Z", - "iopub.status.idle": "2026-08-05T21:17:47.022963Z", - "shell.execute_reply": "2026-08-05T21:17:47.022552Z" + "iopub.execute_input": "2026-08-06T04:53:58.972757Z", + "iopub.status.busy": "2026-08-06T04:53:58.972353Z", + "iopub.status.idle": "2026-08-06T04:53:59.204868Z", + "shell.execute_reply": "2026-08-06T04:53:59.204263Z" } }, "outputs": [ @@ -646,13 +646,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "4ad198be", + "id": "d27d91d0", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:47.024013Z", - "iopub.status.busy": "2026-08-05T21:17:47.023894Z", - "iopub.status.idle": "2026-08-05T21:17:54.244593Z", - "shell.execute_reply": "2026-08-05T21:17:54.243568Z" + "iopub.execute_input": "2026-08-06T04:53:59.206337Z", + "iopub.status.busy": "2026-08-06T04:53:59.206154Z", + "iopub.status.idle": "2026-08-06T04:54:04.212251Z", + "shell.execute_reply": "2026-08-06T04:54:04.211746Z" } }, "outputs": [ @@ -729,13 +729,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "be0964e2", + "id": "c4569b35", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:54.245823Z", - "iopub.status.busy": "2026-08-05T21:17:54.245682Z", - "iopub.status.idle": "2026-08-05T21:17:54.782349Z", - "shell.execute_reply": "2026-08-05T21:17:54.781300Z" + "iopub.execute_input": "2026-08-06T04:54:04.214164Z", + "iopub.status.busy": "2026-08-06T04:54:04.213959Z", + "iopub.status.idle": "2026-08-06T04:54:05.021139Z", + "shell.execute_reply": "2026-08-06T04:54:05.020260Z" } }, "outputs": [ @@ -821,13 +821,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "e60da940", + "id": "13a6c10e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:54.783818Z", - "iopub.status.busy": "2026-08-05T21:17:54.783398Z", - "iopub.status.idle": "2026-08-05T21:17:54.793751Z", - "shell.execute_reply": "2026-08-05T21:17:54.793014Z" + "iopub.execute_input": "2026-08-06T04:54:05.022418Z", + "iopub.status.busy": "2026-08-06T04:54:05.022275Z", + "iopub.status.idle": "2026-08-06T04:54:05.032179Z", + "shell.execute_reply": "2026-08-06T04:54:05.031486Z" } }, "outputs": [ @@ -917,7 +917,7 @@ }, { "cell_type": "markdown", - "id": "74df756a", + "id": "8454a406", "metadata": {}, "source": [ "The cheapest possible statement about electronic structure: line up the atomic\n", @@ -944,7 +944,7 @@ }, { "cell_type": "markdown", - "id": "a6a7a547", + "id": "1532af49", "metadata": {}, "source": [ "`spacegroup` gives the symbol. This gives what the symbol *implies* — and\n", @@ -963,7 +963,7 @@ }, { "cell_type": "markdown", - "id": "bc3a71be", + "id": "d5a24e06", "metadata": {}, "source": [ "A space group says which symmetries a structure has. A **prototype** says which\n", @@ -982,7 +982,7 @@ }, { "cell_type": "markdown", - "id": "939fdfdf", + "id": "e53dfdb1", "metadata": {}, "source": [ "`spacegroup` is determined from the deposited coordinates, not copied from a\n", @@ -1004,13 +1004,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "4e26c596", + "id": "d042a098", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:54.795135Z", - "iopub.status.busy": "2026-08-05T21:17:54.794732Z", - "iopub.status.idle": "2026-08-05T21:17:54.930364Z", - "shell.execute_reply": "2026-08-05T21:17:54.929305Z" + "iopub.execute_input": "2026-08-06T04:54:05.033230Z", + "iopub.status.busy": "2026-08-06T04:54:05.033120Z", + "iopub.status.idle": "2026-08-06T04:54:05.094192Z", + "shell.execute_reply": "2026-08-06T04:54:05.093571Z" } }, "outputs": [ @@ -1034,13 +1034,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "7366accf", + "id": "187d7efe", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:54.931762Z", - "iopub.status.busy": "2026-08-05T21:17:54.931365Z", - "iopub.status.idle": "2026-08-05T21:17:55.221324Z", - "shell.execute_reply": "2026-08-05T21:17:55.220312Z" + "iopub.execute_input": "2026-08-06T04:54:05.095479Z", + "iopub.status.busy": "2026-08-06T04:54:05.095078Z", + "iopub.status.idle": "2026-08-06T04:54:05.241930Z", + "shell.execute_reply": "2026-08-06T04:54:05.241300Z" } }, "outputs": [ @@ -1077,7 +1077,7 @@ }, { "cell_type": "markdown", - "id": "05e45e62", + "id": "f9973ba3", "metadata": {}, "source": [ "LiFePO₄ and NaFePO₄ are the same framework with a different alkali, and the\n", @@ -1092,13 +1092,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "9c0f8384", + "id": "c97083a1", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:55.222783Z", - "iopub.status.busy": "2026-08-05T21:17:55.222366Z", - "iopub.status.idle": "2026-08-05T21:17:55.230335Z", - "shell.execute_reply": "2026-08-05T21:17:55.229626Z" + "iopub.execute_input": "2026-08-06T04:54:05.243229Z", + "iopub.status.busy": "2026-08-06T04:54:05.242844Z", + "iopub.status.idle": "2026-08-06T04:54:05.250416Z", + "shell.execute_reply": "2026-08-06T04:54:05.249836Z" } }, "outputs": [ @@ -1172,7 +1172,7 @@ }, { "cell_type": "markdown", - "id": "bbb04369", + "id": "d10e3e20", "metadata": {}, "source": [ "Row 1 comes back at 1.00 and the runner-up at 0.06, which is the margin you want\n", @@ -1196,13 +1196,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "bb85f6ef", + "id": "00ae93b6", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:55.231691Z", - "iopub.status.busy": "2026-08-05T21:17:55.231289Z", - "iopub.status.idle": "2026-08-05T21:17:55.235216Z", - "shell.execute_reply": "2026-08-05T21:17:55.234605Z" + "iopub.execute_input": "2026-08-06T04:54:05.251650Z", + "iopub.status.busy": "2026-08-06T04:54:05.251274Z", + "iopub.status.idle": "2026-08-06T04:54:05.254935Z", + "shell.execute_reply": "2026-08-06T04:54:05.254413Z" } }, "outputs": [ @@ -1229,7 +1229,7 @@ }, { "cell_type": "markdown", - "id": "9651ac93", + "id": "5e4d4b5a", "metadata": {}, "source": [ "ASE's effective-medium theory is the only calculator matverse ships working. It\n", @@ -1245,13 +1245,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "e670a138", + "id": "2f8219f5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:55.236527Z", - "iopub.status.busy": "2026-08-05T21:17:55.236127Z", - "iopub.status.idle": "2026-08-05T21:17:55.240457Z", - "shell.execute_reply": "2026-08-05T21:17:55.239842Z" + "iopub.execute_input": "2026-08-06T04:54:05.256162Z", + "iopub.status.busy": "2026-08-06T04:54:05.255793Z", + "iopub.status.idle": "2026-08-06T04:54:05.259868Z", + "shell.execute_reply": "2026-08-06T04:54:05.259348Z" } }, "outputs": [ @@ -1286,7 +1286,7 @@ }, { "cell_type": "markdown", - "id": "7e3238c0", + "id": "bca357b4", "metadata": {}, "source": [ "Registered, with its provenance attached — the method, the level of theory it\n", @@ -1300,13 +1300,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "9268b6d1", + "id": "1214639d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:55.241780Z", - "iopub.status.busy": "2026-08-05T21:17:55.241368Z", - "iopub.status.idle": "2026-08-05T21:17:55.267205Z", - "shell.execute_reply": "2026-08-05T21:17:55.266391Z" + "iopub.execute_input": "2026-08-06T04:54:05.261092Z", + "iopub.status.busy": "2026-08-06T04:54:05.260723Z", + "iopub.status.idle": "2026-08-06T04:54:05.273757Z", + "shell.execute_reply": "2026-08-06T04:54:05.273160Z" } }, "outputs": [ @@ -1398,7 +1398,7 @@ }, { "cell_type": "markdown", - "id": "4d283b8b", + "id": "db22af9a", "metadata": {}, "source": [ "Published room-temperature lattice parameters for the seven face-centred cubic\n", @@ -1408,13 +1408,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "ce09a53d", + "id": "39652021", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:55.268626Z", - "iopub.status.busy": "2026-08-05T21:17:55.268215Z", - "iopub.status.idle": "2026-08-05T21:17:55.730331Z", - "shell.execute_reply": "2026-08-05T21:17:55.729299Z" + "iopub.execute_input": "2026-08-06T04:54:05.275000Z", + "iopub.status.busy": "2026-08-06T04:54:05.274619Z", + "iopub.status.idle": "2026-08-06T04:54:05.534231Z", + "shell.execute_reply": "2026-08-06T04:54:05.521741Z" } }, "outputs": [ @@ -1517,13 +1517,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "3371e835", + "id": "96ad6a90", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:55.731730Z", - "iopub.status.busy": "2026-08-05T21:17:55.731313Z", - "iopub.status.idle": "2026-08-05T21:17:55.735184Z", - "shell.execute_reply": "2026-08-05T21:17:55.734501Z" + "iopub.execute_input": "2026-08-06T04:54:05.535608Z", + "iopub.status.busy": "2026-08-06T04:54:05.535466Z", + "iopub.status.idle": "2026-08-06T04:54:05.539254Z", + "shell.execute_reply": "2026-08-06T04:54:05.538617Z" } }, "outputs": [ @@ -1544,7 +1544,7 @@ }, { "cell_type": "markdown", - "id": "2ccb5d6b", + "id": "0db73b6b", "metadata": {}, "source": [ "The relaxed geometry becomes its own **variant** rather than replacing the\n", @@ -1560,13 +1560,13 @@ { "cell_type": "code", "execution_count": 20, - "id": "5a3f1912", + "id": "bf997fd8", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:55.736221Z", - "iopub.status.busy": "2026-08-05T21:17:55.736112Z", - "iopub.status.idle": "2026-08-05T21:17:56.467204Z", - "shell.execute_reply": "2026-08-05T21:17:56.466419Z" + "iopub.execute_input": "2026-08-06T04:54:05.540365Z", + "iopub.status.busy": "2026-08-06T04:54:05.540255Z", + "iopub.status.idle": "2026-08-06T04:54:05.900210Z", + "shell.execute_reply": "2026-08-06T04:54:05.899691Z" } }, "outputs": [ @@ -1695,7 +1695,7 @@ }, { "cell_type": "markdown", - "id": "4c8f87b8", + "id": "ad8d5d08", "metadata": {}, "source": [ "Worth comparing against measured values rather than accepting:\n", @@ -1739,20 +1739,20 @@ { "cell_type": "code", "execution_count": 21, - "id": "2d34a066", + "id": "62635ae2", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:56.468622Z", - "iopub.status.busy": "2026-08-05T21:17:56.468187Z", - "iopub.status.idle": "2026-08-05T21:17:56.730361Z", - "shell.execute_reply": "2026-08-05T21:17:56.729306Z" + "iopub.execute_input": "2026-08-06T04:54:05.901411Z", + "iopub.status.busy": "2026-08-06T04:54:05.901307Z", + "iopub.status.idle": "2026-08-06T04:54:06.025344Z", + "shell.execute_reply": "2026-08-06T04:54:06.024543Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 21, @@ -1795,7 +1795,7 @@ }, { "cell_type": "markdown", - "id": "7fa7148e", + "id": "f014b154", "metadata": {}, "source": [ "Aluminium is the outlier, platinum is high, and the middle five track closely.\n", @@ -1814,13 +1814,13 @@ { "cell_type": "code", "execution_count": 22, - "id": "625533c5", + "id": "90043071", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:56.731775Z", - "iopub.status.busy": "2026-08-05T21:17:56.731376Z", - "iopub.status.idle": "2026-08-05T21:17:57.032323Z", - "shell.execute_reply": "2026-08-05T21:17:57.031299Z" + "iopub.execute_input": "2026-08-06T04:54:06.027665Z", + "iopub.status.busy": "2026-08-06T04:54:06.027170Z", + "iopub.status.idle": "2026-08-06T04:54:06.180970Z", + "shell.execute_reply": "2026-08-06T04:54:06.180522Z" } }, "outputs": [ @@ -1960,7 +1960,7 @@ }, { "cell_type": "markdown", - "id": "3191ddfb", + "id": "9cb42810", "metadata": {}, "source": [ "### What those four numbers are hiding\n", @@ -1978,13 +1978,13 @@ { "cell_type": "code", "execution_count": 23, - "id": "276398e9", + "id": "2c55cb15", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:57.033728Z", - "iopub.status.busy": "2026-08-05T21:17:57.033331Z", - "iopub.status.idle": "2026-08-05T21:17:58.096815Z", - "shell.execute_reply": "2026-08-05T21:17:58.095951Z" + "iopub.execute_input": "2026-08-06T04:54:06.188693Z", + "iopub.status.busy": "2026-08-06T04:54:06.188303Z", + "iopub.status.idle": "2026-08-06T04:54:06.695030Z", + "shell.execute_reply": "2026-08-06T04:54:06.694698Z" } }, "outputs": [ @@ -2016,7 +2016,7 @@ }, { "cell_type": "markdown", - "id": "5dc2489a", + "id": "4c7acfc1", "metadata": {}, "source": [ "The four-lobed shape is what a cubic crystal looks like: stiffest along the body\n", @@ -2066,13 +2066,13 @@ { "cell_type": "code", "execution_count": 24, - "id": "8d40fe07", + "id": "32c40bab", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:58.097952Z", - "iopub.status.busy": "2026-08-05T21:17:58.097830Z", - "iopub.status.idle": "2026-08-05T21:17:58.380333Z", - "shell.execute_reply": "2026-08-05T21:17:58.379308Z" + "iopub.execute_input": "2026-08-06T04:54:06.696582Z", + "iopub.status.busy": "2026-08-06T04:54:06.696472Z", + "iopub.status.idle": "2026-08-06T04:54:06.829650Z", + "shell.execute_reply": "2026-08-06T04:54:06.829341Z" } }, "outputs": [ @@ -2111,7 +2111,7 @@ }, { "cell_type": "markdown", - "id": "8af9314b", + "id": "43bfff0d", "metadata": {}, "source": [ "## Off the zero-kelvin hull\n", @@ -2126,13 +2126,13 @@ { "cell_type": "code", "execution_count": 25, - "id": "a3d3e856", + "id": "ec9a5cce", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:58.381738Z", - "iopub.status.busy": "2026-08-05T21:17:58.381339Z", - "iopub.status.idle": "2026-08-05T21:17:58.894358Z", - "shell.execute_reply": "2026-08-05T21:17:58.893305Z" + "iopub.execute_input": "2026-08-06T04:54:06.831187Z", + "iopub.status.busy": "2026-08-06T04:54:06.831059Z", + "iopub.status.idle": "2026-08-06T04:54:07.064618Z", + "shell.execute_reply": "2026-08-06T04:54:07.063990Z" } }, "outputs": [ @@ -2243,7 +2243,7 @@ }, { "cell_type": "markdown", - "id": "d798b601", + "id": "d205fbb5", "metadata": {}, "source": [ "| volumetric expansion, /K | matverse | experiment |\n", @@ -2276,13 +2276,13 @@ { "cell_type": "code", "execution_count": 26, - "id": "2daf3b8d", + "id": "31bb8755", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:58.895836Z", - "iopub.status.busy": "2026-08-05T21:17:58.895419Z", - "iopub.status.idle": "2026-08-05T21:17:59.178723Z", - "shell.execute_reply": "2026-08-05T21:17:59.177902Z" + "iopub.execute_input": "2026-08-06T04:54:07.065696Z", + "iopub.status.busy": "2026-08-06T04:54:07.065576Z", + "iopub.status.idle": "2026-08-06T04:54:07.203810Z", + "shell.execute_reply": "2026-08-06T04:54:07.203328Z" } }, "outputs": [ @@ -2320,7 +2320,7 @@ }, { "cell_type": "markdown", - "id": "27825867", + "id": "869dbb97", "metadata": {}, "source": [ "The phonons are also everything thermodynamics needs. `mv.prop.free_energy`\n", @@ -2332,13 +2332,13 @@ { "cell_type": "code", "execution_count": 27, - "id": "2331d3f4", + "id": "e289fd0f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:59.179831Z", - "iopub.status.busy": "2026-08-05T21:17:59.179716Z", - "iopub.status.idle": "2026-08-05T21:17:59.197333Z", - "shell.execute_reply": "2026-08-05T21:17:59.196300Z" + "iopub.execute_input": "2026-08-06T04:54:07.205296Z", + "iopub.status.busy": "2026-08-06T04:54:07.205176Z", + "iopub.status.idle": "2026-08-06T04:54:07.211990Z", + "shell.execute_reply": "2026-08-06T04:54:07.211467Z" } }, "outputs": [ @@ -2440,7 +2440,7 @@ }, { "cell_type": "markdown", - "id": "77321764", + "id": "ea9541fc", "metadata": {}, "source": [ "### The q-points a supercell cannot hold\n", @@ -2470,13 +2470,13 @@ { "cell_type": "code", "execution_count": 28, - "id": "68724b92", + "id": "16368193", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:59.198799Z", - "iopub.status.busy": "2026-08-05T21:17:59.198372Z", - "iopub.status.idle": "2026-08-05T21:18:08.037997Z", - "shell.execute_reply": "2026-08-05T21:18:08.037162Z" + "iopub.execute_input": "2026-08-06T04:54:07.213071Z", + "iopub.status.busy": "2026-08-06T04:54:07.212890Z", + "iopub.status.idle": "2026-08-06T04:54:12.022349Z", + "shell.execute_reply": "2026-08-06T04:54:12.021472Z" } }, "outputs": [ @@ -2510,7 +2510,7 @@ }, { "cell_type": "markdown", - "id": "2db7f101", + "id": "80c4aa91", "metadata": {}, "source": [ "Interpolation is also the only way to get a *dispersion*. A supercell holds a\n", @@ -2526,13 +2526,13 @@ { "cell_type": "code", "execution_count": 29, - "id": "afd97c88", + "id": "f421f2da", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:08.039345Z", - "iopub.status.busy": "2026-08-05T21:18:08.039119Z", - "iopub.status.idle": "2026-08-05T21:18:08.464305Z", - "shell.execute_reply": "2026-08-05T21:18:08.463938Z" + "iopub.execute_input": "2026-08-06T04:54:12.023998Z", + "iopub.status.busy": "2026-08-06T04:54:12.023861Z", + "iopub.status.idle": "2026-08-06T04:54:12.456610Z", + "shell.execute_reply": "2026-08-06T04:54:12.456013Z" } }, "outputs": [ @@ -2570,7 +2570,7 @@ }, { "cell_type": "markdown", - "id": "8eb50411", + "id": "3f82ffbc", "metadata": {}, "source": [ "That is the check a hull cannot make, and the reason the two cells above are\n", @@ -2594,13 +2594,13 @@ { "cell_type": "code", "execution_count": 30, - "id": "4ec844aa", + "id": "564021a1", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:08.465349Z", - "iopub.status.busy": "2026-08-05T21:18:08.465174Z", - "iopub.status.idle": "2026-08-05T21:18:08.721827Z", - "shell.execute_reply": "2026-08-05T21:18:08.721468Z" + "iopub.execute_input": "2026-08-06T04:54:12.457890Z", + "iopub.status.busy": "2026-08-06T04:54:12.457783Z", + "iopub.status.idle": "2026-08-06T04:54:12.845775Z", + "shell.execute_reply": "2026-08-06T04:54:12.845108Z" } }, "outputs": [ @@ -2636,7 +2636,7 @@ }, { "cell_type": "markdown", - "id": "ec1bd1c7", + "id": "8b4818ee", "metadata": {}, "source": [ "The dashed line at zero is where `mv.pl.bands` would normally draw the Fermi\n", @@ -2662,13 +2662,13 @@ { "cell_type": "code", "execution_count": 31, - "id": "b8ed923b", + "id": "5d609e24", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:08.723303Z", - "iopub.status.busy": "2026-08-05T21:18:08.723127Z", - "iopub.status.idle": "2026-08-05T21:18:08.737139Z", - "shell.execute_reply": "2026-08-05T21:18:08.736805Z" + "iopub.execute_input": "2026-08-06T04:54:12.847118Z", + "iopub.status.busy": "2026-08-06T04:54:12.847000Z", + "iopub.status.idle": "2026-08-06T04:54:12.870554Z", + "shell.execute_reply": "2026-08-06T04:54:12.869814Z" } }, "outputs": [ @@ -2705,7 +2705,7 @@ }, { "cell_type": "markdown", - "id": "191ac400", + "id": "3f3a54f1", "metadata": {}, "source": [ "The cell above prints a fallback rather than a table in the rendered docs,\n", @@ -2758,13 +2758,13 @@ { "cell_type": "code", "execution_count": 32, - "id": "82bbfc2a", + "id": "ce61d26a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:08.738142Z", - "iopub.status.busy": "2026-08-05T21:18:08.737984Z", - "iopub.status.idle": "2026-08-05T21:18:08.741215Z", - "shell.execute_reply": "2026-08-05T21:18:08.740909Z" + "iopub.execute_input": "2026-08-06T04:54:12.871725Z", + "iopub.status.busy": "2026-08-06T04:54:12.871609Z", + "iopub.status.idle": "2026-08-06T04:54:12.875703Z", + "shell.execute_reply": "2026-08-06T04:54:12.875260Z" } }, "outputs": [ @@ -2794,13 +2794,13 @@ { "cell_type": "code", "execution_count": 33, - "id": "0d0c8c05", + "id": "0125958c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:08.742192Z", - "iopub.status.busy": "2026-08-05T21:18:08.742036Z", - "iopub.status.idle": "2026-08-05T21:18:08.747750Z", - "shell.execute_reply": "2026-08-05T21:18:08.747434Z" + "iopub.execute_input": "2026-08-06T04:54:12.876614Z", + "iopub.status.busy": "2026-08-06T04:54:12.876497Z", + "iopub.status.idle": "2026-08-06T04:54:12.883097Z", + "shell.execute_reply": "2026-08-06T04:54:12.882651Z" } }, "outputs": [ @@ -2908,7 +2908,7 @@ }, { "cell_type": "markdown", - "id": "c1d2c192", + "id": "9cd81526", "metadata": {}, "source": [ "A threshold is a decision, and a table of seven rows does not show whether it\n", @@ -2921,13 +2921,13 @@ { "cell_type": "code", "execution_count": 34, - "id": "65a4c42d", + "id": "2910e586", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:08.748664Z", - "iopub.status.busy": "2026-08-05T21:18:08.748502Z", - "iopub.status.idle": "2026-08-05T21:18:08.867281Z", - "shell.execute_reply": "2026-08-05T21:18:08.866918Z" + "iopub.execute_input": "2026-08-06T04:54:12.884474Z", + "iopub.status.busy": "2026-08-06T04:54:12.884356Z", + "iopub.status.idle": "2026-08-06T04:54:13.000012Z", + "shell.execute_reply": "2026-08-06T04:54:12.999197Z" } }, "outputs": [ @@ -2964,7 +2964,7 @@ }, { "cell_type": "markdown", - "id": "4a2afb11", + "id": "8c653723", "metadata": {}, "source": [ "Subset when you actually want the short list — the object is an ordinary\n", @@ -2980,13 +2980,13 @@ { "cell_type": "code", "execution_count": 35, - "id": "1e1de20a", + "id": "d886e0f9", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:08.868411Z", - "iopub.status.busy": "2026-08-05T21:18:08.868225Z", - "iopub.status.idle": "2026-08-05T21:18:08.880423Z", - "shell.execute_reply": "2026-08-05T21:18:08.880080Z" + "iopub.execute_input": "2026-08-06T04:54:13.001274Z", + "iopub.status.busy": "2026-08-06T04:54:13.001152Z", + "iopub.status.idle": "2026-08-06T04:54:13.015203Z", + "shell.execute_reply": "2026-08-06T04:54:13.014501Z" } }, "outputs": [ @@ -3104,7 +3104,7 @@ }, { "cell_type": "markdown", - "id": "0d160bce", + "id": "17bfb0b2", "metadata": {}, "source": [ "With seven elementals this is a formality. On a library of thousands it is the\n", @@ -3117,13 +3117,13 @@ { "cell_type": "code", "execution_count": 36, - "id": "06de8290", + "id": "8d1a6314", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:08.881453Z", - "iopub.status.busy": "2026-08-05T21:18:08.881291Z", - "iopub.status.idle": "2026-08-05T21:18:08.883443Z", - "shell.execute_reply": "2026-08-05T21:18:08.883165Z" + "iopub.execute_input": "2026-08-06T04:54:13.016413Z", + "iopub.status.busy": "2026-08-06T04:54:13.016296Z", + "iopub.status.idle": "2026-08-06T04:54:13.019229Z", + "shell.execute_reply": "2026-08-06T04:54:13.018655Z" } }, "outputs": [ @@ -3157,13 +3157,13 @@ { "cell_type": "code", "execution_count": 37, - "id": "c69b05cf", + "id": "7b497bef", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:08.884174Z", - "iopub.status.busy": "2026-08-05T21:18:08.884029Z", - "iopub.status.idle": "2026-08-05T21:18:09.123205Z", - "shell.execute_reply": "2026-08-05T21:18:09.122847Z" + "iopub.execute_input": "2026-08-06T04:54:13.020416Z", + "iopub.status.busy": "2026-08-06T04:54:13.020297Z", + "iopub.status.idle": "2026-08-06T04:54:13.263546Z", + "shell.execute_reply": "2026-08-06T04:54:13.262767Z" } }, "outputs": [ @@ -3189,7 +3189,7 @@ }, { "cell_type": "markdown", - "id": "2dcdd43a", + "id": "474b3a30", "metadata": {}, "source": [ "Parameters are recorded with each call, so the history replays as code rather\n", diff --git a/matverse_guide/docs/tutorials/infrastructure.ipynb b/matverse_guide/docs/tutorials/infrastructure.ipynb index d50ae72..c78d4a5 100644 --- a/matverse_guide/docs/tutorials/infrastructure.ipynb +++ b/matverse_guide/docs/tutorials/infrastructure.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "ac08b1d1", + "id": "85713318", "metadata": {}, "source": [ "# Infrastructure\n", @@ -18,13 +18,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "1b29ec0a", + "id": "e2146f29", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:14.906582Z", - "iopub.status.busy": "2026-08-05T21:37:14.906461Z", - "iopub.status.idle": "2026-08-05T21:37:23.751382Z", - "shell.execute_reply": "2026-08-05T21:37:23.750841Z" + "iopub.execute_input": "2026-08-06T05:20:40.356610Z", + "iopub.status.busy": "2026-08-06T05:20:40.356519Z", + "iopub.status.idle": "2026-08-06T05:20:53.325849Z", + "shell.execute_reply": "2026-08-06T05:20:53.325104Z" } }, "outputs": [ @@ -68,7 +68,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -85,13 +85,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "f0130d95", + "id": "b8f96aae", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:23.752911Z", - "iopub.status.busy": "2026-08-05T21:37:23.752308Z", - "iopub.status.idle": "2026-08-05T21:37:23.830122Z", - "shell.execute_reply": "2026-08-05T21:37:23.829678Z" + "iopub.execute_input": "2026-08-06T05:20:53.327959Z", + "iopub.status.busy": "2026-08-06T05:20:53.327511Z", + "iopub.status.idle": "2026-08-06T05:20:53.407883Z", + "shell.execute_reply": "2026-08-06T05:20:53.407529Z" } }, "outputs": [ @@ -186,7 +186,7 @@ }, { "cell_type": "markdown", - "id": "7263567d", + "id": "52eb6688", "metadata": {}, "source": [ "## What is this object carrying?\n", @@ -198,13 +198,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "64088a4e", + "id": "899a89be", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:23.831002Z", - "iopub.status.busy": "2026-08-05T21:37:23.830907Z", - "iopub.status.idle": "2026-08-05T21:37:23.832987Z", - "shell.execute_reply": "2026-08-05T21:37:23.832627Z" + "iopub.execute_input": "2026-08-06T05:20:53.410109Z", + "iopub.status.busy": "2026-08-06T05:20:53.409959Z", + "iopub.status.idle": "2026-08-06T05:20:53.412185Z", + "shell.execute_reply": "2026-08-06T05:20:53.411909Z" } }, "outputs": [ @@ -230,7 +230,7 @@ }, { "cell_type": "markdown", - "id": "56cd4465", + "id": "aa0b21dd", "metadata": {}, "source": [ "## Units\n", @@ -243,13 +243,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "540924ae", + "id": "443c5b6d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:23.833711Z", - "iopub.status.busy": "2026-08-05T21:37:23.833622Z", - "iopub.status.idle": "2026-08-05T21:37:23.835804Z", - "shell.execute_reply": "2026-08-05T21:37:23.835460Z" + "iopub.execute_input": "2026-08-06T05:20:53.413777Z", + "iopub.status.busy": "2026-08-06T05:20:53.413656Z", + "iopub.status.idle": "2026-08-06T05:20:53.416367Z", + "shell.execute_reply": "2026-08-06T05:20:53.415833Z" } }, "outputs": [ @@ -281,13 +281,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "515c20cd", + "id": "a94123cf", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:23.836528Z", - "iopub.status.busy": "2026-08-05T21:37:23.836435Z", - "iopub.status.idle": "2026-08-05T21:37:23.847659Z", - "shell.execute_reply": "2026-08-05T21:37:23.847260Z" + "iopub.execute_input": "2026-08-06T05:20:53.417513Z", + "iopub.status.busy": "2026-08-06T05:20:53.417401Z", + "iopub.status.idle": "2026-08-06T05:20:53.420373Z", + "shell.execute_reply": "2026-08-06T05:20:53.419907Z" } }, "outputs": [ @@ -317,7 +317,7 @@ }, { "cell_type": "markdown", - "id": "003084dd", + "id": "e12b7dce", "metadata": {}, "source": [ "Every column matverse wrote has a unit; `lattice_parameter` and `nsites` come\n", @@ -328,13 +328,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "11c8b1d7", + "id": "27abcd70", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:23.848427Z", - "iopub.status.busy": "2026-08-05T21:37:23.848339Z", - "iopub.status.idle": "2026-08-05T21:37:23.851292Z", - "shell.execute_reply": "2026-08-05T21:37:23.850942Z" + "iopub.execute_input": "2026-08-06T05:20:53.421487Z", + "iopub.status.busy": "2026-08-06T05:20:53.421374Z", + "iopub.status.idle": "2026-08-06T05:20:53.426061Z", + "shell.execute_reply": "2026-08-06T05:20:53.425533Z" } }, "outputs": [ @@ -358,7 +358,7 @@ }, { "cell_type": "markdown", - "id": "7c3aa11b", + "id": "09efb672", "metadata": {}, "source": [ "`mv.utils.convert` goes the other way — it takes a column in *someone else's*\n", @@ -371,13 +371,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "ddb09908", + "id": "8db00738", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:23.852037Z", - "iopub.status.busy": "2026-08-05T21:37:23.851945Z", - "iopub.status.idle": "2026-08-05T21:37:23.857890Z", - "shell.execute_reply": "2026-08-05T21:37:23.857534Z" + "iopub.execute_input": "2026-08-06T05:20:53.427153Z", + "iopub.status.busy": "2026-08-06T05:20:53.427022Z", + "iopub.status.idle": "2026-08-06T05:20:53.435276Z", + "shell.execute_reply": "2026-08-06T05:20:53.434676Z" } }, "outputs": [ @@ -490,7 +490,7 @@ }, { "cell_type": "markdown", - "id": "03d8aa29", + "id": "1d833dce", "metadata": {}, "source": [ "`reported_energy_ev` and `energy_per_atom_emt` agree, which is the check worth\n", @@ -506,13 +506,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "1d3145cf", + "id": "15b2e268", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:23.858613Z", - "iopub.status.busy": "2026-08-05T21:37:23.858524Z", - "iopub.status.idle": "2026-08-05T21:37:23.860566Z", - "shell.execute_reply": "2026-08-05T21:37:23.860253Z" + "iopub.execute_input": "2026-08-06T05:20:53.436280Z", + "iopub.status.busy": "2026-08-06T05:20:53.436157Z", + "iopub.status.idle": "2026-08-06T05:20:53.439692Z", + "shell.execute_reply": "2026-08-06T05:20:53.439153Z" } }, "outputs": [ @@ -533,7 +533,7 @@ }, { "cell_type": "markdown", - "id": "b80934e1", + "id": "f9431f7b", "metadata": {}, "source": [ "## Surviving a walltime limit\n", @@ -547,13 +547,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "8e2d7a95", + "id": "fc358b8e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:23.861253Z", - "iopub.status.busy": "2026-08-05T21:37:23.861164Z", - "iopub.status.idle": "2026-08-05T21:37:23.941155Z", - "shell.execute_reply": "2026-08-05T21:37:23.940625Z" + "iopub.execute_input": "2026-08-06T05:20:53.440747Z", + "iopub.status.busy": "2026-08-06T05:20:53.440633Z", + "iopub.status.idle": "2026-08-06T05:20:53.490102Z", + "shell.execute_reply": "2026-08-06T05:20:53.489357Z" } }, "outputs": [ @@ -579,7 +579,7 @@ }, { "cell_type": "markdown", - "id": "027d6d3f", + "id": "14490c78", "metadata": {}, "source": [ "`mv.utils.resume` answers the question a restarted job actually asks: *which\n", @@ -589,13 +589,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "5b51bac6", + "id": "0ee836da", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:23.942326Z", - "iopub.status.busy": "2026-08-05T21:37:23.942185Z", - "iopub.status.idle": "2026-08-05T21:37:24.006100Z", - "shell.execute_reply": "2026-08-05T21:37:24.005575Z" + "iopub.execute_input": "2026-08-06T05:20:53.491254Z", + "iopub.status.busy": "2026-08-06T05:20:53.491122Z", + "iopub.status.idle": "2026-08-06T05:20:53.524064Z", + "shell.execute_reply": "2026-08-06T05:20:53.523321Z" } }, "outputs": [ @@ -622,7 +622,7 @@ }, { "cell_type": "markdown", - "id": "0922b436", + "id": "11a4430c", "metadata": {}, "source": [ "Three rows were done before the job died; four remain. Note that this works on\n", @@ -646,13 +646,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "71817f0a", + "id": "dd3e0a1d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.007439Z", - "iopub.status.busy": "2026-08-05T21:37:24.007307Z", - "iopub.status.idle": "2026-08-05T21:37:24.033720Z", - "shell.execute_reply": "2026-08-05T21:37:24.033126Z" + "iopub.execute_input": "2026-08-06T05:20:53.525193Z", + "iopub.status.busy": "2026-08-06T05:20:53.525070Z", + "iopub.status.idle": "2026-08-06T05:20:53.541680Z", + "shell.execute_reply": "2026-08-06T05:20:53.541083Z" } }, "outputs": [ @@ -673,7 +673,7 @@ }, { "cell_type": "markdown", - "id": "40141187", + "id": "46d4f3de", "metadata": {}, "source": [ "`map_chunks` runs an operation over each piece, optionally checkpointing as it\n", @@ -684,13 +684,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "3b143c66", + "id": "49f14603", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.034831Z", - "iopub.status.busy": "2026-08-05T21:37:24.034698Z", - "iopub.status.idle": "2026-08-05T21:37:24.336167Z", - "shell.execute_reply": "2026-08-05T21:37:24.335552Z" + "iopub.execute_input": "2026-08-06T05:20:53.543014Z", + "iopub.status.busy": "2026-08-06T05:20:53.542610Z", + "iopub.status.idle": "2026-08-06T05:20:53.686941Z", + "shell.execute_reply": "2026-08-06T05:20:53.686331Z" } }, "outputs": [ @@ -721,13 +721,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "f9d7fbda", + "id": "4db6a055", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.337293Z", - "iopub.status.busy": "2026-08-05T21:37:24.337151Z", - "iopub.status.idle": "2026-08-05T21:37:24.342446Z", - "shell.execute_reply": "2026-08-05T21:37:24.341932Z" + "iopub.execute_input": "2026-08-06T05:20:53.688274Z", + "iopub.status.busy": "2026-08-06T05:20:53.687874Z", + "iopub.status.idle": "2026-08-06T05:20:53.694233Z", + "shell.execute_reply": "2026-08-06T05:20:53.693658Z" } }, "outputs": [ @@ -818,7 +818,7 @@ }, { "cell_type": "markdown", - "id": "8f02854f", + "id": "55288eec", "metadata": {}, "source": [ "The results landed on the parent object even though the work happened\n", @@ -834,13 +834,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "aeafba0a", + "id": "dd7a77dd", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.343512Z", - "iopub.status.busy": "2026-08-05T21:37:24.343389Z", - "iopub.status.idle": "2026-08-05T21:37:24.346293Z", - "shell.execute_reply": "2026-08-05T21:37:24.345841Z" + "iopub.execute_input": "2026-08-06T05:20:53.695512Z", + "iopub.status.busy": "2026-08-06T05:20:53.695125Z", + "iopub.status.idle": "2026-08-06T05:20:53.698855Z", + "shell.execute_reply": "2026-08-06T05:20:53.698358Z" } }, "outputs": [ @@ -885,7 +885,7 @@ }, { "cell_type": "markdown", - "id": "0f3f7a77", + "id": "6dc0b675", "metadata": {}, "source": [ "### Submitting it\n", @@ -898,21 +898,21 @@ { "cell_type": "code", "execution_count": 15, - "id": "b0bfc68a", + "id": "d6982740", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.347250Z", - "iopub.status.busy": "2026-08-05T21:37:24.347133Z", - "iopub.status.idle": "2026-08-05T21:37:24.349823Z", - "shell.execute_reply": "2026-08-05T21:37:24.349381Z" + "iopub.execute_input": "2026-08-06T05:20:53.700083Z", + "iopub.status.busy": "2026-08-06T05:20:53.699705Z", + "iopub.status.idle": "2026-08-06T05:20:53.703269Z", + "shell.execute_reply": "2026-08-06T05:20:53.702750Z" } }, "outputs": [ { "data": { "text/plain": [ - "{'script': '/tmp/tmpixnb6qnq/screen.sbatch',\n", - " 'command': 'sbatch /tmp/tmpixnb6qnq/screen.sbatch',\n", + "{'script': '/tmp/tmp6j0gqlrh/screen.sbatch',\n", + " 'command': 'sbatch /tmp/tmp6j0gqlrh/screen.sbatch',\n", " 'job_id': None,\n", " 'state': 'dry run'}" ] @@ -929,7 +929,7 @@ }, { "cell_type": "markdown", - "id": "97a7e877", + "id": "7f3d88c7", "metadata": {}, "source": [ "`dry_run=True` returns the command without running it, which is what you want\n", @@ -943,21 +943,21 @@ { "cell_type": "code", "execution_count": 16, - "id": "af72ee06", + "id": "72a4f498", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.350761Z", - "iopub.status.busy": "2026-08-05T21:37:24.350647Z", - "iopub.status.idle": "2026-08-05T21:37:24.353180Z", - "shell.execute_reply": "2026-08-05T21:37:24.352755Z" + "iopub.execute_input": "2026-08-06T05:20:53.704489Z", + "iopub.status.busy": "2026-08-06T05:20:53.704111Z", + "iopub.status.idle": "2026-08-06T05:20:53.707579Z", + "shell.execute_reply": "2026-08-06T05:20:53.707073Z" } }, "outputs": [ { "data": { "text/plain": [ - "[{'script': '/tmp/tmpixnb6qnq/screen.sbatch',\n", - " 'command': 'sbatch /tmp/tmpixnb6qnq/screen.sbatch',\n", + "[{'script': '/tmp/tmp6j0gqlrh/screen.sbatch',\n", + " 'command': 'sbatch /tmp/tmp6j0gqlrh/screen.sbatch',\n", " 'job_id': None,\n", " 'state': 'dry run'}]" ] @@ -974,13 +974,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "e87f8d81", + "id": "4c80a081", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.354127Z", - "iopub.status.busy": "2026-08-05T21:37:24.354007Z", - "iopub.status.idle": "2026-08-05T21:37:24.356387Z", - "shell.execute_reply": "2026-08-05T21:37:24.356047Z" + "iopub.execute_input": "2026-08-06T05:20:53.708766Z", + "iopub.status.busy": "2026-08-06T05:20:53.708404Z", + "iopub.status.idle": "2026-08-06T05:20:53.711767Z", + "shell.execute_reply": "2026-08-06T05:20:53.711269Z" } }, "outputs": [ @@ -1003,7 +1003,7 @@ }, { "cell_type": "markdown", - "id": "6525d46d", + "id": "a870a8f4", "metadata": {}, "source": [ "With real submissions that reads `squeue`, and falls back to `sacct` for jobs\n", @@ -1032,13 +1032,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "7667522f", + "id": "0ac925fb", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.357570Z", - "iopub.status.busy": "2026-08-05T21:37:24.357464Z", - "iopub.status.idle": "2026-08-05T21:37:24.360119Z", - "shell.execute_reply": "2026-08-05T21:37:24.359706Z" + "iopub.execute_input": "2026-08-06T05:20:53.712954Z", + "iopub.status.busy": "2026-08-06T05:20:53.712587Z", + "iopub.status.idle": "2026-08-06T05:20:53.716226Z", + "shell.execute_reply": "2026-08-06T05:20:53.715722Z" } }, "outputs": [ @@ -1077,13 +1077,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "8a7d10cc", + "id": "349e2377", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.361067Z", - "iopub.status.busy": "2026-08-05T21:37:24.360961Z", - "iopub.status.idle": "2026-08-05T21:37:24.973727Z", - "shell.execute_reply": "2026-08-05T21:37:24.973299Z" + "iopub.execute_input": "2026-08-06T05:20:53.717403Z", + "iopub.status.busy": "2026-08-06T05:20:53.717033Z", + "iopub.status.idle": "2026-08-06T05:20:53.980871Z", + "shell.execute_reply": "2026-08-06T05:20:53.980263Z" } }, "outputs": [ @@ -1108,13 +1108,13 @@ { "cell_type": "code", "execution_count": 20, - "id": "1d7bc5d7", + "id": "30234a76", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.980198Z", - "iopub.status.busy": "2026-08-05T21:37:24.979729Z", - "iopub.status.idle": "2026-08-05T21:37:24.993954Z", - "shell.execute_reply": "2026-08-05T21:37:24.993498Z" + "iopub.execute_input": "2026-08-06T05:20:53.982502Z", + "iopub.status.busy": "2026-08-06T05:20:53.981785Z", + "iopub.status.idle": "2026-08-06T05:20:53.985922Z", + "shell.execute_reply": "2026-08-06T05:20:53.985418Z" } }, "outputs": [ @@ -1135,7 +1135,7 @@ }, { "cell_type": "markdown", - "id": "9a8ce2cb", + "id": "61472a1b", "metadata": {}, "source": [ "INCAR, POSCAR, KPOINTS and a POTCAR *specification* — the last is a list of\n", @@ -1148,20 +1148,20 @@ { "cell_type": "code", "execution_count": 21, - "id": "7fb351eb", + "id": "0ee4b32e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.994915Z", - "iopub.status.busy": "2026-08-05T21:37:24.994799Z", - "iopub.status.idle": "2026-08-05T21:37:24.998169Z", - "shell.execute_reply": "2026-08-05T21:37:24.997690Z" + "iopub.execute_input": "2026-08-06T05:20:53.987134Z", + "iopub.status.busy": "2026-08-06T05:20:53.986768Z", + "iopub.status.idle": "2026-08-06T05:20:53.990764Z", + "shell.execute_reply": "2026-08-06T05:20:53.990255Z" } }, "outputs": [ { "data": { "text/plain": [ - "{'root': '/tmp/tmpixnb6qnq/runs',\n", + "{'root': '/tmp/tmp6j0gqlrh/runs',\n", " 'n_total': 2,\n", " 'n_finished': 0,\n", " 'n_missing': 2,\n", @@ -1180,7 +1180,7 @@ }, { "cell_type": "markdown", - "id": "0ed283ad", + "id": "0071a6af", "metadata": {}, "source": [ "Nothing has run, so both are missing. Pretend one finished:" @@ -1189,20 +1189,20 @@ { "cell_type": "code", "execution_count": 22, - "id": "21f29869", + "id": "3f4584ba", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.999227Z", - "iopub.status.busy": "2026-08-05T21:37:24.999107Z", - "iopub.status.idle": "2026-08-05T21:37:25.002196Z", - "shell.execute_reply": "2026-08-05T21:37:25.001787Z" + "iopub.execute_input": "2026-08-06T05:20:53.991993Z", + "iopub.status.busy": "2026-08-06T05:20:53.991598Z", + "iopub.status.idle": "2026-08-06T05:20:53.995489Z", + "shell.execute_reply": "2026-08-06T05:20:53.994985Z" } }, "outputs": [ { "data": { "text/plain": [ - "{'root': '/tmp/tmpixnb6qnq/runs',\n", + "{'root': '/tmp/tmp6j0gqlrh/runs',\n", " 'n_total': 2,\n", " 'n_finished': 1,\n", " 'n_missing': 1,\n", @@ -1222,7 +1222,7 @@ }, { "cell_type": "markdown", - "id": "c9753042", + "id": "35c69254", "metadata": {}, "source": [ "```{note}\n", @@ -1240,13 +1240,13 @@ { "cell_type": "code", "execution_count": 23, - "id": "afd29fdb", + "id": "06afa23e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:25.003121Z", - "iopub.status.busy": "2026-08-05T21:37:25.003012Z", - "iopub.status.idle": "2026-08-05T21:37:25.011233Z", - "shell.execute_reply": "2026-08-05T21:37:25.010752Z" + "iopub.execute_input": "2026-08-06T05:20:53.996693Z", + "iopub.status.busy": "2026-08-06T05:20:53.996318Z", + "iopub.status.idle": "2026-08-06T05:20:54.006168Z", + "shell.execute_reply": "2026-08-06T05:20:54.005625Z" } }, "outputs": [ @@ -1312,7 +1312,7 @@ }, { "cell_type": "markdown", - "id": "4ce98463", + "id": "90300bb7", "metadata": {}, "source": [ "Both are NaN with a reason, because the `` above is not a real\n", @@ -1327,13 +1327,13 @@ { "cell_type": "code", "execution_count": 24, - "id": "0a9aa99e", + "id": "f204e45e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:25.012370Z", - "iopub.status.busy": "2026-08-05T21:37:25.012173Z", - "iopub.status.idle": "2026-08-05T21:37:25.026925Z", - "shell.execute_reply": "2026-08-05T21:37:25.026305Z" + "iopub.execute_input": "2026-08-06T05:20:54.007427Z", + "iopub.status.busy": "2026-08-06T05:20:54.007023Z", + "iopub.status.idle": "2026-08-06T05:20:54.012255Z", + "shell.execute_reply": "2026-08-06T05:20:54.011725Z" } }, "outputs": [ @@ -1366,7 +1366,7 @@ }, { "cell_type": "markdown", - "id": "ad19d67b", + "id": "df710cb9", "metadata": {}, "source": [ "`read_dos` fills the density of states onto the shared energy grid, and derives\n", @@ -1387,13 +1387,13 @@ { "cell_type": "code", "execution_count": 25, - "id": "2375298d", + "id": "fe1a412f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:25.028014Z", - "iopub.status.busy": "2026-08-05T21:37:25.027879Z", - "iopub.status.idle": "2026-08-05T21:37:25.030464Z", - "shell.execute_reply": "2026-08-05T21:37:25.030036Z" + "iopub.execute_input": "2026-08-06T05:20:54.013474Z", + "iopub.status.busy": "2026-08-06T05:20:54.013091Z", + "iopub.status.idle": "2026-08-06T05:20:54.016449Z", + "shell.execute_reply": "2026-08-06T05:20:54.015943Z" } }, "outputs": [ @@ -1415,13 +1415,13 @@ { "cell_type": "code", "execution_count": 26, - "id": "7eb9b53a", + "id": "485647fd", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:25.031676Z", - "iopub.status.busy": "2026-08-05T21:37:25.031559Z", - "iopub.status.idle": "2026-08-05T21:37:25.033937Z", - "shell.execute_reply": "2026-08-05T21:37:25.033568Z" + "iopub.execute_input": "2026-08-06T05:20:54.017643Z", + "iopub.status.busy": "2026-08-06T05:20:54.017276Z", + "iopub.status.idle": "2026-08-06T05:20:54.020521Z", + "shell.execute_reply": "2026-08-06T05:20:54.020030Z" } }, "outputs": [ @@ -1442,7 +1442,7 @@ }, { "cell_type": "markdown", - "id": "7ffd17e7", + "id": "d890b923", "metadata": {}, "source": [ "```{seealso}\n", diff --git a/matverse_guide/docs/tutorials/interfaces.ipynb b/matverse_guide/docs/tutorials/interfaces.ipynb index 97d170e..88736a6 100644 --- a/matverse_guide/docs/tutorials/interfaces.ipynb +++ b/matverse_guide/docs/tutorials/interfaces.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "52e88f22", + "id": "146f1880", "metadata": {}, "source": [ "# Interfaces\n", @@ -28,13 +28,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "29d83fcc", + "id": "ad7d726f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:19.206956Z", - "iopub.status.busy": "2026-08-05T21:35:19.206865Z", - "iopub.status.idle": "2026-08-05T21:35:24.571622Z", - "shell.execute_reply": "2026-08-05T21:35:24.571133Z" + "iopub.execute_input": "2026-08-06T05:17:38.370981Z", + "iopub.status.busy": "2026-08-06T05:17:38.370890Z", + "iopub.status.idle": "2026-08-06T05:17:43.832627Z", + "shell.execute_reply": "2026-08-06T05:17:43.832083Z" } }, "outputs": [ @@ -78,7 +78,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -94,7 +94,7 @@ }, { "cell_type": "markdown", - "id": "461bbae5", + "id": "67ee0305", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -107,13 +107,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "65a2f9e0", + "id": "e344994f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:24.572809Z", - "iopub.status.busy": "2026-08-05T21:35:24.572449Z", - "iopub.status.idle": "2026-08-05T21:35:24.598391Z", - "shell.execute_reply": "2026-08-05T21:35:24.597998Z" + "iopub.execute_input": "2026-08-06T05:17:43.834465Z", + "iopub.status.busy": "2026-08-06T05:17:43.834041Z", + "iopub.status.idle": "2026-08-06T05:17:43.862086Z", + "shell.execute_reply": "2026-08-06T05:17:43.861626Z" } }, "outputs": [ @@ -188,7 +188,7 @@ }, { "cell_type": "markdown", - "id": "c03faf1d", + "id": "b8b488c9", "metadata": {}, "source": [ "## Will the lattices match?\n", @@ -202,13 +202,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "bf9675a8", + "id": "0bb60e9b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:24.599371Z", - "iopub.status.busy": "2026-08-05T21:35:24.599276Z", - "iopub.status.idle": "2026-08-05T21:35:25.350663Z", - "shell.execute_reply": "2026-08-05T21:35:25.350148Z" + "iopub.execute_input": "2026-08-06T05:17:43.863196Z", + "iopub.status.busy": "2026-08-06T05:17:43.863074Z", + "iopub.status.idle": "2026-08-06T05:17:44.641237Z", + "shell.execute_reply": "2026-08-06T05:17:44.640717Z" } }, "outputs": [ @@ -234,13 +234,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "0ab4b7d7", + "id": "adf75215", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:25.352152Z", - "iopub.status.busy": "2026-08-05T21:35:25.351582Z", - "iopub.status.idle": "2026-08-05T21:35:25.359633Z", - "shell.execute_reply": "2026-08-05T21:35:25.359296Z" + "iopub.execute_input": "2026-08-06T05:17:44.643297Z", + "iopub.status.busy": "2026-08-06T05:17:44.642535Z", + "iopub.status.idle": "2026-08-06T05:17:44.651747Z", + "shell.execute_reply": "2026-08-06T05:17:44.651053Z" } }, "outputs": [ @@ -376,7 +376,7 @@ }, { "cell_type": "markdown", - "id": "bdfe1a4d", + "id": "8e38b3ee", "metadata": {}, "source": [ "Six rows for three materials: the pairing is **ordered**, because copper grown\n", @@ -395,20 +395,20 @@ { "cell_type": "code", "execution_count": 5, - "id": "decd2949", + "id": "331e0ff1", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:25.360409Z", - "iopub.status.busy": "2026-08-05T21:35:25.360316Z", - "iopub.status.idle": "2026-08-05T21:35:25.482672Z", - "shell.execute_reply": "2026-08-05T21:35:25.482244Z" + "iopub.execute_input": "2026-08-06T05:17:44.652918Z", + "iopub.status.busy": "2026-08-06T05:17:44.652773Z", + "iopub.status.idle": "2026-08-06T05:17:44.779439Z", + "shell.execute_reply": "2026-08-06T05:17:44.778753Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 5, @@ -448,7 +448,7 @@ }, { "cell_type": "markdown", - "id": "6d01328e", + "id": "45579a6d", "metadata": {}, "source": [ "Tighten the threshold and the screen starts discriminating — which is the\n", @@ -458,13 +458,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "f8a57a9a", + "id": "3bc3340e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:25.483579Z", - "iopub.status.busy": "2026-08-05T21:35:25.483471Z", - "iopub.status.idle": "2026-08-05T21:35:25.742873Z", - "shell.execute_reply": "2026-08-05T21:35:25.742450Z" + "iopub.execute_input": "2026-08-06T05:17:44.780624Z", + "iopub.status.busy": "2026-08-06T05:17:44.780474Z", + "iopub.status.idle": "2026-08-06T05:17:45.041534Z", + "shell.execute_reply": "2026-08-06T05:17:45.040888Z" } }, "outputs": [ @@ -564,7 +564,7 @@ }, { "cell_type": "markdown", - "id": "b07e37e0", + "id": "5e8ac8dc", "metadata": {}, "source": [ "## What happens at the contact?\n", @@ -580,13 +580,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "59437b91", + "id": "0dbbb5f4", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:25.743761Z", - "iopub.status.busy": "2026-08-05T21:35:25.743666Z", - "iopub.status.idle": "2026-08-05T21:35:25.950738Z", - "shell.execute_reply": "2026-08-05T21:35:25.950351Z" + "iopub.execute_input": "2026-08-06T05:17:45.042699Z", + "iopub.status.busy": "2026-08-06T05:17:45.042581Z", + "iopub.status.idle": "2026-08-06T05:17:45.250003Z", + "shell.execute_reply": "2026-08-06T05:17:45.249544Z" } }, "outputs": [ @@ -687,7 +687,7 @@ }, { "cell_type": "markdown", - "id": "b7cf60fd", + "id": "7d97b4c6", "metadata": {}, "source": [ "All zero, and that is the correct answer for this dataset rather than a\n", @@ -703,13 +703,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "7bbd6d67", + "id": "72611851", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:25.951719Z", - "iopub.status.busy": "2026-08-05T21:35:25.951622Z", - "iopub.status.idle": "2026-08-05T21:35:25.968148Z", - "shell.execute_reply": "2026-08-05T21:35:25.967777Z" + "iopub.execute_input": "2026-08-06T05:17:45.251373Z", + "iopub.status.busy": "2026-08-06T05:17:45.251237Z", + "iopub.status.idle": "2026-08-06T05:17:45.269092Z", + "shell.execute_reply": "2026-08-06T05:17:45.268368Z" } }, "outputs": [ @@ -793,13 +793,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "b91f087d", + "id": "7115cfeb", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:25.969103Z", - "iopub.status.busy": "2026-08-05T21:35:25.969007Z", - "iopub.status.idle": "2026-08-05T21:35:26.221885Z", - "shell.execute_reply": "2026-08-05T21:35:26.221278Z" + "iopub.execute_input": "2026-08-06T05:17:45.270374Z", + "iopub.status.busy": "2026-08-06T05:17:45.270233Z", + "iopub.status.idle": "2026-08-06T05:17:45.523418Z", + "shell.execute_reply": "2026-08-06T05:17:45.522922Z" } }, "outputs": [ @@ -909,7 +909,7 @@ }, { "cell_type": "markdown", - "id": "66267ce1", + "id": "69347f42", "metadata": {}, "source": [ "**Ni + 3 Al → Al₃Ni at −0.45 eV/atom.** Put aluminium against nickel and it\n", @@ -937,13 +937,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "8d4d309a", + "id": "ba3c1d5b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:26.222959Z", - "iopub.status.busy": "2026-08-05T21:35:26.222833Z", - "iopub.status.idle": "2026-08-05T21:35:29.108653Z", - "shell.execute_reply": "2026-08-05T21:35:29.108177Z" + "iopub.execute_input": "2026-08-06T05:17:45.524651Z", + "iopub.status.busy": "2026-08-06T05:17:45.524517Z", + "iopub.status.idle": "2026-08-06T05:17:48.472263Z", + "shell.execute_reply": "2026-08-06T05:17:48.471300Z" } }, "outputs": [ @@ -1013,13 +1013,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "22920d23", + "id": "53a9b59e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:29.109598Z", - "iopub.status.busy": "2026-08-05T21:35:29.109491Z", - "iopub.status.idle": "2026-08-05T21:35:29.111956Z", - "shell.execute_reply": "2026-08-05T21:35:29.111646Z" + "iopub.execute_input": "2026-08-06T05:17:48.474620Z", + "iopub.status.busy": "2026-08-06T05:17:48.474428Z", + "iopub.status.idle": "2026-08-06T05:17:48.479955Z", + "shell.execute_reply": "2026-08-06T05:17:48.479070Z" } }, "outputs": [ @@ -1046,7 +1046,7 @@ }, { "cell_type": "markdown", - "id": "61314fcc", + "id": "7550a1dc", "metadata": {}, "source": [ "One cell per **termination**. Cutting the same orientation at a different plane\n", @@ -1062,13 +1062,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "c7f23eb8", + "id": "7616fc39", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:29.112660Z", - "iopub.status.busy": "2026-08-05T21:35:29.112573Z", - "iopub.status.idle": "2026-08-05T21:35:29.114773Z", - "shell.execute_reply": "2026-08-05T21:35:29.114473Z" + "iopub.execute_input": "2026-08-06T05:17:48.481274Z", + "iopub.status.busy": "2026-08-06T05:17:48.481104Z", + "iopub.status.idle": "2026-08-06T05:17:48.485842Z", + "shell.execute_reply": "2026-08-06T05:17:48.485121Z" } }, "outputs": [ @@ -1090,13 +1090,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "3c0881f6", + "id": "fff20475", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:29.115465Z", - "iopub.status.busy": "2026-08-05T21:35:29.115382Z", - "iopub.status.idle": "2026-08-05T21:35:29.211455Z", - "shell.execute_reply": "2026-08-05T21:35:29.211053Z" + "iopub.execute_input": "2026-08-06T05:17:48.486972Z", + "iopub.status.busy": "2026-08-06T05:17:48.486834Z", + "iopub.status.idle": "2026-08-06T05:17:49.901874Z", + "shell.execute_reply": "2026-08-06T05:17:49.901096Z" } }, "outputs": [ @@ -1156,7 +1156,7 @@ }, { "cell_type": "markdown", - "id": "601faf15", + "id": "27e24e3c", "metadata": {}, "source": [ "```{note}\n", @@ -1176,13 +1176,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "78eab297", + "id": "bef41f08", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:29.212274Z", - "iopub.status.busy": "2026-08-05T21:35:29.212180Z", - "iopub.status.idle": "2026-08-05T21:35:29.217722Z", - "shell.execute_reply": "2026-08-05T21:35:29.217423Z" + "iopub.execute_input": "2026-08-06T05:17:49.903111Z", + "iopub.status.busy": "2026-08-06T05:17:49.902992Z", + "iopub.status.idle": "2026-08-06T05:17:49.910393Z", + "shell.execute_reply": "2026-08-06T05:17:49.909951Z" } }, "outputs": [ @@ -1292,7 +1292,7 @@ }, { "cell_type": "markdown", - "id": "b32e00f0", + "id": "e1daf881", "metadata": {}, "source": [ "A pairing is usable when the lattices fit *and* the contact is inert. Neither\n", @@ -1304,13 +1304,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "b2322cf5", + "id": "ecd309b3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:29.218459Z", - "iopub.status.busy": "2026-08-05T21:35:29.218372Z", - "iopub.status.idle": "2026-08-05T21:35:29.220343Z", - "shell.execute_reply": "2026-08-05T21:35:29.220026Z" + "iopub.execute_input": "2026-08-06T05:17:49.911477Z", + "iopub.status.busy": "2026-08-06T05:17:49.911354Z", + "iopub.status.idle": "2026-08-06T05:17:49.914330Z", + "shell.execute_reply": "2026-08-06T05:17:49.913921Z" } }, "outputs": [ @@ -1331,7 +1331,7 @@ }, { "cell_type": "markdown", - "id": "a04fe7d0", + "id": "17603647", "metadata": {}, "source": [ "```{seealso}\n", diff --git a/matverse_guide/docs/tutorials/magnetic_ordering.ipynb b/matverse_guide/docs/tutorials/magnetic_ordering.ipynb index afcc41b..7651a2e 100644 --- a/matverse_guide/docs/tutorials/magnetic_ordering.ipynb +++ b/matverse_guide/docs/tutorials/magnetic_ordering.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "2fc9d1f0", + "id": "dd107d8e", "metadata": {}, "source": [ "# Magnetic ordering\n", @@ -24,13 +24,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "a4042818", + "id": "4ed2fb7a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:21:59.100251Z", - "iopub.status.busy": "2026-08-05T21:21:59.100051Z", - "iopub.status.idle": "2026-08-05T21:22:09.183820Z", - "shell.execute_reply": "2026-08-05T21:22:09.183271Z" + "iopub.execute_input": "2026-08-06T04:59:25.820633Z", + "iopub.status.busy": "2026-08-06T04:59:25.820550Z", + "iopub.status.idle": "2026-08-06T04:59:34.430468Z", + "shell.execute_reply": "2026-08-06T04:59:34.429698Z" } }, "outputs": [ @@ -74,7 +74,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -90,7 +90,7 @@ }, { "cell_type": "markdown", - "id": "5d40366c", + "id": "3e7df204", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -102,13 +102,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "b0c62855", + "id": "9cc3c3b4", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:09.185571Z", - "iopub.status.busy": "2026-08-05T21:22:09.185126Z", - "iopub.status.idle": "2026-08-05T21:22:09.335106Z", - "shell.execute_reply": "2026-08-05T21:22:09.334608Z" + "iopub.execute_input": "2026-08-06T04:59:34.435500Z", + "iopub.status.busy": "2026-08-06T04:59:34.433872Z", + "iopub.status.idle": "2026-08-06T04:59:34.516763Z", + "shell.execute_reply": "2026-08-06T04:59:34.516304Z" } }, "outputs": [ @@ -196,7 +196,7 @@ }, { "cell_type": "markdown", - "id": "fb5856f9", + "id": "8ea4e24b", "metadata": {}, "source": [ "## Which elements can even carry a moment" @@ -205,13 +205,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "a2645c89", + "id": "495af205", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:09.336465Z", - "iopub.status.busy": "2026-08-05T21:22:09.336342Z", - "iopub.status.idle": "2026-08-05T21:22:09.802856Z", - "shell.execute_reply": "2026-08-05T21:22:09.802414Z" + "iopub.execute_input": "2026-08-06T04:59:34.518160Z", + "iopub.status.busy": "2026-08-06T04:59:34.518012Z", + "iopub.status.idle": "2026-08-06T04:59:34.945248Z", + "shell.execute_reply": "2026-08-06T04:59:34.944722Z" } }, "outputs": [ @@ -293,7 +293,7 @@ }, { "cell_type": "markdown", - "id": "c8ea6690", + "id": "5efe4213", "metadata": {}, "source": [ "Read those two columns carefully, because they answer different questions.\n", @@ -315,13 +315,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "2869615a", + "id": "6cec496e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:09.810897Z", - "iopub.status.busy": "2026-08-05T21:22:09.810783Z", - "iopub.status.idle": "2026-08-05T21:22:09.813249Z", - "shell.execute_reply": "2026-08-05T21:22:09.812909Z" + "iopub.execute_input": "2026-08-06T04:59:34.946591Z", + "iopub.status.busy": "2026-08-06T04:59:34.946483Z", + "iopub.status.idle": "2026-08-06T04:59:34.948865Z", + "shell.execute_reply": "2026-08-06T04:59:34.948468Z" } }, "outputs": [ @@ -361,7 +361,7 @@ }, { "cell_type": "markdown", - "id": "ea0bb9e7", + "id": "3f0f7e45", "metadata": {}, "source": [ "## Enumerating orderings\n", @@ -374,13 +374,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "aef11f5d", + "id": "ef8b6474", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:09.813971Z", - "iopub.status.busy": "2026-08-05T21:22:09.813883Z", - "iopub.status.idle": "2026-08-05T21:22:10.087447Z", - "shell.execute_reply": "2026-08-05T21:22:10.087042Z" + "iopub.execute_input": "2026-08-06T04:59:34.949909Z", + "iopub.status.busy": "2026-08-06T04:59:34.949820Z", + "iopub.status.idle": "2026-08-06T04:59:35.153622Z", + "shell.execute_reply": "2026-08-06T04:59:35.153115Z" } }, "outputs": [ @@ -408,13 +408,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "1c76e132", + "id": "761bfff4", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:10.088614Z", - "iopub.status.busy": "2026-08-05T21:22:10.088492Z", - "iopub.status.idle": "2026-08-05T21:22:10.109757Z", - "shell.execute_reply": "2026-08-05T21:22:10.109270Z" + "iopub.execute_input": "2026-08-06T04:59:35.154690Z", + "iopub.status.busy": "2026-08-06T04:59:35.154583Z", + "iopub.status.idle": "2026-08-06T04:59:35.165573Z", + "shell.execute_reply": "2026-08-06T04:59:35.165133Z" } }, "outputs": [ @@ -549,7 +549,7 @@ }, { "cell_type": "markdown", - "id": "14813e76", + "id": "9b7d3c8c", "metadata": {}, "source": [ "Three things worth reading in that table.\n", @@ -570,13 +570,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "38df0dcf", + "id": "ef043894", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:10.110658Z", - "iopub.status.busy": "2026-08-05T21:22:10.110538Z", - "iopub.status.idle": "2026-08-05T21:22:10.113052Z", - "shell.execute_reply": "2026-08-05T21:22:10.112671Z" + "iopub.execute_input": "2026-08-06T04:59:35.166452Z", + "iopub.status.busy": "2026-08-06T04:59:35.166342Z", + "iopub.status.idle": "2026-08-06T04:59:35.168675Z", + "shell.execute_reply": "2026-08-06T04:59:35.168303Z" } }, "outputs": [ @@ -597,7 +597,7 @@ }, { "cell_type": "markdown", - "id": "9549b6a5", + "id": "05e9c30c", "metadata": {}, "source": [ "```{note}\n", @@ -614,13 +614,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "82fca92f", + "id": "23fe1f33", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:10.113830Z", - "iopub.status.busy": "2026-08-05T21:22:10.113727Z", - "iopub.status.idle": "2026-08-05T21:22:10.115966Z", - "shell.execute_reply": "2026-08-05T21:22:10.115600Z" + "iopub.execute_input": "2026-08-06T04:59:35.169459Z", + "iopub.status.busy": "2026-08-06T04:59:35.169352Z", + "iopub.status.idle": "2026-08-06T04:59:35.171534Z", + "shell.execute_reply": "2026-08-06T04:59:35.171181Z" } }, "outputs": [ @@ -642,7 +642,7 @@ }, { "cell_type": "markdown", - "id": "67297c2c", + "id": "a8cc42de", "metadata": {}, "source": [ "## Picking the ground state\n", @@ -654,13 +654,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "c940176f", + "id": "e9077e3a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:10.116709Z", - "iopub.status.busy": "2026-08-05T21:22:10.116610Z", - "iopub.status.idle": "2026-08-05T21:22:10.156287Z", - "shell.execute_reply": "2026-08-05T21:22:10.147178Z" + "iopub.execute_input": "2026-08-06T04:59:35.172326Z", + "iopub.status.busy": "2026-08-06T04:59:35.172232Z", + "iopub.status.idle": "2026-08-06T04:59:35.189982Z", + "shell.execute_reply": "2026-08-06T04:59:35.189578Z" } }, "outputs": [ @@ -739,7 +739,7 @@ }, { "cell_type": "markdown", - "id": "7bdd846c", + "id": "ace1aef9", "metadata": {}, "source": [ "## The spread is zero, and that is the answer\n", @@ -759,13 +759,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "28d2bb48", + "id": "ac158b08", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:10.157372Z", - "iopub.status.busy": "2026-08-05T21:22:10.157233Z", - "iopub.status.idle": "2026-08-05T21:22:10.164588Z", - "shell.execute_reply": "2026-08-05T21:22:10.164235Z" + "iopub.execute_input": "2026-08-06T04:59:35.190825Z", + "iopub.status.busy": "2026-08-06T04:59:35.190728Z", + "iopub.status.idle": "2026-08-06T04:59:35.192845Z", + "shell.execute_reply": "2026-08-06T04:59:35.192486Z" } }, "outputs": [ @@ -789,7 +789,7 @@ }, { "cell_type": "markdown", - "id": "d7d462cf", + "id": "6639618c", "metadata": {}, "source": [ "```{warning}\n", @@ -832,13 +832,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "de4485bb", + "id": "ca2f9d11", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:10.165406Z", - "iopub.status.busy": "2026-08-05T21:22:10.165305Z", - "iopub.status.idle": "2026-08-05T21:22:10.172642Z", - "shell.execute_reply": "2026-08-05T21:22:10.172269Z" + "iopub.execute_input": "2026-08-06T04:59:35.193553Z", + "iopub.status.busy": "2026-08-06T04:59:35.193469Z", + "iopub.status.idle": "2026-08-06T04:59:35.195799Z", + "shell.execute_reply": "2026-08-06T04:59:35.195208Z" } }, "outputs": [ @@ -859,7 +859,7 @@ }, { "cell_type": "markdown", - "id": "a965d7fe", + "id": "5ae3e9a9", "metadata": {}, "source": [ "That is deliberate. `mv.thermo.hull` needs no special case for magnetism: it\n", @@ -880,7 +880,7 @@ }, { "cell_type": "markdown", - "id": "79f7e8bc", + "id": "1be1d6da", "metadata": {}, "source": [ "## The other thing a d shell does\n", @@ -897,13 +897,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "06e51a9c", + "id": "426a44c7", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:10.173356Z", - "iopub.status.busy": "2026-08-05T21:22:10.173252Z", - "iopub.status.idle": "2026-08-05T21:22:10.625765Z", - "shell.execute_reply": "2026-08-05T21:22:10.625400Z" + "iopub.execute_input": "2026-08-06T04:59:35.197703Z", + "iopub.status.busy": "2026-08-06T04:59:35.197609Z", + "iopub.status.idle": "2026-08-06T04:59:35.418149Z", + "shell.execute_reply": "2026-08-06T04:59:35.417752Z" } }, "outputs": [ @@ -992,7 +992,7 @@ }, { "cell_type": "markdown", - "id": "b7e62612", + "id": "b57123f5", "metadata": {}, "source": [ "Mn³⁺ and Ni³⁺ come out **strong** and Ti⁴⁺ inactive, which is the textbook\n", @@ -1016,7 +1016,7 @@ }, { "cell_type": "markdown", - "id": "14bd33dd", + "id": "d7aaed40", "metadata": {}, "source": [ "## How far above room temperature does it stay a magnet?\n", @@ -1032,13 +1032,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "fcb63dbf", + "id": "b100f172", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:10.626589Z", - "iopub.status.busy": "2026-08-05T21:22:10.626496Z", - "iopub.status.idle": "2026-08-05T21:22:10.665734Z", - "shell.execute_reply": "2026-08-05T21:22:10.665375Z" + "iopub.execute_input": "2026-08-06T04:59:35.419075Z", + "iopub.status.busy": "2026-08-06T04:59:35.418955Z", + "iopub.status.idle": "2026-08-06T04:59:35.441969Z", + "shell.execute_reply": "2026-08-06T04:59:35.441752Z" } }, "outputs": [ @@ -1117,7 +1117,7 @@ }, { "cell_type": "markdown", - "id": "0446b53f", + "id": "9bb70c76", "metadata": {}, "source": [ "The ferromagnetic arrangement is lower, so the coupling is positive and the\n", @@ -1139,7 +1139,7 @@ }, { "cell_type": "markdown", - "id": "54659c6b", + "id": "b8de8253", "metadata": {}, "source": [ "### When the fit has nothing to fit\n", @@ -1153,13 +1153,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "e8d915aa", + "id": "44821289", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:10.666524Z", - "iopub.status.busy": "2026-08-05T21:22:10.666428Z", - "iopub.status.idle": "2026-08-05T21:22:10.671427Z", - "shell.execute_reply": "2026-08-05T21:22:10.671095Z" + "iopub.execute_input": "2026-08-06T04:59:35.444161Z", + "iopub.status.busy": "2026-08-06T04:59:35.444068Z", + "iopub.status.idle": "2026-08-06T04:59:35.448949Z", + "shell.execute_reply": "2026-08-06T04:59:35.448580Z" } }, "outputs": [ @@ -1197,7 +1197,7 @@ }, { "cell_type": "markdown", - "id": "4728c817", + "id": "f5538908", "metadata": {}, "source": [ "A NaN and a stated reason, rather than a number near zero that would read as\n", @@ -1206,7 +1206,7 @@ }, { "cell_type": "markdown", - "id": "bf40a8ac", + "id": "cf8e13a9", "metadata": {}, "source": [ "## What the moments cost in symmetry\n", @@ -1225,13 +1225,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "4bb7b471", + "id": "ac0f9632", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:10.672126Z", - "iopub.status.busy": "2026-08-05T21:22:10.672039Z", - "iopub.status.idle": "2026-08-05T21:22:10.872830Z", - "shell.execute_reply": "2026-08-05T21:22:10.872436Z" + "iopub.execute_input": "2026-08-06T04:59:35.449668Z", + "iopub.status.busy": "2026-08-06T04:59:35.449581Z", + "iopub.status.idle": "2026-08-06T04:59:35.553780Z", + "shell.execute_reply": "2026-08-06T04:59:35.553459Z" } }, "outputs": [ @@ -1321,7 +1321,7 @@ }, { "cell_type": "markdown", - "id": "c5ac04b0", + "id": "2f561c63", "metadata": {}, "source": [ "bcc iron has **96** operations. With no moments all 96 survive. With any\n", diff --git a/matverse_guide/docs/tutorials/models_and_campaigns.ipynb b/matverse_guide/docs/tutorials/models_and_campaigns.ipynb index 5fa58c5..a0d04ae 100644 --- a/matverse_guide/docs/tutorials/models_and_campaigns.ipynb +++ b/matverse_guide/docs/tutorials/models_and_campaigns.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "6fb9bf5d", + "id": "fefaf278", "metadata": {}, "source": [ "# Models and campaigns\n", @@ -19,13 +19,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "dc75f309", + "id": "b45d0771", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:51.401845Z", - "iopub.status.busy": "2026-08-05T21:18:51.401765Z", - "iopub.status.idle": "2026-08-05T21:18:56.584271Z", - "shell.execute_reply": "2026-08-05T21:18:56.583861Z" + "iopub.execute_input": "2026-08-06T04:55:33.355979Z", + "iopub.status.busy": "2026-08-06T04:55:33.355843Z", + "iopub.status.idle": "2026-08-06T04:55:42.198097Z", + "shell.execute_reply": "2026-08-06T04:55:42.197569Z" } }, "outputs": [ @@ -69,7 +69,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -85,7 +85,7 @@ }, { "cell_type": "markdown", - "id": "493fc9a4", + "id": "f1dba22e", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -98,13 +98,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "a2f3f32e", + "id": "9198bd51", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:56.585747Z", - "iopub.status.busy": "2026-08-05T21:18:56.585390Z", - "iopub.status.idle": "2026-08-05T21:18:56.605200Z", - "shell.execute_reply": "2026-08-05T21:18:56.604897Z" + "iopub.execute_input": "2026-08-06T04:55:42.199853Z", + "iopub.status.busy": "2026-08-06T04:55:42.199349Z", + "iopub.status.idle": "2026-08-06T04:55:42.226871Z", + "shell.execute_reply": "2026-08-06T04:55:42.226362Z" } }, "outputs": [ @@ -141,7 +141,7 @@ }, { "cell_type": "markdown", - "id": "a95c206c", + "id": "ad1180c7", "metadata": {}, "source": [ "Each binary sits at the mean of its two elemental lattice parameters — a crude\n", @@ -152,13 +152,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "33383a0a", + "id": "d66181f8", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:56.606002Z", - "iopub.status.busy": "2026-08-05T21:18:56.605914Z", - "iopub.status.idle": "2026-08-05T21:18:56.697102Z", - "shell.execute_reply": "2026-08-05T21:18:56.696716Z" + "iopub.execute_input": "2026-08-06T04:55:42.227842Z", + "iopub.status.busy": "2026-08-06T04:55:42.227686Z", + "iopub.status.idle": "2026-08-06T04:55:42.360656Z", + "shell.execute_reply": "2026-08-06T04:55:42.360075Z" } }, "outputs": [ @@ -282,7 +282,7 @@ }, { "cell_type": "markdown", - "id": "6fcfc769", + "id": "53ba0ee9", "metadata": {}, "source": [ "## The split is the part to care about\n", @@ -295,13 +295,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "f3619f82", + "id": "ac2912f1", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:56.697890Z", - "iopub.status.busy": "2026-08-05T21:18:56.697800Z", - "iopub.status.idle": "2026-08-05T21:18:56.701237Z", - "shell.execute_reply": "2026-08-05T21:18:56.700924Z" + "iopub.execute_input": "2026-08-06T04:55:42.362619Z", + "iopub.status.busy": "2026-08-06T04:55:42.362418Z", + "iopub.status.idle": "2026-08-06T04:55:42.366316Z", + "shell.execute_reply": "2026-08-06T04:55:42.365951Z" } }, "outputs": [ @@ -329,7 +329,7 @@ }, { "cell_type": "markdown", - "id": "2ab58d37", + "id": "248a1544", "metadata": {}, "source": [ "`mv.model.split` defaults to grouping by **composition**, and the default is the\n", @@ -351,13 +351,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "b527e453", + "id": "6e1c851a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:56.701922Z", - "iopub.status.busy": "2026-08-05T21:18:56.701838Z", - "iopub.status.idle": "2026-08-05T21:18:56.704381Z", - "shell.execute_reply": "2026-08-05T21:18:56.704091Z" + "iopub.execute_input": "2026-08-06T04:55:42.367382Z", + "iopub.status.busy": "2026-08-06T04:55:42.367202Z", + "iopub.status.idle": "2026-08-06T04:55:42.369976Z", + "shell.execute_reply": "2026-08-06T04:55:42.369683Z" } }, "outputs": [ @@ -379,7 +379,7 @@ }, { "cell_type": "markdown", - "id": "50e5e47c", + "id": "d1fe17a5", "metadata": {}, "source": [ "The element holdout is the hardest honest split and the one a discovery campaign\n", @@ -398,13 +398,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "7d03bf76", + "id": "f545b58a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:56.705081Z", - "iopub.status.busy": "2026-08-05T21:18:56.704995Z", - "iopub.status.idle": "2026-08-05T21:18:56.906801Z", - "shell.execute_reply": "2026-08-05T21:18:56.906340Z" + "iopub.execute_input": "2026-08-06T04:55:42.371600Z", + "iopub.status.busy": "2026-08-06T04:55:42.371152Z", + "iopub.status.idle": "2026-08-06T04:55:42.619427Z", + "shell.execute_reply": "2026-08-06T04:55:42.618968Z" } }, "outputs": [ @@ -431,7 +431,7 @@ }, { "cell_type": "markdown", - "id": "16b39365", + "id": "fcdf00ac", "metadata": {}, "source": [ "The prediction is a **level of theory**, not a special kind of column." @@ -440,13 +440,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "678266b2", + "id": "619da6e0", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:56.907691Z", - "iopub.status.busy": "2026-08-05T21:18:56.907598Z", - "iopub.status.idle": "2026-08-05T21:18:56.909805Z", - "shell.execute_reply": "2026-08-05T21:18:56.909535Z" + "iopub.execute_input": "2026-08-06T04:55:42.621358Z", + "iopub.status.busy": "2026-08-06T04:55:42.620930Z", + "iopub.status.idle": "2026-08-06T04:55:42.624583Z", + "shell.execute_reply": "2026-08-06T04:55:42.624125Z" } }, "outputs": [ @@ -478,7 +478,7 @@ }, { "cell_type": "markdown", - "id": "4f7991fa", + "id": "89a877c2", "metadata": {}, "source": [ "That matters for the same reason it does everywhere else in matverse: a\n", @@ -494,13 +494,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "f13f69c0", + "id": "27fbf731", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:56.910539Z", - "iopub.status.busy": "2026-08-05T21:18:56.910453Z", - "iopub.status.idle": "2026-08-05T21:18:56.915723Z", - "shell.execute_reply": "2026-08-05T21:18:56.915420Z" + "iopub.execute_input": "2026-08-06T04:55:42.638501Z", + "iopub.status.busy": "2026-08-06T04:55:42.638037Z", + "iopub.status.idle": "2026-08-06T04:55:42.645147Z", + "shell.execute_reply": "2026-08-06T04:55:42.644449Z" } }, "outputs": [ @@ -626,7 +626,7 @@ }, { "cell_type": "markdown", - "id": "d7c8b371", + "id": "5ef483ae", "metadata": {}, "source": [ "It is honestly labelled **uncalibrated**. It is useful for deciding what to\n", @@ -636,13 +636,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "ff7dc611", + "id": "3319a98f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:56.916486Z", - "iopub.status.busy": "2026-08-05T21:18:56.916396Z", - "iopub.status.idle": "2026-08-05T21:18:56.918430Z", - "shell.execute_reply": "2026-08-05T21:18:56.918148Z" + "iopub.execute_input": "2026-08-06T04:55:42.646518Z", + "iopub.status.busy": "2026-08-06T04:55:42.646100Z", + "iopub.status.idle": "2026-08-06T04:55:42.649150Z", + "shell.execute_reply": "2026-08-06T04:55:42.648914Z" } }, "outputs": [ @@ -666,7 +666,7 @@ }, { "cell_type": "markdown", - "id": "7a176d2c", + "id": "9b7fe8cf", "metadata": {}, "source": [ "Only scikit-learn is wired. Graph networks and fine-tuned interatomic potentials\n", @@ -677,13 +677,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "878cf023", + "id": "08ec547b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:56.919154Z", - "iopub.status.busy": "2026-08-05T21:18:56.919071Z", - "iopub.status.idle": "2026-08-05T21:18:56.986313Z", - "shell.execute_reply": "2026-08-05T21:18:56.985920Z" + "iopub.execute_input": "2026-08-06T04:55:42.650757Z", + "iopub.status.busy": "2026-08-06T04:55:42.650616Z", + "iopub.status.idle": "2026-08-06T04:55:42.719813Z", + "shell.execute_reply": "2026-08-06T04:55:42.719464Z" } }, "outputs": [ @@ -691,9 +691,9 @@ "data": { "text/plain": [ "{'n': 6,\n", - " 'mae': 0.017274831817887117,\n", - " 'rmse': 0.02353478742144657,\n", - " 'r2': 0.8869210928074481}" + " 'mae': 0.019450246268847757,\n", + " 'rmse': 0.02558749923481937,\n", + " 'r2': 0.8663352998833478}" ] }, "execution_count": 10, @@ -712,7 +712,7 @@ }, { "cell_type": "markdown", - "id": "38e2323d", + "id": "ff21d87a", "metadata": {}, "source": [ "### Uncertainty from a committee instead\n", @@ -726,13 +726,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "e9973216", + "id": "e12fba15", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:56.987103Z", - "iopub.status.busy": "2026-08-05T21:18:56.987012Z", - "iopub.status.idle": "2026-08-05T21:18:56.992796Z", - "shell.execute_reply": "2026-08-05T21:18:56.992474Z" + "iopub.execute_input": "2026-08-06T04:55:42.721121Z", + "iopub.status.busy": "2026-08-06T04:55:42.721026Z", + "iopub.status.idle": "2026-08-06T04:55:42.731564Z", + "shell.execute_reply": "2026-08-06T04:55:42.731221Z" } }, "outputs": [ @@ -831,7 +831,7 @@ }, { "cell_type": "markdown", - "id": "4f8ee130", + "id": "afac1471", "metadata": {}, "source": [ "The two members here differ by a constant, so the spread is the same everywhere\n", @@ -847,13 +847,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "6ef0bd0c", + "id": "b5e1fd1c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:56.993490Z", - "iopub.status.busy": "2026-08-05T21:18:56.993406Z", - "iopub.status.idle": "2026-08-05T21:18:58.497030Z", - "shell.execute_reply": "2026-08-05T21:18:58.496660Z" + "iopub.execute_input": "2026-08-06T04:55:42.732934Z", + "iopub.status.busy": "2026-08-06T04:55:42.732787Z", + "iopub.status.idle": "2026-08-06T04:55:44.266412Z", + "shell.execute_reply": "2026-08-06T04:55:44.265867Z" } }, "outputs": [ @@ -926,13 +926,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "72b3db29", + "id": "159a21cc", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:58.498113Z", - "iopub.status.busy": "2026-08-05T21:18:58.498019Z", - "iopub.status.idle": "2026-08-05T21:18:58.594650Z", - "shell.execute_reply": "2026-08-05T21:18:58.594309Z" + "iopub.execute_input": "2026-08-06T04:55:44.267708Z", + "iopub.status.busy": "2026-08-06T04:55:44.267586Z", + "iopub.status.idle": "2026-08-06T04:55:44.384579Z", + "shell.execute_reply": "2026-08-06T04:55:44.383488Z" } }, "outputs": [ @@ -979,13 +979,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "302329d0", + "id": "115cb1b5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:58.595723Z", - "iopub.status.busy": "2026-08-05T21:18:58.595597Z", - "iopub.status.idle": "2026-08-05T21:18:58.597883Z", - "shell.execute_reply": "2026-08-05T21:18:58.597562Z" + "iopub.execute_input": "2026-08-06T04:55:44.386516Z", + "iopub.status.busy": "2026-08-06T04:55:44.385915Z", + "iopub.status.idle": "2026-08-06T04:55:44.390519Z", + "shell.execute_reply": "2026-08-06T04:55:44.389851Z" } }, "outputs": [ @@ -1006,7 +1006,7 @@ }, { "cell_type": "markdown", - "id": "8387ec38", + "id": "f6ea0b41", "metadata": {}, "source": [ "`leakage_mae` is the grouped MAE minus the random one. A large **positive**\n", @@ -1052,13 +1052,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "6dc85e40", + "id": "2178ef63", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:58.598762Z", - "iopub.status.busy": "2026-08-05T21:18:58.598672Z", - "iopub.status.idle": "2026-08-05T21:18:58.602356Z", - "shell.execute_reply": "2026-08-05T21:18:58.602046Z" + "iopub.execute_input": "2026-08-06T04:55:44.392000Z", + "iopub.status.busy": "2026-08-06T04:55:44.391542Z", + "iopub.status.idle": "2026-08-06T04:55:44.397623Z", + "shell.execute_reply": "2026-08-06T04:55:44.396966Z" } }, "outputs": [ @@ -1086,7 +1086,7 @@ }, { "cell_type": "markdown", - "id": "53c26fcb", + "id": "b8719038", "metadata": {}, "source": [ "Each round: fit on what is known, ask for a batch, \"compute\" it, fold it back." @@ -1095,13 +1095,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "9ee5b4fe", + "id": "b35a7aeb", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:58.603062Z", - "iopub.status.busy": "2026-08-05T21:18:58.602975Z", - "iopub.status.idle": "2026-08-05T21:18:59.148191Z", - "shell.execute_reply": "2026-08-05T21:18:59.147757Z" + "iopub.execute_input": "2026-08-06T04:55:44.398813Z", + "iopub.status.busy": "2026-08-06T04:55:44.398688Z", + "iopub.status.idle": "2026-08-06T04:55:44.954376Z", + "shell.execute_reply": "2026-08-06T04:55:44.953682Z" } }, "outputs": [ @@ -1232,13 +1232,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "cd81d1b6", + "id": "0dd82a74", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:59.149324Z", - "iopub.status.busy": "2026-08-05T21:18:59.149218Z", - "iopub.status.idle": "2026-08-05T21:18:59.151709Z", - "shell.execute_reply": "2026-08-05T21:18:59.151403Z" + "iopub.execute_input": "2026-08-06T04:55:44.955621Z", + "iopub.status.busy": "2026-08-06T04:55:44.955475Z", + "iopub.status.idle": "2026-08-06T04:55:44.959371Z", + "shell.execute_reply": "2026-08-06T04:55:44.958900Z" } }, "outputs": [ @@ -1260,20 +1260,20 @@ { "cell_type": "code", "execution_count": 18, - "id": "edfa5798", + "id": "3f23f0bc", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:59.152415Z", - "iopub.status.busy": "2026-08-05T21:18:59.152328Z", - "iopub.status.idle": "2026-08-05T21:18:59.268633Z", - "shell.execute_reply": "2026-08-05T21:18:59.268252Z" + "iopub.execute_input": "2026-08-06T04:55:44.960500Z", + "iopub.status.busy": "2026-08-06T04:55:44.960367Z", + "iopub.status.idle": "2026-08-06T04:55:45.098207Z", + "shell.execute_reply": "2026-08-06T04:55:45.097778Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 18, @@ -1312,7 +1312,7 @@ }, { "cell_type": "markdown", - "id": "479f4184", + "id": "c69e1c50", "metadata": {}, "source": [ "The campaign found the true optimum having computed a fraction of the\n", @@ -1340,13 +1340,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "e9c0700c", + "id": "8cae0b7d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:59.269519Z", - "iopub.status.busy": "2026-08-05T21:18:59.269425Z", - "iopub.status.idle": "2026-08-05T21:18:59.271953Z", - "shell.execute_reply": "2026-08-05T21:18:59.271634Z" + "iopub.execute_input": "2026-08-06T04:55:45.100159Z", + "iopub.status.busy": "2026-08-06T04:55:45.099743Z", + "iopub.status.idle": "2026-08-06T04:55:45.103562Z", + "shell.execute_reply": "2026-08-06T04:55:45.103222Z" } }, "outputs": [ @@ -1369,13 +1369,13 @@ { "cell_type": "code", "execution_count": 20, - "id": "a09f86ad", + "id": "8d145eae", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:59.272649Z", - "iopub.status.busy": "2026-08-05T21:18:59.272562Z", - "iopub.status.idle": "2026-08-05T21:18:59.383282Z", - "shell.execute_reply": "2026-08-05T21:18:59.382892Z" + "iopub.execute_input": "2026-08-06T04:55:45.104919Z", + "iopub.status.busy": "2026-08-06T04:55:45.104779Z", + "iopub.status.idle": "2026-08-06T04:55:45.223257Z", + "shell.execute_reply": "2026-08-06T04:55:45.222958Z" } }, "outputs": [ @@ -1418,7 +1418,7 @@ }, { "cell_type": "markdown", - "id": "e4ab9021", + "id": "ee22ab30", "metadata": {}, "source": [ "A candidate is worth computing either because its predicted value is good or\n", @@ -1435,13 +1435,13 @@ { "cell_type": "code", "execution_count": 21, - "id": "e2882057", + "id": "06265d77", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:59.384149Z", - "iopub.status.busy": "2026-08-05T21:18:59.384056Z", - "iopub.status.idle": "2026-08-05T21:18:59.388380Z", - "shell.execute_reply": "2026-08-05T21:18:59.388062Z" + "iopub.execute_input": "2026-08-06T04:55:45.225295Z", + "iopub.status.busy": "2026-08-06T04:55:45.224818Z", + "iopub.status.idle": "2026-08-06T04:55:45.230716Z", + "shell.execute_reply": "2026-08-06T04:55:45.230468Z" } }, "outputs": [ @@ -1468,7 +1468,7 @@ }, { "cell_type": "markdown", - "id": "07c11d8b", + "id": "da146ee9", "metadata": {}, "source": [ "Farthest-point selection among a shortlist, so the batch spreads out in\n", @@ -1492,13 +1492,13 @@ { "cell_type": "code", "execution_count": 22, - "id": "b3b13f6a", + "id": "ed2f00ae", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:59.389254Z", - "iopub.status.busy": "2026-08-05T21:18:59.389163Z", - "iopub.status.idle": "2026-08-05T21:18:59.637286Z", - "shell.execute_reply": "2026-08-05T21:18:59.636835Z" + "iopub.execute_input": "2026-08-06T04:55:45.233469Z", + "iopub.status.busy": "2026-08-06T04:55:45.233053Z", + "iopub.status.idle": "2026-08-06T04:55:45.496422Z", + "shell.execute_reply": "2026-08-06T04:55:45.496007Z" } }, "outputs": [ @@ -1529,7 +1529,7 @@ }, { "cell_type": "markdown", - "id": "c0fd1504", + "id": "26909edd", "metadata": {}, "source": [ "`mv.pl.parity` draws the error bars when an uncertainty column exists,\n", @@ -1546,13 +1546,13 @@ { "cell_type": "code", "execution_count": 23, - "id": "3d28745e", + "id": "f2123d1e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:59.638206Z", - "iopub.status.busy": "2026-08-05T21:18:59.638108Z", - "iopub.status.idle": "2026-08-05T21:18:59.953187Z", - "shell.execute_reply": "2026-08-05T21:18:59.952755Z" + "iopub.execute_input": "2026-08-06T04:55:45.498223Z", + "iopub.status.busy": "2026-08-06T04:55:45.497819Z", + "iopub.status.idle": "2026-08-06T04:55:45.839899Z", + "shell.execute_reply": "2026-08-06T04:55:45.839379Z" } }, "outputs": [ @@ -1586,7 +1586,7 @@ }, { "cell_type": "markdown", - "id": "b3f7ef62", + "id": "935229fc", "metadata": {}, "source": [ "A bar chart of 118 categories is unreadable and throws away the structure a\n", @@ -1597,13 +1597,13 @@ { "cell_type": "code", "execution_count": 24, - "id": "f3e2d8dc", + "id": "d5580d52", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:59.954112Z", - "iopub.status.busy": "2026-08-05T21:18:59.953989Z", - "iopub.status.idle": "2026-08-05T21:19:00.038838Z", - "shell.execute_reply": "2026-08-05T21:19:00.038453Z" + "iopub.execute_input": "2026-08-06T04:55:45.841728Z", + "iopub.status.busy": "2026-08-06T04:55:45.841562Z", + "iopub.status.idle": "2026-08-06T04:55:45.934659Z", + "shell.execute_reply": "2026-08-06T04:55:45.934173Z" } }, "outputs": [ @@ -1640,7 +1640,7 @@ }, { "cell_type": "markdown", - "id": "63621e44", + "id": "fcd98ded", "metadata": {}, "source": [ "### The rest\n", @@ -1659,13 +1659,13 @@ { "cell_type": "code", "execution_count": 25, - "id": "21e96f27", + "id": "3cb7fad7", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:00.039826Z", - "iopub.status.busy": "2026-08-05T21:19:00.039733Z", - "iopub.status.idle": "2026-08-05T21:19:00.680574Z", - "shell.execute_reply": "2026-08-05T21:19:00.680097Z" + "iopub.execute_input": "2026-08-06T04:55:45.935867Z", + "iopub.status.busy": "2026-08-06T04:55:45.935737Z", + "iopub.status.idle": "2026-08-06T04:55:46.588567Z", + "shell.execute_reply": "2026-08-06T04:55:46.587948Z" } }, "outputs": [ @@ -1691,7 +1691,7 @@ }, { "cell_type": "markdown", - "id": "ef241b8a", + "id": "c9aa661b", "metadata": {}, "source": [ "```{note}\n", diff --git a/matverse_guide/docs/tutorials/molecules.ipynb b/matverse_guide/docs/tutorials/molecules.ipynb index 662dceb..2966135 100644 --- a/matverse_guide/docs/tutorials/molecules.ipynb +++ b/matverse_guide/docs/tutorials/molecules.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "3f54b5a1", + "id": "591d68f0", "metadata": {}, "source": [ "# Molecules\n", @@ -27,13 +27,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "de2add3a", + "id": "57632133", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:42.789015Z", - "iopub.status.busy": "2026-08-05T21:36:42.788894Z", - "iopub.status.idle": "2026-08-05T21:36:51.076061Z", - "shell.execute_reply": "2026-08-05T21:36:51.075438Z" + "iopub.execute_input": "2026-08-06T05:20:01.609288Z", + "iopub.status.busy": "2026-08-06T05:20:01.609170Z", + "iopub.status.idle": "2026-08-06T05:20:10.735796Z", + "shell.execute_reply": "2026-08-06T05:20:10.735048Z" } }, "outputs": [ @@ -77,7 +77,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -93,7 +93,7 @@ }, { "cell_type": "markdown", - "id": "ca6f13fd", + "id": "09532cc1", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -105,13 +105,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "d85eeabc", + "id": "109cda11", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:51.078499Z", - "iopub.status.busy": "2026-08-05T21:36:51.077985Z", - "iopub.status.idle": "2026-08-05T21:36:51.103971Z", - "shell.execute_reply": "2026-08-05T21:36:51.103358Z" + "iopub.execute_input": "2026-08-06T05:20:10.737347Z", + "iopub.status.busy": "2026-08-06T05:20:10.736861Z", + "iopub.status.idle": "2026-08-06T05:20:10.749514Z", + "shell.execute_reply": "2026-08-06T05:20:10.748949Z" } }, "outputs": [ @@ -155,13 +155,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "e30cfe71", + "id": "ad344a1c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:51.105591Z", - "iopub.status.busy": "2026-08-05T21:36:51.105437Z", - "iopub.status.idle": "2026-08-05T21:36:51.113628Z", - "shell.execute_reply": "2026-08-05T21:36:51.113201Z" + "iopub.execute_input": "2026-08-06T05:20:10.750838Z", + "iopub.status.busy": "2026-08-06T05:20:10.750728Z", + "iopub.status.idle": "2026-08-06T05:20:10.759108Z", + "shell.execute_reply": "2026-08-06T05:20:10.758410Z" } }, "outputs": [ @@ -245,7 +245,7 @@ }, { "cell_type": "markdown", - "id": "23c74e4e", + "id": "773f01f3", "metadata": {}, "source": [ "The composition matrix, built without being asked, exactly as for a crystal.\n", @@ -255,13 +255,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "14972134", + "id": "80396781", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:51.114947Z", - "iopub.status.busy": "2026-08-05T21:36:51.114745Z", - "iopub.status.idle": "2026-08-05T21:36:51.136081Z", - "shell.execute_reply": "2026-08-05T21:36:51.135535Z" + "iopub.execute_input": "2026-08-06T05:20:10.760150Z", + "iopub.status.busy": "2026-08-06T05:20:10.760049Z", + "iopub.status.idle": "2026-08-06T05:20:10.769101Z", + "shell.execute_reply": "2026-08-06T05:20:10.768592Z" } }, "outputs": [ @@ -356,7 +356,7 @@ }, { "cell_type": "markdown", - "id": "f3353432", + "id": "b565f73e", "metadata": {}, "source": [ "`volume` and `density` are NaN, because they are properties of a *cell* and a\n", @@ -367,13 +367,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "7643a6e1", + "id": "005bba9f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:51.137509Z", - "iopub.status.busy": "2026-08-05T21:36:51.137366Z", - "iopub.status.idle": "2026-08-05T21:36:51.166130Z", - "shell.execute_reply": "2026-08-05T21:36:51.165551Z" + "iopub.execute_input": "2026-08-06T05:20:10.770320Z", + "iopub.status.busy": "2026-08-06T05:20:10.770203Z", + "iopub.status.idle": "2026-08-06T05:20:10.787176Z", + "shell.execute_reply": "2026-08-06T05:20:10.786532Z" } }, "outputs": [ @@ -447,7 +447,7 @@ }, { "cell_type": "markdown", - "id": "56391c9a", + "id": "59bbece6", "metadata": {}, "source": [ "## Symmetry\n", @@ -458,13 +458,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "7ba0716c", + "id": "d7874133", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:51.167322Z", - "iopub.status.busy": "2026-08-05T21:36:51.167170Z", - "iopub.status.idle": "2026-08-05T21:36:51.196105Z", - "shell.execute_reply": "2026-08-05T21:36:51.195540Z" + "iopub.execute_input": "2026-08-06T05:20:10.788222Z", + "iopub.status.busy": "2026-08-06T05:20:10.788110Z", + "iopub.status.idle": "2026-08-06T05:20:10.805441Z", + "shell.execute_reply": "2026-08-06T05:20:10.804752Z" } }, "outputs": [ @@ -555,7 +555,7 @@ }, { "cell_type": "markdown", - "id": "0452eb89", + "id": "8fe93da1", "metadata": {}, "source": [ "C2v for water, **Td** for methane, C3v for ammonia, Cs for ethanol — the\n", @@ -577,13 +577,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "a3703d7d", + "id": "09659d48", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:51.197262Z", - "iopub.status.busy": "2026-08-05T21:36:51.197115Z", - "iopub.status.idle": "2026-08-05T21:36:51.459354Z", - "shell.execute_reply": "2026-08-05T21:36:51.458733Z" + "iopub.execute_input": "2026-08-06T05:20:10.806564Z", + "iopub.status.busy": "2026-08-06T05:20:10.806449Z", + "iopub.status.idle": "2026-08-06T05:20:10.931507Z", + "shell.execute_reply": "2026-08-06T05:20:10.930777Z" } }, "outputs": [ @@ -622,7 +622,7 @@ }, { "cell_type": "markdown", - "id": "89502494", + "id": "4483f762", "metadata": {}, "source": [ "## Bonds\n", @@ -635,13 +635,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "8365464c", + "id": "99b94367", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:51.460768Z", - "iopub.status.busy": "2026-08-05T21:36:51.460624Z", - "iopub.status.idle": "2026-08-05T21:36:52.016836Z", - "shell.execute_reply": "2026-08-05T21:36:52.016217Z" + "iopub.execute_input": "2026-08-06T05:20:10.932773Z", + "iopub.status.busy": "2026-08-06T05:20:10.932636Z", + "iopub.status.idle": "2026-08-06T05:20:11.291293Z", + "shell.execute_reply": "2026-08-06T05:20:11.290491Z" } }, "outputs": [ @@ -665,7 +665,7 @@ }, { "cell_type": "markdown", - "id": "fd1ce922", + "id": "909adf54", "metadata": {}, "source": [ "Different *perception*, though. A crystal's neighbours come from Voronoi solid\n", @@ -676,13 +676,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "d4caf5a5", + "id": "193c9ff3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.018557Z", - "iopub.status.busy": "2026-08-05T21:36:52.017965Z", - "iopub.status.idle": "2026-08-05T21:36:52.021852Z", - "shell.execute_reply": "2026-08-05T21:36:52.021412Z" + "iopub.execute_input": "2026-08-06T05:20:11.292950Z", + "iopub.status.busy": "2026-08-06T05:20:11.292407Z", + "iopub.status.idle": "2026-08-06T05:20:11.296348Z", + "shell.execute_reply": "2026-08-06T05:20:11.295905Z" } }, "outputs": [ @@ -705,7 +705,7 @@ }, { "cell_type": "markdown", - "id": "4ef23fea", + "id": "3f94f0e0", "metadata": {}, "source": [ "## Descriptors that need the graph" @@ -714,13 +714,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "6ac3765e", + "id": "0dda6913", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.022920Z", - "iopub.status.busy": "2026-08-05T21:36:52.022819Z", - "iopub.status.idle": "2026-08-05T21:36:52.042751Z", - "shell.execute_reply": "2026-08-05T21:36:52.042132Z" + "iopub.execute_input": "2026-08-06T05:20:11.297942Z", + "iopub.status.busy": "2026-08-06T05:20:11.297530Z", + "iopub.status.idle": "2026-08-06T05:20:11.314312Z", + "shell.execute_reply": "2026-08-06T05:20:11.313561Z" } }, "outputs": [ @@ -816,7 +816,7 @@ }, { "cell_type": "markdown", - "id": "8b7e0278", + "id": "fccc58f1", "metadata": {}, "source": [ "Ethanol has **two rotatable bonds** — C–C and C–O. The C–H bonds are terminal\n", @@ -840,13 +840,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "2fcbb502", + "id": "2944937c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.043835Z", - "iopub.status.busy": "2026-08-05T21:36:52.043724Z", - "iopub.status.idle": "2026-08-05T21:36:52.074001Z", - "shell.execute_reply": "2026-08-05T21:36:52.073454Z" + "iopub.execute_input": "2026-08-06T05:20:11.315476Z", + "iopub.status.busy": "2026-08-06T05:20:11.315349Z", + "iopub.status.idle": "2026-08-06T05:20:11.339794Z", + "shell.execute_reply": "2026-08-06T05:20:11.339338Z" } }, "outputs": [ @@ -985,13 +985,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "a7424c34", + "id": "ba51bad9", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.075031Z", - "iopub.status.busy": "2026-08-05T21:36:52.074930Z", - "iopub.status.idle": "2026-08-05T21:36:52.078598Z", - "shell.execute_reply": "2026-08-05T21:36:52.078135Z" + "iopub.execute_input": "2026-08-06T05:20:11.340894Z", + "iopub.status.busy": "2026-08-06T05:20:11.340765Z", + "iopub.status.idle": "2026-08-06T05:20:11.345119Z", + "shell.execute_reply": "2026-08-06T05:20:11.344701Z" } }, "outputs": [ @@ -1012,7 +1012,7 @@ }, { "cell_type": "markdown", - "id": "7122f8b2", + "id": "53311b50", "metadata": {}, "source": [ "Every cut splits nine atoms into pieces that still total nine — mass is\n", @@ -1034,13 +1034,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "d0cec674", + "id": "30298c78", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.079567Z", - "iopub.status.busy": "2026-08-05T21:36:52.079469Z", - "iopub.status.idle": "2026-08-05T21:36:52.085772Z", - "shell.execute_reply": "2026-08-05T21:36:52.085298Z" + "iopub.execute_input": "2026-08-06T05:20:11.346182Z", + "iopub.status.busy": "2026-08-06T05:20:11.346066Z", + "iopub.status.idle": "2026-08-06T05:20:11.352726Z", + "shell.execute_reply": "2026-08-06T05:20:11.352254Z" } }, "outputs": [ @@ -1112,7 +1112,7 @@ }, { "cell_type": "markdown", - "id": "523192c9", + "id": "9351c8e5", "metadata": {}, "source": [ "Ring bonds are not cut, because one cut cannot separate a ring — the molecule\n", @@ -1133,13 +1133,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "44c1e66f", + "id": "7b77b3e9", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.087155Z", - "iopub.status.busy": "2026-08-05T21:36:52.086666Z", - "iopub.status.idle": "2026-08-05T21:36:52.101571Z", - "shell.execute_reply": "2026-08-05T21:36:52.101057Z" + "iopub.execute_input": "2026-08-06T05:20:11.353966Z", + "iopub.status.busy": "2026-08-06T05:20:11.353845Z", + "iopub.status.idle": "2026-08-06T05:20:11.368829Z", + "shell.execute_reply": "2026-08-06T05:20:11.368235Z" } }, "outputs": [ @@ -1223,13 +1223,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "fab1878c", + "id": "adeb8cc2", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.102579Z", - "iopub.status.busy": "2026-08-05T21:36:52.102480Z", - "iopub.status.idle": "2026-08-05T21:36:52.117765Z", - "shell.execute_reply": "2026-08-05T21:36:52.117071Z" + "iopub.execute_input": "2026-08-06T05:20:11.369993Z", + "iopub.status.busy": "2026-08-06T05:20:11.369883Z", + "iopub.status.idle": "2026-08-06T05:20:11.373489Z", + "shell.execute_reply": "2026-08-06T05:20:11.372988Z" } }, "outputs": [ @@ -1256,7 +1256,7 @@ }, { "cell_type": "markdown", - "id": "795cb61c", + "id": "6d0467cc", "metadata": {}, "source": [ "The translated copy of water is recognised: matching is on the reduced formula\n", @@ -1272,13 +1272,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "8a624ffa", + "id": "0659bb3d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.121429Z", - "iopub.status.busy": "2026-08-05T21:36:52.121267Z", - "iopub.status.idle": "2026-08-05T21:36:52.276835Z", - "shell.execute_reply": "2026-08-05T21:36:52.276300Z" + "iopub.execute_input": "2026-08-06T05:20:11.375053Z", + "iopub.status.busy": "2026-08-06T05:20:11.374634Z", + "iopub.status.idle": "2026-08-06T05:20:11.529047Z", + "shell.execute_reply": "2026-08-06T05:20:11.528526Z" } }, "outputs": [ @@ -1315,7 +1315,7 @@ }, { "cell_type": "markdown", - "id": "41e97ece", + "id": "56b02eb4", "metadata": {}, "source": [ "Crude, and it needs nothing extra. With `py3Dmol` installed the default backend\n", @@ -1332,13 +1332,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "4ab11564", + "id": "1a841d19", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.277897Z", - "iopub.status.busy": "2026-08-05T21:36:52.277788Z", - "iopub.status.idle": "2026-08-05T21:36:52.294316Z", - "shell.execute_reply": "2026-08-05T21:36:52.293784Z" + "iopub.execute_input": "2026-08-06T05:20:11.530509Z", + "iopub.status.busy": "2026-08-06T05:20:11.530381Z", + "iopub.status.idle": "2026-08-06T05:20:11.547728Z", + "shell.execute_reply": "2026-08-06T05:20:11.547268Z" } }, "outputs": [ @@ -1432,7 +1432,7 @@ }, { "cell_type": "markdown", - "id": "89b77b74", + "id": "f972be05", "metadata": {}, "source": [ "QC, composition descriptors and even a calculator run unmodified. EMT is\n", @@ -1448,13 +1448,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "0ac45f7d", + "id": "4ab7761d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.295338Z", - "iopub.status.busy": "2026-08-05T21:36:52.295226Z", - "iopub.status.idle": "2026-08-05T21:36:52.304763Z", - "shell.execute_reply": "2026-08-05T21:36:52.304201Z" + "iopub.execute_input": "2026-08-06T05:20:11.548849Z", + "iopub.status.busy": "2026-08-06T05:20:11.548722Z", + "iopub.status.idle": "2026-08-06T05:20:11.557092Z", + "shell.execute_reply": "2026-08-06T05:20:11.556594Z" } }, "outputs": [ @@ -1475,7 +1475,7 @@ }, { "cell_type": "markdown", - "id": "4b1fbb95", + "id": "521affb6", "metadata": {}, "source": [ "```{seealso}\n", @@ -1487,7 +1487,7 @@ }, { "cell_type": "markdown", - "id": "a42abdad", + "id": "c49d8465", "metadata": {}, "source": [ "## Are the bonds the right length?\n", @@ -1502,13 +1502,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "054de4d5", + "id": "08d7fbd6", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.305849Z", - "iopub.status.busy": "2026-08-05T21:36:52.305730Z", - "iopub.status.idle": "2026-08-05T21:36:52.327921Z", - "shell.execute_reply": "2026-08-05T21:36:52.327210Z" + "iopub.execute_input": "2026-08-06T05:20:11.558625Z", + "iopub.status.busy": "2026-08-06T05:20:11.558187Z", + "iopub.status.idle": "2026-08-06T05:20:11.577461Z", + "shell.execute_reply": "2026-08-06T05:20:11.576650Z" } }, "outputs": [ @@ -1608,7 +1608,7 @@ }, { "cell_type": "markdown", - "id": "0eaec02d", + "id": "9807f9ad", "metadata": {}, "source": [ "Water comes out at **zero** deviation, because it was built at exactly the\n", @@ -1630,7 +1630,7 @@ }, { "cell_type": "markdown", - "id": "6c5a09bc", + "id": "9dbca437", "metadata": {}, "source": [ "## Two questions that both mean \"the same molecule\"\n", @@ -1646,13 +1646,13 @@ { "cell_type": "code", "execution_count": 20, - "id": "b5517ee3", + "id": "739a25f0", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.329010Z", - "iopub.status.busy": "2026-08-05T21:36:52.328902Z", - "iopub.status.idle": "2026-08-05T21:36:52.340900Z", - "shell.execute_reply": "2026-08-05T21:36:52.340412Z" + "iopub.execute_input": "2026-08-06T05:20:11.578531Z", + "iopub.status.busy": "2026-08-06T05:20:11.578413Z", + "iopub.status.idle": "2026-08-06T05:20:11.616407Z", + "shell.execute_reply": "2026-08-06T05:20:11.615706Z" } }, "outputs": [ @@ -1682,7 +1682,7 @@ }, { "cell_type": "markdown", - "id": "910ea018", + "id": "a31a691f", "metadata": {}, "source": [ "**Geometry says two molecules. Topology says one.**\n", @@ -1699,7 +1699,7 @@ }, { "cell_type": "markdown", - "id": "9a9a82c9", + "id": "c4404e37", "metadata": {}, "source": [ "## Which bond breaks first\n", @@ -1713,13 +1713,13 @@ { "cell_type": "code", "execution_count": 21, - "id": "9fa05c8b", + "id": "0c3f3ef4", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.348181Z", - "iopub.status.busy": "2026-08-05T21:36:52.341781Z", - "iopub.status.idle": "2026-08-05T21:36:52.392407Z", - "shell.execute_reply": "2026-08-05T21:36:52.383945Z" + "iopub.execute_input": "2026-08-06T05:20:11.617556Z", + "iopub.status.busy": "2026-08-06T05:20:11.617428Z", + "iopub.status.idle": "2026-08-06T05:20:11.643967Z", + "shell.execute_reply": "2026-08-06T05:20:11.643262Z" } }, "outputs": [ @@ -1842,7 +1842,7 @@ }, { "cell_type": "markdown", - "id": "78238e39", + "id": "36067e8b", "metadata": {}, "source": [ "Eight bonds, one row each, every one named. With the placeholder energies above\n", @@ -1867,7 +1867,7 @@ }, { "cell_type": "markdown", - "id": "2a31cefc", + "id": "fb9a0bef", "metadata": {}, "source": [ "## What is actually on the molecule\n", @@ -1884,13 +1884,13 @@ { "cell_type": "code", "execution_count": 22, - "id": "b38083ae", + "id": "471df0c1", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.393813Z", - "iopub.status.busy": "2026-08-05T21:36:52.393668Z", - "iopub.status.idle": "2026-08-05T21:36:52.416132Z", - "shell.execute_reply": "2026-08-05T21:36:52.415304Z" + "iopub.execute_input": "2026-08-06T05:20:11.645088Z", + "iopub.status.busy": "2026-08-06T05:20:11.644961Z", + "iopub.status.idle": "2026-08-06T05:20:11.655514Z", + "shell.execute_reply": "2026-08-06T05:20:11.654863Z" } }, "outputs": [ @@ -1929,7 +1929,7 @@ }, { "cell_type": "markdown", - "id": "b3349250", + "id": "1b31fa8d", "metadata": {}, "source": [ "Ethanol comes back as `[CH3];[OH]` — a methyl and a hydroxyl, which is what it\n", @@ -1952,7 +1952,7 @@ }, { "cell_type": "markdown", - "id": "64cf9bc0", + "id": "5d486a90", "metadata": {}, "source": [ "## Free energies, and the mode you trust least\n", @@ -1970,13 +1970,13 @@ { "cell_type": "code", "execution_count": 23, - "id": "aeed8a51", + "id": "0fab2c8f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.417403Z", - "iopub.status.busy": "2026-08-05T21:36:52.417252Z", - "iopub.status.idle": "2026-08-05T21:36:52.442335Z", - "shell.execute_reply": "2026-08-05T21:36:52.441302Z" + "iopub.execute_input": "2026-08-06T05:20:11.656653Z", + "iopub.status.busy": "2026-08-06T05:20:11.656537Z", + "iopub.status.idle": "2026-08-06T05:20:11.669623Z", + "shell.execute_reply": "2026-08-06T05:20:11.668963Z" } }, "outputs": [ @@ -2055,7 +2055,7 @@ }, { "cell_type": "markdown", - "id": "3facb367", + "id": "85a6abb3", "metadata": {}, "source": [ "Same molecule, same energy, one mode moved. The stiff case agrees to four\n", diff --git a/matverse_guide/docs/tutorials/screening.ipynb b/matverse_guide/docs/tutorials/screening.ipynb index 4725203..81865b4 100644 --- a/matverse_guide/docs/tutorials/screening.ipynb +++ b/matverse_guide/docs/tutorials/screening.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "e9ce6f87", + "id": "c3109075", "metadata": {}, "source": [ "# Screening, end to end\n", @@ -26,13 +26,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "360ad4fd", + "id": "a7221752", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:12.643566Z", - "iopub.status.busy": "2026-08-05T21:18:12.643485Z", - "iopub.status.idle": "2026-08-05T21:18:18.527875Z", - "shell.execute_reply": "2026-08-05T21:18:18.527222Z" + "iopub.execute_input": "2026-08-06T04:54:19.341575Z", + "iopub.status.busy": "2026-08-06T04:54:19.341456Z", + "iopub.status.idle": "2026-08-06T04:54:25.786266Z", + "shell.execute_reply": "2026-08-06T04:54:25.785766Z" } }, "outputs": [ @@ -76,7 +76,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -91,7 +91,7 @@ }, { "cell_type": "markdown", - "id": "8557f21e", + "id": "a82f63fa", "metadata": {}, "source": [ "## Build a dataset\n", @@ -103,13 +103,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "ee8849f9", + "id": "dc27a21e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:18.529541Z", - "iopub.status.busy": "2026-08-05T21:18:18.528970Z", - "iopub.status.idle": "2026-08-05T21:18:18.543371Z", - "shell.execute_reply": "2026-08-05T21:18:18.542888Z" + "iopub.execute_input": "2026-08-06T04:54:25.788074Z", + "iopub.status.busy": "2026-08-06T04:54:25.787517Z", + "iopub.status.idle": "2026-08-06T04:54:25.801047Z", + "shell.execute_reply": "2026-08-06T04:54:25.800775Z" } }, "outputs": [ @@ -177,7 +177,7 @@ }, { "cell_type": "markdown", - "id": "3173349f", + "id": "7f69af9b", "metadata": {}, "source": [ "The candidates are L1₂ orderings of the same three elements, plus a B2 AlNi.\n", @@ -188,13 +188,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "9ffcc08d", + "id": "2d5e4c31", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:18.544399Z", - "iopub.status.busy": "2026-08-05T21:18:18.544288Z", - "iopub.status.idle": "2026-08-05T21:18:18.547460Z", - "shell.execute_reply": "2026-08-05T21:18:18.546925Z" + "iopub.execute_input": "2026-08-06T04:54:25.802031Z", + "iopub.status.busy": "2026-08-06T04:54:25.801891Z", + "iopub.status.idle": "2026-08-06T04:54:25.807353Z", + "shell.execute_reply": "2026-08-06T04:54:25.807074Z" } }, "outputs": [], @@ -225,7 +225,7 @@ }, { "cell_type": "markdown", - "id": "7e8ec7a3", + "id": "c8f6e9b8", "metadata": {}, "source": [ "Put the published elementals and the candidates into one object. Building it in\n", @@ -236,13 +236,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "69ee8ac3", + "id": "a4e94a8d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:18.548512Z", - "iopub.status.busy": "2026-08-05T21:18:18.548422Z", - "iopub.status.idle": "2026-08-05T21:18:18.555698Z", - "shell.execute_reply": "2026-08-05T21:18:18.554991Z" + "iopub.execute_input": "2026-08-06T04:54:25.808410Z", + "iopub.status.busy": "2026-08-06T04:54:25.808276Z", + "iopub.status.idle": "2026-08-06T04:54:25.814783Z", + "shell.execute_reply": "2026-08-06T04:54:25.814520Z" } }, "outputs": [ @@ -268,7 +268,7 @@ }, { "cell_type": "markdown", - "id": "c7b26ffd", + "id": "13e4d52e", "metadata": {}, "source": [ "Seven materials, three elements. `X` is already the composition matrix and `var`\n", @@ -289,13 +289,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "d4db7e20", + "id": "eb99d0e4", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:18.556544Z", - "iopub.status.busy": "2026-08-05T21:18:18.556451Z", - "iopub.status.idle": "2026-08-05T21:18:18.666144Z", - "shell.execute_reply": "2026-08-05T21:18:18.665760Z" + "iopub.execute_input": "2026-08-06T04:54:25.815643Z", + "iopub.status.busy": "2026-08-06T04:54:25.815512Z", + "iopub.status.idle": "2026-08-06T04:54:25.929944Z", + "shell.execute_reply": "2026-08-06T04:54:25.929660Z" } }, "outputs": [ @@ -397,7 +397,7 @@ }, { "cell_type": "markdown", - "id": "264ce899", + "id": "a33784e4", "metadata": {}, "source": [ "`standardize` deposits two new structure variants rather than replacing the\n", @@ -407,13 +407,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "faedb03f", + "id": "d14b3364", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:18.667221Z", - "iopub.status.busy": "2026-08-05T21:18:18.667126Z", - "iopub.status.idle": "2026-08-05T21:18:18.669379Z", - "shell.execute_reply": "2026-08-05T21:18:18.668991Z" + "iopub.execute_input": "2026-08-06T04:54:25.930860Z", + "iopub.status.busy": "2026-08-06T04:54:25.930716Z", + "iopub.status.idle": "2026-08-06T04:54:25.932775Z", + "shell.execute_reply": "2026-08-06T04:54:25.932535Z" } }, "outputs": [ @@ -434,7 +434,7 @@ }, { "cell_type": "markdown", - "id": "b36c066d", + "id": "43505b01", "metadata": {}, "source": [ "## Throw out what is broken\n", @@ -448,13 +448,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "bb85a1c0", + "id": "e30a6b6c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:18.670191Z", - "iopub.status.busy": "2026-08-05T21:18:18.670105Z", - "iopub.status.idle": "2026-08-05T21:18:18.940585Z", - "shell.execute_reply": "2026-08-05T21:18:18.939943Z" + "iopub.execute_input": "2026-08-06T04:54:25.933613Z", + "iopub.status.busy": "2026-08-06T04:54:25.933484Z", + "iopub.status.idle": "2026-08-06T04:54:26.205134Z", + "shell.execute_reply": "2026-08-06T04:54:26.204833Z" } }, "outputs": [ @@ -571,13 +571,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "c1873cce", + "id": "9c5f7d3e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:18.941913Z", - "iopub.status.busy": "2026-08-05T21:18:18.941770Z", - "iopub.status.idle": "2026-08-05T21:18:18.950618Z", - "shell.execute_reply": "2026-08-05T21:18:18.950137Z" + "iopub.execute_input": "2026-08-06T04:54:26.206065Z", + "iopub.status.busy": "2026-08-06T04:54:26.205922Z", + "iopub.status.idle": "2026-08-06T04:54:26.212288Z", + "shell.execute_reply": "2026-08-06T04:54:26.212028Z" } }, "outputs": [ @@ -599,7 +599,7 @@ }, { "cell_type": "markdown", - "id": "1cfc7580", + "id": "71be0cf0", "metadata": {}, "source": [ "This is one of the few calls that returns instead of depositing, because AnnData\n", @@ -611,13 +611,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "89a1c907", + "id": "b736265c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:18.951602Z", - "iopub.status.busy": "2026-08-05T21:18:18.951496Z", - "iopub.status.idle": "2026-08-05T21:18:18.955602Z", - "shell.execute_reply": "2026-08-05T21:18:18.955186Z" + "iopub.execute_input": "2026-08-06T04:54:26.213165Z", + "iopub.status.busy": "2026-08-06T04:54:26.213028Z", + "iopub.status.idle": "2026-08-06T04:54:26.216738Z", + "shell.execute_reply": "2026-08-06T04:54:26.216493Z" } }, "outputs": [ @@ -644,7 +644,7 @@ }, { "cell_type": "markdown", - "id": "a2586eac", + "id": "21268774", "metadata": {}, "source": [ "`dedup` blocks on `(reduced formula, space group)` before running pymatgen's\n", @@ -658,13 +658,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "9419a8ba", + "id": "6ef02b46", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:18.956476Z", - "iopub.status.busy": "2026-08-05T21:18:18.956387Z", - "iopub.status.idle": "2026-08-05T21:18:19.153030Z", - "shell.execute_reply": "2026-08-05T21:18:19.152515Z" + "iopub.execute_input": "2026-08-06T04:54:26.218477Z", + "iopub.status.busy": "2026-08-06T04:54:26.218345Z", + "iopub.status.idle": "2026-08-06T04:54:27.843788Z", + "shell.execute_reply": "2026-08-06T04:54:27.843421Z" } }, "outputs": [ @@ -774,7 +774,7 @@ }, { "cell_type": "markdown", - "id": "aca68bed", + "id": "f0d79c76", "metadata": {}, "source": [ "The relaxed geometry becomes its own variant, `relaxed_emt`, rather than\n", @@ -787,13 +787,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "3bb929a1", + "id": "fa676ec3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:19.154145Z", - "iopub.status.busy": "2026-08-05T21:18:19.154050Z", - "iopub.status.idle": "2026-08-05T21:18:19.156341Z", - "shell.execute_reply": "2026-08-05T21:18:19.155982Z" + "iopub.execute_input": "2026-08-06T04:54:27.844933Z", + "iopub.status.busy": "2026-08-06T04:54:27.844844Z", + "iopub.status.idle": "2026-08-06T04:54:27.847130Z", + "shell.execute_reply": "2026-08-06T04:54:27.846837Z" } }, "outputs": [ @@ -825,7 +825,7 @@ }, { "cell_type": "markdown", - "id": "f805c8b1", + "id": "84838104", "metadata": {}, "source": [ "`surrogate: True` and `license: 'LGPL-2.1'` are not decoration. The first is\n", @@ -839,13 +839,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "9f404a7e", + "id": "65f75f45", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:19.157228Z", - "iopub.status.busy": "2026-08-05T21:18:19.157143Z", - "iopub.status.idle": "2026-08-05T21:18:19.489385Z", - "shell.execute_reply": "2026-08-05T21:18:19.488884Z" + "iopub.execute_input": "2026-08-06T04:54:27.848064Z", + "iopub.status.busy": "2026-08-06T04:54:27.847981Z", + "iopub.status.idle": "2026-08-06T04:54:28.859679Z", + "shell.execute_reply": "2026-08-06T04:54:28.859255Z" } }, "outputs": [ @@ -955,7 +955,7 @@ }, { "cell_type": "markdown", - "id": "579c7890", + "id": "e06db49f", "metadata": {}, "source": [ "```{warning}\n", @@ -984,13 +984,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "e94b8af7", + "id": "f6c113b2", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:19.490732Z", - "iopub.status.busy": "2026-08-05T21:18:19.490619Z", - "iopub.status.idle": "2026-08-05T21:18:19.645749Z", - "shell.execute_reply": "2026-08-05T21:18:19.645210Z" + "iopub.execute_input": "2026-08-06T04:54:28.860928Z", + "iopub.status.busy": "2026-08-06T04:54:28.860778Z", + "iopub.status.idle": "2026-08-06T04:54:29.054617Z", + "shell.execute_reply": "2026-08-06T04:54:29.054263Z" } }, "outputs": [ @@ -1016,7 +1016,7 @@ }, { "cell_type": "markdown", - "id": "0441587e", + "id": "c9e32a0b", "metadata": {}, "source": [ "The hull plot labels itself when the hull is closed, because a convex hull drawn\n", @@ -1031,13 +1031,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "ca6be7d2", + "id": "7ad28441", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:19.646793Z", - "iopub.status.busy": "2026-08-05T21:18:19.646694Z", - "iopub.status.idle": "2026-08-05T21:18:19.648979Z", - "shell.execute_reply": "2026-08-05T21:18:19.648620Z" + "iopub.execute_input": "2026-08-06T04:54:29.055520Z", + "iopub.status.busy": "2026-08-06T04:54:29.055426Z", + "iopub.status.idle": "2026-08-06T04:54:29.057784Z", + "shell.execute_reply": "2026-08-06T04:54:29.057532Z" } }, "outputs": [ @@ -1058,7 +1058,7 @@ }, { "cell_type": "markdown", - "id": "cbf3c744", + "id": "c7edfc92", "metadata": {}, "source": [ "The object records which kind of number you have, so a later reader does not\n", @@ -1090,13 +1090,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "ab2a9cc3", + "id": "0a4a1649", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:19.649786Z", - "iopub.status.busy": "2026-08-05T21:18:19.649701Z", - "iopub.status.idle": "2026-08-05T21:18:19.824001Z", - "shell.execute_reply": "2026-08-05T21:18:19.823490Z" + "iopub.execute_input": "2026-08-06T04:54:29.058541Z", + "iopub.status.busy": "2026-08-06T04:54:29.058458Z", + "iopub.status.idle": "2026-08-06T04:54:29.396248Z", + "shell.execute_reply": "2026-08-06T04:54:29.395657Z" } }, "outputs": [ @@ -1195,7 +1195,7 @@ }, { "cell_type": "markdown", - "id": "01b166d9", + "id": "3dfdde69", "metadata": {}, "source": [ "Three rows, three different answers, none of them small.\n", @@ -1224,13 +1224,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "a2477a17", + "id": "65857919", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:19.824960Z", - "iopub.status.busy": "2026-08-05T21:18:19.824867Z", - "iopub.status.idle": "2026-08-05T21:18:19.827199Z", - "shell.execute_reply": "2026-08-05T21:18:19.826721Z" + "iopub.execute_input": "2026-08-06T04:54:29.397205Z", + "iopub.status.busy": "2026-08-06T04:54:29.397063Z", + "iopub.status.idle": "2026-08-06T04:54:29.399232Z", + "shell.execute_reply": "2026-08-06T04:54:29.398980Z" } }, "outputs": [ @@ -1258,7 +1258,7 @@ }, { "cell_type": "markdown", - "id": "b35627e8", + "id": "98daccb4", "metadata": {}, "source": [ "### What it would cost, and whether you could get it\n", @@ -1270,13 +1270,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "83461386", + "id": "098c0d21", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:19.828416Z", - "iopub.status.busy": "2026-08-05T21:18:19.828323Z", - "iopub.status.idle": "2026-08-05T21:18:20.461392Z", - "shell.execute_reply": "2026-08-05T21:18:20.460775Z" + "iopub.execute_input": "2026-08-06T04:54:29.400012Z", + "iopub.status.busy": "2026-08-06T04:54:29.399873Z", + "iopub.status.idle": "2026-08-06T04:54:30.119787Z", + "shell.execute_reply": "2026-08-06T04:54:30.119473Z" } }, "outputs": [ @@ -1359,7 +1359,7 @@ }, { "cell_type": "markdown", - "id": "ddcfbf7f", + "id": "ad4443cd", "metadata": {}, "source": [ "`cost_per_kg` is raw-material cost from elemental prices — not synthesis, not\n", @@ -1379,13 +1379,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "f5ba859d", + "id": "274c6b03", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.462445Z", - "iopub.status.busy": "2026-08-05T21:18:20.462349Z", - "iopub.status.idle": "2026-08-05T21:18:20.490708Z", - "shell.execute_reply": "2026-08-05T21:18:20.490091Z" + "iopub.execute_input": "2026-08-06T04:54:30.120804Z", + "iopub.status.busy": "2026-08-06T04:54:30.120714Z", + "iopub.status.idle": "2026-08-06T04:54:30.146475Z", + "shell.execute_reply": "2026-08-06T04:54:30.146121Z" } }, "outputs": [ @@ -1407,7 +1407,7 @@ }, { "cell_type": "markdown", - "id": "69c063bc", + "id": "edb239e7", "metadata": {}, "source": [ "And since the diffraction pattern is on the same grid convention, a neutron\n", @@ -1418,7 +1418,7 @@ }, { "cell_type": "markdown", - "id": "08cbc035", + "id": "64cd2f91", "metadata": {}, "source": [ "### Stable, and stable *when*\n", @@ -1431,13 +1431,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "592c7b75", + "id": "659d16da", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.491705Z", - "iopub.status.busy": "2026-08-05T21:18:20.491614Z", - "iopub.status.idle": "2026-08-05T21:18:20.573622Z", - "shell.execute_reply": "2026-08-05T21:18:20.573196Z" + "iopub.execute_input": "2026-08-06T04:54:30.147391Z", + "iopub.status.busy": "2026-08-06T04:54:30.147274Z", + "iopub.status.idle": "2026-08-06T04:54:30.233378Z", + "shell.execute_reply": "2026-08-06T04:54:30.232452Z" } }, "outputs": [ @@ -1531,7 +1531,7 @@ }, { "cell_type": "markdown", - "id": "2e8a0b93", + "id": "bdd75ea7", "metadata": {}, "source": [ "`chempot_window` is the extent of the region in chemical potential space where\n", @@ -1563,13 +1563,13 @@ { "cell_type": "code", "execution_count": 20, - "id": "322760f0", + "id": "462d280c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.574721Z", - "iopub.status.busy": "2026-08-05T21:18:20.574623Z", - "iopub.status.idle": "2026-08-05T21:18:20.577208Z", - "shell.execute_reply": "2026-08-05T21:18:20.576731Z" + "iopub.execute_input": "2026-08-06T04:54:30.234321Z", + "iopub.status.busy": "2026-08-06T04:54:30.234195Z", + "iopub.status.idle": "2026-08-06T04:54:30.236722Z", + "shell.execute_reply": "2026-08-06T04:54:30.236363Z" } }, "outputs": [ @@ -1591,7 +1591,7 @@ }, { "cell_type": "markdown", - "id": "f7f8b0e1", + "id": "eb376ece", "metadata": {}, "source": [ "It refuses without a key, and the message says why rather than returning zeros.\n", @@ -1604,7 +1604,7 @@ }, { "cell_type": "markdown", - "id": "68351400", + "id": "dff678f9", "metadata": {}, "source": [ "Ask for something light and not too far above the hull — two criteria that pull\n", @@ -1614,13 +1614,13 @@ { "cell_type": "code", "execution_count": 21, - "id": "40998dd7", + "id": "fa6e9a42", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.578109Z", - "iopub.status.busy": "2026-08-05T21:18:20.578021Z", - "iopub.status.idle": "2026-08-05T21:18:20.580711Z", - "shell.execute_reply": "2026-08-05T21:18:20.580302Z" + "iopub.execute_input": "2026-08-06T04:54:30.237483Z", + "iopub.status.busy": "2026-08-06T04:54:30.237396Z", + "iopub.status.idle": "2026-08-06T04:54:30.240007Z", + "shell.execute_reply": "2026-08-06T04:54:30.239631Z" } }, "outputs": [ @@ -1646,13 +1646,13 @@ { "cell_type": "code", "execution_count": 22, - "id": "10fd2e24", + "id": "0b44b884", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.581523Z", - "iopub.status.busy": "2026-08-05T21:18:20.581433Z", - "iopub.status.idle": "2026-08-05T21:18:20.586279Z", - "shell.execute_reply": "2026-08-05T21:18:20.585876Z" + "iopub.execute_input": "2026-08-06T04:54:30.240718Z", + "iopub.status.busy": "2026-08-06T04:54:30.240629Z", + "iopub.status.idle": "2026-08-06T04:54:30.245667Z", + "shell.execute_reply": "2026-08-06T04:54:30.245329Z" } }, "outputs": [ @@ -1760,13 +1760,13 @@ { "cell_type": "code", "execution_count": 23, - "id": "29f8454b", + "id": "4d0bd38f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.587091Z", - "iopub.status.busy": "2026-08-05T21:18:20.587007Z", - "iopub.status.idle": "2026-08-05T21:18:20.718221Z", - "shell.execute_reply": "2026-08-05T21:18:20.717734Z" + "iopub.execute_input": "2026-08-06T04:54:30.246422Z", + "iopub.status.busy": "2026-08-06T04:54:30.246319Z", + "iopub.status.idle": "2026-08-06T04:54:30.378719Z", + "shell.execute_reply": "2026-08-06T04:54:30.378394Z" } }, "outputs": [ @@ -1806,7 +1806,7 @@ }, { "cell_type": "markdown", - "id": "6a47a261", + "id": "f742ac68", "metadata": {}, "source": [ "Cu and Ni sit at zero and are still grey — they failed on density, not on\n", @@ -1817,7 +1817,7 @@ }, { "cell_type": "markdown", - "id": "fcdea3ec", + "id": "6871aca6", "metadata": {}, "source": [ "The screen deposits a boolean column and the criteria that produced it. It does\n", @@ -1834,13 +1834,13 @@ { "cell_type": "code", "execution_count": 24, - "id": "be280d86", + "id": "16b95743", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.719376Z", - "iopub.status.busy": "2026-08-05T21:18:20.719278Z", - "iopub.status.idle": "2026-08-05T21:18:20.725693Z", - "shell.execute_reply": "2026-08-05T21:18:20.725309Z" + "iopub.execute_input": "2026-08-06T04:54:30.379699Z", + "iopub.status.busy": "2026-08-06T04:54:30.379603Z", + "iopub.status.idle": "2026-08-06T04:54:30.387206Z", + "shell.execute_reply": "2026-08-06T04:54:30.386758Z" } }, "outputs": [ @@ -1957,7 +1957,7 @@ }, { "cell_type": "markdown", - "id": "20af8ee7", + "id": "a71e8391", "metadata": {}, "source": [ "`pareto_rank` keeps the second-best trade-offs reachable instead of discarding\n", @@ -1969,13 +1969,13 @@ { "cell_type": "code", "execution_count": 25, - "id": "d86847a9", + "id": "76795fcc", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.726656Z", - "iopub.status.busy": "2026-08-05T21:18:20.726566Z", - "iopub.status.idle": "2026-08-05T21:18:20.731664Z", - "shell.execute_reply": "2026-08-05T21:18:20.731250Z" + "iopub.execute_input": "2026-08-06T04:54:30.388095Z", + "iopub.status.busy": "2026-08-06T04:54:30.387989Z", + "iopub.status.idle": "2026-08-06T04:54:30.396485Z", + "shell.execute_reply": "2026-08-06T04:54:30.396168Z" } }, "outputs": [ @@ -2075,7 +2075,7 @@ }, { "cell_type": "markdown", - "id": "65af76b9", + "id": "96ed5a86", "metadata": {}, "source": [ "## Is the reaction downhill?\n", @@ -2088,13 +2088,13 @@ { "cell_type": "code", "execution_count": 26, - "id": "7652a100", + "id": "849961e3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.732601Z", - "iopub.status.busy": "2026-08-05T21:18:20.732518Z", - "iopub.status.idle": "2026-08-05T21:18:20.735716Z", - "shell.execute_reply": "2026-08-05T21:18:20.735410Z" + "iopub.execute_input": "2026-08-06T04:54:30.397684Z", + "iopub.status.busy": "2026-08-06T04:54:30.397595Z", + "iopub.status.idle": "2026-08-06T04:54:30.401004Z", + "shell.execute_reply": "2026-08-06T04:54:30.400659Z" } }, "outputs": [ @@ -2121,7 +2121,7 @@ }, { "cell_type": "markdown", - "id": "99f14c57", + "id": "e82fc115", "metadata": {}, "source": [ "`favourable: False` and a positive energy — EMT again saying no intermetallic is\n", @@ -2133,13 +2133,13 @@ { "cell_type": "code", "execution_count": 27, - "id": "b591584a", + "id": "f4c7eed3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.736756Z", - "iopub.status.busy": "2026-08-05T21:18:20.736669Z", - "iopub.status.idle": "2026-08-05T21:18:20.851705Z", - "shell.execute_reply": "2026-08-05T21:18:20.851289Z" + "iopub.execute_input": "2026-08-06T04:54:30.401760Z", + "iopub.status.busy": "2026-08-06T04:54:30.401650Z", + "iopub.status.idle": "2026-08-06T04:54:30.518219Z", + "shell.execute_reply": "2026-08-06T04:54:30.517782Z" } }, "outputs": [ @@ -2176,7 +2176,7 @@ }, { "cell_type": "markdown", - "id": "22127923", + "id": "f2c96af2", "metadata": {}, "source": [ "## What the object remembers" @@ -2185,13 +2185,13 @@ { "cell_type": "code", "execution_count": 28, - "id": "0db3039f", + "id": "263638e0", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.852801Z", - "iopub.status.busy": "2026-08-05T21:18:20.852707Z", - "iopub.status.idle": "2026-08-05T21:18:20.854803Z", - "shell.execute_reply": "2026-08-05T21:18:20.854413Z" + "iopub.execute_input": "2026-08-06T04:54:30.519035Z", + "iopub.status.busy": "2026-08-06T04:54:30.518939Z", + "iopub.status.idle": "2026-08-06T04:54:30.521068Z", + "shell.execute_reply": "2026-08-06T04:54:30.520744Z" } }, "outputs": [ @@ -2222,13 +2222,13 @@ { "cell_type": "code", "execution_count": 29, - "id": "c1abb18b", + "id": "c164a38e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.855584Z", - "iopub.status.busy": "2026-08-05T21:18:20.855501Z", - "iopub.status.idle": "2026-08-05T21:18:21.031151Z", - "shell.execute_reply": "2026-08-05T21:18:21.030712Z" + "iopub.execute_input": "2026-08-06T04:54:30.521748Z", + "iopub.status.busy": "2026-08-06T04:54:30.521667Z", + "iopub.status.idle": "2026-08-06T04:54:30.697443Z", + "shell.execute_reply": "2026-08-06T04:54:30.697018Z" } }, "outputs": [ @@ -2254,7 +2254,7 @@ }, { "cell_type": "markdown", - "id": "e1f3847e", + "id": "3d456bb8", "metadata": {}, "source": [ "Parameters are recorded with each call, so the history replays as code rather\n", diff --git a/matverse_guide/docs/tutorials/structure_and_bands.ipynb b/matverse_guide/docs/tutorials/structure_and_bands.ipynb index c2715f7..c6f8df1 100644 --- a/matverse_guide/docs/tutorials/structure_and_bands.ipynb +++ b/matverse_guide/docs/tutorials/structure_and_bands.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "65793f56", + "id": "ec92e9a0", "metadata": {}, "source": [ "# Local environments and electronic structure\n", @@ -26,13 +26,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "80527acb", + "id": "951d60b6", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:13.824803Z", - "iopub.status.busy": "2026-08-05T21:22:13.824698Z", - "iopub.status.idle": "2026-08-05T21:22:23.784570Z", - "shell.execute_reply": "2026-08-05T21:22:23.784050Z" + "iopub.execute_input": "2026-08-06T04:59:40.815990Z", + "iopub.status.busy": "2026-08-06T04:59:40.815889Z", + "iopub.status.idle": "2026-08-06T04:59:52.761136Z", + "shell.execute_reply": "2026-08-06T04:59:52.760124Z" } }, "outputs": [ @@ -76,7 +76,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -92,7 +92,7 @@ }, { "cell_type": "markdown", - "id": "73a680e0", + "id": "0f69f6af", "metadata": {}, "source": [ "That report is the point of `mv.pl.set_style` doing more than set rcParams:\n", @@ -111,13 +111,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "a45fcbdd", + "id": "6e81820e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:23.786465Z", - "iopub.status.busy": "2026-08-05T21:22:23.785919Z", - "iopub.status.idle": "2026-08-05T21:22:23.848043Z", - "shell.execute_reply": "2026-08-05T21:22:23.847548Z" + "iopub.execute_input": "2026-08-06T04:59:52.762815Z", + "iopub.status.busy": "2026-08-06T04:59:52.762362Z", + "iopub.status.idle": "2026-08-06T04:59:52.790197Z", + "shell.execute_reply": "2026-08-06T04:59:52.789637Z" } }, "outputs": [ @@ -179,7 +179,7 @@ }, { "cell_type": "markdown", - "id": "22dc6d69", + "id": "731216cd", "metadata": {}, "source": [ "## Coordination: the sites axis again\n", @@ -191,13 +191,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "d6bd5f36", + "id": "3860a6bf", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:23.849278Z", - "iopub.status.busy": "2026-08-05T21:22:23.849150Z", - "iopub.status.idle": "2026-08-05T21:22:24.807252Z", - "shell.execute_reply": "2026-08-05T21:22:24.806797Z" + "iopub.execute_input": "2026-08-06T04:59:52.791342Z", + "iopub.status.busy": "2026-08-06T04:59:52.791198Z", + "iopub.status.idle": "2026-08-06T04:59:53.306663Z", + "shell.execute_reply": "2026-08-06T04:59:53.306394Z" } }, "outputs": [ @@ -227,7 +227,7 @@ }, { "cell_type": "markdown", - "id": "8ec84238", + "id": "2cf55c15", "metadata": {}, "source": [ "**Li 6, Fe 6, P 4, O 4** — the published olivine coordination, recovered from\n", @@ -242,13 +242,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "f296c799", + "id": "3145edfa", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:24.808376Z", - "iopub.status.busy": "2026-08-05T21:22:24.808252Z", - "iopub.status.idle": "2026-08-05T21:22:24.810570Z", - "shell.execute_reply": "2026-08-05T21:22:24.810188Z" + "iopub.execute_input": "2026-08-06T04:59:53.308287Z", + "iopub.status.busy": "2026-08-06T04:59:53.308113Z", + "iopub.status.idle": "2026-08-06T04:59:53.310510Z", + "shell.execute_reply": "2026-08-06T04:59:53.310111Z" } }, "outputs": [ @@ -274,13 +274,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "88bc4c30", + "id": "c339c101", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:24.811378Z", - "iopub.status.busy": "2026-08-05T21:22:24.811282Z", - "iopub.status.idle": "2026-08-05T21:22:24.916861Z", - "shell.execute_reply": "2026-08-05T21:22:24.916408Z" + "iopub.execute_input": "2026-08-06T04:59:53.311484Z", + "iopub.status.busy": "2026-08-06T04:59:53.311342Z", + "iopub.status.idle": "2026-08-06T04:59:53.364694Z", + "shell.execute_reply": "2026-08-06T04:59:53.364349Z" } }, "outputs": [ @@ -367,7 +367,7 @@ }, { "cell_type": "markdown", - "id": "0ad8153f", + "id": "5b84ed4e", "metadata": {}, "source": [ "## A number is not a shape\n", @@ -382,13 +382,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "a5512f66", + "id": "c28b83bd", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:24.926187Z", - "iopub.status.busy": "2026-08-05T21:22:24.926051Z", - "iopub.status.idle": "2026-08-05T21:22:26.146040Z", - "shell.execute_reply": "2026-08-05T21:22:26.145301Z" + "iopub.execute_input": "2026-08-06T04:59:53.366086Z", + "iopub.status.busy": "2026-08-06T04:59:53.365927Z", + "iopub.status.idle": "2026-08-06T04:59:54.330271Z", + "shell.execute_reply": "2026-08-06T04:59:54.318124Z" } }, "outputs": [ @@ -525,13 +525,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "85910661", + "id": "8a9725fb", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:26.147656Z", - "iopub.status.busy": "2026-08-05T21:22:26.147505Z", - "iopub.status.idle": "2026-08-05T21:22:26.152119Z", - "shell.execute_reply": "2026-08-05T21:22:26.151631Z" + "iopub.execute_input": "2026-08-06T04:59:54.331516Z", + "iopub.status.busy": "2026-08-06T04:59:54.331409Z", + "iopub.status.idle": "2026-08-06T04:59:54.335116Z", + "shell.execute_reply": "2026-08-06T04:59:54.334764Z" } }, "outputs": [ @@ -558,7 +558,7 @@ }, { "cell_type": "markdown", - "id": "25d76863", + "id": "f2d6af2f", "metadata": {}, "source": [ "This is the structural story of an olivine cathode, in one column.\n", @@ -575,13 +575,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "14a87046", + "id": "9f0e48fc", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:26.153124Z", - "iopub.status.busy": "2026-08-05T21:22:26.153005Z", - "iopub.status.idle": "2026-08-05T21:22:26.307006Z", - "shell.execute_reply": "2026-08-05T21:22:26.306297Z" + "iopub.execute_input": "2026-08-06T04:59:54.336421Z", + "iopub.status.busy": "2026-08-06T04:59:54.336327Z", + "iopub.status.idle": "2026-08-06T04:59:54.454073Z", + "shell.execute_reply": "2026-08-06T04:59:54.453576Z" } }, "outputs": [ @@ -624,7 +624,7 @@ }, { "cell_type": "markdown", - "id": "a29b5aae", + "id": "ff22f461", "metadata": {}, "source": [ "## The bond network belongs in `obsp`\n", @@ -637,13 +637,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "71813181", + "id": "541be7cb", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:26.308209Z", - "iopub.status.busy": "2026-08-05T21:22:26.308074Z", - "iopub.status.idle": "2026-08-05T21:22:26.579472Z", - "shell.execute_reply": "2026-08-05T21:22:26.578990Z" + "iopub.execute_input": "2026-08-06T04:59:54.455405Z", + "iopub.status.busy": "2026-08-06T04:59:54.455252Z", + "iopub.status.idle": "2026-08-06T04:59:54.615000Z", + "shell.execute_reply": "2026-08-06T04:59:54.614626Z" } }, "outputs": [ @@ -667,13 +667,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "9866cee7", + "id": "bbe0e173", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:26.580832Z", - "iopub.status.busy": "2026-08-05T21:22:26.580622Z", - "iopub.status.idle": "2026-08-05T21:22:26.583719Z", - "shell.execute_reply": "2026-08-05T21:22:26.583373Z" + "iopub.execute_input": "2026-08-06T04:59:54.620406Z", + "iopub.status.busy": "2026-08-06T04:59:54.616693Z", + "iopub.status.idle": "2026-08-06T04:59:54.644838Z", + "shell.execute_reply": "2026-08-06T04:59:54.644375Z" } }, "outputs": [ @@ -695,7 +695,7 @@ }, { "cell_type": "markdown", - "id": "00dbd2fc", + "id": "25f56176", "metadata": {}, "source": [ "The degree of the graph is the coordination number, which it had better be.\n", @@ -712,13 +712,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "d0d7c406", + "id": "98177fa9", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:26.584922Z", - "iopub.status.busy": "2026-08-05T21:22:26.584808Z", - "iopub.status.idle": "2026-08-05T21:22:26.603020Z", - "shell.execute_reply": "2026-08-05T21:22:26.602543Z" + "iopub.execute_input": "2026-08-06T04:59:54.645922Z", + "iopub.status.busy": "2026-08-06T04:59:54.645806Z", + "iopub.status.idle": "2026-08-06T04:59:54.651609Z", + "shell.execute_reply": "2026-08-06T04:59:54.651348Z" } }, "outputs": [ @@ -786,13 +786,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "d5db56b7", + "id": "4a14f5d5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:26.604138Z", - "iopub.status.busy": "2026-08-05T21:22:26.604021Z", - "iopub.status.idle": "2026-08-05T21:22:26.609293Z", - "shell.execute_reply": "2026-08-05T21:22:26.608871Z" + "iopub.execute_input": "2026-08-06T04:59:54.652848Z", + "iopub.status.busy": "2026-08-06T04:59:54.652679Z", + "iopub.status.idle": "2026-08-06T04:59:54.657218Z", + "shell.execute_reply": "2026-08-06T04:59:54.656792Z" } }, "outputs": [ @@ -848,7 +848,7 @@ }, { "cell_type": "markdown", - "id": "070ecb4e", + "id": "d8f05643", "metadata": {}, "source": [ "`coordination_spread` is the one worth screening on: zero means every atom sits\n", @@ -865,13 +865,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "996de827", + "id": "5ad8ea73", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:26.610355Z", - "iopub.status.busy": "2026-08-05T21:22:26.610235Z", - "iopub.status.idle": "2026-08-05T21:22:27.485715Z", - "shell.execute_reply": "2026-08-05T21:22:27.485210Z" + "iopub.execute_input": "2026-08-06T04:59:54.658194Z", + "iopub.status.busy": "2026-08-06T04:59:54.658033Z", + "iopub.status.idle": "2026-08-06T04:59:55.336876Z", + "shell.execute_reply": "2026-08-06T04:59:55.336590Z" } }, "outputs": [ @@ -937,7 +937,7 @@ }, { "cell_type": "markdown", - "id": "10f80233", + "id": "70c3ad0d", "metadata": {}, "source": [ "For an ion conductor this is the question. A framework whose octahedra share\n", @@ -973,13 +973,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "93ae9b73", + "id": "37890607", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:27.498882Z", - "iopub.status.busy": "2026-08-05T21:22:27.498643Z", - "iopub.status.idle": "2026-08-05T21:22:27.821342Z", - "shell.execute_reply": "2026-08-05T21:22:27.820938Z" + "iopub.execute_input": "2026-08-06T04:59:55.340851Z", + "iopub.status.busy": "2026-08-06T04:59:55.340658Z", + "iopub.status.idle": "2026-08-06T04:59:55.516012Z", + "shell.execute_reply": "2026-08-06T04:59:55.515624Z" } }, "outputs": [ @@ -1077,7 +1077,7 @@ }, { "cell_type": "markdown", - "id": "789436f9", + "id": "a0e2e109", "metadata": {}, "source": [ "Graphite 2D, diamond 3D, MoS2 2D — and `n_components` counts two layers per\n", @@ -1092,13 +1092,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "5ff6982c", + "id": "f77f66b5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:27.822661Z", - "iopub.status.busy": "2026-08-05T21:22:27.822560Z", - "iopub.status.idle": "2026-08-05T21:22:27.827554Z", - "shell.execute_reply": "2026-08-05T21:22:27.827197Z" + "iopub.execute_input": "2026-08-06T04:59:55.517913Z", + "iopub.status.busy": "2026-08-06T04:59:55.517498Z", + "iopub.status.idle": "2026-08-06T04:59:55.527658Z", + "shell.execute_reply": "2026-08-06T04:59:55.523007Z" } }, "outputs": [ @@ -1170,7 +1170,7 @@ }, { "cell_type": "markdown", - "id": "0e695173", + "id": "a4c42e92", "metadata": {}, "source": [ "`dimensionality_strategy` is recorded next to the answer for the same reason\n", @@ -1189,13 +1189,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "ece9c9e8", + "id": "dc4403f4", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:27.828309Z", - "iopub.status.busy": "2026-08-05T21:22:27.828215Z", - "iopub.status.idle": "2026-08-05T21:22:27.971652Z", - "shell.execute_reply": "2026-08-05T21:22:27.971237Z" + "iopub.execute_input": "2026-08-06T04:59:55.528930Z", + "iopub.status.busy": "2026-08-06T04:59:55.528535Z", + "iopub.status.idle": "2026-08-06T04:59:55.595824Z", + "shell.execute_reply": "2026-08-06T04:59:55.595272Z" } }, "outputs": [ @@ -1266,7 +1266,7 @@ }, { "cell_type": "markdown", - "id": "01230872", + "id": "03567b42", "metadata": {}, "source": [ "Γ–X–W–K–L–U, the standard fcc path. Note that Cu and Al get **different numbers\n", @@ -1292,13 +1292,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "489f9ea1", + "id": "d4e52411", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:27.973072Z", - "iopub.status.busy": "2026-08-05T21:22:27.972979Z", - "iopub.status.idle": "2026-08-05T21:22:28.054670Z", - "shell.execute_reply": "2026-08-05T21:22:28.054254Z" + "iopub.execute_input": "2026-08-06T04:59:55.597051Z", + "iopub.status.busy": "2026-08-06T04:59:55.596676Z", + "iopub.status.idle": "2026-08-06T04:59:55.670792Z", + "shell.execute_reply": "2026-08-06T04:59:55.670377Z" } }, "outputs": [ @@ -1346,7 +1346,7 @@ }, { "cell_type": "markdown", - "id": "49561169", + "id": "d050a48f", "metadata": {}, "source": [ "**Bands × k-points.** One row per band per spin per material, energies along a\n", @@ -1357,13 +1357,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "c6e9e824", + "id": "34918ccd", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:28.056890Z", - "iopub.status.busy": "2026-08-05T21:22:28.056798Z", - "iopub.status.idle": "2026-08-05T21:22:28.063196Z", - "shell.execute_reply": "2026-08-05T21:22:28.062826Z" + "iopub.execute_input": "2026-08-06T04:59:55.672379Z", + "iopub.status.busy": "2026-08-06T04:59:55.671983Z", + "iopub.status.idle": "2026-08-06T04:59:55.680299Z", + "shell.execute_reply": "2026-08-06T04:59:55.680087Z" } }, "outputs": [ @@ -1517,13 +1517,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "b121cf80", + "id": "f3324180", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:28.065325Z", - "iopub.status.busy": "2026-08-05T21:22:28.065159Z", - "iopub.status.idle": "2026-08-05T21:22:28.068647Z", - "shell.execute_reply": "2026-08-05T21:22:28.068331Z" + "iopub.execute_input": "2026-08-06T04:59:55.683978Z", + "iopub.status.busy": "2026-08-06T04:59:55.683594Z", + "iopub.status.idle": "2026-08-06T04:59:55.688156Z", + "shell.execute_reply": "2026-08-06T04:59:55.687665Z" } }, "outputs": [ @@ -1596,7 +1596,7 @@ }, { "cell_type": "markdown", - "id": "7c28e733", + "id": "ef95980d", "metadata": {}, "source": [ "Two things about the axis are worth reading carefully.\n", @@ -1615,13 +1615,13 @@ { "cell_type": "code", "execution_count": 20, - "id": "2313cb8a", + "id": "1d8f57cd", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:28.069665Z", - "iopub.status.busy": "2026-08-05T21:22:28.069505Z", - "iopub.status.idle": "2026-08-05T21:22:28.316002Z", - "shell.execute_reply": "2026-08-05T21:22:28.315507Z" + "iopub.execute_input": "2026-08-06T04:59:55.689308Z", + "iopub.status.busy": "2026-08-06T04:59:55.688925Z", + "iopub.status.idle": "2026-08-06T04:59:55.893900Z", + "shell.execute_reply": "2026-08-06T04:59:55.892772Z" } }, "outputs": [ @@ -1658,7 +1658,7 @@ }, { "cell_type": "markdown", - "id": "c5644256", + "id": "dd156683", "metadata": {}, "source": [ "## What the bands say\n", @@ -1670,13 +1670,13 @@ { "cell_type": "code", "execution_count": 21, - "id": "750e7b5b", + "id": "c9985b22", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:28.317160Z", - "iopub.status.busy": "2026-08-05T21:22:28.317043Z", - "iopub.status.idle": "2026-08-05T21:22:28.324396Z", - "shell.execute_reply": "2026-08-05T21:22:28.323946Z" + "iopub.execute_input": "2026-08-06T04:59:55.895265Z", + "iopub.status.busy": "2026-08-06T04:59:55.895123Z", + "iopub.status.idle": "2026-08-06T04:59:55.918224Z", + "shell.execute_reply": "2026-08-06T04:59:55.917745Z" } }, "outputs": [ @@ -1755,7 +1755,7 @@ }, { "cell_type": "markdown", - "id": "a9c51ab8", + "id": "89346940", "metadata": {}, "source": [ "Metals, gap zero. Correct: two of the four bands cross the Fermi level, and a\n", @@ -1768,13 +1768,13 @@ { "cell_type": "code", "execution_count": 22, - "id": "9f25c5b5", + "id": "06ee946d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:28.325419Z", - "iopub.status.busy": "2026-08-05T21:22:28.325312Z", - "iopub.status.idle": "2026-08-05T21:22:28.384219Z", - "shell.execute_reply": "2026-08-05T21:22:28.383824Z" + "iopub.execute_input": "2026-08-06T04:59:55.919573Z", + "iopub.status.busy": "2026-08-06T04:59:55.919441Z", + "iopub.status.idle": "2026-08-06T04:59:55.968935Z", + "shell.execute_reply": "2026-08-06T04:59:55.968267Z" } }, "outputs": [ @@ -1869,7 +1869,7 @@ }, { "cell_type": "markdown", - "id": "7ca89de1", + "id": "527761f2", "metadata": {}, "source": [ "1.70 eV, which is exactly what the model was built with, and **direct** —\n", @@ -1943,13 +1943,13 @@ { "cell_type": "code", "execution_count": 23, - "id": "ef8056d7", + "id": "90fd3b53", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:28.385350Z", - "iopub.status.busy": "2026-08-05T21:22:28.385167Z", - "iopub.status.idle": "2026-08-05T21:22:28.413914Z", - "shell.execute_reply": "2026-08-05T21:22:28.413602Z" + "iopub.execute_input": "2026-08-06T04:59:55.969969Z", + "iopub.status.busy": "2026-08-06T04:59:55.969864Z", + "iopub.status.idle": "2026-08-06T04:59:56.030422Z", + "shell.execute_reply": "2026-08-06T04:59:56.029788Z" } }, "outputs": [ @@ -1972,7 +1972,7 @@ }, { "cell_type": "markdown", - "id": "0f3cebbd", + "id": "6b90733d", "metadata": {}, "source": [ "It names the install rather than returning zeros — and the docstring says why\n", @@ -1997,13 +1997,13 @@ { "cell_type": "code", "execution_count": 24, - "id": "f06f2f73", + "id": "ae37942f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:28.415521Z", - "iopub.status.busy": "2026-08-05T21:22:28.414734Z", - "iopub.status.idle": "2026-08-05T21:30:03.671791Z", - "shell.execute_reply": "2026-08-05T21:30:03.671271Z" + "iopub.execute_input": "2026-08-06T04:59:56.032167Z", + "iopub.status.busy": "2026-08-06T04:59:56.031540Z", + "iopub.status.idle": "2026-08-06T05:09:05.055506Z", + "shell.execute_reply": "2026-08-06T05:09:05.054932Z" } }, "outputs": [ @@ -2057,7 +2057,7 @@ }, { "cell_type": "markdown", - "id": "7f0a4cab", + "id": "e21eb04e", "metadata": {}, "source": [ "The first ratio is 1.00 and the second is 0.66, and **both are correct**. The\n", @@ -2086,13 +2086,13 @@ { "cell_type": "code", "execution_count": 25, - "id": "55a7eb1b", + "id": "a879b372", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:30:03.673385Z", - "iopub.status.busy": "2026-08-05T21:30:03.672994Z", - "iopub.status.idle": "2026-08-05T21:35:15.361600Z", - "shell.execute_reply": "2026-08-05T21:35:15.361012Z" + "iopub.execute_input": "2026-08-06T05:09:05.057357Z", + "iopub.status.busy": "2026-08-06T05:09:05.056491Z", + "iopub.status.idle": "2026-08-06T05:17:32.786460Z", + "shell.execute_reply": "2026-08-06T05:17:32.785965Z" } }, "outputs": [ @@ -2135,7 +2135,7 @@ }, { "cell_type": "markdown", - "id": "70f81c04", + "id": "0922da83", "metadata": {}, "source": [ "The left surface is a sphere. The right one is the same sphere at a higher Fermi\n", @@ -2150,13 +2150,13 @@ { "cell_type": "code", "execution_count": 26, - "id": "250a348d", + "id": "b6856563", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:15.367996Z", - "iopub.status.busy": "2026-08-05T21:35:15.367880Z", - "iopub.status.idle": "2026-08-05T21:35:15.370043Z", - "shell.execute_reply": "2026-08-05T21:35:15.369722Z" + "iopub.execute_input": "2026-08-06T05:17:32.792871Z", + "iopub.status.busy": "2026-08-06T05:17:32.792744Z", + "iopub.status.idle": "2026-08-06T05:17:32.795305Z", + "shell.execute_reply": "2026-08-06T05:17:32.794859Z" } }, "outputs": [ @@ -2178,7 +2178,7 @@ }, { "cell_type": "markdown", - "id": "d33c0da1", + "id": "7a98de3f", "metadata": {}, "source": [ "```{seealso}\n", @@ -2191,7 +2191,7 @@ }, { "cell_type": "markdown", - "id": "34f3a9dc", + "id": "df163a50", "metadata": {}, "source": [ "## How sure is a coordination number?\n", @@ -2207,13 +2207,13 @@ { "cell_type": "code", "execution_count": 27, - "id": "c240412f", + "id": "6b530ddd", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:15.370774Z", - "iopub.status.busy": "2026-08-05T21:35:15.370690Z", - "iopub.status.idle": "2026-08-05T21:35:15.841255Z", - "shell.execute_reply": "2026-08-05T21:35:15.840826Z" + "iopub.execute_input": "2026-08-06T05:17:32.796526Z", + "iopub.status.busy": "2026-08-06T05:17:32.796338Z", + "iopub.status.idle": "2026-08-06T05:17:33.264957Z", + "shell.execute_reply": "2026-08-06T05:17:33.264424Z" } }, "outputs": [ @@ -2358,7 +2358,7 @@ }, { "cell_type": "markdown", - "id": "adc30f69", + "id": "25456f9c", "metadata": {}, "source": [ "Sodium gets six faces and six neighbours, every weight 1.0 — nothing to decide.\n", @@ -2376,13 +2376,13 @@ { "cell_type": "code", "execution_count": 28, - "id": "a056a282", + "id": "6e64776c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:15.842123Z", - "iopub.status.busy": "2026-08-05T21:35:15.842031Z", - "iopub.status.idle": "2026-08-05T21:35:15.866807Z", - "shell.execute_reply": "2026-08-05T21:35:15.866284Z" + "iopub.execute_input": "2026-08-06T05:17:33.266045Z", + "iopub.status.busy": "2026-08-06T05:17:33.265918Z", + "iopub.status.idle": "2026-08-06T05:17:33.292348Z", + "shell.execute_reply": "2026-08-06T05:17:33.291964Z" } }, "outputs": [ @@ -2408,7 +2408,7 @@ }, { "cell_type": "markdown", - "id": "e60ae8b7", + "id": "d73d6c0b", "metadata": {}, "source": [ "0.58 against 1.00. That is the column to sort on when auditing coordination\n", @@ -2419,7 +2419,7 @@ }, { "cell_type": "markdown", - "id": "5e2d4ebc", + "id": "03dccec3", "metadata": {}, "source": [ "## Who counts as a neighbour?\n", @@ -2435,13 +2435,13 @@ { "cell_type": "code", "execution_count": 29, - "id": "f34cef1f", + "id": "bfe2b010", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:15.867719Z", - "iopub.status.busy": "2026-08-05T21:35:15.867567Z", - "iopub.status.idle": "2026-08-05T21:35:16.510965Z", - "shell.execute_reply": "2026-08-05T21:35:16.510524Z" + "iopub.execute_input": "2026-08-06T05:17:33.293393Z", + "iopub.status.busy": "2026-08-06T05:17:33.293282Z", + "iopub.status.idle": "2026-08-06T05:17:33.923181Z", + "shell.execute_reply": "2026-08-06T05:17:33.922805Z" } }, "outputs": [ @@ -2578,7 +2578,7 @@ }, { "cell_type": "markdown", - "id": "a1701cb5", + "id": "7a89d064", "metadata": {}, "source": [ "Six and octahedral for every site, which is what rocksalt is.\n", @@ -2591,13 +2591,13 @@ { "cell_type": "code", "execution_count": 30, - "id": "2e14781f", + "id": "cb3ebb1d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:16.511888Z", - "iopub.status.busy": "2026-08-05T21:35:16.511798Z", - "iopub.status.idle": "2026-08-05T21:35:16.701639Z", - "shell.execute_reply": "2026-08-05T21:35:16.701135Z" + "iopub.execute_input": "2026-08-06T05:17:33.924356Z", + "iopub.status.busy": "2026-08-06T05:17:33.924137Z", + "iopub.status.idle": "2026-08-06T05:17:34.129184Z", + "shell.execute_reply": "2026-08-06T05:17:34.128784Z" } }, "outputs": [ @@ -2699,7 +2699,7 @@ }, { "cell_type": "markdown", - "id": "cd5581d9", + "id": "fb4e01d9", "metadata": {}, "source": [ "Lower coordination, from an identical structure. A geometric criterion would\n", @@ -2725,7 +2725,7 @@ }, { "cell_type": "markdown", - "id": "c8381d23", + "id": "defe8dc6", "metadata": {}, "source": [ "## What photoemission actually sees\n", @@ -2743,13 +2743,13 @@ { "cell_type": "code", "execution_count": 31, - "id": "1ef0ecab", + "id": "0586a7ac", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:16.702594Z", - "iopub.status.busy": "2026-08-05T21:35:16.702447Z", - "iopub.status.idle": "2026-08-05T21:35:16.716912Z", - "shell.execute_reply": "2026-08-05T21:35:16.716515Z" + "iopub.execute_input": "2026-08-06T05:17:34.130350Z", + "iopub.status.busy": "2026-08-06T05:17:34.130238Z", + "iopub.status.idle": "2026-08-06T05:17:34.148544Z", + "shell.execute_reply": "2026-08-06T05:17:34.148050Z" } }, "outputs": [ @@ -2789,7 +2789,7 @@ }, { "cell_type": "markdown", - "id": "7dcc3089", + "id": "55f06007", "metadata": {}, "source": [ "Twenty, exactly the ratio of the two cross-sections. The oxygen states are\n", @@ -2804,13 +2804,13 @@ { "cell_type": "code", "execution_count": 32, - "id": "88376db2", + "id": "690e0e96", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:16.717882Z", - "iopub.status.busy": "2026-08-05T21:35:16.717691Z", - "iopub.status.idle": "2026-08-05T21:35:16.877935Z", - "shell.execute_reply": "2026-08-05T21:35:16.877451Z" + "iopub.execute_input": "2026-08-06T05:17:34.149483Z", + "iopub.status.busy": "2026-08-06T05:17:34.149359Z", + "iopub.status.idle": "2026-08-06T05:17:34.314409Z", + "shell.execute_reply": "2026-08-06T05:17:34.313921Z" } }, "outputs": [ @@ -2856,7 +2856,7 @@ }, { "cell_type": "markdown", - "id": "938ba253", + "id": "9f22f22f", "metadata": {}, "source": [ "```{note}\n", diff --git a/matverse_guide/docs/tutorials/surfaces_and_adsorption.ipynb b/matverse_guide/docs/tutorials/surfaces_and_adsorption.ipynb index 14bdc45..4791225 100644 --- a/matverse_guide/docs/tutorials/surfaces_and_adsorption.ipynb +++ b/matverse_guide/docs/tutorials/surfaces_and_adsorption.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "4f47800d", + "id": "582af245", "metadata": {}, "source": [ "# Surfaces and adsorption\n", @@ -20,13 +20,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "3833836b", + "id": "992232bb", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:31.596603Z", - "iopub.status.busy": "2026-08-05T21:19:31.596527Z", - "iopub.status.idle": "2026-08-05T21:19:36.737670Z", - "shell.execute_reply": "2026-08-05T21:19:36.737225Z" + "iopub.execute_input": "2026-08-06T04:56:26.077165Z", + "iopub.status.busy": "2026-08-06T04:56:26.077071Z", + "iopub.status.idle": "2026-08-06T04:56:31.624409Z", + "shell.execute_reply": "2026-08-06T04:56:31.623608Z" } }, "outputs": [ @@ -70,7 +70,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -86,7 +86,7 @@ }, { "cell_type": "markdown", - "id": "7c5f174b", + "id": "60c3e19d", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -99,13 +99,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "1313621b", + "id": "e49d7f14", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:36.738980Z", - "iopub.status.busy": "2026-08-05T21:19:36.738631Z", - "iopub.status.idle": "2026-08-05T21:19:36.760167Z", - "shell.execute_reply": "2026-08-05T21:19:36.759824Z" + "iopub.execute_input": "2026-08-06T04:56:31.626169Z", + "iopub.status.busy": "2026-08-06T04:56:31.625666Z", + "iopub.status.idle": "2026-08-06T04:56:31.650599Z", + "shell.execute_reply": "2026-08-06T04:56:31.650133Z" } }, "outputs": [ @@ -173,7 +173,7 @@ }, { "cell_type": "markdown", - "id": "22be3e65", + "id": "49300b8a", "metadata": {}, "source": [ "The bulk energy is not optional bookkeeping — a surface energy is the cost of\n", @@ -191,13 +191,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "13ba3b80", + "id": "0357182a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:36.760982Z", - "iopub.status.busy": "2026-08-05T21:19:36.760886Z", - "iopub.status.idle": "2026-08-05T21:19:36.951571Z", - "shell.execute_reply": "2026-08-05T21:19:36.951221Z" + "iopub.execute_input": "2026-08-06T04:56:31.651634Z", + "iopub.status.busy": "2026-08-06T04:56:31.651483Z", + "iopub.status.idle": "2026-08-06T04:56:31.845001Z", + "shell.execute_reply": "2026-08-06T04:56:31.844523Z" } }, "outputs": [ @@ -225,13 +225,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "be1ded90", + "id": "8cfab858", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:36.952372Z", - "iopub.status.busy": "2026-08-05T21:19:36.952279Z", - "iopub.status.idle": "2026-08-05T21:19:36.962697Z", - "shell.execute_reply": "2026-08-05T21:19:36.962371Z" + "iopub.execute_input": "2026-08-06T04:56:31.846034Z", + "iopub.status.busy": "2026-08-06T04:56:31.845914Z", + "iopub.status.idle": "2026-08-06T04:56:31.857299Z", + "shell.execute_reply": "2026-08-06T04:56:31.856848Z" } }, "outputs": [ @@ -346,7 +346,7 @@ }, { "cell_type": "markdown", - "id": "5a0790c6", + "id": "b0299b7b", "metadata": {}, "source": [ "More rows out than in, with `obs['parent']` pointing back at the bulk material —\n", @@ -362,13 +362,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "28eb8b36", + "id": "d4d89a06", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:36.963473Z", - "iopub.status.busy": "2026-08-05T21:19:36.963345Z", - "iopub.status.idle": "2026-08-05T21:19:36.965605Z", - "shell.execute_reply": "2026-08-05T21:19:36.965269Z" + "iopub.execute_input": "2026-08-06T04:56:31.858233Z", + "iopub.status.busy": "2026-08-06T04:56:31.858126Z", + "iopub.status.idle": "2026-08-06T04:56:31.860668Z", + "shell.execute_reply": "2026-08-06T04:56:31.860249Z" } }, "outputs": [ @@ -395,7 +395,7 @@ }, { "cell_type": "markdown", - "id": "2d2999f1", + "id": "6bc242f8", "metadata": {}, "source": [ "## Surface energies" @@ -404,13 +404,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "a597c78d", + "id": "714ec13b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:36.966282Z", - "iopub.status.busy": "2026-08-05T21:19:36.966186Z", - "iopub.status.idle": "2026-08-05T21:19:36.988904Z", - "shell.execute_reply": "2026-08-05T21:19:36.988504Z" + "iopub.execute_input": "2026-08-06T04:56:31.861584Z", + "iopub.status.busy": "2026-08-06T04:56:31.861486Z", + "iopub.status.idle": "2026-08-06T04:56:31.885355Z", + "shell.execute_reply": "2026-08-06T04:56:31.884898Z" } }, "outputs": [ @@ -439,7 +439,7 @@ }, { "cell_type": "markdown", - "id": "914e77a5", + "id": "be6671a2", "metadata": {}, "source": [ "**(111) < (100) < (110)**, which is the literature ordering for copper and for\n", @@ -454,20 +454,20 @@ { "cell_type": "code", "execution_count": 7, - "id": "1907730d", + "id": "669c7d44", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:36.989729Z", - "iopub.status.busy": "2026-08-05T21:19:36.989621Z", - "iopub.status.idle": "2026-08-05T21:19:37.104506Z", - "shell.execute_reply": "2026-08-05T21:19:37.104100Z" + "iopub.execute_input": "2026-08-06T04:56:31.886249Z", + "iopub.status.busy": "2026-08-06T04:56:31.886140Z", + "iopub.status.idle": "2026-08-06T04:56:32.029127Z", + "shell.execute_reply": "2026-08-06T04:56:32.028707Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 7, @@ -507,7 +507,7 @@ }, { "cell_type": "markdown", - "id": "c0f6d9ca", + "id": "96adda73", "metadata": {}, "source": [ "## When a slab is not the bulk formula\n", @@ -526,13 +526,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "8e8dd196", + "id": "f6ac1538", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:37.105367Z", - "iopub.status.busy": "2026-08-05T21:19:37.105207Z", - "iopub.status.idle": "2026-08-05T21:19:37.274637Z", - "shell.execute_reply": "2026-08-05T21:19:37.274271Z" + "iopub.execute_input": "2026-08-06T04:56:32.030167Z", + "iopub.status.busy": "2026-08-06T04:56:32.030033Z", + "iopub.status.idle": "2026-08-06T04:56:32.232560Z", + "shell.execute_reply": "2026-08-06T04:56:32.232132Z" } }, "outputs": [ @@ -623,7 +623,7 @@ }, { "cell_type": "markdown", - "id": "5df98430", + "id": "3829f84e", "metadata": {}, "source": [ "Four of these five are not Cu₃Au. The leftover atoms have to come from somewhere\n", @@ -635,13 +635,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "ae120bd3", + "id": "78aaa2e4", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:37.275619Z", - "iopub.status.busy": "2026-08-05T21:19:37.275432Z", - "iopub.status.idle": "2026-08-05T21:19:37.280986Z", - "shell.execute_reply": "2026-08-05T21:19:37.280601Z" + "iopub.execute_input": "2026-08-06T04:56:32.233501Z", + "iopub.status.busy": "2026-08-06T04:56:32.233398Z", + "iopub.status.idle": "2026-08-06T04:56:32.239324Z", + "shell.execute_reply": "2026-08-06T04:56:32.238935Z" } }, "outputs": [ @@ -735,7 +735,7 @@ }, { "cell_type": "markdown", - "id": "61390270", + "id": "4350cf71", "metadata": {}, "source": [ "### Referencing the surplus to a reservoir\n", @@ -753,13 +753,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "29a9d130", + "id": "a8b20ffe", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:37.281834Z", - "iopub.status.busy": "2026-08-05T21:19:37.281720Z", - "iopub.status.idle": "2026-08-05T21:19:37.824584Z", - "shell.execute_reply": "2026-08-05T21:19:37.824172Z" + "iopub.execute_input": "2026-08-06T04:56:32.240276Z", + "iopub.status.busy": "2026-08-06T04:56:32.240140Z", + "iopub.status.idle": "2026-08-06T04:56:32.834121Z", + "shell.execute_reply": "2026-08-06T04:56:32.833689Z" } }, "outputs": [ @@ -869,7 +869,7 @@ }, { "cell_type": "markdown", - "id": "211421b8", + "id": "69c0387c", "metadata": {}, "source": [ "Two things to read off. The two (100) terminations carry equal and opposite Au\n", @@ -890,13 +890,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "bd0d8954", + "id": "238477d2", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:37.825472Z", - "iopub.status.busy": "2026-08-05T21:19:37.825371Z", - "iopub.status.idle": "2026-08-05T21:19:37.829854Z", - "shell.execute_reply": "2026-08-05T21:19:37.829571Z" + "iopub.execute_input": "2026-08-06T04:56:32.835289Z", + "iopub.status.busy": "2026-08-06T04:56:32.835165Z", + "iopub.status.idle": "2026-08-06T04:56:32.840448Z", + "shell.execute_reply": "2026-08-06T04:56:32.840020Z" } }, "outputs": [ @@ -955,7 +955,7 @@ }, { "cell_type": "markdown", - "id": "c671ac3c", + "id": "ac22b2d4", "metadata": {}, "source": [ "## The equilibrium crystal shape\n", @@ -969,13 +969,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "622856f5", + "id": "8bc1e5c6", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:37.830601Z", - "iopub.status.busy": "2026-08-05T21:19:37.830515Z", - "iopub.status.idle": "2026-08-05T21:19:37.881740Z", - "shell.execute_reply": "2026-08-05T21:19:37.881412Z" + "iopub.execute_input": "2026-08-06T04:56:32.841254Z", + "iopub.status.busy": "2026-08-06T04:56:32.841150Z", + "iopub.status.idle": "2026-08-06T04:56:32.893898Z", + "shell.execute_reply": "2026-08-06T04:56:32.893459Z" } }, "outputs": [ @@ -1043,13 +1043,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "0c4de04c", + "id": "b1b37ceb", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:37.882475Z", - "iopub.status.busy": "2026-08-05T21:19:37.882387Z", - "iopub.status.idle": "2026-08-05T21:19:37.886954Z", - "shell.execute_reply": "2026-08-05T21:19:37.886650Z" + "iopub.execute_input": "2026-08-06T04:56:32.894823Z", + "iopub.status.busy": "2026-08-06T04:56:32.894717Z", + "iopub.status.idle": "2026-08-06T04:56:32.900131Z", + "shell.execute_reply": "2026-08-06T04:56:32.899716Z" } }, "outputs": [ @@ -1121,7 +1121,7 @@ }, { "cell_type": "markdown", - "id": "01c3d3fb", + "id": "a2e33f4b", "metadata": {}, "source": [ "(111) takes **two thirds** of the surface, (100) most of the rest, and (110)\n", @@ -1141,13 +1141,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "b8eaeee7", + "id": "c238f84a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:37.887637Z", - "iopub.status.busy": "2026-08-05T21:19:37.887552Z", - "iopub.status.idle": "2026-08-05T21:19:37.889553Z", - "shell.execute_reply": "2026-08-05T21:19:37.889271Z" + "iopub.execute_input": "2026-08-06T04:56:32.901096Z", + "iopub.status.busy": "2026-08-06T04:56:32.900960Z", + "iopub.status.idle": "2026-08-06T04:56:32.903562Z", + "shell.execute_reply": "2026-08-06T04:56:32.903092Z" } }, "outputs": [ @@ -1171,13 +1171,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "9fce1483", + "id": "112c4806", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:37.890195Z", - "iopub.status.busy": "2026-08-05T21:19:37.890116Z", - "iopub.status.idle": "2026-08-05T21:19:37.980964Z", - "shell.execute_reply": "2026-08-05T21:19:37.980613Z" + "iopub.execute_input": "2026-08-06T04:56:32.904531Z", + "iopub.status.busy": "2026-08-06T04:56:32.904412Z", + "iopub.status.idle": "2026-08-06T04:56:33.001664Z", + "shell.execute_reply": "2026-08-06T04:56:33.001155Z" } }, "outputs": [ @@ -1219,7 +1219,7 @@ }, { "cell_type": "markdown", - "id": "72535848", + "id": "3c9166ee", "metadata": {}, "source": [ "## Adsorption\n", @@ -1232,13 +1232,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "d88cf272", + "id": "c5f7318f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:37.981930Z", - "iopub.status.busy": "2026-08-05T21:19:37.981804Z", - "iopub.status.idle": "2026-08-05T21:19:38.022762Z", - "shell.execute_reply": "2026-08-05T21:19:38.022390Z" + "iopub.execute_input": "2026-08-06T04:56:33.003406Z", + "iopub.status.busy": "2026-08-06T04:56:33.003257Z", + "iopub.status.idle": "2026-08-06T04:56:33.047824Z", + "shell.execute_reply": "2026-08-06T04:56:33.047345Z" } }, "outputs": [ @@ -1308,7 +1308,7 @@ }, { "cell_type": "markdown", - "id": "b82ec337", + "id": "ebb2843a", "metadata": {}, "source": [ "### Sites are enumerated, not guessed\n", @@ -1321,13 +1321,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "6603d161", + "id": "4a90264f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:38.023537Z", - "iopub.status.busy": "2026-08-05T21:19:38.023442Z", - "iopub.status.idle": "2026-08-05T21:19:38.095661Z", - "shell.execute_reply": "2026-08-05T21:19:38.095357Z" + "iopub.execute_input": "2026-08-06T04:56:33.049041Z", + "iopub.status.busy": "2026-08-06T04:56:33.048908Z", + "iopub.status.idle": "2026-08-06T04:56:33.124677Z", + "shell.execute_reply": "2026-08-06T04:56:33.124080Z" } }, "outputs": [ @@ -1408,13 +1408,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "fad6f44d", + "id": "778738c3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:38.096485Z", - "iopub.status.busy": "2026-08-05T21:19:38.096395Z", - "iopub.status.idle": "2026-08-05T21:19:38.099345Z", - "shell.execute_reply": "2026-08-05T21:19:38.099010Z" + "iopub.execute_input": "2026-08-06T04:56:33.125934Z", + "iopub.status.busy": "2026-08-06T04:56:33.125559Z", + "iopub.status.idle": "2026-08-06T04:56:33.130192Z", + "shell.execute_reply": "2026-08-06T04:56:33.129657Z" } }, "outputs": [ @@ -1439,7 +1439,7 @@ }, { "cell_type": "markdown", - "id": "e8c64e65", + "id": "1fcef790", "metadata": {}, "source": [ "On-top, bridge and hollow — the three coordination environments a close-packed\n", @@ -1449,13 +1449,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "4077fb16", + "id": "de86185f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:38.100057Z", - "iopub.status.busy": "2026-08-05T21:19:38.099947Z", - "iopub.status.idle": "2026-08-05T21:19:38.436762Z", - "shell.execute_reply": "2026-08-05T21:19:38.436351Z" + "iopub.execute_input": "2026-08-06T04:56:33.131462Z", + "iopub.status.busy": "2026-08-06T04:56:33.131073Z", + "iopub.status.idle": "2026-08-06T04:56:33.761712Z", + "shell.execute_reply": "2026-08-06T04:56:33.761089Z" } }, "outputs": [ @@ -1484,7 +1484,7 @@ }, { "cell_type": "markdown", - "id": "c566e34a", + "id": "b8f89c84", "metadata": {}, "source": [ "**Hollow is lowest, then bridge, then on-top** — more neighbours, more bonding.\n", @@ -1501,20 +1501,20 @@ { "cell_type": "code", "execution_count": 20, - "id": "f4cdc12a", + "id": "742fc527", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:38.437666Z", - "iopub.status.busy": "2026-08-05T21:19:38.437572Z", - "iopub.status.idle": "2026-08-05T21:19:38.539003Z", - "shell.execute_reply": "2026-08-05T21:19:38.538627Z" + "iopub.execute_input": "2026-08-06T04:56:33.763008Z", + "iopub.status.busy": "2026-08-06T04:56:33.762609Z", + "iopub.status.idle": "2026-08-06T04:56:33.870507Z", + "shell.execute_reply": "2026-08-06T04:56:33.869812Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 20, @@ -1552,7 +1552,7 @@ }, { "cell_type": "markdown", - "id": "2e32bbe0", + "id": "be186408", "metadata": {}, "source": [ "About 170 meV between on-top and hollow. That is the size of difference that\n", @@ -1561,7 +1561,7 @@ }, { "cell_type": "markdown", - "id": "88c5d021", + "id": "83f59104", "metadata": {}, "source": [ "```{warning}\n", @@ -1585,13 +1585,13 @@ { "cell_type": "code", "execution_count": 21, - "id": "a646962e", + "id": "5cb205b9", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:38.539819Z", - "iopub.status.busy": "2026-08-05T21:19:38.539725Z", - "iopub.status.idle": "2026-08-05T21:19:38.541687Z", - "shell.execute_reply": "2026-08-05T21:19:38.541380Z" + "iopub.execute_input": "2026-08-06T04:56:33.871637Z", + "iopub.status.busy": "2026-08-06T04:56:33.871520Z", + "iopub.status.idle": "2026-08-06T04:56:33.874398Z", + "shell.execute_reply": "2026-08-06T04:56:33.873976Z" } }, "outputs": [ @@ -1615,7 +1615,7 @@ }, { "cell_type": "markdown", - "id": "df5b9b92", + "id": "0e28fff5", "metadata": {}, "source": [ "```{seealso}\n", diff --git a/tests/_contract_cases.py b/tests/_contract_cases.py index 6fed218..0bdd5b8 100644 --- a/tests/_contract_cases.py +++ b/tests/_contract_cases.py @@ -232,6 +232,58 @@ def fermi_computed(): return md +def lithium_metal(): + from pymatgen.core import Lattice, Structure + md = mv.data.from_structures([Structure( + Lattice.cubic(3.51), ["Li", "Li"], [[0, 0, 0], [.5, .5, .5]])]) + md.obs["energy_ref"] = [-3.7474] + return md + + +def olivine_pair(): + """LiFePO4 and its delithiated framework, with energies supplied.""" + cathode = mv.datasets.load("battery_cathodes")[:1].copy() + lithiated = mv.structures(cathode, "input")[0] + delithiated = lithiated.copy() + delithiated.remove_species(["Li"]) + md = mv.data.from_structures([lithiated, delithiated]) + md.obs_names = ["LiFePO4", "FePO4"] + md.obs["energy_ref"] = [-210.8473, -189.3663] + return md + + +def with_rdf(): + md = mv.datasets.load("simple")[:2].copy() + mv.pp.describe(md) + mv.prop.rdf(md, r_max=6.0, step=0.1) + return md + + +def vibrating(): + md = mv.datasets.metals(["Cu"]) + mv.pp.describe(md) + mv.prop.phonon(md, level="emt", supercell=(1, 1, 1)) + return md + + +def adsorbing(): + """Synthetic binding energies across a set of surfaces.""" + n = 6 + md = mv.data.from_compositions([f"Pt{i + 1}" for i in range(n)]) + oxygen = np.linspace(-2.5, 0.5, n) + md.obs["E_O"] = oxygen + md.obs["E_OH"] = 0.5 * oxygen - 0.10 + return md + + +def transporting(): + md = mv.data.from_compositions(["Bi2Te3"]) + md.obs["seebeck_x"] = [200e-6] + md.obs["sigma_over_tau_x"] = [1e18] + md.obs["thermal_conductivity_x"] = [1.0] + return md + + def symmetric(): """A dataset carrying obs['spacegroup_number'], for mv.pl.spacegroups.""" md = mv.datasets.metals(["Cu", "Al"]) @@ -951,6 +1003,18 @@ def measured_alloy(): (mv.gen.from_symmetry, perovskite_candidates, (), {"space_groups": [221], "seed": 0, "returns": "new"}), (mv.pl.spacegroups, symmetric, (), {}), + (mv.thermo.voltage, olivine_pair, (), + {"working_ion": "Li", "level": "ref", "reference": lithium_metal()}), + (mv.thermo.theoretical_capacity, olivine, (), {"working_ion": "Li"}), + (mv.prop.scattering, with_rdf, (), {"level": "calc", "q_max": 8.0, + "n_points": 20}), + (mv.prop.superconductivity, vibrating, (), + {"level": "emt", "coupling": 1.0}), + (mv.surf.scaling, adsorbing, (), {"x": "E_O", "y": "E_OH"}), + (mv.surf.volcano, adsorbing, (), + {"descriptor": "E_O", "optimum": -1.6}), + (mv.prop.zt, transporting, (), + {"level": "x", "relaxation_time": 1e-14}), (mv.pl.elastic, stiff, (), {"level": "exp"}), # Skipped where IFermi is absent, like any optional backend. (mv.pl.fermi_surface, fermi_computed, (), {"level": "model"}), diff --git a/tests/test_physics.py b/tests/test_physics.py index a681e2c..7547797 100644 --- a/tests/test_physics.py +++ b/tests/test_physics.py @@ -1540,3 +1540,406 @@ def test_it_needs_a_formula_column(self): [Structure(Lattice.cubic(4.0), ["Pb"], [[0, 0, 0]])]) with pytest.raises(ValueError, match="from_compositions"): mv.thermo.calphad(md, _pbsn_database(), temperature=450.0) + + +def _olivine_pair(): + """LiFePO4 and its delithiated framework, plus a lithium reference. + + The energies are supplied directly rather than computed, so the test says + something about the voltage arithmetic rather than about a potential. The + values are what CHGNet gives for a positions-only relaxation, which + reproduces the measured plateau. + """ + from pymatgen.core import Lattice, Structure + + lifepo4 = mv.datasets.load("battery_cathodes")[:1].copy() + lithiated = mv.structures(lifepo4, "input")[0] + delithiated = lithiated.copy() + delithiated.remove_species(["Li"]) + + cathode = mv.data.from_structures([lithiated, delithiated]) + cathode.obs_names = ["LiFePO4", "FePO4"] + cathode.obs["energy_ref"] = [-210.8473, -189.3663] + cathode.obs["relax_converged_ref"] = [True, True] + + metal = mv.data.from_structures([Structure( + Lattice.cubic(3.51), ["Li", "Li"], [[0, 0, 0], [.5, .5, .5]])]) + metal.obs["energy_ref"] = [-3.7474] + metal.obs["relax_converged_ref"] = [True] + return cathode, metal + + +class TestIntercalationVoltage: + """Checked against a measured plateau, not against another code. + + LiFePO4 discharges at 3.4-3.5 V with a theoretical capacity of 170 mAh/g. + Those are the numbers to hit. + """ + + def test_it_reproduces_the_lifepo4_plateau(self): + cathode, metal = _olivine_pair() + mv.thermo.voltage(cathode, working_ion="Li", level="ref", + reference=metal) + assert float(cathode.obs["voltage_ref"].iloc[0]) == \ + pytest.approx(3.5, abs=0.15) + assert float(cathode.obs["capacity_gravimetric_ref"].iloc[0]) == \ + pytest.approx(170.0, rel=0.02) + + def test_every_row_of_a_framework_carries_its_voltage(self): + """The voltage belongs to the pair, so both rows report it — a screen + sorting on the column should not have to know which row is which.""" + cathode, metal = _olivine_pair() + mv.thermo.voltage(cathode, working_ion="Li", level="ref", + reference=metal) + values = cathode.obs["voltage_ref"].to_numpy(dtype=float) + assert np.isfinite(values).all() + assert values[0] == pytest.approx(values[1]) + + def test_an_unconverged_row_is_excluded_not_averaged_in(self): + """The bug this was written after: reading energy_{level} without + checking relax_converged_{level} gave 78 V for LiFePO4, from a cell a + foundation potential had collapsed to 2 cubic angstrom per atom. The + diagnostic was False the whole time.""" + cathode, metal = _olivine_pair() + cathode.obs["relax_converged_ref"] = [True, False] + with pytest.warns(RuntimeWarning, match="did not converge"): + mv.thermo.voltage(cathode, working_ion="Li", level="ref", + reference=metal) + assert np.isnan(float(cathode.obs["voltage_ref"].iloc[0])) + assert "FePO4" in cathode.uns["electrode"]["ref"]["unconverged"] + + def test_an_unconverged_reference_is_refused_outright(self): + """A bad reference shifts every voltage by the same amount, so no + comparison between cathodes reveals it. That makes it worse than a bad + cathode, and it raises rather than warns.""" + cathode, metal = _olivine_pair() + metal.obs["relax_converged_ref"] = [False] + with pytest.raises(ValueError, match="reference did not converge"): + mv.thermo.voltage(cathode, working_ion="Li", level="ref", + reference=metal) + + def test_a_missing_reference_is_refused_rather_than_guessed(self): + cathode, _ = _olivine_pair() + with pytest.raises(ValueError, match="reference= is required"): + mv.thermo.voltage(cathode, working_ion="Li", level="ref") + + def test_two_frameworks_are_not_averaged_together(self): + """Li and Na analogues of the same framework are different electrodes. + Grouping by what is left when the working ion is removed keeps them + apart; without it they become one meaningless average.""" + cathode, metal = _olivine_pair() + extra = mv.datasets.load("battery_cathodes")[1:2].copy() + merged = mv.data.from_structures( + list(mv.structures(cathode, "input")) + + list(mv.structures(extra, "input"))) + merged.obs_names = ["LiFePO4", "FePO4", "NaFePO4"] + merged.obs["energy_ref"] = [-210.8473, -189.3663, -205.0] + merged.obs["relax_converged_ref"] = [True, True, True] + with pytest.warns(RuntimeWarning, match="no voltage"): + mv.thermo.voltage(merged, working_ion="Li", level="ref", + reference=metal) + # The sodium analogue has no lithium pair, so it gets no voltage. + assert np.isnan(float(merged.obs["voltage_ref"].iloc[2])) + assert np.isfinite(float(merged.obs["voltage_ref"].iloc[0])) + + def test_it_needs_energies(self): + cathode, metal = _olivine_pair() + del cathode.obs["energy_ref"] + with pytest.raises(ValueError, match="mv.calc.relax"): + mv.thermo.voltage(cathode, working_ion="Li", level="ref", + reference=metal) + + +class TestScattering: + """S(q) and G(r) are definitions, so they can be checked against closed + forms rather than against another code.""" + + SIGMA = 3.0 + DENSITY = 0.05 + + @classmethod + def _hard_sphere(cls, step=0.005, r_max=20.0): + from matverse._core import deposit_grid + from pymatgen.core import Lattice, Structure + + side = (400 / cls.DENSITY) ** (1 / 3) + rng = np.random.default_rng(0) + cell = Structure(Lattice.cubic(side), ["Ar"] * 400, rng.random((400, 3))) + md = mv.data.from_structures([cell]) + r = np.arange(step, r_max, step) + g = np.where(r < cls.SIGMA, 0.0, 1.0) + deposit_grid(md, "rdf", "test", g[None, :], r, unit="angstrom") + return md, r + + @classmethod + def _analytic(cls, q): + """S(q) for a step g(r): 1 - 4 pi rho / q^3 [sin(qd) - qd cos(qd)].""" + d = cls.SIGMA + return 1.0 - 4 * np.pi * cls.DENSITY / q ** 3 * ( + np.sin(q * d) - q * d * np.cos(q * d)) + + def test_an_ideal_gas_has_a_structure_factor_of_one(self): + """g = 1 everywhere means no structure, and S(q) says so exactly.""" + from matverse._core import deposit_grid, grid_of + from pymatgen.core import Lattice, Structure + + cell = Structure(Lattice.cubic(20.0), ["Ar"], [[0, 0, 0]]) + md = mv.data.from_structures([cell]) + r = np.arange(0.01, 20.0, 0.005) + deposit_grid(md, "rdf", "ideal", np.ones((1, r.size)), r, + unit="angstrom") + mv.prop.scattering(md, level="ideal", q_max=12.0, n_points=40) + factor = md.obsm["structure_factor_ideal"][0] + assert factor == pytest.approx(np.ones_like(factor), abs=1e-6) + + def test_it_reproduces_the_hard_sphere_transform(self): + from matverse._core import grid_of + + md, _ = self._hard_sphere() + mv.prop.scattering(md, level="test", q_max=12.0, n_points=60) + q = grid_of(md, "structure_factor") + computed = md.obsm["structure_factor_test"][0] + assert np.abs(computed - self._analytic(q)).max() < 0.03 + + def test_the_error_follows_the_r_grid_it_was_given(self): + """The integral is quadrature on whatever mv.prop.rdf produced, so a + coarser step is a worse S(q) — linearly. Stated in the notes as 0.24, + 0.12, 0.048 and 0.012 for steps of 0.10, 0.05, 0.02 and 0.005, and + asserted here as monotone so the claim cannot rot.""" + from matverse._core import grid_of + + errors = [] + for step in (0.10, 0.02): + md, _ = self._hard_sphere(step=step) + mv.prop.scattering(md, level="test", q_max=12.0, n_points=60) + q = grid_of(md, "structure_factor") + errors.append(float(np.abs( + md.obsm["structure_factor_test"][0] - self._analytic(q)).max())) + assert errors[0] > errors[1] * 2 + + def test_the_reduced_pdf_is_the_definition(self): + """G(r) = 4 pi r rho [g(r) - 1], with nothing fitted.""" + md, r = self._hard_sphere() + mv.prop.scattering(md, level="test", q_max=12.0, n_points=20) + reduced = md.obsm["pdf_test"][0] + inside = r < self.SIGMA + assert reduced[inside] == pytest.approx( + -4 * np.pi * r[inside] * self.DENSITY, rel=1e-6) + assert reduced[r > self.SIGMA] == pytest.approx(0.0, abs=1e-12) + + def test_it_names_the_missing_step(self): + md = mv.data.from_compositions(["Ar"]) + with pytest.raises(ValueError, match="mv.prop.rdf"): + mv.prop.scattering(md, level="nothing") + + +class TestSuperconductivity: + """Half computed, half supplied, and the tests keep the halves apart.""" + + @staticmethod + def _with_dos(frequencies, weights=None, f_max=20.0, n=4000): + from matverse._core import deposit_grid + from pymatgen.core import Lattice, Structure + + grid = np.linspace(0.1, f_max, n) + density = np.zeros_like(grid) + for j, centre in enumerate(np.atleast_1d(frequencies)): + height = 1.0 if weights is None else weights[j] + density += height * np.exp(-0.5 * ((grid - centre) / 0.02) ** 2) + md = mv.data.from_structures( + [Structure(Lattice.cubic(3.6), ["Cu"], [[0, 0, 0]])]) + deposit_grid(md, "phonon_dos", "test", density[None, :], grid, + unit="THz") + return md + + def test_a_single_frequency_returns_itself(self): + """omega_log of a delta at w0 is w0, by construction.""" + for centre in (3.0, 8.0): + md = self._with_dos(centre) + mv.prop.superconductivity(md, level="test", coupling=1.0) + assert float(md.obs["omega_log_test"].iloc[0]) == \ + pytest.approx(centre, rel=1e-3) + + def test_the_soft_end_is_weighted_more(self): + """The 1/omega weighting puts the logarithmic average of 4 and 16 THz + below their geometric mean of 8.""" + md = self._with_dos([4.0, 16.0]) + mv.prop.superconductivity(md, level="test", coupling=1.0) + value = float(md.obs["omega_log_test"].iloc[0]) + assert value < 8.0 + assert value == pytest.approx(5.28, rel=0.02) + + def test_coupling_has_no_default(self): + """matverse cannot compute lambda, and a guessed one produces a + temperature that reads as a prediction.""" + md = self._with_dos(6.0) + with pytest.raises(ValueError, match="coupling="): + mv.prop.superconductivity(md, level="test") + + def test_tc_vanishes_at_the_formula_s_own_limit(self): + """As lambda approaches mu*(1 + 0.62 lambda) the exponent diverges. + That is where the formula stops having a solution, not where + superconductivity stops, and it returns exactly zero rather than an + overflow.""" + from matverse.prop import _allen_dynes + + assert _allen_dynes(0.10, 232.0, 252.0, 0.13) == 0.0 + assert _allen_dynes(0.05, 232.0, 252.0, 0.13) == 0.0 + assert _allen_dynes(1.00, 232.0, 252.0, 0.13) > 1.0 + + def test_the_strong_coupling_factors_are_included(self): + """Allen-Dynes with f1 and f2, not bare McMillan. They agree within a + few per cent at lambda = 0.5 and differ by a third at lambda = 3; + leaving them out is the usual reason a strong-coupling estimate comes + out low.""" + from matverse.prop import _allen_dynes + + def mcmillan(lam, w_log, mu=0.13): + return w_log / 1.2 * np.exp( + -1.04 * (1 + lam) / (lam - mu * (1 + 0.62 * lam))) + + weak = _allen_dynes(0.5, 100.0, 150.0, 0.13) / mcmillan(0.5, 100.0) + strong = _allen_dynes(3.0, 100.0, 150.0, 0.13) / mcmillan(3.0, 100.0) + assert weak == pytest.approx(1.0, abs=0.05) + assert strong > 1.25 + + def test_it_records_that_the_dos_stood_in_for_alpha2F(self): + md = self._with_dos(6.0) + mv.prop.superconductivity(md, level="test", coupling=1.0) + recorded = md.uns["superconductivity"]["test"] + assert "alpha^2 F" in recorded["spectral_function"] + assert "not computed here" in recorded["coupling_source"] + + +class TestCatalysisScaling: + """A scaling relation is a straight line, so a synthetic one with a known + slope says whether the fit is a fit.""" + + @staticmethod + def _surfaces(slope=0.5, intercept=-0.10, noise=0.02, n=8): + rng = np.random.default_rng(0) + oxygen = np.linspace(-2.5, 0.5, n) + md = mv.data.from_compositions([f"Pt{i + 1}" for i in range(n)]) + md.obs["E_O"] = oxygen + md.obs["E_OH"] = slope * oxygen + intercept + rng.normal(0, noise, n) + return md + + def test_it_recovers_a_known_slope(self): + md = self._surfaces() + mv.surf.scaling(md, x="E_O", y="E_OH") + fit = md.uns["scaling"]["fits"]["all"] + assert fit["slope"] == pytest.approx(0.5, abs=0.02) + assert fit["intercept_eV"] == pytest.approx(-0.10, abs=0.03) + assert fit["r_squared"] > 0.99 + + def test_the_residual_is_the_departure_from_the_line(self): + """The interesting column: a surface that beats the scaling ceiling + has to break the relation, so the residual is the candidate signal + and the fit is the background.""" + md = self._surfaces() + mv.surf.scaling(md, x="E_O", y="E_OH") + residual = md.obs["scaling_residual"].to_numpy(dtype=float) + predicted = (md.uns["scaling"]["fits"]["all"]["slope"] + * md.obs["E_O"].to_numpy(dtype=float) + + md.uns["scaling"]["fits"]["all"]["intercept_eV"]) + assert residual == pytest.approx( + md.obs["E_OH"].to_numpy(dtype=float) - predicted, abs=1e-9) + + def test_two_points_are_not_a_scaling_relation(self): + md = self._surfaces(n=2) + with pytest.raises(ValueError, match="not a scaling relation"): + mv.surf.scaling(md, x="E_O", y="E_OH") + + def test_a_missing_column_lists_what_is_there(self): + md = self._surfaces() + with pytest.raises(ValueError, match="mv.surf.adsorption_energy"): + mv.surf.scaling(md, x="E_O", y="E_nothing") + + +class TestVolcano: + @staticmethod + def _surfaces(): + md = mv.data.from_compositions([f"Pt{i + 1}" for i in range(8)]) + md.obs["E_O"] = np.linspace(-2.5, 0.5, 8) + return md + + def test_the_peak_sits_at_the_optimum(self): + md = self._surfaces() + mv.surf.volcano(md, descriptor="E_O", optimum=-1.6) + best = int(np.argmax(md.obs["volcano_activity"].to_numpy(dtype=float))) + distances = np.abs(md.obs["distance_from_optimum"].to_numpy(float)) + assert best == int(np.argmin(distances)) + + def test_the_distance_is_signed_so_the_side_is_readable(self): + """Binding too weakly and too strongly are different problems, and a + magnitude cannot tell them apart.""" + md = self._surfaces() + mv.surf.volcano(md, descriptor="E_O", optimum=-1.6) + offset = md.obs["distance_from_optimum"].to_numpy(dtype=float) + assert offset.min() < 0 < offset.max() + + def test_slopes_of_the_same_sign_are_refused(self): + """Two limbs with the same sign is a straight line dressed as a + peak.""" + md = self._surfaces() + with pytest.raises(ValueError, match="opposite"): + mv.surf.volcano(md, descriptor="E_O", optimum=-1.6, + slopes=(1.0, 1.0)) + + def test_it_records_that_the_optimum_came_from_outside(self): + md = self._surfaces() + mv.surf.volcano(md, descriptor="E_O", optimum=-1.6) + assert "not derived here" in md.uns["volcano"]["optimum_source"] + + +class TestFigureOfMerit: + """zT needs a relaxation time nobody has. The ceiling does not, and that + is the point of computing it separately.""" + + @staticmethod + def _transport(seebeck=200e-6, sigma_over_tau=1e18, lattice=None): + md = mv.data.from_compositions(["Bi2Te3"]) + md.obs["seebeck_x"] = [seebeck] + md.obs["sigma_over_tau_x"] = [sigma_over_tau] + if lattice is not None: + md.obs["thermal_conductivity_x"] = [lattice] + return md + + def test_the_ceiling_needs_no_relaxation_time(self): + """tau cancels between sigma and the electronic thermal conductivity, + so S^2 / L survives not knowing it. At 200 microvolts per kelvin that + is 1.639.""" + md = self._transport(lattice=1.0) + mv.prop.zt(md, level="x", relaxation_time=1e-14, temperature=700.0) + assert float(md.obs["zt_ceiling_x"].iloc[0]) == \ + pytest.approx(1.639, rel=0.01) + + def test_zt_approaches_the_ceiling_as_the_lattice_stops_mattering(self): + """Checked across four decades of conductivity: 0.027, 0.24, 1.03, + 1.55 and then 1.6384 against an analytic 1.6393.""" + values = [] + for sigma in (1e17, 1e18, 1e19, 1e22): + md = self._transport(sigma_over_tau=sigma, lattice=1.0) + mv.prop.zt(md, level="x", relaxation_time=1e-14, temperature=700.0) + values.append(float(md.obs["zt_x"].iloc[0])) + assert values == sorted(values), "zT must rise with conductivity" + ceiling = float(md.obs["zt_ceiling_x"].iloc[0]) + assert values[-1] == pytest.approx(ceiling, rel=0.01) + assert values[-1] < ceiling, "the ceiling is approached, not crossed" + + def test_the_relaxation_time_has_no_default(self): + md = self._transport(lattice=1.0) + with pytest.raises(ValueError, match="relaxation_time="): + mv.prop.zt(md, level="x") + + def test_a_missing_lattice_conductivity_is_warned_about(self): + """Counting only the electronic part flatters every material, so the + omission is said out loud rather than absorbed.""" + md = self._transport() + with pytest.warns(RuntimeWarning, match="overestimate"): + mv.prop.zt(md, level="x", relaxation_time=1e-14) + + def test_it_needs_transport_first(self): + md = mv.data.from_compositions(["Bi2Te3"]) + with pytest.raises(ValueError, match="mv.elec.transport"): + mv.prop.zt(md, level="x", relaxation_time=1e-14)