Computing arbitrary scattering matrices¶
The internal functions for computing coupling coefficient matrices
during a simulation are also exposed via specific methods in the
finesse.knm
sub-module. The most-general function for computing
these matrices is make_scatter_matrix()
- this requires the matrix
type as the first argument, mapping to one of the specific scattering
matrix functions in this module.
As these Python-facing functions internally call the same C functions used to compute coupling coefficients during simulations, you can rest assured that these routines are highly optimised - allowing for fast computation of these matrices.
Calculating coupling matrices via the Bayer-Helms formalism¶
To compute a scattering matrix based on a system with mode-mismatches and
tilt (angular) misalignments, one can use make_bayerhelms_matrix()
(or
make_scatter_matrix()
with “bayerhelms” as the type, as noted above).
This function requires the input and output beam parameters, in both tangential and sagittal planes, as well as the misalignment angles in both planes. One can optionally provide a medium refractive index (defaults to \(n_r = 1\)) and / or a beam wavelength (defaults to \(\lambda = 1064\,\mathrm{nm}\)) too.
As an example, below, we compute a scattering matrix with only mismatches present, up to a maxtem of 5 (see Selecting the modes to model):
import finesse
finesse.configure(plotting=True)
from finesse.knm.tools import make_scatter_matrix
# Non-astigmatic beam with 20% mismatch in w0
# from input to output
qx1 = qy1 = finesse.BeamParam(w0=1e-3, z=0)
qx2 = qy2 = finesse.BeamParam(w0=1.2e-3, z=0)
# No angular misalignments
xgamma = ygamma = 0
# Compute the scattering matrix, returning a KnmMatrix object
kmat = make_scatter_matrix(
"bayerhelms",
qx1, qx2, qy1, qy2,
xgamma, ygamma,
maxtem=5,
)
# Plot the absolute value of the coupling
# coefficients as a colormesh
kmat.plot(cmap="bone");
As expected, we get a plot showing non-zero couplings for even mode orders. Note
that the kmat
object here will be a KnmMatrix
object, providing
a convenient interface for accessing specific coupling coefficients, printing the
matrix and plotting the matrix. The KnmMatrix.plot()
method computes and
plots the absolute value of the coefficients by default; this can be altered as
shown in the documentation for this method.
This function also accepts mode selection keyword arguments, allowing for custom
mode indices to be used (see Selecting the modes to model and make_modes()
). For
example, in this case we could select just even modes as we know that no angular
misalignments are present:
kmat = make_scatter_matrix(
"bayerhelms",
qx1, qx2, qy1, qy2,
xgamma, ygamma,
select="even", maxtem=8,
)
kmat.plot(cmap="bone");
Accessing specific couplings
As implied previously, the return type of make_scatter_matrix()
is a
KnmMatrix
object. Along with plotting and stringifying, this object
provides a dict-like interface for accessing coupling coefficients in the matrix.
Here are a few convenient ways of accessing these coefficients:
# Using the "nm->n'm'" format
print("Coupling coeff. from 00 -> 02 = ", kmat["00->02"])
# Using the "nmn'm'" format
print("Coupling coeff. from 02 -> 40 = ", kmat["0240"])
# Using the (n, m, n', m') format
print("Coupling coeff. from 26 -> 44 = ", kmat[(2, 6, 4, 4)])
Coupling coeff. from 00 -> 02 = (-0.1254207136745824+0j)
Coupling coeff. from 02 -> 40 = (0.0024975293572353312+0j)
Coupling coeff. from 26 -> 44 = (-0.12938973739354842+0j)