Beispiel #1
0
    def testCutoffV2(self):
        """Values from cutoff acticle, Table III."""
        n1 = 1.474
        n2 = 1.444
        rho = 10e-6

        f = FiberFactory()
        f.addLayer(radius=rho, index=n1)
        f.addLayer(index=n2)
        fiber = f[0]

        sols = [(Mode('TE', 0, 1), 2.4048),
                (Mode('HE', 2, 1), 2.4221),
                (Mode('TM', 0, 1), 2.4048),
                (Mode('EH', 1, 1), 3.8317),
                (Mode('HE', 3, 1), 3.8533),
                (Mode('HE', 1, 2), 3.8317),
                (Mode('EH', 2, 1), 5.1356),
                (Mode('HE', 4, 1), 5.1597),
                (Mode('TE', 0, 2), 5.5201),
                (Mode('HE', 2, 2), 5.5277),
                (Mode('TM', 0, 2), 5.5201)]

        for mode, V0 in sols:
            self.assertAlmostEqual(fiber.cutoff(mode), V0, 4, msg=str(mode))
Beispiel #2
0
def example1():
    """1. Defining fiber layers"""
    factory = FiberFactory()

    factory.name = "Name of your fiber"
    factory.author = "Your Name"
    factory.description = "Description of your fiber"

    print('crdate:', datetime.datetime.fromtimestamp(
          int(factory.crdate)).strftime('%Y-%m-%d %H:%M:%S'))
    print('tstamp:', datetime.datetime.fromtimestamp(
          int(factory.tstamp)).strftime('%Y-%m-%d %H:%M:%S'))

    # Default parameters
    factory.addLayer()
    # Comp material: molar fraction
    factory.addLayer(pos=0, name="core", geometry="StepIndex", radius=4e-6,
                     material="SiO2GeO2", x=0.1)
    # Comp material: index and wavelength
    factory.addLayer(pos=1, name="trench", radius=6e-6, material="SiO2F",
                     index=1.441, wl=1550e-9)

    # Getting information from layers
    print('Name of layer 0:', factory.layers[0].name)
    print('Radius of layer 1:', factory.layers[1].radius)
    factory.layers[2].name = "cladding"
    print('Name of layer 2:', factory.layers[2].name)
Beispiel #3
0
def plot_zoom(fiber, vlim=(4.6, 5.4), blim=(0, 0.04)):
    fig = pyplot.figure(figsize=(6, 5))
    ax = fig.add_subplot(111, xlim=vlim, ylim=blim)
    sns.despine(fig)
    name, r, n = fiber
    ax.set_title(name)
    f = FiberFactory()
    for (r_, n_) in zip_longest(r, n):
        f.addLayer(radius=r_, index=n_)
    fiber = f[0]
    V = numpy.linspace(*vlim)
    wl = [fiber.toWl(v) for v in V[::-1]]
    sim = Simulator(f, wl, delta=1e-7)
    co = next(sim.cutoff())
    b = next(sim.b())
    for mode, cutoff in co[0].items():
        if cutoff == 0:
            continue  # skip HE(1,1) / LP(0,1)
        color = MODE_COLORS[str(mode)]
        ax.axvline(cutoff, ls=':', color=color)

        b_ = numpy.empty(len(wl))
        for j, b__ in enumerate(b):
            b_[j] = b__.get(mode, float("nan"))
        ax.plot(V[::-1], b_, color=color,
                label=str(mode) if mode.nu in (1, 3) else None)

    ax.set_ylabel("Normalized propagation constant ($b$)")
    ax.set_xlabel("Normalized frequency ($V_0$)")
    ax.legend(loc='best')
    fig.tight_layout()
Beispiel #4
0
def example2():
    """Plotting neff as function of the wavelength"""
    wavelengths = numpy.linspace(1530e-9, 1580e-9, 11)
    factory = FiberFactory()
    factory.addLayer(radius=4e-6, index=1.474)
    factory.addLayer()

    sim = Simulator(factory, wavelengths, delta=1e-5)
    neffiter = sim.neff()
    neffs = next(neffiter)

    for mode in next(sim.modes())[0]:
        neff = []
        for neffwl in neffs:  # for each wavelength
            try:
                neff.append(neffwl[mode])
            except KeyError:  # mode not supported
                neff.append(float("nan"))
        neffma = numpy.ma.masked_invalid(neff)  # mask "nan"
        pyplot.plot(wavelengths*1e9, neffma, label=str(mode))
    pyplot.title("neff as function of wavelength")
    pyplot.xlabel("wavelength (nm)")
    pyplot.ylabel("effective index")
    pyplot.legend()
    pyplot.show()
Beispiel #5
0
    def testBures_4_2_8(self):
        n2 = 1.457420
        n1 = 1.462420
        rho = 8.335e-6
        wl = Wavelength(0.6328e-6)

        f = FiberFactory()
        f.addLayer(radius=rho, index=n1)
        f.addLayer(index=n2)
        fiber = f[0]
        modes = fiber.findLPmodes(wl)

        sols = {Mode('LP', 0, 1): 2.1845,
                Mode('LP', 0, 2): 4.9966,
                Mode('LP', 0, 3): 7.7642,
                Mode('LP', 1, 1): 3.4770,
                Mode('LP', 1, 2): 6.3310,
                Mode('LP', 1, 3): 9.0463,
                Mode('LP', 2, 1): 4.6544,
                Mode('LP', 2, 2): 7.5667,
                Mode('LP', 3, 1): 5.7740,
                Mode('LP', 3, 2): 8.7290,
                Mode('LP', 4, 1): 6.8560,
                Mode('LP', 4, 2): 9.8153,
                Mode('LP', 5, 1): 7.9096,
                Mode('LP', 6, 1): 8.9390,
                Mode('LP', 7, 1): 9.9451}
        self.assertEqual(len(modes), len(sols))
        for m in modes:
            neff = fiber.neff(m, wl)
            u = wl.k0 * rho * sqrt(n1**2 - neff**2)
            self.assertAlmostEqual(u, sols[m], 3)
