mirror of
https://github.com/Telecominfraproject/oopt-gnpy.git
synced 2025-11-19 23:55:01 +00:00
Compare commits
76 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4ef01d54a5 | ||
|
|
4b50ee0c2d | ||
|
|
33a289e22b | ||
|
|
e593b8c9ec | ||
|
|
94a6f922cd | ||
|
|
fbe387915b | ||
|
|
fce9d1d293 | ||
|
|
a59db8fd12 | ||
|
|
de509139b3 | ||
|
|
bb77b3f4a8 | ||
|
|
34c7fd1b60 | ||
|
|
89a962ffaf | ||
|
|
1722fbec13 | ||
|
|
e48aa57c35 | ||
|
|
e3e37b1986 | ||
|
|
abf42afaf8 | ||
|
|
310995045e | ||
|
|
c840bb1a44 | ||
|
|
4b6f4af3a5 | ||
|
|
dc68d38293 | ||
|
|
defe3bee5c | ||
|
|
32adc0fc53 | ||
|
|
4796266657 | ||
|
|
c35104c184 | ||
|
|
7b1354ee24 | ||
|
|
39d3f0f483 | ||
|
|
bbe9ef7356 | ||
|
|
42a8f018cd | ||
|
|
29f5dd1dc4 | ||
|
|
03da959724 | ||
|
|
f621ca6fe7 | ||
|
|
24f4503020 | ||
|
|
520c3615e4 | ||
|
|
548626a9f2 | ||
|
|
7a26833a5a | ||
|
|
c2f6f9c6a0 | ||
|
|
64a91256fc | ||
|
|
bdcffc2a5e | ||
|
|
c384af8062 | ||
|
|
0813332adc | ||
|
|
22fe9ead55 | ||
|
|
920ac30aa5 | ||
|
|
ac8fd770ab | ||
|
|
5277ae2005 | ||
|
|
30ead40e76 | ||
|
|
ae858b911a | ||
|
|
0d236fd31e | ||
|
|
9a84e29433 | ||
|
|
143f63170e | ||
|
|
b2d7f883a1 | ||
|
|
73dbdf3042 | ||
|
|
4a071c53d7 | ||
|
|
dcde64a8db | ||
|
|
38cc0e3cc5 | ||
|
|
fb70413784 | ||
|
|
87e10c240e | ||
|
|
43c1085be6 | ||
|
|
4ace60bea2 | ||
|
|
f950a6aee8 | ||
|
|
fb4195c775 | ||
|
|
29f42666e5 | ||
|
|
9bf7f336e3 | ||
|
|
eed6564f11 | ||
|
|
fbb2f2c587 | ||
|
|
44040c4d06 | ||
|
|
ee9af69558 | ||
|
|
ce21609fec | ||
|
|
a1289e6a9b | ||
|
|
138115e1d7 | ||
|
|
ed41305f55 | ||
|
|
9736f7c032 | ||
|
|
be7ae35db3 | ||
|
|
2b4a4ab72c | ||
|
|
426c88432d | ||
|
|
2a800b781f | ||
|
|
8d1d3677ed |
4
.github/workflows/main.yml
vendored
4
.github/workflows/main.yml
vendored
@@ -118,10 +118,10 @@ jobs:
|
|||||||
python_version: "3.11"
|
python_version: "3.11"
|
||||||
- os: windows-2022
|
- os: windows-2022
|
||||||
python_version: "3.12"
|
python_version: "3.12"
|
||||||
- os: macos-12
|
|
||||||
python_version: "3.11"
|
|
||||||
- os: macos-13
|
- os: macos-13
|
||||||
python_version: "3.12"
|
python_version: "3.12"
|
||||||
|
- os: macos-14
|
||||||
|
python_version: "3.12"
|
||||||
|
|
||||||
paywalled-platforms:
|
paywalled-platforms:
|
||||||
name: Tests on paywalled platforms
|
name: Tests on paywalled platforms
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ build:
|
|||||||
os: ubuntu-22.04
|
os: ubuntu-22.04
|
||||||
tools:
|
tools:
|
||||||
python: "3.12"
|
python: "3.12"
|
||||||
|
apt_packages:
|
||||||
|
- graphviz
|
||||||
|
|
||||||
python:
|
python:
|
||||||
install:
|
install:
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ Read our [documentation](https://gnpy.readthedocs.io/), learn from the demos, an
|
|||||||
|
|
||||||
This example demonstrates how GNPy can be used to check the expected SNR at the end of the line by varying the channel input power:
|
This example demonstrates how GNPy can be used to check the expected SNR at the end of the line by varying the channel input power:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
GNPy can do much more, including acting as a Path Computation Engine, tracking bandwidth requests, or advising the SDN controller about a best possible path through a large DWDM network.
|
GNPy can do much more, including acting as a Path Computation Engine, tracking bandwidth requests, or advising the SDN controller about a best possible path through a large DWDM network.
|
||||||
Learn more about this [in the documentation](https://gnpy.readthedocs.io/), or give it a [try online at `gnpy.app`](https://gnpy.app/):
|
Learn more about this [in the documentation](https://gnpy.readthedocs.io/), or give it a [try online at `gnpy.app`](https://gnpy.app/):
|
||||||
|
|||||||
@@ -114,10 +114,6 @@ and a fiber span from node3 to node6::
|
|||||||
If filled they must contain strings with the same constraint as "City" names. Its value is used to differenate links having the same end points. In this case different Id should be used. Cable Ids are not meant to be unique in general.
|
If filled they must contain strings with the same constraint as "City" names. Its value is used to differenate links having the same end points. In this case different Id should be used. Cable Ids are not meant to be unique in general.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(in progress)
|
|
||||||
|
|
||||||
.. _excel-equipment-sheet:
|
.. _excel-equipment-sheet:
|
||||||
|
|
||||||
Eqpt sheet
|
Eqpt sheet
|
||||||
@@ -192,7 +188,42 @@ This generates a text file meshTopologyExampleV2_eqt_sheet.txt whose content ca
|
|||||||
|
|
||||||
- **delta_p**, in dBm, is not mandatory. If filled it is used to set the output target power per channel at the output of the amplifier, if power_mode is True. The output power is then set to power_dbm + delta_power.
|
- **delta_p**, in dBm, is not mandatory. If filled it is used to set the output target power per channel at the output of the amplifier, if power_mode is True. The output power is then set to power_dbm + delta_power.
|
||||||
|
|
||||||
# to be completed #
|
|
||||||
|
.. _excel-roadms-sheet:
|
||||||
|
|
||||||
|
Roadms sheet
|
||||||
|
------------
|
||||||
|
|
||||||
|
The ROADM sheet (named "Roadms") is optional.
|
||||||
|
If provided, it can be used to specify:
|
||||||
|
|
||||||
|
- per channel power target on a specific ROADM degree (*per_degree_pch_out_db*),
|
||||||
|
- ROADM type variety,
|
||||||
|
- impairment ID (identifier) on a particular ROADM path (from degree - to degree).
|
||||||
|
|
||||||
|
This sheet contains six columns:
|
||||||
|
|
||||||
|
Node A ; Node Z ; per degree target power (dBm) ; type_variety ; from degrees ; from degree to degree impairment id
|
||||||
|
|
||||||
|
- **Node A** is mandatory. Name of the ROADM node (as listed in Nodes sheet).
|
||||||
|
Must be a 'ROADM' (Type attribute in Node sheet), its number of occurence may be equal to its degree.
|
||||||
|
|
||||||
|
- **Node Z** is mandatory. Egress direction from the *Node A* ROADM site. Multiple Links between the same Node A
|
||||||
|
and NodeZ is not supported.
|
||||||
|
|
||||||
|
- **per degree target power (dBm)** (optional).
|
||||||
|
If filled it must contain a value in dBm corresponding to :ref:`per_degree_pch_out_db<roadm_json_instance>` on the **Node Z** degree.
|
||||||
|
Defaults to equipment library value if not filled.
|
||||||
|
|
||||||
|
- **type_variety** (optional). Must be the same for all ROADM entries if filled,
|
||||||
|
and defined in the :ref:`equipment library<roadm>`. Defaults to 'default' if not filled.
|
||||||
|
|
||||||
|
- **from degrees** (optional): List of Node names separated by ' | '. Names must be present in Node sheet.
|
||||||
|
Together with Node Z, they define a list of internal path in ROADM for which the impairment ID applies
|
||||||
|
|
||||||
|
- **from degree to degree impairment id** (optional):List of impairment IDs separated by ' | '. Must be filled
|
||||||
|
if **from degrees** is defined.
|
||||||
|
The impairment ID must be defined in the equipment library and be of "express" type.
|
||||||
|
|
||||||
(in progress)
|
(in progress)
|
||||||
|
|
||||||
|
|||||||
@@ -91,7 +91,8 @@ Advanced Specification
|
|||||||
**********************
|
**********************
|
||||||
|
|
||||||
The amplifier performance can be further described in terms of gain ripple, NF ripple, and the dynamic gain tilt.
|
The amplifier performance can be further described in terms of gain ripple, NF ripple, and the dynamic gain tilt.
|
||||||
When provided, the amplifier characteristic is fine-tuned as a function of carrier frequency.
|
When provided, the amplifier characteristic is fine-tuned as a function of carrier frequency. Note that in this advanced
|
||||||
|
specification tilt is defined vs frequency while tilt_target specified in EDFA instances is defined vs wavelength.
|
||||||
|
|
||||||
.. _extending-raman:
|
.. _extending-raman:
|
||||||
|
|
||||||
@@ -119,38 +120,32 @@ A *mode* usually refers to a particular performance point that is defined by a c
|
|||||||
|
|
||||||
The following data are required for each mode:
|
The following data are required for each mode:
|
||||||
|
|
||||||
``bit-rate``
|
``bit_rate``
|
||||||
Data bit rate, in :math:`\text{Gbits}\times s^{-1}`.
|
Data bit rate, in :math:`\text{bits}\times s^{-1}`.
|
||||||
``baud-rate``
|
``baud_rate``
|
||||||
Symbol modulation rate, in :math:`\text{Gbaud}`.
|
Symbol modulation rate, in :math:`\text{baud}`.
|
||||||
``required-osnr``
|
``OSNR``
|
||||||
Minimal allowed OSNR for the receiver.
|
Minimal required OSNR for the receiver. In :math:`\text{dB}`
|
||||||
``tx-osnr``
|
``tx-osnr``
|
||||||
Initial OSNR at the transmitter's output.
|
Initial OSNR at the transmitter's output. In :math:`\text{dB}`
|
||||||
``grid-spacing``
|
``min-spacing``
|
||||||
Minimal grid spacing, i.e., an effective channel spectral bandwidth.
|
Minimal grid spacing, i.e., an effective channel spectral bandwidth.
|
||||||
In :math:`\text{Hz}`.
|
In :math:`\text{Hz}`.
|
||||||
``tx-roll-off``
|
``roll-off``
|
||||||
Roll-off parameter (:math:`\beta`) of the TX pulse shaping filter.
|
Roll-off parameter (:math:`\beta`) of the TX pulse shaping filter.
|
||||||
This assumes a raised-cosine filter.
|
This assumes a raised-cosine filter.
|
||||||
``rx-power-min`` and ``rx-power-max``
|
``rx-power-min`` and ``rx-power-max``
|
||||||
The allowed range of power at the receiver.
|
(work in progress) The allowed range of power at the receiver.
|
||||||
In :math:`\text{dBm}`.
|
In :math:`\text{dBm}`.
|
||||||
``cd-max``
|
``penalties``
|
||||||
Maximal allowed Chromatic Dispersion (CD).
|
Impairments such as Chromatic Dispersion (CD), Polarization Mode Dispersion (PMD), and Polarization Dispersion Loss (PDL)
|
||||||
In :math:`\text{ps}/\text{nm}`.
|
result in penalties at the receiver. The receiver's ability to handle these impairments can be defined for each mode as
|
||||||
``pmd-max``
|
a list of {impairment: in defined units, 'penalty_value' in dB} (see `transceiver section here <json.rst#_transceiver>`).
|
||||||
Maximal allowed Polarization Mode Dispersion (PMD).
|
Maximum allowed CD, maximum allowed PMD, and maximum allowed PDL should be listed there with corresponding penalties.
|
||||||
In :math:`\text{ps}`.
|
Impairments experienced during propagation are linearly interpolated between given points to obtain the corresponding penalty.
|
||||||
``cd-penalty``
|
The accumulated penalties are subtracted from the path GSNR before comparing with the minimum required OSNR.
|
||||||
*Work-in-progress.*
|
Impairments: PMD in :math:`\text{ps}`, CD in :math:`\text{ps/nm}`, PDL in :math:`\text{dB}`, penalty_value in :math:`\text{dB}`
|
||||||
Describes the increase of the requires GSNR as the :abbr:`CD (Chromatic Dispersion)` deteriorates.
|
|
||||||
``dgd-penalty``
|
|
||||||
*Work-in-progress.*
|
|
||||||
Describes the increase of the requires GSNR as the :abbr:`DGD (Differential Group Delay)` deteriorates.
|
|
||||||
``pmd-penalty``
|
|
||||||
*Work-in-progress.*
|
|
||||||
Describes the increase of the requires GSNR as the :abbr:`PMD (Polarization Mode Dispersion)` deteriorates.
|
|
||||||
|
|
||||||
GNPy does not directly track the FEC performance, so the type of chosen FEC is likely indicated in the *name* of the selected transponder mode alone.
|
GNPy does not directly track the FEC performance, so the type of chosen FEC is likely indicated in the *name* of the selected transponder mode alone.
|
||||||
|
|
||||||
@@ -168,6 +163,7 @@ The set of parameters for each ROADM model therefore includes:
|
|||||||
Per-channel target TX power towards the egress amplifier.
|
Per-channel target TX power towards the egress amplifier.
|
||||||
Within GNPy, a ROADM is expected to attenuate any signal that enters the ROADM node to this level.
|
Within GNPy, a ROADM is expected to attenuate any signal that enters the ROADM node to this level.
|
||||||
This can be overridden on a per-link in the network topology.
|
This can be overridden on a per-link in the network topology.
|
||||||
|
Targets can be set using power or power spectral density (see `roadm section here <json.rst#__roadm>`)
|
||||||
``pmd``
|
``pmd``
|
||||||
Polarization mode dispersion (PMD) penalty of the express path.
|
Polarization mode dispersion (PMD) penalty of the express path.
|
||||||
In :math:`\text{ps}`.
|
In :math:`\text{ps}`.
|
||||||
|
|||||||
1
docs/images/gnpy-transmission-example.svg
Normal file
1
docs/images/gnpy-transmission-example.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 478 KiB |
@@ -14,28 +14,29 @@ fully-functional programs.
|
|||||||
specific, delineated use cases to drive requirements for future
|
specific, delineated use cases to drive requirements for future
|
||||||
development.*
|
development.*
|
||||||
|
|
||||||
This example demonstrates how GNPy can be used to check the expected SNR at the end of the line by varying the channel input power:
|
This example demonstrates how GNPy can be used to check the expected SNR at the end of the line by varying the channel input power,
|
||||||
|
or to run a planning script to check SNR of several services:
|
||||||
|
|
||||||
.. image:: https://telecominfraproject.github.io/oopt-gnpy/docs/images/transmission_main_example.svg
|
.. image:: images/gnpy-transmission-example.svg
|
||||||
:width: 100%
|
:width: 100%
|
||||||
:align: left
|
:align: left
|
||||||
:alt: Running a simple simulation example
|
:alt: Running a simple simulation example
|
||||||
|
|
||||||
By default, this script operates on a single span network defined in
|
By default, the gnpy-transmission-example script operates on a single span network defined in
|
||||||
`gnpy/example-data/edfa_example_network.json <gnpy/example-data/edfa_example_network.json>`_
|
`gnpy/example-data/edfa_example_network.json <../gnpy/example-data/edfa_example_network.json>`_
|
||||||
|
|
||||||
You can specify a different network at the command line as follows. For
|
You can specify a different network at the command line as follows. For
|
||||||
example, to use the CORONET Global network defined in
|
example, to use the CORONET Global network defined in
|
||||||
`gnpy/example-data/CORONET_Global_Topology.json <gnpy/example-data/CORONET_Global_Topology.json>`_:
|
`gnpy/example-data/CORONET_Global_Topology.json <../gnpy/example-data/CORONET_Global_Topology.json>`_:
|
||||||
|
|
||||||
.. code-block:: shell-session
|
.. code-block:: shell-session
|
||||||
|
|
||||||
$ gnpy-transmission-example $(gnpy-example-data)/CORONET_Global_Topology.json
|
$ gnpy-transmission-example $(gnpy-example-data)/CORONET_Global_Topology.json
|
||||||
|
|
||||||
It is also possible to use an Excel file input (for example
|
It is also possible to use an Excel file input (for example
|
||||||
`gnpy/example-data/CORONET_Global_Topology.xls <gnpy/example-data/CORONET_Global_Topology.xls>`_).
|
`gnpy/example-data/CORONET_Global_Topology.xls <../gnpy/example-data/CORONET_Global_Topology.xls>`_).
|
||||||
The Excel file will be processed into a JSON file with the same prefix.
|
The Excel file will be processed into a JSON file with the same prefix.
|
||||||
Further details about the Excel data structure are available `in the documentation <docs/excel.rst>`__.
|
Further details about the Excel data structure are available `in the documentation <excel.rst>`__.
|
||||||
|
|
||||||
The main transmission example will calculate the average signal OSNR and SNR
|
The main transmission example will calculate the average signal OSNR and SNR
|
||||||
across network elements (transceiver, ROADMs, fibers, and amplifiers)
|
across network elements (transceiver, ROADMs, fibers, and amplifiers)
|
||||||
@@ -56,10 +57,10 @@ interference noise.
|
|||||||
Further Instructions for Use
|
Further Instructions for Use
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
||||||
Simulations are driven by a set of `JSON <docs/json.rst>`__ or `XLS <docs/excel.rst>`__ files.
|
Simulations are driven by a set of `JSON <json.rst>`__ or `XLS <excel.rst>`__ files.
|
||||||
|
|
||||||
The ``gnpy-transmission-example`` script propagates a spectrum of channels at 32 Gbaud, 50 GHz spacing and 0 dBm/channel.
|
The ``gnpy-transmission-example`` script propagates a spectrum of channels at 32 Gbaud, 50 GHz spacing and 0 dBm/channel.
|
||||||
Launch power can be overridden by using the ``--power`` argument.
|
Launch power in fiber spans can be overridden by using the ``--power`` argument.
|
||||||
Spectrum information is not yet parametrized but can be modified directly in the ``eqpt_config.json`` (via the ``SpectralInformation`` -SI- structure) to accommodate any baud rate or spacing.
|
Spectrum information is not yet parametrized but can be modified directly in the ``eqpt_config.json`` (via the ``SpectralInformation`` -SI- structure) to accommodate any baud rate or spacing.
|
||||||
The number of channel is computed based on ``spacing`` and ``f_min``, ``f_max`` values.
|
The number of channel is computed based on ``spacing`` and ``f_min``, ``f_max`` values.
|
||||||
|
|
||||||
@@ -71,8 +72,8 @@ An experimental support for Raman amplification is available:
|
|||||||
$(gnpy-example-data)/raman_edfa_example_network.json \
|
$(gnpy-example-data)/raman_edfa_example_network.json \
|
||||||
--sim $(gnpy-example-data)/sim_params.json --show-channels
|
--sim $(gnpy-example-data)/sim_params.json --show-channels
|
||||||
|
|
||||||
Configuration of Raman pumps (their frequencies, power and pumping direction) is done via the `RamanFiber element in the network topology <gnpy/example-data/raman_edfa_example_network.json>`_.
|
Configuration of Raman pumps (their frequencies, power and pumping direction) is done via the `RamanFiber element in the network topology <../gnpy/example-data/raman_edfa_example_network.json>`_.
|
||||||
General numeric parameters for simulation control are provided in the `gnpy/example-data/sim_params.json <gnpy/example-data/sim_params.json>`_.
|
General numeric parameters for simulation control are provided in the `gnpy/example-data/sim_params.json <../gnpy/example-data/sim_params.json>`_.
|
||||||
|
|
||||||
Use ``gnpy-path-request`` to request several paths at once:
|
Use ``gnpy-path-request`` to request several paths at once:
|
||||||
|
|
||||||
@@ -82,7 +83,7 @@ Use ``gnpy-path-request`` to request several paths at once:
|
|||||||
$ gnpy-path-request -o output_file.json \
|
$ gnpy-path-request -o output_file.json \
|
||||||
meshTopologyExampleV2.xls meshTopologyExampleV2_services.json
|
meshTopologyExampleV2.xls meshTopologyExampleV2_services.json
|
||||||
|
|
||||||
This program operates on a network topology (`JSON <docs/json.rst>`__ or `Excel <docs/excel.rst>`__ format), processing the list of service requests (JSON or XLS again).
|
This program operates on a network topology (`JSON <json.rst>`__ or `Excel <excel.rst>`__ format), processing the list of service requests (JSON or XLS again).
|
||||||
The service requests and reply formats are based on the `draft-ietf-teas-yang-path-computation-01 <https://tools.ietf.org/html/draft-ietf-teas-yang-path-computation-01>`__ with custom extensions (e.g., for transponder modes).
|
The service requests and reply formats are based on the `draft-ietf-teas-yang-path-computation-01 <https://tools.ietf.org/html/draft-ietf-teas-yang-path-computation-01>`__ with custom extensions (e.g., for transponder modes).
|
||||||
An example of the JSON input is provided in file `service-template.json`, while results are shown in `path_result_template.json`.
|
An example of the JSON input is provided in file `service-template.json`, while results are shown in `path_result_template.json`.
|
||||||
|
|
||||||
|
|||||||
893
docs/json.rst
893
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
|
||||||
~~~~~
|
~~~~~
|
||||||
@@ -154,6 +182,8 @@ it is suggested to include an estimation of the loss coefficient for the Raman p
|
|||||||
a dictionary-like definition of the ``RamanFiber.params.loss_coef``
|
a dictionary-like definition of the ``RamanFiber.params.loss_coef``
|
||||||
(e.g. ``loss_coef = {"value": [0.18, 0.18, 0.20, 0.20], "frequency": [191e12, 196e12, 200e12, 210e12]}``).
|
(e.g. ``loss_coef = {"value": [0.18, 0.18, 0.20, 0.20], "frequency": [191e12, 196e12, 200e12, 210e12]}``).
|
||||||
|
|
||||||
|
.. _transceiver:
|
||||||
|
|
||||||
Transceiver
|
Transceiver
|
||||||
~~~~~~~~~~~
|
~~~~~~~~~~~
|
||||||
|
|
||||||
@@ -235,6 +265,8 @@ for example:
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
.. _roadm:
|
||||||
|
|
||||||
ROADM
|
ROADM
|
||||||
~~~~~
|
~~~~~
|
||||||
|
|
||||||
@@ -243,6 +275,10 @@ The user can only modify the value of existing parameters:
|
|||||||
+-------------------------------+-----------+----------------------------------------------------+
|
+-------------------------------+-----------+----------------------------------------------------+
|
||||||
| field | type | description |
|
| field | type | description |
|
||||||
+===============================+===========+====================================================+
|
+===============================+===========+====================================================+
|
||||||
|
| ``type_variety`` | (string) | Optional. Default: ``default`` |
|
||||||
|
| | | A unique name to ID the ROADM variety in the JSON |
|
||||||
|
| | | template topology input file. |
|
||||||
|
+-------------------------------+-----------+----------------------------------------------------+
|
||||||
| ``target_pch_out_db`` | (number) | Default :ref:`equalization strategy<equalization>` |
|
| ``target_pch_out_db`` | (number) | Default :ref:`equalization strategy<equalization>` |
|
||||||
| or | | for this ROADM type. |
|
| or | | for this ROADM type. |
|
||||||
| ``target_psd_out_mWperGHz`` | | |
|
| ``target_psd_out_mWperGHz`` | | |
|
||||||
@@ -270,6 +306,189 @@ The user can only modify the value of existing parameters:
|
|||||||
| | | insert a ``Fused`` node on the degree |
|
| | | insert a ``Fused`` node on the degree |
|
||||||
| | | output. |
|
| | | output. |
|
||||||
+-------------------------------+-----------+----------------------------------------------------+
|
+-------------------------------+-----------+----------------------------------------------------+
|
||||||
|
| ``roadm-path-impairments`` | (list of | Optional. List of ROADM path category impairments. |
|
||||||
|
| | dict) | |
|
||||||
|
+-------------------------------+-----------+----------------------------------------------------+
|
||||||
|
|
||||||
|
In addition to these general impairment, the user may define detailed set of impairments for add,
|
||||||
|
drop and express path within the the ROADM. The impairment description is inspired from the `IETF
|
||||||
|
CCAMP optical impairment topology <https://github.com/ietf-ccamp-wg/draft-ietf-ccamp-optical-impairment-topology-yang>`_
|
||||||
|
(details here: `ROADM attributes IETF <https://github.com/ietf-ccamp-wg/draft-ietf-ccamp-optical-impairment-topology-yang/files/4262135/ROADM.attributes_IETF_v8draft.pptx>`_).
|
||||||
|
|
||||||
|
The ``roadm-path-impairments`` list allows the definition of the list of impairments by internal path category (add, drop or express). Several additional paths can be defined -- add-path, drop-path or express-path. They are indexed and the related impairments are defined per band.
|
||||||
|
|
||||||
|
Each item should contain:
|
||||||
|
|
||||||
|
+--------------------------------+-----------+----------------------------------------------------+
|
||||||
|
| field | type | description |
|
||||||
|
+================================+===========+====================================================+
|
||||||
|
| ``roadm-path-impairments-id`` | (number) | A unique number to ID the impairments. |
|
||||||
|
+--------------------------------+-----------+----------------------------------------------------+
|
||||||
|
| ``roadm-express-path`` | (list) | List of the impairments defined per frequency |
|
||||||
|
| or | | range. The impairments are detailed in the |
|
||||||
|
| ``roadm-add-path`` | | following table. |
|
||||||
|
| or | | |
|
||||||
|
| ``roadm-drop-path`` | | |
|
||||||
|
| (mutually exclusive) | | |
|
||||||
|
+--------------------------------+-----------+----------------------------------------------------+
|
||||||
|
|
||||||
|
Here are the parameters for each path category and the implementation status:
|
||||||
|
|
||||||
|
+----------------------------+-----------+-----------------------------------------------------------+-------------+-------------+---------------------+
|
||||||
|
| field | Type | Description | Drop path | Add path | Express (thru) path |
|
||||||
|
+============================+===========+===========================================================+=============+=============+=====================+
|
||||||
|
| ``frequency-range`` | (list) | List containing ``lower-frequency`` and | | | |
|
||||||
|
| | | ``upper-frequency`` in Hz. | | | |
|
||||||
|
+----------------------------+-----------+-----------------------------------------------------------+-------------+-------------+---------------------+
|
||||||
|
| ``roadm-maxloss`` | (number) | In dB. Default: 0 dB. Maximum expected path loss on this | Implemented | Implemented | Implemented |
|
||||||
|
| | | roadm-path assuming no additional path loss is added = | | | |
|
||||||
|
| | | minimum loss applied to channels when crossing the ROADM | | | |
|
||||||
|
| | | (worst case expected loss due to the ROADM). | | | |
|
||||||
|
+----------------------------+-----------+-----------------------------------------------------------+-------------+-------------+---------------------+
|
||||||
|
| ``roadm-minloss`` | | The net loss from the ROADM input, to the output of the | Not yet | N.A. | N.A. |
|
||||||
|
| | | drop block (best case expected loss). | implemented | | |
|
||||||
|
+----------------------------+-----------+-----------------------------------------------------------+-------------+-------------+---------------------+
|
||||||
|
| ``roadm-typloss`` | | The net loss from the ROADM input, to the output of the | Not yet | N.A. | N.A. |
|
||||||
|
| | | drop block (typical). | implemented | | |
|
||||||
|
+----------------------------+-----------+-----------------------------------------------------------+-------------+-------------+---------------------+
|
||||||
|
| ``roadm-pmin`` | | Minimum power levels per carrier expected at the output | Not yet | N.A. | N.A. |
|
||||||
|
| | | of the drop block. | implemented | | |
|
||||||
|
+----------------------------+-----------+-----------------------------------------------------------+-------------+-------------+---------------------+
|
||||||
|
| ``roadm-pmax`` | | (Add) Maximum (per carrier) power level permitted at the | Not yet | Not yet | N.A. |
|
||||||
|
| | | add block input ports. | implemented | implemented | |
|
||||||
|
| | | | | | |
|
||||||
|
| | | (Drop) Best case per carrier power levels expected at | | | |
|
||||||
|
| | | the output of the drop block. | | | |
|
||||||
|
+----------------------------+-----------+-----------------------------------------------------------+-------------+-------------+---------------------+
|
||||||
|
| ``roadm-ptyp`` | | Typical case per carrier power levels expected at the | Not yet | N.A. | N.A. |
|
||||||
|
| | | output of the drop block. | implemented | | |
|
||||||
|
+----------------------------+-----------+-----------------------------------------------------------+-------------+-------------+---------------------+
|
||||||
|
| ``roadm-noise-figure`` | | If the add (drop) path contains an amplifier, this is | Not yet | Not yet | N.A. |
|
||||||
|
| | | the noise figure of that amplifier inferred to the | Implemented | Implemented | |
|
||||||
|
| | | add (drop) port. | | | |
|
||||||
|
+----------------------------+-----------+-----------------------------------------------------------+-------------+-------------+---------------------+
|
||||||
|
| ``roadm-osnr`` | (number) | (Add) Optical Signal-to-Noise Ratio (OSNR). | implemented | Implemented | N.A. |
|
||||||
|
| | | If the add path contains the ability to adjust the | | | |
|
||||||
|
| | | carrier power levels into an add path amplifier | | | |
|
||||||
|
| | | (if present) to a target value, | | | |
|
||||||
|
| | | this reflects the OSNR contribution of the | | | |
|
||||||
|
| | | add amplifier assuming this target value is obtained. | | | |
|
||||||
|
| | | | | | |
|
||||||
|
| | | (Drop) Expected OSNR contribution of the drop path | | | |
|
||||||
|
| | | amplifier(if present) | | | |
|
||||||
|
| | | for the case of additional drop path loss | | | |
|
||||||
|
| | | (before this amplifier) | | | |
|
||||||
|
| | | in order to hit a target power level (per carrier). | | | |
|
||||||
|
+----------------------------+-----------+-----------------------------------------------------------+-------------+-------------+---------------------+
|
||||||
|
| ``roadm-pmd`` | (number) | PMD contribution of the specific roadm path. | Implemented | Implemented | Implemented |
|
||||||
|
+----------------------------+-----------+-----------------------------------------------------------+-------------+-------------+---------------------+
|
||||||
|
| ``roadm-cd`` | | | Not yet | Not yet | Not yet |
|
||||||
|
| | | | Implemented | Implemented | Implemented |
|
||||||
|
+----------------------------+-----------+-----------------------------------------------------------+-------------+-------------+---------------------+
|
||||||
|
| ``roadm-pdl`` | (number) | PDL contribution of the specific roadm path. | Implemented | Implemented | Implemented |
|
||||||
|
+----------------------------+-----------+-----------------------------------------------------------+-------------+-------------+---------------------+
|
||||||
|
| ``roadm-inband-crosstalk`` | | | Not yet | Not yet | Not yet |
|
||||||
|
| | | | Implemented | Implemented | Implemented |
|
||||||
|
+----------------------------+-----------+-----------------------------------------------------------+-------------+-------------+---------------------+
|
||||||
|
|
||||||
|
Here is a ROADM example with two add-path possible impairments:
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
|
||||||
|
"roadm-path-impairments": [
|
||||||
|
{
|
||||||
|
"roadm-path-impairments-id": 0,
|
||||||
|
"roadm-express-path": [{
|
||||||
|
"frequency-range": {
|
||||||
|
"lower-frequency": 191.3e12,
|
||||||
|
"upper-frequency": 196.1e12
|
||||||
|
},
|
||||||
|
"roadm-maxloss": 16.5
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"roadm-path-impairments-id": 1,
|
||||||
|
"roadm-add-path": [{
|
||||||
|
"frequency-range": {
|
||||||
|
"lower-frequency": 191.3e12,
|
||||||
|
"upper-frequency": 196.1e12
|
||||||
|
},
|
||||||
|
"roadm-maxloss": 11.5,
|
||||||
|
"roadm-osnr": 41
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"roadm-path-impairments-id": 2,
|
||||||
|
"roadm-drop-path": [{
|
||||||
|
"frequency-range": {
|
||||||
|
"lower-frequency": 191.3e12,
|
||||||
|
"upper-frequency": 196.1e12
|
||||||
|
},
|
||||||
|
"roadm-pmd": 0,
|
||||||
|
"roadm-cd": 0,
|
||||||
|
"roadm-pdl": 0,
|
||||||
|
"roadm-maxloss": 11.5,
|
||||||
|
"roadm-osnr": 41
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"roadm-path-impairments-id": 3,
|
||||||
|
"roadm-add-path": [{
|
||||||
|
"frequency-range": {
|
||||||
|
"lower-frequency": 191.3e12,
|
||||||
|
"upper-frequency": 196.1e12
|
||||||
|
},
|
||||||
|
"roadm-pmd": 0,
|
||||||
|
"roadm-cd": 0,
|
||||||
|
"roadm-pdl": 0,
|
||||||
|
"roadm-maxloss": 11.5,
|
||||||
|
"roadm-osnr": 20
|
||||||
|
}]
|
||||||
|
}]
|
||||||
|
|
||||||
|
On this example, the express channel has at least 16.5 dB loss when crossing the ROADM express path with the corresponding impairment id.
|
||||||
|
|
||||||
|
roadm-path-impairments is optional. If present, its values are considered instead of the ROADM general parameters.
|
||||||
|
For example, if add-path specifies 0.5 dB PDL and the general PDL parameter states 1.0 dB, then 0.5 dB is applied for this roadm-path only.
|
||||||
|
If present in add and/or drop path, roadm-osnr replaces the portion of add-drop-osnr defined for the whole ROADM,
|
||||||
|
assuming that add and drop contribution aggregated in add-drop-osnr are identical:
|
||||||
|
|
||||||
|
.. math::
|
||||||
|
|
||||||
|
add\_drop\_osnr = - 10log10(1/add_{osnr} + 1/drop_{osnr})
|
||||||
|
|
||||||
|
when:
|
||||||
|
|
||||||
|
.. math::
|
||||||
|
|
||||||
|
add_{osnr} = drop_{osnr}
|
||||||
|
|
||||||
|
.. math::
|
||||||
|
|
||||||
|
add_{osnr} = drop_{osnr} = add\_drop\_osnr + 10log10(2)
|
||||||
|
|
||||||
|
|
||||||
|
The user can specify the roadm type_variety in the json topology ROADM instance. If no variety is defined, ``default`` ID is used.
|
||||||
|
The user can define the impairment type for each roadm-path using the degrees ingress/egress immediate neighbor elements and the roadm-path-impairment-id defined in the library for the corresponding type-variety.
|
||||||
|
Here is an example:
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
|
||||||
|
{
|
||||||
|
"uid": "roadm SITE1",
|
||||||
|
"type": "Roadm",
|
||||||
|
"type_variety": "detailed_impairments",
|
||||||
|
"params": {
|
||||||
|
"per_degree_impairments": [
|
||||||
|
{
|
||||||
|
"from_degree": "trx SITE1",
|
||||||
|
"to_degree": "east edfa in SITE1 to ILA1",
|
||||||
|
"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).
|
||||||
|
If nothing is stated for impairments on roadm-paths, the program identifies the paths implicitly and assigns the first impairment_id that matches the type: if a transceiver is present on one degree, then it is an add/drop degree.
|
||||||
|
|
||||||
|
On the previous example, all «implicit» express roadm-path are assigned roadm-path-impairment-id = 0
|
||||||
|
|
||||||
Global parameters
|
Global parameters
|
||||||
-----------------
|
-----------------
|
||||||
@@ -301,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 |
|
||||||
@@ -312,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 |
|
||||||
@@ -332,14 +571,42 @@ 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>`_). |
|
||||||
+---------------------------------------------+-----------+---------------------------------------------+
|
+---------------------------------------------+-----------+---------------------------------------------+
|
||||||
| ``nli_params.computed_channels`` | (number) | The channels on which the NLI is |
|
| ``dispersion_tolerance`` | (number) | Optional. Pure number. Tuning parameter for |
|
||||||
| | | explicitly evaluated. |
|
| | | ggn model solution. Default value is 1. |
|
||||||
|
+---------------------------------------------+-----------+---------------------------------------------+
|
||||||
|
| ``phase_shift_tolerance`` | (number) | Optional. Pure number. Tuning parameter for |
|
||||||
|
| | | ggn model solution. Defaut value is 0.1. |
|
||||||
|
+---------------------------------------------+-----------+---------------------------------------------+
|
||||||
|
| ``nli_params.computed_channels`` | (list | Optional. The exact channel indices |
|
||||||
|
| | of | (starting from 1) on which the NLI is |
|
||||||
|
| | numbers) | explicitly evaluated. |
|
||||||
| | | The NLI of the other channels is |
|
| | | The NLI of the other channels is |
|
||||||
| | | interpolated using ``numpy.interp``. |
|
| | | interpolated using ``numpy.interp``. |
|
||||||
| | | In a C-band simulation with 96 channels in |
|
| | | In a C-band simulation with 96 channels in |
|
||||||
| | | a 50 GHz spacing fix-grid we recommend at |
|
| | | a 50 GHz spacing fix-grid we recommend at |
|
||||||
| | | one computed channel every 20 channels. |
|
| | | least one computed channel every 20 |
|
||||||
|
| | | channels. If this option is present, the |
|
||||||
|
| | | next option "computed_number_of_channels" |
|
||||||
|
| | | is ignored. If none of the options are |
|
||||||
|
| | | present, the NLI is computed for all |
|
||||||
|
| | | channels (no interpolation) |
|
||||||
|
+---------------------------------------------+-----------+---------------------------------------------+
|
||||||
|
| ``nli_params.computed_number_of_channels`` | (number) | Optional. The number of channels on which |
|
||||||
|
| | | the NLI is explicitly evaluated. |
|
||||||
|
| | | The channels are |
|
||||||
|
| | | evenly selected between the first and the |
|
||||||
|
| | | last carrier of the current propagated |
|
||||||
|
| | | spectrum. |
|
||||||
|
| | | The NLI of the other channels is |
|
||||||
|
| | | interpolated using ``numpy.interp``. |
|
||||||
|
| | | In a C-band simulation with 96 channels in |
|
||||||
|
| | | a 50 GHz spacing fix-grid we recommend at |
|
||||||
|
| | | least 6 channels. |
|
||||||
+---------------------------------------------+-----------+---------------------------------------------+
|
+---------------------------------------------+-----------+---------------------------------------------+
|
||||||
|
|
||||||
Span
|
Span
|
||||||
@@ -472,6 +739,31 @@ Span configuration is not a list (which may change in later releases) and the us
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Power sweep functionality is triggered when setting "power_range_db" in SI in the library. This defines a
|
||||||
|
list of reference powers on which a new design is performed and propagation is triggered
|
||||||
|
(only gnpy-transmission-example script).
|
||||||
|
|
||||||
|
for example, with the following settings:
|
||||||
|
|
||||||
|
- ``power_dbm`` = 0 dBm
|
||||||
|
- max power of the amplifier = 20 dBm,
|
||||||
|
- user defined ``delta_p`` set by user = 3 dB
|
||||||
|
- 80 channels, so :math:`pch_{max}` = 20 - 10log10(80) = 0.96 dBm
|
||||||
|
- ``delta_power_range_db`` = [-3, 0, 3]
|
||||||
|
- power_sweep -> power range [-3, 0] dBm
|
||||||
|
|
||||||
|
then the computation of delta_p during design for each power of this power sweep is:
|
||||||
|
|
||||||
|
- with :math:`p_{ref}` = 0 dBm, computed_delta_p = min(:math:`pch_{max}`, :math:`p_{ref}` + ``delta_p``) - :math:`p_{ref}` = 0.96 ;
|
||||||
|
- user defined ``delta_p`` = 3 dB **can not** be applied because of saturation,
|
||||||
|
- with :math:`p_{ref}` = -3 dBm (power sweep) computed_delta_p = min(:math:`pch_{max}`, :math:`p_{ref}` + ``delta_p``) - :math:`p_{ref}` =
|
||||||
|
min(0.96, -3.0 + 3.0) - (-3.0) = 3.0 ;
|
||||||
|
- user defined ``delta_p`` = 3 dB **can** be applied.
|
||||||
|
|
||||||
|
so the user defined delta_p is applied as much as possible.
|
||||||
|
|
||||||
|
.. _spectral_info:
|
||||||
|
|
||||||
SpectralInformation
|
SpectralInformation
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
@@ -487,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 |
|
||||||
@@ -529,6 +825,9 @@ In the simplest case, homogeneous channel allocation can be defined via the ``Sp
|
|||||||
| | | If the ``--power`` CLI option is used, |
|
| | | If the ``--power`` CLI option is used, |
|
||||||
| | | its value replaces this parameter. |
|
| | | its value replaces this parameter. |
|
||||||
+----------------------+-----------+-------------------------------------------+
|
+----------------------+-----------+-------------------------------------------+
|
||||||
|
| ``tx_power_dbm`` | (number) | In dBm. Optional. Power out from |
|
||||||
|
| | | transceiver. Default = power_dbm |
|
||||||
|
+----------------------+-----------+-------------------------------------------+
|
||||||
| ``power_range_db`` | (number) | Power sweep excursion around |
|
| ``power_range_db`` | (number) | Power sweep excursion around |
|
||||||
| | | ``power_dbm``. |
|
| | | ``power_dbm``. |
|
||||||
| | | This defines a list of reference powers |
|
| | | This defines a list of reference powers |
|
||||||
@@ -550,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
|
||||||
@@ -585,6 +891,9 @@ In this approach, each partition is internally homogeneous, but different partit
|
|||||||
| ``tx_osnr`` | (number) | In dB. Optional. OSNR out from |
|
| ``tx_osnr`` | (number) | In dB. Optional. OSNR out from |
|
||||||
| | | transponder. Default value is 40 dB. |
|
| | | transponder. Default value is 40 dB. |
|
||||||
+----------------------+-----------+-------------------------------------------+
|
+----------------------+-----------+-------------------------------------------+
|
||||||
|
| ``tx_power_dbm`` | (number) | In dBm. Optional. Power out from |
|
||||||
|
| | | transceiver. Default value is 0 dBm |
|
||||||
|
+----------------------+-----------+-------------------------------------------+
|
||||||
| ``delta_pdb`` | (number) | In dB. Optional. Power offset compared to |
|
| ``delta_pdb`` | (number) | In dB. Optional. Power offset compared to |
|
||||||
| | | the reference power used for design |
|
| | | the reference power used for design |
|
||||||
| | | (SI block in equipment library) to be |
|
| | | (SI block in equipment library) to be |
|
||||||
@@ -597,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,
|
||||||
@@ -688,3 +997,565 @@ With the PSW equalization:
|
|||||||
|
|
||||||
the power out of the ROADM will be computed as 2.0e-4 * 50 = 0.01 mW ie -20 dBm for label 1 types of carriers
|
the power out of the ROADM will be computed as 2.0e-4 * 50 = 0.01 mW ie -20 dBm for label 1 types of carriers
|
||||||
and 2.0e4 * 75 = 0.015 mW ie -18.24 dBm for label2 channels. So a ratio of ~ 1.76 dB between target powers for these carriers.
|
and 2.0e4 * 75 = 0.015 mW ie -18.24 dBm for label2 channels. So a ratio of ~ 1.76 dB between target powers for these carriers.
|
||||||
|
|
||||||
|
|
||||||
|
.. _topology:
|
||||||
|
|
||||||
|
Topology
|
||||||
|
--------
|
||||||
|
|
||||||
|
Topology file contains a list of elements and a list of connections between the elements to form a graph.
|
||||||
|
|
||||||
|
Elements can be:
|
||||||
|
|
||||||
|
- Fiber
|
||||||
|
- RamanFiber
|
||||||
|
- Edfa
|
||||||
|
- Fused
|
||||||
|
- Roadm
|
||||||
|
- Transceiver
|
||||||
|
|
||||||
|
|
||||||
|
Common attributes
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
All elements contain the followind attributes:
|
||||||
|
|
||||||
|
- **"uid"**: mandatory, element unique identifier.
|
||||||
|
- **"type"**: mandatory, element type among possible types (Fiber, RamanFiber, Edfa, Fused, Roadm, Transceiver).
|
||||||
|
- **"metadata"**: optional data including goelocation.
|
||||||
|
|
||||||
|
|
||||||
|
Fiber attributes/ RamanFiber attributes
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
+----------------------+-----------+--------------------------------------------------+
|
||||||
|
| field | type | description |
|
||||||
|
+======================+===========+==================================================+
|
||||||
|
| ``type_variety`` | (string) | optional, value must be listed in the |
|
||||||
|
| | | library to be a valid type. Default type |
|
||||||
|
| | | is SSMF. |
|
||||||
|
+----------------------+-----------+--------------------------------------------------+
|
||||||
|
| ``params`` | (dict of | see table below. |
|
||||||
|
| | numbers) | |
|
||||||
|
+----------------------+-----------+--------------------------------------------------+
|
||||||
|
|
||||||
|
|
||||||
|
+----------------------+-----------+--------------------------------------------------+
|
||||||
|
| params fields | type | description |
|
||||||
|
+======================+===========+==================================================+
|
||||||
|
| ``length`` | (number) | optional, length in ``length_units``, default |
|
||||||
|
| | | length is 80 km. |
|
||||||
|
+----------------------+-----------+--------------------------------------------------+
|
||||||
|
| ``length_units`` | (string) | Length unit of measurement. Default is "km". |
|
||||||
|
+----------------------+-----------+--------------------------------------------------+
|
||||||
|
| ``loss_coef`` | (number | In dB/km. Optional, loss coefficient. Default |
|
||||||
|
| | or dict) | is 0.2 dB/km. Slope of the loss can be defined |
|
||||||
|
| | | using a dict of frequency values such as |
|
||||||
|
| | | ``{"value": [0.18, 0.18, 0.20, 0.20], |
|
||||||
|
| | | "frequency": [191e12, 196e12, 200e12, 210e12]}`` |
|
||||||
|
+----------------------+-----------+--------------------------------------------------+
|
||||||
|
| ``att_in`` | (number) | In dB. Optional, attenuation at fiber input, for |
|
||||||
|
| | | padding purpose. Default is 0 dB. |
|
||||||
|
+----------------------+-----------+--------------------------------------------------+
|
||||||
|
| ``con_in`` | (number) | In dB. Optional, input connector loss. Default |
|
||||||
|
| | | is using value defined in library ``Span`` |
|
||||||
|
| | | section. |
|
||||||
|
+----------------------+-----------+--------------------------------------------------+
|
||||||
|
| ``con_out`` | (number) | In dB. Optional, output connector loss. Default |
|
||||||
|
| | | is using value defined in library ``Span`` |
|
||||||
|
| | | section. |
|
||||||
|
+----------------------+-----------+--------------------------------------------------+
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
|
||||||
|
{
|
||||||
|
"uid": "fiber (A1->A2)",
|
||||||
|
"type": "Fiber",
|
||||||
|
"type_variety": "SSMF",
|
||||||
|
"params":
|
||||||
|
{
|
||||||
|
"length": 120.0,
|
||||||
|
"loss_coef": 0.2,
|
||||||
|
"length_units": "km",
|
||||||
|
"att_in": 0,
|
||||||
|
"con_in": 0,
|
||||||
|
"con_out": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
The RamanFiber can be used to simulate Raman amplification through dedicated Raman pumps. The Raman pumps must be listed
|
||||||
|
in the key ``raman_pumps`` within the RamanFiber ``operational`` dictionary. The description of each Raman pump must
|
||||||
|
contain the following:
|
||||||
|
|
||||||
|
+---------------------------+-----------+------------------------------------------------------------+
|
||||||
|
| operational fields | type | description |
|
||||||
|
+===========================+===========+============================================================+
|
||||||
|
| ``power`` | (number) | Total pump power in :math:`W` |
|
||||||
|
| | | considering a depolarized pump |
|
||||||
|
+---------------------------+-----------+------------------------------------------------------------+
|
||||||
|
| ``frequency`` | (number) | Pump central frequency in :math:`Hz` |
|
||||||
|
+---------------------------+-----------+------------------------------------------------------------+
|
||||||
|
| ``propagation_direction`` | (string) | The pumps can propagate in the same or opposite direction |
|
||||||
|
| | | with respect the signal. Valid choices are ``coprop`` and |
|
||||||
|
| | | ``counterprop``, respectively |
|
||||||
|
+---------------------------+-----------+------------------------------------------------------------+
|
||||||
|
|
||||||
|
Beside the list of Raman pumps, the RamanFiber ``operational`` dictionary must include the ``temperature`` that affects
|
||||||
|
the amplified spontaneous emission noise generated by the Raman amplification.
|
||||||
|
As the loss coefficient significantly varies outside the C-band, where the Raman pumps are usually placed,
|
||||||
|
it is suggested to include an estimation of the loss coefficient for the Raman pump central frequencies within
|
||||||
|
a dictionary-like definition of the ``RamanFiber.params.loss_coef``
|
||||||
|
(e.g. ``loss_coef = {"value": [0.18, 0.18, 0.20, 0.20], "frequency": [191e12, 196e12, 200e12, 210e12]}``).
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
|
||||||
|
{
|
||||||
|
"uid": "Span1",
|
||||||
|
"type": "RamanFiber",
|
||||||
|
"type_variety": "SSMF",
|
||||||
|
"operational": {
|
||||||
|
"temperature": 283,
|
||||||
|
"raman_pumps": [
|
||||||
|
{
|
||||||
|
"power": 224.403e-3,
|
||||||
|
"frequency": 205e12,
|
||||||
|
"propagation_direction": "counterprop"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"power": 231.135e-3,
|
||||||
|
"frequency": 201e12,
|
||||||
|
"propagation_direction": "counterprop"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"params": {
|
||||||
|
"type_variety": "SSMF",
|
||||||
|
"length": 80.0,
|
||||||
|
"loss_coef": {
|
||||||
|
"value": [0.18, 0.18, 0.20, 0.20],
|
||||||
|
"frequency": [191e12, 196e12, 200e12, 210e12]
|
||||||
|
},
|
||||||
|
"length_units": "km",
|
||||||
|
"att_in": 0,
|
||||||
|
"con_in": 0.5,
|
||||||
|
"con_out": 0.5
|
||||||
|
},
|
||||||
|
"metadata": {
|
||||||
|
"location": {
|
||||||
|
"latitude": 1,
|
||||||
|
"longitude": 0,
|
||||||
|
"city": null,
|
||||||
|
"region": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Edfa attributes
|
||||||
|
~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
The user can specify the amplifier configurations, which are applied depending on general simulation setup:
|
||||||
|
- if the user has specified ``power_mode`` as True in Span section, delta_p is applied and gain_target is ignored and recomputed.
|
||||||
|
- if the user has specified ``power_mode`` as False in Span section, gain_target is applied and delta_p is ignored.
|
||||||
|
If the user has specified unfeasible targets with respect to the type_variety, targets might be changed accordingly.
|
||||||
|
For example, if gain_target leads to a power value above the maximum output power of the amplifier, the gain is saturated to
|
||||||
|
the maximum achievable total power.
|
||||||
|
|
||||||
|
The exact layout used by simulation can be retrieved thanks to --save-network option.
|
||||||
|
|
||||||
|
.. _operational_field:
|
||||||
|
|
||||||
|
+----------------------+-----------+--------------------------------------------------+
|
||||||
|
| field | type | description |
|
||||||
|
+======================+===========+==================================================+
|
||||||
|
| ``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``. Autodesign selection is |
|
||||||
|
| | | based J. -L. Auge, V. Curri and E. Le Rouzic, |
|
||||||
|
| | | Open Design for Multi-Vendor Optical Networks |
|
||||||
|
| | | , OFC 2019. equation 4 |
|
||||||
|
+----------------------+-----------+--------------------------------------------------+
|
||||||
|
| ``operational`` | (dict of | Optional, configuration settings of the |
|
||||||
|
| | numbers) | amplifier. See table below |
|
||||||
|
+----------------------+-----------+--------------------------------------------------+
|
||||||
|
|
||||||
|
+----------------------+-----------+-------------------------------------------------------------+
|
||||||
|
| operational field | type | description |
|
||||||
|
+======================+===========+=============================================================+
|
||||||
|
| ``gain_target`` | (number) | In dB. Optional Gain target between in_voa and out_voa. |
|
||||||
|
| | | |
|
||||||
|
+----------------------+-----------+-------------------------------------------------------------+
|
||||||
|
| ``delta_p`` | (number) | In dB. Optional Power offset at the outpout of the |
|
||||||
|
| | | amplifier and before out_voa compared to reference channel |
|
||||||
|
| | | power defined in SI block of library. |
|
||||||
|
+----------------------+-----------+-------------------------------------------------------------+
|
||||||
|
| ``out_voa`` | (number) | In dB. Optional, output variable optical attenuator loss. |
|
||||||
|
+----------------------+-----------+-------------------------------------------------------------+
|
||||||
|
| ``in_voa`` | (number) | In dB. Optional, input variable optical attenuator loss. |
|
||||||
|
+----------------------+-----------+-------------------------------------------------------------+
|
||||||
|
| ``tilt_target`` | (number) | In dB. Optional, tilt target on the whole wavelength range |
|
||||||
|
| | | of the amplifier. |
|
||||||
|
+----------------------+-----------+-------------------------------------------------------------+
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
|
||||||
|
{
|
||||||
|
"uid": "Edfa1",
|
||||||
|
"type": "Edfa",
|
||||||
|
"type_variety": "std_low_gain",
|
||||||
|
"operational": {
|
||||||
|
"gain_target": 15.0,
|
||||||
|
"delta_p": -2,
|
||||||
|
"tilt_target": -1,
|
||||||
|
"out_voa": 0
|
||||||
|
},
|
||||||
|
"metadata": {
|
||||||
|
"location": {
|
||||||
|
"latitude": 2,
|
||||||
|
"longitude": 0,
|
||||||
|
"city": null,
|
||||||
|
"region": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.. _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_json_instance:
|
||||||
|
|
||||||
|
+----------------------------------------+-----------+----------------------------------------------------+
|
||||||
|
| field | type | description |
|
||||||
|
+========================================+===========+====================================================+
|
||||||
|
| ``type_variety`` | (string) | Optional. If no variety is defined, ``default`` |
|
||||||
|
| | | ID is used. |
|
||||||
|
| | | A unique name must be used to ID the ROADM |
|
||||||
|
| | | variety in the JSON library file. |
|
||||||
|
+----------------------------------------+-----------+----------------------------------------------------+
|
||||||
|
| ``target_pch_out_db`` | (number) | :ref:`Equalization strategy<equalization>` |
|
||||||
|
| or | | for this ROADM. Optional: if not defined, the |
|
||||||
|
| ``target_psd_out_mWperGHz`` | | one defined in library for this type_variety is |
|
||||||
|
| or | | used. |
|
||||||
|
| ``target_out_mWperSlotWidth`` | | |
|
||||||
|
| (mutually exclusive) | | |
|
||||||
|
+----------------------------------------+-----------+----------------------------------------------------+
|
||||||
|
| ``restrictions`` | (dict of | Optional. If defined, it overrides restriction |
|
||||||
|
| | strings) | defined in library for this roadm type_variety. |
|
||||||
|
+----------------------------------------+-----------+----------------------------------------------------+
|
||||||
|
| ``per_degree_pch_out_db`` | (dict of | Optional. If defined, it overrides ROADM's general |
|
||||||
|
| or | string, | target power/psd for this degree. Dictionary with |
|
||||||
|
| ``per_degree_psd_out_mWperGHz`` | number) | key = degree name (uid of the immediate adjacent |
|
||||||
|
| or | | element) and value = target power/psd value. |
|
||||||
|
| ``per_degree_psd_out_mWperSlotWidth`` | | |
|
||||||
|
+----------------------------------------+-----------+----------------------------------------------------+
|
||||||
|
| ``per_degree_impairments`` | (list of | Optional. Impairments id for roadm-path. If |
|
||||||
|
| | dict) | defined, it overrides the general values defined |
|
||||||
|
| | | 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:
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
|
||||||
|
{
|
||||||
|
"uid": "roadm SITE1",
|
||||||
|
"type": "Roadm",
|
||||||
|
"type_variety": "detailed_impairments",
|
||||||
|
"params": {
|
||||||
|
"per_degree_impairments": [
|
||||||
|
{
|
||||||
|
"from_degree": "trx SITE1",
|
||||||
|
"to_degree": "east edfa in SITE1 to ILA1",
|
||||||
|
"impairment_id": 1
|
||||||
|
}],
|
||||||
|
"per_degree_pch_out_db": {
|
||||||
|
"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
|
||||||
|
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.
|
||||||
|
|
||||||
|
.. 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
|
||||||
|
~~~~~
|
||||||
|
|
||||||
|
The user can define concentrated losses thanks to Fused element. This can be useful for example to materialize connector with its loss between two fiber spans.
|
||||||
|
``params`` and ``loss`` are optional, loss of the concentrated loss is in dB. Default value is 0 dB.
|
||||||
|
A fused element connected to the egress of a ROADM will disable the automatic booster/preamp selection.
|
||||||
|
|
||||||
|
Fused ``params`` only contains a ``loss`` value in dB.
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
|
||||||
|
"params": {
|
||||||
|
"loss": 2
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Transceiver
|
||||||
|
~~~~~~~~~~~
|
||||||
|
|
||||||
|
Transceiver elements represent the logical function that generates a spectrum. This must be specified to start and stop propagation. However, the characteristics of the spectrum are defined elsewhere, so Transceiver elements do not contain any attribute.
|
||||||
|
Information on transceivers' type, modes and frequency must be listed in :ref:`service file<service>` or :ref:`spectrum file<mixed-rate>`. Without any definition, default :ref:`SI<spectral_info>` values of the library are propagated.
|
||||||
|
|
||||||
|
.. _service:
|
||||||
|
|
||||||
|
Service JSON file
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Service file lists all requests and their possible constraints. This is derived from draft-ietf-teas-yang-path-computation-01.txt:
|
||||||
|
gnpy-path-request computes performance of each request independantly from each other, considering full load (based on the request settings),
|
||||||
|
but computes spectrum occupation based on the list of request, so that the requests should not define overlapping spectrum.
|
||||||
|
Lack of spectrum leads to blocking, but performance estimation is still returned for information.
|
||||||
|
|
||||||
|
|
||||||
|
+-----------------------+-------------------+----------------------------------------------------------------+
|
||||||
|
| field | type | description |
|
||||||
|
+=======================+===================+================================================================+
|
||||||
|
| ``path-request`` | (list of | list of requests. |
|
||||||
|
| | request) | |
|
||||||
|
+-----------------------+-------------------+----------------------------------------------------------------+
|
||||||
|
| ``synchronization`` | (list of | Optional. List of synchronization vector. One synchronization |
|
||||||
|
| | synchronization) | vector contains the disjunction constraints. |
|
||||||
|
+-----------------------+-------------------+----------------------------------------------------------------+
|
||||||
|
|
||||||
|
- **"path-request"** list of requests made of:
|
||||||
|
|
||||||
|
+-----------------------+------------+----------------------------------------------------------------+
|
||||||
|
| field | type | description |
|
||||||
|
+=======================+============+================================================================+
|
||||||
|
| ``request-id`` | (number) | Mandatory. Unique id of request. The same id is referenced in |
|
||||||
|
| | | response with ``response-id``. |
|
||||||
|
+-----------------------+------------+----------------------------------------------------------------+
|
||||||
|
| ``source`` | (string) | Mandatory. Source of traffic. It must be one of the UID of |
|
||||||
|
| | | transceivers listed in the topology. |
|
||||||
|
+-----------------------+------------+----------------------------------------------------------------+
|
||||||
|
| ``src-tp-id`` | (string) | Mandatory. It must be equal to ``source``. |
|
||||||
|
+-----------------------+------------+----------------------------------------------------------------+
|
||||||
|
| ``destination`` | (string) | Mandatory. Destination of traffic. It must be one of the UID |
|
||||||
|
| | | of transceivers listed in the topology. |
|
||||||
|
+-----------------------+------------+----------------------------------------------------------------+
|
||||||
|
| ``dst-tp-id`` | (string) | Mandatory. It must be equal to ``destination``. |
|
||||||
|
+-----------------------+------------+----------------------------------------------------------------+
|
||||||
|
| ``bidirectional`` | (boolean) | Mandatory. Boolean indicating if the propagation should be |
|
||||||
|
| | | checked on source-destination only (false) or on |
|
||||||
|
| | | destination-source (true). |
|
||||||
|
+-----------------------+------------+----------------------------------------------------------------+
|
||||||
|
| ``path-constraints`` | (dict) | Mandatory. It contains the list of constraints including type |
|
||||||
|
| | | of transceiver, mode and nodes to be included in the path. |
|
||||||
|
+-----------------------+------------+----------------------------------------------------------------+
|
||||||
|
|
||||||
|
``path-constraints`` contains ``te-bandwidth`` with the following attributes:
|
||||||
|
|
||||||
|
+-----------------------------------+------------+----------------------------------------------------------------+
|
||||||
|
| field | type | description |
|
||||||
|
+===================================+============+================================================================+
|
||||||
|
| ``technology`` | (string) | Mandatory. Only one possible value ``flex-grid``. |
|
||||||
|
+-----------------------------------+------------+----------------------------------------------------------------+
|
||||||
|
| ``trx_type`` | (string) | Mandatory. Type of the transceiver selected for this request. |
|
||||||
|
| | | It must be listed in the library transceivers list. |
|
||||||
|
+-----------------------------------+------------+----------------------------------------------------------------+
|
||||||
|
| ``trx_mode`` | (string) | Optional. Mode selected for this path. It must be listed |
|
||||||
|
| | | within the library transceiver's modes. If not defined, |
|
||||||
|
| | | the gnpy-path-request script automatically selects the mode |
|
||||||
|
| | | that has performance above minimum required threshold |
|
||||||
|
| | | including margins and penalties for all channels (full load) |
|
||||||
|
| | | and 1) fit in the spacing, 2) has the largest baudrate, |
|
||||||
|
| | | 3) has the largest bitrate. |
|
||||||
|
+-----------------------------------+------------+----------------------------------------------------------------+
|
||||||
|
| ``spacing`` | (number) | Mandatory. In :math:`Hz`. Spacing is used for full spectral |
|
||||||
|
| | | load feasibility evaluation. |
|
||||||
|
+-----------------------------------+------------+----------------------------------------------------------------+
|
||||||
|
| ``path_bandwidth`` | (number) | Mandatory. In :math:`bit/s`. Required capacity on this |
|
||||||
|
| | | service. It is used to determine the needed number of channels |
|
||||||
|
| | | and spectrum occupation. |
|
||||||
|
+-----------------------------------+------------+----------------------------------------------------------------+
|
||||||
|
| ``max-nb-of-channel`` | (number) | Optional. Number of channels to take into account for the full |
|
||||||
|
| | | load computation. Default value is computed based on f_min |
|
||||||
|
| | | and f_max of transceiver frequency range and min_spacing of |
|
||||||
|
| | | mode (once selected). |
|
||||||
|
+-----------------------------------+------------+----------------------------------------------------------------+
|
||||||
|
| ``output-power`` | (number) | Optional. In :math:`W`. Target power to be considered at the |
|
||||||
|
| | | fiber span input. Default value uses power defined in SI in |
|
||||||
|
| | | the library converted in Watt: |
|
||||||
|
| | | :math:`10^(power\_dbm/10)`. |
|
||||||
|
| | | |
|
||||||
|
| | | Current script gnpy-path-request redesign the network on each |
|
||||||
|
| | | new request, using this power together with |
|
||||||
|
| | | ``max-nb-of-channel`` to compute target gains or power in |
|
||||||
|
| | | amplifiers. This parameter can therefore be useful to test |
|
||||||
|
| | | different designs with the same script. |
|
||||||
|
| | | |
|
||||||
|
| | | In order to keep the same design for different requests, |
|
||||||
|
| | | ``max-nb-of-channel` and ``output-power`` of each request |
|
||||||
|
| | | should be kept identical. |
|
||||||
|
+-----------------------------------+------------+----------------------------------------------------------------+
|
||||||
|
| ``tx_power`` | (number) | Optional. In :math:`W`. Optical output power emitted by the |
|
||||||
|
| | | transceiver. Default value is output-power. |
|
||||||
|
+-----------------------------------+------------+----------------------------------------------------------------+
|
||||||
|
| ``effective-freq-slot`` | (list) | Optional. List of N, M values defining the requested spectral |
|
||||||
|
| | | occupation for this service. N, M use ITU-T G694.1 Flexible |
|
||||||
|
| | | DWDM grid definition. |
|
||||||
|
| | | For the flexible DWDM grid, the allowed frequency slots have a |
|
||||||
|
| | | nominal central frequency (in :math:`THz`) defined by: |
|
||||||
|
| | | 193.1 + N × 0.00625 where N is a positive or negative integer |
|
||||||
|
| | | including 0 |
|
||||||
|
| | | and 0.00625 is the nominal central frequency granularity in |
|
||||||
|
| | | :math:`THz` and a slot width defined by: |
|
||||||
|
| | | 12.5 × M where M is a positive integer and 12.5 is the slot |
|
||||||
|
| | | width granularity in :math:`GHz`. |
|
||||||
|
| | | Any combination of frequency slots is allowed as long as |
|
||||||
|
| | | there is no overlap between two frequency slots. |
|
||||||
|
| | | Requested spectrum should be consistent with mode min_spacing |
|
||||||
|
| | | and path_bandwidth: 1) each slot inside the list must be |
|
||||||
|
| | | large enough to fit one carrier with min_spacing width, |
|
||||||
|
| | | 2) total number of channels should be large enough to support |
|
||||||
|
| | | the requested path_bandwidth. |
|
||||||
|
| | | Note that gnpy-path-request script uses full spectral load and |
|
||||||
|
| | | not this spectrum constraint to compute performance. Thus, the |
|
||||||
|
| | | specific mix of channels resulting from the list of requests |
|
||||||
|
| | | is not considered to compute performances. |
|
||||||
|
+-----------------------------------+------------+----------------------------------------------------------------+
|
||||||
|
| ``route-object-include-exclude`` | (list) | Optional. Indexed List of routing include/exclude constraints |
|
||||||
|
| | | to compute the path between source and destination. |
|
||||||
|
+-----------------------------------+------------+----------------------------------------------------------------+
|
||||||
|
|
||||||
|
``route-object-include-exclude`` attributes:
|
||||||
|
|
||||||
|
+-----------------------------------+------------+----------------------------------------------------------------+
|
||||||
|
| field | type | description |
|
||||||
|
+===================================+============+================================================================+
|
||||||
|
| ``explicit-route-usage`` | (string) | Mandatory. Only one value is supported: ``route-include-ero`` |
|
||||||
|
+-----------------------------------+------------+----------------------------------------------------------------+
|
||||||
|
| ``index`` | (number) | Mandatory. Index of the element to be included. |
|
||||||
|
+-----------------------------------+------------+----------------------------------------------------------------+
|
||||||
|
| ``nodes_id`` | (string) | Mandatory. UID of the node to include in the path. |
|
||||||
|
| | | It must be listed in the list of elements in topology file. |
|
||||||
|
+-----------------------------------+------------+----------------------------------------------------------------+
|
||||||
|
| ``hop-type`` | (string) | Mandatory. One among these two values: ``LOOSE`` or |
|
||||||
|
| | | ``STRICT``. If LOOSE, constraint may be ignored at |
|
||||||
|
| | | computation time if no solution is found that satisfies the |
|
||||||
|
| | | constraint. If STRICT, constraint MUST be satisfied, else the |
|
||||||
|
| | | computation is stopped and no solution is returned. |
|
||||||
|
+-----------------------------------+------------+----------------------------------------------------------------+
|
||||||
|
|
||||||
|
- **"synchronization"**:
|
||||||
|
|
||||||
|
+-----------------------------------+------------+----------------------------------------------------------------+
|
||||||
|
| field | type | description |
|
||||||
|
+===================================+============+================================================================+
|
||||||
|
| ``"relaxable`` | (boolean) | Mandatory. Only false is supported. |
|
||||||
|
+-----------------------------------+------------+----------------------------------------------------------------+
|
||||||
|
| ``disjointness`` | (string) | Mandatory. Only ``node link`` is supported. |
|
||||||
|
+-----------------------------------+------------+----------------------------------------------------------------+
|
||||||
|
| ``request-id-number`` | (list) | Mandatory. List of ``request-id`` whose path should be |
|
||||||
|
| | | disjointed. |
|
||||||
|
+-----------------------------------+------------+----------------------------------------------------------------+
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
|
||||||
|
"synchronization-id": "3",
|
||||||
|
"svec": {
|
||||||
|
"relaxable": false,
|
||||||
|
"disjointness": "node link",
|
||||||
|
"request-id-number": [
|
||||||
|
"3",
|
||||||
|
"1"
|
||||||
|
]
|
||||||
|
|||||||
@@ -5,6 +5,351 @@ Release change log
|
|||||||
|
|
||||||
Each release introduces some changes and new features.
|
Each release introduces some changes and new features.
|
||||||
|
|
||||||
|
(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).
|
||||||
|
Minimum loss when crossing a ROADM is no more 0 dB. It can be set per ROADM degree with roadm-path-impairments.
|
||||||
|
|
||||||
|
The transceiver output power, which was previously set using the same parameter as the input span power (power_dbm),
|
||||||
|
can now be set using a different parameter. It can be set as:
|
||||||
|
|
||||||
|
- for all channels, with tx_power_dbm using SI similarly to tx_osnr (gnpy-transmission-example script)
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
|
||||||
|
"SI": [{
|
||||||
|
"f_min": 191.35e12,
|
||||||
|
"baud_rate": 32e9,
|
||||||
|
"f_max": 196.1e12,
|
||||||
|
"spacing": 50e9,
|
||||||
|
"power_dbm": 3,
|
||||||
|
"power_range_db": [0, 0, 1],
|
||||||
|
"roll_off": 0.15,
|
||||||
|
"tx_osnr": 40,
|
||||||
|
"tx_power_dbm": -10,
|
||||||
|
"sys_margins": 2
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
- for certain channels, using -spectrum option and tx_channel_power_dbm option (gnpy-transmission-example script).
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
|
||||||
|
{
|
||||||
|
"spectrum": [
|
||||||
|
{
|
||||||
|
"f_min": 191.35e12,
|
||||||
|
"f_max":193.1e12,
|
||||||
|
"baud_rate": 32e9,
|
||||||
|
"slot_width": 50e9,
|
||||||
|
"power_dbm": 0,
|
||||||
|
"roll_off": 0.15,
|
||||||
|
"tx_osnr": 40
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"f_min": 193.15e12,
|
||||||
|
"f_max":193.15e12,
|
||||||
|
"baud_rate": 32e9,
|
||||||
|
"slot_width": 50e9,
|
||||||
|
"power_dbm": 0,
|
||||||
|
"roll_off": 0.15,
|
||||||
|
"tx_osnr": 40,
|
||||||
|
"tx_power_dbm": -10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"f_min": 193.2e12,
|
||||||
|
"f_max":195.1e12,
|
||||||
|
"baud_rate": 32e9,
|
||||||
|
"slot_width": 50e9,
|
||||||
|
"power_dbm": 0,
|
||||||
|
"roll_off": 0.15,
|
||||||
|
"tx_osnr": 40
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
- per service using the additional parameter ``tx_power`` which similarly to ``power`` should be defined in Watt (gnpy-path-request script)
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
|
||||||
|
{
|
||||||
|
"path-request": [
|
||||||
|
{
|
||||||
|
"request-id": "0",
|
||||||
|
"source": "trx SITE1",
|
||||||
|
"destination": "trx SITE2",
|
||||||
|
"src-tp-id": "trx SITE1",
|
||||||
|
"dst-tp-id": "trx SITE2",
|
||||||
|
"bidirectional": false,
|
||||||
|
"path-constraints": {
|
||||||
|
"te-bandwidth": {
|
||||||
|
"technology": "flexi-grid",
|
||||||
|
"trx_type": "Voyager",
|
||||||
|
"trx_mode": "mode 1",
|
||||||
|
"spacing": 50000000000.0,
|
||||||
|
"path_bandwidth": 100000000000.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"request-id": "0 with tx_power",
|
||||||
|
"source": "trx SITE1",
|
||||||
|
"destination": "trx SITE2",
|
||||||
|
"src-tp-id": "trx SITE1",
|
||||||
|
"dst-tp-id": "trx SITE2",
|
||||||
|
"bidirectional": false,
|
||||||
|
"path-constraints": {
|
||||||
|
"te-bandwidth": {
|
||||||
|
"technology": "flexi-grid",
|
||||||
|
"trx_type": "Voyager",
|
||||||
|
"trx_mode": "mode 1",
|
||||||
|
"tx_power": 0.0001,
|
||||||
|
"spacing": 50000000000.0,
|
||||||
|
"path_bandwidth": 100000000000.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
v2.9
|
||||||
|
----
|
||||||
|
|
||||||
|
The revision introduces a major refactor that separates design and propagation. Most of these changes have no impact
|
||||||
|
on the user experience, except the following ones:
|
||||||
|
|
||||||
|
**Network design - amplifiers**: amplifier saturation is checked during design in all cases, even if type_variety is
|
||||||
|
set; amplifier gain is no more computed on the fly but only at design phase.
|
||||||
|
|
||||||
|
Before, the design did not consider amplifier power saturation during design if amplifier type_variety was stated.
|
||||||
|
With this revision, the saturation is always applied:
|
||||||
|
If design is made for a per channel power that leads to saturation, the target are properly reduced and the design
|
||||||
|
is freezed. So that when a new simulation is performed on the same network for lower levels of power per channel
|
||||||
|
the same gain target is applied. Before these were recomputed, changing the gain targets, so the simulation was
|
||||||
|
not considering the exact same working points for amplifiers in case of saturation.
|
||||||
|
|
||||||
|
Note that this case (working with saturation settings) is not recommended.
|
||||||
|
|
||||||
|
The gain of amplifiers was estimated on the fly also in case of RamanFiber preceding elements. The refactor now
|
||||||
|
requires that an estimation of Raman gain of the RamanFiber is done during design to properly compute a gain target.
|
||||||
|
The Raman gain is estimated at design for every RamanFiber span and also during propagation instead of being only
|
||||||
|
estimated at propagation stage for those Raman Fiber spans concerned with the transmission. The auto-design is more
|
||||||
|
accurate for unpropagated spans, but this results in an increase overall computation time.
|
||||||
|
This will be improved in the future.
|
||||||
|
|
||||||
|
**Network design - ROADMs**: ROADM target power settings are verified during design.
|
||||||
|
|
||||||
|
Design checks that expected power coming from every directions ingress from a ROADM are consistent with output power
|
||||||
|
targets. The checks only considers the adjacent previous hop. If the expected power at the input of this ROADM is
|
||||||
|
lower than the target power on the out-degree of the ROADM, a warning is displayed, and user is asked to review the
|
||||||
|
input network to avoid this situation. This does not change the design or propagation behaviour.
|
||||||
|
|
||||||
|
**Propagation**: amplifier gain target is no more recomputed during propagation. It is now possible to freeze
|
||||||
|
the design and propagate without automatic changes.
|
||||||
|
|
||||||
|
In previous release, gain was recomputed during propagation based on an hypothetical reference noiseless channel
|
||||||
|
propagation. It was not possible to «freeze» the autodesign, and propagate without recomputing the gain target
|
||||||
|
of amplifiers.
|
||||||
|
With this new release, the design is freezed, so that it is possible to compare performances on same basis.
|
||||||
|
|
||||||
|
**Display**: "effective pch (dbm)" is removed. Display contains the target pch which is the target power per channel
|
||||||
|
in dBm, computed based on reference channel used for design and the amplifier delta_p in dB (and before out VOA
|
||||||
|
contribution). Note that "actual pch out (dBm)" is the actual propagated total power per channel averaged per spectrum
|
||||||
|
band definition at the output of the amplifier element, including noises and out VOA contribution.
|
||||||
|
|
||||||
v2.8
|
v2.8
|
||||||
----
|
----
|
||||||
|
|
||||||
@@ -61,8 +406,30 @@ instead of
|
|||||||
**change in display**: only warnings are displayed ; information are disabled and needs the -v (verbose)
|
**change in display**: only warnings are displayed ; information are disabled and needs the -v (verbose)
|
||||||
option to be displayed on standard output.
|
option to be displayed on standard output.
|
||||||
|
|
||||||
**frequency scaling**: Chromatic dispersion, effective area, Raman Gain coefficient,
|
**frequency scaling**: A more accurate description of fiber parameters is implemented, including frequency scaling of
|
||||||
and nonlinear coefficient can now be defined with a scaling along frequency.
|
chromatic dispersion, effective area, Raman gain coefficient, and nonlinear coefficient.
|
||||||
|
|
||||||
|
In particular:
|
||||||
|
|
||||||
|
1. Chromatic dispersion can be defined with ``'dispersion'`` and ``'dispersion_slope'``, as in previous versions, or
|
||||||
|
with ``'dispersion_per_frequency'``; the latter must be defined as a dictionary with two keys, ``'value'`` and
|
||||||
|
``'frequency'`` and it has higher priority than the entries ``'dispersion'`` and ``'dispersion_slope'``.
|
||||||
|
Essential change: In previous versions, when it was not provided the ``'dispersion_slope'`` was calculated in an
|
||||||
|
involute manner to get a vanishing beta3 , and this was a mere artifact for NLI evaluation purposes (namely to evaluate
|
||||||
|
beta2 and beta3, not for total dispersion accumulation). Now, the evaluation of beta2 and beta3 is performed explicitly
|
||||||
|
in the element.py module.
|
||||||
|
|
||||||
|
2. The effective area is provided as a scalar value evaluated at the Fiber reference frequency and properly scaled
|
||||||
|
considering the Fiber refractive indices n1 and n2, and the core radius. These quantities are assumed to be fixed and
|
||||||
|
are hard coded in the parameters.py module. Essential change: The effective area is always scaled along the frequency.
|
||||||
|
|
||||||
|
3. The Raman gain coefficient is properly scaled considering the overlapping of fiber effective area values scaled at
|
||||||
|
the interacting frequencies. Essential change: In previous version the Raman gain coefficient depends only on
|
||||||
|
the frequency offset.
|
||||||
|
|
||||||
|
4. The nonlinear coefficient ``'gamma'`` is properly scaled considering the refractive index n2 and the scaling
|
||||||
|
effective area. Essential change: As the effective area, the nonlinear coefficient is always scaled along the
|
||||||
|
frequency.
|
||||||
|
|
||||||
**power offset**: Power equalization now enables defining a power offset in transceiver library to represent
|
**power offset**: Power equalization now enables defining a power offset in transceiver library to represent
|
||||||
the deviation from the general equalisation strategy defined in ROADMs.
|
the deviation from the general equalisation strategy defined in ROADMs.
|
||||||
|
|||||||
@@ -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,19 +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
|
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, \
|
||||||
|
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, ReferenceCarrier
|
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
|
||||||
|
|
||||||
|
|
||||||
@@ -79,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
|
||||||
@@ -94,6 +109,9 @@ class Transceiver(_Node):
|
|||||||
self.penalties = {}
|
self.penalties = {}
|
||||||
self.total_penalty = 0
|
self.total_penalty = 0
|
||||||
self.propagated_labels = [""]
|
self.propagated_labels = [""]
|
||||||
|
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.
|
||||||
@@ -155,6 +173,7 @@ class Transceiver(_Node):
|
|||||||
# use raw_values so that the added SNR penalties are not cumulated
|
# use raw_values so that the added SNR penalties are not cumulated
|
||||||
snr_added = 0
|
snr_added = 0
|
||||||
for s in args:
|
for s in args:
|
||||||
|
if s is not None:
|
||||||
snr_added += db2lin(-s)
|
snr_added += db2lin(-s)
|
||||||
snr_added = -lin2db(snr_added)
|
snr_added = -lin2db(snr_added)
|
||||||
self.osnr_ase = snr_sum(self.raw_osnr_ase, self.baud_rate, snr_added)
|
self.osnr_ase = snr_sum(self.raw_osnr_ase, self.baud_rate, snr_added)
|
||||||
@@ -192,6 +211,7 @@ class Transceiver(_Node):
|
|||||||
osnr_ase = per_label_average(self.osnr_ase, self.propagated_labels)
|
osnr_ase = per_label_average(self.osnr_ase, self.propagated_labels)
|
||||||
osnr_ase_01nm = per_label_average(self.osnr_ase_01nm, self.propagated_labels)
|
osnr_ase_01nm = per_label_average(self.osnr_ase_01nm, self.propagated_labels)
|
||||||
snr_01nm = per_label_average(self.snr_01nm, self.propagated_labels)
|
snr_01nm = per_label_average(self.snr_01nm, self.propagated_labels)
|
||||||
|
tx_power_dbm = per_label_average(watt2dbm(self.tx_power), self.propagated_labels)
|
||||||
cd = mean(self.chromatic_dispersion)
|
cd = mean(self.chromatic_dispersion)
|
||||||
pmd = mean(self.pmd)
|
pmd = mean(self.pmd)
|
||||||
pdl = mean(self.pdl)
|
pdl = mean(self.pdl)
|
||||||
@@ -205,7 +225,8 @@ class Transceiver(_Node):
|
|||||||
f' CD (ps/nm): {cd:.2f}',
|
f' CD (ps/nm): {cd:.2f}',
|
||||||
f' PMD (ps): {pmd:.2f}',
|
f' PMD (ps): {pmd:.2f}',
|
||||||
f' PDL (dB): {pdl:.2f}',
|
f' PDL (dB): {pdl:.2f}',
|
||||||
f' Latency (ms): {latency:.2f}'])
|
f' Latency (ms): {latency:.2f}',
|
||||||
|
f' Actual pch out (dBm): {pretty_summary_print(tx_power_dbm)}'])
|
||||||
|
|
||||||
cd_penalty = self.penalties.get('chromatic_dispersion')
|
cd_penalty = self.penalties.get('chromatic_dispersion')
|
||||||
if cd_penalty is not None:
|
if cd_penalty is not None:
|
||||||
@@ -220,6 +241,7 @@ class Transceiver(_Node):
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
def __call__(self, spectral_info):
|
def __call__(self, spectral_info):
|
||||||
|
self.tx_power = spectral_info.tx_power
|
||||||
self._calc_snr(spectral_info)
|
self._calc_snr(spectral_info)
|
||||||
self._calc_cd(spectral_info)
|
self._calc_cd(spectral_info)
|
||||||
self._calc_pmd(spectral_info)
|
self._calc_pmd(spectral_info)
|
||||||
@@ -233,7 +255,11 @@ class Roadm(_Node):
|
|||||||
if not params:
|
if not params:
|
||||||
params = {}
|
params = {}
|
||||||
try:
|
try:
|
||||||
|
with warnings.catch_warnings(record=True) as caught_warnings:
|
||||||
super().__init__(*args, params=RoadmParams(**params), **kwargs)
|
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
|
||||||
@@ -242,6 +268,7 @@ class Roadm(_Node):
|
|||||||
# on the path, since it depends on the equalization definition on the degree.
|
# on the path, since it depends on the equalization definition on the degree.
|
||||||
self.ref_pch_out_dbm = None
|
self.ref_pch_out_dbm = None
|
||||||
self.loss = 0 # auto-design interest
|
self.loss = 0 # auto-design interest
|
||||||
|
self.loss_pch_db = None
|
||||||
|
|
||||||
# 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
|
||||||
# different carriers. The ref_effective_loss records the loss for a reference carrier.
|
# different carriers. The ref_effective_loss records the loss for a reference carrier.
|
||||||
@@ -260,6 +287,19 @@ class Roadm(_Node):
|
|||||||
self.per_degree_pch_psw = self.params.per_degree_pch_psw
|
self.per_degree_pch_psw = self.params.per_degree_pch_psw
|
||||||
self.ref_pch_in_dbm = {}
|
self.ref_pch_in_dbm = {}
|
||||||
self.ref_carrier = None
|
self.ref_carrier = None
|
||||||
|
# Define the nature of from-to internal connection: express-path, drop-path, add-path
|
||||||
|
# roadm_paths contains a list of RoadmPath object for each path crossing the ROADM
|
||||||
|
self.roadm_paths = []
|
||||||
|
# roadm_path_impairments contains a dictionnary of impairments profiles corresponding to type_variety
|
||||||
|
# first listed add, drop an express constitute the default
|
||||||
|
self.roadm_path_impairments = self.params.roadm_path_impairments
|
||||||
|
# per degree definitions, in case some degrees have particular deviations with respect to default.
|
||||||
|
self.per_degree_impairments = {f'{i["from_degree"]}-{i["to_degree"]}': {"from_degree": i["from_degree"],
|
||||||
|
"to_degree": i["to_degree"],
|
||||||
|
"impairment_id": i["impairment_id"]}
|
||||||
|
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):
|
||||||
@@ -274,9 +314,10 @@ class Roadm(_Node):
|
|||||||
to_json = {
|
to_json = {
|
||||||
'uid': self.uid,
|
'uid': self.uid,
|
||||||
'type': type(self).__name__,
|
'type': type(self).__name__,
|
||||||
|
'type_variety': self.type_variety,
|
||||||
'params': {
|
'params': {
|
||||||
equalisation: value,
|
equalisation: value,
|
||||||
'restrictions': self.restrictions,
|
'restrictions': self.restrictions
|
||||||
},
|
},
|
||||||
'metadata': {
|
'metadata': {
|
||||||
'location': self.metadata['location']._asdict()
|
'location': self.metadata['location']._asdict()
|
||||||
@@ -289,6 +330,14 @@ class Roadm(_Node):
|
|||||||
to_json['params']['per_degree_psd_out_mWperGHz'] = self.per_degree_pch_psd
|
to_json['params']['per_degree_psd_out_mWperGHz'] = self.per_degree_pch_psd
|
||||||
if self.per_degree_pch_psw:
|
if self.per_degree_pch_psw:
|
||||||
to_json['params']['per_degree_psd_out_mWperSlotWidth'] = self.per_degree_pch_psw
|
to_json['params']['per_degree_psd_out_mWperSlotWidth'] = self.per_degree_pch_psw
|
||||||
|
if self.per_degree_impairments:
|
||||||
|
to_json['params']['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):
|
||||||
@@ -299,10 +348,13 @@ class Roadm(_Node):
|
|||||||
return f'{type(self).__name__} {self.uid}'
|
return f'{type(self).__name__} {self.uid}'
|
||||||
|
|
||||||
total_pch = pretty_summary_print(per_label_average(self.pch_out_dbm, self.propagated_labels))
|
total_pch = pretty_summary_print(per_label_average(self.pch_out_dbm, self.propagated_labels))
|
||||||
|
total_loss = pretty_summary_print(per_label_average(self.loss_pch_db, self.propagated_labels))
|
||||||
return '\n'.join([f'{type(self).__name__} {self.uid}',
|
return '\n'.join([f'{type(self).__name__} {self.uid}',
|
||||||
f' effective loss (dB): {self.ref_effective_loss:.2f}',
|
f' Type_variety: {self.type_variety}',
|
||||||
f' reference pch out (dBm): {self.ref_pch_out_dbm:.2f}',
|
f' Reference loss (dB): {self.ref_effective_loss:.2f}',
|
||||||
f' actual pch out (dBm): {total_pch}'])
|
f' Actual loss (dB): {total_loss}',
|
||||||
|
f' Reference pch out (dBm): {self.ref_pch_out_dbm:.2f}',
|
||||||
|
f' Actual pch out (dBm): {total_pch}'])
|
||||||
|
|
||||||
def get_roadm_target_power(self, spectral_info: SpectralInformation = None) -> Union[float, ndarray]:
|
def get_roadm_target_power(self, spectral_info: SpectralInformation = None) -> Union[float, ndarray]:
|
||||||
"""Computes the power in dBm for a reference carrier or for a spectral information.
|
"""Computes the power in dBm for a reference carrier or for a spectral information.
|
||||||
@@ -358,13 +410,18 @@ class Roadm(_Node):
|
|||||||
def propagate(self, spectral_info, degree, from_degree):
|
def propagate(self, spectral_info, degree, from_degree):
|
||||||
"""Equalization targets are read from topology file if defined and completed with default
|
"""Equalization targets are read from topology file if defined and completed with default
|
||||||
definition of the library.
|
definition of the library.
|
||||||
If the input power is lower than the target one, use the input power instead because
|
If the input power is lower than the target one, use the input power minus the ROADM loss
|
||||||
a ROADM doesn't amplify, it can only attenuate.
|
if is exists, because a ROADM doesn't amplify, it can only attenuate.
|
||||||
There is no difference for add or express : the same target is applied. For the moment
|
There is no difference for add or express : the same target is applied.
|
||||||
propagates operates with spectral info carriers all having the same source or destination.
|
For the moment propagate operates with spectral info carriers all having the same source or destination.
|
||||||
"""
|
"""
|
||||||
# TODO maybe add a minimum loss for the ROADM
|
# 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)
|
||||||
|
# apply min ROADM loss if it exists
|
||||||
|
roadm_maxloss_db = self.get_impairment('roadm-maxloss', spectral_info.frequency, from_degree, degree)
|
||||||
|
spectral_info.apply_attenuation_db(roadm_maxloss_db)
|
||||||
|
# records the total power after applying minimum loss
|
||||||
|
net_input_power_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase)
|
||||||
# find the target power for the reference carrier
|
# find the target power for the reference carrier
|
||||||
ref_per_degree_pch = self.get_per_degree_ref_power(degree)
|
ref_per_degree_pch = self.get_per_degree_ref_power(degree)
|
||||||
# find the target powers for each signal carrier
|
# find the target powers for each signal carrier
|
||||||
@@ -374,15 +431,19 @@ class Roadm(_Node):
|
|||||||
# Depending on propagation upstream from this ROADM, the input power might be smaller than
|
# Depending on propagation upstream from this ROADM, the input power might be smaller than
|
||||||
# the target power out configured for this ROADM degree's egress. Since ROADM does not amplify,
|
# the target power out configured for this ROADM degree's egress. Since ROADM does not amplify,
|
||||||
# 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.
|
||||||
# (TODO add a minimum loss for the ROADM crossing)
|
ref_pch_in_dbm = self.ref_pch_in_dbm[from_degree]
|
||||||
self.ref_pch_out_dbm = min(self.ref_pch_in_dbm[from_degree], ref_per_degree_pch)
|
# Calculate the output power for the reference channel (only for visualization)
|
||||||
|
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
|
||||||
# different carriers. effective_loss records the loss for the reference carrier.
|
# different carriers. effective_loss records the loss for the reference carrier.
|
||||||
self.ref_effective_loss = self.ref_pch_in_dbm[from_degree] - self.ref_pch_out_dbm
|
# Calculate the effective loss for the reference channel
|
||||||
input_power = spectral_info.signal + spectral_info.nli + spectral_info.ase
|
self.ref_effective_loss = ref_pch_in_dbm - self.ref_pch_out_dbm
|
||||||
|
|
||||||
|
# Calculate the target power per channel according to the equalization policy
|
||||||
target_power_per_channel = per_degree_pch + spectral_info.delta_pdb_per_channel
|
target_power_per_channel = per_degree_pch + spectral_info.delta_pdb_per_channel
|
||||||
# Computation of the per channel target power according to equalization policy
|
# Computation of the correction according to equalization policy
|
||||||
# If target_power_per_channel has some channels power above input power, then the whole target is reduced.
|
# If target_power_per_channel has some channels power above input power, then the whole target is reduced.
|
||||||
# For example, if user specifies delta_pdb_per_channel:
|
# For example, if user specifies delta_pdb_per_channel:
|
||||||
# freq1: 1dB, freq2: 3dB, freq3: -3dB, and target is -20dBm out of the ROADM,
|
# freq1: 1dB, freq2: 3dB, freq3: -3dB, and target is -20dBm out of the ROADM,
|
||||||
@@ -397,17 +458,116 @@ class Roadm(_Node):
|
|||||||
# that had the min power.
|
# that had the min power.
|
||||||
# This change corresponds to a discussion held during coders call. Please look at this document for
|
# This change corresponds to a discussion held during coders call. Please look at this document for
|
||||||
# a reference: https://telecominfraproject.atlassian.net/wiki/spaces/OOPT/pages/669679645/PSE+Meeting+Minutes
|
# a reference: https://telecominfraproject.atlassian.net/wiki/spaces/OOPT/pages/669679645/PSE+Meeting+Minutes
|
||||||
correction = (abs(watt2dbm(input_power) - target_power_per_channel)
|
correction = calculate_absolute_min_or_zero(net_input_power_dbm - target_power_per_channel)
|
||||||
- (watt2dbm(input_power) - target_power_per_channel)) / 2
|
|
||||||
new_target = target_power_per_channel - correction
|
new_target = target_power_per_channel - correction
|
||||||
delta_power = watt2dbm(input_power) - new_target
|
delta_power = net_input_power_dbm - new_target
|
||||||
|
|
||||||
spectral_info.apply_attenuation_db(delta_power)
|
spectral_info.apply_attenuation_db(delta_power)
|
||||||
spectral_info.pmd = sqrt(spectral_info.pmd ** 2 + self.params.pmd ** 2)
|
|
||||||
spectral_info.pdl = sqrt(spectral_info.pdl ** 2 + self.params.pdl ** 2)
|
# Update the PMD information
|
||||||
|
pmd_impairment = self.get_impairment('roadm-pmd', spectral_info.frequency, from_degree, degree)
|
||||||
|
spectral_info.pmd = sqrt(spectral_info.pmd ** 2 + pmd_impairment ** 2)
|
||||||
|
|
||||||
|
# Update the PMD information
|
||||||
|
pdl_impairment = self.get_impairment('roadm-pdl', spectral_info.frequency, from_degree, degree)
|
||||||
|
spectral_info.pdl = sqrt(spectral_info.pdl ** 2 + pdl_impairment ** 2)
|
||||||
|
|
||||||
|
# Update the per channel power with the result of propagation
|
||||||
self.pch_out_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase)
|
self.pch_out_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase)
|
||||||
|
|
||||||
|
# Update the loss per channel and the labels
|
||||||
|
self.loss_pch_db = input_power_dbm - self.pch_out_dbm
|
||||||
self.propagated_labels = spectral_info.label
|
self.propagated_labels = spectral_info.label
|
||||||
|
|
||||||
|
def set_roadm_paths(self, from_degree, to_degree, path_type, impairment_id=None):
|
||||||
|
"""set internal path type: express, drop or add with corresponding impairment
|
||||||
|
|
||||||
|
If no impairment id is defined, then use the first profile that matches the path_type in the
|
||||||
|
profile dictionnary.
|
||||||
|
"""
|
||||||
|
# initialize impairment with params.pmd, params.cd
|
||||||
|
# if more detailed parameters are available for the Roadm, the use them instead
|
||||||
|
roadm_global_impairment = {
|
||||||
|
'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']:
|
||||||
|
# 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_osnr_db + 10log10(2)
|
||||||
|
roadm_global_impairment['impairment'][0]['roadm-osnr'] = self.params.add_drop_osnr + lin2db(2)
|
||||||
|
impairment = RoadmImpairment(roadm_global_impairment)
|
||||||
|
|
||||||
|
if impairment_id is None:
|
||||||
|
# get the first item in the type variety that matches the path_type
|
||||||
|
for path_impairment_id, path_impairment in self.roadm_path_impairments.items():
|
||||||
|
if path_impairment.path_type == path_type:
|
||||||
|
impairment = path_impairment
|
||||||
|
impairment_id = path_impairment_id
|
||||||
|
break
|
||||||
|
# at this point, path_type is not part of roadm_path_impairment, impairment and impairment_id are None
|
||||||
|
else:
|
||||||
|
if impairment_id in self.roadm_path_impairments:
|
||||||
|
impairment = self.roadm_path_impairments[impairment_id]
|
||||||
|
else:
|
||||||
|
msg = f'ROADM {self.uid}: impairment profile id {impairment_id} is not defined in library'
|
||||||
|
raise NetworkTopologyError(msg)
|
||||||
|
# print(from_degree, to_degree, path_type)
|
||||||
|
self.roadm_paths.append(RoadmPath(from_degree=from_degree, to_degree=to_degree, path_type=path_type,
|
||||||
|
impairment_id=impairment_id, impairment=impairment))
|
||||||
|
|
||||||
|
def get_roadm_path(self, from_degree, to_degree):
|
||||||
|
"""Get internal path type impairment"""
|
||||||
|
for roadm_path in self.roadm_paths:
|
||||||
|
if roadm_path.from_degree == from_degree and roadm_path.to_degree == to_degree:
|
||||||
|
return roadm_path
|
||||||
|
msg = f'Could not find from_degree-to_degree {from_degree}-{to_degree} path in ROADM {self.uid}'
|
||||||
|
raise NetworkTopologyError(msg)
|
||||||
|
|
||||||
|
def get_per_degree_impairment_id(self, from_degree, to_degree):
|
||||||
|
"""returns the id of the impairment if the degrees are in the per_degree tab"""
|
||||||
|
if f'{from_degree}-{to_degree}' in self.per_degree_impairments.keys():
|
||||||
|
return self.per_degree_impairments[f'{from_degree}-{to_degree}']["impairment_id"]
|
||||||
|
return None
|
||||||
|
|
||||||
|
def get_path_type_per_id(self, impairment_id):
|
||||||
|
"""returns the path_type of the impairment if the is is defined"""
|
||||||
|
if impairment_id in self.roadm_path_impairments.keys():
|
||||||
|
return self.roadm_path_impairments[impairment_id].path_type
|
||||||
|
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
|
||||||
@@ -707,11 +867,16 @@ class RamanFiber(Fiber):
|
|||||||
def to_json(self):
|
def to_json(self):
|
||||||
return dict(super().to_json, operational=self.operational)
|
return dict(super().to_json, operational=self.operational)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return super().__str__() + f'\n reference gain (dB): {round(self.estimated_gain, 2)}' \
|
||||||
|
+ f'\n actual gain (dB): {round(self.actual_raman_gain, 2)}'
|
||||||
|
|
||||||
def propagate(self, spectral_info: SpectralInformation):
|
def propagate(self, spectral_info: SpectralInformation):
|
||||||
"""Modifies the spectral information computing the attenuation, the non-linear interference generation,
|
"""Modifies the spectral information computing the attenuation, the non-linear interference generation,
|
||||||
the CD and PMD accumulation.
|
the CD and PMD accumulation.
|
||||||
"""
|
"""
|
||||||
# apply the attenuation due to the input connector loss
|
# apply the attenuation due to the input connector loss
|
||||||
|
pin = watt2dbm(sum(spectral_info.signal))
|
||||||
attenuation_in_db = self.params.con_in + self.params.att_in
|
attenuation_in_db = self.params.con_in + self.params.att_in
|
||||||
spectral_info.apply_attenuation_db(attenuation_in_db)
|
spectral_info.apply_attenuation_db(attenuation_in_db)
|
||||||
|
|
||||||
@@ -741,6 +906,8 @@ class RamanFiber(Fiber):
|
|||||||
spectral_info.apply_attenuation_db(attenuation_out_db)
|
spectral_info.apply_attenuation_db(attenuation_out_db)
|
||||||
self.pch_out_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase)
|
self.pch_out_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase)
|
||||||
self.propagated_labels = spectral_info.label
|
self.propagated_labels = spectral_info.label
|
||||||
|
pout = watt2dbm(sum(spectral_info.signal))
|
||||||
|
self.actual_raman_gain = self.loss + pout - pin
|
||||||
|
|
||||||
|
|
||||||
class Edfa(_Node):
|
class Edfa(_Node):
|
||||||
@@ -750,8 +917,11 @@ class Edfa(_Node):
|
|||||||
if operational is None:
|
if operational is None:
|
||||||
operational = {}
|
operational = {}
|
||||||
self.variety_list = kwargs.pop('variety_list', None)
|
self.variety_list = kwargs.pop('variety_list', None)
|
||||||
|
try:
|
||||||
super().__init__(*args, params=EdfaParams(**params), operational=EdfaOperational(**operational), **kwargs)
|
super().__init__(*args, params=EdfaParams(**params), operational=EdfaOperational(**operational), **kwargs)
|
||||||
self.interpol_dgt = None # interpolated dynamic gain tilt
|
except ParametersError as e:
|
||||||
|
raise ParametersError(f'{kwargs["uid"]}: {e}') from e
|
||||||
|
self.interpol_dgt = None # interpolated dynamic gain tilt defined per frequency on amp band
|
||||||
self.interpol_gain_ripple = None # gain ripple
|
self.interpol_gain_ripple = None # gain ripple
|
||||||
self.interpol_nf_ripple = None # nf_ripple
|
self.interpol_nf_ripple = None # nf_ripple
|
||||||
self.channel_freq = None # SI channel frequencies
|
self.channel_freq = None # SI channel frequencies
|
||||||
@@ -774,25 +944,28 @@ class Edfa(_Node):
|
|||||||
self.delta_p = self.operational.delta_p
|
self.delta_p = self.operational.delta_p
|
||||||
# self._delta_p contains computed delta_p during design even if power_mode is False
|
# self._delta_p contains computed delta_p during design even if power_mode is False
|
||||||
self._delta_p = None
|
self._delta_p = None
|
||||||
self.tilt_target = self.operational.tilt_target
|
self.tilt_target = self.operational.tilt_target # defined per lambda on the amp band
|
||||||
self.out_voa = self.operational.out_voa
|
self.out_voa = self.operational.out_voa
|
||||||
self.propagated_labels = [""]
|
self.propagated_labels = [""]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def to_json(self):
|
def to_json(self):
|
||||||
return {'uid': self.uid,
|
_to_json = {
|
||||||
|
'uid': self.uid,
|
||||||
'type': type(self).__name__,
|
'type': type(self).__name__,
|
||||||
'type_variety': self.params.type_variety,
|
'type_variety': self.params.type_variety,
|
||||||
'operational': {
|
'operational': {
|
||||||
'gain_target': round(self.effective_gain, 6) if self.effective_gain else None,
|
'gain_target': round(self.effective_gain, 6) if self.effective_gain else None,
|
||||||
'delta_p': self.delta_p,
|
'delta_p': self.delta_p,
|
||||||
'tilt_target': self.tilt_target,
|
'tilt_target': round(self.tilt_target, 5) if self.tilt_target is not None else None,
|
||||||
|
# defined per lambda on the amp band
|
||||||
'out_voa': self.out_voa
|
'out_voa': self.out_voa
|
||||||
},
|
},
|
||||||
'metadata': {
|
'metadata': {
|
||||||
'location': self.metadata['location']._asdict()
|
'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}, '
|
||||||
@@ -814,7 +987,9 @@ 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 if self.tilt_target else 0:.2f}',
|
||||||
|
# avoids -0.00 value for tilt_target
|
||||||
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}',
|
||||||
@@ -1016,7 +1191,7 @@ class Edfa(_Node):
|
|||||||
p = polyfit(self.channel_freq, self.interpol_dgt, 1)
|
p = polyfit(self.channel_freq, self.interpol_dgt, 1)
|
||||||
dgt_slope = p[0]
|
dgt_slope = p[0]
|
||||||
|
|
||||||
# Calculate the target slope
|
# Calculate the target slope defined per frequency on the amp band
|
||||||
targ_slope = -self.tilt_target / (self.params.f_max - self.params.f_min)
|
targ_slope = -self.tilt_target / (self.params.f_max - self.params.f_min)
|
||||||
|
|
||||||
# first estimate of DGT scaling
|
# first estimate of DGT scaling
|
||||||
@@ -1093,5 +1268,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):
|
||||||
|
# filter out carriers outside the amplifier band
|
||||||
|
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)
|
self.propagate(spectral_info)
|
||||||
return 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}') from 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,35 +7,43 @@ 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.utils import automatic_nch, db2lin
|
from gnpy.core.exceptions import EquipmentConfigError, ConfigurationError
|
||||||
from gnpy.core.exceptions import EquipmentConfigError
|
|
||||||
|
|
||||||
|
|
||||||
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):
|
||||||
"""return the trx and SI parameters from eqpt_config for a given type_variety and mode (ie format)"""
|
"""return the trx and SI parameters from eqpt_config for a given type_variety and mode (ie format)
|
||||||
|
|
||||||
|
if the type or mode do no match an existing transceiver in the library, then the function
|
||||||
|
raises an error if error_message is True else returns a default mode based on equipment['SI']['default']
|
||||||
|
If trx_mode is None (but type is valid), it returns an undetermined mode whatever the error message:
|
||||||
|
this is a special case for automatic mode selection.
|
||||||
|
"""
|
||||||
trx_params = {}
|
trx_params = {}
|
||||||
default_si_data = equipment['SI']['default']
|
default_si_data = equipment['SI']['default']
|
||||||
|
# default transponder characteristics
|
||||||
try:
|
# mainly used with transmission_main_example.py
|
||||||
trxs = equipment['Transceiver']
|
default_trx_params = {
|
||||||
# if called from path_requests_run.py, trx_mode is filled with None when not specified by user
|
'f_min': default_si_data.f_min,
|
||||||
# if called from transmission_main.py, trx_mode is ''
|
'f_max': default_si_data.f_max,
|
||||||
if trx_mode is not None:
|
'baud_rate': default_si_data.baud_rate,
|
||||||
mode_params = next(mode for trx in trxs
|
'spacing': default_si_data.spacing,
|
||||||
if trx == trx_type_variety
|
'OSNR': None,
|
||||||
for mode in trxs[trx].mode
|
'penalties': {},
|
||||||
if mode['format'] == trx_mode)
|
'bit_rate': None,
|
||||||
trx_params = {**mode_params}
|
'cost': None,
|
||||||
# sanity check: spacing baudrate must be smaller than min spacing
|
'roll_off': default_si_data.roll_off,
|
||||||
if trx_params['baud_rate'] > trx_params['min_spacing']:
|
'tx_osnr': default_si_data.tx_osnr,
|
||||||
raise EquipmentConfigError(f'Inconsistency in equipment library:\n Transponder "{trx_type_variety}"'
|
'min_spacing': None,
|
||||||
+ f' mode "{trx_params["format"]}" has baud rate'
|
'equalization_offset_db': 0
|
||||||
+ f' {trx_params["baud_rate"] * 1e-9:.3f} GHz greater than min_spacing'
|
}
|
||||||
+ f' {trx_params["min_spacing"] * 1e-9:.3f}.')
|
# Undetermined transponder characteristics
|
||||||
trx_params['equalization_offset_db'] = trx_params.get('equalization_offset_db', 0)
|
# mainly used with path_request_run.py for the automatic mode computation case
|
||||||
else:
|
undetermined_trx_params = {
|
||||||
mode_params = {"format": "undetermined",
|
"format": "undetermined",
|
||||||
"baud_rate": None,
|
"baud_rate": None,
|
||||||
"OSNR": None,
|
"OSNR": None,
|
||||||
"penalties": None,
|
"penalties": None,
|
||||||
@@ -44,34 +52,81 @@ def trx_mode_params(equipment, trx_type_variety='', trx_mode='', error_message=F
|
|||||||
"tx_osnr": None,
|
"tx_osnr": None,
|
||||||
"min_spacing": None,
|
"min_spacing": None,
|
||||||
"cost": None,
|
"cost": None,
|
||||||
"equalization_offset_db": 0}
|
"equalization_offset_db": 0
|
||||||
trx_params = {**mode_params}
|
}
|
||||||
trx_params['f_min'] = equipment['Transceiver'][trx_type_variety].frequency['min']
|
|
||||||
trx_params['f_max'] = equipment['Transceiver'][trx_type_variety].frequency['max']
|
|
||||||
|
|
||||||
# TODO: novel automatic feature maybe unwanted if spacing is specified
|
|
||||||
# trx_params['spacing'] = _automatic_spacing(trx_params['baud_rate'])
|
|
||||||
# temp = trx_params['spacing']
|
|
||||||
# print(f'spacing {temp}')
|
|
||||||
except StopIteration:
|
|
||||||
if error_message:
|
|
||||||
raise EquipmentConfigError(f'Could not find transponder "{trx_type_variety}" with mode "{trx_mode}" in equipment library')
|
|
||||||
else:
|
|
||||||
# default transponder charcteristics
|
|
||||||
# mainly used with transmission_main_example.py
|
|
||||||
trx_params['f_min'] = default_si_data.f_min
|
|
||||||
trx_params['f_max'] = default_si_data.f_max
|
|
||||||
trx_params['baud_rate'] = default_si_data.baud_rate
|
|
||||||
trx_params['spacing'] = default_si_data.spacing
|
|
||||||
trx_params['OSNR'] = None
|
|
||||||
trx_params['penalties'] = {}
|
|
||||||
trx_params['bit_rate'] = None
|
|
||||||
trx_params['cost'] = None
|
|
||||||
trx_params['roll_off'] = default_si_data.roll_off
|
|
||||||
trx_params['tx_osnr'] = default_si_data.tx_osnr
|
|
||||||
trx_params['min_spacing'] = None
|
|
||||||
trx_params['equalization_offset_db'] = 0
|
|
||||||
|
|
||||||
trx_params['power'] = db2lin(default_si_data.power_dbm) * 1e-3
|
|
||||||
|
|
||||||
|
trxs = equipment['Transceiver']
|
||||||
|
if trx_type_variety in trxs:
|
||||||
|
modes = {mode['format']: mode for mode in trxs[trx_type_variety].mode}
|
||||||
|
trx_frequencies = {'f_min': trxs[trx_type_variety].frequency['min'],
|
||||||
|
'f_max': trxs[trx_type_variety].frequency['max']}
|
||||||
|
if trx_mode in modes:
|
||||||
|
# if called from transmission_main.py, trx_mode is ''
|
||||||
|
trx_params = {**modes[trx_mode], **trx_frequencies}
|
||||||
|
if trx_params['baud_rate'] > trx_params['min_spacing']:
|
||||||
|
# sanity check: baudrate must be smaller than min spacing
|
||||||
|
raise EquipmentConfigError(f'Inconsistency in equipment library:\n Transponder "{trx_type_variety}" '
|
||||||
|
+ f'mode "{trx_params["format"]}" has baud rate '
|
||||||
|
+ f'{trx_params["baud_rate"] * 1e-9:.2f} GHz greater than min_spacing '
|
||||||
|
+ f'{trx_params["min_spacing"] * 1e-9:.2f}.')
|
||||||
|
trx_params['equalization_offset_db'] = trx_params.get('equalization_offset_db', 0)
|
||||||
return trx_params
|
return trx_params
|
||||||
|
if trx_mode is None:
|
||||||
|
# if called from path_requests_run.py, trx_mode is filled with None when not specified by user
|
||||||
|
trx_params = {**undetermined_trx_params, **trx_frequencies}
|
||||||
|
return trx_params
|
||||||
|
if trx_type_variety in trxs and error_message:
|
||||||
|
raise EquipmentConfigError(f'Could not find transponder "{trx_type_variety}" with mode "{trx_mode}" '
|
||||||
|
+ 'in equipment library')
|
||||||
|
if error_message:
|
||||||
|
raise EquipmentConfigError(f'Could not find transponder "{trx_type_variety}" in equipment library')
|
||||||
|
|
||||||
|
trx_params = {**default_trx_params}
|
||||||
|
return trx_params
|
||||||
|
|
||||||
|
|
||||||
|
def find_type_variety(amps: List[str], equipment: dict) -> List[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
|
||||||
|
|
||||||
|
|
||||||
|
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, Optional
|
||||||
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
|
||||||
|
|
||||||
@@ -52,7 +52,7 @@ class SpectralInformation(object):
|
|||||||
|
|
||||||
def __init__(self, frequency: array, baud_rate: array, slot_width: array, signal: array, nli: array, ase: array,
|
def __init__(self, frequency: array, baud_rate: array, slot_width: array, signal: array, nli: array, ase: array,
|
||||||
roll_off: array, chromatic_dispersion: array, pmd: array, pdl: array, latency: array,
|
roll_off: array, chromatic_dispersion: array, pmd: array, pdl: array, latency: array,
|
||||||
delta_pdb_per_channel: array, tx_osnr: array, label: array):
|
delta_pdb_per_channel: array, tx_osnr: array, tx_power: array, label: array):
|
||||||
indices = argsort(frequency)
|
indices = argsort(frequency)
|
||||||
self._frequency = frequency[indices]
|
self._frequency = frequency[indices]
|
||||||
self._df = outer(ones(frequency.shape), frequency) - outer(frequency, ones(frequency.shape))
|
self._df = outer(ones(frequency.shape), frequency) - outer(frequency, ones(frequency.shape))
|
||||||
@@ -80,6 +80,7 @@ class SpectralInformation(object):
|
|||||||
self._latency = latency[indices]
|
self._latency = latency[indices]
|
||||||
self._delta_pdb_per_channel = delta_pdb_per_channel[indices]
|
self._delta_pdb_per_channel = delta_pdb_per_channel[indices]
|
||||||
self._tx_osnr = tx_osnr[indices]
|
self._tx_osnr = tx_osnr[indices]
|
||||||
|
self._tx_power = tx_power[indices]
|
||||||
self._label = label[indices]
|
self._label = label[indices]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@@ -188,6 +189,14 @@ class SpectralInformation(object):
|
|||||||
def tx_osnr(self, tx_osnr):
|
def tx_osnr(self, tx_osnr):
|
||||||
self._tx_osnr = tx_osnr
|
self._tx_osnr = tx_osnr
|
||||||
|
|
||||||
|
@property
|
||||||
|
def tx_power(self):
|
||||||
|
return self._tx_power
|
||||||
|
|
||||||
|
@tx_power.setter
|
||||||
|
def tx_power(self, tx_power):
|
||||||
|
self._tx_power = tx_power
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def channel_number(self):
|
def channel_number(self):
|
||||||
return self._channel_number
|
return self._channel_number
|
||||||
@@ -232,6 +241,7 @@ class SpectralInformation(object):
|
|||||||
delta_pdb_per_channel=append(self.delta_pdb_per_channel,
|
delta_pdb_per_channel=append(self.delta_pdb_per_channel,
|
||||||
other.delta_pdb_per_channel),
|
other.delta_pdb_per_channel),
|
||||||
tx_osnr=append(self.tx_osnr, other.tx_osnr),
|
tx_osnr=append(self.tx_osnr, other.tx_osnr),
|
||||||
|
tx_power=append(self.tx_power, other.tx_power),
|
||||||
label=append(self.label, other.label))
|
label=append(self.label, other.label))
|
||||||
except SpectrumError:
|
except SpectrumError:
|
||||||
raise SpectrumError('Spectra cannot be summed: channels overlapping.')
|
raise SpectrumError('Spectra cannot be summed: channels overlapping.')
|
||||||
@@ -251,6 +261,7 @@ def create_arbitrary_spectral_information(frequency: Union[ndarray, Iterable, fl
|
|||||||
signal: Union[float, ndarray, Iterable],
|
signal: Union[float, ndarray, Iterable],
|
||||||
baud_rate: Union[float, ndarray, Iterable],
|
baud_rate: Union[float, ndarray, Iterable],
|
||||||
tx_osnr: Union[float, ndarray, Iterable],
|
tx_osnr: Union[float, ndarray, Iterable],
|
||||||
|
tx_power: Union[float, ndarray, Iterable] = None,
|
||||||
delta_pdb_per_channel: Union[float, ndarray, Iterable] = 0.,
|
delta_pdb_per_channel: Union[float, ndarray, Iterable] = 0.,
|
||||||
slot_width: Union[float, ndarray, Iterable] = None,
|
slot_width: Union[float, ndarray, Iterable] = None,
|
||||||
roll_off: Union[float, ndarray, Iterable] = 0.,
|
roll_off: Union[float, ndarray, Iterable] = 0.,
|
||||||
@@ -277,6 +288,7 @@ def create_arbitrary_spectral_information(frequency: Union[ndarray, Iterable, fl
|
|||||||
ase = zeros(number_of_channels)
|
ase = zeros(number_of_channels)
|
||||||
delta_pdb_per_channel = full(number_of_channels, delta_pdb_per_channel)
|
delta_pdb_per_channel = full(number_of_channels, delta_pdb_per_channel)
|
||||||
tx_osnr = full(number_of_channels, tx_osnr)
|
tx_osnr = full(number_of_channels, tx_osnr)
|
||||||
|
tx_power = full(number_of_channels, tx_power)
|
||||||
label = full(number_of_channels, label)
|
label = full(number_of_channels, label)
|
||||||
return SpectralInformation(frequency=frequency, slot_width=slot_width,
|
return SpectralInformation(frequency=frequency, slot_width=slot_width,
|
||||||
signal=signal, nli=nli, ase=ase,
|
signal=signal, nli=nli, ase=ase,
|
||||||
@@ -284,7 +296,7 @@ def create_arbitrary_spectral_information(frequency: Union[ndarray, Iterable, fl
|
|||||||
chromatic_dispersion=chromatic_dispersion,
|
chromatic_dispersion=chromatic_dispersion,
|
||||||
pmd=pmd, pdl=pdl, latency=latency,
|
pmd=pmd, pdl=pdl, latency=latency,
|
||||||
delta_pdb_per_channel=delta_pdb_per_channel,
|
delta_pdb_per_channel=delta_pdb_per_channel,
|
||||||
tx_osnr=tx_osnr, label=label)
|
tx_osnr=tx_osnr, tx_power=tx_power, label=label)
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
if 'could not broadcast' in str(e):
|
if 'could not broadcast' in str(e):
|
||||||
raise SpectrumError('Dimension mismatch in input fields.')
|
raise SpectrumError('Dimension mismatch in input fields.')
|
||||||
@@ -292,45 +304,96 @@ def create_arbitrary_spectral_information(frequency: Union[ndarray, Iterable, fl
|
|||||||
raise
|
raise
|
||||||
|
|
||||||
|
|
||||||
def create_input_spectral_information(f_min, f_max, roll_off, baud_rate, power, spacing, tx_osnr, delta_pdb=0):
|
def create_input_spectral_information(f_min, f_max, roll_off, baud_rate, spacing, tx_osnr, tx_power,
|
||||||
|
delta_pdb=0):
|
||||||
"""Creates a fixed slot width spectral information with flat power.
|
"""Creates a fixed slot width spectral information with flat power.
|
||||||
all arguments are scalar values"""
|
all arguments are scalar values"""
|
||||||
number_of_channels = automatic_nch(f_min, f_max, spacing)
|
number_of_channels = automatic_nch(f_min, f_max, spacing)
|
||||||
frequency = [(f_min + spacing * i) for i in range(1, number_of_channels + 1)]
|
frequency = [(f_min + spacing * i) for i in range(1, number_of_channels + 1)]
|
||||||
delta_pdb_per_channel = delta_pdb * ones(number_of_channels)
|
delta_pdb_per_channel = delta_pdb * ones(number_of_channels)
|
||||||
label = [f'{baud_rate * 1e-9 :.2f}G' for i in range(number_of_channels)]
|
label = [f'{baud_rate * 1e-9 :.2f}G' for i in range(number_of_channels)]
|
||||||
return create_arbitrary_spectral_information(frequency, slot_width=spacing, signal=power, baud_rate=baud_rate,
|
return create_arbitrary_spectral_information(frequency, slot_width=spacing, signal=tx_power, baud_rate=baud_rate,
|
||||||
roll_off=roll_off, delta_pdb_per_channel=delta_pdb_per_channel,
|
roll_off=roll_off, delta_pdb_per_channel=delta_pdb_per_channel,
|
||||||
tx_osnr=tx_osnr, 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) -> Optional[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.
|
||||||
:param initial_spectrum: indexed by frequency in Hz, with power offset (delta_pdb), baudrate, slot width,
|
:param initial_spectrum: indexed by frequency in Hz, with power offset (delta_pdb), baudrate, slot width,
|
||||||
tx_osnr and roll off.
|
tx_osnr, tx_power and roll off.
|
||||||
:param power: power of the request
|
:param power: power of the request
|
||||||
"""
|
"""
|
||||||
frequency = list(initial_spectrum.keys())
|
frequency = list(initial_spectrum.keys())
|
||||||
signal = [power * db2lin(c.delta_pdb) for c in initial_spectrum.values()]
|
signal = [c.tx_power for c in initial_spectrum.values()]
|
||||||
roll_off = [c.roll_off for c in initial_spectrum.values()]
|
roll_off = [c.roll_off for c in initial_spectrum.values()]
|
||||||
baud_rate = [c.baud_rate for c in initial_spectrum.values()]
|
baud_rate = [c.baud_rate for c in initial_spectrum.values()]
|
||||||
delta_pdb_per_channel = [c.delta_pdb for c in initial_spectrum.values()]
|
delta_pdb_per_channel = [c.delta_pdb for c in initial_spectrum.values()]
|
||||||
slot_width = [c.slot_width for c in initial_spectrum.values()]
|
slot_width = [c.slot_width for c in initial_spectrum.values()]
|
||||||
tx_osnr = [c.tx_osnr for c in initial_spectrum.values()]
|
tx_osnr = [c.tx_osnr for c in initial_spectrum.values()]
|
||||||
|
tx_power = [c.tx_power for c in initial_spectrum.values()]
|
||||||
label = [c.label for c in initial_spectrum.values()]
|
label = [c.label for c in initial_spectrum.values()]
|
||||||
p_span0 = watt2dbm(power)
|
|
||||||
return create_arbitrary_spectral_information(frequency=frequency, signal=signal, baud_rate=baud_rate,
|
return create_arbitrary_spectral_information(frequency=frequency, signal=signal, baud_rate=baud_rate,
|
||||||
slot_width=slot_width, roll_off=roll_off,
|
slot_width=slot_width, roll_off=roll_off,
|
||||||
delta_pdb_per_channel=delta_pdb_per_channel, tx_osnr=tx_osnr,
|
delta_pdb_per_channel=delta_pdb_per_channel, tx_osnr=tx_osnr,
|
||||||
label=label)
|
tx_power=tx_power, label=label)
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class Carrier:
|
class Carrier:
|
||||||
"""One channel in the initial mixed-type spectrum definition, each type being defined by
|
"""One channel in the initial mixed-type spectrum definition, each type being defined by
|
||||||
its delta_pdb (power offset with respect to reference power), baud rate, slot_width, roll_off
|
its delta_pdb (power offset with respect to reference power), baud rate, slot_width, roll_off
|
||||||
and tx_osnr. delta_pdb offset is applied to target power out of Roadm.
|
tx_power, and tx_osnr. delta_pdb offset is applied to target power out of Roadm.
|
||||||
Label is used to group carriers which belong to the same partition when printing results.
|
Label is used to group carriers which belong to the same partition when printing results.
|
||||||
"""
|
"""
|
||||||
delta_pdb: float
|
delta_pdb: float
|
||||||
@@ -338,6 +401,7 @@ class Carrier:
|
|||||||
slot_width: float
|
slot_width: float
|
||||||
roll_off: float
|
roll_off: float
|
||||||
tx_osnr: float
|
tx_osnr: float
|
||||||
|
tx_power: float
|
||||||
label: str
|
label: str
|
||||||
|
|
||||||
|
|
||||||
@@ -347,7 +411,7 @@ class ReferenceCarrier:
|
|||||||
constant power spectral density (PSD) equalization is set. Reference channel is the type that has been defined
|
constant power spectral density (PSD) equalization is set. Reference channel is the type that has been defined
|
||||||
in SI block and used for the initial design of the network.
|
in SI block and used for the initial design of the network.
|
||||||
Computing the power out of ROADM for the reference channel is required to correctly compute the loss
|
Computing the power out of ROADM for the reference channel is required to correctly compute the loss
|
||||||
experienced by p_span_i in Roadm element.
|
experienced by reference channel in Roadm element.
|
||||||
|
|
||||||
Baud rate is required to find the target power in constant PSD: power = PSD_target * baud_rate.
|
Baud rate is required to find the target power in constant PSD: power = PSD_target * baud_rate.
|
||||||
For example, if target PSD is 3.125e4mW/GHz and reference carrier type a 32 GBaud channel then
|
For example, if target PSD is 3.125e4mW/GHz and reference carrier type a 32 GBaud channel then
|
||||||
@@ -358,7 +422,7 @@ class ReferenceCarrier:
|
|||||||
For example, if target PSW is 2e4mW/GHz and reference carrier type a 32 GBaud channel in a 50GHz slot width then
|
For example, if target PSW is 2e4mW/GHz and reference carrier type a 32 GBaud channel in a 50GHz slot width then
|
||||||
output power should be -20 dBm and for a 64 GBaud channel in a 75 GHz slot width, power target would be -18.24 dBm.
|
output power should be -20 dBm and for a 64 GBaud channel in a 75 GHz slot width, power target would be -18.24 dBm.
|
||||||
|
|
||||||
Other attributes (like slot_width or roll-off) may be added there for future equalization purpose.
|
Other attributes (like roll-off) may be added there for future equalization purpose.
|
||||||
"""
|
"""
|
||||||
baud_rate: float
|
baud_rate: float
|
||||||
slot_width: float
|
slot_width: float
|
||||||
|
|||||||
1120
gnpy/core/network.py
1120
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,32 +36,54 @@ 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):
|
||||||
|
return {"flag": self.flag,
|
||||||
|
"method": self.method,
|
||||||
|
"order": self.order,
|
||||||
|
"result_spatial_resolution": self.result_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_channels=None, computed_number_of_channels=None):
|
||||||
"""Simulation parameters used within the Nli Solver
|
"""Simulation parameters used within the Nli Solver
|
||||||
|
|
||||||
:params method: formula for NLI calculation
|
:params method: formula for NLI calculation
|
||||||
:params dispersion_tolerance: tuning parameter for ggn model solution
|
:params dispersion_tolerance: tuning parameter for ggn model solution
|
||||||
:params phase_shift_tolerance: tuning parameter for ggn model solution
|
:params phase_shift_tolerance: tuning parameter for ggn model solution
|
||||||
:params computed_channels: the NLI is evaluated for these channels and extrapolated for the others
|
:params computed_channels: the NLI is evaluated for these channels and extrapolated for the others
|
||||||
|
:params computed_number_of_channels: the NLI is evaluated for this number of channels equally distributed
|
||||||
|
in the spectrum and extrapolated for the others
|
||||||
"""
|
"""
|
||||||
self.method = method.lower()
|
self.method = method.lower()
|
||||||
self.dispersion_tolerance = dispersion_tolerance
|
self.dispersion_tolerance = dispersion_tolerance
|
||||||
self.phase_shift_tolerance = phase_shift_tolerance
|
self.phase_shift_tolerance = phase_shift_tolerance
|
||||||
self.computed_channels = computed_channels
|
self.computed_channels = computed_channels
|
||||||
|
self.computed_number_of_channels = computed_number_of_channels
|
||||||
|
|
||||||
|
def to_json(self):
|
||||||
|
return {"method": self.method,
|
||||||
|
"dispersion_tolerance": self.dispersion_tolerance,
|
||||||
|
"phase_shift_tolerance": self.phase_shift_tolerance,
|
||||||
|
"computed_channels": self.computed_channels,
|
||||||
|
"computed_number_of_channels": self.computed_number_of_channels}
|
||||||
|
|
||||||
|
|
||||||
class SimParams(Parameters):
|
class SimParams(Parameters):
|
||||||
@@ -98,8 +121,68 @@ class RoadmParams(Parameters):
|
|||||||
self.pmd = kwargs['pmd']
|
self.pmd = kwargs['pmd']
|
||||||
self.pdl = kwargs['pdl']
|
self.pdl = kwargs['pdl']
|
||||||
self.restrictions = kwargs['restrictions']
|
self.restrictions = kwargs['restrictions']
|
||||||
|
self.roadm_path_impairments = self.get_roadm_path_impairments(kwargs['roadm-path-impairments'])
|
||||||
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.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):
|
||||||
|
"""Get the ROADM list of profiles for impairments definition
|
||||||
|
|
||||||
|
transform the ietf model into gnpy internal model: add a path-type in the attributes
|
||||||
|
"""
|
||||||
|
if not path_impairments_list:
|
||||||
|
return {}
|
||||||
|
authorized_path_types = {
|
||||||
|
'roadm-express-path': 'express',
|
||||||
|
'roadm-add-path': 'add',
|
||||||
|
'roadm-drop-path': 'drop',
|
||||||
|
}
|
||||||
|
roadm_path_impairments = {}
|
||||||
|
for path_impairment in path_impairments_list:
|
||||||
|
index = path_impairment['roadm-path-impairments-id']
|
||||||
|
path_type = next(key for key in path_impairment if key in authorized_path_types.keys())
|
||||||
|
impairment_dict = {'path-type': authorized_path_types[path_type], 'impairment': path_impairment[path_type]}
|
||||||
|
roadm_path_impairments[index] = RoadmImpairment(impairment_dict)
|
||||||
|
return roadm_path_impairments
|
||||||
|
|
||||||
|
|
||||||
|
class RoadmPath:
|
||||||
|
def __init__(self, from_degree, to_degree, path_type, impairment_id=None, impairment=None):
|
||||||
|
"""Records roadm internal paths, types and impairment
|
||||||
|
|
||||||
|
path_type must be in "express", "add", "drop"
|
||||||
|
impairment_id must be one of the id detailed in equipement
|
||||||
|
"""
|
||||||
|
self.from_degree = from_degree
|
||||||
|
self.to_degree = to_degree
|
||||||
|
self.path_type = path_type
|
||||||
|
self.impairment_id = impairment_id
|
||||||
|
self.impairment = impairment
|
||||||
|
|
||||||
|
|
||||||
|
class RoadmImpairment:
|
||||||
|
"""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):
|
||||||
|
self.path_type = params.get('path-type')
|
||||||
|
self.impairments = params['impairment']
|
||||||
|
|
||||||
|
|
||||||
class FusedParams(Parameters):
|
class FusedParams(Parameters):
|
||||||
@@ -108,7 +191,33 @@ class FusedParams(Parameters):
|
|||||||
|
|
||||||
|
|
||||||
DEFAULT_RAMAN_COEFFICIENT = {
|
DEFAULT_RAMAN_COEFFICIENT = {
|
||||||
# SSMF Raman coefficient profile normalized with respect to the effective area overlap (g0 * A_eff(f_probe, f_pump))
|
# SSMF Raman coefficient profile in terms of mode intensity (g0 * A_ff_overlap)
|
||||||
|
'gamma_raman': array(
|
||||||
|
[0.0, 8.524419934705497e-16, 2.643567866245371e-15, 4.410548410941305e-15, 6.153422961291078e-15,
|
||||||
|
7.484924703044943e-15, 8.452060808349209e-15, 9.101549322698156e-15, 9.57837595158966e-15,
|
||||||
|
1.0008642675474562e-14, 1.0865773569905647e-14, 1.1300776305865833e-14, 1.2143238647099625e-14,
|
||||||
|
1.3231065750676068e-14, 1.4624900971525384e-14, 1.6013330554840492e-14, 1.7458119359310242e-14,
|
||||||
|
1.9320241330434762e-14, 2.1720395392873534e-14, 2.4137337406734775e-14, 2.628163218460466e-14,
|
||||||
|
2.8041019963285974e-14, 2.9723155447089933e-14, 3.129353531005888e-14, 3.251796163324624e-14,
|
||||||
|
3.3198839487612773e-14, 3.329527690685666e-14, 3.313155691238456e-14, 3.289013852154548e-14,
|
||||||
|
3.2458917188506916e-14, 3.060684277937575e-14, 3.2660349473783173e-14, 2.957419109657689e-14,
|
||||||
|
2.518894321396672e-14, 1.734560485857344e-14, 9.902860761605233e-15, 7.219176385099358e-15,
|
||||||
|
6.079565990401311e-15, 5.828373065963427e-15, 7.20580801091692e-15, 7.561924351387493e-15,
|
||||||
|
7.621152352332206e-15, 6.8859886780643254e-15, 5.629181047471162e-15, 3.679727598966185e-15,
|
||||||
|
2.7555869742500355e-15, 2.4810133942597675e-15, 2.2160080532403624e-15, 2.1440626024765557e-15,
|
||||||
|
2.33873070799544e-15, 2.557317929858713e-15, 3.039839048226572e-15, 4.8337165515610065e-15,
|
||||||
|
5.4647431818257436e-15, 5.229187813711269e-15, 4.510768525811313e-15, 3.3213473130607794e-15,
|
||||||
|
2.2602577027996455e-15, 1.969576495866441e-15, 1.5179853954188527e-15, 1.2953988551200156e-15,
|
||||||
|
1.1304672156251838e-15, 9.10004390675213e-16, 8.432919922183503e-16, 7.849224069008326e-16,
|
||||||
|
7.827568196032024e-16, 9.000514440646232e-16, 1.3025926460013665e-15, 1.5444108938497558e-15,
|
||||||
|
1.8795594063060786e-15, 1.7796130169921014e-15, 1.5938159865046653e-15, 1.1585522355108287e-15,
|
||||||
|
8.507044444633358e-16, 7.625404663756823e-16, 8.14510750925789e-16, 9.047944693473188e-16,
|
||||||
|
9.636431901702084e-16, 9.298633899602105e-16, 8.349739503637023e-16, 7.482901278066085e-16,
|
||||||
|
6.240794767134268e-16, 5.00652535687506e-16, 3.553373263685851e-16, 2.0344217706119682e-16,
|
||||||
|
1.4267522642294203e-16, 8.980016576743517e-17, 2.9829068181832594e-17, 1.4861959129014824e-17,
|
||||||
|
7.404482113326137e-18]
|
||||||
|
), # m/W
|
||||||
|
# SSMF Raman coefficient profile
|
||||||
'g0': array(
|
'g0': array(
|
||||||
[0.00000000e+00, 1.12351610e-05, 3.47838074e-05, 5.79356636e-05, 8.06921680e-05, 9.79845709e-05, 1.10454361e-04,
|
[0.00000000e+00, 1.12351610e-05, 3.47838074e-05, 5.79356636e-05, 8.06921680e-05, 9.79845709e-05, 1.10454361e-04,
|
||||||
1.18735302e-04, 1.24736889e-04, 1.30110053e-04, 1.41001273e-04, 1.46383247e-04, 1.57011792e-04, 1.70765865e-04,
|
1.18735302e-04, 1.24736889e-04, 1.30110053e-04, 1.41001273e-04, 1.46383247e-04, 1.57011792e-04, 1.70765865e-04,
|
||||||
@@ -123,22 +232,21 @@ DEFAULT_RAMAN_COEFFICIENT = {
|
|||||||
2.03744008e-05, 1.81939341e-05, 1.31862121e-05, 9.65352116e-06, 8.62698322e-06, 9.18688016e-06, 1.01737784e-05,
|
2.03744008e-05, 1.81939341e-05, 1.31862121e-05, 9.65352116e-06, 8.62698322e-06, 9.18688016e-06, 1.01737784e-05,
|
||||||
1.08017817e-05, 1.03903588e-05, 9.30040333e-06, 8.30809173e-06, 6.90650401e-06, 5.52238029e-06, 3.90648708e-06,
|
1.08017817e-05, 1.03903588e-05, 9.30040333e-06, 8.30809173e-06, 6.90650401e-06, 5.52238029e-06, 3.90648708e-06,
|
||||||
2.22908227e-06, 1.55796177e-06, 9.77218716e-07, 3.23477236e-07, 1.60602454e-07, 7.97306386e-08]
|
2.22908227e-06, 1.55796177e-06, 9.77218716e-07, 3.23477236e-07, 1.60602454e-07, 7.97306386e-08]
|
||||||
), # [m/W]
|
), # [1 / (W m)]
|
||||||
|
|
||||||
# Note the non-uniform spacing of this range; this is required for properly capturing the Raman peak shape.
|
# Note the non-uniform spacing of this range; this is required for properly capturing the Raman peak shape.
|
||||||
'frequency_offset': array([
|
'frequency_offset': array([
|
||||||
0., 0.5, 1., 1.5, 2., 2.5, 3., 3.5, 4., 4.5, 5., 5.5, 6., 6.5, 7., 7.5, 8., 8.5, 9., 9.5, 10., 10.5, 11., 11.5,
|
0., 0.5, 1., 1.5, 2., 2.5, 3., 3.5, 4., 4.5, 5., 5.5, 6., 6.5, 7., 7.5, 8., 8.5, 9., 9.5, 10., 10.5, 11., 11.5,
|
||||||
12.,
|
12., 12.5, 12.75, 13., 13.25, 13.5, 14., 14.5, 14.75, 15., 15.5, 16., 16.5, 17., 17.5, 18., 18.25, 18.5, 18.75,
|
||||||
12.5, 12.75, 13., 13.25, 13.5, 14., 14.5, 14.75, 15., 15.5, 16., 16.5, 17., 17.5, 18., 18.25, 18.5, 18.75, 19.,
|
19., 19.5, 20., 20.5, 21., 21.5, 22., 22.5, 23., 23.5, 24., 24.5, 25., 25.5, 26., 26.5, 27., 27.5, 28., 28.5,
|
||||||
19.5, 20., 20.5, 21., 21.5, 22., 22.5, 23., 23.5, 24., 24.5, 25., 25.5, 26., 26.5, 27., 27.5, 28., 28.5, 29.,
|
29., 29.5, 30., 30.5, 31., 31.5, 32., 32.5, 33., 33.5, 34., 34.5, 35., 35.5, 36., 36.5, 37., 37.5, 38., 38.5,
|
||||||
29.5,
|
39., 39.5, 40., 40.5, 41., 41.5, 42.]) * 1e12, # [Hz]
|
||||||
30., 30.5, 31., 31.5, 32., 32.5, 33., 33.5, 34., 34.5, 35., 35.5, 36., 36.5, 37., 37.5, 38., 38.5, 39., 39.5,
|
|
||||||
40.,
|
|
||||||
40.5, 41., 41.5, 42.]
|
|
||||||
) * 1e12, # [Hz]
|
|
||||||
|
|
||||||
# Raman profile reference frequency
|
# Raman profile reference frequency
|
||||||
'reference_frequency': 206184634112792 # [Hz] (1454 nm)}
|
'reference_frequency': 206.184634112792e12, # [Hz] (1454 nm)
|
||||||
|
|
||||||
|
# Raman profile reference effective area
|
||||||
|
'reference_effective_area': 75.74659443542413e-12 # [m^2] (@1454 nm)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -211,14 +319,21 @@ class FiberParams(Parameters):
|
|||||||
pi * self._core_radius ** 2 / self._effective_area)) ** 2
|
pi * self._core_radius ** 2 / self._effective_area)) ** 2
|
||||||
|
|
||||||
# Raman Gain Coefficient
|
# Raman Gain Coefficient
|
||||||
raman_coefficient = kwargs.get('raman_coefficient', DEFAULT_RAMAN_COEFFICIENT)
|
raman_coefficient = kwargs.get('raman_coefficient')
|
||||||
self._g0 = asarray(raman_coefficient['g0'])
|
if raman_coefficient is None:
|
||||||
raman_reference_frequency = raman_coefficient['reference_frequency']
|
self._raman_reference_frequency = DEFAULT_RAMAN_COEFFICIENT['reference_frequency']
|
||||||
|
frequency_offset = asarray(DEFAULT_RAMAN_COEFFICIENT['frequency_offset'])
|
||||||
|
gamma_raman = asarray(DEFAULT_RAMAN_COEFFICIENT['gamma_raman'])
|
||||||
|
stokes_wave = self._raman_reference_frequency - frequency_offset
|
||||||
|
normalized_gamma_raman = gamma_raman / self._raman_reference_frequency # 1 / m / W / Hz
|
||||||
|
self._g0 = gamma_raman / self.effective_area_overlap(stokes_wave, self._raman_reference_frequency)
|
||||||
|
else:
|
||||||
|
self._raman_reference_frequency = raman_coefficient['reference_frequency']
|
||||||
frequency_offset = asarray(raman_coefficient['frequency_offset'])
|
frequency_offset = asarray(raman_coefficient['frequency_offset'])
|
||||||
stokes_wave = raman_reference_frequency - frequency_offset
|
stokes_wave = self._raman_reference_frequency - frequency_offset
|
||||||
gamma_raman = self._g0 * self.effective_area_overlap(stokes_wave, raman_reference_frequency)
|
self._g0 = asarray(raman_coefficient['g0'])
|
||||||
normalized_gamma_raman = gamma_raman / raman_reference_frequency # 1 / m / W / Hz
|
gamma_raman = self._g0 * self.effective_area_overlap(stokes_wave, self._raman_reference_frequency)
|
||||||
self._raman_reference_frequency = raman_reference_frequency
|
normalized_gamma_raman = gamma_raman / self._raman_reference_frequency # 1 / m / W / Hz
|
||||||
|
|
||||||
# Raman gain coefficient array of the frequency offset constructed such that positive frequency values
|
# Raman gain coefficient array of the frequency offset constructed such that positive frequency values
|
||||||
# represent a positive power transfer from higher frequency and vice versa
|
# represent a positive power transfer from higher frequency and vice versa
|
||||||
@@ -355,6 +470,38 @@ class FiberParams(Parameters):
|
|||||||
|
|
||||||
|
|
||||||
class EdfaParams:
|
class EdfaParams:
|
||||||
|
default_values = {
|
||||||
|
'f_min': None,
|
||||||
|
'f_max': None,
|
||||||
|
'multi_band': None,
|
||||||
|
'bands': None,
|
||||||
|
'type_variety': '',
|
||||||
|
'type_def': '',
|
||||||
|
'gain_flatmax': None,
|
||||||
|
'gain_min': None,
|
||||||
|
'p_max': None,
|
||||||
|
'nf_model': None,
|
||||||
|
'dual_stage_model': None,
|
||||||
|
'preamp_variety': None,
|
||||||
|
'booster_variety': None,
|
||||||
|
'nf_min': None,
|
||||||
|
'nf_max': None,
|
||||||
|
'nf_coef': None,
|
||||||
|
'nf0': None,
|
||||||
|
'nf_fit_coeff': None,
|
||||||
|
'nf_ripple': 0,
|
||||||
|
'dgt': None,
|
||||||
|
'gain_ripple': 0,
|
||||||
|
'tilt_ripple': 0,
|
||||||
|
'f_ripple_ref': None,
|
||||||
|
'out_voa_auto': False,
|
||||||
|
'allowed_for_design': False,
|
||||||
|
'raman': False,
|
||||||
|
'pmd': 0,
|
||||||
|
'pdl': 0,
|
||||||
|
'advance_configurations_from_json': None
|
||||||
|
}
|
||||||
|
|
||||||
def __init__(self, **params):
|
def __init__(self, **params):
|
||||||
try:
|
try:
|
||||||
self.type_variety = params['type_variety']
|
self.type_variety = params['type_variety']
|
||||||
@@ -363,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']
|
||||||
@@ -452,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:
|
||||||
@@ -460,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):
|
||||||
@@ -475,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
|
||||||
"""
|
"""
|
||||||
|
if sim_params.raman_params.method == 'perturbative':
|
||||||
|
if sim_params.raman_params.order > 4:
|
||||||
|
raise ValueError(f'Order {sim_params.raman_params.order} not implemented in Raman Solver.')
|
||||||
|
z_lumped_losses = append(z[lumped_losses != 1], z[-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]
|
dz = z[1:] - z[:-1]
|
||||||
power = outer(power_in, ones(z.size))
|
power = outer(power_in, ones(z.size))
|
||||||
for i in range(1, z.size):
|
for i in range(1, z.size):
|
||||||
power[:, i] = \
|
power[:, i] = (power[:, i - 1] * (1 + (- alpha + sum(cr * power[:, i - 1], 1)) * dz[i - 1]) *
|
||||||
power[:, i - 1] * (1 + (- alpha + sum(cr * power[:, i - 1], 1)) * dz[i - 1]) * lumped_losses[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)
|
||||||
@@ -305,6 +357,10 @@ class NliSolver:
|
|||||||
elif 'ggn_spectrally_separated' in sim_params.nli_params.method:
|
elif 'ggn_spectrally_separated' in sim_params.nli_params.method:
|
||||||
if sim_params.nli_params.computed_channels is not None:
|
if sim_params.nli_params.computed_channels is not None:
|
||||||
cut_indices = array(sim_params.nli_params.computed_channels) - 1
|
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:
|
else:
|
||||||
cut_indices = array(spectral_info.channel_number) - 1
|
cut_indices = array(spectral_info.channel_number) - 1
|
||||||
|
|
||||||
@@ -316,6 +372,28 @@ class NliSolver:
|
|||||||
pump_power = outer(ones(cut_indices.size), spectral_info.signal)
|
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))
|
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
|
||||||
|
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 = eta * cut_power * pump_power ** 2 / cut_baud_rate
|
||||||
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)
|
||||||
@@ -522,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:
|
||||||
|
|||||||
@@ -9,9 +9,10 @@ This module contains utility functions that are used with gnpy.
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
from csv import writer
|
from csv import writer
|
||||||
from numpy import pi, cos, sqrt, log10, linspace, zeros, shape, where, logical_and, mean
|
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, Union
|
||||||
|
|
||||||
from gnpy.core.exceptions import ConfigurationError
|
from gnpy.core.exceptions import ConfigurationError
|
||||||
|
|
||||||
@@ -213,17 +214,6 @@ wavelength2freq = constants.lambda2nu
|
|||||||
freq2wavelength = constants.nu2lambda
|
freq2wavelength = constants.nu2lambda
|
||||||
|
|
||||||
|
|
||||||
def freq2wavelength(value):
|
|
||||||
"""Converts frequency units to wavelength units.
|
|
||||||
|
|
||||||
>>> round(freq2wavelength(191.35e12) * 1e9, 3)
|
|
||||||
1566.723
|
|
||||||
>>> round(freq2wavelength(196.1e12) * 1e9, 3)
|
|
||||||
1528.773
|
|
||||||
"""
|
|
||||||
return constants.c / value
|
|
||||||
|
|
||||||
|
|
||||||
def snr_sum(snr, bw, snr_added, bw_added=12.5e9):
|
def snr_sum(snr, bw, snr_added, bw_added=12.5e9):
|
||||||
snr_added = snr_added - lin2db(bw / bw_added)
|
snr_added = snr_added - lin2db(bw / bw_added)
|
||||||
snr = -lin2db(db2lin(-snr) + db2lin(-snr_added))
|
snr = -lin2db(db2lin(-snr) + db2lin(-snr_added))
|
||||||
@@ -452,3 +442,119 @@ def restore_order(elements, order):
|
|||||||
[3, 2, 7]
|
[3, 2, 7]
|
||||||
"""
|
"""
|
||||||
return [elements[i[0]] for i in sorted(enumerate(order), key=lambda x:x[1]) if elements[i[0]] is not None]
|
return [elements[i[0]] for i in sorted(enumerate(order), key=lambda x:x[1]) if elements[i[0]] is not None]
|
||||||
|
|
||||||
|
|
||||||
|
def unique_ordered(elements):
|
||||||
|
"""
|
||||||
|
"""
|
||||||
|
unique_elements = []
|
||||||
|
for element in elements:
|
||||||
|
if element not in unique_elements:
|
||||||
|
unique_elements.append(element)
|
||||||
|
return unique_elements
|
||||||
|
|
||||||
|
|
||||||
|
def calculate_absolute_min_or_zero(x: array) -> array:
|
||||||
|
"""Calculates the element-wise absolute minimum between the x and zero.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
x (array): The first input array.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
array: The element-wise absolute minimum between x and zero.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
>>> x = array([-1, 2, -3])
|
||||||
|
>>> calculate_absolute_min_or_zero(x)
|
||||||
|
array([1., 0., 3.])
|
||||||
|
"""
|
||||||
|
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'])
|
||||||
|
|
||||||
|
|
||||||
|
def transform_data(data: str) -> Union[List[int], None]:
|
||||||
|
"""Transforms a float into an list of one integer or a string separated by "|" into a list of integers.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
data (float or str): The data to transform.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
list of int: The transformed data as a list of integers.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
>>> transform_data(5.0)
|
||||||
|
[5]
|
||||||
|
|
||||||
|
>>> transform_data('1 | 2 | 3')
|
||||||
|
[1, 2, 3]
|
||||||
|
"""
|
||||||
|
if isinstance(data, float):
|
||||||
|
return [int(data)]
|
||||||
|
if isinstance(data, str):
|
||||||
|
return [int(x) for x in data.split(' | ')]
|
||||||
|
return None
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"network_name": "EDFA Example Network - P2P",
|
"network_name": "EDFA Example Network - P2P",
|
||||||
"elements": [{
|
"elements": [
|
||||||
|
{
|
||||||
"uid": "Site_A",
|
"uid": "Site_A",
|
||||||
"type": "Transceiver",
|
"type": "Transceiver",
|
||||||
"metadata": {
|
"metadata": {
|
||||||
@@ -61,9 +62,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
],
|
],
|
||||||
"connections": [{
|
"connections": [
|
||||||
|
{
|
||||||
"from_node": "Site_A",
|
"from_node": "Site_A",
|
||||||
"to_node": "Span1"
|
"to_node": "Span1"
|
||||||
},
|
},
|
||||||
@@ -75,6 +76,5 @@
|
|||||||
"from_node": "Edfa1",
|
"from_node": "Edfa1",
|
||||||
"to_node": "Site_B"
|
"to_node": "Site_B"
|
||||||
}
|
}
|
||||||
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
{ "Edfa":[{
|
{
|
||||||
|
"Edfa": [
|
||||||
|
{
|
||||||
"type_variety": "high_detail_model_example",
|
"type_variety": "high_detail_model_example",
|
||||||
"type_def": "advanced_model",
|
"type_def": "advanced_model",
|
||||||
"gain_flatmax": 25,
|
"gain_flatmax": 25,
|
||||||
@@ -7,7 +9,8 @@
|
|||||||
"advanced_config_from_json": "std_medium_gain_advanced_config.json",
|
"advanced_config_from_json": "std_medium_gain_advanced_config.json",
|
||||||
"out_voa_auto": false,
|
"out_voa_auto": false,
|
||||||
"allowed_for_design": false
|
"allowed_for_design": false
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
"type_variety": "Juniper_BoosterHG",
|
"type_variety": "Juniper_BoosterHG",
|
||||||
"type_def": "advanced_model",
|
"type_def": "advanced_model",
|
||||||
"gain_flatmax": 25,
|
"gain_flatmax": 25,
|
||||||
@@ -34,7 +37,12 @@
|
|||||||
"gain_flatmax": 27,
|
"gain_flatmax": 27,
|
||||||
"gain_min": 0,
|
"gain_min": 0,
|
||||||
"p_max": 22,
|
"p_max": 22,
|
||||||
"nf_coef": [-8.104e-4,-6.221e-2,-5.889e-1,37.62],
|
"nf_coef": [
|
||||||
|
-8.104e-4,
|
||||||
|
-6.221e-2,
|
||||||
|
-5.889e-1,
|
||||||
|
37.62
|
||||||
|
],
|
||||||
"allowed_for_design": false
|
"allowed_for_design": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -43,7 +51,12 @@
|
|||||||
"gain_flatmax": 27,
|
"gain_flatmax": 27,
|
||||||
"gain_min": 0,
|
"gain_min": 0,
|
||||||
"p_max": 22,
|
"p_max": 22,
|
||||||
"nf_coef": [-5.952e-4,-6.250e-2,-1.071,28.99],
|
"nf_coef": [
|
||||||
|
-5.952e-4,
|
||||||
|
-6.250e-2,
|
||||||
|
-1.071,
|
||||||
|
28.99
|
||||||
|
],
|
||||||
"allowed_for_design": false
|
"allowed_for_design": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -60,7 +73,12 @@
|
|||||||
"gain_flatmax": 27,
|
"gain_flatmax": 27,
|
||||||
"gain_min": 0,
|
"gain_min": 0,
|
||||||
"p_max": 22,
|
"p_max": 22,
|
||||||
"nf_coef": [-5.952e-4,-6.250e-2,-1.071,28.99],
|
"nf_coef": [
|
||||||
|
-5.952e-4,
|
||||||
|
-6.250e-2,
|
||||||
|
-1.071,
|
||||||
|
28.99
|
||||||
|
],
|
||||||
"allowed_for_design": false
|
"allowed_for_design": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -69,7 +87,12 @@
|
|||||||
"gain_flatmax": 27,
|
"gain_flatmax": 27,
|
||||||
"gain_min": 0,
|
"gain_min": 0,
|
||||||
"p_max": 22,
|
"p_max": 22,
|
||||||
"nf_coef": [-5.952e-4,-6.250e-2,-1.071,27.99],
|
"nf_coef": [
|
||||||
|
-5.952e-4,
|
||||||
|
-6.250e-2,
|
||||||
|
-1.071,
|
||||||
|
27.99
|
||||||
|
],
|
||||||
"allowed_for_design": false
|
"allowed_for_design": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -177,7 +200,8 @@
|
|||||||
"allowed_for_design": false
|
"allowed_for_design": false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"Fiber":[{
|
"Fiber": [
|
||||||
|
{
|
||||||
"type_variety": "SSMF",
|
"type_variety": "SSMF",
|
||||||
"dispersion": 1.67e-05,
|
"dispersion": 1.67e-05,
|
||||||
"effective_area": 83e-12,
|
"effective_area": 83e-12,
|
||||||
@@ -196,16 +220,22 @@
|
|||||||
"pmd_coef": 1.265e-15
|
"pmd_coef": 1.265e-15
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"RamanFiber":[{
|
"RamanFiber": [
|
||||||
|
{
|
||||||
"type_variety": "SSMF",
|
"type_variety": "SSMF",
|
||||||
"dispersion": 1.67e-05,
|
"dispersion": 1.67e-05,
|
||||||
"effective_area": 83e-12,
|
"effective_area": 83e-12,
|
||||||
"pmd_coef": 1.265e-15
|
"pmd_coef": 1.265e-15
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"Span":[{
|
"Span": [
|
||||||
|
{
|
||||||
"power_mode": true,
|
"power_mode": true,
|
||||||
"delta_power_range_db": [-2,3,0.5],
|
"delta_power_range_db": [
|
||||||
|
-2,
|
||||||
|
3,
|
||||||
|
0.5
|
||||||
|
],
|
||||||
"max_fiber_lineic_loss_for_raman": 0.25,
|
"max_fiber_lineic_loss_for_raman": 0.25,
|
||||||
"target_extended_gain": 2.5,
|
"target_extended_gain": 2.5,
|
||||||
"max_length": 150,
|
"max_length": 150,
|
||||||
@@ -217,7 +247,8 @@
|
|||||||
"con_out": 0
|
"con_out": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"Roadm":[{
|
"Roadm": [
|
||||||
|
{
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"add_drop_osnr": 38,
|
"add_drop_osnr": 38,
|
||||||
"pmd": 0,
|
"pmd": 0,
|
||||||
@@ -226,18 +257,109 @@
|
|||||||
"preamp_variety_list": [],
|
"preamp_variety_list": [],
|
||||||
"booster_variety_list": []
|
"booster_variety_list": []
|
||||||
}
|
}
|
||||||
}],
|
},
|
||||||
"SI":[{
|
{
|
||||||
|
"type_variety": "roadm_type_1",
|
||||||
|
"target_pch_out_db": -18,
|
||||||
|
"add_drop_osnr": 35,
|
||||||
|
"pmd": 0,
|
||||||
|
"pdl": 0,
|
||||||
|
"restrictions": {
|
||||||
|
"preamp_variety_list": [],
|
||||||
|
"booster_variety_list": []
|
||||||
|
},
|
||||||
|
"roadm-path-impairments": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_variety": "detailed_impairments",
|
||||||
|
"target_pch_out_db": -20,
|
||||||
|
"add_drop_osnr": 38,
|
||||||
|
"pmd": 0,
|
||||||
|
"pdl": 0,
|
||||||
|
"restrictions": {
|
||||||
|
"preamp_variety_list": [],
|
||||||
|
"booster_variety_list": []
|
||||||
|
},
|
||||||
|
"roadm-path-impairments": [
|
||||||
|
{
|
||||||
|
"roadm-path-impairments-id": 0,
|
||||||
|
"roadm-express-path": [
|
||||||
|
{
|
||||||
|
"frequency-range": {
|
||||||
|
"lower-frequency": 191.3e12,
|
||||||
|
"upper-frequency": 196.1e12
|
||||||
|
},
|
||||||
|
"roadm-pmd": 0,
|
||||||
|
"roadm-cd": 0,
|
||||||
|
"roadm-pdl": 0,
|
||||||
|
"roadm-inband-crosstalk": 0,
|
||||||
|
"roadm-maxloss": 16.5
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"roadm-path-impairments-id": 1,
|
||||||
|
"roadm-add-path": [
|
||||||
|
{
|
||||||
|
"frequency-range": {
|
||||||
|
"lower-frequency": 191.3e12,
|
||||||
|
"upper-frequency": 196.1e12
|
||||||
|
},
|
||||||
|
"roadm-pmd": 0,
|
||||||
|
"roadm-cd": 0,
|
||||||
|
"roadm-pdl": 0,
|
||||||
|
"roadm-inband-crosstalk": 0,
|
||||||
|
"roadm-maxloss": 11.5,
|
||||||
|
"roadm-pmax": 2.5,
|
||||||
|
"roadm-osnr": 41,
|
||||||
|
"roadm-noise-figure": 23
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"roadm-path-impairments-id": 2,
|
||||||
|
"roadm-drop-path": [
|
||||||
|
{
|
||||||
|
"frequency-range": {
|
||||||
|
"lower-frequency": 191.3e12,
|
||||||
|
"upper-frequency": 196.1e12
|
||||||
|
},
|
||||||
|
"roadm-pmd": 0,
|
||||||
|
"roadm-cd": 0,
|
||||||
|
"roadm-pdl": 0,
|
||||||
|
"roadm-inband-crosstalk": 0,
|
||||||
|
"roadm-maxloss": 11.5,
|
||||||
|
"roadm-minloss": 7.5,
|
||||||
|
"roadm-typloss": 10,
|
||||||
|
"roadm-pmin": -13.5,
|
||||||
|
"roadm-pmax": -9.5,
|
||||||
|
"roadm-ptyp": -12,
|
||||||
|
"roadm-osnr": 41,
|
||||||
|
"roadm-noise-figure": 15
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"SI": [
|
||||||
|
{
|
||||||
"f_min": 191.3e12,
|
"f_min": 191.3e12,
|
||||||
"baud_rate": 32e9,
|
"baud_rate": 32e9,
|
||||||
"f_max": 195.1e12,
|
"f_max": 195.1e12,
|
||||||
"spacing": 50e9,
|
"spacing": 50e9,
|
||||||
"power_dbm": 0,
|
"power_dbm": 0,
|
||||||
"power_range_db": [0,0,1],
|
"power_range_db": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"tx_power_dbm": 0,
|
||||||
"roll_off": 0.15,
|
"roll_off": 0.15,
|
||||||
"tx_osnr": 40,
|
"tx_osnr": 40,
|
||||||
"sys_margins": 2
|
"sys_margins": 2
|
||||||
}],
|
}
|
||||||
|
],
|
||||||
"Transceiver": [
|
"Transceiver": [
|
||||||
{
|
{
|
||||||
"type_variety": "vendorA_trx-type1",
|
"type_variety": "vendorA_trx-type1",
|
||||||
@@ -247,7 +369,6 @@
|
|||||||
},
|
},
|
||||||
"mode": [
|
"mode": [
|
||||||
{
|
{
|
||||||
|
|
||||||
"format": "mode 1",
|
"format": "mode 1",
|
||||||
"baud_rate": 32e9,
|
"baud_rate": 32e9,
|
||||||
"OSNR": 11,
|
"OSNR": 11,
|
||||||
@@ -319,5 +440,4 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -6,7 +6,12 @@
|
|||||||
"gain_flatmax": 27,
|
"gain_flatmax": 27,
|
||||||
"gain_min": 0,
|
"gain_min": 0,
|
||||||
"p_max": 22,
|
"p_max": 22,
|
||||||
"nf_coef": [-8.104e-4, -6.221e-2, -5.889e-1, 37.62],
|
"nf_coef": [
|
||||||
|
-8.104e-4,
|
||||||
|
-6.221e-2,
|
||||||
|
-5.889e-1,
|
||||||
|
37.62
|
||||||
|
],
|
||||||
"pmd": 3e-12,
|
"pmd": 3e-12,
|
||||||
"pdl": 0.7,
|
"pdl": 0.7,
|
||||||
"allowed_for_design": true
|
"allowed_for_design": true
|
||||||
@@ -17,7 +22,12 @@
|
|||||||
"gain_flatmax": 27,
|
"gain_flatmax": 27,
|
||||||
"gain_min": 0,
|
"gain_min": 0,
|
||||||
"p_max": 22,
|
"p_max": 22,
|
||||||
"nf_coef": [-5.952e-4, -6.250e-2, -1.071, 28.99],
|
"nf_coef": [
|
||||||
|
-5.952e-4,
|
||||||
|
-6.250e-2,
|
||||||
|
-1.071,
|
||||||
|
28.99
|
||||||
|
],
|
||||||
"pmd": 3e-12,
|
"pmd": 3e-12,
|
||||||
"pdl": 0.7,
|
"pdl": 0.7,
|
||||||
"allowed_for_design": true
|
"allowed_for_design": true
|
||||||
@@ -74,7 +84,11 @@
|
|||||||
"Span": [
|
"Span": [
|
||||||
{
|
{
|
||||||
"power_mode": true,
|
"power_mode": true,
|
||||||
"delta_power_range_db": [0, 0, 0],
|
"delta_power_range_db": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
"max_fiber_lineic_loss_for_raman": 0.25,
|
"max_fiber_lineic_loss_for_raman": 0.25,
|
||||||
"target_extended_gain": 0,
|
"target_extended_gain": 0,
|
||||||
"max_length": 135,
|
"max_length": 135,
|
||||||
@@ -93,8 +107,12 @@
|
|||||||
"pmd": 3e-12,
|
"pmd": 3e-12,
|
||||||
"pdl": 1.5,
|
"pdl": 1.5,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
"preamp_variety_list": ["openroadm_mw_mw_preamp"],
|
"preamp_variety_list": [
|
||||||
"booster_variety_list": ["openroadm_mw_mw_booster"]
|
"openroadm_mw_mw_preamp"
|
||||||
|
],
|
||||||
|
"booster_variety_list": [
|
||||||
|
"openroadm_mw_mw_booster"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -105,7 +123,11 @@
|
|||||||
"f_max": 196.1e12,
|
"f_max": 196.1e12,
|
||||||
"spacing": 50e9,
|
"spacing": 50e9,
|
||||||
"power_dbm": 2,
|
"power_dbm": 2,
|
||||||
"power_range_db": [0, 0, 1],
|
"power_range_db": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
"roll_off": 0.15,
|
"roll_off": 0.15,
|
||||||
"tx_osnr": 35,
|
"tx_osnr": 35,
|
||||||
"sys_margins": 2
|
"sys_margins": 2
|
||||||
|
|||||||
@@ -6,7 +6,12 @@
|
|||||||
"gain_flatmax": 27,
|
"gain_flatmax": 27,
|
||||||
"gain_min": 0,
|
"gain_min": 0,
|
||||||
"p_max": 22,
|
"p_max": 22,
|
||||||
"nf_coef": [-8.104e-4, -6.221e-2, -5.889e-1, 37.62],
|
"nf_coef": [
|
||||||
|
-8.104e-4,
|
||||||
|
-6.221e-2,
|
||||||
|
-5.889e-1,
|
||||||
|
37.62
|
||||||
|
],
|
||||||
"pmd": 3e-12,
|
"pmd": 3e-12,
|
||||||
"pdl": 0.7,
|
"pdl": 0.7,
|
||||||
"allowed_for_design": true
|
"allowed_for_design": true
|
||||||
@@ -17,7 +22,12 @@
|
|||||||
"gain_flatmax": 27,
|
"gain_flatmax": 27,
|
||||||
"gain_min": 0,
|
"gain_min": 0,
|
||||||
"p_max": 22,
|
"p_max": 22,
|
||||||
"nf_coef": [-5.952e-4, -6.250e-2, -1.071, 28.99],
|
"nf_coef": [
|
||||||
|
-5.952e-4,
|
||||||
|
-6.250e-2,
|
||||||
|
-1.071,
|
||||||
|
28.99
|
||||||
|
],
|
||||||
"pmd": 3e-12,
|
"pmd": 3e-12,
|
||||||
"pdl": 0.7,
|
"pdl": 0.7,
|
||||||
"allowed_for_design": true
|
"allowed_for_design": true
|
||||||
@@ -28,7 +38,12 @@
|
|||||||
"gain_flatmax": 27,
|
"gain_flatmax": 27,
|
||||||
"gain_min": 0,
|
"gain_min": 0,
|
||||||
"p_max": 22,
|
"p_max": 22,
|
||||||
"nf_coef": [-5.952e-4, -6.250e-2, -1.071, 28.99],
|
"nf_coef": [
|
||||||
|
-5.952e-4,
|
||||||
|
-6.250e-2,
|
||||||
|
-1.071,
|
||||||
|
28.99
|
||||||
|
],
|
||||||
"pmd": 0,
|
"pmd": 0,
|
||||||
"pdl": 0,
|
"pdl": 0,
|
||||||
"allowed_for_design": false
|
"allowed_for_design": false
|
||||||
@@ -39,7 +54,12 @@
|
|||||||
"gain_flatmax": 27,
|
"gain_flatmax": 27,
|
||||||
"gain_min": 0,
|
"gain_min": 0,
|
||||||
"p_max": 22,
|
"p_max": 22,
|
||||||
"nf_coef": [-5.952e-4, -6.250e-2, -1.071, 27.99],
|
"nf_coef": [
|
||||||
|
-5.952e-4,
|
||||||
|
-6.250e-2,
|
||||||
|
-1.071,
|
||||||
|
27.99
|
||||||
|
],
|
||||||
"pmd": 0,
|
"pmd": 0,
|
||||||
"pdl": 0,
|
"pdl": 0,
|
||||||
"allowed_for_design": false
|
"allowed_for_design": false
|
||||||
@@ -86,7 +106,11 @@
|
|||||||
"Span": [
|
"Span": [
|
||||||
{
|
{
|
||||||
"power_mode": true,
|
"power_mode": true,
|
||||||
"delta_power_range_db": [0, 0, 0],
|
"delta_power_range_db": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
"max_fiber_lineic_loss_for_raman": 0.25,
|
"max_fiber_lineic_loss_for_raman": 0.25,
|
||||||
"target_extended_gain": 0,
|
"target_extended_gain": 0,
|
||||||
"max_length": 135,
|
"max_length": 135,
|
||||||
@@ -105,8 +129,12 @@
|
|||||||
"pmd": 3e-12,
|
"pmd": 3e-12,
|
||||||
"pdl": 1.5,
|
"pdl": 1.5,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
"preamp_variety_list": ["openroadm_mw_mw_preamp_worstcase_ver5"],
|
"preamp_variety_list": [
|
||||||
"booster_variety_list": ["openroadm_mw_mw_booster"]
|
"openroadm_mw_mw_preamp_worstcase_ver5"
|
||||||
|
],
|
||||||
|
"booster_variety_list": [
|
||||||
|
"openroadm_mw_mw_booster"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -117,7 +145,11 @@
|
|||||||
"f_max": 196.1e12,
|
"f_max": 196.1e12,
|
||||||
"spacing": 50e9,
|
"spacing": 50e9,
|
||||||
"power_dbm": 2,
|
"power_dbm": 2,
|
||||||
"power_range_db": [0, 0, 1],
|
"power_range_db": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
"roll_off": 0.15,
|
"roll_off": 0.15,
|
||||||
"tx_osnr": 35,
|
"tx_osnr": 35,
|
||||||
"sys_margins": 2
|
"sys_margins": 2
|
||||||
|
|||||||
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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -8,6 +8,12 @@
|
|||||||
"method": "ggn_spectrally_separated",
|
"method": "ggn_spectrally_separated",
|
||||||
"dispersion_tolerance": 1,
|
"dispersion_tolerance": 1,
|
||||||
"phase_shift_tolerance": 0.1,
|
"phase_shift_tolerance": 0.1,
|
||||||
"computed_channels": [1, 18, 37, 56, 75]
|
"computed_channels": [
|
||||||
|
1,
|
||||||
|
18,
|
||||||
|
37,
|
||||||
|
56,
|
||||||
|
75
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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,
|
||||||
|
|||||||
@@ -11,25 +11,21 @@ Common code for CLI examples
|
|||||||
import argparse
|
import argparse
|
||||||
import logging
|
import logging
|
||||||
import sys
|
import sys
|
||||||
from math import ceil
|
|
||||||
from numpy import linspace, mean
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from math import ceil
|
||||||
|
from numpy import mean
|
||||||
|
|
||||||
import gnpy.core.ansi_escapes as ansi_escapes
|
from gnpy.core import ansi_escapes
|
||||||
from gnpy.core.elements import Transceiver, Fiber, RamanFiber
|
from gnpy.core.elements import Transceiver, Fiber, RamanFiber
|
||||||
from gnpy.core.equipment import trx_mode_params
|
from gnpy.core import 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'
|
||||||
@@ -109,6 +105,9 @@ def _add_common_options(parser: argparse.ArgumentParser, network_default: Path):
|
|||||||
|
|
||||||
|
|
||||||
def transmission_main_example(args=None):
|
def transmission_main_example(args=None):
|
||||||
|
"""Main script running a single simulation. It returns the detailed power across crossed elements and
|
||||||
|
average performance accross all channels.
|
||||||
|
"""
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
description='Send a full spectrum load through the network from point A to point B',
|
description='Send a full spectrum load through the network from point A to point B',
|
||||||
epilog=_help_footer,
|
epilog=_help_footer,
|
||||||
@@ -144,19 +143,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 = bool(source)
|
||||||
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 = bool(destination)
|
||||||
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,109 +170,77 @@ 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)
|
|
||||||
if args.power:
|
|
||||||
trx_params['power'] = db2lin(float(args.power)) * 1e-3
|
|
||||||
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:
|
|
||||||
|
# Simulate !
|
||||||
try:
|
try:
|
||||||
add_missing_elements_in_network(network, equipment)
|
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:
|
||||||
path = compute_constrained_path(network, req)
|
print(f'Service error: {e}')
|
||||||
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:
|
|
||||||
design_network(ref_req, network, equipment, set_connector_losses=True, verbose=True)
|
|
||||||
except exceptions.NetworkTopologyError as 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 ValueError:
|
||||||
print(f'{ansi_escapes.red}Configuration error:{ansi_escapes.reset} {e}')
|
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
# print or export results
|
||||||
|
spans = [s.params.length for s in path if isinstance(s, (Fiber, RamanFiber))]
|
||||||
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 mypath, 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 mypath:
|
||||||
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('\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}')
|
||||||
else:
|
else:
|
||||||
print(path[-1])
|
print(mypath[-1])
|
||||||
|
|
||||||
if args.save_network is not None:
|
if args.save_network is not None:
|
||||||
save_network(network, args.save_network)
|
save_network(network, args.save_network)
|
||||||
@@ -323,6 +288,9 @@ def _path_result_json(pathresult):
|
|||||||
|
|
||||||
|
|
||||||
def path_requests_run(args=None):
|
def path_requests_run(args=None):
|
||||||
|
"""Main script running several services simulations. It returns a summary of the average performance
|
||||||
|
for each service.
|
||||||
|
"""
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
description='Compute performance for a list of services provided in a json file or an excel sheet',
|
description='Compute performance for a list of services provided in a json file or an excel sheet',
|
||||||
epilog=_help_footer,
|
epilog=_help_footer,
|
||||||
@@ -336,109 +304,48 @@ 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
|
|
||||||
# spacing, f_min and f_max
|
|
||||||
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)
|
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
trx_params = trx_mode_params(equipment)
|
|
||||||
params.update(trx_params)
|
|
||||||
reference_channel = PathRequest(**params)
|
|
||||||
try:
|
|
||||||
design_network(reference_channel, network, equipment, verbose=True)
|
|
||||||
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)
|
|
||||||
|
|
||||||
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:
|
try:
|
||||||
|
network, _, _ = designed_network(equipment, network, no_insert_edfas=args.no_insert_edfas)
|
||||||
data = load_requests(args.service_filename, equipment, bidir=args.bidir,
|
data = load_requests(args.service_filename, equipment, bidir=args.bidir,
|
||||||
network=network, network_filename=args.topology)
|
network=network, network_filename=args.topology)
|
||||||
rqs = requests_from_json(data, equipment)
|
_data = requests_from_json(data, equipment)
|
||||||
except exceptions.ServiceError as e:
|
_, propagatedpths, reversed_propagatedpths, rqs, dsjn, result = \
|
||||||
print(f'{ansi_escapes.red}Service error:{ansi_escapes.reset} {e}')
|
planning(network, equipment, data, redesign=args.redesign_per_request)
|
||||||
|
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)
|
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'Service error: {e}')
|
||||||
|
sys.exit(1)
|
||||||
|
except ValueError:
|
||||||
|
sys.exit(1)
|
||||||
|
print(f'{ansi_escapes.blue}List of disjunctions{ansi_escapes.reset}')
|
||||||
|
print(dsjn)
|
||||||
|
print(f'{ansi_escapes.blue}The following services have been requested:{ansi_escapes.reset}')
|
||||||
|
print(_data)
|
||||||
|
|
||||||
print(f'{ansi_escapes.blue}Propagating on selected path{ansi_escapes.reset}')
|
if args.save_network is not None:
|
||||||
propagatedpths, reversed_pths, reversed_propagatedpths = compute_path_with_disjunction(network, equipment, rqs, pths)
|
save_network(network, args.save_network)
|
||||||
# Note that deepcopy used in compute_path_with_disjunction returns
|
print(f'Network (after autodesign) saved to {args.save_network}')
|
||||||
# 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.
|
|
||||||
|
|
||||||
pth_assign_spectrum(pths, rqs, oms_list, reversed_pths)
|
|
||||||
|
|
||||||
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)',
|
||||||
@@ -459,12 +366,12 @@ def path_requests_run(args=None):
|
|||||||
try:
|
try:
|
||||||
if rqs[i].blocking_reason in BLOCKING_NOPATH:
|
if rqs[i].blocking_reason in BLOCKING_NOPATH:
|
||||||
line = [f'{rqs[i].request_id}', f' {rqs[i].source} to {rqs[i].destination} :',
|
line = [f'{rqs[i].request_id}', f' {rqs[i].source} to {rqs[i].destination} :',
|
||||||
f'-', f'-', f'-', f'{rqs[i].tsp_mode}', f'{round(rqs[i].path_bandwidth * 1e-9,2)}',
|
'-', '-', '-', f'{rqs[i].tsp_mode}', f'{round(rqs[i].path_bandwidth * 1e-9, 2)}',
|
||||||
f'-', f'{rqs[i].blocking_reason}']
|
'-', '{rqs[i].blocking_reason}']
|
||||||
else:
|
else:
|
||||||
line = [f'{rqs[i].request_id}', f' {rqs[i].source} to {rqs[i].destination} : ', psnrb,
|
line = [f'{rqs[i].request_id}', f' {rqs[i].source} to {rqs[i].destination} : ', psnrb,
|
||||||
psnr, f'-', f'{rqs[i].tsp_mode}', f'{round(rqs[i].path_bandwidth * 1e-9, 2)}',
|
psnr, '-', f'{rqs[i].tsp_mode}', f'{round(rqs[i].path_bandwidth * 1e-9, 2)}',
|
||||||
f'-', f'{rqs[i].blocking_reason}']
|
'-', f'{rqs[i].blocking_reason}']
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
line = [f'{rqs[i].request_id}', f' {rqs[i].source} to {rqs[i].destination} : ', psnrb,
|
line = [f'{rqs[i].request_id}', f' {rqs[i].source} to {rqs[i].destination} : ', psnrb,
|
||||||
psnr, f'{rqs[i].OSNR + equipment["SI"]["default"].sys_margins}',
|
psnr, f'{rqs[i].OSNR + equipment["SI"]["default"].sys_margins}',
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ In the "Links" sheet, only the first three columns ("Node A", "Node Z" and
|
|||||||
the "east" information so that it is possible to input undirected data.
|
the "east" information so that it is possible to input undirected data.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from xlrd import open_workbook
|
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
from argparse import ArgumentParser
|
from argparse import ArgumentParser
|
||||||
from collections import namedtuple, Counter, defaultdict
|
from collections import namedtuple, Counter, defaultdict
|
||||||
@@ -28,8 +27,12 @@ from itertools import chain
|
|||||||
from json import dumps
|
from json import dumps
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from copy import copy
|
from copy import copy
|
||||||
|
from typing import Dict, List, Tuple, DefaultDict
|
||||||
|
from xlrd import open_workbook
|
||||||
|
from xlrd.biffh import XLRDError
|
||||||
|
from networkx import DiGraph
|
||||||
|
|
||||||
from gnpy.core.utils import silent_remove
|
from gnpy.core.utils import silent_remove, transform_data
|
||||||
from gnpy.core.exceptions import NetworkTopologyError
|
from gnpy.core.exceptions import NetworkTopologyError
|
||||||
from gnpy.core.elements import Edfa, Fused, Fiber
|
from gnpy.core.elements import Edfa, Fused, Fiber
|
||||||
|
|
||||||
@@ -38,12 +41,16 @@ _logger = getLogger(__name__)
|
|||||||
|
|
||||||
|
|
||||||
def all_rows(sh, start=0):
|
def all_rows(sh, start=0):
|
||||||
|
"""Returns all rows of the xls(x) sheet starting from start row
|
||||||
|
"""
|
||||||
return (sh.row(x) for x in range(start, sh.nrows))
|
return (sh.row(x) for x in range(start, sh.nrows))
|
||||||
|
|
||||||
|
|
||||||
class Node(object):
|
class Node:
|
||||||
|
"""Node data class
|
||||||
|
"""
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
super(Node, self).__init__()
|
super().__init__()
|
||||||
self.update_attr(kwargs)
|
self.update_attr(kwargs)
|
||||||
|
|
||||||
def update_attr(self, kwargs):
|
def update_attr(self, kwargs):
|
||||||
@@ -65,13 +72,13 @@ class Node(object):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class Link(object):
|
class Link:
|
||||||
"""attribtes from west parse_ept_headers dict
|
"""attribtes from west parse_ept_headers dict
|
||||||
+node_a, node_z, west_fiber_con_in, east_fiber_con_in
|
+node_a, node_z, west_fiber_con_in, east_fiber_con_in
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
super(Link, self).__init__()
|
super().__init__()
|
||||||
self.update_attr(kwargs)
|
self.update_attr(kwargs)
|
||||||
self.distance_units = 'km'
|
self.distance_units = 'km'
|
||||||
|
|
||||||
@@ -80,7 +87,7 @@ class Link(object):
|
|||||||
for k, v in self.default_values.items():
|
for k, v in self.default_values.items():
|
||||||
v = clean_kwargs.get(k, v)
|
v = clean_kwargs.get(k, v)
|
||||||
setattr(self, k, v)
|
setattr(self, k, v)
|
||||||
k = 'west' + k.split('east')[-1]
|
k = 'west' + k.rsplit('east', maxsplit=1)[-1]
|
||||||
v = clean_kwargs.get(k, v)
|
v = clean_kwargs.get(k, v)
|
||||||
setattr(self, k, v)
|
setattr(self, k, v)
|
||||||
|
|
||||||
@@ -101,9 +108,11 @@ class Link(object):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class Eqpt(object):
|
class Eqpt:
|
||||||
|
"""
|
||||||
|
"""
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
super(Eqpt, self).__init__()
|
super().__init__()
|
||||||
self.update_attr(kwargs)
|
self.update_attr(kwargs)
|
||||||
|
|
||||||
def update_attr(self, kwargs):
|
def update_attr(self, kwargs):
|
||||||
@@ -111,7 +120,7 @@ class Eqpt(object):
|
|||||||
for k, v in self.default_values.items():
|
for k, v in self.default_values.items():
|
||||||
v_east = clean_kwargs.get(k, v)
|
v_east = clean_kwargs.get(k, v)
|
||||||
setattr(self, k, v_east)
|
setattr(self, k, v_east)
|
||||||
k = 'west' + k.split('east')[-1]
|
k = 'west' + k.rsplit('east', maxsplit=1)[-1]
|
||||||
v_west = clean_kwargs.get(k, v)
|
v_west = clean_kwargs.get(k, v)
|
||||||
setattr(self, k, v_west)
|
setattr(self, k, v_west)
|
||||||
|
|
||||||
@@ -119,17 +128,18 @@ class Eqpt(object):
|
|||||||
'from_city': '',
|
'from_city': '',
|
||||||
'to_city': '',
|
'to_city': '',
|
||||||
'east_amp_type': '',
|
'east_amp_type': '',
|
||||||
'east_att_in': 0,
|
|
||||||
'east_amp_gain': None,
|
'east_amp_gain': None,
|
||||||
'east_amp_dp': None,
|
'east_amp_dp': None,
|
||||||
'east_tilt': 0,
|
'east_tilt_vs_wavelength': None,
|
||||||
'east_att_out': None
|
'east_att_out': None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class Roadm(object):
|
class Roadm:
|
||||||
|
"""
|
||||||
|
"""
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
super(Roadm, self).__init__()
|
super().__init__()
|
||||||
self.update_attr(kwargs)
|
self.update_attr(kwargs)
|
||||||
|
|
||||||
def update_attr(self, kwargs):
|
def update_attr(self, kwargs):
|
||||||
@@ -140,7 +150,10 @@ class Roadm(object):
|
|||||||
|
|
||||||
default_values = {'from_node': '',
|
default_values = {'from_node': '',
|
||||||
'to_node': '',
|
'to_node': '',
|
||||||
'target_pch_out_db': None
|
'target_pch_out_db': None,
|
||||||
|
'type_variety': None,
|
||||||
|
'from_degrees': None,
|
||||||
|
'impairment_ids': None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -153,7 +166,7 @@ def read_header(my_sheet, line, slice_):
|
|||||||
try:
|
try:
|
||||||
header = [x.value.strip() for x in my_sheet.row_slice(line, slice_[0], slice_[1])]
|
header = [x.value.strip() for x in my_sheet.row_slice(line, slice_[0], slice_[1])]
|
||||||
header_i = [Param_header(header, i + slice_[0]) for i, header in enumerate(header) if header != '']
|
header_i = [Param_header(header, i + slice_[0]) for i, header in enumerate(header) if header != '']
|
||||||
except Exception:
|
except (AttributeError, IndexError):
|
||||||
header_i = []
|
header_i = []
|
||||||
if header_i != [] and header_i[-1].colindex != slice_[1]:
|
if header_i != [] and header_i[-1].colindex != slice_[1]:
|
||||||
header_i.append(Param_header('', slice_[1]))
|
header_i.append(Param_header('', slice_[1]))
|
||||||
@@ -169,7 +182,7 @@ def read_slice(my_sheet, line, slice_, header):
|
|||||||
try:
|
try:
|
||||||
slice_range = next((h.colindex, header_i[i + 1].colindex)
|
slice_range = next((h.colindex, header_i[i + 1].colindex)
|
||||||
for i, h in enumerate(header_i) if header in h.header)
|
for i, h in enumerate(header_i) if header in h.header)
|
||||||
except Exception:
|
except StopIteration:
|
||||||
pass
|
pass
|
||||||
return slice_range
|
return slice_range
|
||||||
|
|
||||||
@@ -190,7 +203,6 @@ def parse_headers(my_sheet, input_headers_dict, headers, start_line, slice_in):
|
|||||||
msg = f'missing header {h0}'
|
msg = f'missing header {h0}'
|
||||||
if h0 in ('east', 'Node A', 'Node Z', 'City'):
|
if h0 in ('east', 'Node A', 'Node Z', 'City'):
|
||||||
raise NetworkTopologyError(msg)
|
raise NetworkTopologyError(msg)
|
||||||
else:
|
|
||||||
_logger.warning(msg)
|
_logger.warning(msg)
|
||||||
elif not isinstance(input_headers_dict[h0], dict):
|
elif not isinstance(input_headers_dict[h0], dict):
|
||||||
headers[slice_out[0]] = input_headers_dict[h0]
|
headers[slice_out[0]] = input_headers_dict[h0]
|
||||||
@@ -203,22 +215,33 @@ def parse_headers(my_sheet, input_headers_dict, headers, start_line, slice_in):
|
|||||||
|
|
||||||
|
|
||||||
def parse_row(row, headers):
|
def parse_row(row, headers):
|
||||||
|
"""
|
||||||
|
"""
|
||||||
return {f: r.value for f, r in
|
return {f: r.value for f, r in
|
||||||
zip([label for label in headers.values()], [row[i] for i in headers])}
|
zip(list(headers.values()), [row[i] for i in headers])}
|
||||||
|
|
||||||
|
|
||||||
def parse_sheet(my_sheet, input_headers_dict, header_line, start_line, column):
|
def parse_sheet(my_sheet, input_headers_dict, header_line, start_line, column):
|
||||||
|
"""
|
||||||
|
"""
|
||||||
headers = parse_headers(my_sheet, input_headers_dict, {}, header_line, (0, column))
|
headers = parse_headers(my_sheet, input_headers_dict, {}, header_line, (0, column))
|
||||||
for row in all_rows(my_sheet, start=start_line):
|
for row in all_rows(my_sheet, start=start_line):
|
||||||
yield parse_row(row[0: column], headers)
|
yield parse_row(row[0: column], headers)
|
||||||
|
|
||||||
|
|
||||||
def _format_items(items):
|
def _format_items(items: List[str]):
|
||||||
|
"""formating utils
|
||||||
|
"""
|
||||||
return '\n'.join(f' - {item}' for item in items)
|
return '\n'.join(f' - {item}' for item in items)
|
||||||
|
|
||||||
|
|
||||||
def sanity_check(nodes, links, nodes_by_city, links_by_city, eqpts_by_city):
|
def sanity_check(nodes: List[Node], links: List[Link],
|
||||||
|
nodes_by_city: Dict[str, Node], links_by_city: DefaultDict[str, List[Link]],
|
||||||
|
eqpts_by_city: DefaultDict[str, List[Eqpt]]) -> Tuple[List[Node], List[Link]]:
|
||||||
|
"""Raise correct issues if xls(x) is not correct, Correct type to ROADM if more tha 2-degrees
|
||||||
|
checks duplicate links, unreferenced nodes in links, in eqpts, unreferenced link in eqpts,
|
||||||
|
duplicate items
|
||||||
|
"""
|
||||||
duplicate_links = []
|
duplicate_links = []
|
||||||
for l1 in links:
|
for l1 in links:
|
||||||
for l2 in links:
|
for l2 in links:
|
||||||
@@ -227,6 +250,7 @@ def sanity_check(nodes, links, nodes_by_city, links_by_city, eqpts_by_city):
|
|||||||
link {l1.from_city}-{l1.to_city} is duplicate \
|
link {l1.from_city}-{l1.to_city} is duplicate \
|
||||||
\nthe 1st duplicate link will be removed but you should check Links sheet input')
|
\nthe 1st duplicate link will be removed but you should check Links sheet input')
|
||||||
duplicate_links.append(l1)
|
duplicate_links.append(l1)
|
||||||
|
|
||||||
if duplicate_links:
|
if duplicate_links:
|
||||||
msg = 'XLS error: ' \
|
msg = 'XLS error: ' \
|
||||||
+ f'links {_format_items([(d.from_city, d.to_city) for d in duplicate_links])} are duplicate'
|
+ f'links {_format_items([(d.from_city, d.to_city) for d in duplicate_links])} are duplicate'
|
||||||
@@ -315,13 +339,29 @@ def create_roadm_element(node, roadms_by_city):
|
|||||||
'booster_variety_list': silent_remove(node.booster_restriction.split(' | '), '')}
|
'booster_variety_list': silent_remove(node.booster_restriction.split(' | '), '')}
|
||||||
}
|
}
|
||||||
if node.city in roadms_by_city.keys():
|
if node.city in roadms_by_city.keys():
|
||||||
if 'params' not in roadm.keys():
|
if 'params' not in roadm:
|
||||||
roadm['params'] = {}
|
roadm['params'] = {}
|
||||||
roadm['params']['per_degree_pch_out_db'] = {}
|
roadm['params']['per_degree_pch_out_db'] = {}
|
||||||
for elem in roadms_by_city[node.city]:
|
for elem in roadms_by_city[node.city]:
|
||||||
to_node = f'east edfa in {node.city} to {elem.to_node}'
|
to_node = f'east edfa in {node.city} to {elem.to_node}'
|
||||||
if elem.target_pch_out_db is not None:
|
if elem.target_pch_out_db is not None:
|
||||||
roadm['params']['per_degree_pch_out_db'][to_node] = elem.target_pch_out_db
|
roadm['params']['per_degree_pch_out_db'][to_node] = elem.target_pch_out_db
|
||||||
|
if elem.from_degrees is not None and elem.impairment_ids is not None:
|
||||||
|
# only set per degree impairment if there is an entry (reduce verbose)
|
||||||
|
if roadm['params'].get('per_degree_impairments') is None:
|
||||||
|
roadm['params']['per_degree_impairments'] = []
|
||||||
|
fromdegrees = elem.from_degrees.split(' | ')
|
||||||
|
impairment_ids = transform_data(elem.impairment_ids)
|
||||||
|
if len(fromdegrees) != len(impairment_ids):
|
||||||
|
msg = f'Roadm {node.city} per degree impairment id do not match with from degree definition'
|
||||||
|
raise NetworkTopologyError(msg)
|
||||||
|
for from_degree, impairment_id in zip(fromdegrees, impairment_ids):
|
||||||
|
from_node = f'west edfa in {node.city} to {from_degree}'
|
||||||
|
roadm['params']['per_degree_impairments'].append({'from_degree': from_node,
|
||||||
|
'to_degree': to_node,
|
||||||
|
'impairment_id': impairment_id})
|
||||||
|
if elem.type_variety is not None:
|
||||||
|
roadm['type_variety'] = elem.type_variety
|
||||||
roadm['metadata'] = {'location': {'city': node.city,
|
roadm['metadata'] = {'location': {'city': node.city,
|
||||||
'region': node.region,
|
'region': node.region,
|
||||||
'latitude': node.latitude,
|
'latitude': node.latitude,
|
||||||
@@ -330,7 +370,7 @@ def create_roadm_element(node, roadms_by_city):
|
|||||||
return roadm
|
return roadm
|
||||||
|
|
||||||
|
|
||||||
def create_east_eqpt_element(node):
|
def create_east_eqpt_element(node: Node, nodes_by_city: Dict[str, Node]) -> dict:
|
||||||
""" create amplifiers json elements for the east direction.
|
""" create amplifiers json elements for the east direction.
|
||||||
this includes the case where the case of a fused element defined instead of an
|
this includes the case where the case of a fused element defined instead of an
|
||||||
ILA in eqpt sheet
|
ILA in eqpt sheet
|
||||||
@@ -345,13 +385,13 @@ def create_east_eqpt_element(node):
|
|||||||
eqpt['type_variety'] = f'{node.east_amp_type}'
|
eqpt['type_variety'] = f'{node.east_amp_type}'
|
||||||
eqpt['operational'] = {'gain_target': node.east_amp_gain,
|
eqpt['operational'] = {'gain_target': node.east_amp_gain,
|
||||||
'delta_p': node.east_amp_dp,
|
'delta_p': node.east_amp_dp,
|
||||||
'tilt_target': node.east_tilt,
|
'tilt_target': node.east_tilt_vs_wavelength,
|
||||||
'out_voa': node.east_att_out}
|
'out_voa': node.east_att_out}
|
||||||
elif node.east_amp_type.lower() == '':
|
elif node.east_amp_type.lower() == '':
|
||||||
eqpt['type'] = 'Edfa'
|
eqpt['type'] = 'Edfa'
|
||||||
eqpt['operational'] = {'gain_target': node.east_amp_gain,
|
eqpt['operational'] = {'gain_target': node.east_amp_gain,
|
||||||
'delta_p': node.east_amp_dp,
|
'delta_p': node.east_amp_dp,
|
||||||
'tilt_target': node.east_tilt,
|
'tilt_target': node.east_tilt_vs_wavelength,
|
||||||
'out_voa': node.east_att_out}
|
'out_voa': node.east_att_out}
|
||||||
elif node.east_amp_type.lower() == 'fused':
|
elif node.east_amp_type.lower() == 'fused':
|
||||||
# fused edfa variety is a hack to indicate that there should not be
|
# fused edfa variety is a hack to indicate that there should not be
|
||||||
@@ -363,7 +403,7 @@ def create_east_eqpt_element(node):
|
|||||||
return eqpt
|
return eqpt
|
||||||
|
|
||||||
|
|
||||||
def create_west_eqpt_element(node):
|
def create_west_eqpt_element(node: Node, nodes_by_city: Dict[str, Node]) -> dict:
|
||||||
""" create amplifiers json elements for the west direction.
|
""" create amplifiers json elements for the west direction.
|
||||||
this includes the case where the case of a fused element defined instead of an
|
this includes the case where the case of a fused element defined instead of an
|
||||||
ILA in eqpt sheet
|
ILA in eqpt sheet
|
||||||
@@ -378,19 +418,25 @@ def create_west_eqpt_element(node):
|
|||||||
eqpt['type_variety'] = f'{node.west_amp_type}'
|
eqpt['type_variety'] = f'{node.west_amp_type}'
|
||||||
eqpt['operational'] = {'gain_target': node.west_amp_gain,
|
eqpt['operational'] = {'gain_target': node.west_amp_gain,
|
||||||
'delta_p': node.west_amp_dp,
|
'delta_p': node.west_amp_dp,
|
||||||
'tilt_target': node.west_tilt,
|
'tilt_target': node.west_tilt_vs_wavelength,
|
||||||
'out_voa': node.west_att_out}
|
'out_voa': node.west_att_out}
|
||||||
elif node.west_amp_type.lower() == '':
|
elif node.west_amp_type.lower() == '':
|
||||||
eqpt['operational'] = {'gain_target': node.west_amp_gain,
|
eqpt['operational'] = {'gain_target': node.west_amp_gain,
|
||||||
'delta_p': node.west_amp_dp,
|
'delta_p': node.west_amp_dp,
|
||||||
'tilt_target': node.west_tilt,
|
'tilt_target': node.west_tilt_vs_wavelength,
|
||||||
'out_voa': node.west_att_out}
|
'out_voa': node.west_att_out}
|
||||||
elif node.west_amp_type.lower() == 'fused':
|
elif node.west_amp_type.lower() == 'fused':
|
||||||
eqpt['type'] = 'Fused'
|
eqpt['type'] = 'Fused'
|
||||||
eqpt['params'] = {'loss': 0}
|
eqpt['params'] = {'loss': 0}
|
||||||
return eqpt
|
return eqpt
|
||||||
|
|
||||||
def xls_to_json_data(input_filename, filter_region=[]):
|
|
||||||
|
def xls_to_json_data(input_filename: Path, filter_region: List[str] = None) -> Dict:
|
||||||
|
"""Read the excel sheets and produces the json dict in GNPy format (legacy)
|
||||||
|
returns json dict
|
||||||
|
"""
|
||||||
|
if filter_region is None:
|
||||||
|
filter_region = []
|
||||||
nodes, links, eqpts, roadms = parse_excel(input_filename)
|
nodes, links, eqpts, roadms = parse_excel(input_filename)
|
||||||
if filter_region:
|
if filter_region:
|
||||||
nodes = [n for n in nodes if n.region.lower() in filter_region]
|
nodes = [n for n in nodes if n.region.lower() in filter_region]
|
||||||
@@ -400,16 +446,13 @@ def xls_to_json_data(input_filename, filter_region=[]):
|
|||||||
cities = {lnk.from_city for lnk in links} | {lnk.to_city for lnk in links}
|
cities = {lnk.from_city for lnk in links} | {lnk.to_city for lnk in links}
|
||||||
nodes = [n for n in nodes if n.city in cities]
|
nodes = [n for n in nodes if n.city in cities]
|
||||||
|
|
||||||
global nodes_by_city
|
|
||||||
nodes_by_city = {n.city: n for n in nodes}
|
nodes_by_city = {n.city: n for n in nodes}
|
||||||
|
|
||||||
global links_by_city
|
|
||||||
links_by_city = defaultdict(list)
|
links_by_city = defaultdict(list)
|
||||||
for link in links:
|
for link in links:
|
||||||
links_by_city[link.from_city].append(link)
|
links_by_city[link.from_city].append(link)
|
||||||
links_by_city[link.to_city].append(link)
|
links_by_city[link.to_city].append(link)
|
||||||
|
|
||||||
global eqpts_by_city
|
|
||||||
eqpts_by_city = defaultdict(list)
|
eqpts_by_city = defaultdict(list)
|
||||||
for eqpt in eqpts:
|
for eqpt in eqpts:
|
||||||
eqpts_by_city[eqpt.from_city].append(eqpt)
|
eqpts_by_city[eqpt.from_city].append(eqpt)
|
||||||
@@ -475,7 +518,7 @@ def xls_to_json_data(input_filename, filter_region=[]):
|
|||||||
'longitude': x.longitude}},
|
'longitude': x.longitude}},
|
||||||
'type': 'Edfa',
|
'type': 'Edfa',
|
||||||
'operational': {'gain_target': None,
|
'operational': {'gain_target': None,
|
||||||
'tilt_target': 0}
|
'tilt_target': None}
|
||||||
} for x in nodes_by_city.values() if x.node_type.lower() == 'ila' and x.city not in eqpts_by_city] +
|
} for x in nodes_by_city.values() if x.node_type.lower() == 'ila' and x.city not in eqpts_by_city] +
|
||||||
[{'uid': f'east edfa in {x.city}',
|
[{'uid': f'east edfa in {x.city}',
|
||||||
'metadata': {'location': {'city': x.city,
|
'metadata': {'location': {'city': x.city,
|
||||||
@@ -484,25 +527,26 @@ def xls_to_json_data(input_filename, filter_region=[]):
|
|||||||
'longitude': x.longitude}},
|
'longitude': x.longitude}},
|
||||||
'type': 'Edfa',
|
'type': 'Edfa',
|
||||||
'operational': {'gain_target': None,
|
'operational': {'gain_target': None,
|
||||||
'tilt_target': 0}
|
'tilt_target': None}
|
||||||
} for x in nodes_by_city.values() if x.node_type.lower() == 'ila' and x.city not in eqpts_by_city] +
|
} for x in nodes_by_city.values() if x.node_type.lower() == 'ila' and x.city not in eqpts_by_city]
|
||||||
[create_east_eqpt_element(e) for e in eqpts] +
|
+ [create_east_eqpt_element(e, nodes_by_city) for e in eqpts]
|
||||||
[create_west_eqpt_element(e) for e in eqpts],
|
+ [create_west_eqpt_element(e, nodes_by_city) for e in eqpts],
|
||||||
'connections':
|
'connections':
|
||||||
list(chain.from_iterable([eqpt_connection_by_city(n.city)
|
list(chain.from_iterable([eqpt_connection_by_city(n.city, eqpts_by_city, links_by_city, nodes_by_city)
|
||||||
for n in nodes]))
|
for n in nodes]))
|
||||||
+
|
+ list(chain.from_iterable(zip(
|
||||||
list(chain.from_iterable(zip(
|
[{'from_node': f'trx {x.city}', 'to_node': f'roadm {x.city}'}
|
||||||
[{'from_node': f'trx {x.city}',
|
|
||||||
'to_node': f'roadm {x.city}'}
|
|
||||||
for x in nodes_by_city.values() if x.node_type.lower() == 'roadm'],
|
for x in nodes_by_city.values() if x.node_type.lower() == 'roadm'],
|
||||||
[{'from_node': f'roadm {x.city}',
|
[{'from_node': f'roadm {x.city}', 'to_node': f'trx {x.city}'}
|
||||||
'to_node': f'trx {x.city}'}
|
|
||||||
for x in nodes_by_city.values() if x.node_type.lower() == 'roadm'])))
|
for x in nodes_by_city.values() if x.node_type.lower() == 'roadm'])))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def convert_file(input_filename, filter_region=[], output_json_file_name=None):
|
def convert_file(input_filename: Path, filter_region: List[str] = None, output_json_file_name: Path = None):
|
||||||
|
"""Save the conversion into
|
||||||
|
"""
|
||||||
|
if filter_region is None:
|
||||||
|
filter_region = []
|
||||||
data = xls_to_json_data(input_filename, filter_region)
|
data = xls_to_json_data(input_filename, filter_region)
|
||||||
if output_json_file_name is None:
|
if output_json_file_name is None:
|
||||||
output_json_file_name = input_filename.with_suffix('.json')
|
output_json_file_name = input_filename.with_suffix('.json')
|
||||||
@@ -512,79 +556,77 @@ def convert_file(input_filename, filter_region=[], output_json_file_name=None):
|
|||||||
return output_json_file_name
|
return output_json_file_name
|
||||||
|
|
||||||
|
|
||||||
def corresp_names(input_filename, network):
|
def corresp_names(input_filename: Path, network: DiGraph):
|
||||||
""" a function that builds the correspondance between names given in the excel,
|
""" a function that builds the correspondance between names given in the excel,
|
||||||
and names used in the json, and created by the autodesign.
|
and names used in the json, and created by the autodesign.
|
||||||
All names are listed
|
All names are listed
|
||||||
"""
|
"""
|
||||||
nodes, links, eqpts, roadms = parse_excel(input_filename)
|
nodes, links, eqpts, _ = parse_excel(input_filename)
|
||||||
fused = [n.uid for n in network.nodes() if isinstance(n, Fused)]
|
fused = [n.uid for n in network.nodes() if isinstance(n, Fused)]
|
||||||
ila = [n.uid for n in network.nodes() if isinstance(n, Edfa)]
|
ila = [n.uid for n in network.nodes() if isinstance(n, Edfa)]
|
||||||
|
|
||||||
corresp_roadm = {x.city: [f'roadm {x.city}'] for x in nodes
|
corresp_roadm = {x.city: [f'roadm {x.city}'] for x in nodes
|
||||||
if x.node_type.lower() == 'roadm'}
|
if x.node_type.lower() == 'roadm'}
|
||||||
corresp_fused = {x.city: [f'west fused spans in {x.city}', f'east fused spans in {x.city}']
|
corresp_fused = {x.city: [f'west fused spans in {x.city}', f'east fused spans in {x.city}']
|
||||||
for x in nodes if x.node_type.lower() == 'fused' and
|
for x in nodes if x.node_type.lower() == 'fused'
|
||||||
f'west fused spans in {x.city}' in fused and
|
and f'west fused spans in {x.city}' in fused
|
||||||
f'east fused spans in {x.city}' in fused}
|
and f'east fused spans in {x.city}' in fused}
|
||||||
|
corresp_ila = defaultdict(list)
|
||||||
# add the special cases when an ila is changed into a fused
|
# add the special cases when an ila is changed into a fused
|
||||||
for my_e in eqpts:
|
for my_e in eqpts:
|
||||||
name = f'east edfa in {my_e.from_city} to {my_e.to_city}'
|
name = f'east edfa in {my_e.from_city} to {my_e.to_city}'
|
||||||
if my_e.east_amp_type.lower() == 'fused' and name in fused:
|
if my_e.east_amp_type.lower() == 'fused' and name in fused:
|
||||||
if my_e.from_city in corresp_fused.keys():
|
corresp_fused.get(my_e.from_city, []).append(name)
|
||||||
corresp_fused[my_e.from_city].append(name)
|
|
||||||
else:
|
|
||||||
corresp_fused[my_e.from_city] = [name]
|
|
||||||
name = f'west edfa in {my_e.from_city} to {my_e.to_city}'
|
name = f'west edfa in {my_e.from_city} to {my_e.to_city}'
|
||||||
if my_e.west_amp_type.lower() == 'fused' and name in fused:
|
if my_e.west_amp_type.lower() == 'fused' and name in fused:
|
||||||
if my_e.from_city in corresp_fused.keys():
|
corresp_fused.get(my_e.from_city, []).append(name)
|
||||||
corresp_fused[my_e.from_city].append(name)
|
|
||||||
else:
|
|
||||||
corresp_fused[my_e.from_city] = [name]
|
|
||||||
# build corresp ila based on eqpt sheet
|
# build corresp ila based on eqpt sheet
|
||||||
# start with east direction
|
# start with east direction
|
||||||
corresp_ila = {e.from_city: [f'east edfa in {e.from_city} to {e.to_city}']
|
|
||||||
for e in eqpts if f'east edfa in {e.from_city} to {e.to_city}' in ila}
|
|
||||||
# west direction, append name or create a new item in dict
|
|
||||||
for my_e in eqpts:
|
for my_e in eqpts:
|
||||||
name = f'west edfa in {my_e.from_city} to {my_e.to_city}'
|
for name in [f'east edfa in {my_e.from_city} to {my_e.to_city}',
|
||||||
|
f'west edfa in {my_e.from_city} to {my_e.to_city}']:
|
||||||
if name in ila:
|
if name in ila:
|
||||||
if my_e.from_city in corresp_ila.keys():
|
|
||||||
corresp_ila[my_e.from_city].append(name)
|
corresp_ila[my_e.from_city].append(name)
|
||||||
else:
|
|
||||||
corresp_ila[my_e.from_city] = [name]
|
|
||||||
# complete with potential autodesign names: amplifiers
|
# complete with potential autodesign names: amplifiers
|
||||||
for my_l in links:
|
for my_l in links:
|
||||||
name = f'Edfa0_fiber ({my_l.to_city} \u2192 {my_l.from_city})-{my_l.west_cable}'
|
# create names whatever the type and filter them out
|
||||||
|
# from-to direction
|
||||||
|
names = [f'Edfa_preamp_roadm {my_l.from_city}_from_fiber ({my_l.to_city} \u2192 {my_l.from_city})-{my_l.west_cable}',
|
||||||
|
f'Edfa_booster_roadm {my_l.from_city}_to_fiber ({my_l.from_city} \u2192 {my_l.to_city})-{my_l.east_cable}']
|
||||||
|
for name in names:
|
||||||
if name in ila:
|
if name in ila:
|
||||||
if my_l.from_city in corresp_ila.keys():
|
|
||||||
# "east edfa in Stbrieuc to Rennes_STA" is equivalent name as
|
# "east edfa in Stbrieuc to Rennes_STA" is equivalent name as
|
||||||
# "Edfa0_fiber (Lannion_CAS → Stbrieuc)-F056"
|
# "Edfa_booster_roadm Stbrieuc_to_fiber (Lannion_CAS → Stbrieuc)-F056"
|
||||||
# "west edfa in Stbrieuc to Rennes_STA" is equivalent name as
|
# "west edfa in Stbrieuc to Rennes_STA" is equivalent name as
|
||||||
# "Edfa0_fiber (Rennes_STA → Stbrieuc)-F057"
|
# "Edfa_preamp_roadm Stbrieuc_to_fiber (Rennes_STA → Stbrieuc)-F057"
|
||||||
# does not filter names: all types (except boosters) are created.
|
# in case fibers are splitted the name here is a
|
||||||
# in case fibers are splitted the name here is a prefix
|
|
||||||
corresp_ila[my_l.from_city].append(name)
|
corresp_ila[my_l.from_city].append(name)
|
||||||
else:
|
# to-from direction
|
||||||
corresp_ila[my_l.from_city] = [name]
|
names = [f'Edfa_preamp_roadm {my_l.to_city}_from_fiber ({my_l.from_city} \u2192 {my_l.to_city})-{my_l.east_cable}',
|
||||||
name = f'Edfa0_fiber ({my_l.from_city} \u2192 {my_l.to_city})-{my_l.east_cable}'
|
f'Edfa_booster_roadm {my_l.to_city}_to_fiber ({my_l.to_city} \u2192 {my_l.from_city})-{my_l.west_cable}']
|
||||||
|
for name in names:
|
||||||
if name in ila:
|
if name in ila:
|
||||||
if my_l.to_city in corresp_ila.keys():
|
|
||||||
corresp_ila[my_l.to_city].append(name)
|
corresp_ila[my_l.to_city].append(name)
|
||||||
else:
|
for node in nodes:
|
||||||
corresp_ila[my_l.to_city] = [name]
|
names = [f'east edfa in {node.city}', f'west edfa in {node.city}']
|
||||||
|
for name in names:
|
||||||
|
if name in ila:
|
||||||
|
# "east edfa in Stbrieuc to Rennes_STA" (created with Eqpt) is equivalent name as
|
||||||
|
# "east edfa in Stbrieuc" or "west edfa in Stbrieuc" (created with Links sheet)
|
||||||
|
# depending on link node order
|
||||||
|
corresp_ila[node.city].append(name)
|
||||||
|
|
||||||
# merge fused with ila:
|
# merge fused with ila:
|
||||||
for key, val in corresp_fused.items():
|
for key, val in corresp_fused.items():
|
||||||
if key in corresp_ila.keys():
|
|
||||||
corresp_ila[key].extend(val)
|
corresp_ila[key].extend(val)
|
||||||
else:
|
|
||||||
corresp_ila[key] = val
|
|
||||||
# no need of roadm booster
|
# no need of roadm booster
|
||||||
return corresp_roadm, corresp_fused, corresp_ila
|
return corresp_roadm, corresp_fused, corresp_ila
|
||||||
|
|
||||||
|
|
||||||
def parse_excel(input_filename):
|
def parse_excel(input_filename: Path) -> Tuple[List[Node], List[Link], List[Eqpt], List[Roadm]]:
|
||||||
|
"""reads xls(x) sheets among Nodes, Eqpts, Links, Roadms and parse the data in the sheets
|
||||||
|
into internal data structure Node, Link, Eqpt, Roadm, classes
|
||||||
|
"""
|
||||||
link_headers = {
|
link_headers = {
|
||||||
'Node A': 'from_city',
|
'Node A': 'from_city',
|
||||||
'Node Z': 'to_city',
|
'Node Z': 'to_city',
|
||||||
@@ -623,7 +665,6 @@ def parse_excel(input_filename):
|
|||||||
'Node Z': 'to_city',
|
'Node Z': 'to_city',
|
||||||
'east': {
|
'east': {
|
||||||
'amp type': 'east_amp_type',
|
'amp type': 'east_amp_type',
|
||||||
'att_in': 'east_att_in',
|
|
||||||
'amp gain': 'east_amp_gain',
|
'amp gain': 'east_amp_gain',
|
||||||
'delta p': 'east_amp_dp',
|
'delta p': 'east_amp_dp',
|
||||||
'tilt': 'east_tilt',
|
'tilt': 'east_tilt',
|
||||||
@@ -631,7 +672,6 @@ def parse_excel(input_filename):
|
|||||||
},
|
},
|
||||||
'west': {
|
'west': {
|
||||||
'amp type': 'west_amp_type',
|
'amp type': 'west_amp_type',
|
||||||
'att_in': 'west_att_in',
|
|
||||||
'amp gain': 'west_amp_gain',
|
'amp gain': 'west_amp_gain',
|
||||||
'delta p': 'west_amp_dp',
|
'delta p': 'west_amp_dp',
|
||||||
'tilt': 'west_tilt',
|
'tilt': 'west_tilt',
|
||||||
@@ -640,7 +680,10 @@ def parse_excel(input_filename):
|
|||||||
}
|
}
|
||||||
roadm_headers = {'Node A': 'from_node',
|
roadm_headers = {'Node A': 'from_node',
|
||||||
'Node Z': 'to_node',
|
'Node Z': 'to_node',
|
||||||
'per degree target power (dBm)': 'target_pch_out_db'
|
'per degree target power (dBm)': 'target_pch_out_db',
|
||||||
|
'type_variety': 'type_variety',
|
||||||
|
'from degrees': 'from_degrees',
|
||||||
|
'from degree to degree impairment id': 'impairment_ids'
|
||||||
}
|
}
|
||||||
|
|
||||||
with open_workbook(input_filename) as wb:
|
with open_workbook(input_filename) as wb:
|
||||||
@@ -648,36 +691,32 @@ def parse_excel(input_filename):
|
|||||||
links_sheet = wb.sheet_by_name('Links')
|
links_sheet = wb.sheet_by_name('Links')
|
||||||
try:
|
try:
|
||||||
eqpt_sheet = wb.sheet_by_name('Eqpt')
|
eqpt_sheet = wb.sheet_by_name('Eqpt')
|
||||||
except Exception:
|
except XLRDError:
|
||||||
# eqpt_sheet is optional
|
# eqpt_sheet is optional
|
||||||
eqpt_sheet = None
|
eqpt_sheet = None
|
||||||
try:
|
try:
|
||||||
roadm_sheet = wb.sheet_by_name('Roadms')
|
roadm_sheet = wb.sheet_by_name('Roadms')
|
||||||
except Exception:
|
except XLRDError:
|
||||||
# roadm_sheet is optional
|
# roadm_sheet is optional
|
||||||
roadm_sheet = None
|
roadm_sheet = None
|
||||||
|
|
||||||
nodes = []
|
nodes = [Node(**node) for node in parse_sheet(nodes_sheet, node_headers,
|
||||||
for node in parse_sheet(nodes_sheet, node_headers, NODES_LINE, NODES_LINE + 1, NODES_COLUMN):
|
NODES_LINE, NODES_LINE + 1, NODES_COLUMN)]
|
||||||
nodes.append(Node(**node))
|
|
||||||
expected_node_types = {'ROADM', 'ILA', 'FUSED'}
|
expected_node_types = {'ROADM', 'ILA', 'FUSED'}
|
||||||
for n in nodes:
|
for n in nodes:
|
||||||
if n.node_type not in expected_node_types:
|
if n.node_type not in expected_node_types:
|
||||||
n.node_type = 'ILA'
|
n.node_type = 'ILA'
|
||||||
|
|
||||||
links = []
|
links = [Link(**link) for link in parse_sheet(links_sheet, link_headers,
|
||||||
for link in parse_sheet(links_sheet, link_headers, LINKS_LINE, LINKS_LINE + 2, LINKS_COLUMN):
|
LINKS_LINE, LINKS_LINE + 2, LINKS_COLUMN)]
|
||||||
links.append(Link(**link))
|
|
||||||
|
|
||||||
eqpts = []
|
eqpts = []
|
||||||
if eqpt_sheet is not None:
|
if eqpt_sheet is not None:
|
||||||
for eqpt in parse_sheet(eqpt_sheet, eqpt_headers, EQPTS_LINE, EQPTS_LINE + 2, EQPTS_COLUMN):
|
eqpts = [Eqpt(**eqpt) for eqpt in parse_sheet(eqpt_sheet, eqpt_headers,
|
||||||
eqpts.append(Eqpt(**eqpt))
|
EQPTS_LINE, EQPTS_LINE + 2, EQPTS_COLUMN)]
|
||||||
|
|
||||||
roadms = []
|
roadms = []
|
||||||
if roadm_sheet is not None:
|
if roadm_sheet is not None:
|
||||||
for roadm in parse_sheet(roadm_sheet, roadm_headers, ROADMS_LINE, ROADMS_LINE+2, ROADMS_COLUMN):
|
roadms = [Roadm(**roadm) for roadm in parse_sheet(roadm_sheet, roadm_headers,
|
||||||
roadms.append(Roadm(**roadm))
|
ROADMS_LINE, ROADMS_LINE + 2, ROADMS_COLUMN)]
|
||||||
|
|
||||||
# sanity check
|
# sanity check
|
||||||
all_cities = Counter(n.city for n in nodes)
|
all_cities = Counter(n.city for n in nodes)
|
||||||
@@ -699,32 +738,37 @@ def parse_excel(input_filename):
|
|||||||
return nodes, links, eqpts, roadms
|
return nodes, links, eqpts, roadms
|
||||||
|
|
||||||
|
|
||||||
def eqpt_connection_by_city(city_name):
|
def eqpt_connection_by_city(city_name: str, eqpts_by_city: DefaultDict[str, List[Eqpt]],
|
||||||
other_cities = fiber_dest_from_source(city_name)
|
links_by_city: DefaultDict[str, List[Link]], nodes_by_city: Dict[str, Node]) -> list:
|
||||||
|
"""
|
||||||
|
"""
|
||||||
|
other_cities = fiber_dest_from_source(city_name, links_by_city)
|
||||||
subdata = []
|
subdata = []
|
||||||
if nodes_by_city[city_name].node_type.lower() in {'ila', 'fused'}:
|
if nodes_by_city[city_name].node_type.lower() in {'ila', 'fused'}:
|
||||||
# Then len(other_cities) == 2
|
# Then len(other_cities) == 2
|
||||||
direction = ['west', 'east']
|
direction = ['west', 'east']
|
||||||
for i in range(2):
|
for i in range(2):
|
||||||
from_ = fiber_link(other_cities[i], city_name)
|
from_ = fiber_link(other_cities[i], city_name, links_by_city)
|
||||||
in_ = eqpt_in_city_to_city(city_name, other_cities[0], direction[i])
|
in_ = eqpt_in_city_to_city(city_name, other_cities[0], eqpts_by_city, nodes_by_city, direction[i])
|
||||||
to_ = fiber_link(city_name, other_cities[1 - i])
|
to_ = fiber_link(city_name, other_cities[1 - i], links_by_city)
|
||||||
subdata += connect_eqpt(from_, in_, to_)
|
subdata += connect_eqpt(from_, in_, to_)
|
||||||
elif nodes_by_city[city_name].node_type.lower() == 'roadm':
|
elif nodes_by_city[city_name].node_type.lower() == 'roadm':
|
||||||
for other_city in other_cities:
|
for other_city in other_cities:
|
||||||
from_ = f'roadm {city_name}'
|
from_ = f'roadm {city_name}'
|
||||||
in_ = eqpt_in_city_to_city(city_name, other_city)
|
in_ = eqpt_in_city_to_city(city_name, other_city, eqpts_by_city, nodes_by_city)
|
||||||
to_ = fiber_link(city_name, other_city)
|
to_ = fiber_link(city_name, other_city, links_by_city)
|
||||||
subdata += connect_eqpt(from_, in_, to_)
|
subdata += connect_eqpt(from_, in_, to_)
|
||||||
|
|
||||||
from_ = fiber_link(other_city, city_name)
|
from_ = fiber_link(other_city, city_name, links_by_city)
|
||||||
in_ = eqpt_in_city_to_city(city_name, other_city, "west")
|
in_ = eqpt_in_city_to_city(city_name, other_city, eqpts_by_city, nodes_by_city, "west")
|
||||||
to_ = f'roadm {city_name}'
|
to_ = f'roadm {city_name}'
|
||||||
subdata += connect_eqpt(from_, in_, to_)
|
subdata += connect_eqpt(from_, in_, to_)
|
||||||
return subdata
|
return subdata
|
||||||
|
|
||||||
|
|
||||||
def connect_eqpt(from_, in_, to_):
|
def connect_eqpt(from_: str, in_: str, to_: str) -> List[dict]:
|
||||||
|
"""Utils: create the topology connection json dict between in and to
|
||||||
|
"""
|
||||||
connections = []
|
connections = []
|
||||||
if in_ != '':
|
if in_ != '':
|
||||||
connections = [{'from_node': from_, 'to_node': in_},
|
connections = [{'from_node': from_, 'to_node': in_},
|
||||||
@@ -734,7 +778,11 @@ def connect_eqpt(from_, in_, to_):
|
|||||||
return connections
|
return connections
|
||||||
|
|
||||||
|
|
||||||
def eqpt_in_city_to_city(in_city, to_city, direction='east'):
|
def eqpt_in_city_to_city(in_city: str, to_city: str,
|
||||||
|
eqpts_by_city: DefaultDict[str, List[Eqpt]], nodes_by_city: Dict[str, Node],
|
||||||
|
direction: str = 'east') -> str:
|
||||||
|
"""Utils: returns the formatted dtring corresponding to in_city types and direction
|
||||||
|
"""
|
||||||
rev_direction = 'west' if direction == 'east' else 'east'
|
rev_direction = 'west' if direction == 'east' else 'east'
|
||||||
return_eqpt = ''
|
return_eqpt = ''
|
||||||
if in_city in eqpts_by_city:
|
if in_city in eqpts_by_city:
|
||||||
@@ -753,22 +801,25 @@ def eqpt_in_city_to_city(in_city, to_city, direction='east'):
|
|||||||
return return_eqpt
|
return return_eqpt
|
||||||
|
|
||||||
|
|
||||||
def corresp_next_node(network, corresp_ila, corresp_roadm):
|
def corresp_next_node(network: DiGraph, corresp_ila: dict, corresp_roadm: dict) -> Tuple[dict, dict]:
|
||||||
""" for each name in corresp dictionnaries find the next node in network and its name
|
""" for each name in corresp dictionnaries find the next node in network and its name
|
||||||
given by user in excel. for meshTopology_exampleV2.xls:
|
given by user in excel. for meshTopology_exampleV2.xls:
|
||||||
user ILA name Stbrieuc covers the two direction. convert.py creates 2 different ILA
|
user ILA name Stbrieuc covers the two direction. convert.py creates 2 different ILA
|
||||||
with possible names (depending on the direction and if the eqpt was defined in eqpt
|
with possible names (depending on the direction and if the eqpt was defined in eqpt
|
||||||
sheet)
|
sheet)
|
||||||
|
for an ILA and if it is defined in eqpt:
|
||||||
- east edfa in Stbrieuc to Rennes_STA
|
- east edfa in Stbrieuc to Rennes_STA
|
||||||
- west edfa in Stbrieuc to Rennes_STA
|
- west edfa in Stbrieuc to Rennes_STA
|
||||||
- Edfa0_fiber (Lannion_CAS → Stbrieuc)-F056
|
for an ILA and if it is not defined in eqpt:
|
||||||
- Edfa0_fiber (Rennes_STA → Stbrieuc)-F057
|
- east edfa in Stbrieuc
|
||||||
|
- west edfa in Stbrieuc
|
||||||
|
for a roadm
|
||||||
|
"Edfa_preamp_roadm node1_from_fiber (siteE → node1)-CABLES#19"
|
||||||
|
"Edfa_booster_roadm node1_to_fiber (node1 → siteE)-CABLES#19"
|
||||||
next_nodes finds the user defined name of next node to be able to map the path constraints
|
next_nodes finds the user defined name of next node to be able to map the path constraints
|
||||||
- east edfa in Stbrieuc to Rennes_STA next node = Rennes_STA
|
- east edfa in Stbrieuc to Rennes_STA next node = Rennes_STA
|
||||||
- west edfa in Stbrieuc to Rennes_STA next node Lannion_CAS
|
- west edfa in Stbrieuc to Rennes_STA next node Lannion_CAS
|
||||||
|
|
||||||
Edfa0_fiber (Lannion_CAS → Stbrieuc)-F056 and Edfa0_fiber (Rennes_STA → Stbrieuc)-F057
|
|
||||||
do not exist
|
|
||||||
the function supports fiber splitting, fused nodes and shall only be called if
|
the function supports fiber splitting, fused nodes and shall only be called if
|
||||||
excel format is used for both network and service
|
excel format is used for both network and service
|
||||||
"""
|
"""
|
||||||
@@ -779,8 +830,8 @@ def corresp_next_node(network, corresp_ila, corresp_roadm):
|
|||||||
for ila_elem in ila_list:
|
for ila_elem in ila_list:
|
||||||
# find the node with ila_elem string _in_ the node uid. 'in' is used instead of
|
# find the node with ila_elem string _in_ the node uid. 'in' is used instead of
|
||||||
# '==' to find composed nodes due to fiber splitting in autodesign.
|
# '==' to find composed nodes due to fiber splitting in autodesign.
|
||||||
# eg if elem_ila is 'Edfa0_fiber (Lannion_CAS → Stbrieuc)-F056',
|
# eg if elem_ila is 'east edfa in Stbrieuc to Rennes_STA',
|
||||||
# node uid 'Edfa0_fiber (Lannion_CAS → Stbrieuc)-F056_(1/2)' is possible
|
# node uid 'east edfa in Stbrieuc to Rennes_STA-_(1/2)' is possible
|
||||||
correct_ila_name = next(n.uid for n in network.nodes() if ila_elem in n.uid)
|
correct_ila_name = next(n.uid for n in network.nodes() if ila_elem in n.uid)
|
||||||
temp.remove(ila_elem)
|
temp.remove(ila_elem)
|
||||||
temp.append(correct_ila_name)
|
temp.append(correct_ila_name)
|
||||||
@@ -797,7 +848,7 @@ def corresp_next_node(network, corresp_ila, corresp_roadm):
|
|||||||
break
|
break
|
||||||
# if next_nd was not already added in the dict with the previous loop,
|
# if next_nd was not already added in the dict with the previous loop,
|
||||||
# add the first found correspondance in ila names
|
# add the first found correspondance in ila names
|
||||||
if correct_ila_name not in next_node.keys():
|
if correct_ila_name not in next_node:
|
||||||
for key, val in corresp_ila.items():
|
for key, val in corresp_ila.items():
|
||||||
# in case of splitted fibers the ila name might not be exact match
|
# in case of splitted fibers the ila name might not be exact match
|
||||||
if [e for e in val if e in next_nd.uid]:
|
if [e for e in val if e in next_nd.uid]:
|
||||||
@@ -808,7 +859,9 @@ def corresp_next_node(network, corresp_ila, corresp_roadm):
|
|||||||
return corresp_ila, next_node
|
return corresp_ila, next_node
|
||||||
|
|
||||||
|
|
||||||
def fiber_dest_from_source(city_name):
|
def fiber_dest_from_source(city_name: str, links_by_city: DefaultDict[str, List[Link]]) -> List[str]:
|
||||||
|
"""Returns the list of cities city_name is connected to
|
||||||
|
"""
|
||||||
destinations = []
|
destinations = []
|
||||||
links_from_city = links_by_city[city_name]
|
links_from_city = links_by_city[city_name]
|
||||||
for l in links_from_city:
|
for l in links_from_city:
|
||||||
@@ -819,7 +872,9 @@ def fiber_dest_from_source(city_name):
|
|||||||
return destinations
|
return destinations
|
||||||
|
|
||||||
|
|
||||||
def fiber_link(from_city, to_city):
|
def fiber_link(from_city: str, to_city: str, links_by_city: DefaultDict[str, List[Link]]) -> str:
|
||||||
|
"""utils: returns formatted uid for fibers between from_city and to_city
|
||||||
|
"""
|
||||||
source_dest = (from_city, to_city)
|
source_dest = (from_city, to_city)
|
||||||
links = links_by_city[from_city]
|
links = links_by_city[from_city]
|
||||||
link = next(l for l in links if l.from_city in source_dest and l.to_city in source_dest)
|
link = next(l for l in links if l.from_city in source_dest and l.to_city in source_dest)
|
||||||
@@ -830,7 +885,9 @@ def fiber_link(from_city, to_city):
|
|||||||
return fiber
|
return fiber
|
||||||
|
|
||||||
|
|
||||||
def midpoint(city_a, city_b):
|
def midpoint(city_a: Node, city_b:Node) -> dict:
|
||||||
|
"""Computes mipoint coordinates
|
||||||
|
"""
|
||||||
lats = city_a.latitude, city_b.latitude
|
lats = city_a.latitude, city_b.latitude
|
||||||
longs = city_a.longitude, city_b.longitude
|
longs = city_a.longitude, city_b.longitude
|
||||||
try:
|
try:
|
||||||
@@ -855,10 +912,12 @@ LINKS_LINE = 3
|
|||||||
EQPTS_LINE = 3
|
EQPTS_LINE = 3
|
||||||
EQPTS_COLUMN = 14
|
EQPTS_COLUMN = 14
|
||||||
ROADMS_LINE = 3
|
ROADMS_LINE = 3
|
||||||
ROADMS_COLUMN = 3
|
ROADMS_COLUMN = 6
|
||||||
|
|
||||||
|
|
||||||
def _do_convert():
|
def _do_convert():
|
||||||
|
"""Main function for xls(x) topology conversion to JSON format
|
||||||
|
"""
|
||||||
parser = ArgumentParser()
|
parser = ArgumentParser()
|
||||||
parser.add_argument('workbook', type=Path)
|
parser.add_argument('workbook', type=Path)
|
||||||
parser.add_argument('-f', '--filter-region', action='append', default=[])
|
parser.add_argument('-f', '--filter-region', action='append', default=[])
|
||||||
|
|||||||
@@ -8,20 +8,23 @@ gnpy.tools.json_io
|
|||||||
Loading and saving data from JSON files in GNPy's internal data format
|
Loading and saving data from JSON files in GNPy's internal data format
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from networkx import DiGraph
|
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import json
|
import json
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
from copy import deepcopy
|
||||||
|
from typing import Union, Dict, List
|
||||||
|
from networkx import DiGraph
|
||||||
from numpy import arange
|
from numpy import arange
|
||||||
|
|
||||||
|
|
||||||
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
|
from gnpy.core.utils import automatic_nch, automatic_fmax, merge_amplifier_restrictions, dbm2watt
|
||||||
from gnpy.core.parameters import DEFAULT_RAMAN_COEFFICIENT
|
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
|
||||||
@@ -39,25 +42,34 @@ Model_dual_stage = namedtuple('Model_dual_stage', 'preamp_variety booster_variet
|
|||||||
|
|
||||||
|
|
||||||
class Model_openroadm_preamp:
|
class Model_openroadm_preamp:
|
||||||
pass
|
"""class to hold nf model specific to OpenROADM preamp
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
class Model_openroadm_booster:
|
class Model_openroadm_booster:
|
||||||
pass
|
"""class to hold nf model specific to OpenROADM booster
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
class _JsonThing:
|
class _JsonThing:
|
||||||
|
"""Base class for json equipment
|
||||||
|
"""
|
||||||
def update_attr(self, default_values, kwargs, name):
|
def update_attr(self, default_values, kwargs, name):
|
||||||
|
"""Build the attributes based on kwargs dict
|
||||||
|
"""
|
||||||
clean_kwargs = {k: v for k, v in kwargs.items() if v != ''}
|
clean_kwargs = {k: v for k, v in kwargs.items() if v != ''}
|
||||||
for k, v in default_values.items():
|
for k, v in default_values.items():
|
||||||
setattr(self, k, clean_kwargs.get(k, v))
|
setattr(self, k, clean_kwargs.get(k, v))
|
||||||
if k not in clean_kwargs and name != 'Amp':
|
if k not in clean_kwargs and name != 'Amp' and v is not None and v != []:
|
||||||
msg = f'\n WARNING missing {k} attribute in eqpt_config.json[{name}]' \
|
# do not show this warning if the default value is None
|
||||||
+ f'\n default value is {k} = {v}'
|
msg = f'\n\tWARNING missing {k} attribute in eqpt_config.json[{name}]' \
|
||||||
|
+ f'\n\tdefault value is {k} = {v}\n'
|
||||||
_logger.warning(msg)
|
_logger.warning(msg)
|
||||||
|
|
||||||
|
|
||||||
class SI(_JsonThing):
|
class SI(_JsonThing):
|
||||||
|
"""Spectrum Information
|
||||||
|
"""
|
||||||
default_values = {
|
default_values = {
|
||||||
"f_min": 191.35e12,
|
"f_min": 191.35e12,
|
||||||
"f_max": 196.1e12,
|
"f_max": 196.1e12,
|
||||||
@@ -67,7 +79,8 @@ class SI(_JsonThing):
|
|||||||
"power_range_db": [0, 0, 0.5],
|
"power_range_db": [0, 0, 0.5],
|
||||||
"roll_off": 0.15,
|
"roll_off": 0.15,
|
||||||
"tx_osnr": 45,
|
"tx_osnr": 45,
|
||||||
"sys_margins": 0
|
"sys_margins": 0,
|
||||||
|
"tx_power_dbm": None # optional value in SI
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
@@ -75,6 +88,8 @@ class SI(_JsonThing):
|
|||||||
|
|
||||||
|
|
||||||
class Span(_JsonThing):
|
class Span(_JsonThing):
|
||||||
|
"""Span simulations definition
|
||||||
|
"""
|
||||||
default_values = {
|
default_values = {
|
||||||
'power_mode': True,
|
'power_mode': True,
|
||||||
'delta_power_range_db': None,
|
'delta_power_range_db': None,
|
||||||
@@ -94,14 +109,18 @@ class Span(_JsonThing):
|
|||||||
|
|
||||||
|
|
||||||
class Roadm(_JsonThing):
|
class Roadm(_JsonThing):
|
||||||
|
"""List of ROADM and their specs
|
||||||
|
"""
|
||||||
default_values = {
|
default_values = {
|
||||||
|
'type_variety': 'default',
|
||||||
'add_drop_osnr': 100,
|
'add_drop_osnr': 100,
|
||||||
'pmd': 0,
|
'pmd': 0,
|
||||||
'pdl': 0,
|
'pdl': 0,
|
||||||
'restrictions': {
|
'restrictions': {
|
||||||
'preamp_variety_list': [],
|
'preamp_variety_list': [],
|
||||||
'booster_variety_list': []
|
'booster_variety_list': []
|
||||||
}
|
},
|
||||||
|
'roadm-path-impairments': []
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
@@ -124,6 +143,8 @@ class Roadm(_JsonThing):
|
|||||||
|
|
||||||
|
|
||||||
class Transceiver(_JsonThing):
|
class Transceiver(_JsonThing):
|
||||||
|
"""List of transceivers and their modes
|
||||||
|
"""
|
||||||
default_values = {
|
default_values = {
|
||||||
'type_variety': None,
|
'type_variety': None,
|
||||||
'frequency': None,
|
'frequency': None,
|
||||||
@@ -156,6 +177,8 @@ class Transceiver(_JsonThing):
|
|||||||
|
|
||||||
|
|
||||||
class Fiber(_JsonThing):
|
class Fiber(_JsonThing):
|
||||||
|
"""Fiber default settings
|
||||||
|
"""
|
||||||
default_values = {
|
default_values = {
|
||||||
'type_variety': '',
|
'type_variety': '',
|
||||||
'dispersion': None,
|
'dispersion': None,
|
||||||
@@ -176,58 +199,36 @@ class Fiber(_JsonThing):
|
|||||||
|
|
||||||
|
|
||||||
class RamanFiber(Fiber):
|
class RamanFiber(Fiber):
|
||||||
pass
|
"""Raman Fiber default settings
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
class Amp(_JsonThing):
|
class Amp(_JsonThing):
|
||||||
default_values = {
|
"""List of amplifiers with their specs
|
||||||
'f_min': 191.35e12,
|
"""
|
||||||
'f_max': 196.1e12,
|
default_values = EdfaParams.default_values
|
||||||
'type_variety': '',
|
|
||||||
'type_def': '',
|
|
||||||
'gain_flatmax': None,
|
|
||||||
'gain_min': None,
|
|
||||||
'p_max': None,
|
|
||||||
'nf_model': None,
|
|
||||||
'dual_stage_model': None,
|
|
||||||
'preamp_variety': None,
|
|
||||||
'booster_variety': None,
|
|
||||||
'nf_min': None,
|
|
||||||
'nf_max': None,
|
|
||||||
'nf_coef': None,
|
|
||||||
'nf0': None,
|
|
||||||
'nf_fit_coeff': None,
|
|
||||||
'nf_ripple': 0,
|
|
||||||
'dgt': None,
|
|
||||||
'gain_ripple': 0,
|
|
||||||
'tilt_ripple': 0,
|
|
||||||
'f_ripple_ref': None,
|
|
||||||
'out_voa_auto': False,
|
|
||||||
'allowed_for_design': False,
|
|
||||||
'raman': False,
|
|
||||||
'pmd': 0,
|
|
||||||
'pdl': 0,
|
|
||||||
'advance_configurations_from_json': None
|
|
||||||
}
|
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
self.update_attr(self.default_values, kwargs, 'Amp')
|
self.update_attr(self.default_values, kwargs, 'Amp')
|
||||||
|
|
||||||
@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:
|
||||||
nf0 = kwargs.pop('nf0')
|
nf0 = kwargs.pop('nf0')
|
||||||
except KeyError: # nf0 is expected for a fixed gain amp
|
except KeyError as exc: # nf0 is expected for a fixed gain amp
|
||||||
msg = f'missing nf0 value input for amplifier: {type_variety} in equipment config'
|
msg = f'missing nf0 value input for amplifier: {type_variety} in equipment config'
|
||||||
raise EquipmentConfigError(msg)
|
raise EquipmentConfigError(msg) from exc
|
||||||
for k in ('nf_min', 'nf_max'):
|
for k in ('nf_min', 'nf_max'):
|
||||||
try:
|
try:
|
||||||
del kwargs[k]
|
del kwargs[k]
|
||||||
@@ -241,9 +242,9 @@ class Amp(_JsonThing):
|
|||||||
try: # nf_min and nf_max are expected for a variable gain amp
|
try: # nf_min and nf_max are expected for a variable gain amp
|
||||||
nf_min = kwargs.pop('nf_min')
|
nf_min = kwargs.pop('nf_min')
|
||||||
nf_max = kwargs.pop('nf_max')
|
nf_max = kwargs.pop('nf_max')
|
||||||
except KeyError:
|
except KeyError as exc:
|
||||||
msg = f'missing nf_min or nf_max value input for amplifier: {type_variety} in equipment config'
|
msg = f'missing nf_min or nf_max value input for amplifier: {type_variety} in equipment config'
|
||||||
raise EquipmentConfigError(msg)
|
raise EquipmentConfigError(msg) from exc
|
||||||
try: # remove all remaining nf inputs
|
try: # remove all remaining nf inputs
|
||||||
del kwargs['nf0']
|
del kwargs['nf0']
|
||||||
except KeyError:
|
except KeyError:
|
||||||
@@ -253,8 +254,8 @@ class Amp(_JsonThing):
|
|||||||
elif type_def == 'openroadm':
|
elif type_def == 'openroadm':
|
||||||
try:
|
try:
|
||||||
nf_coef = kwargs.pop('nf_coef')
|
nf_coef = kwargs.pop('nf_coef')
|
||||||
except KeyError: # nf_coef is expected for openroadm amp
|
except KeyError as exc: # nf_coef is expected for openroadm amp
|
||||||
raise EquipmentConfigError(f'missing nf_coef input for amplifier: {type_variety} in equipment config')
|
raise EquipmentConfigError(f'missing nf_coef input for amplifier: {type_variety} in equipment config') from exc
|
||||||
nf_def = Model_openroadm_ila(nf_coef)
|
nf_def = Model_openroadm_ila(nf_coef)
|
||||||
elif type_def == 'openroadm_preamp':
|
elif type_def == 'openroadm_preamp':
|
||||||
nf_def = Model_openroadm_preamp()
|
nf_def = Model_openroadm_preamp()
|
||||||
@@ -264,28 +265,29 @@ class Amp(_JsonThing):
|
|||||||
try: # nf_ram and gain_ram are expected for a hybrid amp
|
try: # nf_ram and gain_ram are expected for a hybrid amp
|
||||||
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 as exc:
|
||||||
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') from exc
|
||||||
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 _spectrum_from_json(json_data: dict):
|
||||||
"""return the min possible channel spacing for a given baud rate"""
|
|
||||||
# TODO : this should parametrized in a cfg file
|
|
||||||
# list of possible tuples [(max_baud_rate, spacing_for_this_baud_rate)]
|
|
||||||
spacing_list = [(33e9, 37.5e9), (38e9, 50e9), (50e9, 62.5e9), (67e9, 75e9), (92e9, 100e9)]
|
|
||||||
return min((s[1] for s in spacing_list if s[0] > baud_rate), default=baud_rate * 1.2)
|
|
||||||
|
|
||||||
|
|
||||||
def _spectrum_from_json(json_data):
|
|
||||||
"""JSON_data is a list of spectrum partitions each with
|
"""JSON_data is a list of spectrum partitions each with
|
||||||
{f_min, f_max, baud_rate, roll_off, delta_pdb, slot_width, tx_osnr, label}
|
{f_min, f_max, baud_rate, roll_off, delta_pdb, slot_width, tx_osnr, label}
|
||||||
Creates the per freq Carrier's dict.
|
Creates the per freq Carrier's dict.
|
||||||
@@ -294,7 +296,7 @@ def _spectrum_from_json(json_data):
|
|||||||
label should be different for each partition
|
label should be different for each partition
|
||||||
>>> json_data = {'spectrum': \
|
>>> json_data = {'spectrum': \
|
||||||
[{'f_min': 193.2e12, 'f_max': 193.4e12, 'slot_width': 50e9, 'baud_rate': 32e9, 'roll_off': 0.15, \
|
[{'f_min': 193.2e12, 'f_max': 193.4e12, 'slot_width': 50e9, 'baud_rate': 32e9, 'roll_off': 0.15, \
|
||||||
'delta_pdb': 1, 'tx_osnr': 45},\
|
'delta_pdb': 1, 'tx_osnr': 45, 'tx_power_dbm': -7},\
|
||||||
{'f_min': 193.4625e12, 'f_max': 193.9875e12, 'slot_width': 75e9, 'baud_rate': 64e9, 'roll_off': 0.15},\
|
{'f_min': 193.4625e12, 'f_max': 193.9875e12, 'slot_width': 75e9, 'baud_rate': 64e9, 'roll_off': 0.15},\
|
||||||
{'f_min': 194.075e12, 'f_max': 194.075e12, 'slot_width': 100e9, 'baud_rate': 90e9, 'roll_off': 0.15},\
|
{'f_min': 194.075e12, 'f_max': 194.075e12, 'slot_width': 100e9, 'baud_rate': 90e9, 'roll_off': 0.15},\
|
||||||
{'f_min': 194.2e12, 'f_max': 194.35e12, 'slot_width': 50e9, 'baud_rate': 32e9, 'roll_off': 0.15}]}
|
{'f_min': 194.2e12, 'f_max': 194.35e12, 'slot_width': 50e9, 'baud_rate': 32e9, 'roll_off': 0.15}]}
|
||||||
@@ -302,24 +304,24 @@ def _spectrum_from_json(json_data):
|
|||||||
>>> for k, v in spectrum.items():
|
>>> for k, v in spectrum.items():
|
||||||
... print(f'{k}: {v}')
|
... print(f'{k}: {v}')
|
||||||
...
|
...
|
||||||
193200000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, label='0-32.00G')
|
193200000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, tx_power=0.00019952623149688798, label='0-32.00G')
|
||||||
193250000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, label='0-32.00G')
|
193250000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, tx_power=0.00019952623149688798, label='0-32.00G')
|
||||||
193300000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, label='0-32.00G')
|
193300000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, tx_power=0.00019952623149688798, label='0-32.00G')
|
||||||
193350000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, label='0-32.00G')
|
193350000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, tx_power=0.00019952623149688798, label='0-32.00G')
|
||||||
193400000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, label='0-32.00G')
|
193400000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, tx_power=0.00019952623149688798, label='0-32.00G')
|
||||||
193462500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G')
|
193462500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
|
||||||
193537500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G')
|
193537500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
|
||||||
193612500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G')
|
193612500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
|
||||||
193687500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G')
|
193687500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
|
||||||
193762500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G')
|
193762500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
|
||||||
193837500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G')
|
193837500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
|
||||||
193912500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G')
|
193912500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
|
||||||
193987500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G')
|
193987500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
|
||||||
194075000000000.0: Carrier(delta_pdb=0, baud_rate=90000000000.0, slot_width=100000000000.0, roll_off=0.15, tx_osnr=40, label='2-90.00G')
|
194075000000000.0: Carrier(delta_pdb=0, baud_rate=90000000000.0, slot_width=100000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='2-90.00G')
|
||||||
194200000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, label='3-32.00G')
|
194200000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='3-32.00G')
|
||||||
194250000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, label='3-32.00G')
|
194250000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='3-32.00G')
|
||||||
194300000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, label='3-32.00G')
|
194300000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='3-32.00G')
|
||||||
194350000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, label='3-32.00G')
|
194350000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='3-32.00G')
|
||||||
"""
|
"""
|
||||||
spectrum = {}
|
spectrum = {}
|
||||||
json_data = sorted(json_data, key=lambda x: x['f_min'])
|
json_data = sorted(json_data, key=lambda x: x['f_min'])
|
||||||
@@ -327,14 +329,13 @@ def _spectrum_from_json(json_data):
|
|||||||
previous_part_max_freq = 0.0
|
previous_part_max_freq = 0.0
|
||||||
for index, part in enumerate(json_data):
|
for index, part in enumerate(json_data):
|
||||||
# default delta_pdb is 0 dB
|
# default delta_pdb is 0 dB
|
||||||
if 'delta_pdb' not in part:
|
part.setdefault('delta_pdb', 0)
|
||||||
part['delta_pdb'] = 0
|
|
||||||
# add a label to the partition for the printings
|
# add a label to the partition for the printings
|
||||||
if 'label' not in part:
|
part.setdefault('label', f'{index}-{part["baud_rate"] * 1e-9:.2f}G')
|
||||||
part['label'] = f'{index}-{part["baud_rate"] * 1e-9 :.2f}G'
|
|
||||||
# default tx_osnr is set to 40 dB
|
# default tx_osnr is set to 40 dB
|
||||||
if 'tx_osnr' not in part:
|
part.setdefault('tx_osnr', 40)
|
||||||
part['tx_osnr'] = 40
|
# default tx_power_dbm is set to 0 dBn
|
||||||
|
part.setdefault('tx_power_dbm', 0)
|
||||||
# starting freq is exactly f_min to be consistent with utils.automatic_nch
|
# starting freq is exactly f_min to be consistent with utils.automatic_nch
|
||||||
# first partition min occupation is f_min - slot_width / 2 (central_frequency is f_min)
|
# first partition min occupation is f_min - slot_width / 2 (central_frequency is f_min)
|
||||||
# supposes that carriers are centered on frequency
|
# supposes that carriers are centered on frequency
|
||||||
@@ -348,27 +349,38 @@ def _spectrum_from_json(json_data):
|
|||||||
raise ValueError(msg)
|
raise ValueError(msg)
|
||||||
|
|
||||||
max_range = ((part['f_max'] - part['f_min']) // part['slot_width'] + 1) * part['slot_width']
|
max_range = ((part['f_max'] - part['f_min']) // part['slot_width'] + 1) * part['slot_width']
|
||||||
|
previous_part_max_freq = None
|
||||||
for current_freq in arange(part['f_min'],
|
for current_freq in arange(part['f_min'],
|
||||||
part['f_min'] + max_range,
|
part['f_min'] + max_range,
|
||||||
part['slot_width']):
|
part['slot_width']):
|
||||||
spectrum[current_freq] = Carrier(delta_pdb=part['delta_pdb'], baud_rate=part['baud_rate'],
|
spectrum[current_freq] = Carrier(delta_pdb=part['delta_pdb'], baud_rate=part['baud_rate'],
|
||||||
slot_width=part['slot_width'], roll_off=part['roll_off'],
|
slot_width=part['slot_width'], roll_off=part['roll_off'],
|
||||||
tx_osnr=part['tx_osnr'], label=part['label'])
|
tx_osnr=part['tx_osnr'], tx_power=dbm2watt(part['tx_power_dbm']),
|
||||||
|
label=part['label'])
|
||||||
previous_part_max_freq = current_freq + part['slot_width'] / 2
|
previous_part_max_freq = current_freq + part['slot_width'] / 2
|
||||||
return spectrum
|
return spectrum
|
||||||
|
|
||||||
|
|
||||||
def load_equipment(filename):
|
def load_equipment(filename: Path) -> dict:
|
||||||
|
"""Load equipment, returns equipment dict
|
||||||
|
"""
|
||||||
json_data = load_json(filename)
|
json_data = load_json(filename)
|
||||||
return _equipment_from_json(json_data, filename)
|
return _equipment_from_json(json_data, filename)
|
||||||
|
|
||||||
|
|
||||||
def load_initial_spectrum(filename):
|
def load_initial_spectrum(filename: Path) -> dict:
|
||||||
|
"""Load spectrum to propagate, returns spectrum dict
|
||||||
|
"""
|
||||||
json_data = load_json(filename)
|
json_data = load_json(filename)
|
||||||
return _spectrum_from_json(json_data['spectrum'])
|
return _spectrum_from_json(json_data['spectrum'])
|
||||||
|
|
||||||
|
|
||||||
def _update_dual_stage(equipment):
|
def _update_dual_stage(equipment: dict) -> dict:
|
||||||
|
"""Update attributes of all dual stage amps with the preamp and booster attributes
|
||||||
|
(defined in the equipment dictionary)
|
||||||
|
|
||||||
|
Returns the updated equiment dictionary
|
||||||
|
"""
|
||||||
edfa_dict = equipment['Edfa']
|
edfa_dict = equipment['Edfa']
|
||||||
for edfa in edfa_dict.values():
|
for edfa in edfa_dict.values():
|
||||||
if edfa.type_def == 'dual_stage':
|
if edfa.type_def == 'dual_stage':
|
||||||
@@ -387,16 +399,43 @@ def _update_dual_stage(equipment):
|
|||||||
return equipment
|
return equipment
|
||||||
|
|
||||||
|
|
||||||
def _roadm_restrictions_sanity_check(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: dict):
|
||||||
"""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."""
|
||||||
restrictions = equipment['Roadm']['default'].restrictions['booster_variety_list'] + \
|
for roadm_type, roadm_eqpt in equipment['Roadm'].items():
|
||||||
equipment['Roadm']['default'].restrictions['preamp_variety_list']
|
restrictions = roadm_eqpt.restrictions['booster_variety_list'] + \
|
||||||
|
roadm_eqpt.restrictions['preamp_variety_list']
|
||||||
for amp_name in restrictions:
|
for amp_name in restrictions:
|
||||||
if amp_name not in equipment['Edfa']:
|
if amp_name not in equipment['Edfa']:
|
||||||
raise EquipmentConfigError(f'ROADM restriction {amp_name} does not refer to a defined EDFA name')
|
raise EquipmentConfigError(f'ROADM {roadm_type} restriction {amp_name} does not refer to a '
|
||||||
|
+ 'defined EDFA name')
|
||||||
|
|
||||||
|
|
||||||
def _check_fiber_vs_raman_fiber(equipment):
|
def _check_fiber_vs_raman_fiber(equipment: dict):
|
||||||
"""Ensure that Fiber and RamanFiber with the same name define common properties equally"""
|
"""Ensure that Fiber and RamanFiber with the same name define common properties equally"""
|
||||||
if 'RamanFiber' not in equipment:
|
if 'RamanFiber' not in equipment:
|
||||||
return
|
return
|
||||||
@@ -411,7 +450,7 @@ def _check_fiber_vs_raman_fiber(equipment):
|
|||||||
f'disagrees for "{attr}": {a} != {b}')
|
f'disagrees for "{attr}": {a} != {b}')
|
||||||
|
|
||||||
|
|
||||||
def _equipment_from_json(json_data, filename):
|
def _equipment_from_json(json_data: dict, filename: Path) -> dict:
|
||||||
"""build global dictionnary eqpt_library that stores all eqpt characteristics:
|
"""build global dictionnary eqpt_library that stores all eqpt characteristics:
|
||||||
edfa type type_variety, fiber type_variety
|
edfa type type_variety, fiber type_variety
|
||||||
from the eqpt_config.json (filename parameter)
|
from the eqpt_config.json (filename parameter)
|
||||||
@@ -434,6 +473,9 @@ def _equipment_from_json(json_data, filename):
|
|||||||
elif key == 'Roadm':
|
elif key == 'Roadm':
|
||||||
equipment[key][subkey] = Roadm(**entry)
|
equipment[key][subkey] = Roadm(**entry)
|
||||||
elif key == 'SI':
|
elif key == 'SI':
|
||||||
|
# use power_dbm value for tx_power_dbm if the key is not in 'SI'
|
||||||
|
# if 'tx_power_dbm' not in entry.keys():
|
||||||
|
# entry['tx_power_dbm'] = entry['power_dbm']
|
||||||
equipment[key][subkey] = SI(**entry)
|
equipment[key][subkey] = SI(**entry)
|
||||||
elif key == 'Transceiver':
|
elif key == 'Transceiver':
|
||||||
equipment[key][subkey] = Transceiver(**entry)
|
equipment[key][subkey] = Transceiver(**entry)
|
||||||
@@ -443,11 +485,22 @@ 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
|
||||||
|
|
||||||
|
|
||||||
def load_network(filename, equipment):
|
def load_network(filename: Path, equipment: dict) -> DiGraph:
|
||||||
|
"""load network json or excel
|
||||||
|
|
||||||
|
:param filename: input file to read from
|
||||||
|
:param equipment: equipment library
|
||||||
|
"""
|
||||||
if filename.suffix.lower() in ('.xls', '.xlsx'):
|
if filename.suffix.lower() in ('.xls', '.xlsx'):
|
||||||
json_data = xls_to_json_data(filename)
|
json_data = xls_to_json_data(filename)
|
||||||
elif filename.suffix.lower() == '.json':
|
elif filename.suffix.lower() == '.json':
|
||||||
@@ -471,19 +524,22 @@ def _cls_for(equipment_type):
|
|||||||
return elements.Edfa
|
return elements.Edfa
|
||||||
if equipment_type == 'Fused':
|
if equipment_type == 'Fused':
|
||||||
return elements.Fused
|
return elements.Fused
|
||||||
elif equipment_type == 'Roadm':
|
if equipment_type == 'Roadm':
|
||||||
return elements.Roadm
|
return elements.Roadm
|
||||||
elif equipment_type == 'Transceiver':
|
if equipment_type == 'Transceiver':
|
||||||
return elements.Transceiver
|
return elements.Transceiver
|
||||||
elif equipment_type == 'Fiber':
|
if equipment_type == 'Fiber':
|
||||||
return elements.Fiber
|
return elements.Fiber
|
||||||
elif equipment_type == 'RamanFiber':
|
if equipment_type == 'RamanFiber':
|
||||||
return elements.RamanFiber
|
return elements.RamanFiber
|
||||||
else:
|
if equipment_type == 'Multiband_amplifier':
|
||||||
|
return elements.Multiband_amplifier
|
||||||
raise ConfigurationError(f'Unknown network equipment "{equipment_type}"')
|
raise ConfigurationError(f'Unknown network equipment "{equipment_type}"')
|
||||||
|
|
||||||
|
|
||||||
def network_from_json(json_data, equipment):
|
def network_from_json(json_data: dict, equipment: dict) -> DiGraph:
|
||||||
|
"""create digraph based on json input dict and using equipment library to fill in the gaps
|
||||||
|
"""
|
||||||
# NOTE|dutc: we could use the following, but it would tie our data format
|
# NOTE|dutc: we could use the following, but it would tie our data format
|
||||||
# too closely to the graph library
|
# too closely to the graph library
|
||||||
# from networkx import node_link_graph
|
# from networkx import node_link_graph
|
||||||
@@ -492,7 +548,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 not in 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]:
|
||||||
@@ -509,7 +613,7 @@ def network_from_json(json_data, equipment):
|
|||||||
temp = merge_amplifier_restrictions(temp, extra_params)
|
temp = merge_amplifier_restrictions(temp, extra_params)
|
||||||
el_config['params'] = temp
|
el_config['params'] = temp
|
||||||
el_config['type_variety'] = variety
|
el_config['type_variety'] = variety
|
||||||
elif (typ in ['Fiber', 'RamanFiber']):
|
elif (typ in ['Fiber', 'RamanFiber', 'Roadm']):
|
||||||
raise ConfigurationError(f'The {typ} of variety type {variety} was not recognized:'
|
raise ConfigurationError(f'The {typ} of variety type {variety} was not recognized:'
|
||||||
'\nplease check it is properly defined in the eqpt_config json file')
|
'\nplease check it is properly defined in the eqpt_config json file')
|
||||||
elif typ == 'Edfa':
|
elif typ == 'Edfa':
|
||||||
@@ -531,14 +635,16 @@ def network_from_json(json_data, equipment):
|
|||||||
else:
|
else:
|
||||||
edge_length = 0.01
|
edge_length = 0.01
|
||||||
g.add_edge(nodes[from_node], nodes[to_node], weight=edge_length)
|
g.add_edge(nodes[from_node], nodes[to_node], weight=edge_length)
|
||||||
except KeyError:
|
except KeyError as exc:
|
||||||
msg = f'can not find {from_node} or {to_node} defined in {cx}'
|
msg = f'can not find {from_node} or {to_node} defined in {cx}'
|
||||||
raise NetworkTopologyError(msg)
|
raise NetworkTopologyError(msg) from exc
|
||||||
|
|
||||||
return g
|
return g
|
||||||
|
|
||||||
|
|
||||||
def network_to_json(network):
|
def network_to_json(network: DiGraph) -> dict:
|
||||||
|
"""Export network graph as a json dict
|
||||||
|
"""
|
||||||
data = {
|
data = {
|
||||||
'elements': [n.to_json for n in network]
|
'elements': [n.to_json for n in network]
|
||||||
}
|
}
|
||||||
@@ -552,55 +658,62 @@ def network_to_json(network):
|
|||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
def load_json(filename):
|
def load_json(filename: Path) -> dict:
|
||||||
|
"""load json data, convert from the yang to the legacy
|
||||||
|
supports both legacy ang yang formatted inputs based on yang models
|
||||||
|
"""
|
||||||
with open(filename, 'r', encoding='utf-8') as f:
|
with open(filename, 'r', encoding='utf-8') as f:
|
||||||
data = json.load(f)
|
data = json.load(f)
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
def save_json(obj, filename):
|
def save_json(obj: Dict, filename: Path):
|
||||||
|
"""Save in json format. Use yang formatted data for Topo and Services
|
||||||
|
"""
|
||||||
with open(filename, 'w', encoding='utf-8') as f:
|
with open(filename, 'w', encoding='utf-8') as f:
|
||||||
json.dump(obj, f, indent=2, ensure_ascii=False)
|
json.dump(obj, f, indent=2, ensure_ascii=False)
|
||||||
|
|
||||||
|
|
||||||
def load_requests(filename, eqpt, bidir, network, network_filename):
|
def load_requests(filename: Path, eqpt: dict, bidir: bool, network: DiGraph, network_filename: str) -> dict:
|
||||||
"""loads the requests from a json or an excel file into a data string"""
|
"""loads the requests from a json or an excel file into a data string"""
|
||||||
if filename.suffix.lower() in ('.xls', '.xlsx'):
|
if filename.suffix.lower() in ('.xls', '.xlsx'):
|
||||||
_logger.info('Automatically converting requests from XLS to JSON')
|
_logger.info('Automatically converting requests from XLS to JSON')
|
||||||
try:
|
try:
|
||||||
return convert_service_sheet(filename, eqpt, network, network_filename=network_filename, bidir=bidir)
|
return convert_service_sheet(filename, eqpt, network, network_filename=network_filename, bidir=bidir)
|
||||||
except ServiceError as this_e:
|
except ServiceError as this_e:
|
||||||
raise ServiceError(f'Service error: {this_e}')
|
raise ServiceError(f'Service error: {this_e}') from this_e
|
||||||
else:
|
else:
|
||||||
return load_json(filename)
|
return load_json(filename)
|
||||||
|
|
||||||
|
|
||||||
def requests_from_json(json_data, equipment):
|
def requests_from_json(json_data: dict, equipment: dict) -> List[PathRequest]:
|
||||||
"""Extract list of requests from data parsed from JSON"""
|
"""Extract list of requests from data parsed from JSON"""
|
||||||
requests_list = []
|
requests_list = []
|
||||||
|
|
||||||
for req in json_data['path-request']:
|
for req in json_data['path-request']:
|
||||||
# init all params from request
|
# init all params from request
|
||||||
params = {}
|
trx_type = req['path-constraints']['te-bandwidth']['trx_type']
|
||||||
params['request_id'] = f'{req["request-id"]}'
|
trx_mode = req['path-constraints']['te-bandwidth'].get('trx_mode', None)
|
||||||
params['source'] = req['source']
|
if trx_type is None:
|
||||||
params['bidir'] = req['bidirectional']
|
|
||||||
params['destination'] = req['destination']
|
|
||||||
params['trx_type'] = req['path-constraints']['te-bandwidth']['trx_type']
|
|
||||||
if params['trx_type'] is None:
|
|
||||||
msg = f'Request {req["request-id"]} has no transceiver type defined.'
|
msg = f'Request {req["request-id"]} has no transceiver type defined.'
|
||||||
raise ServiceError(msg)
|
raise ServiceError(msg)
|
||||||
params['trx_mode'] = req['path-constraints']['te-bandwidth'].get('trx_mode', None)
|
|
||||||
params['format'] = params['trx_mode']
|
|
||||||
params['spacing'] = req['path-constraints']['te-bandwidth']['spacing']
|
|
||||||
try:
|
try:
|
||||||
nd_list = sorted(req['explicit-route-objects']['route-object-include-exclude'], key=lambda x: x['index'])
|
nd_list = sorted(req['explicit-route-objects']['route-object-include-exclude'], key=lambda x: x['index'])
|
||||||
except KeyError:
|
except KeyError:
|
||||||
nd_list = []
|
nd_list = []
|
||||||
params['nodes_list'] = [n['num-unnum-hop']['node-id'] for n in nd_list]
|
params = {
|
||||||
params['loose_list'] = [n['num-unnum-hop']['hop-type'] for n in nd_list]
|
'request_id': f'{req["request-id"]}',
|
||||||
|
'source': req['source'],
|
||||||
|
'destination': req['destination'],
|
||||||
|
'bidir': req['bidirectional'],
|
||||||
|
'trx_type': trx_type,
|
||||||
|
'trx_mode': trx_mode,
|
||||||
|
'format': trx_mode,
|
||||||
|
'spacing': req['path-constraints']['te-bandwidth']['spacing'],
|
||||||
|
'nodes_list': [n['num-unnum-hop']['node-id'] for n in nd_list],
|
||||||
|
'loose_list': [n['num-unnum-hop']['hop-type'] for n in nd_list]
|
||||||
|
}
|
||||||
# recover trx physical param (baudrate, ...) from type and mode
|
# recover trx physical param (baudrate, ...) from type and mode
|
||||||
# in trx_mode_params optical power is read from equipment['SI']['default'] and
|
|
||||||
# nb_channel is computed based on min max frequency and spacing
|
# nb_channel is computed based on min max frequency and spacing
|
||||||
try:
|
try:
|
||||||
trx_params = trx_mode_params(equipment, params['trx_type'], params['trx_mode'], True)
|
trx_params = trx_mode_params(equipment, params['trx_type'], params['trx_mode'], True)
|
||||||
@@ -608,13 +721,11 @@ def requests_from_json(json_data, equipment):
|
|||||||
msg = f'Equipment Config error in {req["request-id"]}: {e}'
|
msg = f'Equipment Config error in {req["request-id"]}: {e}'
|
||||||
raise EquipmentConfigError(msg) from e
|
raise EquipmentConfigError(msg) from e
|
||||||
params.update(trx_params)
|
params.update(trx_params)
|
||||||
# optical power might be set differently in the request. if it is indicated then the
|
params['power'] = req['path-constraints']['te-bandwidth'].get('output-power')
|
||||||
# params['power'] is updated
|
# params must not be None, but user can set to None: catch this case
|
||||||
try:
|
if params['power'] is None:
|
||||||
if req['path-constraints']['te-bandwidth']['output-power']:
|
params['power'] = dbm2watt(equipment['SI']['default'].power_dbm)
|
||||||
params['power'] = req['path-constraints']['te-bandwidth']['output-power']
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
# same process for nb-channel
|
# same process for nb-channel
|
||||||
f_min = params['f_min']
|
f_min = params['f_min']
|
||||||
f_max_from_si = params['f_max']
|
f_max_from_si = params['f_max']
|
||||||
@@ -634,12 +745,20 @@ def requests_from_json(json_data, equipment):
|
|||||||
params['path_bandwidth'] = req['path-constraints']['te-bandwidth']['path_bandwidth']
|
params['path_bandwidth'] = req['path-constraints']['te-bandwidth']['path_bandwidth']
|
||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
|
params['tx_power'] = req['path-constraints']['te-bandwidth'].get('tx_power')
|
||||||
|
default_tx_power_dbm = equipment['SI']['default'].tx_power_dbm
|
||||||
|
if params['tx_power'] is None:
|
||||||
|
# use request's input power in span instead
|
||||||
|
params['tx_power'] = params['power']
|
||||||
|
if default_tx_power_dbm is not None:
|
||||||
|
# use default tx power
|
||||||
|
params['tx_power'] = dbm2watt(default_tx_power_dbm)
|
||||||
_check_one_request(params, f_max_from_si)
|
_check_one_request(params, f_max_from_si)
|
||||||
requests_list.append(PathRequest(**params))
|
requests_list.append(PathRequest(**params))
|
||||||
return requests_list
|
return requests_list
|
||||||
|
|
||||||
|
|
||||||
def _check_one_request(params, f_max_from_si):
|
def _check_one_request(params: dict, f_max_from_si: float):
|
||||||
"""Checks that the requested parameters are consistant (spacing vs nb channel vs transponder mode...)"""
|
"""Checks that the requested parameters are consistant (spacing vs nb channel vs transponder mode...)"""
|
||||||
f_min = params['f_min']
|
f_min = params['f_min']
|
||||||
f_max = params['f_max']
|
f_max = params['f_max']
|
||||||
@@ -659,7 +778,7 @@ def _check_one_request(params, f_max_from_si):
|
|||||||
raise ServiceError(msg)
|
raise ServiceError(msg)
|
||||||
# Transponder mode already selected; will it fit to the requested bandwidth?
|
# Transponder mode already selected; will it fit to the requested bandwidth?
|
||||||
if params['trx_mode'] is not None and params['effective_freq_slot'] is not None:
|
if params['trx_mode'] is not None and params['effective_freq_slot'] is not None:
|
||||||
required_nb_of_channels, requested_m = compute_spectrum_slot_vs_bandwidth(params['path_bandwidth'],
|
required_nb_of_channels, _ = compute_spectrum_slot_vs_bandwidth(params['path_bandwidth'],
|
||||||
params['spacing'],
|
params['spacing'],
|
||||||
params['bit_rate'])
|
params['bit_rate'])
|
||||||
_, per_channel_m = compute_spectrum_slot_vs_bandwidth(params['bit_rate'],
|
_, per_channel_m = compute_spectrum_slot_vs_bandwidth(params['bit_rate'],
|
||||||
@@ -700,7 +819,7 @@ def _check_one_request(params, f_max_from_si):
|
|||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
|
|
||||||
def disjunctions_from_json(json_data):
|
def disjunctions_from_json(json_data: dict) -> List[Disjunction]:
|
||||||
"""reads the disjunction requests from the json dict and create the list
|
"""reads the disjunction requests from the json dict and create the list
|
||||||
of requested disjunctions for this set of requests
|
of requested disjunctions for this set of requests
|
||||||
"""
|
"""
|
||||||
@@ -719,12 +838,22 @@ def disjunctions_from_json(json_data):
|
|||||||
|
|
||||||
|
|
||||||
def convert_service_sheet(
|
def convert_service_sheet(
|
||||||
input_filename,
|
input_filename: Path,
|
||||||
eqpt,
|
eqpt: dict,
|
||||||
network,
|
network: DiGraph,
|
||||||
network_filename=None,
|
network_filename: Union[Path, None] = None,
|
||||||
output_filename='',
|
output_filename: str = '',
|
||||||
bidir=False):
|
bidir: bool = False):
|
||||||
|
"""Converts xls into json format services
|
||||||
|
|
||||||
|
:param input_filename: xls(x) file containing the service sheet
|
||||||
|
:param eqpt: equipment library
|
||||||
|
:param network: network for which these services apply (required for xls inputs to correct names)
|
||||||
|
:param network_filename: optional network file name that was used for network creation
|
||||||
|
(required for xls inputs to correct names)
|
||||||
|
:param output_filename: name of the file where converted data are savec
|
||||||
|
:param bidir: set all services bidir attribute with this bool
|
||||||
|
"""
|
||||||
if output_filename == '':
|
if output_filename == '':
|
||||||
output_filename = f'{str(input_filename)[0:len(str(input_filename)) - len(str(input_filename.suffixes[0]))]}_services.json'
|
output_filename = f'{str(input_filename)[0:len(str(input_filename)) - len(str(input_filename.suffixes[0]))]}_services.json'
|
||||||
data = read_service_sheet(input_filename, eqpt, network, network_filename, bidir)
|
data = read_service_sheet(input_filename, eqpt, network, network_filename, bidir)
|
||||||
@@ -732,7 +861,7 @@ def convert_service_sheet(
|
|||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
def find_equalisation(params, equalization_types):
|
def find_equalisation(params: Dict, equalization_types: List[str]):
|
||||||
"""Find the equalization(s) defined in params. params can be a dict or a Roadm object.
|
"""Find the equalization(s) defined in params. params can be a dict or a Roadm object.
|
||||||
|
|
||||||
>>> roadm = {'add_drop_osnr': 100, 'pmd': 1, 'pdl': 0.5,
|
>>> roadm = {'add_drop_osnr': 100, 'pmd': 1, 'pdl': 0.5,
|
||||||
@@ -749,7 +878,7 @@ def find_equalisation(params, equalization_types):
|
|||||||
return equalization
|
return equalization
|
||||||
|
|
||||||
|
|
||||||
def merge_equalization(params, extra_params):
|
def merge_equalization(params: dict, extra_params: dict) -> Union[dict, None]:
|
||||||
"""params contains ROADM element config and extra_params default values from equipment library.
|
"""params contains ROADM element config and extra_params default values from equipment library.
|
||||||
If equalization is not defined in ROADM element use the one defined in equipment library.
|
If equalization is not defined in ROADM element use the one defined in equipment library.
|
||||||
Only one type of equalization must be defined: power (target_pch_out_db) or PSD (target_psd_out_mWperGHz)
|
Only one type of equalization must be defined: power (target_pch_out_db) or PSD (target_psd_out_mWperGHz)
|
||||||
|
|||||||
@@ -11,105 +11,150 @@ Yang model for requesting path computation.
|
|||||||
See: draft-ietf-teas-yang-path-computation-01.txt
|
See: draft-ietf-teas-yang-path-computation-01.txt
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from xlrd import open_workbook, XL_CELL_EMPTY
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Dict, List
|
||||||
|
from networkx import DiGraph
|
||||||
|
from xlrd import open_workbook, XL_CELL_EMPTY
|
||||||
|
|
||||||
from gnpy.core.utils import db2lin
|
from gnpy.core.utils import db2lin
|
||||||
from gnpy.core.exceptions import ServiceError
|
from gnpy.core.exceptions import ServiceError
|
||||||
from gnpy.core.elements import Transceiver, Roadm, Edfa, Fiber
|
from gnpy.core.elements import Transceiver, Roadm, Edfa, Fiber
|
||||||
from gnpy.tools.convert import corresp_names, corresp_next_node
|
from gnpy.tools.convert import corresp_names, corresp_next_node, all_rows
|
||||||
|
|
||||||
SERVICES_COLUMN = 12
|
SERVICES_COLUMN = 12
|
||||||
|
|
||||||
|
|
||||||
def all_rows(sheet, start=0):
|
|
||||||
return (sheet.row(x) for x in range(start, sheet.nrows))
|
|
||||||
|
|
||||||
|
|
||||||
logger = getLogger(__name__)
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class Request(namedtuple('Request', 'request_id source destination trx_type mode \
|
class Request(namedtuple('request_param', 'request_id source destination trx_type mode \
|
||||||
spacing power nb_channel disjoint_from nodes_list is_loose path_bandwidth')):
|
spacing power nb_channel disjoint_from nodes_list is_loose path_bandwidth')):
|
||||||
def __new__(cls, request_id, source, destination, trx_type, mode=None, spacing=None, power=None, nb_channel=None, disjoint_from='', nodes_list=None, is_loose='', path_bandwidth=None):
|
"""DATA class for a request.
|
||||||
return super().__new__(cls, request_id, source, destination, trx_type, mode, spacing, power, nb_channel, disjoint_from, nodes_list, is_loose, path_bandwidth)
|
|
||||||
|
:params request_id (int): The unique identifier for the request.
|
||||||
|
:params source (str): The source node for the communication.
|
||||||
|
:params destination (str): The destination node for the communication.
|
||||||
|
:params trx_type (str): The type of transmission for the communication.
|
||||||
|
:params mode (str, optional): The mode of transmission. Defaults to None.
|
||||||
|
:params spacing (float, optional): The spacing between channels. Defaults to None.
|
||||||
|
:params power (float, optional): The power level for the communication. Defaults to None.
|
||||||
|
:params nb_channel (int, optional): The number of channels required for the communication. Defaults to None.
|
||||||
|
:params disjoint_from (str, optional): The node to be disjoint from. Defaults to ''.
|
||||||
|
:params nodes_list (list, optional): The list of nodes involved in the communication. Defaults to None.
|
||||||
|
:params is_loose (str, optional): Indicates if the communication is loose. Defaults to ''.
|
||||||
|
:params path_bandwidth (float, optional): The bandwidth required for the communication. Defaults to None.
|
||||||
|
"""
|
||||||
|
def __new__(cls, request_id, source, destination, trx_type, mode=None, spacing=None, power=None, nb_channel=None,
|
||||||
|
disjoint_from='', nodes_list=None, is_loose='', path_bandwidth=None):
|
||||||
|
return super().__new__(cls, request_id, source, destination, trx_type, mode, spacing, power, nb_channel,
|
||||||
|
disjoint_from, nodes_list, is_loose, path_bandwidth)
|
||||||
|
|
||||||
|
|
||||||
class Element:
|
class Element:
|
||||||
|
"""
|
||||||
|
"""
|
||||||
|
def __init__(self, uid):
|
||||||
|
self.uid = uid
|
||||||
|
|
||||||
def __eq__(self, other):
|
def __eq__(self, other):
|
||||||
return type(self) == type(other) and self.uid == other.uid
|
return isinstance(other, type(self)) and self.uid == other.ui
|
||||||
|
|
||||||
def __hash__(self):
|
def __hash__(self):
|
||||||
return hash((type(self), self.uid))
|
return hash((type(self), self.uid))
|
||||||
|
|
||||||
|
|
||||||
class Request_element(Element):
|
class Request_element(Element):
|
||||||
def __init__(self, Request, equipment, bidir):
|
"""Class that generate the request in the json format
|
||||||
|
|
||||||
|
:params request_param (Request): The request object containing the information for the element.
|
||||||
|
:params equipment (dict): The equipment configuration for the communication.
|
||||||
|
:params bidir (bool): Indicates if the communication is bidirectional.
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
request_id (str): The unique identifier for the request.
|
||||||
|
source (str): The source node for the communication.
|
||||||
|
destination (str): The destination node for the communication.
|
||||||
|
srctpid (str): The source TP ID for the communication.
|
||||||
|
dsttpid (str): The destination TP ID for the communication.
|
||||||
|
bidir (bool): Indicates if the communication is bidirectional.
|
||||||
|
trx_type (str): The type of transmission for the communication.
|
||||||
|
mode (str): The mode of transmission for the communication.
|
||||||
|
spacing (float): The spacing between channels for the communication.
|
||||||
|
power (float): The power level for the communication.
|
||||||
|
nb_channel (int): The number of channels required for the communication.
|
||||||
|
disjoint_from (list): The list of nodes to be disjoint from.
|
||||||
|
nodes_list (list): The list of nodes involved in the communication.
|
||||||
|
loose (str): Indicates if the communication is loose or strict.
|
||||||
|
path_bandwidth (float): The bandwidth required for the communication.
|
||||||
|
"""
|
||||||
|
def __init__(self, request_param: Request, equipment: Dict, bidir: bool):
|
||||||
|
"""
|
||||||
|
"""
|
||||||
|
super().__init__(uid=request_param.request_id)
|
||||||
# request_id is str
|
# request_id is str
|
||||||
# excel has automatic number formatting that adds .0 on integer values
|
# excel has automatic number formatting that adds .0 on integer values
|
||||||
# the next lines recover the pure int value, assuming this .0 is unwanted
|
# the next lines recover the pure int value, assuming this .0 is unwanted
|
||||||
self.request_id = correct_xlrd_int_to_str_reading(Request.request_id)
|
self.request_id = correct_xlrd_int_to_str_reading(request_param.request_id)
|
||||||
self.source = f'trx {Request.source}'
|
self.source = f'trx {request_param.source}'
|
||||||
self.destination = f'trx {Request.destination}'
|
self.destination = f'trx {request_param.destination}'
|
||||||
# TODO: the automatic naming generated by excel parser requires that source and dest name
|
# TODO: the automatic naming generated by excel parser requires that source and dest name
|
||||||
# be a string starting with 'trx' : this is manually added here.
|
# be a string starting with 'trx' : this is manually added here.
|
||||||
self.srctpid = f'trx {Request.source}'
|
self.srctpid = f'trx {request_param.source}'
|
||||||
self.dsttpid = f'trx {Request.destination}'
|
self.dsttpid = f'trx {request_param.destination}'
|
||||||
self.bidir = bidir
|
self.bidir = bidir
|
||||||
# test that trx_type belongs to eqpt_config.json
|
# test that trx_type belongs to eqpt_config.json
|
||||||
# if not replace it with a default
|
# if not replace it with a default
|
||||||
try:
|
try:
|
||||||
if equipment['Transceiver'][Request.trx_type]:
|
if equipment['Transceiver'][request_param.trx_type]:
|
||||||
self.trx_type = correct_xlrd_int_to_str_reading(Request.trx_type)
|
self.trx_type = correct_xlrd_int_to_str_reading(request_param.trx_type)
|
||||||
if Request.mode is not None:
|
if request_param.mode is not None:
|
||||||
Requestmode = correct_xlrd_int_to_str_reading(Request.mode)
|
request_mode = correct_xlrd_int_to_str_reading(request_param.mode)
|
||||||
if [mode for mode in equipment['Transceiver'][Request.trx_type].mode if mode['format'] == Requestmode]:
|
if [mode for mode in equipment['Transceiver'][request_param.trx_type].mode
|
||||||
self.mode = Requestmode
|
if mode['format'] == request_mode]:
|
||||||
|
self.mode = request_mode
|
||||||
else:
|
else:
|
||||||
msg = f'Request Id: {self.request_id} - could not find tsp : \'{Request.trx_type}\' ' \
|
msg = f'Request Id: {self.request_id} - could not find tsp : \'{request_param.trx_type}\' ' \
|
||||||
+ f'with mode: \'{Requestmode}\' in eqpt library \nComputation stopped.'
|
+ f'with mode: \'{request_mode}\' in eqpt library \nComputation stopped.'
|
||||||
raise ServiceError(msg)
|
raise ServiceError(msg)
|
||||||
else:
|
else:
|
||||||
Requestmode = None
|
request_mode = None
|
||||||
self.mode = Request.mode
|
self.mode = request_param.mode
|
||||||
except KeyError:
|
except KeyError as e:
|
||||||
msg = f'Request Id: {self.request_id} - could not find tsp : \'{Request.trx_type}\' ' \
|
msg = f'Request Id: {self.request_id} - could not find tsp : \'{request_param.trx_type}\' with mode: ' \
|
||||||
+ f'with mode: \'{Request.mode}\' in eqpt library \nComputation stopped.'
|
+ f'\'{request_param.mode}\' in eqpt library \nComputation stopped.'
|
||||||
raise ServiceError(msg)
|
raise ServiceError(msg) from e
|
||||||
# excel input are in GHz and dBm
|
# excel input are in GHz and dBm
|
||||||
if Request.spacing is not None:
|
if request_param.spacing is not None:
|
||||||
self.spacing = Request.spacing * 1e9
|
self.spacing = request_param.spacing * 1e9
|
||||||
else:
|
else:
|
||||||
msg = f'Request {self.request_id} missing spacing: spacing is mandatory.\ncomputation stopped'
|
msg = f'Request {self.request_id} missing spacing: spacing is mandatory.\ncomputation stopped'
|
||||||
raise ServiceError(msg)
|
raise ServiceError(msg)
|
||||||
if Request.power is not None:
|
|
||||||
self.power = db2lin(Request.power) * 1e-3
|
|
||||||
else:
|
|
||||||
self.power = None
|
self.power = None
|
||||||
if Request.nb_channel is not None:
|
if request_param.power is not None:
|
||||||
self.nb_channel = int(Request.nb_channel)
|
self.power = db2lin(request_param.power) * 1e-3
|
||||||
else:
|
|
||||||
self.nb_channel = None
|
self.nb_channel = None
|
||||||
|
if request_param.nb_channel is not None:
|
||||||
|
self.nb_channel = int(request_param.nb_channel)
|
||||||
|
|
||||||
value = correct_xlrd_int_to_str_reading(Request.disjoint_from)
|
value = correct_xlrd_int_to_str_reading(request_param.disjoint_from)
|
||||||
self.disjoint_from = [n for n in value.split(' | ') if value]
|
self.disjoint_from = [n for n in value.split(' | ') if value]
|
||||||
self.nodes_list = []
|
self.nodes_list = []
|
||||||
if Request.nodes_list:
|
if request_param.nodes_list:
|
||||||
self.nodes_list = Request.nodes_list.split(' | ')
|
self.nodes_list = request_param.nodes_list.split(' | ')
|
||||||
self.loose = 'LOOSE'
|
self.loose = 'LOOSE'
|
||||||
if Request.is_loose.lower() == 'no':
|
if request_param.is_loose.lower() == 'no':
|
||||||
self.loose = 'STRICT'
|
self.loose = 'STRICT'
|
||||||
self.path_bandwidth = None
|
|
||||||
if Request.path_bandwidth is not None:
|
|
||||||
self.path_bandwidth = Request.path_bandwidth * 1e9
|
|
||||||
else:
|
|
||||||
self.path_bandwidth = 0
|
self.path_bandwidth = 0
|
||||||
|
if request_param.path_bandwidth is not None:
|
||||||
uid = property(lambda self: repr(self))
|
self.path_bandwidth = request_param.path_bandwidth * 1e9
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def pathrequest(self):
|
def pathrequest(self):
|
||||||
|
"""Creates json dictionnary for the request
|
||||||
|
"""
|
||||||
# Default assumption for bidir is False
|
# Default assumption for bidir is False
|
||||||
req_dictionnary = {
|
req_dictionnary = {
|
||||||
'request-id': self.request_id,
|
'request-id': self.request_id,
|
||||||
@@ -152,29 +197,32 @@ class Request_element(Element):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def pathsync(self):
|
def pathsync(self):
|
||||||
|
"""Creates json dictionnary for disjunction list (synchronization vector)
|
||||||
|
"""
|
||||||
if self.disjoint_from:
|
if self.disjoint_from:
|
||||||
return {'synchronization-id': self.request_id,
|
return {'synchronization-id': self.request_id,
|
||||||
'svec': {
|
'svec': {
|
||||||
'relaxable': 'false',
|
'relaxable': 'false',
|
||||||
'disjointness': 'node link',
|
'disjointness': 'node link',
|
||||||
'request-id-number': [self.request_id] + [n for n in self.disjoint_from]
|
'request-id-number': [self.request_id] + list(self.disjoint_from)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else:
|
|
||||||
return None
|
return None
|
||||||
# TO-DO: avoid multiple entries with same synchronisation vectors
|
# TO-DO: avoid multiple entries with same synchronisation vectors
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def json(self):
|
def json(self):
|
||||||
|
"""Returns the json dictionnary for requests and for synchronisation vector
|
||||||
|
"""
|
||||||
return self.pathrequest, self.pathsync
|
return self.pathrequest, self.pathsync
|
||||||
|
|
||||||
|
|
||||||
def read_service_sheet(
|
def read_service_sheet(
|
||||||
input_filename,
|
input_filename: Path,
|
||||||
eqpt,
|
eqpt: Dict,
|
||||||
network,
|
network: DiGraph,
|
||||||
network_filename=None,
|
network_filename: Path = None,
|
||||||
bidir=False):
|
bidir: bool = False) -> Dict:
|
||||||
""" converts a service sheet into a json structure
|
""" converts a service sheet into a json structure
|
||||||
"""
|
"""
|
||||||
if network_filename is None:
|
if network_filename is None:
|
||||||
@@ -184,19 +232,16 @@ def read_service_sheet(
|
|||||||
req = correct_xls_route_list(network_filename, network, req)
|
req = correct_xls_route_list(network_filename, network, req)
|
||||||
# if there is no sync vector , do not write any synchronization
|
# if there is no sync vector , do not write any synchronization
|
||||||
synchro = [n.json[1] for n in req if n.json[1] is not None]
|
synchro = [n.json[1] for n in req if n.json[1] is not None]
|
||||||
|
data = {'path-request': [n.json[0] for n in req]}
|
||||||
if synchro:
|
if synchro:
|
||||||
data = {
|
data['synchronization'] = synchro
|
||||||
'path-request': [n.json[0] for n in req],
|
|
||||||
'synchronization': synchro
|
|
||||||
}
|
|
||||||
else:
|
|
||||||
data = {
|
|
||||||
'path-request': [n.json[0] for n in req]
|
|
||||||
}
|
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
def correct_xlrd_int_to_str_reading(v):
|
def correct_xlrd_int_to_str_reading(v):
|
||||||
|
"""Utils: ensure that int values in id are read as strings containing the int and
|
||||||
|
do not use the automatic float conversion from xlrd
|
||||||
|
"""
|
||||||
if not isinstance(v, str):
|
if not isinstance(v, str):
|
||||||
value = str(int(v))
|
value = str(int(v))
|
||||||
if value.endswith('.0'):
|
if value.endswith('.0'):
|
||||||
@@ -206,22 +251,27 @@ def correct_xlrd_int_to_str_reading(v):
|
|||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
def parse_row(row, fieldnames):
|
def parse_row(row: List, fieldnames: List[str]) -> Dict:
|
||||||
|
"""Reads each values in a row and creates a dict using field names
|
||||||
|
"""
|
||||||
return {f: r.value for f, r in zip(fieldnames, row[0:SERVICES_COLUMN])
|
return {f: r.value for f, r in zip(fieldnames, row[0:SERVICES_COLUMN])
|
||||||
if r.ctype != XL_CELL_EMPTY}
|
if r.ctype != XL_CELL_EMPTY}
|
||||||
|
|
||||||
|
|
||||||
def parse_excel(input_filename):
|
def parse_excel(input_filename: Path) -> List[Request]:
|
||||||
|
"""Opens xls_file and reads 'Service' sheet
|
||||||
|
Returns the list of services data in Request class
|
||||||
|
"""
|
||||||
with open_workbook(input_filename) as wb:
|
with open_workbook(input_filename) as wb:
|
||||||
service_sheet = wb.sheet_by_name('Service')
|
service_sheet = wb.sheet_by_name('Service')
|
||||||
services = list(parse_service_sheet(service_sheet))
|
services = list(parse_service_sheet(service_sheet))
|
||||||
return services
|
return services
|
||||||
|
|
||||||
|
|
||||||
def parse_service_sheet(service_sheet):
|
def parse_service_sheet(service_sheet) -> Request:
|
||||||
""" reads each column according to authorized fieldnames. order is not important.
|
""" reads each column according to authorized fieldnames. order is not important.
|
||||||
"""
|
"""
|
||||||
logger.debug(f'Validating headers on {service_sheet.name!r}')
|
logger.debug('Validating headers on %r', service_sheet.name)
|
||||||
# add a test on field to enable the '' field case that arises when columns on the
|
# add a test on field to enable the '' field case that arises when columns on the
|
||||||
# right hand side are used as comments or drawing in the excel sheet
|
# right hand side are used as comments or drawing in the excel sheet
|
||||||
header = [x.value.strip() for x in service_sheet.row(4)[0:SERVICES_COLUMN]
|
header = [x.value.strip() for x in service_sheet.row(4)[0:SERVICES_COLUMN]
|
||||||
@@ -239,14 +289,52 @@ def parse_service_sheet(service_sheet):
|
|||||||
'routing: is loose?': 'is_loose', 'path bandwidth': 'path_bandwidth'}
|
'routing: is loose?': 'is_loose', 'path bandwidth': 'path_bandwidth'}
|
||||||
try:
|
try:
|
||||||
service_fieldnames = [authorized_fieldnames[e] for e in header]
|
service_fieldnames = [authorized_fieldnames[e] for e in header]
|
||||||
except KeyError:
|
except KeyError as e:
|
||||||
msg = f'Malformed header on Service sheet: {header} field not in {authorized_fieldnames}'
|
msg = f'Malformed header on Service sheet: {header} field not in {authorized_fieldnames}'
|
||||||
raise ValueError(msg)
|
raise ValueError(msg) from e
|
||||||
for row in all_rows(service_sheet, start=5):
|
for row in all_rows(service_sheet, start=5):
|
||||||
yield Request(**parse_row(row[0:SERVICES_COLUMN], service_fieldnames))
|
yield Request(**parse_row(row[0:SERVICES_COLUMN], service_fieldnames))
|
||||||
|
|
||||||
|
|
||||||
def correct_xls_route_list(network_filename, network, pathreqlist):
|
def check_end_points(pathreq: Request_element, network: DiGraph):
|
||||||
|
"""Raise error if end point is not correct
|
||||||
|
"""
|
||||||
|
transponders = [n.uid for n in network.nodes() if isinstance(n, Transceiver)]
|
||||||
|
if pathreq.source not in transponders:
|
||||||
|
msg = f'Request: {pathreq.request_id}: could not find' +\
|
||||||
|
f' transponder source : {pathreq.source}.'
|
||||||
|
logger.critical(msg)
|
||||||
|
raise ServiceError(msg)
|
||||||
|
if pathreq.destination not in transponders:
|
||||||
|
msg = f'Request: {pathreq.request_id}: could not find' +\
|
||||||
|
f' transponder destination: {pathreq.destination}.'
|
||||||
|
logger.critical(msg)
|
||||||
|
raise ServiceError(msg)
|
||||||
|
|
||||||
|
|
||||||
|
def find_node_sugestion(n_id, corresp_roadm, corresp_fused, corresp_ila, network):
|
||||||
|
"""
|
||||||
|
"""
|
||||||
|
roadmtype = [n.uid for n in network.nodes() if isinstance(n, Roadm)]
|
||||||
|
edfatype = [n.uid for n in network.nodes() if isinstance(n, Edfa)]
|
||||||
|
# check that n_id is in the node list, if not find a correspondance name
|
||||||
|
if n_id in roadmtype + edfatype:
|
||||||
|
return [n_id]
|
||||||
|
# checks first roadm, fused, and ila in this order, because ila automatic name
|
||||||
|
# contains roadm names. If it is a fused node, next ila names might be correct
|
||||||
|
# suggestions, especially if following fibers were splitted and ila names
|
||||||
|
# created with the name of the fused node
|
||||||
|
if n_id in corresp_roadm.keys():
|
||||||
|
return corresp_roadm[n_id]
|
||||||
|
if n_id in corresp_fused.keys():
|
||||||
|
return corresp_fused[n_id] + corresp_ila[n_id]
|
||||||
|
if n_id in corresp_ila.keys():
|
||||||
|
return corresp_ila[n_id]
|
||||||
|
return []
|
||||||
|
|
||||||
|
|
||||||
|
def correct_xls_route_list(network_filename: Path, network: DiGraph,
|
||||||
|
pathreqlist: List[Request_element]) -> List[Request_element]:
|
||||||
""" prepares the format of route list of nodes to be consistant with nodes names:
|
""" prepares the format of route list of nodes to be consistant with nodes names:
|
||||||
remove wrong names, find correct names for ila, roadm and fused if the entry was
|
remove wrong names, find correct names for ila, roadm and fused if the entry was
|
||||||
xls.
|
xls.
|
||||||
@@ -260,30 +348,17 @@ def correct_xls_route_list(network_filename, network, pathreqlist):
|
|||||||
corresp_ila, next_node = corresp_next_node(network, corresp_ila, corresp_roadm)
|
corresp_ila, next_node = corresp_next_node(network, corresp_ila, corresp_roadm)
|
||||||
# finally correct constraints based on these dict
|
# finally correct constraints based on these dict
|
||||||
trxfibertype = [n.uid for n in network.nodes() if isinstance(n, (Transceiver, Fiber))]
|
trxfibertype = [n.uid for n in network.nodes() if isinstance(n, (Transceiver, Fiber))]
|
||||||
roadmtype = [n.uid for n in network.nodes() if isinstance(n, Roadm)]
|
|
||||||
edfatype = [n.uid for n in network.nodes() if isinstance(n, Edfa)]
|
|
||||||
# TODO there is a problem of identification of fibers in case of parallel
|
# TODO there is a problem of identification of fibers in case of parallel
|
||||||
# fibers between two adjacent roadms so fiber constraint is not supported
|
# fibers between two adjacent roadms so fiber constraint is not supported
|
||||||
transponders = [n.uid for n in network.nodes() if isinstance(n, Transceiver)]
|
|
||||||
for pathreq in pathreqlist:
|
for pathreq in pathreqlist:
|
||||||
# first check that source and dest are transceivers
|
# first check that source and dest are transceivers
|
||||||
if pathreq.source not in transponders:
|
check_end_points(pathreq, network)
|
||||||
msg = f'Request: {pathreq.request_id}: could not find' +\
|
|
||||||
f' transponder source : {pathreq.source}.'
|
|
||||||
raise ServiceError(msg)
|
|
||||||
|
|
||||||
if pathreq.destination not in transponders:
|
|
||||||
msg = f'Request: {pathreq.request_id}: could not find' +\
|
|
||||||
f' transponder destination: {pathreq.destination}.'
|
|
||||||
raise ServiceError(msg)
|
|
||||||
# silently pop source and dest nodes from the list if they were added by the user as first
|
# silently pop source and dest nodes from the list if they were added by the user as first
|
||||||
# and last elem in the constraints respectively. Other positions must lead to an error
|
# and last elem in the constraints respectively. Other positions must lead to an error
|
||||||
# caught later on
|
# caught later on
|
||||||
if pathreq.nodes_list and pathreq.source == pathreq.nodes_list[0]:
|
if pathreq.nodes_list and pathreq.source == pathreq.nodes_list[0]:
|
||||||
pathreq.loose_list.pop(0)
|
|
||||||
pathreq.nodes_list.pop(0)
|
pathreq.nodes_list.pop(0)
|
||||||
if pathreq.nodes_list and pathreq.destination == pathreq.nodes_list[-1]:
|
if pathreq.nodes_list and pathreq.destination == pathreq.nodes_list[-1]:
|
||||||
pathreq.loose_list.pop(-1)
|
|
||||||
pathreq.nodes_list.pop(-1)
|
pathreq.nodes_list.pop(-1)
|
||||||
# Then process user defined constraints with respect to automatic namings
|
# Then process user defined constraints with respect to automatic namings
|
||||||
temp = deepcopy(pathreq)
|
temp = deepcopy(pathreq)
|
||||||
@@ -293,73 +368,56 @@ def correct_xls_route_list(network_filename, network, pathreqlist):
|
|||||||
# n_id must not be a transceiver and must not be a fiber (non supported, user
|
# n_id must not be a transceiver and must not be a fiber (non supported, user
|
||||||
# can not enter fiber names in excel)
|
# can not enter fiber names in excel)
|
||||||
if n_id not in trxfibertype:
|
if n_id not in trxfibertype:
|
||||||
# check that n_id is in the node list, if not find a correspondance name
|
nodes_suggestion = find_node_sugestion(n_id, corresp_roadm, corresp_fused, corresp_ila, network)
|
||||||
if n_id in roadmtype + edfatype:
|
|
||||||
nodes_suggestion = [n_id]
|
|
||||||
else:
|
|
||||||
# checks first roadm, fused, and ila in this order, because ila automatic name
|
|
||||||
# contain roadm names. If it is a fused node, next ila names might be correct
|
|
||||||
# suggestions, especially if following fibers were splitted and ila names
|
|
||||||
# created with the name of the fused node
|
|
||||||
if n_id in corresp_roadm.keys():
|
|
||||||
nodes_suggestion = corresp_roadm[n_id]
|
|
||||||
elif n_id in corresp_fused.keys():
|
|
||||||
nodes_suggestion = corresp_fused[n_id] + corresp_ila[n_id]
|
|
||||||
elif n_id in corresp_ila.keys():
|
|
||||||
nodes_suggestion = corresp_ila[n_id]
|
|
||||||
else:
|
|
||||||
nodes_suggestion = []
|
|
||||||
if nodes_suggestion:
|
|
||||||
try:
|
try:
|
||||||
if len(nodes_suggestion) > 1:
|
if len(nodes_suggestion) > 1:
|
||||||
# if there is more than one suggestion, we need to choose the direction
|
# if there is more than one suggestion, we need to choose the direction
|
||||||
# we rely on the next node provided by the user for this purpose
|
# we rely on the next node provided by the user for this purpose
|
||||||
new_n = next(n for n in nodes_suggestion
|
new_n = next(n for n in nodes_suggestion
|
||||||
if n in next_node.keys() and next_node[n]
|
if n in next_node
|
||||||
in temp.nodes_list[i:] + [pathreq.destination] and
|
and next_node[n] in temp.nodes_list[i:] + [pathreq.destination]
|
||||||
next_node[n] not in temp.nodes_list[:i])
|
and next_node[n] not in temp.nodes_list[:i])
|
||||||
else:
|
elif len(nodes_suggestion) == 1:
|
||||||
new_n = nodes_suggestion[0]
|
new_n = nodes_suggestion[0]
|
||||||
|
else:
|
||||||
|
if temp.loose == 'LOOSE':
|
||||||
|
# if no matching can be found in the network just ignore this constraint
|
||||||
|
# if it is a loose constraint
|
||||||
|
# warns the user that this node is not part of the topology
|
||||||
|
msg = f'{pathreq.request_id}: Invalid node specified:\n\t\'{n_id}\'' \
|
||||||
|
+ ', could not use it as constraint, skipped!'
|
||||||
|
print(msg)
|
||||||
|
logger.info(msg)
|
||||||
|
pathreq.nodes_list.remove(n_id)
|
||||||
|
continue
|
||||||
|
msg = f'{pathreq.request_id}: Could not find node:\n\t\'{n_id}\' in network' \
|
||||||
|
+ ' topology. Strict constraint can not be applied.'
|
||||||
|
raise ServiceError(msg)
|
||||||
if new_n != n_id:
|
if new_n != n_id:
|
||||||
# warns the user when the correct name is used only in verbose mode,
|
# warns the user when the correct name is used only in verbose mode,
|
||||||
# eg 'a' is a roadm and correct name is 'roadm a' or when there was
|
# eg 'a' is a roadm and correct name is 'roadm a' or when there was
|
||||||
# too much ambiguity, 'b' is an ila, its name can be:
|
# too much ambiguity, 'b' is an ila, its name can be:
|
||||||
# Edfa0_fiber (a → b)-xx if next node is c or
|
# "east edfa in b to c", or "west edfa in b to a" if next node is c or
|
||||||
# Edfa0_fiber (c → b)-xx if next node is a
|
# "west edfa in b to c", or "east edfa in b to a" if next node is a
|
||||||
msg = f'Request {pathreq.request_id}: Invalid route node specified:' \
|
msg = f'{pathreq.request_id}: Invalid route node specified:' \
|
||||||
+ f'\n\t\'{n_id}\', replaced with \'{new_n}\''
|
+ f'\n\t\'{n_id}\', replaced with \'{new_n}\''
|
||||||
logger.warning(msg)
|
logger.info(msg)
|
||||||
pathreq.nodes_list[pathreq.nodes_list.index(n_id)] = new_n
|
pathreq.nodes_list[pathreq.nodes_list.index(n_id)] = new_n
|
||||||
except StopIteration:
|
except StopIteration:
|
||||||
# shall not come in this case, unless requested direction does not exist
|
# shall not come in this case, unless requested direction does not exist
|
||||||
msg = f'Request {pathreq.request_id}: Invalid route specified {n_id}: could' \
|
msg = f'{pathreq.request_id}: Invalid route specified {n_id}: could' \
|
||||||
+ ' not decide on direction, skipped!.\nPlease add a valid' \
|
+ ' not decide on direction, skipped!.\nPlease add a valid' \
|
||||||
+ ' direction in constraints (next neighbour node)'
|
+ ' direction in constraints (next neighbour node)'
|
||||||
|
logger.info(msg)
|
||||||
|
pathreq.nodes_list.remove(n_id)
|
||||||
|
else:
|
||||||
|
if temp.loose == 'LOOSE':
|
||||||
|
msg = f'{pathreq.request_id}: Invalid route node specified:\n\t\'{n_id}\'' \
|
||||||
|
+ ' type is not supported as constraint with xls network input, skipped!'
|
||||||
logger.warning(msg)
|
logger.warning(msg)
|
||||||
pathreq.loose_list.pop(pathreq.nodes_list.index(n_id))
|
|
||||||
pathreq.nodes_list.remove(n_id)
|
pathreq.nodes_list.remove(n_id)
|
||||||
else:
|
else:
|
||||||
if temp.loose_list[i] == 'LOOSE':
|
msg = f'{pathreq.request_id}: Invalid route node specified \n\t\'{n_id}\'' \
|
||||||
# if no matching can be found in the network just ignore this constraint
|
|
||||||
# if it is a loose constraint
|
|
||||||
# warns the user that this node is not part of the topology
|
|
||||||
msg = f'Request {pathreq.request_id}: Invalid node specified:\n\t\'{n_id}\'' \
|
|
||||||
+ ', could not use it as constraint, skipped!'
|
|
||||||
logger.warning(msg)
|
|
||||||
pathreq.loose_list.pop(pathreq.nodes_list.index(n_id))
|
|
||||||
pathreq.nodes_list.remove(n_id)
|
|
||||||
else:
|
|
||||||
msg = f'Request {pathreq.request_id}: Could not find node:\n\t\'{n_id}\' in network' \
|
|
||||||
+ ' topology. Strict constraint can not be applied.'
|
|
||||||
raise ServiceError(msg)
|
|
||||||
else:
|
|
||||||
if temp.loose_list[i] == 'LOOSE':
|
|
||||||
logger.warning(f'Request {pathreq.request_id}: Invalid route node specified:\n\t\'{n_id}\''
|
|
||||||
+ ' type is not supported as constraint with xls network input, skipped!')
|
|
||||||
pathreq.loose_list.pop(pathreq.nodes_list.index(n_id))
|
|
||||||
pathreq.nodes_list.remove(n_id)
|
|
||||||
else:
|
|
||||||
msg = f'Invalid route node specified \n\t\'{n_id}\'' \
|
|
||||||
+ ' type is not supported as constraint with xls network input,' \
|
+ ' type is not supported as constraint with xls network input,' \
|
||||||
+ ', Strict constraint can not be applied.'
|
+ ', Strict constraint can not be applied.'
|
||||||
raise ServiceError(msg)
|
raise ServiceError(msg)
|
||||||
|
|||||||
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, unique_ordered, 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
|
||||||
@@ -36,7 +39,7 @@ RequestParams = namedtuple('RequestParams', 'request_id source destination bidir
|
|||||||
' trx_mode nodes_list loose_list spacing power nb_channel f_min'
|
' trx_mode nodes_list loose_list spacing power nb_channel f_min'
|
||||||
' f_max format baud_rate OSNR penalties bit_rate'
|
' f_max format baud_rate OSNR penalties bit_rate'
|
||||||
' roll_off tx_osnr min_spacing cost path_bandwidth effective_freq_slot'
|
' roll_off tx_osnr min_spacing cost path_bandwidth effective_freq_slot'
|
||||||
' equalization_offset_db')
|
' equalization_offset_db, tx_power')
|
||||||
DisjunctionParams = namedtuple('DisjunctionParams', 'disjunction_id relaxable link_diverse'
|
DisjunctionParams = namedtuple('DisjunctionParams', 'disjunction_id relaxable link_diverse'
|
||||||
' node_diverse disjunctions_req')
|
' node_diverse disjunctions_req')
|
||||||
|
|
||||||
@@ -65,6 +68,7 @@ class PathRequest:
|
|||||||
self.bit_rate = params.bit_rate
|
self.bit_rate = params.bit_rate
|
||||||
self.roll_off = params.roll_off
|
self.roll_off = params.roll_off
|
||||||
self.tx_osnr = params.tx_osnr
|
self.tx_osnr = params.tx_osnr
|
||||||
|
self.tx_power = params.tx_power
|
||||||
self.min_spacing = params.min_spacing
|
self.min_spacing = params.min_spacing
|
||||||
self.cost = params.cost
|
self.cost = params.cost
|
||||||
self.path_bandwidth = params.path_bandwidth
|
self.path_bandwidth = params.path_bandwidth
|
||||||
@@ -96,6 +100,7 @@ class PathRequest:
|
|||||||
f'bit_rate:\t{temp2} Gb/s',
|
f'bit_rate:\t{temp2} Gb/s',
|
||||||
f'spacing:\t{self.spacing * 1e-9} GHz',
|
f'spacing:\t{self.spacing * 1e-9} GHz',
|
||||||
f'power: \t{round(lin2db(self.power) + 30, 2)} dBm',
|
f'power: \t{round(lin2db(self.power) + 30, 2)} dBm',
|
||||||
|
f'tx_power_dbm: \t{round(lin2db(self.tx_power) + 30, 2)} dBm',
|
||||||
f'nb channels: \t{self.nb_channel}',
|
f'nb channels: \t{self.nb_channel}',
|
||||||
f'path_bandwidth: \t{round(self.path_bandwidth * 1e-9, 2)} Gbit/s',
|
f'path_bandwidth: \t{round(self.path_bandwidth * 1e-9, 2)} Gbit/s',
|
||||||
f'nodes-list:\t{self.nodes_list}',
|
f'nodes-list:\t{self.nodes_list}',
|
||||||
@@ -296,7 +301,9 @@ def compute_constrained_path(network, req):
|
|||||||
nodes_list = []
|
nodes_list = []
|
||||||
for node in req.nodes_list[:-1]:
|
for node in req.nodes_list[:-1]:
|
||||||
nodes_list.append(next(el for el in network if el.uid == node))
|
nodes_list.append(next(el for el in network if el.uid == node))
|
||||||
|
total_path = explicit_path(nodes_list, source, destination, network)
|
||||||
|
if total_path is not None:
|
||||||
|
return total_path
|
||||||
try:
|
try:
|
||||||
path_generator = shortest_simple_paths(network, source, destination, weight='weight')
|
path_generator = shortest_simple_paths(network, source, destination, weight='weight')
|
||||||
total_path = next(path for path in path_generator if ispart(nodes_list, path))
|
total_path = next(path for path in path_generator if ispart(nodes_list, path))
|
||||||
@@ -330,25 +337,46 @@ 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,
|
||||||
power=req.power, spacing=req.spacing, tx_osnr=req.tx_osnr, 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 = []
|
||||||
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_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)
|
||||||
path[0].calc_penalties(req.penalties)
|
path[0].calc_penalties(req.penalties)
|
||||||
if any(isinstance(el, Roadm) for el in path):
|
roadm_osnr.append(si.tx_osnr)
|
||||||
path[-1].update_snr(si.tx_osnr, equipment['Roadm']['default'].add_drop_osnr)
|
path[-1].update_snr(*roadm_osnr)
|
||||||
else:
|
|
||||||
path[-1].update_snr(si.tx_osnr)
|
|
||||||
path[-1].calc_penalties(req.penalties)
|
path[-1].calc_penalties(req.penalties)
|
||||||
return si
|
return si
|
||||||
|
|
||||||
@@ -380,21 +408,26 @@ def propagate_and_optimize_mode(path, req, equipment):
|
|||||||
raise ServiceError(msg)
|
raise ServiceError(msg)
|
||||||
spc_info = create_input_spectral_information(f_min=req.f_min, f_max=req.f_max,
|
spc_info = create_input_spectral_information(f_min=req.f_min, f_max=req.f_max,
|
||||||
roll_off=equipment['SI']['default'].roll_off,
|
roll_off=equipment['SI']['default'].roll_off,
|
||||||
baud_rate=this_br, power=req.power, 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)
|
||||||
|
spc_info = filter_si(path, equipment, spc_info)
|
||||||
|
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_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:
|
||||||
if path[-1].snr is not None:
|
if path[-1].snr is not None:
|
||||||
path[0].update_snr(this_mode['tx_osnr'])
|
path[0].update_snr(this_mode['tx_osnr'])
|
||||||
path[0].calc_penalties(this_mode['penalties'])
|
path[0].calc_penalties(this_mode['penalties'])
|
||||||
if any(isinstance(el, Roadm) for el in path):
|
roadm_osnr.append(this_mode['tx_osnr'])
|
||||||
path[-1].update_snr(this_mode['tx_osnr'], equipment['Roadm']['default'].add_drop_osnr)
|
path[-1].update_snr(*roadm_osnr)
|
||||||
else:
|
# remove the tx_osnr from roadm_osnr list for the next iteration
|
||||||
path[-1].update_snr(this_mode['tx_osnr'])
|
del roadm_osnr[-1]
|
||||||
path[-1].calc_penalties(this_mode['penalties'])
|
path[-1].calc_penalties(this_mode['penalties'])
|
||||||
if round(min(path[-1].snr_01nm - path[-1].total_penalty), 2) \
|
if round(min(path[-1].snr_01nm - path[-1].total_penalty), 2) \
|
||||||
> this_mode['OSNR'] + equipment['SI']['default'].sys_margins:
|
> this_mode['OSNR'] + equipment['SI']['default'].sys_margins:
|
||||||
@@ -966,6 +999,7 @@ def compare_reqs(req1, req2, disjlist):
|
|||||||
req1.format == req2.format and \
|
req1.format == req2.format and \
|
||||||
req1.OSNR == req2.OSNR and \
|
req1.OSNR == req2.OSNR and \
|
||||||
req1.roll_off == req2.roll_off and \
|
req1.roll_off == req2.roll_off and \
|
||||||
|
req1.tx_power == req2.tx_power and \
|
||||||
same_disj:
|
same_disj:
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
@@ -1065,7 +1099,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 !
|
||||||
@@ -1074,6 +1108,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
|
||||||
@@ -1091,7 +1129,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)
|
||||||
@@ -1131,6 +1178,7 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
|
|||||||
pathreq.tx_osnr = mode['tx_osnr']
|
pathreq.tx_osnr = mode['tx_osnr']
|
||||||
pathreq.bit_rate = mode['bit_rate']
|
pathreq.bit_rate = mode['bit_rate']
|
||||||
pathreq.penalties = mode['penalties']
|
pathreq.penalties = mode['penalties']
|
||||||
|
pathreq.offset_db = mode['equalization_offset_db']
|
||||||
# other blocking reason should not appear at this point
|
# other blocking reason should not appear at this point
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
pathreq.baud_rate = mode['baud_rate']
|
pathreq.baud_rate = mode['baud_rate']
|
||||||
@@ -1140,6 +1188,7 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
|
|||||||
pathreq.tx_osnr = mode['tx_osnr']
|
pathreq.tx_osnr = mode['tx_osnr']
|
||||||
pathreq.bit_rate = mode['bit_rate']
|
pathreq.bit_rate = mode['bit_rate']
|
||||||
pathreq.penalties = mode['penalties']
|
pathreq.penalties = mode['penalties']
|
||||||
|
pathreq.offset_db = mode['equalization_offset_db']
|
||||||
|
|
||||||
# reversed path is needed for correct spectrum assignment
|
# reversed path is needed for correct spectrum assignment
|
||||||
reversed_path = find_reversed_path(pathlist[i])
|
reversed_path = find_reversed_path(pathlist[i])
|
||||||
@@ -1206,3 +1255,49 @@ 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 is_adjacent(oms1, oms2):
|
||||||
|
""" oms1's egress ROADM is oms2's ingress ROADM
|
||||||
|
"""
|
||||||
|
return oms1.el_list[-1] == oms2.el_list[0]
|
||||||
|
|
||||||
|
|
||||||
|
def explicit_path(node_list, source, destination, network):
|
||||||
|
""" if list of nodes leads to adjacent oms, then means that the path is explicit, and no need to compute
|
||||||
|
the function returns the explicit path (including source and destination ROADMs)
|
||||||
|
"""
|
||||||
|
path_oms = []
|
||||||
|
for elem in node_list:
|
||||||
|
if hasattr(elem, 'oms'):
|
||||||
|
path_oms.append(elem.oms)
|
||||||
|
if not path_oms:
|
||||||
|
return None
|
||||||
|
path_oms = unique_ordered(path_oms)
|
||||||
|
try:
|
||||||
|
next_node = next(network.successors(source))
|
||||||
|
source_roadm = next_node if isinstance(next_node, Roadm) else source
|
||||||
|
previous_node = next(network.predecessors(destination))
|
||||||
|
destination_roadm = previous_node if isinstance(previous_node, Roadm) else destination
|
||||||
|
if not (path_oms[0].el_list[0] == source_roadm and path_oms[-1].el_list[-1] == destination_roadm):
|
||||||
|
return None
|
||||||
|
except StopIteration:
|
||||||
|
return None
|
||||||
|
|
||||||
|
oms0 = path_oms[0]
|
||||||
|
path = [source] + oms0.el_list
|
||||||
|
for oms in path_oms[1:]:
|
||||||
|
if not is_adjacent(oms0, oms):
|
||||||
|
return None
|
||||||
|
oms0 = oms
|
||||||
|
path.extend(oms.el_list)
|
||||||
|
path.append(destination)
|
||||||
|
return unique_ordered(path)
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1203,6 +1203,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Abilene",
|
"uid": "roadm Abilene",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1226,6 +1227,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Albany",
|
"uid": "roadm Albany",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1249,6 +1251,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Albuquerque",
|
"uid": "roadm Albuquerque",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1274,6 +1277,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Atlanta",
|
"uid": "roadm Atlanta",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1298,6 +1302,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Austin",
|
"uid": "roadm Austin",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1321,6 +1326,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Baltimore",
|
"uid": "roadm Baltimore",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1345,6 +1351,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Baton_Rouge",
|
"uid": "roadm Baton_Rouge",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1368,6 +1375,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Billings",
|
"uid": "roadm Billings",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1392,6 +1400,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Birmingham",
|
"uid": "roadm Birmingham",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1416,6 +1425,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Bismarck",
|
"uid": "roadm Bismarck",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1439,6 +1449,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Boston",
|
"uid": "roadm Boston",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1462,6 +1473,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Buffalo",
|
"uid": "roadm Buffalo",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1485,6 +1497,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Charleston",
|
"uid": "roadm Charleston",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1508,6 +1521,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Charlotte",
|
"uid": "roadm Charlotte",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1531,6 +1545,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Chicago",
|
"uid": "roadm Chicago",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1555,6 +1570,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Cincinnati",
|
"uid": "roadm Cincinnati",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1579,6 +1595,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Cleveland",
|
"uid": "roadm Cleveland",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1603,6 +1620,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Columbus",
|
"uid": "roadm Columbus",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1627,6 +1645,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Dallas",
|
"uid": "roadm Dallas",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1653,6 +1672,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Denver",
|
"uid": "roadm Denver",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1678,6 +1698,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Detroit",
|
"uid": "roadm Detroit",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1701,6 +1722,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm El_Paso",
|
"uid": "roadm El_Paso",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1726,6 +1748,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Fresno",
|
"uid": "roadm Fresno",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1750,6 +1773,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Greensboro",
|
"uid": "roadm Greensboro",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1775,6 +1799,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Hartford",
|
"uid": "roadm Hartford",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1798,6 +1823,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Houston",
|
"uid": "roadm Houston",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1822,6 +1848,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Jacksonville",
|
"uid": "roadm Jacksonville",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1846,6 +1873,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Kansas_City",
|
"uid": "roadm Kansas_City",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1870,6 +1898,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Las_Vegas",
|
"uid": "roadm Las_Vegas",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1895,6 +1924,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Little_Rock",
|
"uid": "roadm Little_Rock",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1918,6 +1948,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Long_Island",
|
"uid": "roadm Long_Island",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1941,6 +1972,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Los_Angeles",
|
"uid": "roadm Los_Angeles",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1966,6 +1998,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Louisville",
|
"uid": "roadm Louisville",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -1991,6 +2024,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Memphis",
|
"uid": "roadm Memphis",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2014,6 +2048,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Miami",
|
"uid": "roadm Miami",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2038,6 +2073,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Milwaukee",
|
"uid": "roadm Milwaukee",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2061,6 +2097,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Minneapolis",
|
"uid": "roadm Minneapolis",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2085,6 +2122,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Nashville",
|
"uid": "roadm Nashville",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2109,6 +2147,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm New_Orleans",
|
"uid": "roadm New_Orleans",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2133,6 +2172,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm New_York",
|
"uid": "roadm New_York",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2159,6 +2199,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Newark",
|
"uid": "roadm Newark",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2182,6 +2223,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Norfolk",
|
"uid": "roadm Norfolk",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2205,6 +2247,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Oakland",
|
"uid": "roadm Oakland",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2231,6 +2274,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Oklahoma_City",
|
"uid": "roadm Oklahoma_City",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2254,6 +2298,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Omaha",
|
"uid": "roadm Omaha",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2278,6 +2323,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Orlando",
|
"uid": "roadm Orlando",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2301,6 +2347,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Philadelphia",
|
"uid": "roadm Philadelphia",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2325,6 +2372,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Phoenix",
|
"uid": "roadm Phoenix",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2349,6 +2397,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Pittsburgh",
|
"uid": "roadm Pittsburgh",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2373,6 +2422,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Portland",
|
"uid": "roadm Portland",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2398,6 +2448,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Providence",
|
"uid": "roadm Providence",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2421,6 +2472,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Raleigh",
|
"uid": "roadm Raleigh",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2445,6 +2497,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Richmond",
|
"uid": "roadm Richmond",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2468,6 +2521,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Rochester",
|
"uid": "roadm Rochester",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2491,6 +2545,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Sacramento",
|
"uid": "roadm Sacramento",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2514,6 +2569,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Salt_Lake_City",
|
"uid": "roadm Salt_Lake_City",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2539,6 +2595,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm San_Antonio",
|
"uid": "roadm San_Antonio",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2562,6 +2619,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm San_Diego",
|
"uid": "roadm San_Diego",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2585,6 +2643,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm San_Francisco",
|
"uid": "roadm San_Francisco",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2608,6 +2667,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm San_Jose",
|
"uid": "roadm San_Jose",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2631,6 +2691,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Santa_Barbara",
|
"uid": "roadm Santa_Barbara",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2654,6 +2715,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Scranton",
|
"uid": "roadm Scranton",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2679,6 +2741,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Seattle",
|
"uid": "roadm Seattle",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2702,6 +2765,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Spokane",
|
"uid": "roadm Spokane",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2725,6 +2789,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Springfield",
|
"uid": "roadm Springfield",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2748,6 +2813,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm St_Louis",
|
"uid": "roadm St_Louis",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2772,6 +2838,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Syracuse",
|
"uid": "roadm Syracuse",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2796,6 +2863,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Tallahassee",
|
"uid": "roadm Tallahassee",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2819,6 +2887,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Tampa",
|
"uid": "roadm Tampa",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2842,6 +2911,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Toledo",
|
"uid": "roadm Toledo",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2865,6 +2935,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Tucson",
|
"uid": "roadm Tucson",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2888,6 +2959,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Tulsa",
|
"uid": "roadm Tulsa",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2911,6 +2983,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Washington_DC",
|
"uid": "roadm Washington_DC",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2936,6 +3009,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm West_Palm_Beach",
|
"uid": "roadm West_Palm_Beach",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2959,6 +3033,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Wilmington",
|
"uid": "roadm Wilmington",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -2982,6 +3057,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Amsterdam",
|
"uid": "roadm Amsterdam",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3007,6 +3083,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Berlin",
|
"uid": "roadm Berlin",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3030,6 +3107,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Brussels",
|
"uid": "roadm Brussels",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3053,6 +3131,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Bucharest",
|
"uid": "roadm Bucharest",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3076,6 +3155,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Frankfurt",
|
"uid": "roadm Frankfurt",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3099,6 +3179,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Istanbul",
|
"uid": "roadm Istanbul",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3123,6 +3204,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm London",
|
"uid": "roadm London",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3147,6 +3229,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Madrid",
|
"uid": "roadm Madrid",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3170,6 +3253,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Paris",
|
"uid": "roadm Paris",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3194,6 +3278,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Rome",
|
"uid": "roadm Rome",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3219,6 +3304,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Vienna",
|
"uid": "roadm Vienna",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3243,6 +3329,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Warsaw",
|
"uid": "roadm Warsaw",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3267,6 +3354,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Zurich",
|
"uid": "roadm Zurich",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3290,6 +3378,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Bangkok",
|
"uid": "roadm Bangkok",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3313,6 +3402,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Beijing",
|
"uid": "roadm Beijing",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3336,6 +3426,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Delhi",
|
"uid": "roadm Delhi",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3360,6 +3451,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Hong_Kong",
|
"uid": "roadm Hong_Kong",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3385,6 +3477,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Honolulu",
|
"uid": "roadm Honolulu",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3409,6 +3502,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Mumbai",
|
"uid": "roadm Mumbai",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3433,6 +3527,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Seoul",
|
"uid": "roadm Seoul",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3456,6 +3551,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Shanghai",
|
"uid": "roadm Shanghai",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3479,6 +3575,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Singapore",
|
"uid": "roadm Singapore",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3502,6 +3599,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Sydney",
|
"uid": "roadm Sydney",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3526,6 +3624,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Taipei",
|
"uid": "roadm Taipei",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -3551,6 +3650,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Tokyo",
|
"uid": "roadm Tokyo",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
{ "Edfa":[{
|
{
|
||||||
|
"Edfa": [{
|
||||||
"type_variety": "CienaDB_medium_gain",
|
"type_variety": "CienaDB_medium_gain",
|
||||||
"type_def": "advanced_model",
|
"type_def": "advanced_model",
|
||||||
"gain_flatmax": 25,
|
"gain_flatmax": 25,
|
||||||
@@ -7,8 +8,7 @@
|
|||||||
"advanced_config_from_json": "std_medium_gain_advanced_config.json",
|
"advanced_config_from_json": "std_medium_gain_advanced_config.json",
|
||||||
"out_voa_auto": false,
|
"out_voa_auto": false,
|
||||||
"allowed_for_design": true
|
"allowed_for_design": true
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
"type_variety": "std_medium_gain",
|
"type_variety": "std_medium_gain",
|
||||||
"type_def": "variable_gain",
|
"type_def": "variable_gain",
|
||||||
"gain_flatmax": 26,
|
"gain_flatmax": 26,
|
||||||
@@ -18,8 +18,7 @@
|
|||||||
"nf_max": 10,
|
"nf_max": 10,
|
||||||
"out_voa_auto": false,
|
"out_voa_auto": false,
|
||||||
"allowed_for_design": true
|
"allowed_for_design": true
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
"type_variety": "std_low_gain",
|
"type_variety": "std_low_gain",
|
||||||
"type_def": "variable_gain",
|
"type_def": "variable_gain",
|
||||||
"gain_flatmax": 16,
|
"gain_flatmax": 16,
|
||||||
@@ -29,8 +28,7 @@
|
|||||||
"nf_max": 11,
|
"nf_max": 11,
|
||||||
"out_voa_auto": false,
|
"out_voa_auto": false,
|
||||||
"allowed_for_design": true
|
"allowed_for_design": true
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
"type_variety": "test",
|
"type_variety": "test",
|
||||||
"type_def": "variable_gain",
|
"type_def": "variable_gain",
|
||||||
"gain_flatmax": 25,
|
"gain_flatmax": 25,
|
||||||
@@ -40,8 +38,7 @@
|
|||||||
"nf_max": 10,
|
"nf_max": 10,
|
||||||
"out_voa_auto": false,
|
"out_voa_auto": false,
|
||||||
"allowed_for_design": true
|
"allowed_for_design": true
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
"type_variety": "test_fixed_gain",
|
"type_variety": "test_fixed_gain",
|
||||||
"type_def": "fixed_gain",
|
"type_def": "fixed_gain",
|
||||||
"gain_flatmax": 21,
|
"gain_flatmax": 21,
|
||||||
@@ -49,8 +46,7 @@
|
|||||||
"p_max": 21,
|
"p_max": 21,
|
||||||
"nf0": 5,
|
"nf0": 5,
|
||||||
"allowed_for_design": true
|
"allowed_for_design": true
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
"type_variety": "std_booster",
|
"type_variety": "std_booster",
|
||||||
"type_def": "fixed_gain",
|
"type_def": "fixed_gain",
|
||||||
"gain_flatmax": 21,
|
"gain_flatmax": 21,
|
||||||
@@ -82,6 +78,92 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"Roadm": [{
|
"Roadm": [{
|
||||||
|
"type_variety": "example_test",
|
||||||
|
"target_pch_out_db": -18,
|
||||||
|
"add_drop_osnr": 35,
|
||||||
|
"pmd": 1e-12,
|
||||||
|
"pdl": 0.5,
|
||||||
|
"restrictions": {
|
||||||
|
"preamp_variety_list": [],
|
||||||
|
"booster_variety_list": []
|
||||||
|
},
|
||||||
|
"roadm-path-impairments": []
|
||||||
|
}, {
|
||||||
|
"type_variety": "example_detailed_impairments",
|
||||||
|
"target_pch_out_db": -20,
|
||||||
|
"add_drop_osnr": 35,
|
||||||
|
"pmd": 0,
|
||||||
|
"pdl": 0,
|
||||||
|
"restrictions": {
|
||||||
|
"preamp_variety_list":[],
|
||||||
|
"booster_variety_list":[]
|
||||||
|
},
|
||||||
|
"roadm-path-impairments": [
|
||||||
|
{
|
||||||
|
"roadm-path-impairments-id": 0,
|
||||||
|
"roadm-express-path": [{
|
||||||
|
"frequency-range": {
|
||||||
|
"lower-frequency": 191.3e12,
|
||||||
|
"upper-frequency": 196.1e12
|
||||||
|
},
|
||||||
|
"roadm-pmd": 0,
|
||||||
|
"roadm-cd": 0,
|
||||||
|
"roadm-pdl": 0,
|
||||||
|
"roadm-inband-crosstalk": 0,
|
||||||
|
"roadm-maxloss": 16.5
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}, {
|
||||||
|
"roadm-path-impairments-id": 1,
|
||||||
|
"roadm-add-path": [{
|
||||||
|
"frequency-range": {
|
||||||
|
"lower-frequency": 191.3e12,
|
||||||
|
"upper-frequency": 196.1e12
|
||||||
|
},
|
||||||
|
"roadm-pmd": 0,
|
||||||
|
"roadm-cd": 0,
|
||||||
|
"roadm-pdl": 0,
|
||||||
|
"roadm-inband-crosstalk": 0,
|
||||||
|
"roadm-maxloss": 11.5,
|
||||||
|
"roadm-pmax": 2.5,
|
||||||
|
"roadm-osnr": 41,
|
||||||
|
"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-drop-path": [{
|
||||||
|
"frequency-range": {
|
||||||
|
"lower-frequency": 191.3e12,
|
||||||
|
"upper-frequency": 196.1e12
|
||||||
|
},
|
||||||
|
"roadm-pmd": 0,
|
||||||
|
"roadm-cd": 0,
|
||||||
|
"roadm-pdl": 0,
|
||||||
|
"roadm-inband-crosstalk": 0,
|
||||||
|
"roadm-maxloss": 11.5,
|
||||||
|
"roadm-minloss": 7.5,
|
||||||
|
"roadm-typloss": 10,
|
||||||
|
"roadm-pmin": -13.5,
|
||||||
|
"roadm-pmax": -9.5,
|
||||||
|
"roadm-ptyp": -12,
|
||||||
|
"roadm-osnr": 41,
|
||||||
|
"roadm-noise-figure": 15
|
||||||
|
}]
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"add_drop_osnr": 38,
|
"add_drop_osnr": 38,
|
||||||
"pmd": 0,
|
"pmd": 0,
|
||||||
@@ -90,8 +172,10 @@
|
|||||||
"preamp_variety_list": [],
|
"preamp_variety_list": [],
|
||||||
"booster_variety_list": []
|
"booster_variety_list": []
|
||||||
}
|
}
|
||||||
}],
|
}
|
||||||
|
],
|
||||||
"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,
|
||||||
@@ -109,8 +193,7 @@
|
|||||||
"min": 191.35e12,
|
"min": 191.35e12,
|
||||||
"max": 196.1e12
|
"max": 196.1e12
|
||||||
},
|
},
|
||||||
"mode":[
|
"mode": [{
|
||||||
{
|
|
||||||
"format": "PS_SP64_1",
|
"format": "PS_SP64_1",
|
||||||
"baud_rate": 32e9,
|
"baud_rate": 32e9,
|
||||||
"OSNR": 11,
|
"OSNR": 11,
|
||||||
@@ -119,8 +202,7 @@
|
|||||||
"tx_osnr": 100,
|
"tx_osnr": 100,
|
||||||
"min_spacing": 50e9,
|
"min_spacing": 50e9,
|
||||||
"cost": 1
|
"cost": 1
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
"format": "PS_SP64_2",
|
"format": "PS_SP64_2",
|
||||||
"baud_rate": 64e9,
|
"baud_rate": 64e9,
|
||||||
"OSNR": 15,
|
"OSNR": 15,
|
||||||
@@ -129,8 +211,7 @@
|
|||||||
"tx_osnr": 100,
|
"tx_osnr": 100,
|
||||||
"min_spacing": 75e9,
|
"min_spacing": 75e9,
|
||||||
"cost": 1
|
"cost": 1
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
"format": "mode 1",
|
"format": "mode 1",
|
||||||
"baud_rate": 32e9,
|
"baud_rate": 32e9,
|
||||||
"OSNR": 11,
|
"OSNR": 11,
|
||||||
@@ -139,8 +220,7 @@
|
|||||||
"tx_osnr": 100,
|
"tx_osnr": 100,
|
||||||
"min_spacing": 50e9,
|
"min_spacing": 50e9,
|
||||||
"cost": 1
|
"cost": 1
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
"format": "mode 2",
|
"format": "mode 2",
|
||||||
"baud_rate": 64e9,
|
"baud_rate": 64e9,
|
||||||
"OSNR": 15,
|
"OSNR": 15,
|
||||||
@@ -151,15 +231,13 @@
|
|||||||
"cost": 1
|
"cost": 1
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
"type_variety": "Voyager_16QAM",
|
"type_variety": "Voyager_16QAM",
|
||||||
"frequency": {
|
"frequency": {
|
||||||
"min": 191.35e12,
|
"min": 191.35e12,
|
||||||
"max": 196.1e12
|
"max": 196.1e12
|
||||||
},
|
},
|
||||||
"mode":[
|
"mode": [{
|
||||||
{
|
|
||||||
"format": "16QAM",
|
"format": "16QAM",
|
||||||
"baud_rate": 32e9,
|
"baud_rate": 32e9,
|
||||||
"OSNR": 19,
|
"OSNR": 19,
|
||||||
@@ -170,15 +248,13 @@
|
|||||||
"cost": 1
|
"cost": 1
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
"type_variety": "Voyager",
|
"type_variety": "Voyager",
|
||||||
"frequency": {
|
"frequency": {
|
||||||
"min": 191.35e12,
|
"min": 191.35e12,
|
||||||
"max": 196.1e12
|
"max": 196.1e12
|
||||||
},
|
},
|
||||||
"mode":[
|
"mode": [{
|
||||||
{
|
|
||||||
"format": "mode 1",
|
"format": "mode 1",
|
||||||
"baud_rate": 32e9,
|
"baud_rate": 32e9,
|
||||||
"OSNR": 12,
|
"OSNR": 12,
|
||||||
@@ -187,8 +263,7 @@
|
|||||||
"tx_osnr": 45,
|
"tx_osnr": 45,
|
||||||
"min_spacing": 50e9,
|
"min_spacing": 50e9,
|
||||||
"cost": 1
|
"cost": 1
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
"format": "mode 3",
|
"format": "mode 3",
|
||||||
"baud_rate": 44e9,
|
"baud_rate": 44e9,
|
||||||
"OSNR": 18,
|
"OSNR": 18,
|
||||||
@@ -197,8 +272,7 @@
|
|||||||
"tx_osnr": 45,
|
"tx_osnr": 45,
|
||||||
"min_spacing": 62.5e9,
|
"min_spacing": 62.5e9,
|
||||||
"cost": 1
|
"cost": 1
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
"format": "mode 2",
|
"format": "mode 2",
|
||||||
"baud_rate": 66e9,
|
"baud_rate": 66e9,
|
||||||
"OSNR": 21,
|
"OSNR": 21,
|
||||||
@@ -207,8 +281,7 @@
|
|||||||
"tx_osnr": 45,
|
"tx_osnr": 45,
|
||||||
"min_spacing": 75e9,
|
"min_spacing": 75e9,
|
||||||
"cost": 1
|
"cost": 1
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
"format": "mode 2 - fake",
|
"format": "mode 2 - fake",
|
||||||
"baud_rate": 66e9,
|
"baud_rate": 66e9,
|
||||||
"OSNR": 21,
|
"OSNR": 21,
|
||||||
@@ -217,8 +290,7 @@
|
|||||||
"tx_osnr": 45,
|
"tx_osnr": 45,
|
||||||
"min_spacing": 75e9,
|
"min_spacing": 75e9,
|
||||||
"cost": 1
|
"cost": 1
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
"format": "mode 4",
|
"format": "mode 4",
|
||||||
"baud_rate": 66e9,
|
"baud_rate": 66e9,
|
||||||
"OSNR": 16,
|
"OSNR": 16,
|
||||||
@@ -231,5 +303,4 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
}
|
||||||
BIN
tests/data/ila_constraint.xlsx
Executable file
BIN
tests/data/ila_constraint.xlsx
Executable file
Binary file not shown.
Binary file not shown.
@@ -63,6 +63,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Lannion_CAS",
|
"uid": "roadm Lannion_CAS",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "example_detailed_impairments",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -18.6,
|
"target_pch_out_db": -18.6,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -73,7 +74,14 @@
|
|||||||
"east edfa in Lannion_CAS to Corlay": -18.6,
|
"east edfa in Lannion_CAS to Corlay": -18.6,
|
||||||
"east edfa in Lannion_CAS to Morlaix": -23.0,
|
"east edfa in Lannion_CAS to Morlaix": -23.0,
|
||||||
"east edfa in Lannion_CAS to Stbrieuc": -20
|
"east edfa in Lannion_CAS to Stbrieuc": -20
|
||||||
|
},
|
||||||
|
"per_degree_impairments": [
|
||||||
|
{
|
||||||
|
"from_degree": "west edfa in Lannion_CAS to Morlaix",
|
||||||
|
"to_degree": "east edfa in Lannion_CAS to Stbrieuc",
|
||||||
|
"impairment_id": 0
|
||||||
}
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"location": {
|
"location": {
|
||||||
@@ -87,6 +95,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Lorient_KMA",
|
"uid": "roadm Lorient_KMA",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -111,6 +120,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Vannes_KBE",
|
"uid": "roadm Vannes_KBE",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -134,6 +144,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Rennes_STA",
|
"uid": "roadm Rennes_STA",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -157,6 +168,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Brest_KLA",
|
"uid": "roadm Brest_KLA",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
|
|||||||
@@ -62,7 +62,12 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"uid": "roadm Lannion_CAS",
|
"uid": "roadm Lannion_CAS",
|
||||||
|
"type_variety": "example_detailed_impairments",
|
||||||
"params": {
|
"params": {
|
||||||
|
"per_degree_impairments": [{
|
||||||
|
"from_degree": "west edfa in Lannion_CAS to Morlaix",
|
||||||
|
"impairment_id": 0,
|
||||||
|
"to_degree": "east edfa in Lannion_CAS to Stbrieuc"}],
|
||||||
"per_degree_pch_out_db": {
|
"per_degree_pch_out_db": {
|
||||||
"east edfa in Lannion_CAS to Corlay": -18.6,
|
"east edfa in Lannion_CAS to Corlay": -18.6,
|
||||||
"east edfa in Lannion_CAS to Morlaix": -23.0
|
"east edfa in Lannion_CAS to Morlaix": -23.0
|
||||||
@@ -661,7 +666,7 @@
|
|||||||
"type": "Edfa",
|
"type": "Edfa",
|
||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"tilt_target": 0
|
"tilt_target": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -677,7 +682,7 @@
|
|||||||
"type": "Edfa",
|
"type": "Edfa",
|
||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"tilt_target": 0
|
"tilt_target": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -693,7 +698,7 @@
|
|||||||
"type": "Edfa",
|
"type": "Edfa",
|
||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"tilt_target": 0
|
"tilt_target": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -709,7 +714,7 @@
|
|||||||
"type": "Edfa",
|
"type": "Edfa",
|
||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"tilt_target": 0
|
"tilt_target": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -727,7 +732,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": 20.0,
|
"gain_target": 20.0,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -761,7 +766,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -779,7 +784,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -797,7 +802,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -815,7 +820,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -833,7 +838,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -851,7 +856,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -869,7 +874,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -887,7 +892,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -905,7 +910,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -923,7 +928,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -941,7 +946,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -959,7 +964,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -978,7 +983,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": 18.0,
|
"gain_target": 18.0,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -996,7 +1001,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1014,7 +1019,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1032,7 +1037,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -159,6 +159,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Lannion_CAS",
|
"uid": "roadm Lannion_CAS",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -183,6 +184,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Lorient_KMA",
|
"uid": "roadm Lorient_KMA",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -207,6 +209,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Vannes_KBE",
|
"uid": "roadm Vannes_KBE",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -230,6 +233,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Rennes_STA",
|
"uid": "roadm Rennes_STA",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -253,6 +257,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm Brest_KLA",
|
"uid": "roadm Brest_KLA",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -276,6 +281,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm a",
|
"uid": "roadm a",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -301,6 +307,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm b",
|
"uid": "roadm b",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -326,6 +333,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm c",
|
"uid": "roadm c",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -350,6 +358,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm d",
|
"uid": "roadm d",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -373,6 +382,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm e",
|
"uid": "roadm e",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -396,6 +406,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm f",
|
"uid": "roadm f",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -420,6 +431,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm g",
|
"uid": "roadm g",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
@@ -443,6 +455,7 @@
|
|||||||
{
|
{
|
||||||
"uid": "roadm h",
|
"uid": "roadm h",
|
||||||
"type": "Roadm",
|
"type": "Roadm",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"target_pch_out_db": -20,
|
"target_pch_out_db": -20,
|
||||||
"restrictions": {
|
"restrictions": {
|
||||||
|
|||||||
@@ -1171,7 +1171,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": 19.0,
|
"gain_target": 19.0,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1190,7 +1190,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1209,7 +1209,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": 18.0,
|
"gain_target": 18.0,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": 0.5
|
"out_voa": 0.5
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1227,7 +1227,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1245,7 +1245,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1263,7 +1263,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1281,7 +1281,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1299,7 +1299,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1318,7 +1318,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": 18.5,
|
"gain_target": 18.5,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1336,7 +1336,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1354,7 +1354,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1372,7 +1372,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1391,7 +1391,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1409,7 +1409,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1428,7 +1428,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1446,7 +1446,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1464,7 +1464,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1482,7 +1482,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1500,7 +1500,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1518,7 +1518,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1551,7 +1551,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1569,7 +1569,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1587,7 +1587,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1605,7 +1605,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1623,7 +1623,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1641,7 +1641,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1659,7 +1659,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1677,7 +1677,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1695,7 +1695,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1713,7 +1713,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1731,7 +1731,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1749,7 +1749,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1768,7 +1768,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": 18.0,
|
"gain_target": 18.0,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1786,7 +1786,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1805,7 +1805,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1823,7 +1823,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1841,7 +1841,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1859,7 +1859,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1877,7 +1877,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1895,7 +1895,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1913,7 +1913,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1931,7 +1931,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1949,7 +1949,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1967,7 +1967,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1985,7 +1985,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2003,7 +2003,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": 19.0,
|
"gain_target": 19.0,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2021,7 +2021,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2039,7 +2039,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2057,7 +2057,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2075,7 +2075,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2093,7 +2093,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2111,7 +2111,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2129,7 +2129,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2147,7 +2147,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2165,7 +2165,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2183,7 +2183,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2201,7 +2201,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2219,7 +2219,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2237,7 +2237,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2255,7 +2255,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2273,7 +2273,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2291,7 +2291,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2309,7 +2309,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2327,7 +2327,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2345,7 +2345,7 @@
|
|||||||
"operational": {
|
"operational": {
|
||||||
"gain_target": null,
|
"gain_target": null,
|
||||||
"delta_p": null,
|
"delta_p": null,
|
||||||
"tilt_target": 0,
|
"tilt_target": null,
|
||||||
"out_voa": null
|
"out_voa": null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
|
@@ -1,5 +1,124 @@
|
|||||||
INFO gnpy.tools.cli_examples:cli_examples.py Computing path requests meshTopologyExampleV2.xls into JSON format
|
INFO gnpy.tools.cli_examples:cli_examples.py Computing path requests meshTopologyExampleV2.xls into JSON format
|
||||||
|
WARNING gnpy.tools.json_io:json_io.py
|
||||||
|
WARNING missing type_variety attribute in eqpt_config.json[Roadm]
|
||||||
|
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
|
||||||
|
|||||||
@@ -1,4 +1,28 @@
|
|||||||
INFO gnpy.tools.cli_examples:cli_examples.py Computing path requests CORONET_services.json into JSON format
|
INFO gnpy.tools.cli_examples:cli_examples.py Computing path requests CORONET_services.json into JSON format
|
||||||
|
WARNING gnpy.tools.json_io:json_io.py
|
||||||
|
WARNING missing type_variety attribute in eqpt_config.json[Roadm]
|
||||||
|
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
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
INFO gnpy.tools.cli_examples:cli_examples.py source = 'brest'
|
WARNING gnpy.tools.json_io:json_io.py
|
||||||
INFO gnpy.tools.cli_examples:cli_examples.py destination = 'rennes'
|
WARNING missing type_variety attribute in eqpt_config.json[Roadm]
|
||||||
|
default value is type_variety = default
|
||||||
|
|
||||||
|
INFO gnpy.tools.cli_examples:cli_examples.py source = 'trx Brest_KLA'
|
||||||
|
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:
|
||||||
@@ -10,6 +14,11 @@ WARNING gnpy.core.network:network.py
|
|||||||
is above user specified amplifier std_low_gain
|
is above user specified amplifier std_low_gain
|
||||||
max flat gain: 16dB ; required gain: 21.22dB. Please check amplifier type.
|
max flat gain: 16dB ; required gain: 21.22dB. Please check amplifier type.
|
||||||
|
|
||||||
|
WARNING gnpy.core.network:network.py
|
||||||
|
WARNING: effective gain in Node east edfa in Stbrieuc to Rennes_STA
|
||||||
|
is below user specified amplifier std_medium_gain
|
||||||
|
min gain: 15dB ; required gain: 12.0dB. Please check amplifier type.
|
||||||
|
|
||||||
WARNING gnpy.core.network:network.py
|
WARNING gnpy.core.network:network.py
|
||||||
WARNING: target gain and power in node west edfa in Rennes_STA to Stbrieuc
|
WARNING: target gain and power in node west edfa in Rennes_STA to Stbrieuc
|
||||||
is beyond all available amplifiers capabilities and/or extended_gain_range:
|
is beyond all available amplifiers capabilities and/or extended_gain_range:
|
||||||
@@ -305,3 +314,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)
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
INFO gnpy.tools.cli_examples:cli_examples.py source = 'lannion'
|
WARNING gnpy.tools.json_io:json_io.py
|
||||||
INFO gnpy.tools.cli_examples:cli_examples.py destination = 'lorient'
|
WARNING missing type_variety attribute in eqpt_config.json[Roadm]
|
||||||
|
default value is type_variety = default
|
||||||
|
|
||||||
|
INFO gnpy.tools.cli_examples:cli_examples.py source = 'trx Lannion_CAS'
|
||||||
|
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:
|
||||||
@@ -10,6 +14,11 @@ WARNING gnpy.core.network:network.py
|
|||||||
is above user specified amplifier std_low_gain
|
is above user specified amplifier std_low_gain
|
||||||
max flat gain: 16dB ; required gain: 21.18dB. Please check amplifier type.
|
max flat gain: 16dB ; required gain: 21.18dB. Please check amplifier type.
|
||||||
|
|
||||||
|
WARNING gnpy.core.network:network.py
|
||||||
|
WARNING: effective gain in Node east edfa in Stbrieuc to Rennes_STA
|
||||||
|
is below user specified amplifier std_medium_gain
|
||||||
|
min gain: 15dB ; required gain: 12.0dB. Please check amplifier type.
|
||||||
|
|
||||||
WARNING gnpy.core.network:network.py
|
WARNING gnpy.core.network:network.py
|
||||||
WARNING: target gain and power in node west edfa in Rennes_STA to Stbrieuc
|
WARNING: target gain and power in node west edfa in Rennes_STA to Stbrieuc
|
||||||
is beyond all available amplifiers capabilities and/or extended_gain_range:
|
is beyond all available amplifiers capabilities and/or extended_gain_range:
|
||||||
@@ -305,3 +314,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
|
||||||
@@ -16,14 +22,18 @@ Transceiver trx_Stockholm
|
|||||||
PMD (ps): 0.00
|
PMD (ps): 0.00
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.00
|
Latency (ms): 0.00
|
||||||
|
Actual pch out (dBm): 2.00
|
||||||
Roadm roadm_Stockholm
|
Roadm roadm_Stockholm
|
||||||
effective loss (dB): 22.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 22.00
|
||||||
actual pch out (dBm): -20.00
|
Actual loss (dB): 22.00
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): -20.00
|
||||||
Edfa Edfa_booster_roadm_Stockholm_to_fiber (Stockholm → Norrköping)_(1/2)
|
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
|
||||||
@@ -46,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
|
||||||
@@ -68,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
|
||||||
@@ -78,13 +90,16 @@ Edfa Edfa_preamp_roadm_Norrköping_from_fiber (Stockholm → Norrköping)_(2/2)
|
|||||||
actual pch out (dBm): 2.03
|
actual pch out (dBm): 2.03
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm_Norrköping
|
Roadm roadm_Norrköping
|
||||||
effective loss (dB): 22.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 22.00
|
||||||
actual pch out (dBm): -20.00
|
Actual loss (dB): 22.03
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): -20.00
|
||||||
Edfa Edfa_booster_roadm_Norrköping_to_fiber (Norrköping → Linköping)
|
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
|
||||||
@@ -107,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
|
||||||
@@ -117,13 +133,16 @@ Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping)
|
|||||||
actual pch out (dBm): 2.01
|
actual pch out (dBm): 2.01
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm_Linköping
|
Roadm roadm_Linköping
|
||||||
effective loss (dB): 22.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 22.00
|
||||||
actual pch out (dBm): -20.00
|
Actual loss (dB): 22.01
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): -20.00
|
||||||
Edfa Edfa_booster_roadm_Linköping_to_fiber (Linköping → Jönköping)
|
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
|
||||||
@@ -146,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
|
||||||
@@ -156,13 +176,16 @@ Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping)
|
|||||||
actual pch out (dBm): 2.05
|
actual pch out (dBm): 2.05
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm_Jönköping
|
Roadm roadm_Jönköping
|
||||||
effective loss (dB): 22.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 22.00
|
||||||
actual pch out (dBm): -20.00
|
Actual loss (dB): 22.05
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): -20.00
|
||||||
Edfa Edfa_booster_roadm_Jönköping_to_fiber (Jönköping → Borås)
|
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
|
||||||
@@ -185,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
|
||||||
@@ -195,13 +219,16 @@ Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås)
|
|||||||
actual pch out (dBm): 2.02
|
actual pch out (dBm): 2.02
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm_Borås
|
Roadm roadm_Borås
|
||||||
effective loss (dB): 22.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 22.00
|
||||||
actual pch out (dBm): -20.00
|
Actual loss (dB): 22.02
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): -20.00
|
||||||
Edfa Edfa_booster_roadm_Borås_to_fiber (Borås → Gothenburg)
|
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
|
||||||
@@ -224,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
|
||||||
@@ -234,9 +262,11 @@ Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg)
|
|||||||
actual pch out (dBm): 2.02
|
actual pch out (dBm): 2.02
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm_Gothenburg
|
Roadm roadm_Gothenburg
|
||||||
effective loss (dB): 22.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 22.00
|
||||||
actual pch out (dBm): -20.00
|
Actual loss (dB): 22.02
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): -20.00
|
||||||
Transceiver trx_Gothenburg
|
Transceiver trx_Gothenburg
|
||||||
GSNR (0.1nm, dB): 18.89
|
GSNR (0.1nm, dB): 18.89
|
||||||
GSNR (signal bw, dB): 14.86
|
GSNR (signal bw, dB): 14.86
|
||||||
@@ -246,8 +276,9 @@ Transceiver trx_Gothenburg
|
|||||||
PMD (ps): 7.99
|
PMD (ps): 7.99
|
||||||
PDL (dB): 3.74
|
PDL (dB): 3.74
|
||||||
Latency (ms): 2.45
|
Latency (ms): 2.45
|
||||||
|
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
|
||||||
@@ -16,14 +22,18 @@ Transceiver trx_Stockholm
|
|||||||
PMD (ps): 0.00
|
PMD (ps): 0.00
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.00
|
Latency (ms): 0.00
|
||||||
|
Actual pch out (dBm): 2.00
|
||||||
Roadm roadm_Stockholm
|
Roadm roadm_Stockholm
|
||||||
effective loss (dB): 22.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 22.00
|
||||||
actual pch out (dBm): -20.00
|
Actual loss (dB): 22.00
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): -20.00
|
||||||
Edfa Edfa_booster_roadm_Stockholm_to_fiber (Stockholm → Norrköping)_(1/2)
|
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
|
||||||
@@ -46,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
|
||||||
@@ -68,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
|
||||||
@@ -78,13 +90,16 @@ Edfa Edfa_preamp_roadm_Norrköping_from_fiber (Stockholm → Norrköping)_(2/2)
|
|||||||
actual pch out (dBm): 2.03
|
actual pch out (dBm): 2.03
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm_Norrköping
|
Roadm roadm_Norrköping
|
||||||
effective loss (dB): 22.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 22.00
|
||||||
actual pch out (dBm): -20.00
|
Actual loss (dB): 22.03
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): -20.00
|
||||||
Edfa Edfa_booster_roadm_Norrköping_to_fiber (Norrköping → Linköping)
|
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
|
||||||
@@ -107,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
|
||||||
@@ -117,13 +133,16 @@ Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping)
|
|||||||
actual pch out (dBm): 2.01
|
actual pch out (dBm): 2.01
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm_Linköping
|
Roadm roadm_Linköping
|
||||||
effective loss (dB): 22.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 22.00
|
||||||
actual pch out (dBm): -20.00
|
Actual loss (dB): 22.01
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): -20.00
|
||||||
Edfa Edfa_booster_roadm_Linköping_to_fiber (Linköping → Jönköping)
|
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
|
||||||
@@ -146,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
|
||||||
@@ -156,13 +176,16 @@ Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping)
|
|||||||
actual pch out (dBm): 2.04
|
actual pch out (dBm): 2.04
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm_Jönköping
|
Roadm roadm_Jönköping
|
||||||
effective loss (dB): 22.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 22.00
|
||||||
actual pch out (dBm): -20.00
|
Actual loss (dB): 22.04
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): -20.00
|
||||||
Edfa Edfa_booster_roadm_Jönköping_to_fiber (Jönköping → Borås)
|
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
|
||||||
@@ -185,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
|
||||||
@@ -195,13 +219,16 @@ Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås)
|
|||||||
actual pch out (dBm): 2.02
|
actual pch out (dBm): 2.02
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm_Borås
|
Roadm roadm_Borås
|
||||||
effective loss (dB): 22.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 22.00
|
||||||
actual pch out (dBm): -20.00
|
Actual loss (dB): 22.02
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): -20.00
|
||||||
Edfa Edfa_booster_roadm_Borås_to_fiber (Borås → Gothenburg)
|
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
|
||||||
@@ -224,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
|
||||||
@@ -234,9 +262,11 @@ Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg)
|
|||||||
actual pch out (dBm): 2.02
|
actual pch out (dBm): 2.02
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm_Gothenburg
|
Roadm roadm_Gothenburg
|
||||||
effective loss (dB): 22.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 22.00
|
||||||
actual pch out (dBm): -20.00
|
Actual loss (dB): 22.02
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): -20.00
|
||||||
Transceiver trx_Gothenburg
|
Transceiver trx_Gothenburg
|
||||||
GSNR (0.1nm, dB): 19.25
|
GSNR (0.1nm, dB): 19.25
|
||||||
GSNR (signal bw, dB): 15.23
|
GSNR (signal bw, dB): 15.23
|
||||||
@@ -246,8 +276,9 @@ Transceiver trx_Gothenburg
|
|||||||
PMD (ps): 7.99
|
PMD (ps): 7.99
|
||||||
PDL (dB): 3.74
|
PDL (dB): 3.74
|
||||||
Latency (ms): 2.45
|
Latency (ms): 2.45
|
||||||
|
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
|
||||||
@@ -21,6 +20,7 @@
|
|||||||
bit_rate: None Gb/s
|
bit_rate: None Gb/s
|
||||||
spacing: 50.0 GHz
|
spacing: 50.0 GHz
|
||||||
power: 1.0 dBm
|
power: 1.0 dBm
|
||||||
|
tx_power_dbm: 0.0 dBm
|
||||||
nb channels: 80
|
nb channels: 80
|
||||||
path_bandwidth: 100.0 Gbit/s
|
path_bandwidth: 100.0 Gbit/s
|
||||||
nodes-list: []
|
nodes-list: []
|
||||||
@@ -34,6 +34,7 @@
|
|||||||
bit_rate: 100.0 Gb/s
|
bit_rate: 100.0 Gb/s
|
||||||
spacing: 50.0 GHz
|
spacing: 50.0 GHz
|
||||||
power: 1.0 dBm
|
power: 1.0 dBm
|
||||||
|
tx_power_dbm: 0.0 dBm
|
||||||
nb channels: 95
|
nb channels: 95
|
||||||
path_bandwidth: 200.0 Gbit/s
|
path_bandwidth: 200.0 Gbit/s
|
||||||
nodes-list: ['roadm Brest_KLA', 'roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE']
|
nodes-list: ['roadm Brest_KLA', 'roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE']
|
||||||
@@ -47,6 +48,7 @@
|
|||||||
bit_rate: 100.0 Gb/s
|
bit_rate: 100.0 Gb/s
|
||||||
spacing: 50.0 GHz
|
spacing: 50.0 GHz
|
||||||
power: 0.0 dBm
|
power: 0.0 dBm
|
||||||
|
tx_power_dbm: 0.0 dBm
|
||||||
nb channels: 95
|
nb channels: 95
|
||||||
path_bandwidth: 60.0 Gbit/s
|
path_bandwidth: 60.0 Gbit/s
|
||||||
nodes-list: []
|
nodes-list: []
|
||||||
@@ -60,6 +62,7 @@
|
|||||||
bit_rate: None Gb/s
|
bit_rate: None Gb/s
|
||||||
spacing: 75.0 GHz
|
spacing: 75.0 GHz
|
||||||
power: 3.0 dBm
|
power: 3.0 dBm
|
||||||
|
tx_power_dbm: 0.0 dBm
|
||||||
nb channels: 63
|
nb channels: 63
|
||||||
path_bandwidth: 150.0 Gbit/s
|
path_bandwidth: 150.0 Gbit/s
|
||||||
nodes-list: []
|
nodes-list: []
|
||||||
@@ -73,11 +76,12 @@
|
|||||||
bit_rate: 200.0 Gb/s
|
bit_rate: 200.0 Gb/s
|
||||||
spacing: 75.0 GHz
|
spacing: 75.0 GHz
|
||||||
power: 3.0 dBm
|
power: 3.0 dBm
|
||||||
|
tx_power_dbm: 0.0 dBm
|
||||||
nb channels: 63
|
nb channels: 63
|
||||||
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
|
||||||
@@ -86,8 +90,23 @@
|
|||||||
bit_rate: 100.0 Gb/s
|
bit_rate: 100.0 Gb/s
|
||||||
spacing: 50.0 GHz
|
spacing: 50.0 GHz
|
||||||
power: 0.0 dBm
|
power: 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
|
||||||
@@ -99,13 +118,12 @@
|
|||||||
bit_rate: 100.0 Gb/s
|
bit_rate: 100.0 Gb/s
|
||||||
spacing: 75.0 GHz
|
spacing: 75.0 GHz
|
||||||
power: 0.0 dBm
|
power: 0.0 dBm
|
||||||
|
tx_power_dbm: 0.0 dBm
|
||||||
nb channels: 50
|
nb channels: 50
|
||||||
path_bandwidth: 400.0 Gbit/s
|
path_bandwidth: 400.0 Gbit/s
|
||||||
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
|
||||||
@@ -11,13 +10,12 @@
|
|||||||
bit_rate: 300.0 Gb/s
|
bit_rate: 300.0 Gb/s
|
||||||
spacing: 62.50000000000001 GHz
|
spacing: 62.50000000000001 GHz
|
||||||
power: 0.0 dBm
|
power: 0.0 dBm
|
||||||
|
tx_power_dbm: 0.0 dBm
|
||||||
nb channels: 76
|
nb channels: 76
|
||||||
path_bandwidth: 100.0 Gbit/s
|
path_bandwidth: 100.0 Gbit/s
|
||||||
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
|
||||||
@@ -16,8 +22,8 @@ Transceiver trx Rennes_STA
|
|||||||
PMD (ps): 0.57
|
PMD (ps): 0.57
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.98
|
Latency (ms): 0.98
|
||||||
|
Actual pch out (dBm): 3.00
|
||||||
Propagating with input power = [1;36;40m-2.50 dBm[0m:
|
Input optical power reference in span = [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
|
||||||
@@ -27,8 +33,8 @@ Transceiver trx Rennes_STA
|
|||||||
PMD (ps): 0.57
|
PMD (ps): 0.57
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.98
|
Latency (ms): 0.98
|
||||||
|
Actual pch out (dBm): 3.00
|
||||||
Propagating with input power = [1;36;40m-2.00 dBm[0m:
|
Input optical power reference in span = [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
|
||||||
@@ -38,8 +44,8 @@ Transceiver trx Rennes_STA
|
|||||||
PMD (ps): 0.57
|
PMD (ps): 0.57
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.98
|
Latency (ms): 0.98
|
||||||
|
Actual pch out (dBm): 3.00
|
||||||
Propagating with input power = [1;36;40m-1.50 dBm[0m:
|
Input optical power reference in span = [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
|
||||||
@@ -49,8 +55,8 @@ Transceiver trx Rennes_STA
|
|||||||
PMD (ps): 0.57
|
PMD (ps): 0.57
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.98
|
Latency (ms): 0.98
|
||||||
|
Actual pch out (dBm): 3.00
|
||||||
Propagating with input power = [1;36;40m-1.00 dBm[0m:
|
Input optical power reference in span = [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
|
||||||
@@ -60,8 +66,8 @@ Transceiver trx Rennes_STA
|
|||||||
PMD (ps): 0.57
|
PMD (ps): 0.57
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.98
|
Latency (ms): 0.98
|
||||||
|
Actual pch out (dBm): 3.00
|
||||||
Propagating with input power = [1;36;40m-0.50 dBm[0m:
|
Input optical power reference in span = [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
|
||||||
@@ -71,8 +77,8 @@ Transceiver trx Rennes_STA
|
|||||||
PMD (ps): 0.57
|
PMD (ps): 0.57
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.98
|
Latency (ms): 0.98
|
||||||
|
Actual pch out (dBm): 3.00
|
||||||
Propagating with input power = [1;36;40m-0.00 dBm[0m:
|
Input optical power reference in span = [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
|
||||||
@@ -82,8 +88,8 @@ Transceiver trx Rennes_STA
|
|||||||
PMD (ps): 0.57
|
PMD (ps): 0.57
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.98
|
Latency (ms): 0.98
|
||||||
|
Actual pch out (dBm): 3.00
|
||||||
Propagating with input power = [1;36;40m0.50 dBm[0m:
|
Input optical power reference in span = [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
|
||||||
@@ -93,8 +99,8 @@ Transceiver trx Rennes_STA
|
|||||||
PMD (ps): 0.57
|
PMD (ps): 0.57
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.98
|
Latency (ms): 0.98
|
||||||
|
Actual pch out (dBm): 3.00
|
||||||
Propagating with input power = [1;36;40m1.00 dBm[0m:
|
Input optical power reference in span = [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
|
||||||
@@ -104,8 +110,8 @@ Transceiver trx Rennes_STA
|
|||||||
PMD (ps): 0.57
|
PMD (ps): 0.57
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.98
|
Latency (ms): 0.98
|
||||||
|
Actual pch out (dBm): 3.00
|
||||||
Propagating with input power = [1;36;40m1.50 dBm[0m:
|
Input optical power reference in span = [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
|
||||||
@@ -115,8 +121,8 @@ Transceiver trx Rennes_STA
|
|||||||
PMD (ps): 0.57
|
PMD (ps): 0.57
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.98
|
Latency (ms): 0.98
|
||||||
|
Actual pch out (dBm): 3.00
|
||||||
Propagating with input power = [1;36;40m2.00 dBm[0m:
|
Input optical power reference in span = [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
|
||||||
@@ -126,8 +132,8 @@ Transceiver trx Rennes_STA
|
|||||||
PMD (ps): 0.57
|
PMD (ps): 0.57
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.98
|
Latency (ms): 0.98
|
||||||
|
Actual pch out (dBm): 3.00
|
||||||
Propagating with input power = [1;36;40m2.50 dBm[0m:
|
Input optical power reference in span = [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
|
||||||
@@ -137,8 +143,8 @@ Transceiver trx Rennes_STA
|
|||||||
PMD (ps): 0.57
|
PMD (ps): 0.57
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.98
|
Latency (ms): 0.98
|
||||||
|
Actual pch out (dBm): 3.00
|
||||||
Propagating with input power = [1;36;40m3.00 dBm[0m:
|
Input optical power reference in span = [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
|
||||||
@@ -148,6 +154,7 @@ Transceiver trx Rennes_STA
|
|||||||
PMD (ps): 0.57
|
PMD (ps): 0.57
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.98
|
Latency (ms): 0.98
|
||||||
|
Actual pch out (dBm): 3.00
|
||||||
|
|
||||||
(Invalid source node 'brest' replaced with trx Brest_KLA)
|
(Invalid source node 'brest' replaced with trx Brest_KLA)
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -17,14 +23,18 @@ Transceiver trx Lannion_CAS
|
|||||||
PMD (ps): 0.00
|
PMD (ps): 0.00
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.00
|
Latency (ms): 0.00
|
||||||
|
Actual pch out (dBm): 0.00
|
||||||
Roadm roadm Lannion_CAS
|
Roadm roadm Lannion_CAS
|
||||||
effective loss (dB): 20.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 20.00
|
||||||
actual pch out (dBm): -20.00
|
Actual loss (dB): 20.00
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): -20.00
|
||||||
Edfa east edfa in Lannion_CAS to Corlay
|
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
|
||||||
@@ -69,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
|
||||||
@@ -79,9 +90,11 @@ Edfa west edfa in Lorient_KMA to Loudeac
|
|||||||
actual pch out (dBm): 1.05
|
actual pch out (dBm): 1.05
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm Lorient_KMA
|
Roadm roadm Lorient_KMA
|
||||||
effective loss (dB): 21.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 21.00
|
||||||
actual pch out (dBm): -20.00
|
Actual loss (dB): 21.05
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): -20.00
|
||||||
Transceiver trx Lorient_KMA
|
Transceiver trx Lorient_KMA
|
||||||
GSNR (0.1nm, dB): 23.61
|
GSNR (0.1nm, dB): 23.61
|
||||||
GSNR (signal bw, dB): 19.53
|
GSNR (signal bw, dB): 19.53
|
||||||
@@ -91,8 +104,9 @@ Transceiver trx Lorient_KMA
|
|||||||
PMD (ps): 0.46
|
PMD (ps): 0.46
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.64
|
Latency (ms): 0.64
|
||||||
|
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
|
||||||
@@ -17,14 +23,18 @@ Transceiver trx Lannion_CAS
|
|||||||
PMD (ps): 0.00
|
PMD (ps): 0.00
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.00
|
Latency (ms): 0.00
|
||||||
|
Actual pch out (dBm): mode_1: 0.00, mode_2: 0.00
|
||||||
Roadm roadm Lannion_CAS
|
Roadm roadm Lannion_CAS
|
||||||
effective loss (dB): 20.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 20.00
|
||||||
actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
|
Actual loss (dB): mode_1: 20.00, mode_2: 20.00
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
|
||||||
Edfa east edfa in Lannion_CAS to Corlay
|
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
|
||||||
@@ -69,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
|
||||||
@@ -79,9 +90,11 @@ Edfa west edfa in Lorient_KMA to Loudeac
|
|||||||
actual pch out (dBm): mode_1: 1.04, mode_2: 1.09
|
actual pch out (dBm): mode_1: 1.04, mode_2: 1.09
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm Lorient_KMA
|
Roadm roadm Lorient_KMA
|
||||||
effective loss (dB): 21.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 21.00
|
||||||
actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
|
Actual loss (dB): mode_1: 21.04, mode_2: 21.09
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
|
||||||
Transceiver trx Lorient_KMA
|
Transceiver trx Lorient_KMA
|
||||||
GSNR (0.1nm, dB): mode_1: 23.66, mode_2: 23.81
|
GSNR (0.1nm, dB): mode_1: 23.66, mode_2: 23.81
|
||||||
GSNR (signal bw, dB): mode_1: 19.58, mode_2: 16.72
|
GSNR (signal bw, dB): mode_1: 19.58, mode_2: 16.72
|
||||||
@@ -91,8 +104,9 @@ Transceiver trx Lorient_KMA
|
|||||||
PMD (ps): 0.46
|
PMD (ps): 0.46
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.64
|
Latency (ms): 0.64
|
||||||
|
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
|
||||||
@@ -17,14 +23,18 @@ Transceiver Site_A
|
|||||||
PMD (ps): 0.00
|
PMD (ps): 0.00
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.00
|
Latency (ms): 0.00
|
||||||
|
Actual pch out (dBm): mode_1: 0.00, mode_2: 0.00
|
||||||
Roadm roadm Site A
|
Roadm roadm Site A
|
||||||
effective loss (dB): 20.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 20.00
|
||||||
actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
|
Actual loss (dB): mode_1: 20.00, mode_2: 20.00
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
|
||||||
Edfa booster A
|
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
|
||||||
@@ -47,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
|
||||||
@@ -69,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
|
||||||
@@ -91,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
|
||||||
@@ -113,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
|
||||||
@@ -135,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
|
||||||
@@ -145,13 +160,16 @@ Edfa Edfa5
|
|||||||
actual pch out (dBm): mode_1: 0.05, mode_2: 0.08
|
actual pch out (dBm): mode_1: 0.05, mode_2: 0.08
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm Site C
|
Roadm roadm Site C
|
||||||
effective loss (dB): 20.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 20.00
|
||||||
actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
|
Actual loss (dB): mode_1: 20.05, mode_2: 20.08
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
|
||||||
Edfa booster C
|
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
|
||||||
@@ -174,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
|
||||||
@@ -196,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
|
||||||
@@ -218,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
|
||||||
@@ -240,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
|
||||||
@@ -262,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
|
||||||
@@ -272,13 +295,16 @@ Edfa Edfa10
|
|||||||
actual pch out (dBm): mode_1: 0.05, mode_2: 0.08
|
actual pch out (dBm): mode_1: 0.05, mode_2: 0.08
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm Site D
|
Roadm roadm Site D
|
||||||
effective loss (dB): 20.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 20.00
|
||||||
actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
|
Actual loss (dB): mode_1: 20.05, mode_2: 20.08
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
|
||||||
Edfa booster D
|
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
|
||||||
@@ -301,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
|
||||||
@@ -323,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
|
||||||
@@ -333,13 +361,16 @@ Edfa Edfa12
|
|||||||
actual pch out (dBm): mode_1: 0.03, mode_2: 0.04
|
actual pch out (dBm): mode_1: 0.03, mode_2: 0.04
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm Site E
|
Roadm roadm Site E
|
||||||
effective loss (dB): 20.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 20.00
|
||||||
actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
|
Actual loss (dB): mode_1: 20.03, mode_2: 20.04
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
|
||||||
Edfa booster E
|
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
|
||||||
@@ -362,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
|
||||||
@@ -384,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
|
||||||
@@ -406,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
|
||||||
@@ -416,9 +450,11 @@ Edfa Edfa15
|
|||||||
actual pch out (dBm): mode_1: 0.03, mode_2: 0.05
|
actual pch out (dBm): mode_1: 0.03, mode_2: 0.05
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm Site B
|
Roadm roadm Site B
|
||||||
effective loss (dB): 20.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 20.00
|
||||||
actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
|
Actual loss (dB): mode_1: 20.03, mode_2: 20.05
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
|
||||||
Transceiver Site_B
|
Transceiver Site_B
|
||||||
GSNR (0.1nm, dB): mode_1: 18.11, mode_2: 19.18
|
GSNR (0.1nm, dB): mode_1: 18.11, mode_2: 19.18
|
||||||
GSNR (signal bw, dB): mode_1: 14.02, mode_2: 12.09
|
GSNR (signal bw, dB): mode_1: 14.02, mode_2: 12.09
|
||||||
@@ -428,8 +464,9 @@ Transceiver Site_B
|
|||||||
PMD (ps): 1.39
|
PMD (ps): 1.39
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 5.88
|
Latency (ms): 5.88
|
||||||
|
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
|
||||||
@@ -17,14 +23,18 @@ Transceiver Site_A
|
|||||||
PMD (ps): 0.00
|
PMD (ps): 0.00
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.00
|
Latency (ms): 0.00
|
||||||
|
Actual pch out (dBm): mode_1: 0.00, mode_2: 0.00
|
||||||
Roadm roadm Site A
|
Roadm roadm Site A
|
||||||
effective loss (dB): 20.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 20.00
|
||||||
actual pch out (dBm): mode_1: -20.00, mode_2: -16.99
|
Actual loss (dB): mode_1: 20.00, mode_2: 16.99
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): mode_1: -20.00, mode_2: -16.99
|
||||||
Edfa booster A
|
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
|
||||||
@@ -47,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
|
||||||
@@ -69,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
|
||||||
@@ -91,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
|
||||||
@@ -113,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
|
||||||
@@ -135,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
|
||||||
@@ -145,13 +160,16 @@ Edfa Edfa5
|
|||||||
actual pch out (dBm): mode_1: 0.06, mode_2: 3.07
|
actual pch out (dBm): mode_1: 0.06, mode_2: 3.07
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm Site C
|
Roadm roadm Site C
|
||||||
effective loss (dB): 20.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 20.00
|
||||||
actual pch out (dBm): mode_1: -20.00, mode_2: -16.99
|
Actual loss (dB): mode_1: 20.06, mode_2: 20.06
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): mode_1: -20.00, mode_2: -16.99
|
||||||
Edfa booster C
|
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
|
||||||
@@ -174,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
|
||||||
@@ -196,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
|
||||||
@@ -218,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
|
||||||
@@ -240,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
|
||||||
@@ -262,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
|
||||||
@@ -272,13 +295,16 @@ Edfa Edfa10
|
|||||||
actual pch out (dBm): mode_1: 0.06, mode_2: 3.07
|
actual pch out (dBm): mode_1: 0.06, mode_2: 3.07
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm Site D
|
Roadm roadm Site D
|
||||||
effective loss (dB): 20.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 20.00
|
||||||
actual pch out (dBm): mode_1: -20.00, mode_2: -16.99
|
Actual loss (dB): mode_1: 20.06, mode_2: 20.06
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): mode_1: -20.00, mode_2: -16.99
|
||||||
Edfa booster D
|
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
|
||||||
@@ -301,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
|
||||||
@@ -323,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
|
||||||
@@ -333,13 +361,16 @@ Edfa Edfa12
|
|||||||
actual pch out (dBm): mode_1: 0.03, mode_2: 3.04
|
actual pch out (dBm): mode_1: 0.03, mode_2: 3.04
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm Site E
|
Roadm roadm Site E
|
||||||
effective loss (dB): 20.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 20.00
|
||||||
actual pch out (dBm): mode_1: -20.00, mode_2: -16.99
|
Actual loss (dB): mode_1: 20.03, mode_2: 20.03
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): mode_1: -20.00, mode_2: -16.99
|
||||||
Edfa booster E
|
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
|
||||||
@@ -362,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
|
||||||
@@ -384,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
|
||||||
@@ -406,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
|
||||||
@@ -416,9 +450,11 @@ Edfa Edfa15
|
|||||||
actual pch out (dBm): mode_1: 0.04, mode_2: 3.05
|
actual pch out (dBm): mode_1: 0.04, mode_2: 3.05
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm Site B
|
Roadm roadm Site B
|
||||||
effective loss (dB): 20.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 20.00
|
||||||
actual pch out (dBm): mode_1: -20.00, mode_2: -16.99
|
Actual loss (dB): mode_1: 20.04, mode_2: 20.04
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): mode_1: -20.00, mode_2: -16.99
|
||||||
Transceiver Site_B
|
Transceiver Site_B
|
||||||
GSNR (0.1nm, dB): mode_1: 17.91, mode_2: 20.37
|
GSNR (0.1nm, dB): mode_1: 17.91, mode_2: 20.37
|
||||||
GSNR (signal bw, dB): mode_1: 13.83, mode_2: 13.28
|
GSNR (signal bw, dB): mode_1: 13.83, mode_2: 13.28
|
||||||
@@ -428,8 +464,9 @@ Transceiver Site_B
|
|||||||
PMD (ps): 1.39
|
PMD (ps): 1.39
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 5.88
|
Latency (ms): 5.88
|
||||||
|
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
|
||||||
@@ -17,14 +23,18 @@ Transceiver Site_A
|
|||||||
PMD (ps): 0.00
|
PMD (ps): 0.00
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.00
|
Latency (ms): 0.00
|
||||||
|
Actual pch out (dBm): mode_1: 0.00, mode_2: 0.00
|
||||||
Roadm roadm Site A
|
Roadm roadm Site A
|
||||||
effective loss (dB): 20.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 20.00
|
||||||
actual pch out (dBm): mode_1: -20.00, mode_2: -18.24
|
Actual loss (dB): mode_1: 20.00, mode_2: 18.24
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): mode_1: -20.00, mode_2: -18.24
|
||||||
Edfa booster A
|
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
|
||||||
@@ -47,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
|
||||||
@@ -69,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
|
||||||
@@ -91,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
|
||||||
@@ -113,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
|
||||||
@@ -135,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
|
||||||
@@ -145,13 +160,16 @@ Edfa Edfa5
|
|||||||
actual pch out (dBm): mode_1: 0.05, mode_2: 1.82
|
actual pch out (dBm): mode_1: 0.05, mode_2: 1.82
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm Site C
|
Roadm roadm Site C
|
||||||
effective loss (dB): 20.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 20.00
|
||||||
actual pch out (dBm): mode_1: -20.00, mode_2: -18.24
|
Actual loss (dB): mode_1: 20.05, mode_2: 20.06
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): mode_1: -20.00, mode_2: -18.24
|
||||||
Edfa booster C
|
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
|
||||||
@@ -174,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
|
||||||
@@ -196,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
|
||||||
@@ -218,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
|
||||||
@@ -240,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
|
||||||
@@ -262,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
|
||||||
@@ -272,13 +295,16 @@ Edfa Edfa10
|
|||||||
actual pch out (dBm): mode_1: 0.05, mode_2: 1.82
|
actual pch out (dBm): mode_1: 0.05, mode_2: 1.82
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm Site D
|
Roadm roadm Site D
|
||||||
effective loss (dB): 20.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 20.00
|
||||||
actual pch out (dBm): mode_1: -20.00, mode_2: -18.24
|
Actual loss (dB): mode_1: 20.05, mode_2: 20.06
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): mode_1: -20.00, mode_2: -18.24
|
||||||
Edfa booster D
|
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
|
||||||
@@ -301,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
|
||||||
@@ -323,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
|
||||||
@@ -333,13 +361,16 @@ Edfa Edfa12
|
|||||||
actual pch out (dBm): mode_1: 0.03, mode_2: 1.79
|
actual pch out (dBm): mode_1: 0.03, mode_2: 1.79
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm Site E
|
Roadm roadm Site E
|
||||||
effective loss (dB): 20.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 20.00
|
||||||
actual pch out (dBm): mode_1: -20.00, mode_2: -18.24
|
Actual loss (dB): mode_1: 20.03, mode_2: 20.03
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): mode_1: -20.00, mode_2: -18.24
|
||||||
Edfa booster E
|
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
|
||||||
@@ -362,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
|
||||||
@@ -384,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
|
||||||
@@ -406,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
|
||||||
@@ -416,9 +450,11 @@ Edfa Edfa15
|
|||||||
actual pch out (dBm): mode_1: 0.03, mode_2: 1.80
|
actual pch out (dBm): mode_1: 0.03, mode_2: 1.80
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm Site B
|
Roadm roadm Site B
|
||||||
effective loss (dB): 20.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 20.00
|
||||||
actual pch out (dBm): mode_1: -20.00, mode_2: -18.24
|
Actual loss (dB): mode_1: 20.03, mode_2: 20.04
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): mode_1: -20.00, mode_2: -18.24
|
||||||
Transceiver Site_B
|
Transceiver Site_B
|
||||||
GSNR (0.1nm, dB): mode_1: 18.02, mode_2: 20.22
|
GSNR (0.1nm, dB): mode_1: 18.02, mode_2: 20.22
|
||||||
GSNR (signal bw, dB): mode_1: 13.94, mode_2: 13.12
|
GSNR (signal bw, dB): mode_1: 13.94, mode_2: 13.12
|
||||||
@@ -428,8 +464,9 @@ Transceiver Site_B
|
|||||||
PMD (ps): 1.39
|
PMD (ps): 1.39
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 5.88
|
Latency (ms): 5.88
|
||||||
|
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
|
||||||
@@ -16,6 +22,7 @@ Transceiver Site_A
|
|||||||
PMD (ps): 0.00
|
PMD (ps): 0.00
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.00
|
Latency (ms): 0.00
|
||||||
|
Actual pch out (dBm): 0.00
|
||||||
Fiber Span1
|
Fiber Span1
|
||||||
type_variety: SSMF
|
type_variety: SSMF
|
||||||
length (km): 80.00
|
length (km): 80.00
|
||||||
@@ -29,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
|
||||||
@@ -47,8 +55,9 @@ Transceiver Site_B
|
|||||||
PMD (ps): 0.36
|
PMD (ps): 0.36
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.39
|
Latency (ms): 0.39
|
||||||
|
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
|
||||||
@@ -16,6 +22,7 @@ Transceiver Site_A
|
|||||||
PMD (ps): 0.00
|
PMD (ps): 0.00
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.00
|
Latency (ms): 0.00
|
||||||
|
Actual pch out (dBm): 0.00
|
||||||
RamanFiber Span1
|
RamanFiber Span1
|
||||||
type_variety: SSMF
|
type_variety: SSMF
|
||||||
length (km): 80.00
|
length (km): 80.00
|
||||||
@@ -25,112 +32,116 @@ RamanFiber Span1
|
|||||||
(conn loss out includes EOL margin defined in eqpt_config.json)
|
(conn loss out includes EOL margin defined in eqpt_config.json)
|
||||||
reference pch out (dBm): -7.20
|
reference pch out (dBm): -7.20
|
||||||
actual pch out (dBm): -7.47
|
actual pch out (dBm): -7.47
|
||||||
|
reference gain (dB): 9.74
|
||||||
|
actual gain (dB): 9.8
|
||||||
Fused Fused1
|
Fused Fused1
|
||||||
loss (dB): 0.00
|
loss (dB): 0.00
|
||||||
Edfa Edfa1
|
Edfa Edfa1
|
||||||
type_variety: std_low_gain
|
type_variety: std_low_gain
|
||||||
effective gain(dB): 5.20
|
effective gain(dB): 5.26
|
||||||
(before att_in and before output VOA)
|
(before att_in and before output VOA)
|
||||||
noise figure (dB): 13.80
|
tilt-target(dB) 0.00
|
||||||
|
noise figure (dB): 13.74
|
||||||
(including att_in)
|
(including att_in)
|
||||||
pad att_in (dB): 2.80
|
pad att_in (dB): 2.74
|
||||||
Power In (dBm): 11.61
|
Power In (dBm): 11.61
|
||||||
Power Out (dBm): 16.81
|
Power Out (dBm): 16.87
|
||||||
Delta_P (dB): -2.00
|
Delta_P (dB): -2.00
|
||||||
target pch (dBm): -2.00
|
target pch (dBm): -2.00
|
||||||
actual pch out (dBm): -2.26
|
actual pch out (dBm): -2.21
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Transceiver Site_B
|
Transceiver Site_B
|
||||||
GSNR (0.1nm, dB): 31.42
|
GSNR (0.1nm, dB): 31.44
|
||||||
GSNR (signal bw, dB): 27.34
|
GSNR (signal bw, dB): 27.35
|
||||||
OSNR ASE (0.1nm, dB): 34.21
|
OSNR ASE (0.1nm, dB): 34.24
|
||||||
OSNR ASE (signal bw, dB): 30.13
|
OSNR ASE (signal bw, dB): 30.16
|
||||||
CD (ps/nm): 1336.00
|
CD (ps/nm): 1336.00
|
||||||
PMD (ps): 0.36
|
PMD (ps): 0.36
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.39
|
Latency (ms): 0.39
|
||||||
|
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.42 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:
|
||||||
Ch. # Channel frequency (THz) Channel power (dBm) OSNR ASE (signal bw, dB) SNR NLI (signal bw, dB) GSNR (signal bw, dB)
|
Ch. # Channel frequency (THz) Channel power (dBm) OSNR ASE (signal bw, dB) SNR NLI (signal bw, dB) GSNR (signal bw, dB)
|
||||||
1 191.35000 0.22 31.64 31.55 28.58
|
1 191.35000 0.27 31.66 31.55 28.60
|
||||||
2 191.40000 0.18 31.62 31.46 28.53
|
2 191.40000 0.24 31.64 31.46 28.54
|
||||||
3 191.45000 0.15 31.60 31.37 28.47
|
3 191.45000 0.20 31.62 31.37 28.48
|
||||||
4 191.50000 0.11 31.58 31.28 28.42
|
4 191.50000 0.17 31.60 31.28 28.43
|
||||||
5 191.55000 0.05 31.54 31.20 28.36
|
5 191.55000 0.11 31.57 31.20 28.37
|
||||||
6 191.60000 -0.01 31.51 31.11 28.30
|
6 191.60000 0.05 31.54 31.11 28.31
|
||||||
7 191.65000 -0.07 31.48 31.03 28.24
|
7 191.65000 -0.01 31.51 31.03 28.25
|
||||||
8 191.70000 -0.12 31.45 30.95 28.18
|
8 191.70000 -0.07 31.47 30.95 28.20
|
||||||
9 191.75000 -0.18 31.42 30.87 28.13
|
9 191.75000 -0.13 31.44 30.87 28.14
|
||||||
10 191.80000 -0.25 31.38 30.79 28.07
|
10 191.80000 -0.19 31.41 30.79 28.08
|
||||||
11 191.85000 -0.31 31.35 30.72 28.01
|
11 191.85000 -0.26 31.37 30.72 28.02
|
||||||
12 191.90000 -0.38 31.31 30.64 27.95
|
12 191.90000 -0.32 31.34 30.64 27.97
|
||||||
13 191.95000 -0.44 31.27 30.57 27.90
|
13 191.95000 -0.39 31.30 30.57 27.91
|
||||||
14 192.00000 -0.51 31.24 30.50 27.84
|
14 192.00000 -0.45 31.26 30.50 27.85
|
||||||
15 192.05000 -0.58 31.20 30.42 27.78
|
15 192.05000 -0.52 31.23 30.42 27.80
|
||||||
16 192.10000 -0.64 31.16 30.35 27.73
|
16 192.10000 -0.59 31.19 30.35 27.74
|
||||||
17 192.15000 -0.71 31.12 30.29 27.67
|
17 192.15000 -0.66 31.15 30.29 27.69
|
||||||
18 192.20000 -0.78 31.08 30.22 27.62
|
18 192.20000 -0.72 31.11 30.22 27.63
|
||||||
19 192.25000 -0.85 31.04 30.22 27.60
|
19 192.25000 -0.79 31.07 30.22 27.62
|
||||||
20 192.30000 -0.93 31.00 30.22 27.58
|
20 192.30000 -0.87 31.03 30.22 27.60
|
||||||
21 192.35000 -1.00 30.96 30.23 27.57
|
21 192.35000 -0.95 30.99 30.23 27.58
|
||||||
22 192.40000 -1.08 30.91 30.23 27.55
|
22 192.40000 -1.02 30.94 30.23 27.56
|
||||||
23 192.45000 -1.16 30.87 30.23 27.53
|
23 192.45000 -1.10 30.90 30.23 27.54
|
||||||
24 192.50000 -1.23 30.82 30.24 27.51
|
24 192.50000 -1.18 30.85 30.24 27.52
|
||||||
25 192.55000 -1.30 30.78 30.24 27.49
|
25 192.55000 -1.25 30.81 30.24 27.51
|
||||||
26 192.60000 -1.37 30.74 30.24 27.47
|
26 192.60000 -1.32 30.77 30.24 27.49
|
||||||
27 192.65000 -1.44 30.70 30.25 27.46
|
27 192.65000 -1.39 30.73 30.25 27.47
|
||||||
28 192.70000 -1.52 30.65 30.25 27.44
|
28 192.70000 -1.46 30.68 30.25 27.45
|
||||||
29 192.75000 -1.59 30.61 30.25 27.42
|
29 192.75000 -1.53 30.64 30.25 27.43
|
||||||
30 192.80000 -1.66 30.57 30.26 27.40
|
30 192.80000 -1.60 30.60 30.26 27.41
|
||||||
31 192.85000 -1.73 30.52 30.26 27.38
|
31 192.85000 -1.67 30.55 30.26 27.39
|
||||||
32 192.90000 -1.80 30.48 30.26 27.36
|
32 192.90000 -1.74 30.51 30.26 27.37
|
||||||
33 192.95000 -1.87 30.43 30.27 27.34
|
33 192.95000 -1.81 30.47 30.27 27.35
|
||||||
34 193.00000 -1.94 30.39 30.27 27.32
|
34 193.00000 -1.89 30.42 30.27 27.33
|
||||||
35 193.05000 -2.01 30.35 30.27 27.30
|
35 193.05000 -1.95 30.38 30.27 27.32
|
||||||
36 193.10000 -2.08 30.30 30.28 27.28
|
36 193.10000 -2.02 30.34 30.28 27.30
|
||||||
37 193.15000 -2.15 30.26 30.28 27.26
|
37 193.15000 -2.09 30.29 30.28 27.28
|
||||||
38 193.20000 -2.22 30.22 30.29 27.24
|
38 193.20000 -2.16 30.25 30.29 27.26
|
||||||
39 193.25000 -2.29 30.17 30.31 27.23
|
39 193.25000 -2.23 30.20 30.31 27.24
|
||||||
40 193.30000 -2.36 30.13 30.32 27.21
|
40 193.30000 -2.30 30.16 30.32 27.23
|
||||||
41 193.35000 -2.43 30.08 30.33 27.19
|
41 193.35000 -2.37 30.11 30.33 27.21
|
||||||
42 193.40000 -2.50 30.04 30.35 27.18
|
42 193.40000 -2.44 30.07 30.35 27.20
|
||||||
43 193.45000 -2.56 29.99 30.36 27.16
|
43 193.45000 -2.51 30.02 30.36 27.18
|
||||||
44 193.50000 -2.63 29.95 30.37 27.14
|
44 193.50000 -2.58 29.98 30.37 27.16
|
||||||
45 193.55000 -2.71 29.90 30.39 27.12
|
45 193.55000 -2.65 29.93 30.39 27.14
|
||||||
46 193.60000 -2.78 29.85 30.40 27.11
|
46 193.60000 -2.72 29.88 30.40 27.12
|
||||||
47 193.65000 -2.85 29.80 30.41 27.09
|
47 193.65000 -2.80 29.83 30.41 27.10
|
||||||
48 193.70000 -2.93 29.75 30.43 27.07
|
48 193.70000 -2.87 29.79 30.43 27.08
|
||||||
49 193.75000 -3.00 29.70 30.44 27.05
|
49 193.75000 -2.94 29.74 30.44 27.06
|
||||||
50 193.80000 -3.07 29.65 30.45 27.02
|
50 193.80000 -3.02 29.69 30.45 27.04
|
||||||
51 193.85000 -3.15 29.60 30.47 27.00
|
51 193.85000 -3.09 29.64 30.47 27.02
|
||||||
52 193.90000 -3.22 29.55 30.48 26.98
|
52 193.90000 -3.16 29.59 30.48 27.00
|
||||||
53 193.95000 -3.29 29.50 30.50 26.96
|
53 193.95000 -3.24 29.54 30.50 26.98
|
||||||
54 194.00000 -3.37 29.45 30.51 26.94
|
54 194.00000 -3.31 29.49 30.51 26.96
|
||||||
55 194.05000 -3.44 29.40 30.52 26.92
|
55 194.05000 -3.38 29.44 30.52 26.94
|
||||||
56 194.10000 -3.52 29.35 30.54 26.89
|
56 194.10000 -3.46 29.39 30.54 26.91
|
||||||
57 194.15000 -3.59 29.30 30.59 26.89
|
57 194.15000 -3.53 29.33 30.59 26.91
|
||||||
58 194.20000 -3.66 29.25 30.64 26.88
|
58 194.20000 -3.61 29.28 30.64 26.90
|
||||||
59 194.25000 -3.74 29.19 30.70 26.87
|
59 194.25000 -3.68 29.23 30.70 26.89
|
||||||
60 194.30000 -3.81 29.14 30.75 26.86
|
60 194.30000 -3.76 29.18 30.75 26.89
|
||||||
61 194.35000 -3.89 29.09 30.81 26.86
|
61 194.35000 -3.83 29.13 30.81 26.88
|
||||||
62 194.40000 -3.96 29.04 30.87 26.85
|
62 194.40000 -3.91 29.07 30.87 26.87
|
||||||
63 194.45000 -4.04 28.98 30.93 26.84
|
63 194.45000 -3.98 29.02 30.93 26.86
|
||||||
64 194.50000 -4.11 28.93 30.98 26.83
|
64 194.50000 -4.05 28.97 30.98 26.85
|
||||||
65 194.55000 -4.18 28.88 31.04 26.82
|
65 194.55000 -4.12 28.92 31.04 26.84
|
||||||
66 194.60000 -4.25 28.83 31.10 26.81
|
66 194.60000 -4.19 28.87 31.10 26.84
|
||||||
67 194.65000 -4.31 28.78 31.17 26.80
|
67 194.65000 -4.26 28.82 31.17 26.83
|
||||||
68 194.70000 -4.38 28.74 31.23 26.79
|
68 194.70000 -4.32 28.77 31.23 26.82
|
||||||
69 194.75000 -4.45 28.69 31.29 26.79
|
69 194.75000 -4.39 28.72 31.29 26.81
|
||||||
70 194.80000 -4.51 28.64 31.35 26.78
|
70 194.80000 -4.46 28.68 31.35 26.80
|
||||||
71 194.85000 -4.58 28.59 31.42 26.77
|
71 194.85000 -4.52 28.63 31.42 26.79
|
||||||
72 194.90000 -4.65 28.54 31.48 26.76
|
72 194.90000 -4.59 28.58 31.48 26.78
|
||||||
73 194.95000 -4.71 28.49 31.55 26.74
|
73 194.95000 -4.66 28.53 31.55 26.77
|
||||||
74 195.00000 -4.78 28.44 31.62 26.73
|
74 195.00000 -4.72 28.48 31.62 26.76
|
||||||
75 195.05000 -4.85 28.39 31.69 26.72
|
75 195.05000 -4.79 28.43 31.69 26.75
|
||||||
76 195.10000 -4.91 28.34 31.69 26.69
|
76 195.10000 -4.86 28.38 31.69 26.71
|
||||||
|
|
||||||
(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 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
|
||||||
@@ -16,14 +22,18 @@ Transceiver Site_A
|
|||||||
PMD (ps): 0.00
|
PMD (ps): 0.00
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.00
|
Latency (ms): 0.00
|
||||||
|
Actual pch out (dBm): 0.00
|
||||||
Roadm roadm Site A
|
Roadm roadm Site A
|
||||||
effective loss (dB): 20.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 20.00
|
||||||
actual pch out (dBm): -20.00
|
Actual loss (dB): 20.00
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): -20.00
|
||||||
Edfa booster A
|
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
|
||||||
@@ -46,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
|
||||||
@@ -68,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
|
||||||
@@ -90,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
|
||||||
@@ -112,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
|
||||||
@@ -134,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
|
||||||
@@ -144,13 +159,16 @@ Edfa Edfa5
|
|||||||
actual pch out (dBm): 0.06
|
actual pch out (dBm): 0.06
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm Site C
|
Roadm roadm Site C
|
||||||
effective loss (dB): 20.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 20.00
|
||||||
actual pch out (dBm): -20.00
|
Actual loss (dB): 20.06
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): -20.00
|
||||||
Edfa booster C
|
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
|
||||||
@@ -173,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
|
||||||
@@ -195,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
|
||||||
@@ -217,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
|
||||||
@@ -239,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
|
||||||
@@ -261,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
|
||||||
@@ -271,13 +294,16 @@ Edfa Edfa10
|
|||||||
actual pch out (dBm): 0.06
|
actual pch out (dBm): 0.06
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm Site D
|
Roadm roadm Site D
|
||||||
effective loss (dB): 20.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 20.00
|
||||||
actual pch out (dBm): -20.00
|
Actual loss (dB): 20.06
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): -20.00
|
||||||
Edfa booster D
|
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
|
||||||
@@ -300,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
|
||||||
@@ -322,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
|
||||||
@@ -332,13 +360,16 @@ Edfa Edfa12
|
|||||||
actual pch out (dBm): 0.03
|
actual pch out (dBm): 0.03
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm Site E
|
Roadm roadm Site E
|
||||||
effective loss (dB): 20.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 20.00
|
||||||
actual pch out (dBm): -20.00
|
Actual loss (dB): 20.03
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): -20.00
|
||||||
Edfa booster E
|
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
|
||||||
@@ -361,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
|
||||||
@@ -383,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
|
||||||
@@ -405,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
|
||||||
@@ -415,9 +449,11 @@ Edfa Edfa15
|
|||||||
actual pch out (dBm): 0.04
|
actual pch out (dBm): 0.04
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm Site B
|
Roadm roadm Site B
|
||||||
effective loss (dB): 20.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 20.00
|
||||||
actual pch out (dBm): -20.00
|
Actual loss (dB): 20.04
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): -20.00
|
||||||
Transceiver Site_B
|
Transceiver Site_B
|
||||||
GSNR (0.1nm, dB): 17.84
|
GSNR (0.1nm, dB): 17.84
|
||||||
GSNR (signal bw, dB): 13.76
|
GSNR (signal bw, dB): 13.76
|
||||||
@@ -427,8 +463,9 @@ Transceiver Site_B
|
|||||||
PMD (ps): 1.39
|
PMD (ps): 1.39
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 5.88
|
Latency (ms): 5.88
|
||||||
|
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
|
||||||
@@ -16,14 +22,18 @@ Transceiver trx Lannion_CAS
|
|||||||
PMD (ps): 0.00
|
PMD (ps): 0.00
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.00
|
Latency (ms): 0.00
|
||||||
|
Actual pch out (dBm): 3.00
|
||||||
Roadm roadm Lannion_CAS
|
Roadm roadm Lannion_CAS
|
||||||
effective loss (dB): 23.00
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 23.00
|
||||||
actual pch out (dBm): -20.00
|
Actual loss (dB): 23.00
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): -20.00
|
||||||
Edfa east edfa in Lannion_CAS to Corlay
|
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
|
||||||
@@ -68,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
|
||||||
@@ -78,9 +89,11 @@ Edfa west edfa in Lorient_KMA to Loudeac
|
|||||||
actual pch out (dBm): 1.21
|
actual pch out (dBm): 1.21
|
||||||
output VOA (dB): 0.00
|
output VOA (dB): 0.00
|
||||||
Roadm roadm Lorient_KMA
|
Roadm roadm Lorient_KMA
|
||||||
effective loss (dB): 21.18
|
Type_variety: default
|
||||||
reference pch out (dBm): -20.00
|
Reference loss (dB): 21.18
|
||||||
actual pch out (dBm): -20.00
|
Actual loss (dB): 21.21
|
||||||
|
Reference pch out (dBm): -20.00
|
||||||
|
Actual pch out (dBm): -20.00
|
||||||
Transceiver trx Lorient_KMA
|
Transceiver trx Lorient_KMA
|
||||||
GSNR (0.1nm, dB): 23.77
|
GSNR (0.1nm, dB): 23.77
|
||||||
GSNR (signal bw, dB): 19.69
|
GSNR (signal bw, dB): 19.69
|
||||||
@@ -90,8 +103,9 @@ Transceiver trx Lorient_KMA
|
|||||||
PMD (ps): 0.46
|
PMD (ps): 0.46
|
||||||
PDL (dB): 0.00
|
PDL (dB): 0.00
|
||||||
Latency (ms): 0.64
|
Latency (ms): 0.64
|
||||||
|
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
|
||||||
|
|
||||||
@@ -74,8 +74,8 @@ def si(nch_and_spacing, bw):
|
|||||||
nb_channel, spacing = nch_and_spacing
|
nb_channel, spacing = nch_and_spacing
|
||||||
f_min = 191.3e12
|
f_min = 191.3e12
|
||||||
f_max = automatic_fmax(f_min, spacing, nb_channel)
|
f_max = automatic_fmax(f_min, spacing, nb_channel)
|
||||||
return create_input_spectral_information(f_min=f_min, f_max=f_max, roll_off=0.15, baud_rate=bw, power=1e-3,
|
return create_input_spectral_information(f_min=f_min, f_max=f_max, roll_off=0.15, baud_rate=bw,
|
||||||
spacing=spacing, tx_osnr=40.0)
|
spacing=spacing, tx_osnr=40.0, tx_power=1e-3)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("gain, nf_expected", [(10, 15), (15, 10), (25, 5.8)])
|
@pytest.mark.parametrize("gain, nf_expected", [(10, 15), (15, 10), (25, 5.8)])
|
||||||
@@ -232,8 +232,8 @@ def test_amp_behaviour(tilt_target, delta_p):
|
|||||||
fiber.params.con_in = 0
|
fiber.params.con_in = 0
|
||||||
fiber.params.con_out = 0
|
fiber.params.con_out = 0
|
||||||
fiber.ref_pch_in_dbm = 0.0
|
fiber.ref_pch_in_dbm = 0.0
|
||||||
si = create_input_spectral_information(f_min=191.3e12, f_max=196.05e12, roll_off=0.15, baud_rate=64e9, power=0.001,
|
si = create_input_spectral_information(f_min=191.3e12, f_max=196.05e12, roll_off=0.15, baud_rate=64e9,
|
||||||
spacing=75e9, tx_osnr=None)
|
spacing=75e9, tx_osnr=None, tx_power=1e-3)
|
||||||
si = fiber(si)
|
si = fiber(si)
|
||||||
total_sig_powerin = sum(si.signal)
|
total_sig_powerin = sum(si.signal)
|
||||||
sig_in = lin2db(si.signal)
|
sig_in = lin2db(si.signal)
|
||||||
@@ -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)
|
||||||
@@ -320,7 +320,7 @@ def test_amp_saturation(delta_pdb_per_channel, base_power, delta_p):
|
|||||||
si = create_arbitrary_spectral_information(frequency=frequency, slot_width=slot_width,
|
si = create_arbitrary_spectral_information(frequency=frequency, slot_width=slot_width,
|
||||||
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=None)
|
tx_osnr=None, tx_power=None)
|
||||||
total_sig_powerin = sum(si.signal)
|
total_sig_powerin = sum(si.signal)
|
||||||
sig_in = lin2db(si.signal)
|
sig_in = lin2db(si.signal)
|
||||||
si = edfa(si)
|
si = edfa(si)
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -14,12 +14,17 @@ checks that empty info on mode, power, nbchannel in service file are supported
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from logging import INFO
|
||||||
|
from numpy.testing import assert_allclose
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from gnpy.core.network import build_network
|
from gnpy.core.network import build_network
|
||||||
from gnpy.core.utils import automatic_nch, lin2db
|
from gnpy.core.utils import automatic_nch, lin2db, watt2dbm
|
||||||
from gnpy.core.elements import Roadm
|
from gnpy.core.elements import Roadm
|
||||||
from gnpy.topology.request import compute_path_dsjctn, propagate, propagate_and_optimize_mode, correct_json_route_list
|
from gnpy.topology.request import compute_path_dsjctn, propagate, propagate_and_optimize_mode, correct_json_route_list
|
||||||
from gnpy.tools.json_io import load_network, load_equipment, requests_from_json, load_requests
|
from gnpy.tools.json_io import load_network, load_equipment, requests_from_json, load_requests, load_json, \
|
||||||
|
_equipment_from_json
|
||||||
|
|
||||||
|
|
||||||
network_file_name = Path(__file__).parent.parent / 'tests/data/testTopology_expected.json'
|
network_file_name = Path(__file__).parent.parent / 'tests/data/testTopology_expected.json'
|
||||||
service_file_name = Path(__file__).parent.parent / 'tests/data/testTopology_testservices.json'
|
service_file_name = Path(__file__).parent.parent / 'tests/data/testTopology_testservices.json'
|
||||||
@@ -30,7 +35,9 @@ eqpt_library_name = Path(__file__).parent.parent / 'tests/data/eqpt_config.json'
|
|||||||
@pytest.mark.parametrize("net", [network_file_name])
|
@pytest.mark.parametrize("net", [network_file_name])
|
||||||
@pytest.mark.parametrize("eqpt", [eqpt_library_name])
|
@pytest.mark.parametrize("eqpt", [eqpt_library_name])
|
||||||
@pytest.mark.parametrize("serv", [service_file_name])
|
@pytest.mark.parametrize("serv", [service_file_name])
|
||||||
@pytest.mark.parametrize("expected_mode", [['16QAM', 'PS_SP64_1', 'PS_SP64_1', 'PS_SP64_1', 'mode 2 - fake', 'mode 2', 'PS_SP64_1', 'mode 3', 'PS_SP64_1', 'PS_SP64_1', '16QAM', 'mode 1', 'PS_SP64_1', 'PS_SP64_1', 'mode 1', 'mode 2', 'mode 1', 'mode 2', 'nok']])
|
@pytest.mark.parametrize("expected_mode", [['16QAM', 'PS_SP64_1', 'PS_SP64_1', 'PS_SP64_1', 'mode 2 - fake', 'mode 2',
|
||||||
|
'PS_SP64_1', 'mode 3', 'PS_SP64_1', 'PS_SP64_1', '16QAM', 'mode 1',
|
||||||
|
'PS_SP64_1', 'PS_SP64_1', 'mode 1', 'mode 2', 'mode 1', 'mode 2', 'nok']])
|
||||||
def test_automaticmodefeature(net, eqpt, serv, expected_mode):
|
def test_automaticmodefeature(net, eqpt, serv, expected_mode):
|
||||||
equipment = load_equipment(eqpt)
|
equipment = load_equipment(eqpt)
|
||||||
network = load_network(net, equipment)
|
network = load_network(net, equipment)
|
||||||
@@ -83,3 +90,89 @@ def test_automaticmodefeature(net, eqpt, serv, expected_mode):
|
|||||||
path_res_list.append('nok')
|
path_res_list.append('nok')
|
||||||
print(path_res_list)
|
print(path_res_list)
|
||||||
assert path_res_list == expected_mode
|
assert path_res_list == expected_mode
|
||||||
|
|
||||||
|
|
||||||
|
def test_propagate_and_optimize_mode(caplog):
|
||||||
|
"""Checks that the automatic mode returns the last explored mode
|
||||||
|
|
||||||
|
Mode are explored with descending baud_rate order and descending bitrate, so the last explored mode must be mode 1
|
||||||
|
Mode 1 GSNR is OK but pdl penalty are not OK due to high ROADM PDL. so the last explored mode is not OK
|
||||||
|
Then the propagate_and_optimize_mode must return mode 1 and the blocking reason must be 'NO_FEASIBLE_MODE'
|
||||||
|
"""
|
||||||
|
caplog.set_level(INFO)
|
||||||
|
json_data = load_json(eqpt_library_name)
|
||||||
|
voyager = next(e for e in json_data['Transceiver'] if e['type_variety'] == 'Voyager')
|
||||||
|
# expected path min GSNR is 22.11
|
||||||
|
# Change Voyager modes so that:
|
||||||
|
# - highest baud rate has min OSNR > path GSNR
|
||||||
|
# - lower baudrate with highest bitrate has min OSNR > path GSNR
|
||||||
|
# - lower baudrate with lower bitrate has has min OSNR < path GSNR but PDL penalty is infinite
|
||||||
|
voyager['mode'] = [
|
||||||
|
{
|
||||||
|
"format": "mode 1",
|
||||||
|
"baud_rate": 32e9,
|
||||||
|
"OSNR": 12,
|
||||||
|
"bit_rate": 100e9,
|
||||||
|
"roll_off": 0.15,
|
||||||
|
"tx_osnr": 45,
|
||||||
|
"min_spacing": 50e9,
|
||||||
|
"penalties": [
|
||||||
|
{
|
||||||
|
"chromatic_dispersion": 4e3,
|
||||||
|
"penalty_value": 0
|
||||||
|
}, {
|
||||||
|
"chromatic_dispersion": 40e3,
|
||||||
|
"penalty_value": 0
|
||||||
|
}, {
|
||||||
|
"pdl": 0.5,
|
||||||
|
"penalty_value": 1
|
||||||
|
}, {
|
||||||
|
"pmd": 30,
|
||||||
|
"penalty_value": 0
|
||||||
|
}],
|
||||||
|
"cost": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"format": "mode 3",
|
||||||
|
"baud_rate": 32e9,
|
||||||
|
"OSNR": 30,
|
||||||
|
"bit_rate": 300e9,
|
||||||
|
"roll_off": 0.15,
|
||||||
|
"tx_osnr": 45,
|
||||||
|
"min_spacing": 50e9,
|
||||||
|
"cost": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"format": "mode 2",
|
||||||
|
"baud_rate": 66e9,
|
||||||
|
"OSNR": 25,
|
||||||
|
"bit_rate": 400e9,
|
||||||
|
"roll_off": 0.15,
|
||||||
|
"tx_osnr": 45,
|
||||||
|
"min_spacing": 75e9,
|
||||||
|
"cost": 1
|
||||||
|
}]
|
||||||
|
# change default ROADM PDL so that crossing 2 ROADMs leasd to inifinte penalty for mode 1
|
||||||
|
eqpt_roadm = next(r for r in json_data['Roadm'] if 'type_variety' not in r)
|
||||||
|
eqpt_roadm['pdl'] = 0.5
|
||||||
|
equipment = _equipment_from_json(json_data, eqpt_library_name)
|
||||||
|
network = load_network(network_file_name, equipment)
|
||||||
|
data = load_requests(filename=Path(__file__).parent.parent / 'tests/data/testTopology_services_expected.json',
|
||||||
|
eqpt=eqpt_library_name, bidir=False, network=network, network_filename=network_file_name)
|
||||||
|
# remove the mode from request, change it to larger spacing
|
||||||
|
data['path-request'][1]['path-constraints']['te-bandwidth']['trx_mode'] = None
|
||||||
|
data['path-request'][1]['path-constraints']['te-bandwidth']['spacing'] = 75e9
|
||||||
|
assert_allclose(watt2dbm(data['path-request'][1]['path-constraints']['te-bandwidth']['output-power']), 1, rtol=1e-9)
|
||||||
|
# use the request power for design, or there will be inconsistencies with the gain
|
||||||
|
build_network(network, equipment, 1, 21)
|
||||||
|
|
||||||
|
rqs = requests_from_json(data, equipment)
|
||||||
|
rqs = correct_json_route_list(network, rqs)
|
||||||
|
[path] = compute_path_dsjctn(network, equipment, [rqs[1]], [])
|
||||||
|
total_path, mode = propagate_and_optimize_mode(path, rqs[1], equipment)
|
||||||
|
assert round(min(path[-1].snr_01nm), 2) == 22.22
|
||||||
|
assert mode['format'] == 'mode 1'
|
||||||
|
assert rqs[1].blocking_reason == 'NO_FEASIBLE_MODE'
|
||||||
|
expected_mesg = '\tWarning! Request 1: no mode satisfies path SNR requirement.'
|
||||||
|
# Last log records mustcontain the message about the las explored mode
|
||||||
|
assert expected_mesg in caplog.records[-1].message
|
||||||
|
|||||||
@@ -119,8 +119,9 @@ def create_rq(equipment, srce, dest, bdir, node_list, loose_list, rqid='test_req
|
|||||||
'nodes_list': node_list,
|
'nodes_list': node_list,
|
||||||
'loose_list': loose_list,
|
'loose_list': loose_list,
|
||||||
'path_bandwidth': 100.0e9,
|
'path_bandwidth': 100.0e9,
|
||||||
'power': 1.0,
|
'power': 1.0e-3,
|
||||||
'effective_freq_slot': None,
|
'tx_power': 1.0e-3,
|
||||||
|
'effective_freq_slot': None
|
||||||
}
|
}
|
||||||
params['format'] = params['trx_mode']
|
params['format'] = params['trx_mode']
|
||||||
trx_params = trx_mode_params(equipment, params['trx_type'], params['trx_mode'], True)
|
trx_params = trx_mode_params(equipment, params['trx_type'], params['trx_mode'], True)
|
||||||
@@ -258,7 +259,8 @@ def request_set():
|
|||||||
'f_min': 191.1e12,
|
'f_min': 191.1e12,
|
||||||
'f_max': 196.3e12,
|
'f_max': 196.3e12,
|
||||||
'nb_channel': None,
|
'nb_channel': None,
|
||||||
'power': 0,
|
'power': 1e-3,
|
||||||
|
'tx_power': 1e-3,
|
||||||
'path_bandwidth': 200e9}
|
'path_bandwidth': 200e9}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -17,12 +17,14 @@ from copy import deepcopy
|
|||||||
from gnpy.core.utils import lin2db, automatic_nch, dbm2watt, power_dbm_to_psd_mw_ghz, watt2dbm, psd2powerdbm
|
from gnpy.core.utils import lin2db, automatic_nch, dbm2watt, power_dbm_to_psd_mw_ghz, watt2dbm, psd2powerdbm
|
||||||
from gnpy.core.network import build_network
|
from gnpy.core.network import build_network
|
||||||
from gnpy.core.elements import Roadm
|
from gnpy.core.elements import Roadm
|
||||||
from gnpy.core.info import create_input_spectral_information, create_arbitrary_spectral_information, ReferenceCarrier
|
from gnpy.core.info import create_input_spectral_information, create_arbitrary_spectral_information, ReferenceCarrier, \
|
||||||
|
carriers_to_spectral_information
|
||||||
from gnpy.core.equipment import trx_mode_params
|
from gnpy.core.equipment import trx_mode_params
|
||||||
from gnpy.core.exceptions import ConfigurationError
|
from gnpy.core.exceptions import ConfigurationError
|
||||||
from gnpy.tools.json_io import network_from_json, load_equipment, load_network, _spectrum_from_json, load_json, \
|
from gnpy.tools.json_io import network_from_json, load_equipment, load_network, _spectrum_from_json, load_json, \
|
||||||
Transceiver, requests_from_json
|
Transceiver, requests_from_json
|
||||||
from gnpy.topology.request import PathRequest, compute_constrained_path, propagate, propagate_and_optimize_mode
|
from gnpy.topology.request import PathRequest, compute_constrained_path, propagate, propagate_and_optimize_mode
|
||||||
|
from gnpy.topology.spectrum_assignment import build_oms_list
|
||||||
|
|
||||||
|
|
||||||
TEST_DIR = Path(__file__).parent
|
TEST_DIR = Path(__file__).parent
|
||||||
@@ -54,6 +56,7 @@ def test_equalization_combination_degree(delta_pdb_per_channel, degree, equaliza
|
|||||||
|
|
||||||
roadm_config = {
|
roadm_config = {
|
||||||
"uid": "roadm Lannion_CAS",
|
"uid": "roadm Lannion_CAS",
|
||||||
|
"type_variety": "default",
|
||||||
"params": {
|
"params": {
|
||||||
"per_degree_pch_out_db": {
|
"per_degree_pch_out_db": {
|
||||||
"east edfa in Lannion_CAS to Corlay": -16
|
"east edfa in Lannion_CAS to Corlay": -16
|
||||||
@@ -68,10 +71,13 @@ def test_equalization_combination_degree(delta_pdb_per_channel, degree, equaliza
|
|||||||
"restrictions": {
|
"restrictions": {
|
||||||
"preamp_variety_list": [],
|
"preamp_variety_list": [],
|
||||||
"booster_variety_list": []
|
"booster_variety_list": []
|
||||||
}
|
},
|
||||||
|
"roadm-path-impairments": [],
|
||||||
|
"design_bands": None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
roadm = Roadm(**roadm_config)
|
roadm = Roadm(**roadm_config)
|
||||||
|
roadm.set_roadm_paths(from_degree='tata', to_degree=degree, path_type='express')
|
||||||
roadm.ref_pch_in_dbm['tata'] = 0
|
roadm.ref_pch_in_dbm['tata'] = 0
|
||||||
roadm.ref_carrier = ReferenceCarrier(baud_rate=32e9, slot_width=50e9)
|
roadm.ref_carrier = ReferenceCarrier(baud_rate=32e9, slot_width=50e9)
|
||||||
frequency = 191e12 + array([0, 50e9, 150e9, 225e9, 275e9])
|
frequency = 191e12 + array([0, 50e9, 150e9, 225e9, 275e9])
|
||||||
@@ -85,6 +91,7 @@ def test_equalization_combination_degree(delta_pdb_per_channel, degree, equaliza
|
|||||||
to_json_before_propagation = {
|
to_json_before_propagation = {
|
||||||
'uid': 'roadm Lannion_CAS',
|
'uid': 'roadm Lannion_CAS',
|
||||||
'type': 'Roadm',
|
'type': 'Roadm',
|
||||||
|
"type_variety": "default",
|
||||||
'params': {
|
'params': {
|
||||||
equalization_type: target,
|
equalization_type: target,
|
||||||
'restrictions': {'preamp_variety_list': [], 'booster_variety_list': []},
|
'restrictions': {'preamp_variety_list': [], 'booster_variety_list': []},
|
||||||
@@ -118,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": {
|
||||||
@@ -229,7 +237,9 @@ def test_low_input_power(target_out, delta_pdb_per_channel, correction):
|
|||||||
"restrictions": {
|
"restrictions": {
|
||||||
"preamp_variety_list": [],
|
"preamp_variety_list": [],
|
||||||
"booster_variety_list": []
|
"booster_variety_list": []
|
||||||
}
|
},
|
||||||
|
"roadm-path-impairments": [],
|
||||||
|
"design_bands": None
|
||||||
},
|
},
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"location": {
|
"location": {
|
||||||
@@ -241,6 +251,7 @@ def test_low_input_power(target_out, delta_pdb_per_channel, correction):
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
roadm = Roadm(**roadm_config)
|
roadm = Roadm(**roadm_config)
|
||||||
|
roadm.set_roadm_paths(from_degree='tata', to_degree='toto', path_type='express')
|
||||||
roadm.ref_pch_in_dbm['tata'] = 0
|
roadm.ref_pch_in_dbm['tata'] = 0
|
||||||
roadm.ref_carrier = ReferenceCarrier(baud_rate=32e9, slot_width=50e9)
|
roadm.ref_carrier = ReferenceCarrier(baud_rate=32e9, slot_width=50e9)
|
||||||
si = roadm(si, degree='toto', from_degree='tata')
|
si = roadm(si, degree='toto', from_degree='tata')
|
||||||
@@ -281,7 +292,9 @@ def test_2low_input_power(target_out, delta_pdb_per_channel, correction):
|
|||||||
"restrictions": {
|
"restrictions": {
|
||||||
"preamp_variety_list": [],
|
"preamp_variety_list": [],
|
||||||
"booster_variety_list": []
|
"booster_variety_list": []
|
||||||
}
|
},
|
||||||
|
"roadm-path-impairments": [],
|
||||||
|
"design_bands": None
|
||||||
},
|
},
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"location": {
|
"location": {
|
||||||
@@ -293,6 +306,7 @@ def test_2low_input_power(target_out, delta_pdb_per_channel, correction):
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
roadm = Roadm(**roadm_config)
|
roadm = Roadm(**roadm_config)
|
||||||
|
roadm.set_roadm_paths(from_degree='tata', to_degree='toto', path_type='express')
|
||||||
roadm.ref_pch_in_dbm['tata'] = 0
|
roadm.ref_pch_in_dbm['tata'] = 0
|
||||||
roadm.ref_carrier = ReferenceCarrier(baud_rate=32e9, slot_width=50e9)
|
roadm.ref_carrier = ReferenceCarrier(baud_rate=32e9, slot_width=50e9)
|
||||||
si = roadm(si, degree='toto', from_degree='tata')
|
si = roadm(si, degree='toto', from_degree='tata')
|
||||||
@@ -322,10 +336,11 @@ def create_voyager_req(equipment, source, dest, bidir, nodes_list, loose_list, m
|
|||||||
'nodes_list': nodes_list,
|
'nodes_list': nodes_list,
|
||||||
'loose_list': loose_list,
|
'loose_list': loose_list,
|
||||||
'path_bandwidth': 100.0e9,
|
'path_bandwidth': 100.0e9,
|
||||||
'effective_freq_slot': None}
|
'effective_freq_slot': None,
|
||||||
|
'power': 1e-3,
|
||||||
|
'tx_power': 1e-3}
|
||||||
trx_params = trx_mode_params(equipment, params['trx_type'], params['trx_mode'], True)
|
trx_params = trx_mode_params(equipment, params['trx_type'], params['trx_mode'], True)
|
||||||
params.update(trx_params)
|
params.update(trx_params)
|
||||||
params['power'] = dbm2watt(power_dbm) if power_dbm else dbm2watt(equipment['SI']['default'].power_dbm)
|
|
||||||
f_min = params['f_min']
|
f_min = params['f_min']
|
||||||
f_max_from_si = params['f_max']
|
f_max_from_si = params['f_max']
|
||||||
params['nb_channel'] = automatic_nch(f_min, f_max_from_si, params['spacing'])
|
params['nb_channel'] = automatic_nch(f_min, f_max_from_si, params['spacing'])
|
||||||
@@ -360,9 +375,9 @@ def test_initial_spectrum(mode, slot_width, power_dbm):
|
|||||||
assert_array_equal(infos_expected.frequency, infos_actual.frequency)
|
assert_array_equal(infos_expected.frequency, infos_actual.frequency)
|
||||||
assert_array_equal(infos_expected.baud_rate, infos_actual.baud_rate)
|
assert_array_equal(infos_expected.baud_rate, infos_actual.baud_rate)
|
||||||
assert_array_equal(infos_expected.slot_width, infos_actual.slot_width)
|
assert_array_equal(infos_expected.slot_width, infos_actual.slot_width)
|
||||||
assert_array_equal(infos_expected.signal, infos_actual.signal)
|
assert_allclose(infos_expected.signal, infos_actual.signal, rtol=1e-10)
|
||||||
assert_array_equal(infos_expected.nli, infos_actual.nli)
|
assert_allclose(infos_expected.nli, infos_actual.nli, rtol=1e-10)
|
||||||
assert_array_equal(infos_expected.ase, infos_actual.ase)
|
assert_allclose(infos_expected.ase, infos_actual.ase, rtol=1e-10)
|
||||||
assert_array_equal(infos_expected.roll_off, infos_actual.roll_off)
|
assert_array_equal(infos_expected.roll_off, infos_actual.roll_off)
|
||||||
assert_array_equal(infos_expected.chromatic_dispersion, infos_actual.chromatic_dispersion)
|
assert_array_equal(infos_expected.chromatic_dispersion, infos_actual.chromatic_dispersion)
|
||||||
assert_array_equal(infos_expected.pmd, infos_actual.pmd)
|
assert_array_equal(infos_expected.pmd, infos_actual.pmd)
|
||||||
@@ -531,8 +546,8 @@ def test_equalization(case, deltap, target, mode, slot_width, equalization):
|
|||||||
assert getattr(roadm, equalization) == target_psd
|
assert getattr(roadm, equalization) == target_psd
|
||||||
path = compute_constrained_path(network, req)
|
path = compute_constrained_path(network, req)
|
||||||
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, power=req.power,
|
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)
|
spacing=req.spacing, tx_osnr=req.tx_osnr, tx_power=req.power)
|
||||||
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)
|
||||||
@@ -575,9 +590,9 @@ def test_power_option(req_power):
|
|||||||
infos_actual = propagate(path2, req, equipment)
|
infos_actual = propagate(path2, req, equipment)
|
||||||
assert_array_equal(infos_expected.baud_rate, infos_actual.baud_rate)
|
assert_array_equal(infos_expected.baud_rate, infos_actual.baud_rate)
|
||||||
assert_array_equal(infos_expected.slot_width, infos_actual.slot_width)
|
assert_array_equal(infos_expected.slot_width, infos_actual.slot_width)
|
||||||
assert_array_equal(infos_expected.signal, infos_actual.signal)
|
assert_allclose(infos_expected.signal, infos_actual.signal, rtol=1e-10)
|
||||||
assert_array_equal(infos_expected.nli, infos_actual.nli)
|
assert_allclose(infos_expected.nli, infos_actual.nli, rtol=1e-10)
|
||||||
assert_array_equal(infos_expected.ase, infos_actual.ase)
|
assert_allclose(infos_expected.ase, infos_actual.ase, rtol=1e-10)
|
||||||
assert_array_equal(infos_expected.roll_off, infos_actual.roll_off)
|
assert_array_equal(infos_expected.roll_off, infos_actual.roll_off)
|
||||||
assert_array_equal(infos_expected.chromatic_dispersion, infos_actual.chromatic_dispersion)
|
assert_array_equal(infos_expected.chromatic_dispersion, infos_actual.chromatic_dispersion)
|
||||||
assert_array_equal(infos_expected.pmd, infos_actual.pmd)
|
assert_array_equal(infos_expected.pmd, infos_actual.pmd)
|
||||||
@@ -833,3 +848,103 @@ def test_power_offset_automatic_mode_selection(slot_width, value, equalization,
|
|||||||
_, mode = propagate_and_optimize_mode(path, free_req, equipment)
|
_, mode = propagate_and_optimize_mode(path, free_req, equipment)
|
||||||
assert mode['format'] == expected_mode
|
assert mode['format'] == expected_mode
|
||||||
assert_allclose(path_expected[-1].snr_01nm, path[-1].snr_01nm, rtol=1e-5)
|
assert_allclose(path_expected[-1].snr_01nm, path[-1].snr_01nm, rtol=1e-5)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('tx_power_dbm', [-10, -8, 0, 10])
|
||||||
|
def test_tx_power(tx_power_dbm):
|
||||||
|
"""If carrier add power is below equalization target + ROADM add max loss, then equalizatio
|
||||||
|
can not be applied.
|
||||||
|
"""
|
||||||
|
json_data = load_json(NETWORK_FILENAME)
|
||||||
|
for el in json_data['elements']:
|
||||||
|
if el['uid'] == 'roadm Lannion_CAS':
|
||||||
|
el['type_variety'] = 'example_detailed_impairments'
|
||||||
|
equipment = load_equipment(EQPT_FILENAME)
|
||||||
|
network = network_from_json(json_data, equipment)
|
||||||
|
default_spectrum = equipment['SI']['default']
|
||||||
|
p_db = default_spectrum.power_dbm
|
||||||
|
p_total_db = p_db + lin2db(automatic_nch(default_spectrum.f_min, default_spectrum.f_max, default_spectrum.spacing))
|
||||||
|
build_network(network, equipment, p_db, p_total_db)
|
||||||
|
build_oms_list(network, equipment)
|
||||||
|
expected_roadm_lannion = {
|
||||||
|
"uid": "roadm Lannion_CAS",
|
||||||
|
"type": "Roadm",
|
||||||
|
"type_variety": "example_detailed_impairments",
|
||||||
|
"params": {
|
||||||
|
"restrictions": {
|
||||||
|
"preamp_variety_list": [],
|
||||||
|
"booster_variety_list": []
|
||||||
|
},
|
||||||
|
'per_degree_pch_out_db': {'east edfa in Lannion_CAS to Corlay': -20,
|
||||||
|
'east edfa in Lannion_CAS to Morlaix': -20,
|
||||||
|
'east edfa in Lannion_CAS to Stbrieuc': -20},
|
||||||
|
"target_pch_out_db": -20
|
||||||
|
},
|
||||||
|
'metadata': {
|
||||||
|
'location': {
|
||||||
|
'city': 'Lannion_CAS',
|
||||||
|
'latitude': 2.0,
|
||||||
|
'longitude': 0.0,
|
||||||
|
'region': 'RLD'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
roadm = next(n for n in network.nodes() if n.uid == 'roadm Lannion_CAS')
|
||||||
|
assert roadm.to_json == expected_roadm_lannion
|
||||||
|
spectrum = _spectrum_from_json([
|
||||||
|
{
|
||||||
|
"f_min": 191.35e12,
|
||||||
|
"f_max": 191.35e12,
|
||||||
|
"baud_rate": 32e9,
|
||||||
|
"slot_width": 50e9,
|
||||||
|
"power_dbm": 0,
|
||||||
|
"roll_off": 0.15,
|
||||||
|
"tx_osnr": 40
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"f_min": 193.15e12,
|
||||||
|
"f_max": 193.15e12,
|
||||||
|
"baud_rate": 32e9,
|
||||||
|
"slot_width": 50e9,
|
||||||
|
"power_dbm": 0,
|
||||||
|
"roll_off": 0.15,
|
||||||
|
"tx_osnr": 40,
|
||||||
|
"tx_power_dbm": tx_power_dbm
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"f_min": 193.2e12,
|
||||||
|
"f_max": 193.2e12,
|
||||||
|
"baud_rate": 32e9,
|
||||||
|
"slot_width": 50e9,
|
||||||
|
"power_dbm": 0,
|
||||||
|
"roll_off": 0.15,
|
||||||
|
"tx_osnr": 40}])
|
||||||
|
power = 1.0e-3
|
||||||
|
si = carriers_to_spectral_information(initial_spectrum=spectrum,
|
||||||
|
power=power)
|
||||||
|
si = roadm(si, "east edfa in Lannion_CAS to Corlay", "trx Lannion_CAS")
|
||||||
|
# Checks that if tx_power on add port is below min required power, its equalization target can not be met
|
||||||
|
add_max_loss = next(e for e in getattr(equipment['Roadm']['example_detailed_impairments'], 'roadm-path-impairments')
|
||||||
|
if 'roadm-add-path' in e)['roadm-add-path'][0]['roadm-maxloss']
|
||||||
|
min_required_add_power = -20 + add_max_loss
|
||||||
|
power_reduction = max(0, min_required_add_power - tx_power_dbm)
|
||||||
|
assert_allclose(si.signal, dbm2watt(array([-20, -20 - power_reduction, -20])), rtol=1e-5)
|
||||||
|
path = ['trx Lannion_CAS',
|
||||||
|
'roadm Lannion_CAS',
|
||||||
|
'east edfa in Lannion_CAS to Stbrieuc',
|
||||||
|
'fiber (Lannion_CAS → Stbrieuc)-F056',
|
||||||
|
'east edfa in Stbrieuc to Rennes_STA',
|
||||||
|
'fiber (Stbrieuc → Rennes_STA)-F057',
|
||||||
|
'west edfa in Rennes_STA to Stbrieuc',
|
||||||
|
'roadm Rennes_STA',
|
||||||
|
'trx Rennes_STA']
|
||||||
|
|
||||||
|
si = carriers_to_spectral_information(initial_spectrum=spectrum,
|
||||||
|
power=power)
|
||||||
|
for i, uid in enumerate(path):
|
||||||
|
node = next(n for n in network.nodes() if n.uid == uid)
|
||||||
|
if isinstance(node, Roadm):
|
||||||
|
si = node(si, path[i + 1], path[i - 1])
|
||||||
|
else:
|
||||||
|
si = node(si)
|
||||||
|
assert_allclose(watt2dbm(si.signal + si.ase + si.nli), array([-20, -20, -20]), rtol=1e-5)
|
||||||
|
|||||||
@@ -53,7 +53,8 @@ def create_rq(equipment, srce, dest, bdir, nd_list, ls_list, mode, power_dbm):
|
|||||||
'effective_freq_slot': None,
|
'effective_freq_slot': None,
|
||||||
'path_bandwidth': 100000000000.0,
|
'path_bandwidth': 100000000000.0,
|
||||||
'spacing': 50e9 if mode == 'mode 1' else 75e9,
|
'spacing': 50e9 if mode == 'mode 1' else 75e9,
|
||||||
'power': dbm2watt(power_dbm)
|
'power': dbm2watt(power_dbm),
|
||||||
|
'tx_power': dbm2watt(power_dbm)
|
||||||
}
|
}
|
||||||
trx_params = trx_mode_params(equipment, params['trx_type'], params['trx_mode'], True)
|
trx_params = trx_mode_params(equipment, params['trx_type'], params['trx_mode'], True)
|
||||||
params.update(trx_params)
|
params.update(trx_params)
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ def test_create_arbitrary_spectral_information():
|
|||||||
si = create_arbitrary_spectral_information(frequency=[193.25e12, 193.3e12, 193.35e12],
|
si = create_arbitrary_spectral_information(frequency=[193.25e12, 193.3e12, 193.35e12],
|
||||||
baud_rate=32e9, signal=[1, 1, 1],
|
baud_rate=32e9, signal=[1, 1, 1],
|
||||||
delta_pdb_per_channel=[1, 1, 1],
|
delta_pdb_per_channel=[1, 1, 1],
|
||||||
tx_osnr=40.0)
|
tx_osnr=40.0, tx_power=[1, 1, 1])
|
||||||
assert_array_equal(si.baud_rate, array([32e9, 32e9, 32e9]))
|
assert_array_equal(si.baud_rate, array([32e9, 32e9, 32e9]))
|
||||||
assert_array_equal(si.slot_width, array([37.5e9, 37.5e9, 37.5e9]))
|
assert_array_equal(si.slot_width, array([37.5e9, 37.5e9, 37.5e9]))
|
||||||
assert_array_equal(si.signal, ones(3))
|
assert_array_equal(si.signal, ones(3))
|
||||||
@@ -33,7 +33,7 @@ def test_create_arbitrary_spectral_information():
|
|||||||
si = create_arbitrary_spectral_information(frequency=array([193.35e12, 193.3e12, 193.25e12]),
|
si = create_arbitrary_spectral_information(frequency=array([193.35e12, 193.3e12, 193.25e12]),
|
||||||
slot_width=array([50e9, 50e9, 50e9]),
|
slot_width=array([50e9, 50e9, 50e9]),
|
||||||
baud_rate=32e9, signal=array([1, 2, 3]),
|
baud_rate=32e9, signal=array([1, 2, 3]),
|
||||||
tx_osnr=40.0)
|
tx_osnr=40.0, tx_power=array([1, 2, 3]))
|
||||||
|
|
||||||
assert_array_equal(si.signal, array([3, 2, 1]))
|
assert_array_equal(si.signal, array([3, 2, 1]))
|
||||||
|
|
||||||
@@ -41,16 +41,16 @@ def test_create_arbitrary_spectral_information():
|
|||||||
r'larger than the slot width for channels: \[1, 3\].'):
|
r'larger than the slot width for channels: \[1, 3\].'):
|
||||||
create_arbitrary_spectral_information(frequency=[193.25e12, 193.3e12, 193.35e12], signal=1,
|
create_arbitrary_spectral_information(frequency=[193.25e12, 193.3e12, 193.35e12], signal=1,
|
||||||
baud_rate=[64e9, 32e9, 64e9], slot_width=50e9,
|
baud_rate=[64e9, 32e9, 64e9], slot_width=50e9,
|
||||||
tx_osnr=40.0)
|
tx_osnr=40.0, tx_power=1)
|
||||||
with pytest.raises(SpectrumError, match='Spectrum required slot widths larger than the frequency spectral '
|
with pytest.raises(SpectrumError, match='Spectrum required slot widths larger than the frequency spectral '
|
||||||
r'distances between channels: \[\(1, 2\), \(3, 4\)\].'):
|
r'distances between channels: \[\(1, 2\), \(3, 4\)\].'):
|
||||||
create_arbitrary_spectral_information(frequency=[193.26e12, 193.3e12, 193.35e12, 193.39e12], signal=1,
|
create_arbitrary_spectral_information(frequency=[193.26e12, 193.3e12, 193.35e12, 193.39e12], signal=1,
|
||||||
tx_osnr=40.0, baud_rate=32e9, slot_width=50e9)
|
tx_osnr=40.0, baud_rate=32e9, slot_width=50e9, tx_power=1)
|
||||||
with pytest.raises(SpectrumError, match='Spectrum required slot widths larger than the frequency spectral '
|
with pytest.raises(SpectrumError, match='Spectrum required slot widths larger than the frequency spectral '
|
||||||
r'distances between channels: \[\(1, 2\), \(2, 3\)\].'):
|
r'distances between channels: \[\(1, 2\), \(2, 3\)\].'):
|
||||||
create_arbitrary_spectral_information(frequency=[193.25e12, 193.3e12, 193.35e12], signal=1, baud_rate=49e9,
|
create_arbitrary_spectral_information(frequency=[193.25e12, 193.3e12, 193.35e12], signal=1, baud_rate=49e9,
|
||||||
tx_osnr=40.0, roll_off=0.1)
|
tx_osnr=40.0, roll_off=0.1, tx_power=1)
|
||||||
with pytest.raises(SpectrumError,
|
with pytest.raises(SpectrumError,
|
||||||
match='Dimension mismatch in input fields.'):
|
match='Dimension mismatch in input fields.'):
|
||||||
create_arbitrary_spectral_information(frequency=[193.25e12, 193.3e12, 193.35e12], signal=[1, 2], baud_rate=49e9,
|
create_arbitrary_spectral_information(frequency=[193.25e12, 193.3e12, 193.35e12], signal=[1, 2], baud_rate=49e9,
|
||||||
tx_osnr=40.0)
|
tx_osnr=40.0, tx_power=1)
|
||||||
|
|||||||
@@ -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"""
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ from gnpy.tools.convert import xls_to_json_data
|
|||||||
|
|
||||||
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'
|
||||||
|
MULTIBAND_EQPT_FILENAME = TEST_DIR / 'data/eqpt_config_multiband.json'
|
||||||
DATA_DIR = TEST_DIR / 'data'
|
DATA_DIR = TEST_DIR / 'data'
|
||||||
|
|
||||||
|
|
||||||
@@ -34,8 +35,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 ' \
|
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
|
||||||
|
|
||||||
|
|
||||||
@@ -181,7 +182,7 @@ def wrong_requests():
|
|||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
'expected_msg': 'Equipment Config error in imposed_mode: '
|
'expected_msg': 'Equipment Config error in imposed_mode: '
|
||||||
+ 'Could not find transponder "test_offset" with mode "mode 3" in equipment library'
|
+ 'Could not find transponder "test_offset" in equipment library'
|
||||||
})
|
})
|
||||||
data.append({
|
data.append({
|
||||||
'error': ServiceError,
|
'error': ServiceError,
|
||||||
@@ -420,3 +421,167 @@ def test_log_wrong_xlsx(caplog, input_filename, expected_msg):
|
|||||||
"""
|
"""
|
||||||
_ = xls_to_json_data(input_filename)
|
_ = xls_to_json_data(input_filename)
|
||||||
assert expected_msg in caplog.text
|
assert expected_msg in caplog.text
|
||||||
|
|
||||||
|
|
||||||
|
def wrong_configs():
|
||||||
|
wrong_config = [[{
|
||||||
|
"uid": "Edfa1",
|
||||||
|
"type": "Edfa",
|
||||||
|
"type_variety": "std_medium_gain_multiband",
|
||||||
|
"operational": {
|
||||||
|
"gain_target": 21,
|
||||||
|
"delta_p": 3.0,
|
||||||
|
"out_voa": 3.0,
|
||||||
|
"in_voa": 0.0,
|
||||||
|
"tilt_target": 0.0,
|
||||||
|
"f_min": 186.2,
|
||||||
|
"f_max": 190.2
|
||||||
|
}},
|
||||||
|
ParametersError]
|
||||||
|
]
|
||||||
|
wrong_config.append([{
|
||||||
|
"uid": "[83/WR-2-4-SIG=>930/WRT-1-2-SIG]-PhysicalConn/2056",
|
||||||
|
"type": "Fiber",
|
||||||
|
"type_variety": "SSMF",
|
||||||
|
"params": {
|
||||||
|
"dispersion_per_frequency": {
|
||||||
|
"frequency": [
|
||||||
|
185.49234135667396e12,
|
||||||
|
186.05251641137855e12,
|
||||||
|
188.01312910284463e12,
|
||||||
|
189.99124726477024e12],
|
||||||
|
"value": [
|
||||||
|
1.60e-05,
|
||||||
|
1.67e-05,
|
||||||
|
1.7e-05,
|
||||||
|
1.8e-05]
|
||||||
|
},
|
||||||
|
"loss_coef": 2.85,
|
||||||
|
"length_units": "km",
|
||||||
|
"att_in": 0.0,
|
||||||
|
"con_in": 0.0,
|
||||||
|
"con_out": 0.0
|
||||||
|
}},
|
||||||
|
ParametersError
|
||||||
|
])
|
||||||
|
wrong_config.append([{
|
||||||
|
"uid": "east edfa in Lannion_CAS to Stbrieuc",
|
||||||
|
"metadata": {
|
||||||
|
"location": {
|
||||||
|
"city": "Lannion_CAS",
|
||||||
|
"region": "RLD",
|
||||||
|
"latitude": 2.0,
|
||||||
|
"longitude": 0.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "Multiband_amplifier",
|
||||||
|
"type_variety": "std_low_gain_multiband",
|
||||||
|
"amplifiers": [{
|
||||||
|
"type_variety": "std_low_gain",
|
||||||
|
"operational": {
|
||||||
|
"gain_target": 20.0,
|
||||||
|
"delta_p": 0,
|
||||||
|
"tilt_target": 0,
|
||||||
|
"out_voa": 0
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
"type_variety": "std_low_gain_L_ter",
|
||||||
|
"operational": {
|
||||||
|
"gain_target": 20.0,
|
||||||
|
"delta_p": 1,
|
||||||
|
"tilt_target": 0,
|
||||||
|
"out_voa": 1
|
||||||
|
}
|
||||||
|
}]},
|
||||||
|
ConfigurationError])
|
||||||
|
wrong_config.append([{
|
||||||
|
"uid": "east edfa in Lannion_CAS to Stbrieuc",
|
||||||
|
"metadata": {
|
||||||
|
"location": {
|
||||||
|
"city": "Lannion_CAS",
|
||||||
|
"region": "RLD",
|
||||||
|
"latitude": 2.0,
|
||||||
|
"longitude": 0.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "Edfa",
|
||||||
|
"type_variety": "std_low_gain_multiband",
|
||||||
|
"amplifiers": [{
|
||||||
|
"type_variety": "std_low_gain",
|
||||||
|
"operational": {
|
||||||
|
"gain_target": 20.0,
|
||||||
|
"delta_p": 0,
|
||||||
|
"tilt_target": 0,
|
||||||
|
"out_voa": 0
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
"type_variety": "std_low_gain_L",
|
||||||
|
"operational": {
|
||||||
|
"gain_target": 20.0,
|
||||||
|
"delta_p": 1,
|
||||||
|
"tilt_target": 0,
|
||||||
|
"out_voa": 1
|
||||||
|
}
|
||||||
|
}]},
|
||||||
|
ParametersError])
|
||||||
|
wrong_config.append([{
|
||||||
|
"uid": "east edfa in Lannion_CAS to Stbrieuc",
|
||||||
|
"metadata": {
|
||||||
|
"location": {
|
||||||
|
"city": "Lannion_CAS",
|
||||||
|
"region": "RLD",
|
||||||
|
"latitude": 2.0,
|
||||||
|
"longitude": 0.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "Multiband_amplifier",
|
||||||
|
"type_variety": "std_low_gain_multiband",
|
||||||
|
"amplifiers": [{
|
||||||
|
"type_variety": "std_low_gain",
|
||||||
|
"operational": {
|
||||||
|
"gain_target": 20.0,
|
||||||
|
"delta_p": 0,
|
||||||
|
"tilt_target": 0,
|
||||||
|
"out_voa": 0
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
"type_variety": "std_low_gain_L",
|
||||||
|
"operational": {
|
||||||
|
"gain_target": 20.0,
|
||||||
|
"delta_p": 1,
|
||||||
|
"tilt_target": 0,
|
||||||
|
"out_voa": 1
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
"type_variety": "std_low_gain",
|
||||||
|
"operational": {
|
||||||
|
"gain_target": 20.0,
|
||||||
|
"delta_p": 1,
|
||||||
|
"tilt_target": 0,
|
||||||
|
"out_voa": 1
|
||||||
|
}
|
||||||
|
}]},
|
||||||
|
ParametersError])
|
||||||
|
return wrong_config
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('el_config, error_type', wrong_configs())
|
||||||
|
def test_wrong_multiband(el_config, error_type):
|
||||||
|
|
||||||
|
equipment = load_equipment(MULTIBAND_EQPT_FILENAME)
|
||||||
|
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": []
|
||||||
|
}
|
||||||
|
with pytest.raises(error_type):
|
||||||
|
_ = network_from_json(json_data, equipment)
|
||||||
|
|||||||
@@ -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'
|
||||||
|
|
||||||
|
|
||||||
@@ -228,6 +233,7 @@ def test_design_non_amplified_link(elem1, elem2, expected_gain, expected_delta_p
|
|||||||
equipment = load_equipment(EQPT_FILENAME)
|
equipment = load_equipment(EQPT_FILENAME)
|
||||||
equipment['Span']['default'].power_mode = power_mode
|
equipment['Span']['default'].power_mode = power_mode
|
||||||
equipment['SI']['default'].power_dbm = p_db
|
equipment['SI']['default'].power_dbm = p_db
|
||||||
|
equipment['SI']['default'].tx_power_dbm = p_db
|
||||||
network = network_from_json(json_data, equipment)
|
network = network_from_json(json_data, equipment)
|
||||||
edfa = next(a for a in network.nodes() if a.uid == 'edfa')
|
edfa = next(a for a in network.nodes() if a.uid == 'edfa')
|
||||||
edfa.params.out_voa_auto = True
|
edfa.params.out_voa_auto = True
|
||||||
@@ -240,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
|
||||||
|
|||||||
@@ -40,17 +40,18 @@ def test_fiber_parameters():
|
|||||||
fiber_dict_cr.update(Fiber(**fiber_dict_cr).__dict__)
|
fiber_dict_cr.update(Fiber(**fiber_dict_cr).__dict__)
|
||||||
fiber_params_cr = FiberParams(**fiber_dict_cr)
|
fiber_params_cr = FiberParams(**fiber_dict_cr)
|
||||||
|
|
||||||
raman_coefficient_explicit_g0 = fiber_params_explicit_g0.raman_coefficient
|
norm_gamma_raman_explicit_g0 = fiber_params_explicit_g0.raman_coefficient.normalized_gamma_raman
|
||||||
raman_coefficient_explicit_g0 =\
|
norm_gamma_raman_default_g0 = fiber_params_default_g0.raman_coefficient.normalized_gamma_raman
|
||||||
raman_coefficient_explicit_g0.normalized_gamma_raman * fiber_params_explicit_g0._raman_reference_frequency
|
|
||||||
|
|
||||||
raman_coefficient_default_g0 = fiber_params_default_g0.raman_coefficient
|
norm_gamma_raman_cr = fiber_params_cr.raman_coefficient.normalized_gamma_raman
|
||||||
raman_coefficient_default_g0 = \
|
|
||||||
raman_coefficient_default_g0.normalized_gamma_raman * fiber_params_default_g0._raman_reference_frequency
|
|
||||||
|
|
||||||
raman_coefficient_cr = fiber_params_cr.raman_coefficient
|
assert_allclose(norm_gamma_raman_explicit_g0, norm_gamma_raman_default_g0, rtol=1e-10)
|
||||||
raman_coefficient_cr = \
|
assert_allclose(norm_gamma_raman_explicit_g0, norm_gamma_raman_cr, rtol=1e-10)
|
||||||
raman_coefficient_cr.normalized_gamma_raman * fiber_params_cr._raman_reference_frequency
|
|
||||||
|
|
||||||
assert_allclose(raman_coefficient_explicit_g0, raman_coefficient_default_g0, rtol=1e-10)
|
# Change Effective Area
|
||||||
assert_allclose(raman_coefficient_explicit_g0, raman_coefficient_cr, rtol=1e-10)
|
fiber_dict_default_g0['effective_area'] = 100e-12
|
||||||
|
no_ssmf_fiber_params = FiberParams(**fiber_dict_default_g0)
|
||||||
|
|
||||||
|
norm_gamma_raman_default_g0_no_ssmf = no_ssmf_fiber_params.raman_coefficient.normalized_gamma_raman
|
||||||
|
|
||||||
|
assert_allclose(norm_gamma_raman_explicit_g0, norm_gamma_raman_default_g0_no_ssmf, rtol=1e-10)
|
||||||
|
|||||||
@@ -25,14 +25,14 @@ import pytest
|
|||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
from gnpy.core.utils import automatic_nch, lin2db
|
from gnpy.core.utils import automatic_nch, lin2db
|
||||||
from gnpy.core.network import build_network, add_missing_elements_in_network
|
from gnpy.core.network import build_network, add_missing_elements_in_network
|
||||||
from gnpy.core.exceptions import ServiceError
|
from gnpy.core.exceptions import ServiceError, ConfigurationError
|
||||||
from gnpy.topology.request import (jsontocsv, requests_aggregation, compute_path_dsjctn, deduplicate_disjunctions,
|
from gnpy.topology.request import (jsontocsv, requests_aggregation, compute_path_dsjctn, deduplicate_disjunctions,
|
||||||
compute_path_with_disjunction, ResultElement, PathRequest)
|
compute_path_with_disjunction, ResultElement, PathRequest)
|
||||||
from gnpy.topology.spectrum_assignment import build_oms_list, pth_assign_spectrum
|
from gnpy.topology.spectrum_assignment import build_oms_list, pth_assign_spectrum
|
||||||
from gnpy.tools.convert import convert_file
|
from gnpy.tools.convert import convert_file
|
||||||
from gnpy.tools.json_io import (load_json, load_network, save_network, load_equipment, requests_from_json,
|
from gnpy.tools.json_io import (load_json, load_network, save_network, load_equipment, requests_from_json,
|
||||||
disjunctions_from_json, network_to_json, network_from_json)
|
disjunctions_from_json, network_to_json, network_from_json)
|
||||||
from gnpy.tools.service_sheet import read_service_sheet, correct_xls_route_list
|
from gnpy.tools.service_sheet import read_service_sheet, correct_xls_route_list, Request_element, Request
|
||||||
|
|
||||||
TEST_DIR = Path(__file__).parent
|
TEST_DIR = Path(__file__).parent
|
||||||
DATA_DIR = TEST_DIR / 'data'
|
DATA_DIR = TEST_DIR / 'data'
|
||||||
@@ -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 = []
|
||||||
@@ -274,54 +274,45 @@ def test_json_response_generation(xls_input, expected_response_file):
|
|||||||
else:
|
else:
|
||||||
assert expected['response'][i] == response
|
assert expected['response'][i] == response
|
||||||
|
|
||||||
# test the correspondance names dict in case of excel input
|
|
||||||
# test that using the created json network still works with excel input
|
|
||||||
# test all configurations of names: trx names, roadm, fused, ila and fiber
|
|
||||||
# as well as splitted case
|
|
||||||
|
|
||||||
# initial network is based on the couple testTopology.xls/ testTopology_auto_design_expected.json
|
|
||||||
# with added constraints to cover more test cases
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize('source, destination, route_list, hoptype, expected_correction', [
|
@pytest.mark.parametrize('source, destination, route_list, hoptype, expected_correction', [
|
||||||
('trx Brest_KLA', 'trx Vannes_KBE',
|
('Brest_KLA', 'Vannes_KBE',
|
||||||
'roadm Brest_KLA | roadm Lannion_CAS | roadm Lorient_KMA | roadm Vannes_KBE',
|
'roadm Brest_KLA | roadm Lannion_CAS | roadm Lorient_KMA | roadm Vannes_KBE',
|
||||||
'STRICT',
|
'no',
|
||||||
['roadm Brest_KLA', 'roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE']),
|
['roadm Brest_KLA', 'roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE']),
|
||||||
('trx Brest_KLA', 'trx Vannes_KBE',
|
('Brest_KLA', 'Vannes_KBE',
|
||||||
'trx Brest_KLA | roadm Lannion_CAS | roadm Lorient_KMA | roadm Vannes_KBE',
|
'trx Brest_KLA | roadm Lannion_CAS | roadm Lorient_KMA | roadm Vannes_KBE',
|
||||||
'STRICT',
|
'No',
|
||||||
['roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE']),
|
['roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE']),
|
||||||
('trx Lannion_CAS', 'trx Rennes_STA', 'trx Rennes_STA', 'LOOSE', []),
|
('Lannion_CAS', 'Rennes_STA', 'trx Rennes_STA', 'yes', []),
|
||||||
('trx Lannion_CAS', 'trx Lorient_KMA', 'toto', 'LOOSE', []),
|
('Lannion_CAS', 'Lorient_KMA', 'toto', 'yes', []),
|
||||||
('trx Lannion_CAS', 'trx Lorient_KMA', 'toto', 'STRICT', 'Fail'),
|
('Lannion_CAS', 'Lorient_KMA', 'toto', 'no', 'Fail'),
|
||||||
('trx Lannion_CAS', 'trx Lorient_KMA', 'Corlay | Loudeac | Lorient_KMA', 'LOOSE',
|
('Lannion_CAS', 'Lorient_KMA', 'Corlay | Loudeac | Lorient_KMA', 'yes',
|
||||||
['west fused spans in Corlay', 'west fused spans in Loudeac', 'roadm Lorient_KMA']),
|
['west fused spans in Corlay', 'west fused spans in Loudeac', 'roadm Lorient_KMA']),
|
||||||
('trx Lannion_CAS', 'trx Lorient_KMA', 'Ploermel | Vannes_KBE', 'LOOSE',
|
('Lannion_CAS', 'Lorient_KMA', 'Ploermel | Vannes_KBE', 'yes',
|
||||||
['east edfa in Ploermel to Vannes_KBE', 'roadm Vannes_KBE']),
|
['east edfa in Ploermel to Vannes_KBE', 'roadm Vannes_KBE']),
|
||||||
('trx Rennes_STA', 'trx Brest_KLA', 'Vannes_KBE | Quimper | Brest_KLA', 'LOOSE',
|
('Rennes_STA', 'Brest_KLA', 'Vannes_KBE | Quimper | Brest_KLA', 'yes',
|
||||||
['roadm Vannes_KBE', 'west edfa in Quimper to Lorient_KMA', 'roadm Brest_KLA']),
|
['roadm Vannes_KBE', 'west edfa in Quimper to Lorient_KMA', 'roadm Brest_KLA']),
|
||||||
('trx Brest_KLA', 'trx Rennes_STA', 'Brest_KLA | Quimper | Lorient_KMA', 'LOOSE',
|
('Brest_KLA', 'Rennes_STA', 'Brest_KLA | Quimper | Lorient_KMA', 'yes',
|
||||||
['roadm Brest_KLA', 'east edfa in Quimper to Lorient_KMA', 'roadm Lorient_KMA']),
|
['roadm Brest_KLA', 'east edfa in Quimper to Lorient_KMA', 'roadm Lorient_KMA']),
|
||||||
('Brest_KLA', 'trx Rennes_STA', '', 'LOOSE', 'Fail'),
|
('Brest_KLA', 'trx Rennes_STA', '', 'yes', 'Fail'),
|
||||||
('trx Brest_KLA', 'Rennes_STA', '', 'LOOSE', 'Fail'),
|
('trx Brest_KLA', 'Rennes_STA', '', 'yes', 'Fail'),
|
||||||
('Brest_KLA', 'Rennes_STA', '', 'LOOSE', 'Fail'),
|
('trx Brest_KLA', 'trx Rennes_STA', '', 'yes', 'Fail'),
|
||||||
('Brest_KLA', 'trx Rennes_STA', '', 'STRICT', 'Fail'),
|
('Brest_KLA', 'trx Rennes_STA', '', 'no', 'Fail'),
|
||||||
('trx Brest_KLA', 'trx Rennes_STA', 'trx Rennes_STA', 'STRICT', []),
|
('Brest_KLA', 'Rennes_STA', 'trx Rennes_STA', 'no', []),
|
||||||
('trx Brest_KLA', 'trx Rennes_STA', None, '', []),
|
('Brest_KLA', 'Rennes_STA', None, '', []),
|
||||||
('trx Brest_KLA', 'trx Rennes_STA', 'Brest_KLA | Quimper | Ploermel', 'LOOSE',
|
('Brest_KLA', 'Rennes_STA', 'Brest_KLA | Quimper | Ploermel', 'yes',
|
||||||
['roadm Brest_KLA']),
|
['roadm Brest_KLA']),
|
||||||
('trx Brest_KLA', 'trx Rennes_STA', 'Brest_KLA | Quimper | Ploermel', 'STRICT',
|
('Brest_KLA', 'Rennes_STA', 'Brest_KLA | Quimper | Ploermel', 'no',
|
||||||
['roadm Brest_KLA']),
|
['roadm Brest_KLA']),
|
||||||
('trx Brest_KLA', 'trx Rennes_STA', 'Brest_KLA | trx Quimper', 'LOOSE', ['roadm Brest_KLA']),
|
('Brest_KLA', 'Rennes_STA', 'Brest_KLA | trx Quimper', 'yes', ['roadm Brest_KLA']),
|
||||||
('trx Brest_KLA', 'trx Rennes_STA', 'Brest_KLA | trx Lannion_CAS', 'LOOSE', ['roadm Brest_KLA']),
|
('Brest_KLA', 'Rennes_STA', 'Brest_KLA | trx Lannion_CAS', 'yes', ['roadm Brest_KLA']),
|
||||||
('trx Brest_KLA', 'trx Rennes_STA', 'Brest_KLA | trx Lannion_CAS', 'STRICT', 'Fail')
|
('Brest_KLA', 'Rennes_STA', 'Brest_KLA | trx Lannion_CAS', 'no', 'Fail')
|
||||||
])
|
])
|
||||||
def test_excel_ila_constraints(source, destination, route_list, hoptype, expected_correction):
|
def test_excel_ila_constraints(source, destination, route_list, hoptype, expected_correction):
|
||||||
"""add different kind of constraints to test all correct_route cases"""
|
"""add different kind of constraints to test all correct_route cases"""
|
||||||
service_xls_input = DATA_DIR / 'testTopology.xls'
|
service_xls_input = DATA_DIR / 'testTopology.xls'
|
||||||
network_json_input = DATA_DIR / 'testTopology_auto_design_expected.json'
|
network_json_input = DATA_DIR / 'testTopology_auto_design_expected.json'
|
||||||
equipment = load_equipment(eqpt_filename)
|
|
||||||
network = load_network(network_json_input, equipment)
|
network = load_network(network_json_input, equipment)
|
||||||
# increase length of one span to trigger automatic fiber splitting included by autodesign
|
# increase length of one span to trigger automatic fiber splitting included by autodesign
|
||||||
# so that the test also covers this case
|
# so that the test also covers this case
|
||||||
@@ -331,36 +322,20 @@ def test_excel_ila_constraints(source, destination, route_list, hoptype, expecte
|
|||||||
p_db = default_si.power_dbm
|
p_db = default_si.power_dbm
|
||||||
p_total_db = p_db + lin2db(automatic_nch(default_si.f_min, default_si.f_max, default_si.spacing))
|
p_total_db = p_db + lin2db(automatic_nch(default_si.f_min, default_si.f_max, default_si.spacing))
|
||||||
build_network(network, equipment, p_db, p_total_db)
|
build_network(network, equipment, p_db, p_total_db)
|
||||||
# create params for a request based on input
|
# create params for a xls request based on input (note that this not the same type as PathRequest)
|
||||||
nodes_list = route_list.split(' | ') if route_list is not None else []
|
|
||||||
params = {
|
params = {
|
||||||
'request_id': '0',
|
'request_id': '0',
|
||||||
'source': source,
|
'source': source,
|
||||||
'bidir': False,
|
|
||||||
'destination': destination,
|
'destination': destination,
|
||||||
'trx_type': '',
|
'trx_type': 'Voyager',
|
||||||
'trx_mode': '',
|
'spacing': 50,
|
||||||
'format': '',
|
'nodes_list': route_list,
|
||||||
'spacing': '',
|
'is_loose': hoptype,
|
||||||
'nodes_list': nodes_list,
|
|
||||||
'loose_list': [hoptype for node in nodes_list] if route_list is not None else '',
|
|
||||||
'f_min': 0,
|
|
||||||
'f_max': 0,
|
|
||||||
'baud_rate': 0,
|
|
||||||
'OSNR': None,
|
|
||||||
'bit_rate': None,
|
|
||||||
'cost': None,
|
|
||||||
'roll_off': 0,
|
|
||||||
'tx_osnr': 0,
|
|
||||||
'penalties': None,
|
|
||||||
'min_spacing': None,
|
|
||||||
'nb_channel': 0,
|
'nb_channel': 0,
|
||||||
'power': 0,
|
'power': 0,
|
||||||
'path_bandwidth': 0,
|
'path_bandwidth': 0,
|
||||||
'effective_freq_slot': None,
|
|
||||||
'equalization_offset_db': 0
|
|
||||||
}
|
}
|
||||||
request = PathRequest(**params)
|
request = Request_element(Request(**params), equipment, False)
|
||||||
|
|
||||||
if expected_correction != 'Fail':
|
if expected_correction != 'Fail':
|
||||||
[request] = correct_xls_route_list(service_xls_input, network, [request])
|
[request] = correct_xls_route_list(service_xls_input, network, [request])
|
||||||
@@ -370,6 +345,55 @@ def test_excel_ila_constraints(source, destination, route_list, hoptype, expecte
|
|||||||
[request] = correct_xls_route_list(service_xls_input, network, [request])
|
[request] = correct_xls_route_list(service_xls_input, network, [request])
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('route_list, hoptype, expected_amp_route', [
|
||||||
|
('node1 | siteE | node2', 'no',
|
||||||
|
['roadm node1', 'west edfa in siteE', 'roadm node2']),
|
||||||
|
('node2 | siteE | node1', 'no',
|
||||||
|
['roadm node2', 'east edfa in siteE', 'roadm node1']),
|
||||||
|
('node1 | siteF | node2', 'no',
|
||||||
|
['roadm node1', 'west edfa in siteF', 'roadm node2']),
|
||||||
|
('node1 | siteA | siteB', 'yes',
|
||||||
|
['roadm node1', 'west edfa in siteA']),
|
||||||
|
('node1 | siteA | siteB | node2', 'yes',
|
||||||
|
['roadm node1', 'west edfa in siteA', 'west edfa in siteB', 'roadm node2']),
|
||||||
|
('node1 | siteC | node2', 'yes',
|
||||||
|
['roadm node1', 'east edfa in siteC', 'roadm node2']),
|
||||||
|
('node1 | siteD | node2', 'no',
|
||||||
|
['roadm node1', 'west edfa in siteD to node1', 'roadm node2']),
|
||||||
|
('roadm node1 | Edfa_booster_roadm node1_to_fiber (node1 → siteE)-CABLES#19 | west edfa in siteE | node2',
|
||||||
|
'no',
|
||||||
|
['roadm node1', 'Edfa_booster_roadm node1_to_fiber (node1 → siteE)-CABLES#19',
|
||||||
|
'west edfa in siteE', 'roadm node2'])])
|
||||||
|
def test_excel_ila_constraints2(route_list, hoptype, expected_amp_route):
|
||||||
|
"""Check different cases for ILA constraints definition
|
||||||
|
"""
|
||||||
|
network_xls_input = DATA_DIR / 'ila_constraint.xlsx'
|
||||||
|
network = load_network(network_xls_input, equipment)
|
||||||
|
add_missing_elements_in_network(network, equipment)
|
||||||
|
default_si = equipment['SI']['default']
|
||||||
|
p_db = default_si.power_dbm
|
||||||
|
p_total_db = p_db + lin2db(automatic_nch(default_si.f_min, default_si.f_max, default_si.spacing))
|
||||||
|
build_network(network, equipment, p_db, p_total_db)
|
||||||
|
# create params for a request based on input
|
||||||
|
|
||||||
|
params = {
|
||||||
|
'request_id': '0',
|
||||||
|
'source': 'node1',
|
||||||
|
'destination': 'node2',
|
||||||
|
'trx_type': 'Voyager',
|
||||||
|
'mode': None,
|
||||||
|
'spacing': 50,
|
||||||
|
'nodes_list': route_list,
|
||||||
|
'is_loose': hoptype,
|
||||||
|
'nb_channel': 80,
|
||||||
|
'power': 0,
|
||||||
|
'path_bandwidth': 100,
|
||||||
|
}
|
||||||
|
request = Request_element(Request(**params), equipment, False)
|
||||||
|
[request] = correct_xls_route_list(network_xls_input, network, [request])
|
||||||
|
assert request.nodes_list == expected_amp_route
|
||||||
|
|
||||||
|
|
||||||
def setup_per_degree(case):
|
def setup_per_degree(case):
|
||||||
"""common setup for degree: returns the dict network for different cases"""
|
"""common setup for degree: returns the dict network for different cases"""
|
||||||
json_network = load_json(DATA_DIR / 'testTopology_expected.json')
|
json_network = load_json(DATA_DIR / 'testTopology_expected.json')
|
||||||
@@ -565,3 +589,52 @@ def test_service_json_constraint_order():
|
|||||||
rqs = requests_from_json(data, equipment)
|
rqs = requests_from_json(data, equipment)
|
||||||
assert rqs[0].nodes_list == ['roadm Brest_KLA', 'roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE']
|
assert rqs[0].nodes_list == ['roadm Brest_KLA', 'roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE']
|
||||||
assert rqs[0].loose_list == ['STRICT', 'LOOSE', 'STRICT', 'STRICT']
|
assert rqs[0].loose_list == ['STRICT', 'LOOSE', 'STRICT', 'STRICT']
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('type_variety, target_pch_out_db, correct_variety', [(None, -20, True),
|
||||||
|
('example_test', -18, True),
|
||||||
|
('example', None, False)])
|
||||||
|
def test_roadm_type_variety(type_variety, target_pch_out_db, correct_variety):
|
||||||
|
"""Checks that if element has no variety, the default one is applied, and if it has one
|
||||||
|
that the type_variety is correctly applied
|
||||||
|
"""
|
||||||
|
json_data = {
|
||||||
|
"elements": [{
|
||||||
|
"uid": "roadm Oakland",
|
||||||
|
"type": "Roadm",
|
||||||
|
}],
|
||||||
|
"connections": []
|
||||||
|
}
|
||||||
|
expected_roadm = {
|
||||||
|
"uid": "roadm Oakland",
|
||||||
|
"type": "Roadm",
|
||||||
|
"params": {
|
||||||
|
"restrictions": {
|
||||||
|
"preamp_variety_list": [],
|
||||||
|
"booster_variety_list": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'metadata': {
|
||||||
|
'location': {
|
||||||
|
'city': None,
|
||||||
|
'latitude': 0,
|
||||||
|
'longitude': 0,
|
||||||
|
'region': None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if type_variety is not None:
|
||||||
|
json_data['elements'][0]['type_variety'] = type_variety
|
||||||
|
expected_roadm['type_variety'] = type_variety
|
||||||
|
else:
|
||||||
|
# Do not add type variety in json_data to test that it creates a 'default' type_variety
|
||||||
|
expected_roadm['type_variety'] = 'default'
|
||||||
|
expected_roadm['params']['target_pch_out_db'] = target_pch_out_db
|
||||||
|
equipment = load_equipment(eqpt_filename)
|
||||||
|
if correct_variety:
|
||||||
|
network = network_from_json(json_data, equipment)
|
||||||
|
roadm = [n for n in network.nodes()][0]
|
||||||
|
assert roadm.to_json == expected_roadm
|
||||||
|
else:
|
||||||
|
with pytest.raises(ConfigurationError):
|
||||||
|
network = network_from_json(json_data, equipment)
|
||||||
|
|||||||
136
tests/test_path_computation_functions.py
Normal file
136
tests/test_path_computation_functions.py
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# Module name: test_path_computation_functions.py
|
||||||
|
# Version:
|
||||||
|
# License: BSD 3-Clause Licence
|
||||||
|
# Copyright (c) 2018, Telecom Infra Project
|
||||||
|
|
||||||
|
"""
|
||||||
|
@author: esther.lerouzic
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
import pytest
|
||||||
|
from gnpy.core.network import build_network
|
||||||
|
from gnpy.core.utils import lin2db, automatic_nch
|
||||||
|
from gnpy.topology.request import explicit_path
|
||||||
|
from gnpy.topology.spectrum_assignment import build_oms_list
|
||||||
|
from gnpy.tools.json_io import load_equipment, load_network, requests_from_json
|
||||||
|
|
||||||
|
|
||||||
|
TEST_DIR = Path(__file__).parent
|
||||||
|
DATA_DIR = TEST_DIR / 'data'
|
||||||
|
EQPT_FILENAME = DATA_DIR / 'eqpt_config.json'
|
||||||
|
NETWORK_FILENAME = DATA_DIR / 'testTopology_auto_design_expected.json'
|
||||||
|
SERVICE_FILENAME = DATA_DIR / 'testTopology_services_expected.json'
|
||||||
|
equipment = load_equipment(EQPT_FILENAME)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture()
|
||||||
|
def setup_without_oms():
|
||||||
|
""" common setup for tests: builds network, equipment and oms only once
|
||||||
|
"""
|
||||||
|
network = load_network(NETWORK_FILENAME, equipment)
|
||||||
|
spectrum = equipment['SI']['default']
|
||||||
|
p_db = spectrum.power_dbm
|
||||||
|
p_total_db = p_db + lin2db(automatic_nch(spectrum.f_min, spectrum.f_max, spectrum.spacing))
|
||||||
|
build_network(network, equipment, p_db, p_total_db)
|
||||||
|
return network
|
||||||
|
|
||||||
|
|
||||||
|
def some_request(explicit_route):
|
||||||
|
"""Create a request with an explicit route
|
||||||
|
"""
|
||||||
|
route = {
|
||||||
|
"route-object-include-exclude": [
|
||||||
|
{
|
||||||
|
"explicit-route-usage": "route-include-ero",
|
||||||
|
"index": i,
|
||||||
|
"num-unnum-hop": {
|
||||||
|
"node-id": node_id,
|
||||||
|
"link-tp-id": "link-tp-id is not used",
|
||||||
|
"hop-type": "STRICT"
|
||||||
|
}
|
||||||
|
} for i, node_id in enumerate(explicit_route)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
"path-request": [{
|
||||||
|
"request-id": "2",
|
||||||
|
"source": explicit_route[0],
|
||||||
|
"destination": explicit_route[-1],
|
||||||
|
"src-tp-id": explicit_route[0],
|
||||||
|
"dst-tp-id": explicit_route[-1],
|
||||||
|
"bidirectional": False,
|
||||||
|
"path-constraints": {
|
||||||
|
"te-bandwidth": {
|
||||||
|
"technology": "flexi-grid",
|
||||||
|
"trx_type": "Voyager",
|
||||||
|
"trx_mode": "mode 1",
|
||||||
|
"spacing": 75000000000.0,
|
||||||
|
"path_bandwidth": 100000000000.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"explicit-route-objects": route}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('setup', ["with_oms", "without_oms"])
|
||||||
|
@pytest.mark.parametrize('explicit_route, expected_path', [
|
||||||
|
(['trx Brest_KLA', 'trx Vannes_KBE'], None),
|
||||||
|
# path contains one element per oms
|
||||||
|
(['trx Brest_KLA', 'east edfa in Brest_KLA to Morlaix', 'trx Lannion_CAS'],
|
||||||
|
['trx Brest_KLA', 'roadm Brest_KLA', 'east edfa in Brest_KLA to Morlaix', 'fiber (Brest_KLA → Morlaix)-F060',
|
||||||
|
'east fused spans in Morlaix', 'fiber (Morlaix → Lannion_CAS)-F059', 'west edfa in Lannion_CAS to Morlaix',
|
||||||
|
'roadm Lannion_CAS', 'trx Lannion_CAS']),
|
||||||
|
# path contains several elements per oms
|
||||||
|
(['trx Brest_KLA', 'east edfa in Brest_KLA to Morlaix', 'west edfa in Lannion_CAS to Morlaix',
|
||||||
|
'roadm Lannion_CAS', 'trx Lannion_CAS'],
|
||||||
|
['trx Brest_KLA', 'roadm Brest_KLA', 'east edfa in Brest_KLA to Morlaix', 'fiber (Brest_KLA → Morlaix)-F060',
|
||||||
|
'east fused spans in Morlaix', 'fiber (Morlaix → Lannion_CAS)-F059', 'west edfa in Lannion_CAS to Morlaix',
|
||||||
|
'roadm Lannion_CAS', 'trx Lannion_CAS']),
|
||||||
|
# path contains all elements
|
||||||
|
(['trx Brest_KLA', 'roadm Brest_KLA', 'east edfa in Brest_KLA to Morlaix', 'fiber (Brest_KLA → Morlaix)-F060',
|
||||||
|
'east fused spans in Morlaix', 'fiber (Morlaix → Lannion_CAS)-F059', 'west edfa in Lannion_CAS to Morlaix',
|
||||||
|
'roadm Lannion_CAS', 'trx Lannion_CAS'],
|
||||||
|
['trx Brest_KLA', 'roadm Brest_KLA', 'east edfa in Brest_KLA to Morlaix', 'fiber (Brest_KLA → Morlaix)-F060',
|
||||||
|
'east fused spans in Morlaix', 'fiber (Morlaix → Lannion_CAS)-F059', 'west edfa in Lannion_CAS to Morlaix',
|
||||||
|
'roadm Lannion_CAS', 'trx Lannion_CAS']),
|
||||||
|
# path conteains element for only 1 oms (2 oms path)
|
||||||
|
(['trx Brest_KLA', 'east edfa in Brest_KLA to Morlaix', 'trx Rennes_STA'], None),
|
||||||
|
# path contains roadm edges for all OMS, but no element of the OMS
|
||||||
|
(['trx Brest_KLA', 'roadm Brest_KLA', 'roadm Lannion_CAS', 'trx Lannion_CAS'], None),
|
||||||
|
# path contains one element for all 3 OMS
|
||||||
|
(['trx Brest_KLA', 'east edfa in Brest_KLA to Morlaix', 'east edfa in Lannion_CAS to Corlay',
|
||||||
|
'east edfa in Lorient_KMA to Vannes_KBE', 'trx Vannes_KBE'],
|
||||||
|
['trx Brest_KLA', 'roadm Brest_KLA', 'east edfa in Brest_KLA to Morlaix', 'fiber (Brest_KLA → Morlaix)-F060',
|
||||||
|
'east fused spans in Morlaix', 'fiber (Morlaix → Lannion_CAS)-F059', 'west edfa in Lannion_CAS to Morlaix',
|
||||||
|
'roadm Lannion_CAS', 'east edfa in Lannion_CAS to Corlay', 'fiber (Lannion_CAS → Corlay)-F061',
|
||||||
|
'west fused spans in Corlay', 'fiber (Corlay → Loudeac)-F010', 'west fused spans in Loudeac',
|
||||||
|
'fiber (Loudeac → Lorient_KMA)-F054', 'west edfa in Lorient_KMA to Loudeac', 'roadm Lorient_KMA',
|
||||||
|
'east edfa in Lorient_KMA to Vannes_KBE', 'fiber (Lorient_KMA → Vannes_KBE)-F055',
|
||||||
|
'west edfa in Vannes_KBE to Lorient_KMA', 'roadm Vannes_KBE', 'trx Vannes_KBE'])])
|
||||||
|
def test_explicit_path(setup, setup_without_oms, explicit_route, expected_path):
|
||||||
|
"""tests that explicit path correctly returns the full path if it is possible else that it returns None
|
||||||
|
"""
|
||||||
|
network = setup_without_oms
|
||||||
|
if setup == "with_oms":
|
||||||
|
# OMS are initiated in elements, so that explicit path can be verified
|
||||||
|
build_oms_list(network, equipment)
|
||||||
|
else:
|
||||||
|
# OMS are not initiated, explicit path can not be computed.
|
||||||
|
expected_path = None
|
||||||
|
json_data = some_request(explicit_route)
|
||||||
|
[req] = requests_from_json(json_data, equipment)
|
||||||
|
|
||||||
|
node_list = []
|
||||||
|
for node in req.nodes_list:
|
||||||
|
node_list.append(next(el for el in network if el.uid == node))
|
||||||
|
source = node_list[0]
|
||||||
|
destination = node_list[-1]
|
||||||
|
if expected_path is None:
|
||||||
|
assert explicit_path(node_list, source, destination, network) is None
|
||||||
|
else:
|
||||||
|
actual_path = [e.uid for e in explicit_path(node_list, source, destination, network)]
|
||||||
|
assert actual_path == expected_path
|
||||||
@@ -52,7 +52,8 @@ def propagation(input_power, con_in, con_out, dest):
|
|||||||
p = db2lin(p) * 1e-3
|
p = db2lin(p) * 1e-3
|
||||||
spacing = 50e9 # THz
|
spacing = 50e9 # THz
|
||||||
si = create_input_spectral_information(f_min=191.3e12, f_max=191.3e12 + 79 * spacing, roll_off=0.15,
|
si = create_input_spectral_information(f_min=191.3e12, f_max=191.3e12 + 79 * spacing, roll_off=0.15,
|
||||||
baud_rate=32e9, power=p, spacing=spacing, tx_osnr=None)
|
baud_rate=32e9, spacing=spacing, tx_osnr=None,
|
||||||
|
tx_power=p)
|
||||||
source = next(transceivers[uid] for uid in transceivers if uid == 'trx A')
|
source = next(transceivers[uid] for uid in transceivers if uid == 'trx A')
|
||||||
sink = next(transceivers[uid] for uid in transceivers if uid == dest)
|
sink = next(transceivers[uid] for uid in transceivers if uid == dest)
|
||||||
path = dijkstra_path(network, source, sink)
|
path = dijkstra_path(network, source, sink)
|
||||||
@@ -181,7 +182,7 @@ def test_json_element(error, json_data, expected_msg):
|
|||||||
network = network_from_json(json_data, equipment)
|
network = network_from_json(json_data, equipment)
|
||||||
elem = next(e for e in network.nodes() if e.uid == 'Elem')
|
elem = next(e for e in network.nodes() if e.uid == 'Elem')
|
||||||
si = create_input_spectral_information(f_min=191.3e12, f_max=196.1e12, roll_off=0.15,
|
si = create_input_spectral_information(f_min=191.3e12, f_max=196.1e12, roll_off=0.15,
|
||||||
baud_rate=32e9, power=1.0e-3, spacing=50.0e9, tx_osnr=45)
|
baud_rate=32e9, tx_power=1.0e-3, spacing=50.0e9, tx_osnr=45)
|
||||||
with pytest.raises(error, match=re.escape(expected_msg)):
|
with pytest.raises(error, match=re.escape(expected_msg)):
|
||||||
_ = elem(si)
|
_ = elem(si)
|
||||||
|
|
||||||
|
|||||||
@@ -19,11 +19,12 @@ from gnpy.core.utils import lin2db, automatic_nch
|
|||||||
from gnpy.core.elements import Fused, Roadm, Edfa, Transceiver, EdfaOperational, EdfaParams, Fiber
|
from gnpy.core.elements import Fused, Roadm, Edfa, Transceiver, EdfaOperational, EdfaParams, Fiber
|
||||||
from gnpy.core.parameters import FiberParams, RoadmParams, FusedParams
|
from gnpy.core.parameters import FiberParams, RoadmParams, FusedParams
|
||||||
from gnpy.core.network import build_network, design_network
|
from gnpy.core.network import build_network, design_network
|
||||||
from gnpy.tools.json_io import network_from_json, load_equipment, load_json, Amp
|
from gnpy.tools.json_io import network_from_json, load_equipment, load_json, Amp, _equipment_from_json
|
||||||
from gnpy.core.equipment import trx_mode_params
|
from gnpy.core.equipment import trx_mode_params
|
||||||
from gnpy.topology.request import PathRequest, compute_constrained_path, propagate
|
from gnpy.topology.request import PathRequest, compute_constrained_path, propagate
|
||||||
from gnpy.core.info import create_input_spectral_information, Carrier
|
from gnpy.core.info import create_input_spectral_information, Carrier
|
||||||
from gnpy.core.utils import db2lin, dbm2watt
|
from gnpy.core.utils import db2lin, dbm2watt, merge_amplifier_restrictions
|
||||||
|
from gnpy.core.exceptions import ConfigurationError, NetworkTopologyError
|
||||||
|
|
||||||
|
|
||||||
TEST_DIR = Path(__file__).parent
|
TEST_DIR = Path(__file__).parent
|
||||||
@@ -212,9 +213,11 @@ def test_restrictions(restrictions, equipment):
|
|||||||
raise AssertionError()
|
raise AssertionError()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('roadm_type_variety, roadm_b_maxloss', [('default', 0),
|
||||||
|
('example_detailed_impairments', 16.5)])
|
||||||
@pytest.mark.parametrize('power_dbm', [0, +1, -2])
|
@pytest.mark.parametrize('power_dbm', [0, +1, -2])
|
||||||
@pytest.mark.parametrize('prev_node_type, effective_pch_out_db', [('edfa', -20.0), ('fused', -22.0)])
|
@pytest.mark.parametrize('prev_node_type, effective_pch_out_db', [('edfa', -20.0), ('fused', -22.0)])
|
||||||
def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm):
|
def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm, roadm_type_variety, roadm_b_maxloss):
|
||||||
"""Check that egress power of roadm is equal to target power if input power is greater
|
"""Check that egress power of roadm is equal to target power if input power is greater
|
||||||
than target power else, that it is equal to input power. Use a simple two hops A-B-C topology
|
than target power else, that it is equal to input power. Use a simple two hops A-B-C topology
|
||||||
for the test where the prev_node in ROADM B is either an amplifier or a fused, so that the target
|
for the test where the prev_node in ROADM B is either an amplifier or a fused, so that the target
|
||||||
@@ -225,6 +228,8 @@ def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm):
|
|||||||
json_network = load_json(TEST_DIR / 'data/twohops_roadm_power_test.json')
|
json_network = load_json(TEST_DIR / 'data/twohops_roadm_power_test.json')
|
||||||
prev_node = next(n for n in json_network['elements'] if n['uid'] == 'west edfa in node B to ila2')
|
prev_node = next(n for n in json_network['elements'] if n['uid'] == 'west edfa in node B to ila2')
|
||||||
json_network['elements'].remove(prev_node)
|
json_network['elements'].remove(prev_node)
|
||||||
|
roadm_b = next(element for element in json_network['elements'] if element['uid'] == 'roadm node B')
|
||||||
|
roadm_b['type_variety'] = roadm_type_variety
|
||||||
if prev_node_type == 'edfa':
|
if prev_node_type == 'edfa':
|
||||||
prev_node = {'uid': 'west edfa in node B to ila2', 'type': 'Edfa'}
|
prev_node = {'uid': 'west edfa in node B to ila2', 'type': 'Edfa'}
|
||||||
elif prev_node_type == 'fused':
|
elif prev_node_type == 'fused':
|
||||||
@@ -249,7 +254,9 @@ def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm):
|
|||||||
'format': '',
|
'format': '',
|
||||||
'path_bandwidth': 100e9,
|
'path_bandwidth': 100e9,
|
||||||
'effective_freq_slot': None,
|
'effective_freq_slot': None,
|
||||||
'nb_channel': nb_channel
|
'nb_channel': nb_channel,
|
||||||
|
'power': dbm2watt(power_dbm),
|
||||||
|
'tx_power': dbm2watt(power_dbm)
|
||||||
}
|
}
|
||||||
trx_params = trx_mode_params(equipment)
|
trx_params = trx_mode_params(equipment)
|
||||||
params.update(trx_params)
|
params.update(trx_params)
|
||||||
@@ -258,7 +265,7 @@ def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm):
|
|||||||
path = compute_constrained_path(network, req)
|
path = compute_constrained_path(network, req)
|
||||||
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,
|
||||||
power=req.power, spacing=req.spacing, tx_osnr=req.tx_osnr)
|
spacing=req.spacing, tx_osnr=req.tx_osnr, tx_power=req.tx_power)
|
||||||
for i, el in enumerate(path):
|
for i, el in enumerate(path):
|
||||||
if isinstance(el, Roadm):
|
if isinstance(el, Roadm):
|
||||||
power_in_roadm = si.signal + si.ase + si.nli
|
power_in_roadm = si.signal + si.ase + si.nli
|
||||||
@@ -268,10 +275,9 @@ def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm):
|
|||||||
# if previous was an EDFA, power level at ROADM input is enough for the ROADM to apply its
|
# if previous was an EDFA, power level at ROADM input is enough for the ROADM to apply its
|
||||||
# target power (as specified in equipment ie -20 dBm)
|
# target power (as specified in equipment ie -20 dBm)
|
||||||
# if it is a Fused, the input power to the ROADM is smaller than the target power, and the
|
# if it is a Fused, the input power to the ROADM is smaller than the target power, and the
|
||||||
# ROADM cannot apply this target. In this case, it is assumed that the ROADM has 0 dB loss
|
# ROADM cannot apply this target. If the ROADM has 0 dB loss the output power will be the same
|
||||||
# so the output power will be the same as the input power, which for this particular case
|
# as the input power, which for this particular case corresponds to -22dBm + power_dbm.
|
||||||
# corresponds to -22dBm + power_dbm
|
# If ROADM has a minimum losss, then output power will be -22dBm + power_dbm - ROADM loss. !
|
||||||
# next step (for ROADM modelling) will be to apply a minimum loss for ROADMs !
|
|
||||||
if prev_node_type == 'edfa':
|
if prev_node_type == 'edfa':
|
||||||
# edfa prev_node sets input power to roadm to a high enough value:
|
# edfa prev_node sets input power to roadm to a high enough value:
|
||||||
# check that target power is correctly set in the ROADM
|
# check that target power is correctly set in the ROADM
|
||||||
@@ -282,9 +288,10 @@ def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm):
|
|||||||
# fused prev_node does not reamplify power after fiber propagation, so input power
|
# fused prev_node does not reamplify power after fiber propagation, so input power
|
||||||
# to roadm is low.
|
# to roadm is low.
|
||||||
# check that target power correctly reports power_dbm from previous propagation
|
# check that target power correctly reports power_dbm from previous propagation
|
||||||
assert_allclose(el.ref_pch_out_dbm, effective_pch_out_db + power_dbm, rtol=1e-3)
|
assert_allclose(el.ref_pch_out_dbm, effective_pch_out_db + power_dbm - roadm_b_maxloss, rtol=1e-3)
|
||||||
# Check that egress power of roadm is not equalized: power out is the same as power in.
|
# Check that egress power of roadm is not equalized:
|
||||||
assert_allclose(power_out_roadm, power_in_roadm, rtol=1e-3)
|
# power out is the same as power in minus the ROADM loss.
|
||||||
|
assert_allclose(power_out_roadm, power_in_roadm / db2lin(roadm_b_maxloss), rtol=1e-3)
|
||||||
assert effective_pch_out_db + power_dbm ==\
|
assert effective_pch_out_db + power_dbm ==\
|
||||||
pytest.approx(lin2db(min(power_in_roadm) * 1e3), rel=1e-3)
|
pytest.approx(lin2db(min(power_in_roadm) * 1e3), rel=1e-3)
|
||||||
else:
|
else:
|
||||||
@@ -304,7 +311,9 @@ def create_per_oms_request(network, eqpt, req_power):
|
|||||||
'format': '',
|
'format': '',
|
||||||
'path_bandwidth': 100e9,
|
'path_bandwidth': 100e9,
|
||||||
'effective_freq_slot': None,
|
'effective_freq_slot': None,
|
||||||
'nb_channel': nb_channel
|
'nb_channel': nb_channel,
|
||||||
|
'power': dbm2watt(req_power),
|
||||||
|
'tx_power': dbm2watt(req_power)
|
||||||
}
|
}
|
||||||
trx_params = trx_mode_params(eqpt)
|
trx_params = trx_mode_params(eqpt)
|
||||||
params.update(trx_params)
|
params.update(trx_params)
|
||||||
@@ -332,6 +341,7 @@ def create_per_oms_request(network, eqpt, req_power):
|
|||||||
carrier['label'] = ""
|
carrier['label'] = ""
|
||||||
carrier['slot_width'] = req.spacing
|
carrier['slot_width'] = req.spacing
|
||||||
carrier['delta_pdb'] = 0
|
carrier['delta_pdb'] = 0
|
||||||
|
carrier['tx_power'] = 1e-3
|
||||||
req.initial_spectrum = {(req.f_min + req.spacing * f): Carrier(**carrier)
|
req.initial_spectrum = {(req.f_min + req.spacing * f): Carrier(**carrier)
|
||||||
for f in range(1, req.nb_channel + 1)}
|
for f in range(1, req.nb_channel + 1)}
|
||||||
req_list.append(req)
|
req_list.append(req)
|
||||||
@@ -346,6 +356,7 @@ def create_per_oms_request(network, eqpt, req_power):
|
|||||||
carrier['label'] = ""
|
carrier['label'] = ""
|
||||||
carrier['slot_width'] = req.spacing
|
carrier['slot_width'] = req.spacing
|
||||||
carrier['delta_pdb'] = 0
|
carrier['delta_pdb'] = 0
|
||||||
|
carrier['tx_power'] = 1e-3
|
||||||
req.initial_spectrum = {(req.f_min + req.spacing * f): Carrier(**carrier) for f in range(1, req.nb_channel + 1)}
|
req.initial_spectrum = {(req.f_min + req.spacing * f): Carrier(**carrier) for f in range(1, req.nb_channel + 1)}
|
||||||
req_list.append(req)
|
req_list.append(req)
|
||||||
return req_list
|
return req_list
|
||||||
@@ -527,3 +538,174 @@ def test_compare_design_propagation_settings(power_dbm, req_power, amp_with_delt
|
|||||||
getattr(getattr(element_copy, key), subkey), rtol=1e-12)
|
getattr(getattr(element_copy, key), subkey), rtol=1e-12)
|
||||||
else:
|
else:
|
||||||
assert getattr(getattr(element, key), subkey) == getattr(getattr(element_copy, key), subkey)
|
assert getattr(getattr(element, key), subkey) == getattr(getattr(element_copy, key), subkey)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("restrictions, fail", [
|
||||||
|
({'preamp_variety_list': [], 'booster_variety_list':[]}, False),
|
||||||
|
({'preamp_variety_list': ['std_medium_gain', 'std_low_gain'], 'booster_variety_list':['std_medium_gain']}, False),
|
||||||
|
# the two next amp type_variety do not exist
|
||||||
|
({'preamp_variety_list': [], 'booster_variety_list':['booster_medium_gain']}, True),
|
||||||
|
({'preamp_variety_list': ['std_medium_gain', 'preamp_high_gain'], 'booster_variety_list':[]}, True)])
|
||||||
|
def test_wrong_restrictions(restrictions, fail):
|
||||||
|
"""Check that sanity_check correctly raises an error when restriction is incorrect and that library
|
||||||
|
correctly includes restrictions.
|
||||||
|
"""
|
||||||
|
json_data = load_json(EQPT_LIBRARY_NAME)
|
||||||
|
# define wrong restriction
|
||||||
|
json_data['Roadm'][0]['restrictions'] = restrictions
|
||||||
|
if fail:
|
||||||
|
with pytest.raises(ConfigurationError):
|
||||||
|
_ = _equipment_from_json(json_data, EQPT_LIBRARY_NAME)
|
||||||
|
else:
|
||||||
|
equipment = _equipment_from_json(json_data, EQPT_LIBRARY_NAME)
|
||||||
|
assert equipment['Roadm']['example_test'].restrictions == restrictions
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('roadm, from_degree, to_degree, expected_impairment_id, expected_type', [
|
||||||
|
('roadm Lannion_CAS', 'trx Lannion_CAS', 'east edfa in Lannion_CAS to Corlay', 1, 'add'),
|
||||||
|
('roadm Lannion_CAS', 'west edfa in Lannion_CAS to Stbrieuc', 'east edfa in Lannion_CAS to Corlay', 0, 'express'),
|
||||||
|
('roadm Lannion_CAS', 'west edfa in Lannion_CAS to Stbrieuc', 'trx Lannion_CAS', 2, 'drop'),
|
||||||
|
('roadm h', 'west edfa in h to g', 'trx h', None, 'drop')
|
||||||
|
])
|
||||||
|
def test_roadm_impairments(roadm, from_degree, to_degree, expected_impairment_id, expected_type):
|
||||||
|
"""Check that impairment id and types are correct
|
||||||
|
"""
|
||||||
|
json_data = load_json(NETWORK_FILE_NAME)
|
||||||
|
for el in json_data['elements']:
|
||||||
|
if el['uid'] == 'roadm Lannion_CAS':
|
||||||
|
el['type_variety'] = 'example_detailed_impairments'
|
||||||
|
equipment = load_equipment(EQPT_LIBRARY_NAME)
|
||||||
|
network = network_from_json(json_data, equipment)
|
||||||
|
build_network(network, equipment, 0.0, 20.0)
|
||||||
|
roadm = next(n for n in network.nodes() if n.uid == roadm)
|
||||||
|
assert roadm.get_roadm_path(from_degree, to_degree).path_type == expected_type
|
||||||
|
assert roadm.get_roadm_path(from_degree, to_degree).impairment_id == expected_impairment_id
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('type_variety, from_degree, to_degree, impairment_id, expected_type', [
|
||||||
|
(None, 'trx Lannion_CAS', 'east edfa in Lannion_CAS to Corlay', 1, 'add'),
|
||||||
|
('default', 'trx Lannion_CAS', 'east edfa in Lannion_CAS to Corlay', 3, 'add'),
|
||||||
|
(None, 'west edfa in Lannion_CAS to Stbrieuc', 'east edfa in Lannion_CAS to Corlay', None, 'express')
|
||||||
|
])
|
||||||
|
def test_roadm_per_degree_impairments(type_variety, from_degree, to_degree, impairment_id, expected_type):
|
||||||
|
"""Check that impairment type is correct also if per degree impairment is defined
|
||||||
|
"""
|
||||||
|
json_data = load_json(EQPT_LIBRARY_NAME)
|
||||||
|
assert 'type_variety' not in json_data['Roadm'][2]
|
||||||
|
json_data['Roadm'][2]['roadm-path-impairments'] = [
|
||||||
|
{
|
||||||
|
"roadm-path-impairments-id": 1,
|
||||||
|
"roadm-add-path": [{
|
||||||
|
"frequency-range": {
|
||||||
|
"lower-frequency": 191.3e12,
|
||||||
|
"upper-frequency": 196.1e12
|
||||||
|
},
|
||||||
|
"roadm-osnr": 41,
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"roadm-path-impairments-id": 3,
|
||||||
|
"roadm-add-path": [{
|
||||||
|
"frequency-range": {
|
||||||
|
"lower-frequency": 191.3e12,
|
||||||
|
"upper-frequency": 196.1e12
|
||||||
|
},
|
||||||
|
"roadm-inband-crosstalk": 0,
|
||||||
|
"roadm-osnr": 20,
|
||||||
|
"roadm-noise-figure": 23
|
||||||
|
}]
|
||||||
|
}]
|
||||||
|
equipment = _equipment_from_json(json_data, EQPT_LIBRARY_NAME)
|
||||||
|
assert equipment['Roadm']['default'].type_variety == 'default'
|
||||||
|
|
||||||
|
json_data = load_json(NETWORK_FILE_NAME)
|
||||||
|
for el in json_data['elements']:
|
||||||
|
if el['uid'] == 'roadm Lannion_CAS' and type_variety is not None:
|
||||||
|
el['type_variety'] = type_variety
|
||||||
|
el['params'] = {
|
||||||
|
"per_degree_impairments": [
|
||||||
|
{
|
||||||
|
"from_degree": from_degree,
|
||||||
|
"to_degree": to_degree,
|
||||||
|
"impairment_id": impairment_id
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
network = network_from_json(json_data, equipment)
|
||||||
|
build_network(network, equipment, 0.0, 20.0)
|
||||||
|
roadm = next(n for n in network.nodes() if n.uid == 'roadm Lannion_CAS')
|
||||||
|
assert roadm.get_roadm_path(from_degree, to_degree).path_type == expected_type
|
||||||
|
assert roadm.get_roadm_path(from_degree, to_degree).impairment_id == impairment_id
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('from_degree, to_degree, impairment_id, error, message', [
|
||||||
|
('trx Lannion_CAS', 'east edfa in Lannion_CAS to Corlay', 2, NetworkTopologyError,
|
||||||
|
'Roadm roadm Lannion_CAS path_type is defined as drop but it should be add'), # wrong path_type
|
||||||
|
('trx Lannion_CAS', 'east edfa toto', 1, ConfigurationError,
|
||||||
|
'Roadm roadm Lannion_CAS has wrong from-to degree uid trx Lannion_CAS - east edfa toto'), # wrong degree
|
||||||
|
('trx Lannion_CAS', 'east edfa in Lannion_CAS to Corlay', 11, NetworkTopologyError,
|
||||||
|
'ROADM roadm Lannion_CAS: impairment profile id 11 is not defined in library') # wrong impairment_id
|
||||||
|
])
|
||||||
|
def test_wrong_roadm_per_degree_impairments(from_degree, to_degree, impairment_id, error, message):
|
||||||
|
"""Check that wrong per degree definitions are correctly catched
|
||||||
|
"""
|
||||||
|
equipment = load_equipment(EQPT_LIBRARY_NAME)
|
||||||
|
json_data = load_json(NETWORK_FILE_NAME)
|
||||||
|
for el in json_data['elements']:
|
||||||
|
if el['uid'] == 'roadm Lannion_CAS':
|
||||||
|
el['type_variety'] = 'example_detailed_impairments'
|
||||||
|
el['params'] = {
|
||||||
|
"per_degree_impairments": [
|
||||||
|
{
|
||||||
|
"from_degree": from_degree,
|
||||||
|
"to_degree": to_degree,
|
||||||
|
"impairment_id": impairment_id
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
network = network_from_json(json_data, equipment)
|
||||||
|
with pytest.raises(error, match=message):
|
||||||
|
build_network(network, equipment, 0.0, 20.0)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('path_type, type_variety, expected_pmd, expected_pdl, expected_osnr, freq', [
|
||||||
|
('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, [191.3e12]),
|
||||||
|
('express', 'example_detailed_impairments', 0, 0, None, [191.3e12]), # detailed parameters pre-empts global ones
|
||||||
|
('add', 'default', 5.0e-12, 0.5, None, [191.3e12]),
|
||||||
|
('add', 'example_test', 5.0e-12, 0.5, None, [191.3e12]),
|
||||||
|
('add', 'example_detailed_impairments', 0, 0, 41, [191.3e12]),
|
||||||
|
('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:
|
||||||
|
- 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 detailed impairment for the corresponding path_type if roadm type_variety has detailed impairments
|
||||||
|
- use roadm per degree impairment if they are defined
|
||||||
|
"""
|
||||||
|
equipment = load_equipment(EQPT_LIBRARY_NAME)
|
||||||
|
extra_params = equipment['Roadm'][type_variety].__dict__
|
||||||
|
roadm_config = {
|
||||||
|
"uid": "roadm Lannion_CAS",
|
||||||
|
"params": {
|
||||||
|
"add_drop_osnr": 38,
|
||||||
|
"pmd": 5.0e-12,
|
||||||
|
"pdl": 0.5
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if type_variety != 'default':
|
||||||
|
roadm_config["type_variety"] = type_variety
|
||||||
|
roadm_config['params'] = merge_amplifier_restrictions(roadm_config['params'], extra_params)
|
||||||
|
roadm = Roadm(**roadm_config)
|
||||||
|
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_allclose(roadm.get_impairment('roadm-pmd', freq, from_degree='tata', degree='toto'),
|
||||||
|
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':
|
||||||
|
# we assume for simplicity that add contribution is the same as drop contribution
|
||||||
|
# add_drop_osnr_db = 10log10(1/add_osnr + 1/drop_osnr)
|
||||||
|
if type_variety in ['default', 'example_test']:
|
||||||
|
assert_allclose(roadm.get_impairment('roadm-osnr', freq, from_degree='tata', degree='toto'),
|
||||||
|
roadm.params.add_drop_osnr + lin2db(2), rtol=1e-12)
|
||||||
|
else:
|
||||||
|
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,13 +23,15 @@ 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'))
|
||||||
fiber.ref_pch_in_dbm = 0.0
|
fiber.ref_pch_in_dbm = 0.0
|
||||||
# fix grid spectral information generation
|
# fix grid spectral information generation
|
||||||
spectral_info_input = create_input_spectral_information(f_min=191.3e12, f_max=196.1e12, roll_off=0.15,
|
spectral_info_input = create_input_spectral_information(f_min=191.3e12, f_max=196.1e12, roll_off=0.15,
|
||||||
baud_rate=32e9, power=1e-3, spacing=50e9, tx_osnr=40.0)
|
baud_rate=32e9, spacing=50e9, tx_osnr=40.0,
|
||||||
|
tx_power=1e-3)
|
||||||
# propagation
|
# propagation
|
||||||
spectral_info_out = fiber(spectral_info_input)
|
spectral_info_out = fiber(spectral_info_input)
|
||||||
|
|
||||||
@@ -48,9 +51,8 @@ def test_fiber():
|
|||||||
spectral_info_input = create_arbitrary_spectral_information(frequency=frequency, slot_width=slot_width,
|
spectral_info_input = create_arbitrary_spectral_information(frequency=frequency, slot_width=slot_width,
|
||||||
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_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
|
||||||
@@ -60,14 +62,27 @@ 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():
|
||||||
"""Test the accuracy of propagating the RamanFiber."""
|
"""Test the accuracy of propagating the RamanFiber."""
|
||||||
# spectral information generation
|
# spectral information generation
|
||||||
spectral_info_input = create_input_spectral_information(f_min=191.3e12, f_max=196.1e12, roll_off=0.15,
|
spectral_info_input = create_input_spectral_information(f_min=191.3e12, f_max=196.1e12, roll_off=0.15,
|
||||||
baud_rate=32e9, power=1e-3, spacing=50e9, tx_osnr=40.0)
|
baud_rate=32e9, spacing=50e9, tx_osnr=40.0,
|
||||||
|
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
|
||||||
@@ -103,25 +118,25 @@ def test_fiber_lumped_losses_srs(set_sim_params):
|
|||||||
"""Test the accuracy of Fiber with lumped losses propagation."""
|
"""Test the accuracy of Fiber with lumped losses propagation."""
|
||||||
# spectral information generation
|
# spectral information generation
|
||||||
spectral_info_input = create_input_spectral_information(f_min=191.3e12, f_max=196.1e12, roll_off=0.15,
|
spectral_info_input = create_input_spectral_information(f_min=191.3e12, f_max=196.1e12, roll_off=0.15,
|
||||||
baud_rate=32e9, power=1e-3, spacing=50e9, tx_osnr=40.0)
|
baud_rate=32e9, spacing=50e9, tx_osnr=40.0,
|
||||||
|
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
|
||||||
@@ -129,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()
|
||||||
@@ -288,6 +291,7 @@ def request_set():
|
|||||||
'cost': 1,
|
'cost': 1,
|
||||||
'roll_off': 0.15,
|
'roll_off': 0.15,
|
||||||
'tx_osnr': 38,
|
'tx_osnr': 38,
|
||||||
|
'tx_power': 0.001,
|
||||||
'penalties': {},
|
'penalties': {},
|
||||||
'min_spacing': 37.5e9,
|
'min_spacing': 37.5e9,
|
||||||
'nb_channel': None,
|
'nb_channel': None,
|
||||||
|
|||||||
156
tests/test_trx_mode_params.py
Normal file
156
tests/test_trx_mode_params.py
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# @Author: Esther Le Rouzic
|
||||||
|
# @Date: 2023-09-29
|
||||||
|
"""
|
||||||
|
@author: esther.lerouzic
|
||||||
|
checks all possibilities of this function
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from gnpy.core.equipment import trx_mode_params
|
||||||
|
from gnpy.core.exceptions import EquipmentConfigError
|
||||||
|
from gnpy.tools.json_io import load_equipment, load_json, _equipment_from_json
|
||||||
|
|
||||||
|
|
||||||
|
TEST_DIR = Path(__file__).parent
|
||||||
|
EQPT_LIBRARY_NAME = TEST_DIR / 'data/eqpt_config.json'
|
||||||
|
NETWORK_FILE_NAME = TEST_DIR / 'data/testTopology_expected.json'
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('trx_type, trx_mode, error_message, no_error, expected_result',
|
||||||
|
[('', '', False, True, "SI"),
|
||||||
|
('', '', True, False, 'Could not find transponder "" in equipment library'),
|
||||||
|
('vendorA_trx-type1', '', True, False,
|
||||||
|
'Could not find transponder "vendorA_trx-type1" with mode "" in equipment library'),
|
||||||
|
('vendorA_trx-type1', '', False, True, "SI"),
|
||||||
|
('', 'mode 1', True, False, 'Could not find transponder "" in equipment library'),
|
||||||
|
('', 'mode 1', False, True, "SI"),
|
||||||
|
('vendorA_trx-type1', 'mode 2', True, True, 'mode 2'),
|
||||||
|
('vendorA_trx-type1', 'mode 2', False, True, 'mode 2'),
|
||||||
|
('wrong type', '', True, False, 'Could not find transponder "wrong type" in equipment library'),
|
||||||
|
('wrong type', '', False, True, 'SI'),
|
||||||
|
('vendorA_trx-type1', 'wrong mode', True, False,
|
||||||
|
'Could not find transponder "vendorA_trx-type1" with mode "wrong mode" in equipment library'),
|
||||||
|
('vendorA_trx-type1', 'wrong mode', False, True, 'SI'),
|
||||||
|
('wrong type', 'wrong mode', True, False, 'Could not find transponder "wrong type" in equipment library'),
|
||||||
|
('wrong type', 'wrong mode', False, True, 'SI'),
|
||||||
|
('vendorA_trx-type1', None, True, True, 'None'),
|
||||||
|
('vendorA_trx-type1', None, False, True, 'None'),
|
||||||
|
(None, None, True, False, 'Could not find transponder "None" in equipment library'),
|
||||||
|
(None, None, False, True, 'SI'),
|
||||||
|
(None, 'mode 2', True, False, 'Could not find transponder "None" in equipment library'),
|
||||||
|
(None, 'mode 2', False, True, 'SI'),
|
||||||
|
])
|
||||||
|
def test_trx_mode_params(trx_type, trx_mode, error_message, no_error, expected_result):
|
||||||
|
"""Checks all combinations of trx_type and mode
|
||||||
|
"""
|
||||||
|
possible_results = {}
|
||||||
|
possible_results["SI"] = {
|
||||||
|
'OSNR': None,
|
||||||
|
'baud_rate': 32000000000.0,
|
||||||
|
'bit_rate': None,
|
||||||
|
'cost': None,
|
||||||
|
'equalization_offset_db': 0,
|
||||||
|
'f_max': 196100000000000.0,
|
||||||
|
'f_min': 191300000000000.0,
|
||||||
|
'min_spacing': None,
|
||||||
|
'penalties': {},
|
||||||
|
'roll_off': 0.15,
|
||||||
|
'spacing': 50000000000.0,
|
||||||
|
'tx_osnr': 100,
|
||||||
|
}
|
||||||
|
possible_results["mode 2"] = {
|
||||||
|
'format': 'mode 2',
|
||||||
|
'baud_rate': 64e9,
|
||||||
|
'OSNR': 15,
|
||||||
|
'bit_rate': 200e9,
|
||||||
|
'roll_off': 0.15,
|
||||||
|
'tx_osnr': 100,
|
||||||
|
'equalization_offset_db': 0,
|
||||||
|
'min_spacing': 75e9,
|
||||||
|
'f_max': 196100000000000.0,
|
||||||
|
'f_min': 191350000000000.0,
|
||||||
|
'penalties': {},
|
||||||
|
'cost': 1
|
||||||
|
}
|
||||||
|
possible_results["None"] = {
|
||||||
|
'format': 'undetermined',
|
||||||
|
'baud_rate': None,
|
||||||
|
'OSNR': None,
|
||||||
|
'bit_rate': None,
|
||||||
|
'roll_off': None,
|
||||||
|
'tx_osnr': None,
|
||||||
|
'equalization_offset_db': 0,
|
||||||
|
'min_spacing': None,
|
||||||
|
'f_max': 196100000000000.0,
|
||||||
|
'f_min': 191350000000000.0,
|
||||||
|
'penalties': None,
|
||||||
|
'cost': None
|
||||||
|
}
|
||||||
|
equipment = load_equipment(EQPT_LIBRARY_NAME)
|
||||||
|
if no_error:
|
||||||
|
trx_params = trx_mode_params(equipment, trx_type, trx_mode, error_message)
|
||||||
|
print(trx_params)
|
||||||
|
assert trx_params == possible_results[expected_result]
|
||||||
|
else:
|
||||||
|
with pytest.raises(EquipmentConfigError, match=expected_result):
|
||||||
|
_ = trx_mode_params(equipment, trx_type, trx_mode, error_message)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('baudrate, spacing, error_message',
|
||||||
|
[(60e9, 50e9, 'Inconsistency in equipment library:\n Transponder "vendorB_trx-type1" mode "wrong mode" '
|
||||||
|
+ 'has baud rate 60.00 GHz greater than min_spacing 50.00.'),
|
||||||
|
(32e9, 50, 'Inconsistency in equipment library:\n Transponder "vendorB_trx-type1" mode "wrong mode" '
|
||||||
|
+ 'has baud rate 32.00 GHz greater than min_spacing 0.00.')])
|
||||||
|
def test_wrong_baudrate_spacing(baudrate, spacing, error_message):
|
||||||
|
"""Checks wrong values for baudrate and spacing correctly raise an error
|
||||||
|
"""
|
||||||
|
json_data = load_json(EQPT_LIBRARY_NAME)
|
||||||
|
wrong_transceiver = {
|
||||||
|
'type_variety': 'vendorB_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,
|
||||||
|
'penalties': [{
|
||||||
|
'chromatic_dispersion': 80000,
|
||||||
|
'penalty_value': 0.5
|
||||||
|
}, {
|
||||||
|
'pmd': 120,
|
||||||
|
'penalty_value': 0.5}],
|
||||||
|
'equalization_offset_db': 0
|
||||||
|
}, {
|
||||||
|
'format': 'wrong mode',
|
||||||
|
'baud_rate': baudrate,
|
||||||
|
'OSNR': 11,
|
||||||
|
'bit_rate': 100e9,
|
||||||
|
'roll_off': 0.15,
|
||||||
|
'tx_osnr': 40,
|
||||||
|
'min_spacing': spacing,
|
||||||
|
'cost': 1,
|
||||||
|
'penalties': [{
|
||||||
|
'chromatic_dispersion': 80000,
|
||||||
|
'penalty_value': 0.5
|
||||||
|
}, {
|
||||||
|
'pmd': 120,
|
||||||
|
'penalty_value': 0.5}],
|
||||||
|
'equalization_offset_db': 0}]
|
||||||
|
}
|
||||||
|
json_data['Transceiver'].append(wrong_transceiver)
|
||||||
|
equipment = _equipment_from_json(json_data, EQPT_LIBRARY_NAME)
|
||||||
|
|
||||||
|
with pytest.raises(EquipmentConfigError, match=error_message):
|
||||||
|
_ = trx_mode_params(equipment, 'vendorB_trx-type1', 'wrong mode', error_message=False)
|
||||||
Reference in New Issue
Block a user