BraggGratingModel
BraggGratingModel( *, period: Annotated[float, exclusiveMinimum=0, units='μm'] | collections.abc.Sequence[ Annotated[float, exclusiveMinimum=0, units='μm'] ] | photonforge.Expression | photonforge.Interpolator | str, num_periods: Annotated[int, exclusiveMinimum=0], coupling_coefficient: Annotated[float, minimum=0, units='μm⁻¹'], n_eff: Annotated[float, exclusiveMinimum=0] | photonforge.Interpolator, n_group: Annotated[float, exclusiveMinimum=0] | None = None, reference_frequency: Annotated[float, minimum=0, units='Hz'] | None = None, order: Annotated[int, exclusiveMinimum=0] = 1, loss: Annotated[float, minimum=0, units='dB/μm'] = 0.0, apodization: Literal['uniform', 'gaussian', 'raised-cosine', 'blackman'] | collections.abc.Sequence[float] | photonforge.Interpolator | photonforge.Expression | str = 'uniform', apodization_parameter: float = 3.0, phase_shifts: collections.abc.Sequence[ tuple[ typing.Annotated[float, maximum=1, minimum=0], typing.Annotated[float, units='rad'], ] ] = (), num_sections: Annotated[int, exclusiveMinimum=0] | None = None, ports: Annotated[collections.abc.Sequence[str], maxItems=2, minItems=2] | None = None,) -> NoneWaveguide Bragg grating from coupled-mode theory.
Two counter-propagating modes exchange power along the grating,
for grating order . Each section of length has the closed-form solution
written with rather than so the limit at the band edge is taken analytically. Discretization only matters when the grating varies along its length.
Args
- period: Grating period . A 1D array,
Interpolator,Expressionor expression string over the normalized positionuin [0, 1] gives an arbitrary chirp profile. - num_periods: Number of grating periods.
- coupling_coefficient: Peak coupling . Scaled along the grating by
apodization. - n_eff: Effective index of the unperturbed waveguide, or an
Interpolatorover frequency for full dispersion. - n_group: Group index. With
reference_frequencythis adds first-order dispersion to a scalarn_eff. Ignored ifn_effis anInterpolator. - reference_frequency: Frequency at which a scalar
n_effapplies. - order: Grating order .
- loss: Power propagation loss of the underlying waveguide, in dB/μm.
- apodization: Profile of along the grating: one of
"uniform","gaussian","raised-cosine","blackman", a 1D array,Interpolator,Expressionor expression string inuover [0, 1] for an arbitrary analytic window. - apodization_parameter: Shape parameter for
"gaussian"and"raised-cosine". - phase_shifts: Sequence of
(position, phase)pairs, with position the normalized coordinateuin [0, 1] and phase in radians. Each applies a step in the grating phase from that point on, so a phase of is the standard quarter-wave shift and opens a transmission resonance at the Bragg wavelength. - num_sections: Number of sections used to discretize the grating. If
None,min(num_periods, 400)is used. - ports: Input and output port names. If not set, the sorted list of port names of the relevant classification is used.
Note
The average index change that usually accompanies apodization, which
chirps the local Bragg wavelength unless it is compensated, is not
modelled. Supply it through period if it matters.
References
Erdogan, T. (1997). Fiber grating spectra. Journal of Lightwave Technology, 15(8), 1277-1294.
Methods
Section titled “Methods”| Method | Description |
|---|---|
autograd_smatrix | Compute an autograd-compatible S matrix for traced parameters. |
black_box_component | Create a black-box component using this model. |
bragg_wavelength | Bragg wavelength from the mean period and the effective index. |
estimate_cost | Estimate the cost for S matrix computation. |
s_matrix | Compute the S matrix for a component using this model. |
sections | Per-section coupling, period and length. |
setup_time_stepper | Obtain a time stepper for a component using this model. |
start | Start computing the S matrix response from a component. |
transform | Apply a transformation to this model. |
update | Update this model. |
autograd_smatrix
Section titled “autograd_smatrix”autograd_smatrix( self, *, component, traced_params, frequencies, component_for_params, param_names, show_progress=True, model_kwargs=None,)Compute an autograd-compatible S matrix for traced parameters.
Important
This is an abstract method that must be implemented by derived classes that support autograd-based S-matrix computation.
Args
- component (Component): Nominal component associated with this autograd evaluation.
- traced_params (ndarray): Traced parameter vector used by autograd.
- frequencies (Sequence[float]): Frequency values at which to calculate the scattering parameters (in Hz).
- component_for_params (Callable[[ndarray], Component]): Callback that returns the component for a given traced parameter vector.
- param_names (Sequence[str]): Flattened traced parameter names aligned with
traced_params. - show_progress (bool): Progress display hint from
Component.s_matrix. - model_kwargs (dict[str, Any] | None): Model-specific keyword arguments forwarded from
Component.s_matrix.
Returns
AutogradSMatrix: Autograd-compatible S matrix.
black_box_component
Section titled “black_box_component”black_box_component( self, port_spec: str | photonforge.PortSpec | None = None, technology: photonforge.Technology | None = None, name: str | None = None,) -> photonforge.ComponentCreate a black-box component using this model.
The layout is the model’s schematic symbol in a box, sized by the port width, with the port profiles drawn as stubs. The box spans the model’s length when it is set.
Args
- port_spec: Port specification used in the component. If
None, look for"port_spec"inconfig.default_kwargs. - technology: Component technology. If
None, the default technology is used. - name: Component name. If
Nonea default is used.
Returns
Component with ports and model.
bragg_wavelength
Section titled “bragg_wavelength”bragg_wavelength(self, frequency: float | None = None) -> floatBragg wavelength from the mean period and the effective index.
The Bragg condition
is solved self-consistently, so a dispersive n_eff is evaluated at
the Bragg wavelength itself. This is where a uniform grating reflects
most strongly.
Args
- frequency: If set,
n_effis evaluated at this frequency instead of being solved for, and the result is .
Returns
Bragg wavelength in μm.
estimate_cost
Section titled “estimate_cost”estimate_cost(self, *args, **kwargs)Estimate the cost for S matrix computation.
All arguments are passed to the model’s start method with the
addition of the keyword argument cost_estimation=True.
Returns
float: Cost estimation.
s_matrix
Section titled “s_matrix”s_matrix(self, component, frequencies, show_progress=True, model_kwargs={})Compute the S matrix for a component using this model.
Args
- component (Component): Component to perform the calculation.
- frequencies (Sequence[float]): Frequency values at which to calculate the scattering parameters (in Hz).
- show_progress (bool): If
True, show computation progress. - model_kwargs (dict[str, object]): Keyword arguments passed to
Model.start. Accepted arguments depend on the model type.
Returns
SMatrix: Computed S matrix.
Example
Compute only the responses from mode 0 of P0 with Tidy3D to
reduce the number and cost of simulations:
>>> model = pf.Tidy3DModel()>>> s_matrix = model.s_matrix( # doctest: +SKIP... component,... frequencies,... model_kwargs={"inputs": ("P0@0",)},... )A port name such as ("P0",) selects all modes of that port. All
outputs for the selected inputs are returned; responses from
unselected inputs are not computed. Use Model.estimate_cost
with the same inputs passed directly to estimate the reduced run.
sections
Section titled “sections”sections(self) -> tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray]Per-section coupling, period and length.
Returns
Tuple (kappa, period, length), each of length num_sections.
kappa is complex and already carries the apodization and the
cumulative grating phase from phase_shifts.
setup_time_stepper
Section titled “setup_time_stepper”setup_time_stepper( self, component, time_step, carrier_frequency=0, show_progress=True, time_stepper_kwargs={},)Obtain a time stepper for a component using this model.
Args
- component (Component): Component for the time stepper.
- time_step (float): The interval between time steps (in seconds).
- carrier_frequency (float): The carrier frequency used to construct the time stepper. The carrier should be omitted from the input signals, as it is handled automatically by the time stepper.
- show_progress (bool): If
True, show computation progress. - time_stepper_kwargs (dict[str, object]): Keyword arguments passed to
TimeStepper.setup. Each time stepper type can accept a different set of arguments. Check the documentation for the each time stepper’ssetup_statemethod for more information.
Returns
TimeStepper: Initialized time stepper.
start( self, component: photonforge.Component, frequencies: collections.abc.Sequence[float], **kwargs: object,) -> photonforge.SMatrixStart computing the S matrix response from a component.
Args
- component: Component from which to compute the S matrix.
- frequencies: Sequence of frequencies at which to perform the computation.
- **kwargs: Unused.
Returns
S matrix for the requested frequencies, including reflection.
transform
Section titled “transform”transform( self, translation=(0, 0), rotation=0, scaling=1, x_reflection=False)Apply a transformation to this model.
The base implementation is a no-op and returns self. Derived classes
can override this method to transform model-specific geometry settings.
Args
- translation (Sequence[float] | complex): Translation vector.
- rotation (float): Rotation angle in degrees.
- scaling (float): Magnification factor.
- x_reflection (bool): Mirror across the horizontal axis.
Returns
Model: This object with transformations applied.
update
Section titled “update”update(self, *args, **kwargs)Update this model.
All contents of the model are updated with the contents from the updated version. object contents or modifications introduced after the model creation (outside of the original parametric function) are not propagated.
The model’s time stepper does not participate in the update, unless
the __init__ method of the derived model class replaces it via
set_time_stepper.
Args
- *args (object): Positional arguments to the parametric model.
- **kwargs (object): Keyword arguments to the parametric model.
Returns
Model: This model.
Note
The original keyword arguments used to generate the model are stored
and updated with the passed kwargs. This updated version is used
in the function call and will be stored for future updates.
Positional arguments are not stored.
Attributes
Section titled “Attributes”| Attribute | Description |
|---|---|
parametric_function | str: Function used to update the model. |
parametric_kwargs | dict[str, object]: Keyword arguments used to update the model. |
properties | Properties: Object properties. |
random_variables | list[RandomVariable]: Random variables associated to the model’s parameters. |
time_stepper | TimeStepper | None: Time stepper associated with this model. |
parametric_function
Section titled “parametric_function”str: Function used to update the model.
parametric_kwargs
Section titled “parametric_kwargs”dict[str, object]: Keyword arguments used to update the model.
properties
Section titled “properties”Properties: Object properties.
random_variables
Section titled “random_variables”list[RandomVariable]: Random variables associated to the model’s parameters.
time_stepper
Section titled “time_stepper”TimeStepper | None: Time stepper associated with this model.