Cylindrical Fibers with step index profile

Scott Prahl

Sept 2023

Graphs and tables from Chapter 8 of Ghatak.

[1]:
# Jupyterlite support for ofiber
try:
    import micropip
    await micropip.install("ofiber")
except ModuleNotFoundError:
    pass


import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit

import ofiber

%config InlineBackend.figure_format='retina'

Single mode in a circular step fiber V=2

(Ghatak Fig 8.1)

Use ofiber.plot_LP_modes to make a quick plot showing the allowed modes.

[2]:
V=6.5
ell = 0
plt.subplots(1, 2, figsize=(10, 4))
plt.subplot(1, 2, 1)
aplt = ofiber.plot_LP_modes(V,ell)
plt.subplot(1, 2, 2)
ell=1

aplt = ofiber.plot_LP_modes(V,ell)
aplt.show()

for ell in range(2):
    all_b = ofiber.LP_mode_values(V,ell)
    for i,b in enumerate(all_b):
        print("LP_%d%d, b=%.4f"%(ell,i+1,b))
_images/4-Circular-Step-Index-Fiber_3_0.png
LP_01, b=0.8977
LP_02, b=0.4752
LP_11, b=0.7422
LP_12, b=0.1792

Multiple modes in a circular step fiber V=12.5

Use ofiber.plot_LP_modes to make a quick plot showing the allowed modes.

[3]:
V=12.5
ell = 0
aplt = ofiber.plot_LP_modes(V,ell)
aplt.show()

for ell in range(6):
    all_b = ofiber.LP_mode_values(V,ell)
    for i,b in enumerate(all_b):
        print("LP_%d%d, b=%.4f"%(ell,i+1,b))
_images/4-Circular-Step-Index-Fiber_5_0.png
LP_01, b=0.9683
LP_02, b=0.8336
LP_03, b=0.5942
LP_04, b=0.2597
LP_11, b=0.9196
LP_12, b=0.7319
LP_13, b=0.4427
LP_14, b=0.0735
LP_21, b=0.8558
LP_22, b=0.6155
LP_23, b=0.2791
LP_31, b=0.7777
LP_32, b=0.4850
LP_33, b=0.1070
LP_41, b=0.6860
LP_42, b=0.3415
LP_51, b=0.5812
LP_52, b=0.1863

Ghatak Table 8.1

Summarizing all the important parameters for low V-parameter fibers.

[4]:
V=np.linspace(1.5,2.5,41)
ell=0
em=1
print('  V       b       U       W  wp/r_core MFD/r_core')
for v in V:
    b = ofiber.LP_mode_value(v,ell,em)
    W = v*np.sqrt(b)
    U = v*np.sqrt(1-b)
    w_p = ofiber.PetermannW(v)
    w_mfd = ofiber.MFD(v)
    print("%.3f %.5f %.5f %.5f %.5f %.5f"%(v,b,U,W,w_p,w_mfd))
  V       b       U       W  wp/r_core MFD/r_core
1.500 0.22925 1.31689 0.71820 1.69342 3.56805
1.525 0.23955 1.32985 0.74640 1.65638 3.47716
1.550 0.24980 1.34252 0.77469 1.62172 3.39317
1.575 0.25997 1.35489 0.80305 1.58923 3.31537
1.600 0.27006 1.36698 0.83148 1.55872 3.24312
1.625 0.28007 1.37880 0.85997 1.53001 3.17585
1.650 0.28997 1.39034 0.88851 1.50295 3.11309
1.675 0.29977 1.40163 0.91709 1.47741 3.05439
1.700 0.30947 1.41267 0.94571 1.45326 2.99939
1.725 0.31905 1.42347 0.97435 1.43040 2.94774
1.750 0.32851 1.43403 1.00303 1.40872 2.89915
1.775 0.33785 1.44436 1.03172 1.38814 2.85335
1.800 0.34707 1.45448 1.06043 1.36858 2.81010
1.825 0.35616 1.46437 1.08914 1.34996 2.76920
1.850 0.36512 1.47406 1.11787 1.33223 2.73045
1.875 0.37396 1.48355 1.14660 1.31531 2.69369
1.900 0.38266 1.49285 1.17533 1.29915 2.65876
1.925 0.39123 1.50195 1.20406 1.28371 2.62552
1.950 0.39967 1.51087 1.23279 1.26893 2.59385
1.975 0.40798 1.51962 1.26150 1.25478 2.56363
2.000 0.41616 1.52818 1.29021 1.24122 2.53477
2.025 0.42421 1.53658 1.31891 1.22820 2.50718
2.050 0.43213 1.54482 1.34760 1.21571 2.48076
2.075 0.43992 1.55290 1.37627 1.20370 2.45544
2.100 0.44758 1.56082 1.40493 1.19216 2.43115
2.125 0.45512 1.56860 1.43357 1.18105 2.40783
2.150 0.46252 1.57622 1.46220 1.17035 2.38541
2.175 0.46981 1.58371 1.49080 1.16003 2.36385
2.200 0.47697 1.59106 1.51938 1.15009 2.34308
2.225 0.48401 1.59827 1.54795 1.14049 2.32308
2.250 0.49093 1.60536 1.57649 1.13122 2.30379
2.275 0.49773 1.61231 1.60501 1.12227 2.28517
2.300 0.50442 1.61915 1.63351 1.11361 2.26719
2.325 0.51099 1.62586 1.66199 1.10523 2.24981
2.350 0.51744 1.63246 1.69044 1.09713 2.23301
2.375 0.52379 1.63894 1.71887 1.08928 2.21675
2.400 0.53003 1.64531 1.74727 1.08168 2.20101
2.425 0.53616 1.65157 1.77565 1.07431 2.18576
2.450 0.54218 1.65773 1.80400 1.06716 2.17098
2.475 0.54810 1.66379 1.83233 1.06022 2.15665
2.500 0.55392 1.66974 1.86064 1.05349 2.14274

