Boundary conditions#
Absorbing boundary: CPML#
Open-region truncation uses the convolutional perfectly matched
layer (CPML) of Roden and Gedney [12]
(boundaries/cpml.py, chosen over the uniaxial PML in
DD-001). The implementation carries the full complex
frequency-shifted (CFS) stretching function
introduced by Kuzuoglu and Mittra [13], realised recursively through per-face auxiliary memory variables \(\psi\) with the standard \((b, c)\) update coefficients. Profiles are the customary polynomial grading \(\sigma(\rho) = \sigma_{\max}\rho^m\), \(\kappa(\rho) = 1 + (\kappa_{\max}-1)\rho^m\) and a linearly decreasing \(\alpha\); grading choices follow the CPML literature [5, 12]. The PML concept itself originates with Bérenger [14]; the uniaxial variant used for comparison in DD-001 is Gedney’s [15].
PEC, PMC and periodic walls#
PEC (
boundaries/pec.py): tangential-E edge zeroing after each E update; in the eigenmode solver, PEC is imposed by degree-of- freedom elimination (DD-009). Standard practice [5].PMC (
boundaries/pmc.py, DD-065): realised as the natural boundary of the FIT update (the missing exterior circulation terms are simply absent), which is the discretely exact magnetic wall on the dual grid. Standard FIT/FDTD practice [2].Periodic (
boundaries/periodic.py): direct field wrap-around of the curl stencil at opposing faces (no phase shift / Floquet variant implemented). Standard practice [5].
Symmetry planes#
A face may be declared a symmetry plane
(boundaries/boundary_conditions.py, DD-154): physically one of the
walls above, plus the statement that the mirror image of the model
exists beyond it. Which wall applies follows from the field, not from
the geometry — on an electric wall the electric field stands
perpendicular to the plane and the magnetic field lies in it, on a
magnetic wall it is the other way round. A structure that is
mirror-symmetric under an excitation that is not leaves no symmetry
to exploit.
Two spellings, differing only in what the mesher does with the geometry:
GeometryModel(boundary_conditions={"xmin": "SymmetryPMC"}) # clip at x = 0
GeometryModel(boundary_conditions={"xmin": ("SymmetryPMC", 1.5e-3)}) # clip at x = 1.5 mm
GeometryModel(boundary_conditions={"xmin": "ForceSymmetryPMC"}) # geometry already halved
The Symmetry… forms let the full geometry stand and simply never
mesh the discarded half; ForceSymmetry… takes the domain as built.
At most one plane per axis — two parallel mirrors would describe an
infinite image chain rather than a finite full model.
Everything the declaration implies is derived from it, so a half model reports full-model quantities throughout:
A port window cut by the plane is solved on its half. A magnetic wall halves the window capacitance and puts the two halves in parallel (\(z_\text{full} = z_\text{half}/2\)), an electric wall puts them in series (\(z_\text{full} = 2 z_\text{half}\)). The modes are power-normalised on the half window, so full-model wave amplitudes carry \(\sqrt2\) per cutting plane and excitations \(1/\sqrt2\) — a declared injected power stays a full-model watt (DD-155).
Registered wall losses and flux integrals are scaled by the mirrored share in the same way.
A lumped port or element cut by the plane is declared as the full device and internally halved or doubled to the meshed branch — see the lumped-elements chapter for the case rules.
Field monitors and port-mode plots are mirrored back across the plane before display, so the pictures show the full cross-section while only half of it was solved.
The cost is spectral: a symmetry wall admits only the field distributions of matching parity, so every mode of the opposite parity is absent from the model. For a driven problem whose excitation respects the plane those modes carry no energy anyway; for eigenmode work the omission is the point of the exercise, but it has to be intended.
Boundary-condition interaction with ports#
Waveguide ports are not PML-backed (a PML-terminated port was evaluated and rejected, DD-031/DD-043): port faces carry their own transparent terminations, described in the ports chapter.