Beispiel #6
0
def example5():
    """Another code example, and loading / saving factory."""
    code = """V = 10
    ncl = 1.444
    k0 = 2 * pi / 1550e-9
    n = sqrt((V / (k0 * r[0]))**2 - ncl**2)
    return n
    """
    factory = FiberFactory()
    factory.addLayer(radius={'start': 1e-6, 'end': 10e-6, 'num': 10},
                     index=code)
    factory.addLayer(index=1.444)
    print(len(factory))
    print('crdate:', datetime.datetime.fromtimestamp(
          int(factory.crdate)).strftime('%Y-%m-%d %H:%M:%S'))
    print('tstamp:', datetime.datetime.fromtimestamp(
          int(factory.tstamp)).strftime('%Y-%m-%d %H:%M:%S'))

    with open('myfiber.json', 'w') as f:
        factory.dump(f)

    with open('myfiber.json', 'r') as f:
        factory.load(f)
    print(len(factory))
    print('crdate:', datetime.datetime.fromtimestamp(
          int(factory.crdate)).strftime('%Y-%m-%d %H:%M:%S'))
    print('tstamp:', datetime.datetime.fromtimestamp(
          int(factory.tstamp)).strftime('%Y-%m-%d %H:%M:%S'))

    factory = FiberFactory('myfiber.json')
    print(len(factory))
    print('crdate:', datetime.datetime.fromtimestamp(
          int(factory.crdate)).strftime('%Y-%m-%d %H:%M:%S'))
    print('tstamp:', datetime.datetime.fromtimestamp(
          int(factory.tstamp)).strftime('%Y-%m-%d %H:%M:%S'))
Beispiel #7
0
def example3():
    """Plotting modal map"""
    r2 = 10e-6
    rho = numpy.linspace(0, 0.95)
    r1 = r2 * rho
    Vlim = (2, 6)  # interval where to plot V

    factory = FiberFactory()
    factory.addLayer(radius=r1, index=1.444)
    factory.addLayer(radius=r2, index=1.474)
    factory.addLayer(index=1.444)

    sim = PSimulator(factory, [1550e-9], vectorial=False, scalar=True,
                     numax=6, mmax=2)

    modes = set()
    for ml in sim.modes():
        modes |= ml[0]
    CO = list(sim.cutoff())

    for mode in sorted(modes):
        vco = numpy.fromiter((co[0][mode] if mode in co[0] else float("nan")
                              for co in CO),
                             dtype=float, count=rho.size)
        vco = numpy.ma.masked_invalid(vco)
        if vco.min() < Vlim[1] and vco.max() > Vlim[0]:
            pyplot.plot(vco, rho, label=str(mode))

    pyplot.title("Modal map")
    pyplot.xlabel("V number")
    pyplot.ylabel("r1 / r2")
    pyplot.xlim(Vlim)
    pyplot.ylim((0, 1))
    pyplot.show()
Beispiel #8
0
def example2():
    """2. Creating families of fibers: list of parameters"""

    # Varying core radius
    factory = FiberFactory()
    factory.addLayer(name="core", radius=[1e-6, 2e-6, 3e-6, 4e-6, 5e-6],
                     index=1.474)
    factory.addLayer()

    for i, fiber in enumerate(factory):
        print(factory.layers[0].radius[i],
              fiber.neff(Mode("HE", 1, 1), 1550e-9))

    # Varying core index
    n = numpy.linspace(1.454, 1.494)
    factory = FiberFactory()
    factory.addLayer(name="core", radius=4e-6, index=n)
    factory.addLayer(name="cladding")
    fibers = list(factory)
    print(fibers)

    neff = numpy.zeros(n.shape)
    for i, fiber in enumerate(factory):
        neff[i] = fiber.neff(Mode("HE", 1, 1), 1550e-9)

    pyplot.plot(n, neff)
    pyplot.title("neff as function of core index (HE 1,1 mode)")
    pyplot.xlabel("core index")
    pyplot.ylabel("effective index")
    pyplot.show()
Beispiel #9
0
 def actionNew(self):
     if self._closeDocument():
         self.factory = FiberFactory()
         self.factory.addLayer(name="core", radius=4e-6, index=1.454)
         self.factory.addLayer(name="cladding", index=1.444)
         self.initLayerList()
         self.updateInfo()
Beispiel #10
0
def plot_zoom(fiber, vlim=(4.6, 5.4), blim=(0, 0.04)):
    fig = pyplot.figure(figsize=(6, 5))
    ax = fig.add_subplot(111, xlim=vlim, ylim=blim)
    sns.despine(fig)
    name, r, n = fiber
    ax.set_title(name)
    f = FiberFactory()
    for (r_, n_) in zip_longest(r, n):
        f.addLayer(radius=r_, index=n_)
    fiber = f[0]
    V = numpy.linspace(*vlim)
    wl = [fiber.toWl(v) for v in V[::-1]]
    sim = Simulator(f, wl, delta=1e-7)
    co = next(sim.cutoff())
    b = next(sim.b())
    for mode, cutoff in co[0].items():
        if cutoff == 0:
            continue  # skip HE(1,1) / LP(0,1)
        color = MODE_COLORS[str(mode)]
        ax.axvline(cutoff, ls=':', color=color)

        b_ = numpy.empty(len(wl))
        for j, b__ in enumerate(b):
            b_[j] = b__.get(mode, float("nan"))
        ax.plot(V[::-1],
                b_,
                color=color,
                label=str(mode) if mode.nu in (1, 3) else None)

    ax.set_ylabel("Normalized propagation constant ($b$)")
    ax.set_xlabel("Normalized frequency ($V_0$)")
    ax.legend(loc='best')
    fig.tight_layout()
