111 Commits

Author SHA1 Message Date
Jan Kundrát
8f9cf8ccc7 docs: sync the author list from git history
I don't have a script for this because it requires some manual fixups.

Change-Id: I19f36b953c98d6bc0c09040c27b964b288360c0e
2023-03-06 01:31:41 +01:00
Sami Alavi
0c797a254c simplify type annotations
PEP 484 says that `float` also implicitly allows `int`, so there's no
need to use `Union[int | float]`.

Fixes: #450
Change-Id: Ib1aeda4c13ffabd47719c1e0886e9ebcf21a64e0
2023-03-03 21:12:57 +05:00
Jan Kundrát
2cdeeabfa6 Mark Python 3.11 as supported
Change-Id: I2dedd942c92959e1f891194f6234376b9ecad6e5
2023-03-02 14:28:12 +01:00
Jan Kundrát
5e874798cb CI: GitHub: add builds on 3.11
...and also switch various jobs to use that by default.

Change-Id: I9170fc305bfd9bea6b5dde5741f912c6ed455e3e
2023-03-02 14:28:12 +01:00
Jan Kundrát
ff8f044064 Merge changes from topic "mixed-rate"
* changes:
  complete tests with the --power option tests
  Add Roadm uid when raising error
  add equalization per constant ratio power/slot_width
2023-02-14 09:59:20 +00:00
Jan Kundrát
d84ee4e76c Merge "doc: add a link to our public chat room" 2023-02-07 17:09:15 +00:00
Jan Kundrát
521d27ffac docs: fix a nasty typo
Fixes: b1067a62 docs: flexgrid
Change-Id: I44613d8ef4a27e7791db81509a56efa7ee29b4ff
2023-02-07 00:36:14 +01:00
Jan Kundrát
35e759212e doc: add a link to our public chat room
Change-Id: Id5323ad01ff0705efb9c9335e2c1f61227e5b73b
2023-02-02 17:29:19 +01:00
Jan Kundrát
f6dede2b5f docs: remove LGTM.com code-quality badge
...which no longer works since they got acquired by GitHub. Setting up
that CodeQL will need a bit more time I'm afraid.

Change-Id: I2f2bf21d31df643b25e931b2aadf60406bba683b
2023-02-02 17:28:40 +01:00
Jan Kundrát
0d0019f627 Update my e-mail address
I was informed that my TIP-specific e-mail address won't be coming back.

Change-Id: Ic2ee4986203490d90143a89dc49d7fca71a84c73
2023-02-02 17:13:23 +01:00
EstherLerouzic
06fe1c2f63 complete tests with the --power option tests
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ia7be6b86b82cc0317a5ba48086ef63f67d490990
2023-01-30 18:05:41 +01:00
EstherLerouzic
092316a9d7 Add Roadm uid when raising error
in case parameters are not correct, catch the ParameterError
and raises it again with the uid of the ROADM to ease debug

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I1f85f0e9e9226fc613d35611774c739adb2104c7
2023-01-30 18:05:37 +01:00
EstherLerouzic
48e3f96967 add equalization per constant ratio power/slot_width
Constant power per slot_width uses the slot width instead of
baud rate compared to PSD.

This is the equalization used in OpenROADM

add tests for constant power per slot width equalization

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ie350e4c15cb6b54c15e418556fe33e72486cb134
2023-01-30 18:03:58 +01:00
Jan Kundrát
e9e8956caf docs: fix the GitHub CI (actions) badge
Bug: https://github.com/badges/shields/issues/8671
Change-Id: I9cb15b762710cae7c3c37ed95d08aee2ca7b2457
2023-01-18 22:57:17 +01:00
Jan Kundrát
0ae341c2a5 tests: update to flake8 v5
flake8-html is now compatible with the v5 of this package, so let's use
it. Unfortunately, they killed the `--diff` option in v6, so we cannot
use it right now. I understand the reasoning as well as the fact that
it's easy to be broken, but I don't like broken CI that much.

Change-Id: I70dd686e097f411c39bfc53f83d519540687dd64
2023-01-18 22:25:48 +01:00
Jan Kundrát
0c2f6372f8 tests: switch to PEP517-compliant build process
...mainly to be in sync with oopt-gnpy-libyang that I've been working on
recently, and to allow us to modernize this infrastructure later on.

Change-Id: Id0ed1d7620762fc204300ebe8a190de8e42ae9df
2023-01-18 22:20:39 +01:00
Jan Kundrát
97e80b4445 Merge changes from topic "enable-multiple-slots-assignment"
* changes:
  record request_id as string, not integer
  support missing trx_mode in request instead of null value
2023-01-18 21:20:03 +00:00
Jan Kundrát
5e4c9b7d73 Merge "Respect fiber max_length when splitting fibers" 2023-01-18 21:19:39 +00:00
Jan Kundrát
e96f821cce CI: Switch to Fedora 36
...because Vexxhost pulled the plug on the F35 mirroring infrastructure,
and as a result, all jobs started failing.

Change-Id: Ib5d795397e907de3eff6cdb9c4145353400793ab
Depends-on: https://review.gerrithub.io/c/Telecominfraproject/oopt-zuul-jobs/+/548583
2023-01-18 21:35:08 +01:00
Jan Kundrát
5f7e61e255 CI: temporarily remove Fedora 35 jobs
...since the hosting provider pulled the plug on the mirroring
infrastructure. See the rest of these commits in this serie for
details.

Change-Id: Iac1d5f1c6f557458194deafe441564afc4851d94
2023-01-18 21:32:11 +01:00
Jonas Mårtensson
682b5c5691 Respect fiber max_length when splitting fibers
According to the documentation, auto-design will
"Split fiber lengths > max_length", which also makes sense based on the
name of the parameter but with the existing implementation fiber
length could still be longer than max_length after splitting. This
patch makes auto-design respect the specified max_length.

Signed-off-by: Jonas Mårtensson <jonas.martensson@ri.se>
Change-Id: Ifd83aa4d77206bf10796579df73632fe405e2d54
2023-01-18 11:59:06 +00:00
Jan Kundrát
11e5117505 tests: do not compare floating point numbers for equality
GitHub CI started failing with the following error:

  assert (watt2dbm(si.signal) == target - correction).all()
  assert False
   +  where False = <built-in method all of numpy.ndarray object at 0x7f01c0ca94d0>()
   +    where <built-in method all of numpy.ndarray object at 0x7f01c0ca94d0> = array([-25.5, -24.5, -22.5, -25. , -27.5]) == array([-25.5, -24.5, -22.5, -25. , -27.5])
        +array([-25.5, -24.5, -22.5, -25. , -27.5])
        -array([-25.5, -24.5, -22.5, -25. , -27.5])
        Full diff:
          array([-25.5, -24.5, -22.5, -25. , -27.5]).all

This is with code which has passed in the Zuul/Vexxhost CI.

It looks very similar to a regression that hit numpy 1.24.0, but the
GitHub action log shows that this happens with numpy 1.24.1. Weird, and
I'm not getting these differences locally, and also not on an ARM64
cloud VM.

Anyway, comparing floating point numbers for strict equality is futile,
so let's use this opportunity to use a proper check for these.

Change-Id: I05683f3116cad78d067bddde2780fe25b5caf768
2023-01-18 00:27:53 +01:00
EstherLerouzic
50603420fc ROADM: rework equalization
On a ROADM, the code would previously set the same per-carrier power
regardless of the channel spectrum width. With this patch, carriers are
equalized either by their:

- absolute power (same as before),
- power spectral density (PSD).

Also, it's possible to apply a per-channel power offset (in dB) which
will be applied to a specified channel on top of the selected
power-level or PSD strategy. The same offset can be also selected
through the `--spectrum` option via the `default_pdb` parameter.

The equalization policy can be set via the ROADM model (in the equipment
config) as well as on a per-instance basis.

The PSD is defined as the absolute power over a spectral bandwidth,
where the spectral bandwidth corresponds to the actual spectrum
occupation (without any applicable guard bands), as approximated by the
symbol rate. PSD is specified in mW/GHz. As an example, for a 32 GBaud
signal at 0.01 mW, the PSD is 0.01/32 = 3.125e-4 mW/GHz.

This has some implications on the power sweep and ROADM behavior. Same
as previously (with absolute power targets), the ROADM design determines
the power set points. Target power is usually the best (highest) power
that can be supported by the ROADMs, especially the Add/Drop and express
stages' losses, with the goal to maximize the power at the booster's
input. As such, the `--power` option (or the power sweep) doesn't
manipulate with ROADM's target output power, but only with the output
power of the amplifiers. With PSD equalization, the `--power` option is
interpreted as the power of the reference channel defined in equipment
config's `SI` container, and its PSD is used for propagation. Power
sweep is interpreted in the same way, e.g.:

      "SI":[{
            "f_min": 191.3e12,
            "baud_rate": 32e9,
            "f_max":195.1e12,
            "spacing": 50e9,
            "power_dbm": 0,
            "power_range_db": [-1,1,1],
            "roll_off": 0.15,
            "tx_osnr": 40,
            "sys_margins": 2
            }],

...and with the PSD equalization in a ROADM:

    {
      "uid": "roadm A",
      "type": "Roadm",
      "params": {
        "target_psd_out_mWperGHz": 3.125e-4,
      }
    },
    {
      "uid": "edfa in roadm A to toto",
      "type": "Edfa",
      "type_variety": "standard_medium_gain",
      "operational": {
        "gain_target": 22,
        "delta_p": 2,
        "tilt_target": 0.0,
        "out_voa": 0
      }
    },

then we use the power steps of the power_range_db to compute resulting
powers of each carrier out of the booster amp:

 power_db = psd2powerdbm(target_psd_out_mWperGHz, baud_rate)
 sweep = power_db + delta_power for delta_power in power_range_db

Assuming one 32Gbaud and one 64Gbaud carriers:

                   32 Gbaud        64 Gbaud
roadmA out power
(sig+ase+nli)      -20dBm         -17dBm

EDFA out power
range[
        -1          1dBm            4dBm
         0          2dBm            5dBm
         1          3dBm            6dBm
]

Design case:

Design is performed based on the reference channel set defined in SI
in equipment config (independantly of equalization process):

      "SI":[{
            "f_min": 191.3e12,
            "baud_rate": 32e9,
            "f_max":195.1e12,
            "spacing": 50e9,
            "power_dbm": -1,
            "power_range_db": [0,0,1],
            "roll_off": 0.15,
            "tx_osnr": 40,
            "sys_margins": 2
            }],

`delta_p` values of amps refer to this reference channel, but are applicable
for any baudrate during propagation, e.g.:

    {
      "uid": "roadm A",
      "type": "Roadm",
      "params": {
        "target_psd_out_mWperGHz": 2.717e-4,
      }
    },
    {
      "uid": "edfa in roadm A to toto",
      "type": "Edfa",
      "type_variety": "standard_medium_gain",
      "operational": {
        "gain_target": 22,
        "delta_p": 2,
        "tilt_target": 0.0,
        "out_voa": 0
      }
    },

Then the output power for a 64 Gbaud carrier will be +4 =
= lin2db(db2lin(power_dbm + delta_p)/32e9 * 64e9)
= lin2db(db2lin(power_dbm + delta_p) * 2)
= powerdbm + delta + 3 = 4 dBm

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I28bcfeb72b0e74380b087762bb92ba5d39219eb3
2023-01-17 12:26:50 +01:00
Jan Kundrát
125264f265 coding style: don't yell when using the recommended newline-vs-operator
Fun stuff -- PEP8 used to recommend against this pattern, but back in
2016 the Pythonic Truth got reversed to actually recommend the pattern
which we're using. Unfortunately, W503 is still a thing, and even though
it's supposed to be ignored, it really ain't.

Change-Id: I99f42548d236f05d1050fd78cb81b3b20a78013c
2023-01-17 12:26:50 +01:00
Jan Kundrát
b1067a6266 docs: flexgrid
Co-authored-by: Esther Lerouzic <esther.lerouzic@orange.com>
Change-Id: If38b56a39e083deec0563f25a2b575788dcedc43
2023-01-17 09:48:15 +00:00
EstherLerouzic
50d4ecd700 docs: fix power mode vs. gain mode and power sweep
Change-Id: Ibef9a49123767d6e2ce73081485833f281711e04
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Co-authored-by: Jan Kundrát <jan.kundrat@telecominfraproject.com>
2023-01-17 09:47:58 +00:00
Jan Kundrát
9f37e0371e CI: temporarily require tox 3.x
Upstream introduced some breaking changes, one of which is a different
installation process. As a result, the builds won't perform a full
package installation, which means that there are no console entry points
(shell wrappers), which means that the test suite fails.

Hotfix this by temporarily requiring an older version of tox.

Change-Id: I0466c70f2024d35d87606d9ad738284a143a574f
2023-01-17 01:31:33 +01:00
Jan Kundrát
9bd303db05 CI: github: upgrade deprecated actions
...because the GitHub infrastructure is deprecating Node 12 actions:

 https: //github.blog/changelog/2022-09-22-github-actions-all-actions-will-begin-running-on-node16-instead-of-node12/

Change-Id: I2d4a28be37a407aa26e79a1755eb5c3b0ec36a87
2023-01-10 12:27:50 +01:00
EstherLerouzic
1bcb3ce25c JSON: ensure that node constraints use correct indexing
The program currently ignores the explicit `index` and reads the
constraints in the JSON order of the list. However in general, it is not
guaranteed that constraints are listed in order.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Icefe271f5801cf9f7b43311c6666556564587c65
Signed-off-by: Jan Kundrát <jan.kundrat@telecominfraproject.com>
2022-11-22 01:53:24 +01:00
Jan Kundrát
e381138320 move test-only dependencies from main requirements
Pandas is only used from the test suite.

Bug: https://github.com/Telecominfraproject/oopt-gnpy/issues/451
Change-Id: Iafd02c800e5b7772e180979d19b81a2eda0e588f
2022-11-15 10:01:31 +00:00
EstherLerouzic
b450677709 Minor refactor: use watt2dbm function
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I09c3e923a8e1565d2ab07596c393bb5b2dc30f6c
2022-11-09 14:39:27 +01:00
EstherLerouzic
54a3725e17 Add a -spectrum option to input external file to define spectrum
The option is only set for gnpy-transmission-main.

The spectrum file is a list of spectrum objects, each defining
f_min, f_max and spectrum attributes using the same meaning as SI
in eqpt_config.json for baud_rate, roll_off, tx_osnr. slot_width is
used for the occupation of each carrier around their central frequency,
so slot_width corresponds to spacing of SI.
Unlike SI, the frequencies are defined includint f_min and f_max.
The partitions must be contiguous not overlapping.

Pref.p_span0 object records the req_power, while
ref_carrier records info that will be useful for equalization ie baud_rate.

For now, I have not integrated the possibility to directly use
transceivers type and mode in the list.

User can define sets of contiguous channels and a label to identify
the spectrum bands. If no label are defined, the program justs uses
the index + baud rate of the spectrum bands as label.

Print results per spectrum label

If propagated spectrum has mixed rates, then prints results (GSNR and OSNR)
for each propagated spectrum type according to its label.

Print per label channel power of elements

Per channel power prints were previously only showing the noiseless
reference channel power and only an average power.
With this change, we add a new information on the print:
the average total power (signal + noise + non-linear noise).
If there are several spectrum types propagating, the average per
spectrum is displayed using the label.
For this purpose, label and total power are recorded in each element
upon propagation

Note that the difference between this total power and the existing
channel power represents the added noise for the considered OMS.
Indeed ROADMs equalize per channel total power, so that power displayed
in 'actual pch (dBm)' may contain some noise contribution accumulated
with previous propagation.
Because 'reference pch out (dBm)' is for the noiseless reference,
it is exactly set to the target power and 'actual pch (dBm)' is always
matching 'reference pch out (dBm)' in ROADM prints.

Add examples and tests for -spectrum option

initial_spectrum1.json reproduces exactly the case of SI
initial_spectrum2.json sets half of the spectrum with 50GHz 32Gbauds and
half with 75GHz 64 Gbauds. Power setting is not set for the second half,
So that equalization will depend on ROADM settings.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ibc01e59e461e5e933e95d23dacbc5289e275ccf7
2022-11-09 14:39:25 +01:00
Jan Kundrát
8889c2437a refactoring: ROADM: clarify effective_loss and improve the docs
Move the docs to a place where that variable is declared, not to the
place where it's computed.

Co-authored-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-id: I17dff12c1e81827dfb4be869e59c9be85797dba4
2022-11-03 10:24:42 +01:00
Jan Kundrát
8bf8b2947b tests: pass the reference carrier when constructing SI
Co-authored-by: EstherLerouzic <esther.lerouzic@orange.com>
Fixes: 18610fb7 Add ref_carrier to Pref and remove req_power from ReferenceCarrier
Change-Id: I8ac2a7ca7c6d866170e564771c6cb78dcf3754d8
2022-11-03 10:24:38 +01:00
EstherLerouzic
cb85b8fe2b Add a test with long propagation
Existing tests only cover short distances, and effect on accumulated
noise, especially when crossing ROADMs with equalization, are not well
reported on elements power prints.
With this long path, I can catch more printing inconsistencies.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I2d0e8ccbbd387a2cd6c645c07f4b5f75e4617c30
2022-11-02 12:05:26 +01:00
EstherLerouzic
18610fb7a9 Add ref_carrier to Pref and remove req_power from ReferenceCarrier
ref_carrier is added in Pref conveys the reference channel type
information ie the channel that was used for design (would it be
auto-design or for a given design). Other attributes (like
slot_width or roll-off) may be added here for future equalization
types.

Pref object already records the req_power, so let's remove it
from ReferenceCarrier and only use ref_carrier to record info that
will be useful for PSD equalization ie baud_rate.

This reference baud_rate is required to compute reference target power
based on spectral density values during propagation. It is thus required
because of on-the-fly evaluation of loss for p_span_i and for printing
loss and target power of ROADM during propagation.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ic7441afa12ca5273ff99dea0268e439276107257
2022-11-02 12:05:26 +01:00
EstherLerouzic
bd6b278dd1 Add tx_osnr in spectral information
This change enables to use a different tx_osnr per carrier.

If tx_osnr is defined via spectrum then use it to define a tx_osnr per
carrier in si else use the tx_osnr of request to set tx_osnr of si.

Then, the propagate function for requests is changed to update OSNR with
tx_OSNR per carrier defined in si.

TODO: The tx_osnr defined in spectrum is not yet taken into account for
the propagate_and_optimize function, because the loop that optimizes
the choice for the mode only loops on baudrate.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I0fcdf559d4f1f8f0047faa257076084ec7adcc77
2022-10-31 16:04:46 +01:00
EstherLerouzic
e143d25339 Add a user defined initial spectrum in propagation functions
A new function is added to build spectrum information based on
the actual mixture of channels to be simulated (baud rate, slot width,
power per frequency).

Propagation function is changed so that, if the user defines a
specific distribution, then it uses it, else it uses as before,
all identical channels based on the initial request. In this case,
as before this change, we assume full load, with same channel for
the spectral info and not the resulting mixt of channels after
routing.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Icf56396837b77009e98accd27fcebd2dded6d112
2022-10-31 16:03:15 +01:00
EstherLerouzic
ffc7dbc241 Change pref from a scalar to a list of per channel delta power
The idea behind this change is to reproduce the exact same behaviour as
with the scalar, but accounting for variable levels of powers.

- delete the  neq_ch: equivalent channel count in dB because with mixed
  rates and power such a value has limited utility
- instead creates a vector that records the 'user defined' distribution
  of power.

This vector is used as a reference for channel equalization out of the
ROADM. 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:
   freq1: 1dB, freq2: 3dB, freq3: -3dB, and target is -20dBm out of the
ROADM, then the target power for each channel uses the specified
delta_pdb_per_channel.
   target_power_per_channel[f1, f2, f3] = -19, -17, -23
However if input_signal = -23, -16, -26, then the target can not be
applied, because -23 < -19dBm and -26 < -23dBm, and a reduction must be
applied (ROADM can not amplify).
Then the target is only applied to signals whose power is above the
threshold. others are left unchanged and unequalized.
the new target is [-23, -17, -26]
and the attenuation to apply is [-23, -16, -26] - [-23, -17, -26] = [0, 1, 0]

Important note:
This changes the previous behaviour that equalized all identical channels
based on the one that had the min power !!

TODO: in coming refactor where transmission and design will be properly
separated, the initial behaviour may be set again as a design choice.

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

- in amplifier: the saturation is computed based on this vector
delta_pdb_per_channel, instead of the nb of channels.
The target of the future refactor will be to use the effective
carrier's power. I prefer to have this first step, because this is
how it is implemented today (ie based on the noiseless reference),
and I would like first to add more behaviour tests before doing
this refactor (would it be needed).

- in spectralInfo class, change pref to a Pref object to enable both
p_span0 and p_spani to be conveyed during propagation of
spectral_information in elements. No refactor of them at this point.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I591027cdd08e89098330c7d77d6f50212f4d4724
2022-10-28 09:13:24 +02:00
EstherLerouzic
b842898baf Change precision of --show-channels to 5 digits
Flexgrid precision is 6.25GHz so --show-channels should be at least 5 digits

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I7de4254ab18508320133371e0d8cc8b5e08f0d2f
2022-10-28 00:38:28 +00:00
EstherLerouzic
7ea9e3b341 Fix bug when gain is not initialized
If gain is not initialized, save_networks does not work properly
trying to round a None value

Change-Id: I614859f16e0019a2f6fe680c04159398c9b1eb51
2022-10-20 15:38:12 +00:00
Jan Kundrát
fcf168b361 tests: fix flake8 and flake8-html incompatibility
Test runs (`linters-diff-ci`) end up with an error:

 Traceback (most recent call last):
   File "/home/zuul/src/gerrithub.io/Telecominfraproject/oopt-gnpy/.tox/linters-diff-ci/bin/flake8", line 8, in <module>
     sys.exit(main())
   File "/home/zuul/src/gerrithub.io/Telecominfraproject/oopt-gnpy/.tox/linters-diff-ci/lib/python3.10/site-packages/flake8/main/cli.py", line 22, in main
     app.run(argv)
   File "/home/zuul/src/gerrithub.io/Telecominfraproject/oopt-gnpy/.tox/linters-diff-ci/lib/python3.10/site-packages/flake8/main/application.py", line 336, in run
     self._run(argv)
   File "/home/zuul/src/gerrithub.io/Telecominfraproject/oopt-gnpy/.tox/linters-diff-ci/lib/python3.10/site-packages/flake8/main/application.py", line 326, in _run
     self.report()
   File "/home/zuul/src/gerrithub.io/Telecominfraproject/oopt-gnpy/.tox/linters-diff-ci/lib/python3.10/site-packages/flake8/main/application.py", line 321, in report
     self.formatter.stop()
   File "/home/zuul/src/gerrithub.io/Telecominfraproject/oopt-gnpy/.tox/linters-diff-ci/lib/python3.10/site-packages/flake8_html/plugin.py", line 245, in stop
     self.write_index()
   File "/home/zuul/src/gerrithub.io/Telecominfraproject/oopt-gnpy/.tox/linters-diff-ci/lib/python3.10/site-packages/flake8_html/plugin.py", line 281, in write_index
     versions=self.option_manager.generate_versions(),
 AttributeError: 'OptionManager' object has no attribute 'generate_versions'
 ERROR: InvocationError for command /home/zuul/src/gerrithub.io/Telecominfraproject/oopt-gnpy/.tox/linters-diff-ci/bin/flake8 --format html --htmldir linters --exit-zero (exited with code 1)

Bug: https://github.com/lordmauve/flake8-html/issues/30
Change-Id: I755877341dec2d9cd9bdcdab098e2067f783cc27
2022-10-20 15:37:12 +02:00
Jan Kundrát
a7ec7e2ed6 Merge changes from topic "mixed-rate"
* changes:
  Change saturation verification to total input power
  Prepare for Pref definition
  Add utilities
2022-09-19 09:30:59 +00:00
Jan Kundrát
00ee102b3a docs: fix RST formatting
...of a bullet list. This ain't markdown, apparently.

Change-Id: I4f7a55a4084eda6463636c1dd5c41ef43ef78921
2022-09-18 12:46:19 +02:00
EstherLerouzic
ce11524ad9 Correct dgt vector: listed in the reversed order
This was corrected for example-data but not for tests data
(in commit 3a72ce84d0, related
to issue #390)

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I929beeb034166d30aa994439a1d6a26350f5c3e9
2022-09-14 05:35:15 +00:00
EstherLerouzic
74be14562a record request_id as string, not integer
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I59416a6d69a5989d0c152461ca9e264abcf09ea8
2022-08-24 16:45:56 +02:00
EstherLerouzic
16694d0a09 support missing trx_mode in request instead of null value
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I5c05b17b0b134c7782a08e86015dc30c7c9b3713
2022-08-24 16:43:57 +02:00
EstherLerouzic
33c6038921 Change saturation verification to total input power
Previous check was made on reference channel computation.
Now we use the actual total input power to compute the actual gain.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I3e0db72fdb030a49e2b06cdcfb442b5e642c1777
2022-08-17 14:13:38 +02:00
EstherLerouzic
119c9eda90 Prepare for Pref definition
Mainly changes self.pch_out_db to self.ref_pch_out_dbm in order
to reflect real unit for the value and to remind that this value
is defined for a reference noiseless channel (whose power is recorded
in p_spani in Pref).

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: If0e008c3efc36ce73c9df01c76cf46985543d9fa
2022-08-17 14:13:38 +02:00
EstherLerouzic
b63e146bf4 Add utilities
to convert from/to watt, mW, dBm, power spectral density ...

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I9b9684c1ad096aa54d01ef3f0242ecd2dcae79aa
2022-08-17 14:13:38 +02:00
gborrach
09dba8a166 Fix: Raman pumps SRS solver
In the previous version, when the values of the counter-propagating Raman pump profiles were flipped, the pumps resulted flipped also in frequency.

Change-Id: I66f7c2aff35c72f5dcb4fb11f7a82fe1df2ee3f2
Co-authored-by: Andrea D'Amico <andrea.damico@polito.it>
2022-07-27 00:20:47 +02:00
Jan Kundrát
7f5043622b CI: GitHub: show all build failures
Change-Id: I4a5aeb123aa89a30371a36788188964ca924ca12
2022-07-07 16:32:13 +02:00
Jan Kundrát
6ad4593f41 CI: GitHub: test on Mac OS as well
Change-Id: Ifb8ba470765fc02e3367beeaf8f048da6fdad6d7
2022-07-05 13:18:37 +02:00
Jan Kundrát
706661d801 CI: GitHub: use new test-requirements
Follow-up: b86fe960 I8d2e610c91da728d72c7d19590b25bbd8713f0de tests: Easier installation of test requirements via PIP
Change-Id: I870ed27af7301829ced572214f517ca76a94a0dc
2022-07-05 13:07:18 +02:00
Jan Kundrát
a408d28911 Merge "Remove Travis-CI leftovers" 2022-07-05 11:07:08 +00:00
Jan Kundrát
b86fe96032 tests: Easier installation of test requirements via PIP
Burying these behind the tox.ini works fine on CI, but it means that
someone has to ask the users to run an extra `pip install pytest` for
the test suite. Not nice.

This will need a follow-up commit to adjust the GitHub action to use
this new simplified way. That cannot land via Gerrit due to GitHub's
permission model.

Change-Id: I8d2e610c91da728d72c7d19590b25bbd8713f0de
2022-07-05 12:45:19 +02:00
Jan Kundrát
43926518ad Remove Travis-CI leftovers
These builds have not been running for about an year. Now that we have
Zuul for day-to-day CI and GitHub actions for some auxiliary package
building, remove Travis.

Change-Id: I1dd7f70045fd24d2f73f0d2086cb49edde2093c7
2022-07-05 10:14:18 +02:00
Jan Kundrát
128a6e816b docs: better anchor for legacy JSON
Change-Id: I410a4c0cdd34dd9aa5d8e34bb859746236fffdd2
2022-07-03 01:03:26 +02:00
Jan Kundrát
44db951261 docs: show gnpy.app
Change-Id: I7ec5eec72fb0f07e277ac849da09003d376eec17
2022-04-12 11:42:06 +02:00
Jonas Mårtensson
3c3d919b77 Merge "Fix: penalties are not correctly initialized" 2022-04-11 18:55:42 +00:00
EstherLerouzic
2079d2bc5b Fix: penalties are not correctly initialized
When mode is not given and propagation is performed bidir, penalties
corresponding to automatically  selected mode are not correctly
initialized in request, and gnpy-path-request fails.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: If045624ff5dad7f0dfdec93eaa05bb5eae86e643
2022-04-06 17:17:21 +02:00
Jonas Mårtensson
062e2076ed Properly initialize power profiles for Raman calculation
numpy.empty should not be used for initializing arrays without manually
setting values since it does not initialize entries. Use numpy.zeros
instead.

Signed-off-by: Jonas Mårtensson <jonas.martensson@ri.se>
Change-Id: I4e85eb39bdce00663c0cab9582ea7ae25eb90986
2022-03-29 21:41:57 +02:00
Jonas Mårtensson
1dd1bad273 Fix bug in Raman calculation without counterpropagating pumps
The counterpropagating power profile was initialized based on number of
copropagating frequencies, which caused simulation to crash when no
counterpropagating pumps were present.

Signed-off-by: Jonas Mårtensson <jonas.martensson@ri.se>
Change-Id: I685e5438fda06058f0757ff51fdd67bc68aa1352
2022-03-29 21:27:18 +02:00
Jan Kundrát
5b104af296 packaging: cleanup: remove non-existing paths
The examples have lived below gnpy/example-data/ for a few releases
already, and I've checked that these files are included in release
tarballs and wheels.

Change-Id: I782fc56a171f4cbc08f6698ac5d339e4cacecbb4
2022-03-09 00:13:43 +01:00
Jan Kundrát
f170574abf CI: retire gate
We have not started using this one, so let's not pretend that it's
active.

Change-Id: I806a76e2c6e0dc1d1fb76796cfea8eb37bfa39ca
2022-02-15 13:27:24 +01:00
Jan Kundrát
a68e8ff8d2 CI: Use default VMs for Python 3.8
Since the mirror infra for Fedora 34 is now gone on Vexxhost, let's try
to use the default options.

Change-Id: I6e4cc07705287666a772c6b1b70e981b24da6670
2022-02-15 13:18:31 +01:00
AndreaDAmico
d5a52d1b2b Restructure Transceiver with new spectral information
Change-Id: Iec9a6e4a510b8020aed8804d4a594b2b0429e28d
2022-02-10 17:38:39 +01:00
AndreaDAmico
7ac6e058ec EDFA new spectral information restructuring
Change-Id: Ia30e0e9bd666e83394c7a0740b2117a2d9c9d485
2022-02-10 17:37:03 +01:00
AndreaDAmico
74ab3c1bcd Fused new spectral information restructuring
Change-Id: Ie4dd989e2fd72682820845d21c43afed177f0f2f
2022-02-10 17:36:35 +01:00
AndreaDAmico
1a2ff2d215 Roadm new spectral information restructuring
Change-Id: I5c7c615e8278bff79dc74af10810589a15cc7535
2022-02-10 17:34:28 +01:00
Giacomo Borraccini
aaf0480e9c Management of lumped losses along a fiber span
The lumped losses are used in the computation of the loss/gain profile
through the fiber whether the Raman effect is considered or not. The
computed power profile is used to calculate the related NLI impairment.

Using the 'gn_model_analytic' method, the lumped losses are taken into
account as the contribution of an additional total loss at the end of
the fiber span. In case the 'ggn_spectrally_separated' is selected, the
method uses the computed power profile according to the specified z and
frequency arrays. The lumped losses are so considered within the NLI
power evolution along the fiber.

Change-Id: I73a6baa321aca4d041cafa180f47afed824ce267
Signed-off-by: Jan Kundrát <jan.kundrat@telecominfraproject.com>
2022-02-10 17:33:34 +01:00
Jan Kundrát
5e50ffbbf6 CI: check patches on Python 3.10 as well
Depends-on: https://review.gerrithub.io/c/Telecominfraproject/oopt-zuul-jobs/+/531900
Change-Id: I975c38b2f287aa07b68cc37500c7022feb4ae3e2
2022-02-02 02:13:23 +01:00
Jan Kundrát
243b701391 docs: update dependencies
Python 3.10 builds require a fix in Sphinx, so let's update all docs
dependencies while we're at this.

Unfortunately, the myst-parser requires docutils<0.18,>=0.15 so we
cannot take the latest and greatest of that one.

After this update, sphinxcontrib-bibtex now requires an explicit
reference to the .bib files directly in the config file. Let's remove
the one in the actual docs, then.

Bug: https://github.com/sphinx-doc/sphinx/pull/9513
Change-Id: I80f62131b25f3afa23351646001f6ce381723487
2022-02-02 02:13:04 +01:00
Jan Kundrát
bdbfe76aed Mark Python 3.10 as supported
The CI is (so far) only post-merge via the GitHub CI. The Zuul CI is
pending on Fedora 35 images within nodepool; I've requested that via a
ticket at Vexxhost, our hosted CI provider.

Change-Id: I81c9867792f972db8fcb2bf902f5f8d1ed7ffeea
2022-01-20 18:51:02 +01:00
Jan Kundrát
541ec04444 GitHub CI: Python 3.10
Add a new target, and switch those builds where a specific version is
not that important to the latest and greatest.

Change-Id: I6f62a08c671a98b3663c7a8cf0099947457f1e4d
2022-01-20 18:50:54 +01:00
Jan Kundrát
bf1522b047 Merge changes Iff561600,I60f951e9
* changes:
  tests: update pytest
  Update dependencies
2022-01-20 17:50:09 +00:00
Jan Kundrát
3f4188a0fd Merge changes I79611db3,Ib0ab383b,I3745eba4,Ic19aff08,Ic255f35d
* changes:
  Add PMD and PDL in amplifiers
  Introduce PDL accumulation and penalty calculation
  Calculate CD and PMD penalty
  Set PMD for ROADMs in OpenROADM eqpt_config according to MSA spec
  Fix formatting of OpenROADM eqpt files
2022-01-20 16:48:11 +00:00
Jan Kundrát
8b387ef722 tests: update pytest
Let's switch to this new major version; it's not wise to stay on a
previous major release indefinitely. In practical terms, version 6.x is
a requirement for supporting Python 3.10.

I'm not updating the CI configuration yet because GitHub disallows
pushes via Gerrit when GitHub CI Actions are modified. The version will
have to be bumped in there as well.

Change-Id: Iff5616007b51e6098f53810a28fef5b839dadec2
2022-01-19 16:25:38 +01:00
Jan Kundrát
cad9a0f18e Update dependencies
Updating everything to the latest versions which are available on PIP --
apart from xlrd, which decided to stop supporting XLSX files in their
newest version. Since we have some XLSX files in this repo, I think we
cannot update now.

Change-Id: I60f951e9f17cc62f0dcdc6b6d0cfce0cb5f891fa
2022-01-19 16:23:18 +01:00
Jonas Mårtensson
ab84c77363 Restore RamanFiber to_json method with operational parameters
The recent commit 77925b2 removed the to_json method from RamanFiber
class, which means that operational parameters (temperature and
raman_pumps) were not included when converting a topology to json and
saving it. This patch restores it.

Signed-off-by: Jonas Mårtensson <jonas.martensson@ri.se>
Change-Id: Icbea349c1ffaa2f216533b84c8edf5c8b59765f9
2022-01-18 19:07:28 +01:00
Jonas Mårtensson
62fa9ab0b0 Add PMD and PDL in amplifiers
Both PMD and PDL is set to 0 by default. Values from the OpenROADM MSA
for ILAs are included in corresponding eqpt files.

Signed-off-by: Jonas Mårtensson <jonas.martensson@ri.se>
Change-Id: I79611db3ae798e9dadc47ee39161dc1e242f2595
2022-01-18 12:35:59 +01:00
Jonas Mårtensson
14591c7a11 Introduce PDL accumulation and penalty calculation
This fixes #421

As a first step PDL is specified in the eqpt library for ROADMs only.
In a later step, PDL (as well as PMD) should be specified also for amps
and possibly for fibers. PDL values from the OpenROADM MSA for ROADMs
are included in the corresponding eqpt files.

The acculumation rule for PDL is the same as for PMD as shown in:

"The statistics of polarization-dependent loss in optical communication
systems", A. Mecozzi and M. Shtaif, IEEE Photon. Technol. Lett., vol.
14, pp. 313-315, Mar 2002.

PDL penalty is specified and calculated in the same way as for CD and
PMD, i.e. linear interpolation between impairment_value/penalty_value
pairs. This patch includes penalty specification for OpenROADM trx
modes according to the MSA.

Signed-off-by: Jonas Mårtensson <jonas.martensson@ri.se>
Change-Id: Ib0ab383bcaee7d7523ffc3fa9a949d76c8c86ff7
2022-01-18 12:35:59 +01:00
Jonas Mårtensson
587932290d Calculate CD and PMD penalty
The penalties are calculated and presented separately from the GSNR.

They are also taken into account when optimizing trx mode and verifying
path feasibility in path_requests_run processing.

Penalties are specified in the eqpt_config file as part of trx modes.
This patch includes specifications for OpenROADM trx modes.

Penalties are defined by a list of
impairment_value/penalty_value pairs, for example:

"penalties": [
    {
        "chromatic_dispersion": 4e3,
        "penalty_value": 0
    },
    {
        "chromatic_dispersion": 18e3,
        "penalty_value": 0.5
    },
    {
        "pmd": 10,
        "penalty_value": 0
    },
    {
        "pmd": 30,
        "penalty_value": 0.5
    }
]

- Between given pairs, penalty is linearly interpolated.
- Below min and above max up_to_boundary, transmission is considered
  not feasible.

This is in line with how penalties are specified in OpenROADM and
compatible with specifications from most other organizations and
vendors.

The implementation makes it easy to add other penalties (PDL, etc.) in
the future.

The input format is flexible such that it can easily be extended to
accept combined penalty entries (e.g. CD and PMD) in the future.

Signed-off-by: Jonas Mårtensson <jonas.martensson@ri.se>
Change-Id: I3745eba48ca60c0e4c904839a99b59104eae9216
2022-01-18 12:35:59 +01:00
Jonas Mårtensson
82b148eb87 Set PMD for ROADMs in OpenROADM eqpt_config according to MSA spec
Signed-off-by: Jonas Mårtensson <jonas.martensson@ri.se>
Change-Id: Ic19aff08ea0da51656ba81e04f34a405413f7b54
2022-01-18 12:35:59 +01:00
Jonas Mårtensson
8393daf67d Fix formatting of OpenROADM eqpt files
Signed-off-by: Jonas Mårtensson <jonas.martensson@ri.se>
Change-Id: Ic255f35d32ce996724a547962efc44d7950bac4d
2022-01-18 12:35:57 +01:00
Jan Kundrát
be61dfd094 Merge changes from topic "mixed-rate"
* changes:
  Raman Solver restructuring and speed up
  Effective area included in fiber parameters
  Fiber propagation of new Spectral Information.
  Small change on Fiber parameters
2022-01-18 09:58:07 +00:00
AndreaDAmico
77925b218e Raman Solver restructuring and speed up
In this change, the RamanSolver is completely restructured in order to obtain a simplified and faster solution of the Raman equation. Additionally, the inter-channel Raman effect can be evaluated also in the standard fiber, when no Raman pumping is present. The same is true for the GGN model.

The Raman pump parameter pumps_loss_coef has been removed as it was not used. The loss coefficient value evaluated at the pump frequency can be included within the fiber loss_coef parameter.

This change induces variations in some expected test results as the Raman profile solution is calculated by a completely distinct algorithm. Nevertheless, these variations are negligible being lower than 0.1dB.

Change-Id: Iaa40fbb23c555571497e1ff3bf19dbcbfcadf96b
2022-01-12 19:37:10 +01:00
AndreaDAmico
4621ac12bf Effective area included in fiber parameters
Gamma and the raman efficiency are calculated using the effective area if not provided. Both these parameters are managed as optional in json_io.py for backward compatibility.

Change-Id: Id7f1403ae33aeeff7ec464e4c7f9c1dcfa946827
2022-01-06 12:00:00 +01:00
AndreaDAmico
09920c0af2 Fiber propagation of new Spectral Information.
Modification of the Fiber and the NliSolver in order to properly propagate the new definition of the spectral information taking advantage of the numpy array structures.

In the previous version, the propagation of the spectral information was implemented by means of for cycles over each channel, in turn.
In this change the propagation is applied directly on the newly defined spectral information attributes as numpy arrays.

Additional changes:
- Simplification of the FiberParameters and the NliParameters;
- Previous issues regarding the loss_coef definition along the frequency are solved;
- New test in test_science_utils.py verifing that the fiber propagation provides the correct values in case of a few cases of flex grid spectra.

Change-Id: Id71f36effba35fc3ed4bbf2481a3cf6566ccb51c
2022-01-06 12:00:00 +01:00
AndreaDAmico
e6a3d9ce5b Small change on Fiber parameters
Squeeze function has been replaced by asarray. Using 'get' function
instead of if condition for the dictionaries.  Frequency reference
derived from wavelength reference of 1550 nm.

Change-Id: I815ad8591c9e238f3fc9322ca0946ea469ff448f
2022-01-06 12:00:00 +01:00
Jonas Mårtensson
b9645702c8 Add fiber padding after splitting fibers
Since splitting fibers may result in fibers with loss lower than
specifed padding, the padding should be added after splitting.

Signed-off-by: Jonas Mårtensson <jonas.martensson@ri.se>
Change-Id: Id75ddf5d81c4c1c52f8f8becfdb005d2fe04c1f8
2021-12-19 21:20:08 +01:00
Jan Kundrát
9c2095b138 remove unused import
Change-Id: I08d31eab16f0c4195c4431f339c60ac694788d22
2021-12-07 16:49:40 +01:00
Jan Kundrát
cb42115230 LGTM: exclude more harmless "errors"
The {node.uid} pattern is used also when exporting some data to a file,
and once again it is not an antipattern for us.

Change-Id: Ib4441155b5ca42fad7dd6cf8554a0302a69ef136
2021-12-07 16:47:30 +01:00
Jan Kundrát
5909da4bbf remove an unused import
Change-Id: I4d719813b647424c20cc7fc990c36a57490b7f5b
2021-12-07 12:49:46 +01:00
Jan Kundrát
2ba1e86b28 Silence an irrelevant warning on LGTM.com
By default, this service issues a warning for strings which format data
like {uid}, flagging this pattern as related to antipatterns CWE-312,
CWE-315 and CWE-359. This warning is not relevant for us because we
never process sensitive information (if there are some NDA-covered data
in the input, well, the user already has them, we're just using these).

Silence this warning (it's currently getting us an B rating,
apparently).

See-also: https://lgtm.com/rules/1510014536001/
Change-Id: Id5cdd2c62e61a8329760d3fb79665737beb22378
2021-12-07 12:49:46 +01:00
Jan Kundrát
3358c5eeb5 Merge "docs: a beginner-friendly way of reaching out to vendors" 2021-11-25 14:53:57 +00:00
Jan Kundrát
13e4c29bc1 Merge "tests: rely on pytest's native comparisons of nested dicts" 2021-11-11 16:17:14 +00:00
Jan Kundrát
4becc9060c docs: a beginner-friendly way of reaching out to vendors
As Gert proposed on the latest call, submitting patches could be a bit
high of a barrier to go over. Let's make it clear that we're here to
help those vendors who are willing to collaborate.

Change-Id: Ieac1c91480143c553ffb25dd1c46e94022bf5ba3
2021-11-04 18:45:05 +01:00
AndreaDAmico
32d8b2a4d8 Simulation Parameters
This change siplifies the structure of the simulation parameters,
removing the gnpy.science_utils.simulation layer, provides some
documentation of the parameters and define a mock fixture for testing in
safe mode.

Jan: while I'm not thrilled by this concept of hidden global state, we
agreed to let it in as a temporary measure (so as not to hold merging of
Andrea's flexgrid/multirate patches). I've refactored this to a more
pytest-ish way of dealing with fixtures. In the end, it was also
possible to remove the MockSimParams class because it was not adding any
features on top of what SimParams can do already (and to what was
tested).

Change-Id: If5ef341e0585586127d5dae3f39dca2c232236f1
Signed-off-by: Jan Kundrát <jan.kundrat@telecominfraproject.com>
2021-10-29 13:14:22 +02:00
Jan Kundrát
399eb9700f tests: rely on pytest's native comparisons of nested dicts
In my opinion, this actually produces more useful output *if* pytest is
invoked with `-vv` (which the CI is already doing). When I deliberately
change the expected result of services like this:

 --- a/tests/data/testService_services_expected.json
 +++ b/tests/data/testService_services_expected.json
 @@ -45,7 +45,7 @@
            ],
            "spacing": 50000000000.0,
            "max-nb-of-channel": null,
 -          "output-power": 0.0012589254117941673,
 +          "output-power": 0.001258925411791673,
            "path_bandwidth": 10000000000.0
          }
        }

...the old code would just say:

 >       assert not results.requests.different
 E       AssertionError: assert not [({'bidirectional': False, 'destination': 'trx Vannes_KBE', 'dst-tp-id': 'trx Vannes_KBE', 'path-constraints': {'te-ba......}], 'max-nb-of-channel': None, 'output-power': 0.0012589254117941673, 'path_bandwidth': 10000000000.0, ...}}, ...})]
 E        +  where [({'bidirectional': False, 'destination': 'trx Vannes_KBE', 'dst-tp-id': 'trx Vannes_KBE', 'path-constraints': {'te-ba......}], 'max-nb-of-channel': None, 'output-power': 0.0012589254117941673, 'path_bandwidth': 10000000000.0, ...}}, ...})] = Results(missing=set(), extra=set(), different=[({'request-id': '1', 'source': 'trx Brest_KLA', 'destination': 'trx Van...g': 50000000000.0, 'max-nb-of-channel': 80, 'output-power': 0.0012589254117941673, 'path_bandwidth': 60000000000.0}}}}).different
 E        +    where Results(missing=set(), extra=set(), different=[({'request-id': '1', 'source': 'trx Brest_KLA', 'destination': 'trx Van...g': 50000000000.0, 'max-nb-of-channel': 80, 'output-power': 0.0012589254117941673, 'path_bandwidth': 60000000000.0}}}}) = ServicesResults(requests=Results(missing=set(), extra=set(), different=[({'request-id': '1', 'source': 'trx Brest_KLA'...': 50000000000.0, 'max-nb-of-channel': 80, 'output-power': 0.0012589254117941673, 'path_bandwidth': 60000000000.0}}}})).requests

 tests/test_parser.py:147: AssertionError
 ...
 FAILED tests/test_parser.py::test_excel_service_json_generation[xls_input1-expected_json_output1] - AssertionError: assert not [({'bidirectional': False, 'destination': 'trx Vannes_KBE', 'dst-tp-id': 'trx Vannes_KBE', 'path-constraints': {'te-ba......}], 'max-nb-of-channel': None, 'output-power': 0.0012589254117941673, 'path_bandwidth': 10000000000.0, ...}}, ...})]

With this change in place, the report becomes more useful:

 >       assert from_xls == load_json(expected_json_output)
 E       AssertionError: assert {'path-request': [{'bidirectional': False,\n                   'destination': 'trx Vannes_KBE',\n                   'dst-tp-id': 'trx Vannes_KBE',\n                   'path-constraints': {'te-bandwidth': {'effective-freq-slot': [{'M': None,\n                                                                                  'N': None}],\n                                                         'max-nb-of-channel': 80,\n                                                         'output-power': None,\n                                                         'path_bandwidth': 100000000000.0,\n                                                         'spacing': 50000000000.0,\n                                                         'technology': 'flexi-grid',\n                                                         'trx_mode': 'mode 1',\n                                                         'trx_type': 'Voyager'}},\n                   'request-id': '0',\n                   'source': 'trx Lorient_KMA',\n                   'src-tp-id': 'trx Lorient_KMA'},\n                  {'bidirectional': False,\n                   'destination': 'trx Vannes_KBE',\n                   'dst-tp-id': 'trx Vannes_KBE',\n                   'path-constraints': {'te-bandwidth': {'effective-freq-slot': [{'M': None,\n                                                                                  'N': None}],\n                                                         'max-nb-of-channel': None,\n                                                         'output-power': 0.0012589254117941673,\n                                                         'path_bandwidth': 10000000000.0,\n                                                         'spacing': 50000000000.0,\n                                                         'technology': 'flexi-grid',\n                                                         'trx_mode': 'mode 1',\n                                                         'trx_type': 'Voyager'}},\n                   'request-id': '1',\n                   'source': 'trx Brest_KLA',\n                   'src-tp-id': 'trx Brest_KLA'},\n                  {'bidirectional': False,\n                   'destination': 'trx Rennes_STA',\n                   'dst-tp-id': 'trx Rennes_STA',\n                   'path-constraints': {'te-bandwidth': {'effective-freq-slot': [{'M': None,\n                                                                                  'N': None}],\n                                                         'max-nb-of-channel': 80,\n                                                         'output-power': 0.0012589254117941673,\n                                                         'path_bandwidth': 60000000000.0,\n                                                         'spacing': 50000000000.0,\n                                                         'technology': 'flexi-grid',\n                                                         'trx_mode': 'mode 1',\n                                                         'trx_type': 'vendorA_trx-type1'}},\n                   'request-id': '3',\n                   'source': 'trx Lannion_CAS',\n                   'src-tp-id': 'trx Lannion_CAS'}]} == {'path-request': [{'bidirectional': False,\n                   'destination': 'trx Vannes_KBE',\n                   'dst-tp-id': 'trx Vannes_KBE',\n                   'path-constraints': {'te-bandwidth': {'effective-freq-slot': [{'M': None,\n                                                                                  'N': None}],\n                                                         'max-nb-of-channel': 80,\n                                                         'output-power': None,\n                                                         'path_bandwidth': 100000000000.0,\n                                                         'spacing': 50000000000.0,\n                                                         'technology': 'flexi-grid',\n                                                         'trx_mode': 'mode 1',\n                                                         'trx_type': 'Voyager'}},\n                   'request-id': '0',\n                   'source': 'trx Lorient_KMA',\n                   'src-tp-id': 'trx Lorient_KMA'},\n                  {'bidirectional': False,\n                   'destination': 'trx Vannes_KBE',\n                   'dst-tp-id': 'trx Vannes_KBE',\n                   'path-constraints': {'te-bandwidth': {'effective-freq-slot': [{'M': None,\n                                                                                  'N': None}],\n                                                         'max-nb-of-channel': None,\n                                                         'output-power': 0.001258925411791673,\n                                                         'path_bandwidth': 10000000000.0,\n                                                         'spacing': 50000000000.0,\n                                                         'technology': 'flexi-grid',\n                                                         'trx_mode': 'mode 1',\n                                                         'trx_type': 'Voyager'}},\n                   'request-id': '1',\n                   'source': 'trx Brest_KLA',\n                   'src-tp-id': 'trx Brest_KLA'},\n                  {'bidirectional': False,\n                   'destination': 'trx Rennes_STA',\n                   'dst-tp-id': 'trx Rennes_STA',\n                   'path-constraints': {'te-bandwidth': {'effective-freq-slot': [{'M': None,\n                                                                                  'N': None}],\n                                                         'max-nb-of-channel': 80,\n                                                         'output-power': 0.0012589254117941673,\n                                                         'path_bandwidth': 60000000000.0,\n                                                         'spacing': 50000000000.0,\n                                                         'technology': 'flexi-grid',\n                                                         'trx_mode': 'mode 1',\n                                                         'trx_type': 'vendorA_trx-type1'}},\n                   'request-id': '3',\n                   'source': 'trx Lannion_CAS',\n                   'src-tp-id': 'trx Lannion_CAS'}]}
 E         Differing items:
 E         {'path-request': [{'bidirectional': False, 'destination': 'trx Vannes_KBE', 'dst-tp-id': 'trx Vannes_KBE', 'path-const...[{...}], 'max-nb-of-channel': 80, 'output-power': 0.0012589254117941673, 'path_bandwidth': 60000000000.0, ...}}, ...}]} != {'path-request': [{'bidirectional': False, 'destination': 'trx Vannes_KBE', 'dst-tp-id': 'trx Vannes_KBE', 'path-const...[{...}], 'max-nb-of-channel': 80, 'output-power': 0.0012589254117941673, 'path_bandwidth': 60000000000.0, ...}}, ...}]}
 E         Full diff:
 E           {
 E            'path-request': [{'bidirectional': False,
 E                              'destination': 'trx Vannes_KBE',
 E                              'dst-tp-id': 'trx Vannes_KBE',
 E                              'path-constraints': {'te-bandwidth': {'effective-freq-slot': [{'M': None,
 E                                                                                             'N': None}],
 E                                                                    'max-nb-of-channel': 80,
 E                                                                    'output-power': None,
 E                                                                    'path_bandwidth': 100000000000.0,
 E                                                                    'spacing': 50000000000.0,
 E                                                                    'technology': 'flexi-grid',
 E                                                                    'trx_mode': 'mode 1',
 E                                                                    'trx_type': 'Voyager'}},
 E                              'request-id': '0',
 E                              'source': 'trx Lorient_KMA',
 E                              'src-tp-id': 'trx Lorient_KMA'},
 E                             {'bidirectional': False,
 E                              'destination': 'trx Vannes_KBE',
 E                              'dst-tp-id': 'trx Vannes_KBE',
 E                              'path-constraints': {'te-bandwidth': {'effective-freq-slot': [{'M': None,
 E                                                                                             'N': None}],
 E                                                                    'max-nb-of-channel': None,
 E         -                                                          'output-power': 0.001258925411791673,
 E         +                                                          'output-power': 0.0012589254117941673,
 E         ?                                                                                          +
 E                                                                    'path_bandwidth': 10000000000.0,
 E                                                                    'spacing': 50000000000.0,
 E                                                                    'technology': 'flexi-grid',
 E                                                                    'trx_mode': 'mode 1',
 E                                                                    'trx_type': 'Voyager'}},
 E                              'request-id': '1',
 E                              'source': 'trx Brest_KLA',
 E                              'src-tp-id': 'trx Brest_KLA'},
 E                             {'bidirectional': False,
 E                              'destination': 'trx Rennes_STA',
 E                              'dst-tp-id': 'trx Rennes_STA',
 E                              'path-constraints': {'te-bandwidth': {'effective-freq-slot': [{'M': None,
 E                                                                                             'N': None}],
 E                                                                    'max-nb-of-channel': 80,
 E                                                                    'output-power': 0.0012589254117941673,
 E                                                                    'path_bandwidth': 60000000000.0,
 E                                                                    'spacing': 50000000000.0,
 E                                                                    'technology': 'flexi-grid',
 E                                                                    'trx_mode': 'mode 1',
 E                                                                    'trx_type': 'vendorA_trx-type1'}},
 E                              'request-id': '3',
 E                              'source': 'trx Lannion_CAS',
 E                              'src-tp-id': 'trx Lannion_CAS'}],
 E           }

 tests/test_parser.py:140: AssertionError

Change-Id: I30eafb3c7c0f2e800fb0983371eaa5058e78b029
2021-10-28 17:16:11 +02:00
AndreaDAmico
82f83e1462 Add documentation of simulation parameters
Jan: only add those parameter which are not being removed in future
patches and which have useful documentation that the user can plausibly
act on.

Change-Id: I02173f500fed8c065a30de5d23e318bce2a90c33
Co-authored-by: Jan Kundrát <jan.kundrat@telecominfraproject.com>
2021-10-28 16:18:25 +02:00
Jonas Mårtensson
171450fa54 Update documentation of polynomial NF to match the code
This fixes #422.

Signed-off-by: Jonas Mårtensson <jonas.martensson@ri.se>
Change-Id: I39af6767e41723b23dd61a832860fc66f21dbf17
2021-10-28 08:41:14 +02:00
AndreaDAmico
9f9f4c78fc Small change on Raman pump parameters
Getter and setter removed from the class PumpParams. The propagation
direction is cast to lower case string within the PumpParams
constructor.

Change-Id: Ice28affe8bcffbf8adcebb5cb096be8100081511
2021-10-26 16:33:35 +02:00
AndreaDAmico
c469a8d9ba New definition of spectral information
It allows the definition of an arbitrary spectral information.
It is fully back-compatible.

Change-Id: Id050e9f0a0d30780a49ecfbe8b96271fe47bcedc
2021-10-26 15:59:20 +02:00
Jonas Mårtensson
99b2a554dc Correct calculation of NF for OpenROADM amps
This fixes #420.

In order to be consistent with the OpenROADM MSA, the input power per
channel used for calculating incremental OSNR and NF should be scaled to
50 GHz slot width.

Signed-off-by: Jonas Mårtensson <jonas.martensson@ri.se>
Change-Id: I64ca3e4cad6399f308827f4161d7c6b89be9d2ca
2021-10-19 12:02:48 +02:00
Jan Kundrát
57e98d7173 CI: linters: don't complain about non-lowercase variable names
...as agreed during today's coders call. It turned out that we do not
have a strong opinion, and it appeared that this limits us bit. The
rationale was that sometimes there's a loss of information when we
force-lowercase (such as milli- vs. mega-). So let's hope we're gonna be
smarter than a rigid set of rules :).

See-also: https://review.gerrithub.io/c/Telecominfraproject/oopt-gnpy/+/525660/2/gnpy/core/elements.py#681
Change-Id: If88abfa8383a437cc42e9196c612897fae6c96a0
2021-10-19 12:00:07 +02:00
Jan Kundrát
78b45a3958 Merge "Fix warnings for raman amp type varieties" 2021-10-11 19:32:03 +00:00
Jan Kundrát
64b6b486a9 Merge "Fix unit for max_fiber_lineic_loss_for_raman" 2021-10-11 19:15:59 +00:00
Jonas Mårtensson
65cb46f479 Fix unit for max_fiber_lineic_loss_for_raman
See GitHub issue #419.

The unit of max_fiber_lineic_loss_for_raman in the default equipment
config file is dB/km but it was compared with Fiber.params.loss_coef
which is in units of dB/m.

Signed-off-by: Jonas Mårtensson <jonas.martensson@ri.se>
Change-Id: I27c8ab03845a72fcda97415843c007078b7b9d06
2021-10-11 21:03:17 +02:00
Jonas Mårtensson
f94d06f124 Fix warnings for raman amp type varieties
Currently, a warning about fiber lineic loss being above threshold is
printed even when the warning is triggered by that the previous node is
not a fiber, which is confusing. Additionally, when a warning about
raman is triggered, the code in the following else clause is not
executed, which means that a potential warning about gain level is
disabled. These two warnings are independent and the second one should
not be disabled by the first one.

Signed-off-by: Jonas Mårtensson <jonas.martensson@ri.se>
Change-Id: I8ad58b4ebf6e7df1a949a77d67ed948ef385c47e
2021-09-28 13:08:57 +02:00
EstherLerouzic
e1f2c55942 Remove the representation error due to floating point
On certain values of loss_coef, the computation loss_coef * 1e-3 * 1e3
results in x.0000000000000000y values:
eg if 0.21 is provided in the topology file, then parameters.FiberParams
changes this to _loss_coef = 0.00021
and elements.Fiber.to_json prints 0.21000000000000002
This is a normal floating point behaviour, but is rather confusing.
In order to remove this unwanted decimal, I propose to round the printings
in to_json

https://docs.python.org/3/tutorial/floatingpoint.html

The change also add this round for gain, because in power mode
the gain is computed based on loss and loss may have this floating value.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ib3287a794e7da985eabf0af914c0e1ef4914e857
2021-09-16 15:41:25 +02:00
76 changed files with 9159 additions and 5471 deletions

View File

@@ -1,47 +0,0 @@
#!/bin/bash
set -e
IMAGE_NAME=telecominfraproject/oopt-gnpy
IMAGE_TAG=$(git describe --tags)
ALREADY_FOUND=0
docker pull ${IMAGE_NAME}:${IMAGE_TAG} && ALREADY_FOUND=1
if [[ $ALREADY_FOUND == 0 ]]; then
docker build . -t ${IMAGE_NAME}
docker tag ${IMAGE_NAME} ${IMAGE_NAME}:${IMAGE_TAG}
# shared directory setup: do not clobber the real data
mkdir trash
cd trash
docker run -it --rm --volume $(pwd):/shared ${IMAGE_NAME} gnpy-transmission-example
else
echo "Image ${IMAGE_NAME}:${IMAGE_TAG} already available, will just update the other tags"
fi
docker images
do_docker_login() {
echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin
}
if [[ "${TRAVIS_PULL_REQUEST}" == "false" ]]; then
if [[ "${TRAVIS_BRANCH}" == "develop" || "${TRAVIS_BRANCH}" == "docker" ]]; then
echo "Publishing latest"
docker tag ${IMAGE_NAME}:${IMAGE_TAG} ${IMAGE_NAME}:latest
do_docker_login
if [[ $ALREADY_FOUND == 0 ]]; then
docker push ${IMAGE_NAME}:${IMAGE_TAG}
fi
docker push ${IMAGE_NAME}:latest
elif [[ "${TRAVIS_BRANCH}" == "master" ]]; then
echo "Publishing stable"
docker tag ${IMAGE_NAME}:${IMAGE_TAG} ${IMAGE_NAME}:stable
do_docker_login
if [[ $ALREADY_FOUND == 0 ]]; then
docker push ${IMAGE_NAME}:${IMAGE_TAG}
fi
docker push ${IMAGE_NAME}:stable
fi
fi

View File

@@ -11,22 +11,25 @@ jobs:
name: Tox test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
with:
fetch-depth: 0
- uses: fedora-python/tox-github-action@v0.4
with:
tox_env: ${{ matrix.tox_env }}
dnf_install: ${{ matrix.dnf_install }}
- uses: codecov/codecov-action@29386c70ef20e286228c72b668a06fd0e8399192
- uses: codecov/codecov-action@v3.1.1
if: ${{ endswith(matrix.tox_env, '-cover') }}
with:
files: ${{ github.workspace }}/cover/coverage.xml
strategy:
fail-fast: false
matrix:
tox_env:
- py38
- py39-cover
- py39
- py310
- py311-cover
include:
- tox_env: docs
dnf_install: graphviz
@@ -37,13 +40,13 @@ jobs:
name: PyPI packaging
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
with:
fetch-depth: 0
- uses: actions/setup-python@v2
- uses: actions/setup-python@v4
name: Install Python
with:
python-version: '3.9'
python-version: '3.11'
- uses: casperdcl/deploy-pypi@bb869aafd89f657ceaafe9561d3b5584766c0f95
with:
password: ${{ secrets.PYPI_API_TOKEN }}
@@ -61,7 +64,7 @@ jobs:
with:
username: jktjkt
password: ${{ secrets.DOCKERHUB_TOKEN }}
- uses: actions/checkout@v2
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Extract tag name
@@ -91,21 +94,27 @@ jobs:
telecominfraproject/oopt-gnpy:${{ steps.extract_tag_name.outputs.GIT_DESC }}
telecominfraproject/oopt-gnpy:latest
windows:
name: Tests on Windows
runs-on: windows-2019
other-platforms:
name: Tests on other platforms
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
with:
fetch-depth: 0
- uses: actions/setup-python@v2
- uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python_version }}
- run: |
pip install -r tests/requirements.txt
pip install --editable .
pip install 'pytest>=5.0.0,<6'
pytest -vv
strategy:
fail-fast: false
matrix:
python_version:
- "3.9"
include:
- os: windows-2019
python_version: "3.10"
- os: windows-2022
python_version: "3.11"
- os: macos-12
python_version: "3.11"

3
.lgtm.yml Normal file
View File

@@ -0,0 +1,3 @@
queries:
- exclude: py/clear-text-logging-sensitive-data
- exclude: py/clear-text-storage-sensitive-data

View File

@@ -1,27 +0,0 @@
dist: focal
os: linux
language: python
services: docker
python:
- "3.8"
- "3.9"
before_install:
- sudo apt-get -y install graphviz
install: skip
script:
- pip install --editable .
- pip install pytest-cov rstcheck
- pytest --cov-report=xml --cov=gnpy -v
- pip install -r docs/requirements.txt
- rstcheck --ignore-roles cite *.rst
- sphinx-build -W --keep-going docs/ x-throwaway-location
after_success:
- bash <(curl -s https://codecov.io/bash)
jobs:
include:
- stage: test
name: Docker image
script:
- git fetch --unshallow
- ./.docker-travis.sh
- docker images

View File

@@ -2,25 +2,33 @@
- project:
check:
jobs:
- tox-py38-f34
- tox-py39-cover
- tox-docs-f34
- tox-py38:
vars:
ensure_tox_version: '<4'
- tox-py39:
vars:
ensure_tox_version: '<4'
- tox-py310-cover:
vars:
ensure_tox_version: '<4'
- tox-docs-f36:
vars:
ensure_tox_version: '<4'
- coverage-diff:
voting: false
dependencies:
- tox-py39-cover-previous
- tox-py39-cover
- tox-py310-cover-previous
- tox-py310-cover
vars:
coverage_job_name_previous: tox-py39-cover-previous
coverage_job_name_current: tox-py39-cover
coverage_job_name_previous: tox-py310-cover-previous
coverage_job_name_current: tox-py310-cover
- tox-linters-diff-n-report:
voting: false
- tox-py39-cover-previous
gate:
jobs:
- tox-py38-f34
- tox-py39-f34
- tox-docs-f34
vars:
ensure_tox_version: '<4'
- tox-py310-cover-previous:
vars:
ensure_tox_version: '<4'
tag:
jobs:
- oopt-release-python:

View File

@@ -11,18 +11,21 @@ To learn how to contribute, please see CONTRIBUTING.md
- Brian Taylor (Facebook) <briantaylor@fb.com>
- David Boertjes (Ciena) <dboertje@ciena.com>
- Diego Landa (Facebook) <dlanda@fb.com>
- Emmanuelle Delfour (Orange) <WEDE7391@orange.com>
- Esther Le Rouzic (Orange) <esther.lerouzic@orange.com>
- Gabriele Galimberti (Cisco) <ggalimbe@cisco.com>
- Gert Grammel (Juniper Networks) <ggrammel@juniper.net>
- Giacomo Borraccini (Politecnico di Torino) <giacomo.borraccini@polito.it>
- Gilad Goldfarb (Facebook) <giladg@fb.com>
- James Powell (Telecom Infra Project) <james.powell@telecominfraproject.com>
- Jan Kundrát (Telecom Infra Project) <jan.kundrat@telecominfraproject.com>
- Jan Kundrát (Telecom Infra Project) <jkt@jankundrat.com>
- Jeanluc Augé (Orange) <jeanluc.auge@orange.com>
- Jonas Mårtensson (RISE) <jonas.martensson@ri.se>
- Mattia Cantono (Politecnico di Torino) <mattia.cantono@polito.it>
- Miguel Garrich (University Catalunya) <miquel.garrich@upct.es>
- Raj Nagarajan (Lumentum) <raj.nagarajan@lumentum.com>
- Roberts Miculens (Lattelecom) <roberts.miculens@lattelecom.lv>
- Sami Alavi (NUST) <sami.mansooralavi1999@gmail.com>
- Shengxiang Zhu (University of Arizona) <szhu@email.arizona.edu>
- Stefan Melin (Telia Company) <Stefan.Melin@teliacompany.com>
- Vittorio Curri (Politecnico di Torino) <vittorio.curri@polito.it>

View File

@@ -3,12 +3,12 @@
[![Install via pip](https://img.shields.io/pypi/v/gnpy)](https://pypi.org/project/gnpy/)
[![Python versions](https://img.shields.io/pypi/pyversions/gnpy)](https://pypi.org/project/gnpy/)
[![Documentation status](https://readthedocs.org/projects/gnpy/badge/?version=master)](http://gnpy.readthedocs.io/en/master/?badge=master)
[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/Telecominfraproject/oopt-gnpy/build)](https://github.com/Telecominfraproject/oopt-gnpy/actions/workflows/main.yml)
[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/Telecominfraproject/oopt-gnpy/main.yml)](https://github.com/Telecominfraproject/oopt-gnpy/actions/workflows/main.yml)
[![Gerrit](https://img.shields.io/badge/patches-via%20Gerrit-blue)](https://review.gerrithub.io/q/project:Telecominfraproject/oopt-gnpy+is:open)
[![Contributors](https://img.shields.io/github/contributors-anon/Telecominfraproject/oopt-gnpy)](https://github.com/Telecominfraproject/oopt-gnpy/graphs/contributors)
[![Code Quality via LGTM.com](https://img.shields.io/lgtm/grade/python/github/Telecominfraproject/oopt-gnpy)](https://lgtm.com/projects/g/Telecominfraproject/oopt-gnpy/)
[![Code Coverage via codecov](https://img.shields.io/codecov/c/github/Telecominfraproject/oopt-gnpy)](https://codecov.io/gh/Telecominfraproject/oopt-gnpy)
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.3458319.svg)](https://doi.org/10.5281/zenodo.3458319)
[![Matrix chat](https://img.shields.io/matrix/oopt-gnpy:matrix.org)](https://matrix.to/#/%23oopt-gnpy%3Afoss.wtf?via=matrix.org&via=foss.wtf)
GNPy is an open-source, community-developed library for building route planning and optimization tools in real-world mesh optical networks.
We are a consortium of operators, vendors, and academic researchers sponsored via the [Telecom Infra Project](http://telecominfraproject.com)'s [OOPT/PSE](https://telecominfraproject.com/open-optical-packet-transport) working group.
@@ -26,4 +26,6 @@ This example demonstrates how GNPy can be used to check the expected SNR at the
![Running a simple simulation example](https://telecominfraproject.github.io/oopt-gnpy/docs/images/transmission_main_example.svg)
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/).
Learn more about this [in the documentation](https://gnpy.readthedocs.io/), or give it a [try online at `gnpy.app`](https://gnpy.app/):
[![Path propagation at gnpy.app](docs/images/2022-04-12-gnpy-app.png)](https://gnpy.app/)

View File

@@ -7,11 +7,12 @@ There are weekly calls about our progress.
Newcomers, users and telecom operators are especially welcome there.
We encourage all interested people outside the TIP to [join the project](https://telecominfraproject.com/apply-for-membership/) and especially to [get in touch with us](https://github.com/Telecominfraproject/oopt-gnpy/discussions).
(contributing)=
## Contributing
`gnpy` is looking for additional contributors, especially those with experience planning and maintaining large-scale, real-world mesh optical networks.
To get involved, please contact [Jan Kundrát](mailto:jan.kundrat@telecominfraproject.com) or [Gert Grammel](mailto:ggrammel@juniper.net).
To get involved, please contact [Jan Kundrát](mailto:jkt@jankundrat.com) or [Gert Grammel](mailto:ggrammel@juniper.net).
`gnpy` contributions are currently limited to members of [TIP](http://telecominfraproject.com).
Membership is free and open to all.

View File

@@ -29,7 +29,7 @@ This path is directional, and all "GNPy elements" along the path match the unidi
The network topology contains not just the physical topology of the network, but also references to the :ref:`equipment library<concepts-equipment>` and a set of *operating parameters* for each entity.
These parameters include the **fiber length** of each fiber, the connector **attenutation losses**, or an amplifier's specific **gain setting**.
The topology is specified via :ref:`XLS files<excel>` or via :ref:`JSON<json>`.
The topology is specified via :ref:`XLS files<excel>` or via :ref:`JSON<legacy-json>`.
.. _complete-vs-incomplete:

View File

@@ -190,3 +190,5 @@ autodoc_default_options = {
}
graphviz_output_format = 'svg'
bibtex_bibfiles = ['biblio.bib']

View File

@@ -4,7 +4,7 @@ Extending GNPy with vendor-specific data
========================================
GNPy ships with an :ref:`equipment library<concepts-equipment>` containing machine-readable datasheets of networking equipment.
Vendors who are willing to contribute descriptions of their supported products are encouraged to `submit a patch <https://review.gerrithub.io/Documentation/intro-gerrit-walkthrough-github.html>`__.
Vendors who are willing to contribute descriptions of their supported products are encouraged to `submit a patch <https://review.gerrithub.io/Documentation/intro-gerrit-walkthrough-github.html>`__ -- or just :ref:`get in touch with us directly<contributing>`.
This chapter discusses option for modeling performance of :ref:`EDFA amplifiers<extending-edfa>`, :ref:`Raman amplifiers<extending-raman>`, :ref:`transponders<extending-transponder>` and :ref:`ROADMs<extending-roadm>`.
@@ -29,7 +29,7 @@ The NF is expressed as a third-degree polynomial:
f(x) &= \text{a}x^3 + \text{b}x^2 + \text{c}x + \text{d}
\text{NF} &= f(G_\text{max} - G)
\text{NF} &= f(G - G_\text{max})
This model can be also used for fixed-gain fixed-NF amplifiers.
In that case, use:
@@ -100,10 +100,10 @@ Raman Amplifiers
An accurate simulation of Raman amplification requires knowledge of:
- the *power* and *wavelength* of all Raman pumping lasers,
- the *direction*, whether it is co-propagating or counter-propagating,
- the Raman efficiency of the fiber,
- the fiber temperature.
* the *power* and *wavelength* of all Raman pumping lasers,
* the *direction*, whether it is co-propagating or counter-propagating,
* the Raman efficiency of the fiber,
* the fiber temperature.
Under certain scenarios it is useful to be able to run a simulation without an accurate Raman description.
For these purposes, it is possible to approximate a Raman amplifier via a fixed-gain EDFA with the :ref:`polynomial NF<ext-nf-model-polynomial-NF>` model using :math:`\text{a} = \text{b} = \text{c} = 0`, and a desired effective :math:`\text{d} = NF`.

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

View File

@@ -10,7 +10,7 @@ fully-functional programs.
**Note**: *If you are a network operator or involved in route planning and
optimization for your organization, please contact project maintainer Jan
Kundrát <jan.kundrat@telecominfraproject.com>. gnpy is looking for users with
Kundrát <jkt@jankundrat.com>. gnpy is looking for users with
specific, delineated use cases to drive requirements for future
development.*

View File

@@ -1,4 +1,4 @@
.. _json:
.. _legacy-json:
JSON Input Files
================
@@ -44,7 +44,7 @@ For all amplifier models:
| ``type_variety`` | (string) | a unique name to ID the amplifier in the|
| | | JSON/Excel template topology input file |
+------------------------+-----------+-----------------------------------------+
| ``out_voa_auto`` | (boolean) | auto_design feature to optimize the |
| ``out_voa_auto`` | (boolean) | auto-design feature to optimize the |
| | | amplifier output VOA. If true, output |
| | | VOA is present and will be used to push |
| | | amplifier gain to its maximum, within |
@@ -73,13 +73,57 @@ The fiber library currently describes SSMF and NZDF but additional fiber types c
| ``dispersion_slope`` | (number) | In :math:`s \times m^{-1} \times m^{-1} |
| | | \times m^{-1}` |
+----------------------+-----------+------------------------------------------+
| ``gamma`` | (number) | :math:`2\pi\times n^2/(\lambda*A_{eff})`,|
| | | in :math:`w^{-1} \times m^{-1}`. |
| ``effective_area`` | (number) | Effective area of the fiber (not just |
| | | the MFD circle). This is the |
| | | :math:`A_{eff}`, see e.g., the |
| | | `Corning whitepaper on MFD/EA`_. |
| | | Specified in :math:`m^{2}`. |
+----------------------+-----------+------------------------------------------+
| ``gamma`` | (number) | Coefficient :math:`\gamma = 2\pi\times |
| | | n^2/(\lambda*A_{eff})`. |
| | | If not provided, this will be derived |
| | | from the ``effective_area`` |
| | | :math:`A_{eff}`. |
| | | In :math:`w^{-1} \times m^{-1}`. |
+----------------------+-----------+------------------------------------------+
| ``pmd_coef`` | (number) | Polarization mode dispersion (PMD) |
| | | coefficient. In |
| | | :math:`s\times\sqrt{m}^{-1}`. |
+----------------------+-----------+------------------------------------------+
| ``lumped_losses`` | (array) | Places along the fiber length with extra |
| | | losses. Specified as a loss in dB at |
| | | each relevant position (in km): |
| | | ``{"position": 10, "loss": 1.5}``) |
+----------------------+-----------+------------------------------------------+
.. _Corning whitepaper on MFD/EA: https://www.corning.com/microsites/coc/oem/documents/specialty-fiber/WP7071-Mode-Field-Diam-and-Eff-Area.pdf
RamanFiber
~~~~~~~~~~
The RamanFiber can be used to simulate Raman amplification through dedicated Raman pumps. The Raman pumps must be listed
in the key ``raman_pumps`` within the RamanFiber ``operational`` dictionary. The description of each Raman pump must
contain the following:
+---------------------------+-----------+------------------------------------------------------------+
| field | type | description |
+===========================+===========+============================================================+
| ``power`` | (number) | Total pump power in :math:`W` |
| | | considering a depolarized pump |
+---------------------------+-----------+------------------------------------------------------------+
| ``frequency`` | (number) | Pump central frequency in :math:`Hz` |
+---------------------------+-----------+------------------------------------------------------------+
| ``propagation_direction`` | (number) | The pumps can propagate in the same or opposite direction |
| | | with respect the signal. Valid choices are ``coprop`` and |
| | | ``counterprop``, respectively |
+---------------------------+-----------+------------------------------------------------------------+
Beside the list of Raman pumps, the RamanFiber ``operational`` dictionary must include the ``temperature`` that affects
the amplified spontaneous emission noise generated by the Raman amplification.
As the loss coefficient significantly varies outside the C-band, where the Raman pumps are usually placed,
it is suggested to include an estimation of the loss coefficient for the Raman pump central frequencies within
a dictionary-like definition of the ``RamanFiber.params.loss_coef``
(e.g. ``loss_coef = {"value": [0.18, 0.18, 0.20, 0.20], "frequency": [191e12, 196e12, 200e12, 210e12]}``).
Transceiver
~~~~~~~~~~~
@@ -132,36 +176,36 @@ ROADM
The user can only modify the value of existing parameters:
+--------------------------+-----------+---------------------------------------------+
| field | type | description |
+==========================+===========+=============================================+
| ``target_pch_out_db`` | (number) | Auto-design sets the ROADM egress channel |
| | | power. This reflects typical control loop |
| | | algorithms that adjust ROADM losses to |
| | | equalize channels (eg coming from different |
| | | ingress direction or add ports) |
| | | This is the default value |
| | | Roadm/params/target_pch_out_db if no value |
| | | is given in the ``Roadm`` element in the |
| | | topology input description. |
| | | This default value is ignored if a |
| | | params/target_pch_out_db value is input in |
| | | the topology for a given ROADM. |
+--------------------------+-----------+---------------------------------------------+
| ``add_drop_osnr`` | (number) | OSNR contribution from the add/drop ports |
+--------------------------+-----------+---------------------------------------------+
| ``pmd`` | (number) | Polarization mode dispersion (PMD). (s) |
+--------------------------+-----------+---------------------------------------------+
| ``restrictions`` | (dict of | If non-empty, keys ``preamp_variety_list`` |
| | strings) | and ``booster_variety_list`` represent |
| | | list of ``type_variety`` amplifiers which |
| | | are allowed for auto-design within ROADM's |
| | | line degrees. |
| | | |
| | | If no booster should be placed on a degree, |
| | | insert a ``Fused`` node on the degree |
| | | output. |
+--------------------------+-----------+---------------------------------------------+
+-------------------------------+-----------+----------------------------------------------------+
| field | type | description |
+===============================+===========+====================================================+
| ``target_pch_out_db`` | (number) | Default :ref:`equalization strategy<equalization>` |
| or | | for this ROADM type. |
| ``target_psd_out_mWperGHz`` | | |
| or | | Auto-design sets the ROADM egress channel |
| ``target_out_mWperSlotWidth`` | | power. This reflects typical control loop |
| (mutually exclusive) | | algorithms that adjust ROADM losses to |
| | | equalize channels (e.g., coming from |
| | | different ingress direction or add ports). |
| | | |
| | | These values are used as defaults when no |
| | | overrides are set per each ``Roadm`` |
| | | element in the network topology. |
+-------------------------------+-----------+----------------------------------------------------+
| ``add_drop_osnr`` | (number) | OSNR contribution from the add/drop ports |
+-------------------------------+-----------+----------------------------------------------------+
| ``pmd`` | (number) | Polarization mode dispersion (PMD). (s) |
+-------------------------------+-----------+----------------------------------------------------+
| ``restrictions`` | (dict of | If non-empty, keys ``preamp_variety_list`` |
| | strings) | and ``booster_variety_list`` represent |
| | | list of ``type_variety`` amplifiers which |
| | | are allowed for auto-design within ROADM's |
| | | line degrees. |
| | | |
| | | If no booster should be placed on a degree, |
| | | insert a ``Fused`` node on the degree |
| | | output. |
+-------------------------------+-----------+----------------------------------------------------+
Global parameters
-----------------
@@ -176,6 +220,64 @@ Only the EDFA that are marked ``'allowed_for_design': true`` are considered.
For amplifiers defined in the topology JSON input but whose ``gain = 0`` (placeholder), auto-design will set its gain automatically: see ``power_mode`` in the ``Spans`` library to find out how the gain is calculated.
The file ``sim_params.json`` contains the tuning parameters used within both the ``gnpy.science_utils.RamanSolver`` and
the ``gnpy.science_utils.NliSolver`` for the evaluation of the Raman profile and the NLI generation, respectively.
If amplifiers don't have settings, auto-design also sets amplifiers gain, output VOA and target powers according to [J. -L. Auge, V. Curri and E. Le Rouzic, Open Design for Multi-Vendor Optical Networks, OFC 2019](https://ieeexplore.ieee.org/document/8696699), equation 4.
See ``delta_power_range_db`` for more explaination.
+---------------------------------------------+-----------+---------------------------------------------+
| field | type | description |
+=============================================+===========+=============================================+
| ``raman_params.flag`` | (boolean) | Enable/Disable the Raman effect that |
| | | produces a power transfer from higher to |
| | | lower frequencies. |
| | | In general, considering the Raman effect |
| | | provides more accurate results. It is |
| | | mandatory when Raman amplification is |
| | | included in the simulation |
+---------------------------------------------+-----------+---------------------------------------------+
| ``raman_params.result_spatial_resolution`` | (number) | Spatial resolution of the output |
| | | Raman profile along the entire fiber span. |
| | | This affects the accuracy and the |
| | | computational time of the NLI |
| | | calculation when the GGN method is used: |
| | | smaller the spatial resolution higher both |
| | | the accuracy and the computational time. |
| | | In C-band simulations, with input power per |
| | | channel around 0 dBm, a suggested value of |
| | | spatial resolution is 10e3 m |
+---------------------------------------------+-----------+---------------------------------------------+
| ``raman_params.solver_spatial_resolution`` | (number) | Spatial step for the iterative solution |
| | | of the first order differential equation |
| | | used to calculate the Raman profile |
| | | along the entire fiber span. |
| | | This affects the accuracy and the |
| | | computational time of the evaluated |
| | | Raman profile: |
| | | smaller the spatial resolution higher both |
| | | the accuracy and the computational time. |
| | | In C-band simulations, with input power per |
| | | channel around 0 dBm, a suggested value of |
| | | spatial resolution is 100 m |
+---------------------------------------------+-----------+---------------------------------------------+
| ``nli_params.method`` | (string) | Model used for the NLI evaluation. Valid |
| | | choices are ``gn_model_analytic`` (see |
| | | eq. 120 from `arXiv:1209.0394 |
| | | <https://arxiv.org/abs/1209.0394>`_) and |
| | | ``ggn_spectrally_separated`` (see eq. 21 |
| | | from `arXiv:1710.02225 |
| | | <https://arxiv.org/abs/1710.02225>`_). |
+---------------------------------------------+-----------+---------------------------------------------+
| ``nli_params.computed_channels`` | (number) | The channels on which the NLI is |
| | | explicitly evaluated. |
| | | The NLI of the other channels is |
| | | interpolated using ``numpy.interp``. |
| | | In a C-band simulation with 96 channels in |
| | | a 50 GHz spacing fix-grid we recommend at |
| | | one computed channel every 20 channels. |
+---------------------------------------------+-----------+---------------------------------------------+
Span
~~~~
@@ -184,23 +286,27 @@ Span configuration is not a list (which may change in later releases) and the us
+-------------------------------------+-----------+---------------------------------------------+
| field | type | description |
+=====================================+===========+=============================================+
| ``power_mode`` | (boolean) | If false, gain mode. Auto-design sets |
| | | amplifier gain = preceding span loss, |
| | | unless the amplifier exists and its |
| | | gain > 0 in the topology input JSON. |
| | | If true, power mode (recommended for |
| | | auto-design and power sweep.) |
| | | Auto-design sets amplifier power |
| | | according to delta_power_range. If the |
| | | amplifier exists with gain > 0 in the |
| | | topology JSON input, then its gain is |
| | | translated into a power target/channel. |
| | | Moreover, when performing a power sweep |
| | | (see ``power_range_db`` in the SI |
| | | configuration library) the power sweep |
| | | is performed w/r/t this power target, |
| | | regardless of preceding amplifiers |
| | | power saturation/limitations. |
| ``power_mode`` | (boolean) | If false, **gain mode**. In the gain mode, |
| | | only gain settings are used for |
| | | propagation, and ``delta_p`` is ignored. |
| | | If no ``gain_target`` is set in an |
| | | amplifier, auto-design computes one |
| | | according to the ``delta_power_range`` |
| | | optimisation range. |
| | | The gain mode |
| | | is recommended if all the amplifiers |
| | | have already consistent gain settings in |
| | | the topology input file. |
| | | |
| | | If true, **power mode**. In the power mode, |
| | | only the ``delta_p`` is used for |
| | | propagation, and ``gain_target`` is |
| | | ignored. |
| | | The power mode is recommended for |
| | | auto-design and power sweep. |
| | | If no ``delta_p`` is set, |
| | | auto-design sets an amplifier power target |
| | | according to delta_power_range_db. |
+-------------------------------------+-----------+---------------------------------------------+
| ``delta_power_range_db`` | (number) | Auto-design only, power-mode |
| | | only. Specifies the [min, max, step] |
@@ -305,9 +411,9 @@ Span configuration is not a list (which may change in later releases) and the us
SpectralInformation
~~~~~~~~~~~~~~~~~~~
The user can only modify the value of existing parameters.
It defines a spectrum of N identical carriers.
While the code libraries allow for different carriers and power levels, the current user parametrization only allows one carrier type and one power/channel definition.
GNPy requires a description of all channels that are propagated through the network.
Flexgrid channel partitioning is available since the 2.7 release via the extra ``--spectrum`` option.
In the simplest case, homogeneous channel allocation can be defined via the ``SpectralInformation`` construct which defines a spectrum of N identical carriers:
+----------------------+-----------+-------------------------------------------+
| field | type | description |
@@ -328,11 +434,20 @@ While the code libraries allow for different carriers and power levels, the curr
+----------------------+-----------+-------------------------------------------+
| ``tx_osnr`` | (number) | In dB. OSNR out from transponder. |
+----------------------+-----------+-------------------------------------------+
| ``power_dbm`` | (number) | Reference channel power. In gain mode |
| | | (see spans/power_mode = false), all gain |
| | | settings are offset w/r/t this reference |
| | | power. In power mode, it is the |
| | | reference power for |
| ``power_dbm`` | (number) | Reference channel power, in dBm. |
| | | In gain mode |
| | | (see spans/power_mode = false), if no |
| | | gain is set in an amplifier, auto-design |
| | | sets gain to meet this reference |
| | | power. If amplifiers gain is set, |
| | | ``power_dbm`` is |
| | | ignored. |
| | | |
| | | In power mode, the ``power_dbm`` |
| | | is the reference power for |
| | | the ``delta_p`` settings in amplifiers. |
| | | It is also the reference power for |
| | | auto-design power optimisation range |
| | | Spans/delta_power_range_db. For example, |
| | | if delta_power_range_db = `[0,0,0]`, the |
| | | same power=power_dbm is launched in every |
@@ -340,12 +455,166 @@ While the code libraries allow for different carriers and power levels, the curr
| | | with the power_dbm value: even if a |
| | | power sweep is defined (see after) the |
| | | design is not repeated. |
| | | |
| | | If the ``--power`` CLI option is used, |
| | | its value replaces this parameter. |
+----------------------+-----------+-------------------------------------------+
| ``power_range_db`` | (number) | Power sweep excursion around power_dbm. |
| | | It is not the min and max channel power |
| | | values! The reference power becomes: |
| ``power_range_db`` | (number) | Power sweep excursion around |
| | | ``power_dbm``. |
| | | This defines a list of reference powers |
| | | to run the propagation, in the range |
| | | power_range_db + power_dbm. |
| | | Power sweep uses the ``delta_p`` targets |
| | | or, if they have not been set, the ones |
| | | computed by auto-design, regardless of |
| | | of preceding amplifiers' power |
| | | saturation. |
| | | |
| | | Power sweep is an easy way to find the |
| | | optimal reference power. |
| | | |
| | | Power sweep excursion is ignored in case |
| | | of gain mode. |
+----------------------+-----------+-------------------------------------------+
| ``sys_margins`` | (number) | In dB. Added margin on min required |
| | | transceiver OSNR. |
+----------------------+-----------+-------------------------------------------+
.. _mixed-rate:
Arbitrary channel definition
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Non-uniform channels are defined via a list of spectrum "partitions" which are defined in an extra JSON file via the ``--spectrum`` option.
In this approach, each partition is internally homogeneous, but different partitions might use different channel widths, power targets, modulation rates, etc.
+----------------------+-----------+-------------------------------------------+
| field | type | description |
+======================+===========+===========================================+
| ``f_min``, | (number) | In Hz. Mandatory. |
| ``f_max`` | | Define partition :math:`f_{min}` is |
| | | the first carrier central frequency |
| | | :math:`f_{max}` is the last one. |
| | | :math:`f_{min}` -:math:`f_{max}` |
| | | partitions must not overlap. |
| | | |
| | | Note that the meaning of ``f_min`` and |
| | | ``f_max`` is different than the one in |
| | | ``SpectralInformation``. |
+----------------------+-----------+-------------------------------------------+
| ``baud_rate`` | (number) | In Hz. Mandatory. Simulated baud rate. |
+----------------------+-----------+-------------------------------------------+
| ``slot_width`` | (number) | In Hz. Carrier spectrum occupation. |
| | | Carriers of this partition are spaced at |
| | | ``slot_width`` offsets. |
+----------------------+-----------+-------------------------------------------+
| ``roll_off`` | (number) | Pure number between 0 and 1. Mandatory |
| | | TX signal roll-off shape. Used by |
| | | Raman-aware simulation code. |
+----------------------+-----------+-------------------------------------------+
| ``tx_osnr`` | (number) | In dB. Optional. OSNR out from |
| | | transponder. Default value is 40 dB. |
+----------------------+-----------+-------------------------------------------+
| ``delta_pdb`` | (number) | In dB. Optional. Power offset compared to |
| | | the reference power used for design |
| | | (SI block in equipment library) to be |
| | | applied by ROADM to equalize the carriers |
| | | in this partition. Default value is 0 dB. |
+----------------------+-----------+-------------------------------------------+
For example this example:
.. code-block:: json
{
"SI":[
{
"f_min": 191.4e12,
"f_max":193.1e12,
"baud_rate": 32e9,
"slot_width": 50e9,
"roll_off": 0.15,
"tx_osnr": 40
},
{
"f_min": 193.1625e12,
"f_max":195e12,
"baud_rate": 64e9,
"delta_pdb": 3,
"slot_width": 75e9,
"roll_off": 0.15,
"tx_osnr": 40
}
]
}
...defines a spectrum split into two parts.
Carriers with central frequencies ranging from 191.4 THz to 193.1 THz will have 32 GBaud rate and will be spaced by 50 Ghz.
Carriers with central frequencies ranging from 193.1625 THz to 195 THz will have 64 GBaud rate and will be spaced by 75 GHz with 3 dB power offset.
If the SI reference carrier is set to ``power_dbm`` = 0dBm, and the ROADM has ``target_pch_out_db`` set to -20 dBm, then all channels ranging from 191.4 THz to 193.1 THz will have their power equalized to -20 + 0 dBm (due to the 0 dB power offset).
All channels ranging from 193.1625 THz to 195 THz will have their power equalized to -20 + 3 = -17 dBm (total power signal + noise).
Note that first carrier of the second partition has center frequency 193.1625 THz (its spectrum occupation ranges from 193.125 THz to 193.2 THz).
The last carrier of the second partition has center frequency 193.1 THz and spectrum occupation ranges from 193.075 THz to 193.125 THz.
There is no overlap of the occupation and both share the same boundary.
.. _equalization:
Equalization choices
~~~~~~~~~~~~~~~~~~~~
ROADMs typically equalize the optical power across multiple channels using one of the available equalization strategies — either targeting a specific output power, or a specific power spectral density (PSD), or a spectfic power spectral density using slot_width as spectrum width reference (PSW).
All of these strategies can be adjusted by a per-channel power offset.
The equalization strategy can be defined globally per a ROADM model, or per each ROADM instance in the topology, and within a ROADM also on a per-degree basis.
Let's consider some example for the equalization. Suppose that the types of signal to be propagated are the following:
.. code-block:: json
{
"baud_rate": 32e9,
"f_min":191.3e12,
"f_max":192.3e12,
"spacing": 50e9,
"label": 1
},
{
"baud_rate": 64e9,
"f_min":193.3e12,
"f_max":194.3e12,
"spacing": 75e9,
"label": 2
}
with the PSD equalization in a ROADM:
.. code-block:: json
{
"uid": "roadm A",
"type": "Roadm",
"params": {
"target_psd_out_mWperGHz": 3.125e-4,
}
},
This means that power out of the ROADM will be computed as 3.125e-4 * 32 = 0.01 mW ie -20 dBm for label 1 types of carriers
and 3.125e4 * 64 = 0.02 mW ie -16.99 dBm for label2 channels. So a ratio of ~ 3 dB between target powers for these carriers.
With the PSW equalization:
.. code-block:: json
{
"uid": "roadm A",
"type": "Roadm",
"params": {
"target_out_mWperSlotWidth": 2.0e-4,
}
},
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.

View File

@@ -145,4 +145,4 @@ Raman Scattering in order to give a proper estimation for all channels
:cite:`cantono2018modeling`. This will be the main upgrade required within the
PSE framework.
.. bibliography:: biblio.bib
.. bibliography::

View File

@@ -1,7 +1,7 @@
alabaster>=0.7.12,<1
docutils>=0.15.2,<1
myst-parser>=0.14.0,<1
Pygments>=2.7.4,<3
docutils>=0.17.1,<1
myst-parser>=0.16.1,<1
Pygments>=2.11.2,<3
rstcheck
Sphinx>=3.5.0,<4
sphinxcontrib-bibtex>=0.4.2,<1
Sphinx>=4.4.0,<5
sphinxcontrib-bibtex>=2.4.1,<3

View File

@@ -20,13 +20,20 @@ unique identifier and a printable name, and provide the :py:meth:`__call__` meth
instance as a result.
"""
from numpy import abs, arange, array, divide, errstate, ones, interp, mean, pi, polyfit, polyval, sum, sqrt
from numpy import abs, array, errstate, ones, interp, mean, pi, polyfit, polyval, sum, sqrt, log10, exp, asarray, full,\
squeeze, zeros, append, flip, outer, ndarray
from scipy.constants import h, c
from scipy.interpolate import interp1d
from collections import namedtuple
from typing import Union
from gnpy.core.utils import lin2db, db2lin, arrange_frequencies, snr_sum
from gnpy.core.parameters import FiberParams, PumpParams
from gnpy.core.science_utils import NliSolver, RamanSolver, propagate_raman_fiber, _psi
from gnpy.core.utils import lin2db, db2lin, arrange_frequencies, snr_sum, per_label_average, pretty_summary_print, \
watt2dbm, psd2powerdbm
from gnpy.core.parameters import RoadmParams, FusedParams, FiberParams, PumpParams, EdfaParams, EdfaOperational
from gnpy.core.science_utils import NliSolver, RamanSolver
from gnpy.core.info import SpectralInformation, ReferenceCarrier
from gnpy.core.exceptions import NetworkTopologyError, SpectrumError, ParametersError
class Location(namedtuple('Location', 'latitude longitude city region')):
@@ -79,32 +86,49 @@ class Transceiver(_Node):
self.baud_rate = None
self.chromatic_dispersion = None
self.pmd = None
self.pdl = None
self.penalties = {}
self.total_penalty = 0
self.propagated_labels = [""]
def _calc_cd(self, spectral_info):
""" Updates the Transceiver property with the CD of the received channels. CD in ps/nm.
"""
self.chromatic_dispersion = [carrier.chromatic_dispersion * 1e3 for carrier in spectral_info.carriers]
self.chromatic_dispersion = spectral_info.chromatic_dispersion * 1e3
def _calc_pmd(self, spectral_info):
"""Updates the Transceiver property with the PMD of the received channels. PMD in ps.
"""
self.pmd = [carrier.pmd*1e12 for carrier in spectral_info.carriers]
self.pmd = spectral_info.pmd * 1e12
def _calc_pdl(self, spectral_info):
"""Updates the Transceiver property with the PDL of the received channels. PDL in dB.
"""
self.pdl = spectral_info.pdl
def _calc_penalty(self, impairment_value, boundary_list):
return interp(impairment_value, boundary_list['up_to_boundary'], boundary_list['penalty_value'],
left=float('inf'), right=float('inf'))
def calc_penalties(self, penalties):
"""Updates the Transceiver property with penalties (CD, PMD, etc.) of the received channels in dB.
Penalties are linearly interpolated between given points and set to 'inf' outside interval.
"""
self.penalties = {impairment: self._calc_penalty(getattr(self, impairment), boundary_list)
for impairment, boundary_list in penalties.items()}
self.total_penalty = sum(list(self.penalties.values()), axis=0)
def _calc_snr(self, spectral_info):
with errstate(divide='ignore'):
self.baud_rate = [c.baud_rate for c in spectral_info.carriers]
ratio_01nm = [lin2db(12.5e9 / b_rate) for b_rate in self.baud_rate]
self.propagated_labels = spectral_info.label
self.baud_rate = spectral_info.baud_rate
ratio_01nm = lin2db(12.5e9 / self.baud_rate)
# set raw values to record original calculation, before update_snr()
self.raw_osnr_ase = [lin2db(divide(c.power.signal, c.power.ase))
for c in spectral_info.carriers]
self.raw_osnr_ase_01nm = [ase - ratio for ase, ratio
in zip(self.raw_osnr_ase, ratio_01nm)]
self.raw_osnr_nli = [lin2db(divide(c.power.signal, c.power.nli))
for c in spectral_info.carriers]
self.raw_snr = [lin2db(divide(c.power.signal, c.power.nli + c.power.ase))
for c in spectral_info.carriers]
self.raw_snr_01nm = [snr - ratio for snr, ratio
in zip(self.raw_snr, ratio_01nm)]
self.raw_osnr_ase = lin2db(spectral_info.signal / spectral_info.ase)
self.raw_osnr_ase_01nm = self.raw_osnr_ase - ratio_01nm
self.raw_osnr_nli = lin2db(spectral_info.signal / spectral_info.nli)
self.raw_snr = lin2db(spectral_info.signal / (spectral_info.ase + spectral_info.nli))
self.raw_snr_01nm = self.raw_snr - ratio_01nm
self.osnr_ase = self.raw_osnr_ase
self.osnr_ase_01nm = self.raw_osnr_ase_01nm
@@ -124,14 +148,10 @@ class Transceiver(_Node):
for s in args:
snr_added += db2lin(-s)
snr_added = -lin2db(snr_added)
self.osnr_ase = list(map(lambda x, y: snr_sum(x, y, snr_added),
self.raw_osnr_ase, self.baud_rate))
self.snr = list(map(lambda x, y: snr_sum(x, y, snr_added),
self.raw_snr, self.baud_rate))
self.osnr_ase_01nm = list(map(lambda x: snr_sum(x, 12.5e9, snr_added),
self.raw_osnr_ase_01nm))
self.snr_01nm = list(map(lambda x: snr_sum(x, 12.5e9, snr_added),
self.raw_snr_01nm))
self.osnr_ase = snr_sum(self.raw_osnr_ase, self.baud_rate, snr_added)
self.snr = snr_sum(self.raw_snr, self.baud_rate, snr_added)
self.osnr_ase_01nm = snr_sum(self.raw_osnr_ase_01nm, 12.5e9, snr_added)
self.snr_01nm = snr_sum(self.raw_snr_01nm, 12.5e9, snr_added)
@property
def to_json(self):
@@ -150,117 +170,245 @@ class Transceiver(_Node):
f'osnr_nli={self.osnr_nli!r}, '
f'snr={self.snr!r}, '
f'chromatic_dispersion={self.chromatic_dispersion!r}, '
f'pmd={self.pmd!r})')
f'pmd={self.pmd!r}, '
f'pdl={self.pdl!r}, '
f'penalties={self.penalties!r})')
def __str__(self):
if self.snr is None or self.osnr_ase is None:
return f'{type(self).__name__} {self.uid}'
snr = round(mean(self.snr), 2)
osnr_ase = round(mean(self.osnr_ase), 2)
osnr_ase_01nm = round(mean(self.osnr_ase_01nm), 2)
snr_01nm = round(mean(self.snr_01nm), 2)
snr = per_label_average(self.snr, 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)
snr_01nm = per_label_average(self.snr_01nm, self.propagated_labels)
cd = mean(self.chromatic_dispersion)
pmd = mean(self.pmd)
pdl = mean(self.pdl)
return '\n'.join([f'{type(self).__name__} {self.uid}',
result = '\n'.join([f'{type(self).__name__} {self.uid}',
f' GSNR (0.1nm, dB): {pretty_summary_print(snr_01nm)}',
f' GSNR (signal bw, dB): {pretty_summary_print(snr)}',
f' OSNR ASE (0.1nm, dB): {pretty_summary_print(osnr_ase_01nm)}',
f' OSNR ASE (signal bw, dB): {pretty_summary_print(osnr_ase)}',
f' CD (ps/nm): {cd:.2f}',
f' PMD (ps): {pmd:.2f}',
f' PDL (dB): {pdl:.2f}'])
f' GSNR (0.1nm, dB): {snr_01nm:.2f}',
f' GSNR (signal bw, dB): {snr:.2f}',
f' OSNR ASE (0.1nm, dB): {osnr_ase_01nm:.2f}',
f' OSNR ASE (signal bw, dB): {osnr_ase:.2f}',
f' CD (ps/nm): {cd:.2f}',
f' PMD (ps): {pmd:.2f}'])
cd_penalty = self.penalties.get('chromatic_dispersion')
if cd_penalty is not None:
result += f'\n CD penalty (dB): {mean(cd_penalty):.2f}'
pmd_penalty = self.penalties.get('pmd')
if pmd_penalty is not None:
result += f'\n PMD penalty (dB): {mean(pmd_penalty):.2f}'
pdl_penalty = self.penalties.get('pdl')
if pdl_penalty is not None:
result += f'\n PDL penalty (dB): {mean(pdl_penalty):.2f}'
return result
def __call__(self, spectral_info):
self._calc_snr(spectral_info)
self._calc_cd(spectral_info)
self._calc_pmd(spectral_info)
self._calc_pdl(spectral_info)
return spectral_info
RoadmParams = namedtuple('RoadmParams', 'target_pch_out_db add_drop_osnr pmd restrictions per_degree_pch_out_db')
class Roadm(_Node):
def __init__(self, *args, params, **kwargs):
if 'per_degree_pch_out_db' not in params.keys():
params['per_degree_pch_out_db'] = {}
super().__init__(*args, params=RoadmParams(**params), **kwargs)
def __init__(self, *args, params=None, **kwargs):
if not params:
params = {}
try:
super().__init__(*args, params=RoadmParams(**params), **kwargs)
except ParametersError as e:
raise ParametersError(f'Config error in {kwargs["uid"]}: {e}') from e
# Target output power for the reference carrier, can only be computed on the fly, because it depends
# on the path, since it depends on the equalization definition on the degree.
self.ref_pch_out_dbm = None
self.loss = 0 # auto-design interest
self.effective_loss = None
self.effective_pch_out_db = self.params.target_pch_out_db
# 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.
self.ref_effective_loss = None
self.passive = True
self.restrictions = self.params.restrictions
self.per_degree_pch_out_db = self.params.per_degree_pch_out_db
self.propagated_labels = [""]
# element contains the two types of equalisation parameters, but only one is not None or empty
# target for equalization for the ROADM only one must be not None
self.target_pch_out_dbm = self.params.target_pch_out_db
self.target_psd_out_mWperGHz = self.params.target_psd_out_mWperGHz
self.target_out_mWperSlotWidth = self.params.target_out_mWperSlotWidth
self.per_degree_pch_out_dbm = self.params.per_degree_pch_out_db
self.per_degree_pch_psd = self.params.per_degree_pch_psd
self.per_degree_pch_psw = self.params.per_degree_pch_psw
@property
def to_json(self):
return {'uid': self.uid,
'type': type(self).__name__,
'params': {
'target_pch_out_db': self.effective_pch_out_db,
'restrictions': self.restrictions,
'per_degree_pch_out_db': self.per_degree_pch_out_db
},
'metadata': {
'location': self.metadata['location']._asdict()
}
}
if self.target_pch_out_dbm is not None:
equalisation, value = 'target_pch_out_db', self.target_pch_out_dbm
elif self.target_psd_out_mWperGHz is not None:
equalisation, value = 'target_psd_out_mWperGHz', self.target_psd_out_mWperGHz
elif self.target_out_mWperSlotWidth is not None:
equalisation, value = 'target_out_mWperSlotWidth', self.target_out_mWperSlotWidth
else:
assert False, 'There must be one default equalization defined in ROADM'
to_json = {
'uid': self.uid,
'type': type(self).__name__,
'params': {
equalisation: value,
'restrictions': self.restrictions,
},
'metadata': {
'location': self.metadata['location']._asdict()
}
}
# several per_degree equalization may coexist on different degrees
if self.per_degree_pch_out_dbm:
to_json['params']['per_degree_pch_out_db'] = self.per_degree_pch_out_dbm
if self.per_degree_pch_psd:
to_json['params']['per_degree_psd_out_mWperGHz'] = self.per_degree_pch_psd
if self.per_degree_pch_psw:
to_json['params']['per_degree_psd_out_mWperSlotWidth'] = self.per_degree_pch_psw
return to_json
def __repr__(self):
return f'{type(self).__name__}(uid={self.uid!r}, loss={self.loss!r})'
def __str__(self):
if self.effective_loss is None:
if self.ref_effective_loss is None:
return f'{type(self).__name__} {self.uid}'
total_pch = pretty_summary_print(per_label_average(self.pch_out_dbm, self.propagated_labels))
return '\n'.join([f'{type(self).__name__} {self.uid}',
f' effective loss (dB): {self.effective_loss:.2f}',
f' pch out (dBm): {self.effective_pch_out_db:.2f}'])
f' effective loss (dB): {self.ref_effective_loss:.2f}',
f' reference pch out (dBm): {self.ref_pch_out_dbm:.2f}',
f' actual pch out (dBm): {total_pch}'])
def propagate(self, pref, *carriers, degree):
# pin_target and loss are read from eqpt_config.json['Roadm']
# all ingress channels in xpress are set to this power level
# but add channels are not, so we define an effective loss
# in the case of add channels
# find the target power on this degree:
# if a target power has been defined for this degree use it else use the global one.
# if the input power is lower than the target one, use the input power instead because
# a ROADM doesn't amplify, it can only attenuate
def get_roadm_target_power(self, ref_carrier: ReferenceCarrier = None,
spectral_info: SpectralInformation = None) -> Union[float, ndarray]:
"""Computes the power in dBm for a reference carrier or for a spectral information.
power is computed based on equalization target.
if spectral_info baud_rate is baud_rate = [32e9, 42e9, 64e9, 42e9, 32e9], and
target_pch_out_dbm is defined to -20 dbm, then the function returns an array of powers
[-20, -20, -20, -20, -20]
if target_psd_out_mWperGHz is defined instead with 3.125e-4mW/GHz then it returns
[-20, -18.819, -16.9897, -18.819, -20]
if instead a reference_baud_rate is defined, the functions computes the result for a
single reference carrier whose baud_rate is reference_baudrate
"""
if spectral_info:
if self.target_pch_out_dbm is not None:
return full(len(spectral_info.channel_number), self.target_pch_out_dbm)
if self.target_psd_out_mWperGHz is not None:
return psd2powerdbm(self.target_psd_out_mWperGHz, spectral_info.baud_rate)
if self.target_out_mWperSlotWidth is not None:
return psd2powerdbm(self.target_out_mWperSlotWidth, spectral_info.slot_width)
else:
if self.target_pch_out_dbm is not None:
return self.target_pch_out_dbm
if self.target_psd_out_mWperGHz is not None:
return psd2powerdbm(self.target_psd_out_mWperGHz, ref_carrier.baud_rate)
if self.target_out_mWperSlotWidth is not None:
return psd2powerdbm(self.target_out_mWperSlotWidth, ref_carrier.slot_width)
return None
def get_per_degree_ref_power(self, degree, ref_carrier):
"""Get the target power in dBm out of ROADM degree for the reference bandwidth
If no equalization is defined on this degree use the ROADM level one.
"""
if degree in self.per_degree_pch_out_dbm:
return self.per_degree_pch_out_dbm[degree]
elif degree in self.per_degree_pch_psd:
return psd2powerdbm(self.per_degree_pch_psd[degree], ref_carrier.baud_rate)
elif degree in self.per_degree_pch_psw:
return psd2powerdbm(self.per_degree_pch_psw[degree], ref_carrier.slot_width)
return self.get_roadm_target_power(ref_carrier)
def get_per_degree_power(self, degree, spectral_info):
"""Get the target power in dBm out of ROADM degree for the spectral information
If no equalization is defined on this degree use the ROADM level one.
"""
if degree in self.per_degree_pch_out_dbm:
return self.per_degree_pch_out_dbm[degree]
elif degree in self.per_degree_pch_psd:
return psd2powerdbm(self.per_degree_pch_psd[degree], spectral_info.baud_rate)
return self.get_roadm_target_power(spectral_info=spectral_info)
def propagate(self, spectral_info, degree):
"""Equalization targets are read from topology file if defined and completed with default
definition of the library.
If the input power is lower than the target one, use the input power instead 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
propagates operates with spectral info carriers all having the same source or destination.
"""
# TODO maybe add a minimum loss for the ROADM
per_degree_pch = self.per_degree_pch_out_db[degree] if degree in self.per_degree_pch_out_db.keys() else self.params.target_pch_out_db
self.effective_pch_out_db = min(pref.p_spani, per_degree_pch)
self.effective_loss = pref.p_spani - self.effective_pch_out_db
carriers_power = array([c.power.signal + c.power.nli + c.power.ase for c in carriers])
carriers_att = list(map(lambda x: lin2db(x * 1e3) - per_degree_pch, carriers_power))
exceeding_att = -min(list(filter(lambda x: x < 0, carriers_att)), default=0)
carriers_att = list(map(lambda x: db2lin(x + exceeding_att), carriers_att))
for carrier_att, carrier in zip(carriers_att, carriers):
pwr = carrier.power
pwr = pwr._replace(signal=pwr.signal / carrier_att,
nli=pwr.nli / carrier_att,
ase=pwr.ase / carrier_att)
pmd = sqrt(carrier.pmd**2 + self.params.pmd**2)
yield carrier._replace(power=pwr, pmd=pmd)
def update_pref(self, pref):
return pref._replace(p_span0=pref.p_span0, p_spani=self.effective_pch_out_db)
# find the target power for the reference carrier
ref_per_degree_pch = self.get_per_degree_ref_power(degree, spectral_info.pref.ref_carrier)
# find the target powers for each signal carrier
per_degree_pch = self.get_per_degree_power(degree, spectral_info=spectral_info)
# Definition of ref_pch_out_dbm for the reference channel:
# Depending on propagation upstream from this ROADM, the input power (p_spani) might be smaller than
# 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.
# (TODO add a minimum loss for the ROADM crossing)
self.ref_pch_out_dbm = min(spectral_info.pref.p_spani, ref_per_degree_pch)
# Definition of effective_loss:
# 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.
self.ref_effective_loss = spectral_info.pref.p_spani - self.ref_pch_out_dbm
input_power = spectral_info.signal + spectral_info.nli + spectral_info.ase
target_power_per_channel = per_degree_pch + spectral_info.delta_pdb_per_channel
# Computation of the per channel target power according to equalization policy
# 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:
# freq1: 1dB, freq2: 3dB, freq3: -3dB, and target is -20dBm out of the ROADM,
# then the target power for each channel uses the specified delta_pdb_per_channel.
# target_power_per_channel[f1, f2, f3] = -19, -17, -23
# However if input_signal = -23, -16, -26, then the target can not be applied, because
# -23 < -19dBm and -26 < -23dBm. Then the target is only applied to signals whose power is above the
# threshold. others are left unchanged and unequalized.
# the new target is [-23, -17, -26]
# and the attenuation to apply is [-23, -16, -26] - [-23, -17, -26] = [0, 1, 0]
# note that this changes the previous behaviour that equalized all identical channels based on the one
# that had the min power.
# 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
correction = (abs(watt2dbm(input_power) - target_power_per_channel)
- (watt2dbm(input_power) - target_power_per_channel)) / 2
new_target = target_power_per_channel - correction
delta_power = watt2dbm(input_power) - new_target
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)
self.pch_out_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase)
self.propagated_labels = spectral_info.label
def update_pref(self, spectral_info):
"""Update Reference power
This modifies the spectral info in-place. Only the `pref` is updated with new p_spani,
while p_span0 is not changed.
"""
spectral_info.pref = spectral_info.pref._replace(p_spani=self.ref_pch_out_dbm)
def __call__(self, spectral_info, degree):
carriers = tuple(self.propagate(spectral_info.pref, *spectral_info.carriers, degree=degree))
pref = self.update_pref(spectral_info.pref)
return spectral_info._replace(carriers=carriers, pref=pref)
FusedParams = namedtuple('FusedParams', 'loss')
self.propagate(spectral_info, degree=degree)
self.update_pref(spectral_info)
return spectral_info
class Fused(_Node):
def __init__(self, *args, params=None, **kwargs):
if params is None:
# default loss value if not mentioned in loaded network json
params = {'loss': 1}
if not params:
params = {}
super().__init__(*args, params=FusedParams(**params), **kwargs)
self.loss = self.params.loss
self.passive = True
@@ -284,23 +432,17 @@ class Fused(_Node):
return '\n'.join([f'{type(self).__name__} {self.uid}',
f' loss (dB): {self.loss:.2f}'])
def propagate(self, *carriers):
attenuation = db2lin(self.loss)
def propagate(self, spectral_info):
spectral_info.apply_attenuation_db(self.loss)
for carrier in carriers:
pwr = carrier.power
pwr = pwr._replace(signal=pwr.signal / attenuation,
nli=pwr.nli / attenuation,
ase=pwr.ase / attenuation)
yield carrier._replace(power=pwr)
def update_pref(self, pref):
return pref._replace(p_span0=pref.p_span0, p_spani=pref.p_spani - self.loss)
def update_pref(self, spectral_info):
spectral_info.pref = spectral_info.pref._replace(p_span0=spectral_info.pref.p_span0,
p_spani=spectral_info.pref.p_spani - self.loss)
def __call__(self, spectral_info):
carriers = tuple(self.propagate(*spectral_info.carriers))
pref = self.update_pref(spectral_info.pref)
return spectral_info._replace(carriers=carriers, pref=pref)
self.propagate(spectral_info)
self.update_pref(spectral_info)
return spectral_info
class Fiber(_Node):
@@ -309,7 +451,28 @@ class Fiber(_Node):
params = {}
super().__init__(*args, params=FiberParams(**params), **kwargs)
self.pch_out_db = None
self.nli_solver = NliSolver(self)
self.passive = True
self.propagated_labels = [""]
# Raman efficiency matrix function of the delta frequency constructed such that each row is related to a
# fixed frequency: positive elements represent a gain (from higher frequency) and negative elements represent
# a loss (to lower frequency)
if self.params.raman_efficiency:
frequency_offset = self.params.raman_efficiency['frequency_offset']
frequency_offset = append(-flip(frequency_offset[1:]), frequency_offset)
cr = self.params.raman_efficiency['cr']
cr = append(- flip(cr[1:]), cr)
self._cr_function = lambda frequency: interp(frequency, frequency_offset, cr)
else:
self._cr_function = lambda frequency: zeros(squeeze(frequency).shape)
# Lumped losses
z_lumped_losses = array([lumped['position'] for lumped in self.params.lumped_losses]) # km
lumped_losses_power = array([lumped['loss'] for lumped in self.params.lumped_losses]) # dB
if not ((z_lumped_losses > 0) * (z_lumped_losses < 1e-3 * self.params.length)).all():
raise NetworkTopologyError("Lumped loss positions must be between 0 and the fiber length "
f"({1e-3 * self.params.length} km), boundaries excluded.")
self.lumped_losses = db2lin(- lumped_losses_power) # [linear units]
self.z_lumped_losses = array(z_lumped_losses) * 1e3 # [m]
@property
def to_json(self):
@@ -319,7 +482,7 @@ class Fiber(_Node):
'params': {
# have to specify each because namedtupple cannot be updated :(
'length': round(self.params.length * 1e-3, 6),
'loss_coef': self.params.loss_coef * 1e3,
'loss_coef': round(self.params.loss_coef * 1e3, 6),
'length_units': 'km',
'att_in': self.params.att_in,
'con_in': self.params.con_in,
@@ -339,6 +502,7 @@ class Fiber(_Node):
if self.pch_out_db is None:
return f'{type(self).__name__} {self.uid}'
total_pch = pretty_summary_print(per_label_average(self.pch_out_dbm, self.propagated_labels))
return '\n'.join([f'{type(self).__name__} {self.uid}',
f' type_variety: {self.type_variety}',
f' length (km): {self.params.length * 1e-3:.2f}',
@@ -346,45 +510,59 @@ class Fiber(_Node):
f' total loss (dB): {self.loss:.2f}',
f' (includes conn loss (dB) in: {self.params.con_in:.2f} out: {self.params.con_out:.2f})',
f' (conn loss out includes EOL margin defined in eqpt_config.json)',
f' pch out (dBm): {self.pch_out_db:.2f}'])
f' reference pch out (dBm): {self.pch_out_db:.2f}',
f' actual pch out (dBm): {total_pch}'])
def loss_coef_func(self, frequency):
frequency = asarray(frequency)
if self.params.loss_coef.size > 1:
try:
loss_coef = interp1d(self.params.f_loss_ref, self.params.loss_coef)(frequency)
except ValueError:
raise SpectrumError('The spectrum bandwidth exceeds the frequency interval used to define the fiber '
f'loss coefficient in "{type(self).__name__} {self.uid}".'
f'\nSpectrum f_min-f_max: {round(frequency[0]*1e-12,2)}-'
f'{round(frequency[-1]*1e-12,2)}'
f'\nLoss coefficient f_min-f_max: {round(self.params.f_loss_ref[0]*1e-12,2)}-'
f'{round(self.params.f_loss_ref[-1]*1e-12,2)}')
else:
loss_coef = full(frequency.size, self.params.loss_coef)
return squeeze(loss_coef)
@property
def loss(self):
"""total loss including padding att_in: useful for polymorphism with roadm loss"""
return self.params.loss_coef * self.params.length + self.params.con_in + self.params.con_out + self.params.att_in
return self.loss_coef_func(self.params.ref_frequency) * self.params.length + \
self.params.con_in + self.params.con_out + self.params.att_in
@property
def passive(self):
return True
def alpha(self, frequency):
"""Returns the linear exponent attenuation coefficient such that
:math: `lin_attenuation = e^{- alpha length}`
def alpha(self, frequencies):
"""It returns the values of the series expansion of attenuation coefficient alpha(f) for all f in frequencies
:param frequencies: frequencies of series expansion [Hz]
:return: alpha: power attenuation coefficient for f in frequencies [Neper/m]
:param frequency: the frequency at which alpha is computed [Hz]
:return: alpha: power attenuation coefficient for f in frequency [Neper/m]
"""
if type(self.params.loss_coef) == dict:
alpha = interp(frequencies, self.params.f_loss_ref, self.params.lin_loss_exp)
else:
alpha = self.params.lin_loss_exp * ones(frequencies.shape)
return self.loss_coef_func(frequency) / (10 * log10(exp(1)))
return alpha
def cr(self, frequency):
"""Returns the raman efficiency matrix including the vibrational loss
def alpha0(self, f_ref=193.5e12):
"""It returns the zero element of the series expansion of attenuation coefficient alpha(f) in the
reference frequency f_ref
:param f_ref: reference frequency of series expansion [Hz]
:return: alpha0: power attenuation coefficient in f_ref [Neper/m]
:param frequency: the frequency at which cr is computed [Hz]
:return: cr: raman efficiency matrix [1 / (W m)]
"""
return self.alpha(f_ref * ones(1))[0]
df = outer(ones(frequency.shape), frequency) - outer(frequency, ones(frequency.shape))
cr = self._cr_function(df)
vibrational_loss = outer(frequency, ones(frequency.shape)) / outer(ones(frequency.shape), frequency)
return cr * (cr >= 0) + cr * (cr < 0) * vibrational_loss # Raman efficiency [1/(W m)]
def chromatic_dispersion(self, freq=193.5e12):
def chromatic_dispersion(self, freq=None):
"""Returns accumulated chromatic dispersion (CD).
:param freq: the frequency at which the chromatic dispersion is computed
:return: chromatic dispersion: the accumulated dispersion [s/m]
"""
freq = self.params.ref_frequency if freq is None else freq
beta2 = self.params.beta2
beta3 = self.params.beta3
ref_f = self.params.ref_frequency
@@ -398,147 +576,107 @@ class Fiber(_Node):
"""differential group delay (PMD) [s]"""
return self.params.pmd_coef * sqrt(self.params.length)
def _gn_analytic(self, carrier, *carriers):
r"""Computes the nonlinear interference power on a single carrier.
The method uses eq. 120 from `arXiv:1209.0394 <https://arxiv.org/abs/1209.0394>`__.
:param carrier: the signal under analysis
:param \*carriers: the full WDM comb
:return: carrier_nli: the amount of nonlinear interference in W on the under analysis
def propagate(self, spectral_info: SpectralInformation):
"""Modifies the spectral information computing the attenuation, the non-linear interference generation,
the CD and PMD accumulation.
"""
# apply the attenuation due to the input connector loss
attenuation_in_db = self.params.con_in + self.params.att_in
spectral_info.apply_attenuation_db(attenuation_in_db)
g_nli = 0
for interfering_carrier in carriers:
psi = _psi(carrier, interfering_carrier, beta2=self.params.beta2,
asymptotic_length=self.params.asymptotic_length)
g_nli += (interfering_carrier.power.signal / interfering_carrier.baud_rate)**2 \
* (carrier.power.signal / carrier.baud_rate) * psi
# inter channels Raman effect
stimulated_raman_scattering = RamanSolver.calculate_stimulated_raman_scattering(spectral_info, self)
g_nli *= (16 / 27) * (self.params.gamma * self.params.effective_length)**2 \
/ (2 * pi * abs(self.params.beta2) * self.params.asymptotic_length)
# NLI noise evaluated at the fiber input
spectral_info.nli += NliSolver.compute_nli(spectral_info, stimulated_raman_scattering, self)
carrier_nli = carrier.baud_rate * g_nli
return carrier_nli
# chromatic dispersion and pmd variations
spectral_info.chromatic_dispersion += self.chromatic_dispersion(spectral_info.frequency)
spectral_info.pmd = sqrt(spectral_info.pmd ** 2 + self.pmd ** 2)
def propagate(self, *carriers):
r"""Generator that computes the fiber propagation: attenuation, non-linear interference generation, CD
accumulation and PMD accumulation.
# apply the attenuation due to the fiber losses
attenuation_fiber = stimulated_raman_scattering.loss_profile[:, -1]
spectral_info.apply_attenuation_lin(attenuation_fiber)
:param: \*carriers: the channels at the input of the fiber
:yield: carrier: the next channel at the output of the fiber
"""
# apply the attenuation due to the output connector loss
attenuation_out_db = self.params.con_out
spectral_info.apply_attenuation_db(attenuation_out_db)
self.pch_out_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase)
self.propagated_labels = spectral_info.label
# apply connector_att_in on all carriers before computing gn analytics premiere partie pas bonne
attenuation = db2lin(self.params.con_in + self.params.att_in)
chan = []
for carrier in carriers:
pwr = carrier.power
pwr = pwr._replace(signal=pwr.signal / attenuation,
nli=pwr.nli / attenuation,
ase=pwr.ase / attenuation)
carrier = carrier._replace(power=pwr)
chan.append(carrier)
carriers = tuple(f for f in chan)
# propagate in the fiber and apply attenuation out
attenuation = db2lin(self.params.con_out)
for carrier in carriers:
pwr = carrier.power
carrier_nli = self._gn_analytic(carrier, *carriers)
pwr = pwr._replace(signal=pwr.signal / self.params.lin_attenuation / attenuation,
nli=(pwr.nli + carrier_nli) / self.params.lin_attenuation / attenuation,
ase=pwr.ase / self.params.lin_attenuation / attenuation)
chromatic_dispersion = carrier.chromatic_dispersion + self.chromatic_dispersion(carrier.frequency)
pmd = sqrt(carrier.pmd**2 + self.pmd**2)
yield carrier._replace(power=pwr, chromatic_dispersion=chromatic_dispersion, pmd=pmd)
def update_pref(self, pref):
self.pch_out_db = round(pref.p_spani - self.loss, 2)
return pref._replace(p_span0=pref.p_span0, p_spani=self.pch_out_db)
def update_pref(self, spectral_info):
# in case of Raman, the resulting loss of the fiber is not equivalent to self.loss
# because of Raman gain. In order to correctly update pref, we need the resulting loss:
# power_out - power_in. We use the total signal power (sum on all channels) to compute
# this loss, because pref is a noiseless reference.
loss = round(lin2db(self._psig_in / sum(spectral_info.signal)), 2)
self.pch_out_db = spectral_info.pref.p_spani - loss
spectral_info.pref = spectral_info.pref._replace(p_span0=spectral_info.pref.p_span0,
p_spani=self.pch_out_db)
def __call__(self, spectral_info):
carriers = tuple(self.propagate(*spectral_info.carriers))
pref = self.update_pref(spectral_info.pref)
return spectral_info._replace(carriers=carriers, pref=pref)
# _psig_in records the total signal power of the spectral information before propagation.
self._psig_in = sum(spectral_info.signal)
self.propagate(spectral_info)
self.update_pref(spectral_info)
return spectral_info
class RamanFiber(Fiber):
def __init__(self, *args, params=None, **kwargs):
super().__init__(*args, params=params, **kwargs)
if self.operational and 'raman_pumps' in self.operational:
self.raman_pumps = tuple(PumpParams(p['power'], p['frequency'], p['propagation_direction'])
for p in self.operational['raman_pumps'])
else:
self.raman_pumps = None
self.raman_solver = RamanSolver(self)
if not self.operational:
raise NetworkTopologyError(f'Fiber element uid:{self.uid} '
'defined as RamanFiber without operational parameters')
if 'raman_pumps' not in self.operational:
raise NetworkTopologyError(f'Fiber element uid:{self.uid} '
'defined as RamanFiber without raman pumps description in operational')
if 'temperature' not in self.operational:
raise NetworkTopologyError(f'Fiber element uid:{self.uid} '
'defined as RamanFiber without temperature in operational')
pump_loss = db2lin(self.params.con_out)
self.raman_pumps = tuple(PumpParams(p['power'] / pump_loss, p['frequency'], p['propagation_direction'])
for p in self.operational['raman_pumps'])
self.temperature = self.operational['temperature']
@property
def to_json(self):
return dict(super().to_json, operational=self.operational)
def update_pref(self, pref, *carriers):
pch_out_db = lin2db(mean([carrier.power.signal for carrier in carriers])) + 30
self.pch_out_db = round(pch_out_db, 2)
return pref._replace(p_span0=pref.p_span0, p_spani=self.pch_out_db)
def propagate(self, spectral_info: SpectralInformation):
"""Modifies the spectral information computing the attenuation, the non-linear interference generation,
the CD and PMD accumulation.
"""
# apply the attenuation due to the input connector loss
attenuation_in_db = self.params.con_in + self.params.att_in
spectral_info.apply_attenuation_db(attenuation_in_db)
def __call__(self, spectral_info):
carriers = tuple(self.propagate(*spectral_info.carriers))
pref = self.update_pref(spectral_info.pref, *carriers)
return spectral_info._replace(carriers=carriers, pref=pref)
# Raman pumps and inter channel Raman effect
stimulated_raman_scattering = RamanSolver.calculate_stimulated_raman_scattering(spectral_info, self)
spontaneous_raman_scattering = \
RamanSolver.calculate_spontaneous_raman_scattering(spectral_info, stimulated_raman_scattering, self)
def propagate(self, *carriers):
for propagated_carrier in propagate_raman_fiber(self, *carriers):
chromatic_dispersion = propagated_carrier.chromatic_dispersion + \
self.chromatic_dispersion(propagated_carrier.frequency)
pmd = sqrt(propagated_carrier.pmd**2 + self.pmd**2)
propagated_carrier = propagated_carrier._replace(chromatic_dispersion=chromatic_dispersion, pmd=pmd)
yield propagated_carrier
# nli and ase noise evaluated at the fiber input
spectral_info.nli += NliSolver.compute_nli(spectral_info, stimulated_raman_scattering, self)
spectral_info.ase += spontaneous_raman_scattering
# chromatic dispersion and pmd variations
spectral_info.chromatic_dispersion += self.chromatic_dispersion(spectral_info.frequency)
spectral_info.pmd = sqrt(spectral_info.pmd ** 2 + self.pmd ** 2)
class EdfaParams:
def __init__(self, **params):
self.update_params(params)
if params == {}:
self.type_variety = ''
self.type_def = ''
# self.gain_flatmax = 0
# self.gain_min = 0
# self.p_max = 0
# self.nf_model = None
# self.nf_fit_coeff = None
# self.nf_ripple = None
# self.dgt = None
# self.gain_ripple = None
# self.out_voa_auto = False
# self.allowed_for_design = None
# apply the attenuation due to the fiber losses
attenuation_fiber = stimulated_raman_scattering.loss_profile[:spectral_info.number_of_channels, -1]
def update_params(self, kwargs):
for k, v in kwargs.items():
setattr(self, k, self.update_params(**v) if isinstance(v, dict) else v)
spectral_info.apply_attenuation_lin(attenuation_fiber)
class EdfaOperational:
default_values = {
'gain_target': None,
'delta_p': None,
'out_voa': None,
'tilt_target': 0
}
def __init__(self, **operational):
self.update_attr(operational)
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():
setattr(self, k, clean_kwargs.get(k, v))
def __repr__(self):
return (f'{type(self).__name__}('
f'gain_target={self.gain_target!r}, '
f'tilt_target={self.tilt_target!r})')
# apply the attenuation due to the output connector loss
attenuation_out_db = self.params.con_out
spectral_info.apply_attenuation_db(attenuation_out_db)
self.pch_out_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase)
self.propagated_labels = spectral_info.label
class Edfa(_Node):
@@ -548,12 +686,7 @@ class Edfa(_Node):
if operational is None:
operational = {}
self.variety_list = kwargs.pop('variety_list', None)
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
self.interpol_gain_ripple = None # gain ripple
self.interpol_nf_ripple = None # nf_ripple
@@ -572,6 +705,7 @@ class Edfa(_Node):
self.delta_p = self.operational.delta_p # delta P with Pref (power swwep) in power mode
self.tilt_target = self.operational.tilt_target
self.out_voa = self.operational.out_voa
self.propagated_labels = [""]
@property
def to_json(self):
@@ -579,7 +713,7 @@ class Edfa(_Node):
'type': type(self).__name__,
'type_variety': self.params.type_variety,
'operational': {
'gain_target': self.effective_gain,
'gain_target': round(self.effective_gain, 6) if self.effective_gain else None,
'delta_p': self.delta_p,
'tilt_target': self.tilt_target,
'out_voa': self.out_voa
@@ -605,6 +739,7 @@ class Edfa(_Node):
if self.pin_db is None or self.pout_db is None:
return f'{type(self).__name__} {self.uid}'
nf = mean(self.nf)
total_pch = pretty_summary_print(per_label_average(self.pch_out_dbm, self.propagated_labels))
return '\n'.join([f'{type(self).__name__} {self.uid}',
f' type_variety: {self.params.type_variety}',
f' effective gain(dB): {self.effective_gain:.2f}',
@@ -617,46 +752,53 @@ class Edfa(_Node):
f' Delta_P (dB): ' + (f'{self.delta_p:.2f}' if self.delta_p is not None else 'None'),
f' target pch (dBm): ' + (f'{self.target_pch_out_db:.2f}' if self.target_pch_out_db is not None else 'None'),
f' effective pch (dBm): {self.effective_pch_out_db:.2f}',
f' actual pch out (dBm): {total_pch}',
f' output VOA (dB): {self.out_voa:.2f}'])
def interpol_params(self, frequencies, pin, baud_rates, pref):
def interpol_params(self, spectral_info):
"""interpolate SI channel frequencies with the edfa dgt and gain_ripple frquencies from JSON
:param spectral_info: instance of gnpy.core.info.SpectralInformation
:return: None
"""
# TODO|jla: read amplifier actual frequencies from additional params in json
self.channel_freq = frequencies
self.channel_freq = spectral_info.frequency
amplifier_freq = arrange_frequencies(len(self.params.dgt), self.params.f_min, self.params.f_max) # Hz
self.interpol_dgt = interp(self.channel_freq, amplifier_freq, self.params.dgt)
self.interpol_dgt = interp(spectral_info.frequency, amplifier_freq, self.params.dgt)
amplifier_freq = arrange_frequencies(len(self.params.gain_ripple), self.params.f_min, self.params.f_max) # Hz
self.interpol_gain_ripple = interp(self.channel_freq, amplifier_freq, self.params.gain_ripple)
self.interpol_gain_ripple = interp(spectral_info.frequency, amplifier_freq, self.params.gain_ripple)
amplifier_freq = arrange_frequencies(len(self.params.nf_ripple), self.params.f_min, self.params.f_max) # Hz
self.interpol_nf_ripple = interp(self.channel_freq, amplifier_freq, self.params.nf_ripple)
self.interpol_nf_ripple = interp(spectral_info.frequency, amplifier_freq, self.params.nf_ripple)
self.nch = frequencies.size
self.pin_db = lin2db(sum(pin * 1e3))
self.nch = spectral_info.number_of_channels
pin = spectral_info.signal + spectral_info.ase + spectral_info.nli
self.pin_db = watt2dbm(sum(pin))
# The following should be changed when we have the new spectral information including slot widths.
# For now, with homogeneous spectrum, we can calculate it as the difference between neighbouring channels.
self.slot_width = self.channel_freq[1] - self.channel_freq[0]
"""in power mode: delta_p is defined and can be used to calculate the power target
This power target is used calculate the amplifier gain"""
pref = spectral_info.pref
if self.delta_p is not None:
self.target_pch_out_db = round(self.delta_p + pref.p_span0, 2)
self.effective_gain = self.target_pch_out_db - pref.p_spani
"""check power saturation and correct effective gain & power accordingly:"""
# Compute the saturation accounting for actual power at the input of the amp
self.effective_gain = min(
self.effective_gain,
self.params.p_max - (pref.p_spani + pref.neq_ch)
self.params.p_max - self.pin_db
)
#print(self.uid, self.effective_gain, self.operational.gain_target)
self.effective_pch_out_db = round(pref.p_spani + self.effective_gain, 2)
"""check power saturation and correct target_gain accordingly:"""
#print(self.uid, self.effective_gain, self.pin_db, pref.p_spani)
self.nf = self._calc_nf()
self.gprofile = self._gain_profile(pin)
pout = (pin + self.noise_profile(baud_rates)) * db2lin(self.gprofile)
pout = (pin + self.noise_profile(spectral_info)) * db2lin(self.gprofile)
self.pout_db = lin2db(sum(pout * 1e3))
# ase & nli are only calculated in signal bandwidth
# pout_db is not the absolute full output power (negligible if sufficient channels)
@@ -673,13 +815,17 @@ class Edfa(_Node):
elif type_def == 'fixed_gain':
nf_avg = nf_model.nf0
elif type_def == 'openroadm':
pin_ch = self.pin_db - lin2db(self.nch)
# model OSNR = f(Pin)
nf_avg = pin_ch - polyval(nf_model.nf_coef, pin_ch) + 58
# OpenROADM specifies OSNR vs. input power per channel for 50 GHz slot width so we
# scale it to 50 GHz based on actual slot width.
pin_ch_50GHz = self.pin_db - lin2db(self.nch) + lin2db(50e9 / self.slot_width)
# model OSNR = f(Pin per 50 GHz channel)
nf_avg = pin_ch_50GHz - polyval(nf_model.nf_coef, pin_ch_50GHz) + 58
elif type_def == 'openroadm_preamp':
pin_ch = self.pin_db - lin2db(self.nch)
# model OSNR = f(Pin)
nf_avg = pin_ch - min((4 * pin_ch + 275) / 7, 33) + 58
# OpenROADM specifies OSNR vs. input power per channel for 50 GHz slot width so we
# scale it to 50 GHz based on actual slot width.
pin_ch_50GHz = self.pin_db - lin2db(self.nch) + lin2db(50e9 / self.slot_width)
# model OSNR = f(Pin per 50 GHz channel)
nf_avg = pin_ch_50GHz - min((4 * pin_ch_50GHz + 275) / 7, 33) + 58
elif type_def == 'openroadm_booster':
# model a zero-noise amp with "infinitely negative" (in dB) NF
nf_avg = float('-inf')
@@ -725,13 +871,8 @@ class Edfa(_Node):
else:
return self.interpol_nf_ripple + nf_avg # input VOA = 1 for 1 NF degradation
def noise_profile(self, df):
"""noise_profile(bw) computes amplifier ASE (W) in signal bandwidth (Hz)
Noise is calculated at amplifier input
:bw: signal bandwidth = baud rate in Hz
:type bw: float
def noise_profile(self, spectral_info: SpectralInformation):
"""Computes amplifier ASE noise integrated over the signal bandwidth. This is calculated at amplifier input.
:return: the asepower in W in the signal bandwidth bw for 96 channels
:return type: numpy array of float
@@ -767,7 +908,7 @@ class Edfa(_Node):
quoting power spectral density in the same BW for both signal and ASE,
e.g. 12.5GHz."""
ase = h * df * self.channel_freq * db2lin(self.nf) # W
ase = h * spectral_info.baud_rate * spectral_info.frequency * db2lin(self.nf) # W
return ase # in W at amplifier input
def _gain_profile(self, pin, err_tolerance=1.0e-11, simple_opt=True):
@@ -873,30 +1014,26 @@ class Edfa(_Node):
return g1st - voa + array(self.interpol_dgt) * dgts3
def propagate(self, pref, *carriers):
def propagate(self, spectral_info):
"""add ASE noise to the propagating carriers of :class:`.info.SpectralInformation`"""
pin = array([c.power.signal + c.power.nli + c.power.ase for c in carriers]) # pin in W
freq = array([c.frequency for c in carriers])
brate = array([c.baud_rate for c in carriers])
# interpolate the amplifier vectors with the carriers freq, calculate nf & gain profile
self.interpol_params(freq, pin, brate, pref)
self.interpol_params(spectral_info)
gains = db2lin(self.gprofile)
carrier_ases = self.noise_profile(brate)
att = db2lin(self.out_voa)
ase = self.noise_profile(spectral_info)
spectral_info.ase += ase
for gain, carrier_ase, carrier in zip(gains, carrier_ases, carriers):
pwr = carrier.power
pwr = pwr._replace(signal=pwr.signal * gain / att,
nli=pwr.nli * gain / att,
ase=(pwr.ase + carrier_ase) * gain / att)
yield carrier._replace(power=pwr)
spectral_info.apply_gain_db(self.gprofile - self.out_voa)
spectral_info.pmd = sqrt(spectral_info.pmd ** 2 + self.params.pmd ** 2)
spectral_info.pdl = sqrt(spectral_info.pdl ** 2 + self.params.pdl ** 2)
self.pch_out_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase)
self.propagated_labels = spectral_info.label
def update_pref(self, pref):
return pref._replace(p_span0=pref.p_span0,
p_spani=pref.p_spani + self.effective_gain - self.out_voa)
def update_pref(self, spectral_info):
spectral_info.pref = \
spectral_info.pref._replace(p_span0=spectral_info.pref.p_span0,
p_spani=spectral_info.pref.p_spani + self.effective_gain - self.out_voa)
def __call__(self, spectral_info):
carriers = tuple(self.propagate(spectral_info.pref, *spectral_info.carriers))
pref = self.update_pref(spectral_info.pref)
return spectral_info._replace(carriers=carriers, pref=pref)
self.propagate(spectral_info)
self.update_pref(spectral_info)
return spectral_info

View File

@@ -35,6 +35,7 @@ def trx_mode_params(equipment, trx_type_variety='', trx_mode='', error_message=F
mode_params = {"format": "undetermined",
"baud_rate": None,
"OSNR": None,
"penalties": None,
"bit_rate": None,
"roll_off": None,
"tx_osnr": None,
@@ -59,14 +60,12 @@ def trx_mode_params(equipment, trx_type_variety='', trx_mode='', error_message=F
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
nch = automatic_nch(trx_params['f_min'], trx_params['f_max'], trx_params['spacing'])
trx_params['nb_channel'] = nch
print(f'There are {nch} channels propagating')
trx_params['power'] = db2lin(default_si_data.power_dbm) * 1e-3

View File

@@ -8,49 +8,378 @@ gnpy.core.info
This module contains classes for modelling :class:`SpectralInformation`.
"""
from __future__ import annotations
from collections import namedtuple
from gnpy.core.utils import automatic_nch, lin2db
from collections.abc import Iterable
from typing import Union
from dataclasses import dataclass
from numpy import argsort, mean, array, append, ones, ceil, any, zeros, outer, full, ndarray, asarray
from gnpy.core.utils import automatic_nch, db2lin, watt2dbm
from gnpy.core.exceptions import SpectrumError
DEFAULT_SLOT_WIDTH_STEP = 12.5e9 # Hz
"""Channels with unspecified slot width will have their slot width evaluated as the baud rate rounded up to the minimum
multiple of the DEFAULT_SLOT_WIDTH_STEP (the baud rate is extended including the roll off in this evaluation)"""
class Power(namedtuple('Power', 'signal nli ase')):
"""carriers power in W"""
class Channel(namedtuple('Channel', 'channel_number frequency baud_rate roll_off power chromatic_dispersion pmd')):
class Channel(namedtuple('Channel',
'channel_number frequency baud_rate slot_width roll_off power chromatic_dispersion pmd pdl')):
""" Class containing the parameters of a WDM signal.
:param channel_number: channel number in the WDM grid
:param frequency: central frequency of the signal (Hz)
:param baud_rate: the symbol rate of the signal (Baud)
:param slot_width: the slot width (Hz)
:param roll_off: the roll off of the signal. It is a pure number between 0 and 1
:param power (gnpy.core.info.Power): power of signal, ASE noise and NLI (W)
:param chromatic_dispersion: chromatic dispersion (s/m)
:param pmd: polarization mode dispersion (s)
:param pdl: polarization dependent loss (dB)
"""
class Pref(namedtuple('Pref', 'p_span0, p_spani, neq_ch ')):
class Pref(namedtuple('Pref', 'p_span0, p_spani, ref_carrier')):
"""noiseless reference power in dBm:
p_span0: inital target carrier power
p_spani: carrier power after element i
neq_ch: equivalent channel count in dB"""
p_span0: inital target carrier power for a reference channel defined by user
p_spani: carrier power after element i for a reference channel defined by user
ref_carrier records the baud rate of the reference channel
"""
class SpectralInformation(namedtuple('SpectralInformation', 'pref carriers')):
class SpectralInformation(object):
""" Class containing the parameters of the entire WDM comb.
delta_pdb_per_channel: (per frequency) per channel delta power in dbm for the actual mix of channels"""
def __new__(cls, pref, carriers):
return super().__new__(cls, pref, carriers)
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, delta_pdb_per_channel: array,
tx_osnr: array, ref_power: Pref, label: array):
indices = argsort(frequency)
self._frequency = frequency[indices]
self._df = outer(ones(frequency.shape), frequency) - outer(frequency, ones(frequency.shape))
self._number_of_channels = len(self._frequency)
self._channel_number = [*range(1, self._number_of_channels + 1)]
self._slot_width = slot_width[indices]
self._baud_rate = baud_rate[indices]
overlap = self._frequency[:-1] + self._slot_width[:-1] / 2 > self._frequency[1:] - self._slot_width[1:] / 2
if any(overlap):
overlap = [pair for pair in zip(overlap * self._channel_number[:-1], overlap * self._channel_number[1:])
if pair != (0, 0)]
raise SpectrumError(f'Spectrum required slot widths larger than the frequency spectral distances '
f'between channels: {overlap}.')
exceed = self._baud_rate > self._slot_width
if any(exceed):
raise SpectrumError(f'Spectrum baud rate, including the roll off, larger than the slot width for channels: '
f'{[ch for ch in exceed * self._channel_number if ch]}.')
self._signal = signal[indices]
self._nli = nli[indices]
self._ase = ase[indices]
self._roll_off = roll_off[indices]
self._chromatic_dispersion = chromatic_dispersion[indices]
self._pmd = pmd[indices]
self._pdl = pdl[indices]
self._delta_pdb_per_channel = delta_pdb_per_channel[indices]
self._tx_osnr = tx_osnr[indices]
self._pref = ref_power
self._label = label[indices]
@property
def pref(self):
"""Instance of gnpy.info.Pref"""
return self._pref
@pref.setter
def pref(self, pref: Pref):
self._pref = pref
@property
def frequency(self):
return self._frequency
@property
def df(self):
"""Matrix of relative frequency distances between all channels. Positive elements in the upper right side."""
return self._df
@property
def slot_width(self):
return self._slot_width
@property
def baud_rate(self):
return self._baud_rate
@property
def number_of_channels(self):
return self._number_of_channels
@property
def powers(self):
powers = zip(self.signal, self.nli, self.ase)
return [Power(*p) for p in powers]
@property
def signal(self):
return self._signal
@signal.setter
def signal(self, signal):
self._signal = signal
@property
def nli(self):
return self._nli
@nli.setter
def nli(self, nli):
self._nli = nli
@property
def ase(self):
return self._ase
@ase.setter
def ase(self, ase):
self._ase = ase
@property
def roll_off(self):
return self._roll_off
@property
def chromatic_dispersion(self):
return self._chromatic_dispersion
@chromatic_dispersion.setter
def chromatic_dispersion(self, chromatic_dispersion):
self._chromatic_dispersion = chromatic_dispersion
@property
def pmd(self):
return self._pmd
@property
def label(self):
return self._label
@pmd.setter
def pmd(self, pmd):
self._pmd = pmd
@property
def pdl(self):
return self._pdl
@pdl.setter
def pdl(self, pdl):
self._pdl = pdl
@property
def delta_pdb_per_channel(self):
return self._delta_pdb_per_channel
@delta_pdb_per_channel.setter
def delta_pdb_per_channel(self, delta_pdb_per_channel):
self._delta_pdb_per_channel = delta_pdb_per_channel
@property
def tx_osnr(self):
return self._tx_osnr
@tx_osnr.setter
def tx_osnr(self, tx_osnr):
self._tx_osnr = tx_osnr
@property
def channel_number(self):
return self._channel_number
@property
def carriers(self):
entries = zip(self.channel_number, self.frequency, self.baud_rate, self.slot_width,
self.roll_off, self.powers, self.chromatic_dispersion, self.pmd, self.pdl)
return [Channel(*entry) for entry in entries]
def apply_attenuation_lin(self, attenuation_lin):
self.signal *= attenuation_lin
self.nli *= attenuation_lin
self.ase *= attenuation_lin
def apply_attenuation_db(self, attenuation_db):
attenuation_lin = 1 / db2lin(attenuation_db)
self.apply_attenuation_lin(attenuation_lin)
def apply_gain_lin(self, gain_lin):
self.signal *= gain_lin
self.nli *= gain_lin
self.ase *= gain_lin
def apply_gain_db(self, gain_db):
gain_lin = db2lin(gain_db)
self.apply_gain_lin(gain_lin)
def __add__(self, other: SpectralInformation):
try:
# Note that pref.p_spanx from "self" and "other" must be identical for a given simulation (correspond to the
# the simulation setup):
# - for a given simulation there is only one design (one p_span0),
# - and p_spani is the propagation result of p_span0 so there should not be different p_spani either.
if (self.pref.p_span0 != other.pref.p_span0) or (self.pref.p_spani != other.pref.p_spani):
raise SpectrumError('reference powers of the spectrum are not identical')
return SpectralInformation(frequency=append(self.frequency, other.frequency),
slot_width=append(self.slot_width, other.slot_width),
signal=append(self.signal, other.signal), nli=append(self.nli, other.nli),
ase=append(self.ase, other.ase),
baud_rate=append(self.baud_rate, other.baud_rate),
roll_off=append(self.roll_off, other.roll_off),
chromatic_dispersion=append(self.chromatic_dispersion,
other.chromatic_dispersion),
pmd=append(self.pmd, other.pmd),
pdl=append(self.pdl, other.pdl),
delta_pdb_per_channel=append(self.delta_pdb_per_channel,
other.delta_pdb_per_channel),
tx_osnr=append(self.tx_osnr, other.tx_osnr),
ref_power=Pref(self.pref.p_span0, self.pref.p_spani, self.pref.ref_carrier),
label=append(self.label, other.label))
except SpectrumError:
raise SpectrumError('Spectra cannot be summed: channels overlapping.')
def create_input_spectral_information(f_min, f_max, roll_off, baud_rate, power, spacing):
# pref in dB : convert power lin into power in dB
pref = lin2db(power * 1e3)
nb_channel = automatic_nch(f_min, f_max, spacing)
si = SpectralInformation(
pref=Pref(pref, pref, lin2db(nb_channel)),
carriers=[
Channel(f, (f_min + spacing * f),
baud_rate, roll_off, Power(power, 0, 0), 0, 0) for f in range(1, nb_channel + 1)
]
)
return si
def _replace(self, carriers, pref):
self.chromatic_dispersion = array([c.chromatic_dispersion for c in carriers])
self.pmd = array([c.pmd for c in carriers])
self.pdl = array([c.pdl for c in carriers])
self.signal = array([c.power.signal for c in carriers])
self.nli = array([c.power.nli for c in carriers])
self.ase = array([c.power.ase for c in carriers])
self.pref = pref
return self
def create_arbitrary_spectral_information(frequency: Union[ndarray, Iterable, float],
signal: Union[float, ndarray, Iterable],
baud_rate: Union[float, ndarray, Iterable],
tx_osnr: Union[float, ndarray, Iterable],
delta_pdb_per_channel: Union[float, ndarray, Iterable] = 0.,
slot_width: Union[float, ndarray, Iterable] = None,
roll_off: Union[float, ndarray, Iterable] = 0.,
chromatic_dispersion: Union[float, ndarray, Iterable] = 0.,
pmd: Union[float, ndarray, Iterable] = 0.,
pdl: Union[float, ndarray, Iterable] = 0.,
ref_power: Pref = None,
label: Union[str, ndarray, Iterable] = None):
"""This is just a wrapper around the SpectralInformation.__init__() that simplifies the creation of
a non-uniform spectral information with NLI and ASE powers set to zero."""
frequency = asarray(frequency)
number_of_channels = frequency.size
try:
signal = full(number_of_channels, signal)
baud_rate = full(number_of_channels, baud_rate)
roll_off = full(number_of_channels, roll_off)
slot_width = full(number_of_channels, slot_width) if slot_width is not None else \
ceil((1 + roll_off) * baud_rate / DEFAULT_SLOT_WIDTH_STEP) * DEFAULT_SLOT_WIDTH_STEP
chromatic_dispersion = full(number_of_channels, chromatic_dispersion)
pmd = full(number_of_channels, pmd)
pdl = full(number_of_channels, pdl)
nli = zeros(number_of_channels)
ase = zeros(number_of_channels)
delta_pdb_per_channel = full(number_of_channels, delta_pdb_per_channel)
tx_osnr = full(number_of_channels, tx_osnr)
label = full(number_of_channels, label)
return SpectralInformation(frequency=frequency, slot_width=slot_width,
signal=signal, nli=nli, ase=ase,
baud_rate=baud_rate, roll_off=roll_off,
chromatic_dispersion=chromatic_dispersion,
pmd=pmd, pdl=pdl,
delta_pdb_per_channel=delta_pdb_per_channel,
tx_osnr=tx_osnr,
ref_power=ref_power, label=label)
except ValueError as e:
if 'could not broadcast' in str(e):
raise SpectrumError('Dimension mismatch in input fields.')
else:
raise
def create_input_spectral_information(f_min, f_max, roll_off, baud_rate, power, spacing, tx_osnr, ref_carrier=None):
""" Creates a fixed slot width spectral information with flat power.
all arguments are scalar values"""
number_of_channels = automatic_nch(f_min, f_max, spacing)
frequency = [(f_min + spacing * i) for i in range(1, number_of_channels + 1)]
p_span0 = watt2dbm(power)
p_spani = watt2dbm(power)
delta_pdb_per_channel = zeros(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,
roll_off=roll_off, delta_pdb_per_channel=delta_pdb_per_channel,
tx_osnr=tx_osnr,
ref_power=Pref(p_span0=p_span0, p_spani=p_spani,
ref_carrier=ref_carrier),
label=label)
def carriers_to_spectral_information(initial_spectrum: dict[float, Carrier], power: float,
ref_carrier: ReferenceCarrier) -> SpectralInformation:
"""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,
tx_osnr and roll off.
:param power: power of the request
:param ref_carrier: reference carrier (baudrate) used for the reference channel
"""
frequency = list(initial_spectrum.keys())
signal = [power * db2lin(c.delta_pdb) 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()]
delta_pdb_per_channel = [c.delta_pdb 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()]
label = [c.label for c in initial_spectrum.values()]
p_span0 = watt2dbm(power)
p_spani = watt2dbm(power)
return create_arbitrary_spectral_information(frequency=frequency, signal=signal, baud_rate=baud_rate,
slot_width=slot_width, roll_off=roll_off,
delta_pdb_per_channel=delta_pdb_per_channel, tx_osnr=tx_osnr,
ref_power=Pref(p_span0=p_span0, p_spani=p_spani,
ref_carrier=ref_carrier),
label=label)
@dataclass
class Carrier:
"""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
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.
"""
delta_pdb: float
baud_rate: float
slot_width: float
roll_off: float
tx_osnr: float
label: str
@dataclass
class ReferenceCarrier:
"""Reference channel type is used to determine target power out of ROADM for the reference channel when
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.
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.
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
output power should be -20 dBm and for a 64 GBaud channel power target would need 3 dB more: -17 dBm.
Slot width is required to find the target power in constant PSW (constant power per slot width equalization):
power = PSW_target * slot_width.
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.
Other attributes (like slot_width or roll-off) may be added there for future equalization purpose.
"""
baud_rate: float
slot_width: float

View File

@@ -12,6 +12,7 @@ from operator import attrgetter
from gnpy.core import ansi_escapes, elements
from gnpy.core.exceptions import ConfigurationError, NetworkTopologyError
from gnpy.core.utils import round2float, convert_length
from gnpy.core.info import ReferenceCarrier
from collections import namedtuple
@@ -27,6 +28,7 @@ def edfa_nf(gain_target, variety_type, equipment):
)
amp.pin_db = 0
amp.nch = 88
amp.slot_width = 50e9
return amp._calc_nf(True)
@@ -236,22 +238,20 @@ def set_egress_amplifier(network, this_node, equipment, pref_ch_db, pref_total_d
""" this node can be a transceiver or a ROADM (same function called in both cases)
"""
power_mode = equipment['Span']['default'].power_mode
ref_carrier = ReferenceCarrier(baud_rate=equipment['SI']['default'].baud_rate,
slot_width=equipment['SI']['default'].spacing)
next_oms = (n for n in network.successors(this_node) if not isinstance(n, elements.Transceiver))
this_node_degree = {k: v for k, v in this_node.per_degree_pch_out_db.items()} if hasattr(this_node, 'per_degree_pch_out_db') else {}
for oms in next_oms:
# go through all the OMS departing from the ROADM
prev_node = this_node
node = oms
# if isinstance(next_node, elements.Fused): #support ROADM wo egress amp for metro applications
# node = find_last_node(next_node)
# next_node = next(n for n in network.successors(node))
# next_node = find_last_node(next_node)
if node.uid not in this_node_degree:
# if no target power is defined on this degree or no per degree target power is given use the global one
# if target_pch_out_db is not an attribute, then the element must be a transceiver
this_node_degree[node.uid] = getattr(this_node.params, 'target_pch_out_db', 0)
if isinstance(this_node, elements.Transceiver):
this_node_out_power = 0.0 # default value if this_node is a transceiver
if isinstance(this_node, elements.Roadm):
# get target power out from ROADM for the reference carrier based on equalization settings
this_node_out_power = this_node.get_per_degree_ref_power(degree=node.uid, ref_carrier=ref_carrier)
# use the target power on this degree
prev_dp = this_node_degree[node.uid] - pref_ch_db
prev_dp = this_node_out_power - pref_ch_db
dp = prev_dp
prev_voa = 0
voa = 0
@@ -282,7 +282,7 @@ def set_egress_amplifier(network, this_node, equipment, pref_ch_db, pref_total_d
if isinstance(prev_node, elements.Fiber):
max_fiber_lineic_loss_for_raman = \
equipment['Span']['default'].max_fiber_lineic_loss_for_raman
equipment['Span']['default'].max_fiber_lineic_loss_for_raman * 1e-3 # dB/m
raman_allowed = prev_node.params.loss_coef < max_fiber_lineic_loss_for_raman
else:
raman_allowed = False
@@ -303,9 +303,14 @@ def set_egress_amplifier(network, this_node, equipment, pref_ch_db, pref_total_d
node.params.update_params(extra_params.__dict__)
dp += power_reduction
gain_target += power_reduction
elif node.params.raman and not raman_allowed:
print(f'{ansi_escapes.red}WARNING{ansi_escapes.reset}: raman is used in node {node.uid}\n but fiber lineic loss is above threshold\n')
else:
if node.params.raman and not raman_allowed:
if isinstance(prev_node, elements.Fiber):
print(f'{ansi_escapes.red}WARNING{ansi_escapes.reset}: raman is used in node {node.uid}\n '
'but fiber lineic loss is above threshold\n')
else:
print(f'{ansi_escapes.red}WARNING{ansi_escapes.reset}: raman is used in node {node.uid}\n '
'but previous node is not a fiber\n')
# if variety is imposed by user, and if the gain_target (computed or imposed) is also above
# variety max gain + extended range, then warn that gain > max_gain + extended range
if gain_target - equipment['Edfa'][node.params.type_variety].gain_flatmax - \
@@ -325,10 +330,28 @@ def set_egress_amplifier(network, this_node, equipment, pref_ch_db, pref_total_d
prev_voa = voa
prev_node = node
node = next_node
# print(f'{node.uid}')
if isinstance(this_node, elements.Roadm):
this_node.per_degree_pch_out_db = {k: v for k, v in this_node_degree.items()}
def set_roadm_per_degree_targets(roadm, network):
"""Set target powers/PSD on all degrees
This is needed to populate per_degree_pch_out_dbm or per_degree_pch_psd or per_degree_pch_psw dicts when
they are not initialized by users.
"""
next_oms = (n for n in network.successors(roadm) if not isinstance(n, elements.Transceiver))
for node in next_oms:
# go through all the OMS departing from the ROADM
if node.uid not in roadm.per_degree_pch_out_dbm and node.uid not in roadm.per_degree_pch_psd and \
node.uid not in roadm.per_degree_pch_psw:
# if no target power is defined on this degree or no per degree target power is given use the global one
if roadm.params.target_pch_out_db:
roadm.per_degree_pch_out_dbm[node.uid] = roadm.params.target_pch_out_db
elif roadm.params.target_psd_out_mWperGHz:
roadm.per_degree_pch_psd[node.uid] = roadm.params.target_psd_out_mWperGHz
elif roadm.params.target_out_mWperSlotWidth:
roadm.per_degree_pch_psw[node.uid] = roadm.params.target_out_mWperSlotWidth
else:
raise ConfigurationError(roadm.uid, 'needs an equalization target')
def add_roadm_booster(network, roadm):
@@ -426,10 +449,10 @@ def calculate_new_length(fiber_length, bounds, target_length):
return (length1, n_spans1)
elif (bounds.start <= length2 <= bounds.stop) and not(bounds.start <= length1 <= bounds.stop):
return (length2, n_spans2)
elif target_length - length1 < length2 - target_length:
return (length1, n_spans1)
else:
elif length2 - target_length <= target_length - length1 and length2 <= bounds.stop:
return (length2, n_spans2)
else:
return (length1, n_spans1)
def split_fiber(network, fiber, bounds, target_length, equipment):
@@ -521,7 +544,6 @@ def build_network(network, equipment, pref_ch_db, pref_total_db, no_insert_edfas
# set roadm loss for gain_mode before to build network
fibers = [f for f in network.nodes() if isinstance(f, elements.Fiber)]
add_connector_loss(network, fibers, default_span_data.con_in, default_span_data.con_out, default_span_data.EOL)
add_fiber_padding(network, fibers, default_span_data.padding)
# don't group split fiber and add amp in the same loop
# =>for code clarity (at the expense of speed):
@@ -539,7 +561,10 @@ def build_network(network, equipment, pref_ch_db, pref_total_db, no_insert_edfas
for fiber in fibers:
add_inline_amplifier(network, fiber)
add_fiber_padding(network, fibers, default_span_data.padding)
for roadm in roadms:
set_roadm_per_degree_targets(roadm, network)
set_egress_amplifier(network, roadm, equipment, pref_ch_db, pref_total_db)
trx = [t for t in network.nodes() if isinstance(t, elements.Transceiver)]

View File

@@ -9,9 +9,9 @@ This module contains all parameters to configure standard network elements.
"""
from scipy.constants import c, pi
from numpy import squeeze, log10, exp
from numpy import asarray, array
from gnpy.core.utils import db2lin, convert_length
from gnpy.core.utils import convert_length
from gnpy.core.exceptions import ParametersError
@@ -28,110 +28,111 @@ class Parameters:
class PumpParams(Parameters):
def __init__(self, power, frequency, propagation_direction):
self._power = power
self._frequency = frequency
self._propagation_direction = propagation_direction
@property
def power(self):
return self._power
@property
def frequency(self):
return self._frequency
@property
def propagation_direction(self):
return self._propagation_direction
self.power = power
self.frequency = frequency
self.propagation_direction = propagation_direction.lower()
class RamanParams(Parameters):
def __init__(self, **kwargs):
self._flag_raman = kwargs['flag_raman']
self._space_resolution = kwargs['space_resolution'] if 'space_resolution' in kwargs else None
self._tolerance = kwargs['tolerance'] if 'tolerance' in kwargs else None
@property
def flag_raman(self):
return self._flag_raman
@property
def space_resolution(self):
return self._space_resolution
@property
def tolerance(self):
return self._tolerance
def __init__(self, flag=False, result_spatial_resolution=10e3, solver_spatial_resolution=50):
""" Simulation parameters used within the Raman Solver
:params flag: boolean for enabling/disable the evaluation of the Raman power profile in frequency and position
:params result_spatial_resolution: spatial resolution of the evaluated Raman power profile
:params solver_spatial_resolution: spatial step for the iterative solution of the first order ode
"""
self.flag = flag
self.result_spatial_resolution = result_spatial_resolution # [m]
self.solver_spatial_resolution = solver_spatial_resolution # [m]
class NLIParams(Parameters):
def __init__(self, **kwargs):
self._nli_method_name = kwargs['nli_method_name']
self._wdm_grid_size = kwargs['wdm_grid_size']
self._dispersion_tolerance = kwargs['dispersion_tolerance']
self._phase_shift_tolerance = kwargs['phase_shift_tolerance']
self._f_cut_resolution = None
self._f_pump_resolution = None
self._computed_channels = kwargs['computed_channels'] if 'computed_channels' in kwargs else None
@property
def nli_method_name(self):
return self._nli_method_name
@property
def wdm_grid_size(self):
return self._wdm_grid_size
@property
def dispersion_tolerance(self):
return self._dispersion_tolerance
@property
def phase_shift_tolerance(self):
return self._phase_shift_tolerance
@property
def f_cut_resolution(self):
return self._f_cut_resolution
@f_cut_resolution.setter
def f_cut_resolution(self, f_cut_resolution):
self._f_cut_resolution = f_cut_resolution
@property
def f_pump_resolution(self):
return self._f_pump_resolution
@f_pump_resolution.setter
def f_pump_resolution(self, f_pump_resolution):
self._f_pump_resolution = f_pump_resolution
@property
def computed_channels(self):
return self._computed_channels
def __init__(self, method='gn_model_analytic', dispersion_tolerance=1, phase_shift_tolerance=0.1,
computed_channels=None):
""" Simulation parameters used within the Nli Solver
:params method: formula for NLI calculation
:params dispersion_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
"""
self.method = method.lower()
self.dispersion_tolerance = dispersion_tolerance
self.phase_shift_tolerance = phase_shift_tolerance
self.computed_channels = computed_channels
class SimParams(Parameters):
def __init__(self, **kwargs):
try:
if 'nli_parameters' in kwargs:
self._nli_params = NLIParams(**kwargs['nli_parameters'])
else:
self._nli_params = None
if 'raman_parameters' in kwargs:
self._raman_params = RamanParams(**kwargs['raman_parameters'])
else:
self._raman_params = None
except KeyError as e:
raise ParametersError(f'Simulation parameters must include {e}. Configuration: {kwargs}')
_shared_dict = {'nli_params': NLIParams(), 'raman_params': RamanParams()}
def __init__(self):
if type(self) == SimParams:
raise NotImplementedError('Instances of SimParams cannot be generated')
@classmethod
def set_params(cls, sim_params):
cls._shared_dict['nli_params'] = NLIParams(**sim_params.get('nli_params', {}))
cls._shared_dict['raman_params'] = RamanParams(**sim_params.get('raman_params', {}))
@classmethod
def get(cls):
self = cls.__new__(cls)
return self
@property
def nli_params(self):
return self._nli_params
return self._shared_dict['nli_params']
@property
def raman_params(self):
return self._raman_params
return self._shared_dict['raman_params']
class RoadmParams(Parameters):
def __init__(self, **kwargs):
self.target_pch_out_db = kwargs.get('target_pch_out_db')
self.target_psd_out_mWperGHz = kwargs.get('target_psd_out_mWperGHz')
self.target_out_mWperSlotWidth = kwargs.get('target_out_mWperSlotWidth')
equalisation_type = ['target_pch_out_db', 'target_psd_out_mWperGHz', 'target_out_mWperSlotWidth']
temp = [kwargs.get(k) is not None for k in equalisation_type]
if sum(temp) > 1:
raise ParametersError('ROADM config contains more than one equalisation type.'
+ 'Please choose only one', kwargs)
self.per_degree_pch_out_db = kwargs.get('per_degree_pch_out_db', {})
self.per_degree_pch_psd = kwargs.get('per_degree_psd_out_mWperGHz', {})
self.per_degree_pch_psw = kwargs.get('per_degree_psd_out_mWperSlotWidth', {})
try:
self.add_drop_osnr = kwargs['add_drop_osnr']
self.pmd = kwargs['pmd']
self.pdl = kwargs['pdl']
self.restrictions = kwargs['restrictions']
except KeyError as e:
raise ParametersError(f'ROADM configurations must include {e}. Configuration: {kwargs}')
class FusedParams(Parameters):
def __init__(self, **kwargs):
self.loss = kwargs['loss'] if 'loss' in kwargs else 1
# SSMF Raman coefficient profile normalized with respect to the effective area (Cr * A_eff)
CR_NORM = array([
0., 7.802e-16, 2.4236e-15, 4.0504e-15, 5.6606e-15, 6.8973e-15, 7.802e-15, 8.4162e-15, 8.8727e-15, 9.2877e-15,
1.01011e-14, 1.05244e-14, 1.13295e-14, 1.2367e-14, 1.3695e-14, 1.5023e-14, 1.64091e-14, 1.81936e-14, 2.04927e-14,
2.28167e-14, 2.48917e-14, 2.66098e-14, 2.82615e-14, 2.98136e-14, 3.1042e-14, 3.17558e-14, 3.18803e-14, 3.17558e-14,
3.15566e-14, 3.11748e-14, 2.94567e-14, 3.14985e-14, 2.8552e-14, 2.43439e-14, 1.67992e-14, 9.6114e-15, 7.02180e-15,
5.9262e-15, 5.6938e-15, 7.055e-15, 7.4119e-15, 7.4783e-15, 6.7645e-15, 5.5361e-15, 3.6271e-15, 2.7224e-15,
2.4568e-15, 2.1995e-15, 2.1331e-15, 2.3323e-15, 2.5564e-15, 3.0461e-15, 4.8555e-15, 5.5029e-15, 5.2788e-15,
4.565e-15, 3.3698e-15, 2.2991e-15, 2.0086e-15, 1.5521e-15, 1.328e-15, 1.162e-15, 9.379e-16, 8.715e-16, 8.134e-16,
8.134e-16, 9.379e-16, 1.3612e-15, 1.6185e-15, 1.9754e-15, 1.8758e-15, 1.6849e-15, 1.2284e-15, 9.047e-16, 8.134e-16,
8.715e-16, 9.711e-16, 1.0375e-15, 1.0043e-15, 9.047e-16, 8.134e-16, 6.806e-16, 5.478e-16, 3.901e-16, 2.241e-16,
1.577e-16, 9.96e-17, 3.32e-17, 1.66e-17, 8.3e-18])
# Note the non-uniform spacing of this range; this is required for properly capturing the Raman peak shape.
FREQ_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, 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, 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, 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, 39., 39.5, 40.,
40.5, 41., 41.5, 42.]) * 1e12
class FiberParams(Parameters):
@@ -139,45 +140,50 @@ class FiberParams(Parameters):
try:
self._length = convert_length(kwargs['length'], kwargs['length_units'])
# fixed attenuator for padding
self._att_in = kwargs['att_in'] if 'att_in' in kwargs else 0
self._att_in = kwargs.get('att_in', 0)
# if not defined in the network json connector loss in/out
# the None value will be updated in network.py[build_network]
# with default values from eqpt_config.json[Spans]
self._con_in = kwargs['con_in'] if 'con_in' in kwargs else None
self._con_out = kwargs['con_out'] if 'con_out' in kwargs else None
self._con_in = kwargs.get('con_in')
self._con_out = kwargs.get('con_out')
if 'ref_wavelength' in kwargs:
self._ref_wavelength = kwargs['ref_wavelength']
self._ref_frequency = c / self.ref_wavelength
self._ref_frequency = c / self._ref_wavelength
elif 'ref_frequency' in kwargs:
self._ref_frequency = kwargs['ref_frequency']
self._ref_wavelength = c / self.ref_frequency
self._ref_wavelength = c / self._ref_frequency
else:
self._ref_wavelength = 1550e-9
self._ref_frequency = c / self.ref_wavelength
self._ref_wavelength = 1550e-9 # conventional central C band wavelength [m]
self._ref_frequency = c / self._ref_wavelength
self._dispersion = kwargs['dispersion'] # s/m/m
self._dispersion_slope = kwargs['dispersion_slope'] if 'dispersion_slope' in kwargs else \
-2 * self._dispersion/self.ref_wavelength # s/m/m/m
self._dispersion_slope = \
kwargs.get('dispersion_slope', -2 * self._dispersion / self.ref_wavelength) # s/m/m/m
self._beta2 = -(self.ref_wavelength ** 2) * self.dispersion / (2 * pi * c) # 1/(m * Hz^2)
# Eq. (3.23) in Abramczyk, Halina. "Dispersion phenomena in optical fibers." Virtual European University
# on Lasers. Available online: http://mitr.p.lodz.pl/evu/lectures/Abramczyk3.pdf
# (accessed on 25 March 2018) (2005).
self._beta3 = ((self.dispersion_slope - (4*pi*c/self.ref_wavelength**3) * self.beta2) /
(2*pi*c/self.ref_wavelength**2)**2)
self._gamma = kwargs['gamma'] # 1/W/m
self._effective_area = kwargs.get('effective_area') # m^2
n2 = 2.6e-20 # m^2/W
if self._effective_area:
self._gamma = kwargs.get('gamma', 2 * pi * n2 / (self.ref_wavelength * self._effective_area)) # 1/W/m
elif 'gamma' in kwargs:
self._gamma = kwargs['gamma'] # 1/W/m
self._effective_area = 2 * pi * n2 / (self.ref_wavelength * self._gamma) # m^2
else:
self._gamma = 0 # 1/W/m
self._effective_area = 83e-12 # m^2
default_raman_efficiency = {'cr': CR_NORM / self._effective_area, 'frequency_offset': FREQ_OFFSET}
self._raman_efficiency = kwargs.get('raman_efficiency', default_raman_efficiency)
self._pmd_coef = kwargs['pmd_coef'] # s/sqrt(m)
if type(kwargs['loss_coef']) == dict:
self._loss_coef = squeeze(kwargs['loss_coef']['loss_coef_power']) * 1e-3 # lineic loss dB/m
self._f_loss_ref = squeeze(kwargs['loss_coef']['frequency']) # Hz
self._loss_coef = asarray(kwargs['loss_coef']['value']) * 1e-3 # lineic loss dB/m
self._f_loss_ref = asarray(kwargs['loss_coef']['frequency']) # Hz
else:
self._loss_coef = kwargs['loss_coef'] * 1e-3 # lineic loss dB/m
self._f_loss_ref = 193.5e12 # Hz
self._lin_attenuation = db2lin(self.length * self.loss_coef)
self._lin_loss_exp = self.loss_coef / (10 * log10(exp(1))) # linear power exponent loss Neper/m
self._effective_length = (1 - exp(- self.lin_loss_exp * self.length)) / self.lin_loss_exp
self._asymptotic_length = 1 / self.lin_loss_exp
# raman parameters (not compulsory)
self._raman_efficiency = kwargs['raman_efficiency'] if 'raman_efficiency' in kwargs else None
self._pumps_loss_coef = kwargs['pumps_loss_coef'] if 'pumps_loss_coef' in kwargs else None
self._loss_coef = asarray(kwargs['loss_coef']) * 1e-3 # lineic loss dB/m
self._f_loss_ref = asarray(self._ref_frequency) # Hz
self._lumped_losses = kwargs['lumped_losses'] if 'lumped_losses' in kwargs else []
except KeyError as e:
raise ParametersError(f'Fiber configurations json must include {e}. Configuration: {kwargs}')
@@ -210,6 +216,10 @@ class FiberParams(Parameters):
def con_out(self):
return self._con_out
@property
def lumped_losses(self):
return self._lumped_losses
@con_out.setter
def con_out(self, con_out):
self._con_out = con_out
@@ -254,32 +264,60 @@ class FiberParams(Parameters):
def f_loss_ref(self):
return self._f_loss_ref
@property
def lin_loss_exp(self):
return self._lin_loss_exp
@property
def lin_attenuation(self):
return self._lin_attenuation
@property
def effective_length(self):
return self._effective_length
@property
def asymptotic_length(self):
return self._asymptotic_length
@property
def raman_efficiency(self):
return self._raman_efficiency
@property
def pumps_loss_coef(self):
return self._pumps_loss_coef
def asdict(self):
dictionary = super().asdict()
dictionary['loss_coef'] = self.loss_coef * 1e3
dictionary['length_units'] = 'm'
if not self.lumped_losses:
dictionary.pop('lumped_losses')
if not self.raman_efficiency:
dictionary.pop('raman_efficiency')
return dictionary
class EdfaParams:
def __init__(self, **params):
self.update_params(params)
if params == {}:
self.type_variety = ''
self.type_def = ''
# self.gain_flatmax = 0
# self.gain_min = 0
# self.p_max = 0
# self.nf_model = None
# self.nf_fit_coeff = None
# self.nf_ripple = None
# self.dgt = None
# self.gain_ripple = None
# self.out_voa_auto = False
# self.allowed_for_design = None
def update_params(self, kwargs):
for k, v in kwargs.items():
setattr(self, k, self.update_params(**v) if isinstance(v, dict) else v)
class EdfaOperational:
default_values = {
'gain_target': None,
'delta_p': None,
'out_voa': None,
'tilt_target': 0
}
def __init__(self, **operational):
self.update_attr(operational)
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():
setattr(self, k, clean_kwargs.get(k, v))
def __repr__(self):
return (f'{type(self).__name__}('
f'gain_target={self.gain_target!r}, '
f'tilt_target={self.tilt_target!r})')

File diff suppressed because it is too large Load Diff

View File

@@ -9,7 +9,7 @@ This module contains utility functions that are used with gnpy.
"""
from csv import writer
from numpy import pi, cos, sqrt, log10, linspace, zeros, shape, where, logical_and
from numpy import pi, cos, sqrt, log10, linspace, zeros, shape, where, logical_and, mean
from scipy import constants
from gnpy.core.exceptions import ConfigurationError
@@ -106,6 +106,69 @@ def db2lin(value):
return 10**(value / 10)
def watt2dbm(value):
"""Convert Watt units to dBm
>>> round(watt2dbm(0.001), 1)
0.0
>>> round(watt2dbm(0.02), 1)
13.0
"""
return lin2db(value * 1e3)
def dbm2watt(value):
"""Convert dBm units to Watt
>>> round(dbm2watt(0), 4)
0.001
>>> round(dbm2watt(-3), 4)
0.0005
>>> round(dbm2watt(13), 4)
0.02
"""
return db2lin(value) * 1e-3
def psd2powerdbm(psd_mwperghz, baudrate_baud):
"""computes power in dBm based on baudrate in bauds and psd in mW/GHz
>>> round(psd2powerdbm(0.031176, 64e9),3)
3.0
>>> round(psd2powerdbm(0.062352, 32e9),3)
3.0
>>> round(psd2powerdbm(0.015625, 64e9),3)
0.0
"""
return lin2db(baudrate_baud * psd_mwperghz * 1e-9)
def power_dbm_to_psd_mw_ghz(power_dbm, baudrate_baud):
"""computes power spectral density in mW/GHz based on baudrate in bauds and power in dBm
>>> power_dbm_to_psd_mw_ghz(0, 64e9)
0.015625
>>> round(power_dbm_to_psd_mw_ghz(3, 64e9), 6)
0.031176
>>> round(power_dbm_to_psd_mw_ghz(3, 32e9), 6)
0.062352
"""
return db2lin(power_dbm) / (baudrate_baud * 1e-9)
def psd_mw_per_ghz(power_watt, baudrate_baud):
"""computes power spectral density in mW/GHz based on baudrate in bauds and power in W
>>> psd_mw_per_ghz(2e-3, 32e9)
0.0625
>>> psd_mw_per_ghz(1e-3, 64e9)
0.015625
>>> psd_mw_per_ghz(0.5e-3, 32e9)
0.015625
"""
return power_watt * 1e3 / (baudrate_baud * 1e-9)
def round2float(number, step):
"""Round a floating point number so that its "resolution" is not bigger than 'step'
@@ -166,6 +229,32 @@ def snr_sum(snr, bw, snr_added, bw_added=12.5e9):
return snr
def per_label_average(values, labels):
"""computes the average per defined spectrum band, using labels
>>> labels = ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'C', 'D', 'D', 'D', 'D']
>>> values = [28.51, 28.23, 28.15, 28.17, 28.36, 28.53, 28.64, 28.68, 28.7, 28.71, 28.72, 28.73, 28.74, 28.91, 27.96, 27.85, 27.87, 28.02]
>>> per_label_average(values, labels)
{'A': 28.28, 'B': 28.68, 'C': 28.91, 'D': 27.92}
"""
label_set = sorted(set(labels))
summary = {}
for label in label_set:
vals = [val for val, lab in zip(values, labels) if lab == label]
summary[label] = round(mean(vals), 2)
return summary
def pretty_summary_print(summary):
"""Build a prettty string that shows the summary dict values per label with 2 digits
"""
if len(summary) == 1:
return f'{list(summary.values())[0]:.2f}'
text = ', '.join([f'{label}: {value:.2f}' for label, value in summary.items()])
return text
def deltawl2deltaf(delta_wl, wavelength):
""" deltawl2deltaf(delta_wl, wavelength):
delta_wl is BW in wavelength units

View File

@@ -180,51 +180,27 @@
"Fiber":[{
"type_variety": "SSMF",
"dispersion": 1.67e-05,
"gamma": 0.00127,
"effective_area": 83e-12,
"pmd_coef": 1.265e-15
},
{
"type_variety": "NZDF",
"dispersion": 0.5e-05,
"gamma": 0.00146,
"effective_area": 72e-12,
"pmd_coef": 1.265e-15
},
{
"type_variety": "LOF",
"dispersion": 2.2e-05,
"gamma": 0.000843,
"effective_area": 125e-12,
"pmd_coef": 1.265e-15
}
],
"RamanFiber":[{
"type_variety": "SSMF",
"dispersion": 1.67e-05,
"gamma": 0.00127,
"pmd_coef": 1.265e-15,
"raman_efficiency": {
"cr":[
0, 9.4E-06, 2.92E-05, 4.88E-05, 6.82E-05, 8.31E-05, 9.4E-05, 0.0001014, 0.0001069, 0.0001119,
0.0001217, 0.0001268, 0.0001365, 0.000149, 0.000165, 0.000181, 0.0001977, 0.0002192, 0.0002469,
0.0002749, 0.0002999, 0.0003206, 0.0003405, 0.0003592, 0.000374, 0.0003826, 0.0003841, 0.0003826,
0.0003802, 0.0003756, 0.0003549, 0.0003795, 0.000344, 0.0002933, 0.0002024, 0.0001158, 8.46E-05,
7.14E-05, 6.86E-05, 8.5E-05, 8.93E-05, 9.01E-05, 8.15E-05, 6.67E-05, 4.37E-05, 3.28E-05, 2.96E-05,
2.65E-05, 2.57E-05, 2.81E-05, 3.08E-05, 3.67E-05, 5.85E-05, 6.63E-05, 6.36E-05, 5.5E-05, 4.06E-05,
2.77E-05, 2.42E-05, 1.87E-05, 1.6E-05, 1.4E-05, 1.13E-05, 1.05E-05, 9.8E-06, 9.8E-06, 1.13E-05,
1.64E-05, 1.95E-05, 2.38E-05, 2.26E-05, 2.03E-05, 1.48E-05, 1.09E-05, 9.8E-06, 1.05E-05, 1.17E-05,
1.25E-05, 1.21E-05, 1.09E-05, 9.8E-06, 8.2E-06, 6.6E-06, 4.7E-06, 2.7E-06, 1.9E-06, 1.2E-06, 4E-07,
2E-07, 1E-07
],
"frequency_offset":[
0, 0.5e12, 1e12, 1.5e12, 2e12, 2.5e12, 3e12, 3.5e12, 4e12, 4.5e12, 5e12, 5.5e12, 6e12, 6.5e12, 7e12,
7.5e12, 8e12, 8.5e12, 9e12, 9.5e12, 10e12, 10.5e12, 11e12, 11.5e12, 12e12, 12.5e12, 12.75e12,
13e12, 13.25e12, 13.5e12, 14e12, 14.5e12, 14.75e12, 15e12, 15.5e12, 16e12, 16.5e12, 17e12,
17.5e12, 18e12, 18.25e12, 18.5e12, 18.75e12, 19e12, 19.5e12, 20e12, 20.5e12, 21e12, 21.5e12,
22e12, 22.5e12, 23e12, 23.5e12, 24e12, 24.5e12, 25e12, 25.5e12, 26e12, 26.5e12, 27e12, 27.5e12, 28e12,
28.5e12, 29e12, 29.5e12, 30e12, 30.5e12, 31e12, 31.5e12, 32e12, 32.5e12, 33e12, 33.5e12, 34e12, 34.5e12,
35e12, 35.5e12, 36e12, 36.5e12, 37e12, 37.5e12, 38e12, 38.5e12, 39e12, 39.5e12, 40e12, 40.5e12, 41e12,
41.5e12, 42e12
]
}
"effective_area": 83e-12,
"pmd_coef": 1.265e-15
}
],
"Span":[{
@@ -245,6 +221,7 @@
"target_pch_out_db": -20,
"add_drop_osnr": 38,
"pmd": 0,
"pdl": 0,
"restrictions": {
"preamp_variety_list":[],
"booster_variety_list":[]

View File

@@ -1,95 +1,80 @@
{ "Edfa":[
{
{
"Edfa": [
{
"type_variety": "openroadm_ila_low_noise",
"type_def": "openroadm",
"gain_flatmax": 27,
"gain_min": 0,
"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,
"pdl": 0.7,
"allowed_for_design": true
},
{
},
{
"type_variety": "openroadm_ila_standard",
"type_def": "openroadm",
"gain_flatmax": 27,
"gain_min": 0,
"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,
"pdl": 0.7,
"allowed_for_design": true
},
{
},
{
"type_variety": "openroadm_mw_mw_preamp",
"type_def": "openroadm_preamp",
"gain_flatmax": 27,
"gain_min": 0,
"p_max": 22,
"pmd": 0,
"pdl": 0,
"allowed_for_design": false
},
{
},
{
"type_variety": "openroadm_mw_mw_booster",
"type_def": "openroadm_booster",
"gain_flatmax": 32,
"gain_min": 0,
"p_max": 22,
"pmd": 0,
"pdl": 0,
"allowed_for_design": false
}
],
"Fiber":[
{
}
],
"Fiber": [
{
"type_variety": "SSMF",
"dispersion": 1.67e-05,
"gamma": 0.00127,
"effective_area": 83e-12,
"pmd_coef": 1.265e-15
},
{
},
{
"type_variety": "NZDF",
"dispersion": 0.5e-05,
"gamma": 0.00146,
"effective_area": 72e-12,
"pmd_coef": 1.265e-15
},
{
},
{
"type_variety": "LOF",
"dispersion": 2.2e-05,
"gamma": 0.000843,
"effective_area": 125e-12,
"pmd_coef": 1.265e-15
}
],
"RamanFiber":[
{
}
],
"RamanFiber": [
{
"type_variety": "SSMF",
"dispersion": 1.67e-05,
"gamma": 0.00127,
"pmd_coef": 1.265e-15,
"raman_efficiency": {
"cr":[
0, 9.4E-06, 2.92E-05, 4.88E-05, 6.82E-05, 8.31E-05, 9.4E-05, 0.0001014, 0.0001069, 0.0001119,
0.0001217, 0.0001268, 0.0001365, 0.000149, 0.000165, 0.000181, 0.0001977, 0.0002192, 0.0002469,
0.0002749, 0.0002999, 0.0003206, 0.0003405, 0.0003592, 0.000374, 0.0003826, 0.0003841, 0.0003826,
0.0003802, 0.0003756, 0.0003549, 0.0003795, 0.000344, 0.0002933, 0.0002024, 0.0001158, 8.46E-05,
7.14E-05, 6.86E-05, 8.5E-05, 8.93E-05, 9.01E-05, 8.15E-05, 6.67E-05, 4.37E-05, 3.28E-05, 2.96E-05,
2.65E-05, 2.57E-05, 2.81E-05, 3.08E-05, 3.67E-05, 5.85E-05, 6.63E-05, 6.36E-05, 5.5E-05, 4.06E-05,
2.77E-05, 2.42E-05, 1.87E-05, 1.6E-05, 1.4E-05, 1.13E-05, 1.05E-05, 9.8E-06, 9.8E-06, 1.13E-05,
1.64E-05, 1.95E-05, 2.38E-05, 2.26E-05, 2.03E-05, 1.48E-05, 1.09E-05, 9.8E-06, 1.05E-05, 1.17E-05,
1.25E-05, 1.21E-05, 1.09E-05, 9.8E-06, 8.2E-06, 6.6E-06, 4.7E-06, 2.7E-06, 1.9E-06, 1.2E-06, 4E-07,
2E-07, 1E-07
],
"frequency_offset":[
0, 0.5e12, 1e12, 1.5e12, 2e12, 2.5e12, 3e12, 3.5e12, 4e12, 4.5e12, 5e12, 5.5e12, 6e12, 6.5e12, 7e12,
7.5e12, 8e12, 8.5e12, 9e12, 9.5e12, 10e12, 10.5e12, 11e12, 11.5e12, 12e12, 12.5e12, 12.75e12,
13e12, 13.25e12, 13.5e12, 14e12, 14.5e12, 14.75e12, 15e12, 15.5e12, 16e12, 16.5e12, 17e12,
17.5e12, 18e12, 18.25e12, 18.5e12, 18.75e12, 19e12, 19.5e12, 20e12, 20.5e12, 21e12, 21.5e12,
22e12, 22.5e12, 23e12, 23.5e12, 24e12, 24.5e12, 25e12, 25.5e12, 26e12, 26.5e12, 27e12, 27.5e12, 28e12,
28.5e12, 29e12, 29.5e12, 30e12, 30.5e12, 31e12, 31.5e12, 32e12, 32.5e12, 33e12, 33.5e12, 34e12, 34.5e12,
35e12, 35.5e12, 36e12, 36.5e12, 37e12, 37.5e12, 38e12, 38.5e12, 39e12, 39.5e12, 40e12, 40.5e12, 41e12,
41.5e12, 42e12
]
}
}
],
"Span":[
{
"power_mode":true,
"delta_power_range_db": [0,0,0],
"effective_area": 83e-12,
"pmd_coef": 1.265e-15
}
],
"Span": [
{
"power_mode": true,
"delta_power_range_db": [0, 0, 0],
"max_fiber_lineic_loss_for_raman": 0.25,
"target_extended_gain": 0,
"max_length": 135,
@@ -99,92 +84,266 @@
"EOL": 0,
"con_in": 0,
"con_out": 0
}
],
"Roadm":[
{
}
],
"Roadm": [
{
"target_pch_out_db": -20,
"add_drop_osnr": 30,
"pmd": 0,
"pmd": 3e-12,
"pdl": 1.5,
"restrictions": {
"preamp_variety_list":["openroadm_mw_mw_preamp"],
"booster_variety_list":["openroadm_mw_mw_booster"]
}
"preamp_variety_list": ["openroadm_mw_mw_preamp"],
"booster_variety_list": ["openroadm_mw_mw_booster"]
}
],
"SI":[
{
}
],
"SI": [
{
"f_min": 191.3e12,
"baud_rate": 31.57e9,
"f_max":196.1e12,
"f_max": 196.1e12,
"spacing": 50e9,
"power_dbm": 2,
"power_range_db": [0,0,1],
"power_range_db": [0, 0, 1],
"roll_off": 0.15,
"tx_osnr": 35,
"sys_margins": 2
}
],
"Transceiver":[
{
}
],
"Transceiver": [
{
"type_variety": "OpenROADM MSA ver. 4.0",
"frequency":{
"min": 191.35e12,
"max": 196.1e12
"frequency": {
"min": 191.35e12,
"max": 196.1e12
},
"mode": [
{
"format": "100 Gbit/s, 27.95 Gbaud, DP-QPSK",
"baud_rate": 27.95e9,
"OSNR": 17,
"bit_rate": 100e9,
"roll_off": null,
"tx_osnr": 33,
"penalties": [
{
"chromatic_dispersion": 4e3,
"penalty_value": 0
},
"mode":[
{
"format": "100 Gbit/s, 27.95 Gbaud, DP-QPSK",
"baud_rate": 27.95e9,
"OSNR": 17,
"bit_rate": 100e9,
"roll_off": null,
"tx_osnr": 33,
"min_spacing": 50e9,
"cost":1
},
{
"format": "100 Gbit/s, 31.57 Gbaud, DP-QPSK",
"baud_rate": 31.57e9,
"OSNR": 12,
"bit_rate": 100e9,
"roll_off": 0.15,
"tx_osnr": 35,
"min_spacing": 50e9,
"cost":1
},
{
"format": "200 Gbit/s, DP-QPSK",
"baud_rate": 63.1e9,
"OSNR": 17,
"bit_rate": 200e9,
"roll_off": 0.15,
"tx_osnr": 36,
"min_spacing": 87.5e9,
"cost":1
},
{
"format": "300 Gbit/s, DP-8QAM",
"baud_rate": 63.1e9,
"OSNR": 21,
"bit_rate": 300e9,
"roll_off": 0.15,
"tx_osnr": 36,
"min_spacing": 87.5e9,
"cost":1
},
{
"format": "400 Gbit/s, DP-16QAM",
"baud_rate": 63.1e9,
"OSNR": 24,
"bit_rate": 400e9,
"roll_off": 0.15,
"tx_osnr": 36,
"min_spacing": 87.5e9,
"cost":1
}
]
}
]
{
"chromatic_dispersion": 18e3,
"penalty_value": 0.5
},
{
"pmd": 10,
"penalty_value": 0
},
{
"pmd": 30,
"penalty_value": 0.5
},
{
"pdl": 1,
"penalty_value": 0.5
},
{
"pdl": 2,
"penalty_value": 1
},
{
"pdl": 4,
"penalty_value": 2.5
},
{
"pdl": 6,
"penalty_value": 4
}
],
"min_spacing": 50e9,
"cost": 1
},
{
"format": "100 Gbit/s, 31.57 Gbaud, DP-QPSK",
"baud_rate": 31.57e9,
"OSNR": 12,
"bit_rate": 100e9,
"roll_off": 0.15,
"tx_osnr": 35,
"penalties": [
{
"chromatic_dispersion": -1e3,
"penalty_value": 0
},
{
"chromatic_dispersion": 4e3,
"penalty_value": 0
},
{
"chromatic_dispersion": 40e3,
"penalty_value": 0.5
},
{
"pmd": 10,
"penalty_value": 0
},
{
"pmd": 30,
"penalty_value": 0.5
},
{
"pdl": 1,
"penalty_value": 0.5
},
{
"pdl": 2,
"penalty_value": 1
},
{
"pdl": 4,
"penalty_value": 2.5
},
{
"pdl": 6,
"penalty_value": 4
}
],
"min_spacing": 50e9,
"cost": 1
},
{
"format": "200 Gbit/s, DP-QPSK",
"baud_rate": 63.1e9,
"OSNR": 17,
"bit_rate": 200e9,
"roll_off": 0.15,
"tx_osnr": 36,
"penalties": [
{
"chromatic_dispersion": -1e3,
"penalty_value": 0
},
{
"chromatic_dispersion": 4e3,
"penalty_value": 0
},
{
"chromatic_dispersion": 24e3,
"penalty_value": 0.5
},
{
"pmd": 10,
"penalty_value": 0
},
{
"pmd": 25,
"penalty_value": 0.5
},
{
"pdl": 1,
"penalty_value": 0.5
},
{
"pdl": 2,
"penalty_value": 1
},
{
"pdl": 4,
"penalty_value": 2.5
}
],
"min_spacing": 87.5e9,
"cost": 1
},
{
"format": "300 Gbit/s, DP-8QAM",
"baud_rate": 63.1e9,
"OSNR": 21,
"bit_rate": 300e9,
"roll_off": 0.15,
"tx_osnr": 36,
"penalties": [
{
"chromatic_dispersion": -1e3,
"penalty_value": 0
},
{
"chromatic_dispersion": 4e3,
"penalty_value": 0
},
{
"chromatic_dispersion": 18e3,
"penalty_value": 0.5
},
{
"pmd": 10,
"penalty_value": 0
},
{
"pmd": 25,
"penalty_value": 0.5
},
{
"pdl": 1,
"penalty_value": 0.5
},
{
"pdl": 2,
"penalty_value": 1
},
{
"pdl": 4,
"penalty_value": 2.5
}
],
"min_spacing": 87.5e9,
"cost": 1
},
{
"format": "400 Gbit/s, DP-16QAM",
"baud_rate": 63.1e9,
"OSNR": 24,
"bit_rate": 400e9,
"roll_off": 0.15,
"tx_osnr": 36,
"penalties": [
{
"chromatic_dispersion": -1e3,
"penalty_value": 0
},
{
"chromatic_dispersion": 4e3,
"penalty_value": 0
},
{
"chromatic_dispersion": 12e3,
"penalty_value": 0.5
},
{
"pmd": 10,
"penalty_value": 0
},
{
"pmd": 20,
"penalty_value": 0.5
},
{
"pdl": 1,
"penalty_value": 0.5
},
{
"pdl": 2,
"penalty_value": 1
},
{
"pdl": 4,
"penalty_value": 2.5
}
],
"min_spacing": 87.5e9,
"cost": 1
}
]
}
]
}

View File

@@ -1,105 +1,92 @@
{ "Edfa":[
{
{
"Edfa": [
{
"type_variety": "openroadm_ila_low_noise",
"type_def": "openroadm",
"gain_flatmax": 27,
"gain_min": 0,
"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,
"pdl": 0.7,
"allowed_for_design": true
},
{
},
{
"type_variety": "openroadm_ila_standard",
"type_def": "openroadm",
"gain_flatmax": 27,
"gain_min": 0,
"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,
"pdl": 0.7,
"allowed_for_design": true
},
{
},
{
"type_variety": "openroadm_mw_mw_preamp_typical_ver5",
"type_def": "openroadm",
"gain_flatmax": 27,
"gain_min": 0,
"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,
"pdl": 0,
"allowed_for_design": false
},
{
},
{
"type_variety": "openroadm_mw_mw_preamp_worstcase_ver5",
"type_def": "openroadm",
"gain_flatmax": 27,
"gain_min": 0,
"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,
"pdl": 0,
"allowed_for_design": false
},
{
},
{
"type_variety": "openroadm_mw_mw_booster",
"type_def": "openroadm_booster",
"gain_flatmax": 32,
"gain_min": 0,
"p_max": 22,
"pmd": 0,
"pdl": 0,
"allowed_for_design": false
}
],
"Fiber":[
{
}
],
"Fiber": [
{
"type_variety": "SSMF",
"dispersion": 1.67e-05,
"gamma": 0.00127,
"effective_area": 83e-12,
"pmd_coef": 1.265e-15
},
{
},
{
"type_variety": "NZDF",
"dispersion": 0.5e-05,
"gamma": 0.00146,
"effective_area": 72e-12,
"pmd_coef": 1.265e-15
},
{
},
{
"type_variety": "LOF",
"dispersion": 2.2e-05,
"gamma": 0.000843,
"effective_area": 125e-12,
"pmd_coef": 1.265e-15
}
],
"RamanFiber":[
{
}
],
"RamanFiber": [
{
"type_variety": "SSMF",
"dispersion": 1.67e-05,
"gamma": 0.00127,
"pmd_coef": 1.265e-15,
"raman_efficiency": {
"cr":[
0, 9.4E-06, 2.92E-05, 4.88E-05, 6.82E-05, 8.31E-05, 9.4E-05, 0.0001014, 0.0001069, 0.0001119,
0.0001217, 0.0001268, 0.0001365, 0.000149, 0.000165, 0.000181, 0.0001977, 0.0002192, 0.0002469,
0.0002749, 0.0002999, 0.0003206, 0.0003405, 0.0003592, 0.000374, 0.0003826, 0.0003841, 0.0003826,
0.0003802, 0.0003756, 0.0003549, 0.0003795, 0.000344, 0.0002933, 0.0002024, 0.0001158, 8.46E-05,
7.14E-05, 6.86E-05, 8.5E-05, 8.93E-05, 9.01E-05, 8.15E-05, 6.67E-05, 4.37E-05, 3.28E-05, 2.96E-05,
2.65E-05, 2.57E-05, 2.81E-05, 3.08E-05, 3.67E-05, 5.85E-05, 6.63E-05, 6.36E-05, 5.5E-05, 4.06E-05,
2.77E-05, 2.42E-05, 1.87E-05, 1.6E-05, 1.4E-05, 1.13E-05, 1.05E-05, 9.8E-06, 9.8E-06, 1.13E-05,
1.64E-05, 1.95E-05, 2.38E-05, 2.26E-05, 2.03E-05, 1.48E-05, 1.09E-05, 9.8E-06, 1.05E-05, 1.17E-05,
1.25E-05, 1.21E-05, 1.09E-05, 9.8E-06, 8.2E-06, 6.6E-06, 4.7E-06, 2.7E-06, 1.9E-06, 1.2E-06, 4E-07,
2E-07, 1E-07
],
"frequency_offset":[
0, 0.5e12, 1e12, 1.5e12, 2e12, 2.5e12, 3e12, 3.5e12, 4e12, 4.5e12, 5e12, 5.5e12, 6e12, 6.5e12, 7e12,
7.5e12, 8e12, 8.5e12, 9e12, 9.5e12, 10e12, 10.5e12, 11e12, 11.5e12, 12e12, 12.5e12, 12.75e12,
13e12, 13.25e12, 13.5e12, 14e12, 14.5e12, 14.75e12, 15e12, 15.5e12, 16e12, 16.5e12, 17e12,
17.5e12, 18e12, 18.25e12, 18.5e12, 18.75e12, 19e12, 19.5e12, 20e12, 20.5e12, 21e12, 21.5e12,
22e12, 22.5e12, 23e12, 23.5e12, 24e12, 24.5e12, 25e12, 25.5e12, 26e12, 26.5e12, 27e12, 27.5e12, 28e12,
28.5e12, 29e12, 29.5e12, 30e12, 30.5e12, 31e12, 31.5e12, 32e12, 32.5e12, 33e12, 33.5e12, 34e12, 34.5e12,
35e12, 35.5e12, 36e12, 36.5e12, 37e12, 37.5e12, 38e12, 38.5e12, 39e12, 39.5e12, 40e12, 40.5e12, 41e12,
41.5e12, 42e12
]
}
}
],
"Span":[
{
"power_mode":true,
"delta_power_range_db": [0,0,0],
"effective_area": 83e-12,
"pmd_coef": 1.265e-15
}
],
"Span": [
{
"power_mode": true,
"delta_power_range_db": [0, 0, 0],
"max_fiber_lineic_loss_for_raman": 0.25,
"target_extended_gain": 0,
"max_length": 135,
@@ -109,102 +96,314 @@
"EOL": 0,
"con_in": 0,
"con_out": 0
}
],
"Roadm":[
{
}
],
"Roadm": [
{
"target_pch_out_db": -20,
"add_drop_osnr": 33,
"pmd": 0,
"pmd": 3e-12,
"pdl": 1.5,
"restrictions": {
"preamp_variety_list":["openroadm_mw_mw_preamp_worstcase_ver5"],
"booster_variety_list":["openroadm_mw_mw_booster"]
}
"preamp_variety_list": ["openroadm_mw_mw_preamp_worstcase_ver5"],
"booster_variety_list": ["openroadm_mw_mw_booster"]
}
],
"SI":[
{
}
],
"SI": [
{
"f_min": 191.3e12,
"baud_rate": 31.57e9,
"f_max":196.1e12,
"f_max": 196.1e12,
"spacing": 50e9,
"power_dbm": 2,
"power_range_db": [0,0,1],
"power_range_db": [0, 0, 1],
"roll_off": 0.15,
"tx_osnr": 35,
"sys_margins": 2
}
],
"Transceiver":[
{
}
],
"Transceiver": [
{
"type_variety": "OpenROADM MSA ver. 5.0",
"frequency":{
"min": 191.35e12,
"max": 196.1e12
},
"mode":[
"frequency": {
"min": 191.35e12,
"max": 196.1e12
},
"mode": [
{
"format": "100 Gbit/s, 27.95 Gbaud, DP-QPSK",
"baud_rate": 27.95e9,
"OSNR": 17,
"bit_rate": 100e9,
"roll_off": null,
"tx_osnr": 33,
"penalties": [
{
"format": "100 Gbit/s, 27.95 Gbaud, DP-QPSK",
"baud_rate": 27.95e9,
"OSNR": 17,
"bit_rate": 100e9,
"roll_off": null,
"tx_osnr": 33,
"min_spacing": 50e9,
"cost":1
"chromatic_dispersion": 4e3,
"penalty_value": 0
},
{
"format": "100 Gbit/s, 31.57 Gbaud, DP-QPSK",
"baud_rate": 31.57e9,
"OSNR": 12,
"bit_rate": 100e9,
"roll_off": 0.15,
"tx_osnr": 36,
"min_spacing": 50e9,
"cost":1
"chromatic_dispersion": 18e3,
"penalty_value": 0.5
},
{
"format": "200 Gbit/s, 31.57 Gbaud, DP-16QAM",
"baud_rate": 31.57e9,
"OSNR": 20.5,
"bit_rate": 100e9,
"roll_off": 0.15,
"tx_osnr": 36,
"min_spacing": 50e9,
"cost":1
"pmd": 10,
"penalty_value": 0
},
{
"format": "200 Gbit/s, DP-QPSK",
"baud_rate": 63.1e9,
"OSNR": 17,
"bit_rate": 200e9,
"roll_off": 0.15,
"tx_osnr": 36,
"min_spacing": 87.5e9,
"cost":1
"pmd": 30,
"penalty_value": 0.5
},
{
"format": "300 Gbit/s, DP-8QAM",
"baud_rate": 63.1e9,
"OSNR": 21,
"bit_rate": 300e9,
"roll_off": 0.15,
"tx_osnr": 36,
"min_spacing": 87.5e9,
"cost":1
"pdl": 1,
"penalty_value": 0.5
},
{
"format": "400 Gbit/s, DP-16QAM",
"baud_rate": 63.1e9,
"OSNR": 24,
"bit_rate": 400e9,
"roll_off": 0.15,
"tx_osnr": 36,
"min_spacing": 87.5e9,
"cost":1
"pdl": 2,
"penalty_value": 1
},
{
"pdl": 4,
"penalty_value": 2.5
},
{
"pdl": 6,
"penalty_value": 4
}
]
}
]
],
"min_spacing": 50e9,
"cost": 1
},
{
"format": "100 Gbit/s, 31.57 Gbaud, DP-QPSK",
"baud_rate": 31.57e9,
"OSNR": 12,
"bit_rate": 100e9,
"roll_off": 0.15,
"tx_osnr": 36,
"penalties": [
{
"chromatic_dispersion": -1e3,
"penalty_value": 0
},
{
"chromatic_dispersion": 4e3,
"penalty_value": 0
},
{
"chromatic_dispersion": 48e3,
"penalty_value": 0.5
},
{
"pmd": 10,
"penalty_value": 0
},
{
"pmd": 30,
"penalty_value": 0.5
},
{
"pdl": 1,
"penalty_value": 0.5
},
{
"pdl": 2,
"penalty_value": 1
},
{
"pdl": 4,
"penalty_value": 2.5
},
{
"pdl": 6,
"penalty_value": 4
}
],
"min_spacing": 50e9,
"cost": 1
},
{
"format": "200 Gbit/s, 31.57 Gbaud, DP-16QAM",
"baud_rate": 31.57e9,
"OSNR": 20.5,
"bit_rate": 100e9,
"roll_off": 0.15,
"tx_osnr": 36,
"penalties": [
{
"chromatic_dispersion": -1e3,
"penalty_value": 0
},
{
"chromatic_dispersion": 4e3,
"penalty_value": 0
},
{
"chromatic_dispersion": 24e3,
"penalty_value": 0.5
},
{
"pmd": 10,
"penalty_value": 0
},
{
"pmd": 30,
"penalty_value": 0.5
},
{
"pdl": 1,
"penalty_value": 0.5
},
{
"pdl": 2,
"penalty_value": 1
},
{
"pdl": 4,
"penalty_value": 2.5
},
{
"pdl": 6,
"penalty_value": 4
}
],
"min_spacing": 50e9,
"cost": 1
},
{
"format": "200 Gbit/s, DP-QPSK",
"baud_rate": 63.1e9,
"OSNR": 17,
"bit_rate": 200e9,
"roll_off": 0.15,
"tx_osnr": 36,
"penalties": [
{
"chromatic_dispersion": -1e3,
"penalty_value": 0
},
{
"chromatic_dispersion": 4e3,
"penalty_value": 0
},
{
"chromatic_dispersion": 24e3,
"penalty_value": 0.5
},
{
"pmd": 10,
"penalty_value": 0
},
{
"pmd": 25,
"penalty_value": 0.5
},
{
"pdl": 1,
"penalty_value": 0.5
},
{
"pdl": 2,
"penalty_value": 1
},
{
"pdl": 4,
"penalty_value": 2.5
}
],
"min_spacing": 87.5e9,
"cost": 1
},
{
"format": "300 Gbit/s, DP-8QAM",
"baud_rate": 63.1e9,
"OSNR": 21,
"bit_rate": 300e9,
"roll_off": 0.15,
"tx_osnr": 36,
"penalties": [
{
"chromatic_dispersion": -1e3,
"penalty_value": 0
},
{
"chromatic_dispersion": 4e3,
"penalty_value": 0
},
{
"chromatic_dispersion": 18e3,
"penalty_value": 0.5
},
{
"pmd": 10,
"penalty_value": 0
},
{
"pmd": 25,
"penalty_value": 0.5
},
{
"pdl": 1,
"penalty_value": 0.5
},
{
"pdl": 2,
"penalty_value": 1
},
{
"pdl": 4,
"penalty_value": 2.5
}
],
"min_spacing": 87.5e9,
"cost": 1
},
{
"format": "400 Gbit/s, DP-16QAM",
"baud_rate": 63.1e9,
"OSNR": 24,
"bit_rate": 400e9,
"roll_off": 0.15,
"tx_osnr": 36,
"penalties": [
{
"chromatic_dispersion": -1e3,
"penalty_value": 0
},
{
"chromatic_dispersion": 4e3,
"penalty_value": 0
},
{
"chromatic_dispersion": 12e3,
"penalty_value": 0.5
},
{
"pmd": 10,
"penalty_value": 0
},
{
"pmd": 20,
"penalty_value": 0.5
},
{
"pdl": 1,
"penalty_value": 0.5
},
{
"pdl": 2,
"penalty_value": 1
},
{
"pdl": 4,
"penalty_value": 2.5
}
],
"min_spacing": 87.5e9,
"cost": 1
}
]
}
]
}

View File

@@ -0,0 +1,12 @@
{
"spectrum":[
{
"f_min": 191.35e12,
"f_max": 195.1e12,
"baud_rate": 32e9,
"slot_width": 50e9,
"roll_off": 0.15,
"tx_osnr": 40
}
]
}

View File

@@ -0,0 +1,23 @@
{
"spectrum":[
{
"f_min": 191.4e12,
"f_max":193.1e12,
"baud_rate": 32e9,
"slot_width": 50e9,
"delta_pdb": 0,
"roll_off": 0.15,
"tx_osnr": 40,
"label": "mode_1"
},
{
"f_min": 193.1625e12,
"f_max":195e12,
"baud_rate": 64e9,
"slot_width": 75e9,
"roll_off": 0.15,
"tx_osnr": 40,
"label": "mode_2"
}
]
}

View File

@@ -20,12 +20,12 @@
"temperature": 283,
"raman_pumps": [
{
"power": 200e-3,
"power": 224.403e-3,
"frequency": 205e12,
"propagation_direction": "counterprop"
},
{
"power": 206e-3,
"power": 231.135e-3,
"frequency": 201e12,
"propagation_direction": "counterprop"
}
@@ -49,6 +49,21 @@
}
}
},
{
"uid": "Fused1",
"type": "Fused",
"params": {
"loss": 0
},
"metadata": {
"location": {
"latitude": 1.5,
"longitude": 0,
"city": null,
"region": ""
}
}
},
{
"uid": "Edfa1",
"type": "Edfa",
@@ -88,6 +103,10 @@
},
{
"from_node": "Span1",
"to_node": "Fused1"
},
{
"from_node": "Fused1",
"to_node": "Edfa1"
},
{

View File

@@ -1,14 +1,13 @@
{
"raman_parameters": {
"flag_raman": true,
"space_resolution": 10e3,
"tolerance": 1e-8
"raman_params": {
"flag": true,
"result_spatial_resolution": 10e3,
"solver_spatial_resolution": 50
},
"nli_parameters": {
"nli_method_name": "ggn_spectrally_separated",
"wdm_grid_size": 50e9,
"dispersion_tolerance": 1,
"phase_shift_tolerance": 0.1,
"computed_channels": [1, 18, 37, 56, 75]
"nli_params": {
"method": "ggn_spectrally_separated",
"dispersion_tolerance": 1,
"phase_shift_tolerance": 0.1,
"computed_channels": [1, 18, 37, 56, 75]
}
}
}

View File

@@ -10,26 +10,25 @@ Common code for CLI examples
import argparse
import logging
import os.path
import sys
from math import ceil
from numpy import linspace, mean
from pathlib import Path
import gnpy.core.ansi_escapes as ansi_escapes
from gnpy.core.elements import Transceiver, Fiber, RamanFiber
from gnpy.core.equipment import trx_mode_params
import gnpy.core.exceptions as exceptions
from gnpy.core.network import build_network
from gnpy.core.parameters import SimParams
from gnpy.core.science_utils import Simulation
from gnpy.core.utils import db2lin, lin2db, automatic_nch
from gnpy.topology.request import (ResultElement, jsontocsv, compute_path_dsjctn, requests_aggregation,
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, \
requests_from_json, disjunctions_from_json, save_json
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)
from gnpy.tools.plots import plot_baseline, plot_results
_logger = logging.getLogger(__name__)
@@ -57,14 +56,15 @@ def load_common_data(equipment_filename, topology_filename, simulation_filename,
if save_raw_network_filename is not None:
save_network(network, save_raw_network_filename)
print(f'{ansi_escapes.blue}Raw network (no optimizations) saved to {save_raw_network_filename}{ansi_escapes.reset}')
sim_params = SimParams(**load_json(simulation_filename)) if simulation_filename is not None else None
if not sim_params:
if not simulation_filename:
sim_params = {}
if next((node for node in network if isinstance(node, RamanFiber)), None) is not None:
print(f'{ansi_escapes.red}Invocation error:{ansi_escapes.reset} '
f'RamanFiber requires passing simulation params via --sim-params')
sys.exit(1)
else:
Simulation.set_params(sim_params)
sim_params = load_json(simulation_filename)
SimParams.set_params(sim_params)
except exceptions.EquipmentConfigError as e:
print(f'{ansi_escapes.red}Configuration error in the equipment library:{ansi_escapes.reset} {e}')
sys.exit(1)
@@ -119,6 +119,7 @@ def transmission_main_example(args=None):
parser.add_argument('-pl', '--plot', action='store_true')
parser.add_argument('-l', '--list-nodes', action='store_true', help='list all transceiver nodes')
parser.add_argument('-po', '--power', default=0, help='channel ref power in dBm')
parser.add_argument('--spectrum', type=Path, help='user defined mixed rate spectrum JSON file')
parser.add_argument('source', nargs='?', help='source node')
parser.add_argument('destination', nargs='?', help='destination node')
@@ -195,12 +196,21 @@ def transmission_main_example(args=None):
if args.power:
trx_params['power'] = db2lin(float(args.power)) * 1e-3
params.update(trx_params)
initial_spectrum = None
nb_channels = automatic_nch(trx_params['f_min'], trx_params['f_max'], trx_params['spacing'])
if args.spectrum:
initial_spectrum = load_initial_spectrum(args.spectrum)
nb_channels = len(initial_spectrum)
print('User input for spectrum used for propagation instead of SI')
params['nb_channel'] = nb_channels
req = PathRequest(**params)
req.initial_spectrum = initial_spectrum
print(f'There are {nb_channels} channels propagating')
power_mode = equipment['Span']['default'].power_mode
print('\n'.join([f'Power mode is set to {power_mode}',
f'=> it can be modified in eqpt_config.json - Span']))
# Keep the reference channel for design: the one from SI, with full load same channels
pref_ch_db = lin2db(req.power * 1e3) # reference channel power / span (SL=20dB)
pref_total_db = pref_ch_db + lin2db(req.nb_channel) # reference total power / span (SL=20dB)
try:
@@ -227,9 +237,13 @@ def transmission_main_example(args=None):
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]')
for dp_db in power_range:
req.power = db2lin(pref_ch_db + dp_db) * 1e-3
# if initial spectrum did not contain any power, now we need to use this one.
# note the initial power defines a differential wrt req.power so that if req.power is set to 2mW (3dBm)
# and initial spectrum was set to 0, this sets a initial per channel delta power to -3dB, so that
# whatever the equalization, -3 dB is applied on all channels (ie initial power in initial spectrum pre-empts
# "--power" option)
if power_mode:
print(f'\nPropagating with input power = {ansi_escapes.cyan}{lin2db(req.power*1e3):.2f} dBm{ansi_escapes.reset}:')
else:
@@ -265,9 +279,9 @@ def transmission_main_example(args=None):
ch_freq = final_carrier.frequency * 1e-12
ch_power = lin2db(final_carrier.power.signal * 1e3)
print(
'{:5}{:26.2f}{:26.2f}{:28.2f}{:28.2f}{:28.2f}' .format(
'{:5}{:26.5f}{:26.2f}{:28.2f}{:28.2f}{:28.2f}' .format(
final_carrier.channel_number, round(
ch_freq, 2), round(
ch_freq, 5), round(
ch_power, 2), round(
ch_osnr, 2), round(
ch_snr_nl, 2), round(

View File

@@ -13,10 +13,13 @@ from logging import getLogger
from pathlib import Path
import json
from collections import namedtuple
from numpy import arange
from gnpy.core import ansi_escapes, elements
from gnpy.core.equipment import trx_mode_params
from gnpy.core.exceptions import ConfigurationError, EquipmentConfigError, NetworkTopologyError, ServiceError
from gnpy.core.science_utils import estimate_nf_model
from gnpy.core.info import Carrier
from gnpy.core.utils import automatic_nch, automatic_fmax, merge_amplifier_restrictions
from gnpy.topology.request import PathRequest, Disjunction, compute_spectrum_slot_vs_bandwidth
from gnpy.tools.convert import xls_to_json_data
@@ -91,9 +94,9 @@ class Span(_JsonThing):
class Roadm(_JsonThing):
default_values = {
'target_pch_out_db': -17,
'add_drop_osnr': 100,
'pmd': 0,
'pdl': 0,
'restrictions': {
'preamp_variety_list': [],
'booster_variety_list': []
@@ -101,6 +104,20 @@ class Roadm(_JsonThing):
}
def __init__(self, **kwargs):
# If equalization is not defined in equipment, then raise an error.
# Only one type of equalization must be defined.
allowed_equalisations = ['target_pch_out_db', 'target_psd_out_mWperGHz', 'target_out_mWperSlotWidth']
requested_eq_mask = [eq in kwargs for eq in allowed_equalisations]
if sum(requested_eq_mask) > 1:
raise EquipmentConfigError('Only one equalization type should be set in ROADM, found: '
+ ', '.join(eq for eq in allowed_equalisations if eq in kwargs))
if not any(requested_eq_mask):
raise EquipmentConfigError('No equalization type set in ROADM')
for key in allowed_equalisations:
if key in kwargs:
setattr(self, key, kwargs[key])
break
self.update_attr(self.default_values, kwargs, 'Roadm')
@@ -113,36 +130,45 @@ class Transceiver(_JsonThing):
def __init__(self, **kwargs):
self.update_attr(self.default_values, kwargs, 'Transceiver')
for mode_params in self.mode:
penalties = mode_params.get('penalties')
mode_params['penalties'] = {}
if not penalties:
continue
for impairment in ('chromatic_dispersion', 'pmd', 'pdl'):
imp_penalties = [p for p in penalties if impairment in p]
if not imp_penalties:
continue
if all(p[impairment] > 0 for p in imp_penalties):
# make sure the list of penalty values include a proper lower boundary
# (we assume 0 penalty for 0 impairment)
imp_penalties.insert(0, {impairment: 0, 'penalty_value': 0})
# make sure the list of penalty values are sorted by impairment value
imp_penalties.sort(key=lambda i: i[impairment])
# rearrange as dict of lists instead of list of dicts
mode_params['penalties'][impairment] = {
'up_to_boundary': [p[impairment] for p in imp_penalties],
'penalty_value': [p['penalty_value'] for p in imp_penalties]
}
class Fiber(_JsonThing):
default_values = {
'type_variety': '',
'dispersion': None,
'gamma': 0,
'effective_area': None,
'pmd_coef': 0
}
def __init__(self, **kwargs):
self.update_attr(self.default_values, kwargs, 'Fiber')
self.update_attr(self.default_values, kwargs, self.__class__.__name__)
for optional in ['gamma', 'raman_efficiency']:
if optional in kwargs:
setattr(self, optional, kwargs[optional])
class RamanFiber(_JsonThing):
default_values = {
'type_variety': '',
'dispersion': None,
'gamma': 0,
'pmd_coef': 0,
'raman_efficiency': None
}
def __init__(self, **kwargs):
self.update_attr(self.default_values, kwargs, 'RamanFiber')
for param in ('cr', 'frequency_offset'):
if param not in self.raman_efficiency:
raise EquipmentConfigError(f'RamanFiber.raman_efficiency: missing "{param}" parameter')
if self.raman_efficiency['frequency_offset'] != sorted(self.raman_efficiency['frequency_offset']):
raise EquipmentConfigError(f'RamanFiber.raman_efficiency.frequency_offset is not sorted')
class RamanFiber(Fiber):
pass
class Amp(_JsonThing):
@@ -162,7 +188,9 @@ class Amp(_JsonThing):
'gain_ripple': None,
'out_voa_auto': False,
'allowed_for_design': False,
'raman': False
'raman': False,
'pmd': 0,
'pdl': 0
}
def __init__(self, **kwargs):
@@ -237,11 +265,89 @@ def _automatic_spacing(baud_rate):
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
{f_min, f_max, baud_rate, roll_off, delta_pdb, slot_width, tx_osnr, label}
Creates the per freq Carrier's dict.
f_min, f_max, baud_rate, slot_width and roll_off are mandatory
label, tx_osnr and delta_pdb are created if not present
label should be different for each partition
>>> json_data = {'spectrum': \
[{'f_min': 193.2e12, 'f_max': 193.4e12, 'slot_width': 50e9, 'baud_rate': 32e9, 'roll_off': 0.15, \
'delta_pdb': 1, 'tx_osnr': 45},\
{'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.2e12, 'f_max': 194.35e12, 'slot_width': 50e9, 'baud_rate': 32e9, 'roll_off': 0.15}]}
>>> spectrum = _spectrum_from_json(json_data['spectrum'])
>>> for k, v in spectrum.items():
... 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')
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')
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')
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')
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')
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')
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')
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')
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')
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')
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')
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')
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')
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')
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')
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')
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')
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')
"""
spectrum = {}
json_data = sorted(json_data, key=lambda x: x['f_min'])
# min freq of occupation is f_min - slot_width/2 (numbering starts at 0)
previous_part_max_freq = 0.0
for index, part in enumerate(json_data):
# default delta_pdb is 0 dB
if 'delta_pdb' not in part:
part['delta_pdb'] = 0
# add a label to the partition for the printings
if 'label' not in part:
part['label'] = f'{index}-{part["baud_rate"] * 1e-9 :.2f}G'
# default tx_osnr is set to 40 dB
if 'tx_osnr' not in part:
part['tx_osnr'] = 40
# 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)
# supposes that carriers are centered on frequency
if previous_part_max_freq > (part['f_min'] - part['slot_width'] / 2):
# check that previous part last channel does not overlap on next part first channel
# max center of the part should be below part['f_max'] and aligned on the slot_width
msg = 'Not a valid initial spectrum definition:\nprevious spectrum last carrier max occupation ' +\
f'{previous_part_max_freq * 1e-12 :.5f}GHz ' +\
'overlaps on next spectrum first carrier occupation ' +\
f'{(part["f_min"] - part["slot_width"] / 2) * 1e-12 :.5f}GHz'
raise ValueError(msg)
max_range = ((part['f_max'] - part['f_min']) // part['slot_width'] + 1) * part['slot_width']
for current_freq in arange(part['f_min'],
part['f_min'] + max_range,
part['slot_width']):
spectrum[current_freq] = Carrier(delta_pdb=part['delta_pdb'], baud_rate=part['baud_rate'],
slot_width=part['slot_width'], roll_off=part['roll_off'],
tx_osnr=part['tx_osnr'], label=part['label'])
previous_part_max_freq = current_freq + part['slot_width'] / 2
return spectrum
def load_equipment(filename):
json_data = load_json(filename)
return _equipment_from_json(json_data, filename)
def load_initial_spectrum(filename):
json_data = load_json(filename)
return _spectrum_from_json(json_data['spectrum'])
def _update_dual_stage(equipment):
edfa_dict = equipment['Edfa']
for edfa in edfa_dict.values():
@@ -277,7 +383,7 @@ def _check_fiber_vs_raman_fiber(equipment):
if 'RamanFiber' not in equipment:
return
for fiber_type in set(equipment['Fiber'].keys()) & set(equipment['RamanFiber'].keys()):
for attr in ('dispersion', 'dispersion-slope', 'gamma', 'pmd-coefficient'):
for attr in ('dispersion', 'dispersion-slope', 'effective_area', 'gamma', 'pmd-coefficient'):
fiber = equipment['Fiber'][fiber_type]
raman = equipment['RamanFiber'][fiber_type]
a = getattr(fiber, attr, None)
@@ -372,9 +478,16 @@ def network_from_json(json_data, equipment):
# well, there's no variety for the 'Fused' node type
pass
elif variety in equipment[typ]:
extra_params = equipment[typ][variety]
extra_params = equipment[typ][variety].__dict__
temp = el_config.setdefault('params', {})
temp = merge_amplifier_restrictions(temp, extra_params.__dict__)
if typ == 'Roadm':
# if equalization is defined, remove default equalization from the extra_params
# If equalisation is not defined in the element config, then use the default one from equipment
# if more than one equalization was defined in element config, then raise an error
extra_params = merge_equalization(temp, extra_params)
if not extra_params:
raise ConfigurationError(f'ROADM {el_config["uid"]}: invalid equalization settings')
temp = merge_amplifier_restrictions(temp, extra_params)
el_config['params'] = temp
el_config['type_variety'] = variety
elif (typ in ['Fiber', 'RamanFiber']) or (typ == 'Edfa' and variety not in ['default', '']):
@@ -445,16 +558,16 @@ def requests_from_json(json_data, equipment):
for req in json_data['path-request']:
# init all params from request
params = {}
params['request_id'] = req['request-id']
params['request_id'] = f'{req["request-id"]}'
params['source'] = req['source']
params['bidir'] = req['bidirectional']
params['destination'] = req['destination']
params['trx_type'] = req['path-constraints']['te-bandwidth']['trx_type']
params['trx_mode'] = req['path-constraints']['te-bandwidth']['trx_mode']
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:
nd_list = req['explicit-route-objects']['route-object-include-exclude']
nd_list = sorted(req['explicit-route-objects']['route-object-include-exclude'], key=lambda x: x['index'])
except KeyError:
nd_list = []
params['nodes_list'] = [n['num-unnum-hop']['node-id'] for n in nd_list]
@@ -564,3 +677,42 @@ def convert_service_sheet(
data = read_service_sheet(input_filename, eqpt, network, network_filename, bidir)
save_json(data, output_filename)
return data
def find_equalisation(params, equalization_types):
"""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,
... 'restrictions': {'preamp_variety_list': ['a'], 'booster_variety_list': ['b']},
... 'target_psd_out_mWperGHz': 4e-4}
>>> equalization_types = ['target_pch_out_db', 'target_psd_out_mWperGHz']
>>> find_equalisation(roadm, equalization_types)
{'target_pch_out_db': False, 'target_psd_out_mWperGHz': True}
"""
equalization = {e: False for e in equalization_types}
for equ in equalization_types:
if equ in params:
equalization[equ] = True
return equalization
def merge_equalization(params, extra_params):
"""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.
Only one type of equalization must be defined: power (target_pch_out_db) or PSD (target_psd_out_mWperGHz)
or PSW (target_out_mWperSlotWidth)
params and extra_params are dict
"""
equalization_types = ['target_pch_out_db', 'target_psd_out_mWperGHz', 'target_out_mWperSlotWidth']
roadm_equalizations = find_equalisation(params, equalization_types)
if sum(roadm_equalizations.values()) > 1:
# if ROADM config contains more than one equalization type then this is an error
return None
if sum(roadm_equalizations.values()) == 1:
# if ROADM config contains one equalization
# don't use the default equalization
return {k: v for k, v in extra_params.items() if k not in equalization_types}
if sum(roadm_equalizations.values()) == 0:
# If ROADM config doesn't contain any equalization type, keep the default one
return extra_params
return None

View File

@@ -20,10 +20,10 @@ from logging import getLogger
from networkx import (dijkstra_path, NetworkXNoPath,
all_simple_paths, shortest_simple_paths)
from networkx.utils import pairwise
from numpy import mean
from numpy import mean, argmin
from gnpy.core.elements import Transceiver, Roadm
from gnpy.core.utils import lin2db
from gnpy.core.info import create_input_spectral_information
from gnpy.core.info import create_input_spectral_information, carriers_to_spectral_information, ReferenceCarrier
from gnpy.core.exceptions import ServiceError, DisjunctionError
import gnpy.core.ansi_escapes as ansi_escapes
from copy import deepcopy
@@ -32,12 +32,12 @@ from math import ceil
LOGGER = getLogger(__name__)
RequestParams = namedtuple('RequestParams', 'request_id source destination bidir trx_type' +
' trx_mode nodes_list loose_list spacing power nb_channel f_min' +
' f_max format baud_rate OSNR bit_rate roll_off tx_osnr' +
' min_spacing cost path_bandwidth effective_freq_slot')
DisjunctionParams = namedtuple('DisjunctionParams', 'disjunction_id relaxable link' +
'_diverse node_diverse disjunctions_req')
RequestParams = namedtuple('RequestParams', 'request_id source destination bidir trx_type'
' trx_mode nodes_list loose_list spacing power nb_channel f_min'
' f_max format baud_rate OSNR penalties bit_rate'
' roll_off tx_osnr min_spacing cost path_bandwidth effective_freq_slot')
DisjunctionParams = namedtuple('DisjunctionParams', 'disjunction_id relaxable link_diverse'
' node_diverse disjunctions_req')
class PathRequest:
@@ -62,6 +62,7 @@ class PathRequest:
self.f_max = params.f_max
self.format = params.format
self.OSNR = params.OSNR
self.penalties = params.penalties
self.bit_rate = params.bit_rate
self.roll_off = params.roll_off
self.tx_osnr = params.tx_osnr
@@ -71,6 +72,7 @@ class PathRequest:
if params.effective_freq_slot is not None:
self.N = params.effective_freq_slot['N']
self.M = params.effective_freq_slot['M']
self.initial_spectrum = None
def __str__(self):
return '\n\t'.join([f'{type(self).__name__} {self.request_id}',
@@ -338,20 +340,37 @@ def compute_constrained_path(network, req):
return total_path
def ref_carrier(equipment):
"""Create a reference carier based SI information with the specified request's power:
req_power records the power in W that the user has defined for a given request
(which might be different from the one used for the design).
"""
return ReferenceCarrier(baud_rate=equipment['SI']['default'].baud_rate,
slot_width=equipment['SI']['default'].spacing)
def propagate(path, req, equipment):
si = create_input_spectral_information(
req.f_min, req.f_max, req.roll_off, req.baud_rate,
req.power, req.spacing)
""" propagates signals in each element according to initial spectrum set by user
"""
if req.initial_spectrum is not None:
si = carriers_to_spectral_information(initial_spectrum=req.initial_spectrum,
power=req.power, ref_carrier=ref_carrier(equipment))
else:
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, spacing=req.spacing, tx_osnr=req.tx_osnr, ref_carrier=ref_carrier(equipment))
for i, el in enumerate(path):
if isinstance(el, Roadm):
si = el(si, degree=path[i+1].uid)
else:
si = el(si)
path[0].update_snr(req.tx_osnr)
path[0].update_snr(si.tx_osnr)
path[0].calc_penalties(req.penalties)
if any(isinstance(el, Roadm) for el in path):
path[-1].update_snr(req.tx_osnr, equipment['Roadm']['default'].add_drop_osnr)
path[-1].update_snr(si.tx_osnr, equipment['Roadm']['default'].add_drop_osnr)
else:
path[-1].update_snr(req.tx_osnr)
path[-1].update_snr(si.tx_osnr)
path[-1].calc_penalties(req.penalties)
return si
@@ -371,13 +390,18 @@ def propagate_and_optimize_mode(path, req, equipment):
float(this_mode['min_spacing']) <= req.spacing]
modes_to_explore = sorted(modes_to_explore,
key=lambda x: x['bit_rate'], reverse=True)
# print(modes_to_explore)
# step2: computes propagation for each baudrate: stop and select the first that passes
# TODO: the case of roll of is not included: for now use SI one
# TODO: the case of roll off is not included: for now use SI one
# TODO: if the loop in mode optimization does not have a feasible path, then bugs
spc_info = create_input_spectral_information(req.f_min, req.f_max,
equipment['SI']['default'].roll_off,
this_br, req.power, req.spacing)
if req.initial_spectrum is not None:
# this case is not yet handled: spectrum can not be defined for the path-request-run function
# and this function is only called in this case. so coming here should not be considered yet.
msg = f'Request: {req.request_id} contains a unexpected initial_spectrum.'
raise ServiceError(msg)
spc_info = create_input_spectral_information(f_min=req.f_min, f_max=req.f_max,
roll_off=equipment['SI']['default'].roll_off,
baud_rate=this_br, power=req.power, spacing=req.spacing,
tx_osnr=req.tx_osnr, ref_carrier=ref_carrier(equipment))
for i, el in enumerate(path):
if isinstance(el, Roadm):
spc_info = el(spc_info, degree=path[i+1].uid)
@@ -386,11 +410,13 @@ def propagate_and_optimize_mode(path, req, equipment):
for this_mode in modes_to_explore:
if path[-1].snr is not None:
path[0].update_snr(this_mode['tx_osnr'])
path[0].calc_penalties(this_mode['penalties'])
if any(isinstance(el, Roadm) for el in path):
path[-1].update_snr(this_mode['tx_osnr'], equipment['Roadm']['default'].add_drop_osnr)
else:
path[-1].update_snr(this_mode['tx_osnr'])
if round(min(path[-1].snr + lin2db(this_br / (12.5e9))), 2) \
path[-1].calc_penalties(this_mode['penalties'])
if round(min(path[-1].snr_01nm - path[-1].total_penalty), 2) \
> this_mode['OSNR'] + equipment['SI']['default'].sys_margins:
return path, this_mode
else:
@@ -1107,12 +1133,16 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
# means that at this point the mode was entered/forced by user and thus a
# baud_rate was defined
propagate(total_path, pathreq, equipment)
temp_snr01nm = round(mean(total_path[-1].snr+lin2db(pathreq.baud_rate/(12.5e9))), 2)
if temp_snr01nm < pathreq.OSNR + equipment['SI']['default'].sys_margins:
snr01nm_with_penalty = total_path[-1].snr_01nm - total_path[-1].total_penalty
min_ind = argmin(snr01nm_with_penalty)
if round(snr01nm_with_penalty[min_ind], 2) < pathreq.OSNR + equipment['SI']['default'].sys_margins:
msg = f'\tWarning! Request {pathreq.request_id} computed path from' +\
f' {pathreq.source} to {pathreq.destination} does not pass with' +\
f' {pathreq.tsp_mode}\n\tcomputedSNR in 0.1nm = {temp_snr01nm} ' +\
f'- required osnr {pathreq.OSNR} + {equipment["SI"]["default"].sys_margins} margin'
f' {pathreq.source} to {pathreq.destination} does not pass with {pathreq.tsp_mode}' +\
f'\n\tcomputed SNR in 0.1nm = {round(total_path[-1].snr_01nm[min_ind], 2)}' +\
f'\n\tCD penalty = {round(total_path[-1].penalties["chromatic_dispersion"][min_ind], 2)}' +\
f'\n\tPMD penalty = {round(total_path[-1].penalties["pmd"][min_ind], 2)}' +\
f'\n\trequired osnr = {pathreq.OSNR}' +\
f'\n\tsystem margin = {equipment["SI"]["default"].sys_margins}'
print(msg)
LOGGER.warning(msg)
pathreq.blocking_reason = 'MODE_NOT_FEASIBLE'
@@ -1133,6 +1163,7 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
pathreq.OSNR = mode['OSNR']
pathreq.tx_osnr = mode['tx_osnr']
pathreq.bit_rate = mode['bit_rate']
pathreq.penalties = mode['penalties']
# other blocking reason should not appear at this point
except AttributeError:
pathreq.baud_rate = mode['baud_rate']
@@ -1141,6 +1172,7 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
pathreq.OSNR = mode['OSNR']
pathreq.tx_osnr = mode['tx_osnr']
pathreq.bit_rate = mode['bit_rate']
pathreq.penalties = mode['penalties']
# reversed path is needed for correct spectrum assignment
reversed_path = find_reversed_path(pathlist[i])
@@ -1152,14 +1184,16 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
print(f'\tPath (roadsm) {[r.uid for r in rev_p if isinstance(r,Roadm)]}\n')
propagate(rev_p, pathreq, equipment)
propagated_reversed_path = rev_p
temp_snr01nm = round(mean(propagated_reversed_path[-1].snr +\
lin2db(pathreq.baud_rate/(12.5e9))), 2)
if temp_snr01nm < pathreq.OSNR + equipment['SI']['default'].sys_margins:
snr01nm_with_penalty = rev_p[-1].snr_01nm - rev_p[-1].total_penalty
min_ind = argmin(snr01nm_with_penalty)
if round(snr01nm_with_penalty[min_ind], 2) < pathreq.OSNR + equipment['SI']['default'].sys_margins:
msg = f'\tWarning! Request {pathreq.request_id} computed path from' +\
f' {pathreq.source} to {pathreq.destination} does not pass with' +\
f' {pathreq.tsp_mode}\n' +\
f'\tcomputedSNR in 0.1nm = {temp_snr01nm} -' \
f' required osnr {pathreq.OSNR} + {equipment["SI"]["default"].sys_margins} margin'
f' {pathreq.source} to {pathreq.destination} does not pass with {pathreq.tsp_mode}' +\
f'\n\tcomputed SNR in 0.1nm = {round(rev_p[-1].snr_01nm[min_ind], 2)}' +\
f'\n\tCD penalty = {round(rev_p[-1].penalties["chromatic_dispersion"][min_ind], 2)}' +\
f'\n\tPMD penalty = {round(rev_p[-1].penalties["pmd"][min_ind], 2)}' +\
f'\n\trequired osnr = {pathreq.OSNR}' +\
f'\n\tsystem margin = {equipment["SI"]["default"].sys_margins}'
print(msg)
LOGGER.warning(msg)
# TODO selection of mode should also be on reversed direction !!

View File

@@ -15,7 +15,6 @@ element/oms correspondace
from collections import namedtuple
from logging import getLogger
from math import ceil
from gnpy.core.elements import Roadm, Transceiver
from gnpy.core.exceptions import ServiceError, SpectrumError
from gnpy.topology.request import compute_spectrum_slot_vs_bandwidth
@@ -366,12 +365,6 @@ def spectrum_selection(pth, oms_list, requested_m, requested_n=None):
candidate = (requested_n, requested_n - requested_m, requested_n + requested_m - 1)
else:
candidate = (None, None, None)
# print("coucou11")
# print(candidate)
# print(freq_availability[321:321+2*m])
# a = [i+321 for i in range(2*m)]
# print(a)
# print(candidate)
return candidate, path_oms

View File

@@ -1,7 +1,6 @@
matplotlib>=3.3.3,<4
networkx>=2.5,<3
numpy>=1.19.4,<2
pandas>=1.1.5,<2
pbr>=5.5.1,<6
scipy>=1.5.4,<2
matplotlib>=3.5.1,<4
networkx>=2.6,<3
numpy>=1.22.0,<2
pbr>=5.7.0,<6
scipy>=1.7.3,<2
xlrd>=1.2.0,<2

View File

@@ -3,7 +3,7 @@ name = gnpy
description-file = README.md
description-content-type = text/markdown; variant=GFM
author = Telecom Infra Project
author-email = jan.kundrat@telecominfraproject.com
author-email = jkt@jankundrat.com
license = BSD-3-Clause
home-page = https://github.com/Telecominfraproject/oopt-gnpy
project_urls =
@@ -21,6 +21,8 @@ classifier =
Programming Language :: Python :: 3 :: Only
Programming Language :: Python :: 3.8
Programming Language :: Python :: 3.9
Programming Language :: Python :: 3.10
Programming Language :: Python :: 3.11
Programming Language :: Python :: Implementation :: CPython
Topic :: Scientific/Engineering
Topic :: Scientific/Engineering :: Physics
@@ -39,9 +41,6 @@ warnerrors = True
[files]
packages = gnpy
data_files =
examples = examples/*
# FIXME: solve example data files
[options.entry_points]
console_scripts =

View File

@@ -1,135 +0,0 @@
#!/usr/bin/env python3
from json import dump
from pathlib import Path
from argparse import ArgumentParser
from collections import namedtuple
from gnpy.tools.json_io import load_json
class Results(namedtuple('Results', 'missing extra different expected actual')):
def _asdict(self):
return {'missing': self.missing,
'extra': self.extra,
'different': self.different}
def __str__(self):
rv = []
if self.missing:
rv.append('Missing: {len(self.missing)}/{len(self.expected)}')
rv.extend(f'\t{x}' for x in sorted(self.missing))
if self.extra:
rv.append('Extra: {len(self.extra)}/{len(self.expected)}')
rv.extend(f'\t{x}' for x in sorted(self.extra))
if self.different:
rv.append('Different: {len(self.different)}/{len(self.expected)}')
rv.extend(f'\tExpected: {x}\n\tActual: {y}' for x, y in self.different)
if not self.missing and not self.extra and not self.different:
rv.append('All match!')
return '\n'.join(rv)
class NetworksResults(namedtuple('NetworksResult', 'elements connections')):
def _asdict(self):
return {'elements': self.elements._asdict(),
'connections': self.connections._asdict()}
def __str__(self):
return '\n'.join([
'Elements'.center(40, '='),
str(self.elements),
'Connections'.center(40, '='),
str(self.connections),
])
class ServicesResults(namedtuple('ServicesResult', 'requests synchronizations')):
def _asdict(self):
return {'requests': self.requests.asdict(),
'synchronizations': self.synchronizations.asdict()}
def __str__(self):
return '\n'.join([
'Requests'.center(40, '='),
str(self.requests),
'Synchronizations'.center(40, '='),
str(self.synchronizations),
])
class PathsResults(namedtuple('PathsResults', 'paths')):
def _asdict(self):
return {'paths': self.paths.asdict()}
def __str__(self):
return '\n'.join([
'Paths'.center(40, '='),
str(self.paths),
])
def compare(expected, actual, key=lambda x: x):
expected = {key(el): el for el in expected}
actual = {key(el): el for el in actual}
missing = set(expected) - set(actual)
extra = set(actual) - set(expected)
different = [(expected[x], actual[x]) for
x in set(expected) & set(actual)
if expected[x] != actual[x]]
return Results(missing, extra, different, expected, actual)
def compare_networks(expected, actual):
elements = compare(expected['elements'], actual['elements'],
key=lambda el: el['uid'])
connections = compare(expected['connections'], actual['connections'],
key=lambda el: (el['from_node'], el['to_node']))
return NetworksResults(elements, connections)
def compare_services(expected, actual):
requests = compare(expected['path-request'], actual['path-request'],
key=lambda el: el['request-id'])
synchronizations = compare(expected['path-request'], expected['path-request'],
key=lambda el: el['request-id'])
if 'synchronization' in expected.keys():
synchronizations = compare(expected['synchronization'], actual['synchronization'],
key=lambda el: el['synchronization-id'])
return ServicesResults(requests, synchronizations)
def compare_paths(expected_output, actual_output):
paths = compare(expected['path'], actual['path'], key=lambda el: el['path-id'])
return PathsResults(paths)
COMPARISONS = {
'networks': compare_networks,
'services': compare_services,
'paths': compare_paths,
}
parser = ArgumentParser()
parser.add_argument('expected_output', type=Path, metavar='FILE')
parser.add_argument('actual_output', type=Path, metavar='FILE')
parser.add_argument('-o', '--output', default=None)
parser.add_argument('-c', '--comparison', choices=COMPARISONS, default='networks')
def encode_sets(obj):
if isinstance(obj, set):
return list(obj)
raise TypeError(f'{obj!r} is not JSON serializable!')
if __name__ == '__main__':
args = parser.parse_args()
expected = load_json(args.expected_output)
actual = load_json(args.actual_output)
result = COMPARISONS[args.comparison](expected, actual)
if args.output:
with open(args.output, 'w', encoding='utf-8') as f:
dump(result, f, default=encode_sets, indent=2, ensure_ascii=False)
else:
print(str(result))

13
tests/conftest.py Normal file
View File

@@ -0,0 +1,13 @@
# SPDX-License-Identifier: BSD-3-Clause
#
# Copyright (C) 2020 Telecom Infra Project and GNPy contributors
# see LICENSE.md for a list of contributors
#
import pytest
from gnpy.core.parameters import SimParams, NLIParams, RamanParams
@pytest.fixture
def set_sim_params(monkeypatch):
monkeypatch.setattr(SimParams, '_shared_dict', {'nli_params': NLIParams(), 'raman_params': RamanParams()})

File diff suppressed because it is too large Load Diff

View File

@@ -196,101 +196,101 @@
0.0
],
"dgt": [
2.714526681131686,
2.705443819238505,
2.6947834587664494,
2.6841217449620203,
2.6681935771243177,
2.6521732021128046,
2.630396440815385,
2.602860350286428,
2.5696460593920065,
2.5364027376452056,
2.499446286796604,
2.4587748041127506,
2.414398437185221,
2.3699990328716107,
2.322373696229342,
2.271520771371253,
2.2174389328192197,
2.16337565384239,
2.1183028432496016,
2.082225099873648,
2.055100772005235,
2.0279625371819305,
2.0008103857988204,
1.9736443063300082,
1.9482128147680253,
1.9245345552113182,
1.9026104247588487,
1.8806927939516411,
1.862235672444246,
1.847275503201129,
1.835814081380705,
1.824381436842932,
1.8139629377087627,
1.8045606557581335,
1.7961751115773796,
1.7877868031023945,
1.7793941781790852,
1.7709972329654864,
1.7625959636196327,
1.7541903672600494,
1.7459181197626403,
1.737780757913635,
1.7297783508684146,
1.7217732861435076,
1.7137640932265894,
1.7057507692361864,
1.6918150918099673,
1.6719047669939942,
1.6460167077689267,
1.6201194134191075,
1.5986915141218316,
1.5817353179379183,
1.569199764184379,
1.5566577309558969,
1.545374152761467,
1.5353620432989845,
1.5266220576235803,
1.5178910621476225,
1.5097346239790443,
1.502153039909686,
1.495145456062699,
1.488134243479226,
1.48111939735681,
1.474100442252211,
1.4670307626366115,
1.4599103316162523,
1.45273959485914,
1.445565137158368,
1.4340878115214444,
1.418273806730323,
1.3981208704326855,
1.3779439775587023,
1.3598972673004606,
1.3439818461440451,
1.3301807335621048,
1.316383926863083,
1.3040618749785347,
1.2932153453410835,
1.2838336236692311,
1.2744470198196236,
1.2650555289898042,
1.2556591482982988,
1.2428104897182262,
1.2264996957264114,
1.2067249615595257,
1.1869318618366975,
1.1672278304018044,
1.1476135933863398,
1.1280891949729075,
1.108555289615659,
1.0895983485572227,
1.0712204022764056,
1.0534217504465226,
1.0356155337864215,
1.0,
1.017807767853702,
1.0
1.0356155337864215,
1.0534217504465226,
1.0712204022764056,
1.0895983485572227,
1.108555289615659,
1.1280891949729075,
1.1476135933863398,
1.1672278304018044,
1.1869318618366975,
1.2067249615595257,
1.2264996957264114,
1.2428104897182262,
1.2556591482982988,
1.2650555289898042,
1.2744470198196236,
1.2838336236692311,
1.2932153453410835,
1.3040618749785347,
1.316383926863083,
1.3301807335621048,
1.3439818461440451,
1.3598972673004606,
1.3779439775587023,
1.3981208704326855,
1.418273806730323,
1.4340878115214444,
1.445565137158368,
1.45273959485914,
1.4599103316162523,
1.4670307626366115,
1.474100442252211,
1.48111939735681,
1.488134243479226,
1.495145456062699,
1.502153039909686,
1.5097346239790443,
1.5178910621476225,
1.5266220576235803,
1.5353620432989845,
1.545374152761467,
1.5566577309558969,
1.569199764184379,
1.5817353179379183,
1.5986915141218316,
1.6201194134191075,
1.6460167077689267,
1.6719047669939942,
1.6918150918099673,
1.7057507692361864,
1.7137640932265894,
1.7217732861435076,
1.7297783508684146,
1.737780757913635,
1.7459181197626403,
1.7541903672600494,
1.7625959636196327,
1.7709972329654864,
1.7793941781790852,
1.7877868031023945,
1.7961751115773796,
1.8045606557581335,
1.8139629377087627,
1.824381436842932,
1.835814081380705,
1.847275503201129,
1.862235672444246,
1.8806927939516411,
1.9026104247588487,
1.9245345552113182,
1.9482128147680253,
1.9736443063300082,
2.0008103857988204,
2.0279625371819305,
2.055100772005235,
2.082225099873648,
2.1183028432496016,
2.16337565384239,
2.2174389328192197,
2.271520771371253,
2.322373696229342,
2.3699990328716107,
2.414398437185221,
2.4587748041127506,
2.499446286796604,
2.5364027376452056,
2.5696460593920065,
2.602860350286428,
2.630396440815385,
2.6521732021128046,
2.6681935771243177,
2.6841217449620203,
2.6947834587664494,
2.705443819238505,
2.714526681131686
]
}
}

View File

@@ -63,7 +63,7 @@
"Fiber":[{
"type_variety": "SSMF",
"dispersion": 1.67e-05,
"gamma": 0.00127,
"effective_area": 83e-12,
"pmd_coef": 1.265e-15
}
],
@@ -85,6 +85,7 @@
"target_pch_out_db": -20,
"add_drop_osnr": 38,
"pmd": 0,
"pdl": 0,
"restrictions": {
"preamp_variety_list":[],
"booster_variety_list":[]

View File

@@ -1,224 +0,0 @@
{
"uid": "Span1",
"params": {
"length": 80,
"loss_coef": 0.2,
"length_units": "km",
"att_in": 0,
"con_in": 0.5,
"con_out": 0.5,
"type_variety": "SSMF",
"dispersion": 0.0000167,
"gamma": 0.00127,
"pmd_coef": 1.265e-15,
"raman_efficiency": {
"cr": [
0,
0.0000094,
0.0000292,
0.0000488,
0.0000682,
0.0000831,
0.000094,
0.0001014,
0.0001069,
0.0001119,
0.0001217,
0.0001268,
0.0001365,
0.000149,
0.000165,
0.000181,
0.0001977,
0.0002192,
0.0002469,
0.0002749,
0.0002999,
0.0003206,
0.0003405,
0.0003592,
0.000374,
0.0003826,
0.0003841,
0.0003826,
0.0003802,
0.0003756,
0.0003549,
0.0003795,
0.000344,
0.0002933,
0.0002024,
0.0001158,
0.0000846,
0.0000714,
0.0000686,
0.000085,
0.0000893,
0.0000901,
0.0000815,
0.0000667,
0.0000437,
0.0000328,
0.0000296,
0.0000265,
0.0000257,
0.0000281,
0.0000308,
0.0000367,
0.0000585,
0.0000663,
0.0000636,
0.000055,
0.0000406,
0.0000277,
0.0000242,
0.0000187,
0.000016,
0.000014,
0.0000113,
0.0000105,
0.0000098,
0.0000098,
0.0000113,
0.0000164,
0.0000195,
0.0000238,
0.0000226,
0.0000203,
0.0000148,
0.0000109,
0.0000098,
0.0000105,
0.0000117,
0.0000125,
0.0000121,
0.0000109,
0.0000098,
0.0000082,
0.0000066,
0.0000047,
0.0000027,
0.0000019,
0.0000012,
4e-7,
2e-7,
1e-7
],
"frequency_offset": [
0,
500000000000,
1000000000000,
1500000000000,
2000000000000,
2500000000000,
3000000000000,
3500000000000,
4000000000000,
4500000000000,
5000000000000,
5500000000000,
6000000000000,
6500000000000,
7000000000000,
7500000000000,
8000000000000,
8500000000000,
9000000000000,
9500000000000,
10000000000000,
10500000000000,
11000000000000,
11500000000000,
12000000000000,
12500000000000,
12750000000000,
13000000000000,
13250000000000,
13500000000000,
14000000000000,
14500000000000,
14750000000000,
15000000000000,
15500000000000,
16000000000000,
16500000000000,
17000000000000,
17500000000000,
18000000000000,
18250000000000,
18500000000000,
18750000000000,
19000000000000,
19500000000000,
20000000000000,
20500000000000,
21000000000000,
21500000000000,
22000000000000,
22500000000000,
23000000000000,
23500000000000,
24000000000000,
24500000000000,
25000000000000,
25500000000000,
26000000000000,
26500000000000,
27000000000000,
27500000000000,
28000000000000,
28500000000000,
29000000000000,
29500000000000,
30000000000000,
30500000000000,
31000000000000,
31500000000000,
32000000000000,
32500000000000,
33000000000000,
33500000000000,
34000000000000,
34500000000000,
35000000000000,
35500000000000,
36000000000000,
36500000000000,
37000000000000,
37500000000000,
38000000000000,
38500000000000,
39000000000000,
39500000000000,
40000000000000,
40500000000000,
41000000000000,
41500000000000,
42000000000000
]
}
},
"operational": {
"temperature": 283,
"raman_pumps": [
{
"power": 0.2,
"frequency": 205000000000000,
"propagation_direction": "counterprop"
},
{
"power": 0.206,
"frequency": 201000000000000,
"propagation_direction": "counterprop"
}
]
},
"metadata": {
"location": {
"latitude": 1,
"longitude": 0,
"city": null,
"region": ""
}
}
}

View File

@@ -1,14 +1,13 @@
{
"raman_parameters": {
"flag_raman": true,
"space_resolution": 10e3,
"tolerance": 1e-8
"raman_params": {
"flag": true,
"result_spatial_resolution": 10e3,
"solver_spatial_resolution": 50
},
"nli_parameters": {
"nli_method_name": "ggn_spectrally_separated",
"wdm_grid_size": 50e9,
"nli_params": {
"method": "ggn_spectrally_separated",
"dispersion_tolerance": 1,
"phase_shift_tolerance": 0.1,
"computed_channels": [1, 18, 37, 56, 75]
}
}
}

View File

@@ -1258,7 +1258,7 @@
},
{
"metric-type": "SNR-0.1nm",
"accumulative-value": 28.77
"accumulative-value": 28.78
},
{
"metric-type": "OSNR-bandwidth",

View File

@@ -3,5 +3,5 @@ response-id,source,destination,path_bandwidth,Pass?,nb of tsp pairs,total cost,t
1,trx Brest_KLA,trx Vannes_KBE,10.0,True,1,1,Voyager,mode 1,22.65,22.11,18.03,32.0,1.0,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,"-276, 4",,,
3,trx Lannion_CAS,trx Rennes_STA,60.0,True,1,1,vendorA_trx-type1,mode 1,28.29,25.85,21.77,32.0,1.0,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,"-284, 4",,,
4,trx Rennes_STA,trx Lannion_CAS,150.0,True,1,1,vendorA_trx-type1,mode 2,22.27,22.15,15.05,64.0,0.0,trx Rennes_STA | roadm Rennes_STA | east edfa in Rennes_STA to Ploermel | fiber (Rennes_STA → Ploermel)- | east edfa in Ploermel to Vannes_KBE | fiber (Ploermel → Vannes_KBE)- | west edfa in Vannes_KBE to Ploermel | roadm Vannes_KBE | east edfa in Vannes_KBE to Lorient_KMA | fiber (Vannes_KBE → Lorient_KMA)-F055 | west edfa in Lorient_KMA to Vannes_KBE | roadm Lorient_KMA | east edfa in Lorient_KMA to Loudeac | fiber (Lorient_KMA → Loudeac)-F054 | east fused spans in Loudeac | fiber (Loudeac → Corlay)-F010 | east fused spans in Corlay | fiber (Corlay → Lannion_CAS)-F061 | west edfa in Lannion_CAS to Corlay | roadm Lannion_CAS | trx Lannion_CAS,"-266, 6",,,
5,trx Rennes_STA,trx Lannion_CAS,20.0,True,1,1,vendorA_trx-type1,mode 2,30.79,28.77,21.68,64.0,3.0,trx Rennes_STA | roadm Rennes_STA | east edfa in Rennes_STA to Stbrieuc | fiber (Rennes_STA → Stbrieuc)-F057 | west edfa in Stbrieuc to Rennes_STA | fiber (Stbrieuc → Lannion_CAS)-F056 | west edfa in Lannion_CAS to Stbrieuc | roadm Lannion_CAS | trx Lannion_CAS,"-274, 6",,,
5,trx Rennes_STA,trx Lannion_CAS,20.0,True,1,1,vendorA_trx-type1,mode 2,30.79,28.78,21.68,64.0,3.0,trx Rennes_STA | roadm Rennes_STA | east edfa in Rennes_STA to Stbrieuc | fiber (Rennes_STA → Stbrieuc)-F057 | west edfa in Stbrieuc to Rennes_STA | fiber (Stbrieuc → Lannion_CAS)-F056 | west edfa in Lannion_CAS to Stbrieuc | roadm Lannion_CAS | trx Lannion_CAS,"-274, 6",,,
6,,,,NO_PATH,,,,,,,,,,,,,,
1 response-id source destination path_bandwidth Pass? nb of tsp pairs total cost transponder-type transponder-mode OSNR-0.1nm SNR-0.1nm SNR-bandwidth baud rate (Gbaud) input power (dBm) path spectrum (N,M) reversed path OSNR-0.1nm reversed path SNR-0.1nm reversed path SNR-bandwidth
3 1 trx Brest_KLA trx Vannes_KBE 10.0 True 1 1 Voyager mode 1 22.65 22.11 18.03 32.0 1.0 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 -276, 4
4 3 trx Lannion_CAS trx Rennes_STA 60.0 True 1 1 vendorA_trx-type1 mode 1 28.29 25.85 21.77 32.0 1.0 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 -284, 4
5 4 trx Rennes_STA trx Lannion_CAS 150.0 True 1 1 vendorA_trx-type1 mode 2 22.27 22.15 15.05 64.0 0.0 trx Rennes_STA | roadm Rennes_STA | east edfa in Rennes_STA to Ploermel | fiber (Rennes_STA → Ploermel)- | east edfa in Ploermel to Vannes_KBE | fiber (Ploermel → Vannes_KBE)- | west edfa in Vannes_KBE to Ploermel | roadm Vannes_KBE | east edfa in Vannes_KBE to Lorient_KMA | fiber (Vannes_KBE → Lorient_KMA)-F055 | west edfa in Lorient_KMA to Vannes_KBE | roadm Lorient_KMA | east edfa in Lorient_KMA to Loudeac | fiber (Lorient_KMA → Loudeac)-F054 | east fused spans in Loudeac | fiber (Loudeac → Corlay)-F010 | east fused spans in Corlay | fiber (Corlay → Lannion_CAS)-F061 | west edfa in Lannion_CAS to Corlay | roadm Lannion_CAS | trx Lannion_CAS -266, 6
6 5 trx Rennes_STA trx Lannion_CAS 20.0 True 1 1 vendorA_trx-type1 mode 2 30.79 28.77 28.78 21.68 64.0 3.0 trx Rennes_STA | roadm Rennes_STA | east edfa in Rennes_STA to Stbrieuc | fiber (Rennes_STA → Stbrieuc)-F057 | west edfa in Stbrieuc to Rennes_STA | fiber (Stbrieuc → Lannion_CAS)-F056 | west edfa in Lannion_CAS to Stbrieuc | roadm Lannion_CAS | trx Lannion_CAS -274, 6
7 6 NO_PATH

View File

@@ -0,0 +1,97 @@
signal,nli
1.9952623149688793e-05,1.1158426495504604e-08
1.9952623149688793e-05,1.263949624403159e-08
1.9952623149688793e-05,1.3358478621325285e-08
1.9952623149688793e-05,1.3830775406251184e-08
1.9952623149688793e-05,1.4180462471172083e-08
1.9952623149688793e-05,1.4456701012984246e-08
1.9952623149688793e-05,1.4683973899785875e-08
1.9952623149688793e-05,1.487624147046227e-08
1.9952623149688793e-05,1.5042217041806274e-08
1.9952623149688793e-05,1.5187703614492153e-08
1.9952623149688793e-05,1.5316759790785317e-08
1.9952623149688793e-05,1.543233485150211e-08
1.9952623149688793e-05,1.553663885878994e-08
1.9952623149688793e-05,1.5631370249579246e-08
1.9952623149688793e-05,1.5717862065800704e-08
1.9952623149688793e-05,1.57971793985894e-08
1.9952623149688793e-05,1.5870186356579704e-08
1.9952623149688793e-05,1.593759332223716e-08
1.9952623149688793e-05,1.5999991070923486e-08
1.9952623149688793e-05,1.6057875903450682e-08
1.9952623149688793e-05,1.6111668489205982e-08
1.9952623149688793e-05,1.6161728217386366e-08
1.9952623149688793e-05,1.6208364281630228e-08
1.9952623149688793e-05,1.6251844350226973e-08
1.9952623149688793e-05,1.629240142540359e-08
1.9952623149688793e-05,1.6330239326114482e-08
1.9952623149688793e-05,1.6365537111728e-08
1.9952623149688793e-05,1.6398452681655655e-08
1.9952623149688793e-05,1.642912572715412e-08
1.9952623149688793e-05,1.6457680168940455e-08
1.9952623149688793e-05,1.6484226183026747e-08
1.9952623149688793e-05,1.6508861894003893e-08
1.9952623149688793e-05,1.6531674797617433e-08
1.9952623149688793e-05,1.655274296130114e-08
1.9952623149688793e-05,1.657213604125123e-08
1.9952623149688793e-05,1.6589916146838222e-08
1.9952623149688793e-05,1.660613857708963e-08
1.9952623149688793e-05,1.6620852449214096e-08
1.9952623149688793e-05,1.6634101235366932e-08
1.9952623149688793e-05,1.664592322084737e-08
1.9952623149688793e-05,1.6656351894496074e-08
1.9952623149688793e-05,1.666541628009631e-08
1.9952623149688793e-05,1.6673141215973025e-08
1.9952623149688793e-05,1.6679547588653583e-08
1.9952623149688793e-05,1.6684652525341145e-08
1.9952623149688793e-05,1.668846954900963e-08
1.9952623149688793e-05,1.66910086991187e-08
1.9952623149688793e-05,1.6692276620238304e-08
1.9952623149688793e-05,1.6692276620238304e-08
1.9952623149688793e-05,1.6691008699118703e-08
1.9952623149688793e-05,1.6688469549009633e-08
1.9952623149688793e-05,1.6684652525341148e-08
1.9952623149688793e-05,1.6679547588653586e-08
1.9952623149688793e-05,1.6673141215973028e-08
1.9952623149688793e-05,1.666541628009631e-08
1.9952623149688793e-05,1.6656351894496084e-08
1.9952623149688793e-05,1.6645923220847374e-08
1.9952623149688793e-05,1.6634101235366935e-08
1.9952623149688793e-05,1.66208524492141e-08
1.9952623149688793e-05,1.6606138577089633e-08
1.9952623149688793e-05,1.6589916146838225e-08
1.9952623149688793e-05,1.6572136041251237e-08
1.9952623149688793e-05,1.6552742961301146e-08
1.9952623149688793e-05,1.653167479761744e-08
1.9952623149688793e-05,1.6508861894003893e-08
1.9952623149688793e-05,1.648422618302675e-08
1.9952623149688793e-05,1.645768016894046e-08
1.9952623149688793e-05,1.6429125727154126e-08
1.9952623149688793e-05,1.6398452681655658e-08
1.9952623149688793e-05,1.6365537111728004e-08
1.9952623149688793e-05,1.6330239326114482e-08
1.9952623149688793e-05,1.6292401425403594e-08
1.9952623149688793e-05,1.6251844350226973e-08
1.9952623149688793e-05,1.6208364281630228e-08
1.9952623149688793e-05,1.616172821738637e-08
1.9952623149688793e-05,1.6111668489205982e-08
1.9952623149688793e-05,1.605787590345069e-08
1.9952623149688793e-05,1.5999991070923493e-08
1.9952623149688793e-05,1.5937593322237167e-08
1.9952623149688793e-05,1.5870186356579704e-08
1.9952623149688793e-05,1.5797179398589402e-08
1.9952623149688793e-05,1.571786206580071e-08
1.9952623149688793e-05,1.5631370249579252e-08
1.9952623149688793e-05,1.5536638858789946e-08
1.9952623149688793e-05,1.5432334851502114e-08
1.9952623149688793e-05,1.531675979078532e-08
1.9952623149688793e-05,1.5187703614492156e-08
1.9952623149688793e-05,1.5042217041806274e-08
1.9952623149688793e-05,1.4876241470462273e-08
1.9952623149688793e-05,1.4683973899785879e-08
1.9952623149688793e-05,1.4456701012984246e-08
1.9952623149688793e-05,1.4180462471172086e-08
1.9952623149688793e-05,1.3830775406251184e-08
1.9952623149688793e-05,1.3358478621325285e-08
1.9952623149688793e-05,1.2639496244031593e-08
1.9952623149688793e-05,1.1158426495504613e-08
1 signal nli
2 1.9952623149688793e-05 1.1158426495504604e-08
3 1.9952623149688793e-05 1.263949624403159e-08
4 1.9952623149688793e-05 1.3358478621325285e-08
5 1.9952623149688793e-05 1.3830775406251184e-08
6 1.9952623149688793e-05 1.4180462471172083e-08
7 1.9952623149688793e-05 1.4456701012984246e-08
8 1.9952623149688793e-05 1.4683973899785875e-08
9 1.9952623149688793e-05 1.487624147046227e-08
10 1.9952623149688793e-05 1.5042217041806274e-08
11 1.9952623149688793e-05 1.5187703614492153e-08
12 1.9952623149688793e-05 1.5316759790785317e-08
13 1.9952623149688793e-05 1.543233485150211e-08
14 1.9952623149688793e-05 1.553663885878994e-08
15 1.9952623149688793e-05 1.5631370249579246e-08
16 1.9952623149688793e-05 1.5717862065800704e-08
17 1.9952623149688793e-05 1.57971793985894e-08
18 1.9952623149688793e-05 1.5870186356579704e-08
19 1.9952623149688793e-05 1.593759332223716e-08
20 1.9952623149688793e-05 1.5999991070923486e-08
21 1.9952623149688793e-05 1.6057875903450682e-08
22 1.9952623149688793e-05 1.6111668489205982e-08
23 1.9952623149688793e-05 1.6161728217386366e-08
24 1.9952623149688793e-05 1.6208364281630228e-08
25 1.9952623149688793e-05 1.6251844350226973e-08
26 1.9952623149688793e-05 1.629240142540359e-08
27 1.9952623149688793e-05 1.6330239326114482e-08
28 1.9952623149688793e-05 1.6365537111728e-08
29 1.9952623149688793e-05 1.6398452681655655e-08
30 1.9952623149688793e-05 1.642912572715412e-08
31 1.9952623149688793e-05 1.6457680168940455e-08
32 1.9952623149688793e-05 1.6484226183026747e-08
33 1.9952623149688793e-05 1.6508861894003893e-08
34 1.9952623149688793e-05 1.6531674797617433e-08
35 1.9952623149688793e-05 1.655274296130114e-08
36 1.9952623149688793e-05 1.657213604125123e-08
37 1.9952623149688793e-05 1.6589916146838222e-08
38 1.9952623149688793e-05 1.660613857708963e-08
39 1.9952623149688793e-05 1.6620852449214096e-08
40 1.9952623149688793e-05 1.6634101235366932e-08
41 1.9952623149688793e-05 1.664592322084737e-08
42 1.9952623149688793e-05 1.6656351894496074e-08
43 1.9952623149688793e-05 1.666541628009631e-08
44 1.9952623149688793e-05 1.6673141215973025e-08
45 1.9952623149688793e-05 1.6679547588653583e-08
46 1.9952623149688793e-05 1.6684652525341145e-08
47 1.9952623149688793e-05 1.668846954900963e-08
48 1.9952623149688793e-05 1.66910086991187e-08
49 1.9952623149688793e-05 1.6692276620238304e-08
50 1.9952623149688793e-05 1.6692276620238304e-08
51 1.9952623149688793e-05 1.6691008699118703e-08
52 1.9952623149688793e-05 1.6688469549009633e-08
53 1.9952623149688793e-05 1.6684652525341148e-08
54 1.9952623149688793e-05 1.6679547588653586e-08
55 1.9952623149688793e-05 1.6673141215973028e-08
56 1.9952623149688793e-05 1.666541628009631e-08
57 1.9952623149688793e-05 1.6656351894496084e-08
58 1.9952623149688793e-05 1.6645923220847374e-08
59 1.9952623149688793e-05 1.6634101235366935e-08
60 1.9952623149688793e-05 1.66208524492141e-08
61 1.9952623149688793e-05 1.6606138577089633e-08
62 1.9952623149688793e-05 1.6589916146838225e-08
63 1.9952623149688793e-05 1.6572136041251237e-08
64 1.9952623149688793e-05 1.6552742961301146e-08
65 1.9952623149688793e-05 1.653167479761744e-08
66 1.9952623149688793e-05 1.6508861894003893e-08
67 1.9952623149688793e-05 1.648422618302675e-08
68 1.9952623149688793e-05 1.645768016894046e-08
69 1.9952623149688793e-05 1.6429125727154126e-08
70 1.9952623149688793e-05 1.6398452681655658e-08
71 1.9952623149688793e-05 1.6365537111728004e-08
72 1.9952623149688793e-05 1.6330239326114482e-08
73 1.9952623149688793e-05 1.6292401425403594e-08
74 1.9952623149688793e-05 1.6251844350226973e-08
75 1.9952623149688793e-05 1.6208364281630228e-08
76 1.9952623149688793e-05 1.616172821738637e-08
77 1.9952623149688793e-05 1.6111668489205982e-08
78 1.9952623149688793e-05 1.605787590345069e-08
79 1.9952623149688793e-05 1.5999991070923493e-08
80 1.9952623149688793e-05 1.5937593322237167e-08
81 1.9952623149688793e-05 1.5870186356579704e-08
82 1.9952623149688793e-05 1.5797179398589402e-08
83 1.9952623149688793e-05 1.571786206580071e-08
84 1.9952623149688793e-05 1.5631370249579252e-08
85 1.9952623149688793e-05 1.5536638858789946e-08
86 1.9952623149688793e-05 1.5432334851502114e-08
87 1.9952623149688793e-05 1.531675979078532e-08
88 1.9952623149688793e-05 1.5187703614492156e-08
89 1.9952623149688793e-05 1.5042217041806274e-08
90 1.9952623149688793e-05 1.4876241470462273e-08
91 1.9952623149688793e-05 1.4683973899785879e-08
92 1.9952623149688793e-05 1.4456701012984246e-08
93 1.9952623149688793e-05 1.4180462471172086e-08
94 1.9952623149688793e-05 1.3830775406251184e-08
95 1.9952623149688793e-05 1.3358478621325285e-08
96 1.9952623149688793e-05 1.2639496244031593e-08
97 1.9952623149688793e-05 1.1158426495504613e-08

View File

@@ -0,0 +1,6 @@
signal,nli
1.9952623149688793e-05,5.522326183599433e-09
1.7957360834719913e-05,4.5606601423111315e-09
2.593841009459543e-05,6.633717697038881e-09
1.5962098519751036e-05,4.3237017878447286e-09
2.3943147779626553e-05,8.311382502260195e-09
1 signal nli
2 1.9952623149688793e-05 5.522326183599433e-09
3 1.7957360834719913e-05 4.5606601423111315e-09
4 2.593841009459543e-05 6.633717697038881e-09
5 1.5962098519751036e-05 4.3237017878447286e-09
6 2.3943147779626553e-05 8.311382502260195e-09

View File

@@ -0,0 +1,809 @@
{
"network_name": "Example Network - long path",
"elements": [{
"uid": "Site_A",
"type": "Transceiver",
"metadata": {
"location": {
"city": "Site A",
"region": "",
"latitude": 0,
"longitude": 0
}
}
},
{
"uid": "roadm Site A",
"metadata": {
"location": {
"city": "Site A",
"region": "RLD",
"latitude": 0.0,
"longitude": 0.0
}
},
"type": "Roadm"
},
{
"uid": "booster A",
"type": "Edfa",
"type_variety": "std_medium_gain",
"operational": {
"gain_target": 16,
"tilt_target": 0
},
"metadata": {
"location": {
"region": "",
"latitude": 0,
"longitude": 0
}
}
},
{
"uid": "Span1",
"type": "Fiber",
"type_variety": "SSMF",
"params": {
"length": 80,
"loss_coef": 0.2,
"length_units": "km"
},
"metadata": {
"location": {
"region": "",
"latitude": 1,
"longitude": 0
}
}
},
{
"uid": "Edfa1",
"type": "Edfa",
"type_variety": "test",
"operational": {
"gain_target": 16,
"tilt_target": 0
},
"metadata": {
"location": {
"region": "",
"latitude": 2,
"longitude": 0
}
}
},
{
"uid": "Span2",
"type": "Fiber",
"type_variety": "SSMF",
"params": {
"length": 80,
"loss_coef": 0.2,
"length_units": "km"
},
"metadata": {
"location": {
"region": "",
"latitude": 1,
"longitude": 0
}
}
},
{
"uid": "Edfa2",
"type": "Edfa",
"type_variety": "test_fixed_gain",
"operational": {
"gain_target": 16,
"tilt_target": 0
},
"metadata": {
"location": {
"region": "",
"latitude": 2,
"longitude": 0
}
}
},
{
"uid": "Span3",
"type": "Fiber",
"type_variety": "SSMF",
"params": {
"length": 80,
"loss_coef": 0.2,
"length_units": "km"
},
"metadata": {
"location": {
"region": "",
"latitude": 1,
"longitude": 0
}
}
},
{
"uid": "Edfa3",
"type": "Edfa",
"type_variety": "test",
"operational": {
"gain_target": 16,
"tilt_target": 0
},
"metadata": {
"location": {
"region": "",
"latitude": 2,
"longitude": 0
}
}
},
{
"uid": "Span4",
"type": "Fiber",
"type_variety": "SSMF",
"params": {
"length": 80,
"loss_coef": 0.2,
"length_units": "km"
},
"metadata": {
"location": {
"region": "",
"latitude": 1,
"longitude": 0
}
}
},
{
"uid": "Edfa4",
"type": "Edfa",
"type_variety": "test_fixed_gain",
"operational": {
"gain_target": 16,
"tilt_target": 0
},
"metadata": {
"location": {
"region": "",
"latitude": 2,
"longitude": 0
}
}
},
{
"uid": "Span5",
"type": "Fiber",
"type_variety": "SSMF",
"params": {
"length": 80,
"loss_coef": 0.2,
"length_units": "km"
},
"metadata": {
"location": {
"region": "",
"latitude": 1,
"longitude": 0
}
}
},
{
"uid": "Edfa5",
"type": "Edfa",
"type_variety": "test",
"operational": {
"gain_target": 16,
"tilt_target": 0
},
"metadata": {
"location": {
"region": "",
"latitude": 2,
"longitude": 0
}
}
},
{
"uid": "roadm Site C",
"metadata": {
"location": {
"city": "Site A",
"region": "RLD",
"latitude": 0.0,
"longitude": 0.0
}
},
"type": "Roadm"
},
{
"uid": "booster C",
"type": "Edfa",
"type_variety": "std_medium_gain",
"operational": {
"gain_target": 16,
"tilt_target": 0
},
"metadata": {
"location": {
"region": "",
"latitude": 0,
"longitude": 0
}
}
},
{
"uid": "Span6",
"type": "Fiber",
"type_variety": "SSMF",
"params": {
"length": 80,
"loss_coef": 0.2,
"length_units": "km"
},
"metadata": {
"location": {
"region": "",
"latitude": 1,
"longitude": 0
}
}
},
{
"uid": "Edfa6",
"type": "Edfa",
"type_variety": "test_fixed_gain",
"operational": {
"gain_target": 16,
"tilt_target": 0
},
"metadata": {
"location": {
"region": "",
"latitude": 2,
"longitude": 0
}
}
},
{
"uid": "Span7",
"type": "Fiber",
"type_variety": "SSMF",
"params": {
"length": 80,
"loss_coef": 0.2,
"length_units": "km"
},
"metadata": {
"location": {
"region": "",
"latitude": 1,
"longitude": 0
}
}
},
{
"uid": "Edfa7",
"type": "Edfa",
"type_variety": "test",
"operational": {
"gain_target": 16,
"tilt_target": 0
},
"metadata": {
"location": {
"region": "",
"latitude": 2,
"longitude": 0
}
}
},
{
"uid": "Span8",
"type": "Fiber",
"type_variety": "SSMF",
"params": {
"length": 80,
"loss_coef": 0.2,
"length_units": "km"
},
"metadata": {
"location": {
"region": "",
"latitude": 1,
"longitude": 0
}
}
},
{
"uid": "Edfa8",
"type": "Edfa",
"type_variety": "test_fixed_gain",
"operational": {
"gain_target": 16,
"tilt_target": 0
},
"metadata": {
"location": {
"region": "",
"latitude": 2,
"longitude": 0
}
}
},
{
"uid": "Span9",
"type": "Fiber",
"type_variety": "SSMF",
"params": {
"length": 80,
"loss_coef": 0.2,
"length_units": "km"
},
"metadata": {
"location": {
"region": "",
"latitude": 1,
"longitude": 0
}
}
},
{
"uid": "Edfa9",
"type": "Edfa",
"type_variety": "test",
"operational": {
"gain_target": 16,
"tilt_target": 0
},
"metadata": {
"location": {
"region": "",
"latitude": 2,
"longitude": 0
}
}
},
{
"uid": "Span10",
"type": "Fiber",
"type_variety": "SSMF",
"params": {
"length": 80,
"loss_coef": 0.2,
"length_units": "km"
},
"metadata": {
"location": {
"region": "",
"latitude": 1,
"longitude": 0
}
}
},
{
"uid": "Edfa10",
"type": "Edfa",
"type_variety": "test_fixed_gain",
"operational": {
"gain_target": 16,
"tilt_target": 0
},
"metadata": {
"location": {
"region": "",
"latitude": 2,
"longitude": 0
}
}
},
{
"uid": "roadm Site D",
"metadata": {
"location": {
"city": "Site A",
"region": "RLD",
"latitude": 0.0,
"longitude": 0.0
}
},
"type": "Roadm"
},
{
"uid": "booster D",
"type": "Edfa",
"type_variety": "std_medium_gain",
"operational": {
"gain_target": 16,
"tilt_target": 0
},
"metadata": {
"location": {
"region": "",
"latitude": 0,
"longitude": 0
}
}
},
{
"uid": "Span11",
"type": "Fiber",
"type_variety": "SSMF",
"params": {
"length": 80,
"loss_coef": 0.2,
"length_units": "km"
},
"metadata": {
"location": {
"region": "",
"latitude": 1,
"longitude": 0
}
}
},
{
"uid": "Edfa11",
"type": "Edfa",
"type_variety": "test",
"operational": {
"gain_target": 16,
"tilt_target": 0
},
"metadata": {
"location": {
"region": "",
"latitude": 2,
"longitude": 0
}
}
},
{
"uid": "Span12",
"type": "Fiber",
"type_variety": "SSMF",
"params": {
"length": 80,
"loss_coef": 0.2,
"length_units": "km"
},
"metadata": {
"location": {
"region": "",
"latitude": 1,
"longitude": 0
}
}
},
{
"uid": "Edfa12",
"type": "Edfa",
"type_variety": "test_fixed_gain",
"operational": {
"gain_target": 16,
"tilt_target": 0
},
"metadata": {
"location": {
"region": "",
"latitude": 2,
"longitude": 0
}
}
},
{
"uid": "roadm Site E",
"metadata": {
"location": {
"city": "Site A",
"region": "RLD",
"latitude": 0.0,
"longitude": 0.0
}
},
"type": "Roadm"
},
{
"uid": "booster E",
"type": "Edfa",
"type_variety": "std_medium_gain",
"operational": {
"gain_target": 16,
"tilt_target": 0
},
"metadata": {
"location": {
"region": "",
"latitude": 0,
"longitude": 0
}
}
},
{
"uid": "Span13",
"type": "Fiber",
"type_variety": "SSMF",
"params": {
"length": 80,
"loss_coef": 0.2,
"length_units": "km"
},
"metadata": {
"location": {
"region": "",
"latitude": 1,
"longitude": 0
}
}
},
{
"uid": "Edfa13",
"type": "Edfa",
"type_variety": "test",
"operational": {
"gain_target": 16,
"tilt_target": 0
},
"metadata": {
"location": {
"region": "",
"latitude": 2,
"longitude": 0
}
}
},
{
"uid": "Span14",
"type": "Fiber",
"type_variety": "SSMF",
"params": {
"length": 80,
"loss_coef": 0.2,
"length_units": "km"
},
"metadata": {
"location": {
"region": "",
"latitude": 1,
"longitude": 0
}
}
},
{
"uid": "Edfa14",
"type": "Edfa",
"type_variety": "test_fixed_gain",
"operational": {
"gain_target": 16,
"tilt_target": 0
},
"metadata": {
"location": {
"region": "",
"latitude": 2,
"longitude": 0
}
}
},
{
"uid": "Span15",
"type": "Fiber",
"type_variety": "SSMF",
"params": {
"length": 80,
"loss_coef": 0.2,
"length_units": "km"
},
"metadata": {
"location": {
"region": "",
"latitude": 1,
"longitude": 0
}
}
},
{
"uid": "Edfa15",
"type": "Edfa",
"type_variety": "test",
"operational": {
"gain_target": 16,
"tilt_target": 0
},
"metadata": {
"location": {
"region": "",
"latitude": 2,
"longitude": 0
}
}
},
{
"uid": "roadm Site B",
"metadata": {
"location": {
"city": "Site B",
"region": "RLD",
"latitude": 0.0,
"longitude": 0.0
}
},
"type": "Roadm"
},
{
"uid": "Site_B",
"type": "Transceiver",
"metadata": {
"location": {
"city": "Site B",
"region": "",
"latitude": 3,
"longitude": 0
}
}
}
],
"connections": [{
"from_node": "Site_A",
"to_node": "roadm Site A"
},
{
"from_node": "roadm Site A",
"to_node": "booster A"
},
{
"from_node": "booster A",
"to_node": "Span1"
},
{
"from_node": "Span1",
"to_node": "Edfa1"
},
{
"from_node": "Edfa1",
"to_node": "Span2"
},
{
"from_node": "Span2",
"to_node": "Edfa2"
},
{
"from_node": "Edfa2",
"to_node": "Span3"
},
{
"from_node": "Span3",
"to_node": "Edfa3"
},
{
"from_node": "Edfa3",
"to_node": "Span4"
},
{
"from_node": "Span4",
"to_node": "Edfa4"
},
{
"from_node": "Edfa4",
"to_node": "Span5"
},
{
"from_node": "Span5",
"to_node": "Edfa5"
},
{
"from_node": "Edfa5",
"to_node": "roadm Site C"
},
{
"from_node": "roadm Site C",
"to_node": "booster C"
},
{
"from_node": "booster C",
"to_node": "Span6"
},
{
"from_node": "Span6",
"to_node": "Edfa6"
},
{
"from_node": "Edfa6",
"to_node": "Span7"
},
{
"from_node": "Span7",
"to_node": "Edfa7"
},
{
"from_node": "Edfa7",
"to_node": "Span8"
},
{
"from_node": "Span8",
"to_node": "Edfa8"
},
{
"from_node": "Edfa8",
"to_node": "Span9"
},
{
"from_node": "Span9",
"to_node": "Edfa9"
},
{
"from_node": "Edfa9",
"to_node": "Span10"
},
{
"from_node": "Span10",
"to_node": "Edfa10"
},
{
"from_node": "Edfa10",
"to_node": "roadm Site D"
},
{
"from_node": "roadm Site D",
"to_node": "booster D"
},
{
"from_node": "booster D",
"to_node": "Span11"
},
{
"from_node": "Span11",
"to_node": "Edfa11"
},
{
"from_node": "Edfa11",
"to_node": "Span12"
},
{
"from_node": "Span12",
"to_node": "Edfa12"
},
{
"from_node": "Edfa12",
"to_node": "roadm Site E"
},
{
"from_node": "roadm Site E",
"to_node": "booster E"
},
{
"from_node": "booster E",
"to_node": "Span13"
},
{
"from_node": "Span13",
"to_node": "Edfa13"
},
{
"from_node": "Edfa13",
"to_node": "Span14"
},
{
"from_node": "Span14",
"to_node": "Edfa14"
},
{
"from_node": "Edfa14",
"to_node": "Span15"
},
{
"from_node": "Span15",
"to_node": "Edfa15"
},
{
"from_node": "Edfa15",
"to_node": "roadm Site B"
},
{
"from_node": "roadm Site B",
"to_node": "Site_B"
}
]
}

View File

@@ -0,0 +1,96 @@
1.000000000000000021e-03,5.915557166626927424e-04,3.840877221245049653e-04,2.466727384040633977e-04,1.573474629975438242e-04,9.994300566924636483e-05,6.331217828438720550e-05,4.004003600460594289e-05,2.529553013238426405e-05
1.000000000000000021e-03,5.910087140881509866e-04,3.835259923737136521e-04,2.462279833344210639e-04,1.570298910751132091e-04,9.972770370845923681e-05,6.317035443958771254e-05,3.994817502675088248e-05,2.523663218966317481e-05
1.000000000000000021e-03,5.904624672772724710e-04,3.829653846278134621e-04,2.457842903404500092e-04,1.567131560243821098e-04,9.951300275831494635e-05,6.302894048828063141e-05,3.985658526347281646e-05,2.517791045472703461e-05
1.000000000000000021e-03,5.899169734839467818e-04,3.824058950962419133e-04,2.453416557234028707e-04,1.563972548287988369e-04,9.929890059644241613e-05,6.288793488850426760e-05,3.976526568300959219e-05,2.511936425240675192e-05
1.000000000000000021e-03,5.893722299298780965e-04,3.818475199355363483e-04,2.449000757332959262e-04,1.560821844312877747e-04,9.908539497140619857e-05,6.274733607851797545e-05,3.967421524053715842e-05,2.506099289905929403e-05
1.000000000000000021e-03,5.888282338048204554e-04,3.812902552499899305e-04,2.444595465697163919e-04,1.557679417349789946e-04,9.887248360327203632e-05,6.260714247720703990e-05,3.958343287844485109e-05,2.500279570274922987e-05
1.000000000000000021e-03,5.882849822668304897e-04,3.807340970923119234e-04,2.440200643826254091e-04,1.554545236039297650e-04,9.866016418416755746e-05,6.246735248448248958e-05,3.949291752660743311e-05,2.494477196342878550e-05
1.000000000000000021e-03,5.877403241312353140e-04,3.801768826891299322e-04,2.435799392795756472e-04,1.551407333476893054e-04,9.844762961169771281e-05,6.232743618144160702e-05,3.940232665622856909e-05,2.488670234861411131e-05
1.000000000000000021e-03,5.871942634186000593e-04,3.796186190022559433e-04,2.431391779090945110e-04,1.548265761463755335e-04,9.823488356157069126e-05,6.218739605181586088e-05,3.931166190013138108e-05,2.482858791458364441e-05
1.000000000000000021e-03,5.866468041173980141e-04,3.790593129257516128e-04,2.426977868451053722e-04,1.545120571165502460e-04,9.802192966180839372e-05,6.204723454596646772e-05,3.922092486871354988e-05,2.477042970290643410e-05
1.000000000000000021e-03,5.860979501842715923e-04,3.784989712866057847e-04,2.422557725877665796e-04,1.541971813119806349e-04,9.780877149334107738e-05,6.190695408131255699e-05,3.913011715023943305e-05,2.471222874063606835e-05
1.000000000000000021e-03,5.855428054911818777e-04,3.779325362214322600e-04,2.418091152720060536e-04,1.538790714407033914e-04,9.759345536126727376e-05,6.176526646718061210e-05,3.903840385562048950e-05,2.465344951928800295e-05
1.000000000000000021e-03,5.849813875456967485e-04,3.773600382625630725e-04,2.413578451141304101e-04,1.535577517356502032e-04,9.737599881379701964e-05,6.162218372343696363e-05,3.894579295722817337e-05,2.459409722576532997e-05
1.000000000000000021e-03,5.844137140093277807e-04,3.767815081401627831e-04,2.409019924922280132e-04,1.532332465435331354e-04,9.715641947446165209e-05,6.147771791853056712e-05,3.885229245840823961e-05,2.453417706661341544e-05
1.000000000000000021e-03,5.838398026969793654e-04,3.761969767804803125e-04,2.404415879440078890e-04,1.529055803229076760e-04,9.693473504062415536e-05,6.133188116843621776e-05,3.875791039276530608e-05,2.447369426754818325e-05
1.000000000000000021e-03,5.832596715764015120e-04,3.756064753041117783e-04,2.399766621646476654e-04,1.525747776422469490e-04,9.671096328199675835e-05,6.118468563560254894e-05,3.866265482344967213e-05,2.441265407298631344e-05
1.000000000000000021e-03,5.826733387676383139e-04,3.750100350242446291e-04,2.395072460046293692e-04,1.522408631780071723e-04,9.648512203915507620e-05,6.103614352789890607e-05,3.856653384244465896e-05,2.435106174557538284e-05
1.000000000000000021e-03,5.820810441807425326e-04,3.744079089136845458e-04,2.390335428197917333e-04,1.519039834472631588e-04,9.625731118926498641e-05,6.088632085792882825e-05,3.846959029618343478e-05,2.428894479270876788e-05
1.000000000000000021e-03,5.814828054675655030e-04,3.738001274474016776e-04,2.385555825972570808e-04,1.515641624143126585e-04,9.602754804766522702e-05,6.073522946956701240e-05,3.837183203343020677e-05,2.422630831805138899e-05
1.000000000000000021e-03,5.808786404289665358e-04,3.731867212872194738e-04,2.380733954737781241e-04,1.512214241469207320e-04,9.579584999731260704e-05,6.058288124990010364e-05,3.827326693032387752e-05,2.416315744255338838e-05
1.000000000000000021e-03,5.802685670142343878e-04,3.725677212800349654e-04,2.375870117335689917e-04,1.508757928143868079e-04,9.556223448729982074e-05,6.042928812817623899e-05,3.817390288966712009e-05,2.409949730398197492e-05
1.000000000000000021e-03,5.796526968519212725e-04,3.719432545624587992e-04,2.370965379259533010e-04,1.505273470495264228e-04,9.532675589286383365e-05,6.027448635812982831e-05,3.807376356963088358e-05,2.403534314190221437e-05
1.000000000000000021e-03,5.790310479093865609e-04,3.713133518665244839e-04,2.366020041460938778e-04,1.501761108339581341e-04,9.508943151110322721e-05,6.011848775803337427e-05,3.797285679655886708e-05,2.397070004317041725e-05
1.000000000000000021e-03,5.784036383121742876e-04,3.706780441238009577e-04,2.361034406501071276e-04,1.498221082613785163e-04,9.485027871279472060e-05,5.996130419345521918e-05,3.787119042685209972e-05,2.390557311366359151e-05
1.000000000000000021e-03,5.777704863433433301e-04,3.700373624633735868e-04,2.356008778526011383e-04,1.494653635353745394e-04,9.460931494071504256e-05,5.980294757607067669e-05,3.776877234616485572e-05,2.383996747774973522e-05
1.000000000000000021e-03,5.771316104427772061e-04,3.693913382097967039e-04,2.350943463241932639e-04,1.491059009672212558e-04,9.436655770795449559e-05,5.964342986246977532e-05,3.766561046859827219e-05,2.377388827775711285e-05
1.000000000000000021e-03,5.764870292064976651e-04,3.687400028810397501e-04,2.345838767890191692e-04,1.487437449736715462e-04,9.412202459622686095e-05,5.948276305296108525e-05,3.756171273589169023e-05,2.370734067344167480e-05
1.000000000000000021e-03,5.758375946234993610e-04,3.680842155919215072e-04,2.340701414876563216e-04,1.483793719498717782e-04,9.387603703510192111e-05,5.932115823520561543e-05,3.745721560837426419e-05,2.364041205155829344e-05
1.000000000000000021e-03,5.751833223951592329e-04,3.674240032104748388e-04,2.335531666416808738e-04,1.480128027327277474e-04,9.362861002461524574e-05,5.915862564500113025e-05,3.735212585887714390e-05,2.357310681190604310e-05
1.000000000000000021e-03,5.745242283439769499e-04,3.667593927483133397e-04,2.330329785818580578e-04,1.476440582313571256e-04,9.337975861033522300e-05,5.899517554647101613e-05,3.724645027783519551e-05,2.350542936525477225e-05
1.000000000000000021e-03,5.738603284130473379e-04,3.660904113590355527e-04,2.325096037462197861e-04,1.472731594253864234e-04,9.312949788206356194e-05,5.883081823114703288e-05,3.714019567266727830e-05,2.343738413293735195e-05
1.000000000000000021e-03,5.731917314000997948e-04,3.654171810067180655e-04,2.319831433530600859e-04,1.469001805571756218e-04,9.287787898176902846e-05,5.866558771451522606e-05,3.703338420706373603e-05,2.336898537810763873e-05
1.000000000000000021e-03,5.725184531760584700e-04,3.647397285916569422e-04,2.314536235223777264e-04,1.465251423190001693e-04,9.262491677678542706e-05,5.849949412959568328e-05,3.692602258076439168e-05,2.330023745100291859e-05
1.000000000000000021e-03,5.718405097346714646e-04,3.640580811583470273e-04,2.309210704829702432e-04,1.461480654746279682e-04,9.237062617930094123e-05,5.833254763720848617e-05,3.681811751074023914e-05,2.323114471257928647e-05
1.000000000000000021e-03,5.711579171919053044e-04,3.633722658937428313e-04,2.303855105703487465e-04,1.457689708574830614e-04,9.211502214495855044e-05,5.816475842498649012e-05,3.670967573052717390e-05,2.316171153407365905e-05
1.000000000000000021e-03,5.704706917853448337e-04,3.626823101255147543e-04,2.298469702246577707e-04,1.453878793688169360e-04,9.185811967146480901e-05,5.799613670639434487e-05,3.660070398956385041e-05,2.309194229656875218e-05
1.000000000000000021e-03,5.697788498735841109e-04,3.619882413202942504e-04,2.293054759885765847e-04,1.450048119758659754e-04,9.159993379718755254e-05,5.782669271974067121e-05,3.649120905252569737e-05,2.302184139055488024e-05
1.000000000000000021e-03,5.690839249361781711e-04,3.612915831986411477e-04,2.287622092282637863e-04,1.446206010588695675e-04,9.134102410651873409e-05,5.765679311500335815e-05,3.638142760462866287e-05,2.295156024783083523e-05
1.000000000000000021e-03,5.683859273133331363e-04,3.605923537461036641e-04,2.282171874164802170e-04,1.442352604283837097e-04,9.108140050118301682e-05,5.748644463023418617e-05,3.627136409615889481e-05,2.288110175599186700e-05
1.000000000000000021e-03,5.676848674169825831e-04,3.598905710243090802e-04,2.276704280772651710e-04,1.438488039249314222e-04,9.082107289971861372e-05,5.731565401294060850e-05,3.616102298282374168e-05,2.281046880581413228e-05
1.000000000000000021e-03,5.669807557304629327e-04,3.591862531699841626e-04,2.271219487847658911e-04,1.434612454179789358e-04,9.056005123670258442e-05,5.714442801953895405e-05,3.605040872538299508e-05,2.273966429101268041e-05
1.000000000000000021e-03,5.662756696284717943e-04,3.584815135619230891e-04,2.265734124911083147e-04,1.430737675597642188e-04,9.029913524493678829e-05,5.697329258726415482e-05,3.593986162522089478e-05,2.266890625682277028e-05
1.000000000000000021e-03,5.655696121370722921e-04,3.577763576655677066e-04,2.260248242651153531e-04,1.426863741861267136e-04,9.003832758694041048e-05,5.680224948786493348e-05,3.582938283523433764e-05,2.259819544408493697e-05
1.000000000000000021e-03,5.648625863181645518e-04,3.570707909872514684e-04,2.254761892066869196e-04,1.422990691538204475e-04,8.977763093872482745e-05,5.663130050166089515e-05,3.571897351373497692e-05,2.252753259705453904e-05
1.000000000000000021e-03,5.641545952693012783e-04,3.563648190736888295e-04,2.249275124461922067e-04,1.419118563399853763e-04,8.951704798938974166e-05,5.646044741725799208e-05,3.560863482425828067e-05,2.245691846327665519e-05
1.000000000000000021e-03,5.634456421235028989e-04,3.556584475114634488e-04,2.243787991438712611e-04,1.415247396416227112e-04,8.925658144072659398e-05,5.628969203126926030e-05,3.549836793537420297e-05,2.238635379346144160e-05
1.000000000000000021e-03,5.627357300490819225e-04,3.549516819265270164e-04,2.238300544892383743e-04,1.411377229750731741e-04,8.899623400682166435e-05,5.611903614803531905e-05,3.538817402049950172e-05,2.231583934136070575e-05
1.000000000000000021e-03,5.620265745740795878e-04,3.542462045793823072e-04,2.232825718355581747e-04,1.407517127660701999e-04,8.873661298955798349e-05,5.594887683102661642e-05,3.527830905094599801e-05,2.224553873809700179e-05
1.000000000000000021e-03,5.613181716914067464e-04,3.535420099674467737e-04,2.227363458317740963e-04,1.403667046661989041e-04,8.847771519474716161e-05,5.577921186868756777e-05,3.516877154903826080e-05,2.217545101761858074e-05
1.000000000000000021e-03,5.606105174362018646e-04,3.528390926567629869e-04,2.221913711948466166e-04,1.399826943822104249e-04,8.821953746856249804e-05,5.561003907731979445e-05,3.505956005567386572e-05,2.210557522599888898e-05
1.000000000000000021e-03,5.599036078855734169e-04,3.521374472813410678e-04,2.216476427089692435e-04,1.395996776753266513e-04,8.796207669700402236e-05,5.544135630070159596e-05,3.495067313006486022e-05,2.203591042126611129e-05
1.000000000000000021e-03,5.591992581819900257e-04,3.514388991464684675e-04,2.211065862108586844e-04,1.392186639199167455e-04,8.770601346645835294e-05,5.527361030479937100e-05,3.484239951455165907e-05,2.196664147854661471e-05
1.000000000000000021e-03,5.584974577369657654e-04,3.507434317312190116e-04,2.205681855748304113e-04,1.388396401724235928e-04,8.745133837595373525e-05,5.510679463338290224e-05,3.473473491875524963e-05,2.189776560286087024e-05
1.000000000000000021e-03,5.577981960279812567e-04,3.500510286412654524e-04,2.200324248112712805e-04,1.384625936044855835e-04,8.719804211084999142e-05,5.494090289064881491e-05,3.462767509292537455e-05,2.182928002589032757e-05
1.000000000000000021e-03,5.571014625980537805e-04,3.493616736077873519e-04,2.194992880653100025e-04,1.380875115017372141e-04,8.694611544190507637e-05,5.477592874055209164e-05,3.452121582748434684e-05,2.176118200567564087e-05
1.000000000000000021e-03,5.564072470552914543e-04,3.486753504863699662e-04,2.189687596154907018e-04,1.377143812626113696e-04,8.669554922434540153e-05,5.461186590614181566e-05,3.441535295257522900e-05,2.169346882631773742e-05
1.000000000000000021e-03,5.557155390724777657e-04,3.479920432559456848e-04,2.184408238724854000e-04,1.373431903971786034e-04,8.644633439696230146e-05,5.444870816891464747e-05,3.431008233762035268e-05,2.162613779768559453e-05
1.000000000000000021e-03,5.550282308874212147e-04,3.473135853761227104e-04,2.179168797741835634e-04,1.369749146289257855e-04,8.619912270820690987e-05,5.428688083545962664e-05,3.420567782931384528e-05,2.155936384410790980e-05
1.000000000000000021e-03,5.543453044039096641e-04,3.466399489498413807e-04,2.173969005859271932e-04,1.366095327799803094e-04,8.595389890905566596e-05,5.412637349122350694e-05,3.410213253115887156e-05,2.149314248283782383e-05
1.000000000000000021e-03,5.536667416543260278e-04,3.459711063207645686e-04,2.168808598269340415e-04,1.362470238846985658e-04,8.571064790824490891e-05,5.396717583150281386e-05,3.399943962027434491e-05,2.142746927933548718e-05
1.000000000000000021e-03,5.529925247987736454e-04,3.453070300711248903e-04,2.163687312677279435e-04,1.358873671873677324e-04,8.546935477049620155e-05,5.380927766017944798e-05,3.389759234653519571e-05,2.136233984669994517e-05
1.000000000000000021e-03,5.523242123557685823e-04,3.446492679875326503e-04,2.158617145497228296e-04,1.355314077800207832e-04,8.523058755788532964e-05,5.365305115434923267e-05,3.379683095199963850e-05,2.129790788796336886e-05
1.000000000000000021e-03,5.516617811459008413e-04,3.439977838203789025e-04,2.153597748770509342e-04,1.351791181086447731e-04,8.499432644189092710e-05,5.349848277838686991e-05,3.369714647650299112e-05,2.123416758034315385e-05
1.000000000000000021e-03,5.510052081904127453e-04,3.433525416882428740e-04,2.148628778379304833e-04,1.348304709382760146e-04,8.476055183025699440e-05,5.334555916079864168e-05,3.359853006971443923e-05,2.117111317291617240e-05
1.000000000000000021e-03,5.503544707098636342e-04,3.427135060745518090e-04,2.143709894006651793e-04,1.344854393494213974e-04,8.452924436422564868e-05,5.319426709225049006e-05,3.350097298979682009e-05,2.110873898573355285e-05
1.000000000000000021e-03,5.497095461228062706e-04,3.420806418242862412e-04,2.138840759097000895e-04,1.341439967345312348e-04,8.430038491581448882e-05,5.304459352362807473e-05,3.340446660208796169e-05,2.104703940894962140e-05
1.000000000000000021e-03,5.490704120444732210e-04,3.414539141407250565e-04,2.134021040817290626e-04,1.338061167945246396e-04,8.407395458513211085e-05,5.289652556412503305e-05,3.330900237780223545e-05,2.098600890196449472e-05
1.000000000000000021e-03,5.484371298422446297e-04,3.408333692467681113e-04,2.129251024270059081e-04,1.334718163299163942e-04,8.384996326436759272e-05,5.275006911363530105e-05,3.321458388816914869e-05,2.092564965374723430e-05
1.000000000000000021e-03,5.478096771889333057e-04,3.402189725469309967e-04,2.124530379214265854e-04,1.331410692793207290e-04,8.362839223924152716e-05,5.260521141428185532e-05,3.312120269498457291e-05,2.086595618361951373e-05
1.000000000000000021e-03,5.471880319478338028e-04,3.396106897916775086e-04,2.119858778995733334e-04,1.328138498781884043e-04,8.340922301478033581e-05,5.246193986031627375e-05,3.302885046175365648e-05,2.080692307740899109e-05
1.000000000000000021e-03,5.465721721714859958e-04,3.390084870743713592e-04,2.115235900510876890e-04,1.324901326555763298e-04,8.319243731282516567e-05,5.232024199634728476e-05,3.293751895248773966e-05,2.074854498665493433e-05
1.000000000000000021e-03,5.459629241404544706e-04,3.384131725428774743e-04,2.110667946787101129e-04,1.321703518944146796e-04,8.297832591380873519e-05,5.218030786215170435e-05,3.284733064718059383e-05,2.069090019482566404e-05
1.000000000000000021e-03,5.453602635114507746e-04,3.378247083723790616e-04,2.106154557101209946e-04,1.318544791589579420e-04,8.276686841524559784e-05,5.204212355675735553e-05,3.275827635494999894e-05,2.063398273378693265e-05
1.000000000000000021e-03,5.447641661727002649e-04,3.372430571518834691e-04,2.101695374983407439e-04,1.315424863636820575e-04,8.255804467261116894e-05,5.190567535780167048e-05,3.267034700418964161e-05,2.057778671334094953e-05
1.000000000000000021e-03,5.441746082424759419e-04,3.366681818805845774e-04,2.097290048174083239e-04,1.312343457694375884e-04,8.235183479637930588e-05,5.177094971942625129e-05,3.258353364113958107e-05,2.052230632028256941e-05
1.000000000000000021e-03,5.435915660676414983e-04,3.361000459642789163e-04,2.092938228581225045e-04,1.309300299796617602e-04,8.214821914910500468e-05,5.163793327020207291e-05,3.249782742847867687e-05,2.046753581747058517e-05
1.000000000000000021e-03,5.430150162222109568e-04,3.355386132118161487e-04,2.088639572238308215e-04,1.306295119366350911e-04,8.194717834254394587e-05,5.150661281108238069e-05,3.241321964393507540e-05,2.041346954291065543e-05
1.000000000000000021e-03,5.424450181544462771e-04,3.349839271155603902e-04,2.084394340599780252e-04,1.303328067075743425e-04,8.174872108664715700e-05,5.137699346328779477e-05,3.232971335519106785e-05,2.036010936323692981e-05
1.000000000000000021e-03,5.418815485793469040e-04,3.344359518126675877e-04,2.080202193468776877e-04,1.300398875631312602e-04,8.155282824274543232e-05,5.124906220377890154e-05,3.224729995882103797e-05,2.030744969463951815e-05
1.000000000000000021e-03,5.413245844265015877e-04,3.338946518213946552e-04,2.076062794549138172e-04,1.297507280942760690e-04,8.135948090770286575e-05,5.112280617242197348e-05,3.216597096011364272e-05,2.025548502431296445e-05
1.000000000000000021e-03,5.407741028387587183e-04,3.333599920378552692e-04,2.071975811406991498e-04,1.294653022088876294e-04,8.116866041129419294e-05,5.099821267012491396e-05,3.208571797180734118e-05,2.020420990962221080e-05
1.000000000000000021e-03,5.402303025747014556e-04,3.328321561526745862e-04,2.067942601549091974e-04,1.291837026153304184e-04,8.098042783792958120e-05,5.087532120941394917e-05,3.200656629292941073e-05,2.015364045325785942e-05
1.000000000000000021e-03,5.396931605409548225e-04,3.323111087173311550e-04,2.063962829591101838e-04,1.289059030082810651e-04,8.079476437365657295e-05,5.075411899733799342e-05,3.192850747587867838e-05,2.010377117411100997e-05
1.000000000000000021e-03,5.391626538584482192e-04,3.317968146613820609e-04,2.060036164003212873e-04,1.286318773981824648e-04,8.061165143636152362e-05,5.063459340114707095e-05,3.185153317990099749e-05,2.005459666083220688e-05
1.000000000000000021e-03,5.386387598611086340e-04,3.312892392892789490e-04,2.056162277072543561e-04,1.283616001079104806e-04,8.043107067321031531e-05,5.051673194647494236e-05,3.177563516985718072e-05,2.000611157101859271e-05
1.000000000000000021e-03,5.381214560945620949e-04,3.307883482772016118e-04,2.052340844865845515e-04,1.280950457694747437e-04,8.025300395811590449e-05,5.040052231554306949e-05,3.170080531500530551e-05,1.995831063041139523e-05
1.000000000000000021e-03,5.376107203148404326e-04,3.302941076699326679e-04,2.048571547192701043e-04,1.278321893207613302e-04,8.007743338923888358e-05,5.028595234538581714e-05,3.162703558779804923e-05,1.991118863210237610e-05
1.000000000000000021e-03,5.371022748594453389e-04,3.298024246812891291e-04,2.044823390252625600e-04,1.275708788891961756e-04,7.990292563076895462e-05,5.017208832604374468e-05,3.155372544493714152e-05,1.986436223028797206e-05
1.000000000000000021e-03,5.365961117498912114e-04,3.293132869081722108e-04,2.041096254707852251e-04,1.273111050031557620e-04,7.972947385597059739e-05,5.005892559260894715e-05,3.148087179640124731e-05,1.981782941609088261e-05
1.000000000000000021e-03,5.360922230056120808e-04,3.288266819633119922e-04,2.037390021489647173e-04,1.270528582181514683e-04,7.955707126027152540e-05,4.994645949643470906e-05,3.140847156340457124e-05,1.977158818812822943e-05
1.000000000000000021e-03,5.355906006439992324e-04,3.283425974753378354e-04,2.033704571798752555e-04,1.267961291168465381e-04,7.938571106126265876e-05,4.983468540512894492e-05,3.133652167839010846e-05,1.972563655250571181e-05
1.000000000000000021e-03,5.350891259362026411e-04,3.278589502113704612e-04,2.030023855884717748e-04,1.265397912200834861e-04,7.921463777328526478e-05,4.972310904903239575e-05,3.126470337114675132e-05,1.967977067875568528e-05
1.000000000000000021e-03,5.345877966909636306e-04,3.273757374134148111e-04,2.026347848040474173e-04,1.262838424862170036e-04,7.904384991646645146e-05,4.961172941171763403e-05,3.119301596587686584e-05,1.963399012641590455e-05
1.000000000000000021e-03,5.340866106918126799e-04,3.268929562877650259e-04,2.022676522245876859e-04,1.260282808504260116e-04,7.887334599501782170e-05,4.950054546622813158e-05,3.112145877995456692e-05,1.958829445064508602e-05
1.000000000000000021e-03,5.335855656972701092e-04,3.264106040054970534e-04,2.019009852173301103e-04,1.257731042251948573e-04,7.870312449759831505e-05,4.938955617533215942e-05,3.105003112409614148e-05,1.954268320233478379e-05
1.000000000000000021e-03,5.330846594410641130e-04,3.259286777029715004e-04,2.015347811193284109e-04,1.255183105007985753e-04,7.853318389767883849e-05,4.927876049177821896e-05,3.097873230253197569e-05,1.949715592822227211e-05
1 1.000000000000000021e-03 5.915557166626927424e-04 3.840877221245049653e-04 2.466727384040633977e-04 1.573474629975438242e-04 9.994300566924636483e-05 6.331217828438720550e-05 4.004003600460594289e-05 2.529553013238426405e-05
2 1.000000000000000021e-03 5.910087140881509866e-04 3.835259923737136521e-04 2.462279833344210639e-04 1.570298910751132091e-04 9.972770370845923681e-05 6.317035443958771254e-05 3.994817502675088248e-05 2.523663218966317481e-05
3 1.000000000000000021e-03 5.904624672772724710e-04 3.829653846278134621e-04 2.457842903404500092e-04 1.567131560243821098e-04 9.951300275831494635e-05 6.302894048828063141e-05 3.985658526347281646e-05 2.517791045472703461e-05
4 1.000000000000000021e-03 5.899169734839467818e-04 3.824058950962419133e-04 2.453416557234028707e-04 1.563972548287988369e-04 9.929890059644241613e-05 6.288793488850426760e-05 3.976526568300959219e-05 2.511936425240675192e-05
5 1.000000000000000021e-03 5.893722299298780965e-04 3.818475199355363483e-04 2.449000757332959262e-04 1.560821844312877747e-04 9.908539497140619857e-05 6.274733607851797545e-05 3.967421524053715842e-05 2.506099289905929403e-05
6 1.000000000000000021e-03 5.888282338048204554e-04 3.812902552499899305e-04 2.444595465697163919e-04 1.557679417349789946e-04 9.887248360327203632e-05 6.260714247720703990e-05 3.958343287844485109e-05 2.500279570274922987e-05
7 1.000000000000000021e-03 5.882849822668304897e-04 3.807340970923119234e-04 2.440200643826254091e-04 1.554545236039297650e-04 9.866016418416755746e-05 6.246735248448248958e-05 3.949291752660743311e-05 2.494477196342878550e-05
8 1.000000000000000021e-03 5.877403241312353140e-04 3.801768826891299322e-04 2.435799392795756472e-04 1.551407333476893054e-04 9.844762961169771281e-05 6.232743618144160702e-05 3.940232665622856909e-05 2.488670234861411131e-05
9 1.000000000000000021e-03 5.871942634186000593e-04 3.796186190022559433e-04 2.431391779090945110e-04 1.548265761463755335e-04 9.823488356157069126e-05 6.218739605181586088e-05 3.931166190013138108e-05 2.482858791458364441e-05
10 1.000000000000000021e-03 5.866468041173980141e-04 3.790593129257516128e-04 2.426977868451053722e-04 1.545120571165502460e-04 9.802192966180839372e-05 6.204723454596646772e-05 3.922092486871354988e-05 2.477042970290643410e-05
11 1.000000000000000021e-03 5.860979501842715923e-04 3.784989712866057847e-04 2.422557725877665796e-04 1.541971813119806349e-04 9.780877149334107738e-05 6.190695408131255699e-05 3.913011715023943305e-05 2.471222874063606835e-05
12 1.000000000000000021e-03 5.855428054911818777e-04 3.779325362214322600e-04 2.418091152720060536e-04 1.538790714407033914e-04 9.759345536126727376e-05 6.176526646718061210e-05 3.903840385562048950e-05 2.465344951928800295e-05
13 1.000000000000000021e-03 5.849813875456967485e-04 3.773600382625630725e-04 2.413578451141304101e-04 1.535577517356502032e-04 9.737599881379701964e-05 6.162218372343696363e-05 3.894579295722817337e-05 2.459409722576532997e-05
14 1.000000000000000021e-03 5.844137140093277807e-04 3.767815081401627831e-04 2.409019924922280132e-04 1.532332465435331354e-04 9.715641947446165209e-05 6.147771791853056712e-05 3.885229245840823961e-05 2.453417706661341544e-05
15 1.000000000000000021e-03 5.838398026969793654e-04 3.761969767804803125e-04 2.404415879440078890e-04 1.529055803229076760e-04 9.693473504062415536e-05 6.133188116843621776e-05 3.875791039276530608e-05 2.447369426754818325e-05
16 1.000000000000000021e-03 5.832596715764015120e-04 3.756064753041117783e-04 2.399766621646476654e-04 1.525747776422469490e-04 9.671096328199675835e-05 6.118468563560254894e-05 3.866265482344967213e-05 2.441265407298631344e-05
17 1.000000000000000021e-03 5.826733387676383139e-04 3.750100350242446291e-04 2.395072460046293692e-04 1.522408631780071723e-04 9.648512203915507620e-05 6.103614352789890607e-05 3.856653384244465896e-05 2.435106174557538284e-05
18 1.000000000000000021e-03 5.820810441807425326e-04 3.744079089136845458e-04 2.390335428197917333e-04 1.519039834472631588e-04 9.625731118926498641e-05 6.088632085792882825e-05 3.846959029618343478e-05 2.428894479270876788e-05
19 1.000000000000000021e-03 5.814828054675655030e-04 3.738001274474016776e-04 2.385555825972570808e-04 1.515641624143126585e-04 9.602754804766522702e-05 6.073522946956701240e-05 3.837183203343020677e-05 2.422630831805138899e-05
20 1.000000000000000021e-03 5.808786404289665358e-04 3.731867212872194738e-04 2.380733954737781241e-04 1.512214241469207320e-04 9.579584999731260704e-05 6.058288124990010364e-05 3.827326693032387752e-05 2.416315744255338838e-05
21 1.000000000000000021e-03 5.802685670142343878e-04 3.725677212800349654e-04 2.375870117335689917e-04 1.508757928143868079e-04 9.556223448729982074e-05 6.042928812817623899e-05 3.817390288966712009e-05 2.409949730398197492e-05
22 1.000000000000000021e-03 5.796526968519212725e-04 3.719432545624587992e-04 2.370965379259533010e-04 1.505273470495264228e-04 9.532675589286383365e-05 6.027448635812982831e-05 3.807376356963088358e-05 2.403534314190221437e-05
23 1.000000000000000021e-03 5.790310479093865609e-04 3.713133518665244839e-04 2.366020041460938778e-04 1.501761108339581341e-04 9.508943151110322721e-05 6.011848775803337427e-05 3.797285679655886708e-05 2.397070004317041725e-05
24 1.000000000000000021e-03 5.784036383121742876e-04 3.706780441238009577e-04 2.361034406501071276e-04 1.498221082613785163e-04 9.485027871279472060e-05 5.996130419345521918e-05 3.787119042685209972e-05 2.390557311366359151e-05
25 1.000000000000000021e-03 5.777704863433433301e-04 3.700373624633735868e-04 2.356008778526011383e-04 1.494653635353745394e-04 9.460931494071504256e-05 5.980294757607067669e-05 3.776877234616485572e-05 2.383996747774973522e-05
26 1.000000000000000021e-03 5.771316104427772061e-04 3.693913382097967039e-04 2.350943463241932639e-04 1.491059009672212558e-04 9.436655770795449559e-05 5.964342986246977532e-05 3.766561046859827219e-05 2.377388827775711285e-05
27 1.000000000000000021e-03 5.764870292064976651e-04 3.687400028810397501e-04 2.345838767890191692e-04 1.487437449736715462e-04 9.412202459622686095e-05 5.948276305296108525e-05 3.756171273589169023e-05 2.370734067344167480e-05
28 1.000000000000000021e-03 5.758375946234993610e-04 3.680842155919215072e-04 2.340701414876563216e-04 1.483793719498717782e-04 9.387603703510192111e-05 5.932115823520561543e-05 3.745721560837426419e-05 2.364041205155829344e-05
29 1.000000000000000021e-03 5.751833223951592329e-04 3.674240032104748388e-04 2.335531666416808738e-04 1.480128027327277474e-04 9.362861002461524574e-05 5.915862564500113025e-05 3.735212585887714390e-05 2.357310681190604310e-05
30 1.000000000000000021e-03 5.745242283439769499e-04 3.667593927483133397e-04 2.330329785818580578e-04 1.476440582313571256e-04 9.337975861033522300e-05 5.899517554647101613e-05 3.724645027783519551e-05 2.350542936525477225e-05
31 1.000000000000000021e-03 5.738603284130473379e-04 3.660904113590355527e-04 2.325096037462197861e-04 1.472731594253864234e-04 9.312949788206356194e-05 5.883081823114703288e-05 3.714019567266727830e-05 2.343738413293735195e-05
32 1.000000000000000021e-03 5.731917314000997948e-04 3.654171810067180655e-04 2.319831433530600859e-04 1.469001805571756218e-04 9.287787898176902846e-05 5.866558771451522606e-05 3.703338420706373603e-05 2.336898537810763873e-05
33 1.000000000000000021e-03 5.725184531760584700e-04 3.647397285916569422e-04 2.314536235223777264e-04 1.465251423190001693e-04 9.262491677678542706e-05 5.849949412959568328e-05 3.692602258076439168e-05 2.330023745100291859e-05
34 1.000000000000000021e-03 5.718405097346714646e-04 3.640580811583470273e-04 2.309210704829702432e-04 1.461480654746279682e-04 9.237062617930094123e-05 5.833254763720848617e-05 3.681811751074023914e-05 2.323114471257928647e-05
35 1.000000000000000021e-03 5.711579171919053044e-04 3.633722658937428313e-04 2.303855105703487465e-04 1.457689708574830614e-04 9.211502214495855044e-05 5.816475842498649012e-05 3.670967573052717390e-05 2.316171153407365905e-05
36 1.000000000000000021e-03 5.704706917853448337e-04 3.626823101255147543e-04 2.298469702246577707e-04 1.453878793688169360e-04 9.185811967146480901e-05 5.799613670639434487e-05 3.660070398956385041e-05 2.309194229656875218e-05
37 1.000000000000000021e-03 5.697788498735841109e-04 3.619882413202942504e-04 2.293054759885765847e-04 1.450048119758659754e-04 9.159993379718755254e-05 5.782669271974067121e-05 3.649120905252569737e-05 2.302184139055488024e-05
38 1.000000000000000021e-03 5.690839249361781711e-04 3.612915831986411477e-04 2.287622092282637863e-04 1.446206010588695675e-04 9.134102410651873409e-05 5.765679311500335815e-05 3.638142760462866287e-05 2.295156024783083523e-05
39 1.000000000000000021e-03 5.683859273133331363e-04 3.605923537461036641e-04 2.282171874164802170e-04 1.442352604283837097e-04 9.108140050118301682e-05 5.748644463023418617e-05 3.627136409615889481e-05 2.288110175599186700e-05
40 1.000000000000000021e-03 5.676848674169825831e-04 3.598905710243090802e-04 2.276704280772651710e-04 1.438488039249314222e-04 9.082107289971861372e-05 5.731565401294060850e-05 3.616102298282374168e-05 2.281046880581413228e-05
41 1.000000000000000021e-03 5.669807557304629327e-04 3.591862531699841626e-04 2.271219487847658911e-04 1.434612454179789358e-04 9.056005123670258442e-05 5.714442801953895405e-05 3.605040872538299508e-05 2.273966429101268041e-05
42 1.000000000000000021e-03 5.662756696284717943e-04 3.584815135619230891e-04 2.265734124911083147e-04 1.430737675597642188e-04 9.029913524493678829e-05 5.697329258726415482e-05 3.593986162522089478e-05 2.266890625682277028e-05
43 1.000000000000000021e-03 5.655696121370722921e-04 3.577763576655677066e-04 2.260248242651153531e-04 1.426863741861267136e-04 9.003832758694041048e-05 5.680224948786493348e-05 3.582938283523433764e-05 2.259819544408493697e-05
44 1.000000000000000021e-03 5.648625863181645518e-04 3.570707909872514684e-04 2.254761892066869196e-04 1.422990691538204475e-04 8.977763093872482745e-05 5.663130050166089515e-05 3.571897351373497692e-05 2.252753259705453904e-05
45 1.000000000000000021e-03 5.641545952693012783e-04 3.563648190736888295e-04 2.249275124461922067e-04 1.419118563399853763e-04 8.951704798938974166e-05 5.646044741725799208e-05 3.560863482425828067e-05 2.245691846327665519e-05
46 1.000000000000000021e-03 5.634456421235028989e-04 3.556584475114634488e-04 2.243787991438712611e-04 1.415247396416227112e-04 8.925658144072659398e-05 5.628969203126926030e-05 3.549836793537420297e-05 2.238635379346144160e-05
47 1.000000000000000021e-03 5.627357300490819225e-04 3.549516819265270164e-04 2.238300544892383743e-04 1.411377229750731741e-04 8.899623400682166435e-05 5.611903614803531905e-05 3.538817402049950172e-05 2.231583934136070575e-05
48 1.000000000000000021e-03 5.620265745740795878e-04 3.542462045793823072e-04 2.232825718355581747e-04 1.407517127660701999e-04 8.873661298955798349e-05 5.594887683102661642e-05 3.527830905094599801e-05 2.224553873809700179e-05
49 1.000000000000000021e-03 5.613181716914067464e-04 3.535420099674467737e-04 2.227363458317740963e-04 1.403667046661989041e-04 8.847771519474716161e-05 5.577921186868756777e-05 3.516877154903826080e-05 2.217545101761858074e-05
50 1.000000000000000021e-03 5.606105174362018646e-04 3.528390926567629869e-04 2.221913711948466166e-04 1.399826943822104249e-04 8.821953746856249804e-05 5.561003907731979445e-05 3.505956005567386572e-05 2.210557522599888898e-05
51 1.000000000000000021e-03 5.599036078855734169e-04 3.521374472813410678e-04 2.216476427089692435e-04 1.395996776753266513e-04 8.796207669700402236e-05 5.544135630070159596e-05 3.495067313006486022e-05 2.203591042126611129e-05
52 1.000000000000000021e-03 5.591992581819900257e-04 3.514388991464684675e-04 2.211065862108586844e-04 1.392186639199167455e-04 8.770601346645835294e-05 5.527361030479937100e-05 3.484239951455165907e-05 2.196664147854661471e-05
53 1.000000000000000021e-03 5.584974577369657654e-04 3.507434317312190116e-04 2.205681855748304113e-04 1.388396401724235928e-04 8.745133837595373525e-05 5.510679463338290224e-05 3.473473491875524963e-05 2.189776560286087024e-05
54 1.000000000000000021e-03 5.577981960279812567e-04 3.500510286412654524e-04 2.200324248112712805e-04 1.384625936044855835e-04 8.719804211084999142e-05 5.494090289064881491e-05 3.462767509292537455e-05 2.182928002589032757e-05
55 1.000000000000000021e-03 5.571014625980537805e-04 3.493616736077873519e-04 2.194992880653100025e-04 1.380875115017372141e-04 8.694611544190507637e-05 5.477592874055209164e-05 3.452121582748434684e-05 2.176118200567564087e-05
56 1.000000000000000021e-03 5.564072470552914543e-04 3.486753504863699662e-04 2.189687596154907018e-04 1.377143812626113696e-04 8.669554922434540153e-05 5.461186590614181566e-05 3.441535295257522900e-05 2.169346882631773742e-05
57 1.000000000000000021e-03 5.557155390724777657e-04 3.479920432559456848e-04 2.184408238724854000e-04 1.373431903971786034e-04 8.644633439696230146e-05 5.444870816891464747e-05 3.431008233762035268e-05 2.162613779768559453e-05
58 1.000000000000000021e-03 5.550282308874212147e-04 3.473135853761227104e-04 2.179168797741835634e-04 1.369749146289257855e-04 8.619912270820690987e-05 5.428688083545962664e-05 3.420567782931384528e-05 2.155936384410790980e-05
59 1.000000000000000021e-03 5.543453044039096641e-04 3.466399489498413807e-04 2.173969005859271932e-04 1.366095327799803094e-04 8.595389890905566596e-05 5.412637349122350694e-05 3.410213253115887156e-05 2.149314248283782383e-05
60 1.000000000000000021e-03 5.536667416543260278e-04 3.459711063207645686e-04 2.168808598269340415e-04 1.362470238846985658e-04 8.571064790824490891e-05 5.396717583150281386e-05 3.399943962027434491e-05 2.142746927933548718e-05
61 1.000000000000000021e-03 5.529925247987736454e-04 3.453070300711248903e-04 2.163687312677279435e-04 1.358873671873677324e-04 8.546935477049620155e-05 5.380927766017944798e-05 3.389759234653519571e-05 2.136233984669994517e-05
62 1.000000000000000021e-03 5.523242123557685823e-04 3.446492679875326503e-04 2.158617145497228296e-04 1.355314077800207832e-04 8.523058755788532964e-05 5.365305115434923267e-05 3.379683095199963850e-05 2.129790788796336886e-05
63 1.000000000000000021e-03 5.516617811459008413e-04 3.439977838203789025e-04 2.153597748770509342e-04 1.351791181086447731e-04 8.499432644189092710e-05 5.349848277838686991e-05 3.369714647650299112e-05 2.123416758034315385e-05
64 1.000000000000000021e-03 5.510052081904127453e-04 3.433525416882428740e-04 2.148628778379304833e-04 1.348304709382760146e-04 8.476055183025699440e-05 5.334555916079864168e-05 3.359853006971443923e-05 2.117111317291617240e-05
65 1.000000000000000021e-03 5.503544707098636342e-04 3.427135060745518090e-04 2.143709894006651793e-04 1.344854393494213974e-04 8.452924436422564868e-05 5.319426709225049006e-05 3.350097298979682009e-05 2.110873898573355285e-05
66 1.000000000000000021e-03 5.497095461228062706e-04 3.420806418242862412e-04 2.138840759097000895e-04 1.341439967345312348e-04 8.430038491581448882e-05 5.304459352362807473e-05 3.340446660208796169e-05 2.104703940894962140e-05
67 1.000000000000000021e-03 5.490704120444732210e-04 3.414539141407250565e-04 2.134021040817290626e-04 1.338061167945246396e-04 8.407395458513211085e-05 5.289652556412503305e-05 3.330900237780223545e-05 2.098600890196449472e-05
68 1.000000000000000021e-03 5.484371298422446297e-04 3.408333692467681113e-04 2.129251024270059081e-04 1.334718163299163942e-04 8.384996326436759272e-05 5.275006911363530105e-05 3.321458388816914869e-05 2.092564965374723430e-05
69 1.000000000000000021e-03 5.478096771889333057e-04 3.402189725469309967e-04 2.124530379214265854e-04 1.331410692793207290e-04 8.362839223924152716e-05 5.260521141428185532e-05 3.312120269498457291e-05 2.086595618361951373e-05
70 1.000000000000000021e-03 5.471880319478338028e-04 3.396106897916775086e-04 2.119858778995733334e-04 1.328138498781884043e-04 8.340922301478033581e-05 5.246193986031627375e-05 3.302885046175365648e-05 2.080692307740899109e-05
71 1.000000000000000021e-03 5.465721721714859958e-04 3.390084870743713592e-04 2.115235900510876890e-04 1.324901326555763298e-04 8.319243731282516567e-05 5.232024199634728476e-05 3.293751895248773966e-05 2.074854498665493433e-05
72 1.000000000000000021e-03 5.459629241404544706e-04 3.384131725428774743e-04 2.110667946787101129e-04 1.321703518944146796e-04 8.297832591380873519e-05 5.218030786215170435e-05 3.284733064718059383e-05 2.069090019482566404e-05
73 1.000000000000000021e-03 5.453602635114507746e-04 3.378247083723790616e-04 2.106154557101209946e-04 1.318544791589579420e-04 8.276686841524559784e-05 5.204212355675735553e-05 3.275827635494999894e-05 2.063398273378693265e-05
74 1.000000000000000021e-03 5.447641661727002649e-04 3.372430571518834691e-04 2.101695374983407439e-04 1.315424863636820575e-04 8.255804467261116894e-05 5.190567535780167048e-05 3.267034700418964161e-05 2.057778671334094953e-05
75 1.000000000000000021e-03 5.441746082424759419e-04 3.366681818805845774e-04 2.097290048174083239e-04 1.312343457694375884e-04 8.235183479637930588e-05 5.177094971942625129e-05 3.258353364113958107e-05 2.052230632028256941e-05
76 1.000000000000000021e-03 5.435915660676414983e-04 3.361000459642789163e-04 2.092938228581225045e-04 1.309300299796617602e-04 8.214821914910500468e-05 5.163793327020207291e-05 3.249782742847867687e-05 2.046753581747058517e-05
77 1.000000000000000021e-03 5.430150162222109568e-04 3.355386132118161487e-04 2.088639572238308215e-04 1.306295119366350911e-04 8.194717834254394587e-05 5.150661281108238069e-05 3.241321964393507540e-05 2.041346954291065543e-05
78 1.000000000000000021e-03 5.424450181544462771e-04 3.349839271155603902e-04 2.084394340599780252e-04 1.303328067075743425e-04 8.174872108664715700e-05 5.137699346328779477e-05 3.232971335519106785e-05 2.036010936323692981e-05
79 1.000000000000000021e-03 5.418815485793469040e-04 3.344359518126675877e-04 2.080202193468776877e-04 1.300398875631312602e-04 8.155282824274543232e-05 5.124906220377890154e-05 3.224729995882103797e-05 2.030744969463951815e-05
80 1.000000000000000021e-03 5.413245844265015877e-04 3.338946518213946552e-04 2.076062794549138172e-04 1.297507280942760690e-04 8.135948090770286575e-05 5.112280617242197348e-05 3.216597096011364272e-05 2.025548502431296445e-05
81 1.000000000000000021e-03 5.407741028387587183e-04 3.333599920378552692e-04 2.071975811406991498e-04 1.294653022088876294e-04 8.116866041129419294e-05 5.099821267012491396e-05 3.208571797180734118e-05 2.020420990962221080e-05
82 1.000000000000000021e-03 5.402303025747014556e-04 3.328321561526745862e-04 2.067942601549091974e-04 1.291837026153304184e-04 8.098042783792958120e-05 5.087532120941394917e-05 3.200656629292941073e-05 2.015364045325785942e-05
83 1.000000000000000021e-03 5.396931605409548225e-04 3.323111087173311550e-04 2.063962829591101838e-04 1.289059030082810651e-04 8.079476437365657295e-05 5.075411899733799342e-05 3.192850747587867838e-05 2.010377117411100997e-05
84 1.000000000000000021e-03 5.391626538584482192e-04 3.317968146613820609e-04 2.060036164003212873e-04 1.286318773981824648e-04 8.061165143636152362e-05 5.063459340114707095e-05 3.185153317990099749e-05 2.005459666083220688e-05
85 1.000000000000000021e-03 5.386387598611086340e-04 3.312892392892789490e-04 2.056162277072543561e-04 1.283616001079104806e-04 8.043107067321031531e-05 5.051673194647494236e-05 3.177563516985718072e-05 2.000611157101859271e-05
86 1.000000000000000021e-03 5.381214560945620949e-04 3.307883482772016118e-04 2.052340844865845515e-04 1.280950457694747437e-04 8.025300395811590449e-05 5.040052231554306949e-05 3.170080531500530551e-05 1.995831063041139523e-05
87 1.000000000000000021e-03 5.376107203148404326e-04 3.302941076699326679e-04 2.048571547192701043e-04 1.278321893207613302e-04 8.007743338923888358e-05 5.028595234538581714e-05 3.162703558779804923e-05 1.991118863210237610e-05
88 1.000000000000000021e-03 5.371022748594453389e-04 3.298024246812891291e-04 2.044823390252625600e-04 1.275708788891961756e-04 7.990292563076895462e-05 5.017208832604374468e-05 3.155372544493714152e-05 1.986436223028797206e-05
89 1.000000000000000021e-03 5.365961117498912114e-04 3.293132869081722108e-04 2.041096254707852251e-04 1.273111050031557620e-04 7.972947385597059739e-05 5.005892559260894715e-05 3.148087179640124731e-05 1.981782941609088261e-05
90 1.000000000000000021e-03 5.360922230056120808e-04 3.288266819633119922e-04 2.037390021489647173e-04 1.270528582181514683e-04 7.955707126027152540e-05 4.994645949643470906e-05 3.140847156340457124e-05 1.977158818812822943e-05
91 1.000000000000000021e-03 5.355906006439992324e-04 3.283425974753378354e-04 2.033704571798752555e-04 1.267961291168465381e-04 7.938571106126265876e-05 4.983468540512894492e-05 3.133652167839010846e-05 1.972563655250571181e-05
92 1.000000000000000021e-03 5.350891259362026411e-04 3.278589502113704612e-04 2.030023855884717748e-04 1.265397912200834861e-04 7.921463777328526478e-05 4.972310904903239575e-05 3.126470337114675132e-05 1.967977067875568528e-05
93 1.000000000000000021e-03 5.345877966909636306e-04 3.273757374134148111e-04 2.026347848040474173e-04 1.262838424862170036e-04 7.904384991646645146e-05 4.961172941171763403e-05 3.119301596587686584e-05 1.963399012641590455e-05
94 1.000000000000000021e-03 5.340866106918126799e-04 3.268929562877650259e-04 2.022676522245876859e-04 1.260282808504260116e-04 7.887334599501782170e-05 4.950054546622813158e-05 3.112145877995456692e-05 1.958829445064508602e-05
95 1.000000000000000021e-03 5.335855656972701092e-04 3.264106040054970534e-04 2.019009852173301103e-04 1.257731042251948573e-04 7.870312449759831505e-05 4.938955617533215942e-05 3.105003112409614148e-05 1.954268320233478379e-05
96 1.000000000000000021e-03 5.330846594410641130e-04 3.259286777029715004e-04 2.015347811193284109e-04 1.255183105007985753e-04 7.853318389767883849e-05 4.927876049177821896e-05 3.097873230253197569e-05 1.949715592822227211e-05

View File

@@ -0,0 +1,96 @@
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
1 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
2 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
3 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
4 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
5 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
6 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
7 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
8 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
9 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
10 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
11 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
12 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
13 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
14 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
15 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
16 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
17 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
18 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
19 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
20 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
21 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
22 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
23 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
24 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
25 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
26 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
27 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
28 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
29 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
30 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
31 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
32 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
33 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
34 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
35 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
36 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
37 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
38 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
39 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
40 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
41 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
42 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
43 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
44 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
45 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
46 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
47 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
48 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
49 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
50 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
51 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
52 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
53 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
54 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
55 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
56 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
57 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
58 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
59 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
60 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
61 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
62 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
63 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
64 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
65 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
66 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
67 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
68 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
69 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
70 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
71 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
72 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
73 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
74 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
75 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
76 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
77 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
78 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
79 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
80 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
81 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
82 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
83 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
84 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
85 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
86 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
87 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
88 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
89 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
90 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
91 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
92 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
93 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
94 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
95 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05
96 1.000000000000000021e-03 6.456542290346556703e-04 2.238721138568339957e-05

View File

@@ -0,0 +1,98 @@
1.000000000000000021e-03,6.059596816131984903e-04,4.124540545641951000e-04,2.874328952539468305e-04,2.103398919772851445e-04,1.677242405549142946e-04,1.544863001982801454e-04,1.810521006745035243e-04,3.200643516934312716e-04
1.000000000000000021e-03,6.053276391419512917e-04,4.117105797931639192e-04,2.867132476380170980e-04,2.096494018677202108e-04,1.670078900317705016e-04,1.536235748319029191e-04,1.797412011853683042e-04,3.172302656811062894e-04
1.000000000000000021e-03,6.046965215788322606e-04,4.109687952835336887e-04,2.859957486816950244e-04,2.089614974033423851e-04,1.662949011112697126e-04,1.527659914515381017e-04,1.784402430016445015e-04,3.144223032044235564e-04
1.000000000000000021e-03,6.040663257237133005e-04,4.102286952029449651e-04,2.852803900268787471e-04,2.082761669373014350e-04,1.655852558250782110e-04,1.519135165004971508e-04,1.771491455864908956e-04,3.116402083285431824e-04
1.000000000000000021e-03,6.034134049131552151e-04,4.094420572177277762e-04,2.844940684888993296e-04,2.074903534701979157e-04,1.647299311261353841e-04,1.508247978694524506e-04,1.753757648572244786e-04,3.073546770239318966e-04
1.000000000000000021e-03,6.027614491955140619e-04,4.086572704905903084e-04,2.837102537033676193e-04,2.067078158689920062e-04,1.638793172508614261e-04,1.497441922066543145e-04,1.736205593148946460e-04,3.031290170068882115e-04
1.000000000000000021e-03,6.021104551256277167e-04,4.078743283205443272e-04,2.829289352705667755e-04,2.059285379676389937e-04,1.630333854029286287e-04,1.486716352337672398e-04,1.718833358612950819e-04,2.989623714008152688e-04
1.000000000000000021e-03,6.014582116574243619e-04,4.070908897338878368e-04,2.821481168500803620e-04,2.051508852341138217e-04,1.621907338278938133e-04,1.476057520309239507e-04,1.701623353591907634e-04,2.948510854465446421e-04
1.000000000000000021e-03,6.008047235362061304e-04,4.063069632907822604e-04,2.813678065291968134e-04,2.043748619094956848e-04,1.613513572535205565e-04,1.465465096091600223e-04,1.684574188261711764e-04,2.907944492354505236e-04
1.000000000000000021e-03,6.001451360530016092e-04,4.055123728737173791e-04,2.805722092000019225e-04,2.035777116783122080e-04,1.604816172174310248e-04,1.454380432794140279e-04,1.666509749540511247e-04,2.864106919229302104e-04
1.000000000000000021e-03,5.994843238884264500e-04,4.047173509812383436e-04,2.797772242168449484e-04,2.027823739011739494e-04,1.596154967418240479e-04,1.443369747762361644e-04,1.648627759919576703e-04,2.820911717580149220e-04
1.000000000000000021e-03,5.988172342183890103e-04,4.039163714190686103e-04,2.789780293498389497e-04,2.019848363041463460e-04,1.587495225986212185e-04,1.432398991427229250e-04,1.630885426393815433e-04,2.778273023594395367e-04
1.000000000000000021e-03,5.981438884479926745e-04,4.031094770638417378e-04,2.781746763026650849e-04,2.011851525894453846e-04,1.578837467363927922e-04,1.421468562989037501e-04,1.613282432889087106e-04,2.736185440612619660e-04
1.000000000000000021e-03,5.974643081279905951e-04,4.022967109333065402e-04,2.773672167904255525e-04,2.003833762773818070e-04,1.570182206524130687e-04,1.410578853054891162e-04,1.595818450324428667e-04,2.694643589605560702e-04
1.000000000000000021e-03,5.967776135628261383e-04,4.014760835454474729e-04,2.765523639715266420e-04,1.995745107850170087e-04,1.561451751437292214e-04,1.399593838969533089e-04,1.578189695554256631e-04,2.652593622585595239e-04
1.000000000000000021e-03,5.960847301704033955e-04,4.006496794462583626e-04,2.757335282633677394e-04,1.987637005805311633e-04,1.552725686595443394e-04,1.388652425906941482e-04,1.560705931497471889e-04,2.611111091988240428e-04
1.000000000000000021e-03,5.953856800664869900e-04,3.998175424230218200e-04,2.749107619574642008e-04,1.979509993037016505e-04,1.544004519462355480e-04,1.377754975907092790e-04,1.543366727366940775e-04,2.570190084729973012e-04
1.000000000000000021e-03,5.946807128856675898e-04,3.989799547069150759e-04,2.740843182982303974e-04,1.971366223883773178e-04,1.535290106655841792e-04,1.366903106980890768e-04,1.526173104925201149e-04,2.529827224768709296e-04
1.000000000000000021e-03,5.939698501124463306e-04,3.981369586533569987e-04,2.732542475356756692e-04,1.963206208562686219e-04,1.526582921179318820e-04,1.356097131673934353e-04,1.509124557001679569e-04,2.490016526370400561e-04
1.000000000000000021e-03,5.932465626846949178e-04,3.972749900655482406e-04,2.723996767755988246e-04,1.954732420440092287e-04,1.517449722599865122e-04,1.344633353162260421e-04,1.490787207039270096e-04,2.446311790608478916e-04
1.000000000000000021e-03,5.925174390191371033e-04,3.964077570693368959e-04,2.715417094444828503e-04,1.946245940839898595e-04,1.508329769024341859e-04,1.333227635443309334e-04,1.472627410071646460e-04,2.403295419535726046e-04
1.000000000000000021e-03,5.917825975966207411e-04,3.955354074700222146e-04,2.706804869652218665e-04,1.937748023716854423e-04,1.499224142400159925e-04,1.321880784683747445e-04,1.454644877205459041e-04,2.360959501695517580e-04
1.000000000000000021e-03,5.910420603206251872e-04,3.946579839875351422e-04,2.698160594859791645e-04,1.929239167799043884e-04,1.490133276731937860e-04,1.310592984163628486e-04,1.436838579350653566e-04,2.319294885748935905e-04
1.000000000000000021e-03,5.902958492424382119e-04,3.937755294749108723e-04,2.689484771457827648e-04,1.920719869699086713e-04,1.481057601269397369e-04,1.299364409184113305e-04,1.419207481479104003e-04,2.278292508796841368e-04
1.000000000000000021e-03,5.895598685634120817e-04,3.929178479527316910e-04,2.681193531438139815e-04,1.912726116179633686e-04,1.472689584526509451e-04,1.289152165190126341e-04,1.403276367723939690e-04,2.241040180807166735e-04
1.000000000000000021e-03,5.888182184446727908e-04,3.920550888852155800e-04,2.672869104586279658e-04,1.904718280301954622e-04,1.464329431074320987e-04,1.278983689606465277e-04,1.387482416027983217e-04,2.204326648641897243e-04
1.000000000000000021e-03,5.880709209312291698e-04,3.911872944022057189e-04,2.664511977530461032e-04,1.896696843025943828e-04,1.455977573633372962e-04,1.268859249854523304e-04,1.371825077963339959e-04,2.168145532732365665e-04
1.000000000000000021e-03,5.873188516038330012e-04,3.903153927531259398e-04,2.656130037940035156e-04,1.888668181821939697e-04,1.447639292589146184e-04,1.258783532658409540e-04,1.356308744741794301e-04,2.132498546822566535e-04
1.000000000000000021e-03,5.865620290918570692e-04,3.894394196579139384e-04,2.647723694527710347e-04,1.880632691586897262e-04,1.439314922056974795e-04,1.248756678383702303e-04,1.340932673985179111e-04,2.097378989636096219e-04
1.000000000000000021e-03,5.858004721379563712e-04,3.885594109297237520e-04,2.639293355828808605e-04,1.872590765580118600e-04,1.431004792703304354e-04,1.238778821782577646e-04,1.325696118981003829e-04,2.062780220293337398e-04
1.000000000000000021e-03,5.850341996176138979e-04,3.876754025264287241e-04,2.630839431003643525e-04,1.864542796470906004e-04,1.422709233084495310e-04,1.228850093894619591e-04,1.310598332174379369e-04,2.028695668674851068e-04
1.000000000000000021e-03,5.842633259194077947e-04,3.867875329548579075e-04,2.622363206668650243e-04,1.856489888735660490e-04,1.414429165168560936e-04,1.218971173595769875e-04,1.295639192660443006e-04,1.995119889022209966e-04
1.000000000000000021e-03,5.834878697730810785e-04,3.858958376209294626e-04,2.613865082576556967e-04,1.848432421885319707e-04,1.406164899573639974e-04,1.209142166826000190e-04,1.280817922197122173e-04,1.962046375108947760e-04
1.000000000000000021e-03,5.827078500230523962e-04,3.850003520236475163e-04,2.605345458299026889e-04,1.840370773822073991e-04,1.397916743597008157e-04,1.199363174304283899e-04,1.266133739282210172e-04,1.929468682039042694e-04
1.000000000000000021e-03,5.819334261621241173e-04,3.841195496874485939e-04,2.597054450234843122e-04,1.832615752361228063e-04,1.390067359137023490e-04,1.190124837885568685e-04,1.252266477671892364e-04,1.898342669542842250e-04
1.000000000000000021e-03,5.811544494713084385e-04,3.832349425929183610e-04,2.588741118031709712e-04,1.824854619290212638e-04,1.382230274271905722e-04,1.180928923649849320e-04,1.238519429087230690e-04,1.867668194223294086e-04
1.000000000000000021e-03,5.803709388350691226e-04,3.823465658113372784e-04,2.580405852181276633e-04,1.817087742555892370e-04,1.374405795299253087e-04,1.171775570200931022e-04,1.224892004036316632e-04,1.837439681062861012e-04
1.000000000000000021e-03,5.795844646861092117e-04,3.814560496353979662e-04,2.572062245701910057e-04,1.809325897993571621e-04,1.366602663048694689e-04,1.162672443199922736e-04,1.211391750652958171e-04,1.807664171209839225e-04
1.000000000000000021e-03,5.787950390386191295e-04,3.805634168176052199e-04,2.563710546191050039e-04,1.801569303693986560e-04,1.358821021611104744e-04,1.153619483579342790e-04,1.198017787120210541e-04,1.778335550584487373e-04
1.000000000000000021e-03,5.780026739739645147e-04,3.796686901561970007e-04,2.555351001009416268e-04,1.793818176715784992e-04,1.351061013224604760e-04,1.144616629966290335e-04,1.184769233829579004e-04,1.749447775426769835e-04
1.000000000000000021e-03,5.772073816396077655e-04,3.787718924921195112e-04,2.546983857238086673e-04,1.786072733038042632e-04,1.343322778228697451e-04,1.135663818643436025e-04,1.171645213323757931e-04,1.720994871389106646e-04
1.000000000000000021e-03,5.764112975619451167e-04,3.778753049229251356e-04,2.538628529985562728e-04,1.778348606584519826e-04,1.335619170774594953e-04,1.126772524533375236e-04,1.158657577413503814e-04,1.692991320527776819e-04
1.000000000000000021e-03,5.756144252522814222e-04,3.769789335549947914e-04,2.530285065275222683e-04,1.770645798114452998e-04,1.327950095246515803e-04,1.117942393436846088e-04,1.145805009748875411e-04,1.665430248001372392e-04
1.000000000000000021e-03,5.748167682568085593e-04,3.760827845283660131e-04,2.521953509290719687e-04,1.762964308427695766e-04,1.320315456257037542e-04,1.109173072961205789e-04,1.133086205901110452e-04,1.638304880953399246e-04
1.000000000000000021e-03,5.740166237139158025e-04,3.751830736799844387e-04,2.513572749088919958e-04,1.755213872380331861e-04,1.312580494760662926e-04,1.100242733780145235e-04,1.120050977276823334e-04,1.610268323297459373e-04
1.000000000000000021e-03,5.732157063485666254e-04,3.742836154796483610e-04,2.505204393147844274e-04,1.747485543201545441e-04,1.304881340598568315e-04,1.091376023135285023e-04,1.107157077892566201e-04,1.582698947895536752e-04
1.000000000000000021e-03,5.724140197507473007e-04,3.733844159930685934e-04,2.496848484812796650e-04,1.739779315547772373e-04,1.297217884948703216e-04,1.082572552711356679e-04,1.094403070125688193e-04,1.555589173140119988e-04
1.000000000000000021e-03,5.716133163514535006e-04,3.724872615728835922e-04,2.488519667094108378e-04,1.732106573421359136e-04,1.289599119326889729e-04,1.073839886960488172e-04,1.081795839980315968e-04,1.528943685588057789e-04
1.000000000000000021e-03,5.708135916089464952e-04,3.715921440481619780e-04,2.480217821880964816e-04,1.724467146387093834e-04,1.282024761936270685e-04,1.065177436423506841e-04,1.069333674890963240e-04,1.502754491507743331e-04
1.000000000000000021e-03,5.700148410279018158e-04,3.706990553358867476e-04,2.471942832207120249e-04,1.716860865497342535e-04,1.274494533371790404e-04,1.056584617232978574e-04,1.057014883248694426e-04,1.477013737020834935e-04
1.000000000000000021e-03,5.692170601522963469e-04,3.698079874222007994e-04,2.463694581964103098e-04,1.709287562926333241e-04,1.267008156164750913e-04,1.048060850476081559e-04,1.044837793145218324e-04,1.451713702741069042e-04
1.000000000000000021e-03,5.684221107462931718e-04,3.689208973051672467e-04,2.455489480245545849e-04,1.701760222502850749e-04,1.259576042689529907e-04,1.039615052862917467e-04,1.032810864032787402e-04,1.426862118551680341e-04
1.000000000000000021e-03,5.676299806599446841e-04,3.680377623533836952e-04,2.447327238198633678e-04,1.694278494753442496e-04,1.252197721019686588e-04,1.031246414956518974e-04,1.020932099638295122e-04,1.402450714512258731e-04
1.000000000000000021e-03,5.668406578186927338e-04,3.671585601102087264e-04,2.439207569480618843e-04,1.686842033525584789e-04,1.244872724153648453e-04,1.022954136930148580e-04,1.009199532576916553e-04,1.378471380449364540e-04
1.000000000000000021e-03,5.660528798623399357e-04,3.662807588285737852e-04,2.431092838206291959e-04,1.679399278621275505e-04,1.237529841606189703e-04,1.014631173867882653e-04,9.974194130068655907e-05,1.354424501489320950e-04
1.000000000000000021e-03,5.652678887062091489e-04,3.654068578608936813e-04,2.423020363044335113e-04,1.672001557892942780e-04,1.230240193993821724e-04,1.006384714692423982e-04,9.857860748076281341e-05,1.330810886504238974e-04
1.000000000000000021e-03,5.644856725120149217e-04,3.645368352560149003e-04,2.414989864020476457e-04,1.664648531857207327e-04,1.223003320760450115e-04,9.982139651422967225e-05,9.742975533494338731e-05,1.307622432316707048e-04
1.000000000000000021e-03,5.637081598516872297e-04,3.636726247466106157e-04,2.407016951041400575e-04,1.657352124900924413e-04,1.215828418563276393e-04,9.901263879559620603e-05,9.629602344691408898e-05,1.284862679388324466e-04
1.000000000000000021e-03,5.629353300793490293e-04,3.628141892281135789e-04,2.399101174854294510e-04,1.650111827309744587e-04,1.208714852573268089e-04,9.821209936496322563e-05,9.517719041742417905e-05,1.262523213089875105e-04
1.000000000000000021e-03,5.621671626935266465e-04,3.619614919160761232e-04,2.391242090587739641e-04,1.642927134849468424e-04,1.201661995513669139e-04,9.741968060975319133e-05,9.407303841474721877e-05,1.240595794224424390e-04
1.000000000000000021e-03,5.614036373218869204e-04,3.611144963064036881e-04,2.383439257149278542e-04,1.635797548004748762e-04,1.194669226721670609e-04,9.663528612429730903e-05,9.298335293466474341e-05,1.219072350364201328e-04
1.000000000000000021e-03,5.606463485664969944e-04,3.602748496609082000e-04,2.375706263435288989e-04,1.628733614326239394e-04,1.187744774441648902e-04,9.585958850070355037e-05,9.190871230268097864e-05,1.197956257524449784e-04
1.000000000000000021e-03,5.598952698555576370e-04,3.594425038433207622e-04,2.368042532426757629e-04,1.621734693226255697e-04,1.180887870128607769e-04,9.509247448928166366e-05,9.084888029067286991e-05,1.177239166851852087e-04
1.000000000000000021e-03,5.591503748394264367e-04,3.586174111937711294e-04,2.360447493430869353e-04,1.614800151758654528e-04,1.174097755299612002e-04,9.433383251239638840e-05,8.980362478385646723e-05,1.156912913627774928e-04
1.000000000000000021e-03,5.584225591487143505e-04,3.578196518919505740e-04,2.353197697834314708e-04,1.608280111225492105e-04,1.167814916834832538e-04,9.364209834454310303e-05,8.886089862139266997e-05,1.138670987493162862e-04
1.000000000000000021e-03,5.577008468242452242e-04,3.570289620106132170e-04,2.346013750077580542e-04,1.601820316992516276e-04,1.161592518078891664e-04,9.295772679954118940e-05,8.793036528463705852e-05,1.120748093307471799e-04
1.000000000000000021e-03,5.569852125454166723e-04,3.562452965139748743e-04,2.338895121728417183e-04,1.595420198714332595e-04,1.155429900504064843e-04,9.228062559771084612e-05,8.701184300011380421e-05,1.103138112316197746e-04
1.000000000000000021e-03,5.562757163116399499e-04,3.554686957703368042e-04,2.331841974232642283e-04,1.589079715282182140e-04,1.149326819589807311e-04,9.161073769793274093e-05,8.610518609906000706e-05,1.085835484715731990e-04
1.000000000000000021e-03,5.555723328562507538e-04,3.546991150005096983e-04,2.324853783642831767e-04,1.582798302759657303e-04,1.143282626503791007e-04,9.094797264045832242e-05,8.521021771090780625e-05,1.068834322603653324e-04
1.000000000000000021e-03,5.548750371213563657e-04,3.539365098621276230e-04,2.317930031654593444e-04,1.576575403787569985e-04,1.137296680667903865e-04,9.029224125378113518e-05,8.432676390648500317e-05,1.052128860599020399e-04
1.000000000000000021e-03,5.541838042439771635e-04,3.531808364136874187e-04,2.311070205067102163e-04,1.570410466910287454e-04,1.131368348940622735e-04,8.964345554504144940e-05,8.345465350366406993e-05,1.035713449503019397e-04
1.000000000000000021e-03,5.534994772986728557e-04,3.524329474767404734e-04,2.304281200650363333e-04,1.564308719194829761e-04,1.125501566344392631e-04,8.900191672771989599e-05,8.259410426967044201e-05,1.019587783174918249e-04
1.000000000000000021e-03,5.528220286453137825e-04,3.516927939956549431e-04,2.297562446752235638e-04,1.558269550144645319e-04,1.119695640249353838e-04,8.836753049012398612e-05,8.174493812638424233e-05,1.003746189891791522e-04
1.000000000000000021e-03,5.521514308959529988e-04,3.509603274307335013e-04,2.290913378267074509e-04,1.552292356754889449e-04,1.113949887224841186e-04,8.774020391605217217e-05,8.090698006040516024e-05,9.881831191717569708e-05
1.000000000000000021e-03,5.514925705077818562e-04,3.502439423799475968e-04,2.284441610897542578e-04,1.546502536108915020e-04,1.108405451476827762e-04,8.713560862370903280e-05,8.009669495978734939e-05,9.729798207441842409e-05
1.000000000000000021e-03,5.508404954145605355e-04,3.495351144497065954e-04,2.278037808073336661e-04,1.540772565128698055e-04,1.102918428934658313e-04,8.653767235071846409e-05,7.929694151393572473e-05,9.580416231533655223e-05
1.000000000000000021e-03,5.501951791779016417e-04,3.488337972114359704e-04,2.271701434112839691e-04,1.535101877933933972e-04,1.097488185619751536e-04,8.594630990981442489e-05,7.850756016455258672e-05,9.433633928045583440e-05
1.000000000000000021e-03,5.495566796872157793e-04,3.481400279377950191e-04,2.265432624126748171e-04,1.529490418493457818e-04,1.092114481281042810e-04,8.536146896299809861e-05,7.772842391839215501e-05,9.289404738934854406e-05
1.000000000000000021e-03,5.489249706454161527e-04,3.474537605956091817e-04,2.259230848255512310e-04,1.523937628358645337e-04,1.086796692149487770e-04,8.478306608188779627e-05,7.695937762456762194e-05,9.147679298288125297e-05
1.000000000000000021e-03,5.483000259883204826e-04,3.467749496226811058e-04,2.253095582547179863e-04,1.518442955755717951e-04,1.081534202533376696e-04,8.421101904463252675e-05,7.620026875215024978e-05,9.008409282780761526e-05
1.000000000000000021e-03,5.476818198739591458e-04,3.461035499001802445e-04,2.247026308546789793e-04,1.513005855077949086e-04,1.076326404207925846e-04,8.364524675486820964e-05,7.545094724756280888e-05,8.871547365198851438e-05
1.000000000000000021e-03,5.470705529810189179e-04,3.454397485743721506e-04,2.241024413587690614e-04,1.507627254998857578e-04,1.071173841908876651e-04,8.308576484396013343e-05,7.471135773791005180e-05,8.737059031219478156e-05
1.000000000000000021e-03,5.464661991670638182e-04,3.447835000304132159e-04,2.235089374295866490e-04,1.502306605954647535e-04,1.066075905365267742e-04,8.253249249775968508e-05,7.398135232542971769e-05,8.604898363826276057e-05
1.000000000000000021e-03,5.458687325221291348e-04,3.441347591201103138e-04,2.229220673120790245e-04,1.497043364932862668e-04,1.061031992194506256e-04,8.198535007121052676e-05,7.326078561528488937e-05,8.475020417489323324e-05
1.000000000000000021e-03,5.452901895090844558e-04,3.435150570304173014e-04,2.223706511768525117e-04,1.492190839480494894e-04,1.056468106030715887e-04,8.149737756206330190e-05,7.262157722718122260e-05,8.358877577600780481e-05
1.000000000000000021e-03,5.447184570616723891e-04,3.429026954804162766e-04,2.218256219048080177e-04,1.487392297472955698e-04,1.051953246672348403e-04,8.101471604563164947e-05,7.199020130947719233e-05,8.244600742971828849e-05
1.000000000000000021e-03,5.441535103689846154e-04,3.422976319891982578e-04,2.212869318272295087e-04,1.482647252612499030e-04,1.047486894350850925e-04,8.053730000430466094e-05,7.136654438032706549e-05,8.132155926679031160e-05
1.000000000000000021e-03,5.435909997143165834e-04,3.416955774702987799e-04,2.207511658034611989e-04,1.477929951923679644e-04,1.043049394866297369e-04,8.006352324306285982e-05,7.074908147590525608e-05,8.021344078389119761e-05
1.000000000000000021e-03,5.430309161342643806e-04,3.410965159927432586e-04,2.202183050641030458e-04,1.473240192034464783e-04,1.038640511149413747e-04,7.959335168171117276e-05,7.013774197495506457e-05,7.912139691327875046e-05
1.000000000000000021e-03,5.424732506674768149e-04,3.405004316631486216e-04,2.196883309178195964e-04,1.468577770769967101e-04,1.034260007962051111e-04,7.912675157408064104e-05,6.953245613429904408e-05,7.804517686317993341e-05
1.000000000000000021e-03,5.419179943504857889e-04,3.399073086151600896e-04,2.191612247355960430e-04,1.463942486957527610e-04,1.029907651665082401e-04,7.866368947795671801e-05,6.893315503775990498e-05,7.698453395110452940e-05
1.000000000000000021e-03,5.413629828746738867e-04,3.393149394667066966e-04,2.186351838182767991e-04,1.459320465988429058e-04,1.025572658029062702e-04,7.820326658601671303e-05,6.833895931108436813e-05,7.593823716905742757e-05
1.000000000000000021e-03,5.408082138671730385e-04,3.387233205925343745e-04,2.181102035828516778e-04,1.454711649598321068e-04,1.021254940975202248e-04,7.774546638666711494e-05,6.774982397495531476e-05,7.490609035628451105e-05
1.000000000000000021e-03,5.402536849306272763e-04,3.381324483351249330e-04,2.175862794239174624e-04,1.450115979478540569e-04,1.016954414669310805e-04,7.729027246482876178e-05,6.716570445567967391e-05,7.388790009412213962e-05
1.000000000000000021e-03,5.396844473492076093e-04,3.375153269484326116e-04,2.170269255797531330e-04,1.445081577421817903e-04,1.012119806681102793e-04,7.676796353167371053e-05,6.648955946153636300e-05,7.272015355307609235e-05
1.000000000000000021e-03,5.391154759339646064e-04,3.368990409960971838e-04,2.164687998325534753e-04,1.440063199340409466e-04,1.007307157169936256e-04,7.624910690660518565e-05,6.582015362379603355e-05,7.157078178685281889e-05
1.174325560395078800e-03,2.755298774803674553e-03,5.194387759090383395e-03,9.354521953613973567e-03,1.651171618252517473e-02,2.916966879690554432e-02,5.262163370571950466e-02,9.910396847768351836e-02,2.000000000000000111e-01
4.160571131359890040e-03,8.527170824088577475e-03,1.466969461393815427e-02,2.443642414582058997e-02,3.975038656808106002e-02,6.331729118004528201e-02,9.842489957479945428e-02,1.474045868235714374e-01,2.059999999999999887e-01
1 1.000000000000000021e-03 6.059596816131984903e-04 4.124540545641951000e-04 2.874328952539468305e-04 2.103398919772851445e-04 1.677242405549142946e-04 1.544863001982801454e-04 1.810521006745035243e-04 3.200643516934312716e-04
2 1.000000000000000021e-03 6.053276391419512917e-04 4.117105797931639192e-04 2.867132476380170980e-04 2.096494018677202108e-04 1.670078900317705016e-04 1.536235748319029191e-04 1.797412011853683042e-04 3.172302656811062894e-04
3 1.000000000000000021e-03 6.046965215788322606e-04 4.109687952835336887e-04 2.859957486816950244e-04 2.089614974033423851e-04 1.662949011112697126e-04 1.527659914515381017e-04 1.784402430016445015e-04 3.144223032044235564e-04
4 1.000000000000000021e-03 6.040663257237133005e-04 4.102286952029449651e-04 2.852803900268787471e-04 2.082761669373014350e-04 1.655852558250782110e-04 1.519135165004971508e-04 1.771491455864908956e-04 3.116402083285431824e-04
5 1.000000000000000021e-03 6.034134049131552151e-04 4.094420572177277762e-04 2.844940684888993296e-04 2.074903534701979157e-04 1.647299311261353841e-04 1.508247978694524506e-04 1.753757648572244786e-04 3.073546770239318966e-04
6 1.000000000000000021e-03 6.027614491955140619e-04 4.086572704905903084e-04 2.837102537033676193e-04 2.067078158689920062e-04 1.638793172508614261e-04 1.497441922066543145e-04 1.736205593148946460e-04 3.031290170068882115e-04
7 1.000000000000000021e-03 6.021104551256277167e-04 4.078743283205443272e-04 2.829289352705667755e-04 2.059285379676389937e-04 1.630333854029286287e-04 1.486716352337672398e-04 1.718833358612950819e-04 2.989623714008152688e-04
8 1.000000000000000021e-03 6.014582116574243619e-04 4.070908897338878368e-04 2.821481168500803620e-04 2.051508852341138217e-04 1.621907338278938133e-04 1.476057520309239507e-04 1.701623353591907634e-04 2.948510854465446421e-04
9 1.000000000000000021e-03 6.008047235362061304e-04 4.063069632907822604e-04 2.813678065291968134e-04 2.043748619094956848e-04 1.613513572535205565e-04 1.465465096091600223e-04 1.684574188261711764e-04 2.907944492354505236e-04
10 1.000000000000000021e-03 6.001451360530016092e-04 4.055123728737173791e-04 2.805722092000019225e-04 2.035777116783122080e-04 1.604816172174310248e-04 1.454380432794140279e-04 1.666509749540511247e-04 2.864106919229302104e-04
11 1.000000000000000021e-03 5.994843238884264500e-04 4.047173509812383436e-04 2.797772242168449484e-04 2.027823739011739494e-04 1.596154967418240479e-04 1.443369747762361644e-04 1.648627759919576703e-04 2.820911717580149220e-04
12 1.000000000000000021e-03 5.988172342183890103e-04 4.039163714190686103e-04 2.789780293498389497e-04 2.019848363041463460e-04 1.587495225986212185e-04 1.432398991427229250e-04 1.630885426393815433e-04 2.778273023594395367e-04
13 1.000000000000000021e-03 5.981438884479926745e-04 4.031094770638417378e-04 2.781746763026650849e-04 2.011851525894453846e-04 1.578837467363927922e-04 1.421468562989037501e-04 1.613282432889087106e-04 2.736185440612619660e-04
14 1.000000000000000021e-03 5.974643081279905951e-04 4.022967109333065402e-04 2.773672167904255525e-04 2.003833762773818070e-04 1.570182206524130687e-04 1.410578853054891162e-04 1.595818450324428667e-04 2.694643589605560702e-04
15 1.000000000000000021e-03 5.967776135628261383e-04 4.014760835454474729e-04 2.765523639715266420e-04 1.995745107850170087e-04 1.561451751437292214e-04 1.399593838969533089e-04 1.578189695554256631e-04 2.652593622585595239e-04
16 1.000000000000000021e-03 5.960847301704033955e-04 4.006496794462583626e-04 2.757335282633677394e-04 1.987637005805311633e-04 1.552725686595443394e-04 1.388652425906941482e-04 1.560705931497471889e-04 2.611111091988240428e-04
17 1.000000000000000021e-03 5.953856800664869900e-04 3.998175424230218200e-04 2.749107619574642008e-04 1.979509993037016505e-04 1.544004519462355480e-04 1.377754975907092790e-04 1.543366727366940775e-04 2.570190084729973012e-04
18 1.000000000000000021e-03 5.946807128856675898e-04 3.989799547069150759e-04 2.740843182982303974e-04 1.971366223883773178e-04 1.535290106655841792e-04 1.366903106980890768e-04 1.526173104925201149e-04 2.529827224768709296e-04
19 1.000000000000000021e-03 5.939698501124463306e-04 3.981369586533569987e-04 2.732542475356756692e-04 1.963206208562686219e-04 1.526582921179318820e-04 1.356097131673934353e-04 1.509124557001679569e-04 2.490016526370400561e-04
20 1.000000000000000021e-03 5.932465626846949178e-04 3.972749900655482406e-04 2.723996767755988246e-04 1.954732420440092287e-04 1.517449722599865122e-04 1.344633353162260421e-04 1.490787207039270096e-04 2.446311790608478916e-04
21 1.000000000000000021e-03 5.925174390191371033e-04 3.964077570693368959e-04 2.715417094444828503e-04 1.946245940839898595e-04 1.508329769024341859e-04 1.333227635443309334e-04 1.472627410071646460e-04 2.403295419535726046e-04
22 1.000000000000000021e-03 5.917825975966207411e-04 3.955354074700222146e-04 2.706804869652218665e-04 1.937748023716854423e-04 1.499224142400159925e-04 1.321880784683747445e-04 1.454644877205459041e-04 2.360959501695517580e-04
23 1.000000000000000021e-03 5.910420603206251872e-04 3.946579839875351422e-04 2.698160594859791645e-04 1.929239167799043884e-04 1.490133276731937860e-04 1.310592984163628486e-04 1.436838579350653566e-04 2.319294885748935905e-04
24 1.000000000000000021e-03 5.902958492424382119e-04 3.937755294749108723e-04 2.689484771457827648e-04 1.920719869699086713e-04 1.481057601269397369e-04 1.299364409184113305e-04 1.419207481479104003e-04 2.278292508796841368e-04
25 1.000000000000000021e-03 5.895598685634120817e-04 3.929178479527316910e-04 2.681193531438139815e-04 1.912726116179633686e-04 1.472689584526509451e-04 1.289152165190126341e-04 1.403276367723939690e-04 2.241040180807166735e-04
26 1.000000000000000021e-03 5.888182184446727908e-04 3.920550888852155800e-04 2.672869104586279658e-04 1.904718280301954622e-04 1.464329431074320987e-04 1.278983689606465277e-04 1.387482416027983217e-04 2.204326648641897243e-04
27 1.000000000000000021e-03 5.880709209312291698e-04 3.911872944022057189e-04 2.664511977530461032e-04 1.896696843025943828e-04 1.455977573633372962e-04 1.268859249854523304e-04 1.371825077963339959e-04 2.168145532732365665e-04
28 1.000000000000000021e-03 5.873188516038330012e-04 3.903153927531259398e-04 2.656130037940035156e-04 1.888668181821939697e-04 1.447639292589146184e-04 1.258783532658409540e-04 1.356308744741794301e-04 2.132498546822566535e-04
29 1.000000000000000021e-03 5.865620290918570692e-04 3.894394196579139384e-04 2.647723694527710347e-04 1.880632691586897262e-04 1.439314922056974795e-04 1.248756678383702303e-04 1.340932673985179111e-04 2.097378989636096219e-04
30 1.000000000000000021e-03 5.858004721379563712e-04 3.885594109297237520e-04 2.639293355828808605e-04 1.872590765580118600e-04 1.431004792703304354e-04 1.238778821782577646e-04 1.325696118981003829e-04 2.062780220293337398e-04
31 1.000000000000000021e-03 5.850341996176138979e-04 3.876754025264287241e-04 2.630839431003643525e-04 1.864542796470906004e-04 1.422709233084495310e-04 1.228850093894619591e-04 1.310598332174379369e-04 2.028695668674851068e-04
32 1.000000000000000021e-03 5.842633259194077947e-04 3.867875329548579075e-04 2.622363206668650243e-04 1.856489888735660490e-04 1.414429165168560936e-04 1.218971173595769875e-04 1.295639192660443006e-04 1.995119889022209966e-04
33 1.000000000000000021e-03 5.834878697730810785e-04 3.858958376209294626e-04 2.613865082576556967e-04 1.848432421885319707e-04 1.406164899573639974e-04 1.209142166826000190e-04 1.280817922197122173e-04 1.962046375108947760e-04
34 1.000000000000000021e-03 5.827078500230523962e-04 3.850003520236475163e-04 2.605345458299026889e-04 1.840370773822073991e-04 1.397916743597008157e-04 1.199363174304283899e-04 1.266133739282210172e-04 1.929468682039042694e-04
35 1.000000000000000021e-03 5.819334261621241173e-04 3.841195496874485939e-04 2.597054450234843122e-04 1.832615752361228063e-04 1.390067359137023490e-04 1.190124837885568685e-04 1.252266477671892364e-04 1.898342669542842250e-04
36 1.000000000000000021e-03 5.811544494713084385e-04 3.832349425929183610e-04 2.588741118031709712e-04 1.824854619290212638e-04 1.382230274271905722e-04 1.180928923649849320e-04 1.238519429087230690e-04 1.867668194223294086e-04
37 1.000000000000000021e-03 5.803709388350691226e-04 3.823465658113372784e-04 2.580405852181276633e-04 1.817087742555892370e-04 1.374405795299253087e-04 1.171775570200931022e-04 1.224892004036316632e-04 1.837439681062861012e-04
38 1.000000000000000021e-03 5.795844646861092117e-04 3.814560496353979662e-04 2.572062245701910057e-04 1.809325897993571621e-04 1.366602663048694689e-04 1.162672443199922736e-04 1.211391750652958171e-04 1.807664171209839225e-04
39 1.000000000000000021e-03 5.787950390386191295e-04 3.805634168176052199e-04 2.563710546191050039e-04 1.801569303693986560e-04 1.358821021611104744e-04 1.153619483579342790e-04 1.198017787120210541e-04 1.778335550584487373e-04
40 1.000000000000000021e-03 5.780026739739645147e-04 3.796686901561970007e-04 2.555351001009416268e-04 1.793818176715784992e-04 1.351061013224604760e-04 1.144616629966290335e-04 1.184769233829579004e-04 1.749447775426769835e-04
41 1.000000000000000021e-03 5.772073816396077655e-04 3.787718924921195112e-04 2.546983857238086673e-04 1.786072733038042632e-04 1.343322778228697451e-04 1.135663818643436025e-04 1.171645213323757931e-04 1.720994871389106646e-04
42 1.000000000000000021e-03 5.764112975619451167e-04 3.778753049229251356e-04 2.538628529985562728e-04 1.778348606584519826e-04 1.335619170774594953e-04 1.126772524533375236e-04 1.158657577413503814e-04 1.692991320527776819e-04
43 1.000000000000000021e-03 5.756144252522814222e-04 3.769789335549947914e-04 2.530285065275222683e-04 1.770645798114452998e-04 1.327950095246515803e-04 1.117942393436846088e-04 1.145805009748875411e-04 1.665430248001372392e-04
44 1.000000000000000021e-03 5.748167682568085593e-04 3.760827845283660131e-04 2.521953509290719687e-04 1.762964308427695766e-04 1.320315456257037542e-04 1.109173072961205789e-04 1.133086205901110452e-04 1.638304880953399246e-04
45 1.000000000000000021e-03 5.740166237139158025e-04 3.751830736799844387e-04 2.513572749088919958e-04 1.755213872380331861e-04 1.312580494760662926e-04 1.100242733780145235e-04 1.120050977276823334e-04 1.610268323297459373e-04
46 1.000000000000000021e-03 5.732157063485666254e-04 3.742836154796483610e-04 2.505204393147844274e-04 1.747485543201545441e-04 1.304881340598568315e-04 1.091376023135285023e-04 1.107157077892566201e-04 1.582698947895536752e-04
47 1.000000000000000021e-03 5.724140197507473007e-04 3.733844159930685934e-04 2.496848484812796650e-04 1.739779315547772373e-04 1.297217884948703216e-04 1.082572552711356679e-04 1.094403070125688193e-04 1.555589173140119988e-04
48 1.000000000000000021e-03 5.716133163514535006e-04 3.724872615728835922e-04 2.488519667094108378e-04 1.732106573421359136e-04 1.289599119326889729e-04 1.073839886960488172e-04 1.081795839980315968e-04 1.528943685588057789e-04
49 1.000000000000000021e-03 5.708135916089464952e-04 3.715921440481619780e-04 2.480217821880964816e-04 1.724467146387093834e-04 1.282024761936270685e-04 1.065177436423506841e-04 1.069333674890963240e-04 1.502754491507743331e-04
50 1.000000000000000021e-03 5.700148410279018158e-04 3.706990553358867476e-04 2.471942832207120249e-04 1.716860865497342535e-04 1.274494533371790404e-04 1.056584617232978574e-04 1.057014883248694426e-04 1.477013737020834935e-04
51 1.000000000000000021e-03 5.692170601522963469e-04 3.698079874222007994e-04 2.463694581964103098e-04 1.709287562926333241e-04 1.267008156164750913e-04 1.048060850476081559e-04 1.044837793145218324e-04 1.451713702741069042e-04
52 1.000000000000000021e-03 5.684221107462931718e-04 3.689208973051672467e-04 2.455489480245545849e-04 1.701760222502850749e-04 1.259576042689529907e-04 1.039615052862917467e-04 1.032810864032787402e-04 1.426862118551680341e-04
53 1.000000000000000021e-03 5.676299806599446841e-04 3.680377623533836952e-04 2.447327238198633678e-04 1.694278494753442496e-04 1.252197721019686588e-04 1.031246414956518974e-04 1.020932099638295122e-04 1.402450714512258731e-04
54 1.000000000000000021e-03 5.668406578186927338e-04 3.671585601102087264e-04 2.439207569480618843e-04 1.686842033525584789e-04 1.244872724153648453e-04 1.022954136930148580e-04 1.009199532576916553e-04 1.378471380449364540e-04
55 1.000000000000000021e-03 5.660528798623399357e-04 3.662807588285737852e-04 2.431092838206291959e-04 1.679399278621275505e-04 1.237529841606189703e-04 1.014631173867882653e-04 9.974194130068655907e-05 1.354424501489320950e-04
56 1.000000000000000021e-03 5.652678887062091489e-04 3.654068578608936813e-04 2.423020363044335113e-04 1.672001557892942780e-04 1.230240193993821724e-04 1.006384714692423982e-04 9.857860748076281341e-05 1.330810886504238974e-04
57 1.000000000000000021e-03 5.644856725120149217e-04 3.645368352560149003e-04 2.414989864020476457e-04 1.664648531857207327e-04 1.223003320760450115e-04 9.982139651422967225e-05 9.742975533494338731e-05 1.307622432316707048e-04
58 1.000000000000000021e-03 5.637081598516872297e-04 3.636726247466106157e-04 2.407016951041400575e-04 1.657352124900924413e-04 1.215828418563276393e-04 9.901263879559620603e-05 9.629602344691408898e-05 1.284862679388324466e-04
59 1.000000000000000021e-03 5.629353300793490293e-04 3.628141892281135789e-04 2.399101174854294510e-04 1.650111827309744587e-04 1.208714852573268089e-04 9.821209936496322563e-05 9.517719041742417905e-05 1.262523213089875105e-04
60 1.000000000000000021e-03 5.621671626935266465e-04 3.619614919160761232e-04 2.391242090587739641e-04 1.642927134849468424e-04 1.201661995513669139e-04 9.741968060975319133e-05 9.407303841474721877e-05 1.240595794224424390e-04
61 1.000000000000000021e-03 5.614036373218869204e-04 3.611144963064036881e-04 2.383439257149278542e-04 1.635797548004748762e-04 1.194669226721670609e-04 9.663528612429730903e-05 9.298335293466474341e-05 1.219072350364201328e-04
62 1.000000000000000021e-03 5.606463485664969944e-04 3.602748496609082000e-04 2.375706263435288989e-04 1.628733614326239394e-04 1.187744774441648902e-04 9.585958850070355037e-05 9.190871230268097864e-05 1.197956257524449784e-04
63 1.000000000000000021e-03 5.598952698555576370e-04 3.594425038433207622e-04 2.368042532426757629e-04 1.621734693226255697e-04 1.180887870128607769e-04 9.509247448928166366e-05 9.084888029067286991e-05 1.177239166851852087e-04
64 1.000000000000000021e-03 5.591503748394264367e-04 3.586174111937711294e-04 2.360447493430869353e-04 1.614800151758654528e-04 1.174097755299612002e-04 9.433383251239638840e-05 8.980362478385646723e-05 1.156912913627774928e-04
65 1.000000000000000021e-03 5.584225591487143505e-04 3.578196518919505740e-04 2.353197697834314708e-04 1.608280111225492105e-04 1.167814916834832538e-04 9.364209834454310303e-05 8.886089862139266997e-05 1.138670987493162862e-04
66 1.000000000000000021e-03 5.577008468242452242e-04 3.570289620106132170e-04 2.346013750077580542e-04 1.601820316992516276e-04 1.161592518078891664e-04 9.295772679954118940e-05 8.793036528463705852e-05 1.120748093307471799e-04
67 1.000000000000000021e-03 5.569852125454166723e-04 3.562452965139748743e-04 2.338895121728417183e-04 1.595420198714332595e-04 1.155429900504064843e-04 9.228062559771084612e-05 8.701184300011380421e-05 1.103138112316197746e-04
68 1.000000000000000021e-03 5.562757163116399499e-04 3.554686957703368042e-04 2.331841974232642283e-04 1.589079715282182140e-04 1.149326819589807311e-04 9.161073769793274093e-05 8.610518609906000706e-05 1.085835484715731990e-04
69 1.000000000000000021e-03 5.555723328562507538e-04 3.546991150005096983e-04 2.324853783642831767e-04 1.582798302759657303e-04 1.143282626503791007e-04 9.094797264045832242e-05 8.521021771090780625e-05 1.068834322603653324e-04
70 1.000000000000000021e-03 5.548750371213563657e-04 3.539365098621276230e-04 2.317930031654593444e-04 1.576575403787569985e-04 1.137296680667903865e-04 9.029224125378113518e-05 8.432676390648500317e-05 1.052128860599020399e-04
71 1.000000000000000021e-03 5.541838042439771635e-04 3.531808364136874187e-04 2.311070205067102163e-04 1.570410466910287454e-04 1.131368348940622735e-04 8.964345554504144940e-05 8.345465350366406993e-05 1.035713449503019397e-04
72 1.000000000000000021e-03 5.534994772986728557e-04 3.524329474767404734e-04 2.304281200650363333e-04 1.564308719194829761e-04 1.125501566344392631e-04 8.900191672771989599e-05 8.259410426967044201e-05 1.019587783174918249e-04
73 1.000000000000000021e-03 5.528220286453137825e-04 3.516927939956549431e-04 2.297562446752235638e-04 1.558269550144645319e-04 1.119695640249353838e-04 8.836753049012398612e-05 8.174493812638424233e-05 1.003746189891791522e-04
74 1.000000000000000021e-03 5.521514308959529988e-04 3.509603274307335013e-04 2.290913378267074509e-04 1.552292356754889449e-04 1.113949887224841186e-04 8.774020391605217217e-05 8.090698006040516024e-05 9.881831191717569708e-05
75 1.000000000000000021e-03 5.514925705077818562e-04 3.502439423799475968e-04 2.284441610897542578e-04 1.546502536108915020e-04 1.108405451476827762e-04 8.713560862370903280e-05 8.009669495978734939e-05 9.729798207441842409e-05
76 1.000000000000000021e-03 5.508404954145605355e-04 3.495351144497065954e-04 2.278037808073336661e-04 1.540772565128698055e-04 1.102918428934658313e-04 8.653767235071846409e-05 7.929694151393572473e-05 9.580416231533655223e-05
77 1.000000000000000021e-03 5.501951791779016417e-04 3.488337972114359704e-04 2.271701434112839691e-04 1.535101877933933972e-04 1.097488185619751536e-04 8.594630990981442489e-05 7.850756016455258672e-05 9.433633928045583440e-05
78 1.000000000000000021e-03 5.495566796872157793e-04 3.481400279377950191e-04 2.265432624126748171e-04 1.529490418493457818e-04 1.092114481281042810e-04 8.536146896299809861e-05 7.772842391839215501e-05 9.289404738934854406e-05
79 1.000000000000000021e-03 5.489249706454161527e-04 3.474537605956091817e-04 2.259230848255512310e-04 1.523937628358645337e-04 1.086796692149487770e-04 8.478306608188779627e-05 7.695937762456762194e-05 9.147679298288125297e-05
80 1.000000000000000021e-03 5.483000259883204826e-04 3.467749496226811058e-04 2.253095582547179863e-04 1.518442955755717951e-04 1.081534202533376696e-04 8.421101904463252675e-05 7.620026875215024978e-05 9.008409282780761526e-05
81 1.000000000000000021e-03 5.476818198739591458e-04 3.461035499001802445e-04 2.247026308546789793e-04 1.513005855077949086e-04 1.076326404207925846e-04 8.364524675486820964e-05 7.545094724756280888e-05 8.871547365198851438e-05
82 1.000000000000000021e-03 5.470705529810189179e-04 3.454397485743721506e-04 2.241024413587690614e-04 1.507627254998857578e-04 1.071173841908876651e-04 8.308576484396013343e-05 7.471135773791005180e-05 8.737059031219478156e-05
83 1.000000000000000021e-03 5.464661991670638182e-04 3.447835000304132159e-04 2.235089374295866490e-04 1.502306605954647535e-04 1.066075905365267742e-04 8.253249249775968508e-05 7.398135232542971769e-05 8.604898363826276057e-05
84 1.000000000000000021e-03 5.458687325221291348e-04 3.441347591201103138e-04 2.229220673120790245e-04 1.497043364932862668e-04 1.061031992194506256e-04 8.198535007121052676e-05 7.326078561528488937e-05 8.475020417489323324e-05
85 1.000000000000000021e-03 5.452901895090844558e-04 3.435150570304173014e-04 2.223706511768525117e-04 1.492190839480494894e-04 1.056468106030715887e-04 8.149737756206330190e-05 7.262157722718122260e-05 8.358877577600780481e-05
86 1.000000000000000021e-03 5.447184570616723891e-04 3.429026954804162766e-04 2.218256219048080177e-04 1.487392297472955698e-04 1.051953246672348403e-04 8.101471604563164947e-05 7.199020130947719233e-05 8.244600742971828849e-05
87 1.000000000000000021e-03 5.441535103689846154e-04 3.422976319891982578e-04 2.212869318272295087e-04 1.482647252612499030e-04 1.047486894350850925e-04 8.053730000430466094e-05 7.136654438032706549e-05 8.132155926679031160e-05
88 1.000000000000000021e-03 5.435909997143165834e-04 3.416955774702987799e-04 2.207511658034611989e-04 1.477929951923679644e-04 1.043049394866297369e-04 8.006352324306285982e-05 7.074908147590525608e-05 8.021344078389119761e-05
89 1.000000000000000021e-03 5.430309161342643806e-04 3.410965159927432586e-04 2.202183050641030458e-04 1.473240192034464783e-04 1.038640511149413747e-04 7.959335168171117276e-05 7.013774197495506457e-05 7.912139691327875046e-05
90 1.000000000000000021e-03 5.424732506674768149e-04 3.405004316631486216e-04 2.196883309178195964e-04 1.468577770769967101e-04 1.034260007962051111e-04 7.912675157408064104e-05 6.953245613429904408e-05 7.804517686317993341e-05
91 1.000000000000000021e-03 5.419179943504857889e-04 3.399073086151600896e-04 2.191612247355960430e-04 1.463942486957527610e-04 1.029907651665082401e-04 7.866368947795671801e-05 6.893315503775990498e-05 7.698453395110452940e-05
92 1.000000000000000021e-03 5.413629828746738867e-04 3.393149394667066966e-04 2.186351838182767991e-04 1.459320465988429058e-04 1.025572658029062702e-04 7.820326658601671303e-05 6.833895931108436813e-05 7.593823716905742757e-05
93 1.000000000000000021e-03 5.408082138671730385e-04 3.387233205925343745e-04 2.181102035828516778e-04 1.454711649598321068e-04 1.021254940975202248e-04 7.774546638666711494e-05 6.774982397495531476e-05 7.490609035628451105e-05
94 1.000000000000000021e-03 5.402536849306272763e-04 3.381324483351249330e-04 2.175862794239174624e-04 1.450115979478540569e-04 1.016954414669310805e-04 7.729027246482876178e-05 6.716570445567967391e-05 7.388790009412213962e-05
95 1.000000000000000021e-03 5.396844473492076093e-04 3.375153269484326116e-04 2.170269255797531330e-04 1.445081577421817903e-04 1.012119806681102793e-04 7.676796353167371053e-05 6.648955946153636300e-05 7.272015355307609235e-05
96 1.000000000000000021e-03 5.391154759339646064e-04 3.368990409960971838e-04 2.164687998325534753e-04 1.440063199340409466e-04 1.007307157169936256e-04 7.624910690660518565e-05 6.582015362379603355e-05 7.157078178685281889e-05
97 1.174325560395078800e-03 2.755298774803674553e-03 5.194387759090383395e-03 9.354521953613973567e-03 1.651171618252517473e-02 2.916966879690554432e-02 5.262163370571950466e-02 9.910396847768351836e-02 2.000000000000000111e-01
98 4.160571131359890040e-03 8.527170824088577475e-03 1.466969461393815427e-02 2.443642414582058997e-02 3.975038656808106002e-02 6.331729118004528201e-02 9.842489957479945428e-02 1.474045868235714374e-01 2.059999999999999887e-01

View File

@@ -0,0 +1,36 @@
{
"uid": "Span1",
"params": {
"length": 80,
"loss_coef": 0.2,
"length_units": "km",
"att_in": 0,
"con_in": 0.5,
"con_out": 0.0,
"lumped_losses": [
{
"position": 7,
"loss": 0.5
}
],
"type_variety": "SSMF",
"dispersion": 0.0000167,
"effective_area": 83e-12,
"pmd_coef": 1.265e-15
},
"operational": {
"temperature": 283,
"raman_pumps": [
{
"power": 0.2,
"frequency": 205000000000000,
"propagation_direction": "counterprop"
},
{
"power": 0.206,
"frequency": 201000000000000,
"propagation_direction": "counterprop"
}
]
}
}

View File

@@ -0,0 +1,97 @@
,Unnamed: 0,signal,ase,nli
0,0,0.00028461768874888705,3.436639817118301e-08,2.1584395398371026e-07
1,1,0.00028211666293476406,3.423996759499589e-08,2.1809245861954257e-07
2,2,0.0002796385058453953,3.411427963331182e-08,2.2028548201656645e-07
3,3,0.0002771829951915728,3.398932824433299e-08,2.224238538437057e-07
4,4,0.00027338904730863836,3.371109366484941e-08,2.2339638015421542e-07
5,5,0.0002696478418176822,3.3435235312069656e-08,2.2430128879557504e-07
6,6,0.00026595862771951147,3.316172589770091e-08,2.2514026889123164e-07
7,7,0.0002623182345801782,3.289051654795761e-08,2.2591288176837496e-07
8,8,0.00025872603823298804,3.262158136113203e-08,2.2662073272007013e-07
9,9,0.0002548422077504841,3.231480491053109e-08,2.269632917207947e-07
10,10,0.0002510150800727548,3.201089350512762e-08,2.2724305184561305e-07
11,11,0.0002472372108596339,3.1709697987730424e-08,2.274556638142854e-07
12,12,0.0002435081184388883,3.1411188710954923e-08,2.2760284870806473e-07
13,13,0.0002398273228957255,3.1115336193393125e-08,2.2768630096746835e-07
14,14,0.00023610099948769217,3.081056270085416e-08,2.27617695956038e-07
15,15,0.00023242489102440902,3.050859262250336e-08,2.274887362838919e-07
16,16,0.00022879847092097078,3.020939430576677e-08,2.273011122655665e-07
17,17,0.00022522143236587835,2.991293825364657e-08,2.27056704831033e-07
18,18,0.00022169324298613107,2.9619193056612953e-08,2.2315585168570266e-07
19,19,0.0002178178461312317,2.9278097616561043e-08,2.189169855906453e-07
20,20,0.0002140033759047069,2.8940600865395135e-08,2.1475128288390263e-07
21,21,0.00021024912752446947,2.8606658136588645e-08,2.1065775386659407e-07
22,22,0.000206554289175574,2.827622313698371e-08,2.0663530613832196e-07
23,23,0.00020291805701626135,2.7949249962519028e-08,2.0268286030011824e-07
24,24,0.00019961589106178864,2.765975998385304e-08,1.9907485701921993e-07
25,25,0.00019636137150032674,2.7373095433009936e-08,1.9552454239910457e-07
26,26,0.0001931539326017224,2.7089223372231097e-08,1.9203113225618846e-07
27,27,0.00018999370973089413,2.68081175642488e-08,1.885945418493717e-07
28,28,0.00018688010986276862,2.6529745205109403e-08,1.8521396370161997e-07
29,29,0.00018381254538966195,2.6254073731438793e-08,1.818885993764317e-07
30,30,0.00018079043504395085,2.5981070886269e-08,1.78617660347401e-07
31,31,0.00017781329518445636,2.5710706310905614e-08,1.7540045799671345e-07
32,32,0.00017488055045064023,2.544294811944895e-08,1.7223621637516225e-07
33,33,0.00017199163096488036,2.5177764647772334e-08,1.691241684952796e-07
34,34,0.00016923198600435235,2.4926164244345613e-08,1.6614800249846462e-07
35,35,0.00016651223518287261,2.4676978561810828e-08,1.632195038378843e-07
36,36,0.00016383188581753214,2.443018036493577e-08,1.6033800467387247e-07
37,37,0.0001611915388800597,2.418575294396746e-08,1.5725354810318075e-07
38,38,0.0001585906555197023,2.394366896238391e-08,1.5422386234766858e-07
39,39,0.00015602870309712287,2.3703901303924173e-08,1.5124806354481474e-07
40,40,0.0001535051551031788,2.3466423066629146e-08,1.4832528036973196e-07
41,41,0.0001510212597387019,2.3231240549132765e-08,1.4545635735033158e-07
42,42,0.00014857641307701306,2.2998325757462813e-08,1.4264034538487909e-07
43,43,0.00014617002011358969,2.276765094680208e-08,1.3987631140917146e-07
44,44,0.00014368188097051016,2.252080862505795e-08,1.3704924606778587e-07
45,45,0.00014123500136325632,2.227648394665253e-08,1.342768563640109e-07
46,46,0.00013882871459443323,2.2034644371118186e-08,1.31558126246417e-07
47,47,0.00013646341840215168,2.1795267893415555e-08,1.2889305332810146e-07
48,48,0.00013413841082142,2.155832207437193e-08,1.2628059500046815e-07
49,49,0.00013185300210097483,2.132377480769977e-08,1.2371972883222934e-07
50,50,0.00012960651423053282,2.1091594291962705e-08,1.2120945193769904e-07
51,51,0.00012739961074346843,2.0861774576065466e-08,1.1875002031242091e-07
52,52,0.00012523156633255863,2.0634283235397628e-08,1.1634039147633555e-07
53,53,0.00012310166960708747,2.0409088189365173e-08,1.1397954484148417e-07
54,54,0.00012096529298347188,2.0178855168888422e-08,1.1162594309222065e-07
55,55,0.00011886718830718708,1.9950983760858723e-08,1.093208043434055e-07
56,56,0.00011680664424128133,1.9725440474060072e-08,1.0695583879566178e-07
57,57,0.00011478396058700633,1.950220202088885e-08,1.0464196732373097e-07
58,58,0.00011279839933843229,1.9281235055452333e-08,1.0237806316789167e-07
59,59,0.00011084923776207272,1.906250658388995e-08,1.0016302524437989e-07
60,60,0.00010893576763351642,1.884598391874928e-08,9.79957771514819e-08
61,61,0.00010705827573621923,1.8631654017664683e-08,9.587614496435341e-08
62,62,0.00010521603014069265,1.8419483867548078e-08,9.380304193213288e-08
63,63,0.00010340831493293095,1.8209440802910146e-08,9.1775407295826e-08
64,64,0.00010178667717264663,1.8029552937387797e-08,8.992671343771878e-08
65,65,0.00010019319833745167,1.7851381317094802e-08,8.811583172055121e-08
66,66,9.86273426809622e-05,1.767490377589294e-08,8.634195328719705e-08
67,67,9.70886230248071e-05,1.7500098774413897e-08,8.460432022445385e-08
68,68,9.557652367577673e-05,1.7326944621204857e-08,8.290215772518696e-08
69,69,9.409053958216297e-05,1.7155419863785074e-08,8.123470846820667e-08
70,70,9.263017577528553e-05,1.698550325493719e-08,7.960123192429599e-08
71,71,9.119540203213482e-05,1.681718296074974e-08,7.800139303615196e-08
72,72,8.978572151582878e-05,1.6650437769918198e-08,7.643446000507212e-08
73,73,8.840064792008674e-05,1.648524670194174e-08,7.489971794966337e-08
74,74,8.704752218385389e-05,1.6323921332107853e-08,7.340306015991841e-08
75,75,8.571782151670807e-05,1.616417166590195e-08,7.228178645083984e-08
76,76,8.441109599127084e-05,1.6005979385519616e-08,7.117988659258102e-08
77,77,8.312693723019766e-05,1.584932678267078e-08,7.009701621983393e-08
78,78,8.186491243372442e-05,1.569419608150936e-08,6.90328103730187e-08
79,79,8.062459786565112e-05,1.554056978222129e-08,6.798691173543069e-08
80,80,7.94055784447779e-05,1.538843064058219e-08,6.695897028871753e-08
81,81,7.820755061857071e-05,1.523776381588298e-08,6.594873006137818e-08
82,82,7.703011159024537e-05,1.5088552513719166e-08,6.495585139392737e-08
83,83,7.587286701386211e-05,1.494078021244127e-08,6.398000175307732e-08
84,84,7.483848702669918e-05,1.481852757489104e-08,6.310775801171533e-08
85,85,7.382059659354297e-05,1.4697575551136038e-08,6.224941913167962e-08
86,86,7.281889798107282e-05,1.4577917663325962e-08,6.140473404853674e-08
87,87,7.183165666349203e-05,1.4459532716368791e-08,6.057224011868445e-08
88,88,7.08586484091438e-05,1.4342415672865158e-08,5.975174825816752e-08
89,89,6.989965271824705e-05,1.422656189652791e-08,5.8943072529944956e-08
90,90,6.895445267562359e-05,1.411196715686287e-08,5.814603001970201e-08
91,91,6.802197391413278e-05,1.3998609279853771e-08,5.735971476442124e-08
92,92,6.710204336793658e-05,1.3886485591019257e-08,5.6583980825863337e-08
93,93,6.619449037899918e-05,1.3775593851234834e-08,5.581868429617485e-08
94,94,6.515268324911003e-05,1.3628882565600955e-08,5.494017759648076e-08
95,95,6.412720169535454e-05,1.3483606920728348e-08,5.407543748332493e-08
1 Unnamed: 0 signal ase nli
2 0 0 0.00028461768874888705 3.436639817118301e-08 2.1584395398371026e-07
3 1 1 0.00028211666293476406 3.423996759499589e-08 2.1809245861954257e-07
4 2 2 0.0002796385058453953 3.411427963331182e-08 2.2028548201656645e-07
5 3 3 0.0002771829951915728 3.398932824433299e-08 2.224238538437057e-07
6 4 4 0.00027338904730863836 3.371109366484941e-08 2.2339638015421542e-07
7 5 5 0.0002696478418176822 3.3435235312069656e-08 2.2430128879557504e-07
8 6 6 0.00026595862771951147 3.316172589770091e-08 2.2514026889123164e-07
9 7 7 0.0002623182345801782 3.289051654795761e-08 2.2591288176837496e-07
10 8 8 0.00025872603823298804 3.262158136113203e-08 2.2662073272007013e-07
11 9 9 0.0002548422077504841 3.231480491053109e-08 2.269632917207947e-07
12 10 10 0.0002510150800727548 3.201089350512762e-08 2.2724305184561305e-07
13 11 11 0.0002472372108596339 3.1709697987730424e-08 2.274556638142854e-07
14 12 12 0.0002435081184388883 3.1411188710954923e-08 2.2760284870806473e-07
15 13 13 0.0002398273228957255 3.1115336193393125e-08 2.2768630096746835e-07
16 14 14 0.00023610099948769217 3.081056270085416e-08 2.27617695956038e-07
17 15 15 0.00023242489102440902 3.050859262250336e-08 2.274887362838919e-07
18 16 16 0.00022879847092097078 3.020939430576677e-08 2.273011122655665e-07
19 17 17 0.00022522143236587835 2.991293825364657e-08 2.27056704831033e-07
20 18 18 0.00022169324298613107 2.9619193056612953e-08 2.2315585168570266e-07
21 19 19 0.0002178178461312317 2.9278097616561043e-08 2.189169855906453e-07
22 20 20 0.0002140033759047069 2.8940600865395135e-08 2.1475128288390263e-07
23 21 21 0.00021024912752446947 2.8606658136588645e-08 2.1065775386659407e-07
24 22 22 0.000206554289175574 2.827622313698371e-08 2.0663530613832196e-07
25 23 23 0.00020291805701626135 2.7949249962519028e-08 2.0268286030011824e-07
26 24 24 0.00019961589106178864 2.765975998385304e-08 1.9907485701921993e-07
27 25 25 0.00019636137150032674 2.7373095433009936e-08 1.9552454239910457e-07
28 26 26 0.0001931539326017224 2.7089223372231097e-08 1.9203113225618846e-07
29 27 27 0.00018999370973089413 2.68081175642488e-08 1.885945418493717e-07
30 28 28 0.00018688010986276862 2.6529745205109403e-08 1.8521396370161997e-07
31 29 29 0.00018381254538966195 2.6254073731438793e-08 1.818885993764317e-07
32 30 30 0.00018079043504395085 2.5981070886269e-08 1.78617660347401e-07
33 31 31 0.00017781329518445636 2.5710706310905614e-08 1.7540045799671345e-07
34 32 32 0.00017488055045064023 2.544294811944895e-08 1.7223621637516225e-07
35 33 33 0.00017199163096488036 2.5177764647772334e-08 1.691241684952796e-07
36 34 34 0.00016923198600435235 2.4926164244345613e-08 1.6614800249846462e-07
37 35 35 0.00016651223518287261 2.4676978561810828e-08 1.632195038378843e-07
38 36 36 0.00016383188581753214 2.443018036493577e-08 1.6033800467387247e-07
39 37 37 0.0001611915388800597 2.418575294396746e-08 1.5725354810318075e-07
40 38 38 0.0001585906555197023 2.394366896238391e-08 1.5422386234766858e-07
41 39 39 0.00015602870309712287 2.3703901303924173e-08 1.5124806354481474e-07
42 40 40 0.0001535051551031788 2.3466423066629146e-08 1.4832528036973196e-07
43 41 41 0.0001510212597387019 2.3231240549132765e-08 1.4545635735033158e-07
44 42 42 0.00014857641307701306 2.2998325757462813e-08 1.4264034538487909e-07
45 43 43 0.00014617002011358969 2.276765094680208e-08 1.3987631140917146e-07
46 44 44 0.00014368188097051016 2.252080862505795e-08 1.3704924606778587e-07
47 45 45 0.00014123500136325632 2.227648394665253e-08 1.342768563640109e-07
48 46 46 0.00013882871459443323 2.2034644371118186e-08 1.31558126246417e-07
49 47 47 0.00013646341840215168 2.1795267893415555e-08 1.2889305332810146e-07
50 48 48 0.00013413841082142 2.155832207437193e-08 1.2628059500046815e-07
51 49 49 0.00013185300210097483 2.132377480769977e-08 1.2371972883222934e-07
52 50 50 0.00012960651423053282 2.1091594291962705e-08 1.2120945193769904e-07
53 51 51 0.00012739961074346843 2.0861774576065466e-08 1.1875002031242091e-07
54 52 52 0.00012523156633255863 2.0634283235397628e-08 1.1634039147633555e-07
55 53 53 0.00012310166960708747 2.0409088189365173e-08 1.1397954484148417e-07
56 54 54 0.00012096529298347188 2.0178855168888422e-08 1.1162594309222065e-07
57 55 55 0.00011886718830718708 1.9950983760858723e-08 1.093208043434055e-07
58 56 56 0.00011680664424128133 1.9725440474060072e-08 1.0695583879566178e-07
59 57 57 0.00011478396058700633 1.950220202088885e-08 1.0464196732373097e-07
60 58 58 0.00011279839933843229 1.9281235055452333e-08 1.0237806316789167e-07
61 59 59 0.00011084923776207272 1.906250658388995e-08 1.0016302524437989e-07
62 60 60 0.00010893576763351642 1.884598391874928e-08 9.79957771514819e-08
63 61 61 0.00010705827573621923 1.8631654017664683e-08 9.587614496435341e-08
64 62 62 0.00010521603014069265 1.8419483867548078e-08 9.380304193213288e-08
65 63 63 0.00010340831493293095 1.8209440802910146e-08 9.1775407295826e-08
66 64 64 0.00010178667717264663 1.8029552937387797e-08 8.992671343771878e-08
67 65 65 0.00010019319833745167 1.7851381317094802e-08 8.811583172055121e-08
68 66 66 9.86273426809622e-05 1.767490377589294e-08 8.634195328719705e-08
69 67 67 9.70886230248071e-05 1.7500098774413897e-08 8.460432022445385e-08
70 68 68 9.557652367577673e-05 1.7326944621204857e-08 8.290215772518696e-08
71 69 69 9.409053958216297e-05 1.7155419863785074e-08 8.123470846820667e-08
72 70 70 9.263017577528553e-05 1.698550325493719e-08 7.960123192429599e-08
73 71 71 9.119540203213482e-05 1.681718296074974e-08 7.800139303615196e-08
74 72 72 8.978572151582878e-05 1.6650437769918198e-08 7.643446000507212e-08
75 73 73 8.840064792008674e-05 1.648524670194174e-08 7.489971794966337e-08
76 74 74 8.704752218385389e-05 1.6323921332107853e-08 7.340306015991841e-08
77 75 75 8.571782151670807e-05 1.616417166590195e-08 7.228178645083984e-08
78 76 76 8.441109599127084e-05 1.6005979385519616e-08 7.117988659258102e-08
79 77 77 8.312693723019766e-05 1.584932678267078e-08 7.009701621983393e-08
80 78 78 8.186491243372442e-05 1.569419608150936e-08 6.90328103730187e-08
81 79 79 8.062459786565112e-05 1.554056978222129e-08 6.798691173543069e-08
82 80 80 7.94055784447779e-05 1.538843064058219e-08 6.695897028871753e-08
83 81 81 7.820755061857071e-05 1.523776381588298e-08 6.594873006137818e-08
84 82 82 7.703011159024537e-05 1.5088552513719166e-08 6.495585139392737e-08
85 83 83 7.587286701386211e-05 1.494078021244127e-08 6.398000175307732e-08
86 84 84 7.483848702669918e-05 1.481852757489104e-08 6.310775801171533e-08
87 85 85 7.382059659354297e-05 1.4697575551136038e-08 6.224941913167962e-08
88 86 86 7.281889798107282e-05 1.4577917663325962e-08 6.140473404853674e-08
89 87 87 7.183165666349203e-05 1.4459532716368791e-08 6.057224011868445e-08
90 88 88 7.08586484091438e-05 1.4342415672865158e-08 5.975174825816752e-08
91 89 89 6.989965271824705e-05 1.422656189652791e-08 5.8943072529944956e-08
92 90 90 6.895445267562359e-05 1.411196715686287e-08 5.814603001970201e-08
93 91 91 6.802197391413278e-05 1.3998609279853771e-08 5.735971476442124e-08
94 92 92 6.710204336793658e-05 1.3886485591019257e-08 5.6583980825863337e-08
95 93 93 6.619449037899918e-05 1.3775593851234834e-08 5.581868429617485e-08
96 94 94 6.515268324911003e-05 1.3628882565600955e-08 5.494017759648076e-08
97 95 95 6.412720169535454e-05 1.3483606920728348e-08 5.407543748332493e-08

View File

@@ -1,97 +0,0 @@
,signal,ase,nli
0,0.0002869472910749756,3.829244288314411e-08,2.1570435023738975e-07
1,0.0002844264441819097,3.810807396068084e-08,2.1799950841473497e-07
2,0.00028192866252406385,3.792544000755193e-08,2.2023841125047751e-07
3,0.0002794537215642667,3.7744517714620316e-08,2.2242189941355056e-07
4,0.00027562432957345563,3.739256592350871e-08,2.2343448272115905e-07
5,0.0002718482755003939,3.7044482870002475e-08,2.2437826192962336e-07
6,0.00026812479793132313,3.670020704375223e-08,2.2525495466693408e-07
7,0.000264450700138397,3.635954085714981e-08,2.2606415187873477e-07
8,0.0002608253488030976,3.602242835595967e-08,2.2680748521505387e-07
9,0.0002569046888856947,3.564392097524325e-08,2.2718285844823122e-07
10,0.0002530414048172964,3.52696660940159e-08,2.2749429758474536e-07
11,0.0002492279873569917,3.489974200864255e-08,2.277374766527899e-07
12,0.00024546394589921574,3.453407358954537e-08,2.2791414400785136e-07
13,0.00024174879169001578,3.4172586853993816e-08,2.280260208417818e-07
14,0.00023798746912554602,3.3802283179520985e-08,2.2798420759778034e-07
15,0.00023427697848580554,3.343627022987542e-08,2.2788101592695744e-07
16,0.0002306167836320285,3.307447309241581e-08,2.2771816297650914e-07
17,0.00022700656967539738,3.2716831574363364e-08,2.274975560288182e-07
18,0.00022344579480967338,3.236327278261661e-08,2.2361822442592406e-07
19,0.00021953361935365365,3.195819964288877e-08,2.1939761734541424e-07
20,0.000215683131390894,3.155821693631402e-08,2.152494588710531e-07
21,0.0002118936126056039,3.116322947665684e-08,2.1117277567387026e-07
22,0.00020816423698459974,3.0773146233359933e-08,2.0716649124095414e-07
23,0.000204494186708796,3.0387877710694614e-08,2.0322954179937734e-07
24,0.0002011608152067422,3.0044038268833097e-08,1.9963693210325328e-07
25,0.0001978756946189507,2.9704204306604607e-08,1.9610141536963302e-07
26,0.00019463824873067792,2.9368307297032184e-08,1.9262221997374404e-07
27,0.00019144860669288407,2.903632861769827e-08,1.8919927457566036e-07
28,0.00018830616497929743,2.870820070744311e-08,1.8583178406705711e-07
29,0.0001852103256336822,2.838385708911634e-08,1.8251896218718027e-07
30,0.0001821604972098109,2.8063232252848876e-08,1.7926003240910756e-07
31,0.00017915618670059162,2.774625963676283e-08,1.76054318231953e-07
32,0.00017619680881745593,2.7432875871797347e-08,1.729010553429381e-07
33,0.0001732817839023698,2.712301856538676e-08,1.6979948820365403e-07
34,0.0001704966413678542,2.6828122477482957e-08,1.6683312331765736e-07
35,0.00016775189226190024,2.6536528664560742e-08,1.639139770351803e-07
36,0.00016504703499518105,2.624818226917535e-08,1.6104139135569604e-07
37,0.00016238266779776653,2.5963117448579666e-08,1.5795381794641793e-07
38,0.0001597582427278871,2.568127942199337e-08,1.5492098715709327e-07
39,0.0001571732182027887,2.5402614261982925e-08,1.5194201541883415e-07
40,0.00015462705891567335,2.5127068868391087e-08,1.4901603171959048e-07
41,0.00015212101646395513,2.4854550603641668e-08,1.4614388817380648e-07
42,0.00014965447757985992,2.4585009902449718e-08,1.4332463586635585e-07
43,0.0001472268380950584,2.4318397887399997e-08,1.4055734193945962e-07
44,0.0001447164668892332,2.4034551917480693e-08,1.377259000826997e-07
45,0.00014224784112376056,2.3753930444781328e-08,1.3494914625940223e-07
46,0.000139820283675003,2.3476479506890216e-08,1.3222606385781202e-07
47,0.00013743418748444287,2.3202247900619965e-08,1.295566531341862e-07
48,0.00013508884015386686,2.2931181973013504e-08,1.2693987096025158e-07
49,0.00013278354172498307,2.2663228905058608e-08,1.2437469442130953e-07
50,0.00013051760419724657,2.2398336706395863e-08,1.2186012017917007e-07
51,0.00012829168984638487,2.2136423459712534e-08,1.1939640981689728e-07
52,0.00012610506317956756,2.1877440279108582e-08,1.1698252030563078e-07
53,0.00012395700285919374,2.1621338937233993e-08,1.1461743054419825e-07
54,0.00012180241033650921,2.136015630373758e-08,1.1225922783040025e-07
55,0.0001196865090578088,2.11019103466444e-08,1.0994951537260489e-07
56,0.00011760857776205185,2.0846552296319304e-08,1.0757395097863843e-07
57,0.00011556891128259512,2.0594154864038522e-08,1.0524972555992818e-07
58,0.00011356676177304645,2.0344670536408355e-08,1.0297570549834491e-07
59,0.00011160139690545148,2.009805268169949e-08,1.007507830554809e-07
60,0.00010967209909252316,1.9854255584746143e-08,9.857387536569294e-08
61,0.00010777915187088834,1.961321154131787e-08,9.644480679617587e-08
62,0.00010592181397175025,1.9374877782865603e-08,9.43624842461164e-08
63,0.00010409936038609485,1.913921236065976e-08,9.232584080120623e-08
64,0.00010246447558376296,1.8936229484424864e-08,9.046927135292076e-08
65,0.00010085803630103994,1.873544193319646e-08,8.865067925960422e-08
66,9.927950010555374e-05,1.8536821682157304e-08,8.686925127148483e-08
67,9.772837346090753e-05,1.834034757300294e-08,8.512422533827403e-08
68,9.62041343011343e-05,1.8145993316507615e-08,8.341482250640209e-08
69,9.470627135912848e-05,1.7953733512786736e-08,8.174028142913557e-08
70,9.32342835979764e-05,1.776354374489084e-08,8.009985766376519e-08
71,9.178813743816069e-05,1.757538990695628e-08,7.849321446941075e-08
72,9.036733009485282e-05,1.7389250225057777e-08,7.691961625609573e-08
73,8.897136946428169e-05,1.7205104136353174e-08,7.537834446343352e-08
74,8.760740745801088e-05,1.7025340034280735e-08,7.38751341742058e-08
75,8.626710469266231e-05,1.6847609082084475e-08,7.274492099364066e-08
76,8.495000573672366e-05,1.6671897815367364e-08,7.16342744751107e-08
77,8.365569697520734e-05,1.6498202874185357e-08,7.054284583689086e-08
78,8.238374036673638e-05,1.6326516066391613e-08,6.94702656996508e-08
79,8.11337070649851e-05,1.615683240442047e-08,6.84161724378069e-08
80,7.990517700271111e-05,1.5989150837085435e-08,6.738021182875641e-08
81,7.869784230919362e-05,1.5823472723367315e-08,6.63621242598539e-08
82,7.751129541079501e-05,1.5659808141896922e-08,6.536156604375558e-08
83,7.634513730458697e-05,1.5498175122781168e-08,6.437820072038669e-08
84,7.530262080974513e-05,1.5364277079429572e-08,6.349909645089698e-08
85,7.427675504203511e-05,1.523236493234819e-08,6.263403294276124e-08
86,7.326723873728716e-05,1.510251249079146e-08,6.178275615432246e-08
87,7.227232864620995e-05,1.4974078108462424e-08,6.094379608687809e-08
88,7.1291797553153e-05,1.4847055996011248e-08,6.011696114034367e-08
89,7.032542203609039e-05,1.4721440784517874e-08,5.930206291361685e-08
90,6.937298231673965e-05,1.4597227547292096e-08,5.849891607818969e-08
91,6.843339696762385e-05,1.447443282270653e-08,5.7706608718023645e-08
92,6.750649045006057e-05,1.4353051811356354e-08,5.6924992809748396e-08
93,6.65920896785063e-05,1.4233080214004659e-08,5.615392239860827e-08
94,6.554258932109667e-05,1.407504972937325e-08,5.5268928972034444e-08
95,6.450957734109368e-05,1.3918655180382722e-08,5.439783940506079e-08
1 signal ase nli
2 0 0.0002869472910749756 3.829244288314411e-08 2.1570435023738975e-07
3 1 0.0002844264441819097 3.810807396068084e-08 2.1799950841473497e-07
4 2 0.00028192866252406385 3.792544000755193e-08 2.2023841125047751e-07
5 3 0.0002794537215642667 3.7744517714620316e-08 2.2242189941355056e-07
6 4 0.00027562432957345563 3.739256592350871e-08 2.2343448272115905e-07
7 5 0.0002718482755003939 3.7044482870002475e-08 2.2437826192962336e-07
8 6 0.00026812479793132313 3.670020704375223e-08 2.2525495466693408e-07
9 7 0.000264450700138397 3.635954085714981e-08 2.2606415187873477e-07
10 8 0.0002608253488030976 3.602242835595967e-08 2.2680748521505387e-07
11 9 0.0002569046888856947 3.564392097524325e-08 2.2718285844823122e-07
12 10 0.0002530414048172964 3.52696660940159e-08 2.2749429758474536e-07
13 11 0.0002492279873569917 3.489974200864255e-08 2.277374766527899e-07
14 12 0.00024546394589921574 3.453407358954537e-08 2.2791414400785136e-07
15 13 0.00024174879169001578 3.4172586853993816e-08 2.280260208417818e-07
16 14 0.00023798746912554602 3.3802283179520985e-08 2.2798420759778034e-07
17 15 0.00023427697848580554 3.343627022987542e-08 2.2788101592695744e-07
18 16 0.0002306167836320285 3.307447309241581e-08 2.2771816297650914e-07
19 17 0.00022700656967539738 3.2716831574363364e-08 2.274975560288182e-07
20 18 0.00022344579480967338 3.236327278261661e-08 2.2361822442592406e-07
21 19 0.00021953361935365365 3.195819964288877e-08 2.1939761734541424e-07
22 20 0.000215683131390894 3.155821693631402e-08 2.152494588710531e-07
23 21 0.0002118936126056039 3.116322947665684e-08 2.1117277567387026e-07
24 22 0.00020816423698459974 3.0773146233359933e-08 2.0716649124095414e-07
25 23 0.000204494186708796 3.0387877710694614e-08 2.0322954179937734e-07
26 24 0.0002011608152067422 3.0044038268833097e-08 1.9963693210325328e-07
27 25 0.0001978756946189507 2.9704204306604607e-08 1.9610141536963302e-07
28 26 0.00019463824873067792 2.9368307297032184e-08 1.9262221997374404e-07
29 27 0.00019144860669288407 2.903632861769827e-08 1.8919927457566036e-07
30 28 0.00018830616497929743 2.870820070744311e-08 1.8583178406705711e-07
31 29 0.0001852103256336822 2.838385708911634e-08 1.8251896218718027e-07
32 30 0.0001821604972098109 2.8063232252848876e-08 1.7926003240910756e-07
33 31 0.00017915618670059162 2.774625963676283e-08 1.76054318231953e-07
34 32 0.00017619680881745593 2.7432875871797347e-08 1.729010553429381e-07
35 33 0.0001732817839023698 2.712301856538676e-08 1.6979948820365403e-07
36 34 0.0001704966413678542 2.6828122477482957e-08 1.6683312331765736e-07
37 35 0.00016775189226190024 2.6536528664560742e-08 1.639139770351803e-07
38 36 0.00016504703499518105 2.624818226917535e-08 1.6104139135569604e-07
39 37 0.00016238266779776653 2.5963117448579666e-08 1.5795381794641793e-07
40 38 0.0001597582427278871 2.568127942199337e-08 1.5492098715709327e-07
41 39 0.0001571732182027887 2.5402614261982925e-08 1.5194201541883415e-07
42 40 0.00015462705891567335 2.5127068868391087e-08 1.4901603171959048e-07
43 41 0.00015212101646395513 2.4854550603641668e-08 1.4614388817380648e-07
44 42 0.00014965447757985992 2.4585009902449718e-08 1.4332463586635585e-07
45 43 0.0001472268380950584 2.4318397887399997e-08 1.4055734193945962e-07
46 44 0.0001447164668892332 2.4034551917480693e-08 1.377259000826997e-07
47 45 0.00014224784112376056 2.3753930444781328e-08 1.3494914625940223e-07
48 46 0.000139820283675003 2.3476479506890216e-08 1.3222606385781202e-07
49 47 0.00013743418748444287 2.3202247900619965e-08 1.295566531341862e-07
50 48 0.00013508884015386686 2.2931181973013504e-08 1.2693987096025158e-07
51 49 0.00013278354172498307 2.2663228905058608e-08 1.2437469442130953e-07
52 50 0.00013051760419724657 2.2398336706395863e-08 1.2186012017917007e-07
53 51 0.00012829168984638487 2.2136423459712534e-08 1.1939640981689728e-07
54 52 0.00012610506317956756 2.1877440279108582e-08 1.1698252030563078e-07
55 53 0.00012395700285919374 2.1621338937233993e-08 1.1461743054419825e-07
56 54 0.00012180241033650921 2.136015630373758e-08 1.1225922783040025e-07
57 55 0.0001196865090578088 2.11019103466444e-08 1.0994951537260489e-07
58 56 0.00011760857776205185 2.0846552296319304e-08 1.0757395097863843e-07
59 57 0.00011556891128259512 2.0594154864038522e-08 1.0524972555992818e-07
60 58 0.00011356676177304645 2.0344670536408355e-08 1.0297570549834491e-07
61 59 0.00011160139690545148 2.009805268169949e-08 1.007507830554809e-07
62 60 0.00010967209909252316 1.9854255584746143e-08 9.857387536569294e-08
63 61 0.00010777915187088834 1.961321154131787e-08 9.644480679617587e-08
64 62 0.00010592181397175025 1.9374877782865603e-08 9.43624842461164e-08
65 63 0.00010409936038609485 1.913921236065976e-08 9.232584080120623e-08
66 64 0.00010246447558376296 1.8936229484424864e-08 9.046927135292076e-08
67 65 0.00010085803630103994 1.873544193319646e-08 8.865067925960422e-08
68 66 9.927950010555374e-05 1.8536821682157304e-08 8.686925127148483e-08
69 67 9.772837346090753e-05 1.834034757300294e-08 8.512422533827403e-08
70 68 9.62041343011343e-05 1.8145993316507615e-08 8.341482250640209e-08
71 69 9.470627135912848e-05 1.7953733512786736e-08 8.174028142913557e-08
72 70 9.32342835979764e-05 1.776354374489084e-08 8.009985766376519e-08
73 71 9.178813743816069e-05 1.757538990695628e-08 7.849321446941075e-08
74 72 9.036733009485282e-05 1.7389250225057777e-08 7.691961625609573e-08
75 73 8.897136946428169e-05 1.7205104136353174e-08 7.537834446343352e-08
76 74 8.760740745801088e-05 1.7025340034280735e-08 7.38751341742058e-08
77 75 8.626710469266231e-05 1.6847609082084475e-08 7.274492099364066e-08
78 76 8.495000573672366e-05 1.6671897815367364e-08 7.16342744751107e-08
79 77 8.365569697520734e-05 1.6498202874185357e-08 7.054284583689086e-08
80 78 8.238374036673638e-05 1.6326516066391613e-08 6.94702656996508e-08
81 79 8.11337070649851e-05 1.615683240442047e-08 6.84161724378069e-08
82 80 7.990517700271111e-05 1.5989150837085435e-08 6.738021182875641e-08
83 81 7.869784230919362e-05 1.5823472723367315e-08 6.63621242598539e-08
84 82 7.751129541079501e-05 1.5659808141896922e-08 6.536156604375558e-08
85 83 7.634513730458697e-05 1.5498175122781168e-08 6.437820072038669e-08
86 84 7.530262080974513e-05 1.5364277079429572e-08 6.349909645089698e-08
87 85 7.427675504203511e-05 1.523236493234819e-08 6.263403294276124e-08
88 86 7.326723873728716e-05 1.510251249079146e-08 6.178275615432246e-08
89 87 7.227232864620995e-05 1.4974078108462424e-08 6.094379608687809e-08
90 88 7.1291797553153e-05 1.4847055996011248e-08 6.011696114034367e-08
91 89 7.032542203609039e-05 1.4721440784517874e-08 5.930206291361685e-08
92 90 6.937298231673965e-05 1.4597227547292096e-08 5.849891607818969e-08
93 91 6.843339696762385e-05 1.447443282270653e-08 5.7706608718023645e-08
94 92 6.750649045006057e-05 1.4353051811356354e-08 5.6924992809748396e-08
95 93 6.65920896785063e-05 1.4233080214004659e-08 5.615392239860827e-08
96 94 6.554258932109667e-05 1.407504972937325e-08 5.5268928972034444e-08
97 95 6.450957734109368e-05 1.3918655180382722e-08 5.439783940506079e-08

View File

@@ -0,0 +1,38 @@
{
"uid": "Span1",
"params": {
"length": 80,
"loss_coef": 0.2,
"length_units": "km",
"att_in": 0,
"con_in": 0.5,
"con_out": 0.5,
"type_variety": "SSMF",
"dispersion": 0.0000167,
"effective_area": 83e-12,
"pmd_coef": 1.265e-15
},
"operational": {
"temperature": 283,
"raman_pumps": [
{
"power": 224.403e-3,
"frequency": 205e12,
"propagation_direction": "counterprop"
},
{
"power": 231.135e-3,
"frequency": 201e12,
"propagation_direction": "counterprop"
}
]
},
"metadata": {
"location": {
"latitude": 1,
"longitude": 0,
"city": null,
"region": ""
}
}
}

View File

@@ -14,9 +14,11 @@ Transceiver trx_Stockholm
OSNR ASE (signal bw, dB): 30.98
CD (ps/nm): 0.00
PMD (ps): 0.00
PDL (dB): 0.00
Roadm roadm_Stockholm
effective loss (dB): 22.00
pch out (dBm): -20.00
effective 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)
type_variety: openroadm_mw_mw_booster
effective gain(dB): 22.00
@@ -29,6 +31,7 @@ Edfa Edfa_booster_roadm_Stockholm_to_fiber (Stockholm → Norrköping)_(1/2)
Delta_P (dB): 0.00
target pch (dBm): 2.00
effective pch (dBm): 2.00
actual pch out (dBm): 2.00
output VOA (dB): 0.00
Fiber fiber (Stockholm → Norrköping)_(1/2)
type_variety: SSMF
@@ -37,7 +40,8 @@ Fiber fiber (Stockholm → Norrköping)_(1/2)
total loss (dB): 16.33
(includes conn loss (dB) in: 0.00 out: 0.00)
(conn loss out includes EOL margin defined in eqpt_config.json)
pch out (dBm): -14.33
reference pch out (dBm): -14.33
actual pch out (dBm): -14.31
Edfa Edfa_fiber (Stockholm → Norrköping)_(1/2)
type_variety: openroadm_ila_low_noise
effective gain(dB): 16.33
@@ -50,6 +54,7 @@ Edfa Edfa_fiber (Stockholm → Norrköping)_(1/2)
Delta_P (dB): 0.00
target pch (dBm): 2.00
effective pch (dBm): 2.00
actual pch out (dBm): 2.02
output VOA (dB): 0.00
Fiber fiber (Stockholm → Norrköping)_(2/2)
type_variety: SSMF
@@ -58,7 +63,8 @@ Fiber fiber (Stockholm → Norrköping)_(2/2)
total loss (dB): 16.33
(includes conn loss (dB) in: 0.00 out: 0.00)
(conn loss out includes EOL margin defined in eqpt_config.json)
pch out (dBm): -14.33
reference pch out (dBm): -14.33
actual pch out (dBm): -14.30
Edfa Edfa_preamp_roadm_Norrköping_from_fiber (Stockholm → Norrköping)_(2/2)
type_variety: openroadm_mw_mw_preamp
effective gain(dB): 16.33
@@ -71,10 +77,12 @@ Edfa Edfa_preamp_roadm_Norrköping_from_fiber (Stockholm → Norrköping)_(2/2)
Delta_P (dB): 0.00
target pch (dBm): 2.00
effective pch (dBm): 2.00
actual pch out (dBm): 2.04
output VOA (dB): 0.00
Roadm roadm_Norrköping
effective loss (dB): 22.00
pch out (dBm): -20.00
effective loss (dB): 22.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Edfa Edfa_booster_roadm_Norrköping_to_fiber (Norrköping → Linköping)
type_variety: openroadm_mw_mw_booster
effective gain(dB): 22.00
@@ -87,6 +95,7 @@ Edfa Edfa_booster_roadm_Norrköping_to_fiber (Norrköping → Linköping)
Delta_P (dB): 0.00
target pch (dBm): 2.00
effective pch (dBm): 2.00
actual pch out (dBm): 2.00
output VOA (dB): 0.00
Fiber fiber (Norrköping → Linköping)
type_variety: SSMF
@@ -95,7 +104,8 @@ Fiber fiber (Norrköping → Linköping)
total loss (dB): 11.00
(includes conn loss (dB) in: 0.00 out: 0.00)
(conn loss out includes EOL margin defined in eqpt_config.json)
pch out (dBm): -9.00
reference pch out (dBm): -9.00
actual pch out (dBm): -9.00
Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping)
type_variety: openroadm_mw_mw_preamp
effective gain(dB): 11.00
@@ -108,10 +118,12 @@ Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping)
Delta_P (dB): 0.00
target pch (dBm): 2.00
effective pch (dBm): 2.00
actual pch out (dBm): 2.01
output VOA (dB): 0.00
Roadm roadm_Linköping
effective loss (dB): 22.00
pch out (dBm): -20.00
effective loss (dB): 22.00
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)
type_variety: openroadm_mw_mw_booster
effective gain(dB): 22.00
@@ -124,6 +136,7 @@ Edfa Edfa_booster_roadm_Linköping_to_fiber (Linköping → Jönköping)
Delta_P (dB): 0.00
target pch (dBm): 2.00
effective pch (dBm): 2.00
actual pch out (dBm): 2.00
output VOA (dB): 0.00
Fiber fiber (Linköping → Jönköping)
type_variety: SSMF
@@ -132,7 +145,8 @@ Fiber fiber (Linköping → Jönköping)
total loss (dB): 26.80
(includes conn loss (dB) in: 0.00 out: 0.00)
(conn loss out includes EOL margin defined in eqpt_config.json)
pch out (dBm): -24.80
reference pch out (dBm): -24.80
actual pch out (dBm): -24.79
Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping)
type_variety: openroadm_mw_mw_preamp
effective gain(dB): 26.80
@@ -145,10 +159,12 @@ Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping)
Delta_P (dB): 0.00
target pch (dBm): 2.00
effective pch (dBm): 2.00
actual pch out (dBm): 2.04
output VOA (dB): 0.00
Roadm roadm_Jönköping
effective loss (dB): 22.00
pch out (dBm): -20.00
effective loss (dB): 22.00
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)
type_variety: openroadm_mw_mw_booster
effective gain(dB): 22.00
@@ -161,6 +177,7 @@ Edfa Edfa_booster_roadm_Jönköping_to_fiber (Jönköping → Borås)
Delta_P (dB): 0.00
target pch (dBm): 2.00
effective pch (dBm): 2.00
actual pch out (dBm): 2.00
output VOA (dB): 0.00
Fiber fiber (Jönköping → Borås)
type_variety: SSMF
@@ -169,7 +186,8 @@ Fiber fiber (Jönköping → Borås)
total loss (dB): 17.82
(includes conn loss (dB) in: 0.00 out: 0.00)
(conn loss out includes EOL margin defined in eqpt_config.json)
pch out (dBm): -15.82
reference pch out (dBm): -15.82
actual pch out (dBm): -15.81
Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås)
type_variety: openroadm_mw_mw_preamp
effective gain(dB): 17.82
@@ -182,10 +200,12 @@ Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås)
Delta_P (dB): 0.00
target pch (dBm): 2.00
effective pch (dBm): 2.00
actual pch out (dBm): 2.02
output VOA (dB): 0.00
Roadm roadm_Borås
effective loss (dB): 22.00
pch out (dBm): -20.00
effective loss (dB): 22.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Edfa Edfa_booster_roadm_Borås_to_fiber (Borås → Gothenburg)
type_variety: openroadm_mw_mw_booster
effective gain(dB): 22.00
@@ -198,6 +218,7 @@ Edfa Edfa_booster_roadm_Borås_to_fiber (Borås → Gothenburg)
Delta_P (dB): 0.00
target pch (dBm): 2.00
effective pch (dBm): 2.00
actual pch out (dBm): 2.00
output VOA (dB): 0.00
Fiber fiber (Borås → Gothenburg)
type_variety: SSMF
@@ -206,7 +227,8 @@ Fiber fiber (Borås → Gothenburg)
total loss (dB): 13.53
(includes conn loss (dB) in: 0.00 out: 0.00)
(conn loss out includes EOL margin defined in eqpt_config.json)
pch out (dBm): -11.53
reference pch out (dBm): -11.53
actual pch out (dBm): -11.52
Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg)
type_variety: openroadm_mw_mw_preamp
effective gain(dB): 13.53
@@ -219,17 +241,20 @@ Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg)
Delta_P (dB): 0.00
target pch (dBm): 2.00
effective pch (dBm): 2.00
actual pch out (dBm): 2.02
output VOA (dB): 0.00
Roadm roadm_Gothenburg
effective loss (dB): 22.00
pch out (dBm): -20.00
effective loss (dB): 22.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Transceiver trx_Gothenburg
GSNR (0.1nm, dB): 18.90
GSNR (signal bw, dB): 14.88
OSNR ASE (0.1nm, dB): 21.20
OSNR ASE (signal bw, dB): 17.18
CD (ps/nm): 8350.42
PMD (ps): 0.89
PMD (ps): 7.99
PDL (dB): 3.74
Transmission result for input power = 2.00 dBm:
Final GSNR (0.1 nm): 18.90 dB

View File

@@ -14,9 +14,11 @@ Transceiver trx_Stockholm
OSNR ASE (signal bw, dB): 30.98
CD (ps/nm): 0.00
PMD (ps): 0.00
PDL (dB): 0.00
Roadm roadm_Stockholm
effective loss (dB): 22.00
pch out (dBm): -20.00
effective 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)
type_variety: openroadm_mw_mw_booster
effective gain(dB): 22.00
@@ -29,6 +31,7 @@ Edfa Edfa_booster_roadm_Stockholm_to_fiber (Stockholm → Norrköping)_(1/2)
Delta_P (dB): 0.00
target pch (dBm): 2.00
effective pch (dBm): 2.00
actual pch out (dBm): 2.00
output VOA (dB): 0.00
Fiber fiber (Stockholm → Norrköping)_(1/2)
type_variety: SSMF
@@ -37,7 +40,8 @@ Fiber fiber (Stockholm → Norrköping)_(1/2)
total loss (dB): 16.33
(includes conn loss (dB) in: 0.00 out: 0.00)
(conn loss out includes EOL margin defined in eqpt_config.json)
pch out (dBm): -14.33
reference pch out (dBm): -14.33
actual pch out (dBm): -14.31
Edfa Edfa_fiber (Stockholm → Norrköping)_(1/2)
type_variety: openroadm_ila_low_noise
effective gain(dB): 16.33
@@ -50,6 +54,7 @@ Edfa Edfa_fiber (Stockholm → Norrköping)_(1/2)
Delta_P (dB): 0.00
target pch (dBm): 2.00
effective pch (dBm): 2.00
actual pch out (dBm): 2.02
output VOA (dB): 0.00
Fiber fiber (Stockholm → Norrköping)_(2/2)
type_variety: SSMF
@@ -58,7 +63,8 @@ Fiber fiber (Stockholm → Norrköping)_(2/2)
total loss (dB): 16.33
(includes conn loss (dB) in: 0.00 out: 0.00)
(conn loss out includes EOL margin defined in eqpt_config.json)
pch out (dBm): -14.33
reference pch out (dBm): -14.33
actual pch out (dBm): -14.30
Edfa Edfa_preamp_roadm_Norrköping_from_fiber (Stockholm → Norrköping)_(2/2)
type_variety: openroadm_mw_mw_preamp_worstcase_ver5
effective gain(dB): 16.33
@@ -71,10 +77,12 @@ Edfa Edfa_preamp_roadm_Norrköping_from_fiber (Stockholm → Norrköping)_(2/2)
Delta_P (dB): 0.00
target pch (dBm): 2.00
effective pch (dBm): 2.00
actual pch out (dBm): 2.04
output VOA (dB): 0.00
Roadm roadm_Norrköping
effective loss (dB): 22.00
pch out (dBm): -20.00
effective loss (dB): 22.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Edfa Edfa_booster_roadm_Norrköping_to_fiber (Norrköping → Linköping)
type_variety: openroadm_mw_mw_booster
effective gain(dB): 22.00
@@ -87,6 +95,7 @@ Edfa Edfa_booster_roadm_Norrköping_to_fiber (Norrköping → Linköping)
Delta_P (dB): 0.00
target pch (dBm): 2.00
effective pch (dBm): 2.00
actual pch out (dBm): 2.00
output VOA (dB): 0.00
Fiber fiber (Norrköping → Linköping)
type_variety: SSMF
@@ -95,7 +104,8 @@ Fiber fiber (Norrköping → Linköping)
total loss (dB): 11.00
(includes conn loss (dB) in: 0.00 out: 0.00)
(conn loss out includes EOL margin defined in eqpt_config.json)
pch out (dBm): -9.00
reference pch out (dBm): -9.00
actual pch out (dBm): -9.00
Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping)
type_variety: openroadm_mw_mw_preamp_worstcase_ver5
effective gain(dB): 11.00
@@ -108,10 +118,12 @@ Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping)
Delta_P (dB): 0.00
target pch (dBm): 2.00
effective pch (dBm): 2.00
actual pch out (dBm): 2.01
output VOA (dB): 0.00
Roadm roadm_Linköping
effective loss (dB): 22.00
pch out (dBm): -20.00
effective loss (dB): 22.00
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)
type_variety: openroadm_mw_mw_booster
effective gain(dB): 22.00
@@ -124,6 +136,7 @@ Edfa Edfa_booster_roadm_Linköping_to_fiber (Linköping → Jönköping)
Delta_P (dB): 0.00
target pch (dBm): 2.00
effective pch (dBm): 2.00
actual pch out (dBm): 2.00
output VOA (dB): 0.00
Fiber fiber (Linköping → Jönköping)
type_variety: SSMF
@@ -132,7 +145,8 @@ Fiber fiber (Linköping → Jönköping)
total loss (dB): 26.80
(includes conn loss (dB) in: 0.00 out: 0.00)
(conn loss out includes EOL margin defined in eqpt_config.json)
pch out (dBm): -24.80
reference pch out (dBm): -24.80
actual pch out (dBm): -24.79
Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping)
type_variety: openroadm_mw_mw_preamp_worstcase_ver5
effective gain(dB): 26.80
@@ -145,10 +159,12 @@ Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping)
Delta_P (dB): 0.00
target pch (dBm): 2.00
effective pch (dBm): 2.00
actual pch out (dBm): 2.04
output VOA (dB): 0.00
Roadm roadm_Jönköping
effective loss (dB): 22.00
pch out (dBm): -20.00
effective loss (dB): 22.00
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)
type_variety: openroadm_mw_mw_booster
effective gain(dB): 22.00
@@ -161,6 +177,7 @@ Edfa Edfa_booster_roadm_Jönköping_to_fiber (Jönköping → Borås)
Delta_P (dB): 0.00
target pch (dBm): 2.00
effective pch (dBm): 2.00
actual pch out (dBm): 2.00
output VOA (dB): 0.00
Fiber fiber (Jönköping → Borås)
type_variety: SSMF
@@ -169,7 +186,8 @@ Fiber fiber (Jönköping → Borås)
total loss (dB): 17.82
(includes conn loss (dB) in: 0.00 out: 0.00)
(conn loss out includes EOL margin defined in eqpt_config.json)
pch out (dBm): -15.82
reference pch out (dBm): -15.82
actual pch out (dBm): -15.81
Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås)
type_variety: openroadm_mw_mw_preamp_worstcase_ver5
effective gain(dB): 17.82
@@ -182,10 +200,12 @@ Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås)
Delta_P (dB): 0.00
target pch (dBm): 2.00
effective pch (dBm): 2.00
actual pch out (dBm): 2.01
output VOA (dB): 0.00
Roadm roadm_Borås
effective loss (dB): 22.00
pch out (dBm): -20.00
effective loss (dB): 22.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Edfa Edfa_booster_roadm_Borås_to_fiber (Borås → Gothenburg)
type_variety: openroadm_mw_mw_booster
effective gain(dB): 22.00
@@ -198,6 +218,7 @@ Edfa Edfa_booster_roadm_Borås_to_fiber (Borås → Gothenburg)
Delta_P (dB): 0.00
target pch (dBm): 2.00
effective pch (dBm): 2.00
actual pch out (dBm): 2.00
output VOA (dB): 0.00
Fiber fiber (Borås → Gothenburg)
type_variety: SSMF
@@ -206,7 +227,8 @@ Fiber fiber (Borås → Gothenburg)
total loss (dB): 13.53
(includes conn loss (dB) in: 0.00 out: 0.00)
(conn loss out includes EOL margin defined in eqpt_config.json)
pch out (dBm): -11.53
reference pch out (dBm): -11.53
actual pch out (dBm): -11.52
Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg)
type_variety: openroadm_mw_mw_preamp_worstcase_ver5
effective gain(dB): 13.53
@@ -219,17 +241,20 @@ Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg)
Delta_P (dB): 0.00
target pch (dBm): 2.00
effective pch (dBm): 2.00
actual pch out (dBm): 2.02
output VOA (dB): 0.00
Roadm roadm_Gothenburg
effective loss (dB): 22.00
pch out (dBm): -20.00
effective loss (dB): 22.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Transceiver trx_Gothenburg
GSNR (0.1nm, dB): 19.27
GSNR (signal bw, dB): 15.24
OSNR ASE (0.1nm, dB): 21.84
OSNR ASE (signal bw, dB): 17.82
CD (ps/nm): 8350.42
PMD (ps): 0.89
PMD (ps): 7.99
PDL (dB): 3.74
Transmission result for input power = 2.00 dBm:
Final GSNR (0.1 nm): 19.27 dB

View File

@@ -146,7 +146,7 @@ req id demand GSNR@bandwidth A-Z (Z-A) GSNR@0
0 trx Lorient_KMA to trx Vannes_KBE : 24.83 28.92 14 mode 1 100.0 1 (-284,4)
1 trx Brest_KLA to trx Vannes_KBE : 17.75 21.83 14 mode 1 200.0 2 (-272,8)
3 trx Lannion_CAS to trx Rennes_STA : 22.21 26.29 13 mode 1 60.0 1 (-284,4)
4 trx Rennes_STA to trx Lannion_CAS : 16.07 23.29 17 mode 2 150.0 1 (-258,6)
4 trx Rennes_STA to trx Lannion_CAS : 16.06 23.29 17 mode 2 150.0 1 (-258,6)
5 trx Rennes_STA to trx Lannion_CAS : 20.31 27.54 17 mode 2 20.0 1 (-274,6)
7 | 6 trx Lannion_CAS to trx Lorient_KMA : 19.52 23.61 14 mode 1 700.0 7 (-224,28)
7b trx Lannion_CAS to trx Lorient_KMA : 19.61 23.69 14 mode 1 400.0 4 (-172,24)

View File

@@ -0,0 +1,100 @@
User input for spectrum used for propagation instead of SI
There are 76 channels propagating
Power mode is set to True
=> 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
Now propagating between trx Lannion_CAS and trx Lorient_KMA:
Propagating with input power = 0.00 dBm:
Transceiver trx Lannion_CAS
GSNR (0.1nm, dB): 40.00
GSNR (signal bw, dB): 35.92
OSNR ASE (0.1nm, dB): 40.00
OSNR ASE (signal bw, dB): 35.92
CD (ps/nm): 0.00
PMD (ps): 0.00
PDL (dB): 0.00
Roadm roadm Lannion_CAS
effective loss (dB): 20.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Edfa east edfa in Lannion_CAS to Corlay
type_variety: std_medium_gain
effective gain(dB): 21.00
(before att_in and before output VOA)
noise figure (dB): 6.36
(including att_in)
pad att_in (dB): 0.00
Power In (dBm): -1.19
Power Out (dBm): 19.82
Delta_P (dB): 1.00
target pch (dBm): 1.00
effective pch (dBm): 1.00
actual pch out (dBm): 1.01
output VOA (dB): 0.00
Fiber fiber (Lannion_CAS → Corlay)-F061
type_variety: SSMF
length (km): 20.00
pad att_in (dB): 0.00
total loss (dB): 4.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): -3.00
actual pch out (dBm): -2.99
Fused west fused spans in Corlay
loss (dB): 1.00
Fiber fiber (Corlay → Loudeac)-F010
type_variety: SSMF
length (km): 50.00
pad att_in (dB): 0.00
total loss (dB): 10.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): -14.00
actual pch out (dBm): -13.99
Fused west fused spans in Loudeac
loss (dB): 1.00
Fiber fiber (Loudeac → Lorient_KMA)-F054
type_variety: SSMF
length (km): 60.00
pad att_in (dB): 0.00
total loss (dB): 12.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): -27.00
actual pch out (dBm): -26.99
Edfa west edfa in Lorient_KMA to Loudeac
type_variety: std_high_gain
effective gain(dB): 28.00
(before att_in and before output VOA)
noise figure (dB): 5.92
(including att_in)
pad att_in (dB): 0.00
Power In (dBm): -8.18
Power Out (dBm): 19.85
Delta_P (dB): 1.00
target pch (dBm): 1.00
effective pch (dBm): 1.00
actual pch out (dBm): 1.05
output VOA (dB): 0.00
Roadm roadm Lorient_KMA
effective loss (dB): 21.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Transceiver trx Lorient_KMA
GSNR (0.1nm, dB): 23.61
GSNR (signal bw, dB): 19.52
OSNR ASE (0.1nm, dB): 23.89
OSNR ASE (signal bw, dB): 19.81
CD (ps/nm): 2171.00
PMD (ps): 0.46
PDL (dB): 0.00
Transmission result for input power = 0.00 dBm:
Final GSNR (0.1 nm): 23.61 dB
(No source node specified: picked trx Lannion_CAS)
(No destination node specified: picked trx Lorient_KMA)

View File

@@ -0,0 +1,163 @@
User input for spectrum used for propagation instead of SI
There are 60 channels propagating
Power mode is set to True
=> 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
Now propagating between trx Lannion_CAS and trx Lorient_KMA:
Propagating with input power = 0.00 dBm:
Transceiver trx Lannion_CAS
GSNR (0.1nm, dB): mode_1: 40.00, mode_2: 40.00
GSNR (signal bw, dB): mode_1: 35.92, mode_2: 32.91
OSNR ASE (0.1nm, dB): mode_1: 40.00, mode_2: 40.00
OSNR ASE (signal bw, dB): mode_1: 35.92, mode_2: 32.91
CD (ps/nm): 0.00
PMD (ps): 0.00
PDL (dB): 0.00
Roadm roadm Lannion_CAS
effective loss (dB): 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
type_variety: std_medium_gain
effective gain(dB): 21.00
(before att_in and before output VOA)
noise figure (dB): 6.36
(including att_in)
pad att_in (dB): 0.00
Power In (dBm): -2.22
Power Out (dBm): 18.79
Delta_P (dB): 1.00
target pch (dBm): 1.00
effective pch (dBm): 1.00
actual pch out (dBm): mode_1: 1.01, mode_2: 1.02
output VOA (dB): 0.00
Fiber fiber (Lannion_CAS → Corlay)-F061
type_variety: SSMF
length (km): 20.00
pad att_in (dB): 0.00
total loss (dB): 4.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): -3.00
actual pch out (dBm): mode_1: -2.99, mode_2: -2.98
Fused west fused spans in Corlay
loss (dB): 1.00
Fiber fiber (Corlay → Loudeac)-F010
type_variety: SSMF
length (km): 50.00
pad att_in (dB): 0.00
total loss (dB): 10.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): -14.00
actual pch out (dBm): mode_1: -13.99, mode_2: -13.98
Fused west fused spans in Loudeac
loss (dB): 1.00
Fiber fiber (Loudeac → Lorient_KMA)-F054
type_variety: SSMF
length (km): 60.00
pad att_in (dB): 0.00
total loss (dB): 12.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): -27.00
actual pch out (dBm): mode_1: -26.99, mode_2: -26.98
Edfa west edfa in Lorient_KMA to Loudeac
type_variety: std_high_gain
effective gain(dB): 28.00
(before att_in and before output VOA)
noise figure (dB): 5.92
(including att_in)
pad att_in (dB): 0.00
Power In (dBm): -9.21
Power Out (dBm): 18.84
Delta_P (dB): 1.00
target pch (dBm): 1.00
effective pch (dBm): 1.00
actual pch out (dBm): mode_1: 1.04, mode_2: 1.09
output VOA (dB): 0.00
Roadm roadm Lorient_KMA
effective loss (dB): 21.00
reference pch out (dBm): -20.00
actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
Transceiver trx Lorient_KMA
GSNR (0.1nm, dB): mode_1: 23.65, mode_2: 23.81
GSNR (signal bw, dB): mode_1: 19.57, mode_2: 16.72
OSNR ASE (0.1nm, dB): mode_1: 23.91, mode_2: 23.87
OSNR ASE (signal bw, dB): mode_1: 19.83, mode_2: 16.78
CD (ps/nm): 2171.00
PMD (ps): 0.46
PDL (dB): 0.00
Transmission result for input power = 0.00 dBm:
Final GSNR (0.1 nm): 23.72 dB
The GSNR per channel at the end of the line is:
Ch. # Channel frequency (THz) Channel power (dBm) OSNR ASE (signal bw, dB) SNR NLI (signal bw, dB) GSNR (signal bw, dB)
1 191.40000 -20.04 19.85 33.30 19.65
2 191.45000 -20.04 19.85 32.70 19.63
3 191.50000 -20.04 19.84 32.45 19.61
4 191.55000 -20.04 19.84 32.29 19.60
5 191.60000 -20.04 19.84 32.18 19.60
6 191.65000 -20.04 19.84 32.10 19.59
7 191.70000 -20.04 19.84 32.03 19.59
8 191.75000 -20.04 19.84 31.98 19.58
9 191.80000 -20.04 19.84 31.93 19.58
10 191.85000 -20.04 19.84 31.90 19.57
11 191.90000 -20.04 19.84 31.86 19.57
12 191.95000 -20.04 19.84 31.84 19.57
13 192.00000 -20.04 19.83 31.82 19.57
14 192.05000 -20.04 19.83 31.80 19.57
15 192.10000 -20.04 19.83 31.78 19.56
16 192.15000 -20.04 19.83 31.77 19.56
17 192.20000 -20.04 19.83 31.76 19.56
18 192.25000 -20.04 19.83 31.75 19.56
19 192.30000 -20.04 19.83 31.75 19.56
20 192.35000 -20.04 19.83 31.75 19.56
21 192.40000 -20.05 19.83 31.75 19.56
22 192.45000 -20.05 19.82 31.75 19.55
23 192.50000 -20.05 19.82 31.76 19.55
24 192.55000 -20.05 19.82 31.76 19.55
25 192.60000 -20.05 19.82 31.78 19.55
26 192.65000 -20.05 19.82 31.79 19.55
27 192.70000 -20.05 19.82 31.81 19.55
28 192.75000 -20.05 19.82 31.83 19.55
29 192.80000 -20.05 19.82 31.86 19.55
30 192.85000 -20.05 19.82 31.90 19.56
31 192.90000 -20.04 19.82 31.95 19.56
32 192.95000 -20.04 19.81 32.02 19.56
33 193.00000 -20.04 19.81 32.11 19.56
34 193.05000 -20.04 19.81 32.27 19.57
35 193.10000 -20.04 19.81 32.61 19.59
36 193.16250 -20.09 16.80 33.70 16.71
37 193.23750 -20.09 16.80 34.20 16.72
38 193.31250 -20.09 16.80 34.45 16.72
39 193.38750 -20.09 16.79 34.62 16.72
40 193.46250 -20.09 16.79 34.75 16.72
41 193.53750 -20.09 16.79 34.85 16.72
42 193.61250 -20.09 16.79 34.94 16.72
43 193.68750 -20.09 16.79 35.02 16.72
44 193.76250 -20.09 16.79 35.08 16.72
45 193.83750 -20.09 16.78 35.15 16.72
46 193.91250 -20.09 16.78 35.20 16.72
47 193.98750 -20.09 16.78 35.26 16.72
48 194.06250 -20.09 16.78 35.31 16.72
49 194.13750 -20.09 16.78 35.36 16.72
50 194.21250 -20.09 16.78 35.41 16.72
51 194.28750 -20.09 16.78 35.47 16.72
52 194.36250 -20.09 16.77 35.52 16.72
53 194.43750 -20.09 16.77 35.58 16.72
54 194.51250 -20.09 16.77 35.65 16.71
55 194.58750 -20.09 16.77 35.72 16.71
56 194.66250 -20.09 16.77 35.81 16.71
57 194.73750 -20.09 16.77 35.92 16.71
58 194.81250 -20.09 16.76 36.06 16.71
59 194.88750 -20.09 16.76 36.27 16.71
60 194.96250 -20.09 16.76 36.75 16.72
(No source node specified: picked trx Lannion_CAS)
(No destination node specified: picked trx Lorient_KMA)

View File

@@ -14,6 +14,7 @@ Transceiver Site_A
OSNR ASE (signal bw, dB): 35.92
CD (ps/nm): 0.00
PMD (ps): 0.00
PDL (dB): 0.00
Fiber Span1
type_variety: SSMF
length (km): 80.00
@@ -21,7 +22,8 @@ Fiber Span1
total loss (dB): 17.00
(includes conn loss (dB) in: 0.50 out: 0.50)
(conn loss out includes EOL margin defined in eqpt_config.json)
pch out (dBm): -17.00
reference pch out (dBm): -17.00
actual pch out (dBm): -17.00
Edfa Edfa1
type_variety: std_low_gain
effective gain(dB): 15.00
@@ -34,6 +36,7 @@ Edfa Edfa1
Delta_P (dB): -2.00
target pch (dBm): -2.00
effective pch (dBm): -2.00
actual pch out (dBm): -1.99
output VOA (dB): 0.00
Transceiver Site_B
GSNR (0.1nm, dB): 31.17
@@ -42,6 +45,7 @@ Transceiver Site_B
OSNR ASE (signal bw, dB): 29.21
CD (ps/nm): 1336.00
PMD (ps): 0.36
PDL (dB): 0.00
Transmission result for input power = 0.00 dBm:
Final GSNR (0.1 nm): 31.17 dB

View File

@@ -14,6 +14,7 @@ Transceiver Site_A
OSNR ASE (signal bw, dB): 35.92
CD (ps/nm): 0.00
PMD (ps): 0.00
PDL (dB): 0.00
RamanFiber Span1
type_variety: SSMF
length (km): 80.00
@@ -21,109 +22,114 @@ RamanFiber Span1
total loss (dB): 17.00
(includes conn loss (dB) in: 0.50 out: 0.50)
(conn loss out includes EOL margin defined in eqpt_config.json)
pch out (dBm): -7.74
reference pch out (dBm): -7.77
actual pch out (dBm): -8.03
Fused Fused1
loss (dB): 0.00
Edfa Edfa1
type_variety: std_low_gain
effective gain(dB): 5.74
effective gain(dB): 5.77
(before att_in and before output VOA)
noise figure (dB): 13.26
noise figure (dB): 13.23
(including att_in)
pad att_in (dB): 2.26
Power In (dBm): 11.07
Power Out (dBm): 16.82
pad att_in (dB): 2.23
Power In (dBm): 11.04
Power Out (dBm): 16.81
Delta_P (dB): -2.00
target pch (dBm): -2.00
effective pch (dBm): -2.00
actual pch out (dBm): -2.26
output VOA (dB): 0.00
Transceiver Site_B
GSNR (0.1nm, dB): 31.43
GSNR (signal bw, dB): 27.35
OSNR ASE (0.1nm, dB): 34.18
OSNR ASE (signal bw, dB): 30.10
GSNR (0.1nm, dB): 31.44
GSNR (signal bw, dB): 27.36
OSNR ASE (0.1nm, dB): 34.21
OSNR ASE (signal bw, dB): 30.13
CD (ps/nm): 1336.00
PMD (ps): 0.36
PDL (dB): 0.00
Transmission result for input power = 0.00 dBm:
Final GSNR (0.1 nm): 31.43 dB
Final GSNR (0.1 nm): 31.44 dB
The GSNR per channel at the end of the line is:
Ch. # Channel frequency (THz) Channel power (dBm) OSNR ASE (signal bw, dB) SNR NLI (signal bw, dB) GSNR (signal bw, dB)
1 191.35 0.21 31.56 31.47 28.50
2 191.40 0.17 31.54 31.38 28.45
3 191.45 0.14 31.52 31.30 28.40
4 191.50 0.10 31.50 31.22 28.34
5 191.55 0.04 31.47 31.14 28.29
6 191.60 -0.02 31.44 31.06 28.23
7 191.65 -0.08 31.41 30.98 28.18
8 191.70 -0.14 31.37 30.90 28.12
9 191.75 -0.20 31.34 30.83 28.07
10 191.80 -0.26 31.31 30.75 28.01
11 191.85 -0.33 31.27 30.68 27.96
12 191.90 -0.39 31.24 30.61 27.90
13 191.95 -0.46 31.20 30.54 27.85
14 192.00 -0.52 31.17 30.47 27.79
15 192.05 -0.59 31.13 30.40 27.74
16 192.10 -0.66 31.10 30.33 27.69
17 192.15 -0.72 31.06 30.26 27.63
18 192.20 -0.79 31.02 30.20 27.58
19 192.25 -0.86 30.98 30.21 27.57
20 192.30 -0.94 30.94 30.21 27.55
21 192.35 -1.01 30.90 30.22 27.54
22 192.40 -1.09 30.86 30.23 27.52
23 192.45 -1.16 30.81 30.23 27.50
24 192.50 -1.24 30.77 30.24 27.49
25 192.55 -1.31 30.73 30.25 27.47
26 192.60 -1.38 30.69 30.25 27.46
27 192.65 -1.45 30.65 30.26 27.44
28 192.70 -1.52 30.61 30.27 27.42
29 192.75 -1.59 30.56 30.28 27.41
30 192.80 -1.66 30.52 30.28 27.39
31 192.85 -1.73 30.48 30.29 27.37
32 192.90 -1.80 30.44 30.30 27.36
33 192.95 -1.87 30.39 30.30 27.34
34 193.00 -1.94 30.35 30.31 27.32
35 193.05 -2.01 30.31 30.32 27.30
36 193.10 -2.08 30.27 30.33 27.29
37 193.15 -2.15 30.22 30.33 27.27
38 193.20 -2.22 30.18 30.35 27.25
39 193.25 -2.29 30.14 30.37 27.24
40 193.30 -2.36 30.09 30.39 27.23
41 193.35 -2.43 30.05 30.40 27.21
42 193.40 -2.49 30.01 30.42 27.20
43 193.45 -2.56 29.96 30.44 27.18
44 193.50 -2.63 29.92 30.46 27.17
45 193.55 -2.70 29.87 30.47 27.15
46 193.60 -2.78 29.83 30.49 27.13
47 193.65 -2.85 29.78 30.51 27.12
48 193.70 -2.92 29.73 30.53 27.10
49 193.75 -2.99 29.68 30.54 27.08
50 193.80 -3.06 29.64 30.56 27.06
51 193.85 -3.14 29.59 30.58 27.05
52 193.90 -3.21 29.54 30.60 27.03
53 193.95 -3.28 29.49 30.62 27.01
54 194.00 -3.35 29.44 30.64 26.99
55 194.05 -3.42 29.39 30.65 26.97
56 194.10 -3.50 29.34 30.67 26.95
57 194.15 -3.57 29.29 30.73 26.94
58 194.20 -3.64 29.24 30.79 26.94
59 194.25 -3.72 29.19 30.85 26.93
60 194.30 -3.79 29.14 30.91 26.93
61 194.35 -3.86 29.09 30.97 26.92
62 194.40 -3.93 29.04 31.03 26.91
63 194.45 -4.01 28.99 31.09 26.90
64 194.50 -4.08 28.94 31.15 26.90
65 194.55 -4.14 28.89 31.22 26.89
66 194.60 -4.21 28.85 31.28 26.88
67 194.65 -4.28 28.80 31.35 26.88
68 194.70 -4.34 28.75 31.41 26.87
69 194.75 -4.41 28.70 31.48 26.86
70 194.80 -4.47 28.66 31.55 26.86
71 194.85 -4.54 28.61 31.62 26.85
72 194.90 -4.60 28.56 31.69 26.84
73 194.95 -4.67 28.51 31.77 26.83
74 195.00 -4.73 28.47 31.84 26.82
75 195.05 -4.80 28.42 31.91 26.81
76 195.10 -4.86 28.37 31.91 26.78
1 191.35000 0.21 31.62 31.43 28.52
2 191.40000 0.17 31.60 31.35 28.46
3 191.45000 0.13 31.58 31.26 28.41
4 191.50000 0.09 31.56 31.18 28.36
5 191.55000 0.03 31.53 31.10 28.30
6 191.60000 -0.02 31.50 31.02 28.24
7 191.65000 -0.08 31.46 30.94 28.19
8 191.70000 -0.14 31.43 30.87 28.13
9 191.75000 -0.20 31.40 30.79 28.08
10 191.80000 -0.27 31.37 30.72 28.02
11 191.85000 -0.33 31.33 30.65 27.97
12 191.90000 -0.40 31.29 30.58 27.91
13 191.95000 -0.46 31.26 30.51 27.86
14 192.00000 -0.53 31.22 30.44 27.80
15 192.05000 -0.59 31.18 30.37 27.75
16 192.10000 -0.66 31.15 30.30 27.69
17 192.15000 -0.73 31.11 30.24 27.64
18 192.20000 -0.80 31.07 30.17 27.59
19 192.25000 -0.86 31.03 30.18 27.57
20 192.30000 -0.94 30.99 30.19 27.56
21 192.35000 -1.02 30.94 30.20 27.54
22 192.40000 -1.09 30.90 30.20 27.53
23 192.45000 -1.17 30.86 30.21 27.51
24 192.50000 -1.24 30.81 30.22 27.50
25 192.55000 -1.31 30.77 30.23 27.48
26 192.60000 -1.38 30.73 30.23 27.46
27 192.65000 -1.45 30.69 30.24 27.45
28 192.70000 -1.52 30.65 30.25 27.43
29 192.75000 -1.59 30.60 30.26 27.42
30 192.80000 -1.67 30.56 30.27 27.40
31 192.85000 -1.74 30.52 30.27 27.38
32 192.90000 -1.81 30.47 30.28 27.37
33 192.95000 -1.88 30.43 30.29 27.35
34 193.00000 -1.95 30.39 30.30 27.33
35 193.05000 -2.02 30.34 30.30 27.31
36 193.10000 -2.08 30.30 30.31 27.30
37 193.15000 -2.15 30.26 30.32 27.28
38 193.20000 -2.22 30.21 30.34 27.26
39 193.25000 -2.29 30.17 30.36 27.25
40 193.30000 -2.36 30.13 30.37 27.24
41 193.35000 -2.43 30.08 30.39 27.22
42 193.40000 -2.50 30.04 30.41 27.21
43 193.45000 -2.56 29.99 30.43 27.19
44 193.50000 -2.63 29.95 30.44 27.18
45 193.55000 -2.70 29.90 30.46 27.16
46 193.60000 -2.78 29.85 30.48 27.15
47 193.65000 -2.85 29.80 30.50 27.13
48 193.70000 -2.92 29.76 30.52 27.11
49 193.75000 -2.99 29.71 30.54 27.09
50 193.80000 -3.06 29.66 30.55 27.07
51 193.85000 -3.14 29.61 30.57 27.06
52 193.90000 -3.21 29.56 30.59 27.04
53 193.95000 -3.28 29.52 30.61 27.02
54 194.00000 -3.35 29.47 30.63 27.00
55 194.05000 -3.42 29.42 30.65 26.98
56 194.10000 -3.50 29.37 30.67 26.96
57 194.15000 -3.57 29.32 30.72 26.95
58 194.20000 -3.64 29.26 30.78 26.95
59 194.25000 -3.72 29.21 30.84 26.94
60 194.30000 -3.79 29.16 30.90 26.94
61 194.35000 -3.86 29.11 30.96 26.93
62 194.40000 -3.93 29.06 31.02 26.92
63 194.45000 -4.01 29.01 31.09 26.91
64 194.50000 -4.08 28.96 31.15 26.91
65 194.55000 -4.14 28.91 31.21 26.90
66 194.60000 -4.21 28.86 31.28 26.90
67 194.65000 -4.27 28.82 31.34 26.89
68 194.70000 -4.34 28.77 31.41 26.88
69 194.75000 -4.41 28.72 31.48 26.88
70 194.80000 -4.47 28.67 31.55 26.87
71 194.85000 -4.54 28.63 31.62 26.86
72 194.90000 -4.60 28.58 31.69 26.85
73 194.95000 -4.67 28.53 31.76 26.84
74 195.00000 -4.73 28.48 31.84 26.83
75 195.05000 -4.80 28.43 31.91 26.82
76 195.10000 -4.86 28.38 31.91 26.79
(No source node specified: picked Site_A)

View File

@@ -0,0 +1,453 @@
There are 96 channels propagating
Power mode is set to True
=> it can be modified in eqpt_config.json - Span
There are 15 fiber spans over 1200 km between Site_A and Site_B
Now propagating between Site_A and Site_B:
Propagating with input power = 0.00 dBm:
Transceiver Site_A
GSNR (0.1nm, dB): 100.00
GSNR (signal bw, dB): 95.92
OSNR ASE (0.1nm, dB): 100.00
OSNR ASE (signal bw, dB): 95.92
CD (ps/nm): 0.00
PMD (ps): 0.00
PDL (dB): 0.00
Roadm roadm Site A
effective loss (dB): 20.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Edfa booster A
type_variety: std_medium_gain
effective gain(dB): 20.00
(before att_in and before output VOA)
noise figure (dB): 6.58
(including att_in)
pad att_in (dB): 0.00
Power In (dBm): -0.18
Power Out (dBm): 19.83
Delta_P (dB): 0.00
target pch (dBm): 0.00
effective pch (dBm): 0.00
actual pch out (dBm): 0.01
output VOA (dB): 0.00
Fiber Span1
type_variety: SSMF
length (km): 80.00
pad att_in (dB): 0.00
total loss (dB): 16.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): -16.00
actual pch out (dBm): -15.99
Edfa Edfa1
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
Power In (dBm): 3.84
Power Out (dBm): 19.84
Delta_P (dB): 0.00
target pch (dBm): 0.00
effective pch (dBm): 0.00
actual pch out (dBm): 0.02
output VOA (dB): 0.00
Fiber Span2
type_variety: SSMF
length (km): 80.00
pad att_in (dB): 0.00
total loss (dB): 16.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): -16.00
actual pch out (dBm): -15.98
Edfa Edfa2
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
Power In (dBm): 3.84
Power Out (dBm): 19.85
Delta_P (dB): 0.00
target pch (dBm): 0.00
effective pch (dBm): 0.00
actual pch out (dBm): 0.03
output VOA (dB): 0.00
Fiber Span3
type_variety: SSMF
length (km): 80.00
pad att_in (dB): 0.00
total loss (dB): 16.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): -16.00
actual pch out (dBm): -15.97
Edfa Edfa3
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
Power In (dBm): 3.85
Power Out (dBm): 19.86
Delta_P (dB): 0.00
target pch (dBm): 0.00
effective pch (dBm): 0.00
actual pch out (dBm): 0.04
output VOA (dB): 0.00
Fiber Span4
type_variety: SSMF
length (km): 80.00
pad att_in (dB): 0.00
total loss (dB): 16.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): -16.00
actual pch out (dBm): -15.96
Edfa Edfa4
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
Power In (dBm): 3.86
Power Out (dBm): 19.87
Delta_P (dB): 0.00
target pch (dBm): 0.00
effective pch (dBm): 0.00
actual pch out (dBm): 0.05
output VOA (dB): 0.00
Fiber Span5
type_variety: SSMF
length (km): 80.00
pad att_in (dB): 0.00
total loss (dB): 16.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): -16.00
actual pch out (dBm): -15.95
Edfa Edfa5
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
Power In (dBm): 3.87
Power Out (dBm): 19.88
Delta_P (dB): 0.00
target pch (dBm): 0.00
effective pch (dBm): 0.00
actual pch out (dBm): 0.06
output VOA (dB): 0.00
Roadm roadm Site C
effective loss (dB): 20.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Edfa booster C
type_variety: std_medium_gain
effective gain(dB): 20.00
(before att_in and before output VOA)
noise figure (dB): 6.58
(including att_in)
pad att_in (dB): 0.00
Power In (dBm): -0.18
Power Out (dBm): 19.83
Delta_P (dB): 0.00
target pch (dBm): 0.00
effective pch (dBm): 0.00
actual pch out (dBm): 0.01
output VOA (dB): 0.00
Fiber Span6
type_variety: SSMF
length (km): 80.00
pad att_in (dB): 0.00
total loss (dB): 16.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): -16.00
actual pch out (dBm): -15.99
Edfa Edfa6
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
Power In (dBm): 3.83
Power Out (dBm): 19.84
Delta_P (dB): 0.00
target pch (dBm): 0.00
effective pch (dBm): 0.00
actual pch out (dBm): 0.02
output VOA (dB): 0.00
Fiber Span7
type_variety: SSMF
length (km): 80.00
pad att_in (dB): 0.00
total loss (dB): 16.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): -16.00
actual pch out (dBm): -15.98
Edfa Edfa7
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
Power In (dBm): 3.84
Power Out (dBm): 19.85
Delta_P (dB): 0.00
target pch (dBm): 0.00
effective pch (dBm): 0.00
actual pch out (dBm): 0.03
output VOA (dB): 0.00
Fiber Span8
type_variety: SSMF
length (km): 80.00
pad att_in (dB): 0.00
total loss (dB): 16.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): -16.00
actual pch out (dBm): -15.97
Edfa Edfa8
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
Power In (dBm): 3.85
Power Out (dBm): 19.86
Delta_P (dB): 0.00
target pch (dBm): 0.00
effective pch (dBm): 0.00
actual pch out (dBm): 0.04
output VOA (dB): 0.00
Fiber Span9
type_variety: SSMF
length (km): 80.00
pad att_in (dB): 0.00
total loss (dB): 16.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): -16.00
actual pch out (dBm): -15.96
Edfa Edfa9
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
Power In (dBm): 3.86
Power Out (dBm): 19.87
Delta_P (dB): 0.00
target pch (dBm): 0.00
effective pch (dBm): 0.00
actual pch out (dBm): 0.05
output VOA (dB): 0.00
Fiber Span10
type_variety: SSMF
length (km): 80.00
pad att_in (dB): 0.00
total loss (dB): 16.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): -16.00
actual pch out (dBm): -15.95
Edfa Edfa10
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
Power In (dBm): 3.87
Power Out (dBm): 19.88
Delta_P (dB): 0.00
target pch (dBm): 0.00
effective pch (dBm): 0.00
actual pch out (dBm): 0.06
output VOA (dB): 0.00
Roadm roadm Site D
effective loss (dB): 20.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Edfa booster D
type_variety: std_medium_gain
effective gain(dB): 20.00
(before att_in and before output VOA)
noise figure (dB): 6.58
(including att_in)
pad att_in (dB): 0.00
Power In (dBm): -0.18
Power Out (dBm): 19.83
Delta_P (dB): 0.00
target pch (dBm): 0.00
effective pch (dBm): 0.00
actual pch out (dBm): 0.01
output VOA (dB): 0.00
Fiber Span11
type_variety: SSMF
length (km): 80.00
pad att_in (dB): 0.00
total loss (dB): 16.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): -16.00
actual pch out (dBm): -15.99
Edfa Edfa11
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
Power In (dBm): 3.83
Power Out (dBm): 19.84
Delta_P (dB): 0.00
target pch (dBm): 0.00
effective pch (dBm): 0.00
actual pch out (dBm): 0.02
output VOA (dB): 0.00
Fiber Span12
type_variety: SSMF
length (km): 80.00
pad att_in (dB): 0.00
total loss (dB): 16.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): -16.00
actual pch out (dBm): -15.98
Edfa Edfa12
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
Power In (dBm): 3.84
Power Out (dBm): 19.85
Delta_P (dB): 0.00
target pch (dBm): 0.00
effective pch (dBm): 0.00
actual pch out (dBm): 0.03
output VOA (dB): 0.00
Roadm roadm Site E
effective loss (dB): 20.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Edfa booster E
type_variety: std_medium_gain
effective gain(dB): 20.00
(before att_in and before output VOA)
noise figure (dB): 6.58
(including att_in)
pad att_in (dB): 0.00
Power In (dBm): -0.18
Power Out (dBm): 19.83
Delta_P (dB): 0.00
target pch (dBm): 0.00
effective pch (dBm): 0.00
actual pch out (dBm): 0.01
output VOA (dB): 0.00
Fiber Span13
type_variety: SSMF
length (km): 80.00
pad att_in (dB): 0.00
total loss (dB): 16.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): -16.00
actual pch out (dBm): -15.99
Edfa Edfa13
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
Power In (dBm): 3.83
Power Out (dBm): 19.84
Delta_P (dB): 0.00
target pch (dBm): 0.00
effective pch (dBm): 0.00
actual pch out (dBm): 0.02
output VOA (dB): 0.00
Fiber Span14
type_variety: SSMF
length (km): 80.00
pad att_in (dB): 0.00
total loss (dB): 16.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): -16.00
actual pch out (dBm): -15.98
Edfa Edfa14
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
Power In (dBm): 3.84
Power Out (dBm): 19.85
Delta_P (dB): 0.00
target pch (dBm): 0.00
effective pch (dBm): 0.00
actual pch out (dBm): 0.03
output VOA (dB): 0.00
Fiber Span15
type_variety: SSMF
length (km): 80.00
pad att_in (dB): 0.00
total loss (dB): 16.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): -16.00
actual pch out (dBm): -15.97
Edfa Edfa15
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
Power In (dBm): 3.85
Power Out (dBm): 19.86
Delta_P (dB): 0.00
target pch (dBm): 0.00
effective pch (dBm): 0.00
actual pch out (dBm): 0.04
output VOA (dB): 0.00
Roadm roadm Site B
effective loss (dB): 20.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Transceiver Site_B
GSNR (0.1nm, dB): 17.85
GSNR (signal bw, dB): 13.77
OSNR ASE (0.1nm, dB): 19.70
OSNR ASE (signal bw, dB): 15.62
CD (ps/nm): 20040.00
PMD (ps): 1.39
PDL (dB): 0.00
Transmission result for input power = 0.00 dBm:
Final GSNR (0.1 nm): 17.85 dB
(No source node specified: picked Site_A)
(No destination node specified: picked Site_B)

View File

@@ -250,9 +250,11 @@ Transceiver trx Lannion_CAS
OSNR ASE (signal bw, dB): 95.92
CD (ps/nm): 0.00
PMD (ps): 0.00
PDL (dB): 0.00
Roadm roadm Lannion_CAS
effective loss (dB): 23.00
pch out (dBm): -20.00
effective loss (dB): 23.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Edfa east edfa in Lannion_CAS to Corlay
type_variety: test
effective gain(dB): 21.18
@@ -265,6 +267,7 @@ Edfa east edfa in Lannion_CAS to Corlay
Delta_P (dB): 0.00
target pch (dBm): 3.00
effective pch (dBm): 1.18
actual pch out (dBm): 1.18
output VOA (dB): 0.00
Fiber fiber (Lannion_CAS → Corlay)-F061
type_variety: SSMF
@@ -273,7 +276,8 @@ Fiber fiber (Lannion_CAS → Corlay)-F061
total loss (dB): 4.00
(includes conn loss (dB) in: 0.00 out: 0.00)
(conn loss out includes EOL margin defined in eqpt_config.json)
pch out (dBm): -2.82
reference pch out (dBm): -2.82
actual pch out (dBm): -2.81
Fused west fused spans in Corlay
loss (dB): 1.00
Fiber fiber (Corlay → Loudeac)-F010
@@ -283,7 +287,8 @@ Fiber fiber (Corlay → Loudeac)-F010
total loss (dB): 10.00
(includes conn loss (dB) in: 0.00 out: 0.00)
(conn loss out includes EOL margin defined in eqpt_config.json)
pch out (dBm): -13.82
reference pch out (dBm): -13.82
actual pch out (dBm): -13.81
Fused west fused spans in Loudeac
loss (dB): 1.00
Fiber fiber (Loudeac → Lorient_KMA)-F054
@@ -293,23 +298,26 @@ Fiber fiber (Loudeac → Lorient_KMA)-F054
total loss (dB): 12.00
(includes conn loss (dB) in: 0.00 out: 0.00)
(conn loss out includes EOL margin defined in eqpt_config.json)
pch out (dBm): -26.82
reference pch out (dBm): -26.82
actual pch out (dBm): -26.81
Edfa west edfa in Lorient_KMA to Loudeac
type_variety: test
effective gain(dB): 28.00
effective gain(dB): 27.99
(before att_in and before output VOA)
noise figure (dB): 5.76
(including att_in)
pad att_in (dB): 0.00
Power In (dBm): -6.99
Power Out (dBm): 21.04
Power Out (dBm): 21.03
Delta_P (dB): -1.82
target pch (dBm): 1.18
effective pch (dBm): 1.18
effective pch (dBm): 1.17
actual pch out (dBm): 1.21
output VOA (dB): 0.00
Roadm roadm Lorient_KMA
effective loss (dB): 21.18
pch out (dBm): -20.00
effective loss (dB): 21.17
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Transceiver trx Lorient_KMA
GSNR (0.1nm, dB): 23.94
GSNR (signal bw, dB): 19.85
@@ -317,6 +325,7 @@ Transceiver trx Lorient_KMA
OSNR ASE (signal bw, dB): 20.20
CD (ps/nm): 2171.00
PMD (ps): 0.46
PDL (dB): 0.00
Transmission result for input power = 3.00 dBm:
Final GSNR (0.1 nm): 23.94 dB

6
tests/requirements.txt Normal file
View File

@@ -0,0 +1,6 @@
build>=0.10.0,<1
pytest>=6.2.5,<7
pandas>=1.3.5,<2
# flake v6 killed the --diff option
flake8>=5.0.4,<6

View File

@@ -6,7 +6,7 @@
from numpy import zeros, array
from gnpy.core.elements import Transceiver, Edfa
from gnpy.core.utils import automatic_fmax, lin2db, db2lin, merge_amplifier_restrictions
from gnpy.core.info import create_input_spectral_information, Pref
from gnpy.core.info import create_input_spectral_information, ReferenceCarrier
from gnpy.core.network import build_network
from gnpy.tools.json_io import load_network, load_equipment
from pathlib import Path
@@ -73,20 +73,21 @@ def si(nch_and_spacing, bw):
nb_channel, spacing = nch_and_spacing
f_min = 191.3e12
f_max = automatic_fmax(f_min, spacing, nb_channel)
return create_input_spectral_information(f_min, f_max, 0.15, bw, 1e-3, spacing)
return create_input_spectral_information(f_min=f_min, f_max=f_max, roll_off=0.15, baud_rate=bw, power=1e-3,
spacing=spacing, tx_osnr=40.0,
ref_carrier=ReferenceCarrier(baud_rate=32e9, slot_width=50e9))
@pytest.mark.parametrize("gain, nf_expected", [(10, 15), (15, 10), (25, 5.8)])
def test_variable_gain_nf(gain, nf_expected, setup_edfa_variable_gain, si):
"""=> unitary test for variable gain model Edfa._calc_nf() (and Edfa.interpol_params)"""
edfa = setup_edfa_variable_gain
frequencies = array([c.frequency for c in si.carriers])
pin = array([c.power.signal + c.power.nli + c.power.ase for c in si.carriers])
pin = pin / db2lin(gain)
baud_rates = array([c.baud_rate for c in si.carriers])
si.signal /= db2lin(gain)
si.nli /= db2lin(gain)
si.ase /= db2lin(gain)
edfa.operational.gain_target = gain
pref = Pref(0, -gain, lin2db(len(frequencies)))
edfa.interpol_params(frequencies, pin, baud_rates, pref)
si.pref = si.pref._replace(p_span0=0, p_spani=-gain)
edfa.interpol_params(si)
result = edfa.nf
assert pytest.approx(nf_expected, abs=0.01) == result[0]
@@ -95,23 +96,20 @@ def test_variable_gain_nf(gain, nf_expected, setup_edfa_variable_gain, si):
def test_fixed_gain_nf(gain, nf_expected, setup_edfa_fixed_gain, si):
"""=> unitary test for fixed gain model Edfa._calc_nf() (and Edfa.interpol_params)"""
edfa = setup_edfa_fixed_gain
frequencies = array([c.frequency for c in si.carriers])
pin = array([c.power.signal + c.power.nli + c.power.ase for c in si.carriers])
pin = pin / db2lin(gain)
baud_rates = array([c.baud_rate for c in si.carriers])
si.signal /= db2lin(gain)
si.nli /= db2lin(gain)
si.ase /= db2lin(gain)
edfa.operational.gain_target = gain
pref = Pref(0, -gain, lin2db(len(frequencies)))
edfa.interpol_params(frequencies, pin, baud_rates, pref)
si.pref = si.pref._replace(p_span0=0, p_spani=-gain)
edfa.interpol_params(si)
assert pytest.approx(nf_expected, abs=0.01) == edfa.nf[0]
def test_si(si, nch_and_spacing):
"""basic total power check of the channel comb generation"""
nb_channel = nch_and_spacing[0]
pin = array([c.power.signal + c.power.nli + c.power.ase for c in si.carriers])
p_tot = pin.sum()
expected_p_tot = si.carriers[0].power.signal * nb_channel
p_tot = sum(si.signal + si.ase + si.nli)
expected_p_tot = si.signal[0] * nb_channel
assert pytest.approx(expected_p_tot, abs=0.01) == p_tot
@@ -122,14 +120,13 @@ def test_compare_nf_models(gain, setup_edfa_variable_gain, si):
between gain_min and gain_flatmax some discrepancy is expected but target < 0.5dB
=> unitary test for Edfa._calc_nf (and Edfa.interpol_params)"""
edfa = setup_edfa_variable_gain
frequencies = array([c.frequency for c in si.carriers])
pin = array([c.power.signal + c.power.nli + c.power.ase for c in si.carriers])
pin = pin / db2lin(gain)
baud_rates = array([c.baud_rate for c in si.carriers])
si.signal /= db2lin(gain)
si.nli /= db2lin(gain)
si.ase /= db2lin(gain)
edfa.operational.gain_target = gain
# edfa is variable gain type
pref = Pref(0, -gain, lin2db(len(frequencies)))
edfa.interpol_params(frequencies, pin, baud_rates, pref)
si.pref = si.pref._replace(p_span0=0, p_spani=-gain)
edfa.interpol_params(si)
nf_model = edfa.nf[0]
# change edfa type variety to a polynomial
@@ -155,7 +152,7 @@ def test_compare_nf_models(gain, setup_edfa_variable_gain, si):
edfa = Edfa(**el_config)
# edfa is variable gain type
edfa.interpol_params(frequencies, pin, baud_rates, pref)
edfa.interpol_params(si)
nf_poly = edfa.nf[0]
print(nf_poly, nf_model)
assert pytest.approx(nf_model, abs=0.5) == nf_poly
@@ -183,21 +180,16 @@ def test_ase_noise(gain, si, setup_trx, bw):
si = span(si)
print(span)
frequencies = array([c.frequency for c in si.carriers])
pin = array([c.power.signal + c.power.nli + c.power.ase for c in si.carriers])
baud_rates = array([c.baud_rate for c in si.carriers])
pref = Pref(0, -gain, lin2db(len(frequencies)))
edfa.interpol_params(frequencies, pin, baud_rates, pref)
si.pref = si.pref._replace(p_span0=0, p_spani=-gain)
edfa.interpol_params(si)
nf = edfa.nf
print('nf', nf)
pin = lin2db(pin[0] * 1e3)
pin = lin2db((si.signal[0] + si.ase[0] + si.nli[0]) * 1e3)
osnr_expected = pin - nf[0] + 58
si = edfa(si)
print(edfa)
pout = array([c.power.signal for c in si.carriers])
pase = array([c.power.ase for c in si.carriers])
osnr = lin2db(pout[0] / pase[0]) - lin2db(12.5e9 / bw)
osnr = lin2db(si.signal[0] / si.ase[0]) - lin2db(12.5e9 / bw)
assert pytest.approx(osnr_expected, abs=0.01) == osnr
trx = setup_trx

588
tests/test_equalization.py Normal file
View File

@@ -0,0 +1,588 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: Esther Le Rouzic
# @Date: 2019-05-22
"""
@author: esther.lerouzic
checks that new equalization option give the same output as old one:
"""
from pathlib import Path
import pytest
from numpy.testing import assert_allclose, assert_array_equal, assert_raises
from numpy import array
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.elements import Roadm
from gnpy.core.info import create_input_spectral_information, Pref, create_arbitrary_spectral_information, \
ReferenceCarrier
from gnpy.core.equipment import trx_mode_params
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.topology.request import PathRequest, compute_constrained_path, propagate
TEST_DIR = Path(__file__).parent
EQPT_FILENAME = TEST_DIR / 'data/eqpt_config.json'
NETWORK_FILENAME = TEST_DIR / 'data/testTopology_expected.json'
@pytest.mark.parametrize('degree, equalization_type, target, expected_pch_out_dbm, expected_si',
[('east edfa in Lannion_CAS to Morlaix', 'target_pch_out_db', -20, -20, [-20, -20, -20, -20, -20]),
('east edfa in Lannion_CAS to Morlaix', 'target_psd_out_mWperGHz', 5e-4, -17.9588,
[-17.9588, -16.7778, -14.9485, -16.7778, -17.9588]),
('east edfa in Lannion_CAS to Morlaix', 'target_out_mWperSlotWidth', 3e-4, -18.2390,
[-19.4885, -18.2390, -16.4781, -18.2390, -19.4885]),
('east edfa in Lannion_CAS to Corlay', 'target_pch_out_db', -20, -16, [-16, -16, -16, -16, -16]),
('east edfa in Lannion_CAS to Corlay', 'target_psd_out_mWperGHz', 5e-4, -16, [-16, -16, -16, -16, -16]),
('east edfa in Lannion_CAS to Corlay', 'target_out_mWperSlotWidth', 5e-4, -16, [-16, -16, -16, -16, -16]),
('east edfa in Lannion_CAS to Stbrieuc', 'target_pch_out_db', -20, -17.16699,
[-17.16698771, -15.98599459, -14.15668776, -15.98599459, -17.16698771]),
('east edfa in Lannion_CAS to Stbrieuc', 'target_psd_out_mWperGHz', 5e-4, -17.16699,
[-17.16698771, -15.98599459, -14.15668776, -15.98599459, -17.16698771]),
('east edfa in Lannion_CAS to Stbrieuc', 'target_out_mWperSlotWidth', 5e-4, -17.16699,
[-17.16698771, -15.98599459, -14.15668776, -15.98599459, -17.16698771])])
@pytest.mark.parametrize('delta_pdb_per_channel', [[0, 0, 0, 0, 0], [1, 3, 0, -5, 0]])
def test_equalization_combination_degree(delta_pdb_per_channel, degree, equalization_type, target,
expected_pch_out_dbm, expected_si):
"""Check that ROADM correctly computes power of thr reference channel based on different
combination of equalization for ROADM and per degree
"""
roadm_config = {
"uid": "roadm Lannion_CAS",
"params": {
"per_degree_pch_out_db": {
"east edfa in Lannion_CAS to Corlay": -16
},
"per_degree_psd_out_mWperGHz": {
"east edfa in Lannion_CAS to Stbrieuc": 6e-4
},
equalization_type: target,
"add_drop_osnr": 38,
"pmd": 0,
"pdl": 0,
"restrictions": {
"preamp_variety_list": [],
"booster_variety_list": []
}
}
}
roadm = Roadm(**roadm_config)
frequency = 191e12 + array([0, 50e9, 150e9, 225e9, 275e9])
slot_width = array([37.5e9, 50e9, 75e9, 50e9, 37.5e9])
baud_rate = array([32e9, 42e9, 64e9, 42e9, 32e9])
signal = dbm2watt(array([-20.0, -18.0, -22.0, -25.0, -16.0]))
ref_carrier = ReferenceCarrier(baud_rate=32e9, slot_width=50e9)
pref = Pref(p_span0=0, p_spani=0, ref_carrier=ref_carrier)
si = create_arbitrary_spectral_information(frequency=frequency, slot_width=slot_width,
signal=signal, baud_rate=baud_rate, roll_off=0.15,
delta_pdb_per_channel=delta_pdb_per_channel,
tx_osnr=None, ref_power=pref)
to_json_before_propagation = {
'uid': 'roadm Lannion_CAS',
'type': 'Roadm',
'params': {
equalization_type: target,
'restrictions': {'preamp_variety_list': [], 'booster_variety_list': []},
'per_degree_pch_out_db': {
'east edfa in Lannion_CAS to Corlay': -16},
"per_degree_psd_out_mWperGHz": {
"east edfa in Lannion_CAS to Stbrieuc": 6e-4
}
},
'metadata': {'location': {'latitude': 0, 'longitude': 0, 'city': None, 'region': None}}
}
assert roadm.to_json == to_json_before_propagation
si = roadm(si, degree)
assert roadm.ref_pch_out_dbm == pytest.approx(expected_pch_out_dbm, rel=1e-4)
assert_allclose(expected_si, roadm.get_per_degree_power(degree, spectral_info=si), rtol=1e-3)
@pytest.mark.parametrize('equalization_type', ["target_psd_out_mWperGHz", "target_out_mWperSlotWidth"])
def test_wrong_element_config(equalization_type):
"""Check that 2 equalization correcty raise a config error
"""
roadm_config = {
"uid": "roadm Brest_KLA",
"params": {
"per_degree_pch_out_db": {},
"target_pch_out_db": -20,
equalization_type: 3.125e-4,
"add_drop_osnr": 38,
"pmd": 0,
"pdl": 0,
"restrictions": {
"preamp_variety_list": [],
"booster_variety_list": []
}
},
"metadata": {
"location": {
"city": "Brest_KLA",
"region": "RLD",
"latitude": 4.0,
"longitude": 0.0
}
}
}
with pytest.raises(ConfigurationError):
_ = Roadm(**roadm_config)
def test_merge_equalization():
"""Check that if equalization is not defined default one is correctly take and
else that it is not overwritten
"""
json_data = {
"elements": [{
"uid": "roadm Brest_KLA",
"type": "Roadm"}],
"connections": []
}
equipment = load_equipment(EQPT_FILENAME)
network = network_from_json(json_data, equipment)
roadm = [n for n in network.nodes()][0]
assert roadm.target_pch_out_dbm == -20
delattr(equipment['Roadm']['default'], 'target_pch_out_db')
setattr(equipment['Roadm']['default'], 'target_psd_out_mWperGHz', power_dbm_to_psd_mw_ghz(-20, 32e9))
# json_data is changed (type is popped from json_data with network_from_json_function). Create a new one:
json_data = {
"elements": [{
"uid": "roadm Brest_KLA",
"type": "Roadm"}],
"connections": []
}
network = network_from_json(json_data, equipment)
roadm = [n for n in network.nodes()][0]
assert roadm.target_pch_out_dbm is None
assert roadm.target_psd_out_mWperGHz == 3.125e-4
assert roadm.target_out_mWperSlotWidth is None
json_data = {
"elements": [{
"uid": "roadm Brest_KLA",
"type": "Roadm",
"params": {"target_pch_out_db": -18}}],
"connections": []
}
network = network_from_json(json_data, equipment)
roadm = [n for n in network.nodes()][0]
assert roadm.target_pch_out_dbm == -18
assert roadm.target_psd_out_mWperGHz is None
assert roadm.target_out_mWperSlotWidth is None
json_data = {
"elements": [{
"uid": "roadm Brest_KLA",
"type": "Roadm",
"params": {"target_psd_out_mWperGHz": 5e-4}}],
"connections": []
}
network = network_from_json(json_data, equipment)
roadm = [n for n in network.nodes()][0]
assert roadm.target_pch_out_dbm is None
assert roadm.target_psd_out_mWperGHz == 5e-4
assert roadm.target_out_mWperSlotWidth is None
json_data = {
"elements": [{
"uid": "roadm Brest_KLA",
"type": "Roadm",
"params": {"target_out_mWperSlotWidth": 3e-4}}],
"connections": []
}
network = network_from_json(json_data, equipment)
roadm = [n for n in network.nodes()][0]
assert roadm.target_pch_out_dbm is None
assert roadm.target_psd_out_mWperGHz is None
assert roadm.target_out_mWperSlotWidth == 3e-4
@pytest.mark.parametrize('target_out, delta_pdb_per_channel, correction',
[(-20, [0, 1, 3, 0.5, -2], [0, 0, 5, 5.5, 0]),
(-20, [0, 0, 0, 0, 0], [0, 0, 2, 5, 0]),
(-20, [-2, -2, -2, -2, -2], [0, 0, 0, 3, 0]),
(-20, [0, 2, -2, -5, 4], [0, 0, 0, 0, 0]),
(-25.5, [0, 1, 3, 0.5, -2], [0, 0, 0, 0, 0]), ])
def test_low_input_power(target_out, delta_pdb_per_channel, correction):
"""check that ROADM correctly equalizes on small examples, assumes p_span_0 = 0
case of power equalisation
"""
frequency = 191e12 + array([0, 50e9, 150e9, 225e9, 275e9])
slot_width = array([37.5e9, 50e9, 75e9, 50e9, 37.5e9])
baud_rate = array([32e9, 42e9, 64e9, 42e9, 32e9])
signal = dbm2watt(array([-20.0, -18.0, -22.0, -25.0, -16.0]))
target = target_out + array(delta_pdb_per_channel)
ref_carrier = ReferenceCarrier(baud_rate=32e9, slot_width=50e9)
pref = Pref(p_span0=0, p_spani=-20, ref_carrier=ref_carrier)
si = create_arbitrary_spectral_information(frequency=frequency, slot_width=slot_width,
signal=signal, baud_rate=baud_rate, roll_off=0.15,
delta_pdb_per_channel=delta_pdb_per_channel,
tx_osnr=None, ref_power=pref)
roadm_config = {
"uid": "roadm Brest_KLA",
"params": {
"per_degree_pch_out_db": {},
"target_pch_out_db": target_out,
"add_drop_osnr": 38,
"pmd": 0,
"pdl": 0,
"restrictions": {
"preamp_variety_list": [],
"booster_variety_list": []
}
},
"metadata": {
"location": {
"city": "Brest_KLA",
"region": "RLD",
"latitude": 4.0,
"longitude": 0.0
}
}
}
roadm = Roadm(**roadm_config)
si = roadm(si, 'toto')
assert_allclose(watt2dbm(si.signal), target - correction, rtol=1e-5)
# in other words check that if target is below input power, target is applied else power is unchanged
assert_allclose((watt2dbm(signal) >= target) * target + (watt2dbm(signal) < target) * watt2dbm(signal),
watt2dbm(si.signal), rtol=1e-5)
@pytest.mark.parametrize('target_out, delta_pdb_per_channel, correction',
[(3.125e-4,
[0, 0, 0, 0, 0],
[0, 0, 2 + lin2db(64 / 32), 5 + lin2db(42 / 32), 0]),
(3.125e-4,
[1, 3, 0, -5, 0],
[1, 1 + lin2db(42 / 32), 2 + lin2db(64 / 32), 0 + lin2db(42 / 32), 0]), ])
def test_2low_input_power(target_out, delta_pdb_per_channel, correction):
"""check that ROADM correctly equalizes on small examples, assumes p_span_0 = 0
case of PSD equalisation
"""
frequency = 191e12 + array([0, 50e9, 150e9, 225e9, 275e9])
slot_width = array([37.5e9, 50e9, 75e9, 50e9, 37.5e9])
baud_rate = array([32e9, 42e9, 64e9, 42e9, 32e9])
signal = dbm2watt(array([-20.0, -18.0, -22.0, -25.0, -16.0]))
target = psd2powerdbm(target_out, baud_rate) + array(delta_pdb_per_channel)
ref_carrier = ReferenceCarrier(baud_rate=32e9, slot_width=50e9)
pref = Pref(p_span0=0, p_spani=-20, ref_carrier=ref_carrier)
si = create_arbitrary_spectral_information(frequency=frequency, slot_width=slot_width,
signal=signal, baud_rate=baud_rate, roll_off=0.15,
delta_pdb_per_channel=delta_pdb_per_channel,
tx_osnr=None, ref_power=pref)
roadm_config = {
"uid": "roadm Brest_KLA",
"params": {
"per_degree_pch_out_db": {},
"target_psd_out_mWperGHz": target_out,
"add_drop_osnr": 38,
"pmd": 0,
"pdl": 0,
"restrictions": {
"preamp_variety_list": [],
"booster_variety_list": []
}
},
"metadata": {
"location": {
"city": "Brest_KLA",
"region": "RLD",
"latitude": 4.0,
"longitude": 0.0
}
}
}
roadm = Roadm(**roadm_config)
si = roadm(si, 'toto')
assert_allclose(watt2dbm(si.signal), target - correction, rtol=1e-5)
def net_setup(equipment):
""" 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 create_voyager_req(equipment, source, dest, bidir, nodes_list, loose_list, mode, spacing, power_dbm):
""" create the usual request list according to parameters
"""
params = {'request_id': 'test_request',
'source': source,
'bidir': bidir,
'destination': dest,
'trx_type': 'Voyager',
'trx_mode': mode,
'format': mode,
'spacing': spacing,
'nodes_list': nodes_list,
'loose_list': loose_list,
'path_bandwidth': 100.0e9,
'effective_freq_slot': None}
trx_params = trx_mode_params(equipment, params['trx_type'], params['trx_mode'], True)
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_max_from_si = params['f_max']
params['nb_channel'] = automatic_nch(f_min, f_max_from_si, params['spacing'])
return PathRequest(**params)
@pytest.mark.parametrize('power_dbm', [0, 1, -2, None])
@pytest.mark.parametrize('mode, slot_width', (['mode 1', 50e9], ['mode 2', 75e9]))
def test_initial_spectrum(mode, slot_width, power_dbm):
""" checks that propagation using the user defined spectrum identical to SI, gives same result as SI
"""
# first propagate without any req.initial_spectrum attribute
equipment = load_equipment(EQPT_FILENAME)
req = create_voyager_req(equipment, 'trx Brest_KLA', 'trx Vannes_KBE', False, ['trx Vannes_KBE'], ['STRICT'],
mode, slot_width, power_dbm)
network = net_setup(equipment)
path = compute_constrained_path(network, req)
infos_expected = propagate(path, req, equipment)
# then creates req.initial_spectrum attribute exactly corresponding to -spectrum option files
temp = [{
"f_min": 191.35e12 + slot_width,
"f_max": 196.15e12 - slot_width,
"baud_rate": req.baud_rate,
"slot_width": slot_width,
"roll_off": 0.15,
"tx_osnr": 40
}]
req.initial_spectrum = _spectrum_from_json(temp)
infos_actual = propagate(path, req, equipment)
print(infos_actual.frequency[0], infos_actual.frequency[-1])
print(infos_expected.frequency[0], infos_expected.frequency[-1])
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.slot_width, infos_actual.slot_width)
assert_array_equal(infos_expected.signal, infos_actual.signal)
assert_array_equal(infos_expected.nli, infos_actual.nli)
assert_array_equal(infos_expected.ase, infos_actual.ase)
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.pmd, infos_actual.pmd)
assert_array_equal(infos_expected.channel_number, infos_actual.channel_number)
assert_array_equal(infos_expected.number_of_channels, infos_actual.number_of_channels)
def test_initial_spectrum_not_identical():
""" checks that user defined spectrum overrides spectrum defined in SI
"""
# first propagate without any req.initial_spectrum attribute
equipment = load_equipment(EQPT_FILENAME)
req = create_voyager_req(equipment, 'trx Brest_KLA', 'trx Vannes_KBE', False, ['trx Vannes_KBE'], ['STRICT'],
'mode 1', 50e9, 0)
network = net_setup(equipment)
path = compute_constrained_path(network, req)
infos_expected = propagate(path, req, equipment)
# then creates req.initial_spectrum attribute exactly corresponding to -spectrum option files
temp = [{
"f_min": 191.4e12, # align f_min , f_max on Voyager f_min, f_mix and not SI !
"f_max": 196.1e12,
"baud_rate": 40e9,
"slot_width": 62.5e9,
"roll_off": 0.15,
"tx_osnr": 40
}]
req.initial_spectrum = _spectrum_from_json(temp)
infos_actual = propagate(path, req, equipment)
assert_raises(AssertionError, assert_array_equal, infos_expected.frequency, infos_actual.frequency)
assert_raises(AssertionError, assert_array_equal, infos_expected.baud_rate, infos_actual.baud_rate)
assert_raises(AssertionError, assert_array_equal, infos_expected.slot_width, infos_actual.slot_width)
assert_raises(AssertionError, assert_array_equal, infos_expected.signal, infos_actual.signal)
assert_raises(AssertionError, assert_array_equal, infos_expected.nli, infos_actual.nli)
assert_raises(AssertionError, assert_array_equal, infos_expected.ase, infos_actual.ase)
assert_raises(AssertionError, assert_array_equal, infos_expected.channel_number, infos_actual.channel_number)
assert_raises(AssertionError, assert_array_equal, infos_expected.number_of_channels, infos_actual.number_of_channels)
@pytest.mark.parametrize('equalization, target_value', [
('target_out_mWperSlotWidth', power_dbm_to_psd_mw_ghz(-20, 50e9)),
('target_psd_out_mWperGHz', power_dbm_to_psd_mw_ghz(-20, 32e9))])
@pytest.mark.parametrize('power_dbm', [0, 2, -0.5])
def test_target_psd_or_psw(power_dbm, equalization, target_value):
""" checks that if target_out_mWperSlotWidth or target_psd_out_mWperGHz is defined, it is used as equalization
and it gives same result if computed target is the same
"""
equipment = load_equipment(EQPT_FILENAME)
network = net_setup(equipment)
req = create_voyager_req(equipment, 'trx Brest_KLA', 'trx Vannes_KBE', False, ['trx Vannes_KBE'], ['STRICT'],
'mode 1', 50e9, power_dbm)
path = compute_constrained_path(network, req)
infos_expected = propagate(path, req, equipment)
# change default equalization to power spectral density
delattr(equipment['Roadm']['default'], 'target_pch_out_db')
setattr(equipment['Roadm']['default'], equalization, target_value)
# create a second instance with this roadm settings,
network2 = net_setup(equipment)
path2 = compute_constrained_path(network2, req)
infos_actual = propagate(path2, req, equipment)
# since baudrate is the same, resulting propagation should be the same as for power equalization
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.signal, infos_actual.signal)
assert_array_equal(infos_expected.nli, infos_actual.nli)
assert_array_equal(infos_expected.ase, infos_actual.ase)
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.pmd, infos_actual.pmd)
assert_array_equal(infos_expected.channel_number, infos_actual.channel_number)
assert_array_equal(infos_expected.number_of_channels, infos_actual.number_of_channels)
def ref_network():
""" Create a network instance with a instance of propagated path
"""
equipment = load_equipment(EQPT_FILENAME)
network = net_setup(equipment)
req0 = create_voyager_req(equipment, 'trx Brest_KLA', 'trx Vannes_KBE', False, ['trx Vannes_KBE'], ['STRICT'],
'mode 1', 50e9, 0)
path0 = compute_constrained_path(network, req0)
_ = propagate(path0, req0, equipment)
return network
@pytest.mark.parametrize('deltap', [0, +1.2, -0.5])
def test_target_psd_out_mwperghz_deltap(deltap):
""" checks that if target_psd_out_mWperGHz is defined, delta_p of amps is correctly updated
Power over 1.2dBm saturate amp with this test: TODO add a test on this saturation
"""
equipment = load_equipment(EQPT_FILENAME)
network = net_setup(equipment)
req = create_voyager_req(equipment, 'trx Brest_KLA', 'trx Vannes_KBE', False, ['trx Vannes_KBE'], ['STRICT'],
'mode 1', 50e9, deltap)
temp = [{
"f_min": 191.35e12, # align f_min , f_max on Voyager f_min, f_mix and not SI !
"f_max": 196.05e12,
"baud_rate": req.baud_rate,
"slot_width": 50e9,
"roll_off": 0.15,
"tx_osnr": 40
}]
req.initial_spectrum = _spectrum_from_json(temp)
path = compute_constrained_path(network, req)
_ = propagate(path, req, equipment)
# check that gain of booster is changed accordingly whereas gain of preamp and ila is not (no saturation case)
boosters = ['east edfa in Brest_KLA to Quimper', 'east edfa in Lorient_KMA to Vannes_KBE']
ila_preamps = ['east edfa in Quimper to Lorient_KMA', 'west edfa in Lorient_KMA to Quimper',
'west edfa in Vannes_KBE to Lorient_KMA']
for amp in boosters + ila_preamps:
expected_amp = next(n for n in ref_network() if n.uid == amp)
actual_amp = next(n for n in network.nodes() if n.uid == amp)
expected_gain = expected_amp.pout_db - expected_amp.pin_db
actual_gain = actual_amp.pout_db - actual_amp.pin_db
print(actual_amp)
if amp in boosters:
assert expected_gain + deltap == pytest.approx(actual_gain, rel=1e-3)
if amp in ila_preamps:
assert expected_gain == pytest.approx(actual_gain, rel=1e-3)
@pytest.mark.parametrize('equalization', ['target_psd_out_mWperGHz', 'target_out_mWperSlotWidth'])
@pytest.mark.parametrize('case', ['SI', 'nodes'])
@pytest.mark.parametrize('deltap', [0, +2, -0.5])
@pytest.mark.parametrize('target', [-20, -21, -18])
@pytest.mark.parametrize('mode, slot_width', (['mode 1', 50e9], ['mode 2', 75e9]))
def test_equalization(case, deltap, target, mode, slot_width, equalization):
"""check that power target on roadm is correct for these cases; check on booster
- SI : target_pch_out_db / target_psd_out_mWperGHz
- node : target_pch_out_db / target_psd_out_mWperGHz
- per degree : target_pch_out_db / target_psd_out_mWperGHz
for these cases with and without power from user
"""
equipment = load_equipment(EQPT_FILENAME)
setattr(equipment['Roadm']['default'], 'target_pch_out_db', target)
req = create_voyager_req(equipment, 'trx Brest_KLA', 'trx Rennes_STA', False,
['east edfa in Brest_KLA to Quimper', 'roadm Lannion_CAS', 'trx Rennes_STA'],
['STRICT', 'STRICT', 'STRICT'],
mode, slot_width, deltap)
roadms = ['roadm Brest_KLA', 'roadm Lorient_KMA', 'roadm Lannion_CAS', 'roadm Rennes_STA']
# degree = {'roadm Brest_KLA': 'east edfa in Brest_KLA to Quimper',
# 'roadm Lorient_KMA': 'east edfa in Lorient_KMA to Loudeac'}
# boosters = ['east edfa in Brest_KLA to Quimper', 'east edfa in Lorient_KMA to Loudeac',
# 'east edfa in Lannion_CAS to Stbrieuc']
target_psd = power_dbm_to_psd_mw_ghz(target, 32e9)
ref = ReferenceCarrier(baud_rate=32e9, slot_width=50e9)
if case == 'SI':
delattr(equipment['Roadm']['default'], 'target_pch_out_db')
setattr(equipment['Roadm']['default'], equalization, target_psd)
network = net_setup(equipment)
elif case == 'nodes':
json_data = load_json(NETWORK_FILENAME)
for el in json_data['elements']:
if el['uid'] in roadms:
el['params'] = {equalization: target_psd}
network = network_from_json(json_data, 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)
# check that nodes not in roadms have target_pch_out_db not None
pw_roadms = [r for r in network.nodes() if r.uid not in roadms and isinstance(r, Roadm)]
for roadm in pw_roadms:
assert roadm.target_psd_out_mWperGHz is None
assert roadm.target_pch_out_dbm == target
for roadm in [r for r in network.nodes() if r.uid in roadms and isinstance(r, Roadm)]:
assert roadm.target_pch_out_dbm is None
assert getattr(roadm, equalization) == target_psd
path = compute_constrained_path(network, req)
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,
spacing=req.spacing, tx_osnr=req.tx_osnr, ref_carrier=ref)
for i, el in enumerate(path):
if isinstance(el, Roadm):
si = el(si, degree=path[i + 1].uid)
if case in ['SI', 'nodes', 'degrees']:
if equalization == 'target_psd_out_mWperGHz':
assert_allclose(power_dbm_to_psd_mw_ghz(watt2dbm(si.signal + si.ase + si.nli), si.baud_rate),
target_psd, rtol=1e-3)
if equalization == 'target_out_mWperSlotWidth':
assert_allclose(power_dbm_to_psd_mw_ghz(watt2dbm(si.signal + si.ase + si.nli), si.slot_width),
target_psd, rtol=1e-3)
else:
si = el(si)
print(el.uid)
@pytest.mark.parametrize('req_power', [0, 2, -1.5])
def test_power_option(req_power):
"""check that --po option adds correctly power with spectral information
"""
equipment = load_equipment(EQPT_FILENAME)
setattr(equipment['Roadm']['default'], 'target_pch_out_db', None)
setattr(equipment['Roadm']['default'], 'target_psd_out_mWperGHz', power_dbm_to_psd_mw_ghz(-20, 32e9))
network = net_setup(equipment)
req = create_voyager_req(equipment, 'trx Brest_KLA', 'trx Vannes_KBE', False, ['trx Vannes_KBE'], ['STRICT'],
'mode 1', 50e9, req_power)
path = compute_constrained_path(network, req)
infos_expected = propagate(path, req, equipment)
temp = [{
"f_min": 191.4e12, # align f_min , f_max on Voyager f_min, f_max and not SI !
"f_max": 196.1e12,
"baud_rate": req.baud_rate,
"slot_width": 50e9,
"roll_off": 0.15,
"tx_osnr": 40
}]
req.initial_spectrum = _spectrum_from_json(temp)
network2 = net_setup(equipment)
path2 = compute_constrained_path(network2, req)
infos_actual = propagate(path2, req, equipment)
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.signal, infos_actual.signal)
assert_array_equal(infos_expected.nli, infos_actual.nli)
assert_array_equal(infos_expected.ase, infos_actual.ase)
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.pmd, infos_actual.pmd)
assert_array_equal(infos_expected.channel_number, infos_actual.channel_number)
assert_array_equal(infos_expected.number_of_channels, infos_actual.number_of_channels)

59
tests/test_info.py Normal file
View File

@@ -0,0 +1,59 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import pytest
from numpy import array, zeros, ones
from numpy.testing import assert_array_equal
from gnpy.core.info import create_arbitrary_spectral_information, Pref
from gnpy.core.exceptions import SpectrumError
def test_create_arbitrary_spectral_information():
si = create_arbitrary_spectral_information(frequency=[193.25e12, 193.3e12, 193.35e12],
baud_rate=32e9, signal=[1, 1, 1],
delta_pdb_per_channel=[1, 1, 1],
tx_osnr=40.0,
ref_power=Pref(1, 1, None))
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.signal, ones(3))
assert_array_equal(si.nli, zeros(3))
assert_array_equal(si.ase, zeros(3))
assert_array_equal(si.delta_pdb_per_channel, ones(3))
assert_array_equal(si.roll_off, zeros(3))
assert_array_equal(si.chromatic_dispersion, zeros(3))
assert_array_equal(si.pmd, zeros(3))
assert_array_equal(si.channel_number, array([1, 2, 3]))
assert_array_equal(si.number_of_channels, 3)
assert_array_equal(si.df, array([[0, 50e9, 100e9], [-50e9, 0, 50e9], [-100e9, -50e9, 0]]))
assert_array_equal(si.tx_osnr, array([40.0, 40.0, 40.0]))
with pytest.raises(SpectrumError, match='Spectra cannot be summed: channels overlapping.'):
si += si
si = create_arbitrary_spectral_information(frequency=array([193.35e12, 193.3e12, 193.25e12]),
slot_width=array([50e9, 50e9, 50e9]),
baud_rate=32e9, signal=array([1, 2, 3]),
tx_osnr=40.0,
ref_power=Pref(1, 1, None))
assert_array_equal(si.signal, array([3, 2, 1]))
with pytest.raises(SpectrumError, match='Spectrum baud rate, including the roll off, '
r'larger than the slot width for channels: \[1, 3\].'):
create_arbitrary_spectral_information(frequency=[193.25e12, 193.3e12, 193.35e12], signal=1,
baud_rate=[64e9, 32e9, 64e9], slot_width=50e9,
tx_osnr=40.0,
ref_power=Pref(1, 1, None))
with pytest.raises(SpectrumError, match='Spectrum required slot widths larger than the frequency spectral '
r'distances between channels: \[\(1, 2\), \(3, 4\)\].'):
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, ref_power=Pref(1, 1, None))
with pytest.raises(SpectrumError, match='Spectrum required slot widths larger than the frequency spectral '
r'distances between channels: \[\(1, 2\), \(2, 3\)\].'):
create_arbitrary_spectral_information(frequency=[193.25e12, 193.3e12, 193.35e12], signal=1, baud_rate=49e9,
tx_osnr=40.0, roll_off=0.1, ref_power=Pref(1, 1, None))
with pytest.raises(SpectrumError,
match='Dimension mismatch in input fields.'):
create_arbitrary_spectral_information(frequency=[193.25e12, 193.3e12, 193.35e12], signal=[1, 2], baud_rate=49e9,
tx_osnr=40.0, ref_power=Pref(1, 1, None))

View File

@@ -20,7 +20,15 @@ SRC_ROOT = Path(__file__).parent.parent
['-e', 'gnpy/example-data/eqpt_config_openroadm_ver4.json', 'gnpy/example-data/Sweden_OpenROADMv4_example_network.json', ]),
('openroadm-v5-Stockholm-Gothenburg', transmission_main_example,
['-e', 'gnpy/example-data/eqpt_config_openroadm_ver5.json', 'gnpy/example-data/Sweden_OpenROADMv5_example_network.json', ]),
))
('transmission_main_example_long', transmission_main_example,
['-e', 'tests/data/eqpt_config.json', 'tests/data/test_long_network.json']),
('spectrum1_transmission_main_example', transmission_main_example,
['--spectrum', 'gnpy/example-data/initial_spectrum1.json', 'gnpy/example-data/meshTopologyExampleV2.xls', ]),
('spectrum2_transmission_main_example', transmission_main_example,
['--spectrum', 'gnpy/example-data/initial_spectrum2.json', 'gnpy/example-data/meshTopologyExampleV2.xls', '--show-channels', ]),
))
def test_example_invocation(capfd, output, handler, args):
'''Make sure that our examples produce useful output'''
os.chdir(SRC_ROOT)

View File

@@ -1,26 +1,23 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from pathlib import Path
"""
Checks that the class SimParams behaves as a mutable Singleton.
"""
import pytest
from gnpy.core.parameters import SimParams
from gnpy.core.science_utils import Simulation
from gnpy.tools.json_io import load_json
TEST_DIR = Path(__file__).parent
DATA_DIR = TEST_DIR / 'data'
@pytest.mark.usefixtures('set_sim_params')
def test_sim_parameters():
j = load_json(DATA_DIR / 'sim_params.json')
sim_params = SimParams(**j)
Simulation.set_params(sim_params)
s1 = Simulation.get_simulation()
assert s1.sim_params.raman_params.flag_raman
s2 = Simulation.get_simulation()
assert s2.sim_params.raman_params.flag_raman
j['raman_parameters']['flag_raman'] = False
sim_params = SimParams(**j)
Simulation.set_params(sim_params)
assert not s2.sim_params.raman_params.flag_raman
assert not s1.sim_params.raman_params.flag_raman
sim_params = {'nli_params': {}, 'raman_params': {}}
SimParams.set_params(sim_params)
s1 = SimParams.get()
assert s1.nli_params.method == 'gn_model_analytic'
s2 = SimParams.get()
assert not s1.raman_params.flag
sim_params['raman_params']['flag'] = True
SimParams.set_params(sim_params)
assert s2.raman_params.flag
assert s1.raman_params.flag

View File

@@ -21,7 +21,6 @@ import shutil
from pandas import read_csv
from xlrd import open_workbook
import pytest
from tests.compare import compare_networks, compare_services
from copy import deepcopy
from gnpy.core.utils import automatic_nch, lin2db
from gnpy.core.network import build_network
@@ -56,15 +55,7 @@ def test_excel_json_generation(tmpdir, xls_input, expected_json_output):
actual_json_output = xls_copy.with_suffix('.json')
actual = load_json(actual_json_output)
unlink(actual_json_output)
expected = load_json(expected_json_output)
results = compare_networks(expected, actual)
assert not results.elements.missing
assert not results.elements.extra
assert not results.elements.different
assert not results.connections.missing
assert not results.connections.extra
assert not results.connections.different
assert actual == load_json(expected_json_output)
# assume xls entries
# test that the build network gives correct results in gain mode
@@ -95,15 +86,7 @@ def test_auto_design_generation_fromxlsgainmode(tmpdir, xls_input, expected_json
save_network(network, actual_json_output)
actual = load_json(actual_json_output)
unlink(actual_json_output)
expected = load_json(expected_json_output)
results = compare_networks(expected, actual)
assert not results.elements.missing
assert not results.elements.extra
assert not results.elements.different
assert not results.connections.missing
assert not results.connections.extra
assert not results.connections.different
assert actual == load_json(expected_json_output)
# test that autodesign creates same file as an input file already autodesigned
@@ -134,15 +117,7 @@ def test_auto_design_generation_fromjson(tmpdir, json_input, power_mode):
save_network(network, actual_json_output)
actual = load_json(actual_json_output)
unlink(actual_json_output)
expected = load_json(json_input)
results = compare_networks(expected, actual)
assert not results.elements.missing
assert not results.elements.extra
assert not results.elements.different
assert not results.connections.missing
assert not results.connections.extra
assert not results.connections.different
assert actual == load_json(json_input)
# test services creation
@@ -162,15 +137,7 @@ def test_excel_service_json_generation(xls_input, expected_json_output):
equipment['SI']['default'].f_max, equipment['SI']['default'].spacing))
build_network(network, equipment, p_db, p_total_db)
from_xls = read_service_sheet(xls_input, equipment, network, network_filename=DATA_DIR / 'testTopology.xls')
expected = load_json(expected_json_output)
results = compare_services(expected, from_xls)
assert not results.requests.missing
assert not results.requests.extra
assert not results.requests.different
assert not results.synchronizations.missing
assert not results.synchronizations.extra
assert not results.synchronizations.different
assert from_xls == load_json(expected_json_output)
# TODO verify that requested bandwidth is not zero !
@@ -391,6 +358,7 @@ def test_excel_ila_constraints(source, destination, route_list, hoptype, expecte
'cost': None,
'roll_off': 0,
'tx_osnr': 0,
'penalties': None,
'min_spacing': None,
'nb_channel': 0,
'power': 0,
@@ -538,3 +506,71 @@ def test_eqpt_creation(tmpdir):
# check that all amp in the converted files corresponds to an eqpt line
for ampuid in jsonconverted.keys():
assert ampuid in possiblename
def test_service_json_constraint_order():
"""test that the constraints are read in correct order"""
unsorted_request = {
"request-id": "unsorted",
"source": "trx Brest_KLA",
"destination": "trx Vannes_KBE",
"src-tp-id": "trx Brest_KLA",
"dst-tp-id": "trx Vannes_KBE",
"bidirectional": False,
"path-constraints": {
"te-bandwidth": {
"technology": "flexi-grid",
"trx_type": "Voyager",
"trx_mode": "mode 1",
"spacing": 50000000000.0,
"output-power": 0.001,
"path_bandwidth": 10000000000.0
}
},
"explicit-route-objects": {
"route-object-include-exclude": [
{
"explicit-route-usage": "route-include-ero",
"index": 2,
"num-unnum-hop": {
"node-id": "roadm Lorient_KMA",
"link-tp-id": "link-tp-id is not used",
"hop-type": "STRICT"
}
},
{
"explicit-route-usage": "route-include-ero",
"index": 3,
"num-unnum-hop": {
"node-id": "roadm Vannes_KBE",
"link-tp-id": "link-tp-id is not used",
"hop-type": "STRICT"
}
},
{
"explicit-route-usage": "route-include-ero",
"index": 1,
"num-unnum-hop": {
"node-id": "roadm Lannion_CAS",
"link-tp-id": "link-tp-id is not used",
"hop-type": "LOOSE"
}
},
{
"explicit-route-usage": "route-include-ero",
"index": 0,
"num-unnum-hop": {
"node-id": "roadm Brest_KLA",
"link-tp-id": "link-tp-id is not used",
"hop-type": "STRICT"
}
}
]
}
}
data = {'path-request': [unsorted_request]}
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].loose_list == ['STRICT', 'LOOSE', 'STRICT', 'STRICT']

View File

@@ -6,7 +6,7 @@
import pytest
from gnpy.core.elements import Transceiver, Fiber, Edfa, Roadm
from gnpy.core.utils import db2lin
from gnpy.core.info import create_input_spectral_information
from gnpy.core.info import create_input_spectral_information, ReferenceCarrier
from gnpy.core.network import build_network
from gnpy.tools.json_io import load_network, load_equipment
from pathlib import Path
@@ -45,7 +45,9 @@ def propagation(input_power, con_in, con_out, dest):
p = input_power
p = db2lin(p) * 1e-3
spacing = 50e9 # THz
si = create_input_spectral_information(191.3e12, 191.3e12 + 79 * spacing, 0.15, 32e9, p, spacing)
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,
ref_carrier=ReferenceCarrier(baud_rate=32e9, slot_width=50e9))
source = next(transceivers[uid] for uid in transceivers if uid == 'trx A')
sink = next(transceivers[uid] for uid in transceivers if uid == dest)
path = dijkstra_path(network, source, sink)

View File

@@ -12,12 +12,14 @@ checks that restrictions in roadms are correctly applied during autodesign
from pathlib import Path
import pytest
from numpy.testing import assert_allclose
from gnpy.core.utils import lin2db, automatic_nch
from gnpy.core.elements import Fused, Roadm, Edfa
from gnpy.core.network import build_network
from gnpy.tools.json_io import network_from_json, load_equipment, load_json, Amp
from gnpy.core.equipment import trx_mode_params
from gnpy.topology.request import PathRequest, compute_constrained_path
from gnpy.topology.request import PathRequest, compute_constrained_path, ref_carrier
from gnpy.core.info import create_input_spectral_information
from gnpy.core.utils import db2lin
@@ -226,9 +228,9 @@ def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm):
prev_node['params'] = {'loss': 0}
json_network['elements'].append(prev_node)
network = network_from_json(json_network, equipment)
p_total_db = power_dbm + lin2db(automatic_nch(equipment['SI']['default'].f_min,
equipment['SI']['default'].f_max,
equipment['SI']['default'].spacing))
nb_channel = automatic_nch(equipment['SI']['default'].f_min, equipment['SI']['default'].f_max,
equipment['SI']['default'].spacing)
p_total_db = power_dbm + lin2db(nb_channel)
build_network(network, equipment, power_dbm, p_total_db)
@@ -243,6 +245,7 @@ def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm):
'format': '',
'path_bandwidth': 100e9,
'effective_freq_slot': None,
'nb_channel': nb_channel
}
trx_params = trx_mode_params(equipment)
params.update(trx_params)
@@ -250,14 +253,14 @@ def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm):
req.power = db2lin(power_dbm - 30)
path = compute_constrained_path(network, req)
si = create_input_spectral_information(
req.f_min, req.f_max, req.roll_off, req.baud_rate,
req.power, req.spacing)
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, ref_carrier=ref_carrier(equipment))
for i, el in enumerate(path):
if isinstance(el, Roadm):
carriers_power_in_roadm = min([c.power.signal + c.power.nli + c.power.ase for c in si.carriers])
power_in_roadm = si.signal + si.ase + si.nli
si = el(si, degree=path[i + 1].uid)
power_out_roadm = si.signal + si.ase + si.nli
if el.uid == 'roadm node B':
print('input', carriers_power_in_roadm)
# 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)
# if it is a Fused, the input power to the ROADM is smaller than the target power, and the
@@ -266,23 +269,17 @@ def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm):
# corresponds to -22dBm + power_dbm
# next step (for ROADM modelling) will be to apply a minimum loss for ROADMs !
if prev_node_type == 'edfa':
assert el.effective_pch_out_db == effective_pch_out_db
if prev_node_type == 'fused':
# then output power == input_power == effective_pch_out_db + power_dbm
assert effective_pch_out_db + power_dbm == \
pytest.approx(lin2db(carriers_power_in_roadm * 1e3), rel=1e-3)
assert el.effective_pch_out_db == effective_pch_out_db + power_dbm
for carrier in si.carriers:
print(carrier.power.signal + carrier.power.nli + carrier.power.ase)
power = carrier.power.signal + carrier.power.nli + carrier.power.ase
if prev_node_type == 'edfa':
# edfa prev_node sets input power to roadm to a high enough value:
# Check that egress power of roadm is equal to target power
assert power == pytest.approx(db2lin(effective_pch_out_db - 30), rel=1e-3)
elif prev_node_type == 'fused':
# fused prev_node does reamplfy power after fiber propagation, so input power
# to roadm is low.
# Check that egress power of roadm is equalized to the min carrier input power.
assert power == pytest.approx(carriers_power_in_roadm, rel=1e-3)
# edfa prev_node sets input power to roadm to a high enough value:
# check that target power is correctly set in the ROADM
assert_allclose(el.ref_pch_out_dbm, effective_pch_out_db, rtol=1e-3)
# Check that egress power of roadm is equal to target power
assert_allclose(power_out_roadm, db2lin(effective_pch_out_db - 30), rtol=1e-3)
elif prev_node_type == 'fused':
# fused prev_node does reamplfy power after fiber propagation, so input power
# to roadm is low.
# 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)
# Check that egress power of roadm is not equalized power out is the same as power in.
assert_allclose(power_out_roadm, power_in_roadm, rtol=1e-3)
else:
si = el(si)

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: Alessio Ferrari
"""
Checks that RamanFiber propagates properly the spectral information. In this way, also the RamanSolver and the NliSolver
are tested.
@@ -9,40 +9,127 @@ are tested.
from pathlib import Path
from pandas import read_csv
from numpy.testing import assert_allclose
from numpy import array, genfromtxt
import pytest
from gnpy.core.info import create_input_spectral_information
from gnpy.core.elements import RamanFiber
from gnpy.core.info import create_input_spectral_information, create_arbitrary_spectral_information, Pref, ReferenceCarrier
from gnpy.core.elements import Fiber, RamanFiber
from gnpy.core.parameters import SimParams
from gnpy.core.science_utils import Simulation
from gnpy.tools.json_io import load_json
from gnpy.core.exceptions import NetworkTopologyError
from gnpy.core.science_utils import RamanSolver
TEST_DIR = Path(__file__).parent
def test_raman_fiber():
""" Test the accuracy of propagating the RamanFiber."""
# spectral information generation
power = 1e-3
eqpt_params = load_json(TEST_DIR / 'data' / 'eqpt_config.json')
spectral_info_params = eqpt_params['SI'][0]
spectral_info_params.pop('power_dbm')
spectral_info_params.pop('power_range_db')
spectral_info_params.pop('tx_osnr')
spectral_info_params.pop('sys_margins')
spectral_info_input = create_input_spectral_information(power=power, **spectral_info_params)
def test_fiber():
""" Test the accuracy of propagating the Fiber."""
fiber = Fiber(**load_json(TEST_DIR / 'data' / 'test_science_utils_fiber_config.json'))
sim_params = SimParams(**load_json(TEST_DIR / 'data' / 'sim_params.json'))
Simulation.set_params(sim_params)
fiber = RamanFiber(**load_json(TEST_DIR / 'data' / 'raman_fiber_config.json'))
# 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, power=1e-3, spacing=50e9, tx_osnr=40.0,
ref_carrier=ReferenceCarrier(baud_rate=32e9, slot_width=50e9))
# propagation
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_fix_expected_results.csv')
assert_allclose(p_signal, expected_results['signal'], rtol=1e-3)
assert_allclose(p_nli, expected_results['nli'], rtol=1e-3)
# flex grid spectral information generation
frequency = 191e12 + array([0, 50e9, 150e9, 225e9, 275e9])
slot_width = array([37.5e9, 50e9, 75e9, 50e9, 37.5e9])
baud_rate = array([32e9, 42e9, 64e9, 42e9, 32e9])
signal = 1e-3 + array([0, -1e-4, 3e-4, -2e-4, +2e-4])
delta_pdb_per_channel = [0, 0, 0, 0, 0]
pref = Pref(p_span0=0, p_spani=0, ref_carrier=None)
spectral_info_input = create_arbitrary_spectral_information(frequency=frequency, slot_width=slot_width,
signal=signal, baud_rate=baud_rate, roll_off=0.15,
delta_pdb_per_channel=delta_pdb_per_channel,
tx_osnr=40.0, ref_power=pref)
# propagation
spectral_info_out = fiber(spectral_info_input)
p_signal = [carrier.power.signal for carrier in spectral_info_out.carriers]
p_ase = [carrier.power.ase for carrier in spectral_info_out.carriers]
p_nli = [carrier.power.nli for carrier in spectral_info_out.carriers]
p_signal = spectral_info_out.signal
p_nli = spectral_info_out.nli
expected_results = read_csv(TEST_DIR / 'data' / 'test_science_utils_expected_results.csv')
expected_results = read_csv(TEST_DIR / 'data' / 'test_fiber_flex_expected_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')
def test_raman_fiber():
""" Test the accuracy of propagating the RamanFiber."""
# 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, power=1e-3, spacing=50e9, tx_osnr=40.0,
ref_carrier=ReferenceCarrier(baud_rate=32e9, slot_width=50e9))
SimParams.set_params(load_json(TEST_DIR / 'data' / 'sim_params.json'))
fiber = RamanFiber(**load_json(TEST_DIR / 'data' / 'test_science_utils_fiber_config.json'))
# propagation
spectral_info_out = fiber(spectral_info_input)
p_signal = spectral_info_out.signal
p_ase = spectral_info_out.ase
p_nli = spectral_info_out.nli
expected_results = read_csv(TEST_DIR / 'data' / 'test_raman_fiber_expected_results.csv')
assert_allclose(p_signal, expected_results['signal'], rtol=1e-3)
assert_allclose(p_ase, expected_results['ase'], rtol=1e-3)
assert_allclose(p_nli, expected_results['nli'], rtol=1e-3)
@pytest.mark.parametrize(
"loss, position, errmsg",
((0.5, -2, "Lumped loss positions must be between 0 and the fiber length (80.0 km), boundaries excluded."),
(0.5, 81, "Lumped loss positions must be between 0 and the fiber length (80.0 km), boundaries excluded.")))
@pytest.mark.usefixtures('set_sim_params')
def test_fiber_lumped_losses(loss, position, errmsg, set_sim_params):
""" Lumped losses length sanity checking."""
SimParams.set_params(load_json(TEST_DIR / 'data' / 'sim_params.json'))
fiber_dict = load_json(TEST_DIR / 'data' / 'test_lumped_losses_raman_fiber_config.json')
fiber_dict['params']['lumped_losses'] = [{'position': position, 'loss': loss}]
with pytest.raises(NetworkTopologyError) as e:
Fiber(**fiber_dict)
assert str(e.value) == errmsg
@pytest.mark.usefixtures('set_sim_params')
def test_fiber_lumped_losses_srs(set_sim_params):
""" Test the accuracy of Fiber with lumped losses propagation."""
# 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, power=1e-3, spacing=50e9, tx_osnr=40.0,
ref_carrier=ReferenceCarrier(baud_rate=32e9, slot_width=50e9))
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'))
raman_fiber = RamanFiber(**load_json(TEST_DIR / 'data' / 'test_lumped_losses_raman_fiber_config.json'))
# propagation
# without Raman pumps
stimulated_raman_scattering = RamanSolver.calculate_stimulated_raman_scattering(
spectral_info_input, fiber)
power_profile = stimulated_raman_scattering.power_profile
expected_power_profile = genfromtxt(TEST_DIR / 'data' / 'test_lumped_losses_fiber_no_pumps.csv', delimiter=',')
assert_allclose(power_profile, expected_power_profile, rtol=1e-3)
# with Raman pumps
expected_power_profile = genfromtxt(TEST_DIR / 'data' / 'test_lumped_losses_raman_fiber.csv', delimiter=',')
stimulated_raman_scattering = RamanSolver.calculate_stimulated_raman_scattering(
spectral_info_input, raman_fiber)
power_profile = stimulated_raman_scattering.power_profile
assert_allclose(power_profile, expected_power_profile, rtol=1e-3)
# without Stimulated Raman Scattering
expected_power_profile = genfromtxt(TEST_DIR / 'data' / 'test_lumped_losses_fiber_no_raman.csv', delimiter=',')
stimulated_raman_scattering = RamanSolver.calculate_attenuation_profile(spectral_info_input, fiber)
power_profile = stimulated_raman_scattering.power_profile
assert_allclose(power_profile, expected_power_profile, rtol=1e-3)

View File

@@ -291,6 +291,7 @@ def request_set():
'cost': 1,
'roll_off': 0.15,
'tx_osnr': 38,
'penalties': {},
'min_spacing': 37.5e9,
'nb_channel': None,
'power': 0,

View File

@@ -4,7 +4,7 @@ skipsdist = True
[testenv]
deps =
-r{toxinidir}/requirements.txt
pytest>=5.0.0,<6
-r{toxinidir}/tests/requirements.txt
cover: pytest-cov
linters: flake8
linters: pep8-naming
@@ -19,7 +19,7 @@ commands =
pytest {env:CI_COVERAGE_OPTS:} -vv {posargs}
cover: coverage html -d cover
cover: coverage xml -o cover/coverage.xml
python setup.py bdist_wheel
python -m build
[testenv:docs]
deps =
@@ -43,3 +43,4 @@ commands =
[flake8]
max-line-length = 120
max-complexity = 15
ignore = N806 W503