Example 8.1 Figure 8.2

[5]:
n_clad =1.45
Delta=0.0064
r_core=3.0           # microns
λ = 1.546 # microns

n_core = n_clad / np.sqrt(1 - 2*Delta)
NA = np.sqrt(n_core**2-n_clad**2)
V = r_core * (2 * np.pi / λ) * NA

plt.subplots(1, 2, figsize=(10, 4), sharey=True)
plt.subplot(1, 2, 1)
plt.plot([0,r_core,r_core,2*r_core],[n_core,n_core,n_clad,n_clad],color='blue')
for ell in range(6):
    all_b = ofiber.LP_mode_values(V,ell)
    for b in all_b:
        bt = np.sqrt(n_clad**2+all_b*(n_core**2-n_clad**2))
        plt.plot([0,r_core],[bt,bt],'--r')

plt.ylim(1.445,1.46)
plt.title("V=%.1f, λ=%.4f microns" % (V,λ))
plt.xlabel("radius (microns)")
plt.ylabel("Refractive Index")


λ = 0.4757# microns
n_core = n_clad / np.sqrt(1 - 2*Delta)
NA = np.sqrt(n_core**2-n_clad**2)
V = r_core * (2 * np.pi / λ) * NA

plt.subplot(1, 2, 2)

plt.plot([0,r_core,r_core,2*r_core],[n_core,n_core,n_clad,n_clad],color='blue')
for ell in range(6):
    all_b = ofiber.LP_mode_values(V,ell)
    for b in all_b:
        bt = np.sqrt(n_clad**2+all_b*(n_core**2-n_clad**2))
        plt.plot([0,r_core],[bt,bt],'--r')

plt.ylim(1.445,1.46)
plt.title("V=%.1f, λ=%.4f microns" % (V,λ))
plt.xlabel("radius (microns)")
#plt.ylabel("Refractive Index")

plt.show()
_images/4-Circular-Step-Index-Fiber_9_0.png

Figure 8.3

[6]:
n_clad =1.45
Delta=0.010
r_core=2.0           # microns

λ = 1.288 # microns
n_core = n_clad / np.sqrt(1 - 2*Delta)
NA = np.sqrt(n_core**2-n_clad**2)
V = r_core * (2 * np.pi / λ) * NA

plt.subplots(1, 2, figsize=(10, 4), sharey=True)
plt.subplot(1, 2, 1)
plt.plot([0,r_core,r_core,2*r_core],[n_core,n_core,n_clad,n_clad],color='blue')
for ell in range(6):
    all_b = ofiber.LP_mode_values(V,ell)
    for b in all_b:
        bt = np.sqrt(n_clad**2+all_b*(n_core**2-n_clad**2))
        plt.plot([0,r_core],[bt,bt],'--r')
plt.ylim(1.445,1.47)
plt.title("V=%.1f, λ=%.4f microns" % (V,λ))
plt.xlabel("radius (microns)")
plt.ylabel("Refractive Index")


λ = 0.3963# microns
n_core = n_clad / np.sqrt(1 - 2*Delta)
NA = np.sqrt(n_core**2-n_clad**2)
V = r_core * (2 * np.pi / λ) * NA