Beispiel #11
0
    def testCutoffV(self):
        """Values from Bures, Table 3.6."""
        delta = 0.3
        V = 5

        wl = Wavelength(1.55e-6)
        n2 = 1.444

        n1 = sqrt(n2**2 / (1 - 2 * delta))
        rho = V / (sqrt(n1**2 - n2**2) * wl.k0)

        f = FiberFactory()
        f.addLayer(radius=rho, index=n1)
        f.addLayer(index=n2)
        fiber = f[0]

        sols = [(Mode('TE', 0, 1), 2.4048),
                (Mode('TM', 0, 1), 2.4048),
                (Mode('HE', 1, 1), 0),
                (Mode('EH', 1, 1), 3.8317),
                (Mode('TE', 0, 2), 5.5201),
                (Mode('TM', 0, 2), 5.5201),
                (Mode('HE', 1, 2), 3.8317),
                (Mode('EH', 1, 2), 7.0156),
                (Mode('HE', 2, 1), 2.8526),
                (Mode('EH', 2, 1), 5.1356),
                (Mode('HE', 3, 1), 4.3423),
                (Mode('EH', 2, 2), 8.4172)]

        for mode, V0 in sols:
            self.assertAlmostEqual(fiber.cutoff(mode), V0, 4, msg=str(mode))
Beispiel #12
0
    def testBures3_6(self):
        delta = 0.3
        V = 5

        wl = Wavelength(1.55e-6)
        n2 = 1.444

        n1 = sqrt(n2**2 / (1 - 2 * delta))
        rho = V / (sqrt(n1**2 - n2**2) * wl.k0)

        f = FiberFactory()
        f.addLayer(radius=rho, index=n1)
        f.addLayer(index=n2)
        fiber = f[0]
        modes = fiber.findVmodes(wl)

        sols = {Mode('HE', 1, 1): 2.119,
                Mode('TE', 0, 1): 3.153,
                Mode('TM', 0, 1): 3.446,
                Mode('HE', 2, 1): 3.377,
                Mode('EH', 1, 1): 4.235,
                Mode('HE', 3, 1): 4.507,
                Mode('HE', 1, 2): 4.638}
        self.assertEqual(len(modes), len(sols))
        for m in modes:
            neff = fiber.neff(m, wl)
            u = wl.k0 * rho * sqrt(n1**2 - neff**2)
            self.assertAlmostEqual(u, sols[m], 3)
Beispiel #13
0
    def testEqualIndexes(self):
        f = FiberFactory()
        f.addLayer(radius=1e-6, index=1.474)
        f.addLayer(radius=4e-6, index=1.474)
        f.addLayer()
        fiber = f[0]

        self.assertEqual(len(fiber), 2)
Beispiel #14
0
    def testDefaultLayerAttributes(self):
        f = FiberFactory()
        f.addLayer()

        self.assertEqual(f.layers[0].mparams[0], 1.444)
        self.assertEqual(f.layers[0].material, "Fixed")
        self.assertEqual(f.layers[0].type, "StepIndex")
        self.assertEqual(f.layers[0].radius, 0)
Beispiel #15
0
    def testDefaultLayerAttributes(self):
        f = FiberFactory()
        f.addLayer()

        self.assertEqual(f.layers[0].mparams[0], 1.444)
        self.assertEqual(f.layers[0].material, "Fixed")
        self.assertEqual(f.layers[0].type, "StepIndex")
        self.assertEqual(f.layers[0].radius, 0)
Beispiel #16
0
def plot_b_vs_V(vectorial=True, scalar=False):
    nf = len(FIBERS)
    fig, axes = pyplot.subplots(nf,
                                1,
                                sharex=False,
                                sharey=False,
                                subplot_kw={
                                    'xlim': VLIM,
                                    'ylim': (0, 0.3)
                                },
                                figsize=(6, 9))
    sns.despine(fig)
    lines = {}
    for i, (name, r, n) in enumerate(FIBERS):
        axes[i].set_title(name)
        f = FiberFactory()
        for (r_, n_) in zip_longest(r, n):
            f.addLayer(radius=r_, index=n_)
        fiber = f[0]
        V = numpy.linspace(*VLIM)
        wl = [fiber.toWl(v) for v in V[::-1]]
        sim = Simulator(f, wl, vectorial=vectorial, scalar=scalar, delta=1e-5)
        co = next(sim.cutoff())
        b = next(sim.b())
        assert len(b) == len(wl)
        for mode, cutoff in co[0].items():
            if cutoff == 0:
                continue  # skip HE(1,1) / LP(0,1)
            color = MODE_COLORS[str(mode)]
            axes[i].axvline(cutoff, ls=':', color=color)

            b_ = numpy.empty(len(wl))
            for j, b__ in enumerate(b):
                b_[j] = b__.get(mode, float("nan"))
            lines[mode], = axes[i].plot(V[::-1], b_, color=color)
        if i == 1 and vectorial is True:  # fiber b
            r = Rectangle((4.6, 0), 0.8, 0.04, alpha=.3, facecolor='grey')
            axes[i].add_patch(r)

    handles = [lines[k] for k in sorted(lines)]
    labels = [str(k) for k in sorted(lines)]
    leg = fig.legend(handles,
                     labels,
                     loc='upper left',
                     bbox_to_anchor=(0.18, 1),
                     frameon=True)
    frame = leg.get_frame()
    frame.set_linewidth(0)
    fig.text(0.04,
             0.5,
             "Normalized propagation constant ($b$)",
             rotation='vertical',
             ha='center',
             va='center')
    axes[-1].set_xlabel("Normalized frequency ($V_0$)")

    fig.tight_layout(rect=(0.04, 0, 1, 1))
Beispiel #17
0
def ACF():
    f = FiberFactory()
    f.addLayer(name="air", radius=9.1e-6, material="Air")
    f.addLayer(name="ring", radius=11.3e-6, material="SiO2GeO2", x=0.192)
    f.addLayer(name="trench", radius=16.2e-6, material="SiO2F", x=0.013)
    f.addLayer(name="cladding", material="Silica")
    fiber = f[0]
    print(fiber)
    return fiber
Beispiel #18
0
    def testFindLPmodes(self):
        f = FiberFactory()
        f.addLayer(radius=4.5e-6, index=1.448918)
        f.addLayer(index=1.444418)
        fiber = f[0]

        wl = Wavelength(800e-9)
        modes = fiber.findLPmodes(wl)

        self.assertEqual(len(modes), 4)
