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)
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()
(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)
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()
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()
(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,
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"])
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,
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]
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))
(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()
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)
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])
(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"],