s_transforms ¤
Utilities for converting between S-parameters.
Utilities for converting between S-parameter and admittance representations, and for wrapping SAX model functions as circulax components.
Functions:
| Name | Description |
|---|---|
fdomain_component | Decorator for frequency-domain (admittance) circuit components. |
s_to_y | Convert an S-parameter matrix to an admittance (Y) matrix. |
sax_component | Decorator to convert a SAX model function into a circulax component. |
fdomain_component ¤
Decorator for frequency-domain (admittance) circuit components.
Compiles the decorated admittance function into a :class:~circulax.components.base_component.CircuitComponent subclass that is evaluated in the frequency domain rather than the time domain. The component:
- DC analysis — evaluated at
f = 0Hz (e.g. skin-effect reduces toR₀at DC). - Harmonic Balance — evaluated at each harmonic frequency
k · f₀, contributingY(k · f₀) @ V_kdirectly to the frequency-domain residual. - Transient simulation — raises :exc:
RuntimeErrorat setup time (time-domain convolution not supported).
The decorated function must accept f as its first positional argument (frequency in Hz) followed by any number of keyword parameters with defaults. It must return a square Y-matrix of shape (n_ports, n_ports) with dtype=complex128.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
ports | tuple[str, ...] | Ordered tuple of port names matching the netlist connection keys. | required |
Returns:
| Type | Description |
|---|---|
Any | A decorator that accepts an admittance function and returns a |
Any | class: |
Example::
@fdomain_component(ports=("p1", "p2"))
def SkinEffectResistor(f: float, R0: float = 1.0, a: float = 0.1):
"""Z(f) = R0 + a * sqrt(|f|)"""
Z = R0 + a * jnp.sqrt(jnp.abs(f) + 1e-30)
Y = 1.0 / Z
return jnp.array([[Y, -Y], [-Y, Y]], dtype=jnp.complex128)
Source code in circulax/s_transforms.py
s_to_y ¤
Convert an S-parameter matrix to an admittance (Y) matrix.
Uses the formula Y = (1/z0) * (I - S) * (I + S)^-1. Requires dense matrix inversion; if a component can be defined directly in terms of a Y-matrix it should be, to avoid the overhead of this conversion.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
S | Array | S-parameter matrix of shape | required |
z0 | float | Reference impedance in ohms. Defaults to | 1.0 |
Returns:
| Type | Description |
|---|---|
Array | Y-matrix of the same shape and dtype as |
Source code in circulax/s_transforms.py
sax_component ¤
Decorator to convert a SAX model function into a circulax component.
Inspects fn at decoration time to discover its port interface via a dry run, then wraps its S-matrix output in an admittance-based physics function compatible with the circulax nodal solver.
The conversion proceeds in three stages:
- Discovery —
fnis called once with its default (or dummy) parameter values and :func:sax.get_portsextracts the sorted port names from the resulting S-parameter dict. - Physics wrapper — a closure is built that calls
fnat runtime, converts the S-dict to a dense matrix via :func:sax.sdense, converts it to an admittance matrix via :func:s_to_y, and returnsI = Y @ Vas a port current dict. - Component registration — the wrapper is passed to :func:
~circulax.components.base_component.componentwith the discovered ports, producing a :class:~circulax.components.base_component.CircuitComponentsubclass.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
fn | callable | A SAX model function whose keyword arguments are scalar parameters and whose return value is a SAX S-parameter dict. All parameters must have defaults, or will be substituted with | required |
Returns:
| Name | Type | Description |
|---|---|---|
A | callable | class: |
callable | subclass named after |
Raises:
| Type | Description |
|---|---|
RuntimeError | If the dry run fails for any reason. |