Beispiel #19
0
    def testFundamental(self):
        f = FiberFactory()
        f.addLayer(radius=4.5e-6, index=1.448918)
        f.addLayer(index=1.444418)
        fiber = f[0]
        wl = Wavelength(1550e-9)

        neff = fiber.neff(Mode('HE', 1, 1), wl)
        self.assertAlmostEqual(neff, 1.4464045, places=5)

        lp01 = fiber.neff(Mode('LP', 0, 1), wl)
        self.assertAlmostEqual(lp01, neff, places=5)
Beispiel #20
0
def ACF():
    f = FiberFactory()
    f.addLayer(name="air", radius=9.1e-6, material="Air")
    f.addLayer(name="ring", radius=11.3e-6, material="SiO2GeO2", x=0.192)
    f.addLayer(name="trench", radius=16.2e-6, material="SiO2F", x=0.013)
    f.addLayer(name="cladding", material="Silica")
    fiber = f[0]
    print(fiber)
    return fiber
Beispiel #21
0
    def testRadiusZero(self):
        f = FiberFactory()
        f.addLayer(radius=0)
        f.addLayer(radius=4e-6, index=1.474)
        f.addLayer()
        fiber = f[0]

        self.assertEqual(len(fiber), 2)
Beispiel #22
0
def fromVDelta(V, Delta, wl):
    """To match Bures examples

    params(3.9, 0.26, wl)  # Bures 3.25

    """
    nco = numpy.sqrt(1.444**2 / (1 - Delta*2))
    rho = V / wl.k0 / numpy.sqrt(nco**2 - 1.444**2)

    f = FiberFactory()
    f.addLayer(name="core", radius=rho, index=nco)
    f.addLayer(name="cladding", index=1.444)
    fiber = f[0]
    print(fiber)
    return fiber
Beispiel #23
0
    def testFactoryGetItem(self):
        f = FiberFactory(os.path.join(__dir__, 'smf28.fiber'))
        f.layers[0].radius = [2e-6, 3e-6, 4e-6]

        for i, fiber in enumerate(f):
            self.assertEqual(fiber.outerRadius(0), f.layers[0].radius[i])
            self.assertEqual(f[i].outerRadius(0), f.layers[0].radius[i])
Beispiel #24
0
    def testCutoffLP(self):
        f = FiberFactory()
        f.addLayer(radius=1e-5 / 3, index=5)
        f.addLayer(index=4)

        fiber = f[0]

        sols = [(Mode('LP', 0, 1), 0),
                (Mode('LP', 0, 2), 3.8317),
                (Mode('LP', 0, 3), 7.0156),
                (Mode('LP', 1, 1), 2.4048),
                (Mode('LP', 1, 2), 5.5201),
                (Mode('LP', 2, 1), 3.8317)]

        for mode, V0 in sols:
            self.assertAlmostEqual(fiber.cutoff(mode), V0, 4, msg=str(mode))
Beispiel #25
0
    def testImpossibleRadius(self):
        """TODO: not implemented yet"""

        f = FiberFactory()
        f.addLayer(radius=10e-6, index=1.174)
        f.addLayer(radius=4e-6, index=1.444)
        f.addLayer()

        self.assertEqual(len(f), 0)
Beispiel #26
0
 def testReadAttributes(self):
     f = FiberFactory(os.path.join(__dir__, 'smf28.fiber'))
     self.assertEqual(f.name, "smf28")
     self.assertEqual(f.author, "Charles Brunet")
     self.assertEqual(f.description, "Single mode fiber")
     self.assertEqual(len(f.layers), 2)
     self.assertEqual(f.layers[0].name, "core")
     self.assertEqual(f.layers[1].name, "cladding")
Beispiel #27
0
def main():
    delta = 0.3
    V = 5

    wl = Wavelength(1.55e-6)
    n2 = 1.444

    n1 = sqrt(n2**2 / (1 - 2 * delta))
    rho = V / (sqrt(n1**2 - n2**2) * wl.k0)

    f = FiberFactory()
    f.addLayer(radius=rho, index=n1)
    f.addLayer(index=n2)
    fiber = f[0]
    modes = fiber.findVmodes(wl)

    for m in modes:
        neff = fiber.neff(m, wl, delta=1e-5)
Beispiel #28
0
    def testFactoryLen(self):
        f = FiberFactory(os.path.join(__dir__, 'smf28.fiber'))
        self.assertEqual(len(f), 1)

        f.layers[0].radius = [2e-6, 3e-6, 4e-6]
        self.assertEqual(len(f), 3)

        f.layers[0].mparams[0] = {'start': 1.454, 'end': 1.494, 'num': 5}
        self.assertEqual(len(f), 15)
Beispiel #29
0
    def testFiberWithMaterials(self):
        f = FiberFactory(os.path.join(__dir__, 'smf28.fiber'))
        f.layers[0].material = "SiO2GeO2"
        f.layers[0].mparams = [0.05]
        f.layers[1].material = "Silica"
        fiber = f[0]

        self.assertAlmostEqual(fiber.index(2e-6, 1550e-9), 1.451526777142772)
        self.assertAlmostEqual(fiber.index(8e-6, 1550e-9), 1.444023621703261)
Beispiel #30
0
def plot_b_vs_V(vectorial=True, scalar=False):
    nf = len(FIBERS)
    fig, axes = pyplot.subplots(nf, 1, sharex=False, sharey=False,
                                subplot_kw={'xlim': VLIM, 'ylim': (0, 0.3)},
                                figsize=(6, 9))
    sns.despine(fig)
    lines = {}
    for i, (name, r, n) in enumerate(FIBERS):
        axes[i].set_title(name)
        f = FiberFactory()
        for (r_, n_) in zip_longest(r, n):
            f.addLayer(radius=r_, index=n_)
        fiber = f[0]
        V = numpy.linspace(*VLIM)
        wl = [fiber.toWl(v) for v in V[::-1]]
        sim = Simulator(f, wl, vectorial=vectorial, scalar=scalar, delta=1e-5)
        co = next(sim.cutoff())
        b = next(sim.b())
        assert len(b) == len(wl)
        for mode, cutoff in co[0].items():
            if cutoff == 0:
                continue  # skip HE(1,1) / LP(0,1)
            color = MODE_COLORS[str(mode)]
            axes[i].axvline(cutoff, ls=':', color=color)

            b_ = numpy.empty(len(wl))
            for j, b__ in enumerate(b):
                b_[j] = b__.get(mode, float("nan"))
            lines[mode], = axes[i].plot(V[::-1], b_, color=color)
        if i == 1 and vectorial is True:  # fiber b
            r = Rectangle((4.6, 0), 0.8, 0.04, alpha=.3, facecolor='grey')
            axes[i].add_patch(r)

    handles = [lines[k] for k in sorted(lines)]
    labels = [str(k) for k in sorted(lines)]
    leg = fig.legend(handles, labels, loc='upper left',
                     bbox_to_anchor=(0.18, 1), frameon=True)
    frame = leg.get_frame()
    frame.set_linewidth(0)
    fig.text(0.04, 0.5, "Normalized propagation constant ($b$)",
             rotation='vertical', ha='center', va='center')
    axes[-1].set_xlabel("Normalized frequency ($V_0$)")

    fig.tight_layout(rect=(0.04, 0, 1, 1))
