new dispersion_parameter parameter
This commit is contained in:
@@ -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]),
|
||||
|
||||
@@ -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"),
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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]
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user