Skip to content

Elements

metasurface_py.elements

Unit-cell response models and state representations.

AmplitudePhaseCell dataclass

Element with coupled amplitude-phase response.

Common in varactor-based designs where the amplitude and phase are both functions of the control voltage/state.

Parameters:

Name Type Description Default
state_space StateSpace

Admissible state space.

required
amplitude_vs_state NDArray[floating[Any]]

Amplitude values at codebook points.

required
phase_vs_state NDArray[floating[Any]]

Phase values [rad] at codebook points.

required
control_points NDArray[floating[Any]] | None

Control state values corresponding to amplitude/phase arrays. If None, uses uniform spacing over [0, 2*pi].

None
num_states property

Number of discrete states, or None for continuous.

response(state, freq, theta_inc=0.0, phi_inc=0.0)

Compute coupled amplitude-phase response.

Interpolates amplitude and phase as functions of the control state.

Parameters:

Name Type Description Default
state NDArray[floating[Any]]

Control state values, shape (N,).

required
freq float

Frequency [Hz] (unused in this model).

required
theta_inc float

Incident angle [rad] (unused).

0.0
phi_inc float

Incident angle [rad] (unused).

0.0

Returns:

Type Description
NDArray[complexfloating[Any, Any]]

Complex response, shape (N,).

LookupTableCell dataclass

Unit-cell model based on a lookup table of measured/simulated responses.

The table stores complex response indexed by (state, freq, theta_inc). Interpolation is used for intermediate values.

This is the Level 1 model: angle- and frequency-dependent element response.

Parameters:

Name Type Description Default
table DataArray

Complex response data with dims (state, freq, theta).

required
state_space StateSpace

The state space derived from the table.

required
num_states property

Number of discrete states.

from_csv(path, state_col='state', freq_col='freq', theta_col='theta', mag_col='magnitude', phase_col='phase_deg') classmethod

Load lookup table from a CSV file.

Expects columns for state, frequency, theta, magnitude, and phase.

Parameters:

Name Type Description Default
path str | Path

Path to CSV file.

required
state_col str

Column name for state values.

'state'
freq_col str

Column name for frequency values [Hz].

'freq'
theta_col str

Column name for incidence angle [degrees].

'theta'
mag_col str

Column name for response magnitude (linear).

'magnitude'
phase_col str

Column name for response phase [degrees].

'phase_deg'
from_hdf5(path) classmethod

Load lookup table from an HDF5/NetCDF file.

from_xarray(table) classmethod

Create from an xarray DataArray with dims (state, freq, theta).

The 'state' coordinate should contain phase values in radians or codebook indices.

response(state, freq, theta_inc=0.0, phi_inc=0.0)

Compute interpolated complex response.

Parameters:

Name Type Description Default
state NDArray[floating[Any]]

Phase values in radians, shape (N,).

required
freq float

Frequency [Hz].

required
theta_inc float

Incident polar angle [rad].

0.0
phi_inc float

Incident azimuthal angle [rad] (unused — table is phi-symmetric).

0.0

Returns:

Type Description
NDArray[complexfloating[Any, Any]]

Complex response coefficients, shape (N,).

PhaseOnlyCell dataclass

Ideal phase-shifting element.

Each element applies a pure phase shift with optional fixed amplitude. This is the simplest model (Level 0): no frequency or angle dependence.

Parameters:

Name Type Description Default
state_space StateSpace

Admissible state space (continuous or discrete phase).

required
amplitude float

Fixed amplitude for all elements (default 1.0 = lossless).

1.0
num_states property

Number of discrete states, or None for continuous.

response(state, freq, theta_inc=0.0, phi_inc=0.0)

Compute complex response: amplitude * exp(j * phase).

Parameters:

Name Type Description Default
state NDArray[floating[Any]]

Phase values in radians, shape (N,).

required
freq float

Frequency [Hz] (unused in this model).

required
theta_inc float

Incident polar angle [rad] (unused in this model).

0.0
phi_inc float

Incident azimuthal angle [rad] (unused in this model).

0.0

Returns:

Type Description
NDArray[complexfloating[Any, Any]]

Complex reflection/transmission coefficients, shape (N,).

StateSpace dataclass

Base state space description.

Parameters:

Name Type Description Default
kind Literal['continuous', 'discrete']

"continuous" or "discrete".

required
num_bits int | None

Number of bits for discrete states (None for continuous).

None
codebook NDArray[complexfloating[Any, Any]] | None

Complex codebook values for discrete states.

None
bounds tuple[float, float] | None

(lower, upper) bounds for continuous states.

None

UnitCellModel

Bases: Protocol

Protocol for any unit-cell response model.

A UnitCellModel maps control state + incident conditions to complex reflection or transmission coefficients.

num_states property

Number of discrete states, or None for continuous.

state_space property

The admissible state space for this cell.

response(state, freq, theta_inc=0.0, phi_inc=0.0)

Compute complex response for given states and incident conditions.

Parameters:

Name Type Description Default
state NDArray[floating[Any]]

Control state values, shape (N,) where N is number of elements. For phase-only cells, values are phases in radians. For discrete cells, values are codebook indices (as floats).

required
freq float

Frequency [Hz].

required
theta_inc float

Incident polar angle [rad].

0.0
phi_inc float

Incident azimuthal angle [rad].

0.0

Returns:

Type Description
NDArray[complexfloating[Any, Any]]

Complex response coefficients, shape (N,).

ContinuousPhaseSpace(bounds=(0.0, 2 * np.pi))

Create a continuous phase state space.

Parameters:

Name Type Description Default
bounds tuple[float, float]

(lower, upper) phase bounds in radians.

(0.0, 2 * pi)

CustomCodebook(values)

Create a discrete state space from an arbitrary complex codebook.

Parameters:

Name Type Description Default
values NDArray[complexfloating[Any, Any]]

Complex codebook entries, shape (num_states,).

required

DiscretePhaseSpace(num_bits)

Create a discrete uniform-phase state space.

Generates a uniform codebook with 2^num_bits states evenly spaced around the unit circle.

Parameters:

Name Type Description Default
num_bits int

Number of quantization bits (1 -> 2 states, 2 -> 4 states, etc.).

required

quantize(continuous_state, codebook)

Project continuous phase values to nearest codebook entries.

Parameters:

Name Type Description Default
continuous_state NDArray[floating[Any]]

Phase values in radians, shape (N,).

required
codebook NDArray[complexfloating[Any, Any]]

Complex codebook entries, shape (M,).

required

Returns:

Type Description
NDArray[floating[Any]]

Quantized phase values in radians, shape (N,).

random_state(space, shape, rng=None)

Generate random states from a state space.

Parameters:

Name Type Description Default
space StateSpace

The state space to sample from.

required
shape int | tuple[int, ...]

Shape of the output array.

required
rng Generator | None

Random number generator. Uses default if None.

None

Returns:

Type Description
NDArray[floating[Any]]

Random state values (phases in radians for phase spaces).