mirror of
				https://github.com/Telecominfraproject/oopt-gnpy.git
				synced 2025-10-31 18:18:00 +00:00 
			
		
		
		
	Refactoring: conversion functions instead of gnpy.core.units.UNITS
The TL;DR behind this patch is that it's better to have a utility conversion function instead of having multiplier LUT and open code which implements the conversion. The FiberParams handling looked fishy -- apparently, it was keeping the multiplier around, but it was unconditionally setting the units to meters, anyway. Given that the units were not being preserved anyway (everything got converted to meters), and that the multipler was not used anywhere, let's refactor the code to just convert to meters using our new utility function, and remove the unused argument. Change-Id: Id886d409a4046f980eed569265baefd97db841bd
This commit is contained in:
		| @@ -12,5 +12,4 @@ | ||||
| .. automodule:: gnpy.core.science_utils | ||||
| .. automodule:: gnpy.core.service_sheet | ||||
| .. automodule:: gnpy.core.spectrum_assignment | ||||
| .. automodule:: gnpy.core.units | ||||
| .. automodule:: gnpy.core.utils | ||||
|   | ||||
| @@ -17,8 +17,7 @@ from gnpy.core import ansi_escapes, elements | ||||
| from gnpy.core.elements import Fiber, Edfa, Transceiver, Roadm, Fused | ||||
| from gnpy.core.equipment import edfa_nf | ||||
| from gnpy.core.exceptions import ConfigurationError, NetworkTopologyError | ||||
| from gnpy.core.units import UNITS | ||||
| from gnpy.core.utils import (load_json, save_json, round2float, merge_amplifier_restrictions) | ||||
| from gnpy.core.utils import load_json, save_json, round2float, merge_amplifier_restrictions, convert_length | ||||
| from gnpy.tools.convert import convert_file | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -515,7 +514,7 @@ def add_fiber_padding(network, fibers, padding): | ||||
|  | ||||
| def build_network(network, equipment, pref_ch_db, pref_total_db): | ||||
|     default_span_data = equipment['Span']['default'] | ||||
|     max_length = int(default_span_data.max_length * UNITS[default_span_data.length_units]) | ||||
|     max_length = int(convert_length(default_span_data.max_length, default_span_data.length_units)) | ||||
|     min_length = max(int(default_span_data.padding / 0.2 * 1e3), 50_000) | ||||
|     bounds = range(min_length, max_length) | ||||
|     target_length = max(min_length, 90_000) | ||||
|   | ||||
| @@ -14,8 +14,7 @@ from scipy.constants import c, pi | ||||
| from numpy import squeeze, log10, exp | ||||
|  | ||||
|  | ||||
| from gnpy.core.units import UNITS | ||||
| from gnpy.core.utils import db2lin | ||||
| from gnpy.core.utils import db2lin, convert_length | ||||
| from gnpy.core.exceptions import ParametersError | ||||
|  | ||||
|  | ||||
| @@ -142,9 +141,7 @@ class SimParams(Parameters): | ||||
| class FiberParams(Parameters): | ||||
|     def __init__(self, **kwargs): | ||||
|         try: | ||||
|             self._length_units_factor = UNITS[kwargs['length_units']] | ||||
|             self._length = kwargs['length'] * self._length_units_factor  # m | ||||
|             self._length_units = 'm' | ||||
|             self._length = convert_length(kwargs['length'], kwargs['length_units']) | ||||
|             # fixed attenuator for padding | ||||
|             self._att_in = kwargs['att_in'] if 'att_in' in kwargs else 0 | ||||
|             # if not defined in the network json connector loss in/out | ||||
| @@ -190,14 +187,6 @@ class FiberParams(Parameters): | ||||
|         """length must be in m""" | ||||
|         self._length = length | ||||
|  | ||||
|     @property | ||||
|     def length_units(self): | ||||
|         return self._length_units | ||||
|  | ||||
|     @property | ||||
|     def length_units_factor(self): | ||||
|         return self._length_units_factor | ||||
|  | ||||
|     @property | ||||
|     def att_in(self): | ||||
|         return self._att_in | ||||
| @@ -281,4 +270,5 @@ class FiberParams(Parameters): | ||||
|     def asdict(self): | ||||
|         dictionary = super().asdict() | ||||
|         dictionary['loss_coef'] = self.loss_coef * 1e3 | ||||
|         dictionary['length_units'] = 'm' | ||||
|         return dictionary | ||||
|   | ||||
| @@ -1,5 +0,0 @@ | ||||
| #!/usr/bin/env python3 | ||||
| # -*- coding: utf-8 -*- | ||||
|  | ||||
| UNITS = {'m': 1, | ||||
|          'km': 1E3} | ||||
| @@ -15,6 +15,7 @@ from csv import writer | ||||
| import numpy as np | ||||
| from numpy import pi, cos, sqrt, log10 | ||||
| from scipy import constants | ||||
| from gnpy.core.exceptions import ConfigurationError | ||||
|  | ||||
|  | ||||
| def load_json(filename): | ||||
| @@ -282,3 +283,29 @@ def automatic_fmax(f_min, spacing, nch): | ||||
|     196125000000000.0 | ||||
|     """ | ||||
|     return f_min + spacing * nch | ||||
|  | ||||
|  | ||||
| def convert_length(value, units): | ||||
|     """Convert length into basic SI units | ||||
|  | ||||
|     >>> convert_length(1, 'km') | ||||
|     1000.0 | ||||
|     >>> convert_length(2.0, 'km') | ||||
|     2000.0 | ||||
|     >>> convert_length(123, 'm') | ||||
|     123.0 | ||||
|     >>> convert_length(123.0, 'm') | ||||
|     123.0 | ||||
|     >>> convert_length(42.1, 'km') | ||||
|     42100.0 | ||||
|     >>> convert_length(666, 'yards') | ||||
|     Traceback (most recent call last): | ||||
|         ... | ||||
|     gnpy.core.exceptions.ConfigurationError: Cannot convert length in "yards" into meters | ||||
|     """ | ||||
|     if units == 'm': | ||||
|         return value * 1e0 | ||||
|     elif units == 'km': | ||||
|         return value * 1e3 | ||||
|     else: | ||||
|         raise ConfigurationError(f'Cannot convert length in "{units}" into meters') | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Jan Kundrát
					Jan Kundrát