Beispiel #31
0
def RCF2():
    x = 0.19
    r1 = 125 * 1.4 / 180 * 1e-6
    r2 = 125 * 4 / 180 * 1e-6

    f = FiberFactory()
    f.addLayer(name="center", radius=r1, material="Silica")
    f.addLayer(name="ring", radius=r2, material="SiO2GeO2", x=x)
    f.addLayer(name="cladding", material="Silica")
    fiber = f[0]
    print(fiber)
    return fiber
Beispiel #32
0
    def testImpossibleRadius(self):
        """TODO: not implemented yet"""

        f = FiberFactory()
        f.addLayer(radius=10e-6, index=1.174)
        f.addLayer(radius=4e-6, index=1.444)
        f.addLayer()

        self.assertEqual(len(f), 0)
Beispiel #33
0
    def testFindVmodes(self):
        f = FiberFactory()
        f.addLayer(radius=4.5e-6, index=1.448918)
        f.addLayer(index=1.444418)
        fiber = f[0]

        wl = Wavelength(800e-9)
        modes = fiber.findVmodes(wl)

        sols = [(Mode('HE', 1, 1), 1.4479082),
                (Mode('TE', 0, 1), 1.44643),
                (Mode('HE', 2, 1), 1.446427),
                (Mode('TM', 0, 1), 1.4464268),
                (Mode('EH', 1, 1), 1.444673),
                (Mode('HE', 3, 1), 1.444669),
                (Mode('HE', 1, 2), 1.4444531)]
        self.assertEqual(len(modes), len(sols))
        for mode, neff in sols:
            self.assertTrue(mode in modes)
            self.assertAlmostEqual(fiber.neff(mode, wl), neff)
Beispiel #34
0
    def __init__(self, parent=None):
        super().__init__(parent)
        self.factory = FiberFactory()

        self.setWindowTitle(self.tr("Fiber Editor"))

        actions = {
            'new': (self.tr("&New"), 'document-new', QtGui.QKeySequence.New,
                    self.actionNew),
            'open': (self.tr("&Open"), 'document-open',
                     QtGui.QKeySequence.Open, self.actionOpen),
            'save': (self.tr("&Save"), 'document-save',
                     QtGui.QKeySequence.Save, self.save),
            'saveas': (self.tr("Save &As..."), 'document-save-as',
                       QtGui.QKeySequence.SaveAs, self.actionSaveAs),
            'quit': (
                self.tr("&Quit"),
                None,  # 'application-exit',
                QtGui.QKeySequence.Quit,
                self.close),
            'info': (self.tr("&Fiber properties"), 'document-properties',
                     [QtGui.QKeySequence("Ctrl+I")], self.actionInfo),
            'add': (self.tr("&Add layer"), 'list-add',
                    [QtGui.QKeySequence("Ctrl+Shift++")], self.actionAddLayer),
            'remove': (self.tr("&Remove layer"), 'list-remove',
                       [QtGui.QKeySequence("Ctrl+-")], self.actionRemoveLayer),
        }

        menus = [(self.tr("&File"),
                  ['new', 'open', '-', 'save', 'saveas', '-', 'quit']),
                 (self.tr("Fibe&r"), ['info', '-', 'add', 'remove'])]

        toolbars = [['new', 'open', 'save', 'info'], ['add', 'remove']]

        self.initActions(actions)
        self.initMenubars(self.menuBar(), menus)
        self.initToolbars(toolbars)
        self._initLayout()
        self.setDirty(False)
        self.actionNew()
Beispiel #35
0
    def testBures_4_2_8(self):
        n2 = 1.457420
        n1 = 1.462420
        rho = 8.335e-6
        wl = Wavelength(0.6328e-6)

        f = FiberFactory()
        f.addLayer(radius=rho, index=n1)
        f.addLayer(index=n2)
        fiber = f[0]
        modes = fiber.findLPmodes(wl)

        sols = {
            Mode('LP', 0, 1): 2.1845,
            Mode('LP', 0, 2): 4.9966,
            Mode('LP', 0, 3): 7.7642,
            Mode('LP', 1, 1): 3.4770,
            Mode('LP', 1, 2): 6.3310,
            Mode('LP', 1, 3): 9.0463,
            Mode('LP', 2, 1): 4.6544,
            Mode('LP', 2, 2): 7.5667,
            Mode('LP', 3, 1): 5.7740,
            Mode('LP', 3, 2): 8.7290,
            Mode('LP', 4, 1): 6.8560,
            Mode('LP', 4, 2): 9.8153,
            Mode('LP', 5, 1): 7.9096,
            Mode('LP', 6, 1): 8.9390,
            Mode('LP', 7, 1): 9.9451
        }
        self.assertEqual(len(modes), len(sols))
        for m in modes:
            neff = fiber.neff(m, wl)
            u = wl.k0 * rho * sqrt(n1**2 - neff**2)
            self.assertAlmostEqual(u, sols[m], 3)
