Nested antiresonant nodeless fibers (NANF)

3.2. Nested antiresonant nodeless fibers (NANF)#

A nested antiresonant nodeless fiber (NANF) improves on the plain antiresonant fiber of the previous notebook by placing smaller capillaries inside each outer capillary. Each nested tube adds a further antiresonant reflection, so the leakage of the core mode drops dramatically, resulting in record-low losses in hollow-core fibers reported in [Poletti 2014]. “Nodeless” refers to the tubes touching only the cladding, not each other, avoiding lossy glass nodes.

Because polarization effects and accurate loss prediction matter for these fibers, this notebook computes full Maxwell vector leaky modes (using fibermode’s leakyvecmodes, whose search contour lives in the \(Z^2\)-plane: cf. the discussion in the Bragg vector mode notebook).

import ngsolve as ng
import numpy as np
from ngsolve.webgui import Draw
from fibermode import NANF

Constructing NANF objects#

The geometry is specified by the core radius and a list of capillary specifications, one dict per nesting level: N tubes of radius r, wall thickness t, and embedding parameter e. The default is a six-tube outer ring with one nested tube each. Mesh sizes per region are also constructor arguments; the values below give a mesh coarse enough for a quick first run.

A = NANF(glass_maxh=0.2, air_maxh=0.15, core_maxh=0.4)
Draw(A.mesh);
ModeSolver: Checking if mesh has required regions
Mesh has  3842  elements,  1941  points,  and  5782  edges.

Fundamental vector mode#

The fundamental HE11-like mode is a degenerate polarization pair, so we search a small contour with a span of a few vectors. (The elliptic contour with rhoinv close to 1 is a thin ellipse hugging the real axis — an efficient choice here since the sought \(Z^2\) values have tiny imaginary parts.)

betas, Zsqrs, Es, phis, R = A.leakyvecmodes(
    ctr=5.066,      # contour center in the Z^2 plane
    rad=0.005,
    alpha=5,
    p=2,
    nspan=3,
    npts=4,
    rhoinv=0.99,
    quadrule='ellipse_trapez_shift',
    niterations=10,
    nrestarts=0,
    stop_tol=1e-9,
    seed=1,
)
Set NGSolve automatic PML with p= 2  alpha= 5 and thickness=1.333
Using FEAST to search for vector leaky modes in
circle of radius 0.005 centered at  5.066
assuming not more than 3 modes in this interval
System size: 40398  x  40398   Inverse type: umfpack

SpectralProj: Setting shifted trapezoidal rule on elliptical contour
SpectralProjNGR:   Making resolvent at z =  +5.070 +0.000j
SpectralProjNGR:   Making resolvent at z =  +5.062 +0.000j
SpectralProjNGR:   Making resolvent at z =  +5.062 -0.000j
SpectralProjNGR:   Making resolvent at z =  +5.070 -0.000j
=========== Starting FEAST iterations ===========
Trying with 3 vectors:

 ITERATION 1 with 3 vectors and 3 left vectors
   During kernel cleaning singular values of B-Gram:
   [2.451e-03 8.876e-05 3.438e-19]
   Removing ew#[2]
   Real part of computed eigenvalues:
   [5.07043677 5.07057263]
   Imag part of computed eigenvalues:
   [-5.55820610e-06 -3.60156665e-05]
   Relative Hausdorff distance from prior iterate: 1.974e+99

 ITERATION 2 with 2 vectors and 2 left vectors
   During kernel cleaning singular values of B-Gram:
   [0.008 0.   ]
   Real part of computed eigenvalues:
   [5.07043677 5.07057263]
   Imag part of computed eigenvalues:
   [-5.55820607e-06 -3.60156657e-05]
   Relative Hausdorff distance from prior iterate: 1.629e-13


***FEAST converged with:
	Relative Hausdorff distance = 1.629e-13

============= FEAST iterations done =============
Results:
 Z²: [5.07043677-5.55820607e-06j 5.07057263-3.60156657e-05j]
 beta: [3487429.06980962+0.00354174j 3487428.98323693+0.02294952j]
 CL dB/m: [0.03076317 0.19933698]
print('CL [dB/m]:', 20 * np.array(betas).imag / np.log(10))
CL [dB/m]: [0.03076317 0.19933698]

leakyvecmodes returns the transverse electric fields Es (in the H(curl) space) and the scaled longitudinal components phis (in H1). The transverse field of the fundamental pair:

for e in Es:
    Draw(e.real, A.mesh, vectors={'grid_size': 200})
for phi in phis:
    Draw(1e-1 * phi, A.mesh)

Power flow#

The Poynting vector of each computed mode is available through the S method; its longitudinal component \(S_z\) shows where the mode’s power actually flows — almost entirely within the air core:

for e, phi, beta in zip(Es, phis, betas):
    Stv, Sz = A.S(e, phi, beta)
    Draw(1e-1 * Sz, A.mesh)

