new dispersion_parameter parameter

This commit is contained in:
Benoît Sierro
2023-11-02 15:12:39 +01:00
parent 15e8f30514
commit e1aa43eaf8
4 changed files with 36 additions and 7 deletions

View File

@@ -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]),

View File

@@ -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"),

View File

@@ -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

View File

@@ -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]
)