Beispiel #36
0
    def testCutoffV(self):
        """Values from Bures, Table 3.6."""
        delta = 0.3
        V = 5

        wl = Wavelength(1.55e-6)
        n2 = 1.444

        n1 = sqrt(n2**2 / (1 - 2 * delta))
        rho = V / (sqrt(n1**2 - n2**2) * wl.k0)

        f = FiberFactory()
        f.addLayer(radius=rho, index=n1)
        f.addLayer(index=n2)
        fiber = f[0]

        sols = [(Mode('TE', 0, 1), 2.4048), (Mode('TM', 0, 1), 2.4048),
                (Mode('HE', 1, 1), 0), (Mode('EH', 1, 1), 3.8317),
                (Mode('TE', 0, 2), 5.5201), (Mode('TM', 0, 2), 5.5201),
                (Mode('HE', 1, 2), 3.8317), (Mode('EH', 1, 2), 7.0156),
                (Mode('HE', 2, 1), 2.8526), (Mode('EH', 2, 1), 5.1356),
                (Mode('HE', 3, 1), 4.3423), (Mode('EH', 2, 2), 8.4172)]

        for mode, V0 in sols:
            self.assertAlmostEqual(fiber.cutoff(mode), V0, 4, msg=str(mode))
Beispiel #37
0
    def testBures3_6(self):
        delta = 0.3
        V = 5

        wl = Wavelength(1.55e-6)
        n2 = 1.444

        n1 = sqrt(n2**2 / (1 - 2 * delta))
        rho = V / (sqrt(n1**2 - n2**2) * wl.k0)

        f = FiberFactory()
        f.addLayer(radius=rho, index=n1)
        f.addLayer(index=n2)
        fiber = f[0]
        modes = fiber.findVmodes(wl)

        sols = {
            Mode('HE', 1, 1): 2.119,
            Mode('TE', 0, 1): 3.153,
            Mode('TM', 0, 1): 3.446,
            Mode('HE', 2, 1): 3.377,
            Mode('EH', 1, 1): 4.235,
            Mode('HE', 3, 1): 4.507,
            Mode('HE', 1, 2): 4.638
        }
        self.assertEqual(len(modes), len(sols))
        for m in modes:
            neff = fiber.neff(m, wl)
            u = wl.k0 * rho * sqrt(n1**2 - neff**2)
            self.assertAlmostEqual(u, sols[m], 3)
Beispiel #38
0
 def testSetAttributes(self):
     f = FiberFactory()
     f.name = "smf28"
     f.author = "Charles Brunet"
     f.description = "Single mode fiber"
     f.addLayer()
     f.layers[0].name = "core"
     self.assertEqual(f.name, "smf28")
     self.assertEqual(f.author, "Charles Brunet")
     self.assertEqual(f.description, "Single mode fiber")
     self.assertEqual(f.layers[0].name, "core")
Beispiel #39
0
 def testFiberProperties(self):
     f = FiberFactory(os.path.join(__dir__, 'rcf.fiber'))
     fiber = f[0]
     self.assertEqual(len(fiber), 3)
     self.assertEqual(fiber.name(0), "center")
     self.assertEqual(fiber.name(1), "ring")
     self.assertEqual(fiber.name(2), "cladding")
     self.assertEqual(fiber.innerRadius(1), 4e-6)
     self.assertEqual(fiber.outerRadius(1), 8e-6)
     self.assertEqual(fiber.thickness(1), 4e-6)
     self.assertEqual(fiber.index(6e-6, 1550e-9), 1.454)
     self.assertEqual(fiber.minIndex(1, 1550e-9), 1.454)
     self.assertEqual(fiber.maxIndex(1, 1550e-9), 1.454)
Beispiel #40
0
def example3():
    """2. Creating families of fibers: range of parameters"""
    factory = FiberFactory()
    factory.addLayer(name="core",
                     radius={'start': 2e-6, 'end': 5e-6, 'num': 10},
                     index=[1.454, 1.464, 1.474])
    factory.addLayer(name="cladding")
    print('Number of generated fibers:', len(factory))
Beispiel #41
0
def RCF2():
    x = 0.19
    r1 = 125 * 1.4 / 180 * 1e-6
    r2 = 125 * 4 / 180 * 1e-6

    f = FiberFactory()
    f.addLayer(name="center", radius=r1, material="Silica")
    f.addLayer(name="ring", radius=r2, material="SiO2GeO2", x=x)
    f.addLayer(name="cladding", material="Silica")
    fiber = f[0]
    print(fiber)
    return fiber
Beispiel #42
0
def example1():
    """Counting modes and finding cutoffs."""
    factory = FiberFactory()
    factory.addLayer(radius=10e-6, index=1.474)
    factory.addLayer()

    # Print list of modes
    sim = Simulator(factory, [1550e-9])
    modes = next(sim.modes())[0]  # modes of first wavelength of next fiber
    print(", ".join(str(mode) for mode in sorted(modes)))
    print()

    # Print cutoff (as V number)
    cutoffs = next(sim.cutoff())[0]  # first wavelength of next fiber
    for mode, co in cutoffs.items():
        print(str(mode), co)
    print()

    # Print cutoff (as wavelength)
    cutoffswl = next(sim.cutoffWl())[0]  # first wavelength of next fiber
    for mode, co in cutoffswl.items():
        print(str(mode), str(co))
    print()
Beispiel #43
0
    def testCutoffV3(self):
        """Same index for n1 and n2; therefore this is SSIF."""
        n1 = 1.6
        n2 = 1.6
        n3 = 1.4
        rho1 = 5e-6
        rho2 = 6e-6

        f = FiberFactory()
        f.addLayer(radius=rho1, index=n1)
        f.addLayer(radius=rho2, index=n2)
        f.addLayer(index=n3)
        fiber = f[0]

        sols = [(Mode('TE', 0, 1), 2.4048),
                (Mode('HE', 2, 1), 2.522748641920963),
                (Mode('TM', 0, 1), 2.4048),
                (Mode('EH', 1, 1), 3.8317),
                (Mode('HE', 3, 1), 3.9762622998101453),
                (Mode('HE', 1, 2), 3.8317)]

        for mode, V0 in sols:
            self.assertAlmostEqual(fiber.cutoff(mode), V0, 4, msg=str(mode))
