Beispiel #1
0
    def __str__(self):
        """
        :return: Information string
        :rtype: string

        Output information on Filter.
        """
        output_string = [
            'width_nu = {0:f} THz', 'fwhm_nu = {1:f} THz',
            'offset_nu = {2:f} THz', 'm = {3:d}', 'channel = {4:d}',
            'type_filt = {5:s}'
        ]

        return "\n".join(output_string).format(self.width_nu,
                                               self.calculate_fwhm(),
                                               self.offset_nu, self.m,
                                               self.channel, self.type)


if __name__ == "__main__":
    """ Plot the power transfer function of the filter """
    from pyofss import Domain, Filter, single_plot

    domain = Domain(centre_nu=193.0)
    gauss_filter = Filter(offset_nu=1.5)
    filter_tf = gauss_filter.transfer_function(domain.nu, domain.centre_nu)

    # Expect the filter transfer function to be centred at 194.5 THz:
    single_plot(domain.nu, filter_tf)
Beispiel #2
0
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""

from pyofss import Domain, System, Gaussian, Fibre
from pyofss import temporal_power, multi_plot, labels

system = System(Domain(bit_width=200.0, samples_per_bit=2048))
system.add(Gaussian("gaussian", peak_power=1.0, width=1.0))

system.run()
P_ts = [temporal_power(system.fields['gaussian'])]

fibres = [
    Fibre(length=5.0, beta=[0.0, 0.0, 0.0, 1.0], total_steps=100),
    Fibre(length=5.0, beta=[0.0, 0.0, 1.0, 1.0], total_steps=100)
]

for fibre in fibres:
    system = System(Domain(bit_width=200.0, samples_per_bit=2048))
    system.add(Gaussian(peak_power=1.0, width=1.0))
    system.add(fibre)
    system.run()
Beispiel #3
0
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""

import sys
from pyofss import Domain, System, Gaussian, Fibre
from pyofss import map_plot, waterfall_plot, animated_plot, labels

domain = Domain(bit_width=50.0, samples_per_bit=8192)

width = 1.0
tau_R = 0.03
T_R = tau_R * width

system = System(domain)
system.add(Gaussian(peak_power=1.0, width=width))
system.add(Fibre(length=5.0, gamma=4.0, beta=[0.0, 0.0, -1.0],
                 raman_scattering=True, rs_factor=T_R,
                 total_steps=200, traces=200, method='ARK4IP'))
system.run()

storage = system['fibre'].stepper.storage
(x, y, z) = storage.get_plot_data(False, (191.1, 195.1), normalised=True)
Beispiel #4
0
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""

from pyofss import Domain, System, Gaussian, Fibre
from pyofss import temporal_power, spectral_power, double_plot, labels

domain = Domain(bit_width=4.0, samples_per_bit=4096)

s = 0.01
width = 1.0 / (s * domain.centre_omega)
gamma = 100.0 / (width ** 2)

P_ts = []
P_nus = []
length = [20.0 / gamma, 40.0 / gamma]

for l in length:
    system = System(domain)
    system.add(Gaussian(peak_power=1.0, width=width))
    system.add(Fibre(length=l, gamma=gamma, total_steps=200,
                     self_steepening=True, beta=[0.0, 0.0, 1.0]))
    system.run()
Beispiel #5
0
        return self.nonlinearity.exp_non(A, h, B)


if __name__ == "__main__":
    """
    Plot the result of a Gaussian pulse propagating through optical fibre.
    Simulates both (third-order) dispersion and nonlinearity.
    Use five different methods: ss_simple, ss_symmetric, ss_sym_rk4,
    ss_sym_rkf, and rk4ip. Expect all five methods to produce similar results;
    plot traces should all overlap. Separate traces should only be seen at
    a high zoom level.
    """
    from pyofss import Domain, System, Gaussian, Fibre
    from pyofss import temporal_power, multi_plot, labels

    domain = Domain(bit_width=200.0, samples_per_bit=2048)
    gaussian = Gaussian(peak_power=1.0, width=1.0)

    P_ts = []
    methods = ['ss_simple', 'ss_symmetric', 'ss_sym_rk4', 'rk4ip']

    for m in methods:
        sys = System(domain)
        sys.add(gaussian)
        sys.add(
            Fibre(length=5.0,
                  method=m,
                  total_steps=50,
                  beta=[0.0, 0.0, 0.0, 1.0],
                  gamma=1.0))
        sys.run()
Beispiel #6
0
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""

import sys
from pyofss import Domain, System, Sech, Fibre
from pyofss import map_plot, waterfall_plot, animated_plot, labels

