From 6d736da34ab608234f1143203bb3a4d22417db68 Mon Sep 17 00:00:00 2001 From: Ellie Saga Date: Thu, 27 Nov 2025 09:43:25 +0000 Subject: [PATCH 01/14] switched from np factorial to math factorial --- gnlse/dispersion.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gnlse/dispersion.py b/gnlse/dispersion.py index 0e05922..b02c4eb 100644 --- a/gnlse/dispersion.py +++ b/gnlse/dispersion.py @@ -6,6 +6,7 @@ """ import numpy as np +import math from scipy import interpolate from gnlse.common import c @@ -67,7 +68,7 @@ def D(self, V): self.calc_loss() # Taylor series for subsequent derivatives # of constant propagation - B = sum(beta / np.math.factorial(i + 2) * V**(i + 2) + B = sum(beta / math.factorial(i + 2) * V**(i + 2) for i, beta in enumerate(self.betas)) L = 1j * B - self.alpha / 2 return L From 1b15b5928b9a7ccf400b749dae2abe0aabf63542 Mon Sep 17 00:00:00 2001 From: Ellie Saga Date: Thu, 27 Nov 2025 09:46:10 +0000 Subject: [PATCH 02/14] updated deprecated interp2d function to RectBivariateSpline --- gnlse/visualization.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gnlse/visualization.py b/gnlse/visualization.py index 56f3784..a150922 100644 --- a/gnlse/visualization.py +++ b/gnlse/visualization.py @@ -5,7 +5,7 @@ import numpy as np import matplotlib.pyplot as plt -from scipy.interpolate import interp2d +from scipy.interpolate import RectBivariateSpline from gnlse.common import c @@ -582,9 +582,9 @@ def plot_wavelength_vs_distance(solver, WL_range=None, ax=None, WL_asc = WL_asc[iis] IW = IW[:, iis] - interpolator = interp2d(WL_asc, solver.Z, IW) + interpolator = RectBivariateSpline(WL_asc, solver.Z, IW.T) newWL = np.linspace(np.min(WL_asc), np.max(WL_asc), IW.shape[1]) - toshow = interpolator(newWL, solver.Z) + toshow = interpolator(newWL, solver.Z).T ax.imshow(toshow, origin='lower', aspect='auto', cmap=cmap, extent=[np.min(WL_asc), np.max(WL_asc), 0, np.max(solver.Z)], @@ -637,9 +637,9 @@ def plot_wavelength_vs_distance_logarithmic(solver, WL_range=None, WL_asc = WL_asc[iis] lIW = lIW[:, iis] - interpolator = interp2d(WL_asc, solver.Z, lIW) + interpolator = RectBivariateSpline(WL_asc, solver.Z, lIW.T) newWL = np.linspace(np.min(WL_asc), np.max(WL_asc), lIW.shape[1]) - toshow = interpolator(newWL, solver.Z) + toshow = interpolator(newWL, solver.Z).T ax.imshow(toshow, origin='lower', aspect='auto', cmap=cmap, extent=[np.min(WL_asc), np.max(WL_asc), 0, np.max(solver.Z)], From aea1089cc6750e4ba38b70ea2b8af82cd52d803c Mon Sep 17 00:00:00 2001 From: Ellie Saga Date: Tue, 2 Dec 2025 15:04:27 +0000 Subject: [PATCH 03/14] Preparing to implement gain function into dispersion operator --- gnlse/dispersion.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/gnlse/dispersion.py b/gnlse/dispersion.py index b02c4eb..befc433 100644 --- a/gnlse/dispersion.py +++ b/gnlse/dispersion.py @@ -73,6 +73,50 @@ def D(self, V): L = 1j * B - self.alpha / 2 return L +class DispersionFiberFromTaylorWithGain(Dispersion): + #under development - not yet functional + """Calculates the dispersion in frequency domain with the gain operator + + Attributes + ---------- + loss : float + Loss factor [dB/m] + betas : ndarray (N) + Derivatives of constant propagations at pump wavelength + [ps^2/m, ..., ps^n/m] + """ + + def __init__(self, loss, betas,fiber_area,dopant_concentration,emission_cross_section,absorption_cross_section,pump_power=None,overlap_pump=1,overlap_signal=1): + self.loss = loss + self.betas = betas + + #active fiber parameters + self.fiber_area = fiber_area + self.dopant_concentration = dopant_concentration # if None, fiber is passive, otherwise model gain + self.pump_power = pump_power #assumed to be constant for now + self.emission_cross_section = emission_cross_section #need to insert the array for the wavelength dependent cross section here + self.absorption_cross_section = absorption_cross_section + self.overlap_pump = overlap_pump + self.overlap_signal = overlap_signal + + def N2(self,V): + Ip = self.pump_power/self.fiber_area + Is = np.mean(V**2) #basic model - intensity of signal is the average across the whole pulse + + + + def D(self, V): + # Damping + self.calc_loss() + # Taylor series for subsequent derivatives + # of constant propagation + B = sum(beta / math.factorial(i + 2) * V**(i + 2) + for i, beta in enumerate(self.betas)) + #calculate N2 + #N2 = getN2(amplifierParams,) use average power of the pulse? + #compute value of gain function + L = 1j * B - self.alpha / 2 + return L class DispersionFiberFromInterpolation(Dispersion): """Calculates the propagation function in frequency domain, using From 317ccafdb99a03b4dbabb4da9320f3c2873d264f Mon Sep 17 00:00:00 2001 From: Ellie Saga Date: Wed, 3 Dec 2025 11:22:24 +0000 Subject: [PATCH 04/14] Added cross section data to .gitignore --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 44fb617..de34bae 100644 --- a/.gitignore +++ b/.gitignore @@ -131,4 +131,6 @@ dmypy.json # Built Sphinx documentation docs/_build/ - +# cross section data +data/emissionCS.csv +data/absorptionCS.csv From df1c1b6a0cb1b225cbec0266774bf1f409d03bd0 Mon Sep 17 00:00:00 2001 From: Ellie Saga Date: Wed, 3 Dec 2025 12:31:58 +0000 Subject: [PATCH 05/14] Created function calculating population inversion --- gnlse/dispersion.py | 45 +++++++++++++++++++++----- gnlse/gnlse.py | 9 +++++- gnlse/population_inversion.py | 60 +++++++++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+), 9 deletions(-) create mode 100644 gnlse/population_inversion.py diff --git a/gnlse/dispersion.py b/gnlse/dispersion.py index befc433..8452514 100644 --- a/gnlse/dispersion.py +++ b/gnlse/dispersion.py @@ -7,10 +7,11 @@ """ import numpy as np import math +import pandas as pd from scipy import interpolate from gnlse.common import c - +from gnlse.common import hplanck class Dispersion(object): """ @@ -75,6 +76,7 @@ def D(self, V): class DispersionFiberFromTaylorWithGain(Dispersion): #under development - not yet functional + #basic version - gain is applied equally at all points - no time dependence on measuring gain as intensities are averaged for now """Calculates the dispersion in frequency domain with the gain operator Attributes @@ -86,23 +88,50 @@ class DispersionFiberFromTaylorWithGain(Dispersion): [ps^2/m, ..., ps^n/m] """ - def __init__(self, loss, betas,fiber_area,dopant_concentration,emission_cross_section,absorption_cross_section,pump_power=None,overlap_pump=1,overlap_signal=1): + def __init__(self, loss, betas,fiber_area,dopant_concentration,emission,absorption,lifetime,pump_power=None,overlap_pump=1,overlap_signal=1): self.loss = loss self.betas = betas #active fiber parameters self.fiber_area = fiber_area - self.dopant_concentration = dopant_concentration # if None, fiber is passive, otherwise model gain + self.dopant_concentration = dopant_concentration # if None, fiber is passive, otherwise model gain, this is the concentration per unit volume * dz, so N_total = dopant_concentration * fiber_area + self.lifetime =lifetime self.pump_power = pump_power #assumed to be constant for now - self.emission_cross_section = emission_cross_section #need to insert the array for the wavelength dependent cross section here - self.absorption_cross_section = absorption_cross_section + self.AW = None + self.v = None + self.emission = emission #emission and absorption contain pandas dataframes with wavelength in nm and cross sections in m^2 + self.absorption = absorption self.overlap_pump = overlap_pump self.overlap_signal = overlap_signal - def N2(self,V): + def N2(self): + if self.AW == None: + raise TypeError("Amplitude spectrum was not defined, cannot compute population inversion. D.AW must not be None.") Ip = self.pump_power/self.fiber_area - Is = np.mean(V**2) #basic model - intensity of signal is the average across the whole pulse - + Is = np.mean(self.AW**2) #basic model - intensity of signal is the average across the whole pulse + #set central frequency as average weighted by intensity + central_frequency = np.average(self.v,weights=self.AW**2) + #get as wavelength in nm + central_wavelength = (c/central_frequency)*1e9 + #now we find the cross section at central_frequency + pump_wavelength = 975 #leaving this constant for Yb amplifier + pump_frequency = c/(pump_wavelength *1e-9) + em_cross_section_signal = self.emission[r"cross section(m^2)"][(np.abs(self.emission["wavelength(nm)"]-central_wavelength)).argmin()] #cross section @ closest wavelength + abs_cross_section_signal = self.absorption[r"cross section(m^2)"][(np.abs(self.absorption["wavelength(nm)"]-central_wavelength)).argmin()] + em_cross_section_pump = self.emission[r"cross section(m^2)"][(np.abs(self.emission["wavelength(nm)"]-pump_wavelength)).argmin()] + abs_cross_section_pump = self.absorption[r"cross section(m^2)"][(np.abs(self.absorption["wavelength(nm)"]-pump_wavelength)).argmin()] + + #Now compute R and W values + R12 = (em_cross_section_pump*Ip)/(hplanck*pump_frequency) + R21 = (abs_cross_section_pump*Ip)/(hplanck*pump_frequency) + W12 = (em_cross_section_signal*Is)/(hplanck*central_frequency) + W21 = (abs_cross_section_signal*Is)/(hplanck*central_frequency) + + #finally compute N2 + numerator = R12 + W12 + denominator = R12 + W12 + R21 + W21 + (1/self.lifetime) + n2 = numerator/denominator + return n2*(self.fiber_area*self.dopant_concentration) #returns the absolute number of excited Yb atoms def D(self, V): diff --git a/gnlse/gnlse.py b/gnlse/gnlse.py index 888064f..11a7b99 100644 --- a/gnlse/gnlse.py +++ b/gnlse/gnlse.py @@ -48,6 +48,7 @@ def __init__(self): self.time_window = None self.wavelength = None self.fiber_length = None + self.active_fiber = False #if fiber is active (True), will use modified gnlse equation self.z_saves = 200 self.nonlinearity = 0 @@ -153,6 +154,7 @@ def __init__(self, setup): self.atol = setup.atol self.method = setup.method self.N = setup.resolution + self.active = setup.active_fiber # Time domain grid self.t = np.linspace(-setup.time_window / 2, @@ -199,6 +201,9 @@ def __init__(self, setup): # Dispersion operator if setup.dispersion_model: self.D = setup.dispersion_model.D(self.V) + #if D includes gain, it needs the frequencies + if self.active: + self.D.v = (self.Omega/(2*np.pi)) else: self.D = np.zeros(self.V.shape) @@ -234,7 +239,9 @@ def rhs(z, AW): progress_bar.n = round(z, 3) progress_bar.update(0) - + #at each z, evaluate the gain function and update the D operator if the fiber is active - gain function is in the dispersion operator + if self.active: + self.D.AW = AW x[:] = AW * np.exp(self.D * z) At = plan_forward().copy() IT = np.abs(At)**2 diff --git a/gnlse/population_inversion.py b/gnlse/population_inversion.py new file mode 100644 index 0000000..dbe4778 --- /dev/null +++ b/gnlse/population_inversion.py @@ -0,0 +1,60 @@ +import numpy as np +import matplotlib.pyplot as plt +import pandas as pd +import gnlse + +if __name__ == '__main__': + setup = gnlse.gnlse.GNLSESetup() + + # Numerical parameters + # number of grid time points + setup.resolution = 2**13 + # time window [ps] + setup.time_window = 12.5 + # number of distance points to save + setup.z_saves = 200 + # relative tolerance for ode solver + setup.rtol = 1e-6 + # absoulte tolerance for ode solver + setup.atol = 1e-6 + + # Physical parameters + # Central wavelength [nm] + setup.wavelength = 1030 + # Nonlinear coefficient [1/W/m] + setup.nonlinearity = 0.0 + # Dispersion: derivatives of propagation constant at central wavelength + # n derivatives of betas are in [ps^n/m] + betas = np.array([0]) + # Input pulse: pulse duration [ps] + tFWHM = 0.050 + # for dispersive length calculation + t0 = tFWHM / 2 / np.log(1 + np.sqrt(2)) + + # 3rd order soliton conditions + ########################################################################### + # Dispersive length + LD = t0 ** 2 / np.abs(betas[0]) + # Non-linear length for 3rd order soliton + LNL = LD / (3 ** 2) + # Input pulse: peak power [W] + power = 1 / (LNL * setup.nonlinearity) + # Length of soliton, in which it break dispersive characteristic + Z0 = np.pi * LD / 2 + # Fiber length [m] + setup.fiber_length = .5 + # Type of pulse: hyperbolic secant + setup.pulse_model = gnlse.SechEnvelope(power, 0.050) + # Loss coefficient [dB/m] + loss = 0 + # Type of dyspersion operator: build from Taylor expansion + #Set parameters necessary for gain modelling + gain_medium_radius = 3e-6 + fiber_area = np.pi * (gain_medium_radius**2) + dopant_concentration = (5e25)*(setup.fiber_length/setup.z_saves) + emission = pd.read_csv(r"data\emissionCS.csv") #get absorption and emission cross sections from csv + absorption = pd.read_csv(r"data\absorptionCS.csv") + lifetime = 1e-3 + pump_power = 9 #pump power in watts + + setup.dispersion_model = gnlse.DispersionFiberFromTaylorWithGain(loss,betas,fiber_area,dopant_concentration,emission,absorption,lifetime,pump_power) \ No newline at end of file From 077eed2cd99fff8f50f06c2892da79f2fedf0b35 Mon Sep 17 00:00:00 2001 From: Ellie Saga Date: Wed, 3 Dec 2025 12:37:54 +0000 Subject: [PATCH 06/14] refactored gnlse into gnlse_main to avoid import errors with gnlse.py name conflict --- examples/plot_Raman_response.py | 8 ++--- examples/plot_input_pulse.py | 10 +++--- {gnlse => examples}/population_inversion.py | 8 ++--- examples/test_3rd_order_soliton.py | 16 ++++----- examples/test_Dudley.py | 20 ++++++------ examples/test_dispersion.py | 20 ++++++------ examples/test_gvd.py | 14 ++++---- examples/test_import_export.py | 12 +++---- examples/test_nonlinearity.py | 28 ++++++++-------- examples/test_raman.py | 20 ++++++------ examples/test_spm+gvd.py | 14 ++++---- examples/test_spm.py | 14 ++++---- examples/test_wl_del_freq.py | 36 ++++++++++----------- {gnlse => gnlse_main}/__init__.py | 18 +++++------ {gnlse => gnlse_main}/common.py | 0 {gnlse => gnlse_main}/dispersion.py | 4 +-- {gnlse => gnlse_main}/envelopes.py | 0 {gnlse => gnlse_main}/gnlse.py | 4 +-- {gnlse => gnlse_main}/import_export.py | 0 {gnlse => gnlse_main}/nonlinearity.py | 2 +- {gnlse => gnlse_main}/raman_response.py | 0 {gnlse => gnlse_main}/visualization.py | 2 +- 22 files changed, 125 insertions(+), 125 deletions(-) rename {gnlse => examples}/population_inversion.py (87%) rename {gnlse => gnlse_main}/__init__.py (72%) rename {gnlse => gnlse_main}/common.py (100%) rename {gnlse => gnlse_main}/dispersion.py (99%) rename {gnlse => gnlse_main}/envelopes.py (100%) rename {gnlse => gnlse_main}/gnlse.py (99%) rename {gnlse => gnlse_main}/import_export.py (100%) rename {gnlse => gnlse_main}/nonlinearity.py (99%) rename {gnlse => gnlse_main}/raman_response.py (100%) rename {gnlse => gnlse_main}/visualization.py (99%) diff --git a/examples/plot_Raman_response.py b/examples/plot_Raman_response.py index b022d3e..17236e7 100644 --- a/examples/plot_Raman_response.py +++ b/examples/plot_Raman_response.py @@ -6,7 +6,7 @@ import numpy as np import matplotlib.pyplot as plt -import gnlse +import gnlse_main if __name__ == '__main__': @@ -26,13 +26,13 @@ T = np.linspace(-time_window / 2, time_window / 2, n) # K. J. Blow and D. Wood Raman response - fr, RT1 = gnlse.raman_blowwood(T) + fr, RT1 = gnlse_main.raman_blowwood(T) RT1 = RT1 / np.max(RT1) # Q. Lin and Govind P. Agrawal Raman response - fr2, RT2 = gnlse.raman_linagrawal(T) + fr2, RT2 = gnlse_main.raman_linagrawal(T) RT2 = RT2 / np.max(RT2) # D. Hollenbeck and C. D. Cantrell Raman response - fr3, RT3 = gnlse.raman_holltrell(T) + fr3, RT3 = gnlse_main.raman_holltrell(T) RT3 = RT3 / np.max(RT3) plt.plot(T, RT1, label="Blow-Wood") diff --git a/examples/plot_input_pulse.py b/examples/plot_input_pulse.py index a56f0a8..e903dd8 100644 --- a/examples/plot_input_pulse.py +++ b/examples/plot_input_pulse.py @@ -8,7 +8,7 @@ import numpy as np import matplotlib.pyplot as plt -import gnlse +import gnlse_main if __name__ == '__main__': # time full with half maximum of pulse @@ -19,13 +19,13 @@ Pmax = 100 # Amplitude envelope of gaussina pulse - A1 = gnlse.GaussianEnvelope(Pmax, FWHM).A(T) + A1 = gnlse_main.GaussianEnvelope(Pmax, FWHM).A(T) # Amplitude envelope of hiperbolic secans pulse - A2 = gnlse.SechEnvelope(Pmax, FWHM).A(T) + A2 = gnlse_main.SechEnvelope(Pmax, FWHM).A(T) # Amplitude envelope of lorentzian pulse - A3 = gnlse.LorentzianEnvelope(Pmax, FWHM).A(T) + A3 = gnlse_main.LorentzianEnvelope(Pmax, FWHM).A(T) # Amplitude envelope of continious wave - A4 = gnlse.CWEnvelope(Pmax).A(T) + A4 = gnlse_main.CWEnvelope(Pmax).A(T) plt.figure(figsize=(12, 8)) plt.subplot(1, 2, 1) diff --git a/gnlse/population_inversion.py b/examples/population_inversion.py similarity index 87% rename from gnlse/population_inversion.py rename to examples/population_inversion.py index dbe4778..be8950e 100644 --- a/gnlse/population_inversion.py +++ b/examples/population_inversion.py @@ -1,10 +1,10 @@ import numpy as np import matplotlib.pyplot as plt import pandas as pd -import gnlse +import gnlse_main if __name__ == '__main__': - setup = gnlse.gnlse.GNLSESetup() + setup = gnlse_main.gnlse.GNLSESetup() # Numerical parameters # number of grid time points @@ -44,7 +44,7 @@ # Fiber length [m] setup.fiber_length = .5 # Type of pulse: hyperbolic secant - setup.pulse_model = gnlse.SechEnvelope(power, 0.050) + setup.pulse_model = gnlse_main.SechEnvelope(power, 0.050) # Loss coefficient [dB/m] loss = 0 # Type of dyspersion operator: build from Taylor expansion @@ -57,4 +57,4 @@ lifetime = 1e-3 pump_power = 9 #pump power in watts - setup.dispersion_model = gnlse.DispersionFiberFromTaylorWithGain(loss,betas,fiber_area,dopant_concentration,emission,absorption,lifetime,pump_power) \ No newline at end of file + setup.dispersion_model = gnlse_main.DispersionFiberFromTaylorWithGain(loss,betas,fiber_area,dopant_concentration,emission,absorption,lifetime,pump_power) \ No newline at end of file diff --git a/examples/test_3rd_order_soliton.py b/examples/test_3rd_order_soliton.py index 4a43016..e1fb524 100644 --- a/examples/test_3rd_order_soliton.py +++ b/examples/test_3rd_order_soliton.py @@ -9,10 +9,10 @@ import numpy as np import matplotlib.pyplot as plt -import gnlse +import gnlse_main if __name__ == '__main__': - setup = gnlse.gnlse.GNLSESetup() + setup = gnlse_main.gnlse.GNLSESetup() # Numerical parameters # number of grid time points @@ -52,18 +52,18 @@ # Fiber length [m] setup.fiber_length = .5 # Type of pulse: hyperbolic secant - setup.pulse_model = gnlse.SechEnvelope(power, 0.050) + setup.pulse_model = gnlse_main.SechEnvelope(power, 0.050) # Loss coefficient [dB/m] loss = 0 # Type of dyspersion operator: build from Taylor expansion - setup.dispersion_model = gnlse.DispersionFiberFromTaylor(loss, betas) + setup.dispersion_model = gnlse_main.DispersionFiberFromTaylor(loss, betas) # Set type of Ramman scattering function and selftepening simulation_type = { '3rd order soliton': (False, None), '3rd order soliton\nwith self-steepening': (True, None), 'Raman induced fission\nof 3rd order soliton': (True, - gnlse.raman_blowwood) + gnlse_main.raman_blowwood) } count = len(simulation_type) @@ -73,15 +73,15 @@ raman_model))) in enumerate(simulation_type.items()): setup.raman_model = raman_model setup.self_steepening = self_steepening - solver = gnlse.GNLSE(setup) + solver = gnlse_main.GNLSE(setup) solution = solver.run() plt.subplot(2, count, i + 1) plt.title(name) - gnlse.plot_wavelength_vs_distance(solution, WL_range=[400, 1400]) + gnlse_main.plot_wavelength_vs_distance(solution, WL_range=[400, 1400]) plt.subplot(2, count, i + 1 + count) - gnlse.plot_delay_vs_distance(solution, time_range=[-.25, .25]) + gnlse_main.plot_delay_vs_distance(solution, time_range=[-.25, .25]) plt.tight_layout() plt.show() diff --git a/examples/test_Dudley.py b/examples/test_Dudley.py index fef21bc..6741255 100644 --- a/examples/test_Dudley.py +++ b/examples/test_Dudley.py @@ -12,11 +12,11 @@ import numpy as np import matplotlib.pyplot as plt -import gnlse +import gnlse_main if __name__ == '__main__': - setup = gnlse.GNLSESetup() + setup = gnlse_main.GNLSESetup() # Numerical parameters setup.resolution = 2**14 @@ -27,7 +27,7 @@ setup.wavelength = 835 # nm setup.fiber_length = 0.15 # m setup.nonlinearity = 0.11 # 1/W/m - setup.raman_model = gnlse.raman_blowwood + setup.raman_model = gnlse_main.raman_blowwood setup.self_steepening = True # The dispersion model is built from a Taylor expansion with coefficients @@ -37,7 +37,7 @@ -11.830e-3, 8.1038e-5, -9.5205e-8, 2.0737e-10, -5.3943e-13, 1.3486e-15, -2.5495e-18, 3.0524e-21, -1.7140e-24 ]) - setup.dispersion_model = gnlse.DispersionFiberFromTaylor(loss, betas) + setup.dispersion_model = gnlse_main.DispersionFiberFromTaylor(loss, betas) # Input pulse parameters peak_power = 10000 # W @@ -45,9 +45,9 @@ # This example extends the original code with additional simulations for pulse_models = [ - gnlse.SechEnvelope(peak_power, duration), - gnlse.GaussianEnvelope(peak_power, duration), - gnlse.LorentzianEnvelope(peak_power, duration) + gnlse_main.SechEnvelope(peak_power, duration), + gnlse_main.GaussianEnvelope(peak_power, duration), + gnlse_main.LorentzianEnvelope(peak_power, duration) ] count = len(pulse_models) @@ -56,15 +56,15 @@ print('%s...' % pulse_model.name) setup.pulse_model = pulse_model - solver = gnlse.GNLSE(setup) + solver = gnlse_main.GNLSE(setup) solution = solver.run() plt.subplot(2, count, i + 1) plt.title(pulse_model.name) - gnlse.plot_wavelength_vs_distance(solution, WL_range=[400, 1400]) + gnlse_main.plot_wavelength_vs_distance(solution, WL_range=[400, 1400]) plt.subplot(2, count, i + 1 + count) - gnlse.plot_delay_vs_distance(solution, time_range=[-0.5, 5]) + gnlse_main.plot_delay_vs_distance(solution, time_range=[-0.5, 5]) plt.tight_layout() plt.show() diff --git a/examples/test_dispersion.py b/examples/test_dispersion.py index 8a67c09..8b41207 100644 --- a/examples/test_dispersion.py +++ b/examples/test_dispersion.py @@ -13,12 +13,12 @@ import numpy as np import matplotlib.pyplot as plt -import gnlse +import gnlse_main import os if __name__ == '__main__': - setup = gnlse.GNLSESetup() + setup = gnlse_main.GNLSESetup() # Numerical parameters setup.resolution = 2**14 @@ -29,7 +29,7 @@ setup.wavelength = 835 # nm setup.fiber_length = 0.15 # m setup.nonlinearity = 0.0 # 1/W/m - setup.raman_model = gnlse.raman_blowwood + setup.raman_model = gnlse_main.raman_blowwood setup.self_steepening = True # The dispersion model is built from a Taylor expansion with coefficients @@ -43,13 +43,13 @@ # pulse duration [ps] tfwhm = 0.05 # hyperbolic secant - setup.pulse_model = gnlse.SechEnvelope(power, tfwhm) + setup.pulse_model = gnlse_main.SechEnvelope(power, tfwhm) # Type of dyspersion operator: build from interpolation of given neffs # read mat file for neffs mat_path = os.path.join(os.path.dirname(__file__), '..', 'data', 'neff_pcf.mat') - mat = gnlse.read_mat(mat_path) + mat = gnlse_main.read_mat(mat_path) # neffs neff = mat['neff'][:, 1] # wavelengths in nm @@ -60,9 +60,9 @@ # Set type of dispersion function simulation_type = { - 'Results for Taylor expansion': gnlse.DispersionFiberFromTaylor( + 'Results for Taylor expansion': gnlse_main.DispersionFiberFromTaylor( loss, betas), - 'Results for interpolation': gnlse.DispersionFiberFromInterpolation( + 'Results for interpolation': gnlse_main.DispersionFiberFromInterpolation( loss, neff, lambdas, setup.wavelength) } @@ -70,15 +70,15 @@ plt.figure(figsize=(15, 7), facecolor='w', edgecolor='k') for (i, (name, dispersion_model)) in enumerate(simulation_type.items()): setup.dispersion_model = dispersion_model - solver = gnlse.GNLSE(setup) + solver = gnlse_main.GNLSE(setup) solution = solver.run() plt.subplot(2, count, i + 1) plt.title(name) - gnlse.plot_wavelength_vs_distance(solution, WL_range=[400, 1400]) + gnlse_main.plot_wavelength_vs_distance(solution, WL_range=[400, 1400]) plt.subplot(2, count, i + 1 + count) - gnlse.plot_delay_vs_distance(solution, time_range=[-.5, 5]) + gnlse_main.plot_delay_vs_distance(solution, time_range=[-.5, 5]) plt.tight_layout() plt.show() diff --git a/examples/test_gvd.py b/examples/test_gvd.py index 822b90e..679c1b3 100644 --- a/examples/test_gvd.py +++ b/examples/test_gvd.py @@ -8,12 +8,12 @@ """ import numpy as np -import gnlse +import gnlse_main import matplotlib.pyplot as plt if __name__ == '__main__': - setup = gnlse.gnlse.GNLSESetup() + setup = gnlse_main.gnlse.GNLSESetup() # Numerical parameters ########################################################################### @@ -49,11 +49,11 @@ # Fiber length [m] setup.fiber_length = 4 * LD # Type of pulse: gaussian - setup.pulse_model = gnlse.GaussianEnvelope(power, tFWHM) + setup.pulse_model = gnlse_main.GaussianEnvelope(power, tFWHM) # Loss coefficient [dB/m] loss = 0 # Type of dyspersion operator: build from Taylor expansion - setup.dispersion_model = gnlse.DispersionFiberFromTaylor(loss, betas) + setup.dispersion_model = gnlse_main.DispersionFiberFromTaylor(loss, betas) # Type of Ramman scattering function: None (default) # Selftepening: not accounted @@ -61,15 +61,15 @@ # Simulation ########################################################################### - solver = gnlse.gnlse.GNLSE(setup) + solver = gnlse_main.gnlse.GNLSE(setup) solution = solver.run() # Visualization ########################################################################### plt.subplot(1, 2, 1) - gnlse.plot_wavelength_vs_distance(solution, WL_range=[780, 900]) + gnlse_main.plot_wavelength_vs_distance(solution, WL_range=[780, 900]) plt.subplot(1, 2, 2) - gnlse.plot_delay_vs_distance(solution, time_range=[-.5, .5]) + gnlse_main.plot_delay_vs_distance(solution, time_range=[-.5, .5]) plt.show() diff --git a/examples/test_import_export.py b/examples/test_import_export.py index 66aec4a..07c5464 100644 --- a/examples/test_import_export.py +++ b/examples/test_import_export.py @@ -3,26 +3,26 @@ """ import os -import gnlse +import gnlse_main if __name__ == '__main__': - setup = gnlse.GNLSESetup() + setup = gnlse_main.GNLSESetup() setup.resolution = 2**13 setup.time_window = 12.5 # ps setup.z_saves = 200 setup.fiber_length = 0.15 # m setup.wavelength = 835 # nm - setup.pulse_model = gnlse.GaussianEnvelope(1, 0.1) + setup.pulse_model = gnlse_main.GaussianEnvelope(1, 0.1) - solver = gnlse.GNLSE(setup) + solver = gnlse_main.GNLSE(setup) solution = solver.run() path = 'test.mat' solution.to_file(path) - solution = gnlse.Solution() + solution = gnlse_main.Solution() solution.from_file(path) - gnlse.quick_plot(solution) + gnlse_main.quick_plot(solution) os.remove(path) diff --git a/examples/test_nonlinearity.py b/examples/test_nonlinearity.py index 8319615..29bf5ea 100644 --- a/examples/test_nonlinearity.py +++ b/examples/test_nonlinearity.py @@ -20,10 +20,10 @@ import numpy as np import os -import gnlse +import gnlse_main if __name__ == '__main__': - setup = gnlse.GNLSESetup() + setup = gnlse_main.GNLSESetup() # Numerical parameters setup.resolution = 2**14 @@ -32,9 +32,9 @@ # Physical parameters setup.wavelength = 835 # nm - w0 = (2.0 * np.pi * gnlse.common.c) / setup.wavelength # 1/ps = THz + w0 = (2.0 * np.pi * gnlse_main.common.c) / setup.wavelength # 1/ps = THz setup.fiber_length = 0.15 # m - setup.raman_model = gnlse.raman_blowwood + setup.raman_model = gnlse_main.raman_blowwood setup.self_steepening = True # Input pulse parameters @@ -42,23 +42,23 @@ # pulse duration [ps] tfwhm = 0.05 # hyperbolic secant - setup.pulse_model = gnlse.SechEnvelope(power, tfwhm) + setup.pulse_model = gnlse_main.SechEnvelope(power, tfwhm) # The dispersion model is built from a Taylor expansion with coefficients # given below. loss = 0 betas = np.array([-0.024948815481502, 8.875391917212998e-05, -9.247462376518329e-08, 1.508210856829677e-10]) - setup.dispersion_model = gnlse.DispersionFiberFromTaylor(loss, betas) + setup.dispersion_model = gnlse_main.DispersionFiberFromTaylor(loss, betas) # parameters for calculating the nonlinearity n2 = 2.7e-20 # m^2/W Aeff0 = 1.78e-12 # 1/m^2 - gamma = n2 * w0 / gnlse.common.c / 1e-9 / Aeff0 # 1/W/m + gamma = n2 * w0 / gnlse_main.common.c / 1e-9 / Aeff0 # 1/W/m # read mat file for neffs to cover interpolation example mat_path = os.path.join(os.path.dirname(__file__), '..', 'data', 'neff_pcf.mat') - mat = gnlse.read_mat(mat_path) + mat = gnlse_main.read_mat(mat_path) # neffs neff = mat['neff'][:, 1] @@ -70,11 +70,11 @@ # This example extends the original code with additional simulations for nonlinearity_setups = [ ["Scalar $\\gamma$", - gnlse.DispersionFiberFromTaylor(loss, betas), + gnlse_main.DispersionFiberFromTaylor(loss, betas), gamma], ["Frequency dependent $\\gamma$", - gnlse.DispersionFiberFromTaylor(loss, betas), - gnlse.NonlinearityFromEffectiveArea( + gnlse_main.DispersionFiberFromTaylor(loss, betas), + gnlse_main.NonlinearityFromEffectiveArea( neff, Aeff, lambdas, setup.wavelength, n2=n2, neff_max=10)] ] @@ -84,14 +84,14 @@ for i, model in enumerate(nonlinearity_setups): setup.dispersion = model[1] setup.nonlinearity = model[2] - solver = gnlse.GNLSE(setup) + solver = gnlse_main.GNLSE(setup) solution = solver.run() plt.subplot(2, count, i + 1) plt.title(model[0]) - gnlse.plot_wavelength_vs_distance(solution, WL_range=[700, 1000]) + gnlse_main.plot_wavelength_vs_distance(solution, WL_range=[700, 1000]) plt.subplot(2, count, i + 1 + count) - gnlse.plot_delay_vs_distance(solution, time_range=[-.5, .5]) + gnlse_main.plot_delay_vs_distance(solution, time_range=[-.5, .5]) plt.tight_layout() plt.show() diff --git a/examples/test_raman.py b/examples/test_raman.py index 29a17d0..4e3817a 100644 --- a/examples/test_raman.py +++ b/examples/test_raman.py @@ -10,11 +10,11 @@ import numpy as np import matplotlib.pyplot as plt -import gnlse +import gnlse_main if __name__ == '__main__': - setup = gnlse.GNLSESetup() + setup = gnlse_main.GNLSESetup() # Numerical parameters setup.resolution = 2**14 @@ -29,7 +29,7 @@ setup.wavelength = 835 # nm setup.fiber_length = 0.15 # m setup.nonlinearity = 0.11 # 1/W/m - setup.pulse_model = gnlse.SechEnvelope(peak_power, duration) + setup.pulse_model = gnlse_main.SechEnvelope(peak_power, duration) setup.self_steepening = True # The dispersion model is built from a Taylor expansion with coefficients @@ -39,14 +39,14 @@ -11.830e-3, 8.1038e-5, -9.5205e-8, 2.0737e-10, -5.3943e-13, 1.3486e-15, -2.5495e-18, 3.0524e-21, -1.7140e-24 ]) - setup.dispersion_model = gnlse.DispersionFiberFromTaylor(loss, betas) + setup.dispersion_model = gnlse_main.DispersionFiberFromTaylor(loss, betas) # This example extends the original code with additional simulations for # three types of models of Raman response and no raman scattering case raman_models = { - 'Blow-Wood': gnlse.raman_blowwood, - 'Hollenbeck-Cantrell': gnlse.raman_holltrell, - 'Lin-Agrawal': gnlse.raman_linagrawal, + 'Blow-Wood': gnlse_main.raman_blowwood, + 'Hollenbeck-Cantrell': gnlse_main.raman_holltrell, + 'Lin-Agrawal': gnlse_main.raman_linagrawal, 'No scattering': None } @@ -54,14 +54,14 @@ plt.figure(figsize=(20, 10), facecolor='w', edgecolor='k') for (i, (name, raman_model)) in enumerate(raman_models.items()): setup.raman_model = raman_model - solver = gnlse.GNLSE(setup) + solver = gnlse_main.GNLSE(setup) solution = solver.run() plt.subplot(2, count, i + 1) plt.title(name) - gnlse.plot_wavelength_vs_distance(solution, WL_range=[500, 1250]) + gnlse_main.plot_wavelength_vs_distance(solution, WL_range=[500, 1250]) plt.subplot(2, count, i + 1 + count) - gnlse.plot_delay_vs_distance(solution, time_range=[-0.5, 4]) + gnlse_main.plot_delay_vs_distance(solution, time_range=[-0.5, 4]) plt.tight_layout() plt.show() diff --git a/examples/test_spm+gvd.py b/examples/test_spm+gvd.py index 689bea7..005beb9 100644 --- a/examples/test_spm+gvd.py +++ b/examples/test_spm+gvd.py @@ -8,12 +8,12 @@ """ import numpy as np -import gnlse +import gnlse_main import matplotlib.pyplot as plt if __name__ == '__main__': - setup = gnlse.gnlse.GNLSESetup() + setup = gnlse_main.gnlse.GNLSESetup() # Numerical parameters ########################################################################### @@ -52,11 +52,11 @@ # Fiber length [m] setup.fiber_length = 10 * LD # Type of pulse: gaussian - setup.pulse_model = gnlse.GaussianEnvelope(power, tFWHM) + setup.pulse_model = gnlse_main.GaussianEnvelope(power, tFWHM) # Loss coefficient [dB/m] loss = 0 # Type of dyspersion operator: build from Taylor expansion - setup.dispersion_model = gnlse.DispersionFiberFromTaylor(loss, betas) + setup.dispersion_model = gnlse_main.DispersionFiberFromTaylor(loss, betas) # Type of Ramman scattering function: None (default) # Selftepening: not accounted @@ -64,7 +64,7 @@ # Simulation ########################################################################### - solver = gnlse.gnlse.GNLSE(setup) + solver = gnlse_main.gnlse.GNLSE(setup) solution = solver.run() # Visualization @@ -72,8 +72,8 @@ plt.figure(figsize=(15, 7)) plt.subplot(1, 2, 1) - gnlse.plot_wavelength_vs_distance(solution, WL_range=[780, 900]) + gnlse_main.plot_wavelength_vs_distance(solution, WL_range=[780, 900]) plt.subplot(1, 2, 2) - gnlse.plot_delay_vs_distance(solution, time_range=[-.5, .5]) + gnlse_main.plot_delay_vs_distance(solution, time_range=[-.5, .5]) plt.show() diff --git a/examples/test_spm.py b/examples/test_spm.py index 24e7ac4..d76d21f 100644 --- a/examples/test_spm.py +++ b/examples/test_spm.py @@ -8,12 +8,12 @@ """ import numpy as np -import gnlse +import gnlse_main import matplotlib.pyplot as plt if __name__ == '__main__': - setup = gnlse.gnlse.GNLSESetup() + setup = gnlse_main.gnlse.GNLSESetup() # Numerical parameters ########################################################################### @@ -48,11 +48,11 @@ # Fiber length [m] setup.fiber_length = 3.5 * np.pi * LNL # Type of pulse: gaussian - setup.pulse_model = gnlse.GaussianEnvelope(power, tFWHM) + setup.pulse_model = gnlse_main.GaussianEnvelope(power, tFWHM) # Loss coefficient [dB/m] loss = 0 # Type of dyspersion operator: build from Taylor expansion - setup.dispersion_model = gnlse.DispersionFiberFromTaylor(loss, betas) + setup.dispersion_model = gnlse_main.DispersionFiberFromTaylor(loss, betas) # Type of Ramman scattering function: None (default) # Selftepening: not accounted @@ -60,14 +60,14 @@ # Simulation ########################################################################### - solver = gnlse.gnlse.GNLSE(setup) + solver = gnlse_main.gnlse.GNLSE(setup) solution = solver.run() # Visualization ########################################################################### plt.subplot(1, 2, 1) - gnlse.plot_wavelength_vs_distance(solution, WL_range=[400, 1400]) + gnlse_main.plot_wavelength_vs_distance(solution, WL_range=[400, 1400]) plt.subplot(1, 2, 2) - gnlse.plot_delay_vs_distance(solution, time_range=[-.25, .25]) + gnlse_main.plot_delay_vs_distance(solution, time_range=[-.25, .25]) plt.show() diff --git a/examples/test_wl_del_freq.py b/examples/test_wl_del_freq.py index 0839a04..f8ef839 100644 --- a/examples/test_wl_del_freq.py +++ b/examples/test_wl_del_freq.py @@ -12,10 +12,10 @@ import numpy as np import matplotlib.pyplot as plt -import gnlse +import gnlse_main if __name__ == '__main__': - setup = gnlse.GNLSESetup() + setup = gnlse_main.GNLSESetup() # Numerical parameters setup.resolution = 2**14 @@ -26,7 +26,7 @@ setup.wavelength = 835 # nm setup.fiber_length = 0.15 # m setup.nonlinearity = 0.11 # 1/W/m - setup.raman_model = gnlse.raman_blowwood + setup.raman_model = gnlse_main.raman_blowwood setup.self_steepening = True # The dispersion model is built from a Taylor expansion with coefficients @@ -36,62 +36,62 @@ -11.830e-3, 8.1038e-5, -9.5205e-8, 2.0737e-10, -5.3943e-13, 1.3486e-15, -2.5495e-18, 3.0524e-21, -1.7140e-24 ]) - setup.dispersion_model = gnlse.DispersionFiberFromTaylor(loss, betas) + setup.dispersion_model = gnlse_main.DispersionFiberFromTaylor(loss, betas) # Input pulse parameters power = 10000 # pulse duration [ps] tfwhm = 0.05 # hyperbolic secant - setup.pulse_model = gnlse.SechEnvelope(power, tfwhm) - solver = gnlse.GNLSE(setup) + setup.pulse_model = gnlse_main.SechEnvelope(power, tfwhm) + solver = gnlse_main.GNLSE(setup) solution = solver.run() plt.figure(figsize=(14, 8), facecolor='w', edgecolor='k') plt.subplot(4, 3, 1) - gnlse.plot_delay_vs_distance(solution, time_range=[-.5, 5], cmap="jet") + gnlse_main.plot_delay_vs_distance(solution, time_range=[-.5, 5], cmap="jet") plt.subplot(4, 3, 2) - gnlse.plot_frequency_vs_distance(solution, frequency_range=[-300, 200], + gnlse_main.plot_frequency_vs_distance(solution, frequency_range=[-300, 200], cmap="plasma") plt.subplot(4, 3, 3) - gnlse.plot_wavelength_vs_distance(solution, WL_range=[400, 1400]) + gnlse_main.plot_wavelength_vs_distance(solution, WL_range=[400, 1400]) plt.subplot(4, 3, 4) - gnlse.plot_delay_vs_distance_logarithmic(solution, time_range=[-.5, 5], + gnlse_main.plot_delay_vs_distance_logarithmic(solution, time_range=[-.5, 5], cmap="jet") plt.subplot(4, 3, 5) - gnlse.plot_frequency_vs_distance_logarithmic(solution, + gnlse_main.plot_frequency_vs_distance_logarithmic(solution, frequency_range=[-300, 200], cmap="plasma") plt.subplot(4, 3, 6) - gnlse.plot_wavelength_vs_distance_logarithmic(solution, + gnlse_main.plot_wavelength_vs_distance_logarithmic(solution, WL_range=[400, 1400]) plt.subplot(4, 3, 7) - gnlse.plot_delay_for_distance_slice(solution, time_range=[-.5, 5]) + gnlse_main.plot_delay_for_distance_slice(solution, time_range=[-.5, 5]) plt.subplot(4, 3, 8) - gnlse.plot_frequency_for_distance_slice(solution, + gnlse_main.plot_frequency_for_distance_slice(solution, frequency_range=[-300, 200]) plt.subplot(4, 3, 9) - gnlse.plot_wavelength_for_distance_slice(solution, WL_range=[400, 1400]) + gnlse_main.plot_wavelength_for_distance_slice(solution, WL_range=[400, 1400]) plt.subplot(4, 3, 10) - gnlse.plot_delay_for_distance_slice_logarithmic( + gnlse_main.plot_delay_for_distance_slice_logarithmic( solution, time_range=[-.5, 5]) plt.subplot(4, 3, 11) - gnlse.plot_frequency_for_distance_slice_logarithmic( + gnlse_main.plot_frequency_for_distance_slice_logarithmic( solution, frequency_range=[-300, 200]) plt.subplot(4, 3, 12) - gnlse.plot_wavelength_for_distance_slice_logarithmic(solution, + gnlse_main.plot_wavelength_for_distance_slice_logarithmic(solution, WL_range=[400, 1400]) plt.tight_layout() diff --git a/gnlse/__init__.py b/gnlse_main/__init__.py similarity index 72% rename from gnlse/__init__.py rename to gnlse_main/__init__.py index 720c85b..75c3a88 100644 --- a/gnlse/__init__.py +++ b/gnlse_main/__init__.py @@ -1,13 +1,13 @@ -from gnlse.dispersion import (DispersionFiberFromTaylor, - DispersionFiberFromInterpolation) -from gnlse.envelopes import (SechEnvelope, GaussianEnvelope, +from gnlse_main.dispersion import (DispersionFiberFromTaylor, + DispersionFiberFromInterpolation,DispersionFiberFromTaylorWithGain) +from gnlse_main.envelopes import (SechEnvelope, GaussianEnvelope, LorentzianEnvelope, CWEnvelope) -from gnlse.gnlse import GNLSESetup, Solution, GNLSE -from gnlse.import_export import read_mat, write_mat -from gnlse.nonlinearity import NonlinearityFromEffectiveArea -from gnlse.raman_response import (raman_blowwood, raman_holltrell, +from gnlse_main.gnlse import GNLSESetup, Solution, GNLSE +from gnlse_main.import_export import read_mat, write_mat +from gnlse_main.nonlinearity import NonlinearityFromEffectiveArea +from gnlse_main.raman_response import (raman_blowwood, raman_holltrell, raman_linagrawal) -from gnlse.visualization import ( +from gnlse_main.visualization import ( plot_delay_vs_distance, plot_delay_vs_distance_logarithmic, plot_delay_for_distance_slice, @@ -23,7 +23,7 @@ quick_plot) __all__ = [ - 'DispersionFiberFromTaylor', 'DispersionFiberFromInterpolation', + 'DispersionFiberFromTaylor', 'DispersionFiberFromInterpolation','DispersionFiberFromTaylorWithGain' 'SechEnvelope', 'GaussianEnvelope', 'LorentzianEnvelope', 'GNLSESetup', 'GNLSE', 'Solution', 'read_mat', 'write_mat', 'raman_blowwood', 'raman_holltrell', 'raman_linagrawal', diff --git a/gnlse/common.py b/gnlse_main/common.py similarity index 100% rename from gnlse/common.py rename to gnlse_main/common.py diff --git a/gnlse/dispersion.py b/gnlse_main/dispersion.py similarity index 99% rename from gnlse/dispersion.py rename to gnlse_main/dispersion.py index 8452514..9f27bc2 100644 --- a/gnlse/dispersion.py +++ b/gnlse_main/dispersion.py @@ -10,8 +10,8 @@ import pandas as pd from scipy import interpolate -from gnlse.common import c -from gnlse.common import hplanck +from gnlse_main.common import c +from gnlse_main.common import hplanck class Dispersion(object): """ diff --git a/gnlse/envelopes.py b/gnlse_main/envelopes.py similarity index 100% rename from gnlse/envelopes.py rename to gnlse_main/envelopes.py diff --git a/gnlse/gnlse.py b/gnlse_main/gnlse.py similarity index 99% rename from gnlse/gnlse.py rename to gnlse_main/gnlse.py index 11a7b99..f441e3c 100644 --- a/gnlse/gnlse.py +++ b/gnlse_main/gnlse.py @@ -3,8 +3,8 @@ import pyfftw import tqdm -from gnlse.common import c -from gnlse.import_export import write_mat, read_mat +from gnlse_main.common import c +from gnlse_main.import_export import write_mat, read_mat class GNLSESetup: diff --git a/gnlse/import_export.py b/gnlse_main/import_export.py similarity index 100% rename from gnlse/import_export.py rename to gnlse_main/import_export.py diff --git a/gnlse/nonlinearity.py b/gnlse_main/nonlinearity.py similarity index 99% rename from gnlse/nonlinearity.py rename to gnlse_main/nonlinearity.py index 30c6628..be167e5 100644 --- a/gnlse/nonlinearity.py +++ b/gnlse_main/nonlinearity.py @@ -8,7 +8,7 @@ import numpy as np from scipy import interpolate -from gnlse.common import c +from gnlse_main.common import c class Nonlinearity(object): diff --git a/gnlse/raman_response.py b/gnlse_main/raman_response.py similarity index 100% rename from gnlse/raman_response.py rename to gnlse_main/raman_response.py diff --git a/gnlse/visualization.py b/gnlse_main/visualization.py similarity index 99% rename from gnlse/visualization.py rename to gnlse_main/visualization.py index a150922..9f408fd 100644 --- a/gnlse/visualization.py +++ b/gnlse_main/visualization.py @@ -7,7 +7,7 @@ from scipy.interpolate import RectBivariateSpline -from gnlse.common import c +from gnlse_main.common import c def plot_frequency_vs_distance_logarithmic(solver, ax=None, norm=None, From 0c65af4442a2d6bb51295d4be7dbd970b585bf7f Mon Sep 17 00:00:00 2001 From: Ellie Saga Date: Wed, 3 Dec 2025 13:35:21 +0000 Subject: [PATCH 07/14] gnlse updates dispersion model with most amplitude spectrum passed to rhs --- gnlse_main/gnlse.py | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/gnlse_main/gnlse.py b/gnlse_main/gnlse.py index f441e3c..4e3b1c4 100644 --- a/gnlse_main/gnlse.py +++ b/gnlse_main/gnlse.py @@ -198,20 +198,25 @@ def __init__(self, setup): self.RW = self.N * np.fft.ifft( np.fft.fftshift(np.transpose(RT))) + # Input pulse + if hasattr(setup.pulse_model, 'A'): + self.A = setup.pulse_model.A(self.t) + else: + self.A = setup.pulse_model # Dispersion operator + if setup.dispersion_model: - self.D = setup.dispersion_model.D(self.V) + #if D includes gain, it needs the frequencies if self.active: - self.D.v = (self.Omega/(2*np.pi)) - else: - self.D = np.zeros(self.V.shape) + self.dispersion_model = setup.dispersion_model + self.dispersion_model.v = (self.Omega/(2*np.pi)) + self.dispersion_model.AW = np.fft.fft + else: + self.D = setup.dispersion_model.D(self.V) - # Input pulse - if hasattr(setup.pulse_model, 'A'): - self.A = setup.pulse_model.A(self.t) else: - self.A = setup.pulse_model + self.D = np.zeros(self.V.shape) def run(self): """ @@ -241,7 +246,9 @@ def rhs(z, AW): progress_bar.update(0) #at each z, evaluate the gain function and update the D operator if the fiber is active - gain function is in the dispersion operator if self.active: - self.D.AW = AW + self.dispersion_model.AW = AW #if fiber is active, update the amplitude spectrum + self.D = self.dispersion_model.D(self.V) + x[:] = AW * np.exp(self.D * z) At = plan_forward().copy() IT = np.abs(At)**2 From d3c89739753dd914d7d8346b134bdf70f4014693 Mon Sep 17 00:00:00 2001 From: Ellie Saga Date: Wed, 3 Dec 2025 13:35:35 +0000 Subject: [PATCH 08/14] renamed file --- ...inversion.py => test_population_inversion.py} | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) rename examples/{population_inversion.py => test_population_inversion.py} (80%) diff --git a/examples/population_inversion.py b/examples/test_population_inversion.py similarity index 80% rename from examples/population_inversion.py rename to examples/test_population_inversion.py index be8950e..cd3322a 100644 --- a/examples/population_inversion.py +++ b/examples/test_population_inversion.py @@ -25,7 +25,7 @@ setup.nonlinearity = 0.0 # Dispersion: derivatives of propagation constant at central wavelength # n derivatives of betas are in [ps^n/m] - betas = np.array([0]) + betas = np.array([-11.830e-3]) # Input pulse: pulse duration [ps] tFWHM = 0.050 # for dispersive length calculation @@ -33,18 +33,10 @@ # 3rd order soliton conditions ########################################################################### - # Dispersive length - LD = t0 ** 2 / np.abs(betas[0]) - # Non-linear length for 3rd order soliton - LNL = LD / (3 ** 2) - # Input pulse: peak power [W] - power = 1 / (LNL * setup.nonlinearity) - # Length of soliton, in which it break dispersive characteristic - Z0 = np.pi * LD / 2 # Fiber length [m] setup.fiber_length = .5 # Type of pulse: hyperbolic secant - setup.pulse_model = gnlse_main.SechEnvelope(power, 0.050) + setup.pulse_model = gnlse_main.SechEnvelope(1000, 0.050) # Loss coefficient [dB/m] loss = 0 # Type of dyspersion operator: build from Taylor expansion @@ -57,4 +49,6 @@ lifetime = 1e-3 pump_power = 9 #pump power in watts - setup.dispersion_model = gnlse_main.DispersionFiberFromTaylorWithGain(loss,betas,fiber_area,dopant_concentration,emission,absorption,lifetime,pump_power) \ No newline at end of file + setup.dispersion_model = gnlse_main.DispersionFiberFromTaylorWithGain(loss,betas,fiber_area,dopant_concentration,emission,absorption,lifetime,pump_power) + solver = gnlse_main.gnlse.GNLSE(setup) + solver.D.N2() \ No newline at end of file From 11558a07cc212e66c13d8de47973068c25ca989f Mon Sep 17 00:00:00 2001 From: Ellie Saga Date: Wed, 3 Dec 2025 13:40:43 +0000 Subject: [PATCH 09/14] corrected missing parameter --- gnlse_main/gnlse.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gnlse_main/gnlse.py b/gnlse_main/gnlse.py index 4e3b1c4..b1e3813 100644 --- a/gnlse_main/gnlse.py +++ b/gnlse_main/gnlse.py @@ -206,12 +206,11 @@ def __init__(self, setup): # Dispersion operator if setup.dispersion_model: - #if D includes gain, it needs the frequencies if self.active: self.dispersion_model = setup.dispersion_model self.dispersion_model.v = (self.Omega/(2*np.pi)) - self.dispersion_model.AW = np.fft.fft + self.dispersion_model.AW = np.fft.fft(self.A) else: self.D = setup.dispersion_model.D(self.V) From 5c1327b8895b58e15cb211926fd2e67fb48ce28f Mon Sep 17 00:00:00 2001 From: Ellie Saga Date: Wed, 3 Dec 2025 13:43:27 +0000 Subject: [PATCH 10/14] corrected condition checking if AW has been passed --- gnlse_main/dispersion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gnlse_main/dispersion.py b/gnlse_main/dispersion.py index 9f27bc2..1130cf1 100644 --- a/gnlse_main/dispersion.py +++ b/gnlse_main/dispersion.py @@ -105,7 +105,7 @@ def __init__(self, loss, betas,fiber_area,dopant_concentration,emission,absorpti self.overlap_signal = overlap_signal def N2(self): - if self.AW == None: + if type(self.AW) == bool: raise TypeError("Amplitude spectrum was not defined, cannot compute population inversion. D.AW must not be None.") Ip = self.pump_power/self.fiber_area Is = np.mean(self.AW**2) #basic model - intensity of signal is the average across the whole pulse From bf63f0b17822ab5a715489b496c6d030bc559796 Mon Sep 17 00:00:00 2001 From: Ellie Saga Date: Thu, 4 Dec 2025 10:01:58 +0000 Subject: [PATCH 11/14] Corrections testing N2 calculation --- examples/test_population_inversion.py | 4 +++- gnlse_main/dispersion.py | 5 +++-- gnlse_main/gnlse.py | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/examples/test_population_inversion.py b/examples/test_population_inversion.py index cd3322a..dac4fc3 100644 --- a/examples/test_population_inversion.py +++ b/examples/test_population_inversion.py @@ -49,6 +49,8 @@ lifetime = 1e-3 pump_power = 9 #pump power in watts + setup.active_fiber=True setup.dispersion_model = gnlse_main.DispersionFiberFromTaylorWithGain(loss,betas,fiber_area,dopant_concentration,emission,absorption,lifetime,pump_power) solver = gnlse_main.gnlse.GNLSE(setup) - solver.D.N2() \ No newline at end of file + N2 = solver.dispersion_model.N2() + print(N2) \ No newline at end of file diff --git a/gnlse_main/dispersion.py b/gnlse_main/dispersion.py index 1130cf1..0b3eb8f 100644 --- a/gnlse_main/dispersion.py +++ b/gnlse_main/dispersion.py @@ -108,9 +108,10 @@ def N2(self): if type(self.AW) == bool: raise TypeError("Amplitude spectrum was not defined, cannot compute population inversion. D.AW must not be None.") Ip = self.pump_power/self.fiber_area - Is = np.mean(self.AW**2) #basic model - intensity of signal is the average across the whole pulse + Is = np.mean(np.multiply(self.AW,np.conjugate(self.AW))) #basic model - intensity of signal is the average across the whole pulse #set central frequency as average weighted by intensity - central_frequency = np.average(self.v,weights=self.AW**2) + + central_frequency = np.average(self.v,weights=np.multiply(self.AW,np.conjugate(self.AW))) #get as wavelength in nm central_wavelength = (c/central_frequency)*1e9 #now we find the cross section at central_frequency diff --git a/gnlse_main/gnlse.py b/gnlse_main/gnlse.py index b1e3813..824ec58 100644 --- a/gnlse_main/gnlse.py +++ b/gnlse_main/gnlse.py @@ -209,7 +209,7 @@ def __init__(self, setup): #if D includes gain, it needs the frequencies if self.active: self.dispersion_model = setup.dispersion_model - self.dispersion_model.v = (self.Omega/(2*np.pi)) + self.dispersion_model.v = (self.V/(2*np.pi)) #this part is broken - needs fix self.dispersion_model.AW = np.fft.fft(self.A) else: self.D = setup.dispersion_model.D(self.V) From bb75deadba0019530a162ed8356a56c221c92cc5 Mon Sep 17 00:00:00 2001 From: Ellie Saga Date: Thu, 4 Dec 2025 10:37:17 +0000 Subject: [PATCH 12/14] Added vscode settings to .gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index de34bae..34ab5f2 100644 --- a/.gitignore +++ b/.gitignore @@ -84,7 +84,7 @@ ipython_config.py # pyenv .python-version - +.vscode/ # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies From b8c54cf055d8e3095a7c3e35e598132ba99b53b3 Mon Sep 17 00:00:00 2001 From: Ellie Saga Date: Fri, 5 Dec 2025 10:47:37 +0000 Subject: [PATCH 13/14] changed method of calculating average signal power to an integral, passed new required parameters to dispersion model from gnlse --- gnlse_main/dispersion.py | 27 ++++++++++++++++----------- gnlse_main/gnlse.py | 3 ++- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/gnlse_main/dispersion.py b/gnlse_main/dispersion.py index 0b3eb8f..1aa323f 100644 --- a/gnlse_main/dispersion.py +++ b/gnlse_main/dispersion.py @@ -88,7 +88,7 @@ class DispersionFiberFromTaylorWithGain(Dispersion): [ps^2/m, ..., ps^n/m] """ - def __init__(self, loss, betas,fiber_area,dopant_concentration,emission,absorption,lifetime,pump_power=None,overlap_pump=1,overlap_signal=1): + def __init__(self, loss, betas,fiber_area,dopant_concentration,emission,absorption,lifetime,pump_power=None,overlap_pump=1,overlap_signal=1,repetition_rate=1e6): self.loss = loss self.betas = betas @@ -103,30 +103,35 @@ def __init__(self, loss, betas,fiber_area,dopant_concentration,emission,absorpti self.absorption = absorption self.overlap_pump = overlap_pump self.overlap_signal = overlap_signal - + self.repetition_rate = repetition_rate #defaults to 1MHz + self.dt = None def N2(self): if type(self.AW) == bool: raise TypeError("Amplitude spectrum was not defined, cannot compute population inversion. D.AW must not be None.") Ip = self.pump_power/self.fiber_area - Is = np.mean(np.multiply(self.AW,np.conjugate(self.AW))) #basic model - intensity of signal is the average across the whole pulse + Isw = np.square(np.abs(self.AW)) + #first we find the pulse energy - integrate Isw over v + Ist = np.square(np.abs(np.fft.ifft(self.AW))) + pulse_energy = np.trapz(Ist,dx=(self.dt*1e-12)) + Ps = pulse_energy * self.repetition_rate #average signal power + Is = Ps/self.fiber_area #set central frequency as average weighted by intensity - - central_frequency = np.average(self.v,weights=np.multiply(self.AW,np.conjugate(self.AW))) + central_frequency = np.average(self.v,weights=Isw) #get as wavelength in nm - central_wavelength = (c/central_frequency)*1e9 + central_wavelength = (c/central_frequency)*1e12 #now we find the cross section at central_frequency pump_wavelength = 975 #leaving this constant for Yb amplifier - pump_frequency = c/(pump_wavelength *1e-9) + pump_frequency = c/(pump_wavelength *1e-12) em_cross_section_signal = self.emission[r"cross section(m^2)"][(np.abs(self.emission["wavelength(nm)"]-central_wavelength)).argmin()] #cross section @ closest wavelength abs_cross_section_signal = self.absorption[r"cross section(m^2)"][(np.abs(self.absorption["wavelength(nm)"]-central_wavelength)).argmin()] em_cross_section_pump = self.emission[r"cross section(m^2)"][(np.abs(self.emission["wavelength(nm)"]-pump_wavelength)).argmin()] abs_cross_section_pump = self.absorption[r"cross section(m^2)"][(np.abs(self.absorption["wavelength(nm)"]-pump_wavelength)).argmin()] #Now compute R and W values - R12 = (em_cross_section_pump*Ip)/(hplanck*pump_frequency) - R21 = (abs_cross_section_pump*Ip)/(hplanck*pump_frequency) - W12 = (em_cross_section_signal*Is)/(hplanck*central_frequency) - W21 = (abs_cross_section_signal*Is)/(hplanck*central_frequency) + R12 = (abs_cross_section_pump*Ip)/(hplanck*pump_frequency) + R21 = (em_cross_section_pump*Ip)/(hplanck*pump_frequency) + W12 = (abs_cross_section_signal*Is)/(hplanck*central_frequency) + W21 = (em_cross_section_signal*Is)/(hplanck*central_frequency) #finally compute N2 numerator = R12 + W12 diff --git a/gnlse_main/gnlse.py b/gnlse_main/gnlse.py index 824ec58..2a25dd9 100644 --- a/gnlse_main/gnlse.py +++ b/gnlse_main/gnlse.py @@ -209,8 +209,9 @@ def __init__(self, setup): #if D includes gain, it needs the frequencies if self.active: self.dispersion_model = setup.dispersion_model - self.dispersion_model.v = (self.V/(2*np.pi)) #this part is broken - needs fix + self.dispersion_model.v = ((self.Omega * 1e12)/(2*np.pi)) #this part is broken - needs fix self.dispersion_model.AW = np.fft.fft(self.A) + self.dispersion_model.dt = self.t[1] - self.t[0] else: self.D = setup.dispersion_model.D(self.V) From 6960f018cb19dbc79c57b8097c8da585c90075a7 Mon Sep 17 00:00:00 2001 From: Ellie Saga Date: Fri, 5 Dec 2025 10:47:48 +0000 Subject: [PATCH 14/14] changed test values --- examples/test_population_inversion.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/test_population_inversion.py b/examples/test_population_inversion.py index dac4fc3..5b83929 100644 --- a/examples/test_population_inversion.py +++ b/examples/test_population_inversion.py @@ -36,7 +36,7 @@ # Fiber length [m] setup.fiber_length = .5 # Type of pulse: hyperbolic secant - setup.pulse_model = gnlse_main.SechEnvelope(1000, 0.050) + setup.pulse_model = gnlse_main.GaussianEnvelope(331400, 0.050) # Loss coefficient [dB/m] loss = 0 # Type of dyspersion operator: build from Taylor expansion @@ -47,10 +47,12 @@ emission = pd.read_csv(r"data\emissionCS.csv") #get absorption and emission cross sections from csv absorption = pd.read_csv(r"data\absorptionCS.csv") lifetime = 1e-3 + repetition_rate = 1e8 #100MHz pump_power = 9 #pump power in watts + setup.self_steepening = True setup.active_fiber=True - setup.dispersion_model = gnlse_main.DispersionFiberFromTaylorWithGain(loss,betas,fiber_area,dopant_concentration,emission,absorption,lifetime,pump_power) + setup.dispersion_model = gnlse_main.DispersionFiberFromTaylorWithGain(loss,betas,fiber_area,dopant_concentration,emission,absorption,lifetime,pump_power,repetition_rate=repetition_rate) solver = gnlse_main.gnlse.GNLSE(setup) N2 = solver.dispersion_model.N2() print(N2) \ No newline at end of file