plt.subplot(1, 2, 2)
plt.plot([0,r_core,r_core,2*r_core],[n_core,n_core,n_clad,n_clad],color='blue')
for ell in range(6):
    all_b = ofiber.LP_mode_values(V,ell)
    for b in all_b:
        bt = np.sqrt(n_clad**2+all_b*(n_core**2-n_clad**2))
        plt.plot([0,r_core],[bt,bt],'--r')

plt.ylim(1.445,1.47)
plt.title("V=%.1f, λ=%.4f microns" % (V,λ))
plt.xlabel("radius (microns)")
#plt.ylabel("Refractive Index")

plt.show()
_images/4-Circular-Step-Index-Fiber_11_0.png

Ghatak Figure 8.4

[7]:
V=6.5

plt.subplots(3, 2, figsize=(15, 15),squeeze=True)
for ell in range(6):
    aplt.subplot(3,2,ell+1)
    aplt = ofiber.plot_LP_modes(V,ell)

aplt.show()
_images/4-Circular-Step-Index-Fiber_13_0.png

Variation of normalized propagation constant with V

Ghatak Figure 8.5

[8]:
V = np.linspace(0.01,10,50)
b = np.empty_like(V)

for ell in range(3):
    for em in range(1,4):
        for i in range(len(V)):
            b[i] = ofiber.LP_mode_value(V[i],ell,em)
        plt.plot(V,b)
        plt.annotate(r' LP$_{%d%d}$'%(ell,em), xy=(10,b[-1]),va='center')

plt.xlim(0,12)
plt.xlabel("V-parameter")
plt.ylabel('Propagation Constant b')
plt.title('Modes in a step-index Fiber')
plt.show()
_images/4-Circular-Step-Index-Fiber_15_0.png

Radial Intensity distributions

Ghatak Figure 8.6

[9]:
plt.subplots(figsize=(10,6))
r_over_a = np.linspace(-1.2,1.2,100)
V=8
for ell in range(3):
    for em in range(2,4):
        b = ofiber.LP_mode_value(V,ell,em)
        if b is None :
            continue
        irradiance = ofiber.LP_radial_irradiance(V,b,ell,r_over_a)
        i = np.argmax(irradiance)

        plt.plot(r_over_a,irradiance)
        plt.annotate(r' LP$_{%d%d}$'%(ell,em), xy=(r_over_a[i],irradiance[i]),va='bottom',ha='center')

plt.xlabel('r/r_core')
plt.ylabel('Normalized Irradiance')
plt.plot([-1,-1],[0,10],':k')
plt.plot([1,1],[0,10],':k')

plt.title('Step-index fiber, V=%.2f'%V)
plt.ylim(0,10)
plt.xlim(-1.2,1.2)
plt.show()
_images/4-Circular-Step-Index-Fiber_17_0.png
[10]:
V=8

r_over_a = np.linspace(0, 1.5, 50)
phi = np.linspace(0, 2*np.pi, 40)

clevs = np.linspace(-4, 4, 9)

fig,ax=plt.subplots(3,3,figsize=(8,8))

graph = 0
for ell in [0,1,2]:
    for em in [1,2,3]:
        graph = graph+1

        b = ofiber.LP_mode_value(V,ell,em)
        if b is None :
            ax=plt.subplot(3,3,graph,polar=True)
            plt.axis('off')
            plt.annotate('No such mode', xy=(0,0), ha='center')
            continue
        r_field = ofiber.LP_radial_field(V,b,ell,r_over_a)
        phi_field = np.cos(ell*phi)
        R, PHI = np.meshgrid(r_over_a, phi)
        R_FIELD, PHI_FIELD = np.meshgrid(phi_field,r_field)
        Z = R_FIELD*PHI_FIELD

        ax=plt.subplot(3,3,graph,polar=True)
        cax=ax.contourf(phi,r_over_a,Z,levels=clevs)
        ax.set_xticklabels([])
        ax.set_yticklabels([])
        fig.colorbar(cax)
        plt.title(r"LP$_{%d%d}$ Field"%(ell,em))

plt.show()
_images/4-Circular-Step-Index-Fiber_18_0.png
[11]:
V=8

r_over_a = np.linspace(0, 1.5, 50)
phi = np.linspace(0, 2*np.pi, 40)
R, PHI = np.meshgrid(r_over_a, phi)

clevs = np.linspace(-4, 4, 9)
dlevs = np.linspace(0, 8, 9)

