mirror of
				https://github.com/Telecominfraproject/oopt-gnpy.git
				synced 2025-10-31 18:18:00 +00:00 
			
		
		
		
	Raman Solver restructuring and speed up
In this change, the RamanSolver is completely restructured in order to obtain a simplified and faster solution of the Raman equation. Additionally, the inter-channel Raman effect can be evaluated also in the standard fiber, when no Raman pumping is present. The same is true for the GGN model. The Raman pump parameter pumps_loss_coef has been removed as it was not used. The loss coefficient value evaluated at the pump frequency can be included within the fiber loss_coef parameter. This change induces variations in some expected test results as the Raman profile solution is calculated by a completely distinct algorithm. Nevertheless, these variations are negligible being lower than 0.1dB. Change-Id: Iaa40fbb23c555571497e1ff3bf19dbcbfcadf96b
This commit is contained in:
		 AndreaDAmico
					AndreaDAmico
				
			
				
					committed by
					
						 Jan Kundrát
						Jan Kundrát
					
				
			
			
				
	
			
			
			 Jan Kundrát
						Jan Kundrát
					
				
			
						parent
						
							4621ac12bf
						
					
				
				
					commit
					77925b218e
				
			
							
								
								
									
										117
									
								
								docs/json.rst
									
									
									
									
									
								
							
							
						
						
									
										117
									
								
								docs/json.rst
									
									
									
									
									
								
							| @@ -93,6 +93,33 @@ The fiber library currently describes SSMF and NZDF but additional fiber types c | ||||