Higher-order modes#

Higher-order core modes live further along the real \(Z^2\) axis and are substantially lossier — the basis of the fiber’s effectively single-mode behavior. For this geometry a mode group sits near \(Z^2 \approx 12.75\):

betas_h, Zsqrs_h, Es_h, phis_h, _ = A.leakyvecmodes(
    ctr=12.75, rad=0.1, alpha=5, p=2,
    nspan=2, npts=2, rhoinv=0.99,
    quadrule='ellipse_trapez_shift',
    niterations=50, nrestarts=0, stop_tol=1e-9, seed=1)
print('CL [dB/m]:', 20 * np.array(betas_h).imag / np.log(10))
Set NGSolve automatic PML with p= 2  alpha= 5 and thickness=1.333
Using FEAST to search for vector leaky modes in
circle of radius 0.1 centered at  12.75
assuming not more than 2 modes in this interval
System size: 40398  x  40398   Inverse type: umfpack

SpectralProj: Setting shifted trapezoidal rule on elliptical contour
SpectralProjNGR:   Making resolvent at z = +12.750 +0.001j
SpectralProjNGR:   Making resolvent at z = +12.750 -0.001j
=========== Starting FEAST iterations ===========
Trying with 2 vectors:

 ITERATION 1 with 2 vectors and 2 left vectors
   During kernel cleaning singular values of B-Gram:
   [0.081 0.001]
   Real part of computed eigenvalues:
   [12.69649083 12.70284073]
   Imag part of computed eigenvalues:
   [ 1.82508949e-06 -2.96778640e-06]
   Relative Hausdorff distance from prior iterate: 7.843e+98

 ITERATION 2 with 2 vectors and 2 left vectors
   During kernel cleaning singular values of B-Gram:
   [1.283e-02 5.274e-05]
   Real part of computed eigenvalues:
   [12.69969082 12.70498669]
   Imag part of computed eigenvalues:
   [-1.72347760e-05 -1.59724212e-05]
   Relative Hausdorff distance from prior iterate: 2.510e-04

 ITERATION 3 with 2 vectors and 2 left vectors
   During kernel cleaning singular values of B-Gram:
   [2.599e-03 1.001e-06]
   Real part of computed eigenvalues:
   [12.70062903 12.70676411]
   Imag part of computed eigenvalues:
   [-2.29781742e-05 -1.92665197e-05]
   Relative Hausdorff distance from prior iterate: 1.394e-04

 ITERATION 4 with 2 vectors and 2 left vectors
   During kernel cleaning singular values of B-Gram:
   [5.114e-04 2.132e-07]
   Real part of computed eigenvalues:
   [12.70092802 12.70739444]
   Imag part of computed eigenvalues:
   [-2.46651914e-05 -2.23473429e-05]
   Relative Hausdorff distance from prior iterate: 4.944e-05

 ITERATION 5 with 2 vectors and 2 left vectors
   During kernel cleaning singular values of B-Gram:
   [4.069e-03 4.142e-08]
   Real part of computed eigenvalues:
   [12.70104456 12.70756427]
   Imag part of computed eigenvalues:
   [-2.52136314e-05 -2.34119979e-05]
   Relative Hausdorff distance from prior iterate: 1.332e-05

 ITERATION 6 with 2 vectors and 2 left vectors
   During kernel cleaning singular values of B-Gram:
   [7.928e-05 3.727e-10]
   Real part of computed eigenvalues:
   [12.70109285 12.70760672]
   Imag part of computed eigenvalues:
   [-2.53456677e-05 -2.37106332e-05]
   Relative Hausdorff distance from prior iterate: 3.788e-06

 ITERATION 7 with 2 vectors and 2 left vectors
   During kernel cleaning singular values of B-Gram:
   [1.498e-03 7.870e-12]
   Removing ew#[1]
   Real part of computed eigenvalues:
   [12.70757236]
   Imag part of computed eigenvalues:
   [-2.22703767e-05]
   Relative Hausdorff distance from prior iterate: 5.082e-04

 ITERATION 8 with 1 vectors and 1 left vectors
   During kernel cleaning singular values of B-Gram:
   [0.003]
   Real part of computed eigenvalues:
   [12.70759417]
   Imag part of computed eigenvalues:
   [-2.29431644e-05]
   Relative Hausdorff distance from prior iterate: 1.712e-06

 ITERATION 9 with 1 vectors and 1 left vectors
   During kernel cleaning singular values of B-Gram:
   [0.003]
   Real part of computed eigenvalues:
   [12.70760604]
   Imag part of computed eigenvalues:
   [-2.33230786e-05]
   Relative Hausdorff distance from prior iterate: 9.313e-07

 ITERATION 10 with 1 vectors and 1 left vectors
   During kernel cleaning singular values of B-Gram:
   [0.003]
   Real part of computed eigenvalues:
   [12.70761265]
   Imag part of computed eigenvalues:
   [-2.35374511e-05]
   Relative Hausdorff distance from prior iterate: 5.185e-07

 ITERATION 11 with 1 vectors and 1 left vectors
   During kernel cleaning singular values of B-Gram:
   [0.003]
   Real part of computed eigenvalues:
   [12.70761636]
   Imag part of computed eigenvalues:
   [-2.36582924e-05]
   Relative Hausdorff distance from prior iterate: 2.915e-07

 ITERATION 12 with 1 vectors and 1 left vectors
   During kernel cleaning singular values of B-Gram:
   [0.003]
   Real part of computed eigenvalues:
   [12.70761846]
   Imag part of computed eigenvalues:
   [-2.37263404e-05]
   Relative Hausdorff distance from prior iterate: 1.645e-07

 ITERATION 13 with 1 vectors and 1 left vectors
   During kernel cleaning singular values of B-Gram:
   [0.003]
   Real part of computed eigenvalues:
   [12.70761965]
   Imag part of computed eigenvalues:
   [-2.37646227e-05]
   Relative Hausdorff distance from prior iterate: 9.302e-08

 ITERATION 14 with 1 vectors and 1 left vectors
   During kernel cleaning singular values of B-Gram:
   [0.003]
   Real part of computed eigenvalues:
   [12.70762032]
   Imag part of computed eigenvalues:
   [-2.37861404e-05]
   Relative Hausdorff distance from prior iterate: 5.263e-08

 ITERATION 15 with 1 vectors and 1 left vectors
   During kernel cleaning singular values of B-Gram:
   [0.003]
   Real part of computed eigenvalues:
   [12.7076207]
   Imag part of computed eigenvalues:
   [-2.37982246e-05]
   Relative Hausdorff distance from prior iterate: 2.978e-08

 ITERATION 16 with 1 vectors and 1 left vectors
   During kernel cleaning singular values of B-Gram:
   [0.003]
   Real part of computed eigenvalues:
   [12.70762091]
   Imag part of computed eigenvalues:
   [-2.38050053e-05]
   Relative Hausdorff distance from prior iterate: 1.685e-08

 ITERATION 17 with 1 vectors and 1 left vectors
   During kernel cleaning singular values of B-Gram:
   [0.003]
   Real part of computed eigenvalues:
   [12.70762103]
   Imag part of computed eigenvalues:
   [-2.38088067e-05]
   Relative Hausdorff distance from prior iterate: 9.539e-09

 ITERATION 18 with 1 vectors and 1 left vectors
   During kernel cleaning singular values of B-Gram:
   [0.003]
   Real part of computed eigenvalues:
   [12.7076211]
   Imag part of computed eigenvalues:
   [-2.38109357e-05]
   Relative Hausdorff distance from prior iterate: 5.400e-09

 ITERATION 19 with 1 vectors and 1 left vectors
   During kernel cleaning singular values of B-Gram:
   [0.003]
   Real part of computed eigenvalues:
   [12.70762114]
   Imag part of computed eigenvalues:
   [-2.38121268e-05]
   Relative Hausdorff distance from prior iterate: 3.056e-09

 ITERATION 20 with 1 vectors and 1 left vectors
   During kernel cleaning singular values of B-Gram:
   [0.003]
   Real part of computed eigenvalues:
   [12.70762116]
   Imag part of computed eigenvalues:
   [-2.38127924e-05]
   Relative Hausdorff distance from prior iterate: 1.730e-09

 ITERATION 21 with 1 vectors and 1 left vectors
   During kernel cleaning singular values of B-Gram:
   [0.003]
   Real part of computed eigenvalues:
   [12.70762117]
   Imag part of computed eigenvalues:
   [-2.38131637e-05]
   Relative Hausdorff distance from prior iterate: 9.795e-10


***FEAST converged with:
	Relative Hausdorff distance = 9.795e-10

============= FEAST iterations done =============
Results:
 Z²: [12.70762117-2.38131637e-05j]
 beta: [3482559.18472832+0.01519519j]
 CL dB/m: [0.13198373]
CL [dB/m]: [0.13198373]
for e in Es_h:
    Draw(e.imag, A.mesh, vectors={'grid_size': 1000})

Comparing the two CL printouts quantifies the higher-order-mode suppression. To study how loss varies with the nesting (e.g., removing the nested tubes, or adding a second nesting level), edit the capillary_info list in the constructor and rerun — each entry adds one antiresonant layer.

References#

  • F. Poletti. Nested antiresonant nodeless hollow core fiber. Optics Express, 22:23807-23828, 2014.

  • G. T. Jasion et al. Hollow core NANF with 0.28 dB/km attenuation in the C and L bands. Optical Fiber Communication Conference, 2020.