system = System(Domain(bit_width=100.0, samples_per_bit=4096))
system.add(Sech(peak_power=1.0, width=1.0))
system.add(
    Fibre(length=4.0,
          beta=[0.0, 0.0, 0.0, 1.0],
          gamma=4.0,
          traces=100,
          method='ARK4IP'))
system.run()

storage = system['fibre'].stepper.storage
(x, y, z) = storage.get_plot_data(False, (192.1, 194.1), normalised=True)

map_plot(x,
         y,
         z,
Beispiel #7
0
        phase = self.initial_phase
        phase -= 2.0 * pi * self.offset_nu * domain.t

        sechh = 1./np.cosh(t_normalised)
        sechh = np.where(sechh != 0, np.power(sechh, 1+1j*self.C), 0.)
        magnitude = sqrt(self.peak_power)*sechh

        if domain.channels > 1:
            self.field[self.channel] += magnitude * exp(1j * phase)
        else:
            self.field += magnitude * exp(1j * phase)

        return self.field

if __name__ == "__main__":
    """ Plot a default Diss_soliton in temporal and spectral domain """
    from pyofss import Domain, System, Diss_soliton
    from pyofss import temporal_power, spectral_power, inst_freq
    from pyofss import double_plot, labels

    sys = System(Domain(bit_width=500.0))
    sys.add(Diss_soliton())
    sys.run()

    double_plot(sys.domain.t, temporal_power(sys.field),
                sys.domain.nu, spectral_power(sys.field, True),
                labels["t"], labels["P_t"], labels["nu"], labels["P_nu"],
                inst_freq = inst_freq(sys.field, sys.domain.dt), y2_label=labels["inst_nu"])

Beispiel #8
0
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""

import sys
from pyofss.domain import nu_to_omega, lambda_to_nu
from pyofss import Domain, System, Gaussian, Fibre
from pyofss import map_plot, waterfall_plot, animated_plot, labels

nu_0 = lambda_to_nu(1060.0)
nu_1 = lambda_to_nu(1550.0)

offset_nu = nu_0 - nu_1

system = System(Domain(bit_width=20.0, samples_per_bit=8192,
                       channels=2, centre_nu=nu_0))
system.add(Gaussian(width=1.0, peak_power=1000.0, channel=0))
system.add(Gaussian(width=1.0, peak_power=0.1, channel=1,
                    offset_nu=-offset_nu))
system.add(Fibre('fibre', length=0.05, gamma=[0.9, 0.615483871],
           beta=[[0.0, 0.0, 1.0, 0.0], [0.0, 0.0, -1.0, 0.0]],
           centre_omega=(nu_to_omega(nu_0), nu_to_omega(nu_1)),
           sim_type='wdm', method='ARK4IP', traces=100))
system.run()

storage = system['fibre'].stepper.storage
(x, y, z_temp) = storage.get_plot_data(channel=0)
z_label = r"Fibre length, $z \, (m)$"
z = z_temp * 1.0e3

map_plot(x, y, z, labels["t"], labels["P_t"], z_label,
Beispiel #9
0
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""

import sys
import numpy as np
from pyofss import Domain, System, Sech, Fibre
from pyofss.domain import lambda_to_nu
from pyofss.modules.linearity import convert_dispersion_to_physical
from pyofss import map_plot, waterfall_plot, animated_plot, labels

domain = Domain(bit_width=2.0,
                samples_per_bit=8192,
                centre_nu=lambda_to_nu(1550.0))

s = 0.05
width = 1.0 / (s * domain.centre_omega)

tau_R = 0.1
T_R = tau_R * width

D = 16.0
beta_2 = convert_dispersion_to_physical(D)[0]

delta_3 = 0.03
beta_3 = 6.0 * np.abs(beta_2) * width * delta_3

beta = [0.0, 0.0, beta_2, beta_3]
Beispiel #10
0
        self.cl_sum(field, 1.0, field_temp, inv_six)

if __name__ == "__main__":
    # Compare simulations using Fibre and OpenclFibre modules.
    from pyofss import Domain, System, Gaussian, Fibre
    from pyofss import temporal_power, double_plot, labels

    import time

    TS = 4096
    GAMMA = 100.0
    STEPS = 800
    LENGTH = 0.1

    DOMAIN = Domain(bit_width=30.0, samples_per_bit=TS)

    SYS = System(DOMAIN)
    SYS.add(Gaussian("gaussian", peak_power=1.0, width=1.0))
    SYS.add(Fibre("fibre", beta=[0.0, 0.0, 0.0, 1.0], gamma=GAMMA,
                  length=LENGTH, total_steps=STEPS, method="RK4IP"))

    start = time.clock()
    SYS.run()
    stop = time.clock()
    NO_OCL_DURATION = (stop - start) / 1000.0
    NO_OCL_OUT = SYS.fields["fibre"]

    sys = System(DOMAIN)
    sys.add(Gaussian("gaussian", peak_power=1.0, width=1.0))
    sys.add(OpenclFibre(TS, dorf="float", length=LENGTH, total_steps=STEPS))
Beispiel #11
0
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""

import sys
from pyofss import Domain, System, Sech, Fibre
from pyofss import map_plot, waterfall_plot, animated_plot, labels

domain = Domain(bit_width=0.4, samples_per_bit=4096)
s = 0.2
width = 1.0 / (s * domain.centre_omega)
beta_2 = width**2

system = System(domain)
system.add(Sech(peak_power=1.0, width=width))
system.add(
    Fibre(length=4.0,
          beta=[0.0, 0.0, -beta_2],
          gamma=4.0,
          self_steepening=True,
          traces=100,
          method='ARK4IP'))
system.run()
Beispiel #12
0
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""

from pyofss import Domain, System, Gaussian, Fibre
from pyofss import spectral_power, double_plot, labels

system = System(Domain(bit_width=200.0, samples_per_bit=4096, channels=2))
system.add(Gaussian(width=1.0, peak_power=1.0, channel=0))
system.add(Gaussian(width=1.0, peak_power=0.5, channel=1))
system.add(
    Fibre('fibre',
          length=40.0,
          gamma=[1.0, 1.2],
          beta=[[0.0, 0.0, 0.0, 0.0], [0.0, 0.125, 0.0, 0.0]],
          sim_type='wdm',
          total_steps=400,
          method='RK4IP'))
system.run()

A_fs = system.fields['fibre']

P_nu0 = spectral_power(A_fs[0], True)
Beispiel #13
0
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""

from pyofss.domain import nu_to_omega
from pyofss import Domain, System, Gaussian, Fibre
from pyofss import temporal_power, spectral_power, double_plot, labels

nu_0 = 193.1
nu_1 = 1.2 * nu_0

offset_nu = 0.2 * 193.1

system = System(Domain(bit_width=30.0, samples_per_bit=8192, channels=2))
system.add(Gaussian(width=1.0, peak_power=100.0, channel=0))
system.add(Gaussian(width=1.0, peak_power=1.0, channel=1, offset_nu=offset_nu))
system.add(
    Fibre('fibre',
          length=0.4,
          gamma=[1.0, 1.2],
          beta=[[0.0, 0.0, 1.0, 0.0], [0.0, 10.0, 1.0, 0.0]],
          centre_omega=(nu_to_omega(nu_0), nu_to_omega(nu_1)),
          sim_type='wdm',
          method='ARK4IP'))
system.run()

A_fs = system.fields['fibre']

P_t0 = temporal_power(A_fs[0])
Beispiel #14
0
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""

from pyofss.domain import nu_to_omega
from pyofss import Domain, System, Gaussian, Fibre
from pyofss import temporal_power, double_plot, labels

domain = Domain(bit_width=20.0, samples_per_bit=8192, channels=2)

nu_0 = 193.1
nu_1 = 1.2 * nu_0

offset_nu = 0.2 * 193.1
offset = 2.5 / domain.bit_width

system = System(domain)
system.add(Gaussian(width=1.0, peak_power=1000.0, channel=0))
system.add(Gaussian(width=1.0, peak_power=0.1, channel=1,
                    position=0.5 - offset, offset_nu=offset_nu))
system.add(Fibre('fibre', length=0.2, gamma=[0.1, 0.12],
           beta=[[0.0, 0.0, 1.0, 0.0], [0.0, 10.0, 1.0, 0.0]],
           centre_omega=(nu_to_omega(nu_0), nu_to_omega(nu_1)),
           sim_type='wdm', method='ARK4IP'))
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""

from pyofss import Domain, System, Gaussian
from pyofss import phase, chirp, double_plot, labels

system = System(Domain(bit_width=10.0))
t = system.domain.t
nu = system.domain.nu
window_nu = system.domain.window_nu

system.add(Gaussian(initial_phase=3.0, width=1.0))
system.run()

double_plot(t,
            phase(system.field),
            t,
            chirp(system.field, window_nu),
            labels["t"],
            labels["phi"],
            labels["t"],
            labels["chirp"],