Skip to content

Wave Ports

WavePort represents a modal source port for RF and microwave simulations. The port mode is first solved in a 2D mode solver with characteristic impedance calculation, then injected into the 3D simulation. The port is automatically terminated with a modal absorbing boundary for the outgoing mode.

from flex_rf.tidy3d import AutoImpedanceSpec, MicrowaveModeSpec, WavePort
my_wave_port_1 = WavePort(
center=(0, 0, 0),
size=(port_width, port_height, 0),
name="My Wave Port 1",
direction="+",
mode_spec=MicrowaveModeSpec(
num_modes=1,
target_neff=1.5,
impedance_specs=AutoImpedanceSpec(),
),
)

mode_spec controls the mode solver settings and impedance calculation. Use AutoImpedanceSpec for automatic voltage and current path setup, or CustomImpedanceSpec for manual control.

Wave ports can solve and inject multiple modes, which is useful for multimode waveguides and transmission lines.

from flex_rf.tidy3d import AutoImpedanceSpec, MicrowaveModeSpec, WavePort
multimode_port = WavePort(
center=(0, 0, 0),
size=(4, 4, 0),
direction="+",
mode_spec=MicrowaveModeSpec(
num_modes=3,
impedance_specs=AutoImpedanceSpec(),
),
name="multimode_port",
)

When creating sources from a multimode port, specify the mode index.

from flex_rf.tidy3d import GaussianPulse
source_time = GaussianPulse(freq0=10e9, fwidth=1e9)
source_mode0 = multimode_port.to_source(source_time, mode_index=0)
source_mode1 = multimode_port.to_source(source_time, mode_index=1)
source_mode2 = multimode_port.to_source(source_time, mode_index=2)

You can also provide different impedance calculations for each mode.

from flex_rf.tidy3d import AutoImpedanceSpec, CustomImpedanceSpec, MicrowaveModeSpec
mode_spec = MicrowaveModeSpec(
num_modes=2,
impedance_specs=(
CustomImpedanceSpec(...),
AutoImpedanceSpec(),
),
)

Use to_mode_solver() to solve the 2D port mode without a full 3D simulation.

from flex_rf import web
my_mode_solver = my_wave_port_1.to_mode_solver(
simulation=base_sim,
freqs=my_frequencies,
)
my_mode_data = web.run(my_mode_solver, task_name="mode solver")

The result is MicrowaveModeSolverData with mode fields and transmission-line parameters.

After running a component model with a wave port, access characteristic impedance and voltage/current coefficients from the mode data.

mode_data = tcm_data.data["port1"]["mode_monitor"]
z0_mode0 = mode_data.transmission_line_data.Z0.sel(mode_index=0)
voltage_coeff = mode_data.transmission_line_data.voltage_coeffs.sel(mode_index=0)
current_coeff = mode_data.transmission_line_data.current_coeffs.sel(mode_index=0)

You can also use the port helper.

z0 = my_wave_port_1.get_port_impedance(mode_data, mode_index=0)

TerminalWavePort is a terminal-driven wave port that supports single-ended and differential terminal excitations.

from flex_rf.tidy3d import TerminalWavePort
my_terminal_wave_port = TerminalWavePort(
center=(0, 0, 0),
size=(4, 4, 0),
name="My Terminal Wave Port",
direction="+",
differential_pairs=(("T0", "T1"),),
)
PageWhy open it
RF Mode AnalysisConfigure microwave mode specs and impedance extraction.
Path IntegralsDefine manual voltage and current paths.
Terminal Component ModelerUse wave ports in multiport component workflows.