Beispiel #44
0
    def _testFiberCutoffs(self, r, n):
        f = FiberFactory()
        for r_, n_ in zip_longest(r, n):
            f.addLayer(radius=r_, index=n_)
        fiber = f[0]

        for nu in range(1, 5):
            pco = -1
            for m in range(1, 5):
                for fam in (ModeFamily.HE, ModeFamily.EH):
                    mode = Mode(fam, nu, m)
                    co = fiber.cutoff(mode)
                    self.assertGreater(co, pco, "Not greater "+str(mode))

                    if mode != HE11:
                        d = 0.
                        b = float("nan")
                        while isnan(b):
                            d += 0.25
                            wl = fiber.toWl(co + d)
                            b = fiber.b(mode, wl, delta=1e-5)
                        self.assertLess(b, 0.1, "Wrong b "+str(mode))

                    pco = co
Beispiel #45
0
    def _testFiberCutoffs(self, r, n):
        f = FiberFactory()
        for r_, n_ in zip_longest(r, n):
            f.addLayer(radius=r_, index=n_)
        fiber = f[0]

        for nu in range(1, 5):
            pco = -1
            for m in range(1, 5):
                for fam in (ModeFamily.HE, ModeFamily.EH):
                    mode = Mode(fam, nu, m)
                    co = fiber.cutoff(mode)
                    self.assertGreater(co, pco, "Not greater " + str(mode))

                    if mode != HE11:
                        d = 0.
                        b = float("nan")
                        while isnan(b):
                            d += 0.25
                            wl = fiber.toWl(co + d)
                            b = fiber.b(mode, wl, delta=1e-5)
                        self.assertLess(b, 0.1, "Wrong b " + str(mode))

                    pco = co
Beispiel #46
0
    def testFindLPmodes(self):
        f = FiberFactory()
        f.addLayer(radius=4.5e-6, index=1.448918)
        f.addLayer(index=1.444418)
        fiber = f[0]

        wl = Wavelength(800e-9)
        modes = fiber.findLPmodes(wl)

        self.assertEqual(len(modes), 4)
Beispiel #47
0
def compute_fiber(filename, nrho, R2, C2, wl, numax=None, mmax=None):
    # Initialize simulators
    sim = []
    for i, r2 in enumerate(R2):
        r1 = numpy.linspace(0, r2, nrho, endpoint=False)
        factory = FiberFactory()
        factory.addLayer(radius=r1, material='Silica')
        factory.addLayer(radius=r2, material='SiO2GeO2', x=C2)
        factory.addLayer(material='Silica')
        sim.append(Simulator(factory, wl))

    nr2 = R2.size
    nc2 = C2.size
    ckfile, _ = os.path.splitext(filename)
    ckfile += '.ckp.npz'
    if os.path.isfile(ckfile):
        # Restore checkpoint
        data = numpy.load(ckfile)
        modes = [Mode(*a) for a in data['modes']]
        results = {'modes': modes}
        for fct in ('cutoff', 'neff', 'beta1', 'beta2', 'beta3'):
            results[fct] = data[fct]
    else:
        # Find modes
        sim[-1].numax = numax
        sim[-1].mmax = mmax
        modes = find_mode_list(sim[-1])

        # Initialize arrays
        shape = (nrho, nr2, C2.size, len(modes))
        results = {'modes': modes}
        for fct in ('cutoff', 'neff', 'beta1', 'beta2', 'beta3'):
            results[fct] = numpy.empty(shape)
            results[fct].fill(numpy.nan)

    Rho = numpy.linspace(0, 1, nrho, endpoint=False)
    for i, r2 in enumerate(R2[::-1], 1):
        print("Solving when r2={:.3f}µm".format(r2 * 1e6))
        if numpy.all(numpy.isnan(results['cutoff'][:, nr2 - i, :, :])):
            numax, mmax = compute_fiber_r2(results, modes, sim[-i], nr2 - i,
                                           Rho, r2, nc2, numax, mmax)
            numpy.savez_compressed(ckfile, **results)  # Save checkpoint

    os.rename(ckfile, filename)
    return results
Beispiel #48
0
    def set_factory(self, factory):
        """Set the FiberFactory.

        It can be used if this was not done in the constructor, or to modify
        the current FiberFactory.

        Args:
            factory(FiberFactory): FiberFactory object to use in simulator.

        """
        if isinstance(factory, str):
            factory = FiberFactory(factory)
        self.factory = factory
        if factory is not None:
            self._fibers = tuple(iter(factory))
            self._build_fsims()
Beispiel #49
0
def build_factory(nr1, r2, cn2):
    """Create a FiberFactory for RCF from given arguments.

    Args:
        nr1(int): Number of points for r1
        r2(float): Radius r2
        cn2(float): Concentration for ring-core

    Returns;
        FiberFactory

    """
    r1 = numpy.linspace(0, r2, nr1, endpoint=False)
    factory = FiberFactory()
    factory.addLayer(radius=r1, material='Silica')
    factory.addLayer(radius=r2, material='SiO2GeO2', x=cn2)
    factory.addLayer(material='Silica')
    return factory
Beispiel #50
0
 def testSetAttributes(self):
     f = FiberFactory()
     f.name = "smf28"
     f.author = "Charles Brunet"
     f.description = "Single mode fiber"
     f.addLayer()
     f.layers[0].name = "core"
     self.assertEqual(f.name, "smf28")
     self.assertEqual(f.author, "Charles Brunet")
     self.assertEqual(f.description, "Single mode fiber")
     self.assertEqual(f.layers[0].name, "core")
