| |||
Geometry encoding
A BEP or QUEP solution of a scattering problem starts with a specification of the geometrical and material information, as explained in the section on structure definition. Depending on the type of problem it can be advantageous to view the structure as a sequence of Waveguides and to fill a SegWgStruct accordingly. The driver files sgrat.cpp or defcav.cpp give examples. Here the value of the vacuum wavelength is included in the Waveguide objects that eventually constitute the SegWgStruct.
Alternatively a specification of the problems as a rectangular array of refractive index values, accompanied by x- and z-positions of interfaces, can be convenient. This information needs to be entered into a Circuit object which also receives the wavelength parameter; the drivers sqrres.cpp or pcwg.cpp can serve as examples.
Conversion between objects of both types is facilitated by a SegWgStruct-constructor that accepts a Circuit, and by the circuit method of the SegWgStruct, which returns the corresponding Circuit.
Relevant source files: structure.h, structure.cpp.
Spectral discretization
As the next step, field containers BepField, QuepField need to be created on which the solvers operate. As detailed in the paragraphs on spectral discretization of the section on mode analysis procedures, the optical fields are expanded into bidirectional versions of modes attributed to the local vertical (BEP) or vertical and horizontal (QUEP) refractive index profiles of the multilayer stacks that constitute the structure. The corresponding discretization procedures are invoked automatically by specific constructor versions of BepField and QuepField objects. According to the declarations in bepfld.h and quepfld.h, these require the following arguments:
rc | the structure specification in the form of SegWgStruct or Circuit objects, | |
p | the Polarization, either TE or TM, | |
wx | an Interval (cf. structure.h) that defines the vertical computational window; the principal components of the basis modes on the individual slices satisfy Dirichlet boundary conditions on the endpoints of this interval, | |
Mx | the number of expansion terms per vertical slice, order (+1) of the highest order fields included in the local expansions, | |
wz | an Interval (cf. structure.h) that defines the horizontal computational window; the principal components of the basis modes associated with the individual layers satisfy Dirichlet boundary conditions on the endpoints of this interval (QuepField only), | |
Mz | the number of expansion terms per horizontal layer, order (+1) of the highest order fields included in the local expansions (QuepField only), | |
quiet | (optional): if quiet = 1, suppress the log-output. |
Concerning the choice of the computational window, the following issues should be observed (see figures):
A proper choice of the numbers of expansion terms is related to the computational window extension:
As an alternative to the above constructor methods, only the data on the structure and the computational window can be specified by simpler constructor variants, followed by a manual spectral discretization (method discretize). BepFields and QuepFields can be copied and assigned. For BepFields, subscript operators permit to access the expansion bases on given slices, returning ModeArray objects. Within QuepField objects, fields are handled internally as two BepFields associated with the horizontal slice sequence and with the vertical layer stack. Subscripting to the QuepField data members h and v gives access to the quadridirectional expansion bases.
Classes:
BepField,
QuepField.
Relevant source files:
bepfld.h,
bepfld.cpp,
quepfld.h,
quepfld.cpp.
Input specification
The specification of the external influx completes the definition of the scattering problems. In the present context this amounts to prescribing the amplitudes of inwards traveling waves on the outermost slices (BEP), or on the outermost slices and layers (QUEP), respectively. Initially, the amplitudes of all incoming waves are set to zero by the spectral discretization procedures. The field containers BepField, QuepField provide methods input to specify incoming fields. Several variants are vailable, see bepfld.h, bepfld.cpp, quepfld.h, quepfld.cpp for the corresponding declarations / definitions. The methods accept the following arguments (partly alternatives):
bdr |
An identifier for the boundary on which the influx is specified (cf.
the figures above, declarations in
structure.h):
| |
o | The index of an incoming Mode in the spectral discretization on the input slice. In case that the ModeArrays are used unaltered, as set up by the automatic spectral discretization procedures, the integer corresponds directly to the order of the input mode (exception: degenerate modes). | |
m | A Mode object that represents an incoming (guided) wave. Expansion coefficients on the input slice / layer are determined by evaluating suitable overlap integrals between m and the respective basis modes. m can, but does not have to be a valid modal solution for the refractive index profile of the input slice / layer. sqrres.cpp gives an example, where a mode profile of a different Waveguide has to be provided to select a channel in a composite structure with two distant, numerically decoupled, cores. | |
A | A Complex input field amplitude. In case the specified input modes are normalized, as set up by the modesolver routines, |A|^{2} is directly the optical input power. For the present linear, time-harmonic problems, specific relations between amplitude and phase of input fields may become relevant, if interference phenomena for multiple incident waves are studied. | |
gb | A Gaussianbeam object, paraxial representation of a beam that is moderately tilted versus the normal of the input interface; see the declaration in gengwed.h for details. The examples bcross.cpp, bspread.cpp show how localized influx from homogeneous space can be encoded. |
Alternatively, entire vectors of amplitudes for the modes in the outermost (and also inner) slices of a SegWgStuct can be prescribed by means of the setf, setb methods of the BepField container, see the sources bepfld.h, bepfld.cpp for details. Through the h and v data members of QuepFields, these methods also become available for QUEP simulations.
Classes:
BepField,
QuepField.
Relevant source files:
bepfld.h,
bepfld.cpp,
quepfld.h,
quepfld.cpp;
gengwed.h,
gengwed.cpp.
Solution by bi- or quadridirectional eigenmode expansion
Once the specification of the structure, of the computational setting, and of the input fields has been completed, the quasianalytical Helmholtz solvers are invoked by calls to the simulation methods provided by the BepField and QuepField containers, according to the declarations / definitions in bepfld.h, bepfld.cpp, quepfld.h, quepfld.cpp:
bepsim | BEP, solution by bidirectional eigenmode propagation. No arguments are required. Be aware of the limitations introduced by the Dirichlet boundary conditions for the BEP setting. (Variants of this method exist that accept further arguments, partly for reasons of backward compatibility, and partly for purposes of the implementation of the QUEP solver.) Details of the implemented algorithms are distributed over the journal articles Optical and Quantum Electronics 33 (4/5), 413-431 (2001) and Optical and Quantum Electronics 34 (5), 541-557 (2002). | |
quepsim, quepsim_s | QUEP, solution by quadridirectional eigenmode propagation. Details of the procedures are given in the paper Optics Communications 235 (4-6), 285-303 (2004). The quepsim method can be invoked without any arguments. If alternatively a single double argument is supplied, the method checks whether the total relative power balance is violated by not more than that value (integer return value). The latter variant can be used e.g. to automatically supervise a series of simulations with varying parameters. quepsim_s serves for the same purpose: The method repeats the analysis with a slightly modified computational setting (i.e. slightly shifted artificial boundaries, cf. the remarks on the spectral discretization). Singularities related (probably ...) to accidental matching of wave vector components of some basis modes are thus avoided. One should try this variant, if all of a sudden irregularities appear in the results of an otherwise reasonable parameter scan. The quepsim_s method accepts the number of trials, a level for the violation of the power balance, and a maximum value for the modification of the boundary positions as arguments. Standard values are used if quepsim_s is invoked without arguments. |
Classes:
BepField,
QuepField.
Relevant source files:
bepfld.h,
bepfld.cpp,
quepfld.h,
quepfld.cpp.
Field access, output amplitudes, power transmission
Upon successful completion, the solver routines above fill in the coefficients of all elements in the bidirectional or quadridirectional field expansions. The BepField or QuepField containers thus represent the quasi-analytical, necessarily approximate solutions of the frequency domain scattering problems. Access to the solutions is provided by methods of these objects, as declared / defined in bepfld.h, bepfld.cpp, quepfld.h, quepfld.cpp:
field | The - in general complex valued - optical electromagnetic field associated with the solution, computed quasi-analytically by evaluation of the local modal expansion. Arguments are identifiers EX, EY, EZ, HX, HY, HZ, and SX, SZ that select the components of the electric and magnetic fields, and the two components of the Poynting vector that are relevant for the present planar simulations. Further a pair of coordinates x, z specifies the location where the field is evaluated. For QuepField objects, additional variants exist that permit to evaluate the field on a regular rectangular grid, or on lines across the computational domain. Note that the methods return zero values for certain combinations of arguments, due to the splitting into TE / TM solutions, and due to the shapes of the computational domains. | |
endens | The energy density of the optical electromagnetic field at a specified x, z position. | |
Aout | The complex amplitude of an outgoing mode on a specific border of the computational region. Arguments are an identifier for the border, and alternatively an integer mode order/index or a mode object (in that case a suitable overlap integral is computed), as described for the variants of the input method. | |
Pout, Pgout | Optical output power in a specified exterior region. When only a border identifier is supplied as an argument, the methods return the total outwards flowing optical power (Pout, guided and nonguided parts), or the guided output power only (Pgout, sum of the powers associated with all (orthogonal) guided modes on the respective slice). If one supplies in addition an integer mode order/index or a mode object, the power associated with that particular outwards traveling mode is evaluated. | |
Pin | The total (guided and nonguided) optical power sent into the computational region across a specified border, used mainly for test purposes, i.e. for computing/checking the power balance. | |
locModAmp locModPow | Local "modal probing": The methods project the directional version of a given mode on the field expansion at a specified z-position, and return the amplitude, or power, respectively, that is associated with that mode at the given position (BepFields only). Note that the amplitudes of the modes that belong to the local basis can be retrieved via the entries of the amplitude vectors f and b of BepFields). |
Classes:
BepField,
QuepField.
Relevant source files:
bepfld.h,
bepfld.cpp,
quepfld.h,
quepfld.cpp.
Waves at oblique angles of incidence: vectorial QUEP simulations
An extension of the Metric core modules; elaborate documentation is not available. Still the routines might be useful by means of the corresponding example programs.
The procedures detailed above concern traditional 2-D problems, where both the structure under investigation and the solution sought are supposed to be constant along one coordinate axis (y). One can weaken these restrictions by looking for solutions that are varying strictly harmonically along that y-axis, with a wavenumber ky. One obtains a vectorial problem, on a 2-D domain, governed by equations that are formally identical to those for the modes of channel waveguides with 2-D cross sections. For a structure with an access slab, oriented, say, in the y-z-plane, this permits to model the incidence of semi-guided waves that come in with some angle of incidence theta in the y-z-plane. The direction of propagation of these out-of-plane guided, in-plane infinite plane waves then dictates the global wavenumber ky. Respective parameters can be supplied to the BepField and QuepField constructors. The implemented scheme for vectorial quadridirectional eigenmode propagation (vQUEP) then proceeds similar to the scalar case, but including properly rotated basis modes of both TE and TM polarization into the spectral discretization. Solver details: Optics Communications 338, 447-456 (2015).
Classes:
BepField,
QuepField.
Examples:
vfacet.cpp,
kink.cpp,
step.cpp.
Relevant source files:
bepfld.h,
bepfld.cpp,
quepfld.h,
quepfld.cpp.
Incidence of semi-guided beams: bundles of vQUEP solutions
An extension of the Metric core modules; elaborate documentation is not available. Still the routines might be useful by means of the corresponding example programs.
Oblique incidence of semi-guided, laterally confined beams on the y-homogeneous structures can be modeled by considering superpositions of the above vQUEP solutions. The constructors of objects of class Bundle accept the parameters for a Gaussian beam profile, centered at a principal angle of incidence. Their solve-method then initiates vQUEP simulations for a series of equidistant wavenumbers ky over a range that covers the relevant part of the angular spectrum of the incident beam. Field data is being accumulated for an array of predefined Views, and guided modal output power is being stored for an array of predefined Ports, for evaluation and inspection of the full 3-D field.
Classes:
Bundle,
View,
Port.
Examples:
vfacbundle.cpp,
kinkbundle.cpp.
Relevant source files:
bundle.h,
bundle.cpp.