fig,ax=plt.subplots(figsize=(10,40))

graph = 0
rows = 8
cols = 2
for ell in range(5):
    phi_field = np.cos(ell*phi)

    for em in [1,2]:

        b = ofiber.LP_mode_value(V,ell,em)
        if b is None:
            continue
        r_field = ofiber.LP_radial_field(V,b,ell,r_over_a)
        R_FIELD, PHI_FIELD = np.meshgrid(phi_field,r_field)
        Z = R_FIELD*PHI_FIELD

        graph += 1

        ax=plt.subplot(rows,cols,graph,polar=True)
        cax=ax.contourf(phi,r_over_a,Z,levels=clevs)
        ax.set_xticklabels([])
        ax.set_yticklabels([])
        fig.colorbar(cax)
        plt.title(r"LP$_{%d%d}$ Field"%(ell,em))

        graph += 1
        Z = Z*Z

        ax=plt.subplot(rows,cols,graph,polar=True)
        cax=ax.contourf(phi,r_over_a,Z,levels=dlevs)
        ax.set_xticklabels([])
        ax.set_yticklabels([])
        fig.colorbar(cax)
        plt.title(r"LP$_{%d%d}$ Irradiance"%(ell,em))

plt.show()
_images/4-Circular-Step-Index-Fiber_19_0.png
[12]:
def gauss(x, A, w):
    return A*np.exp(-x**2/w**2)

r_over_a = np.linspace(-1.5, 1.5, 50)
phi = 0


graph = 1
rows = 4
cols = 1

fig,ax=plt.subplots(figsize=(6,18))

ell = 0
em = 1

for V in [2.4,3,3.4,4]:

    b = ofiber.LP_mode_value(V,ell,em)
    field = ofiber.LP_radial_field(V,b,ell,r_over_a)

    plt.subplot(rows,cols,graph)
    plt.plot(r_over_a,field,label=r'LP$_{01}$')
    plt.annotate("V=%.2f"%V, xy=(-1.5,max(field)))

    popt, pcov = curve_fit(gauss, r_over_a, field)
    fit = gauss(r_over_a,popt[0],popt[1])
    plt.plot(r_over_a,fit,':r',label='fit')

    plt.ylabel('Normalized Field')
    plt.xlabel('r/r_core')
    plt.legend()
    graph += 1

plt.show()
_images/4-Circular-Step-Index-Fiber_20_0.png

Variation of the fractional power contained in the cladding with V

Ghatak Figure 8.11

[13]:
V=np.linspace(0.1,12,100)

ell = 0
for ell in [0,1,2]:

    for em in [1,2]:

        ratio = np.zeros_like(V)
        for i in range(len(V)):
            b = ofiber.LP_mode_value(V[i],ell,em)
            if b is None:
                continue
            clad = ofiber.LP_clad_irradiance(V[i],b,ell)
            total = ofiber.LP_total_irradiance(V[i],b,ell)
            ratio[i] = clad/total

        j = np.nanargmax(ratio)
        plt.annotate("LP%d%d"%(ell,em),xy=(V[j],ratio[j]))

        plt.plot(V,ratio)
plt.xlabel('V-parameter')
plt.ylabel(r'$P_{clad}/P_{total}$')
plt.ylim(0,1.1)
plt.title('Cladding Fraction in Step-Index Fiber')
plt.show()
_images/4-Circular-Step-Index-Fiber_22_0.png

Variation of loss at a perfectly aligned joint between two single-mode fibers

Ghatak Figure 8.14

[14]:
w1 = np.linspace(0.5,2,50)
w2 = np.ones_like(w1)

loss_db = ofiber.transverse_misalignment_loss_db(w1,w2,0)
plt.plot(w1,loss_db,label=r'$u/w_2$=0')

loss_db = ofiber.transverse_misalignment_loss_db(w1,w2,0.5)
plt.plot(w1,loss_db,label=r'$u/w_2$=0.5')

plt.xlabel(r'$w_1/w_2$')
plt.ylabel('Loss [db]')
plt.legend()
plt.show()

_images/4-Circular-Step-Index-Fiber_24_0.png
[15]:
u = np.linspace(0,1,50)

loss_db = ofiber.transverse_misalignment_loss_db(1,1,u)
plt.plot(u,loss_db)

plt.xlabel(r'$u/w$')
plt.ylabel('Loss [db]')
plt.title(r'$w_1=w_2=w$')
plt.show()
_images/4-Circular-Step-Index-Fiber_25_0.png
[ ]: