diff --git a/src/scgenerator/evaluator.py b/src/scgenerator/evaluator.py index c440efd..9fedaf4 100644 --- a/src/scgenerator/evaluator.py +++ b/src/scgenerator/evaluator.py @@ -559,6 +559,7 @@ envelope_rules = default_rules + [ Rule("c_to_a_factor", pulse.c_to_a_factor), # Dispersion Rule("beta2_coefficients", fiber.auto_dispersion_coefficients), + Rule("beta2_coefficients", fiber.handle_dispersion_paramter), Rule("beta2_arr", fiber.dispersion_from_coefficients), Rule("beta2", lambda beta2_coefficients: beta2_coefficients[0]), Rule("beta2", lambda beta2_arr, w0_ind: beta2_arr[w0_ind]), diff --git a/src/scgenerator/parameter.py b/src/scgenerator/parameter.py index 40fc492..ae86936 100644 --- a/src/scgenerator/parameter.py +++ b/src/scgenerator/parameter.py @@ -325,6 +325,8 @@ class Parameters: he_mode: tuple[int, int] = Parameter(int_pair) fit_parameters: tuple[int, int] = Parameter(float_pair) beta2_coefficients: Iterable[float] = Parameter(num_list) + dispersion_parameter: float = Parameter(type_checker(*number)) + dispersion_slope: float = Parameter(type_checker(*number)) dispersion_file: DataFile = Parameter(DataFile.validate) model: str = Parameter( literal("pcf", "marcatili", "marcatili_adjusted", "hasan", "custom"), diff --git a/src/scgenerator/physics/fiber.py b/src/scgenerator/physics/fiber.py index b560159..6aa3ba6 100644 --- a/src/scgenerator/physics/fiber.py +++ b/src/scgenerator/physics/fiber.py @@ -14,6 +14,7 @@ from scgenerator.physics import units from scgenerator.physics.units import c, pi pipi = 2 * pi +pi2c = 2 * pi * c T = TypeVar("T") @@ -46,14 +47,29 @@ def is_dynamic_dispersion(pressure=None): return out -def beta2_to_D(beta2, l): - """returns the D parameter corresponding to beta2(l)""" - return -(pipi * c) / (l**2) * beta2 +def beta2_to_dispersion_parameter(beta2: float, wavelength: T) -> T: + return -(pipi * c) / (wavelength**2) * beta2 -def D_to_beta2(D, l): - """returns the beta2 parameters corresponding to D(l)""" - return -(l**2) / (pipi * c) * D +def dispersion_parameter_to_beta2(dispersion_parameter: float, wavelength: T) -> T: + return -(wavelength**2) / (pipi * c) * dispersion_parameter + + +def dispersion_slope_to_beta3( + dispersion_parameter: float, dispersion_slope: float, wavelength +) -> float: + return (wavelength**2 / pi2c) ** 2 * ( + dispersion_slope + 2 * dispersion_parameter / wavelength + ) + + +def handle_dispersion_paramter( + wavelength: float, dispersion_parameter: float, dispersion_slope: float | None = None +) -> list[float]: + coeffs = [dispersion_parameter_to_beta2(dispersion_parameter, wavelength)] + if dispersion_slope is not None: + coeffs.append(dispersion_slope_to_beta3(dispersion_parameter, dispersion_slope, wavelength)) + return coeffs def find_zdw(l: np.ndarray, beta2_arr: np.ndarray) -> list[float]: @@ -629,7 +645,7 @@ def load_custom_dispersion( wl_file = units.normalize_wavelengths(wl_file) ind = np.where((l >= wl_file.min()) & (l <= wl_file.max()))[0] - out[ind] = np.interp(l[ind], wl_file, D_to_beta2(D, wl_file)) + out[ind] = np.interp(l[ind], wl_file, dispersion_parameter_to_beta2(D, wl_file)) return out, ind diff --git a/tests/test_parameters.py b/tests/test_parameters.py index 9c10f13..95b6740 100644 --- a/tests/test_parameters.py +++ b/tests/test_parameters.py @@ -1,3 +1,13 @@ import pytest import scgenerator as sc + + +def test_dispersion_logic(): + params = sc.Parameters(wavelength=1550e-9, dispersion_parameter=5e-6) + assert params.compute("beta2_coefficients") == pytest.approx([-6.3772409974749684e-27]) + + params = sc.Parameters(wavelength=1550e-9, dispersion_parameter=5e-6, dispersion_slope=25) + assert params.compute("beta2_coefficients") == pytest.approx( + [-6.3772409974749684e-27, 5.116448086629504e-41] + )