4.3. PBG Fiber with an Air-Clad Outer Boundary#

The first PBG notebook embeds its lattice in cladding material that continues out to the PML (see the lyr6cr2 configuration in fiber_dicts). Real fibers are sometimes coated or suspended in air instead, so this notebook reuses the same lattice via fiber_dicts.lyr6cr2_w_air, whose only difference is that the outer/PML region is air (\(n_\text{outer}=1\)) rather than more cladding.

That single change breaks the search-center shortcut from the first notebook’s tip: A.sqrZfrom(beta) depends on the base index n0 used to nondimensionalize the eigenproblem, and here n0\(=n_\text{outer}\) instead of n0\(=n_\text{clad}\). The same physical mode therefore sits at a different nondimensional \(Z\) than it did in the first notebook.

import ngsolve as ng
import numpy as np
from ngsolve.webgui import Draw
from fibermode import PBG
from fibermode.pbg.fiber_dicts.lyr6cr2_w_air import params

Constructing the fiber#

# Take the default parameters and triple the PML thickness

params2 = dict(params)
params2['r_out'] = params['r_pml'] + 3 * (params['r_out'] - params['r_pml'])  # triple the PML thickness
A = PBG(params2)

# Draw the refractive index profile

Draw(A.N, A.mesh, 'index', autoscale=False, min=0.95*A.n_clad, max=A.n_tube,
     settings={"Objects": {"Wireframe": False, "Edges":False}})
A.n_tube, A.n_clad, A.n_outer
Generating mesh.
Mesh created.
ModeSolver: Checking if mesh has required regions
Mesh has  17702  elements,  8868  points,  and  26569  edges.
(1.48, 1.45, 1)

Finding a search center when \(n_0 \neq n_\text{clad}\)#

The recipe consists of first finding the physical propagation constant \(\beta\) of the mode of interest using a fiber where the shortcut from the first notebook applies. Here the plain lyr6cr2 fiber, whose outer region matches its cladding. This is exactly the fundamental mode already located in that notebook. Then, convert that same \(\beta\) into a search center for this fiber by passing it through this object’s A.sqrZfrom, which nondimensionalizes using this fiber’s own n0. Because \(n_\text{outer}=1\) is far from \(n_\text{clad}\), the resulting \(Z\) lands in a new spot (here, on the imaginary axis) rather than somewhere a naive guess would have looked.

beta_clad = 5874506.48513697 + 1.67830311e-05j  # from the fundamental
                                                 # mode of `lyr6cr2`
                                                 # (see 4.1)
z_clad = A.sqrZfrom(beta_clad) ** .5  # sqrt: leakymode searches the
                                       # Z-plane, not Z^2
z_clad
(2.045256737607237e-10-37.50066797204678j)

Summary#

The recipe used here may generalize beyond for other fibers: whenever the outer/PML region’s index doesn’t match the cladding’s (\(n_0 \neq n_\text{clad}\)), locate the physical \(\beta\) of the mode of interest in a matched-index version of the same lattice first, convert it through this fiber’s own A.sqrZfrom, expect a few spurious cladding modes in the resulting small-radius scalar search, and refine the vector search center away from them once identified.

Varying the outer region’s index isn’t the only way to get a different-looking fiber out of the same PBG class: changing the lattice’s index instead (making the “tube” sites lower-index than the cladding rather than higher) turns this into an index-guided photonic crystal fiber (PCF) in the narrower sense. See fiber_dicts.holey and demos/pbg/holey_demo.py for that contrasting example, and the first notebook’s discussion of PBG vs. PCF.