|  | ||||
| .. _Corning whitepaper on MFD/EA: https://www.corning.com/microsites/coc/oem/documents/specialty-fiber/WP7071-Mode-Field-Diam-and-Eff-Area.pdf | ||||
|  | ||||
| RamanFiber | ||||
| ~~~~~~~~~~ | ||||
|  | ||||
| The RamanFiber can be used to simulate Raman amplification through dedicated Raman pumps. The Raman pumps must be listed | ||||
| in the key ``raman_pumps`` within the RamanFiber ``operational`` dictionary. The description of each Raman pump must | ||||
| contain the following: | ||||
|  | ||||
| +---------------------------+-----------+------------------------------------------------------------+ | ||||
| | field                     | type      | description                                                | | ||||
| +===========================+===========+============================================================+ | ||||
| | ``power``                 | (number)  | Total pump power in :math:`W`                              | | ||||
| |                           |           | considering a depolarized pump                             | | ||||
| +---------------------------+-----------+------------------------------------------------------------+ | ||||
| | ``frequency``             | (number)  | Pump central frequency in :math:`Hz`                       | | ||||
| +---------------------------+-----------+------------------------------------------------------------+ | ||||
| | ``propagation_direction`` | (number)  | The pumps can propagate in the same or opposite direction  | | ||||
| |                           |           | with respect the signal. Valid choices are ``coprop`` and  | | ||||
| |                           |           | ``counterprop``, respectively                              | | ||||
| +---------------------------+-----------+------------------------------------------------------------+ | ||||
|  | ||||
| Beside the list of Raman pumps, the RamanFiber ``operational`` dictionary must include the ``temperature`` that affects | ||||
| the amplified spontaneous emission noise generated by the Raman amplification. | ||||
| As the loss coefficient significantly varies outside the C-band, where the Raman pumps are usually placed, | ||||
| it is suggested to include an estimation of the loss coefficient for the Raman pump central frequencies within | ||||
| a dictionary-like definition of the ``RamanFiber.params.loss_coef`` | ||||
| (e.g. ``loss_coef = {"value": [0.18, 0.18, 0.20, 0.20], "frequency": [191e12, 196e12, 200e12, 210e12]}``). | ||||
|  | ||||
| Transceiver | ||||
| ~~~~~~~~~~~ | ||||
|  | ||||
| @@ -191,45 +218,57 @@ For amplifiers defined in the topology JSON input but whose ``gain = 0`` (placeh | ||||
| The file ``sim_params.json`` contains the tuning parameters used within both the ``gnpy.science_utils.RamanSolver`` and | ||||
| the ``gnpy.science_utils.NliSolver`` for the evaluation of the Raman profile and the NLI generation, respectively. | ||||
|  | ||||
| +-----------------------------------------+-----------+---------------------------------------------+ | ||||
| | field                                   |   type    | description                                 | | ||||
| +=========================================+===========+=============================================+ | ||||
| | ``raman_params.flag``                   | (boolean) | Enable/Disable the Raman effect that        | | ||||
| |                                         |           | produces a power transfer from higher to    | | ||||
| |                                         |           | lower frequencies.                          | | ||||
| |                                         |           | In general, considering the Raman effect    | | ||||
| |                                         |           | provides more accurate results. It is       | | ||||
| |                                         |           | mandatory when Raman amplification is       | | ||||
| |                                         |           | included in the simulation                  | | ||||
| +-----------------------------------------+-----------+---------------------------------------------+ | ||||
| | ``raman_params.space_resolution``       | (number)  | Spatial resolution of the output            | | ||||
| |                                         |           | Raman profile along the entire fiber span.  | | ||||
| |                                         |           | This affects the accuracy and the           | | ||||
| |                                         |           | computational time of the NLI               | | ||||
| |                                         |           | calculation when the GGN method is used:    | | ||||
| |                                         |           | smaller the space resolution higher both    | | ||||
| |                                         |           | the accuracy and the computational time.    | | ||||
| |                                         |           | In C-band simulations, with input power per | | ||||
| |                                         |           | channel around 0 dBm, a suggested value of  | | ||||
| |                                         |           | space resolution is 10e3 m                  | | ||||
| +-----------------------------------------+-----------+---------------------------------------------+ | ||||
| | ``nli_params.method``                   | (string)  | Model used for the NLI evaluation. Valid    | | ||||
| |                                         |           | choices are ``gn_model_analytic`` (see      | | ||||
| |                                         |           | eq. 120 from `arXiv:1209.0394               | | ||||
| |                                         |           | <https://arxiv.org/abs/1209.0394>`_) and    | | ||||
| |                                         |           | ``ggn_spectrally_separated`` (see eq. 21    | | ||||
| |                                         |           | from `arXiv:1710.02225                      | | ||||
| |                                         |           | <https://arxiv.org/abs/1710.02225>`_).      | | ||||
| +-----------------------------------------+-----------+---------------------------------------------+ | ||||
| | ``nli_params.computed_channels``        | (number)  | The channels on which the NLI is            | | ||||
| |                                         |           | explicitly evaluated.                       | | ||||
| |                                         |           | The NLI of the other channels is            | | ||||
| |                                         |           | interpolated using ``numpy.interp``.        | | ||||
| |                                         |           | In a C-band simulation with 96 channels in  | | ||||
| |                                         |           | a 50 GHz spacing fix-grid we recommend at   | | ||||
| |                                         |           | one computed channel every 20 channels.     | | ||||
| +-----------------------------------------+-----------+---------------------------------------------+ | ||||
|  | ||||
| +---------------------------------------------+-----------+---------------------------------------------+ | ||||
| | field                                       |   type    | description                                 | | ||||
| +=============================================+===========+=============================================+ | ||||
| | ``raman_params.flag``                       | (boolean) | Enable/Disable the Raman effect that        | | ||||
| |                                             |           | produces a power transfer from higher to    | | ||||
| |                                             |           | lower frequencies.                          | | ||||
| |                                             |           | In general, considering the Raman effect    | | ||||
| |                                             |           | provides more accurate results. It is       | | ||||
| |                                             |           | mandatory when Raman amplification is       | | ||||
| |                                             |           | included in the simulation                  | | ||||
| +---------------------------------------------+-----------+---------------------------------------------+ | ||||
| | ``raman_params.result_spatial_resolution``  | (number)  | Spatial resolution of the output            | | ||||
| |                                             |           | Raman profile along the entire fiber span.  | | ||||
| |                                             |           | This affects the accuracy and the           | | ||||
| |                                             |           | computational time of the NLI               | | ||||
| |                                             |           | calculation when the GGN method is used:    | | ||||
| |                                             |           | smaller the spatial resolution higher both  | | ||||
| |                                             |           | the accuracy and the computational time.    | | ||||
| |                                             |           | In C-band simulations, with input power per | | ||||
| |                                             |           | channel around 0 dBm, a suggested value of  | | ||||
| |                                             |           | spatial resolution is 10e3 m                | | ||||
| +---------------------------------------------+-----------+---------------------------------------------+ | ||||
| | ``raman_params.solver_spatial_resolution``  | (number)  | Spatial step for the iterative solution     | | ||||
| |                                             |           | of the first order differential equation    | | ||||
| |                                             |           | used to calculate the Raman profile         | | ||||
| |                                             |           | along the entire fiber span.                | | ||||
| |                                             |           | This affects the accuracy and the           | | ||||
| |                                             |           | computational time of the evaluated         | | ||||
| |                                             |           | Raman profile:                              | | ||||
| |                                             |           | smaller the spatial resolution higher both  | | ||||
| |                                             |           | the accuracy and the computational time.    | | ||||
| |                                             |           | In C-band simulations, with input power per | | ||||
| |                                             |           | channel around 0 dBm, a suggested value of  | | ||||
| |                                             |           | spatial resolution is 100 m                 | | ||||
| +---------------------------------------------+-----------+---------------------------------------------+ | ||||
| | ``nli_params.method``                       | (string)  | Model used for the NLI evaluation. Valid    | | ||||
| |                                             |           | choices are ``gn_model_analytic`` (see      | | ||||
| |                                             |           | eq. 120 from `arXiv:1209.0394               | | ||||
| |                                             |           | <https://arxiv.org/abs/1209.0394>`_) and    | | ||||
| |                                             |           | ``ggn_spectrally_separated`` (see eq. 21    | | ||||
| |                                             |           | from `arXiv:1710.02225                      | | ||||
| |                                             |           | <https://arxiv.org/abs/1710.02225>`_).      | | ||||
| +---------------------------------------------+-----------+---------------------------------------------+ | ||||
| | ``nli_params.computed_channels``            | (number)  | The channels on which the NLI is            | | ||||
| |                                             |           | explicitly evaluated.                       | | ||||
| |                                             |           | The NLI of the other channels is            | | ||||
| |                                             |           | interpolated using ``numpy.interp``.        | | ||||
| |                                             |           | In a C-band simulation with 96 channels in  | | ||||
| |                                             |           | a 50 GHz spacing fix-grid we recommend at   | | ||||
| |                                             |           | one computed channel every 20 channels.     | | ||||
| +---------------------------------------------+-----------+---------------------------------------------+ | ||||
|  | ||||
| Span | ||||
| ~~~~ | ||||
|   | ||||
| @@ -20,8 +20,8 @@ unique identifier and a printable name, and provide the :py:meth:`__call__` meth | ||||
| instance as a result. | ||||
| """ | ||||
|  | ||||
| from numpy import abs, array, divide, errstate, interp, mean, pi, polyfit, polyval, sum, sqrt, log10, exp,\ | ||||
|     asarray, full, squeeze | ||||
| from numpy import abs, array, divide, errstate, ones, interp, mean, pi, polyfit, polyval, sum, sqrt, log10, exp,\ | ||||
|     asarray, full, squeeze, zeros, append, flip, outer | ||||
| from scipy.constants import h, c | ||||
| from scipy.interpolate import interp1d | ||||
| from collections import namedtuple | ||||
| @@ -30,7 +30,7 @@ from gnpy.core.utils import lin2db, db2lin, arrange_frequencies, snr_sum | ||||
| from gnpy.core.parameters import FiberParams, PumpParams | ||||
| from gnpy.core.science_utils import NliSolver, RamanSolver | ||||
| from gnpy.core.info import SpectralInformation | ||||
| from gnpy.core.exceptions import SpectrumError | ||||
| from gnpy.core.exceptions import NetworkTopologyError, SpectrumError | ||||
|  | ||||
|  | ||||
| class Location(namedtuple('Location', 'latitude longitude city region')): | ||||
| @@ -313,9 +313,20 @@ class Fiber(_Node): | ||||
|             params = {} | ||||
|         super().__init__(*args, params=FiberParams(**params), **kwargs) | ||||
|         self.pch_out_db = None | ||||
|         self.nli_solver = NliSolver(self) | ||||
|         self.passive = True | ||||
|  | ||||
|         # Raman efficiency matrix function of the delta frequency constructed such that each row is related to a | ||||
|         # fixed frequency: positive elements represent a gain (from higher frequency) and negative elements represent | ||||
|         # a loss (to lower frequency) | ||||
|         if self.params.raman_efficiency: | ||||
|             frequency_offset = self.params.raman_efficiency['frequency_offset'] | ||||
|             frequency_offset = append(-flip(frequency_offset[1:]), frequency_offset) | ||||
|             cr = self.params.raman_efficiency['cr'] | ||||
|             cr = append(- flip(cr[1:]), cr) | ||||
|             self._cr_function = lambda frequency: interp(frequency, frequency_offset, cr) | ||||
|         else: | ||||
|             self._cr_function = lambda frequency: zeros(squeeze(frequency).shape) | ||||
|  | ||||
|     @property | ||||
|     def to_json(self): | ||||
|         return {'uid': self.uid, | ||||
| @@ -376,9 +387,6 @@ class Fiber(_Node): | ||||
|         return self.loss_coef_func(self.params.ref_frequency) * self.params.length + \ | ||||
|             self.params.con_in + self.params.con_out + self.params.att_in | ||||
|  | ||||
|     def lin_attenuation(self, frequency): | ||||
|         return 1 / db2lin(self.params.length * self.loss_coef_func(frequency)) | ||||
|  | ||||
|     def alpha(self, frequency): | ||||
|         """Returns the linear exponent attenuation coefficient such that | ||||
|         :math: `lin_attenuation = e^{- alpha length}` | ||||
| @@ -388,6 +396,17 @@ class Fiber(_Node): | ||||
|         """ | ||||
|         return self.loss_coef_func(frequency) / (10 * log10(exp(1))) | ||||
|  | ||||
|     def cr(self, frequency): | ||||
|         """Returns the raman efficiency matrix including the vibrational loss | ||||
|  | ||||
|         :param frequency: the frequency at which cr is computed [Hz] | ||||
|         :return: cr: raman efficiency matrix [1 / (W m)] | ||||
|         """ | ||||
|         df = outer(ones(frequency.shape), frequency) - outer(frequency, ones(frequency.shape)) | ||||
|         cr = self._cr_function(df) | ||||
|         vibrational_loss = outer(frequency, ones(frequency.shape)) / outer(ones(frequency.shape), frequency) | ||||
|         return cr * (cr >= 0) + cr * (cr < 0) * vibrational_loss  # Raman efficiency [1/(W m)] | ||||
|  | ||||
|     def chromatic_dispersion(self, freq=None): | ||||
|         """Returns accumulated chromatic dispersion (CD). | ||||
|  | ||||
| @@ -412,21 +431,25 @@ class Fiber(_Node): | ||||
|         """Modifies the spectral information computing the attenuation, the non-linear interference generation, | ||||
|         the CD and PMD accumulation. | ||||
|         """ | ||||
|  | ||||
|         # apply the attenuation due to the input connector loss | ||||
|         attenuation_in_db = self.params.con_in + self.params.att_in | ||||
|         spectral_info.apply_attenuation_db(attenuation_in_db) | ||||
|  | ||||
|         # inter channels Raman effect | ||||
|         stimulated_raman_scattering = RamanSolver.calculate_stimulated_raman_scattering(spectral_info, self) | ||||
|  | ||||
|         # NLI noise evaluated at the fiber input | ||||
|         nli = self.nli_solver.compute_nli(spectral_info) | ||||
|         spectral_info.nli += nli | ||||
|         spectral_info.nli += NliSolver.compute_nli(spectral_info, stimulated_raman_scattering, self) | ||||
|  | ||||
|         # chromatic dispersion and pmd variations | ||||
|         spectral_info.chromatic_dispersion += self.chromatic_dispersion(spectral_info.frequency) | ||||
|         spectral_info.pmd = sqrt(spectral_info.pmd ** 2 + self.pmd ** 2) | ||||
|  | ||||
|         # apply the attenuation due to the fiber losses | ||||
|         spectral_info.apply_attenuation_lin(self.lin_attenuation(spectral_info.frequency)) | ||||
|         attenuation_fiber = stimulated_raman_scattering.loss_profile[:, -1] | ||||
|         spectral_info.apply_attenuation_lin(attenuation_fiber) | ||||
|  | ||||
|         # apply the attenuation due to the output connector loss | ||||
|         attenuation_out_db = self.params.con_out | ||||
|         spectral_info.apply_attenuation_db(attenuation_out_db) | ||||
|  | ||||
| @@ -451,44 +474,50 @@ class Fiber(_Node): | ||||
| class RamanFiber(Fiber): | ||||
|     def __init__(self, *args, params=None, **kwargs): | ||||
|         super().__init__(*args, params=params, **kwargs) | ||||
|         if self.operational and 'raman_pumps' in self.operational: | ||||
|             self.raman_pumps = tuple(PumpParams(p['power'], p['frequency'], p['propagation_direction']) | ||||
|                                      for p in self.operational['raman_pumps']) | ||||
|         else: | ||||
|             self.raman_pumps = None | ||||
|         self.raman_solver = RamanSolver(self) | ||||
|         if not self.operational: | ||||
|             raise NetworkTopologyError(f'Fiber element uid:{self.uid} ' | ||||
|                                        'defined as RamanFiber without operational parameters') | ||||
|  | ||||
|     @property | ||||
|     def to_json(self): | ||||
|         return dict(super().to_json, operational=self.operational) | ||||
|         if 'raman_pumps' not in self.operational: | ||||
|             raise NetworkTopologyError(f'Fiber element uid:{self.uid} ' | ||||
|                                        'defined as RamanFiber without raman pumps description in operational') | ||||
|  | ||||
|         if 'temperature' not in self.operational: | ||||
|             raise NetworkTopologyError(f'Fiber element uid:{self.uid} ' | ||||
|                                        'defined as RamanFiber without temperature in operational') | ||||
|  | ||||
|         pump_loss = db2lin(self.params.con_out) | ||||
|         self.raman_pumps = tuple(PumpParams(p['power'] / pump_loss, p['frequency'], p['propagation_direction']) | ||||
|                                  for p in self.operational['raman_pumps']) | ||||
|         self.temperature = self.operational['temperature'] | ||||
|  | ||||
|     def propagate(self, spectral_info: SpectralInformation): | ||||
|         """Modifies the spectral information computing the attenuation, the non-linear interference generation, | ||||
|         the CD and PMD accumulation. | ||||
|         """ | ||||
|         # apply the attenuation due to the input connector loss | ||||
|         attenuation_in_db = self.params.con_in + self.params.att_in | ||||
|         spectral_info.apply_attenuation_db(attenuation_in_db) | ||||
|  | ||||
|         self.raman_solver.carriers = spectral_info.carriers | ||||
|         self.raman_solver.raman_pumps = self.raman_pumps | ||||
|         self.nli_solver.stimulated_raman_scattering = self.raman_solver.stimulated_raman_scattering | ||||
|         raman_ase = self.raman_solver.spontaneous_raman_scattering.power[:spectral_info.number_of_channels, -1] | ||||
|         # Raman pumps and inter channel Raman effect | ||||
|         stimulated_raman_scattering = RamanSolver.calculate_stimulated_raman_scattering(spectral_info, self) | ||||
|         spontaneous_raman_scattering = \ | ||||
|             RamanSolver.calculate_spontaneous_raman_scattering(spectral_info, stimulated_raman_scattering, self) | ||||
|  | ||||
|         # NLI noise evaluated at the fiber input | ||||
|         nli = self.nli_solver.compute_nli(spectral_info) | ||||
|         spectral_info.nli += nli | ||||
|         # nli and ase noise evaluated at the fiber input | ||||
|         spectral_info.nli += NliSolver.compute_nli(spectral_info, stimulated_raman_scattering, self) | ||||
|         spectral_info.ase += spontaneous_raman_scattering | ||||
|  | ||||
|         # chromatic dispersion and pmd variations | ||||
|         spectral_info.chromatic_dispersion += self.chromatic_dispersion(spectral_info.frequency) | ||||
|         spectral_info.pmd = sqrt(spectral_info.pmd ** 2 + self.pmd ** 2) | ||||
|  | ||||
|         # apply the attenuation due to the fiber losses | ||||
|         attenuation_fiber = \ | ||||
|             self.raman_solver.stimulated_raman_scattering.rho[:spectral_info.number_of_channels, -1] ** 2 | ||||
|         attenuation_fiber = stimulated_raman_scattering.loss_profile[:spectral_info.number_of_channels, -1] | ||||
|  | ||||
|         spectral_info.apply_attenuation_lin(attenuation_fiber) | ||||
|  | ||||
|         spectral_info.ase += raman_ase | ||||
|  | ||||
|         # apply the attenuation due to the output connector loss | ||||
|         attenuation_out_db = self.params.con_out | ||||
|         spectral_info.apply_attenuation_db(attenuation_out_db) | ||||
|  | ||||
|   | ||||
| @@ -34,15 +34,15 @@ class PumpParams(Parameters): | ||||
|  | ||||
|  | ||||
| class RamanParams(Parameters): | ||||
|     def __init__(self, flag=False, space_resolution=10e3, tolerance=None): | ||||
|     def __init__(self, flag=False, result_spatial_resolution=10e3, solver_spatial_resolution=50): | ||||
|         """ Simulation parameters used within the Raman Solver | ||||
|         :params flag: boolean for enabling/disable the evaluation of the Raman Power profile in frequency and position | ||||
|         :params space_resolution: spatial resolution of the evaluated Raman Power profile | ||||
|         :params tolerance: tuning parameter for scipy.integrate.solve_bvp solution | ||||
|         :params flag: boolean for enabling/disable the evaluation of the Raman power profile in frequency and position | ||||
|         :params result_spatial_resolution: spatial resolution of the evaluated Raman power profile | ||||
|         :params solver_spatial_resolution: spatial step for the iterative solution of the first order ode | ||||
|         """ | ||||
|         self.flag = flag | ||||
|         self.space_resolution = space_resolution  # [m] | ||||
|         self.tolerance = tolerance | ||||
|         self.result_spatial_resolution = result_spatial_resolution  # [m] | ||||
|         self.solver_spatial_resolution = solver_spatial_resolution  # [m] | ||||
|  | ||||
|  | ||||
| class NLIParams(Parameters): | ||||
| @@ -156,7 +156,6 @@ class FiberParams(Parameters): | ||||
|             else: | ||||
|                 self._loss_coef = asarray(kwargs['loss_coef']) * 1e-3  # lineic loss dB/m | ||||
|                 self._f_loss_ref = asarray(self._ref_frequency)  # Hz | ||||
|             self._pumps_loss_coef = kwargs.get('pumps_loss_coef') | ||||
|         except KeyError as e: | ||||
|             raise ParametersError(f'Fiber configurations json must include {e}. Configuration: {kwargs}') | ||||
|  | ||||
| @@ -237,12 +236,10 @@ class FiberParams(Parameters): | ||||
|     def raman_efficiency(self): | ||||
|         return self._raman_efficiency | ||||
|  | ||||
|     @property | ||||
|     def pumps_loss_coef(self): | ||||
|         return self._pumps_loss_coef | ||||
|  | ||||
|     def asdict(self): | ||||
|         dictionary = super().asdict() | ||||
|         dictionary['loss_coef'] = self.loss_coef * 1e3 | ||||
|         dictionary['length_units'] = 'm' | ||||
|         if not self.raman_efficiency: | ||||
|             dictionary.pop('raman_efficiency') | ||||
|         return dictionary | ||||
|   | ||||
| @@ -10,15 +10,11 @@ Solver definitions to calculate the Raman effect and the nonlinear interference | ||||
| The solvers take as input instances of the spectral information, the fiber and the simulation parameters | ||||
| """ | ||||
|  | ||||
| from numpy import interp, pi, zeros, shape, where, cos, reshape, array, append, ones, argsort, nan, exp, arange, sqrt, \ | ||||
|     empty, vstack, trapz, arcsinh, clip, abs, sum, outer, diag | ||||
| from operator import attrgetter | ||||
| from numpy import interp, pi, zeros, shape, where, cos, array, append, ones, exp, arange, sqrt, empty, trapz, arcsinh, \ | ||||
|     clip, abs, sum, concatenate, flip, outer, inner, transpose, max, format_float_scientific, diag | ||||
| from logging import getLogger | ||||
| import scipy.constants as ph | ||||
| from scipy.integrate import solve_bvp | ||||
| from scipy.integrate import cumtrapz | ||||
| from scipy.constants import k, h | ||||
| from scipy.interpolate import interp1d | ||||
| from scipy.optimize import OptimizeResult | ||||
| from math import isclose | ||||
|  | ||||
| from gnpy.core.utils import db2lin, lin2db | ||||
| @@ -29,10 +25,10 @@ from gnpy.core.info import SpectralInformation | ||||
| logger = getLogger(__name__) | ||||
| sim_params = SimParams.get() | ||||
|  | ||||
|  | ||||
| def raised_cosine_comb(f, *carriers): | ||||
|     """ Returns an array storing the PSD of a WDM comb of raised cosine shaped | ||||
|     channels at the input frequencies defined in array f | ||||
|  | ||||
|     :param f: numpy array of frequencies in Hz | ||||
|     :param carriers: namedtuple describing the WDM comb | ||||
|     :return: PSD of the WDM comb evaluated over f | ||||
| @@ -54,277 +50,199 @@ def raised_cosine_comb(f, *carriers): | ||||
|     return psd | ||||
|  | ||||
|  | ||||
| class SpontaneousRamanScattering: | ||||
|     def __init__(self, frequency, z, power): | ||||
|         self.frequency = frequency | ||||
|         self.z = z | ||||
|         self.power = power | ||||
|  | ||||
|  | ||||
| class StimulatedRamanScattering: | ||||
|     def __init__(self, frequency, z, rho, power): | ||||
|     def __init__(self, power_profile, loss_profile, frequency, z): | ||||
|         """ | ||||
|         :params power_profile: power profile matrix along frequency and z [W] | ||||
|         :params loss_profile: power profile matrix along frequency and z [linear units] | ||||
|         :params frequency: channels frequencies array [Hz] | ||||
|         :params z: positions array [m] | ||||
|         """ | ||||
|         self.power_profile = power_profile | ||||
|         self.loss_profile = loss_profile | ||||
|         # Field loss profile matrix along frequency and z | ||||
|         self.rho = sqrt(loss_profile) | ||||
|         self.frequency = frequency | ||||
|         self.z = z | ||||
|         self.rho = rho | ||||
|         self.power = power | ||||
|  | ||||
|  | ||||
| class RamanSolver: | ||||
|     def __init__(self, fiber=None): | ||||
|         """ Initialize the Raman solver object. | ||||
|         :param fiber: instance of elements.py/Fiber. | ||||
|         :param carriers: tuple of carrier objects | ||||
|         :param raman_pumps: tuple containing pumps characteristics | ||||
|         """ | ||||
|         self._fiber = fiber | ||||
|         self._carriers = None | ||||
|         self._raman_pumps = None | ||||
|         self._stimulated_raman_scattering = None | ||||
|         self._spontaneous_raman_scattering = None | ||||
|  | ||||
|     @property | ||||
|     def fiber(self): | ||||
|         return self._fiber | ||||
|  | ||||
|     @property | ||||
|     def carriers(self): | ||||
|         return self._carriers | ||||
|  | ||||
|     @carriers.setter | ||||
|     def carriers(self, carriers): | ||||
|         self._carriers = carriers | ||||
|         self._spontaneous_raman_scattering = None | ||||
|         self._stimulated_raman_scattering = None | ||||
|  | ||||
|     @property | ||||
|     def raman_pumps(self): | ||||
|         return self._raman_pumps | ||||
|  | ||||
|     @raman_pumps.setter | ||||
|     def raman_pumps(self, raman_pumps): | ||||
|         self._raman_pumps = raman_pumps | ||||
|         self._stimulated_raman_scattering = None | ||||
|  | ||||
|     @property | ||||
|     def stimulated_raman_scattering(self): | ||||
|         if self._stimulated_raman_scattering is None: | ||||
|             self.calculate_stimulated_raman_scattering(self.carriers, self.raman_pumps) | ||||
|         return self._stimulated_raman_scattering | ||||
|  | ||||
|     @property | ||||
|     def spontaneous_raman_scattering(self): | ||||
|         if self._spontaneous_raman_scattering is None: | ||||
|             self.calculate_spontaneous_raman_scattering(self.carriers, self.raman_pumps) | ||||
|         return self._spontaneous_raman_scattering | ||||
|  | ||||
|     def calculate_spontaneous_raman_scattering(self, carriers, raman_pumps): | ||||
|         raman_efficiency = self.fiber.params.raman_efficiency | ||||
|         temperature = self.fiber.operational['temperature'] | ||||
|  | ||||
|         logger.debug('Start computing fiber Spontaneous Raman Scattering') | ||||
|         power_spectrum, freq_array, prop_direct, bn_array = self._compute_power_spectrum(carriers, raman_pumps) | ||||
|  | ||||
|         alphap_fiber = self.fiber.alpha(freq_array) | ||||
|  | ||||
|         freq_diff = abs(freq_array - reshape(freq_array, (len(freq_array), 1))) | ||||
|         interp_cr = interp1d(raman_efficiency['frequency_offset'], raman_efficiency['cr']) | ||||
|         cr = interp_cr(freq_diff) | ||||
|  | ||||
|         # z propagation axis | ||||
|         z_array = self.stimulated_raman_scattering.z | ||||
|         ase_bc = zeros(freq_array.shape) | ||||
|  | ||||
|         # calculate ase power | ||||
|         int_spontaneous_raman = self._int_spontaneous_raman(z_array, self._stimulated_raman_scattering.power, | ||||
|                                                             alphap_fiber, freq_array, cr, freq_diff, ase_bc, | ||||
|                                                             bn_array, temperature) | ||||
|  | ||||
|         spontaneous_raman_scattering = SpontaneousRamanScattering(freq_array, z_array, int_spontaneous_raman.x) | ||||
|         logger.debug("Spontaneous Raman Scattering evaluated successfully") | ||||
|         self._spontaneous_raman_scattering = spontaneous_raman_scattering | ||||
|     """This class contains the methods to calculate the Raman scattering effect.""" | ||||
|  | ||||
|     @staticmethod | ||||
|     def _compute_power_spectrum(carriers, raman_pumps=None): | ||||
|     def calculate_attenuation_profile(spectral_info: SpectralInformation, fiber): | ||||
|         """Evaluates the attenuation profile along the z axis for all the frequency propagating in the | ||||
|         fiber without considering the stimulated Raman scattering. | ||||
|         """ | ||||
|         Rearrangement of spectral and Raman pump information to make them compatible with Raman solver | ||||
|         :param carriers: a tuple of namedtuples describing the transmitted channels | ||||
|         :param raman_pumps: a namedtuple describing the Raman pumps | ||||
|         :return: | ||||
|         # z array definition | ||||
|         z = array([0, fiber.params.length]) | ||||
|         frequency = spectral_info.frequency | ||||
|         alpha = fiber.alpha(frequency) | ||||
|         loss_profile = exp(- outer(alpha, z)) | ||||
|         power_profile = outer(spectral_info.signal, ones(z.size)) * loss_profile | ||||
|         stimulated_raman_scattering = StimulatedRamanScattering(power_profile, loss_profile, frequency, z) | ||||
|         return stimulated_raman_scattering | ||||
|  | ||||
|     @staticmethod | ||||
|     def calculate_stimulated_raman_scattering(spectral_info: SpectralInformation, fiber): | ||||
|         """Evaluates the Raman profile along the z axis for all the frequency propagated in the fiber | ||||
|         including the Raman pumps co- and counter-propagating | ||||
|         """ | ||||
|  | ||||
|         # Signal power spectrum | ||||
|         pow_array = array([]) | ||||
|         f_array = array([]) | ||||
|         noise_bandwidth_array = array([]) | ||||
|         for carrier in sorted(carriers, key=attrgetter('frequency')): | ||||
|             f_array = append(f_array, carrier.frequency) | ||||
|             pow_array = append(pow_array, carrier.power.signal) | ||||
|             ref_bw = carrier.baud_rate | ||||
|             noise_bandwidth_array = append(noise_bandwidth_array, ref_bw) | ||||
|  | ||||
|         propagation_direction = ones(len(f_array)) | ||||
|  | ||||
|         # Raman pump power spectrum | ||||
|         if raman_pumps: | ||||
|             for pump in raman_pumps: | ||||
|                 pow_array = append(pow_array, pump.power) | ||||
|                 f_array = append(f_array, pump.frequency) | ||||
|                 direction = +1 if pump.propagation_direction == 'coprop' else -1 | ||||
|                 propagation_direction = append(propagation_direction, direction) | ||||
|                 noise_bandwidth_array = append(noise_bandwidth_array, ref_bw) | ||||
|  | ||||
|         # Final sorting | ||||
|         ind = argsort(f_array) | ||||
|         f_array = f_array[ind] | ||||
|         pow_array = pow_array[ind] | ||||
|         propagation_direction = propagation_direction[ind] | ||||
|  | ||||
|         return pow_array, f_array, propagation_direction, noise_bandwidth_array | ||||
|  | ||||
|     def _int_spontaneous_raman(self, z_array, raman_matrix, alphap_fiber, freq_array, | ||||
|                                cr_raman_matrix, freq_diff, ase_bc, bn_array, temperature): | ||||
|         spontaneous_raman_scattering = OptimizeResult() | ||||
|  | ||||
|         dx = sim_params.raman_params.space_resolution | ||||
|         h = ph.value('Planck constant') | ||||
|         kb = ph.value('Boltzmann constant') | ||||
|  | ||||
|         power_ase = nan * ones(raman_matrix.shape) | ||||
|         int_pump = cumtrapz(raman_matrix, z_array, dx=dx, axis=1, initial=0) | ||||
|  | ||||
|         for f_ind, f_ase in enumerate(freq_array): | ||||
|             cr_raman = cr_raman_matrix[f_ind, :] | ||||
|             vibrational_loss = f_ase / freq_array[:f_ind] | ||||
|             eta = 1 / (exp((h * freq_diff[f_ind, f_ind + 1:]) / (kb * temperature)) - 1) | ||||
|  | ||||
|             int_fiber_loss = -alphap_fiber[f_ind] * z_array | ||||
|             int_raman_loss = sum((cr_raman[:f_ind] * vibrational_loss * int_pump[:f_ind, :].transpose()).transpose(), | ||||
|                                     axis=0) | ||||
|             int_raman_gain = sum((cr_raman[f_ind + 1:] * int_pump[f_ind + 1:, :].transpose()).transpose(), axis=0) | ||||
|  | ||||
|             int_gain_loss = int_fiber_loss + int_raman_gain + int_raman_loss | ||||
|  | ||||
|             new_ase = sum((cr_raman[f_ind + 1:] * (1 + eta) * raman_matrix[f_ind + 1:, :].transpose()).transpose() | ||||
|                              * h * f_ase * bn_array[f_ind], axis=0) | ||||
|  | ||||
|             bc_evolution = ase_bc[f_ind] * exp(int_gain_loss) | ||||
|             ase_evolution = exp(int_gain_loss) * cumtrapz(new_ase * exp(-int_gain_loss), z_array, dx=dx, initial=0) | ||||
|  | ||||
|             power_ase[f_ind, :] = bc_evolution + ase_evolution | ||||
|  | ||||
|         spontaneous_raman_scattering.x = 2 * power_ase | ||||
|         return spontaneous_raman_scattering | ||||
|  | ||||
|     def calculate_stimulated_raman_scattering(self, carriers, raman_pumps): | ||||
|         """ Returns stimulated Raman scattering solution including | ||||
|         fiber gain/loss profile. | ||||
|         :return: None | ||||
|         """ | ||||
|         # fiber parameters | ||||
|         fiber_length = self.fiber.params.length | ||||
|         raman_efficiency = self.fiber.params.raman_efficiency | ||||
|  | ||||
|         if not sim_params.raman_params.flag: | ||||
|             raman_efficiency['cr'] = zeros(len(raman_efficiency['cr'])) | ||||
|         # raman solver parameters | ||||
|         z_resolution = sim_params.raman_params.space_resolution | ||||
|         tolerance = sim_params.raman_params.tolerance | ||||
|  | ||||
|         logger.debug('Start computing fiber Stimulated Raman Scattering') | ||||
|  | ||||
|         power_spectrum, freq_array, prop_direct, _ = self._compute_power_spectrum(carriers, raman_pumps) | ||||
|         # Raman parameters | ||||
|         z_resolution = sim_params.raman_params.result_spatial_resolution | ||||
|         z_step = sim_params.raman_params.solver_spatial_resolution | ||||
|         z = append(arange(0, fiber.params.length, z_step), fiber.params.length) | ||||
|         z_final = append(arange(0, fiber.params.length, z_resolution), fiber.params.length) | ||||
|  | ||||
|         alphap_fiber = self.fiber.alpha(freq_array) | ||||
|         if sim_params.raman_params.flag: | ||||
|             if hasattr(fiber, 'raman_pumps'): | ||||
|                 # TODO: verify co-propagating pumps computation and in general unsorted frequency | ||||
|                 # Co-propagating spectrum definition | ||||
|                 co_raman_pump_power = array([pump.power for pump in fiber.raman_pumps | ||||
|                                              if pump.propagation_direction == 'coprop']) | ||||
|                 co_raman_pump_frequency = array([pump.frequency for pump in fiber.raman_pumps | ||||
|                                                  if pump.propagation_direction == 'coprop']) | ||||
|  | ||||
|         freq_diff = abs(freq_array - reshape(freq_array, (len(freq_array), 1))) | ||||
|         interp_cr = interp1d(raman_efficiency['frequency_offset'], raman_efficiency['cr']) | ||||
|         cr = interp_cr(freq_diff) | ||||
|                 co_power = concatenate((spectral_info.signal, co_raman_pump_power)) | ||||
|                 co_frequency = concatenate((spectral_info.frequency, co_raman_pump_frequency)) | ||||
|  | ||||
|         # z propagation axis | ||||
|         z = append(arange(0, fiber_length, z_resolution), fiber_length) | ||||
|  | ||||
|         def ode_function(z, p): | ||||
|             return self._ode_stimulated_raman(z, p, alphap_fiber, freq_array, cr, prop_direct) | ||||
|  | ||||
|         def boundary_residual(ya, yb): | ||||
|             return self._residuals_stimulated_raman(ya, yb, power_spectrum, prop_direct) | ||||
|  | ||||
|         initial_guess_conditions = self._initial_guess_stimulated_raman(z, power_spectrum, alphap_fiber, prop_direct) | ||||
|  | ||||
|         # ODE SOLVER | ||||
|         bvp_solution = solve_bvp(ode_function, boundary_residual, z, initial_guess_conditions, tol=tolerance) | ||||
|  | ||||
|         rho = (bvp_solution.y.transpose() / power_spectrum).transpose() | ||||
|         rho = sqrt(rho)    # From power attenuation to field attenuation | ||||
|         stimulated_raman_scattering = StimulatedRamanScattering(freq_array, bvp_solution.x, rho, bvp_solution.y) | ||||
|  | ||||
|         self._stimulated_raman_scattering = stimulated_raman_scattering | ||||
|  | ||||
|     def _residuals_stimulated_raman(self, ya, yb, power_spectrum, prop_direct): | ||||
|  | ||||
|         computed_boundary_value = zeros(ya.size) | ||||
|  | ||||
|         for index, direction in enumerate(prop_direct): | ||||
|             if direction == +1: | ||||
|                 computed_boundary_value[index] = ya[index] | ||||
|                 # Counter-propagating spectrum definition | ||||
|                 cnt_power = array([pump.power for pump in fiber.raman_pumps | ||||
|                                    if pump.propagation_direction == 'counterprop']) | ||||
|                 cnt_frequency = array([pump.frequency for pump in fiber.raman_pumps | ||||
|                                        if pump.propagation_direction == 'counterprop']) | ||||
|                 # Co-propagating profile initialization | ||||
|                 co_power_profile = empty([co_frequency.size, z.size]) | ||||
|                 if co_frequency.size: | ||||
|                     co_cr = fiber.cr(co_frequency) | ||||
|                     co_alpha = fiber.alpha(co_frequency) | ||||
|                     co_power_profile = \ | ||||
|                         RamanSolver.first_order_derivative_solution(co_power, co_alpha, co_cr, z) | ||||
|                 # Counter-propagating profile initialization | ||||
|                 cnt_power_profile = empty([co_frequency.size, z.size]) | ||||
|                 if cnt_frequency.size: | ||||
|                     cnt_cr = fiber.cr(cnt_frequency) | ||||
|                     cnt_alpha = fiber.alpha(cnt_frequency) | ||||
|                     cnt_power_profile = \ | ||||
|                         flip(RamanSolver.first_order_derivative_solution(cnt_power, cnt_alpha, cnt_cr, z[-1] - flip(z))) | ||||
|                 # Co-propagating and Counter-propagating Profile Computation | ||||
|                 if co_frequency.size and cnt_frequency.size: | ||||
|                     co_power_profile, cnt_power_profile = \ | ||||
|                         RamanSolver.iterative_algorithm(co_power_profile, cnt_power_profile, co_frequency, cnt_frequency, | ||||
|                                                         z, fiber) | ||||
|                 # Complete Power Profile | ||||
|                 power_profile = concatenate((co_power_profile, cnt_power_profile), axis=0) | ||||
|                 # Complete Loss Profile | ||||
|                 co_loss_profile = co_power_profile / outer(co_power, ones(z.size)) | ||||
|                 cnt_loss_profile = cnt_power_profile / outer(cnt_power, ones(z.size)) | ||||
|                 loss_profile = concatenate((co_loss_profile, cnt_loss_profile), axis=0) | ||||
|                 # Complete frequency | ||||
|                 frequency = concatenate((co_frequency, cnt_frequency)) | ||||
|             else: | ||||
|                 computed_boundary_value[index] = yb[index] | ||||
|                 # Without Raman pumps | ||||
|                 alpha = fiber.alpha(spectral_info.frequency) | ||||
|                 cr = fiber.cr(spectral_info.frequency) | ||||
|                 # Power profile | ||||
|                 power_profile = \ | ||||
|                     RamanSolver.first_order_derivative_solution(spectral_info.signal, alpha, cr, z) | ||||
|                 # Loss profile | ||||
|                 loss_profile = power_profile / outer(spectral_info.signal, ones(z.size)) | ||||
|                 frequency = spectral_info.frequency | ||||
|             power_profile = interp1d(z, power_profile, axis=1)(z_final) | ||||
|             loss_profile = interp1d(z, loss_profile, axis=1)(z_final) | ||||
|             stimulated_raman_scattering = StimulatedRamanScattering(power_profile, loss_profile, frequency, z_final) | ||||
|         else: | ||||
|             stimulated_raman_scattering = RamanSolver.calculate_attenuation_profile(spectral_info, fiber) | ||||
|         return stimulated_raman_scattering | ||||
|  | ||||
|         return power_spectrum - computed_boundary_value | ||||
|  | ||||
|     def _initial_guess_stimulated_raman(self, z, power_spectrum, alphap_fiber, prop_direct): | ||||
|         """ Computes the initial guess knowing the boundary conditions | ||||
|         :param z: patial axis [m]. numpy array | ||||
|         :param power_spectrum: power in each frequency slice [W]. | ||||
|         Frequency axis is defined by freq_array. numpy array | ||||
|         :param alphap_fiber: frequency dependent fiber attenuation of signal power [1/m]. | ||||
|         Frequency defined by freq_array. numpy array | ||||
|         :param prop_direct: indicates the propagation direction of each power slice in power_spectrum: | ||||
|         +1 for forward propagation and -1 for backward propagation. Frequency defined by freq_array. numpy array | ||||
|         :return: power_guess: guess on the initial conditions [W]. | ||||
|         The first ndarray index identifies the frequency slice, | ||||
|         the second ndarray index identifies the step in z. ndarray | ||||
|     @staticmethod | ||||
|     def calculate_spontaneous_raman_scattering(spectral_info: SpectralInformation, srs: StimulatedRamanScattering, | ||||
|                                                fiber): | ||||
|         """Evaluates the Raman profile along the z axis for all the frequency propagated in the fiber | ||||
|         including the Raman pumps co- and counter-propagating. | ||||
|         """ | ||||
|         logger.debug('Start computing fiber Spontaneous Raman Scattering') | ||||
|         z = srs.z | ||||
|         baud_rate = spectral_info.baud_rate | ||||
|         frequency = spectral_info.frequency | ||||
|         channels_loss = srs.loss_profile[:spectral_info.number_of_channels, :] | ||||
|  | ||||
|         power_guess = empty((power_spectrum.size, z.size)) | ||||
|         for f_index, power_slice in enumerate(power_spectrum): | ||||
|             if prop_direct[f_index] == +1: | ||||
|                 power_guess[f_index, :] = exp(-alphap_fiber[f_index] * z) * power_slice | ||||
|             else: | ||||
|                 power_guess[f_index, :] = exp(-alphap_fiber[f_index] * z[::-1]) * power_slice | ||||
|         # calculate ase power | ||||
|         ase = zeros(spectral_info.number_of_channels) | ||||
|         for i, pump in enumerate(fiber.raman_pumps): | ||||
|             pump_power = srs.power_profile[spectral_info.number_of_channels + i, :] | ||||
|             df = pump.frequency - frequency | ||||
|             eta = - 1 / (1 - exp(h * df / (k * fiber.temperature))) | ||||
|             cr = fiber._cr_function(df) | ||||
|             integral = trapz(pump_power / channels_loss, z, axis=1) | ||||
|             ase += 2 * h * baud_rate * frequency * (1 + eta) * cr * (df > 0) * integral  # 2 factor for double pol | ||||
|         return ase | ||||
|  | ||||
|         return power_guess | ||||
|     @staticmethod | ||||
|     def first_order_derivative_solution(power_in, alpha, cr, z): | ||||
|         """Solves the Raman first order derivative equation | ||||
|  | ||||
|     def _ode_stimulated_raman(self, z, power_spectrum, alphap_fiber, freq_array, cr_raman_matrix, prop_direct): | ||||
|         """ Aim of ode_raman is to implement the set of ordinary differential equations (ODEs) | ||||
|         describing the Raman effect. | ||||
|         :param z: spatial axis (unused). | ||||
|         :param power_spectrum: power in each frequency slice [W]. | ||||
|         Frequency axis is defined by freq_array. numpy array. Size n | ||||
|         :param alphap_fiber: frequency dependent fiber attenuation of signal power [1/m]. | ||||
|         Frequency defined by freq_array. numpy array. Size n | ||||
|         :param freq_array: reference frequency axis [Hz]. numpy array. Size n | ||||
|         :param cr_raman: Cr(f) Raman gain efficiency variation in frequency [1/W/m]. | ||||
|         Frequency defined by freq_array. numpy ndarray. Size nxn | ||||
|         :param prop_direct: indicates the propagation direction of each power slice in power_spectrum: | ||||
|         +1 for forward propagation and -1 for backward propagation. | ||||
|         Frequency defined by freq_array. numpy array. Size n | ||||
|         :return: dP/dz: the power variation in dz [W/m]. numpy array. Size n | ||||
|         :param power_in: launch power array | ||||
|         :param alpha: loss coefficient array | ||||
|         :param cr: Raman efficiency coefficients matrix | ||||
|         :param z: z position array | ||||
|         :return: power profile matrix | ||||
|         """ | ||||
|         dz = z[1:] - z[:-1] | ||||
|         power = outer(power_in, ones(z.size)) | ||||
|         for i in range(1, z.size): | ||||
|             power[:, i] = power[:, i - 1] * (1 + (- alpha + sum(cr * power[:, i - 1], 1)) * dz[i - 1]) | ||||
|         return power | ||||
|  | ||||
|         dpdz = nan * ones(power_spectrum.shape) | ||||
|         for f_ind, power in enumerate(power_spectrum): | ||||
|             cr_raman = cr_raman_matrix[f_ind, :] | ||||
|             vibrational_loss = freq_array[f_ind] / freq_array[:f_ind] | ||||
|     @staticmethod | ||||
|     def iterative_algorithm(co_initial_guess_power, cnt_initial_guess_power, co_frequency, cnt_frequency, z, fiber): | ||||
|         """Solves the Raman first order derivative equation in case of both co- and counter-propagating | ||||
|         frequencies | ||||
|  | ||||
|             for z_ind, power_sample in enumerate(power): | ||||
|                 raman_gain = sum(cr_raman[f_ind + 1:] * power_spectrum[f_ind + 1:, z_ind]) | ||||
|                 raman_loss = sum(vibrational_loss * cr_raman[:f_ind] * power_spectrum[:f_ind, z_ind]) | ||||
|         :param co_initial_guess_power: co-propagationg Raman first order derivative equation solution | ||||
|         :param cnt_initial_guess_power: counter-propagationg Raman first order derivative equation solution | ||||
|         :param co_frequency: co-propagationg frequencies | ||||
|         :param cnt_frequency: counter-propagationg frequencies | ||||
|         :param z: z position array | ||||
|         :param fiber: instance of gnpy.core.elements.Fiber or gnpy.core.elements.RamanFiber | ||||
|         :return: co- and counter-propagatng power profile matrix | ||||
|         """ | ||||
|         logger.debug('  Start iterative algorithm') | ||||
|         residue = 1 | ||||
|         residue_tol = 1e-6 | ||||
|         accuracy = 1 | ||||
|         accuracy_tol = 1e-3 | ||||
|         iteration = 0 | ||||
|         num_max_iter = 1000 | ||||
|         prev_power = concatenate((co_initial_guess_power, cnt_initial_guess_power)) | ||||
|         frequency = concatenate((co_frequency, cnt_frequency)) | ||||
|         dz = z[1:] - z[:-1] | ||||
|         cr = fiber.cr(frequency) | ||||
|         alpha = fiber.alpha(frequency) | ||||
|         next_power = array(prev_power) | ||||
|         while residue > residue_tol and accuracy > accuracy_tol and iteration < num_max_iter: | ||||
|             iteration += 1 | ||||
|             for i in range(1, z.size): | ||||
|                 dpdz = - alpha + sum(cr * next_power[:, i - 1], 1) | ||||
|                 next_power[:co_frequency.size, i] = \ | ||||
|                     next_power[:co_frequency.size, i - 1] * (1 + dpdz[:co_frequency.size] * dz[i - 1]) | ||||
|             for i in range(1, z.size): | ||||
|                 dpdz = - alpha + sum(cr * next_power[:, -i], 1) | ||||
|                 next_power[co_frequency.size:, -i - 1] = \ | ||||
|                     next_power[co_frequency.size:, -i] * (1 + dpdz[co_frequency.size:] * dz[-i]) | ||||
|  | ||||
|                 dpdz_element = prop_direct[f_ind] * (-alphap_fiber[f_ind] + raman_gain - raman_loss) * power_sample | ||||
|                 dpdz[f_ind][z_ind] = dpdz_element | ||||
|             dpdz_num = (next_power[:co_frequency.size, 1:] - next_power[:co_frequency.size, :-1]) / dz | ||||
|             dpdz_exp = next_power[:co_frequency.size, :-1] * \ | ||||
|                 (- outer(alpha, ones(z.size)) + inner(cr, transpose(next_power)))[:co_frequency.size, :-1] | ||||
|  | ||||
|             residue = max(abs((next_power - prev_power) / next_power)) | ||||
|             accuracy = max(abs((dpdz_exp - dpdz_num) / dpdz_exp)) | ||||
|             prev_power = array(next_power) | ||||
|             logger.debug(f'     Iteration: {iteration}  Accuracy: {format_float_scientific(accuracy, precision=3)}') | ||||
|         return next_power[:co_frequency.size, :], next_power[co_frequency.size:, :] | ||||
|  | ||||
|         return vstack(dpdz) | ||||
|  | ||||
| class NliSolver: | ||||
|     """ This class implements the NLI models. | ||||
| @@ -334,21 +252,6 @@ class NliSolver: | ||||
|         'ggn_spectrally_separated': eq. 21 from arXiv: 1710.02225 spectrally separated | ||||
|     """ | ||||
|  | ||||
|     def __init__(self, fiber=None): | ||||
|         """ Initialize the Nli solver object. | ||||
|         :param fiber: instance of elements.py/Fiber. | ||||
|         """ | ||||
|         self._fiber = fiber | ||||
|         self._stimulated_raman_scattering = None | ||||
|  | ||||
|     @property | ||||
|     def stimulated_raman_scattering(self): | ||||
|         return self._stimulated_raman_scattering | ||||
|  | ||||
|     @stimulated_raman_scattering.setter | ||||
|     def stimulated_raman_scattering(self, stimulated_raman_scattering): | ||||
|         self._stimulated_raman_scattering = stimulated_raman_scattering | ||||
|  | ||||
|     @staticmethod | ||||
|     def effective_length(alpha, length): | ||||
|         """The effective length identify the region in which the NLI has a significant contribution to | ||||
| @@ -356,15 +259,13 @@ class NliSolver: | ||||
|         """ | ||||
|         return (1 - exp(- alpha * length)) / alpha | ||||
|  | ||||
|     def compute_nli(self, spectral_info: SpectralInformation): | ||||
|     @staticmethod | ||||
|     def compute_nli(spectral_info: SpectralInformation, srs: StimulatedRamanScattering, fiber): | ||||
|         """ Compute NLI power generated by the WDM comb `*carriers` on the channel under test `carrier` | ||||
|         at the end of the fiber span. | ||||
|         """ | ||||
|         logger.debug('Start computing fiber NLI noise') | ||||
|         # Physical fiber parameters | ||||
|         fiber = self._fiber | ||||
|         srs = self._stimulated_raman_scattering | ||||
|  | ||||
|         alpha = fiber.alpha(spectral_info.frequency) | ||||
|         beta2 = fiber.params.beta2 | ||||
|         beta3 = fiber.params.beta3 | ||||
| @@ -429,7 +330,7 @@ class NliSolver: | ||||
|         dispersion_tolerance = sim_params.nli_params.dispersion_tolerance | ||||
|         phase_shift_tolerance = sim_params.nli_params.phase_shift_tolerance | ||||
|         slot_width = max(spectral_info.slot_width) | ||||
|         delta_z = sim_params.raman_params.space_resolution | ||||
|         delta_z = sim_params.raman_params.result_spatial_resolution | ||||
|         spm_weight = (16.0 / 27.0) * gamma ** 2 | ||||
|         xpm_weight = 2 * (16.0 / 27.0) * gamma ** 2 | ||||
|         cuts = [carrier for carrier in spectral_info.carriers if carrier.channel_number | ||||
|   | ||||
| @@ -20,12 +20,12 @@ | ||||
|         "temperature": 283, | ||||
|         "raman_pumps": [ | ||||
|           { | ||||
|             "power": 200e-3, | ||||
|             "power": 224.403e-3, | ||||
|             "frequency": 205e12, | ||||
|             "propagation_direction": "counterprop" | ||||
|           }, | ||||
|           { | ||||
|             "power": 206e-3, | ||||
|             "power": 231.135e-3, | ||||
|             "frequency": 201e12, | ||||
|             "propagation_direction": "counterprop" | ||||
|           } | ||||
| @@ -49,6 +49,21 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "uid": "Fused1", | ||||
|       "type": "Fused", | ||||
|       "params": { | ||||
|         "loss": 0 | ||||
|       }, | ||||
|       "metadata": { | ||||
|         "location": { | ||||
|           "latitude": 1.5, | ||||
|           "longitude": 0, | ||||
|           "city": null, | ||||
|           "region": "" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "uid": "Edfa1", | ||||
|       "type": "Edfa", | ||||
| @@ -88,6 +103,10 @@ | ||||
|     }, | ||||
|     { | ||||
|       "from_node": "Span1", | ||||
|       "to_node": "Fused1" | ||||
|     }, | ||||
|     { | ||||
|       "from_node": "Fused1", | ||||
|       "to_node": "Edfa1" | ||||
|     }, | ||||
|     { | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| { | ||||
|   "raman_params": { | ||||
|     "flag": true, | ||||
|     "space_resolution": 10e3, | ||||
|     "tolerance": 1e-8 | ||||
|     "result_spatial_resolution": 10e3, | ||||
|     "solver_spatial_resolution": 50 | ||||
|   }, | ||||
|   "nli_params": { | ||||
|     "method": "ggn_spectrally_separated", | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| { | ||||
|   "raman_params": { | ||||
|     "flag": true, | ||||
|     "space_resolution": 10e3, | ||||
|     "tolerance": 1e-8 | ||||
|     "result_spatial_resolution": 10e3, | ||||
|     "solver_spatial_resolution": 50 | ||||
|   }, | ||||
|   "nli_params": { | ||||
|     "method": "ggn_spectrally_separated", | ||||
|   | ||||
| @@ -1,97 +1,97 @@ | ||||
| ,signal,ase,nli | ||||
| 0,0.0002869472910749756,3.829244288314411e-08,2.1570435023738975e-07 | ||||
| 1,0.0002844264441819097,3.810807396068084e-08,2.1799950841473497e-07 | ||||
| 2,0.00028192866252406385,3.792544000755193e-08,2.2023841125047751e-07 | ||||
| 3,0.0002794537215642667,3.7744517714620316e-08,2.2242189941355056e-07 | ||||
| 4,0.00027562432957345563,3.739256592350871e-08,2.2343448272115905e-07 | ||||
| 5,0.0002718482755003939,3.7044482870002475e-08,2.2437826192962336e-07 | ||||
| 6,0.00026812479793132313,3.670020704375223e-08,2.2525495466693408e-07 | ||||
| 7,0.000264450700138397,3.635954085714981e-08,2.2606415187873477e-07 | ||||
| 8,0.0002608253488030976,3.602242835595967e-08,2.2680748521505387e-07 | ||||
| 9,0.0002569046888856947,3.564392097524325e-08,2.2718285844823122e-07 | ||||
| 10,0.0002530414048172964,3.52696660940159e-08,2.2749429758474536e-07 | ||||
| 11,0.0002492279873569917,3.489974200864255e-08,2.277374766527899e-07 | ||||
| 12,0.00024546394589921574,3.453407358954537e-08,2.2791414400785136e-07 | ||||
| 13,0.00024174879169001578,3.4172586853993816e-08,2.280260208417818e-07 | ||||
| 14,0.00023798746912554602,3.3802283179520985e-08,2.2798420759778034e-07 | ||||
| 15,0.00023427697848580554,3.343627022987542e-08,2.2788101592695744e-07 | ||||
| 16,0.0002306167836320285,3.307447309241581e-08,2.2771816297650914e-07 | ||||
| 17,0.00022700656967539738,3.2716831574363364e-08,2.274975560288182e-07 | ||||
| 18,0.00022344579480967338,3.236327278261661e-08,2.2361822442592406e-07 | ||||
| 19,0.00021953361935365365,3.195819964288877e-08,2.1939761734541424e-07 | ||||
| 20,0.000215683131390894,3.155821693631402e-08,2.152494588710531e-07 | ||||
| 21,0.0002118936126056039,3.116322947665684e-08,2.1117277567387026e-07 | ||||
| 22,0.00020816423698459974,3.0773146233359933e-08,2.0716649124095414e-07 | ||||
| 23,0.000204494186708796,3.0387877710694614e-08,2.0322954179937734e-07 | ||||
| 24,0.0002011608152067422,3.0044038268833097e-08,1.9963693210325328e-07 | ||||
| 25,0.0001978756946189507,2.9704204306604607e-08,1.9610141536963302e-07 | ||||
| 26,0.00019463824873067792,2.9368307297032184e-08,1.9262221997374404e-07 | ||||
| 27,0.00019144860669288407,2.903632861769827e-08,1.8919927457566036e-07 | ||||
| 28,0.00018830616497929743,2.870820070744311e-08,1.8583178406705711e-07 | ||||
| 29,0.0001852103256336822,2.838385708911634e-08,1.8251896218718027e-07 | ||||
| 30,0.0001821604972098109,2.8063232252848876e-08,1.7926003240910756e-07 | ||||
| 31,0.00017915618670059162,2.774625963676283e-08,1.76054318231953e-07 | ||||
| 32,0.00017619680881745593,2.7432875871797347e-08,1.729010553429381e-07 | ||||
| 33,0.0001732817839023698,2.712301856538676e-08,1.6979948820365403e-07 | ||||
| 34,0.0001704966413678542,2.6828122477482957e-08,1.6683312331765736e-07 | ||||
| 35,0.00016775189226190024,2.6536528664560742e-08,1.639139770351803e-07 | ||||
| 36,0.00016504703499518105,2.624818226917535e-08,1.6104139135569604e-07 | ||||
| 37,0.00016238266779776653,2.5963117448579666e-08,1.5795381794641793e-07 | ||||
| 38,0.0001597582427278871,2.568127942199337e-08,1.5492098715709327e-07 | ||||
| 39,0.0001571732182027887,2.5402614261982925e-08,1.5194201541883415e-07 | ||||
| 40,0.00015462705891567335,2.5127068868391087e-08,1.4901603171959048e-07 | ||||
| 41,0.00015212101646395513,2.4854550603641668e-08,1.4614388817380648e-07 | ||||
| 42,0.00014965447757985992,2.4585009902449718e-08,1.4332463586635585e-07 | ||||
| 43,0.0001472268380950584,2.4318397887399997e-08,1.4055734193945962e-07 | ||||
| 44,0.0001447164668892332,2.4034551917480693e-08,1.377259000826997e-07 | ||||
| 45,0.00014224784112376056,2.3753930444781328e-08,1.3494914625940223e-07 | ||||
| 46,0.000139820283675003,2.3476479506890216e-08,1.3222606385781202e-07 | ||||
| 47,0.00013743418748444287,2.3202247900619965e-08,1.295566531341862e-07 | ||||
| 48,0.00013508884015386686,2.2931181973013504e-08,1.2693987096025158e-07 | ||||
| 49,0.00013278354172498307,2.2663228905058608e-08,1.2437469442130953e-07 | ||||
| 50,0.00013051760419724657,2.2398336706395863e-08,1.2186012017917007e-07 | ||||
| 51,0.00012829168984638487,2.2136423459712534e-08,1.1939640981689728e-07 | ||||
| 52,0.00012610506317956756,2.1877440279108582e-08,1.1698252030563078e-07 | ||||
| 53,0.00012395700285919374,2.1621338937233993e-08,1.1461743054419825e-07 | ||||
| 54,0.00012180241033650921,2.136015630373758e-08,1.1225922783040025e-07 | ||||
| 55,0.0001196865090578088,2.11019103466444e-08,1.0994951537260489e-07 | ||||
| 56,0.00011760857776205185,2.0846552296319304e-08,1.0757395097863843e-07 | ||||
| 57,0.00011556891128259512,2.0594154864038522e-08,1.0524972555992818e-07 | ||||
| 58,0.00011356676177304645,2.0344670536408355e-08,1.0297570549834491e-07 | ||||
| 59,0.00011160139690545148,2.009805268169949e-08,1.007507830554809e-07 | ||||
| 60,0.00010967209909252316,1.9854255584746143e-08,9.857387536569294e-08 | ||||
| 61,0.00010777915187088834,1.961321154131787e-08,9.644480679617587e-08 | ||||
| 62,0.00010592181397175025,1.9374877782865603e-08,9.43624842461164e-08 | ||||
| 63,0.00010409936038609485,1.913921236065976e-08,9.232584080120623e-08 | ||||
| 64,0.00010246447558376296,1.8936229484424864e-08,9.046927135292076e-08 | ||||
| 65,0.00010085803630103994,1.873544193319646e-08,8.865067925960422e-08 | ||||
| 66,9.927950010555374e-05,1.8536821682157304e-08,8.686925127148483e-08 | ||||
| 67,9.772837346090753e-05,1.834034757300294e-08,8.512422533827403e-08 | ||||
| 68,9.62041343011343e-05,1.8145993316507615e-08,8.341482250640209e-08 | ||||
| 69,9.470627135912848e-05,1.7953733512786736e-08,8.174028142913557e-08 | ||||
| 70,9.32342835979764e-05,1.776354374489084e-08,8.009985766376519e-08 | ||||
| 71,9.178813743816069e-05,1.757538990695628e-08,7.849321446941075e-08 | ||||
| 72,9.036733009485282e-05,1.7389250225057777e-08,7.691961625609573e-08 | ||||
| 73,8.897136946428169e-05,1.7205104136353174e-08,7.537834446343352e-08 | ||||
| 74,8.760740745801088e-05,1.7025340034280735e-08,7.38751341742058e-08 | ||||
| 75,8.626710469266231e-05,1.6847609082084475e-08,7.274492099364066e-08 | ||||
| 76,8.495000573672366e-05,1.6671897815367364e-08,7.16342744751107e-08 | ||||
| 77,8.365569697520734e-05,1.6498202874185357e-08,7.054284583689086e-08 | ||||
| 78,8.238374036673638e-05,1.6326516066391613e-08,6.94702656996508e-08 | ||||
| 79,8.11337070649851e-05,1.615683240442047e-08,6.84161724378069e-08 | ||||
| 80,7.990517700271111e-05,1.5989150837085435e-08,6.738021182875641e-08 | ||||
| 81,7.869784230919362e-05,1.5823472723367315e-08,6.63621242598539e-08 | ||||
| 82,7.751129541079501e-05,1.5659808141896922e-08,6.536156604375558e-08 | ||||
| 83,7.634513730458697e-05,1.5498175122781168e-08,6.437820072038669e-08 | ||||
| 84,7.530262080974513e-05,1.5364277079429572e-08,6.349909645089698e-08 | ||||
| 85,7.427675504203511e-05,1.523236493234819e-08,6.263403294276124e-08 | ||||
| 86,7.326723873728716e-05,1.510251249079146e-08,6.178275615432246e-08 | ||||
| 87,7.227232864620995e-05,1.4974078108462424e-08,6.094379608687809e-08 | ||||
| 88,7.1291797553153e-05,1.4847055996011248e-08,6.011696114034367e-08 | ||||
| 89,7.032542203609039e-05,1.4721440784517874e-08,5.930206291361685e-08 | ||||
| 90,6.937298231673965e-05,1.4597227547292096e-08,5.849891607818969e-08 | ||||
| 91,6.843339696762385e-05,1.447443282270653e-08,5.7706608718023645e-08 | ||||
| 92,6.750649045006057e-05,1.4353051811356354e-08,5.6924992809748396e-08 | ||||
| 93,6.65920896785063e-05,1.4233080214004659e-08,5.615392239860827e-08 | ||||
| 94,6.554258932109667e-05,1.407504972937325e-08,5.5268928972034444e-08 | ||||
| 95,6.450957734109368e-05,1.3918655180382722e-08,5.439783940506079e-08 | ||||
| 0,0.0002866683470642085,3.455694800734997e-08,2.1767706055953313e-07 | ||||
| 1,0.0002842930902246378,3.4445260342151434e-08,2.20064716108892e-07 | ||||
| 2,0.00028193841273409963,3.4334217950641774e-08,2.2239856929822977e-07 | ||||
| 3,0.0002796041237984927,3.422381587730477e-08,2.2467937700272344e-07 | ||||
| 4,0.00027589218358262,3.3956266402003705e-08,2.2576401766047814e-07 | ||||
| 5,0.0002722303444814487,3.3690926476196685e-08,2.2678094635121413e-07 | ||||
| 6,0.00026861791294303266,3.342777134334201e-08,2.2773179097640802e-07 | ||||
| 7,0.00026505174756069215,3.316675429137828e-08,2.2861602718115889e-07 | ||||
| 8,0.0002615312775878486,3.290785186664305e-08,2.294352005376256e-07 | ||||
| 9,0.0002577007690018081,3.26092154155734e-08,2.2987401053105823e-07 | ||||
| 10,0.00025392474812815994,3.231329178154223e-08,2.3024928325076607e-07 | ||||
| 11,0.0002501957390130402,3.201993265117851e-08,2.3055653947072044e-07 | ||||
| 12,0.0002465133077961936,3.172911082648897e-08,2.3079745224174315e-07 | ||||
| 13,0.00024287702172285261,3.144079924487205e-08,2.309736700807475e-07 | ||||
| 14,0.00023918644496802598,3.1142660565561954e-08,2.3099023972100006e-07 | ||||
| 15,0.00023554415781363666,3.084719002003063e-08,2.3094533745656626e-07 | ||||
| 16,0.0002319496781605366,3.0554358283826426e-08,2.3084061926161906e-07 | ||||
| 17,0.000228402746264896,3.026413819712743e-08,2.306779372506828e-07 | ||||
| 18,0.00022490287297566154,2.997650061885732e-08,2.2679314039447925e-07 | ||||
| 19,0.0002210339853226993,2.9639081336421986e-08,2.225476971173533e-07 | ||||
| 20,0.00021722472675673681,2.9305156366940595e-08,2.1837424228396343e-07 | ||||
| 21,0.00021347443350916938,2.8974683300060073e-08,2.1427183120915025e-07 | ||||
| 22,0.00020978233224910872,2.864761802749998e-08,2.1023941353936252e-07 | ||||
| 23,0.0002061476568412488,2.832391679540816e-08,2.0627595093585302e-07 | ||||
| 24,0.0002028237056285935,2.8034565895618217e-08,2.0263423697267893e-07 | ||||
| 25,0.00019954715529254185,2.7748013284124615e-08,1.9905015325521452e-07 | ||||
| 26,0.0001963174528000437,2.7464226779716075e-08,1.9552292765090665e-07 | ||||
| 27,0.00019313475803109547,2.718318103861899e-08,1.920525003885138e-07 | ||||
| 28,0.00018999848980183525,2.6904843987797665e-08,1.8863807494364378e-07 | ||||
| 29,0.00018690807208013476,2.6629183784477213e-08,1.852788635171717e-07 | ||||
| 30,0.00018386293497138034,2.635616888672288e-08,1.8197408797080072e-07 | ||||
| 31,0.0001808626075954048,2.608576967648626e-08,1.7872307155753016e-07 | ||||
| 32,0.00017790652540681915,2.5817954962418864e-08,1.7552504805064169e-07 | ||||
| 33,0.00017499412908771533,2.5552693765056307e-08,1.723792598876346e-07 | ||||
| 34,0.0001721914205512116,2.529821177538242e-08,1.69350416018518e-07 | ||||
| 35,0.00016942913344260413,2.5046172734840803e-08,1.663699885487624e-07 | ||||
| 36,0.0001667067703020692,2.4796549229968703e-08,1.6343730102750106e-07 | ||||
| 37,0.00016402494737034808,2.4549324625938814e-08,1.602954566731582e-07 | ||||
| 38,0.0001613831201060569,2.430447139995257e-08,1.5720933628441338e-07 | ||||
| 39,0.00015878075021906192,2.406196225171638e-08,1.541780421866172e-07 | ||||
| 40,0.00015621730558753943,2.3821770097360405e-08,1.5120068940449393e-07 | ||||
| 41,0.000153694061439545,2.3583901792213434e-08,1.4827814327673852e-07 | ||||
| 42,0.00015121040694331307,2.3348329147104765e-08,1.4540943949658482e-07 | ||||
| 43,0.00014876574026315321,2.3115024224465226e-08,1.425936300160931e-07 | ||||
| 44,0.00014623043935025647,2.2864250993313975e-08,1.397065102093322e-07 | ||||
| 45,0.00014373723010448477,2.2616046400344574e-08,1.3687531950007013e-07 | ||||
| 46,0.0001412854316913198,2.2370377299191064e-08,1.3409901704421416e-07 | ||||
| 47,0.00013887544742801196,2.2127221340618422e-08,1.313775961274423e-07 | ||||
| 48,0.0001365065605420479,2.1886545482453933e-08,1.2870998887773554e-07 | ||||
| 49,0.00013417806673897108,2.164831702445933e-08,1.2609514810979993e-07 | ||||
| 50,0.00013188927370907155,2.1412503578881085e-08,1.2353204666803017e-07 | ||||
| 51,0.00012964085531237725,2.117909919147538e-08,1.2102094138348867e-07 | ||||
| 52,0.00012743207116500861,2.094807084934547e-08,1.1856076487337955e-07 | ||||
| 53,0.0001252621950917354,2.0719385892834214e-08,1.161504721855161e-07 | ||||
| 54,0.00012308423338164536,2.0485363383535514e-08,1.1374627006340893e-07 | ||||
| 55,0.00012094535834842106,2.0253755300794944e-08,1.1139168040879032e-07 | ||||
| 56,0.00011884484242431182,2.0024527468430072e-08,1.0897675288127846e-07 | ||||
| 57,0.00011678298769107047,1.9797656169961167e-08,1.0661409941810817e-07 | ||||
| 58,0.0001147590394591346,1.9573107382367898e-08,1.0430256532408603e-07 | ||||
| 59,0.00011277225867179729,1.935084744632288e-08,1.0204102225018314e-07 | ||||
| 60,0.00011082192110664448,1.913084301808743e-08,9.982836715827351e-08 | ||||
| 61,0.00010890831555726861,1.8913080844667903e-08,9.76644171489201e-08 | ||||
| 62,0.00010703069380321927,1.8697527263494167e-08,9.554805889434612e-08 | ||||
| 63,0.00010518832400867466,1.8484148971365717e-08,9.347820572370307e-08 | ||||
| 64,0.00010353027948847247,1.8300360477604286e-08,9.158630538270034e-08 | ||||
| 65,0.00010190114820620951,1.8118339508838893e-08,8.97332684173061e-08 | ||||
| 66,0.00010030037817345079,1.7938063167097722e-08,8.791826040657302e-08 | ||||
| 67,9.872746699919663e-05,1.775950920143011e-08,8.614049912759125e-08 | ||||
| 68,9.718188342878233e-05,1.7582655209782296e-08,8.439918541238176e-08 | ||||
| 69,9.566310719955732e-05,1.740747903977101e-08,8.269353818341506e-08 | ||||
| 70,9.417062845393912e-05,1.7233958752991638e-08,8.102279372648069e-08 | ||||
| 71,9.27044102709892e-05,1.7062082036004708e-08,7.938660156523957e-08 | ||||
| 72,9.12639411274833e-05,1.6891826998956218e-08,7.778420731697601e-08 | ||||
| 73,8.984872036936478e-05,1.6723171993235663e-08,7.621487408851861e-08 | ||||
| 74,8.845926525396718e-05,1.6557077218868872e-08,7.467873241780861e-08 | ||||
| 75,8.709405706837696e-05,1.6392620086127443e-08,7.352620174175576e-08 | ||||
| 76,8.575262707251024e-05,1.6229781230847938e-08,7.239374499535451e-08 | ||||
| 77,8.44345490553445e-05,1.6068541919248203e-08,7.128100236441453e-08 | ||||
| 78,8.313937224726923e-05,1.5908883354530017e-08,7.018759330199112e-08 | ||||
| 79,8.18666553697718e-05,1.5750787028460176e-08,6.91131452736768e-08 | ||||
| 80,8.061596620368467e-05,1.5594234699428168e-08,6.80572933931087e-08 | ||||
| 81,7.93869860927298e-05,1.54392105845737e-08,6.701976864553917e-08 | ||||
| 82,7.81792957880057e-05,1.528569691328632e-08,6.600021709431229e-08 | ||||
| 83,7.69924848842345e-05,1.5133676199095668e-08,6.499829226870119e-08 | ||||
| 84,7.592423495462984e-05,1.5006007729453082e-08,6.40964585216171e-08 | ||||
| 85,7.487323130273564e-05,1.4879695488874347e-08,6.320918435915818e-08 | ||||
| 86,7.383915942693816e-05,1.475473179887786e-08,6.233620427401105e-08 | ||||
| 87,7.282024738915393e-05,1.4631093950979863e-08,6.147602236758762e-08 | ||||
| 88,7.181625694043332e-05,1.4508775744557438e-08,6.062843750629826e-08 | ||||
| 89,7.082695384072487e-05,1.4387771381868581e-08,5.979325194092954e-08 | ||||
| 90,6.985210770121701e-05,1.4268075471622408e-08,5.8970271173546604e-08 | ||||
| 91,6.889061932028676e-05,1.414966436041678e-08,5.8158567240485706e-08 | ||||
| 92,6.79423037538828e-05,1.4032534237451406e-08,5.7357984009008465e-08 | ||||
| 93,6.700697867481953e-05,1.3916681725635683e-08,5.656836755557654e-08 | ||||
| 94,6.594003301527265e-05,1.3765768410137306e-08,5.5667634894222326e-08 | ||||
| 95,6.489000516837228e-05,1.3616343300622314e-08,5.4781184522010985e-08 | ||||
|   | ||||
| 
 | 
| @@ -13,20 +13,20 @@ | ||||
|     "pmd_coef": 1.265e-15 | ||||
|   }, | ||||
|   "operational": { | ||||
|     "temperature": 283, | ||||
|     "raman_pumps": [ | ||||
|       { | ||||
|         "power": 0.2, | ||||
|         "frequency": 205000000000000, | ||||
|         "propagation_direction": "counterprop" | ||||
|         "temperature": 283, | ||||
|         "raman_pumps": [ | ||||
|           { | ||||
|             "power": 224.403e-3, | ||||
|             "frequency": 205e12, | ||||
|             "propagation_direction": "counterprop" | ||||
|           }, | ||||
|           { | ||||
|             "power": 231.135e-3, | ||||
|             "frequency": 201e12, | ||||
|             "propagation_direction": "counterprop" | ||||
|           } | ||||
|         ] | ||||
|       }, | ||||
|       { | ||||
|         "power": 0.206, | ||||
|         "frequency": 201000000000000, | ||||
|         "propagation_direction": "counterprop" | ||||
|       } | ||||
|     ] | ||||
|   }, | ||||
|   "metadata": { | ||||
|     "location": { | ||||
|       "latitude": 1, | ||||
|   | ||||
| @@ -21,109 +21,111 @@ RamanFiber          Span1 | ||||
|   total loss (dB):             17.00 | ||||
|   (includes conn loss (dB) in: 0.50 out: 0.50) | ||||
|   (conn loss out includes EOL margin defined in eqpt_config.json) | ||||
|   pch out (dBm): -7.74 | ||||
|   pch out (dBm): -7.71 | ||||
| Fused Fused1 | ||||
|   loss (dB): 0.00 | ||||
| Edfa Edfa1 | ||||
|   type_variety:           std_low_gain | ||||
|   effective gain(dB):     5.74 | ||||
|   effective gain(dB):     5.71 | ||||
|   (before att_in and before output VOA) | ||||
|   noise figure (dB):      13.26 | ||||
|   noise figure (dB):      13.29 | ||||
|   (including att_in) | ||||
|   pad att_in (dB):        2.26 | ||||
|   Power In (dBm):         11.07 | ||||
|   pad att_in (dB):        2.29 | ||||
|   Power In (dBm):         11.11 | ||||
|   Power Out (dBm):        16.82 | ||||
|   Delta_P (dB):           -2.00 | ||||
|   target pch (dBm):       -2.00 | ||||
|   effective pch (dBm):    -2.00 | ||||
|   output VOA (dB):        0.00 | ||||
| Transceiver Site_B | ||||
|   GSNR (0.1nm, dB):          31.43 | ||||
|   GSNR (signal bw, dB):      27.35 | ||||
|   OSNR ASE (0.1nm, dB):      34.18 | ||||
|   OSNR ASE (signal bw, dB):  30.10 | ||||
|   GSNR (0.1nm, dB):          31.44 | ||||
|   GSNR (signal bw, dB):      27.36 | ||||
|   OSNR ASE (0.1nm, dB):      34.22 | ||||
|   OSNR ASE (signal bw, dB):  30.14 | ||||
|   CD (ps/nm):                1336.00 | ||||
|   PMD (ps):                  0.36 | ||||
|  | ||||
| Transmission result for input power = 0.00 dBm: | ||||
|   Final GSNR (0.1 nm): [1;36;40m31.43 dB[0m | ||||
|   Final GSNR (0.1 nm): [1;36;40m31.44 dB[0m | ||||
|  | ||||
| The GSNR per channel at the end of the line is: | ||||
| Ch. #   Channel frequency (THz)       Channel power (dBm)    OSNR ASE (signal bw, dB)     SNR NLI (signal bw, dB)        GSNR (signal bw, dB) | ||||
|     1                    191.35                      0.21                       31.56                       31.47                       28.50 | ||||
|     2                    191.40                      0.17                       31.54                       31.38                       28.45 | ||||
|     3                    191.45                      0.14                       31.52                       31.30                       28.40 | ||||
|     4                    191.50                      0.10                       31.50                       31.22                       28.34 | ||||
|     5                    191.55                      0.04                       31.47                       31.14                       28.29 | ||||
|     6                    191.60                     -0.02                       31.44                       31.06                       28.23 | ||||
|     7                    191.65                     -0.08                       31.41                       30.98                       28.18 | ||||
|     8                    191.70                     -0.14                       31.37                       30.90                       28.12 | ||||
|     9                    191.75                     -0.20                       31.34                       30.83                       28.07 | ||||
|    10                    191.80                     -0.26                       31.31                       30.75                       28.01 | ||||
|    11                    191.85                     -0.33                       31.27                       30.68                       27.96 | ||||
|    12                    191.90                     -0.39                       31.24                       30.61                       27.90 | ||||
|    13                    191.95                     -0.46                       31.20                       30.54                       27.85 | ||||
|    14                    192.00                     -0.52                       31.17                       30.47                       27.79 | ||||
|    15                    192.05                     -0.59                       31.13                       30.40                       27.74 | ||||
|    16                    192.10                     -0.66                       31.10                       30.33                       27.69 | ||||
|    17                    192.15                     -0.72                       31.06                       30.27                       27.63 | ||||
|    18                    192.20                     -0.79                       31.02                       30.20                       27.58 | ||||
|    19                    192.25                     -0.86                       30.98                       30.21                       27.57 | ||||
|    20                    192.30                     -0.94                       30.94                       30.21                       27.55 | ||||
|    21                    192.35                     -1.01                       30.90                       30.22                       27.54 | ||||
|    22                    192.40                     -1.09                       30.86                       30.23                       27.52 | ||||
|    23                    192.45                     -1.16                       30.81                       30.23                       27.50 | ||||
|    24                    192.50                     -1.24                       30.77                       30.24                       27.49 | ||||
|    25                    192.55                     -1.31                       30.73                       30.25                       27.47 | ||||
|    26                    192.60                     -1.38                       30.69                       30.26                       27.46 | ||||
|    27                    192.65                     -1.45                       30.65                       30.26                       27.44 | ||||
|    28                    192.70                     -1.52                       30.61                       30.27                       27.42 | ||||
|    29                    192.75                     -1.59                       30.56                       30.28                       27.41 | ||||
|    30                    192.80                     -1.66                       30.52                       30.28                       27.39 | ||||
|    31                    192.85                     -1.73                       30.48                       30.29                       27.37 | ||||
|    32                    192.90                     -1.80                       30.44                       30.30                       27.36 | ||||
|    33                    192.95                     -1.87                       30.39                       30.31                       27.34 | ||||
|    34                    193.00                     -1.94                       30.35                       30.31                       27.32 | ||||
|    35                    193.05                     -2.01                       30.31                       30.32                       27.30 | ||||
|    36                    193.10                     -2.08                       30.27                       30.33                       27.29 | ||||
|    37                    193.15                     -2.15                       30.22                       30.33                       27.27 | ||||
|    38                    193.20                     -2.22                       30.18                       30.35                       27.26 | ||||
|    39                    193.25                     -2.29                       30.14                       30.37                       27.24 | ||||
|    40                    193.30                     -2.36                       30.09                       30.39                       27.23 | ||||
|    41                    193.35                     -2.43                       30.05                       30.40                       27.21 | ||||
|    42                    193.40                     -2.49                       30.01                       30.42                       27.20 | ||||
|    43                    193.45                     -2.56                       29.96                       30.44                       27.18 | ||||
|    44                    193.50                     -2.63                       29.92                       30.46                       27.17 | ||||
|    45                    193.55                     -2.70                       29.87                       30.47                       27.15 | ||||
|    46                    193.60                     -2.78                       29.83                       30.49                       27.14 | ||||
|    47                    193.65                     -2.85                       29.78                       30.51                       27.12 | ||||
|    48                    193.70                     -2.92                       29.73                       30.53                       27.10 | ||||
|    49                    193.75                     -2.99                       29.68                       30.55                       27.08 | ||||
|    50                    193.80                     -3.06                       29.64                       30.56                       27.06 | ||||
|    51                    193.85                     -3.14                       29.59                       30.58                       27.05 | ||||
|    52                    193.90                     -3.21                       29.54                       30.60                       27.03 | ||||
|    53                    193.95                     -3.28                       29.49                       30.62                       27.01 | ||||
|    54                    194.00                     -3.35                       29.44                       30.64                       26.99 | ||||
|    55                    194.05                     -3.42                       29.39                       30.66                       26.97 | ||||
|    56                    194.10                     -3.50                       29.34                       30.67                       26.95 | ||||
|    57                    194.15                     -3.57                       29.29                       30.73                       26.94 | ||||
|    58                    194.20                     -3.64                       29.24                       30.79                       26.94 | ||||
|    59                    194.25                     -3.72                       29.19                       30.85                       26.93 | ||||
|    60                    194.30                     -3.79                       29.14                       30.91                       26.93 | ||||
|    61                    194.35                     -3.86                       29.09                       30.97                       26.92 | ||||
|    62                    194.40                     -3.93                       29.04                       31.03                       26.91 | ||||
|    63                    194.45                     -4.01                       28.99                       31.09                       26.90 | ||||
|    64                    194.50                     -4.08                       28.94                       31.15                       26.90 | ||||
|    65                    194.55                     -4.14                       28.89                       31.22                       26.89 | ||||
|    66                    194.60                     -4.21                       28.85                       31.28                       26.89 | ||||
|    67                    194.65                     -4.28                       28.80                       31.35                       26.88 | ||||
|    68                    194.70                     -4.34                       28.75                       31.42                       26.87 | ||||
|    69                    194.75                     -4.41                       28.70                       31.48                       26.86 | ||||
|    70                    194.80                     -4.47                       28.66                       31.55                       26.86 | ||||
|    71                    194.85                     -4.54                       28.61                       31.62                       26.85 | ||||
|    72                    194.90                     -4.60                       28.56                       31.69                       26.84 | ||||
|    73                    194.95                     -4.67                       28.51                       31.77                       26.83 | ||||
|    74                    195.00                     -4.73                       28.47                       31.84                       26.82 | ||||
|    75                    195.05                     -4.80                       28.42                       31.92                       26.81 | ||||
|    76                    195.10                     -4.86                       28.37                       31.92                       26.78 | ||||
|     1                    191.35                      0.18                       31.61                       31.43                       28.51 | ||||
|     2                    191.40                      0.14                       31.59                       31.34                       28.45 | ||||
|     3                    191.45                      0.11                       31.57                       31.26                       28.40 | ||||
|     4                    191.50                      0.07                       31.55                       31.17                       28.35 | ||||
|     5                    191.55                      0.02                       31.52                       31.09                       28.29 | ||||
|     6                    191.60                     -0.04                       31.49                       31.02                       28.24 | ||||
|     7                    191.65                     -0.10                       31.46                       30.94                       28.18 | ||||
|     8                    191.70                     -0.16                       31.43                       30.86                       28.13 | ||||
|     9                    191.75                     -0.21                       31.40                       30.79                       28.07 | ||||
|    10                    191.80                     -0.28                       31.36                       30.71                       28.02 | ||||
|    11                    191.85                     -0.34                       31.33                       30.64                       27.96 | ||||
|    12                    191.90                     -0.40                       31.29                       30.57                       27.91 | ||||
|    13                    191.95                     -0.47                       31.26                       30.50                       27.85 | ||||
|    14                    192.00                     -0.53                       31.22                       30.43                       27.80 | ||||
|    15                    192.05                     -0.60                       31.18                       30.36                       27.74 | ||||
|    16                    192.10                     -0.66                       31.15                       30.30                       27.69 | ||||
|    17                    192.15                     -0.73                       31.11                       30.23                       27.64 | ||||
|    18                    192.20                     -0.79                       31.07                       30.16                       27.58 | ||||
|    19                    192.25                     -0.86                       31.04                       30.17                       27.57 | ||||
|    20                    192.30                     -0.94                       30.99                       30.18                       27.56 | ||||
|    21                    192.35                     -1.01                       30.95                       30.19                       27.54 | ||||
|    22                    192.40                     -1.08                       30.91                       30.20                       27.53 | ||||
|    23                    192.45                     -1.16                       30.86                       30.20                       27.51 | ||||
|    24                    192.50                     -1.23                       30.82                       30.21                       27.49 | ||||
|    25                    192.55                     -1.30                       30.78                       30.22                       27.48 | ||||
|    26                    192.60                     -1.37                       30.74                       30.23                       27.46 | ||||
|    27                    192.65                     -1.44                       30.70                       30.23                       27.45 | ||||
|    28                    192.70                     -1.51                       30.65                       30.24                       27.43 | ||||
|    29                    192.75                     -1.58                       30.61                       30.25                       27.42 | ||||
|    30                    192.80                     -1.65                       30.57                       30.26                       27.40 | ||||
|    31                    192.85                     -1.72                       30.53                       30.27                       27.38 | ||||
|    32                    192.90                     -1.79                       30.48                       30.27                       27.37 | ||||
|    33                    192.95                     -1.86                       30.44                       30.28                       27.35 | ||||
|    34                    193.00                     -1.93                       30.40                       30.29                       27.33 | ||||
|    35                    193.05                     -2.00                       30.35                       30.30                       27.32 | ||||
|    36                    193.10                     -2.07                       30.31                       30.30                       27.30 | ||||
|    37                    193.15                     -2.14                       30.27                       30.31                       27.28 | ||||
|    38                    193.20                     -2.20                       30.22                       30.33                       27.27 | ||||
|    39                    193.25                     -2.27                       30.18                       30.35                       27.25 | ||||
|    40                    193.30                     -2.34                       30.14                       30.37                       27.24 | ||||
|    41                    193.35                     -2.41                       30.09                       30.38                       27.23 | ||||
|    42                    193.40                     -2.48                       30.05                       30.40                       27.21 | ||||
|    43                    193.45                     -2.55                       30.00                       30.42                       27.20 | ||||
|    44                    193.50                     -2.61                       29.96                       30.44                       27.18 | ||||
|    45                    193.55                     -2.69                       29.91                       30.46                       27.16 | ||||
|    46                    193.60                     -2.76                       29.86                       30.47                       27.15 | ||||
|    47                    193.65                     -2.83                       29.82                       30.49                       27.13 | ||||
|    48                    193.70                     -2.90                       29.77                       30.51                       27.11 | ||||
|    49                    193.75                     -2.98                       29.72                       30.53                       27.10 | ||||
|    50                    193.80                     -3.05                       29.67                       30.55                       27.08 | ||||
|    51                    193.85                     -3.12                       29.62                       30.57                       27.06 | ||||
|    52                    193.90                     -3.19                       29.58                       30.58                       27.04 | ||||
|    53                    193.95                     -3.26                       29.53                       30.60                       27.02 | ||||
|    54                    194.00                     -3.33                       29.48                       30.62                       27.00 | ||||
|    55                    194.05                     -3.41                       29.43                       30.64                       26.98 | ||||
|    56                    194.10                     -3.48                       29.38                       30.66                       26.96 | ||||
|    57                    194.15                     -3.55                       29.33                       30.72                       26.96 | ||||
|    58                    194.20                     -3.63                       29.28                       30.78                       26.95 | ||||
|    59                    194.25                     -3.70                       29.23                       30.83                       26.95 | ||||
|    60                    194.30                     -3.77                       29.18                       30.89                       26.94 | ||||
|    61                    194.35                     -3.85                       29.12                       30.96                       26.93 | ||||
|    62                    194.40                     -3.92                       29.07                       31.02                       26.93 | ||||
|    63                    194.45                     -3.99                       29.02                       31.08                       26.92 | ||||
|    64                    194.50                     -4.06                       28.97                       31.14                       26.91 | ||||
|    65                    194.55                     -4.13                       28.92                       31.21                       26.91 | ||||
|    66                    194.60                     -4.19                       28.88                       31.27                       26.90 | ||||
|    67                    194.65                     -4.26                       28.83                       31.34                       26.89 | ||||
|    68                    194.70                     -4.33                       28.78                       31.41                       26.89 | ||||
|    69                    194.75                     -4.39                       28.73                       31.47                       26.88 | ||||
|    70                    194.80                     -4.46                       28.68                       31.54                       26.87 | ||||
|    71                    194.85                     -4.52                       28.64                       31.61                       26.86 | ||||
|    72                    194.90                     -4.59                       28.59                       31.68                       26.86 | ||||
|    73                    194.95                     -4.65                       28.54                       31.76                       26.85 | ||||
|    74                    195.00                     -4.72                       28.49                       31.83                       26.84 | ||||
|    75                    195.05                     -4.78                       28.44                       31.91                       26.83 | ||||
|    76                    195.10                     -4.85                       28.39                       31.91                       26.79 | ||||
|  | ||||
| (No source node specified: picked Site_A) | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user