mirror of
				https://github.com/Telecominfraproject/oopt-gnpy.git
				synced 2025-10-31 01:57:54 +00:00 
			
		
		
		
	Compare commits
	
		
			23 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | c35104c184 | ||
|   | 7b1354ee24 | ||
|   | 39d3f0f483 | ||
|   | bbe9ef7356 | ||
|   | 42a8f018cd | ||
|   | 29f5dd1dc4 | ||
|   | 03da959724 | ||
|   | f621ca6fe7 | ||
|   | 24f4503020 | ||
|   | 520c3615e4 | ||
|   | 548626a9f2 | ||
|   | 7a26833a5a | ||
|   | c2f6f9c6a0 | ||
|   | 64a91256fc | ||
|   | bdcffc2a5e | ||
|   | c384af8062 | ||
|   | 0813332adc | ||
|   | 22fe9ead55 | ||
|   | 920ac30aa5 | ||
|   | ac8fd770ab | ||
|   | 5277ae2005 | ||
|   | 30ead40e76 | ||
|   | ae858b911a | 
							
								
								
									
										217
									
								
								docs/json.rst
									
									
									
									
									
								
							
							
						
						
									
										217
									
								
								docs/json.rst
									
									
									
									
									
								
							| @@ -19,7 +19,7 @@ EDFA | |||||||
| ~~~~ | ~~~~ | ||||||
|  |  | ||||||
| The EDFA equipment library is a list of supported amplifiers. New amplifiers | The EDFA equipment library is a list of supported amplifiers. New amplifiers | ||||||
| can be added and existing ones removed. Three different noise models are available: | can be added and existing ones removed. Various noise models are available. | ||||||
|  |  | ||||||
| 1. ``'type_def': 'variable_gain'`` is a simplified model simulating a 2-coil EDFA with internal, input and output VOAs. | 1. ``'type_def': 'variable_gain'`` is a simplified model simulating a 2-coil EDFA with internal, input and output VOAs. | ||||||
|    The NF vs gain response is calculated accordingly based on the input parameters: ``nf_min``, ``nf_max``, and ``gain_flatmax``. |    The NF vs gain response is calculated accordingly based on the input parameters: ``nf_min``, ``nf_max``, and ``gain_flatmax``. | ||||||
| @@ -35,8 +35,12 @@ can be added and existing ones removed. Three different noise models are availab | |||||||
|    A detailed JSON configuration file is required (by default `gnpy/example-data/std_medium_gain_advanced_config.json <https://github.com/Telecominfraproject/oopt-gnpy/blob/master/gnpy/example-data/std_medium_gain_advanced_config.json>`_). |    A detailed JSON configuration file is required (by default `gnpy/example-data/std_medium_gain_advanced_config.json <https://github.com/Telecominfraproject/oopt-gnpy/blob/master/gnpy/example-data/std_medium_gain_advanced_config.json>`_). | ||||||
|    It uses a 3rd order polynomial where NF = f(gain), NF_ripple = f(frequency), gain_ripple = f(frequency), N-array dgt = f(frequency). |    It uses a 3rd order polynomial where NF = f(gain), NF_ripple = f(frequency), gain_ripple = f(frequency), N-array dgt = f(frequency). | ||||||
|    Compared to the previous models, NF ripple and gain ripple are modelled. |    Compared to the previous models, NF ripple and gain ripple are modelled. | ||||||
|  | 6. ``'type_def': 'multi_band'`` defines an amplifier type corresponding to an amplification site composed of multiple amplifier elements, where each amplifies a different band of the spectrum. | ||||||
|  |    The ``amplifiers`` list contains the list of single-band amplifier type varieties that can compose such multiband | ||||||
|  |    amplifiers. Several options can be listed for the same spectrum band. Only one can be selected | ||||||
|  |    for the actual :ref:`Multiband_amplifier<multiband_amps>` element. | ||||||
|  |  | ||||||
| For all amplifier models: | For all single band amplifier models: | ||||||
|  |  | ||||||
| +------------------------+-----------+-----------------------------------------+ | +------------------------+-----------+-----------------------------------------+ | ||||||
| | field                  |   type    | description                             | | | field                  |   type    | description                             | | ||||||
| @@ -55,6 +59,30 @@ For all amplifier models: | |||||||
| |                        |           | be used as a manual input (from JSON or | | |                        |           | be used as a manual input (from JSON or | | ||||||
| |                        |           | Excel template topology files.)         | | |                        |           | Excel template topology files.)         | | ||||||
| +------------------------+-----------+-----------------------------------------+ | +------------------------+-----------+-----------------------------------------+ | ||||||
|  | | ``f_min``              | (number)  | Optional. In :math:`Hz`. Minimum and    | | ||||||
|  | | and ``f_max``          |           | maximum frequency range for the         | | ||||||
|  | |                        |           | amplifier. Signal must fit entirely     | | ||||||
|  | |                        |           | within this range (center frequency and | | ||||||
|  | |                        |           | spectrum width).                        | | ||||||
|  | |                        |           | Default is 191.275e-12 Hz and           | | ||||||
|  | |                        |           | 196.125e-12 (tunable in                 | | ||||||
|  | |                        |           | default_edfa_config.json)               | | ||||||
|  | +------------------------+-----------+-----------------------------------------+ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | For multi_band amplifier models: | ||||||
|  |  | ||||||
|  | +------------------------+-----------+-----------------------------------------+ | ||||||
|  | | field                  |   type    | description                             | | ||||||
|  | +========================+===========+=========================================+ | ||||||
|  | | ``type_variety``       | (string)  | A unique name to ID the amplifier in the| | ||||||
|  | |                        |           | JSON template topology input file.      | | ||||||
|  | +------------------------+-----------+-----------------------------------------+ | ||||||
|  | | ``allowed_for_design`` | (boolean) | If false, the amplifier will not be     | | ||||||
|  | |                        |           | picked by auto-design but it can still  | | ||||||
|  | |                        |           | be used as a manual input (from JSON or | | ||||||
|  | |                        |           | Excel template topology files.)         | | ||||||
|  | +------------------------+-----------+-----------------------------------------+ | ||||||
|  |  | ||||||
| Fiber | Fiber | ||||||
| ~~~~~ | ~~~~~ | ||||||
| @@ -447,14 +475,14 @@ Here is an example: | |||||||
|       "uid": "roadm SITE1", |       "uid": "roadm SITE1", | ||||||
|       "type": "Roadm", |       "type": "Roadm", | ||||||
|       "type_variety": "detailed_impairments", |       "type_variety": "detailed_impairments", | ||||||
| 	    "params": { |       "params": { | ||||||
| 		    "per_degree_impairments": [ |         "per_degree_impairments": [ | ||||||
| 		    { |         { | ||||||
| 			    "from_degree": "trx SITE1", |           "from_degree": "trx SITE1", | ||||||
| 		      "to_degree": "east edfa in SITE1 to ILA1", |           "to_degree": "east edfa in SITE1 to ILA1", | ||||||
| 			    "impairment_id": 1 |           "impairment_id": 1 | ||||||
| 		    }] |         }] | ||||||
| 	    } |       } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| It is not permitted to use a roadm-path-impairment-id for the wrong roadm path type (add impairment only for add path). | It is not permitted to use a roadm-path-impairment-id for the wrong roadm path type (add impairment only for add path). | ||||||
| @@ -492,6 +520,19 @@ See ``delta_power_range_db`` for more explaination. | |||||||
| |                                             |           | mandatory when Raman amplification is       | | |                                             |           | mandatory when Raman amplification is       | | ||||||
| |                                             |           | included in the simulation                  | | |                                             |           | included in the simulation                  | | ||||||
| +---------------------------------------------+-----------+---------------------------------------------+ | +---------------------------------------------+-----------+---------------------------------------------+ | ||||||
|  | | ``raman_params.method``                     | (string)  | Model used for Raman evaluation. Valid      | | ||||||
|  | |                                             |           | choices are ``perturbative`` (see           | | ||||||
|  | |                                             |           | `arXiv:2304.11756                           | | ||||||
|  | |                                             |           | <https://arxiv.org/abs/2304.11756>`_) and   | | ||||||
|  | |                                             |           | ``numerical``, the GNPy legacy first order  | | ||||||
|  | |                                             |           | derivative numerical solution.              | | ||||||
|  | +---------------------------------------------+-----------+---------------------------------------------+ | ||||||
|  | |``raman_params.order``                       |           | Order of the perturbative expansion.        | | ||||||
|  | |                                             |           | For C- and C+L-band transmission scenarios  | | ||||||
|  | |                                             |           | the second order provides high accuracy     | | ||||||
|  | |                                             |           | considering common values of fiber input    | | ||||||
|  | |                                             |           | power. (Default is 2)                       | | ||||||
|  | +---------------------------------------------+-----------+---------------------------------------------+ | ||||||
| | ``raman_params.result_spatial_resolution``  | (number)  | Spatial resolution of the output            | | | ``raman_params.result_spatial_resolution``  | (number)  | Spatial resolution of the output            | | ||||||
| |                                             |           | Raman profile along the entire fiber span.  | | |                                             |           | Raman profile along the entire fiber span.  | | ||||||
| |                                             |           | This affects the accuracy and the           | | |                                             |           | This affects the accuracy and the           | | ||||||
| @@ -503,11 +544,18 @@ See ``delta_power_range_db`` for more explaination. | |||||||
| |                                             |           | channel around 0 dBm, a suggested value of  | | |                                             |           | channel around 0 dBm, a suggested value of  | | ||||||
| |                                             |           | spatial resolution is 10e3 m                | | |                                             |           | spatial resolution is 10e3 m                | | ||||||
| +---------------------------------------------+-----------+---------------------------------------------+ | +---------------------------------------------+-----------+---------------------------------------------+ | ||||||
| | ``raman_params.solver_spatial_resolution``  | (number)  | Spatial step for the iterative solution     | | | ``raman_params.solver_spatial_resolution``  | (number)  | When using the ``perturbative`` method,     | | ||||||
| |                                             |           | of the first order differential equation    | | |                                             |           | the step for the spatial integration does   | | ||||||
| |                                             |           | used to calculate the Raman profile         | | |                                             |           | not affect the first order. Therefore, a    | | ||||||
| |                                             |           | along the entire fiber span.                | | |                                             |           | large step can be used when no              | | ||||||
| |                                             |           | This affects the accuracy and the           | | |                                             |           | counter-propagating Raman amplification is  | | ||||||
|  | |                                             |           | present; a suggested value is 10e3 m.       | | ||||||
|  | |                                             |           | In presence of counter-propagating Raman    | | ||||||
|  | |                                             |           | amplification or when using the             | | ||||||
|  | |                                             |           | ``numerical`` method the following remains  | | ||||||
|  | |                                             |           | valid.                                      | | ||||||
|  | |                                             |           | The spatial step for the iterative solution | | ||||||
|  | |                                             |           | affects the accuracy and the                | | ||||||
| |                                             |           | computational time of the evaluated         | | |                                             |           | computational time of the evaluated         | | ||||||
| |                                             |           | Raman profile:                              | | |                                             |           | Raman profile:                              | | ||||||
| |                                             |           | smaller the spatial resolution higher both  | | |                                             |           | smaller the spatial resolution higher both  | | ||||||
| @@ -523,6 +571,10 @@ See ``delta_power_range_db`` for more explaination. | |||||||
| |                                             |           | ``ggn_spectrally_separated`` (see eq. 21    | | |                                             |           | ``ggn_spectrally_separated`` (see eq. 21    | | ||||||
| |                                             |           | from `arXiv:1710.02225                      | | |                                             |           | from `arXiv:1710.02225                      | | ||||||
| |                                             |           | <https://arxiv.org/abs/1710.02225>`_).      | | |                                             |           | <https://arxiv.org/abs/1710.02225>`_).      | | ||||||
|  | |                                             |           | ``ggn_approx`` (see eq. 24-25               | | ||||||
|  | |                                             |           | from `jlt:9741324                           | | ||||||
|  | |                                             |           | <https://eeexplore.ieee.org/document/       | | ||||||
|  | |                                             |           | 9741324>`_).                                | | ||||||
| +---------------------------------------------+-----------+---------------------------------------------+ | +---------------------------------------------+-----------+---------------------------------------------+ | ||||||
| | ``dispersion_tolerance``                    | (number)  | Optional. Pure number. Tuning parameter for | | | ``dispersion_tolerance``                    | (number)  | Optional. Pure number. Tuning parameter for | | ||||||
| |                                             |           | ggn model solution. Default value is 1.     | | |                                             |           | ggn model solution. Default value is 1.     | | ||||||
| @@ -727,6 +779,10 @@ In the simplest case, homogeneous channel allocation can be defined via the ``Sp | |||||||
| +----------------------+-----------+-------------------------------------------+ | +----------------------+-----------+-------------------------------------------+ | ||||||
| | field                |   type    | description                               | | | field                |   type    | description                               | | ||||||
| +======================+===========+===========================================+ | +======================+===========+===========================================+ | ||||||
|  | | ``type_variety``     | (string)  | Optional. Default: ``default``            | | ||||||
|  | |                      |           | A unique name to ID the band for          | | ||||||
|  | |                      |           | propagation or design.                    | | ||||||
|  | +----------------------+-----------+-------------------------------------------+ | ||||||
| | ``f_min``,           | (number)  | In Hz. Define spectrum boundaries. Note   | | | ``f_min``,           | (number)  | In Hz. Define spectrum boundaries. Note   | | ||||||
| | ``f_max``            |           | that due to backward compatibility, the   | | | ``f_max``            |           | that due to backward compatibility, the   | | ||||||
| |                      |           | first channel central frequency is placed | | |                      |           | first channel central frequency is placed | | ||||||
| @@ -793,6 +849,13 @@ In the simplest case, homogeneous channel allocation can be defined via the ``Sp | |||||||
| |                      |           | transceiver OSNR.                         | | |                      |           | transceiver OSNR.                         | | ||||||
| +----------------------+-----------+-------------------------------------------+ | +----------------------+-----------+-------------------------------------------+ | ||||||
|  |  | ||||||
|  | It is possible to define a set of bands in the SI block. In this case, type_variety must be used. | ||||||
|  | Each set defines a reference channel used for design functions and autodesign processes. | ||||||
|  |  | ||||||
|  | If no spectrum is defined (--spectrum or --services), then the same type of reference channel is | ||||||
|  | also used for simulation. | ||||||
|  |  | ||||||
|  |  | ||||||
| .. _mixed-rate: | .. _mixed-rate: | ||||||
|  |  | ||||||
| Arbitrary channel definition | Arbitrary channel definition | ||||||
| @@ -843,7 +906,7 @@ For example this example: | |||||||
| .. code-block:: json | .. code-block:: json | ||||||
|  |  | ||||||
|  { |  { | ||||||
|    "SI":[ |    "spectrum":[ | ||||||
|      { |      { | ||||||
|        "f_min": 191.4e12, |        "f_min": 191.4e12, | ||||||
|        "f_max":193.1e12, |        "f_max":193.1e12, | ||||||
| @@ -854,7 +917,7 @@ For example this example: | |||||||
|      }, |      }, | ||||||
|      { |      { | ||||||
|        "f_min": 193.1625e12, |        "f_min": 193.1625e12, | ||||||
|        "f_max":195e12, |        "f_max": 195e12, | ||||||
|        "baud_rate": 64e9, |        "baud_rate": 64e9, | ||||||
|        "delta_pdb": 3, |        "delta_pdb": 3, | ||||||
|        "slot_width": 75e9, |        "slot_width": 75e9, | ||||||
| @@ -1100,6 +1163,8 @@ the maximum achievable total power. | |||||||
|  |  | ||||||
| The exact layout used by simulation can be retrieved thanks to --save-network option. | The exact layout used by simulation can be retrieved thanks to --save-network option. | ||||||
|  |  | ||||||
|  | .. _operational_field: | ||||||
|  |  | ||||||
| +----------------------+-----------+--------------------------------------------------+ | +----------------------+-----------+--------------------------------------------------+ | ||||||
| | field                |   type    | description                                      | | | field                |   type    | description                                      | | ||||||
| +======================+===========+==================================================+ | +======================+===========+==================================================+ | ||||||
| @@ -1155,6 +1220,63 @@ The exact layout used by simulation can be retrieved thanks to --save-network op | |||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | .. _multiband_amps: | ||||||
|  |  | ||||||
|  | Multiband_amplifier attributes | ||||||
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
|  |  | ||||||
|  | +----------------------+-----------+--------------------------------------------------+ | ||||||
|  | | field                |   type    | description                                      | | ||||||
|  | +======================+===========+==================================================+ | ||||||
|  | | ``type``             | (string)  | Mandatory: ``Multiband_amplifier``               | | ||||||
|  | +----------------------+-----------+--------------------------------------------------+ | ||||||
|  | | ``type_variety``     | (string)  | Optional, value must be listed in the library    | | ||||||
|  | |                      |           | to be a valid type. If not defined, autodesign   | | ||||||
|  | |                      |           | will pick one in the library among the           | | ||||||
|  | |                      |           | ``allowed_for_design``.                          | | ||||||
|  | +----------------------+-----------+--------------------------------------------------+ | ||||||
|  | | ``amplifiers``       | (list of  | Optional, configuration settings of the          | | ||||||
|  | |                      |  dict)    | amplifiers composing the multiband amplifier.    | | ||||||
|  | |                      |           | Single band amplifier can be set with the        | | ||||||
|  | |                      |           | parameters of tables:                            | | ||||||
|  | |                      |           | :ref:`operational_field<operational_field>`:     | | ||||||
|  | +----------------------+-----------+--------------------------------------------------+ | ||||||
|  |  | ||||||
|  | Example of Multiband_amplifier element setting: | ||||||
|  |  | ||||||
|  |     .. code-block:: json | ||||||
|  |  | ||||||
|  |       { | ||||||
|  |           "uid": "east edfa in Site_A to Site_B", | ||||||
|  |           "type": "Multiband_amplifier", | ||||||
|  |           "type_variety": "std_medium_gain_multiband", | ||||||
|  |           "amplifiers": [{ | ||||||
|  |                   "type_variety": "std_medium_gain_C", | ||||||
|  |                   "operational": { | ||||||
|  |                       "gain_target": 22.55, | ||||||
|  |                       "delta_p": 0.9, | ||||||
|  |                       "out_voa": 3.0, | ||||||
|  |                       "tilt_target": 0.0 | ||||||
|  |                   } | ||||||
|  |               }, { | ||||||
|  |                   "type_variety": "std_medium_gain_L", | ||||||
|  |                   "operational": { | ||||||
|  |                       "gain_target": 21, | ||||||
|  |                       "delta_p": 3.0, | ||||||
|  |                       "out_voa": 3.0, | ||||||
|  |                       "tilt_target": 0.0 | ||||||
|  |                   } | ||||||
|  |               } | ||||||
|  |           ] | ||||||
|  |       } | ||||||
|  |  | ||||||
|  | The frequency band of the element is the concatenation of the bands of each individual amplifier contained in | ||||||
|  | the Multiband_amplifier element. Only carriers within these bands are propagated through the Multiband_amplifier | ||||||
|  | element. If the user defines a spectrum larger than these bands, carriers that do not match the bands will be | ||||||
|  | filtered out. The user can define the bandwidth of the amplifiers in the library. f_min and f_max represent the | ||||||
|  | bandwidth of the amplifier (the entire channel must fit). The individual amplifier type_variety must be part of the | ||||||
|  | allowed ``amplifiers`` list defined in the library. | ||||||
|  |  | ||||||
| Roadm | Roadm | ||||||
| ~~~~~ | ~~~~~ | ||||||
|  |  | ||||||
| @@ -1186,32 +1308,69 @@ Roadm | |||||||
| |                                        |  dict)    | defined, it overrides the general values defined   | | |                                        |  dict)    | defined, it overrides the general values defined   | | ||||||
| |                                        |           | by type_variety.                                   | | |                                        |           | by type_variety.                                   | | ||||||
| +----------------------------------------+-----------+----------------------------------------------------+ | +----------------------------------------+-----------+----------------------------------------------------+ | ||||||
|  | | ``design_bands``                       | (list of  | Optional. List of bands expressed as dictionnary,  | | ||||||
|  | |                                        |  dict)    | e.g. {"f_min": 191.3e12, "f_max": 195.1e12}        | | ||||||
|  | |                                        |           | To be considered for autodesign on all degrees of  | | ||||||
|  | |                                        |           | the ROADM, if nothing is defined on the degrees.   | | ||||||
|  | +----------------------------------------+-----------+----------------------------------------------------+ | ||||||
|  | | ``per_degree_design_bands``            | (dict of  | Optional. If defined, it overrides ROADM's general | | ||||||
|  | |                                        |  string,  | design_bands, on the degree identified with the    | | ||||||
|  | |                                        |  list of  | key string. Value is a list of bands defined by    | | ||||||
|  | |                                        |  dict)    | their frequency bounds ``f_min`` and ``f_max``     | | ||||||
|  | |                                        |           | expressed in THz.                                  | | ||||||
|  | +----------------------------------------+-----------+----------------------------------------------------+ | ||||||
|  |  | ||||||
|  |  | ||||||
| Definition example: | Definition example: | ||||||
|  |  | ||||||
| .. code-block:: json |   .. code-block:: json | ||||||
|  |  | ||||||
|     { |     { | ||||||
|       "uid": "roadm SITE1", |       "uid": "roadm SITE1", | ||||||
|       "type": "Roadm", |       "type": "Roadm", | ||||||
|       "type_variety": "detailed_impairments", |       "type_variety": "detailed_impairments", | ||||||
| 	    "params": { |       "params": { | ||||||
| 		  "per_degree_impairments": [ |         "per_degree_impairments": [ | ||||||
| 		    { |           { | ||||||
| 			    "from_degree": "trx SITE1", |             "from_degree": "trx SITE1", | ||||||
| 		      "to_degree": "east edfa in SITE1 to ILA1", |             "to_degree": "east edfa in SITE1 to ILA1", | ||||||
| 			    "impairment_id": 1 |             "impairment_id": 1 | ||||||
| 		    }], |           }], | ||||||
|           "per_degree_pch_out_db": { |         "per_degree_pch_out_db": { | ||||||
|             "east edfa in SITE1 to ILA1": -13.5 |             "east edfa in SITE1 to ILA1": -13.5 | ||||||
|           } |         } | ||||||
| 	    } |       } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| In this example, all «implicit» express roadm-path are assigned as roadm-path-impairment-id = 0, and the target power is | In this example, all «implicit» express roadm-path are assigned as roadm-path-impairment-id = 0, and the target power is | ||||||
| set according to the value defined in the library except for the direction heading to "east edfa in SITE1 to ILA1", where | set according to the value defined in the library except for the direction heading to "east edfa in SITE1 to ILA1", where | ||||||
| constant power equalization is used to reach -13.5 dBm target power. | constant power equalization is used to reach -13.5 dBm target power. | ||||||
|  |  | ||||||
|  |   .. code-block:: json | ||||||
|  |  | ||||||
|  |     { | ||||||
|  |       "uid": "roadm SITE1", | ||||||
|  |       "type": "Roadm", | ||||||
|  |       "params": { | ||||||
|  |         "per_degree_design_bands": { | ||||||
|  |           "east edfa in SITE1 to ILA1": [ | ||||||
|  |             {"f_min": 191.3e12, "f_max": 196.0e12}, | ||||||
|  |             {"f_min": 187.0e12, "f_max": 190.0e12} | ||||||
|  |           ] | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | In this example the OMS starting from east edfa in SITE1 to ILA1 is defined as a multiband OMS. This means that | ||||||
|  | if there is no setting in all or some of the amplifiers in the OMS, the autodesign function will select amplifiers | ||||||
|  | from those that have ``multi_band`` ``type_def`` amplifiers. | ||||||
|  |  | ||||||
|  | The default ``design_bands`` is inferred from the :ref:`SI<spectral_info>` block. | ||||||
|  |  | ||||||
|  | Note that ``design_bands`` and ``type_variety`` amplifiers must be consistent: | ||||||
|  | - you cannot mix single band and multiband amplifiers on the same OMS; | ||||||
|  | - the frequency range of the amplifiers must include ``design_bands``. | ||||||
|  |  | ||||||
| Fused | Fused | ||||||
| ~~~~~ | ~~~~~ | ||||||
|  |  | ||||||
| @@ -1221,7 +1380,7 @@ A fused element connected to the egress of a ROADM will disable the automatic bo | |||||||
|  |  | ||||||
| Fused ``params`` only contains a ``loss`` value in dB. | Fused ``params`` only contains a ``loss`` value in dB. | ||||||
|  |  | ||||||
| .. code-block:: json |   .. code-block:: json | ||||||
|  |  | ||||||
|       "params": { |       "params": { | ||||||
|         "loss": 2 |         "loss": 2 | ||||||
|   | |||||||
| @@ -6,6 +6,200 @@ Release change log | |||||||
| Each release introduces some changes and new features. | Each release introduces some changes and new features. | ||||||
|  |  | ||||||
| (prepare text for next release) | (prepare text for next release) | ||||||
|  |  | ||||||
|  | v2.11 | ||||||
|  | ----- | ||||||
|  |  | ||||||
|  | **New feature** | ||||||
|  |  | ||||||
|  | A new type_def for amplifiers has been introduced: multi_band. This allows the definition of a | ||||||
|  | multiband amplifier site composed of several amplifiers per band (a typical application is C+L transmission). The | ||||||
|  | release also includes autodesign for links (Optical Multiplex Section, OMS) composed of multi_band amplifiers. | ||||||
|  | Multi_band autodesign includes basic tilt and tilt_target calculation when the Raman flag is enabled with the | ||||||
|  | --sim-params option. The spectrum is demultiplexed before propagation in the amplifier and multiplexed in the output | ||||||
|  | fiber at the amplifier output. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | In the library: | ||||||
|  |  | ||||||
|  |     .. code-block:: json | ||||||
|  |  | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_medium_gain_C", | ||||||
|  |             "f_min": 191.225e12, | ||||||
|  |             "f_max": 196.125e12, | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 26, | ||||||
|  |             "gain_min": 15, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf_min": 6, | ||||||
|  |             "nf_max": 10, | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": false | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_medium_gain_L", | ||||||
|  |             "f_min": 186.5e12, | ||||||
|  |             "f_max": 190.1e12, | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 26, | ||||||
|  |             "gain_min": 15, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf_min": 6, | ||||||
|  |             "nf_max": 10, | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_medium_gain_multiband", | ||||||
|  |             "type_def": "multi_band", | ||||||
|  |             "amplifiers": [ | ||||||
|  |                 "std_medium_gain_C", | ||||||
|  |                 "std_medium_gain_L" | ||||||
|  |             ], | ||||||
|  |             "allowed_for_design": false | ||||||
|  |         }, | ||||||
|  |  | ||||||
|  | In the network topology: | ||||||
|  |  | ||||||
|  |     .. code-block:: json | ||||||
|  |  | ||||||
|  |       { | ||||||
|  |           "uid": "east edfa in Site_A to Site_B", | ||||||
|  |           "type": "Multiband_amplifier", | ||||||
|  |           "type_variety": "std_medium_gain_multiband", | ||||||
|  |           "amplifiers": [{ | ||||||
|  |                   "type_variety": "std_medium_gain_C", | ||||||
|  |                   "operational": { | ||||||
|  |                       "gain_target": 22.55, | ||||||
|  |                       "delta_p": 0.9, | ||||||
|  |                       "out_voa": 3.0, | ||||||
|  |                       "tilt_target": 0.0 | ||||||
|  |                   } | ||||||
|  |               }, { | ||||||
|  |                   "type_variety": "std_medium_gain_L", | ||||||
|  |                   "operational": { | ||||||
|  |                       "gain_target": 21, | ||||||
|  |                       "delta_p": 3.0, | ||||||
|  |                       "out_voa": 3.0, | ||||||
|  |                       "tilt_target": 0.0 | ||||||
|  |                   } | ||||||
|  |               } | ||||||
|  |           ] | ||||||
|  |       } | ||||||
|  |  | ||||||
|  | **Network design** | ||||||
|  |  | ||||||
|  | Optionally, users can define a design target per OMS (single or multi-band), with specific frequency ranges. | ||||||
|  | Default design bands are defined in the SI. | ||||||
|  |  | ||||||
|  |     .. code-block:: json | ||||||
|  |  | ||||||
|  |       { | ||||||
|  |           "uid": "roadm Site_A", | ||||||
|  |           "type": "Roadm", | ||||||
|  |           "params": { | ||||||
|  |               "target_pch_out_db": -20, | ||||||
|  |               "design_bands": [{"f_min": 191.3e12, "f_max": 195.1e12}] | ||||||
|  |           } | ||||||
|  |       } | ||||||
|  |  | ||||||
|  | It is possible to define a set of bands in the SI block instead of a single Spectrum Information. | ||||||
|  | In this case type_variety must be used. | ||||||
|  | Each set defines a reference channel used for design functions and autodesign. | ||||||
|  |  | ||||||
|  | The default design settings for the path-request-run script have been modified. | ||||||
|  | Now, design is performed once for the reference channel defined in the SI block of the eqpt_config, | ||||||
|  | and requests are propagated based on this design. | ||||||
|  | The --redesign-per-request option can be used to restore previous behaviour | ||||||
|  | (design using request channel types). | ||||||
|  |  | ||||||
|  | The autodesign function has been updated to insert multiband booster, preamp or inline amplifiers based on the OMS | ||||||
|  | nature. If nothing is stated (no amplifier defined in the OMS, no design_bands attribute in the ROADM), then | ||||||
|  | it uses single band Edfas. | ||||||
|  |  | ||||||
|  | **Propagation** | ||||||
|  |  | ||||||
|  | Only carriers within the amplifier bandwidth are propagated, improving system coherence. This more rigorous checking | ||||||
|  | of the spectrum to be propagated and the amplifier bandwidth may lead to changes in the total number of channels | ||||||
|  | compared to previous releases. The range can be adjusted by changing the values of ``f_min`` and ``f_max`` | ||||||
|  | in the amplifier library. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ``f_min`` and ``f_max`` represent the boundary frequencies of the amplification bandwidth (the entire channel must fit | ||||||
|  | within this range). | ||||||
|  | In the example below, a signal center frequency of 190.05THz with a 50GHz width cannot fit within the amplifier band. | ||||||
|  | Note that this has a different meaning in the SI or Transceiver blocks, where ``f_min`` and ``f_max`` refers to the | ||||||
|  | minimum / maximum values of the carrier center frequency. | ||||||
|  |  | ||||||
|  |     .. code-block:: json | ||||||
|  |  | ||||||
|  |       { | ||||||
|  |           "type_variety": "std_booster_L", | ||||||
|  |           "f_min": 186.55e12, | ||||||
|  |           "f_max": 190.05e12, | ||||||
|  |           "type_def": "fixed_gain", | ||||||
|  |           "gain_flatmax": 21, | ||||||
|  |           "gain_min": 20, | ||||||
|  |           "p_max": 21, | ||||||
|  |           "nf0": 5, | ||||||
|  |           "allowed_for_design": false | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | **Display** | ||||||
|  |  | ||||||
|  | The CLI output for the transmission_main_example now displays the channels used for design and simulation, | ||||||
|  | as well as the tilt target of amplifiers. | ||||||
|  |  | ||||||
|  |   .. code-block:: text | ||||||
|  |  | ||||||
|  |     Reference used for design: (Input optical power reference in span = 0.00dBm, | ||||||
|  |                                 spacing = 50.00GHz | ||||||
|  |                                 nb_channels = 76) | ||||||
|  |  | ||||||
|  |     Channels propagating: (Input optical power deviation in span = 0.00dB, | ||||||
|  |                           spacing = 50.00GHz, | ||||||
|  |                           transceiver output power = 0.00dBm, | ||||||
|  |                           nb_channels = 76) | ||||||
|  |  | ||||||
|  | The CLI output displays the settings of each amplifier: | ||||||
|  |  | ||||||
|  |   .. code-block:: text | ||||||
|  |  | ||||||
|  |     Multiband_amplifier east edfa in Site_A to Site_B | ||||||
|  |       type_variety:           std_medium_gain_multiband | ||||||
|  |       type_variety:           std_medium_gain_C    type_variety:           std_medium_gain_L | ||||||
|  |       effective gain(dB):     20.90                effective gain(dB):     22.19 | ||||||
|  |       (before att_in and before output VOA)        (before att_in and before output VOA) | ||||||
|  |       tilt-target(dB)         0.00                 tilt-target(dB)         0.00 | ||||||
|  |       noise figure (dB):      6.38                 noise figure (dB):      6.19 | ||||||
|  |       (including att_in)                           (including att_in) | ||||||
|  |       pad att_in (dB):        0.00                 pad att_in (dB):        0.00 | ||||||
|  |       Power In (dBm):         -1.08                Power In (dBm):         -1.49 | ||||||
|  |       Power Out (dBm):        19.83                Power Out (dBm):        20.71 | ||||||
|  |       Delta_P (dB):           0.90                 Delta_P (dB):           2.19 | ||||||
|  |       target pch (dBm):       0.90                 target pch (dBm):       3.00 | ||||||
|  |       actual pch out (dBm):   -2.09                actual pch out (dBm):   -0.80 | ||||||
|  |       output VOA (dB):        3.00                 output VOA (dB):        3.00 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | **New feature** | ||||||
|  |  | ||||||
|  | The preturbative Raman and the approximated GGN models are introduced for a faster evaluation of the Raman and | ||||||
|  | Kerr effects, respectively. | ||||||
|  | These implementation are intended to reduce the computational effort required by multiband transmission scenarios. | ||||||
|  |  | ||||||
|  | Both the novel models have been validated with exstensive simulations | ||||||
|  | (see `arXiv:2304.11756 <https://arxiv.org/abs/2304.11756>`_ for the new Raman model and | ||||||
|  | `jlt:9741324 <https://eeexplore.ieee.org/document/9741324>`_ for the new NLI model). | ||||||
|  | Additionally, they have been experimentally validated in a laboratory setup composed of commertial equipment | ||||||
|  | (see `icton:10648172 <https://eeexplore.ieee.org/document/10648172>`_). | ||||||
|  |  | ||||||
|  |  | ||||||
|  | v2.10 | ||||||
|  | ----- | ||||||
|  |  | ||||||
| ROADM impairments can be defined per degree and roadm-path type (add, drop or express). | ROADM impairments can be defined per degree and roadm-path type (add, drop or express). | ||||||
| Minimum loss when crossing a ROADM is no more 0 dB. It can be set per ROADM degree with roadm-path-impairments. | Minimum loss when crossing a ROADM is no more 0 dB. It can be set per ROADM degree with roadm-path-impairments. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,12 +5,12 @@ | |||||||
| gnpy.core.elements | gnpy.core.elements | ||||||
| ================== | ================== | ||||||
|  |  | ||||||
| Standard network elements which propagate optical spectrum | Standard network elements which propagate optical spectrum. | ||||||
|  |  | ||||||
| A network element is a Python callable. It takes a :class:`.info.SpectralInformation` | A network element is a Python callable. It takes a :class:`.info.SpectralInformation` | ||||||
| object and returns a copy with appropriate fields affected. This structure | object and returns a copy with appropriate fields affected. This structure | ||||||
| represents spectral information that is "propogated" by this network element. | represents spectral information that is "propagated" by this network element. | ||||||
| Network elements must have only a local "view" of the network and propogate | Network elements must have only a local "view" of the network and propagate | ||||||
| :class:`.info.SpectralInformation` using only this information. They should be independent and | :class:`.info.SpectralInformation` using only this information. They should be independent and | ||||||
| self-contained. | self-contained. | ||||||
|  |  | ||||||
| @@ -20,20 +20,22 @@ unique identifier and a printable name, and provide the :py:meth:`__call__` meth | |||||||
| instance as a result. | instance as a result. | ||||||
| """ | """ | ||||||
|  |  | ||||||
|  | from copy import deepcopy | ||||||
| from numpy import abs, array, errstate, ones, interp, mean, pi, polyfit, polyval, sum, sqrt, log10, exp, asarray, full,\ | from numpy import abs, array, errstate, ones, interp, mean, pi, polyfit, polyval, sum, sqrt, log10, exp, asarray, full,\ | ||||||
|     squeeze, zeros, append, flip, outer, ndarray |     squeeze, zeros, outer, ndarray | ||||||
| from scipy.constants import h, c | from scipy.constants import h, c | ||||||
| from scipy.interpolate import interp1d | from scipy.interpolate import interp1d | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
| from typing import Union | from typing import Union, List | ||||||
| from logging import getLogger | from logging import getLogger | ||||||
|  | import warnings | ||||||
|  |  | ||||||
| from gnpy.core.utils import lin2db, db2lin, arrange_frequencies, snr_sum, per_label_average, pretty_summary_print, \ | from gnpy.core.utils import lin2db, db2lin, arrange_frequencies, snr_sum, per_label_average, pretty_summary_print, \ | ||||||
|     watt2dbm, psd2powerdbm, calculate_absolute_min_or_zero |     watt2dbm, psd2powerdbm, calculate_absolute_min_or_zero, nice_column_str | ||||||
| from gnpy.core.parameters import RoadmParams, FusedParams, FiberParams, PumpParams, EdfaParams, EdfaOperational, \ | from gnpy.core.parameters import RoadmParams, FusedParams, FiberParams, PumpParams, EdfaParams, EdfaOperational, \ | ||||||
|     RoadmPath, RoadmImpairment |     MultiBandParams, RoadmPath, RoadmImpairment, TransceiverParams, find_band_name, FrequencyBand | ||||||
| from gnpy.core.science_utils import NliSolver, RamanSolver | from gnpy.core.science_utils import NliSolver, RamanSolver | ||||||
| from gnpy.core.info import SpectralInformation | from gnpy.core.info import SpectralInformation, muxed_spectral_information, demuxed_spectral_information | ||||||
| from gnpy.core.exceptions import NetworkTopologyError, SpectrumError, ParametersError | from gnpy.core.exceptions import NetworkTopologyError, SpectrumError, ParametersError | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -80,8 +82,20 @@ class _Node: | |||||||
|  |  | ||||||
|  |  | ||||||
| class Transceiver(_Node): | class Transceiver(_Node): | ||||||
|     def __init__(self, *args, **kwargs): |     def __init__(self, *args, params=None, **kwargs): | ||||||
|         super().__init__(*args, **kwargs) |         if not params: | ||||||
|  |             params = {} | ||||||
|  |         try: | ||||||
|  |             with warnings.catch_warnings(record=True) as caught_warnings: | ||||||
|  |                 super().__init__(*args, params=TransceiverParams(**params), **kwargs) | ||||||
|  |                 if caught_warnings: | ||||||
|  |                     msg = f'In Transceiver {kwargs["uid"]}: {caught_warnings[0].message}' | ||||||
|  |                     _logger.warning(msg) | ||||||
|  |         except ParametersError as e: | ||||||
|  |             msg = f'Config error in {kwargs["uid"]}: {e}' | ||||||
|  |             _logger.critical(msg) | ||||||
|  |             raise ParametersError(msg) from e | ||||||
|  |  | ||||||
|         self.osnr_ase_01nm = None |         self.osnr_ase_01nm = None | ||||||
|         self.osnr_ase = None |         self.osnr_ase = None | ||||||
|         self.osnr_nli = None |         self.osnr_nli = None | ||||||
| @@ -96,6 +110,8 @@ class Transceiver(_Node): | |||||||
|         self.total_penalty = 0 |         self.total_penalty = 0 | ||||||
|         self.propagated_labels = [""] |         self.propagated_labels = [""] | ||||||
|         self.tx_power = None |         self.tx_power = None | ||||||
|  |         self.design_bands = self.params.design_bands | ||||||
|  |         self.per_degree_design_bands = self.params.per_degree_design_bands | ||||||
|  |  | ||||||
|     def _calc_cd(self, spectral_info): |     def _calc_cd(self, spectral_info): | ||||||
|         """Updates the Transceiver property with the CD of the received channels. CD in ps/nm. |         """Updates the Transceiver property with the CD of the received channels. CD in ps/nm. | ||||||
| @@ -239,7 +255,11 @@ class Roadm(_Node): | |||||||
|         if not params: |         if not params: | ||||||
|             params = {} |             params = {} | ||||||
|         try: |         try: | ||||||
|             super().__init__(*args, params=RoadmParams(**params), **kwargs) |             with warnings.catch_warnings(record=True) as caught_warnings: | ||||||
|  |                 super().__init__(*args, params=RoadmParams(**params), **kwargs) | ||||||
|  |                 if caught_warnings: | ||||||
|  |                     msg = f'In ROADM {kwargs["uid"]}: {caught_warnings[0].message}' | ||||||
|  |                     _logger.warning(msg) | ||||||
|         except ParametersError as e: |         except ParametersError as e: | ||||||
|             msg = f'Config error in {kwargs["uid"]}: {e}' |             msg = f'Config error in {kwargs["uid"]}: {e}' | ||||||
|             raise ParametersError(msg) from e |             raise ParametersError(msg) from e | ||||||
| @@ -278,6 +298,8 @@ class Roadm(_Node): | |||||||
|                                                                                 "to_degree": i["to_degree"], |                                                                                 "to_degree": i["to_degree"], | ||||||
|                                                                                 "impairment_id": i["impairment_id"]} |                                                                                 "impairment_id": i["impairment_id"]} | ||||||
|                                        for i in self.params.per_degree_impairments} |                                        for i in self.params.per_degree_impairments} | ||||||
|  |         self.design_bands = deepcopy(self.params.design_bands) | ||||||
|  |         self.per_degree_design_bands = deepcopy(self.params.per_degree_design_bands) | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|     def to_json(self): |     def to_json(self): | ||||||
| @@ -311,6 +333,11 @@ class Roadm(_Node): | |||||||
|         if self.per_degree_impairments: |         if self.per_degree_impairments: | ||||||
|             to_json['per_degree_impairments'] = list(self.per_degree_impairments.values()) |             to_json['per_degree_impairments'] = list(self.per_degree_impairments.values()) | ||||||
|  |  | ||||||
|  |         if self.params.design_bands is not None: | ||||||
|  |             if len(self.params.design_bands) > 1: | ||||||
|  |                 to_json['params']['design_bands'] = self.params.design_bands | ||||||
|  |         if self.params.per_degree_design_bands: | ||||||
|  |             to_json['params']['per_degree_design_bands'] = self.params.per_degree_design_bands | ||||||
|         return to_json |         return to_json | ||||||
|  |  | ||||||
|     def __repr__(self): |     def __repr__(self): | ||||||
| @@ -391,7 +418,7 @@ class Roadm(_Node): | |||||||
|         # record input powers to compute the actual loss at the end of the process |         # record input powers to compute the actual loss at the end of the process | ||||||
|         input_power_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase) |         input_power_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase) | ||||||
|         # apply min ROADM loss if it exists |         # apply min ROADM loss if it exists | ||||||
|         roadm_maxloss_db = self.get_roadm_path(from_degree, degree).impairment.maxloss |         roadm_maxloss_db = self.get_impairment('roadm-maxloss', spectral_info.frequency, from_degree, degree) | ||||||
|         spectral_info.apply_attenuation_db(roadm_maxloss_db) |         spectral_info.apply_attenuation_db(roadm_maxloss_db) | ||||||
|         # records the total power after applying minimum loss |         # records the total power after applying minimum loss | ||||||
|         net_input_power_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase) |         net_input_power_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase) | ||||||
| @@ -406,7 +433,7 @@ class Roadm(_Node): | |||||||
|         # the power out of the ROADM for the ref channel is the min value between target power and input power. |         # the power out of the ROADM for the ref channel is the min value between target power and input power. | ||||||
|         ref_pch_in_dbm = self.ref_pch_in_dbm[from_degree] |         ref_pch_in_dbm = self.ref_pch_in_dbm[from_degree] | ||||||
|         # Calculate the output power for the reference channel (only for visualization) |         # Calculate the output power for the reference channel (only for visualization) | ||||||
|         self.ref_pch_out_dbm = min(ref_pch_in_dbm - roadm_maxloss_db, ref_per_degree_pch) |         self.ref_pch_out_dbm = min(ref_pch_in_dbm - max(roadm_maxloss_db), ref_per_degree_pch) | ||||||
|  |  | ||||||
|         # Definition of effective_loss: |         # Definition of effective_loss: | ||||||
|         # Optical power of carriers are equalized by the ROADM, so that the experienced loss is not the same for |         # Optical power of carriers are equalized by the ROADM, so that the experienced loss is not the same for | ||||||
| @@ -438,11 +465,11 @@ class Roadm(_Node): | |||||||
|         spectral_info.apply_attenuation_db(delta_power) |         spectral_info.apply_attenuation_db(delta_power) | ||||||
|  |  | ||||||
|         # Update the PMD information |         # Update the PMD information | ||||||
|         pmd_impairment = self.get_roadm_path(from_degree=from_degree, to_degree=degree).impairment.pmd |         pmd_impairment = self.get_impairment('roadm-pmd', spectral_info.frequency, from_degree, degree) | ||||||
|         spectral_info.pmd = sqrt(spectral_info.pmd ** 2 + pmd_impairment ** 2) |         spectral_info.pmd = sqrt(spectral_info.pmd ** 2 + pmd_impairment ** 2) | ||||||
|  |  | ||||||
|         # Update the PMD information |         # Update the PMD information | ||||||
|         pdl_impairment = self.get_roadm_path(from_degree=from_degree, to_degree=degree).impairment.pdl |         pdl_impairment = self.get_impairment('roadm-pdl', spectral_info.frequency, from_degree, degree) | ||||||
|         spectral_info.pdl = sqrt(spectral_info.pdl ** 2 + pdl_impairment ** 2) |         spectral_info.pdl = sqrt(spectral_info.pdl ** 2 + pdl_impairment ** 2) | ||||||
|  |  | ||||||
|         # Update the per channel power with the result of propagation |         # Update the per channel power with the result of propagation | ||||||
| @@ -460,13 +487,19 @@ class Roadm(_Node): | |||||||
|         """ |         """ | ||||||
|         # initialize impairment with params.pmd, params.cd |         # initialize impairment with params.pmd, params.cd | ||||||
|         # if more detailed parameters are available for the Roadm, the use them instead |         # if more detailed parameters are available for the Roadm, the use them instead | ||||||
|         roadm_global_impairment = {'roadm-pmd': self.params.pmd, |         roadm_global_impairment = { | ||||||
|                                    'roadm-pdl': self.params.pdl} |             'impairment': [{ | ||||||
|  |                 'roadm-pmd': self.params.pmd, | ||||||
|  |                 'roadm-pdl': self.params.pdl, | ||||||
|  |                 'frequency-range': { | ||||||
|  |                     'lower-frequency': None, | ||||||
|  |                     'upper-frequency': None | ||||||
|  |                 }}]} | ||||||
|         if path_type in ['add', 'drop']: |         if path_type in ['add', 'drop']: | ||||||
|             # without detailed imparments, we assume that add OSNR contribution is the same as drop contribution |             # without detailed imparments, we assume that add OSNR contribution is the same as drop contribution | ||||||
|             # add_drop_osnr_db = - 10log10(1/add_osnr + 1/drop_osnr) with add_osnr = drop_osnr |             # add_drop_osnr_db = - 10log10(1/add_osnr + 1/drop_osnr) with add_osnr = drop_osnr | ||||||
|             # = add_osnr_db + 10log10(2) |             # = add_osnr_db + 10log10(2) | ||||||
|             roadm_global_impairment['roadm-osnr'] = self.params.add_drop_osnr + lin2db(2) |             roadm_global_impairment['impairment'][0]['roadm-osnr'] = self.params.add_drop_osnr + lin2db(2) | ||||||
|         impairment = RoadmImpairment(roadm_global_impairment) |         impairment = RoadmImpairment(roadm_global_impairment) | ||||||
|  |  | ||||||
|         if impairment_id is None: |         if impairment_id is None: | ||||||
| @@ -507,6 +540,34 @@ class Roadm(_Node): | |||||||
|             return self.roadm_path_impairments[impairment_id].path_type |             return self.roadm_path_impairments[impairment_id].path_type | ||||||
|         return None |         return None | ||||||
|  |  | ||||||
|  |     def get_impairment(self, impairment: str, frequency_array: array, from_degree: str, degree: str) \ | ||||||
|  |             -> array: | ||||||
|  |         """ | ||||||
|  |         Retrieves the specified impairment values for the given frequency array. | ||||||
|  |  | ||||||
|  |         Parameters: | ||||||
|  |             impairment (str): The type of impairment to retrieve (roadm-pmd, roamd-maxloss...). | ||||||
|  |             frequency_array (array): The frequencies at which to check for impairments. | ||||||
|  |             from_degree (str): The ingress degree for the roadm internal path. | ||||||
|  |             degree (str): The egress degree for the roadm internal path. | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             array: An array of impairment values for the specified frequencies. | ||||||
|  |         """ | ||||||
|  |         result = [] | ||||||
|  |         impairment_per_band = self.get_roadm_path(from_degree, degree).impairment.impairments | ||||||
|  |         for frequency in frequency_array: | ||||||
|  |             for item in impairment_per_band: | ||||||
|  |                 f_min = item['frequency-range']['lower-frequency'] | ||||||
|  |                 f_max = item['frequency-range']['upper-frequency'] | ||||||
|  |                 if (f_min is None or f_min <= frequency <= f_max): | ||||||
|  |                     item[impairment] = item.get(impairment, RoadmImpairment.default_values[impairment]) | ||||||
|  |                     if item[impairment] is not None: | ||||||
|  |                         result.append(item[impairment]) | ||||||
|  |                         break  # Stop searching after the first match for this frequency | ||||||
|  |         if result: | ||||||
|  |             return array(result) | ||||||
|  |  | ||||||
|     def __call__(self, spectral_info, degree, from_degree): |     def __call__(self, spectral_info, degree, from_degree): | ||||||
|         self.propagate(spectral_info, degree=degree, from_degree=from_degree) |         self.propagate(spectral_info, degree=degree, from_degree=from_degree) | ||||||
|         return spectral_info |         return spectral_info | ||||||
| @@ -886,19 +947,22 @@ class Edfa(_Node): | |||||||
|  |  | ||||||
|     @property |     @property | ||||||
|     def to_json(self): |     def to_json(self): | ||||||
|         return {'uid': self.uid, |         _to_json = { | ||||||
|                 'type': type(self).__name__, |             'uid': self.uid, | ||||||
|                 'type_variety': self.params.type_variety, |             'type': type(self).__name__, | ||||||
|                 'operational': { |             'type_variety': self.params.type_variety, | ||||||
|                     'gain_target': round(self.effective_gain, 6) if self.effective_gain else None, |             'operational': { | ||||||
|                     'delta_p': self.delta_p, |                 'gain_target': round(self.effective_gain, 6) if self.effective_gain else None, | ||||||
|                     'tilt_target': self.tilt_target,  # defined per lambda on the amp band |                 'delta_p': self.delta_p, | ||||||
|                     'out_voa': self.out_voa |                 'tilt_target': round(self.tilt_target, 5) if self.tilt_target is not None else None, | ||||||
|                 }, |                 # defined per lambda on the amp band | ||||||
|                 'metadata': { |                 'out_voa': self.out_voa | ||||||
|                     'location': self.metadata['location']._asdict() |             }, | ||||||
|                 } |             'metadata': { | ||||||
|                 } |                 'location': self.metadata['location']._asdict() | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return _to_json | ||||||
|  |  | ||||||
|     def __repr__(self): |     def __repr__(self): | ||||||
|         return (f'{type(self).__name__}(uid={self.uid!r}, ' |         return (f'{type(self).__name__}(uid={self.uid!r}, ' | ||||||
| @@ -920,7 +984,8 @@ class Edfa(_Node): | |||||||
|         return '\n'.join([f'{type(self).__name__} {self.uid}', |         return '\n'.join([f'{type(self).__name__} {self.uid}', | ||||||
|                           f'  type_variety:           {self.params.type_variety}', |                           f'  type_variety:           {self.params.type_variety}', | ||||||
|                           f'  effective gain(dB):     {self.effective_gain:.2f}', |                           f'  effective gain(dB):     {self.effective_gain:.2f}', | ||||||
|                           f'  (before att_in and before output VOA)', |                           '  (before att_in and before output VOA)', | ||||||
|  |                           f'  tilt-target(dB)         {self.tilt_target:.2f}', | ||||||
|                           f'  noise figure (dB):      {nf:.2f}', |                           f'  noise figure (dB):      {nf:.2f}', | ||||||
|                           f'  (including att_in)', |                           f'  (including att_in)', | ||||||
|                           f'  pad att_in (dB):        {self.att_in:.2f}', |                           f'  pad att_in (dB):        {self.att_in:.2f}', | ||||||
| @@ -1199,5 +1264,126 @@ class Edfa(_Node): | |||||||
|         self.propagated_labels = spectral_info.label |         self.propagated_labels = spectral_info.label | ||||||
|  |  | ||||||
|     def __call__(self, spectral_info): |     def __call__(self, spectral_info): | ||||||
|         self.propagate(spectral_info) |         # filter out carriers outside the amplifier band | ||||||
|         return spectral_info |         band = next(b for b in self.params.bands) | ||||||
|  |         spectral_info = demuxed_spectral_information(spectral_info, band) | ||||||
|  |         if spectral_info.carriers: | ||||||
|  |             self.propagate(spectral_info) | ||||||
|  |             return spectral_info | ||||||
|  |         raise ValueError(f'Amp {self.uid} Defined propagation band does not match amplifiers band.') | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class Multiband_amplifier(_Node): | ||||||
|  |     """Represents a multiband amplifier that manages multiple amplifiers across different frequency bands. | ||||||
|  |  | ||||||
|  |     This class allows for the initialization and management of amplifiers, each associated with a specific | ||||||
|  |     frequency band. It provides methods for signal propagation through the amplifiers and for exporting | ||||||
|  |     to JSON format. | ||||||
|  |  | ||||||
|  |     param: amplifiers: list of dict. A list of dictionaries, each containing parameters for setting an | ||||||
|  |     individual amplifier. | ||||||
|  |     param: params : dict. A dictionary of parameters for the multiband amplifier, which must include | ||||||
|  |     necessary configuration settings. | ||||||
|  |     param: args, kwargs: Additional positional and keyword arguments passed to the parent class `_Node`. | ||||||
|  |  | ||||||
|  |     Attributes: | ||||||
|  |     ----------- | ||||||
|  |     variety_list : A list of varieties associated with the amplifier. | ||||||
|  |     amplifiers : A dictionary mapping band names to their corresponding amplifier instances. | ||||||
|  |  | ||||||
|  |     Methods: | ||||||
|  |     -------- | ||||||
|  |     __call__(spectral_info): | ||||||
|  |     Propagates the input spectral information through each amplifier and returns the multiplexed spectrum. | ||||||
|  |  | ||||||
|  |     to_json: | ||||||
|  |     Converts the amplifier's state to a JSON-compatible dictionary. | ||||||
|  |  | ||||||
|  |     __repr__(): | ||||||
|  |     Returns a string representation of the multiband amplifier instance. | ||||||
|  |  | ||||||
|  |     __str__(): | ||||||
|  |     Returns a formatted string representation of the multiband amplifier and its amplifiers. | ||||||
|  |  | ||||||
|  |     Raises: | ||||||
|  |     ------- | ||||||
|  |     ParametersError: If there are conflicting amplifier definitions for the same frequency band during initialization. | ||||||
|  |  | ||||||
|  |     ValueError: If the input spectral information does not match any defined amplifier bands during propagation. | ||||||
|  |     """ | ||||||
|  |     # separate the top level type_variety from kwargs to avoid having multiple type_varieties on each element processing | ||||||
|  |     def __init__(self, *args, amplifiers: List[dict], params: dict, **kwargs): | ||||||
|  |         self.variety_list = kwargs.pop('variety_list', None) | ||||||
|  |         try: | ||||||
|  |             super().__init__(params=MultiBandParams(**params), **kwargs) | ||||||
|  |         except ParametersError as e: | ||||||
|  |             raise ParametersError(f'{kwargs["uid"]}: {e}') | ||||||
|  |         self.amplifiers = {} | ||||||
|  |         if 'type_variety' in kwargs: | ||||||
|  |             kwargs.pop('type_variety') | ||||||
|  |         self.passive = False | ||||||
|  |         for amp_dict in amplifiers: | ||||||
|  |             # amplifiers dict uses default names as key to represent the band | ||||||
|  |             amp = Edfa(**amp_dict, **kwargs) | ||||||
|  |             band = next(b for b in amp.params.bands) | ||||||
|  |             band_name = find_band_name(FrequencyBand(f_min=band["f_min"], f_max=band["f_max"])) | ||||||
|  |             if band_name not in self.amplifiers.keys() and band not in self.params.bands: | ||||||
|  |                 self.params.bands.append(band) | ||||||
|  |                 self.amplifiers[band_name] = amp | ||||||
|  |             elif band_name not in self.amplifiers.keys() and band in self.params.bands: | ||||||
|  |                 self.amplifiers[band_name] = amp | ||||||
|  |             else: | ||||||
|  |                 raise ParametersError(f'{kwargs["uid"]}: has more than one amp defined for the same band') | ||||||
|  |  | ||||||
|  |     def __call__(self, spectral_info: SpectralInformation): | ||||||
|  |         """propagates in each amp and returns the muxed spectrum | ||||||
|  |         """ | ||||||
|  |         out_si = [] | ||||||
|  |         for _, amp in self.amplifiers.items(): | ||||||
|  |             si = demuxed_spectral_information(spectral_info, amp.params.bands[0]) | ||||||
|  |             # if spectral_info frequencies are outside amp band, si is None | ||||||
|  |             if si: | ||||||
|  |                 si = amp(si) | ||||||
|  |                 out_si.append(si) | ||||||
|  |         if not out_si: | ||||||
|  |             raise ValueError('Defined propagation band does not match amplifiers band.') | ||||||
|  |         return muxed_spectral_information(out_si) | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     def to_json(self): | ||||||
|  |         return {'uid': self.uid, | ||||||
|  |                 'type': type(self).__name__, | ||||||
|  |                 'type_variety': self.type_variety, | ||||||
|  |                 'amplifiers': [{ | ||||||
|  |                     'type_variety': amp.type_variety, | ||||||
|  |                     'operational': { | ||||||
|  |                         'gain_target': round(amp.effective_gain, 6), | ||||||
|  |                         'delta_p': amp.delta_p, | ||||||
|  |                         'tilt_target': amp.tilt_target, | ||||||
|  |                         'out_voa': amp.out_voa | ||||||
|  |                     }} for amp in self.amplifiers.values() | ||||||
|  |                 ], | ||||||
|  |                 'metadata': { | ||||||
|  |                     'location': self.metadata['location']._asdict() | ||||||
|  |                 } | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return (f'{type(self).__name__}(uid={self.uid!r}, ' | ||||||
|  |                 f'type_variety={self.type_variety!r}, ') | ||||||
|  |  | ||||||
|  |     def __str__(self): | ||||||
|  |         amp_str = [f'{type(self).__name__} {self.uid}', | ||||||
|  |                    f'  type_variety:           {self.type_variety}'] | ||||||
|  |         multi_str_data = [] | ||||||
|  |         max_width = 0 | ||||||
|  |         for amp in self.amplifiers.values(): | ||||||
|  |             lines = amp.__str__().split('\n') | ||||||
|  |             # start at index 1 to remove uid from each amp list of strings | ||||||
|  |             # records only if amp is used ie si has frequencies in amp) otherwise there is no other string than the uid | ||||||
|  |             if len(lines) > 1: | ||||||
|  |                 max_width = max(max_width, max([len(line) for line in lines[1:]])) | ||||||
|  |                 multi_str_data.append(lines[1:]) | ||||||
|  |         # multi_str_data contains lines with each amp str, instead we want to print per column: transpose the string | ||||||
|  |         transposed_data = list(map(list, zip(*multi_str_data))) | ||||||
|  |         return '\n'.join(amp_str) + '\n' + nice_column_str(data=transposed_data, max_length=max_width + 2, padding=3) | ||||||
|   | |||||||
| @@ -7,8 +7,11 @@ gnpy.core.equipment | |||||||
|  |  | ||||||
| This module contains functionality for specifying equipment. | This module contains functionality for specifying equipment. | ||||||
| """ | """ | ||||||
|  | from collections import defaultdict | ||||||
|  | from functools import reduce | ||||||
|  | from typing import List | ||||||
|  |  | ||||||
| from gnpy.core.exceptions import EquipmentConfigError | from gnpy.core.exceptions import EquipmentConfigError, ConfigurationError | ||||||
|  |  | ||||||
|  |  | ||||||
| def trx_mode_params(equipment, trx_type_variety='', trx_mode='', error_message=False): | def trx_mode_params(equipment, trx_type_variety='', trx_mode='', error_message=False): | ||||||
| @@ -80,3 +83,50 @@ def trx_mode_params(equipment, trx_type_variety='', trx_mode='', error_message=F | |||||||
|  |  | ||||||
|     trx_params = {**default_trx_params} |     trx_params = {**default_trx_params} | ||||||
|     return trx_params |     return trx_params | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def find_type_variety(amps: List[str], equipment: dict) -> str: | ||||||
|  |     """Returns the multiband type_variety associated with a list of single band type_varieties | ||||||
|  |     Args: | ||||||
|  |     amps (List[str]): A list of single band type_varieties. | ||||||
|  |     equipment (dict): A dictionary containing equipment information. | ||||||
|  |  | ||||||
|  |     Returns: | ||||||
|  |     str: an amplifier type variety | ||||||
|  |     """ | ||||||
|  |     listes = find_type_varieties(amps, equipment) | ||||||
|  |  | ||||||
|  |     _found_type = list(reduce(lambda x, y: set(x) & set(y), listes)) | ||||||
|  |     # Given a list of single band amplifiers, find the multiband amplifier whose multi_band group | ||||||
|  |     # matches. For example, if amps list contains ["a1_LBAND", "a2_CBAND"], with a1.multi_band = [a1_LBAND, a1_CBAND] | ||||||
|  |     # and a2.multi_band = [a1_LBAND, a2_CBAND], then: | ||||||
|  |     # possible_type_varieties = {"a1_LBAND": ["a1", "a2"], "a2_CBAND": ["a2"]} | ||||||
|  |     # listes = [["a1", "a2"],  ["a2"]] | ||||||
|  |     # and _found_type = [a2] | ||||||
|  |     if not _found_type: | ||||||
|  |         msg = f'{amps} amps do not belong to the same amp type {listes}' | ||||||
|  |         raise ConfigurationError(msg) | ||||||
|  |     return _found_type[0] | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def find_type_varieties(amps: List[str], equipment: dict) -> List[List[str]]: | ||||||
|  |     """Returns the multiband list of type_varieties associated with a list of single band type_varieties | ||||||
|  |     Args: | ||||||
|  |     amps (List[str]): A list of single band type_varieties. | ||||||
|  |     equipment (dict): A dictionary containing equipment information. | ||||||
|  |  | ||||||
|  |     Returns: | ||||||
|  |     List[List[str]]: A list of lists containing the multiband type_varieties | ||||||
|  |     associated with each single band type_variety. | ||||||
|  |     """ | ||||||
|  |     possible_type_varieties = defaultdict(list) | ||||||
|  |     for amp_name, amp in equipment['Edfa'].items(): | ||||||
|  |         if amp.multi_band is not None: | ||||||
|  |             for elem in amp.multi_band: | ||||||
|  |                 # possible_type_varieties stores the list of multiband amp names that list this elem as | ||||||
|  |                 # a possible amplifier of the multiband group. For example, if "std_medium_gain_multiband" | ||||||
|  |                 # and "std_medium_gain_multiband_new" contain "std_medium_gain_C" in their "multi_band" list, then: | ||||||
|  |                 # possible_type_varieties["std_medium_gain_C"] = | ||||||
|  |                 # ["std_medium_gain_multiband", "std_medium_gain_multiband_new"] | ||||||
|  |                 possible_type_varieties[elem].append(amp_name) | ||||||
|  |     return [possible_type_varieties[a] for a in amps] | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ This module contains classes for modelling :class:`SpectralInformation`. | |||||||
| from __future__ import annotations | from __future__ import annotations | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
| from collections.abc import Iterable | from collections.abc import Iterable | ||||||
| from typing import Union | from typing import Union, List | ||||||
| from dataclasses import dataclass | from dataclasses import dataclass | ||||||
| from numpy import argsort, mean, array, append, ones, ceil, any, zeros, outer, full, ndarray, asarray | from numpy import argsort, mean, array, append, ones, ceil, any, zeros, outer, full, ndarray, asarray | ||||||
|  |  | ||||||
| @@ -317,6 +317,56 @@ def create_input_spectral_information(f_min, f_max, roll_off, baud_rate, spacing | |||||||
|                                                  tx_osnr=tx_osnr, tx_power=tx_power, label=label) |                                                  tx_osnr=tx_osnr, tx_power=tx_power, label=label) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def is_in_band(frequency: float, band: dict) -> bool: | ||||||
|  |     """band has {"f_min": value, "f_max": value} format | ||||||
|  |     """ | ||||||
|  |     if frequency >= band['f_min'] and frequency <= band['f_max']: | ||||||
|  |         return True | ||||||
|  |     return False | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def demuxed_spectral_information(input_si: SpectralInformation, band: dict) -> SpectralInformation: | ||||||
|  |     """extract a si based on band | ||||||
|  |     """ | ||||||
|  |     filtered_indices = [i for i, f in enumerate(input_si.frequency) | ||||||
|  |                         if is_in_band(f - input_si.slot_width[i] / 2, band) | ||||||
|  |                         and is_in_band(f + input_si.slot_width[i] / 2, band)] | ||||||
|  |     if filtered_indices: | ||||||
|  |         frequency = input_si.frequency[filtered_indices] | ||||||
|  |         baud_rate = input_si.baud_rate[filtered_indices] | ||||||
|  |         slot_width = input_si.slot_width[filtered_indices] | ||||||
|  |         signal = input_si.signal[filtered_indices] | ||||||
|  |         nli = input_si.nli[filtered_indices] | ||||||
|  |         ase = input_si.ase[filtered_indices] | ||||||
|  |         roll_off = input_si.roll_off[filtered_indices] | ||||||
|  |         chromatic_dispersion = input_si.chromatic_dispersion[filtered_indices] | ||||||
|  |         pmd = input_si.pmd[filtered_indices] | ||||||
|  |         pdl = input_si.pdl[filtered_indices] | ||||||
|  |         latency = input_si.latency[filtered_indices] | ||||||
|  |         delta_pdb_per_channel = input_si.delta_pdb_per_channel[filtered_indices] | ||||||
|  |         tx_osnr = input_si.tx_osnr[filtered_indices] | ||||||
|  |         tx_power = input_si.tx_power[filtered_indices] | ||||||
|  |         label = input_si.label[filtered_indices] | ||||||
|  |  | ||||||
|  |         return SpectralInformation(frequency=frequency, baud_rate=baud_rate, slot_width=slot_width, signal=signal, | ||||||
|  |                                    nli=nli, ase=ase, roll_off=roll_off, chromatic_dispersion=chromatic_dispersion, | ||||||
|  |                                    pmd=pmd, pdl=pdl, latency=latency, delta_pdb_per_channel=delta_pdb_per_channel, | ||||||
|  |                                    tx_osnr=tx_osnr, tx_power=tx_power, label=label) | ||||||
|  |     return None | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def muxed_spectral_information(input_si_list: List[SpectralInformation]) -> SpectralInformation: | ||||||
|  |     """return the assembled spectrum | ||||||
|  |     """ | ||||||
|  |     if input_si_list and len(input_si_list) > 1: | ||||||
|  |         si = input_si_list[0] + muxed_spectral_information(input_si_list[1:]) | ||||||
|  |         return si | ||||||
|  |     elif input_si_list and len(input_si_list) == 1: | ||||||
|  |         return input_si_list[0] | ||||||
|  |     else: | ||||||
|  |         raise ValueError('liste vide') | ||||||
|  |  | ||||||
|  |  | ||||||
| def carriers_to_spectral_information(initial_spectrum: dict[float, Carrier], | def carriers_to_spectral_information(initial_spectrum: dict[float, Carrier], | ||||||
|                                      power: float) -> SpectralInformation: |                                      power: float) -> SpectralInformation: | ||||||
|     """Initial spectrum is a dict with key = carrier frequency, and value a Carrier object. |     """Initial spectrum is a dict with key = carrier frequency, and value a Carrier object. | ||||||
|   | |||||||
							
								
								
									
										1192
									
								
								gnpy/core/network.py
									
									
									
									
									
								
							
							
						
						
									
										1192
									
								
								gnpy/core/network.py
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -8,7 +8,8 @@ gnpy.core.parameters | |||||||
| This module contains all parameters to configure standard network elements. | This module contains all parameters to configure standard network elements. | ||||||
| """ | """ | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  | from copy import deepcopy | ||||||
|  | from dataclasses import dataclass | ||||||
| from scipy.constants import c, pi | from scipy.constants import c, pi | ||||||
| from numpy import asarray, array, exp, sqrt, log, outer, ones, squeeze, append, flip, linspace, full | from numpy import asarray, array, exp, sqrt, log, outer, ones, squeeze, append, flip, linspace, full | ||||||
|  |  | ||||||
| @@ -35,25 +36,32 @@ class PumpParams(Parameters): | |||||||
|  |  | ||||||
|  |  | ||||||
| class RamanParams(Parameters): | class RamanParams(Parameters): | ||||||
|     def __init__(self, flag=False, result_spatial_resolution=10e3, solver_spatial_resolution=50): |     def __init__(self, flag=False, method='perturbative', order=2, result_spatial_resolution=10e3, | ||||||
|  |                  solver_spatial_resolution=10e3): | ||||||
|         """Simulation parameters used within the Raman Solver |         """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 flag: boolean for enabling/disable the evaluation of the Raman power profile in frequency and position | ||||||
|  |         :params method: Raman solver method | ||||||
|  |         :params order: solution order for perturbative method | ||||||
|         :params result_spatial_resolution: spatial resolution of the evaluated Raman power profile |         :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 |         :params solver_spatial_resolution: spatial step for the iterative solution of the first order ode | ||||||
|         """ |         """ | ||||||
|         self.flag = flag |         self.flag = flag | ||||||
|  |         self.method = method | ||||||
|  |         self.order = order | ||||||
|         self.result_spatial_resolution = result_spatial_resolution  # [m] |         self.result_spatial_resolution = result_spatial_resolution  # [m] | ||||||
|         self.solver_spatial_resolution = solver_spatial_resolution  # [m] |         self.solver_spatial_resolution = solver_spatial_resolution  # [m] | ||||||
|  |  | ||||||
|     def to_json(self): |     def to_json(self): | ||||||
|         return {"flag": self.flag, |         return {"flag": self.flag, | ||||||
|  |                 "method": self.method, | ||||||
|  |                 "order": self.order, | ||||||
|                 "result_spatial_resolution": self.result_spatial_resolution, |                 "result_spatial_resolution": self.result_spatial_resolution, | ||||||
|                 "solver_spatial_resolution": self.solver_spatial_resolution} |                 "solver_spatial_resolution": self.solver_spatial_resolution} | ||||||
|  |  | ||||||
|  |  | ||||||
| class NLIParams(Parameters): | class NLIParams(Parameters): | ||||||
|     def __init__(self, method='gn_model_analytic', dispersion_tolerance=1, phase_shift_tolerance=0.1, |     def __init__(self, method='gn_model_analytic', dispersion_tolerance=4, phase_shift_tolerance=0.1, | ||||||
|                  computed_channels=None, computed_number_of_channels=None): |                  computed_channels=None, computed_number_of_channels=None): | ||||||
|         """Simulation parameters used within the Nli Solver |         """Simulation parameters used within the Nli Solver | ||||||
|  |  | ||||||
| @@ -117,6 +125,8 @@ class RoadmParams(Parameters): | |||||||
|         except KeyError as e: |         except KeyError as e: | ||||||
|             raise ParametersError(f'ROADM configurations must include {e}. Configuration: {kwargs}') |             raise ParametersError(f'ROADM configurations must include {e}. Configuration: {kwargs}') | ||||||
|         self.per_degree_impairments = kwargs.get('per_degree_impairments', []) |         self.per_degree_impairments = kwargs.get('per_degree_impairments', []) | ||||||
|  |         self.design_bands = kwargs.get('design_bands', []) | ||||||
|  |         self.per_degree_design_bands = kwargs.get('per_degree_design_bands', {}) | ||||||
|  |  | ||||||
|     def get_roadm_path_impairments(self, path_impairments_list): |     def get_roadm_path_impairments(self, path_impairments_list): | ||||||
|         """Get the ROADM list of profiles for impairments definition |         """Get the ROADM list of profiles for impairments definition | ||||||
| @@ -134,7 +144,7 @@ class RoadmParams(Parameters): | |||||||
|         for path_impairment in path_impairments_list: |         for path_impairment in path_impairments_list: | ||||||
|             index = path_impairment['roadm-path-impairments-id'] |             index = path_impairment['roadm-path-impairments-id'] | ||||||
|             path_type = next(key for key in path_impairment if key in authorized_path_types.keys()) |             path_type = next(key for key in path_impairment if key in authorized_path_types.keys()) | ||||||
|             impairment_dict = dict({'path-type': authorized_path_types[path_type]}, **path_impairment[path_type][0]) |             impairment_dict = {'path-type': authorized_path_types[path_type], 'impairment': path_impairment[path_type]} | ||||||
|             roadm_path_impairments[index] = RoadmImpairment(impairment_dict) |             roadm_path_impairments[index] = RoadmImpairment(impairment_dict) | ||||||
|         return roadm_path_impairments |         return roadm_path_impairments | ||||||
|  |  | ||||||
| @@ -155,26 +165,24 @@ class RoadmPath: | |||||||
|  |  | ||||||
| class RoadmImpairment: | class RoadmImpairment: | ||||||
|     """Generic definition of impairments for express, add and drop""" |     """Generic definition of impairments for express, add and drop""" | ||||||
|  |     default_values = { | ||||||
|  |         'roadm-pmd': None, | ||||||
|  |         'roadm-cd': None, | ||||||
|  |         'roadm-pdl': None, | ||||||
|  |         'roadm-inband-crosstalk': None, | ||||||
|  |         'roadm-maxloss': 0, | ||||||
|  |         'roadm-osnr': None, | ||||||
|  |         'roadm-pmax': None, | ||||||
|  |         'roadm-noise-figure': None, | ||||||
|  |         'minloss': None, | ||||||
|  |         'typloss': None, | ||||||
|  |         'pmin': None, | ||||||
|  |         'ptyp': None | ||||||
|  |     } | ||||||
|  |  | ||||||
|     def __init__(self, params): |     def __init__(self, params): | ||||||
|         """Records roadm internal paths and types""" |  | ||||||
|         self.path_type = params.get('path-type') |         self.path_type = params.get('path-type') | ||||||
|         self.pmd = params.get('roadm-pmd') |         self.impairments = params['impairment'] | ||||||
|         self.cd = params.get('roadm-cd') |  | ||||||
|         self.pdl = params.get('roadm-pdl') |  | ||||||
|         self.inband_crosstalk = params.get('roadm-inband-crosstalk') |  | ||||||
|         self.maxloss = params.get('roadm-maxloss', 0) |  | ||||||
|         if params.get('frequency-range') is not None: |  | ||||||
|             self.fmin = params.get('frequency-range')['lower-frequency'] |  | ||||||
|             self.fmax = params.get('frequency-range')['upper-frequency'] |  | ||||||
|         else: |  | ||||||
|             self.fmin, self.fmax = None, None |  | ||||||
|         self.osnr = params.get('roadm-osnr', None) |  | ||||||
|         self.pmax = params.get('roadm-pmax', None) |  | ||||||
|         self.nf = params.get('roadm-noise-figure', None) |  | ||||||
|         self.minloss = params.get('minloss', None) |  | ||||||
|         self.typloss = params.get('typloss', None) |  | ||||||
|         self.pmin = params.get('pmin', None) |  | ||||||
|         self.ptyp = params.get('ptyp', None) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| class FusedParams(Parameters): | class FusedParams(Parameters): | ||||||
| @@ -463,10 +471,10 @@ class FiberParams(Parameters): | |||||||
|  |  | ||||||
| class EdfaParams: | class EdfaParams: | ||||||
|     default_values = { |     default_values = { | ||||||
|         'f_min': 191.3e12, |         'f_min': None, | ||||||
|         'f_max': 196.1e12, |         'f_max': None, | ||||||
|         'multi_band': None, |         'multi_band': None, | ||||||
|         'bands': [], |         'bands': None, | ||||||
|         'type_variety': '', |         'type_variety': '', | ||||||
|         'type_def': '', |         'type_def': '', | ||||||
|         'gain_flatmax': None, |         'gain_flatmax': None, | ||||||
| @@ -502,9 +510,11 @@ class EdfaParams: | |||||||
|             # Bandwidth |             # Bandwidth | ||||||
|             self.f_min = params['f_min'] |             self.f_min = params['f_min'] | ||||||
|             self.f_max = params['f_max'] |             self.f_max = params['f_max'] | ||||||
|             self.bandwidth = self.f_max - self.f_min |             self.bandwidth = self.f_max - self.f_min if self.f_max and self.f_min else None | ||||||
|             self.f_cent = (self.f_max + self.f_min) / 2 |             self.f_cent = (self.f_max + self.f_min) / 2 if self.f_max and self.f_min else None | ||||||
|             self.f_ripple_ref = params['f_ripple_ref'] |             self.f_ripple_ref = params['f_ripple_ref'] | ||||||
|  |             self.bands = [{'f_min': params['f_min'], | ||||||
|  |                            'f_max': params['f_max']}] | ||||||
|  |  | ||||||
|             # Gain |             # Gain | ||||||
|             self.gain_flatmax = params['gain_flatmax'] |             self.gain_flatmax = params['gain_flatmax'] | ||||||
| @@ -591,7 +601,7 @@ class EdfaParams: | |||||||
|  |  | ||||||
|     def update_params(self, kwargs): |     def update_params(self, kwargs): | ||||||
|         for k, v in kwargs.items(): |         for k, v in kwargs.items(): | ||||||
|             setattr(self, k, self.update_params(**v) if isinstance(v, dict) else v) |             setattr(self, k, v) | ||||||
|  |  | ||||||
|  |  | ||||||
| class EdfaOperational: | class EdfaOperational: | ||||||
| @@ -599,7 +609,7 @@ class EdfaOperational: | |||||||
|         'gain_target': None, |         'gain_target': None, | ||||||
|         'delta_p': None, |         'delta_p': None, | ||||||
|         'out_voa': None, |         'out_voa': None, | ||||||
|         'tilt_target': 0 |         'tilt_target': None | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     def __init__(self, **operational): |     def __init__(self, **operational): | ||||||
| @@ -614,3 +624,62 @@ class EdfaOperational: | |||||||
|         return (f'{type(self).__name__}(' |         return (f'{type(self).__name__}(' | ||||||
|                 f'gain_target={self.gain_target!r}, ' |                 f'gain_target={self.gain_target!r}, ' | ||||||
|                 f'tilt_target={self.tilt_target!r})') |                 f'tilt_target={self.tilt_target!r})') | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class MultiBandParams: | ||||||
|  |     default_values = { | ||||||
|  |         'bands': [], | ||||||
|  |         'type_variety': '', | ||||||
|  |         'type_def': None, | ||||||
|  |         'allowed_for_design': False | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     def __init__(self, **params): | ||||||
|  |         try: | ||||||
|  |             self.update_attr(params) | ||||||
|  |         except KeyError as e: | ||||||
|  |             raise ParametersError(f'Multiband configurations json must include {e}. Configuration: {params}') | ||||||
|  |  | ||||||
|  |     def update_attr(self, kwargs): | ||||||
|  |         clean_kwargs = {k: v for k, v in kwargs.items() if v != ''} | ||||||
|  |         for k, v in self.default_values.items(): | ||||||
|  |             # use deepcopy to avoid sharing same object amongst all instance when v is a list or a dict! | ||||||
|  |             if isinstance(v, (list, dict)): | ||||||
|  |                 setattr(self, k, clean_kwargs.get(k, deepcopy(v))) | ||||||
|  |             else: | ||||||
|  |                 setattr(self, k, clean_kwargs.get(k, v)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class TransceiverParams: | ||||||
|  |     def __init__(self, **params): | ||||||
|  |         self.design_bands = params.get('design_bands', []) | ||||||
|  |         self.per_degree_design_bands = params.get('per_degree_design_bands', {}) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @dataclass | ||||||
|  | class FrequencyBand: | ||||||
|  |     """Frequency band | ||||||
|  |     """ | ||||||
|  |     f_min: float | ||||||
|  |     f_max: float | ||||||
|  |  | ||||||
|  |  | ||||||
|  | DEFAULT_BANDS_DEFINITION = { | ||||||
|  |     "LBAND": FrequencyBand(f_min=187e12, f_max=189e12), | ||||||
|  |     "CBAND": FrequencyBand(f_min=191.3e12, f_max=196.0e12) | ||||||
|  | } | ||||||
|  | # use this definition to index amplifiers'element of a multiband amplifier. | ||||||
|  | # this is not the design band | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def find_band_name(band: FrequencyBand) -> str: | ||||||
|  |     """return the default band name (CBAND, LBAND, ...) that corresponds to the band frequency range | ||||||
|  |     Use the band center frequency: if center frequency is inside the band then returns CBAND. | ||||||
|  |     This is to flexibly encompass all kind of bands definitions. | ||||||
|  |     returns the first matching band name. | ||||||
|  |     """ | ||||||
|  |     for band_name, frequency_range in DEFAULT_BANDS_DEFINITION.items(): | ||||||
|  |         center_frequency = (band.f_min + band.f_max) / 2 | ||||||
|  |         if center_frequency >= frequency_range.f_min and center_frequency <= frequency_range.f_max: | ||||||
|  |             return band_name | ||||||
|  |     return 'unknown_band' | ||||||
|   | |||||||
| @@ -12,14 +12,14 @@ The solvers take as input instances of the spectral information, the fiber and t | |||||||
|  |  | ||||||
| from numpy import interp, pi, zeros, cos, array, append, ones, exp, arange, sqrt, trapz, arcsinh, clip, abs, sum, \ | from numpy import interp, pi, zeros, cos, array, append, ones, exp, arange, sqrt, trapz, arcsinh, clip, abs, sum, \ | ||||||
|     concatenate, flip, outer, inner, transpose, max, format_float_scientific, diag, sort, unique, argsort, cumprod, \ |     concatenate, flip, outer, inner, transpose, max, format_float_scientific, diag, sort, unique, argsort, cumprod, \ | ||||||
|     polyfit |     polyfit, log, reshape, swapaxes, full, nan, cumsum | ||||||
| from logging import getLogger | from logging import getLogger | ||||||
| from scipy.constants import k, h | from scipy.constants import k, h | ||||||
| from scipy.interpolate import interp1d | from scipy.interpolate import interp1d | ||||||
| from math import isclose | from math import isclose, factorial | ||||||
|  |  | ||||||
| from gnpy.core.utils import db2lin, lin2db | from gnpy.core.utils import db2lin, lin2db | ||||||
| from gnpy.core.exceptions import EquipmentConfigError | from gnpy.core.exceptions import EquipmentConfigError, ParametersError | ||||||
| from gnpy.core.parameters import SimParams | from gnpy.core.parameters import SimParams | ||||||
| from gnpy.core.info import SpectralInformation | from gnpy.core.info import SpectralInformation | ||||||
|  |  | ||||||
| @@ -136,15 +136,17 @@ class RamanSolver: | |||||||
|                     co_cr = fiber.cr(co_frequency) |                     co_cr = fiber.cr(co_frequency) | ||||||
|                     co_alpha = fiber.alpha(co_frequency) |                     co_alpha = fiber.alpha(co_frequency) | ||||||
|                     co_power_profile = \ |                     co_power_profile = \ | ||||||
|                         RamanSolver.first_order_derivative_solution(co_power, co_alpha, co_cr, z, lumped_losses) |                         RamanSolver.calculate_unidirectional_stimulated_raman_scattering(co_power, co_alpha, co_cr, z, | ||||||
|  |                                                                                          lumped_losses) | ||||||
|                 # Counter-propagating profile initialization |                 # Counter-propagating profile initialization | ||||||
|                 cnt_power_profile = zeros([cnt_frequency.size, z.size]) |                 cnt_power_profile = zeros([cnt_frequency.size, z.size]) | ||||||
|                 if cnt_frequency.size: |                 if cnt_frequency.size: | ||||||
|                     cnt_cr = fiber.cr(cnt_frequency) |                     cnt_cr = fiber.cr(cnt_frequency) | ||||||
|                     cnt_alpha = fiber.alpha(cnt_frequency) |                     cnt_alpha = fiber.alpha(cnt_frequency) | ||||||
|                     cnt_power_profile = \ |                     cnt_power_profile = flip( | ||||||
|                         flip(RamanSolver.first_order_derivative_solution(cnt_power, cnt_alpha, cnt_cr, |                         RamanSolver.calculate_unidirectional_stimulated_raman_scattering(cnt_power, cnt_alpha, cnt_cr, | ||||||
|                                                                          z[-1] - flip(z), flip(lumped_losses)), axis=1) |                                                                                          z[-1] - flip(z), | ||||||
|  |                                                                                          flip(lumped_losses)), axis=1) | ||||||
|                 # Co-propagating and Counter-propagating Profile Computation |                 # Co-propagating and Counter-propagating Profile Computation | ||||||
|                 if co_frequency.size and cnt_frequency.size: |                 if co_frequency.size and cnt_frequency.size: | ||||||
|                     co_power_profile, cnt_power_profile = \ |                     co_power_profile, cnt_power_profile = \ | ||||||
| @@ -163,8 +165,9 @@ class RamanSolver: | |||||||
|                 alpha = fiber.alpha(spectral_info.frequency) |                 alpha = fiber.alpha(spectral_info.frequency) | ||||||
|                 cr = fiber.cr(spectral_info.frequency) |                 cr = fiber.cr(spectral_info.frequency) | ||||||
|                 # Power profile |                 # Power profile | ||||||
|                 power_profile = \ |                 power_profile = ( | ||||||
|                     RamanSolver.first_order_derivative_solution(spectral_info.signal, alpha, cr, z, lumped_losses) |                     RamanSolver.calculate_unidirectional_stimulated_raman_scattering(spectral_info.signal, alpha, cr, z, | ||||||
|  |                                                                                      lumped_losses)) | ||||||
|                 # Loss profile |                 # Loss profile | ||||||
|                 loss_profile = power_profile / outer(spectral_info.signal, ones(z.size)) |                 loss_profile = power_profile / outer(spectral_info.signal, ones(z.size)) | ||||||
|                 frequency = spectral_info.frequency |                 frequency = spectral_info.frequency | ||||||
| @@ -200,8 +203,8 @@ class RamanSolver: | |||||||
|         return ase |         return ase | ||||||
|  |  | ||||||
|     @staticmethod |     @staticmethod | ||||||
|     def first_order_derivative_solution(power_in, alpha, cr, z, lumped_losses): |     def calculate_unidirectional_stimulated_raman_scattering(power_in, alpha, cr, z, lumped_losses): | ||||||
|         """Solves the Raman first order derivative equation |         """Solves the Raman equation | ||||||
|  |  | ||||||
|         :param power_in: launch power array |         :param power_in: launch power array | ||||||
|         :param alpha: loss coefficient array |         :param alpha: loss coefficient array | ||||||
| @@ -210,18 +213,66 @@ class RamanSolver: | |||||||
|         :param lumped_losses: concentrated losses array along the fiber span |         :param lumped_losses: concentrated losses array along the fiber span | ||||||
|         :return: power profile matrix |         :return: power profile matrix | ||||||
|         """ |         """ | ||||||
|         dz = z[1:] - z[:-1] |         if sim_params.raman_params.method == 'perturbative': | ||||||
|         power = outer(power_in, ones(z.size)) |             if sim_params.raman_params.order > 4: | ||||||
|         for i in range(1, z.size): |                 raise ValueError(f'Order {sim_params.raman_params.order} not implemented in Raman Solver.') | ||||||
|             power[:, i] = \ |             z_lumped_losses = append(z[lumped_losses != 1], z[-1]) | ||||||
|                 power[:, i - 1] * (1 + (- alpha + sum(cr * power[:, i - 1], 1)) * dz[i - 1]) * lumped_losses[i - 1] |             llumped_losses = append(1, lumped_losses[lumped_losses != 1]) | ||||||
|  |             power = outer(power_in, ones(z.size)) | ||||||
|  |             last_position = 0 | ||||||
|  |             z_indices = arange(0, z.size) | ||||||
|  |  | ||||||
|  |             for z_lumped_loss, lumped_loss in zip(z_lumped_losses, llumped_losses): | ||||||
|  |                 if last_position < z[-1]: | ||||||
|  |                     interval = z_indices[(z >= last_position) * (z <= z_lumped_loss) == 1] | ||||||
|  |                     z_interval = z[interval] - last_position | ||||||
|  |                     dz = z_interval[1:] - z_interval[:-1] | ||||||
|  |                     last_position = z[interval][-1] | ||||||
|  |                     p0 = power_in * lumped_loss | ||||||
|  |                     power_interval = outer(p0, ones(z_interval.size)) | ||||||
|  |                     alphaz = outer(alpha, z_interval) | ||||||
|  |                     expz = exp(- alphaz) | ||||||
|  |                     eff_length = 1 / outer(alpha, ones(z_interval.size)) * (1 - expz) | ||||||
|  |                     crpz = transpose(ones([z_interval.size, cr.shape[0], cr.shape[1]]) * cr * p0, (1, 2, 0)) | ||||||
|  |                     exponent = - alphaz | ||||||
|  |                     if sim_params.raman_params.order >= 1: | ||||||
|  |                         gamma1 = sum(crpz * eff_length, 1) | ||||||
|  |                         exponent += gamma1 | ||||||
|  |                     if sim_params.raman_params.order >= 2: | ||||||
|  |                         z_integrand = expz * gamma1 | ||||||
|  |                         z_integral = cumsum((z_integrand[:, :-1] + z_integrand[:, 1:]) / 2 * dz, 1) | ||||||
|  |                         gamma2 = zeros(gamma1.shape) | ||||||
|  |                         gamma2[:, 1:] = sum(crpz[:, :, 1:] * z_integral, 1) | ||||||
|  |                         exponent += gamma2 | ||||||
|  |                     if sim_params.raman_params.order >= 3: | ||||||
|  |                         z_integrand = expz * (gamma2 + 1/2 * gamma1**2) | ||||||
|  |                         z_integral = cumsum((z_integrand[:, :-1] + z_integrand[:, 1:]) / 2 * dz, 1) | ||||||
|  |                         gamma3 = zeros(gamma1.shape) | ||||||
|  |                         gamma3[:, 1:] = sum(crpz[:, :, 1:] * z_integral, 1) | ||||||
|  |                         exponent += gamma3 | ||||||
|  |                     if sim_params.raman_params.order >= 4: | ||||||
|  |                         z_integrand = expz * (gamma3 + gamma1 * gamma2 + 1/factorial(3) * gamma1**3) | ||||||
|  |                         z_integral = cumsum((z_integrand[:, :-1] + z_integrand[:, 1:]) / 2 * dz, 1) | ||||||
|  |                         gamma4 = zeros(gamma1.shape) | ||||||
|  |                         gamma4[:, 1:] = sum(crpz[:, :, 1:] * z_integral, 1) | ||||||
|  |                         exponent += gamma4 | ||||||
|  |                     power_interval *= exp(exponent) | ||||||
|  |                     power[:, interval[1:]] = power_interval[:, 1:] | ||||||
|  |                     power_in = power_interval[:, -1] | ||||||
|  |         elif sim_params.raman_params.method == 'numerical': | ||||||
|  |             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]) * | ||||||
|  |                                lumped_losses[i - 1]) | ||||||
|  |         else: | ||||||
|  |             raise ValueError(f'Method {sim_params.raman_params.method} not implemented in Raman Solver.') | ||||||
|         return power |         return power | ||||||
|  |  | ||||||
|     @staticmethod |     @staticmethod | ||||||
|     def iterative_algorithm(co_initial_guess_power, cnt_initial_guess_power, co_frequency, cnt_frequency, z, fiber, |     def iterative_algorithm(co_initial_guess_power, cnt_initial_guess_power, co_frequency, cnt_frequency, z, fiber, | ||||||
|                             lumped_losses): |                             lumped_losses): | ||||||
|         """Solves the Raman first order derivative equation in case of both co- and counter-propagating |         """Solves the Raman equation in case of both co- and counter-propagating frequencies | ||||||
|         frequencies |  | ||||||
|  |  | ||||||
|         :param co_initial_guess_power: co-propagationg Raman first order derivative equation solution |         :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 cnt_initial_guess_power: counter-propagationg Raman first order derivative equation solution | ||||||
| @@ -276,6 +327,7 @@ class NliSolver: | |||||||
|     List of implemented methods: |     List of implemented methods: | ||||||
|     'gn_model_analytic': eq. 120 from arXiv:1209.0394 |     'gn_model_analytic': eq. 120 from arXiv:1209.0394 | ||||||
|     'ggn_spectrally_separated': eq. 21 from arXiv: 1710.02225 |     'ggn_spectrally_separated': eq. 21 from arXiv: 1710.02225 | ||||||
|  |     'ggn_approx': eq. 24-25 jlt:9741324 | ||||||
|     """ |     """ | ||||||
|  |  | ||||||
|     SPM_WEIGHT = (16.0 / 27.0) |     SPM_WEIGHT = (16.0 / 27.0) | ||||||
| @@ -324,6 +376,28 @@ class NliSolver: | |||||||
|             g_nli = sum(g_nli, 1) |             g_nli = sum(g_nli, 1) | ||||||
|             g_nli = interp(spectral_info.frequency, cut_frequency, g_nli) |             g_nli = interp(spectral_info.frequency, cut_frequency, g_nli) | ||||||
|             nli = spectral_info.baud_rate * g_nli  # Local white noise |             nli = spectral_info.baud_rate * g_nli  # Local white noise | ||||||
|  |         elif 'ggn_approx' in sim_params.nli_params.method: | ||||||
|  |             if sim_params.nli_params.computed_channels is not None: | ||||||
|  |                 cut_indices = array(sim_params.nli_params.computed_channels) - 1 | ||||||
|  |             elif sim_params.nli_params.computed_number_of_channels is not None: | ||||||
|  |                 nb_ch_computed = sim_params.nli_params.computed_number_of_channels | ||||||
|  |                 nb_ch = len(spectral_info.channel_number) | ||||||
|  |                 cut_indices = array([round(i * (nb_ch - 1) / (nb_ch_computed - 1)) for i in range(0, nb_ch_computed)]) | ||||||
|  |             else: | ||||||
|  |                 cut_indices = array(spectral_info.channel_number) - 1 | ||||||
|  |  | ||||||
|  |             eta = NliSolver._ggn_approx(cut_indices, spectral_info, fiber, srs) | ||||||
|  |  | ||||||
|  |             # Interpolation over the channels not indicated as computed channels in simulation parameters | ||||||
|  |             cut_power = outer(spectral_info.signal[cut_indices], ones(spectral_info.number_of_channels)) | ||||||
|  |             cut_frequency = spectral_info.frequency[cut_indices] | ||||||
|  |             pump_power = outer(ones(cut_indices.size), spectral_info.signal) | ||||||
|  |             cut_baud_rate = outer(spectral_info.baud_rate[cut_indices], ones(spectral_info.number_of_channels)) | ||||||
|  |  | ||||||
|  |             g_nli = eta * cut_power * pump_power ** 2 / cut_baud_rate | ||||||
|  |             g_nli = sum(g_nli, 1) | ||||||
|  |             g_nli = interp(spectral_info.frequency, cut_frequency, g_nli) | ||||||
|  |             nli = spectral_info.baud_rate * g_nli  # Local white noise | ||||||
|         else: |         else: | ||||||
|             raise ValueError(f'Method {sim_params.nli_params.method} not implemented.') |             raise ValueError(f'Method {sim_params.nli_params.method} not implemented.') | ||||||
|  |  | ||||||
| @@ -526,6 +600,89 @@ class NliSolver: | |||||||
|         freq_offset_th = ((k_ref * delta_f_ref) * rs_ref * beta2_ref) / (beta2 * symbol_rate) |         freq_offset_th = ((k_ref * delta_f_ref) * rs_ref * beta2_ref) / (beta2 * symbol_rate) | ||||||
|         return freq_offset_th |         return freq_offset_th | ||||||
|  |  | ||||||
|  |     @staticmethod | ||||||
|  |     def _ggn_approx(cut_indices, spectral_info: SpectralInformation, fiber, srs, spm_weight=SPM_WEIGHT, | ||||||
|  |                     xpm_weight=XPM_WEIGHT): | ||||||
|  |         """Computes the nonlinear interference power evaluated at the fiber input. | ||||||
|  |         The method uses eq. 24-25 of https://ieeexplore.ieee.org/document/9741324 | ||||||
|  |         """ | ||||||
|  |         # Spectral Features | ||||||
|  |         nch = spectral_info.number_of_channels | ||||||
|  |         frequency = spectral_info.frequency | ||||||
|  |         baud_rate = spectral_info.baud_rate | ||||||
|  |         slot_width = spectral_info.slot_width | ||||||
|  |         roll_off = spectral_info.roll_off | ||||||
|  |         df = spectral_info.df + diag(full(nch, nan)) | ||||||
|  |  | ||||||
|  |         # Physical fiber parameters | ||||||
|  |         alpha = fiber.alpha(frequency) | ||||||
|  |         beta2 = fiber.beta2(frequency) | ||||||
|  |         gamma = outer(fiber.gamma(frequency[cut_indices]), ones(nch)) | ||||||
|  |  | ||||||
|  |         identity = diag(ones(nch)) | ||||||
|  |         weight = spm_weight * identity + xpm_weight * (ones([nch, nch]) - identity) | ||||||
|  |         weight = weight[cut_indices, :] | ||||||
|  |  | ||||||
|  |         dispersion_tolerance = sim_params.nli_params.dispersion_tolerance | ||||||
|  |         phase_shift_tolerance = sim_params.nli_params.phase_shift_tolerance | ||||||
|  |         max_slot_width = max(slot_width) | ||||||
|  |         max_beta2 = max(abs(beta2)) | ||||||
|  |         delta_z = sim_params.raman_params.result_spatial_resolution | ||||||
|  |  | ||||||
|  |         # Approximation psi | ||||||
|  |         loss_profile = srs.loss_profile[:nch] | ||||||
|  |         z = srs.z | ||||||
|  |         psi = NliSolver._approx_psi(df=df, frequency=frequency, beta2=beta2, baud_rate=baud_rate, | ||||||
|  |                                     loss_profile=loss_profile, z=z) | ||||||
|  |  | ||||||
|  |         # GGN for SPM | ||||||
|  |         for cut_index in cut_indices: | ||||||
|  |             dn = 0 | ||||||
|  |             cut_frequency = frequency[cut_index] | ||||||
|  |             cut_baud_rate = baud_rate[cut_index] | ||||||
|  |             cut_roll_off = roll_off[cut_index] | ||||||
|  |             cut_beta2 = beta2[cut_index] | ||||||
|  |             cut_alpha = alpha[cut_index] | ||||||
|  |             k_tol = dispersion_tolerance * abs(cut_alpha) | ||||||
|  |             phi_tol = phase_shift_tolerance / delta_z | ||||||
|  |             f_cut_resolution = min(k_tol, phi_tol) / abs(max_beta2) / (4 * pi ** 2 * (1 + dn) * max_slot_width) | ||||||
|  |             f_pump_resolution = min(k_tol, phi_tol) / abs(max_beta2) / (4 * pi ** 2 * max_slot_width) | ||||||
|  |             psi[cut_index, cut_index] = NliSolver._generalized_psi(cut_frequency, cut_frequency, cut_baud_rate, | ||||||
|  |                                                                    cut_roll_off, cut_frequency, cut_baud_rate, | ||||||
|  |                                                                    cut_roll_off, f_cut_resolution, f_pump_resolution, | ||||||
|  |                                                                    srs, cut_alpha, cut_beta2, 0, cut_frequency) | ||||||
|  |         psi = psi[cut_indices, :] | ||||||
|  |         cut_baud_rate = outer(baud_rate[cut_indices], ones(nch)) | ||||||
|  |         pump_baud_rate = outer(ones(cut_indices.size), baud_rate) | ||||||
|  |  | ||||||
|  |         eta_cut_central_frequency = \ | ||||||
|  |             gamma ** 2 * weight * psi / (cut_baud_rate * pump_baud_rate ** 2) | ||||||
|  |         eta = cut_baud_rate * eta_cut_central_frequency  # Local white noise | ||||||
|  |  | ||||||
|  |         return eta | ||||||
|  |  | ||||||
|  |     @staticmethod | ||||||
|  |     def _approx_psi(df, frequency, baud_rate, beta2, loss_profile, z): | ||||||
|  |         """Computes the approximated psi function similarly to the one used in the GN model. | ||||||
|  |         The method uses eq. 25 of https://ieeexplore.ieee.org/document/9741324""" | ||||||
|  |         pump_baud_rate = outer(ones(frequency.size), baud_rate) | ||||||
|  |         cut_beta = outer(beta2, ones(frequency.size)) | ||||||
|  |         pump_beta = outer(ones(frequency.size), beta2) | ||||||
|  |         delta_z = abs(z[:-1] - z[1:]) | ||||||
|  |  | ||||||
|  |         loss_lin = log(loss_profile) | ||||||
|  |         pump_alpha = (loss_lin[:, 1:] - loss_lin[:, :-1]) / delta_z | ||||||
|  |         leff = abs((loss_profile[:, 1:] - loss_profile[:, :-1]) / sqrt(abs(pump_alpha))) * pump_alpha / abs(pump_alpha) | ||||||
|  |         leff = reshape(outer(leff, ones(z.size - 1)), newshape=[leff.shape[0], leff.shape[1], leff.shape[1]]) | ||||||
|  |         leff2 = leff * swapaxes(leff, 2, 1) | ||||||
|  |         leff2 = sum(leff2, axis=(1, 2)) | ||||||
|  |         z_int = outer(ones(frequency.size), leff2) | ||||||
|  |  | ||||||
|  |         delta_beta = (cut_beta + pump_beta) / 2 | ||||||
|  |         psi = z_int * pump_baud_rate / (4 * pi * abs(delta_beta * df)) | ||||||
|  |         return psi | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def estimate_nf_model(type_variety, gain_min, gain_max, nf_min, nf_max): | def estimate_nf_model(type_variety, gain_min, gain_max, nf_min, nf_max): | ||||||
|     if nf_min < -10: |     if nf_min < -10: | ||||||
|   | |||||||
| @@ -12,6 +12,7 @@ from csv import writer | |||||||
| from numpy import pi, cos, sqrt, log10, linspace, zeros, shape, where, logical_and, mean, array | from numpy import pi, cos, sqrt, log10, linspace, zeros, shape, where, logical_and, mean, array | ||||||
| from scipy import constants | from scipy import constants | ||||||
| from copy import deepcopy | from copy import deepcopy | ||||||
|  | from typing import List | ||||||
|  |  | ||||||
| from gnpy.core.exceptions import ConfigurationError | from gnpy.core.exceptions import ConfigurationError | ||||||
|  |  | ||||||
| @@ -458,3 +459,69 @@ def calculate_absolute_min_or_zero(x: array) -> array: | |||||||
|     array([1., 0., 3.]) |     array([1., 0., 3.]) | ||||||
|     """ |     """ | ||||||
|     return (abs(x) - x) / 2 |     return (abs(x) - x) / 2 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def nice_column_str(data: List[List[str]], max_length: int = 30, padding: int = 1) -> str: | ||||||
|  |     """data is a list of rows, creates strings with nice alignment per colum and padding with spaces | ||||||
|  |     letf justified | ||||||
|  |  | ||||||
|  |     >>> table_data = [['aaa', 'b', 'c'], ['aaaaaaaa', 'bbb', 'c'], ['a', 'bbbbbbbbbb', 'c']] | ||||||
|  |     >>> print(nice_column_str(table_data)) | ||||||
|  |     aaa      b          c  | ||||||
|  |     aaaaaaaa bbb        c  | ||||||
|  |     a        bbbbbbbbbb c  | ||||||
|  |     """ | ||||||
|  |     # transpose data to determine size of columns | ||||||
|  |     transposed_data = list(map(list, zip(*data))) | ||||||
|  |     column_width = [max(len(word) for word in column) + padding for column in transposed_data] | ||||||
|  |     nice_str = [] | ||||||
|  |     for row in data: | ||||||
|  |         column = ''.join(word[0:max_length].ljust(min(width, max_length)) for width, word in zip(column_width, row)) | ||||||
|  |         nice_str.append(f'{column}') | ||||||
|  |     return '\n'.join(nice_str) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def find_common_range(amp_bands: List[List[dict]], default_band_f_min: float, default_band_f_max: float) \ | ||||||
|  |         -> List[dict]: | ||||||
|  |     """Find the common frequency range of bands | ||||||
|  |     If there are no amplifiers in the path, then use default band | ||||||
|  |  | ||||||
|  |     >>> amp_bands = [[{'f_min': 191e12, 'f_max' : 195e12}, {'f_min': 186e12, 'f_max' : 190e12} ], \ | ||||||
|  |         [{'f_min': 185e12, 'f_max' : 189e12}, {'f_min': 192e12, 'f_max' : 196e12}], \ | ||||||
|  |         [{'f_min': 186e12, 'f_max': 193e12}]] | ||||||
|  |     >>> find_common_range(amp_bands, 190e12, 195e12) | ||||||
|  |     [{'f_min': 186000000000000.0, 'f_max': 189000000000000.0}, {'f_min': 192000000000000.0, 'f_max': 193000000000000.0}] | ||||||
|  |     >>> amp_bands = [[{'f_min': 191e12, 'f_max' : 195e12}, {'f_min': 186e12, 'f_max' : 190e12} ], \ | ||||||
|  |         [{'f_min': 185e12, 'f_max' : 189e12}, {'f_min': 192e12, 'f_max' : 196e12}], \ | ||||||
|  |         [{'f_min': 186e12, 'f_max': 192e12}]] | ||||||
|  |     >>> find_common_range(amp_bands, 190e12, 195e12) | ||||||
|  |     [{'f_min': 186000000000000.0, 'f_max': 189000000000000.0}] | ||||||
|  |  | ||||||
|  |     """ | ||||||
|  |     _amp_bands = [sorted(amp, key=lambda x: x['f_min']) for amp in amp_bands] | ||||||
|  |     _temp = [] | ||||||
|  |     # remove None bands | ||||||
|  |     for amp in _amp_bands: | ||||||
|  |         is_band = True | ||||||
|  |         for band in amp: | ||||||
|  |             if not (is_band and band['f_min'] and band['f_max']): | ||||||
|  |                 is_band = False | ||||||
|  |         if is_band: | ||||||
|  |             _temp.append(amp) | ||||||
|  |  | ||||||
|  |     # remove duplicate | ||||||
|  |     unique_amp_bands = [] | ||||||
|  |     for amp in _temp: | ||||||
|  |         if amp not in unique_amp_bands: | ||||||
|  |             unique_amp_bands.append(amp) | ||||||
|  |     if unique_amp_bands: | ||||||
|  |         common_range = unique_amp_bands[0] | ||||||
|  |     else: | ||||||
|  |         if default_band_f_min is None or default_band_f_max is None: | ||||||
|  |             return [] | ||||||
|  |         common_range = [{'f_min': default_band_f_min, 'f_max': default_band_f_max}] | ||||||
|  |     for bands in unique_amp_bands: | ||||||
|  |         common_range = [{'f_min': max(first['f_min'], second['f_min']), 'f_max': min(first['f_max'], second['f_max'])} | ||||||
|  |                         for first in common_range for second in bands | ||||||
|  |                         if max(first['f_min'], second['f_min']) < min(first['f_max'], second['f_max'])] | ||||||
|  |     return sorted(common_range, key=lambda x: x['f_min']) | ||||||
|   | |||||||
| @@ -5,8 +5,8 @@ | |||||||
|   "gain_ripple": [ |   "gain_ripple": [ | ||||||
|     0.0 |     0.0 | ||||||
|   ], |   ], | ||||||
|   "f_min": 191.35e12, |   "f_min": 191.275e12, | ||||||
|   "f_max": 196.1e12, |   "f_max": 196.125e12, | ||||||
|   "dgt": [ |   "dgt": [ | ||||||
|     1.0, |     1.0, | ||||||
|     1.017807767853702, |     1.017807767853702, | ||||||
|   | |||||||
							
								
								
									
										479
									
								
								gnpy/example-data/eqpt_config_multiband.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										479
									
								
								gnpy/example-data/eqpt_config_multiband.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,479 @@ | |||||||
|  | { | ||||||
|  |     "Edfa": [ | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_high_gain", | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 35, | ||||||
|  |             "gain_min": 25, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf_min": 5.5, | ||||||
|  |             "nf_max": 7, | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_medium_gain", | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 26, | ||||||
|  |             "gain_min": 15, | ||||||
|  |             "p_max": 23, | ||||||
|  |             "nf_min": 6, | ||||||
|  |             "nf_max": 10, | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_low_gain", | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 16, | ||||||
|  |             "gain_min": 8, | ||||||
|  |             "p_max": 23, | ||||||
|  |             "nf_min": 6.5, | ||||||
|  |             "nf_max": 11, | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "high_power", | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 16, | ||||||
|  |             "gain_min": 8, | ||||||
|  |             "p_max": 25, | ||||||
|  |             "nf_min": 9, | ||||||
|  |             "nf_max": 15, | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": false | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_fixed_gain", | ||||||
|  |             "type_def": "fixed_gain", | ||||||
|  |             "gain_flatmax": 21, | ||||||
|  |             "gain_min": 20, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf0": 5.5, | ||||||
|  |             "allowed_for_design": false | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "4pumps_raman", | ||||||
|  |             "type_def": "fixed_gain", | ||||||
|  |             "gain_flatmax": 12, | ||||||
|  |             "gain_min": 12, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf0": -1, | ||||||
|  |             "allowed_for_design": false | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "hybrid_4pumps_lowgain", | ||||||
|  |             "type_def": "dual_stage", | ||||||
|  |             "raman": true, | ||||||
|  |             "gain_min": 25, | ||||||
|  |             "preamp_variety": "4pumps_raman", | ||||||
|  |             "booster_variety": "std_low_gain", | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "hybrid_4pumps_mediumgain", | ||||||
|  |             "type_def": "dual_stage", | ||||||
|  |             "raman": true, | ||||||
|  |             "gain_min": 25, | ||||||
|  |             "preamp_variety": "4pumps_raman", | ||||||
|  |             "booster_variety": "std_medium_gain", | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "medium+low_gain", | ||||||
|  |             "type_def": "dual_stage", | ||||||
|  |             "gain_min": 25, | ||||||
|  |             "preamp_variety": "std_medium_gain", | ||||||
|  |             "booster_variety": "std_low_gain", | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "medium+high_power", | ||||||
|  |             "type_def": "dual_stage", | ||||||
|  |             "gain_min": 25, | ||||||
|  |             "preamp_variety": "std_medium_gain", | ||||||
|  |             "booster_variety": "high_power", | ||||||
|  |             "allowed_for_design": false | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_medium_gain_C", | ||||||
|  |             "f_min": 191.225e12, | ||||||
|  |             "f_max": 196.125e12, | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 26, | ||||||
|  |             "gain_min": 15, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf_min": 6, | ||||||
|  |             "nf_max": 10, | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": false | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_medium_gain_L", | ||||||
|  |             "f_min": 186.5e12, | ||||||
|  |             "f_max": 190.1e12, | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 26, | ||||||
|  |             "gain_min": 15, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf_min": 6, | ||||||
|  |             "nf_max": 10, | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_low_gain", | ||||||
|  |             "f_min": 191.25e12, | ||||||
|  |             "f_max": 196.15e12, | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 16, | ||||||
|  |             "gain_min": 8, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf_min": 7, | ||||||
|  |             "nf_max": 11, | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_low_gain_reduced_band", | ||||||
|  |             "f_min": 192.25e12, | ||||||
|  |             "f_max": 196.15e12, | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 16, | ||||||
|  |             "gain_min": 8, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf_min": 7, | ||||||
|  |             "nf_max": 11, | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_low_gain_bis", | ||||||
|  |             "f_min": 191.25e12, | ||||||
|  |             "f_max": 196.15e12, | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 16, | ||||||
|  |             "gain_min": 8, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf_min": 6, | ||||||
|  |             "nf_max": 10, | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_low_gain_L_ter", | ||||||
|  |             "f_min": 186.55e12, | ||||||
|  |             "f_max": 190.05e12, | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 16, | ||||||
|  |             "gain_min": 8, | ||||||
|  |             "p_max": 16, | ||||||
|  |             "nf_min": 7, | ||||||
|  |             "nf_max": 11, | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_low_gain_L", | ||||||
|  |             "f_min": 186.55e12, | ||||||
|  |             "f_max": 190.05e12, | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 16, | ||||||
|  |             "gain_min": 8, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf_min": 7, | ||||||
|  |             "nf_max": 11, | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_low_gain_L_reduced_band", | ||||||
|  |             "f_min": 187.3e12, | ||||||
|  |             "f_max": 190.05e12, | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 16, | ||||||
|  |             "gain_min": 8, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf_min": 7, | ||||||
|  |             "nf_max": 11, | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "test", | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 25, | ||||||
|  |             "gain_min": 15, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf_min": 5.8, | ||||||
|  |             "nf_max": 10, | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "test_fixed_gain", | ||||||
|  |             "type_def": "fixed_gain", | ||||||
|  |             "gain_flatmax": 21, | ||||||
|  |             "gain_min": 20, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf0": 5, | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_booster", | ||||||
|  |             "type_def": "fixed_gain", | ||||||
|  |             "gain_flatmax": 21, | ||||||
|  |             "gain_min": 20, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf0": 5, | ||||||
|  |             "allowed_for_design": false | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_booster_L", | ||||||
|  |             "f_min": 186.55e12, | ||||||
|  |             "f_max": 190.05e12, | ||||||
|  |             "type_def": "fixed_gain", | ||||||
|  |             "gain_flatmax": 21, | ||||||
|  |             "gain_min": 20, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf0": 5, | ||||||
|  |             "allowed_for_design": false | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_booster_multiband", | ||||||
|  |             "type_def": "multi_band", | ||||||
|  |             "amplifiers": [ | ||||||
|  |                 "std_booster", | ||||||
|  |                 "std_booster_L" | ||||||
|  |             ], | ||||||
|  |             "allowed_for_design": false | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_medium_gain_multiband", | ||||||
|  |             "type_def": "multi_band", | ||||||
|  |             "amplifiers": [ | ||||||
|  |                 "std_medium_gain_C", | ||||||
|  |                 "std_medium_gain_L" | ||||||
|  |             ], | ||||||
|  |             "allowed_for_design": false | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_low_gain_multiband", | ||||||
|  |             "type_def": "multi_band", | ||||||
|  |             "amplifiers": [ | ||||||
|  |                 "std_low_gain", | ||||||
|  |                 "std_low_gain_L" | ||||||
|  |             ], | ||||||
|  |             "allowed_for_design": false | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_low_gain_multiband_ter", | ||||||
|  |             "type_def": "multi_band", | ||||||
|  |             "amplifiers": [ | ||||||
|  |                 "std_low_gain", | ||||||
|  |                 "std_low_gain_L_ter" | ||||||
|  |             ], | ||||||
|  |             "allowed_for_design": false | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_low_gain_multiband_bis", | ||||||
|  |             "type_def": "multi_band", | ||||||
|  |             "amplifiers": [ | ||||||
|  |                 "std_low_gain_bis", | ||||||
|  |                 "std_low_gain_L" | ||||||
|  |             ], | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_low_gain_multiband_reduced", | ||||||
|  |             "type_def": "multi_band", | ||||||
|  |             "amplifiers": [ | ||||||
|  |                 "std_low_gain_reduced", | ||||||
|  |                 "std_low_gain_L" | ||||||
|  |             ], | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_low_gain_multiband_reduced", | ||||||
|  |             "type_def": "multi_band", | ||||||
|  |             "amplifiers": [ | ||||||
|  |                 "std_low_gain_bis", | ||||||
|  |                 "std_low_gain_L_reduced_band" | ||||||
|  |             ], | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         } | ||||||
|  |     ], | ||||||
|  |     "Fiber": [ | ||||||
|  |         { | ||||||
|  |             "type_variety": "SSMF", | ||||||
|  |             "dispersion": 1.67e-05, | ||||||
|  |             "effective_area": 83e-12, | ||||||
|  |             "pmd_coef": 1.265e-15 | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "NZDF", | ||||||
|  |             "dispersion": 0.5e-05, | ||||||
|  |             "effective_area": 72e-12, | ||||||
|  |             "pmd_coef": 1.265e-15 | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "LOF", | ||||||
|  |             "dispersion": 2.2e-05, | ||||||
|  |             "effective_area": 125e-12, | ||||||
|  |             "pmd_coef": 1.265e-15 | ||||||
|  |         } | ||||||
|  |     ], | ||||||
|  |     "RamanFiber": [ | ||||||
|  |         { | ||||||
|  |             "type_variety": "SSMF", | ||||||
|  |             "dispersion": 1.67e-05, | ||||||
|  |             "effective_area": 83e-12, | ||||||
|  |             "pmd_coef": 1.265e-15 | ||||||
|  |         } | ||||||
|  |     ], | ||||||
|  |     "Span": [ | ||||||
|  |         { | ||||||
|  |             "power_mode": true, | ||||||
|  |             "delta_power_range_db": [ | ||||||
|  |                 -2, | ||||||
|  |                 3, | ||||||
|  |                 0.5 | ||||||
|  |             ], | ||||||
|  |             "max_fiber_lineic_loss_for_raman": 0.25, | ||||||
|  |             "target_extended_gain": 2.5, | ||||||
|  |             "max_length": 150, | ||||||
|  |             "length_units": "km", | ||||||
|  |             "max_loss": 28, | ||||||
|  |             "padding": 10, | ||||||
|  |             "EOL": 0, | ||||||
|  |             "con_in": 0, | ||||||
|  |             "con_out": 0 | ||||||
|  |         } | ||||||
|  |     ], | ||||||
|  |     "Roadm": [ | ||||||
|  |         { | ||||||
|  |             "target_pch_out_db": -20, | ||||||
|  |             "add_drop_osnr": 38, | ||||||
|  |             "pmd": 0, | ||||||
|  |             "pdl": 0, | ||||||
|  |             "restrictions": { | ||||||
|  |                 "preamp_variety_list": [], | ||||||
|  |                 "booster_variety_list": [] | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     ], | ||||||
|  |     "SI": [ | ||||||
|  |         { | ||||||
|  |             "f_min": 191.3e12, | ||||||
|  |             "baud_rate": 32e9, | ||||||
|  |             "f_max": 195.1e12, | ||||||
|  |             "spacing": 50e9, | ||||||
|  |             "power_dbm": 0, | ||||||
|  |             "power_range_db": [ | ||||||
|  |                 0, | ||||||
|  |                 0, | ||||||
|  |                 1 | ||||||
|  |             ], | ||||||
|  |             "roll_off": 0.15, | ||||||
|  |             "tx_osnr": 40, | ||||||
|  |             "sys_margins": 2 | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "lband", | ||||||
|  |             "f_min": 186.3e12, | ||||||
|  |             "baud_rate": 32e9, | ||||||
|  |             "f_max": 190.1e12, | ||||||
|  |             "spacing": 50e9, | ||||||
|  |             "power_dbm": 0, | ||||||
|  |             "power_range_db": [ | ||||||
|  |                 0, | ||||||
|  |                 0, | ||||||
|  |                 1 | ||||||
|  |             ], | ||||||
|  |             "roll_off": 0.15, | ||||||
|  |             "tx_osnr": 40, | ||||||
|  |             "sys_margins": 2 | ||||||
|  |         } | ||||||
|  |     ], | ||||||
|  |     "Transceiver": [ | ||||||
|  |         { | ||||||
|  |             "type_variety": "vendorA_trx-type1", | ||||||
|  |             "frequency": { | ||||||
|  |                 "min": 191.35e12, | ||||||
|  |                 "max": 196.1e12 | ||||||
|  |             }, | ||||||
|  |             "mode": [ | ||||||
|  |                 { | ||||||
|  |                     "format": "mode 1", | ||||||
|  |                     "baud_rate": 32e9, | ||||||
|  |                     "OSNR": 11, | ||||||
|  |                     "bit_rate": 100e9, | ||||||
|  |                     "roll_off": 0.15, | ||||||
|  |                     "tx_osnr": 40, | ||||||
|  |                     "min_spacing": 37.5e9, | ||||||
|  |                     "cost": 1 | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     "format": "mode 2", | ||||||
|  |                     "baud_rate": 66e9, | ||||||
|  |                     "OSNR": 15, | ||||||
|  |                     "bit_rate": 200e9, | ||||||
|  |                     "roll_off": 0.15, | ||||||
|  |                     "tx_osnr": 40, | ||||||
|  |                     "min_spacing": 75e9, | ||||||
|  |                     "cost": 1 | ||||||
|  |                 } | ||||||
|  |             ] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "Voyager", | ||||||
|  |             "frequency": { | ||||||
|  |                 "min": 191.35e12, | ||||||
|  |                 "max": 196.1e12 | ||||||
|  |             }, | ||||||
|  |             "mode": [ | ||||||
|  |                 { | ||||||
|  |                     "format": "mode 1", | ||||||
|  |                     "baud_rate": 32e9, | ||||||
|  |                     "OSNR": 12, | ||||||
|  |                     "bit_rate": 100e9, | ||||||
|  |                     "roll_off": 0.15, | ||||||
|  |                     "tx_osnr": 40, | ||||||
|  |                     "min_spacing": 37.5e9, | ||||||
|  |                     "cost": 1 | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     "format": "mode 3", | ||||||
|  |                     "baud_rate": 44e9, | ||||||
|  |                     "OSNR": 18, | ||||||
|  |                     "bit_rate": 300e9, | ||||||
|  |                     "roll_off": 0.15, | ||||||
|  |                     "tx_osnr": 40, | ||||||
|  |                     "min_spacing": 62.5e9, | ||||||
|  |                     "cost": 1 | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     "format": "mode 2", | ||||||
|  |                     "baud_rate": 66e9, | ||||||
|  |                     "OSNR": 21, | ||||||
|  |                     "bit_rate": 400e9, | ||||||
|  |                     "roll_off": 0.15, | ||||||
|  |                     "tx_osnr": 40, | ||||||
|  |                     "min_spacing": 75e9, | ||||||
|  |                     "cost": 1 | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     "format": "mode 4", | ||||||
|  |                     "baud_rate": 66e9, | ||||||
|  |                     "OSNR": 16, | ||||||
|  |                     "bit_rate": 200e9, | ||||||
|  |                     "roll_off": 0.15, | ||||||
|  |                     "tx_osnr": 40, | ||||||
|  |                     "min_spacing": 75e9, | ||||||
|  |                     "cost": 1 | ||||||
|  |                 } | ||||||
|  |             ] | ||||||
|  |         } | ||||||
|  |     ] | ||||||
|  | } | ||||||
							
								
								
									
										1894
									
								
								gnpy/example-data/multiband_example_network.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1894
									
								
								gnpy/example-data/multiband_example_network.json
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										24
									
								
								gnpy/example-data/multiband_spectrum.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								gnpy/example-data/multiband_spectrum.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  | { | ||||||
|  |     "spectrum": [ | ||||||
|  |         { | ||||||
|  |             "f_min": 191.25e12, | ||||||
|  |             "baud_rate": 32e9, | ||||||
|  |             "f_max": 195.1e12, | ||||||
|  |             "slot_width": 50e9, | ||||||
|  |             "delta_pdb": 0, | ||||||
|  |             "roll_off": 0.15, | ||||||
|  |             "tx_osnr": 40, | ||||||
|  |             "label": "cband" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "f_min": 186.3e12, | ||||||
|  |             "baud_rate": 32e9, | ||||||
|  |             "f_max": 190.1e12, | ||||||
|  |             "slot_width": 50e9, | ||||||
|  |             "delta_pdb": 0, | ||||||
|  |             "roll_off": 0.15, | ||||||
|  |             "tx_osnr": 40, | ||||||
|  |             "label": "lband" | ||||||
|  |         } | ||||||
|  |     ] | ||||||
|  | } | ||||||
| @@ -5,8 +5,8 @@ | |||||||
|     0.0359549, |     0.0359549, | ||||||
|     5.82851 |     5.82851 | ||||||
|   ], |   ], | ||||||
|   "f_min": 191.35e12, |   "f_min": 191.275e12, | ||||||
|   "f_max": 196.1e12, |   "f_max": 196.125e12, | ||||||
|   "nf_ripple": [ |   "nf_ripple": [ | ||||||
|     0.4372876328262819, |     0.4372876328262819, | ||||||
|     0.4372876328262819, |     0.4372876328262819, | ||||||
|   | |||||||
| @@ -12,24 +12,21 @@ import argparse | |||||||
| import logging | import logging | ||||||
| import sys | import sys | ||||||
| from math import ceil | from math import ceil | ||||||
| from numpy import linspace, mean | from numpy import mean | ||||||
| from pathlib import Path | from pathlib import Path | ||||||
|  | from copy import deepcopy | ||||||
|  |  | ||||||
| import gnpy.core.ansi_escapes as ansi_escapes | import gnpy.core.ansi_escapes as ansi_escapes | ||||||
| from gnpy.core.elements import Transceiver, Fiber, RamanFiber | from gnpy.core.elements import Transceiver, Fiber, RamanFiber, Roadm | ||||||
| from gnpy.core.equipment import trx_mode_params |  | ||||||
| import gnpy.core.exceptions as exceptions | import gnpy.core.exceptions as exceptions | ||||||
| from gnpy.core.network import add_missing_elements_in_network, design_network |  | ||||||
| from gnpy.core.parameters import SimParams | from gnpy.core.parameters import SimParams | ||||||
| from gnpy.core.utils import db2lin, lin2db, automatic_nch, watt2dbm, dbm2watt | from gnpy.core.utils import lin2db, pretty_summary_print, per_label_average, watt2dbm | ||||||
| from gnpy.topology.request import (ResultElement, jsontocsv, compute_path_dsjctn, requests_aggregation, | from gnpy.topology.request import (ResultElement, jsontocsv, BLOCKING_NOPATH) | ||||||
|                                    BLOCKING_NOPATH, correct_json_route_list, |  | ||||||
|                                    deduplicate_disjunctions, compute_path_with_disjunction, |  | ||||||
|                                    PathRequest, compute_constrained_path, propagate) |  | ||||||
| from gnpy.topology.spectrum_assignment import build_oms_list, pth_assign_spectrum |  | ||||||
| from gnpy.tools.json_io import (load_equipment, load_network, load_json, load_requests, save_network, | from gnpy.tools.json_io import (load_equipment, load_network, load_json, load_requests, save_network, | ||||||
|                                 requests_from_json, disjunctions_from_json, save_json, load_initial_spectrum) |                                 requests_from_json, save_json, load_initial_spectrum) | ||||||
| from gnpy.tools.plots import plot_baseline, plot_results | from gnpy.tools.plots import plot_baseline, plot_results | ||||||
|  | from gnpy.tools.worker_utils import designed_network, transmission_simulation, planning | ||||||
|  |  | ||||||
|  |  | ||||||
| _logger = logging.getLogger(__name__) | _logger = logging.getLogger(__name__) | ||||||
| _examples_dir = Path(__file__).parent.parent / 'example-data' | _examples_dir = Path(__file__).parent.parent / 'example-data' | ||||||
| @@ -144,19 +141,17 @@ def transmission_main_example(args=None): | |||||||
|         sys.exit() |         sys.exit() | ||||||
|  |  | ||||||
|     # First try to find exact match if source/destination provided |     # First try to find exact match if source/destination provided | ||||||
|  |     source = None | ||||||
|     if args.source: |     if args.source: | ||||||
|         source = transceivers.pop(args.source, None) |         source = transceivers.pop(args.source, None) | ||||||
|         valid_source = True if source else False |         valid_source = True if source else False | ||||||
|     else: |  | ||||||
|         source = None |  | ||||||
|         _logger.info('No source node specified: picking random transceiver') |  | ||||||
|  |  | ||||||
|  |     destination = None | ||||||
|  |     nodes_list = [] | ||||||
|  |     loose_list = [] | ||||||
|     if args.destination: |     if args.destination: | ||||||
|         destination = transceivers.pop(args.destination, None) |         destination = transceivers.pop(args.destination, None) | ||||||
|         valid_destination = True if destination else False |         valid_destination = True if destination else False | ||||||
|     else: |  | ||||||
|         destination = None |  | ||||||
|         _logger.info('No destination node specified: picking random transceiver') |  | ||||||
|  |  | ||||||
|     # If no exact match try to find partial match |     # If no exact match try to find partial match | ||||||
|     if args.source and not source: |     if args.source and not source: | ||||||
| @@ -173,107 +168,72 @@ def transmission_main_example(args=None): | |||||||
|     if not source: |     if not source: | ||||||
|         source = list(transceivers.values())[0] |         source = list(transceivers.values())[0] | ||||||
|         del transceivers[source.uid] |         del transceivers[source.uid] | ||||||
|  |         _logger.info('No source node specified: picking random transceiver') | ||||||
|  |  | ||||||
|     if not destination: |     if not destination: | ||||||
|         destination = list(transceivers.values())[0] |         destination = list(transceivers.values())[0] | ||||||
|  |         nodes_list = [destination.uid] | ||||||
|  |         loose_list = ['STRICT'] | ||||||
|  |         _logger.info('No destination node specified: picking random transceiver') | ||||||
|  |  | ||||||
|     _logger.info(f'source = {args.source!r}') |     _logger.info(f'source = {source.uid!r}') | ||||||
|     _logger.info(f'destination = {args.destination!r}') |     _logger.info(f'destination = {destination.uid!r}') | ||||||
|  |  | ||||||
|     params = {} |  | ||||||
|     params['request_id'] = 0 |  | ||||||
|     params['trx_type'] = '' |  | ||||||
|     params['trx_mode'] = '' |  | ||||||
|     params['source'] = source.uid |  | ||||||
|     params['destination'] = destination.uid |  | ||||||
|     params['bidir'] = False |  | ||||||
|     params['nodes_list'] = [destination.uid] |  | ||||||
|     params['loose_list'] = ['strict'] |  | ||||||
|     params['format'] = '' |  | ||||||
|     params['path_bandwidth'] = 0 |  | ||||||
|     params['effective_freq_slot'] = None |  | ||||||
|     trx_params = trx_mode_params(equipment) |  | ||||||
|     trx_params['power'] = dbm2watt(equipment['SI']['default'].power_dbm) |  | ||||||
|     trx_params['tx_power'] = dbm2watt(equipment['SI']['default'].power_dbm) |  | ||||||
|     if args.power: |  | ||||||
|         trx_params['power'] = dbm2watt(float(args.power)) |  | ||||||
|         trx_params['tx_power'] = dbm2watt(float(args.power)) |  | ||||||
|     params.update(trx_params) |  | ||||||
|     initial_spectrum = None |     initial_spectrum = None | ||||||
|     params['nb_channel'] = automatic_nch(trx_params['f_min'], trx_params['f_max'], trx_params['spacing']) |  | ||||||
|     # use ref_req to hold reference channel used for design and req for the propagation |  | ||||||
|     # and req to hold channels to be propagated |  | ||||||
|     # apply power sweep on the design and on the channels |  | ||||||
|     ref_req = PathRequest(**params) |  | ||||||
|     pref_ch_db = watt2dbm(ref_req.power) |  | ||||||
|     if args.spectrum: |     if args.spectrum: | ||||||
|         # use the spectrum defined by user for the propagation. |         # use the spectrum defined by user for the propagation. | ||||||
|         # the nb of channel for design remains the one of the reference channel |         # the nb of channel for design remains the one of the reference channel | ||||||
|         initial_spectrum = load_initial_spectrum(args.spectrum) |         initial_spectrum = load_initial_spectrum(args.spectrum) | ||||||
|         params['nb_channel'] = len(initial_spectrum) |  | ||||||
|         print('User input for spectrum used for propagation instead of SI') |         print('User input for spectrum used for propagation instead of SI') | ||||||
|     req = PathRequest(**params) |  | ||||||
|     p_ch_db = watt2dbm(req.power) |  | ||||||
|     req.initial_spectrum = initial_spectrum |  | ||||||
|     print(f'There are {req.nb_channel} channels propagating') |  | ||||||
|     power_mode = equipment['Span']['default'].power_mode |     power_mode = equipment['Span']['default'].power_mode | ||||||
|     print('\n'.join([f'Power mode is set to {power_mode}', |     print('\n'.join([f'Power mode is set to {power_mode}', | ||||||
|                      '=> it can be modified in eqpt_config.json - Span'])) |                      '=> it can be modified in eqpt_config.json - Span'])) | ||||||
|     if not args.no_insert_edfas: |  | ||||||
|         try: |  | ||||||
|             add_missing_elements_in_network(network, equipment) |  | ||||||
|         except exceptions.NetworkTopologyError as e: |  | ||||||
|             print(f'{ansi_escapes.red}Invalid network definition:{ansi_escapes.reset} {e}') |  | ||||||
|             sys.exit(1) |  | ||||||
|         except exceptions.ConfigurationError as e: |  | ||||||
|             print(f'{ansi_escapes.red}Configuration error:{ansi_escapes.reset} {e}') |  | ||||||
|             sys.exit(1) |  | ||||||
|  |  | ||||||
|     path = compute_constrained_path(network, req) |     # Simulate ! | ||||||
|     spans = [s.params.length for s in path if isinstance(s, RamanFiber) or isinstance(s, Fiber)] |  | ||||||
|     power_range = [0] |  | ||||||
|     if power_mode: |  | ||||||
|         # power cannot be changed in gain mode |  | ||||||
|         try: |  | ||||||
|             p_start, p_stop, p_step = equipment['SI']['default'].power_range_db |  | ||||||
|             p_num = abs(int(round((p_stop - p_start) / p_step))) + 1 if p_step != 0 else 1 |  | ||||||
|             power_range = list(linspace(p_start, p_stop, p_num)) |  | ||||||
|         except TypeError: |  | ||||||
|             print('invalid power range definition in eqpt_config, should be power_range_db: [lower, upper, step]') |  | ||||||
|     # initial network is designed using req.power. that is that any missing information (amp gain or delta_p) is filled |  | ||||||
|     # using this req.power, previous to any sweep requested later on. |  | ||||||
|     try: |     try: | ||||||
|         design_network(ref_req, network, equipment, set_connector_losses=True, verbose=True) |         network, req, ref_req = designed_network(equipment, network, source.uid, destination.uid, | ||||||
|  |                                                  nodes_list=nodes_list, loose_list=loose_list, | ||||||
|  |                                                  args_power=args.power, | ||||||
|  |                                                  initial_spectrum=initial_spectrum, | ||||||
|  |                                                  no_insert_edfas=args.no_insert_edfas) | ||||||
|  |         path, propagations_for_path, powers_dbm, infos = transmission_simulation(equipment, network, req, ref_req) | ||||||
|     except exceptions.NetworkTopologyError as e: |     except exceptions.NetworkTopologyError as e: | ||||||
|         print(f'{ansi_escapes.red}Invalid network definition:{ansi_escapes.reset} {e}') |         print(f'{ansi_escapes.red}Invalid network definition:{ansi_escapes.reset} {e}') | ||||||
|         sys.exit(1) |         sys.exit(1) | ||||||
|     except exceptions.ConfigurationError as e: |     except exceptions.ConfigurationError as e: | ||||||
|         print(f'{ansi_escapes.red}Configuration error:{ansi_escapes.reset} {e}') |         print(f'{ansi_escapes.red}Configuration error:{ansi_escapes.reset} {e}') | ||||||
|         sys.exit(1) |         sys.exit(1) | ||||||
|  |     except exceptions.ServiceError as e: | ||||||
|  |         print(f'Service error: {e}') | ||||||
|  |         sys.exit(1) | ||||||
|  |     except ValueError: | ||||||
|  |         sys.exit(1) | ||||||
|  |     # print or export results | ||||||
|  |     spans = [s.params.length for s in path if isinstance(s, RamanFiber) or isinstance(s, Fiber)] | ||||||
|     print(f'\nThere are {len(spans)} fiber spans over {sum(spans)/1000:.0f} km between {source.uid} ' |     print(f'\nThere are {len(spans)} fiber spans over {sum(spans)/1000:.0f} km between {source.uid} ' | ||||||
|           f'and {destination.uid}') |           f'and {destination.uid}') | ||||||
|     print(f'\nNow propagating between {source.uid} and {destination.uid}:') |     print(f'\nNow propagating between {source.uid} and {destination.uid}:') | ||||||
|     for dp_db in power_range: |     print(f'Reference used for design: (Input optical power reference in span = {watt2dbm(ref_req.power):.2f}dBm,\n' | ||||||
|         ref_req.power = dbm2watt(pref_ch_db + dp_db) |           + f'                            spacing = {ref_req.spacing * 1e-9:.2f}GHz\n' | ||||||
|         req.power = dbm2watt(p_ch_db + dp_db) |           + f'                            nb_channels = {ref_req.nb_channel})') | ||||||
|         design_network(ref_req, network, equipment, set_connector_losses=False, verbose=False) |     print('\nChannels propagating: (Input optical power deviation in span = ' | ||||||
|         # if initial spectrum did not contain any power, now we need to use this one. |           + f'{pretty_summary_print(per_label_average(infos.delta_pdb_per_channel, infos.label))}dB,\n' | ||||||
|         # note the initial power defines a differential wrt req.power so that if req.power is set to 2mW (3dBm) |           + '                       spacing = ' | ||||||
|         # and initial spectrum was set to 0, this sets a initial per channel delta power to -3dB, so that |           + f'{pretty_summary_print(per_label_average(infos.slot_width * 1e-9, infos.label))}GHz,\n' | ||||||
|         # whatever the equalization, -3 dB is applied on all channels (ie initial power in initial spectrum pre-empts |           + '                       transceiver output power = ' | ||||||
|         # "--power" option) |           + f'{pretty_summary_print(per_label_average(watt2dbm(infos.tx_power), infos.label))}dBm,\n' | ||||||
|  |           + f'                       nb_channels = {infos.number_of_channels})') | ||||||
|  |     for path, power_dbm in zip(propagations_for_path, powers_dbm): | ||||||
|         if power_mode: |         if power_mode: | ||||||
|             print(f'\nPropagating with input power = {ansi_escapes.cyan}{watt2dbm(req.power):.2f} ' |             print(f'Input optical power reference in span = {ansi_escapes.cyan}{power_dbm:.2f} ' | ||||||
|                   + f'dBm{ansi_escapes.reset}:') |                   + f'dBm{ansi_escapes.reset}:') | ||||||
|         else: |         else: | ||||||
|             print(f'\nPropagating in {ansi_escapes.cyan}gain mode{ansi_escapes.reset}: power cannot be set manually') |             print('\nPropagating in {ansi_escapes.cyan}gain mode{ansi_escapes.reset}: power cannot be set manually') | ||||||
|         infos = propagate(path, req, equipment) |         if len(powers_dbm) == 1: | ||||||
|         if len(power_range) == 1: |  | ||||||
|             for elem in path: |             for elem in path: | ||||||
|                 print(elem) |                 print(elem) | ||||||
|             if power_mode: |             if power_mode: | ||||||
|                 print(f'\nTransmission result for input power = {lin2db(req.power*1e3):.2f} dBm:') |                 print(f'\nTransmission result for input optical power reference in span = {power_dbm:.2f} dBm:') | ||||||
|             else: |             else: | ||||||
|                 print(f'\nTransmission results:') |                 print(f'\nTransmission results:') | ||||||
|             print(f'  Final GSNR (0.1 nm): {ansi_escapes.cyan}{mean(destination.snr_01nm):.02f} dB{ansi_escapes.reset}') |             print(f'  Final GSNR (0.1 nm): {ansi_escapes.cyan}{mean(destination.snr_01nm):.02f} dB{ansi_escapes.reset}') | ||||||
| @@ -339,111 +299,50 @@ def path_requests_run(args=None): | |||||||
|                         help='considers that all demands are bidir') |                         help='considers that all demands are bidir') | ||||||
|     parser.add_argument('-o', '--output', type=Path, metavar=_help_fname_json_csv, |     parser.add_argument('-o', '--output', type=Path, metavar=_help_fname_json_csv, | ||||||
|                         help='Store satisifed requests into a JSON or CSV file') |                         help='Store satisifed requests into a JSON or CSV file') | ||||||
|  |     parser.add_argument('--redesign-per-request', action='store_true', help='Redesign the network at each request' | ||||||
|  |                         + ' computation using the request as the reference channel') | ||||||
|  |  | ||||||
|  |  | ||||||
|     args = parser.parse_args(args if args is not None else sys.argv[1:]) |     args = parser.parse_args(args if args is not None else sys.argv[1:]) | ||||||
|     _setup_logging(args) |     _setup_logging(args) | ||||||
|  |  | ||||||
|     _logger.info(f'Computing path requests {args.service_filename.name} into JSON format') |     _logger.info(f'Computing path requests {args.service_filename.name} into JSON format') | ||||||
|  |  | ||||||
|     (equipment, network) = load_common_data(args.equipment, args.topology, args.sim_params, args.save_network_before_autodesign) |     (equipment, network) = \ | ||||||
|  |         load_common_data(args.equipment, args.topology, args.sim_params, args.save_network_before_autodesign) | ||||||
|  |  | ||||||
|     # Build the network once using the default power defined in SI in eqpt config |     # Build the network once using the default power defined in SI in eqpt config | ||||||
|     # TODO power density: db2linp(ower_dbm": 0)/power_dbm": 0 * nb channels as defined by |     # TODO power density: db2linp(ower_dbm": 0)/power_dbm": 0 * nb channels as defined by | ||||||
|     # spacing, f_min and f_max |     # spacing, f_min and f_max | ||||||
|     if not args.no_insert_edfas: |     if args.save_network is not None: | ||||||
|         try: |         save_network(network, args.save_network) | ||||||
|             add_missing_elements_in_network(network, equipment) |         print(f'Network (after autodesign) saved to {args.save_network}') | ||||||
|         except exceptions.NetworkTopologyError as e: |  | ||||||
|             print(f'{ansi_escapes.red}Invalid network definition:{ansi_escapes.reset} {e}') |  | ||||||
|             sys.exit(1) |  | ||||||
|         except exceptions.ConfigurationError as e: |  | ||||||
|             print(f'{ansi_escapes.red}Configuration error:{ansi_escapes.reset} {e}') |  | ||||||
|             sys.exit(1) |  | ||||||
|  |  | ||||||
|     params = { |  | ||||||
|         'request_id': 'reference', |  | ||||||
|         'trx_type': '', |  | ||||||
|         'trx_mode': '', |  | ||||||
|         'source': None, |  | ||||||
|         'destination': None, |  | ||||||
|         'bidir': False, |  | ||||||
|         'nodes_list': [], |  | ||||||
|         'loose_list': [], |  | ||||||
|         'format': '', |  | ||||||
|         'path_bandwidth': 0, |  | ||||||
|         'effective_freq_slot': None, |  | ||||||
|         'nb_channel': automatic_nch(equipment['SI']['default'].f_min, equipment['SI']['default'].f_max, |  | ||||||
|                                     equipment['SI']['default'].spacing), |  | ||||||
|         'power': dbm2watt(equipment['SI']['default'].power_dbm), |  | ||||||
|         'tx_power': dbm2watt(equipment['SI']['default'].power_dbm) |  | ||||||
|     } |  | ||||||
|     trx_params = trx_mode_params(equipment) |  | ||||||
|     params.update(trx_params) |  | ||||||
|     reference_channel = PathRequest(**params) |  | ||||||
|     try: |     try: | ||||||
|         design_network(reference_channel, network, equipment, verbose=True) |         network, _, _ = designed_network(equipment, network, no_insert_edfas=args.no_insert_edfas) | ||||||
|  |         data = load_requests(args.service_filename, equipment, bidir=args.bidir, | ||||||
|  |                              network=network, network_filename=args.topology) | ||||||
|  |         _data = requests_from_json(data, equipment) | ||||||
|  |         oms_list, propagatedpths, reversed_propagatedpths, rqs, dsjn, result = \ | ||||||
|  |             planning(network, equipment, data, redesign=args.redesign_per_request) | ||||||
|     except exceptions.NetworkTopologyError as e: |     except exceptions.NetworkTopologyError as e: | ||||||
|         print(f'{ansi_escapes.red}Invalid network definition:{ansi_escapes.reset} {e}') |         print(f'{ansi_escapes.red}Invalid network definition:{ansi_escapes.reset} {e}') | ||||||
|         sys.exit(1) |         sys.exit(1) | ||||||
|     except exceptions.ConfigurationError as e: |     except exceptions.ConfigurationError as e: | ||||||
|         print(f'{ansi_escapes.red}Configuration error:{ansi_escapes.reset} {e}') |         print(f'{ansi_escapes.red}Configuration error:{ansi_escapes.reset} {e}') | ||||||
|         sys.exit(1) |         sys.exit(1) | ||||||
|  |  | ||||||
|     if args.save_network is not None: |  | ||||||
|         save_network(network, args.save_network) |  | ||||||
|         print(f'{ansi_escapes.blue}Network (after autodesign) saved to {args.save_network}{ansi_escapes.reset}') |  | ||||||
|     oms_list = build_oms_list(network, equipment) |  | ||||||
|  |  | ||||||
|     try: |  | ||||||
|         data = load_requests(args.service_filename, equipment, bidir=args.bidir, |  | ||||||
|                              network=network, network_filename=args.topology) |  | ||||||
|         rqs = requests_from_json(data, equipment) |  | ||||||
|     except exceptions.ServiceError as e: |  | ||||||
|         print(f'{ansi_escapes.red}Service error:{ansi_escapes.reset} {e}') |  | ||||||
|         sys.exit(1) |  | ||||||
|     # check that request ids are unique. Non unique ids, may |  | ||||||
|     # mess the computation: better to stop the computation |  | ||||||
|     all_ids = [r.request_id for r in rqs] |  | ||||||
|     if len(all_ids) != len(set(all_ids)): |  | ||||||
|         for item in list(set(all_ids)): |  | ||||||
|             all_ids.remove(item) |  | ||||||
|         msg = f'Requests id {all_ids} are not unique' |  | ||||||
|         _logger.critical(msg) |  | ||||||
|         sys.exit() |  | ||||||
|     rqs = correct_json_route_list(network, rqs) |  | ||||||
|  |  | ||||||
|     # pths = compute_path(network, equipment, rqs) |  | ||||||
|     dsjn = disjunctions_from_json(data) |  | ||||||
|  |  | ||||||
|     print(f'{ansi_escapes.blue}List of disjunctions{ansi_escapes.reset}') |  | ||||||
|     print(dsjn) |  | ||||||
|     # need to warn or correct in case of wrong disjunction form |  | ||||||
|     # disjunction must not be repeated with same or different ids |  | ||||||
|     dsjn = deduplicate_disjunctions(dsjn) |  | ||||||
|  |  | ||||||
|     # Aggregate demands with same exact constraints |  | ||||||
|     print(f'{ansi_escapes.blue}Aggregating similar requests{ansi_escapes.reset}') |  | ||||||
|  |  | ||||||
|     rqs, dsjn = requests_aggregation(rqs, dsjn) |  | ||||||
|     # TODO export novel set of aggregated demands in a json file |  | ||||||
|  |  | ||||||
|     print(f'{ansi_escapes.blue}The following services have been requested:{ansi_escapes.reset}') |  | ||||||
|     print(rqs) |  | ||||||
|  |  | ||||||
|     print(f'{ansi_escapes.blue}Computing all paths with constraints{ansi_escapes.reset}') |  | ||||||
|     try: |  | ||||||
|         pths = compute_path_dsjctn(network, equipment, rqs, dsjn) |  | ||||||
|     except exceptions.DisjunctionError as this_e: |     except exceptions.DisjunctionError as this_e: | ||||||
|         print(f'{ansi_escapes.red}Disjunction error:{ansi_escapes.reset} {this_e}') |         print(f'{ansi_escapes.red}Disjunction error:{ansi_escapes.reset} {this_e}') | ||||||
|         sys.exit(1) |         sys.exit(1) | ||||||
|  |     except exceptions.ServiceError as e: | ||||||
|     print(f'{ansi_escapes.blue}Propagating on selected path{ansi_escapes.reset}') |         print(f'Service error: {e}') | ||||||
|     propagatedpths, reversed_pths, reversed_propagatedpths = compute_path_with_disjunction(network, equipment, rqs, pths) |         sys.exit(1) | ||||||
|     # Note that deepcopy used in compute_path_with_disjunction returns |     except ValueError: | ||||||
|     # a list of nodes which are not belonging to network (they are copies of the node objects). |         sys.exit(1) | ||||||
|     # so there can not be propagation on these nodes. |     print(f'{ansi_escapes.blue}List of disjunctions{ansi_escapes.reset}') | ||||||
|  |     print(dsjn) | ||||||
|     pth_assign_spectrum(pths, rqs, oms_list, reversed_pths) |     print(f'{ansi_escapes.blue}The following services have been requested:{ansi_escapes.reset}') | ||||||
|  |     print(_data) | ||||||
|  |  | ||||||
|     print(f'{ansi_escapes.blue}Result summary{ansi_escapes.reset}') |     print(f'{ansi_escapes.blue}Result summary{ansi_escapes.reset}') | ||||||
|     header = ['req id', '  demand', ' GSNR@bandwidth A-Z (Z-A)', ' GSNR@0.1nm A-Z (Z-A)', |     header = ['req id', '  demand', ' GSNR@bandwidth A-Z (Z-A)', ' GSNR@0.1nm A-Z (Z-A)', | ||||||
|   | |||||||
| @@ -14,14 +14,15 @@ from pathlib import Path | |||||||
| import json | import json | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
| from numpy import arange | from numpy import arange | ||||||
|  | from copy import deepcopy | ||||||
|  |  | ||||||
| from gnpy.core import elements | from gnpy.core import elements | ||||||
| from gnpy.core.equipment import trx_mode_params | from gnpy.core.equipment import trx_mode_params, find_type_variety | ||||||
| from gnpy.core.exceptions import ConfigurationError, EquipmentConfigError, NetworkTopologyError, ServiceError | from gnpy.core.exceptions import ConfigurationError, EquipmentConfigError, NetworkTopologyError, ServiceError | ||||||
| from gnpy.core.science_utils import estimate_nf_model | from gnpy.core.science_utils import estimate_nf_model | ||||||
| from gnpy.core.info import Carrier | from gnpy.core.info import Carrier | ||||||
| from gnpy.core.utils import automatic_nch, automatic_fmax, merge_amplifier_restrictions, dbm2watt | from gnpy.core.utils import automatic_nch, automatic_fmax, merge_amplifier_restrictions, dbm2watt | ||||||
| from gnpy.core.parameters import DEFAULT_RAMAN_COEFFICIENT, EdfaParams | from gnpy.core.parameters import DEFAULT_RAMAN_COEFFICIENT, EdfaParams, MultiBandParams | ||||||
| from gnpy.topology.request import PathRequest, Disjunction, compute_spectrum_slot_vs_bandwidth | from gnpy.topology.request import PathRequest, Disjunction, compute_spectrum_slot_vs_bandwidth | ||||||
| from gnpy.topology.spectrum_assignment import mvalue_to_slots | from gnpy.topology.spectrum_assignment import mvalue_to_slots | ||||||
| from gnpy.tools.convert import xls_to_json_data | from gnpy.tools.convert import xls_to_json_data | ||||||
| @@ -192,11 +193,12 @@ class Amp(_JsonThing): | |||||||
|     @classmethod |     @classmethod | ||||||
|     def from_json(cls, filename, **kwargs): |     def from_json(cls, filename, **kwargs): | ||||||
|         config = Path(filename).parent / 'default_edfa_config.json' |         config = Path(filename).parent / 'default_edfa_config.json' | ||||||
|  |         # default_edfa_config.json assumes a DGT profile independantly from fmin/fmax, that's a generic profile | ||||||
|         type_variety = kwargs['type_variety'] |         type_variety = kwargs['type_variety'] | ||||||
|         type_def = kwargs.get('type_def', 'variable_gain')  # default compatibility with older json eqpt files |         type_def = kwargs.get('type_def', 'variable_gain')  # default compatibility with older json eqpt files | ||||||
|         nf_def = None |         nf_def = None | ||||||
|         dual_stage_def = None |         dual_stage_def = None | ||||||
|  |         amplifiers = None | ||||||
|  |  | ||||||
|         if type_def == 'fixed_gain': |         if type_def == 'fixed_gain': | ||||||
|             try: |             try: | ||||||
| @@ -241,16 +243,25 @@ class Amp(_JsonThing): | |||||||
|                 preamp_variety = kwargs.pop('preamp_variety') |                 preamp_variety = kwargs.pop('preamp_variety') | ||||||
|                 booster_variety = kwargs.pop('booster_variety') |                 booster_variety = kwargs.pop('booster_variety') | ||||||
|             except KeyError: |             except KeyError: | ||||||
|                 msg = f'missing preamp/booster variety input for amplifier: {type_variety} in equipment config' |                 raise EquipmentConfigError(f'missing preamp/booster variety input for amplifier: {type_variety}' | ||||||
|                 raise EquipmentConfigError(msg) |                                            + ' in equipment config') | ||||||
|             dual_stage_def = Model_dual_stage(preamp_variety, booster_variety) |             dual_stage_def = Model_dual_stage(preamp_variety, booster_variety) | ||||||
|  |         elif type_def == 'multi_band': | ||||||
|  |             amplifiers = kwargs['amplifiers'] | ||||||
|         else: |         else: | ||||||
|             raise EquipmentConfigError(f'Edfa type_def {type_def} does not exist') |             raise EquipmentConfigError(f'Edfa type_def {type_def} does not exist') | ||||||
|  |  | ||||||
|         json_data = load_json(config) |         json_data = load_json(config) | ||||||
|  |         # raise an error if config does not contain f_min, f_max | ||||||
|  |         if 'f_min' not in json_data or 'f_max' not in json_data: | ||||||
|  |             raise EquipmentConfigError('default Edfa config does not contain f_min and f_max values.' | ||||||
|  |                                        + ' Please correct file.') | ||||||
|  |         # use f_min, f_max from kwargs | ||||||
|  |         if 'f_min' in kwargs: | ||||||
|  |             json_data.pop('f_min', None) | ||||||
|  |             json_data.pop('f_max', None) | ||||||
|         return cls(**{**kwargs, **json_data, |         return cls(**{**kwargs, **json_data, | ||||||
|                       'nf_model': nf_def, 'dual_stage_model': dual_stage_def}) |                       'nf_model': nf_def, 'dual_stage_model': dual_stage_def, 'multi_band': amplifiers}) | ||||||
|  |  | ||||||
|  |  | ||||||
| def _automatic_spacing(baud_rate): | def _automatic_spacing(baud_rate): | ||||||
| @@ -367,6 +378,31 @@ def _update_dual_stage(equipment): | |||||||
|     return equipment |     return equipment | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def _update_band(equipment: dict) -> dict: | ||||||
|  |     """Creates a list of bands for this amplifier, and remove other parameters which are not applicable | ||||||
|  |     """ | ||||||
|  |     amp_dict = equipment['Edfa'] | ||||||
|  |     for amplifier in amp_dict.values(): | ||||||
|  |         if amplifier.type_def != 'multi_band': | ||||||
|  |             amplifier.bands = [{'f_min': amplifier.f_min, | ||||||
|  |                                 'f_max': amplifier.f_max}] | ||||||
|  |             # updates band parameter | ||||||
|  |         else: | ||||||
|  |             _bands = [{'f_min': amp_dict[a].f_min, | ||||||
|  |                        'f_max': amp_dict[a].f_max} for a in amp_dict[amplifier.type_variety].multi_band] | ||||||
|  |             # remove duplicates | ||||||
|  |             amplifier.bands = [] | ||||||
|  |             for b in _bands: | ||||||
|  |                 if b not in amplifier.bands: | ||||||
|  |                     amplifier.bands.append(b) | ||||||
|  |             # remove non applicable parameters | ||||||
|  |             for key in ['f_min', 'f_max', 'gain_flatmax', 'gain_min', 'p_max', 'nf_model', 'dual_stage_model', | ||||||
|  |                         'nf_fit_coeff', 'nf_ripple', 'dgt', 'gain_ripple']: | ||||||
|  |                 delattr(amplifier, key) | ||||||
|  |  | ||||||
|  |     return equipment | ||||||
|  |  | ||||||
|  |  | ||||||
| def _roadm_restrictions_sanity_check(equipment): | def _roadm_restrictions_sanity_check(equipment): | ||||||
|     """verifies that booster and preamp restrictions specified in roadm equipment are listed in the edfa.""" |     """verifies that booster and preamp restrictions specified in roadm equipment are listed in the edfa.""" | ||||||
|     for roadm_type, roadm_eqpt in equipment['Roadm'].items(): |     for roadm_type, roadm_eqpt in equipment['Roadm'].items(): | ||||||
| @@ -428,7 +464,13 @@ def _equipment_from_json(json_data, filename): | |||||||
|                 raise EquipmentConfigError(f'Unrecognized network element type "{key}"') |                 raise EquipmentConfigError(f'Unrecognized network element type "{key}"') | ||||||
|     _check_fiber_vs_raman_fiber(equipment) |     _check_fiber_vs_raman_fiber(equipment) | ||||||
|     equipment = _update_dual_stage(equipment) |     equipment = _update_dual_stage(equipment) | ||||||
|  |     equipment = _update_band(equipment) | ||||||
|     _roadm_restrictions_sanity_check(equipment) |     _roadm_restrictions_sanity_check(equipment) | ||||||
|  |     possible_SI = list(equipment['SI'].keys()) | ||||||
|  |     if 'default' not in possible_SI: | ||||||
|  |         # Use "default" key in the equipment, using the first listed keys | ||||||
|  |         equipment['SI']['default'] = equipment['SI'][possible_SI[0]] | ||||||
|  |         del equipment['SI'][possible_SI[0]] | ||||||
|     return equipment |     return equipment | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -464,6 +506,8 @@ def _cls_for(equipment_type): | |||||||
|         return elements.Fiber |         return elements.Fiber | ||||||
|     elif equipment_type == 'RamanFiber': |     elif equipment_type == 'RamanFiber': | ||||||
|         return elements.RamanFiber |         return elements.RamanFiber | ||||||
|  |     elif equipment_type == 'Multiband_amplifier': | ||||||
|  |         return elements.Multiband_amplifier | ||||||
|     else: |     else: | ||||||
|         raise ConfigurationError(f'Unknown network equipment "{equipment_type}"') |         raise ConfigurationError(f'Unknown network equipment "{equipment_type}"') | ||||||
|  |  | ||||||
| @@ -477,7 +521,55 @@ def network_from_json(json_data, equipment): | |||||||
|         typ = el_config.pop('type') |         typ = el_config.pop('type') | ||||||
|         variety = el_config.pop('type_variety', 'default') |         variety = el_config.pop('type_variety', 'default') | ||||||
|         cls = _cls_for(typ) |         cls = _cls_for(typ) | ||||||
|         if typ == 'Fused': |         if typ == 'Transceiver': | ||||||
|  |             temp = el_config.setdefault('params', {}) | ||||||
|  |         if typ == 'Multiband_amplifier': | ||||||
|  |             if variety in ['default', '']: | ||||||
|  |                 extra_params = None | ||||||
|  |                 temp = el_config.setdefault('params', {}) | ||||||
|  |                 temp = merge_amplifier_restrictions(temp, deepcopy(MultiBandParams.default_values)) | ||||||
|  |                 el_config['params'] = temp | ||||||
|  |             else: | ||||||
|  |                 extra_params = equipment['Edfa'][variety] | ||||||
|  |                 temp = el_config.setdefault('params', {}) | ||||||
|  |                 # use config params preferably to library params, only use library params to fill in | ||||||
|  |                 # the missing attribute | ||||||
|  |                 temp = merge_amplifier_restrictions(temp, deepcopy(extra_params.__dict__)) | ||||||
|  |                 el_config['params'] = temp | ||||||
|  |                 el_config['type_variety'] = variety | ||||||
|  |             # if config does not contain any amp list create one | ||||||
|  |             amps = el_config.setdefault('amplifiers', []) | ||||||
|  |             for amp in amps: | ||||||
|  |                 amp_variety = amp['type_variety']    # juste pour essayer | ||||||
|  |                 amp_extra_params = equipment['Edfa'][amp_variety] | ||||||
|  |                 temp = amp.setdefault('params', {}) | ||||||
|  |                 temp = merge_amplifier_restrictions(temp, amp_extra_params.__dict__) | ||||||
|  |                 amp['params'] = temp | ||||||
|  |                 amp['type_variety'] = amp_variety | ||||||
|  |             # check type_variety consistant with amps type_variety | ||||||
|  |             if amps: | ||||||
|  |                 try: | ||||||
|  |                     multiband_type_variety = find_type_variety([a['type_variety'] for a in amps], equipment) | ||||||
|  |                 except ConfigurationError as e: | ||||||
|  |                     msg = f'Node {el_config["uid"]}: {e}' | ||||||
|  |                     raise ConfigurationError(msg) | ||||||
|  |                 if variety is not None and variety != multiband_type_variety: | ||||||
|  |                     raise ConfigurationError(f'In node {el_config["uid"]}: multiband amplifier type_variety is not ' | ||||||
|  |                                              + 'consistent with its amps type varieties.') | ||||||
|  |             if not amps and extra_params is not None: | ||||||
|  |                 # the amp config does not contain the amplifiers operational settings, but has a type_variety | ||||||
|  |                 # defined so that it is possible to create the template of amps for design for each band. This | ||||||
|  |                 # defines the default design bands. | ||||||
|  |                 # This lopp populates each amp with default values, for each band | ||||||
|  |                 for band in extra_params.bands: | ||||||
|  |                     params = {k: v for k, v in Amp.default_values.items()} | ||||||
|  |                     # update frequencies with band values | ||||||
|  |                     params['f_min'] = band['f_min'] | ||||||
|  |                     params['f_max'] = band['f_max'] | ||||||
|  |                     amps.append({'params': params}) | ||||||
|  |             # without type_variety, it is not possible to set the amplifier dict at this point: need to wait | ||||||
|  |             # for design, and use user defined design-bands | ||||||
|  |         elif typ == 'Fused': | ||||||
|             # well, there's no variety for the 'Fused' node type |             # well, there's no variety for the 'Fused' node type | ||||||
|             pass |             pass | ||||||
|         elif variety in equipment[typ]: |         elif variety in equipment[typ]: | ||||||
|   | |||||||
							
								
								
									
										248
									
								
								gnpy/tools/worker_utils.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										248
									
								
								gnpy/tools/worker_utils.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,248 @@ | |||||||
|  | #!/usr/bin/env python3 | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  |  | ||||||
|  | ''' | ||||||
|  | gnpy.tools.worker_utils | ||||||
|  | ======================= | ||||||
|  |  | ||||||
|  | Common code for CLI examples and API | ||||||
|  | ''' | ||||||
|  | import logging | ||||||
|  | from copy import deepcopy | ||||||
|  | from typing import Union, List, Tuple | ||||||
|  | from numpy import linspace | ||||||
|  | from networkx import DiGraph | ||||||
|  |  | ||||||
|  | from gnpy.core.utils import automatic_nch, watt2dbm, dbm2watt, pretty_summary_print, per_label_average | ||||||
|  | from gnpy.core.equipment import trx_mode_params | ||||||
|  | from gnpy.core.network import add_missing_elements_in_network, design_network | ||||||
|  | from gnpy.core import exceptions | ||||||
|  | from gnpy.core.info import SpectralInformation | ||||||
|  | from gnpy.topology.spectrum_assignment import build_oms_list, pth_assign_spectrum, OMS | ||||||
|  | from gnpy.topology.request import correct_json_route_list, deduplicate_disjunctions, requests_aggregation, \ | ||||||
|  |     compute_path_dsjctn, compute_path_with_disjunction, ResultElement, PathRequest, Disjunction, \ | ||||||
|  |     compute_constrained_path, propagate | ||||||
|  | from gnpy.tools.json_io import requests_from_json, disjunctions_from_json | ||||||
|  |  | ||||||
|  |  | ||||||
|  | logger = logging.getLogger(__name__) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def designed_network(equipment: dict, network: DiGraph, source: str = None, destination: str = None, | ||||||
|  |                      nodes_list: List[str] = None, loose_list: List[str] = None, | ||||||
|  |                      initial_spectrum: dict = None, no_insert_edfas: bool = False, | ||||||
|  |                      args_power: Union[str, float, int] = None, | ||||||
|  |                      service_req: PathRequest = None) -> Tuple[DiGraph, PathRequest, PathRequest]: | ||||||
|  |     """Build the reference channels based on inputs and design the network for this reference channel, and build the | ||||||
|  |     channel to be propagated for the single transmission script. | ||||||
|  |  | ||||||
|  |     Reference channel (target input power in spans, nb of channels, transceiver output power) is built using | ||||||
|  |     equipment['SI'] information. If indicated,  with target input power in spans is updated with args_power. | ||||||
|  |     Channel to be propagated is using the same channel reference, except if different settings are provided | ||||||
|  |     with service_req and initial_spectrum. The service to be propagated uses specified source, destination | ||||||
|  |     and list nodes_list of include nodes constraint except if the service_req is specified. | ||||||
|  |  | ||||||
|  |     Args: | ||||||
|  |     - equipment: a dictionary containing equipment information. | ||||||
|  |     - network: a directed graph representing the initial network. | ||||||
|  |     - no_insert_edfas: a boolean indicating whether to insert EDFAs in the network. | ||||||
|  |     - args_power: the power to be used for the network design. | ||||||
|  |     - service_req: the service request the user wants to propagate. | ||||||
|  |     - source: the source node for the channel to be propagated if no service_req is specified. | ||||||
|  |     - destination: the destination node for the channel to be propagated if no service_req is specified. | ||||||
|  |     - nodes_list: a list of nodes to be included ifor the channel to be propagated if no service_req is specified. | ||||||
|  |     - loose_list: a list of loose nodes to be included in the network design. | ||||||
|  |     - initial_spectrum: a dictionary representing the initial spectrum to propagate. | ||||||
|  |  | ||||||
|  |     Returns: | ||||||
|  |     - The designed network. | ||||||
|  |     - The channel to propagate. | ||||||
|  |     - The reference channel used for the design. | ||||||
|  |     """ | ||||||
|  |     if loose_list is None: | ||||||
|  |         loose_list = [] | ||||||
|  |     if nodes_list is None: | ||||||
|  |         nodes_list = [] | ||||||
|  |     if not no_insert_edfas: | ||||||
|  |         add_missing_elements_in_network(network, equipment) | ||||||
|  |  | ||||||
|  |     if not nodes_list: | ||||||
|  |         if destination: | ||||||
|  |             nodes_list = [destination] | ||||||
|  |             loose_list = ['STRICT'] | ||||||
|  |         else: | ||||||
|  |             nodes_list = [] | ||||||
|  |             loose_list = [] | ||||||
|  |     params = { | ||||||
|  |         'request_id': 'reference', | ||||||
|  |         'trx_type': '', | ||||||
|  |         'trx_mode': '', | ||||||
|  |         'source': source, | ||||||
|  |         'destination': destination, | ||||||
|  |         'bidir': False, | ||||||
|  |         'nodes_list': nodes_list, | ||||||
|  |         'loose_list': loose_list, | ||||||
|  |         'format': '', | ||||||
|  |         'path_bandwidth': 0, | ||||||
|  |         'effective_freq_slot': None, | ||||||
|  |         'nb_channel': automatic_nch(equipment['SI']['default'].f_min, equipment['SI']['default'].f_max, | ||||||
|  |                                     equipment['SI']['default'].spacing), | ||||||
|  |         'power': dbm2watt(equipment['SI']['default'].power_dbm), | ||||||
|  |         'tx_power': None | ||||||
|  |     } | ||||||
|  |     params['tx_power'] = dbm2watt(equipment['SI']['default'].power_dbm) | ||||||
|  |     if equipment['SI']['default'].tx_power_dbm is not None: | ||||||
|  |         # use SI tx_power if present | ||||||
|  |         params['tx_power'] = dbm2watt(equipment['SI']['default'].tx_power_dbm) | ||||||
|  |     trx_params = trx_mode_params(equipment) | ||||||
|  |     params.update(trx_params) | ||||||
|  |  | ||||||
|  |     # use args_power instead of si | ||||||
|  |     if args_power: | ||||||
|  |         params['power'] = dbm2watt(float(args_power)) | ||||||
|  |         if equipment['SI']['default'].tx_power_dbm is None: | ||||||
|  |             params['tx_power'] = params['power'] | ||||||
|  |  | ||||||
|  |     # use si as reference channel | ||||||
|  |     reference_channel = PathRequest(**params) | ||||||
|  |     # temporary till multiband design feat is available: do not design for L band | ||||||
|  |     reference_channel.nb_channel = min(params['nb_channel'], automatic_nch(191.2e12, 196.0e12, params['spacing'])) | ||||||
|  |  | ||||||
|  |     if service_req: | ||||||
|  |         # use service_req as reference channel with si tx_power if service_req tx_power is None | ||||||
|  |         if service_req.tx_power is None: | ||||||
|  |             service_req.tx_power = params['tx_power'] | ||||||
|  |         reference_channel = service_req | ||||||
|  |  | ||||||
|  |     design_network(reference_channel, network, equipment, set_connector_losses=True, verbose=True) | ||||||
|  |  | ||||||
|  |     if initial_spectrum: | ||||||
|  |         params['nb_channel'] = len(initial_spectrum) | ||||||
|  |  | ||||||
|  |     req = PathRequest(**params) | ||||||
|  |     if service_req: | ||||||
|  |         req = service_req | ||||||
|  |  | ||||||
|  |     req.initial_spectrum = initial_spectrum | ||||||
|  |     return network, req, reference_channel | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def check_request_path_ids(rqs: List[PathRequest]): | ||||||
|  |     """check that request ids are unique. Non unique ids, may | ||||||
|  |     mess the computation: better to stop the computation | ||||||
|  |     """ | ||||||
|  |     all_ids = [r.request_id for r in rqs] | ||||||
|  |     if len(all_ids) != len(set(all_ids)): | ||||||
|  |         for item in list(set(all_ids)): | ||||||
|  |             all_ids.remove(item) | ||||||
|  |         msg = f'Requests id {all_ids} are not unique' | ||||||
|  |         logger.error(msg) | ||||||
|  |         raise ValueError(msg) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def planning(network: DiGraph, equipment: dict, data: dict, redesign: bool = False) \ | ||||||
|  |         -> Tuple[List[OMS], list, list, List[PathRequest], List[Disjunction], List[ResultElement]]: | ||||||
|  |     """Run planning | ||||||
|  |     data contain the service dict from json | ||||||
|  |     redesign True means that network is redesign using each request as reference channel | ||||||
|  |     when False it means that the design is made once and successive propagation use the settings | ||||||
|  |     computed with this design. | ||||||
|  |     """ | ||||||
|  |     oms_list = build_oms_list(network, equipment) | ||||||
|  |     rqs = requests_from_json(data, equipment) | ||||||
|  |     # check that request ids are unique. | ||||||
|  |     check_request_path_ids(rqs) | ||||||
|  |     rqs = correct_json_route_list(network, rqs) | ||||||
|  |     dsjn = disjunctions_from_json(data) | ||||||
|  |     logger.info('List of disjunctions:\n%s', dsjn) | ||||||
|  |     # need to warn or correct in case of wrong disjunction form | ||||||
|  |     # disjunction must not be repeated with same or different ids | ||||||
|  |     dsjn = deduplicate_disjunctions(dsjn) | ||||||
|  |     logger.info('Aggregating similar requests') | ||||||
|  |     rqs, dsjn = requests_aggregation(rqs, dsjn) | ||||||
|  |     logger.info('The following services have been requested:\n%s', rqs) | ||||||
|  |     # logger.info('Computing all paths with constraints for request %s', optical_path_result_id) | ||||||
|  |  | ||||||
|  |     pths = compute_path_dsjctn(network, equipment, rqs, dsjn) | ||||||
|  |     logger.info('Propagating on selected path') | ||||||
|  |     propagatedpths, reversed_pths, reversed_propagatedpths = \ | ||||||
|  |         compute_path_with_disjunction(network, equipment, rqs, pths, redesign=redesign) | ||||||
|  |     # Note that deepcopy used in compute_path_with_disjunction returns | ||||||
|  |     # a list of nodes which are not belonging to network (they are copies of the node objects). | ||||||
|  |     # so there can not be propagation on these nodes. | ||||||
|  |  | ||||||
|  |     # Allowed user_policy are first_fit and 2partition | ||||||
|  |     pth_assign_spectrum(pths, rqs, oms_list, reversed_pths) | ||||||
|  |     for i, rq in enumerate(rqs): | ||||||
|  |         if hasattr(rq, 'OSNR') and rq.OSNR: | ||||||
|  |             rq.osnr_with_sys_margin = rq.OSNR + equipment["SI"]["default"].sys_margins | ||||||
|  |  | ||||||
|  |     # assumes that list of rqs and list of propgatedpths have same order | ||||||
|  |     result = [ResultElement(rq, pth, rpth) for rq, pth, rpth in zip(rqs, propagatedpths, reversed_propagatedpths)] | ||||||
|  |     return oms_list, propagatedpths, reversed_propagatedpths, rqs, dsjn, result | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def transmission_simulation(equipment: dict, network: DiGraph, req: PathRequest, ref_req: PathRequest) \ | ||||||
|  |         -> Tuple[list, List[list], List[Union[float, int]], SpectralInformation]: | ||||||
|  |     """Run simulation and returms the propagation result for each power sweep iteration. | ||||||
|  |     Args: | ||||||
|  |     - equipment: a dictionary containing equipment information. | ||||||
|  |     - network: network after being designed using ref_req. Any missing information (amp gain or delta_p) must have | ||||||
|  |     been filled using ref_req as reference channel previuos to this function. | ||||||
|  |     - req: channel to be propagated. | ||||||
|  |     - ref_req: the reference channel used for filling missing information in the network. | ||||||
|  |     In case of power sweep, network is redesigned using ref_req whose target input power in span is | ||||||
|  |     updated with the power step. | ||||||
|  |  | ||||||
|  |     Returns a tuple containing: | ||||||
|  |     - path: last propagated path. Power sweep is not possible with gain mode (as gain targets are used) | ||||||
|  |     - propagations: list of propagated path for each power iteration | ||||||
|  |     - powers_dbm: list of power used for the power sweep | ||||||
|  |     - infos: last propagated spectral information | ||||||
|  |     """ | ||||||
|  |     power_mode = equipment['Span']['default'].power_mode | ||||||
|  |     logger.info('Power mode is set to %s=> it can be modified in eqpt_config.json - Span', power_mode) | ||||||
|  |     # initial network is designed using ref_req. that is that any missing information (amp gain or delta_p) is filled | ||||||
|  |     # using this ref_req.power, previous to any sweep requested later on. | ||||||
|  |  | ||||||
|  |     pref_ch_db = watt2dbm(ref_req.power) | ||||||
|  |     p_ch_db = watt2dbm(req.power) | ||||||
|  |     path = compute_constrained_path(network, req) | ||||||
|  |     power_range = [0] | ||||||
|  |     if power_mode: | ||||||
|  |         # power cannot be changed in gain mode | ||||||
|  |         try: | ||||||
|  |             p_start, p_stop, p_step = equipment['SI']['default'].power_range_db | ||||||
|  |             p_num = abs(int(round((p_stop - p_start) / p_step))) + 1 if p_step != 0 else 1 | ||||||
|  |             power_range = list(linspace(p_start, p_stop, p_num)) | ||||||
|  |         except TypeError as e: | ||||||
|  |             msg = 'invalid power range definition in eqpt_config, should be power_range_db: [lower, upper, step]' | ||||||
|  |             logger.error(msg) | ||||||
|  |             raise exceptions.EquipmentConfigError(msg) from e | ||||||
|  |  | ||||||
|  |     logger.info('Now propagating between %s and %s', req.source, req.destination) | ||||||
|  |  | ||||||
|  |     propagations = [] | ||||||
|  |     powers_dbm = [] | ||||||
|  |     for dp_db in power_range: | ||||||
|  |         ref_req.power = dbm2watt(pref_ch_db + dp_db) | ||||||
|  |         req.power = dbm2watt(p_ch_db + dp_db) | ||||||
|  |  | ||||||
|  |         # Power sweep is made to evaluate different span input powers, so redesign is mandatory for each power, | ||||||
|  |         #  but no need to redesign if there are no power sweep | ||||||
|  |         if len(power_range) > 1: | ||||||
|  |             design_network(ref_req, network.subgraph(path), equipment, set_connector_losses=False, verbose=False) | ||||||
|  |  | ||||||
|  |         infos = propagate(path, req, equipment) | ||||||
|  |         propagations.append(deepcopy(path)) | ||||||
|  |         powers_dbm.append(pref_ch_db + dp_db) | ||||||
|  |         logger.info('\nChannels propagating: (Input optical power deviation in span = ' | ||||||
|  |                     + f'{pretty_summary_print(per_label_average(infos.delta_pdb_per_channel, infos.label))}dB,\n' | ||||||
|  |                     + '                       spacing = ' | ||||||
|  |                     + f'{pretty_summary_print(per_label_average(infos.slot_width * 1e-9, infos.label))}GHz,\n' | ||||||
|  |                     + '                       transceiver output power = ' | ||||||
|  |                     + f'{pretty_summary_print(per_label_average(watt2dbm(infos.tx_power), infos.label))}dBm,\n' | ||||||
|  |                     + f'                       nb_channels = {infos.number_of_channels})') | ||||||
|  |         if not power_mode: | ||||||
|  |             logger.info('\n\tPropagating using gain targets: Input optical power deviation in span ignored') | ||||||
|  |     return path, propagations, powers_dbm, infos | ||||||
| @@ -16,14 +16,17 @@ See: draft-ietf-teas-yang-path-computation-01.txt | |||||||
| """ | """ | ||||||
|  |  | ||||||
| from collections import namedtuple, OrderedDict | from collections import namedtuple, OrderedDict | ||||||
|  | from typing import List | ||||||
| from logging import getLogger | from logging import getLogger | ||||||
| from networkx import (dijkstra_path, NetworkXNoPath, | from networkx import (dijkstra_path, NetworkXNoPath, | ||||||
|                       all_simple_paths, shortest_simple_paths) |                       all_simple_paths, shortest_simple_paths) | ||||||
| from networkx.utils import pairwise | from networkx.utils import pairwise | ||||||
| from numpy import mean, argmin | from numpy import mean, argmin | ||||||
| from gnpy.core.elements import Transceiver, Roadm |  | ||||||
| from gnpy.core.utils import lin2db | from gnpy.core.elements import Transceiver, Roadm, Edfa, Multiband_amplifier | ||||||
| from gnpy.core.info import create_input_spectral_information, carriers_to_spectral_information | from gnpy.core.utils import lin2db, find_common_range | ||||||
|  | from gnpy.core.info import create_input_spectral_information, carriers_to_spectral_information, \ | ||||||
|  |     demuxed_spectral_information, muxed_spectral_information, SpectralInformation | ||||||
| from gnpy.core import network as network_module | from gnpy.core import network as network_module | ||||||
| from gnpy.core.exceptions import ServiceError, DisjunctionError | from gnpy.core.exceptions import ServiceError, DisjunctionError | ||||||
| from copy import deepcopy | from copy import deepcopy | ||||||
| @@ -332,19 +335,40 @@ def compute_constrained_path(network, req): | |||||||
|     return total_path |     return total_path | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def filter_si(path: list, equipment: dict, si: SpectralInformation) -> SpectralInformation: | ||||||
|  |     """Filter spectral information based on the amplifiers common range""" | ||||||
|  |     # First retrieve f_min, f_max spectrum according to amplifiers' spectrum on the path | ||||||
|  |     common_range = find_elements_common_range(path, equipment) | ||||||
|  |     # filter out frequencies that should not be created | ||||||
|  |     filtered_si = [] | ||||||
|  |     for band in common_range: | ||||||
|  |         temp = demuxed_spectral_information(si, band) | ||||||
|  |         if temp: | ||||||
|  |             filtered_si.append(temp) | ||||||
|  |     if not filtered_si: | ||||||
|  |         raise ValueError('Defined propagation band does not match amplifiers band.') | ||||||
|  |     return muxed_spectral_information(filtered_si) | ||||||
|  |  | ||||||
|  |  | ||||||
| def propagate(path, req, equipment): | def propagate(path, req, equipment): | ||||||
|     """propagates signals in each element according to initial spectrum set by user""" |     """propagates signals in each element according to initial spectrum set by user | ||||||
|  |     Spectrum is specified in request through f_min, f_max and spacing, or initial_spectrum | ||||||
|  |     and amps frequency band on the path is used to filter out frequencies""" | ||||||
|  |     # generates spectrum based on request | ||||||
|     if req.initial_spectrum is not None: |     if req.initial_spectrum is not None: | ||||||
|         si = carriers_to_spectral_information(initial_spectrum=req.initial_spectrum, power=req.power) |         si = carriers_to_spectral_information(initial_spectrum=req.initial_spectrum, power=req.power) | ||||||
|     else: |     else: | ||||||
|         si = create_input_spectral_information( |         si = create_input_spectral_information( | ||||||
|             f_min=req.f_min, f_max=req.f_max, roll_off=req.roll_off, baud_rate=req.baud_rate, |             f_min=req.f_min, f_max=req.f_max, roll_off=req.roll_off, baud_rate=req.baud_rate, | ||||||
|             spacing=req.spacing, tx_osnr=req.tx_osnr, tx_power=req.tx_power, delta_pdb=req.offset_db) |             spacing=req.spacing, tx_osnr=req.tx_osnr, tx_power=req.tx_power, delta_pdb=req.offset_db) | ||||||
|  |     # filter out frequencies that should not be created | ||||||
|  |     si = filter_si(path, equipment, si) | ||||||
|     roadm_osnr = [] |     roadm_osnr = [] | ||||||
|     for i, el in enumerate(path): |     for i, el in enumerate(path): | ||||||
|         if isinstance(el, Roadm): |         if isinstance(el, Roadm): | ||||||
|             si = el(si, degree=path[i + 1].uid, from_degree=path[i - 1].uid) |             si = el(si, degree=path[i + 1].uid, from_degree=path[i - 1].uid) | ||||||
|             roadm_osnr.append(el.get_roadm_path(from_degree=path[i - 1].uid, to_degree=path[i + 1].uid).impairment.osnr) |             roadm_osnr.append(el.get_impairment('roadm-osnr', si.frequency, | ||||||
|  |                                                 from_degree=path[i - 1].uid, degree=path[i + 1].uid)) | ||||||
|         else: |         else: | ||||||
|             si = el(si) |             si = el(si) | ||||||
|     path[0].update_snr(si.tx_osnr) |     path[0].update_snr(si.tx_osnr) | ||||||
| @@ -385,11 +409,13 @@ def propagate_and_optimize_mode(path, req, equipment): | |||||||
|                                                          baud_rate=this_br, spacing=req.spacing, |                                                          baud_rate=this_br, spacing=req.spacing, | ||||||
|                                                          delta_pdb=this_offset, tx_osnr=req.tx_osnr, |                                                          delta_pdb=this_offset, tx_osnr=req.tx_osnr, | ||||||
|                                                          tx_power=req.tx_power) |                                                          tx_power=req.tx_power) | ||||||
|  |             spc_info = filter_si(path, equipment, spc_info) | ||||||
|             roadm_osnr = [] |             roadm_osnr = [] | ||||||
|             for i, el in enumerate(path): |             for i, el in enumerate(path): | ||||||
|                 if isinstance(el, Roadm): |                 if isinstance(el, Roadm): | ||||||
|                     spc_info = el(spc_info, degree=path[i + 1].uid, from_degree=path[i - 1].uid) |                     spc_info = el(spc_info, degree=path[i + 1].uid, from_degree=path[i - 1].uid) | ||||||
|                     roadm_osnr.append(el.get_roadm_path(from_degree=path[i - 1].uid, to_degree=path[i + 1].uid).impairment.osnr) |                     roadm_osnr.append(el.get_impairment('roadm-osnr', spc_info.frequency, | ||||||
|  |                                                         from_degree=path[i - 1].uid, degree=path[i + 1].uid)) | ||||||
|                 else: |                 else: | ||||||
|                     spc_info = el(spc_info) |                     spc_info = el(spc_info) | ||||||
|             for this_mode in modes_to_explore: |             for this_mode in modes_to_explore: | ||||||
| @@ -1071,7 +1097,7 @@ def deduplicate_disjunctions(disjn): | |||||||
|     return local_disjn |     return local_disjn | ||||||
|  |  | ||||||
|  |  | ||||||
| def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist): | def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist, redesign=False): | ||||||
|     """use a list but a dictionnary might be helpful to find path based on request_id |     """use a list but a dictionnary might be helpful to find path based on request_id | ||||||
|  |  | ||||||
|     TODO change all these req, dsjct, res lists into dict ! |     TODO change all these req, dsjct, res lists into dict ! | ||||||
| @@ -1080,6 +1106,10 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist): | |||||||
|     reversed_path_res_list = [] |     reversed_path_res_list = [] | ||||||
|     propagated_reversed_path_res_list = [] |     propagated_reversed_path_res_list = [] | ||||||
|  |  | ||||||
|  |     total_nb_requests = len(pathreqlist) | ||||||
|  |     if redesign: | ||||||
|  |         LOGGER.warning('Redesign the network for each request channel, ' | ||||||
|  |                        + 'using the request channel as the reference channel for the design.') | ||||||
|     for i, pathreq in enumerate(pathreqlist): |     for i, pathreq in enumerate(pathreqlist): | ||||||
|  |  | ||||||
|         # use the power specified in requests but might be different from the one |         # use the power specified in requests but might be different from the one | ||||||
| @@ -1097,7 +1127,16 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist): | |||||||
|         # elements to simulate performance, several demands having the same destination |         # elements to simulate performance, several demands having the same destination | ||||||
|         # may use the same transponder for the performance simulation. This is why |         # may use the same transponder for the performance simulation. This is why | ||||||
|         # we use deepcopy: to ensure that each propagation is recorded and not overwritten |         # we use deepcopy: to ensure that each propagation is recorded and not overwritten | ||||||
|         network_module.design_network(pathreq, network, equipment, set_connector_losses=False, verbose=False) |         # reversed path is needed for correct spectrum assignment | ||||||
|  |         if redesign: | ||||||
|  |             # this is the legacy case where network was automatically redesigned using the | ||||||
|  |             # request channel as reference (nb and power used for amplifiers total power out) | ||||||
|  |             reversed_path = [] | ||||||
|  |             if pathlist[i]: | ||||||
|  |                 reversed_path = find_reversed_path(pathlist[i]) | ||||||
|  |             network_nodes_for_redesign = pathlist[i] + reversed_path | ||||||
|  |             network_module.design_network(pathreq, network.subgraph(network_nodes_for_redesign), equipment, | ||||||
|  |                                           set_connector_losses=False, verbose=False) | ||||||
|         total_path = deepcopy(pathlist[i]) |         total_path = deepcopy(pathlist[i]) | ||||||
|         msg = msg + f'\n\tComputed path (roadms):{[e.uid for e in total_path  if isinstance(e, Roadm)]}' |         msg = msg + f'\n\tComputed path (roadms):{[e.uid for e in total_path  if isinstance(e, Roadm)]}' | ||||||
|         LOGGER.info(msg) |         LOGGER.info(msg) | ||||||
| @@ -1212,3 +1251,11 @@ def _penalty_msg(total_path, msg, min_ind): | |||||||
|         else: |         else: | ||||||
|             msg += f'\n\t{pretty} penalty not evaluated' |             msg += f'\n\t{pretty} penalty not evaluated' | ||||||
|     return msg |     return msg | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def find_elements_common_range(el_list: list, equipment: dict) -> List[dict]: | ||||||
|  |     """Find the common frequency range of amps of a given list of elements (for example an OMS or a path) | ||||||
|  |     If there are no amplifiers in the path, then use the SI | ||||||
|  |     """ | ||||||
|  |     amp_bands = [n.params.bands for n in el_list if isinstance(n, (Edfa, Multiband_amplifier))] | ||||||
|  |     return find_common_range(amp_bands, equipment['SI']['default'].f_min, equipment['SI']['default'].f_max) | ||||||
|   | |||||||
| @@ -15,28 +15,31 @@ element/oms correspondace | |||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
| from logging import getLogger | from logging import getLogger | ||||||
| from gnpy.core.elements import Roadm, Transceiver |  | ||||||
|  | from gnpy.core.elements import Roadm, Transceiver, Edfa, Multiband_amplifier | ||||||
| from gnpy.core.exceptions import ServiceError, SpectrumError | from gnpy.core.exceptions import ServiceError, SpectrumError | ||||||
| from gnpy.core.utils import order_slots, restore_order | from gnpy.core.utils import order_slots, restore_order | ||||||
| from gnpy.topology.request import compute_spectrum_slot_vs_bandwidth | from gnpy.topology.request import compute_spectrum_slot_vs_bandwidth, find_elements_common_range | ||||||
|  |  | ||||||
| LOGGER = getLogger(__name__) | LOGGER = getLogger(__name__) | ||||||
|  | GUARDBAND = 25e9 | ||||||
|  |  | ||||||
|  |  | ||||||
| class Bitmap: | class Bitmap: | ||||||
|     """records the spectrum occupation""" |     """records the spectrum occupation""" | ||||||
|  |  | ||||||
|     def __init__(self, f_min, f_max, grid, guardband=0.15e12, bitmap=None): |     def __init__(self, f_min, f_max, grid, guardband=GUARDBAND, bitmap=None): | ||||||
|         # n is the min index including guardband. Guardband is require to be sure |         # n is the min index including guardband. Guardband is required to be sure | ||||||
|         # that a channel can be assigned  with center frequency fmin (means that its |         # that a channel can be assigned  with center frequency fmin (means that its | ||||||
|         # slot occupation goes below freq_index_min |         # slot occupation goes below freq_index_min | ||||||
|         n_min = frequency_to_n(f_min - guardband, grid) |         n_min = frequency_to_n(f_min, grid) | ||||||
|         n_max = frequency_to_n(f_max + guardband, grid) - 1 |         n_max = frequency_to_n(f_max, grid) | ||||||
|         self.n_min = n_min |         self.n_min = n_min | ||||||
|         self.n_max = n_max |         self.n_max = n_max | ||||||
|         self.freq_index_min = frequency_to_n(f_min) |         self.freq_index_min = frequency_to_n(f_min + guardband) | ||||||
|         self.freq_index_max = frequency_to_n(f_max) |         self.freq_index_max = frequency_to_n(f_max - guardband) | ||||||
|         self.freq_index = list(range(n_min, n_max + 1)) |         self.freq_index = list(range(n_min, n_max + 1)) | ||||||
|  |         self.guardband = guardband | ||||||
|         if bitmap is None: |         if bitmap is None: | ||||||
|             self.bitmap = [1] * (n_max - n_min + 1) |             self.bitmap = [1] * (n_max - n_min + 1) | ||||||
|         elif len(bitmap) == len(self.freq_index): |         elif len(bitmap) == len(self.freq_index): | ||||||
| @@ -83,7 +86,6 @@ class OMS: | |||||||
|         self.spectrum_bitmap = [] |         self.spectrum_bitmap = [] | ||||||
|         self.nb_channels = 0 |         self.nb_channels = 0 | ||||||
|         self.service_list = [] |         self.service_list = [] | ||||||
|     # TODO |  | ||||||
|  |  | ||||||
|     def __str__(self): |     def __str__(self): | ||||||
|         return '\n\t'.join([f'{type(self).__name__} {self.oms_id}', |         return '\n\t'.join([f'{type(self).__name__} {self.oms_id}', | ||||||
| @@ -98,7 +100,7 @@ class OMS: | |||||||
|         self.el_id_list.append(elem.uid) |         self.el_id_list.append(elem.uid) | ||||||
|         self.el_list.append(elem) |         self.el_list.append(elem) | ||||||
|  |  | ||||||
|     def update_spectrum(self, f_min, f_max, guardband=0.15e12, existing_spectrum=None, grid=0.00625e12): |     def update_spectrum(self, f_min, f_max, guardband=GUARDBAND, existing_spectrum=None, grid=0.00625e12): | ||||||
|         """Frequencies expressed in Hz. |         """Frequencies expressed in Hz. | ||||||
|         Add 150 GHz margin to enable a center channel on f_min |         Add 150 GHz margin to enable a center channel on f_min | ||||||
|         Use ITU-T G694.1 Flexible DWDM grid definition |         Use ITU-T G694.1 Flexible DWDM grid definition | ||||||
| @@ -226,6 +228,40 @@ def align_grids(oms_list): | |||||||
|     return oms_list |     return oms_list | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def find_network_freq_range(network, equipment): | ||||||
|  |     """Find the lowest freq from amps and highest freq among all amps to determine the resulting bitmap | ||||||
|  |     """ | ||||||
|  |     amp_bands = [band for n in network.nodes() if isinstance(n, (Edfa, Multiband_amplifier)) for band in n.params.bands] | ||||||
|  |     min_frequencies = [a['f_min'] for a in amp_bands] | ||||||
|  |     max_frequencies = [a['f_max'] for a in amp_bands] | ||||||
|  |     return min(min_frequencies), max(max_frequencies) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def create_oms_bitmap(oms, equipment, f_min, f_max, guardband, grid): | ||||||
|  |     """Find the highest low freq from oms amps and lowest high freq among oms amps to determine | ||||||
|  |     the possible bitmap window. | ||||||
|  |     f_min and f_max represent the useable spectrum (not the useable center frequencies) | ||||||
|  |     ie n smaller than frequency_to_n(min_freq, grid) are not useable | ||||||
|  |     """ | ||||||
|  |     n_min = frequency_to_n(f_min, grid) | ||||||
|  |     n_max = frequency_to_n(f_max, grid) - 1 | ||||||
|  |     common_range = find_elements_common_range(oms.el_list, equipment) | ||||||
|  |     band0 = common_range[0] | ||||||
|  |     band0_n_min = frequency_to_n(band0['f_min'], grid) | ||||||
|  |     band0_n_max = frequency_to_n(band0['f_max'], grid) | ||||||
|  |     bitmap = [0] * (band0_n_min - n_min) + [1] * (band0_n_max - band0_n_min + 1) | ||||||
|  |     i = 1 | ||||||
|  |     while i < len(common_range): | ||||||
|  |         band = common_range[i] | ||||||
|  |         band_n_min = frequency_to_n(band['f_min'], grid) | ||||||
|  |         band_n_max = frequency_to_n(band['f_max'], grid) | ||||||
|  |         bitmap = bitmap + [0] * (band_n_min - band0_n_max - 1) + [1] * (band_n_max - band_n_min + 1) | ||||||
|  |         band0_n_max = band_n_max | ||||||
|  |         i += 1 | ||||||
|  |     bitmap = bitmap + [0] * (n_max - band0_n_max) | ||||||
|  |     return bitmap | ||||||
|  |  | ||||||
|  |  | ||||||
| def build_oms_list(network, equipment): | def build_oms_list(network, equipment): | ||||||
|     """initialization of OMS list in the network |     """initialization of OMS list in the network | ||||||
|  |  | ||||||
| @@ -237,7 +273,15 @@ def build_oms_list(network, equipment): | |||||||
|     """ |     """ | ||||||
|     oms_id = 0 |     oms_id = 0 | ||||||
|     oms_list = [] |     oms_list = [] | ||||||
|     for node in [n for n in network.nodes() if isinstance(n, Roadm)]: |     # identify all vertices of OMS: of course ROADM, but aso links to external chassis transponders | ||||||
|  |     oms_vertices = [n for n in network.nodes() if isinstance(n, Roadm)] +\ | ||||||
|  |                    [n for n in network.nodes() if isinstance(n, Transceiver) | ||||||
|  |                     and not isinstance(next(network.successors(n)), Roadm)] | ||||||
|  |     # determine the size of the bitmap common to all the omses: find min and max frequencies of all amps | ||||||
|  |     # in the network. These gives the band not the center frequency. Thhen we use a reference channel | ||||||
|  |     # slot width (50GHz) to set the f_min, f_max | ||||||
|  |     f_min, f_max = find_network_freq_range(network, equipment) | ||||||
|  |     for node in oms_vertices: | ||||||
|         for edge in network.edges([node]): |         for edge in network.edges([node]): | ||||||
|             if not isinstance(edge[1], Transceiver): |             if not isinstance(edge[1], Transceiver): | ||||||
|                 nd_in = edge[0]  # nd_in is a Roadm |                 nd_in = edge[0]  # nd_in is a Roadm | ||||||
| @@ -271,8 +315,9 @@ def build_oms_list(network, equipment): | |||||||
|                     nd_out.oms_list = [] |                     nd_out.oms_list = [] | ||||||
|                     nd_out.oms_list.append(oms_id) |                     nd_out.oms_list.append(oms_id) | ||||||
|  |  | ||||||
|                 oms.update_spectrum(equipment['SI']['default'].f_min, |                 bitmap = create_oms_bitmap(oms, equipment, f_min=f_min, f_max=f_max, guardband=GUARDBAND, | ||||||
|                                     equipment['SI']['default'].f_max, grid=0.00625e12) |                                            grid=0.00625e12) | ||||||
|  |                 oms.update_spectrum(f_min, f_max, guardband=GUARDBAND, grid=0.00625e12, existing_spectrum=bitmap) | ||||||
|                 # oms.assign_spectrum(13,7) gives back (193137500000000.0, 193225000000000.0) |                 # oms.assign_spectrum(13,7) gives back (193137500000000.0, 193225000000000.0) | ||||||
|                 # as in the example in the standard |                 # as in the example in the standard | ||||||
|                 # oms.assign_spectrum(13,7) |                 # oms.assign_spectrum(13,7) | ||||||
| @@ -333,10 +378,11 @@ def aggregate_oms_bitmap(path_oms, oms_list): | |||||||
|         'el_id_list': 0, |         'el_id_list': 0, | ||||||
|         'el_list': [] |         'el_list': [] | ||||||
|     } |     } | ||||||
|     freq_min = nvalue_to_frequency(spectrum.freq_index_min) |     freq_min = nvalue_to_frequency(spectrum.n_min) | ||||||
|     freq_max = nvalue_to_frequency(spectrum.freq_index_max) |     freq_max = nvalue_to_frequency(spectrum.n_max) | ||||||
|     aggregate_oms = OMS(**params) |     aggregate_oms = OMS(**params) | ||||||
|     aggregate_oms.update_spectrum(freq_min, freq_max, grid=0.00625e12, existing_spectrum=bitmap) |     aggregate_oms.update_spectrum(freq_min, freq_max, grid=0.00625e12, guardband=spectrum.guardband, | ||||||
|  |                                   existing_spectrum=bitmap) | ||||||
|     return aggregate_oms |     return aggregate_oms | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|     "f_min": 191.35e12, |     "f_min": 191.275e12, | ||||||
|     "f_max": 196.1e12, |     "f_max": 196.125e12, | ||||||
|     "nf_ripple": [ |     "nf_ripple": [ | ||||||
|         0.0, |         0.0, | ||||||
|         0.0, |         0.0, | ||||||
|   | |||||||
| @@ -128,6 +128,19 @@ | |||||||
|                         "roadm-pmax": 2.5, |                         "roadm-pmax": 2.5, | ||||||
|                         "roadm-osnr": 41, |                         "roadm-osnr": 41, | ||||||
|                         "roadm-noise-figure": 23 |                         "roadm-noise-figure": 23 | ||||||
|  |                     }, { | ||||||
|  |                         "frequency-range": { | ||||||
|  |                             "lower-frequency": 186.3e12, | ||||||
|  |                             "upper-frequency": 190.1e12 | ||||||
|  |                         }, | ||||||
|  |                         "roadm-pmd": 0, | ||||||
|  |                         "roadm-cd": 0, | ||||||
|  |                         "roadm-pdl": 0.5, | ||||||
|  |                         "roadm-inband-crosstalk": 0, | ||||||
|  |                         "roadm-maxloss": 5, | ||||||
|  |                         "roadm-pmax": 0, | ||||||
|  |                         "roadm-osnr": 35, | ||||||
|  |                         "roadm-noise-figure": 6 | ||||||
|                     }] |                     }] | ||||||
|                 }, { |                 }, { | ||||||
|                     "roadm-path-impairments-id": 2, |                     "roadm-path-impairments-id": 2, | ||||||
| @@ -162,6 +175,7 @@ | |||||||
|         } |         } | ||||||
|     ], |     ], | ||||||
|     "SI": [{ |     "SI": [{ | ||||||
|  |             "type_variety": "default", | ||||||
|             "f_min": 191.3e12, |             "f_min": 191.3e12, | ||||||
|             "f_max": 196.1e12, |             "f_max": 196.1e12, | ||||||
|             "baud_rate": 32e9, |             "baud_rate": 32e9, | ||||||
| @@ -171,7 +185,7 @@ | |||||||
|             "roll_off": 0.15, |             "roll_off": 0.15, | ||||||
|             "tx_osnr": 100, |             "tx_osnr": 100, | ||||||
|             "sys_margins": 0 |             "sys_margins": 0 | ||||||
|             }], |         }], | ||||||
|       "Transceiver":[ |       "Transceiver":[ | ||||||
|             { |             { | ||||||
|             "type_variety": "vendorA_trx-type1", |             "type_variety": "vendorA_trx-type1", | ||||||
|   | |||||||
							
								
								
									
										396
									
								
								tests/data/eqpt_config_multiband.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										396
									
								
								tests/data/eqpt_config_multiband.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,396 @@ | |||||||
|  | {     "Edfa":[{ | ||||||
|  |             "type_variety": "CienaDB_medium_gain", | ||||||
|  |             "type_def": "advanced_model", | ||||||
|  |             "gain_flatmax": 25, | ||||||
|  |             "gain_min": 15, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "advanced_config_from_json": "std_medium_gain_advanced_config.json", | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": true | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |             "type_variety": "std_medium_gain", | ||||||
|  |             "f_min": 191.25e12, | ||||||
|  |             "f_max": 196.15e12, | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 26, | ||||||
|  |             "gain_min": 15, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf_min": 6, | ||||||
|  |             "nf_max": 10, | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": true | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |             "type_variety": "std_medium_gain_L", | ||||||
|  |             "f_min": 186.55e12, | ||||||
|  |             "f_max": 190.05e12, | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 26, | ||||||
|  |             "gain_min": 15, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf_min": 6, | ||||||
|  |             "nf_max": 10, | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": true | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |             "type_variety": "std_low_gain", | ||||||
|  |             "f_min": 191.25e12, | ||||||
|  |             "f_max": 196.15e12, | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 16, | ||||||
|  |             "gain_min": 8, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf_min": 7, | ||||||
|  |             "nf_max": 11, | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_low_gain_reduced_band", | ||||||
|  |             "f_min": 192.25e12, | ||||||
|  |             "f_max": 196.15e12, | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 16, | ||||||
|  |             "gain_min": 8, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf_min": 7, | ||||||
|  |             "nf_max": 11, | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |         "type_variety": "std_low_gain_reduced", | ||||||
|  |         "f_min": 192.25e12, | ||||||
|  |         "f_max": 196.15e12, | ||||||
|  |         "type_def": "variable_gain", | ||||||
|  |         "gain_flatmax": 16, | ||||||
|  |         "gain_min": 8, | ||||||
|  |         "p_max": 21, | ||||||
|  |         "nf_min": 7, | ||||||
|  |         "nf_max": 11, | ||||||
|  |         "out_voa_auto": false, | ||||||
|  |         "allowed_for_design": true | ||||||
|  |     }, | ||||||
|  | 		{ | ||||||
|  |             "type_variety": "std_low_gain_bis", | ||||||
|  |             "f_min": 191.25e12, | ||||||
|  |             "f_max": 196.15e12, | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 16, | ||||||
|  |             "gain_min": 8, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf_min": 6, | ||||||
|  |             "nf_max": 10, | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, { | ||||||
|  |             "type_variety": "std_low_gain_L_ter", | ||||||
|  |             "f_min": 186.55e12, | ||||||
|  |             "f_max": 190.05e12, | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 16, | ||||||
|  |             "gain_min": 8, | ||||||
|  |             "p_max": 16, | ||||||
|  |             "nf_min": 7, | ||||||
|  |             "nf_max": 11, | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, | ||||||
|  | 		{ | ||||||
|  |             "type_variety": "std_low_gain_L", | ||||||
|  |             "f_min": 186.55e12, | ||||||
|  |             "f_max": 190.05e12, | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 16, | ||||||
|  |             "gain_min": 8, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf_min": 7, | ||||||
|  |             "nf_max": 11, | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": true | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "type_variety": "std_low_gain_L_reduced_band", | ||||||
|  |                 "f_min": 187.3e12, | ||||||
|  |                 "f_max": 190.05e12, | ||||||
|  |                 "type_def": "variable_gain", | ||||||
|  |                 "gain_flatmax": 16, | ||||||
|  |                 "gain_min": 8, | ||||||
|  |                 "p_max": 21, | ||||||
|  |                 "nf_min": 7, | ||||||
|  |                 "nf_max": 11, | ||||||
|  |                 "out_voa_auto": false, | ||||||
|  |                 "allowed_for_design": true | ||||||
|  |                 }, | ||||||
|  |             { | ||||||
|  |             "type_variety": "test", | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 25, | ||||||
|  |             "gain_min": 15, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf_min": 5.8, | ||||||
|  |             "nf_max": 10, | ||||||
|  |             "out_voa_auto": false, | ||||||
|  |             "allowed_for_design": true | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |             "type_variety": "test_fixed_gain", | ||||||
|  |             "type_def": "fixed_gain", | ||||||
|  |             "gain_flatmax": 21, | ||||||
|  |             "gain_min": 20, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf0": 5, | ||||||
|  |             "allowed_for_design": true | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |             "type_variety": "std_booster", | ||||||
|  |             "type_def": "fixed_gain", | ||||||
|  |             "gain_flatmax": 21, | ||||||
|  |             "gain_min": 20, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf0": 5, | ||||||
|  |             "allowed_for_design": false | ||||||
|  |                     }, { | ||||||
|  |             "type_variety": "std_booster_L", | ||||||
|  |             "f_min": 186.55e12, | ||||||
|  |             "f_max": 190.05e12, | ||||||
|  |             "type_def": "fixed_gain", | ||||||
|  |             "gain_flatmax": 21, | ||||||
|  |             "gain_min": 20, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf0": 5, | ||||||
|  |             "allowed_for_design": false | ||||||
|  |         }, { | ||||||
|  |             "type_variety": "std_booster_multiband", | ||||||
|  |             "type_def": "multi_band", | ||||||
|  |             "amplifiers": [ | ||||||
|  |                 "std_booster", | ||||||
|  |                 "std_booster_L" | ||||||
|  |             ], | ||||||
|  |             "allowed_for_design": false | ||||||
|  |         }, { | ||||||
|  |             "type_variety": "std_medium_gain_multiband", | ||||||
|  |             "type_def": "multi_band", | ||||||
|  |             "amplifiers": [ | ||||||
|  |                 "std_medium_gain", | ||||||
|  |                 "std_medium_gain_L" | ||||||
|  |             ], | ||||||
|  |             "allowed_for_design": true | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |             "type_variety": "std_low_gain_multiband", | ||||||
|  |             "type_def": "multi_band", | ||||||
|  |             "amplifiers": [ | ||||||
|  |                 "std_low_gain", | ||||||
|  |                 "std_low_gain_L" | ||||||
|  |             ], | ||||||
|  |             "allowed_for_design": false | ||||||
|  |         }, { | ||||||
|  |             "type_variety": "std_low_gain_multiband_ter", | ||||||
|  |             "type_def": "multi_band", | ||||||
|  |             "amplifiers": [ | ||||||
|  |                 "std_low_gain", | ||||||
|  |                 "std_low_gain_L_ter" | ||||||
|  |             ], | ||||||
|  |             "allowed_for_design": false | ||||||
|  |         }, { | ||||||
|  |             "type_variety": "std_low_gain_multiband_bis", | ||||||
|  |             "type_def": "multi_band", | ||||||
|  |             "amplifiers": [ | ||||||
|  |                 "std_low_gain_bis", | ||||||
|  |                 "std_low_gain_L" | ||||||
|  |             ], | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, { | ||||||
|  |             "type_variety": "std_low_gain_multiband_reduced_bis", | ||||||
|  |             "type_def": "multi_band", | ||||||
|  |             "amplifiers": [ | ||||||
|  |                 "std_low_gain_reduced", | ||||||
|  |                 "std_low_gain_L" | ||||||
|  |             ], | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         }, { | ||||||
|  |             "type_variety": "std_low_gain_multiband_reduced", | ||||||
|  |             "type_def": "multi_band", | ||||||
|  |             "amplifiers": [ | ||||||
|  |                 "std_low_gain_bis", | ||||||
|  |                 "std_low_gain_L_reduced_band" | ||||||
|  |             ], | ||||||
|  |             "allowed_for_design": true | ||||||
|  |         } | ||||||
|  |       ], | ||||||
|  |       "Fiber":[{ | ||||||
|  |             "type_variety": "SSMF", | ||||||
|  |             "dispersion": 1.67e-05, | ||||||
|  |             "effective_area": 83e-12, | ||||||
|  |             "pmd_coef": 1.265e-15 | ||||||
|  |             } | ||||||
|  |       ], | ||||||
|  |       "Span":[{ | ||||||
|  |             "power_mode":true, | ||||||
|  |             "delta_power_range_db": [0,0,0.5], | ||||||
|  |             "max_fiber_lineic_loss_for_raman": 0.25, | ||||||
|  |             "target_extended_gain": 2.5, | ||||||
|  |             "max_length": 150, | ||||||
|  |             "length_units": "km", | ||||||
|  |             "max_loss": 28, | ||||||
|  |             "padding": 10, | ||||||
|  |             "EOL": 0, | ||||||
|  |             "con_in": 0, | ||||||
|  |             "con_out": 0 | ||||||
|  |             } | ||||||
|  |       ], | ||||||
|  |       "Roadm":[{ | ||||||
|  |             "target_pch_out_db": -20, | ||||||
|  |             "add_drop_osnr": 38, | ||||||
|  |             "pmd": 0, | ||||||
|  |             "pdl": 0, | ||||||
|  |             "restrictions": { | ||||||
|  |                             "preamp_variety_list":[], | ||||||
|  |                             "booster_variety_list":[] | ||||||
|  |                             } | ||||||
|  |             }], | ||||||
|  |       "SI":[{ | ||||||
|  |             "f_min": 191.3e12, | ||||||
|  |             "f_max":196.1e12, | ||||||
|  |             "baud_rate": 32e9, | ||||||
|  |             "spacing": 50e9, | ||||||
|  |             "power_dbm": 0, | ||||||
|  |             "power_range_db": [0,0,0.5], | ||||||
|  |             "roll_off": 0.15, | ||||||
|  |             "tx_osnr": 100, | ||||||
|  |             "sys_margins": 0 | ||||||
|  |             }], | ||||||
|  |       "Transceiver":[ | ||||||
|  |             { | ||||||
|  |             "type_variety": "vendorA_trx-type1", | ||||||
|  |             "frequency":{ | ||||||
|  |                         "min": 191.35e12, | ||||||
|  |                         "max": 196.1e12 | ||||||
|  |                         }, | ||||||
|  |             "mode":[ | ||||||
|  |                        { | ||||||
|  |                        "format": "PS_SP64_1", | ||||||
|  |                        "baud_rate": 32e9, | ||||||
|  |                        "OSNR": 11, | ||||||
|  |                        "bit_rate": 100e9, | ||||||
|  |                        "roll_off": 0.15, | ||||||
|  |                        "tx_osnr": 100, | ||||||
|  |                        "min_spacing": 50e9, | ||||||
|  |                        "cost":1 | ||||||
|  |                        }, | ||||||
|  |                        { | ||||||
|  |                        "format": "PS_SP64_2", | ||||||
|  |                        "baud_rate": 64e9, | ||||||
|  |                        "OSNR": 15, | ||||||
|  |                        "bit_rate": 200e9, | ||||||
|  |                        "roll_off": 0.15, | ||||||
|  |                        "tx_osnr": 100, | ||||||
|  |                        "min_spacing": 75e9, | ||||||
|  |                        "cost":1 | ||||||
|  |                        }, | ||||||
|  |                        { | ||||||
|  |                        "format": "mode 1", | ||||||
|  |                        "baud_rate": 32e9, | ||||||
|  |                        "OSNR": 11, | ||||||
|  |                        "bit_rate": 100e9, | ||||||
|  |                        "roll_off": 0.15, | ||||||
|  |                        "tx_osnr": 100, | ||||||
|  |                        "min_spacing": 50e9, | ||||||
|  |                        "cost":1 | ||||||
|  |                        }, | ||||||
|  |                        { | ||||||
|  |                        "format": "mode 2", | ||||||
|  |                        "baud_rate": 64e9, | ||||||
|  |                        "OSNR": 15, | ||||||
|  |                        "bit_rate": 200e9, | ||||||
|  |                        "roll_off": 0.15, | ||||||
|  |                        "tx_osnr": 100, | ||||||
|  |                        "min_spacing": 75e9, | ||||||
|  |                        "cost":1 | ||||||
|  |                        } | ||||||
|  |                    ] | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |             "type_variety": "Voyager_16QAM", | ||||||
|  |             "frequency":{ | ||||||
|  |                         "min": 191.35e12, | ||||||
|  |                         "max": 196.1e12 | ||||||
|  |                         }, | ||||||
|  |             "mode":[ | ||||||
|  |                        { | ||||||
|  |                        "format": "16QAM", | ||||||
|  |                        "baud_rate": 32e9, | ||||||
|  |                        "OSNR": 19, | ||||||
|  |                        "bit_rate": 200e9, | ||||||
|  |                        "roll_off": 0.15, | ||||||
|  |                        "tx_osnr": 100, | ||||||
|  |                        "min_spacing": 50e9, | ||||||
|  |                        "cost":1 | ||||||
|  |                        } | ||||||
|  |                    ] | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |             "type_variety": "Voyager", | ||||||
|  |             "frequency":{ | ||||||
|  |                         "min": 191.35e12, | ||||||
|  |                         "max": 196.1e12 | ||||||
|  |                         }, | ||||||
|  |             "mode":[ | ||||||
|  |                        { | ||||||
|  |                        "format": "mode 1", | ||||||
|  |                        "baud_rate": 32e9, | ||||||
|  |                        "OSNR": 12, | ||||||
|  |                        "bit_rate": 100e9, | ||||||
|  |                        "roll_off": 0.15, | ||||||
|  |                        "tx_osnr": 45, | ||||||
|  |                        "min_spacing": 50e9, | ||||||
|  |                        "cost":1 | ||||||
|  |                        }, | ||||||
|  |                        { | ||||||
|  |                        "format": "mode 3", | ||||||
|  |                        "baud_rate": 44e9, | ||||||
|  |                        "OSNR": 18, | ||||||
|  |                        "bit_rate": 300e9, | ||||||
|  |                        "roll_off": 0.15, | ||||||
|  |                        "tx_osnr": 45, | ||||||
|  |                        "min_spacing": 62.5e9, | ||||||
|  |                        "cost":1 | ||||||
|  |                        }, | ||||||
|  |                        { | ||||||
|  |                        "format": "mode 2", | ||||||
|  |                        "baud_rate": 66e9, | ||||||
|  |                        "OSNR": 21, | ||||||
|  |                        "bit_rate": 400e9, | ||||||
|  |                        "roll_off": 0.15, | ||||||
|  |                        "tx_osnr": 45, | ||||||
|  |                        "min_spacing": 75e9, | ||||||
|  |                        "cost":1 | ||||||
|  |                        }, | ||||||
|  |                        { | ||||||
|  |                        "format": "mode 2 - fake", | ||||||
|  |                        "baud_rate": 66e9, | ||||||
|  |                        "OSNR": 21, | ||||||
|  |                        "bit_rate": 400e9, | ||||||
|  |                        "roll_off": 0.15, | ||||||
|  |                        "tx_osnr": 45, | ||||||
|  |                        "min_spacing": 75e9, | ||||||
|  |                        "cost":1 | ||||||
|  |                        }, | ||||||
|  |                        { | ||||||
|  |                        "format": "mode 4", | ||||||
|  |                        "baud_rate": 66e9, | ||||||
|  |                        "OSNR": 16, | ||||||
|  |                        "bit_rate": 200e9, | ||||||
|  |                        "roll_off": 0.15, | ||||||
|  |                        "tx_osnr": 45, | ||||||
|  |                        "min_spacing": 75e9, | ||||||
|  |                        "cost":1 | ||||||
|  |                        } | ||||||
|  |                    ] | ||||||
|  |             } | ||||||
|  |       ] | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -2,7 +2,7 @@ | |||||||
|   "raman_params": { |   "raman_params": { | ||||||
|     "flag": true, |     "flag": true, | ||||||
|     "result_spatial_resolution": 10e3, |     "result_spatial_resolution": 10e3, | ||||||
|     "solver_spatial_resolution": 50 |     "solver_spatial_resolution": 10e3 | ||||||
|   }, |   }, | ||||||
|   "nli_params": { |   "nli_params": { | ||||||
|     "method": "ggn_spectrally_separated", |     "method": "ggn_spectrally_separated", | ||||||
|   | |||||||
| @@ -1,4 +1,7 @@ | |||||||
| {     "nf_fit_coeff": [ | { | ||||||
|  |       "f_min": 191.275e12, | ||||||
|  |       "f_max": 196.125e12, | ||||||
|  |       "nf_fit_coeff": [ | ||||||
|       0.000168241, |       0.000168241, | ||||||
|       0.0469961, |       0.0469961, | ||||||
|       0.0359549, |       0.0359549, | ||||||
|   | |||||||
| @@ -0,0 +1,6 @@ | |||||||
|  | ,signal,nli | ||||||
|  | 0,3.9807550201531427e-07,1.0345007661598643e-10 | ||||||
|  | 1,3.582672964406964e-07,8.554802579711129e-11 | ||||||
|  | 2,5.174953110822109e-07,1.2476289414924814e-10 | ||||||
|  | 3,3.1845777742391393e-07,8.147850636202276e-11 | ||||||
|  | 4,4.776857897651456e-07,1.5683132697931042e-10 | ||||||
| 
 | 
| @@ -1,96 +1,97 @@ | |||||||
| 0.001,0.0007537739940510926,0.0005921033539224395,0.000384643453726324,0.00024710943492700773,0.00015765779381207088,0.00010015276356884663,6.345008665672524e-05,4.012925332336102e-05,2.535268958174273e-05 | 0 km,7 km,10 km,20 km,30 km,40 km,50 km,60 km,70 km,80 km | ||||||
| 0.001,0.0007532443480762404,0.0005915606741358828,0.00038408573214392957,0.00024666764094038643,0.00015734224135307426,9.993879038586218e-05,6.330912140259024e-05,4.003794165686942e-05,2.529414108865862e-05 | 0.001,0.0007539177767305848,0.0005922648034750569,0.00038490617279658137,0.000247392320543982,0.00015791555306607623,0.0001003671566373715,6.361853747449743e-05,4.0256607010916584e-05,2.5446360651215025e-05 | ||||||
| 0.001,0.0007527148738848327,0.0005910183036445593,0.0003835286706438232,0.0002462265418760313,0.00015702726304657165,9.972523988324127e-05,6.316844848796591e-05,3.994682503096186e-05,2.5235719950422228e-05 | 0.001,0.0007533902419958185,0.0005917244917926066,0.0003843504806873478,0.0002469518485683003,0.0001576007478372822,0.00010015356028336005,6.347773727057954e-05,4.016534974386181e-05,2.5387814123899557e-05 | ||||||
| 0.001,0.0007521855703345118,0.0005904762413907948,0.00038297226807207136,0.0002457861365766504,0.00015671285789580896,9.9512111295817e-05,6.302806736731544e-05,3.985590307420444e-05,2.5177425921282973e-05 | 0.001,0.0007528628792251897,0.0005911844879166931,0.0003837954443648265,0.0002465120671477305,0.00015728651344926157,9.994038442151031e-05,6.333722806950528e-05,4.007428674216739e-05,2.5329394519652018e-05 | ||||||
| 0.001,0.0007516564362539944,0.0005899344862777934,0.00038241652320864807,0.0002453464238190796,0.00015639902485083639,9.929940381972637e-05,6.288797746852316e-05,3.976517539750482e-05,2.511925874398998e-05 | 0.001,0.0007523356872805944,0.0005906447907925071,0.0003832410626787123,0.0002460729751307637,0.00015697284891103737,9.972762829117227e-05,6.319700932883725e-05,3.9983417636365086e-05,2.5271101593906498e-05 | ||||||
| 0.001,0.0007511274704431355,0.0005893930371697809,0.0003818614347679428,0.0002449074023149522,0.00015608576280913723,9.908711661290977e-05,6.27481781932559e-05,3.967464159435973e-05,2.5061218149955632e-05 | 0.001,0.0007518086649950493,0.0005901053993262767,0.0003826873344129807,0.000245634571300401,0.00015665975317873245,9.95152910932062e-05,6.305708047968383e-05,3.9892742039402306e-05,2.5212935090640287e-05 | ||||||
| 0.001,0.0007505986716729718,0.0005888518928921378,0.00038130700139925517,0.0002444690707113658,0.00015577307061625246,9.887524879560432e-05,6.260866891731864e-05,3.958430124109855e-05,2.5003303859417958e-05 | 0.001,0.0007512818111727442,0.0005895663123854124,0.00038213425828639575,0.0002451968543747938,0.0001563472251561599,9.930337199043154e-05,6.291744092702573e-05,3.980225954686196e-05,2.5154894742516358e-05 | ||||||
| 0.001,0.0007500678710880661,0.0005883088511431218,0.000380751009486411,0.0002440296996901373,0.00015545972380501664,9.866297459432463e-05,6.246890748950651e-05,3.949380391318895e-05,2.4945291488462056e-05 | 0.001,0.0007507551245890757,0.0005890275287986403,0.0003815818329529933,0.00024475982300791935,0.00015603526369546326,9.909187010814736e-05,6.277809005009466e-05,3.9711969737226656e-05,2.5096980271060998e-05 | ||||||
| 0.001,0.0007495350705096461,0.0005877639154939723,0.000380193466563788,0.00024358929686534952,0.00015514572847430736,9.8450298405315e-05,6.232889690863924e-05,3.9403151593579556e-05,2.4887182324516918e-05 | 0.001,0.0007502264452226824,0.0005884868559085152,0.00038102785262825065,0.00024432175277214066,0.00015572264698517112,9.88799609470651e-05,6.26384862087587e-05,3.9621522312922004e-05,2.5038967246912867e-05 | ||||||
| 0.001,0.0007490002717484986,0.0005872170894971442,0.00037963438011605534,0.00024314786979147204,0.00015483109067004745,9.823722458416644e-05,6.218864014470764e-05,3.931234624568946e-05,2.4828977642138712e-05 | 0.001,0.000749695774901522,0.0005879442972710813,0.00038047232480109013,0.00024388265123925605,0.00015540938109456906,9.866764888521257e-05,6.249863239143498e-05,3.953091925128679e-05,2.498085695464162e-05 | ||||||
| 0.001,0.0007484634766050366,0.000586668376686434,0.0003790737575785661,0.00024270542596389042,0.0001545158163857142,9.802375744622405e-05,6.204814013916893e-05,3.9221389813611975e-05,2.4770678703146694e-05 | 0.001,0.0007491631154430714,0.0005873998564236413,0.00037991525691100856,0.00024344252592185564,0.00015509547204033507,9.845493826021018e-05,6.235853155787194e-05,3.944016251022327e-05,2.4922650665997884e-05 | ||||||
| 0.001,0.0007479199274773811,0.0005861128912299699,0.0003785065486556895,0.00024225795000622747,0.0001541970308568484,9.780794472023814e-05,6.190610951865765e-05,3.9129447888412384e-05,2.471175028700643e-05 | 0.001,0.0007486284686543365,0.0005868535368848297,0.00037935665634847824,0.00024300138427382333,0.00015478092578703268,9.824183336966692e-05,6.2218186639435e-05,3.9349254028404254e-05,2.4864349640052216e-05 | ||||||
| 0.001,0.0007473696306726699,0.0005855506450602122,0.0003779327791658341,0.00024180546890527417,0.0001538747562360148,9.758980264023896e-05,6.176255947727244e-05,3.903652792388679e-05,2.4652197254708885e-05 | 0.001,0.0007480870957031576,0.000586300474032492,0.00037879149123861057,0.0002425552230413961,0.00015446287448415177,9.80263854642033e-05,6.207631182945079e-05,3.925735993392708e-05,2.4805418700342044e-05 | ||||||
| 0.001,0.0007468125926679213,0.0005849816503235855,0.0003773524752207052,0.00024134800990073543,0.00015354901486124996,9.736934756691086e-05,6.161750129261558e-05,3.8942637427869684e-05,2.459202450185328e-05 | 0.001,0.0007475390029192987,0.0005857406797529387,0.0003782197872436036,0.00024210406905347345,0.00015414134016629157,9.780861070114894e-05,6.193291827596257e-05,3.9164487654400794e-05,2.4745862693628148e-05 | ||||||
| 0.001,0.0007462488201102061,0.0005844059193804029,0.00037676566322402907,0.00024088560048334876,0.0001532198292542639,9.714659598616437e-05,6.147094632476142e-05,3.884778396152801e-05,2.4531236958179027e-05 | 0.001,0.0007469841968019674,0.0005851741661454001,0.0003776415703174324,0.00024164794939077438,0.0001538163450528885,9.758852536415706e-05,6.178801721036571e-05,3.907064467141267e-05,2.4685686501265697e-05 | ||||||
| 0.001,0.0007456783198168171,0.0005838234648047683,0.00037617236987025305,0.00024041826839299018,0.00015288722211863548,9.692156450770277e-05,6.132290601522212e-05,3.875197513865345e-05,2.4469839587096592e-05 | 0.001,0.0007464226840200367,0.0005846009455219824,0.00037705686670463337,0.0002411868913840224,0.0001534879115464833,9.736614586183658e-05,6.164161994641891e-05,3.897583851984993e-05,2.462489503874857e-05 | ||||||
| 0.001,0.0007451010987754332,0.0005832342993844907,0.0003755726221432343,0.0002399460416167659,0.00015255121633799497,9.66942698635831e-05,6.11733918859104e-05,3.8655218624953314e-05,2.4407837385217267e-05 | 0.001,0.0007458544714121565,0.0005840210304075477,0.00037646570293897594,0.00024072092261200308,0.00015315606223087128,9.714148872627883e-05,6.149373787917076e-05,3.888007678716513e-05,2.45634932552282e-05 | ||||||
| 0.001,0.0007445173992825126,0.0005826386743528757,0.00037496668540476865,0.00023946913369259697,0.00015221196586566552,9.646481704279825e-05,6.102247334575324e-05,3.85575594785277e-05,2.4345259282747418e-05 | 0.001,0.0007452795659868886,0.0005834344335395587,0.00037586810584214404,0.0002402500708997022,0.000152820819869329,9.691457061165131e-05,6.134438248396139e-05,3.878336711269497e-05,2.450148613305654e-05 | ||||||
| 0.001,0.0007439272282773631,0.0005820366023339485,0.0003743545861363169,0.00023898757201912962,0.00015186949307274757,9.623322238874437e-05,6.0870161643097905e-05,3.845900518061352e-05,2.4282110155051444e-05 | 0.001,0.0007446982091229053,0.0005828414050804809,0.00037526433980072227,0.0002397745491251193,0.0001524823380310375,9.668549630724793e-05,6.119362307821724e-05,3.868575452092861e-05,2.4438902597094615e-05 | ||||||
| 0.001,0.0007433305928659832,0.0005814280961601982,0.00037373635109929905,0.0002385013842326201,0.0001515238205025659,9.599950236146117e-05,6.071646810276464e-05,3.835956326175255e-05,2.4218394908993806e-05 | 0.001,0.0007441104077793266,0.0005822419576041865,0.000374654431136991,0.00023929438452844706,0.0001521406389697796,9.645428208068799e-05,6.10414708650461e-05,3.858724646752558e-05,2.4375747508899864e-05 | ||||||
| 0.001,0.0007427275003211868,0.0005808131688724332,0.0003731120073337174,0.00023801059820498021,0.0001511749708688244,9.576367353617374e-05,6.05614041249978e-05,3.825924130107498e-05,2.4154118482464792e-05 | 0.001,0.0007435161690815189,0.0005816361038919765,0.0003740384064517259,0.00023880960458647735,0.00015179574511101,9.622094431596755e-05,6.0887937123913e-05,3.848785045741014e-05,2.4312025761525238e-05 | ||||||
| 0.001,0.0007421180800523362,0.0005801919587229117,0.00037248171070273063,0.0002375153439047009,0.00015082303982525373,9.55258019540184e-05,6.0405013700224733e-05,3.815806798909622e-05,2.4089299350133826e-05 | 0.001,0.0007429155003212045,0.0005810238569324259,0.0003734162926228523,0.00023832023701067176,0.00015144767905002232,9.598549951201614e-05,6.073303320960556e-05,3.83875740440667e-05,2.42477422790523e-05 | ||||||
| 0.001,0.0007415023395254894,0.0005795644789202474,0.00037184548827748576,0.0002370156491221818,0.00015046804996987382,9.528590408468248e-05,6.0247308147258e-05,3.8056050847170796e-05,2.4023942410771268e-05 | 0.001,0.0007423085305088799,0.0005804053544492479,0.00037278824495395505,0.0002378264113599139,0.00015109653618969462,9.574801357389848e-05,6.057680304696976e-05,3.828644589147927e-05,2.4182915529390252e-05 | ||||||
| 0.001,0.0007408802863797739,0.000578930742889133,0.00037120336741830446,0.00023651154189285886,0.00015011002407818366,9.504399651802114e-05,6.008829886368558e-05,3.7953197447440844e-05,2.395805259559495e-05 | 0.001,0.0007416952671281527,0.0005797806095975203,0.0003721542903540935,0.000237328155265129,0.00015074233901078615,9.550850289594038e-05,6.041925791001213e-05,3.8184473495775654e-05,2.411755039775751e-05 | ||||||
| 0.001,0.0007402519284274773,0.00057829076427012,0.0003705553757730914,0.00023600305049498863,0.0001497489851010917,9.480009596242987e-05,5.992799732470356e-05,3.784951541204015e-05,2.389163486774317e-05 | 0.001,0.0007410757178351933,0.0005791496357472955,0.0003715144560199718,0.00023682549660121693,0.00015038511017095082,9.526698399235154e-05,6.026040915139781e-05,3.8081664403831414e-05,2.4051651801815565e-05 | ||||||
| 0.001,0.0007396172736541335,0.0005776445569193926,0.0003699015412757306,0.000235490203447419,0.00014938495616282697,9.455421924320194e-05,5.976641508193571e-05,3.774501241228877e-05,2.38246942217421e-05 | 0.001,0.0007404498904588522,0.0005785124464833875,0.0003708687694343879,0.00023631846348487102,0.00015002487250269267,9.502347349561174e-05,6.0100268201280124e-05,3.797802621247342e-05,2.3985224691142176e-05 | ||||||
| 0.001,0.0007389763302186035,0.0005769921349085269,0.00036924189214444916,0.00023497302950733012,0.00014901796055883247,9.4306383300876e-05,5.960356376224896e-05,3.763969616788547e-05,2.37572356829714e-05 | 0.001,0.000739817793000736,0.0005778690556051271,0.0003702172583646133,0.00023580708427235972,0.00014966164901128063,9.477798815483971e-05,5.9938846566140114e-05,3.787356656768574e-05,2.3918274046705576e-05 | ||||||
| 0.001,0.000738329973009011,0.0005763343882557762,0.00036857732657886674,0.00023445223185895243,0.00014864849677321228,9.40569245366171e-05,5.943966431343476e-05,3.753370952478887e-05,2.3689350732036766e-05 | 0.001,0.0007391794336352683,0.0005772194771261406,0.00036955995086080306,0.00023529138755728292,0.00014929546287266413,9.453054483414699e-05,5.977615582759686e-05,3.776829316380097e-05,2.385080488032797e-05 | ||||||
| 0.001,0.0007376782088319843,0.0005756713289449496,0.0003679078688863157,0.00023392783529630037,0.00014827658488585004,9.38058575472753e-05,5.927472675087035e-05,3.7427059131368685e-05,2.362104369630353e-05 | 0.001,0.0007385356837401969,0.0005765645972068202,0.00036889774196575574,0.0002347720745464529,0.00014892681149659162,9.42814794200372e-05,5.9612416728092556e-05,3.7662348796962334e-05,2.378290869241134e-05 | ||||||
| 0.001,0.0007370210446325295,0.0005750029691304239,0.000367233543593211,0.00023339986479263558,0.00014790224510292775,9.355319701349314e-05,5.910876114408311e-05,3.7319751670569666e-05,2.3552318925085614e-05 | 0.001,0.0007378865501365786,0.0005759044277808471,0.0003682306558404449,0.0002342491698918279,0.00014855571485941296,9.403080644324396e-05,5.944763924389705e-05,3.755574009362634e-05,2.371458979861065e-05 | ||||||
| 0.001,0.0007363584874940915,0.0005743293211369546,0.0003665543754437431,0.00023286834549865966,0.00014752549775524457,9.329895769838934e-05,5.8941777615809794e-05,3.721179385927125e-05,2.348318078922229e-05 | 0.001,0.0007372320397833855,0.0005752389809515306,0.00036755871686373843,0.00023372269842386576,0.0001481821930634036,9.377854051813779e-05,5.92818334053861e-05,3.74484737148236e-05,2.364585253654512e-05 | ||||||
| 0.001,0.0007356906659117175,0.0005736505214206793,0.00036587051603697917,0.00023233340267585003,0.00014714643450378646,9.30432026577021e-05,5.8773818072131705e-05,3.710321298927822e-05,2.3413646846771747e-05 | 0.001,0.0007365721597776102,0.0005745682689916729,0.0003668819496311701,0.00023319268514975972,0.00014780626633511263,9.352469634142839e-05,5.911500929610015e-05,3.734055635551828e-05,2.35767012653732e-05 | ||||||
| 0.001,0.0007350175870680764,0.0005729665823498456,0.00036518198995355594,0.00023179506120909636,0.00014676507541963834,9.278594644638945e-05,5.8604892484780656e-05,3.699401567385024e-05,2.3343721399750524e-05 | 0.001,0.0007359070382096695,0.0005738924278329212,0.00036620050520582223,0.0002326592549483615,0.00014742802610623578,9.326933684741753e-05,5.8947208765596136e-05,3.723201528626343e-05,2.3507153539330125e-05 | ||||||
| 0.001,0.000734339258284937,0.0005722775164633901,0.0003644888219905243,0.00023125334615855053,0.0001463814406964208,9.252720370024704e-05,5.8435010877524154e-05,3.688420855938328e-05,2.327340877117354e-05 | 0.001,0.0007352366822744919,0.0005732114697907263,0.0003655144080205807,0.0002321224325628545,0.00014704749234532768,9.30124765259338e-05,5.877844174725213e-05,3.712285709891949e-05,2.3437213649054356e-05 | ||||||
| 0.001,0.0007336556870231954,0.0005715833364706749,0.00036379103715988533,0.00023070828275766533,0.00014599555064848363,9.226698913450141e-05,5.82641833251609e-05,3.677379832472749e-05,2.320271330460301e-05 | 0.001,0.0007345610993055855,0.0005725254073502257,0.0003648236827235576,0.00023158224291094424,0.00014666468514311576,9.275412994749425e-05,5.860871822644595e-05,3.701308841848994e-05,2.336688590620212e-05 | ||||||
| 0.001,0.0007329668808828947,0.0005708840552512191,0.00036308866068712113,0.00023015989641122435,0.00014560742570909416,9.200531754239911e-05,5.8092419952513674e-05,3.666279168050168e-05,2.313163936369656e-05 | 0.001,0.0007338802967751745,0.0005718342531661053,0.0003641283541767086,0.00023103871108296522,0.00014627962471074844,9.249431176193324e-05,5.843804823954878e-05,3.690271590243443e-05,2.32961746429929e-05 | ||||||
| 0.001,0.000732272847603227,0.0005701796858544125,0.000362381718009681,0.0002296082126933358,0.00014521708642859763,9.174220379377606e-05,5.791973093340874e-05,3.6551195368400524e-05,2.3060191331749373e-05 | 0.001,0.0007331942822941306,0.0005711380200622195,0.000363428447454292,0.00023049186233985435,0.00014589233137793237,9.223303669696582e-05,5.826644187292669e-05,3.679174623998899e-05,2.3225084211761806e-05 | ||||||
| 0.001,0.0007315751779154508,0.0005694718366517781,0.00036167180797618383,0.00022905447155647377,0.00014482540661409508,9.147823538482221e-05,5.774650123146614e-05,3.643925790598459e-05,2.2988528215049473e-05 | 0.001,0.0007325030636119942,0.000570436721031382,0.0003627239878414387,0.00022994172211121704,0.00014550282559116622,9.197031955679165e-05,5.809390926192732e-05,3.66801861514784e-05,2.3153618984504423e-05 | ||||||
| 0.001,0.0007308738763564251,0.0005687605159526348,0.00036095894758939165,0.00022849869020493823,0.00014443240010265552,9.121342232553745e-05,5.7572737692798364e-05,3.6326983828340116e-05,2.2916652961499898e-05 | 0.001,0.0007318082249846354,0.000569731957456593,0.0003620165686744435,0.0002293895269980944,0.0001451119793900387,9.170674702405544e-05,5.792083507086079e-05,3.656828410642266e-05,2.3081938026911105e-05 | ||||||
| 0.001,0.0007301689475478705,0.0005680457321686527,0.00036024315397386176,0.00022794088593578913,0.00014403808079282816,9.094777466478586e-05,5.739844718775089e-05,3.6214377685641065e-05,2.2844568528419092e-05 | 0.001,0.0007311097709589727,0.0005690237376093709,0.0003613062068501535,0.00022883529410468975,0.00014471980653999792,9.14423290636205e-05,5.774722611940683e-05,3.6456044625219865e-05,2.3010044279099164e-05 | ||||||
| 0.001,0.0007294603961963875,0.0005673274938137002,0.0003595244443750873,0.00022738107613769066,0.00014364246264358423,9.068130248947494e-05,5.72236366103174e-05,3.610144404275241e-05,2.2772277882278848e-05 | 0.001,0.0007304077061664716,0.0005683120698629669,0.00036059291938656614,0.00022827904062761942,0.00014432632086784533,9.117707567918865e-05,5.757308925149413e-05,3.6343472243382366e-05,2.293794069062729e-05 | ||||||
| 0.001,0.0007287502876018436,0.0005666079096289159,0.00035880496633647314,0.00022682095171468864,0.00014324674865159545,9.041481948469436e-05,5.7048841153261715e-05,3.598852922211342e-05,2.270000293927642e-05 | 0.001,0.0007297020353231152,0.0005675969626922158,0.0003598767234219355,0.00022772078385475435,0.00014393153626068395,9.091099691249356e-05,5.739843133472259e-05,3.6230571511141116e-05,2.2865630220232028e-05 | ||||||
| 0.001,0.0007280386231103084,0.0005658869826353605,0.0003580847262718071,0.00022626051891339797,0.00014285094367250402,9.014832907727154e-05,5.687406312117876e-05,3.587563473352017e-05,2.2627744673782604e-05 | 0.001,0.0007289948155254126,0.0005668805157203741,0.00035915975887038315,0.00022716220982550104,0.00014353665302637602,9.064490513205597e-05,5.722378701487135e-05,3.611768859725593e-05,2.279333481077374e-05 | ||||||
| 0.001,0.0007273254041056322,0.0005651647158992671,0.00035736373064750184,0.00022569978402038908,0.00014245505258865028,8.988183471111395e-05,5.669930482943582e-05,3.5762762093538084e-05,2.2555504064421286e-05 | 0.001,0.0007282860481242219,0.0005661627319510184,0.0003584420321019746,0.00022660332474955334,0.0001431416759965279,9.037880375071969e-05,5.7049158588914064e-05,3.6004825007582225e-05,2.2721055434706506e-05 | ||||||
| 0.001,0.0007266106320094578,0.0005644411125319691,0.00035664198598218,0.00022513875336164715,0.0001420590803085807,8.961533984682783e-05,5.652456860390248e-05,3.564991282531874e-05,2.2483282093948716e-05 | 0.001,0.0007275757345080665,0.0005654436144326382,0.00035772354953912867,0.0002260441348764214,0.00014274661002939483,9.011269619839399e-05,5.687454836459578e-05,3.5891982254752056e-05,2.2648793068745655e-05 | ||||||
| 0.001,0.000725894308281204,0.0005637161756897977,0.0003559194988462394,0.00022457743330201225,0.00014166303176654256,8.934884796133105e-05,5.634985678067539e-05,3.5537088458413665e-05,2.2411079749130865e-05 | 0.001,0.0007268638761030398,0.0005647231662585116,0.0003570043176561602,0.0002254846464948739,0.0001423514600093734,8.984658592167178e-05,5.6699958660169715e-05,3.5779161857992474e-05,2.2576548693746487e-05 | ||||||
| 0.001,0.0007251764344180624,0.0005629899085739927,0.00035519627586142176,0.0002240158302446243,0.00014126691192198565,8.90823625474685e-05,5.6175171705805915e-05,3.542429052859005e-05,2.233889802062196e-05 | 0.001,0.0007261504743729061,0.0005640013905666712,0.00035628434297892044,0.0002249248659324104,0.00014195623084652692,8.958047638345721e-05,5.652539180412445e-05,3.5666365342942064e-05,2.250432329458613e-05 | ||||||
| 0.001,0.0007244588135748975,0.0005622641246704724,0.00035447409591105305,0.0002234553120905153,0.00014087167955905718,8.881652603390643e-05,5.600093342830372e-05,3.531178983274928e-05,2.2266910019981595e-05 | 0.001,0.0007254355308190145,0.0005632782905397587,0.00035556363208430486,0.00022436479955468554,0.0001415609274760624,8.931437106256734e-05,5.635085013490999e-05,3.5553594241465086e-05,2.2432117860037706e-05 | ||||||
| 0.001,0.000723741443178776,0.000561538821268995,0.0003537529553873339,0.00022289587522719752,0.00014047733166655684,8.855133617099835e-05,5.5827140373801375e-05,3.519958531186087e-05,2.219511505192651e-05 | 0.001,0.0007247208411865314,0.0005625556717890254,0.0003548439578507697,0.00022380581171795803,0.00014116650687104502,8.904891159204534e-05,5.61767534392646e-05,3.544111934056619e-05,2.2360105593797506e-05 | ||||||
| 0.001,0.0007230243206833482,0.0005608139956950427,0.00035303285074046774,0.00022233751609917817,0.00014008386527925162,8.82867907426191e-05,5.565379099102327e-05,3.508767592227262e-05,2.212351243120618e-05 | 0.001,0.00072400640290786,0.000561833531609933,0.00035412531668185007,0.00022324789882467925,0.00014077296603347102,8.878409573173543e-05,5.600310014889176e-05,3.5328939584811035e-05,2.228828580259237e-05 | ||||||
| 0.001,0.0007223074435688039,0.0005600896453097011,0.0003523137784782074,0.00022178023120736695,0.00013969127747733319,8.802288756574066e-05,5.5480883751481105e-05,3.4976060635503277e-05,2.2052101482465692e-05 | 0.001,0.0007232922134419361,0.000561111867333509,0.00035340770503880037,0.00022269105733400152,0.00014038030201108317,8.8519921274859e-05,5.5829888718494674e-05,3.521705393409239e-05,2.221665780315407e-05 | ||||||
| 0.001,0.0007215926247557181,0.0005593676122940626,0.00035159759247597197,0.00022122546934306127,0.00013930059415776796,8.776031848020719e-05,5.5308872854303e-05,3.486503301641155e-05,2.198107017600086e-05 | 0.001,0.0007225782702742098,0.0005603906763262448,0.0003526911194401051,0.00022213528376118449,0.00013998851189683077,8.825638604758897e-05,5.5657117625479614e-05,3.510546136342301e-05,2.214522092208301e-05 | ||||||
| 0.001,0.0007208798585848073,0.0005586478889723664,0.0003508842795507963,0.0002206732171528304,0.00013891180440309996,8.749907547557891e-05,5.513775276548628e-05,3.475458937431628e-05,2.1910416102241813e-05 | 0.001,0.0007218663790349207,0.0005596717927826706,0.0003519774072686018,0.00022158202285215626,0.0001395986194011808,8.79941808494171e-05,5.5485240659247415e-05,3.499445534348073e-05,2.207416317565271e-05 | ||||||
| 0.001,0.0007201691394257483,0.000557930467712979,0.00035017382661216696,0.00022012346138632064,0.00013852489738482468,8.723915060881119e-05,5.49675179985075e-05,3.464472605058592e-05,2.184013687270143e-05 | 0.001,0.0007211565340671307,0.000558955209053062,0.0003512665554090523,0.0002210312613239567,0.0001392106136609281,8.773329770591506e-05,5.531425230770577e-05,3.4884032196140665e-05,2.200348216114185e-05 | ||||||
| 0.001,0.0007194604616770773,0.00055721534092818,0.00034946622066134466,0.00021957618889536463,0.00013813986236255893,8.698053600359808e-05,5.4798163113848986e-05,3.453543941831367e-05,2.177023011975932e-05 | 0.001,0.0007204487297429265,0.0005582409175317231,0.00035055855083818805,0.00022048298599609717,0.00013882448390129787,8.747372870968443e-05,5.514414710600884e-05,3.477418827518741e-05,2.1933175496831414e-05 | ||||||
| 0.001,0.0007187538197660722,0.0005565025010739346,0.00034876144879066544,0.00021903138663308575,0.0001377566886832086,8.672322384971475e-05,5.462968271852315e-05,3.442672588199151e-05,2.1700693496445714e-05 | 0.001,0.0007197429604633029,0.0005575289106567639,0.00034985338062403464,0.00021993718378969884,0.00013844021943515845,8.721546601972457e-05,5.497491963609735e-05,3.466491996599965e-05,2.1863240821795316e-05 | ||||||
| 0.001,0.0007180492081486484,0.0005557919406496801,0.00034805949818288173,0.0002184890416530366,0.00013737536578016266,8.646720640237894e-05,5.446207146561145e-05,3.431858187719449e-05,2.1631524676231647e-05 | 0.001,0.0007190392206580874,0.0005568191809099186,0.0003491510319252488,0.00021939384172660586,0.00013805780966217872,8.695850186076947e-05,5.480656452622117e-05,3.455622368522282e-05,2.1793675795681418e-05 | ||||||
| 0.001,0.000717348639431565,0.0005550856739198547,0.00034736232071304855,0.00021795064331956514,0.00013699693247692832,8.621317757037385e-05,5.429578217858938e-05,3.421129897003673e-05,2.1562909902755936e-05 | 0.001,0.0007183375047857581,0.0005561117208162645,0.0003484514919904163,0.00021885294692850114,0.00013767724406801954,8.670282852265318e-05,5.463907645048003e-05,3.444809588045186e-05,2.172447809850241e-05 | ||||||
| 0.001,0.0007166521035756881,0.0005543836868927082,0.0003466698924934393,0.00021741616794755068,0.00013662136971116798,8.596112351100096e-05,5.413080535731451e-05,3.410487085131832e-05,2.1494845067789903e-05 | 0.001,0.0007176398171146462,0.0005554085359032386,0.00034775670623974134,0.0002183159850558065,0.00013729955964329822,8.644913914890404e-05,5.447290801376681e-05,3.4340828149382966e-05,2.165583410030806e-05 | ||||||
| 0.001,0.0007159595906065037,0.0005536859656730149,0.00034598218983055497,0.0002168855920630381,0.0001362486585998701,8.571103051605296e-05,5.396713159578493e-05,3.399929127512844e-05,2.142732610463052e-05 | 0.001,0.0007169461476104001,0.0005547096122322624,0.0003470666509123452,0.00021778293254731739,0.00013692473741724035,8.61974199558567e-05,5.430804975101775e-05,3.423441420247442e-05,2.15877397033261e-05 | ||||||
| 0.001,0.0007152710906138687,0.0005529924964615861,0.00034529918922366796,0.00021635889240138666,0.0001358787804376394,8.546288501047042e-05,5.380475158117202e-05,3.389455405818364e-05,2.1360348987661796e-05 | 0.001,0.0007162564863033777,0.0005540149359610161,0.00034638130244054916,0.00021725376605180745,0.00013655275859741984,8.594765729366703e-05,5.4144492290891566e-05,3.412884781322755e-05,2.152019085117201e-05 | ||||||
| 0.001,0.0007145881681833736,0.0005523048607339887,0.0003446224616264519,0.00021583728670966556,0.00013551259312919557,8.521726369129195e-05,5.364404315662281e-05,3.379090310339315e-05,2.129406976339983e-05 | 0.001,0.0007155708232884887,0.0005533244933430584,0.0003457006374485156,0.00021672846242622396,0.00013618360456808432,8.569983764497563e-05,5.3982226354801364e-05,3.40241228175218e-05,2.1453183528407172e-05 | ||||||
| 0.001,0.0007139108109389651,0.0005516230407004492,0.0003439519758859039,0.00021532074399295122,0.00013515007172518374,8.497414844816332e-05,5.3484993898260945e-05,3.368833016244125e-05,2.122848306212633e-05 | 0.001,0.0007148907167777357,0.0005526398589811358,0.0003450262214786548,0.00021620823613271921,0.00013581813150424676,8.545453691240582e-05,5.3821629494988794e-05,3.392048307301558e-05,2.1386873841072776e-05 | ||||||
| 0.001,0.0007132390066148024,0.0005509470187317473,0.00034328770115903844,0.00021480923358720733,0.0001347911915544671,8.473352137819455e-05,5.3327591526929936e-05,3.358682708410006e-05,2.1163583577742056e-05 | 0.001,0.0007142161543980302,0.0005519610151552632,0.0003443580235484482,0.00021569305634208547,0.00013545631457844443,8.521173706397784e-05,5.366268933409295e-05,3.381792035746172e-05,2.1321256433336487e-05 | ||||||
| 0.001,0.0007125727430549207,0.0005502767773585094,0.000342629606910633,0.00021430272515636744,0.0001344359282214269,8.449536478383494e-05,5.317182390666476e-05,3.348638581318404e-05,2.109936606707349e-05 | 0.001,0.0007135471238866448,0.0005512879443055973,0.0003436960129838173,0.0002151828925541902,0.0001350981292399717,8.497142027417112e-05,5.350539363884576e-05,3.371642654533412e-05,2.1256326012778444e-05 | ||||||
| 0.001,0.0007119120082129148,0.0005496122992705212,0.0003419776629110174,0.0002138011886894788,0.00013408425760331254,8.425966117078749e-05,5.3017679043188334e-05,3.3386998389521964e-05,2.1035825349191292e-05 | 0.001,0.0007128836130908273,0.0005506206290316834,0.00034304015941680915,0.00021467771459500972,0.00013474355121214092,8.473356892178238e-05,5.3349730318534455e-05,3.361599360677474e-05,2.1192077349695405e-05 | ||||||
| 0.001,0.000711256790151613,0.0005489535673160376,0.0003413318392338714,0.00021330459449785352,0.00013373615584760944,8.40263932459383e-05,5.286514508242194e-05,3.3288656946938245e-05,2.0972956304734848e-05 | 0.001,0.0007122256099675188,0.0005499590520918091,0.0003423904327834519,0.00021417749261385993,0.00013439255648970008,8.449816558787534e-05,5.319568742351694e-05,3.35166136065783e-05,2.1128505276425763e-05 | ||||||
| 0.001,0.0007106071943639499,0.0005483006816957998,0.00034069221933208274,0.0002128129992904075,0.00013339165932644894,8.379558393280961e-05,5.271423641048183e-05,3.31913705135711e-05,2.091076460544407e-05 | 0.001,0.0007115731025829938,0.0005493031964022937,0.0003417468033215544,0.0002136821970805245,0.000134045121336186,8.426519305371512e-05,5.304325314373989e-05,3.341827870317759e-05,2.106560468667675e-05 | ||||||
| 0.001,0.000709963208882901,0.0005476536252143895,0.0003400587732671483,0.0002123263734210078,0.00013305074425072359,8.356721599784782e-05,5.256494122003263e-05,3.3095131256746724e-05,2.0849245154782437e-05 | 0.001,0.0007109261960066054,0.0005486531617838624,0.0003411093543337103,0.00021319188469384628,0.00013370128216574169,8.403467429429362e-05,5.289244191063335e-05,3.3320997960119286e-05,2.1003381278303992e-05 | ||||||
| 0.001,0.0007093248218486061,0.0005470123808316875,0.00033943147139689077,0.0002118446875576196,0.00013271338709432742,8.334127240311385e-05,5.241724783997488e-05,3.299993143509595e-05,2.0788392916005465e-05 | 0.001,0.0007102848782749661,0.0005480089311096272,0.00034047805604549785,0.00021270652596543237,0.00013336101530442401,8.380659214968773e-05,5.274324196034732e-05,3.3224763568979684e-05,2.0941829967612013e-05 | ||||||
| 0.001,0.0007086920215080653,0.0005463769316622218,0.0003388102843733889,0.00021136791267964032,0.0001323795645916927,8.311773630434548e-05,5.2271144734051514e-05,3.290576339760186e-05,2.07282029115292e-05 | 0.001,0.0007096491375319776,0.0005473704874075498,0.00033985287897724074,0.00021222609171923644,0.00013302429733989257,8.358092965463258e-05,5.25956416646764e-05,3.312956781229619e-05,2.088094573050621e-05 | ||||||
| 0.001,0.0007080656480431051,0.0005457481216341828,0.0003381960373995552,0.00021089668206097172,0.0001320497200486003,8.289690449717853e-05,5.2126825862102536e-05,3.2812752146082854e-05,2.0668755034757233e-05 | 0.001,0.0007090189620285115,0.0005467378138598193,0.00033923379394201156,0.00021175055308892372,0.0001326911051189623,8.335767003660405e-05,5.244962952967474e-05,3.3035403062615115e-05,2.0820723601860106e-05 | ||||||
| 0.001,0.0007074456886869565,0.0005451259321489777,0.0003375886977799707,0.0002104309633113142,0.00013172382748945162,8.26787581753205e-05,5.198427834496719e-05,3.2720889139431744e-05,2.061004372929991e-05 | 0.001,0.0007083951884833238,0.0005461117507284293,0.0003386216233705354,0.00021128054172409337,0.00013236188112429926,8.31371097341464e-05,5.230539940125761e-05,3.294239432192892e-05,2.076124352066865e-05 | ||||||
| 0.001,0.0007068321308093747,0.0005445103448031184,0.0003369882331820464,0.00020997072442018424,0.00013140186125447996,8.246327876643199e-05,5.18434894660219e-05,3.2630165945308436e-05,2.055206350992823e-05 | 0.001,0.0007077778041323896,0.000545492279490185,0.00033801633474888146,0.00021081602540817874,0.00013203659950671687,8.291923002160208e-05,5.216293844781483e-05,3.285053307562121e-05,2.0702499944560498e-05 | ||||||
| 0.001,0.0007062249619162967,0.0005439013413874698,0.00033639461163356655,0.00020951593375373114,0.00013108379599680725,8.225044792981545e-05,5.170444666951808e-05,3.254057423900392e-05,2.0494808961820763e-05 | 0.001,0.0007071667963482699,0.0005448793818164008,0.0003374178959240363,0.00021035697230232543,0.00013171523473119512,8.270401240613943e-05,5.202223399957759e-05,3.2759810917439646e-05,2.064448740210184e-05 | ||||||
| 0.001,0.00070562416964951,0.0005432989038865089,0.00033580780152024723,0.000209066560051587,0.00013076960667953474,8.204024755412909e-05,5.156713755893784e-05,3.2452105802317056e-05,2.0438274739819433e-05 | 0.001,0.0007065621526397901,0.000544273039572169,0.0003368262751014692,0.00020990335094223987,0.0001313977615739679,8.249143862546502e-05,5.188327354697137e-05,3.267021954836586e-05,2.0587200492045967e-05 | ||||||
| 0.001,0.0007050297417863318,0.0005427030144775926,0.0003352277715833316,0.00020862257242375786,0.00013045926857287288,8.183265975513502e-05,5.143154989537623e-05,3.236475252244954e-05,2.038245556769746e-05 | 0.001,0.0007059638606517004,0.0005436732348155853,0.0003362414408426963,0.00020945513023505862,0.00013108415511962746,8.228149064554578e-05,5.174604473897535e-05,3.258175077549588e-05,2.053063388259103e-05 | ||||||
| 0.001,0.0007044417829621171,0.000542113771820027,0.0003346546023905152,0.00020818402485557293,0.00013015281596227648,8.162770599537212e-05,5.129769708700084e-05,3.227852278867728e-05,2.032735670561579e-05 | 0.001,0.0007053719081643225,0.0005430799497970297,0.00033566336206289793,0.00020901227945626015,0.00013077439075827684,8.20741506583782e-05,5.161053538152209e-05,3.249439651094783e-05,2.047478231065629e-05 | ||||||
| 0.001,0.0007038602809995153,0.0005415311581470623,0.00033408826282687573,0.00020775088664703998,0.00012985022429639665,8.142536853201701e-05,5.116556699709043e-05,3.219340855821242e-05,2.0272972923816322e-05 | 0.001,0.0007047863993885064,0.0005424932828039034,0.0003350921191971394,0.0002085748525953015,0.00013046850282623395,8.186944018288875e-05,5.147675893062123e-05,3.240816518060804e-05,2.0419651063027786e-05 | ||||||
| 0.001,0.0007032852238493367,0.0005409551558747416,0.0003335287221154158,0.00020732312745044945,0.00012955146931603386,8.122562983828357e-05,5.103514763884953e-05,3.2109401888525124e-05,2.0219299058105656e-05 | 0.001,0.0007042073221500205,0.000541913216142546,0.0003345276813035574,0.00020814281911618103,0.00013016646689064054,8.166734155142674e-05,5.134470329367606e-05,3.232304876615549e-05,2.0365234922821375e-05 | ||||||
| 0.001,0.0007027165995902542,0.0005403857476012292,0.00033297594981485264,0.00020690071726752732,0.0001292565270515082,8.102847260135871e-05,5.090642717392409e-05,3.202649493632917e-05,2.0166330009182866e-05 | 0.001,0.0007036346644028755,0.0005413397323015136,0.0003339700177764314,0.00020771614883326046,0.00012986825880927205,8.146783731136239e-05,5.121435652738549e-05,3.2239039349161415e-05,2.0311528738515718e-05 | ||||||
| 0.001,0.0007021546252265139,0.0005398231466905069,0.00033243014325207994,0.00020648380199548492,0.0001289654971719027,8.083396250547584e-05,5.077944809587575e-05,3.194471491165552e-05,2.0114083097018264e-05 | 0.001,0.0007030684142289592,0.0005407728139509093,0.00033341909834398085,0.00020729481190839792,0.00012957385472790145,8.12709102230124e-05,5.1085706836262186e-05,3.215612911007561e-05,2.0258527423278803e-05 | ||||||
| 0.001,0.0007015992888126556,0.0005392673356287205,0.0003318912717105927,0.00020607235137144977,0.0001286783555062261,8.06420820982489e-05,5.065419847368218e-05,3.186405391103787e-05,2.006255318369691e-05 | 0.001,0.0007025087877125606,0.0005402126735385767,0.0003328751197405316,0.00020687895394469412,0.00012928335419699167,8.107662593993734e-05,5.095879672189383e-05,3.2074345280702784e-05,2.0206248321016987e-05 | ||||||
| 0.001,0.0007010505785332368,0.0005387182970867077,0.00033135930481238495,0.00020566633548374424,0.0001283950781739038,8.04528141416734e-05,5.053066652493675e-05,3.1784504130324826e-05,2.001173519622426e-05 | 0.001,0.0007019557729111361,0.0005396592936234858,0.0003323380514212155,0.00020646854484108668,0.0001289967331620245,8.088496708343894e-05,5.083361429641059e-05,3.1993679981452625e-05,2.0154686306347033e-05 | ||||||
| 0.001,0.000700508482702546,0.0005381760139193414,0.00033083421251577956,0.00020526572476908743,0.000128115641582197,8.026614161010359e-05,5.040884061439589e-05,3.170605786368809e-05,1.9961624125869314e-05 | 0.001,0.0007014093580122255,0.0005391126569487217,0.00033180786317787807,0.00020606355484577673,0.00012871396785738722,8.069591648818549e-05,5.071014781993386e-05,3.191412543168724e-05,2.010383631860697e-05 | ||||||
| 0.001,0.0006999729897643184,0.0005376404691648787,0.00033031596511327947,0.00020487049000982136,0.00012784002242364822,8.008204768824872e-05,5.028870925253973e-05,3.1628707502639986e-05,1.9912215027513866e-05 | 0.001,0.0007008695313331482,0.0005385727464408199,0.0003312845251369297,0.00020566395455347188,0.0001284350348038258,8.050945720021523e-05,5.058838569914163e-05,3.1835673948741706e-05,2.0053693361205354e-05 | ||||||
| 0.001,0.0006994440882914515,0.0005371116460443127,0.0003298045332294241,0.0002044806023311588,0.0001275681976735486,7.990051576919067e-05,5.0170261094149856e-05,3.155244553506268e-05,1.9863503019009735e-05 | 0.001,0.0007003362813206957,0.0005380395452091099,0.00033076800775717,0.00020526971490259695,0.00012815991080588224,8.032557247492852e-05,5.046831648582724e-05,3.175831794694013e-05,2.0004252500969603e-05 | ||||||
| 0.001,0.0006989172535560769,0.0005365850419669894,0.000329295612913881,0.00020409280438264766,0.00012729790663346764,7.972004038787022e-05,5.0052515589855926e-05,3.147664135129994e-05,1.9815085586326718e-05 | 0.001,0.0006998095965508554,0.0005375130365450592,0.00033025828182767485,0.00020488080717254625,0.00012788857294937395,8.014424577511121e-05,5.0349928875481843e-05,3.168204993662801e-05,1.9955508867504938e-05 | ||||||
| 0.001,0.0006983924815322933,0.0005360606511477293,0.0003287891938968759,0.00020370708584067882,0.00012702914094133737,7.954061545150935e-05,4.993546855036179e-05,3.140129216611291e-05,1.9766960914662127e-05 | 0.001,0.0006992849713647436,0.000536988737498668,0.0003297510574308719,0.00020449398184933928,0.0001276187643023316,7.996397313508213e-05,5.023224268320585e-05,3.160623916862529e-05,1.9907059627792014e-05 | ||||||
| 0.001,0.0006978697681747856,0.000535538467781285,0.000328285265898271,0.00020332343638453147,0.00012676189224377013,7.936223487646896e-05,4.981911579385119e-05,3.1326395199731696e-05,1.971912719297887e-05 | 0.001,0.0006987624017369506,0.0005364666423066755,0.0003292463243531191,0.00020410922866516542,0.000127350476544274,7.978474848904117e-05,5.011525373583123e-05,3.153088286679667e-05,1.985890297191875e-05 | ||||||
| 0.001,0.0006973491094188342,0.0005350184860423863,0.0003277838186277228,0.0002029418456965422,0.0001264961521961901,7.918489258833681e-05,4.970345314604528e-05,3.125194767789152e-05,1.967158261402843e-05 | 0.001,0.0006982418836227756,0.0005359467451858974,0.000328744072370431,0.00020372653735498857,0.00012708370136324496,7.960656578019794e-05,4.9998957867578574e-05,3.1455978260416835e-05,1.9811037093701456e-05 | ||||||
| 0.001,0.0006968284099289676,0.000534498597351666,0.00032728277956097635,0.00020256071739357045,0.0001262308004979493,7.900783730702533e-05,4.958798911408524e-05,3.1177632631488905e-05,1.9624124503146986e-05 | 0.001,0.0006977234129582083,0.0005354290403332512,0.00032824429124863073,0.00020334589765671668,0.0001268184304559618,7.942941896086744e-05,4.988335092011608e-05,3.138152258420484e-05,1.976346019070644e-05 | ||||||
| 0.001,0.0006963076677967887,0.0005339787996978908,0.00032678214616920946,0.00020218004908417888,0.0001259658352285323,7.883106763041168e-05,4.947272273059253e-05,3.110344941552445e-05,1.957675243920473e-05 | 0.001,0.0006972049031024503,0.0005349114284143175,0.00032774491556384407,0.00020296571741865816,0.00012655354571184963,7.925255773427056e-05,4.976794174339877e-05,3.130719890433304e-05,1.971596949574029e-05 | ||||||
| 0.001,0.0006957868810888677,0.0005334590910383602,0.00032628191587964447,0.00020179983833834103,0.00012570125443876325,7.865458213663353e-05,4.935765301510161e-05,3.102939737649859e-05,1.9529465995615212e-05 | 0.001,0.0006966863521517465,0.000534393907423076,0.000327245942795149,0.00020258599425811892,0.00012628904521745982,7.907598070306232e-05,4.965272937294146e-05,3.123300657741713e-05,1.966856458850977e-05 | ||||||
| 0.001,0.0006952660478468047,0.0005329394692990367,0.0003257820860759608,0.00020142008268794192,0.0001254370561512512,7.847837938443003e-05,4.924277897429975e-05,3.0955475852573814e-05,1.94822647404421e-05 | 0.001,0.000696167758177353,0.0005338764753221901,0.0003267473703778833,0.00020220672575398438,0.00012602492703077633,7.889968645020544e-05,4.95377128311886e-05,3.1158944951577065e-05,1.9621245043263798e-05 | ||||||
| 0.001,0.00069474516608728,0.0005324199323746772,0.00032528265409871067,0.0002010407796272818,0.0001251732383608348,7.830245791348127e-05,4.91280996022673e-05,3.088168417373684e-05,1.943514823650581e-05 | 0.001,0.0006956491192256274,0.0005333591300431401,0.0003262491957040711,0.00020182790944721542,0.00012576118918167348,7.872367353931904e-05,4.942289112776892e-05,3.108501336660957e-05,1.957401042890837e-05 | ||||||
|  | 0.001,0.0006951304333180151,0.0005328418694862771,0.0003257514161227785,0.00020144954284132072,0.00012549782967232552,7.854794051499734e-05,4.9308263259716635e-05,3.1011211154138606e-05,1.9526860309103978e-05 | ||||||
|   | |||||||
| 
 | 
| @@ -1,98 +1,99 @@ | |||||||
| 0.001,0.0007651928200015371,0.0006070713937965498,0.00041423535558437785,0.0002897888610631573,0.00021340907299884933,0.00017198131811953097,0.00016127923791982795,0.00019503601408127412,0.00036549739730595273 | 0 km,7 km,10 km,20 km,30 km,40 km,50 km,60 km,70 km,80 km | ||||||
| 0.001,0.0007645995806173374,0.0006064422887178694,0.00041349144049413134,0.00028906380160320487,0.00021270693331134475,0.0001712438796411692,0.0001603765556252246,0.00019363496213474675,0.00036239423700181427 | 0.001,0.0007654185419972524,0.0006073276056093792,0.0004146475603472041,0.0002902671662170687,0.00021391771777705748,0.0001725335650783217,0.0001619576961300996,0.00019613348481478226,0.00036856555154569 | ||||||
| 0.001,0.0007640065772643761,0.0006058136176614386,0.00041274866023030733,0.0002883403899406645,0.0002120069527025505,0.00017050944162049183,0.000159478716966613,0.00019224364342300643,0.0003593168093314386 | 0.001,0.0007648265274364283,0.0006066999211698721,0.00041390447843586643,0.00028954214777674505,0.00021321488386807227,0.000171794621873672,0.00016105212098646378,0.00019472570335261124,0.00036543839103292923 | ||||||
| 0.001,0.0007634138087852742,0.000605185379478,0.0004120070127662441,0.0002876186224176594,0.00021130912485491145,0.00016977799240843955,0.0001585856969223786,0.00019086199210672448,0.0003562649023666937 | 0.001,0.00076423475082742,0.0006060726714187721,0.00041316253063080743,0.0002888187769396436,0.00021251421079625184,0.0001710586847350929,0.00016015140443848455,0.0001933277019274264,0.0003623371672096105 | ||||||
| 0.001,0.0007628028346998721,0.0006045332187986192,0.0004112166712442958,0.0002868226029691562,0.00021050564591298308,0.0001688917074786142,0.00015743651373617922,0.00018893812235512526,0.0003514029291704815 | 0.001,0.0007636432110143774,0.0006054458552058583,0.0004124217148997164,0.0002880970500399001,0.00021181569222935437,0.00017032574197864756,0.00015925552136261768,0.00019193941431515274,0.0003592616661738057 | ||||||
| 0.001,0.0007621921143131398,0.0006038815297458003,0.00041042762231867933,0.00028602858816935265,0.00020970502628600424,0.00016800982241073787,0.00015629534163924753,0.00018703308452519017,0.00034660591682276115 | 0.001,0.00076303338083269,0.0006047950045143256,0.0004116319711720434,0.0002873006965446473,0.00021101094555209704,0.00016943701776024394,0.00015810165194844262,0.00019000410483730154,0.00035435344277520014 | ||||||
| 0.001,0.0007615816463554626,0.0006032303109890501,0.0004096398633263614,0.0002852365728026657,0.00020890725596775628,0.00016713231600712825,0.00015516212643578583,0.00018514669874176095,0.00034187301148734186 | 0.001,0.0007624238065102939,0.0006041446264165162,0.00041084352013847123,0.0002865063493191246,0.0002102090638489634,0.00016855270795343295,0.00015695583271993784,0.000188087762219128,0.00034951092824224374 | ||||||
| 0.001,0.0007609692265548555,0.000602577299493926,0.0004088509941253184,0.00028444450359523985,0.00020811064471691694,0.00016625772561605027,0.00015403541161623416,0.00018327705284413884,0.00033720006213702974 | 0.001,0.0007618144867783217,0.0006034947195801519,0.00041005635912737644,0.00028571400313117073,0.000209410037075066,0.00016767279125308264,0.000155818009114819,0.0001861902048930817,0.00034473325633896016 | ||||||
| 0.001,0.0007603548574442921,0.0006019224999904981,0.0004080610253035772,0.00028365239238410656,0.0002073152021201705,0.00016538605339556675,0.00015291517504370476,0.00018142402424673905,0.0003325863766610152 | 0.001,0.0007612032230964268,0.0006028430274261829,0.0004092680923152776,0.00028492160640338084,0.00020861217469969167,0.00016679580316719344,0.00015468672086849377,0.00018430951195784153,0.0003400162401556392 | ||||||
| 0.001,0.0007597350402439383,0.0006012612395706585,0.0004072600935672035,0.0002828447987841907,0.00020649842223713097,0.00016448344741808307,0.00015174362495246272,0.00017946021794659197,0.00032758319657592714 | 0.001,0.0007605900180176352,0.0006021895546863309,0.000408478730269415,0.00028412917095061395,0.00020781548628341263,0.00016592174578786424,0.0001535619455802766,0.00018244555944842464,0.000335359176825339 | ||||||
| 0.001,0.0007591132829776185,0.0006005982088110791,0.0004064581175876688,0.00028203726728774387,0.00020568299547110922,0.00016358411213968798,0.00015057934813125987,0.00017751539893581778,0.00032265060787650516 | 0.001,0.0007599713504055552,0.0006015295991965402,0.0004076783487865176,0.0002833211587561824,0.00020699731581240013,0.00016501652229006483,0.00015238542164450143,0.000180469716663273,0.00033030742335106797 | ||||||
| 0.001,0.000758484736453085,0.0005999283660908604,0.0004056495676510805,0.00028122495212139567,0.00020486486304104927,0.00016268449575399985,0.00014941879820841596,0.00017558496339953558,0.0003177787884410679 | 0.001,0.0007593507507343548,0.0006008678808679657,0.00040687692763931326,0.0002825132124386522,0.00020618050489600874,0.00016411458466993175,0.0001512162128542595,0.00017851301079839705,0.00032532712476693115 | ||||||
| 0.001,0.0007578494094215417,0.0005992517275730322,0.0004048344831924046,0.000280407904430663,0.00020404408117776887,0.0001617846565020927,0.00014826202727426984,0.00017366890284920263,0.0003129672376410902 | 0.001,0.0007587233815624382,0.0006001993719156019,0.00040606894689472706,0.0002817004901671922,0.0002053609939218913,0.0001632123763493078,0.00015005076311129325,0.00017657081573262424,0.0003204083683965919 | ||||||
| 0.001,0.0007572073108060312,0.0005985683096346821,0.0004040129039083478,0.0002795861755026316,0.00020322070604404603,0.00016088465224596546,0.00014710908652278506,0.00017176720707727308,0.00030821545426856767 | 0.001,0.0007580892517126006,0.0005995240885208491,0.0004052544459439752,0.0002808830430533993,0.00020453883912382008,0.0001623099555953223,0.0001488891244397257,0.00017464312199372379,0.0003155506430768726 | ||||||
| 0.001,0.0007565575890478602,0.00059787696153193,0.0004031823074325593,0.00027875567967892653,0.00020238859856737548,0.00015997497741322437,0.00014594324831107206,0.00016984173084389243,0.0003033838449669414 | 0.001,0.000757448370179369,0.0005988420470784952,0.00040443346443882024,0.0002800609223493252,0.00020371409666633197,0.00016140738029416416,0.00014773134796391561,0.00017272991838834854,0.0003107534371554913 | ||||||
| 0.001,0.0007559011152632264,0.0005971788697390111,0.00040234530612592536,0.0002779206290242912,0.00020155405878687617,0.00015906535701622418,0.0001447815990558725,0.00016793142878541938,0.0002986152551090434 | 0.001,0.0007567998780637095,0.00059815208713495,0.0004036034596839685,0.0002792300099339312,0.0002028805779162198,0.0001604950646725177,0.00014656055358564036,0.0001707926621492761,0.00030587527063737443 | ||||||
| 0.001,0.000755237898986442,0.000596474051424026,0.00040150194087318277,0.00027708107588917086,0.00020071714346489746,0.00015815584855490808,0.00014362418708307366,0.00016603627832169687,0.00029390910930431773 | 0.001,0.0007561446539823046,0.0005974554049330684,0.00040276706435836743,0.0002783945504517164,0.00020204463288750894,0.00015958281494627715,0.00014539398266818048,0.00016887071348766508,0.00030106092293455183 | ||||||
| 0.001,0.0007545681886825906,0.0005957627683701927,0.00040065250958751827,0.00027623729012494873,0.00019987808563904174,0.00015724665811831285,0.0001424712015659587,0.00016415642490307197,0.0002892651425802985 | 0.001,0.0007554827075416216,0.0005967520176577599,0.00040192431930056663,0.00027755459621831854,0.00020120631834502002,0.0001586706886366497,0.00014423168344504801,0.00016696404870095068,0.0002963098069760517 | ||||||
| 0.001,0.0007538919937536639,0.0005950450374279253,0.0003997970520738093,0.0002753893223189692,0.00019903693960802692,0.00015633783972296886,0.0001413226854400146,0.00016229183664828758,0.0002846827650697017 | 0.001,0.0007548142866478835,0.0005960421864035,0.00040107552190864405,0.000276710416864016,0.00020036586735025836,0.00015775889202640647,0.00014307384532883863,0.00016507281278915244,0.00029162164835553234 | ||||||
| 0.001,0.0007532045557665671,0.0005943145247994342,0.0003989223236188871,0.00027451662339635243,0.0001981640806362608,0.00015538551594067732,0.00014010540813129958,0.00016028630721570607,0.00027963581042999 | 0.001,0.0007541394007727726,0.0005953259280357876,0.00040022071194032425,0.0002758620629396957,0.00019952333420039184,0.0001568474791446172,0.00014192051114461952,0.000163196972716382,0.0002869958456117749 | ||||||
| 0.001,0.0007525106592079478,0.0005935776116184588,0.00039804170193550713,0.0002736399653899091,0.00019728948692008958,0.00015443417816766013,0.00013889388158999866,0.0001582996284854468,0.0002746667454821644 | 0.001,0.000753453261276124,0.0005945968692177485,0.0003993465628625302,0.0002749888554209862,0.00019864889698783253,0.00015589225679197793,0.00014069786108208423,0.00016117883466097707,0.0002818995386546663 | ||||||
| 0.001,0.0007518104383956622,0.000592834444449282,0.0003971553683797481,0.0002727595219957832,0.00019641331428482412,0.00015348396557824612,0.00013768822268133468,0.000156331819705631,0.00026977480754699626 | 0.001,0.0007527606830746849,0.0005938614307668164,0.00039846653446453577,0.00027411169702333635,0.00019777273283424246,0.00015493803621995225,0.00013948100714945055,0.00015917971666279146,0.00027688213338452353 | ||||||
| 0.001,0.0007511039033537896,0.0005920850408658466,0.0003962633635582371,0.00027187534416274955,0.00019553561634171146,0.00015253492870981108,0.00013648846139846028,0.00015438279270990136,0.0002649590347362105 | 0.001,0.000752061800251107,0.000593119758904669,0.0003975808078042764,0.0002732307613051971,0.00019689499757748,0.00015398495670235495,0.00013827006619590224,0.00015719963654088831,0.0002719428500764955 | ||||||
| 0.001,0.0007503910642803073,0.0005913294186556257,0.0003953657283217157,0.0002709874829437419,0.00019465644657888978,0.0001515871176567501,0.0001352946268320504,0.0001524524582210848,0.0002602184722292356 | 0.001,0.0007513566228984858,0.0005923718712186205,0.00039668942343994645,0.00027234609917798486,0.0001960157448213401,0.0001530330687596212,0.0001370650679700252,0.0001552385042294358,0.000267080708365827 | ||||||
| 0.001,0.0007496855573046408,0.0005905851062898704,0.00039449552403657745,0.00027014241927282736,0.0001938361803657908,0.0001507194393001951,0.00013421767536698768,0.000150722476765932,0.0002559376038022294 | 0.001,0.0007506451612836396,0.000591617785508762,0.0003957924221725467,0.000271457761656054,0.00019513502804513515,0.00015208242246717618,0.00013586604131538964,0.00015329622856198138,0.00026229473523033993 | ||||||
| 0.001,0.0007489737467556278,0.0005898345737440663,0.000393619635985906,0.00026929349394052985,0.00019301404332913125,0.00014985216957655317,0.00013314488789598826,0.00014900672746282064,0.00025171693602497907 | 0.001,0.0007499410764512782,0.0005908750616328752,0.0003949229270536377,0.00027061232560569935,0.0001943133661054677,0.00015121214860141992,0.00013478433495717895,0.0001515553239579192,0.0002579720674546429 | ||||||
| 0.001,0.0007482556429977025,0.0005890778388714725,0.00039273810426086416,0.0002684407562332248,0.0001921900867993824,0.00014898535811302548,0.00013207630234912348,0.00014730517414690737,0.000247555825445753 | 0.001,0.0007492307077939692,0.0005901261380362599,0.0003940477612542949,0.0002697630351391033,0.0001934898396676657,0.00015034229582385722,0.00013370682839182124,0.00014982878466439454,0.0002537103994437239 | ||||||
| 0.001,0.000747532135526673,0.0005883158165865031,0.0003918519024244402,0.00026758503804540166,0.0001913649895279964,0.00014811957577380352,0.00013101244041258906,0.0001456183389249714,0.00024345460151209766 | 0.001,0.0007485140657428474,0.0005893710325813375,0.00039316696481225496,0.0002689099395032721,0.00019266450005914697,0.0001494729137699088,0.00013263355942168804,0.00014811657325897344,0.00024950907434075407 | ||||||
| 0.001,0.0007468032330641541,0.0005875485221384682,0.0003909610648762846,0.00026672638132361175,0.0001905387943939666,0.00014725486211264363,0.00012995332641946747,0.00014394616337354944,0.00023941257691738652 | 0.001,0.0007477920374988207,0.0005886106575770754,0.00039228150952041026,0.0002680538698732277,0.00019183802609277662,0.00014860457389983926,0.00013156505071301006,0.00014641921273032577,0.00024536841469387607 | ||||||
| 0.001,0.0007460689444707028,0.0005867759709451519,0.0003900656262003575,0.00026586482808789615,0.00018971154418348472,0.00014639125636754904,0.00012889898406950181,0.00014228858823944247,0.00023542906884335907 | 0.001,0.0007470646318417684,0.000587845028280153,0.00039139142972943226,0.00026719486815718823,0.00019101046063687028,0.0001477373157547231,0.00013050132642612272,0.00014473664329931894,0.00024128771968956965 | ||||||
| 0.001,0.0007453292787585437,0.0005859981786120694,0.0003891656212152682,0.00026500042051039684,0.000188883281693472,0.0001455287975953345,0.000127849436626481,0.0001406455538271199,0.00023150340029334736 | 0.001,0.000746331857690334,0.0005870741601150847,0.0003904967599732611,0.0002663329763359202,0.00019018184646592208,0.0001468711785583918,0.00012944241008601634,0.0001430688043627681,0.00023726629318772418 | ||||||
| 0.001,0.0007445843685250069,0.0005852152884984452,0.0003882612223549495,0.00026413331906842847,0.00018805414639063353,0.00014466760638632992,0.00012680478406473458,0.00013901709088191773,0.00022763506393382832 | 0.001,0.000745593724114763,0.0005862980686936137,0.0003895975350198339,0.0002654682365419898,0.00018935222636504533,0.00014600620135329296,0.00012838832478192589,0.0001414156348862137,0.00023330344508078714 | ||||||
| 0.001,0.0007438342228409441,0.0005844273161744179,0.0003873524639441998,0.00026326356496406687,0.00018722417962072503,0.0001438077197030893,0.00012576504647438162,0.00013740313489262333,0.00022382338328436597 | 0.001,0.0007448503634609417,0.0005855168970231048,0.00038869392700388675,0.0002646008091121948,0.00018852173980288115,0.00014514250481571783,0.00012733917050730646,0.00013977716467553823,0.00022939865638927297 | ||||||
| 0.001,0.0007430788509165626,0.0005836342773781009,0.0003864393804873395,0.0002623911994661588,0.00018639342263244998,0.00014294917419819004,0.000124730243348245,0.00013580362065026603,0.00022006768669446508 | 0.001,0.0007441017848559784,0.0005847306606783223,0.0003877859701983709,0.00026373073520765555,0.0001876904281105713,0.0001442801258881357,0.00012629496716723198,0.0001381533278738466,0.00022555123779529113 | ||||||
| 0.001,0.000742327254060605,0.0005828476385639736,0.00038554300530339766,0.00026154496076193957,0.00018559797011481673,0.0001421370333657246,0.00012375932796391997,0.00013430279846409174,0.00021649152387618443 | 0.001,0.000743347997566111,0.0005839393754013221,0.00038687369905472224,0.00026285805605533836,0.00018685833252122952,0.0001434191012016364,0.000125255734067765,0.0001365440579330561,0.0002217605049922782 | ||||||
| 0.001,0.0007415704350109161,0.0005820559385468977,0.00038464228372291103,0.0002606960153281244,0.00018480150743526303,0.00014132579578003348,0.000122792459010487,0.0001328143978658426,0.0002129659469511457 | 0.001,0.0007425980122165197,0.0005831545190886928,0.0003859781684512971,0.00026201154253776947,0.00018606159531590292,0.00014260456502787665,0.00012428053620243385,0.0001350337902936029,0.00021815009586241928 | ||||||
| 0.001,0.0007408084031449065,0.0005812591931755618,0.00038373724983374976,0.00025984440338310303,0.0001840040745362742,0.0001405154975809745,0.00012182965960439977,0.00013133837476817992,0.00020949038404752677 | 0.001,0.0007418428222422646,0.0005823646190291856,0.00038507830193089523,0.00026116232813230903,0.0001852638537460305,0.00014179094397584395,0.00012330941740530514,0.00013353605951814913,0.000214590937375532 | ||||||
| 0.001,0.0007400427720784002,0.0005804590496942265,0.00038282961864956994,0.0002589915613698488,0.00018320681873232144,0.00013970708155515462,0.00012087177639736769,0.00012987560432955444,0.00020606578076074432 | 0.001,0.0007410824370750857,0.0005815696910727474,0.00038417413352571667,0.0002603104530145326,0.00018446514774054143,0.00014097827417406666,0.00012234240064855456,0.00013205082038162874,0.00021108244611026217 | ||||||
| 0.001,0.0007392735475065714,0.0005796555183614057,0.00038191941292656456,0.0002581375157328154,0.0001824097650442608,0.00013890056717630873,0.00011991881140841177,0.0001284260094133047,0.00020269149646849757 | 0.001,0.0007403184660014679,0.0005807713776603622,0.0003832673750805624,0.0002594573523562161,0.0001836666246937272,0.00014016749938812904,0.00012138033426810311,0.00013057895028626532,0.00020762556561303502 | ||||||
| 0.001,0.0007385007352097838,0.0005788486095364762,0.00038100665551987393,0.00025728229294257515,0.00018161293842329387,0.00013809597373520515,0.00011897076635433426,0.0001269895128043655,0.00019936689671873207 | 0.001,0.0007395509147560407,0.0005799696890514251,0.0003823580493090658,0.0002586030525652665,0.00018286830960336872,0.00013935863904919696,0.00012042322007081454,0.00012912037080446074,0.00020421964337946413 | ||||||
| 0.001,0.0007377243410529983,0.0005780383336785572,0.0003800913693799712,0.0002564259194903244,0.00018081636374445108,0.00013729332033271256,0.00011802764264291933,0.00012556603720150224,0.00019609135315036536 | 0.001,0.0007387797891584386,0.0005791646356057247,0.0003814461790231548,0.0002577475800751799,0.00018207022739706005,0.00013855171240478834,0.00011947105956106815,0.0001276750034397535,0.00020086403326178727 | ||||||
| 0.001,0.0007369464655998592,0.0005772268587748353,0.0003791758785432219,0.0002555703831979673,0.00018002165393456068,0.00013649394990366146,0.00011709066577140669,0.00012415690240967774,0.0001928666431485617 | 0.001,0.0007380050951127038,0.000578356227782297,0.00038053178712941366,0.00025689096133950617,0.0001812724029256328,0.00013774673851177748,0.00011852385393388548,0.0001262427696188339,0.00019755809538624924 | ||||||
| 0.001,0.0007361671107233329,0.000576414188654825,0.000378260191109379,0.00025471569177879693,0.0001792288130669198,0.00013569785799734456,0.00011615980704210183,0.00012276198311838844,0.00018969202938803596 | 0.001,0.0007372289278765602,0.0005775466274590334,0.00037961719344922816,0.00025603518246549605,0.00018047644930614432,0.00013694506185961904,0.00011758283148187963,0.00012482499369662246,0.0001943036135491255 | ||||||
| 0.001,0.0007353862783344302,0.000575600327192691,0.00037734431522203,0.00025386185296321013,0.00017843784520433673,0.00013490504014296103,0.00011523503783001357,0.00012138115492992521,0.0001865667844236815 | 0.001,0.0007364512893389424,0.0005767358384619004,0.0003787024060562486,0.0002551802511391958,0.00017968237057615404,0.0001361466779099092,0.00011664796319397039,0.00012342154884218158,0.00019109983808810176 | ||||||
| 0.001,0.0007346027258369329,0.0005747835721418604,0.00037642443290667116,0.0002530026346493095,0.000177639416207763,0.0001341012793025371,0.0001142922256260196,0.00011996295037667013,0.00018332302768968173 | 0.001,0.0007356721814267267,0.0005759238646613067,0.0003777874330677233,0.0002543261750635963,0.00017889017076266666,0.00013535158210437542,0.00011571922013388507,0.00012203230915507028,0.00018794602945024216 | ||||||
| 0.001,0.0007338177018431625,0.0005739656376861859,0.00037550439543261463,0.0002521443237629474,0.00017684294734265143,0.00013330094534015117,0.00011335582519792064,0.00011855974750452474,0.00018013280630154984 | 0.001,0.0007348903474707337,0.0005751089853685418,0.00037686841880625214,0.0002534666634479025,0.00017809042928748983,0.00013454542482553396,0.00011477223754870921,0.00012060527355137842,0.0001846722184263047 | ||||||
| 0.001,0.0007330312083387708,0.0005731465277735759,0.000374584210907019,0.00025128692777751636,0.0001760484420635206,0.00013250403238709868,0.00011242580398299235,0.00011717140625198769,0.000176995286763841 | 0.001,0.0007341070502230424,0.0005742929332546843,0.0003759492523595486,0.00025260806222015907,0.0001772926545344648,0.0001337427099649026,0.00011383170595735486,0.00011919336498115804,0.00018145260378874068 | ||||||
| 0.001,0.0007322450716827681,0.0005723280950701311,0.00037366577307640326,0.00025043200586833656,0.00017525712146802507,0.00013171151729665014,0.00011150300328069361,0.00011579873047427355,0.00017391111613739919 | 0.001,0.0007333222916846016,0.0005734757122629472,0.0003750299418068227,0.0002517503788238516,0.00017649684991694604,0.00013294343155185963,0.00011289759243683735,0.00011779644164652425,0.00017828633792123003 | ||||||
| 0.001,0.0007314592892342591,0.0005715103366354928,0.0003727490765712826,0.00024957954955556494,0.0001744689721973381,0.00013092337604814113,0.00011058736861417956,0.00011444154833756723,0.0001708794064250159 | 0.001,0.0007325378931581444,0.0005726591695542582,0.00037411237735305734,0.00025089517102575937,0.00017570423657326553,0.00013214856737581396,0.00011197073980433406,0.0001164153090011861,0.00017517406255147756 | ||||||
| 0.001,0.0007306738583803173,0.0005706932495677312,0.00037183411609277345,0.00024872955044744495,0.00017368398100343736,0.0001301395848004509,0.00010967884595770732,0.00011309968990727626,0.00016789928423747183 | 0.001,0.0007317538520017976,0.0005718433021851622,0.00037319655361857124,0.00025004243032543557,0.00017491480109484205,0.00013135809328305347,0.0001110510931582075,0.00011504979334922632,0.00017211487548789828 | ||||||
| 0.001,0.0007298887765314699,0.0005698768309963597,0.00037092088639398746,0.0002478820002115871,0.00017290213471209804,0.00012936011984533696,0.0001087773816703527,0.00011177298701463364,0.00016496989019036454 | 0.001,0.0007309701656016873,0.0005710281072505973,0.0003722824652942578,0.0002491921483105776,0.0001741285301842189,0.000130571985300518,0.00011013859805243972,0.00011369972292133188,0.00016910788945367707 | ||||||
| 0.001,0.0007291058850619836,0.0005690629705872476,0.0003700113801847071,0.0002470385774678141,0.00017212477134492983,0.0001285860674779147,0.00010788392632853856,0.00011046237940908493,0.00016209217355659912 | 0.001,0.0007301868313673829,0.0005702135818768351,0.00037137010712276296,0.0002483443166280691,0.00017334541061775574,0.0001297902195887095,0.00010923320042963165,0.00011236492773944517,0.00016615223146969552 | ||||||
| 0.001,0.0007283251776795193,0.0005682516594285885,0.0003691055790623401,0.0002461992575642169,0.00017135185999287266,0.00012781738439880834,0.00010699840217906239,0.00010916766306641233,0.00015926520709064215 | 0.001,0.0007294056858799279,0.0005694016103111181,0.00037046146816096116,0.0002475006124214696,0.00017256678052747222,0.0001290138836109195,0.0001083358528422491,0.00011104635018836138,0.0001632488500459303 | ||||||
| 0.001,0.000727546648123048,0.000567442888658507,0.0003682034647519281,0.00024536401604150686,0.00017058337001160307,0.00012705402771768452,0.00010612073231230378,0.0001078886367084761,0.00015648808062028533 | 0.001,0.0007286267228265342,0.0005685921836368309,0.00036955653001307385,0.0002466610110284357,0.00017179260894632618,0.00012824293390221287,0.00010744647704539295,0.00010974378427192081,0.00016039680402653037 | ||||||
| 0.001,0.0007267691175258129,0.0005666351120658079,0.00036730194585451363,0.00024452825978826814,0.00016981299319253088,0.00012628722374912656,0.00010523753204397677,0.00010660034638564814,0.00015369233245141463 | 0.001,0.0007278499359259242,0.0005677852929874075,0.0003686552744110329,0.000245825487979439,0.00017102286517266867,0.00012747732740860064,0.00010656499564424898,0.00010845702677323144,0.00015759516965436614 | ||||||
| 0.001,0.0007259937543683618,0.0005658298620581495,0.00036640409142867466,0.00024369656281803695,0.0001690470312136919,0.00012552576286196436,0.00010436224908854787,0.00010532792661952348,0.00015094700928094292 | 0.001,0.0007270741396329974,0.0005669793834682747,0.00036775459243596013,0.0002449894231786493,0.00017025120181982169,0.00012670823171859124,0.00010567792500018758,0.00010716091111285436,0.00015477474449137119 | ||||||
| 0.001,0.0007252205525006216,0.0005650271299429238,0.0003655098835814395,0.0002428689011484816,0.0001682854538881413,0.00012476960247399048,0.00010349480634605481,0.00010407117393308648,0.00014825118806841486 | 0.001,0.000726300509089127,0.0005661759961906673,0.0003668575707603942,0.00024415741777526555,0.00016948395998088835,0.00012594449635600327,0.000104798812682607,0.00010588078664841973,0.00015200532201362785 | ||||||
| 0.001,0.0007244515476870691,0.0005642289688561167,0.00036462138604045246,0.00024204694758546622,0.00016752954803985582,0.00012401974721449815,0.00010263603739686231,0.00010283083470852359,0.0001456053538142381 | 0.001,0.0007255290381246482,0.0005653751224576382,0.0003659641914980988,0.00024332944777626794,0.00016872110941070693,0.00012518607857232714,0.00010392758109688598,0.00010461644792633948,0.00014928596543342006 | ||||||
| 0.001,0.0007236867286572494,0.0005634353625294562,0.0003637385663464586,0.00024123066115747858,0.00016677926586679636,0.00012327613591461942,0.00010178584352378332,0.00010160667618634935,0.0001430085413998934 | 0.001,0.0007247617567123682,0.0005645788092050789,0.0003650765144822908,0.0002425071844547339,0.00016796393694001768,0.00012443398389681975,0.0001030650652169494,0.00010336864256044427,0.00014661715384500229 | ||||||
| 0.001,0.0007229260842094953,0.0005626462948017631,0.0003628613922977866,0.00024042000126051454,0.00016603456004153966,0.00012253870808207087,0.0001009441272602465,0.00010039846917127745,0.000140459805170444 | 0.001,0.0007239986535454607,0.0005637870401634551,0.0003641945072810511,0.0002416905868396016,0.00016721239470100498,0.00012368815096486452,0.00010221116577265065,0.00010213713571582715,0.00014399790845116419 | ||||||
| 0.001,0.0007221696032014468,0.000561861749604344,0.00036198983191176377,0.0002396149275989645,0.00016529538363567852,0.00012180740380654271,0.00010011079225737115,9.920598777483068e-05,0.00013795821792425024 | 0.001,0.0007232397173862652,0.0005629997991705343,0.0003633181377200508,0.00024087961432750444,0.00016646643530137355,0.0001229485190910589,0.00010136578475280116,0.00010092169616032506,0.00014142727026178776 | ||||||
| 0.001,0.0007214188723728384,0.00056108334509554,0.0003611255610840681,0.0002388168283348348,0.00016456282140960994,0.00012108307905286178,9.928655238677393e-05,9.802986918413655e-05,0.0001355041849544529 | 0.001,0.00072248493705675,0.0005622170701566371,0.0003624473738436701,0.00024007422662323307,0.0001657260117481481,0.0001222150281737581,0.00010052882527084345,9.972209600365954e-05,0.000138904299062937 | ||||||
| 0.001,0.0007206738776295639,0.0005603110603628828,0.0003602685373417506,0.00023802565027806571,0.00016383681258690845,0.00012036565891864721,9.847129356381268e-05,9.686986333449523e-05,0.0001330967445342526 | 0.001,0.0007217358950348228,0.000561440466555814,0.00036158388844431124,0.00023927581064585389,0.0001649922088518066,0.00012148853502428482,9.97010025298723e-05,9.853897375975792e-05,0.00013642939611266722 | ||||||
| 0.001,0.0007199346049934109,0.0005595448746691314,0.00035941871861020354,0.00023724134078502595,0.00016311729706930416,0.00011965506942237431,9.7664903298557e-05,9.57257243308077e-05,0.00013073495556510661 | 0.001,0.0007209925771752469,0.0005606699674539418,0.0003607276390906435,0.00023848431321443392,0.00016426496576549843,0.00012076896452456461,9.888220185750974e-05,9.737207727303015e-05,0.00013400158668478175 | ||||||
| 0.001,0.0007192103057281418,0.0005587965882928195,0.000358597914203722,0.00023649404923234267,0.0001624426539507404,0.00011900000933912548,9.693290327537121e-05,9.469853254875163e-05,0.0001286228242214262 | 0.001,0.0007202549694492843,0.0005599055521123883,0.0003598785837495114,0.00023769968169456287,0.0001635442223215586,0.00012005624248053424,9.807231018575002e-05,9.622115859912247e-05,0.0001316199170239902 | ||||||
| 0.001,0.0007184916860834766,0.000558054333130965,0.0003577841401235257,0.0002357533416394368,0.00016177407584741055,0.00011835110239617177,9.620855295571759e-05,9.368449216343134e-05,0.0001265476735456528 | 0.001,0.0007195323462520794,0.0005591590509921624,0.0003590585920958888,0.00023695215697134095,0.00016286848728581805,0.00011939925459233543,9.733714368639992e-05,9.518785816120323e-05,0.00012948993319015237 | ||||||
| 0.001,0.000717778732645577,0.0005573180893469085,0.0003569773567342285,0.0002350191694371068,0.0001611115088719043,0.00011770828481211398,9.549176022876216e-05,9.268341301362701e-05,0.00012450880618841231 | 0.001,0.0007188153904868624,0.0005584185656809617,0.00035824561959240325,0.0002362112130369942,0.00016219882234612553,0.00011874843483873407,9.660966052802588e-05,9.416779973181015e-05,0.00012739732395025585 | ||||||
| 0.001,0.0007170715507844816,0.0005565879566941514,0.0003561776441627035,0.00023429158098135867,0.00016045497378223205,0.00011707155159443024,9.47824835635146e-05,9.169515755193108e-05,0.00012250560759307665 | 0.001,0.0007181040886926203,0.0005576840763431772,0.00035743962664792336,0.00023547680133784063,0.00016153517356182933,0.00011810371926813217,9.588976814961258e-05,9.316079161517574e-05,0.00012534138272701054 | ||||||
| 0.001,0.0007163701270344053,0.0005558639152622166,0.0003553849627325309,0.00023357052778616886,0.00015980441694230793,0.00011644083951173604,9.408063218207804e-05,9.071953997714039e-05,0.00012053740486430812 | 0.001,0.0007173985458519898,0.0005569556823713467,0.0003566406932084415,0.00023474897015812488,0.0001608775616408074,0.00011746510277705029,9.517742467544867e-05,9.216669491688869e-05,0.00012332148630987257 | ||||||
| 0.001,0.0007156744480415676,0.0005551459453084167,0.00035459927313802623,0.00023285596185845654,0.00015915978530381373,0.00011581608608941654,9.338611653058621e-05,8.975637744384618e-05,0.00011860353870291344 | 0.001,0.0007166987484521553,0.0005562333638566226,0.00035584877964252954,0.00023402767102794237,0.00016022593289484238,0.00011683252196707568,9.447253888812898e-05,9.118532235085734e-05,0.00012133695300052025 | ||||||
| 0.001,0.0007149845005557793,0.0005544340272448129,0.0003538205364097734,0.0002321478356456351,0.0001585210263398076,0.00011519722952770958,9.269884816673769e-05,8.880548985453175e-05,0.00011670336266552508 | 0.001,0.0007160046830928351,0.0005555171010581067,0.00035506384668924896,0.00023331285597027454,0.00015958023422419515,0.00011620591419889337,9.377502080118898e-05,9.021648961473911e-05,0.0001193871149139895 | ||||||
| 0.001,0.0007143011352806332,0.0005537290222260827,0.0003530496254918224,0.00023144685778402562,0.00015788868071804074,0.00011458468167101622,9.20191492389152e-05,8.786712068874325e-05,0.00011483685132763588 | 0.001,0.0007153163364777631,0.0005548068743897313,0.0003542858554234702,0.00023260447744820426,0.00015894041305074621,0.00011558521750971036,9.308478154551746e-05,8.926001517936315e-05,0.00011747131722415646 | ||||||
| 0.001,0.0007136243377311475,0.0005530309085687206,0.00035228649684153725,0.0002307529751854999,0.00015726269010384348,0.00011397837465469773,9.134692457668887e-05,8.694108196461404e-05,0.00011300335424584403 | 0.001,0.0007146345569433116,0.0005541035424399441,0.0003535156771553805,0.00023190324345165713,0.00015830701004295562,0.00011497084410199294,9.240214376206843e-05,8.831614266750221e-05,0.00011558953011398195 | ||||||
| 0.001,0.0007129540935643617,0.0005523396647985742,0.000351531107363628,0.0002300661353432777,0.0001566429968410848,0.00011337824146720777,9.06820803490277e-05,8.602718880727694e-05,0.00011120223452206596 | 0.001,0.0007139593299513231,0.0005534070835269872,0.0003527532683936443,0.00023120910091256188,0.0001576799668132194,0.0001143627259393922,9.172701183766888e-05,8.738468264977303e-05,0.00011374109491336212 | ||||||
| 0.001,0.0007122949300063586,0.0005516609446370161,0.0003507932546232374,0.0002293990178082647,0.00015604454205901748,0.00011280134646728481,9.004396195380538e-05,8.514641523915274e-05,0.00010944396621311202 | 0.001,0.0007132906411062882,0.000552717476178626,0.00035199858609393853,0.00023052199734406963,0.00015705922565321226,0.00011376079584113645,9.105929150577112e-05,8.646544883197101e-05,0.0001119253667056674 | ||||||
| 0.001,0.0007116422850379047,0.0005509890404263221,0.00035006301886912226,0.00022873877079420107,0.00015545216193435095,0.00011223032450910806,8.941277122627028e-05,8.427699754143763e-05,0.00010771649233683978 | 0.001,0.0007126330184449588,0.0005520403753247726,0.0003512614302897459,0.0002298546155988536,0.00015645973111213718,0.0001131821199461313,9.041832213305081e-05,8.557937250804453e-05,0.00011015252685143603 | ||||||
| 0.001,0.0007109961448775265,0.0005503239315436604,0.00034934035900275196,0.00022808534468017605,0.00015486580256638324,0.00011166511373672321,8.878842266662507e-05,8.341876815036907e-05,0.00010601922394974779 | 0.001,0.000711981898998139,0.0005513700720769836,0.0003505318788510462,0.00022919410061472063,0.0001558663157908185,0.00011260933085632868,8.978431049296584e-05,8.47047300887107e-05,0.00010841080451458245 | ||||||
| 0.001,0.0007103566138672342,0.0005496657159311855,0.0003486253516297722,0.00022743878433373037,0.00015428548213839886,0.00011110570832676001,8.81708780194749e-05,8.25716070442755e-05,0.00010435164299643007 | 0.001,0.0007113372689341813,0.0005507065458152156,0.0003498098907291114,0.00022854040278969112,0.00015527892573799634,0.00011204236655473188,8.91571706762786e-05,8.384135267939557e-05,0.00010669960309782175 | ||||||
| 0.001,0.0007097236782517396,0.0005490143729973408,0.0003479179557857281,0.0002267990403962617,0.0001537111471536449,0.00011055204708289399,8.756005313455197e-05,8.173535064610718e-05,0.0001027131817052566 | 0.001,0.0007106992322019796,0.0005500498941226498,0.0003490955423571875,0.00022789356692450827,0.00015469757908825738,0.00011148122111140715,8.85368641132709e-05,8.298911908997276e-05,0.00010501839736063321 | ||||||
| 0.001,0.0007090973244087274,0.0005483698823458906,0.00034721813091834777,0.000226166064037726,0.00015314274472297157,0.00011000406955950422,8.695586501935841e-05,8.090983803329783e-05,0.00010110328401062253 | 0.001,0.0007100677749962943,0.0005494000964108962,0.0003483887928208825,0.00022725354367970012,0.00015412222229517684,0.0001109258331719869,8.792330625417495e-05,8.214786445649906e-05,0.00010336661223747767 | ||||||
| 0.001,0.0007084775388425413,0.0005477322237660661,0.0003465258368613831,0.00022553980691704316,0.00015258022251510344,0.00010946171600087524,8.635823175652435e-05,8.00949107862898e-05,9.952140501322636e-05 | 0.001,0.0007094428836454011,0.0005487571322870243,0.0003476896016176379,0.00022662028424420426,0.00015355280242059424,0.00011037614213504096,8.731641371338838e-05,8.131742659415625e-05,0.00010174368455214035 | ||||||
| 0.001,0.0007078645400735427,0.0005471016129101978,0.0003458412757255009,0.00022492042013778988,0.00015202368335334558,0.00010892504915290583,8.57671759148139e-05,7.929051589048381e-05,9.796715152670613e-05 | 0.001,0.000708824544604701,0.0005481209815436059,0.0003469979286303459,0.00022599374029548395,0.00015298926708448145,0.00010983208809074389,8.671610418600222e-05,8.049764584384383e-05,0.0001001490624678555 | ||||||
| 0.001,0.0007072583145347741,0.0005464780293804963,0.00034516440688163317,0.00022430785483116316,0.0001514730744232032,0.00010839400891826328,8.518261565996433e-05,7.84964968569563e-05,9.643999410136803e-05 | 0.001,0.0007082129757140411,0.0005474918591435615,0.0003463139755716002,0.00022537406278014643,0.00015243171907300512,0.00010929373376222763,8.612240008214866e-05,7.968846833775761e-05,9.858234685897841e-05 | ||||||
| 0.001,0.0007066588487940405,0.000545861452976259,0.0003444951901125997,0.00022370206265319418,0.00015092834351042303,0.00010786853593723236,8.460447028623623e-05,7.771269974698105e-05,9.493941424410264e-05 | 0.001,0.000707608163356494,0.0005468697446924577,0.00034563770186245746,0.00022476120284855867,0.000151880105523236,0.00010876101889898551,8.55352191851817e-05,7.888973637819775e-05,9.704300162684373e-05 | ||||||
| 0.001,0.0007060768113835355,0.0005452653567881146,0.00034385780916102886,0.0002231355522451839,0.0001504295746545273,0.00010739737531972382,8.409424224945842e-05,7.702434963545377e-05,9.360618912201228e-05 | 0.001,0.0007070100940503908,0.0005462546179930401,0.0003449690673354809,0.0002241551121757662,0.0001513343741731098,0.00010823388399029377,8.495448041312896e-05,7.810129484091103e-05,9.553050179700698e-05 | ||||||
| 0.001,0.0007055014939207988,0.0005446762036784223,0.00034322791998477503,0.0002225755642266546,0.00014993632274793293,0.00010693123855410087,8.358951092264173e-05,7.634435339541097e-05,9.22944227993744e-05 | 0.001,0.0007064294568015821,0.0005456599791780414,0.0003443323098548347,0.00022358838010950836,0.00015083471987353974,0.00010776122599922914,8.444190686735427e-05,7.7408734986085e-05,9.418640444056476e-05 | ||||||
| 0.001,0.0007049328836329239,0.0005440939744776738,0.0003426054850001757,0.00022202205441602206,0.000149448541485554,0.00010647007505716636,8.309021096715739e-05,7.567259318109089e-05,9.100372969350909e-05 | 0.001,0.0007058555225588962,0.0005450722639773927,0.0003437030311737585,0.0002230281662249932,0.00015034058581471813,0.00010729360256509277,8.39348527119689e-05,7.67245852554126e-05,9.28639870067709e-05 | ||||||
| 0.001,0.0007043664108869901,0.0005435140913972429,0.00034198598587466614,0.00022147141590047654,0.00014896349766232102,0.00010601178096740148,8.259459730216135e-05,7.500736724232048e-05,8.973176442333615e-05 | 0.001,0.0007052882785030611,0.0005444914532267761,0.0003430811937591523,0.00022247442636251605,0.00014985192565331347,0.00010683096298015644,8.343325230960875e-05,7.604872690242875e-05,9.156285904414627e-05 | ||||||
| 0.001,0.0007038020712072354,0.0005429365478183962,0.00034136940918446675,0.0002209236320980648,0.00014848117283038098,0.00010555633431743894,8.210263744821714e-05,7.434860458126827e-05,8.847824135377829e-05 | 0.001,0.0007047231683832071,0.0005439129831785586,0.00034246228783126086,0.00022192355689618922,0.00014936600614401393,0.00010637120139586071,8.293535717958106e-05,7.537945268589432e-05,9.028066182205625e-05 | ||||||
| 0.001,0.0007032398600991381,0.0005423613371043419,0.00034075574151016483,0.0002203786864681782,0.00014800154862415601,0.00010510371328265478,8.161429921011451e-05,7.369623501807121e-05,8.724287943554497e-05 | 0.001,0.0007041601877072604,0.0005433368472132987,0.00034184629997988753,0.0002213755412469509,0.00014888280881520869,0.00010591429577334988,8.244113465160048e-05,7.471669094184598e-05,8.901710564172274e-05 | ||||||
| 0.001,0.0007026797730466592,0.0005417884525961108,0.00034014496942632764,0.0002198365624959981,0.00014752460674093983,0.00010465389615779026,8.112955064604149e-05,7.305018913687007e-05,8.602540201539488e-05 | 0.001,0.0007035993319644686,0.0005427630386936696,0.0003412332167993905,0.00022083036287728357,0.0001484023152778868,0.00010546022421726945,8.195055234184008e-05,7.406037083397318e-05,8.777190547391773e-05 | ||||||
| 0.001,0.0007021196874055633,0.0005412157406692665,0.0003395348927353949,0.00021929545761274023,0.00014704895219343257,0.00010420578859113516,8.064746506639534e-05,7.240953347459202e-05,8.482441661675139e-05 | 0.001,0.0007030405966226531,0.0005421915509602746,0.00034062302487816926,0.00022028800527546067,0.00014792450720603156,0.00010500896495215848,8.146357812174912e-05,7.341042229889045e-05,8.65447807653603e-05 | ||||||
| 0.001,0.0007015596012323657,0.0005406431992153213,0.0003389255082691921,0.00021875536780717296,0.00014657457987728414,0.00010375938295149973,8.016802726693694e-05,7.17742234562459e-05,8.363970356449741e-05 | 0.001,0.000702481864866424,0.0005416202367428493,0.000340013528083159,0.00021974666745789773,0.00014744798951136416,0.00010455942245749231,8.097928325582809e-05,7.276590831707151e-05,8.53343290345859e-05 | ||||||
| 0.001,0.0007009995125587165,0.0005400708260946051,0.0003383168128172846,0.00021821628903476192,0.00014610148467187763,0.0001033146716169485,7.969122211456026e-05,7.114421486558773e-05,8.247104609297546e-05 | 0.001,0.0007019231347536531,0.000541049093933996,0.00033940472324505365,0.0002192063454080809,0.00014697275707368812,0.00010411158905958576,8.049765241221972e-05,7.212678380437272e-05,8.414032725111873e-05 | ||||||
| 0.001,0.000700426120570031,0.0005394817717340144,0.00033767827777106695,0.00021763678242090514,0.00014557802543177205,0.00010280805245363877,7.913535785684264e-05,7.040274681183516e-05,8.111172191387726e-05 | 0.001,0.0007013644043173649,0.0005404781203952333,0.00033879660715245314,0.0002186670350763442,0.0001464988047567028,0.00010366545709431046,8.001867033124847e-05,7.149300404124133e-05,8.296255535497e-05 | ||||||
| 0.001,0.0006998527383823768,0.0005388929110101418,0.0003370405259007354,0.00021705847496470142,0.00014505616500334602,0.00010230367256069614,7.858312049704058e-05,6.966868896041247e-05,7.977423771714316e-05 | 0.001,0.0007007923380838431,0.0005398904209305891,0.0003381585602637609,0.00021808716235465733,0.0001459743062317574,0.00010315717126101123,7.946027734643345e-05,7.0747191644443e-05,8.159291401029592e-05 | ||||||
| 0.0010496228983614124,0.002020602352332682,0.0024834354692445607,0.004712247621156641,0.00854174709233096,0.015197203876184536,0.027142477151470907,0.049749449744480465,0.09589624880110185,0.2 | 0.001,0.0007002202839606736,0.0005393029161815334,0.0003375212965814363,0.0002175084901000057,0.0001454514108138073,0.00010265113449578299,7.890553328521924e-05,7.000884795811205e-05,8.02453392500888e-05 | ||||||
| 0.004235602571438949,0.007336805952289255,0.008714058005603317,0.015024716476258112,0.025061770718850837,0.04079161627542227,0.0649508755581543,0.10074574737193842,0.14993445055894863,0.206 | 0.0010564983206625808,0.0020323156209598047,0.0024972245821602065,0.004735193374982383,0.008578320915529132,0.015253393937469889,0.027225142859919765,0.049861478431656114,0.09601482521493776,0.2 | ||||||
|  | 0.004249939542299966,0.007357791565894658,0.008737301696751656,0.01505607870396766,0.02510093603015811,0.040835074437955504,0.0649892582783015,0.10076225398432796,0.14991538310282454,0.206 | ||||||
|   | |||||||
| 
 | 
| @@ -1,97 +1,97 @@ | |||||||
| signal,ase,nli | signal,ase,nli | ||||||
| 0.000325019416624,3.8827360617812335e-08,2.397604591245591e-07 | 0.0003277611420723,3.899470345438449e-08,2.4249796960234704e-07 | ||||||
| 0.0003222815415358,3.8702821151814216e-08,2.4267833614138976e-07 | 0.0003250017686895,3.88695612548288e-08,2.454439759471401e-07 | ||||||
| 0.0003195661748689,3.8578942925493807e-08,2.455296149641726e-07 | 0.0003222650868463,3.8745084795940443e-08,2.483227752372772e-07 | ||||||
| 0.000316873132879,3.8455721305309324e-08,2.483151861322029e-07 | 0.0003195509110308,3.8621269402790665e-08,2.5113526636955305e-07 | ||||||
| 0.0003125687708988,3.815158818797417e-08,2.497308542349044e-07 | 0.0003152051917212,3.831511482545576e-08,2.525571834385986e-07 | ||||||
| 0.0003083216327341,3.784989647314237e-08,2.5106122773764815e-07 | 0.0003109173643927,3.801142847546096e-08,2.538929936309988e-07 | ||||||
| 0.0003041309702107,3.755062053762566e-08,2.523083160653813e-07 | 0.0003066866698276,3.7710184357421544e-08,2.551447305997623e-07 | ||||||
| 0.0002999931829076,3.725370771318225e-08,2.534716728592015e-07 | 0.0003025094755105,3.74113291159896e-08,2.5631194688927884e-07 | ||||||
| 0.0002959076621852,3.695913382975532e-08,2.545532047834699e-07 | 0.0002983851632227,3.711483823464807e-08,2.57396572290435e-07 | ||||||
| 0.0002914749637887,3.6620413511505286e-08,2.5520557429118934e-07 | 0.0002939090370085,3.677384148134545e-08,2.580457272005108e-07 | ||||||
| 0.0002871045786391,3.62847038107824e-08,2.557776344401253e-07 | 0.0002894959951166,3.6435889805735655e-08,2.586138532899247e-07 | ||||||
| 0.0002827879891071,3.5951828869209396e-08,2.5626453052593257e-07 | 0.0002851374388563,3.6100804786136576e-08,2.590960415051975e-07 | ||||||
| 0.0002785247470154,3.562176113110911e-08,2.5666832208790035e-07 | 0.0002808329106728,3.5768558450009235e-08,2.594943775098954e-07 | ||||||
| 0.0002743144039041,3.5294473123494e-08,2.569910409348857e-07 | 0.0002765819528091,3.543912291177373e-08,2.5981091869063053e-07 | ||||||
| 0.000270032675166,3.4954880805048256e-08,2.571167784361306e-07 | 0.0002722585970856,3.509728654683229e-08,2.599278683420713e-07 | ||||||
| 0.0002658067200554,3.4618272391047544e-08,2.571652788509227e-07 | 0.0002679917286135,3.475846792019279e-08,2.5996691909916645e-07 | ||||||
| 0.000261636025157,3.428461757057609e-08,2.5713860104931033e-07 | 0.0002637808235807,3.44226362592242e-08,2.599301554005377e-07 | ||||||
| 0.00025752034599,3.395388872366444e-08,2.570390408700655e-07 | 0.000259625629125,3.4089763516669025e-08,2.598199006832183e-07 | ||||||
| 0.000253459157096,3.362605558722993e-08,2.5284986247287787e-07 | 0.0002555256094681,3.375981897519707e-08,2.555756892447018e-07 | ||||||
| 0.000248983782073,3.3242702224575744e-08,2.48252059976888e-07 | 0.0002510061132968,3.3373930606403456e-08,2.509166795385623e-07 | ||||||
| 0.0002445773493265,3.286328176612301e-08,2.437277481862015e-07 | 0.0002465564627785,3.299202134196193e-08,2.463324441551975e-07 | ||||||
| 0.0002402391773459,3.2487750441670215e-08,2.392761376865807e-07 | 0.0002421759612383,3.2614046686258965e-08,2.418221717126139e-07 | ||||||
| 0.0002359684123723,3.2116061418127753e-08,2.3489626905665574e-07 | 0.0002378637384678,3.2239959043845714e-08,2.373848791838885e-07 | ||||||
| 0.0002317642070805,3.174816817069829e-08,2.3058719110264335e-07 | 0.0002336189309368,3.18697111382095e-08,2.3301959212527745e-07 | ||||||
| 0.0002279695550926,3.1424928539548144e-08,2.2668986526609113e-07 | 0.000229786907623,3.154429519674801e-08,2.290704910449234e-07 | ||||||
| 0.0002242281358436,3.1104729317697146e-08,2.228495045304229e-07 | 0.0002260088301865,3.1221956560459585e-08,2.251793706228873e-07 | ||||||
| 0.0002205393783222,3.078753835343166e-08,2.190654562751529e-07 | 0.0002222841156937,3.090266251951521e-08,2.213455610060874e-07 | ||||||
| 0.0002169035545525,3.047333197100547e-08,2.1533790605165431e-07 | 0.0002186130300924,3.058638893853768e-08,2.175692384572231e-07 | ||||||
| 0.0002133200561122,3.01620779209974e-08,2.1166616520930645e-07 | 0.000214994952946,3.027310301755256e-08,2.138496969887665e-07 | ||||||
| 0.0002097882786443,2.9853744125792176e-08,2.080495504306458e-07 | 0.0002114292680468,2.9962772135295886e-08,2.1018623618806562e-07 | ||||||
| 0.0002063076230434,2.9548298767727423e-08,2.0448738489666716e-07 | 0.0002079153646262,2.9655363939172943e-08,2.0657816240778285e-07 | ||||||
| 0.0002028776374913,2.9245712991289203e-08,2.009791389793126e-07 | 0.0002044527805171,2.9350849083358333e-08,2.0302493091347645e-07 | ||||||
| 0.0001994977236946,2.8945955168147914e-08,1.975241389908885e-07 | 0.0002010409060047,2.904919541568693e-08,1.995258515561229e-07 | ||||||
| 0.0001961672877059,2.8648993828553545e-08,1.9412171682473827e-07 | 0.0001976791358816,2.8750370949174832e-08,1.9608024000424985e-07 | ||||||
| 0.0001929967738963,2.8368195292008612e-08,1.9088102669437356e-07 | 0.0001944779969388,2.8467714690234763e-08,1.9279758501200657e-07 | ||||||
| 0.0001898709450753,2.8090002575266257e-08,1.8768789971552863e-07 | 0.0001913221363037,2.8187696076865265e-08,1.895633279917293e-07 | ||||||
| 0.0001867892958482,2.7814389032455363e-08,1.8454176486632323e-07 | 0.0001882110383135,2.7910287978744905e-08,1.8637688328585562e-07 | ||||||
| 0.000183752636707,2.754134148447891e-08,1.8115002092564538e-07 | 0.0001851455117447,2.763547687941092e-08,1.8294394600063082e-07 | ||||||
| 0.0001807604032471,2.7270832946920812e-08,1.7781492252546064e-07 | 0.000182124981625,2.7363235313116972e-08,1.795685295609545e-07 | ||||||
| 0.0001778120365192,2.7002836607760232e-08,1.745356369687972e-07 | 0.0001791488786026,2.7093535992876882e-08,1.762497841686646e-07 | ||||||
| 0.0001749069829579,2.673732582084065e-08,1.7131134159682263e-07 | 0.0001762166388716,2.6826351803791374e-08,1.729868703567211e-07 | ||||||
| 0.0001720467771106,2.6474316260529432e-08,1.6814325920632144e-07 | 0.0001733298028653,2.6561698509687352e-08,1.6978101465406346e-07 | ||||||
| 0.0001692307716138,2.6213779758633963e-08,1.6503047175593728e-07 | 0.0001704877122406,2.6299547455845844e-08,1.666312813274778e-07 | ||||||
| 0.0001664583277393,2.5955688359138642e-08,1.619720751255672e-07 | 0.0001676897174922,2.603987020688793e-08,1.635367489137303e-07 | ||||||
| 0.0001635796256227,2.5677295228672648e-08,1.588223280583729e-07 | 0.0001647841340631,2.575975887106765e-08,1.603495310656704e-07 | ||||||
| 0.0001607481963598,2.540169810843596e-08,1.557306487644946e-07 | 0.0001619264140112,2.5482476734612484e-08,1.57221255401216e-07 | ||||||
| 0.0001579633073114,2.512886316325068e-08,1.526960267832303e-07 | 0.0001591158121254,2.520798936957748e-08,1.541508918468439e-07 | ||||||
| 0.0001552255108883,2.4858770138402143e-08,1.4971869736122287e-07 | 0.0001563528761692,2.493627607244877e-08,1.5113866658054666e-07 | ||||||
| 0.000152534027681,2.4591385101783997e-08,1.467976093017761e-07 | 0.0001536368140911,2.4667302328210823e-08,1.4818350881997277e-07 | ||||||
| 0.0001498880910245,2.432667443532368e-08,1.439317302908228e-07 | 0.0001509668468559,2.4401033945674264e-08,1.452843671077152e-07 | ||||||
| 0.0001472869464661,2.4064604800471338e-08,1.411200462508912e-07 | 0.0001483422079002,2.4137437022238145e-08,1.4244020864846993e-07 | ||||||
| 0.0001447314108795,2.3805175801260087e-08,1.3836305172259211e-07 | 0.0001457637135497,2.3876511018332856e-08,1.3965152374161321e-07 | ||||||
| 0.0001422206714078,2.3548353146553164e-08,1.3565967973526553e-07 | 0.0001432305385497,2.3618221073161605e-08,1.369172264569389e-07 | ||||||
| 0.0001397539300508,2.3294102880186107e-08,1.3300888438790536e-07 | 0.0001407418727912,2.3362532671027093e-08,1.342362523931659e-07 | ||||||
| 0.0001372700286953,2.3032485432340423e-08,1.3035230831596558e-07 | 0.0001382358967136,2.3099449050292612e-08,1.3154948565189317e-07 | ||||||
| 0.0001348306664569,2.2773547798807564e-08,1.277485195296911e-07 | 0.0001357749763134,2.283907541163823e-08,1.2891625322154978e-07 | ||||||
| 0.0001324350333325,2.2517253805739807e-08,1.2505815113074245e-07 | 0.0001333582893299,2.2581374993581207e-08,1.2619656354429104e-07 | ||||||
| 0.0001300835425363,2.2263580536243144e-08,1.2242454150816991e-07 | 0.0001309862438042,2.232632442642508e-08,1.2353438214155152e-07 | ||||||
| 0.0001277753479236,2.2012491805819457e-08,1.1984647647989558e-07 | 0.0001286579813897,2.2073886950323847e-08,1.2092847534724114e-07 | ||||||
| 0.0001255096202792,2.1763951788812352e-08,1.1732276843747534e-07 | 0.000126372660974,2.182402617504561e-08,1.1837763658356932e-07 | ||||||
| 0.0001232855464269,2.1517924960982367e-08,1.148522552473446e-07 | 0.0001241294577704,2.1576706021416435e-08,1.1588068523754277e-07 | ||||||
| 0.0001211034718808,2.1274400813402842e-08,1.1243486085670634e-07 | 0.0001219287137845,2.1331915734067192e-08,1.1343753674855828e-07 | ||||||
| 0.0001189625537742,2.1033343271785093e-08,1.100694052812587e-07 | 0.0001197695745451,2.108961868593061e-08,1.110469928559736e-07 | ||||||
| 0.0001168619671686,2.0794716623616593e-08,1.0775473577456182e-07 | 0.0001176512038143,2.08497786224886e-08,1.0870788304064741e-07 | ||||||
| 0.0001149842862687,2.0591381044652174e-08,1.056582342233035e-07 | 0.0001157575507964,2.064536482973696e-08,1.0658919731348233e-07 | ||||||
| 0.0001131392424142,2.038998454906055e-08,1.0360354473279054e-07 | 0.0001138968874049,2.0442910777630443e-08,1.0451285530046546e-07 | ||||||
| 0.0001113262252932,2.0190503422606346e-08,1.0158979943539652e-07 | 0.0001120685950893,2.0242392369145183e-08,1.0247797592009348e-07 | ||||||
| 0.0001095446965516,1.9992914861970927e-08,9.961620365200192e-08 | 0.0001102721277733,2.0043786431072003e-08,1.004837520181078e-07 | ||||||
| 0.0001077940670993,1.9797195630879305e-08,9.768192356581421e-08 | 0.0001085068885057,1.9847069357675e-08,9.852933720632749e-08 | ||||||
| 0.0001060737596438,1.9603322741072024e-08,9.578614349620901e-08 | 0.0001067722923259,1.96522177979178e-08,9.661390355735894e-08 | ||||||
| 0.0001043832080373,1.9411273409584944e-08,9.392806512410292e-08 | 0.0001050677655983,1.9459208611917452e-08,9.473664081358061e-08 | ||||||
| 0.0001027223865858,1.922103688152168e-08,9.210738192714242e-08 | 0.0001033932787473,1.9268030831168163e-08,9.289723486055733e-08 | ||||||
| 0.0001010907257366,1.9032590330084783e-08,9.032330177845482e-08 | 0.000101748254869,1.9078661277163014e-08,9.109488193990664e-08 | ||||||
| 9.948766769187398e-05,1.8845911172333032e-08,8.857505025129074e-08 | 0.0001001321289996,1.8891077021770737e-08,8.932879630040843e-08 | ||||||
| 9.792267601599324e-05,1.8663442661346744e-08,8.687075031773093e-08 | 9.855410305682533e-05,1.8707685556144628e-08,8.760688138727519e-08 | ||||||
| 9.638489299064336e-05,1.848276820506329e-08,8.550652733411691e-08 | 9.70035750524988e-05,1.8526106268805162e-08,8.622858338902384e-08 | ||||||
| 9.48738026587305e-05,1.830386814585904e-08,8.416598440502352e-08 | 9.54800221910602e-05,1.834631916025987e-08,8.487426418079828e-08 | ||||||
| 9.338895072626004e-05,1.8126723701740663e-08,8.284871850980459e-08 | 9.398298376195116e-05,1.816830511796191e-08,8.35435142269833e-08 | ||||||
| 9.192983962632808e-05,1.7951315790883015e-08,8.155428823884958e-08 | 9.251195567959074e-05,1.7992044730451886e-08,8.223588543496443e-08 | ||||||
| 9.049598195913348e-05,1.7777625631449783e-08,8.028226120215297e-08 | 9.106644418852578e-05,1.7817518892375448e-08,8.095093889480209e-08 | ||||||
| 8.908690001727453e-05,1.7605634715742614e-08,7.903221360818749e-08 | 8.964596537975902e-05,1.7644708778076547e-08,7.968824444928503e-08 | ||||||
| 8.77022482135352e-05,1.743532764682425e-08,7.780383887402493e-08 | 8.825016836609303e-05,1.7473598709850392e-08,7.844749018716727e-08 | ||||||
| 8.634156228069215e-05,1.7266686393258476e-08,7.659672513140668e-08 | 8.687858293497841e-05,1.7304170348281186e-08,7.722825812630736e-08 | ||||||
| 8.50043874741986e-05,1.7099693224424935e-08,7.541046895998541e-08 | 8.553074854577241e-05,1.7136405660531677e-08,7.603013888213162e-08 | ||||||
| 8.381694660770028e-05,1.6962933489525264e-08,7.43570471865261e-08 | 8.433358305815234e-05,1.6998940860777966e-08,7.496595249494088e-08 | ||||||
| 8.26484651987276e-05,1.682764479561346e-08,7.33204450340972e-08 | 8.315557511358139e-05,1.6862959916000355e-08,7.39187956635932e-08 | ||||||
| 8.149860566615124e-05,1.6693821025332528e-08,7.230036302225977e-08 | 8.199638277812437e-05,1.6728456488525712e-08,7.28883644355918e-08 | ||||||
| 8.036532369463753e-05,1.6561436760581683e-08,7.129498756488483e-08 | 8.085394966108952e-05,1.6595404781975636e-08,7.187283084061544e-08 | ||||||
| 7.924836834130927e-05,1.6430487594212236e-08,7.030409604146297e-08 | 7.972802118918304e-05,1.6463800186495995e-08,7.087196858293762e-08 | ||||||
| 7.814749266035204e-05,1.6300969571299207e-08,6.932746937742372e-08 | 7.861834686065792e-05,1.6333638547854104e-08,6.988555498611813e-08 | ||||||
| 7.706245353522453e-05,1.6172879193985398e-08,6.836489189528336e-08 | 7.752468007410017e-05,1.6204916172056103e-08,6.891337084080734e-08 | ||||||
| 7.599203524832233e-05,1.6046190191322708e-08,6.741528508795074e-08 | 7.644579608395804e-05,1.607760634807453e-08,6.795432744410053e-08 | ||||||
| 7.493604414299442e-05,1.5920900877281144e-08,6.647847715560108e-08 | 7.538149823706338e-05,1.5951707212505497e-08,6.700824998672802e-08 | ||||||
| 7.389428911314724e-05,1.57970100612018e-08,6.555429856110159e-08 | 7.433159248509273e-05,1.5827217400105257e-08,6.607496597492307e-08 | ||||||
| 7.268136514077581e-05,1.5628904744452727e-08,6.447826980203191e-08 | 7.310944660054646e-05,1.5658417045863033e-08,6.498857397068902e-08 | ||||||
| 7.148784598320314e-05,1.5462487634551132e-08,6.341945575654982e-08 | 7.190690836035234e-05,1.5491319571073834e-08,6.391961162711614e-08 | ||||||
|   | |||||||
| 
 | 
| @@ -4,6 +4,121 @@ WARNING  gnpy.tools.json_io:json_io.py | |||||||
| 	default value is type_variety = default | 	default value is type_variety = default | ||||||
|  |  | ||||||
| INFO     gnpy.tools.json_io:json_io.py Automatically converting requests from XLS to JSON | INFO     gnpy.tools.json_io:json_io.py Automatically converting requests from XLS to JSON | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py List of disjunctions: | ||||||
|  | [Disjunction 3 | ||||||
|  | 	relaxable:    false | ||||||
|  | 	link-diverse: True | ||||||
|  | 	node-diverse: True | ||||||
|  | 	request-id-numbers: ['3', '1'] | ||||||
|  | , Disjunction 4 | ||||||
|  | 	relaxable:    false | ||||||
|  | 	link-diverse: True | ||||||
|  | 	node-diverse: True | ||||||
|  | 	request-id-numbers: ['4', '5'] | ||||||
|  | ] | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py Aggregating similar requests | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py The following services have been requested: | ||||||
|  | [PathRequest 0 | ||||||
|  | 	source: 	trx Lorient_KMA | ||||||
|  | 	destination:	trx Vannes_KBE | ||||||
|  | 	trx type:	Voyager | ||||||
|  | 	trx mode:	None | ||||||
|  | 	baud_rate:	None Gbaud | ||||||
|  | 	bit_rate:	None Gb/s | ||||||
|  | 	spacing:	50.0 GHz | ||||||
|  | 	power:  	1.0 dBm | ||||||
|  | 	tx_power_dbm:  	0.0 dBm | ||||||
|  | 	nb channels: 	80 | ||||||
|  | 	path_bandwidth: 	100.0 Gbit/s | ||||||
|  | 	nodes-list:	[] | ||||||
|  | 	loose-list:	[] | ||||||
|  | , PathRequest 1 | ||||||
|  | 	source: 	trx Brest_KLA | ||||||
|  | 	destination:	trx Vannes_KBE | ||||||
|  | 	trx type:	Voyager | ||||||
|  | 	trx mode:	mode 1 | ||||||
|  | 	baud_rate:	32.0 Gbaud | ||||||
|  | 	bit_rate:	100.0 Gb/s | ||||||
|  | 	spacing:	50.0 GHz | ||||||
|  | 	power:  	1.0 dBm | ||||||
|  | 	tx_power_dbm:  	0.0 dBm | ||||||
|  | 	nb channels: 	95 | ||||||
|  | 	path_bandwidth: 	200.0 Gbit/s | ||||||
|  | 	nodes-list:	['roadm Brest_KLA', 'roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE'] | ||||||
|  | 	loose-list:	['LOOSE', 'LOOSE', 'LOOSE', 'LOOSE'] | ||||||
|  | , PathRequest 3 | ||||||
|  | 	source: 	trx Lannion_CAS | ||||||
|  | 	destination:	trx Rennes_STA | ||||||
|  | 	trx type:	vendorA_trx-type1 | ||||||
|  | 	trx mode:	mode 1 | ||||||
|  | 	baud_rate:	32.0 Gbaud | ||||||
|  | 	bit_rate:	100.0 Gb/s | ||||||
|  | 	spacing:	50.0 GHz | ||||||
|  | 	power:  	0.0 dBm | ||||||
|  | 	tx_power_dbm:  	0.0 dBm | ||||||
|  | 	nb channels: 	95 | ||||||
|  | 	path_bandwidth: 	60.0 Gbit/s | ||||||
|  | 	nodes-list:	[] | ||||||
|  | 	loose-list:	[] | ||||||
|  | , PathRequest 4 | ||||||
|  | 	source: 	trx Rennes_STA | ||||||
|  | 	destination:	trx Lannion_CAS | ||||||
|  | 	trx type:	vendorA_trx-type1 | ||||||
|  | 	trx mode:	None | ||||||
|  | 	baud_rate:	None Gbaud | ||||||
|  | 	bit_rate:	None Gb/s | ||||||
|  | 	spacing:	75.0 GHz | ||||||
|  | 	power:  	3.0 dBm | ||||||
|  | 	tx_power_dbm:  	0.0 dBm | ||||||
|  | 	nb channels: 	63 | ||||||
|  | 	path_bandwidth: 	150.0 Gbit/s | ||||||
|  | 	nodes-list:	[] | ||||||
|  | 	loose-list:	[] | ||||||
|  | , PathRequest 5 | ||||||
|  | 	source: 	trx Rennes_STA | ||||||
|  | 	destination:	trx Lannion_CAS | ||||||
|  | 	trx type:	vendorA_trx-type1 | ||||||
|  | 	trx mode:	mode 2 | ||||||
|  | 	baud_rate:	66.0 Gbaud | ||||||
|  | 	bit_rate:	200.0 Gb/s | ||||||
|  | 	spacing:	75.0 GHz | ||||||
|  | 	power:  	3.0 dBm | ||||||
|  | 	tx_power_dbm:  	0.0 dBm | ||||||
|  | 	nb channels: 	63 | ||||||
|  | 	path_bandwidth: 	20.0 Gbit/s | ||||||
|  | 	nodes-list:	[] | ||||||
|  | 	loose-list:	[] | ||||||
|  | , PathRequest 7 | 6 | ||||||
|  | 	source: 	trx Lannion_CAS | ||||||
|  | 	destination:	trx Lorient_KMA | ||||||
|  | 	trx type:	Voyager | ||||||
|  | 	trx mode:	mode 1 | ||||||
|  | 	baud_rate:	32.0 Gbaud | ||||||
|  | 	bit_rate:	100.0 Gb/s | ||||||
|  | 	spacing:	50.0 GHz | ||||||
|  | 	power:  	0.0 dBm | ||||||
|  | 	tx_power_dbm:  	0.0 dBm | ||||||
|  | 	nb channels: 	76 | ||||||
|  | 	path_bandwidth: 	700.0 Gbit/s | ||||||
|  | 	nodes-list:	[] | ||||||
|  | 	loose-list:	[] | ||||||
|  | , PathRequest 7b | ||||||
|  | 	source: 	trx Lannion_CAS | ||||||
|  | 	destination:	trx Lorient_KMA | ||||||
|  | 	trx type:	Voyager | ||||||
|  | 	trx mode:	mode 1 | ||||||
|  | 	baud_rate:	32.0 Gbaud | ||||||
|  | 	bit_rate:	100.0 Gb/s | ||||||
|  | 	spacing:	75.0 GHz | ||||||
|  | 	power:  	0.0 dBm | ||||||
|  | 	tx_power_dbm:  	0.0 dBm | ||||||
|  | 	nb channels: 	50 | ||||||
|  | 	path_bandwidth: 	400.0 Gbit/s | ||||||
|  | 	nodes-list:	[] | ||||||
|  | 	loose-list:	[] | ||||||
|  | ] | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py Propagating on selected path | ||||||
|  | WARNING  gnpy.topology.request:request.py Redesign the network for each request channel, using the request channel as the reference channel for the design. | ||||||
| INFO     gnpy.topology.request:request.py  | INFO     gnpy.topology.request:request.py  | ||||||
| 	request 0 | 	request 0 | ||||||
| 	Computing path from trx Lorient_KMA to trx Vannes_KBE | 	Computing path from trx Lorient_KMA to trx Vannes_KBE | ||||||
|   | |||||||
| @@ -3,6 +3,26 @@ WARNING  gnpy.tools.json_io:json_io.py | |||||||
| 	WARNING missing type_variety attribute in eqpt_config.json[Roadm] | 	WARNING missing type_variety attribute in eqpt_config.json[Roadm] | ||||||
| 	default value is type_variety = default | 	default value is type_variety = default | ||||||
|  |  | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py List of disjunctions: | ||||||
|  | [] | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py Aggregating similar requests | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py The following services have been requested: | ||||||
|  | [PathRequest 0 | ||||||
|  | 	source: 	trx Abilene | ||||||
|  | 	destination:	trx Albany | ||||||
|  | 	trx type:	Voyager | ||||||
|  | 	trx mode:	mode 3 | ||||||
|  | 	baud_rate:	44.0 Gbaud | ||||||
|  | 	bit_rate:	300.0 Gb/s | ||||||
|  | 	spacing:	62.50000000000001 GHz | ||||||
|  | 	power:  	0.0 dBm | ||||||
|  | 	tx_power_dbm:  	0.0 dBm | ||||||
|  | 	nb channels: 	76 | ||||||
|  | 	path_bandwidth: 	100.0 Gbit/s | ||||||
|  | 	nodes-list:	[] | ||||||
|  | 	loose-list:	[] | ||||||
|  | ] | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py Propagating on selected path | ||||||
| INFO     gnpy.topology.request:request.py  | INFO     gnpy.topology.request:request.py  | ||||||
| 	request 0 | 	request 0 | ||||||
| 	Computing path from trx Abilene to trx Albany | 	Computing path from trx Abilene to trx Albany | ||||||
|   | |||||||
| @@ -2,8 +2,8 @@ WARNING  gnpy.tools.json_io:json_io.py | |||||||
| 	WARNING missing type_variety attribute in eqpt_config.json[Roadm] | 	WARNING missing type_variety attribute in eqpt_config.json[Roadm] | ||||||
| 	default value is type_variety = default | 	default value is type_variety = default | ||||||
|  |  | ||||||
| INFO     gnpy.tools.cli_examples:cli_examples.py source = 'brest' | INFO     gnpy.tools.cli_examples:cli_examples.py source = 'trx Brest_KLA' | ||||||
| INFO     gnpy.tools.cli_examples:cli_examples.py destination = 'rennes' | INFO     gnpy.tools.cli_examples:cli_examples.py destination = 'trx Rennes_STA' | ||||||
| WARNING  gnpy.core.network:network.py  | WARNING  gnpy.core.network:network.py  | ||||||
| 	WARNING: target gain and power in node west edfa in Lorient_KMA to Loudeac | 	WARNING: target gain and power in node west edfa in Lorient_KMA to Loudeac | ||||||
| 	is beyond all available amplifiers capabilities and/or extended_gain_range: | 	is beyond all available amplifiers capabilities and/or extended_gain_range: | ||||||
| @@ -309,3 +309,70 @@ WARNING  gnpy.core.network:network.py | |||||||
| 	is beyond all available amplifiers capabilities and/or extended_gain_range: | 	is beyond all available amplifiers capabilities and/or extended_gain_range: | ||||||
| 	a power reduction of -1.78 is applied | 	a power reduction of -1.78 is applied | ||||||
|  |  | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py Power mode is set to True=> it can be modified in eqpt_config.json - Span | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py Now propagating between trx Brest_KLA and trx Rennes_STA | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py  | ||||||
|  | Channels propagating: (Input optical power deviation in span = 0.00dB, | ||||||
|  |                        spacing = 50.00GHz, | ||||||
|  |                        transceiver output power = 3.00dBm, | ||||||
|  |                        nb_channels = 95) | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py  | ||||||
|  | Channels propagating: (Input optical power deviation in span = 0.00dB, | ||||||
|  |                        spacing = 50.00GHz, | ||||||
|  |                        transceiver output power = 3.00dBm, | ||||||
|  |                        nb_channels = 95) | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py  | ||||||
|  | Channels propagating: (Input optical power deviation in span = 0.00dB, | ||||||
|  |                        spacing = 50.00GHz, | ||||||
|  |                        transceiver output power = 3.00dBm, | ||||||
|  |                        nb_channels = 95) | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py  | ||||||
|  | Channels propagating: (Input optical power deviation in span = 0.00dB, | ||||||
|  |                        spacing = 50.00GHz, | ||||||
|  |                        transceiver output power = 3.00dBm, | ||||||
|  |                        nb_channels = 95) | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py  | ||||||
|  | Channels propagating: (Input optical power deviation in span = 0.00dB, | ||||||
|  |                        spacing = 50.00GHz, | ||||||
|  |                        transceiver output power = 3.00dBm, | ||||||
|  |                        nb_channels = 95) | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py  | ||||||
|  | Channels propagating: (Input optical power deviation in span = 0.00dB, | ||||||
|  |                        spacing = 50.00GHz, | ||||||
|  |                        transceiver output power = 3.00dBm, | ||||||
|  |                        nb_channels = 95) | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py  | ||||||
|  | Channels propagating: (Input optical power deviation in span = 0.00dB, | ||||||
|  |                        spacing = 50.00GHz, | ||||||
|  |                        transceiver output power = 3.00dBm, | ||||||
|  |                        nb_channels = 95) | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py  | ||||||
|  | Channels propagating: (Input optical power deviation in span = 0.00dB, | ||||||
|  |                        spacing = 50.00GHz, | ||||||
|  |                        transceiver output power = 3.00dBm, | ||||||
|  |                        nb_channels = 95) | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py  | ||||||
|  | Channels propagating: (Input optical power deviation in span = 0.00dB, | ||||||
|  |                        spacing = 50.00GHz, | ||||||
|  |                        transceiver output power = 3.00dBm, | ||||||
|  |                        nb_channels = 95) | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py  | ||||||
|  | Channels propagating: (Input optical power deviation in span = 0.00dB, | ||||||
|  |                        spacing = 50.00GHz, | ||||||
|  |                        transceiver output power = 3.00dBm, | ||||||
|  |                        nb_channels = 95) | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py  | ||||||
|  | Channels propagating: (Input optical power deviation in span = 0.00dB, | ||||||
|  |                        spacing = 50.00GHz, | ||||||
|  |                        transceiver output power = 3.00dBm, | ||||||
|  |                        nb_channels = 95) | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py  | ||||||
|  | Channels propagating: (Input optical power deviation in span = 0.00dB, | ||||||
|  |                        spacing = 50.00GHz, | ||||||
|  |                        transceiver output power = 3.00dBm, | ||||||
|  |                        nb_channels = 95) | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py  | ||||||
|  | Channels propagating: (Input optical power deviation in span = 0.00dB, | ||||||
|  |                        spacing = 50.00GHz, | ||||||
|  |                        transceiver output power = 3.00dBm, | ||||||
|  |                        nb_channels = 95) | ||||||
|   | |||||||
| @@ -2,8 +2,8 @@ WARNING  gnpy.tools.json_io:json_io.py | |||||||
| 	WARNING missing type_variety attribute in eqpt_config.json[Roadm] | 	WARNING missing type_variety attribute in eqpt_config.json[Roadm] | ||||||
| 	default value is type_variety = default | 	default value is type_variety = default | ||||||
|  |  | ||||||
| INFO     gnpy.tools.cli_examples:cli_examples.py source = 'lannion' | INFO     gnpy.tools.cli_examples:cli_examples.py source = 'trx Lannion_CAS' | ||||||
| INFO     gnpy.tools.cli_examples:cli_examples.py destination = 'lorient' | INFO     gnpy.tools.cli_examples:cli_examples.py destination = 'trx Lorient_KMA' | ||||||
| WARNING  gnpy.core.network:network.py  | WARNING  gnpy.core.network:network.py  | ||||||
| 	WARNING: target gain and power in node west edfa in Lorient_KMA to Loudeac | 	WARNING: target gain and power in node west edfa in Lorient_KMA to Loudeac | ||||||
| 	is beyond all available amplifiers capabilities and/or extended_gain_range: | 	is beyond all available amplifiers capabilities and/or extended_gain_range: | ||||||
| @@ -309,3 +309,10 @@ WARNING  gnpy.core.network:network.py | |||||||
| 	is beyond all available amplifiers capabilities and/or extended_gain_range: | 	is beyond all available amplifiers capabilities and/or extended_gain_range: | ||||||
| 	a power reduction of -1.82 is applied | 	a power reduction of -1.82 is applied | ||||||
|  |  | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py Power mode is set to True=> it can be modified in eqpt_config.json - Span | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py Now propagating between trx Lannion_CAS and trx Lorient_KMA | ||||||
|  | INFO     gnpy.tools.worker_utils:worker_utils.py  | ||||||
|  | Channels propagating: (Input optical power deviation in span = 0.00dB, | ||||||
|  |                        spacing = 50.00GHz, | ||||||
|  |                        transceiver output power = 3.00dBm, | ||||||
|  |                        nb_channels = 96) | ||||||
|   | |||||||
							
								
								
									
										294
									
								
								tests/invocation/multiband_transmission
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										294
									
								
								tests/invocation/multiband_transmission
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,294 @@ | |||||||
|  | User input for spectrum used for propagation instead of SI | ||||||
|  | Power mode is set to True | ||||||
|  | => it can be modified in eqpt_config.json - Span | ||||||
|  |  | ||||||
|  | There are 3 fiber spans over 240 km between trx Site_A and trx Site_D | ||||||
|  |  | ||||||
|  | Now propagating between trx Site_A and trx Site_D: | ||||||
|  | Reference used for design: (Input optical power reference in span = 0.00dBm, | ||||||
|  |                             spacing = 50.00GHz | ||||||
|  |                             nb_channels = 76) | ||||||
|  |  | ||||||
|  | Channels propagating: (Input optical power deviation in span = cband: 0.00, lband: 0.00dB, | ||||||
|  |                        spacing = cband: 50.00, lband: 50.00GHz, | ||||||
|  |                        transceiver output power = cband: 0.00, lband: 0.00dBm, | ||||||
|  |                        nb_channels = 149) | ||||||
|  | Input optical power reference in span = [1;36;40m0.00 dBm[0m: | ||||||
|  | Transceiver trx Site_A | ||||||
|  |   GSNR (0.1nm, dB):          cband: 40.00, lband: 40.00 | ||||||
|  |   GSNR (signal bw, dB):      cband: 35.92, lband: 35.92 | ||||||
|  |   OSNR ASE (0.1nm, dB):      cband: 40.00, lband: 40.00 | ||||||
|  |   OSNR ASE (signal bw, dB):  cband: 35.92, lband: 35.92 | ||||||
|  |   CD (ps/nm):                0.00 | ||||||
|  |   PMD (ps):                  0.00 | ||||||
|  |   PDL (dB):                  0.00 | ||||||
|  |   Latency (ms):              0.00 | ||||||
|  |   Actual pch out (dBm):      cband: 0.00, lband: 0.00 | ||||||
|  | Roadm roadm Site_A | ||||||
|  |   Type_variety:            default | ||||||
|  |   Reference loss (dB):     20.00 | ||||||
|  |   Actual loss (dB):        cband: 20.00, lband: 20.00 | ||||||
|  |   Reference pch out (dBm): -20.00 | ||||||
|  |   Actual pch out (dBm):    cband: -20.00, lband: -20.00 | ||||||
|  | Multiband_amplifier east edfa in Site_A to Site_B | ||||||
|  |   type_variety:           std_medium_gain_multiband | ||||||
|  |   type_variety:           std_medium_gain_C    type_variety:           std_medium_gain_L   | ||||||
|  |   effective gain(dB):     20.90                effective gain(dB):     22.19               | ||||||
|  |   (before att_in and before output VOA)        (before att_in and before output VOA)       | ||||||
|  |   tilt-target(dB)         0.00                 tilt-target(dB)         0.00                | ||||||
|  |   noise figure (dB):      6.38                 noise figure (dB):      6.19                | ||||||
|  |   (including att_in)                           (including att_in)                          | ||||||
|  |   pad att_in (dB):        0.00                 pad att_in (dB):        0.00                | ||||||
|  |   Power In (dBm):         -1.08                Power In (dBm):         -1.49               | ||||||
|  |   Power Out (dBm):        19.83                Power Out (dBm):        20.71               | ||||||
|  |   Delta_P (dB):           0.90                 Delta_P (dB):           2.19                | ||||||
|  |   target pch (dBm):       0.90                 target pch (dBm):       3.00                | ||||||
|  |   actual pch out (dBm):   -2.09                actual pch out (dBm):   -0.80               | ||||||
|  |   output VOA (dB):        3.00                 output VOA (dB):        3.00                | ||||||
|  | Fiber          fiber (Site_A → Site_B)- | ||||||
|  |   type_variety:                SSMF | ||||||
|  |   length (km):                 75.00 | ||||||
|  |   pad att_in (dB):             0.00 | ||||||
|  |   total loss (dB):             15.00 | ||||||
|  |   (includes conn loss (dB) in: 0.00 out: 0.00) | ||||||
|  |   (conn loss out includes EOL margin defined in eqpt_config.json) | ||||||
|  |   reference pch out (dBm):     -17.10 | ||||||
|  |   actual pch out (dBm):        cband: -17.09, lband: -15.80 | ||||||
|  | Multiband_amplifier east edfa in Site_B to Site_C | ||||||
|  |   type_variety:           std_medium_gain_multiband | ||||||
|  |   type_variety:           std_medium_gain_C    type_variety:           std_medium_gain_L   | ||||||
|  |   effective gain(dB):     18.00                effective gain(dB):     18.00               | ||||||
|  |   (before att_in and before output VOA)        (before att_in and before output VOA)       | ||||||
|  |   tilt-target(dB)         0.00                 tilt-target(dB)         0.00                | ||||||
|  |   noise figure (dB):      7.38                 noise figure (dB):      7.38                | ||||||
|  |   (including att_in)                           (including att_in)                          | ||||||
|  |   pad att_in (dB):        0.00                 pad att_in (dB):        0.00                | ||||||
|  |   Power In (dBm):         1.83                 Power In (dBm):         2.71                | ||||||
|  |   Power Out (dBm):        19.84                Power Out (dBm):        20.72               | ||||||
|  |   Delta_P (dB):           0.90                 Delta_P (dB):           2.19                | ||||||
|  |   target pch (dBm):       0.90                 target pch (dBm):       3.00                | ||||||
|  |   actual pch out (dBm):   -2.09                actual pch out (dBm):   -0.79               | ||||||
|  |   output VOA (dB):        3.00                 output VOA (dB):        3.00                | ||||||
|  | Fiber          fiber (Site_B → Site_C)- | ||||||
|  |   type_variety:                SSMF | ||||||
|  |   length (km):                 80.00 | ||||||
|  |   pad att_in (dB):             0.00 | ||||||
|  |   total loss (dB):             16.80 | ||||||
|  |   (includes conn loss (dB) in: 0.00 out: 0.00) | ||||||
|  |   (conn loss out includes EOL margin defined in eqpt_config.json) | ||||||
|  |   reference pch out (dBm):     -18.90 | ||||||
|  |   actual pch out (dBm):        cband: -18.88, lband: -17.59 | ||||||
|  | Multiband_amplifier east edfa in Site_C to Site_D | ||||||
|  |   type_variety:           std_medium_gain_multiband | ||||||
|  |   type_variety:           std_medium_gain_C    type_variety:           std_medium_gain_L   | ||||||
|  |   effective gain(dB):     19.80                effective gain(dB):     19.80               | ||||||
|  |   (before att_in and before output VOA)        (before att_in and before output VOA)       | ||||||
|  |   tilt-target(dB)         0.00                 tilt-target(dB)         0.00                | ||||||
|  |   noise figure (dB):      6.63                 noise figure (dB):      6.63                | ||||||
|  |   (including att_in)                           (including att_in)                          | ||||||
|  |   pad att_in (dB):        0.00                 pad att_in (dB):        0.00                | ||||||
|  |   Power In (dBm):         0.04                 Power In (dBm):         0.92                | ||||||
|  |   Power Out (dBm):        19.84                Power Out (dBm):        20.72               | ||||||
|  |   Delta_P (dB):           0.90                 Delta_P (dB):           2.19                | ||||||
|  |   target pch (dBm):       0.90                 target pch (dBm):       3.00                | ||||||
|  |   actual pch out (dBm):   -2.08                actual pch out (dBm):   -0.79               | ||||||
|  |   output VOA (dB):        3.00                 output VOA (dB):        3.00                | ||||||
|  | Fiber          fiber (Site_C → Site_D)- | ||||||
|  |   type_variety:                SSMF | ||||||
|  |   length (km):                 85.00 | ||||||
|  |   pad att_in (dB):             0.00 | ||||||
|  |   total loss (dB):             18.70 | ||||||
|  |   (includes conn loss (dB) in: 0.00 out: 0.00) | ||||||
|  |   (conn loss out includes EOL margin defined in eqpt_config.json) | ||||||
|  |   reference pch out (dBm):     -20.80 | ||||||
|  |   actual pch out (dBm):        cband: -20.78, lband: -19.49 | ||||||
|  | Multiband_amplifier west edfa in Site_D to Site_C | ||||||
|  |   type_variety:           std_medium_gain_multiband | ||||||
|  |   type_variety:           std_medium_gain_C    type_variety:           std_medium_gain_L   | ||||||
|  |   effective gain(dB):     21.70                effective gain(dB):     21.70               | ||||||
|  |   (before att_in and before output VOA)        (before att_in and before output VOA)       | ||||||
|  |   tilt-target(dB)         0.00                 tilt-target(dB)         0.00                | ||||||
|  |   noise figure (dB):      6.25                 noise figure (dB):      6.25                | ||||||
|  |   (including att_in)                           (including att_in)                          | ||||||
|  |   pad att_in (dB):        0.00                 pad att_in (dB):        0.00                | ||||||
|  |   Power In (dBm):         -1.85                Power In (dBm):         -0.97               | ||||||
|  |   Power Out (dBm):        19.85                Power Out (dBm):        20.73               | ||||||
|  |   Delta_P (dB):           0.90                 Delta_P (dB):           2.19                | ||||||
|  |   target pch (dBm):       0.90                 target pch (dBm):       3.00                | ||||||
|  |   actual pch out (dBm):   -2.07                actual pch out (dBm):   -0.78               | ||||||
|  |   output VOA (dB):        3.00                 output VOA (dB):        3.00                | ||||||
|  | Roadm roadm Site_D | ||||||
|  |   Type_variety:            default | ||||||
|  |   Reference loss (dB):     17.90 | ||||||
|  |   Actual loss (dB):        cband: 17.93, lband: 19.22 | ||||||
|  |   Reference pch out (dBm): -20.00 | ||||||
|  |   Actual pch out (dBm):    cband: -20.00, lband: -20.00 | ||||||
|  | Transceiver trx Site_D | ||||||
|  |   GSNR (0.1nm, dB):          cband: 24.89, lband: 25.36 | ||||||
|  |   GSNR (signal bw, dB):      cband: 20.80, lband: 21.28 | ||||||
|  |   OSNR ASE (0.1nm, dB):      cband: 25.55, lband: 26.51 | ||||||
|  |   OSNR ASE (signal bw, dB):  cband: 21.47, lband: 22.43 | ||||||
|  |   CD (ps/nm):                4008.00 | ||||||
|  |   PMD (ps):                  0.62 | ||||||
|  |   PDL (dB):                  0.00 | ||||||
|  |   Latency (ms):              1.18 | ||||||
|  |   Actual pch out (dBm):      cband: 0.00, lband: 0.00 | ||||||
|  |  | ||||||
|  | Transmission result for input optical power reference in span = 0.00 dBm: | ||||||
|  |   Final GSNR (0.1 nm): [1;36;40m25.11 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                 186.55000                    -20.03                       22.46                       29.10                       21.61 | ||||||
|  |     2                 186.60000                    -20.03                       22.46                       28.59                       21.51 | ||||||
|  |     3                 186.65000                    -20.03                       22.46                       28.36                       21.47 | ||||||
|  |     4                 186.70000                    -20.03                       22.46                       28.22                       21.44 | ||||||
|  |     5                 186.75000                    -20.03                       22.46                       28.12                       21.41 | ||||||
|  |     6                 186.80000                    -20.03                       22.46                       28.04                       21.40 | ||||||
|  |     7                 186.85000                    -20.03                       22.46                       27.98                       21.38 | ||||||
|  |     8                 186.90000                    -20.03                       22.45                       27.92                       21.37 | ||||||
|  |     9                 186.95000                    -20.03                       22.45                       27.88                       21.36 | ||||||
|  |    10                 187.00000                    -20.03                       22.45                       27.84                       21.35 | ||||||
|  |    11                 187.05000                    -20.03                       22.45                       27.80                       21.34 | ||||||
|  |    12                 187.10000                    -20.03                       22.45                       27.77                       21.33 | ||||||
|  |    13                 187.15000                    -20.03                       22.45                       27.74                       21.32 | ||||||
|  |    14                 187.20000                    -20.03                       22.45                       27.71                       21.32 | ||||||
|  |    15                 187.25000                    -20.03                       22.45                       27.69                       21.31 | ||||||
|  |    16                 187.30000                    -20.03                       22.45                       27.67                       21.31 | ||||||
|  |    17                 187.35000                    -20.03                       22.45                       27.65                       21.30 | ||||||
|  |    18                 187.40000                    -20.03                       22.44                       27.63                       21.29 | ||||||
|  |    19                 187.45000                    -20.03                       22.44                       27.61                       21.29 | ||||||
|  |    20                 187.50000                    -20.03                       22.44                       27.60                       21.29 | ||||||
|  |    21                 187.55000                    -20.03                       22.44                       27.58                       21.28 | ||||||
|  |    22                 187.60000                    -20.03                       22.44                       27.57                       21.28 | ||||||
|  |    23                 187.65000                    -20.03                       22.44                       27.55                       21.27 | ||||||
|  |    24                 187.70000                    -20.03                       22.44                       27.54                       21.27 | ||||||
|  |    25                 187.75000                    -20.03                       22.44                       27.53                       21.27 | ||||||
|  |    26                 187.80000                    -20.03                       22.44                       27.52                       21.26 | ||||||
|  |    27                 187.85000                    -20.03                       22.44                       27.51                       21.26 | ||||||
|  |    28                 187.90000                    -20.03                       22.43                       27.50                       21.26 | ||||||
|  |    29                 187.95000                    -20.03                       22.43                       27.49                       21.25 | ||||||
|  |    30                 188.00000                    -20.03                       22.43                       27.48                       21.25 | ||||||
|  |    31                 188.05000                    -20.03                       22.43                       27.47                       21.25 | ||||||
|  |    32                 188.10000                    -20.03                       22.43                       27.47                       21.25 | ||||||
|  |    33                 188.15000                    -20.03                       22.43                       27.46                       21.24 | ||||||
|  |    34                 188.20000                    -20.03                       22.43                       27.45                       21.24 | ||||||
|  |    35                 188.25000                    -20.03                       22.43                       27.45                       21.24 | ||||||
|  |    36                 188.30000                    -20.03                       22.43                       27.44                       21.24 | ||||||
|  |    37                 188.35000                    -20.03                       22.43                       27.44                       21.23 | ||||||
|  |    38                 188.40000                    -20.03                       22.42                       27.43                       21.23 | ||||||
|  |    39                 188.45000                    -20.03                       22.42                       27.43                       21.23 | ||||||
|  |    40                 188.50000                    -20.03                       22.42                       27.43                       21.23 | ||||||
|  |    41                 188.55000                    -20.03                       22.42                       27.42                       21.23 | ||||||
|  |    42                 188.60000                    -20.03                       22.42                       27.42                       21.23 | ||||||
|  |    43                 188.65000                    -20.03                       22.42                       27.42                       21.23 | ||||||
|  |    44                 188.70000                    -20.03                       22.42                       27.42                       21.22 | ||||||
|  |    45                 188.75000                    -20.03                       22.42                       27.42                       21.22 | ||||||
|  |    46                 188.80000                    -20.03                       22.42                       27.42                       21.22 | ||||||
|  |    47                 188.85000                    -20.03                       22.41                       27.42                       21.22 | ||||||
|  |    48                 188.90000                    -20.03                       22.41                       27.42                       21.22 | ||||||
|  |    49                 188.95000                    -20.03                       22.41                       27.42                       21.22 | ||||||
|  |    50                 189.00000                    -20.03                       22.41                       27.43                       21.22 | ||||||
|  |    51                 189.05000                    -20.03                       22.41                       27.43                       21.22 | ||||||
|  |    52                 189.10000                    -20.03                       22.41                       27.44                       21.22 | ||||||
|  |    53                 189.15000                    -20.03                       22.41                       27.44                       21.22 | ||||||
|  |    54                 189.20000                    -20.03                       22.41                       27.45                       21.22 | ||||||
|  |    55                 189.25000                    -20.03                       22.41                       27.46                       21.23 | ||||||
|  |    56                 189.30000                    -20.03                       22.41                       27.46                       21.23 | ||||||
|  |    57                 189.35000                    -20.03                       22.40                       27.47                       21.23 | ||||||
|  |    58                 189.40000                    -20.03                       22.40                       27.49                       21.23 | ||||||
|  |    59                 189.45000                    -20.03                       22.40                       27.50                       21.23 | ||||||
|  |    60                 189.50000                    -20.03                       22.40                       27.51                       21.24 | ||||||
|  |    61                 189.55000                    -20.03                       22.40                       27.53                       21.24 | ||||||
|  |    62                 189.60000                    -20.03                       22.40                       27.55                       21.24 | ||||||
|  |    63                 189.65000                    -20.03                       22.40                       27.58                       21.25 | ||||||
|  |    64                 189.70000                    -20.03                       22.40                       27.60                       21.25 | ||||||
|  |    65                 189.75000                    -20.03                       22.40                       27.63                       21.26 | ||||||
|  |    66                 189.80000                    -20.03                       22.40                       27.67                       21.27 | ||||||
|  |    67                 189.85000                    -20.03                       22.39                       27.72                       21.28 | ||||||
|  |    68                 189.90000                    -20.03                       22.39                       27.78                       21.29 | ||||||
|  |    69                 189.95000                    -20.03                       22.39                       27.86                       21.31 | ||||||
|  |    70                 190.00000                    -20.03                       22.39                       27.97                       21.33 | ||||||
|  |    71                 190.05000                    -20.03                       22.39                       28.21                       21.38 | ||||||
|  |    72                 191.25000                    -20.03                       21.51                       28.66                       20.74 | ||||||
|  |    73                 191.30000                    -20.03                       21.51                       28.96                       20.79 | ||||||
|  |    74                 191.35000                    -20.03                       21.51                       29.16                       20.82 | ||||||
|  |    75                 191.40000                    -20.03                       21.50                       29.32                       20.84 | ||||||
|  |    76                 191.45000                    -20.03                       21.50                       29.51                       20.87 | ||||||
|  |    77                 191.50000                    -20.03                       21.50                       29.75                       20.90 | ||||||
|  |    78                 191.55000                    -20.03                       21.50                       30.22                       20.95 | ||||||
|  |    79                 191.60000                    -20.03                       21.50                       30.96                       21.03 | ||||||
|  |    80                 191.65000                    -20.03                       21.50                       30.46                       20.98 | ||||||
|  |    81                 191.70000                    -20.03                       21.50                       30.23                       20.95 | ||||||
|  |    82                 191.75000                    -20.03                       21.50                       30.08                       20.93 | ||||||
|  |    83                 191.80000                    -20.03                       21.50                       29.97                       20.92 | ||||||
|  |    84                 191.85000                    -20.03                       21.50                       29.88                       20.91 | ||||||
|  |    85                 191.90000                    -20.03                       21.49                       29.81                       20.90 | ||||||
|  |    86                 191.95000                    -20.03                       21.49                       29.75                       20.89 | ||||||
|  |    87                 192.00000                    -20.03                       21.49                       29.70                       20.88 | ||||||
|  |    88                 192.05000                    -20.03                       21.49                       29.65                       20.87 | ||||||
|  |    89                 192.10000                    -20.03                       21.49                       29.61                       20.87 | ||||||
|  |    90                 192.15000                    -20.03                       21.49                       29.57                       20.86 | ||||||
|  |    91                 192.20000                    -20.03                       21.49                       29.54                       20.86 | ||||||
|  |    92                 192.25000                    -20.03                       21.49                       29.50                       20.85 | ||||||
|  |    93                 192.30000                    -20.03                       21.49                       29.47                       20.85 | ||||||
|  |    94                 192.35000                    -20.03                       21.49                       29.44                       20.84 | ||||||
|  |    95                 192.40000                    -20.03                       21.48                       29.42                       20.84 | ||||||
|  |    96                 192.45000                    -20.03                       21.48                       29.39                       20.83 | ||||||
|  |    97                 192.50000                    -20.03                       21.48                       29.37                       20.83 | ||||||
|  |    98                 192.55000                    -20.03                       21.48                       29.35                       20.82 | ||||||
|  |    99                 192.60000                    -20.03                       21.48                       29.33                       20.82 | ||||||
|  |   100                 192.65000                    -20.03                       21.48                       29.31                       20.82 | ||||||
|  |   101                 192.70000                    -20.03                       21.48                       29.29                       20.81 | ||||||
|  |   102                 192.75000                    -20.03                       21.48                       29.27                       20.81 | ||||||
|  |   103                 192.80000                    -20.03                       21.48                       29.25                       20.81 | ||||||
|  |   104                 192.85000                    -20.03                       21.47                       29.23                       20.80 | ||||||
|  |   105                 192.90000                    -20.03                       21.47                       29.22                       20.80 | ||||||
|  |   106                 192.95000                    -20.03                       21.47                       29.20                       20.80 | ||||||
|  |   107                 193.00000                    -20.03                       21.47                       29.18                       20.79 | ||||||
|  |   108                 193.05000                    -20.03                       21.47                       29.17                       20.79 | ||||||
|  |   109                 193.10000                    -20.03                       21.47                       29.16                       20.79 | ||||||
|  |   110                 193.15000                    -20.03                       21.47                       29.14                       20.78 | ||||||
|  |   111                 193.20000                    -20.03                       21.47                       29.13                       20.78 | ||||||
|  |   112                 193.25000                    -20.03                       21.47                       29.12                       20.78 | ||||||
|  |   113                 193.30000                    -20.03                       21.47                       29.10                       20.78 | ||||||
|  |   114                 193.35000                    -20.03                       21.46                       29.09                       20.77 | ||||||
|  |   115                 193.40000                    -20.03                       21.46                       29.08                       20.77 | ||||||
|  |   116                 193.45000                    -20.03                       21.46                       29.07                       20.77 | ||||||
|  |   117                 193.50000                    -20.03                       21.46                       29.06                       20.77 | ||||||
|  |   118                 193.55000                    -20.03                       21.46                       29.05                       20.76 | ||||||
|  |   119                 193.60000                    -20.03                       21.46                       29.04                       20.76 | ||||||
|  |   120                 193.65000                    -20.03                       21.46                       29.03                       20.76 | ||||||
|  |   121                 193.70000                    -20.03                       21.46                       29.02                       20.76 | ||||||
|  |   122                 193.75000                    -20.03                       21.46                       29.01                       20.75 | ||||||
|  |   123                 193.80000                    -20.03                       21.46                       29.00                       20.75 | ||||||
|  |   124                 193.85000                    -20.03                       21.45                       28.99                       20.75 | ||||||
|  |   125                 193.90000                    -20.03                       21.45                       28.99                       20.75 | ||||||
|  |   126                 193.95000                    -20.03                       21.45                       28.98                       20.75 | ||||||
|  |   127                 194.00000                    -20.03                       21.45                       28.97                       20.74 | ||||||
|  |   128                 194.05000                    -20.03                       21.45                       28.97                       20.74 | ||||||
|  |   129                 194.10000                    -20.03                       21.45                       28.96                       20.74 | ||||||
|  |   130                 194.15000                    -20.03                       21.45                       28.96                       20.74 | ||||||
|  |   131                 194.20000                    -20.03                       21.45                       28.96                       20.74 | ||||||
|  |   132                 194.25000                    -20.03                       21.45                       28.95                       20.74 | ||||||
|  |   133                 194.30000                    -20.03                       21.45                       28.95                       20.74 | ||||||
|  |   134                 194.35000                    -20.03                       21.44                       28.95                       20.73 | ||||||
|  |   135                 194.40000                    -20.03                       21.44                       28.95                       20.73 | ||||||
|  |   136                 194.45000                    -20.03                       21.44                       28.95                       20.73 | ||||||
|  |   137                 194.50000                    -20.03                       21.44                       28.96                       20.73 | ||||||
|  |   138                 194.55000                    -20.03                       21.44                       28.96                       20.73 | ||||||
|  |   139                 194.60000                    -20.03                       21.44                       28.97                       20.73 | ||||||
|  |   140                 194.65000                    -20.03                       21.44                       28.98                       20.73 | ||||||
|  |   141                 194.70000                    -20.03                       21.44                       28.99                       20.74 | ||||||
|  |   142                 194.75000                    -20.03                       21.44                       29.01                       20.74 | ||||||
|  |   143                 194.80000                    -20.03                       21.44                       29.04                       20.74 | ||||||
|  |   144                 194.85000                    -20.03                       21.43                       29.07                       20.74 | ||||||
|  |   145                 194.90000                    -20.03                       21.43                       29.12                       20.75 | ||||||
|  |   146                 194.95000                    -20.03                       21.43                       29.18                       20.76 | ||||||
|  |   147                 195.00000                    -20.03                       21.43                       29.28                       20.77 | ||||||
|  |   148                 195.05000                    -20.03                       21.43                       29.44                       20.79 | ||||||
|  |   149                 195.10000                    -20.03                       21.43                       29.84                       20.84 | ||||||
|  |  | ||||||
|  | (Invalid source node 'Site_A' replaced with trx Site_A) | ||||||
|  |  | ||||||
|  | (Invalid destination node 'Site_D' replaced with trx Site_D) | ||||||
| @@ -1,12 +1,18 @@ | |||||||
| There are 96 channels propagating |  | ||||||
| Power mode is set to True | Power mode is set to True | ||||||
| => it can be modified in eqpt_config.json - Span | => it can be modified in eqpt_config.json - Span | ||||||
|  |  | ||||||
| There are 6 fiber spans over 500 km between trx_Stockholm and trx_Gothenburg | There are 6 fiber spans over 500 km between trx_Stockholm and trx_Gothenburg | ||||||
|  |  | ||||||
| Now propagating between trx_Stockholm and trx_Gothenburg: | Now propagating between trx_Stockholm and trx_Gothenburg: | ||||||
|  | Reference used for design: (Input optical power reference in span = 2.00dBm, | ||||||
|  |                             spacing = 50.00GHz | ||||||
|  |                             nb_channels = 96) | ||||||
|  |  | ||||||
| Propagating with input power = [1;36;40m2.00 dBm[0m: | Channels propagating: (Input optical power deviation in span = 0.00dB, | ||||||
|  |                        spacing = 50.00GHz, | ||||||
|  |                        transceiver output power = 2.00dBm, | ||||||
|  |                        nb_channels = 96) | ||||||
|  | Input optical power reference in span = [1;36;40m2.00 dBm[0m: | ||||||
| Transceiver trx_Stockholm | Transceiver trx_Stockholm | ||||||
|   GSNR (0.1nm, dB):          35.00 |   GSNR (0.1nm, dB):          35.00 | ||||||
|   GSNR (signal bw, dB):      30.98 |   GSNR (signal bw, dB):      30.98 | ||||||
| @@ -27,6 +33,7 @@ Edfa Edfa_booster_roadm_Stockholm_to_fiber (Stockholm → Norrköping)_(1/2) | |||||||
|   type_variety:           openroadm_mw_mw_booster |   type_variety:           openroadm_mw_mw_booster | ||||||
|   effective gain(dB):     22.00 |   effective gain(dB):     22.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      -inf |   noise figure (dB):      -inf | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -49,6 +56,7 @@ Edfa Edfa_fiber (Stockholm → Norrköping)_(1/2) | |||||||
|   type_variety:           openroadm_ila_low_noise |   type_variety:           openroadm_ila_low_noise | ||||||
|   effective gain(dB):     16.33 |   effective gain(dB):     16.33 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.01 |   noise figure (dB):      8.01 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -71,6 +79,7 @@ Edfa Edfa_preamp_roadm_Norrköping_from_fiber (Stockholm → Norrköping)_(2/2) | |||||||
|   type_variety:           openroadm_mw_mw_preamp |   type_variety:           openroadm_mw_mw_preamp | ||||||
|   effective gain(dB):     16.33 |   effective gain(dB):     16.33 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      12.59 |   noise figure (dB):      12.59 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -90,6 +99,7 @@ Edfa Edfa_booster_roadm_Norrköping_to_fiber (Norrköping → Linköping) | |||||||
|   type_variety:           openroadm_mw_mw_booster |   type_variety:           openroadm_mw_mw_booster | ||||||
|   effective gain(dB):     22.00 |   effective gain(dB):     22.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      -inf |   noise figure (dB):      -inf | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -112,6 +122,7 @@ Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping) | |||||||
|   type_variety:           openroadm_mw_mw_preamp |   type_variety:           openroadm_mw_mw_preamp | ||||||
|   effective gain(dB):     11.00 |   effective gain(dB):     11.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      16.00 |   noise figure (dB):      16.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -131,6 +142,7 @@ Edfa Edfa_booster_roadm_Linköping_to_fiber (Linköping → Jönköping) | |||||||
|   type_variety:           openroadm_mw_mw_booster |   type_variety:           openroadm_mw_mw_booster | ||||||
|   effective gain(dB):     22.00 |   effective gain(dB):     22.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      -inf |   noise figure (dB):      -inf | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -153,6 +165,7 @@ Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping) | |||||||
|   type_variety:           openroadm_mw_mw_preamp |   type_variety:           openroadm_mw_mw_preamp | ||||||
|   effective gain(dB):     26.80 |   effective gain(dB):     26.80 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.09 |   noise figure (dB):      8.09 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -172,6 +185,7 @@ Edfa Edfa_booster_roadm_Jönköping_to_fiber (Jönköping → Borås) | |||||||
|   type_variety:           openroadm_mw_mw_booster |   type_variety:           openroadm_mw_mw_booster | ||||||
|   effective gain(dB):     22.00 |   effective gain(dB):     22.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      -inf |   noise figure (dB):      -inf | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -194,6 +208,7 @@ Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås) | |||||||
|   type_variety:           openroadm_mw_mw_preamp |   type_variety:           openroadm_mw_mw_preamp | ||||||
|   effective gain(dB):     17.82 |   effective gain(dB):     17.82 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      11.94 |   noise figure (dB):      11.94 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -213,6 +228,7 @@ Edfa Edfa_booster_roadm_Borås_to_fiber (Borås → Gothenburg) | |||||||
|   type_variety:           openroadm_mw_mw_booster |   type_variety:           openroadm_mw_mw_booster | ||||||
|   effective gain(dB):     22.00 |   effective gain(dB):     22.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      -inf |   noise figure (dB):      -inf | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -235,6 +251,7 @@ Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg) | |||||||
|   type_variety:           openroadm_mw_mw_preamp |   type_variety:           openroadm_mw_mw_preamp | ||||||
|   effective gain(dB):     13.53 |   effective gain(dB):     13.53 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      13.78 |   noise figure (dB):      13.78 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -261,7 +278,7 @@ Transceiver trx_Gothenburg | |||||||
|   Latency (ms):              2.45 |   Latency (ms):              2.45 | ||||||
|   Actual pch out (dBm):      2.00 |   Actual pch out (dBm):      2.00 | ||||||
|  |  | ||||||
| Transmission result for input power = 2.00 dBm: | Transmission result for input optical power reference in span = 2.00 dBm: | ||||||
|   Final GSNR (0.1 nm): [1;36;40m18.89 dB[0m |   Final GSNR (0.1 nm): [1;36;40m18.89 dB[0m | ||||||
|  |  | ||||||
| (No source node specified: picked trx_Stockholm) | (No source node specified: picked trx_Stockholm) | ||||||
|   | |||||||
| @@ -1,12 +1,18 @@ | |||||||
| There are 96 channels propagating |  | ||||||
| Power mode is set to True | Power mode is set to True | ||||||
| => it can be modified in eqpt_config.json - Span | => it can be modified in eqpt_config.json - Span | ||||||
|  |  | ||||||
| There are 6 fiber spans over 500 km between trx_Stockholm and trx_Gothenburg | There are 6 fiber spans over 500 km between trx_Stockholm and trx_Gothenburg | ||||||
|  |  | ||||||
| Now propagating between trx_Stockholm and trx_Gothenburg: | Now propagating between trx_Stockholm and trx_Gothenburg: | ||||||
|  | Reference used for design: (Input optical power reference in span = 2.00dBm, | ||||||
|  |                             spacing = 50.00GHz | ||||||
|  |                             nb_channels = 96) | ||||||
|  |  | ||||||
| Propagating with input power = [1;36;40m2.00 dBm[0m: | Channels propagating: (Input optical power deviation in span = 0.00dB, | ||||||
|  |                        spacing = 50.00GHz, | ||||||
|  |                        transceiver output power = 2.00dBm, | ||||||
|  |                        nb_channels = 96) | ||||||
|  | Input optical power reference in span = [1;36;40m2.00 dBm[0m: | ||||||
| Transceiver trx_Stockholm | Transceiver trx_Stockholm | ||||||
|   GSNR (0.1nm, dB):          35.00 |   GSNR (0.1nm, dB):          35.00 | ||||||
|   GSNR (signal bw, dB):      30.98 |   GSNR (signal bw, dB):      30.98 | ||||||
| @@ -27,6 +33,7 @@ Edfa Edfa_booster_roadm_Stockholm_to_fiber (Stockholm → Norrköping)_(1/2) | |||||||
|   type_variety:           openroadm_mw_mw_booster |   type_variety:           openroadm_mw_mw_booster | ||||||
|   effective gain(dB):     22.00 |   effective gain(dB):     22.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      -inf |   noise figure (dB):      -inf | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -49,6 +56,7 @@ Edfa Edfa_fiber (Stockholm → Norrköping)_(1/2) | |||||||
|   type_variety:           openroadm_ila_low_noise |   type_variety:           openroadm_ila_low_noise | ||||||
|   effective gain(dB):     16.33 |   effective gain(dB):     16.33 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.01 |   noise figure (dB):      8.01 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -71,6 +79,7 @@ Edfa Edfa_preamp_roadm_Norrköping_from_fiber (Stockholm → Norrköping)_(2/2) | |||||||
|   type_variety:           openroadm_mw_mw_preamp_worstcase_ver5 |   type_variety:           openroadm_mw_mw_preamp_worstcase_ver5 | ||||||
|   effective gain(dB):     16.33 |   effective gain(dB):     16.33 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      11.43 |   noise figure (dB):      11.43 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -90,6 +99,7 @@ Edfa Edfa_booster_roadm_Norrköping_to_fiber (Norrköping → Linköping) | |||||||
|   type_variety:           openroadm_mw_mw_booster |   type_variety:           openroadm_mw_mw_booster | ||||||
|   effective gain(dB):     22.00 |   effective gain(dB):     22.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      -inf |   noise figure (dB):      -inf | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -112,6 +122,7 @@ Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping) | |||||||
|   type_variety:           openroadm_mw_mw_preamp_worstcase_ver5 |   type_variety:           openroadm_mw_mw_preamp_worstcase_ver5 | ||||||
|   effective gain(dB):     11.00 |   effective gain(dB):     11.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      16.00 |   noise figure (dB):      16.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -131,6 +142,7 @@ Edfa Edfa_booster_roadm_Linköping_to_fiber (Linköping → Jönköping) | |||||||
|   type_variety:           openroadm_mw_mw_booster |   type_variety:           openroadm_mw_mw_booster | ||||||
|   effective gain(dB):     22.00 |   effective gain(dB):     22.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      -inf |   noise figure (dB):      -inf | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -153,6 +165,7 @@ Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping) | |||||||
|   type_variety:           openroadm_mw_mw_preamp_worstcase_ver5 |   type_variety:           openroadm_mw_mw_preamp_worstcase_ver5 | ||||||
|   effective gain(dB):     26.80 |   effective gain(dB):     26.80 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.01 |   noise figure (dB):      8.01 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -172,6 +185,7 @@ Edfa Edfa_booster_roadm_Jönköping_to_fiber (Jönköping → Borås) | |||||||
|   type_variety:           openroadm_mw_mw_booster |   type_variety:           openroadm_mw_mw_booster | ||||||
|   effective gain(dB):     22.00 |   effective gain(dB):     22.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      -inf |   noise figure (dB):      -inf | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -194,6 +208,7 @@ Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås) | |||||||
|   type_variety:           openroadm_mw_mw_preamp_worstcase_ver5 |   type_variety:           openroadm_mw_mw_preamp_worstcase_ver5 | ||||||
|   effective gain(dB):     17.82 |   effective gain(dB):     17.82 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      10.54 |   noise figure (dB):      10.54 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -213,6 +228,7 @@ Edfa Edfa_booster_roadm_Borås_to_fiber (Borås → Gothenburg) | |||||||
|   type_variety:           openroadm_mw_mw_booster |   type_variety:           openroadm_mw_mw_booster | ||||||
|   effective gain(dB):     22.00 |   effective gain(dB):     22.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      -inf |   noise figure (dB):      -inf | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -235,6 +251,7 @@ Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg) | |||||||
|   type_variety:           openroadm_mw_mw_preamp_worstcase_ver5 |   type_variety:           openroadm_mw_mw_preamp_worstcase_ver5 | ||||||
|   effective gain(dB):     13.53 |   effective gain(dB):     13.53 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      13.54 |   noise figure (dB):      13.54 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -261,7 +278,7 @@ Transceiver trx_Gothenburg | |||||||
|   Latency (ms):              2.45 |   Latency (ms):              2.45 | ||||||
|   Actual pch out (dBm):      2.00 |   Actual pch out (dBm):      2.00 | ||||||
|  |  | ||||||
| Transmission result for input power = 2.00 dBm: | Transmission result for input optical power reference in span = 2.00 dBm: | ||||||
|   Final GSNR (0.1 nm): [1;36;40m19.25 dB[0m |   Final GSNR (0.1 nm): [1;36;40m19.25 dB[0m | ||||||
|  |  | ||||||
| (No source node specified: picked trx_Stockholm) | (No source node specified: picked trx_Stockholm) | ||||||
|   | |||||||
| @@ -10,7 +10,6 @@ | |||||||
| 	node-diverse: True | 	node-diverse: True | ||||||
| 	request-id-numbers: ['4', '5'] | 	request-id-numbers: ['4', '5'] | ||||||
| ] | ] | ||||||
| [1;34;40mAggregating similar requests[0m |  | ||||||
| [1;34;40mThe following services have been requested:[0m | [1;34;40mThe following services have been requested:[0m | ||||||
| [PathRequest 0 | [PathRequest 0 | ||||||
| 	source: 	trx Lorient_KMA | 	source: 	trx Lorient_KMA | ||||||
| @@ -82,7 +81,7 @@ | |||||||
| 	path_bandwidth: 	20.0 Gbit/s | 	path_bandwidth: 	20.0 Gbit/s | ||||||
| 	nodes-list:	[] | 	nodes-list:	[] | ||||||
| 	loose-list:	[] | 	loose-list:	[] | ||||||
| , PathRequest 7 | 6 | , PathRequest 6 | ||||||
| 	source: 	trx Lannion_CAS | 	source: 	trx Lannion_CAS | ||||||
| 	destination:	trx Lorient_KMA | 	destination:	trx Lorient_KMA | ||||||
| 	trx type:	Voyager | 	trx type:	Voyager | ||||||
| @@ -93,7 +92,21 @@ | |||||||
| 	power:  	0.0 dBm | 	power:  	0.0 dBm | ||||||
| 	tx_power_dbm:  	0.0 dBm | 	tx_power_dbm:  	0.0 dBm | ||||||
| 	nb channels: 	76 | 	nb channels: 	76 | ||||||
| 	path_bandwidth: 	700.0 Gbit/s | 	path_bandwidth: 	300.0 Gbit/s | ||||||
|  | 	nodes-list:	[] | ||||||
|  | 	loose-list:	[] | ||||||
|  | , PathRequest 7 | ||||||
|  | 	source: 	trx Lannion_CAS | ||||||
|  | 	destination:	trx Lorient_KMA | ||||||
|  | 	trx type:	Voyager | ||||||
|  | 	trx mode:	mode 1 | ||||||
|  | 	baud_rate:	32.0 Gbaud | ||||||
|  | 	bit_rate:	100.0 Gb/s | ||||||
|  | 	spacing:	50.0 GHz | ||||||
|  | 	power:  	0.0 dBm | ||||||
|  | 	tx_power_dbm:  	0.0 dBm | ||||||
|  | 	nb channels: 	76 | ||||||
|  | 	path_bandwidth: 	400.0 Gbit/s | ||||||
| 	nodes-list:	[] | 	nodes-list:	[] | ||||||
| 	loose-list:	[] | 	loose-list:	[] | ||||||
| , PathRequest 7b | , PathRequest 7b | ||||||
| @@ -111,8 +124,6 @@ | |||||||
| 	nodes-list:	[] | 	nodes-list:	[] | ||||||
| 	loose-list:	[] | 	loose-list:	[] | ||||||
| ] | ] | ||||||
| [1;34;40mComputing all paths with constraints[0m |  | ||||||
| [1;34;40mPropagating on selected path[0m |  | ||||||
| [1;34;40mResult summary[0m | [1;34;40mResult summary[0m | ||||||
| req id   demand                                GSNR@bandwidth A-Z (Z-A)   GSNR@0.1nm A-Z (Z-A)        Receiver minOSNR               mode                    Gbit/s              nb of tsp pairs      N,M or blocking reason  | req id   demand                                GSNR@bandwidth A-Z (Z-A)   GSNR@0.1nm A-Z (Z-A)        Receiver minOSNR               mode                    Gbit/s              nb of tsp pairs      N,M or blocking reason  | ||||||
| 0       trx Lorient_KMA to trx Vannes_KBE :             24.83                    28.92                      14                     mode 1                   100.0                      1                   ([-284],[4])       | 0       trx Lorient_KMA to trx Vannes_KBE :             24.83                    28.92                      14                     mode 1                   100.0                      1                   ([-284],[4])       | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| [1;34;40mList of disjunctions[0m | [1;34;40mList of disjunctions[0m | ||||||
| [] | [] | ||||||
| [1;34;40mAggregating similar requests[0m |  | ||||||
| [1;34;40mThe following services have been requested:[0m | [1;34;40mThe following services have been requested:[0m | ||||||
| [PathRequest 0 | [PathRequest 0 | ||||||
| 	source: 	trx Abilene | 	source: 	trx Abilene | ||||||
| @@ -17,8 +16,6 @@ | |||||||
| 	nodes-list:	[] | 	nodes-list:	[] | ||||||
| 	loose-list:	[] | 	loose-list:	[] | ||||||
| ] | ] | ||||||
| [1;34;40mComputing all paths with constraints[0m |  | ||||||
| [1;34;40mPropagating on selected path[0m |  | ||||||
| [1;34;40mResult summary[0m | [1;34;40mResult summary[0m | ||||||
| req id   demand                       GSNR@bandwidth A-Z (Z-A)   GSNR@0.1nm A-Z (Z-A)        Receiver minOSNR               mode                    Gbit/s              nb of tsp pairs      N,M or blocking reason  | req id   demand                       GSNR@bandwidth A-Z (Z-A)   GSNR@0.1nm A-Z (Z-A)        Receiver minOSNR               mode                    Gbit/s              nb of tsp pairs      N,M or blocking reason  | ||||||
| 0       trx Abilene to trx Albany :             9.04                     14.5                      -                      mode 3                   100.0                      -                MODE_NOT_FEASIBLE     | 0       trx Abilene to trx Albany :             9.04                     14.5                      -                      mode 3                   100.0                      -                MODE_NOT_FEASIBLE     | ||||||
|   | |||||||
| @@ -1,12 +1,18 @@ | |||||||
| There are 95 channels propagating |  | ||||||
| Power mode is set to True | Power mode is set to True | ||||||
| => it can be modified in eqpt_config.json - Span | => it can be modified in eqpt_config.json - Span | ||||||
|  |  | ||||||
| There are 4 fiber spans over 200 km between trx Brest_KLA and trx Rennes_STA | There are 4 fiber spans over 200 km between trx Brest_KLA and trx Rennes_STA | ||||||
|  |  | ||||||
| Now propagating between trx Brest_KLA and trx Rennes_STA: | Now propagating between trx Brest_KLA and trx Rennes_STA: | ||||||
|  | Reference used for design: (Input optical power reference in span = 3.00dBm, | ||||||
|  |                             spacing = 50.00GHz | ||||||
|  |                             nb_channels = 95) | ||||||
|  |  | ||||||
| Propagating with input power = [1;36;40m-3.00 dBm[0m: | Channels propagating: (Input optical power deviation in span = 0.00dB, | ||||||
|  |                        spacing = 50.00GHz, | ||||||
|  |                        transceiver output power = 3.00dBm, | ||||||
|  |                        nb_channels = 95) | ||||||
|  | Input optical power reference in span = [1;36;40m-3.00 dBm[0m: | ||||||
| Transceiver trx Rennes_STA | Transceiver trx Rennes_STA | ||||||
|   GSNR (0.1nm, dB):          23.73 |   GSNR (0.1nm, dB):          23.73 | ||||||
|   GSNR (signal bw, dB):      19.65 |   GSNR (signal bw, dB):      19.65 | ||||||
| @@ -17,8 +23,7 @@ Transceiver trx Rennes_STA | |||||||
|   PDL (dB):                  0.00 |   PDL (dB):                  0.00 | ||||||
|   Latency (ms):              0.98 |   Latency (ms):              0.98 | ||||||
|   Actual pch out (dBm):      3.00 |   Actual pch out (dBm):      3.00 | ||||||
|  | Input optical power reference in span = [1;36;40m-2.50 dBm[0m: | ||||||
| Propagating with input power = [1;36;40m-2.50 dBm[0m: |  | ||||||
| Transceiver trx Rennes_STA | Transceiver trx Rennes_STA | ||||||
|   GSNR (0.1nm, dB):          24.01 |   GSNR (0.1nm, dB):          24.01 | ||||||
|   GSNR (signal bw, dB):      19.93 |   GSNR (signal bw, dB):      19.93 | ||||||
| @@ -29,8 +34,7 @@ Transceiver trx Rennes_STA | |||||||
|   PDL (dB):                  0.00 |   PDL (dB):                  0.00 | ||||||
|   Latency (ms):              0.98 |   Latency (ms):              0.98 | ||||||
|   Actual pch out (dBm):      3.00 |   Actual pch out (dBm):      3.00 | ||||||
|  | Input optical power reference in span = [1;36;40m-2.00 dBm[0m: | ||||||
| Propagating with input power = [1;36;40m-2.00 dBm[0m: |  | ||||||
| Transceiver trx Rennes_STA | Transceiver trx Rennes_STA | ||||||
|   GSNR (0.1nm, dB):          24.25 |   GSNR (0.1nm, dB):          24.25 | ||||||
|   GSNR (signal bw, dB):      20.17 |   GSNR (signal bw, dB):      20.17 | ||||||
| @@ -41,8 +45,7 @@ Transceiver trx Rennes_STA | |||||||
|   PDL (dB):                  0.00 |   PDL (dB):                  0.00 | ||||||
|   Latency (ms):              0.98 |   Latency (ms):              0.98 | ||||||
|   Actual pch out (dBm):      3.00 |   Actual pch out (dBm):      3.00 | ||||||
|  | Input optical power reference in span = [1;36;40m-1.50 dBm[0m: | ||||||
| Propagating with input power = [1;36;40m-1.50 dBm[0m: |  | ||||||
| Transceiver trx Rennes_STA | Transceiver trx Rennes_STA | ||||||
|   GSNR (0.1nm, dB):          24.44 |   GSNR (0.1nm, dB):          24.44 | ||||||
|   GSNR (signal bw, dB):      20.36 |   GSNR (signal bw, dB):      20.36 | ||||||
| @@ -53,8 +56,7 @@ Transceiver trx Rennes_STA | |||||||
|   PDL (dB):                  0.00 |   PDL (dB):                  0.00 | ||||||
|   Latency (ms):              0.98 |   Latency (ms):              0.98 | ||||||
|   Actual pch out (dBm):      3.00 |   Actual pch out (dBm):      3.00 | ||||||
|  | Input optical power reference in span = [1;36;40m-1.00 dBm[0m: | ||||||
| Propagating with input power = [1;36;40m-1.00 dBm[0m: |  | ||||||
| Transceiver trx Rennes_STA | Transceiver trx Rennes_STA | ||||||
|   GSNR (0.1nm, dB):          24.57 |   GSNR (0.1nm, dB):          24.57 | ||||||
|   GSNR (signal bw, dB):      20.49 |   GSNR (signal bw, dB):      20.49 | ||||||
| @@ -65,8 +67,7 @@ Transceiver trx Rennes_STA | |||||||
|   PDL (dB):                  0.00 |   PDL (dB):                  0.00 | ||||||
|   Latency (ms):              0.98 |   Latency (ms):              0.98 | ||||||
|   Actual pch out (dBm):      3.00 |   Actual pch out (dBm):      3.00 | ||||||
|  | Input optical power reference in span = [1;36;40m-0.50 dBm[0m: | ||||||
| Propagating with input power = [1;36;40m-0.50 dBm[0m: |  | ||||||
| Transceiver trx Rennes_STA | Transceiver trx Rennes_STA | ||||||
|   GSNR (0.1nm, dB):          24.63 |   GSNR (0.1nm, dB):          24.63 | ||||||
|   GSNR (signal bw, dB):      20.55 |   GSNR (signal bw, dB):      20.55 | ||||||
| @@ -77,8 +78,7 @@ Transceiver trx Rennes_STA | |||||||
|   PDL (dB):                  0.00 |   PDL (dB):                  0.00 | ||||||
|   Latency (ms):              0.98 |   Latency (ms):              0.98 | ||||||
|   Actual pch out (dBm):      3.00 |   Actual pch out (dBm):      3.00 | ||||||
|  | Input optical power reference in span = [1;36;40m-0.00 dBm[0m: | ||||||
| Propagating with input power = [1;36;40m-0.00 dBm[0m: |  | ||||||
| Transceiver trx Rennes_STA | Transceiver trx Rennes_STA | ||||||
|   GSNR (0.1nm, dB):          24.60 |   GSNR (0.1nm, dB):          24.60 | ||||||
|   GSNR (signal bw, dB):      20.52 |   GSNR (signal bw, dB):      20.52 | ||||||
| @@ -89,8 +89,7 @@ Transceiver trx Rennes_STA | |||||||
|   PDL (dB):                  0.00 |   PDL (dB):                  0.00 | ||||||
|   Latency (ms):              0.98 |   Latency (ms):              0.98 | ||||||
|   Actual pch out (dBm):      3.00 |   Actual pch out (dBm):      3.00 | ||||||
|  | Input optical power reference in span = [1;36;40m0.50 dBm[0m: | ||||||
| Propagating with input power = [1;36;40m0.50 dBm[0m: |  | ||||||
| Transceiver trx Rennes_STA | Transceiver trx Rennes_STA | ||||||
|   GSNR (0.1nm, dB):          24.42 |   GSNR (0.1nm, dB):          24.42 | ||||||
|   GSNR (signal bw, dB):      20.34 |   GSNR (signal bw, dB):      20.34 | ||||||
| @@ -101,8 +100,7 @@ Transceiver trx Rennes_STA | |||||||
|   PDL (dB):                  0.00 |   PDL (dB):                  0.00 | ||||||
|   Latency (ms):              0.98 |   Latency (ms):              0.98 | ||||||
|   Actual pch out (dBm):      3.00 |   Actual pch out (dBm):      3.00 | ||||||
|  | Input optical power reference in span = [1;36;40m1.00 dBm[0m: | ||||||
| Propagating with input power = [1;36;40m1.00 dBm[0m: |  | ||||||
| Transceiver trx Rennes_STA | Transceiver trx Rennes_STA | ||||||
|   GSNR (0.1nm, dB):          24.16 |   GSNR (0.1nm, dB):          24.16 | ||||||
|   GSNR (signal bw, dB):      20.08 |   GSNR (signal bw, dB):      20.08 | ||||||
| @@ -113,8 +111,7 @@ Transceiver trx Rennes_STA | |||||||
|   PDL (dB):                  0.00 |   PDL (dB):                  0.00 | ||||||
|   Latency (ms):              0.98 |   Latency (ms):              0.98 | ||||||
|   Actual pch out (dBm):      3.00 |   Actual pch out (dBm):      3.00 | ||||||
|  | Input optical power reference in span = [1;36;40m1.50 dBm[0m: | ||||||
| Propagating with input power = [1;36;40m1.50 dBm[0m: |  | ||||||
| Transceiver trx Rennes_STA | Transceiver trx Rennes_STA | ||||||
|   GSNR (0.1nm, dB):          24.02 |   GSNR (0.1nm, dB):          24.02 | ||||||
|   GSNR (signal bw, dB):      19.93 |   GSNR (signal bw, dB):      19.93 | ||||||
| @@ -125,8 +122,7 @@ Transceiver trx Rennes_STA | |||||||
|   PDL (dB):                  0.00 |   PDL (dB):                  0.00 | ||||||
|   Latency (ms):              0.98 |   Latency (ms):              0.98 | ||||||
|   Actual pch out (dBm):      3.00 |   Actual pch out (dBm):      3.00 | ||||||
|  | Input optical power reference in span = [1;36;40m2.00 dBm[0m: | ||||||
| Propagating with input power = [1;36;40m2.00 dBm[0m: |  | ||||||
| Transceiver trx Rennes_STA | Transceiver trx Rennes_STA | ||||||
|   GSNR (0.1nm, dB):          24.02 |   GSNR (0.1nm, dB):          24.02 | ||||||
|   GSNR (signal bw, dB):      19.93 |   GSNR (signal bw, dB):      19.93 | ||||||
| @@ -137,8 +133,7 @@ Transceiver trx Rennes_STA | |||||||
|   PDL (dB):                  0.00 |   PDL (dB):                  0.00 | ||||||
|   Latency (ms):              0.98 |   Latency (ms):              0.98 | ||||||
|   Actual pch out (dBm):      3.00 |   Actual pch out (dBm):      3.00 | ||||||
|  | Input optical power reference in span = [1;36;40m2.50 dBm[0m: | ||||||
| Propagating with input power = [1;36;40m2.50 dBm[0m: |  | ||||||
| Transceiver trx Rennes_STA | Transceiver trx Rennes_STA | ||||||
|   GSNR (0.1nm, dB):          24.02 |   GSNR (0.1nm, dB):          24.02 | ||||||
|   GSNR (signal bw, dB):      19.93 |   GSNR (signal bw, dB):      19.93 | ||||||
| @@ -149,8 +144,7 @@ Transceiver trx Rennes_STA | |||||||
|   PDL (dB):                  0.00 |   PDL (dB):                  0.00 | ||||||
|   Latency (ms):              0.98 |   Latency (ms):              0.98 | ||||||
|   Actual pch out (dBm):      3.00 |   Actual pch out (dBm):      3.00 | ||||||
|  | Input optical power reference in span = [1;36;40m3.00 dBm[0m: | ||||||
| Propagating with input power = [1;36;40m3.00 dBm[0m: |  | ||||||
| Transceiver trx Rennes_STA | Transceiver trx Rennes_STA | ||||||
|   GSNR (0.1nm, dB):          24.02 |   GSNR (0.1nm, dB):          24.02 | ||||||
|   GSNR (signal bw, dB):      19.93 |   GSNR (signal bw, dB):      19.93 | ||||||
|   | |||||||
| @@ -1,13 +1,19 @@ | |||||||
| User input for spectrum used for propagation instead of SI | User input for spectrum used for propagation instead of SI | ||||||
| There are 76 channels propagating |  | ||||||
| Power mode is set to True | Power mode is set to True | ||||||
| => it can be modified in eqpt_config.json - Span | => it can be modified in eqpt_config.json - Span | ||||||
|  |  | ||||||
| There are 3 fiber spans over 130 km between trx Lannion_CAS and trx Lorient_KMA | There are 3 fiber spans over 130 km between trx Lannion_CAS and trx Lorient_KMA | ||||||
|  |  | ||||||
| Now propagating between trx Lannion_CAS and trx Lorient_KMA: | Now propagating between trx Lannion_CAS and trx Lorient_KMA: | ||||||
|  | Reference used for design: (Input optical power reference in span = 0.00dBm, | ||||||
|  |                             spacing = 50.00GHz | ||||||
|  |                             nb_channels = 76) | ||||||
|  |  | ||||||
| Propagating with input power = [1;36;40m0.00 dBm[0m: | Channels propagating: (Input optical power deviation in span = 0.00dB, | ||||||
|  |                        spacing = 50.00GHz, | ||||||
|  |                        transceiver output power = 0.00dBm, | ||||||
|  |                        nb_channels = 76) | ||||||
|  | Input optical power reference in span = [1;36;40m0.00 dBm[0m: | ||||||
| Transceiver trx Lannion_CAS | Transceiver trx Lannion_CAS | ||||||
|   GSNR (0.1nm, dB):          40.00 |   GSNR (0.1nm, dB):          40.00 | ||||||
|   GSNR (signal bw, dB):      35.92 |   GSNR (signal bw, dB):      35.92 | ||||||
| @@ -28,6 +34,7 @@ Edfa east edfa in Lannion_CAS to Corlay | |||||||
|   type_variety:           std_medium_gain |   type_variety:           std_medium_gain | ||||||
|   effective gain(dB):     21.00 |   effective gain(dB):     21.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      6.36 |   noise figure (dB):      6.36 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -72,6 +79,7 @@ Edfa west edfa in Lorient_KMA to Loudeac | |||||||
|   type_variety:           std_high_gain |   type_variety:           std_high_gain | ||||||
|   effective gain(dB):     28.00 |   effective gain(dB):     28.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      5.92 |   noise figure (dB):      5.92 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -98,7 +106,7 @@ Transceiver trx Lorient_KMA | |||||||
|   Latency (ms):              0.64 |   Latency (ms):              0.64 | ||||||
|   Actual pch out (dBm):      0.00 |   Actual pch out (dBm):      0.00 | ||||||
|  |  | ||||||
| Transmission result for input power = 0.00 dBm: | Transmission result for input optical power reference in span = 0.00 dBm: | ||||||
|   Final GSNR (0.1 nm): [1;36;40m23.61 dB[0m |   Final GSNR (0.1 nm): [1;36;40m23.61 dB[0m | ||||||
|  |  | ||||||
| (No source node specified: picked trx Lannion_CAS) | (No source node specified: picked trx Lannion_CAS) | ||||||
|   | |||||||
| @@ -1,13 +1,19 @@ | |||||||
| User input for spectrum used for propagation instead of SI | User input for spectrum used for propagation instead of SI | ||||||
| There are 60 channels propagating |  | ||||||
| Power mode is set to True | Power mode is set to True | ||||||
| => it can be modified in eqpt_config.json - Span | => it can be modified in eqpt_config.json - Span | ||||||
|  |  | ||||||
| There are 3 fiber spans over 130 km between trx Lannion_CAS and trx Lorient_KMA | There are 3 fiber spans over 130 km between trx Lannion_CAS and trx Lorient_KMA | ||||||
|  |  | ||||||
| Now propagating between trx Lannion_CAS and trx Lorient_KMA: | Now propagating between trx Lannion_CAS and trx Lorient_KMA: | ||||||
|  | Reference used for design: (Input optical power reference in span = 0.00dBm, | ||||||
|  |                             spacing = 50.00GHz | ||||||
|  |                             nb_channels = 76) | ||||||
|  |  | ||||||
| Propagating with input power = [1;36;40m0.00 dBm[0m: | Channels propagating: (Input optical power deviation in span = mode_1: 0.00, mode_2: 0.00dB, | ||||||
|  |                        spacing = mode_1: 50.00, mode_2: 75.00GHz, | ||||||
|  |                        transceiver output power = mode_1: 0.00, mode_2: 0.00dBm, | ||||||
|  |                        nb_channels = 60) | ||||||
|  | Input optical power reference in span = [1;36;40m0.00 dBm[0m: | ||||||
| Transceiver trx Lannion_CAS | Transceiver trx Lannion_CAS | ||||||
|   GSNR (0.1nm, dB):          mode_1: 40.00, mode_2: 40.00 |   GSNR (0.1nm, dB):          mode_1: 40.00, mode_2: 40.00 | ||||||
|   GSNR (signal bw, dB):      mode_1: 35.92, mode_2: 32.91 |   GSNR (signal bw, dB):      mode_1: 35.92, mode_2: 32.91 | ||||||
| @@ -28,6 +34,7 @@ Edfa east edfa in Lannion_CAS to Corlay | |||||||
|   type_variety:           std_medium_gain |   type_variety:           std_medium_gain | ||||||
|   effective gain(dB):     21.00 |   effective gain(dB):     21.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      6.36 |   noise figure (dB):      6.36 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -72,6 +79,7 @@ Edfa west edfa in Lorient_KMA to Loudeac | |||||||
|   type_variety:           std_high_gain |   type_variety:           std_high_gain | ||||||
|   effective gain(dB):     28.00 |   effective gain(dB):     28.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      5.92 |   noise figure (dB):      5.92 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -98,7 +106,7 @@ Transceiver trx Lorient_KMA | |||||||
|   Latency (ms):              0.64 |   Latency (ms):              0.64 | ||||||
|   Actual pch out (dBm):      mode_1: 0.00, mode_2: 0.00 |   Actual pch out (dBm):      mode_1: 0.00, mode_2: 0.00 | ||||||
|  |  | ||||||
| Transmission result for input power = 0.00 dBm: | Transmission result for input optical power reference in span = 0.00 dBm: | ||||||
|   Final GSNR (0.1 nm): [1;36;40m23.72 dB[0m |   Final GSNR (0.1 nm): [1;36;40m23.72 dB[0m | ||||||
|  |  | ||||||
| The GSNR per channel at the end of the line is: | The GSNR per channel at the end of the line is: | ||||||
|   | |||||||
| @@ -1,13 +1,19 @@ | |||||||
| User input for spectrum used for propagation instead of SI | User input for spectrum used for propagation instead of SI | ||||||
| There are 60 channels propagating |  | ||||||
| Power mode is set to True | Power mode is set to True | ||||||
| => it can be modified in eqpt_config.json - Span | => it can be modified in eqpt_config.json - Span | ||||||
|  |  | ||||||
| There are 15 fiber spans over 1200 km between Site_A and Site_B | There are 15 fiber spans over 1200 km between Site_A and Site_B | ||||||
|  |  | ||||||
| Now propagating between Site_A and Site_B: | Now propagating between Site_A and Site_B: | ||||||
|  | Reference used for design: (Input optical power reference in span = 0.00dBm, | ||||||
|  |                             spacing = 50.00GHz | ||||||
|  |                             nb_channels = 96) | ||||||
|  |  | ||||||
| Propagating with input power = [1;36;40m0.00 dBm[0m: | Channels propagating: (Input optical power deviation in span = mode_1: 0.00, mode_2: 0.00dB, | ||||||
|  |                        spacing = mode_1: 50.00, mode_2: 75.00GHz, | ||||||
|  |                        transceiver output power = mode_1: 0.00, mode_2: 0.00dBm, | ||||||
|  |                        nb_channels = 60) | ||||||
|  | Input optical power reference in span = [1;36;40m0.00 dBm[0m: | ||||||
| Transceiver Site_A | Transceiver Site_A | ||||||
|   GSNR (0.1nm, dB):          mode_1: 40.00, mode_2: 40.00 |   GSNR (0.1nm, dB):          mode_1: 40.00, mode_2: 40.00 | ||||||
|   GSNR (signal bw, dB):      mode_1: 35.92, mode_2: 32.91 |   GSNR (signal bw, dB):      mode_1: 35.92, mode_2: 32.91 | ||||||
| @@ -28,6 +34,7 @@ Edfa booster A | |||||||
|   type_variety:           std_medium_gain |   type_variety:           std_medium_gain | ||||||
|   effective gain(dB):     20.00 |   effective gain(dB):     20.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      6.58 |   noise figure (dB):      6.58 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -50,6 +57,7 @@ Edfa Edfa1 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -72,6 +80,7 @@ Edfa Edfa2 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -94,6 +103,7 @@ Edfa Edfa3 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -116,6 +126,7 @@ Edfa Edfa4 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -138,6 +149,7 @@ Edfa Edfa5 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -157,6 +169,7 @@ Edfa booster C | |||||||
|   type_variety:           std_medium_gain |   type_variety:           std_medium_gain | ||||||
|   effective gain(dB):     20.00 |   effective gain(dB):     20.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      6.58 |   noise figure (dB):      6.58 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -179,6 +192,7 @@ Edfa Edfa6 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -201,6 +215,7 @@ Edfa Edfa7 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -223,6 +238,7 @@ Edfa Edfa8 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -245,6 +261,7 @@ Edfa Edfa9 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -267,6 +284,7 @@ Edfa Edfa10 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -286,6 +304,7 @@ Edfa booster D | |||||||
|   type_variety:           std_medium_gain |   type_variety:           std_medium_gain | ||||||
|   effective gain(dB):     20.00 |   effective gain(dB):     20.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      6.58 |   noise figure (dB):      6.58 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -308,6 +327,7 @@ Edfa Edfa11 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -330,6 +350,7 @@ Edfa Edfa12 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -349,6 +370,7 @@ Edfa booster E | |||||||
|   type_variety:           std_medium_gain |   type_variety:           std_medium_gain | ||||||
|   effective gain(dB):     20.00 |   effective gain(dB):     20.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      6.58 |   noise figure (dB):      6.58 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -371,6 +393,7 @@ Edfa Edfa13 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -393,6 +416,7 @@ Edfa Edfa14 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -415,6 +439,7 @@ Edfa Edfa15 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -441,7 +466,7 @@ Transceiver Site_B | |||||||
|   Latency (ms):              5.88 |   Latency (ms):              5.88 | ||||||
|   Actual pch out (dBm):      mode_1: 0.00, mode_2: 0.00 |   Actual pch out (dBm):      mode_1: 0.00, mode_2: 0.00 | ||||||
|  |  | ||||||
| Transmission result for input power = 0.00 dBm: | Transmission result for input optical power reference in span = 0.00 dBm: | ||||||
|   Final GSNR (0.1 nm): [1;36;40m18.56 dB[0m |   Final GSNR (0.1 nm): [1;36;40m18.56 dB[0m | ||||||
|  |  | ||||||
| (No source node specified: picked Site_A) | (No source node specified: picked Site_A) | ||||||
|   | |||||||
| @@ -1,13 +1,19 @@ | |||||||
| User input for spectrum used for propagation instead of SI | User input for spectrum used for propagation instead of SI | ||||||
| There are 60 channels propagating |  | ||||||
| Power mode is set to True | Power mode is set to True | ||||||
| => it can be modified in eqpt_config.json - Span | => it can be modified in eqpt_config.json - Span | ||||||
|  |  | ||||||
| There are 15 fiber spans over 1200 km between Site_A and Site_B | There are 15 fiber spans over 1200 km between Site_A and Site_B | ||||||
|  |  | ||||||
| Now propagating between Site_A and Site_B: | Now propagating between Site_A and Site_B: | ||||||
|  | Reference used for design: (Input optical power reference in span = 0.00dBm, | ||||||
|  |                             spacing = 50.00GHz | ||||||
|  |                             nb_channels = 95) | ||||||
|  |  | ||||||
| Propagating with input power = [1;36;40m0.00 dBm[0m: | Channels propagating: (Input optical power deviation in span = mode_1: 0.00, mode_2: 0.00dB, | ||||||
|  |                        spacing = mode_1: 50.00, mode_2: 75.00GHz, | ||||||
|  |                        transceiver output power = mode_1: 0.00, mode_2: 0.00dBm, | ||||||
|  |                        nb_channels = 60) | ||||||
|  | Input optical power reference in span = [1;36;40m0.00 dBm[0m: | ||||||
| Transceiver Site_A | Transceiver Site_A | ||||||
|   GSNR (0.1nm, dB):          mode_1: 40.00, mode_2: 40.00 |   GSNR (0.1nm, dB):          mode_1: 40.00, mode_2: 40.00 | ||||||
|   GSNR (signal bw, dB):      mode_1: 35.92, mode_2: 32.91 |   GSNR (signal bw, dB):      mode_1: 35.92, mode_2: 32.91 | ||||||
| @@ -28,6 +34,7 @@ Edfa booster A | |||||||
|   type_variety:           std_medium_gain |   type_variety:           std_medium_gain | ||||||
|   effective gain(dB):     20.00 |   effective gain(dB):     20.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      6.58 |   noise figure (dB):      6.58 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -50,6 +57,7 @@ Edfa Edfa1 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -72,6 +80,7 @@ Edfa Edfa2 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -94,6 +103,7 @@ Edfa Edfa3 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -116,6 +126,7 @@ Edfa Edfa4 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -138,6 +149,7 @@ Edfa Edfa5 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -157,6 +169,7 @@ Edfa booster C | |||||||
|   type_variety:           std_medium_gain |   type_variety:           std_medium_gain | ||||||
|   effective gain(dB):     20.00 |   effective gain(dB):     20.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      6.58 |   noise figure (dB):      6.58 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -179,6 +192,7 @@ Edfa Edfa6 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -201,6 +215,7 @@ Edfa Edfa7 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -223,6 +238,7 @@ Edfa Edfa8 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -245,6 +261,7 @@ Edfa Edfa9 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -267,6 +284,7 @@ Edfa Edfa10 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -286,6 +304,7 @@ Edfa booster D | |||||||
|   type_variety:           std_medium_gain |   type_variety:           std_medium_gain | ||||||
|   effective gain(dB):     20.00 |   effective gain(dB):     20.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      6.58 |   noise figure (dB):      6.58 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -308,6 +327,7 @@ Edfa Edfa11 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -330,6 +350,7 @@ Edfa Edfa12 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -349,6 +370,7 @@ Edfa booster E | |||||||
|   type_variety:           std_medium_gain |   type_variety:           std_medium_gain | ||||||
|   effective gain(dB):     20.00 |   effective gain(dB):     20.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      6.58 |   noise figure (dB):      6.58 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -371,6 +393,7 @@ Edfa Edfa13 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -393,6 +416,7 @@ Edfa Edfa14 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -415,6 +439,7 @@ Edfa Edfa15 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -441,7 +466,7 @@ Transceiver Site_B | |||||||
|   Latency (ms):              5.88 |   Latency (ms):              5.88 | ||||||
|   Actual pch out (dBm):      mode_1: 0.00, mode_2: 0.00 |   Actual pch out (dBm):      mode_1: 0.00, mode_2: 0.00 | ||||||
|  |  | ||||||
| Transmission result for input power = 0.00 dBm: | Transmission result for input optical power reference in span = 0.00 dBm: | ||||||
|   Final GSNR (0.1 nm): [1;36;40m18.94 dB[0m |   Final GSNR (0.1 nm): [1;36;40m18.94 dB[0m | ||||||
|  |  | ||||||
| (No source node specified: picked Site_A) | (No source node specified: picked Site_A) | ||||||
|   | |||||||
| @@ -1,13 +1,19 @@ | |||||||
| User input for spectrum used for propagation instead of SI | User input for spectrum used for propagation instead of SI | ||||||
| There are 60 channels propagating |  | ||||||
| Power mode is set to True | Power mode is set to True | ||||||
| => it can be modified in eqpt_config.json - Span | => it can be modified in eqpt_config.json - Span | ||||||
|  |  | ||||||
| There are 15 fiber spans over 1200 km between Site_A and Site_B | There are 15 fiber spans over 1200 km between Site_A and Site_B | ||||||
|  |  | ||||||
| Now propagating between Site_A and Site_B: | Now propagating between Site_A and Site_B: | ||||||
|  | Reference used for design: (Input optical power reference in span = 0.00dBm, | ||||||
|  |                             spacing = 50.00GHz | ||||||
|  |                             nb_channels = 95) | ||||||
|  |  | ||||||
| Propagating with input power = [1;36;40m0.00 dBm[0m: | Channels propagating: (Input optical power deviation in span = mode_1: 0.00, mode_2: 0.00dB, | ||||||
|  |                        spacing = mode_1: 50.00, mode_2: 75.00GHz, | ||||||
|  |                        transceiver output power = mode_1: 0.00, mode_2: 0.00dBm, | ||||||
|  |                        nb_channels = 60) | ||||||
|  | Input optical power reference in span = [1;36;40m0.00 dBm[0m: | ||||||
| Transceiver Site_A | Transceiver Site_A | ||||||
|   GSNR (0.1nm, dB):          mode_1: 40.00, mode_2: 40.00 |   GSNR (0.1nm, dB):          mode_1: 40.00, mode_2: 40.00 | ||||||
|   GSNR (signal bw, dB):      mode_1: 35.92, mode_2: 32.91 |   GSNR (signal bw, dB):      mode_1: 35.92, mode_2: 32.91 | ||||||
| @@ -28,6 +34,7 @@ Edfa booster A | |||||||
|   type_variety:           std_medium_gain |   type_variety:           std_medium_gain | ||||||
|   effective gain(dB):     20.00 |   effective gain(dB):     20.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      6.58 |   noise figure (dB):      6.58 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -50,6 +57,7 @@ Edfa Edfa1 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -72,6 +80,7 @@ Edfa Edfa2 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -94,6 +103,7 @@ Edfa Edfa3 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -116,6 +126,7 @@ Edfa Edfa4 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -138,6 +149,7 @@ Edfa Edfa5 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -157,6 +169,7 @@ Edfa booster C | |||||||
|   type_variety:           std_medium_gain |   type_variety:           std_medium_gain | ||||||
|   effective gain(dB):     20.00 |   effective gain(dB):     20.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      6.58 |   noise figure (dB):      6.58 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -179,6 +192,7 @@ Edfa Edfa6 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -201,6 +215,7 @@ Edfa Edfa7 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -223,6 +238,7 @@ Edfa Edfa8 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -245,6 +261,7 @@ Edfa Edfa9 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -267,6 +284,7 @@ Edfa Edfa10 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -286,6 +304,7 @@ Edfa booster D | |||||||
|   type_variety:           std_medium_gain |   type_variety:           std_medium_gain | ||||||
|   effective gain(dB):     20.00 |   effective gain(dB):     20.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      6.58 |   noise figure (dB):      6.58 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -308,6 +327,7 @@ Edfa Edfa11 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -330,6 +350,7 @@ Edfa Edfa12 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -349,6 +370,7 @@ Edfa booster E | |||||||
|   type_variety:           std_medium_gain |   type_variety:           std_medium_gain | ||||||
|   effective gain(dB):     20.00 |   effective gain(dB):     20.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      6.58 |   noise figure (dB):      6.58 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -371,6 +393,7 @@ Edfa Edfa13 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -393,6 +416,7 @@ Edfa Edfa14 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -415,6 +439,7 @@ Edfa Edfa15 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -441,7 +466,7 @@ Transceiver Site_B | |||||||
|   Latency (ms):              5.88 |   Latency (ms):              5.88 | ||||||
|   Actual pch out (dBm):      mode_1: 0.00, mode_2: 0.00 |   Actual pch out (dBm):      mode_1: 0.00, mode_2: 0.00 | ||||||
|  |  | ||||||
| Transmission result for input power = 0.00 dBm: | Transmission result for input optical power reference in span = 0.00 dBm: | ||||||
|   Final GSNR (0.1 nm): [1;36;40m18.94 dB[0m |   Final GSNR (0.1 nm): [1;36;40m18.94 dB[0m | ||||||
|  |  | ||||||
| (No source node specified: picked Site_A) | (No source node specified: picked Site_A) | ||||||
|   | |||||||
| @@ -1,12 +1,18 @@ | |||||||
| There are 76 channels propagating |  | ||||||
| Power mode is set to True | Power mode is set to True | ||||||
| => it can be modified in eqpt_config.json - Span | => it can be modified in eqpt_config.json - Span | ||||||
|  |  | ||||||
| There are 1 fiber spans over 80 km between Site_A and Site_B | There are 1 fiber spans over 80 km between Site_A and Site_B | ||||||
|  |  | ||||||
| Now propagating between Site_A and Site_B: | Now propagating between Site_A and Site_B: | ||||||
|  | Reference used for design: (Input optical power reference in span = 0.00dBm, | ||||||
|  |                             spacing = 50.00GHz | ||||||
|  |                             nb_channels = 76) | ||||||
|  |  | ||||||
| Propagating with input power = [1;36;40m0.00 dBm[0m: | Channels propagating: (Input optical power deviation in span = 0.00dB, | ||||||
|  |                        spacing = 50.00GHz, | ||||||
|  |                        transceiver output power = 0.00dBm, | ||||||
|  |                        nb_channels = 76) | ||||||
|  | Input optical power reference in span = [1;36;40m0.00 dBm[0m: | ||||||
| Transceiver Site_A | Transceiver Site_A | ||||||
|   GSNR (0.1nm, dB):          40.00 |   GSNR (0.1nm, dB):          40.00 | ||||||
|   GSNR (signal bw, dB):      35.92 |   GSNR (signal bw, dB):      35.92 | ||||||
| @@ -30,6 +36,7 @@ Edfa Edfa1 | |||||||
|   type_variety:           std_low_gain |   type_variety:           std_low_gain | ||||||
|   effective gain(dB):     15.00 |   effective gain(dB):     15.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      6.62 |   noise figure (dB):      6.62 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -50,7 +57,7 @@ Transceiver Site_B | |||||||
|   Latency (ms):              0.39 |   Latency (ms):              0.39 | ||||||
|   Actual pch out (dBm):      0.00 |   Actual pch out (dBm):      0.00 | ||||||
|  |  | ||||||
| Transmission result for input power = 0.00 dBm: | Transmission result for input optical power reference in span = 0.00 dBm: | ||||||
|   Final GSNR (0.1 nm): [1;36;40m31.18 dB[0m |   Final GSNR (0.1 nm): [1;36;40m31.18 dB[0m | ||||||
|  |  | ||||||
| (No source node specified: picked Site_A) | (No source node specified: picked Site_A) | ||||||
|   | |||||||
| @@ -1,12 +1,18 @@ | |||||||
| There are 76 channels propagating |  | ||||||
| Power mode is set to True | Power mode is set to True | ||||||
| => it can be modified in eqpt_config.json - Span | => it can be modified in eqpt_config.json - Span | ||||||
|  |  | ||||||
| There are 1 fiber spans over 80 km between Site_A and Site_B | There are 1 fiber spans over 80 km between Site_A and Site_B | ||||||
|  |  | ||||||
| Now propagating between Site_A and Site_B: | Now propagating between Site_A and Site_B: | ||||||
|  | Reference used for design: (Input optical power reference in span = 0.00dBm, | ||||||
|  |                             spacing = 50.00GHz | ||||||
|  |                             nb_channels = 76) | ||||||
|  |  | ||||||
| Propagating with input power = [1;36;40m0.00 dBm[0m: | Channels propagating: (Input optical power deviation in span = 0.00dB, | ||||||
|  |                        spacing = 50.00GHz, | ||||||
|  |                        transceiver output power = 0.00dBm, | ||||||
|  |                        nb_channels = 76) | ||||||
|  | Input optical power reference in span = [1;36;40m0.00 dBm[0m: | ||||||
| Transceiver Site_A | Transceiver Site_A | ||||||
|   GSNR (0.1nm, dB):          40.00 |   GSNR (0.1nm, dB):          40.00 | ||||||
|   GSNR (signal bw, dB):      35.92 |   GSNR (signal bw, dB):      35.92 | ||||||
| @@ -34,6 +40,7 @@ Edfa Edfa1 | |||||||
|   type_variety:           std_low_gain |   type_variety:           std_low_gain | ||||||
|   effective gain(dB):     5.26 |   effective gain(dB):     5.26 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      13.74 |   noise figure (dB):      13.74 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        2.74 |   pad att_in (dB):        2.74 | ||||||
| @@ -54,7 +61,7 @@ Transceiver Site_B | |||||||
|   Latency (ms):              0.39 |   Latency (ms):              0.39 | ||||||
|   Actual pch out (dBm):      0.00 |   Actual pch out (dBm):      0.00 | ||||||
|  |  | ||||||
| Transmission result for input power = 0.00 dBm: | Transmission result for input optical power reference in span = 0.00 dBm: | ||||||
|   Final GSNR (0.1 nm): [1;36;40m31.44 dB[0m |   Final GSNR (0.1 nm): [1;36;40m31.44 dB[0m | ||||||
|  |  | ||||||
| The GSNR per channel at the end of the line is: | The GSNR per channel at the end of the line is: | ||||||
|   | |||||||
| @@ -1,12 +1,18 @@ | |||||||
| There are 96 channels propagating |  | ||||||
| Power mode is set to True | Power mode is set to True | ||||||
| => it can be modified in eqpt_config.json - Span | => it can be modified in eqpt_config.json - Span | ||||||
|  |  | ||||||
| There are 15 fiber spans over 1200 km between Site_A and Site_B | There are 15 fiber spans over 1200 km between Site_A and Site_B | ||||||
|  |  | ||||||
| Now propagating between Site_A and Site_B: | Now propagating between Site_A and Site_B: | ||||||
|  | Reference used for design: (Input optical power reference in span = 0.00dBm, | ||||||
|  |                             spacing = 50.00GHz | ||||||
|  |                             nb_channels = 96) | ||||||
|  |  | ||||||
| Propagating with input power = [1;36;40m0.00 dBm[0m: | Channels propagating: (Input optical power deviation in span = 0.00dB, | ||||||
|  |                        spacing = 50.00GHz, | ||||||
|  |                        transceiver output power = 0.00dBm, | ||||||
|  |                        nb_channels = 96) | ||||||
|  | Input optical power reference in span = [1;36;40m0.00 dBm[0m: | ||||||
| Transceiver Site_A | Transceiver Site_A | ||||||
|   GSNR (0.1nm, dB):          100.00 |   GSNR (0.1nm, dB):          100.00 | ||||||
|   GSNR (signal bw, dB):      95.92 |   GSNR (signal bw, dB):      95.92 | ||||||
| @@ -27,6 +33,7 @@ Edfa booster A | |||||||
|   type_variety:           std_medium_gain |   type_variety:           std_medium_gain | ||||||
|   effective gain(dB):     20.00 |   effective gain(dB):     20.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      6.58 |   noise figure (dB):      6.58 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -49,6 +56,7 @@ Edfa Edfa1 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -71,6 +79,7 @@ Edfa Edfa2 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -93,6 +102,7 @@ Edfa Edfa3 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -115,6 +125,7 @@ Edfa Edfa4 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -137,6 +148,7 @@ Edfa Edfa5 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -156,6 +168,7 @@ Edfa booster C | |||||||
|   type_variety:           std_medium_gain |   type_variety:           std_medium_gain | ||||||
|   effective gain(dB):     20.00 |   effective gain(dB):     20.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      6.58 |   noise figure (dB):      6.58 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -178,6 +191,7 @@ Edfa Edfa6 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -200,6 +214,7 @@ Edfa Edfa7 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -222,6 +237,7 @@ Edfa Edfa8 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -244,6 +260,7 @@ Edfa Edfa9 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -266,6 +283,7 @@ Edfa Edfa10 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -285,6 +303,7 @@ Edfa booster D | |||||||
|   type_variety:           std_medium_gain |   type_variety:           std_medium_gain | ||||||
|   effective gain(dB):     20.00 |   effective gain(dB):     20.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      6.58 |   noise figure (dB):      6.58 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -307,6 +326,7 @@ Edfa Edfa11 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -329,6 +349,7 @@ Edfa Edfa12 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -348,6 +369,7 @@ Edfa booster E | |||||||
|   type_variety:           std_medium_gain |   type_variety:           std_medium_gain | ||||||
|   effective gain(dB):     20.00 |   effective gain(dB):     20.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      6.58 |   noise figure (dB):      6.58 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -370,6 +392,7 @@ Edfa Edfa13 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -392,6 +415,7 @@ Edfa Edfa14 | |||||||
|   type_variety:           test_fixed_gain |   type_variety:           test_fixed_gain | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      9.00 |   noise figure (dB):      9.00 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        4.00 |   pad att_in (dB):        4.00 | ||||||
| @@ -414,6 +438,7 @@ Edfa Edfa15 | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     16.00 |   effective gain(dB):     16.00 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      8.86 |   noise figure (dB):      8.86 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -440,7 +465,7 @@ Transceiver Site_B | |||||||
|   Latency (ms):              5.88 |   Latency (ms):              5.88 | ||||||
|   Actual pch out (dBm):      0.00 |   Actual pch out (dBm):      0.00 | ||||||
|  |  | ||||||
| Transmission result for input power = 0.00 dBm: | Transmission result for input optical power reference in span = 0.00 dBm: | ||||||
|   Final GSNR (0.1 nm): [1;36;40m17.84 dB[0m |   Final GSNR (0.1 nm): [1;36;40m17.84 dB[0m | ||||||
|  |  | ||||||
| (No source node specified: picked Site_A) | (No source node specified: picked Site_A) | ||||||
|   | |||||||
| @@ -1,12 +1,18 @@ | |||||||
| There are 96 channels propagating |  | ||||||
| Power mode is set to True | Power mode is set to True | ||||||
| => it can be modified in eqpt_config.json - Span | => it can be modified in eqpt_config.json - Span | ||||||
|  |  | ||||||
| There are 3 fiber spans over 130 km between trx Lannion_CAS and trx Lorient_KMA | There are 3 fiber spans over 130 km between trx Lannion_CAS and trx Lorient_KMA | ||||||
|  |  | ||||||
| Now propagating between trx Lannion_CAS and trx Lorient_KMA: | Now propagating between trx Lannion_CAS and trx Lorient_KMA: | ||||||
|  | Reference used for design: (Input optical power reference in span = 3.00dBm, | ||||||
|  |                             spacing = 50.00GHz | ||||||
|  |                             nb_channels = 96) | ||||||
|  |  | ||||||
| Propagating with input power = [1;36;40m3.00 dBm[0m: | Channels propagating: (Input optical power deviation in span = 0.00dB, | ||||||
|  |                        spacing = 50.00GHz, | ||||||
|  |                        transceiver output power = 3.00dBm, | ||||||
|  |                        nb_channels = 96) | ||||||
|  | Input optical power reference in span = [1;36;40m3.00 dBm[0m: | ||||||
| Transceiver trx Lannion_CAS | Transceiver trx Lannion_CAS | ||||||
|   GSNR (0.1nm, dB):          100.00 |   GSNR (0.1nm, dB):          100.00 | ||||||
|   GSNR (signal bw, dB):      95.92 |   GSNR (signal bw, dB):      95.92 | ||||||
| @@ -27,6 +33,7 @@ Edfa east edfa in Lannion_CAS to Corlay | |||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     21.18 |   effective gain(dB):     21.18 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      6.13 |   noise figure (dB):      6.13 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -71,6 +78,7 @@ Edfa west edfa in Lorient_KMA to Loudeac | |||||||
|   type_variety:           std_medium_gain |   type_variety:           std_medium_gain | ||||||
|   effective gain(dB):     27.99 |   effective gain(dB):     27.99 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|  |   tilt-target(dB)         0.00 | ||||||
|   noise figure (dB):      5.98 |   noise figure (dB):      5.98 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
| @@ -97,7 +105,7 @@ Transceiver trx Lorient_KMA | |||||||
|   Latency (ms):              0.64 |   Latency (ms):              0.64 | ||||||
|   Actual pch out (dBm):      3.00 |   Actual pch out (dBm):      3.00 | ||||||
|  |  | ||||||
| Transmission result for input power = 3.00 dBm: | Transmission result for input optical power reference in span = 3.00 dBm: | ||||||
|   Final GSNR (0.1 nm): [1;36;40m23.77 dB[0m |   Final GSNR (0.1 nm): [1;36;40m23.77 dB[0m | ||||||
|  |  | ||||||
| (Invalid source node 'lannion' replaced with trx Lannion_CAS) | (Invalid source node 'lannion' replaced with trx Lannion_CAS) | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ from gnpy.core.elements import Transceiver, Edfa, Fiber | |||||||
| from gnpy.core.utils import automatic_fmax, lin2db, db2lin, merge_amplifier_restrictions, dbm2watt, watt2dbm | from gnpy.core.utils import automatic_fmax, lin2db, db2lin, merge_amplifier_restrictions, dbm2watt, watt2dbm | ||||||
| from gnpy.core.info import create_input_spectral_information, create_arbitrary_spectral_information | from gnpy.core.info import create_input_spectral_information, create_arbitrary_spectral_information | ||||||
| from gnpy.core.network import build_network, set_amplifier_voa | from gnpy.core.network import build_network, set_amplifier_voa | ||||||
| from gnpy.tools.json_io import load_network, load_equipment, network_from_json | from gnpy.tools.json_io import load_network, load_equipment, load_json, _equipment_from_json, network_from_json | ||||||
| from pathlib import Path | from pathlib import Path | ||||||
| import pytest | import pytest | ||||||
|  |  | ||||||
| @@ -251,35 +251,35 @@ def test_amp_behaviour(tilt_target, delta_p): | |||||||
|     else: |     else: | ||||||
|         if delta_p != 2: |         if delta_p != 2: | ||||||
|             expected_sig_out = [ |             expected_sig_out = [ | ||||||
|                 -32.00529182, -31.93540907, -31.86554231, -31.79417979, -31.71903263, |                 -31.95025022, -31.88168886, -31.81178634, -31.73838831, -31.66318631, | ||||||
|                 -31.6424009, -31.56531159, -31.48775435, -31.41468382, -31.35973323, |                 -31.58762141, -31.51156294, -31.43760161, -31.38124626, -31.34245197, | ||||||
|                 -31.32286555, -31.28602346, -31.2472908, -31.20086569, -31.14671746, |                 -31.30629475, -31.26970711, -31.22566555, -31.17412914, -31.11806869, | ||||||
|                 -31.08702653, -31.01341963, -30.93430243, -30.87791656, -30.84413339, |                 -31.05122228, -30.97358131, -30.90658619, -30.86616148, -30.83854197, | ||||||
|                 -30.81605918, -30.78824936, -30.76071036, -30.73319161, -30.70494101, |                 -30.81115028, -30.78403337, -30.7570206, -30.73002834, -30.70088634, | ||||||
|                 -30.67368479, -30.63941012, -30.60178381, -30.55585766, -30.5066561, |                 -30.66844432, -30.63427939, -30.59364514, -30.54659009, -30.49180643, | ||||||
|                 -30.43426575, -30.33848379, -30.24471112, -30.18220815, -30.15076699, |                 -30.41406352, -30.31434813, -30.22984104, -30.18249387, -30.1516453, | ||||||
|                 -30.11934744, -30.08776718, -30.05548097, -30.02250068, -29.98954302, |                 -30.12082034, -30.08970494, -30.05779424, -30.02543415, -29.99309889, | ||||||
|                 -29.95661362, -29.92370274, -29.8854762, -29.84193785, -29.79238328, |                 -29.96078803, -29.92798594, -29.89002127, -29.84689015, -29.79726968, | ||||||
|                 -29.72452662, -29.6385071, -29.54788144, -29.44581202, -29.33924103, |                 -29.72927112, -29.64485972, -29.55578693, -29.45569694, -29.35111795, | ||||||
|                 -29.23276107, -29.10289365, -28.91425473, -28.70204648, -28.50670713, |                 -29.24662471, -29.12148491, -28.94244964, -28.73421833, -28.53930479, | ||||||
|                 -28.3282514, -28.15895225, -28.009065, -27.87864672, -27.76315964, |                 -28.36231261, -28.19361236, -28.04376778, -27.91280403, -27.79433658, | ||||||
|                 -27.68523133, -27.62260405, -27.58076622] |                 -27.7065072, -27.64495288, -27.59798975] | ||||||
|  |  | ||||||
|         else: |         else: | ||||||
|             expected_sig_out = [ |             expected_sig_out = [ | ||||||
|                 -30.00529182, -29.93540907, -29.86554231, -29.79417979, -29.71903263, |                 -29.95025022, -29.88168886, -29.81178634, -29.73838831, -29.66318631, | ||||||
|                 -29.6424009, -29.56531159, -29.48775435, -29.41468382, -29.35973323, |                 -29.58762141, -29.51156294, -29.43760161, -29.38124626, -29.34245197, | ||||||
|                 -29.32286555, -29.28602346, -29.2472908, -29.20086569, -29.14671746, |                 -29.30629475, -29.26970711, -29.22566555, -29.17412914, -29.11806869, | ||||||
|                 -29.08702653, -29.01341963, -28.93430243, -28.87791656, -28.84413339, |                 -29.05122228, -28.97358131, -28.90658619, -28.86616148, -28.83854197, | ||||||
|                 -28.81605918, -28.78824936, -28.76071036, -28.73319161, -28.70494101, |                 -28.81115028, -28.78403337, -28.7570206, -28.73002834, -28.70088634, | ||||||
|                 -28.67368479, -28.63941012, -28.60178381, -28.55585766, -28.5066561, |                 -28.66844432, -28.63427939, -28.59364514, -28.54659009, -28.49180643, | ||||||
|                 -28.43426575, -28.33848379, -28.24471112, -28.18220815, -28.15076699, |                 -28.41406352, -28.31434813, -28.22984104, -28.18249387, -28.1516453, | ||||||
|                 -28.11934744, -28.08776718, -28.05548097, -28.02250068, -27.98954302, |                 -28.12082034, -28.08970494, -28.05779424, -28.02543415, -27.99309889, | ||||||
|                 -27.95661362, -27.92370274, -27.8854762, -27.84193785, -27.79238328, |                 -27.96078803, -27.92798594, -27.89002127, -27.84689015, -27.79726968, | ||||||
|                 -27.72452662, -27.6385071, -27.54788144, -27.44581202, -27.33924103, |                 -27.72927112, -27.64485972, -27.55578693, -27.45569694, -27.35111795, | ||||||
|                 -27.23276107, -27.10289365, -26.91425473, -26.70204648, -26.50670713, |                 -27.24662471, -27.12148491, -26.94244964, -26.73421833, -26.53930479, | ||||||
|                 -26.3282514, -26.15895225, -26.009065, -25.87864672, -25.76315964, |                 -26.36231261, -26.19361236, -26.04376778, -25.91280403, -25.79433658, | ||||||
|                 -25.68523133, -25.62260405, -25.58076622] |                 -25.7065072, -25.64495288, -25.59798975] | ||||||
|  |  | ||||||
|         print(sig_out) |         print(sig_out) | ||||||
|         assert_allclose(sig_out, expected_sig_out, rtol=1e-9) |         assert_allclose(sig_out, expected_sig_out, rtol=1e-9) | ||||||
| @@ -365,3 +365,143 @@ def test_set_out_voa(): | |||||||
|     assert amp.out_voa == 4.0 |     assert amp.out_voa == 4.0 | ||||||
|     assert amp.effective_gain == 20.0 + 4.0 |     assert amp.effective_gain == 20.0 + 4.0 | ||||||
|     assert amp.delta_p == -3.0 + 4.0 |     assert amp.delta_p == -3.0 + 4.0 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def test_multiband(): | ||||||
|  |  | ||||||
|  |     equipment_json = load_json(eqpt_library) | ||||||
|  |     # add some multiband amplifiers | ||||||
|  |     amps = [ | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_medium_gain_C", | ||||||
|  |             "f_min": 191.25e12, | ||||||
|  |             "f_max": 196.15e12, | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 26, | ||||||
|  |             "gain_min": 15, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf_min": 6, | ||||||
|  |             "nf_max": 10, | ||||||
|  |             "out_voa_auto": False, | ||||||
|  |             "allowed_for_design": True}, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_medium_gain_L", | ||||||
|  |             "f_min": 186.55e12, | ||||||
|  |             "f_max": 190.05e12, | ||||||
|  |             "type_def": "variable_gain", | ||||||
|  |             "gain_flatmax": 26, | ||||||
|  |             "gain_min": 15, | ||||||
|  |             "p_max": 21, | ||||||
|  |             "nf_min": 6, | ||||||
|  |             "nf_max": 10, | ||||||
|  |             "out_voa_auto": False, | ||||||
|  |             "allowed_for_design": True}, | ||||||
|  |         { | ||||||
|  |             "type_variety": "std_medium_gain_multiband", | ||||||
|  |             "type_def": "multi_band", | ||||||
|  |             "amplifiers": [ | ||||||
|  |                 "std_medium_gain_C", | ||||||
|  |                 "std_medium_gain_L" | ||||||
|  |             ], | ||||||
|  |             "allowed_for_design": False | ||||||
|  |         } | ||||||
|  |     ] | ||||||
|  |     equipment_json['Edfa'].extend(amps) | ||||||
|  |  | ||||||
|  |     equipment = _equipment_from_json(equipment_json, eqpt_library) | ||||||
|  |  | ||||||
|  |     el_config = { | ||||||
|  |         "uid": "Edfa1", | ||||||
|  |         "type": "Multiband_amplifier", | ||||||
|  |         "type_variety": "std_medium_gain_multiband", | ||||||
|  |         "amplifiers": [ | ||||||
|  |             { | ||||||
|  |                 "type_variety": "std_medium_gain_C", | ||||||
|  |                 "operational": { | ||||||
|  |                     "gain_target": 22.55, | ||||||
|  |                     "delta_p": 0.9, | ||||||
|  |                     "out_voa": 3.0, | ||||||
|  |                     "tilt_target": 0.0, | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "type_variety": "std_medium_gain_L", | ||||||
|  |                 "operational": { | ||||||
|  |                     "gain_target": 21, | ||||||
|  |                     "delta_p": 3.0, | ||||||
|  |                     "out_voa": 3.0, | ||||||
|  |                     "tilt_target": 0.0, | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     } | ||||||
|  |     fused_config = { | ||||||
|  |         "uid": "[83/WR-2-4-SIG=>930/WRT-1-2-SIG]-Tl/9300", | ||||||
|  |         "type": "Fused", | ||||||
|  |         "params": { | ||||||
|  |             "loss": 20 | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     json_data = { | ||||||
|  |         "elements": [ | ||||||
|  |             el_config, | ||||||
|  |             fused_config | ||||||
|  |         ], | ||||||
|  |         "connections": [] | ||||||
|  |     } | ||||||
|  |     network = network_from_json(json_data, equipment) | ||||||
|  |     amp = next(n for n in network.nodes() if n.uid == 'Edfa1') | ||||||
|  |     fused = next(n for n in network.nodes() if n.uid == '[83/WR-2-4-SIG=>930/WRT-1-2-SIG]-Tl/9300') | ||||||
|  |     si = create_input_spectral_information(f_min=186e12, f_max=196e12, roll_off=0.15, baud_rate=32e9, tx_power=1e-3, | ||||||
|  |                                            spacing=50e9, tx_osnr=40.0) | ||||||
|  |     assert si.number_of_channels == 200 | ||||||
|  |     si = fused(si) | ||||||
|  |     si = amp(si) | ||||||
|  |     # assert nb of channel after mux/demux | ||||||
|  |     assert si.number_of_channels == 164    # computed based on amp bands | ||||||
|  |     # Check that multiband amp is correctly created with correct __str__ | ||||||
|  |     actual_c_amp = amp.amplifiers["CBAND"].__str__() | ||||||
|  |     expected_c_amp = '\n'.join([ | ||||||
|  |         'Edfa Edfa1', | ||||||
|  |         '  type_variety:           std_medium_gain_C', | ||||||
|  |         '  effective gain(dB):     21.22', | ||||||
|  |         '  (before att_in and before output VOA)', | ||||||
|  |         '  tilt-target(dB)         0.00', | ||||||
|  |         '  noise figure (dB):      6.32', | ||||||
|  |         '  (including att_in)', | ||||||
|  |         '  pad att_in (dB):        0.00', | ||||||
|  |         '  Power In (dBm):         -0.22', | ||||||
|  |         '  Power Out (dBm):        21.01', | ||||||
|  |         '  Delta_P (dB):           0.90', | ||||||
|  |         '  target pch (dBm):       None', | ||||||
|  |         '  actual pch out (dBm):   -1.77', | ||||||
|  |         '  output VOA (dB):        3.00']) | ||||||
|  |     assert actual_c_amp == expected_c_amp | ||||||
|  |     actual_l_amp = amp.amplifiers["LBAND"].__str__() | ||||||
|  |     expected_l_amp = '\n'.join([ | ||||||
|  |         'Edfa Edfa1', | ||||||
|  |         '  type_variety:           std_medium_gain_L', | ||||||
|  |         '  effective gain(dB):     21.00', | ||||||
|  |         '  (before att_in and before output VOA)', | ||||||
|  |         '  tilt-target(dB)         0.00', | ||||||
|  |         '  noise figure (dB):      6.36', | ||||||
|  |         '  (including att_in)', | ||||||
|  |         '  pad att_in (dB):        0.00', | ||||||
|  |         '  Power In (dBm):         -1.61', | ||||||
|  |         '  Power Out (dBm):        19.40', | ||||||
|  |         '  Delta_P (dB):           3.00', | ||||||
|  |         '  target pch (dBm):       None', | ||||||
|  |         '  actual pch out (dBm):   -1.99', | ||||||
|  |         '  output VOA (dB):        3.00']) | ||||||
|  |     assert actual_l_amp == expected_l_amp | ||||||
|  |  | ||||||
|  |     # check that f_min, f_max of si are within amp band | ||||||
|  |     assert amp.amplifiers["LBAND"].params.f_min == 186.55e12 | ||||||
|  |     assert si.frequency[0] >= amp.amplifiers["LBAND"].params.f_min | ||||||
|  |     assert amp.amplifiers["CBAND"].params.f_max == 196.15e12 | ||||||
|  |     assert si.frequency[-1] <= amp.amplifiers["CBAND"].params.f_max | ||||||
|  |     for freq in si.frequency: | ||||||
|  |         if freq > 190.05e12: | ||||||
|  |             assert freq >= 191.25e12 | ||||||
|  |         if freq < 191.25e12: | ||||||
|  |             assert freq <= 190.25e12 | ||||||
|   | |||||||
| @@ -72,7 +72,8 @@ def test_equalization_combination_degree(delta_pdb_per_channel, degree, equaliza | |||||||
|                 "preamp_variety_list": [], |                 "preamp_variety_list": [], | ||||||
|                 "booster_variety_list": [] |                 "booster_variety_list": [] | ||||||
|             }, |             }, | ||||||
|             "roadm-path-impairments": [] |             "roadm-path-impairments": [], | ||||||
|  |             "design_bands": None | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     roadm = Roadm(**roadm_config) |     roadm = Roadm(**roadm_config) | ||||||
| @@ -124,7 +125,8 @@ def test_wrong_element_config(equalization_type): | |||||||
|             "restrictions": { |             "restrictions": { | ||||||
|                 "preamp_variety_list": [], |                 "preamp_variety_list": [], | ||||||
|                 "booster_variety_list": [] |                 "booster_variety_list": [] | ||||||
|             } |             }, | ||||||
|  |             "design_bands": None | ||||||
|         }, |         }, | ||||||
|         "metadata": { |         "metadata": { | ||||||
|             "location": { |             "location": { | ||||||
| @@ -236,7 +238,8 @@ def test_low_input_power(target_out, delta_pdb_per_channel, correction): | |||||||
|                 "preamp_variety_list": [], |                 "preamp_variety_list": [], | ||||||
|                 "booster_variety_list": [] |                 "booster_variety_list": [] | ||||||
|             }, |             }, | ||||||
|             "roadm-path-impairments": [] |             "roadm-path-impairments": [], | ||||||
|  |             "design_bands": None | ||||||
|         }, |         }, | ||||||
|         "metadata": { |         "metadata": { | ||||||
|             "location": { |             "location": { | ||||||
| @@ -290,7 +293,8 @@ def test_2low_input_power(target_out, delta_pdb_per_channel, correction): | |||||||
|                 "preamp_variety_list": [], |                 "preamp_variety_list": [], | ||||||
|                 "booster_variety_list": [] |                 "booster_variety_list": [] | ||||||
|             }, |             }, | ||||||
|             "roadm-path-impairments": [] |             "roadm-path-impairments": [], | ||||||
|  |             "design_bands": None | ||||||
|         }, |         }, | ||||||
|         "metadata": { |         "metadata": { | ||||||
|             "location": { |             "location": { | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ SRC_ROOT = Path(__file__).parent.parent | |||||||
|     ('transmission_main_example', None, transmission_main_example, []), |     ('transmission_main_example', None, transmission_main_example, []), | ||||||
|     ('transmission_saturated', 'logs_transmission_saturated', transmission_main_example, |     ('transmission_saturated', 'logs_transmission_saturated', transmission_main_example, | ||||||
|      ['tests/data/testTopology_expected.json', 'lannion', 'lorient', '-e', 'tests/data/eqpt_config.json', '--pow', '3']), |      ['tests/data/testTopology_expected.json', 'lannion', 'lorient', '-e', 'tests/data/eqpt_config.json', '--pow', '3']), | ||||||
|     ('path_requests_run', 'logs_path_request', path_requests_run, ['-v']), |     ('path_requests_run', 'logs_path_request', path_requests_run, ['--redesign-per-request', '-v']), | ||||||
|     ('transmission_main_example__raman', None, transmission_main_example, |     ('transmission_main_example__raman', None, transmission_main_example, | ||||||
|      ['gnpy/example-data/raman_edfa_example_network.json', '--sim', 'gnpy/example-data/sim_params.json', '--show-channels', ]), |      ['gnpy/example-data/raman_edfa_example_network.json', '--sim', 'gnpy/example-data/sim_params.json', '--show-channels', ]), | ||||||
|     ('openroadm-v4-Stockholm-Gothenburg', None, transmission_main_example, |     ('openroadm-v4-Stockholm-Gothenburg', None, transmission_main_example, | ||||||
| @@ -37,6 +37,9 @@ SRC_ROOT = Path(__file__).parent.parent | |||||||
|      ['-e', 'tests/data/eqpt_config_psd.json', 'tests/data/test_long_network.json', '--spectrum', 'gnpy/example-data/initial_spectrum2.json', ]), |      ['-e', 'tests/data/eqpt_config_psd.json', 'tests/data/test_long_network.json', '--spectrum', 'gnpy/example-data/initial_spectrum2.json', ]), | ||||||
|     ('transmission_long_psw', None, transmission_main_example, |     ('transmission_long_psw', None, transmission_main_example, | ||||||
|      ['-e', 'tests/data/eqpt_config_psw.json', 'tests/data/test_long_network.json', '--spectrum', 'gnpy/example-data/initial_spectrum2.json', ]), |      ['-e', 'tests/data/eqpt_config_psw.json', 'tests/data/test_long_network.json', '--spectrum', 'gnpy/example-data/initial_spectrum2.json', ]), | ||||||
|  |     ('multiband_transmission', None, transmission_main_example, | ||||||
|  |      ['gnpy/example-data/multiband_example_network.json', 'Site_A', 'Site_D', '-e', 'gnpy/example-data/eqpt_config_multiband.json', | ||||||
|  |       '--spectrum', 'gnpy/example-data/multiband_spectrum.json', '--show-channels']) | ||||||
| )) | )) | ||||||
| def test_example_invocation(capfd, caplog, output, log, handler, args): | def test_example_invocation(capfd, caplog, output, log, handler, args): | ||||||
|     """Make sure that our examples produce useful output""" |     """Make sure that our examples produce useful output""" | ||||||
|   | |||||||
| @@ -34,8 +34,8 @@ def test_jsonthing(caplog): | |||||||
|         "sys_margins": 2 |         "sys_margins": 2 | ||||||
|     } |     } | ||||||
|     _ = SI(**json_data) |     _ = SI(**json_data) | ||||||
|     expected_msg = 'WARNING missing f_min attribute in eqpt_config.json[SI]\n\t' \ |     expected_msg = '\n\tWARNING missing f_min attribute in eqpt_config.json[SI]\n' \ | ||||||
|                    + 'default value is f_min = 191350000000000.0' |                    + '\tdefault value is f_min = 191350000000000.0' | ||||||
|     assert expected_msg in caplog.text |     assert expected_msg in caplog.text | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -6,15 +6,20 @@ | |||||||
|  |  | ||||||
| from pathlib import Path | from pathlib import Path | ||||||
| import pytest | import pytest | ||||||
| from gnpy.core.exceptions import NetworkTopologyError | from numpy.testing import assert_allclose | ||||||
| from gnpy.core.network import span_loss, build_network |  | ||||||
| from gnpy.tools.json_io import load_equipment, load_network, network_from_json | from gnpy.core.exceptions import NetworkTopologyError, ConfigurationError | ||||||
| from gnpy.core.utils import lin2db, automatic_nch | from gnpy.core.network import span_loss, build_network, select_edfa, get_node_restrictions, \ | ||||||
| from gnpy.core.elements import Fiber, Edfa |     estimate_srs_power_deviation, add_missing_elements_in_network, get_next_node | ||||||
|  | from gnpy.tools.json_io import load_equipment, load_network, network_from_json, load_json | ||||||
|  | from gnpy.core.utils import lin2db, automatic_nch, merge_amplifier_restrictions | ||||||
|  | from gnpy.core.elements import Fiber, Edfa, Roadm, Multiband_amplifier | ||||||
|  | from gnpy.core.parameters import SimParams, EdfaParams, MultiBandParams | ||||||
|  |  | ||||||
|  |  | ||||||
| TEST_DIR = Path(__file__).parent | TEST_DIR = Path(__file__).parent | ||||||
| EQPT_FILENAME = TEST_DIR / 'data/eqpt_config.json' | EQPT_FILENAME = TEST_DIR / 'data/eqpt_config.json' | ||||||
|  | EQPT_MULTBAND_FILENAME = TEST_DIR / 'data/eqpt_config_multiband.json' | ||||||
| NETWORK_FILENAME = TEST_DIR / 'data/bugfixiteratortopo.json' | NETWORK_FILENAME = TEST_DIR / 'data/bugfixiteratortopo.json' | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -241,3 +246,506 @@ def test_design_non_amplified_link(elem1, elem2, expected_gain, expected_delta_p | |||||||
|         assert amp.delta_p == expected_delta_p |         assert amp.delta_p == expected_delta_p | ||||||
|         # max power of std_low_gain is 21 dBm |         # max power of std_low_gain is 21 dBm | ||||||
|         assert amp.effective_gain == expected_gain |         assert amp.effective_gain == expected_gain | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def network_base(case, site_type, length=50.0, amplifier_type='Multiband_amplifier'): | ||||||
|  |     base_network = { | ||||||
|  |         'elements': [ | ||||||
|  |             { | ||||||
|  |                 'uid': 'trx SITE1', | ||||||
|  |                 'type': 'Transceiver' | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'uid': 'trx SITE2', | ||||||
|  |                 'type': 'Transceiver' | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'uid': 'roadm SITE1', | ||||||
|  |                 'type': 'Roadm' | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'uid': 'roadm SITE2', | ||||||
|  |                 'type': 'Roadm' | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'uid': 'fiber (SITE1 → ILA1)', | ||||||
|  |                 'type': 'Fiber', | ||||||
|  |                 'type_variety': 'SSMF', | ||||||
|  |                 'params': { | ||||||
|  |                     'length': length, | ||||||
|  |                     'loss_coef': 0.2, | ||||||
|  |                     'length_units': 'km' | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'uid': 'fiber (ILA1 → ILA2)', | ||||||
|  |                 'type': 'Fiber', | ||||||
|  |                 'type_variety': 'SSMF', | ||||||
|  |                 'params': { | ||||||
|  |                     'length': 50.0, | ||||||
|  |                     'loss_coef': 0.2, | ||||||
|  |                     'length_units': 'km' | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'uid': 'fiber (ILA2 → SITE2)', | ||||||
|  |                 'type': 'Fiber', | ||||||
|  |                 'type_variety': 'SSMF', | ||||||
|  |                 'params': { | ||||||
|  |                     'length': 50.0, | ||||||
|  |                     'loss_coef': 0.2, | ||||||
|  |                     'length_units': 'km' | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'uid': 'east edfa in SITE1 to ILA1', | ||||||
|  |                 'type': amplifier_type | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'uid': 'east edfa or fused in ILA1', | ||||||
|  |                 'type': site_type | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'uid': 'east edfa in ILA2', | ||||||
|  |                 'type': amplifier_type | ||||||
|  |             }, { | ||||||
|  |                 'uid': 'west edfa in SITE2 to ILA1', | ||||||
|  |                 'type': amplifier_type | ||||||
|  |             } | ||||||
|  |         ], | ||||||
|  |         'connections': [ | ||||||
|  |             { | ||||||
|  |                 'from_node': 'trx SITE1', | ||||||
|  |                 'to_node': 'roadm SITE1' | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'from_node': 'roadm SITE1', | ||||||
|  |                 'to_node': 'east edfa in SITE1 to ILA1' | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'from_node': 'east edfa in SITE1 to ILA1', | ||||||
|  |                 'to_node': 'fiber (SITE1 → ILA1)' | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'from_node': 'fiber (SITE1 → ILA1)', | ||||||
|  |                 'to_node': 'east edfa or fused in ILA1' | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'from_node': 'east edfa or fused in ILA1', | ||||||
|  |                 'to_node': 'fiber (ILA1 → ILA2)' | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'from_node': 'fiber (ILA1 → ILA2)', | ||||||
|  |                 'to_node': 'east edfa in ILA2' | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'from_node': 'east edfa in ILA2', | ||||||
|  |                 'to_node': 'fiber (ILA2 → SITE2)' | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'from_node': 'fiber (ILA2 → SITE2)', | ||||||
|  |                 'to_node': 'west edfa in SITE2 to ILA1' | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'from_node': 'west edfa in SITE2 to ILA1', | ||||||
|  |                 'to_node': 'roadm SITE2' | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'from_node': 'roadm SITE2', | ||||||
|  |                 'to_node': 'trx SITE2' | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     } | ||||||
|  |     multiband_amps = [e for e in base_network['elements'] if e['type'] == 'Multiband_amplifier'] | ||||||
|  |     edfa2 = next(e for e in base_network['elements'] if e['uid'] == 'east edfa in ILA2') | ||||||
|  |     roadm1 = next(e for e in base_network['elements'] if e['uid'] == 'roadm SITE1') | ||||||
|  |     fused = [e for e in base_network['elements'] if e['type'] == 'Fused'] | ||||||
|  |     if case == 'monoband_no_design_band': | ||||||
|  |         pass | ||||||
|  |     elif case == 'monoband_roadm': | ||||||
|  |         roadm1['params'] = { | ||||||
|  |             'design_bands': [ | ||||||
|  |                 {'f_min': 192.3e12, 'f_max': 196.0e12} | ||||||
|  |             ] | ||||||
|  |         } | ||||||
|  |     elif case == 'monoband_per_degree': | ||||||
|  |         roadm1['params'] = { | ||||||
|  |             'per_degree_design_bands': { | ||||||
|  |                 'east edfa in SITE1 to ILA1': [ | ||||||
|  |                     {'f_min': 191.5e12, 'f_max': 195.0e12} | ||||||
|  |                 ] | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     elif case == 'monoband_design': | ||||||
|  |         edfa2['type_variety'] = 'std_medium_gain' | ||||||
|  |     elif case == 'design': | ||||||
|  |         for elem in multiband_amps: | ||||||
|  |             elem['type_variety'] = 'std_medium_gain_multiband' | ||||||
|  |             elem['amplifiers'] = [{ | ||||||
|  |                 'type_variety': 'std_medium_gain', | ||||||
|  |                 'operational': { | ||||||
|  |                     'delta_p': 0, | ||||||
|  |                     'tilt_target': 0 | ||||||
|  |                 } | ||||||
|  |             }, { | ||||||
|  |                 'type_variety': 'std_medium_gain_L', | ||||||
|  |                 'operational': { | ||||||
|  |                     'delta_p': -1, | ||||||
|  |                     'tilt_target': 0 | ||||||
|  |                 } | ||||||
|  |             }] | ||||||
|  |         for elem in fused: | ||||||
|  |             elem['params'] = {'loss': 0.0} | ||||||
|  |     elif case == 'no_design': | ||||||
|  |         # user must indicate the bands otherwise SI band (single band is assumed) and this is not | ||||||
|  |         # consistent with multiband amps. | ||||||
|  |         roadm1['params'] = { | ||||||
|  |             'per_degree_design_bands': { | ||||||
|  |                 'east edfa in SITE1 to ILA1': [ | ||||||
|  |                     {'f_min': 191.3e12, 'f_max': 196.0e12}, | ||||||
|  |                     {'f_min': 187.0e12, 'f_max': 190.0e12} | ||||||
|  |                 ] | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     elif case == 'type_variety': | ||||||
|  |         # bands are implicit based on amplifiers type_varieties | ||||||
|  |         for elem in multiband_amps: | ||||||
|  |             elem['type_variety'] = 'std_medium_gain_multiband' | ||||||
|  |     return base_network | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.parametrize('case, site_type, amplifier_type, expected_design_bands, expected_per_degree_design_bands', [ | ||||||
|  |     ('monoband_no_design_band', 'Edfa', 'Edfa', | ||||||
|  |      [{'f_min': 191.3e12, 'f_max': 196.1e12}], [{'f_min': 191.3e12, 'f_max': 196.1e12}]), | ||||||
|  |     ('monoband_roadm', 'Edfa', 'Edfa', | ||||||
|  |      [{'f_min': 192.3e12, 'f_max': 196.0e12}], [{'f_min': 192.3e12, 'f_max': 196.0e12}]), | ||||||
|  |     ('monoband_per_degree', 'Edfa', 'Edfa', | ||||||
|  |      [{'f_min': 191.3e12, 'f_max': 196.1e12}], [{'f_min': 191.5e12, 'f_max': 195.0e12}]), | ||||||
|  |     ('monoband_design', 'Edfa', 'Edfa', | ||||||
|  |      [{'f_min': 191.3e12, 'f_max': 196.1e12}], [{'f_min': 191.3e12, 'f_max': 196.1e12}]), | ||||||
|  |     ('design', 'Fused', 'Multiband_amplifier', | ||||||
|  |      [{'f_min': 191.3e12, 'f_max': 196.1e12}], | ||||||
|  |      [{'f_min': 186.55e12, 'f_max': 190.05e12}, {'f_min': 191.25e12, 'f_max': 196.15e12}]), | ||||||
|  |     ('no_design', 'Fused', 'Multiband_amplifier', | ||||||
|  |      [{'f_min': 191.3e12, 'f_max': 196.1e12}], | ||||||
|  |      [{'f_min': 187.0e12, 'f_max': 190.0e12}, {'f_min': 191.3e12, 'f_max': 196.0e12}])]) | ||||||
|  | def test_design_band(case, site_type, amplifier_type, expected_design_bands, expected_per_degree_design_bands): | ||||||
|  |     """Check design_band is the one defined: | ||||||
|  |     - in SI if nothing is defined, | ||||||
|  |     - in ROADM if no design_band is defined for degree | ||||||
|  |     - in per_degree | ||||||
|  |     - if no design is defined, | ||||||
|  |         - if type variety is defined: use it for determining bands | ||||||
|  |         - if no type_variety autodesign is as expected, design uses OMS defined set of bands | ||||||
|  |     EOL is added only once on spans. One span can be one fiber or several fused fibers | ||||||
|  |     EOL is then added on the first fiber only. | ||||||
|  |     """ | ||||||
|  |     json_data = network_base(case, site_type, amplifier_type=amplifier_type) | ||||||
|  |     equipment = load_equipment(EQPT_MULTBAND_FILENAME) | ||||||
|  |     network = network_from_json(json_data, equipment) | ||||||
|  |     p_db = equipment['SI']['default'].power_dbm | ||||||
|  |     p_total_db = p_db + lin2db(automatic_nch(equipment['SI']['default'].f_min, | ||||||
|  |                                              equipment['SI']['default'].f_max, equipment['SI']['default'].spacing)) | ||||||
|  |     build_network(network, equipment, p_db, p_total_db) | ||||||
|  |     roadm1 = next(n for n in network.nodes() if n.uid == 'roadm SITE1') | ||||||
|  |     assert roadm1.design_bands == expected_design_bands | ||||||
|  |     assert roadm1.per_degree_design_bands['east edfa in SITE1 to ILA1'] == expected_per_degree_design_bands | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.parametrize('raman_allowed, gain_target, power_target, target_extended_gain, warning, expected_selection', [ | ||||||
|  |     (False, 20, 20, 3, False, ('test_fixed_gain', 0)), | ||||||
|  |     (False, 20, 25, 3, False, ('test_fixed_gain', -4)), | ||||||
|  |     (False, 10, 15, 3, False, ('std_low_gain_bis', 0)), | ||||||
|  |     (False, 5, 15, 3, "is below all available amplifiers min gain", ('std_low_gain_bis', 0)), | ||||||
|  |     (False, 30, 15, 3, "is beyond all available amplifiers capabilities", ('std_medium_gain', -1)), | ||||||
|  | ]) | ||||||
|  | def test_select_edfa(caplog, raman_allowed, gain_target, power_target, target_extended_gain, warning, expected_selection): | ||||||
|  |     """ | ||||||
|  |     """ | ||||||
|  |     equipment = load_equipment(EQPT_MULTBAND_FILENAME) | ||||||
|  |     edfa_eqpt = {n: a for n, a in equipment['Edfa'].items() if a.type_def != 'multi_band'} | ||||||
|  |     selection = select_edfa(raman_allowed, gain_target, power_target, edfa_eqpt, "toto", target_extended_gain, verbose=True) | ||||||
|  |     assert selection == expected_selection | ||||||
|  |     if warning: | ||||||
|  |         assert warning in caplog.text | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.parametrize('cls, defaultparams, variety_list, booster_list, band, expected_restrictions', [ | ||||||
|  |     (Edfa, EdfaParams, [], [], | ||||||
|  |      {'LBAND': {'f_min': 187.0e12, 'f_max': 190.0e12}}, | ||||||
|  |      ['std_medium_gain_L', 'std_low_gain_L_ter', 'std_low_gain_L']), | ||||||
|  |     (Edfa, EdfaParams, [], [], | ||||||
|  |      {'CBAND': {'f_min': 191.3e12, 'f_max': 196.0e12}}, | ||||||
|  |      ['CienaDB_medium_gain', 'std_medium_gain', 'std_low_gain', 'std_low_gain_bis', 'test', 'test_fixed_gain']), | ||||||
|  |     (Edfa, EdfaParams, ['std_medium_gain', 'std_high_gain'], [], | ||||||
|  |      {'CBAND': {'f_min': 191.3e12, 'f_max': 196.0e12}}, | ||||||
|  |      ['std_medium_gain']),   # name in variety list does not exist in library | ||||||
|  |     (Edfa, EdfaParams, ['std_medium_gain', 'std_high_gain'], [], | ||||||
|  |      {'LBAND': {'f_min': 187.0e12, 'f_max': 190.0e12}}, | ||||||
|  |      []),   # restrictions inconsistency with bands | ||||||
|  |     (Edfa, EdfaParams, ['std_medium_gain', 'std_high_gain'], ['std_booster'], | ||||||
|  |      {'CBAND': {'f_min': 191.3e12, 'f_max': 196.0e12}}, | ||||||
|  |      ['std_medium_gain']),  # variety list takes precedence over booster constraint | ||||||
|  |     (Edfa, EdfaParams, [], ['std_booster'], | ||||||
|  |      {'CBAND': {'f_min': 191.3e12, 'f_max': 196.0e12}}, | ||||||
|  |      ['std_booster']), | ||||||
|  |     (Multiband_amplifier, MultiBandParams, [], [], | ||||||
|  |      {'CBAND': {'f_min': 191.3e12, 'f_max': 196.0e12}, 'LBAND': {'f_min': 187.0e12, 'f_max': 190.0e12}}, | ||||||
|  |      ['std_medium_gain_multiband', 'std_low_gain_multiband_bis']), | ||||||
|  |     (Multiband_amplifier, MultiBandParams, [], ['std_booster_multiband', 'std_booster'], | ||||||
|  |      {'CBAND': {'f_min': 191.3e12, 'f_max': 196.0e12}, 'LBAND': {'f_min': 187.0e12, 'f_max': 190.0e12}}, | ||||||
|  |      ['std_booster_multiband']) | ||||||
|  | ]) | ||||||
|  | def test_get_node_restrictions(cls, defaultparams, variety_list, booster_list, band, expected_restrictions): | ||||||
|  |     """Check that all combinations of restrictions are correctly captured | ||||||
|  |     """ | ||||||
|  |     equipment = load_equipment(EQPT_MULTBAND_FILENAME) | ||||||
|  |     edfa_config = {"uid": "Edfa1"} | ||||||
|  |     if cls == Multiband_amplifier: | ||||||
|  |         edfa_config['amplifiers'] = {} | ||||||
|  |     edfa_config['params'] = defaultparams.default_values | ||||||
|  |     edfa_config['variety_list'] = variety_list | ||||||
|  |     node = cls(**edfa_config) | ||||||
|  |     roadm_config = { | ||||||
|  |         "uid": "roadm Brest_KLA", | ||||||
|  |         "params": { | ||||||
|  |             "per_degree_pch_out_db": {}, | ||||||
|  |             "target_pch_out_dbm": -18, | ||||||
|  |             "add_drop_osnr": 38, | ||||||
|  |             "pmd": 0, | ||||||
|  |             "pdl": 0, | ||||||
|  |             "restrictions": { | ||||||
|  |                 "preamp_variety_list": [], | ||||||
|  |                 "booster_variety_list": booster_list | ||||||
|  |             }, | ||||||
|  |             "roadm-path-impairments": [] | ||||||
|  |         }, | ||||||
|  |         "metadata": { | ||||||
|  |             "location": { | ||||||
|  |                 "city": "Brest_KLA", | ||||||
|  |                 "region": "RLD", | ||||||
|  |                 "latitude": 4.0, | ||||||
|  |                 "longitude": 0.0 | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     prev_node = Roadm(**roadm_config) | ||||||
|  |     fiber_config = { | ||||||
|  |         "uid": "fiber (SITE1 → ILA1)", | ||||||
|  |         "type_variety": "SSMF", | ||||||
|  |         "params": { | ||||||
|  |             "length": 100.0, | ||||||
|  |             "loss_coef": 0.2, | ||||||
|  |             "length_units": "km" | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     extra_params = equipment['Fiber']['SSMF'].__dict__ | ||||||
|  |  | ||||||
|  |     fiber_config['params'] = merge_amplifier_restrictions(fiber_config['params'], extra_params) | ||||||
|  |     next_node = Fiber(**fiber_config) | ||||||
|  |     restrictions = get_node_restrictions(node, prev_node, next_node, equipment, band) | ||||||
|  |     assert restrictions == expected_restrictions | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.usefixtures('set_sim_params') | ||||||
|  | @pytest.mark.parametrize('case, site_type, band, expected_gain, expected_tilt, expected_variety, sim_params', [ | ||||||
|  |     ('design', 'Multiband_amplifier', 'LBAND', 10.0, 0.0, 'std_medium_gain_multiband', False), | ||||||
|  |     ('no_design', 'Multiband_amplifier', 'LBAND', 10.0, 0.0, 'std_low_gain_multiband_bis', False), | ||||||
|  |     ('type_variety', 'Multiband_amplifier', 'LBAND', 10.0, 0.0, 'std_medium_gain_multiband', False), | ||||||
|  |     ('design', 'Multiband_amplifier', 'LBAND', 9.344985, 0.0, 'std_medium_gain_multiband', True), | ||||||
|  |     ('no_design', 'Multiband_amplifier', 'LBAND', 9.344985, -0.938676, 'std_low_gain_multiband_bis', True), | ||||||
|  |     ('no_design', 'Multiband_amplifier', 'CBAND', 10.977065, -1.600193, 'std_low_gain_multiband_bis', True), | ||||||
|  |     ('no_design', 'Fused', 'LBAND', 21.0, 0.0, 'std_medium_gain_multiband', False), | ||||||
|  |     ('no_design', 'Fused', 'LBAND', 20.344985, -0.819176, 'std_medium_gain_multiband', True), | ||||||
|  |     ('no_design', 'Fused', 'CBAND', 21.770319, -1.40032, 'std_medium_gain_multiband', True), | ||||||
|  |     ('design', 'Fused', 'CBAND', 21.21108, 0.0, 'std_medium_gain_multiband', True), | ||||||
|  |     ('design', 'Multiband_amplifier', 'CBAND', 11.041037, 0.0, 'std_medium_gain_multiband', True)]) | ||||||
|  | def test_multiband(case, site_type, band, expected_gain, expected_tilt, expected_variety, sim_params): | ||||||
|  |     """Check: | ||||||
|  |     - if amplifiers are defined in multiband they are used for design, | ||||||
|  |     - if no design is defined, | ||||||
|  |         - if type variety is defined: use it for determining bands | ||||||
|  |         - if no type_variety autodesign is as expected, design uses OMS defined set of bands | ||||||
|  |     EOL is added only once on spans. One span can be one fiber or several fused fibers | ||||||
|  |     EOL is then added on the first fiber only. | ||||||
|  |     """ | ||||||
|  |     json_data = network_base(case, site_type) | ||||||
|  |     equipment = load_equipment(EQPT_MULTBAND_FILENAME) | ||||||
|  |     network = network_from_json(json_data, equipment) | ||||||
|  |     p_db = equipment['SI']['default'].power_dbm | ||||||
|  |     p_total_db = p_db + lin2db(automatic_nch(equipment['SI']['default'].f_min, | ||||||
|  |                                              equipment['SI']['default'].f_max, equipment['SI']['default'].spacing)) | ||||||
|  |  | ||||||
|  |     if sim_params: | ||||||
|  |         SimParams.set_params(load_json(TEST_DIR / 'data' / 'sim_params.json')) | ||||||
|  |     build_network(network, equipment, p_db, p_total_db) | ||||||
|  |     amp2 = next(n for n in network.nodes() if n.uid == 'east edfa in ILA2') | ||||||
|  |     # restore simParams | ||||||
|  |     save_sim_params = {"raman_params": SimParams._shared_dict['raman_params'].to_json(), | ||||||
|  |                        "nli_params": SimParams._shared_dict['nli_params'].to_json()} | ||||||
|  |     SimParams.set_params(save_sim_params) | ||||||
|  |     print(amp2.to_json) | ||||||
|  |     assert_allclose(amp2.amplifiers[band].effective_gain, expected_gain, atol=1e-5) | ||||||
|  |     assert_allclose(amp2.amplifiers[band].tilt_target, expected_tilt, atol=1e-5) | ||||||
|  |     assert amp2.type_variety == expected_variety | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def test_tilt_fused(): | ||||||
|  |     """check that computed tilt is the same for one span 100km as 2 spans 30 +70 km | ||||||
|  |     """ | ||||||
|  |     design_bands = {'CBAND': {'f_min': 191.3e12, 'f_max': 196.0e12}, | ||||||
|  |                     'LBAND': {'f_min': 187.0e12, 'f_max': 190.0e12}} | ||||||
|  |     save_sim_params = {"raman_params": SimParams._shared_dict['raman_params'].to_json(), | ||||||
|  |                        "nli_params": SimParams._shared_dict['nli_params'].to_json()} | ||||||
|  |     SimParams.set_params(load_json(TEST_DIR / 'data' / 'sim_params.json')) | ||||||
|  |     input_powers = {'CBAND': 0.001, 'LBAND': 0.001} | ||||||
|  |     json_data = network_base("design", "Multiband_amplifier", length=100) | ||||||
|  |     equipment = load_equipment(EQPT_MULTBAND_FILENAME) | ||||||
|  |     network = network_from_json(json_data, equipment) | ||||||
|  |     node = next(n for n in network.nodes() if n.uid == 'fiber (SITE1 → ILA1)') | ||||||
|  |     tilt_db, tilt_target = estimate_srs_power_deviation(network, node, equipment, design_bands, input_powers) | ||||||
|  |     json_data = network_base("design", "Fused", length=50) | ||||||
|  |     equipment = load_equipment(EQPT_MULTBAND_FILENAME) | ||||||
|  |     network = network_from_json(json_data, equipment) | ||||||
|  |     node = next(n for n in network.nodes() if n.uid == 'fiber (ILA1 → ILA2)') | ||||||
|  |     fused_tilt_db, fused_tilt_target = \ | ||||||
|  |         estimate_srs_power_deviation(network, node, equipment, design_bands, input_powers) | ||||||
|  |     # restore simParams | ||||||
|  |     SimParams.set_params(save_sim_params) | ||||||
|  |     for key in tilt_db: | ||||||
|  |         assert_allclose(tilt_db[key], fused_tilt_db[key], rtol=1e-3) | ||||||
|  |     for key in tilt_target: | ||||||
|  |         assert_allclose(tilt_target[key], fused_tilt_target[key], rtol=1e-3) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def network_wo_booster(site_type, bands): | ||||||
|  |     return { | ||||||
|  |         'elements': [ | ||||||
|  |             { | ||||||
|  |                 'uid': 'trx SITE1', | ||||||
|  |                 'type': 'Transceiver' | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'uid': 'trx SITE2', | ||||||
|  |                 'type': 'Transceiver' | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'uid': 'roadm SITE1', | ||||||
|  |                 'params': { | ||||||
|  |                     'design_bands': bands | ||||||
|  |                 }, | ||||||
|  |                 'type': 'Roadm' | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'uid': 'roadm SITE2', | ||||||
|  |                 'type': 'Roadm' | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'uid': 'fiber (SITE1 → ILA1)', | ||||||
|  |                 'type': 'Fiber', | ||||||
|  |                 'type_variety': 'SSMF', | ||||||
|  |                 'params': { | ||||||
|  |                     'length': 50.0, | ||||||
|  |                     'loss_coef': 0.2, | ||||||
|  |                     'length_units': 'km' | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'uid': 'fiber (ILA1 → ILA2)', | ||||||
|  |                 'type': 'Fiber', | ||||||
|  |                 'type_variety': 'SSMF', | ||||||
|  |                 'params': { | ||||||
|  |                     'length': 50.0, | ||||||
|  |                     'loss_coef': 0.2, | ||||||
|  |                     'length_units': 'km' | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'uid': 'fiber (ILA2 → SITE2)', | ||||||
|  |                 'type': 'Fiber', | ||||||
|  |                 'type_variety': 'SSMF', | ||||||
|  |                 'params': { | ||||||
|  |                     'length': 50.0, | ||||||
|  |                     'loss_coef': 0.2, | ||||||
|  |                     'length_units': 'km' | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'uid': 'east edfa or fused in ILA1', | ||||||
|  |                 'type': site_type | ||||||
|  |             } | ||||||
|  |         ], | ||||||
|  |         'connections': [ | ||||||
|  |             { | ||||||
|  |                 'from_node': 'trx SITE1', | ||||||
|  |                 'to_node': 'roadm SITE1' | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'from_node': 'roadm SITE1', | ||||||
|  |                 'to_node': 'fiber (SITE1 → ILA1)' | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'from_node': 'fiber (SITE1 → ILA1)', | ||||||
|  |                 'to_node': 'east edfa or fused in ILA1' | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'from_node': 'east edfa or fused in ILA1', | ||||||
|  |                 'to_node': 'fiber (ILA1 → ILA2)' | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'from_node': 'fiber (ILA1 → ILA2)', | ||||||
|  |                 'to_node': 'fiber (ILA2 → SITE2)' | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'from_node': 'fiber (ILA2 → SITE2)', | ||||||
|  |                 'to_node': 'roadm SITE2' | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 'from_node': 'roadm SITE2', | ||||||
|  |                 'to_node': 'trx SITE2' | ||||||
|  |             } | ||||||
|  |         ] | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.parametrize('site_type, expected_type, bands, expected_bands', [ | ||||||
|  |     ('Multiband_amplifier', Multiband_amplifier, | ||||||
|  |      [{'f_min': 187.0e12, 'f_max': 190.0e12}, {'f_min': 191.3e12, 'f_max': 196.0e12}], | ||||||
|  |      [{'f_min': 187.0e12, 'f_max': 190.0e12}, {'f_min': 191.3e12, 'f_max': 196.0e12}]), | ||||||
|  |     ('Edfa', Edfa, | ||||||
|  |      [{'f_min': 191.4e12, 'f_max': 196.1e12}], | ||||||
|  |      [{'f_min': 191.4e12, 'f_max': 196.1e12}]), | ||||||
|  |     ('Edfa', Edfa, | ||||||
|  |      [{'f_min': 191.2e12, 'f_max': 196.0e12}], | ||||||
|  |      []), | ||||||
|  |     ('Fused', Multiband_amplifier, | ||||||
|  |      [{'f_min': 187.0e12, 'f_max': 190.0e12}, {'f_min': 191.3e12, 'f_max': 196.0e12}], | ||||||
|  |      [{'f_min': 187.0e12, 'f_max': 190.0e12}, {'f_min': 191.3e12, 'f_max': 196.0e12}]), | ||||||
|  |     ('Fused', Edfa, | ||||||
|  |      [{'f_min': 191.3e12, 'f_max': 196.0e12}], | ||||||
|  |      [{'f_min': 191.3e12, 'f_max': 196.0e12}])]) | ||||||
|  | def test_insert_amp(site_type, expected_type, bands, expected_bands): | ||||||
|  |     """Check: | ||||||
|  |     - if amplifiers are defined in multiband they are used for design, | ||||||
|  |     - if no design is defined, | ||||||
|  |         - if type variety is defined: use it for determining bands | ||||||
|  |         - if no type_variety autodesign is as expected, design uses OMS defined set of bands | ||||||
|  |     EOL is added only once on spans. One span can be one fiber or several fused fibers | ||||||
|  |     EOL is then added on the first fiber only. | ||||||
|  |     """ | ||||||
|  |     json_data = network_wo_booster(site_type, bands) | ||||||
|  |     equipment = load_equipment(EQPT_MULTBAND_FILENAME) | ||||||
|  |     network = network_from_json(json_data, equipment) | ||||||
|  |     p_db = equipment['SI']['default'].power_dbm | ||||||
|  |     p_total_db = p_db + lin2db(automatic_nch(equipment['SI']['default'].f_min, | ||||||
|  |                                              equipment['SI']['default'].f_max, equipment['SI']['default'].spacing)) | ||||||
|  |     add_missing_elements_in_network(network, equipment) | ||||||
|  |     if not expected_bands: | ||||||
|  |         with pytest.raises(ConfigurationError): | ||||||
|  |             build_network(network, equipment, p_db, p_total_db) | ||||||
|  |     else: | ||||||
|  |         build_network(network, equipment, p_db, p_total_db) | ||||||
|  |         roadm1 = next(n for n in network.nodes() if n.uid == 'roadm SITE1') | ||||||
|  |         amp1 = get_next_node(roadm1, network) | ||||||
|  |         assert isinstance(amp1, expected_type) | ||||||
|  |         assert roadm1.per_degree_design_bands['Edfa_booster_roadm SITE1_to_fiber (SITE1 → ILA1)'] == expected_bands | ||||||
|   | |||||||
| @@ -232,7 +232,7 @@ def test_json_response_generation(xls_input, expected_response_file): | |||||||
|     rqs, dsjn = requests_aggregation(rqs, dsjn) |     rqs, dsjn = requests_aggregation(rqs, dsjn) | ||||||
|     pths = compute_path_dsjctn(network, equipment, rqs, dsjn) |     pths = compute_path_dsjctn(network, equipment, rqs, dsjn) | ||||||
|     propagatedpths, reversed_pths, reversed_propagatedpths = \ |     propagatedpths, reversed_pths, reversed_propagatedpths = \ | ||||||
|         compute_path_with_disjunction(network, equipment, rqs, pths) |         compute_path_with_disjunction(network, equipment, rqs, pths, redesign=True) | ||||||
|     pth_assign_spectrum(pths, rqs, oms_list, reversed_pths) |     pth_assign_spectrum(pths, rqs, oms_list, reversed_pths) | ||||||
|  |  | ||||||
|     result = [] |     result = [] | ||||||
|   | |||||||
| @@ -596,11 +596,19 @@ def test_roadm_per_degree_impairments(type_variety, from_degree, to_degree, impa | |||||||
|         { |         { | ||||||
|             "roadm-path-impairments-id": 1, |             "roadm-path-impairments-id": 1, | ||||||
|             "roadm-add-path": [{ |             "roadm-add-path": [{ | ||||||
|  |                 "frequency-range": { | ||||||
|  |                     "lower-frequency": 191.3e12, | ||||||
|  |                     "upper-frequency": 196.1e12 | ||||||
|  |                 }, | ||||||
|                 "roadm-osnr": 41, |                 "roadm-osnr": 41, | ||||||
|             }] |             }] | ||||||
|         }, { |         }, { | ||||||
|             "roadm-path-impairments-id": 3, |             "roadm-path-impairments-id": 3, | ||||||
|             "roadm-add-path": [{ |             "roadm-add-path": [{ | ||||||
|  |                 "frequency-range": { | ||||||
|  |                     "lower-frequency": 191.3e12, | ||||||
|  |                     "upper-frequency": 196.1e12 | ||||||
|  |                 }, | ||||||
|                 "roadm-inband-crosstalk": 0, |                 "roadm-inband-crosstalk": 0, | ||||||
|                 "roadm-osnr": 20, |                 "roadm-osnr": 20, | ||||||
|                 "roadm-noise-figure": 23 |                 "roadm-noise-figure": 23 | ||||||
| @@ -657,14 +665,15 @@ def test_wrong_roadm_per_degree_impairments(from_degree, to_degree, impairment_i | |||||||
|         build_network(network, equipment, 0.0, 20.0) |         build_network(network, equipment, 0.0, 20.0) | ||||||
|  |  | ||||||
|  |  | ||||||
| @pytest.mark.parametrize('path_type, type_variety, expected_pmd, expected_pdl, expected_osnr', [ | @pytest.mark.parametrize('path_type, type_variety, expected_pmd, expected_pdl, expected_osnr, freq', [ | ||||||
|     ('express', 'default', 5.0e-12, 0.5, None),  # roadm instance parameters pre-empts library |     ('express', 'default', 5.0e-12, 0.5, None, [191.3e12]),  # roadm instance parameters pre-empts library | ||||||
|     ('express', 'example_test', 5.0e-12, 0.5, None), |     ('express', 'example_test', 5.0e-12, 0.5, None, [191.3e12]), | ||||||
|     ('express', 'example_detailed_impairments', 0, 0, None),  # detailed parameters pre-empts global instance ones |     ('express', 'example_detailed_impairments', 0, 0, None, [191.3e12]),  # detailed parameters pre-empts global ones | ||||||
|     ('add', 'default', 5.0e-12, 0.5, None), |     ('add', 'default', 5.0e-12, 0.5, None, [191.3e12]), | ||||||
|     ('add', 'example_test', 5.0e-12, 0.5, None), |     ('add', 'example_test', 5.0e-12, 0.5, None, [191.3e12]), | ||||||
|     ('add', 'example_detailed_impairments', 0, 0, 41)]) |     ('add', 'example_detailed_impairments', 0, 0, 41, [191.3e12]), | ||||||
| def test_impairment_initialization(path_type, type_variety, expected_pmd, expected_pdl, expected_osnr): |     ('add', 'example_detailed_impairments', [0, 0], [0.5, 0], [35, 41], [188.5e12, 191.3e12])]) | ||||||
|  | def test_impairment_initialization(path_type, type_variety, expected_pmd, expected_pdl, expected_osnr, freq): | ||||||
|     """Check that impairments are correctly initialized, with this order: |     """Check that impairments are correctly initialized, with this order: | ||||||
|     - use equipment roadm impairments if no impairment are set in the ROADM instance |     - use equipment roadm impairments if no impairment are set in the ROADM instance | ||||||
|     - use roadm global impairment if roadm global impairment are set |     - use roadm global impairment if roadm global impairment are set | ||||||
| @@ -687,13 +696,16 @@ def test_impairment_initialization(path_type, type_variety, expected_pmd, expect | |||||||
|     roadm = Roadm(**roadm_config) |     roadm = Roadm(**roadm_config) | ||||||
|     roadm.set_roadm_paths(from_degree='tata', to_degree='toto', path_type=path_type) |     roadm.set_roadm_paths(from_degree='tata', to_degree='toto', path_type=path_type) | ||||||
|     assert roadm.get_roadm_path(from_degree='tata', to_degree='toto').path_type == path_type |     assert roadm.get_roadm_path(from_degree='tata', to_degree='toto').path_type == path_type | ||||||
|     assert roadm.get_roadm_path(from_degree='tata', to_degree='toto').impairment.pmd == expected_pmd |     assert_allclose(roadm.get_impairment('roadm-pmd', freq, from_degree='tata', degree='toto'), | ||||||
|     assert roadm.get_roadm_path(from_degree='tata', to_degree='toto').impairment.pdl == expected_pdl |                     expected_pmd, rtol=1e-12) | ||||||
|  |     assert_allclose(roadm.get_impairment('roadm-pdl', freq, from_degree='tata', degree='toto'), | ||||||
|  |                     expected_pdl, rtol=1e-12) | ||||||
|     if path_type == 'add': |     if path_type == 'add': | ||||||
|         # we assume for simplicity that add contribution is the same as drop contribution |         # we assume for simplicity that add contribution is the same as drop contribution | ||||||
|         # add_drop_osnr_db = 10log10(1/add_osnr + 1/drop_osnr) |         # add_drop_osnr_db = 10log10(1/add_osnr + 1/drop_osnr) | ||||||
|         if type_variety in ['default', 'example_test']: |         if type_variety in ['default', 'example_test']: | ||||||
|             assert roadm.get_roadm_path(from_degree='tata', |             assert_allclose(roadm.get_impairment('roadm-osnr', freq, from_degree='tata', degree='toto'), | ||||||
|                                         to_degree='toto').impairment.osnr == roadm.params.add_drop_osnr + lin2db(2) |                             roadm.params.add_drop_osnr + lin2db(2), rtol=1e-12) | ||||||
|         else: |         else: | ||||||
|             assert roadm.get_roadm_path(from_degree='tata', to_degree='toto').impairment.osnr == expected_osnr |             assert_allclose(roadm.get_impairment('roadm-osnr', freq, from_degree='tata', degree='toto'), | ||||||
|  |                             expected_osnr, rtol=1e-12) | ||||||
|   | |||||||
| @@ -10,6 +10,7 @@ from pathlib import Path | |||||||
| from pandas import read_csv | from pandas import read_csv | ||||||
| from numpy.testing import assert_allclose | from numpy.testing import assert_allclose | ||||||
| from numpy import array | from numpy import array | ||||||
|  | from copy import deepcopy | ||||||
| import pytest | import pytest | ||||||
|  |  | ||||||
| from gnpy.core.info import create_input_spectral_information, create_arbitrary_spectral_information | from gnpy.core.info import create_input_spectral_information, create_arbitrary_spectral_information | ||||||
| @@ -22,6 +23,7 @@ from gnpy.core.science_utils import RamanSolver | |||||||
| TEST_DIR = Path(__file__).parent | TEST_DIR = Path(__file__).parent | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.usefixtures('set_sim_params') | ||||||
| def test_fiber(): | def test_fiber(): | ||||||
|     """Test the accuracy of propagating the Fiber.""" |     """Test the accuracy of propagating the Fiber.""" | ||||||
|     fiber = Fiber(**load_json(TEST_DIR / 'data' / 'test_science_utils_fiber_config.json')) |     fiber = Fiber(**load_json(TEST_DIR / 'data' / 'test_science_utils_fiber_config.json')) | ||||||
| @@ -50,8 +52,7 @@ def test_fiber(): | |||||||
|                                                                 signal=signal, baud_rate=baud_rate, roll_off=0.15, |                                                                 signal=signal, baud_rate=baud_rate, roll_off=0.15, | ||||||
|                                                                 delta_pdb_per_channel=delta_pdb_per_channel, |                                                                 delta_pdb_per_channel=delta_pdb_per_channel, | ||||||
|                                                                 tx_osnr=40.0, tx_power=1e-3) |                                                                 tx_osnr=40.0, tx_power=1e-3) | ||||||
|  |     # propagation without Raman | ||||||
|     # propagation |  | ||||||
|     spectral_info_out = fiber(spectral_info_input) |     spectral_info_out = fiber(spectral_info_input) | ||||||
|  |  | ||||||
|     p_signal = spectral_info_out.signal |     p_signal = spectral_info_out.signal | ||||||
| @@ -61,6 +62,17 @@ def test_fiber(): | |||||||
|     assert_allclose(p_signal, expected_results['signal'], rtol=1e-3) |     assert_allclose(p_signal, expected_results['signal'], rtol=1e-3) | ||||||
|     assert_allclose(p_nli, expected_results['nli'], rtol=1e-3) |     assert_allclose(p_nli, expected_results['nli'], rtol=1e-3) | ||||||
|  |  | ||||||
|  |     # propagation with Raman | ||||||
|  |     SimParams.set_params({'raman_params': {'flag': True}}) | ||||||
|  |     spectral_info_out = fiber(spectral_info_input) | ||||||
|  |  | ||||||
|  |     p_signal = spectral_info_out.signal | ||||||
|  |     p_nli = spectral_info_out.nli | ||||||
|  |  | ||||||
|  |     expected_results = read_csv(TEST_DIR / 'data' / 'test_fiber_flex_expected_with_raman_results.csv') | ||||||
|  |     assert_allclose(p_signal, expected_results['signal'], rtol=1e-3) | ||||||
|  |     assert_allclose(p_nli, expected_results['nli'], rtol=1e-3) | ||||||
|  |  | ||||||
|  |  | ||||||
| @pytest.mark.usefixtures('set_sim_params') | @pytest.mark.usefixtures('set_sim_params') | ||||||
| def test_raman_fiber(): | def test_raman_fiber(): | ||||||
| @@ -70,6 +82,7 @@ def test_raman_fiber(): | |||||||
|                                                             baud_rate=32e9, spacing=50e9, tx_osnr=40.0, |                                                             baud_rate=32e9, spacing=50e9, tx_osnr=40.0, | ||||||
|                                                             tx_power=1e-3) |                                                             tx_power=1e-3) | ||||||
|     SimParams.set_params(load_json(TEST_DIR / 'data' / 'sim_params.json')) |     SimParams.set_params(load_json(TEST_DIR / 'data' / 'sim_params.json')) | ||||||
|  |     SimParams().raman_params.solver_spatial_resolution = 5 | ||||||
|     fiber = RamanFiber(**load_json(TEST_DIR / 'data' / 'test_science_utils_fiber_config.json')) |     fiber = RamanFiber(**load_json(TEST_DIR / 'data' / 'test_science_utils_fiber_config.json')) | ||||||
|     fiber.ref_pch_in_dbm = 0.0 |     fiber.ref_pch_in_dbm = 0.0 | ||||||
|     # propagation |     # propagation | ||||||
| @@ -108,23 +121,22 @@ def test_fiber_lumped_losses_srs(set_sim_params): | |||||||
|                                                             baud_rate=32e9, spacing=50e9, tx_osnr=40.0, |                                                             baud_rate=32e9, spacing=50e9, tx_osnr=40.0, | ||||||
|                                                             tx_power=1e-3) |                                                             tx_power=1e-3) | ||||||
|  |  | ||||||
|     SimParams.set_params(load_json(TEST_DIR / 'data' / 'sim_params.json')) |  | ||||||
|     fiber = Fiber(**load_json(TEST_DIR / 'data' / 'test_lumped_losses_raman_fiber_config.json')) |     fiber = Fiber(**load_json(TEST_DIR / 'data' / 'test_lumped_losses_raman_fiber_config.json')) | ||||||
|     raman_fiber = RamanFiber(**load_json(TEST_DIR / 'data' / 'test_lumped_losses_raman_fiber_config.json')) |     raman_fiber = RamanFiber(**load_json(TEST_DIR / 'data' / 'test_lumped_losses_raman_fiber_config.json')) | ||||||
|  |  | ||||||
|     # propagation |     # propagation | ||||||
|     # without Raman pumps |     # without Raman pumps | ||||||
|     stimulated_raman_scattering = RamanSolver.calculate_stimulated_raman_scattering( |     SimParams.set_params({'raman_params': {'flag': True, 'order': 2}}) | ||||||
|         spectral_info_input, fiber) |     stimulated_raman_scattering = RamanSolver.calculate_stimulated_raman_scattering(spectral_info_input, fiber) | ||||||
|     power_profile = stimulated_raman_scattering.power_profile |     power_profile = stimulated_raman_scattering.power_profile | ||||||
|     expected_power_profile = read_csv(TEST_DIR / 'data' / 'test_lumped_losses_fiber_no_pumps.csv', header=None) |     expected_power_profile = read_csv(TEST_DIR / 'data' / 'test_lumped_losses_fiber_no_pumps.csv').values | ||||||
|     assert_allclose(power_profile, expected_power_profile, rtol=1e-3) |     assert_allclose(power_profile, expected_power_profile, rtol=1e-3) | ||||||
|  |  | ||||||
|     # with Raman pumps |     # with Raman pumps | ||||||
|     expected_power_profile = read_csv(TEST_DIR / 'data' / 'test_lumped_losses_raman_fiber.csv', header=None) |     SimParams.set_params({'raman_params': {'flag': True, 'order': 1, 'solver_spatial_resolution': 5}}) | ||||||
|     stimulated_raman_scattering = RamanSolver.calculate_stimulated_raman_scattering( |     stimulated_raman_scattering = RamanSolver.calculate_stimulated_raman_scattering(spectral_info_input, raman_fiber) | ||||||
|         spectral_info_input, raman_fiber) |  | ||||||
|     power_profile = stimulated_raman_scattering.power_profile |     power_profile = stimulated_raman_scattering.power_profile | ||||||
|  |     expected_power_profile = read_csv(TEST_DIR / 'data' / 'test_lumped_losses_raman_fiber.csv').values | ||||||
|     assert_allclose(power_profile, expected_power_profile, rtol=1e-3) |     assert_allclose(power_profile, expected_power_profile, rtol=1e-3) | ||||||
|  |  | ||||||
|     # without Stimulated Raman Scattering |     # without Stimulated Raman Scattering | ||||||
| @@ -132,3 +144,26 @@ def test_fiber_lumped_losses_srs(set_sim_params): | |||||||
|     stimulated_raman_scattering = RamanSolver.calculate_attenuation_profile(spectral_info_input, fiber) |     stimulated_raman_scattering = RamanSolver.calculate_attenuation_profile(spectral_info_input, fiber) | ||||||
|     power_profile = stimulated_raman_scattering.power_profile |     power_profile = stimulated_raman_scattering.power_profile | ||||||
|     assert_allclose(power_profile, expected_power_profile, rtol=1e-3) |     assert_allclose(power_profile, expected_power_profile, rtol=1e-3) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.usefixtures('set_sim_params') | ||||||
|  | def test_nli_solver(): | ||||||
|  |     """Test the accuracy of NLI solver.""" | ||||||
|  |     fiber = Fiber(**load_json(TEST_DIR / 'data' / 'test_science_utils_fiber_config.json')) | ||||||
|  |     fiber.ref_pch_in_dbm = 0.0 | ||||||
|  |     # fix grid spectral information generation | ||||||
|  |     spectral_info_input = create_input_spectral_information(f_min=191.3e12, f_max=196.1e12, roll_off=0.15, | ||||||
|  |                                                             baud_rate=32e9, spacing=50e9, tx_osnr=40.0, | ||||||
|  |                                                             tx_power=1e-3) | ||||||
|  |  | ||||||
|  |     SimParams.set_params(load_json(TEST_DIR / 'data' / 'sim_params.json')) | ||||||
|  |     sim_params = SimParams() | ||||||
|  |  | ||||||
|  |     spectral_info_output = fiber(deepcopy(spectral_info_input)) | ||||||
|  |  | ||||||
|  |     sim_params.nli_params.method = 'ggn_approx' | ||||||
|  |     sim_params.raman_params.result_spatial_resolution = 10e3 | ||||||
|  |     spectral_info_output_approx = fiber(deepcopy(spectral_info_input)) | ||||||
|  |  | ||||||
|  |     assert_allclose(spectral_info_output.nli, spectral_info_output_approx.nli, rtol=1e-1) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -33,7 +33,7 @@ SERVICE_FILENAME = DATA_DIR / 'testTopology_services_expected.json' | |||||||
|  |  | ||||||
| grid = 0.00625e12 | grid = 0.00625e12 | ||||||
| slot = 0.0125e12 | slot = 0.0125e12 | ||||||
| guardband = 0.15e12 | guardband = 25.0e9 | ||||||
| cband_freq_min = 191.3e12 | cband_freq_min = 191.3e12 | ||||||
| cband_freq_max = 196.1e12 | cband_freq_max = 196.1e12 | ||||||
|  |  | ||||||
| @@ -101,14 +101,15 @@ def test_wrong_values(nval, mval, setup): | |||||||
| def test_aligned(nmin, nmax, setup): | def test_aligned(nmin, nmax, setup): | ||||||
|     """Checks that the OMS grid is correctly aligned |     """Checks that the OMS grid is correctly aligned | ||||||
|  |  | ||||||
|     Note that bitmap index uses guardband on both ends so that if nmin, nmax = -200, +200, |     Note that bitmap index uses guardband on both ends so that if center frequencies nmin, nmax = -200, +200, | ||||||
|     min/max navalue in bitmap are -224, +223, which makes 223 -(-224) +1 frequencies. |     min/max navalue in bitmap are -224, +223, which makes 223 -(-224) +1 frequencies. | ||||||
|     """ |     """ | ||||||
|     network, oms_list = setup |     network, oms_list = setup | ||||||
|     nguard = guardband / grid |     nguard = guardband / grid | ||||||
|     center = 193.1e12 |     center = 193.1e12 | ||||||
|     freq_min = center + nmin * grid |     # amplification band | ||||||
|     freq_max = center + nmax * grid |     freq_min = center + nmin * grid - guardband | ||||||
|  |     freq_max = center + nmax * grid + guardband | ||||||
|     random_oms = oms_list[10] |     random_oms = oms_list[10] | ||||||
|  |  | ||||||
|     # We're always starting with full C-band |     # We're always starting with full C-band | ||||||
| @@ -116,9 +117,9 @@ def test_aligned(nmin, nmax, setup): | |||||||
|     assert pytest.approx(nvalue_to_frequency(random_oms.spectrum_bitmap.freq_index_max) * 1e-12, abs=1e-12) == 196.1 |     assert pytest.approx(nvalue_to_frequency(random_oms.spectrum_bitmap.freq_index_max) * 1e-12, abs=1e-12) == 196.1 | ||||||
|     ind_max = len(random_oms.spectrum_bitmap.bitmap) - 1 |     ind_max = len(random_oms.spectrum_bitmap.bitmap) - 1 | ||||||
|  |  | ||||||
|     # "inner" frequencies, without the guard baand |     # "inner" frequencies, without the guard band | ||||||
|     inner_n_min = random_oms.spectrum_bitmap.getn(0) + nguard |     inner_n_min = random_oms.spectrum_bitmap.getn(0) + nguard | ||||||
|     inner_n_max = random_oms.spectrum_bitmap.getn(ind_max) - nguard + 1 |     inner_n_max = random_oms.spectrum_bitmap.getn(ind_max) - nguard | ||||||
|     assert inner_n_min == random_oms.spectrum_bitmap.freq_index_min |     assert inner_n_min == random_oms.spectrum_bitmap.freq_index_min | ||||||
|     assert inner_n_max == random_oms.spectrum_bitmap.freq_index_max |     assert inner_n_max == random_oms.spectrum_bitmap.freq_index_max | ||||||
|     assert inner_n_min == -288 |     assert inner_n_min == -288 | ||||||
| @@ -136,7 +137,7 @@ def test_aligned(nmin, nmax, setup): | |||||||
|  |  | ||||||
|     ind_max = len(random_oms.spectrum_bitmap.bitmap) - 1 |     ind_max = len(random_oms.spectrum_bitmap.bitmap) - 1 | ||||||
|     inner_n_min = random_oms.spectrum_bitmap.getn(0) + nguard |     inner_n_min = random_oms.spectrum_bitmap.getn(0) + nguard | ||||||
|     inner_n_max = random_oms.spectrum_bitmap.getn(ind_max) - nguard + 1 |     inner_n_max = random_oms.spectrum_bitmap.getn(ind_max) - nguard | ||||||
|     assert inner_n_min == random_oms.spectrum_bitmap.freq_index_min |     assert inner_n_min == random_oms.spectrum_bitmap.freq_index_min | ||||||
|     assert inner_n_max == random_oms.spectrum_bitmap.freq_index_max |     assert inner_n_max == random_oms.spectrum_bitmap.freq_index_max | ||||||
|  |  | ||||||
| @@ -198,18 +199,20 @@ def test_assign_and_sum(nval1, nval2, setup): | |||||||
|  |  | ||||||
| def test_bitmap_assignment(setup): | def test_bitmap_assignment(setup): | ||||||
|     """test that a bitmap can be assigned""" |     """test that a bitmap can be assigned""" | ||||||
|     network, oms_list = setup |     _, oms_list = setup | ||||||
|     random_oms = oms_list[2] |     random_oms = oms_list[2] | ||||||
|     random_oms.assign_spectrum(13, 7) |     random_oms.assign_spectrum(13, 7) | ||||||
|  |  | ||||||
|     btmp = deepcopy(random_oms.spectrum_bitmap.bitmap) |     btmp = deepcopy(random_oms.spectrum_bitmap.bitmap) | ||||||
|     # try a first assignment that must pass |     # try a first assignment that must pass | ||||||
|     spectrum_btmp = Bitmap(cband_freq_min, cband_freq_max, grid=0.00625e12, guardband=0.15e12, bitmap=btmp) |     freq_min = nvalue_to_frequency(random_oms.spectrum_bitmap.n_min) | ||||||
|  |     freq_max = nvalue_to_frequency(random_oms.spectrum_bitmap.n_max) | ||||||
|  |     _ = Bitmap(freq_min, freq_max, grid=0.00625e12, guardband=guardband, bitmap=btmp) | ||||||
|  |  | ||||||
|     # try a wrong assignment that should not pass |     # try a wrong assignment that should not pass | ||||||
|     btmp = btmp[1:-1] |     btmp = btmp[1:-1] | ||||||
|     with pytest.raises(SpectrumError): |     with pytest.raises(SpectrumError): | ||||||
|         spectrum_btmp = Bitmap(cband_freq_min, cband_freq_max, grid=0.00625e12, guardband=0.15e12, bitmap=btmp) |         _ = Bitmap(cband_freq_min, cband_freq_max, grid=0.00625e12, guardband=guardband, bitmap=btmp) | ||||||
|  |  | ||||||
|  |  | ||||||
| @pytest.fixture() | @pytest.fixture() | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user