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