Beispiel #51
0
def compute_fiber(filename, nrho, R2, C2, wl, numax=None, mmax=None):
    # Initialize simulators
    sim = []
    for i, r2 in enumerate(R2):
        r1 = numpy.linspace(0, r2, nrho, endpoint=False)
        factory = FiberFactory()
        factory.addLayer(radius=r1, material='Silica')
        factory.addLayer(radius=r2, material='SiO2GeO2', x=C2)
        factory.addLayer(material='Silica')
        sim.append(Simulator(factory, wl))

    nr2 = R2.size
    nc2 = C2.size
    ckfile, _ = os.path.splitext(filename)
    ckfile += '.ckp.npz'
    if os.path.isfile(ckfile):
        # Restore checkpoint
        data = numpy.load(ckfile)
        modes = [Mode(*a) for a in data['modes']]
        results = {
            'modes': modes
        }
        for fct in ('cutoff', 'neff', 'beta1', 'beta2', 'beta3'):
            results[fct] = data[fct]
    else:
        # Find modes
        sim[-1].numax = numax
        sim[-1].mmax = mmax
        modes = find_mode_list(sim[-1])

        # Initialize arrays
        shape = (nrho, nr2, C2.size, len(modes))
        results = {
            'modes': modes
        }
        for fct in ('cutoff', 'neff', 'beta1', 'beta2', 'beta3'):
            results[fct] = numpy.empty(shape)
            results[fct].fill(numpy.nan)

    Rho = numpy.linspace(0, 1, nrho, endpoint=False)
    for i, r2 in enumerate(R2[::-1], 1):
        print("Solving when r2={:.3f}µm".format(r2*1e6))
        if numpy.all(numpy.isnan(results['cutoff'][:, nr2-i, :, :])):
            numax, mmax = compute_fiber_r2(
                results, modes, sim[-i], nr2-i, Rho, r2, nc2, numax, mmax)
            numpy.savez_compressed(ckfile, **results)  # Save checkpoint

    os.rename(ckfile, filename)
    return results
Beispiel #52
0
    def testFundamental(self):
        f = FiberFactory()
        f.addLayer(radius=4.5e-6, index=1.448918)
        f.addLayer(index=1.444418)
        fiber = f[0]
        wl = Wavelength(1550e-9)

        neff = fiber.neff(Mode('HE', 1, 1), wl)
        self.assertAlmostEqual(neff, 1.4464045, places=5)

        lp01 = fiber.neff(Mode('LP', 0, 1), wl)
        self.assertAlmostEqual(lp01, neff, places=5)
Beispiel #53
0
def optimf(params, target):
    # print(params)
    r1, rho, x = params
    r1 *= 1e-6
    r2 = r1 / rho
    ff = FiberFactory()
    ff.addLayer(name="center", radius=r1, material="Silica")
    ff.addLayer(name="ring", radius=r2, material="SiO2GeO2", x=x)
    ff.addLayer(name="cladding", material="Silica")
    sim = PSimulator(factory=ff, wavelengths=wl, delta=1e-3)
    dng = deltangs(sim, 0)
    sim.stop_thread(True)
    if len(dng) != len(target):
        r = 100
        # return float("inf")
    else:
        r = sum((n1 - n2)**2 for (n1, n2) in zip(dng, target)) * 10
    print(params, dng, r)
    return r
Beispiel #54
0
    def testCutoffLP(self):
        f = FiberFactory()
        f.addLayer(radius=1e-5 / 3, index=5)
        f.addLayer(index=4)

        fiber = f[0]

        sols = [(Mode('LP', 0, 1), 0), (Mode('LP', 0, 2), 3.8317),
                (Mode('LP', 0, 3), 7.0156), (Mode('LP', 1, 1), 2.4048),
                (Mode('LP', 1, 2), 5.5201), (Mode('LP', 2, 1), 3.8317)]

        for mode, V0 in sols:
            self.assertAlmostEqual(fiber.cutoff(mode), V0, 4, msg=str(mode))
Beispiel #55
0
    def testToWl(self):
        f = FiberFactory(os.path.join(__dir__, 'smf28.fiber'))
        fiber = f[0]
        self.assertAlmostEqual(fiber.toWl(fiber.V0(1600e-9)), 1600e-9)

        f.layers[0].material = "Silica"
        f.layers[1].material = "Air"
        fiber = f[0]
        self.assertAlmostEqual(fiber.toWl(fiber.V0(1600e-9)), 1600e-9)

        self.assertEqual(fiber.toWl(float("inf")), 0)
        self.assertTrue(isinf(fiber.toWl(0)))

        with warnings.catch_warnings():
            warnings.filterwarnings("ignore", category=OutOfRangeWarning)
            f = FiberFactory()
            f.addLayer(radius=10e-6, material="SiO2GeO2", x=0.25)
            f.addLayer(material="Silica")
            fiber = f[0]
            wl = fiber.toWl(2.4)
            self.assertGreater(wl, 10e-6)
Beispiel #56
0
def build_factory(nr1, r2, cn2):
    """Create a FiberFactory for RCF from given arguments.

    Args:
        nr1(int): Number of points for r1
        r2(float): Radius r2
        cn2(float): Concentration for ring-core

    Returns;
        FiberFactory

    """
    r1 = numpy.linspace(0, r2, nr1, endpoint=False)
    factory = FiberFactory()
    factory.addLayer(radius=r1, material='Silica')
    factory.addLayer(radius=r2, material='SiO2GeO2', x=cn2)
    factory.addLayer(material='Silica')
    return factory
Beispiel #57
0
    def testSetFactory(self):
        sim = self.Simulator()
        sim.set_factory(os.path.join(__dir__, '..', 'fiber', 'rcfs.fiber'))
        self.assertEqual(len(sim.fibers), 5)

        f = FiberFactory()
        f.addLayer(radius=[4e-6, 5e-6, 6e-6], index=1.449)
        f.addLayer(index=1.444)
        sim.set_factory(f)
        self.assertEqual(len(sim.fibers), 3)

        with self.assertRaises(ValueError):
            sim.wavelengths
        self.assertFalse(sim.initialized)
        self.assertTrue(sim._fsims is None)
Beispiel #58
0
def fromVDelta(V, Delta, wl):
    """To match Bures examples

    params(3.9, 0.26, wl)  # Bures 3.25

    """
    nco = numpy.sqrt(1.444**2 / (1 - Delta * 2))
    rho = V / wl.k0 / numpy.sqrt(nco**2 - 1.444**2)

    f = FiberFactory()
    f.addLayer(name="core", radius=rho, index=nco)
    f.addLayer(name="cladding", index=1.444)
    fiber = f[0]
    print(fiber)
    return fiber