| |||

Given a modal solution valid for an original, unperturbed waveguide configuration, standard first order perturbation theory permits to evaluate the effect of small alterations in the structure definition on the propagation constant of the mode, or on the effective mode index, respectively. These routines (and their 3-D counterparts ...) are particularly useful for the estimation of fabrication tolerances, helping to avoid repeated mode analysis runs for slightly changed configurations. All perturbational expressions consist of ratios of overlap integrals and are polarization dependent; different expressions apply for

- small changes in the local permittivity , uniform on some interval on the waveguide cross section that is not necessarily small. The modification of the permittivity can be quite general, ranging from simple changes of refractive indices, including imaginary values that represent attenuation, to specific types of anisotropy.
- possibly strong changes in refractive index at a specific dielectric interface, over only a small or infinitesimal interval, representing a shift of the interface position.
- modifications of the vacuum wavelength parameter.

Note that the present first order perturbations are additive. Depending on the
specific parameterization of the waveguide, a change in some parameter,
say, a thickness of some inner layer in a multilayer configuration, might
require to add the effects of the shifts of the positions of several outer
layers.
The procedures return directly the shift of the propagation constant.
Corresponding values for the shifts in effective effective mode indices
`neff` can be obtained by division through `k0` (exception:
alteration of the vacuum wavelength).

**General small uniform perturbations**

One of the variants of the `Mode::phaseshift`-method accepts
an object of type `Perturbation`
(source gengwed.h, gengwed.cpp) that represents a quite
general, anisotropic, not necessarily real modification of the waveguide
permittivity on some specific *x*-interval. The method returns
the corresponding shift of the propagation constant. The driver
pertwg.cpp
exemplifies the use of the subroutine for all parameters that appear in the
definition of a standard three-layer dielectric waveguide,
alongside with rigorous calculations (direct mode analysis of the
respective modified configurations).
The procedure `refindshift` in
gengwed.h,
gengwed.cpp
translates a refractive index alteration into a permittivity perturbation.
Another driver motmphs.cpp
allows to predict nonreciprocal phase shifts of TM modes in a nonsymmetric
waveguide with magnetooptic core, as an example for an anisotropic
perturbation.

Routines: `Mode::phaseshift`, leading argument: a `Perturbation`;
`refindshift`

Example files: pertwg.cpp,
motmphs.cpp,

Relevant source files:
gengwed.h,
gengwed.cpp,
slamode.h,
slamode.cpp.

**Attenuation**

The subroutine `attenuation` in
gengwed.h,
gengwed.cpp
constructs an object of type `Perturbation` that
is meant to represent the various kinds of attenuation mechanisms
found in dielectric optical waveguides. If fed to the
`Mode::phaseshift`-method, this permits to predict
the attenuation experienced by the respective guided wave.
The example motmphs.cpp
shows how to evaluate these perturbational estimates for the
modal attenuation in combination with the computation of
dispersion curves.

Routines: `Mode::phaseshift`, leading argument: a `Perturbation`;
`attenuation`

Example files: attwg.cpp,

Relevant source files:
gengwed.h,
gengwed.cpp,
slamode.h,
slamode.cpp.

**Shifts of dielectric interfaces**

Another variant of the `Mode::phaseshift`-method accepts
an integer index and a displacement value, representing a small shift of the
corresponding dielectric interface by the specified distance.
The driver
pertwg.cpp gives an example, including
benchmarking versus rigorous calculations.
Note that the derivative of the propagation constant with respect to the
interface position can be obtained by supplying the value `1.0` for the
displacement argument.

Routines: `Mode::phaseshift`, leading arguments: `int`, `double` values,

Example file: pertwg.cpp,

Relevant source files:
slamode.h,
slamode.cpp.

**Alteration of the vacuum wavelength**

If a `double` value leads its argument list,
the `Mode::phaseshift`-method estimates the modal phase shift
due to an alteration of the vacuum wavelength by the respective amount.
According to the relation `neff = lambda beta/(2 pi)`,
the shift in the factor `lambda` has to be taken into account as well
for the prediction of the change in the effective mode index. The method
`Mode::neffshift` implements the corresponding expression.
Wavelength derivatives of the propagation constant and
of the effective mode index can be obtained by supplying the value
`1.0` for the wavelength shift argument.
Examples are given in the drivers pertwg.cpp
(a single configuration), and wldisp.cpp
(wavelength dispersion).

Routines: `Mode::neffshift`; `Mode::phaseshift`,
leading argument: `double`,

Example files: pertwg.cpp,
wldisp.cpp,

Relevant source files:
slamode.h,
slamode.cpp.