Source code for psc_sim.simulation.types

"""Shared types for I–V sweeps and simulation results."""

from __future__ import annotations

from dataclasses import dataclass

import numpy as np


[docs] @dataclass(frozen=True) class SweepSpec: v_min: float = -0.3 v_max: float = 1.25 step: float = 0.01
[docs] @dataclass class IVResult: V: np.ndarray I: np.ndarray P: np.ndarray truncated: bool = False
[docs] @classmethod def from_arrays(cls, V: np.ndarray, I: np.ndarray, P: np.ndarray) -> IVResult: return cls(V=V, I=I, P=P, truncated=bool(np.any(~np.isfinite(I))))
[docs] @dataclass(frozen=True) class RsFitMask: """Rs linear-fit interval on the I_mA axis (generation-positive convention).""" i_mA_lo: float i_mA_hi: float positive_generation: bool = True
[docs] @dataclass(frozen=True) class TranSpec: """LTspice .tran step/stop and Vbias PULSE (times in seconds; formatted with m = ms).""" t_step_s: float = 0.1e-3 t_stop_s: float = 10e-3 pulse_v_low: float = 0.0 pulse_v_high: float = 0.5 pulse_delay_s: float = 1e-3 pulse_rise_s: float = 0.1e-3 pulse_fall_s: float = 0.1e-3 pulse_on_s: float = 5e-3 pulse_period_s: float = 10e-3
[docs] @dataclass class MeasuredEIS: """Measured EIS curve loaded from CSV (freq_hz, Re(Z), Im(Z)).""" freqs_hz: np.ndarray zre: np.ndarray zim: np.ndarray @classmethod def from_arrays( cls, freqs_hz: np.ndarray, zre: np.ndarray, zim: np.ndarray, ) -> MeasuredEIS: return cls( freqs_hz=np.asarray(freqs_hz, dtype=float), zre=np.asarray(zre, dtype=float), zim=np.asarray(zim, dtype=float), )
[docs] @dataclass class TRANResult: """Transient waveform from LTspice .tran.""" t: np.ndarray V: np.ndarray I: np.ndarray